Initialize Tizen 2.3 2.3a_release submit/tizen_2.3/20140531.084647
authorSehong Na <sehong.na@samsung.com>
Sat, 31 May 2014 03:46:01 +0000 (12:46 +0900)
committerSehong Na <sehong.na@samsung.com>
Sat, 31 May 2014 03:46:01 +0000 (12:46 +0900)
1637 files changed:
AUTHORS [new file with mode: 0644]
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]
NEWS [new file with mode: 0644]
README [new file with mode: 0644]
configure.ac [new file with mode: 0644]
cpprules.in [new file with mode: 0644]
docbook.am [new file with mode: 0644]
include/Makefile.am [new file with mode: 0644]
include/X11/ImUtil.h [new file with mode: 0644]
include/X11/XKBlib.h [new file with mode: 0644]
include/X11/Xcms.h [new file with mode: 0644]
include/X11/Xlib-xcb.h [new file with mode: 0644]
include/X11/Xlib.h [new file with mode: 0644]
include/X11/XlibConf.h.in [new file with mode: 0644]
include/X11/Xlibint.h [new file with mode: 0644]
include/X11/Xlocale.h [new file with mode: 0644]
include/X11/Xregion.h [new file with mode: 0644]
include/X11/Xresource.h [new file with mode: 0644]
include/X11/Xutil.h [new file with mode: 0644]
include/X11/cursorfont.h [new file with mode: 0644]
m4/ax_define_dir.m4 [new file with mode: 0644]
man/AllPlanes.man [new file with mode: 0644]
man/BitmapBitOrder.man [new file with mode: 0644]
man/BitmapPad.man [new file with mode: 0644]
man/BitmapUnit.man [new file with mode: 0644]
man/BlackPixel.man [new file with mode: 0644]
man/BlackPixelOfScreen.man [new file with mode: 0644]
man/CellsOfScreen.man [new file with mode: 0644]
man/ClientWhitePointOfCCC.man [new file with mode: 0644]
man/Compose.man [new file with mode: 0644]
man/ConnectionNumber.man [new file with mode: 0644]
man/DefaultColormap.man [new file with mode: 0644]
man/DefaultColormapOfScreen.man [new file with mode: 0644]
man/DefaultDepth.man [new file with mode: 0644]
man/DefaultDepthOfScreen.man [new file with mode: 0644]
man/DefaultGC.man [new file with mode: 0644]
man/DefaultGCOfScreen.man [new file with mode: 0644]
man/DefaultRootWindow.man [new file with mode: 0644]
man/DefaultScreen.man [new file with mode: 0644]
man/DefaultScreenOfDisplay.man [new file with mode: 0644]
man/DefaultVisual.man [new file with mode: 0644]
man/DefaultVisualOfScreen.man [new file with mode: 0644]
man/DisplayCells.man [new file with mode: 0644]
man/DisplayHeight.man [new file with mode: 0644]
man/DisplayHeightMM.man [new file with mode: 0644]
man/DisplayOfCCC.man [new file with mode: 0644]
man/DisplayOfScreen.man [new file with mode: 0644]
man/DisplayPlanes.man [new file with mode: 0644]
man/DisplayString.man [new file with mode: 0644]
man/DisplayWidth.man [new file with mode: 0644]
man/DisplayWidthMM.man [new file with mode: 0644]
man/DoesBackingStore.man [new file with mode: 0644]
man/DoesSaveUnders.man [new file with mode: 0644]
man/EventMaskOfScreen.man [new file with mode: 0644]
man/HeightMMOfScreen.man [new file with mode: 0644]
man/HeightOfScreen.man [new file with mode: 0644]
man/ImageByteOrder.man [new file with mode: 0644]
man/IsCursorKey.man [new file with mode: 0644]
man/IsFunctionKey.man [new file with mode: 0644]
man/IsKeypadKey.man [new file with mode: 0644]
man/IsMiscFunctionKey.man [new file with mode: 0644]
man/IsModifierKey.man [new file with mode: 0644]
man/IsPFKey.man [new file with mode: 0644]
man/IsPrivateKeypadKey.man [new file with mode: 0644]
man/LastKnownRequestProcessed.man [new file with mode: 0644]
man/Makefile.am [new file with mode: 0644]
man/MaxCmapsOfScreen.man [new file with mode: 0644]
man/MinCmapsOfScreen.man [new file with mode: 0644]
man/NextRequest.man [new file with mode: 0644]
man/PlanesOfScreen.man [new file with mode: 0644]
man/ProtocolRevision.man [new file with mode: 0644]
man/ProtocolVersion.man [new file with mode: 0644]
man/QLength.man [new file with mode: 0644]
man/RootWindow.man [new file with mode: 0644]
man/RootWindowOfScreen.man [new file with mode: 0644]
man/ScreenCount.man [new file with mode: 0644]
man/ScreenNumberOfCCC.man [new file with mode: 0644]
man/ScreenOfDisplay.man [new file with mode: 0644]
man/ScreenWhitePointOfCCC.man [new file with mode: 0644]
man/ServerVendor.man [new file with mode: 0644]
man/VendorRelease.man [new file with mode: 0644]
man/VisualOfCCC.man [new file with mode: 0644]
man/WhitePixel.man [new file with mode: 0644]
man/WhitePixelOfScreen.man [new file with mode: 0644]
man/WidthMMOfScreen.man [new file with mode: 0644]
man/WidthOfScreen.man [new file with mode: 0644]
man/XActivateScreenSaver.man [new file with mode: 0644]
man/XAddConnectionWatch.man [new file with mode: 0644]
man/XAddHost.man [new file with mode: 0644]
man/XAddHosts.man [new file with mode: 0644]
man/XAddPixel.man [new file with mode: 0644]
man/XAddToSaveSet.man [new file with mode: 0644]
man/XAllocClassHint.man [new file with mode: 0644]
man/XAllocColor.man [new file with mode: 0644]
man/XAllocColorCells.man [new file with mode: 0644]
man/XAllocColorPlanes.man [new file with mode: 0644]
man/XAllocIconSize.man [new file with mode: 0644]
man/XAllocNamedColor.man [new file with mode: 0644]
man/XAllocSizeHints.man [new file with mode: 0644]
man/XAllocStandardColormap.man [new file with mode: 0644]
man/XAllocWMHints.man [new file with mode: 0644]
man/XAllowEvents.man [new file with mode: 0644]
man/XAnyEvent.man [new file with mode: 0644]
man/XArc.man [new file with mode: 0644]
man/XAutoRepeatOff.man [new file with mode: 0644]
man/XAutoRepeatOn.man [new file with mode: 0644]
man/XBaseFontNameListOfFontSet.man [new file with mode: 0644]
man/XBell.man [new file with mode: 0644]
man/XButtonEvent.man [new file with mode: 0644]
man/XChangeActivePointerGrab.man [new file with mode: 0644]
man/XChangeGC.man [new file with mode: 0644]
man/XChangeKeyboardControl.man [new file with mode: 0644]
man/XChangeKeyboardMapping.man [new file with mode: 0644]
man/XChangePointerControl.man [new file with mode: 0644]
man/XChangeProperty.man [new file with mode: 0644]
man/XChangeSaveSet.man [new file with mode: 0644]
man/XChangeWindowAttributes.man [new file with mode: 0644]
man/XChar2b.man [new file with mode: 0644]
man/XCharStruct.man [new file with mode: 0644]
man/XCheckIfEvent.man [new file with mode: 0644]
man/XCheckMaskEvent.man [new file with mode: 0644]
man/XCheckTypedEvent.man [new file with mode: 0644]
man/XCheckTypedWindowEvent.man [new file with mode: 0644]
man/XCheckWindowEvent.man [new file with mode: 0644]
man/XCirculateEvent.man [new file with mode: 0644]
man/XCirculateRequestEvent.man [new file with mode: 0644]
man/XCirculateSubwindows.man [new file with mode: 0644]
man/XCirculateSubwindowsDown.man [new file with mode: 0644]
man/XCirculateSubwindowsUp.man [new file with mode: 0644]
man/XClassHint.man [new file with mode: 0644]
man/XClearArea.man [new file with mode: 0644]
man/XClearWindow.man [new file with mode: 0644]
man/XClientMessageEvent.man [new file with mode: 0644]
man/XClipBox.man [new file with mode: 0644]
man/XCloseDisplay.man [new file with mode: 0644]
man/XCloseIM.man [new file with mode: 0644]
man/XCloseOM.man [new file with mode: 0644]
man/XColor.man [new file with mode: 0644]
man/XColormapEvent.man [new file with mode: 0644]
man/XCompose.man [new file with mode: 0644]
man/XConfigureEvent.man [new file with mode: 0644]
man/XConfigureRequestEvent.man [new file with mode: 0644]
man/XConfigureWindow.man [new file with mode: 0644]
man/XContextDependentDrawing.man [new file with mode: 0644]
man/XContextualDrawing.man [new file with mode: 0644]
man/XConvertCase.man [new file with mode: 0644]
man/XConvertSelection.man [new file with mode: 0644]
man/XCopyArea.man [new file with mode: 0644]
man/XCopyColormapAndFree.man [new file with mode: 0644]
man/XCopyGC.man [new file with mode: 0644]
man/XCopyPlane.man [new file with mode: 0644]
man/XCreateBitmapFromData.man [new file with mode: 0644]
man/XCreateColormap.man [new file with mode: 0644]
man/XCreateFontCursor.man [new file with mode: 0644]
man/XCreateFontSet.man [new file with mode: 0644]
man/XCreateGC.man [new file with mode: 0644]
man/XCreateGlyphCursor.man [new file with mode: 0644]
man/XCreateIC.man [new file with mode: 0644]
man/XCreateImage.man [new file with mode: 0644]
man/XCreateOC.man [new file with mode: 0644]
man/XCreatePixmap.man [new file with mode: 0644]
man/XCreatePixmapCursor.man [new file with mode: 0644]
man/XCreatePixmapFromBitmapData.man [new file with mode: 0644]
man/XCreateRegion.man [new file with mode: 0644]
man/XCreateSimpleWindow.man [new file with mode: 0644]
man/XCreateWindow.man [new file with mode: 0644]
man/XCreateWindowEvent.man [new file with mode: 0644]
man/XCrossingEvent.man [new file with mode: 0644]
man/XDefaultString.man [new file with mode: 0644]
man/XDefineCursor.man [new file with mode: 0644]
man/XDeleteContext.man [new file with mode: 0644]
man/XDeleteModifiermapEntry.man [new file with mode: 0644]
man/XDeleteProperty.man [new file with mode: 0644]
man/XDestroyIC.man [new file with mode: 0644]
man/XDestroyImage.man [new file with mode: 0644]
man/XDestroyOC.man [new file with mode: 0644]
man/XDestroyRegion.man [new file with mode: 0644]
man/XDestroySubwindows.man [new file with mode: 0644]
man/XDestroyWindow.man [new file with mode: 0644]
man/XDestroyWindowEvent.man [new file with mode: 0644]
man/XDirectionalDependentDrawing.man [new file with mode: 0644]
man/XDisableAccessControl.man [new file with mode: 0644]
man/XDisplayKeycodes.man [new file with mode: 0644]
man/XDisplayMotionBufferSize.man [new file with mode: 0644]
man/XDisplayName.man [new file with mode: 0644]
man/XDisplayOfIM.man [new file with mode: 0644]
man/XDisplayOfOM.man [new file with mode: 0644]
man/XDrawArc.man [new file with mode: 0644]
man/XDrawArcs.man [new file with mode: 0644]
man/XDrawImageString.man [new file with mode: 0644]
man/XDrawImageString16.man [new file with mode: 0644]
man/XDrawLine.man [new file with mode: 0644]
man/XDrawLines.man [new file with mode: 0644]
man/XDrawPoint.man [new file with mode: 0644]
man/XDrawPoints.man [new file with mode: 0644]
man/XDrawRectangle.man [new file with mode: 0644]
man/XDrawRectangles.man [new file with mode: 0644]
man/XDrawSegments.man [new file with mode: 0644]
man/XDrawString.man [new file with mode: 0644]
man/XDrawString16.man [new file with mode: 0644]
man/XDrawText.man [new file with mode: 0644]
man/XDrawText16.man [new file with mode: 0644]
man/XEmptyRegion.man [new file with mode: 0644]
man/XEnableAccessControl.man [new file with mode: 0644]
man/XEqualRegion.man [new file with mode: 0644]
man/XErrorEvent.man [new file with mode: 0644]
man/XEvent.man [new file with mode: 0644]
man/XEventsQueued.man [new file with mode: 0644]
man/XExposeEvent.man [new file with mode: 0644]
man/XExtendedMaxRequestSize.man [new file with mode: 0644]
man/XExtentsOfFontSet.man [new file with mode: 0644]
man/XFetchBuffer.man [new file with mode: 0644]
man/XFetchBytes.man [new file with mode: 0644]
man/XFetchName.man [new file with mode: 0644]
man/XFillArc.man [new file with mode: 0644]
man/XFillArcs.man [new file with mode: 0644]
man/XFillPolygon.man [new file with mode: 0644]
man/XFillRectangle.man [new file with mode: 0644]
man/XFillRectangles.man [new file with mode: 0644]
man/XFilterEvent.man [new file with mode: 0644]
man/XFindContext.man [new file with mode: 0644]
man/XFlush.man [new file with mode: 0644]
man/XFocusChangeEvent.man [new file with mode: 0644]
man/XFontProp.man [new file with mode: 0644]
man/XFontSetExtents.man [new file with mode: 0644]
man/XFontStruct.man [new file with mode: 0644]
man/XFontsOfFontSet.man [new file with mode: 0644]
man/XForceScreenSaver.man [new file with mode: 0644]
man/XFree.man [new file with mode: 0644]
man/XFreeColormap.man [new file with mode: 0644]
man/XFreeColors.man [new file with mode: 0644]
man/XFreeCursor.man [new file with mode: 0644]
man/XFreeEventData.man [new file with mode: 0644]
man/XFreeExtensionList.man [new file with mode: 0644]
man/XFreeFont.man [new file with mode: 0644]
man/XFreeFontInfo.man [new file with mode: 0644]
man/XFreeFontNames.man [new file with mode: 0644]
man/XFreeFontPath.man [new file with mode: 0644]
man/XFreeFontSet.man [new file with mode: 0644]
man/XFreeGC.man [new file with mode: 0644]
man/XFreeModifiermap.man [new file with mode: 0644]
man/XFreePixmap.man [new file with mode: 0644]
man/XFreeStringList.man [new file with mode: 0644]
man/XGCValues.man [new file with mode: 0644]
man/XGContextFromGC.man [new file with mode: 0644]
man/XGenericEventCookie.man [new file with mode: 0644]
man/XGetAtomName.man [new file with mode: 0644]
man/XGetAtomNames.man [new file with mode: 0644]
man/XGetClassHint.man [new file with mode: 0644]
man/XGetCommand.man [new file with mode: 0644]
man/XGetErrorDatabaseText.man [new file with mode: 0644]
man/XGetErrorText.man [new file with mode: 0644]
man/XGetEventData.man [new file with mode: 0644]
man/XGetFontPath.man [new file with mode: 0644]
man/XGetFontProperty.man [new file with mode: 0644]
man/XGetGCValues.man [new file with mode: 0644]
man/XGetGeometry.man [new file with mode: 0644]
man/XGetICValues.man [new file with mode: 0644]
man/XGetIMValues.man [new file with mode: 0644]
man/XGetIconName.man [new file with mode: 0644]
man/XGetIconSizes.man [new file with mode: 0644]
man/XGetImage.man [new file with mode: 0644]
man/XGetInputFocus.man [new file with mode: 0644]
man/XGetKeyboardControl.man [new file with mode: 0644]
man/XGetKeyboardMapping.man [new file with mode: 0644]
man/XGetModifierMapping.man [new file with mode: 0644]
man/XGetMotionEvents.man [new file with mode: 0644]
man/XGetOCValues.man [new file with mode: 0644]
man/XGetOMValues.man [new file with mode: 0644]
man/XGetPixel.man [new file with mode: 0644]
man/XGetPointerControl.man [new file with mode: 0644]
man/XGetPointerMapping.man [new file with mode: 0644]
man/XGetRGBColormaps.man [new file with mode: 0644]
man/XGetScreenSaver.man [new file with mode: 0644]
man/XGetSelectionOwner.man [new file with mode: 0644]
man/XGetSubImage.man [new file with mode: 0644]
man/XGetTextProperty.man [new file with mode: 0644]
man/XGetTransientForHint.man [new file with mode: 0644]
man/XGetVisualInfo.man [new file with mode: 0644]
man/XGetWMClientMachine.man [new file with mode: 0644]
man/XGetWMColormapWindows.man [new file with mode: 0644]
man/XGetWMHints.man [new file with mode: 0644]
man/XGetWMIconName.man [new file with mode: 0644]
man/XGetWMName.man [new file with mode: 0644]
man/XGetWMNormalHints.man [new file with mode: 0644]
man/XGetWMProtocols.man [new file with mode: 0644]
man/XGetWMSizeHints.man [new file with mode: 0644]
man/XGetWindowAttributes.man [new file with mode: 0644]
man/XGetWindowProperty.man [new file with mode: 0644]
man/XGetXCBConnection.man [new file with mode: 0644]
man/XGrabButton.man [new file with mode: 0644]
man/XGrabKey.man [new file with mode: 0644]
man/XGrabKeyboard.man [new file with mode: 0644]
man/XGrabPointer.man [new file with mode: 0644]
man/XGrabServer.man [new file with mode: 0644]
man/XGraphicsExposeEvent.man [new file with mode: 0644]
man/XGravityEvent.man [new file with mode: 0644]
man/XHostAddress.man [new file with mode: 0644]
man/XIMOfIC.man [new file with mode: 0644]
man/XIconSize.man [new file with mode: 0644]
man/XIconifyWindow.man [new file with mode: 0644]
man/XIfEvent.man [new file with mode: 0644]
man/XInitImage.man [new file with mode: 0644]
man/XInitThreads.man [new file with mode: 0644]
man/XInsertModifiermapEntry.man [new file with mode: 0644]
man/XInstallColormap.man [new file with mode: 0644]
man/XInternAtom.man [new file with mode: 0644]
man/XInternAtoms.man [new file with mode: 0644]
man/XInternalConnectionNumbers.man [new file with mode: 0644]
man/XIntersectRegion.man [new file with mode: 0644]
man/XKeyEvent.man [new file with mode: 0644]
man/XKeyboardControl.man [new file with mode: 0644]
man/XKeycodeToKeysym.man [new file with mode: 0644]
man/XKeymapEvent.man [new file with mode: 0644]
man/XKeysymToKeycode.man [new file with mode: 0644]
man/XKeysymToString.man [new file with mode: 0644]
man/XKillClient.man [new file with mode: 0644]
man/XListDepths.man [new file with mode: 0644]
man/XListExtensions.man [new file with mode: 0644]
man/XListFonts.man [new file with mode: 0644]
man/XListFontsWithInfo.man [new file with mode: 0644]
man/XListHosts.man [new file with mode: 0644]
man/XListInstalledColormaps.man [new file with mode: 0644]
man/XListPixmapFormats.man [new file with mode: 0644]
man/XListProperties.man [new file with mode: 0644]
man/XLoadFont.man [new file with mode: 0644]
man/XLoadQueryFont.man [new file with mode: 0644]
man/XLocaleOfFontSet.man [new file with mode: 0644]
man/XLocaleOfIM.man [new file with mode: 0644]
man/XLocaleOfOM.man [new file with mode: 0644]
man/XLockDisplay.man [new file with mode: 0644]
man/XLookupColor.man [new file with mode: 0644]
man/XLookupKeysym.man [new file with mode: 0644]
man/XLookupString.man [new file with mode: 0644]
man/XLowerWindow.man [new file with mode: 0644]
man/XMapEvent.man [new file with mode: 0644]
man/XMapRaised.man [new file with mode: 0644]
man/XMapRequestEvent.man [new file with mode: 0644]
man/XMapSubwindows.man [new file with mode: 0644]
man/XMapWindow.man [new file with mode: 0644]
man/XMappingEvent.man [new file with mode: 0644]
man/XMaskEvent.man [new file with mode: 0644]
man/XMatchVisualInfo.man [new file with mode: 0644]
man/XMaxRequestSize.man [new file with mode: 0644]
man/XModifierKeymap.man [new file with mode: 0644]
man/XMotionEvent.man [new file with mode: 0644]
man/XMoveResizeWindow.man [new file with mode: 0644]
man/XMoveWindow.man [new file with mode: 0644]
man/XNewModifiermap.man [new file with mode: 0644]
man/XNextEvent.man [new file with mode: 0644]
man/XNoExposeEvent.man [new file with mode: 0644]
man/XNoOp.man [new file with mode: 0644]
man/XOMOfOC.man [new file with mode: 0644]
man/XOffsetRegion.man [new file with mode: 0644]
man/XOpenDisplay.man [new file with mode: 0644]
man/XOpenIM.man [new file with mode: 0644]
man/XOpenOM.man [new file with mode: 0644]
man/XParseColor.man [new file with mode: 0644]
man/XParseGeometry.man [new file with mode: 0644]
man/XPeekEvent.man [new file with mode: 0644]
man/XPeekIfEvent.man [new file with mode: 0644]
man/XPending.man [new file with mode: 0644]
man/XPixmapFormatValues.man [new file with mode: 0644]
man/XPoint.man [new file with mode: 0644]
man/XPointInRegion.man [new file with mode: 0644]
man/XPolygonRegion.man [new file with mode: 0644]
man/XProcessInternalConnection.man [new file with mode: 0644]
man/XPropertyEvent.man [new file with mode: 0644]
man/XPutBackEvent.man [new file with mode: 0644]
man/XPutImage.man [new file with mode: 0644]
man/XPutPixel.man [new file with mode: 0644]
man/XQueryBestCursor.man [new file with mode: 0644]
man/XQueryBestSize.man [new file with mode: 0644]
man/XQueryBestStipple.man [new file with mode: 0644]
man/XQueryBestTile.man [new file with mode: 0644]
man/XQueryColor.man [new file with mode: 0644]
man/XQueryColors.man [new file with mode: 0644]
man/XQueryExtension.man [new file with mode: 0644]
man/XQueryFont.man [new file with mode: 0644]
man/XQueryKeymap.man [new file with mode: 0644]
man/XQueryPointer.man [new file with mode: 0644]
man/XQueryTextExtents.man [new file with mode: 0644]
man/XQueryTextExtents16.man [new file with mode: 0644]
man/XQueryTree.man [new file with mode: 0644]
man/XRaiseWindow.man [new file with mode: 0644]
man/XReadBitmapFile.man [new file with mode: 0644]
man/XReadBitmapFileData.man [new file with mode: 0644]
man/XRebindKeysym.man [new file with mode: 0644]
man/XRecolorCursor.man [new file with mode: 0644]
man/XReconfigureWMWindow.man [new file with mode: 0644]
man/XRectInRegion.man [new file with mode: 0644]
man/XRectangle.man [new file with mode: 0644]
man/XRefreshKeyboardMapping.man [new file with mode: 0644]
man/XRegisterIMInstantiateCallback.man [new file with mode: 0644]
man/XRemoveConnectionWatch.man [new file with mode: 0644]
man/XRemoveFromSaveSet.man [new file with mode: 0644]
man/XRemoveHost.man [new file with mode: 0644]
man/XRemoveHosts.man [new file with mode: 0644]
man/XReparentEvent.man [new file with mode: 0644]
man/XReparentWindow.man [new file with mode: 0644]
man/XResetScreenSaver.man [new file with mode: 0644]
man/XResizeRequestEvent.man [new file with mode: 0644]
man/XResizeWindow.man [new file with mode: 0644]
man/XResourceManagerString.man [new file with mode: 0644]
man/XRestackWindows.man [new file with mode: 0644]
man/XRotateBuffers.man [new file with mode: 0644]
man/XRotateWindowProperties.man [new file with mode: 0644]
man/XSaveContext.man [new file with mode: 0644]
man/XScreenNumberOfScreen.man [new file with mode: 0644]
man/XScreenResourceString.man [new file with mode: 0644]
man/XSegment.man [new file with mode: 0644]
man/XSelectInput.man [new file with mode: 0644]
man/XSelectionClearEvent.man [new file with mode: 0644]
man/XSelectionEvent.man [new file with mode: 0644]
man/XSelectionRequestEvent.man [new file with mode: 0644]
man/XSendEvent.man [new file with mode: 0644]
man/XSetAccessControl.man [new file with mode: 0644]
man/XSetAfterFunction.man [new file with mode: 0644]
man/XSetArcMode.man [new file with mode: 0644]
man/XSetBackground.man [new file with mode: 0644]
man/XSetClassHint.man [new file with mode: 0644]
man/XSetClipMask.man [new file with mode: 0644]
man/XSetClipOrigin.man [new file with mode: 0644]
man/XSetClipRectangles.man [new file with mode: 0644]
man/XSetCloseDownMode.man [new file with mode: 0644]
man/XSetCommand.man [new file with mode: 0644]
man/XSetDashes.man [new file with mode: 0644]
man/XSetErrorHandler.man [new file with mode: 0644]
man/XSetEventQueueOwner.man [new file with mode: 0644]
man/XSetFillRule.man [new file with mode: 0644]
man/XSetFillStyle.man [new file with mode: 0644]
man/XSetFont.man [new file with mode: 0644]
man/XSetFontPath.man [new file with mode: 0644]
man/XSetForeground.man [new file with mode: 0644]
man/XSetFunction.man [new file with mode: 0644]
man/XSetGraphicsExposure.man [new file with mode: 0644]
man/XSetICFocus.man [new file with mode: 0644]
man/XSetICValues.man [new file with mode: 0644]
man/XSetIMValues.man [new file with mode: 0644]
man/XSetIOErrorHandler.man [new file with mode: 0644]
man/XSetIconName.man [new file with mode: 0644]
man/XSetIconSizes.man [new file with mode: 0644]
man/XSetInputFocus.man [new file with mode: 0644]
man/XSetLineAttributes.man [new file with mode: 0644]
man/XSetLocaleModifiers.man [new file with mode: 0644]
man/XSetModifierMapping.man [new file with mode: 0644]
man/XSetOCValues.man [new file with mode: 0644]
man/XSetOMValues.man [new file with mode: 0644]
man/XSetPlaneMask.man [new file with mode: 0644]
man/XSetPointerMapping.man [new file with mode: 0644]
man/XSetRGBColormaps.man [new file with mode: 0644]
man/XSetRegion.man [new file with mode: 0644]
man/XSetScreenSaver.man [new file with mode: 0644]
man/XSetSelectionOwner.man [new file with mode: 0644]
man/XSetState.man [new file with mode: 0644]
man/XSetStipple.man [new file with mode: 0644]
man/XSetSubwindowMode.man [new file with mode: 0644]
man/XSetTSOrigin.man [new file with mode: 0644]
man/XSetTextProperty.man [new file with mode: 0644]
man/XSetTile.man [new file with mode: 0644]
man/XSetTransientForHint.man [new file with mode: 0644]
man/XSetWMClientMachine.man [new file with mode: 0644]
man/XSetWMColormapWindows.man [new file with mode: 0644]
man/XSetWMHints.man [new file with mode: 0644]
man/XSetWMIconName.man [new file with mode: 0644]
man/XSetWMName.man [new file with mode: 0644]
man/XSetWMNormalHints.man [new file with mode: 0644]
man/XSetWMProperties.man [new file with mode: 0644]
man/XSetWMProtocols.man [new file with mode: 0644]
man/XSetWMSizeHints.man [new file with mode: 0644]
man/XSetWindowAttributes.man [new file with mode: 0644]
man/XSetWindowBackground.man [new file with mode: 0644]
man/XSetWindowBackgroundPixmap.man [new file with mode: 0644]
man/XSetWindowBorder.man [new file with mode: 0644]
man/XSetWindowBorderPixmap.man [new file with mode: 0644]
man/XSetWindowBorderWidth.man [new file with mode: 0644]
man/XSetWindowColormap.man [new file with mode: 0644]
man/XShrinkRegion.man [new file with mode: 0644]
man/XSizeHints.man [new file with mode: 0644]
man/XStandardColormap.man [new file with mode: 0644]
man/XStoreBuffer.man [new file with mode: 0644]
man/XStoreBytes.man [new file with mode: 0644]
man/XStoreColor.man [new file with mode: 0644]
man/XStoreColors.man [new file with mode: 0644]
man/XStoreName.man [new file with mode: 0644]
man/XStoreNamedColor.man [new file with mode: 0644]
man/XStringListToTextProperty.man [new file with mode: 0644]
man/XStringToKeysym.man [new file with mode: 0644]
man/XSubImage.man [new file with mode: 0644]
man/XSubtractRegion.man [new file with mode: 0644]
man/XSupportsLocale.man [new file with mode: 0644]
man/XSync.man [new file with mode: 0644]
man/XSynchronize.man [new file with mode: 0644]
man/XTextExtents.man [new file with mode: 0644]
man/XTextExtents16.man [new file with mode: 0644]
man/XTextItem.man [new file with mode: 0644]
man/XTextItem16.man [new file with mode: 0644]
man/XTextProperty.man [new file with mode: 0644]
man/XTextPropertyToStringList.man [new file with mode: 0644]
man/XTextWidth.man [new file with mode: 0644]
man/XTextWidth16.man [new file with mode: 0644]
man/XTimeCoord.man [new file with mode: 0644]
man/XTranslateCoordinates.man [new file with mode: 0644]
man/XUndefineCursor.man [new file with mode: 0644]
man/XUngrabButton.man [new file with mode: 0644]
man/XUngrabKey.man [new file with mode: 0644]
man/XUngrabKeyboard.man [new file with mode: 0644]
man/XUngrabPointer.man [new file with mode: 0644]
man/XUngrabServer.man [new file with mode: 0644]
man/XUninstallColormap.man [new file with mode: 0644]
man/XUnionRectWithRegion.man [new file with mode: 0644]
man/XUnionRegion.man [new file with mode: 0644]
man/XUniqueContext.man [new file with mode: 0644]
man/XUnloadFont.man [new file with mode: 0644]
man/XUnlockDisplay.man [new file with mode: 0644]
man/XUnmapEvent.man [new file with mode: 0644]
man/XUnmapSubwindows.man [new file with mode: 0644]
man/XUnmapWindow.man [new file with mode: 0644]
man/XUnregisterIMInstantiateCallback.man [new file with mode: 0644]
man/XUnsetICFocus.man [new file with mode: 0644]
man/XVaCreateNestedList.man [new file with mode: 0644]
man/XVisibilityEvent.man [new file with mode: 0644]
man/XVisualIDFromVisual.man [new file with mode: 0644]
man/XVisualInfo.man [new file with mode: 0644]
man/XWMGeometry.man [new file with mode: 0644]
man/XWMHints.man [new file with mode: 0644]
man/XWarpPointer.man [new file with mode: 0644]
man/XWindowAttributes.man [new file with mode: 0644]
man/XWindowChanges.man [new file with mode: 0644]
man/XWindowEvent.man [new file with mode: 0644]
man/XWithdrawWindow.man [new file with mode: 0644]
man/XWriteBitmapFile.man [new file with mode: 0644]
man/XXorRegion.man [new file with mode: 0644]
man/XcmsAllocColor.man [new file with mode: 0644]
man/XcmsAllocNamedColor.man [new file with mode: 0644]
man/XcmsCCCOfColormap.man [new file with mode: 0644]
man/XcmsCIELab.man [new file with mode: 0644]
man/XcmsCIELabQueryMaxC.man [new file with mode: 0644]
man/XcmsCIELabQueryMaxL.man [new file with mode: 0644]
man/XcmsCIELabQueryMaxLC.man [new file with mode: 0644]
man/XcmsCIELabQueryMinL.man [new file with mode: 0644]
man/XcmsCIELuv.man [new file with mode: 0644]
man/XcmsCIELuvQueryMaxC.man [new file with mode: 0644]
man/XcmsCIELuvQueryMaxL.man [new file with mode: 0644]
man/XcmsCIELuvQueryMaxLC.man [new file with mode: 0644]
man/XcmsCIELuvQueryMinL.man [new file with mode: 0644]
man/XcmsCIEXYZ.man [new file with mode: 0644]
man/XcmsCIEuvY.man [new file with mode: 0644]
man/XcmsCIExyY.man [new file with mode: 0644]
man/XcmsColor.man [new file with mode: 0644]
man/XcmsConvertColors.man [new file with mode: 0644]
man/XcmsCreateCCC.man [new file with mode: 0644]
man/XcmsDefaultCCC.man [new file with mode: 0644]
man/XcmsFreeCCC.man [new file with mode: 0644]
man/XcmsLookupColor.man [new file with mode: 0644]
man/XcmsPad.man [new file with mode: 0644]
man/XcmsQueryBlack.man [new file with mode: 0644]
man/XcmsQueryBlue.man [new file with mode: 0644]
man/XcmsQueryColor.man [new file with mode: 0644]
man/XcmsQueryColors.man [new file with mode: 0644]
man/XcmsQueryGreen.man [new file with mode: 0644]
man/XcmsQueryRed.man [new file with mode: 0644]
man/XcmsQueryWhite.man [new file with mode: 0644]
man/XcmsRGB.man [new file with mode: 0644]
man/XcmsRGBi.man [new file with mode: 0644]
man/XcmsSetCCCOfColormap.man [new file with mode: 0644]
man/XcmsSetWhiteAdjustProc.man [new file with mode: 0644]
man/XcmsSetWhitePoint.man [new file with mode: 0644]
man/XcmsStoreColor.man [new file with mode: 0644]
man/XcmsStoreColors.man [new file with mode: 0644]
man/XcmsTekHVC.man [new file with mode: 0644]
man/XcmsTekHVCQueryMaxC.man [new file with mode: 0644]
man/XcmsTekHVCQueryMaxV.man [new file with mode: 0644]
man/XcmsTekHVCQueryMaxVC.man [new file with mode: 0644]
man/XcmsTekHVCQueryMaxVSamples.man [new file with mode: 0644]
man/XcmsTekHVCQueryMinV.man [new file with mode: 0644]
man/XmbDrawImageString.man [new file with mode: 0644]
man/XmbDrawString.man [new file with mode: 0644]
man/XmbDrawText.man [new file with mode: 0644]
man/XmbLookupString.man [new file with mode: 0644]
man/XmbResetIC.man [new file with mode: 0644]
man/XmbSetWMProperties.man [new file with mode: 0644]
man/XmbTextEscapement.man [new file with mode: 0644]
man/XmbTextExtents.man [new file with mode: 0644]
man/XmbTextListToTextProperty.man [new file with mode: 0644]
man/XmbTextPerCharExtents.man [new file with mode: 0644]
man/XmbTextPropertyToTextList.man [new file with mode: 0644]
man/XrmCombineDatabase.man [new file with mode: 0644]
man/XrmCombineFileDatabase.man [new file with mode: 0644]
man/XrmDestroyDatabase.man [new file with mode: 0644]
man/XrmEnumerateDatabase.man [new file with mode: 0644]
man/XrmGetDatabase.man [new file with mode: 0644]
man/XrmGetFileDatabase.man [new file with mode: 0644]
man/XrmGetResource.man [new file with mode: 0644]
man/XrmGetStringDatabase.man [new file with mode: 0644]
man/XrmInitialize.man [new file with mode: 0644]
man/XrmLocaleOfDatabase.man [new file with mode: 0644]
man/XrmMergeDatabases.man [new file with mode: 0644]
man/XrmOptionDescRec.man [new file with mode: 0644]
man/XrmOptionKind.man [new file with mode: 0644]
man/XrmParseCommand.man [new file with mode: 0644]
man/XrmPermStringToQuark.man [new file with mode: 0644]
man/XrmPutFileDatabase.man [new file with mode: 0644]
man/XrmPutLineResource.man [new file with mode: 0644]
man/XrmPutResource.man [new file with mode: 0644]
man/XrmPutStringResource.man [new file with mode: 0644]
man/XrmQGetResource.man [new file with mode: 0644]
man/XrmQGetSearchList.man [new file with mode: 0644]
man/XrmQGetSearchResource.man [new file with mode: 0644]
man/XrmQPutResource.man [new file with mode: 0644]
man/XrmQPutStringResource.man [new file with mode: 0644]
man/XrmQuarkToString.man [new file with mode: 0644]
man/XrmSetDatabase.man [new file with mode: 0644]
man/XrmStringToBindingQuarkList.man [new file with mode: 0644]
man/XrmStringToQuark.man [new file with mode: 0644]
man/XrmStringToQuarkList.man [new file with mode: 0644]
man/XrmUniqueQuark.man [new file with mode: 0644]
man/XrmValue.man [new file with mode: 0644]
man/Xutf8DrawImageString.man [new file with mode: 0644]
man/Xutf8DrawString.man [new file with mode: 0644]
man/Xutf8DrawText.man [new file with mode: 0644]
man/Xutf8LookupString.man [new file with mode: 0644]
man/Xutf8ResetIC.man [new file with mode: 0644]
man/Xutf8SetWMProperties.man [new file with mode: 0644]
man/Xutf8TextEscapement.man [new file with mode: 0644]
man/Xutf8TextExtents.man [new file with mode: 0644]
man/Xutf8TextListToTextProperty.man [new file with mode: 0644]
man/Xutf8TextPerCharExtents.man [new file with mode: 0644]
man/Xutf8TextPropertyToTextList.man [new file with mode: 0644]
man/XwcDrawImageString.man [new file with mode: 0644]
man/XwcDrawString.man [new file with mode: 0644]
man/XwcDrawText.man [new file with mode: 0644]
man/XwcFreeStringList.man [new file with mode: 0644]
man/XwcLookupString.man [new file with mode: 0644]
man/XwcResetIC.man [new file with mode: 0644]
man/XwcTextEscapement.man [new file with mode: 0644]
man/XwcTextExtents.man [new file with mode: 0644]
man/XwcTextListToTextProperty.man [new file with mode: 0644]
man/XwcTextPerCharExtents.man [new file with mode: 0644]
man/XwcTextPropertyToTextList.man [new file with mode: 0644]
man/xkb/Makefile.am [new file with mode: 0644]
man/xkb/XkbActionCtrls.man [new file with mode: 0644]
man/xkb/XkbAddDeviceLedInfo.man [new file with mode: 0644]
man/xkb/XkbAddGeomColor.man [new file with mode: 0644]
man/xkb/XkbAddGeomDoodad.man [new file with mode: 0644]
man/xkb/XkbAddGeomKey.man [new file with mode: 0644]
man/xkb/XkbAddGeomKeyAlias.man [new file with mode: 0644]
man/xkb/XkbAddGeomOutline.man [new file with mode: 0644]
man/xkb/XkbAddGeomOverlay.man [new file with mode: 0644]
man/xkb/XkbAddGeomOverlayKey.man [new file with mode: 0644]
man/xkb/XkbAddGeomOverlayRow.man [new file with mode: 0644]
man/xkb/XkbAddGeomProperty.man [new file with mode: 0644]
man/xkb/XkbAddGeomRow.man [new file with mode: 0644]
man/xkb/XkbAddGeomSection.man [new file with mode: 0644]
man/xkb/XkbAddGeomShape.man [new file with mode: 0644]
man/xkb/XkbAddSymInterpret.man [new file with mode: 0644]
man/xkb/XkbAllocClientMap.man [new file with mode: 0644]
man/xkb/XkbAllocCompatMap.man [new file with mode: 0644]
man/xkb/XkbAllocControls.man [new file with mode: 0644]
man/xkb/XkbAllocDeviceInfo.man [new file with mode: 0644]
man/xkb/XkbAllocDeviceLedInfo.man [new file with mode: 0644]
man/xkb/XkbAllocGeomColors.man [new file with mode: 0644]
man/xkb/XkbAllocGeomDoodads.man [new file with mode: 0644]
man/xkb/XkbAllocGeomKeyAliases.man [new file with mode: 0644]
man/xkb/XkbAllocGeomKeys.man [new file with mode: 0644]
man/xkb/XkbAllocGeomOutlines.man [new file with mode: 0644]
man/xkb/XkbAllocGeomOverlayKey.man [new file with mode: 0644]
man/xkb/XkbAllocGeomOverlayRows.man [new file with mode: 0644]
man/xkb/XkbAllocGeomOverlays.man [new file with mode: 0644]
man/xkb/XkbAllocGeomPoints.man [new file with mode: 0644]
man/xkb/XkbAllocGeomProps.man [new file with mode: 0644]
man/xkb/XkbAllocGeomRows.man [new file with mode: 0644]
man/xkb/XkbAllocGeomSectionDoodads.man [new file with mode: 0644]
man/xkb/XkbAllocGeomSections.man [new file with mode: 0644]
man/xkb/XkbAllocGeomShapes.man [new file with mode: 0644]
man/xkb/XkbAllocGeometry.man [new file with mode: 0644]
man/xkb/XkbAllocIndicatorMaps.man [new file with mode: 0644]
man/xkb/XkbAllocKeyboard.man [new file with mode: 0644]
man/xkb/XkbAllocNames.man [new file with mode: 0644]
man/xkb/XkbAllocServerMap.man [new file with mode: 0644]
man/xkb/XkbApplyCompatMapToKey.man [new file with mode: 0644]
man/xkb/XkbBell.man [new file with mode: 0644]
man/xkb/XkbBellEvent.man [new file with mode: 0644]
man/xkb/XkbChangeControls.man [new file with mode: 0644]
man/xkb/XkbChangeDeviceInfo.man [new file with mode: 0644]
man/xkb/XkbChangeEnabledControls.man [new file with mode: 0644]
man/xkb/XkbChangeIndicators.man [new file with mode: 0644]
man/xkb/XkbChangeMap.man [new file with mode: 0644]
man/xkb/XkbChangeNames.man [new file with mode: 0644]
man/xkb/XkbChangeTypesOfKey.man [new file with mode: 0644]
man/xkb/XkbComputeRowBounds.man [new file with mode: 0644]
man/xkb/XkbComputeSectionBounds.man [new file with mode: 0644]
man/xkb/XkbComputeShapeBounds.man [new file with mode: 0644]
man/xkb/XkbComputeShapeTop.man [new file with mode: 0644]
man/xkb/XkbCopyKeyType.man [new file with mode: 0644]
man/xkb/XkbCopyKeyTypes.man [new file with mode: 0644]
man/xkb/XkbDeviceBell.man [new file with mode: 0644]
man/xkb/XkbDeviceBellEvent.man [new file with mode: 0644]
man/xkb/XkbFindOverlayForKey.man [new file with mode: 0644]
man/xkb/XkbForceBell.man [new file with mode: 0644]
man/xkb/XkbForceDeviceBell.man [new file with mode: 0644]
man/xkb/XkbFreeClientMap.man [new file with mode: 0644]
man/xkb/XkbFreeCompatMap.man [new file with mode: 0644]
man/xkb/XkbFreeComponentList.man [new file with mode: 0644]
man/xkb/XkbFreeControls.man [new file with mode: 0644]
man/xkb/XkbFreeDeviceInfo.man [new file with mode: 0644]
man/xkb/XkbFreeGeomColors.man [new file with mode: 0644]
man/xkb/XkbFreeGeomDoodads.man [new file with mode: 0644]
man/xkb/XkbFreeGeomKeyAliases.man [new file with mode: 0644]
man/xkb/XkbFreeGeomKeys.man [new file with mode: 0644]
man/xkb/XkbFreeGeomOutlines.man [new file with mode: 0644]
man/xkb/XkbFreeGeomOverlayKeys.man [new file with mode: 0644]
man/xkb/XkbFreeGeomOverlayRows.man [new file with mode: 0644]
man/xkb/XkbFreeGeomOverlays.man [new file with mode: 0644]
man/xkb/XkbFreeGeomPoints.man [new file with mode: 0644]
man/xkb/XkbFreeGeomProperties.man [new file with mode: 0644]
man/xkb/XkbFreeGeomRows.man [new file with mode: 0644]
man/xkb/XkbFreeGeomSections.man [new file with mode: 0644]
man/xkb/XkbFreeGeomShapes.man [new file with mode: 0644]
man/xkb/XkbFreeGeometry.man [new file with mode: 0644]
man/xkb/XkbFreeIndicatorMaps.man [new file with mode: 0644]
man/xkb/XkbFreeKeyboard.man [new file with mode: 0644]
man/xkb/XkbFreeNames.man [new file with mode: 0644]
man/xkb/XkbFreeServerMap.man [new file with mode: 0644]
man/xkb/XkbGetAccessXTimeout.man [new file with mode: 0644]
man/xkb/XkbGetAutoRepeatRate.man [new file with mode: 0644]
man/xkb/XkbGetAutoResetControls.man [new file with mode: 0644]
man/xkb/XkbGetBounceKeysDelay.man [new file with mode: 0644]
man/xkb/XkbGetCompatMap.man [new file with mode: 0644]
man/xkb/XkbGetControls.man [new file with mode: 0644]
man/xkb/XkbGetControlsChanges.man [new file with mode: 0644]
man/xkb/XkbGetDetectableAutoRepeat.man [new file with mode: 0644]
man/xkb/XkbGetDeviceButtonActions.man [new file with mode: 0644]
man/xkb/XkbGetDeviceInfo.man [new file with mode: 0644]
man/xkb/XkbGetDeviceInfoChanges.man [new file with mode: 0644]
man/xkb/XkbGetDeviceLedInfo.man [new file with mode: 0644]
man/xkb/XkbGetGeometry.man [new file with mode: 0644]
man/xkb/XkbGetIndicatorChanges.man [new file with mode: 0644]
man/xkb/XkbGetIndicatorMap.man [new file with mode: 0644]
man/xkb/XkbGetIndicatorState.man [new file with mode: 0644]
man/xkb/XkbGetKeyActions.man [new file with mode: 0644]
man/xkb/XkbGetKeyBehaviors.man [new file with mode: 0644]
man/xkb/XkbGetKeyExplicitComponents.man [new file with mode: 0644]
man/xkb/XkbGetKeyModifierMap.man [new file with mode: 0644]
man/xkb/XkbGetKeySyms.man [new file with mode: 0644]
man/xkb/XkbGetKeyTypes.man [new file with mode: 0644]
man/xkb/XkbGetKeyVirtualModMap.man [new file with mode: 0644]
man/xkb/XkbGetKeyboard.man [new file with mode: 0644]
man/xkb/XkbGetKeyboardByName.man [new file with mode: 0644]
man/xkb/XkbGetMap.man [new file with mode: 0644]
man/xkb/XkbGetNameChanges.man [new file with mode: 0644]
man/xkb/XkbGetNamedGeometry.man [new file with mode: 0644]
man/xkb/XkbGetNamedIndicator.man [new file with mode: 0644]
man/xkb/XkbGetNames.man [new file with mode: 0644]
man/xkb/XkbGetSlowKeysDelay.man [new file with mode: 0644]
man/xkb/XkbGetState.man [new file with mode: 0644]
man/xkb/XkbGetStickyKeysOptions.man [new file with mode: 0644]
man/xkb/XkbGetUpdatedMap.man [new file with mode: 0644]
man/xkb/XkbGetVirtualMods.man [new file with mode: 0644]
man/xkb/XkbGetXlibControls.man [new file with mode: 0644]
man/xkb/XkbIgnoreExtension.man [new file with mode: 0644]
man/xkb/XkbInitCanonicalKeyTypes.man [new file with mode: 0644]
man/xkb/XkbKeyAction.man [new file with mode: 0644]
man/xkb/XkbKeyActionEntry.man [new file with mode: 0644]
man/xkb/XkbKeyActionsPtr.man [new file with mode: 0644]
man/xkb/XkbKeyGroupInfo.man [new file with mode: 0644]
man/xkb/XkbKeyGroupWidth.man [new file with mode: 0644]
man/xkb/XkbKeyGroupsWidth.man [new file with mode: 0644]
man/xkb/XkbKeyHasActions.man [new file with mode: 0644]
man/xkb/XkbKeyNumActions.man [new file with mode: 0644]
man/xkb/XkbKeyNumGroups.man [new file with mode: 0644]
man/xkb/XkbKeyNumSyms.man [new file with mode: 0644]
man/xkb/XkbKeySymEntry.man [new file with mode: 0644]
man/xkb/XkbKeySymsOffset.man [new file with mode: 0644]
man/xkb/XkbKeySymsPtr.man [new file with mode: 0644]
man/xkb/XkbKeyType.man [new file with mode: 0644]
man/xkb/XkbKeyTypeIndex.man [new file with mode: 0644]
man/xkb/XkbKeyTypesForCoreSymbols.man [new file with mode: 0644]
man/xkb/XkbKeycodeToKeysym.man [new file with mode: 0644]
man/xkb/XkbKeysymToModifiers.man [new file with mode: 0644]
man/xkb/XkbLatchGroup.man [new file with mode: 0644]
man/xkb/XkbLatchModifiers.man [new file with mode: 0644]
man/xkb/XkbLibraryVersion.man [new file with mode: 0644]
man/xkb/XkbListComponents.man [new file with mode: 0644]
man/xkb/XkbLockGroup.man [new file with mode: 0644]
man/xkb/XkbLockModifiers.man [new file with mode: 0644]
man/xkb/XkbLookupKeyBinding.man [new file with mode: 0644]
man/xkb/XkbLookupKeySym.man [new file with mode: 0644]
man/xkb/XkbModActionVMods.man [new file with mode: 0644]
man/xkb/XkbNoteControlsChanges.man [new file with mode: 0644]
man/xkb/XkbNoteDeviceChanges.man [new file with mode: 0644]
man/xkb/XkbNoteIndicatorChanges.man [new file with mode: 0644]
man/xkb/XkbNoteNameChanges.man [new file with mode: 0644]
man/xkb/XkbOpenDisplay.man [new file with mode: 0644]
man/xkb/XkbOutOfRangeGroupInfo.man [new file with mode: 0644]
man/xkb/XkbOutOfRangeGroupNumber.man [new file with mode: 0644]
man/xkb/XkbPtrActionX.man [new file with mode: 0644]
man/xkb/XkbPtrActionY.man [new file with mode: 0644]
man/xkb/XkbQueryExtension.man [new file with mode: 0644]
man/xkb/XkbRefreshKeyboardMapping.man [new file with mode: 0644]
man/xkb/XkbResizeDeviceButtonActions.man [new file with mode: 0644]
man/xkb/XkbResizeKeyActions.man [new file with mode: 0644]
man/xkb/XkbResizeKeySyms.man [new file with mode: 0644]
man/xkb/XkbResizeKeyType.man [new file with mode: 0644]
man/xkb/XkbSAActionSetCtrls.man [new file with mode: 0644]
man/xkb/XkbSAGroup.man [new file with mode: 0644]
man/xkb/XkbSAPtrDfltValue.man [new file with mode: 0644]
man/xkb/XkbSARedirectSetVMods.man [new file with mode: 0644]
man/xkb/XkbSARedirectSetVModsMask.man [new file with mode: 0644]
man/xkb/XkbSARedirectVMods.man [new file with mode: 0644]
man/xkb/XkbSARedirectVModsMask.man [new file with mode: 0644]
man/xkb/XkbSAScreen.man [new file with mode: 0644]
man/xkb/XkbSASetGroup.man [new file with mode: 0644]
man/xkb/XkbSASetPtrDfltValue.man [new file with mode: 0644]
man/xkb/XkbSASetScreen.man [new file with mode: 0644]
man/xkb/XkbSelectEventDetails.man [new file with mode: 0644]
man/xkb/XkbSelectEvents.man [new file with mode: 0644]
man/xkb/XkbSetAccessXTimeout.man [new file with mode: 0644]
man/xkb/XkbSetAutoRepeatRate.man [new file with mode: 0644]
man/xkb/XkbSetAutoResetControls.man [new file with mode: 0644]
man/xkb/XkbSetBounceKeysDelay.man [new file with mode: 0644]
man/xkb/XkbSetCompatMap.man [new file with mode: 0644]
man/xkb/XkbSetControls.man [new file with mode: 0644]
man/xkb/XkbSetDebuggingFlags.man [new file with mode: 0644]
man/xkb/XkbSetDetectableAutoRepeat.man [new file with mode: 0644]
man/xkb/XkbSetDeviceButtonActions.man [new file with mode: 0644]
man/xkb/XkbSetDeviceInfo.man [new file with mode: 0644]
man/xkb/XkbSetIgnoreLockMods.man [new file with mode: 0644]
man/xkb/XkbSetIndicatorMap.man [new file with mode: 0644]
man/xkb/XkbSetMap.man [new file with mode: 0644]
man/xkb/XkbSetModActionVMods.man [new file with mode: 0644]
man/xkb/XkbSetNamedIndicator.man [new file with mode: 0644]
man/xkb/XkbSetNames.man [new file with mode: 0644]
man/xkb/XkbSetPtrActionX.man [new file with mode: 0644]
man/xkb/XkbSetPtrActionY.man [new file with mode: 0644]
man/xkb/XkbSetServerInternalMods.man [new file with mode: 0644]
man/xkb/XkbSetXlibControls.man [new file with mode: 0644]
man/xkb/XkbTranslateKeyCode.man [new file with mode: 0644]
man/xkb/XkbTranslateKeySym.man [new file with mode: 0644]
man/xkb/XkbUpdateMapFromCore.man [new file with mode: 0644]
man/xkb/XkbVirtualModsToReal.man [new file with mode: 0644]
modules/Makefile.am [new file with mode: 0644]
modules/im/Makefile.am [new file with mode: 0644]
modules/im/ximcp/Makefile.am [new file with mode: 0644]
modules/im/ximcp/imCallbk.c [new file with mode: 0644]
modules/im/ximcp/imDefFlt.c [new file with mode: 0644]
modules/im/ximcp/imDefIc.c [new file with mode: 0644]
modules/im/ximcp/imDefIm.c [new file with mode: 0644]
modules/im/ximcp/imDefLkup.c [new file with mode: 0644]
modules/im/ximcp/imDispch.c [new file with mode: 0644]
modules/im/ximcp/imEvToWire.c [new file with mode: 0644]
modules/im/ximcp/imExten.c [new file with mode: 0644]
modules/im/ximcp/imImSw.c [new file with mode: 0644]
modules/im/ximcp/imInsClbk.c [new file with mode: 0644]
modules/im/ximcp/imInt.c [new file with mode: 0644]
modules/im/ximcp/imLcFlt.c [new file with mode: 0644]
modules/im/ximcp/imLcGIc.c [new file with mode: 0644]
modules/im/ximcp/imLcIc.c [new file with mode: 0644]
modules/im/ximcp/imLcIm.c [new file with mode: 0644]
modules/im/ximcp/imLcLkup.c [new file with mode: 0644]
modules/im/ximcp/imLcPrs.c [new file with mode: 0644]
modules/im/ximcp/imLcSIc.c [new file with mode: 0644]
modules/im/ximcp/imRm.c [new file with mode: 0644]
modules/im/ximcp/imRmAttr.c [new file with mode: 0644]
modules/im/ximcp/imThaiFlt.c [new file with mode: 0644]
modules/im/ximcp/imThaiIc.c [new file with mode: 0644]
modules/im/ximcp/imThaiIm.c [new file with mode: 0644]
modules/im/ximcp/imTrX.c [new file with mode: 0644]
modules/im/ximcp/imTrans.c [new file with mode: 0644]
modules/im/ximcp/imTransR.c [new file with mode: 0644]
modules/lc/Makefile.am [new file with mode: 0644]
modules/lc/Utf8/Makefile.am [new file with mode: 0644]
modules/lc/Utf8/lcUTF8Load.c [new file with mode: 0644]
modules/lc/def/Makefile.am [new file with mode: 0644]
modules/lc/def/lcDefConv.c [new file with mode: 0644]
modules/lc/gen/Makefile.am [new file with mode: 0644]
modules/lc/gen/lcGenConv.c [new file with mode: 0644]
modules/lc/xlocale/Makefile.am [new file with mode: 0644]
modules/lc/xlocale/lcEuc.c [new file with mode: 0644]
modules/lc/xlocale/lcJis.c [new file with mode: 0644]
modules/lc/xlocale/lcSjis.c [new file with mode: 0644]
modules/om/Makefile.am [new file with mode: 0644]
modules/om/generic/Makefile.am [new file with mode: 0644]
modules/om/generic/omDefault.c [new file with mode: 0644]
modules/om/generic/omGeneric.c [new file with mode: 0644]
modules/om/generic/omImText.c [new file with mode: 0644]
modules/om/generic/omText.c [new file with mode: 0644]
modules/om/generic/omTextEsc.c [new file with mode: 0644]
modules/om/generic/omTextExt.c [new file with mode: 0644]
modules/om/generic/omTextPer.c [new file with mode: 0644]
modules/om/generic/omXChar.c [new file with mode: 0644]
nls/C/Compose.pre [new file with mode: 0644]
nls/C/XI18N_OBJS [new file with mode: 0644]
nls/C/XLC_LOCALE.pre [new file with mode: 0644]
nls/Makefile.am [new file with mode: 0644]
nls/am_ET.UTF-8/Compose.pre [new file with mode: 0644]
nls/am_ET.UTF-8/XI18N_OBJS [new file with mode: 0644]
nls/am_ET.UTF-8/XLC_LOCALE.pre [new file with mode: 0644]
nls/armscii-8/Compose.pre [new file with mode: 0644]
nls/armscii-8/XI18N_OBJS [new file with mode: 0644]
nls/armscii-8/XLC_LOCALE.pre [new file with mode: 0644]
nls/compose-check.pl [new file with mode: 0755]
nls/compose.dir.pre [new file with mode: 0644]
nls/el_GR.UTF-8/Compose.pre [new file with mode: 0644]
nls/el_GR.UTF-8/XI18N_OBJS [new file with mode: 0644]
nls/el_GR.UTF-8/XLC_LOCALE.pre [new file with mode: 0644]
nls/en_US.UTF-8/Compose.pre [new file with mode: 0644]
nls/en_US.UTF-8/XI18N_OBJS [new file with mode: 0644]
nls/en_US.UTF-8/XLC_LOCALE.pre [new file with mode: 0644]
nls/fi_FI.UTF-8/Compose.pre [new file with mode: 0644]
nls/fi_FI.UTF-8/XI18N_OBJS [new file with mode: 0644]
nls/fi_FI.UTF-8/XLC_LOCALE.pre [new file with mode: 0644]
nls/georgian-academy/Compose.pre [new file with mode: 0644]
nls/georgian-academy/XI18N_OBJS [new file with mode: 0644]
nls/georgian-academy/XLC_LOCALE.pre [new file with mode: 0644]
nls/georgian-ps/Compose.pre [new file with mode: 0644]
nls/georgian-ps/XI18N_OBJS [new file with mode: 0644]
nls/georgian-ps/XLC_LOCALE.pre [new file with mode: 0644]
nls/ibm-cp1133/Compose.pre [new file with mode: 0644]
nls/ibm-cp1133/XI18N_OBJS [new file with mode: 0644]
nls/ibm-cp1133/XLC_LOCALE.pre [new file with mode: 0644]
nls/iscii-dev/Compose.pre [new file with mode: 0644]
nls/iscii-dev/XI18N_OBJS [new file with mode: 0644]
nls/iscii-dev/XLC_LOCALE.pre [new file with mode: 0644]
nls/isiri-3342/Compose.pre [new file with mode: 0644]
nls/isiri-3342/XI18N_OBJS [new file with mode: 0644]
nls/isiri-3342/XLC_LOCALE.pre [new file with mode: 0644]
nls/iso8859-1/Compose.pre [new file with mode: 0644]
nls/iso8859-1/XI18N_OBJS [new file with mode: 0644]
nls/iso8859-1/XLC_LOCALE.pre [new file with mode: 0644]
nls/iso8859-10/Compose.pre [new file with mode: 0644]
nls/iso8859-10/XI18N_OBJS [new file with mode: 0644]
nls/iso8859-10/XLC_LOCALE.pre [new file with mode: 0644]
nls/iso8859-11/Compose.pre [new file with mode: 0644]
nls/iso8859-11/XI18N_OBJS [new file with mode: 0644]
nls/iso8859-11/XLC_LOCALE.pre [new file with mode: 0644]
nls/iso8859-13/Compose.pre [new file with mode: 0644]
nls/iso8859-13/XI18N_OBJS [new file with mode: 0644]
nls/iso8859-13/XLC_LOCALE.pre [new file with mode: 0644]
nls/iso8859-14/Compose.pre [new file with mode: 0644]
nls/iso8859-14/XI18N_OBJS [new file with mode: 0644]
nls/iso8859-14/XLC_LOCALE.pre [new file with mode: 0644]
nls/iso8859-15/Compose.pre [new file with mode: 0644]
nls/iso8859-15/XI18N_OBJS [new file with mode: 0644]
nls/iso8859-15/XLC_LOCALE.pre [new file with mode: 0644]
nls/iso8859-2/Compose.pre [new file with mode: 0644]
nls/iso8859-2/XI18N_OBJS [new file with mode: 0644]
nls/iso8859-2/XLC_LOCALE.pre [new file with mode: 0644]
nls/iso8859-3/Compose.pre [new file with mode: 0644]
nls/iso8859-3/XI18N_OBJS [new file with mode: 0644]
nls/iso8859-3/XLC_LOCALE.pre [new file with mode: 0644]
nls/iso8859-4/Compose.pre [new file with mode: 0644]
nls/iso8859-4/XI18N_OBJS [new file with mode: 0644]
nls/iso8859-4/XLC_LOCALE.pre [new file with mode: 0644]
nls/iso8859-5/Compose.pre [new file with mode: 0644]
nls/iso8859-5/XI18N_OBJS [new file with mode: 0644]
nls/iso8859-5/XLC_LOCALE.pre [new file with mode: 0644]
nls/iso8859-6/Compose.pre [new file with mode: 0644]
nls/iso8859-6/XI18N_OBJS [new file with mode: 0644]
nls/iso8859-6/XLC_LOCALE.pre [new file with mode: 0644]
nls/iso8859-7/Compose.pre [new file with mode: 0644]
nls/iso8859-7/XI18N_OBJS [new file with mode: 0644]
nls/iso8859-7/XLC_LOCALE.pre [new file with mode: 0644]
nls/iso8859-8/Compose.pre [new file with mode: 0644]
nls/iso8859-8/XI18N_OBJS [new file with mode: 0644]
nls/iso8859-8/XLC_LOCALE.pre [new file with mode: 0644]
nls/iso8859-9/Compose.pre [new file with mode: 0644]
nls/iso8859-9/XI18N_OBJS [new file with mode: 0644]
nls/iso8859-9/XLC_LOCALE.pre [new file with mode: 0644]
nls/iso8859-9e/Compose.pre [new file with mode: 0644]
nls/iso8859-9e/XI18N_OBJS [new file with mode: 0644]
nls/iso8859-9e/XLC_LOCALE.pre [new file with mode: 0644]
nls/ja.JIS/Compose.pre [new file with mode: 0644]
nls/ja.JIS/XI18N_OBJS [new file with mode: 0644]
nls/ja.JIS/XLC_LOCALE.pre [new file with mode: 0644]
nls/ja.S90/Compose.pre [new file with mode: 0644]
nls/ja.S90/XI18N_OBJS [new file with mode: 0644]
nls/ja.S90/XLC_LOCALE.pre [new file with mode: 0644]
nls/ja.SJIS/Compose.pre [new file with mode: 0644]
nls/ja.SJIS/XI18N_OBJS [new file with mode: 0644]
nls/ja.SJIS/XLC_LOCALE.pre [new file with mode: 0644]
nls/ja.U90/Compose.pre [new file with mode: 0644]
nls/ja.U90/XI18N_OBJS [new file with mode: 0644]
nls/ja.U90/XLC_LOCALE.pre [new file with mode: 0644]
nls/ja/Compose.pre [new file with mode: 0644]
nls/ja/XI18N_OBJS [new file with mode: 0644]
nls/ja/XLC_LOCALE.pre [new file with mode: 0644]
nls/ja_JP.UTF-8/Compose.pre [new file with mode: 0644]
nls/ja_JP.UTF-8/XI18N_OBJS [new file with mode: 0644]
nls/ja_JP.UTF-8/XLC_LOCALE.pre [new file with mode: 0644]
nls/ko/Compose.pre [new file with mode: 0644]
nls/ko/XI18N_OBJS [new file with mode: 0644]
nls/ko/XLC_LOCALE.pre [new file with mode: 0644]
nls/ko_KR.UTF-8/Compose.pre [new file with mode: 0644]
nls/ko_KR.UTF-8/XI18N_OBJS [new file with mode: 0644]
nls/ko_KR.UTF-8/XLC_LOCALE.pre [new file with mode: 0644]
nls/koi8-c/Compose.pre [new file with mode: 0644]
nls/koi8-c/XI18N_OBJS [new file with mode: 0644]
nls/koi8-c/XLC_LOCALE.pre [new file with mode: 0644]
nls/koi8-r/Compose.pre [new file with mode: 0644]
nls/koi8-r/XI18N_OBJS [new file with mode: 0644]
nls/koi8-r/XLC_LOCALE.pre [new file with mode: 0644]
nls/koi8-u/Compose.pre [new file with mode: 0644]
nls/koi8-u/XI18N_OBJS [new file with mode: 0644]
nls/koi8-u/XLC_LOCALE.pre [new file with mode: 0644]
nls/locale.alias.pre [new file with mode: 0644]
nls/locale.dir.pre [new file with mode: 0644]
nls/microsoft-cp1251/Compose.pre [new file with mode: 0644]
nls/microsoft-cp1251/XI18N_OBJS [new file with mode: 0644]
nls/microsoft-cp1251/XLC_LOCALE.pre [new file with mode: 0644]
nls/microsoft-cp1255/Compose.pre [new file with mode: 0644]
nls/microsoft-cp1255/XI18N_OBJS [new file with mode: 0644]
nls/microsoft-cp1255/XLC_LOCALE.pre [new file with mode: 0644]
nls/microsoft-cp1256/Compose.pre [new file with mode: 0644]
nls/microsoft-cp1256/XI18N_OBJS [new file with mode: 0644]
nls/microsoft-cp1256/XLC_LOCALE.pre [new file with mode: 0644]
nls/mulelao-1/Compose.pre [new file with mode: 0644]
nls/mulelao-1/XI18N_OBJS [new file with mode: 0644]
nls/mulelao-1/XLC_LOCALE.pre [new file with mode: 0644]
nls/nokhchi-1/Compose.pre [new file with mode: 0644]
nls/nokhchi-1/XI18N_OBJS [new file with mode: 0644]
nls/nokhchi-1/XLC_LOCALE.pre [new file with mode: 0644]
nls/pt_BR.UTF-8/Compose.pre [new file with mode: 0644]
nls/pt_BR.UTF-8/XI18N_OBJS [new file with mode: 0644]
nls/pt_BR.UTF-8/XLC_LOCALE.pre [new file with mode: 0644]
nls/ru_RU.UTF-8/Compose.pre [new file with mode: 0644]
nls/ru_RU.UTF-8/XI18N_OBJS [new file with mode: 0644]
nls/ru_RU.UTF-8/XLC_LOCALE.pre [new file with mode: 0644]
nls/tatar-cyr/Compose.pre [new file with mode: 0644]
nls/tatar-cyr/XI18N_OBJS [new file with mode: 0644]
nls/tatar-cyr/XLC_LOCALE.pre [new file with mode: 0644]
nls/th_TH.UTF-8/Compose.pre [new file with mode: 0644]
nls/th_TH.UTF-8/XI18N_OBJS [new file with mode: 0644]
nls/th_TH.UTF-8/XLC_LOCALE.pre [new file with mode: 0644]
nls/th_TH/Compose.pre [new file with mode: 0644]
nls/th_TH/XI18N_OBJS [new file with mode: 0644]
nls/th_TH/XLC_LOCALE.pre [new file with mode: 0644]
nls/tscii-0/Compose.pre [new file with mode: 0644]
nls/tscii-0/XI18N_OBJS [new file with mode: 0644]
nls/tscii-0/XLC_LOCALE.pre [new file with mode: 0644]
nls/vi_VN.tcvn/Compose.pre [new file with mode: 0644]
nls/vi_VN.tcvn/XI18N_OBJS [new file with mode: 0644]
nls/vi_VN.tcvn/XLC_LOCALE.pre [new file with mode: 0644]
nls/vi_VN.viscii/Compose.pre [new file with mode: 0644]
nls/vi_VN.viscii/XI18N_OBJS [new file with mode: 0644]
nls/vi_VN.viscii/XLC_LOCALE.pre [new file with mode: 0644]
nls/zh_CN.UTF-8/Compose.pre [new file with mode: 0644]
nls/zh_CN.UTF-8/XI18N_OBJS [new file with mode: 0644]
nls/zh_CN.UTF-8/XLC_LOCALE.pre [new file with mode: 0644]
nls/zh_CN.gb18030/Compose.pre [new file with mode: 0644]
nls/zh_CN.gb18030/XI18N_OBJS [new file with mode: 0644]
nls/zh_CN.gb18030/XLC_LOCALE.pre [new file with mode: 0644]
nls/zh_CN.gbk/Compose.pre [new file with mode: 0644]
nls/zh_CN.gbk/XI18N_OBJS [new file with mode: 0644]
nls/zh_CN.gbk/XLC_LOCALE.pre [new file with mode: 0644]
nls/zh_CN/Compose.pre [new file with mode: 0644]
nls/zh_CN/XI18N_OBJS [new file with mode: 0644]
nls/zh_CN/XLC_LOCALE.pre [new file with mode: 0644]
nls/zh_HK.UTF-8/Compose.pre [new file with mode: 0644]
nls/zh_HK.UTF-8/XI18N_OBJS [new file with mode: 0644]
nls/zh_HK.UTF-8/XLC_LOCALE.pre [new file with mode: 0644]
nls/zh_HK.big5/Compose.pre [new file with mode: 0644]
nls/zh_HK.big5/XI18N_OBJS [new file with mode: 0644]
nls/zh_HK.big5/XLC_LOCALE.pre [new file with mode: 0644]
nls/zh_HK.big5hkscs/Compose.pre [new file with mode: 0644]
nls/zh_HK.big5hkscs/XI18N_OBJS [new file with mode: 0644]
nls/zh_HK.big5hkscs/XLC_LOCALE.pre [new file with mode: 0644]
nls/zh_TW.UTF-8/Compose.pre [new file with mode: 0644]
nls/zh_TW.UTF-8/XI18N_OBJS [new file with mode: 0644]
nls/zh_TW.UTF-8/XLC_LOCALE.pre [new file with mode: 0644]
nls/zh_TW.big5/Compose.pre [new file with mode: 0644]
nls/zh_TW.big5/XI18N_OBJS [new file with mode: 0644]
nls/zh_TW.big5/XLC_LOCALE.pre [new file with mode: 0644]
nls/zh_TW/Compose.pre [new file with mode: 0644]
nls/zh_TW/XI18N_OBJS [new file with mode: 0644]
nls/zh_TW/XLC_LOCALE.pre [new file with mode: 0644]
packaging/libX11.spec [new file with mode: 0644]
specs/Makefile.am [new file with mode: 0644]
specs/XIM/Makefile.am [new file with mode: 0644]
specs/XIM/dynamicflow.svg [new file with mode: 0644]
specs/XIM/dynamicflowsampleseq.svg [new file with mode: 0644]
specs/XIM/eventflow.svg [new file with mode: 0644]
specs/XIM/sampleprotocolflow1.svg [new file with mode: 0644]
specs/XIM/sampleprotocolflow2.svg [new file with mode: 0644]
specs/XIM/staticflow.svg [new file with mode: 0644]
specs/XIM/staticflowsampleseq.svg [new file with mode: 0644]
specs/XIM/xim.xml [new file with mode: 0644]
specs/XKB/Makefile.am [new file with mode: 0644]
specs/XKB/XKBlib-1.svg [new file with mode: 0644]
specs/XKB/XKBlib-10.svg [new file with mode: 0644]
specs/XKB/XKBlib-11.svg [new file with mode: 0644]
specs/XKB/XKBlib-12.svg [new file with mode: 0644]
specs/XKB/XKBlib-13.svg [new file with mode: 0644]
specs/XKB/XKBlib-14.svg [new file with mode: 0644]
specs/XKB/XKBlib-15.svg [new file with mode: 0644]
specs/XKB/XKBlib-16.svg [new file with mode: 0644]
specs/XKB/XKBlib-17.svg [new file with mode: 0644]
specs/XKB/XKBlib-18.svg [new file with mode: 0644]
specs/XKB/XKBlib-19.svg [new file with mode: 0644]
specs/XKB/XKBlib-2.svg [new file with mode: 0644]
specs/XKB/XKBlib-20.svg [new file with mode: 0644]
specs/XKB/XKBlib-21.svg [new file with mode: 0644]
specs/XKB/XKBlib-3.svg [new file with mode: 0644]
specs/XKB/XKBlib-4.svg [new file with mode: 0644]
specs/XKB/XKBlib-5.svg [new file with mode: 0644]
specs/XKB/XKBlib-6.svg [new file with mode: 0644]
specs/XKB/XKBlib-7.svg [new file with mode: 0644]
specs/XKB/XKBlib-8.svg [new file with mode: 0644]
specs/XKB/XKBlib-9.svg [new file with mode: 0644]
specs/XKB/acknowledgement.xml [new file with mode: 0644]
specs/XKB/ch01.xml [new file with mode: 0644]
specs/XKB/ch02.xml [new file with mode: 0644]
specs/XKB/ch03.xml [new file with mode: 0644]
specs/XKB/ch04.xml [new file with mode: 0644]
specs/XKB/ch05.xml [new file with mode: 0644]
specs/XKB/ch06.xml [new file with mode: 0644]
specs/XKB/ch07.xml [new file with mode: 0644]
specs/XKB/ch08.xml [new file with mode: 0644]
specs/XKB/ch09.xml [new file with mode: 0644]
specs/XKB/ch10.xml [new file with mode: 0644]
specs/XKB/ch11.xml [new file with mode: 0644]
specs/XKB/ch12.xml [new file with mode: 0644]
specs/XKB/ch13.xml [new file with mode: 0644]
specs/XKB/ch14.xml [new file with mode: 0644]
specs/XKB/ch15.xml [new file with mode: 0644]
specs/XKB/ch16.xml [new file with mode: 0644]
specs/XKB/ch17.xml [new file with mode: 0644]
specs/XKB/ch18.xml [new file with mode: 0644]
specs/XKB/ch19.xml [new file with mode: 0644]
specs/XKB/ch20.xml [new file with mode: 0644]
specs/XKB/ch21.xml [new file with mode: 0644]
specs/XKB/ch22.xml [new file with mode: 0644]
specs/XKB/glossary.xml [new file with mode: 0644]
specs/XKB/xkblib.xml [new file with mode: 0644]
specs/i18n/Makefile.am [new file with mode: 0644]
specs/i18n/compose/Makefile.am [new file with mode: 0644]
specs/i18n/compose/compose-chart.pl [new file with mode: 0755]
specs/i18n/compose/docbook-nl.am [new file with mode: 0644]
specs/i18n/framework/Makefile.am [new file with mode: 0644]
specs/i18n/framework/framework.svg [new file with mode: 0644]
specs/i18n/framework/framework.xml [new file with mode: 0644]
specs/i18n/localedb/Makefile.am [new file with mode: 0644]
specs/i18n/localedb/localedb.xml [new file with mode: 0644]
specs/i18n/trans/Makefile.am [new file with mode: 0644]
specs/i18n/trans/trans.xml [new file with mode: 0644]
specs/libX11/AppA.xml [new file with mode: 0644]
specs/libX11/AppB.xml [new file with mode: 0644]
specs/libX11/AppC.xml [new file with mode: 0644]
specs/libX11/AppD.xml [new file with mode: 0644]
specs/libX11/CH01.xml [new file with mode: 0644]
specs/libX11/CH02.xml [new file with mode: 0644]
specs/libX11/CH03.xml [new file with mode: 0644]
specs/libX11/CH04.xml [new file with mode: 0644]
specs/libX11/CH05.xml [new file with mode: 0644]
specs/libX11/CH06.xml [new file with mode: 0644]
specs/libX11/CH07.xml [new file with mode: 0644]
specs/libX11/CH08.xml [new file with mode: 0644]
specs/libX11/CH09.xml [new file with mode: 0644]
specs/libX11/CH10.xml [new file with mode: 0644]
specs/libX11/CH11.xml [new file with mode: 0644]
specs/libX11/CH12.xml [new file with mode: 0644]
specs/libX11/CH13.xml [new file with mode: 0644]
specs/libX11/CH14.xml [new file with mode: 0644]
specs/libX11/CH15.xml [new file with mode: 0644]
specs/libX11/CH16.xml [new file with mode: 0644]
specs/libX11/Makefile.am [new file with mode: 0644]
specs/libX11/credits.xml [new file with mode: 0644]
specs/libX11/glossary.xml [new file with mode: 0644]
specs/libX11/libX11.xml [new file with mode: 0644]
src/AllCells.c [new file with mode: 0644]
src/AllPlanes.c [new file with mode: 0644]
src/AllowEv.c [new file with mode: 0644]
src/AutoRep.c [new file with mode: 0644]
src/Backgnd.c [new file with mode: 0644]
src/BdrWidth.c [new file with mode: 0644]
src/Bell.c [new file with mode: 0644]
src/Border.c [new file with mode: 0644]
src/ChAccCon.c [new file with mode: 0644]
src/ChActPGb.c [new file with mode: 0644]
src/ChClMode.c [new file with mode: 0644]
src/ChCmap.c [new file with mode: 0644]
src/ChGC.c [new file with mode: 0644]
src/ChKeyCon.c [new file with mode: 0644]
src/ChPntCon.c [new file with mode: 0644]
src/ChProp.c [new file with mode: 0644]
src/ChSaveSet.c [new file with mode: 0644]
src/ChWAttrs.c [new file with mode: 0644]
src/ChWindow.c [new file with mode: 0644]
src/ChkIfEv.c [new file with mode: 0644]
src/ChkMaskEv.c [new file with mode: 0644]
src/ChkTypEv.c [new file with mode: 0644]
src/ChkTypWEv.c [new file with mode: 0644]
src/ChkWinEv.c [new file with mode: 0644]
src/CirWin.c [new file with mode: 0644]
src/CirWinDn.c [new file with mode: 0644]
src/CirWinUp.c [new file with mode: 0644]
src/ClDisplay.c [new file with mode: 0644]
src/Clear.c [new file with mode: 0644]
src/ClearArea.c [new file with mode: 0644]
src/Cmap.h [new file with mode: 0644]
src/ConfWind.c [new file with mode: 0644]
src/Context.c [new file with mode: 0644]
src/ConvSel.c [new file with mode: 0644]
src/CopyArea.c [new file with mode: 0644]
src/CopyCmap.c [new file with mode: 0644]
src/CopyGC.c [new file with mode: 0644]
src/CopyPlane.c [new file with mode: 0644]
src/Cr.h [new file with mode: 0644]
src/CrBFData.c [new file with mode: 0644]
src/CrCmap.c [new file with mode: 0644]
src/CrCursor.c [new file with mode: 0644]
src/CrGC.c [new file with mode: 0644]
src/CrGlCur.c [new file with mode: 0644]
src/CrPFBData.c [new file with mode: 0644]
src/CrPixmap.c [new file with mode: 0644]
src/CrWindow.c [new file with mode: 0644]
src/Cursor.c [new file with mode: 0644]
src/DefCursor.c [new file with mode: 0644]
src/DelProp.c [new file with mode: 0644]
src/Depths.c [new file with mode: 0644]
src/DestSubs.c [new file with mode: 0644]
src/DestWind.c [new file with mode: 0644]
src/DisName.c [new file with mode: 0644]
src/DrArc.c [new file with mode: 0644]
src/DrArcs.c [new file with mode: 0644]
src/DrLine.c [new file with mode: 0644]
src/DrLines.c [new file with mode: 0644]
src/DrPoint.c [new file with mode: 0644]
src/DrPoints.c [new file with mode: 0644]
src/DrRect.c [new file with mode: 0644]
src/DrRects.c [new file with mode: 0644]
src/DrSegs.c [new file with mode: 0644]
src/ErrDes.c [new file with mode: 0644]
src/ErrHndlr.c [new file with mode: 0644]
src/EvToWire.c [new file with mode: 0644]
src/FSSaver.c [new file with mode: 0644]
src/FSWrap.c [new file with mode: 0644]
src/FetchName.c [new file with mode: 0644]
src/FillArc.c [new file with mode: 0644]
src/FillArcs.c [new file with mode: 0644]
src/FillPoly.c [new file with mode: 0644]
src/FillRct.c [new file with mode: 0644]
src/FillRcts.c [new file with mode: 0644]
src/FilterEv.c [new file with mode: 0644]
src/Flush.c [new file with mode: 0644]
src/Font.c [new file with mode: 0644]
src/FontInfo.c [new file with mode: 0644]
src/FontNames.c [new file with mode: 0644]
src/FreeCmap.c [new file with mode: 0644]
src/FreeCols.c [new file with mode: 0644]
src/FreeCurs.c [new file with mode: 0644]
src/FreeEData.c [new file with mode: 0644]
src/FreeEventData.c [new file with mode: 0644]
src/FreeGC.c [new file with mode: 0644]
src/FreePix.c [new file with mode: 0644]
src/GCMisc.c [new file with mode: 0644]
src/Geom.c [new file with mode: 0644]
src/GetAtomNm.c [new file with mode: 0644]
src/GetColor.c [new file with mode: 0644]
src/GetDflt.c [new file with mode: 0644]
src/GetEventData.c [new file with mode: 0644]
src/GetFPath.c [new file with mode: 0644]
src/GetFProp.c [new file with mode: 0644]
src/GetGCVals.c [new file with mode: 0644]
src/GetGeom.c [new file with mode: 0644]
src/GetHColor.c [new file with mode: 0644]
src/GetHints.c [new file with mode: 0644]
src/GetIFocus.c [new file with mode: 0644]
src/GetImage.c [new file with mode: 0644]
src/GetKCnt.c [new file with mode: 0644]
src/GetMoEv.c [new file with mode: 0644]
src/GetNrmHint.c [new file with mode: 0644]
src/GetPCnt.c [new file with mode: 0644]
src/GetPntMap.c [new file with mode: 0644]
src/GetProp.c [new file with mode: 0644]
src/GetRGBCMap.c [new file with mode: 0644]
src/GetSOwner.c [new file with mode: 0644]
src/GetSSaver.c [new file with mode: 0644]
src/GetStCmap.c [new file with mode: 0644]
src/GetTxtProp.c [new file with mode: 0644]
src/GetWAttrs.c [new file with mode: 0644]
src/GetWMCMapW.c [new file with mode: 0644]
src/GetWMProto.c [new file with mode: 0644]
src/GrButton.c [new file with mode: 0644]
src/GrKey.c [new file with mode: 0644]
src/GrKeybd.c [new file with mode: 0644]
src/GrPointer.c [new file with mode: 0644]
src/GrServer.c [new file with mode: 0644]
src/Host.c [new file with mode: 0644]
src/Iconify.c [new file with mode: 0644]
src/IfEvent.c [new file with mode: 0644]
src/ImText.c [new file with mode: 0644]
src/ImText16.c [new file with mode: 0644]
src/ImUtil.c [new file with mode: 0644]
src/InitExt.c [new file with mode: 0644]
src/InsCmap.c [new file with mode: 0644]
src/IntAtom.c [new file with mode: 0644]
src/Key.h [new file with mode: 0644]
src/KeyBind.c [new file with mode: 0644]
src/KeysymStr.c [new file with mode: 0644]
src/KillCl.c [new file with mode: 0644]
src/LiHosts.c [new file with mode: 0644]
src/LiICmaps.c [new file with mode: 0644]
src/LiProps.c [new file with mode: 0644]
src/ListExt.c [new file with mode: 0644]
src/LoadFont.c [new file with mode: 0644]
src/LockDis.c [new file with mode: 0644]
src/LookupCol.c [new file with mode: 0644]
src/LowerWin.c [new file with mode: 0644]
src/Macros.c [new file with mode: 0644]
src/Makefile.am [new file with mode: 0644]
src/MapRaised.c [new file with mode: 0644]
src/MapSubs.c [new file with mode: 0644]
src/MapWindow.c [new file with mode: 0644]
src/MaskEvent.c [new file with mode: 0644]
src/Misc.c [new file with mode: 0644]
src/ModMap.c [new file with mode: 0644]
src/MoveWin.c [new file with mode: 0644]
src/NextEvent.c [new file with mode: 0644]
src/OCWrap.c [new file with mode: 0644]
src/OMWrap.c [new file with mode: 0644]
src/OpenDis.c [new file with mode: 0644]
src/ParseCmd.c [new file with mode: 0644]
src/ParseCol.c [new file with mode: 0644]
src/ParseGeom.c [new file with mode: 0644]
src/PeekEvent.c [new file with mode: 0644]
src/PeekIfEv.c [new file with mode: 0644]
src/Pending.c [new file with mode: 0644]
src/PixFormats.c [new file with mode: 0644]
src/PmapBgnd.c [new file with mode: 0644]
src/PmapBord.c [new file with mode: 0644]
src/PolyReg.c [new file with mode: 0644]
src/PolyTxt.c [new file with mode: 0644]
src/PolyTxt16.c [new file with mode: 0644]
src/PropAlloc.c [new file with mode: 0644]
src/PutBEvent.c [new file with mode: 0644]
src/PutImage.c [new file with mode: 0644]
src/QuBest.c [new file with mode: 0644]
src/QuColor.c [new file with mode: 0644]
src/QuColors.c [new file with mode: 0644]
src/QuCurShp.c [new file with mode: 0644]
src/QuExt.c [new file with mode: 0644]
src/QuKeybd.c [new file with mode: 0644]
src/QuPntr.c [new file with mode: 0644]
src/QuStipShp.c [new file with mode: 0644]
src/QuTextE16.c [new file with mode: 0644]
src/QuTextExt.c [new file with mode: 0644]
src/QuTileShp.c [new file with mode: 0644]
src/QuTree.c [new file with mode: 0644]
src/Quarks.c [new file with mode: 0644]
src/RaiseWin.c [new file with mode: 0644]
src/RdBitF.c [new file with mode: 0644]
src/RecolorC.c [new file with mode: 0644]
src/ReconfWM.c [new file with mode: 0644]
src/ReconfWin.c [new file with mode: 0644]
src/Region.c [new file with mode: 0644]
src/RegstFlt.c [new file with mode: 0644]
src/RepWindow.c [new file with mode: 0644]
src/RestackWs.c [new file with mode: 0644]
src/RotProp.c [new file with mode: 0644]
src/ScrResStr.c [new file with mode: 0644]
src/SelInput.c [new file with mode: 0644]
src/SendEvent.c [new file with mode: 0644]
src/SetBack.c [new file with mode: 0644]
src/SetCRects.c [new file with mode: 0644]
src/SetClMask.c [new file with mode: 0644]
src/SetClOrig.c [new file with mode: 0644]
src/SetDashes.c [new file with mode: 0644]
src/SetFPath.c [new file with mode: 0644]
src/SetFont.c [new file with mode: 0644]
src/SetFore.c [new file with mode: 0644]
src/SetFunc.c [new file with mode: 0644]
src/SetHints.c [new file with mode: 0644]
src/SetIFocus.c [new file with mode: 0644]
src/SetLStyle.c [new file with mode: 0644]
src/SetLocale.c [new file with mode: 0644]
src/SetNrmHint.c [new file with mode: 0644]
src/SetPMask.c [new file with mode: 0644]
src/SetPntMap.c [new file with mode: 0644]
src/SetRGBCMap.c [new file with mode: 0644]
src/SetSOwner.c [new file with mode: 0644]
src/SetSSaver.c [new file with mode: 0644]
src/SetStCmap.c [new file with mode: 0644]
src/SetState.c [new file with mode: 0644]
src/SetStip.c [new file with mode: 0644]
src/SetTSOrig.c [new file with mode: 0644]
src/SetTile.c [new file with mode: 0644]
src/SetTxtProp.c [new file with mode: 0644]
src/SetWMCMapW.c [new file with mode: 0644]
src/SetWMProto.c [new file with mode: 0644]
src/StBytes.c [new file with mode: 0644]
src/StColor.c [new file with mode: 0644]
src/StColors.c [new file with mode: 0644]
src/StNColor.c [new file with mode: 0644]
src/StName.c [new file with mode: 0644]
src/StrKeysym.c [new file with mode: 0644]
src/StrToText.c [new file with mode: 0644]
src/Sync.c [new file with mode: 0644]
src/Synchro.c [new file with mode: 0644]
src/Text.c [new file with mode: 0644]
src/Text16.c [new file with mode: 0644]
src/TextExt.c [new file with mode: 0644]
src/TextExt16.c [new file with mode: 0644]
src/TextToStr.c [new file with mode: 0644]
src/TrCoords.c [new file with mode: 0644]
src/UIThrStubs.c [new file with mode: 0644]
src/UndefCurs.c [new file with mode: 0644]
src/UngrabBut.c [new file with mode: 0644]
src/UngrabKbd.c [new file with mode: 0644]
src/UngrabKey.c [new file with mode: 0644]
src/UngrabPtr.c [new file with mode: 0644]
src/UngrabSvr.c [new file with mode: 0644]
src/UninsCmap.c [new file with mode: 0644]
src/UnldFont.c [new file with mode: 0644]
src/UnmapSubs.c [new file with mode: 0644]
src/UnmapWin.c [new file with mode: 0644]
src/VisUtil.c [new file with mode: 0644]
src/WMGeom.c [new file with mode: 0644]
src/WMProps.c [new file with mode: 0644]
src/WarpPtr.c [new file with mode: 0644]
src/WinEvent.c [new file with mode: 0644]
src/Window.c [new file with mode: 0644]
src/Withdraw.c [new file with mode: 0644]
src/WrBitF.c [new file with mode: 0644]
src/XErrorDB [new file with mode: 0644]
src/Xatomtype.h [new file with mode: 0644]
src/Xintatom.h [new file with mode: 0644]
src/Xintconn.h [new file with mode: 0644]
src/XlibAsync.c [new file with mode: 0644]
src/XlibInt.c [new file with mode: 0644]
src/XomGeneric.h [new file with mode: 0644]
src/Xprivate.h [new file with mode: 0644]
src/Xresinternal.h [new file with mode: 0644]
src/Xrm.c [new file with mode: 0644]
src/Xxcbint.h [new file with mode: 0644]
src/evtomask.c [new file with mode: 0644]
src/globals.c [new file with mode: 0644]
src/imConv.c [new file with mode: 0644]
src/locking.c [new file with mode: 0644]
src/locking.h [new file with mode: 0644]
src/os2Stubs.c [new file with mode: 0644]
src/poly.h [new file with mode: 0644]
src/udcInf.c [new file with mode: 0644]
src/util/Makefile.am [new file with mode: 0644]
src/util/makekeys.c [new file with mode: 0644]
src/util/mkks.sh [new file with mode: 0644]
src/utlist.h [new file with mode: 0644]
src/x11_xcb.c [new file with mode: 0644]
src/xcb_disp.c [new file with mode: 0644]
src/xcb_io.c [new file with mode: 0644]
src/xcms/AddDIC.c [new file with mode: 0644]
src/xcms/AddSF.c [new file with mode: 0644]
src/xcms/CCC.c [new file with mode: 0644]
src/xcms/Cv.h [new file with mode: 0644]
src/xcms/CvColW.c [new file with mode: 0644]
src/xcms/CvCols.c [new file with mode: 0644]
src/xcms/HVC.c [new file with mode: 0644]
src/xcms/HVCGcC.c [new file with mode: 0644]
src/xcms/HVCGcV.c [new file with mode: 0644]
src/xcms/HVCGcVC.c [new file with mode: 0644]
src/xcms/HVCMnV.c [new file with mode: 0644]
src/xcms/HVCMxC.c [new file with mode: 0644]
src/xcms/HVCMxV.c [new file with mode: 0644]
src/xcms/HVCMxVC.c [new file with mode: 0644]
src/xcms/HVCMxVs.c [new file with mode: 0644]
src/xcms/HVCWpAj.c [new file with mode: 0644]
src/xcms/IdOfPr.c [new file with mode: 0644]
src/xcms/LRGB.c [new file with mode: 0644]
src/xcms/Lab.c [new file with mode: 0644]
src/xcms/LabGcC.c [new file with mode: 0644]
src/xcms/LabGcL.c [new file with mode: 0644]
src/xcms/LabGcLC.c [new file with mode: 0644]
src/xcms/LabMnL.c [new file with mode: 0644]
src/xcms/LabMxC.c [new file with mode: 0644]
src/xcms/LabMxL.c [new file with mode: 0644]
src/xcms/LabMxLC.c [new file with mode: 0644]
src/xcms/LabWpAj.c [new file with mode: 0644]
src/xcms/Luv.c [new file with mode: 0644]
src/xcms/LuvGcC.c [new file with mode: 0644]
src/xcms/LuvGcL.c [new file with mode: 0644]
src/xcms/LuvGcLC.c [new file with mode: 0644]
src/xcms/LuvMnL.c [new file with mode: 0644]
src/xcms/LuvMxC.c [new file with mode: 0644]
src/xcms/LuvMxL.c [new file with mode: 0644]
src/xcms/LuvMxLC.c [new file with mode: 0644]
src/xcms/LuvWpAj.c [new file with mode: 0644]
src/xcms/Makefile.am [new file with mode: 0644]
src/xcms/OfCCC.c [new file with mode: 0644]
src/xcms/PrOfId.c [new file with mode: 0644]
src/xcms/QBlack.c [new file with mode: 0644]
src/xcms/QBlue.c [new file with mode: 0644]
src/xcms/QGreen.c [new file with mode: 0644]
src/xcms/QRed.c [new file with mode: 0644]
src/xcms/QWhite.c [new file with mode: 0644]
src/xcms/QuCol.c [new file with mode: 0644]
src/xcms/QuCols.c [new file with mode: 0644]
src/xcms/SetCCC.c [new file with mode: 0644]
src/xcms/SetGetCols.c [new file with mode: 0644]
src/xcms/StCol.c [new file with mode: 0644]
src/xcms/StCols.c [new file with mode: 0644]
src/xcms/UNDEFINED.c [new file with mode: 0644]
src/xcms/XRGB.c [new file with mode: 0644]
src/xcms/XYZ.c [new file with mode: 0644]
src/xcms/Xcms.txt [new file with mode: 0644]
src/xcms/Xcmsint.h [new file with mode: 0644]
src/xcms/cmsAllCol.c [new file with mode: 0644]
src/xcms/cmsAllNCol.c [new file with mode: 0644]
src/xcms/cmsCmap.c [new file with mode: 0644]
src/xcms/cmsColNm.c [new file with mode: 0644]
src/xcms/cmsGlobls.c [new file with mode: 0644]
src/xcms/cmsInt.c [new file with mode: 0644]
src/xcms/cmsLkCol.c [new file with mode: 0644]
src/xcms/cmsMath.c [new file with mode: 0644]
src/xcms/cmsProp.c [new file with mode: 0644]
src/xcms/cmsTrig.c [new file with mode: 0644]
src/xcms/uvY.c [new file with mode: 0644]
src/xcms/xyY.c [new file with mode: 0644]
src/xkb/Makefile.am [new file with mode: 0644]
src/xkb/XKB.c [new file with mode: 0644]
src/xkb/XKBAlloc.c [new file with mode: 0644]
src/xkb/XKBBell.c [new file with mode: 0644]
src/xkb/XKBBind.c [new file with mode: 0644]
src/xkb/XKBCompat.c [new file with mode: 0644]
src/xkb/XKBCtrls.c [new file with mode: 0644]
src/xkb/XKBCvt.c [new file with mode: 0644]
src/xkb/XKBExtDev.c [new file with mode: 0644]
src/xkb/XKBGAlloc.c [new file with mode: 0644]
src/xkb/XKBGeom.c [new file with mode: 0644]
src/xkb/XKBGetByName.c [new file with mode: 0644]
src/xkb/XKBGetMap.c [new file with mode: 0644]
src/xkb/XKBList.c [new file with mode: 0644]
src/xkb/XKBMAlloc.c [new file with mode: 0644]
src/xkb/XKBMisc.c [new file with mode: 0644]
src/xkb/XKBNames.c [new file with mode: 0644]
src/xkb/XKBRdBuf.c [new file with mode: 0644]
src/xkb/XKBSetGeom.c [new file with mode: 0644]
src/xkb/XKBSetMap.c [new file with mode: 0644]
src/xkb/XKBUse.c [new file with mode: 0644]
src/xkb/XKBleds.c [new file with mode: 0644]
src/xkb/XKBlibint.h [new file with mode: 0644]
src/xlibi18n/ICWrap.c [new file with mode: 0644]
src/xlibi18n/IMWrap.c [new file with mode: 0644]
src/xlibi18n/Makefile.am [new file with mode: 0644]
src/xlibi18n/XDefaultIMIF.c [new file with mode: 0644]
src/xlibi18n/XDefaultOMIF.c [new file with mode: 0644]
src/xlibi18n/Xaixlcint.h [new file with mode: 0644]
src/xlibi18n/XimImSw.h [new file with mode: 0644]
src/xlibi18n/XimProto.h [new file with mode: 0644]
src/xlibi18n/XimThai.h [new file with mode: 0644]
src/xlibi18n/XimTrInt.h [new file with mode: 0644]
src/xlibi18n/XimTrX.h [new file with mode: 0644]
src/xlibi18n/XimTrans.h [new file with mode: 0644]
src/xlibi18n/Ximint.h [new file with mode: 0644]
src/xlibi18n/XimintL.h [new file with mode: 0644]
src/xlibi18n/XimintP.h [new file with mode: 0644]
src/xlibi18n/XlcDL.c [new file with mode: 0644]
src/xlibi18n/XlcGeneric.h [new file with mode: 0644]
src/xlibi18n/XlcPubI.h [new file with mode: 0644]
src/xlibi18n/XlcPublic.h [new file with mode: 0644]
src/xlibi18n/XlcSL.c [new file with mode: 0644]
src/xlibi18n/Xlcint.h [new file with mode: 0644]
src/xlibi18n/imKStoUCS.c [new file with mode: 0644]
src/xlibi18n/lcCT.c [new file with mode: 0644]
src/xlibi18n/lcCharSet.c [new file with mode: 0644]
src/xlibi18n/lcConv.c [new file with mode: 0644]
src/xlibi18n/lcDB.c [new file with mode: 0644]
src/xlibi18n/lcDynamic.c [new file with mode: 0644]
src/xlibi18n/lcFile.c [new file with mode: 0644]
src/xlibi18n/lcGeneric.c [new file with mode: 0644]
src/xlibi18n/lcInit.c [new file with mode: 0644]
src/xlibi18n/lcPrTxt.c [new file with mode: 0644]
src/xlibi18n/lcPubWrap.c [new file with mode: 0644]
src/xlibi18n/lcPublic.c [new file with mode: 0644]
src/xlibi18n/lcRM.c [new file with mode: 0644]
src/xlibi18n/lcStd.c [new file with mode: 0644]
src/xlibi18n/lcTxtPr.c [new file with mode: 0644]
src/xlibi18n/lcUTF8.c [new file with mode: 0644]
src/xlibi18n/lcUniConv/8bit_tab_to_h.c [new file with mode: 0644]
src/xlibi18n/lcUniConv/COPYRIGHT [new file with mode: 0644]
src/xlibi18n/lcUniConv/README [new file with mode: 0644]
src/xlibi18n/lcUniConv/armscii_8.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/ascii.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/big5.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/big5_emacs.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/big5hkscs.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/cjk_tab_to_h.c [new file with mode: 0644]
src/xlibi18n/lcUniConv/cp1133.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/cp1251.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/cp1255.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/cp1256.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/gb2312.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/gbk.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/georgian_academy.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/georgian_ps.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/iso8859_1.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/iso8859_10.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/iso8859_11.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/iso8859_13.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/iso8859_14.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/iso8859_15.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/iso8859_16.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/iso8859_2.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/iso8859_3.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/iso8859_4.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/iso8859_5.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/iso8859_6.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/iso8859_7.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/iso8859_8.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/iso8859_9.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/iso8859_9e.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/jisx0201.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/jisx0208.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/jisx0212.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/koi8_c.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/koi8_r.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/koi8_u.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/ksc5601.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/mulelao.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/tatar_cyr.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/tcvn.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/tis620.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/ucs2be.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/utf8.h [new file with mode: 0644]
src/xlibi18n/lcUniConv/viscii.h [new file with mode: 0644]
src/xlibi18n/lcUtil.c [new file with mode: 0644]
src/xlibi18n/lcWrap.c [new file with mode: 0644]
src/xlibi18n/mbWMProps.c [new file with mode: 0644]
src/xlibi18n/mbWrap.c [new file with mode: 0644]
src/xlibi18n/utf8WMProps.c [new file with mode: 0644]
src/xlibi18n/utf8Wrap.c [new file with mode: 0644]
src/xlibi18n/wcWrap.c [new file with mode: 0644]
src/xlibi18n/xim_trans.c [new file with mode: 0644]
x11-xcb.pc.in [new file with mode: 0644]
x11.pc.in [new file with mode: 0644]

diff --git a/AUTHORS b/AUTHORS
new file mode 100644 (file)
index 0000000..58a3acc
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,29 @@
+Once upon a midnight hour, long ago, in a galaxy, far, far, away, Xlib
+was originally developed by Jim Gettys, of Digital Equipment
+Corporation (now part of HP).
+
+Warren Turkal did the autotooling in October, 2003.
+
+Josh Triplett, Jamey Sharp, and the XCB team (xcb@lists.freedesktop.org)
+maintain the XCB support.
+
+Individual developers include (in no particular order): Sebastien
+Marineau, Holger Veit, Bruno Haible, Keith Packard, Bob Scheifler,
+Takashi Fujiwara, Kazunori Nishihara, Hideki Hiura, Hiroyuki Miyamoto,
+Katsuhisi Yano, Shigeru Yamada, Stephen Gildea, Li Yuhong, Seiji Kuwari.
+
+The specifications and documentation contain extensive credits.
+Conversion of those documents from troff to DocBook/XML was performed
+by Matt Dew, with assistance in editing & formatting tool setup from
+Gaetan Nadon and Alan Coopersmith.
+
+This work was supported by many organizations (in no particular
+order), including the X Consortium, Digital Equipment Corporation,
+Tektronix, The Open Group, OMRON, Wyse Technology, Fujitsu Limited,
+Sun Microsystems, Fuji Xerox, Sony Corporation, Toshiba Corporation,
+Massachusetts Institute of Technology, Silicon Graphics, the XFree86
+Project, among others.  Patches/fixes came from all over.
+
+No doubt we've missed credits.  Please let us know who should be credited.
+
+
diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..b065516
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,942 @@
+The following is the 'standard copyright' agreed upon by most contributors,
+and is currently the canonical license preferred by the X.Org Foundation.
+This is a slight variant of the common MIT license form published by the
+Open Source Initiative at http://www.opensource.org/licenses/mit-license.php
+
+Copyright holders of new code should use this license statement where
+possible, and insert their name to this list.  Please sort by surname
+for people, and by the full name for other entities (e.g.  Juliusz
+Chroboczek sorts before Intel Corporation sorts before Daniel Stone).
+
+See each individual source file or directory for the license that applies
+to that file.
+
+Copyright (C) 2003-2006,2008 Jamey Sharp, Josh Triplett
+Copyright © 2009 Red Hat, Inc.
+Copyright 1990-1992,1999,2000,2004,2009,2010 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.
+
+ ----------------------------------------------------------------------
+
+The following licenses are 'legacy' - usually MIT/X11 licenses with the name
+of the copyright holder(s) in the license statement:
+
+Copyright 1984-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.
+
+X Window System is a trademark of The Open Group.
+
+               ----------------------------------------
+
+Copyright 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+Copyright 2000 The XFree86 Project, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the X Consortium shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from the X Consortium.
+
+Copyright 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+Digital Equipment Corporation
+
+Portions Copyright 1990, 1991 by Tektronix, Inc.
+
+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 all copies, and that the names of
+Digital and Tektronix not be used in in advertising or publicity pertaining
+to this documentation without specific, written prior permission.
+Digital and Tektronix makes no representations about the suitability
+of this documentation for any purpose.
+It is provided ``as is'' without express or implied warranty.
+
+               ----------------------------------------
+
+Copyright (c) 1999-2000  Free Software Foundation, Inc.
+
+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
+FREE SOFTWARE FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION 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 Free Software Foundation
+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
+Free Software Foundation.
+
+               ----------------------------------------
+
+Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+       All Rights Reserved
+
+This file is a component of an X Window System-specific implementation
+of Xcms based on the TekColor Color Management System.  TekColor is a
+trademark of Tektronix, Inc.  The term "TekHVC" designates a particular
+color space that is the subject of U.S. Patent No. 4,985,853 (equivalent
+foreign patents pending).  Permission is hereby granted to use, copy,
+modify, sell, and otherwise distribute this software and its
+documentation for any purpose and without fee, provided that:
+
+1. This copyright, permission, and disclaimer notice is reproduced in
+   all copies of this software and any modification thereof and in
+   supporting documentation;
+2. Any color-handling application which displays TekHVC color
+   cooordinates identifies these as TekHVC color coordinates in any
+   interface that displays these coordinates and in any associated
+   documentation;
+3. The term "TekHVC" is always used, and is only used, in association
+   with the mathematical derivations of the TekHVC Color Space,
+   including those provided in this file and any equivalent pathways and
+   mathematical derivations, regardless of digital (e.g., floating point
+   or integer) representation.
+
+Tektronix makes no representation about the suitability of this software
+for any purpose.  It is provided "as is" and with all faults.
+
+TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+
+               ----------------------------------------
+
+(c) Copyright 1995 FUJITSU LIMITED
+This is source code modified by FUJITSU LIMITED under the Joint
+Development Agreement for the CDE/Motif PST.
+
+               ----------------------------------------
+
+Copyright 1992 by Oki Technosystems Laboratory, Inc.
+Copyright 1992 by Fuji Xerox Co., Ltd.
+
+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 Oki Technosystems
+Laboratory and Fuji Xerox not be used in advertising or publicity
+pertaining to distribution of the software without specific, written
+prior permission.
+Oki Technosystems Laboratory and Fuji Xerox make no representations
+about the suitability of this software for any purpose.  It is provided
+"as is" without express or implied warranty.
+
+OKI TECHNOSYSTEMS LABORATORY AND FUJI XEROX DISCLAIM ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL OKI TECHNOSYSTEMS
+LABORATORY AND FUJI XEROX 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 1990, 1991, 1992, 1993, 1994 by FUJITSU LIMITED
+
+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 FUJITSU LIMITED
+not be used in advertising or publicity pertaining to distribution
+of the software without specific, written prior permission.
+FUJITSU LIMITED makes no representations about the suitability of
+this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL FUJITSU LIMITED 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) 1995 David E. Wexelblat.  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 shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL DAVID E. WEXELBLAT BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION 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 David E. Wexelblat shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from David E. Wexelblat.
+
+               ----------------------------------------
+
+Copyright 1990, 1991 by OMRON Corporation
+
+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 OMRON not be used in
+advertising or publicity pertaining to distribution of the software without
+specific, written prior permission.  OMRON makes no representations
+about the suitability of this software for any purpose.  It is provided
+"as is" without express or implied warranty.
+
+OMRON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL OMRON 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
+TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+
+               ----------------------------------------
+
+Copyright 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+Digital Equipment Corporation
+
+Portions Copyright 1990, 1991 by Tektronix, Inc
+
+Rewritten for X.org by Chris Lee <clee@freedesktop.org>
+
+Permission to use, copy, modify, distribute, and sell this documentation
+for any purpose and without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+Chris Lee makes no representations about the suitability for any purpose
+of the information in this document.  It is provided \`\`as-is'' without
+express or implied warranty.
+
+               ----------------------------------------
+
+Copyright 1993 by Digital Equipment Corporation, Maynard, Massachusetts,
+Copyright 1994 by FUJITSU LIMITED
+Copyright 1994 by Sony Corporation
+
+                        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 names of Digital, FUJITSU
+LIMITED and Sony Corporation not be used in advertising or publicity
+pertaining to distribution of the software without specific, written
+prior permission.
+
+DIGITAL, FUJITSU LIMITED AND SONY CORPORATION DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL DIGITAL, FUJITSU LIMITED
+AND SONY CORPORATION 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 1991 by the Open Software Foundation
+
+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 Open Software Foundation
+not be used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.  Open Software
+Foundation makes no representations about the suitability of this
+software for any purpose.  It is provided "as is" without express or
+implied warranty.
+
+OPEN SOFTWARE FOUNDATION DISCLAIMS ALL WARRANTIES WITH REGARD TO
+THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS, IN NO EVENT SHALL OPEN SOFTWARE FOUNDATIONN 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 1990, 1991, 1992,1993, 1994 by FUJITSU LIMITED
+Copyright 1993, 1994                  by Sony Corporation
+
+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 FUJITSU LIMITED and Sony Corporation
+not be used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.  FUJITSU LIMITED and
+Sony Corporation makes no representations about the suitability of this
+software for any purpose.  It is provided "as is" without express or
+implied warranty.
+
+FUJITSU LIMITED AND SONY CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD
+TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS, IN NO EVENT SHALL FUJITSU LIMITED OR SONY CORPORATION 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, 1995 by Silicon Graphics Computer Systems, Inc.
+
+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 Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS 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 1991, 1992, 1993, 1994 by FUJITSU LIMITED
+Copyright 1993 by Digital Equipment Corporation
+
+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 FUJITSU LIMITED and
+Digital Equipment Corporation not be used in advertising or publicity
+pertaining to distribution of the software without specific, written
+prior permission.  FUJITSU LIMITED and Digital Equipment Corporation
+makes no representations about the suitability of this software for
+any purpose.  It is provided "as is" without express or implied
+warranty.
+
+FUJITSU LIMITED AND DIGITAL EQUIPMENT CORPORATION DISCLAIM ALL
+WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+FUJITSU LIMITED AND DIGITAL EQUIPMENT CORPORATION 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 1992, 1993 by FUJITSU LIMITED
+Copyright 1993 by Fujitsu Open Systems Solutions, Inc.
+Copyright 1994 by Sony Corporation
+
+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 FUJITSU LIMITED,
+Fujitsu Open Systems Solutions, Inc. and Sony Corporation  not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+FUJITSU LIMITED, Fujitsu Open Systems Solutions, Inc. and
+Sony Corporation make no representations about the suitability of
+this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+
+FUJITSU LIMITED, FUJITSU OPEN SYSTEMS SOLUTIONS, INC. AND SONY
+CORPORATION DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
+IN NO EVENT SHALL FUJITSU OPEN SYSTEMS SOLUTIONS, INC., FUJITSU LIMITED
+AND SONY CORPORATION 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, 1993 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 1993 by SunSoft, Inc.
+Copyright 1999-2000 by Bruno Haible
+
+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 names of SunSoft, Inc. and
+Bruno Haible not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.  SunSoft, Inc. and Bruno Haible make no representations
+about the suitability of this software for any purpose.  It is
+provided "as is" without express or implied warranty.
+
+SunSoft Inc. AND Bruno Haible DISCLAIM ALL WARRANTIES WITH REGARD
+TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS, IN NO EVENT SHALL SunSoft, Inc. OR Bruno Haible 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 1991 by the Open Software Foundation
+Copyright 1993 by the TOSHIBA Corp.
+
+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 names of Open Software Foundation and TOSHIBA
+not be used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.  Open Software
+Foundation and TOSHIBA make no representations about the suitability of this
+software for any purpose.  It is provided "as is" without express or
+implied warranty.
+
+OPEN SOFTWARE FOUNDATION AND TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO
+THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS, IN NO EVENT SHALL OPEN SOFTWARE FOUNDATIONN OR TOSHIBA 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 1988 by Wyse Technology, Inc., San Jose, Ca.,
+
+                        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 Wyse not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+WYSE 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 1991 by the Open Software Foundation
+Copyright 1993, 1994 by the Sony Corporation
+
+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 names of Open Software Foundation and
+Sony Corporation not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior permission.
+Open Software Foundation and Sony Corporation make no
+representations about the suitability of this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+OPEN SOFTWARE FOUNDATION AND SONY CORPORATION DISCLAIM ALL
+WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL OPEN
+SOFTWARE FOUNDATIONN OR SONY CORPORATION 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 1992, 1993 by FUJITSU LIMITED
+Copyright 1993 by Fujitsu Open Systems Solutions, Inc.
+
+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 FUJITSU LIMITED and
+Fujitsu Open Systems Solutions, Inc. not be used in advertising or
+publicity pertaining to distribution of the software without specific,
+written prior permission.
+FUJITSU LIMITED and Fujitsu Open Systems Solutions, Inc. makes no
+representations about the suitability of this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+FUJITSU LIMITED AND FUJITSU OPEN SYSTEMS SOLUTIONS, INC. DISCLAIMS ALL
+WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL FUJITSU OPEN SYSTEMS
+SOLUTIONS, INC. AND FUJITSU LIMITED 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 1993, 1994 by Sony Corporation
+
+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 Sony Corporation
+not be used in advertising or publicity pertaining to distribution
+of the software without specific, written prior permission.
+Sony Corporation makes no representations about the suitability of
+this software for any purpose. It is provided "as is" without
+express or implied warranty.
+
+SONY CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL SONY CORPORATION 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 1986, 1998  The Open Group
+Copyright (c) 2000  The XFree86 Project, Inc.
+
+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
+X CONSORTIUM OR THE XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION 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 or of the
+XFree86 Project 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 and the XFree86 Project.
+
+               ----------------------------------------
+
+Copyright 1990, 1991 by OMRON Corporation, NTT Software Corporation,
+                     and Nippon Telegraph and Telephone Corporation
+Copyright 1991 by the Open Software Foundation
+Copyright 1993 by the FUJITSU LIMITED
+
+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 names of OMRON, NTT Software, NTT, and
+Open Software Foundation not be used in advertising or publicity
+pertaining to distribution of the software without specific,
+written prior permission. OMRON, NTT Software, NTT, and Open Software
+Foundation make no representations about the suitability of this
+software for any purpose.  It is provided "as is" without express or
+implied warranty.
+
+OMRON, NTT SOFTWARE, NTT, AND OPEN SOFTWARE FOUNDATION
+DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT
+SHALL OMRON, NTT SOFTWARE, NTT, OR OPEN SOFTWARE FOUNDATION 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 1988 by Wyse Technology, Inc., San Jose, Ca,
+Copyright 1987 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 AND WYSE DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL DIGITAL OR WYSE 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 1991, 1992 by Fuji Xerox Co., Ltd.
+Copyright 1992, 1993, 1994 by FUJITSU LIMITED
+
+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 Fuji Xerox,
+FUJITSU LIMITED not be used in advertising or publicity pertaining
+to distribution of the software without specific, written prior
+permission. Fuji Xerox, FUJITSU LIMITED make no representations
+about the suitability of this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+FUJI XEROX, FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL FUJI XEROX,
+FUJITSU LIMITED 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 2006 Josh Triplett
+
+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.
+
+               ----------------------------------------
+
+(c) Copyright 1996 by Sebastien Marineau and Holger Veit
+                       <marineau@genie.uottawa.ca>
+                     <Holger.Veit@gmd.de>
+
+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
+HOLGER VEIT  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION 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 Sebastien Marineau or Holger Veit
+shall not be used in advertising or otherwise to promote the sale, use or other
+dealings in this Software without prior written authorization from Holger Veit or
+Sebastien Marineau.
+
+               ----------------------------------------
+
+Copyright 1990, 1991 by OMRON Corporation, NTT Software Corporation,
+                     and Nippon Telegraph and Telephone Corporation
+Copyright 1991 by the Open Software Foundation
+Copyright 1993 by the TOSHIBA Corp.
+Copyright 1993, 1994 by Sony Corporation
+Copyright 1993, 1994 by the FUJITSU LIMITED
+
+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 names of OMRON, NTT Software, NTT, Open
+Software Foundation, and Sony Corporation not be used in advertising
+or publicity pertaining to distribution of the software without specific,
+written prior permission. OMRON, NTT Software, NTT, Open Software
+Foundation, and Sony Corporation  make no representations about the
+suitability of this software for any purpose.  It is provided "as is"
+without express or implied warranty.
+
+OMRON, NTT SOFTWARE, NTT, OPEN SOFTWARE FOUNDATION, AND SONY
+CORPORATION DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT
+SHALL OMRON, NTT SOFTWARE, NTT, OPEN SOFTWARE FOUNDATION, OR SONY
+CORPORATION 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 2000 by Bruno Haible
+
+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 Bruno Haible not
+be used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.  Bruno Haible
+makes no representations about the suitability of this software for
+any purpose.  It is provided "as is" without express or implied
+warranty.
+
+Bruno Haible DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
+NO EVENT SHALL Bruno Haible 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 © 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) 2007-2009, Troy D. Hanson
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+               ----------------------------------------
+
+Copyright 1992, 1993 by TOSHIBA Corp.
+
+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 TOSHIBA not be used in advertising
+or publicity pertaining to distribution of the software without specific,
+written prior permission. TOSHIBA make no representations about the
+suitability of this software for any purpose.  It is provided "as is"
+without express or implied warranty.
+
+TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+TOSHIBA 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 IBM Corporation 1993
+
+All Rights Reserved
+
+License 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 IBM not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS, AND
+NONINFRINGEMENT OF THIRD PARTY RIGHTS, IN NO EVENT SHALL
+IBM 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 1990, 1991 by OMRON Corporation, NTT Software Corporation,
+                     and Nippon Telegraph and Telephone Corporation
+
+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 names of OMRON, NTT Software, and NTT
+not be used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission. OMRON, NTT Software,
+and NTT make no representations about the suitability of this
+software for any purpose.  It is provided "as is" without express or
+implied warranty.
+
+OMRON, NTT SOFTWARE, AND NTT, DISCLAIM ALL WARRANTIES WITH REGARD
+TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS, IN NO EVENT SHALL OMRON, NTT SOFTWARE, OR NTT, 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.
+
diff --git a/ChangeLog b/ChangeLog
new file mode 100644 (file)
index 0000000..4e2cda9
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,9885 @@
+commit 6c5cb2a90a6479f56855e5167039c37c234cdfe7
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Fri Jun 1 23:37:09 2012 -0700
+
+    libX11 1.5.0
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 05c587ec3be880721131a17c1dd4366e458fdd8b
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Sat May 26 14:37:28 2012 -0700
+
+    libX11 1.4.99.902 (1.5 RC2)
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit d817834d9772e3500d5102e2eae868b04a33c31f
+Author: Pander <pander@users.sourceforge.net>
+Date:   Sat May 5 19:02:10 2012 +0200
+
+    Compose: Reassigned squences with minus and a or o
+    
+    Reassigned squences with minus and a or o (vice versa and lower and
+    upper case) to conform existing series and not resulting in tilde.
+    Also added noe missing underscore sequence.
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 6bfd1dca6e7cb2046ee6bf9dbbddc0af5ef7cc00
+Author: Pander <pander@users.sourceforge.net>
+Date:   Sat May 5 16:56:05 2012 +0200
+
+    Compose: Removed <slash> <U> and vice versa
+    
+    Combination with lower case u suffices
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 3a8b1637132d1e36eb5e11f52dfb284081772d14
+Author: Pander <pander@users.sourceforge.net>
+Date:   Sat May 5 16:44:31 2012 +0200
+
+    Compose: Removed <n> <minus> for n with tilde, also vice versa & for upper case
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit fd514d7a35119dd4413b51c84f2a536f2ca501a6
+Author: Pander <pander@users.sourceforge.net>
+Date:   Sat May 5 16:40:20 2012 +0200
+
+    Compose: Removed <S> in combination with a numeral for superscript
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 1b5cad3ca54410c4edbca79c23c463e9e088bc0d
+Author: Pander <pander@users.sourceforge.net>
+Date:   Sat May 5 16:28:01 2012 +0200
+
+    Compose: Reassigned <o> <apostrophe> to oacute, also for upper case.
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 0bbc0d5e605e2a4a3eb00a229b651d4546e8aef4
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Thu May 10 12:27:28 2012 -0400
+
+    Remove duplicate compose sequences from commit e51e37c118ae.
+    
+    The compose-check script only handles compiled Compose files, not
+    the Compose.pre files.  One must remember to use:
+    
+        ./autogen.sh; make; make check
+    
+    when reviewing patches to the Compose.pre files....
+    
+    Signed-off-by: James Cloos <cloos@jhcloos.com>
+
+commit e51e37c118ae6cb9ced8244ce1c410677e0279ce
+Author: Geoff Streeter <geoff@dyalog.com>
+Date:   Thu Mar 22 15:02:00 2012 +0000
+
+    Add APL support to compose
+    
+    Signed-off-by: Geoff Streeter <geoff@dyalog.com>
+    Signed-off-by: James Cloos <cloos@jhcloos.com>
+
+commit dac90324cee224df977a428afe80d960dceca769
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Sat May 5 16:05:07 2012 +0200
+
+    configure: make previous change work with older autoconf
+    
+    autoconf 2.63 doesn't seem to like the nested AC_CHECK_DECL/FUNC.  So do
+    the tests separately.
+    
+    Reported-by: Dave Airlie
+    Signed-off-by: Julien Cristau <jcristau@debian.org>
+
+commit f5b50af4324186962e258ffe9be78d5ee4681982
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Sun Apr 29 16:43:09 2012 +0200
+
+    configure: check if issetugid is declared
+    
+    GNU/kFreeBSD has issetugid in libc (for legacy apps?), but doesn't
+    declare it anywhere, causing gcc to error out with
+    -Werror=implicit-function-declaration.  Use AC_CHECK_DECL in addition to
+    AC_CHECK_FUNC so we disable this code instead of failing to build it.
+    
+    Debian bug#669670 <http://bugs.debian.org/669670>
+    
+    Signed-off-by: Julien Cristau <jcristau@debian.org>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 52e1b5cc3b6de76ccf4285b55652474a522ed9a8
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Mon Apr 30 16:36:47 2012 +1000
+
+    Typo fix
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit b64969f0e510d5d3300cf968741a3726a6409577
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Tue Apr 17 18:12:02 2012 -0700
+
+    Add X11R7 sections to the libX11 & XKBlib credits to cover Docbook conversion
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 9ea611696f317ac3b3fb67893f1d6d87d49e3b5e
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Tue Apr 17 18:01:36 2012 -0700
+
+    Add olinks from libX11 & localedb specs to ICCCM spec
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit b3c1b8cdab7d14220426c9b997ac362dc16318fc
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Tue Apr 17 17:49:44 2012 -0700
+
+    Add olinks from libX11 spec to ICCCM spec
+    
+    Also convert ICCCM title mentions from <emphasis> to <citetitle>
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit ebebb65e753007ad01966dccc90bd6ca9a826488
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Sat Apr 14 23:40:01 2012 -0700
+
+    libX11 AppC: Fix section headers that didn't translate from nroff properly
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Acked-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit d5ab4ae0e74ae1fb30fb72add0751effe2759bf2
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Sat Apr 14 23:13:05 2012 -0700
+
+    Add olinks from libX11 spec to x11protocol spec
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Acked-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 83878a0e34fffd255597300dd3e6cd43fcd645b0
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Sat Apr 14 22:28:53 2012 -0700
+
+    libX11 spec: Remove .br nroff macro left behind in XGetWindowProperty prototype
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit abc523fce31fcf2687229697a8eb656e343ecb0c
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Thu Mar 15 22:14:45 2012 -0700
+
+    libX11 1.4.99.901 (1.5 RC1)
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit b2cc5905a4a6d519957223e8ba2caef71520040c
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Thu Mar 15 22:03:21 2012 -0700
+
+    Remove "register" qualifier that annoys Solaris Studio compiler
+    
+    Fixes warning:
+    "Xrm.c", line 1094: warning: storage class after type is obsolescent
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 62d42953893f93a98db0504eaf06d650ceaf5811
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Wed Mar 14 17:25:46 2012 -0400
+
+    Fix the gtk+ additions
+    
+    (Some of) the Dstroke and dstroke entries already were present as U011[01],
+    even though XK_Dstroke and XK_dstroke are part of the latin2 set in keysymdef.h.
+    
+    The addition of <Multi_key> <o> <apostrophe> as a postfix version of
+    <Multi_key> <apostrophe> <o> blocks the existing entries for ǻ and Ǻ.
+    That prevents its and <Multi_key> <O> <apostrophe>’s addition.
+    
+    Signed-off-by: James Cloos <cloos@jhcloos.com>
+
+commit 91bcce48d94792f78333d2aea73961cc2e739d2e
+Author: Pander <pander@users.sourceforge.net>
+Date:   Wed Mar 14 12:54:53 2012 -0400
+
+    Complete compose key sequences for musical symbols
+    
+    Signed-off-by: Pander <pander@users.sourceforge.net>
+    Signed-off-by: James Cloos <cloos@jhcloos.com>
+
+commit cf040016d455bc37f7665d6714337c5eafd8ea94
+Author: Pander <pander@users.sourceforge.net>
+Date:   Wed Mar 14 12:46:25 2012 -0400
+
+    Add compose sequences from gtk+ to X.Org
+    
+    Signed-off-by: Pander <pander@users.sourceforge.net>
+    Signed-off-by: James Cloos <cloos@jhcloos.com>
+
+commit a4c591ced5cac9301b9abfa0e521be2d0b267882
+Author: Keith Packard <keithp@keithp.com>
+Date:   Sun Mar 4 02:00:13 2012 -0800
+
+    Block for other threads in _XUserLockDisplay
+    
+    Wait for all other threads to release the user-level lock when
+    acquiring it. This ensures that only one thread at a time holds the
+    user-level lock, necessary as it is a nesting lock and a single
+    variable is used to determine when the lock is nesting and when it is
+    contended.
+    
+    Signed-off-by: Keith Packard <keithp@keithp.com>
+    Reviewed-by: Jamey Sharp <jamey@minilop.net>
+
+commit ed00b460acb08787b695f27b864e96102dfd4867
+Author: Jon TURNEY <jon.turney@dronecode.org.uk>
+Date:   Fri Oct 28 11:09:20 2011 -0500
+
+    Don't use caddr_t casts
+    
+    (caddr_t) isn't used anywhere else in xcb or libX11.
+    Cast to (char *) for consistency.
+    
+    Removing this cast allows building for MinGW without patching.
+    
+    v2: Cast to (char *) rather than just dropping the cast
+    
+    Signed-off-by: Jon TURNEY <jon.turney@dronecode.org.uk>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 20adca02c2a1d0b7c95ecbe387d68f881fd57754
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Sun Feb 19 13:27:38 2012 +0100
+
+    Revert "xcb: Add TCP fallback"
+    
+    This reverts commit f09c5299a381e2729e800a0ac43f1c0e371f65f6.
+    
+    The TCP fallback ended up falling back to UNIX socket connection if
+    $DISPLAY was set to e.g. some.host:0 and the initial attempt failed.
+    
+    Debian bug#659558 <http://bugs.debian.org/659558>
+    
+    Signed-off-by: Julien Cristau <jcristau@debian.org>
+    
+    Conflicts:
+    
+       src/OpenDis.c
+
+commit f4378193619baa9bb973c1b5b718721bbcbe92c7
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Wed Feb 22 14:13:20 2012 -0500
+
+    Make the compose sequence for ẞ work.
+    
+    There is no XK_Ssharp symbol for U+1E9E LATIN CAPITAL LETTER SHARP S,
+    so use the U1e9e symbol in the Compose sequence.
+    
+    (Compose sequences do not work when the target symbol is unknown.)
+    
+    Signed-off-by: James Cloos <cloos@jhcloos.com>
+
+commit 2ca641c3a506dcbee97e279b67990d5387389f36
+Author: Marko Myllynen <myllynen@redhat.com>
+Date:   Mon Feb 20 17:04:59 2012 +0200
+
+    Use ezh/EZH in compose maps
+    
+    Related: https://bugs.freedesktop.org/show_bug.cgi?id=19687
+    
+    Signed-off-by: Marko Myllynen <myllynen@redhat.com>
+    Reviewed-by: Matt Dew <marcoz@osource.org>
+    Signed-off-by: James Cloos <cloos@jhcloos.com>
+
+commit 61725822f20f47684a545c1797183ee7075243ac
+Author: Marko Myllynen <myllynen@redhat.com>
+Date:   Sun Feb 20 17:09:43 2011 +0200
+
+    Provide translation from XK_permille (ad5) to Unicode (U2030)
+    
+    https://bugs.freedesktop.org/show_bug.cgi?id=19687
+    
+    Signed-off-by: Marko Myllynen <myllynen@redhat.com>
+    Reviewed-by: Matt Dew <marcoz@osource.org>
+    Signed-off-by: James Cloos <cloos@jhcloos.com>
+
+commit d2cce0abba0fa0143f49026442c8cab5ed721625
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Sun Feb 12 19:01:43 2012 -0800
+
+    nls: Use LC_CTYPE=C for sed magic
+    
+    Stricter versions of sed can trip up if the input does not match
+    LC_CTYPE
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit f180e043f55531933bedfa6e0ff36a00a9ec07f3
+Author: Frédéric Boiteux <fboiteux@calistel.com>
+Date:   Wed Nov 30 12:47:31 2011 +0000
+
+    Compositions with the dead greek symbol
+    
+    FreeDesktop Bug 21475 <https://bugs.freedesktop.org/show_bug.cgi?id=21475>
+    
+    Signed-off-by: Frédéric Boiteux <fboiteux@calistel.com>
+    Signed-off-by: James Cloos <cloos@jhcloos.com>
+
+commit d58e8f8e27790017fcfdeca0843b7318d541c189
+Author: Ryan Pavlik <rpavlik@iastate.edu>
+Date:   Sun Jan 1 21:04:52 2012 +0000
+
+    Use pthreads on MinGW also
+    
+    Use pthreads (provided by the pthreads-win32 compatability library which implements
+    them using native Win32 threading) on MinGW
+    
+    Reviewed-by: Jon TURNEY <jon.turney@dronecode.org.uk>
+
+commit bf15ccb6821664746ec23d769d757edf8059007e
+Author: Ryan Pavlik <rpavlik@iastate.edu>
+Date:   Mon Jan 23 14:18:02 2012 +0000
+
+    Add XWindows.h include to Xxcbint.h
+    
+    This avoids some conflicting type re-definition errors which occur if
+    we attempt to include Windows headers after Xmd.h
+    
+    Reviewed-by: Jon TURNEY <jon.turney@dronecode.org.uk>
+
+commit cadcbd376f0a5d17a71a2fe2f8ced5d93232921a
+Author: Matt Dew <marcoz@osource.org>
+Date:   Sat Jan 21 17:59:51 2012 -0700
+
+    informaltable & table 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 bb551f654df8f647c867f79252241964521e689e
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Wed Dec 28 21:22:41 2011 -0800
+
+    Add more Xkb man pages to the See Also lists for core keyboard functions
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit b7bb23fe7c8b8a17128e5bc98a05f68595190438
+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 70505468b7c4a7068cc39be42e421dcee34ec595
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Tue Dec 13 19:58:30 2011 -0800
+
+    makekeys: move buf declaration from global to main to silence gcc -Wshadow
+    
+    The global was only referenced in the main() function, which passes it
+    as an argument of the same name to the parse_line() function, leading
+    to gcc -Wshadow warnings:
+    
+    makekeys.c: In function ‘parse_line’:
+    makekeys.c:58:24: warning: declaration of ‘buf’ shadows a global declaration
+    makekeys.c:54:13: warning: shadowed declaration is here
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 87e10a7b9a97c951ab4d477f61177779ac0a6a66
+Author: Kusanagi Kouichi <slash@ac.auone-net.jp>
+Date:   Wed Dec 14 02:17:55 2011 -0500
+
+    XQueryColors: Split a request into multiple requests if necessary
+    
+    https://bugs.freedesktop.org/show_bug.cgi?id=9160
+    
+    Signed-off-by: Kusanagi Kouichi <slash@ac.auone-net.jp>
+    Signed-off-by: James Cloos <cloos@jhcloos.com>
+
+commit d3b3570592e9b9e57f270a0bd86762fd205a2833
+Author: Andreas Wettstein <wettstein509@solnet.ch>
+Date:   Tue Nov 8 20:18:09 2011 +0000
+
+    XIM: Allow modifier releases in compose sequences (#26705)
+    
+    Currently, only non-modifier keys (actually, keysyms) can be part of a compose
+    sequence, and they are matched against the defined compose sequences at the
+    time the key is pressed.  The patch allows to use modifier keys an well, but
+    matches them on key release, and only if no other key has been pressed after
+    the modifier.
+    
+    Releasing a non-matched modifier during an ongoing compose sequence only aborts
+    the sequence if any modifier release would have matched.  In particular, if no
+    compose sequences with modifiers are specified, the compose mechanism works
+    exactly as without this patch.
+    
+    Even if modifiers are part of a compose sequence, they are not filtered.  This
+    is because modifiers affect the keyboard state no matter what we do here and,
+    therefore, filtering them only could confuse clients.
+    
+    The purpose is this extension to the compose mechanism is to allow to make
+    better use of keys in convenient reach for touch typing.
+    
+    Signed-off-by: Andreas Wettstein <wettstein509@solnet.ch>
+    Signed-off-by: James Cloos <cloos@jhcloos.com>
+
+commit 56448a626fc90bcf75a1fa2f4c294b0eb1f23bd6
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Tue Nov 29 23:56:57 2011 -0800
+
+    Reject negative string counts in copy_string_list
+    
+    Silences parfait warning of a potential memory leak:
+       Memory leak of pointer 'dst' allocated with malloc(length)
+            at line 160 of FSWrap.c in function 'copy_string_list'.
+              'dst' allocated at line 145 with malloc(length).
+              dst leaks when count <= 0 at line 154.
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit bf2d7c8c6d70539c72560b1921e18df2610acf29
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Fri Nov 11 14:56:36 2011 +1000
+
+    libX11 1.4.99.1
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 24283d40b1e4314c6647dda49d2a159833341a8b
+Author: Derek Buitenhuis <derek.buitenhuis@gmail.com>
+Date:   Thu Sep 22 18:44:13 2011 -0400
+
+    makekeys: Fix build/target word size mismatch when cross-compiling
+    
+    Since makekeys is built using build environment's gcc and
+    runs natively, we have to make sure that the size of the
+    Signature type is the same on both the native environment
+    and the target, otherwise we get mismatches upon running X,
+    and some LSB test failures (xts5).
+    
+    Use an unsigned 32-bit integer on all platforms. Also,
+    eliminate the redundant multiple typedefs for the
+    Signature type.
+    
+    Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+
+commit 1c41f3b9b86b5eeedfa3bff92e519d45aa097587
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Wed Nov 9 21:00:36 2011 -0800
+
+    XlcSL.c: convert old-style function definitions to ANSI C89 style
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit f6dad6aaa384bf836baa28ccb72b476a85c40eff
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Thu Oct 27 13:53:22 2011 +1000
+
+    Use GetReqSized for GetReq and GetReqExtra
+    
+    GetEmptyReq and GetResReq cannot do this due to the final typecast -
+    typically requests that need either of those do not have their own typedef
+    in the protocol headers.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Jamey Sharp <jamey@minilop.net>
+
+commit c9c99058b9d98789c0b2d7e78a23443c2b57a047
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Fri Oct 14 14:51:06 2011 +1000
+
+    include: Add GetReqSized() for request buffers of specific size
+    
+    Some XI2 requests change in size over different versions and libXi would
+    need to hack around GetReq and GetReqExtra. Add a new GetReqSized so the
+    library can explicitly specify the size of the request in 4-byte units.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Jamey Sharp <jamey@minilop.net>
+
+commit ba8a7a19165e30d14bc165f43f67c19b6a115585
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Thu Oct 27 13:24:10 2011 +1000
+
+    Switch GetEmptyReq and GetResReq to call _XGetRequest
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Jamey Sharp <jamey@minilop.net>
+
+commit 4a060f993bf676cf21ad9784e010f54134da7b40
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Mon Oct 17 09:45:15 2011 +1000
+
+    Add _XGetRequest as substitute for GetReq/GetReqExtra
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Jamey Sharp <jamey@minilop.net>
+
+commit d8956520deb79c1cbb5e974c175bf8493859b22b
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Fri Oct 14 17:53:00 2011 -0700
+
+    Fix "nomal" -> "normal" typo in several comments
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 002b36e308a26a152504f9b40aa08a0dce9a7991
+Author: Xue Wei <Wei.Xue@Sun.COM>
+Date:   Fri Oct 14 17:39:21 2011 -0700
+
+    mbtocs should not truncate input
+    
+    Fixes pasting more than 1024 bytes into xterm, as described in
+    https://bugs.freedesktop.org/show_bug.cgi?id=25209
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 9b8d8c9e5b27273e8856a3851ba9b68022bed3cd
+Author: Marko Myllynen <myllynen@redhat.com>
+Date:   Mon Oct 10 09:41:13 2011 +0300
+
+    Add new compose sequences
+    
+    This patch adds few new compose sequences to the en_US map, ligatures
+    common in typesetting and sequences already in use in the fi_FI map.
+    
+    https://bugs.freedesktop.org/show_bug.cgi?id=30621
+    https://bugs.freedesktop.org/show_bug.cgi?id=34523
+    
+    Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit 738f7b867341c1da87ee667d48815822715c3e75
+Author: Choe Hwanjin <choe.hwanjin@gmail.com>
+Date:   Thu Oct 13 07:58:02 2011 +0900
+
+    XIM: Make Xim handle NEED_SYNC_REPLY flag
+    
+    NEED_SYNC_REPLY flag should be in Xim not in Xic.
+    Because the focused Xic can be changed before sending sync reply.
+    After focused Xic changed, the new Xic doesn't have NEED_SYNC_REPLY
+    flag enabled, so libX11 doesn't send XIM_SYNC_REPLY packet.
+    
+    This patch adds sync reply flag to Xim and removes sync reply
+    from Xic.
+    
+    Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=7869
+    
+    Signed-off-by: Choe Hwanjin <choe.hwanjin@gmail.com>
+    Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit 50e15379331c436851abb194251cde96999e67b3
+Author: Bodo Graumann <mail@bodograumann.de>
+Date:   Mon Oct 10 16:40:52 2011 +0200
+
+    libX11: Fixing modifier key range in Xutil.h (Bug #21910)
+    
+    IsModifierKey, defined in include/X11/Xutil.h, is a macro determining,
+    which keys are regarded as modifiers. The constants ISO_Level5_Shift,
+    ISO_Level5_Latch and ISO_Level5_Lock where excluded previously, leaving
+    some Neo2 modifiers functionless in combination with compose.
+    This patch adjusts the range to include the correct, full range of
+    modifier constants.
+    
+    Neo2 Bug 277 <http://wiki.neo-layout.org/ticket/277>
+    
+    X.Org Bug 21910 <http://bugs.freedesktop.org/show_bug.cgi?id=21910>
+    
+    Signed-off-by: Bodo Graumann <mail@bodograumann.de>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+
+commit b5a108624331fabf393223c0891914cc54d4caf4
+Author: Yann Droneaud <yann@droneaud.fr>
+Date:   Tue Oct 11 17:27:59 2011 +0200
+
+    Return name instead of False in XSetICValues()
+    
+    In case of error, XSetICValues() must return the first argument
+    that failed to be set.
+    
+    But in some error paths, it returns False, which is converted to NULL,
+    so the function returns OK in case of error.
+    
+    Signed-off-by: Yann Droneaud <yann@droneaud.fr>
+    Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit 10992cb8dc5e4d938e7e5a633b68a81b5875f3ba
+Author: Yann Droneaud <yann@droneaud.fr>
+Date:   Sun Oct 9 17:56:45 2011 +0200
+
+    Return name instead of value in XGetIMValues() and XSetIMValues()
+    
+    As stated in man page (XOpenIM) and Xlib documentation (chapter 13.5.3),
+    XGetIMValues() and XSetImValues() "returns the name of the first argument
+    that could not be obtained."
+    
+    But currently,
+    
+      err = XGetIMValues(im, "invalid", &arg, NULL);
+    
+    returns &arg instead of "invalid".
+    
+    This patch fixes https://bugs.freedesktop.org/show_bug.cgi?id=12897
+    
+    Signed-off-by: Yann Droneaud <yann@droneaud.fr>
+    Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit f2651e03f3295a453a2965c3749bc8b6e66f1c09
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Mon Oct 10 14:09:17 2011 -0700
+
+    Mark XKeycodeToKeysym as _X_DEPRECATED
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit 25d7bb9c705623ebbb3afba3b86d0ded5b6bb4fb
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Sun Oct 9 02:38:28 2011 -0700
+
+    Fix nobreakspace for pt_BR.UTF-8
+    
+    https://bugs.freedesktop.org/show_bug.cgi?id=31334
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit 913603660c17ec59a4d39d3e3b9d60469ee5c060
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Sun Oct 9 02:26:45 2011 -0700
+
+    Fix potential uninitialized variable access in _XimMakeICAttrIDList
+    
+    Found by clang static analysis
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit 566ceaf5a92c721ac7155528e4d0d2e5cbef023f
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Sun Oct 9 02:25:50 2011 -0700
+
+    Remove self-resolving aliases
+    
+    https://bugs.freedesktop.org/show_bug.cgi?id=30112
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit 22ba43d198dcca86c88eb15a56fc7d8fc47c422e
+Author: Matt Dew <marcoz@osource.org>
+Date:   Fri Oct 7 22:52:30 2011 -0600
+
+    Cleanup IDs and links in doc
+    
+    1 - fix the capitalization of the ID attributes to match either the
+         <title> or <funcdef> string it goes with.
+    2 - fix any <linkend>'s that were affected by 1.
+    3 - any <function> in the docs that has an actual funcdef,
+    will become an olink.
+    
+    Signed-off-by: Matt Dew <marcoz@osource.org>
+
+commit f858f3326adbc0c5711669b92a64a84a9083a055
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Tue Oct 4 17:11:11 2011 -0400
+
+    [nls] Fix typo/synco.
+    
+    The iso8859-1 Compose table includes an optional section which uses
+    Ctrl<T> as a substitute for <Multi_key>.  In that section the sequence
+    to generate an @ (at) either was incorrectly copied from the Multi_key
+    section or was not kept in sync with the Multi_key section.
+    
+    Fixing this eliminates the warning from compose-check.pl:
+    
+    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+    ┃ Clash with existing sequence in iso8859-1/Compose.pre
+    ┃  on line 661: Ctrl<T> <A> <A>
+    ┃    line #661: Ctrl<T> <A> <A>          : "\305"        Aring
+    ┃    line #480: Ctrl<T> <A> <A>          : "@"   at
+    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+    
+    Signed-off-by: James Cloos <cloos@jhcloos.com>
+
+commit 7f35f7efc23234b3f8529fee31a802c21846d9ab
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Mon Sep 26 11:32:56 2011 -0700
+
+    Remove conflicting compose sequences for cent and colon
+    
+    Regression from 4d78ad4bf6dcabca9bb5f84c770abfbb02d3f7a4
+    Found by tinderbox
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit 4d78ad4bf6dcabca9bb5f84c770abfbb02d3f7a4
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Sun Sep 25 16:29:17 2011 -0700
+
+    Add additional compose sequences for pound sterling, yen, and cent (mixed case)
+    
+    https://bugs.freedesktop.org/show_bug.cgi?id=1013
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+    Reviewed-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 0ca4153a373e2af7a9eb3cef003393ab332bc79e
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Sat Sep 24 16:44:04 2011 -0700
+
+    Use a configure check for seteuid
+    
+    HP-UX doesn't have seteuid
+    
+    https://bugs.freedesktop.org/show_bug.cgi?id=1497
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit 79594b4d66344f248eb4314ecb78eb81f632c3ab
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Tue Sep 20 16:06:10 2011 -0400
+
+    localedb specs: use <copyright> for first holder of multi license
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 154430268cf004b06920edde2f1812dc16d71fae
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Tue Sep 20 16:01:52 2011 -0400
+
+    libX11 specs: use <copyright> for first holder of multi license
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 66e621f58dee804acb795ff2c79ce6dd38b34a3f
+Author: Tollef Fog Heen <tfheen@err.no>
+Date:   Tue Sep 20 13:07:37 2011 -0400
+
+    NLS: Add more vulgar fractions
+    
+    Add 1/7, 1/9, 1/10 and 0/3 vulgar fractions.
+    
+    Signed-off-by: Tollef Fog Heen <tfheen@err.no>
+    Signed-off-by: James Cloos <cloos@jhcloos.com>
+
+commit e37a6da814b5653be46000a9a76902729660a2e6
+Author: Alexander Polakov <polachok@gmail.com>
+Date:   Sat Sep 17 20:54:58 2011 +0400
+
+    XGrabKey manual page: change XAllowAccess to XAllowEvents in See Also
+    
+    There is no XAllowAccess man page to see.
+    
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit a23f3323f269b33a43d16dce01395cd28bc41b45
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Mon Sep 19 15:27:44 2011 -0400
+
+    XKB: provide adequate quotes for the license text
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit a9c7a5cad91d968f5536ef8fc735036e921832a3
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Mon Sep 19 15:18:53 2011 -0400
+
+    XIM: refactor the multi licensing legal text
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit c46f934ed89e7de79746a0387c9f998d91994ea6
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Mon Sep 19 10:33:30 2011 -0400
+
+    xim trans: restore Fujitsu copyright legal text
+    
+    Somehow lost during docbook conversion. text from x.org ftp R7.5.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 3d75f993382bfdc89d31668d7dfc71c91222e0d7
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Mon Sep 19 10:11:46 2011 -0400
+
+    xtrans: restore X Consortium original legal text
+    
+    Asking X Consortium permission to use The Open Group name makes no sense.
+    Even more so in 1994 before X Window System was passed on to the Open Group.
+    
+    Using original text from xorg-docs/general/License
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 136a381585a4a9686c11bad1a6130837978e677f
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Mon Sep 19 10:03:21 2011 -0400
+
+    Framework: restore X Consortium copyright
+    
+    Somewhat dammaged during docbook conversion.
+    Also restore pasrt of the original license text
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 33f346878406762704a0c13cdc018111c666f3c1
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Mon Sep 19 09:50:00 2011 -0400
+
+    localedb: restore X Consortium original legal text
+    
+    Asking X Consortium permission to use The Open Group name makes no sense.
+    Even more so in 1994 before X Window System was passed on to the Open Group.
+    
+    Using original text from xorg-docs/general/License
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit e99c9338e413efca026210b9d830efb5c74d34e5
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Mon Sep 19 08:23:18 2011 -0400
+
+    specs: support multi licensed copyright notice and license text
+    
+    For documentation having multiple licenses, the copyright and legalnotice
+    elements sequence cannot instantiated multiple times.
+    The copyright notice and license text are therefore coded inside a
+    legalnotice element. The role attribute on the paragraph is used to allow
+    styling of the copyright notice text which should not be italicized.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit b9dedc757e667333ce899115d618f25cdaa4dd5e
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Mon Sep 19 08:17:50 2011 -0400
+
+    localedb: add release info to spec
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 4519c89a87ddce01e599542737a27c26030fe4ff
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Mon Sep 19 08:05:32 2011 -0400
+
+    specs: fix The Open Group license text
+    
+    The warranty referred to the X Consortium
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 08ac378423e7be72e340197ba5559a1a36f1783c
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Mon Sep 19 08:03:39 2011 -0400
+
+    specs: The strandard name is still "X Consortium Standard"
+    
+    This spec, and fsproto spec, are the only two docs with a different
+    standard name.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 8dfbeb1b1b1e8aa17f69d0a373155419a5f6a172
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Sun Sep 18 13:22:34 2011 -0400
+
+    specs: support multi licensed copyright notice and license text
+    
+    For documentation having multiple licenses, the copyright and legalnotice
+    elements sequence cannot instantiated multiple times.
+    The copyright notice and license text are therefore coded inside a legalnotice
+    element. The role attribute on the paragraph is used to allow styling of the
+    copyright notice text which should not be italicized.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 278ca8947c1dabb2b819527dca0fa6190c034f67
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Fri Sep 16 11:45:56 2011 -0400
+
+    docs: merge copyright holder under the same copyright notice
+    
+    As per the docbook markup dtd.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 7ff012bb433109a622ac122ade71669e842ebdcf
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Fri Sep 16 10:09:57 2011 -0400
+
+    specs: handle multiple sets of copyright notice/license/warranty
+    
+    Docbook groups all the <copyright> elements together and all the
+    <legalnotice> elements together.
+    
+    We cannot have a sequence:
+    <copyright> <legalnotice> <copyright> <legalnotice> [...]
+    
+    A workaround, which was done in some documents, is to put the copyright
+    notice inside the legalnotice in plain text without the <copyright> element.
+    A formal paragraph title is added here which makes the copyright notice bold,
+    and makes it much easier to locate.
+    
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 4a550c71b8221c37b1a9378d5a170da9eaa03405
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Wed Sep 14 15:55:42 2011 -0400
+
+    specs: remove orphan affiliation.
+    
+    Authors affiliation are correct.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 0cc02a6df65214560b7575e89cebee741d6d2469
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Tue Sep 13 17:39:02 2011 -0400
+
+    specs: use appropriate markup for Copyright statements
+    
+    Also move <releaseinfo> to match order of appearance
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit afe13e19ebf0fc4e3460644164433af016f0add7
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Mon Sep 12 16:54:45 2011 -0400
+
+    docs: use the &fullrelvers; entity to set X11 release information
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 22a2153282db13e9d94881022b8c979539841a2c
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Sun Sep 11 19:49:53 2011 -0400
+
+    docs: remove <productnumber> which is not used by default
+    
+    This element is not rendered by default on the title. A template
+    customization is required to display it.
+    X Window System does not have a product number.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 719f16570d9fcfd15247813ee51fa51ac8a6ff4c
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Sun Sep 11 17:40:21 2011 -0400
+
+    docs: use the &fullrelvers; entity to set X11 release information
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit a6b2992f50b571d612ea9ade631c432c3099bc12
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Sun Sep 11 17:38:42 2011 -0400
+
+    docs: remove orphan <affiliation>
+    
+    Somehow created during the conversion from roff. Unable to locate
+    the author to which it belongs.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit c7420060b6e47b8467ba50c796ec3c1bab090bc7
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Sun Sep 11 17:38:05 2011 -0400
+
+    docs: remove <productnumber> which is not used by default
+    
+    This element is not rendered by default on the title. A template
+    customization is required to display it.
+    X Window System does not have a product number.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 7d5b718c1edbc43c54b7001be548e515a49540ea
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Fri Sep 9 14:46:39 2011 -0400
+
+    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 <memsize@videotron.ca>
+
+commit 24632d280491c465dfe208ef788815890892e326
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Mon Sep 5 12:53:12 2011 -0400
+
+    compose: upgrade makefile to support olinking on chunked html
+    
+    The essential differences over the regular docbook.am are:
+    Adding root.filename parameter for naming of chapters html files.
+    Using xhtml xmlto format and xorg-chunk.xsl stylesheet
+    Set olink.base.uri for pdf but not for chunked html
+    Olink is not applicable to ps and txt formats.
+    
+    Html chapters are added to shelf_DATA as they are also installed.
+    The xml is generated from a perl script and not distributed.
+    
+    Requires version 1.10 of xorg-sgml-doctools.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 93ab0a1c9a4f9094cf0c8e1c686130673e681798
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Wed Aug 31 19:46:20 2011 -0400
+
+    docbook.am: refactor common flags for xmlto and xsltproc
+    
+    Maximize reuse and reduce risk of setting the wrong flag
+    at the wrong place.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 85b725aa9ef76aeb5e94d42e0cd60f896da7ab97
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Wed Aug 31 10:46:59 2011 -0400
+
+    docbook.am: add search path for local entities
+    
+    Currently, only $(XORG_SGML_PATH)/X11 is searched for xml entities.
+    A module may want to add entities that apply only to itself and
+    not to all modules, like the xserver does.
+    
+    This feature may or may not be used in this module, but all modules
+    share a copy of docbook.am.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit b5ed2d368d47f244d43d2513329fa2758bc4ef54
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Thu Aug 25 14:39:20 2011 -0400
+
+    docbook.am: explicitly list xmlto flags for each target
+    
+    Normal evolution of make targets make it impractical to factor out
+    common command flags for xmlto.
+    
+    The targets now list each command option as its presence or absence
+    needs to be justified.
+    
+    xorg.ss is only needed by xmlto for html.
+    masterdb is only needed by xmlto.
+    img.src.path must not be used by html.
+    xsltproc need to use customization layer xorg-*.xsl.
+    txt format is not required to search masterdb.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit d5b3605f3b0639452e892e9ff3afb18bb7442069
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Thu Aug 25 13:12:49 2011 -0400
+
+    docbook.am: do not generate docs if docbook customization layer is missing
+    
+    The stylesheets used to be only about style, fonts or colors.
+    Complex features are now used like olink and chunked html which
+    may cause a build break when stylesheets are missing or lead to hard
+    to find problem.
+    
+    Some modules may be built when stylesheets are present while others
+    are built without. There is no requirement to build crippled docs.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 7f23c72c94d9d14122426b0d8c66054f1402769a
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Fri Aug 5 14:33:32 2011 -0400
+
+    libX11 specs: review doclifter generated tables
+    
+    Many tables had a questionnable layout and some had information dropped.
+    Each table was cross-referenced with a pre-docbook version
+    to ensure semantic integrity.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 1efdbeb8cd08f443188ac783cbab6ba0654a66d6
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Wed Jul 20 15:28:47 2011 -0400
+
+    credits.xml: remove toc from Acknowledgments
+    
+    There should be no toc for a simple preface with only one
+    Acknowledgments section.
+    
+    Use <simplesect> markup rather than sect1.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 77cc17ed0817c1df3ac5feb9dc83a5ba5d021a4b
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Thu Aug 4 19:59:37 2011 -0400
+
+    libX11 specs: move </para> above <varaiablelist>
+    
+    Many, but not all, function synopsis have a paragraph that
+    nests the variable list. The code was generated by doclifter
+    and there is no apprent reasons as to why it was done this way.
+    Found while investigating a spacing issue.
+    
+    Before the patch:
+    <para>Some blurb about the function
+    <funcsynopsis>
+    </funcsynopsis>
+    <variablelist>
+    </variablelist>
+    </para>
+    
+    After the patch:
+    <para>Some blurb about the function</para>
+    <funcsynopsis>
+    </funcsynopsis>
+    <variablelist>
+    </variablelist>
+    
+    There are no noticable differences when reading the doc
+    other than than the removed few pixels of spacing between
+    the function sysnopsis and the variable list block.
+    
+    In some cases, there are no "blurb about the fucntion"
+    and the empty paragraph is removed.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 18595f0d8f95ff1c12e7b9f73bd4b30dda5c7168
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Thu Jul 28 19:46:14 2011 -0400
+
+    compose specs: generate chunked html
+    
+    For large 600 page documents such as this one, chunked html
+    provide faster browser load time and better navigation.
+    
+    Simply click on the locale of your choice in the toc and
+    the browser loads just that one file. Being a DocBook,
+    it benefits from all of the usual features and can be
+    integrated with the rest of the documentation.
+    
+    Acked-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 5cc8815b8a117cf0b6af37e7d55c5a420d9fff57
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Thu Jun 23 15:16:47 2011 -0400
+
+    specs: build compose keys tables in specs/i18n/compose
+    
+    Build the tables article together with the rest of the specs.
+    Make it transparent that the source in generated in nls.
+    Reuse docbook.am and get all the features such as olink.
+    
+    The docbook article file stem and id must be the same. The new name
+    for the main article is libX11-keys. The new installation location
+    is $docdir/libX11/i18n/compose.
+    
+    The nls dir retains the role of generating the DocBook/XML source
+    but does not build neither installs output formats or generated source.
+    
+    The tables article now has to specify that each included locale
+    section is a dependency. It did not matter before as they were web links.
+    
+    The xorg-sgml-doctools masterdb shall be updated to include this new doc.
+    Install location moved from doc/libX11/Compose to doc/libX11/i18n/compose.
+    
+    Acked-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit adebbe3856b4aee39c0c7af902c1dea847dd6d7c
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Thu Jun 23 14:43:31 2011 -0400
+
+    nls: restructure charts as a single article with sections
+    
+    Looks more like a real article with a toc rather than individual
+    web pages. Looks nicer in pdf.
+    
+    Each locale is a "section" rather than an "article".
+    Using XInclude to aggregate xml source files gets you the toc for free.
+    
+    The single document is over 600 pages while there were 62 separate
+    documents previously. FOP version 1.0 is required to handle missing
+    character like capital sharp s.
+    
+    Acked-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit fc74dc12b1ff3c43e240e1a713316ce1bf525d61
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Thu Jul 28 19:32:40 2011 -0700
+
+    libX11 1.4.4
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit ab1f30231755d99ed123af6873b981834640f01d
+Author: Matt Dew <marcoz@osource.org>
+Date:   Wed Jul 13 12:33:40 2011 -0600
+
+    Add id attributes to error codes to allow linking from other docs.
+    
+    Signed-off-by: Matt Dew <marcoz@osource.org>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Acked-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 5c831fef402914ccf2ec14005c25be48852f119b
+Author: David Coppa <dcoppa@gmail.com>
+Date:   Tue Jul 12 10:05:47 2011 +0200
+
+    Fix libpthread linkage on OpenBSD.
+    
+    OpenBSD prefers to use the -pthread to fetch pthread libs when needed.
+    
+    Signed-off-by: Matthieu Herrb <matthieu.herrb@laas.fr>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 445b0b3efc04a74fc77cd3e483b25cfb5da82f12
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Wed Jun 22 20:46:26 2011 -0400
+
+    config: use XORG_WITH_PERL macro to replace custom program check
+    
+    New in version util-macros 1.15, the macro does the usual checking
+    for program path and provides an interface for makefile variables.
+    
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 47d99a324db9232029a22dd523e3bc3ed0936aca
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Wed Jun 22 20:41:18 2011 -0400
+
+    config: update XORG_WITH_FOP macro usage
+    
+    A new feature to test for a minimum version has been added.
+    
+    The parameter position changed. Due to limited usage
+    and requiring 1.15, it turns out to be backward compatible.
+    
+    There is no functional change to how docs are build.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit e659683ad51ecc26c989fbdefdfe20f83af2c5a5
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Wed Jun 22 11:48:49 2011 -0400
+
+    Remove unused xmlrules.in in specs, now in /nls
+    
+    The specs dir has been converted to docbook.am
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 9992092609bd83a0db778e9a9ac1e879d445e637
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Thu Mar 31 10:23:22 2011 -0400
+
+    nls: move xmlrules.in from specs to nls
+    
+    It is no longer used in the specs dir.
+    Remove html from CLEANFILES as it breaks. Make do not clean directories
+    Remove SUFFIXES as pattern rules are used rather than suffix rules.
+    
+    Other improvements are possible, the first priority is to move it out
+    of the specs dir.
+    
+    Acked-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit b370eeb0191b0e2a8bde2f03a442a8ca62e35d58
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Sun Jun 5 16:27:36 2011 -0400
+
+    Install target dbs alongside generated documents
+    
+    This matches a change in xorg-sgml-docs whereby the masterdb will look for
+    the target dbs into the same location as the generated documents.
+    
+    The target dbs are now installed alongside the generated documents.
+    Previously they are installed in $prefix/sgml/X11/dbs alongside masterdb which
+    has the potential of installing outside the package prefix and cause
+    distcheck to fail when user does not have write permission in this package.
+    
+    Requires XORG_CHECK_SGML_DOCTOOLS(1.8) which was released 2011-06-11
+
+commit 4e741654b7e0a283779b8b4af5bb32e05b7fc678
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Tue Jun 7 18:41:30 2011 -0700
+
+    specs/libX11: Turn appendix references into links
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit a3d1152bc4b300f59ea2f08925739aab1ebfbc4e
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Tue Jun 7 18:37:41 2011 -0700
+
+    specs/libX11: Turn chapter references into links
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit d0cc949dfe44a41a71f19e4fe6c7547bb3d9bdbe
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Tue Jun 7 00:52:32 2011 -0700
+
+    specs/libX11: Turn many "see section ..." into links
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 02d4c08dead2f266809b3f93ec72377783423ac7
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Sun Jun 5 22:50:37 2011 -0700
+
+    specs/libX11: Convert some header filenames to filename tags
+    
+    perl -i -p -e 's{^&lt;(.*\.h)&gt;\ *}{<filename class="headerfile">&lt;\1&gt;</filename>}' *.xml
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit c51a011329afa6e5b9d2b285349c132683ecf9fb
+Author: Matt Dew <marcoz@osource.org>
+Date:   Tue May 31 20:03:23 2011 -0600
+
+    Add id attributes to funcsynopsis to allow other docs to olink to them.
+    
+    Signed-off-by: Matt Dew <marcoz@osource.org>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 6841260c8bb15404a0b4805bee3b0bdfec7176b3
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Fri May 27 20:14:36 2011 -0700
+
+    Bug 37624 - parameter x is missing from synopsis of XDrawString in libX11.html
+    
+    https://bugs.freedesktop.org/show_bug.cgi?id=37624
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 205af6a4e557c62a6395feadc1c89f4a9fe1713b
+Author: Matt Dew <marcoz@osource.org>
+Date:   Sat May 21 00:23:06 2011 -0600
+
+    Add id's to functions, to make clickable links.
+    
+    Signed-off-by: Matt Dew <marcoz@osource.org>
+    Reviewed-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 5c06bc594473f6ab234724cd90db32e7b57fe811
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Fri May 20 15:38:08 2011 -0700
+
+    libX11 spec: fix monospaced column alignment after deligaturization
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit ef0019c714c273cb9b4ad3eba52d0b905109826b
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Fri May 20 15:51:46 2011 -0400
+
+    Expand latin ligatures out to their NFKC equivalents.
+    
+    Ligatures should be done by the typesetting system.
+    Manuscripts should not bother with them.
+    
+    Signed-off-by: James Cloos <cloos@jhcloos.com>
+    Reviewed-by: Keith Packard <keithp@keithp.com>
+
+commit 761b8aa0c9b3c58c478ac5ea1b3aaafadcfc1325
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Thu May 12 16:21:50 2011 +0200
+
+    XCB: Add more friendly error messages for common asserts
+    
+    This patch adds more friendly error messages for three common classes of
+    assertion:
+        - missed sequence numbers due to being griefed by another thread
+        - unknown requests in queue due to being griefed by another thread
+        - extensions dequeuing too much or too little reply data
+    
+    It adds error messages offering advice (e.g. call XInitThreads() first)
+    on stderr, but still generates actual assertions.  Hopefully this means
+    it's a little more Googleable and a little less frightening.
+    
+    Signed-off-by: Daniel Stone <daniel@fooishbar.org>
+    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 159bf292477048b9a2f074735afc516f52c93d80
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Thu May 19 20:22:11 2011 -0400
+
+    Remove misplaced hyphens in libX11 DocBook/XML #37364
+    
+    Reported-by: Christopher Yeleighton <giecrilj@stegny.2a.pl>
+    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 0ee6d8247d397500ae183ef180b6ff21bceefa1c
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Tue May 17 20:49:59 2011 -0700
+
+    Fix man page and comment references to use XFreeModifiermap (lowercase map)
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 3275ec4ca8790d571b6a1902367ca5f68a2dc5fd
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Tue May 17 20:30:54 2011 -0700
+
+    XKB man pages: Fix coordinantes typo in multiple pages
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit ca33a80606cd68e4572fa49ed6aaa1d1fc31a47f
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Tue May 17 16:27:32 2011 -0700
+
+    DisplayOfCCC.man: Fix typo "ClientWhitePointOfCC" -> "ClientWhitePointOfCCC"
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit ae39d82b01359b07dd1fe092d867f79ea95a5438
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Sun May 8 09:08:07 2011 -0700
+
+    Silence clang static analysis warnings for SetReqLen
+    
+    This provides a simplified version of the SetReqLen macro when using clang for
+    static analysis.  Prior to this change, we would see many Idempotent operation
+    warnings inside this macro due to the common case of calling with arg2 and
+    arg3 being the same variable.  This has no effect on code produced during
+    compilation, but it silences a number of false positives in static analysis.
+    
+    XIPassiveGrab.c:170:5: warning: Assigned value is always the same as the existing value
+        SetReqLen(req, num_modifiers, num_modifiers);
+        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+    In file included from XIPassiveGrab.c:26:
+    .../include/X11/Xlibint.h:580:8: note: instantiated from:
+                n = badlen; \
+                  ^
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit 130af2bc02090ee2526adb2f9803fc07019b8f1f
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Wed May 4 15:34:31 2011 -0700
+
+    XKB: XkbComputeSectionBounds: Check correct bounds in default switch-case
+    
+    XKBGeom.c:191:25: warning: Access to field 'x1' results in a dereference of a null pointer (loaded from variable 'rbounds')
+            _XkbCheckBounds(bounds,rbounds->x1,rbounds->y1);
+                                   ^~~~~~~
+    
+    Found-by: clang static analyzer
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit c987ef04bea345d5810e60cf6c53b747ddbe910e
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Wed May 4 15:31:17 2011 -0700
+
+    Revert "XKB: Avoid a possible NULL dereference"
+    
+    Sorry for the noise.  I accidentally pushed and didn't mean to. =(
+    
+    This reverts commit 4024091678ea07e0d898b798df9b29f3bf68eb08.
+
+commit 46d04bc4e7ff6c86385002c929d8eb0310f737a8
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Wed May 4 11:35:31 2011 -0700
+
+    Dead code removal
+    
+    XKBGeom.c:118:27: warning: Assigned value is always the same as the existing value
+        for (key=row->keys,pos=k=0;k<row->num_keys;k++,key++) {
+                           ~~~^~~~
+    XKBGeom.c:115:5: warning: Value stored to 'pos' is never read
+        pos= 0;
+        ^    ~
+    
+    Found-by: clang static analyzer
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit 4024091678ea07e0d898b798df9b29f3bf68eb08
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Wed May 4 11:34:53 2011 -0700
+
+    XKB: Avoid a possible NULL dereference
+    
+    XKBGeom.c:191:25: warning: Access to field 'x1' results in a dereference of a null pointer (loaded from variable 'rbounds')
+            _XkbCheckBounds(bounds,rbounds->x1,rbounds->y1);
+                                   ^~~~~~~
+    
+    Found-by: clang static analyzer
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit 626e5e34be55b7cf734d745bd40a7ee3359029f8
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Wed May 4 11:21:41 2011 -0700
+
+    Annotate _XIOError as _X_NORETURN
+    
+    Found-by: clang static analyzer
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit d3d7896408b435ab42656398839ff4351a37724d
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Tue May 3 09:32:53 2011 -0700
+
+    clang analyzer: Don't warn about Xmalloc(0)
+    
+    This will prevent a number of false positives in where clang's
+    static analysis reports about calls to malloc(0).
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit 393921cf2188b2b0713cc157effaf17d0abab783
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Thu Apr 21 16:21:04 2011 -0700
+
+    Delete special case code to append "/sparcv9" to i18n module path
+    
+    Was triggered by defined(__sparcv9) so only built on Solaris SPARC 64-bit.
+    Inconsistent with all other platforms, and a bit overcomplicated.
+    
+    Should anyone need to continue using that path, simply build with
+    a #define POSTLOCALELIBDIR "sparcv9" to get the same result.
+    
+    Fixes Solaris bug 7038737:
+     sparcv9 Xlib looking in wrong path for i18n loadable modules
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+
+commit b9ff9cfd5c56ae6d52c6503f7019756d9de29557
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Thu Apr 14 13:47:12 2011 -0700
+
+    specs/libX11: Fix XOpenDisplay() prototype in chapter 2 [bug 36244]
+    
+    Was incorrectly showing AllPlanes() instead when describing XOpenDisplay()
+    
+    https://bugs.freedesktop.org/show_bug.cgi?id=36244
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit b850adbdebcf500c659f85285d4d7374e15857f5
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Tue Apr 12 22:30:45 2011 -0700
+
+    Convert malloc(strlen()); strcpy() sets to strdup
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit 09194042d3dc44a463add1f7c122a68ffd5ef0bf
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Tue Apr 12 21:27:45 2011 -0700
+
+    Replace Xmalloc+bzero pairs with Xcalloc calls
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit ac1e2bff7121987fd768500a11d428d9fb9447c5
+Author: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+Date:   Fri Mar 25 14:47:35 2011 +0200
+
+    om: Fix memory leaks on get_font_name error paths.
+    
+    While at it, remove unneeded check for NULL before Xfree.
+    
+    Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 7c362e275c93c92b4e68fe862e73ee36665de703
+Author: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+Date:   Wed Mar 30 15:06:10 2011 +0300
+
+    xcms: Fix memory leaks on LINEAR_RGB_InitSCCData error path.
+    
+    pScreenData is replaced when building per visual intensity tables. If
+    malloc failed the old value of pScreenData (stored also in
+    pScreenDefaultData) was being leaked. Also, property_return wasn't
+    free'd in that case.
+    
+    Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 5c810e2ac233e00f361549bafb9b59e8a9e05eff
+Author: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+Date:   Wed Mar 30 15:19:28 2011 +0300
+
+    xcms: Fix error on LINEAR_RGB_InitSCCData error path.
+    
+    Due to what looks like a copy & paste error, pScreenData->pBlueTbl would
+    be accessed after being free'd.
+    
+    Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit d749948f9492fd9b61c74655a08e32c595e0e3a5
+Author: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+Date:   Fri Mar 25 16:06:15 2011 +0200
+
+    om: Fix potential memory leak in init_om.
+    
+    Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit d0749d6abdf0fd4d8b4e59b02dad8ccda3f10995
+Author: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+Date:   Thu Mar 24 20:40:41 2011 +0200
+
+    om: Fix memory leak on read_EncodingInfo error path.
+    
+    Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 4b2e8d00f5b6969c14003ee8eb258b9f0e4dd7c3
+Author: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+Date:   Thu Mar 24 19:55:33 2011 +0200
+
+    Fix memory leaks on _XimCbDispatch error path.
+    
+    Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 46e6c78b1a89e4774e0f7e0f4d6d0fd060c3897e
+Author: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+Date:   Thu Mar 24 19:52:05 2011 +0200
+
+    Fix memory leak on _XimCommitRecv error path.
+    
+    Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 0ace642a2d47265f01450bfa2b2fd48eb6956a83
+Author: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+Date:   Thu Mar 24 19:48:44 2011 +0200
+
+    Fix memory leaks on _XimWriteCachedDefaultTree error paths.
+    
+    Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit e29be94edbb58b3b8dab545377a710d1f73b61e0
+Author: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+Date:   Thu Mar 24 19:42:36 2011 +0200
+
+    Fix memory leaks on _XimGetAttributeID error paths.
+    
+    Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit d144a50512466766f55ce61e3884925334b08f0d
+Author: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+Date:   Thu Mar 24 19:36:56 2011 +0200
+
+    Fix memory leaks on _XimProtoCreateIC error paths.
+    
+    Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 6a452f7a98499508f753cb8a7c3f08bcbec736b9
+Author: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+Date:   Thu Mar 24 16:24:29 2011 +0200
+
+    Fix leaks in _XimEncodingNegotiation error paths.
+    
+    name_ptr and detail_ptr weren't free'd in some cases before returning
+    False.
+    
+    Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 396e5a452a59c1f121220ba72167b720a863b30f
+Author: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+Date:   Thu Mar 24 14:17:44 2011 +0200
+
+    FSWrap: fix potential leak in copy_string_list
+    
+    If list_count is 0, dst would be allocated and leaked.
+    
+    Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 1a944260182bb552b954d69f6355c2760d4415df
+Author: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+Date:   Wed Mar 23 14:36:22 2011 +0200
+
+    Fix memory leak with broken bitmap files in XReadBitmapFileData
+    
+    Bitmap file data is read looping through the lines in the input file. If
+    there is extra data after the bitmap, these lines will be processed and
+    if this data represents another bitmap it will replace the one read
+    before causing the memory allocated for bits to leak.
+    
+    This changes the code to stop processing the file once a bitmap was
+    read.
+    
+    Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit c1c91e9a221a0e762d96cc12a3f189d6e59f4865
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Tue Apr 12 20:50:42 2011 -0700
+
+    Fix "attrinute" typo in comments in ximcp
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 7103b83a88edb9c93acfa68f3b556595b087baff
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Fri Apr 8 21:36:11 2011 -0700
+
+    Make doc install subdirectories more like the pre-docbook.am paths
+    
+    Haven't restored the "specs" path in the install path, but have restored
+    libX11 & i18n subdirectories in the path for better logical grouping.
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 9a1ae7a90f815a737a942e42d5eb1ffff400977b
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Fri Apr 8 13:24:28 2011 -0700
+
+    Install xml versions of specs even if HAVE_XMLTO is false
+    
+    Moves HAVE_XMLTO check into docbook.am, more closely matches behaviour
+    from before docbook.am changes (commit e8c76407d2f6e3)
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit a0ad0d5c99023bb9a8ce3944dbc3267f5265721e
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Tue Apr 5 13:29:04 2011 -0700
+
+    libX11 1.4.3
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit e8c76407d2f6e3b11babdb84426e43e780c859c3
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Fri Feb 25 09:23:54 2011 -0500
+
+    Documentation: add Docbook external references support
+    
+    When writing technical documentation, it is often necessary to cross
+    reference to other information. When that other information is not in the
+    current document, additional support is needed, namely <olink>.
+    
+    A new feature with version 1.7 of xorg-sgml-doctools adds references to
+    other documents within or outside this package.
+    
+    This patch adds technical support for this feature but does not change
+    the content of the documentation as seen by the end user.
+    
+    Each book or article must generate a database containing the href
+    of sections that can be referred to from another document. This database
+    is installed in DATAROOTDIR/sgml/X11/dbs. There is a requirement that
+    the value of DATAROOTDIR for xorg-sgml-doctools and for the package
+    documentation is the same. This forms a virtual document tree.
+    
+    This database is consulted by other documents while they are being generated
+    in order to fulfill the missing information for linking.
+    Refer to the xorg-sgml-doctools for further technical information.
+    
+    Co-authored-by: Matt Dew <marcoz@osource.org>
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 25eb76b3d2726f2f1de759901971ae53b2539dc4
+Author: Harshula Jayasuriya <harshula@gmail.com>
+Date:   Mon Mar 21 14:49:37 2011 +0000
+
+    Add #define XK_SINHALA
+    
+    Add #define XK_SINHALA so that the Sinhala keysyms can be used by
+    the lk xkb keymap.
+    
+    Signed-off-by: Harshula Jayasuriya <harshula@gmail.com>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+
+commit db8b20b789112717ac0590b40f0b4dc2171797d0
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Thu Mar 17 16:15:00 2011 -0700
+
+    configure.ac: Bump version to 1.4.2
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit 83e1ba59c48c79f8b0a7e7aa0b9c9cfd84fa403d
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Tue Mar 15 16:48:07 2011 -0700
+
+    Call _XErrorFunction without holding the Display lock.
+    
+    Historically, Xlib dropped the Display lock around the upcall to any
+    user-supplied _XErrorFunction, but somewhere along the way I quit doing
+    that if you built with XCB. The reasons are lost somewhere in the
+    pre-git history of Xlib/XCB, and I can't now see any reason to hold the
+    lock.
+    
+    The documentation for XSetErrorHandler still applies though:
+    
+        Because this condition is not assumed to be fatal, it is acceptable
+        for your error handler to return; the returned value is ignored.
+        However, the error handler should not call any functions (directly
+        or indirectly) on the display that will generate protocol requests
+        or that will look for input events.
+    
+    So while you are now once again permitted to re-enter Xlib from the
+    error handler, you're only allowed to call non-protocol functions.
+    
+    Signed-off-by: Jamey Sharp <jamey@minilop.net>
+
+commit fd85aca7a616c595fc17b2520f84316a11e8906f
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Mon Mar 14 14:45:35 2011 -0700
+
+    Ignore user locks after sleeping in _XReply and _XReadEvents.
+    
+    This bug appears as a hang in applications that wait for replies from
+    multiple threads, where one such thread has taken a user lock using
+    XLockDisplay.
+    
+    Prior to this fix, the code could deadlock in this way: If thread 1 goes
+    to sleep waiting for a reply, and then thread 2 takes a user lock and
+    waits for a reply, then thread 2 will wait for thread 1 to process its
+    reply (because responses must be processed in order), but thread 1 will
+    wait for thread 2 to drop its user lock.
+    
+    Fixed by making thread 1 not wait for thread 2 to drop its user lock.
+    This makes the semantics of user locks hard to define, but they were
+    already hard to define. The new behavior appears to be consistent with
+    the way Xlib worked historically, anyway.
+    
+    Fixes: http://lists.freedesktop.org/archives/xcb/2011-March/006802.html
+    
+    There was a similar potential for deadlock in _XReadEvents, fixed the
+    same way, with the same caveats about user-lock semantics.
+    
+    Signed-off-by: Jamey Sharp <jamey@minilop.net>
+
+commit 690f8bffd48a4e7e74298360ddd0431dc95dcd3f
+Author: Erkki Seppälä <erkki.seppala@vincit.fi>
+Date:   Tue Jan 18 15:58:20 2011 +0200
+
+    xkb: XkbPropertyPtr determined allocation success from wrong variables
+    
+    Cannot reach dead statement "return NULL;"
+    
+    Check for the NULLness of prop->name and prop->value instead of
+    name and value, which was checked earlier anyway. Decided against
+    using strdup due to curious memory allocation functions and the
+    rest of the xkb not using it either.
+    
+    Signed-off-by: Erkki Seppälä <erkki.seppala@vincit.fi>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith at oracle.com>
+
+commit 6a4d027284e7bb5dd458157947bbb1ff580ad071
+Author: Erkki Seppälä <erkki.seppala@vincit.fi>
+Date:   Mon Jan 10 16:37:22 2011 +0200
+
+    keyBind: Use Xcalloc to initialize allocated _XKeytrans
+    
+    Using uninitialized value "p->modifiers"
+    
+    Small fix by using Xcalloc instead of Xmalloc
+    
+    Signed-off-by: Erkki Seppälä <erkki.seppala@vincit.fi>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith at oracle.com>
+
+commit b993d73bb3214ecc24646f5427c8003b816c6921
+Author: Erkki Seppälä <erkki.seppala@vincit.fi>
+Date:   Mon Jan 10 16:22:45 2011 +0200
+
+    im/ximcp: release modifiermap before returning
+    
+    Variable "map" goes out of scope
+    
+    Release modifiermap before returning. Reordered code to call
+    XGetModifierMapping after the first return from the function.
+    
+    Signed-off-by: Erkki Seppälä <erkki.seppala@vincit.fi>
+    Reviewed-by: Dirk Wallenstein <halsmit@t-online.de>
+
+commit 807a7fc0354f2212dfa5ff1f9e4ede56d8e69ef4
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Fri Feb 25 09:23:54 2011 -0500
+
+    Docbook: change the book id to match the xml file basename
+    
+    This is required for the up-coming external references support.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 40812b53ff5fe548f6eaf43ba4c8781cb43dab43
+Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
+Date:   Mon Feb 21 21:54:17 2011 +0100
+
+    Make the Local XIM request key releases for braille
+    
+    Braille chords management needs key release events. We need to explicitly
+    request then, else GTK would not pass them throught XFilterEvent and braille
+    wouldn't work.
+    
+    Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
+
+commit c97c42c49cd5095462abecdf908b416fb0b540b6
+Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
+Date:   Mon Feb 21 17:27:38 2011 +0100
+
+    Match braille patterns with compose tree
+    
+    Braille patterns should also be usable in Compose.  This combines the
+    implementation of braille chords and compose tree: only emit the braille
+    pattern if it can not be found in the compose tree, if any.
+    
+    Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
+
+commit 0c6ca565d7c8a47ef3ea823569a9ca5298a5307d
+Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
+Date:   Mon Feb 21 15:56:54 2011 +0100
+
+    Fix status reporting for braille patterns
+    
+    _XimLocalMbLookupString can return a braille keysym even if _Xlcwctomb can't
+    convert to the current MB charset.
+    _XimLocalUtf8LookupString needs to set the braille keysym and status too.
+    
+    Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
+
+commit 993abe751f4141f54d8d28b8b73588a1c9085970
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Fri Feb 11 14:49:17 2011 -0800
+
+    Clean up memory when first XCreateRegion succeeds and second fails
+    
+    Error: Memory leak (CWE 401)
+       Memory leak of pointer 's' allocated with XCreateRegion()
+            at line 387 of /export/alanc/X.Org/sx86-gcc/lib/libX11/src/Region.c in function 'XShrinkRegion'.
+              's' allocated at line 387 with XCreateRegion().
+              s leaks when s != 0 at line 387.
+    Error: Memory leak (CWE 401)
+       Memory leak of pointer 'tra' allocated with XCreateRegion()
+            at line 1452 of /export/alanc/X.Org/sx86-gcc/lib/libX11/src/Region.c in function 'XXorRegion'.
+              'tra' allocated at line 1451 with XCreateRegion().
+              tra leaks when tra != 0 at line 1451.
+    
+    [ This bug was found by the Parfait 0.3.6 bug checking tool.
+      For more information see http://labs.oracle.com/projects/parfait/ ]
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 6ac417cea1136a3617f5e40f4b106aaa3f48d6c2
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Fri Feb 11 14:20:24 2011 -0800
+
+    ximcp: Prevent memory leak & double free if multiple %L in string
+    
+    In the highly unlikely event that TransFileName was passed a path
+    containing multiple %L entries, for each entry it would call
+    _XlcFileName, leaking the previous results, and then for each entry it
+    would copy from that pointer and free it, resulting in invalid pointers
+    & possible double frees for each use after the first one freed it.
+    
+    Error: Use after free (CWE 416)
+       Use after free of pointer 'lcCompose'
+            at line 358 of modules/im/ximcp/imLcPrs.c in function 'TransFileName'.
+              Previously freed at line 360 with free.
+    Error: Use after free (CWE 416)
+       Use after free of pointer 'lcCompose'
+            at line 359 of modules/im/ximcp/imLcPrs.c in function 'TransFileName'.
+              Previously freed at line 360 with free.
+    Error: Double free (CWE 415)
+       Double free of pointer 'lcCompose'
+            at line 360 of modules/im/ximcp/imLcPrs.c in function 'TransFileName'.
+              Previously freed at line 360 with free.
+    
+    [ This bug was found by the Parfait 0.3.6 bug checking tool.
+      For more information see http://labs.oracle.com/projects/parfait/ ]
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 502d414118c97d35a44f8e295709682022876331
+Author: Erkki Seppälä <erkki.seppala@vincit.fi>
+Date:   Thu Feb 3 17:08:57 2011 +0200
+
+    xcms/cmsProp: don't deal with uninitialized values, fail instead
+    
+    Properly handle the return value of XGetWindowProperty by considering
+    if after the loop as well.
+    
+    Using freed pointer "prop_ret"
+    
+    There were numerous things wrong in how this function interacted with
+    XGetWindowProperty.
+    
+    None of the local variables were initialized and remained that way if
+    the call to XGetWindowProperty returned 1 (not Succeed). That doesn't
+    result in after_ret being initialized in which case if it happens to
+    be 0, the loop was exited. In that case format_ret and nitems_ret were
+    uninitialized and the function might return with success (but with
+    uninitialized pointer in prop_ret) or XcmsFailure.
+    
+    As the buffer enlarging code was called only when XGetWindowProperty
+    failed (returned not Success), after_ret would not have been
+    initialized. It would have been initialized only if the
+    XGetWindowProperty has returned Success earlier, but in that case the
+    code fragment would not have been reached.
+    
+    This patch alters the function to return XcmsFailure if the call to
+    XGetWindowProperty fails.
+    
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Reviewed-by: Rami Ylimäki <rami.ylimaki@vincit.fi>
+    Signed-off-by: Erkki Seppälä <erkki.seppala@vincit.fi>
+
+commit c37e278993b9e5b3d7025ef4c434373a011996ec
+Author: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+Date:   Mon Jan 31 14:02:07 2011 +0200
+
+    xcms/LRGB: don't double-free property_return
+    
+    property_return was free'd before and in the case the conditional is true,
+    the call to XcmsGetProperty failed which means that property_return wasn't
+    set so there is no need to free it again.
+    
+    Double free of pointer "property_return" in call to "free"
+    
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Erkki Seppälä <erkki.seppala@vincit.fi>
+    Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+
+commit 50f4107811249806718a100f9d34f996c58e5e25
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Wed Feb 2 08:58:45 2011 -0800
+
+    Xrm.c: ReadInFile: refactor fstat error handling
+    
+    We can simplify the fstat failure case now that the GetFileSize macro
+    has been expanded inline.
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Julien Cristau <jcristau@debian.org>
+
+commit 5e9c40fcb5da43c9fdacf12967d090bf202daf2a
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Wed Feb 2 08:56:00 2011 -0800
+
+    Expand GetSizeOfFile() macro at the one place it's called
+    
+    Removes XrmI.h header that only contained this single macro
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Julien Cristau <jcristau@debian.org>
+
+commit 450e17422c0e374d25c643f343ea268cec68da38
+Author: Erkki Seppälä <erkki.seppala@vincit.fi>
+Date:   Mon Jan 31 14:01:57 2011 +0200
+
+    XlibInt: Use strncpy+zero termination instead of strcpy to enforce buffer size
+    
+    Possible overrun of 8192 byte fixed size buffer "buffer" by copying
+    "ext->name" without length checking
+    
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Signed-off-by: Erkki Seppälä <erkki.seppala@vincit.fi>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit e2566e43b02d2d7b7c1c3bb7db7c5ae81c1245fa
+Author: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+Date:   Mon Jan 31 14:02:13 2011 +0200
+
+    lc/def/lcDefConv: Use Xcalloc to avoid use of uninitialized memory
+    
+    Fixed by zero'ing conv on allocation with Xcalloc. Then
+    close_converter works properly.
+    
+    Using uninitialized value "conv->state" in call to function "close_converter"
+    
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Erkki Seppälä <erkki.seppala@vincit.fi>
+    Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 03f81ad8fb9783986cf9b17661dd31e95c396681
+Author: Erkki Seppälä <erkki.seppala@vincit.fi>
+Date:   Mon Jan 31 14:02:16 2011 +0200
+
+    xlibi18n/lcFile: Removed superfluous check for NULL target_dir
+    
+    The situation is already handled before this code.
+    
+    Cannot reach dead expression "0U" inside statement "if (1U + (target_dir ? strl..."
+    
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Signed-off-by: Erkki Seppälä <erkki.seppala@vincit.fi>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 1346b9ea3b3882201ff8c3ee462ff4b0d4edf639
+Author: Erkki Seppälä <erkki.seppala@vincit.fi>
+Date:   Mon Jan 31 14:02:15 2011 +0200
+
+    ximcp/imLckup: Handle negative return value from _Xlcwctomb
+    
+    Fixed by negative value to memcpy by checking for the negative return
+    value of _Xlcwctomb and returning 0/XLookupNone in that case.
+    
+    a negative value was passed to memcpy
+    
+    Unfortunately the other return values for *status don't fit into the
+    error (which appears to indicate some internal error or running out of
+    memory). The other valid status codes are XBufferOverflow,
+    XLookupNone, XLookupChars, XLookupKeySym, and XLookupBoth. Each of
+    these has a specific meaning attached.
+    
+    Reviewed-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Signed-off-by: Erkki Seppälä <erkki.seppala@vincit.fi>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 79a5c86e020f08cc108184298a72e2777036de39
+Author: Erkki Seppälä <erkki.seppala@vincit.fi>
+Date:   Mon Jan 31 14:02:14 2011 +0200
+
+    ximcp/imTrX: Handle failing XGetWindowProperty
+    
+    Checked return value of XGetWindowProperty and return false if it fails.
+    
+    Return value of "XGetWindowProperty(im->core.display, spec->lib_connect_wid, prop, 0L, (length + bytes_after_ret + 3UL) / 4UL, 1, 0UL, &type_ret, &format_ret, &nitems, &bytes_after_ret, &prop_ret)" is not checked
+    
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Signed-off-by: Erkki Seppälä <erkki.seppala@vincit.fi>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 2ace8d5c89c8f6d9f42b4068f4b508ca28f0ced1
+Author: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+Date:   Mon Jan 31 14:02:12 2011 +0200
+
+    XlibInt: info_list->watch_data was reallocated, but result was discarded
+    
+    info_list->watch_data was being reallocated, but the return value of
+    the reallocation was stored only into a local variable. This might
+    cause some funky behavior and crashes.
+    
+    Variable "wd_array" goes out of scope
+    Value "wd_array" is overwritten in "wd_array = (XPointer*)realloc((char*)info_list->watch_data, (((dpy->watcher_count + 1) * 4U == 0U) ? 1U : ((dpy->watcher_count + 1) * 4U)))"
+    
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Erkki Seppälä <erkki.seppala@vincit.fi>
+    Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 2b16a7e683e355c9746290b2cee2fd0dd2bf342a
+Author: Erkki Seppälä <erkki.seppala@vincit.fi>
+Date:   Mon Jan 31 14:02:10 2011 +0200
+
+    GetProp: Zero-initialized error so its resourceID field is initialized
+    
+    Using uninitialized value "error.resourceID" in call to function "_XError"
+    
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Erkki Seppälä <erkki.seppala@vincit.fi>
+    Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 85e9f38e016137f0ff2791eb0d092ab027382d2c
+Author: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+Date:   Tue Feb 1 11:07:25 2011 +0200
+
+    xcms/LRGB: Add a label for freeing property_return.
+    
+    The rest of the code uses goto's to free memory allocated later
+    and prevent memory leaks, but there were several paths were
+    property_return was free'd just before a goto.
+    
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Signed-off-by: Erkki Seppälä <erkki.seppala@vincit.fi>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 3161dc57d4e9b70f852f05e5e474455e121b06ab
+Author: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+Date:   Mon Jan 31 14:02:08 2011 +0200
+
+    xcms/LRGB: Fix potential resource leak.
+    
+    property_return was not free'd if the allocation of pRedTbl failed.
+    
+    Reviewed-by: Erkki Seppälä <erkki.seppala@vincit.fi>
+    Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit be3e6c205d94dedc1cdebf5d17b987f0f828377a
+Author: Erkki Seppälä <erkki.seppala@vincit.fi>
+Date:   Mon Jan 31 14:02:06 2011 +0200
+
+    Xrm: Handle the extremely unlikely situation of fstat failing
+    
+    Tracked variable "size" was passed to a negative sink.
+    
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Signed-off-by: Erkki Seppälä <erkki.seppala@vincit.fi>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 3fae16c64d6ef76fd4a25a54c7f7de76596457db
+Author: Erkki Seppälä <erkki.seppala@vincit.fi>
+Date:   Mon Jan 31 14:02:05 2011 +0200
+
+    Xrm: NEWTABLE had a memory leak after a memory allocation error
+    
+    The NEWTABLE macro missed freeing its allocated memory on subsequent
+    memory allocation errors. Added call to Xfree.
+    
+    Variable "table" goes out of scope
+    
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Signed-off-by: Erkki Seppälä <erkki.seppala@vincit.fi>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 7110ac653349a23c80c365f11f6270dc27c8975a
+Author: Erkki Seppälä <erkki.seppala@vincit.fi>
+Date:   Mon Jan 31 14:02:03 2011 +0200
+
+    ImUtil: Handle a memory leak in one early return branch
+    
+    Fixed memory leak by adding Xfree for image
+    
+    Variable "image" goes out of scope
+    
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Signed-off-by: Erkki Seppälä <erkki.seppala@vincit.fi>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit d695f5da9f5b778e54b6987d9177048e32818c4d
+Author: Erkki Seppälä <erkki.seppala@vincit.fi>
+Date:   Mon Jan 31 14:02:01 2011 +0200
+
+    ximcp/imRm: Handle leaking colormap_ret
+    
+    Fixed memory leak by adding Xfree for colormap_ret
+    
+    Variable "colormap_ret" goes out of scope
+    
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Signed-off-by: Erkki Seppälä <erkki.seppala@vincit.fi>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit f9eda19d08c1ea0973dfe0bc10a2519d6fd26cc7
+Author: Erkki Seppälä <erkki.seppala@vincit.fi>
+Date:   Mon Jan 31 14:01:59 2011 +0200
+
+    ximcp/imRmAttr: Handle leaking missing_list
+    
+    Fixed memory leak by adding Xfree and initializing missing_list with NULL
+    
+    Variable "missing_list" goes out of scope
+    
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Signed-off-by: Erkki Seppälä <erkki.seppala@vincit.fi>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 3183269e0979c9dbce9d55d9e03937897dc9fb3b
+Author: Erkki Seppälä <erkki.seppala@vincit.fi>
+Date:   Mon Jan 31 14:01:58 2011 +0200
+
+    ximcp/imRmAttr: Handle leaking colormap_ret
+    
+    XFree colormap_ret and initialize it when appropriate.
+    
+    Variable "colormap_ret" goes out of scope
+    
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Signed-off-by: Erkki Seppälä <erkki.seppala@vincit.fi>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit f66a032a937030f2d9baa81744d36dc585bb085c
+Author: Erkki Seppälä <erkki.seppala@vincit.fi>
+Date:   Mon Jan 31 14:01:56 2011 +0200
+
+    xlibi18n/lcGeneric: Initialize uninitialized local variable
+    
+    Using uninitialized value "new"
+    
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Signed-off-by: Erkki Seppälä <erkki.seppala@vincit.fi>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit d0266e06d38110ec908ca28379014eff743630b7
+Author: Erkki Seppälä <erkki.seppala@vincit.fi>
+Date:   Mon Jan 31 14:01:54 2011 +0200
+
+    xcmx/cmxColNm: Removed unused assignments to pBuf (in two functions)
+    
+    Pointer "pBuf" returned from "fgets(buf, 256, stream)" is never used
+    
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Signed-off-by: Erkki Seppälä <erkki.seppala@vincit.fi>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit cc686655d7bfdeab8b67e01a24bd452a2e9e3fcf
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Tue Feb 1 12:30:56 2011 +0200
+
+    XDefaultOMIF.c: Fix memory leaks in get_font_name
+    
+    Instead of copying the value returned by get_prop_name and then releasing it,
+    directly use the return value of get_prop_name, which allocates memory for the
+    name.
+    
+    If get_prop_name returns NULL, continue on to XFreeFont to release the font
+    before returning the NULL via the normal function return.
+    
+    Reviewed-by: Erkki Seppälä <erkki.seppala@vincit.fi>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 95796351435d81eaef8166d49ba3a6e7b633d70a
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Mon Jan 31 14:50:19 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.
+    Remove redundant AC_CANONICAL_HOST included in XORG_DEFAULT_OPTIONS
+    
+    This helps automated maintenance and release activities.
+    Details can be found in http://wiki.x.org/wiki/NewModuleGuidelines
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit e994ab227ed28655565c3193e63733630105e7f9
+Author: Erkki Seppälä <erkki.seppala@vincit.fi>
+Date:   Tue Jan 18 12:49:48 2011 +0200
+
+    Comparing array against NULL is not useful "&xkb->server->vmods != NULL"
+    
+    Removed superfluous comparison.
+    
+    Reviewed-by: Dirk Wallenstein <halsmit@t-online.de>
+    Signed-off-by: Erkki Seppälä <erkki.seppala@vincit.fi>
+
+commit 4115f051e62f9b098efce691e070d44f09f30f1c
+Author: Erkki Seppälä <erkki.seppala@vincit.fi>
+Date:   Wed Jan 12 15:51:11 2011 +0200
+
+    Variable "entry" tracked as NULL was dereferenced.
+    
+    Check entry for non-nullness before dereferencing it
+    
+    Reviewed-by: Dirk Wallenstein <halsmit@t-online.de>
+    Reviewed-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Signed-off-by: Erkki Seppälä <erkki.seppala@vincit.fi>
+
+commit 0edb76d1d5fdca5a2543332699be2e72386dab24
+Author: Erkki Seppälä <erkki.seppala@vincit.fi>
+Date:   Thu Jan 27 09:54:00 2011 +0200
+
+    Dereferencing possibly NULL "str" in call to function "memcpy" (Deref assumed on the basis of 'nonnull' parameter attribute.)
+    
+    If _XkbGetReadBufferPtr returns NULL, goto BAILOUT
+    
+    Reviewed-by: Dirk Wallenstein <halsmit@t-online.de>
+    Reviewed-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Signed-off-by: Erkki Seppälä <erkki.seppala@vincit.fi>
+
+commit 59da8a211ef723909d0530c0331d541db8e63378
+Author: Erkki Seppälä <erkki.seppala@vincit.fi>
+Date:   Mon Jan 10 16:17:47 2011 +0200
+
+    Using freed pointer "e"
+    
+    Reordered code to first to do the comparison and then to release data
+    
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Ander Conselvan de Oliveira <ander.conselvan-de-oliveira@nokia.com>
+    Signed-off-by: Erkki Seppälä <erkki.seppala@vincit.fi>
+
+commit 0f11c229f7099f7c5aeed4691b358dca151dac7d
+Author: Matt Dew <marcoz@osource.org>
+Date:   Thu Jan 27 00:31:23 2011 -0700
+
+    Remove <literal> tags from compose-chart.pl so pdf building doesn't die on soft-hyphens.
+    
+    Signed-off-by: Matt Dew <marcoz@osource.org>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit ca00bb202f3afcdbbcb8c4cb50308c5dd03f2322
+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 8dac08c7515cb6f8a8f4d0a721713697eae755d8
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Fri Jan 28 14:59:04 2011 -0500
+
+    config: remove unrequired AC_HEADER_STDC
+    
+    Autoconf says:
+    "This macro is obsolescent, as current systems have conforming
+    header files. New programs need not use this macro".
+
+commit d4483375e37a72631d5821413cb75a423e990ffe
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Tue Jan 18 19:37:02 2011 -0800
+
+    config: Use correct AC_CONFIG_HEADERS macro
+    
+    Replaces obsolete AM_CONFIG_HEADER and undocumented AC_CONFIG_HEADER
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Gaetan Nadon <memsize@videotron.ca>
+    Reviewed-by: Dan Nicholson <dbn.lists@gmail.com>
+
+commit c6405fe931f313a0d159bdad00244fc8aae12468
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Sun Jan 16 11:55:23 2011 -0800
+
+    config: remove AC_PROG_CC as it overrides AC_PROG_C_C99
+    
+    XORG_STRICT_OPTION from XORG_DEFAULT_OPTIONS calls
+    AC_PROG_C_C99. This sets gcc with -std=gnu99.
+    If AC_PROG_CC macro is called afterwards, it resets CC to gcc.
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 17aa1f2305da0952ad594c7329d08aba21f13ac8
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Sun Jan 16 11:40:59 2011 -0800
+
+    Update to xf86bigfontproto >= 1.2.0 header name
+    
+    Clears compile-time warning of:
+    "X11/extensions/xf86bigfstr.h", line 1: #warning: "xf86bigfstr.h is obsolete and may be removed in the future."
+    "X11/extensions/xf86bigfstr.h", line 2: #warning: "include <X11/extensions/xf86bigfproto.h> for the protocol defines."
+    
+    Requires xf86bigfontproto >= 1.2.0 if --disable-xf86bigfont is not
+    passed to configure.
+    
+    Also removes unnecessary AC_SUBST of BIGFONT_CFLAGS & BIGFONT_LIBS
+    that PKG_CHECK_MODULES does automatically
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Julien Cristau <jcristau@debian.org>
+
+commit a9228fcc676aacf9a760dd94891c89f9bc82b20d
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Tue Jan 11 17:55:22 2011 -0800
+
+    libX11 1.4.1
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 92fa96451af37a7a0f2592de07643fdaed7a9efd
+Author: Pauli Nieminen <ext-pauli.nieminen@nokia.com>
+Date:   Mon Jan 3 12:25:28 2011 -0500
+
+    Initialize event type
+    
+    If we receive unsupported event closing connection triggers valgrind
+    error.
+    
+    ==12017== Conditional jump or move depends on uninitialised value(s)
+    ==12017==    at 0x487D454: _XFreeDisplayStructure (OpenDis.c:607)
+    ==12017==    by 0x486857B: XCloseDisplay (ClDisplay.c:72)
+    *snip*
+    ==12017==  Uninitialised value was created by a heap allocation
+    ==12017==    at 0x4834C48: malloc (vg_replace_malloc.c:236)
+    ==12017==    by 0x4894147: _XEnq (XlibInt.c:877)
+    ==12017==    by 0x4891BF3: handle_response (xcb_io.c:335)
+    ==12017==    by 0x4892263: _XReply (xcb_io.c:626)
+    *snip*
+    
+    Problem is that XFreeDisplaySturture is checking for qelt->event.type ==
+    GenericEvent while _XUnknownWireEvent doesn't store the type.
+    
+    Reviewed-by: Adam Jackson <ajax@redhat.com>
+    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Signed-off-by: Pauli Nieminen <ext-pauli.nieminen@nokia.com>
+
+commit fa9747b9d4443eef9b1687b8b1208801f5c585da
+Author: Fernando Carrijo <fcarrijo.lists@gmail.com>
+Date:   Tue Dec 28 16:18:57 2010 -0500
+
+    specs: convert images from gif to svg format.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 0012e2a4eaddc0840617b4758931ad976ca2eb7c
+Author: Philipp Reh <sefi@s-e-f-i.de>
+Date:   Wed Dec 22 15:14:05 2010 +0000
+
+    Events: Store event cookie when dequeuing event
+    
+    When we dequeue an event in XCheckTypedEvent or XCheckTypedWindowEvent,
+    make sure to store the corresponding cookie too.
+    
+    Signed-off-by: Philipp Reh <sefi@s-e-f-i.de>
+    Reviewed-by: Daniel Stone <daniel@fooishbar.org>
+
+commit d2714d65e85b44abedf5f82e1a31506dba397ef2
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Tue Dec 21 18:47:16 2010 -0800
+
+    Revert "Mark atom names argument to XInternAtoms as const"
+    
+    This reverts commit c8701115462b482d99ecff24d9de0f2806084ba5.
+    
+    The constification of a pointer to a pointer caused unexpected issues,
+    and xorg-devel was unable to come up with a clean, safe, reasonable way
+    to handle them, so we're chalking this up for now as yet another mistake
+    in the Xlib API definition we'll be living with.
+    
+    See https://bugs.freedesktop.org/show_bug.cgi?id=32098 for details.
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 6459f9a48a82de3bc0235bd36acab2df11e436d5
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Mon Dec 20 20:54:07 2010 -0800
+
+    specs/XKB: make acknowlegement section <preface> instead of <chapter>
+    
+    Fixes numbering of actual chapters to match their filenames and to
+    make the table/figure numbering match the references in the text.
+    
+    Reported-by: jelmd on freenode irc
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 42c653d5413fc5870486a9cf51dd28d1e88f7c69
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Sun Dec 19 23:53:02 2010 -0800
+
+    Add XKBlib spec images to dist_spec_DATA for distribution & installation
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 8f8a3c8c42af82976d261ac2447cfbb0f90fa77d
+Author: Matt Dew <matt@osource.org>
+Date:   Tue Nov 30 10:52:07 2010 -0500
+
+    specs: convert XKBlib spec from Framemaker to DocBook.xml
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit c8701115462b482d99ecff24d9de0f2806084ba5
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Sun Nov 21 20:49:05 2010 -0800
+
+    Mark atom names argument to XInternAtoms as const
+    
+    Updates code & docs for XInternAtoms.
+    
+    The single atom name argument to XInternAtom was already const char *
+    in the code, but not the docs, so updated it in the docs too.
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 24db5b5ff0d51b0ed9d9701a792c5f14f23b638d
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Sun Nov 21 14:04:32 2010 -0800
+
+    libX11 1.4.0
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 18d3c3e9de19e936281b111d5a82acfb3a3f552e
+Author: Dan Nicholson <dbn.lists@gmail.com>
+Date:   Sat Nov 6 21:58:10 2010 +0000
+
+    config: Check host string when deciding architecture to build for
+    
+    When checking for the OS/2 platform, $target_os is used. However, unless
+    building a cross compiler, the $host* strings contain the platform
+    details for the build system. See:
+    
+    http://www.gnu.org/software/automake/manual/automake.html#Cross_002dCompilation
+    
+    $host_os is already being used to determine the transport and threading
+    options.
+    
+    Signed-off-by: Dan Nicholson <dbn.lists@gmail.com>
+    Reviewed-by: Julien Cristau <jcristau@debian.org>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit affc2488a7f2660a74dc8354fc3e0bff2c4f879c
+Author: Dan Nicholson <dbn.lists@gmail.com>
+Date:   Sat Nov 6 21:58:09 2010 +0000
+
+    config: Fix architecture check for OS/2 to skip nios2 cpu
+    
+    The OS/2 platform requires some utility functions as well as having a
+    non-32 bit wchar_t. Fix the configure check so that it doesn't also
+    affect the nios2 cpu, which wouldn't influence these operating system
+    issues.
+    
+    Signed-off-by: Dan Nicholson <dbn.lists@gmail.com>
+    Tested-by: Frans Meulenbroeks <fransmeulenbroeks@gmail.com>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Julien Cristau <jcristau@debian.org>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 8cbca8a10761d1ea75a75bafa647632d6c0dac71
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Tue Nov 9 13:04:44 2010 -0500
+
+    config: HTML file generation: use the installed copy of xorg.css
+    
+    Currenlty the xorg.css file is copied in each location
+    where a DocBook/XML file resides. This produces about
+    70 copies in the $(docdir) install tree.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 3e8907305e1818369aef5a5c0da61f09e20de4f8
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Fri Oct 29 22:02:10 2010 -0700
+
+    libX11 1.3.99.903 (1.4.0 RC3)
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 5d245d8013289b13e0c42100951b26166c7fada4
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Fri Oct 29 22:01:39 2010 -0700
+
+    Require xorg-macros 1.11 now that it is released
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 1ec89689fc771f116a6165226b9e076f54254a40
+Author: Dan Nicholson <dbn.lists@gmail.com>
+Date:   Fri Oct 22 19:09:07 2010 -0700
+
+    docs: Disable fop documentation by default
+    
+    fop is used to generate the pdf and ps formats of the documentation.
+    This can significantly slow down the build, especially when creating all
+    the compose key charts. Since few people probably want the full set of
+    doc formats, set the default to 'no'.
+    
+    The default parameter for XORG_WITH_FOP is only available in recent
+    macros. Users generating configure from older macros will just get
+    'auto' as the default.
+    
+    Signed-off-by: Dan Nicholson <dbn.lists@gmail.com>
+    Reviewed-by: Gaetan Nadon <memsize@videotron.ca>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 03877bda911b72ac60a7144d6eced7d5be4b4d72
+Author: Jon TURNEY <jon.turney@dronecode.org.uk>
+Date:   Wed Apr 14 13:38:18 2010 +0100
+
+    Add C.UTF-8 and C.ASCII locale aliases
+    
+    Add C.UTF-8 locale as an alias for en_US.UTF-8
+    Add C.ASCII locale as an alias for C
+    
+    (C.UTF-8 is the default locale for cygwin.  It also exists in debian,
+    although I don't think it's intended for use by humans.)
+    
+    Signed-off-by: Jon TURNEY <jon.turney@dronecode.org.uk>
+    Acked-by: Julien Cristau <jcristau@debian.org>
+    Reviewed-by: James Cloos <cloos@jhcloos.com>
+
+commit 81d1d9a6bdca779a44f931730b866eea75777c00
+Author: Dan Nicholson <dbn.lists@gmail.com>
+Date:   Sat Oct 9 16:00:47 2010 -0700
+
+    docs: Remove directory prerequisites from make rules
+    
+    Make expects prerequisites to be files with valid timestamps, and
+    directories are treated as always being out of date. Thus, any targets
+    depending on directories will always be rebuilt.
+    
+    Instead, the doc rules are changed to always create the target's leading
+    directory. This should prevent the documentation from being rebuilt when
+    "make install" is run.
+    
+    Signed-off-by: Dan Nicholson <dbn.lists@gmail.com>
+    Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit d0cbf388919364fe6b5b9127f36426eb744090a0
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Sun Sep 26 21:21:16 2010 -0700
+
+    Add an "X11_" string to header guards to avoid possible collision
+    
+    This addresses a build failure which can result from <X11/Xlocale.h> and
+    <xlocale.h> being included in the same code since they both used the same
+    _XLOCALE_H_ protection.
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit b51ac675f44f5ce1a28c5734bf3c26983f8b4192
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Tue Sep 21 19:53:03 2010 -0700
+
+    libX11 1.3.99.902 (1.4.0 RC2)
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 986bb6d1d54368fe91e3ea24f518d43ce6179782
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Tue Sep 14 00:10:31 2010 -0700
+
+    Bug 19379 - Provide docs with overview of all compose key combinations
+    
+    Adds compose-chart.pl to generate DocBook/XML documents listing compose
+    keys, and Makefile rules to generate HTML & PDF output from them if xmlto
+    is present.
+    
+    https://bugs.freedesktop.org/show_bug.cgi?id=19379
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Mikhail Gusarov <dottedmag@dottedmag.net>
+    Reviewed-by: James Cloos <cloos@jhcloos.com>
+    Tested-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 3eb064071695ebf0f371163ed818a428dfeba8e6
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Sat Sep 11 00:49:21 2010 -0700
+
+    Make locale data build non-recursive / parallelizable
+    
+    On a 4 core CPU with gmake -j 16 the nls subdir builds in half the time,
+    plus this simplifies the next set of changes.
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Mikhail Gusarov <dottedmag@dottedmag.net>
+    Reviewed-by: James Cloos <cloos@jhcloos.com>
+    Tested-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit a3fc78ac352e5a70a958996ef6aec50f653974d1
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Fri Sep 17 17:38:11 2010 -0400
+
+    config: remove man page suffix from bottom summary
+    
+    The man page suffix is the same for all libraries on a given
+    platform and is not configurable. It should have been removed
+    in commit 09edc6de6.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit a52b0068f36c739eb7e426214cd72a8d9bb776ca
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Fri Sep 17 17:29:30 2010 -0400
+
+    config: remove unhelpful comment in .gitignore
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 10dd881e7818be9074da4ab3a68577adcdaf71d2
+Author: Adam Jackson <ajax@redhat.com>
+Date:   Wed Sep 8 10:44:23 2010 -0400
+
+    Zero buffer data in BufAlloc()
+    
+    Inspired by a pattern in NoMachine's NX.  Consistently zeroed buffers
+    compress better with ssh and friends.  Note that you'll need to rebuild
+    all your protocol libraries to take advantage of this.
+    
+    Signed-off-by: Adam Jackson <ajax@redhat.com>
+    Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit da099f0d2015831ea5f4a5d0740ed962aa4d5d8b
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Sun Sep 12 17:00:54 2010 -0400
+
+    Revert “Dolt-ify"
+    
+    Libtool’s is now sufficiently fast that DOLT is no longer
+    worth the bother, even on those few systems where is works.
+    
+    This reverts commit 3e9afd501e40d76040635bd9a3045bcaf5a03b60
+    and part of commit d31e644c65c52828ea3e7abd94a8cf9aee12265c.
+    
+    It conflicted with commit f6a4fd0c7615684d08e848245849dea4017a5214
+    which moved dolt from configure.ac to m4/dolt.m4.
+    
+    And it addresses: http://bugs.freedesktop.org/show_bug.cgi?id=28188
+    
+    Signed-off-by: James Cloos <cloos@jhcloos.com>
+
+commit 2661fbe6b809c937a60c2c1ca5ddb8280e399bd8
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Thu Sep 9 19:24:29 2010 -0700
+
+    XIM spec title page minor formatting cleanup
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit f99f1380bbf7bb2a0c491acad4a3d8db44bfd752
+Author: Jens Petersen <petersen@redhat.com>
+Date:   Mon Aug 23 18:08:10 2010 -0700
+
+    Bug 29773: aliases for nb_NO.utf8 and nn_NO.utf8
+    
+    <https://bugs.freedesktop.org/show_bug.cgi?id=29773>
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit b15b8a558ec64c834cc8f6a52d7f3c4f530c8c4b
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Fri Sep 3 23:11:53 2010 -0700
+
+    Sun's copyrights are now owned by Oracle
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 7742bf62b1fa652da4270587e280249945367cae
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Fri Sep 3 18:31:44 2010 -0700
+
+    libX11 1.3.99.901 (1.4.0 RC1)
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 5a02d6d74b5451d48d8f55709dfd4ecd3c068586
+Author: Jeroen Hoek <mail@jeroenhoek.nl>
+Date:   Sun Aug 29 09:47:06 2010 -0400
+
+    libX11/nls compose tables, add LATIN CAPITAL LETTER SHARP S
+    
+    Add LATIN CAPITAL LETTER SHARP S
+    (See https://bugs.freedesktop.org/show_bug.cgi?id=29448 for rationale)
+    
+    Signed-off-by: James Cloos <cloos@jhcloos.com>
+
+commit 09edc6de6619a2eabda3b808ebff4165550664f1
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Fri Aug 13 14:21:08 2010 -0400
+
+    config: remove man-pages configuration option
+    
+    This option was added in commit 6e752ea120 with no explanation.
+    The section number is provoded by XORG_MANPAGE_SECTIONS
+    There is no case where libX11 should be different than other libs
+    The option was also used to disable building of the man pages,
+    which build in 14 secs. No indication this is required.
+    
+    If there is a requirement from system builders to disable building
+    of man pages, it could be done consistently for all modules.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit f92e754297ec5fdb81068b56a4435026666224fa
+Author: Aaron Plattner <aplattner@nvidia.com>
+Date:   Sun Aug 15 21:51:38 2010 -0700
+
+    XOpenDisplay: save the correct display_name value
+    
+    The X Test Suite's XDisplayString test checks the invariant
+    XDisplayString(XOpenDisplay(str)) == str.  The Xlib XOpenDisplay violates this
+    invariant by expanding str to the canonical form "host:display.scrn" (unless
+    HAVE_LAUNCHD is set and it starts with "/tmp/launch").  E.g., this expands ":1"
+    to ":1.0":
+    
+      400|26 1 1 19:26:41|IC Start
+      200|26 1 19:26:41|TP Start
+      520|26 1 00032625 1 1|VSW5TESTSUITE PURPOSE 1
+      520|26 1 00032625 1 2|Assertion XDisplayString-1.(A)
+      520|26 1 00032625 1 3|A call to XDisplayString returns the string that was used
+      520|26 1 00032625 1 4|as the argument to the XOpenDisplay call that returned the
+      520|26 1 00032625 1 5|value used as the display argument.
+      520|26 1 00032625 1 6|METH: Open a connection using XOpenDisplay.
+      520|26 1 00032625 1 7|METH: Obtain the display string using XDisplayString.
+      520|26 1 00032625 1 8|METH: Verify that the value of the string is the parameter used in XOpenDisplay.
+      520|26 1 00032625 1 9|METH: Close the display using XCloseDisplay.
+      520|26 1 00032625 1 10|REPORT: XDisplayString() returned ":1.0" instead of ":1".
+      220|26 1 1 19:26:41|FAIL
+      410|26 1 1 19:26:41|IC End
+    
+    Fix this by deleting all of the code to construct the canonical path and just
+    stashing a copy of the original display_name in dpy->display_name.
+    
+    Signed-off-by: Aaron Plattner <aplattner@nvidia.com>
+    Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit 1dc401f678469d0235e6d0b28eb4356f03327c9f
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Fri Aug 13 13:06:51 2010 -0400
+
+    man: xkb: remove unused variable LIB_MAN_DIR_SUFFIX
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit cbe9eebd11e5ebab4280d25b57b4cd4001241619
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Fri Aug 13 11:42:29 2010 -0400
+
+    man: simplify building of shadow man pages
+    
+    Store the shadow files in git as any other man page.
+    Move man pages to man dir and use the common 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 bfd899c9af2318ecbe84cb69007dba4223fdb502
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Mon Aug 9 09:39:26 2010 -0400
+
+    config: reinstate XORG_PROG_RAWCPP erroneoulsy removed
+    
+    in commit 76e07ef6911734eac418e399b114f1b544512736.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 76e07ef6911734eac418e399b114f1b544512736
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Fri Aug 6 14:01:51 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 4b8ff7db39f2fe7ef12968d462aaf3f9054b6c18
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Fri Aug 6 15:51:56 2010 -0700
+
+    Fix use-after-free in _XReply on X errors.
+    
+    _XReply would always call dequeue_pending_request on errors.  When it
+    got an error for the current request, it would call dequeue, then break
+    out of the loop; then, if it had an error in the event queue, it would
+    compare it with the sequence number of the now-freed pending request.
+    _XReply already stored that sequence number in dpy->last_request_read
+    before freeing it, so look at that instead.
+    
+    Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=29412
+    
+    Signed-off-by: Jamey Sharp <jamey@minilop.net>
+    Signed-off-by: Josh Triplett <josh@joshtriplett.org>
+
+commit 9fa146b30046396b70d64986e50d6617b3a8ac48
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Sat Jul 31 16:15:35 2010 -0400
+
+    specs: xsl stylesheet requires abs path to images
+    
+    Using abs_builddir requires automake 1.10 or later.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit a8727d4bc39015e303b4128d0ad8aaf6d5fc9f0a
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Sun Aug 1 14:13:07 2010 -0400
+
+    specs: update .gitignore now that all groff generated files are gone
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit f70527f05677aaf6a493ba42d2d95f738aaebafa
+Author: Adam Jackson <ajax@redhat.com>
+Date:   Thu Jul 29 11:11:21 2010 -0400
+
+    nls: Switch one of the interrobang sequences to gnaborretni
+    
+    Since gnaborretni is primarily used in LTR locales, the ? part of the
+    sequence reflects the position of the bulge in the ?.  When scanning an
+    inverted interrobang left-to-right, you see the bulge first, so the
+    compose sequence ?! is used; upright interrobang shows the bulge
+    last, so it's !?.
+    
+    This is a change in behaviour, but I was unable to come up with anything
+    better.  ??!! or !!?? would match the patterns for ¿ and ¡, but they
+    would delay evaluation of them; "¿Qué?" wouldn't show the ¿ until you hit
+    Q.  Likewise ?!?! and !?!? would delay showing the interrobang itself.
+    ~!? and ~?! were considered but are arguably less intuitive.
+    
+    Reviewed-by: James Cloos <cloos@jhcloos.com>
+    Signed-off-by: Adam Jackson <ajax@redhat.com>
+
+commit 511c4f6d29b2da4f71093feabcbb3913cb5d12a7
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Wed Jul 28 10:27:39 2010 -0400
+
+    specs: move indexterm from glossdef to glossterm
+    
+    This move fixes a Java class cast exception in the glossary.
+    The problem was introduced in commit
+    26f4f0d50840fe5ba4c46aae0a8e68db0059434b
+    
+    It may not happen on all versions of the doc toolchain.
+    There is no reason why indexterm cannot appear in glossdef,
+    this is a workaround to an implementation problem found by
+    trial and error.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 87a108f3aa565aa803dacb3a53b811f45025b609
+Author: Matt Dew <matt@osource.org>
+Date:   Sat Jul 24 14:46:57 2010 -0400
+
+    specs: replace troff source with docbook-xml source
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 8e603413586ff42b1351688f6f99318cbe243bca
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Sat Jul 24 22:13:07 2010 +0200
+
+    Compose.man: default user compose file is .XCompose, not .Xcompose
+    
+    The path was correct in the DESCRIPTION section, but not in FILES.
+    
+    Signed-off-by: Julien Cristau <jcristau@debian.org>
+
+commit 554da76ece85d0fc0cada45a86860e69c2107e9a
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Tue Jul 20 12:34:48 2010 +0100
+
+    NLS: Add \o/ Compose sequence
+    
+    Unicode is even more pointlessly awesome! Add a binding for Compose-\o/
+    to U+1F64C PERSON RAISING BOTH HANDS IN CELEBRATION.
+    
+    Signed-off-by: Daniel Stone <daniel@fooishbar.org>
+
+commit 2e7a18b6a617b9b4bfcea2d36f2bd2d7e0c4a3dd
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Fri Jul 9 18:13:13 2010 +0100
+
+    XStringToKeysym: Cope with 0x1234cafe-style input
+    
+    If we get input in the style of 0xdeadbeef, just return that exact
+    keysym.  Introduces a dependency on strtoul, which I'm told is OK on all
+    the systems we care about.
+    
+    Signed-off-by: Daniel Stone <daniel@fooishbar.org>
+
+commit 3df45ed0c29b98ff468a0ff0ba24830bb664fd5a
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Mon Jul 19 17:58:27 2010 -0700
+
+    specs/libX11: Fix column count of Gravity Attributes table
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 53bcba0d1d2dc3fd5e0de4bae3da30a1aa31a0c4
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Mon Jul 19 14:43:38 2010 -0700
+
+    specs/libX11: Convert \- to &minus; and \^ to either &hairsp; or removed
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 5a0b45275638281e1bb2ae7d3e16b98e6470dae9
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Mon Jul 19 11:28:50 2010 -0700
+
+    specs/libX11: Manual cleanup pass over Ch. 1
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 21567992958a6f12b3d0186f2f27a5b2a41b8448
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Mon Jul 19 14:51:10 2010 -0700
+
+    specs/libX11: make sure all files have DOCTYPEs so standard entities work
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit c944a8521f5760b485192658b921145159cdb439
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Sun Jul 18 13:12:20 2010 -0700
+
+    specs/libX11: Fix up list of header files in Ch.1 & add index entries
+    
+    Combination of manual editing and automatic substitution via:
+    
+    perl -i -p -00 -e 's{<varlistentry>(\s+)<term>&lt;X11/([^&]+)&gt;</term>(\s+)<listitem>(\s+)<para>}{<varlistentry id="Standard_Header_Files:$2">$1<term><filename class="headerfile">&lt;X11/$2&gt;</filename></term>$3<listitem>$4<indexterm type="file"><primary><filename class="headerfile">X11/$2</filename></primary></indexterm>$4<indexterm><primary>Files</primary><secondary>&lt;X11/$2&gt;</secondary></indexterm>$4<indexterm><primary>Headers</primary><secondary>&lt;X11/$2&gt;</secondary></indexterm>$4<para>}g' CH01.xml
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit bb66e8f1ce330043278d3e8cbc7d5d3bc56ee030
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Sun Jul 18 12:47:27 2010 -0700
+
+    specs/libX11: Add indexterms for headerfiles that .hN used to provide
+    
+    Automatic substitution performed via:
+    perl -i -p -e 's{^&lt;<filename class="headerfile">([^<]+)</filename>&gt;(.*)$}{<filename class="headerfile">&lt;$1&gt;</filename>$2\n<indexterm type="file"><primary><filename class="headerfile">$1</filename></primary></indexterm>\n<indexterm><primary>Files</primary><secondary><filename class="headerfile">&lt;$1&gt;</filename></secondary></indexterm>\n<indexterm><primary>Headers</primary><secondary><filename class="headerfile">&lt;$1&gt;</filename></secondary></indexterm>}' *.xml
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit d0b0d215cb85da48b323b1392149ce181e7ef5ec
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Fri Jul 16 21:15:13 2010 -0700
+
+    specs/libX11: convert multicolumn lists from tables to <simplelist>
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit e679f80c6210c0aefe3669f8f536353619097a4b
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Fri Jul 16 20:51:52 2010 -0700
+
+    specs/libX11: Tag WM_* as <property>
+    
+    Mass substitution done by:
+     perl -i -p -e 'if ($_ !~ m{^\<}) { $_ =~ s{(WM_\w+)}{<property>$1</property>}g; }' *.xml
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit c7b7e59b3b22221d0be6286c540001c360308f69
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Fri Jul 16 20:41:33 2010 -0700
+
+    specs/libX11: Convert simpler eqn markup to docbook tags
+    
+    Mostly "sup" to <superscript>
+    
+    There's several more complicated equations that will probably need
+    MathML or SVG to solve.
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 897486c54c6a54771867d667441aaf9a4b9c35ca
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Fri Jul 16 00:50:39 2010 -0700
+
+    specs/libX11: App. D: convert literallayouts to synopsis or programlisting
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 692906c3b3d8aa8b8927fbc230c3050d633785d2
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Fri Jul 16 00:36:43 2010 -0700
+
+    specs/libX11: Fix section headers in Appendix D
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit bcc41baa02e137884d847aec0f3ff8ca5c85c32f
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Wed Jul 14 07:22:26 2010 -0700
+
+    specs/libX11: Explicitly tag document as English
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 6783544706ff370e900c137f951e90230586d6dc
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Mon Jul 12 22:03:18 2010 -0700
+
+    specs/libX11: Appendix C: convert literallayouts to synopsis or programlisting
+    
+    Fixes display of a bunch of function prototypes and sample code
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 8834cd9285e6aaf437aee56292c508d99a090fa9
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Mon Jul 12 18:37:16 2010 -0700
+
+    xmlrules.in: Add chunked-html rule to manually generate smaller files
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 53f78680c34ebc94ce26b5e14c2a0003435cf10d
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Mon Jul 12 18:35:59 2010 -0700
+
+    specs/libX11: Convert Appendix A tables to real tables
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 705a1257a8a47f4a1f94979aee09a837500ede7d
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Mon Jul 12 18:38:09 2010 -0700
+
+    specs/libX11: Fix out-of-place text in Chapter 1
+    
+    DTD violation error introduced in 89cc2e02e7c29ef9a02f0cfdf2090a2934f539e4
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit a151346a2b7810e988f1de4b1e00b37672dc587a
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Mon Jul 12 16:52:12 2010 -0700
+
+    launchd: Explicitly search /sbin
+    
+    Previously, launchd wasn't found if /sbin wasn't in the user's PATH.
+    https://bugs.freedesktop.org/show_bug.cgi?id=29028
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit 89cc2e02e7c29ef9a02f0cfdf2090a2934f539e4
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Mon Jul 12 13:38:04 2010 -0700
+
+    Replace untranslated .hN macros with <filename> tags to show header names
+    
+    Translation performed by:
+     perl -i -p -e 's{\<\!-- .hN (\S+) (\S+)?\s*-->}
+                {&lt;<filename class="headerfile">$1</filename>&gt;$2}' *.xml
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 75480440946603b8efdbbf78b88d59c641b6d2c8
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Sat Jul 10 00:06:13 2010 -0700
+
+    specs/libX11: Mass substitution of <function> tags with more specific tags
+    
+    Matched names from X headers & "nm libX11.so" output to names in spec to
+    map to more specific tags.   Tags used:
+    
+                        <code>   code fragments
+                    <constant>   enum values
+                   <errorname>   X protocol errors
+                    <filename>   filenames
+                    <function>   functions
+                    <function>   function-like macros (#define foo(a,b)...)
+                 <returnvalue>   function return codes
+                 <structfield>   struct members
+                  <structname>   struct names (even when typedefed)
+                      <symbol>   simple value #defines (#define NAME value)
+                  <systemitem>   X protocol requests
+    <systemitem class="event">   X protocol events
+                        <type>   non-struct typedefs
+                     <varname>   global variables
+    
+    (Also fixed a couple typos detected by failures of this matching, such as
+     XESSetPrintErrorValues -> XESetPrintErrorValues.)
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 26f4f0d50840fe5ba4c46aae0a8e68db0059434b
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Fri Jul 9 00:37:23 2010 -0700
+
+    specs/libX11: Glossary cross-reference links
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 930b52d84031de0e15e0a11cf4ecfd3b2f59e073
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Thu Jul 8 21:19:08 2010 -0700
+
+    specs/libX11: Make whitespace around <function> tags more uniform
+    
+    Simplifies regular expressions for further mass substitutions.
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 730ce6b8aca77b77385aa894d234cbde5fcbce37
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Fri Jul 9 20:10:37 2010 -0400
+
+    specs: use pattern rules rather than suffix rules
+    
+    This allows target to rebuild when included .xml files are changed.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 5527b4bc8ce7de60123eb28789ddef54aa48a378
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Thu Jul 8 20:56:41 2010 -0700
+
+    specs/libX11: Move punctuation outside of the <function> tags
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit d66d2134dfc38cd866c7c2d9ea45ed4b4dad23f0
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Thu Jul 8 20:42:50 2010 -0700
+
+    specs/libX11: Mark a number of <acronym>s
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit d5bbb12f55ac9f691eab6242cedc53207275131b
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Thu Jul 8 19:31:36 2010 -0700
+
+    specs/libX11: Glossary terms should not be marked as functions
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 5decf7bc5dae0ae0c45c47eaaa9c4fdf9515ca1c
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Thu Jul 8 19:28:18 2010 -0700
+
+    specs/libX11: Clean up author list & acknowledgements a little
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 0cd29bdb332c333e5123dce65b25ad1d97fbdae3
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Thu Jul 8 17:30:34 2010 -0700
+
+    specs/libX11: Convert troff .IN macros to docbook <indexterm> tags
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit a67d99ccbe22c8ce5f7a12f13b8991d9e0cf4491
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Thu Jul 8 17:29:21 2010 -0400
+
+    specs: specdir is required to install xml files
+    
+    The source is installed as well as the targets.
+    This failed when configuring with --without-xmlto
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit e14273f44c1501ab51db4adcb83b18a1073787d8
+Author: Matt Dew <matt@osource.org>
+Date:   Thu Jul 8 14:42:32 2010 -0400
+
+    specs: replace troff source with docbook-xml source
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit bea0873caf50e9ed1b89255775d9ab912cbecd45
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Thu Jul 8 16:49:51 2010 +0100
+
+    XStringToKeysym: Check strdup() return value
+    
+    Signed-off-by: Daniel Stone <daniel@fooishbar.org>
+    Reviewed-by: Keith Packard <keithp@keithp.com>
+
+commit cffa71b4a5743e2b6675b9a917d15aef4177d513
+Author: Marko Myllynen <myllynen@redhat.com>
+Date:   Mon Jun 28 15:08:05 2010 +0300
+
+    Fix two typos in SFS 5966 Annex 3
+    
+    X.Org bug#28792 <https://bugs.freedesktop.org/show_bug.cgi?id=28792>
+    
+    Signed-off-by: Julien Cristau <jcristau@debian.org>
+
+commit eb023c0f8919e809b8b609e1467b14d20a290aa7
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Tue Jun 15 18:49:43 2010 +0100
+
+    Delete now-redundant XKeysymDB
+    
+    Since XStringToKeysym now supports all the vendor keysyms, just delete
+    our XKeysymDB, which was incomplete at best, misleading at worst, and
+    always an annoyance.
+    
+    Signed-off-by: Daniel Stone <daniel@fooishbar.org>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 00175397480b76d32bf82b0c7c94c91a2a95954e
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Tue Jun 15 18:48:48 2010 +0100
+
+    makekeys: Scan vendor keysyms as well as core
+    
+    Since we can't really live without vendor keysyms, scan them all in to
+    generate ks_tables.h, rather than only doing the core ones, and leaving
+    the vendor syms to be manually synchronised with XKeysymDB.
+    
+    Signed-off-by: Daniel Stone <daniel@fooishbar.org>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit ebd6ef0a4db0ddef0ae17ad14571518ccdeea5ba
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Tue Jun 15 18:47:37 2010 +0100
+
+    XStringToKeysym: Special case for XF86 keysyms
+    
+    Some XFree86 keysyms were in XKeysymDB as XF86_foo, despite really being
+    XF86foo.  So, if we get to the bottom of XStringToKeysym and haven't
+    found our XF86_foo, try it again as XF86foo.
+    
+    Signed-off-by: Daniel Stone <daniel@fooishbar.org>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 8c2ffce9e5c6eef8a04f7e2732db46b3b62e13bb
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Tue Jun 15 17:20:48 2010 +0100
+
+    configure.ac: Change from deprecated AC_DEFINE_DIR to AX_
+    
+    AC_DEFINE_DIR is deprecated as it's squatting on the autoconf-builtin
+    namespace, so start using the more proper AX_DEFINE_DIR instead.
+    
+    Signed-off-by: Daniel Stone <daniel@fooishbar.org>
+    Reviewed-by: Gaetan Nadon <memsize@videotron.ca>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 6de368c9aa7ccd2fcd62fca5a2b278913db4d03d
+Author: Fernando Carrijo <fcarrijo@yahoo.com.br>
+Date:   Thu Jul 1 06:50:47 2010 -0300
+
+    Purge macros NEED_EVENTS and NEED_REPLIES
+    
+    Signed-off-by: Fernando Carrijo <fcarrijo@yahoo.com.br>
+    Acked-by: Tiago Vignatti <tiago.vignatti@nokia.com>
+    Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 0b724231be17f19538ee115a03b82b221b1f83c0
+Author: Adam Jackson <ajax@redhat.com>
+Date:   Wed Jun 30 16:30:49 2010 -0400
+
+    Use -version-number consistently instead of -version-info
+    
+    The latter is libtool braindamage.
+    
+    Signed-off-by: Adam Jackson <ajax@redhat.com>
+
+commit 241a990afcf9c967c587ad6fd245df21b68b1ad9
+Author: Juliusz Chroboczek <jch@pps.jussieu.fr>
+Date:   Tue Jun 29 18:32:42 2010 +0200
+
+    Make Compose-comma map to ogonek for I and U in UTF-8 locales.
+    
+    With the preceding patch, it makes the UTF-8 compose map consistent with
+    the ISO 8859-4 and -13 maps.
+
+commit af55e582f485a668c2bf43129be972bc65f03c60
+Author: Juliusz Chroboczek <jch@pps.jussieu.fr>
+Date:   Tue Jun 29 18:20:18 2010 +0200
+
+    Make Compose-comma map to Ogonek for A and E in UTF-8 locales.
+    
+    This makes the UTF-8 compose file consistent with the ISO 8859-2 compose file
+    as far as Polish is concerned.  We only sacrifice one pair of characters,
+    e-cedilla, which is not used in any language.
+
+commit d6ba13009fc9ef876a104b907ffef73c6e405d4b
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Thu Jun 24 13:13:11 2010 -0700
+
+    Define FILE_MAN_DIR_SUFFIX so XCompose shadow page has correct path
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 978c7238789037de917b9423ea9adfb006da1260
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Sat Jun 19 10:44:55 2010 -0700
+
+    poll_for_response: Really handle xcb_poll_for_reply getting a reply.
+    
+    Don't lose async replies. That's bad.
+    
+    `xlsfonts -l`, which uses XListFontsWithInfo, worked fine, because the
+    _XReply path worked; that path waited for replies, rather than polling.
+    
+    However, XRecordProcessReplies, which does nothing but call XPending,
+    relied on the event-handling path to process async replies, and that was
+    busted.
+    
+    Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=28595
+    
+    Signed-off-by: Jamey Sharp <jamey@minilop.net>
+
+commit ef67486c5a8aada24fd95b2991a3c4979f53805f
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Mon Jun 21 13:34:15 2010 -0700
+
+    Revert "xcb_io.c: poll_for_response doesn't guarantee there's a pending request."
+    
+    This reverts commit 4a8b6528ff69f6feb8c0e119939b4ce6c088f29e, because as
+    a matter of fact, if poll_for_response returns NULL when we know
+    dpy->xcb->next_event is non-NULL, there *is* guaranteed to be a pending
+    request.
+
+commit 301ec5b41e9d253a446db656e1789ac7345dc433
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Mon Jun 21 13:24:24 2010 -0700
+
+    Revert "poll_for_response: Really handle xcb_poll_for_reply getting a reply."
+    
+    This reverts commit c115095d7f2bc4f5a4fb26380e3698fefdad7611. We *do*
+    need to check poll_for_event every time through the loop in
+    poll_for_response, so the commit did too much.
+
+commit 4a8b6528ff69f6feb8c0e119939b4ce6c088f29e
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Mon Jun 21 10:54:02 2010 -0700
+
+    xcb_io.c: poll_for_response doesn't guarantee there's a pending request.
+    
+    Fixes the second bug reported in:
+    https://bugs.freedesktop.org/show_bug.cgi?id=28595
+    
+    Signed-off-by: Jamey Sharp <jamey@minilop.net>
+
+commit c115095d7f2bc4f5a4fb26380e3698fefdad7611
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Sat Jun 19 10:44:55 2010 -0700
+
+    poll_for_response: Really handle xcb_poll_for_reply getting a reply.
+    
+    Don't lose async replies. That's bad.
+    
+    `xlsfonts -l`, which uses XListFontsWithInfo, worked fine, because the
+    _XReply path worked; that path waited for replies, rather than polling.
+    
+    However, XRecordProcessReplies, which does nothing but call XPending,
+    relied on the event-handling path to process async replies, and that was
+    busted.
+    
+    Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=28595
+    
+    Signed-off-by: Jamey Sharp <jamey@minilop.net>
+    Signed-off-by: Josh Triplett <josh@joshtriplett.org>
+
+commit a25ae169862ab9b76daf259613b37c6b07bc2ef2
+Author: Marko Myllynen <myllynen@redhat.com>
+Date:   Sun Jun 13 19:23:05 2010 +0300
+
+    Implement SFS 5966 Annex 4 for Finland
+    
+    This patch adds Annex 4 of SFS 5966 for Finland and fixes two typos in
+    Annex 3 (which were actually copied verbatim from the standard text).
+    
+    The implementation of the standard is now complete.
+    
+    X.Org bug#28498 <https://bugs.freedesktop.org/show_bug.cgi?id=28498>
+    
+    Signed-off-by: Julien Cristau <jcristau@debian.org>
+
+commit 47b04195d8a31c8f9e6dd804196162c6cfca3ac6
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Fri Jun 4 13:20:17 2010 -0700
+
+    LINEAR_RGB_InitSCCData: When malloc fails, don't try to free unallocated bits
+    
+    One of the malloc failure checks had a goto to the wrong spot in the
+    list of cleanup free() calls to unwind at the end, and was freeing
+    bits that hadn't been initialized/allocated yet, since they would be
+    stored in the struct that just failed to be allocated.
+    
+    Error: Null pointer dereference (CWE 476)
+       Read from pointer that could be constant 'NULL'
+            at line 805 of /export/alanc/X.Org/sx86/lib/libX11/src/xcms/LRGB.c in function 'LINEAR_RGB_InitSCCData'.
+              Pointer checked against constant 'NULL' at line 754 but does not protect the dereference.
+    
+    [ This bug was found by the Parfait bug checking tool.
+      For more information see http://research.sun.com/projects/parfait ]
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit aebbf3623888119b43893b253195d93b613a6e1e
+Author: Josh Triplett <josh@joshtriplett.org>
+Date:   Sun Jun 6 19:11:55 2010 -0700
+
+    Mark the rest of Xprivate.h as _X_HIDDEN.
+    
+    None of the functions in Xprivate.h should have any callers outside of
+    Xlib, by definition.
+    
+    Signed-off-by: Josh Triplett <josh@joshtriplett.org>
+    Suggested-by: Jamey Sharp <jamey@minilop.net>
+    Reviewed-by: Jamey Sharp <jamey@minilop.net>
+
+commit abcd1b67c8135ad652833e5a60d818837c39fce1
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Fri Jun 4 13:57:45 2010 +0200
+
+    Hide _XSeqSyncFunction
+    
+    Commit a6d974dc59f2722b36e2df9d4f07aeee4f83ce43 made _XSeqSyncFunction
+    non-static, but we don't need to export it.
+    
+    Signed-off-by: Julien Cristau <jcristau@debian.org>
+    Reviewed-by: Adam Jackson <ajax@redhat.com>
+    Reviewed-by: Jamey Sharp <jamey@minilop.net>
+
+commit 15e5eaf62897b3179d1fbe457cb19f886f0449f8
+Author: Josh Triplett <josh@joshtriplett.org>
+Date:   Thu Jun 3 09:41:01 2010 -0700
+
+    Remove support for building without XCB
+    
+    And there was much rejoicing.
+    
+    Signed-off-by: Josh Triplett <josh@joshtriplett.org>
+    Reviewed-by: Jamey Sharp <jamey@minilop.net>
+    
+    Consensus on #xorg-devel agrees with removing --without-xcb; in
+    particular, acks from Adam Jackson, Daniel Stone, Kristian Høgsberg,
+    Julien Cristau, and Rémi Cardona.
+
+commit fb19eb767a32fd4ff74021c51bc6f60eb8bdff74
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Thu Jun 3 15:21:40 2010 -0700
+
+    libX11 1.3.4
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 8f3db40ca5108a919244f3fff7466d01a14b3ce2
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Thu Jun 3 13:08:17 2010 -0700
+
+    Workaround bug in groff flag processing that breaks distcheck
+    
+    At least with the groff 1.19.2 package I have installed, groff passes
+    on the -I flags for the include path to grohtml, which if they come
+    after the -P-I... flag we pass to grohtml to specify the image file
+    name pattern cause it to override that flag and put the images in
+    the wrong place, breaking "make distcheck" - changing the flag order
+    works around this.
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit bdb31a1fb707cebccc9efbbf68cb55c10fa4ea3e
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Thu Jun 3 11:25:33 2010 -0700
+
+    Fix typo that made configure always report "none" for man page suffix
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 6bb7d2d21d6b58019fb37b724b59c9744f30b9ce
+Author: Paul Bender <pebender@gmail.com>
+Date:   Thu Jun 3 11:20:26 2010 -0700
+
+    Bug 22591 - configure does not obey the --enable-*-transport options
+    
+    https://bugs.freedesktop.org/show_bug.cgi?id=22591
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit d7f35946d673bb00f2768e025b6e1017422b2174
+Author: Paul Bender <pebender@gmail.com>
+Date:   Thu Jun 3 11:17:45 2010 -0700
+
+    Bug 22590 - libX11 1.2.1 has broken abstract namespace support
+    
+    https://bugs.freedesktop.org/show_bug.cgi?id=22590
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit b2487d07f7b355f230a56e32c763acd08862735c
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Thu Jun 3 11:06:15 2010 -0700
+
+    Bug 22584 - libX11 does not cross compile
+    
+    Adaptation of patch submitted by Paul Bender in attachment 27301 to
+    https://bugs.freedesktop.org/show_bug.cgi?id=22584
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+    Reviewed-by: Mikhail Gusarov <dottedmag@dottedmag.net>
+    Reviewed-by: Dan Nicholson <dbn.lists@gmail.com>
+
+commit 4378219ff8c1418418c70086085358b69d574e74
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Tue Jun 1 18:55:48 2010 -0700
+
+    Clarify requirements in XRestackWindows man page
+    
+    The required common parent window is not specified in the arguments,
+    just implied as the parent of the first window in the list.
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit f09c5299a381e2729e800a0ac43f1c0e371f65f6
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Wed May 12 16:42:18 2010 -0700
+
+    xcb: Add TCP fallback
+    
+    If we fail to connect to a UNIX socket and the transport isn't specified,
+    fallback on TCP.  This matches behavior with the xtrans codepath and the
+    Xlib spec.
+    
+    http://lists.x.org/archives/xorg-devel/2010-April/007915.html
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+    Reviewed-by: Jamey Sharp <jamey@minilop.net>
+
+commit fd82552d5c0ce1931f29006a0c36f5e03cf8577e
+Merge: aae2a4a 933aee1
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Mon May 10 16:51:24 2010 -0700
+
+    Merge branch 'xlib-xcb-thread-fixes'
+
+commit aae2a4a7aab26de3fa715d6ecd0a0e0926b37fc9
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Fri Apr 23 21:50:29 2010 -0700
+
+    Don't append the screen number when using a launchd socket
+    
+    ssh gets confused by this.  XQuartz is the only DDX using this
+    functionality, and it doesn't support different screens, so
+    let's just not include this until most ssh know how to handle
+    this.
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit adcd0ec209abf832a769d52db660fb37eaad6e0c
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Fri Apr 23 16:33:44 2010 -0700
+
+    Remove launchd logic from _XConnectXCB as it's handled in XCB
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit d232b259c36fdde1f4179822809fec1480867dc5
+Author: Jeremy Huddleston <jeremyhu@apple.com>
+Date:   Tue Feb 2 17:01:28 2010 -0800
+
+    Fix various build warnings
+    
+    imLcIm.c: In function '_XimCachedFileName':
+    imLcIm.c:361: warning: format '%03x' expects type 'unsigned int', but argument 8 has type 'long unsigned int'
+    imLcIm.c:364: warning: format '%03x' expects type 'unsigned int', but argument 8 has type 'long unsigned int'
+    
+    imRm.c: In function '_XimDefaultArea':
+    imRm.c:597: warning: cast from pointer to integer of different size
+    imRm.c: In function '_XimDefaultColormap':
+    imRm.c:626: warning: cast from pointer to integer of different size
+    
+    lcFile.c:224: warning: no previous prototype for 'xlocaledir'
+    
+    lcUTF8.c: In function 'iconv_cstombs':
+    lcUTF8.c:1841: warning: assignment discards qualifiers from pointer target type
+    lcUTF8.c:1869: warning: pointer targets in passing argument 1 of 'wctomb' differ in signedness
+    lcUTF8.c:1873: warning: pointer targets in passing argument 1 of 'wctomb' differ in signedness
+    lcUTF8.c: In function 'iconv_mbstocs':
+    lcUTF8.c:1935: warning: pointer targets in passing argument 2 of 'mbtowc' differ in signedness
+    lcUTF8.c: In function 'iconv_mbtocs':
+    lcUTF8.c:2031: warning: pointer targets in passing argument 2 of 'mbtowc' differ in signedness
+    lcUTF8.c: In function 'iconv_mbstostr':
+    lcUTF8.c:2121: warning: pointer targets in passing argument 2 of 'mbtowc' differ in signedness
+    lcUTF8.c: In function 'iconv_strtombs':
+    lcUTF8.c:2180: warning: pointer targets in passing argument 1 of 'wctomb' differ in signedness
+    lcUTF8.c: In function '_XlcAddGB18030LocaleConverters':
+    lcUTF8.c:2367: warning: passing argument 5 of '_XlcSetConverter' from incompatible pointer type
+    lcUTF8.c:2368: warning: passing argument 5 of '_XlcSetConverter' from incompatible pointer type
+    lcUTF8.c:2373: warning: passing argument 5 of '_XlcSetConverter' from incompatible pointer type
+    lcUTF8.c:2374: warning: passing argument 5 of '_XlcSetConverter' from incompatible pointer type
+    lcUTF8.c:2375: warning: passing argument 5 of '_XlcSetConverter' from incompatible pointer type
+    lcUTF8.c:2376: warning: passing argument 5 of '_XlcSetConverter' from incompatible pointer type
+    lcUTF8.c:2377: warning: passing argument 5 of '_XlcSetConverter' from incompatible pointer type
+    
+    XlibInt.c: In function '_XGetHostname':
+    XlibInt.c:3441: warning: implicit declaration of function 'gethostname'
+    XlibInt.c:3441: warning: nested extern declaration of 'gethostname'
+    
+    ConnDis.c: In function '_XDisconnectDisplay':
+    ConnDis.c:540: warning: old-style function definition
+    ConnDis.c: In function '_XSendClientPrefix':
+    ConnDis.c:554: warning: old-style function definition
+    ConnDis.c: In function 'XSetAuthorization':
+    ConnDis.c:677: warning: old-style function definition
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@apple.com>
+
+commit 3e11c73187acb2e2be9a812840bbbea947527ccb
+Author: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
+Date:   Fri Apr 23 00:01:54 2010 +0200
+
+    Allow X11 users to compose anarchism
+    
+    I can easily compose the hammer and sickle (the symbol representative
+    of communism) by pressing the key sequence:
+    
+      <Compose> <C> <C> <C> <P> -> ☭
+    
+    But i can't easily make the circled A (the symbol representative of
+    anarchism).
+    
+    I'd like to be able to use <Compose> <O> <A> (this is a
+    currently unused key sequence) to generate the symbol:  Ⓐ
+    
+    Debian bug#555938 <http://bugs.debian.org/555938>
+    
+    Signed-off-by: Julien Cristau <jcristau@debian.org>
+
+commit 933aee1d5c53b0cc7d608011a29188b594c8d70b
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Fri Apr 16 20:18:28 2010 -0700
+
+    Fix Xlib/XCB for multi-threaded applications (with caveats).
+    
+    Rather than trying to group all response processing in one monolithic
+    process_responses function, let _XEventsQueued, _XReadEvents, and
+    _XReply each do their own thing with a minimum of code that can all be
+    reasoned about independently.
+    
+    Tested with `ico -threads 20`, which seems to be able to make many
+    icosahedrons dance at once quite nicely now.
+    
+    Caveats:
+    
+    - Anything that was not thread-safe in Xlib before XCB probably still
+      isn't. XListFontsWithInfo, for instance.
+    
+    - If one thread is waiting for events and another thread tries to read a
+      reply, both will hang until an event arrives. Previously, if this
+      happened it might work sometimes, but otherwise would trigger either
+      an assertion failure or a permanent hang.
+    
+    - Versions of libxcb up to and including 1.6 have a bug that can cause
+      xcb_wait_for_event or xcb_wait_for_reply to hang if they run
+      concurrently with xcb_writev or other writers. So you'll want that fix
+      as well.
+    
+    Signed-off-by: Jamey Sharp <jamey@minilop.net>
+    Reviewed-by: Josh Triplett <josh@freedesktop.org>
+
+commit aab43278ae619eb57d2dd9c7396f460f078588fc
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Fri Apr 16 22:24:16 2010 -0700
+
+    Use InternalLockDisplay on code paths called from LockDisplay.
+    
+    It's easier to reason about the code when we can't re-enter the
+    Xlib-private sync-handlers while they're already running.
+    
+    Signed-off-by: Jamey Sharp <jamey@minilop.net>
+    Reviewed-by: Josh Triplett <josh@freedesktop.org>
+
+commit 660b7d05f4ca4ab4661c9fe7ce655a4909b4e556
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Fri Apr 16 19:45:11 2010 -0700
+
+    Fix _XSend to enqueue the right range of pending requests.
+    
+    _XSend was off-by-one on both ends. It should not re-enqueue the last
+    request that was already flushed, but it should enqueue the last request
+    currently being flushed.
+    
+    Signed-off-by: Jamey Sharp <jamey@minilop.net>
+    Reviewed-by: Josh Triplett <josh@freedesktop.org>
+
+commit f2735889908d6e5a7f8dbee42f00c54a52665191
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Fri Apr 16 19:45:11 2010 -0700
+
+    Pending requests are always added in-order.
+    
+    Replace insert_pending_request, which did an in-order search of the
+    queue to find the right insertion point, with a simpler
+    append_pending_request, and use that in _XSend as well.
+    
+    Includes assertions to check that the list of pending requests is in
+    order by sequence number and does not have duplicates.
+    
+    Signed-off-by: Jamey Sharp <jamey@minilop.net>
+    Reviewed-by: Josh Triplett <josh@freedesktop.org>
+
+commit d9cf5885b0f97942fbbd2a7cc50118132ece50f6
+Author: Markus Duft <markus.duft@salomon.at>
+Date:   Fri Apr 16 08:39:34 2010 -0700
+
+    Bug 26839: Fix build problem on Interix (POSIX layer on Windows)
+    
+    https://bugs.freedesktop.org/show_bug.cgi?id=26839
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit a3f5f1b90936d23e9894e3261b2d77fb7b32a51a
+Author: Josh Triplett <josh@freedesktop.org>
+Date:   Thu Apr 15 14:24:21 2010 -0700
+
+    Stop returning an int from _XIDHandler and _XSeqSyncFunction
+    
+    _XIDHandler and _XSeqSyncFunction originally ran from dpy->synchandler, and
+    thus had to return an int.  Now, they only run from _XPrivSyncHandler or
+    LockDisplay, neither of which needs to check their return value since they
+    always returned 0.  Make them both void.
+    
+    Signed-off-by: Josh Triplett <josh@freedesktop.org>
+    Signed-off-by: Jamey Sharp <jamey@minilop.net>
+
+commit a6d974dc59f2722b36e2df9d4f07aeee4f83ce43
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Thu Apr 15 13:05:08 2010 -0700
+
+    Move XID and sync handling from SyncHandle to LockDisplay to fix races.
+    
+    XID and sync handling happened via _XPrivSyncHandler, assigned to
+    dpy->synchandler and called from SyncHandle.  _XPrivSyncHandler thus ran
+    without the Display lock, so manipulating the Display caused races, and
+    these races led to assertions in multithreaded code (demonstrated via
+    ico).
+    
+    In the XTHREADS case, after you've called XInitThreads, we can hook
+    LockDisplay and UnlockDisplay.  Use that to run _XIDHandler and
+    _XSeqSyncHandler from LockDisplay rather than SyncHandle; we then know
+    that we hold the lock, and thus we can avoid races.  We think it makes
+    sense to do these both from LockDisplay rather than UnlockDisplay, so
+    that you know you have valid sync and a valid XID before you start
+    setting up the request you locked to prepare.
+    
+    In the !XTHREADS case, or if you haven't called XInitThreads, you don't
+    get to use Xlib from multiple threads, so we can use the logic we have
+    now (with synchandler and savedsynchandler) without any concern about
+    races.
+    
+    This approach gets a bit exciting when the XID and sequence sync
+    handlers drop and re-acquire the Display lock. Reacquisition will re-run
+    the handlers, but they return immediately unless they have work to do,
+    so they can't recurse more than once.  In the worst case, if both of
+    them have work to do, we can nest the Display lock three deep.  In the
+    case of the _XIDHandler, we drop the lock to call xcb_generate_id, which
+    takes the socket back if it needs to request more XIDs, and taking the
+    socket back will reacquire the lock; we take care to avoid letting
+    _XIDHandler run again and re-enter XCB from the return_socket callback
+    (which causes Very Bad Things, and is Not Allowed).
+    
+    Tested with ico (with 1 and 20 threads), and with several test programs
+    for XID and sequence sync.  Tested with and without XInitThreads(), and
+    with and without XCB.
+    
+    Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=23192
+    
+    Signed-off-by: Jamey Sharp <jamey@minilop.net>
+    Signed-off-by: Josh Triplett <josh@freedesktop.org>
+
+commit b089b53b697c2851db2985d32af3b29f1da5e31e
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Wed Apr 14 12:59:11 2010 -0700
+
+    Honest. Extensions get to filter async errors too.
+    
+    Under some circumstances, errors are picked up by calling
+    xcb_poll_for_reply, rather than xcb_poll_for_event, because Xlib issued
+    the requests with the XCB_REQUEST_CHECKED flag. That happens when either
+    an async handler is queued at the time the requests are flushed, or when
+    XSetEventQueueOwner has been used to prevent Xlib from processing XCB's
+    event queue.
+    
+    This bugfix extends 405132dab64bf2375f8e57d02b1b53da2311933a to cover
+    those cases.
+    
+    Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=26545
+    
+    Signed-off-by: Jamey Sharp <jamey@minilop.net>
+
+commit a15c31274650e391bc6de5d0951eb4464c228139
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Wed Apr 14 12:10:34 2010 -0700
+
+    _XError already runs async handlers; only call them directly for replies.
+    
+    The previous behavior probably would have triggered bug reports someday.
+    
+    Signed-off-by: Jamey Sharp <jamey@minilop.net>
+
+commit 405132dab64bf2375f8e57d02b1b53da2311933a
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Tue Apr 13 12:12:36 2010 -0700
+
+    Extensions get to filter async errors too.
+    
+    Apparently I misread XlibInt.c:_XReply and thought that handlers set
+    with XESetError should be consulted only for the sequence number that
+    _XReply is currently looking for. In fact, the error handlers are also
+    consulted when an error arrives for a request that was not expected to
+    have a reply.
+    
+    However, in an odd twist, the error handlers are *not* consulted outside
+    of _XReply--that is, when looking for events, or waiting to be able to
+    flush the output queue. So this patch takes some small pains to preserve
+    that behavior, though it seems likely to have been unintentional.
+    
+    Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=26545
+    
+    Signed-off-by: Jamey Sharp <jamey@minilop.net>
+
+commit d3eab4a38f3e53ef21eb3b6fa66ead7afecf6227
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Tue Apr 13 12:49:59 2010 -0700
+
+    Prefer the xcb_generic_error_t we already have over casting to xEvent.
+    
+    Just a minor cleanup.
+    
+    Signed-off-by: Jamey Sharp <jamey@minilop.net>
+
+commit 75ea8c37935ccc911557d16a303ba595b8ab106b
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Mon Apr 12 11:30:20 2010 -0700
+
+    Run the user's synchandler as well as any internal synchandlers.
+    
+    Fixes https://bugs.freedesktop.org/show_bug.cgi?id=27595
+    
+    Signed-off-by: Jamey Sharp <jamey@minilop.net>
+
+commit c3f3e4a9e531d010312c97e753d6e543e607094d
+Author: Kusanagi Kouichi <slash@ac.auone-net.jp>
+Date:   Fri Feb 12 17:16:10 2010 +0900
+
+    Fix manual typos.
+    
+    Signed-off-by: Kusanagi Kouichi <slash@ac.auone-net.jp>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 75c6c5595408caba9ef8233839d77021d02f86f2
+Author: Dirk Wallenstein <dirkwallenstein@t-online.de>
+Date:   Fri Feb 5 20:42:46 2010 +0100
+
+    man: Correct the XkbAllAccessXEventsMask mask name
+    
+    This mask has probably been renamed but not been updated in the manuals.
+    
+    Signed-off-by: Dirk Wallenstein <dirkwallenstein@t-online.de>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 9262aceaff24c954cab8c252690032bc2ec25e7d
+Author: Dirk Wallenstein <dirkwallenstein@t-online.de>
+Date:   Fri Feb 5 20:42:45 2010 +0100
+
+    man: Add missing geometry component flag
+    
+    Signed-off-by: Dirk Wallenstein <dirkwallenstein@t-online.de>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 50cf134465f6fd263f37acecac94518468ef1c6d
+Author: Dirk Wallenstein <halsmit@t-online.de>
+Date:   Tue Feb 2 21:24:32 2010 +0100
+
+    man: Return value of XkbGetState is Status and not Bool
+    
+    Signed-off-by: Dirk Wallenstein <halsmit@t-online.de>
+    Reviewed-by: Julien Cristau <jcristau@debian.org>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 7a93ae2bb5292a97fdd27ed818bc81248b37f641
+Author: Dirk Wallenstein <halsmit@t-online.de>
+Date:   Tue Feb 2 21:24:30 2010 +0100
+
+    man: Fix return value specification of XkbKeyActionEntry
+    
+    The XkbKeyActionEntry macro expands to a pointer.
+    
+    Signed-off-by: Dirk Wallenstein <halsmit@t-online.de>
+    Reviewed-by: Julien Cristau <jcristau@debian.org>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit e9884d4a05a5661ec343ea8a2aa0562b6419e086
+Author: Dirk Wallenstein <halsmit@t-online.de>
+Date:   Tue Feb 2 21:24:29 2010 +0100
+
+    man: Redirect users from XKeycodeToKeysym to XkbKeycodeToKeysym #25732
+    
+    XKeycodeToKeysym keeps compatibility with pre-XKB and thus only sees 2
+    groups with 2 levels each. It wraps the index into the next group.
+    This behavior confuses the unaware user, and therefore this will add a
+    reference to XkbKeycodeToKeysym in the corresponding man paragraph.
+    
+    Another bug had that issue, too. #5349
+    
+    Signed-off-by: Dirk Wallenstein <halsmit@t-online.de>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 6474cdf97cd648afaeaa872155f3fa21cfb43f80
+Author: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date:   Thu Apr 8 19:59:55 2010 -0700
+
+    Fix typo in new fi_FI.UTF-8 that was reported by "make check"
+    
+    Unrecognized pattern in Compose on line #154:
+      <dead_diaeresis> <space>                " "¨"
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
+
+commit 91bd5e7af2d3a9526aefb73dc10f417896f0e4dd
+Author: Marko Myllynen <myllynen@redhat.com>
+Date:   Thu Apr 8 19:52:42 2010 -0700
+
+    Bug 27465 - Rewritten fi_FI.UTF-8 Compose file
+    
+    I've rewritten the fi_FI.UTF-8 Compose file so that it
+    
+    - includes en_US.UTF-8/Compose for base compose definitions (and thus gets any
+    possible additions to en_US.UTF-8/Compose automatically included)
+    - overrides any en_US.UTF-8/Compose definitions with fi_FI.UTF-8/Compose
+    definitions (thus making it safe to include en_US.UTF-8/Compose)
+    - lists all the definitions specified in the SFS 5966 standard (thus making it
+    easy to verify that the implementation is valid and complete)
+    - adds a header about the file itself as required by the standard
+    
+    The rewritten version is ~320 lines compared to over 5000 lines of the previous
+    version.
+    
+    https://bugs.freedesktop.org/show_bug.cgi?id=27465
+
+commit f6a4fd0c7615684d08e848245849dea4017a5214
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Thu Apr 1 21:46:12 2010 -0400
+
+    config: update and relocate AC_DEFINE_DIR macro
+    
+    Remove deprecated acinclude.m4 macro container file
+    Use separate macro files as per autoconf recommendation
+    Use the latest macro from GNU (ax) which replaces
+    the non-gnu version (ac)
+    This preserves the Autoconf macro AC namespace.
+    
+    Also moved out of acinclude.m4 is the DOLT macro
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 61d5231db418cec51bd718633c3bba39b18689d6
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Mon Mar 29 14:53:48 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 69fc76a0321c6b25cc4286173c53435c69ab8e0e
+Author: Fernando Carrijo <fcarrijo@yahoo.com.br>
+Date:   Wed Mar 17 23:53:16 2010 -0300
+
+    No need for req->firstKeyCode to be set twice.
+    
+    There is no reason to set req->firstKeyCode twice when a client, wishful
+    for changing keyboard mappings, calls XChangeKeyboardMapping. This patch
+    fixes the mistake by making no functional changes to libX11 whatsoever.
+    
+    Signed-off-by: Fernando Carrijo <fcarrijo@yahoo.com.br>
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit b5797597f83ee62228abfb88f026ef92163e07a5
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Tue Feb 16 10:37:21 2010 -0500
+
+    config: move CWARNFLAGS from configure.ac to Makefile.am
+    
+    Compiler warning flags should be explicitly set in the makefile
+    rather than being merged with other packages compiler flags.
+    
+    Reviewed-by: Dan Nicholson <dbn.lists@gmail.com>
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 052c4d7995b0e52a038933beb85cd544571c6b7e
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Tue Feb 16 14:28:21 2010 -0500
+
+    specs: change install cmd due to automake 1.11
+    
+    specData_INSTALL is defined in 1.9 and 1.10 but not 1.11
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 7277a18cda9f5a6807d11cf4ceb9449b1c302c18
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Tue Feb 9 17:27:08 2010 -0500
+
+    doc: use $(mkdir_p) rather than $(MKDIR_P) due to automake 1.9.6
+    
+    $(MKDIR_P) is not defined in automake 1.9.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit e66eda95b520727969d721416d4ea49b54ef2b03
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Tue Feb 2 16:29:26 2010 -0500
+
+    specs: install html images in $docdir with html files
+    
+    The images required by the html files have been omitted.
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 137d1ff6be99d040e77c8c4c52029c5bdf1f4808
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Sun Jan 31 14:16:20 2010 -0500
+
+    doc: use new macros to control doc generation
+    
+    Namely XORG_WITH_GROFF for the groff generation tool
+    XORG_WITH_PS2PDF for the conversion of PS docs to PDF
+    XORG_ENABLE_SPECS for the generation of specs
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit 9ca583c5d6fcf9cd8151ee7b019630b141d32fab
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Tue Jan 26 19:41:08 2010 -0500
+
+    doc: clean-up generated html images
+    
+    Generate images in /images as is the convention
+    Provide a base file name for images rather than process ID
+    Remove images directory when running make clean
+    
+    Signed-off-by: Gaetan Nadon <memsize@videotron.ca>
+
+commit eb289b34bfc9978eef724e0f268975938334c06c
+Author: Kristian Høgsberg <krh@bitplanet.net>
+Date:   Thu Jan 21 13:39:17 2010 -0500
+
+    XErrorDB: Add new DRI2 request names
+
+commit 6babf2123d05adb9349394c49cc2d81d1f66cf9e
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Sat Jan 16 22:47:03 2010 +0000
+
+    man: Fix typo in Makefile
+    
+    Missing line continuation was preventing the XCompose alias from being
+    generated.
+    
+    Signed-off-by: Julien Cristau <jcristau@debian.org>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 68530599e61cf9fef3fcc91650e7cef21837fce7
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Sat Jan 16 11:41:32 2010 -0800
+
+    libX11 1.3.3
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 1e5af224b9fbdb154620f898558704f2bc4bf4e9
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Thu Jan 14 18:33:39 2010 -0800
+
+    Update COPYING file with actual licenses from libX11 code & docs
+    
+    COPYING was previously a years out-of-date copy of the LICENSES
+    doc summarizing all licenses for all XFree86 components, many of
+    which did not apply to libX11.
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit ddb1786720d6136b1b28be599c75c10ad1b76a2a
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Thu Jan 14 17:38:26 2010 -0800
+
+    Purge CVS/RCS id tags
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit c1db9ddcfa7091f173478dca45bf720badedfca4
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Thu Jan 14 15:39:14 2010 -0800
+
+    Update Sun license notices to current X.Org standard form
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 1aaa7c0358c5c035b99625f5715cb722bc2d2a2f
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Thu Jan 14 08:28:22 2010 -0800
+
+    Add %S substitutions to Compose man page
+    
+    Commit 9df349a7894725f9469b106af645f57f7f3f9af3 added support for %S
+    in Compose file include statements - this documents it in the Compose
+    file man page.
+    
+    Also changes the existing substitution documentation to list format
+    instead of a paragraph format to allow easier adding of %S.
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 94b45db93058cffa25598fe27dd3e385ace9d305
+Author: Richard Purdie <rpurdie@linux.intel.com>
+Date:   Thu Jan 14 08:04:28 2010 -0800
+
+    Fix configure.ac PKG_ macro calls
+    
+    If the first call to PKG_CHECK_MODULES() may not be called during execution
+    which is the case here since its inside a case statement, call
+    PKG_PROG_PKG_CONFIG() to ensure things worked correctly.
+    
+    Fixes a configure failure introduced by commit
+    87529c039050ce3336ff9ce00f1b5a21d15690da when xcb is enabled.
+    
+    http://bugs.freedesktop.org/show_bug.cgi?id=26041
+    
+    Signed-off-by: Richard Purdie <rpurdie@linux.intel.com>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit df559d8bc2238a2c369152fcb06e5b5ab132a5dc
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Tue Jan 12 09:18:15 2010 -0800
+
+    Raise xorg-macros requirement to 1.4
+    
+    Needed since the changes in 464390f16d7ed4aa5bf80f89863ba92273075ec2
+    depend on the INSTALL file delivered in xorg-macros 1.4
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 9df349a7894725f9469b106af645f57f7f3f9af3
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Wed Jan 13 11:04:38 2010 -0500
+
+    Allow inclusion of system level compose files.
+    
+    With the release of XFree86 4.4 an inclusion system of compose files was
+    added to Xlib to allow inclusion of the default compose file (with %L),
+    any compose files from user’s home directory (with %H), or a compose
+    file with a hard coded path¹. However, even today including system level
+    compose files is not possible in a platform independent manner although
+    the machinery for including compose files and overriding previously
+    defined compositions is already in place.
+    
+    With the ability to include system level compose files one could greatly
+    reduce the need for compose file rule duplication and the work needed to
+    propagate changes in one compose file to others. For example, currently
+    the Finnish compose file fi_FI.UTF-8 weights over 5000 lines² but it
+    is almost identical with en_US.UTF-8 except for perhaps half a dozen
+    compositions.
+    
+    This commit allows one to include system level compose files with the
+    following kind of syntax:
+    
+    include "%S/en_US.UTF-8/Compose"
+    
+    1] http://www.xfree86.org/4.4.0/RELNOTES5.html#42
+    2] http://cgit.freedesktop.org/xorg/lib/libX11/tree/nls/fi_FI.UTF-8/Compose.pre
+    
+    Signed-off-by: Marko Myllynen <myllynen@redhat.com>
+    Signed-off-by: James Cloos <cloos@jhcloos.com>
+
+commit ccf21a8877f40136e25f2f62d0668b0c76b3cfbd
+Author: Thien-Thi Nguyen <ttn@gnuvola.org>
+Date:   Tue Dec 1 10:31:47 2009 +0100
+
+    libX11: Fix comment: Invert polarity (direction) of reformat description.
+    
+    Signed-off-by: Thien-Thi Nguyen <ttn@gnuvola.org>
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 4d4676c0d6324d2ff9d00d15ab485fa5d848a369
+Author: Osamu Sayama <osamu.sayama@sun.com>
+Date:   Tue Jan 5 17:26:40 2010 -0800
+
+    set_fontset_extents crash after get_rotate_fontname fix in 2bef065b70f7
+    
+    - In set_fontset_extents, check font_data is not NULL before running
+      loop that may increment it to a non-NULL invalid pointer.
+    - Make sure get_rotate_fontname counts the final field
+    
+    Fixes OpenSolaris bug 6913809: X application dumps core in ja_JP.UTF-8 locale
+    <http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6913809>
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+    Reviewed-by: Adam Jackson <ajax@redhat.com>
+
+commit 87529c039050ce3336ff9ce00f1b5a21d15690da
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Tue Jan 5 18:02:37 2010 -0800
+
+    Merge X11, XKBPROTO, & XPROTO pkg-config lists
+    
+    Since the XPROTO_CFLAGS & XKBPROTO_CFLAGS are just merged into X11_CFLAGS
+    in configure.ac anyway, might as well combine the lists passed to
+    PKG_CHECK_MODULES to reduce duplication in the flags.
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+    Reviewed-by: Rémi Cardona <remi@gentoo.org>
+    Acked-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 2dd053667b44c55e2bf601aec7b75fc6fee1cf44
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Tue Jan 5 17:56:58 2010 -0800
+
+    Add XCompose man page shadow for Compose man page
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 02543bba816e065c02cd36e0c9e21519a9ee9c96
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Tue Jan 5 17:47:44 2010 -0800
+
+    Add $(AM_V_GEN) to silence lint rules too
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit db7c6fdeeaef9475458498e4cf09d6b1329e9aa3
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Tue Jan 5 17:42:42 2010 -0800
+
+    Remove GCC_WARNINGS now that XORG_CWARNFLAGS sets them for us
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 6b4e526e7ba105622f6b143e8e2639b44cb6cc19
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Sun Nov 29 10:44:24 2009 -0500
+
+    configure.ac: restore correct order for XORG_DEFAULT_OPTIONS
+    
+    It must be following AC_USE_SYSTEM_EXTENSION
+
+commit 3dbaa11d1c8705e1b309c6686f354766b651ad20
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Sun Nov 29 10:01:44 2009 -0500
+
+    Add .gitignore in /specs for generated files
+    
+    Being in /specs, it will apply for all 3 subdirs
+
+commit f45d39d37aab04742e44cd8c3c993aad7587e40c
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Fri Nov 27 20:56:03 2009 -0500
+
+    Makefile.am: add ChangeLog and INSTALL on MAINTAINERCLEANFILES
+    
+    Now that the INSTALL file is generated.
+    Allows running make maintainer-clean.
+
+commit 464390f16d7ed4aa5bf80f89863ba92273075ec2
+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 6360e7f0ce6a75da2bed33ede7fea783a1fb80e1
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Tue Oct 27 15:07:25 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 d02f943c98fde2f14319bc57fd9ad77eb9a2a572
+Author: Gaetan Nadon <memsize@videotron.ca>
+Date:   Mon Oct 26 22:08:42 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 f77c89c751a6a63c8ef11ecdddca2aed11ff6e29
+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 46c7b0e9d0d85cf5ccc0d40d19821fcc3335503b
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Thu Nov 12 23:05:40 2009 -0800
+
+    Add compose-check.pl to EXTRA_DIST
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 54c64267cc8bc98641cc39a22cb7bd71673e89e0
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Thu Oct 29 17:17:24 2009 +0100
+
+    man: fix XCopyGC argument order
+    
+    Ubuntu bug#408337
+
+commit aad10032651cdc2a53b359035954454a28d6db67
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Fri Oct 23 13:55:14 2009 -0700
+
+    libX11 1.3.2
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 6303ada89cb228c0f9656036f798703afb42fc29
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Oct 21 12:42:07 2009 +1000
+
+    Add smiley faces to compose sequences.
+    
+    I wonder how we could have lasted that long without them.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Acked-by: Daniel Stone <daniel@fooishbar.org>
+    Acked-By: James Cloos <cloos@jhcloos.com>
+
+commit 0e104ebd8628803c27e36b16922ad1edd891325a
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Thu Oct 22 23:12:30 2009 -0700
+
+    Add man page for Compose file format
+    
+    Based on grammar description in modules/im/ximcp/imLcPrs.c and
+    note on XFree86 changes formerly found in xorg-docs RELNOTES.sgml
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 9c95f2af7c442b3a59b1a30cf804f1ef4e7fc5b5
+Author: Jeremy Huddleston <jeremyhu@freedesktop.org>
+Date:   Tue Oct 20 12:46:03 2009 -0700
+
+    Add extra configuration and sanity checks for groff and ps2pdf
+    
+    1) Add AC_ARG_VAR for GROFF and PS2PDF to inform users of these
+       environment variables.
+    2) Check that groff -ms works
+    
+    Some distributions ship the ms macros as a separate package which may
+    not be installed together with groff, so we need to make sure that groff
+    works and the required macros are actually installed before attempting
+    to build the specs.
+    
+    Signed-off-by: Jeremy Huddleston <jeremyhu@freedesktop.org>
+    Signed-off-by: Dan Nicholson <dbn.lists@gmail.com>
+    Signed-off-by: Yaakov Selkowitz <yselkowitz@users.sourceforge.net>
+
+commit d3f801fd2f9198eaad6797414dba652f9c006c6d
+Author: Yaakov Selkowitz <yselkowitz@users.sourceforge.net>
+Date:   Sun Oct 18 17:34:53 2009 -0500
+
+    Fix VPATH build of libX11 specs
+    
+    Signed-off-by: Yaakov Selkowitz <yselkowitz@users.sourceforge.net>
+
+commit ad15e1a89d30ccc11d80745897b83def1448e8c0
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Sat Oct 17 16:14:34 2009 -0700
+
+    libX11 1.3.1
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 0cbf98c17a7484bb58b2464b98d63bb3b4ea2594
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Sat Oct 17 16:28:25 2009 -0700
+
+    Fix make distcheck
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 082e62ad268ef16a3bebc5a3c9fa008dbdc483ed
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Fri Oct 16 19:25:35 2009 -0700
+
+    Use $(AM_V_GEN) to silence echo commands for generating shadow man pages
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 4e66da0783b2e5e3b288aaecd3c89396ed425c20
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Wed Oct 14 16:18:24 2009 -0700
+
+    Move libX11 & XIM/locale specs from xorg-docs
+    
+    If groff is found, and --disable-specs is not passed to configure,
+    specs will be converted to text, html and ps (or pdf if ps2pdf is
+    found) and installed to $(docdir)
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 5d3d817a42ddcc8d0c6efd33efd1442fe14f5c6b
+Author: Yaakov Selkowitz <yselkowitz@users.sourceforge.net>
+Date:   Tue Oct 13 19:15:51 2009 -0500
+
+    Provide _Xsetlocale compat wrappers on Cygwin
+    
+    Previous versions of Cygwin did not have proper locale support, so Cygwin/X
+    defined X_LOCALE, using _Xsetlocale instead.  Cygwin 1.7 has added locale
+    support, but we can't remove the _Xsetlocale entry point without breaking
+    ABI.
+    
+    Signed-off-by: Yaakov Selkowitz <yselkowitz@users.sourceforge.net>
+
+commit 2c8b3a877a713bb66a6316a7051b43c46af6e1a0
+Author: Yaakov Selkowitz <yselkowitz@users.sourceforge.net>
+Date:   Tue Oct 13 19:15:49 2009 -0500
+
+    dolt: add Cygwin to supported platforms
+    
+    Signed-off-by: Yaakov Selkowitz <yselkowitz@users.sourceforge.net>
+
+commit a2c8e3e34b15b57ff881a52101fc961a602f35e4
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Wed Oct 14 13:23:30 2009 -0700
+
+    Recognize XSUNBUFFERSIZE alias for XLIBBUFFERSIZE on Solaris
+    
+    Also fix indenting of the XLIBBUFFERSIZE code to match surrounding code
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 34ddfca7b7d58240b0fe74bec6b2e0652d15c051
+Author: Jon TURNEY <jon.turney@dronecode.org.uk>
+Date:   Tue Feb 10 17:47:25 2009 +0000
+
+    Include sys/select.h for select() and struct timeval, if it exists
+    
+    This is a cygwin build fix
+
+commit 383165916ddac91740d4c780174d4c0d07cdb994
+Author: Xake <xake@rymdraket.net>
+Date:   Sun Sep 27 11:16:36 2009 +0200
+
+    Use AM_V_GEN instead of customized macros for AM_SILENT_RULES
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 854269d55cdda8caf425515bfed2855e211a5ada
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Tue Oct 6 16:11:24 2009 +0200
+
+    configure: quote argument to m4_pattern_forbid
+    
+    Without this, configure spits out
+    ../configure: line 12364: ac_fn_c_check_member: command not found
+    ../configure: line 12378: ac_fn_c_check_type: command not found
+    
+    Also anchor the pattern to make it stricter.
+    
+    Signed-off-by: Julien Cristau <jcristau@debian.org>
+
+commit 3bb020587ce74e0737ec7aceb20041f1e77d3b87
+Author: Jeremy Huddleston <jeremyhu@freedesktop.org>
+Date:   Thu Oct 1 22:20:38 2009 -0700
+
+    Split CFLAGS into CPPFLAGS and CFLAGS
+    
+    On some build systems, CPPFLAGS is set to "-I/some/prefix/include".  If older
+    X11 headers are in /some/prefix/include, they will be preferred over the
+    shipped headers.  This corrects that problem.
+
+commit d54caf1c9c55af8247621b7ba6afb20b23699839
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Fri Oct 2 10:59:08 2009 +1000
+
+    libX11 1.3
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit dd201bcf9e7f8863b7ef32273a5ef021678133c1
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Fri Oct 2 12:10:29 2009 +1000
+
+    nls: remove duplicate Compose sequences from pt_BR.UTF-8
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit a293ae9e83739067fc92db1a39c262857bc2283e
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Fri Sep 25 11:19:41 2009 +1000
+
+    Add XF86TouchpadToggle to XKeysymDB
+    
+    Lenovo laptops provide a key to enable or disable the touchpad and the
+    trackstick. This key is usually located on Fn + F8.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+    Acked-by: Adam Jackson <ajax@redhat.com>
+
+commit 69839f8903a24eab08f17a781b3797fb64dce9cf
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Sun Sep 27 10:34:16 2009 -0700
+
+    Bug 24173: libX11 from git fails to build with automake older then 1.11
+    
+    AM_CONDITIONAL must come *before* the AC_OUTPUT that creates the
+    Makefiles, instead of after.
+    <http://bugs.freedesktop.org/show_bug.cgi?id=24173>
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit f5effd041f58ef07703cca2b4f396758811e1eec
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Wed Apr 15 10:59:23 2009 -0700
+
+    Resolve conflicting Compose sequences in iso8859-2, el_GR.UTF-8 & pt_BR.UTF-8
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 3843778358d3a0cd6a2d07dba5dd061248053ac9
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Wed Apr 15 10:56:09 2009 -0700
+
+    Add perl script to check for duplicate or conflicting compose file entries
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 19cc5e1fa17a285045662820a8b4de2a0f9a194d
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Fri Sep 18 17:10:04 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 7dabcac973d0b6692a3cd62bd6d8e0467b24200b
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Fri Sep 18 16:58:53 2009 -0700
+
+    Add AM_SILENT_RULES support for cpp rules for man & nls files
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit bfa19cddd8546b4930a773f3bbd81137c362d82b
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Fri Sep 18 16:58:16 2009 -0700
+
+    Update to using xorg-macros 1.3 & XORG_DEFAULT_OPTIONS
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 51396066c8003a96a6399c9a4bed2a81e512b582
+Author: Mikko Niskanen <mikko.niskanen@iki.fi>
+Date:   Fri Sep 4 10:11:15 2009 +1000
+
+    Fix wrong typedef on HP-UX (#18998)
+    
+    shl_dt doesn't exist, the type is shl_t.
+    
+    X.Org Bug 18998 <http://bugs.freedesktop.org/show_bug.cgi?id=18998>
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 615220a312b9430a580fe6dcf51703c6ef244f66
+Author: Paul Bender <pebender@gmail.com>
+Date:   Fri Sep 4 09:57:10 2009 +1000
+
+    Don't require xdmcp in configure.ac (#22583)
+    
+    X.Org Bug 22583 <http://bugs.freedesktop.org/show_bug.cgi?id=22583>
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 20f9ecd86ad2a9ac6966f7eee32234cb5ef77c29
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Thu Sep 3 14:02:44 2009 +1000
+
+    man: fix parameters to XkbAllocGeomOverlay{Rows|Keys} (#23499)
+    
+    X.Org Bug 23499 <http://bugs.freedesktop.org/show_bug.cgi?id=23499>
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit c2814a614dc4d9409bfa0f44c18bfd69ad7f7b85
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Thu Sep 3 12:05:25 2009 +1000
+
+    man: XQueryTree may return BadWindow. (#23416)
+    
+    X.Org Bug 23416 <http://bugs.freedesktop.org/show_bug.cgi?id=XXX>
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit dbe98d456ccc6eeca9fa3e241a3db0a4d83c5a65
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Fri Aug 28 23:07:58 2009 +0800
+
+    Fix version tag in .TH line of several XKB man pages
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit bf24400936c10af6f5aa0c75cfe2207ab9b680b4
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Fri Aug 28 23:04:38 2009 +0800
+
+    XkbSetDeviceButtonActions.man: remove non-existent actions argument
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 53affa9335116f2d367f041e6502a411d4619e47
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Fri Aug 28 23:00:17 2009 +0800
+
+    XkbQueryExtension.man: Arguments should be pointers
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 6233948885acc5873a5abddfff235afec555f3c2
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Fri Aug 28 22:53:03 2009 +0800
+
+    XkbSAActionSetCtrls.man: Fix typo in formatting macro
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 28a9ca57cdec4aa9ca92322f963b01f0c2daf47a
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Fri Aug 28 22:49:31 2009 +0800
+
+    Convert Xkb API man pages to ANSI prototypes
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit fa2eecca85baab9616f7143cc1a853a594b4a90c
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Mon Aug 24 06:35:17 2009 -0400
+
+    Add some (Serbian) Cyrillic NFD sequences.
+    
+    A number of characters in use in the various countries which use the
+    Cyrillic script do not appear as pre-composed characters in The UCS
+    or Unicode; they are only available as combining-character sequences.
+    
+    This commit adds support for using (prefix) dead keys and Multi_key-
+    initiated sequences to enter a number of these combining-character
+    sequences.  This ensures that users can enter these scripts even
+    when using the current Cyrillic keymaps, which lack support for
+    the combining characters.
+    
+    Please see the discussions on the xkb mailing list.
+    
+    Signed-off-by: James Cloos <cloos@jhcloos.com>
+
+commit d1bdc909f9246119696c8b0d9afb7bd8afb71b60
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Wed Aug 5 18:14:23 2009 +0200
+
+    man/xkb: delete spurious newline in .TH headers
+
+commit ee723b83b24682db833a2f0abd96cd319b8a62af
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Wed Aug 5 16:45:19 2009 +0200
+
+    man: use __libmansuffix__ instead of 3X11 for references to other pages
+
+commit 595e204feb82c798a92eea41fea03be6476ac181
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Wed Aug 5 16:43:36 2009 +0200
+
+    man/xkb: use __libmansuffix__ instead of hardcoding 3Xkb for manpage sections
+
+commit 9da7e230d5320e1556ad2084fcd06ee7994385ea
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Aug 5 14:15:02 2009 +1000
+
+    Bump to 1.2.99.901 (1.3 RC1)
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 8f78c7b4e3570cd46c5a220982963c17fe2157b8
+Author: Filippo Giunchedi <filippo@debian.org>
+Date:   Sat Jun 6 16:56:54 2009 +0200
+
+    nls: add {left,right}wards arrow to compose table
+    
+    Debian bug#532117 <http://bugs.debian.org/532117>
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 7949bfa00390241d994f32463e50d4bd78920568
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Fri Jul 31 13:33:52 2009 +0200
+
+    Update library version for new symbols
+    
+    Commit 554f755e5545f63d3c8f299297927238da155773 added generic event
+    cookie handling.  Bump libX11 version number accordingly.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 640fec5f4feacd01a00eea3dcd4edb220907d3dc
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Sun Aug 2 17:18:31 2009 +0200
+
+    Add _XFUNCPROTOBEGIN/END to Xlib-xcb.h
+    
+    X.Org bug#22252 <https://bugs.freedesktop.org/show_bug.cgi?id=22252>
+    
+    Reported-by: Riku Salminen <rsalmin2@cc.hut.fi>
+    Signed-off-by: Julien Cristau <jcristau@debian.org>
+
+commit bc06d49e9dac1836d6824769ddb2ac5ba9f14df7
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Jul 29 08:44:09 2009 +1000
+
+    Fix compiler warning 'unused variable qelt'
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 03f4907e14f5755e72309f08742977b871e81e33
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Wed Jul 29 08:34:57 2009 +1000
+
+    Add utlist.h to the Makefile.am
+    
+    utlist.h contains the linked list macros, it was added with the recent
+    addition of event cookies but utlist.h wasn't added to the Makefile.am. As a
+    result, make dist failed.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 554f755e5545f63d3c8f299297927238da155773
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Fri Jun 26 11:27:43 2009 +1000
+
+    Add generic event cookie handling to libX11.
+    
+    Generic events require more bytes than Xlib provides in the standard XEvent.
+    Memory allocated by the extension and stored as pointers inside the event is
+    prone to leak by simple 'while (1) { XNextEvent(...); }' loops.
+    
+    This patch adds cookie handling for generic events. Extensions may register
+    a cookie handler in addition to the normal event vectors. If an extension
+    has registered a cookie handler, _all_ generic events for this extensions
+    must be handled through cookies. Otherwise, the default event handler is
+    used.
+    
+    The cookie handler must return an XGenericEventCookie with a pointer to the
+    data.The rest of the event (type, serialNumber, etc.) are to be filled as
+    normal. When a client retrieves such a cookie event, the data is stored in
+    an internal queue (the 'cookiejar'). This data is freed on the next call to
+    XNextEvent().
+    
+    New extension interfaces:
+        XESetWireToEventCookie(display, extension_number, cookie_handler)
+    
+    Where cookie_handler must set cookie->data. The data pointer is of arbitray
+    size and type but must be a single memory block. This memory block
+    represents the actual extension's event.
+    
+    New client interfaces:
+        XGetEventData(display, *cookie);
+        XFreeEventData(display, *cookie);
+    
+    If the client needs the actual event data, it must call XGetEventData() with
+    the cookie. This returns the data pointer (and removes it from the cookie
+    jar) and the client is then responsible for freeing the event with
+    XFreeEventData(). It is safe to call either function with a non-cookie
+    event. Events unclaimed or not handled by the XGetEventData() are cleaned up
+    automatically.
+    
+    Example client code:
+        XEvent event;
+        XGenericEventCookie *cookie = &ev;
+    
+        XNextEvent(display, &event);
+        if (XGetEventData(display, cookie)) {
+            XIEvent *xievent = cookie->data;
+            ...
+        } else if (cookie->type == GenericEvent) {
+            /* handle generic event */
+        } else {
+            /* handle extension/core event */
+        }
+        XFreeEventData(display, cookie);
+    
+    Cookies are not multi-threading safe. Clients that use XGetEventData() must
+    lock between XNextEvent and XGetEventData to avoid other threads freeing
+    cookies.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit d7675cb8fa7155e7aff1459636a117a97aa1bf28
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Mon Jul 6 13:17:35 2009 +1000
+
+    Bump to 1.2.99.1
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 75fe48e7a42a685d7098e8d7108b9b956c471563
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Fri Jul 10 14:07:34 2009 +1000
+
+    Bump to 1.2.2
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 5d0fe0e0e92759af5667c5dca2eacb1b6f2d66ea
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Thu Jul 2 09:10:25 2009 +1000
+
+    XMaskEvent/XCheckMaskedEvents must not check for GenericEvents.
+    
+    GenericEvent cannot be selected for in the core event masks and they must
+    thus be treated like extension events.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit c1bf65b89f4e361f6178a73dd5334c8f2bd95732
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Thu Jul 2 09:06:05 2009 +1000
+
+    XWindowEvent/XCheckWindowEvent must not return GenericEvents.
+    
+    GenericEvents have no fixed position for the window, so they must be treated
+    like extension events.
+    
+    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+
+commit 38f9054554d63525d2dd51aafb5eb57821158ab9
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Mon Jun 15 19:00:43 2009 -0700
+
+    Drop ancient USG SysV #ifdefs
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 7bfe1323f16a1a69cc474659f7ac0c2570b1cf42
+Author: Adam Jackson <ajax@redhat.com>
+Date:   Fri Jun 12 12:44:01 2009 -0400
+
+    Remove X_NOT_STDC_ENV usage. (#6527)
+
+commit 6dd74d7fb414ca1e99bae5c13e333961f396eb36
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Fri May 29 11:18:11 2009 +0200
+
+    nls: remove more duplicated aliases
+    
+    Signed-off-by: Julien Cristau <jcristau@debian.org>
+
+commit e4b0899f516da224010e68bd2d953d5293d94993
+Author: parag <parag@rawhideTM.pnq.redhat.com>
+Date:   Thu May 28 11:29:35 2009 +0530
+
+    nls: Add pa_PK locale information and make pa_IN as default for pa.
+    
+    X.Org bug#21954 <http://bugs.freedesktop.org/show_bug.cgi?id=21954>
+    
+    [jcristau: removed the pa_PK.UTF-8 alias to itself]
+    
+    Signed-off-by: parag <pnemade@redhat.com>
+    Signed-off-by: Julien Cristau <jcristau@debian.org>
+
+commit f0ea1f6d51145592f8617854f9320ec5dbff3299
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Fri May 29 10:58:20 2009 +0200
+
+    nls: remove broken sd_IN.UTF-8 alias
+    
+    Signed-off-by: Julien Cristau <jcristau@debian.org>
+
+commit e29e010dabdb17d6498f2ef1786f69b8830c18ca
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Fri May 29 10:57:43 2009 +0200
+
+    nls: remove duplicated en_US* aliases
+    
+    Signed-off-by: Julien Cristau <jcristau@debian.org>
+
+commit a89a300d87852c84389ad97db66dcb8930cb45dd
+Author: Caolan McNamara <caolanm@redhat.com>
+Date:   Thu May 21 18:41:05 2009 +0200
+
+    man: missing space in XAllocColor man page
+    
+    X.Org bug#21854 <http://bugs.freedesktop.org/show_bug.cgi?id=21854>
+
+commit c1c001e36504fd304f76f69bf6af3643225c49ea
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Wed May 13 13:03:54 2009 -0400
+
+    [nls] Replace remaining UCS Combining Characters in Compose sequences.
+    
+    The replaces the instances of keysyms which match <U03[0-6][0-9A-Fa-f]>,
+    where the keysym is used as a dead_key, with an actual dead_key symbol.
+    
+    The only remaining instances of UCS combining characters in the
+    compose sequences are of U0338 COMBINING LONG SOLIDUS OVERLAY
+    used as a suffix in Multi_key-initiated sequences to create
+    mathematics characters such as ∉ U+2209 NOT AN ELEMENT OF
+    from ∈ U+2208 ELEMENT OF.
+
+commit e2b0bad3d3b9e9ca781fc264eb7584afbe2a1a4f
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Wed May 13 09:58:59 2009 -0400
+
+    [nls] Remove extraneous instances of UCS Combining Characters in Compose sequences.
+    
+    This removes those instances of keysyms which match <U03[0-6][0-9A-Fa-f]>,
+    where the matching keysym is used as a dead_key, and for which alternative
+    compose sequences exist.
+
+commit 79f47e6dff2f0a0b673bbfecc47528edca814baa
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Fri May 8 20:11:54 2009 -0400
+
+    [nls] Remove combining_ keysyms from the Compose files
+    
+    Some of the UTF-8 Compose tables included combining_ keysyms in
+    the compose sequences as though they were dead symbols.  This
+    is contrary to how combining characters are used in the UCS.
+    Therefore, those lines have been removed from the Compose tables.
+    
+    There were also some combining_ keysyms as targets.  As those
+    are not included in x11proto’s keysymdef.h, and as those do
+    exist there as Uxxxx keysyms, they are replaced with the Uxxxx
+    keysym names.
+    
+    This addresses http://bugzilla.freedesktop.org/show_bug.cgi?id=5107
+    and is based on attachment 25644 by samuel.thibault@ens-lyon.org.
+    
+    Signed-off-by: James Cloos <cloos@jhcloos.com>
+
+commit 4a08a3dfbda497b2be46e3e5fe6b777815ea27f9
+Author: parag <pnemade@redhat.com>
+Date:   Tue May 5 16:50:47 2009 +0530
+
+    libX11: Add new Indic language information to nls directory files. #21560
+    
+    Signed-off-by: parag <pnemade@redhat.com>
+
+commit aaf81096eb44b4c2812108721ba02738391884da
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Sat May 2 01:38:14 2009 -0700
+
+    Correct return type in XkbGetKeyboard man page
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 2bef065b70f70af520b5de8fb23529254d15f003
+Author: Christoph Pfister <christophpfister@gmail.com>
+Date:   Mon Apr 27 22:32:57 2009 -0700
+
+    X.Org Bug #21117: crash in get_rotate_fontname (omGeneric.c)
+    
+    http://bugs.freedesktop.org/show_bug.cgi?id=21117
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 5c1cde105db10df24d3c532f032cbc59050c7313
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Fri Apr 17 22:14:47 2009 -0700
+
+    Use AC_USE_SYSTEM_EXTENSIONS instead of hand-rolled check for _GNU_SOURCE
+    
+    Raises minimum autoconf version required to 2.60
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 84b7a91ef84f345384e4b0e13907385ca3ca3255
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Tue Apr 14 15:59:57 2009 +0100
+
+    Fix fi_FI.UTF-8, again
+    
+    Commit 97fc6babd4ccaf300e25708868aa2a738893dc30 "NLS: Add UTF-8 compose
+    file for Finnish" made fi_FI.UTF-8 use a broken empty XLC_LOCALE file.
+    This reverts it back to using the en_US.UTF-8 one.
+
+commit 128daff4422f973ea40dd1e31b2db230e643549e
+Author: Theppitak Karoonboonyanan <thep@linux.thai.net>
+Date:   Thu Apr 9 12:01:07 2009 +0700
+
+    Thai XIM not retrieve MB surrounding on UTF-8 LC
+    
+    On th_TH.UTF-8 locale, Thai XIM rejects all combining characters for GTK+ apps
+    that use X Input Method.
+    
+    This is because GTK+ imxim immodule passes surrounding text in locale encoding,
+    which is UTF-8 for UTF-8 locales. But current Thai XIM in Xlib assumes the
+    multi-byte StringConversionText response for the StringConversionCallback to
+    always be TIS-620, by retrieving a single byte and using it as-is.
+    
+    If the Thai XIM tries to convert the multi-byte text based on locale codeset
+    before using it, it will work again.
+    
+    X.Org But 12759 <http://bugs.freedesktop.org/show_bug.cgi?id=12759>
+    
+    Signed-off-by: Theppitak Karoonboonyanan <thep@linux.thai.net>
+    Signed-off-by: Julien Cristau <jcristau@debian.org>
+
+commit e09f0d227fbf95b6252759af9d426efd57686f9f
+Author: Theppitak Karoonboonyanan <thep@linux.thai.net>
+Date:   Thu Apr 9 11:47:55 2009 +0700
+
+    Thai XIM not filters when NumLock or CapsLock is on
+    
+    The Thai XIM component in libx11 activated on 'th*' locales normally filters
+    input sequence according to orthographic rules. However, when NumLock/CapsLock
+    is on, this stops working. All sequences are passed through.
+    
+    This is caused by missing masks in _XimThaiFilter(), which normally screens out
+    certain special keys from entering orthographic rules. Unfortunately, this
+    included events with NumLock/CapsLock on. Negating the masks from the check
+    allows the events to be tested by the rules.
+    
+    X.Org Bug 12517 <http://bugs.freedesktop.org/show_bug.cgi?id=12517>
+    
+    Signed-off-by: Theppitak Karoonboonyanan <thep@linux.thai.net>
+    Signed-off-by: Julien Cristau <jcristau@debian.org>
+
+commit d108d3c706af3502820b5202564488ea19908b77
+Author: Theppitak Karoonboonyanan <thep@linux.thai.net>
+Date:   Thu Apr 9 11:25:25 2009 +0700
+
+    CharSet-to-CompoundText Conversion Failed for Thai Locales
+    
+    SCIM fails to commit Thai input characters on Thai locales, because it commits
+    string in compound text form, which was converted via
+    XwcTextListToTextProperty(). But the XLC_LOCALE for th_TH and th_TH.UTF-8
+    declares cs1's ct_encoding as TIS620-0:GR, which was commented out in
+    src/xlibi18n/lcCT.c default_ct_data, in favor of ISO8859-11 ESC sequence.
+    So, declaring cs1 as ISO8859-11:GR instead makes it work.
+    
+    Besides, for th_TH.UTF-8, adding cs2 class with ISO10646-1 encoding also adds
+    support for UTF-8 input.
+    
+    And, along discussion in the bug, a similar problem was found for fontset, too,
+    by causing delays on X apps startups on systems without tis620-0 fonts. This
+    is normally the case, as mkfontdir and mkfontscale generate iso8859-11 entries
+    by default for Thai X fonts. So, Thai fontset charset is also patched.
+    
+    X.Org Bug 16475 <http://bugs.freedesktop.org/show_bug.cgi?id=16475>
+    
+    Signed-off-by: Theppitak Karoonboonyanan <thep@linux.thai.net>
+    Signed-off-by: Julien Cristau <jcristau@debian.org>
+
+commit fd62d3318c846cd43d66a505946e94704d7d83dc
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Wed Apr 8 19:42:25 2009 -0700
+
+    Revert "Change masculine to ordmasculine in Compose file comments"
+    
+    This reverts commit 892b401d5acc055803a20e349ede0d64490f2230.
+    
+    As Julien Cristau correctly points out, I misread the Compose file grammar
+    in modules/im/ximcp/imLcPrs.c, and those are keysyms, not comments, and
+    the keysym is named XK_masculine in keysymdef.h.   This change is thus a
+    bug in the Solaris compose tables to be fixed, not an improvement to bring
+    upstream.
+
+commit eac57c77afdf44f50692225b8b0345a7c927bc84
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Tue Apr 7 15:38:45 2009 -0700
+
+    Version bump: 1.2.1
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit bfbec08baec33c5024510b0bcbbee6e4a8473e79
+Author: Yaakov Selkowitz (Cygwin Ports maintainer) <yselkowitz@users.sourceforge.net>
+Date:   Tue Apr 7 13:46:57 2009 -0700
+
+    Bug 20773: Xcursor dynamic loading on Cygwin
+    
+    X.Org Bug #20773 <http://bugs.freedesktop.org/show_bug.cgi?id=20773>
+    Patch #24096 <http://bugs.freedesktop.org/attachment.cgi?id=24096>
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit c8c41614911be4fa222fa22478677d263b41c751
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Mon Apr 6 16:52:46 2009 -0700
+
+    Fix a several sparse warnings: Using plain integer as NULL pointer
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit b336c3d0cc2aefc8926500cff5f76b5a3e803886
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Mon Apr 6 16:32:05 2009 -0700
+
+    Further ansify prototypes & reduce #ifdefs in locking.c
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 892b401d5acc055803a20e349ede0d64490f2230
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Mon Apr 6 10:50:09 2009 -0700
+
+    Change masculine to ordmasculine in Compose file comments
+    
+    Matches the ordfeminine name used for the matching character,
+    and the ordmasculine name used in many font descriptions of the glyph.
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit e3198b55dc16ec57346cc28aa8d34165ce8cde96
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Fri Mar 13 13:52:33 2009 +0100
+
+    Add a ru_RU.UTF-8 locale
+    
+    Based on patch by Eugene Konev <ejka@imfi.kspu.ru> for X.Org 6.9.0.
+    
+    Debian bug#330144 <http://bugs.debian.org/330144>
+    X.Org bug#15887 <http://bugs.freedesktop.org/show_bug.cgi?id=15887>
+
+commit d239de9452691d6f875e6e5ace3d499ec3bf14d9
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Wed Mar 25 17:59:09 2009 -0700
+
+    Delete some unused "#ifdef notdef" static functions
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 4281892e31058ef3aecc96a5767824b34d88d415
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Wed Mar 25 17:52:48 2009 -0700
+
+    Remove _XP_PRINT_SERVER_ #ifdefs from Xrm.c
+    
+    This copy of Xrm.c is never compiled into the Xprint server any more, so
+    this old code-sharing #ifdef from the monolith tree isn't needed.
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 27a2e16e8ea11c1604e28645fae4d6ba4371d513
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Tue Mar 17 18:38:58 2009 -0700
+
+    makekeys: combine malloc(strlen)+strcpy into strdup
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 78a894231ae8ec4959007b6d9b8d2a15d6333a1e
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Tue Mar 17 15:42:19 2009 -0700
+
+    When makekeys fails to find a good hash, print error instead of divide-by-zero
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit c9f84af591d15fbc3fa890bcd955d94f1ff82a0b
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Tue Mar 17 14:59:16 2009 -0700
+
+    Remove ifdef checks for macII left over from ancient A/UX 3.0 support
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 4b90da0ffb32b791d915ecae11996cc2f2cac9a7
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Mon Mar 16 18:37:49 2009 -0700
+
+    XErrorDB additions for DRI2 requests
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 273f45af1441be9d2135e4cac8c46ceb33470236
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Mon Mar 16 18:35:44 2009 -0700
+
+    XErrorDB additions for XInput errors and new XInput 1.5 requests
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 90ef36f6336068183bf9d13ca972202db35b1202
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Mon Mar 16 18:23:05 2009 -0700
+
+    XErrorDB additions for RANDR 1.3
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 124a4efaccf329f1a44f6b824e70278bdd1cad83
+Author: Lubos Lunak <l.lunak@suse.cz>
+Date:   Mon Mar 16 18:03:36 2009 -0700
+
+    XErrorDB updates for XTEST, RANDR, DAMAGE extensions
+    
+    From http://lists.freedesktop.org/archives/xorg/2008-January/031937.html
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 80811846e37b805fddb37c71589fd5f6f6037b3f
+Author: Lubos Lunak <l.lunak@suse.cz>
+Date:   Mon Mar 16 17:57:52 2009 -0700
+
+    XGetErrorText() fails for extension error codes equal to the error base
+    
+    From http://lists.freedesktop.org/archives/xorg/2008-January/031937.html
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit da95ecbbdcacc483cd0b5fd7db1fb2e2543341bd
+Author: Milos Komarcevic <miloskomarcevic@netscape.net>
+Date:   Mon Mar 16 17:43:26 2009 -0700
+
+    Bug 11456: Serbian locale updates (sr_RS and sr_ME)
+    
+    X.Org Bug #11456 <http://bugs.freedesktop.org/show_bug.cgi?id=11456>
+    Patch #23937 <http://bugs.freedesktop.org/attachment.cgi?id=23937>
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 934a6c0519a9e32505beee55b004f36c2a710217
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Mon Mar 16 14:55:22 2009 -0700
+
+    Bug 10082: Compose entries for some standard mathematical operators
+    
+    X.Org Bug #10082 <http://bugs.freedesktop.org/show_bug.cgi?id=10082>
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit abf4da1ed0f735ca7ce471dc13a0ec3677391486
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Mon Mar 16 14:27:46 2009 -0700
+
+    Bug 14651: We need to add new locale specification for Belarusian Latin locale
+    
+    X.Org Bug #14651 <http://bugs.freedesktop.org/show_bug.cgi?id=14651>
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 837703c8651e1321a50147a8311c56e4758ce08a
+Author: Caolan McNamara <caolanm@redhat.com>
+Date:   Mon Mar 16 14:15:50 2009 -0700
+
+    Bug 20575: man page for XCreatePixmapFromBitmapData doesn't match signature
+    
+    X.Org Bug #20575 <http://bugs.freedesktop.org/show_bug.cgi?id=20575>
+    Patch #23717 <http://bugs.freedesktop.org/attachment.cgi?id=23717>
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 22199018879055d8653e59d8236bef57164fac66
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Mon Mar 16 13:28:18 2009 -0700
+
+    Correct locale alias for sh_BA.ISO8859-2@bosnia (should be sr, not nr)
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 4c63c27eab2b88f5556dbf72c36321f50f6de35e
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Thu Mar 12 18:57:20 2009 -0700
+
+    Bug 9953: Please provide locale alias hu_HU.utf8
+    
+    X.Org Bug #9953 <http://bugs.freedesktop.org/show_bug.cgi?id=9953>
+    Debian Bug #407573 <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=407573>
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 501f4e0ada1690783ada05ad412e4b191ad55336
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Thu Mar 12 17:38:21 2009 -0700
+
+    Bug 6820: Xlib shouldn't handle EAGAIN as a fatal IO error
+    
+    X.Org Bug #6820 <http://bugs.freedesktop.org/show_bug.cgi?id=6820>
+    Patch #17637 <http://bugs.freedesktop.org/attachment.cgi?id=17637>
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 7b9c543e7210c7da204871c31a160e79d3a949b6
+Author: Paul Bender <pebender@gmail.com>
+Date:   Thu Mar 12 17:11:42 2009 -0700
+
+    Bug 15664: xau & xdmcp not needed in x11.pc dependencies when built with xcb
+    
+    X.Org bug #15664 <https://bugs.freedesktop.org/show_bug.cgi?id=15664>
+    Patch #16128 <https://bugs.freedesktop.org/attachment.cgi?id=16128>
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit fd2cf1ef66c2aff3dc758956c9e9e567b9892c06
+Author: Xue Wei <Wei.Xue@Sun.COM>
+Date:   Wed Mar 4 19:32:29 2009 -0800
+
+    Add UTF-8 locale entries for es_US, kk_KZ, mt_MT, and sh_BA
+    
+    Sun bug 6809309 Add new utf8 locales supported by Xlib
+    <http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6809309>
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit cb70c9bc43267577859a3674ca9de9be396ba69e
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Mon Feb 23 19:29:15 2009 -0800
+
+    Add --with-locale-lib-dir configure option to set locale lib install dir
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit ccd3584f0330db8dac90b9313c33ab8b5b2ec6af
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Mon Feb 23 18:33:51 2009 -0800
+
+    Incorporate more locale names/aliases from Solaris libX11
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 83ce4daefdf544f801c7d666c89162690a36ce41
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Mon Feb 23 18:32:34 2009 -0800
+
+    Incorporate char range comments from Solaris version of ksc5601.h
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit ee279c84e34f1ebb8a6ff17d54ee146d11e29764
+Author: Chris Ball <cjb@laptop.org>
+Date:   Sat Feb 21 14:48:42 2009 -0500
+
+    Fix fi_FI locale install directory.
+    
+    fi_FI was setting "x11thislocaledir" to en_US, with the result that its
+    locale data was written in that locale dir.
+    
+    Signed-off-by: Chris Ball <cjb@laptop.org>
+
+commit da6bbca07c796c69172a649405474f03bee66754
+Author: Emilio Jesús Gallego Arias <egallego@babel.ls.fi.upm.es>
+Date:   Sat Feb 21 20:17:23 2009 +0100
+
+    xcb_io: Avoid datatype overflow on AMD64 and friends.
+
+commit 4ef6491afa69e8441caee7bbebc583e6e796275e
+Author: Chris Ball <cjb@laptop.org>
+Date:   Sat Feb 21 12:51:03 2009 -0500
+
+    Build fix for fi_FI.
+    
+    Commit 642c4e928e770e0.. instructs make to enter nls/fi_FI, but no
+    Makefile is written there by configure.
+    
+    Signed-off-by: Chris Ball <cjb@laptop.org>
+
+commit 642c4e928e770e012379539a6ce09e11c02f09a6
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Sat Feb 21 03:12:05 2009 +0100
+
+    nls: actually use the fi_FI.UTF-8 files
+    
+    The subdir wasn't added to nls/Makefile.am
+
+commit 9bad8309ef289bb943651abf6967b24fa2252aac
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Fri Feb 20 14:45:54 2009 -0800
+
+    flags member of Display structure needs to be marked volatile
+    
+    Since the Xlib multithreaded code checks the flags variable in _XFlushInt
+    to see if the other threads are done yet, it has to be marked volatile so
+    the compiler doesn't optimize out re-loading it on each trip through the
+    while loop and end up in an impossible-to-exit infinite loop of CPU chewing.
+    
+    Part of fix for Sun bug 6409332: infinite loop in XFlushInt() on x86/32-bit
+    <http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6409332>
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit ef5c446395aa30d7b1096a112e241a81c5b358e7
+Author: Xue Wei <Wei.Xue@Sun.COM>
+Date:   Fri Feb 20 15:12:35 2009 -0800
+
+    Add nn_NO.UTF-8 to compose.dir.pre for Norwegian Nynorsk
+    
+    Sun bug 6691236: Swing applications dump core when locale is nn_NO.UTF-8
+    <http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6691236>
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 3822f2654e9630167f0c6cae317b472c09771672
+Author: Xue Wei <Wei.Xue@Sun.COM>
+Date:   Fri Feb 20 15:03:51 2009 -0800
+
+    Add locale aliases for no_NO & sh_BA locale variants
+    
+    Fixes Sun bug id 6691219: xterm refuses to start in some locales
+    <http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6691219>
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit 63b6b5b5f522c0a606b32163c643edb64ca91d54
+Author: Xue Wei <Wei.Xue@Sun.COM>
+Date:   Fri Feb 20 14:23:11 2009 -0800
+
+    Add kk_KZ.UTF-8 to locale.dir.pre for Kazakhstan
+    
+    Fixes Sun bug id 6737254 ("kk_KZ.UTF-8 locale: In Java applications
+     changing keyboard layout with gimlet does not work")
+    <http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6737254>
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit d497301707962f3b94542e999a36abffcfbd303d
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Tue Feb 17 16:09:41 2009 +0100
+
+    Bump to 1.2
+
+commit 990e71361d1d7b79bf07b1dc93e4e905d4f1bdaf
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Tue Feb 17 15:23:40 2009 +0100
+
+    Check Xmalloc return value in _XConnectXCB
+    
+    X.Org bug#19137 <http://bugs.freedesktop.org/show_bug.cgi?id=19137>
+    
+    Signed-off-by: Julien Cristau <jcristau@debian.org>
+
+commit b4b5893f69419ff577bbaa4d18f78e4ffd729a0c
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Sat Feb 14 12:35:56 2009 -0500
+
+    dolt: allow older versions of bash to compile the library
+    
+    Cf xserver commit 7be6520d and bugzilla #19031.
+
+commit 20982d6866e24453642b0b592fa0f13a88aa747c
+Author: Will Thompson <will@willthompson.co.uk>
+Date:   Thu Feb 5 02:53:06 2009 +1100
+
+    NLS: Compose: Non-aliasing CCCP
+    
+    Oops, cccp aliased cc for question mark.  Upper-case it to avoid fail.
+    
+    Signed-off-by: Will Thompson <will@willthompson.co.uk>
+    Signed-off-by: Daniel Stone <daniel@fooishbar.org> (sorry)
+
+commit f052665394f3f0319e93a98f1d5d4ea287e1dd07
+Author: Will Thompson <will@willthompson.co.uk>
+Date:   Wed Feb 4 14:51:11 2009 +0000
+
+    Add two essential compose sequences
+    
+    Signed-off-by: Will Thompson <will@willthompson.co.uk>
+    Signed-off-by: Daniel Stone <daniel@fooishbar.org>
+
+commit d7bea6fa909bf34c43efe0ca8239ab0f9f3a415f
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Mon Feb 2 20:34:31 2009 -0800
+
+    Add README with pointers to mailing list, bugzilla & git repos
+    
+    Signed-off-by: Alan Coopersmith <alan.coopersmith@sun.com>
+
+commit f682c27e93512773122887d2cbabb1657af45d2e
+Author: Paulo Cesar Pereira de Andrade <pcpa@mandriva.com.br>
+Date:   Mon Feb 2 16:36:39 2009 -0200
+
+    Check if a function argument is NULL.
+    
+      This was an addition to patch (also by me)
+    https://bugs.freedesktop.org/attachment.cgi?id=14660
+    that was not added when rediscovering/correcting the problem.
+
+commit 427e9d45d424b84efd9fc499aebf8d72392844c5
+Author: Paulo Cesar Pereira de Andrade <pcpa@mandriva.com.br>
+Date:   Thu Feb 28 15:58:12 2008 -0300
+
+    Allow multiple inclusions of cursorfont.h, cosmetic patch.
+
+commit b91524a53e691f6a5d278fd8972b48a14ebeedeb
+Author: Paulo Cesar Pereira de Andrade <pcpa@mandriva.com.br>
+Date:   Thu Feb 28 15:54:43 2008 -0300
+
+    Don't add prototypes for functions that don't exist.
+    
+    Note that a full review was not done, only for functions that receive
+    char/short arguments, or one of it's parameters is a function pointer
+    that requires char/short arguments.
+
+commit 537eb52fe266ac439c4b383bb04a70017b709911
+Author: Paulo Cesar Pereira de Andrade <pcpa@mandriva.com.br>
+Date:   Thu Feb 28 15:50:27 2008 -0300
+
+    WORD64 compile fix. This bug catched on a overview of the code.
+    
+    The code is wrong since the first git revision, so it seens that it has
+    not been compiled with WORD64 for quite some time, there is also another
+    interesting code in xkb/XKBRdBuf.c:
+      <hash>ifdef WORD64
+      _XkbWriteCopyData32 Not Implemented Yet for sizeof(int)==8
+      <hash>endif
+    and possibly there are other similar problems.
+
+commit ffd0300fb74c6183208ae599133f2ded09e08d97
+Author: Brian Rogers <brian@xyzw.org>
+Date:   Sat Jan 31 10:37:51 2009 -0800
+
+    Initialize event_notify after allocating the memory for it.
+    
+    An uninitialized or otherwise invalid condition variable can apparently
+    cause a hang in pthread_cond_broadcast. Ekiga, openoffice, and xine
+    at least are freezing as a result of event_notify never being initialized.
+    
+    Signed-off-by: Brian Rogers <brian@xyzw.org>
+    Signed-off-by: Bart Massey <bart@cs.pdx.edu>
+
+commit 97fc6babd4ccaf300e25708868aa2a738893dc30
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Thu Jan 29 20:10:41 2009 -0500
+
+    NLS: Add UTF-8 compose file for Finnish
+    
+    From bug report:
+    
+      https://bugs.freedesktop.org/show_bug.cgi?id=18747
+
+commit 1bd2966ed88f83479a066c6ca7da23a515979550
+Author: Paulo Cesar Pereira de Andrade <pcpa@mandriva.com.br>
+Date:   Thu Jan 29 20:25:15 2009 -0200
+
+    patches to avoid gcc warnings for libX11 (#4)
+    
+    Author is Peter Breitenlohner <peb@mppmu.mpg.de>
+    Bug #17946, attachment #19443
+    
+    This patch avoids the gcc warning
+       ../../../../libX11-1.1.5/modules/im/ximcp/imDefLkup.c:223: warning: passing arg 1 of `_XimProcSyncReply' from incompatible pointer type
+    (same as already done at other places)
+    
+    BTW: what is the difference between XIM (the type of ic->core.im)
+    and Xim ?
+
+commit f16dd6af3eb17a25b8ee03d6617a7acc6e919fb0
+Author: Paulo Cesar Pereira de Andrade <pcpa@mandriva.com.br>
+Date:   Thu Jan 29 20:22:21 2009 -0200
+
+    patches to avoid gcc warnings for libX11 (#3)
+    
+    Author is Peter Breitenlohner <peb@mppmu.mpg.de>
+    Bug #17946, attachment #19441
+    
+    This patch avoids the two gcc warnings
+       ../../../../libX11-1.1.5/modules/im/ximcp/imRm.c:413: warning: assignment discards qualifiers from pointer target type
+       ../../../../libX11-1.1.5/modules/im/ximcp/imRm.c:450: warning: assignment discards qualifiers from pointer target type
+    
+    Note, that this as a rather crude fix of the problem (and it is really a
+    shame to cast name_table to non-const).
+    
+    The right solution would be to declare XIMValuesList.supported_values
+    (in include/X11/Xlib.h) as 'const char **' (or '_Xconst char **').
+    This will, however, require extensive modifications in various places.
+
+commit cce75c5dce73fe1f8626ed9e6798138ada09a860
+Author: Paulo Cesar Pereira de Andrade <pcpa@mandriva.com.br>
+Date:   Thu Jan 29 20:20:18 2009 -0200
+
+    patches to avoid gcc warnings for libX11 (#2)
+    
+    Author is Peter Breitenlohner <peb@mppmu.mpg.de>
+    Bug #17946, attachment #19440
+    
+    Avoid a preprocessor message
+       <stdin>:194: warning: no newline at end of file
+    
+    Two more such warnings (in XkbSAGroup.man and XkbSASetGroup.man)
+    seem to be caused by a truncated (or otherwise incomplete)
+    manpage.
+
+commit 692baebcc50f1e952800bfe4e2e6bc42f54e62fe
+Author: Paulo Cesar Pereira de Andrade <pcpa@mandriva.com.br>
+Date:   Thu Jan 29 20:12:24 2009 -0200
+
+    patches to avoid gcc warnings for libX11 (#1)
+    
+    Author is Peter Breitenlohner <peb@mppmu.mpg.de>
+    Bug #17946, attachment #19439
+    
+    Define as 1 (one) as done by autoconf and the command line
+    option, e.g. -DX11_t, not as empty.
+    
+    This avoids the gcc (3.4.6) warnings:
+       ../../libX11-1.1.5/src/x11_trans.c:27:1: warning: "X11_t" redefined
+       <command line>:7:1: warning: this is the location of the previous definition
+       ../../libX11-1.1.5/src/x11_trans.c:28:1: warning: "TRANS_CLIENT" redefined
+       <command line>:8:1: warning: this is the location of the previous definition
+    
+    Similarly, follow the autoconf convention to define XTHREADS
+    and XUSE_MTSAFE_API as one.
+    
+    This avoids analogous warnings when compiling libXcomposite,
+    libXcursor, and libXdamage.
+    
+    No reason to AC_SUBST XTHREADS and XUSE_MTSAFE_API (unused).
+
+commit a1977883c9f5ef0e515569d6e2ebccb07411f98c
+Author: Paulo Cesar Pereira de Andrade <pcpa@mandriva.com.br>
+Date:   Thu Jan 29 15:01:06 2009 -0200
+
+    Janitor: Correct some gcc/sparse warnings.
+    
+      Most remaining warnings are about XIM/Xim to/from conversion
+    and discarding const from pointers.
+
+commit 8ba0ca32a63c532f128bdca7f1bf982cab8e12be
+Author: Paulo Cesar Pereira de Andrade <pcpa@mandriva.com.br>
+Date:   Wed Jan 28 20:31:42 2009 -0200
+
+    Janitor: ansification, make distcheck, compiler warnings.
+    
+      Only convert to use "ansi prototypes" the functions warned from
+    compilation with "./autogen.sh --prefix=/usr", on a Linux computer.
+    
+      Also, only address "trivial" compiler warning fixes in this commit.
+    
+      The new .gitignore is the output of a command like:
+    % find . -name .gitignore -exec cat {} \; | sort | uniq
+    and only the toplevel .gitignore file was kept.
+
+commit 091c1624fd2f9d933329d6152e4ecd865aa7903a
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Tue Jan 13 12:05:54 2009 +1000
+
+    Fix wrong implies symbol.
+    
+    Quote Simos Xenitellis:
+    > I checked the gtk+ commit logs that go back to 2000, and I see that still it
+    > was
+    >
+    >   { 0x08ce, 0x21d2 }, /*                     implies ⇒ RIGHTWARDS
+    > DOUBLE ARROW */
+    >
+    > In XFree86, it appears there was an error when they converted the
+    > original table to
+    > http://cvsweb.xfree86.org/cvsweb/xc/lib/X11/imKStoUCS.c?rev=1.1&content-type=text/vnd.viewcvs-markup
+    > and the problem still shows up there (November 2000).
+    
+    http://lists.freedesktop.org/archives/xorg/2008-October/039743.html
+    
+    Reported by Erik Streb del Toro.
+
+commit e32521f19e0b07649b7e3a03d56a2bd556b138fb
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Sun Dec 7 04:13:34 2008 -0500
+
+    [i18n] s/U00DC/Udiaeresis/g
+    
+    The xkeyboard-config keyboards generate the symbol Udiaeresis, not
+    U00DC.  Make sure the relevant Compose sequences expect the symbol
+    which the keyboards actually send.
+
+commit b7502abfe22f8dc009b21cda1172af221d8f9f32
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Sun Dec 7 04:09:46 2008 -0500
+
+    Revert "For nls/*.pre, allow people to comment lines by starting them with '##'."
+    
+    As of commit c9d20e3 the initial double-hashes are replaced with proper C comments.
+    
+    This reverts commit a225a0be48770beb689d5ac5da97073634f7deab.
+
+commit c9d20e3f697c9cfae5511412023362c1db7449b1
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Sun Dec 7 04:08:23 2008 -0500
+
+    Use C comments rather than initial doubled hashes to exclude lines from .pre files
+
+commit c34ce54d9eac2d8052dc5f205a2ab09866ef5d25
+Author: vehemens <vehemens@verizon.net>
+Date:   Sun Dec 7 01:18:26 2008 -0500
+
+    [i18n] Distribute new headers which were added for gb18030 support.
+    
+    big5hkscs.h and gbk.h, added in 67e34d7a, need to be in SOURCES to
+    make it into the tar.
+    
+    Completes 67e34d7a82ccd31f1208c0c43a6d58c3c05bf51.
+    
+    Signed-off-by: James Cloos <cloos@jhcloos.com>
+
+commit 418819558d2c60e58b4e3022ce0fadf2143488ac
+Author: Stefan Dirsch <sndirsch@suse.de>
+Date:   Sat Nov 22 22:01:07 2008 +0100
+
+    Fixed strange font mixups, when fontsets are still used (#2676, Novell #74299).
+
+commit 67e34d7a82ccd31f1208c0c43a6d58c3c05bf51a
+Author: Stefan Dirsch <sndirsch@suse.de>
+Date:   Sat Nov 22 19:40:54 2008 +0100
+
+    Added remaining xlib patch required for gb18030 support (#1573).
+
+commit 55782a0a1fe1560f1a9c0ed78bc7f2575c15abcf
+Author: Stefan Dirsch <sndirsch@suse.de>
+Date:   Sat Nov 22 17:53:06 2008 +0100
+
+    Added remaining hunk of Egbert's patch to prevent XIM deadlocks (#1182).
+
+commit c859446c500c883a67f7a86cab1a44844e24dade
+Author: Ken Thomases <ken@codeweavers.com>
+Date:   Fri Nov 21 13:58:10 2008 -0500
+
+    [i18n] Provide translation from XK_partialderivative (8ef) to Unicode (U2202)
+    
+    Signed-off-by: James Cloos <cloos@jhcloos.com>
+
+commit 5e68e94d852c730ef9264fc0d8ca61a2ffe98b53
+Author: Jeremy Huddleston <jeremyhu@freedesktop.org>
+Date:   Mon Nov 17 20:47:26 2008 -0800
+
+    Force local transport when using the launchd socket.
+    
+    Fixes a regression due to
+    bf53987eaf0fbd7f7627783fc39e7ee99e8361ba
+
+commit 7aca689ce14d314b5c8c72c8df76f53f76ab467c
+Author: Peter Hutterer <peter.hutterer@redhat.com>
+Date:   Fri Nov 14 10:32:50 2008 +1000
+
+    Add XF86Suspend, XF86Hibernate to KeysymDB.
+
+commit d16b11f25f8265e651def8d80bcd430c0448e664
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Tue Nov 11 19:43:39 2008 -0500
+
+    [nls] Annotate the Bépo compose sequences
+    
+    Add comments with the UCS names.
+    Add utf-8 strings for each result.
+    Format for easy reading.
+
+commit 730298464240be6f65b32416b3f9b20062c61825
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Tue Nov 11 16:41:34 2008 -0500
+
+    [nls]  Add some UTF-8 Compose sequences
+    
+    As requested for the Bépo keyboard layout (http://clavier-dvorak.org/wiki/).
+    
+    Cf. bugs:
+    
+      https://bugs.freedesktop.org/show_bug.cgi?id=17821
+      https://bugs.freedesktop.org/show_bug.cgi?id=17822
+
+commit ad6008a0c92733826983eb93f063d3d6276007d8
+Author: Colin Harrison <colin.harrison@virgin.net>
+Date:   Thu Nov 6 17:48:21 2008 -0500
+
+    Fix copy/paste typo in imLcPrs
+    
+    Signed-off-by: James Cloos <cloos@jhcloos.com>
+
+commit 0f0168ad18f8a280fc5a689eb02cfaa62d022ea6
+Author: Adam Jackson <ajax@redhat.com>
+Date:   Thu Nov 6 14:54:13 2008 -0500
+
+    Fix leak in _XimXGetReadData
+    
+    Spotted by Denis Dzyubenko
+
+commit ae23c25b9349ab1d7ff81f3075c000cf35fc442b
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Wed Nov 5 22:09:37 2008 +0100
+
+    Bump to 1.1.99.2
+
+commit d31e644c65c52828ea3e7abd94a8cf9aee12265c
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Wed Nov 5 21:33:13 2008 +0100
+
+    Fix distcheck
+
+commit e6a7b70cdb2ae8b713012839a0a0bbb93817b8ef
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Wed Oct 29 14:00:33 2008 -0700
+
+    Support multiple independent internal sync handlers
+    
+    Xlib has several independent tasks that need to be performed with the
+    display unlocked. It does this by replacing the existing sync handler with
+    one of a variety of internal sync handlers. However, if multiple internal
+    sync handlers need to run, then the last one registering wins and
+    previously registered internal sync handlers are never invoked. This
+    manifested as a bug with DRI applications on Xlib/XCB as that requires
+    both an XID handler after every XID allocation, and the periodic sequence
+    number handler. The XID handler would win, and the sequence number handler
+    would never be invoked.
+    
+    Fix this by unifying the internal sync handler mechanism into a single
+    function that calls all of the known internal sync handlers. They all need
+    to deal with being called when not strictly necessary now.
+    
+    Signed-off-by: Keith Packard <keithp@keithp.com>
+    Signed-off-by: Jamey Sharp <jamey@minilop.net>
+    Signed-off-by: Josh Triplett <josh@freedesktop.org>
+
+commit 2dbaaab9c4e3894b33dcae850551dee5473431d5
+Author: Keith Packard <keithp@keithp.com>
+Date:   Sat Oct 11 21:44:21 2008 -0700
+
+    Ensure that _XReadEvents always leaves an event in the queue on return
+    
+    XNextEvent assumes that the event queue will be non-empty on return from
+    _XReadEvents, but with multiple event readers running, the previous change
+    could leave the queue empty on return from process_responses. Re-invoke
+    process_responses until the queue is non-empty.
+    
+    Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit bedfe68259037c5564fe52758c92b9c97729640a
+Author: Keith Packard <keithp@keithp.com>
+Date:   Sat Oct 11 21:10:23 2008 -0700
+
+    Permit only one Xlib thread to block waiting for events
+    
+    As Xlib queues events internally, we must prevent multiple Xlib threads from
+    entering XCB to wait for an event in case the queued event is to be
+    delivered to the thread which didn't manage to read it. In other words, let
+    only one Xlib thread into xcb_wait_for_event at a time.
+    
+    Jamey Sharp looked over my shoulder while making this fix and, while hating
+    my whitespace conventions, appears happy enough with the actual code.
+    
+    Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit cc19618d2eb3ed92a0b574aee26a7da8b4aed5d2
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Sun Mar 23 16:33:50 2008 -0700
+
+    Fix XAllocID race: hold the user display lock until we have a new XID.
+    
+    Xlib built --without-xcb is also vulnerable to this race, and a similar
+    fix might work there too.
+    
+    Also, use an XID that's truly invalid while waiting for the next XID to be
+    requested.
+
+commit 54e5c0941b0ded1628d559a9f0a3451ea96c299b
+Author: Josh Triplett <josh@freedesktop.org>
+Date:   Sat Mar 15 17:22:23 2008 -0700
+
+    Use XCB's new socket handoff mechanism rather than the old XCB Xlib lock.
+    
+    Previously, Xlib/XCB used XCB's Xlib lock to prevent XCB from sending
+    requests between calls to Xlib's LockDisplay and UnlockDisplay macros.
+    Xlib/XCB then sent all of its requests using XCB's xcb_send_request, and
+    had to flush its requests when unlocking the display.
+    
+    XCB 1.2 adds a new socket handoff mechanism, xcb_take_socket.  Replace
+    much of the existing Xlib/XCB implementation with the use of
+    xcb_take_socket to take ownership of the write side of the X connection
+    socket, and a return_socket callback which writes any outstanding requests
+    with xcb_writev.  This approach allows Xlib/XCB to use the same buffering
+    as traditional Xlib did.  In particular, programs which use Xlib/XCB and
+    never make XCB calls will never need to hand the socket back to XCB, and
+    vice versa.
+    
+    This allows us to discard large quantities of synchronization code from
+    Xlib/XCB, together with the synchronization bugs present in that code.
+    Several test cases which previously failed now work perfectly, including
+    multi-threaded ico.  In addition, the infamous locking correctness
+    assertions, triggered when double-locking or when unlocking without a
+    previous lock, no longer exist, because Xlib/XCB no longer has any reason
+    to care more about application locking than traditional Xlib does.
+    
+    Furthermore, the handoff approach provides great improvements to
+    performance.  Results from x11perf's XNoOp test, which represented the
+    worst case for the lock-based Xlib/XCB:
+    
+    Traditional Xlib:       average 19100000/sec
+    Lock-based Xlib/XCB:    average  3350000/sec
+    Handoff-based Xlib/XCB: average 17400000/sec
+    
+    Thus, for no-ops, the handoff mechanism provides more than a 4x speedup to
+    Xlib/XCB, bringing Xlib/XCB within 9% of traditional Xlib no-op
+    performance.  Of course, real-world workloads do not use no-op, so your
+    mileage may vary.  In particular, since no-ops represent the worst case,
+    we expect real workloads to more closely match the performance of
+    traditional Xlib.
+    
+    While removing synchronization code, we changed _XReply to not drop any
+    locks when calling xcb_wait_for_reply; previously, we had to carefully
+    avoid a deadlock between the Display lock and the XCB Xlib lock. Holding
+    the locks reduces implementation complexity and should not impact
+    applications.
+    
+    Commit by Jamey Sharp and Josh Triplett.
+    XCB's handoff mechanism inspired by Keith Packard.
+
+commit 5a19ac473f7a8046b0421fbd5d53da160c22ed75
+Author: Chris Ball <cjb@laptop.org>
+Date:   Mon Nov 3 22:57:29 2008 -0500
+
+    Remove configure check for xcb-xlib.
+    
+    xcb-xlib has been intentionally removed from libxcb; stop checking for
+    it at configure-time.
+
+commit 34b35dda0bb7f3cf0ad9ab95ad7953d35d24f71b
+Author: Josh Triplett <josh@freedesktop.org>
+Date:   Wed Oct 29 14:37:44 2008 -0700
+
+    .gitignore: Add dolt files
+
+commit 1290cccf2d90083eba852f5f413f7e3dff48ccd2
+Author: Peter Hutterer <peter.hutterer@redhat.com>
+Date:   Tue Oct 28 11:56:55 2008 +1030
+
+    man: fix formatting error in XkbGetIndicatorState man page.
+
+commit b1022fa6d7e97640049e93ffa108083fc8d71b05
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Sat Oct 25 09:13:08 2008 -0400
+
+    Increase size of working arrays in the makekeys utility program.
+    
+    Makekeys is used to create an optimal hash of the keysyms defined
+    in x11proto’s keysymdef.h.
+    
+    The recent addition of new keysyms there has triggered a bug in
+    makekeys where it tries to use a zero on the rhs of the % (mod)
+    operator (resulting in a divide by zero error) whenever it fails
+    to find a solution within its constraints.
+    
+    Increasing the size of the arrays allows it to find a solution for
+    the current set of keysyms.
+    
+    Makekeys is only run durring the build process, so this has no impact
+    on users of libX11, only on the amount of VM needed to build it.
+    
+    It still needs a more complete fix, but this allows compiles to
+    progress until that is completed.
+
+commit 3e9afd501e40d76040635bd9a3045bcaf5a03b60
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Sat Oct 11 01:03:14 2008 -0400
+
+    Dolt-ify
+    
+    Add dolt to acinclude.m4 and call it it configure.ac to speed compiles.
+
+commit 39c0b266cac8cbc15bf501d7869186862f01d823
+Author: Peter Hutterer <peter.hutterer@redhat.com>
+Date:   Wed Oct 15 14:30:20 2008 +1030
+
+    Add more keysyms for PS3 BD remotes, Ericsson Phones #16519
+    
+    X.Org Bug 16519 <https://bugs.freedesktop.org/show_bug.cgi?id=16519>
+
+commit d23aad31338e7d869d878d5aa1b6b91d20287005
+Author: Peter Hutterer <peter.hutterer@redhat.com>
+Date:   Mon Oct 13 09:41:59 2008 +1030
+
+    Add XF86Battery, XF86Bluetooth, XF86WLAN, XF86UWB to keysymdb.
+
+commit 214ea6f5fd6aeaa7303ea4a69f9aedabf219ec4c
+Author: Peter Hutterer <peter.hutterer@who-t.net>
+Date:   Thu Jul 24 15:44:26 2008 +0930
+
+    xkb: fix out-by-1 error in _XkbWriteKeyExplicit.
+    
+    Thanks to Michael Meeks, Novell Bug 369263.
+    https://bugzilla.novell.com/show_bug.cgi?id=369263
+
+commit e7ece39afc8e0adc3b6b1e70b337b98376754462
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Tue Oct 7 15:41:38 2008 -0700
+
+    Sun bug #6739431: double free in _X11TransConnectDisplay()
+    
+    Double free() introduced in bf53987eaf0fbd7f7627783fc39e7ee99e8361ba
+    After copying original_hostname to phostname, set original_hostname
+    to NULL, so we don't free the same pointer twice when we free both
+    original_hostname and phostname.
+    
+    <http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6739431>
+
+commit 0877bc916afbd1ff8f1833edc930b765ea783576
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Tue Sep 23 19:02:02 2008 +0300
+
+    configure.ac: Fix CC_FOR_BUILD logic error
+    
+    Turns out we were accidentally smashing it so that you couldn't set it
+    externally at all.  Oops.
+
+commit 58bf3aa746908f01c37be7045699e43a4e270944
+Author: John Tapsell <johnflux@gmail.com>
+Date:   Tue Sep 23 17:30:13 2008 +0300
+
+    Build: Use native compiler for makekeys
+    
+    makekeys needs to be run during the build process, as opposed to on the
+    target, so build it with either of gcc or cc to fix cross-compiling.
+    This can be overridden by setting $CC_FOR_BUILD.
+
+commit 340422a5c7a413faef18666cada27cee14615250
+Author: Adam Jackson <ajax@redhat.com>
+Date:   Wed Sep 17 12:54:34 2008 -0400
+
+    Fix the previous patch for the BadFont case.
+
+commit 2335eafe4b53c27f6f9ee1bab3e1f5842f896428
+Author: Matthias Clasen <mclasen@redhat.com>
+Date:   Wed Sep 17 10:43:52 2008 -0400
+
+    Bug #17616: Fix an XCB leak when the client has a non-fatal error handler.
+
+commit db0b85db29699be6bf7e78dede655d59ba926dfc
+Author: Rafael Ávila de Espíndola <rafael.espindola@gmail.com>
+Date:   Sun Sep 14 19:15:26 2008 -0400
+
+    Fix problem with <dead_acute> <c> in pt_BR.UTF-8
+    
+    The <dead_acute> <C> and <dead_acute> <c> lines in the pt_BR UTF-8
+    Compose file show "Ç" and "ç" (c with cedilla accent) (akin to the
+    ISO 8859 pt_BR Compose file) as the string but specify the keysym
+    and comment for Ć and ć (c with acute accent).
+    
+    This commit normalizes those two lines to match the specified string.
+    
+    Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=4671
+    
+    Signed-off-by: James Cloos <cloos@jhcloos.com>
+
+commit b065c011baa69b69e3ea77c30d5e153c0d103e2d
+Author: Michael Verret <michael.verret@gmail.com>
+Date:   Mon Sep 8 16:33:35 2008 -0400
+
+    Fix documentation typo
+    
+    Signed-off-by: James Cloos <cloos@jhcloos.com>
+
+commit 4213ea95185377bdd1b51e82933f331fc0f52e5b
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Sat Sep 6 04:19:19 2008 -0400
+
+    Remove extraneous <angle brackets> from the Ethiopic Compose file.
+    
+    The am_ET.UTF-8 Compose file submitted in:
+    
+    https://bugs.freedesktop.org/show_bug.cgi?id=11307
+    
+    for the OLCP project used incorrect syntax.  (It has angle brackets around the
+    Uxxxx symbols on the right hand side rather than only on the left hand side).
+    
+    This bug is noted in OLPC’s ticket:
+    
+    http://dev.laptop.org/ticket/7474
+    http://dev.laptop.org/attachment/ticket/7474/olpc_7474_dead_vowels_libX11.patch
+
+commit 9df84b513dd2b6e65e6d528cfac6d4cc3ea46918
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Mon Sep 1 17:49:33 2008 -0400
+
+    Complete the set of vulgar fractions
+    
+    Unicode 1.1 added thirds, fifths, sixths and eights;
+    we might as well catch up.
+    
+    (Unicode and ISO 10646 have 1/7 (U2150), 1/9 (U2151), 1/10 (U2152)
+    and 0/3 (U2189) in their pipelines, but those four can be added
+    here after they are published.)
+
+commit a788792e9de95f8db0639557859722a35087481d
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Wed Aug 20 15:28:07 2008 -0400
+
+    nls (en_US) Re-remove long compositions that override shorter
+    
+    As reported in <https://bugs.freedesktop.org/show_bug.cgi?id=17228>:
+    
+      Commit a6f4bbf7
+        nls (en_US): remove long compositions that override shorter [...]
+        removed some longer compose sequences because there are shorter
+        ones which take preference over the longer. For example the
+        sequences:
+    
+          <Multi_key> <apostrophe> <comma> <c>   : U1E09 # ḉ
+          <Multi_key> <apostrophe> <comma> <C>   : U1E08 # Ḉ
+    
+        were removed becase there already was:
+    
+          <Multi_key> <apostrophe> <comma>       : U201A # ‚
+    
+      Then commit 4ba09125
+        Work on making the en_US and pt_BR UTF-8 Compose as similar as
+        possible added exactly the same key sequences again. Obviusly
+        they won't work.
+
+commit 55248e5c84c3fd8c349a3bb4cb15a1ec86989d74
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Thu Jul 17 21:01:42 2008 -0400
+
+    Add more <Multi_key> <cedilla> Compose tuples
+    
+    The last commit missed the el_GR UTF-8 Compose.pre as well as
+    the various ISO 8859 locales which have compose sequences
+    generating ‘WITH CEDILLA’ characters.
+    
+    (Interestingly, some of the 8859 locales already supported
+    <Multi_key> <cedilla> for some CEDILLA characters, but not
+    for Ç or ç.)
+    
+    This is further work on bug 10397.
+
+commit 4ba091255bb953d53078ba5619d6751052c739f7
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Thu Jul 17 17:16:50 2008 -0400
+
+    Work on making the en_US and pt_BR UTF-8 Compose as similar as possible.
+    
+    The eventual goal here is to have a single primary UTF-8 Compose
+    file which the locale-specific UTF-8 Compose.pre files can #include.
+
+commit 254522d3c24e0590732fc03cdd61ff4564819d94
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Thu Jul 17 17:13:36 2008 -0400
+
+    Add <Multi_key> <cedilla> Compose tuples
+    
+    The en_US and pt_BR UTF-8 Compose tables had support for using <comma>
+    with <Multi_key> to enter CEDILLA characters.  Bug 10397 requests
+    support for using <cedilla> instead of <comma> in said sequences.
+    
+    This commit makes both styles work.
+
+commit 7dc907f6032e1d5cbe4da0e414bdf2c569c04b44
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Sat Jun 28 15:25:23 2008 -0400
+
+    Fix commit 21e464ec682ab23ba20ddf6bd72c6db214cfbe01
+    
+    The new block was added twice to the en_US.UTF-8 Compose.pre;
+    delete the duplicate.
+
+commit 596e081b7457dcd1c4ad555ac140e6999239bc0d
+Author: Peter Hutterer <peter@cs.unisa.edu.au>
+Date:   Sat Jun 28 20:14:05 2008 +0930
+
+    Fix unbalanced parenthesis in XKBlib.h # 16551
+    
+    X.Org Bug 16551 <http://bugs.freedesktop.org/show_bug.cgi?id=16551>
+
+commit f6af6dd2f76c12b56ec166bb771457b9f08fe246
+Author: Adam Jackson <ajax@redhat.com>
+Date:   Tue Jun 24 13:16:53 2008 -0400
+
+    Bug #14898: Don't abuse the sprintf() implementation.
+    
+    The thing you're printing into should not itself appear in the list of
+    things to print from, that's bad juju.  Just use strcat().
+
+commit 21e464ec682ab23ba20ddf6bd72c6db214cfbe01
+Author: Khaled Hosny <khaledhosny@eglug.org>
+Date:   Thu Jun 19 18:26:11 2008 -0400
+
+    NLS: Add Arabic Lam-Alef ligature compose sequences (bug #16426)
+    
+    Add some Arabic digraphs to utf-8 locales with a Compose.pre
+    
+    Signed-off-by: James Cloos <cloos@jhcloos.com>
+
+commit bf53987eaf0fbd7f7627783fc39e7ee99e8361ba
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Wed Jun 18 20:00:25 2008 -0700
+
+    Rework code to choose local connection types and fallback to others
+    
+    Adds --with-local-transport-order configure flag if you don't like the
+    default ordering (which is platform dependent)
+    
+    Includes fixes for these Sun/Solaris bug ids:
+    6678250 X Commands returning incorrect display value unix:0.0 not <system>:0.0
+    <http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6678250>
+    6716481 libX11 should prefer Unix domain sockets over named pipes on Solaris
+    <http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6716481>
+
+commit cf49e537014c3cb5aaee07e57400933e0bb72b6b
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Tue Jun 17 14:41:17 2008 -0700
+
+    Strip whitespace from end of lines in source files
+
+commit f76fd81dfbbd5cfae75c87ce0511e88e08529cf3
+Author: Jeff Smith <whydoubt@yahoo.com>
+Date:   Sun Jun 15 23:52:20 2008 -0500
+
+    Fix memory leak in XOpenDisplay
+    
+    Signed-off-by: Peter Hutterer <peter@cs.unisa.edu.au>
+
+commit fca0b0ba3f72b7284601d4690bba99fc80a92614
+Author: Jens Herden <jens@khmeros.info>
+Date:   Tue Jun 10 20:07:30 2008 +0300
+
+    NLS: Add Khmer compose sequences (bug #5706)
+    
+    Add some Khmer digraphs to all locales with a Compose.pre.
+
+commit e54cffb649b1622c17457e470cfab8cc56d38c97
+Merge: 19802cc 721b574
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Tue Jun 10 20:04:30 2008 +0300
+
+    Merge branch 'master' of ssh://git.freedesktop.org/git/xorg/lib/libX11
+
+commit 721b574d36f1884c3f1bf7bd933646e2ed6680b5
+Author: Peter Hutterer <peter@cs.unisa.edu.au>
+Date:   Thu May 29 10:57:21 2008 +0930
+
+    Bump to 1.1.99.1
+
+commit 631d32d13247d1cf52c0833d438c5b38b01b17a4
+Author: Peter Hutterer <peter@cs.unisa.edu.au>
+Date:   Wed May 28 17:31:59 2008 +0930
+
+    Require xproto 7.0.13 and libxcb 1.1.90 (for GenericEvents)
+
+commit e9195db7257e418f83707233baeeb84b225caf4f
+Merge: c34f76f a7f8556
+Author: Peter Hutterer <peter@cs.unisa.edu.au>
+Date:   Thu May 22 12:14:28 2008 +0930
+
+    Merge branch 'master' into xge
+
+commit 19802ccd3909145e3ba2f6c073271cb5f3701685
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Mon May 19 19:22:31 2008 +0300
+
+    gitignore: Update with loads more bits from server
+
+commit a7f85567a3e850fba0c44571453d2852ab1a09be
+Author: Adam Jackson <ajax@redhat.com>
+Date:   Tue May 13 10:28:39 2008 -0400
+
+    Bug #15884: Remove useless sleep()'s from the connection code.
+    
+    For network transports, there's enough delay in the network layer
+    already without adding more.  For local transports, just hurry up
+    and fail if the server isn't there.
+
+commit c34f76f475bc632490122e67b5a82575d69d5569
+Author: Peter Hutterer <peter@cs.unisa.edu.au>
+Date:   Mon May 12 21:46:24 2008 +0930
+
+    Pull down extra bytes when reading a GenericEvent (non-xcb).
+    
+    I refuse to take any responsibily for this code. It works, I guess.
+    But - all the flushing is done somewhere before that, so we might need to
+    flush here. Under some circumstances anyway. Don't ask me, I'm an optical
+    illusion.
+    
+    Build with xcb as transport layer highly recommended.
+
+commit c9b2ff1e6a607463993afa4a8d085857d97cc2f3
+Merge: 17d7dcb 9129057
+Author: Peter Hutterer <peter@cs.unisa.edu.au>
+Date:   Mon May 12 17:58:37 2008 +0930
+
+    Merge branch 'master' into xge
+
+commit 9129057bdbff0ec9cd8bb780cf7f85f134a291eb
+Author: Teemu Likonen <tlikonen@iki.fi>
+Date:   Wed May 7 21:44:22 2008 +0300
+
+    Change <dead_belowdot> to <dead_belowring> for U+1E00 and U+U1E01
+    
+    Commit 6b6caeea830a977bdb54688cfb648d879821e752 added <dead_belowdot>
+    <A> and <dead_belowdot> <a> compose sequences for letters U+1E00 and
+    U+U1E01 (LATIN CAPITAL/SMALL LETTER A WITH RING BELOW). This caused
+    duplicate compose sequences since these have already been defined. Also,
+    using <dead_belowring> is more logical since the diacritic is indeed
+    a "RING BELOW".
+
+commit 01a9cb58888d290cc3d319feec4ee4a0297a844c
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Wed May 7 20:04:44 2008 +0300
+
+    NLS: Make UTF-8 the default for Russian
+    
+    No-one uses 8859-5 anymore, so make the default for Russian UTF-8; the
+    only other possible answer would be KOI8-R.
+    
+    Signed-off-by: Sergey V. Udaltsov <sergey.udaltsov@gmail.com>
+
+commit 407b81bfbbabf6feb565d6da22f9ef9a69016ab8
+Author: Ross Burton <ross@burtonini.com>
+Date:   Tue Apr 29 13:38:10 2008 +0300
+
+    NLS: Add interrobang to UTF-8 compose tables (bug #15653)
+    
+    It is what it says on the box.
+
+commit 0b6682303e9c61fefc3818acfda616b1e3691abf
+Author: Theppitak Karoonboonyanan <thep@linux.thai.net>
+Date:   Mon Apr 28 11:51:25 2008 +0300
+
+    IM: Respect XMODIFIERS for Thai locale (bug #15719)
+    
+    When looking at Thai input methods, make sure XMODIFIERS is checked
+    before jumping straight into built-in Thai processing, so external XIM
+    servers such as SCIM can be used with Thai.
+
+commit c13aded1b2f830ba5004abb0ec5518f9ea16087e
+Author: Colin Harrison <colin.harrison-at-virgin.net>
+Date:   Sat Apr 26 18:56:05 2008 +0100
+
+    Fix missing error condition
+
+commit f5c5ffc175cb383c92ea0fa8c08cfb087c5f3083
+Author: Colin Harrison <colin.harrison-at-virgin.net>
+Date:   Mon Apr 21 17:24:33 2008 +0100
+
+    Xlib warning fixes
+
+commit 6b6caeea830a977bdb54688cfb648d879821e752
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Fri Apr 18 02:50:55 2008 -0400
+
+    Add some dead_key sequences to en_US.UTF-8 Compose table
+    
+    Make use of the new dead key symbols added to x11proto’s
+    commit 44e24a27bca023cf7b799f191fe6d52e12efbe5f (which
+    was in responce to bug #15446).
+
+commit 8f9b039580deaf658e464b7d6254064fcf183df6
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Mon Apr 14 19:09:42 2008 -0700
+
+    Update ac_define_dir macro in acinclude.m4 to 2008-04-12 version
+
+commit 9f5e96eb91ab55dd441c3e94b75caf48c588778f
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Mon Apr 14 18:21:14 2008 -0700
+
+    Fix mismatched brace indenting
+
+commit a19f9c65ee9e5e5d783feaa84998c36439b0288b
+Author: Bart Massey <bart@cs.pdx.edu>
+Date:   Fri Apr 4 18:58:45 2008 -0700
+
+    added error check in Xcms color file parser; closes bug #15305
+
+commit 12e8d0d01dd72ce98e7683ddb1bde181b7ed246f
+Author: Christian Weisgerber <naddy@mips.inka.de>
+Date:   Tue Mar 18 07:30:05 2008 +0100
+
+    ConnDis: properly cast 'addr' before accessing it as a byte array.
+    
+    If you use XDM-AUTHORIZATION-1 authorization keys for remote X11
+    clients over IPv6, the clients are liable to segfaults.
+
+commit 64325f38bab082a8e0e9ce779a8e582de5c8588e
+Author: Josh Triplett <josh@freedesktop.org>
+Date:   Sat Mar 15 12:29:33 2008 -0700
+
+    Fix fd.o bug 15023: make Xlib sync correctly given many void requests
+    
+    If given many requests without replies, Xlib may not sync until it flushes
+    the output buffer.  Thus, if Xlib can fit enough requests in the buffer to
+    pass by the number of requests it would normally sync after (65536 -
+    BUFSIZE/sizeof(xReq)), it will sync too late.  The test case in bug 15023
+    demonstrated this by issuing a request with a reply (ListExtensions) at
+    just the right time to get confused with the GetInputFocus reply issued in
+    response to the sync 65,536 requests later; the test case used an async
+    handler to watch the replies, since otherwise it could not issue a request
+    without waiting for the response.  When the test case failed, Xlib's sync
+    handler would eat the ListExtensions reply, and the test case's async
+    handler would see the GetInputFocus reply.
+    
+    Fix this by replacing SEQLIMIT with a function sync_hazard() that uses the
+    buffer size to figure out when the sequence numbers could potentially wrap
+    before the next flush.
+    
+    With this commit, the test case consistently passed, and the async reply
+    handler always saw the ListExtensions reply.
+    
+    Commit by Jamey Sharp and Josh Triplett.
+
+commit a5395563bbee15fabe1e8fd7aa86f9f314d8d30e
+Author: Colin Harrison <colin.harrison@virgin.net>
+Date:   Sat Mar 15 13:39:13 2008 -0400
+
+    Fix typo
+    
+    Signed-off-by: James Cloos <cloos@jhcloos.com>
+
+commit f07585ca27a8487bc66dfe41486c823f0fdcea7d
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Sat Mar 15 17:32:57 2008 +0200
+
+    configure.ac: Don't search for legacy X11 headers
+    
+    This can actually break cross-compiles, so don't do it anymore.
+
+commit bf69541238c7df6606340c0f389e5c47149b29c7
+Author: Matthieu Herrb <matthieu.herrb@laas.fr>
+Date:   Sun Mar 9 09:08:07 2008 +0100
+
+    nuke RCS Ids
+
+commit 5e98aed13e529638df744e45893c471d5f2014fb
+Author: Adam Jackson <ajax@redhat.com>
+Date:   Thu Mar 6 16:10:33 2008 -0500
+
+    libX11 1.1.4
+
+commit 8e085971dc661da9f80ff6b67747459c0fb15c08
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Thu Feb 28 20:17:41 2008 -0800
+
+    Man page typo fixes
+
+commit 1a1a42a3ca1dfaf42f1094936b71c140fc030fcb
+Author: Søren Sandmann Pedersen <sandmann@redhat.com>
+Date:   Sun Feb 24 20:03:35 2008 -0500
+
+    XIM: Fix a hand when switching input context.
+    
+    Red Hat bug #201284.
+
+commit e02e4ccafcaf3eb8993152dfcbfbee0240ea2db2
+Author: Adam Jackson <ajax@redhat.com>
+Date:   Sun Feb 24 20:00:43 2008 -0500
+
+    Bug #14029: Don't LockDisplay() recursively.
+    
+    See also Red Hat bugzilla #326461.
+
+commit e5892467ae3308c8651be76e06db322dcbc08522
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Fri Feb 15 17:27:53 2008 -0800
+
+    Add support for building lint library with --enable-lint-library
+
+commit e3eb83ec6a9bffa63cdffd94f077c12f85ad7240
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Mon Feb 11 20:11:43 2008 -0800
+
+    Spell out number in XkbGetKeyVirtualModMap man page to avoid cpp errors from #
+
+commit d5ceed7a73a6b61758ddb6ff4e194955fbd5c185
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Fri Feb 8 16:46:46 2008 -0800
+
+    Add WM_LOCALE_NAME to list of properties set in XSetWMProperties comment
+
+commit 416a812200f24d19149dcc497e5c51a0608120f6
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Fri Feb 8 15:31:31 2008 -0800
+
+    XErrorDB updates for Render 0.9 & XFixes 4.0
+
+commit 16a76091cd632e5a3708e235ff864b58f3e4613e
+Author: Kim Woelders <kim@woelders.dk>
+Date:   Sat Dec 22 21:45:23 2007 +0100
+
+    Fix bs_BA entries in locale.dir.pre
+    
+    X.Org bug#13786 <http://bugs.freedesktop.org/show_bug.cgi?id=13786>
+
+commit 32115c563b87d2f37e3f9de70fbd0f4d9e424aea
+Merge: 8f0bd3f e8d4cef
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Fri Dec 14 22:43:47 2007 -0500
+
+    Merge branch 'master' of ssh://git.freedesktop.org/git/xorg/lib/libX11
+
+commit 8f0bd3f445cbdcc67650f6e8e3baf2ed89cb3695
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Fri Dec 14 22:42:59 2007 -0500
+
+    add a comment to en_US.UTF-8/Compose
+
+commit 4d6c45e60ed13d3b0fea10413873d6a74f9d6a3b
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Fri Dec 14 22:40:13 2007 -0500
+
+    Add <dead_stroke> compose sequences
+    
+    The added sequences match the existing <Multi_key> <slash> sequences.
+    
+    This is related to bug #12765¹.
+    
+    1] https://bugs.freedesktop.org/show_bug.cgi?id=12765
+
+commit e8d4cefa0837afa149a10e981528b368485a9e38
+Author: Jeremy Huddleston <jeremy@yuffie.local>
+Date:   Mon Dec 10 23:00:44 2007 -0800
+
+    Added launchd support.
+
+commit 17d7dcbfced4a9417b33507bd3fd9b7dd8268242
+Merge: 5dfefd3 13ac804
+Author: Peter Hutterer <peter@cs.unisa.edu.au>
+Date:   Thu Dec 6 14:08:29 2007 +1030
+
+    Merge branch 'master' into xge
+
+commit 5dfefd3829d3ba7e41d5db0ad28e9dfee92fadd5
+Merge: a68a1cd eff33ae
+Author: Peter Hutterer <peter@cs.unisa.edu.au>
+Date:   Thu Dec 6 13:57:09 2007 +1030
+
+    Merge branch 'master' into xge
+    
+    Conflicts:
+    
+       src/xcb_io.c
+
+commit 13ac80469f6958cabac596834e203bd9cb6d4c94
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Wed Dec 5 20:14:03 2007 -0500
+
+    Update the currency symbols block of en_US.UTF-8/Compose.pre
+    Add XCOMM lines a la the existing NEW SHEQEL SIGN entry for
+    the KIP, TUGRIK, DRACHMA. GERMAN PENNY, PESO, GUARANI,
+    AUSTRAL, HRYVNIA and CEDI SIGNs.
+
+commit b0a8f2ec4ba698841683f8ce389f9d72e6bce53e
+Author: Anton Zinoviev <anton@lml.bas.bg>
+Date:   Wed Dec 5 19:56:03 2007 -0500
+
+    Additions to the Compose file for UTF-8
+    From bug #5371¹
+    
+    Commit 5cf5bc76642bfece7cb5b76faf414bf445f14489 left out this change
+    from those in attachment #4122².  The post³ on xorg resulted in only
+    a positive reply⁴ from Daniel, so this block is now also commited.
+    
+    1] https://bugs.freedesktop.org/show_bug.cgi?id=5371
+    2] https://bugs.freedesktop.org/attachment.cgi?id=4122
+    3] http://article.gmane.org/gmane.comp.freedesktop.xorg/20628
+    4] http://article.gmane.org/gmane.comp.freedesktop.xorg/23966
+    
+    Signed-off-by: James Cloos <cloos@jhcloos.com>
+    Acked-by:  Daniel Stone <daniel@fooishbar.org>
+
+commit 438d02ebc08ee171cf1d3936f4c81050d428ab92
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Tue Dec 4 17:25:39 2007 -0500
+
+    Fix the <U\x+> keysyms in the en_US.UTF-8 Compose file
+    
+    Based on src/KeysymStr.c and src/StrKeysym.c and comments in
+    bugs #11930¹ and #5129² it is clear that <U100XXXXX> is invalid;
+    those should be in the form U plus the hex of the UCS Code Point.
+    
+    The 0x01000000 is ORed in by the code.
+    
+    This update fixes all of those.
+    
+    1] https://bugs.freedesktop.org/show_bug.cgi?id=11930
+    2] https://bugs.freedesktop.org/show_bug.cgi?id=5129
+
+commit 02e04059c89e175f51647e3b031344f743286b34
+Merge: 1254c57 b57129e
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Tue Dec 4 06:55:04 2007 -0500
+
+    Merge branch 'master' of ssh://git.freedesktop.org/git/xorg/lib/libX11
+
+commit 1254c57dd3a8d6ea87041b2f63024f99094f290f
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Tue Dec 4 06:53:55 2007 -0500
+
+    Use the new dead_psili and dead_dasia keysyms added to proto/x11proto 7.0.11
+    Inspired by bug 11930¹:
+    
+    Commit 40ed4eef92e31fcf7ea0a436e1a00cdf49484c1b to x11proto added dead_psili
+    and dead_dasia keysyms.  Make use of them in the en_US.UTF-8 and el_GR.UTF-8
+    Compose files.
+    
+    This was done with a pair of perl scripts based on the one quoted in the
+    log for commit c76d30253f1483ac8200ad5c032a818907e65030.
+    
+    1] https://bugs.freedesktop.org/show_bug.cgi?id=11930
+
+commit b57129ef324c73ee91c2a796b800c4b45f4d4855
+Author: Jeremy Huddleston <jeremy@yuffie.local>
+Date:   Mon Dec 3 20:04:19 2007 -0800
+
+    Use __APPLE__ instead of __DARWIN__
+
+commit b9c032e1d5ed08510863dfb91b8bda588e6c8c9e
+Author: Jeremy Huddleston <jeremy@yuffie.local>
+Date:   Wed Nov 28 16:43:49 2007 -0800
+
+    Define __DARWIN__ when host_os == darwin* as needed in SetLocale.c
+
+commit 4b91ed099554626f1ec17d5bdf7bd77ce1a70037
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Wed Nov 21 16:50:04 2007 -0800
+
+    X.Org Bug #4312: incorrect comment asterisk in XAnyEvent.3x man page
+    
+    X.Org Bugzilla #4312 <http://bugs.freedesktop.org/show_bug.cgi?id=4312>
+    
+    Protect /* sequences from cpp pre-processor removal without transforming
+    to Unicode mathematical asterisk character
+
+commit 2af660c2fcd15c86c66459bfc074c190ea1462e6
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Mon Oct 29 10:46:20 2007 -0700
+
+    Two threads can request sequence sync and XID fetch simultaneously.
+    
+    So don't assert that they can't.
+    
+    This makes the Xlib/XCB implementation of _XAllocID more closely
+    resemble the traditional Xlib version.
+
+commit 6e5485e0a5e3ab738becad12193e760c5fee83a4
+Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
+Date:   Sun Oct 28 04:44:00 2007 -0800
+
+    X.Org Bug #12983: Typos in ./man/XChangeKeyboardControl.man
+    
+    <http://bugs.freedesktop.org/show_bug.cgi?id=12983>
+
+commit 24527c92fd1f433ea135e85ec876a94a529fe500
+Author: Yann Droneaud <ydroneaud@mandriva.com>
+Date:   Wed Oct 24 19:26:07 2007 +0300
+
+    XIM: Properly initialise client event
+    
+    Make sure all ClientMessage fields are initialised to 0 before we send it.
+
+commit e41477f37b0d9b74a056d22dbf0073a94eecb9d6
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Wed Oct 24 19:22:22 2007 +0300
+
+    Colours: Fix --disable-xcms
+    
+    Disable large tracts of colour management code when passing
+    --disable-xcms.
+
+commit 11ea09745efa8de7dc82fe30ebd2393f08390957
+Author: Eric Anholt <eric@anholt.net>
+Date:   Fri Aug 31 17:30:33 2007 -0700
+
+    Bug #2081: Note the range limitation of XSetScreenSaver arguments.
+
+commit 31540f1438ec63faf37044f2fd654b335ddf80f0
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:   Wed Aug 29 19:50:57 2007 -0400
+
+    Add GLX 1.4 requests and errors.
+
+commit 7c996f78914c77fe17e9f4feede980d895d9df51
+Author: Eric Anholt <eric@anholt.net>
+Date:   Tue Aug 28 15:15:11 2007 -0700
+
+    Add XF86 keyboard/monitor brightness keysyms to the keysymbdb.
+
+commit fa4effe82759f864a22a2dc6c920fa72ddb175a8
+Author: Eric S. Raymond <esr@thyrsus.com>
+Date:   Sun Jan 14 10:48:00 2007 -0800
+
+    Bug #9658: Bad markup on XIfEvent.3x
+    
+    X.Org Bugzilla #9658 <https://bugs.freedesktop.org/show_bug.cgi?id=9658>
+
+commit 74cba78daa738ef4d92096107d95c1a585933666
+Author: Eric S. Raymond <esr@thyrsus.com>
+Date:   Sun Jan 14 10:43:00 2007 -0800
+
+    Bug #9655: Bad markup in XrmUniqueQuark.3x
+    
+    X.Org Bugzilla #9655 <https://bugs.freedesktop.org/show_bug.cgi?id=9655>
+
+commit 4341d1a34b2a2e460b58131b6fd81935f3355bbc
+Author: Eric S. Raymond <esr@thyrsus.com>
+Date:   Sun Jan 14 10:43:00 2007 -0800
+
+    Bug #9654: Bad markup in XrmGetFileDatabase.3x
+    
+    X.Org Bugzilla #9654 <https://bugs.freedesktop.org/show_bug.cgi?id=9654>
+
+commit 2db713252090cae08f0200fecad4fc25fb64c8b1
+Author: Eric S. Raymond <esr@thyrsus.com>
+Date:   Sun Jan 14 10:40:00 2007 -0800
+
+    Bug #9653: Bad markup in XQueryColor.3x
+    
+    X.Org Bugzilla #9653 <https://bugs.freedesktop.org/show_bug.cgi?id=9653>
+
+commit 9d3ceea4b902e0471824c1e07ad64342b9a1114e
+Author: Eric S. Raymond <esr@thyrsus.com>
+Date:   Sun Jan 14 10:40:00 2007 -0800
+
+    Bug #9652: Bad markup in XDrawArc.3x
+    
+    X.Org Bugzilla #9652 <https://bugs.freedesktop.org/show_bug.cgi?id=9652>
+
+commit 2e7e0748d353d7f53bbd65ec6bf0df8758528ddc
+Author: Eric S. Raymond <esr@thyrsus.com>
+Date:   Sun Jan 14 10:39:00 2007 -0800
+
+    Bug #9651: Bad markup in XcmsColor.3x
+    
+    X.Org Bugzilla #9651 <https://bugs.freedesktop.org/show_bug.cgi?id=9651>
+
+commit c316aaf0aab06951db9dc5c9c1148bfea835d885
+Author: Eric S. Raymond <esr@thyrsus.com>
+Date:   Sun Jan 14 10:38:00 2007 -0800
+
+    Bug #9650: Bad markup in XLoadFont.3x manual page
+    
+    X.Org Bugzilla #9650 <https://bugs.freedesktop.org/show_bug.cgi?id=9650>
+
+commit ca5d9a625ea0965853fa9e74a448b8c29c78ec95
+Author: Eric S. Raymond <esr@thyrsus.com>
+Date:   Tue Jan 2 10:18:00 2007 -0800
+
+    Bug 9523: Markup problems in XQueryExtension.3x
+    
+    X.Org Bugzilla #9523 <https://bugs.freedesktop.org/show_bug.cgi?id=9523>
+
+commit fe713c616e29ba19c179b43c18eca1035079ce18
+Author: Ian Romanick <idr@us.ibm.com>
+Date:   Tue Aug 21 14:56:33 2007 -0700
+
+    Make sure nls/am_ET.UTF-8/Makefile is created by configure.
+
+commit e3430616f26b68e1439143cbe10732f3fc329d20
+Author: Eric S. Raymond <esr@thyrsus.com>
+Date:   Tue Jan 2 08:40:00 2007 -0800
+
+    Bug #9516: Markup error in XAllocWMHints.3x
+    
+    X.Org Bugzilla #9516 <https://bugs.freedesktop.org/show_bug.cgi?id=9516>
+
+commit d8fe979fc929833e8c754aed32641786d5a0622b
+Merge: 21ca953 4ec1723
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Mon Aug 20 15:34:50 2007 -0400
+
+    Merge branch 'master' of ssh://git.freedesktop.org/git/xorg/lib/libX11
+
+commit 21ca953337fb221b85345bf35ce1a98a0dcb2bf2
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Mon Aug 20 15:34:03 2007 -0400
+
+    Fix typo
+    The code <U1000000D> was used where <U10000DC> was obviously intended.
+    
+    It is possible that <Udiaeresis> should be used instead, if that will
+    not break anyone’s setup.
+
+commit 4ec1723fff729440cd3349c1f95d87d2a6ba89cf
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Mon Aug 20 15:25:48 2007 -0400
+
+    Add compose file for Ethiopic to match new keyboard in xkeyboard-config
+    From bug report:
+    
+      https://bugs.freedesktop.org/show_bug.cgi?id=11307
+
+commit eff33ae525337ce2026be135a26464c7b1237113
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Sat Aug 18 17:58:23 2007 -0400
+
+    Patch for Catalan locales
+    From bugzilla bug 10943¹:
+    
+      There are several Catalan locale codes which presently can
+      be used in X11 systems; especially after they were accepted
+      in belocs-locale-data².
+    
+      In the following patches, I³ add ca_AD, ca_FR and ca_IT Catalan
+      locale codes.  For instance, without this, using ca_AD (actually
+      a quite used locale⁴) some applications (eg. Emacs or Skype)
+      cannot display Catalan diacritic marks as you type them.
+    
+    1] https://bugs.freedesktop.org/show_bug.cgi?id=10943
+    2] http://lists.debian.org/debian-devel-changes/2005/07/msg01429.html
+    3] Toni Hermoso Pulido <toniher@softcatala.org>
+    4] https://launchpad.net/~ubuntu.cat/+members
+
+commit 1f980cb7d022f53d0aee9e793b08203fb888e86e
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Sat Aug 18 17:47:04 2007 -0400
+
+    Add additional Euro signs to compose
+    Inspired by bug 7419¹ make all of:
+    
+        C=, =C, c=, =c, E=, =E, e=, E=
+    
+    after <Multi_key> generate € U+20AC EURO SIGN.
+    
+    1] https://bugs.freedesktop.org/show_bug.cgi?id=7419
+
+commit 4b0a14521449dfce8b4347bd17243efd1d3eae2d
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Sat Aug 18 17:29:08 2007 -0400
+
+    Compose fix for Latin-1 (from Debian)
+    The description from bugzilla bug 7417¹ is:
+    
+      We've been shipping this patch for some time in Debian now. The
+      problem description from the patch header is reproduced below. You
+      may want to note the licensing issue mentioned below, but we've been
+      shipping it because the method by which this particular patch was
+      generated and updated was also given below.
+    
+      This patch by Denis Barbier.
+    
+      The X11 protocol states that Unicode keysyms are in the range
+      0x01000100 - 0x0110FFFF.  If the result of composing characters is a
+      Unicode codepoint, X returns the corresponding Unicode keysym, which
+      is its Unicode codepoint augmented by 0x01000000.  Latin-1
+      characters must not appear with their Unicode codepoints in compose
+      files, otherwise the returned composed character lies in the range
+      0x01000000 - 0x010000FF which is not valid.
+    
+      There are two solutions: either fix composing routines to return
+      0xZZ instead of 0x010000ZZ (where Z is an hexadecimal digit), or
+      replace U00ZZ by their corresponding keysyms in compose files.  The
+      latter is more logical and less error prone, so compose files will
+      be patched.  Many applications accept these invalid Unicode keysyms,
+      but few of them don't, most notably xemacs.  Only UTF-8 locales are
+      affected.
+    
+      This has been fixed very recently in XFree86 CVS (but not xorg), but
+      for licensing reasons, this patch is not grabbed.  Instead automatic
+      conversion is performed by:
+    
+        sed -e '/XK_LATIN1/,/XK_LATIN1/!d' /usr/include/X11/keysymdef.h \
+        | grep -v deprecated | grep 0x0 \
+        | sed -e 's/0x0/U0/' -e 's/XK_//' \
+        | awk '{ printf "s/\\b%s\\b/%s/ig\n", $3, $2; }' > sedfile
+        for f in nls/*.UTF-8/Compose.pre
+        do
+          sed -f sedfile $f > $f.tmp && mv $f.tmp $f
+        done
+    
+    [I edited the quoted script to update it for the current location of
+    the installed keysymdef.h and the current layout of the libX11
+    repo. -JimC]
+    
+    I applied the script, not the patch attached to the bugreport.
+    
+    1] https://bugs.freedesktop.org/show_bug.cgi?id=7417
+
+commit 5cf5bc76642bfece7cb5b76faf414bf445f14489
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Sat Aug 18 17:13:41 2007 -0400
+
+    Add some compose sequences
+    
+    Add some compose sequences from the patch in bug 5371 (attachment 4122).
+    
+    Cf:
+    
+    https://bugs.freedesktop.org/show_bug.cgi?id=5371
+    https://bugs.freedesktop.org/attachment.cgi?id=4122
+
+commit d4002e389dd69780dfc7c2f7bd3cb0c57f05d4f8
+Author: James Cloos <cloos@jhcloos.com>
+Date:   Sat Aug 18 13:57:31 2007 -0400
+
+    Fix SMP Compose targets
+    The compose targets from the SMP (plane 1) were incorrect.
+    
+    At some point the 0x10000 bit had been lost.
+
+commit f1ed3da9a30a1f0264fdc7d1c6466f27fe2a3d7d
+Author: Jeremy C. Reed <reed@glacier.reedmedia.net>
+Date:   Thu Aug 16 17:37:22 2007 -0500
+
+    Fix a mutex reference-counting bug.
+    
+    I was told that some systems have a much more permissive libpthread.
+    I was asked to commit this. This is from NetBSD's X source.
+    (I didn't receive any feedback on xorg list for over two weeks
+    about this.)
+
+commit ac00a44b4875de70382da5a40dd87f976e5b9327
+Author: Tilman Sauerbeck <tilman@code-monkey.de>
+Date:   Wed Aug 1 20:36:03 2007 +0200
+
+    Bumped version to 1.1.3.
+
+commit 76fae9cba1e9bdf7f0eb2ff2b90153d622136cf0
+Author: Joerg Sonnenberger <joerg@netbsd.org>
+Date:   Fri Jul 27 11:15:47 2007 -0700
+
+    Fail properly on errors in recursive make.
+
+commit 1a18319b3bde08dd9ef69c7cd735a76000cf3177
+Author: Brice Goglin <Brice.Goglin@ens-lyon.org>
+Date:   Thu Jul 26 23:31:15 2007 +0200
+
+    Add missing override parameter in XrmCombineDatabase prototype in the manpage
+    
+    Reported by Arnaud Giersch <arnaud.giersch@iut-bm.univ-fcomte.fr>
+    in http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=393434
+    and https://bugs.freedesktop.org/show_bug.cgi?id=9948
+    
+    Also add the type of the second argument in XrmMergeDatabases.
+
+commit 6f0764d4b56f64786b4980839ca262f10a51af6f
+Author: Brice Goglin <Brice.Goglin@ens-lyon.org>
+Date:   Thu Jul 26 22:53:52 2007 +0200
+
+    Clarify return value of XGetCommand in case of error in the manpage
+    
+    Reported by Sean Perry <shalehperry@attbi.com>
+    in http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=133348
+    and https://bugs.freedesktop.org/show_bug.cgi?id=9828
+
+commit b8bef57342632cc2d25580bb7daa3839bae04d89
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Wed Jul 25 17:44:06 2007 -0700
+
+    Include comment/copyright/license for AC_DEFINE_DIR in acinclude.m4
+
+commit 590cde811a79375231c59ed8583e02b111ed567c
+Author: Kean Johnston <kean@armory.com>
+Date:   Thu Jul 19 16:44:20 2007 -0700
+
+    Reset hostname when falling back from :0 to hostname/localhost:0 as well
+
+commit d334665e619e9db657a2ea2764a8b852401d4a3f
+Author: Kean Johnston <kean@armory.com>
+Date:   Tue Jul 17 16:34:30 2007 -0700
+
+    LOCALCONN fallback changes DisplayString() output, breaks KDE
+    
+    See <http://lists.freedesktop.org/archives/xorg/2007-July/026443.html>
+
+commit 8e76bcf3cafda85058ce5f35f1f81929f4772f72
+Author: Olivier Blin <blino@mandriva.org>
+Date:   Mon Jun 11 18:32:09 2007 +1000
+
+    fix XGetMotionEvents arguments order - Fixes bug 11222
+
+commit c2f88cdf5cd9c94b77e5bfdac572b5ac06ab4aa8
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Sun Jun 10 16:19:59 2007 -0700
+
+    Fix locking in _XimGetWindowEventmask.
+    
+    Now that XFilterEvent drops the Display lock before invoking callback
+    functions, _XimGetWindowEventmask is called without the lock held. So
+    when it called _XGetWindowAttributes, a variant of XGetWindowAttributes
+    that does not lock the Display, Xlib/XCB would assert:
+    
+    xcb_xlib.c:50: xcb_xlib_unlock: Assertion `c->xlib.lock' failed.
+    
+    Should fix Gentoo #156367, Ubuntu #87947, Debian #427296. And others?
+
+commit 65f0ab5d46d80d55fc04d4eb14fa05f130eb8b9c
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Sun Jun 3 21:41:47 2007 -0700
+
+    Move security fixes to the top of NEWS, and fix spacing.
+    
+    Commit by Josh Triplett and Jamey Sharp.
+
+commit a549a258b8fcb1ba9d0c1b01b72967e385f67cab
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Sun Jun 3 21:29:40 2007 -0700
+
+    Add NEWS item for bugfix in commit e2c1d788d1fe7bd2d34756493951552441e59b8c.
+    
+    Commit by Josh Triplett and Jamey Sharp
+
+commit 5123b77a3d32d3ad479462f319762c328278aed9
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Sun Jun 3 21:24:54 2007 -0700
+
+    Xlib/XCB: Inline and simplify handle_event, since only process_responses calls it now.
+    
+    Commit by Josh Triplett and Jamey Sharp.
+
+commit 582ca690ea4f3ffd2b94826c4db97229bd3c7238
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Sun Jun 3 20:59:12 2007 -0700
+
+    Xlib/XCB: Fix _XReadEvents to always enqueue a new event, even if an error occurs
+    
+    Commit c337f9de7cfd89f983f83956b7457a274dd412f3 broke the invariant that
+    _XReadEvents always enqueues at least one event even if an error occurred,
+    because the one call to xcb_wait_for_event would then return an error, not an
+    event, and nothing else ensured that process_responses would obtain an event.
+    Fix this by reverting most of c337f9de7cfd89f983f83956b7457a274dd412f3 and
+    f417570735aac865eb6b576d1ea76b5bfcd8573b and implementing the correct fix.  In
+    process_responses, wait_for_first_event now serves as a flag, cleared when
+    actually handling an event.
+    
+    Commit by Josh Triplett and Jamey Sharp.
+
+commit e2c1d788d1fe7bd2d34756493951552441e59b8c
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Sun Jun 3 17:33:23 2007 -0700
+
+    Xlib/XCB: Only remove pending_requests when there are provably no more responses.
+
+commit 7a6dbd4b07ca0a49c30ca7a1d2437eafb2e15eab
+Author: Josh Triplett <josh@freedesktop.org>
+Date:   Sun Jun 3 15:39:39 2007 -0700
+
+    Bump version number to 1.1.2, and add NEWS entry for 1.1.2
+    
+    Signed-off-by: Josh Triplett <josh@freedesktop.org>
+
+commit 416f38f2e67ee1979b3d2feac6f06b3670238804
+Author: Josh Triplett <josh@freedesktop.org>
+Date:   Sun Jun 3 12:13:44 2007 -0700
+
+    Revert "Revert "include: don't distribute XlibConf.h""
+    
+    This reverts commit 79fa3d8070d95b960ba486f2439225872471dadd.
+    
+    Re-revert the XlibConf.h change, which prevented distribution, not
+    installation.
+
+commit 79fa3d8070d95b960ba486f2439225872471dadd
+Author: Josh Triplett <josh@freedesktop.org>
+Date:   Sat Jun 2 22:05:16 2007 -0700
+
+    Revert "include: don't distribute XlibConf.h"
+    
+    This reverts commit c9e28e05ae01ce8a29bea09df759b6271865b44c.
+    
+    The installed XlibInt.h includes XlibConf.h , so libX11 should ship
+    XlibConf.h.  (Commit c9e28e05ae01ce8a29bea09df759b6271865b44c didn't actually
+    prevent automake from shipping XlibConf.h, because it used
+    nodist_x11include_HEADERS rather than nodist_HEADERS.)
+
+commit f417570735aac865eb6b576d1ea76b5bfcd8573b
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Sat Jun 2 17:59:15 2007 -0700
+
+    Xlib/XCB: inline wait_or_poll_for_event, which now had only one caller.
+    
+    Commit by Josh Triplett and Jamey Sharp.
+
+commit c337f9de7cfd89f983f83956b7457a274dd412f3
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Sat Jun 2 17:46:41 2007 -0700
+
+    Xlib/XCB: Ensure _XReadEvents reads at least one new event and blocks for exactly one event.
+    
+    Commit by Jamey Sharp and Josh Triplett.
+
+commit 7f66c897f04806b75e574b55b48921b48045e3f9
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Sat Jun 2 16:43:39 2007 -0700
+
+    Update _XReply's copy of _XCBUnlockDisplay's guts.
+    
+    We introduced this bug in 6b81cbbedfb521ce046b77ee3cc54e884a1dc0c5.
+    
+    Also add a comment in _XCBUnlockDisplay to discourage this problem from
+    respawning.
+    
+    Commit by Josh Triplett and Jamey Sharp.
+
+commit 740ead23512f8d2eaafaa69e514f1ebafad475b9
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Sat Jun 2 16:01:01 2007 -0700
+
+    Xlib/XCB: Avoid re-crashing after _XIOError.
+    
+    Commit by Josh Triplett and Jamey Sharp.
+
+commit 6b81cbbedfb521ce046b77ee3cc54e884a1dc0c5
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Sat Jun 2 12:30:30 2007 -0700
+
+    Hold XCB's Xlib lock even when only the user lock (XLockDisplay) is held.
+    
+    An Xlib client can query Display state, such as with NextRequest, while
+    it holds only the Xlib user lock (between XLockDisplay and
+    XUnlockDisplay), so XCB requests in other threads should be blocked when
+    the Xlib user lock is held.
+    
+    We acquire the lock even when XInitThreads was not called, so that pure
+    XCB code can use multiple threads even in an otherwise single-threaded
+    Xlib application.
+    
+    Commit by Josh Triplett and Jamey Sharp.
+
+commit 95523387d619af5b400748898d722e080b5ce1a6
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Sat Jun 2 11:57:39 2007 -0700
+
+    Allow re-entrant Xlib calls from _XIOError.
+    
+    Some libraries try to clean up X resources from atexit handlers, _fini,
+    or C++ destructors. To make these work, the Display lock should be
+    downgraded to a user lock (as in XLockDisplay) before calling exit(3).
+    This blocks Xlib calls from threads other than the one calling exit(3)
+    while still allowing the exit handlers to call Xlib.
+    
+    This assumes that the thread calling exit will call any atexit handlers.
+    If this does not hold, then an alternate solution would involve
+    registering an atexit handler to take over the lock, which would only
+    assume that the same thread calls all the atexit handlers.
+    
+    Commit by Josh Triplett and Jamey Sharp.
+
+commit 91b02b8064f4e0bcc56019f0722914850008a597
+Author: Tilman Sauerbeck <tilman@code-monkey.de>
+Date:   Thu May 17 19:07:34 2007 +0200
+
+    More constification.
+
+commit a4f3841940158351f9424c3f59b305cce877177d
+Author: Tilman Sauerbeck <tilman@code-monkey.de>
+Date:   Thu May 17 00:29:43 2007 +0200
+
+    Constified composite text charset table.
+
+commit 0581c0aa6039e6b2abb9f7b0a4f9904d8e01f00e
+Author: Tilman Sauerbeck <tilman@code-monkey.de>
+Date:   Wed May 16 23:19:22 2007 +0200
+
+    Have the compiler fill in hexTable so we don't have to do it at runtime.
+
+commit 0e8d9ca47dab0d069e305d5784d05f2ade04f0a8
+Author: Tilman Sauerbeck <tilman@code-monkey.de>
+Date:   Wed May 16 19:36:23 2007 +0200
+
+    More constification.
+
+commit 6d2bed8f04942b4de086a519ac693e729c9fdeea
+Author: Tilman Sauerbeck <tilman@code-monkey.de>
+Date:   Wed May 16 19:18:20 2007 +0200
+
+    Constify and clean up token table.
+
+commit 6c508eab5df5d517f7e4cbe6087308cd53a564b2
+Author: Tilman Sauerbeck <tilman@code-monkey.de>
+Date:   Wed May 16 18:24:42 2007 +0200
+
+    Constified more tables.
+
+commit e699c4231c205ef00d687b6412308d031b99806b
+Author: Tilman Sauerbeck <tilman@code-monkey.de>
+Date:   Wed May 16 18:01:23 2007 +0200
+
+    Constified error list.
+
+commit a68a1cd7cb990ba276fbc36a7591044d78b3d3c1
+Author: Peter Hutterer <peter@cs.unisa.edu.au>
+Date:   Tue May 15 16:54:01 2007 +0930
+
+    Add XGenericEvent definition and handling for long events.
+
+commit c76d30253f1483ac8200ad5c032a818907e65030
+Author: Jan Willem Stumpel <jstumpel@planet.nl>
+Date:   Fri May 4 12:00:49 2007 -0700
+
+    Update el_GR.UTF-8/Compose.pre to match changes in xkeyboard-config cvs
+    
+    Cf:
+    
+      https://bugs.freedesktop.org/show_bug.cgi?id=10851
+      https://bugs.freedesktop.org/show_bug.cgi?id=10824
+      http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=386385
+    
+    The greek keyboard definition was changed to replace dead_horn and
+    dead_ogonek with U0313 COMBINING COMMA ABOVE (aka Psili) and U0314
+    COMBINING REVERSED COMMA ABOVE (aka Dasia).
+    
+    This patch modifies the Greek Compose.pre to match.
+    
+    It is generated by the script Jan Willem Stumpel <jstumpel@planet.nl>
+    posted to 386385@bugs.debian.org:
+    
+    #!/usr/bin/perl
+    while (<>) {
+      print $_;
+      if (/dead_horn/) {
+        s/dead_horn/U0313/;
+        print $_;
+      }
+      elsif (/dead_ogonek/) {
+        s/dead_ogonek/U0314/;
+        print $_;
+      }
+    }
+
+commit a48386ce6b5f8fd2d9dc11a966c9bf5da59f3831
+Author: Magnus Kessler <Magnus.Kessler@gmx.net>
+Date:   Tue May 1 15:20:08 2007 +0200
+
+    Switched function definitions from K&R to ANSI style.
+
+commit 605d357074d556a05a3fba2e85cbea36a3204248
+Author: Tilman Sauerbeck <tilman@code-monkey.de>
+Date:   Tue May 1 14:47:03 2007 +0200
+
+    Tweaked configure output about the man pages suffix.
+
+commit 9824b40d2af4ca2376512c1be7743da0d5065900
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Sat Apr 28 00:42:18 2007 -0700
+
+    Fix typo in nroff macro in XkbAddGeomOverlayKey.man
+
+commit f93849dcc68bd5042ea0884e5190dc7c35b31d68
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Sat Apr 28 00:30:55 2007 -0700
+
+    Protect C comments and #defines in XKB man pages from being mangled by cpp
+
+commit f2f27d4763c7665e422fab10b96b4cf5ad6c0a6f
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Sat Apr 28 00:14:50 2007 -0700
+
+    Add Makefile to process/install XKB man pages
+
+commit d9954c6f6f3a8c406b946acd0d034ff83c656156
+Author: Dennis Arellano <Dennis.Arellano@Sun.COM>
+Date:   Thu Aug 19 00:00:00 1999 -0700
+
+    Add man pages for XKB API's
+    
+    Man pages originally written for X11R6.4 integration to Solaris 7 11/99
+    Sun bug id 4258344: Add new XKB API manpages for 6.4 upgrade
+    <http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=4258344>
+    
+    (Volunteer needed to convert prototypes in man pages to ANSI C style...)
+
+commit f640a49b5e2ebf29f9d655df544c63bf826f619a
+Author: Tilman Sauerbeck <tilman@code-monkey.de>
+Date:   Fri Apr 20 18:39:59 2007 +0200
+
+    Markup tweak for XOpenIM.
+
+commit e972b0bb255af4f3258217852542faf5afa60b28
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Fri Apr 20 18:35:09 2007 +0200
+
+    Bug #9695: Fixed a few argument types in the XOpenIM manpage.
+
+commit b4e2276f329fa42397cb8609cfcd34ebafd3d96b
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Fri Apr 20 18:28:52 2007 +0200
+
+    Bug #9697: Fixed documentation of XVisualInfo struct.
+    
+    The "depth" member was said to be unsigned int, but it's signed.
+
+commit 4068f3dae01c630f825002673b1d3a047ad61863
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Fri Apr 20 16:41:21 2007 +0200
+
+    Bug #9696: refer to XDefineCursor() instead of XDefineCusor().
+
+commit 603c2f88d4e57ce1a3c16e8b6246866e6edd8fa8
+Author: Tilman Sauerbeck <tilman@code-monkey.de>
+Date:   Sat Apr 7 14:42:55 2007 +0200
+
+    Use unistd.h to get getresuid() and friends.
+    
+    This works since we now have _GNU_SOURCE defined.
+
+commit 0300f295bbd3a0c7c46baac8e0a27aeaf53c9d9b
+Author: Tilman Sauerbeck <tilman@code-monkey.de>
+Date:   Sat Apr 7 14:27:12 2007 +0200
+
+    Bug #10562: Define _GNU_SOURCE on glibc systems.
+
+commit a225a0be48770beb689d5ac5da97073634f7deab
+Author: Tilman Sauerbeck <tilman@code-monkey.de>
+Date:   Fri Apr 6 12:46:25 2007 +0200
+
+    For nls/*.pre, allow people to comment lines by starting them with '##'.
+    
+    This fixes a bunch of cpp warnings from nls/en_US.UTF-8/Compose.pre.
+    Fixing that file would have been a larger diff, and using ## may be
+    nicer to use anyway.
+
+commit 1c75a9479011e5f1ad01c950628d0ef5a302d8b6
+Author: Tilman Sauerbeck <tilman@code-monkey.de>
+Date:   Fri Apr 6 11:59:31 2007 +0200
+
+    Bug #10475: Fixed lots of char*/const char* mixups.
+    
+    I didn't fix all of them, as that would require touching
+    public headers.
+
+commit 680dd50193b5b3fcabdd3f1fcbd6a889d5a95c54
+Author: Matthias Hopf <mhopf@suse.de>
+Date:   Thu Apr 5 11:53:18 2007 +0200
+
+    Fix 64bit issues with reallocation.
+
+commit 4d38aeaca42d0bdfe34a833a142ee4d895de03bf
+Author: Tilman Sauerbeck <tilman@code-monkey.de>
+Date:   Wed Apr 4 18:41:18 2007 +0200
+
+    Fixed a few warnings.
+
+commit 7dc7ef398b6ad90ccd1680ed9cd1cfdd47312f5a
+Author: Matthieu Herrb <matthieu@roadrock.(none)>
+Date:   Tue Apr 3 15:39:52 2007 +0200
+
+    Multiple integer overflows in the XGetPixel() and XInitImage functions
+    
+    CVE-2007-1667
+
+commit 0284b144340a455a4b5b5011d81ac5a610372291
+Author: David Baron <dbaron@dbaron.org>
+Date:   Fri Mar 30 17:07:46 2007 +0200
+
+    Bug #7703: Fixed XSetSizeHints() et al wrt use of uninitialized data.
+    
+    Now only those fields of the respective hint struct are set that
+    are actually valid in the input data.
+    The changed functions are:
+    XSetSizeHints(), XSetWMHints() and XSetWMSizeHints().
+
+commit 0994faa0c76c45b106442db461b8a30a3e1c9395
+Author: Tilman Sauerbeck <tilman@code-monkey.de>
+Date:   Thu Mar 29 17:31:25 2007 +0200
+
+    Fixed the change from the previous SendEvent commit.
+    
+    Testing a different patch than the one you commit is bad, right?
+
+commit 398d75528a84f4b8414eb0e363cf53b1b16f6fdf
+Author: Tilman Sauerbeck <tilman@code-monkey.de>
+Date:   Wed Mar 28 22:23:44 2007 +0200
+
+    Bug #10292: Fixed a memory leak related to XOpenDisplay() in the XCB code.
+
+commit ab0bcd07957cecc8e7c0e75d5160a625e91264fe
+Author: David Baron <dbaron@dbaron.org>
+Date:   Wed Mar 28 22:21:40 2007 +0200
+
+    Bug #7713: Initialize all of the event's fields before sending it.
+
+commit bc80f9fe3ccce40ee41246b97470c4f0519756ad
+Author: Julien Cristau <jcristau@debian.org>
+Date:   Sun Mar 18 13:14:48 2007 +0100
+
+    Bug #9279: Fixed a file descriptor leak.
+
+commit c9e28e05ae01ce8a29bea09df759b6271865b44c
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Sat Dec 16 00:45:19 2006 +0200
+
+    include: don't distribute XlibConf.h
+    
+    Since XlibConf.h is built by configure, don't distribute it.
+
+commit dd1705ced2cac6b4b6b21e79272fcf9bed4bf376
+Merge: 129bbb9 769b985
+Author: Jeremy C. Reed <reed@glacier.reedmedia.net>
+Date:   Thu Dec 14 14:23:20 2006 -0600
+
+    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/lib/libX11
+
+commit 129bbb9f9114a571556fa3a24f15ba58a5cdb2de
+Author: Jeremy C. Reed <reed@glacier.reedmedia.net>
+Date:   Thu Dec 14 14:21:19 2006 -0600
+
+    For NetBSD, define the XTHREADLIB and XTHREAD_CFLAGS.
+
+commit 769b9854f7eb1d6d20dd0b4a1c1215ad8e1b77b6
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Wed Dec 6 18:53:00 2006 +0200
+
+    Makefile.am: make ChangeLog hook safer
+    
+    Make ChangeLog hook as safe as possible.
+    (cherry picked from f5d6a3d24095c7ffed86705995d0874c885e7676 commit)
+
+commit 8a8185a649e93b90ffa820387ffdca831227f5a9
+Author: Josh Triplett <josh@freedesktop.org>
+Date:   Thu Nov 30 18:33:13 2006 -0800
+
+    Add autogen.sh to EXTRA_DIST.
+
+commit efe817f95ef8d05e863c83147e903140bc860de4
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Thu Nov 30 17:58:35 2006 -0800
+
+    Release libX11 1.1.1.
+
+commit f637a5b03164263a3af2e644cf655e52b015f1bb
+Author: Ross Combs <rocombs@cs.nmsu.edu>
+Date:   Sat Nov 25 14:45:17 2006 -0800
+
+    Debian bug #354315: Clarify return value in XGetWindowAttributes man page
+    
+    This man page does not discuss the actual return values of the
+    function, but says they are of type "Status".  One might assume
+    that this means you could compare it with the "Success" macro.
+    One would be wrong.
+    
+    The X functions seem to have two three types representing status.
+    If it is an "int" there are a number of error codes or "Success"
+    which can be compared against.  If it is a bool, the result can be
+    compared with "True" or "False".  If the return type is "Status" it
+    appears that the return type is either 0 or 1.  Unfortunately the
+    value for Success is zero, so it is important to distinguish
+    between the first two types of return values and the third;
+    otherwise the conditional will be inverted.
+    
+    XGetWindowAttributes() is one of the functions which returns zero
+    for failure.  The man page should make this clear.
+
+commit c6a0b0f18ed1242eeb908f5cf767ab8381edd456
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Sat Nov 25 14:23:45 2006 -0800
+
+    Bug #9154: Always process an event for _XReadEvents, even if an error occurs
+    
+    Previously, process_responses (in the wait_for_first_event case called
+    from _XReadEvents) considered any return from xcb_wait_for_event
+    sufficient to think it had processed an event. If xcb_wait_for_event
+    returned an error, and no more events occurred before process_responses
+    called xcb_poll_for_event, process_responses would try to return with
+    dpy->head NULL, and would fail an assertion for the _XReadEvents
+    postcondition. Now, process_responses continues using xcb_wait_for_event
+    until it gets an event.
+
+commit d56e78acce9b2aa1dd1bf172afedaa3bccd5e1c8
+Author: Tilman Sauerbeck <tilman@code-monkey.de>
+Date:   Sat Nov 25 05:29:31 2006 -0800
+
+    Bug #9153: Fix access to freed memory.
+    
+    The fix for bug #8622 introduced a smaller bug where _XReply would
+    read memory shortly after freeing it. This patch caches the needed
+    value in a stack-allocated variable before the heap-allocated memory
+    is freed.
+
+commit 934ca763bbc0dd7ae460469bfc000ba101602bcc
+Author: Josh Triplett <josh@freedesktop.org>
+Date:   Fri Nov 24 19:57:58 2006 -0800
+
+    libx11 doesn't use inputproto in public headers; don't require it in x11.pc
+    
+    Based on a Debian patch.
+
+commit 4255997ef2d92740d51f6e63e9eabcfa089683f0
+Author: Josh Triplett <josh@freedesktop.org>
+Date:   Thu Nov 23 07:19:32 2006 -0800
+
+    Release libX11 1.1
+
+commit a1168e11ec9377307c51a7271faec3bf88a63a66
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Tue Nov 21 17:52:34 2006 -0800
+
+    Add note in man-page that XListFontsWithInfo is not thread-safe.
+    
+    _XReply drops the Display lock, so the value of dpy->request may change
+    before _XReply is called again.
+    
+    I discovered this by inspection a year or two ago. I'm pretty confident
+    in the claim, and nobody has come up with an argument for why it's safe
+    despite appearances.
+
+commit 67abe024268c6b1fdee516e5d3a046ccffd7e80a
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Sat Nov 18 15:39:26 2006 -0800
+
+    Bug #8622: Fix response processing order for threaded apps
+    
+    Previously, process_responses (the common code for _XReply,
+    _XReadEvents, and _XEventsQueued) took the current request sequence
+    number as an argument, and did some highly complicated processing to
+    attempt to process responses in order across threads.  This didn't
+    actually work.
+    
+    Now, process_responses handles responses in order, by adding condition
+    variables to the list of outstanding requests in
+    dpy->xcb->pending_requests, and blocking on them when those requests
+    should get processed to allow _XReply to process them; if actually
+    called from _XReply, it returns when _XReply's request should get
+    processed.  _XReply broadcasts on the condition variable after it has
+    read its reply and re-acquired the display lock.
+    
+    Another great commit brought to you by Jamey Sharp, Josh Triplett, the
+    Gobby collaborative text editor, conspy, and ridiculous amounts of SSH
+    forwarding.
+    
+    Signed-off-by: Josh Triplett <josh@freedesktop.org>
+    Signed-off-by: Jamey Sharp <jamey@minilop.net>
+
+commit 941f02ede63baa46f93ed8abccebe76fb29c0789
+Author: Lars Knoll <lars@trolltech.com>
+Date:   Wed Nov 8 12:17:41 2006 -0800
+
+    Don't hold the display lock around callbacks to the application.
+    
+    This fixes an XCB locking assertion failure, particularly with emacs.
+
+commit e494ecaac1ec8a22bd9a85f800fca74d02e9d358
+Author: Diego 'Flameeyes' Pettenò <flameeyes@gentoo.org>
+Date:   Tue Nov 7 09:32:00 2006 -0800
+
+    Add xcb-xlib dependency to x11.pc when built against XCB.
+
+commit 2302008a3793eb4df8ede777d54fe06505c47eaf
+Author: Eric Anholt <eric@anholt.net>
+Date:   Mon Nov 6 17:11:42 2006 -0800
+
+    XCB: Allocate the right amount of memory for dpy->lock_fns.
+    
+    Fixes a crash I was experiencing on startup of anything using gdk.
+
+commit 5f860655be88108b03ccd97470a0814819254bf0
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Thu Nov 2 17:55:31 2006 -0800
+
+    Release libX11 1.1 RC2 (1.0.99.2).
+
+commit a6f4bbf7b1d725b0f04bd660f57b861a76b19831
+Author: Benno Schulenberg <bensberg@justemail.net>
+Date:   Sun Oct 29 03:10:30 2006 +0300
+
+    nls (en_US): remove long compositions that override shorter (bug #2286)
+    Remove long compositions that override (or get overriden by) later shorter
+    compositions, e.g. a four-key compose sequence that gets overriden by a
+    later three-key compose sequence.
+
+commit 0280bf11ef88673a9b5bba3a91a599260f1f0949
+Author: Benno Schulenberg <bensberg@justemail.net>
+Date:   Sun Oct 29 03:08:36 2006 +0300
+
+    nls: remove shadowed compose entries (bug #2286)
+    Remove compose entries shadowed by others later on.
+
+commit d118f2b1ef10997194b281524177dea7396da7dd
+Author: Benno Schulenberg <bensberg@justemail.net>
+Date:   Sun Oct 29 03:07:15 2006 +0300
+
+    nls: remove duplicate compose entries (bug #2286)
+    Remove a bunch of duplicate entries from various Compose files.
+
+commit 5e1cc2fe20e5904ca1e05a4cb7be13d450a593bb
+Author: Caolan McNamara <caolanm@redhat.com>
+Date:   Sun Oct 29 02:46:15 2006 +0300
+
+    XKB geometry: fix leaks in GetKeyboardByName (bug #8099)
+    Don't leak the name and value of every property we parse, as well as the
+    name of every colour.
+
+commit 686bb8b35acf6cecae80fe89b2b5853f5816ce19
+Author: Matthias Hopf <mhopf@suse.de>
+Date:   Wed Oct 18 14:25:04 2006 +0200
+
+    Fix double open of compose file.
+    
+    Issue found by Kees Cook <kees@canonical.com>.
+
+commit d3e65cb8cddf08913d83c9df2bb9b1517f2ad3a8
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Sat Oct 14 21:25:10 2006 -0700
+
+    XCB: check for and handle I/O errors in _XGetXCBBuffer.
+
+commit 256eba6b40c5f811a03b04abf5f85f728ee3ab5d
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Wed Oct 11 00:06:50 2006 -0700
+
+    XKB bugfix: SyncHandle must be called after UnlockDisplay, not before.
+
+commit 1eedf1bd033e496843cfde42ae4ae5a119298605
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Tue Oct 10 23:03:28 2006 -0700
+
+    Add correct Display locking to XKB functions.
+    
+    Some XKB functions didn't correctly call LockDisplay or UnlockDisplay.
+    This patch fixes at least some instances of that problem.
+    
+    Thanks to Magnus Kessler <Magnus.Kessler@gmx.net> for finding these bugs
+    and proposing a fix, which this patch is based on.
+
+commit e17c2cbe9fbaa1600d4b9463ec800a874b0d87cd
+Author: David Nusinow <dnusinow@debian.org>
+Date:   Tue Oct 10 22:11:05 2006 -0400
+
+    Dynamically generate internal manpage section using __libmanpagesuffix__ so that it actually matches the section if you don't use 3X11
+
+commit e53557da969b706dbc843f6fde3db31ffe382e0f
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Sat Oct 7 21:00:36 2006 -0700
+
+    Release libX11 1.1 RC1 (1.0.99.1).
+
+commit bf237409c5fce32c557d298f62f44d456c2b5bc8
+Merge: ba47719 2d426d1
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Sat Oct 7 21:07:16 2006 -0700
+
+    As XCB support is about to be released in libX11, stable is now subsumed by master.
+
+commit ba477191c67ce93e61423cc1abe35275704cce50
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Sat Oct 7 03:48:13 2006 -0700
+
+    XCB: Don't rely on having the definition of struct xcb_setup_t available.
+
+commit 117b55cbd0b0ce51362df88363ed83d44a493ac7
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Fri Oct 6 16:27:31 2006 -0700
+
+    xcb_poll_for_event no longer takes an 'int *error' out-parameter.
+
+commit caaa8e8a55e837b3585c1dee7bef194fc4c79d16
+Author: Josh Triplett <josh@freedesktop.org>
+Date:   Fri Oct 6 16:26:11 2006 -0700
+
+    Actually ship Xxcbint.h
+
+commit 7b027e53b5e393082f4f515c8ba18077eb97163f
+Author: Josh Triplett <josh@freedesktop.org>
+Date:   Fri Oct 6 16:25:50 2006 -0700
+
+    Clean ChangeLog only in "make maintainer-clean", not "make clean"
+    
+    ChangeLog requires a git repo to generate; make clean and make distclean
+    shouldn't get rid of it.
+
+commit cab22e02e78b3e5b8a73d1cd55cf6686426b47e0
+Author: Josh Triplett <josh@freedesktop.org>
+Date:   Fri Oct 6 16:24:58 2006 -0700
+
+    Add ChangeLog and "make dist"-generated files to .gitignore
+
+commit e4c7cfdee4a40e466c0c6b370cabd432e9e855a0
+Author: Josh Triplett <josh@freedesktop.org>
+Date:   Fri Oct 6 15:53:27 2006 -0700
+
+    Add manual pages for XGetXCBConnection and XSetEventQueueOwner
+
+commit 688224cea95e453f94c5a602dc6fce84bc93dfc0
+Author: Josh Triplett <josh@freedesktop.org>
+Date:   Fri Oct 6 13:41:16 2006 -0700
+
+    Remove unnecessary prototype for _XFreeDisplayStructure in xcb_disp.c
+
+commit ab728ca372288d0db1b486c265e34c1376f29104
+Author: Josh Triplett <josh@freedesktop.org>
+Date:   Fri Oct 6 12:36:39 2006 -0700
+
+    XCL is dead; long live Xlib/XCB
+    
+    Rename all instances of "XCL" to Xlib/XCB-derived names.
+    
+    The only user-visible change: rename the include file <X11/xcl.h> to
+    <X11/Xlib-xcb.h>; programs will need to change their #include lines to match.
+    
+    Remove the XCL cast inlines from Xlib-xcb.h.
+
+commit 5b73093203039d307eb7ab3845c3ced207e9e26c
+Author: Josh Triplett <josh@freedesktop.org>
+Date:   Fri Oct 6 11:33:49 2006 -0700
+
+    Add XCB developers to AUTHORS
+
+commit 1cb71ff139276a0a58c60ea5f261f64b94706b9b
+Author: Josh Triplett <josh@freedesktop.org>
+Date:   Fri Oct 6 11:21:28 2006 -0700
+
+    Fix email addresses in README
+
+commit 12f038669278019594ca0ed53dadcf4e84092422
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Fri Oct 6 02:13:05 2006 -0700
+
+    XCB: Handle all responses in order of monotonically increasing sequence number.
+
+commit f392680273278b43079302206897f794e60f3c70
+Author: Josh Triplett <josh@freedesktop.org>
+Date:   Fri Oct 6 01:11:08 2006 -0700
+
+    Actually install x11-xcb.pc, and ship x11-xcb.pc.in
+
+commit f1fcad2e3fd17aaf1294f1d8e9f406fd5b32a863
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Thu Oct 5 18:32:29 2006 -0700
+
+    XCB: correctly handle failure to connect to X server.
+
+commit e754b3b078d556c7861da56aad47d244e9199e06
+Author: Josh Triplett <josh@freedesktop.org>
+Date:   Thu Oct 5 17:44:22 2006 -0700
+
+    Split public Xlib/XCB functions into libX11-xcb
+    
+    We can never change the libX11 soname, and we don't want to commit to never
+    changing the public Xlib/XCB functions, so split them into a separate library
+    libX11-xcb.  This also means that a program linked solely against libX11
+    should work with either Xlib or Xlib/XCB, which will make life easier for
+    package maintainers.
+    
+    Signed-off-by: Josh Triplett <josh@freedesktop.org>
+    Acked-by: Jamey Sharp <jamey@minilop.net>
+
+commit ffd367f708b295abaedf3a23a1bfd4710d171d6f
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Wed Oct 4 17:16:46 2006 -0700
+
+    No longer #include Xmd from xcl.h: we do not need it.
+
+commit 3aff149d42ba8ed620091971b3766bdf96c62aaf
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Wed Oct 4 16:58:32 2006 -0700
+
+    XCB: Revert locking to simple wrapper around libX11's normal locks.
+    
+    No more recursive mutexes, no more banging XCB's I/O lock in-place, and
+    reduces the differences between the previous stable release and an
+    XCB-enabled one. Sadly, Xlib's pluggable thread functions work again
+    too, now. I apologize to the world.
+
+commit 8ff122fb529bdb1c2b9a86b12d06b6da1b35d708
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Mon Sep 25 04:54:52 2006 -0700
+
+    Link explicitly against XCB's Xlib compatibility functions.
+
+commit bde3cd123d65a2f36ee0c417f5f231b7e01d0671
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Mon Sep 25 04:13:20 2006 -0700
+
+    libxcb now installs header files in <xcb>, not <X11/XCB>.
+
+commit 87d00207f5a1f25a45a153618739cd6481814f89
+Author: Ian Osgood <iano@quirkster.com>
+Date:   Sun Sep 24 23:39:01 2006 -0700
+
+    Track XCB's "Great Renaming".
+
+commit 85a5e98dff9b7752fae157fad9b8c9825cb0efab
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Tue Sep 12 23:02:42 2006 -0700
+
+    Quit using XCBGetQueuedRequestRead.
+
+commit a61936fc4e9bd93b108764bbacd5b8f786e51915
+Author: Tollef Fog Heen <tfheen@err.no>
+Date:   Wed Aug 30 00:05:54 2006 +0300
+
+    nls: use _XlcUtf8Loader for en_US (bug #7982)
+    Use _XlcUtf8Loader instead of _XlcUnicodeLoade,r bringing it into line with
+    every other locale.
+
+commit abcc7e1865cdfbd591f6520cfe4257f0b0b1c03e
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Wed Aug 23 18:49:30 2006 -0700
+
+    When opening display, if LOCALCONN fails, fall back to UNIXCONN, then TCPCONN
+    
+    Port to X11R7 of Sun bug fix 4061225 by Alex Chen for X11R6 - when failing to
+    connect on a named pipe, try a Unix socket first, to better support people who
+    replace their X servers with ones that don't support named pipe transport.
+    <http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=4061225>
+
+commit 1ddc44c1cada7e926bd4787406444ce7c36b61e1
+Author: Mark Brown <mark.brown@sun.com>
+Date:   Thu Jul 27 19:17:10 2006 -0700
+
+    Sun bug 1149809: Document event delivery when grab is terminated.
+
+commit 171107b03ac89d94f9006c7cda242aeefb9ecd16
+Author: Dennis Arellano <Dennis.Arellano@Sun.COM>
+Date:   Thu Jul 27 18:47:06 2006 -0700
+
+    Sun bug 4091271: XGetWindowProperty is missing a crucial prop_return description
+    
+    Document that 32-bit format properties are always returned in arrays of type
+    long, even on systems where long is 64-bits.
+    <http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=4091271>
+
+commit 8309efe6550877cd0bf22979904b3f6bd3e6cffa
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Mon Jul 24 15:52:00 2006 -0700
+
+    Add support for "make lint" to check code with lint/sparse/etc.
+
+commit 931e02fbd1acd09aae2b0954c34342c86c72dff6
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Mon Jul 24 15:50:52 2006 -0700
+
+    ANSIfy some static function definitions
+
+commit 20b7abcaac324d90454de63f32f4a2b398e69e63
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Mon Jul 24 15:01:40 2006 -0700
+
+    Fix sparse warning: Using plain integer as NULL pointer
+
+commit d158ab29930513c4097f5b67e7bea08ed2bfd62c
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Mon Jul 24 14:00:24 2006 -0700
+
+    Remove unused variable
+
+commit 30377000375bdb958042dcb1f38503c94ef21eaf
+Author: Eric Anholt <anholt@FreeBSD.org>
+Date:   Fri Jul 21 18:55:36 2006 -0400
+
+    Bug #7188: Fix the documentation of XUrgencyHint (not UrgencyHint).
+
+commit 4eba45879aea4e415ab550ee56b900d060099110
+Author: Matthieu Herrb <matthieu.herrb@laas.fr>
+Date:   Sun Jul 16 10:55:39 2006 +0200
+
+    set GIT_DIR=${srcdir}/.git for git-log
+
+commit 2d426d1f2608fedb77bd7d010dabece76b8d4a60
+Author: Aaron Plattner <aplattner@nvidia.com>
+Date:   Tue Jul 11 13:27:49 2006 -0700
+
+    Add a .PHONY to ensure the ChangeLog isn't stale.
+    
+    Setting the ChangeLog rule as phony forces it to be re-run even when the
+    ChangeLog file already exists. Research indicates .PHONY is portable to BSD and
+    Solaris make.
+    (cherry picked from b8a98809ed81e1226775e6447ef219ffc01334b5 commit)
+
+commit b8a98809ed81e1226775e6447ef219ffc01334b5
+Author: Aaron Plattner <aplattner@nvidia.com>
+Date:   Tue Jul 11 13:27:49 2006 -0700
+
+    Add a .PHONY to ensure the ChangeLog isn't stale.
+    
+    Setting the ChangeLog rule as phony forces it to be re-run even when the
+    ChangeLog file already exists. Research indicates .PHONY is portable to BSD and
+    Solaris make.
+
+commit 8f2be66089b88e4ed6acb0211ea107f4bb910bd3
+Author: Mayank Jain <majain@redhat.com>
+Date:   Tue Jul 11 19:42:47 2006 +0100
+
+    add Indian language locales
+    Add as, kn, ml, or, ur, and te locales.
+
+commit a92eb6785699bbc9c6c3813f6af3bb9431a3f6b0
+Author: Matthias Hopf <mhopf@suse.de>
+Date:   Tue Jul 4 12:16:30 2006 +0200
+
+    Fix for autoconf 2.60 issue.
+    
+    Updated AC_DEFINE_DIR.
+    Reverted datarootdir change.
+
+commit 644f4828b15bce42b597eb123ba0bbc372c46c03
+Author: Keith Packard <keithp@neko.keithp.com>
+Date:   Sat Jul 1 21:31:23 2006 -0700
+
+    Work around recent autoconf (2.59?) changes in directory expansion.
+    
+    Recent autoconf versions have changed how directory names are managed in the
+    configure.ac script; automatic 'eval' invocations now occur as a part of the
+    AC_DEFINE_DIR macro which make it imperative that AC_DEFINE_DIR be executed
+    before the variables are used in further macro definitions. Also, ${datadir}
+    is apparantly an old name for ${datarootdir} as ${datadir} doesn't get
+    expanded correctly by AC_DEFINE_DIR. This looks like an autoconf bug, but it
+    is easy to work around by just using ${datarootdir} instead of ${datadir}.
+
+commit be70a31229aa106aff0a09d78c00812682cd3475
+Author: Keith Packard <keithp@neko.keithp.com>
+Date:   Sat Jul 1 01:56:05 2006 -0700
+
+    Xlib/XCB: handle 32-bit sequence wrap.
+    
+    Replace broken sequence compares with XCB_SEQUENCE_COMPARE (copied from
+    XCB).
+    Account for XCB sequence 0 handling.
+
+commit 99c711707ad08e1396e123b1c7df687c560a489a
+Author: Donnie Berkholz <spyderous@gentoo.org>
+Date:   Thu Jun 29 19:43:20 2006 -0700
+
+    Bump version to 1.0.3.
+
+commit cde3c0dd72af2b490e80cffca962e3487dd31be4
+Author: Donnie Berkholz <spyderous@gentoo.org>
+Date:   Thu Jun 29 19:39:36 2006 -0700
+
+    Bug #7349: Missed one of the setuid fixes.
+    (cherry picked from e9614c963b532f46a7932c2305a4b177a996a222 commit)
+
+commit df3fef8983d96c59d481c4cdaf1f271d54a116d2
+Author: Matthias Hopf <mhopf@suse.de>
+Date:   Thu Jun 29 18:59:57 2006 +0200
+
+    Update to final Compose cache directory location.
+    (cherry picked from abda4d223e9cce9ac6e7b5d82a5680d9a502e52a commit)
+
+commit 912ef198292d3053daa810f842510e5d62ded0f0
+Author: Matthias Hopf <mhopf@suse.de>
+Date:   Thu Jun 29 17:41:41 2006 +0200
+
+    Fix alignment of trees and wide chars in the cache.
+    (cherry picked from 40a64c61f8bc33d497e1224e02c41dea2d424d97 commit)
+
+commit 2ece832118b3ee5d8ed19f1ee9b1c822b70ec6e9
+Author: Matthias Hopf <mhopf@suse.de>
+Date:   Wed Jun 28 19:17:03 2006 +0200
+
+    First (dummy) entry of compose caches was not initialized and thus contained varying garbage.
+    (cherry picked from f442dcaa56f8ecb7443e8e51c88ed97e10dbdba3 commit)
+
+commit e9614c963b532f46a7932c2305a4b177a996a222
+Author: Donnie Berkholz <spyderous@gentoo.org>
+Date:   Thu Jun 29 19:39:36 2006 -0700
+
+    Bug #7349: Missed one of the setuid fixes.
+
+commit abda4d223e9cce9ac6e7b5d82a5680d9a502e52a
+Author: Matthias Hopf <mhopf@suse.de>
+Date:   Thu Jun 29 18:59:57 2006 +0200
+
+    Update to final Compose cache directory location.
+
+commit 40a64c61f8bc33d497e1224e02c41dea2d424d97
+Author: Matthias Hopf <mhopf@suse.de>
+Date:   Thu Jun 29 17:41:41 2006 +0200
+
+    Fix alignment of trees and wide chars in the cache.
+
+commit f442dcaa56f8ecb7443e8e51c88ed97e10dbdba3
+Author: Matthias Hopf <mhopf@suse.de>
+Date:   Wed Jun 28 19:17:03 2006 +0200
+
+    First (dummy) entry of compose caches was not initialized and thus contained varying garbage.
+
+commit bdbe464d774e01d317f67c63ebbda2fd0edbbdd1
+Author: Donnie Berkholz <spyderous@gentoo.org>
+Date:   Thu Jun 22 23:59:03 2006 -0700
+
+    Delete ChangeLog, and add a rule to autogenerate it for distribution. Also
+    add 'foreign' to AM_INIT_AUTOMAKE to make autotools happy with not having a
+    ChangeLog.
+    (cherry picked from b0edfb8df16ab8c9959b83a4c966d55a59c4e295 commit)
+
+commit b0edfb8df16ab8c9959b83a4c966d55a59c4e295
+Author: Donnie Berkholz <donnie@comet.(none)>
+Date:   Thu Jun 22 23:47:38 2006 -0700
+
+    Delete ChangeLog, and add a rule to autogenerate it for distribution. Also
+    add 'foreign' to AM_INIT_AUTOMAKE to make autotools happy with not having a
+    ChangeLog.
+
+commit dd54981aa76e9dfdc4c3302d6105b4b229447c84
+Author: Donnie Berkholz <donnie@comet.(none)>
+Date:   Thu Jun 22 15:47:38 2006 -0700
+
+    Bump version to 1.0.2.
+
+commit c93539d974a67f596a5eb5b65042d26602546c72
+Author: Matthieu Herrb <matthieu@deville.herrb.com>
+Date:   Tue Jun 20 21:04:03 2006 +0200
+
+    Check setuid() return value.
+    (cherry picked from 5169d0e08ff6acb350a6ea768623f5ff0b85b05f commit)
+
+commit 605533f814ab7892991578706a6458f61a89ca4d
+Author: Derek Wang <derek.wang@sun.com>
+Date:   Mon Jun 19 11:05:37 2006 -0700
+
+    Sun bug 6209243: XExtentsOfFontSet causes segfault when font set not loaded
+    (cherry picked from eff50c94a07194297e705da53d9fbb3a40fb9ad4 commit)
+
+commit 5bbd0822c5a926de0ed293437fb9f2b75cf3c4f4
+Author: Scott Revelt <scott.revelt@sun.com>
+Date:   Fri Jun 16 19:11:13 2006 -0700
+
+    Sun bug 4022903: Xcms routines may fail if sscanf() is looking for separators
+    based on locale that doesn't match those used in the Xcms.txt
+    (cherry picked from 94f3213fc4bd6ec49bfb68e8b4a4fddea2bf3baa commit)
+
+commit 0b05cd4da6134df527fb010384a9fd569bd5d6a3
+Author: Alan Coopersmith <alanc@alf.(none)>
+Date:   Fri Jun 16 18:53:33 2006 -0700
+
+    Add *~ to ignore emacs droppings
+    (cherry picked from c33d7b8282ac196b36229be26442296768c16f3e commit)
+
+commit 214658b76b56768f69c3959a11525aae7813f448
+Author: Matthias Hopf <mhopf@suse.de>
+Date:   Fri Jun 16 15:36:40 2006 +0200
+
+    Bug #3104: Compose table cache for faster X11 application starts.
+    (cherry picked from 1f4c9893ade08bad30c9bd12a36bee57d30b001e commit)
+
+commit 13968a23aaea838ba4b69e42e8900f803499e091
+Author: Matthias Hopf <mhopf@suse.de>
+Date:   Tue Jun 13 20:23:46 2006 +0200
+
+    Bug #3104: Compose table cache for faster X11 application starts.
+    (cherry picked from 4fe22647e6010a2886c2f3a7093adeaeb6678faa commit)
+
+commit e7f8bca08f5476d0ca262097639ac7d424bb4d10
+Author: Lubos Lunak <llunak@suse.de>
+Date:   Mon Jun 12 18:48:08 2006 +0200
+
+    Bug #3104: Compose table cache for faster X11 application starts.
+    (cherry picked from 1d28a655629a11ea7fd1e5df4c7b77dd4b63e3be commit)
+
+commit f506aaf8ac9aae1ee8daaef6cde34ee85aecd641
+Author: Matthias Hopf <mhopf@suse.de>
+Date:   Fri Jun 9 18:24:02 2006 +0200
+
+    Bug #3104: Compose table cache for faster X11 application starts. Part 1: Pointerless compose data structure, using indices instead of pointers, needed for mmap()ing data structure.
+    (cherry picked from 9354351fcb8baeaab85250d14409cfb4fa50f3e9 commit)
+
+commit 0e6d5e979aacb0c295ce79369ecc5f22ffa7922c
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Wed Jun 7 20:29:05 2006 -0700
+
+    Fix bug #7035: unnecessary memmove in XOpenDisplay.
+    Using memmove on the connection setup data causes a problem for XCB, but making
+    Xlib stop doing that should be harmless for non-XCB as well.
+    (cherry picked from b18713ec3f36a10b3cdb1e16f9550e1d2e05dff0 commit)
+
+commit cd7328c46ae72903ed02832828891b2dab4d5ee0
+Author: Daniel Stone <daniels@preemptive.fooishbar.org>
+Date:   Sat Jun 3 13:51:51 2006 +0300
+
+    Fix threading support on GNU/kFreeBSD systems.  (Robert Millan)
+    (cherry picked from e3acee88cfcc4ef0fa8a7db39763a5ebe2e985cb commit)
+
+commit c336eb6b80a6f91da1d0b3d28634a2cfde324670
+Merge: 33556ca ad9ebbd
+Author: Donnie Berkholz <donnie@comet.(none)>
+Date:   Thu Jun 22 14:25:35 2006 -0700
+
+    Merge branch 'stable' of http://people.freedesktop.org/~jamey/libX11 into stable
+
+commit 213dacad21740466e7ab31b01d3fc513fe4b3e74
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Thu Jun 22 17:20:59 2006 +0300
+
+    Bump to 1.0.99.0 to avoid confusion.
+
+commit efedfd68e31bcee2d21ac340be8dc9e1825ec890
+Merge: e3acee8 4b8eb5d
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Thu Jun 22 16:53:45 2006 +0300
+
+    Merge branch 'master' of git+ssh://git.freedesktop.org/srv/git.freedesktop.org/git/xorg/lib/libX11
+
+commit 4b8eb5d4a1da73a94b5a6ab12e34784aae4c79c5
+Merge: 5169d0e eff50c9
+Author: Matthieu Herrb <matthieu@deville.herrb.com>
+Date:   Tue Jun 20 21:05:15 2006 +0200
+
+    Merge branch 'master' of git+ssh://herrb@git.freedesktop.org/git/xorg/lib/libX11
+
+commit 5169d0e08ff6acb350a6ea768623f5ff0b85b05f
+Author: Matthieu Herrb <matthieu@deville.herrb.com>
+Date:   Tue Jun 20 21:04:03 2006 +0200
+
+    Check setuid() return value.
+
+commit eff50c94a07194297e705da53d9fbb3a40fb9ad4
+Author: Derek Wang <derek.wang@sun.com>
+Date:   Mon Jun 19 11:05:37 2006 -0700
+
+    Sun bug 6209243: XExtentsOfFontSet causes segfault when font set not loaded
+
+commit 94f3213fc4bd6ec49bfb68e8b4a4fddea2bf3baa
+Author: Scott Revelt <scott.revelt@sun.com>
+Date:   Fri Jun 16 19:11:13 2006 -0700
+
+    Sun bug 4022903: Xcms routines may fail if sscanf() is looking for separators
+    based on locale that doesn't match those used in the Xcms.txt
+
+commit c33d7b8282ac196b36229be26442296768c16f3e
+Author: Alan Coopersmith <alanc@alf.(none)>
+Date:   Fri Jun 16 18:53:33 2006 -0700
+
+    Add *~ to ignore emacs droppings
+
+commit 1f4c9893ade08bad30c9bd12a36bee57d30b001e
+Author: Matthias Hopf <mhopf@suse.de>
+Date:   Fri Jun 16 15:36:40 2006 +0200
+
+    Bug #3104: Compose table cache for faster X11 application starts.
+
+commit 4fe22647e6010a2886c2f3a7093adeaeb6678faa
+Author: Matthias Hopf <mhopf@suse.de>
+Date:   Tue Jun 13 20:23:46 2006 +0200
+
+    Bug #3104: Compose table cache for faster X11 application starts.
+
+commit 1d28a655629a11ea7fd1e5df4c7b77dd4b63e3be
+Author: Lubos Lunak <llunak@suse.de>
+Date:   Mon Jun 12 18:48:08 2006 +0200
+
+    Bug #3104: Compose table cache for faster X11 application starts.
+
+commit 9354351fcb8baeaab85250d14409cfb4fa50f3e9
+Author: Matthias Hopf <mhopf@suse.de>
+Date:   Fri Jun 9 18:24:02 2006 +0200
+
+    Bug #3104: Compose table cache for faster X11 application starts. Part 1: Pointerless compose data structure, using indices instead of pointers, needed for mmap()ing data structure.
+
+commit b18713ec3f36a10b3cdb1e16f9550e1d2e05dff0
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Wed Jun 7 20:29:05 2006 -0700
+
+    Fix bug #7035: unnecessary memmove in XOpenDisplay.
+    Using memmove on the connection setup data causes a problem for XCB, but making
+    Xlib stop doing that should be harmless for non-XCB as well.
+
+commit ad9ebbd2424bc2699944ffdf4e19e13f9dd8ab84
+Author: Daniel Stone <daniels@preemptive.fooishbar.org>
+Date:   Sat Jun 3 12:57:55 2006 +0300
+
+    Bug #2186: Add cs_CZ.iso8859-2 alias.
+
+commit 9e7765e0b1cbaae6643072d91066ba1201b36227
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Fri Jun 2 02:46:29 2006 +0300
+
+    nls: Serbian (sr_CS) update (#5575)
+    
+    Bug #5575: 'Yugoslavia' has changed to Serbia & Montenegro, along with a
+    corresponding locale change.  Update compose.dir.pre, locale.alias.pre,
+    and locale.dir.pre.  (Milos Komarcevic)
+
+commit a4ac2242b588da23044a20aa999ae84d4de7b2d8
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Fri Jun 2 02:24:25 2006 +0300
+
+    im: add Braille input method (#6296)
+    
+    Bug #6296: Add a Braille input method.  (Samuel Thibault)
+
+commit 90de1e2e141ec591048a76cb695579ef809a28d3
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Fri Jun 2 02:22:17 2006 +0300
+
+    xkb support: small typo
+
+commit 4c3e34bece7402f08139d34d1ef5834e3cf533c7
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Fri Jun 2 01:50:24 2006 +0300
+
+    en_US.UTF-8 Compose.pre: updates from Simos (#5129)
+    
+    Bug #5129: Numerous updates from Simos Xenitellis, fixing Unicode keysyms,
+    adding Unicode character names, removing duplicate entries, et al.
+
+commit 0c6473dd329c7334ae511884bcb6e73e632c784f
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Fri Jun 2 01:44:53 2006 +0300
+
+    nls: fix use of non-keysym dead_space (#5107)
+    
+    Bug #5107: Change users of dead_space to space.
+
+commit 6f99f6349de5120f1cb7e02fbc97849341bc48e8
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Fri Jun 2 01:41:18 2006 +0300
+
+    optional XKB support fix
+    
+    Fix compilation with --disable-xkb.
+
+commit 217d43ed44ced901122093af3ef1294e1736bb77
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Fri Jun 2 01:39:12 2006 +0300
+
+    i18n: separate data and lib directories
+    
+    Break out locale data into separate data and library directories, under
+    $(datadir) and $(libdir), respectively, by default.
+
+commit 92fa7fcde8df22830fca7c0275ab201033f7909c
+Author: Adam Jackson <ajax@benzedrine.nwnk.net>
+Date:   Thu May 11 14:04:48 2006 -0400
+
+    libXcursor.so.1, not libXcursor.so
+
+commit 135b4df13ed7c35dbae8975f302fc1fb8412d7c0
+Author: Daniel Stone <daniels@preemptive.fooishbar.org>
+Date:   Wed May 10 18:06:03 2006 +0300
+
+    XKBMisc.c: use Xfree, not xfree
+    
+    Use Xfree() instead of xfree() when freeing interps.
+
+commit 3518d772b08e3433bc28b4d8d293fa53ca25f0ee
+Author: Daniel Stone <daniels@preemptive.fooishbar.org>
+Date:   Wed May 10 14:51:37 2006 +0300
+
+    locale.alias.pre: bg_BG typo fix
+    
+    Fix typo (be_BG.UTF-8 rather than bg_BG.UTF-8) in locale.alias.pre.
+
+commit cc533db60cb64dc163c66451933a9bf77c519062
+Author: Daniel Stone <daniels@endtroducing.localdomain>
+Date:   Sun Apr 9 22:22:03 2006 +0300
+
+    Coverity #203, #204: Fix potential NULL dereferences.
+
+commit b83adf7dfd6157694fe4f232012fef36cd9666da
+Author: Daniel Stone <daniels@endtroducing.localdomain>
+Date:   Sun Apr 9 22:20:25 2006 +0300
+
+    Coverity #205: Fix potential NULL dereference.
+
+commit 2d0cd10ad907864d0136739eaac459779c9a5332
+Author: Daniel Stone <daniels@endtroducing.localdomain>
+Date:   Sun Apr 9 22:18:20 2006 +0300
+
+    Coverity #209: Fix potential NULL dereference. (Alan Coopersmith)
+
+commit dc2f3966068d66a564aa452cab9f0c26657fa1df
+Author: Daniel Stone <daniels@preemptive.research.nokia.com>
+Date:   Fri Apr 7 18:11:52 2006 +0300
+
+    Coverity #826: Fix potential memory leak.
+
+commit 23df609ec451a01c77e8f31ecc85c5af7c62efed
+Author: Daniel Stone <daniels@preemptive.research.nokia.com>
+Date:   Fri Apr 7 17:49:41 2006 +0300
+
+    Bug #1625: Include keysym.h from Xutil.h.
+
+commit 5262a1945c543a3419ed626e1deb09ef5b4584c1
+Author: Eric Anholt <anholt@leguin.anholt.net>
+Date:   Wed Apr 5 17:12:15 2006 -0700
+
+    Check if visualList == NULL, not nVisualsMatched == 0. NULL happens in more
+    
+    cases (allocation failure) than nVisualsMatched == 0.  Noticed from inspection
+    of Coverity #599, #600.
+
+commit 8b42635f577468bb143ca593cdd9fb3450ad712c
+Author: Eric Anholt <anholt@leguin.anholt.net>
+Date:   Wed Apr 5 16:42:26 2006 -0700
+
+    Coverity #558: Free newly-allocated Database in error path.
+
+commit 6d06e41d1f431b3f1a1fcf69161e0af411325e9f
+Author: Eric Anholt <anholt@leguin.anholt.net>
+Date:   Wed Apr 5 16:38:52 2006 -0700
+
+    Coverity #582: Free newly-allocated region in error path.
+
+commit 5fd8f79ad3e38df74d9a6cb573617542c101df1a
+Author: Daniel Stone <daniels@preemptive.research.nokia.com>
+Date:   Fri Mar 17 15:58:39 2006 +0200
+
+    Properly clip bounds when only one point is defining an outline.
+
+commit 1e1572eb7f8394ce152e99d96f711ccf9083baf9
+Author: Matthieu Herrb <matthieu@bluenote.herrb.com>
+Date:   Sat Mar 11 15:39:15 2006 +0100
+
+    Fix prototype of XConfigureWindow(). Bugzilla #6023.
+
+commit 1da8bd904f1fc79d63d368473531b438d08bfe37
+Author: Jeremy C. Reed <reed@reedmedia.net>
+Date:   Tue Feb 21 14:10:22 2006 -0800
+
+    Set XTHREADLIB correctly for dragonfly platforms.
+
+commit c9768133e3f65ac4bb64e3941e2d6ae36897ec9c
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Sun Feb 19 12:29:27 2006 -0800
+
+    Update .gitignores for *.o and nls/locale.dir*.
+
+commit efcbde6ba0b770bb0d4c7818e307712161011f10
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Sun Feb 19 12:28:41 2006 -0800
+
+    Move .cvsignore to .gitignore.
+
+commit e3acee88cfcc4ef0fa8a7db39763a5ebe2e985cb
+Author: Daniel Stone <daniels@preemptive.fooishbar.org>
+Date:   Sat Jun 3 13:51:51 2006 +0300
+
+    Fix threading support on GNU/kFreeBSD systems.  (Robert Millan)
+
+commit f1bd3152359ddfadd0d043006036c239f3e2907b
+Author: Daniel Stone <daniels@preemptive.fooishbar.org>
+Date:   Sat Jun 3 12:57:55 2006 +0300
+
+    Bug #2186: Add cs_CZ.iso8859-2 alias.
+
+commit 2b1b79d90db1d7f0472718b8c010c36275994195
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Fri Jun 2 02:46:29 2006 +0300
+
+    nls: Serbian (sr_CS) update (#5575)
+    Bug #5575: 'Yugoslavia' has changed to Serbia & Montenegro, along with a
+    corresponding locale change.  Update compose.dir.pre, locale.alias.pre,
+    and locale.dir.pre.  (Milos Komarcevic)
+
+commit d6fba1f44d404362d3be1b421f57d7ccc3c8cdac
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Fri Jun 2 02:24:25 2006 +0300
+
+    im: add Braille input method (#6296)
+    Bug #6296: Add a Braille input method.  (Samuel Thibault)
+
+commit 0fed7d3185addd610e917dcdaa0676f0256c0ec5
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Fri Jun 2 02:22:17 2006 +0300
+
+    xkb support: small typo
+
+commit cf7d9f9e46f3ce01ac04a95978918d5c0f3f3cf9
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Fri Jun 2 01:50:24 2006 +0300
+
+    en_US.UTF-8 Compose.pre: updates from Simos (#5129)
+    Bug #5129: Numerous updates from Simos Xenitellis, fixing Unicode keysyms,
+    adding Unicode character names, removing duplicate entries, et al.
+
+commit 332d45fce9fdbf59168d90a133af1f580a589e54
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Fri Jun 2 01:44:53 2006 +0300
+
+    nls: fix use of non-keysym dead_space (#5107)
+    Bug #5107: Change users of dead_space to space.
+
+commit 34f59ce3d1e2eb2971b732d11871c6fff8a1c75b
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Fri Jun 2 01:41:18 2006 +0300
+
+    optional XKB support fix
+    Fix compilation with --disable-xkb.
+
+commit c5940a0b85edec4003f91a59fc3c44f538accfe1
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Fri Jun 2 01:39:12 2006 +0300
+
+    i18n: separate data and lib directories
+    Break out locale data into separate data and library directories, under
+    $(datadir) and $(libdir), respectively, by default.
+
+commit 33556ca81db2419b9d2a37664c4cea2069414b37
+Author: Adam Jackson <ajax@benzedrine.nwnk.net>
+Date:   Fri May 12 14:49:17 2006 -0400
+
+    Bump to 1.0.1
+
+commit 80d88557626fae9debc404de33d7fb5d69a6049d
+Author: Adam Jackson <ajax@benzedrine.nwnk.net>
+Date:   Thu May 11 14:06:28 2006 -0400
+
+    libXcursor.so.1, not libXcursor.so
+
+commit 5384f27dfe3c94c462c137ab3540eaa5646ca4c6
+Author: Adam Jackson <ajax@benzedrine.nwnk.net>
+Date:   Thu May 11 14:04:48 2006 -0400
+
+    libXcursor.so.1, not libXcursor.so
+
+commit 01f4d433eed6b70c6e9636157acac022054fdeb6
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Wed May 10 17:02:52 2006 -0700
+
+    Count any partial request towards the current Xlib sequence number.
+
+commit 770cfbd1fcc80a83a9be0c4f68727b8af2c8f4a4
+Author: Daniel Stone <daniels@preemptive.fooishbar.org>
+Date:   Wed May 10 18:06:03 2006 +0300
+
+    XKBMisc.c: use Xfree, not xfree
+    Use Xfree() instead of xfree() when freeing interps.
+
+commit 22a5255b80b80772612279bc840a953edd0e3442
+Author: Daniel Stone <daniels@preemptive.fooishbar.org>
+Date:   Wed May 10 14:51:37 2006 +0300
+
+    locale.alias.pre: bg_BG typo fix
+    Fix typo (be_BG.UTF-8 rather than bg_BG.UTF-8) in locale.alias.pre.
+
+commit 9cac8c9824874ca7d835f001a4efa910b7fdd822
+Merge: 19b8840 e514bc8
+Author: Daniel Stone <daniels@preemptive.fooishbar.org>
+Date:   Wed May 10 14:50:37 2006 +0300
+
+    Merge branch 'master' of git+ssh://git.freedesktop.org/srv/git.freedesktop.org/git/xorg/lib/libX11
+
+commit e514bc875f27f4bf197b06b8315eeca526195915
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Tue May 9 12:41:59 2006 -0700
+
+    Assert that dpy->request does not go backwards. Catches #5839 earlier.
+
+commit fc1159137365a599bf611ee001f439416952c4e0
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Sun May 7 17:40:01 2006 -0700
+
+    In _XPutXCBBuffer, set aside any trailing partial request until the last byte is available.
+
+commit c394480a4247213239822808e3f6e7c6cd6decd9
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Sun May 7 16:58:13 2006 -0700
+
+    Update for XCB ConnSetupSuccessRep name change.
+
+commit 7672bf93bc1200905461aeb0a2dc2c2696410b93
+Author: Daniel Stone <daniels@endtroducing.localdomain>
+Date:   Sun Apr 9 22:22:03 2006 +0300
+
+    Coverity #203, #204: Fix potential NULL dereferences.
+
+commit cfcafbe48d22d9a0cd50eb9454ce0ff88f0129d3
+Author: Daniel Stone <daniels@endtroducing.localdomain>
+Date:   Sun Apr 9 22:20:25 2006 +0300
+
+    Coverity #205: Fix potential NULL dereference.
+
+commit b6771501feea98d037032f82117b6d4f15779f07
+Author: Daniel Stone <daniels@endtroducing.localdomain>
+Date:   Sun Apr 9 22:18:20 2006 +0300
+
+    Coverity #209: Fix potential NULL dereference.  (Alan Coopersmith)
+
+commit 19b8840af241087bb17b1edabcaa9b28fdd0a1dc
+Author: Daniel Stone <daniels@preemptive.research.nokia.com>
+Date:   Fri Apr 7 18:11:52 2006 +0300
+
+    Coverity #826: Fix potential memory leak.
+
+commit 3a16f262abe48b44ed641525e894bc22e13bf72a
+Author: Daniel Stone <daniels@preemptive.research.nokia.com>
+Date:   Fri Apr 7 17:49:41 2006 +0300
+
+    Bug #1625: Include keysym.h from Xutil.h.
+
+commit 2481b767ae96e2f2503c0390545932c8397b090f
+Author: Eric Anholt <anholt@leguin.anholt.net>
+Date:   Wed Apr 5 17:12:15 2006 -0700
+
+    Check if visualList == NULL, not nVisualsMatched == 0.  NULL happens in more
+    cases (allocation failure) than nVisualsMatched == 0.  Noticed from inspection
+    of Coverity #599, #600.
+
+commit 152b17e47d878c2d928eb74581aa69d925a29123
+Author: Eric Anholt <anholt@leguin.anholt.net>
+Date:   Wed Apr 5 16:42:26 2006 -0700
+
+    Coverity #558: Free newly-allocated Database in error path.
+
+commit bc62b99ef36edb34035911c42104be7f6f9d2333
+Author: Eric Anholt <anholt@leguin.anholt.net>
+Date:   Wed Apr 5 16:38:52 2006 -0700
+
+    Coverity #582: Free newly-allocated region in error path.
+
+commit d47f0b3cec1388f7ce60ab2af91df0dea0f221c5
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Fri Mar 31 22:53:07 2006 -0800
+
+    Fix buggy interaction with XCB when running out of XIDs.
+
+commit e3f452571824d6a875bbf582946de185de9e01e9
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Fri Mar 31 22:52:14 2006 -0800
+
+    Add explicit include of Xmd.h to work around bug including both xcb.h and Xmd.h simultaneously.
+
+commit 2363b74ca795c1b3a73c9e572532ba5191adec5b
+Author: Daniel Stone <daniels@preemptive.research.nokia.com>
+Date:   Fri Mar 17 15:58:39 2006 +0200
+
+    Properly clip bounds when only one point is defining an outline.
+
+commit e876efb8aa410f2f5c87aaaa7042f847c4ff96f7
+Merge: be266b2 f71ea0b
+Author: Matthieu Herrb <matthieu@bluenote.herrb.com>
+Date:   Sat Mar 11 15:40:35 2006 +0100
+
+    Merge branch 'master' of git+ssh://herrb@git.freedesktop.org/git/xorg/lib/libX11
+
+commit be266b201dc13530a302a7572283ccd3f32aad87
+Author: Matthieu Herrb <matthieu@bluenote.herrb.com>
+Date:   Sat Mar 11 15:39:15 2006 +0100
+
+    Fix prototype of XConfigureWindow(). Bugzilla #6023.
+
+commit f71ea0bc737c5a42e9e022b86e7ec3b4f846d31c
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Fri Mar 3 11:08:41 2006 -0800
+
+    Update for XCBSendRequest sequence number API changes.
+
+commit a11d1b0ae674320cf9897f6a83ec08c65eca8d9b
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Fri Mar 3 01:42:49 2006 -0800
+
+    Use the full_sequence from XCBGenericError/Event for setting last_request_read, and quit replacing _XSetLastRequestRead with an XCB-specific version.
+
+commit d8ba4ae7045b227f8b675628b9094dded02f1c08
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Thu Mar 2 23:43:26 2006 -0800
+
+    Bugfix: Rely on XCBSendRequest to leave iov in a well-defined state, and place the spare iovecs at the beginning of the array.
+
+commit f9afb5a54435c30961306080e9358d4240ecb844
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Thu Mar 2 23:34:19 2006 -0800
+
+    assert() that we will not infinite loop or read uninitialized memory.
+
+commit d3512ef3aae5b036a8ce6579318108f1ec20ee22
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Thu Mar 2 15:58:52 2006 -0800
+
+    Quit relying on XCBSendRequest to pad to 4-byte boundaries and do it ourselves.
+
+commit fb590c15a740264ee867d15a2547072e43b21eed
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Thu Mar 2 12:06:04 2006 -0800
+
+    Handle errors correctly when Xlib owns the event queue and XCB has the checked error feature.
+
+commit 8356ba37d307a9eda895a6bf41ef727bbfc9a695
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Mon Feb 27 11:51:47 2006 -0800
+
+    Use the new XCBSendRequest flag, XCB_REQUEST_RAW, to hand a bag-o-bytes down uninterpreted.
+
+commit 07bdf1fbbf2418f866df1a2140d514dd3f035139
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Sun Feb 26 15:46:01 2006 -0800
+
+    Update for new XCBSendRequest API.
+
+commit 409a08cff8347d39e0e6c53c9f380d21f221f5ac
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Thu Feb 23 18:12:31 2006 -0800
+
+    Performance fix: Replace calls to XCBGetRequestRead with the new XCBGetQueuedRequestRead. Cuts a lot of syscalls.
+
+commit ec30a27341b97620b07dd886f98d1d7664a67685
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Thu Feb 23 18:01:46 2006 -0800
+
+    Minor performance fix: Access dpy->xcl->connection directly instead of calling XCBConnectionOfDisplay. It happens a lot.
+
+commit 53c471c6a835d5cedeca99f2c97058d196a3fd7e
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Thu Feb 23 11:46:09 2006 -0800
+
+    XCBFlush used to return non-positive on failure, and this test did not catch 0. Now it returns boolean: 0 or 1. Testing <= 0 covers both cases. I probably want to switch to a boolean test eventually.
+
+commit 41c0121a8718b530feaf7fe315b673d9b8defce2
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Tue Feb 21 21:25:41 2006 -0800
+
+    Refactor the code that passes requests down to XCB into a separate issue_complete_request function.
+
+commit 67d06e0fe468dca22847aa14d3f917128f89f9cf
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Tue Feb 21 15:33:05 2006 -0800
+
+    If we have not actually put the buffer back, deferred invariants may not hold. This is OK.
+
+commit 434bf80b4053ff1ba82adf65de1f76b4d3731bf1
+Author: Jeremy C. Reed <reed@reedmedia.net>
+Date:   Tue Feb 21 14:10:22 2006 -0800
+
+    Set XTHREADLIB correctly for dragonfly platforms.
+
+commit b24834762e975bd319f9ab5c7cf790b2a02a9474
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Tue Feb 21 14:03:26 2006 -0800
+
+    Sometimes functions other than _XUnlockDisplay call _XPutXCBBuffer. Some invariants appropriate for Unlock are not appropriate otherwise: move them to _XUnlockDisplay.
+
+commit 99b8defd0d5e6993071e21638128c9de2574b37d
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Tue Feb 21 13:04:21 2006 -0800
+
+    Execute BeforeFlush hooks on complete buffers, not request-at-a-time.
+    Traditional Xlib worked this way; I dunno why I changed it.
+
+commit 9b01e7849775749182052fe324df9d8e6ceeee99
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Tue Feb 21 12:51:44 2006 -0800
+
+    Factor the XCBSendRequest call out of the conditional in _XPutXCBBuffer.
+
+commit 7ce7ac882de128955751a5307889db9d712d8a72
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Tue Feb 21 12:44:30 2006 -0800
+
+    Quit using a triple-pointer. Almost as if I were a sensible person.
+
+commit 35a858be218cdbfa4593d44a67663d5c25297016
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Tue Feb 21 12:21:01 2006 -0800
+
+    Remove the XCL_PAD macro.
+
+commit e741b70ed2542c5463c57dac44bc37328616733b
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Sun Feb 19 12:29:27 2006 -0800
+
+    Update .gitignores for *.o and nls/locale.dir*.
+
+commit f25b4b00e1683b0d97dba46dac46d65a9c2270a6
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Sun Feb 19 12:28:41 2006 -0800
+
+    Move .cvsignore to .gitignore.
+
+commit c7cda56eebaf6ab11403363be14d4948d7d8be38
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Sun Feb 19 11:49:15 2006 -0800
+
+    Land XCB support on X.org HEAD.
+
+commit 881467b3032261791ef5ec61b3879bb68d0a3d8c
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Sun Feb 19 02:14:11 2006 +0000
+
+    Merge the X11 and BIGREQS package sets: they were used in exactly the same places.
+
+commit 6b0158dfad714db5b89c04dbea3aedeafa0fb146
+Author: Jamey Sharp <jamey@minilop.net>
+Date:   Tue Feb 14 19:37:36 2006 +0000
+
+    Refactor _XFlush and _XSend code that sets dpy->synchandler to _XSeqSyncFunction into a new function, _XSetSeqSyncFunction. It makes the patch for XCB cleaner, but is arguably a good idea anyway.
+
+commit 010c3acbb3a6993d39274f42d88c00849acb0fb0
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Sun Feb 12 18:19:17 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 fe8c01c80263457f01b70dc1511b2bd9466b7c96
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Fri Feb 3 23:34:43 2006 +0000
+
+    Fix typo in .TH line
+
+commit b091c217f3c3f60dde78b09a95c150df6c83d7ba
+Author: Kevin E Martin <kem@kem.org>
+Date:   Thu Dec 15 00:24:28 2005 +0000
+
+    Update package version number for final X11R7 release candidate.
+
+commit e7c04e0e65a2a0c70c6ad29ec2d6f4350fd81c2a
+Author: Kevin E Martin <kem@kem.org>
+Date:   Tue Dec 6 22:48:41 2005 +0000
+
+    Change *man_SOURCES ==> *man_PRE to fix autotools warnings.
+
+commit b5c495854d5270e64e6d588388ffa906bfcaac22
+Author: Kevin E Martin <kem@kem.org>
+Date:   Sat Dec 3 05:49:42 2005 +0000
+
+    Update package version number for X11R7 RC3 release.
+
+commit 9e96dbc343c7f27ff47607acd75378ab23903e2a
+Author: Kevin E Martin <kem@kem.org>
+Date:   Sat Dec 3 04:41:47 2005 +0000
+
+    Add check and cflags for malloc(0) returning NULL.
+
+commit 649c37b47909620ccafde3e983de8321cddd74ce
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Mon Nov 28 22:03:04 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 8d1500df66d796ebff2b0d8c02205e5fa6796d4a
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Wed Nov 23 22:33:06 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 93cf3747f9ae8d30bd485b41c5ff10397f68f078
+Author: Eric Anholt <anholt@freebsd.org>
+Date:   Sun Nov 20 23:17:39 2005 +0000
+
+    Add/improve libs .cvsignores.
+
+commit fa1f4a08112bfa14d3758f4702733dd3892966c3
+Author: Kevin E Martin <kem@kem.org>
+Date:   Sat Nov 19 07:15:39 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 7012f9b56c594cf40855ba0dbf93af1263417a8c
+Author: Kevin E Martin <kem@kem.org>
+Date:   Mon Nov 14 21:51:07 2005 +0000
+
+    Fix xf86bigfont pkgconfig dep typo.
+
+commit 60a72f47951f46b4e0505d9903a94af3b6bed8ca
+Author: Kevin E Martin <kem@kem.org>
+Date:   Wed Nov 9 21:19:12 2005 +0000
+
+    Update package version number for X11R7 RC2 release.
+
+commit 6bb0c3796b6e1beddc376a896e865704886e1462
+Author: Kean Johnson <kean@armory.com>
+Date:   Tue Nov 8 06:33:25 2005 +0000
+
+    See ChangeLog entry 2005-11-07 for details.
+
+commit 14be0098ad90c3e68bd2d21b00ffabb76f1fd780
+Author: Kevin E Martin <kem@kem.org>
+Date:   Tue Nov 1 15:11:50 2005 +0000
+
+    Update pkgcheck dependencies to work with separate build roots.
+
+commit 1bf71462a972e0fc56de63f5c7fd613b37fc70f1
+Author: Donnie Berkholz <spyderous@gentoo.org>
+Date:   Fri Oct 28 10:44:03 2005 +0000
+
+    Revert that, it's redundant. But it is worth noting that --disable-xkb is broken, if anyone cares.
+
+commit be627a39fe373e2e81fdc263780e70a271d9e0c5
+Author: Donnie Berkholz <spyderous@gentoo.org>
+Date:   Fri Oct 28 08:28:08 2005 +0000
+
+    Add dependency on inputproto for XI.h.
+
+commit 5fae4cb456cb03fb70cd065dbc2ca94c8ed99082
+Author: Adam Jackson <ajax@nwnk.net>
+Date:   Fri Oct 21 18:44:24 2005 +0000
+
+    Bug #4736: Error decoding for Damage extension. (Jonathan Lennox)
+
+commit 1171fa9dc77413f0e90933a565ec07068052afb4
+Author: Kevin E Martin <kem@kem.org>
+Date:   Wed Oct 19 02:48:08 2005 +0000
+
+    Update package version number for RC1 release.
+
+commit 2a2d905706308b9d5a1c16af1067fb390f43850c
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Tue Oct 18 00:00:08 2005 +0000
+
+    Use @LIB_MAN_SUFFIX@ instead of $(LIB_MAN_SUFFIX) in macro substitutions to work better with BSD make
+
+commit 66d35b6971fb26762392a2a8e2c47db46c11116a
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Mon Oct 17 21:13:15 2005 +0000
+
+    Rename .shadows.DONE to shadows.DONE to avoid some make's thinking it's a suffix rule (reported by Matthieu Herrb)
+
+commit a316995a17c084e98ef1b7f25d287c2c08b6d749
+Author: Donnie Berkholz <spyderous@gentoo.org>
+Date:   Sun Oct 16 03:03:35 2005 +0000
+
+    Change '==' to portable '='.
+
+commit b76a072530e884bcbea6ed8fed5aef39361dcfc0
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Wed Oct 12 00:04:50 2005 +0000
+
+    configure.ac Use XORG_MAN_SECTIONS instead of custom man section configuration. Add shadow man pages for man pages that document multiple functions.
+
+commit 8ee5c1429af98206e05a0536f87c0f21a529cdf0
+Author: Eric Anholt <anholt@freebsd.org>
+Date:   Tue Oct 11 02:18:36 2005 +0000
+
+    Add appropriate pthread libs/flags for FreeBSD, fixing the build of ico and probably others.
+
+commit 41ff3b9d1f194a7b56437b650d5f589225c078c6
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Sun Oct 9 22:28:39 2005 +0000
+
+    Bug #3021 <https://bugs.freedesktop.org/show_bug.cgi?id=3021> Requests and Errors for XFixes are not in XErrorDB (Jonathan Lennox)
+
+commit 91ed79852e790049ab54e68f288afb3c953194c9
+Author: Kevin E Martin <kem@kem.org>
+Date:   Fri Oct 7 15:00:00 2005 +0000
+
+    Clean up generated files
+    Add missing dist tarball files
+
+commit 440399b470c97b159a530602fff11c315aca8d97
+Author: Søren Sandmann Pedersen <sandmann@daimi.au.dk>
+Date:   Wed Oct 5 18:27:10 2005 +0000
+
+    Add el_GR.UTF-8 compose file
+
+commit 010f0647e25ac617d0f92c8d2b8dda684da545db
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Fri Sep 30 07:52:46 2005 +0000
+
+    Bug #2609: Add Kyrgyz locale (Ilyas Bakirov).
+
+commit 3ef2fb67bd8905b208ad7eb790c3843e14cea7ed
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Fri Sep 30 07:47:55 2005 +0000
+
+    Bug #1640: Kinyarwanda locale support. (Steve Murphy)
+
+commit 4ae0decabe0960870df0ec165f495166c10a053c
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Fri Sep 30 07:40:03 2005 +0000
+
+    Bug #2268: Add South African locales (Dwayne Bailey). Some whitespace cleanups, as the parser is a little touchy.
+
+commit 3f79eb4c99844f618f1889741d1631c2ffe5385f
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Fri Sep 30 07:11:19 2005 +0000
+
+    Generate locale.alias and compose.dir exactly like we do in the monolith, which fixes non-UTF-8 locales in particular (so we get foo: bar, as well as foo bar). Switch to generating locale.dir the same way.
+
+commit d1237d1483ff972c76a0ac344ec97d5280db0007
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Thu Sep 29 21:27:12 2005 +0000
+
+    Add Xcms.txt to lib/X11
+
+commit 4a86f299693f7376cbe98175f0b0c44d691802b3
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Sat Sep 24 20:11:06 2005 +0000
+
+    Add XQueryExtension.man
+
+commit a057a66e2041d45198a13a4ece7c07068f76f21b
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Sat Sep 24 00:16:32 2005 +0000
+
+    Add XTHREAD_CFLAGS for platforms that need special defines like
+    -D_REENTRANT or -D_POSIX_whatever to get re-entrant function definitions. Set XDMCP_LIBS correctly for later libXdmcp tests.
+
+commit 3e920a65a7c376ad63eae2240fd06904d25d18bf
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Fri Sep 2 23:00:30 2005 +0000
+
+    Issue an error if XTRANS macros were not found when generating configure from configure.ac to flag errors early, instead of when people wonder why libX11 can't talk to an Xserver because it has no transports defined
+
+commit 3eb9f2d693af89d04e2fd92492c8205dce332c9c
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:   Thu Sep 1 19:24:13 2005 +0000
+
+    Use $(X11_LOCALEDATADIR) instead of @X11_LOCALEDATADIR@ so this install destination can be overridden at make install time.
+
+commit 7afa64325183b78d2d6a4862821f8b3e9866105c
+Author: Matthieu Herrb <matthieu.herrb@laas.fr>
+Date:   Sun Aug 28 19:45:48 2005 +0000
+
+    OpenBSD needs -lpthread for threaded applications too.
+
+commit 2b2f3d3877cb7927f196d01a5df6a27bf8d0518a
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Fri Aug 26 05:16:46 2005 +0000
+
+    Define ERRORDB/KEYSYMDB to XERRORDB/XKEYSYMDB if the former is undefined but the latter is. (Gerte Hoogewerf)
+
+commit 07066da0902df91c71f2adb81d1a17ec29165553
+Author: Matthieu Herrb <matthieu.herrb@laas.fr>
+Date:   Sun Aug 21 15:45:04 2005 +0000
+
+    update
+
+commit de44d8b111f57bd2f015e085fd8298c5f2a15ef3
+Author: Matthieu Herrb <matthieu.herrb@laas.fr>
+Date:   Sun Aug 21 15:38:39 2005 +0000
+
+    Threads support for BSD systems:
+    - need to check for gewtpwuid_r to define mtsafeapi
+    - build UIThrstubs if needed.
+
+commit 60217fdb918bafb2082519efe5cba3b13ad3082a
+Author: Adam Jackson <ajax@nwnk.net>
+Date:   Wed Aug 17 19:46:08 2005 +0000
+
+    Add xthreadlib variable to x11.pc. Bump to 0.99.1.
+
+commit e1f4c6f5e36c1511f66fa1fac76520fd97eecbad
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Wed Aug 17 01:27:08 2005 +0000
+
+    Fix more broken multi-line .ds macros. Remove extraneous ;'s .
+
+commit 1909786f4a7d686369edcfc05a938df115fab37c
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Tue Aug 16 19:23:15 2005 +0000
+
+    Bugzilla #4112 <https://bugs.freedesktop.org/show_bug.cgi?id=4112> Patch #2687 <https://bugs.freedesktop.org/attachment.cgi?id=2897> Fix multi-line macros in XPutImage man page. (Debian bug #323210, fix by David Mart?nez Moreno)
+
+commit 83406d69c62070d2eeef23eb47f1ca887f711ee5
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Mon Aug 15 19:53:37 2005 +0000
+
+    Move RAWCPP macro to xorg-macros.m4 so other modules can use it Add check for whether or not RAWCPP needs -traditional instead of hardcoding it, so non-gcc cpp's can be used
+
+commit 5bb43de17de8e71d967488a713bf2b3448533444
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Sat Aug 6 18:59:49 2005 +0000
+
+    Typo fix in output message
+
+commit afe34b95862bb3c06cdbe724cb5ec3001a4a5215
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Thu Aug 4 02:55:49 2005 +0000
+
+    //bugs.freedesktop.org/show_bug.cgi?id=1887> Patch #3005 <https://bugs.freedesktop.org/attachment.cgi?id=3005> libX11 locale defs severely adrift from glibc: adding new aliases (From Debian via Nathanael Nerode)
+
+commit 3979a0b88edf6475ce5cfaa386e18ef980bda13c
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Thu Aug 4 02:51:30 2005 +0000
+
+    //bugs.freedesktop.org/show_bug.cgi?id=1887> Patch #3002 <https://bugs.freedesktop.org/attachment.cgi?id=3002> libX11 locale defs severely adrift from glibc: locales bugfix for bs_BA (From Debian via Nathanael Nerode)
+
+commit 34b454df192f4563499c453ccdb8c079f4a20cbe
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Sat Jul 30 20:30:46 2005 +0000
+
+    Include config.h so Xtrans knows which transport types to build code for
+
+commit cd9c9936b49c125eda779b99887d7e6ae4cf56cd
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Sat Jul 30 19:15:16 2005 +0000
+
+    Add -D flags to clear various warnings (Stefan Dirsch)
+
+commit e7fef67b4531faddd805d8f2157903006d3117ed
+Author: Kevin E Martin <kem@kem.org>
+Date:   Fri Jul 29 21:22:50 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 2ebb00244928237088e68325b1032b3550455ce9
+Author: Matthieu Herrb <matthieu.herrb@laas.fr>
+Date:   Sat Jul 23 20:19:31 2005 +0000
+
+    remove orphan TAB at begin of line
+
+commit dd7a9cdecda73e024ca84c5b9a22b18688038d94
+Author: Kevin E Martin <kem@kem.org>
+Date:   Sat Jul 23 18:09:39 2005 +0000
+
+    Modify modular libs to use Xregion.h instead of region.h
+
+commit 6d635a88d91647b1b63611c3591f74916f88cd1c
+Author: Kevin E Martin <kem@kem.org>
+Date:   Sat Jul 23 18:06:16 2005 +0000
+
+    lib/Xrender/Picture.c Change region.h to Xregion.h and modify internal references to include <X11/Xregion.h>.
+
+commit 36283f50fd9748733ae84cb7fb52ca8d9e661c15
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Sat Jul 16 06:25:35 2005 +0000
+
+    Set soversion to 6.2.0.
+
+commit 75fd5ae6e4683b9b9dcc13bc2f0faf223610a74f
+Author: Keith Packard <keithp@keithp.com>
+Date:   Fri Jul 15 04:27:32 2005 +0000
+
+    Add missing Makefile.am to lib/X11/modules
+
+commit 6d84a8b1329af1fcfe86b198f1a6e7dd6ff616c3
+Author: Keith Packard <keithp@keithp.com>
+Date:   Fri Jul 15 04:08:51 2005 +0000
+
+    Move i18n modules to top-level so they can be built in the right order (before xlib for non-loadable, after xlib for loadable).
+    Link i18n modules against xlib to resolve Xlib symbols used by them.
+
+commit 45f40126a73295345bb5eb187b1167874842ab6e
+Author: Alexander Gottwald <ago@freedesktop.org>
+Date:   Thu Jul 14 19:50:00 2005 +0000
+
+    Add $(top_srcdir)/src to include list
+
+commit 0aed7d91f5928d09d541617aad03709b5090658d
+Author: Matthieu Herrb <matthieu.herrb@laas.fr>
+Date:   Thu Jul 14 17:04:49 2005 +0000
+
+    Build fix for non-GNU make.
+
+commit b79422ccb02ab44548d1038956ab0cd4e2638645
+Author: Adam Jackson <ajax@nwnk.net>
+Date:   Thu Jul 14 15:12:44 2005 +0000
+
+    typo fixes (Matthieu Herrb)
+
+commit 419304cde2fda19457c667870edefc0b227651b3
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Wed Jul 13 02:41:36 2005 +0000
+
+    Add missing backslashes to xlocale_la_SOURCES
+
+commit d14cc5c8964c4539b57c6cb51ef653292e410b79
+Author: Keith Packard <keithp@keithp.com>
+Date:   Mon Jul 11 20:32:55 2005 +0000
+
+    Ammend AM_CFLAGS with all needed includes; cannot figure out an easy way to automate this.
+
+commit 424c2d8905eb2ad0a2df15b1da2f96140bfbcffb
+Author: Lars Knoll <lars@trolltech.com>
+Date:   Mon Jul 11 15:24:32 2005 +0000
+
+    compile
+
+commit de9784eb1bde46efc316da279e3da27c6cc288a7
+Author: Keith Packard <keithp@keithp.com>
+Date:   Mon Jul 11 09:26:40 2005 +0000
+
+    Ignore built man page files
+
+commit 0c258c36d1523113790c599b16d2947d7aa6469a
+Author: Keith Packard <keithp@keithp.com>
+Date:   Mon Jul 11 09:18:31 2005 +0000
+
+    Minor changes to help modular Xlib build i18n modules
+
+commit 6e752ea1203b786423e40f43340bce15ca3de0f0
+Author: Keith Packard <keithp@keithp.com>
+Date:   Mon Jul 11 08:29:18 2005 +0000
+
+    Enable loadable i18n modules, making them configurable on the configure command line.
+    Clean up conditionals for XKB, XCMS, XLOCALEDIR
+    Create new lib directory for locale modules in ${X11_LIBDIR}/locale/lib. Add this to the default XLOCALEDIR search path.
+    Create separate X11_LOCALEDATADIR variable pointing at ${datadir}/X11/locale for installing locale data.
+    Split out xcms, xkb, xlibi18n sources from main xlib bits so they can be conditionally included more easily. Lots of source files have been moved with this step; the result seems like it might be easier to maintain.
+    Display message at end of configure script with selected options.
+    Fix manual building with cpp to add -traditional in cpprules.in. This isn't conditionalized at all, so it will break on systems not using GNU cpp.
+
+commit b46cf0d879f1dbf92dcf5a0305d18986c766ed84
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Sun Jul 10 22:37:33 2005 +0000
+
+    Fix segfault when _XimProtoCreateIC() fails to create a context; Debian #239991. (Chung-chieh Shan)
+
+commit 6f2132b18e61ca9755e4b45550f3f5097dd1fbb7
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Sat Jul 9 20:06:04 2005 +0000
+
+    Set __libmansuffix__ & __xorgversion__ correctly when cpp processing man pages
+
+commit 3939ac4410446b46071c9d714f4270c12bf904fe
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Sat Jul 9 18:44:14 2005 +0000
+
+    - Since all but one line of all the nls/*/Makefile.am files are identical, move common bits to nls/localerules.in for easier updating and use automake includes to include in all the nls/*/Makefile.am files
+    - Don't assume $(CPP) can take gcc-only -traditional flag
+    - CPP process man pages as is done in the monolithic tree
+
+commit 19ba9d0df86c688319377467254b9ea9c4b0eccc
+Author: Keith Packard <keithp@keithp.com>
+Date:   Sat Jul 9 06:01:49 2005 +0000
+
+    Clean up .cvsignore files
+
+commit f4bba6fa9b9ce637be7662754750054567e9250a
+Author: Adam Jackson <ajax@nwnk.net>
+Date:   Sat Jul 9 02:53:29 2005 +0000
+
+    typo fix. i suck.
+
+commit 3305da61a61695e24c1ea11d3f59dddb52873d47
+Author: Adam Jackson <ajax@nwnk.net>
+Date:   Sat Jul 9 02:41:18 2005 +0000
+
+    Check for bigfont proto headers via pkgconfig (Arwed von Merkatz)
+
+commit afdae2e8ccb93de2987b5a5e850695af15ece7e0
+Author: Keith Packard <keithp@keithp.com>
+Date:   Fri Jul 8 07:11:56 2005 +0000
+
+    Create and use XlibConf.h to match modular build which needs XTHREADS defined when building extensions
+
+commit 86fa88dc594ca2093030acf5c84973ee2b33eb4c
+Author: Keith Packard <keithp@keithp.com>
+Date:   Fri Jul 8 06:57:06 2005 +0000
+
+    Create and install XlibConf.h to provide external users of Xlibint.h the defines necessary to correctly use the library. Xlibint.h should #include this new file.
+    Add a bunch of .cvsignore files
+
+commit 30f6ffedeaf899e699f0c6b14c9471ce9bcc430c
+Author: Chris Less <clee@c133.org>
+Date:   Mon Jul 4 23:01:48 2005 +0000
+
+    Fixing bug #380 - add a man page for XQueryExtension, XListExtensions, and XFreeExtensionList.
+
+commit 55328bb6caabd37885cd19d7a5821ed425daf321
+Author: Eric Anholt <anholt@freebsd.org>
+Date:   Sun Jul 3 10:17:38 2005 +0000
+
+    Avoid a gmake-specific construct, and instead just write the name of the current directory into each Makefile.am.
+
+commit 726538ba21b631bfb0b8094a5546acdaf57379ff
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Sun Jul 3 07:37:33 2005 +0000
+
+    Fix more include paths; add dix-config.h to XKB code.
+
+commit 8c7677138e70e14eca0255f2168583f0ecc21994
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Sun Jul 3 07:00:55 2005 +0000
+
+    Add Xtrans definitions (FONT_t, TRANS_CLIENT) to clean up warnings.
+    Add XSERV_t, TRANS_SERVER, TRANS_REOPEN to quash warnings.
+    Add #include <dix-config.h> or <xorg-config.h>, as appropriate, to all source files in the xserver/xorg tree, predicated on defines of HAVE_{DIX,XORG}_CONFIG_H. Change all Xfont includes to <X11/fonts/foo.h>.
+
+commit 197697c92a63091a4cc3cc04dcb7fa29d2655758
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Fri Jul 1 22:13:35 2005 +0000
+
+    Fix objdir != srcdir, as well as make distcheck.
+    Don't attempt to create Compose.pre files; formatting fixes.
+    Added if not already present.
+
+commit c162d60ad8f124563f94a2a266de59373936266c
+Author: Søren Sandmann Pedersen <sandmann@daimi.au.dk>
+Date:   Wed Jun 22 22:46:31 2005 +0000
+
+    Apply these patches from Theo van Klaveren:
+    lib-dmx.patch lib-FS.patch lib-X11.patch lib-XRes.patch lib-XScrnSaver.patch lib-xtrans.patch
+    to make the libraries distcheck.
+
+commit 9ee8abdab03ea605a6327118ab7dacab6adf8876
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Sat Jun 18 07:48:43 2005 +0000
+
+    Move Secure RPC flags from X11/configure.ac to xtrans/xtrans.m4 since multiple modules will need them
+
+commit 12afc57b7d455781eee305e9ed6a899ceec8729e
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Wed Jun 15 16:50:47 2005 +0000
+
+    Typo fix to locale/error/keysym location declarations.
+
+commit 9a895777e30762f61b98d25be3b5d8b1169baa17
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Wed Jun 15 13:37:43 2005 +0000
+
+    Typo in ImUtil.h commit -- I AM CAPTAIN SKILL.
+
+commit add49285663684875ab7a5c58ec7a2cf8b775f67
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Wed Jun 15 13:32:35 2005 +0000
+
+    Define locations for XErrorDB, XKeysymDB, and locale data in configure.ac. Add AC_DEFINE_DIR macro from autoconf-archive.cryp.to towards this end.
+    Move ImUtil.h from src/ to include/X11/.
+
+commit 845dfc6b42b950890866ee4df27761e086f50dca
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Wed Jun 15 13:27:48 2005 +0000
+
+    Move ImUtil.h from src/ to include/X11/. Additionally, copy Cmap.h as a distribution file.
+
+commit bba117f0d98f62cfb060d0fab97b407a3a0bfda9
+Author: Daniel Stone <daniel@fooishbar.org>
+Date:   Fri Jun 10 14:11:36 2005 +0000
+
+    Remove pointless include of Xlib.h.
+    Fix #include path to bigreqstr.h.
+
+commit 1a0de49da1274882bab05b0f7240936b37955e5c
+Author: Alexander Gottwald <ago@freedesktop.org>
+Date:   Thu Jun 9 21:30:15 2005 +0000
+
+    Use $(srcdir) for Compose.pre and XLC_LOCALE.pre
+
+commit af4f0f302644ebfbb0ca9f4016a4aee85c973d37
+Author: Alexander Gottwald <ago@freedesktop.org>
+Date:   Thu Jun 9 15:55:33 2005 +0000
+
+    Replace <X11/transport.c> with <X11/Xtrans/transport.c>
+
+commit fd5f58e0baf692e34b9b622286f18762cc2500d3
+Author: Alexander Gottwald <ago@freedesktop.org>
+Date:   Thu Jun 9 15:52:02 2005 +0000
+
+    Replace <X11/Xtrans.h> with <X11/Xtrans/Xtrans.h>
+    Copy Xtrans.h to exports/include/X11/Xtrans only
+
+commit 44538f9940f969d46c0e5e4b201c684cde2ba611
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Sun Jun 5 03:29:33 2005 +0000
+
+    Port Imake flags to autoconf tests & --enable-* flags: HASSETUGID, HASGETRESUID, NO_XLOCALEDIR, HAS_SHM and XF86BIGFONT
+
+commit 588e30e9ec65fa6205a34be650b79d5e2243edec
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Sat Jun 4 22:53:21 2005 +0000
+
+    Add --enable-secure-rpc flag and checks for needed functions for Secure RPC ("SUN-DES-1") authentication method
+
+commit a547afee2ef49cc41bbb67f9cff5a52a283c0854
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Sat Jun 4 21:20:20 2005 +0000
+
+    Bug #3436 <https://bugs.freedesktop.org/show_bug.cgi?id=3436> Conndis.c uses incorrect type for args to XdmcpWrap() (Mike Harris - mharris@www.linux.org.uk)
+
+commit ca93c761559ae464189c7ea7cf11c6a6679f2431
+Author: Matthieu Herrb <matthieu.herrb@laas.fr>
+Date:   Sat May 28 01:02:32 2005 +0000
+
+    Don't use $< in explicit rules. This only works with GNU make. <https://bugs.freedesktop.org/show_bug.cgi?id=3383>
+
+commit 09ebb349359e3dd9131fa2fa8b07559faa173654
+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 761219b1ef9befc350c8a35b6f96d047e5f008cc
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Sat May 21 23:07:48 2005 +0000
+
+    xtrans:
+    Create autoconf macro XTRANS_CONNECTION_FLAGS to provide standard set of --enable flags for which transports to support and common place to update for required libraries for platforms that need certain libs for certain transports
+    ICE:
+    Add ICE_t #define required by Xtrans headers. Replace static defines of LOCALCONN & UNIXCONN with new XTRANS_CONNECTION_FLAGS macro.
+    X11:
+    Moved transport type checks to new macro XTRANS_CONNECTION_FLAGS in xtrans.m4 in xtrans module so they can be shared by all modules using xtrans.
+
+commit 4b1ba6eb975b547b808f4d5c8825a3261de5e02a
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Sat May 21 04:26:12 2005 +0000
+
+    Quote $ac_cv_search_* variables to prevent errors from test when they are set to "none required" (as happens on Solaris since dlopen is in libc)
+    Comment out "override CC = gcc" line as it breaks builds with non-GNU makes, and its incorrect to force a specific compiler. Change LINK line from gcc to $(CC).
+
+commit 1d425d5e2092dd18a7dd599b37ed9af61cf59819
+Author: Adam Jackson <ajax@nwnk.net>
+Date:   Thu May 19 00:22:32 2005 +0000
+
+    revert last change, didn't do right thing at all, sorry for the noise
+
+commit 1b0c46c1ae61d751dd3ca96de8e2c3fe21c5f4f2
+Author: Adam Jackson <ajax@nwnk.net>
+Date:   Thu May 19 00:10:07 2005 +0000
+
+    Require automake 1.7 in AM_INIT_AUTOMAKE
+
+commit cd4657c175dbab6aaca36f18a0ca92c95b5567dd
+Author: Søren Sandmann Pedersen <sandmann@daimi.au.dk>
+Date:   Tue May 17 22:32:09 2005 +0000
+
+    - Check for xproto as its CFLAGS are needed in the .pc file
+
+commit 46e8d8a65430dd87c10b066b5cff99a689c22241
+Author: Egbert Eich <eich-at-freedesktop-dot-org>
+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 23198d2bfbf0049b2630235cd4d4a4ffba7ec6c1
+Author:  <ssp@aware-of-vacuity.boston.redhat.com>
+Date:   Mon May 16 22:35:27 2005 +0000
+
+    Make Xdmcp unconditionally required, require various protocol modules.
+    Mon May 16 17:48:03 2005 Søren Sandmann <sandmann@redhat.com>
+    Check for kbproto if using XKB.
+    Require xextproto rather than xextensions
+    Remove the entries from the xlibs tree, as they are not relevant here.
+
+commit 8bd3aea84ce54b8b76a898f3ae00e2b499c14a5e
+Author: Søren Sandmann Pedersen <sandmann@daimi.au.dk>
+Date:   Mon May 16 21:48:36 2005 +0000
+
+    Mon May 16 17:48:03 2005 Søren Sandmann <sandmann@redhat.com>
+    Check for kbproto if using XKB.
+
+commit 9b1fa9ca3ed852ed40860f137511683f4bdae6fa
+Author:  <ssp@aware-of-vacuity.boston.redhat.com>
+Date:   Mon May 16 21:27:35 2005 +0000
+
+    Require xextproto rather than xextensions
+    Remove the entries from the xlibs tree, as they are not relevant here.
+
+commit 7eee605e3aeed549d1053325a03027c5e8cbf71b
+Author: Søren Sandmann Pedersen <sandmann@daimi.au.dk>
+Date:   Fri May 13 22:53:36 2005 +0000
+
+    - For now put xtrans in X11/Xtrans/X11, since libX11 is looking for it in <X11/...>
+    - For Xcomposite and Xdamage, don't link the build system out of the xc tree
+    - Link the public X11 headers into their own directory
+    - Add links to XKeysymDB and XErrorDB
+    - Add links to all the Xlib man pages
+    - Add links to the lcUniConv subdirectory
+    - Conditionally include config.h in Xlib source
+
+commit 6769ccda88caf27d1441d335ef2b318a047a612b
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Mon Mar 21 04:58:21 2005 +0000
+
+    xc/lib/X11/ErrDes.c
+    //bugs.freedesktop.org/show_bug.cgi?id=132) Patch #2168 (https://bugs.freedesktop.org/attachment.cgi?id=2168) Replace a couple of BUFSIZE uses with better values to check against. Fixes by Stuart Anderson <anderson@netsweng.com>
+
+commit 3b9e8ece93b916c55a82df53e85f097418edf471
+Author: Roland Mainz <roland.mainz@nrubsig.org>
+Date:   Sat Mar 19 22:04:55 2005 +0000
+
+    xc/nls/Compose/iso8859-2
+    xc/nls/Compose/iso8859-3
+    xc/nls/Compose/iso8859-9
+    //bugs.freedesktop.org/show_bug.cgi?id=2592) attachment #2156 (https://bugs.freedesktop.org/attachment.cgi?id=2156) Fix a couple of typos in ISO8859-* Compose files ("asciicircum" instead "of asciicirum"). Patch by Matthias Hopf <mhopf@suse.de>.
+
+commit 0ce5950a08b9ab23ca8a32effdd40c421e92df84
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Tue Mar 8 02:53:36 2005 +0000
+
+    Bugzilla Bug 2006 (https://bugs.freedesktop.org/show_bug.cgi?id=2006) Patch #2031 (https://bugs.freedesktop.org/attachment.cgi?id=2031) XEmbed client doesn't receive key events from XIM: Use | to set a bit, not &. Patch by Hidetoshi Tajima <hidetoshi.tajima@sun.com>.
+
+commit df341cd2f2f263f13323e8c0936ea8aa0d7fbba1
+Author: Roland Mainz <roland.mainz@nrubsig.org>
+Date:   Tue Feb 1 03:12:28 2005 +0000
+
+    xc/nls/Compose/pt_BR.UTF-8
+    //bugs.freedesktop.org/show_bug.cgi?id=2400) attachment #1762 (https://bugs.freedesktop.org/attachment.cgi?id=1762): Fix build bustage caused by broken patch for brazillian locale support (see Bugzilla #1896). Patch by Kevin E. Martin <kem@freedesktop.org>.
+
+commit 483d3973f56dda51f9251d3ea808aaf7f3b48c10
+Author: Markus Kuhn <Markus.Kuhn@cl.cam.ac.uk>
+Date:   Fri Jan 28 18:31:31 2005 +0000
+
+    cleaned up boundary-case handling for Uxxxx Unicode keysym notation
+
+commit f234188a4c1e6b655aef0e3957ccad20d4c5847f
+Author: Roland Mainz <roland.mainz@nrubsig.org>
+Date:   Wed Jan 19 01:53:55 2005 +0000
+
+    xc/nls/compose.dir
+    xc/nls/locale.dir
+    xc/nls/Compose/Imakefile
+    xc/nls/Compose/pt_BR.UTF-8
+    xc/nls/XI18N_OBJS/Imakefile
+    xc/nls/XI18N_OBJS/pt_BR.UTF-8
+    xc/nls/XLC_LOCALE/Imakefile
+    xc/nls/XLC_LOCALE/pt_BR.UTF-8
+    //bugs.freedesktop.org/show_bug.cgi?id=1896) attachment #1675 (https://bugs.freedesktop.org/attachment.cgi?id=1675): Add support for pt_BR.UTF-8 locale. Patch by Gustavo Noronha Silva, Branden Robinson, Julien Lafon.
+
+commit 7448ea7ef425d35cfc31eb41d46f4d879774f376
+Author: Egbert Eich <eich-at-freedesktop-dot-org>
+Date:   Fri Jan 14 18:03:09 2005 +0000
+
+    Made some security enhancements:
+    - no writing past end of buffer caused by bogus locale.
+    - explicitely add a \0 character at end of string. (Bugzilla #2262)
+
+commit 5557d47fcf22a6f3adf327691158f2270e3d5094
+Author: Roland Mainz <roland.mainz@nrubsig.org>
+Date:   Fri Jan 14 04:59:05 2005 +0000
+
+    xc/nls/compose.dir
+    xc/nls/locale.alias
+    xc/nls/locale.dir
+    //bugs.freedesktop.org/show_bug.cgi?id=1830) attachment #1674 (https://bugs.freedesktop.org/attachment.cgi?id=1674): Adding support for the bs_BA (bs, bs_BA, bs_BA.iso88592, bs_BA.ISO-8859-2, bs_BA.ISO_8859-2, bs_BA.UTF-8) locale. Patch by Vedran Ljubovic <vljubovic@smartnet.ba>.
+
+commit 1fa3737f042f798fa11a9ff5b03f3b3ba3529824
+Author: Egbert Eich <eich-at-freedesktop-dot-org>
+Date:   Tue Jan 11 17:37:57 2005 +0000
+
+    'Normalize' locale names (ie. remove any '-' and '_' and convert to lower case after the <language>_<territory> part) before matching against locale.alias (Bugzilla #2262). This needs adequate testing that we don't accidentally introduce undesirable side effects.
+
+commit 642cd269f94a234aa470a1d43385bd42625d89a1
+Author: Egbert Eich <eich-at-freedesktop-dot-org>
+Date:   Tue Dec 14 08:59:20 2004 +0000
+
+    Removed #ifdef'ed out code together with the comment explaining why it was #ifdef'ed out.
+    Fixed typo.
+    Added comment to a changed that's been committed with one of the previous commits.
+
+commit a07ccae36e629741d2e48de7730114d30a975a41
+Author: Matthieu Herrb <matthieu.herrb@laas.fr>
+Date:   Sun Dec 12 08:42:50 2004 +0000
+
+    Fix missing XChangeProperty() prototype missing in synopsis section.
+
+commit c73adb1c8ad806c2f9f0ba32f4b449e7a871501c
+Author: Alexander Gottwald <ago at freedesktop dot org>
+Date:   Wed Dec 8 13:42:01 2004 +0000
+
+    Bugzilla #1980 (https://bugs.freedesktop.org/show_bug.cgi?id=1980) Handle XERRORDB only on WIN32 platform
+
+commit d5e7ab194103e22fd6c5094aaa107d90210bb600
+Author: Jim Gettys <jg@freedesktop.org>
+Date:   Thu Dec 2 16:18:16 2004 +0000
+
+    fix comment to indicate additional possible mode. i bug 1756 reported by Owen Taylor.
+
+commit 03940d7330cb1bbf93d49c650aefb19de457da7c
+Author: Alexander Gottwald <ago at freedesktop dot org>
+Date:   Wed Dec 1 13:06:55 2004 +0000
+
+    Bugzilla #1980, https://bugs.freedesktop.org/show_bug.cgi?id=1980 Make location of XErrorDB configurable
+
+commit 11a03ab908bfcfab8a3492684e8e9320e492d552
+Author: Alexander Gottwald <ago at freedesktop dot org>
+Date:   Wed Dec 1 12:42:17 2004 +0000
+
+    Bugzilla #1864, http://freedesktop.org/bugzilla/show_bug.cgi?id=1864 Initialize pointer to NULL to avoid freeing random memory
+
+commit f3d83ee153f42e8899b844377e6b842d93411e62
+Author: Alexander Gottwald <ago@freedesktop.org>
+Date:   Mon Nov 15 15:06:54 2004 +0000
+
+    Bufzilla #1802, http://freedesktop.org/bugzilla/show_bug.cgi?id=1802 Added mingw (Win32) port
+
+commit b798ea11911ac58a8e6e7d15a2a643b023859749
+Author: Alexander Gottwald <ago at freedesktop dot org>
+Date:   Mon Nov 15 13:29:56 2004 +0000
+
+    Bugzilla #1864, http://freedesktop.org/bugzilla/show_bug.cgi?id=1864 Initialize pointer to NULL to avoid freeing random memory
+
+commit 436108cd6c84053698e5ca629096f59b34f50c2a
+Author: Kristian Høgsberg <krh@redhat.com>
+Date:   Thu Nov 11 15:37:01 2004 +0000
+
+    Fix #1818
+
+commit bf2e6ef66ba55f90efa4a4ba8c8b6d3ec0d1531c
+Author: Roland Mainz <roland.mainz@nrubsig.org>
+Date:   Tue Nov 9 00:56:56 2004 +0000
+
+    xc/nls/compose.dir
+    xc/nls/locale.alias
+    xc/nls/locale.dir
+    //freedesktop.org/bugzilla/show_bug.cgi?id=1544): Adding support for the si_LK (si, sinhala, si_LK, si_LK.UTF-8) locale. Patch by Anuradha Ratnaweera <gnu.slash.linux@gmail.com>.
+
+commit 443890ceefbd6dafe68e30d103ec4f9d316ed655
+Author: Roland Mainz <roland.mainz@nrubsig.org>
+Date:   Fri Nov 5 00:58:49 2004 +0000
+
+    xc/nls/compose.dir
+    xc/nls/locale.alias
+    xc/nls/locale.dir
+    Adding some of the major indic locales (bn_IN.UTF-8, bn_IN.utf8, gu_IN.UTF-8, gu_IN.utf8, pa_IN.UTF-8, pa_IN.utf8) to X. Patch by Leon Ho <llch@redhat.com>.
+
+commit af7467ec734321f127b957921cce7792902b6794
+Author: Egbert Eich <eich-at-freedesktop-dot-org>
+Date:   Mon Oct 18 17:29:03 2004 +0000
+
+    Correcting font encodings for GB18030, GBK and BIG5-HKSCS. Adding nls support for those encodings (Bugzilla 1573, James Su).
+
+commit 1b900b59cb24fe8be3db0d434b04d462c0eeb206
+Author: Egbert Eich <eich-at-freedesktop-dot-xorg>
+Date:   Mon Oct 18 14:21:45 2004 +0000
+
+    Made handling of DevelDrivers for x86-64 more conformant to other platforms.
+    Compress all font encodings (Stefan Dirsch).
+    Fixed warnings.
+    Turn on forwarding XNSpotLocation event to XIM server in OffTheSpot and Root mode (bugzilla #1580, James Su).
+    Added another compose key combination for the Euro symbol (Stefan Dirsch).
+    Added support for UTF-8 in ja_JP, ko_KR and zh_TW locales (Mike Fabian).
+    Changed default encoding for ru from KOI8-R to ISO8859-5 (Mike Fabian). This is the encoding that is also used by glibc. We may break other libcs - lets see who complains.
+    Added explanation for DESTDIR to install to a different directory than /.
+    Added some early bailouts to atiprobe if PCI structure pointer is NULL to prevent sig11.
+    XV support doesn't depend on 2D acceleration any more. This patch removes this limitation from the NSC driver. This is a patch that I have committed to XFree86 a while ago but never ported over to X.Org. Matthieu Herrb contributed some build fixes.
+    Fixing SetDPMSTimers() so that DPMS*Time == 0 disables the appropriate timer. This takes advantage of the fact that TimerSet() with a timeout argument 0 behaves like TimerCanel().
+    Use /dev/xconsole (named pipe) or devpts for system logger (Werner Fink).
+    Create missing links for backward compatibility to XFree86 (Stefan Dirsch).
+    Changed comment to mention xorg.
+    Changed cursor for the 'kill' action from XC_draped_box to XC_Pirate. If you don't like it we can change it back (original author unkown).
+    Added 'pic' to the man page rendering command pipeline (Werner Fink).
+    Added missing return value (Stefan Dirsch, Roland Mainz)
+
+commit 1ba103c3cad2329db3a31f88d7798b913affc570
+Author: Eric Anholt <anholt@freebsd.org>
+Date:   Wed Oct 13 07:38:00 2004 +0000
+
+    Use attributes instead of pragmas for weak symbols on gcc 2.95 as well. Using pragmas may result in the symbols being undefined with big -O. (FreeBSD ports/69708, Masakazu HIGAKI <higamasa@dream.com>)
+
+commit d80237db627bf71ad5615ff4ba05e6ab436aa740
+Author: Søren Sandmann Pedersen <sandmann@daimi.au.dk>
+Date:   Fri Oct 8 22:57:56 2004 +0000
+
+    Fri Oct 8 18:53:11 2004 Soeren Sandmann <sandmann@redhat.com>
+    Move iso10646 last so the "fallback" fonts will actually be used if they are better matches.
+
+commit d1f76d17ecf418396627b1a58319f2b9b255548a
+Author: Markus Kuhn <Markus.Kuhn@cl.cam.ac.uk>
+Date:   Sun Sep 26 22:54:57 2004 +0000
+
+    bug fix for previous patch
+
+commit 48932d9b71d10e15812f47d5b842ab6aa8dac625
+Author: Markus Kuhn <Markus.Kuhn@cl.cam.ac.uk>
+Date:   Sun Sep 26 20:46:17 2004 +0000
+
+    The big keysym cleanup, to bring implementation in line with the recent revision of Appendix A of the protocol spec. (Markus Kuhn)
+
+commit 2e02a95dcc43dd3ec7bbaf4675ffb94f5074f543
+Author: Egbert Eich <eich@freedesktop.org>
+Date:   Wed Sep 15 09:05:22 2004 +0000
+
+    Unregistering events in XSelectInput() when unregistering IM filter callbacks may be a bad idea as others may be interested in this event. Removed the call to XSelectInput() altogether as we are in root window anyway (Lubos Lunak).
+    Fix size of a variable that gets assigned the value of SmartScheduleTime (long) to long. This should help to prevent smart scheduler lockup on 64 bit systems due to overruns (Andreas Schwab).
+
+commit 2d3afb68a104a80a21ee622b9abb9c95e83505d3
+Author: Egbert Eich <eich@freedesktop.org>
+Date:   Tue Aug 31 11:37:03 2004 +0000
+
+    Fixed some lockups in XIM code when the application is running with multi thread support. These lockups occur deep down in XFilterEvents() which itself locks when another Xlib function gets called that also locks. This fixes two instances by separating those Xlib functions into an internal (non-locking) call and a locking wrapper that is used as an external function. There may be several other such instances therefore another more general patch is eventually required (Bugzilla #1182).
+
+commit e689746c8d0e21e9011e8b91a3071d235d3a2a74
+Author: Kevin E Martin <kem@kem.org>
+Date:   Thu Aug 19 06:48:06 2004 +0000
+
+    Fix header file to #ifdef the XKB keysyms when they are used. This fixes the X test suite build failure.
+
+commit d558a53a6f57eecfcaadce5141fe3a08860defcb
+Author: Keith Packard <keithp@keithp.com>
+Date:   Sat Aug 14 07:12:36 2004 +0000
+
+    Use XLIB_SKIP_ARGB_VISUALS environment variable to disable all depth 32 visuals. Necessary to keep Flash from crashing.
+    Must call ValidateGC/ValidatePicture on "real" GC/Picture to ensure pCompositeClip is set correctly.
+    Need to take the composite clip from the "real" GC/Picture and turn it into the clientClip for the backing version.
+    Adjust pixmap screen origin to account for drawable->x/y Change debugging output a bit (disabled by default)
+
+commit 85c2d81f299ed3444658011b7d6fb0a7ab8a6f55
+Author: Alexander Gottwald <ago@freedesktop.org>
+Date:   Fri Aug 13 16:28:19 2004 +0000
+
+    Set most significant bit to be a one. (Bug #1024, Kensuke Matsuzaki)
+    Fix conversion from sjis and euc. (Bug #1024, Toshio Takabe)
+
+commit c4d56e4e288d4e48b84b021a61638f46e9a45e27
+Author: Adam Jackson <ajax@nwnk.net>
+Date:   Wed Aug 11 05:25:13 2004 +0000
+
+    Bug #372: Prevent a crash in XPolygonRegion when called with a bogus point count. Reported by Andreas Luik.
+
+commit 92487437173f600f208d825f65756d3ad14a4f7e
+Author: Kevin E Martin <kem@kem.org>
+Date:   Mon Aug 9 22:37:22 2004 +0000
+
+    Fix install problem on platforms not using xorg.cf/xfree86.cf (Bug #339, Harold L. Hunt II, Alexander Gottwald).
+    Fix crash when using X core font in zh_CN.UTF-8 locale (Bug #368, Yu Shao, David Dawes).
+    Fix glXMakeCurrent(Dpy, None, NULL) crash (Bug #719, Adam Jackson).
+    HP-PA build fix (Bug #828, Guy Martin, Paul Anderson).
+    Fix SDK build for GATOS and Wacom driver (Bug #829, Bryan Stine).
+    Fix attempt to read video ROM before enabling it (Bug #843, Ivan Kokshaysky, Mike A. Harris).
+    Fix detection of primary adapter (Bug #843, Ivan Kokshaysky, Mike A. Harris).
+    Clarify xset man page description of how to use the keyboard repeat rate settings (Bug #846, Mike A. Harris).
+    Fix problem where print-screen key would get remapped to sys-req in certain keymaps, which broke GNOME printscreen functionality (Bug #847, Owen Taylor).
+    Fix several render problems:
+    - MMIO mode support
+    - Hang on IGP chips
+    - VT switching hang
+    - 3D render corruption (Bug #922, Hui Yu).
+
+commit 55c2ee568e7d3903258286a13bdf96ce5348ffda
+Author: Matthieu Herrb <matthieu.herrb@laas.fr>
+Date:   Tue Jul 27 06:06:05 2004 +0000
+
+    - remove remaining AMOEBA references.
+    - remove unused file.
+
+commit 6e884b12911eedfb003e90a3829ce66f7fc9cf2d
+Author: Søren Sandmann Pedersen <sandmann@daimi.au.dk>
+Date:   Tue Jul 20 17:48:09 2004 +0000
+
+    Tue Jul 20 19:38:06 2004 Soeren Sandmann <sandmann@daimi.au.dk>
+    Set font_data->xlfd_data to NULL after XFree(). (#837, patch from Bastien Nocera).
+    Tue Jul 20 18:23:32 2004 Soeren Sandmann <sandmann@daimi.au.dk>
+    Use /dev/urandom on Linux.(#761).
+
+commit 6f0bc97aa4e6de5a4b001f40ac10795cfdf09fc1
+Author: Eric Anholt <anholt@freebsd.org>
+Date:   Fri May 28 23:26:44 2004 +0000
+
+    Forced commit to note repocopy from xc/lib/XThrStub, will be connected to the build after this.
+
+commit aa7010c43ae9f39fb84b5ff155f76117c9e527a0
+Author: Egbert Eich <eich@pdx.freedesktop.org>
+Date:   Mon May 24 19:02:11 2004 +0000
+
+    Improve 'uniqueness' of authorization cookie sent by client for XDM-AUTHORIZATION-1. Old 'uniquness' consisted of the PID of the client, a time stamp (in seconds) and a number obtained by starting to count down from 0xffff. When a client did an XOpenDisplay() then execv'ed a child and did XOpenDisplay() again within the same second, the cookie was identical to the previous one (as the PID did not change but the static 'count down' variable was reinitialized) and thus refused by the server.
+
+commit 720702da29769d80ad1254d92edbad5b30f8a8da
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Sat May 22 03:47:42 2004 +0000
+
+    Bugzilla #658: XStringToKeysym fails for Greek_IOTAdiaeresis (Fixes VSW5 testcase XStringToKeysym-7 failure)
+
+commit 3aed873292424b497d9a7dcee2975b95bf5ac966
+Author: Alan Coopersmith <alan.coopersmith@sun.com>
+Date:   Sat Apr 24 23:39:25 2004 +0000
+
+    XOpenDisplay should try tcp connection if local connections fail (aka Sun bug id #4624183).
+    Also includes fix from NetBSD Problem Report #25098 (Michael van Elst) (Xlib segfaults with IPv6 if compiled with HASXDMAUTH).
+    xc/config/cf/sunLib.tmpl
+    xc/lib/FS/Imakefile Add missing shared library dependencies for Solaris
+
+commit c6349f43193b74a3c09945f3093a871b0157ba47
+Author: Egbert Eich <eich@freedesktop.org>
+Date:   Fri Apr 23 18:42:09 2004 +0000
+
+    Merging XORG-CURRENT into trunk
+
+commit c3c4ddc682950a01b80825021f3e2503ab01ea7f
+Author: Kaleb Keithley <kaleb@freedesktop.org>
+Date:   Tue Nov 25 19:28:07 2003 +0000
+
+    Initial revision
+
+commit dc4268a7dadc8da0d561757a68461246728613d3
+Author: Kaleb Keithley <kaleb@freedesktop.org>
+Date:   Fri Nov 14 16:48:47 2003 +0000
+
+    Initial revision
+
+commit deae12c6b683898f5213992d561a59d4ea889cca
+Author: Kaleb Keithley <kaleb@freedesktop.org>
+Date:   Fri Nov 14 15:54:30 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..39e4bd9
--- /dev/null
@@ -0,0 +1,35 @@
+if XLIB_LOADABLE_I18N
+ORDER=src modules
+else
+ORDER=modules src
+endif
+# Order: nls before specs
+SUBDIRS=include $(ORDER) nls man specs
+
+ACLOCAL_AMFLAGS = -I m4
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = x11.pc x11-xcb.pc
+
+MAINTAINERCLEANFILES = ChangeLog INSTALL
+
+.PHONY: ChangeLog INSTALL
+
+INSTALL:
+       $(INSTALL_CMD)
+
+ChangeLog:
+       $(CHANGELOG_CMD)
+
+dist-hook: ChangeLog INSTALL
+
+if LINT
+# Check source code with tools like lint & sparse
+LINT_SUBDIRS=src # modules
+
+lint:
+       @for subdir in $(LINT_SUBDIRS) ; do \
+               echo "Making $@ in $$subdir"; \
+               (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) lint) ; \
+       done
+endif LINT
diff --git a/NEWS b/NEWS
new file mode 100644 (file)
index 0000000..e03d556
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,185 @@
+Version 1.1.2 - 2007-06-03
+
+* Security fixes:
+  * Fix CVE-2007-1667: Multiple integer overflows in the XGetPixel() and
+    XInitImage() functions.
+  * Bug #9279: Fixed a file descriptor leak.
+
+* Xlib/XCB: Ensure _XReadEvents reads at least one new event and blocks for
+  exactly one event.  Large performance improvement for XIfEvent and similar.
+
+* Hold XCB's Xlib lock even when only the user lock (XLockDisplay) is held.
+  An Xlib client can query Display state, such as with NextRequest, while it
+  holds only the Xlib user lock (between XLockDisplay and XUnlockDisplay), so
+  XCB requests in other threads should be blocked when the Xlib user lock is
+  held.  We acquire the lock even when XInitThreads was not called, so that
+  pure XCB code can use multiple threads even in an otherwise single-threaded
+  Xlib application.
+
+* Allow re-entrant Xlib calls from _XIOError.
+  Some libraries try to clean up X resources from atexit handlers, _fini, or
+  C++ destructors. To make these work, downgrade the Display lock to a user
+  lock (as in XLockDisplay) before calling exit(3).  This blocks Xlib calls
+  from threads other than the one calling exit(3) while still allowing the
+  exit handlers to call Xlib.
+
+* Xlib/XCB: Avoid re-crashing after _XIOError.
+
+* Xlib/XCB: Only remove pending_requests when there are provably no more responses.
+
+* For NetBSD, define XTHREADLIB and XTHREAD_CFLAGS.
+
+* Bug #7703: Fixed XSetSizeHints() et al wrt use of uninitialized data.
+  Now only those fields of the respective hint struct are set that
+  are actually valid in the input data.
+
+* Bug #10292: Fixed a memory leak related to XOpenDisplay() in the XCB code.
+
+* Bug #7713: Initialize all of the event's fields before sending it.
+
+* Bug #10562: Define _GNU_SOURCE on glibc systems.
+
+* Use unistd.h to get getresuid() and friends, now that we have _GNU_SOURCE
+  defined.
+
+* Switched function definitions from K&R to ANSI style.
+
+* Many constness fixes.
+
+* Fixed a few warnings.
+
+* Fix 64bit issues with reallocation.
+
+* Manpage fixes:
+  * Add man pages for XKB APIs.
+    (Volunteer needed to convert prototypes in man pages to ANSI C style...)
+  * Protect C comments and #defines in XKB man pages from being mangled by cpp
+  * Fix typo in nroff macro in XkbAddGeomOverlayKey.man
+  * Bug #9695: Fixed a few argument types in the XOpenIM manpage.
+  * Markup tweak for XOpenIM.
+  * Bug #9696: refer to XDefineCursor() instead of XDefineCusor().
+  * Bug #9697: Fixed documentation of XVisualInfo struct.  The "depth" member
+    was said to be unsigned int, but it's signed.
+
+* nls fixes:
+  * Update el_GR.UTF-8/Compose.pre to match changes in xkeyboard-config cvs.
+  * For nls/*.pre, allow people to comment lines by starting them with '##'.
+
+* Build system fixes:
+  * Add autogen.sh to EXTRA_DIST.
+  * Makefile.am: make ChangeLog hook safer
+  * Don't distribute the configure-generated XlibConf.h in tarballs.
+
+Version 1.1.1 - 2006-11-30
+
+The "xcompmgr is hard, let's go releasing" release
+
+* Fix Bug #9154 and friends, to unbreak xcompmgr:
+  Always process an event for _XReadEvents, even if an error occurs.
+  Previously, process_responses (in the wait_for_first_event case called
+  from _XReadEvents) considered any return from xcb_wait_for_event
+  sufficient to think it had processed an event. If xcb_wait_for_event
+  returned an error, and no more events occurred before process_responses
+  called xcb_poll_for_event, process_responses would try to return with
+  dpy->head NULL, and would fail an assertion for the _XReadEvents
+  postcondition. Now, process_responses continues using xcb_wait_for_event
+  until it gets an event.
+
+* Bug #9153: Fix access to freed memory.
+  The fix for bug #8622 introduced a smaller bug where _XReply would
+  read memory shortly after freeing it. This patch caches the needed
+  value in a stack-allocated variable before the heap-allocated memory
+  is freed.
+
+* libx11 doesn't use inputproto in public headers; don't require it in x11.pc.
+  Based on a Debian patch.
+
+* Debian bug #354315: Clarify return value in XGetWindowAttributes man page.
+  Patch by Debian user Ross Combs.
+
+
+Version 1.1 - 2006-11-23
+
+* Add note in man-page that XListFontsWithInfo is not thread-safe.  _XReply
+  drops the Display lock, so the value of dpy->request may change before
+  _XReply is called again.  Jamey Sharp discovered this by inspection a few
+  years ago.
+
+* Fix Bug #8622, by fixing the response processing order for threaded apps.
+  process_responses (the common code for _XReply, _XReadEvents, and
+  _XEventsQueued) now handles responses in order, by adding condition variables
+  to the list of outstanding requests in dpy->xcb->pending_requests, and
+  blocking on them when those requests should get processed, to allow _XReply
+  to process them; if actually called from _XReply, it returns when _XReply's
+  request should get processed.  _XReply broadcasts on its condition variable
+  after it has read its reply and re-acquired the display lock.
+
+* Don't hold the display lock around callbacks to the application. This avoids
+  recursive locking of the display lock (which triggers an XCB locking
+  assertion), particularly with emacs.
+
+* Add xcb-xlib dependency to x11.pc when built against XCB.
+
+* Allocate the right amount of memory for dpy->lock_fns.  Fixes a crash on
+  startup with gdk.
+
+
+Version 1.1 RC2 - 2006-11-02
+
+Benno Schulenberg:
+      nls: remove duplicate compose entries (bug #2286)
+      nls: remove shadowed compose entries (bug #2286)
+      nls (en_US): remove long compositions that override shorter (bug #2286)
+
+Caolan McNamara:
+      XKB geometry: fix leaks in GetKeyboardByName (bug #8099)
+
+David Nusinow:
+      Dynamically generate internal manpage section using __libmanpagesuffix__ so that it actually matches the section if you don't use 3X11
+
+Jamey Sharp:
+      Add correct Display locking to XKB functions.
+      XKB bugfix: SyncHandle must be called after UnlockDisplay, not before.
+      XCB: check for and handle I/O errors in _XGetXCBBuffer.
+
+Matthias Hopf:
+      Fix double open of compose file.
+
+
+Version 1.1 RC1 - 2006-10-06
+
+This release includes the Xlib/XCB work, which uses XCB as the Xlib transport
+layer, and allows a client to use both Xlib and XCB on the same connection.
+This allows clients to transition from Xlib to XCB incrementally.
+
+Clients which link only to libX11, and do not use XCB, should not notice any
+differences in this release.  Clients desiring XCB interoperability should
+additionally #include <X11/Xlib-xcb.h>, link to libX11-xcb, use
+XGetXCBConnection(dpy) to obtain the underlying XCB connection, and then use
+XCB functions directly on that connection.
+
+Note that while a client can issue requests and handle their replies or errors
+with either Xlib or XCB, only one can own and handle the event queue.  By
+default, Xlib must own the event queue, for compatibility with legacy Xlib
+clients.  Clients can use the function XSetEventQueueOwner immediately after
+XOpenDisplay to let XCB own the event queue instead.  Clients may not call
+this function after processing any responses, as this will potentially lose
+responses.
+
+We expect to have an RC2 release corresponding to the Xorg RC2 schedule, which
+should include additional internal architecture enhancements, but no
+user-visible changes.  1.0 final should match RC2.
+
+Other smaller changes in this release:
+* correct ChangeLog generation
+* support running lint and sparse
+* Autoconf 2.60
+* fix man page for XUrgencyHint
+* improve man pages for XGrabButton, XGrabKey, XGetWindowProperty
+* new locales: as_IN.UTF-8, kn_IN.UTF-8, ml_IN.UTF-8, or_IN.UTF-8,
+  te_IN.UTF-8, ur_IN.UTF-8
+* on systems with both UNIXCONN and LOCALCONN, try unix if local fails
+* fix sparse warnings
+* ansify static functions
+
+-- Josh Triplett <josh@freedesktop.org>, Jamey Sharp <jamey@minilop.net>
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..befb5a6
--- /dev/null
+++ b/README
@@ -0,0 +1,39 @@
+libX11 - Core X11 protocol client library
+
+Documentation for this library can be found in the included man pages,
+the xlib spec from the doc/xorg-docs module, also available at:
+
+       http://xorg.freedesktop.org/releases/X11R7.0/doc/PDF/xlib.pdf
+
+and the O'Reilly Xlib books, which they have made freely available online,
+though only for older versions of X11:
+
+ - X Series Volume 2: Xlib Reference Manual (1989, covers X11R3)
+       http://www.archive.org/details/xlibretmanver1102nyemiss
+
+ - X Series Volume 2: Xlib Reference Manual, 2nd Edition (1990, covers X11R4)
+       http://www.archive.org/details/xlibrefmanv115ed02nyemiss
+
+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/libX11
+
+        http://cgit.freedesktop.org/xorg/lib/libX11
+
+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..48a0c8a
--- /dev/null
@@ -0,0 +1,497 @@
+
+# Initialize Autoconf
+AC_PREREQ([2.60])
+AC_INIT([libX11], [1.5.0],
+        [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], [libX11])
+AC_CONFIG_SRCDIR([Makefile.am])
+AC_CONFIG_HEADERS([src/config.h include/X11/XlibConf.h])
+AC_CONFIG_MACRO_DIR([m4])
+AC_CANONICAL_BUILD
+AC_CANONICAL_HOST
+# Set common system defines for POSIX extensions, such as _GNU_SOURCE
+# Must be called before any macros that run the compiler (like AC_PROG_LIBTOOL)
+# to avoid autoconf errors.
+AC_USE_SYSTEM_EXTENSIONS
+
+# Initialize Automake
+AM_INIT_AUTOMAKE([foreign dist-bzip2])
+AM_MAINTAINER_MODE
+
+# Initialize libtool
+AC_PROG_LIBTOOL
+
+# Require xorg-macros minimum of 1.15 for fop minimum version
+m4_ifndef([XORG_MACROS_VERSION],
+          [m4_fatal([must install xorg-macros 1.15 or later before running autoconf/autogen])])
+XORG_MACROS_VERSION(1.15)
+XORG_DEFAULT_OPTIONS
+XORG_ENABLE_SPECS
+XORG_WITH_XMLTO(0.0.22)
+XORG_WITH_FOP([],[no])
+XORG_WITH_XSLTPROC
+XORG_CHECK_SGML_DOCTOOLS(1.10)
+XORG_PROG_RAWCPP
+XORG_WITH_PERL
+
+# Required when PKG_CHECK_MODULES called within an if statement
+PKG_PROG_PKG_CONFIG
+
+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])
+
+if test x"$CPPFLAGS_FOR_BUILD" = x; then
+       if test ! x"$cross_compiling" = xyes; then
+               CPPFLAGS_FOR_BUILD=${CPPFLAGS}
+       fi
+fi
+AC_SUBST(CPPFLAGS_FOR_BUILD)
+
+if test x"$CFLAGS_FOR_BUILD" = x; then
+       if test ! x"$cross_compiling" = xyes; then
+               CFLAGS_FOR_BUILD=${CFLAGS}
+       fi
+fi
+AC_SUBST(CFLAGS_FOR_BUILD)
+
+if test x"$LDFLAGS_FOR_BUILD" = x; then
+       if test ! x"$cross_compiling" = xyes; then
+               LDFLAGS_FOR_BUILD=${LDFLAGS}
+       fi
+fi
+AC_SUBST(LDFLAGS_FOR_BUILD)
+
+# Checks for pkg-config packages
+
+# Always required
+X11_REQUIRES='xproto >= 7.0.17 xextproto xtrans xcb >= 1.1.92'
+X11_EXTRA_DEPS="xcb >= 1.1.92"
+
+PKG_PROG_PKG_CONFIG()
+
+AC_SUBST(X11_EXTRA_DEPS)
+
+# Issue an error if xtrans.m4 was not found and XTRANS_CONNECTION_FLAGS macro
+# was not expanded, since libX11 with no transport types is rather useless.
+#
+# If you're seeing an error here, be sure you installed the lib/xtrans module
+# first and if it's not in the default location, that you set the ACLOCAL
+# environment variable to find it, such as:
+#      ACLOCAL="aclocal -I ${PREFIX}/share/aclocal"
+m4_pattern_forbid([^XTRANS_CONNECTION_FLAGS$])
+
+# Transport selection macro from xtrans.m4
+XTRANS_CONNECTION_FLAGS
+
+# Secure RPC detection macro from xtrans.m4
+XTRANS_SECURE_RPC_FLAGS
+
+# Preferred order to try transports for local connections
+AC_MSG_CHECKING([what order to try transports in for local connections])
+DEFAULT_LOCAL_TRANS=""
+case $host_os in
+       solaris*)
+               # On Solaris 2.6 through 9, named pipes (LOCAL_TRANS) were
+               # faster than Unix domain sockets, but on Solaris 10 & later,
+               # Unix domain sockets are faster now.
+               if test "$UNIXCONN" = "yes" ; then
+                       if test ! "x$DEFAULT_LOCAL_TRANS" = "x" ; then
+                               DEFAULT_LOCAL_TRANS="${DEFAULT_LOCAL_TRANS},"
+                       fi
+                       DEFAULT_LOCAL_TRANS="${DEFAULT_LOCAL_TRANS}UNIX_TRANS"
+               fi
+               if test "$LOCALCONN" = "yes" ; then
+                       if test ! "x$DEFAULT_LOCAL_TRANS" = "x" ; then
+                               DEFAULT_LOCAL_TRANS="${DEFAULT_LOCAL_TRANS},"
+                       fi
+                       DEFAULT_LOCAL_TRANS="${DEFAULT_LOCAL_TRANS}LOCAL_TRANS"
+               fi
+               if test "$TCPCONN" = "yes" ; then
+                       if test ! "x$DEFAULT_LOCAL_TRANS" = "x" ; then
+                               DEFAULT_LOCAL_TRANS="${DEFAULT_LOCAL_TRANS},"
+                       fi
+                       DEFAULT_LOCAL_TRANS="${DEFAULT_LOCAL_TRANS}TCP_TRANS"
+               fi
+               ;;
+       linux*)
+               # LOCAL_TRANS is used for abstract sockets.
+               if test "$UNIXCONN" = "yes" ; then
+                       if test ! "x$DEFAULT_LOCAL_TRANS" = "x" ; then
+                               DEFAULT_LOCAL_TRANS="${DEFAULT_LOCAL_TRANS},"
+                       fi
+                       DEFAULT_LOCAL_TRANS="${DEFAULT_LOCAL_TRANS}LOCAL_TRANS,UNIX_TRANS"
+               fi
+               if test "$TCPCONN" = "yes" ; then
+                       if test ! "x$DEFAULT_LOCAL_TRANS" = "x" ; then
+                               DEFAULT_LOCAL_TRANS="${DEFAULT_LOCAL_TRANS},"
+                       fi
+                       DEFAULT_LOCAL_TRANS="${DEFAULT_LOCAL_TRANS}TCP_TRANS"
+               fi
+               ;;
+       *)
+               if test "$LOCALCONN" = "yes" ; then
+                       if test ! "x$DEFAULT_LOCAL_TRANS" = "x" ; then
+                               DEFAULT_LOCAL_TRANS="${DEFAULT_LOCAL_TRANS},"
+                       fi
+                       DEFAULT_LOCAL_TRANS="${DEFAULT_LOCAL_TRANS}LOCAL_TRANS"
+               fi
+               if test "$UNIXCONN" = "yes" ; then
+                       if test ! "x$DEFAULT_LOCAL_TRANS" = "x" ; then
+                               DEFAULT_LOCAL_TRANS="${DEFAULT_LOCAL_TRANS},"
+                       fi
+                       DEFAULT_LOCAL_TRANS="${DEFAULT_LOCAL_TRANS}UNIX_TRANS"
+               fi
+               if test "$TCPCONN" = "yes" ; then
+                       if test ! "x$DEFAULT_LOCAL_TRANS" = "x" ; then
+                               DEFAULT_LOCAL_TRANS="${DEFAULT_LOCAL_TRANS},"
+                       fi
+                       DEFAULT_LOCAL_TRANS="${DEFAULT_LOCAL_TRANS}TCP_TRANS"
+               fi
+               ;;
+esac
+
+AC_ARG_WITH(local-transport-order,
+       AS_HELP_STRING([--with-local-transport-order=LIST], [preference sorted list of transport types to try for local connections]),
+       [LOCAL_TRANSPORT_LIST=$withval],
+       [LOCAL_TRANSPORT_LIST=$DEFAULT_LOCAL_TRANS])
+AC_DEFINE_UNQUOTED([LOCAL_TRANSPORT_LIST], [$LOCAL_TRANSPORT_LIST],
+   [preference sorted list of transport types to try for local connections])
+AC_MSG_RESULT([$LOCAL_TRANSPORT_LIST])
+
+# Check for dlopen
+AC_MSG_CHECKING([if run-time linking is supported])
+AC_SEARCH_LIBS(dlopen,[dl svld])
+if test "x$ac_cv_search_dlopen" = xno; then
+       AC_SEARCH_LIBS(shl_load,[dld])
+       if test "x$ac_cv_search_shl_load" != xno; then
+               AC_DEFINE(HAVE_SHL_LOAD,1,
+                         [Use shl_load to load shared libraries])
+               AC_CHECK_HEADERS([dl.h])
+       fi
+else
+       AC_DEFINE(HAVE_DLOPEN,1,[Use dlopen to load shared libraries])
+       AC_CHECK_HEADERS([dlfcn.h])
+fi
+if test x$ac_cv_header_dlcfn_h -o x$ac_cv_header_dl_h; then
+       HAVE_LOADABLE_MODULES=yes
+else
+       HAVE_LOADABLE_MODULES=no
+fi
+AC_MSG_RESULT($HAVE_LOADABLE_MODULES)
+
+AC_MSG_CHECKING([if loadable i18n module support should be enabled])
+AC_ARG_ENABLE(loadable-i18n,
+             AS_HELP_STRING([--enable-loadable-i18n],
+              [Controls loadable i18n module support]),
+              [XLIB_LOADABLE_I18N=$enableval],
+              [XLIB_LOADABLE_I18N="no"])
+if test x$XLIB_LOADABLE_I18N = xyes; then
+       if test x$HAVE_LOADABLE_MODULES = xno; then
+               AC_MSG_ERROR([Loadable module support is required to enable loadable i18n module support])
+       fi
+       AC_DEFINE(USE_DYNAMIC_LC,1,
+                 [Split some i18n functions into loadable modules])
+       AC_SUBST(I18N_MODULE_LIBS,'${top_builddir}/src/libX11.la')
+fi
+AC_MSG_RESULT($XLIB_LOADABLE_I18N)
+
+AM_CONDITIONAL(XLIB_LOADABLE_I18N, test x$XLIB_LOADABLE_I18N = xyes)
+
+AC_MSG_CHECKING([if loadable Xcursor library support should be enabled])
+AC_ARG_ENABLE(loadable-xcursor,
+             AS_HELP_STRING([--disable-loadable-xcursor],
+              [Controls loadable xcursor library support]),
+              [XLIB_LOADABLE_XCURSOR=$enableval],
+              [XLIB_LOADABLE_XCURSOR=$HAVE_LOADABLE_MODULES])
+if test x$XLIB_LOADABLE_XCURSOR = xyes; then
+       AC_DEFINE(USE_DYNAMIC_XCURSOR,1,
+                 [Use the X cursor library to load cursors])
+fi
+AC_MSG_RESULT($XLIB_LOADABLE_XCURSOR)
+
+# Checks for header files.
+AC_CHECK_HEADERS([sys/select.h])
+
+# Checks for typedefs, structures, and compiler characteristics.
+
+# Checks for library functions.
+AC_CHECK_FUNCS([strtol seteuid])
+# Used in lcFile.c (see also --enable-xlocaledir settings below)
+XLOCALEDIR_IS_SAFE="no"
+AC_CHECK_DECL([issetugid])
+AC_CHECK_FUNC([issetugid])
+if test "$ac_cv_have_decl_issetugid" = yes && test "$ac_cv_func_issetugid" = yes; then
+    XLOCALEDIR_IS_SAFE="yes"
+    AC_DEFINE(HASSETUGID,1,[Has issetugid() function])
+fi
+AC_CHECK_FUNC([getresuid], [XLOCALEDIR_IS_SAFE="yes"]
+       AC_DEFINE(HASGETRESUID,1,[Has getresuid() & getresgid() functions]))
+# Used in Font.c
+AC_CHECK_FUNC([shmat], AC_DEFINE(HAS_SHM,1,[Has shm*() functions]))
+
+# Checks for system services
+# AC_PATH_XTRA
+
+# arch specific things
+WCHAR32="1"
+case $host_os in
+  os2*) os2="true" ; WCHAR32="0" ;;
+  *) ;;
+esac
+AC_SUBST(WCHAR32)
+
+AM_CONDITIONAL(OS2, test x$os2 = xtrue)
+
+AC_ARG_WITH(launchd, AS_HELP_STRING([--with-launchd], [Build with support for Apple's launchd (default: auto)]), [LAUNCHD=$withval], [LAUNCHD=auto])
+if test "x$LAUNCHD" = xauto; then
+       unset LAUNCHD
+       AC_CHECK_PROG(LAUNCHD, [launchd], [yes], [no], [$PATH$PATH_SEPARATOR/sbin])
+fi
+
+if test "x$LAUNCHD" = xyes ; then
+       AC_DEFINE(HAVE_LAUNCHD, 1, [launchd support available])
+       AC_DEFINE(TRANS_REOPEN, 1, [launchd support available])
+fi
+
+AC_ARG_ENABLE(xthreads,
+              AS_HELP_STRING([--disable-xthreads],
+                [Disable Xlib support for Multithreading]),
+              [xthreads=$enableval],[xthreads=yes])
+
+AC_CHECK_LIB(c, getpwuid_r, [mtsafeapi="yes"], [mtsafeapi="no"])
+
+case x$xthreads in
+xyes)
+       AC_DEFINE(XTHREADS,1,[Whether libX11 is compiled with thread support])
+       if test x$mtsafeapi = xyes
+       then
+       AC_DEFINE(XUSE_MTSAFE_API,1,[Whether libX11 needs to use MT safe API's])
+       fi
+       ;;
+*)
+       ;;
+esac
+
+AC_CHECK_LIB(c, pthread_self, [thrstubs="no"], [thrstubs="yes"])
+AM_CONDITIONAL(THRSTUBS, test x$thrstubs = xyes)
+
+# XXX incomplete, please fill this in
+if test x$xthreads = xyes ; then
+    case $host_os in
+    linux*|gnu*|k*bsd*-gnu)
+        XTHREADLIB=-lpthread ;;
+    netbsd*)
+       XTHREAD_CFLAGS="-D_POSIX_THREAD_SAFE_FUNCTIONS"
+       XTHREADLIB="-lpthread" ;;
+    freebsd*)
+        XTHREAD_CFLAGS="-D_THREAD_SAFE"
+        XTHREADLIB="-pthread" ;;
+    dragonfly*|openbsd*)
+        XTHREADLIB="-pthread" ;;
+    solaris*)
+       XTHREAD_CFLAGS="-D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS" ;;
+    esac
+fi
+AC_SUBST(XTHREADLIB)
+AC_SUBST(XTHREAD_CFLAGS)
+
+AC_CHECK_FUNC(poll, [AC_DEFINE(USE_POLL, 1, [poll() function is available])], )
+
+#
+# Find keysymdef.h
+#
+AC_MSG_CHECKING([keysym definitions])
+KEYSYMDEFDIR=`$PKG_CONFIG --variable=includedir xproto`/X11
+FILES="keysymdef.h XF86keysym.h Sunkeysym.h DECkeysym.h HPkeysym.h"
+for i in $FILES; do
+    if test -f "$KEYSYMDEFDIR/$i"; then
+            KEYSYMDEFS="$KEYSYMDEFS $KEYSYMDEFDIR/$i"
+    elif test "x$i" = "xkeysymdef.h"; then
+           AC_MSG_ERROR([Cannot find keysymdef.h])
+    fi
+done
+AC_MSG_RESULT([$KEYSYMDEFS])
+AC_SUBST(KEYSYMDEFS)
+
+AM_CONDITIONAL(UDC, test xfalse = xtrue)
+
+AC_ARG_ENABLE(xcms,
+              AS_HELP_STRING([--disable-xcms],
+                [Disable Xlib support for CMS *EXPERIMENTAL*]),
+              [XCMS=$enableval],[XCMS=yes])
+AM_CONDITIONAL(XCMS, [test x$XCMS = xyes ])
+if test x"$XCMS" = "xyes"; then
+       AC_DEFINE(XCMS,1,[Include support for XCMS])
+fi
+
+AC_ARG_ENABLE(xlocale,
+              AS_HELP_STRING([--disable-xlocale],
+                [Disable Xlib locale implementation *EXPERIMENTAL*]),
+              [XLOCALE=$enableval],[XLOCALE=yes])
+
+AM_CONDITIONAL(XLOCALE, [ test x$XLOCALE = xyes ])
+if test x"$XLOCALE" = "xyes"; then
+       AC_DEFINE(XLOCALE,1,[support for X Locales])
+fi
+
+# This disables XLOCALEDIR.  Set it if you're using BuildLoadableXlibI18n,
+# don't have either issetugid() or getresuid(), and you need to protect
+# clients that are setgid or setuid to an id other than 0.
+AC_MSG_CHECKING([if XLOCALEDIR support should be enabled])
+AC_ARG_ENABLE(xlocaledir,
+             AS_HELP_STRING([--enable-xlocaledir],
+               [Enable XLOCALEDIR environment variable support]),
+             [ENABLE_XLOCALEDIR=$enableval],[ENABLE_XLOCALEDIR=$XLOCALEDIR_IS_SAFE])
+if test "x$ENABLE_XLOCALEDIR" = "xno"; then
+       AC_DEFINE(NO_XLOCALEDIR,1,[Disable XLOCALEDIR environment variable])
+fi
+AC_MSG_RESULT($ENABLE_XLOCALEDIR)
+
+AC_ARG_ENABLE(xf86bigfont,
+             AS_HELP_STRING([--disable-xf86bigfont],
+               [Disable XF86BigFont extension support]),
+             [XF86BIGFONT=$enableval],[XF86BIGFONT="yes"])
+if test "x$XF86BIGFONT" = "xyes"; then
+    PKG_CHECK_MODULES(BIGFONT, [xf86bigfontproto >= 1.2.0],
+         AC_DEFINE(XF86BIGFONT,1,[Enable XF86BIGFONT extension]),XF86BIGFONT="no")
+fi
+
+AC_ARG_ENABLE(xkb,
+              AS_HELP_STRING([--disable-xkb],
+                [Disable XKB support *EXPERIMENTAL*]),
+              [XKB=$enableval],[XKB=yes])
+
+AM_CONDITIONAL(XKB, [ test x$XKB = xyes ])
+if test x"$XKB" = "xyes"; then
+   XKBPROTO_REQUIRES="kbproto"
+   X11_REQUIRES="${X11_REQUIRES} kbproto inputproto"
+   AC_DEFINE(XKB,1,[Use XKB])
+else
+   XKBPROTO_REQUIRES=""
+fi
+AC_SUBST(XKBPROTO_REQUIRES)
+
+AC_FUNC_MMAP()
+composecache_default=$ac_cv_func_mmap_fixed_mapped
+AC_CHECK_FUNC(nl_langinfo, , [composecache_default=no])
+AC_ARG_ENABLE(composecache,
+              AS_HELP_STRING([--disable-composecache],
+                [Disable compose table cache support]),
+              [COMPOSECACHE=$enableval],[COMPOSECACHE=$composecache_default])
+if test x"$COMPOSECACHE" = "xyes"; then
+       AC_DEFINE(COMPOSECACHE,1,[Include compose table cache support])
+fi
+
+# Allow checking code with lint, sparse, etc.
+XORG_WITH_LINT
+XORG_LINT_LIBRARY([X11])
+
+X11_DATADIR="${datadir}/X11"
+AX_DEFINE_DIR(X11_DATADIR, X11_DATADIR, [Location of libX11 data])
+AC_SUBST(X11_DATADIR)
+
+X11_LIBDIR="${libdir}/X11"
+AX_DEFINE_DIR(X11_LIBDIR, X11_LIBDIR, [Location of libX11 library data])
+AC_SUBST(X11_LIBDIR)
+
+PKG_CHECK_MODULES(X11, [$X11_REQUIRES])
+X11_CFLAGS="$X11_CFLAGS $XTHREAD_CFLAGS"
+
+#
+# Yes, it would be nice to put the locale data in
+# /usr/share, but the locale stuff includes loadable
+# libraries which must be located in the same directory
+# as the other locale data, so for now, everything lives
+# in ${libdir}
+#
+
+X11_LOCALEDATADIR="${X11_DATADIR}/locale"
+AX_DEFINE_DIR(XLOCALEDATADIR, X11_LOCALEDATADIR, [Location of libX11 locale data])
+AC_SUBST(X11_LOCALEDATADIR)
+
+AC_ARG_WITH(locale-lib-dir,    AS_HELP_STRING([--with-locale-lib-dir=DIR],
+ [Directory where locale libraries files are installed (default: $libdir/X11/locale)]),
+                               [ X11_LOCALELIBDIR="$withval" ],
+                               [ X11_LOCALELIBDIR="${X11_LIBDIR}/locale" ])
+AX_DEFINE_DIR(XLOCALELIBDIR, X11_LOCALELIBDIR, [Location of libX11 locale libraries])
+AC_SUBST(X11_LOCALELIBDIR)
+
+X11_LOCALEDIR="${X11_LOCALEDATADIR}"
+AX_DEFINE_DIR(XLOCALEDIR, X11_LOCALEDIR, [Location of libX11 locale data])
+AC_SUBST(X11_LOCALEDIR)
+
+locales="\
+ am_ET.UTF-8  armscii-8   C           el_GR.UTF-8  en_US.UTF-8  fi_FI.UTF-8 \
+ georgian-academy         georgian-ps ibm-cp1133   iscii-dev    isiri-3342 \
+ iso8859-1    iso8859-10  iso8859-11  iso8859-13   iso8859-14   iso8859-15 \
+ iso8859-2    iso8859-3   iso8859-4   iso8859-5    iso8859-6    iso8859-7 \
+ iso8859-8    iso8859-9   iso8859-9e  ja           ja.JIS       ja_JP.UTF-8\
+ ja.S90       ja.SJIS     ja.U90      ko           koi8-c       koi8-r \
+ koi8-u       ko_KR.UTF-8 microsoft-cp1251         microsoft-cp1255 \
+ microsoft-cp1256         mulelao-1   nokhchi-1    pt_BR.UTF-8  ru_RU.UTF-8 \
+ tatar-cyr    th_TH       th_TH.UTF-8 tscii-0      vi_VN.tcvn   vi_VN.viscii \
+ zh_CN        zh_CN.gb18030           zh_CN.gbk    zh_CN.UTF-8  zh_HK.big5 \
+ zh_HK.big5hkscs          zh_HK.UTF-8 zh_TW        zh_TW.big5   zh_TW.UTF-8"
+AC_SUBST(locales)
+
+XKEYSYMDB="${X11_DATADIR}/XKeysymDB"
+AX_DEFINE_DIR(XKEYSYMDB, XKEYSYMDB, [Location of keysym database])
+
+XERRORDB="${X11_DATADIR}/XErrorDB"
+AX_DEFINE_DIR(XERRORDB, XERRORDB, [Location of error message database])
+
+XORG_CHECK_MALLOC_ZERO
+
+AC_CONFIG_FILES([Makefile
+               include/Makefile
+               man/Makefile
+               man/xkb/Makefile
+               src/Makefile
+               src/util/Makefile
+               src/xcms/Makefile
+               src/xlibi18n/Makefile
+               modules/Makefile
+               modules/im/Makefile
+               modules/im/ximcp/Makefile
+               modules/lc/Makefile
+               modules/lc/def/Makefile
+               modules/lc/gen/Makefile
+               modules/lc/Utf8/Makefile
+               modules/lc/xlocale/Makefile
+               modules/om/Makefile
+               modules/om/generic/Makefile
+               src/xkb/Makefile
+               nls/Makefile
+               specs/Makefile
+               specs/i18n/Makefile
+               specs/i18n/compose/Makefile
+               specs/i18n/framework/Makefile
+               specs/i18n/localedb/Makefile
+               specs/i18n/trans/Makefile
+               specs/libX11/Makefile
+               specs/XIM/Makefile
+               specs/XKB/Makefile
+               x11.pc
+               x11-xcb.pc])
+AC_OUTPUT
+
+echo ""
+echo "X11 will be built with the following settings:"
+echo " Loadable i18n module support:            "$XLIB_LOADABLE_I18N
+echo " Loadable xcursor library support:        "$XLIB_LOADABLE_XCURSOR
+echo " Threading support:                       "$xthreads
+echo " Use Threads safe API:                    "$mtsafeapi
+echo " Threads stubs in libX11:                 "$thrstubs
+echo " XCMS:                                    "$XCMS
+echo " Internationalization support:            "$XLOCALE
+echo " XF86BigFont support:                     "$XF86BIGFONT
+echo " XKB support:                             "$XKB
+echo " XLOCALEDIR environment variable support: "$ENABLE_XLOCALEDIR
+echo " Compose table cache enabled:             "$COMPOSECACHE
+echo " Functional specs building enabled:       "$build_specs
+echo ""
diff --git a/cpprules.in b/cpprules.in
new file mode 100644 (file)
index 0000000..e1296c6
--- /dev/null
@@ -0,0 +1,30 @@
+#                                                      -*- Makefile -*-
+# Rules for generating files using the C pre-processor
+# (Replaces CppFileTarget from Imake)
+
+SED = LC_CTYPE=C sed
+
+SUFFIXES += .pre
+
+WCHAR32_FLAGS = -DWCHAR32=@WCHAR32@
+
+CPP_FILES_FLAGS = $(WCHAR32_FLAGS)
+
+# Translate XCOMM into pound sign with sed, rather than passing -DXCOMM=XCOMM
+# to cpp, because that trick does not work on all ANSI C preprocessors.
+# Delete line numbers from the cpp output (-P is not portable, I guess).
+# Allow XCOMM to be preceded by whitespace and provide a means of generating
+# output lines with trailing backslashes.
+# Allow XHASH to always be substituted, even in cases where XCOMM isn't.
+
+CPP_SED_MAGIC = $(SED) -e '/^\#  *[0-9][0-9]*  *.*$$/d' \
+                       -e '/^\#line  *[0-9][0-9]*  *.*$$/d' \
+                       -e '/^[         ]*XCOMM$$/s/XCOMM/\#/' \
+                       -e '/^[         ]*XCOMM[^a-zA-Z0-9_]/s/XCOMM/\#/' \
+                       -e '/^[         ]*XHASH/s/XHASH/\#/' \
+                       -e 's,X11_LOCALEDATADIR,$(X11_LOCALEDATADIR),g' \
+                       -e '/\@\@$$/s/\@\@$$/\\/'
+
+.pre:
+       @$(MKDIR_P) $(@D)
+       $(AM_V_GEN)$(RAWCPP) $(RAWCPPFLAGS) $(CPP_FILES_FLAGS) < $< | $(CPP_SED_MAGIC) > $@
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..067546c
--- /dev/null
@@ -0,0 +1,19 @@
+x11includedir=${includedir}/X11
+x11include_HEADERS=\
+       X11/XKBlib.h \
+       X11/Xcms.h \
+       X11/Xlib.h \
+       X11/Xlibint.h \
+       X11/Xlocale.h \
+       X11/Xresource.h \
+       X11/Xutil.h \
+       X11/cursorfont.h \
+       X11/Xregion.h \
+       X11/ImUtil.h \
+       X11/Xlib-xcb.h
+
+nodist_x11include_HEADERS=\
+       X11/XlibConf.h
+
+EXTRA_DIST = \
+       X11/XlibConf.h.in
diff --git a/include/X11/ImUtil.h b/include/X11/ImUtil.h
new file mode 100644 (file)
index 0000000..ffdba1a
--- /dev/null
@@ -0,0 +1,30 @@
+
+#ifndef _X11_IMUTIL_H_
+#define _X11_IMUTIL_H_
+
+extern int
+_XGetScanlinePad(
+    Display *dpy,
+    int depth);
+
+extern int
+_XGetBitsPerPixel(
+ Display *dpy,
+ int depth);
+
+extern int
+_XSetImage(
+    XImage *srcimg,
+    register XImage *dstimg,
+    register int x,
+    register int y);
+
+extern int
+_XReverse_Bytes(
+    register unsigned char *bpt,
+    register int nb);
+extern void
+_XInitImageFuncPtrs(
+    register XImage *image);
+
+#endif /* _X11_IMUTIL_H_ */
diff --git a/include/X11/XKBlib.h b/include/X11/XKBlib.h
new file mode 100644 (file)
index 0000000..8f6c72c
--- /dev/null
@@ -0,0 +1,1149 @@
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+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 Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS 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 _X11_XKBLIB_H_
+#define _X11_XKBLIB_H_
+
+#include <X11/Xlib.h>
+#include <X11/extensions/XKBstr.h>
+
+typedef struct _XkbAnyEvent {
+       int             type;           /* XkbAnyEvent */
+       unsigned long   serial;         /* # of last req processed by server */
+       Bool            send_event;     /* is this from a SendEvent request? */
+       Display *       display;        /* Display the event was read from */
+       Time            time;           /* milliseconds */
+       int             xkb_type;       /* XKB event minor code */
+       unsigned int    device;         /* device ID */
+} XkbAnyEvent;
+
+typedef struct _XkbNewKeyboardNotify {
+       int             type;           /* XkbAnyEvent */
+       unsigned long   serial;         /* of last req processed by server */
+       Bool            send_event;     /* is this from a SendEvent request? */
+       Display *       display;        /* Display the event was read from */
+       Time            time;           /* milliseconds */
+       int             xkb_type;       /* XkbNewKeyboardNotify */
+       int             device;         /* device ID */
+       int             old_device;     /* device ID of previous keyboard */
+       int             min_key_code;   /* minimum key code */
+       int             max_key_code;   /* maximum key code */
+       int             old_min_key_code;/* min key code of previous kbd */
+       int             old_max_key_code;/* max key code of previous kbd */
+       unsigned int    changed;        /* changed aspects of the keyboard */
+       char            req_major;      /* major and minor opcode of req */
+       char            req_minor;      /* that caused change, if applicable */
+} XkbNewKeyboardNotifyEvent;
+
+typedef struct _XkbMapNotifyEvent {
+       int             type;           /* XkbAnyEvent */
+       unsigned long   serial;         /* of last req processed by server */
+       Bool            send_event;     /* is this from a SendEvent request */
+       Display *       display;        /* Display the event was read from */
+       Time            time;           /* milliseconds */
+       int             xkb_type;       /* XkbMapNotify */
+       int             device;         /* device ID */
+       unsigned int    changed;        /* fields which have been changed */
+       unsigned int    flags;          /* reserved */
+       int             first_type;     /* first changed key type */
+       int             num_types;      /* number of changed key types */
+       KeyCode         min_key_code;
+       KeyCode         max_key_code;
+       KeyCode         first_key_sym;
+       KeyCode         first_key_act;
+       KeyCode         first_key_behavior;
+       KeyCode         first_key_explicit;
+       KeyCode         first_modmap_key;
+       KeyCode         first_vmodmap_key;
+       int             num_key_syms;
+       int             num_key_acts;
+       int             num_key_behaviors;
+       int             num_key_explicit;
+       int             num_modmap_keys;
+       int             num_vmodmap_keys;
+       unsigned int    vmods;          /* mask of changed virtual mods */
+} XkbMapNotifyEvent;
+
+typedef struct _XkbStateNotifyEvent {
+       int             type;           /* XkbAnyEvent */
+       unsigned long   serial;         /* # of last req processed by server */
+       Bool            send_event;     /* is this from a SendEvent request? */
+       Display *       display;        /* Display the event was read from */
+       Time            time;           /* milliseconds */
+       int             xkb_type;       /* XkbStateNotify */
+       int             device;         /* device ID */
+       unsigned int    changed;        /* mask of changed state components */
+       int             group;          /* keyboard group */
+       int             base_group;     /* base keyboard group */
+       int             latched_group;  /* latched keyboard group */
+       int             locked_group;   /* locked keyboard group */
+       unsigned int    mods;           /* modifier state */
+       unsigned int    base_mods;      /* base modifier state */
+       unsigned int    latched_mods;   /* latched modifiers */
+       unsigned int    locked_mods;    /* locked modifiers */
+       int             compat_state;   /* compatibility state */
+       unsigned char   grab_mods;      /* mods used for grabs */
+       unsigned char   compat_grab_mods;/* grab mods for non-XKB clients */
+       unsigned char   lookup_mods;    /* mods sent to clients */
+       unsigned char   compat_lookup_mods; /* mods sent to non-XKB clients */
+       int             ptr_buttons;    /* pointer button state */
+       KeyCode         keycode;        /* keycode that caused the change */
+       char            event_type;     /* KeyPress or KeyRelease */
+       char            req_major;      /* Major opcode of request */
+       char            req_minor;      /* Minor opcode of request */
+} XkbStateNotifyEvent;
+
+typedef struct _XkbControlsNotify {
+       int             type;           /* XkbAnyEvent */
+       unsigned long   serial;         /* of last req processed by server */
+       Bool            send_event;     /* is this from a SendEvent request? */
+       Display *       display;        /* Display the event was read from */
+       Time            time;           /* milliseconds */
+       int             xkb_type;       /* XkbControlsNotify */
+       int             device;         /* device ID */
+       unsigned int    changed_ctrls;  /* controls with changed sub-values */
+       unsigned int    enabled_ctrls;  /* controls currently enabled */
+       unsigned int    enabled_ctrl_changes;/* controls just {en,dis}abled */
+       int             num_groups;     /* total groups on keyboard */
+       KeyCode         keycode;        /* key that caused change or 0 */
+       char            event_type;     /* type of event that caused change */
+       char            req_major;      /* if keycode==0, major and minor */
+       char            req_minor;      /* opcode of req that caused change */
+} XkbControlsNotifyEvent;
+
+typedef struct _XkbIndicatorNotify {
+       int             type;           /* XkbAnyEvent */
+       unsigned long   serial;         /* of last req processed by server */
+       Bool            send_event;     /* is this from a SendEvent request? */
+       Display *       display;        /* Display the event was read from */
+       Time            time;           /* milliseconds */
+       int             xkb_type;       /* XkbIndicatorNotify */
+       int             device;         /* device ID */
+       unsigned int    changed;        /* indicators with new state or map */
+       unsigned int    state;          /* current state of all indicators */
+} XkbIndicatorNotifyEvent;
+
+typedef struct _XkbNamesNotify {
+       int             type;           /* XkbAnyEvent */
+       unsigned long   serial;         /* of last req processed by server */
+       Bool            send_event;     /* is this from a SendEvent request? */
+       Display *       display;        /* Display the event was read from */
+       Time            time;           /* milliseconds */
+       int             xkb_type;       /* XkbNamesNotify */
+       int             device;         /* device ID */
+       unsigned int    changed;        /* names that have changed */
+       int             first_type;     /* first key type with new name */
+       int             num_types;      /* number of key types with new names */
+       int             first_lvl;      /* first key type new new level names */
+       int             num_lvls;       /* # of key types w/new level names */
+       int             num_aliases;    /* total number of key aliases*/
+       int             num_radio_groups;/* total number of radio groups */
+       unsigned int    changed_vmods;  /* virtual modifiers with new names */
+       unsigned int    changed_groups; /* groups with new names */
+       unsigned int    changed_indicators;/* indicators with new names */
+       int             first_key;      /* first key with new name */
+       int             num_keys;       /* number of keys with new names */
+} XkbNamesNotifyEvent;
+
+typedef struct _XkbCompatMapNotify {
+       int             type;           /* XkbAnyEvent */
+       unsigned long   serial;         /* of last req processed by server */
+       Bool            send_event;     /* is this from a SendEvent request? */
+       Display *       display;        /* Display the event was read from */
+       Time            time;           /* milliseconds */
+       int             xkb_type;       /* XkbCompatMapNotify */
+       int             device;         /* device ID */
+       unsigned int    changed_groups; /* groups with new compat maps */
+       int             first_si;       /* first new symbol interp */
+       int             num_si;         /* number of new symbol interps */
+       int             num_total_si;   /* total # of symbol interps */
+} XkbCompatMapNotifyEvent;
+
+typedef struct _XkbBellNotify {
+       int             type;           /* XkbAnyEvent */
+       unsigned long   serial;         /* of last req processed by server */
+       Bool            send_event;     /* is this from a SendEvent request? */
+       Display *       display;        /* Display the event was read from */
+       Time            time;           /* milliseconds */
+       int             xkb_type;       /* XkbBellNotify */
+       int             device;         /* device ID */
+       int             percent;        /* requested volume as a % of maximum */
+       int             pitch;          /* requested pitch in Hz */
+       int             duration;       /* requested duration in useconds */
+       int             bell_class;     /* (input extension) feedback class */
+       int             bell_id;        /* (input extension) ID of feedback */
+       Atom            name;           /* "name" of requested bell */
+       Window          window;         /* window associated with event */
+       Bool            event_only;     /* "event only" requested */
+} XkbBellNotifyEvent;
+
+typedef struct _XkbActionMessage {
+       int             type;           /* XkbAnyEvent */
+       unsigned long   serial;         /* of last req processed by server */
+       Bool            send_event;     /* is this from a SendEvent request? */
+       Display *       display;        /* Display the event was read from */
+       Time            time;           /* milliseconds */
+       int             xkb_type;       /* XkbActionMessage */
+       int             device;         /* device ID */
+       KeyCode         keycode;        /* key that generated the event */
+       Bool            press;          /* true if act caused by key press */
+       Bool            key_event_follows;/* true if key event also generated */
+       int             group;          /* effective group */
+       unsigned int    mods;           /* effective mods */
+       char            message[XkbActionMessageLength+1];
+                                       /* message -- leave space for NUL */
+} XkbActionMessageEvent;
+
+typedef struct _XkbAccessXNotify {
+       int             type;           /* XkbAnyEvent */
+       unsigned long   serial;         /* of last req processed by server */
+       Bool            send_event;     /* is this from a SendEvent request? */
+       Display *       display;        /* Display the event was read from */
+       Time            time;           /* milliseconds */
+       int             xkb_type;       /* XkbAccessXNotify */
+       int             device;         /* device ID */
+       int             detail;         /* XkbAXN_* */
+       int             keycode;        /* key of event */
+       int             sk_delay;       /* current slow keys delay */
+       int             debounce_delay; /* current debounce delay */
+} XkbAccessXNotifyEvent;
+
+typedef struct _XkbExtensionDeviceNotify {
+       int             type;           /* XkbAnyEvent */
+       unsigned long   serial;         /* of last req processed by server */
+       Bool            send_event;     /* is this from a SendEvent request? */
+       Display *       display;        /* Display the event was read from */
+       Time            time;           /* milliseconds */
+       int             xkb_type;       /* XkbExtensionDeviceNotify */
+       int             device;         /* device ID */
+       unsigned int    reason;         /* reason for the event */
+       unsigned int    supported;      /* mask of supported features */
+       unsigned int    unsupported;    /* mask of unsupported features */
+                                       /* that some app tried to use */
+       int             first_btn;      /* first button that changed */
+       int             num_btns;       /* range of buttons changed */
+       unsigned int    leds_defined;   /* indicators with names or maps */
+       unsigned int    led_state;      /* current state of the indicators */
+       int             led_class;      /* feedback class for led changes */
+       int             led_id;         /* feedback id for led changes */
+} XkbExtensionDeviceNotifyEvent;
+
+typedef union _XkbEvent {
+       int                             type;
+       XkbAnyEvent                     any;
+       XkbNewKeyboardNotifyEvent       new_kbd;
+       XkbMapNotifyEvent               map;
+       XkbStateNotifyEvent             state;
+       XkbControlsNotifyEvent          ctrls;
+       XkbIndicatorNotifyEvent         indicators;
+       XkbNamesNotifyEvent             names;
+       XkbCompatMapNotifyEvent         compat;
+       XkbBellNotifyEvent              bell;
+       XkbActionMessageEvent           message;
+       XkbAccessXNotifyEvent           accessx;
+       XkbExtensionDeviceNotifyEvent   device;
+       XEvent                          core;
+} XkbEvent;
+
+typedef struct _XkbKbdDpyState XkbKbdDpyStateRec,*XkbKbdDpyStatePtr;
+
+       /* XkbOpenDisplay error codes */
+#define        XkbOD_Success           0
+#define        XkbOD_BadLibraryVersion 1
+#define        XkbOD_ConnectionRefused 2
+#define        XkbOD_NonXkbServer      3
+#define        XkbOD_BadServerVersion  4
+
+       /* Values for XlibFlags */
+#define        XkbLC_ForceLatin1Lookup         (1<<0)
+#define        XkbLC_ConsumeLookupMods         (1<<1)
+#define        XkbLC_AlwaysConsumeShiftAndLock (1<<2)
+#define        XkbLC_IgnoreNewKeyboards        (1<<3)
+#define        XkbLC_ControlFallback           (1<<4)
+#define        XkbLC_ConsumeKeysOnComposeFail  (1<<29)
+#define        XkbLC_ComposeLED                (1<<30)
+#define        XkbLC_BeepOnComposeFail         (1<<31)
+
+#define        XkbLC_AllComposeControls        (0xc0000000)
+#define        XkbLC_AllControls               (0xc000001f)
+
+_XFUNCPROTOBEGIN
+
+extern Bool    XkbIgnoreExtension(
+       Bool                    /* ignore */
+);
+
+extern Display *XkbOpenDisplay(
+       char *                  /* name */,
+       int *                   /* ev_rtrn */,
+       int *                   /* err_rtrn */,
+       int *                   /* major_rtrn */,
+       int *                   /* minor_rtrn */,
+       int *                   /* reason */
+);
+
+extern Bool    XkbQueryExtension(
+       Display *               /* dpy */,
+       int *                   /* opcodeReturn */,
+       int *                   /* eventBaseReturn */,
+       int *                   /* errorBaseReturn */,
+       int *                   /* majorRtrn */,
+       int *                   /* minorRtrn */
+);
+
+extern Bool    XkbUseExtension(
+       Display *               /* dpy */,
+       int *                   /* major_rtrn */,
+       int *                   /* minor_rtrn */
+);
+
+extern Bool    XkbLibraryVersion(
+       int *                   /* libMajorRtrn */,
+       int *                   /* libMinorRtrn */
+);
+
+extern unsigned int    XkbSetXlibControls(
+       Display*                /* dpy */,
+       unsigned int            /* affect */,
+       unsigned int            /* values */
+);
+
+extern unsigned int    XkbGetXlibControls(
+       Display*                /* dpy */
+);
+
+extern unsigned int    XkbXlibControlsImplemented(void);
+
+typedef        Atom    (*XkbInternAtomFunc)(
+       Display *               /* dpy */,
+       _Xconst char *          /* name */,
+       Bool                    /* only_if_exists */
+);
+
+typedef char * (*XkbGetAtomNameFunc)(
+       Display *               /* dpy */,
+       Atom                    /* atom */
+);
+
+extern void            XkbSetAtomFuncs(
+       XkbInternAtomFunc       /* getAtom */,
+       XkbGetAtomNameFunc      /* getName */
+);
+
+extern KeySym XkbKeycodeToKeysym(
+               Display *       /* dpy */,
+#if NeedWidePrototypes
+                unsigned int   /* kc */,
+#else
+                KeyCode        /* kc */,
+#endif
+                int            /* group */,
+                int            /* level */
+);
+
+extern unsigned int    XkbKeysymToModifiers(
+    Display *                  /* dpy */,
+    KeySym                     /* ks */
+);
+
+extern Bool            XkbLookupKeySym(
+    Display *                  /* dpy */,
+    KeyCode                    /* keycode */,
+    unsigned int               /* modifiers */,
+    unsigned int *             /* modifiers_return */,
+    KeySym *                   /* keysym_return */
+);
+
+extern int             XkbLookupKeyBinding(
+    Display *                  /* dpy */,
+    KeySym                     /* sym_rtrn */,
+    unsigned int               /* mods */,
+    char *                     /* buffer */,
+    int                        /* nbytes */,
+    int *                      /* extra_rtrn */
+);
+
+extern Bool            XkbTranslateKeyCode(
+    XkbDescPtr                 /* xkb */,
+    KeyCode                    /* keycode */,
+    unsigned int               /* modifiers */,
+    unsigned int *             /* modifiers_return */,
+    KeySym *                   /* keysym_return */
+);
+
+extern int             XkbTranslateKeySym(
+    Display *                  /* dpy */,
+    register KeySym *          /* sym_return */,
+    unsigned int               /* modifiers */,
+    char *                     /* buffer */,
+    int                        /* nbytes */,
+    int *                      /* extra_rtrn */
+);
+
+extern Bool    XkbSetAutoRepeatRate(
+       Display *               /* dpy */,
+       unsigned int            /* deviceSpec */,
+       unsigned int            /* delay */,
+       unsigned int            /* interval */
+);
+
+extern Bool    XkbGetAutoRepeatRate(
+       Display *               /* dpy */,
+       unsigned int            /* deviceSpec */,
+       unsigned int *          /* delayRtrn */,
+       unsigned int *          /* intervalRtrn */
+);
+
+extern Bool    XkbChangeEnabledControls(
+       Display *               /* dpy */,
+       unsigned int            /* deviceSpec */,
+       unsigned int            /* affect */,
+       unsigned int            /* values */
+);
+
+extern Bool    XkbDeviceBell(
+       Display *               /* dpy */,
+       Window                  /* win */,
+       int                     /* deviceSpec */,
+       int                     /* bellClass */,
+       int                     /* bellID */,
+       int                     /* percent */,
+       Atom                    /* name */
+);
+
+extern Bool    XkbForceDeviceBell(
+       Display *               /* dpy */,
+       int                     /* deviceSpec */,
+       int                     /* bellClass */,
+       int                     /* bellID */,
+       int                     /* percent */
+);
+
+extern Bool    XkbDeviceBellEvent(
+       Display *               /* dpy */,
+       Window                  /* win */,
+       int                     /* deviceSpec */,
+       int                     /* bellClass */,
+       int                     /* bellID */,
+       int                     /* percent */,
+       Atom                    /* name */
+);
+
+extern Bool    XkbBell(
+       Display *               /* dpy */,
+       Window                  /* win */,
+       int                     /* percent */,
+       Atom                    /* name */
+);
+
+extern Bool    XkbForceBell(
+       Display *               /* dpy */,
+       int                     /* percent */
+);
+
+extern Bool    XkbBellEvent(
+       Display *               /* dpy */,
+       Window                  /* win */,
+       int                     /* percent */,
+       Atom                    /* name */
+);
+
+extern Bool    XkbSelectEvents(
+       Display *               /* dpy */,
+       unsigned int            /* deviceID */,
+       unsigned int            /* affect */,
+       unsigned int            /* values */
+);
+
+extern Bool    XkbSelectEventDetails(
+       Display *               /* dpy */,
+       unsigned int            /* deviceID */,
+       unsigned int            /* eventType */,
+       unsigned long           /* affect */,
+       unsigned long           /* details */
+);
+
+extern void    XkbNoteMapChanges(
+    XkbMapChangesPtr           /* old */,
+    XkbMapNotifyEvent  *       /* new */,
+    unsigned int               /* wanted */
+);
+
+extern void    XkbNoteNameChanges(
+    XkbNameChangesPtr          /* old */,
+    XkbNamesNotifyEvent        *       /* new */,
+    unsigned int               /* wanted */
+);
+
+extern Status  XkbGetIndicatorState(
+       Display *               /* dpy */,
+       unsigned int            /* deviceSpec */,
+       unsigned int *          /* pStateRtrn */
+);
+
+extern Status  XkbGetDeviceIndicatorState(
+       Display *               /* dpy */,
+       unsigned int            /* deviceSpec */,
+       unsigned int            /* ledClass */,
+       unsigned int            /* ledID */,
+       unsigned int *          /* pStateRtrn */
+);
+
+extern Status   XkbGetIndicatorMap(
+       Display *               /* dpy */,
+       unsigned long           /* which */,
+       XkbDescPtr              /* desc */
+);
+
+extern Bool     XkbSetIndicatorMap(
+       Display *               /* dpy */,
+       unsigned long           /* which */,
+       XkbDescPtr              /* desc */
+);
+
+#define        XkbNoteIndicatorMapChanges(o,n,w) \
+                               ((o)->map_changes|=((n)->map_changes&(w)))
+#define        XkbNoteIndicatorStateChanges(o,n,w)\
+                               ((o)->state_changes|=((n)->state_changes&(w)))
+#define        XkbGetIndicatorMapChanges(d,x,c) \
+                               (XkbGetIndicatorMap((d),(c)->map_changes,x))
+#define        XkbChangeIndicatorMaps(d,x,c) \
+                               (XkbSetIndicatorMap((d),(c)->map_changes,x))
+
+extern Bool    XkbGetNamedIndicator(
+       Display *               /* dpy */,
+       Atom                    /* name */,
+       int *                   /* pNdxRtrn */,
+       Bool *                  /* pStateRtrn */,
+       XkbIndicatorMapPtr      /* pMapRtrn */,
+       Bool *                  /* pRealRtrn */
+);
+
+extern Bool    XkbGetNamedDeviceIndicator(
+       Display *               /* dpy */,
+       unsigned int            /* deviceSpec */,
+       unsigned int            /* ledClass */,
+       unsigned int            /* ledID */,
+       Atom                    /* name */,
+       int *                   /* pNdxRtrn */,
+       Bool *                  /* pStateRtrn */,
+       XkbIndicatorMapPtr      /* pMapRtrn */,
+       Bool *                  /* pRealRtrn */
+);
+
+extern Bool    XkbSetNamedIndicator(
+       Display *               /* dpy */,
+       Atom                    /* name */,
+       Bool                    /* changeState */,
+       Bool                    /* state */,
+       Bool                    /* createNewMap */,
+       XkbIndicatorMapPtr      /* pMap */
+);
+
+extern Bool    XkbSetNamedDeviceIndicator(
+       Display *               /* dpy */,
+       unsigned int            /* deviceSpec */,
+       unsigned int            /* ledClass */,
+       unsigned int            /* ledID */,
+       Atom                    /* name */,
+       Bool                    /* changeState */,
+       Bool                    /* state */,
+       Bool                    /* createNewMap */,
+       XkbIndicatorMapPtr      /* pMap */
+);
+
+extern Bool    XkbLockModifiers(
+       Display *               /* dpy */,
+       unsigned int            /* deviceSpec */,
+       unsigned int            /* affect */,
+       unsigned int            /* values */
+);
+
+extern Bool    XkbLatchModifiers(
+       Display *               /* dpy */,
+       unsigned int            /* deviceSpec */,
+       unsigned int            /* affect */,
+       unsigned int            /* values */
+);
+
+extern Bool    XkbLockGroup(
+       Display *               /* dpy */,
+       unsigned int            /* deviceSpec */,
+       unsigned int            /* group */
+);
+
+extern Bool    XkbLatchGroup(
+       Display *               /* dpy */,
+       unsigned int            /* deviceSpec */,
+       unsigned int            /* group */
+);
+
+extern Bool    XkbSetServerInternalMods(
+       Display *               /* dpy */,
+       unsigned int            /* deviceSpec */,
+       unsigned int            /* affectReal */,
+       unsigned int            /* realValues */,
+       unsigned int            /* affectVirtual */,
+       unsigned int            /* virtualValues */
+);
+
+extern Bool    XkbSetIgnoreLockMods(
+       Display *               /* dpy */,
+       unsigned int            /* deviceSpec */,
+       unsigned int            /* affectReal */,
+       unsigned int            /* realValues */,
+       unsigned int            /* affectVirtual */,
+       unsigned int            /* virtualValues */
+);
+
+
+extern Bool    XkbVirtualModsToReal(
+       XkbDescPtr              /* xkb */,
+       unsigned int            /* virtual_mask */,
+       unsigned int *          /* mask_rtrn */
+);
+
+extern Bool    XkbComputeEffectiveMap(
+       XkbDescPtr              /* xkb */,
+       XkbKeyTypePtr           /* type */,
+       unsigned char *         /* map_rtrn */
+);
+
+extern Status XkbInitCanonicalKeyTypes(
+    XkbDescPtr                 /* xkb */,
+    unsigned int               /* which */,
+    int                                /* keypadVMod */
+);
+
+extern XkbDescPtr XkbAllocKeyboard(
+       void
+);
+
+extern void    XkbFreeKeyboard(
+       XkbDescPtr              /* xkb */,
+       unsigned int            /* which */,
+       Bool                    /* freeDesc */
+);
+
+extern Status XkbAllocClientMap(
+       XkbDescPtr              /* xkb */,
+       unsigned int            /* which */,
+       unsigned int            /* nTypes */
+);
+
+extern Status XkbAllocServerMap(
+       XkbDescPtr              /* xkb */,
+       unsigned int            /* which */,
+       unsigned int            /* nActions */
+);
+
+extern void    XkbFreeClientMap(
+    XkbDescPtr                 /* xkb */,
+    unsigned int               /* what */,
+    Bool                       /* freeMap */
+);
+
+extern void    XkbFreeServerMap(
+    XkbDescPtr                 /* xkb */,
+    unsigned int               /* what */,
+    Bool                       /* freeMap */
+);
+
+extern XkbKeyTypePtr   XkbAddKeyType(
+    XkbDescPtr                 /* xkb */,
+    Atom                       /* name */,
+    int                                /* map_count */,
+    Bool                       /* want_preserve */,
+    int                                /* num_lvls */
+);
+
+extern Status XkbAllocIndicatorMaps(
+       XkbDescPtr              /* xkb */
+);
+
+extern void XkbFreeIndicatorMaps(
+    XkbDescPtr                 /* xkb */
+);
+
+extern XkbDescPtr XkbGetMap(
+       Display *               /* dpy */,
+       unsigned int            /* which */,
+       unsigned int            /* deviceSpec */
+);
+
+extern Status  XkbGetUpdatedMap(
+       Display *               /* dpy */,
+       unsigned int            /* which */,
+       XkbDescPtr              /* desc */
+);
+
+extern Status  XkbGetMapChanges(
+    Display *                  /* dpy */,
+    XkbDescPtr                 /* xkb */,
+    XkbMapChangesPtr           /* changes */
+);
+
+
+extern Status  XkbRefreshKeyboardMapping(
+    XkbMapNotifyEvent *                /* event */
+);
+
+extern Status  XkbGetKeyTypes(
+    Display *                  /* dpy */,
+    unsigned int               /* first */,
+    unsigned int               /* num */,
+    XkbDescPtr                 /* xkb */
+);
+
+extern Status  XkbGetKeySyms(
+    Display *                  /* dpy */,
+    unsigned int               /* first */,
+    unsigned int               /* num */,
+    XkbDescPtr                 /* xkb */
+);
+
+extern Status  XkbGetKeyActions(
+    Display *                  /* dpy */,
+    unsigned int               /* first */,
+    unsigned int               /* num */,
+    XkbDescPtr                 /* xkb */
+);
+
+extern Status  XkbGetKeyBehaviors(
+       Display *               /* dpy */,
+       unsigned int            /* firstKey */,
+       unsigned int            /* nKeys */,
+       XkbDescPtr              /* desc */
+);
+
+extern Status  XkbGetVirtualMods(
+       Display *               /* dpy */,
+       unsigned int            /* which */,
+       XkbDescPtr              /* desc */
+);
+
+extern Status  XkbGetKeyExplicitComponents(
+       Display *               /* dpy */,
+       unsigned int            /* firstKey */,
+       unsigned int            /* nKeys */,
+       XkbDescPtr              /* desc */
+);
+
+extern Status  XkbGetKeyModifierMap(
+       Display *               /* dpy */,
+       unsigned int            /* firstKey */,
+       unsigned int            /* nKeys */,
+       XkbDescPtr              /* desc */
+);
+
+extern Status  XkbGetKeyVirtualModMap(
+       Display *               /* dpy */,
+       unsigned int            /* first */,
+       unsigned int            /* num */,
+       XkbDescPtr              /* xkb */
+);
+
+extern Status  XkbAllocControls(
+       XkbDescPtr              /* xkb */,
+       unsigned int            /* which*/
+);
+
+extern void    XkbFreeControls(
+       XkbDescPtr              /* xkb */,
+       unsigned int            /* which */,
+       Bool                    /* freeMap */
+);
+
+extern Status  XkbGetControls(
+       Display *               /* dpy */,
+       unsigned long           /* which */,
+       XkbDescPtr              /* desc */
+);
+
+extern Bool    XkbSetControls(
+       Display *               /* dpy */,
+       unsigned long           /* which */,
+       XkbDescPtr              /* desc */
+);
+
+extern void    XkbNoteControlsChanges(
+    XkbControlsChangesPtr      /* old */,
+    XkbControlsNotifyEvent *   /* new */,
+    unsigned int               /* wanted */
+);
+
+#define        XkbGetControlsChanges(d,x,c)    XkbGetControls(d,(c)->changed_ctrls,x)
+#define        XkbChangeControls(d,x,c)        XkbSetControls(d,(c)->changed_ctrls,x)
+
+extern Status  XkbAllocCompatMap(
+    XkbDescPtr                 /* xkb */,
+    unsigned int               /* which */,
+    unsigned int               /* nInterpret */
+);
+
+extern void    XkbFreeCompatMap(
+    XkbDescPtr                 /* xkb */,
+    unsigned int               /* which */,
+    Bool                       /* freeMap */
+);
+
+extern Status XkbGetCompatMap(
+       Display *               /* dpy */,
+       unsigned int            /* which */,
+       XkbDescPtr              /* xkb */
+);
+
+extern Bool XkbSetCompatMap(
+       Display *               /* dpy */,
+       unsigned int            /* which */,
+       XkbDescPtr              /* xkb */,
+       Bool                    /* updateActions */
+);
+
+extern XkbSymInterpretPtr XkbAddSymInterpret(
+       XkbDescPtr              /* xkb */,
+       XkbSymInterpretPtr      /* si */,
+       Bool                    /* updateMap */,
+       XkbChangesPtr           /* changes */
+);
+
+extern Status XkbAllocNames(
+       XkbDescPtr              /* xkb */,
+       unsigned int            /* which */,
+       int                     /* nTotalRG */,
+       int                     /* nTotalAliases */
+);
+
+extern Status  XkbGetNames(
+       Display *               /* dpy */,
+       unsigned int            /* which */,
+       XkbDescPtr              /* desc */
+);
+
+extern Bool    XkbSetNames(
+       Display *               /* dpy */,
+       unsigned int            /* which */,
+       unsigned int            /* firstType */,
+       unsigned int            /* nTypes */,
+       XkbDescPtr              /* desc */
+);
+
+extern Bool    XkbChangeNames(
+       Display *               /* dpy */,
+       XkbDescPtr              /* xkb */,
+       XkbNameChangesPtr       /* changes */
+);
+
+extern void XkbFreeNames(
+       XkbDescPtr              /* xkb */,
+       unsigned int            /* which */,
+       Bool                    /* freeMap */
+);
+
+
+extern Status  XkbGetState(
+       Display *               /* dpy */,
+       unsigned int            /* deviceSpec */,
+       XkbStatePtr             /* rtrnState */
+);
+
+extern Bool    XkbSetMap(
+       Display *               /* dpy */,
+       unsigned int            /* which */,
+       XkbDescPtr              /* desc */
+);
+
+extern Bool    XkbChangeMap(
+       Display*                /* dpy */,
+       XkbDescPtr              /* desc */,
+       XkbMapChangesPtr        /* changes */
+);
+
+extern Bool    XkbSetDetectableAutoRepeat(
+       Display *               /* dpy */,
+       Bool                    /* detectable */,
+       Bool *                  /* supported */
+);
+
+extern Bool    XkbGetDetectableAutoRepeat(
+       Display *               /* dpy */,
+       Bool *                  /* supported */
+);
+
+extern Bool    XkbSetAutoResetControls(
+    Display *                  /* dpy */,
+    unsigned int               /* changes */,
+    unsigned int *             /* auto_ctrls */,
+    unsigned int *             /* auto_values */
+);
+
+extern Bool    XkbGetAutoResetControls(
+    Display *                  /* dpy */,
+    unsigned int *             /* auto_ctrls */,
+    unsigned int *             /* auto_ctrl_values */
+);
+
+extern Bool    XkbSetPerClientControls(
+    Display *                  /* dpy */,
+    unsigned int               /* change */,
+    unsigned int *             /* values */
+);
+
+extern Bool    XkbGetPerClientControls(
+    Display *                  /* dpy */,
+    unsigned int *             /* ctrls */
+);
+
+extern Status XkbCopyKeyType(
+    XkbKeyTypePtr      /* from */,
+    XkbKeyTypePtr      /* into */
+);
+
+extern Status XkbCopyKeyTypes(
+    XkbKeyTypePtr      /* from */,
+    XkbKeyTypePtr      /* into */,
+    int                        /* num_types */
+);
+
+extern Status  XkbResizeKeyType(
+    XkbDescPtr         /* xkb */,
+    int                        /* type_ndx */,
+    int                        /* map_count */,
+    Bool               /* want_preserve */,
+    int                        /* new_num_lvls */
+);
+
+extern KeySym *XkbResizeKeySyms(
+       XkbDescPtr              /* desc */,
+       int                     /* forKey */,
+       int                     /* symsNeeded */
+);
+
+extern XkbAction *XkbResizeKeyActions(
+       XkbDescPtr              /* desc */,
+       int                     /* forKey */,
+       int                     /* actsNeeded */
+);
+
+extern Status XkbChangeTypesOfKey(
+       XkbDescPtr              /* xkb */,
+       int                     /* key */,
+       int                     /* num_groups */,
+       unsigned int            /* groups */,
+       int *                   /* newTypes */,
+       XkbMapChangesPtr        /* pChanges */
+);
+
+extern  Status   XkbChangeKeycodeRange(
+       XkbDescPtr              /* xkb */,
+       int                     /* minKC */,
+       int                     /* maxKC */,
+       XkbChangesPtr           /* changes */
+);
+
+/***====================================================================***/
+
+extern XkbComponentListPtr     XkbListComponents(
+       Display *               /* dpy */,
+       unsigned int            /* deviceSpec */,
+       XkbComponentNamesPtr    /* ptrns */,
+       int *                   /* max_inout */
+);
+
+extern void XkbFreeComponentList(
+       XkbComponentListPtr     /* list */
+);
+
+extern XkbDescPtr XkbGetKeyboard(
+       Display *               /* dpy */,
+       unsigned int            /* which */,
+       unsigned int            /* deviceSpec */
+);
+
+extern XkbDescPtr XkbGetKeyboardByName(
+    Display *                  /* dpy */,
+    unsigned int               /* deviceSpec */,
+    XkbComponentNamesPtr       /* names */,
+    unsigned int               /* want */,
+    unsigned int               /* need */,
+    Bool                       /* load */
+);
+
+/***====================================================================***/
+
+extern int     XkbKeyTypesForCoreSymbols(      /* returns # of groups */
+    XkbDescPtr /* xkb */,                      /* keyboard device */
+    int                /* map_width */,                /* width of core KeySym array */
+    KeySym *   /* core_syms */,                /* always mapWidth symbols */
+    unsigned int       /* protected */,        /* explicit key types */
+    int *      /* types_inout */,              /* always four type indices */
+    KeySym *   /* xkb_syms_rtrn */             /* must have enough space */
+);
+
+extern Bool    XkbApplyCompatMapToKey( /* False only on error */
+    XkbDescPtr         /* xkb */,              /* keymap to be edited */
+    KeyCode            /* key */,              /* key to be updated */
+    XkbChangesPtr      /* changes */           /* resulting changes to map */
+);
+
+extern Bool    XkbUpdateMapFromCore( /* False only on error */
+    XkbDescPtr         /* xkb */,              /* XKB keyboard to be edited */
+    KeyCode            /* first_key */,        /* first changed key */
+    int                        /* num_keys */,         /* number of changed keys */
+    int                        /* map_width */,        /* width of core keymap */
+    KeySym *           /* core_keysyms */,     /* symbols from core keymap */
+    XkbChangesPtr      /* changes */           /* resulting changes */
+);
+
+/***====================================================================***/
+
+extern XkbDeviceLedInfoPtr     XkbAddDeviceLedInfo(
+       XkbDeviceInfoPtr        /* devi */,
+       unsigned int            /* ledClass */,
+       unsigned int            /* ledId */
+);
+
+extern Status                  XkbResizeDeviceButtonActions(
+       XkbDeviceInfoPtr        /* devi */,
+       unsigned int            /* newTotal */
+);
+
+extern XkbDeviceInfoPtr        XkbAllocDeviceInfo(
+       unsigned int            /* deviceSpec */,
+       unsigned int            /* nButtons */,
+       unsigned int            /* szLeds */
+);
+
+extern void XkbFreeDeviceInfo(
+       XkbDeviceInfoPtr        /* devi */,
+       unsigned int            /* which */,
+       Bool                    /* freeDevI */
+);
+
+extern void    XkbNoteDeviceChanges(
+    XkbDeviceChangesPtr                        /* old */,
+    XkbExtensionDeviceNotifyEvent *    /* new */,
+    unsigned int                       /* wanted */
+);
+
+extern XkbDeviceInfoPtr XkbGetDeviceInfo(
+       Display *               /* dpy */,
+       unsigned int            /* which */,
+       unsigned int            /* deviceSpec */,
+       unsigned int            /* ledClass */,
+       unsigned int            /* ledID */
+);
+
+extern Status  XkbGetDeviceInfoChanges(
+       Display *               /* dpy */,
+       XkbDeviceInfoPtr        /* devi */,
+       XkbDeviceChangesPtr     /* changes */
+);
+
+extern Status  XkbGetDeviceButtonActions(
+       Display *               /* dpy */,
+       XkbDeviceInfoPtr        /* devi */,
+       Bool                    /* all */,
+       unsigned int            /* first */,
+       unsigned int            /* nBtns */
+);
+
+extern Status  XkbGetDeviceLedInfo(
+       Display *               /* dpy */,
+       XkbDeviceInfoPtr        /* devi */,
+       unsigned int            /* ledClass (class, XIDflt, XIAll) */,
+       unsigned int            /* ledId (id, XIDflt, XIAll) */,
+       unsigned int            /* which (XkbXI_Indicator{Names,Map}Mask */
+);
+
+extern Bool    XkbSetDeviceInfo(
+       Display *               /* dpy */,
+       unsigned int            /* which */,
+       XkbDeviceInfoPtr        /* devi */
+);
+
+extern Bool    XkbChangeDeviceInfo(
+       Display*                /* dpy */,
+       XkbDeviceInfoPtr        /* desc */,
+       XkbDeviceChangesPtr     /* changes */
+);
+
+extern  Bool XkbSetDeviceLedInfo(
+       Display *               /* dpy */,
+       XkbDeviceInfoPtr        /* devi */,
+       unsigned int            /* ledClass */,
+       unsigned int            /* ledID */,
+       unsigned int            /* which */
+);
+
+extern Bool XkbSetDeviceButtonActions(
+       Display *               /* dpy */,
+       XkbDeviceInfoPtr        /* devi */,
+       unsigned int            /* first */,
+       unsigned int            /* nBtns */
+);
+
+/***====================================================================***/
+
+extern char    XkbToControl(
+       char            /* c */
+);
+
+/***====================================================================***/
+
+extern Bool XkbSetDebuggingFlags(
+    Display *          /* dpy */,
+    unsigned int       /* mask */,
+    unsigned int       /* flags */,
+    char *             /* msg */,
+    unsigned int       /* ctrls_mask */,
+    unsigned int       /* ctrls */,
+    unsigned int *     /* rtrn_flags */,
+    unsigned int *     /* rtrn_ctrls */
+);
+
+extern Bool XkbApplyVirtualModChanges(
+   XkbDescPtr          /* xkb */,
+   unsigned int                /* changed */,
+   XkbChangesPtr       /* changes */
+);
+
+extern Bool XkbUpdateActionVirtualMods(
+       XkbDescPtr              /* xkb */,
+       XkbAction *             /* act */,
+       unsigned int            /* changed */
+);
+
+extern void XkbUpdateKeyTypeVirtualMods(
+       XkbDescPtr              /* xkb */,
+       XkbKeyTypePtr           /* type */,
+       unsigned int            /* changed */,
+       XkbChangesPtr           /* changes */
+);
+
+_XFUNCPROTOEND
+
+#endif /* _X11_XKBLIB_H_ */
diff --git a/include/X11/Xcms.h b/include/X11/Xcms.h
new file mode 100644 (file)
index 0000000..8151fd1
--- /dev/null
@@ -0,0 +1,803 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     DESCRIPTION
+ *             Public include file for X Color Management System
+ */
+#ifndef _X11_XCMS_H_
+#define _X11_XCMS_H_
+
+#include <X11/Xlib.h>
+
+    /*
+     * XCMS Status Values
+     */
+#define XcmsFailure                    0
+#define XcmsSuccess                    1
+#define XcmsSuccessWithCompression     2
+
+    /*
+     * Color Space Format ID's
+     *    Color Space ID's are of XcmsColorFormat type.
+     *
+     *    bit 31
+     *     0 == Device-Independent
+     *     1 == Device-Dependent
+     *
+     *    bit 30:
+     *     0 == Registered with X Consortium
+     *     1 == Unregistered
+     */
+#define XcmsUndefinedFormat    (XcmsColorFormat)0x00000000
+#define XcmsCIEXYZFormat       (XcmsColorFormat)0x00000001
+#define XcmsCIEuvYFormat       (XcmsColorFormat)0x00000002
+#define XcmsCIExyYFormat       (XcmsColorFormat)0x00000003
+#define XcmsCIELabFormat       (XcmsColorFormat)0x00000004
+#define XcmsCIELuvFormat       (XcmsColorFormat)0x00000005
+#define XcmsTekHVCFormat       (XcmsColorFormat)0x00000006
+#define XcmsRGBFormat          (XcmsColorFormat)0x80000000
+#define XcmsRGBiFormat         (XcmsColorFormat)0x80000001
+
+    /*
+     * State of XcmsPerScrnInfo
+     */
+#define XcmsInitNone           0x00    /* no initialization attempted */
+#define XcmsInitSuccess                0x01    /* initialization successful */
+#define XcmsInitFailure                0xff    /* failure, use defaults */
+
+#define DisplayOfCCC(ccc)              ((ccc)->dpy)
+#define ScreenNumberOfCCC(ccc)         ((ccc)->screenNumber)
+#define VisualOfCCC(ccc)               ((ccc)->visual)
+#define ClientWhitePointOfCCC(ccc)     (&(ccc)->clientWhitePt)
+#define ScreenWhitePointOfCCC(ccc)     (&(ccc)->pPerScrnInfo->screenWhitePt)
+#define FunctionSetOfCCC(ccc)          ((ccc)->pPerScrnInfo->functionSet)
+
+typedef unsigned long XcmsColorFormat; /* Color Space Format ID */
+
+typedef double XcmsFloat;
+
+    /*
+     * Device RGB
+     */
+typedef struct {
+    unsigned short red;                /* scaled from 0x0000 to 0xffff */
+    unsigned short green;      /* scaled from 0x0000 to 0xffff */
+    unsigned short blue;       /* scaled from 0x0000 to 0xffff */
+} XcmsRGB;
+
+    /*
+     * RGB Intensity
+     */
+typedef struct {
+    XcmsFloat red;     /* 0.0 - 1.0 */
+    XcmsFloat green;   /* 0.0 - 1.0 */
+    XcmsFloat blue;    /* 0.0 - 1.0 */
+} XcmsRGBi;
+
+    /*
+     * CIE XYZ
+     */
+typedef struct {
+    XcmsFloat X;
+    XcmsFloat Y;
+    XcmsFloat Z;
+} XcmsCIEXYZ;
+
+    /*
+     * CIE u'v'Y
+     */
+typedef struct {
+    XcmsFloat u_prime;         /* 0.0 - 1.0 */
+    XcmsFloat v_prime;         /* 0.0 - 1.0 */
+    XcmsFloat Y;               /* 0.0 - 1.0 */
+} XcmsCIEuvY;
+
+    /*
+     * CIE xyY
+     */
+typedef struct {
+    XcmsFloat x;               /* 0.0 - 1.0 */
+    XcmsFloat y;               /* 0.0 - 1.0 */
+    XcmsFloat Y;               /* 0.0 - 1.0 */
+} XcmsCIExyY;
+
+    /*
+     * CIE L*a*b*
+     */
+typedef struct {
+    XcmsFloat L_star;          /* 0.0 - 100.0 */
+    XcmsFloat a_star;
+    XcmsFloat b_star;
+} XcmsCIELab;
+
+    /*
+     * CIE L*u*v*
+     */
+typedef struct {
+    XcmsFloat L_star;          /* 0.0 - 100.0 */
+    XcmsFloat u_star;
+    XcmsFloat v_star;
+} XcmsCIELuv;
+
+    /*
+     * TekHVC
+     */
+typedef struct {
+    XcmsFloat H;               /* 0.0 - 360.0 */
+    XcmsFloat V;               /* 0.0 - 100.0 */
+    XcmsFloat C;               /* 0.0 - 100.0 */
+} XcmsTekHVC;
+
+    /*
+     * PAD
+     */
+typedef struct {
+    XcmsFloat pad0;
+    XcmsFloat pad1;
+    XcmsFloat pad2;
+    XcmsFloat pad3;
+} XcmsPad;
+
+
+    /*
+     * XCMS Color Structure
+     */
+typedef struct {
+    union {
+       XcmsRGB RGB;
+       XcmsRGBi RGBi;
+       XcmsCIEXYZ CIEXYZ;
+       XcmsCIEuvY CIEuvY;
+       XcmsCIExyY CIExyY;
+       XcmsCIELab CIELab;
+       XcmsCIELuv CIELuv;
+       XcmsTekHVC TekHVC;
+       XcmsPad Pad;
+    } spec;                    /* the color specification      */
+    unsigned long pixel;       /* pixel value (as needed)      */
+    XcmsColorFormat    format;         /* the specification format     */
+} XcmsColor;
+
+
+    /*
+     * XCMS Per Screen related data
+     */
+
+typedef struct _XcmsPerScrnInfo {
+    XcmsColor  screenWhitePt;  /* Screen White point */
+    XPointer   functionSet;    /* pointer to Screen Color Characterization */
+                               /*      Function Set structure          */
+    XPointer   screenData;     /* pointer to corresponding Screen Color*/
+                               /*      Characterization Data           */
+    unsigned char state;   /* XcmsInitNone, XcmsInitSuccess, XcmsInitFailure */
+    char       pad[3];
+} XcmsPerScrnInfo;
+
+typedef struct _XcmsCCC *XcmsCCC;
+
+typedef Status (*XcmsCompressionProc)(         /* Gamut Compression Proc */
+    XcmsCCC            /* ccc */,
+    XcmsColor*         /* colors_in_out */,
+    unsigned int       /* ncolors */,
+    unsigned int       /* index */,
+    Bool*              /* compression_flags_return */
+);
+
+typedef Status (*XcmsWhiteAdjustProc)(         /* White Point Adjust Proc */
+    XcmsCCC            /* ccc */,
+    XcmsColor*         /* initial_white_point*/,
+    XcmsColor*         /* target_white_point*/,
+    XcmsColorFormat    /* target_format */,
+    XcmsColor*         /* colors_in_out */,
+    unsigned int       /* ncolors */,
+    Bool*              /* compression_flags_return */
+);
+
+    /*
+     * XCMS Color Conversion Context
+     */
+typedef struct _XcmsCCC {
+    Display    *dpy;                   /* X Display */
+    int                screenNumber;           /* X screen number */
+    Visual     *visual;                /* X Visual */
+    XcmsColor  clientWhitePt;          /* Client White Point */
+    XcmsCompressionProc        gamutCompProc;  /* Gamut Compression Function */
+    XPointer   gamutCompClientData;    /* Gamut Comp Func Client Data */
+    XcmsWhiteAdjustProc        whitePtAdjProc; /* White Point Adjustment Function */
+    XPointer   whitePtAdjClientData;   /* White Pt Adj Func Client Data */
+    XcmsPerScrnInfo *pPerScrnInfo;     /* pointer to per screen information */
+                                       /*  associated with the above display */
+                                       /*  screenNumber */
+} XcmsCCCRec;
+
+typedef Status (*XcmsScreenInitProc)(  /* Screen Initialization Proc */
+    Display*           /* dpy */,
+    int                        /* screen_number */,
+    XcmsPerScrnInfo*   /* screen_info */
+);
+
+typedef void (*XcmsScreenFreeProc)(
+    XPointer           /* screenData */
+);
+
+    /*
+     * Function List Pointer -- pointer to an array of function pointers.
+     *    The end of list is indicated by a NULL pointer.
+     */
+/*
+ * XXX:  The use of the XcmsConversionProc type is broken.  The
+ *       device-independent colour conversion code uses it as:
+
+typedef Status (*XcmsConversionProc)(XcmsCCC, XcmsColor *, XcmsColor *,
+                                    unsigned int);
+
+ *       while the device-dependent code uses it as:
+
+typedef Status (*XcmsConversionProc)(XcmsCCC, XcmsColor *, unsigned int,
+                                    Bool *);
+
+ *       Until this is reworked, it's probably best to leave it unprotoized.
+ *       The code works regardless.
+ */
+typedef Status (*XcmsDDConversionProc)( /* using device-dependent version */
+    XcmsCCC             /* ccc */,
+    XcmsColor*          /* pcolors_in_out */,
+    unsigned int        /* ncolors */,
+    Bool*               /* pCompressed */
+    );
+
+typedef Status (*XcmsDIConversionProc)( /* using device-independent version */
+    XcmsCCC             /* ccc */,
+    XcmsColor*          /* white_point */,
+    XcmsColor*          /* pcolors_in_out */,
+    unsigned int        /* ncolors */
+    );
+
+typedef XcmsDIConversionProc XcmsConversionProc;
+typedef XcmsConversionProc *XcmsFuncListPtr;
+
+typedef int (*XcmsParseStringProc)(    /* Color String Parsing Proc */
+    char*              /* color_string */,
+    XcmsColor*         /* color_return */
+);
+
+    /*
+     * Color Space -- per Color Space related data (Device-Independent
+     *    or Device-Dependent)
+     */
+typedef struct _XcmsColorSpace {
+    const char *prefix;                /* Prefix of string format.             */
+    XcmsColorFormat id;                /* Format ID number.                    */
+    XcmsParseStringProc parseString;
+                               /* String format parsing function       */
+    XcmsFuncListPtr to_CIEXYZ; /* Pointer to an array of function      */
+                               /*   pointers such that when the        */
+                               /*   functions are executed in sequence */
+                               /*   will convert a XcmsColor structure */
+                               /*   from this color space to CIEXYZ    */
+                               /*   space.                             */
+    XcmsFuncListPtr from_CIEXYZ;/* Pointer to an array of function     */
+                               /*   pointers such that when the        */
+                               /*   functions are executed in sequence */
+                               /*   will convert a XcmsColor structure */
+                               /*   from CIEXYZ space to this color    */
+                               /*   space.                             */
+    int inverse_flag;          /* If 1, indicates that for 0 <= i < n  */
+                               /*   where n is the number of function  */
+                               /*   pointers in the lists to_CIEXYZ    */
+                               /*   and from_CIEXYZ; for each function */
+                               /*   to_CIEXYZ[i] its inverse function  */
+                               /*   is from_CIEXYZ[n - i].             */
+
+} XcmsColorSpace;
+
+    /*
+     * Screen Color Characterization Function Set -- per device class
+     *    color space conversion functions.
+     */
+typedef struct _XcmsFunctionSet {
+    XcmsColorSpace **DDColorSpaces;
+                               /* Pointer to an array of pointers to   */
+                               /*   Device-DEPENDENT color spaces      */
+                               /*   understood by this SCCFuncSet.     */
+    XcmsScreenInitProc screenInitProc;
+                               /* Screen initialization function that  */
+                               /*   reads Screen Color Characterization*/
+                               /*   Data off properties on the screen's*/
+                               /*   root window.                       */
+    XcmsScreenFreeProc screenFreeProc;
+                               /* Function that frees the SCCData      */
+                               /*   structures.                        */
+} XcmsFunctionSet;
+
+_XFUNCPROTOBEGIN
+
+extern Status XcmsAddColorSpace (
+    XcmsColorSpace*    /* pColorSpace */
+);
+
+extern Status XcmsAddFunctionSet (
+    XcmsFunctionSet*   /* functionSet */
+);
+
+extern Status XcmsAllocColor (
+    Display*           /* dpy */,
+    Colormap           /* colormap */,
+    XcmsColor*         /* color_in_out */,
+    XcmsColorFormat            /* result_format */
+);
+
+extern Status XcmsAllocNamedColor (
+    Display*           /* dpy */,
+    Colormap           /* colormap */,
+    _Xconst char*      /* color_string */,
+    XcmsColor*         /* color_scrn_return */,
+    XcmsColor*         /* color_exact_return */,
+    XcmsColorFormat            /* result_format */
+);
+
+extern XcmsCCC XcmsCCCOfColormap (
+    Display*           /* dpy */,
+    Colormap           /* colormap */
+);
+
+extern Status XcmsCIELabClipab(
+    XcmsCCC            /* ccc */,
+    XcmsColor*         /* colors_in_out */,
+    unsigned int       /* ncolors */,
+    unsigned int       /* index */,
+    Bool*              /* compression_flags_return */
+);
+
+extern Status XcmsCIELabClipL(
+    XcmsCCC            /* ccc */,
+    XcmsColor*         /* colors_in_out */,
+    unsigned int       /* ncolors */,
+    unsigned int       /* index */,
+    Bool*              /* compression_flags_return */
+);
+
+extern Status XcmsCIELabClipLab(
+    XcmsCCC            /* ccc */,
+    XcmsColor*         /* colors_in_out */,
+    unsigned int       /* ncolors */,
+    unsigned int       /* index */,
+    Bool*              /* compression_flags_return */
+);
+
+extern Status XcmsCIELabQueryMaxC (
+    XcmsCCC            /* ccc */,
+    XcmsFloat          /* hue_angle */,
+    XcmsFloat          /* L_star */,
+    XcmsColor*         /* color_return */
+);
+
+extern Status XcmsCIELabQueryMaxL (
+    XcmsCCC            /* ccc */,
+    XcmsFloat          /* hue_angle */,
+    XcmsFloat          /* chroma */,
+    XcmsColor*         /* color_return */
+);
+
+extern Status XcmsCIELabQueryMaxLC (
+    XcmsCCC            /* ccc */,
+    XcmsFloat          /* hue_angle */,
+    XcmsColor*         /* color_return */
+);
+
+extern Status XcmsCIELabQueryMinL (
+    XcmsCCC            /* ccc */,
+    XcmsFloat          /* hue_angle */,
+    XcmsFloat          /* chroma */,
+    XcmsColor*         /* color_return */
+);
+
+extern Status XcmsCIELabToCIEXYZ (
+    XcmsCCC            /* ccc */,
+    XcmsColor*         /* white_point */,
+    XcmsColor*         /* colors */,
+    unsigned int       /* ncolors */
+);
+
+extern Status XcmsCIELabWhiteShiftColors(
+    XcmsCCC            /* ccc */,
+    XcmsColor*         /* initial_white_point*/,
+    XcmsColor*         /* target_white_point*/,
+    XcmsColorFormat    /* target_format */,
+    XcmsColor*         /* colors_in_out */,
+    unsigned int       /* ncolors */,
+    Bool*              /* compression_flags_return */
+);
+
+extern Status XcmsCIELuvClipL(
+    XcmsCCC            /* ccc */,
+    XcmsColor*         /* colors_in_out */,
+    unsigned int       /* ncolors */,
+    unsigned int       /* index */,
+    Bool*              /* compression_flags_return */
+);
+
+extern Status XcmsCIELuvClipLuv(
+    XcmsCCC            /* ccc */,
+    XcmsColor*         /* colors_in_out */,
+    unsigned int       /* ncolors */,
+    unsigned int       /* index */,
+    Bool*              /* compression_flags_return */
+);
+
+extern Status XcmsCIELuvClipuv(
+    XcmsCCC            /* ccc */,
+    XcmsColor*         /* colors_in_out */,
+    unsigned int       /* ncolors */,
+    unsigned int       /* index */,
+    Bool*              /* compression_flags_return */
+);
+
+extern Status XcmsCIELuvQueryMaxC (
+    XcmsCCC            /* ccc */,
+    XcmsFloat          /* hue_angle */,
+    XcmsFloat          /* L_star */,
+    XcmsColor*         /* color_return */
+);
+
+extern Status XcmsCIELuvQueryMaxL (
+    XcmsCCC            /* ccc */,
+    XcmsFloat          /* hue_angle */,
+    XcmsFloat          /* chroma */,
+    XcmsColor*         /* color_return */
+);
+
+extern Status XcmsCIELuvQueryMaxLC (
+    XcmsCCC            /* ccc */,
+    XcmsFloat          /* hue_angle */,
+    XcmsColor*         /* color_return */
+);
+
+extern Status XcmsCIELuvQueryMinL (
+    XcmsCCC            /* ccc */,
+    XcmsFloat          /* hue_angle */,
+    XcmsFloat          /* chroma */,
+    XcmsColor*         /* color_return */
+);
+
+extern Status XcmsCIELuvToCIEuvY (
+    XcmsCCC            /* ccc */,
+    XcmsColor*         /* white_point */,
+    XcmsColor*         /* colors */,
+    unsigned int       /* ncolors */
+);
+
+extern Status XcmsCIELuvWhiteShiftColors(
+    XcmsCCC            /* ccc */,
+    XcmsColor*         /* initial_white_point*/,
+    XcmsColor*         /* target_white_point*/,
+    XcmsColorFormat    /* target_format */,
+    XcmsColor*         /* colors_in_out */,
+    unsigned int       /* ncolors */,
+    Bool*              /* compression_flags_return */
+);
+
+extern Status XcmsCIEXYZToCIELab (
+    XcmsCCC            /* ccc */,
+    XcmsColor*         /* white_point */,
+    XcmsColor*         /* colors */,
+    unsigned int       /* ncolors */
+);
+
+extern Status XcmsCIEXYZToCIEuvY (
+    XcmsCCC            /* ccc */,
+    XcmsColor*         /* white_point */,
+    XcmsColor*         /* colors */,
+    unsigned int       /* ncolors */
+);
+
+extern Status XcmsCIEXYZToCIExyY (
+    XcmsCCC            /* ccc */,
+    XcmsColor*         /* white_point */,
+    XcmsColor*         /* colors */,
+    unsigned int       /* ncolors */
+);
+
+extern Status XcmsCIEXYZToRGBi (
+    XcmsCCC            /* ccc */,
+    XcmsColor*         /* colors */,
+    unsigned int       /* ncolors */,
+    Bool*              /* compression_flags_return */
+);
+
+extern Status XcmsCIEuvYToCIELuv (
+    XcmsCCC            /* ccc */,
+    XcmsColor*         /* white_point */,
+    XcmsColor*         /* colors */,
+    unsigned int       /* ncolors */
+);
+
+extern Status XcmsCIEuvYToCIEXYZ (
+    XcmsCCC            /* ccc */,
+    XcmsColor*         /* white_point */,
+    XcmsColor*         /* colors */,
+    unsigned int       /* ncolors */
+);
+
+extern Status XcmsCIEuvYToTekHVC (
+    XcmsCCC            /* ccc */,
+    XcmsColor*         /* white_point */,
+    XcmsColor*         /* colors */,
+    unsigned int       /* ncolors */
+);
+
+extern Status XcmsCIExyYToCIEXYZ (
+    XcmsCCC            /* ccc */,
+    XcmsColor*         /* white_point */,
+    XcmsColor*         /* colors */,
+    unsigned int       /* ncolors */
+);
+
+extern XcmsColor *XcmsClientWhitePointOfCCC (
+    XcmsCCC            /* ccc */
+);
+
+extern Status XcmsConvertColors (
+    XcmsCCC            /* ccc */,
+    XcmsColor*         /* colorArry_in_out */,
+    unsigned int       /* nColors */,
+    XcmsColorFormat            /* targetFormat */,
+    Bool*              /* compArry_return */
+);
+
+extern XcmsCCC XcmsCreateCCC (
+    Display*           /* dpy */,
+    int                        /* screenNumber */,
+    Visual*            /* visual */,
+    XcmsColor*         /* clientWhitePt */,
+    XcmsCompressionProc /* gamutCompProc */,
+    XPointer           /* gamutCompClientData */,
+    XcmsWhiteAdjustProc        /* whitePtAdjProc */,
+    XPointer           /* whitePtAdjClientData */
+);
+
+extern XcmsCCC XcmsDefaultCCC (
+    Display*           /* dpy */,
+    int                        /* screenNumber */
+);
+
+extern Display *XcmsDisplayOfCCC (
+    XcmsCCC            /* ccc */
+);
+
+extern XcmsColorFormat XcmsFormatOfPrefix (
+    char*              /* prefix */
+);
+
+extern void XcmsFreeCCC (
+    XcmsCCC            /* ccc */
+);
+
+extern Status XcmsLookupColor (
+    Display*           /* dpy */,
+    Colormap           /* colormap */,
+    _Xconst char*      /* color_string */,
+    XcmsColor*         /* pColor_exact_in_out */,
+    XcmsColor*         /* pColor_scrn_in_out */,
+    XcmsColorFormat            /* result_format */
+);
+
+extern char *XcmsPrefixOfFormat (
+    XcmsColorFormat            /* id */
+);
+
+extern Status XcmsQueryBlack (
+    XcmsCCC            /* ccc */,
+    XcmsColorFormat    /* target_format */,
+    XcmsColor*         /* color_return */
+);
+
+extern Status XcmsQueryBlue (
+    XcmsCCC            /* ccc */,
+    XcmsColorFormat    /* target_format */,
+    XcmsColor*         /* color_return */
+);
+
+extern Status XcmsQueryColor (
+    Display*           /* dpy */,
+    Colormap           /* colormap */,
+    XcmsColor*         /* pColor_in_out */,
+    XcmsColorFormat            /* result_format */
+);
+
+extern Status XcmsQueryColors (
+    Display*           /* dpy */,
+    Colormap           /* colormap */,
+    XcmsColor*         /* colorArry_in_out */,
+    unsigned int       /* nColors */,
+    XcmsColorFormat    /* result_format */
+);
+
+extern Status XcmsQueryGreen (
+    XcmsCCC            /* ccc */,
+    XcmsColorFormat    /* target_format */,
+    XcmsColor*         /* color_return */
+);
+
+extern Status XcmsQueryRed (
+    XcmsCCC            /* ccc */,
+    XcmsColorFormat    /* target_format */,
+    XcmsColor*         /* color_return */
+);
+
+extern Status XcmsQueryWhite (
+    XcmsCCC            /* ccc */,
+    XcmsColorFormat    /* target_format */,
+    XcmsColor*         /* color_return */
+);
+
+extern Status XcmsRGBiToCIEXYZ (
+    XcmsCCC            /* ccc */,
+    XcmsColor*         /* colors */,
+    unsigned int       /* ncolors */,
+    Bool*              /* compression_flags_return */
+);
+
+extern Status XcmsRGBiToRGB (
+    XcmsCCC            /* ccc */,
+    XcmsColor*         /* colors */,
+    unsigned int       /* ncolors */,
+    Bool*              /* compression_flags_return */
+);
+
+extern Status XcmsRGBToRGBi (
+    XcmsCCC            /* ccc */,
+    XcmsColor*         /* colors */,
+    unsigned int       /* ncolors */,
+    Bool*              /* compression_flags_return */
+);
+
+extern int XcmsScreenNumberOfCCC (
+    XcmsCCC            /* ccc */
+);
+
+extern XcmsColor *XcmsScreenWhitePointOfCCC (
+    XcmsCCC            /* ccc */
+);
+
+extern XcmsCCC XcmsSetCCCOfColormap(
+    Display*           /* dpy */,
+    Colormap           /* colormap */,
+    XcmsCCC            /* ccc */
+);
+
+extern XcmsCompressionProc XcmsSetCompressionProc (
+    XcmsCCC            /* ccc */,
+    XcmsCompressionProc        /* compression_proc */,
+    XPointer           /* client_data */
+);
+
+extern XcmsWhiteAdjustProc XcmsSetWhiteAdjustProc (
+    XcmsCCC            /* ccc */,
+    XcmsWhiteAdjustProc        /* white_adjust_proc */,
+    XPointer           /* client_data */
+);
+
+extern Status XcmsSetWhitePoint (
+    XcmsCCC            /* ccc */,
+    XcmsColor*         /* color */
+);
+
+extern Status XcmsStoreColor (
+    Display*           /* dpy */,
+    Colormap           /* colormap */,
+    XcmsColor*         /* pColor_in */
+);
+
+extern Status XcmsStoreColors (
+    Display*           /* dpy */,
+    Colormap           /* colormap */,
+    XcmsColor*         /* colorArry_in */,
+    unsigned int       /* nColors */,
+    Bool*              /* compArry_return */
+);
+
+extern Status XcmsTekHVCClipC(
+    XcmsCCC            /* ccc */,
+    XcmsColor*         /* colors_in_out */,
+    unsigned int       /* ncolors */,
+    unsigned int       /* index */,
+    Bool*              /* compression_flags_return */
+);
+
+extern Status XcmsTekHVCClipV(
+    XcmsCCC            /* ccc */,
+    XcmsColor*         /* colors_in_out */,
+    unsigned int       /* ncolors */,
+    unsigned int       /* index */,
+    Bool*              /* compression_flags_return */
+);
+
+extern Status XcmsTekHVCClipVC(
+    XcmsCCC            /* ccc */,
+    XcmsColor*         /* colors_in_out */,
+    unsigned int       /* ncolors */,
+    unsigned int       /* index */,
+    Bool*              /* compression_flags_return */
+);
+
+extern Status XcmsTekHVCQueryMaxC (
+    XcmsCCC            /* ccc */,
+    XcmsFloat          /* hue */,
+    XcmsFloat          /* value */,
+    XcmsColor*         /* color_return */
+);
+
+extern Status XcmsTekHVCQueryMaxV (
+    XcmsCCC            /* ccc */,
+    XcmsFloat          /* hue */,
+    XcmsFloat          /* chroma */,
+    XcmsColor*         /* color_return */
+);
+
+extern Status XcmsTekHVCQueryMaxVC (
+    XcmsCCC            /* ccc */,
+    XcmsFloat          /* hue */,
+    XcmsColor*         /* color_return */
+);
+
+extern Status XcmsTekHVCQueryMaxVSamples (
+    XcmsCCC            /* ccc */,
+    XcmsFloat          /* hue */,
+    XcmsColor*         /* colors_return */,
+    unsigned int       /* nsamples */
+);
+
+extern Status XcmsTekHVCQueryMinV (
+    XcmsCCC            /* ccc */,
+    XcmsFloat          /* hue */,
+    XcmsFloat          /* chroma */,
+    XcmsColor*         /* color_return */
+);
+
+extern Status XcmsTekHVCToCIEuvY (
+    XcmsCCC            /* ccc */,
+    XcmsColor*         /* white_point */,
+    XcmsColor*         /* colors */,
+    unsigned int       /* ncolors */
+);
+
+extern Status XcmsTekHVCWhiteShiftColors(
+    XcmsCCC            /* ccc */,
+    XcmsColor*         /* initial_white_point*/,
+    XcmsColor*         /* target_white_point*/,
+    XcmsColorFormat    /* target_format */,
+    XcmsColor*         /* colors_in_out */,
+    unsigned int       /* ncolors */,
+    Bool*              /* compression_flags_return */
+);
+
+extern Visual *XcmsVisualOfCCC (
+    XcmsCCC            /* ccc */
+);
+
+_XFUNCPROTOEND
+
+#endif /* _X11_XCMS_H_ */
diff --git a/include/X11/Xlib-xcb.h b/include/X11/Xlib-xcb.h
new file mode 100644 (file)
index 0000000..a21e2be
--- /dev/null
@@ -0,0 +1,20 @@
+/* Copyright (C) 2003-2006 Jamey Sharp, Josh Triplett
+ * This file is licensed under the MIT license. See the file COPYING. */
+
+#ifndef _X11_XLIB_XCB_H_
+#define _X11_XLIB_XCB_H_
+
+#include <xcb/xcb.h>
+#include <X11/Xlib.h>
+#include <X11/Xfuncproto.h>
+
+_XFUNCPROTOBEGIN
+
+xcb_connection_t *XGetXCBConnection(Display *dpy);
+
+enum XEventQueueOwner { XlibOwnsEventQueue = 0, XCBOwnsEventQueue };
+void XSetEventQueueOwner(Display *dpy, enum XEventQueueOwner owner);
+
+_XFUNCPROTOEND
+
+#endif /* _X11_XLIB_XCB_H_ */
diff --git a/include/X11/Xlib.h b/include/X11/Xlib.h
new file mode 100644 (file)
index 0000000..dd4c7c4
--- /dev/null
@@ -0,0 +1,4024 @@
+/*
+
+Copyright 1985, 1986, 1987, 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.
+
+*/
+
+
+/*
+ *     Xlib.h - Header definition and support file for the C subroutine
+ *     interface library (Xlib) to the X Window System Protocol (V11).
+ *     Structures and symbols starting with "_" are private to the library.
+ */
+#ifndef _X11_XLIB_H_
+#define _X11_XLIB_H_
+
+#define XlibSpecificationRelease 6
+
+#include <sys/types.h>
+
+#if defined(__SCO__) || defined(__UNIXWARE__)
+#include <stdint.h>
+#endif
+
+#include <X11/X.h>
+
+/* applications should not depend on these two headers being included! */
+#include <X11/Xfuncproto.h>
+#include <X11/Xosdefs.h>
+
+#ifndef X_WCHAR
+#include <stddef.h>
+#else
+#ifdef __UNIXOS2__
+#include <stdlib.h>
+#else
+/* replace this with #include or typedef appropriate for your system */
+typedef unsigned long wchar_t;
+#endif
+#endif
+
+#if defined(ISC) && defined(USE_XMBTOWC)
+#define wctomb(a,b)    _Xwctomb(a,b)
+#define mblen(a,b)     _Xmblen(a,b)
+#ifndef USE_XWCHAR_STRING
+#define mbtowc(a,b,c)  _Xmbtowc(a,b,c)
+#endif
+#endif
+
+extern int
+_Xmblen(
+#ifdef ISC
+    char const *str,
+    size_t len
+#else
+    char *str,
+    int len
+#endif
+    );
+
+/* API mentioning "UTF8" or "utf8" is an XFree86 extension, introduced in
+   November 2000. Its presence is indicated through the following macro. */
+#define X_HAVE_UTF8_STRING 1
+
+typedef char *XPointer;
+
+#define Bool int
+#define Status int
+#define True 1
+#define False 0
+
+#define QueuedAlready 0
+#define QueuedAfterReading 1
+#define QueuedAfterFlush 2
+
+#define ConnectionNumber(dpy)  (((_XPrivDisplay)dpy)->fd)
+#define RootWindow(dpy, scr)   (ScreenOfDisplay(dpy,scr)->root)
+#define DefaultScreen(dpy)     (((_XPrivDisplay)dpy)->default_screen)
+#define DefaultRootWindow(dpy)         (ScreenOfDisplay(dpy,DefaultScreen(dpy))->root)
+#define DefaultVisual(dpy, scr) (ScreenOfDisplay(dpy,scr)->root_visual)
+#define DefaultGC(dpy, scr)    (ScreenOfDisplay(dpy,scr)->default_gc)
+#define BlackPixel(dpy, scr)   (ScreenOfDisplay(dpy,scr)->black_pixel)
+#define WhitePixel(dpy, scr)   (ScreenOfDisplay(dpy,scr)->white_pixel)
+#define AllPlanes              ((unsigned long)~0L)
+#define QLength(dpy)           (((_XPrivDisplay)dpy)->qlen)
+#define DisplayWidth(dpy, scr)         (ScreenOfDisplay(dpy,scr)->width)
+#define DisplayHeight(dpy, scr) (ScreenOfDisplay(dpy,scr)->height)
+#define DisplayWidthMM(dpy, scr)(ScreenOfDisplay(dpy,scr)->mwidth)
+#define DisplayHeightMM(dpy, scr)(ScreenOfDisplay(dpy,scr)->mheight)
+#define DisplayPlanes(dpy, scr) (ScreenOfDisplay(dpy,scr)->root_depth)
+#define DisplayCells(dpy, scr)         (DefaultVisual(dpy,scr)->map_entries)
+#define ScreenCount(dpy)       (((_XPrivDisplay)dpy)->nscreens)
+#define ServerVendor(dpy)      (((_XPrivDisplay)dpy)->vendor)
+#define ProtocolVersion(dpy)   (((_XPrivDisplay)dpy)->proto_major_version)
+#define ProtocolRevision(dpy)  (((_XPrivDisplay)dpy)->proto_minor_version)
+#define VendorRelease(dpy)     (((_XPrivDisplay)dpy)->release)
+#define DisplayString(dpy)     (((_XPrivDisplay)dpy)->display_name)
+#define DefaultDepth(dpy, scr)         (ScreenOfDisplay(dpy,scr)->root_depth)
+#define DefaultColormap(dpy, scr)(ScreenOfDisplay(dpy,scr)->cmap)
+#define BitmapUnit(dpy)        (((_XPrivDisplay)dpy)->bitmap_unit)
+#define BitmapBitOrder(dpy)    (((_XPrivDisplay)dpy)->bitmap_bit_order)
+#define BitmapPad(dpy)                 (((_XPrivDisplay)dpy)->bitmap_pad)
+#define ImageByteOrder(dpy)    (((_XPrivDisplay)dpy)->byte_order)
+#ifdef CRAY /* unable to get WORD64 without pulling in other symbols */
+#define NextRequest(dpy)       XNextRequest(dpy)
+#else
+#define NextRequest(dpy)       (((_XPrivDisplay)dpy)->request + 1)
+#endif
+#define LastKnownRequestProcessed(dpy) (((_XPrivDisplay)dpy)->last_request_read)
+
+/* macros for screen oriented applications (toolkit) */
+#define ScreenOfDisplay(dpy, scr)(&((_XPrivDisplay)dpy)->screens[scr])
+#define DefaultScreenOfDisplay(dpy) ScreenOfDisplay(dpy,DefaultScreen(dpy))
+#define DisplayOfScreen(s)     ((s)->display)
+#define RootWindowOfScreen(s)  ((s)->root)
+#define BlackPixelOfScreen(s)  ((s)->black_pixel)
+#define WhitePixelOfScreen(s)  ((s)->white_pixel)
+#define DefaultColormapOfScreen(s)((s)->cmap)
+#define DefaultDepthOfScreen(s)        ((s)->root_depth)
+#define DefaultGCOfScreen(s)   ((s)->default_gc)
+#define DefaultVisualOfScreen(s)((s)->root_visual)
+#define WidthOfScreen(s)       ((s)->width)
+#define HeightOfScreen(s)      ((s)->height)
+#define WidthMMOfScreen(s)     ((s)->mwidth)
+#define HeightMMOfScreen(s)    ((s)->mheight)
+#define PlanesOfScreen(s)      ((s)->root_depth)
+#define CellsOfScreen(s)       (DefaultVisualOfScreen((s))->map_entries)
+#define MinCmapsOfScreen(s)    ((s)->min_maps)
+#define MaxCmapsOfScreen(s)    ((s)->max_maps)
+#define DoesSaveUnders(s)      ((s)->save_unders)
+#define DoesBackingStore(s)    ((s)->backing_store)
+#define EventMaskOfScreen(s)   ((s)->root_input_mask)
+
+/*
+ * Extensions need a way to hang private data on some structures.
+ */
+typedef struct _XExtData {
+       int number;             /* number returned by XRegisterExtension */
+       struct _XExtData *next; /* next item on list of data for structure */
+       int (*free_private)(    /* called to free private storage */
+       struct _XExtData *extension
+       );
+       XPointer private_data;  /* data private to this extension. */
+} XExtData;
+
+/*
+ * This file contains structures used by the extension mechanism.
+ */
+typedef struct {               /* public to extension, cannot be changed */
+       int extension;          /* extension number */
+       int major_opcode;       /* major op-code assigned by server */
+       int first_event;        /* first event number for the extension */
+       int first_error;        /* first error number for the extension */
+} XExtCodes;
+
+/*
+ * Data structure for retrieving info about pixmap formats.
+ */
+
+typedef struct {
+    int depth;
+    int bits_per_pixel;
+    int scanline_pad;
+} XPixmapFormatValues;
+
+
+/*
+ * Data structure for setting graphics context.
+ */
+typedef struct {
+       int function;           /* logical operation */
+       unsigned long plane_mask;/* plane mask */
+       unsigned long foreground;/* foreground pixel */
+       unsigned long background;/* background pixel */
+       int line_width;         /* line width */
+       int line_style;         /* LineSolid, LineOnOffDash, LineDoubleDash */
+       int cap_style;          /* CapNotLast, CapButt,
+                                  CapRound, CapProjecting */
+       int join_style;         /* JoinMiter, JoinRound, JoinBevel */
+       int fill_style;         /* FillSolid, FillTiled,
+                                  FillStippled, FillOpaeueStippled */
+       int fill_rule;          /* EvenOddRule, WindingRule */
+       int arc_mode;           /* ArcChord, ArcPieSlice */
+       Pixmap tile;            /* tile pixmap for tiling operations */
+       Pixmap stipple;         /* stipple 1 plane pixmap for stipping */
+       int ts_x_origin;        /* offset for tile or stipple operations */
+       int ts_y_origin;
+        Font font;             /* default text font for text operations */
+       int subwindow_mode;     /* ClipByChildren, IncludeInferiors */
+       Bool graphics_exposures;/* boolean, should exposures be generated */
+       int clip_x_origin;      /* origin for clipping */
+       int clip_y_origin;
+       Pixmap clip_mask;       /* bitmap clipping; other calls for rects */
+       int dash_offset;        /* patterned/dashed line information */
+       char dashes;
+} XGCValues;
+
+/*
+ * Graphics context.  The contents of this structure are implementation
+ * dependent.  A GC should be treated as opaque by application code.
+ */
+
+typedef struct _XGC
+#ifdef XLIB_ILLEGAL_ACCESS
+{
+    XExtData *ext_data;        /* hook for extension to hang data */
+    GContext gid;      /* protocol ID for graphics context */
+    /* there is more to this structure, but it is private to Xlib */
+}
+#endif
+*GC;
+
+/*
+ * Visual structure; contains information about colormapping possible.
+ */
+typedef struct {
+       XExtData *ext_data;     /* hook for extension to hang data */
+       VisualID visualid;      /* visual id of this visual */
+#if defined(__cplusplus) || defined(c_plusplus)
+       int c_class;            /* C++ class of screen (monochrome, etc.) */
+#else
+       int class;              /* class of screen (monochrome, etc.) */
+#endif
+       unsigned long red_mask, green_mask, blue_mask;  /* mask values */
+       int bits_per_rgb;       /* log base 2 of distinct color values */
+       int map_entries;        /* color map entries */
+} Visual;
+
+/*
+ * Depth structure; contains information for each possible depth.
+ */
+typedef struct {
+       int depth;              /* this depth (Z) of the depth */
+       int nvisuals;           /* number of Visual types at this depth */
+       Visual *visuals;        /* list of visuals possible at this depth */
+} Depth;
+
+/*
+ * Information about the screen.  The contents of this structure are
+ * implementation dependent.  A Screen should be treated as opaque
+ * by application code.
+ */
+
+struct _XDisplay;              /* Forward declare before use for C++ */
+
+typedef struct {
+       XExtData *ext_data;     /* hook for extension to hang data */
+       struct _XDisplay *display;/* back pointer to display structure */
+       Window root;            /* Root window id. */
+       int width, height;      /* width and height of screen */
+       int mwidth, mheight;    /* width and height of  in millimeters */
+       int ndepths;            /* number of depths possible */
+       Depth *depths;          /* list of allowable depths on the screen */
+       int root_depth;         /* bits per pixel */
+       Visual *root_visual;    /* root visual */
+       GC default_gc;          /* GC for the root root visual */
+       Colormap cmap;          /* default color map */
+       unsigned long white_pixel;
+       unsigned long black_pixel;      /* White and Black pixel values */
+       int max_maps, min_maps; /* max and min color maps */
+       int backing_store;      /* Never, WhenMapped, Always */
+       Bool save_unders;
+       long root_input_mask;   /* initial root input mask */
+} Screen;
+
+/*
+ * Format structure; describes ZFormat data the screen will understand.
+ */
+typedef struct {
+       XExtData *ext_data;     /* hook for extension to hang data */
+       int depth;              /* depth of this image format */
+       int bits_per_pixel;     /* bits/pixel at this depth */
+       int scanline_pad;       /* scanline must padded to this multiple */
+} ScreenFormat;
+
+/*
+ * Data structure for setting window attributes.
+ */
+typedef struct {
+    Pixmap background_pixmap;  /* background or None or ParentRelative */
+    unsigned long background_pixel;    /* background pixel */
+    Pixmap border_pixmap;      /* border of the window */
+    unsigned long border_pixel;        /* border pixel value */
+    int bit_gravity;           /* one of bit gravity values */
+    int win_gravity;           /* one of the window gravity values */
+    int backing_store;         /* NotUseful, WhenMapped, Always */
+    unsigned long backing_planes;/* planes to be preseved if possible */
+    unsigned long backing_pixel;/* value to use in restoring planes */
+    Bool save_under;           /* should bits under be saved? (popups) */
+    long event_mask;           /* set of events that should be saved */
+    long do_not_propagate_mask;        /* set of events that should not propagate */
+    Bool override_redirect;    /* boolean value for override-redirect */
+    Colormap colormap;         /* color map to be associated with window */
+    Cursor cursor;             /* cursor to be displayed (or None) */
+} XSetWindowAttributes;
+
+typedef struct {
+    int x, y;                  /* location of window */
+    int width, height;         /* width and height of window */
+    int border_width;          /* border width of window */
+    int depth;                 /* depth of window */
+    Visual *visual;            /* the associated visual structure */
+    Window root;               /* root of screen containing window */
+#if defined(__cplusplus) || defined(c_plusplus)
+    int c_class;               /* C++ InputOutput, InputOnly*/
+#else
+    int class;                 /* InputOutput, InputOnly*/
+#endif
+    int bit_gravity;           /* one of bit gravity values */
+    int win_gravity;           /* one of the window gravity values */
+    int backing_store;         /* NotUseful, WhenMapped, Always */
+    unsigned long backing_planes;/* planes to be preserved if possible */
+    unsigned long backing_pixel;/* value to be used when restoring planes */
+    Bool save_under;           /* boolean, should bits under be saved? */
+    Colormap colormap;         /* color map to be associated with window */
+    Bool map_installed;                /* boolean, is color map currently installed*/
+    int map_state;             /* IsUnmapped, IsUnviewable, IsViewable */
+    long all_event_masks;      /* set of events all people have interest in*/
+    long your_event_mask;      /* my event mask */
+    long do_not_propagate_mask; /* set of events that should not propagate */
+    Bool override_redirect;    /* boolean value for override-redirect */
+    Screen *screen;            /* back pointer to correct screen */
+} XWindowAttributes;
+
+/*
+ * Data structure for host setting; getting routines.
+ *
+ */
+
+typedef struct {
+       int family;             /* for example FamilyInternet */
+       int length;             /* length of address, in bytes */
+       char *address;          /* pointer to where to find the bytes */
+} XHostAddress;
+
+/*
+ * Data structure for ServerFamilyInterpreted addresses in host routines
+ */
+typedef struct {
+       int typelength;         /* length of type string, in bytes */
+       int valuelength;        /* length of value string, in bytes */
+       char *type;             /* pointer to where to find the type string */
+       char *value;            /* pointer to where to find the address */
+} XServerInterpretedAddress;
+
+/*
+ * Data structure for "image" data, used by image manipulation routines.
+ */
+typedef struct _XImage {
+    int width, height;         /* size of image */
+    int xoffset;               /* number of pixels offset in X direction */
+    int format;                        /* XYBitmap, XYPixmap, ZPixmap */
+    char *data;                        /* pointer to image data */
+    int byte_order;            /* data byte order, LSBFirst, MSBFirst */
+    int bitmap_unit;           /* quant. of scanline 8, 16, 32 */
+    int bitmap_bit_order;      /* LSBFirst, MSBFirst */
+    int bitmap_pad;            /* 8, 16, 32 either XY or ZPixmap */
+    int depth;                 /* depth of image */
+    int bytes_per_line;                /* accelarator to next line */
+    int bits_per_pixel;                /* bits per pixel (ZPixmap) */
+    unsigned long red_mask;    /* bits in z arrangment */
+    unsigned long green_mask;
+    unsigned long blue_mask;
+    XPointer obdata;           /* hook for the object routines to hang on */
+    struct funcs {             /* image manipulation routines */
+       struct _XImage *(*create_image)(
+               struct _XDisplay* /* display */,
+               Visual*         /* visual */,
+               unsigned int    /* depth */,
+               int             /* format */,
+               int             /* offset */,
+               char*           /* data */,
+               unsigned int    /* width */,
+               unsigned int    /* height */,
+               int             /* bitmap_pad */,
+               int             /* bytes_per_line */);
+       int (*destroy_image)        (struct _XImage *);
+       unsigned long (*get_pixel)  (struct _XImage *, int, int);
+       int (*put_pixel)            (struct _XImage *, int, int, unsigned long);
+       struct _XImage *(*sub_image)(struct _XImage *, int, int, unsigned int, unsigned int);
+       int (*add_pixel)            (struct _XImage *, long);
+       } f;
+} XImage;
+
+/*
+ * Data structure for XReconfigureWindow
+ */
+typedef struct {
+    int x, y;
+    int width, height;
+    int border_width;
+    Window sibling;
+    int stack_mode;
+} XWindowChanges;
+
+/*
+ * Data structure used by color operations
+ */
+typedef struct {
+       unsigned long pixel;
+       unsigned short red, green, blue;
+       char flags;  /* do_red, do_green, do_blue */
+       char pad;
+} XColor;
+
+/*
+ * Data structures for graphics operations.  On most machines, these are
+ * congruent with the wire protocol structures, so reformatting the data
+ * can be avoided on these architectures.
+ */
+typedef struct {
+    short x1, y1, x2, y2;
+} XSegment;
+
+typedef struct {
+    short x, y;
+} XPoint;
+
+typedef struct {
+    short x, y;
+    unsigned short width, height;
+} XRectangle;
+
+typedef struct {
+    short x, y;
+    unsigned short width, height;
+    short angle1, angle2;
+} XArc;
+
+
+/* Data structure for XChangeKeyboardControl */
+
+typedef struct {
+        int key_click_percent;
+        int bell_percent;
+        int bell_pitch;
+        int bell_duration;
+        int led;
+        int led_mode;
+        int key;
+        int auto_repeat_mode;   /* On, Off, Default */
+} XKeyboardControl;
+
+/* Data structure for XGetKeyboardControl */
+
+typedef struct {
+        int key_click_percent;
+       int bell_percent;
+       unsigned int bell_pitch, bell_duration;
+       unsigned long led_mask;
+       int global_auto_repeat;
+       char auto_repeats[32];
+} XKeyboardState;
+
+/* Data structure for XGetMotionEvents.  */
+
+typedef struct {
+        Time time;
+       short x, y;
+} XTimeCoord;
+
+/* Data structure for X{Set,Get}ModifierMapping */
+
+typedef struct {
+       int max_keypermod;      /* The server's max # of keys per modifier */
+       KeyCode *modifiermap;   /* An 8 by max_keypermod array of modifiers */
+} XModifierKeymap;
+
+
+/*
+ * Display datatype maintaining display specific data.
+ * The contents of this structure are implementation dependent.
+ * A Display should be treated as opaque by application code.
+ */
+#ifndef XLIB_ILLEGAL_ACCESS
+typedef struct _XDisplay Display;
+#endif
+
+struct _XPrivate;              /* Forward declare before use for C++ */
+struct _XrmHashBucketRec;
+
+typedef struct
+#ifdef XLIB_ILLEGAL_ACCESS
+_XDisplay
+#endif
+{
+       XExtData *ext_data;     /* hook for extension to hang data */
+       struct _XPrivate *private1;
+       int fd;                 /* Network socket. */
+       int private2;
+       int proto_major_version;/* major version of server's X protocol */
+       int proto_minor_version;/* minor version of servers X protocol */
+       char *vendor;           /* vendor of the server hardware */
+        XID private3;
+       XID private4;
+       XID private5;
+       int private6;
+       XID (*resource_alloc)(  /* allocator function */
+               struct _XDisplay*
+       );
+       int byte_order;         /* screen byte order, LSBFirst, MSBFirst */
+       int bitmap_unit;        /* padding and data requirements */
+       int bitmap_pad;         /* padding requirements on bitmaps */
+       int bitmap_bit_order;   /* LeastSignificant or MostSignificant */
+       int nformats;           /* number of pixmap formats in list */
+       ScreenFormat *pixmap_format;    /* pixmap format list */
+       int private8;
+       int release;            /* release of the server */
+       struct _XPrivate *private9, *private10;
+       int qlen;               /* Length of input event queue */
+       unsigned long last_request_read; /* seq number of last event read */
+       unsigned long request;  /* sequence number of last request. */
+       XPointer private11;
+       XPointer private12;
+       XPointer private13;
+       XPointer private14;
+       unsigned max_request_size; /* maximum number 32 bit words in request*/
+       struct _XrmHashBucketRec *db;
+       int (*private15)(
+               struct _XDisplay*
+               );
+       char *display_name;     /* "host:display" string used on this connect*/
+       int default_screen;     /* default screen for operations */
+       int nscreens;           /* number of screens on this server*/
+       Screen *screens;        /* pointer to list of screens */
+       unsigned long motion_buffer;    /* size of motion buffer */
+       unsigned long private16;
+       int min_keycode;        /* minimum defined keycode */
+       int max_keycode;        /* maximum defined keycode */
+       XPointer private17;
+       XPointer private18;
+       int private19;
+       char *xdefaults;        /* contents of defaults from server */
+       /* there is more to this structure, but it is private to Xlib */
+}
+#ifdef XLIB_ILLEGAL_ACCESS
+Display,
+#endif
+*_XPrivDisplay;
+
+#undef _XEVENT_
+#ifndef _XEVENT_
+/*
+ * Definitions of specific events.
+ */
+typedef struct {
+       int type;               /* of event */
+       unsigned long serial;   /* # of last request processed by server */
+       Bool send_event;        /* true if this came from a SendEvent request */
+       Display *display;       /* Display the event was read from */
+       Window window;          /* "event" window it is reported relative to */
+       Window root;            /* root window that the event occurred on */
+       Window subwindow;       /* child window */
+       Time time;              /* milliseconds */
+       int x, y;               /* pointer x, y coordinates in event window */
+       int x_root, y_root;     /* coordinates relative to root */
+       unsigned int state;     /* key or button mask */
+       unsigned int keycode;   /* detail */
+       Bool same_screen;       /* same screen flag */
+} XKeyEvent;
+typedef XKeyEvent XKeyPressedEvent;
+typedef XKeyEvent XKeyReleasedEvent;
+
+typedef struct {
+       int type;               /* of event */
+       unsigned long serial;   /* # of last request processed by server */
+       Bool send_event;        /* true if this came from a SendEvent request */
+       Display *display;       /* Display the event was read from */
+       Window window;          /* "event" window it is reported relative to */
+       Window root;            /* root window that the event occurred on */
+       Window subwindow;       /* child window */
+       Time time;              /* milliseconds */
+       int x, y;               /* pointer x, y coordinates in event window */
+       int x_root, y_root;     /* coordinates relative to root */
+       unsigned int state;     /* key or button mask */
+       unsigned int button;    /* detail */
+       Bool same_screen;       /* same screen flag */
+} XButtonEvent;
+typedef XButtonEvent XButtonPressedEvent;
+typedef XButtonEvent XButtonReleasedEvent;
+
+typedef struct {
+       int type;               /* of event */
+       unsigned long serial;   /* # of last request processed by server */
+       Bool send_event;        /* true if this came from a SendEvent request */
+       Display *display;       /* Display the event was read from */
+       Window window;          /* "event" window reported relative to */
+       Window root;            /* root window that the event occurred on */
+       Window subwindow;       /* child window */
+       Time time;              /* milliseconds */
+       int x, y;               /* pointer x, y coordinates in event window */
+       int x_root, y_root;     /* coordinates relative to root */
+       unsigned int state;     /* key or button mask */
+       char is_hint;           /* detail */
+       Bool same_screen;       /* same screen flag */
+} XMotionEvent;
+typedef XMotionEvent XPointerMovedEvent;
+
+typedef struct {
+       int type;               /* of event */
+       unsigned long serial;   /* # of last request processed by server */
+       Bool send_event;        /* true if this came from a SendEvent request */
+       Display *display;       /* Display the event was read from */
+       Window window;          /* "event" window reported relative to */
+       Window root;            /* root window that the event occurred on */
+       Window subwindow;       /* child window */
+       Time time;              /* milliseconds */
+       int x, y;               /* pointer x, y coordinates in event window */
+       int x_root, y_root;     /* coordinates relative to root */
+       int mode;               /* NotifyNormal, NotifyGrab, NotifyUngrab */
+       int detail;
+       /*
+        * NotifyAncestor, NotifyVirtual, NotifyInferior,
+        * NotifyNonlinear,NotifyNonlinearVirtual
+        */
+       Bool same_screen;       /* same screen flag */
+       Bool focus;             /* boolean focus */
+       unsigned int state;     /* key or button mask */
+} XCrossingEvent;
+typedef XCrossingEvent XEnterWindowEvent;
+typedef XCrossingEvent XLeaveWindowEvent;
+
+typedef struct {
+       int type;               /* FocusIn or FocusOut */
+       unsigned long serial;   /* # of last request processed by server */
+       Bool send_event;        /* true if this came from a SendEvent request */
+       Display *display;       /* Display the event was read from */
+       Window window;          /* window of event */
+       int mode;               /* NotifyNormal, NotifyWhileGrabbed,
+                                  NotifyGrab, NotifyUngrab */
+       int detail;
+       /*
+        * NotifyAncestor, NotifyVirtual, NotifyInferior,
+        * NotifyNonlinear,NotifyNonlinearVirtual, NotifyPointer,
+        * NotifyPointerRoot, NotifyDetailNone
+        */
+} XFocusChangeEvent;
+typedef XFocusChangeEvent XFocusInEvent;
+typedef XFocusChangeEvent XFocusOutEvent;
+
+/* generated on EnterWindow and FocusIn  when KeyMapState selected */
+typedef struct {
+       int type;
+       unsigned long serial;   /* # of last request processed by server */
+       Bool send_event;        /* true if this came from a SendEvent request */
+       Display *display;       /* Display the event was read from */
+       Window window;
+       char key_vector[32];
+} XKeymapEvent;
+
+typedef struct {
+       int type;
+       unsigned long serial;   /* # of last request processed by server */
+       Bool send_event;        /* true if this came from a SendEvent request */
+       Display *display;       /* Display the event was read from */
+       Window window;
+       int x, y;
+       int width, height;
+       int count;              /* if non-zero, at least this many more */
+} XExposeEvent;
+
+typedef struct {
+       int type;
+       unsigned long serial;   /* # of last request processed by server */
+       Bool send_event;        /* true if this came from a SendEvent request */
+       Display *display;       /* Display the event was read from */
+       Drawable drawable;
+       int x, y;
+       int width, height;
+       int count;              /* if non-zero, at least this many more */
+       int major_code;         /* core is CopyArea or CopyPlane */
+       int minor_code;         /* not defined in the core */
+} XGraphicsExposeEvent;
+
+typedef struct {
+       int type;
+       unsigned long serial;   /* # of last request processed by server */
+       Bool send_event;        /* true if this came from a SendEvent request */
+       Display *display;       /* Display the event was read from */
+       Drawable drawable;
+       int major_code;         /* core is CopyArea or CopyPlane */
+       int minor_code;         /* not defined in the core */
+} XNoExposeEvent;
+
+typedef struct {
+       int type;
+       unsigned long serial;   /* # of last request processed by server */
+       Bool send_event;        /* true if this came from a SendEvent request */
+       Display *display;       /* Display the event was read from */
+       Window window;
+       int state;              /* Visibility state */
+} XVisibilityEvent;
+
+typedef struct {
+       int type;
+       unsigned long serial;   /* # of last request processed by server */
+       Bool send_event;        /* true if this came from a SendEvent request */
+       Display *display;       /* Display the event was read from */
+       Window parent;          /* parent of the window */
+       Window window;          /* window id of window created */
+       int x, y;               /* window location */
+       int width, height;      /* size of window */
+       int border_width;       /* border width */
+       Bool override_redirect; /* creation should be overridden */
+} XCreateWindowEvent;
+
+typedef struct {
+       int type;
+       unsigned long serial;   /* # of last request processed by server */
+       Bool send_event;        /* true if this came from a SendEvent request */
+       Display *display;       /* Display the event was read from */
+       Window event;
+       Window window;
+} XDestroyWindowEvent;
+
+typedef struct {
+       int type;
+       unsigned long serial;   /* # of last request processed by server */
+       Bool send_event;        /* true if this came from a SendEvent request */
+       Display *display;       /* Display the event was read from */
+       Window event;
+       Window window;
+       Bool from_configure;
+} XUnmapEvent;
+
+typedef struct {
+       int type;
+       unsigned long serial;   /* # of last request processed by server */
+       Bool send_event;        /* true if this came from a SendEvent request */
+       Display *display;       /* Display the event was read from */
+       Window event;
+       Window window;
+       Bool override_redirect; /* boolean, is override set... */
+} XMapEvent;
+
+typedef struct {
+       int type;
+       unsigned long serial;   /* # of last request processed by server */
+       Bool send_event;        /* true if this came from a SendEvent request */
+       Display *display;       /* Display the event was read from */
+       Window parent;
+       Window window;
+} XMapRequestEvent;
+
+typedef struct {
+       int type;
+       unsigned long serial;   /* # of last request processed by server */
+       Bool send_event;        /* true if this came from a SendEvent request */
+       Display *display;       /* Display the event was read from */
+       Window event;
+       Window window;
+       Window parent;
+       int x, y;
+       Bool override_redirect;
+} XReparentEvent;
+
+typedef struct {
+       int type;
+       unsigned long serial;   /* # of last request processed by server */
+       Bool send_event;        /* true if this came from a SendEvent request */
+       Display *display;       /* Display the event was read from */
+       Window event;
+       Window window;
+       int x, y;
+       int width, height;
+       int border_width;
+       Window above;
+       Bool override_redirect;
+} XConfigureEvent;
+
+typedef struct {
+       int type;
+       unsigned long serial;   /* # of last request processed by server */
+       Bool send_event;        /* true if this came from a SendEvent request */
+       Display *display;       /* Display the event was read from */
+       Window event;
+       Window window;
+       int x, y;
+} XGravityEvent;
+
+typedef struct {
+       int type;
+       unsigned long serial;   /* # of last request processed by server */
+       Bool send_event;        /* true if this came from a SendEvent request */
+       Display *display;       /* Display the event was read from */
+       Window window;
+       int width, height;
+} XResizeRequestEvent;
+
+typedef struct {
+       int type;
+       unsigned long serial;   /* # of last request processed by server */
+       Bool send_event;        /* true if this came from a SendEvent request */
+       Display *display;       /* Display the event was read from */
+       Window parent;
+       Window window;
+       int x, y;
+       int width, height;
+       int border_width;
+       Window above;
+       int detail;             /* Above, Below, TopIf, BottomIf, Opposite */
+       unsigned long value_mask;
+} XConfigureRequestEvent;
+
+typedef struct {
+       int type;
+       unsigned long serial;   /* # of last request processed by server */
+       Bool send_event;        /* true if this came from a SendEvent request */
+       Display *display;       /* Display the event was read from */
+       Window event;
+       Window window;
+       int place;              /* PlaceOnTop, PlaceOnBottom */
+} XCirculateEvent;
+
+typedef struct {
+       int type;
+       unsigned long serial;   /* # of last request processed by server */
+       Bool send_event;        /* true if this came from a SendEvent request */
+       Display *display;       /* Display the event was read from */
+       Window parent;
+       Window window;
+       int place;              /* PlaceOnTop, PlaceOnBottom */
+} XCirculateRequestEvent;
+
+typedef struct {
+       int type;
+       unsigned long serial;   /* # of last request processed by server */
+       Bool send_event;        /* true if this came from a SendEvent request */
+       Display *display;       /* Display the event was read from */
+       Window window;
+       Atom atom;
+       Time time;
+       int state;              /* NewValue, Deleted */
+} XPropertyEvent;
+
+typedef struct {
+       int type;
+       unsigned long serial;   /* # of last request processed by server */
+       Bool send_event;        /* true if this came from a SendEvent request */
+       Display *display;       /* Display the event was read from */
+       Window window;
+       Atom selection;
+       Time time;
+} XSelectionClearEvent;
+
+typedef struct {
+       int type;
+       unsigned long serial;   /* # of last request processed by server */
+       Bool send_event;        /* true if this came from a SendEvent request */
+       Display *display;       /* Display the event was read from */
+       Window owner;
+       Window requestor;
+       Atom selection;
+       Atom target;
+       Atom property;
+       Time time;
+} XSelectionRequestEvent;
+
+typedef struct {
+       int type;
+       unsigned long serial;   /* # of last request processed by server */
+       Bool send_event;        /* true if this came from a SendEvent request */
+       Display *display;       /* Display the event was read from */
+       Window requestor;
+       Atom selection;
+       Atom target;
+       Atom property;          /* ATOM or None */
+       Time time;
+} XSelectionEvent;
+
+typedef struct {
+       int type;
+       unsigned long serial;   /* # of last request processed by server */
+       Bool send_event;        /* true if this came from a SendEvent request */
+       Display *display;       /* Display the event was read from */
+       Window window;
+       Colormap colormap;      /* COLORMAP or None */
+#if defined(__cplusplus) || defined(c_plusplus)
+       Bool c_new;             /* C++ */
+#else
+       Bool new;
+#endif
+       int state;              /* ColormapInstalled, ColormapUninstalled */
+} XColormapEvent;
+
+typedef struct {
+       int type;
+       unsigned long serial;   /* # of last request processed by server */
+       Bool send_event;        /* true if this came from a SendEvent request */
+       Display *display;       /* Display the event was read from */
+       Window window;
+       Atom message_type;
+       int format;
+       union {
+               char b[20];
+               short s[10];
+               long l[5];
+               } data;
+} XClientMessageEvent;
+
+typedef struct {
+       int type;
+       unsigned long serial;   /* # of last request processed by server */
+       Bool send_event;        /* true if this came from a SendEvent request */
+       Display *display;       /* Display the event was read from */
+       Window window;          /* unused */
+       int request;            /* one of MappingModifier, MappingKeyboard,
+                                  MappingPointer */
+       int first_keycode;      /* first keycode */
+       int count;              /* defines range of change w. first_keycode*/
+} XMappingEvent;
+
+typedef struct {
+       int type;
+       Display *display;       /* Display the event was read from */
+       XID resourceid;         /* resource id */
+       unsigned long serial;   /* serial number of failed request */
+       unsigned char error_code;       /* error code of failed request */
+       unsigned char request_code;     /* Major op-code of failed request */
+       unsigned char minor_code;       /* Minor op-code of failed request */
+} XErrorEvent;
+
+typedef struct {
+       int type;
+       unsigned long serial;   /* # of last request processed by server */
+       Bool send_event;        /* true if this came from a SendEvent request */
+       Display *display;/* Display the event was read from */
+       Window window;  /* window on which event was requested in event mask */
+} XAnyEvent;
+
+
+/***************************************************************
+ *
+ * GenericEvent.  This event is the standard event for all newer extensions.
+ */
+
+typedef struct
+    {
+    int            type;         /* of event. Always GenericEvent */
+    unsigned long  serial;       /* # of last request processed */
+    Bool           send_event;   /* true if from SendEvent request */
+    Display        *display;     /* Display the event was read from */
+    int            extension;    /* major opcode of extension that caused the event */
+    int            evtype;       /* actual event type. */
+    } XGenericEvent;
+
+typedef struct {
+    int            type;         /* of event. Always GenericEvent */
+    unsigned long  serial;       /* # of last request processed */
+    Bool           send_event;   /* true if from SendEvent request */
+    Display        *display;     /* Display the event was read from */
+    int            extension;    /* major opcode of extension that caused the event */
+    int            evtype;       /* actual event type. */
+    unsigned int   cookie;
+    void           *data;
+} XGenericEventCookie;
+
+/*
+ * this union is defined so Xlib can always use the same sized
+ * event structure internally, to avoid memory fragmentation.
+ */
+typedef union _XEvent {
+        int type;              /* must not be changed; first element */
+       XAnyEvent xany;
+       XKeyEvent xkey;
+       XButtonEvent xbutton;
+       XMotionEvent xmotion;
+       XCrossingEvent xcrossing;
+       XFocusChangeEvent xfocus;
+       XExposeEvent xexpose;
+       XGraphicsExposeEvent xgraphicsexpose;
+       XNoExposeEvent xnoexpose;
+       XVisibilityEvent xvisibility;
+       XCreateWindowEvent xcreatewindow;
+       XDestroyWindowEvent xdestroywindow;
+       XUnmapEvent xunmap;
+       XMapEvent xmap;
+       XMapRequestEvent xmaprequest;
+       XReparentEvent xreparent;
+       XConfigureEvent xconfigure;
+       XGravityEvent xgravity;
+       XResizeRequestEvent xresizerequest;
+       XConfigureRequestEvent xconfigurerequest;
+       XCirculateEvent xcirculate;
+       XCirculateRequestEvent xcirculaterequest;
+       XPropertyEvent xproperty;
+       XSelectionClearEvent xselectionclear;
+       XSelectionRequestEvent xselectionrequest;
+       XSelectionEvent xselection;
+       XColormapEvent xcolormap;
+       XClientMessageEvent xclient;
+       XMappingEvent xmapping;
+       XErrorEvent xerror;
+       XKeymapEvent xkeymap;
+       XGenericEvent xgeneric;
+       XGenericEventCookie xcookie;
+       long pad[24];
+} XEvent;
+#endif
+
+#define XAllocID(dpy) ((*((_XPrivDisplay)dpy)->resource_alloc)((dpy)))
+
+/*
+ * per character font metric information.
+ */
+typedef struct {
+    short      lbearing;       /* origin to left edge of raster */
+    short      rbearing;       /* origin to right edge of raster */
+    short      width;          /* advance to next char's origin */
+    short      ascent;         /* baseline to top edge of raster */
+    short      descent;        /* baseline to bottom edge of raster */
+    unsigned short attributes; /* per char flags (not predefined) */
+} XCharStruct;
+
+/*
+ * To allow arbitrary information with fonts, there are additional properties
+ * returned.
+ */
+typedef struct {
+    Atom name;
+    unsigned long card32;
+} XFontProp;
+
+typedef struct {
+    XExtData   *ext_data;      /* hook for extension to hang data */
+    Font        fid;            /* Font id for this font */
+    unsigned   direction;      /* hint about direction the font is painted */
+    unsigned   min_char_or_byte2;/* first character */
+    unsigned   max_char_or_byte2;/* last character */
+    unsigned   min_byte1;      /* first row that exists */
+    unsigned   max_byte1;      /* last row that exists */
+    Bool       all_chars_exist;/* flag if all characters have non-zero size*/
+    unsigned   default_char;   /* char to print for undefined character */
+    int         n_properties;   /* how many properties there are */
+    XFontProp  *properties;    /* pointer to array of additional properties*/
+    XCharStruct        min_bounds;     /* minimum bounds over all existing char*/
+    XCharStruct        max_bounds;     /* maximum bounds over all existing char*/
+    XCharStruct        *per_char;      /* first_char to last_char information */
+    int                ascent;         /* log. extent above baseline for spacing */
+    int                descent;        /* log. descent below baseline for spacing */
+} XFontStruct;
+
+/*
+ * PolyText routines take these as arguments.
+ */
+typedef struct {
+    char *chars;               /* pointer to string */
+    int nchars;                        /* number of characters */
+    int delta;                 /* delta between strings */
+    Font font;                 /* font to print it in, None don't change */
+} XTextItem;
+
+typedef struct {               /* normal 16 bit characters are two bytes */
+    unsigned char byte1;
+    unsigned char byte2;
+} XChar2b;
+
+typedef struct {
+    XChar2b *chars;            /* two byte characters */
+    int nchars;                        /* number of characters */
+    int delta;                 /* delta between strings */
+    Font font;                 /* font to print it in, None don't change */
+} XTextItem16;
+
+
+typedef union { Display *display;
+               GC gc;
+               Visual *visual;
+               Screen *screen;
+               ScreenFormat *pixmap_format;
+               XFontStruct *font; } XEDataObject;
+
+typedef struct {
+    XRectangle      max_ink_extent;
+    XRectangle      max_logical_extent;
+} XFontSetExtents;
+
+/* unused:
+typedef void (*XOMProc)();
+ */
+
+typedef struct _XOM *XOM;
+typedef struct _XOC *XOC, *XFontSet;
+
+typedef struct {
+    char           *chars;
+    int             nchars;
+    int             delta;
+    XFontSet        font_set;
+} XmbTextItem;
+
+typedef struct {
+    wchar_t        *chars;
+    int             nchars;
+    int             delta;
+    XFontSet        font_set;
+} XwcTextItem;
+
+#define XNRequiredCharSet "requiredCharSet"
+#define XNQueryOrientation "queryOrientation"
+#define XNBaseFontName "baseFontName"
+#define XNOMAutomatic "omAutomatic"
+#define XNMissingCharSet "missingCharSet"
+#define XNDefaultString "defaultString"
+#define XNOrientation "orientation"
+#define XNDirectionalDependentDrawing "directionalDependentDrawing"
+#define XNContextualDrawing "contextualDrawing"
+#define XNFontInfo "fontInfo"
+
+typedef struct {
+    int charset_count;
+    char **charset_list;
+} XOMCharSetList;
+
+typedef enum {
+    XOMOrientation_LTR_TTB,
+    XOMOrientation_RTL_TTB,
+    XOMOrientation_TTB_LTR,
+    XOMOrientation_TTB_RTL,
+    XOMOrientation_Context
+} XOrientation;
+
+typedef struct {
+    int num_orientation;
+    XOrientation *orientation; /* Input Text description */
+} XOMOrientation;
+
+typedef struct {
+    int num_font;
+    XFontStruct **font_struct_list;
+    char **font_name_list;
+} XOMFontInfo;
+
+typedef struct _XIM *XIM;
+typedef struct _XIC *XIC;
+
+typedef void (*XIMProc)(
+    XIM,
+    XPointer,
+    XPointer
+);
+
+typedef Bool (*XICProc)(
+    XIC,
+    XPointer,
+    XPointer
+);
+
+typedef void (*XIDProc)(
+    Display*,
+    XPointer,
+    XPointer
+);
+
+typedef unsigned long XIMStyle;
+
+typedef struct {
+    unsigned short count_styles;
+    XIMStyle *supported_styles;
+} XIMStyles;
+
+#define XIMPreeditArea         0x0001L
+#define XIMPreeditCallbacks    0x0002L
+#define XIMPreeditPosition     0x0004L
+#define XIMPreeditNothing      0x0008L
+#define XIMPreeditNone         0x0010L
+#define XIMStatusArea          0x0100L
+#define XIMStatusCallbacks     0x0200L
+#define XIMStatusNothing       0x0400L
+#define XIMStatusNone          0x0800L
+
+#define XNVaNestedList "XNVaNestedList"
+#define XNQueryInputStyle "queryInputStyle"
+#define XNClientWindow "clientWindow"
+#define XNInputStyle "inputStyle"
+#define XNFocusWindow "focusWindow"
+#define XNResourceName "resourceName"
+#define XNResourceClass "resourceClass"
+#define XNGeometryCallback "geometryCallback"
+#define XNDestroyCallback "destroyCallback"
+#define XNFilterEvents "filterEvents"
+#define XNPreeditStartCallback "preeditStartCallback"
+#define XNPreeditDoneCallback "preeditDoneCallback"
+#define XNPreeditDrawCallback "preeditDrawCallback"
+#define XNPreeditCaretCallback "preeditCaretCallback"
+#define XNPreeditStateNotifyCallback "preeditStateNotifyCallback"
+#define XNPreeditAttributes "preeditAttributes"
+#define XNStatusStartCallback "statusStartCallback"
+#define XNStatusDoneCallback "statusDoneCallback"
+#define XNStatusDrawCallback "statusDrawCallback"
+#define XNStatusAttributes "statusAttributes"
+#define XNArea "area"
+#define XNAreaNeeded "areaNeeded"
+#define XNSpotLocation "spotLocation"
+#define XNColormap "colorMap"
+#define XNStdColormap "stdColorMap"
+#define XNForeground "foreground"
+#define XNBackground "background"
+#define XNBackgroundPixmap "backgroundPixmap"
+#define XNFontSet "fontSet"
+#define XNLineSpace "lineSpace"
+#define XNCursor "cursor"
+
+#define XNQueryIMValuesList "queryIMValuesList"
+#define XNQueryICValuesList "queryICValuesList"
+#define XNVisiblePosition "visiblePosition"
+#define XNR6PreeditCallback "r6PreeditCallback"
+#define XNStringConversionCallback "stringConversionCallback"
+#define XNStringConversion "stringConversion"
+#define XNResetState "resetState"
+#define XNHotKey "hotKey"
+#define XNHotKeyState "hotKeyState"
+#define XNPreeditState "preeditState"
+#define XNSeparatorofNestedList "separatorofNestedList"
+
+#define XBufferOverflow                -1
+#define XLookupNone            1
+#define XLookupChars           2
+#define XLookupKeySym          3
+#define XLookupBoth            4
+
+typedef void *XVaNestedList;
+
+typedef struct {
+    XPointer client_data;
+    XIMProc callback;
+} XIMCallback;
+
+typedef struct {
+    XPointer client_data;
+    XICProc callback;
+} XICCallback;
+
+typedef unsigned long XIMFeedback;
+
+#define XIMReverse             1L
+#define XIMUnderline           (1L<<1)
+#define XIMHighlight           (1L<<2)
+#define XIMPrimary             (1L<<5)
+#define XIMSecondary           (1L<<6)
+#define XIMTertiary            (1L<<7)
+#define XIMVisibleToForward    (1L<<8)
+#define XIMVisibleToBackword   (1L<<9)
+#define XIMVisibleToCenter     (1L<<10)
+
+typedef struct _XIMText {
+    unsigned short length;
+    XIMFeedback *feedback;
+    Bool encoding_is_wchar;
+    union {
+       char *multi_byte;
+       wchar_t *wide_char;
+    } string;
+} XIMText;
+
+typedef        unsigned long    XIMPreeditState;
+
+#define        XIMPreeditUnKnown       0L
+#define        XIMPreeditEnable        1L
+#define        XIMPreeditDisable       (1L<<1)
+
+typedef        struct  _XIMPreeditStateNotifyCallbackStruct {
+    XIMPreeditState state;
+} XIMPreeditStateNotifyCallbackStruct;
+
+typedef        unsigned long    XIMResetState;
+
+#define        XIMInitialState         1L
+#define        XIMPreserveState        (1L<<1)
+
+typedef unsigned long XIMStringConversionFeedback;
+
+#define        XIMStringConversionLeftEdge     (0x00000001)
+#define        XIMStringConversionRightEdge    (0x00000002)
+#define        XIMStringConversionTopEdge      (0x00000004)
+#define        XIMStringConversionBottomEdge   (0x00000008)
+#define        XIMStringConversionConcealed    (0x00000010)
+#define        XIMStringConversionWrapped      (0x00000020)
+
+typedef struct _XIMStringConversionText {
+    unsigned short length;
+    XIMStringConversionFeedback *feedback;
+    Bool encoding_is_wchar;
+    union {
+       char *mbs;
+       wchar_t *wcs;
+    } string;
+} XIMStringConversionText;
+
+typedef        unsigned short  XIMStringConversionPosition;
+
+typedef        unsigned short  XIMStringConversionType;
+
+#define        XIMStringConversionBuffer       (0x0001)
+#define        XIMStringConversionLine         (0x0002)
+#define        XIMStringConversionWord         (0x0003)
+#define        XIMStringConversionChar         (0x0004)
+
+typedef        unsigned short  XIMStringConversionOperation;
+
+#define        XIMStringConversionSubstitution (0x0001)
+#define        XIMStringConversionRetrieval    (0x0002)
+
+typedef enum {
+    XIMForwardChar, XIMBackwardChar,
+    XIMForwardWord, XIMBackwardWord,
+    XIMCaretUp, XIMCaretDown,
+    XIMNextLine, XIMPreviousLine,
+    XIMLineStart, XIMLineEnd,
+    XIMAbsolutePosition,
+    XIMDontChange
+} XIMCaretDirection;
+
+typedef struct _XIMStringConversionCallbackStruct {
+    XIMStringConversionPosition position;
+    XIMCaretDirection direction;
+    XIMStringConversionOperation operation;
+    unsigned short factor;
+    XIMStringConversionText *text;
+} XIMStringConversionCallbackStruct;
+
+typedef struct _XIMPreeditDrawCallbackStruct {
+    int caret;         /* Cursor offset within pre-edit string */
+    int chg_first;     /* Starting change position */
+    int chg_length;    /* Length of the change in character count */
+    XIMText *text;
+} XIMPreeditDrawCallbackStruct;
+
+typedef enum {
+    XIMIsInvisible,    /* Disable caret feedback */
+    XIMIsPrimary,      /* UI defined caret feedback */
+    XIMIsSecondary     /* UI defined caret feedback */
+} XIMCaretStyle;
+
+typedef struct _XIMPreeditCaretCallbackStruct {
+    int position;               /* Caret offset within pre-edit string */
+    XIMCaretDirection direction; /* Caret moves direction */
+    XIMCaretStyle style;        /* Feedback of the caret */
+} XIMPreeditCaretCallbackStruct;
+
+typedef enum {
+    XIMTextType,
+    XIMBitmapType
+} XIMStatusDataType;
+
+typedef struct _XIMStatusDrawCallbackStruct {
+    XIMStatusDataType type;
+    union {
+       XIMText *text;
+       Pixmap  bitmap;
+    } data;
+} XIMStatusDrawCallbackStruct;
+
+typedef struct _XIMHotKeyTrigger {
+    KeySym      keysym;
+    int                 modifier;
+    int                 modifier_mask;
+} XIMHotKeyTrigger;
+
+typedef struct _XIMHotKeyTriggers {
+    int                         num_hot_key;
+    XIMHotKeyTrigger   *key;
+} XIMHotKeyTriggers;
+
+typedef        unsigned long    XIMHotKeyState;
+
+#define        XIMHotKeyStateON        (0x0001L)
+#define        XIMHotKeyStateOFF       (0x0002L)
+
+typedef struct {
+    unsigned short count_values;
+    char **supported_values;
+} XIMValuesList;
+
+_XFUNCPROTOBEGIN
+
+#if defined(WIN32) && !defined(_XLIBINT_)
+#define _Xdebug (*_Xdebug_p)
+#endif
+
+extern int _Xdebug;
+
+extern XFontStruct *XLoadQueryFont(
+    Display*           /* display */,
+    _Xconst char*      /* name */
+);
+
+extern XFontStruct *XQueryFont(
+    Display*           /* display */,
+    XID                        /* font_ID */
+);
+
+
+extern XTimeCoord *XGetMotionEvents(
+    Display*           /* display */,
+    Window             /* w */,
+    Time               /* start */,
+    Time               /* stop */,
+    int*               /* nevents_return */
+);
+
+extern XModifierKeymap *XDeleteModifiermapEntry(
+    XModifierKeymap*   /* modmap */,
+#if NeedWidePrototypes
+    unsigned int       /* keycode_entry */,
+#else
+    KeyCode            /* keycode_entry */,
+#endif
+    int                        /* modifier */
+);
+
+extern XModifierKeymap *XGetModifierMapping(
+    Display*           /* display */
+);
+
+extern XModifierKeymap *XInsertModifiermapEntry(
+    XModifierKeymap*   /* modmap */,
+#if NeedWidePrototypes
+    unsigned int       /* keycode_entry */,
+#else
+    KeyCode            /* keycode_entry */,
+#endif
+    int                        /* modifier */
+);
+
+extern XModifierKeymap *XNewModifiermap(
+    int                        /* max_keys_per_mod */
+);
+
+extern XImage *XCreateImage(
+    Display*           /* display */,
+    Visual*            /* visual */,
+    unsigned int       /* depth */,
+    int                        /* format */,
+    int                        /* offset */,
+    char*              /* data */,
+    unsigned int       /* width */,
+    unsigned int       /* height */,
+    int                        /* bitmap_pad */,
+    int                        /* bytes_per_line */
+);
+extern Status XInitImage(
+    XImage*            /* image */
+);
+extern XImage *XGetImage(
+    Display*           /* display */,
+    Drawable           /* d */,
+    int                        /* x */,
+    int                        /* y */,
+    unsigned int       /* width */,
+    unsigned int       /* height */,
+    unsigned long      /* plane_mask */,
+    int                        /* format */
+);
+extern XImage *XGetSubImage(
+    Display*           /* display */,
+    Drawable           /* d */,
+    int                        /* x */,
+    int                        /* y */,
+    unsigned int       /* width */,
+    unsigned int       /* height */,
+    unsigned long      /* plane_mask */,
+    int                        /* format */,
+    XImage*            /* dest_image */,
+    int                        /* dest_x */,
+    int                        /* dest_y */
+);
+
+/*
+ * X function declarations.
+ */
+extern Display *XOpenDisplay(
+    _Xconst char*      /* display_name */
+);
+
+extern void XrmInitialize(
+    void
+);
+
+extern char *XFetchBytes(
+    Display*           /* display */,
+    int*               /* nbytes_return */
+);
+extern char *XFetchBuffer(
+    Display*           /* display */,
+    int*               /* nbytes_return */,
+    int                        /* buffer */
+);
+extern char *XGetAtomName(
+    Display*           /* display */,
+    Atom               /* atom */
+);
+extern Status XGetAtomNames(
+    Display*           /* dpy */,
+    Atom*              /* atoms */,
+    int                        /* count */,
+    char**             /* names_return */
+);
+extern char *XGetDefault(
+    Display*           /* display */,
+    _Xconst char*      /* program */,
+    _Xconst char*      /* option */
+);
+extern char *XDisplayName(
+    _Xconst char*      /* string */
+);
+extern char *XKeysymToString(
+    KeySym             /* keysym */
+);
+
+extern int (*XSynchronize(
+    Display*           /* display */,
+    Bool               /* onoff */
+))(
+    Display*           /* display */
+);
+extern int (*XSetAfterFunction(
+    Display*           /* display */,
+    int (*) (
+            Display*   /* display */
+            )          /* procedure */
+))(
+    Display*           /* display */
+);
+extern Atom XInternAtom(
+    Display*           /* display */,
+    _Xconst char*      /* atom_name */,
+    Bool               /* only_if_exists */
+);
+extern Status XInternAtoms(
+    Display*           /* dpy */,
+    char**             /* names */,
+    int                        /* count */,
+    Bool               /* onlyIfExists */,
+    Atom*              /* atoms_return */
+);
+extern Colormap XCopyColormapAndFree(
+    Display*           /* display */,
+    Colormap           /* colormap */
+);
+extern Colormap XCreateColormap(
+    Display*           /* display */,
+    Window             /* w */,
+    Visual*            /* visual */,
+    int                        /* alloc */
+);
+extern Cursor XCreatePixmapCursor(
+    Display*           /* display */,
+    Pixmap             /* source */,
+    Pixmap             /* mask */,
+    XColor*            /* foreground_color */,
+    XColor*            /* background_color */,
+    unsigned int       /* x */,
+    unsigned int       /* y */
+);
+extern Cursor XCreateGlyphCursor(
+    Display*           /* display */,
+    Font               /* source_font */,
+    Font               /* mask_font */,
+    unsigned int       /* source_char */,
+    unsigned int       /* mask_char */,
+    XColor _Xconst *   /* foreground_color */,
+    XColor _Xconst *   /* background_color */
+);
+extern Cursor XCreateFontCursor(
+    Display*           /* display */,
+    unsigned int       /* shape */
+);
+extern Font XLoadFont(
+    Display*           /* display */,
+    _Xconst char*      /* name */
+);
+extern GC XCreateGC(
+    Display*           /* display */,
+    Drawable           /* d */,
+    unsigned long      /* valuemask */,
+    XGCValues*         /* values */
+);
+extern GContext XGContextFromGC(
+    GC                 /* gc */
+);
+extern void XFlushGC(
+    Display*           /* display */,
+    GC                 /* gc */
+);
+extern Pixmap XCreatePixmap(
+    Display*           /* display */,
+    Drawable           /* d */,
+    unsigned int       /* width */,
+    unsigned int       /* height */,
+    unsigned int       /* depth */
+);
+extern Pixmap XCreateBitmapFromData(
+    Display*           /* display */,
+    Drawable           /* d */,
+    _Xconst char*      /* data */,
+    unsigned int       /* width */,
+    unsigned int       /* height */
+);
+extern Pixmap XCreatePixmapFromBitmapData(
+    Display*           /* display */,
+    Drawable           /* d */,
+    char*              /* data */,
+    unsigned int       /* width */,
+    unsigned int       /* height */,
+    unsigned long      /* fg */,
+    unsigned long      /* bg */,
+    unsigned int       /* depth */
+);
+extern Window XCreateSimpleWindow(
+    Display*           /* display */,
+    Window             /* parent */,
+    int                        /* x */,
+    int                        /* y */,
+    unsigned int       /* width */,
+    unsigned int       /* height */,
+    unsigned int       /* border_width */,
+    unsigned long      /* border */,
+    unsigned long      /* background */
+);
+extern Window XGetSelectionOwner(
+    Display*           /* display */,
+    Atom               /* selection */
+);
+extern Window XCreateWindow(
+    Display*           /* display */,
+    Window             /* parent */,
+    int                        /* x */,
+    int                        /* y */,
+    unsigned int       /* width */,
+    unsigned int       /* height */,
+    unsigned int       /* border_width */,
+    int                        /* depth */,
+    unsigned int       /* class */,
+    Visual*            /* visual */,
+    unsigned long      /* valuemask */,
+    XSetWindowAttributes*      /* attributes */
+);
+extern Colormap *XListInstalledColormaps(
+    Display*           /* display */,
+    Window             /* w */,
+    int*               /* num_return */
+);
+extern char **XListFonts(
+    Display*           /* display */,
+    _Xconst char*      /* pattern */,
+    int                        /* maxnames */,
+    int*               /* actual_count_return */
+);
+extern char **XListFontsWithInfo(
+    Display*           /* display */,
+    _Xconst char*      /* pattern */,
+    int                        /* maxnames */,
+    int*               /* count_return */,
+    XFontStruct**      /* info_return */
+);
+extern char **XGetFontPath(
+    Display*           /* display */,
+    int*               /* npaths_return */
+);
+extern char **XListExtensions(
+    Display*           /* display */,
+    int*               /* nextensions_return */
+);
+extern Atom *XListProperties(
+    Display*           /* display */,
+    Window             /* w */,
+    int*               /* num_prop_return */
+);
+extern XHostAddress *XListHosts(
+    Display*           /* display */,
+    int*               /* nhosts_return */,
+    Bool*              /* state_return */
+);
+_X_DEPRECATED
+extern KeySym XKeycodeToKeysym(
+    Display*           /* display */,
+#if NeedWidePrototypes
+    unsigned int       /* keycode */,
+#else
+    KeyCode            /* keycode */,
+#endif
+    int                        /* index */
+);
+extern KeySym XLookupKeysym(
+    XKeyEvent*         /* key_event */,
+    int                        /* index */
+);
+extern KeySym *XGetKeyboardMapping(
+    Display*           /* display */,
+#if NeedWidePrototypes
+    unsigned int       /* first_keycode */,
+#else
+    KeyCode            /* first_keycode */,
+#endif
+    int                        /* keycode_count */,
+    int*               /* keysyms_per_keycode_return */
+);
+extern KeySym XStringToKeysym(
+    _Xconst char*      /* string */
+);
+extern long XMaxRequestSize(
+    Display*           /* display */
+);
+extern long XExtendedMaxRequestSize(
+    Display*           /* display */
+);
+extern char *XResourceManagerString(
+    Display*           /* display */
+);
+extern char *XScreenResourceString(
+       Screen*         /* screen */
+);
+extern unsigned long XDisplayMotionBufferSize(
+    Display*           /* display */
+);
+extern VisualID XVisualIDFromVisual(
+    Visual*            /* visual */
+);
+
+/* multithread routines */
+
+extern Status XInitThreads(
+    void
+);
+
+extern void XLockDisplay(
+    Display*           /* display */
+);
+
+extern void XUnlockDisplay(
+    Display*           /* display */
+);
+
+/* routines for dealing with extensions */
+
+extern XExtCodes *XInitExtension(
+    Display*           /* display */,
+    _Xconst char*      /* name */
+);
+
+extern XExtCodes *XAddExtension(
+    Display*           /* display */
+);
+extern XExtData *XFindOnExtensionList(
+    XExtData**         /* structure */,
+    int                        /* number */
+);
+extern XExtData **XEHeadOfExtensionList(
+    XEDataObject       /* object */
+);
+
+/* these are routines for which there are also macros */
+extern Window XRootWindow(
+    Display*           /* display */,
+    int                        /* screen_number */
+);
+extern Window XDefaultRootWindow(
+    Display*           /* display */
+);
+extern Window XRootWindowOfScreen(
+    Screen*            /* screen */
+);
+extern Visual *XDefaultVisual(
+    Display*           /* display */,
+    int                        /* screen_number */
+);
+extern Visual *XDefaultVisualOfScreen(
+    Screen*            /* screen */
+);
+extern GC XDefaultGC(
+    Display*           /* display */,
+    int                        /* screen_number */
+);
+extern GC XDefaultGCOfScreen(
+    Screen*            /* screen */
+);
+extern unsigned long XBlackPixel(
+    Display*           /* display */,
+    int                        /* screen_number */
+);
+extern unsigned long XWhitePixel(
+    Display*           /* display */,
+    int                        /* screen_number */
+);
+extern unsigned long XAllPlanes(
+    void
+);
+extern unsigned long XBlackPixelOfScreen(
+    Screen*            /* screen */
+);
+extern unsigned long XWhitePixelOfScreen(
+    Screen*            /* screen */
+);
+extern unsigned long XNextRequest(
+    Display*           /* display */
+);
+extern unsigned long XLastKnownRequestProcessed(
+    Display*           /* display */
+);
+extern char *XServerVendor(
+    Display*           /* display */
+);
+extern char *XDisplayString(
+    Display*           /* display */
+);
+extern Colormap XDefaultColormap(
+    Display*           /* display */,
+    int                        /* screen_number */
+);
+extern Colormap XDefaultColormapOfScreen(
+    Screen*            /* screen */
+);
+extern Display *XDisplayOfScreen(
+    Screen*            /* screen */
+);
+extern Screen *XScreenOfDisplay(
+    Display*           /* display */,
+    int                        /* screen_number */
+);
+extern Screen *XDefaultScreenOfDisplay(
+    Display*           /* display */
+);
+extern long XEventMaskOfScreen(
+    Screen*            /* screen */
+);
+
+extern int XScreenNumberOfScreen(
+    Screen*            /* screen */
+);
+
+typedef int (*XErrorHandler) (     /* WARNING, this type not in Xlib spec */
+    Display*           /* display */,
+    XErrorEvent*       /* error_event */
+);
+
+extern XErrorHandler XSetErrorHandler (
+    XErrorHandler      /* handler */
+);
+
+
+typedef int (*XIOErrorHandler) (    /* WARNING, this type not in Xlib spec */
+    Display*           /* display */
+);
+
+extern XIOErrorHandler XSetIOErrorHandler (
+    XIOErrorHandler    /* handler */
+);
+
+
+extern XPixmapFormatValues *XListPixmapFormats(
+    Display*           /* display */,
+    int*               /* count_return */
+);
+extern int *XListDepths(
+    Display*           /* display */,
+    int                        /* screen_number */,
+    int*               /* count_return */
+);
+
+/* ICCCM routines for things that don't require special include files; */
+/* other declarations are given in Xutil.h                             */
+extern Status XReconfigureWMWindow(
+    Display*           /* display */,
+    Window             /* w */,
+    int                        /* screen_number */,
+    unsigned int       /* mask */,
+    XWindowChanges*    /* changes */
+);
+
+extern Status XGetWMProtocols(
+    Display*           /* display */,
+    Window             /* w */,
+    Atom**             /* protocols_return */,
+    int*               /* count_return */
+);
+extern Status XSetWMProtocols(
+    Display*           /* display */,
+    Window             /* w */,
+    Atom*              /* protocols */,
+    int                        /* count */
+);
+extern Status XIconifyWindow(
+    Display*           /* display */,
+    Window             /* w */,
+    int                        /* screen_number */
+);
+extern Status XWithdrawWindow(
+    Display*           /* display */,
+    Window             /* w */,
+    int                        /* screen_number */
+);
+extern Status XGetCommand(
+    Display*           /* display */,
+    Window             /* w */,
+    char***            /* argv_return */,
+    int*               /* argc_return */
+);
+extern Status XGetWMColormapWindows(
+    Display*           /* display */,
+    Window             /* w */,
+    Window**           /* windows_return */,
+    int*               /* count_return */
+);
+extern Status XSetWMColormapWindows(
+    Display*           /* display */,
+    Window             /* w */,
+    Window*            /* colormap_windows */,
+    int                        /* count */
+);
+extern void XFreeStringList(
+    char**             /* list */
+);
+extern int XSetTransientForHint(
+    Display*           /* display */,
+    Window             /* w */,
+    Window             /* prop_window */
+);
+
+/* The following are given in alphabetical order */
+
+extern int XActivateScreenSaver(
+    Display*           /* display */
+);
+
+extern int XAddHost(
+    Display*           /* display */,
+    XHostAddress*      /* host */
+);
+
+extern int XAddHosts(
+    Display*           /* display */,
+    XHostAddress*      /* hosts */,
+    int                        /* num_hosts */
+);
+
+extern int XAddToExtensionList(
+    struct _XExtData** /* structure */,
+    XExtData*          /* ext_data */
+);
+
+extern int XAddToSaveSet(
+    Display*           /* display */,
+    Window             /* w */
+);
+
+extern Status XAllocColor(
+    Display*           /* display */,
+    Colormap           /* colormap */,
+    XColor*            /* screen_in_out */
+);
+
+extern Status XAllocColorCells(
+    Display*           /* display */,
+    Colormap           /* colormap */,
+    Bool               /* contig */,
+    unsigned long*     /* plane_masks_return */,
+    unsigned int       /* nplanes */,
+    unsigned long*     /* pixels_return */,
+    unsigned int       /* npixels */
+);
+
+extern Status XAllocColorPlanes(
+    Display*           /* display */,
+    Colormap           /* colormap */,
+    Bool               /* contig */,
+    unsigned long*     /* pixels_return */,
+    int                        /* ncolors */,
+    int                        /* nreds */,
+    int                        /* ngreens */,
+    int                        /* nblues */,
+    unsigned long*     /* rmask_return */,
+    unsigned long*     /* gmask_return */,
+    unsigned long*     /* bmask_return */
+);
+
+extern Status XAllocNamedColor(
+    Display*           /* display */,
+    Colormap           /* colormap */,
+    _Xconst char*      /* color_name */,
+    XColor*            /* screen_def_return */,
+    XColor*            /* exact_def_return */
+);
+
+extern int XAllowEvents(
+    Display*           /* display */,
+    int                        /* event_mode */,
+    Time               /* time */
+);
+
+extern int XAutoRepeatOff(
+    Display*           /* display */
+);
+
+extern int XAutoRepeatOn(
+    Display*           /* display */
+);
+
+extern int XBell(
+    Display*           /* display */,
+    int                        /* percent */
+);
+
+extern int XBitmapBitOrder(
+    Display*           /* display */
+);
+
+extern int XBitmapPad(
+    Display*           /* display */
+);
+
+extern int XBitmapUnit(
+    Display*           /* display */
+);
+
+extern int XCellsOfScreen(
+    Screen*            /* screen */
+);
+
+extern int XChangeActivePointerGrab(
+    Display*           /* display */,
+    unsigned int       /* event_mask */,
+    Cursor             /* cursor */,
+    Time               /* time */
+);
+
+extern int XChangeGC(
+    Display*           /* display */,
+    GC                 /* gc */,
+    unsigned long      /* valuemask */,
+    XGCValues*         /* values */
+);
+
+extern int XChangeKeyboardControl(
+    Display*           /* display */,
+    unsigned long      /* value_mask */,
+    XKeyboardControl*  /* values */
+);
+
+extern int XChangeKeyboardMapping(
+    Display*           /* display */,
+    int                        /* first_keycode */,
+    int                        /* keysyms_per_keycode */,
+    KeySym*            /* keysyms */,
+    int                        /* num_codes */
+);
+
+extern int XChangePointerControl(
+    Display*           /* display */,
+    Bool               /* do_accel */,
+    Bool               /* do_threshold */,
+    int                        /* accel_numerator */,
+    int                        /* accel_denominator */,
+    int                        /* threshold */
+);
+
+extern int XChangeProperty(
+    Display*           /* display */,
+    Window             /* w */,
+    Atom               /* property */,
+    Atom               /* type */,
+    int                        /* format */,
+    int                        /* mode */,
+    _Xconst unsigned char*     /* data */,
+    int                        /* nelements */
+);
+
+extern int XChangeSaveSet(
+    Display*           /* display */,
+    Window             /* w */,
+    int                        /* change_mode */
+);
+
+extern int XChangeWindowAttributes(
+    Display*           /* display */,
+    Window             /* w */,
+    unsigned long      /* valuemask */,
+    XSetWindowAttributes* /* attributes */
+);
+
+extern Bool XCheckIfEvent(
+    Display*           /* display */,
+    XEvent*            /* event_return */,
+    Bool (*) (
+              Display*                 /* display */,
+               XEvent*                 /* event */,
+               XPointer                        /* arg */
+             )         /* predicate */,
+    XPointer           /* arg */
+);
+
+extern Bool XCheckMaskEvent(
+    Display*           /* display */,
+    long               /* event_mask */,
+    XEvent*            /* event_return */
+);
+
+extern Bool XCheckTypedEvent(
+    Display*           /* display */,
+    int                        /* event_type */,
+    XEvent*            /* event_return */
+);
+
+extern Bool XCheckTypedWindowEvent(
+    Display*           /* display */,
+    Window             /* w */,
+    int                        /* event_type */,
+    XEvent*            /* event_return */
+);
+
+extern Bool XCheckWindowEvent(
+    Display*           /* display */,
+    Window             /* w */,
+    long               /* event_mask */,
+    XEvent*            /* event_return */
+);
+
+extern int XCirculateSubwindows(
+    Display*           /* display */,
+    Window             /* w */,
+    int                        /* direction */
+);
+
+extern int XCirculateSubwindowsDown(
+    Display*           /* display */,
+    Window             /* w */
+);
+
+extern int XCirculateSubwindowsUp(
+    Display*           /* display */,
+    Window             /* w */
+);
+
+extern int XClearArea(
+    Display*           /* display */,
+    Window             /* w */,
+    int                        /* x */,
+    int                        /* y */,
+    unsigned int       /* width */,
+    unsigned int       /* height */,
+    Bool               /* exposures */
+);
+
+extern int XClearWindow(
+    Display*           /* display */,
+    Window             /* w */
+);
+
+extern int XCloseDisplay(
+    Display*           /* display */
+);
+
+extern int XConfigureWindow(
+    Display*           /* display */,
+    Window             /* w */,
+    unsigned int       /* value_mask */,
+    XWindowChanges*    /* values */
+);
+
+extern int XConnectionNumber(
+    Display*           /* display */
+);
+
+extern int XConvertSelection(
+    Display*           /* display */,
+    Atom               /* selection */,
+    Atom               /* target */,
+    Atom               /* property */,
+    Window             /* requestor */,
+    Time               /* time */
+);
+
+extern int XCopyArea(
+    Display*           /* display */,
+    Drawable           /* src */,
+    Drawable           /* dest */,
+    GC                 /* gc */,
+    int                        /* src_x */,
+    int                        /* src_y */,
+    unsigned int       /* width */,
+    unsigned int       /* height */,
+    int                        /* dest_x */,
+    int                        /* dest_y */
+);
+
+extern int XCopyGC(
+    Display*           /* display */,
+    GC                 /* src */,
+    unsigned long      /* valuemask */,
+    GC                 /* dest */
+);
+
+extern int XCopyPlane(
+    Display*           /* display */,
+    Drawable           /* src */,
+    Drawable           /* dest */,
+    GC                 /* gc */,
+    int                        /* src_x */,
+    int                        /* src_y */,
+    unsigned int       /* width */,
+    unsigned int       /* height */,
+    int                        /* dest_x */,
+    int                        /* dest_y */,
+    unsigned long      /* plane */
+);
+
+extern int XDefaultDepth(
+    Display*           /* display */,
+    int                        /* screen_number */
+);
+
+extern int XDefaultDepthOfScreen(
+    Screen*            /* screen */
+);
+
+extern int XDefaultScreen(
+    Display*           /* display */
+);
+
+extern int XDefineCursor(
+    Display*           /* display */,
+    Window             /* w */,
+    Cursor             /* cursor */
+);
+
+extern int XDeleteProperty(
+    Display*           /* display */,
+    Window             /* w */,
+    Atom               /* property */
+);
+
+extern int XDestroyWindow(
+    Display*           /* display */,
+    Window             /* w */
+);
+
+extern int XDestroySubwindows(
+    Display*           /* display */,
+    Window             /* w */
+);
+
+extern int XDoesBackingStore(
+    Screen*            /* screen */
+);
+
+extern Bool XDoesSaveUnders(
+    Screen*            /* screen */
+);
+
+extern int XDisableAccessControl(
+    Display*           /* display */
+);
+
+
+extern int XDisplayCells(
+    Display*           /* display */,
+    int                        /* screen_number */
+);
+
+extern int XDisplayHeight(
+    Display*           /* display */,
+    int                        /* screen_number */
+);
+
+extern int XDisplayHeightMM(
+    Display*           /* display */,
+    int                        /* screen_number */
+);
+
+extern int XDisplayKeycodes(
+    Display*           /* display */,
+    int*               /* min_keycodes_return */,
+    int*               /* max_keycodes_return */
+);
+
+extern int XDisplayPlanes(
+    Display*           /* display */,
+    int                        /* screen_number */
+);
+
+extern int XDisplayWidth(
+    Display*           /* display */,
+    int                        /* screen_number */
+);
+
+extern int XDisplayWidthMM(
+    Display*           /* display */,
+    int                        /* screen_number */
+);
+
+extern int XDrawArc(
+    Display*           /* display */,
+    Drawable           /* d */,
+    GC                 /* gc */,
+    int                        /* x */,
+    int                        /* y */,
+    unsigned int       /* width */,
+    unsigned int       /* height */,
+    int                        /* angle1 */,
+    int                        /* angle2 */
+);
+
+extern int XDrawArcs(
+    Display*           /* display */,
+    Drawable           /* d */,
+    GC                 /* gc */,
+    XArc*              /* arcs */,
+    int                        /* narcs */
+);
+
+extern int XDrawImageString(
+    Display*           /* display */,
+    Drawable           /* d */,
+    GC                 /* gc */,
+    int                        /* x */,
+    int                        /* y */,
+    _Xconst char*      /* string */,
+    int                        /* length */
+);
+
+extern int XDrawImageString16(
+    Display*           /* display */,
+    Drawable           /* d */,
+    GC                 /* gc */,
+    int                        /* x */,
+    int                        /* y */,
+    _Xconst XChar2b*   /* string */,
+    int                        /* length */
+);
+
+extern int XDrawLine(
+    Display*           /* display */,
+    Drawable           /* d */,
+    GC                 /* gc */,
+    int                        /* x1 */,
+    int                        /* y1 */,
+    int                        /* x2 */,
+    int                        /* y2 */
+);
+
+extern int XDrawLines(
+    Display*           /* display */,
+    Drawable           /* d */,
+    GC                 /* gc */,
+    XPoint*            /* points */,
+    int                        /* npoints */,
+    int                        /* mode */
+);
+
+extern int XDrawPoint(
+    Display*           /* display */,
+    Drawable           /* d */,
+    GC                 /* gc */,
+    int                        /* x */,
+    int                        /* y */
+);
+
+extern int XDrawPoints(
+    Display*           /* display */,
+    Drawable           /* d */,
+    GC                 /* gc */,
+    XPoint*            /* points */,
+    int                        /* npoints */,
+    int                        /* mode */
+);
+
+extern int XDrawRectangle(
+    Display*           /* display */,
+    Drawable           /* d */,
+    GC                 /* gc */,
+    int                        /* x */,
+    int                        /* y */,
+    unsigned int       /* width */,
+    unsigned int       /* height */
+);
+
+extern int XDrawRectangles(
+    Display*           /* display */,
+    Drawable           /* d */,
+    GC                 /* gc */,
+    XRectangle*                /* rectangles */,
+    int                        /* nrectangles */
+);
+
+extern int XDrawSegments(
+    Display*           /* display */,
+    Drawable           /* d */,
+    GC                 /* gc */,
+    XSegment*          /* segments */,
+    int                        /* nsegments */
+);
+
+extern int XDrawString(
+    Display*           /* display */,
+    Drawable           /* d */,
+    GC                 /* gc */,
+    int                        /* x */,
+    int                        /* y */,
+    _Xconst char*      /* string */,
+    int                        /* length */
+);
+
+extern int XDrawString16(
+    Display*           /* display */,
+    Drawable           /* d */,
+    GC                 /* gc */,
+    int                        /* x */,
+    int                        /* y */,
+    _Xconst XChar2b*   /* string */,
+    int                        /* length */
+);
+
+extern int XDrawText(
+    Display*           /* display */,
+    Drawable           /* d */,
+    GC                 /* gc */,
+    int                        /* x */,
+    int                        /* y */,
+    XTextItem*         /* items */,
+    int                        /* nitems */
+);
+
+extern int XDrawText16(
+    Display*           /* display */,
+    Drawable           /* d */,
+    GC                 /* gc */,
+    int                        /* x */,
+    int                        /* y */,
+    XTextItem16*       /* items */,
+    int                        /* nitems */
+);
+
+extern int XEnableAccessControl(
+    Display*           /* display */
+);
+
+extern int XEventsQueued(
+    Display*           /* display */,
+    int                        /* mode */
+);
+
+extern Status XFetchName(
+    Display*           /* display */,
+    Window             /* w */,
+    char**             /* window_name_return */
+);
+
+extern int XFillArc(
+    Display*           /* display */,
+    Drawable           /* d */,
+    GC                 /* gc */,
+    int                        /* x */,
+    int                        /* y */,
+    unsigned int       /* width */,
+    unsigned int       /* height */,
+    int                        /* angle1 */,
+    int                        /* angle2 */
+);
+
+extern int XFillArcs(
+    Display*           /* display */,
+    Drawable           /* d */,
+    GC                 /* gc */,
+    XArc*              /* arcs */,
+    int                        /* narcs */
+);
+
+extern int XFillPolygon(
+    Display*           /* display */,
+    Drawable           /* d */,
+    GC                 /* gc */,
+    XPoint*            /* points */,
+    int                        /* npoints */,
+    int                        /* shape */,
+    int                        /* mode */
+);
+
+extern int XFillRectangle(
+    Display*           /* display */,
+    Drawable           /* d */,
+    GC                 /* gc */,
+    int                        /* x */,
+    int                        /* y */,
+    unsigned int       /* width */,
+    unsigned int       /* height */
+);
+
+extern int XFillRectangles(
+    Display*           /* display */,
+    Drawable           /* d */,
+    GC                 /* gc */,
+    XRectangle*                /* rectangles */,
+    int                        /* nrectangles */
+);
+
+extern int XFlush(
+    Display*           /* display */
+);
+
+extern int XForceScreenSaver(
+    Display*           /* display */,
+    int                        /* mode */
+);
+
+extern int XFree(
+    void*              /* data */
+);
+
+extern int XFreeColormap(
+    Display*           /* display */,
+    Colormap           /* colormap */
+);
+
+extern int XFreeColors(
+    Display*           /* display */,
+    Colormap           /* colormap */,
+    unsigned long*     /* pixels */,
+    int                        /* npixels */,
+    unsigned long      /* planes */
+);
+
+extern int XFreeCursor(
+    Display*           /* display */,
+    Cursor             /* cursor */
+);
+
+extern int XFreeExtensionList(
+    char**             /* list */
+);
+
+extern int XFreeFont(
+    Display*           /* display */,
+    XFontStruct*       /* font_struct */
+);
+
+extern int XFreeFontInfo(
+    char**             /* names */,
+    XFontStruct*       /* free_info */,
+    int                        /* actual_count */
+);
+
+extern int XFreeFontNames(
+    char**             /* list */
+);
+
+extern int XFreeFontPath(
+    char**             /* list */
+);
+
+extern int XFreeGC(
+    Display*           /* display */,
+    GC                 /* gc */
+);
+
+extern int XFreeModifiermap(
+    XModifierKeymap*   /* modmap */
+);
+
+extern int XFreePixmap(
+    Display*           /* display */,
+    Pixmap             /* pixmap */
+);
+
+extern int XGeometry(
+    Display*           /* display */,
+    int                        /* screen */,
+    _Xconst char*      /* position */,
+    _Xconst char*      /* default_position */,
+    unsigned int       /* bwidth */,
+    unsigned int       /* fwidth */,
+    unsigned int       /* fheight */,
+    int                        /* xadder */,
+    int                        /* yadder */,
+    int*               /* x_return */,
+    int*               /* y_return */,
+    int*               /* width_return */,
+    int*               /* height_return */
+);
+
+extern int XGetErrorDatabaseText(
+    Display*           /* display */,
+    _Xconst char*      /* name */,
+    _Xconst char*      /* message */,
+    _Xconst char*      /* default_string */,
+    char*              /* buffer_return */,
+    int                        /* length */
+);
+
+extern int XGetErrorText(
+    Display*           /* display */,
+    int                        /* code */,
+    char*              /* buffer_return */,
+    int                        /* length */
+);
+
+extern Bool XGetFontProperty(
+    XFontStruct*       /* font_struct */,
+    Atom               /* atom */,
+    unsigned long*     /* value_return */
+);
+
+extern Status XGetGCValues(
+    Display*           /* display */,
+    GC                 /* gc */,
+    unsigned long      /* valuemask */,
+    XGCValues*         /* values_return */
+);
+
+extern Status XGetGeometry(
+    Display*           /* display */,
+    Drawable           /* d */,
+    Window*            /* root_return */,
+    int*               /* x_return */,
+    int*               /* y_return */,
+    unsigned int*      /* width_return */,
+    unsigned int*      /* height_return */,
+    unsigned int*      /* border_width_return */,
+    unsigned int*      /* depth_return */
+);
+
+extern Status XGetIconName(
+    Display*           /* display */,
+    Window             /* w */,
+    char**             /* icon_name_return */
+);
+
+extern int XGetInputFocus(
+    Display*           /* display */,
+    Window*            /* focus_return */,
+    int*               /* revert_to_return */
+);
+
+extern int XGetKeyboardControl(
+    Display*           /* display */,
+    XKeyboardState*    /* values_return */
+);
+
+extern int XGetPointerControl(
+    Display*           /* display */,
+    int*               /* accel_numerator_return */,
+    int*               /* accel_denominator_return */,
+    int*               /* threshold_return */
+);
+
+extern int XGetPointerMapping(
+    Display*           /* display */,
+    unsigned char*     /* map_return */,
+    int                        /* nmap */
+);
+
+extern int XGetScreenSaver(
+    Display*           /* display */,
+    int*               /* timeout_return */,
+    int*               /* interval_return */,
+    int*               /* prefer_blanking_return */,
+    int*               /* allow_exposures_return */
+);
+
+extern Status XGetTransientForHint(
+    Display*           /* display */,
+    Window             /* w */,
+    Window*            /* prop_window_return */
+);
+
+extern int XGetWindowProperty(
+    Display*           /* display */,
+    Window             /* w */,
+    Atom               /* property */,
+    long               /* long_offset */,
+    long               /* long_length */,
+    Bool               /* delete */,
+    Atom               /* req_type */,
+    Atom*              /* actual_type_return */,
+    int*               /* actual_format_return */,
+    unsigned long*     /* nitems_return */,
+    unsigned long*     /* bytes_after_return */,
+    unsigned char**    /* prop_return */
+);
+
+extern Status XGetWindowAttributes(
+    Display*           /* display */,
+    Window             /* w */,
+    XWindowAttributes* /* window_attributes_return */
+);
+
+extern int XGrabButton(
+    Display*           /* display */,
+    unsigned int       /* button */,
+    unsigned int       /* modifiers */,
+    Window             /* grab_window */,
+    Bool               /* owner_events */,
+    unsigned int       /* event_mask */,
+    int                        /* pointer_mode */,
+    int                        /* keyboard_mode */,
+    Window             /* confine_to */,
+    Cursor             /* cursor */
+);
+
+extern int XGrabKey(
+    Display*           /* display */,
+    int                        /* keycode */,
+    unsigned int       /* modifiers */,
+    Window             /* grab_window */,
+    Bool               /* owner_events */,
+    int                        /* pointer_mode */,
+    int                        /* keyboard_mode */
+);
+
+extern int XGrabKeyboard(
+    Display*           /* display */,
+    Window             /* grab_window */,
+    Bool               /* owner_events */,
+    int                        /* pointer_mode */,
+    int                        /* keyboard_mode */,
+    Time               /* time */
+);
+
+extern int XGrabPointer(
+    Display*           /* display */,
+    Window             /* grab_window */,
+    Bool               /* owner_events */,
+    unsigned int       /* event_mask */,
+    int                        /* pointer_mode */,
+    int                        /* keyboard_mode */,
+    Window             /* confine_to */,
+    Cursor             /* cursor */,
+    Time               /* time */
+);
+
+extern int XGrabServer(
+    Display*           /* display */
+);
+
+extern int XHeightMMOfScreen(
+    Screen*            /* screen */
+);
+
+extern int XHeightOfScreen(
+    Screen*            /* screen */
+);
+
+extern int XIfEvent(
+    Display*           /* display */,
+    XEvent*            /* event_return */,
+    Bool (*) (
+              Display*                 /* display */,
+               XEvent*                 /* event */,
+               XPointer                        /* arg */
+             )         /* predicate */,
+    XPointer           /* arg */
+);
+
+extern int XImageByteOrder(
+    Display*           /* display */
+);
+
+extern int XInstallColormap(
+    Display*           /* display */,
+    Colormap           /* colormap */
+);
+
+extern KeyCode XKeysymToKeycode(
+    Display*           /* display */,
+    KeySym             /* keysym */
+);
+
+extern int XKillClient(
+    Display*           /* display */,
+    XID                        /* resource */
+);
+
+extern Status XLookupColor(
+    Display*           /* display */,
+    Colormap           /* colormap */,
+    _Xconst char*      /* color_name */,
+    XColor*            /* exact_def_return */,
+    XColor*            /* screen_def_return */
+);
+
+extern int XLowerWindow(
+    Display*           /* display */,
+    Window             /* w */
+);
+
+extern int XMapRaised(
+    Display*           /* display */,
+    Window             /* w */
+);
+
+extern int XMapSubwindows(
+    Display*           /* display */,
+    Window             /* w */
+);
+
+extern int XMapWindow(
+    Display*           /* display */,
+    Window             /* w */
+);
+
+extern int XMaskEvent(
+    Display*           /* display */,
+    long               /* event_mask */,
+    XEvent*            /* event_return */
+);
+
+extern int XMaxCmapsOfScreen(
+    Screen*            /* screen */
+);
+
+extern int XMinCmapsOfScreen(
+    Screen*            /* screen */
+);
+
+extern int XMoveResizeWindow(
+    Display*           /* display */,
+    Window             /* w */,
+    int                        /* x */,
+    int                        /* y */,
+    unsigned int       /* width */,
+    unsigned int       /* height */
+);
+
+extern int XMoveWindow(
+    Display*           /* display */,
+    Window             /* w */,
+    int                        /* x */,
+    int                        /* y */
+);
+
+extern int XNextEvent(
+    Display*           /* display */,
+    XEvent*            /* event_return */
+);
+
+extern int XNoOp(
+    Display*           /* display */
+);
+
+extern Status XParseColor(
+    Display*           /* display */,
+    Colormap           /* colormap */,
+    _Xconst char*      /* spec */,
+    XColor*            /* exact_def_return */
+);
+
+extern int XParseGeometry(
+    _Xconst char*      /* parsestring */,
+    int*               /* x_return */,
+    int*               /* y_return */,
+    unsigned int*      /* width_return */,
+    unsigned int*      /* height_return */
+);
+
+extern int XPeekEvent(
+    Display*           /* display */,
+    XEvent*            /* event_return */
+);
+
+extern int XPeekIfEvent(
+    Display*           /* display */,
+    XEvent*            /* event_return */,
+    Bool (*) (
+              Display*         /* display */,
+               XEvent*         /* event */,
+               XPointer                /* arg */
+             )         /* predicate */,
+    XPointer           /* arg */
+);
+
+extern int XPending(
+    Display*           /* display */
+);
+
+extern int XPlanesOfScreen(
+    Screen*            /* screen */
+);
+
+extern int XProtocolRevision(
+    Display*           /* display */
+);
+
+extern int XProtocolVersion(
+    Display*           /* display */
+);
+
+
+extern int XPutBackEvent(
+    Display*           /* display */,
+    XEvent*            /* event */
+);
+
+extern int XPutImage(
+    Display*           /* display */,
+    Drawable           /* d */,
+    GC                 /* gc */,
+    XImage*            /* image */,
+    int                        /* src_x */,
+    int                        /* src_y */,
+    int                        /* dest_x */,
+    int                        /* dest_y */,
+    unsigned int       /* width */,
+    unsigned int       /* height */
+);
+
+extern int XQLength(
+    Display*           /* display */
+);
+
+extern Status XQueryBestCursor(
+    Display*           /* display */,
+    Drawable           /* d */,
+    unsigned int        /* width */,
+    unsigned int       /* height */,
+    unsigned int*      /* width_return */,
+    unsigned int*      /* height_return */
+);
+
+extern Status XQueryBestSize(
+    Display*           /* display */,
+    int                        /* class */,
+    Drawable           /* which_screen */,
+    unsigned int       /* width */,
+    unsigned int       /* height */,
+    unsigned int*      /* width_return */,
+    unsigned int*      /* height_return */
+);
+
+extern Status XQueryBestStipple(
+    Display*           /* display */,
+    Drawable           /* which_screen */,
+    unsigned int       /* width */,
+    unsigned int       /* height */,
+    unsigned int*      /* width_return */,
+    unsigned int*      /* height_return */
+);
+
+extern Status XQueryBestTile(
+    Display*           /* display */,
+    Drawable           /* which_screen */,
+    unsigned int       /* width */,
+    unsigned int       /* height */,
+    unsigned int*      /* width_return */,
+    unsigned int*      /* height_return */
+);
+
+extern int XQueryColor(
+    Display*           /* display */,
+    Colormap           /* colormap */,
+    XColor*            /* def_in_out */
+);
+
+extern int XQueryColors(
+    Display*           /* display */,
+    Colormap           /* colormap */,
+    XColor*            /* defs_in_out */,
+    int                        /* ncolors */
+);
+
+extern Bool XQueryExtension(
+    Display*           /* display */,
+    _Xconst char*      /* name */,
+    int*               /* major_opcode_return */,
+    int*               /* first_event_return */,
+    int*               /* first_error_return */
+);
+
+extern int XQueryKeymap(
+    Display*           /* display */,
+    char [32]          /* keys_return */
+);
+
+extern Bool XQueryPointer(
+    Display*           /* display */,
+    Window             /* w */,
+    Window*            /* root_return */,
+    Window*            /* child_return */,
+    int*               /* root_x_return */,
+    int*               /* root_y_return */,
+    int*               /* win_x_return */,
+    int*               /* win_y_return */,
+    unsigned int*       /* mask_return */
+);
+
+extern int XQueryTextExtents(
+    Display*           /* display */,
+    XID                        /* font_ID */,
+    _Xconst char*      /* string */,
+    int                        /* nchars */,
+    int*               /* direction_return */,
+    int*               /* font_ascent_return */,
+    int*               /* font_descent_return */,
+    XCharStruct*       /* overall_return */
+);
+
+extern int XQueryTextExtents16(
+    Display*           /* display */,
+    XID                        /* font_ID */,
+    _Xconst XChar2b*   /* string */,
+    int                        /* nchars */,
+    int*               /* direction_return */,
+    int*               /* font_ascent_return */,
+    int*               /* font_descent_return */,
+    XCharStruct*       /* overall_return */
+);
+
+extern Status XQueryTree(
+    Display*           /* display */,
+    Window             /* w */,
+    Window*            /* root_return */,
+    Window*            /* parent_return */,
+    Window**           /* children_return */,
+    unsigned int*      /* nchildren_return */
+);
+
+extern int XRaiseWindow(
+    Display*           /* display */,
+    Window             /* w */
+);
+
+extern int XReadBitmapFile(
+    Display*           /* display */,
+    Drawable           /* d */,
+    _Xconst char*      /* filename */,
+    unsigned int*      /* width_return */,
+    unsigned int*      /* height_return */,
+    Pixmap*            /* bitmap_return */,
+    int*               /* x_hot_return */,
+    int*               /* y_hot_return */
+);
+
+extern int XReadBitmapFileData(
+    _Xconst char*      /* filename */,
+    unsigned int*      /* width_return */,
+    unsigned int*      /* height_return */,
+    unsigned char**    /* data_return */,
+    int*               /* x_hot_return */,
+    int*               /* y_hot_return */
+);
+
+extern int XRebindKeysym(
+    Display*           /* display */,
+    KeySym             /* keysym */,
+    KeySym*            /* list */,
+    int                        /* mod_count */,
+    _Xconst unsigned char*     /* string */,
+    int                        /* bytes_string */
+);
+
+extern int XRecolorCursor(
+    Display*           /* display */,
+    Cursor             /* cursor */,
+    XColor*            /* foreground_color */,
+    XColor*            /* background_color */
+);
+
+extern int XRefreshKeyboardMapping(
+    XMappingEvent*     /* event_map */
+);
+
+extern int XRemoveFromSaveSet(
+    Display*           /* display */,
+    Window             /* w */
+);
+
+extern int XRemoveHost(
+    Display*           /* display */,
+    XHostAddress*      /* host */
+);
+
+extern int XRemoveHosts(
+    Display*           /* display */,
+    XHostAddress*      /* hosts */,
+    int                        /* num_hosts */
+);
+
+extern int XReparentWindow(
+    Display*           /* display */,
+    Window             /* w */,
+    Window             /* parent */,
+    int                        /* x */,
+    int                        /* y */
+);
+
+extern int XResetScreenSaver(
+    Display*           /* display */
+);
+
+extern int XResizeWindow(
+    Display*           /* display */,
+    Window             /* w */,
+    unsigned int       /* width */,
+    unsigned int       /* height */
+);
+
+extern int XRestackWindows(
+    Display*           /* display */,
+    Window*            /* windows */,
+    int                        /* nwindows */
+);
+
+extern int XRotateBuffers(
+    Display*           /* display */,
+    int                        /* rotate */
+);
+
+extern int XRotateWindowProperties(
+    Display*           /* display */,
+    Window             /* w */,
+    Atom*              /* properties */,
+    int                        /* num_prop */,
+    int                        /* npositions */
+);
+
+extern int XScreenCount(
+    Display*           /* display */
+);
+
+extern int XSelectInput(
+    Display*           /* display */,
+    Window             /* w */,
+    long               /* event_mask */
+);
+
+extern Status XSendEvent(
+    Display*           /* display */,
+    Window             /* w */,
+    Bool               /* propagate */,
+    long               /* event_mask */,
+    XEvent*            /* event_send */
+);
+
+extern int XSetAccessControl(
+    Display*           /* display */,
+    int                        /* mode */
+);
+
+extern int XSetArcMode(
+    Display*           /* display */,
+    GC                 /* gc */,
+    int                        /* arc_mode */
+);
+
+extern int XSetBackground(
+    Display*           /* display */,
+    GC                 /* gc */,
+    unsigned long      /* background */
+);
+
+extern int XSetClipMask(
+    Display*           /* display */,
+    GC                 /* gc */,
+    Pixmap             /* pixmap */
+);
+
+extern int XSetClipOrigin(
+    Display*           /* display */,
+    GC                 /* gc */,
+    int                        /* clip_x_origin */,
+    int                        /* clip_y_origin */
+);
+
+extern int XSetClipRectangles(
+    Display*           /* display */,
+    GC                 /* gc */,
+    int                        /* clip_x_origin */,
+    int                        /* clip_y_origin */,
+    XRectangle*                /* rectangles */,
+    int                        /* n */,
+    int                        /* ordering */
+);
+
+extern int XSetCloseDownMode(
+    Display*           /* display */,
+    int                        /* close_mode */
+);
+
+extern int XSetCommand(
+    Display*           /* display */,
+    Window             /* w */,
+    char**             /* argv */,
+    int                        /* argc */
+);
+
+extern int XSetDashes(
+    Display*           /* display */,
+    GC                 /* gc */,
+    int                        /* dash_offset */,
+    _Xconst char*      /* dash_list */,
+    int                        /* n */
+);
+
+extern int XSetFillRule(
+    Display*           /* display */,
+    GC                 /* gc */,
+    int                        /* fill_rule */
+);
+
+extern int XSetFillStyle(
+    Display*           /* display */,
+    GC                 /* gc */,
+    int                        /* fill_style */
+);
+
+extern int XSetFont(
+    Display*           /* display */,
+    GC                 /* gc */,
+    Font               /* font */
+);
+
+extern int XSetFontPath(
+    Display*           /* display */,
+    char**             /* directories */,
+    int                        /* ndirs */
+);
+
+extern int XSetForeground(
+    Display*           /* display */,
+    GC                 /* gc */,
+    unsigned long      /* foreground */
+);
+
+extern int XSetFunction(
+    Display*           /* display */,
+    GC                 /* gc */,
+    int                        /* function */
+);
+
+extern int XSetGraphicsExposures(
+    Display*           /* display */,
+    GC                 /* gc */,
+    Bool               /* graphics_exposures */
+);
+
+extern int XSetIconName(
+    Display*           /* display */,
+    Window             /* w */,
+    _Xconst char*      /* icon_name */
+);
+
+extern int XSetInputFocus(
+    Display*           /* display */,
+    Window             /* focus */,
+    int                        /* revert_to */,
+    Time               /* time */
+);
+
+extern int XSetLineAttributes(
+    Display*           /* display */,
+    GC                 /* gc */,
+    unsigned int       /* line_width */,
+    int                        /* line_style */,
+    int                        /* cap_style */,
+    int                        /* join_style */
+);
+
+extern int XSetModifierMapping(
+    Display*           /* display */,
+    XModifierKeymap*   /* modmap */
+);
+
+extern int XSetPlaneMask(
+    Display*           /* display */,
+    GC                 /* gc */,
+    unsigned long      /* plane_mask */
+);
+
+extern int XSetPointerMapping(
+    Display*           /* display */,
+    _Xconst unsigned char*     /* map */,
+    int                        /* nmap */
+);
+
+extern int XSetScreenSaver(
+    Display*           /* display */,
+    int                        /* timeout */,
+    int                        /* interval */,
+    int                        /* prefer_blanking */,
+    int                        /* allow_exposures */
+);
+
+extern int XSetSelectionOwner(
+    Display*           /* display */,
+    Atom               /* selection */,
+    Window             /* owner */,
+    Time               /* time */
+);
+
+extern int XSetState(
+    Display*           /* display */,
+    GC                 /* gc */,
+    unsigned long      /* foreground */,
+    unsigned long      /* background */,
+    int                        /* function */,
+    unsigned long      /* plane_mask */
+);
+
+extern int XSetStipple(
+    Display*           /* display */,
+    GC                 /* gc */,
+    Pixmap             /* stipple */
+);
+
+extern int XSetSubwindowMode(
+    Display*           /* display */,
+    GC                 /* gc */,
+    int                        /* subwindow_mode */
+);
+
+extern int XSetTSOrigin(
+    Display*           /* display */,
+    GC                 /* gc */,
+    int                        /* ts_x_origin */,
+    int                        /* ts_y_origin */
+);
+
+extern int XSetTile(
+    Display*           /* display */,
+    GC                 /* gc */,
+    Pixmap             /* tile */
+);
+
+extern int XSetWindowBackground(
+    Display*           /* display */,
+    Window             /* w */,
+    unsigned long      /* background_pixel */
+);
+
+extern int XSetWindowBackgroundPixmap(
+    Display*           /* display */,
+    Window             /* w */,
+    Pixmap             /* background_pixmap */
+);
+
+extern int XSetWindowBorder(
+    Display*           /* display */,
+    Window             /* w */,
+    unsigned long      /* border_pixel */
+);
+
+extern int XSetWindowBorderPixmap(
+    Display*           /* display */,
+    Window             /* w */,
+    Pixmap             /* border_pixmap */
+);
+
+extern int XSetWindowBorderWidth(
+    Display*           /* display */,
+    Window             /* w */,
+    unsigned int       /* width */
+);
+
+extern int XSetWindowColormap(
+    Display*           /* display */,
+    Window             /* w */,
+    Colormap           /* colormap */
+);
+
+extern int XStoreBuffer(
+    Display*           /* display */,
+    _Xconst char*      /* bytes */,
+    int                        /* nbytes */,
+    int                        /* buffer */
+);
+
+extern int XStoreBytes(
+    Display*           /* display */,
+    _Xconst char*      /* bytes */,
+    int                        /* nbytes */
+);
+
+extern int XStoreColor(
+    Display*           /* display */,
+    Colormap           /* colormap */,
+    XColor*            /* color */
+);
+
+extern int XStoreColors(
+    Display*           /* display */,
+    Colormap           /* colormap */,
+    XColor*            /* color */,
+    int                        /* ncolors */
+);
+
+extern int XStoreName(
+    Display*           /* display */,
+    Window             /* w */,
+    _Xconst char*      /* window_name */
+);
+
+extern int XStoreNamedColor(
+    Display*           /* display */,
+    Colormap           /* colormap */,
+    _Xconst char*      /* color */,
+    unsigned long      /* pixel */,
+    int                        /* flags */
+);
+
+extern int XSync(
+    Display*           /* display */,
+    Bool               /* discard */
+);
+
+extern int XTextExtents(
+    XFontStruct*       /* font_struct */,
+    _Xconst char*      /* string */,
+    int                        /* nchars */,
+    int*               /* direction_return */,
+    int*               /* font_ascent_return */,
+    int*               /* font_descent_return */,
+    XCharStruct*       /* overall_return */
+);
+
+extern int XTextExtents16(
+    XFontStruct*       /* font_struct */,
+    _Xconst XChar2b*   /* string */,
+    int                        /* nchars */,
+    int*               /* direction_return */,
+    int*               /* font_ascent_return */,
+    int*               /* font_descent_return */,
+    XCharStruct*       /* overall_return */
+);
+
+extern int XTextWidth(
+    XFontStruct*       /* font_struct */,
+    _Xconst char*      /* string */,
+    int                        /* count */
+);
+
+extern int XTextWidth16(
+    XFontStruct*       /* font_struct */,
+    _Xconst XChar2b*   /* string */,
+    int                        /* count */
+);
+
+extern Bool XTranslateCoordinates(
+    Display*           /* display */,
+    Window             /* src_w */,
+    Window             /* dest_w */,
+    int                        /* src_x */,
+    int                        /* src_y */,
+    int*               /* dest_x_return */,
+    int*               /* dest_y_return */,
+    Window*            /* child_return */
+);
+
+extern int XUndefineCursor(
+    Display*           /* display */,
+    Window             /* w */
+);
+
+extern int XUngrabButton(
+    Display*           /* display */,
+    unsigned int       /* button */,
+    unsigned int       /* modifiers */,
+    Window             /* grab_window */
+);
+
+extern int XUngrabKey(
+    Display*           /* display */,
+    int                        /* keycode */,
+    unsigned int       /* modifiers */,
+    Window             /* grab_window */
+);
+
+extern int XUngrabKeyboard(
+    Display*           /* display */,
+    Time               /* time */
+);
+
+extern int XUngrabPointer(
+    Display*           /* display */,
+    Time               /* time */
+);
+
+extern int XUngrabServer(
+    Display*           /* display */
+);
+
+extern int XUninstallColormap(
+    Display*           /* display */,
+    Colormap           /* colormap */
+);
+
+extern int XUnloadFont(
+    Display*           /* display */,
+    Font               /* font */
+);
+
+extern int XUnmapSubwindows(
+    Display*           /* display */,
+    Window             /* w */
+);
+
+extern int XUnmapWindow(
+    Display*           /* display */,
+    Window             /* w */
+);
+
+extern int XVendorRelease(
+    Display*           /* display */
+);
+
+extern int XWarpPointer(
+    Display*           /* display */,
+    Window             /* src_w */,
+    Window             /* dest_w */,
+    int                        /* src_x */,
+    int                        /* src_y */,
+    unsigned int       /* src_width */,
+    unsigned int       /* src_height */,
+    int                        /* dest_x */,
+    int                        /* dest_y */
+);
+
+extern int XWidthMMOfScreen(
+    Screen*            /* screen */
+);
+
+extern int XWidthOfScreen(
+    Screen*            /* screen */
+);
+
+extern int XWindowEvent(
+    Display*           /* display */,
+    Window             /* w */,
+    long               /* event_mask */,
+    XEvent*            /* event_return */
+);
+
+extern int XWriteBitmapFile(
+    Display*           /* display */,
+    _Xconst char*      /* filename */,
+    Pixmap             /* bitmap */,
+    unsigned int       /* width */,
+    unsigned int       /* height */,
+    int                        /* x_hot */,
+    int                        /* y_hot */
+);
+
+extern Bool XSupportsLocale (void);
+
+extern char *XSetLocaleModifiers(
+    const char*                /* modifier_list */
+);
+
+extern XOM XOpenOM(
+    Display*                   /* display */,
+    struct _XrmHashBucketRec*  /* rdb */,
+    _Xconst char*              /* res_name */,
+    _Xconst char*              /* res_class */
+);
+
+extern Status XCloseOM(
+    XOM                        /* om */
+);
+
+extern char *XSetOMValues(
+    XOM                        /* om */,
+    ...
+) _X_SENTINEL(0);
+
+extern char *XGetOMValues(
+    XOM                        /* om */,
+    ...
+) _X_SENTINEL(0);
+
+extern Display *XDisplayOfOM(
+    XOM                        /* om */
+);
+
+extern char *XLocaleOfOM(
+    XOM                        /* om */
+);
+
+extern XOC XCreateOC(
+    XOM                        /* om */,
+    ...
+) _X_SENTINEL(0);
+
+extern void XDestroyOC(
+    XOC                        /* oc */
+);
+
+extern XOM XOMOfOC(
+    XOC                        /* oc */
+);
+
+extern char *XSetOCValues(
+    XOC                        /* oc */,
+    ...
+) _X_SENTINEL(0);
+
+extern char *XGetOCValues(
+    XOC                        /* oc */,
+    ...
+) _X_SENTINEL(0);
+
+extern XFontSet XCreateFontSet(
+    Display*           /* display */,
+    _Xconst char*      /* base_font_name_list */,
+    char***            /* missing_charset_list */,
+    int*               /* missing_charset_count */,
+    char**             /* def_string */
+);
+
+extern void XFreeFontSet(
+    Display*           /* display */,
+    XFontSet           /* font_set */
+);
+
+extern int XFontsOfFontSet(
+    XFontSet           /* font_set */,
+    XFontStruct***     /* font_struct_list */,
+    char***            /* font_name_list */
+);
+
+extern char *XBaseFontNameListOfFontSet(
+    XFontSet           /* font_set */
+);
+
+extern char *XLocaleOfFontSet(
+    XFontSet           /* font_set */
+);
+
+extern Bool XContextDependentDrawing(
+    XFontSet           /* font_set */
+);
+
+extern Bool XDirectionalDependentDrawing(
+    XFontSet           /* font_set */
+);
+
+extern Bool XContextualDrawing(
+    XFontSet           /* font_set */
+);
+
+extern XFontSetExtents *XExtentsOfFontSet(
+    XFontSet           /* font_set */
+);
+
+extern int XmbTextEscapement(
+    XFontSet           /* font_set */,
+    _Xconst char*      /* text */,
+    int                        /* bytes_text */
+);
+
+extern int XwcTextEscapement(
+    XFontSet           /* font_set */,
+    _Xconst wchar_t*   /* text */,
+    int                        /* num_wchars */
+);
+
+extern int Xutf8TextEscapement(
+    XFontSet           /* font_set */,
+    _Xconst char*      /* text */,
+    int                        /* bytes_text */
+);
+
+extern int XmbTextExtents(
+    XFontSet           /* font_set */,
+    _Xconst char*      /* text */,
+    int                        /* bytes_text */,
+    XRectangle*                /* overall_ink_return */,
+    XRectangle*                /* overall_logical_return */
+);
+
+extern int XwcTextExtents(
+    XFontSet           /* font_set */,
+    _Xconst wchar_t*   /* text */,
+    int                        /* num_wchars */,
+    XRectangle*                /* overall_ink_return */,
+    XRectangle*                /* overall_logical_return */
+);
+
+extern int Xutf8TextExtents(
+    XFontSet           /* font_set */,
+    _Xconst char*      /* text */,
+    int                        /* bytes_text */,
+    XRectangle*                /* overall_ink_return */,
+    XRectangle*                /* overall_logical_return */
+);
+
+extern Status XmbTextPerCharExtents(
+    XFontSet           /* font_set */,
+    _Xconst char*      /* text */,
+    int                        /* bytes_text */,
+    XRectangle*                /* ink_extents_buffer */,
+    XRectangle*                /* logical_extents_buffer */,
+    int                        /* buffer_size */,
+    int*               /* num_chars */,
+    XRectangle*                /* overall_ink_return */,
+    XRectangle*                /* overall_logical_return */
+);
+
+extern Status XwcTextPerCharExtents(
+    XFontSet           /* font_set */,
+    _Xconst wchar_t*   /* text */,
+    int                        /* num_wchars */,
+    XRectangle*                /* ink_extents_buffer */,
+    XRectangle*                /* logical_extents_buffer */,
+    int                        /* buffer_size */,
+    int*               /* num_chars */,
+    XRectangle*                /* overall_ink_return */,
+    XRectangle*                /* overall_logical_return */
+);
+
+extern Status Xutf8TextPerCharExtents(
+    XFontSet           /* font_set */,
+    _Xconst char*      /* text */,
+    int                        /* bytes_text */,
+    XRectangle*                /* ink_extents_buffer */,
+    XRectangle*                /* logical_extents_buffer */,
+    int                        /* buffer_size */,
+    int*               /* num_chars */,
+    XRectangle*                /* overall_ink_return */,
+    XRectangle*                /* overall_logical_return */
+);
+
+extern void XmbDrawText(
+    Display*           /* display */,
+    Drawable           /* d */,
+    GC                 /* gc */,
+    int                        /* x */,
+    int                        /* y */,
+    XmbTextItem*       /* text_items */,
+    int                        /* nitems */
+);
+
+extern void XwcDrawText(
+    Display*           /* display */,
+    Drawable           /* d */,
+    GC                 /* gc */,
+    int                        /* x */,
+    int                        /* y */,
+    XwcTextItem*       /* text_items */,
+    int                        /* nitems */
+);
+
+extern void Xutf8DrawText(
+    Display*           /* display */,
+    Drawable           /* d */,
+    GC                 /* gc */,
+    int                        /* x */,
+    int                        /* y */,
+    XmbTextItem*       /* text_items */,
+    int                        /* nitems */
+);
+
+extern void XmbDrawString(
+    Display*           /* display */,
+    Drawable           /* d */,
+    XFontSet           /* font_set */,
+    GC                 /* gc */,
+    int                        /* x */,
+    int                        /* y */,
+    _Xconst char*      /* text */,
+    int                        /* bytes_text */
+);
+
+extern void XwcDrawString(
+    Display*           /* display */,
+    Drawable           /* d */,
+    XFontSet           /* font_set */,
+    GC                 /* gc */,
+    int                        /* x */,
+    int                        /* y */,
+    _Xconst wchar_t*   /* text */,
+    int                        /* num_wchars */
+);
+
+extern void Xutf8DrawString(
+    Display*           /* display */,
+    Drawable           /* d */,
+    XFontSet           /* font_set */,
+    GC                 /* gc */,
+    int                        /* x */,
+    int                        /* y */,
+    _Xconst char*      /* text */,
+    int                        /* bytes_text */
+);
+
+extern void XmbDrawImageString(
+    Display*           /* display */,
+    Drawable           /* d */,
+    XFontSet           /* font_set */,
+    GC                 /* gc */,
+    int                        /* x */,
+    int                        /* y */,
+    _Xconst char*      /* text */,
+    int                        /* bytes_text */
+);
+
+extern void XwcDrawImageString(
+    Display*           /* display */,
+    Drawable           /* d */,
+    XFontSet           /* font_set */,
+    GC                 /* gc */,
+    int                        /* x */,
+    int                        /* y */,
+    _Xconst wchar_t*   /* text */,
+    int                        /* num_wchars */
+);
+
+extern void Xutf8DrawImageString(
+    Display*           /* display */,
+    Drawable           /* d */,
+    XFontSet           /* font_set */,
+    GC                 /* gc */,
+    int                        /* x */,
+    int                        /* y */,
+    _Xconst char*      /* text */,
+    int                        /* bytes_text */
+);
+
+extern XIM XOpenIM(
+    Display*                   /* dpy */,
+    struct _XrmHashBucketRec*  /* rdb */,
+    char*                      /* res_name */,
+    char*                      /* res_class */
+);
+
+extern Status XCloseIM(
+    XIM /* im */
+);
+
+extern char *XGetIMValues(
+    XIM /* im */, ...
+) _X_SENTINEL(0);
+
+extern char *XSetIMValues(
+    XIM /* im */, ...
+) _X_SENTINEL(0);
+
+extern Display *XDisplayOfIM(
+    XIM /* im */
+);
+
+extern char *XLocaleOfIM(
+    XIM /* im*/
+);
+
+extern XIC XCreateIC(
+    XIM /* im */, ...
+) _X_SENTINEL(0);
+
+extern void XDestroyIC(
+    XIC /* ic */
+);
+
+extern void XSetICFocus(
+    XIC /* ic */
+);
+
+extern void XUnsetICFocus(
+    XIC /* ic */
+);
+
+extern wchar_t *XwcResetIC(
+    XIC /* ic */
+);
+
+extern char *XmbResetIC(
+    XIC /* ic */
+);
+
+extern char *Xutf8ResetIC(
+    XIC /* ic */
+);
+
+extern char *XSetICValues(
+    XIC /* ic */, ...
+) _X_SENTINEL(0);
+
+extern char *XGetICValues(
+    XIC /* ic */, ...
+) _X_SENTINEL(0);
+
+extern XIM XIMOfIC(
+    XIC /* ic */
+);
+
+extern Bool XFilterEvent(
+    XEvent*    /* event */,
+    Window     /* window */
+);
+
+extern int XmbLookupString(
+    XIC                        /* ic */,
+    XKeyPressedEvent*  /* event */,
+    char*              /* buffer_return */,
+    int                        /* bytes_buffer */,
+    KeySym*            /* keysym_return */,
+    Status*            /* status_return */
+);
+
+extern int XwcLookupString(
+    XIC                        /* ic */,
+    XKeyPressedEvent*  /* event */,
+    wchar_t*           /* buffer_return */,
+    int                        /* wchars_buffer */,
+    KeySym*            /* keysym_return */,
+    Status*            /* status_return */
+);
+
+extern int Xutf8LookupString(
+    XIC                        /* ic */,
+    XKeyPressedEvent*  /* event */,
+    char*              /* buffer_return */,
+    int                        /* bytes_buffer */,
+    KeySym*            /* keysym_return */,
+    Status*            /* status_return */
+);
+
+extern XVaNestedList XVaCreateNestedList(
+    int /*unused*/, ...
+) _X_SENTINEL(0);
+
+/* internal connections for IMs */
+
+extern Bool XRegisterIMInstantiateCallback(
+    Display*                   /* dpy */,
+    struct _XrmHashBucketRec*  /* rdb */,
+    char*                      /* res_name */,
+    char*                      /* res_class */,
+    XIDProc                    /* callback */,
+    XPointer                   /* client_data */
+);
+
+extern Bool XUnregisterIMInstantiateCallback(
+    Display*                   /* dpy */,
+    struct _XrmHashBucketRec*  /* rdb */,
+    char*                      /* res_name */,
+    char*                      /* res_class */,
+    XIDProc                    /* callback */,
+    XPointer                   /* client_data */
+);
+
+typedef void (*XConnectionWatchProc)(
+    Display*                   /* dpy */,
+    XPointer                   /* client_data */,
+    int                                /* fd */,
+    Bool                       /* opening */,   /* open or close flag */
+    XPointer*                  /* watch_data */ /* open sets, close uses */
+);
+
+
+extern Status XInternalConnectionNumbers(
+    Display*                   /* dpy */,
+    int**                      /* fd_return */,
+    int*                       /* count_return */
+);
+
+extern void XProcessInternalConnection(
+    Display*                   /* dpy */,
+    int                                /* fd */
+);
+
+extern Status XAddConnectionWatch(
+    Display*                   /* dpy */,
+    XConnectionWatchProc       /* callback */,
+    XPointer                   /* client_data */
+);
+
+extern void XRemoveConnectionWatch(
+    Display*                   /* dpy */,
+    XConnectionWatchProc       /* callback */,
+    XPointer                   /* client_data */
+);
+
+extern void XSetAuthorization(
+    char *                     /* name */,
+    int                                /* namelen */,
+    char *                     /* data */,
+    int                                /* datalen */
+);
+
+extern int _Xmbtowc(
+    wchar_t *                  /* wstr */,
+#ifdef ISC
+    char const *               /* str */,
+    size_t                     /* len */
+#else
+    char *                     /* str */,
+    int                                /* len */
+#endif
+);
+
+extern int _Xwctomb(
+    char *                     /* str */,
+    wchar_t                    /* wc */
+);
+
+extern Bool XGetEventData(
+    Display*                   /* dpy */,
+    XGenericEventCookie*       /* cookie*/
+);
+
+extern void XFreeEventData(
+    Display*                   /* dpy */,
+    XGenericEventCookie*       /* cookie*/
+);
+
+_XFUNCPROTOEND
+
+#endif /* _X11_XLIB_H_ */
diff --git a/include/X11/XlibConf.h.in b/include/X11/XlibConf.h.in
new file mode 100644 (file)
index 0000000..8f36ac1
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright © 2005 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.
+ */
+
+#ifndef _XLIBCONF_H_
+#define _XLIBCONF_H_
+/*
+ * This header file exports defines necessary to correctly
+ * use Xlibint.h both inside Xlib and by external libraries
+ * such as extensions.
+ */
+
+/* Threading support? */
+#undef XTHREADS
+
+/* Use multi-threaded libc functions? */
+#undef XUSE_MTSAFE_API
+
+#endif /* _XLIBCONF_H_ */
diff --git a/include/X11/Xlibint.h b/include/X11/Xlibint.h
new file mode 100644 (file)
index 0000000..80edeec
--- /dev/null
@@ -0,0 +1,1369 @@
+
+/*
+
+Copyright 1984, 1985, 1987, 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 _X11_XLIBINT_H_
+#define _X11_XLIBINT_H_ 1
+
+/*
+ *     Xlibint.h - Header definition and support file for the internal
+ *     support routines used by the C subroutine interface
+ *     library (Xlib) to the X Window System.
+ *
+ *     Warning, there be dragons here....
+ */
+
+#include <X11/Xlib.h>
+#include <X11/Xproto.h>                /* to declare xEvent */
+#include <X11/XlibConf.h>      /* for configured options like XTHREADS */
+
+#ifdef WIN32
+#define _XFlush _XFlushIt
+#endif
+
+/*
+ * If your BytesReadable correctly detects broken connections, then
+ * you should NOT define XCONN_CHECK_FREQ.
+ */
+#ifndef XCONN_CHECK_FREQ
+#define XCONN_CHECK_FREQ 256
+#endif
+
+struct _XGC
+{
+    XExtData *ext_data;        /* hook for extension to hang data */
+    GContext gid;      /* protocol ID for graphics context */
+    Bool rects;                /* boolean: TRUE if clipmask is list of rectangles */
+    Bool dashes;       /* boolean: TRUE if dash-list is really a list */
+    unsigned long dirty;/* cache dirty bits */
+    XGCValues values;  /* shadow structure of values */
+};
+
+struct _XDisplay
+{
+       XExtData *ext_data;     /* hook for extension to hang data */
+       struct _XFreeFuncs *free_funcs; /* internal free functions */
+       int fd;                 /* Network socket. */
+       int conn_checker;         /* ugly thing used by _XEventsQueued */
+       int proto_major_version;/* maj. version of server's X protocol */
+       int proto_minor_version;/* minor version of server's X protocol */
+       char *vendor;           /* vendor of the server hardware */
+        XID resource_base;     /* resource ID base */
+       XID resource_mask;      /* resource ID mask bits */
+       XID resource_id;        /* allocator current ID */
+       int resource_shift;     /* allocator shift to correct bits */
+       XID (*resource_alloc)(  /* allocator function */
+               struct _XDisplay*
+               );
+       int byte_order;         /* screen byte order, LSBFirst, MSBFirst */
+       int bitmap_unit;        /* padding and data requirements */
+       int bitmap_pad;         /* padding requirements on bitmaps */
+       int bitmap_bit_order;   /* LeastSignificant or MostSignificant */
+       int nformats;           /* number of pixmap formats in list */
+       ScreenFormat *pixmap_format;    /* pixmap format list */
+       int vnumber;            /* Xlib's X protocol version number. */
+       int release;            /* release of the server */
+       struct _XSQEvent *head, *tail;  /* Input event queue. */
+       int qlen;               /* Length of input event queue */
+       unsigned long last_request_read; /* seq number of last event read */
+       unsigned long request;  /* sequence number of last request. */
+       char *last_req;         /* beginning of last request, or dummy */
+       char *buffer;           /* Output buffer starting address. */
+       char *bufptr;           /* Output buffer index pointer. */
+       char *bufmax;           /* Output buffer maximum+1 address. */
+       unsigned max_request_size; /* maximum number 32 bit words in request*/
+       struct _XrmHashBucketRec *db;
+       int (*synchandler)(     /* Synchronization handler */
+               struct _XDisplay*
+               );
+       char *display_name;     /* "host:display" string used on this connect*/
+       int default_screen;     /* default screen for operations */
+       int nscreens;           /* number of screens on this server*/
+       Screen *screens;        /* pointer to list of screens */
+       unsigned long motion_buffer;    /* size of motion buffer */
+       volatile unsigned long flags;      /* internal connection flags */
+       int min_keycode;        /* minimum defined keycode */
+       int max_keycode;        /* maximum defined keycode */
+       KeySym *keysyms;        /* This server's keysyms */
+       XModifierKeymap *modifiermap;   /* This server's modifier keymap */
+       int keysyms_per_keycode;/* number of rows */
+       char *xdefaults;        /* contents of defaults from server */
+       char *scratch_buffer;   /* place to hang scratch buffer */
+       unsigned long scratch_length;   /* length of scratch buffer */
+       int ext_number;         /* extension number on this display */
+       struct _XExten *ext_procs; /* extensions initialized on this display */
+       /*
+        * the following can be fixed size, as the protocol defines how
+        * much address space is available.
+        * While this could be done using the extension vector, there
+        * may be MANY events processed, so a search through the extension
+        * list to find the right procedure for each event might be
+        * expensive if many extensions are being used.
+        */
+       Bool (*event_vec[128])( /* vector for wire to event */
+               Display *       /* dpy */,
+               XEvent *        /* re */,
+               xEvent *        /* event */
+               );
+       Status (*wire_vec[128])( /* vector for event to wire */
+               Display *       /* dpy */,
+               XEvent *        /* re */,
+               xEvent *        /* event */
+               );
+       KeySym lock_meaning;       /* for XLookupString */
+       struct _XLockInfo *lock;   /* multi-thread state, display lock */
+       struct _XInternalAsync *async_handlers; /* for internal async */
+       unsigned long bigreq_size; /* max size of big requests */
+       struct _XLockPtrs *lock_fns; /* pointers to threads functions */
+       void (*idlist_alloc)(      /* XID list allocator function */
+               Display *       /* dpy */,
+               XID *           /* ids */,
+               int             /* count */
+               );
+       /* things above this line should not move, for binary compatibility */
+       struct _XKeytrans *key_bindings; /* for XLookupString */
+       Font cursor_font;          /* for XCreateFontCursor */
+       struct _XDisplayAtoms *atoms; /* for XInternAtom */
+       unsigned int mode_switch;  /* keyboard group modifiers */
+       unsigned int num_lock;  /* keyboard numlock modifiers */
+       struct _XContextDB *context_db; /* context database */
+       Bool (**error_vec)(     /* vector for wire to error */
+               Display     *   /* display */,
+               XErrorEvent *   /* he */,
+               xError      *   /* we */
+               );
+       /*
+        * Xcms information
+        */
+       struct {
+          XPointer defaultCCCs;  /* pointer to an array of default XcmsCCC */
+          XPointer clientCmaps;  /* pointer to linked list of XcmsCmapRec */
+          XPointer perVisualIntensityMaps;
+                                 /* linked list of XcmsIntensityMap */
+       } cms;
+       struct _XIMFilter *im_filters;
+       struct _XSQEvent *qfree; /* unallocated event queue elements */
+       unsigned long next_event_serial_num; /* inserted into next queue elt */
+       struct _XExten *flushes; /* Flush hooks */
+       struct _XConnectionInfo *im_fd_info; /* _XRegisterInternalConnection */
+       int im_fd_length;       /* number of im_fd_info */
+       struct _XConnWatchInfo *conn_watchers; /* XAddConnectionWatch */
+       int watcher_count;      /* number of conn_watchers */
+       XPointer filedes;       /* struct pollfd cache for _XWaitForReadable */
+       int (*savedsynchandler)( /* user synchandler when Xlib usurps */
+               Display *       /* dpy */
+               );
+       XID resource_max;       /* allocator max ID */
+       int xcmisc_opcode;      /* major opcode for XC-MISC */
+       struct _XkbInfoRec *xkb_info; /* XKB info */
+       struct _XtransConnInfo *trans_conn; /* transport connection object */
+       struct _X11XCBPrivate *xcb; /* XCB glue private data */
+
+       /* Generic event cookie handling */
+       unsigned int next_cookie; /* next event cookie */
+       /* vector for wire to generic event, index is (extension - 128) */
+       Bool (*generic_event_vec[128])(
+               Display *       /* dpy */,
+               XGenericEventCookie *   /* Xlib event */,
+               xEvent *        /* wire event */);
+       /* vector for event copy, index is (extension - 128) */
+       Bool (*generic_event_copy_vec[128])(
+               Display *       /* dpy */,
+               XGenericEventCookie *   /* in */,
+               XGenericEventCookie *   /* out*/);
+       void *cookiejar;  /* cookie events returned but not claimed */
+};
+
+#define XAllocIDs(dpy,ids,n) (*(dpy)->idlist_alloc)(dpy,ids,n)
+
+/*
+ * define the following if you want the Data macro to be a procedure instead
+ */
+#ifdef CRAY
+#define DataRoutineIsProcedure
+#endif /* CRAY */
+
+#ifndef _XEVENT_
+/*
+ * _QEvent datatype for use in input queueing.
+ */
+typedef struct _XSQEvent
+{
+    struct _XSQEvent *next;
+    XEvent event;
+    unsigned long qserial_num; /* so multi-threaded code can find new ones */
+} _XQEvent;
+#endif
+
+#include <X11/Xproto.h>
+#ifdef __sgi
+#define _SGI_MP_SOURCE  /* turn this on to get MP safe errno */
+#endif
+#include <errno.h>
+#define _XBCOPYFUNC _Xbcopy
+#include <X11/Xfuncs.h>
+#include <X11/Xosdefs.h>
+
+/* Utek leaves kernel macros around in include files (bleah) */
+#ifdef dirty
+#undef dirty
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <X11/Xfuncproto.h>
+
+_XFUNCPROTOBEGIN
+
+/*
+ * The following definitions can be used for locking requests in multi-threaded
+ * address spaces.
+ */
+#ifdef XTHREADS
+/* Author: Stephen Gildea, MIT X Consortium
+ *
+ * declarations for C Threads locking
+ */
+
+typedef struct _LockInfoRec *LockInfoPtr;
+
+/* interfaces for locking.c */
+struct _XLockPtrs {
+    /* used by all, including extensions; do not move */
+    void (*lock_display)(
+               Display *dpy
+#if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE)
+               , char *file
+               , int line
+#endif
+       );
+    void (*unlock_display)(
+               Display *dpy
+#if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE)
+               , char *file
+               , int line
+#endif
+       );
+};
+
+#if defined(WIN32) && !defined(_XLIBINT_)
+#define _XCreateMutex_fn (*_XCreateMutex_fn_p)
+#define _XFreeMutex_fn (*_XFreeMutex_fn_p)
+#define _XLockMutex_fn (*_XLockMutex_fn_p)
+#define _XUnlockMutex_fn (*_XUnlockMutex_fn_p)
+#define _Xglobal_lock (*_Xglobal_lock_p)
+#endif
+
+/* in XlibInt.c */
+extern void (*_XCreateMutex_fn)(
+    LockInfoPtr /* lock */
+);
+extern void (*_XFreeMutex_fn)(
+    LockInfoPtr /* lock */
+);
+extern void (*_XLockMutex_fn)(
+    LockInfoPtr        /* lock */
+#if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE)
+    , char * /* file */
+    , int /* line */
+#endif
+);
+extern void (*_XUnlockMutex_fn)(
+    LockInfoPtr        /* lock */
+#if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE)
+    , char * /* file */
+    , int /* line */
+#endif
+);
+
+extern LockInfoPtr _Xglobal_lock;
+
+#if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE)
+#define LockDisplay(d)      if ((d)->lock_fns) (*(d)->lock_fns->lock_display)((d),__FILE__,__LINE__)
+#define UnlockDisplay(d)     if ((d)->lock_fns) (*(d)->lock_fns->unlock_display)((d),__FILE__,__LINE__)
+#define _XLockMutex(lock)              if (_XLockMutex_fn) (*_XLockMutex_fn)(lock,__FILE__,__LINE__)
+#define _XUnlockMutex(lock)    if (_XUnlockMutex_fn) (*_XUnlockMutex_fn)(lock,__FILE__,__LINE__)
+#else
+/* used everywhere, so must be fast if not using threads */
+#define LockDisplay(d)      if ((d)->lock_fns) (*(d)->lock_fns->lock_display)(d)
+#define UnlockDisplay(d)     if ((d)->lock_fns) (*(d)->lock_fns->unlock_display)(d)
+#define _XLockMutex(lock)              if (_XLockMutex_fn) (*_XLockMutex_fn)(lock)
+#define _XUnlockMutex(lock)    if (_XUnlockMutex_fn) (*_XUnlockMutex_fn)(lock)
+#endif
+#define _XCreateMutex(lock)    if (_XCreateMutex_fn) (*_XCreateMutex_fn)(lock);
+#define _XFreeMutex(lock)      if (_XFreeMutex_fn) (*_XFreeMutex_fn)(lock);
+
+#else /* XTHREADS */
+#define LockDisplay(dis)
+#define _XLockMutex(lock)
+#define _XUnlockMutex(lock)
+#define UnlockDisplay(dis)
+#define _XCreateMutex(lock)
+#define _XFreeMutex(lock)
+#endif
+
+#define Xfree(ptr) free((ptr))
+
+/*
+ * Note that some machines do not return a valid pointer for malloc(0), in
+ * which case we provide an alternate under the control of the
+ * define MALLOC_0_RETURNS_NULL.  This is necessary because some
+ * Xlib code expects malloc(0) to return a valid pointer to storage.
+ */
+#if defined(MALLOC_0_RETURNS_NULL) || defined(__clang_analyzer__)
+
+# define Xmalloc(size) malloc(((size) == 0 ? 1 : (size)))
+# define Xrealloc(ptr, size) realloc((ptr), ((size) == 0 ? 1 : (size)))
+# define Xcalloc(nelem, elsize) calloc(((nelem) == 0 ? 1 : (nelem)), (elsize))
+
+#else
+
+# define Xmalloc(size) malloc((size))
+# define Xrealloc(ptr, size) realloc((ptr), (size))
+# define Xcalloc(nelem, elsize) calloc((nelem), (elsize))
+
+#endif
+
+#include <stddef.h>
+
+#define LOCKED 1
+#define UNLOCKED 0
+
+#ifndef BUFSIZE
+#define BUFSIZE 2048                   /* X output buffer size. */
+#endif
+#ifndef PTSPERBATCH
+#define PTSPERBATCH 1024               /* point batching */
+#endif
+#ifndef WLNSPERBATCH
+#define WLNSPERBATCH 50                        /* wide line batching */
+#endif
+#ifndef ZLNSPERBATCH
+#define ZLNSPERBATCH 1024              /* thin line batching */
+#endif
+#ifndef WRCTSPERBATCH
+#define WRCTSPERBATCH 10               /* wide line rectangle batching */
+#endif
+#ifndef ZRCTSPERBATCH
+#define ZRCTSPERBATCH 256              /* thin line rectangle batching */
+#endif
+#ifndef FRCTSPERBATCH
+#define FRCTSPERBATCH 256              /* filled rectangle batching */
+#endif
+#ifndef FARCSPERBATCH
+#define FARCSPERBATCH 256              /* filled arc batching */
+#endif
+#ifndef CURSORFONT
+#define CURSORFONT "cursor"            /* standard cursor fonts */
+#endif
+
+/*
+ * Display flags
+ */
+#define XlibDisplayIOError     (1L << 0)
+#define XlibDisplayClosing     (1L << 1)
+#define XlibDisplayNoXkb       (1L << 2)
+#define XlibDisplayPrivSync    (1L << 3)
+#define XlibDisplayProcConni   (1L << 4) /* in _XProcessInternalConnection */
+#define XlibDisplayReadEvents  (1L << 5) /* in _XReadEvents */
+#define XlibDisplayReply       (1L << 5) /* in _XReply */
+#define XlibDisplayWriting     (1L << 6) /* in _XFlushInt, _XSend */
+#define XlibDisplayDfltRMDB     (1L << 7) /* mark if RM db from XGetDefault */
+
+/*
+ * X Protocol packetizing macros.
+ */
+
+/*   Need to start requests on 64 bit word boundaries
+ *   on a CRAY computer so add a NoOp (127) if needed.
+ *   A character pointer on a CRAY computer will be non-zero
+ *   after shifting right 61 bits of it is not pointing to
+ *   a word boundary.
+ */
+#ifdef WORD64
+#define WORD64ALIGN if ((long)dpy->bufptr >> 61) {\
+           dpy->last_req = dpy->bufptr;\
+           *(dpy->bufptr)   = X_NoOperation;\
+           *(dpy->bufptr+1) =  0;\
+           *(dpy->bufptr+2) =  0;\
+           *(dpy->bufptr+3) =  1;\
+             dpy->request++;\
+             dpy->bufptr += 4;\
+         }
+#else /* else does not require alignment on 64-bit boundaries */
+#define WORD64ALIGN
+#endif /* WORD64 */
+
+/**
+ * Return a len-sized request buffer for the request type. This function may
+ * flush the output queue.
+ *
+ * @param dpy The display connection
+ * @param type The request type
+ * @param len Length of the request in bytes
+ *
+ * @returns A pointer to the request buffer with a few default values
+ * initialized.
+ */
+extern void *_XGetRequest(Display *dpy, CARD8 type, size_t len);
+
+/* GetReqSized is the same as GetReq but allows the caller to specify the
+ * size in bytes. 'sz' must be a multiple of 4! */
+
+#if !defined(UNIXCPP) || defined(ANSICPP)
+#define GetReqSized(name, sz, req) \
+       req = (x##name##Req *) _XGetRequest(dpy, X_##name, sz)
+#else
+#define GetReqSized(name, sz, req) \
+       req = (x/**/name/**/Req *) _XGetRequest(dpy, X_/**/name, sz)
+#endif
+
+
+/*
+ * GetReq - Get the next available X request packet in the buffer and
+ * return it.
+ *
+ * "name" is the name of the request, e.g. CreatePixmap, OpenFont, etc.
+ * "req" is the name of the request pointer.
+ *
+ */
+
+#if !defined(UNIXCPP) || defined(ANSICPP)
+#define GetReq(name, req) \
+       GetReqSized(name, SIZEOF(x##name##Req), req)
+#else  /* non-ANSI C uses empty comment instead of "##" for token concatenation */
+#define GetReq(name, req) \
+       GetReqSized(name, SIZEOF(x/**/name/**/Req), req)
+#endif
+
+/* GetReqExtra is the same as GetReq, but allocates "n" additional
+   bytes after the request. "n" must be a multiple of 4!  */
+
+#if !defined(UNIXCPP) || defined(ANSICPP)
+#define GetReqExtra(name, n, req) \
+        GetReqSized(name, SIZEOF(x##name##Req) + n, req)
+#else
+#define GetReqExtra(name, n, req) \
+        GetReqSized(name, SIZEOF(x/**/name/**/Req) + n, req)
+#endif
+
+
+/*
+ * GetResReq is for those requests that have a resource ID
+ * (Window, Pixmap, GContext, etc.) as their single argument.
+ * "rid" is the name of the resource.
+ */
+
+#if !defined(UNIXCPP) || defined(ANSICPP)
+#define GetResReq(name, rid, req) \
+       req = (xResourceReq *) _XGetRequest(dpy, X_##name, SIZEOF(xResourceReq)); \
+       req->id = (rid)
+#else
+#define GetResReq(name, rid, req) \
+       req = (xResourceReq *) _XGetRequest(dpy, X_/**/name, SIZEOF(xResourceReq)); \
+       req->id = (rid)
+#endif
+
+/*
+ * GetEmptyReq is for those requests that have no arguments
+ * at all.
+ */
+#if !defined(UNIXCPP) || defined(ANSICPP)
+#define GetEmptyReq(name, req) \
+       req = (xReq *) _XGetRequest(dpy, X_##name, SIZEOF(xReq))
+#else
+#define GetEmptyReq(name, req) \
+       req = (xReq *) _XGetRequest(dpy, X_/**/name, SIZEOF(xReq))
+#endif
+
+#ifdef WORD64
+#define MakeBigReq(req,n) \
+    { \
+    char _BRdat[4]; \
+    unsigned long _BRlen = req->length - 1; \
+    req->length = 0; \
+    memcpy(_BRdat, ((char *)req) + (_BRlen << 2), 4); \
+    memmove(((char *)req) + 8, ((char *)req) + 4, _BRlen << 2); \
+    memcpy(((char *)req) + 4, _BRdat, 4); \
+    Data32(dpy, (long *)&_BRdat, 4); \
+    }
+#else
+#ifdef LONG64
+#define MakeBigReq(req,n) \
+    { \
+    CARD64 _BRdat; \
+    CARD32 _BRlen = req->length - 1; \
+    req->length = 0; \
+    _BRdat = ((CARD32 *)req)[_BRlen]; \
+    memmove(((char *)req) + 8, ((char *)req) + 4, _BRlen << 2); \
+    ((CARD32 *)req)[1] = _BRlen + n + 2; \
+    Data32(dpy, &_BRdat, 4); \
+    }
+#else
+#define MakeBigReq(req,n) \
+    { \
+    CARD32 _BRdat; \
+    CARD32 _BRlen = req->length - 1; \
+    req->length = 0; \
+    _BRdat = ((CARD32 *)req)[_BRlen]; \
+    memmove(((char *)req) + 8, ((char *)req) + 4, _BRlen << 2); \
+    ((CARD32 *)req)[1] = _BRlen + n + 2; \
+    Data32(dpy, &_BRdat, 4); \
+    }
+#endif
+#endif
+
+#ifndef __clang_analyzer__
+#define SetReqLen(req,n,badlen) \
+    if ((req->length + n) > (unsigned)65535) { \
+       if (dpy->bigreq_size) { \
+           MakeBigReq(req,n) \
+       } else { \
+           n = badlen; \
+           req->length += n; \
+       } \
+    } else \
+       req->length += n
+#else
+#define SetReqLen(req,n,badlen) \
+    req->length += n
+#endif
+
+#define SyncHandle() \
+       if (dpy->synchandler) (*dpy->synchandler)(dpy)
+
+extern void _XFlushGCCache(Display *dpy, GC gc);
+#define FlushGC(dpy, gc) \
+       if ((gc)->dirty) _XFlushGCCache((dpy), (gc))
+/*
+ * Data - Place data in the buffer and pad the end to provide
+ * 32 bit word alignment.  Transmit if the buffer fills.
+ *
+ * "dpy" is a pointer to a Display.
+ * "data" is a pinter to a data buffer.
+ * "len" is the length of the data buffer.
+ */
+#ifndef DataRoutineIsProcedure
+#define Data(dpy, data, len) {\
+       if (dpy->bufptr + (len) <= dpy->bufmax) {\
+               memcpy(dpy->bufptr, data, (int)len);\
+               dpy->bufptr += ((len) + 3) & ~3;\
+       } else\
+               _XSend(dpy, data, len);\
+       }
+#endif /* DataRoutineIsProcedure */
+
+
+/* Allocate bytes from the buffer.  No padding is done, so if
+ * the length is not a multiple of 4, the caller must be
+ * careful to leave the buffer aligned after sending the
+ * current request.
+ *
+ * "type" is the type of the pointer being assigned to.
+ * "ptr" is the pointer being assigned to.
+ * "n" is the number of bytes to allocate.
+ *
+ * Example:
+ *    xTextElt *elt;
+ *    BufAlloc (xTextElt *, elt, nbytes)
+ */
+
+#define BufAlloc(type, ptr, n) \
+    if (dpy->bufptr + (n) > dpy->bufmax) \
+        _XFlush (dpy); \
+    ptr = (type) dpy->bufptr; \
+    memset(ptr, '\0', n); \
+    dpy->bufptr += (n);
+
+#ifdef WORD64
+#define Data16(dpy, data, len) _XData16(dpy, (short *)data, len)
+#define Data32(dpy, data, len) _XData32(dpy, (long *)data, len)
+#else
+#define Data16(dpy, data, len) Data((dpy), (char *)(data), (len))
+#define _XRead16Pad(dpy, data, len) _XReadPad((dpy), (char *)(data), (len))
+#define _XRead16(dpy, data, len) _XRead((dpy), (char *)(data), (len))
+#ifdef LONG64
+#define Data32(dpy, data, len) _XData32(dpy, (long *)data, len)
+extern int _XData32(
+            Display *dpy,
+            register long *data,
+            unsigned len
+);
+extern void _XRead32(
+            Display *dpy,
+            register long *data,
+            long len
+);
+#else
+#define Data32(dpy, data, len) Data((dpy), (char *)(data), (len))
+#define _XRead32(dpy, data, len) _XRead((dpy), (char *)(data), (len))
+#endif
+#endif /* not WORD64 */
+
+#define PackData16(dpy,data,len) Data16 (dpy, data, len)
+#define PackData32(dpy,data,len) Data32 (dpy, data, len)
+
+/* Xlib manual is bogus */
+#define PackData(dpy,data,len) PackData16 (dpy, data, len)
+
+#define min(a,b) (((a) < (b)) ? (a) : (b))
+#define max(a,b) (((a) > (b)) ? (a) : (b))
+
+#define CI_NONEXISTCHAR(cs) (((cs)->width == 0) && \
+                            (((cs)->rbearing|(cs)->lbearing| \
+                              (cs)->ascent|(cs)->descent) == 0))
+
+/*
+ * CI_GET_CHAR_INFO_1D - return the charinfo struct for the indicated 8bit
+ * character.  If the character is in the column and exists, then return the
+ * appropriate metrics (note that fonts with common per-character metrics will
+ * return min_bounds).  If none of these hold true, try again with the default
+ * char.
+ */
+#define CI_GET_CHAR_INFO_1D(fs,col,def,cs) \
+{ \
+    cs = def; \
+    if (col >= fs->min_char_or_byte2 && col <= fs->max_char_or_byte2) { \
+       if (fs->per_char == NULL) { \
+           cs = &fs->min_bounds; \
+       } else { \
+           cs = &fs->per_char[(col - fs->min_char_or_byte2)]; \
+           if (CI_NONEXISTCHAR(cs)) cs = def; \
+       } \
+    } \
+}
+
+#define CI_GET_DEFAULT_INFO_1D(fs,cs) \
+  CI_GET_CHAR_INFO_1D (fs, fs->default_char, NULL, cs)
+
+
+
+/*
+ * CI_GET_CHAR_INFO_2D - return the charinfo struct for the indicated row and
+ * column.  This is used for fonts that have more than row zero.
+ */
+#define CI_GET_CHAR_INFO_2D(fs,row,col,def,cs) \
+{ \
+    cs = def; \
+    if (row >= fs->min_byte1 && row <= fs->max_byte1 && \
+       col >= fs->min_char_or_byte2 && col <= fs->max_char_or_byte2) { \
+       if (fs->per_char == NULL) { \
+           cs = &fs->min_bounds; \
+       } else { \
+           cs = &fs->per_char[((row - fs->min_byte1) * \
+                               (fs->max_char_or_byte2 - \
+                                fs->min_char_or_byte2 + 1)) + \
+                              (col - fs->min_char_or_byte2)]; \
+           if (CI_NONEXISTCHAR(cs)) cs = def; \
+        } \
+    } \
+}
+
+#define CI_GET_DEFAULT_INFO_2D(fs,cs) \
+{ \
+    unsigned int r = (fs->default_char >> 8); \
+    unsigned int c = (fs->default_char & 0xff); \
+    CI_GET_CHAR_INFO_2D (fs, r, c, NULL, cs); \
+}
+
+
+#ifdef MUSTCOPY
+
+/* for when 32-bit alignment is not good enough */
+#define OneDataCard32(dpy,dstaddr,srcvar) \
+  { dpy->bufptr -= 4; Data32 (dpy, (char *) &(srcvar), 4); }
+
+#else
+
+/* srcvar must be a variable for large architecture version */
+#define OneDataCard32(dpy,dstaddr,srcvar) \
+  { *(CARD32 *)(dstaddr) = (srcvar); }
+
+#endif /* MUSTCOPY */
+
+typedef struct _XInternalAsync {
+    struct _XInternalAsync *next;
+    /*
+     * handler arguments:
+     * rep is the generic reply that caused this handler
+     * to be invoked.  It must also be passed to _XGetAsyncReply.
+     * buf and len are opaque values that must be passed to
+     * _XGetAsyncReply or _XGetAsyncData.
+     * data is the closure stored in this struct.
+     * The handler returns True iff it handled this reply.
+     */
+    Bool (*handler)(
+                   Display*    /* dpy */,
+                   xReply*     /* rep */,
+                   char*       /* buf */,
+                   int         /* len */,
+                   XPointer    /* data */
+                   );
+    XPointer data;
+} _XAsyncHandler;
+
+typedef struct _XAsyncEState {
+    unsigned long min_sequence_number;
+    unsigned long max_sequence_number;
+    unsigned char error_code;
+    unsigned char major_opcode;
+    unsigned short minor_opcode;
+    unsigned char last_error_received;
+    int error_count;
+} _XAsyncErrorState;
+
+extern void _XDeqAsyncHandler(Display *dpy, _XAsyncHandler *handler);
+#define DeqAsyncHandler(dpy,handler) { \
+    if (dpy->async_handlers == (handler)) \
+       dpy->async_handlers = (handler)->next; \
+    else \
+       _XDeqAsyncHandler(dpy, handler); \
+    }
+
+typedef void (*FreeFuncType) (
+    Display*   /* display */
+);
+
+typedef int (*FreeModmapType) (
+    XModifierKeymap*   /* modmap */
+);
+
+/*
+ * This structure is private to the library.
+ */
+typedef struct _XFreeFuncs {
+    FreeFuncType atoms;                /* _XFreeAtomTable */
+    FreeModmapType modifiermap;        /* XFreeModifiermap */
+    FreeFuncType key_bindings; /* _XFreeKeyBindings */
+    FreeFuncType context_db;   /* _XFreeContextDB */
+    FreeFuncType defaultCCCs;  /* _XcmsFreeDefaultCCCs */
+    FreeFuncType clientCmaps;  /* _XcmsFreeClientCmaps */
+    FreeFuncType intensityMaps;        /* _XcmsFreeIntensityMaps */
+    FreeFuncType im_filters;   /* _XFreeIMFilters */
+    FreeFuncType xkb;          /* _XkbFreeInfo */
+} _XFreeFuncRec;
+
+/* types for InitExt.c */
+typedef int (*CreateGCType) (
+    Display*   /* display */,
+    GC         /* gc */,
+    XExtCodes* /* codes */
+);
+
+typedef int (*CopyGCType)(
+    Display*   /* display */,
+    GC         /* gc */,
+    XExtCodes* /* codes */
+);
+
+typedef int (*FlushGCType) (
+    Display*   /* display */,
+    GC         /* gc */,
+    XExtCodes* /* codes */
+);
+
+typedef int (*FreeGCType) (
+    Display*   /* display */,
+    GC         /* gc */,
+    XExtCodes* /* codes */
+);
+
+typedef int (*CreateFontType) (
+    Display*   /* display */,
+    XFontStruct* /* fs */,
+    XExtCodes* /* codes */
+);
+
+typedef int (*FreeFontType) (
+    Display*   /* display */,
+    XFontStruct* /* fs */,
+    XExtCodes* /* codes */
+);
+
+typedef int (*CloseDisplayType) (
+    Display*   /* display */,
+    XExtCodes* /* codes */
+);
+
+typedef int (*ErrorType) (
+    Display*   /* display */,
+    xError*    /* err */,
+    XExtCodes* /* codes */,
+    int*       /* ret_code */
+);
+
+typedef char* (*ErrorStringType) (
+    Display*   /* display */,
+    int                /* code */,
+    XExtCodes* /* codes */,
+    char*      /* buffer */,
+    int                /* nbytes */
+);
+
+typedef void (*PrintErrorType)(
+    Display*   /* display */,
+    XErrorEvent* /* ev */,
+    void*      /* fp */
+);
+
+typedef void (*BeforeFlushType)(
+    Display*   /* display */,
+    XExtCodes* /* codes */,
+    _Xconst char* /* data */,
+    long       /* len */
+);
+
+/*
+ * This structure is private to the library.
+ */
+typedef struct _XExten {               /* private to extension mechanism */
+       struct _XExten *next;           /* next in list */
+       XExtCodes codes;                /* public information, all extension told */
+       CreateGCType create_GC;         /* routine to call when GC created */
+       CopyGCType copy_GC;             /* routine to call when GC copied */
+       FlushGCType flush_GC;           /* routine to call when GC flushed */
+       FreeGCType free_GC;             /* routine to call when GC freed */
+       CreateFontType create_Font;     /* routine to call when Font created */
+       FreeFontType free_Font;         /* routine to call when Font freed */
+       CloseDisplayType close_display; /* routine to call when connection closed */
+       ErrorType error;                /* who to call when an error occurs */
+       ErrorStringType error_string;   /* routine to supply error string */
+       char *name;                     /* name of this extension */
+       PrintErrorType error_values;    /* routine to supply error values */
+       BeforeFlushType before_flush;   /* routine to call when sending data */
+       struct _XExten *next_flush;     /* next in list of those with flushes */
+} _XExtension;
+
+/* extension hooks */
+
+#ifdef DataRoutineIsProcedure
+extern void Data(Display *dpy, char *data, long len);
+#endif
+extern int _XError(
+    Display*   /* dpy */,
+    xError*    /* rep */
+);
+extern int _XIOError(
+    Display*   /* dpy */
+) _X_NORETURN;
+extern int (*_XIOErrorFunction)(
+    Display*   /* dpy */
+);
+extern int (*_XErrorFunction)(
+    Display*           /* dpy */,
+    XErrorEvent*       /* error_event */
+);
+extern void _XEatData(
+    Display*           /* dpy */,
+    unsigned long      /* n */
+);
+extern char *_XAllocScratch(
+    Display*           /* dpy */,
+    unsigned long      /* nbytes */
+);
+extern char *_XAllocTemp(
+    Display*           /* dpy */,
+    unsigned long      /* nbytes */
+);
+extern void _XFreeTemp(
+    Display*           /* dpy */,
+    char*              /* buf */,
+    unsigned long      /* nbytes */
+);
+extern Visual *_XVIDtoVisual(
+    Display*   /* dpy */,
+    VisualID   /* id */
+);
+extern unsigned long _XSetLastRequestRead(
+    Display*           /* dpy */,
+    xGenericReply*     /* rep */
+);
+extern int _XGetHostname(
+    char*      /* buf */,
+    int                /* maxlen */
+);
+extern Screen *_XScreenOfWindow(
+    Display*   /* dpy */,
+    Window     /* w */
+);
+extern Bool _XAsyncErrorHandler(
+    Display*   /* dpy */,
+    xReply*    /* rep */,
+    char*      /* buf */,
+    int                /* len */,
+    XPointer   /* data */
+);
+extern char *_XGetAsyncReply(
+    Display*   /* dpy */,
+    char*      /* replbuf */,
+    xReply*    /* rep */,
+    char*      /* buf */,
+    int                /* len */,
+    int                /* extra */,
+    Bool       /* discard */
+);
+extern void _XGetAsyncData(
+    Display*   /* dpy */,
+    char *     /* data */,
+    char *     /* buf */,
+    int                /* len */,
+    int                /* skip */,
+    int                /* datalen */,
+    int                /* discardtotal */
+);
+extern void _XFlush(
+    Display*   /* dpy */
+);
+extern int _XEventsQueued(
+    Display*   /* dpy */,
+    int        /* mode */
+);
+extern void _XReadEvents(
+    Display*   /* dpy */
+);
+extern int _XRead(
+    Display*   /* dpy */,
+    char*      /* data */,
+    long       /* size */
+);
+extern void _XReadPad(
+    Display*   /* dpy */,
+    char*      /* data */,
+    long       /* size */
+);
+extern void _XSend(
+    Display*           /* dpy */,
+    _Xconst char*      /* data */,
+    long               /* size */
+);
+extern Status _XReply(
+    Display*   /* dpy */,
+    xReply*    /* rep */,
+    int                /* extra */,
+    Bool       /* discard */
+);
+extern void _XEnq(
+    Display*   /* dpy */,
+    xEvent*    /* event */
+);
+extern void _XDeq(
+    Display*   /* dpy */,
+    _XQEvent*  /* prev */,
+    _XQEvent*  /* qelt */
+);
+
+extern Bool _XUnknownWireEvent(
+    Display*   /* dpy */,
+    XEvent*    /* re */,
+    xEvent*    /* event */
+);
+
+extern Bool _XUnknownWireEventCookie(
+    Display*   /* dpy */,
+    XGenericEventCookie*       /* re */,
+    xEvent*    /* event */
+);
+
+extern Bool _XUnknownCopyEventCookie(
+    Display*   /* dpy */,
+    XGenericEventCookie*       /* in */,
+    XGenericEventCookie*       /* out */
+);
+
+extern Status _XUnknownNativeEvent(
+    Display*   /* dpy */,
+    XEvent*    /* re */,
+    xEvent*    /* event */
+);
+
+extern Bool _XWireToEvent(Display *dpy, XEvent *re, xEvent *event);
+extern Bool _XDefaultWireError(Display *display, XErrorEvent *he, xError *we);
+extern Bool _XPollfdCacheInit(Display *dpy);
+extern void _XPollfdCacheAdd(Display *dpy, int fd);
+extern void _XPollfdCacheDel(Display *dpy, int fd);
+extern XID _XAllocID(Display *dpy);
+extern void _XAllocIDs(Display *dpy, XID *ids, int count);
+
+extern int _XFreeExtData(
+    XExtData*  /* extension */
+);
+
+extern int (*XESetCreateGC(
+    Display*           /* display */,
+    int                        /* extension */,
+    int (*) (
+             Display*                  /* display */,
+             GC                        /* gc */,
+             XExtCodes*                /* codes */
+           )           /* proc */
+))(
+    Display*, GC, XExtCodes*
+);
+
+extern int (*XESetCopyGC(
+    Display*           /* display */,
+    int                        /* extension */,
+    int (*) (
+             Display*                  /* display */,
+              GC                       /* gc */,
+              XExtCodes*               /* codes */
+            )          /* proc */
+))(
+    Display*, GC, XExtCodes*
+);
+
+extern int (*XESetFlushGC(
+    Display*           /* display */,
+    int                        /* extension */,
+    int (*) (
+             Display*                  /* display */,
+              GC                       /* gc */,
+              XExtCodes*               /* codes */
+            )          /* proc */
+))(
+    Display*, GC, XExtCodes*
+);
+
+extern int (*XESetFreeGC(
+    Display*           /* display */,
+    int                        /* extension */,
+    int (*) (
+             Display*                  /* display */,
+              GC                       /* gc */,
+              XExtCodes*               /* codes */
+            )          /* proc */
+))(
+    Display*, GC, XExtCodes*
+);
+
+extern int (*XESetCreateFont(
+    Display*           /* display */,
+    int                        /* extension */,
+    int (*) (
+             Display*                  /* display */,
+              XFontStruct*             /* fs */,
+              XExtCodes*               /* codes */
+            )          /* proc */
+))(
+    Display*, XFontStruct*, XExtCodes*
+);
+
+extern int (*XESetFreeFont(
+    Display*           /* display */,
+    int                        /* extension */,
+    int (*) (
+             Display*                  /* display */,
+              XFontStruct*             /* fs */,
+              XExtCodes*               /* codes */
+            )          /* proc */
+))(
+    Display*, XFontStruct*, XExtCodes*
+);
+
+extern int (*XESetCloseDisplay(
+    Display*           /* display */,
+    int                        /* extension */,
+    int (*) (
+             Display*                  /* display */,
+              XExtCodes*               /* codes */
+            )          /* proc */
+))(
+    Display*, XExtCodes*
+);
+
+extern int (*XESetError(
+    Display*           /* display */,
+    int                        /* extension */,
+    int (*) (
+             Display*                  /* display */,
+              xError*                  /* err */,
+              XExtCodes*               /* codes */,
+              int*                     /* ret_code */
+            )          /* proc */
+))(
+    Display*, xError*, XExtCodes*, int*
+);
+
+extern char* (*XESetErrorString(
+    Display*           /* display */,
+    int                        /* extension */,
+    char* (*) (
+               Display*                /* display */,
+                int                    /* code */,
+                XExtCodes*             /* codes */,
+                char*                  /* buffer */,
+                int                    /* nbytes */
+              )                /* proc */
+))(
+    Display*, int, XExtCodes*, char*, int
+);
+
+extern void (*XESetPrintErrorValues (
+    Display*           /* display */,
+    int                        /* extension */,
+    void (*)(
+             Display*                  /* display */,
+             XErrorEvent*              /* ev */,
+             void*                     /* fp */
+            )          /* proc */
+))(
+    Display*, XErrorEvent*, void*
+);
+
+extern Bool (*XESetWireToEvent(
+    Display*           /* display */,
+    int                        /* event_number */,
+    Bool (*) (
+              Display*                 /* display */,
+               XEvent*                 /* re */,
+               xEvent*                 /* event */
+             )         /* proc */
+))(
+    Display*, XEvent*, xEvent*
+);
+
+extern Bool (*XESetWireToEventCookie(
+    Display*           /* display */,
+    int                        /* extension */,
+    Bool (*) (
+              Display*                 /* display */,
+               XGenericEventCookie*    /* re */,
+               xEvent*                 /* event */
+             )         /* proc */
+))(
+    Display*, XGenericEventCookie*, xEvent*
+);
+
+extern Bool (*XESetCopyEventCookie(
+    Display*           /* display */,
+    int                        /* extension */,
+    Bool (*) (
+              Display*                 /* display */,
+               XGenericEventCookie*    /* in */,
+               XGenericEventCookie*    /* out */
+             )         /* proc */
+))(
+    Display*, XGenericEventCookie*, XGenericEventCookie*
+);
+
+
+extern Status (*XESetEventToWire(
+    Display*           /* display */,
+    int                        /* event_number */,
+    Status (*) (
+             Display*                  /* display */,
+              XEvent*                  /* re */,
+              xEvent*                  /* event */
+            )          /* proc */
+))(
+    Display*, XEvent*, xEvent*
+);
+
+extern Bool (*XESetWireToError(
+    Display*           /* display */,
+    int                        /* error_number */,
+    Bool (*) (
+              Display*                 /* display */,
+              XErrorEvent*             /* he */,
+              xError*                  /* we */
+            )          /* proc */
+))(
+    Display*, XErrorEvent*, xError*
+);
+
+extern void (*XESetBeforeFlush(
+    Display*           /* display */,
+    int                        /* error_number */,
+    void (*) (
+              Display*                 /* display */,
+              XExtCodes*               /* codes */,
+              _Xconst char*            /* data */,
+              long                     /* len */
+            )          /* proc */
+))(
+    Display*, XExtCodes*, _Xconst char*, long
+);
+
+/* internal connections for IMs */
+
+typedef void (*_XInternalConnectionProc)(
+    Display*                   /* dpy */,
+    int                                /* fd */,
+    XPointer                   /* call_data */
+);
+
+
+extern Status _XRegisterInternalConnection(
+    Display*                   /* dpy */,
+    int                                /* fd */,
+    _XInternalConnectionProc   /* callback */,
+    XPointer                   /* call_data */
+);
+
+extern void _XUnregisterInternalConnection(
+    Display*                   /* dpy */,
+    int                                /* fd */
+);
+
+extern void _XProcessInternalConnection(
+    Display*                   /* dpy */,
+    struct _XConnectionInfo*   /* conn_info */
+);
+
+/* Display structure has pointers to these */
+
+struct _XConnectionInfo {      /* info from _XRegisterInternalConnection */
+    int fd;
+    _XInternalConnectionProc read_callback;
+    XPointer call_data;
+    XPointer *watch_data;      /* set/used by XConnectionWatchProc */
+    struct _XConnectionInfo *next;
+};
+
+struct _XConnWatchInfo {       /* info from XAddConnectionWatch */
+    XConnectionWatchProc fn;
+    XPointer client_data;
+    struct _XConnWatchInfo *next;
+};
+
+#ifdef __UNIXOS2__
+extern char* __XOS2RedirRoot(
+    char*
+);
+#endif
+
+extern int _XTextHeight(
+    XFontStruct*       /* font_struct */,
+    _Xconst char*      /* string */,
+    int                        /* count */
+);
+
+extern int _XTextHeight16(
+    XFontStruct*       /* font_struct */,
+    _Xconst XChar2b*   /* string */,
+    int                        /* count */
+);
+
+#if defined(WIN32)
+
+extern int _XOpenFile(
+    _Xconst char*      /* path */,
+    int                        /* flags */
+);
+
+extern int _XOpenFileMode(
+    _Xconst char*      /* path */,
+    int                        /* flags */,
+    mode_t              /* mode */
+);
+
+extern void* _XFopenFile(
+    _Xconst char*      /* path */,
+    _Xconst char*      /* mode */
+);
+
+extern int _XAccessFile(
+    _Xconst char*      /* path */
+);
+#else
+#define _XOpenFile(path,flags) open(path,flags)
+#define _XOpenFileMode(path,flags,mode) open(path,flags,mode)
+#define _XFopenFile(path,mode) fopen(path,mode)
+#endif
+
+/* EvToWire.c */
+extern Status _XEventToWire(Display *dpy, XEvent *re, xEvent *event);
+
+extern int _XF86LoadQueryLocaleFont(
+    Display*           /* dpy */,
+    _Xconst char*      /* name*/,
+    XFontStruct**      /* xfp*/,
+    Font*              /* fidp */
+);
+
+extern void _XProcessWindowAttributes (
+    register Display *dpy,
+    xChangeWindowAttributesReq *req,
+    register unsigned long valuemask,
+    register XSetWindowAttributes *attributes);
+
+extern int _XDefaultError(
+        Display *dpy,
+        XErrorEvent *event);
+
+extern int _XDefaultIOError(
+        Display *dpy);
+
+extern void _XSetClipRectangles (
+    register Display *dpy,
+    GC gc,
+    int clip_x_origin, int clip_y_origin,
+    XRectangle *rectangles,
+    int n,
+    int ordering);
+
+Status _XGetWindowAttributes(
+    register Display *dpy,
+    Window w,
+    XWindowAttributes *attr);
+
+int _XPutBackEvent (
+    register Display *dpy,
+    register XEvent *event);
+
+extern Bool _XIsEventCookie(
+        Display *dpy,
+        XEvent *ev);
+
+extern void _XFreeEventCookies(
+        Display *dpy);
+
+extern void _XStoreEventCookie(
+        Display *dpy,
+        XEvent *ev);
+
+extern Bool _XFetchEventCookie(
+        Display *dpy,
+        XGenericEventCookie *ev);
+
+extern Bool _XCopyEventCookie(
+        Display *dpy,
+        XGenericEventCookie *in,
+        XGenericEventCookie *out);
+
+/* lcFile.c */
+
+extern void xlocaledir(
+    char *buf,
+    int buf_len
+);
+
+_XFUNCPROTOEND
+
+#endif /* _X11_XLIBINT_H_ */
diff --git a/include/X11/Xlocale.h b/include/X11/Xlocale.h
new file mode 100644 (file)
index 0000000..98946e5
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+
+Copyright 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.
+
+*/
+
+#ifndef _X11_XLOCALE_H_
+#define _X11_XLOCALE_H_
+
+#include <X11/Xfuncproto.h>
+#include <X11/Xosdefs.h>
+
+#ifndef X_LOCALE
+#include <locale.h>
+#else
+
+#define LC_ALL      0
+#define LC_COLLATE  1
+#define LC_CTYPE    2
+#define LC_MONETARY 3
+#define LC_NUMERIC  4
+#define LC_TIME     5
+
+_XFUNCPROTOBEGIN
+extern char *_Xsetlocale(
+    int /* category */,
+    _Xconst char* /* name */
+);
+_XFUNCPROTOEND
+
+#define setlocale _Xsetlocale
+
+#include <stddef.h>
+
+#endif /* X_LOCALE */
+
+#endif /* _X11_XLOCALE_H_ */
diff --git a/include/X11/Xregion.h b/include/X11/Xregion.h
new file mode 100644 (file)
index 0000000..c25d70b
--- /dev/null
@@ -0,0 +1,189 @@
+/************************************************************************
+
+Copyright 1987, 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 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 _X11_XREGION_H_
+#define _X11_XREGION_H_
+
+typedef struct {
+    short x1, x2, y1, y2;
+} Box, BOX, BoxRec, *BoxPtr;
+
+typedef struct {
+    short x, y, width, height;
+}RECTANGLE, RectangleRec, *RectanglePtr;
+
+#define TRUE 1
+#define FALSE 0
+#define MAXSHORT 32767
+#define MINSHORT -MAXSHORT
+#ifndef MAX
+#define MAX(a,b) (((a) > (b)) ? (a) : (b))
+#endif
+#ifndef MIN
+#define MIN(a,b) (((a) < (b)) ? (a) : (b))
+#endif
+
+
+/*
+ *   clip region
+ */
+
+typedef struct _XRegion {
+    long size;
+    long numRects;
+    BOX *rects;
+    BOX extents;
+} REGION;
+
+/* Xutil.h contains the declaration:
+ * typedef struct _XRegion *Region;
+ */
+
+/*  1 if two BOXs overlap.
+ *  0 if two BOXs do not overlap.
+ *  Remember, x2 and y2 are not in the region
+ */
+#define EXTENTCHECK(r1, r2) \
+       ((r1)->x2 > (r2)->x1 && \
+        (r1)->x1 < (r2)->x2 && \
+        (r1)->y2 > (r2)->y1 && \
+        (r1)->y1 < (r2)->y2)
+
+/*
+ *  update region extents
+ */
+#define EXTENTS(r,idRect){\
+            if((r)->x1 < (idRect)->extents.x1)\
+              (idRect)->extents.x1 = (r)->x1;\
+            if((r)->y1 < (idRect)->extents.y1)\
+              (idRect)->extents.y1 = (r)->y1;\
+            if((r)->x2 > (idRect)->extents.x2)\
+              (idRect)->extents.x2 = (r)->x2;\
+            if((r)->y2 > (idRect)->extents.y2)\
+              (idRect)->extents.y2 = (r)->y2;\
+        }
+
+/*
+ *   Check to see if there is enough memory in the present region.
+ */
+#define MEMCHECK(reg, rect, firstrect){\
+        if ((reg)->numRects >= ((reg)->size - 1)){\
+          (firstrect) = (BOX *) Xrealloc \
+          ((char *)(firstrect), (unsigned) (2 * (sizeof(BOX)) * ((reg)->size)));\
+          if ((firstrect) == 0)\
+            return(0);\
+          (reg)->size *= 2;\
+          (rect) = &(firstrect)[(reg)->numRects];\
+         }\
+       }
+
+/*  this routine checks to see if the previous rectangle is the same
+ *  or subsumes the new rectangle to add.
+ */
+
+#define CHECK_PREVIOUS(Reg, R, Rx1, Ry1, Rx2, Ry2)\
+               (!(((Reg)->numRects > 0)&&\
+                  ((R-1)->y1 == (Ry1)) &&\
+                  ((R-1)->y2 == (Ry2)) &&\
+                  ((R-1)->x1 <= (Rx1)) &&\
+                  ((R-1)->x2 >= (Rx2))))
+
+/*  add a rectangle to the given Region */
+#define ADDRECT(reg, r, rx1, ry1, rx2, ry2){\
+    if (((rx1) < (rx2)) && ((ry1) < (ry2)) &&\
+        CHECK_PREVIOUS((reg), (r), (rx1), (ry1), (rx2), (ry2))){\
+              (r)->x1 = (rx1);\
+              (r)->y1 = (ry1);\
+              (r)->x2 = (rx2);\
+              (r)->y2 = (ry2);\
+              EXTENTS((r), (reg));\
+              (reg)->numRects++;\
+              (r)++;\
+            }\
+        }
+
+
+
+/*  add a rectangle to the given Region */
+#define ADDRECTNOX(reg, r, rx1, ry1, rx2, ry2){\
+            if ((rx1 < rx2) && (ry1 < ry2) &&\
+                CHECK_PREVIOUS((reg), (r), (rx1), (ry1), (rx2), (ry2))){\
+              (r)->x1 = (rx1);\
+              (r)->y1 = (ry1);\
+              (r)->x2 = (rx2);\
+              (r)->y2 = (ry2);\
+              (reg)->numRects++;\
+              (r)++;\
+            }\
+        }
+
+#define EMPTY_REGION(pReg) pReg->numRects = 0
+
+#define REGION_NOT_EMPTY(pReg) pReg->numRects
+
+#define INBOX(r, x, y) \
+      ( ( ((r).x2 >  x)) && \
+        ( ((r).x1 <= x)) && \
+        ( ((r).y2 >  y)) && \
+        ( ((r).y1 <= y)) )
+
+/*
+ * number of points to buffer before sending them off
+ * to scanlines() :  Must be an even number
+ */
+#define NUMPTSTOBUFFER 200
+
+/*
+ * used to allocate buffers for points and link
+ * the buffers together
+ */
+typedef struct _POINTBLOCK {
+    XPoint pts[NUMPTSTOBUFFER];
+    struct _POINTBLOCK *next;
+} POINTBLOCK;
+
+#endif /* _X11_XREGION_H_ */
diff --git a/include/X11/Xresource.h b/include/X11/Xresource.h
new file mode 100644 (file)
index 0000000..6dbb3ce
--- /dev/null
@@ -0,0 +1,358 @@
+
+/***********************************************************
+
+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 _X11_XRESOURCE_H_
+#define _X11_XRESOURCE_H_
+
+#ifndef _XP_PRINT_SERVER_
+#include <X11/Xlib.h>
+#endif
+
+/****************************************************************
+ ****************************************************************
+ ***                                                          ***
+ ***                                                          ***
+ ***          X Resource Manager Intrinsics                   ***
+ ***                                                          ***
+ ***                                                          ***
+ ****************************************************************
+ ****************************************************************/
+
+_XFUNCPROTOBEGIN
+
+/****************************************************************
+ *
+ * Memory Management
+ *
+ ****************************************************************/
+
+extern char *Xpermalloc(
+    unsigned int       /* size */
+);
+
+/****************************************************************
+ *
+ * Quark Management
+ *
+ ****************************************************************/
+
+typedef int       XrmQuark, *XrmQuarkList;
+#define NULLQUARK ((XrmQuark) 0)
+
+typedef char *XrmString;
+#define NULLSTRING ((XrmString) 0)
+
+/* find quark for string, create new quark if none already exists */
+extern XrmQuark XrmStringToQuark(
+    _Xconst char*      /* string */
+);
+
+extern XrmQuark XrmPermStringToQuark(
+    _Xconst char*      /* string */
+);
+
+/* find string for quark */
+extern XrmString XrmQuarkToString(
+    XrmQuark           /* quark */
+);
+
+extern XrmQuark XrmUniqueQuark(
+    void
+);
+
+#define XrmStringsEqual(a1, a2) (strcmp(a1, a2) == 0)
+
+
+/****************************************************************
+ *
+ * Conversion of Strings to Lists
+ *
+ ****************************************************************/
+
+typedef enum {XrmBindTightly, XrmBindLoosely} XrmBinding, *XrmBindingList;
+
+extern void XrmStringToQuarkList(
+    _Xconst char*      /* string */,
+    XrmQuarkList       /* quarks_return */
+);
+
+extern void XrmStringToBindingQuarkList(
+    _Xconst char*      /* string */,
+    XrmBindingList     /* bindings_return */,
+    XrmQuarkList       /* quarks_return */
+);
+
+/****************************************************************
+ *
+ * Name and Class lists.
+ *
+ ****************************************************************/
+
+typedef XrmQuark     XrmName;
+typedef XrmQuarkList XrmNameList;
+#define XrmNameToString(name)          XrmQuarkToString(name)
+#define XrmStringToName(string)                XrmStringToQuark(string)
+#define XrmStringToNameList(str, name) XrmStringToQuarkList(str, name)
+
+typedef XrmQuark     XrmClass;
+typedef XrmQuarkList XrmClassList;
+#define XrmClassToString(c_class)      XrmQuarkToString(c_class)
+#define XrmStringToClass(c_class)      XrmStringToQuark(c_class)
+#define XrmStringToClassList(str,c_class) XrmStringToQuarkList(str, c_class)
+
+
+
+/****************************************************************
+ *
+ * Resource Representation Types and Values
+ *
+ ****************************************************************/
+
+typedef XrmQuark     XrmRepresentation;
+#define XrmStringToRepresentation(string)   XrmStringToQuark(string)
+#define        XrmRepresentationToString(type)   XrmQuarkToString(type)
+
+typedef struct {
+    unsigned int    size;
+    XPointer       addr;
+} XrmValue, *XrmValuePtr;
+
+
+/****************************************************************
+ *
+ * Resource Manager Functions
+ *
+ ****************************************************************/
+
+typedef struct _XrmHashBucketRec *XrmHashBucket;
+typedef XrmHashBucket *XrmHashTable;
+typedef XrmHashTable XrmSearchList[];
+typedef struct _XrmHashBucketRec *XrmDatabase;
+
+
+extern void XrmDestroyDatabase(
+    XrmDatabase                /* database */
+);
+
+extern void XrmQPutResource(
+    XrmDatabase*       /* database */,
+    XrmBindingList     /* bindings */,
+    XrmQuarkList       /* quarks */,
+    XrmRepresentation  /* type */,
+    XrmValue*          /* value */
+);
+
+extern void XrmPutResource(
+    XrmDatabase*       /* database */,
+    _Xconst char*      /* specifier */,
+    _Xconst char*      /* type */,
+    XrmValue*          /* value */
+);
+
+extern void XrmQPutStringResource(
+    XrmDatabase*       /* database */,
+    XrmBindingList      /* bindings */,
+    XrmQuarkList       /* quarks */,
+    _Xconst char*      /* value */
+);
+
+extern void XrmPutStringResource(
+    XrmDatabase*       /* database */,
+    _Xconst char*      /* specifier */,
+    _Xconst char*      /* value */
+);
+
+extern void XrmPutLineResource(
+    XrmDatabase*       /* database */,
+    _Xconst char*      /* line */
+);
+
+extern Bool XrmQGetResource(
+    XrmDatabase                /* database */,
+    XrmNameList                /* quark_name */,
+    XrmClassList       /* quark_class */,
+    XrmRepresentation* /* quark_type_return */,
+    XrmValue*          /* value_return */
+);
+
+extern Bool XrmGetResource(
+    XrmDatabase                /* database */,
+    _Xconst char*      /* str_name */,
+    _Xconst char*      /* str_class */,
+    char**             /* str_type_return */,
+    XrmValue*          /* value_return */
+);
+
+extern Bool XrmQGetSearchList(
+    XrmDatabase                /* database */,
+    XrmNameList                /* names */,
+    XrmClassList       /* classes */,
+    XrmSearchList      /* list_return */,
+    int                        /* list_length */
+);
+
+extern Bool XrmQGetSearchResource(
+    XrmSearchList      /* list */,
+    XrmName            /* name */,
+    XrmClass           /* class */,
+    XrmRepresentation* /* type_return */,
+    XrmValue*          /* value_return */
+);
+
+/****************************************************************
+ *
+ * Resource Database Management
+ *
+ ****************************************************************/
+
+#ifndef _XP_PRINT_SERVER_
+
+extern void XrmSetDatabase(
+    Display*           /* display */,
+    XrmDatabase                /* database */
+);
+
+extern XrmDatabase XrmGetDatabase(
+    Display*           /* display */
+);
+
+#endif /* !_XP_PRINT_SERVER_ */
+
+extern XrmDatabase XrmGetFileDatabase(
+    _Xconst char*      /* filename */
+);
+
+extern Status XrmCombineFileDatabase(
+    _Xconst char*      /* filename */,
+    XrmDatabase*       /* target */,
+    Bool               /* override */
+);
+
+extern XrmDatabase XrmGetStringDatabase(
+    _Xconst char*      /* data */  /*  null terminated string */
+);
+
+extern void XrmPutFileDatabase(
+    XrmDatabase                /* database */,
+    _Xconst char*      /* filename */
+);
+
+extern void XrmMergeDatabases(
+    XrmDatabase                /* source_db */,
+    XrmDatabase*       /* target_db */
+);
+
+extern void XrmCombineDatabase(
+    XrmDatabase                /* source_db */,
+    XrmDatabase*       /* target_db */,
+    Bool               /* override */
+);
+
+#define XrmEnumAllLevels 0
+#define XrmEnumOneLevel  1
+
+extern Bool XrmEnumerateDatabase(
+    XrmDatabase                /* db */,
+    XrmNameList                /* name_prefix */,
+    XrmClassList       /* class_prefix */,
+    int                        /* mode */,
+    Bool (*)(
+            XrmDatabase*       /* db */,
+            XrmBindingList     /* bindings */,
+            XrmQuarkList       /* quarks */,
+            XrmRepresentation* /* type */,
+            XrmValue*          /* value */,
+            XPointer           /* closure */
+            )          /* proc */,
+    XPointer           /* closure */
+);
+
+extern const char *XrmLocaleOfDatabase(
+    XrmDatabase        /* database */
+);
+
+
+/****************************************************************
+ *
+ * Command line option mapping to resource entries
+ *
+ ****************************************************************/
+
+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,   /* Resource and value in next argument in argv      */
+    XrmoptionSkipArg,   /* Ignore this option and the next argument in argv */
+    XrmoptionSkipLine,  /* Ignore this option and the rest of argv         */
+    XrmoptionSkipNArgs /* Ignore this option and the next
+                          OptionDescRes.value arguments in argv */
+} XrmOptionKind;
+
+typedef struct {
+    char           *option;        /* Option abbreviation in argv          */
+    char           *specifier;     /* Resource specifier                   */
+    XrmOptionKind   argKind;       /* Which style of option it is          */
+    XPointer       value;          /* Value to provide if XrmoptionNoArg   */
+} XrmOptionDescRec, *XrmOptionDescList;
+
+
+extern void XrmParseCommand(
+    XrmDatabase*       /* database */,
+    XrmOptionDescList  /* table */,
+    int                        /* table_count */,
+    _Xconst char*      /* name */,
+    int*               /* argc_in_out */,
+    char**             /* argv_in_out */
+);
+
+_XFUNCPROTOEND
+
+#endif /* _X11_XRESOURCE_H_ */
+/* DON'T ADD STUFF AFTER THIS #endif */
diff --git a/include/X11/Xutil.h b/include/X11/Xutil.h
new file mode 100644 (file)
index 0000000..8cab50e
--- /dev/null
@@ -0,0 +1,826 @@
+
+/***********************************************************
+
+Copyright 1987, 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 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 _X11_XUTIL_H_
+#define _X11_XUTIL_H_
+
+/* You must include <X11/Xlib.h> before including this file */
+#include <X11/Xlib.h>
+#include <X11/keysym.h>
+
+/*
+ * Bitmask returned by XParseGeometry().  Each bit tells if the corresponding
+ * value (x, y, width, height) was found in the parsed string.
+ */
+#define NoValue                0x0000
+#define XValue         0x0001
+#define YValue         0x0002
+#define WidthValue     0x0004
+#define HeightValue    0x0008
+#define AllValues      0x000F
+#define XNegative      0x0010
+#define YNegative      0x0020
+
+/*
+ * new version containing base_width, base_height, and win_gravity fields;
+ * used with WM_NORMAL_HINTS.
+ */
+typedef struct {
+       long flags;     /* marks which fields in this structure are defined */
+       int x, y;               /* obsolete for new window mgrs, but clients */
+       int width, height;      /* should set so old wm's don't mess up */
+       int min_width, min_height;
+       int max_width, max_height;
+       int width_inc, height_inc;
+       struct {
+               int x;  /* numerator */
+               int y;  /* denominator */
+       } min_aspect, max_aspect;
+       int base_width, base_height;            /* added by ICCCM version 1 */
+       int win_gravity;                        /* added by ICCCM version 1 */
+} XSizeHints;
+
+/*
+ * The next block of definitions are for window manager properties that
+ * clients and applications use for communication.
+ */
+
+/* flags argument in size hints */
+#define USPosition     (1L << 0) /* user specified x, y */
+#define USSize         (1L << 1) /* user specified width, height */
+
+#define PPosition      (1L << 2) /* program specified position */
+#define PSize          (1L << 3) /* program specified size */
+#define PMinSize       (1L << 4) /* program specified minimum size */
+#define PMaxSize       (1L << 5) /* program specified maximum size */
+#define PResizeInc     (1L << 6) /* program specified resize increments */
+#define PAspect                (1L << 7) /* program specified min and max aspect ratios */
+#define PBaseSize      (1L << 8) /* program specified base for incrementing */
+#define PWinGravity    (1L << 9) /* program specified window gravity */
+
+/* obsolete */
+#define PAllHints (PPosition|PSize|PMinSize|PMaxSize|PResizeInc|PAspect)
+
+
+
+typedef struct {
+       long flags;     /* marks which fields in this structure are defined */
+       Bool input;     /* does this application rely on the window manager to
+                       get keyboard input? */
+       int initial_state;      /* see below */
+       Pixmap icon_pixmap;     /* pixmap to be used as icon */
+       Window icon_window;     /* window to be used as icon */
+       int icon_x, icon_y;     /* initial position of icon */
+       Pixmap icon_mask;       /* icon mask bitmap */
+       XID window_group;       /* id of related window group */
+       /* this structure may be extended in the future */
+} XWMHints;
+
+/* definition for flags of XWMHints */
+
+#define InputHint              (1L << 0)
+#define StateHint              (1L << 1)
+#define IconPixmapHint         (1L << 2)
+#define IconWindowHint         (1L << 3)
+#define IconPositionHint       (1L << 4)
+#define IconMaskHint           (1L << 5)
+#define WindowGroupHint                (1L << 6)
+#define AllHints (InputHint|StateHint|IconPixmapHint|IconWindowHint| \
+IconPositionHint|IconMaskHint|WindowGroupHint)
+#define XUrgencyHint           (1L << 8)
+
+/* definitions for initial window state */
+#define WithdrawnState 0       /* for windows that are not mapped */
+#define NormalState 1  /* most applications want to start this way */
+#define IconicState 3  /* application wants to start as an icon */
+
+/*
+ * Obsolete states no longer defined by ICCCM
+ */
+#define DontCareState 0        /* don't know or care */
+#define ZoomState 2    /* application wants to start zoomed */
+#define InactiveState 4        /* application believes it is seldom used; */
+                       /* some wm's may put it on inactive menu */
+
+
+/*
+ * new structure for manipulating TEXT properties; used with WM_NAME,
+ * WM_ICON_NAME, WM_CLIENT_MACHINE, and WM_COMMAND.
+ */
+typedef struct {
+    unsigned char *value;              /* same as Property routines */
+    Atom encoding;                     /* prop type */
+    int format;                                /* prop data format: 8, 16, or 32 */
+    unsigned long nitems;              /* number of data items in value */
+} XTextProperty;
+
+#define XNoMemory -1
+#define XLocaleNotSupported -2
+#define XConverterNotFound -3
+
+typedef enum {
+    XStringStyle,              /* STRING */
+    XCompoundTextStyle,                /* COMPOUND_TEXT */
+    XTextStyle,                        /* text in owner's encoding (current locale)*/
+    XStdICCTextStyle,          /* STRING, else COMPOUND_TEXT */
+    /* The following is an XFree86 extension, introduced in November 2000 */
+    XUTF8StringStyle           /* UTF8_STRING */
+} XICCEncodingStyle;
+
+typedef struct {
+       int min_width, min_height;
+       int max_width, max_height;
+       int width_inc, height_inc;
+} XIconSize;
+
+typedef struct {
+       char *res_name;
+       char *res_class;
+} XClassHint;
+
+#ifdef XUTIL_DEFINE_FUNCTIONS
+extern int XDestroyImage(
+        XImage *ximage);
+extern unsigned long XGetPixel(
+        XImage *ximage,
+        int x, int y);
+extern int XPutPixel(
+        XImage *ximage,
+        int x, int y,
+        unsigned long pixel);
+extern XImage *XSubImage(
+        XImage *ximage,
+        int x, int y,
+        unsigned int width, unsigned int height);
+extern int XAddPixel(
+        XImage *ximage,
+        long value);
+#else
+/*
+ * These macros are used to give some sugar to the image routines so that
+ * naive people are more comfortable with them.
+ */
+#define XDestroyImage(ximage) \
+       ((*((ximage)->f.destroy_image))((ximage)))
+#define XGetPixel(ximage, x, y) \
+       ((*((ximage)->f.get_pixel))((ximage), (x), (y)))
+#define XPutPixel(ximage, x, y, pixel) \
+       ((*((ximage)->f.put_pixel))((ximage), (x), (y), (pixel)))
+#define XSubImage(ximage, x, y, width, height)  \
+       ((*((ximage)->f.sub_image))((ximage), (x), (y), (width), (height)))
+#define XAddPixel(ximage, value) \
+       ((*((ximage)->f.add_pixel))((ximage), (value)))
+#endif
+
+/*
+ * Compose sequence status structure, used in calling XLookupString.
+ */
+typedef struct _XComposeStatus {
+    XPointer compose_ptr;      /* state table pointer */
+    int chars_matched;         /* match state */
+} XComposeStatus;
+
+/*
+ * Keysym macros, used on Keysyms to test for classes of symbols
+ */
+#define IsKeypadKey(keysym) \
+  (((KeySym)(keysym) >= XK_KP_Space) && ((KeySym)(keysym) <= XK_KP_Equal))
+
+#define IsPrivateKeypadKey(keysym) \
+  (((KeySym)(keysym) >= 0x11000000) && ((KeySym)(keysym) <= 0x1100FFFF))
+
+#define IsCursorKey(keysym) \
+  (((KeySym)(keysym) >= XK_Home)     && ((KeySym)(keysym) <  XK_Select))
+
+#define IsPFKey(keysym) \
+  (((KeySym)(keysym) >= XK_KP_F1)     && ((KeySym)(keysym) <= XK_KP_F4))
+
+#define IsFunctionKey(keysym) \
+  (((KeySym)(keysym) >= XK_F1)       && ((KeySym)(keysym) <= XK_F35))
+
+#define IsMiscFunctionKey(keysym) \
+  (((KeySym)(keysym) >= XK_Select)   && ((KeySym)(keysym) <= XK_Break))
+
+#ifdef XK_XKB_KEYS
+#define IsModifierKey(keysym) \
+  ((((KeySym)(keysym) >= XK_Shift_L) && ((KeySym)(keysym) <= XK_Hyper_R)) \
+   || (((KeySym)(keysym) >= XK_ISO_Lock) && \
+       ((KeySym)(keysym) <= XK_ISO_Level5_Lock)) \
+   || ((KeySym)(keysym) == XK_Mode_switch) \
+   || ((KeySym)(keysym) == XK_Num_Lock))
+#else
+#define IsModifierKey(keysym) \
+  ((((KeySym)(keysym) >= XK_Shift_L) && ((KeySym)(keysym) <= XK_Hyper_R)) \
+   || ((KeySym)(keysym) == XK_Mode_switch) \
+   || ((KeySym)(keysym) == XK_Num_Lock))
+#endif
+/*
+ * opaque reference to Region data type
+ */
+typedef struct _XRegion *Region;
+
+/* Return values from XRectInRegion() */
+
+#define RectangleOut 0
+#define RectangleIn  1
+#define RectanglePart 2
+
+
+/*
+ * Information used by the visual utility routines to find desired visual
+ * type from the many visuals a display may support.
+ */
+
+typedef struct {
+  Visual *visual;
+  VisualID visualid;
+  int screen;
+  int depth;
+#if defined(__cplusplus) || defined(c_plusplus)
+  int c_class;                                 /* C++ */
+#else
+  int class;
+#endif
+  unsigned long red_mask;
+  unsigned long green_mask;
+  unsigned long blue_mask;
+  int colormap_size;
+  int bits_per_rgb;
+} XVisualInfo;
+
+#define VisualNoMask           0x0
+#define VisualIDMask           0x1
+#define VisualScreenMask       0x2
+#define VisualDepthMask                0x4
+#define VisualClassMask                0x8
+#define VisualRedMaskMask      0x10
+#define VisualGreenMaskMask    0x20
+#define VisualBlueMaskMask     0x40
+#define VisualColormapSizeMask 0x80
+#define VisualBitsPerRGBMask   0x100
+#define VisualAllMask          0x1FF
+
+/*
+ * This defines a window manager property that clients may use to
+ * share standard color maps of type RGB_COLOR_MAP:
+ */
+typedef struct {
+       Colormap colormap;
+       unsigned long red_max;
+       unsigned long red_mult;
+       unsigned long green_max;
+       unsigned long green_mult;
+       unsigned long blue_max;
+       unsigned long blue_mult;
+       unsigned long base_pixel;
+       VisualID visualid;              /* added by ICCCM version 1 */
+       XID killid;                     /* added by ICCCM version 1 */
+} XStandardColormap;
+
+#define ReleaseByFreeingColormap ((XID) 1L)  /* for killid field above */
+
+
+/*
+ * return codes for XReadBitmapFile and XWriteBitmapFile
+ */
+#define BitmapSuccess          0
+#define BitmapOpenFailed       1
+#define BitmapFileInvalid      2
+#define BitmapNoMemory         3
+
+/****************************************************************
+ *
+ * Context Management
+ *
+ ****************************************************************/
+
+
+/* Associative lookup table return codes */
+
+#define XCSUCCESS 0    /* No error. */
+#define XCNOMEM   1    /* Out of memory */
+#define XCNOENT   2    /* No entry in table */
+
+typedef int XContext;
+
+#define XUniqueContext()       ((XContext) XrmUniqueQuark())
+#define XStringToContext(string)   ((XContext) XrmStringToQuark(string))
+
+_XFUNCPROTOBEGIN
+
+/* The following declarations are alphabetized. */
+
+extern XClassHint *XAllocClassHint (
+    void
+);
+
+extern XIconSize *XAllocIconSize (
+    void
+);
+
+extern XSizeHints *XAllocSizeHints (
+    void
+);
+
+extern XStandardColormap *XAllocStandardColormap (
+    void
+);
+
+extern XWMHints *XAllocWMHints (
+    void
+);
+
+extern int XClipBox(
+    Region             /* r */,
+    XRectangle*                /* rect_return */
+);
+
+extern Region XCreateRegion(
+    void
+);
+
+extern const char *XDefaultString (void);
+
+extern int XDeleteContext(
+    Display*           /* display */,
+    XID                        /* rid */,
+    XContext           /* context */
+);
+
+extern int XDestroyRegion(
+    Region             /* r */
+);
+
+extern int XEmptyRegion(
+    Region             /* r */
+);
+
+extern int XEqualRegion(
+    Region             /* r1 */,
+    Region             /* r2 */
+);
+
+extern int XFindContext(
+    Display*           /* display */,
+    XID                        /* rid */,
+    XContext           /* context */,
+    XPointer*          /* data_return */
+);
+
+extern Status XGetClassHint(
+    Display*           /* display */,
+    Window             /* w */,
+    XClassHint*                /* class_hints_return */
+);
+
+extern Status XGetIconSizes(
+    Display*           /* display */,
+    Window             /* w */,
+    XIconSize**                /* size_list_return */,
+    int*               /* count_return */
+);
+
+extern Status XGetNormalHints(
+    Display*           /* display */,
+    Window             /* w */,
+    XSizeHints*                /* hints_return */
+);
+
+extern Status XGetRGBColormaps(
+    Display*           /* display */,
+    Window             /* w */,
+    XStandardColormap** /* stdcmap_return */,
+    int*               /* count_return */,
+    Atom               /* property */
+);
+
+extern Status XGetSizeHints(
+    Display*           /* display */,
+    Window             /* w */,
+    XSizeHints*                /* hints_return */,
+    Atom               /* property */
+);
+
+extern Status XGetStandardColormap(
+    Display*           /* display */,
+    Window             /* w */,
+    XStandardColormap* /* colormap_return */,
+    Atom               /* property */
+);
+
+extern Status XGetTextProperty(
+    Display*           /* display */,
+    Window             /* window */,
+    XTextProperty*     /* text_prop_return */,
+    Atom               /* property */
+);
+
+extern XVisualInfo *XGetVisualInfo(
+    Display*           /* display */,
+    long               /* vinfo_mask */,
+    XVisualInfo*       /* vinfo_template */,
+    int*               /* nitems_return */
+);
+
+extern Status XGetWMClientMachine(
+    Display*           /* display */,
+    Window             /* w */,
+    XTextProperty*     /* text_prop_return */
+);
+
+extern XWMHints *XGetWMHints(
+    Display*           /* display */,
+    Window             /* w */
+);
+
+extern Status XGetWMIconName(
+    Display*           /* display */,
+    Window             /* w */,
+    XTextProperty*     /* text_prop_return */
+);
+
+extern Status XGetWMName(
+    Display*           /* display */,
+    Window             /* w */,
+    XTextProperty*     /* text_prop_return */
+);
+
+extern Status XGetWMNormalHints(
+    Display*           /* display */,
+    Window             /* w */,
+    XSizeHints*                /* hints_return */,
+    long*              /* supplied_return */
+);
+
+extern Status XGetWMSizeHints(
+    Display*           /* display */,
+    Window             /* w */,
+    XSizeHints*                /* hints_return */,
+    long*              /* supplied_return */,
+    Atom               /* property */
+);
+
+extern Status XGetZoomHints(
+    Display*           /* display */,
+    Window             /* w */,
+    XSizeHints*                /* zhints_return */
+);
+
+extern int XIntersectRegion(
+    Region             /* sra */,
+    Region             /* srb */,
+    Region             /* dr_return */
+);
+
+extern void XConvertCase(
+    KeySym             /* sym */,
+    KeySym*            /* lower */,
+    KeySym*            /* upper */
+);
+
+extern int XLookupString(
+    XKeyEvent*         /* event_struct */,
+    char*              /* buffer_return */,
+    int                        /* bytes_buffer */,
+    KeySym*            /* keysym_return */,
+    XComposeStatus*    /* status_in_out */
+);
+
+extern Status XMatchVisualInfo(
+    Display*           /* display */,
+    int                        /* screen */,
+    int                        /* depth */,
+    int                        /* class */,
+    XVisualInfo*       /* vinfo_return */
+);
+
+extern int XOffsetRegion(
+    Region             /* r */,
+    int                        /* dx */,
+    int                        /* dy */
+);
+
+extern Bool XPointInRegion(
+    Region             /* r */,
+    int                        /* x */,
+    int                        /* y */
+);
+
+extern Region XPolygonRegion(
+    XPoint*            /* points */,
+    int                        /* n */,
+    int                        /* fill_rule */
+);
+
+extern int XRectInRegion(
+    Region             /* r */,
+    int                        /* x */,
+    int                        /* y */,
+    unsigned int       /* width */,
+    unsigned int       /* height */
+);
+
+extern int XSaveContext(
+    Display*           /* display */,
+    XID                        /* rid */,
+    XContext           /* context */,
+    _Xconst char*      /* data */
+);
+
+extern int XSetClassHint(
+    Display*           /* display */,
+    Window             /* w */,
+    XClassHint*                /* class_hints */
+);
+
+extern int XSetIconSizes(
+    Display*           /* display */,
+    Window             /* w */,
+    XIconSize*         /* size_list */,
+    int                        /* count */
+);
+
+extern int XSetNormalHints(
+    Display*           /* display */,
+    Window             /* w */,
+    XSizeHints*                /* hints */
+);
+
+extern void XSetRGBColormaps(
+    Display*           /* display */,
+    Window             /* w */,
+    XStandardColormap* /* stdcmaps */,
+    int                        /* count */,
+    Atom               /* property */
+);
+
+extern int XSetSizeHints(
+    Display*           /* display */,
+    Window             /* w */,
+    XSizeHints*                /* hints */,
+    Atom               /* property */
+);
+
+extern int XSetStandardProperties(
+    Display*           /* display */,
+    Window             /* w */,
+    _Xconst char*      /* window_name */,
+    _Xconst char*      /* icon_name */,
+    Pixmap             /* icon_pixmap */,
+    char**             /* argv */,
+    int                        /* argc */,
+    XSizeHints*                /* hints */
+);
+
+extern void XSetTextProperty(
+    Display*           /* display */,
+    Window             /* w */,
+    XTextProperty*     /* text_prop */,
+    Atom               /* property */
+);
+
+extern void XSetWMClientMachine(
+    Display*           /* display */,
+    Window             /* w */,
+    XTextProperty*     /* text_prop */
+);
+
+extern int XSetWMHints(
+    Display*           /* display */,
+    Window             /* w */,
+    XWMHints*          /* wm_hints */
+);
+
+extern void XSetWMIconName(
+    Display*           /* display */,
+    Window             /* w */,
+    XTextProperty*     /* text_prop */
+);
+
+extern void XSetWMName(
+    Display*           /* display */,
+    Window             /* w */,
+    XTextProperty*     /* text_prop */
+);
+
+extern void XSetWMNormalHints(
+    Display*           /* display */,
+    Window             /* w */,
+    XSizeHints*                /* hints */
+);
+
+extern void XSetWMProperties(
+    Display*           /* display */,
+    Window             /* w */,
+    XTextProperty*     /* window_name */,
+    XTextProperty*     /* icon_name */,
+    char**             /* argv */,
+    int                        /* argc */,
+    XSizeHints*                /* normal_hints */,
+    XWMHints*          /* wm_hints */,
+    XClassHint*                /* class_hints */
+);
+
+extern void XmbSetWMProperties(
+    Display*           /* display */,
+    Window             /* w */,
+    _Xconst char*      /* window_name */,
+    _Xconst char*      /* icon_name */,
+    char**             /* argv */,
+    int                        /* argc */,
+    XSizeHints*                /* normal_hints */,
+    XWMHints*          /* wm_hints */,
+    XClassHint*                /* class_hints */
+);
+
+extern void Xutf8SetWMProperties(
+    Display*           /* display */,
+    Window             /* w */,
+    _Xconst char*      /* window_name */,
+    _Xconst char*      /* icon_name */,
+    char**             /* argv */,
+    int                        /* argc */,
+    XSizeHints*                /* normal_hints */,
+    XWMHints*          /* wm_hints */,
+    XClassHint*                /* class_hints */
+);
+
+extern void XSetWMSizeHints(
+    Display*           /* display */,
+    Window             /* w */,
+    XSizeHints*                /* hints */,
+    Atom               /* property */
+);
+
+extern int XSetRegion(
+    Display*           /* display */,
+    GC                 /* gc */,
+    Region             /* r */
+);
+
+extern void XSetStandardColormap(
+    Display*           /* display */,
+    Window             /* w */,
+    XStandardColormap* /* colormap */,
+    Atom               /* property */
+);
+
+extern int XSetZoomHints(
+    Display*           /* display */,
+    Window             /* w */,
+    XSizeHints*                /* zhints */
+);
+
+extern int XShrinkRegion(
+    Region             /* r */,
+    int                        /* dx */,
+    int                        /* dy */
+);
+
+extern Status XStringListToTextProperty(
+    char**             /* list */,
+    int                        /* count */,
+    XTextProperty*     /* text_prop_return */
+);
+
+extern int XSubtractRegion(
+    Region             /* sra */,
+    Region             /* srb */,
+    Region             /* dr_return */
+);
+
+extern int XmbTextListToTextProperty(
+    Display*           display,
+    char**             list,
+    int                        count,
+    XICCEncodingStyle  style,
+    XTextProperty*     text_prop_return
+);
+
+extern int XwcTextListToTextProperty(
+    Display*           display,
+    wchar_t**          list,
+    int                        count,
+    XICCEncodingStyle  style,
+    XTextProperty*     text_prop_return
+);
+
+extern int Xutf8TextListToTextProperty(
+    Display*           display,
+    char**             list,
+    int                        count,
+    XICCEncodingStyle  style,
+    XTextProperty*     text_prop_return
+);
+
+extern void XwcFreeStringList(
+    wchar_t**          list
+);
+
+extern Status XTextPropertyToStringList(
+    XTextProperty*     /* text_prop */,
+    char***            /* list_return */,
+    int*               /* count_return */
+);
+
+extern int XmbTextPropertyToTextList(
+    Display*           display,
+    const XTextProperty* text_prop,
+    char***            list_return,
+    int*               count_return
+);
+
+extern int XwcTextPropertyToTextList(
+    Display*           display,
+    const XTextProperty* text_prop,
+    wchar_t***         list_return,
+    int*               count_return
+);
+
+extern int Xutf8TextPropertyToTextList(
+    Display*           display,
+    const XTextProperty* text_prop,
+    char***            list_return,
+    int*               count_return
+);
+
+extern int XUnionRectWithRegion(
+    XRectangle*                /* rectangle */,
+    Region             /* src_region */,
+    Region             /* dest_region_return */
+);
+
+extern int XUnionRegion(
+    Region             /* sra */,
+    Region             /* srb */,
+    Region             /* dr_return */
+);
+
+extern int XWMGeometry(
+    Display*           /* display */,
+    int                        /* screen_number */,
+    _Xconst char*      /* user_geometry */,
+    _Xconst char*      /* default_geometry */,
+    unsigned int       /* border_width */,
+    XSizeHints*                /* hints */,
+    int*               /* x_return */,
+    int*               /* y_return */,
+    int*               /* width_return */,
+    int*               /* height_return */,
+    int*               /* gravity_return */
+);
+
+extern int XXorRegion(
+    Region             /* sra */,
+    Region             /* srb */,
+    Region             /* dr_return */
+);
+
+_XFUNCPROTOEND
+
+#endif /* _X11_XUTIL_H_ */
diff --git a/include/X11/cursorfont.h b/include/X11/cursorfont.h
new file mode 100644 (file)
index 0000000..c69d508
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+
+Copyright 1987, 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 _X11_CURSORFONT_H_
+#define _X11_CURSORFONT_H_
+
+#define XC_num_glyphs 154
+#define XC_X_cursor 0
+#define XC_arrow 2
+#define XC_based_arrow_down 4
+#define XC_based_arrow_up 6
+#define XC_boat 8
+#define XC_bogosity 10
+#define XC_bottom_left_corner 12
+#define XC_bottom_right_corner 14
+#define XC_bottom_side 16
+#define XC_bottom_tee 18
+#define XC_box_spiral 20
+#define XC_center_ptr 22
+#define XC_circle 24
+#define XC_clock 26
+#define XC_coffee_mug 28
+#define XC_cross 30
+#define XC_cross_reverse 32
+#define XC_crosshair 34
+#define XC_diamond_cross 36
+#define XC_dot 38
+#define XC_dotbox 40
+#define XC_double_arrow 42
+#define XC_draft_large 44
+#define XC_draft_small 46
+#define XC_draped_box 48
+#define XC_exchange 50
+#define XC_fleur 52
+#define XC_gobbler 54
+#define XC_gumby 56
+#define XC_hand1 58
+#define XC_hand2 60
+#define XC_heart 62
+#define XC_icon 64
+#define XC_iron_cross 66
+#define XC_left_ptr 68
+#define XC_left_side 70
+#define XC_left_tee 72
+#define XC_leftbutton 74
+#define XC_ll_angle 76
+#define XC_lr_angle 78
+#define XC_man 80
+#define XC_middlebutton 82
+#define XC_mouse 84
+#define XC_pencil 86
+#define XC_pirate 88
+#define XC_plus 90
+#define XC_question_arrow 92
+#define XC_right_ptr 94
+#define XC_right_side 96
+#define XC_right_tee 98
+#define XC_rightbutton 100
+#define XC_rtl_logo 102
+#define XC_sailboat 104
+#define XC_sb_down_arrow 106
+#define XC_sb_h_double_arrow 108
+#define XC_sb_left_arrow 110
+#define XC_sb_right_arrow 112
+#define XC_sb_up_arrow 114
+#define XC_sb_v_double_arrow 116
+#define XC_shuttle 118
+#define XC_sizing 120
+#define XC_spider 122
+#define XC_spraycan 124
+#define XC_star 126
+#define XC_target 128
+#define XC_tcross 130
+#define XC_top_left_arrow 132
+#define XC_top_left_corner 134
+#define XC_top_right_corner 136
+#define XC_top_side 138
+#define XC_top_tee 140
+#define XC_trek 142
+#define XC_ul_angle 144
+#define XC_umbrella 146
+#define XC_ur_angle 148
+#define XC_watch 150
+#define XC_xterm 152
+
+#endif /* _X11_CURSORFONT_H_ */
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/AllPlanes.man b/man/AllPlanes.man
new file mode 100644 (file)
index 0000000..2311447
--- /dev/null
@@ -0,0 +1,379 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 AllPlanes __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+AllPlanes, BlackPixel, WhitePixel, ConnectionNumber, DefaultColormap, DefaultDepth, XListDepths, DefaultGC, DefaultRootWindow, DefaultScreenOfDisplay, DefaultScreen, DefaultVisual, DisplayCells, DisplayPlanes, DisplayString, XMaxRequestSize, XExtendedMaxRequestSize, LastKnownRequestProcessed, NextRequest, ProtocolVersion, ProtocolRevision, QLength, RootWindow, ScreenCount, ScreenOfDisplay, ServerVendor, VendorRelease \- Display macros and functions
+.SH SYNTAX
+unsigned long AllPlanes; 
+.HP
+unsigned long BlackPixel\^(\^Display *\fIdisplay\fP\^, int \^\fIscreen_number\fP\^);
+.HP
+unsigned long WhitePixel\^(\^Display *\fIdisplay\fP\^, int \^\fIscreen_number\fP\^); 
+.HP
+int ConnectionNumber\^(\^Display *\fIdisplay\fP\^); 
+.HP
+Colormap DefaultColormap\^(\^Display *\fIdisplay\fP\^,
+\^int \fIscreen_number\fP\^); 
+.HP
+int DefaultDepth\^(\^Display *\fIdisplay\fP\^, \^int \fIscreen_number\fP\^); 
+.HP
+int *XListDepths\^(\^Display *\fIdisplay\fP, int \fIscreen_number\fP, int
+\fIcount_return\fP\^); 
+.HP
+GC DefaultGC\^(\^Display *\fIdisplay\fP\^, \^int \fIscreen_number\fP\^); 
+.HP
+Window DefaultRootWindow\^(\^Display *\fIdisplay\fP\^); 
+.HP
+Screen *DefaultScreenOfDisplay\^(\^Display *\fIdisplay\fP\^); 
+.HP
+int DefaultScreen\^(\^Display *\fIdisplay\fP\^); 
+.HP
+Visual *DefaultVisual\^(\^Display *\fIdisplay\fP\^, \^int
+\fIscreen_number\fP\^); 
+.HP
+int DisplayCells\^(\^Display *\fIdisplay\fP\^, \^int \fIscreen_number\fP\^); 
+.HP
+int DisplayPlanes\^(\^Display *\fIdisplay\fP\^, \^int \fIscreen_number\fP\^);
+.HP
+char *DisplayString\^(\^Display *\fIdisplay\fP\^);
+.HP
+long XMaxRequestSize(\^Display *\fIdisplay\fP\^)
+.HP
+long XExtendedMaxRequestSize(\^Display *\fIdisplay\fP\^)
+.HP
+unsigned long LastKnownRequestProcessed\^(\^Display *\fIdisplay\fP\^); 
+.HP
+unsigned long NextRequest\^(\^Display *\fIdisplay\fP\^); 
+.HP
+int ProtocolVersion\^(\^Display *\fIdisplay\fP\^); 
+.HP
+int ProtocolRevision\^(\^Display *\fIdisplay\fP\^); 
+.HP
+int QLength\^(\^Display *\fIdisplay\fP\^); 
+.HP
+Window RootWindow\^(\^Display *\fIdisplay\fP\^, \^int \fIscreen_number\fP\^); 
+.HP
+int ScreenCount\^(\^Display *\fIdisplay\fP\^); 
+.HP
+Screen *ScreenOfDisplay\^(\^Display *\fIdisplay\fP, int
+\fIscreen_number\fP\^); 
+.HP
+char *ServerVendor\^(\^Display *\fIdisplay\fP\^)
+.HP
+int VendorRelease\^(\^Display *\fIdisplay\fP\^)
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIscreen_number\fP 1i
+Specifies the appropriate screen number on the host server.
+.ds Cn depths
+.IP \fIcount_return\fP 1i
+Returns the number of \*(Cn.
+.SH DESCRIPTION
+The
+.ZN AllPlanes
+macro returns a value with all bits set to 1 suitable for use in a plane 
+argument to a procedure.
+.LP
+The
+.ZN BlackPixel
+macro returns the black pixel value for the specified screen.
+.LP
+The
+.ZN WhitePixel
+macro returns the white pixel value for the specified screen.
+.LP
+The
+.ZN ConnectionNumber
+macro returns a connection number for the specified display.
+.LP
+The
+.ZN DefaultColormap
+macro returns the default colormap ID for allocation on the specified screen.
+.LP
+The
+.ZN DefaultDepth
+macro returns the depth (number of planes) of the default root window for the
+specified screen.
+.LP
+The
+.ZN XListDepths
+function returns the array of depths 
+that are available on the specified screen.
+If the specified screen_number is valid and sufficient memory for the array
+can be allocated,
+.ZN XListDepths
+sets count_return to the number of available depths.
+Otherwise, it does not set count_return and returns NULL.
+To release the memory allocated for the array of depths, use
+.ZN XFree .
+.LP
+The
+.ZN DefaultGC
+macro returns the default GC for the root window of the
+specified screen.
+.LP
+The
+.ZN DefaultRootWindow
+macro returns the root window for the default screen.
+.LP
+The
+.ZN DefaultScreenOfDisplay
+macro returns the default screen of the specified display.
+.LP
+The
+.ZN DefaultScreen
+macro returns the default screen number referenced in the
+.ZN XOpenDisplay
+routine.
+.LP
+The
+.ZN DefaultVisual
+macro returns the default visual type for the specified screen.
+.LP
+The
+.ZN DisplayCells
+macro returns the number of entries in the default colormap.
+.LP
+The
+.ZN DisplayPlanes
+macro returns the depth of the root window of the specified screen.
+.LP
+The
+.ZN DisplayString
+macro returns the string that was passed to
+.ZN XOpenDisplay
+when the current display was opened.
+.LP
+The
+.ZN XMaxRequestSize
+function returns the maximum request size (in 4-byte units) supported
+by the server without using an extended-length protocol encoding.
+Single protocol requests to the server can be no larger than this size
+unless an extended-length protocol encoding is supported by the server.
+The protocol guarantees the size to be no smaller than 4096 units
+(16384 bytes).
+Xlib automatically breaks data up into multiple protocol requests
+as necessary for the following functions:
+.ZN XDrawPoints ,
+.ZN XDrawRectangles ,
+.ZN XDrawSegments ,
+.ZN XFillArcs ,
+.ZN XFillRectangles ,
+and 
+.ZN XPutImage .
+.LP
+The
+.ZN XExtendedMaxRequestSize
+function returns zero if the specified display does not support an
+extended-length protocol encoding; otherwise,
+it returns the maximum request size (in 4-byte units) supported
+by the server using the extended-length encoding.
+The Xlib functions
+.ZN XDrawLines ,
+.ZN XDrawArcs ,
+.ZN XFillPolygon ,
+.ZN XChangeProperty ,
+.ZN XSetClipRectangles ,
+and
+.ZN XSetRegion
+will use the extended-length encoding as necessary, if supported
+by the server.  Use of the extended-length encoding in other Xlib
+functions (for example,
+.ZN XDrawPoints ,
+.ZN XDrawRectangles ,
+.ZN XDrawSegments ,
+.ZN XFillArcs ,
+.ZN XFillRectangles ,
+.ZN XPutImage )
+is permitted but not required; an Xlib implementation may choose to
+split the data across multiple smaller requests instead.
+.LP
+The
+.ZN LastKnownRequestProcessed
+macro extracts the full serial number of the last request known by Xlib
+to have been processed by the X server.
+.LP
+The
+.ZN NextRequest
+macro extracts the full serial number that is to be used for the next request.
+.LP
+The
+.ZN ProtocolVersion
+macro returns the major version number (11) of the X protocol associated with
+the connected display.
+.LP
+The
+.ZN ProtocolRevision
+macro returns the minor protocol revision number of the X server.
+.LP
+The
+.ZN QLength
+macro returns the length of the event queue for the connected display.
+.LP
+The
+.ZN RootWindow
+macro returns the root window.
+.LP
+The
+.ZN ScreenCount
+macro returns the number of available screens.
+.LP
+The
+.ZN ScreenOfDisplay
+macro returns a pointer to the screen of the specified display.
+.LP
+The
+.ZN ServerVendor
+macro returns a pointer to a null-terminated string that provides
+some identification of the owner of the X server implementation.
+.LP
+The
+.ZN VendorRelease
+macro returns a number related to a vendor's release of the X server.
+.SH "SEE ALSO"
+BlackPixelOfScreen(__libmansuffix__),
+ImageByteOrder(__libmansuffix__),
+IsCursorKey(__libmansuffix__),
+XOpenDisplay(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/BitmapBitOrder.man b/man/BitmapBitOrder.man
new file mode 100644 (file)
index 0000000..4e27094
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/ImageByteOrder.__libmansuffix__
diff --git a/man/BitmapPad.man b/man/BitmapPad.man
new file mode 100644 (file)
index 0000000..4e27094
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/ImageByteOrder.__libmansuffix__
diff --git a/man/BitmapUnit.man b/man/BitmapUnit.man
new file mode 100644 (file)
index 0000000..4e27094
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/ImageByteOrder.__libmansuffix__
diff --git a/man/BlackPixel.man b/man/BlackPixel.man
new file mode 100644 (file)
index 0000000..7949dfa
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/AllPlanes.__libmansuffix__
diff --git a/man/BlackPixelOfScreen.man b/man/BlackPixelOfScreen.man
new file mode 100644 (file)
index 0000000..af6042d
--- /dev/null
@@ -0,0 +1,287 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 BlackPixelOfScreen __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+BlackPixelOfScreen, WhitePixelOfScreen, CellsOfScreen, DefaultColormapOfScreen, DefaultDepthOfScreen, DefaultGCOfScreen, DefaultVisualOfScreen, DoesBackingStore, DoesSaveUnders, DisplayOfScreen, XScreenNumberOfScreen, EventMaskOfScreen, HeightOfScreen, HeightMMOfScreen, MaxCmapsOfScreen, MinCmapsOfScreen, PlanesOfScreen, RootWindowOfScreen, WidthOfScreen, WidthMMOfScreen \- screen information functions and macros
+.SH SYNTAX
+.HP
+unsigned long BlackPixelOfScreen\^(\^Screen *\fIscreen\fP\^);
+.HP
+unsigned long WhitePixelOfScreen\^(\^Screen *\fIscreen\fP\^);
+.HP
+int CellsOfScreen\^(\^Screen *\fIscreen\fP\^);
+.HP
+Colormap DefaultColormapOfScreen\^(\^Screen *\fIscreen\fP\^);
+.HP
+int DefaultDepthOfScreen\^(\^Screen *\fIscreen\fP\^);
+.HP
+GC DefaultGCOfScreen\^(\^Screen *\fIscreen\fP\^);
+.HP
+Visual *DefaultVisualOfScreen\^(\^Screen *\fIscreen\fP\^);
+.HP
+int DoesBackingStore\^(\^Screen *\fIscreen\fP\^);
+.HP
+Bool DoesSaveUnders\^(\^Screen *\fIscreen\fP\^);
+.HP
+Display *DisplayOfScreen\^(\^Screen *\fIscreen\fP\^);
+.HP
+int XScreenNumberOfScreen\^(\^Screen *\fIscreen\fP\^);
+.HP
+long EventMaskOfScreen\^(\^Screen *\fIscreen\fP\^);
+.HP
+int HeightOfScreen\^(\^Screen *\fIscreen\fP\^);
+.HP
+int HeightMMOfScreen\^(\^Screen *\fIscreen\fP\^);
+.HP
+int MaxCmapsOfScreen\^(\^Screen *\fIscreen\fP\^);
+.HP
+int MinCmapsOfScreen\^(\^Screen *\fIscreen\fP\^);
+.HP
+int PlanesOfScreen\^(\^Screen *\fIscreen\fP\^);
+.HP
+Window RootWindowOfScreen\^(\^Screen *\fIscreen\fP\^);
+.HP
+int WidthOfScreen\^(\^Screen *\fIscreen\fP\^);
+.HP
+int WidthMMOfScreen\^(\^Screen *\fIscreen\fP\^);
+.SH ARGUMENTS
+.IP \fIscreen\fP 1i
+Specifies the appropriate 
+.ZN Screen
+structure.
+.SH DESCRIPTION
+The
+.ZN BlackPixelOfScreen
+macro returns the black pixel value of the specified screen.
+.LP
+The
+.ZN WhitePixelOfScreen
+macro returns the white pixel value of the specified screen.
+.LP
+The
+.ZN CellsOfScreen
+macro returns the number of colormap cells in the default colormap
+of the specified screen.
+.LP
+The
+.ZN DefaultColormapOfScreen
+macro returns the default colormap of the specified screen.
+.LP
+The
+.ZN DefaultDepthOfScreen
+macro returns the default depth of the root window of the specified screen.
+.LP
+The
+.ZN DefaultGCOfScreen
+macro returns the default GC of the specified screen,
+which has the same depth as the root window of the screen.
+.LP
+The
+.ZN DefaultVisualOfScreen
+macro returns the default visual of the specified screen.
+.LP
+The
+.ZN DoesBackingStore
+macro returns 
+.ZN WhenMapped ,
+.ZN NotUseful ,
+or
+.ZN Always ,
+which indicate whether the screen supports backing stores.
+.LP
+The
+.ZN DoesSaveUnders
+macro returns a Boolean value indicating whether the
+screen supports save unders.
+.LP
+The
+.ZN DisplayOfScreen
+macro returns the display of the specified screen.
+.LP
+The
+.ZN XScreenNumberOfScreen
+function returns the screen index number of the specified screen.
+.LP
+The
+.ZN EventMaskOfScreen
+macro returns the root event mask of the root window for the specified screen
+at connection setup.
+.LP
+The
+.ZN HeightOfScreen
+macro returns the height of the specified screen.
+.LP
+The
+.ZN HeightMMOfScreen
+macro returns the height of the specified screen in millimeters.
+.LP
+The
+.ZN MaxCmapsOfScreen
+macro returns the maximum number of installed colormaps supported 
+by the specified screen.
+.LP
+The
+.ZN MinCmapsOfScreen
+macro returns the minimum number of installed colormaps supported 
+by the specified screen.
+.LP
+The
+.ZN PlanesOfScreen
+macro returns the number of planes in the root window of the specified screen.
+.LP
+The
+.ZN RootWindowOfScreen
+macro returns the root window of the specified screen.
+.LP
+The
+.ZN WidthOfScreen
+macro returns the width of the specified screen.
+.LP
+The
+.ZN WidthMMOfScreen
+macro returns the width of the specified screen in millimeters.
+.SH "SEE ALSO"
+AllPlanes(__libmansuffix__),
+ImageByteOrder(__libmansuffix__),
+IsCursorKey(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/CellsOfScreen.man b/man/CellsOfScreen.man
new file mode 100644 (file)
index 0000000..1bb28e7
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/BlackPixelOfScreen.__libmansuffix__
diff --git a/man/ClientWhitePointOfCCC.man b/man/ClientWhitePointOfCCC.man
new file mode 100644 (file)
index 0000000..fd4e759
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/DisplayOfCCC.__libmansuffix__
diff --git a/man/Compose.man b/man/Compose.man
new file mode 100644 (file)
index 0000000..13ba705
--- /dev/null
@@ -0,0 +1,158 @@
+.\" Copyright 2009 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.
+.\"
+.\" shorthand for double quote that works everywhere.
+.ds q \N'34'
+.ds xL Xlib \- C Language X Interface
+.TH Compose __filemansuffix__ __vendorversion__
+.SH NAME
+Compose \- X client mappings for multi-key input sequences
+.SH DESCRIPTION
+The X library, libX11, provides a simple input method for characters
+beyond those represented on typical keyboards using sequences of key
+strokes that are combined to enter a single character.
+.PP
+The compose file is searched for in  the following order:
+.IP -
+If the environment variable
+.B $XCOMPOSEFILE
+is set, its value is used as the name of the Compose file.
+.IP -
+If the user's home directory has a file named
+.IR .XCompose ,
+it is used as the Compose file.
+.IP -
+The system provided compose file is used by mapping the locale to a compose
+file from the list in
+.IR __xlocaledir__/compose.dir .
+.PP
+Compose files can use an
+.RB \*q include \*q
+instruction.  This allows local modifications to be made to existing compose
+files without including all of the content directly.  For example, the
+system's iso8859-1 compose file can be included with a line like this:
+.RS 4
+.BI "include \*q" %S/iso8859-1/Compose \*q
+.RE
+.PP
+There are several substitutions that can be made in the file name of the
+include instruction:
+.TP 4
+.I %H
+expands to the user's home directory (the
+.B $HOME
+environment variable)
+.TP 4
+.I %L
+expands to the name of the locale specific Compose file (i.e.,
+.RI \*q __xlocaledir__/<localename>/Compose \*q)
+.TP 4
+.I %S
+expands to the name of the system directory for Compose files (i.e.,
+.RI \*q __xlocaledir__ \*q)
+.PP
+For example, you can include in your compose file the default Compose file
+by using:
+.RS
+.B "include \*q%L\*q"
+.RE
+and then rewrite only the few rules that you need to change.  New
+compose rules can be added, and previous ones replaced.
+.SH FILE FORMAT
+.\" Based on grammar description in modules/im/ximcp/imLcPrs.c
+Compose files are plain text files, with a separate line for each compose
+sequence.   Comments begin with \fB#\fP characters.   Each compose sequence
+specifies one or more events and a resulting input sequence, with an optional
+comment at the end of the line:
+.RS
+\fIEVENT\fP [\fIEVENT\fP...] \fB:\fP \fIRESULT\fP [\fB#\fP \fICOMMENT\fP]
+.RE
+.PP
+Each event consists of a specified input keysym, and optional modifier states:
+.RS
+[\fIMODIFIER_LIST\fP] \fB<\fP\fIkeysym\fP\fB>\fP
+.RE
+.PP
+Each modifier consists of a specified modifier and a state:
+.RS
+(\fB!\fP \fIMODIFIER\fP ) | \fBNone\fP
+.RE
+Modifiers may be preceded by a
+.RB \*q "~" \*q
+character to indicate that the modifier must not be present.
+.PP
+The result specifies a string, keysym, or both, that the X client receives
+as input when the sequence of events is input:
+.RS
+\fB\*q\fP\fISTRING\fP\fB\*q\fP | \fIkeysym\fP | \fB\*q\fP\fISTRING\fP\fB\*q\fP \fIkeysym\fP
+.RE
+.PP
+Keysyms are specified without the \fBXK_\fP prefix.
+.PP
+Strings may be direct text encoded in the locale for which the compose file is
+to be used, or an escaped octal or hexadecimal character code.   Octal codes
+are specified as \fB\*q\\123\*q\fP and hexadecimal codes as
+\fB\*q\\0x123a\*q\fP.
+It is not necessary to specify in the right part of a rule a locale encoded
+string in addition to the keysym name.  If the string is omitted, Xlib
+figures it out from the keysym according to the current locale.
+I.e., if a rule looks like:
+.RS
+\fB<dead_grave> <A> : \*q\\300\*q Agrave\fP
+.RE
+the result of the composition is always the letter with the "\\300"
+code.  But if the rule is:
+.RS
+\fB<dead_grave> <A> : Agrave\fP
+.RE
+the result depends on how Agrave is mapped in the current locale.
+.SH ENVIRONMENT
+.TP
+.B XCOMPOSEFILE
+File to use for compose sequences.
+.TP
+.B XCOMPOSECACHE
+Directory to use for caching compiled compose files.
+.SH FILES
+.TP
+.I $HOME/.XCompose
+User default compose file if XCOMPOSEFILE is not set.
+.TP
+.I __xlocaledir__/compose.dir
+File listing the compose file path to use for each locale.
+.TP
+.I __xlocaledir__/<localemapping>/Compose
+System default compose file for the locale, mapped via compose.dir.
+.TP
+.I /var/cache/libx11/compose/
+System-wide cache directory for compiled compose files.
+.TP
+.I $HOME/.compose-cache/
+Per-user cache directory for compiled compose files.
+.SH SEE ALSO
+.BR XLookupString (__libmansuffix__),
+.BR XmbLookupString (__libmansuffix__),
+.BR XwcLookupString (__libmansuffix__),
+.BR Xutf8LookupString (__libmansuffix__),
+.BR mkcomposecache (__appmansuffix__),
+.BR locale (__miscmansuffix__).
+.br
+\fI\*(xL\fP
diff --git a/man/ConnectionNumber.man b/man/ConnectionNumber.man
new file mode 100644 (file)
index 0000000..7949dfa
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/AllPlanes.__libmansuffix__
diff --git a/man/DefaultColormap.man b/man/DefaultColormap.man
new file mode 100644 (file)
index 0000000..7949dfa
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/AllPlanes.__libmansuffix__
diff --git a/man/DefaultColormapOfScreen.man b/man/DefaultColormapOfScreen.man
new file mode 100644 (file)
index 0000000..1bb28e7
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/BlackPixelOfScreen.__libmansuffix__
diff --git a/man/DefaultDepth.man b/man/DefaultDepth.man
new file mode 100644 (file)
index 0000000..7949dfa
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/AllPlanes.__libmansuffix__
diff --git a/man/DefaultDepthOfScreen.man b/man/DefaultDepthOfScreen.man
new file mode 100644 (file)
index 0000000..1bb28e7
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/BlackPixelOfScreen.__libmansuffix__
diff --git a/man/DefaultGC.man b/man/DefaultGC.man
new file mode 100644 (file)
index 0000000..7949dfa
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/AllPlanes.__libmansuffix__
diff --git a/man/DefaultGCOfScreen.man b/man/DefaultGCOfScreen.man
new file mode 100644 (file)
index 0000000..1bb28e7
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/BlackPixelOfScreen.__libmansuffix__
diff --git a/man/DefaultRootWindow.man b/man/DefaultRootWindow.man
new file mode 100644 (file)
index 0000000..7949dfa
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/AllPlanes.__libmansuffix__
diff --git a/man/DefaultScreen.man b/man/DefaultScreen.man
new file mode 100644 (file)
index 0000000..7949dfa
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/AllPlanes.__libmansuffix__
diff --git a/man/DefaultScreenOfDisplay.man b/man/DefaultScreenOfDisplay.man
new file mode 100644 (file)
index 0000000..7949dfa
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/AllPlanes.__libmansuffix__
diff --git a/man/DefaultVisual.man b/man/DefaultVisual.man
new file mode 100644 (file)
index 0000000..7949dfa
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/AllPlanes.__libmansuffix__
diff --git a/man/DefaultVisualOfScreen.man b/man/DefaultVisualOfScreen.man
new file mode 100644 (file)
index 0000000..1bb28e7
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/BlackPixelOfScreen.__libmansuffix__
diff --git a/man/DisplayCells.man b/man/DisplayCells.man
new file mode 100644 (file)
index 0000000..7949dfa
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/AllPlanes.__libmansuffix__
diff --git a/man/DisplayHeight.man b/man/DisplayHeight.man
new file mode 100644 (file)
index 0000000..4e27094
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/ImageByteOrder.__libmansuffix__
diff --git a/man/DisplayHeightMM.man b/man/DisplayHeightMM.man
new file mode 100644 (file)
index 0000000..4e27094
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/ImageByteOrder.__libmansuffix__
diff --git a/man/DisplayOfCCC.man b/man/DisplayOfCCC.man
new file mode 100644 (file)
index 0000000..160eeb5
--- /dev/null
@@ -0,0 +1,188 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 DisplayOfCCC __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+DisplayOfCCC, VisualOfCCC, ScreenNumberOfCCC, ScreenWhitePointOfCCC, ClientWhitePointOfCCC \- Color Conversion Context macros
+.SH SYNTAX
+.HP
+Display *DisplayOfCCC\^(\^XcmsCCC \fIccc\fP\^); 
+.HP
+Visual *VisualOfCCC\^(\^XcmsCCC \fIccc\fP\^); 
+.HP
+int ScreenNumberOfCCC\^(\^XcmsCCC \fIccc\fP\^); 
+.HP
+XcmsColor *ScreenWhitePointOfCCC\^(\^XcmsCCC \fIccc\fP\^); 
+.HP
+XcmsColor *ClientWhitePointOfCCC\^(\^XcmsCCC \fIccc\fP\^); 
+.SH ARGUMENTS
+.IP \fIccc\fP 1i
+Specifies the CCC.
+.SH DESCRIPTION
+The
+.ZN DisplayOfCCC
+macro returns the display associated with the specified CCC.
+.LP
+The
+.ZN VisualOfCCC
+macro returns the visual associated with the specified CCC.
+.LP
+The
+.ZN ScreenNumberOfCCC
+macro returns the number of the screen associated with the specified CCC.
+.LP
+The
+.ZN ScreenWhitePointOfCCC
+macro returns the screen white point of the screen associated with
+the specified CCC.
+.LP
+The
+.ZN ClientWhitePointOfCCC
+macro returns the client white point of the screen associated with
+the specified CCC.
+.SH "SEE ALSO"
+XcmsCCCOfColormap(__libmansuffix__),
+XcmsConvertColors(__libmansuffix__),
+XcmsCreateCCC(__libmansuffix__),
+XcmsDefaultCCC(__libmansuffix__),
+XcmsSetWhitePoint(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/DisplayOfScreen.man b/man/DisplayOfScreen.man
new file mode 100644 (file)
index 0000000..1bb28e7
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/BlackPixelOfScreen.__libmansuffix__
diff --git a/man/DisplayPlanes.man b/man/DisplayPlanes.man
new file mode 100644 (file)
index 0000000..7949dfa
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/AllPlanes.__libmansuffix__
diff --git a/man/DisplayString.man b/man/DisplayString.man
new file mode 100644 (file)
index 0000000..7949dfa
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/AllPlanes.__libmansuffix__
diff --git a/man/DisplayWidth.man b/man/DisplayWidth.man
new file mode 100644 (file)
index 0000000..4e27094
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/ImageByteOrder.__libmansuffix__
diff --git a/man/DisplayWidthMM.man b/man/DisplayWidthMM.man
new file mode 100644 (file)
index 0000000..4e27094
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/ImageByteOrder.__libmansuffix__
diff --git a/man/DoesBackingStore.man b/man/DoesBackingStore.man
new file mode 100644 (file)
index 0000000..1bb28e7
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/BlackPixelOfScreen.__libmansuffix__
diff --git a/man/DoesSaveUnders.man b/man/DoesSaveUnders.man
new file mode 100644 (file)
index 0000000..1bb28e7
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/BlackPixelOfScreen.__libmansuffix__
diff --git a/man/EventMaskOfScreen.man b/man/EventMaskOfScreen.man
new file mode 100644 (file)
index 0000000..1bb28e7
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/BlackPixelOfScreen.__libmansuffix__
diff --git a/man/HeightMMOfScreen.man b/man/HeightMMOfScreen.man
new file mode 100644 (file)
index 0000000..1bb28e7
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/BlackPixelOfScreen.__libmansuffix__
diff --git a/man/HeightOfScreen.man b/man/HeightOfScreen.man
new file mode 100644 (file)
index 0000000..1bb28e7
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/BlackPixelOfScreen.__libmansuffix__
diff --git a/man/ImageByteOrder.man b/man/ImageByteOrder.man
new file mode 100644 (file)
index 0000000..27579c8
--- /dev/null
@@ -0,0 +1,245 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 ImageByteOrder __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+ImageByteOrder, BitmapBitOrder, BitmapPad, BitmapUnit, DisplayHeight, DisplayHeightMM, DisplayWidth, DisplayWidthMM, XListPixmapFormats, XPixmapFormatValues \- image format functions and macros
+.SH SYNTAX
+.HP
+XPixmapFormatValues *XListPixmapFormats\^(\^Display *\fIdisplay\fP, int *\fIcount_return\fP\^);
+.HP
+int ImageByteOrder\^(\^Display *\fIdisplay\fP\^);
+.HP
+int BitmapBitOrder\^(\^Display *\fIdisplay\fP\^);
+.HP
+int BitmapPad\^(\^Display *\fIdisplay\fP\^);
+.HP
+int BitmapUnit\^(\^Display *\fIdisplay\fP\^);
+.HP
+int DisplayHeight\^(\^Display *\fIdisplay\fP\^, \^int \fIscreen_number\fP\^);
+.HP
+int DisplayHeightMM\^(\^Display *\fIdisplay\fP\^, \^int \fIscreen_number\fP\^);
+.HP
+int DisplayWidth\^(\^Display *\fIdisplay\fP\^, \^int \fIscreen_number\fP\^);
+.HP
+int DisplayWidthMM\^(\^Display *\fIdisplay\fP\^, \^int \fIscreen_number\fP\^);
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.ds Cn pixmap formats that are supported by the display
+.IP \fIcount_return\fP 1i
+Returns the number of \*(Cn.
+.IP \fIscreen_number\fP 1i
+Specifies the appropriate screen number on the host server.
+.SH DESCRIPTION
+The
+.ZN XListPixmapFormats
+function returns an array of
+.ZN XPixmapFormatValues
+structures that describe the types of Z format images supported
+by the specified display.
+If insufficient memory is available,
+.ZN XListPixmapFormats
+returns NULL.
+To free the allocated storage for the
+.ZN XPixmapFormatValues
+structures, use
+.ZN XFree .
+.LP
+The
+.ZN ImageByteOrder
+macro specifies the required byte order for images for each scanline unit in
+XY format (bitmap) or for each pixel value in Z format.
+.LP
+The
+.ZN BitmapBitOrder
+macro returns 
+.ZN LSBFirst
+or
+.ZN MSBFirst
+to indicate whether the leftmost bit in the bitmap as displayed
+on the screen is the least or most significant bit in the unit.
+.LP
+The
+.ZN BitmapPad
+macro returns the number of bits that each scanline must be padded.
+.LP
+The
+.ZN BitmapUnit
+macro returns the size of a bitmap's scanline unit in bits.
+.LP
+The
+.ZN DisplayHeight
+macro returns the height of the specified screen in pixels.
+.LP
+The
+.ZN DisplayHeightMM
+macro returns the height of the specified screen in millimeters.
+.LP
+The
+.ZN DisplayWidth
+macro returns the width of the screen in pixels.
+.LP
+The
+.ZN DisplayWidthMM
+macro returns the width of the specified screen in millimeters.
+.SH STRUCTURES
+The
+.ZN XPixmapFormatValues
+structure provides an interface to the pixmap format information
+that is returned at the time of a connection setup.
+It contains:
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int depth;
+       int bits_per_pixel;
+       int scanline_pad;
+} XPixmapFormatValues;
+.De
+.SH "SEE ALSO"
+AllPlanes(__libmansuffix__),
+BlackPixelOfScreen(__libmansuffix__),
+IsCursorKey(__libmansuffix__),
+XFree(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/IsCursorKey.man b/man/IsCursorKey.man
new file mode 100644 (file)
index 0000000..0fa3dfb
--- /dev/null
@@ -0,0 +1,211 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 IsCursorKey __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+IsCursorKey, IsFunctionKey, IsKeypadKey, IsMiscFunctionKey, IsModifierKey, IsPFKey, IsPrivateKeypadKey \- keysym classification macros
+.SH SYNTAX
+int IsCursorKey\^(\^KeySym \fIkeysym\fP\^);
+.LP
+int IsFunctionKey\^(\^KeySym \fIkeysym\fP\^);
+.LP
+int IsKeypadKey\^(\^KeySym \fIkeysym\fP\^);
+.LP
+int IsMiscFunctionKey\^(\^KeySym \fIkeysym\fP\^);
+.LP
+int IsModifierKey\^(\^KeySym \fIkeysym\fP\^);
+.LP
+int IsPFKey\^(\^KeySym \fIkeysym\fP\^);
+.LP
+int IsPrivateKeypadKey\^(\^KeySym \fIkeysym\fP\^);
+.SH ARGUMENTS
+.ds Fn tested
+.IP \fIkeysym\fP 1i
+Specifies the KeySym that is to be \*(Fn.
+.SH DESCRIPTION
+The
+.ZN IsCursorKey
+macro returns 
+.ZN True
+if the specified KeySym is a cursor key.
+.LP
+The
+.ZN IsFunctionKey
+macro returns 
+.ZN True
+if the KeySym is a function key.
+.LP
+The
+.ZN IsKeypadKey
+macro returns
+.ZN True
+if the specified KeySym is a keypad key.
+.LP
+The
+.ZN IsMiscFunctionKey
+macro returns
+.ZN True
+if the specified KeySym is a miscellaneous function key.
+.LP
+The
+.ZN IsModifierKey
+macro returns
+.ZN True
+if the specified KeySym is a modifier key.
+.LP
+The
+.ZN IsPFKey
+macro returns
+.ZN True
+if the specified KeySym is a PF key.
+.LP
+The
+.ZN IsPrivateKeypadKey
+macro returns
+.ZN True
+if the specified KeySym is a vendor-private keypad key.
+.SH "SEE ALSO"
+XkbKeyTypesForCoreSymbols(__libmansuffix__),
+AllPlanes(__libmansuffix__),
+BlackPixelOfScreen(__libmansuffix__),
+ImageByteOrder(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/IsFunctionKey.man b/man/IsFunctionKey.man
new file mode 100644 (file)
index 0000000..3153032
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/IsCursorKey.__libmansuffix__
diff --git a/man/IsKeypadKey.man b/man/IsKeypadKey.man
new file mode 100644 (file)
index 0000000..3153032
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/IsCursorKey.__libmansuffix__
diff --git a/man/IsMiscFunctionKey.man b/man/IsMiscFunctionKey.man
new file mode 100644 (file)
index 0000000..3153032
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/IsCursorKey.__libmansuffix__
diff --git a/man/IsModifierKey.man b/man/IsModifierKey.man
new file mode 100644 (file)
index 0000000..3153032
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/IsCursorKey.__libmansuffix__
diff --git a/man/IsPFKey.man b/man/IsPFKey.man
new file mode 100644 (file)
index 0000000..3153032
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/IsCursorKey.__libmansuffix__
diff --git a/man/IsPrivateKeypadKey.man b/man/IsPrivateKeypadKey.man
new file mode 100644 (file)
index 0000000..3153032
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/IsCursorKey.__libmansuffix__
diff --git a/man/LastKnownRequestProcessed.man b/man/LastKnownRequestProcessed.man
new file mode 100644 (file)
index 0000000..7949dfa
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/AllPlanes.__libmansuffix__
diff --git a/man/Makefile.am b/man/Makefile.am
new file mode 100644 (file)
index 0000000..ef1a745
--- /dev/null
@@ -0,0 +1,1081 @@
+SUBDIRS = xkb
+
+libmandir = $(LIB_MAN_DIR)
+
+libman_PRE = \
+       $(all_shadows:=.man) \
+       $(file_shadows:=.man) \
+       AllPlanes.man \
+       BlackPixelOfScreen.man \
+       DisplayOfCCC.man \
+       ImageByteOrder.man \
+       IsCursorKey.man \
+       XAddConnectionWatch.man \
+       XAddHost.man \
+       XAllocClassHint.man \
+       XAllocColor.man \
+       XAllocIconSize.man \
+       XAllocSizeHints.man \
+       XAllocStandardColormap.man \
+       XAllocWMHints.man \
+       XAllowEvents.man \
+       XAnyEvent.man \
+       XButtonEvent.man \
+       XChangeKeyboardControl.man \
+       XChangeKeyboardMapping.man \
+       XChangePointerControl.man \
+       XChangeSaveSet.man \
+       XChangeWindowAttributes.man \
+       XCirculateEvent.man \
+       XCirculateRequestEvent.man \
+       XClearArea.man \
+       XClientMessageEvent.man \
+       XcmsAllocColor.man \
+       XcmsCCCOfColormap.man \
+       XcmsCIELabQueryMaxC.man \
+       XcmsCIELuvQueryMaxC.man \
+       XcmsColor.man \
+       XcmsConvertColors.man \
+       XcmsCreateCCC.man \
+       XcmsDefaultCCC.man \
+       XcmsQueryBlack.man \
+       XcmsQueryColor.man \
+       XcmsSetWhitePoint.man \
+       XcmsStoreColor.man \
+       XcmsTekHVCQueryMaxC.man \
+       XColormapEvent.man \
+       XConfigureEvent.man \
+       XConfigureRequestEvent.man \
+       XConfigureWindow.man \
+       XCopyArea.man \
+       XCreateColormap.man \
+       XCreateFontCursor.man \
+       XCreateFontSet.man \
+       XCreateGC.man \
+       XCreateIC.man \
+       XCreateOC.man \
+       XCreatePixmap.man \
+       XCreateRegion.man \
+       XCreateWindowEvent.man \
+       XCreateWindow.man \
+       XCrossingEvent.man \
+       XDefineCursor.man \
+       XDestroyWindowEvent.man \
+       XDestroyWindow.man \
+       XDrawArc.man \
+       XDrawImageString.man \
+       XDrawLine.man \
+       XDrawPoint.man \
+       XDrawRectangle.man \
+       XDrawString.man \
+       XDrawText.man \
+       XEmptyRegion.man \
+       XErrorEvent.man \
+       XExposeEvent.man \
+       XExtentsOfFontSet.man \
+       XFillRectangle.man \
+       XFilterEvent.man \
+       XFlush.man \
+       XFocusChangeEvent.man \
+       XFontSetExtents.man \
+       XFontsOfFontSet.man \
+       XFree.man \
+       XGetEventData.man \
+       XGetVisualInfo.man \
+       XGetWindowAttributes.man \
+       XGetWindowProperty.man \
+       XGetXCBConnection.man \
+       XGrabButton.man \
+       XGrabKeyboard.man \
+       XGrabKey.man \
+       XGrabPointer.man \
+       XGrabServer.man \
+       XGraphicsExposeEvent.man \
+       XGravityEvent.man \
+       XIconifyWindow.man \
+       XIfEvent.man \
+       XInitImage.man \
+       XInitThreads.man \
+       XInstallColormap.man \
+       XInternAtom.man \
+       XIntersectRegion.man \
+       XKeymapEvent.man \
+       XListFonts.man \
+       XLoadFont.man \
+       XLookupKeysym.man \
+       XMapEvent.man \
+       XMapRequestEvent.man \
+       XMapWindow.man \
+       XmbDrawImageString.man \
+       XmbDrawString.man \
+       XmbDrawText.man \
+       XmbLookupString.man \
+       XmbResetIC.man \
+       XmbTextEscapement.man \
+       XmbTextExtents.man \
+       XmbTextListToTextProperty.man \
+       XmbTextPerCharExtents.man \
+       XNextEvent.man \
+       XNoOp.man \
+       XOpenDisplay.man \
+       XOpenIM.man \
+       XOpenOM.man \
+       XParseGeometry.man \
+       XPolygonRegion.man \
+       XPropertyEvent.man \
+       XPutBackEvent.man \
+       XPutImage.man \
+       XQueryBestSize.man \
+       XQueryColor.man \
+       XQueryExtension.man \
+       XQueryPointer.man \
+       XQueryTree.man \
+       XRaiseWindow.man \
+       XReadBitmapFile.man \
+       XRecolorCursor.man \
+       XReparentEvent.man \
+       XReparentWindow.man \
+       XResizeRequestEvent.man \
+       XResourceManagerString.man \
+       XrmEnumerateDatabase.man \
+       XrmGetFileDatabase.man \
+       XrmGetResource.man \
+       XrmInitialize.man \
+       XrmMergeDatabases.man \
+       XrmPutResource.man \
+       XrmUniqueQuark.man \
+       XSaveContext.man \
+       XSelectInput.man \
+       XSelectionClearEvent.man \
+       XSelectionEvent.man \
+       XSelectionRequestEvent.man \
+       XSendEvent.man \
+       XSetArcMode.man \
+       XSetClipOrigin.man \
+       XSetCloseDownMode.man \
+       XSetCommand.man \
+       XSetErrorHandler.man \
+       XSetEventQueueOwner.man \
+       XSetFillStyle.man \
+       XSetFont.man \
+       XSetFontPath.man \
+       XSetICFocus.man \
+       XSetICValues.man \
+       XSetInputFocus.man \
+       XSetLineAttributes.man \
+       XSetPointerMapping.man \
+       XSetScreenSaver.man \
+       XSetSelectionOwner.man \
+       XSetState.man \
+       XSetTextProperty.man \
+       XSetTile.man \
+       XSetTransientForHint.man \
+       XSetWMClientMachine.man \
+       XSetWMColormapWindows.man \
+       XSetWMIconName.man \
+       XSetWMName.man \
+       XSetWMProperties.man \
+       XSetWMProtocols.man \
+       XStoreBytes.man \
+       XStoreColors.man \
+       XStringListToTextProperty.man \
+       XStringToKeysym.man \
+       XSupportsLocale.man \
+       XSynchronize.man \
+       XTextExtents.man \
+       XTextWidth.man \
+       XTranslateCoordinates.man \
+       XUnmapEvent.man \
+       XUnmapWindow.man \
+       XVaCreateNestedList.man \
+       XVisibilityEvent.man \
+       XWarpPointer.man
+
+filemandir = $(FILE_MAN_DIR)
+fileman_PRE = Compose.man
+
+libman_DATA = $(libman_PRE:man=@LIB_MAN_SUFFIX@) \
+             $(all_shadows:=.@LIB_MAN_SUFFIX@)
+
+fileman_DATA = $(fileman_PRE:man=@FILE_MAN_SUFFIX@) \
+              $(file_shadows:=.@FILE_MAN_SUFFIX@)
+
+EXTRA_DIST = $(libman_PRE) $(fileman_PRE)
+
+CLEANFILES = $(libman_DATA) $(fileman_DATA)
+
+SUFFIXES = .$(LIB_MAN_SUFFIX) .$(FILE_MAN_SUFFIX) .man
+
+MAN_SUBSTS += -e 's|__xlocaledir__|$(X11_LOCALEDATADIR)|g'
+
+# String replacements in MAN_SUBSTS now come from xorg-macros.m4 via configure
+.man.$(LIB_MAN_SUFFIX) .man.$(FILE_MAN_SUFFIX):
+       $(AM_V_GEN)$(SED) $(MAN_SUBSTS) < $< > $@
+
+# Generate man page shadow files (Replaces InstallManPageAliases from Imake)
+all_shadows =                                \
+    $(AllPlanes_shadows)                     \
+    $(BlackPixelOfScreen_shadows)            \
+    $(DisplayOfCCC_shadows)                  \
+    $(ImageByteOrder_shadows)                \
+    $(IsCursorKey_shadows)                   \
+    $(XAllocClassHint_shadows)               \
+    $(XAllocIconSize_shadows)                \
+    $(XAllocStandardColormap_shadows)        \
+    $(XAllocSizeHints_shadows)               \
+    $(XAllocWMHints_shadows)                 \
+    $(XAddHost_shadows)                      \
+    $(XAllocColor_shadows)                   \
+    $(XAnyEvent_shadows)                     \
+    $(XButtonEvent_shadows)                  \
+    $(XChangeKeyboardControl_shadows)        \
+    $(XChangeKeyboardMapping_shadows)        \
+    $(XChangePointerControl_shadows)         \
+    $(XChangeSaveSet_shadows)                \
+    $(XChangeWindowAttributes_shadows)       \
+    $(XClearArea_shadows)                    \
+    $(XConfigureWindow_shadows)              \
+    $(XCopyArea_shadows)                     \
+    $(XCreateColormap_shadows)               \
+    $(XCreateFontCursor_shadows)             \
+    $(XCreateFontSet_shadows)                \
+    $(XCreateGC_shadows)                     \
+    $(XCreateIC_shadows)                     \
+    $(XInitImage_shadows)                    \
+    $(XCreateOC_shadows)                     \
+    $(XCreatePixmap_shadows)                 \
+    $(XCreateRegion_shadows)                 \
+    $(XCreateWindow_shadows)                 \
+    $(XDefineCursor_shadows)                 \
+    $(XDestroyWindow_shadows)                \
+    $(XDrawArc_shadows)                      \
+    $(XDrawImageString_shadows)              \
+    $(XDrawLine_shadows)                     \
+    $(XDrawPoint_shadows)                    \
+    $(XDrawRectangle_shadows)                \
+    $(XDrawString_shadows)                   \
+    $(XDrawText_shadows)                     \
+    $(XEmptyRegion_shadows)                  \
+    $(XFillRectangle_shadows)                \
+    $(XFlush_shadows)                        \
+    $(XFontsOfFontSet_shadows)               \
+    $(XGraphicsExposeEvent_shadows)          \
+    $(XrmGetFileDatabase_shadows)            \
+    $(XrmGetResource_shadows)                \
+    $(XGetEventData_shadows)                 \
+    $(XGetVisualInfo_shadows)                \
+    $(XGetWindowAttributes_shadows)          \
+    $(XGetWindowProperty_shadows)            \
+    $(XGrabButton_shadows)                   \
+    $(XGrabKey_shadows)                      \
+    $(XGrabKeyboard_shadows)                 \
+    $(XGrabPointer_shadows)                  \
+    $(XGrabServer_shadows)                   \
+    $(XIconifyWindow_shadows)                \
+    $(XIfEvent_shadows)                      \
+    $(XrmInitialize_shadows)                 \
+    $(XInstallColormap_shadows)              \
+    $(XAddConnectionWatch_shadows)           \
+    $(XIntersectRegion_shadows)              \
+    $(XInternAtom_shadows)                   \
+    $(XListFonts_shadows)                    \
+    $(XLoadFont_shadows)                     \
+    $(XLookupKeysym_shadows)                 \
+    $(XrmMergeDatabases_shadows)             \
+    $(XMapEvent_shadows)                     \
+    $(XMapWindow_shadows)                    \
+    $(XNextEvent_shadows)                    \
+    $(XOpenDisplay_shadows)                  \
+    $(XOpenIM_shadows)                       \
+    $(XOpenOM_shadows)                       \
+    $(XParseGeometry_shadows)                \
+    $(XPolygonRegion_shadows)                \
+    $(XPutImage_shadows)                     \
+    $(XrmPutResource_shadows)                \
+    $(XQueryBestSize_shadows)                \
+    $(XQueryColor_shadows)                   \
+    $(XQueryExtension_shadows)               \
+    $(XResourceManagerString_shadows)        \
+    $(XRaiseWindow_shadows)                  \
+    $(XReadBitmapFile_shadows)               \
+    $(XRecolorCursor_shadows)                \
+    $(XSaveContext_shadows)                  \
+    $(XSetICFocus_shadows)                   \
+    $(XSetICValues_shadows)                  \
+    $(XStringListToTextProperty_shadows)     \
+    $(XSetArcMode_shadows)                   \
+    $(XSetClipOrigin_shadows)                \
+    $(XSetCloseDownMode_shadows)             \
+    $(XSetCommand_shadows)                   \
+    $(XSetErrorHandler_shadows)              \
+    $(XSendEvent_shadows)                    \
+    $(XSetFillStyle_shadows)                 \
+    $(XSetFontPath_shadows)                  \
+    $(XSetInputFocus_shadows)                \
+    $(XSetLineAttributes_shadows)            \
+    $(XSetPointerMapping_shadows)            \
+    $(XSetScreenSaver_shadows)               \
+    $(XSetSelectionOwner_shadows)            \
+    $(XSetState_shadows)                     \
+    $(XSetTransientForHint_shadows)          \
+    $(XSetTextProperty_shadows)              \
+    $(XSetTile_shadows)                      \
+    $(XSetWMClientMachine_shadows)           \
+    $(XSetWMColormapWindows_shadows)         \
+    $(XSetWMIconName_shadows)                \
+    $(XSetWMName_shadows)                    \
+    $(XSetWMProperties_shadows)              \
+    $(XSetWMProtocols_shadows)               \
+    $(XStoreBytes_shadows)                   \
+    $(XStoreColors_shadows)                  \
+    $(XStringToKeysym_shadows)               \
+    $(XSupportsLocale_shadows)               \
+    $(XSynchronize_shadows)                  \
+    $(XmbTextListToTextProperty_shadows)     \
+    $(XTextExtents_shadows)                  \
+    $(XTextWidth_shadows)                    \
+    $(XInitThreads_shadows)                  \
+    $(XrmUniqueQuark_shadows)                \
+    $(XUnmapWindow_shadows)                  \
+    $(XcmsCCCOfColormap_shadows)             \
+    $(XcmsAllocColor_shadows)                \
+    $(XcmsColor_shadows)                     \
+    $(XcmsCreateCCC_shadows)                 \
+    $(XcmsCIELabQueryMaxC_shadows)           \
+    $(XcmsCIELuvQueryMaxC_shadows)           \
+    $(XcmsQueryBlack_shadows)                \
+    $(XcmsQueryColor_shadows)                \
+    $(XcmsStoreColor_shadows)                \
+    $(XcmsSetWhitePoint_shadows)             \
+    $(XcmsTekHVCQueryMaxC_shadows)           \
+    $(XmbDrawImageString_shadows)            \
+    $(XmbDrawString_shadows)                 \
+    $(XmbDrawText_shadows)                   \
+    $(XmbLookupString_shadows)               \
+    $(XmbResetIC_shadows)                    \
+    $(XmbTextEscapement_shadows)             \
+    $(XmbTextExtents_shadows)                \
+    $(XmbTextPerCharExtents_shadows)
+
+
+AllPlanes_shadows =                         \
+    BlackPixel                              \
+    WhitePixel                              \
+    ConnectionNumber                        \
+    DefaultColormap                         \
+    DefaultDepth                            \
+    XListDepths                             \
+    DefaultGC                               \
+    DefaultRootWindow                       \
+    DefaultScreenOfDisplay                  \
+    DefaultScreen                           \
+    DefaultVisual                           \
+    DisplayCells                            \
+    DisplayPlanes                           \
+    DisplayString                           \
+    XMaxRequestSize                         \
+    XExtendedMaxRequestSize                 \
+    LastKnownRequestProcessed               \
+    NextRequest                             \
+    ProtocolVersion                         \
+    ProtocolRevision                        \
+    QLength                                 \
+    RootWindow                              \
+    ScreenCount                             \
+    ScreenOfDisplay                         \
+    ServerVendor                            \
+    VendorRelease
+
+BlackPixelOfScreen_shadows =                \
+    WhitePixelOfScreen                      \
+    CellsOfScreen                           \
+    DefaultColormapOfScreen                 \
+    DefaultDepthOfScreen                    \
+    DefaultGCOfScreen                       \
+    DefaultVisualOfScreen                   \
+    DoesBackingStore                        \
+    DoesSaveUnders                          \
+    DisplayOfScreen                         \
+    XScreenNumberOfScreen                   \
+    EventMaskOfScreen                       \
+    HeightOfScreen                          \
+    HeightMMOfScreen                        \
+    MaxCmapsOfScreen                        \
+    MinCmapsOfScreen                        \
+    PlanesOfScreen                          \
+    RootWindowOfScreen                      \
+    WidthOfScreen                           \
+    WidthMMOfScreen
+
+DisplayOfCCC_shadows =                      \
+    VisualOfCCC                             \
+    ScreenNumberOfCCC                       \
+    ScreenWhitePointOfCCC                   \
+    ClientWhitePointOfCCC
+
+ImageByteOrder_shadows =                    \
+    BitmapBitOrder                          \
+    BitmapPad                               \
+    BitmapUnit                              \
+    DisplayHeight                           \
+    DisplayHeightMM                         \
+    DisplayWidth                            \
+    DisplayWidthMM                          \
+    XListPixmapFormats                      \
+    XPixmapFormatValues
+
+IsCursorKey_shadows =                       \
+    IsFunctionKey                           \
+    IsKeypadKey                             \
+    IsMiscFunctionKey                       \
+    IsModifierKey                           \
+    IsPFKey                                 \
+    IsPrivateKeypadKey
+
+XAllocClassHint_shadows =                   \
+    XSetClassHint                           \
+    XGetClassHint                           \
+    XClassHint
+
+XAllocIconSize_shadows =                    \
+    XSetIconSizes                           \
+    XGetIconSizes                           \
+    XIconSize
+
+XAllocStandardColormap_shadows =            \
+    XSetRGBColormaps                        \
+    XGetRGBColormaps                        \
+    XStandardColormap
+
+XAllocSizeHints_shadows =                   \
+    XSetWMNormalHints                       \
+    XGetWMNormalHints                       \
+    XSetWMSizeHints                         \
+    XGetWMSizeHints                         \
+    XSizeHints
+
+XAllocWMHints_shadows =                     \
+    XSetWMHints                             \
+    XGetWMHints                             \
+    XWMHints
+
+XAddHost_shadows =                          \
+    XAddHosts                               \
+    XListHosts                              \
+    XRemoveHost                             \
+    XRemoveHosts                            \
+    XSetAccessControl                       \
+    XEnableAccessControl                    \
+    XDisableAccessControl                   \
+    XHostAddress
+
+XAllocColor_shadows =                       \
+    XAllocNamedColor                        \
+    XAllocColorCells                        \
+    XAllocColorPlanes                       \
+    XFreeColors
+
+XAnyEvent_shadows =                         \
+    XEvent
+
+XButtonEvent_shadows =                      \
+    XKeyEvent                               \
+    XMotionEvent
+
+XChangeKeyboardControl_shadows =            \
+    XGetKeyboardControl                     \
+    XAutoRepeatOn                           \
+    XAutoRepeatOff                          \
+    XBell                                   \
+    XQueryKeymap                            \
+    XKeyboardControl
+
+XChangeKeyboardMapping_shadows =            \
+    XGetKeyboardMapping                     \
+    XDisplayKeycodes                        \
+    XSetModifierMapping                     \
+    XGetModifierMapping                     \
+    XNewModifiermap                         \
+    XInsertModifiermapEntry                 \
+    XDeleteModifiermapEntry                 \
+    XFreeModifiermap                        \
+    XModifierKeymap
+
+XChangePointerControl_shadows =             \
+    XGetPointerControl
+
+XChangeSaveSet_shadows =                    \
+    XAddToSaveSet                           \
+    XRemoveFromSaveSet
+
+XChangeWindowAttributes_shadows =           \
+    XSetWindowBackground                    \
+    XSetWindowBackgroundPixmap              \
+    XSetWindowBorder                        \
+    XSetWindowBorderPixmap                  \
+    XSetWindowColormap
+
+XClearArea_shadows =                        \
+    XClearWindow
+
+XConfigureWindow_shadows =                  \
+    XMoveWindow                             \
+    XResizeWindow                           \
+    XMoveResizeWindow                       \
+    XSetWindowBorderWidth                   \
+    XWindowChanges
+
+XCopyArea_shadows =                         \
+    XCopyPlane
+
+XCreateColormap_shadows =                   \
+    XCopyColormapAndFree                    \
+    XFreeColormap                           \
+    XColor
+
+XCreateFontCursor_shadows =                 \
+    XCreatePixmapCursor                     \
+    XCreateGlyphCursor
+
+XCreateFontSet_shadows =                    \
+    XFreeFontSet
+
+XCreateGC_shadows =                         \
+    XCopyGC                                 \
+    XChangeGC                               \
+    XGetGCValues                            \
+    XFreeGC                                 \
+    XGContextFromGC                         \
+    XGCValues
+
+XCreateIC_shadows =                         \
+    XDestroyIC                              \
+    XIMOfIC
+
+XInitImage_shadows =                        \
+    XCreateImage                            \
+    XGetPixel                               \
+    XPutPixel                               \
+    XSubImage                               \
+    XAddPixel                               \
+    XDestroyImage
+
+XCreateOC_shadows =                         \
+    XDestroyOC                              \
+    XSetOCValues                            \
+    XGetOCValues                            \
+    XOMOfOC
+
+XCreatePixmap_shadows =                     \
+    XFreePixmap
+
+XCreateRegion_shadows =                     \
+    XSetRegion                              \
+    XDestroyRegion
+
+XCreateWindow_shadows =                     \
+    XCreateSimpleWindow                     \
+    XSetWindowAttributes
+
+XDefineCursor_shadows =                     \
+    XUndefineCursor
+
+XDestroyWindow_shadows =                    \
+    XDestroySubwindows
+
+XDrawArc_shadows =                          \
+    XDrawArcs                               \
+    XArc
+
+XDrawImageString_shadows =                  \
+    XDrawImageString16
+
+XDrawLine_shadows =                         \
+    XDrawLines                              \
+    XDrawSegments                           \
+    XSegment
+
+XDrawPoint_shadows =                        \
+    XDrawPoints                             \
+    XPoint
+
+XDrawRectangle_shadows =                    \
+    XDrawRectangles                         \
+    XRectangle
+
+XDrawString_shadows =                       \
+    XDrawString16
+
+XDrawText_shadows =                         \
+    XDrawText16                             \
+    XTextItem                               \
+    XTextItem16
+
+XEmptyRegion_shadows =                      \
+    XEqualRegion                            \
+    XPointInRegion                          \
+    XRectInRegion
+
+XFillRectangle_shadows =                    \
+    XFillRectangles                         \
+    XFillPolygon                            \
+    XFillArc                                \
+    XFillArcs
+
+XFlush_shadows =                            \
+    XSync                                   \
+    XEventsQueued                           \
+    XPending
+
+XFontsOfFontSet_shadows =                   \
+    XBaseFontNameListOfFontSet              \
+    XLocaleOfFontSet                        \
+    XContextDependentDrawing                \
+    XContextualDrawing                      \
+    XDirectionalDependentDrawing
+
+XGraphicsExposeEvent_shadows =              \
+    XNoExposeEvent
+
+XrmGetFileDatabase_shadows =                \
+    XrmPutFileDatabase                      \
+    XrmGetStringDatabase                    \
+    XrmLocaleOfDatabase                     \
+    XrmGetDatabase                          \
+    XrmSetDatabase                          \
+    XrmDestroyDatabase
+
+XrmGetResource_shadows =                    \
+    XrmQGetResource                         \
+    XrmQGetSearchList                       \
+    XrmQGetSearchResource
+
+XGetEventData_shadows =                     \
+    XFreeEventData                          \
+    XGenericEventCookie
+
+XGetVisualInfo_shadows =                    \
+    XMatchVisualInfo                        \
+    XVisualIDFromVisual                     \
+    XVisualInfo
+
+XGetWindowAttributes_shadows =              \
+    XGetGeometry                            \
+    XWindowAttributes
+
+XGetWindowProperty_shadows =                \
+    XListProperties                         \
+    XChangeProperty                         \
+    XRotateWindowProperties                 \
+    XDeleteProperty
+
+XGrabButton_shadows =                       \
+    XUngrabButton
+
+XGrabKey_shadows =                          \
+    XUngrabKey
+
+XGrabKeyboard_shadows =                     \
+    XUngrabKeyboard
+
+XGrabPointer_shadows =                      \
+    XUngrabPointer                          \
+    XChangeActivePointerGrab
+
+XGrabServer_shadows =                       \
+    XUngrabServer
+
+XIconifyWindow_shadows =                    \
+    XWithdrawWindow                         \
+    XReconfigureWMWindow
+
+XIfEvent_shadows =                          \
+    XCheckIfEvent                           \
+    XPeekIfEvent
+
+XrmInitialize_shadows =                     \
+    XrmParseCommand                         \
+    XrmValue                                \
+    XrmOptionKind                           \
+    XrmOptionDescRec
+
+XInstallColormap_shadows =                  \
+    XUninstallColormap                      \
+    XListInstalledColormaps
+
+XAddConnectionWatch_shadows =               \
+    XRemoveConnectionWatch                  \
+    XProcessInternalConnection              \
+    XInternalConnectionNumbers
+
+XIntersectRegion_shadows =                  \
+    XUnionRegion                            \
+    XUnionRectWithRegion                    \
+    XSubtractRegion                         \
+    XXorRegion                              \
+    XOffsetRegion                           \
+    XShrinkRegion
+
+XInternAtom_shadows =                       \
+    XInternAtoms                            \
+    XGetAtomName                            \
+    XGetAtomNames
+
+XListFonts_shadows =                        \
+    XFreeFontNames                          \
+    XListFontsWithInfo                      \
+    XFreeFontInfo
+
+XLoadFont_shadows =                         \
+    XQueryFont                              \
+    XLoadQueryFont                          \
+    XFreeFont                               \
+    XGetFontProperty                        \
+    XUnloadFont                             \
+    XCharStruct                             \
+    XFontProp                               \
+    XChar2b                                 \
+    XFontStruct
+
+XLookupKeysym_shadows =                     \
+    XRefreshKeyboardMapping                 \
+    XLookupString                           \
+    XRebindKeysym
+
+XrmMergeDatabases_shadows =                 \
+    XrmCombineDatabase                      \
+    XrmCombineFileDatabase
+
+XMapEvent_shadows =                         \
+    XMappingEvent
+
+XMapWindow_shadows =                        \
+    XMapRaised                              \
+    XMapSubwindows
+
+XNextEvent_shadows =                        \
+    XPeekEvent                              \
+    XWindowEvent                            \
+    XCheckWindowEvent                       \
+    XMaskEvent                              \
+    XCheckMaskEvent                         \
+    XCheckTypedEvent                        \
+    XCheckTypedWindowEvent
+
+XOpenDisplay_shadows =                      \
+    XCloseDisplay
+
+XOpenIM_shadows =                           \
+    XCloseIM                                \
+    XSetIMValues                            \
+    XGetIMValues                            \
+    XDisplayOfIM                            \
+    XLocaleOfIM                             \
+    XRegisterIMInstantiateCallback          \
+    XUnregisterIMInstantiateCallback
+
+XOpenOM_shadows =                           \
+    XCloseOM                                \
+    XSetOMValues                            \
+    XGetOMValues                            \
+    XDisplayOfOM                            \
+    XLocaleOfOM
+
+XParseGeometry_shadows =                    \
+    XWMGeometry
+
+XPolygonRegion_shadows =                    \
+    XClipBox
+
+XPutImage_shadows =                         \
+    XGetImage                               \
+    XGetSubImage
+
+XrmPutResource_shadows =                    \
+    XrmQPutResource                         \
+    XrmPutStringResource                    \
+    XrmQPutStringResource                   \
+    XrmPutLineResource
+
+XQueryBestSize_shadows =                    \
+    XQueryBestTile                          \
+    XQueryBestStipple
+
+XQueryColor_shadows =                       \
+    XQueryColors                            \
+    XLookupColor                            \
+    XParseColor
+
+XQueryExtension_shadows =                   \
+    XListExtensions                         \
+    XFreeExtensionList
+
+XResourceManagerString_shadows =            \
+    XScreenResourceString
+
+XRaiseWindow_shadows =                      \
+    XLowerWindow                            \
+    XCirculateSubwindows                    \
+    XCirculateSubwindowsUp                  \
+    XCirculateSubwindowsDown                \
+    XRestackWindows
+
+XReadBitmapFile_shadows =                   \
+    XReadBitmapFileData                     \
+    XWriteBitmapFile                        \
+    XCreatePixmapFromBitmapData             \
+    XCreateBitmapFromData
+
+XRecolorCursor_shadows =                    \
+    XFreeCursor                             \
+    XQueryBestCursor
+
+XSaveContext_shadows =                      \
+    XFindContext                            \
+    XDeleteContext                          \
+    XUniqueContext
+
+XSetICFocus_shadows =                       \
+    XUnsetICFocus
+
+XSetICValues_shadows =                      \
+    XGetICValues
+
+XStringListToTextProperty_shadows =         \
+    XTextPropertyToStringList               \
+    XFreeStringList                         \
+    XTextProperty
+
+XSetArcMode_shadows =                       \
+    XSetSubwindowMode                       \
+    XSetGraphicsExposure
+
+XSetClipOrigin_shadows =                    \
+    XSetClipMask                            \
+    XSetClipRectangles
+
+XSetCloseDownMode_shadows =                 \
+    XKillClient
+
+XSetCommand_shadows =                       \
+    XGetCommand
+
+XSetErrorHandler_shadows =                  \
+    XGetErrorText                           \
+    XDisplayName                            \
+    XSetIOErrorHandler                      \
+    XGetErrorDatabaseText
+
+XSendEvent_shadows =                        \
+    XDisplayMotionBufferSize                \
+    XGetMotionEvents                        \
+    XTimeCoord
+
+XSetFillStyle_shadows =                     \
+    XSetFillRule
+
+XSetFontPath_shadows =                      \
+    XGetFontPath                            \
+    XFreeFontPath
+
+XSetInputFocus_shadows =                    \
+    XGetInputFocus
+
+XSetLineAttributes_shadows =                \
+    XSetDashes
+
+XSetPointerMapping_shadows =                \
+    XGetPointerMapping
+
+XSetScreenSaver_shadows =                   \
+    XForceScreenSaver                       \
+    XActivateScreenSaver                    \
+    XResetScreenSaver                       \
+    XGetScreenSaver
+
+XSetSelectionOwner_shadows =                \
+    XGetSelectionOwner                      \
+    XConvertSelection
+
+XSetState_shadows =                         \
+    XSetFunction                            \
+    XSetPlaneMask                           \
+    XSetForeground                          \
+    XSetBackground
+
+XSetTransientForHint_shadows =              \
+    XGetTransientForHint
+
+XSetTextProperty_shadows =                  \
+    XGetTextProperty
+
+XSetTile_shadows =                          \
+    XSetStipple                             \
+    XSetTSOrigin
+
+XSetWMClientMachine_shadows =               \
+    XGetWMClientMachine
+
+XSetWMColormapWindows_shadows =             \
+    XGetWMColormapWindows
+
+XSetWMIconName_shadows =                    \
+    XGetWMIconName                          \
+    XSetIconName                            \
+    XGetIconName
+
+XSetWMName_shadows =                        \
+    XGetWMName                              \
+    XStoreName                              \
+    XFetchName
+
+XSetWMProperties_shadows =                  \
+    XmbSetWMProperties                      \
+    Xutf8SetWMProperties
+
+XSetWMProtocols_shadows =                   \
+    XGetWMProtocols
+
+XStoreBytes_shadows =                       \
+    XStoreBuffer                            \
+    XFetchBytes                             \
+    XFetchBuffer                            \
+    XRotateBuffers
+
+XStoreColors_shadows =                      \
+    XStoreColor                             \
+    XStoreNamedColor
+
+XStringToKeysym_shadows =                   \
+    XKeysymToString                         \
+    XKeycodeToKeysym                        \
+    XKeysymToKeycode                        \
+    XConvertCase
+
+XSupportsLocale_shadows =                   \
+    XSetLocaleModifiers
+
+XSynchronize_shadows =                      \
+    XSetAfterFunction
+
+XmbTextListToTextProperty_shadows =         \
+    XwcTextListToTextProperty               \
+    Xutf8TextListToTextProperty             \
+    XmbTextPropertyToTextList               \
+    XwcTextPropertyToTextList               \
+    Xutf8TextPropertyToTextList             \
+    XwcFreeStringList                       \
+    XDefaultString
+
+XTextExtents_shadows =                      \
+    XTextExtents16                          \
+    XQueryTextExtents                       \
+    XQueryTextExtents16
+
+XTextWidth_shadows =                        \
+    XTextWidth16
+
+XInitThreads_shadows =                      \
+    XLockDisplay                            \
+    XUnlockDisplay
+
+XrmUniqueQuark_shadows =                    \
+    XrmStringToQuark                        \
+    XrmPermStringToQuark                    \
+    XrmQuarkToString                        \
+    XrmStringToQuarkList                    \
+    XrmStringToBindingQuarkList
+
+XUnmapWindow_shadows =                      \
+    XUnmapSubwindows
+
+XcmsCCCOfColormap_shadows =                 \
+    XcmsSetCCCOfColormap
+
+XcmsAllocColor_shadows =                    \
+    XcmsAllocNamedColor
+
+XcmsColor_shadows =                         \
+    XcmsRGB                                 \
+    XcmsRGBi                                \
+    XcmsCIEXYZ                              \
+    XcmsCIEuvY                              \
+    XcmsCIExyY                              \
+    XcmsCIELab                              \
+    XcmsCIELuv                              \
+    XcmsTekHVC                              \
+    XcmsPad
+
+XcmsCreateCCC_shadows =                     \
+    XcmsFreeCCC
+
+XcmsCIELabQueryMaxC_shadows =               \
+    XcmsCIELabQueryMaxL                     \
+    XcmsCIELabQueryMaxLC                    \
+    XcmsCIELabQueryMinL
+
+XcmsCIELuvQueryMaxC_shadows =               \
+    XcmsCIELuvQueryMaxL                     \
+    XcmsCIELuvQueryMaxLC                    \
+    XcmsCIELuvQueryMinL
+
+XcmsQueryBlack_shadows =                    \
+    XcmsQueryBlue                           \
+    XcmsQueryGreen                          \
+    XcmsQueryRed                            \
+    XcmsQueryWhite
+
+XcmsQueryColor_shadows =                    \
+    XcmsQueryColors                         \
+    XcmsLookupColor
+
+XcmsStoreColor_shadows =                    \
+    XcmsStoreColors
+
+XcmsSetWhitePoint_shadows =                 \
+    XcmsSetWhiteAdjustProc
+
+XcmsTekHVCQueryMaxC_shadows =               \
+    XcmsTekHVCQueryMaxV                     \
+    XcmsTekHVCQueryMaxVC                    \
+    XcmsTekHVCQueryMaxVSamples              \
+    XcmsTekHVCQueryMinV
+
+XmbDrawImageString_shadows =                \
+    XwcDrawImageString                      \
+    Xutf8DrawImageString
+
+XmbDrawString_shadows =                     \
+    XwcDrawString                           \
+    Xutf8DrawString
+
+XmbDrawText_shadows =                       \
+    XwcDrawText                             \
+    Xutf8DrawText
+
+XmbLookupString_shadows =                   \
+    XwcLookupString                         \
+    Xutf8LookupString
+
+XmbResetIC_shadows =                        \
+    XwcResetIC                              \
+    Xutf8ResetIC
+
+XmbTextEscapement_shadows =                 \
+    XwcTextEscapement                       \
+    Xutf8TextEscapement
+
+XmbTextExtents_shadows =                    \
+    XwcTextExtents                          \
+    Xutf8TextExtents
+
+XmbTextPerCharExtents_shadows =             \
+    XwcTextPerCharExtents                   \
+    Xutf8TextPerCharExtents
+
+file_shadows =                             \
+    $(Compose_shadows)
+
+Compose_shadows =                          \
+    XCompose
+
diff --git a/man/MaxCmapsOfScreen.man b/man/MaxCmapsOfScreen.man
new file mode 100644 (file)
index 0000000..1bb28e7
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/BlackPixelOfScreen.__libmansuffix__
diff --git a/man/MinCmapsOfScreen.man b/man/MinCmapsOfScreen.man
new file mode 100644 (file)
index 0000000..1bb28e7
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/BlackPixelOfScreen.__libmansuffix__
diff --git a/man/NextRequest.man b/man/NextRequest.man
new file mode 100644 (file)
index 0000000..7949dfa
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/AllPlanes.__libmansuffix__
diff --git a/man/PlanesOfScreen.man b/man/PlanesOfScreen.man
new file mode 100644 (file)
index 0000000..1bb28e7
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/BlackPixelOfScreen.__libmansuffix__
diff --git a/man/ProtocolRevision.man b/man/ProtocolRevision.man
new file mode 100644 (file)
index 0000000..7949dfa
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/AllPlanes.__libmansuffix__
diff --git a/man/ProtocolVersion.man b/man/ProtocolVersion.man
new file mode 100644 (file)
index 0000000..7949dfa
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/AllPlanes.__libmansuffix__
diff --git a/man/QLength.man b/man/QLength.man
new file mode 100644 (file)
index 0000000..7949dfa
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/AllPlanes.__libmansuffix__
diff --git a/man/RootWindow.man b/man/RootWindow.man
new file mode 100644 (file)
index 0000000..7949dfa
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/AllPlanes.__libmansuffix__
diff --git a/man/RootWindowOfScreen.man b/man/RootWindowOfScreen.man
new file mode 100644 (file)
index 0000000..1bb28e7
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/BlackPixelOfScreen.__libmansuffix__
diff --git a/man/ScreenCount.man b/man/ScreenCount.man
new file mode 100644 (file)
index 0000000..7949dfa
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/AllPlanes.__libmansuffix__
diff --git a/man/ScreenNumberOfCCC.man b/man/ScreenNumberOfCCC.man
new file mode 100644 (file)
index 0000000..fd4e759
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/DisplayOfCCC.__libmansuffix__
diff --git a/man/ScreenOfDisplay.man b/man/ScreenOfDisplay.man
new file mode 100644 (file)
index 0000000..7949dfa
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/AllPlanes.__libmansuffix__
diff --git a/man/ScreenWhitePointOfCCC.man b/man/ScreenWhitePointOfCCC.man
new file mode 100644 (file)
index 0000000..fd4e759
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/DisplayOfCCC.__libmansuffix__
diff --git a/man/ServerVendor.man b/man/ServerVendor.man
new file mode 100644 (file)
index 0000000..7949dfa
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/AllPlanes.__libmansuffix__
diff --git a/man/VendorRelease.man b/man/VendorRelease.man
new file mode 100644 (file)
index 0000000..7949dfa
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/AllPlanes.__libmansuffix__
diff --git a/man/VisualOfCCC.man b/man/VisualOfCCC.man
new file mode 100644 (file)
index 0000000..fd4e759
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/DisplayOfCCC.__libmansuffix__
diff --git a/man/WhitePixel.man b/man/WhitePixel.man
new file mode 100644 (file)
index 0000000..7949dfa
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/AllPlanes.__libmansuffix__
diff --git a/man/WhitePixelOfScreen.man b/man/WhitePixelOfScreen.man
new file mode 100644 (file)
index 0000000..1bb28e7
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/BlackPixelOfScreen.__libmansuffix__
diff --git a/man/WidthMMOfScreen.man b/man/WidthMMOfScreen.man
new file mode 100644 (file)
index 0000000..1bb28e7
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/BlackPixelOfScreen.__libmansuffix__
diff --git a/man/WidthOfScreen.man b/man/WidthOfScreen.man
new file mode 100644 (file)
index 0000000..1bb28e7
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/BlackPixelOfScreen.__libmansuffix__
diff --git a/man/XActivateScreenSaver.man b/man/XActivateScreenSaver.man
new file mode 100644 (file)
index 0000000..13eba4e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetScreenSaver.__libmansuffix__
diff --git a/man/XAddConnectionWatch.man b/man/XAddConnectionWatch.man
new file mode 100644 (file)
index 0000000..765162f
--- /dev/null
@@ -0,0 +1,236 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XAddConnectionWatch __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XAddConnectionWatch, XRemoveConnectionWatch, XProcessInternalConnection, XInternalConnectionNumbers \- handle Xlib internal connections
+.SH SYNTAX
+.HP
+typedef void (*XConnectionWatchProc)\^(\^Display *\fIdisplay\fP\^, XPointer
+\fIclient_data\fP\^, int \fIfd\fP\^, Bool \fIopening\fP\^, XPointer
+*\fIwatch_data\fP\^); 
+.HP
+Status XAddConnectionWatch\^(\^Display *\fIdisplay\fP\^, XWatchProc
+\fIprocedure\fP\^, XPointer \fIclient_data\fP\^); 
+.HP
+Status XRemoveConnectionWatch\^(\^Display *\fIdisplay\fP\^, XWatchProc
+\fIprocedure\fP\^, XPointer \fIclient_data\fP\^); 
+.HP
+void XProcessInternalConnection\^(\^Display *\fIdisplay\fP\^, int \fIfd\fP\^);
+.HP
+Status XInternalConnectionNumbers\^(\^Display *\fIdisplay\fP\^, int
+**\fIfd_return\fP\^, int *\fIcount_return\fP\^); 
+.SH ARGUMENTS
+.IP \fIclient_data\fP 1i
+Specifies the additional client data.
+.ds Cn file descriptors
+.IP \fIcount_return\fP 1i
+Returns the number of \*(Cn.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIfd\fP 1i
+Specifies the file descriptor.
+.IP \fIfd_return\fP 1i
+Returns the file descriptors.
+.IP \fIprocedure\fP 1i
+Specifies the procedure to be called.
+.SH DESCRIPTION
+The
+.ZN XAddConnectionWatch
+function registers a procedure to be called each time Xlib opens or closes an
+internal connection for the specified display.  The procedure is passed the
+display, the specified client_data, the file descriptor for the connection,
+a Boolean indicating whether the connection is being opened or closed, and a
+pointer to a location for private watch data.  If opening is
+.ZN True ,
+the procedure can store a pointer to private data in the location pointed
+to by watch_data;
+when the procedure is later called for this same connection and opening is
+.ZN False ,
+the location pointed to by watch_data will hold this same private data pointer.
+.LP
+This function can be called at any time after a display is opened.
+If internal connections already exist, the registered procedure will
+immediately be called for each of them, before
+.ZN XAddConnectionWatch
+returns.
+.ZN XAddConnectionWatch
+returns a nonzero status if the procedure is successfully registered;
+otherwise, it returns zero.
+.LP
+The registered procedure should not call any Xlib functions.
+If the procedure directly or indirectly causes the state of internal
+connections or watch procedures to change, the result is not defined.
+If Xlib has been initialized for threads, the procedure is called with
+the display locked and the result of a call by the procedure to any
+Xlib function that locks the display is not defined unless the executing
+thread has externally locked the display using
+.ZN XLockDisplay .
+.LP
+The
+.ZN XRemoveConnectionWatch
+function removes a previously registered connection watch procedure.
+The client_data must match the client_data used when the procedure
+was initially registered.
+
+.LP
+The
+.ZN XProcessInternalConnection
+function processes input available on an internal connection.
+This function should be called for an internal connection only
+after an operating system facility (for example,
+.ZN select
+or
+.ZN poll )
+has indicated that input is available; otherwise,
+the effect is not defined.
+.LP
+The
+.ZN XInternalConnectionNumbers
+function returns a list of the file descriptors for all internal
+connections currently open for the specified display.
+When the allocated list is no longer needed,
+free it by using
+.ZN XFree .
+This functions returns a nonzero status if the list is successfully allocated;
+otherwise, it returns zero.
+.SH "SEE ALSO"
+\fI\*(xL\fP
diff --git a/man/XAddHost.man b/man/XAddHost.man
new file mode 100644 (file)
index 0000000..b048dd7
--- /dev/null
@@ -0,0 +1,378 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" 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, and/or sell copies of the Software, and to permit persons
+.\" to whom the Software is furnished to do so, provided that the above
+.\" copyright notice(s) and this permission notice appear in all copies of
+.\" the Software and that both the above copyright notice(s) and this
+.\" permission notice appear in supporting documentation.
+.\" 
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+.\" OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+.\" HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR 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.
+.\" 
+.\" Except as contained in this notice, the name of a copyright holder
+.\" shall not be used in advertising or otherwise to promote the sale, use
+.\" or other dealings in this Software without prior written authorization
+.\" of the copyright holder.
+.\" 
+.\" X Window System is a trademark of The Open Group.
+.\"
+.\" Copyright 2004 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 \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XAddHost __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XAddHost, XAddHosts, XListHosts, XRemoveHost, XRemoveHosts, XSetAccessControl, XEnableAccessControl, XDisableAccessControl, XHostAddress, XServerInterpretedAddress \- control host access and host control structure
+.SH SYNTAX
+.HP
+int XAddHost\^(\^Display *\fIdisplay\fP, XHostAddress *\fIhost\fP\^); 
+.HP
+int XAddHosts\^(\^Display *\fIdisplay\fP, XHostAddress *\fIhosts\fP, 
+int \fInum_hosts\fP\^);
+.HP
+XHostAddress *XListHosts\^(\^Display *\fIdisplay\fP, int *\fInhosts_return\fP,
+Bool \fIstate_return\fP\^);
+.HP
+int XRemoveHost\^(\^Display *\fIdisplay\fP, XHostAddress *\fIhost\fP\^);
+.HP
+int XRemoveHosts\^(\^Display *\fIdisplay\fP, XHostAddress *\fIhosts\fP, int \fInum_hosts\fP\^);
+.HP
+int XSetAccessControl\^(\^Display *\fIdisplay\fP, int \fImode\fP\^);
+.HP
+int XEnableAccessControl\^(\^Display *\fIdisplay\fP\^);
+.HP
+int XDisableAccessControl\^(\^Display *\fIdisplay\fP\^);
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.ds Ho added or removed
+.IP \fIhost\fP 1i
+Specifies the host that is to be \*(Ho.
+.ds Ho added or removed
+.IP \fIhosts\fP 1i
+Specifies each host that is to be \*(Ho.
+.IP \fImode\fP 1i
+Specifies the mode.
+You can pass
+.ZN EnableAccess
+or
+.ZN DisableAccess .
+.IP \fInhosts_return\fP 1i
+Returns the number of hosts currently in the access control list.
+.IP \fInum_hosts\fP 1i
+Specifies the number of hosts.
+.IP \fIstate_return\fP 1i
+Returns the state of the access control.
+.SH DESCRIPTION
+The
+.ZN XAddHost
+function adds the specified host to the access control list for that display.
+The server must be on the same host as the client issuing the command, or a
+.ZN BadAccess
+error results.
+.LP
+.ZN XAddHost
+can generate
+.ZN BadAccess
+and
+.ZN BadValue
+errors.
+.LP
+The
+.ZN XAddHosts
+function adds each specified host to the access control list for that display.
+The server must be on the same host as the client issuing the command, or a
+.ZN BadAccess
+error results.
+.LP
+.ZN XAddHosts
+can generate
+.ZN BadAccess
+and
+.ZN BadValue
+errors.
+.LP
+The
+.ZN XListHosts
+function returns the current access control list as well as whether the use 
+of the list at connection setup was enabled or disabled.
+.ZN XListHosts
+allows a program to find out what machines can make connections.
+It also returns a pointer to a list of host structures that
+were allocated by the function. 
+When no longer needed,
+this memory should be freed by calling
+.ZN XFree .
+.LP
+The
+.ZN XRemoveHost
+function removes the specified host from the access control list 
+for that display.
+The server must be on the same host as the client process, or a
+.ZN BadAccess
+error results.
+If you remove your machine from the access list,
+you can no longer connect to that server,
+and this operation cannot be reversed unless you reset the server.
+.LP
+.ZN XRemoveHost
+can generate
+.ZN BadAccess
+and
+.ZN BadValue
+errors.
+.LP
+The
+.ZN XRemoveHosts
+function removes each specified host from the access control list for that 
+display.  
+The X server must be on the same host as the client process, or a
+.ZN BadAccess
+error results.
+If you remove your machine from the access list, 
+you can no longer connect to that server,
+and this operation cannot be reversed unless you reset the server.
+.LP
+.ZN XRemoveHosts
+can generate
+.ZN BadAccess
+and
+.ZN BadValue
+errors.
+.LP
+The
+.ZN XSetAccessControl
+function either enables or disables the use of the access control list 
+at each connection setup.
+.LP
+.ZN XSetAccessControl
+can generate
+.ZN BadAccess
+and
+.ZN BadValue 
+errors.
+.LP
+The
+.ZN XEnableAccessControl
+function enables the use of the access control list at each connection setup.
+.LP
+.ZN XEnableAccessControl
+can generate a
+.ZN BadAccess 
+error.
+.LP
+The
+.ZN XDisableAccessControl
+function disables the use of the access control list at each connection setup.
+.LP
+.ZN XDisableAccessControl
+can generate a
+.ZN BadAccess 
+error.
+.SH STRUCTURES
+The
+.ZN XHostAddress
+structure contains:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int family;     /\&* for example FamilyInternet */
+       int length;     /\&* length of address, in bytes */
+       char *address;  /\&* pointer to where to find the address */
+} XHostAddress;
+.De
+.LP
+The family member specifies which protocol address family to use 
+(for example, TCP/IP or DECnet) and can be
+.ZN FamilyInternet ,
+.ZN FamilyInternet6 ,
+.ZN FamilyServerInterpreted ,
+.ZN FamilyDECnet ,
+or
+.ZN FamilyChaos .
+The length member specifies the length of the address in bytes.
+The address member specifies a pointer to the address.
+.LP
+For the ServerInterpreted family, the length is ignored and the address 
+member is a pointer to a 
+.ZN XServerInterpretedAddress
+structure which contains:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int typelength;         /\&* length of type string, in bytes */
+       int valuelength;        /\&* length of value string, in bytes */
+       char *type;             /\&* pointer to where to find the type string */
+       char *value;            /\&* pointer to where to find the address */
+} XServerInterpretedAddress;
+.De
+.LP
+The type and value members point to strings representing the type and value of
+the server interpreted entry.  These strings may not be NULL-terminated so care
+should be used when accessing them.  The typelength and valuelength members
+specify the length in byte of the type and value strings.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAccess
+A client attempted
+to modify the access control list from other than the local
+(or otherwise authorized) host.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.SH "SEE ALSO"
+XFree(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XAddHosts.man b/man/XAddHosts.man
new file mode 100644 (file)
index 0000000..13e833b
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAddHost.__libmansuffix__
diff --git a/man/XAddPixel.man b/man/XAddPixel.man
new file mode 100644 (file)
index 0000000..19e5be3
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XInitImage.__libmansuffix__
diff --git a/man/XAddToSaveSet.man b/man/XAddToSaveSet.man
new file mode 100644 (file)
index 0000000..b690595
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XChangeSaveSet.__libmansuffix__
diff --git a/man/XAllocClassHint.man b/man/XAllocClassHint.man
new file mode 100644 (file)
index 0000000..438ec1e
--- /dev/null
@@ -0,0 +1,265 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XAllocClassHint __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XAllocClassHint, XSetClassHint, XGetClassHint, XClassHint \- allocate class hints structure and set or read a window's WM_CLASS property
+.SH SYNTAX
+.HP
+XClassHint *XAllocClassHint\^(void\^);
+.HP
+XSetClassHint\^(\^Display *\fIdisplay\fP, Window \fIw\fP, XClassHint *\fIclass_hints\fP\^);
+.HP
+Status XGetClassHint\^(\^Display *\fIdisplay\fP, Window \fIw\fP, XClassHint *\fIclass_hints_return\fP\^);
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIclass_hints\fP 1i
+Specifies the
+.ZN XClassHint
+structure that is to be used.
+.IP \fIclass_hints_return\fP 1i
+Returns the 
+.ZN XClassHint
+structure.
+.IP \fIw\fP 1i
+Specifies the window.
+.SH DESCRIPTION
+The
+.ZN XAllocClassHint
+function allocates and returns a pointer to a
+.ZN XClassHint
+structure.
+Note that the pointer fields in the
+.ZN XClassHint
+structure are initially set to NULL.
+If insufficient memory is available, 
+.ZN XAllocClassHint
+returns NULL.
+To free the memory allocated to this structure,
+use
+.ZN XFree .
+.LP
+The
+.ZN XSetClassHint
+function sets the class hint for the specified window.
+If the strings are not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+.LP
+.ZN XSetClassHint
+can generate
+.ZN BadAlloc
+and
+.ZN BadWindow
+errors.
+.LP
+The
+.ZN XGetClassHint
+function returns the class hint of the specified window to the members
+of the supplied structure.
+If the data returned by the server is in the Latin Portable Character Encoding,
+then the returned strings are in the Host Portable Character Encoding.
+Otherwise, the result is implementation-dependent.
+It returns a nonzero status on success;
+otherwise, it returns a zero status.
+To free res_name and res_class when finished with the strings,
+use
+.ZN XFree
+on each individually.
+.LP
+.ZN XGetClassHint
+can generate a
+.ZN BadWindow
+error.
+.SH PROPERTIES
+.TP 1i
+\s-1WM_CLASS\s+1
+Set by application programs to allow window and session
+managers to obtain the application's resources from the resource database.
+.SH STRUCTURES
+The
+.ZN XClassHint
+structure contains:
+.LP
+.IN "XClassHint" "" "@DEF@"
+.Ds 0
+.TA .5i
+.ta .5i
+typedef struct {
+       char *res_name;
+       char *res_class;
+} XClassHint;
+.De
+.LP
+The res_name member contains the application name, 
+and the res_class member contains the application class. 
+Note that the name set in this property may differ from the name set as WM_NAME.
+That is, WM_NAME specifies what should be displayed in the title bar and,
+therefore, can contain temporal information (for example, the name of
+a file currently in an editor's buffer).
+On the other hand, 
+the name specified as part of WM_CLASS is the formal name of the application
+that should be used when retrieving the application's resources from the 
+resource database.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XAllocIconSize(__libmansuffix__),
+XAllocSizeHints(__libmansuffix__),
+XAllocWMHints(__libmansuffix__),
+XFree(__libmansuffix__),
+XSetCommand(__libmansuffix__),
+XSetTransientForHint(__libmansuffix__),
+XSetTextProperty(__libmansuffix__),
+XSetWMClientMachine(__libmansuffix__),
+XSetWMColormapWindows(__libmansuffix__),
+XSetWMIconName(__libmansuffix__),
+XSetWMName(__libmansuffix__),
+XSetWMProperties(__libmansuffix__),
+XSetWMProtocols(__libmansuffix__),
+XStringListToTextProperty(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XAllocColor.man b/man/XAllocColor.man
new file mode 100644 (file)
index 0000000..851f4d7
--- /dev/null
@@ -0,0 +1,447 @@
+'\" e
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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
+'\" e
+.TH XAllocColor __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XAllocColor, XAllocNamedColor, XAllocColorCells, XAllocColorPlanes, XFreeColors \- allocate and free colors
+.SH SYNTAX
+.HP
+Status XAllocColor\^(\^Display *\fIdisplay\fP, Colormap \fIcolormap\fP\^,
+XColor *\fIscreen_in_out\fP\^);
+.HP
+Status XAllocNamedColor\^(\^Display *\fIdisplay\fP, Colormap \fIcolormap\fP\^,
+char *\fIcolor_name\fP\^, XColor *\fIscreen_def_return\fP\^, XColor
+*\fIexact_def_return\fP\^);
+.HP
+Status XAllocColorCells\^(\^Display *\fIdisplay\fP, Colormap \fIcolormap\fP\^,
+Bool \fIcontig\fP\^, unsigned long \fIplane_masks_return\fP[\^]\^, unsigned int
+\fInplanes\fP\^, unsigned long \fIpixels_return\fP[\^]\^, unsigned int
+\fInpixels\fP\^);
+.HP
+Status XAllocColorPlanes\^(\^Display *\fIdisplay\fP, Colormap
+\fIcolormap\fP\^, Bool \fIcontig\fP\^, unsigned long
+\fIpixels_return\fP[\^]\^, int \fIncolors\fP\^, int \fInreds\fP\^, int
+\fIngreens\fP\^, int \fInblues\fP\^, unsigned long *\fIrmask_return\fP\^,
+unsigned long *\fIgmask_return\fP\^, unsigned long *\fIbmask_return\fP\^);
+.HP
+int XFreeColors\^(\^Display *\fIdisplay\fP, Colormap \fIcolormap\fP\^, unsigned
+long \fIpixels\fP\^[\^], int \fInpixels\fP\^, unsigned long \fIplanes\fP\^);
+.IP \fIcolor_name\fP 1i
+Specifies the color name string (for example, red) whose color 
+definition structure you want returned.
+.IP \fIcolormap\fP 1i
+Specifies the colormap.
+.IP \fIcontig\fP 1i
+Specifies a Boolean value that indicates whether the planes must be contiguous.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIexact_def_return\fP 1i
+Returns the exact RGB values.
+.IP \fIncolors\fP 1i
+Specifies the number of pixel values that are to be returned in the 
+pixels_return array. 
+.IP \fInpixels\fP 1i
+Specifies the number of pixels. 
+.IP \fInplanes\fP 1i
+Specifies the number of plane masks that are to be returned in the plane masks 
+array. 
+.IP \fInreds\fP 1i
+.br
+.ns
+.IP \fIngreens\fP 1i
+.br
+.ns
+.IP \fInblues\fP 1i
+.br
+.ns
+Specify the number of red, green, and blue planes.
+The value you pass must be nonnegative. 
+.IP \fIpixels\fP 1i
+Specifies an array of pixel values. 
+.IP \fIpixels_return\fP 1i
+Returns an array of pixel values. 
+.IP \fIplane_mask_return\fP 1i
+Returns an array of plane masks.
+.\" *** JIM: NEED MORE INFO FOR THIS. ***
+.IP \fIplanes\fP 1i
+Specifies the planes you want to free.
+.IP \fIrmask_return\fP 1i
+.br
+.ns
+.IP \fIgmask_return\fP 1i
+.br
+.ns
+.IP \fIbmask_return\fP 1i
+Return bit masks for the red, green, and blue planes.
+.IP \fIscreen_def_return\fP 1i
+Returns the closest RGB values provided by the hardware.
+.IP \fIscreen_in_out\fP 1i
+Specifies and returns the values actually used in the colormap.
+.SH DESCRIPTION
+The
+.ZN XAllocColor
+function allocates a read-only colormap entry corresponding to the closest
+RGB value supported by the hardware.
+.ZN XAllocColor
+returns the pixel value of the color closest to the specified
+RGB elements supported by the hardware
+and returns the RGB value actually used.
+The corresponding colormap cell is read-only.
+In addition,
+.ZN XAllocColor
+returns nonzero if it succeeded or zero if it failed.
+.IN "Color map"
+.IN "Color" "allocation"
+.IN "Allocation" "colormap"
+.IN "read-only colormap cells"
+Multiple clients that request the same effective RGB value can be assigned
+the same read-only entry, thus allowing entries to be shared.
+When the last client deallocates a shared cell, it is deallocated.
+.ZN XAllocColor
+does not use or affect the flags in the
+.ZN XColor
+structure.
+.LP
+.ZN XAllocColor
+can generate a
+.ZN BadColor 
+error.
+.LP
+The
+.ZN XAllocNamedColor
+function looks up the named color with respect to the screen that is
+associated with the specified colormap.
+It returns both the exact database definition and
+the closest color supported by the screen.
+The allocated color cell is read-only.
+The pixel value is returned in screen_def_return.
+If the color name is not in the Host Portable Character Encoding, 
+the result is implementation-dependent.
+Use of uppercase or lowercase does not matter.
+If screen_def_return and exact_def_return
+point to the same structure, the pixel field will be set correctly,
+but the color values are undefined.
+.ZN XAllocNamedColor
+returns nonzero if a cell is allocated;
+otherwise, it returns zero.
+.LP
+.ZN XAllocNamedColor
+can generate a
+.ZN BadColor
+error.
+.LP
+.EQ
+delim %%
+.EN
+The
+.ZN XAllocColorCells
+function allocates read/write color cells.
+The number of colors must be positive and the number of planes nonnegative,
+or a
+.ZN BadValue
+error results.
+If ncolors and nplanes are requested, 
+then ncolors pixels
+and nplane plane masks are returned.
+No mask will have any bits set to 1 in common with
+any other mask or with any of the pixels.
+By ORing together each pixel with zero or more masks,
+ncolors * %2 sup nplanes% distinct pixels can be produced.
+All of these are
+allocated writable by the request.
+For 
+.ZN GrayScale 
+or 
+.ZN PseudoColor , 
+each mask has exactly one bit set to 1. 
+For 
+.ZN DirectColor , 
+each has exactly three bits set to 1.
+If contig is 
+.ZN True 
+and if all masks are ORed
+together, a single contiguous set of bits set to 1 will be formed for 
+.ZN GrayScale
+or 
+.ZN PseudoColor 
+and three contiguous sets of bits set to 1 (one within each
+pixel subfield) for 
+.ZN DirectColor .
+The RGB values of the allocated
+entries are undefined.
+.ZN XAllocColorCells
+returns nonzero if it succeeded or zero if it failed.
+.LP
+.ZN XAllocColorCells
+can generate
+.ZN BadColor
+and
+.ZN BadValue 
+errors.
+.LP
+.EQ
+delim %%
+.EN
+The specified ncolors must be positive; 
+and nreds, ngreens, and nblues must be nonnegative,
+or a
+.ZN BadValue
+error results.
+If ncolors colors, nreds reds, ngreens greens, and nblues blues are requested, 
+ncolors pixels are returned; and the masks have nreds, ngreens, and 
+nblues bits set to 1, respectively.
+If contig is 
+.ZN True , 
+each mask will have
+a contiguous set of bits set to 1.
+No mask will have any bits set to 1 in common with
+any other mask or with any of the pixels.
+For 
+.ZN DirectColor , 
+each mask
+will lie within the corresponding pixel subfield.
+By ORing together
+subsets of masks with each pixel value, 
+ncolors * %2 sup (nreds+ngreens+nblues)% distinct pixel values can be produced. 
+All of these are allocated by the request.
+However, in the
+colormap, there are only ncolors * %2 sup nreds% independent red entries, 
+ncolors * %2 sup ngreens% independent green entries, 
+and ncolors * %2 sup nblues% independent blue entries. 
+This is true even for 
+.ZN PseudoColor .
+When the colormap entry of a pixel
+value is changed (using 
+.ZN XStoreColors ,
+.ZN XStoreColor ,
+or 
+.ZN XStoreNamedColor ),
+the pixel is decomposed according to the masks, 
+and the corresponding independent entries are updated.
+.ZN XAllocColorPlanes
+returns nonzero if it succeeded or zero if it failed.
+.LP
+.ZN XAllocColorPlanes
+can generate
+.ZN BadColor
+and
+.ZN BadValue 
+errors.
+.LP
+The
+.ZN XFreeColors
+function frees the cells represented by pixels whose values are in the
+pixels array.
+The planes argument should not have any bits set to 1 in common with any of the
+pixels. 
+The set of all pixels is produced by ORing together subsets of
+the planes argument with the pixels.
+The request frees all of these pixels that
+were allocated by the client (using 
+.IN XAllocColor
+.IN XAllocNamedColor
+.IN XAllocColorCells
+.IN XAllocColorPlanes
+.ZN XAllocColor , 
+.ZN XAllocNamedColor ,
+.ZN XAllocColorCells ,
+and 
+.ZN XAllocColorPlanes ).
+Note that freeing an
+individual pixel obtained from 
+.ZN XAllocColorPlanes 
+may not actually allow
+it to be reused until all of its related pixels are also freed.
+Similarly,
+a read-only entry is not actually freed until it has been freed by all clients,
+and if a client allocates the same read-only entry multiple times,
+it must free the entry that many times before the entry is actually freed.
+.LP
+All specified pixels that are allocated by the client in the colormap are
+freed, even if one or more pixels produce an error. 
+If a specified pixel is not a valid index into the colormap, a 
+.ZN BadValue 
+error results.
+If a specified pixel is not allocated by the
+client (that is, is unallocated or is only allocated by another client)
+or if the colormap was created with all entries writable (by passing
+.ZN AllocAll
+to
+.ZN XCreateColormap ),
+a
+.ZN BadAccess
+error results. 
+If more than one pixel is in error, 
+the one that gets reported is arbitrary.
+.LP
+.ZN XFreeColors
+can generate
+.ZN BadAccess ,
+.ZN BadColor ,
+and
+.ZN BadValue 
+errors.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAccess
+A client attempted
+to free a color map entry that it did not already allocate.
+.TP 1i
+.ZN BadAccess
+A client attempted
+to store into a read-only color map entry.
+.TP 1i
+.ZN BadColor
+A value for a Colormap argument does not name a defined Colormap.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.SH "SEE ALSO"
+XCreateColormap(__libmansuffix__), 
+XQueryColor(__libmansuffix__),
+XStoreColors(__libmansuffix__) 
+.br
+\fI\*(xL\fP
diff --git a/man/XAllocColorCells.man b/man/XAllocColorCells.man
new file mode 100644 (file)
index 0000000..5d64d87
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAllocColor.__libmansuffix__
diff --git a/man/XAllocColorPlanes.man b/man/XAllocColorPlanes.man
new file mode 100644 (file)
index 0000000..5d64d87
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAllocColor.__libmansuffix__
diff --git a/man/XAllocIconSize.man b/man/XAllocIconSize.man
new file mode 100644 (file)
index 0000000..eb13027
--- /dev/null
@@ -0,0 +1,261 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XAllocIconSize __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XAllocIconSize, XSetIconSizes, XGetIconSizes, XIconSize \- allocate icon size structure and set or read a window's WM_ICON_SIZES property
+.SH SYNTAX
+XIconSize *XAllocIconSize\^(void\^);
+.LP
+int XSetIconSizes\^(\^Display *\fIdisplay\fP, Window \fIw\fP, XIconSize
+*\fIsize_list\fP, int \fIcount\fP\^);
+.LP
+Status XGetIconSizes\^(\^Display *\fIdisplay\fP, Window \fIw\fP, XIconSize
+**\fIsize_list_return\fP, int \fIcount_return\fP\^);
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIcount\fP 1i
+Specifies the number of items in the size list.
+.IP \fIcount_return\fP 1i
+Returns the number of items in the size list.
+.IP \fIsize_list\fP 1i
+Specifies the size list.
+.IP \fIsize_list_return\fP 1i
+Returns the size list.
+.IP \fIw\fP 1i
+Specifies the window.
+.SH DESCRIPTION
+The
+.ZN XAllocIconSize 
+function allocates and returns a pointer to a
+.ZN XIconSize 
+structure.
+Note that all fields in the
+.ZN XIconSize
+structure are initially set to zero.
+If insufficient memory is available, 
+.ZN XAllocIconSize
+returns NULL.
+To free the memory allocated to this structure,
+use
+.ZN XFree .
+.LP
+The
+.ZN XSetIconSizes
+function is used only by window managers to set the supported icon sizes.
+.LP
+.ZN XSetIconSizes
+can generate
+.ZN BadAlloc
+and
+.ZN BadWindow
+errors.
+.LP
+The
+.ZN XGetIconSizes
+function returns zero if a window manager has not set icon sizes;
+otherwise, it return nonzero.
+.ZN XGetIconSizes
+should be called by an application that
+wants to find out what icon sizes would be most appreciated by the
+window manager under which the application is running.
+The application
+should then use
+.ZN XSetWMHints
+to supply the window manager with an icon pixmap or window in one of the
+supported sizes.
+To free the data allocated in size_list_return, use
+.ZN XFree .
+.LP
+.ZN XGetIconSizes
+can generate a
+.ZN BadWindow
+error.
+.SH PROPERTIES
+.TP 1i
+\s-1WM_ICON_SIZES\s+1
+The window manager may set this property on the root window to
+specify the icon sizes it supports.
+The C type of this property is 
+.ZN XIconSize .
+.SH STRUCTURES
+The
+.ZN XIconSize
+structure contains:
+.LP
+.IN "XIconSize" "" "@DEF@"
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+typedef struct {
+       int min_width, min_height;
+       int max_width, max_height;
+       int width_inc, height_inc;
+} XIconSize;
+.De
+.LP
+The width_inc and height_inc members define an arithmetic progression of
+sizes (minimum to maximum) that represent the supported icon sizes.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XAllocClassHint(__libmansuffix__),
+XAllocSizeHints(__libmansuffix__),
+XAllocWMHints(__libmansuffix__),
+XFree(__libmansuffix__),
+XSetCommand(__libmansuffix__),
+XSetTransientForHint(__libmansuffix__),
+XSetTextProperty(__libmansuffix__),
+XSetWMClientMachine(__libmansuffix__),
+XSetWMColormapWindows(__libmansuffix__),
+XSetWMIconName(__libmansuffix__),
+XSetWMName(__libmansuffix__),
+XSetWMProperties(__libmansuffix__),
+XSetWMProtocols(__libmansuffix__),
+XStringListToTextProperty(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XAllocNamedColor.man b/man/XAllocNamedColor.man
new file mode 100644 (file)
index 0000000..5d64d87
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAllocColor.__libmansuffix__
diff --git a/man/XAllocSizeHints.man b/man/XAllocSizeHints.man
new file mode 100644 (file)
index 0000000..838d497
--- /dev/null
@@ -0,0 +1,502 @@
+'\" t
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface, \fRO'Reilly and Associates, 
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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
+'\" t
+.TH XAllocSizeHints __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XAllocSizeHints, XSetWMNormalHints, XGetWMNormalHints, XSetWMSizeHints, XGetWMSizeHints, XSizeHints \- allocate size hints structure and set or read a window's WM_NORMAL_HINTS property
+.SH SYNTAX
+.HP
+XSizeHints *XAllocSizeHints\^(void\^);
+.HP
+void XSetWMNormalHints\^(\^Display *\fIdisplay\fP, Window \fIw\fP, XSizeHints *\fIhints\fP\^);
+.HP
+Status XGetWMNormalHints\^(\^Display *\fIdisplay\fP, Window \fIw\fP,
+XSizeHints *\fIhints_return\fP, long *\fIsupplied_return\fP\^);
+.HP
+void XSetWMSizeHints\^(\^Display *\fIdisplay\fP, Window \fIw\fP, XSizeHints
+*\fIhints\fP, Atom \fIproperty\fP\^);
+.HP
+Status XGetWMSizeHints\^(\^Display *\fIdisplay\fP, Window \fIw\fP, XSizeHints
+*\fIhints_return\fP, long *\fIsupplied_return\fP, Atom \fIproperty\fP\^);
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIhints\fP 1i
+Specifies the size hints for the window in its normal state.
+.IP \fIhints\fP 1i
+Specifies the
+.ZN XSizeHints
+structure to be used.
+.IP \fIhints_return\fP 1i
+Returns the size hints for the window in its normal state.
+.IP \fIproperty\fP 1i
+Specifies the property name.
+.IP \fIsupplied_return\fP 1i
+Returns the hints that were supplied by the user.
+.IP \fIw\fP 1i
+Specifies the window.
+.SH DESCRIPTION
+The
+.ZN XAllocSizeHints
+function allocates and returns a pointer to a
+.ZN XSizeHints
+structure.
+Note that all fields in the
+.ZN XSizeHints
+structure are initially set to zero.
+If insufficient memory is available, 
+.ZN XAllocSizeHints
+returns NULL.
+To free the memory allocated to this structure,
+use
+.ZN XFree .
+.LP
+The 
+.ZN XSetWMNormalHints 
+function replaces the size hints for the WM_NORMAL_HINTS property 
+on the specified window.
+If the property does not already exist,
+.ZN XSetWMNormalHints
+sets the size hints for the WM_NORMAL_HINTS property on the specified window.
+The property is stored with a type of WM_SIZE_HINTS and a format of 32.
+.LP
+.ZN XSetWMNormalHints
+can generate
+.ZN BadAlloc
+and
+.ZN BadWindow
+errors.
+.LP
+The 
+.ZN XGetWMNormalHints 
+function returns the size hints stored in the WM_NORMAL_HINTS property 
+on the specified window.
+If the property is of type WM_SIZE_HINTS, is of format 32,
+and is long enough to contain either an old (pre-ICCCM) 
+or new size hints structure, 
+.ZN XGetWMNormalHints
+sets the various fields of the 
+.ZN XSizeHints
+structure, sets the supplied_return argument to the list of fields 
+that were supplied by the user (whether or not they contained defined values),
+and returns a nonzero status.
+Otherwise, it returns a zero status.
+.LP
+If 
+.ZN XGetWMNormalHints
+returns successfully and a pre-ICCCM size hints property is read, 
+the supplied_return argument will contain the following bits:
+.LP
+.Ds
+(USPosition|USSize|PPosition|PSize|PMinSize|
+ PMaxSize|PResizeInc|PAspect)
+.De
+.LP
+If the property is large enough to contain the base size 
+and window gravity fields as well, 
+the supplied_return argument will also contain the following bits:
+.LP
+.Ds
+PBaseSize|PWinGravity
+.De
+.LP
+.ZN XGetWMNormalHints
+can generate a
+PN BadWindow
+error.
+.LP
+The 
+.ZN XSetWMSizeHints 
+function replaces the size hints for the specified property 
+on the named window.
+If the specified property does not already exist,
+.ZN XSetWMSizeHints
+sets the size hints for the specified property
+on the named window.
+The property is stored with a type of WM_SIZE_HINTS and a format of 32.
+To set a window's normal size hints, 
+you can use the 
+.ZN XSetWMNormalHints
+function.
+.LP
+.ZN XSetWMSizeHints
+can generate
+.ZN BadAlloc ,
+.ZN BadAtom ,
+and
+.ZN BadWindow
+errors.
+.LP
+The 
+.ZN XGetWMSizeHints
+function returns the size hints stored in the specified property 
+on the named window.
+If the property is of type WM_SIZE_HINTS, is of format 32, 
+and is long enough to contain either an old (pre-ICCCM) 
+or new size hints structure, 
+.ZN XGetWMSizeHints
+sets the various fields of the 
+.ZN XSizeHints
+structure, sets the supplied_return argument to the
+list of fields that were supplied by the user 
+(whether or not they contained defined values), 
+and returns a nonzero status.
+Otherwise, it returns a zero status.
+To get a window's normal size hints, 
+you can use the 
+.ZN XGetWMNormalHints 
+function.
+.LP
+If 
+.ZN XGetWMSizeHints
+returns successfully and a pre-ICCCM size hints property is read, 
+the supplied_return argument will contain the following bits:
+.LP
+.Ds
+(USPosition|USSize|PPosition|PSize|PMinSize|
+ PMaxSize|PResizeInc|PAspect)
+.De
+.LP
+If the property is large enough to contain the base size 
+and window gravity fields as well, 
+the supplied_return argument will also contain the following bits:
+.LP
+.Ds
+PBaseSize|PWinGravity
+.De
+.LP
+.ZN XGetWMSizeHints
+can generate
+.ZN BadAtom
+and
+.ZN BadWindow
+errors.
+.SH PROPERTIES
+.TP 1i
+\s-1WM_NORMAL_HINTS\s+1
+Size hints for a window in its normal state.
+The C type of this property is
+.ZN XSizeHints .
+.SH STRUCTURES
+The
+.ZN XSizeHints
+structure contains:
+.LP
+/\&* Size hints mask bits */
+.TS
+lw(.5i) lw(1.1i) lw(1.5i) lw(3.1i).
+T{
+\&#define
+T}     T{
+.ZN USPosition
+T}     T{
+(1L << 0)
+T}     T{
+/\&* user specified x, y */
+T}
+T{
+\&#define
+T}     T{
+.ZN USSize
+T}     T{
+(1L << 1)
+T}     T{
+/\&* user specified width, height */
+T}
+T{
+\&#define
+T}     T{
+.ZN PPosition
+T}     T{
+(1L << 2)
+T}     T{
+/\&* program specified position */
+T}
+T{
+\&#define
+T}     T{
+.ZN PSize
+T}     T{
+(1L << 3)
+T}     T{
+/\&* program specified size */
+T}
+T{
+\&#define
+T}     T{
+.ZN PMinSize
+T}     T{
+(1L << 4)
+T}     T{
+/\&* program specified minimum size */
+T}
+T{
+\&#define
+T}     T{
+.ZN PMaxSize
+T}     T{
+(1L << 5)
+T}     T{
+/\&* program specified maximum size */
+T}
+T{
+\&#define
+T}     T{
+.ZN PResizeInc
+T}     T{
+(1L << 6)
+T}     T{
+/\&* program specified resize increments */
+T}
+T{
+\&#define
+T}     T{
+.ZN PAspect
+T}     T{
+(1L << 7)
+T}     T{
+/\&* program specified min and max aspect ratios */
+T}
+T{
+\&#define
+T}     T{
+.ZN PBaseSize
+T}     T{
+(1L << 8)
+T}
+T{
+\&#define
+T}     T{
+.ZN PWinGravity
+T}     T{
+(1L << 9)
+T}
+T{
+\&#define
+T}     T{
+.ZN PAllHints
+T}     T{
+(PPosition|PSize|
+.br
+PMinSize|PMaxSize|
+.br
+PResizeInc|PAspect)
+T}     T{
+T}
+.TE
+.IN "XSizeHints" "" "@DEF@"
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+/\&* Values */
+
+typedef struct {
+       long flags;     /\&* marks which fields in this structure are defined */
+       int x, y;       /\&* Obsolete */
+       int width, height;      /\&* Obsolete */
+       int min_width, min_height;
+       int max_width, max_height;
+       int width_inc, height_inc;
+       struct {
+              int x;   /\&* numerator */
+              int y;   /\&* denominator */
+       } min_aspect, max_aspect;
+       int base_width, base_height;
+       int win_gravity;
+       /\&* this structure may be extended in the future */
+} XSizeHints;
+.De
+.LP
+The x, y, width, and height members are now obsolete
+and are left solely for compatibility reasons.
+The min_width and min_height members specify the
+minimum window size that still allows the application to be useful.
+The max_width and max_height members specify the maximum window size.
+The width_inc and height_inc members define an arithmetic progression of
+sizes (minimum to maximum) into which the window prefers to be resized.
+The min_aspect and max_aspect members are expressed
+as ratios of x and y, 
+and they allow an application to specify the range of aspect
+ratios it prefers.
+The base_width and base_height members define the desired size of the window.
+The window manager will interpret the position of the window 
+and its border width to position the point of the outer rectangle 
+of the overall window specified by the win_gravity member.
+The outer rectangle of the window includes any borders or decorations
+supplied by the window manager.
+In other words,
+if the window manager decides to place the window where the client asked,
+the position on the parent window's border named by the win_gravity 
+will be placed where the client window would have been placed 
+in the absence of a window manager.
+.LP
+Note that use of the
+.ZN PAllHints
+macro is highly discouraged.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadAtom
+A value for an Atom argument does not name a defined Atom.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XAllocClassHint(__libmansuffix__),
+XAllocIconSize(__libmansuffix__),
+XAllocWMHints(__libmansuffix__),
+XFree(__libmansuffix__),
+XSetCommand(__libmansuffix__),
+XSetTransientForHint(__libmansuffix__),
+XSetTextProperty(__libmansuffix__),
+XSetWMClientMachine(__libmansuffix__),
+XSetWMColormapWindows(__libmansuffix__),
+XSetWMIconName(__libmansuffix__),
+XSetWMName(__libmansuffix__),
+XSetWMProperties(__libmansuffix__),
+XSetWMProtocols(__libmansuffix__),
+XStringListToTextProperty(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XAllocStandardColormap.man b/man/XAllocStandardColormap.man
new file mode 100644 (file)
index 0000000..813e893
--- /dev/null
@@ -0,0 +1,405 @@
+'\" t
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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
+'\" t
+.TH XAllocStandardColormap __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XAllocStandardColormap, XSetRGBColormaps, XGetRGBColormaps, XStandardColormap \- allocate, set, or read a standard colormap structure
+.SH SYNTAX
+.HP
+XStandardColormap *XAllocStandardColormap\^(void\^);
+.HP
+void XSetRGBColormaps\^(\^Display *\fIdisplay\fP, Window \fIw\fP,
+XStandardColormap *\fIstd_colormap\fP,
+int \fIcount\fP, Atom \fIproperty\fP\^);
+.HP
+Status XGetRGBColormaps\^(\^Display *\fIdisplay\fP, Window \fIw\fP,
+XStandardColormap **\fIstd_colormap_return\fP, int *\fIcount_return\fP,
+Atom \fIproperty\fP\^);
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.ds Cn colormaps
+.IP \fIcount\fP 1i
+Specifies the number of \*(Cn.
+.ds Cn colormaps
+.IP \fIcount_return\fP 1i
+Returns the number of \*(Cn.
+.IP \fIproperty\fP 1i
+Specifies the property name.
+.IP \fIstd_colormap\fP 1i
+Specifies the
+.ZN XStandardColormap
+structure to be used.
+.IP \fIstd_colormap_return\fP 1i
+Returns the
+.ZN XStandardColormap
+structure.
+.SH DESCRIPTION
+The
+.ZN XAllocStandardColormap
+function allocates and returns a pointer to a
+.ZN XStandardColormap
+structure.
+Note that all fields in the
+.ZN XStandardColormap
+structure are initially set to zero.
+If insufficient memory is available, 
+.ZN XAllocStandardColormap
+returns NULL.
+To free the memory allocated to this structure,
+use
+.ZN XFree .
+.LP
+The 
+.ZN XSetRGBColormaps 
+function replaces the RGB colormap definition in the specified property 
+on the named window.
+If the property does not already exist,
+.ZN XSetRGBColormaps
+sets the RGB colormap definition in the specified property
+on the named window.
+The property is stored with a type of RGB_COLOR_MAP and a format of 32.
+Note that it is the caller's responsibility to honor the ICCCM
+restriction that only RGB_DEFAULT_MAP contain more than one definition.
+.LP
+The
+.ZN XSetRGBColormaps
+function usually is only used by window or session managers.
+To create a standard colormap, 
+follow this procedure:
+.IP 1. 5
+Open a new connection to the same server.
+.IP 2. 5
+Grab the server.
+.IP 3. 5
+See if the property is on the property list of the root window for the screen.
+.IP 4. 5
+If the desired property is not present:
+.RS
+.IP \(bu 5
+Create a colormap (unless you are using the default colormap of the screen).
+.IP \(bu 5
+Determine the color characteristics of the visual.
+.IP \(bu 5
+Allocate cells in the colormap (or create it with
+.ZN AllocAll ).
+.IP \(bu 5
+Call 
+.ZN XStoreColors
+to store appropriate color values in the colormap.
+.IP \(bu 5
+Fill in the descriptive members in the 
+.ZN XStandardColormap
+structure.
+.IP \(bu 5
+Attach the property to the root window.
+.IP \(bu 5
+Use
+.ZN XSetCloseDownMode
+to make the resource permanent.
+.RE
+.IP 5. 5
+Ungrab the server.
+.LP
+.ZN XSetRGBColormaps
+can generate
+.ZN BadAlloc ,
+.ZN BadAtom ,
+and
+.ZN BadWindow
+errors.
+.LP
+The 
+.ZN XGetRGBColormaps
+function returns the RGB colormap definitions stored 
+in the specified property on the named window.
+If the property exists, is of type RGB_COLOR_MAP, is of format 32, 
+and is long enough to contain a colormap definition,
+.ZN XGetRGBColormaps
+allocates and fills in space for the returned colormaps
+and returns a nonzero status.
+If the visualid is not present, 
+.ZN XGetRGBColormaps 
+assumes the default visual for the screen on which the window is located; 
+if the killid is not present, 
+.ZN None
+is assumed, which indicates that the resources cannot be released.
+Otherwise, 
+none of the fields are set, and 
+.ZN XGetRGBColormaps
+returns a zero status.
+Note that it is the caller's responsibility to honor the ICCCM
+restriction that only RGB_DEFAULT_MAP contain more than one definition.
+.LP
+.ZN XGetRGBColormaps
+can generate
+.ZN BadAtom
+and
+.ZN BadWindow
+errors.
+.SH STRUCTURES
+The
+.ZN XStandardColormap
+structure contains:
+.LP
+/\&* Hints */
+.TS
+lw(.5i) lw(2i) lw(1i).
+T{
+\&#define
+T}     T{
+.ZN ReleaseByFreeingColormap
+T}     T{
+( (XID) 1L)
+T}
+.TE
+/\&* Values */
+.IN "XStandardColormap" "" "@DEF@"
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+typedef struct {
+       Colormap colormap;
+       unsigned long red_max;
+       unsigned long red_mult;
+       unsigned long green_max;
+       unsigned long green_mult;
+       unsigned long blue_max;
+       unsigned long blue_mult;
+       unsigned long base_pixel;
+       VisualID visualid;
+       XID killid;
+} XStandardColormap;
+.De
+.LP
+The colormap member is the colormap created by the
+.ZN XCreateColormap
+function.
+The red_max, green_max, and blue_max members give the maximum
+red, green, and blue values, respectively.  
+Each color coefficient ranges from zero to its max, inclusive.  
+For example,
+a common colormap allocation is 3/3/2 (3 planes for red, 3
+planes for green, and 2 planes for blue).  
+This colormap would have red_max = 7, green_max = 7, 
+and blue_max = 3.  
+An alternate allocation that uses only 216 colors is red_max = 5, 
+green_max = 5, and blue_max = 5.
+.LP
+The red_mult, green_mult, and blue_mult members give the
+scale factors used to compose a full pixel value. 
+(See the discussion of the base_pixel members for further information.)
+For a 3/3/2 allocation, red_mult might be 32,
+green_mult might be 4, and blue_mult might be 1.  
+For a 6-colors-each allocation, red_mult might be 36, 
+green_mult might be 6, and blue_mult might be 1.
+.LP
+The base_pixel member gives the base pixel value used to
+compose a full pixel value.  
+Usually, the base_pixel is obtained from a call to the 
+.ZN XAllocColorPlanes
+function.  
+Given integer red, green, and blue coefficients in their appropriate 
+ranges, one then can compute a corresponding pixel value by
+using the following expression:
+.LP
+.Ds
+.TA .5i 1.5i
+.ta .5i 1.5i
+(r * red_mult + g * green_mult + b * blue_mult + base_pixel) & 0xFFFFFFFF
+.De
+.LP
+For 
+.ZN GrayScale
+colormaps, 
+only the colormap, red_max, red_mult, 
+and base_pixel members are defined. 
+The other members are ignored.  
+To compute a 
+.ZN GrayScale 
+pixel value, use the following expression:
+.LP
+.Ds
+.TA .5i 1.5i
+.ta .5i 1.5i
+(gray * red_mult + base_pixel) & 0xFFFFFFFF
+.De
+.LP
+Negative multipliers can be represented by converting the 2's
+complement representation of the multiplier into an unsigned long and
+storing the result in the appropriate _mult field.
+The step of masking by 0xFFFFFFFF effectively converts the resulting
+positive multiplier into a negative one.
+The masking step will take place automatically on many machine architectures,
+depending on the size of the integer type used to do the computation,
+.LP
+The visualid member gives the ID number of the visual from which the
+colormap was created.
+The killid member gives a resource ID that indicates whether
+the cells held by this standard colormap are to be released 
+by freeing the colormap ID or by calling the
+.ZN XKillClient
+function on the indicated resource.
+(Note that this method is necessary for allocating out of an existing colormap.)
+.LP
+The properties containing the 
+.ZN XStandardColormap 
+information have 
+the type RGB_COLOR_MAP.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadAtom
+A value for an Atom argument does not name a defined Atom.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XAllocColor(__libmansuffix__),
+XCreateColormap(__libmansuffix__),
+XFree(__libmansuffix__),
+XSetCloseDownMode(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XAllocWMHints.man b/man/XAllocWMHints.man
new file mode 100644 (file)
index 0000000..5b402fe
--- /dev/null
@@ -0,0 +1,416 @@
+'\" t
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface, \fRO'Reilly and Associates, Sebastopol, 1991. 
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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
+'\" t
+.TH XAllocWMHints __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XAllocWMHints, XSetWMHints, XGetWMHints, XWMHints \- allocate window manager hints structure and set or read a window's WM_HINTS property
+.SH SYNTAX
+.HP
+XWMHints *XAllocWMHints\^(void\^); 
+.HP
+int XSetWMHints\^(\^Display *\fIdisplay\fP, Window \fIw\fP, XWMHints *\fIwmhints\fP\^);
+.HP
+XWMHints *XGetWMHints\^(\^Display *\fIdisplay\fP, Window \fIw\fP\^);
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIw\fP 1i
+Specifies the window.
+.IP \fIwmhints\fP 1i
+Specifies the 
+.ZN XWMHints
+structure to be used.
+.SH DESCRIPTION
+The
+.ZN XAllocWMHints
+function allocates and returns a pointer to a
+.ZN XWMHints
+structure.
+Note that all fields in the
+.ZN XWMHints
+structure are initially set to zero.
+If insufficient memory is available, 
+.ZN XAllocWMHints
+returns NULL.
+To free the memory allocated to this structure,
+use
+.ZN XFree .
+.LP
+The
+.ZN XSetWMHints
+function sets the window manager hints that include icon information and location,
+the initial state of the window, and whether the application relies on the
+window manager to get keyboard input.
+.LP
+.ZN XSetWMHints
+can generate
+.ZN BadAlloc
+and
+.ZN BadWindow
+errors.
+.LP
+The
+.ZN XGetWMHints
+function reads the window manager hints and 
+returns NULL if no WM_HINTS property was set on the window 
+or returns a pointer to a 
+.ZN XWMHints 
+structure if it succeeds.
+When finished with the data,
+free the space used for it by calling
+.ZN XFree .
+.LP
+.ZN XGetWMHints
+can generate a
+.ZN BadWindow
+error.
+.SH PROPERTIES
+.TP 1i
+\s-1WM_HINTS\s+1
+Additional hints set by the client for use by the window manager.
+The C type of this property is 
+.ZN XWMHints .
+.SH STRUCTURES
+The
+.ZN XWMHints
+structure contains:
+.LP
+/\&* Window manager hints mask bits */
+.TS
+lw(.5i) lw(2.5i) lw(2.5i).
+T{
+\&#define
+T}     T{
+.ZN InputHint
+T}     T{
+(1L << 0)
+T}
+T{
+\&#define
+T}     T{
+.ZN StateHint
+T}     T{
+(1L << 1)
+T}
+T{
+\&#define
+T}     T{
+.ZN IconPixmapHint
+T}     T{
+(1L << 2)
+T}
+T{
+\&#define
+T}     T{
+.ZN IconWindowHint
+T}     T{
+(1L << 3)
+T}
+T{
+\&#define
+T}     T{
+.ZN IconPositionHint
+T}     T{
+(1L << 4)
+T}
+T{
+\&#define
+T}     T{
+.ZN IconMaskHint
+T}     T{
+(1L << 5)
+T}
+T{
+\&#define
+T}     T{
+.ZN WindowGroupHint
+T}     T{
+(1L << 6)
+T}
+T{
+\&#define
+T}     T{
+.ZN XUrgencyHint
+T}     T{
+(1L << 8)
+T}
+T{
+\&#define
+T}     T{
+.ZN AllHints
+T}     T{
+(InputHint|StateHint|IconPixmapHint|
+.br
+IconWindowHint|IconPositionHint|
+.br
+IconMaskHint|WindowGroupHint)
+T}
+.TE
+.IN "XWMHints" "" "@DEF@"
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+/\&* Values */
+
+typedef struct {
+       long flags;     /\&* marks which fields in this structure are defined */
+       Bool input;     /\&* does this application rely on the window manager to
+                       get keyboard input? */
+       int initial_state;      /\&* see below */
+       Pixmap icon_pixmap;     /\&* pixmap to be used as icon */
+       Window icon_window;     /\&* window to be used as icon */
+       int icon_x, icon_y;     /\&* initial position of icon */
+       Pixmap icon_mask;       /\&* pixmap to be used as mask for icon_pixmap */
+       XID window_group;       /\&* id of related window group */
+       /\&* this structure may be extended in the future */
+} XWMHints;
+.De
+.LP
+The input member is used to communicate to the window manager the input focus
+model used by the application.
+Applications that expect input but never explicitly set focus to any 
+of their subwindows (that is, use the push model of focus management), 
+such as X Version 10 style applications that use real-estate
+driven focus, should set this member to 
+.ZN True .  
+Similarly, applications
+that set input focus to their subwindows only when it is given to their
+top-level window by a window manager should also set this member to 
+.ZN True .
+Applications that manage their own input focus by explicitly setting
+focus to one of their subwindows whenever they want keyboard input 
+(that is, use the pull model of focus management) should set this member to 
+.ZN False .
+Applications that never expect any keyboard input also should set this member
+to 
+.ZN False .
+.LP
+Pull model window managers should make it possible for push model
+applications to get input by setting input focus to the top-level windows of
+applications whose input member is 
+.ZN True .  
+Push model window managers should
+make sure that pull model applications do not break them 
+by resetting input focus to 
+.ZN PointerRoot 
+when it is appropriate (for example, whenever an application whose
+input member is 
+.ZN False 
+sets input focus to one of its subwindows).
+.LP
+The definitions for the initial_state flag are:
+.TS
+lw(.5i) lw(2i) lw(.2i) lw(2.8i).
+T{
+\&#define
+T}     T{
+.ZN WithdrawnState
+T}     T{
+0
+T}     T{
+T}
+T{
+\&#define
+T}     T{
+.ZN NormalState
+T}     T{
+1
+T}     T{
+/\&* most applications start this way */
+T}
+T{
+\&#define
+T}     T{
+.ZN IconicState
+T}     T{
+3
+T}     T{
+/\&* application wants to start as an icon */
+T}
+.TE
+The icon_mask specifies which pixels of the icon_pixmap should be used as the
+icon.  
+This allows for nonrectangular icons.
+Both icon_pixmap and icon_mask must be bitmaps.
+The icon_window lets an application provide a window for use as an icon
+for window managers that support such use.
+The window_group lets you specify that this window belongs to a group
+of other windows.
+For example, if a single application manipulates multiple 
+top-level windows, this allows you to provide enough
+information that a window manager can iconify all of the windows
+rather than just the one window.
+.LP
+The
+.ZN UrgencyHint
+flag, if set in the flags field, indicates that the client deems the window
+contents to be urgent, requiring the timely response of the user.  The
+window manager will make some effort to draw the user's attention to this
+window while this flag is set.  The client must provide some means by which the
+user can cause the urgency flag to be cleared (either mitigating
+the condition that made the window urgent or merely shutting off the alarm)
+or the window to be withdrawn.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XAllocClassHint(__libmansuffix__),
+XAllocIconSize(__libmansuffix__),
+XAllocSizeHints(__libmansuffix__),
+XFree(__libmansuffix__),
+XSetCommand(__libmansuffix__),
+XSetTransientForHint(__libmansuffix__),
+XSetTextProperty(__libmansuffix__),
+XSetWMClientMachine(__libmansuffix__),
+XSetWMColormapWindows(__libmansuffix__),
+XSetWMIconName(__libmansuffix__),
+XSetWMName(__libmansuffix__),
+XSetWMProperties(__libmansuffix__),
+XSetWMProtocols(__libmansuffix__),
+XStringListToTextProperty(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XAllowEvents.man b/man/XAllowEvents.man
new file mode 100644 (file)
index 0000000..cb95e8a
--- /dev/null
@@ -0,0 +1,189 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XAllowEvents __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XAllowEvents \- release queued events
+.SH SYNTAX
+.HP
+int XAllowEvents\^(\^Display *\fIdisplay\fP, int \fIevent_mode\fP\^,
+Time \fItime\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIevent_mode\fP 1i
+Specifies the event mode.
+You can pass 
+.ZN AsyncPointer , 
+.ZN SyncPointer , 
+.ZN AsyncKeyboard , 
+.ZN SyncKeyboard ,
+.ZN ReplayPointer , 
+.ZN ReplayKeyboard ,
+.ZN AsyncBoth ,
+or
+.ZN SyncBoth .
+.IP \fItime\fP 1i
+Specifies the time.
+You can pass either a timestamp or
+.ZN CurrentTime .
+.SH DESCRIPTION
+The
+.ZN XAllowEvents
+function releases some queued events if the client has caused a device 
+to freeze.
+It has no effect if the specified time is earlier than the last-grab
+time of the most recent active grab for the client or if the specified time
+is later than the current X server time.
+.LP
+.ZN XAllowEvents
+can generate a
+.ZN BadValue 
+error.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.SH "SEE ALSO"
+\fI\*(xL\fP
diff --git a/man/XAnyEvent.man b/man/XAnyEvent.man
new file mode 100644 (file)
index 0000000..af35218
--- /dev/null
@@ -0,0 +1,271 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XAnyEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XAnyEvent, XEvent \- generic X event structures
+.SH STRUCTURES
+All the event structures declared in 
+.Pn < X11/Xlib.h >
+have the following common members:
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int type;
+       unsigned long serial;   /\&* # of last request processed by server */
+       Bool send_event;        /\&* true if this came from a SendEvent request */
+       Display *display;       /\&* Display the event was read from */
+       Window window;
+} XAnyEvent;
+.De
+.LP
+The type member is set to the event type constant name that uniquely identifies
+it.
+For example, when the X server reports a
+.ZN GraphicsExpose
+event to a client application, it sends an
+.ZN XGraphicsExposeEvent
+structure with the type member set to
+.ZN GraphicsExpose .
+The display member is set to a pointer to the display the event was read on.
+The send_event member is set to
+.ZN True
+if the event came from a
+.ZN SendEvent
+protocol request.
+The serial member is set from the serial number reported in the protocol
+but expanded from the 16-bit least-significant bits to a full 32-bit value.
+The window member is set to the window that is most useful to toolkit
+dispatchers.
+.LP
+The
+.ZN XEvent
+structure is a union of the individual structures declared for each event type:
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef union _XEvent {
+       int type;       /\&* must not be changed */
+       XAnyEvent xany;
+       XKeyEvent xkey;
+       XButtonEvent xbutton;
+       XMotionEvent xmotion;
+       XCrossingEvent xcrossing;
+       XFocusChangeEvent xfocus;
+       XExposeEvent xexpose;
+       XGraphicsExposeEvent xgraphicsexpose;
+       XNoExposeEvent xnoexpose;
+       XVisibilityEvent xvisibility;
+       XCreateWindowEvent xcreatewindow;
+       XDestroyWindowEvent xdestroywindow;
+       XUnmapEvent xunmap;
+       XMapEvent xmap;
+       XMapRequestEvent xmaprequest;
+       XReparentEvent xreparent;
+       XConfigureEvent xconfigure;
+       XGravityEvent xgravity;
+       XResizeRequestEvent xresizerequest;
+       XConfigureRequestEvent xconfigurerequest;
+       XCirculateEvent xcirculate;
+       XCirculateRequestEvent xcirculaterequest;
+       XPropertyEvent xproperty;
+       XSelectionClearEvent xselectionclear;
+       XSelectionRequestEvent xselectionrequest;
+       XSelectionEvent xselection;
+       XColormapEvent xcolormap;
+       XClientMessageEvent xclient;
+       XMappingEvent xmapping;
+       XErrorEvent xerror;
+       XKeymapEvent xkeymap;
+       long pad[24];
+} XEvent;
+.De
+.LP
+An
+.ZN XEvent
+structure's first entry always is the type member,
+which is set to the event type.
+The second member always is the serial number of the protocol request
+that generated the event.
+The third member always is send_event,
+which is a
+.ZN Bool
+that indicates if the event was sent by a different client.
+The fourth member always is a display,
+which is the display that the event was read from.
+Except for keymap events,
+the fifth member always is a window,
+which has been carefully selected to be useful to toolkit dispatchers.
+To avoid breaking toolkits,
+the order of these first five entries is not to change.
+Most events also contain a time member,
+which is the time at which an event occurred.
+In addition, a pointer to the generic event must be cast before it
+is used to access any other information in the structure.
+.SH "SEE ALSO"
+XButtonEvent(__libmansuffix__),
+XCreateWindowEvent(__libmansuffix__),
+XCirculateEvent(__libmansuffix__),
+XCirculateRequestEvent(__libmansuffix__),
+XColormapEvent(__libmansuffix__),
+XConfigureEvent(__libmansuffix__),
+XConfigureRequestEvent(__libmansuffix__),
+XCrossingEvent(__libmansuffix__),
+XDestroyWindowEvent(__libmansuffix__),
+XErrorEvent(__libmansuffix__),
+XExposeEvent(__libmansuffix__),
+XFocusChangeEvent(__libmansuffix__),
+XGraphicsExposeEvent(__libmansuffix__),
+XGravityEvent(__libmansuffix__),
+XKeymapEvent(__libmansuffix__),
+XMapEvent(__libmansuffix__),
+XMapRequestEvent(__libmansuffix__),
+XPropertyEvent(__libmansuffix__),
+XReparentEvent(__libmansuffix__),
+XResizeRequestEvent(__libmansuffix__),
+XSelectionClearEvent(__libmansuffix__),
+XSelectionEvent(__libmansuffix__),
+XSelectionRequestEvent(__libmansuffix__),
+XUnmapEvent(__libmansuffix__),
+XVisibilityEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XArc.man b/man/XArc.man
new file mode 100644 (file)
index 0000000..30b9b85
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XDrawArc.__libmansuffix__
diff --git a/man/XAutoRepeatOff.man b/man/XAutoRepeatOff.man
new file mode 100644 (file)
index 0000000..4434d01
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XChangeKeyboardControl.__libmansuffix__
diff --git a/man/XAutoRepeatOn.man b/man/XAutoRepeatOn.man
new file mode 100644 (file)
index 0000000..4434d01
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XChangeKeyboardControl.__libmansuffix__
diff --git a/man/XBaseFontNameListOfFontSet.man b/man/XBaseFontNameListOfFontSet.man
new file mode 100644 (file)
index 0000000..ba0cd76
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XFontsOfFontSet.__libmansuffix__
diff --git a/man/XBell.man b/man/XBell.man
new file mode 100644 (file)
index 0000000..4434d01
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XChangeKeyboardControl.__libmansuffix__
diff --git a/man/XButtonEvent.man b/man/XButtonEvent.man
new file mode 100644 (file)
index 0000000..607897f
--- /dev/null
@@ -0,0 +1,355 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XButtonEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XButtonEvent, XKeyEvent, XMotionEvent \- KeyPress, KeyRelease, ButtonPress, ButtonRelease, and MotionNotify event structures
+.SH STRUCTURES
+The structures for
+.ZN KeyPress ,
+.ZN KeyRelease ,
+.ZN ButtonPress ,
+.ZN ButtonRelease ,
+and
+.ZN MotionNotify
+events contain:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int type;       /\&* ButtonPress or ButtonRelease */
+       unsigned long serial;   /\&* # of last request processed by server */
+       Bool send_event;        /\&* true if this came from a SendEvent request */
+       Display *display;       /\&* Display the event was read from */
+       Window window;  /\&* ``event'' window it is reported relative to */
+       Window root;    /\&* root window that the event occurred on */
+       Window subwindow;       /\&* child window */
+       Time time;      /\&* milliseconds */
+       int x, y;       /\&* pointer x, y coordinates in event window */
+       int x_root, y_root;     /\&* coordinates relative to root */
+       unsigned int state;     /\&* key or button mask */
+       unsigned int button;    /\&* detail */
+       Bool same_screen;       /\&* same screen flag */
+} XButtonEvent;
+typedef XButtonEvent XButtonPressedEvent;
+typedef XButtonEvent XButtonReleasedEvent;
+.De
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int type;       /\&* KeyPress or KeyRelease */
+       unsigned long serial;   /\&* # of last request processed by server */
+       Bool send_event;        /\&* true if this came from a SendEvent request */
+       Display *display;       /\&* Display the event was read from */
+       Window window;  /\&* ``event'' window it is reported relative to */
+       Window root;    /\&* root window that the event occurred on */
+       Window subwindow;       /\&* child window */
+       Time time;      /\&* milliseconds */
+       int x, y;       /\&* pointer x, y coordinates in event window */
+       int x_root, y_root;     /\&* coordinates relative to root */
+       unsigned int state;     /\&* key or button mask */
+       unsigned int keycode;   /\&* detail */
+       Bool same_screen;       /\&* same screen flag */
+} XKeyEvent;
+typedef XKeyEvent XKeyPressedEvent;
+typedef XKeyEvent XKeyReleasedEvent;
+.De
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int type;       /\&* MotionNotify */
+       unsigned long serial;   /\&* # of last request processed by server */
+       Bool send_event;        /\&* true if this came from a SendEvent request */
+       Display *display;       /\&* Display the event was read from */
+       Window window;  /\&* ``event'' window reported relative to */
+       Window root;    /\&* root window that the event occurred on */
+       Window subwindow;       /\&* child window */
+       Time time;      /\&* milliseconds */
+       int x, y;       /\&* pointer x, y coordinates in event window */
+       int x_root, y_root;     /\&* coordinates relative to root */
+       unsigned int state;     /\&* key or button mask */
+       char is_hint;   /\&* detail */
+       Bool same_screen;       /\&* same screen flag */
+} XMotionEvent;
+typedef XMotionEvent XPointerMovedEvent;
+.De
+.LP
+When you receive these events,
+their structure members are set as follows.
+.LP
+The type member is set to the event type constant name that uniquely identifies
+it.
+For example, when the X server reports a
+.ZN GraphicsExpose
+event to a client application, it sends an
+.ZN XGraphicsExposeEvent
+structure with the type member set to
+.ZN GraphicsExpose .
+The display member is set to a pointer to the display the event was read on.
+The send_event member is set to
+.ZN True
+if the event came from a
+.ZN SendEvent
+protocol request.
+The serial member is set from the serial number reported in the protocol
+but expanded from the 16-bit least-significant bits to a full 32-bit value.
+The window member is set to the window that is most useful to toolkit
+dispatchers.
+.LP
+These structures have the following common members:
+window, root, subwindow, time, x, y, x_root, y_root, state, and same_screen.
+The window member is set to the window on which the
+event was generated and is referred to as the event window. 
+As long as the conditions previously discussed are met,
+this is the window used by the X server to report the event.
+The root member is set to the source window's root window.
+The x_root and y_root members are set to the pointer's coordinates
+relative to the root window's origin at the time of the event.
+.LP
+The same_screen member is set to indicate whether the event 
+window is on the same screen
+as the root window and can be either
+.ZN True 
+or
+.ZN False .
+If
+.ZN True ,
+the event and root windows are on the same screen.
+If
+.ZN False ,
+the event and root windows are not on the same screen.
+.LP
+If the source window is an inferior of the event window, 
+the subwindow member of the structure is set to the child of the event window
+that is the source window or the child of the event window that is
+an ancestor of the source window.
+Otherwise, the X server sets the subwindow member to
+.ZN None .
+The time member is set to the time when the event was generated 
+and is expressed in milliseconds.
+.LP
+If the event window is on the same screen as the root window, 
+the x and y members
+are set to the coordinates relative to the event window's origin.
+Otherwise, these members are set to zero.
+.LP
+The state member is set to indicate the logical state of the pointer buttons 
+and modifier keys just prior to the event,
+which is the bitwise inclusive OR of one or more of the
+button or modifier key masks:
+.ZN Button1Mask ,
+.ZN Button2Mask ,
+.ZN Button3Mask ,
+.ZN Button4Mask ,
+.ZN Button5Mask ,
+.ZN ShiftMask ,
+.ZN LockMask ,
+.ZN ControlMask ,
+.ZN Mod1Mask ,
+.ZN Mod2Mask ,
+.ZN Mod3Mask ,
+.ZN Mod4Mask ,
+and
+.ZN Mod5Mask .
+.LP
+Each of these structures also has a member that indicates the detail.
+For the
+.ZN XKeyPressedEvent
+and
+.ZN XKeyReleasedEvent
+structures, this member is called a keycode.
+It is set to a number that represents a physical key on the keyboard.
+The keycode is an arbitrary representation for any key on the keyboard
+(see sections 12.7 and 16.1).
+.LP
+For the
+.ZN XButtonPressedEvent
+and
+.ZN XButtonReleasedEvent
+structures, this member is called button.
+It represents the pointer button that changed state and can be the
+.ZN Button1 ,
+.ZN Button2 ,
+.ZN Button3 ,
+.ZN Button4 ,
+or
+.ZN Button5 
+value.
+For the
+.ZN XPointerMovedEvent
+structure, this member is called is_hint.
+It can be set to 
+.ZN NotifyNormal
+or
+.ZN NotifyHint .
+.SH "SEE ALSO"
+XAnyEvent(__libmansuffix__),
+XCreateWindowEvent(__libmansuffix__),
+XCirculateEvent(__libmansuffix__),
+XCirculateRequestEvent(__libmansuffix__),
+XColormapEvent(__libmansuffix__),
+XConfigureEvent(__libmansuffix__),
+XConfigureRequestEvent(__libmansuffix__),
+XCrossingEvent(__libmansuffix__),
+XDestroyWindowEvent(__libmansuffix__),
+XErrorEvent(__libmansuffix__),
+XExposeEvent(__libmansuffix__),
+XFocusChangeEvent(__libmansuffix__),
+XGraphicsExposeEvent(__libmansuffix__),
+XGravityEvent(__libmansuffix__),
+XKeymapEvent(__libmansuffix__),
+XMapEvent(__libmansuffix__),
+XMapRequestEvent(__libmansuffix__),
+XPropertyEvent(__libmansuffix__),
+XReparentEvent(__libmansuffix__),
+XResizeRequestEvent(__libmansuffix__),
+XSelectionClearEvent(__libmansuffix__),
+XSelectionEvent(__libmansuffix__),
+XSelectionRequestEvent(__libmansuffix__),
+XUnmapEvent(__libmansuffix__),
+XVisibilityEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XChangeActivePointerGrab.man b/man/XChangeActivePointerGrab.man
new file mode 100644 (file)
index 0000000..fce3041
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XGrabPointer.__libmansuffix__
diff --git a/man/XChangeGC.man b/man/XChangeGC.man
new file mode 100644 (file)
index 0000000..927a6a9
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XCreateGC.__libmansuffix__
diff --git a/man/XChangeKeyboardControl.man b/man/XChangeKeyboardControl.man
new file mode 100644 (file)
index 0000000..63f9392
--- /dev/null
@@ -0,0 +1,452 @@
+'\" t
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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
+'\" t
+.TH XChangeKeyboardControl __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XChangeKeyboardControl, XGetKeyboardControl, XAutoRepeatOn, XAutoRepeatOff, XBell, XQueryKeymap, XKeyboardControl \- manipulate keyboard settings and keyboard control structure
+.SH SYNTAX
+.HP
+int XChangeKeyboardControl\^(\^Display *\fIdisplay\fP, unsigned long
+\fIvalue_mask\fP\^, XKeyboardControl *\fIvalues\fP\^); 
+.HP
+int XGetKeyboardControl\^(\^Display *\fIdisplay\fP, XKeyboardState
+*\fIvalues_return\fP\^); 
+.HP
+int XAutoRepeatOn\^(\^Display *\fIdisplay\fP\^); 
+.HP
+int XAutoRepeatOff\^(\^Display *\fIdisplay\fP\^); 
+.HP
+int XBell\^(\^Display *\fIdisplay\fP, int \fIpercent\fP\^); 
+.HP
+int XQueryKeymap\^(\^Display *\fIdisplay\fP, char \fIkeys_return\fP[32]\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIkeys_return\fP 1i
+Returns an array of bytes that identifies which keys are pressed down.
+Each bit represents one key of the keyboard.
+.IP \fIpercent\fP 1i
+Specifies the volume for the bell,
+which can range from \-100 to 100 inclusive. 
+.IP \fIvalue_mask\fP 1i
+Specifies which controls to change.
+This mask is the bitwise inclusive OR of the valid control mask bits.
+.IP \fIvalues\fP 1i
+Specifies one value for each bit set to 1 in the mask.
+.IP \fIvalues_return\fP 1i
+Returns the current keyboard controls in the specified
+.ZN XKeyboardState 
+structure.
+.SH DESCRIPTION
+The
+.ZN XChangeKeyboardControl
+function controls the keyboard characteristics defined by the
+.ZN XKeyboardControl
+structure.
+The value_mask argument specifies which values are to be changed.
+.LP
+.ZN XChangeKeyboardControl
+can generate
+.ZN BadMatch
+and
+.ZN BadValue 
+errors.
+.LP
+The
+.ZN XGetKeyboardControl
+function returns the current control values for the keyboard to the
+.ZN XKeyboardState
+structure.
+.LP
+The
+.ZN XAutoRepeatOn
+function turns on auto-repeat for the keyboard on the specified display.
+.LP
+The
+.ZN XAutoRepeatOff
+function turns off auto-repeat for the keyboard on the specified display.
+.LP
+The
+.ZN XBell
+function rings the bell on the keyboard on the specified display, if possible.
+The specified volume is relative to the base volume for the keyboard.
+If the value for the percent argument is not in the range \-100 to 100
+inclusive, a
+.ZN BadValue
+error results.
+The volume at which the bell rings
+when the percent argument is nonnegative is:
+.IP
+base \- [(base * percent) / 100] + percent
+.LP
+The volume at which the bell rings
+when the percent argument is negative is:
+.IP
+base + [(base * percent) / 100]
+.LP
+To change the base volume of the bell, use
+.ZN XChangeKeyboardControl .
+.LP
+.ZN XBell
+can generate a
+.ZN BadValue 
+error.
+.LP
+The
+.ZN XQueryKeymap
+function returns a bit vector for the logical state of the keyboard, 
+where each bit set to 1 indicates that the corresponding key is currently 
+pressed down.
+The vector is represented as 32 bytes.
+Byte N (from 0) contains the bits for keys 8N to 8N + 7 
+with the least significant bit in the byte representing key 8N.
+.LP
+Note that the logical state of a device (as seen by client applications)
+may lag the physical state if device event processing is frozen.
+.SH STRUCTURES
+The
+.ZN XKeyboardControl
+structure contains:
+.LP
+.LP
+/\&* Mask bits for ChangeKeyboardControl */
+.TS
+lw(.5i) lw(2.5i) lw(.8i).
+T{
+\&#define
+T}     T{
+.ZN KBKeyClickPercent
+T}     T{
+(1L<<0)
+T}
+T{
+\&#define
+T}     T{
+.ZN KBBellPercent
+T}     T{
+(1L<<1)
+T}
+T{
+\&#define
+T}     T{
+.ZN KBBellPitch
+T}     T{
+(1L<<2)
+T}
+T{
+\&#define
+T}     T{
+.ZN KBBellDuration
+T}     T{
+(1L<<3)
+T}
+T{
+\&#define
+T}     T{
+.ZN KBLed
+T}     T{
+(1L<<4)
+T}
+T{
+\&#define
+T}     T{
+.ZN KBLedMode
+T}     T{
+(1L<<5)
+T}
+T{
+\&#define
+T}     T{
+.ZN KBKey
+T}     T{
+(1L<<6)
+T}
+T{
+\&#define
+T}     T{
+.ZN KBAutoRepeatMode
+T}     T{
+(1L<<7)
+T}
+.TE
+.IN "XKeyboardControl" "" "@DEF@"
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+/\&* Values */
+
+typedef struct {
+       int key_click_percent;
+       int bell_percent;
+       int bell_pitch;
+       int bell_duration;
+       int led;
+       int led_mode;   /\&* LedModeOn, LedModeOff */
+       int key;
+       int auto_repeat_mode;   /\&* AutoRepeatModeOff, AutoRepeatModeOn, 
+                               AutoRepeatModeDefault */
+} XKeyboardControl;
+.De
+.LP
+The key_click_percent member sets the volume for key clicks between 0 (off) 
+and 100 (loud) inclusive, if possible.  
+A setting of \-1 restores the default.
+Other negative values generate a
+.ZN BadValue
+error.
+.LP
+The bell_percent sets the base volume for the bell between 0 (off) and 100
+(loud) inclusive, if possible.  
+A setting of \-1 restores the default.
+Other negative values generate a
+.ZN BadValue
+error.
+The bell_pitch member sets the pitch (specified in Hz) of the bell, if possible.
+A setting of \-1 restores the default.
+Other negative values generate a
+.ZN BadValue
+error.
+The bell_duration member sets the duration of the
+bell specified in milliseconds, if possible.  
+A setting of \-1 restores the default.
+Other negative values generate a
+.ZN BadValue
+error.
+.LP
+If both the led_mode and led members are specified,
+the state of that LED is changed, if possible.  
+The led_mode member can be set to
+.ZN LedModeOn
+or
+.ZN LedModeOff .
+If only led_mode is specified, the state of
+all LEDs are changed, if possible.  
+At most 32 LEDs numbered from one are supported. 
+No standard interpretation of LEDs is defined.
+If led is specified without led_mode, a
+.ZN BadMatch
+error results. 
+.LP
+If both the auto_repeat_mode and key members are specified, 
+the auto_repeat_mode of that key is changed (according to
+.ZN AutoRepeatModeOn ,
+.ZN AutoRepeatModeOff ,
+or
+.ZN AutoRepeatModeDefault ),
+if possible.
+If only auto_repeat_mode is
+specified, the global auto_repeat_mode for the entire keyboard is
+changed, if possible, and does not affect the per-key settings.
+If a key is specified without an auto_repeat_mode, a
+.ZN BadMatch
+error results.
+Each key has an individual mode of whether or not it should auto-repeat
+and a default setting for the mode.
+In addition,
+there is a global mode of whether auto-repeat should be enabled or not
+and a default setting for that mode.
+When global mode is
+.ZN AutoRepeatModeOn ,
+keys should obey their individual auto-repeat modes.
+When global mode is
+.ZN AutoRepeatModeOff ,
+no keys should auto-repeat.
+An auto-repeating key generates alternating
+.ZN KeyPress
+and
+.ZN KeyRelease
+events.
+When a key is used as a modifier,
+it is desirable for the key not to auto-repeat,
+regardless of its auto-repeat setting.
+.LP
+The
+.ZN XKeyboardState
+structure contains:
+.LP
+.Ds 0
+.TA .5i 
+.ta .5i
+typedef struct {
+       int key_click_percent;
+       int bell_percent;
+       unsigned int bell_pitch, bell_duration;
+       unsigned long led_mask;
+       int global_auto_repeat;
+       char auto_repeats[32];
+} XKeyboardState;
+.De
+.LP
+For the LEDs, 
+the least significant bit of led_mask corresponds to LED one,
+and each bit set to 1 in led_mask indicates an LED that is lit.
+The global_auto_repeat member can be set to
+.ZN AutoRepeatModeOn
+or
+.ZN AutoRepeatModeOff .
+The auto_repeats member is a bit vector.
+Each bit set to 1 indicates that auto-repeat is enabled 
+for the corresponding key.
+The vector is represented as 32 bytes.  
+Byte N (from 0) contains the bits for keys 8N to 8N + 7
+with the least significant bit in the byte representing key 8N.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadMatch
+Some argument or pair of arguments has the correct type and range but fails
+to match in some other way required by the request.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.SH "SEE ALSO"
+XChangeKeyboardMapping(__libmansuffix__),
+XkbChangeEnabledControls(__libmansuffix__),
+XkbBell(__libmansuffix__),
+XkbDeviceBell(__libmansuffix__),
+XkbGetMap(__libmansuffix__),
+XSetPointerMapping(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XChangeKeyboardMapping.man b/man/XChangeKeyboardMapping.man
new file mode 100644 (file)
index 0000000..b964548
--- /dev/null
@@ -0,0 +1,448 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XChangeKeyboardMapping __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XChangeKeyboardMapping, XGetKeyboardMapping, XDisplayKeycodes, XSetModifierMapping, XGetModifierMapping, XNewModifiermap, XInsertModifiermapEntry, XDeleteModifiermapEntry, XFreeModifiermap, XModifierKeymap \- manipulate keyboard encoding and keyboard encoding structure
+.SH SYNTAX
+.HP
+int XChangeKeyboardMapping(\^Display *\fIdisplay\fP, int \fIfirst_keycode\fP,
+int \fIkeysyms_per_keycode\fP, KeySym *\fIkeysyms\fP, int \fInum_codes\fP\^); 
+.HP
+KeySym *XGetKeyboardMapping(\^Display *\fIdisplay\fP, KeyCode
+\fIfirst_keycode\fP, int \fIkeycode_count\fP, int
+*\fIkeysyms_per_keycode_return\fP\^); 
+.HP
+int XDisplayKeycodes\^(\^Display *\fIdisplay\fP\^, int
+*\fImin_keycodes_return\fP\^, int *\fImax_keycodes_return\fP\^); 
+.HP
+int XSetModifierMapping(\^Display *\fIdisplay\fP, XModifierKeymap
+*\fImodmap\fP\^); 
+.HP
+XModifierKeymap *XGetModifierMapping(\^Display *\fIdisplay\fP\^); 
+.HP
+XModifierKeymap *XNewModifiermap(\^int \fImax_keys_per_mod\fP\^); 
+.HP
+XModifierKeymap *XInsertModifiermapEntry\^(\^XModifierKeymap *\fImodmap\fP,
+KeyCode \fIkeycode_entry\fP, int \fImodifier\fP\^); 
+.HP
+XModifierKeymap *XDeleteModifiermapEntry\^(\^XModifierKeymap *\fImodmap\fP,
+KeyCode \fIkeycode_entry\fP, int \fImodifier\fP\^); 
+.HP
+int XFreeModifiermap(\^XModifierKeymap *\fImodmap\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.ds Kc changed or returned
+.IP \fIfirst_keycode\fP 1i
+Specifies the first KeyCode that is to be \*(Kc.
+.IP \fIkeycode_count\fP 1i
+Specifies the number of KeyCodes that are to be returned.
+.IP \fIkeycode_entry\fP 1i
+Specifies the KeyCode. 
+.IP \fIkeysyms\fP 1i
+Specifies an array of KeySyms.
+.IP \fIkeysyms_per_keycode\fP 1i
+Specifies the number of KeySyms per KeyCode.
+.IP \fIkeysyms_per_keycode_return\fP 1i
+Returns the number of KeySyms per KeyCode.
+.IP \fImax_keys_per_mod\fP 1i
+Specifies the number of KeyCode entries preallocated to the modifiers
+in the map.
+.IP \fImax_keycodes_return\fP 1i
+Returns the maximum number of KeyCodes.
+.IP \fImin_keycodes_return\fP 1i
+Returns the minimum number of KeyCodes.
+.IP \fImodifier\fP 1i
+Specifies the modifier.
+.IP \fImodmap\fP 1i
+Specifies the 
+.ZN XModifierKeymap
+structure.
+.IP \fInum_codes\fP 1i
+Specifies the number of KeyCodes that are to be changed.
+.SH DESCRIPTION
+The
+.ZN XChangeKeyboardMapping
+function defines the symbols for the specified number of KeyCodes
+starting with first_keycode.
+The symbols for KeyCodes outside this range remain unchanged.  
+The number of elements in keysyms must be:
+.LP
+.Ds
+num_codes * keysyms_per_keycode
+.De
+.LP
+The specified first_keycode must be greater than or equal to min_keycode 
+returned by
+.ZN XDisplayKeycodes ,
+or a 
+.ZN BadValue 
+error results.
+In addition, the following expression must be less than or equal to 
+max_keycode as returned by
+.ZN XDisplayKeycodes ,
+or a
+.ZN BadValue 
+error results:
+.LP
+.Ds
+first_keycode + num_codes \- 1
+.De
+.LP
+KeySym number N, counting from zero, for KeyCode K has the following index
+in keysyms, counting from zero: 
+.LP
+.Ds 
+(K \- first_keycode) * keysyms_per_keycode + N
+.De
+.LP
+The specified keysyms_per_keycode can be chosen arbitrarily by the client
+to be large enough to hold all desired symbols. 
+A special KeySym value of 
+.ZN NoSymbol 
+should be used to fill in unused elements 
+for individual KeyCodes.  
+It is legal for 
+.ZN NoSymbol 
+to appear in nontrailing positions
+of the effective list for a KeyCode.
+.ZN XChangeKeyboardMapping
+generates a 
+.ZN MappingNotify 
+event.
+.LP
+There is no requirement that the X server interpret this mapping. 
+It is merely stored for reading and writing by clients.
+.LP
+.ZN XChangeKeyboardMapping
+can generate
+.ZN BadAlloc 
+and
+.ZN BadValue 
+errors.
+.LP
+The
+.ZN XGetKeyboardMapping
+function returns the symbols for the specified number of KeyCodes
+starting with first_keycode.
+The value specified in first_keycode must be greater than 
+or equal to min_keycode as returned by
+.ZN XDisplayKeycodes ,
+or a
+.ZN BadValue 
+error results.
+In addition, the following expression must be less than or equal 
+to max_keycode as returned by
+.ZN XDisplayKeycodes :
+.LP
+.Ds 
+first_keycode + keycode_count \- 1
+.De
+.LP
+If this is not the case, a 
+.ZN BadValue 
+error results. 
+The number of elements in the KeySyms list is:
+.LP
+.Ds 
+keycode_count * keysyms_per_keycode_return
+.De
+.LP
+KeySym number N, counting from zero, for KeyCode K has the following index
+in the list, counting from zero: 
+.Ds
+(K \- first_code) * keysyms_per_code_return + N
+.De
+.LP
+The X server arbitrarily chooses the keysyms_per_keycode_return value 
+to be large enough to report all requested symbols. 
+A special KeySym value of 
+.ZN NoSymbol 
+is used to fill in unused elements for
+individual KeyCodes.
+To free the storage returned by 
+.ZN XGetKeyboardMapping ,
+use
+.ZN XFree .
+.LP
+.ZN XGetKeyboardMapping
+can generate a
+.ZN BadValue 
+error.
+.LP
+The
+.ZN XDisplayKeycodes
+function returns the min-keycodes and max-keycodes supported by the
+specified display.
+The minimum number of KeyCodes returned is never less than 8,
+and the maximum number of KeyCodes returned is never greater than 255.
+Not all KeyCodes in this range are required to have corresponding keys.
+.LP
+The
+.ZN XSetModifierMapping
+function specifies the KeyCodes of the keys (if any) that are to be used 
+as modifiers.
+If it succeeds,
+the X server generates a
+.ZN MappingNotify
+event, and
+.ZN XSetModifierMapping
+returns
+.ZN MappingSuccess .
+X permits at most 8 modifier keys.
+If more than 8 are specified in the
+.ZN XModifierKeymap
+structure, a
+.ZN BadLength
+error results.
+.LP
+The modifiermap member of the 
+.ZN XModifierKeymap
+structure contains 8 sets of max_keypermod KeyCodes, 
+one for each modifier in the order 
+.ZN Shift , 
+.ZN Lock , 
+.ZN Control , 
+.ZN Mod1 , 
+.ZN Mod2 , 
+.ZN Mod3 , 
+.ZN Mod4 , 
+and 
+.ZN Mod5 .
+Only nonzero KeyCodes have meaning in each set, 
+and zero KeyCodes are ignored.
+In addition, all of the nonzero KeyCodes must be in the range specified by 
+min_keycode and max_keycode in the 
+.ZN Display 
+structure,
+or a 
+.ZN BadValue 
+error results.
+.LP
+An X server can impose restrictions on how modifiers can be changed, 
+for example,
+if certain keys do not generate up transitions in hardware,
+if auto-repeat cannot be disabled on certain keys,
+or if multiple modifier keys are not supported.  
+If some such restriction is violated, 
+the status reply is
+.ZN MappingFailed ,
+and none of the modifiers are changed.
+If the new KeyCodes specified for a modifier differ from those
+currently defined and any (current or new) keys for that modifier are
+in the logically down state, 
+.ZN XSetModifierMapping
+returns
+.ZN MappingBusy , 
+and none of the modifiers is changed.
+.LP
+.ZN XSetModifierMapping
+can generate
+.ZN BadAlloc
+and 
+.ZN BadValue
+errors.
+.LP
+The
+.ZN XGetModifierMapping
+function returns a pointer to a newly created
+.ZN XModifierKeymap
+structure that contains the keys being used as modifiers.
+The structure should be freed after use by calling
+.ZN XFreeModifiermap .
+If only zero values appear in the set for any modifier, 
+that modifier is disabled.
+.LP
+The
+.ZN XNewModifiermap
+function returns a pointer to
+.ZN XModifierKeymap
+structure for later use.
+.LP
+The
+.ZN XInsertModifiermapEntry
+function adds the specified KeyCode to the set that controls the specified
+modifier and returns the resulting
+.ZN XModifierKeymap
+structure (expanded as needed).
+.LP
+The
+.ZN XDeleteModifiermapEntry
+function deletes the specified KeyCode from the set that controls the
+specified modifier and returns a pointer to the resulting
+.ZN XModifierKeymap
+structure.
+.LP
+The
+.ZN XFreeModifiermap
+function frees the specified
+.ZN XModifierKeymap
+structure.
+.SH STRUCTURES
+The
+.ZN XModifierKeymap
+structure contains:
+.LP
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+typedef struct {
+       int max_keypermod;      /\&* This server's max number of keys per modifier */
+       KeyCode *modifiermap;   /\&* An 8 by max_keypermod array of the modifiers */
+} XModifierKeymap;
+.De
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.SH "SEE ALSO"
+XFree(__libmansuffix__),
+XkbGetMap(__libmansuffix__),
+XSetPointerMapping(__libmansuffix__) 
+.br
+\fI\*(xL\fP
diff --git a/man/XChangePointerControl.man b/man/XChangePointerControl.man
new file mode 100644 (file)
index 0000000..3a8fa6f
--- /dev/null
@@ -0,0 +1,214 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XChangePointerControl __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XChangePointerControl, XGetPointerControl \- control pointer 
+.SH SYNTAX
+.HP
+int XChangePointerControl\^(\^Display *\fIdisplay\fP\^, Bool \fIdo_accel\fP\^,
+Bool \fIdo_threshold\fP\^, int \fIaccel_numerator\fP\^, int
+\fIaccel_denominator\fP\^, int \fIthreshold\fP\^);
+.HP
+int XGetPointerControl\^(\^Display *\fIdisplay\fP\^, int
+*\fIaccel_numerator_return\fP\^, int *\fIaccel_denominator_return\fP\^, int
+*\fIthreshold_return\fP\^);
+.SH ARGUMENTS
+.IP \fIaccel_denominator\fP 1i
+Specifies the denominator for the acceleration multiplier.
+.IP \fIaccel_denominator_return\fP 1i
+Returns the denominator for the acceleration multiplier.
+.IP \fIaccel_numerator\fP 1i
+Specifies the numerator for the acceleration multiplier.
+.IP \fIaccel_numerator_return\fP 1i
+Returns the numerator for the acceleration multiplier.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIdo_accel\fP 1i
+Specifies a Boolean value that controls whether the values for 
+the accel_numerator or accel_denominator are used.
+.IP \fIdo_threshold\fP 1i
+Specifies a Boolean value that controls whether the value for the 
+threshold is used.
+.IP \fIthreshold\fP 1i
+Specifies the acceleration threshold.
+.IP \fIthreshold_return\fP 1i
+Returns the acceleration threshold.
+.SH DESCRIPTION
+The
+.ZN XChangePointerControl
+function defines how the pointing device moves.
+The acceleration, expressed as a fraction, is a
+multiplier for movement. 
+For example,
+specifying 3/1 means the pointer moves three times as fast as normal.
+The fraction may be rounded arbitrarily by the X server.  
+Acceleration
+only takes effect if the pointer moves more than threshold pixels at
+once and only applies to the amount beyond the value in the threshold argument.
+Setting a value to \-1 restores the default.
+The values of the do_accel and do_threshold arguments must be 
+.ZN True 
+for the pointer values to be set,
+or the parameters are unchanged.
+Negative values (other than \-1) generate a
+.ZN BadValue
+error, as does a zero value
+for the accel_denominator argument.
+.LP
+.ZN XChangePointerControl
+can generate a
+.ZN BadValue 
+error.
+.LP
+The
+.ZN XGetPointerControl
+function returns the pointer's current acceleration multiplier
+and acceleration threshold.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.SH "SEE ALSO"
+\fI\*(xL\fP
diff --git a/man/XChangeProperty.man b/man/XChangeProperty.man
new file mode 100644 (file)
index 0000000..ce26c3d
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XGetWindowProperty.__libmansuffix__
diff --git a/man/XChangeSaveSet.man b/man/XChangeSaveSet.man
new file mode 100644 (file)
index 0000000..0192409
--- /dev/null
@@ -0,0 +1,227 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XChangeSaveSet __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XChangeSaveSet, XAddToSaveSet, XRemoveFromSaveSet \- change a client's save set
+.SH SYNTAX
+.HP
+int XChangeSaveSet\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, int \fIchange_mode\fP\^);
+.HP
+int XAddToSaveSet\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^);
+.HP
+int XRemoveFromSaveSet\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^);
+.SH ARGUMENTS
+.IP \fIchange_mode\fP 1i
+Specifies the mode.
+You can pass
+.ZN SetModeInsert 
+or
+.ZN SetModeDelete .
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.ds Wi that you want to add or delete from the client's save-set
+.IP \fIw\fP 1i
+Specifies the window \*(Wi.
+.SH DESCRIPTION
+Depending on the specified mode,
+.ZN XChangeSaveSet
+either inserts or deletes the specified window from the client's save-set. 
+The specified window must have been created by some other client,
+or a
+.ZN BadMatch
+error results.
+.LP
+.ZN XChangeSaveSet
+can generate
+.ZN BadMatch ,
+.ZN BadValue ,
+and
+.ZN BadWindow 
+errors.
+.LP
+The
+.ZN XAddToSaveSet
+function adds the specified window to the client's save-set.
+The specified window must have been created by some other client,
+or a
+.ZN BadMatch
+error results.
+.LP
+.ZN XAddToSaveSet
+can generate
+.ZN BadMatch 
+and
+.ZN BadWindow 
+errors.
+.LP
+The
+.ZN XRemoveFromSaveSet
+function removes the specified window from the client's save-set.
+The specified window must have been created by some other client,
+or a
+.ZN BadMatch
+error results.
+.LP
+.ZN XRemoveFromSaveSet
+can generate
+.ZN BadMatch
+and
+.ZN BadWindow 
+errors.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadMatch
+Some argument or pair of arguments has the correct type and range but fails
+to match in some other way required by the request.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XReparentWindow(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XChangeWindowAttributes.man b/man/XChangeWindowAttributes.man
new file mode 100644 (file)
index 0000000..3789a51
--- /dev/null
@@ -0,0 +1,405 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XChangeWindowAttributes __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XChangeWindowAttributes, XSetWindowBackground, XSetWindowBackgroundPixmap, XSetWindowBorder, XSetWindowBorderPixmap, XSetWindowColormap \- change window attributes
+.SH SYNTAX
+.HP
+int XChangeWindowAttributes\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, unsigned long \fIvaluemask\fP\^, XSetWindowAttributes *\fIattributes\fP\^);
+.HP
+int XSetWindowBackground\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, unsigned long \fIbackground_pixel\fP\^);
+.HP
+int XSetWindowBackgroundPixmap\^(\^Display *\fIdisplay\fP\^, Window
+\fIw\fP\^, Pixmap \fIbackground_pixmap\fP\^);
+.HP 
+int XSetWindowBorder\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, unsigned long \fIborder_pixel\fP\^);
+.HP
+int XSetWindowBorderPixmap\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, Pixmap \fIborder_pixmap\fP\^);
+.HP
+int XSetWindowColormap\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, Colormap \fIcolormap\fP\^);
+.SH ARGUMENTS
+.IP \fIattributes\fP 1i
+Specifies the structure from which the values (as specified by the value mask)
+are to be taken.
+The value mask should have the appropriate bits
+set to indicate which attributes have been set in the structure.
+.IP \fIbackground_pixel\fP 1i
+Specifies the pixel that is to be used for the background.
+.IP \fIbackground_pixmap\fP 1i
+Specifies the background pixmap,
+.ZN ParentRelative ,
+or
+.ZN None .
+.IP \fIborder_pixel\fP 1i
+Specifies the entry in the colormap. 
+.IP \fIborder_pixmap\fP 1i
+Specifies the border pixmap or
+.ZN CopyFromParent .
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIvaluemask\fP 1i
+Specifies which window attributes are defined in the attributes
+argument.
+This mask is the bitwise inclusive OR of the valid attribute mask bits.
+If valuemask is zero,
+the attributes are ignored and are not referenced.
+.IP \fIw\fP 1i
+Specifies the window.
+.IP \fIcolormap\fP 1i
+Specifies the colormap.
+.SH DESCRIPTION
+Depending on the valuemask,
+the
+.ZN XChangeWindowAttributes
+function uses the window attributes in the
+.ZN XSetWindowAttributes
+structure to change the specified window attributes.
+Changing the background does not cause the window contents to be
+changed.
+To repaint the window and its background, use 
+.ZN XClearWindow .
+Setting the border or changing the background such that the
+border tile origin changes causes the border to be repainted.
+Changing the background of a root window to 
+.ZN None 
+or 
+.ZN ParentRelative
+restores the default background pixmap.
+Changing the border of a root window to
+.ZN CopyFromParent
+restores the default border pixmap.
+Changing the win-gravity does not affect the current position of the
+window.
+Changing the backing-store of an obscured window to 
+.ZN WhenMapped 
+or
+.ZN Always , 
+or changing the backing-planes, backing-pixel, or
+save-under of a mapped window may have no immediate effect.
+Changing the colormap of a window (that is, defining a new map, not
+changing the contents of the existing map) generates a 
+.ZN ColormapNotify
+event.
+Changing the colormap of a visible window may have no
+immediate effect on the screen because the map may not be installed
+(see
+.ZN XInstallColormap ).
+Changing the cursor of a root window to 
+.ZN None 
+restores the default
+cursor.
+Whenever possible, you are encouraged to share colormaps.
+.LP
+Multiple clients can select input on the same window. 
+Their event masks are maintained separately.
+When an event is generated, 
+it is reported to all interested clients. 
+However, only one client at a time can select for 
+.ZN SubstructureRedirectMask , 
+.ZN ResizeRedirectMask , 
+and
+.ZN ButtonPressMask .
+If a client attempts to select any of these event masks 
+and some other client has already selected one, 
+a
+.ZN BadAccess
+error results.
+There is only one do-not-propagate-mask for a window, 
+not one per client.
+.LP
+.ZN XChangeWindowAttributes
+can generate
+.ZN BadAccess ,
+.ZN BadColor ,
+.ZN BadCursor ,
+.ZN BadMatch ,
+.ZN BadPixmap ,
+.ZN BadValue ,
+and
+.ZN BadWindow 
+errors.
+.LP
+The
+.ZN XSetWindowBackground
+function sets the background of the window to the specified pixel value.
+Changing the background does not cause the window contents to be changed.
+.ZN XSetWindowBackground
+uses a pixmap of undefined size filled with the pixel value you passed.
+If you try to change the background of an 
+.ZN InputOnly
+window, a
+.ZN BadMatch
+error results.
+.LP
+.ZN XSetWindowBackground
+can generate
+.ZN BadMatch
+and
+.ZN BadWindow 
+errors.
+.LP
+The
+.ZN XSetWindowBackgroundPixmap
+function sets the background pixmap of the window to the specified pixmap.
+The background pixmap can immediately be freed if no further explicit
+references to it are to be made.
+If 
+.ZN ParentRelative
+is specified, 
+the background pixmap of the window's parent is used,
+or on the root window, the default background is restored.
+If you try to change the background of an 
+.ZN InputOnly
+window, a
+.ZN BadMatch
+error results.
+If the background is set to
+.ZN None ,
+the window has no defined background.
+.LP
+.ZN XSetWindowBackgroundPixmap
+can generate
+.ZN BadMatch ,
+.ZN BadPixmap ,
+and
+.ZN BadWindow 
+errors.
+.LP 
+The
+.ZN XSetWindowBorder
+function sets the border of the window to the pixel value you specify.
+If you attempt to perform this on an
+.ZN InputOnly
+window, a
+.ZN BadMatch
+error results.
+.LP
+.ZN XSetWindowBorder
+can generate
+.ZN BadMatch
+and
+.ZN BadWindow 
+errors.
+.LP
+The
+.ZN XSetWindowBorderPixmap
+function sets the border pixmap of the window to the pixmap you specify.
+The border pixmap can be freed immediately if no further explicit
+references to it are to be made.
+If you specify
+.ZN CopyFromParent ,
+a copy of the parent window's border pixmap is used.
+If you attempt to perform this on an
+.ZN InputOnly
+window, a
+.ZN BadMatch
+error results.
+.LP
+.ZN XSetWindowBorderPixmap
+can generate
+.ZN BadMatch ,
+.ZN BadPixmap ,
+and
+.ZN BadWindow 
+errors.
+.LP
+The
+.ZN XSetWindowColormap
+function sets the specified colormap of the specified window.
+The colormap must have the same visual type as the window,
+or a
+.ZN BadMatch
+error results.
+.LP
+.ZN XSetWindowColormap
+can generate
+.ZN BadColor ,
+.ZN BadMatch ,
+and
+.ZN BadWindow 
+errors.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAccess
+A client attempted
+to free a color map entry that it did not already allocate.
+.TP 1i
+.ZN BadAccess
+A client attempted
+to store into a read-only color map entry.
+.TP 1i
+.ZN BadColor
+A value for a Colormap argument does not name a defined Colormap.
+.TP 1i
+.ZN BadCursor
+A value for a Cursor argument does not name a defined Cursor.
+.TP 1i
+.ZN BadMatch
+Some argument or pair of arguments has the correct type and range but fails
+to match in some other way required by the request.
+.TP 1i
+.ZN BadMatch
+An
+.ZN InputOnly
+window locks this attribute.
+.TP 1i
+.ZN BadPixmap
+A value for a Pixmap argument does not name a defined Pixmap.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XConfigureWindow(__libmansuffix__),
+XCreateWindow(__libmansuffix__),
+XDestroyWindow(__libmansuffix__),
+XInstallColormap(__libmansuffix__),
+XMapWindow(__libmansuffix__),
+XRaiseWindow(__libmansuffix__),
+XUnmapWindow(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XChar2b.man b/man/XChar2b.man
new file mode 100644 (file)
index 0000000..ca6fa1f
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XLoadFont.__libmansuffix__
diff --git a/man/XCharStruct.man b/man/XCharStruct.man
new file mode 100644 (file)
index 0000000..ca6fa1f
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XLoadFont.__libmansuffix__
diff --git a/man/XCheckIfEvent.man b/man/XCheckIfEvent.man
new file mode 100644 (file)
index 0000000..089e0a4
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XIfEvent.__libmansuffix__
diff --git a/man/XCheckMaskEvent.man b/man/XCheckMaskEvent.man
new file mode 100644 (file)
index 0000000..6f5346e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XNextEvent.__libmansuffix__
diff --git a/man/XCheckTypedEvent.man b/man/XCheckTypedEvent.man
new file mode 100644 (file)
index 0000000..6f5346e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XNextEvent.__libmansuffix__
diff --git a/man/XCheckTypedWindowEvent.man b/man/XCheckTypedWindowEvent.man
new file mode 100644 (file)
index 0000000..6f5346e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XNextEvent.__libmansuffix__
diff --git a/man/XCheckWindowEvent.man b/man/XCheckWindowEvent.man
new file mode 100644 (file)
index 0000000..6f5346e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XNextEvent.__libmansuffix__
diff --git a/man/XCirculateEvent.man b/man/XCirculateEvent.man
new file mode 100644 (file)
index 0000000..304f34e
--- /dev/null
@@ -0,0 +1,231 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XCirculateEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XCirculateEvent \- CirculateNotify event structure
+.SH STRUCTURES
+The structure for
+.ZN CirculateNotify
+events contains:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int type;       /\&* CirculateNotify */
+       unsigned long serial;   /\&* # of last request processed by server */
+       Bool send_event;        /\&* true if this came from a SendEvent request */
+       Display *display;       /\&* Display the event was read from */
+       Window event;
+       Window window;
+       int place;      /\&* PlaceOnTop, PlaceOnBottom */
+} XCirculateEvent;
+.De
+.LP
+When you receive this event,
+the structure members are set as follows.
+.LP
+The type member is set to the event type constant name that uniquely identifies
+it.
+For example, when the X server reports a
+.ZN GraphicsExpose
+event to a client application, it sends an
+.ZN XGraphicsExposeEvent
+structure with the type member set to
+.ZN GraphicsExpose .
+The display member is set to a pointer to the display the event was read on.
+The send_event member is set to
+.ZN True
+if the event came from a
+.ZN SendEvent
+protocol request.
+The serial member is set from the serial number reported in the protocol
+but expanded from the 16-bit least-significant bits to a full 32-bit value.
+The window member is set to the window that is most useful to toolkit
+dispatchers.
+.LP
+The event member is set either to the restacked window or to its parent,
+depending on whether
+.ZN StructureNotify
+or
+.ZN SubstructureNotify
+was selected.
+The window member is set to the window that was restacked.
+The place member is set to the window's position after the restack occurs and
+is either
+.ZN PlaceOnTop
+or
+.ZN PlaceOnBottom .
+If it is
+.ZN PlaceOnTop ,
+the window is now on top of all siblings.
+If it is
+.ZN PlaceOnBottom ,
+the window is now below all siblings.
+.SH "SEE ALSO"
+XAnyEvent(__libmansuffix__),
+XButtonEvent(__libmansuffix__),
+XCreateWindowEvent(__libmansuffix__),
+XCirculateRequestEvent(__libmansuffix__),
+XColormapEvent(__libmansuffix__),
+XConfigureEvent(__libmansuffix__),
+XConfigureRequestEvent(__libmansuffix__),
+XCrossingEvent(__libmansuffix__),
+XDestroyWindowEvent(__libmansuffix__),
+XErrorEvent(__libmansuffix__),
+XExposeEvent(__libmansuffix__),
+XFocusChangeEvent(__libmansuffix__),
+XGraphicsExposeEvent(__libmansuffix__),
+XGravityEvent(__libmansuffix__),
+XKeymapEvent(__libmansuffix__),
+XMapEvent(__libmansuffix__),
+XMapRequestEvent(__libmansuffix__),
+XPropertyEvent(__libmansuffix__),
+XReparentEvent(__libmansuffix__),
+XResizeRequestEvent(__libmansuffix__),
+XSelectionClearEvent(__libmansuffix__),
+XSelectionEvent(__libmansuffix__),
+XSelectionRequestEvent(__libmansuffix__),
+XUnmapEvent(__libmansuffix__),
+XVisibilityEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XCirculateRequestEvent.man b/man/XCirculateRequestEvent.man
new file mode 100644 (file)
index 0000000..8a7afdb
--- /dev/null
@@ -0,0 +1,226 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XCirculateRequestEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XCirculateRequestEvent \- CirculateRequest event structure
+.SH STRUCTURES
+The structure for
+.ZN CirculateRequest
+events contains:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int type;       /\&* CirculateRequest */
+       unsigned long serial;   /\&* # of last request processed by server */
+       Bool send_event;        /\&* true if this came from a SendEvent request */
+       Display *display;       /\&* Display the event was read from */
+       Window parent;
+       Window window;
+       int place;      /\&* PlaceOnTop, PlaceOnBottom */
+} XCirculateRequestEvent;
+.De
+.LP
+When you receive this event,
+the structure members are set as follows.
+.LP
+The type member is set to the event type constant name that uniquely identifies
+it.
+For example, when the X server reports a
+.ZN GraphicsExpose
+event to a client application, it sends an
+.ZN XGraphicsExposeEvent
+structure with the type member set to
+.ZN GraphicsExpose .
+The display member is set to a pointer to the display the event was read on.
+The send_event member is set to
+.ZN True
+if the event came from a
+.ZN SendEvent
+protocol request.
+The serial member is set from the serial number reported in the protocol
+but expanded from the 16-bit least-significant bits to a full 32-bit value.
+The window member is set to the window that is most useful to toolkit
+dispatchers.
+.LP
+The parent member is set to the parent window.
+The window member is set to the subwindow to be restacked.
+The place member is set to what the new position in the stacking order should be
+and is either
+.ZN PlaceOnTop
+or
+.ZN PlaceOnBottom .
+If it is
+.ZN PlaceOnTop ,
+the subwindow should be on top of all siblings.
+If it is
+.ZN PlaceOnBottom ,
+the subwindow should be below all siblings.
+.SH "SEE ALSO"
+XAnyEvent(__libmansuffix__),
+XButtonEvent(__libmansuffix__),
+XCreateWindowEvent(__libmansuffix__),
+XCirculateEvent(__libmansuffix__),
+XColormapEvent(__libmansuffix__),
+XConfigureEvent(__libmansuffix__),
+XConfigureRequestEvent(__libmansuffix__),
+XCrossingEvent(__libmansuffix__),
+XDestroyWindowEvent(__libmansuffix__),
+XErrorEvent(__libmansuffix__),
+XExposeEvent(__libmansuffix__),
+XFocusChangeEvent(__libmansuffix__),
+XGraphicsExposeEvent(__libmansuffix__),
+XGravityEvent(__libmansuffix__),
+XKeymapEvent(__libmansuffix__),
+XMapEvent(__libmansuffix__),
+XMapRequestEvent(__libmansuffix__),
+XPropertyEvent(__libmansuffix__),
+XReparentEvent(__libmansuffix__),
+XResizeRequestEvent(__libmansuffix__),
+XSelectionClearEvent(__libmansuffix__),
+XSelectionEvent(__libmansuffix__),
+XSelectionRequestEvent(__libmansuffix__),
+XUnmapEvent(__libmansuffix__),
+XVisibilityEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XCirculateSubwindows.man b/man/XCirculateSubwindows.man
new file mode 100644 (file)
index 0000000..37f4b5f
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XRaiseWindow.__libmansuffix__
diff --git a/man/XCirculateSubwindowsDown.man b/man/XCirculateSubwindowsDown.man
new file mode 100644 (file)
index 0000000..37f4b5f
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XRaiseWindow.__libmansuffix__
diff --git a/man/XCirculateSubwindowsUp.man b/man/XCirculateSubwindowsUp.man
new file mode 100644 (file)
index 0000000..37f4b5f
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XRaiseWindow.__libmansuffix__
diff --git a/man/XClassHint.man b/man/XClassHint.man
new file mode 100644 (file)
index 0000000..02d6722
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAllocClassHint.__libmansuffix__
diff --git a/man/XClearArea.man b/man/XClearArea.man
new file mode 100644 (file)
index 0000000..3bdb86e
--- /dev/null
@@ -0,0 +1,257 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XClearArea __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XClearArea, XClearWindow \- clear area or window
+.SH SYNTAX
+.HP
+int XClearArea\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, int \fIx\fP\^,
+int \fIy\fP\^, unsigned \fIwidth\fP\^, unsigned \fIheight\fP\^,
+Bool \fIexposures\fP\^);
+.HP
+int XClearWindow\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^);
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIexposures\fP 1i
+Specifies a Boolean value that indicates if
+.ZN Expose
+events are to be generated.
+.IP \fIw\fP 1i
+Specifies the window.
+.ds Wh , which are the dimensions of the rectangle
+.IP \fIwidth\fP 1i
+.br
+.ns
+.IP \fIheight\fP 1i
+Specify the width and height\*(Wh.
+.ds Xy , which are relative to the origin of the window \
+and specify the upper-left corner of the rectangle
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.SH DESCRIPTION
+The
+.ZN XClearArea
+function paints a rectangular area in the specified window according to the
+specified dimensions with the window's background pixel or pixmap.
+The subwindow-mode effectively is
+.ZN ClipByChildren . 
+If width is zero, it
+is replaced with the current width of the window minus x.
+If height is
+zero, it is replaced with the current height of the window minus y.
+If the window has a defined background tile, 
+the rectangle clipped by any children is filled with this tile.
+If the window has
+background 
+.ZN None , 
+the contents of the window are not changed.  
+In either
+case, if exposures is 
+.ZN True , 
+one or more 
+.ZN Expose 
+events are generated for regions of the rectangle that are either visible or are
+being retained in a backing store.
+If you specify a window whose class is
+.ZN InputOnly ,
+a
+.ZN BadMatch
+error results.
+.LP
+.ZN XClearArea
+can generate
+.ZN BadMatch ,
+.ZN BadValue ,
+and
+.ZN BadWindow 
+errors.
+.LP
+The
+.ZN XClearWindow
+function clears the entire area in the specified window and is
+equivalent to
+.ZN XClearArea
+(display, w, 0, 0, 0, 0, 
+.ZN False ).
+If the window has a defined background tile, the rectangle is tiled with a
+plane-mask of all ones and 
+.ZN GXcopy
+function.
+If the window has
+background 
+.ZN None , 
+the contents of the window are not changed.  
+If you specify a window whose class is
+.ZN InputOnly ,
+a
+.ZN BadMatch
+error results. 
+.LP
+.ZN XClearWindow
+can generate
+.ZN BadMatch
+and
+.ZN BadWindow 
+errors.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadMatch
+An
+.ZN InputOnly
+window is used as a Drawable.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XCopyArea(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XClearWindow.man b/man/XClearWindow.man
new file mode 100644 (file)
index 0000000..a05a25d
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XClearArea.__libmansuffix__
diff --git a/man/XClientMessageEvent.man b/man/XClientMessageEvent.man
new file mode 100644 (file)
index 0000000..f8239a8
--- /dev/null
@@ -0,0 +1,229 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XClientMessageEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XClientMessageEvent \- ClientMessage event structure
+.SH STRUCTURES
+The structure for
+.ZN ClientMessage
+events contains:
+.LP
+.Ds 0
+.TA .5i 1i 3i
+.ta .5i 1i 3i
+typedef struct {
+       int type;       /\&* ClientMessage */
+       unsigned long serial;           /\&* # of last request processed by server */
+       Bool send_event;                /\&* true if this came from a SendEvent request */
+       Display *display;               /\&* Display the event was read from */
+       Window window;
+       Atom message_type;
+       int format;
+       union {
+               char b[20];
+               short s[10];
+               long l[5];
+               } data;
+} XClientMessageEvent;
+.De
+.LP
+When you receive this event,
+the structure members are set as follows.
+.LP
+The type member is set to the event type constant name that uniquely identifies
+it.
+For example, when the X server reports a
+.ZN GraphicsExpose
+event to a client application, it sends an
+.ZN XGraphicsExposeEvent
+structure with the type member set to
+.ZN GraphicsExpose .
+The display member is set to a pointer to the display the event was read on.
+The send_event member is set to
+.ZN True
+if the event came from a
+.ZN SendEvent
+protocol request.
+The serial member is set from the serial number reported in the protocol
+but expanded from the 16-bit least-significant bits to a full 32-bit value.
+The window member is set to the window that is most useful to toolkit
+dispatchers.
+.LP
+The message_type member is set to an atom that indicates how the data 
+should be interpreted by the receiving client.
+The format member is set to 8, 16, or 32 and specifies whether the data
+should be viewed as a list of bytes, shorts, or longs.
+The data member is a union that contains the members b, s, and l.
+The b, s, and l members represent data of twenty 8-bit values, 
+ten 16-bit values, and five 32-bit values.
+Particular message types might not make use of all these values.
+The X server places no interpretation on the values in the window,
+message_type, or data members.
+.SH "SEE ALSO"
+XAnyEvent(__libmansuffix__),
+XButtonEvent(__libmansuffix__),
+XCreateWindowEvent(__libmansuffix__),
+XCirculateEvent(__libmansuffix__),
+XCirculateRequestEvent(__libmansuffix__),
+XColormapEvent(__libmansuffix__),
+XConfigureEvent(__libmansuffix__),
+XConfigureRequestEvent(__libmansuffix__),
+XCrossingEvent(__libmansuffix__),
+XDestroyWindowEvent(__libmansuffix__),
+XErrorEvent(__libmansuffix__),
+XExposeEvent(__libmansuffix__),
+XFocusChangeEvent(__libmansuffix__),
+XGraphicsExposeEvent(__libmansuffix__),
+XGravityEvent(__libmansuffix__),
+XKeymapEvent(__libmansuffix__),
+XMapEvent(__libmansuffix__),
+XMapRequestEvent(__libmansuffix__),
+XPropertyEvent(__libmansuffix__),
+XReparentEvent(__libmansuffix__),
+XResizeRequestEvent(__libmansuffix__),
+XSelectionClearEvent(__libmansuffix__),
+XSelectionEvent(__libmansuffix__),
+XSelectionRequestEvent(__libmansuffix__),
+XUnmapEvent(__libmansuffix__),
+XVisibilityEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XClipBox.man b/man/XClipBox.man
new file mode 100644 (file)
index 0000000..24be755
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XPolygonRegion.__libmansuffix__
diff --git a/man/XCloseDisplay.man b/man/XCloseDisplay.man
new file mode 100644 (file)
index 0000000..ba03d6f
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XOpenDisplay.__libmansuffix__
diff --git a/man/XCloseIM.man b/man/XCloseIM.man
new file mode 100644 (file)
index 0000000..6365409
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XOpenIM.__libmansuffix__
diff --git a/man/XCloseOM.man b/man/XCloseOM.man
new file mode 100644 (file)
index 0000000..3b4acf5
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XOpenOM.__libmansuffix__
diff --git a/man/XColor.man b/man/XColor.man
new file mode 100644 (file)
index 0000000..f9fb228
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XCreateColormap.__libmansuffix__
diff --git a/man/XColormapEvent.man b/man/XColormapEvent.man
new file mode 100644 (file)
index 0000000..02f89d6
--- /dev/null
@@ -0,0 +1,240 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XColormapEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XColormapEvent \- ColormapNotify event structure
+.SH STRUCTURES
+The structure for
+.ZN ColormapNotify
+events contains:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int type;       /\&* ColormapNotify */
+       unsigned long serial;   /\&* # of last request processed by server */
+       Bool send_event;        /\&* true if this came from a SendEvent request */
+       Display *display;       /\&* Display the event was read from */
+       Window window;
+       Colormap colormap;      /\&* colormap or None */
+       Bool new;
+       int state;      /\&* ColormapInstalled, ColormapUninstalled */
+} XColormapEvent;
+.De
+.LP
+When you receive this event,
+the structure members are set as follows.
+.LP
+The type member is set to the event type constant name that uniquely identifies
+it.
+For example, when the X server reports a
+.ZN GraphicsExpose
+event to a client application, it sends an
+.ZN XGraphicsExposeEvent
+structure with the type member set to
+.ZN GraphicsExpose .
+The display member is set to a pointer to the display the event was read on.
+The send_event member is set to
+.ZN True
+if the event came from a
+.ZN SendEvent
+protocol request.
+The serial member is set from the serial number reported in the protocol
+but expanded from the 16-bit least-significant bits to a full 32-bit value.
+The window member is set to the window that is most useful to toolkit
+dispatchers.
+.LP
+The window member is set to the window whose associated 
+colormap is changed, installed, or uninstalled.
+For a colormap that is changed, installed, or uninstalled,
+the colormap member is set to the colormap associated with the window. 
+For a colormap that is changed by a call to
+.ZN XFreeColormap ,
+the colormap member is set to
+.ZN None .
+The new member is set to indicate whether the colormap 
+for the specified window was changed or installed or uninstalled
+and can be 
+.ZN True
+or
+.ZN False .
+If it is
+.ZN True ,
+the colormap was changed.
+If it is
+.ZN False ,
+the colormap was installed or uninstalled.
+The state member is always set to indicate whether the colormap is installed or
+uninstalled and can be 
+.ZN ColormapInstalled
+or
+.ZN ColormapUninstalled .
+.SH "SEE ALSO"
+XAnyEvent(__libmansuffix__),
+XButtonEvent(__libmansuffix__),
+XCreateWindowEvent(__libmansuffix__),
+XCirculateEvent(__libmansuffix__),
+XCirculateRequestEvent(__libmansuffix__),
+XConfigureEvent(__libmansuffix__),
+XConfigureRequestEvent(__libmansuffix__),
+XCreateColormap(__libmansuffix__),
+XCrossingEvent(__libmansuffix__),
+XDestroyWindowEvent(__libmansuffix__),
+XErrorEvent(__libmansuffix__),
+XExposeEvent(__libmansuffix__),
+XFocusChangeEvent(__libmansuffix__),
+XGraphicsExposeEvent(__libmansuffix__),
+XGravityEvent(__libmansuffix__),
+XKeymapEvent(__libmansuffix__),
+XMapEvent(__libmansuffix__),
+XMapRequestEvent(__libmansuffix__),
+XPropertyEvent(__libmansuffix__),
+XReparentEvent(__libmansuffix__),
+XResizeRequestEvent(__libmansuffix__),
+XSelectionClearEvent(__libmansuffix__),
+XSelectionEvent(__libmansuffix__),
+XSelectionRequestEvent(__libmansuffix__),
+XUnmapEvent(__libmansuffix__),
+XVisibilityEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XCompose.man b/man/XCompose.man
new file mode 100644 (file)
index 0000000..e149c54
--- /dev/null
@@ -0,0 +1 @@
+.so man__filemansuffix__/Compose.__filemansuffix__
diff --git a/man/XConfigureEvent.man b/man/XConfigureEvent.man
new file mode 100644 (file)
index 0000000..589e939
--- /dev/null
@@ -0,0 +1,249 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XConfigureEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XConfigureEvent \- ConfigureNotify event structure
+.SH STRUCTURES
+The structure for
+.ZN ConfigureNotify
+events contains:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int type;       /\&* ConfigureNotify */
+       unsigned long serial;   /\&* # of last request processed by server */
+       Bool send_event;        /\&* true if this came from a SendEvent request */
+       Display *display;       /\&* Display the event was read from */
+       Window event;
+       Window window;
+       int x, y;
+       int width, height;
+       int border_width;
+       Window above;
+       Bool override_redirect;
+} XConfigureEvent;
+.De
+.LP
+When you receive this event,
+the structure members are set as follows.
+.LP
+The type member is set to the event type constant name that uniquely identifies
+it.
+For example, when the X server reports a
+.ZN GraphicsExpose
+event to a client application, it sends an
+.ZN XGraphicsExposeEvent
+structure with the type member set to
+.ZN GraphicsExpose .
+The display member is set to a pointer to the display the event was read on.
+The send_event member is set to
+.ZN True
+if the event came from a
+.ZN SendEvent
+protocol request.
+The serial member is set from the serial number reported in the protocol
+but expanded from the 16-bit least-significant bits to a full 32-bit value.
+The window member is set to the window that is most useful to toolkit
+dispatchers.
+.LP
+The event member is set either to the reconfigured window or to its parent,
+depending on whether
+.ZN StructureNotify
+or
+.ZN SubstructureNotify
+was selected.
+The window member is set to the window whose size, position, 
+border, and/or stacking
+order was changed.
+.LP
+The x and y members are set to the coordinates relative to the parent window's 
+origin and indicate the position of the upper-left outside corner of the window.
+The width and height members are set to the inside size of the window, 
+not including
+the border.
+The border_width member is set to the width of the window's border, in pixels.
+.LP
+The above member is set to the sibling window and is used 
+for stacking operations.
+If the X server sets this member to
+.ZN None ,
+the window whose state was changed is on the bottom of the stack
+with respect to sibling windows.
+However, if this member is set to a sibling window, 
+the window whose state was changed is placed on top of this sibling window.
+.LP
+The override_redirect member is set to the override-redirect attribute of the
+window.
+Window manager clients normally should ignore this window if the 
+override_redirect member
+is
+.ZN True .
+.SH "SEE ALSO"
+XAnyEvent(__libmansuffix__),
+XButtonEvent(__libmansuffix__),
+XCreateWindowEvent(__libmansuffix__),
+XCirculateEvent(__libmansuffix__),
+XCirculateRequestEvent(__libmansuffix__),
+XColormapEvent(__libmansuffix__),
+XConfigureRequestEvent(__libmansuffix__),
+XCrossingEvent(__libmansuffix__),
+XDestroyWindowEvent(__libmansuffix__),
+XErrorEvent(__libmansuffix__),
+XExposeEvent(__libmansuffix__),
+XFocusChangeEvent(__libmansuffix__),
+XGraphicsExposeEvent(__libmansuffix__),
+XGravityEvent(__libmansuffix__),
+XKeymapEvent(__libmansuffix__),
+XMapEvent(__libmansuffix__),
+XMapRequestEvent(__libmansuffix__),
+XPropertyEvent(__libmansuffix__),
+XReparentEvent(__libmansuffix__),
+XResizeRequestEvent(__libmansuffix__),
+XSelectionClearEvent(__libmansuffix__),
+XSelectionEvent(__libmansuffix__),
+XSelectionRequestEvent(__libmansuffix__),
+XUnmapEvent(__libmansuffix__),
+XVisibilityEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XConfigureRequestEvent.man b/man/XConfigureRequestEvent.man
new file mode 100644 (file)
index 0000000..fc5a836
--- /dev/null
@@ -0,0 +1,232 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XConfigureRequestEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XConfigureRequestEvent \- ConfigureRequest event structure
+.SH STRUCTURES
+The structure for
+.ZN ConfigureRequest
+events contains:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int type;       /\&* ConfigureRequest */
+       unsigned long serial;   /\&* # of last request processed by server */
+       Bool send_event;        /\&* true if this came from a SendEvent request */
+       Display *display;       /\&* Display the event was read from */
+       Window parent;
+       Window window;
+       int x, y;
+       int width, height;
+       int border_width;
+       Window above;
+       int detail;     /\&* Above, Below, TopIf, BottomIf, Opposite */
+       unsigned long value_mask;
+} XConfigureRequestEvent;
+.De
+.LP
+When you receive this event,
+the structure members are set as follows.
+.LP
+The type member is set to the event type constant name that uniquely identifies
+it.
+For example, when the X server reports a
+.ZN GraphicsExpose
+event to a client application, it sends an
+.ZN XGraphicsExposeEvent
+structure with the type member set to
+.ZN GraphicsExpose .
+The display member is set to a pointer to the display the event was read on.
+The send_event member is set to
+.ZN True
+if the event came from a
+.ZN SendEvent
+protocol request.
+The serial member is set from the serial number reported in the protocol
+but expanded from the 16-bit least-significant bits to a full 32-bit value.
+The window member is set to the window that is most useful to toolkit
+dispatchers.
+.LP
+The parent member is set to the parent window.
+The window member is set to the window whose size, position, border width, 
+and/or stacking order is to be reconfigured.
+The value_mask member indicates which components were specified in the
+.ZN ConfigureWindow 
+protocol request.
+The corresponding values are reported as given in the request.
+The remaining values are filled in from the current geometry of the window,
+except in the case of above (sibling) and detail (stack-mode),
+which are reported as
+.ZN None
+and
+.ZN Above ,
+respectively, if they are not given in the request.
+.SH "SEE ALSO"
+XAnyEvent(__libmansuffix__),
+XButtonEvent(__libmansuffix__),
+XCreateWindowEvent(__libmansuffix__),
+XCirculateEvent(__libmansuffix__),
+XCirculateRequestEvent(__libmansuffix__),
+XColormapEvent(__libmansuffix__),
+XConfigureEvent(__libmansuffix__),
+XCrossingEvent(__libmansuffix__),
+XDestroyWindowEvent(__libmansuffix__),
+XErrorEvent(__libmansuffix__),
+XExposeEvent(__libmansuffix__),
+XFocusChangeEvent(__libmansuffix__),
+XGraphicsExposeEvent(__libmansuffix__),
+XGravityEvent(__libmansuffix__),
+XKeymapEvent(__libmansuffix__),
+XMapEvent(__libmansuffix__),
+XMapRequestEvent(__libmansuffix__),
+XPropertyEvent(__libmansuffix__),
+XReparentEvent(__libmansuffix__),
+XResizeRequestEvent(__libmansuffix__),
+XSelectionClearEvent(__libmansuffix__),
+XSelectionEvent(__libmansuffix__),
+XSelectionRequestEvent(__libmansuffix__),
+XUnmapEvent(__libmansuffix__),
+XVisibilityEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XConfigureWindow.man b/man/XConfigureWindow.man
new file mode 100644 (file)
index 0000000..e91dd02
--- /dev/null
@@ -0,0 +1,457 @@
+'\" t
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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
+'\" t
+.TH XConfigureWindow __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XConfigureWindow, XMoveWindow, XResizeWindow, XMoveResizeWindow, XSetWindowBorderWidth, XWindowChanges \- configure windows and window changes structure
+.SH SYNTAX
+.HP
+int XConfigureWindow\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, unsigned \fIvalue_mask\fP\^, \^XWindowChanges *\fIchanges\fP\^);
+.HP
+int XMoveWindow\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, int \fIx\fP\^, \fIy\fP\^);
+.HP
+int XResizeWindow\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, unsigned
+\fIwidth\fP\^, unsigned \fIheight\fP\^);
+.HP
+int XMoveResizeWindow\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, int
+\fIx\fP\^, int \fIy\fP\^, unsigned \fIwidth\fP\^, unsigned \fIheight\fP\^); 
+.HP
+int XSetWindowBorderWidth\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^,
+unsigned \fIwidth\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIvalue_mask\fP 1i
+Specifies which values are to be set using information in
+the values structure.
+This mask is the bitwise inclusive OR of the valid configure window values bits.
+.IP \fIvalues\fP 1i
+Specifies the 
+.ZN XWindowChanges 
+structure.
+.ds Wi to be reconfigured, moved, or resized.
+.IP \fIw\fP 1i
+Specifies the window \*(Wi.
+.IP \fIwidth\fP 1i
+Specifies the width of the window border.
+.ds Wh , which are the interior dimensions of the window
+.IP \fIwidth\fP 1i
+.br
+.ns
+.IP \fIheight\fP 1i
+Specify the width and height\*(Wh.
+.ds Xy , which define the new location of the top-left pixel \
+of the window's border or the window itself if it has no border \
+or define the new position of the window relative to its parent
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.SH DESCRIPTION
+The
+.ZN XConfigureWindow
+function uses the values specified in the
+.ZN XWindowChanges
+structure to reconfigure a window's size, position, border, and stacking order.
+Values not specified are taken from the existing geometry of the window.
+.LP
+If a sibling is specified without a stack_mode or if the window
+is not actually a sibling,
+a
+.ZN BadMatch
+error results. 
+Note that the computations for
+.ZN BottomIf ,
+.ZN TopIf ,
+and
+.ZN Opposite
+are performed with respect to the window's final geometry (as controlled by the
+other arguments passed to
+.ZN XConfigureWindow ),
+not its initial geometry.
+Any backing store contents of the window, its
+inferiors, and other newly visible windows are either discarded or
+changed to reflect the current screen contents 
+(depending on the implementation).
+.LP
+.ZN XConfigureWindow
+can generate
+.ZN BadMatch ,
+.ZN BadValue ,
+and
+.ZN BadWindow 
+errors.
+.LP
+The
+.ZN XMoveWindow
+function moves the specified window to the specified x and y coordinates,
+but it does not change the window's size, raise the window, or
+change the mapping state of the window.
+Moving a mapped window may or may not lose the window's contents 
+depending on if the window is obscured by nonchildren 
+and if no backing store exists.
+If the contents of the window are lost, 
+the X server generates
+.ZN Expose 
+events.
+Moving a mapped window generates
+.ZN Expose 
+events on any formerly obscured windows. 
+.LP
+If the override-redirect flag of the window is 
+.ZN False 
+and some
+other client has selected 
+.ZN SubstructureRedirectMask 
+on the parent, the X server generates a
+.ZN ConfigureRequest 
+event, and no further processing is
+performed.  
+Otherwise, the window is moved.
+.LP
+.ZN XMoveWindow
+can generate a
+.ZN BadWindow 
+error.
+.LP
+The
+.ZN XResizeWindow
+function changes the inside dimensions of the specified window, not including
+its borders.
+This function does not change the window's upper-left coordinate or
+the origin and does not restack the window.
+Changing the size of a mapped window may lose its contents and generate
+.ZN Expose 
+events.
+If a mapped window is made smaller, 
+changing its size generates
+.ZN Expose 
+events on windows that the mapped window formerly obscured.
+.LP
+If the override-redirect flag of the window is 
+.ZN False 
+and some
+other client has selected 
+.ZN SubstructureRedirectMask 
+on the parent, the X server generates a
+.ZN ConfigureRequest 
+event, and no further processing is performed.  
+If either width or height is zero,
+a
+.ZN BadValue
+error results.
+.LP
+.ZN XResizeWindow
+can generate
+.ZN BadValue
+and
+.ZN BadWindow 
+errors.
+.LP
+The
+.ZN XMoveResizeWindow
+function changes the size and location of the specified window 
+without raising it.
+Moving and resizing a mapped window may generate an
+.ZN Expose 
+event on the window.
+Depending on the new size and location parameters,
+moving and resizing a window may generate 
+.ZN Expose 
+events on windows that the window formerly obscured. 
+.LP
+If the override-redirect flag of the window is 
+.ZN False 
+and some
+other client has selected 
+.ZN SubstructureRedirectMask 
+on the parent, the X server generates a
+.ZN ConfigureRequest 
+event, and no further processing is performed.  
+Otherwise, the window size and location are changed.
+.LP
+.ZN XMoveResizeWindow
+can generate
+.ZN BadValue
+and
+.ZN BadWindow 
+errors.
+.LP
+The
+.ZN XSetWindowBorderWidth
+function sets the specified window's border width to the specified width.
+.LP
+.ZN XSetWindowBorderWidth
+can generate a
+.ZN BadWindow 
+error.
+.SH STRUCTURES
+The
+.ZN XWindowChanges
+structure contains:
+.LP
+.LP
+/\&* Configure window value mask bits */
+.TS
+lw(.5i) lw(2.5i) lw(.8i).
+T{
+\&#define
+T}     T{
+.ZN CWX
+T}     T{
+(1<<0)
+T}
+T{
+\&#define
+T}     T{
+.ZN CWY
+T}     T{
+(1<<1)
+T}
+T{
+\&#define
+T}     T{
+.ZN CWWidth
+T}     T{
+(1<<2)
+T}
+T{
+\&#define
+T}     T{
+.ZN CWHeight
+T}     T{
+(1<<3)
+T}
+T{
+\&#define
+T}     T{
+.ZN CWBorderWidth
+T}     T{
+(1<<4)
+T}
+T{
+\&#define
+T}     T{
+.ZN CWSibling
+T}     T{
+(1<<5)
+T}
+T{
+\&#define
+T}     T{
+.ZN CWStackMode
+T}     T{
+(1<<6)
+T}
+.TE
+.IN "XWindowChanges" "" "@DEF@"
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+/\&* Values */
+
+typedef struct {
+       int x, y;
+       int width, height;
+       int border_width;
+       Window sibling;
+       int stack_mode;
+} XWindowChanges;
+.De
+.LP
+The x and y members are used to set the window's x and y coordinates,
+which are relative to the parent's origin
+and indicate the position of the upper-left outer corner of the window.
+The width and height members are used to set the inside size of the window,
+not including the border, and must be nonzero, or a
+.ZN BadValue
+error results.
+Attempts to configure a root window have no effect.
+.LP
+The border_width member is used to set the width of the border in pixels.
+Note that setting just the border width leaves the outer-left corner of the window
+in a fixed position but moves the absolute position of the window's origin.
+If you attempt to set the border-width attribute of an
+.ZN InputOnly
+window nonzero, a
+.ZN BadMatch
+error results. 
+.LP
+The sibling member is used to set the sibling window for stacking operations.
+The stack_mode member is used to set how the window is to be restacked 
+and can be set to
+.ZN Above , 
+.ZN Below , 
+.ZN TopIf , 
+.ZN BottomIf ,
+or 
+.ZN Opposite .
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadMatch
+An
+.ZN InputOnly
+window is used as a Drawable.
+.TP 1i
+.ZN BadMatch
+Some argument or pair of arguments has the correct type and range but fails
+to match in some other way required by the request.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XChangeWindowAttributes(__libmansuffix__),
+XCreateWindow(__libmansuffix__),
+XDestroyWindow(__libmansuffix__),
+XMapWindow(__libmansuffix__),
+XRaiseWindow(__libmansuffix__),
+XUnmapWindow(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XContextDependentDrawing.man b/man/XContextDependentDrawing.man
new file mode 100644 (file)
index 0000000..ba0cd76
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XFontsOfFontSet.__libmansuffix__
diff --git a/man/XContextualDrawing.man b/man/XContextualDrawing.man
new file mode 100644 (file)
index 0000000..ba0cd76
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XFontsOfFontSet.__libmansuffix__
diff --git a/man/XConvertCase.man b/man/XConvertCase.man
new file mode 100644 (file)
index 0000000..32bc404
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XStringToKeysym.__libmansuffix__
diff --git a/man/XConvertSelection.man b/man/XConvertSelection.man
new file mode 100644 (file)
index 0000000..c33cbe8
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetSelectionOwner.__libmansuffix__
diff --git a/man/XCopyArea.man b/man/XCopyArea.man
new file mode 100644 (file)
index 0000000..503cddd
--- /dev/null
@@ -0,0 +1,307 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XCopyArea __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XCopyArea, XCopyPlane \- copy areas
+.SH SYNTAX
+.HP
+int XCopyArea\^(\^Display *\fIdisplay\fP\^, Drawable \fIsrc\fP\^, Drawable
+\fIdest\fP\^, GC \fIgc\fP\^, int \fIsrc_x\fP\^, int \fIsrc_y\fP\^, unsigned
+int \fIwidth\fP\^, unsigned \fIheight\fP\^, int \fIdest_x\fP\^, int
+\fIdest_y\fP\^);
+.HP
+int XCopyPlane\^(\^Display *\fIdisplay\fP\^, Drawable \fIsrc\fP\^, Drawable
+\fIdest\fP\^, GC \fIgc\fP\^, int \fIsrc_x\fP\^, int \fIsrc_y\fP\^, unsigned
+\fIwidth\fP\^, int \fIheight\fP\^, int \fIdest_x\fP\^, int \fIdest_y\fP\^,
+unsigned long \fIplane\fP\^); 
+.SH ARGUMENTS
+.ds Dx , which are relative to the origin of the destination rectangle \
+and specify its upper-left corner
+.IP \fIdest_x\fP 1i
+.br
+.ns
+.IP \fIdest_y\fP 1i
+Specify the x and y coordinates\*(Dx. 
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fIplane\fP 1i
+Specifies the bit plane.
+You must set exactly one bit to 1.
+.IP \fIsrc\fP 1i
+.br
+.ns
+.IP \fIdest\fP 1i
+Specify the source and destination rectangles to be combined. 
+.IP \fIsrc_x\fP 1i
+.br
+.ns
+.IP \fIsrc_y\fP 1i
+Specify the x and y coordinates, 
+which are relative to the origin of the source rectangle
+and specify its upper-left corner.
+.ds Wh , which are the dimensions of both the source and destination rectangles
+.IP \fIwidth\fP 1i
+.br
+.ns
+.IP \fIheight\fP 1i
+Specify the width and height\*(Wh.
+.SH DESCRIPTION
+The
+.ZN XCopyArea
+function combines the specified rectangle of src with the specified rectangle 
+of dest.
+The drawables must have the same root and depth,
+or a
+.ZN BadMatch
+error results.
+.LP
+If regions of the source rectangle are obscured and have not been
+retained in backing store 
+or if regions outside the boundaries of the source drawable are specified, 
+those regions are not copied. 
+Instead, the 
+following occurs on all corresponding destination regions that are either
+visible or are retained in backing store.  
+If the destination is a window with a background other than 
+.ZN None , 
+corresponding regions
+of the destination are tiled with that background
+(with plane-mask of all ones and
+.ZN GXcopy 
+function).
+Regardless of tiling or whether the destination is a window or a pixmap,
+if graphics-exposures is 
+.ZN True ,
+then
+.ZN GraphicsExpose
+events for all corresponding destination regions are generated.
+If graphics-exposures is 
+.ZN True 
+but no
+.ZN GraphicsExpose
+events are generated, a
+.ZN NoExpose 
+event is generated.
+Note that by default graphics-exposures is
+.ZN True
+in new GCs.
+.LP
+This function uses these GC components: function, plane-mask, 
+subwindow-mode, graphics-exposures, clip-x-origin,
+clip-y-origin, and clip-mask.
+.LP
+.ZN XCopyArea
+can generate
+.ZN BadDrawable ,
+.ZN BadGC ,
+and
+.ZN BadMatch 
+errors.
+.LP
+The
+.ZN XCopyPlane
+function uses a single bit plane of the specified source rectangle
+combined with the specified GC to modify the specified rectangle of dest.
+The drawables must have the same root but need not have the same depth.
+If the drawables do not have the same root, a
+.ZN BadMatch
+error results.
+If plane does not have exactly one bit set to 1 and the value of plane
+is not less than %2 sup n%, where \fIn\fP is the depth of src, a
+.ZN BadValue
+error results.
+.LP
+Effectively, 
+.ZN XCopyPlane
+forms a pixmap of the same depth as the rectangle of dest and with a
+size specified by the source region. 
+It uses the foreground/background pixels in the GC (foreground
+everywhere the bit plane in src contains a bit set to 1,
+background everywhere the bit plane in src contains a bit set to 0)
+and the equivalent of a 
+.ZN CopyArea
+protocol request is performed with all the same exposure semantics.
+This can also be thought of as using the specified region of the source 
+bit plane as a stipple with a fill-style of
+.ZN FillOpaqueStippled
+for filling a rectangular area of the destination.
+.LP
+This function uses these GC components: function, plane-mask, foreground,
+background, subwindow-mode, graphics-exposures, clip-x-origin, clip-y-origin,
+and clip-mask.
+.LP
+.ZN XCopyPlane
+can generate
+.ZN BadDrawable ,
+.ZN BadGC ,
+.ZN BadMatch ,
+and
+.ZN BadValue 
+errors.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadDrawable
+A value for a Drawable argument does not name a defined Window or Pixmap.
+.TP 1i
+.ZN BadGC
+A value for a GContext argument does not name a defined GContext.
+.TP 1i
+.ZN BadMatch
+An
+.ZN InputOnly
+window is used as a Drawable.
+.TP 1i
+.ZN BadMatch
+Some argument or pair of arguments has the correct type and range but fails
+to match in some other way required by the request.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.SH "SEE ALSO"
+XClearArea(__libmansuffix__)
+.br
+\fIXlib \- C Language X Interface\fP
diff --git a/man/XCopyColormapAndFree.man b/man/XCopyColormapAndFree.man
new file mode 100644 (file)
index 0000000..f9fb228
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XCreateColormap.__libmansuffix__
diff --git a/man/XCopyGC.man b/man/XCopyGC.man
new file mode 100644 (file)
index 0000000..927a6a9
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XCreateGC.__libmansuffix__
diff --git a/man/XCopyPlane.man b/man/XCopyPlane.man
new file mode 100644 (file)
index 0000000..db86e7e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XCopyArea.__libmansuffix__
diff --git a/man/XCreateBitmapFromData.man b/man/XCreateBitmapFromData.man
new file mode 100644 (file)
index 0000000..ff0c276
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XReadBitmapFile.__libmansuffix__
diff --git a/man/XCreateColormap.man b/man/XCreateColormap.man
new file mode 100644 (file)
index 0000000..0a51739
--- /dev/null
@@ -0,0 +1,367 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XCreateColormap __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XCreateColormap, XCopyColormapAndFree, XFreeColormap, XColor \- create, copy, or destroy colormaps and color structure
+.SH SYNTAX
+.HP
+Colormap XCreateColormap\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^,
+Visual *\fIvisual\fP\^, int \fIalloc\fP\^);
+.HP
+Colormap XCopyColormapAndFree\^(\^Display *\fIdisplay\fP\^, Colormap
+\fIcolormap\fP\^); 
+.HP
+int XFreeColormap\^(\^Display *\fIdisplay\fP\^, Colormap \fIcolormap\fP\^); 
+.SH ARGUMENTS
+.IP \fIalloc\fP 1i
+Specifies the colormap entries to be allocated.
+You can pass 
+.ZN AllocNone 
+or 
+.ZN AllocAll .
+.ds Cm that you want to create, copy, set, or destroy
+.IP \fIcolormap\fP 1i
+Specifies the colormap \*(Cm.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIvisual\fP 1i
+Specifies a visual type supported on the screen.
+If the visual type is not one supported by the screen, 
+a
+.ZN BadMatch
+error results.
+.ds Wi on whose screen you want to create a colormap
+.IP \fIw\fP 1i
+Specifies the window \*(Wi.
+.SH DESCRIPTION
+The
+.ZN XCreateColormap
+function creates a colormap of the specified visual type for the screen 
+on which the specified window resides and returns the colormap ID 
+associated with it.
+Note that the specified window is only used to determine the screen.
+.LP
+The initial values of the colormap entries are undefined for the 
+visual classes
+.ZN GrayScale ,
+.ZN PseudoColor ,
+and
+.ZN DirectColor .
+For
+.ZN StaticGray ,
+.ZN StaticColor ,
+and
+.ZN TrueColor ,
+the entries have defined values,
+but those values are specific to the visual and are not defined by X.
+For
+.ZN StaticGray ,
+.ZN StaticColor ,
+and
+.ZN TrueColor ,
+alloc must be
+.ZN AllocNone ,
+or a
+.ZN BadMatch
+error results.
+For the other visual classes,
+if alloc is
+.ZN AllocNone ,
+the colormap initially has no allocated entries,
+and clients can allocate them.
+For information about the visual types,
+see section 3.1.
+.LP
+If alloc is
+.ZN AllocAll ,
+the entire colormap is allocated writable.
+The initial values of all allocated entries are undefined.
+For
+.ZN GrayScale
+and
+.ZN PseudoColor ,
+the effect is as if an
+.ZN XAllocColorCells
+call returned all pixel values from zero to N \- 1,
+where N is the colormap entries value in the specified visual.
+For
+.ZN DirectColor ,
+the effect is as if an
+.ZN XAllocColorPlanes
+call returned a pixel value of zero and red_mask, green_mask, 
+and blue_mask values containing the same bits as the corresponding
+masks in the specified visual.
+However, in all cases,
+none of these entries can be freed by using
+.ZN XFreeColors .
+.LP
+.ZN XCreateColormap
+can generate
+.ZN BadAlloc ,
+.ZN BadMatch ,
+.ZN BadValue ,
+and
+.ZN BadWindow 
+errors.
+.LP
+The
+.ZN XCopyColormapAndFree
+function creates a colormap of the same visual type and for the same screen
+as the specified colormap and returns the new colormap ID.
+It also moves all of the client's existing allocation from the specified
+colormap to the new colormap with their color values intact 
+and their read-only or writable characteristics intact and frees those entries 
+in the specified colormap.
+Color values in other entries in the new colormap are undefined.
+If the specified colormap was created by the client with alloc set to
+.ZN AllocAll ,
+the new colormap is also created with 
+.ZN AllocAll ,
+all color values for all entries are copied from the specified colormap,
+and then all entries in the specified colormap are freed.
+If the specified colormap was not created by the client with
+.ZN AllocAll ,
+the allocations to be moved are all those pixels and planes
+that have been allocated by the client using
+.ZN XAllocColor ,
+.ZN XAllocNamedColor ,
+.ZN XAllocColorCells ,
+or
+.ZN XAllocColorPlanes
+and that have not been freed since they were allocated.
+.LP
+.ZN XCopyColormapAndFree
+can generate
+.ZN BadAlloc
+and
+.ZN BadColor 
+errors.
+.LP
+The
+.ZN XFreeColormap
+function deletes the association between the colormap resource ID 
+and the colormap and frees the colormap storage.
+However, this function has no effect on the default colormap for a screen.
+If the specified colormap is an installed map for a screen,
+it is uninstalled (see
+.ZN XUninstallColormap ).
+If the specified colormap is defined as the colormap for a window (by
+.ZN XCreateWindow ,
+.ZN XSetWindowColormap ,
+or
+.ZN XChangeWindowAttributes ),
+.ZN XFreeColormap
+changes the colormap associated with the window to
+.ZN None 
+and generates a
+.ZN ColormapNotify
+event.
+X does not define the colors displayed for a window with a colormap of
+.ZN None .
+.LP
+.ZN XFreeColormap
+can generate a
+.ZN BadColor 
+error.
+.SH STRUCTURES
+The
+.ZN XColor
+structure contains:
+.LP
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+typedef struct {
+       unsigned long pixel;    /\&* pixel value */
+       unsigned short red, green, blue;        /\&* rgb values */
+       char flags;     /\&* DoRed, DoGreen, DoBlue */  
+       char pad;
+} XColor;
+.De
+.LP
+The red, green, and blue values are always in the range 0 to 65535
+inclusive, independent of the number of bits actually used in the
+display hardware.
+The server scales these values down to the range used by the hardware.
+Black is represented by (0,0,0), 
+and white is represented by (65535,65535,65535).
+.IN "Color"
+In some functions,
+the flags member controls which of the red, green, and blue members is used 
+and can be the inclusive OR of zero or more of
+.ZN DoRed ,
+.ZN DoGreen ,
+and 
+.ZN DoBlue .
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadColor
+A value for a Colormap argument does not name a defined Colormap.
+.TP 1i
+.ZN BadMatch
+An
+.ZN InputOnly
+window is used as a Drawable.
+.TP 1i
+.ZN BadMatch
+Some argument or pair of arguments has the correct type and range but fails
+to match in some other way required by the request.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XAllocColor(__libmansuffix__),
+XChangeWindowAttributes(__libmansuffix__),
+XCreateWindow(__libmansuffix__),
+XQueryColor(__libmansuffix__),
+XStoreColors(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XCreateFontCursor.man b/man/XCreateFontCursor.man
new file mode 100644 (file)
index 0000000..ba8431e
--- /dev/null
@@ -0,0 +1,316 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XCreateFontCursor __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XCreateFontCursor, XCreatePixmapCursor, XCreateGlyphCursor \- create cursors
+.SH SYNTAX
+\&#include <X11/cursorfont.h>
+.HP
+Cursor XCreateFontCursor\^(\^Display *\fIdisplay\fP\^, unsigned int
+\fIshape\fP\^); 
+.HP
+Cursor XCreatePixmapCursor\^(\^Display *\fIdisplay\fP\^, Pixmap
+\fIsource\fP\^, Pixmap \fImask\fP\^, XColor *\fIforeground_color\fP\^, XColor
+*\fIbackground_color\fP\^, unsigned int \fIx\fP\^, unsigned int \fIy\fP\^);
+.HP
+Cursor XCreateGlyphCursor\^(\^Display *\fIdisplay\fP\^, Font
+\fIsource_font\fP\^, Font \fImask_font\fP\^, unsigned int \fIsource_char\fP\^,
+unsigned int \fImask_char\fP\^, XColor *\fIforeground_color\fP\^, XColor
+*\fIbackground_color\fP\^); 
+.SH ARGUMENTS
+.IP \fIbackground_color\fP 1i
+Specifies the RGB values for the background of the source.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIforeground_color\fP 1i
+Specifies the RGB values for the foreground of the source. 
+.IP \fImask\fP 1i
+Specifies the cursor's source bits to be displayed or
+.ZN None .
+.IP \fImask_char\fP 1i
+Specifies the glyph character for the mask. 
+.IP \fImask_font\fP 1i
+Specifies the font for the mask glyph or
+.ZN None .
+.IP \fIshape\fP 1i
+Specifies the shape of the cursor.
+.IP \fIsource\fP 1i
+Specifies the shape of the source cursor.
+.\" *** JIM: NEED TO CHECK THIS. ***
+.IP \fIsource_char\fP 1i
+Specifies the character glyph for the source.
+.IP \fIsource_font\fP 1i
+Specifies the font for the source glyph.
+.ds Xy , which indicate the hotspot relative to the source's origin
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.SH DESCRIPTION
+X provides a set of standard cursor shapes in a special font named
+cursor.
+Applications are encouraged to use this interface for their cursors
+because the font can be customized for the individual display type.
+The shape argument specifies which glyph of the standard fonts
+to use.
+.LP
+The hotspot comes from the information stored in the cursor font.
+The initial colors of a cursor are a black foreground and a white
+background (see
+.ZN XRecolorCursor ).
+.LP
+.ZN XCreateFontCursor
+can generate
+.ZN BadAlloc
+and
+.ZN BadValue 
+errors.
+.LP
+The
+.ZN XCreatePixmapCursor
+function creates a cursor and returns the cursor ID associated with it.
+The foreground and background RGB values must be specified using
+foreground_color and background_color,
+even if the X server only has a
+.ZN StaticGray
+or
+.ZN GrayScale
+screen.
+The foreground color is used for the pixels set to 1 in the
+source, and the background color is used for the pixels set to 0.
+Both source and mask, if specified, must have depth one (or a 
+.ZN BadMatch
+error results) but can have any root.
+The mask argument defines the shape of the cursor.
+The pixels set to 1 in the mask define which source pixels are displayed,
+and the pixels set to 0 define which pixels are ignored.
+If no mask is given, 
+all pixels of the source are displayed.
+The mask, if present, must be the same size as the pixmap defined by the 
+source argument, or a
+.ZN BadMatch
+error results.
+The hotspot must be a point within the source,
+or a
+.ZN BadMatch
+error results.
+.LP
+The components of the cursor can be transformed arbitrarily to meet
+display limitations.
+The pixmaps can be freed immediately if no further explicit references
+to them are to be made.
+Subsequent drawing in the source or mask pixmap has an undefined effect on the
+cursor.
+The X server might or might not make a copy of the pixmap.
+.LP
+.ZN XCreatePixmapCursor
+can generate
+.ZN BadAlloc
+and
+.ZN BadPixmap 
+errors.
+.LP
+The
+.ZN XCreateGlyphCursor
+function is similar to
+.ZN XCreatePixmapCursor
+except that the source and mask bitmaps are obtained from the specified 
+font glyphs.
+The source_char must be a defined glyph in source_font, 
+or a
+.ZN BadValue
+error results.
+If mask_font is given, 
+mask_char must be a defined glyph in mask_font,
+or a
+.ZN BadValue
+error results.
+The mask_font and character are optional.
+The origins of the source_char and mask_char (if defined) glyphs are
+positioned coincidently and define the hotspot. 
+The source_char and mask_char need not have the same bounding box metrics, 
+and there is no restriction on the placement of the hotspot relative to the bounding
+boxes. 
+If no mask_char is given, all pixels of the source are displayed.
+You can free the fonts immediately by calling
+.ZN XFreeFont
+if no further explicit references to them are to be made. 
+.LP
+For 2-byte matrix fonts, 
+the 16-bit value should be formed with the byte1
+member in the most significant byte and the byte2 member in the 
+least significant byte.
+.LP
+.ZN XCreateGlyphCursor
+can generate
+.ZN BadAlloc ,
+.ZN BadFont ,
+and
+.ZN BadValue 
+errors.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadFont
+A value for a Font or GContext argument does not name a defined Font.
+.TP 1i
+.ZN BadMatch
+Some argument or pair of arguments has the correct type and range but fails
+to match in some other way required by the request.
+.TP 1i
+.ZN BadPixmap
+A value for a Pixmap argument does not name a defined Pixmap.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.SH "SEE ALSO"
+XDefineCursor(__libmansuffix__),
+XLoadFont(__libmansuffix__),
+XRecolorCursor(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XCreateFontSet.man b/man/XCreateFontSet.man
new file mode 100644 (file)
index 0000000..7e442d9
--- /dev/null
@@ -0,0 +1,375 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XCreateFontSet __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XCreateFontSet, XFreeFontSet \- create and free an international text drawing font set
+.SH SYNTAX
+.HP
+XFontSet XCreateFontSet\^(\^Display *\fIdisplay\fP\^, char
+*\fIbase_font_name_list\fP\^, char ***\fImissing_charset_list_return\fP\^, int
+*\fImissing_charset_count_return\fP\^, char **\fIdef_string_return\fP\^);
+.HP
+void XFreeFontSet\^(\^Display *\fIdisplay\fP\^, XFontSet \fIfont_set\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIbase_font_name_list\fP 1i
+Specifies the base font names.
+.IP \fIdef_string_return\fP 1i
+Returns the string drawn for missing charsets.
+.IP \fIfont_set\fP 1i
+Specifies the font set.
+.IP \fImissing_charset_count_return\fP 1i
+Returns the number of missing charsets.
+.IP \fImissing_charset_list_return\fP 1i
+Returns the missing charsets.
+.SH DESCRIPTION
+The 
+.ZN XCreateFontSet
+function creates a font set for the specified display.
+The font set is bound to the current locale when 
+.ZN XCreateFontSet
+is called.
+The font set may be used in subsequent calls to obtain font
+and character information and to image text in the locale of the font set.
+.LP
+The base_font_name_list argument is a list of base font names
+that Xlib uses to load the fonts needed for the locale.
+The base font names are a comma-separated list.
+The string is null-terminated
+and is assumed to be in the Host Portable Character Encoding; 
+otherwise, the result is implementation-dependent.
+White space immediately on either side of a separating comma is ignored.
+.LP
+Use of XLFD font names permits Xlib to obtain the fonts needed for a
+variety of locales from a single locale-independent base font name.
+The single base font name should name a family of fonts whose members
+are encoded in the various charsets needed by the locales of interest.
+.LP
+An XLFD base font name can explicitly name a charset needed for the locale.
+This allows the user to specify an exact font for use with a charset required
+by a locale, fully controlling the font selection.
+.LP
+If a base font name is not an XLFD name,
+Xlib will attempt to obtain an XLFD name from the font properties
+for the font.
+If this action is successful in obtaining an XLFD name, the
+.ZN XBaseFontNameListOfFontSet
+function will return this XLFD name instead of the client-supplied name.
+.LP
+Xlib uses the following algorithm to select the fonts
+that will be used to display text with the 
+.ZN XFontSet .
+.LP
+For each font charset required by the locale,
+the base font name list is searched for the first appearance of one 
+of the following cases that names a set of fonts that exist at the server:
+.IP \(bu 5
+The first XLFD-conforming base font name that specifies the required
+charset or a superset of the required charset in its 
+.ZN CharSetRegistry
+and 
+.ZN CharSetEncoding
+fields.
+The implementation may use a base font name whose specified charset
+is a superset of the required charset, for example,
+an ISO8859-1 font for an ASCII charset.
+.IP \(bu 5
+The first set of one or more XLFD-conforming base font names
+that specify one or more charsets that can be remapped to support the
+required charset.
+The Xlib implementation may recognize various mappings 
+from a required charset to one or more other charsets
+and use the fonts for those charsets.
+For example, JIS Roman is ASCII with tilde and backslash replaced 
+by yen and overbar;
+Xlib may load an ISO8859-1 font to support this character set
+if a JIS Roman font is not available.
+.IP \(bu 5
+The first XLFD-conforming font name or the first non-XLFD font name
+for which an XLFD font name can be obtained, combined with the
+required charset (replacing the 
+.ZN CharSetRegistry
+and
+.ZN CharSetEncoding
+fields in the XLFD font name).
+As in case 1,
+the implementation may use a charset that is a superset
+of the required charset.
+.IP \(bu 5
+The first font name that can be mapped in some implementation-dependent
+manner to one or more fonts that support imaging text in the charset.
+.LP
+For example, assume that a locale required the charsets:
+.LP
+.Ds 0
+ISO8859-1
+JISX0208.1983
+JISX0201.1976
+GB2312-1980.0
+.De
+.LP
+The user could supply a base_font_name_list that explicitly specifies the
+charsets, ensuring that specific fonts are used if they exist.
+For example:
+.LP
+.Ds 0
+"-JIS-Fixed-Medium-R-Normal--26-180-100-100-C-240-JISX0208.1983-0,\\
+-JIS-Fixed-Medium-R-Normal--26-180-100-100-C-120-JISX0201.1976-0,\\
+-GB-Fixed-Medium-R-Normal--26-180-100-100-C-240-GB2312-1980.0,\\
+-Adobe-Courier-Bold-R-Normal--25-180-75-75-M-150-ISO8859-1"
+.De
+.LP
+Alternatively, the user could supply a base_font_name_list
+that omits the charsets,
+letting Xlib select font charsets required for the locale.
+For example:
+.LP
+.Ds 0
+"-JIS-Fixed-Medium-R-Normal--26-180-100-100-C-240,\\
+-JIS-Fixed-Medium-R-Normal--26-180-100-100-C-120,\\
+-GB-Fixed-Medium-R-Normal--26-180-100-100-C-240,\\
+-Adobe-Courier-Bold-R-Normal--25-180-100-100-M-150"
+.De
+.LP
+Alternatively, the user could simply supply a single base font name
+that allows Xlib to select from all available fonts
+that meet certain minimum XLFD property requirements.
+For example:
+.LP
+.Ds 0
+"-*-*-*-R-Normal--*-180-100-100-*-*"
+.De
+.LP
+If 
+.ZN XCreateFontSet
+is unable to create the font set, 
+either because there is insufficient memory or because the current locale
+is not supported,
+.ZN XCreateFontSet
+returns NULL, missing_charset_list_return is set to NULL,
+and missing_charset_count_return
+is set to zero.
+If fonts exist for all of the charsets required by the current locale,
+.ZN XCreateFontSet
+returns a valid
+.ZN XFontSet ,
+missing_charset_list_return is set to NULL,
+and missing_charset_count_return is set to zero.
+.LP
+If no font exists for one or more of the required charsets,
+.ZN XCreateFontSet
+sets missing_charset_list_return to a
+list of one or more null-terminated charset names for which no font exists
+and sets missing_charset_count_return to the number of missing fonts.
+The charsets are from the list of the required charsets for
+the encoding of the locale and do not include any charsets to which Xlib
+may be able to remap a required charset.
+.LP
+If no font exists for any of the required charsets
+or if the locale definition in Xlib requires that a font exist
+for a particular charset and a font is not found for that charset, 
+.ZN XCreateFontSet
+returns NULL.
+Otherwise, 
+.ZN XCreateFontSet
+returns a valid 
+.ZN XFontSet
+to font_set.
+.LP
+When an Xmb/wc drawing or measuring function is called with an
+.ZN XFontSet
+that has missing charsets, some characters in the locale will not be
+drawable.
+If def_string_return is non-NULL,
+.ZN XCreateFontSet
+returns a pointer to a string that represents the glyphs
+that are drawn with this 
+.ZN XFontSet
+when the charsets of the available fonts do not include all font glyphs
+required to draw a codepoint.
+The string does not necessarily consist of valid characters 
+in the current locale and is not necessarily drawn with
+the fonts loaded for the font set,
+but the client can draw and measure the default glyphs
+by including this string in a string being drawn or measured with the 
+.ZN XFontSet .
+.LP
+If the string returned to def_string_return is the empty string ("\^"),
+no glyphs are drawn, and the escapement is zero.
+The returned string is null-terminated.
+It is owned by Xlib and should not be modified or freed by the client.
+It will be freed by a call to 
+.ZN XFreeFontSet
+with the associated 
+.ZN XFontSet .
+Until freed, its contents will not be modified by Xlib.
+.LP
+The client is responsible for constructing an error message from the
+missing charset and default string information and may choose to continue
+operation in the case that some fonts did not exist.
+.LP
+The returned 
+.ZN XFontSet
+and missing charset list should be freed with 
+.ZN XFreeFontSet
+and
+.ZN XFreeStringList ,
+respectively.
+The client-supplied base_font_name_list may be freed 
+by the client after calling 
+.ZN XCreateFontSet .
+.LP
+The
+.ZN XFreeFontSet
+function frees the specified font set.
+The associated base font name list, font name list, 
+.ZN XFontStruct
+list, and 
+.ZN XFontSetExtents , 
+if any, are freed.
+.SH "SEE ALSO"
+XExtentsofFontSet(__libmansuffix__),
+XFontsOfFontSet(__libmansuffix__),
+XFontSetExtents(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XCreateGC.man b/man/XCreateGC.man
new file mode 100644 (file)
index 0000000..72a31f0
--- /dev/null
@@ -0,0 +1,1203 @@
+'\" t
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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
+'\" t
+.TH XCreateGC __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XCreateGC, XCopyGC, XChangeGC, XGetGCValues, XFreeGC, XGContextFromGC, XGCValues \- create or free graphics contexts and graphics context structure
+.SH SYNTAX
+.HP
+GC XCreateGC\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, unsigned long
+\fIvaluemask\fP\^, XGCValues *\^\fIvalues\fP\^); 
+.HP
+int XCopyGC\^(\^Display *\fIdisplay\fP\^, GC \fIsrc\fP\^,
+unsigned long \fIvaluemask\fP\^, GC \fIdest\fP\^); 
+.HP
+int XChangeGC\^(\^Display *\fIdisplay\fP\^, GC \fIgc\fP\^, unsigned long
+\fIvaluemask\fP\^, XGCValues *\^\fIvalues\fP\^); 
+.HP
+Status XGetGCValues\^(\^Display *\fIdisplay\fP\^, GC \fIgc\fP\^, unsigned long
+\fIvaluemask\fP\^, XGCValues *\fIvalues_return\fP\^); 
+.HP
+int XFreeGC\^(\^Display *\fIdisplay\fP\^, GC \fIgc\fP\^); 
+.HP
+GContext XGContextFromGC\^(\^GC \fIgc\fP\^); 
+.SH ARGUMENTS
+.IP \fId\fP 1i
+Specifies the drawable. 
+.IP \fIdest\fP 1i
+Specifies the destination GC.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fIsrc\fP 1i
+Specifies the components of the source GC.
+.ds Vm set, copied, changed, or returned 
+.IP \fIvaluemask\fP 1i
+Specifies which components in the GC are to be \*(Vm. 
+This argument is the bitwise inclusive OR of zero or more of the valid
+GC component mask bits.
+.IP \fIvalues\fP 1i
+Specifies any values as specified by the valuemask.
+.IP \fIvalues_return\fP 1i
+Returns the GC values in the specified
+.ZN XGCValues 
+structure.
+.SH DESCRIPTION
+The
+.ZN XCreateGC
+function creates a graphics context and returns a GC.
+The GC can be used with any destination drawable having the same root
+and depth as the specified drawable.
+Use with other drawables results in a
+.ZN BadMatch
+error.
+.LP
+.ZN XCreateGC
+can generate
+.ZN BadAlloc ,
+.ZN BadDrawable ,
+.ZN BadFont ,
+.ZN BadMatch ,
+.ZN BadPixmap ,
+and
+.ZN BadValue 
+errors.
+.LP
+The
+.ZN XCopyGC
+function copies the specified components from the source GC
+to the destination GC.
+The source and destination GCs must have the same root and depth,
+or a
+.ZN BadMatch
+error results.
+The valuemask specifies which component to copy, as for
+.ZN XCreateGC .
+.LP
+.ZN XCopyGC
+can generate
+.ZN BadAlloc ,
+.ZN BadGC ,
+and
+.ZN BadMatch
+errors.
+.LP
+The
+.ZN XChangeGC
+function changes the components specified by valuemask for
+the specified GC.
+The values argument contains the values to be set.
+The values and restrictions are the same as for 
+.ZN XCreateGC .
+Changing the clip-mask overrides any previous 
+.ZN XSetClipRectangles
+request on the context. 
+Changing the dash-offset or dash-list
+overrides any previous 
+.ZN XSetDashes
+request on the context.
+The order in which components are verified and altered is server dependent.
+If an error is generated, a subset of the components may have been altered.
+.LP
+.ZN XChangeGC
+can generate
+.ZN BadAlloc ,
+.ZN BadFont ,
+.ZN BadGC ,
+.ZN BadMatch ,
+.ZN BadPixmap ,
+and
+.ZN BadValue 
+errors.
+.LP
+The
+.ZN XGetGCValues
+function returns the components specified by valuemask for the specified GC.
+If the valuemask contains a valid set of GC mask bits
+.Pn ( GCFunction ,
+.ZN GCPlaneMask ,
+.ZN GCForeground ,
+.ZN GCBackground ,
+.ZN GCLineWidth ,
+.ZN GCLineStyle ,
+.ZN GCCapStyle ,
+.ZN GCJoinStyle ,
+.ZN GCFillStyle ,
+.ZN GCFillRule ,
+.ZN GCTile ,
+.ZN GCStipple ,
+.ZN GCTileStipXOrigin ,
+.ZN GCTileStipYOrigin ,
+.ZN GCFont ,
+.ZN GCSubwindowMode ,
+.ZN GCGraphicsExposures ,
+.ZN GCClipXOrigin ,
+.ZN GCCLipYOrigin ,
+.ZN GCDashOffset ,
+or
+.ZN GCArcMode )
+and no error occurs,
+.ZN XGetGCValues
+sets the requested components in values_return and returns a nonzero status.
+Otherwise, it returns a zero status.
+Note that the clip-mask and dash-list (represented by the
+.ZN GCClipMask
+and 
+.ZN GCDashList
+bits, respectively, in the valuemask)
+cannot be requested.
+Also note that an invalid resource ID (with one or more of the three
+most significant bits set to 1) will be returned for
+.ZN GCFont ,
+.ZN GCTile ,
+and
+.ZN GCStipple
+if the component has never been explicitly set by the client.
+.LP
+The
+.ZN XFreeGC
+function destroys the specified GC as well as all the associated storage.
+.LP
+.ZN XFreeGC
+can generate a
+.ZN BadGC 
+error.
+.SH STRUCTURES
+The
+.ZN XGCValues
+structure contains:
+.LP
+.LP
+/\&* GC attribute value mask bits */
+.TS
+lw(.5i) lw(2.5i) lw(.75i).
+T{
+\&#define
+T}     T{
+.ZN GCFunction
+T}     T{
+(1L<<0)
+T}
+T{
+\&#define
+T}     T{
+.ZN GCPlaneMask
+T}     T{
+(1L<<1)
+T}
+T{
+\&#define
+T}     T{
+.ZN GCForeground
+T}     T{
+(1L<<2)
+T}
+T{
+\&#define
+T}     T{
+.ZN GCBackground
+T}     T{
+(1L<<3)
+T}
+T{
+\&#define
+T}     T{
+.ZN GCLineWidth
+T}     T{
+(1L<<4)
+T}
+T{
+\&#define
+T}     T{
+.ZN GCLineStyle
+T}     T{
+(1L<<5)
+T}
+T{
+\&#define
+T}     T{
+.ZN GCCapStyle
+T}     T{
+(1L<<6)
+T}
+T{
+\&#define
+T}     T{
+.ZN GCJoinStyle
+T}     T{
+(1L<<7)
+T}
+T{
+\&#define
+T}     T{
+.ZN GCFillStyle
+T}     T{
+(1L<<8)
+T}
+T{
+\&#define
+T}     T{
+.ZN GCFillRule
+T}     T{
+(1L<<9)
+T}
+T{
+\&#define
+T}     T{
+.ZN GCTile
+T}     T{
+(1L<<10)
+T}
+T{
+\&#define
+T}     T{
+.ZN GCStipple
+T}     T{
+(1L<<11)
+T}
+T{
+\&#define
+T}     T{
+.ZN GCTileStipXOrigin
+T}     T{
+(1L<<12)
+T}
+T{
+\&#define
+T}     T{
+.ZN GCTileStipYOrigin
+T}     T{
+(1L<<13)
+T}
+T{
+\&#define
+T}     T{
+.ZN GCFont
+T}     T{
+(1L<<14)
+T}
+T{
+\&#define
+T}     T{
+.ZN GCSubwindowMode
+T}     T{
+(1L<<15)
+T}
+T{
+\&#define
+T}     T{
+.ZN GCGraphicsExposures
+T}     T{
+(1L<<16)
+T}
+T{
+\&#define
+T}     T{
+.ZN GCClipXOrigin
+T}     T{
+(1L<<17)
+T}
+T{
+\&#define
+T}     T{
+.ZN GCClipYOrigin
+T}     T{
+(1L<<18)
+T}
+T{
+\&#define
+T}     T{
+.ZN GCClipMask
+T}     T{
+(1L<<19)
+T}
+T{
+\&#define
+T}     T{
+.ZN GCDashOffset
+T}     T{
+(1L<<20)
+T}
+T{
+\&#define
+T}     T{
+.ZN GCDashList
+T}     T{
+(1L<<21)
+T}
+T{
+\&#define
+T}     T{
+.ZN GCArcMode
+T}     T{
+(1L<<22)
+T}
+.TE
+.IN "XGCValues" "" "@DEF@"
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+/\&* Values */
+
+typedef struct {
+       int function;   /\&* logical operation */
+       unsigned long plane_mask;       /\&* plane mask */
+       unsigned long foreground;       /\&* foreground pixel */
+       unsigned long background;       /\&* background pixel */
+       int line_width; /\&* line width (in pixels) */
+       int line_style; /\&* LineSolid, LineOnOffDash, LineDoubleDash */
+       int cap_style;  /\&* CapNotLast, CapButt, CapRound, CapProjecting */
+       int join_style; /\&* JoinMiter, JoinRound, JoinBevel */
+       int fill_style; /\&* FillSolid, FillTiled, FillStippled FillOpaqueStippled*/
+       int fill_rule;  /\&* EvenOddRule, WindingRule */
+       int arc_mode;   /\&* ArcChord, ArcPieSlice */
+       Pixmap tile;    /\&* tile pixmap for tiling operations */
+       Pixmap stipple; /\&* stipple 1 plane pixmap for stippling */
+       int ts_x_origin;        /\&* offset for tile or stipple operations */
+       int ts_y_origin;
+       Font font;      /\&* default text font for text operations */
+       int subwindow_mode;     /\&* ClipByChildren, IncludeInferiors */
+       Bool graphics_exposures;        /\&* boolean, should exposures be generated */
+       int clip_x_origin;      /\&* origin for clipping */
+       int clip_y_origin;
+       Pixmap clip_mask;       /\&* bitmap clipping; other calls for rects */
+       int dash_offset;        /\&* patterned/dashed line information */
+       char dashes;
+} XGCValues;
+.De
+.LP
+The function attributes of a GC are used when you update a section of
+a drawable (the destination) with bits from somewhere else (the source).  
+The function in a GC defines how the new destination bits are to be
+computed from the source bits and the old destination bits.
+.ZN GXcopy
+is typically the most useful because it will work on a color display,
+but special applications may use other functions,
+particularly in concert with particular planes of a color display.
+The 16 GC functions, defined in 
+.hN X11/X.h ,
+are:
+.\" are listed in Table 5-1 along with the 
+.\"the associated hexadecimal code
+.\" and operation.
+.\".CP T 1
+.\"Display Functions
+.TS H
+lw(1.5i) cw(.5i) lw(2i).
+_
+.sp 6p
+.B
+Function Name  Value   Operation
+.sp 6p
+_
+.sp 6p
+.TH
+T{
+.ZN GXclear
+T}     T{
+0x0
+T}     T{
+0
+T}
+T{
+.ZN GXand
+T}     T{
+0x1
+T}     T{
+src AND dst
+T}
+T{
+.ZN GXandReverse
+T}     T{
+0x2
+T}     T{
+src AND NOT dst
+T}
+T{
+.ZN GXcopy
+T}     T{
+0x3
+T}     T{
+src
+T}
+T{
+.ZN GXandInverted
+T}     T{
+0x4
+T}     T{
+(NOT src) AND dst
+T}
+T{
+.ZN GXnoop
+T}     T{
+0x5
+T}     T{
+dst
+T}
+T{
+.ZN GXxor
+T}     T{
+0x6
+T}     T{
+src XOR dst
+T}
+T{
+.ZN GXor
+T}     T{
+0x7
+T}     T{
+src OR dst
+T}
+T{
+.ZN GXnor
+T}     T{
+0x8
+T}     T{
+(NOT src) AND (NOT dst)
+T}
+T{
+.ZN GXequiv
+T}     T{
+0x9
+T}     T{
+(NOT src) XOR dst
+T}
+T{
+.ZN GXinvert
+T}     T{
+0xa
+T}     T{
+NOT dst
+T}
+T{
+.ZN GXorReverse
+T}     T{
+0xb
+T}     T{
+src OR (NOT dst)
+T}
+T{
+.ZN GXcopyInverted
+T}     T{
+0xc
+T}     T{
+NOT src
+T}
+T{
+.ZN GXorInverted
+T}     T{
+0xd
+T}     T{
+(NOT src) OR dst
+T}
+T{
+.ZN GXnand
+T}     T{
+0xe
+T}     T{
+(NOT src) OR (NOT dst)
+T}
+T{
+.ZN GXset
+T}     T{
+0xf
+T}     T{
+1
+T}
+.sp 6p
+_
+.TE
+.LP
+Many graphics operations depend on either pixel values or planes in a GC.
+.IN "Pixel value"
+The planes attribute is of type long, and it specifies which planes of the
+destination are to be modified, one bit per plane.
+.IN "Plane" "mask"
+A monochrome display has only one plane and
+will be the least significant bit of the word.
+As planes are added to the display hardware, they will occupy more
+significant bits in the plane mask.
+.LP
+In graphics operations, given a source and destination pixel, 
+the result is computed bitwise on corresponding bits of the pixels.
+That is, a Boolean operation is performed in each bit plane.  
+The plane_mask restricts the operation to a subset of planes.
+A macro constant
+.ZN AllPlanes
+can be used to refer to all planes of the screen simultaneously.
+The result is computed by the following:
+.LP
+.Ds 
+((src FUNC dst) AND plane-mask) OR (dst AND (NOT plane-mask))
+.De
+.LP
+Range checking is not performed on the values for foreground,
+background, or plane_mask.
+They are simply truncated to the appropriate
+number of bits.
+The line-width is measured in pixels and either can be greater than or equal to
+one (wide line) or can be the special value zero (thin line).
+.LP
+Wide lines are drawn centered on the path described by the graphics request.
+Unless otherwise specified by the join-style or cap-style,
+the bounding box of a wide line with endpoints [x1, y1], [x2, y2] and
+width w is a rectangle with vertices at the following real coordinates:
+.LP
+.Ds
+.TA .5i 2.5i
+.ta .5i 2.5i
+[x1-(w*sn/2), y1+(w*cs/2)], [x1+(w*sn/2), y1-(w*cs/2)],
+[x2-(w*sn/2), y2+(w*cs/2)], [x2+(w*sn/2), y2-(w*cs/2)]
+.De
+.LP
+Here sn is the sine of the angle of the line,
+and cs is the cosine of the angle of the line.
+A pixel is part of the line and so is drawn
+if the center of the pixel is fully inside the bounding box
+(which is viewed as having infinitely thin edges).
+If the center of the pixel is exactly on the bounding box,
+it is part of the line if and only if the interior is immediately to its right
+(x increasing direction).
+Pixels with centers on a horizontal edge are a special case and are part of
+the line if and only if the interior or the boundary is immediately below 
+(y increasing direction) and the interior or the boundary is immediately
+to the right (x increasing direction).
+.LP
+Thin lines (zero line-width) are one-pixel-wide lines drawn using an
+unspecified, device-dependent algorithm.
+There are only two constraints on this algorithm. 
+.IP 1. 5
+If a line is drawn unclipped from [x1,y1] to [x2,y2] and
+if another line is drawn unclipped from [x1+dx,y1+dy] to [x2+dx,y2+dy],
+a point [x,y] is touched by drawing the first line 
+if and only if the point [x+dx,y+dy] is touched by drawing the second line.
+.IP 2. 5
+The effective set of points comprising a line cannot be affected by clipping.
+That is, a point is touched in a clipped line if and only if the point 
+lies inside the clipping region and the point would be touched
+by the line when drawn unclipped.
+.LP
+A wide line drawn from [x1,y1] to [x2,y2] always draws the same pixels 
+as a wide line drawn from [x2,y2] to [x1,y1], not counting cap-style 
+and join-style.
+It is recommended that this property be true for thin lines, 
+but this is not required.
+A line-width of zero may differ from a line-width of one in which pixels are
+drawn.
+This permits the use of many manufacturers' line drawing hardware,
+which may run many times faster than the more precisely specified
+wide lines.
+.LP
+In general, 
+drawing a thin line will be faster than drawing a wide line of width one.
+However, because of their different drawing algorithms,
+thin lines may not mix well aesthetically with wide lines.
+If it is desirable to obtain precise and uniform results across all displays,
+a client should always use a line-width of one rather than a line-width of zero.
+.LP
+The line-style defines which sections of a line are drawn:
+.TS
+lw(1.3i) lw(4.5i).
+T{
+.ZN LineSolid
+T}     T{
+The full path of the line is drawn.
+T}
+.sp 6p
+T{
+.ZN LineDoubleDash
+T}     T{
+The full path of the line is drawn, 
+but the even dashes are filled differently 
+from the odd dashes (see fill-style) with
+.ZN CapButt 
+style used where even and odd dashes meet.
+T}
+.sp 6p
+T{
+.ZN LineOnOffDash
+T}     T{
+Only the even dashes are drawn,
+and cap-style applies to 
+all internal ends of the individual dashes,
+except 
+.ZN CapNotLast
+is treated as 
+.ZN CapButt . 
+T}
+.TE
+.LP
+The cap-style defines how the endpoints of a path are drawn:
+.IN "Graphics context" "path"
+.TS
+lw(1.3i) lw(4.5i).
+T{
+.ZN CapNotLast
+T}     T{
+This is equivalent to 
+.ZN CapButt  
+except that for a line-width of zero the final endpoint is not drawn.
+T}
+.sp 6p
+T{
+.ZN CapButt
+T}     T{
+The line is square at the endpoint (perpendicular to the slope of the line)
+with no projection beyond.
+T}
+.sp 6p
+T{
+.ZN CapRound
+T}     T{
+The line has a circular arc with the diameter equal to the line-width,
+centered on the endpoint.
+(This is equivalent to 
+.ZN CapButt 
+for line-width of zero).
+T}
+.sp 6p
+T{
+.ZN CapProjecting
+T}     T{
+The line is square at the end, but the path continues beyond the endpoint 
+for a distance equal to half the line-width.
+(This is equivalent to 
+.ZN CapButt 
+for line-width of zero).
+T}
+.TE
+.LP
+The join-style defines how corners are drawn for wide lines:
+.TS
+lw(1.3i) lw(4.5i).
+T{
+.ZN JoinMiter
+T}     T{
+The outer edges of two lines extend to meet at an angle.
+However, if the angle is less than 11 degrees,
+then a
+.ZN JoinBevel
+join-style is used instead.
+T}
+.sp 6p
+T{
+.ZN JoinRound
+T}     T{
+The corner is a circular arc with the diameter equal to the line-width, 
+centered on the joinpoint.
+T}
+.sp 6p
+T{
+.ZN JoinBevel
+T}     T{
+The corner has
+.ZN CapButt 
+endpoint styles with the triangular notch filled.
+T}
+.TE
+.LP
+For a line with coincident endpoints (x1=x2, y1=y2), 
+when the cap-style is applied to both endpoints, 
+the semantics depends on the line-width and the cap-style:
+.TS
+lw(1.3i) lw(.5i) lw(4i).
+T{
+.ZN CapNotLast
+T}     T{
+thin
+T}     T{
+The results are device dependent, 
+but the desired effect is that nothing is drawn.
+T}
+.sp 6p
+T{
+.ZN CapButt
+T}     T{
+thin
+T}     T{
+The results are device dependent, 
+but the desired effect is that a single pixel is drawn.
+T}
+.sp 6p
+T{
+.ZN CapRound
+T}     T{
+thin
+T}     T{
+The results are the same as for
+.ZN CapButt /thin.
+T}
+.sp 6p
+T{
+.ZN CapProjecting
+T}     T{
+thin
+T}     T{
+The results are the same as for
+.ZN CapButt /thin.
+T}
+.sp 6p
+T{
+.ZN CapButt
+T}     T{
+wide
+T}     T{
+Nothing is drawn.
+T}
+.sp 6p
+T{
+.ZN CapRound
+T}     T{
+wide
+T}     T{
+The closed path is a circle, centered at the endpoint, and
+with the diameter equal to the line-width.
+T}
+.sp 6p
+T{
+.ZN CapProjecting
+T}     T{
+wide
+T}     T{
+The closed path is a square, aligned with the coordinate axes, centered at the
+endpoint, and with the sides equal to the line-width.
+T}
+.TE
+.LP
+For a line with coincident endpoints (x1=x2, y1=y2), 
+when the join-style is applied at one or both endpoints, 
+the effect is as if the line was removed from the overall path.
+However, if the total path consists of or is reduced to a single point joined
+with itself, the effect is the same as when the cap-style is applied at both
+endpoints.
+.LP
+The tile/stipple represents an infinite two-dimensional plane,
+with the tile/stipple replicated in all dimensions.
+When that plane is superimposed on the drawable
+for use in a graphics operation, the upper-left corner
+of some instance of the tile/stipple is at the coordinates within
+the drawable specified by the tile/stipple origin.
+The tile/stipple and clip origins are interpreted relative to the
+origin of whatever destination drawable is specified in a graphics
+request.
+The tile pixmap must have the same root and depth as the GC,
+or a
+.ZN BadMatch 
+error results.
+The stipple pixmap must have depth one and must have the same root as the
+GC, or a 
+.ZN BadMatch 
+error results.  
+For stipple operations where the fill-style is
+.ZN FillStippled
+but not 
+.ZN FillOpaqueStippled ,
+the stipple pattern is tiled in a
+single plane and acts as an additional clip mask to be ANDed with the clip-mask.
+Although some sizes may be faster to use than others,
+any size pixmap can be used for tiling or stippling.
+.LP
+The fill-style defines the contents of the source for line, text, and
+fill requests.  
+For all text and fill requests (for example,
+.ZN XDrawText , 
+.ZN XDrawText16 ,
+.ZN XFillRectangle , 
+.ZN XFillPolygon , 
+and
+.ZN XFillArc );
+for line requests 
+with line-style 
+.ZN LineSolid 
+(for example,
+.ZN XDrawLine ,
+.ZN XDrawSegments , 
+.ZN XDrawRectangle ,
+.ZN XDrawArc );
+and for the even dashes for line requests with line-style 
+.ZN LineOnOffDash 
+or 
+.ZN LineDoubleDash ,
+the following apply:
+.TS
+lw(1.8i) lw(4i).
+T{
+.ZN FillSolid
+T}     T{
+Foreground
+T}
+.sp 6p
+T{
+.ZN FillTiled
+T}     T{
+Tile
+T}
+.sp 6p
+T{
+.ZN FillOpaqueStippled
+T}     T{
+A tile with the same width and height as stipple,
+but with background everywhere stipple has a zero
+and with foreground everywhere stipple has a one
+T}
+.sp 6p
+T{
+.ZN FillStippled
+T}     T{
+Foreground masked by stipple
+T}
+.TE
+.LP
+When drawing lines with line-style
+.ZN LineDoubleDash ,
+the odd dashes are controlled by the fill-style in the following manner:
+.TS
+lw(1.8i) lw(4i).
+T{
+.ZN FillSolid
+T}     T{
+Background
+T}
+.sp 6p
+T{
+.ZN FillTiled
+T}     T{
+Same as for even dashes
+T}
+.sp 6p
+T{
+.ZN FillOpaqueStippled
+T}     T{
+Same as for even dashes
+T}
+.sp 6p
+T{
+.ZN FillStippled
+T}     T{
+Background masked by stipple
+T}
+.TE
+.LP
+Storing a pixmap in a GC might or might not result in a copy
+being made.
+If the pixmap is later used as the destination for a graphics request,
+the change might or might not be reflected in the GC.
+If the pixmap is used simultaneously in a graphics request both as
+a destination and as a tile or stipple,
+the results are undefined.
+.LP
+For optimum performance,
+you should draw as much as possible with the same GC 
+(without changing its components).
+The costs of changing GC components relative to using different GCs
+depend on the display hardware and the server implementation.
+It is quite likely that some amount of GC information will be
+cached in display hardware and that such hardware can only cache a small number
+of GCs.
+.LP
+The dashes value is actually a simplified form of the
+more general patterns that can be set with 
+.ZN XSetDashes .  
+Specifying a
+value of N is equivalent to specifying the two-element list [N, N] in 
+.ZN XSetDashes . 
+The value must be nonzero,
+or a
+.ZN BadValue
+error results.
+.LP
+The clip-mask restricts writes to the destination drawable.  
+If the clip-mask is set to a pixmap,
+it must have depth one and have the same root as the GC,
+or a
+.ZN BadMatch 
+error results.
+If clip-mask is set to
+.ZN None ,
+the pixels are always drawn regardless of the clip origin.
+The clip-mask also can be set by calling the
+.ZN XSetClipRectangles
+or
+.ZN XSetRegion
+functions.
+Only pixels where the clip-mask has a bit set to 1 are drawn.  
+Pixels are not drawn outside the area covered by the clip-mask 
+or where the clip-mask has a bit set to 0.
+The clip-mask affects all graphics requests.
+The clip-mask does not clip sources.
+The clip-mask origin is interpreted relative to the origin of whatever
+destination drawable is specified in a graphics request.
+.LP
+You can set the subwindow-mode to
+.ZN ClipByChildren
+or
+.ZN IncludeInferiors .
+For 
+.ZN ClipByChildren , 
+both source and destination windows are
+additionally clipped by all viewable 
+.ZN InputOutput
+children.  
+For 
+.ZN IncludeInferiors ,
+neither source nor destination window is clipped by inferiors. 
+This will result in including subwindow contents in the source
+and drawing through subwindow boundaries of the destination.
+The use of 
+.ZN IncludeInferiors 
+on a window of one depth with mapped
+inferiors of differing depth is not illegal, but the semantics are
+undefined by the core protocol.
+.LP
+The fill-rule defines what pixels are inside (drawn) for
+paths given in 
+.ZN XFillPolygon 
+requests and can be set to 
+.ZN EvenOddRule 
+or
+.ZN WindingRule .
+For
+.ZN EvenOddRule ,
+a point is inside if
+an infinite ray with the point as origin crosses the path an odd number
+of times.  
+For 
+.ZN WindingRule , 
+a point is inside if an infinite ray with the
+point as origin crosses an unequal number of clockwise and
+counterclockwise directed path segments.
+A clockwise directed path segment is one that crosses the ray from left to
+right as observed from the point.
+A counterclockwise segment is one that crosses the ray from right to left
+as observed from the point.
+The case where a directed line segment is coincident with the ray is
+uninteresting because you can simply choose a different ray that is not
+coincident with a segment.
+.LP
+For both 
+.ZN EvenOddRule
+and
+.ZN WindingRule ,
+a point is infinitely small, 
+and the path is an infinitely thin line.  
+A pixel is inside if the center point of the pixel is inside
+and the center point is not on the boundary.  
+If the center point is on the boundary,
+the pixel is inside if and only if the polygon interior is immediately to
+its right (x increasing direction).  
+Pixels with centers on a horizontal edge are a special case 
+and are inside if and only if the polygon interior is immediately below 
+(y increasing direction).
+.LP
+The arc-mode controls filling in the 
+.ZN XFillArcs
+function and can be set to
+.ZN ArcPieSlice
+or
+.ZN ArcChord .
+For
+.ZN ArcPieSlice ,
+the arcs are pie-slice filled.
+For
+.ZN ArcChord ,
+the arcs are chord filled.
+.LP
+The graphics-exposure flag controls 
+.ZN GraphicsExpose 
+event generation
+for 
+.ZN XCopyArea 
+and 
+.ZN XCopyPlane
+requests (and any similar requests defined by extensions).
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadDrawable
+A value for a Drawable argument does not name a defined Window or Pixmap.
+.TP 1i
+.ZN BadFont
+A value for a Font or GContext argument does not name a defined Font.
+.TP 1i
+.ZN BadGC
+A value for a GContext argument does not name a defined GContext.
+.TP 1i
+.ZN BadMatch
+An
+.ZN InputOnly
+window is used as a Drawable.
+.TP 1i
+.ZN BadMatch
+Some argument or pair of arguments has the correct type and range but fails
+to match in some other way required by the request.
+.TP 1i
+.ZN BadPixmap
+A value for a Pixmap argument does not name a defined Pixmap.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.SH "SEE ALSO"
+AllPlanes(__libmansuffix__),
+XCopyArea(__libmansuffix__),
+XCreateRegion(__libmansuffix__),
+XDrawArc(__libmansuffix__),
+XDrawLine(__libmansuffix__),
+XDrawRectangle(__libmansuffix__),
+XDrawText(__libmansuffix__),
+XFillRectangle(__libmansuffix__),
+XQueryBestSize(__libmansuffix__),
+XSetArcMode(__libmansuffix__),
+XSetClipOrigin(__libmansuffix__),
+XSetFillStyle(__libmansuffix__),
+XSetFont(__libmansuffix__),
+XSetLineAttributes(__libmansuffix__),
+XSetState(__libmansuffix__),
+XSetTile(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XCreateGlyphCursor.man b/man/XCreateGlyphCursor.man
new file mode 100644 (file)
index 0000000..73f953a
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XCreateFontCursor.__libmansuffix__
diff --git a/man/XCreateIC.man b/man/XCreateIC.man
new file mode 100644 (file)
index 0000000..822cc8e
--- /dev/null
@@ -0,0 +1,219 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XCreateIC __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XCreateIC, XDestroyIC, XIMOfIC \- create, destroy, and obtain the input method of an input context
+.SH SYNTAX
+.HP
+XIC XCreateIC\^(\^XIM \fIim\fP\^, ...\^); 
+.HP
+void XDestroyIC\^(\^XIC \fIic\fP\^); 
+.HP
+XIM XIMOfIC\^(\^XIC \fIic\fP\^);
+.SH ARGUMENTS
+.IP \fIic\fP 1i
+Specifies the input context.
+.IP \fIim\fP 1i
+Specifies the input method.
+.ds Al \ to set XIC values
+.IP ... 1i
+Specifies the variable length argument list\*(Al.
+.SH DESCRIPTION
+The
+.ZN XCreateIC 
+function creates a context within the specified input method.
+.LP
+Some of the arguments are mandatory at creation time, and
+the input context will not be created if those arguments are not provided.
+The mandatory arguments are the input style and the set of text callbacks
+(if the input style selected requires callbacks).
+All other input context values can be set later.
+.LP
+.ZN XCreateIC
+returns a NULL value if no input context could be created.
+A NULL value could be returned for any of the following reasons:
+.IP \(bu 5
+A required argument was not set.
+.IP \(bu 5
+A read-only argument was set (for example,
+.ZN XNFilterEvents ).
+.IP \(bu 5
+The argument name is not recognized.
+.IP \(bu 5
+The input method encountered an input method implementation-dependent error.
+.LP
+The
+.ZN XCreateIC
+can generate
+.ZN BadAtom ,
+.ZN BadColor ,
+.ZN BadPixmap ,
+and
+.ZN BadWindow
+errors.
+.LP
+.ZN XDestroyIC
+destroys the specified input context.
+.LP
+The
+.ZN XIMOfIC
+function returns the input method associated with the specified input context.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAtom
+A value for an Atom argument does not name a defined Atom.
+.TP 1i
+.ZN BadColor
+A value for a Colormap argument does not name a defined Colormap.
+.TP 1i
+.ZN BadPixmap
+A value for a Pixmap argument does not name a defined Pixmap.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XOpenIM(__libmansuffix__),
+XSetICFocus(__libmansuffix__),
+XSetICValues(__libmansuffix__),
+XmbResetIC(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XCreateImage.man b/man/XCreateImage.man
new file mode 100644 (file)
index 0000000..19e5be3
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XInitImage.__libmansuffix__
diff --git a/man/XCreateOC.man b/man/XCreateOC.man
new file mode 100644 (file)
index 0000000..5c3e8dc
--- /dev/null
@@ -0,0 +1,226 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XCreateOC __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XCreateOC, XDestroyOC, XSetOCValues, XGetOCValues, XOMOfOC \- create output contexts
+.SH SYNTAX
+.HP
+XOC XCreateOC\^(\^XOM \fIom\fP\^); 
+.HP
+void XDestroyOC\^(\^XOC \fIoc\fP\^); 
+.HP
+char * XSetOCValues\^(\^XOC \fIoc\fP\^, ...); 
+.HP
+char * XGetOCValues\^(\^XOC \fIoc\fP\^, ...); 
+.HP
+XOM XOMOfOC\^(\^XOC \fIoc\fP\^); 
+.SH ARGUMENTS
+.IP \fIoc\fP 1i
+Specifies the output context.
+.IP \fIom\fP 1i
+Specifies the output method.
+.ds Al \ to set or get XOC values
+.IP ... 1i
+Specifies the variable length argument list\*(Al.
+.SH DESCRIPTION
+The
+.ZN XCreateOC 
+function creates an output context within the specified output method.
+.LP
+The base font names argument is mandatory at creation time, and
+the output context will not be created unless it is provided.
+All other output context values can be set later.
+.LP
+.ZN XCreateOC
+returns NULL if no output context could be created.
+NULL can be returned for any of the following reasons:
+.IP \(bu 5
+A required argument was not set.
+.IP \(bu 5
+A read-only argument was set.
+.IP \(bu 5
+An argument name is not recognized.
+.IP \(bu 5
+The output method encountered an output method implementation-dependent error.
+.LP
+The
+.ZN XDestroyOC
+function destroys the specified output context.
+.LP
+The
+.ZN XSetOCValues
+function returns NULL if no error occurred; 
+otherwise,
+it returns the name of the first argument that could not be set.
+An argument might not be set for any of the following reasons:
+.IP \(bu 5
+The argument is read-only.
+.IP \(bu 5
+The argument name is not recognized.
+.IP \(bu 5
+An implementation-dependent error occurs.
+.LP
+Each value to be set must be an appropriate datum,
+matching the data type imposed by the semantics of the argument.
+.LP
+The
+.ZN XGetOCValues
+function returns NULL if no error occurred; otherwise,
+it returns the name of the first argument that could not be obtained.
+An argument might not be obtained for any of the following reasons:
+.IP \(bu 5
+The argument name is not recognized.
+.IP \(bu 5
+An implementation-dependent error occurs.
+.LP
+Each argument value
+following a name must point to a location where the value is to be stored.
+.LP
+The
+.ZN XOMOfOC
+function returns the output method associated with the
+specified output context.
+.SH "SEE ALSO"
+XCreateOM(__libmansuffix__),
+XCreateFontSet(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XCreatePixmap.man b/man/XCreatePixmap.man
new file mode 100644 (file)
index 0000000..ef54ac5
--- /dev/null
@@ -0,0 +1,230 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XCreatePixmap __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XCreatePixmap, XFreePixmap \- create or destroy pixmaps
+.SH SYNTAX
+.HP
+Pixmap XCreatePixmap\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^,
+unsigned int \fIwidth\fP\^, unsigned int \fIheight\fP\^, unsigned int
+\fIdepth\fP\^); 
+.HP
+int XFreePixmap\^(\^Display *\fIdisplay\fP\^, Pixmap \fIpixmap\fP\^); 
+.SH ARGUMENTS
+.IP \fId\fP 1i
+Specifies which screen the pixmap is created on. 
+.IP \fIdepth\fP 1i
+Specifies the depth of the pixmap.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIpixmap\fP 1i
+Specifies the pixmap.
+.ds Wh , which define the dimensions of the pixmap
+.IP \fIwidth\fP 1i
+.br
+.ns
+.IP \fIheight\fP 1i
+Specify the width and height\*(Wh.
+.SH DESCRIPTION
+The
+.ZN XCreatePixmap
+function creates a pixmap of the width, height, and depth you specified
+and returns a pixmap ID that identifies it.
+It is valid to pass an 
+.ZN InputOnly
+window to the drawable argument.
+The width and height arguments must be nonzero,
+or a 
+.ZN BadValue
+error results.
+The depth argument must be one of the depths supported by the screen
+of the specified drawable,
+or a
+.ZN BadValue
+error results.
+.LP
+The server uses the specified drawable to determine on which screen
+to create the pixmap.
+The pixmap can be used only on this screen
+and only with other drawables of the same depth (see
+.ZN XCopyPlane
+for an exception to this rule).
+The initial contents of the pixmap are undefined.
+.LP
+.ZN XCreatePixmap
+can generate
+.ZN BadAlloc ,
+.ZN BadDrawable ,
+and
+.ZN BadValue 
+errors.
+.LP
+The
+.ZN XFreePixmap
+function first deletes the association between the pixmap ID and the pixmap.
+Then, the X server frees the pixmap storage when there are no references to it.
+The pixmap should never be referenced again.
+.LP
+.ZN XFreePixmap
+can generate a
+.ZN BadPixmap 
+error.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadDrawable
+A value for a Drawable argument does not name a defined Window or Pixmap.
+.TP 1i
+.ZN BadPixmap
+A value for a Pixmap argument does not name a defined Pixmap.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.SH "SEE ALSO"
+XCopyArea(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XCreatePixmapCursor.man b/man/XCreatePixmapCursor.man
new file mode 100644 (file)
index 0000000..73f953a
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XCreateFontCursor.__libmansuffix__
diff --git a/man/XCreatePixmapFromBitmapData.man b/man/XCreatePixmapFromBitmapData.man
new file mode 100644 (file)
index 0000000..ff0c276
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XReadBitmapFile.__libmansuffix__
diff --git a/man/XCreateRegion.man b/man/XCreateRegion.man
new file mode 100644 (file)
index 0000000..0f6d324
--- /dev/null
@@ -0,0 +1,179 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XCreateRegion __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XCreateRegion, XSetRegion, XDestroyRegion \- create or destroy regions
+.SH SYNTAX
+.HP
+Region XCreateRegion\^(void\^); 
+.HP
+int XSetRegion\^(\^Display *\fIdisplay\fP\^, GC \fIgc\fP\^, Region \fIr\fP\^);
+.HP
+int XDestroyRegion\^(\^Region \fIr\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fIr\fP 1i
+Specifies the region.
+.SH DESCRIPTION
+The
+.ZN XCreateRegion
+function creates a new empty region.
+.LP
+The
+.ZN XSetRegion
+function sets the clip-mask in the GC to the specified region.
+The region is specified relative to the drawable's origin.
+The resulting GC clip origin is implementation-dependent.
+Once it is set in the GC,
+the region can be destroyed.
+.LP
+The
+.ZN XDestroyRegion
+function deallocates the storage associated with a specified region.
+.SH "SEE ALSO"
+XEmptyRegion(__libmansuffix__),
+XIntersectRegion(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XCreateSimpleWindow.man b/man/XCreateSimpleWindow.man
new file mode 100644 (file)
index 0000000..e24be56
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XCreateWindow.__libmansuffix__
diff --git a/man/XCreateWindow.man b/man/XCreateWindow.man
new file mode 100644 (file)
index 0000000..8d122d5
--- /dev/null
@@ -0,0 +1,496 @@
+'\" t
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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
+'\" t
+.TH XCreateWindow __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XCreateWindow, XCreateSimpleWindow, XSetWindowAttributes \- create windows and window attributes structure
+.SH SYNTAX
+.HP
+Window XCreateWindow\^(\^Display *\fIdisplay\fP\^, Window \fIparent\fP\^, int \fIx\fP\^, int \fIy\fP\^, unsigned int \fIwidth\fP\^, unsigned int \fIheight\fP\^, unsigned int \fIborder_width\fP\^, int \fIdepth\fP\^, unsigned int \fIclass\fP\^, Visual *\fIvisual\fP\^, unsigned long \fIvaluemask\fP\^, XSetWindowAttributes *\fIattributes\fP\^); 
+.HP
+Window XCreateSimpleWindow\^(\^Display *\fIdisplay\fP\^, Window \fIparent\fP\^, int \fIx\fP\^, int \fIy\fP\^, unsigned int \fIwidth\fP\^, unsigned int \fIheight\fP\^, unsigned int \fIborder_width\fP\^, unsigned long \fIborder\fP\^, unsigned long \fIbackground\fP\^); 
+.SH ARGUMENTS
+.IP \fIattributes\fP 1i
+Specifies the structure from which the values (as specified by the value mask)
+are to be taken.
+The value mask should have the appropriate bits
+set to indicate which attributes have been set in the structure.
+.IP \fIbackground\fP 1i
+Specifies the background pixel value of the window.
+
+.IP \fIborder\fP 1i
+Specifies the border pixel value of the window.
+.IP \fIborder_width\fP 1i
+Specifies the width of the created window's border in pixels.
+.IP \fIclass\fP 1i
+Specifies the created window's class.
+You can pass
+.ZN InputOutput , 
+.ZN InputOnly , 
+or 
+.ZN CopyFromParent .
+A class of 
+.ZN CopyFromParent
+means the class
+is taken from the parent.
+.IP \fIdepth\fP 1i
+Specifies the window's depth.
+A depth of 
+.ZN CopyFromParent
+means the depth is taken from the parent.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIparent\fP 1i
+Specifies the parent window.
+.IP \fIvaluemask\fP 1i
+Specifies which window attributes are defined in the attributes
+argument.
+This mask is the bitwise inclusive OR of the valid attribute mask bits.
+If valuemask is zero,
+the attributes are ignored and are not referenced.
+.IP \fIvisual\fP 1i
+Specifies the visual type.
+A visual of 
+.ZN CopyFromParent 
+means the visual type is taken from the 
+parent.
+.ds Wh , which are the created window's inside dimensions \
+and do not include the created window's borders
+.IP \fIwidth\fP 1i
+.br
+.ns
+.IP \fIheight\fP 1i
+Specify the width and height\*(Wh.
+.ds Xy , which are the top-left outside corner of the window's \
+borders and are relative to the inside of the parent window's borders
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.SH DESCRIPTION
+The
+.ZN XCreateWindow
+function creates an unmapped subwindow for a specified parent window, 
+returns the window ID of the created window, 
+and causes the X server to generate a
+.ZN CreateNotify
+event.
+The created window is placed on top in the stacking order 
+with respect to siblings.
+.LP
+The coordinate system has the X axis horizontal and the Y axis vertical
+with the origin [0, 0] at the upper-left corner.
+Coordinates are integral,
+in terms of pixels,
+and coincide with pixel centers.
+Each window and pixmap has its own coordinate system.
+For a window, 
+the origin is inside the border at the inside, upper-left corner.
+.LP
+The border_width for an
+.ZN InputOnly
+window must be zero, or a
+.ZN BadMatch
+error results.
+For class
+.ZN InputOutput ,
+the visual type and depth must be a combination supported for the screen,
+or a
+.ZN BadMatch
+error results.
+The depth need not be the same as the parent,
+but the parent must not be a window of class 
+.ZN InputOnly ,
+or a
+.ZN BadMatch
+error results.
+For an
+.ZN InputOnly
+window,
+the depth must be zero, and the visual must be one supported by the screen.
+If either condition is not met,
+a
+.ZN BadMatch
+error results.
+The parent window, however, may have any depth and class.
+If you specify any invalid window attribute for a window, a
+.ZN BadMatch
+error results.
+.LP
+The created window is not yet displayed (mapped) on the user's display.
+To display the window, call
+.ZN XMapWindow .
+The new window initially uses the same cursor as
+its parent. 
+A new cursor can be defined for the new window by calling
+.ZN XDefineCursor .
+.IN "Cursor" "Initial State"
+.IN "XDefineCursor" 
+The window will not be visible on the screen unless it and all of its
+ancestors are mapped and it is not obscured by any of its ancestors.
+.LP
+.ZN XCreateWindow
+can generate
+.ZN BadAlloc
+.ZN BadColor ,
+.ZN BadCursor ,
+.ZN BadMatch ,
+.ZN BadPixmap ,
+.ZN BadValue ,
+and
+.ZN BadWindow 
+errors.
+.LP
+The
+.ZN XCreateSimpleWindow
+function creates an unmapped
+.ZN InputOutput
+subwindow for a specified parent window, returns the
+window ID of the created window, and causes the X server to generate a
+.ZN CreateNotify
+event.
+The created window is placed on top in the stacking order with respect to 
+siblings.
+Any part of the window that extends outside its parent window is clipped.
+The border_width for an
+.ZN InputOnly
+window must be zero, or a
+.ZN BadMatch
+error results.
+.ZN XCreateSimpleWindow
+inherits its depth, class, and visual from its parent.
+All other window attributes, except background and border, 
+have their default values.
+.LP
+.ZN XCreateSimpleWindow
+can generate
+.ZN BadAlloc ,
+.ZN BadMatch ,
+.ZN BadValue ,
+and
+.ZN BadWindow 
+errors.
+.SH STRUCTURES
+The
+.ZN XSetWindow Attributes
+structure contains:
+.LP
+.LP
+/\&* Window attribute value mask bits */
+.TS
+lw(.5i) lw(2.5i) lw(.8i).
+T{
+\&#define
+T}     T{
+.ZN CWBackPixmap
+T}     T{
+(1L<<0)
+T}
+T{
+\&#define
+T}     T{
+.ZN CWBackPixel
+T}     T{
+(1L<<1)
+T}
+T{
+\&#define
+T}     T{
+.ZN CWBorderPixmap
+T}     T{
+(1L<<2)
+T}
+T{
+\&#define
+T}     T{
+.ZN CWBorderPixel
+T}     T{
+(1L<<3)
+T}
+T{
+\&#define
+T}     T{
+.ZN CWBitGravity
+T}     T{
+(1L<<4)
+T}
+T{
+\&#define
+T}     T{
+.ZN CWWinGravity
+T}     T{
+(1L<<5)
+T}
+T{
+\&#define
+T}     T{
+.ZN CWBackingStore
+T}     T{
+(1L<<6)
+T}
+T{
+\&#define
+T}     T{
+.ZN CWBackingPlanes
+T}     T{
+(1L<<7)
+T}
+T{
+\&#define
+T}     T{
+.ZN CWBackingPixel
+T}     T{
+(1L<<8)
+T}
+T{
+\&#define
+T}     T{
+.ZN CWOverrideRedirect
+T}     T{
+(1L<<9)
+T}
+T{
+\&#define
+T}     T{
+.ZN CWSaveUnder
+T}     T{
+(1L<<10)
+T}
+T{
+\&#define
+T}     T{
+.ZN CWEventMask
+T}     T{
+(1L<<11)
+T}
+T{
+\&#define
+T}     T{
+.ZN CWDontPropagate
+T}     T{
+(1L<<12)
+T}
+T{
+\&#define
+T}     T{
+.ZN CWColormap
+T}     T{
+(1L<<13)
+T}
+T{
+\&#define
+T}     T{
+.ZN CWCursor
+T}     T{
+(1L<<14)
+T}
+.TE
+.IN "XSetWindowAttributes" "" "@DEF@"
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+/\&* Values */
+
+typedef struct {
+       Pixmap background_pixmap;       /\&* background, None, or ParentRelative */
+       unsigned long background_pixel; /\&* background pixel */
+       Pixmap border_pixmap;           /\&* border of the window or CopyFromParent */
+       unsigned long border_pixel;     /\&* border pixel value */
+       int bit_gravity;        /\&* one of bit gravity values */
+       int win_gravity;        /\&* one of the window gravity values */
+       int backing_store;      /\&* NotUseful, WhenMapped, Always */
+       unsigned long backing_planes;   /\&* planes to be preserved if possible */
+       unsigned long backing_pixel;    /\&* value to use in restoring planes */
+       Bool save_under;        /\&* should bits under be saved? (popups) */
+       long event_mask;        /\&* set of events that should be saved */
+       long do_not_propagate_mask;     /\&* set of events that should not propagate */
+       Bool override_redirect; /\&* boolean value for override_redirect */
+       Colormap colormap;      /\&* color map to be associated with window */
+       Cursor cursor;          /\&* cursor to be displayed (or None) */
+} XSetWindowAttributes;
+.De
+.LP
+For a detailed explanation of the members of this structure,
+see \fI\*(xL\fP\^.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadColor
+A value for a Colormap argument does not name a defined Colormap.
+.TP 1i
+.ZN BadCursor
+A value for a Cursor argument does not name a defined Cursor.
+.TP 1i
+.ZN BadMatch
+The values do not exist for an
+.ZN InputOnly
+window.
+.TP 1i
+.ZN BadMatch
+Some argument or pair of arguments has the correct type and range but fails
+to match in some other way required by the request.
+.TP 1i
+.ZN BadPixmap
+A value for a Pixmap argument does not name a defined Pixmap.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XChangeWindowAttributes(__libmansuffix__),
+XConfigureWindow(__libmansuffix__), 
+XDefineCursor(__libmansuffix__),
+XDestroyWindow(__libmansuffix__), 
+XMapWindow(__libmansuffix__), 
+XRaiseWindow(__libmansuffix__),
+XUnmapWindow(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XCreateWindowEvent.man b/man/XCreateWindowEvent.man
new file mode 100644 (file)
index 0000000..410a1fb
--- /dev/null
@@ -0,0 +1,229 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XCreateWindowEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XCreateWindowEvent \- CreateNotify event structure
+.SH STRUCTURES
+The structure for
+.ZN CreateNotify
+events contains:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int type;       /\&* CreateNotify */
+       unsigned long serial;   /\&* # of last request processed by server */
+       Bool send_event;        /\&* true if this came from a SendEvent request */
+       Display *display;       /\&* Display the event was read from */
+       Window parent;  /\&* parent of the window */
+       Window window;  /\&* window id of window created */
+       int x, y;       /\&* window location */
+       int width, height;      /\&* size of window */
+       int border_width;       /\&* border width */
+       Bool override_redirect; /\&* creation should be overridden */
+} XCreateWindowEvent;
+.De
+.LP
+When you receive this event,
+the structure members are set as follows.
+.LP
+The type member is set to the event type constant name that uniquely identifies
+it.
+For example, when the X server reports a
+.ZN GraphicsExpose
+event to a client application, it sends an
+.ZN XGraphicsExposeEvent
+structure with the type member set to
+.ZN GraphicsExpose .
+The display member is set to a pointer to the display the event was read on.
+The send_event member is set to
+.ZN True
+if the event came from a
+.ZN SendEvent
+protocol request.
+The serial member is set from the serial number reported in the protocol
+but expanded from the 16-bit least-significant bits to a full 32-bit value.
+The window member is set to the window that is most useful to toolkit
+dispatchers.
+.LP
+The parent member is set to the created window's parent.
+The window member specifies the created window.
+The x and y members are set to the created window's coordinates relative 
+to the parent window's origin and indicate the position of the upper-left 
+outside corner of the created window.
+The width and height members are set to the inside size of the created window 
+(not including the border) and are always nonzero.
+The border_width member is set to the width of the created window's border, in pixels.
+The override_redirect member is set to the override-redirect attribute of the
+window.
+Window manager clients normally should ignore this window 
+if the override_redirect member is
+.ZN True .
+.SH "SEE ALSO"
+XAnyEvent(__libmansuffix__),
+XButtonEvent(__libmansuffix__),
+XCirculateEvent(__libmansuffix__),
+XCirculateRequestEvent(__libmansuffix__),
+XColormapEvent(__libmansuffix__),
+XConfigureEvent(__libmansuffix__),
+XConfigureRequestEvent(__libmansuffix__),
+XCrossingEvent(__libmansuffix__),
+XDestroyWindowEvent(__libmansuffix__),
+XErrorEvent(__libmansuffix__),
+XExposeEvent(__libmansuffix__),
+XFocusChangeEvent(__libmansuffix__),
+XGraphicsExposeEvent(__libmansuffix__),
+XGravityEvent(__libmansuffix__),
+XKeymapEvent(__libmansuffix__),
+XMapEvent(__libmansuffix__),
+XMapRequestEvent(__libmansuffix__),
+XPropertyEvent(__libmansuffix__),
+XReparentEvent(__libmansuffix__),
+XResizeRequestEvent(__libmansuffix__),
+XSelectionClearEvent(__libmansuffix__),
+XSelectionEvent(__libmansuffix__),
+XSelectionRequestEvent(__libmansuffix__),
+XUnmapEvent(__libmansuffix__),
+XVisibilityEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XCrossingEvent.man b/man/XCrossingEvent.man
new file mode 100644 (file)
index 0000000..9603105
--- /dev/null
@@ -0,0 +1,326 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XCrossingEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XCrossingEvent \- EnterNotify and LeaveNotify event structure
+.SH STRUCTURES
+The structure for
+.ZN EnterNotify 
+and
+.ZN LeaveNotify
+events contains:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int type;       /\&* EnterNotify or LeaveNotify */
+       unsigned long serial;   /\&* # of last request processed by server */
+       Bool send_event;        /\&* true if this came from a SendEvent request */
+       Display *display;       /\&* Display the event was read from */
+       Window window;  /\&* ``event'' window reported relative to */
+       Window root;    /\&* root window that the event occurred on */
+       Window subwindow;       /\&* child window */
+       Time time;      /\&* milliseconds */
+       int x, y;       /\&* pointer x, y coordinates in event window */
+       int x_root, y_root;     /\&* coordinates relative to root */
+       int mode;       /\&* NotifyNormal, NotifyGrab, NotifyUngrab */
+       int detail;
+               /\&*
+               * NotifyAncestor, NotifyVirtual, NotifyInferior, 
+               * NotifyNonlinear,NotifyNonlinearVirtual
+               */
+       Bool same_screen;       /\&* same screen flag */
+       Bool focus;     /\&* boolean focus */
+       unsigned int state;     /\&* key or button mask */
+} XCrossingEvent;
+typedef XCrossingEvent XEnterWindowEvent;
+typedef XCrossingEvent XLeaveWindowEvent;
+.De
+.LP
+When you receive these events,
+the structure members are set as follows.
+.LP
+The type member is set to the event type constant name that uniquely identifies
+it.
+For example, when the X server reports a
+.ZN GraphicsExpose
+event to a client application, it sends an
+.ZN XGraphicsExposeEvent
+structure with the type member set to
+.ZN GraphicsExpose .
+The display member is set to a pointer to the display the event was read on.
+The send_event member is set to
+.ZN True
+if the event came from a
+.ZN SendEvent
+protocol request.
+The serial member is set from the serial number reported in the protocol
+but expanded from the 16-bit least-significant bits to a full 32-bit value.
+The window member is set to the window that is most useful to toolkit
+dispatchers.
+.LP
+The window member is set to the window on which the
+.ZN EnterNotify
+or
+.ZN LeaveNotify
+event was generated and is referred to as the event window. 
+This is the window used by the X server to report the event, 
+and is relative to the root
+window on which the event occurred. 
+The root member is set to the root window of the screen
+on which the event occurred.
+.LP
+For a
+.ZN LeaveNotify 
+event,
+if a child of the event window contains the initial position of the pointer,
+the subwindow component is set to that child.
+Otherwise, the X server sets the subwindow member to
+.ZN None .
+For an
+.ZN EnterNotify 
+event, if a child of the event window contains the final pointer position, 
+the subwindow component is set to that child or
+.ZN None .
+.LP
+The time member is set to the time when the event was generated
+and is expressed in milliseconds.
+The x and y members are set to the coordinates of the pointer position in 
+the event window.
+This position is always the pointer's final position,
+not its initial position.
+If the event window is on the same
+screen as the root window, x and y are the pointer coordinates
+relative to the event window's origin. 
+Otherwise, x and y are set to zero.
+The x_root and y_root members are set to the pointer's coordinates relative to the
+root window's origin at the time of the event.
+.LP
+The same_screen member is set to indicate whether the event window is on the same screen
+as the root window and can be either
+.ZN True 
+or
+.ZN False .
+If
+.ZN True ,
+the event and root windows are on the same screen.
+If
+.ZN False ,
+the event and root windows are not on the same screen.
+.LP
+The focus member is set to indicate whether the event window is the focus window or an
+inferior of the focus window.
+The X server can set this member to either
+.ZN True 
+or
+.ZN False .
+If
+.ZN True ,
+the event window is the focus window or an inferior of the focus window.
+If
+.ZN False ,
+the event window is not the focus window or an inferior of the focus window.
+.LP
+The state member is set to indicate the state of the pointer buttons and
+modifier keys just prior to the
+event.
+The X server can set this member to the bitwise inclusive OR of one 
+or more of the button or modifier key masks:
+.ZN Button1Mask ,
+.ZN Button2Mask ,
+.ZN Button3Mask ,
+.ZN Button4Mask ,
+.ZN Button5Mask ,
+.ZN ShiftMask ,
+.ZN LockMask ,
+.ZN ControlMask ,
+.ZN Mod1Mask ,
+.ZN Mod2Mask ,
+.ZN Mod3Mask ,
+.ZN Mod4Mask ,
+.ZN Mod5Mask .
+.LP
+The mode member is set to indicate whether the events are normal events, 
+pseudo-motion events
+when a grab activates, or pseudo-motion events when a grab deactivates.
+The X server can set this member to 
+.ZN NotifyNormal ,
+.ZN NotifyGrab ,
+or
+.ZN NotifyUngrab .
+.LP
+The detail member is set to indicate the notify detail and can be
+.ZN NotifyAncestor ,
+.ZN NotifyVirtual ,
+.ZN NotifyInferior ,
+.ZN NotifyNonlinear ,
+or
+.ZN NotifyNonlinearVirtual .
+.SH "SEE ALSO"
+XAnyEvent(__libmansuffix__),
+XButtonEvent(__libmansuffix__),
+XCreateWindowEvent(__libmansuffix__),
+XCirculateEvent(__libmansuffix__),
+XCirculateRequestEvent(__libmansuffix__),
+XColormapEvent(__libmansuffix__),
+XConfigureEvent(__libmansuffix__),
+XConfigureRequestEvent(__libmansuffix__),
+XDestroyWindowEvent(__libmansuffix__),
+XErrorEvent(__libmansuffix__),
+XExposeEvent(__libmansuffix__),
+XFocusChangeEvent(__libmansuffix__),
+XGraphicsExposeEvent(__libmansuffix__),
+XGravityEvent(__libmansuffix__),
+XKeymapEvent(__libmansuffix__),
+XMapEvent(__libmansuffix__),
+XMapRequestEvent(__libmansuffix__),
+XPropertyEvent(__libmansuffix__),
+XReparentEvent(__libmansuffix__),
+XResizeRequestEvent(__libmansuffix__),
+XSelectionClearEvent(__libmansuffix__),
+XSelectionEvent(__libmansuffix__),
+XSelectionRequestEvent(__libmansuffix__),
+XUnmapEvent(__libmansuffix__),
+XVisibilityEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XDefaultString.man b/man/XDefaultString.man
new file mode 100644 (file)
index 0000000..5e871ab
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XmbTextListToTextProperty.__libmansuffix__
diff --git a/man/XDefineCursor.man b/man/XDefineCursor.man
new file mode 100644 (file)
index 0000000..21e605d
--- /dev/null
@@ -0,0 +1,201 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XDefineCursor __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XDefineCursor, XUndefineCursor \- define cursors
+.SH SYNTAX
+.HP
+int XDefineCursor\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, Cursor
+\fIcursor\fP\^);
+.HP
+int XUndefineCursor\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^); 
+.SH ARGUMENTS
+.IP \fIcursor\fP 1i
+Specifies the cursor that is to be displayed or
+.ZN None .
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIw\fP 1i
+Specifies the window.
+.SH DESCRIPTION
+If a cursor is set, it will be used when the pointer is in the window.
+If the cursor is
+.ZN None ,
+it is equivalent to
+.ZN XUndefineCursor .
+.LP
+.ZN XDefineCursor
+can generate
+.ZN BadCursor
+and
+.ZN BadWindow 
+errors.
+.LP
+The
+.ZN XUndefineCursor
+function undoes the effect of a previous
+.ZN XDefineCursor
+for this window.
+When the pointer is in the window,
+the parent's cursor will now be used.
+On the root window,
+the default cursor is restored.
+.LP
+.ZN XUndefineCursor
+can generate a
+.ZN BadWindow 
+error.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadCursor
+A value for a Cursor argument does not name a defined Cursor.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XCreateFontCursor(__libmansuffix__),
+XRecolorCursor(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XDeleteContext.man b/man/XDeleteContext.man
new file mode 100644 (file)
index 0000000..f0b9747
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSaveContext.__libmansuffix__
diff --git a/man/XDeleteModifiermapEntry.man b/man/XDeleteModifiermapEntry.man
new file mode 100644 (file)
index 0000000..cc772af
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XChangeKeyboardMapping.__libmansuffix__
diff --git a/man/XDeleteProperty.man b/man/XDeleteProperty.man
new file mode 100644 (file)
index 0000000..ce26c3d
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XGetWindowProperty.__libmansuffix__
diff --git a/man/XDestroyIC.man b/man/XDestroyIC.man
new file mode 100644 (file)
index 0000000..2c9fd66
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XCreateIC.__libmansuffix__
diff --git a/man/XDestroyImage.man b/man/XDestroyImage.man
new file mode 100644 (file)
index 0000000..19e5be3
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XInitImage.__libmansuffix__
diff --git a/man/XDestroyOC.man b/man/XDestroyOC.man
new file mode 100644 (file)
index 0000000..12d5a3d
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XCreateOC.__libmansuffix__
diff --git a/man/XDestroyRegion.man b/man/XDestroyRegion.man
new file mode 100644 (file)
index 0000000..a643153
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XCreateRegion.__libmansuffix__
diff --git a/man/XDestroySubwindows.man b/man/XDestroySubwindows.man
new file mode 100644 (file)
index 0000000..87e6e78
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XDestroyWindow.__libmansuffix__
diff --git a/man/XDestroyWindow.man b/man/XDestroyWindow.man
new file mode 100644 (file)
index 0000000..aec3c89
--- /dev/null
@@ -0,0 +1,217 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XDestroyWindow __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XDestroyWindow, XDestroySubwindows \- destroy windows
+.SH SYNTAX
+.HP
+int XDestroyWindow\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^); 
+.HP
+int XDestroySubwindows\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIw\fP 1i
+Specifies the window.
+.SH DESCRIPTION
+The
+.ZN XDestroyWindow
+function destroys the specified window as well as all of its subwindows and causes
+the X server to generate a
+.ZN DestroyNotify
+event for each window.
+The window should never be referenced again.
+If the window specified by the w argument is mapped,
+it is unmapped automatically.
+The ordering of the
+.ZN DestroyNotify
+events is such that for any given window being destroyed,
+.ZN DestroyNotify
+is generated on any inferiors of the window before being generated on
+the window itself.
+The ordering among siblings and across subhierarchies is not otherwise
+constrained.
+If the window you specified is a root window, no windows are destroyed.
+Destroying a mapped window will generate 
+.ZN Expose 
+events on other windows that were obscured by the window being destroyed.
+.LP
+.ZN XDestroyWindow
+can generate a
+.ZN BadWindow 
+error.
+.LP
+The
+.ZN XDestroySubwindows
+function destroys all inferior windows of the specified window, 
+in bottom-to-top stacking order.
+It causes the X server to generate a
+.ZN DestroyNotify
+event for each window.
+If any mapped
+subwindows were actually destroyed,
+.ZN XDestroySubwindows
+causes the X server to generate 
+.ZN Expose 
+events on the specified window.
+This is much more efficient than deleting many windows
+one at a time because much of the work need be performed only once for all
+of the windows, rather than for each window.
+The subwindows should never be referenced again.  
+.LP
+.ZN XDestroySubwindows
+can generate a
+.ZN BadWindow 
+error.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XChangeWindowAttributes(__libmansuffix__),
+XConfigureWindow(__libmansuffix__),
+XCreateWindow(__libmansuffix__),
+XMapWindow(__libmansuffix__),
+XRaiseWindow(__libmansuffix__),
+XUnmapWindow(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XDestroyWindowEvent.man b/man/XDestroyWindowEvent.man
new file mode 100644 (file)
index 0000000..954406a
--- /dev/null
@@ -0,0 +1,219 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XDestroyWindowEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XDestroyWindowEvent \- DestroyNotify event structure
+.SH STRUCTURES
+The structure for
+.ZN DestroyNotify
+events contains:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int type;       /\&* DestroyNotify */
+       unsigned long serial;   /\&* # of last request processed by server */
+       Bool send_event;        /\&* true if this came from a SendEvent request */
+       Display *display;       /\&* Display the event was read from */
+       Window event;
+       Window window;
+} XDestroyWindowEvent;
+.De
+.LP
+When you receive this event,
+the structure members are set as follows.
+.LP
+The type member is set to the event type constant name that uniquely identifies
+it.
+For example, when the X server reports a
+.ZN GraphicsExpose
+event to a client application, it sends an
+.ZN XGraphicsExposeEvent
+structure with the type member set to
+.ZN GraphicsExpose .
+The display member is set to a pointer to the display the event was read on.
+The send_event member is set to
+.ZN True
+if the event came from a
+.ZN SendEvent
+protocol request.
+The serial member is set from the serial number reported in the protocol
+but expanded from the 16-bit least-significant bits to a full 32-bit value.
+The window member is set to the window that is most useful to toolkit
+dispatchers.
+.LP
+The event member is set either to the destroyed window or to its parent,
+depending on whether
+.ZN StructureNotify
+or 
+.ZN SubstructureNotify
+was selected.
+The window member is set to the window that is destroyed.
+.SH "SEE ALSO"
+XAnyEvent(__libmansuffix__),
+XButtonEvent(__libmansuffix__),
+XCreateWindowEvent(__libmansuffix__),
+XCirculateEvent(__libmansuffix__),
+XCirculateRequestEvent(__libmansuffix__),
+XColormapEvent(__libmansuffix__),
+XConfigureEvent(__libmansuffix__),
+XConfigureRequestEvent(__libmansuffix__),
+XCrossingEvent(__libmansuffix__),
+XErrorEvent(__libmansuffix__),
+XExposeEvent(__libmansuffix__),
+XFocusChangeEvent(__libmansuffix__),
+XGraphicsExposeEvent(__libmansuffix__),
+XGravityEvent(__libmansuffix__),
+XKeymapEvent(__libmansuffix__),
+XMapEvent(__libmansuffix__),
+XMapRequestEvent(__libmansuffix__),
+XPropertyEvent(__libmansuffix__),
+XReparentEvent(__libmansuffix__),
+XResizeRequestEvent(__libmansuffix__),
+XSelectionClearEvent(__libmansuffix__),
+XSelectionEvent(__libmansuffix__),
+XSelectionRequestEvent(__libmansuffix__),
+XUnmapEvent(__libmansuffix__),
+XVisibilityEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XDirectionalDependentDrawing.man b/man/XDirectionalDependentDrawing.man
new file mode 100644 (file)
index 0000000..ba0cd76
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XFontsOfFontSet.__libmansuffix__
diff --git a/man/XDisableAccessControl.man b/man/XDisableAccessControl.man
new file mode 100644 (file)
index 0000000..13e833b
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAddHost.__libmansuffix__
diff --git a/man/XDisplayKeycodes.man b/man/XDisplayKeycodes.man
new file mode 100644 (file)
index 0000000..cc772af
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XChangeKeyboardMapping.__libmansuffix__
diff --git a/man/XDisplayMotionBufferSize.man b/man/XDisplayMotionBufferSize.man
new file mode 100644 (file)
index 0000000..bfd75c0
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSendEvent.__libmansuffix__
diff --git a/man/XDisplayName.man b/man/XDisplayName.man
new file mode 100644 (file)
index 0000000..de67624
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetErrorHandler.__libmansuffix__
diff --git a/man/XDisplayOfIM.man b/man/XDisplayOfIM.man
new file mode 100644 (file)
index 0000000..6365409
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XOpenIM.__libmansuffix__
diff --git a/man/XDisplayOfOM.man b/man/XDisplayOfOM.man
new file mode 100644 (file)
index 0000000..3b4acf5
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XOpenOM.__libmansuffix__
diff --git a/man/XDrawArc.man b/man/XDrawArc.man
new file mode 100644 (file)
index 0000000..3621d1c
--- /dev/null
@@ -0,0 +1,339 @@
+'\" e
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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
+.de EX
+.sp
+.nf
+.ft CW
+..
+.de EE
+.ft R
+.fi
+.sp
+..
+'\" e
+.TH XDrawArc __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XDrawArc, XDrawArcs, XArc \- draw arcs and arc structure
+.SH SYNTAX
+.HP
+int XDrawArc\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, GC \fIgc\fP\^,
+int \fIx\fP\^, int \fIy\fP\^, unsigned int \fIwidth\fP\^, unsigned int
+\fIheight\fP\^, int \fIangle1\fP\^, int \fIangle2\fP\^); 
+.HP
+int XDrawArcs\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, GC \fIgc\fP\^,
+XArc *\fIarcs\fP\^, int \fInarcs\fP\^); 
+.SH ARGUMENTS
+.IP \fIangle1\fP 1i
+Specifies the start of the arc relative to the three-o'clock position
+from the center, in units of degrees * 64.
+.IP \fIangle2\fP 1i
+Specifies the path and extent of the arc relative to the start of the
+arc, in units of degrees * 64.
+.IP \fIarcs\fP 1i
+Specifies an array of arcs.
+.IP \fId\fP 1i
+Specifies the drawable. 
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fInarcs\fP 1i
+Specifies the number of arcs in the array.
+.ds Wh , which are the major and minor axes of the arc
+.IP \fIwidth\fP 1i
+.br
+.ns
+.IP \fIheight\fP 1i
+Specify the width and height\*(Wh.
+.ds Xy , which are relative to the origin of the drawable \
+and specify the upper-left corner of the bounding rectangle
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.SH DESCRIPTION
+.EQ
+delim %%
+.EN
+.ZN XDrawArc
+draws a single circular or elliptical arc, and 
+.ZN XDrawArcs
+draws multiple circular or elliptical arcs.
+Each arc is specified by a rectangle and two angles.  
+The center of the circle or ellipse is the center of the
+rectangle, and the major and minor axes are specified by the width and height.
+Positive angles indicate counterclockwise motion, 
+and negative angles indicate clockwise motion.  
+If the magnitude of angle2 is greater than 360 degrees, 
+.ZN XDrawArc
+or 
+.ZN XDrawArcs
+truncates it to 360 degrees.
+.LP
+For an arc specified as %[ ~x, ~y, ~width , ~height, ~angle1, ~angle2 ]%, 
+the origin of the major and minor axes is at 
+% [ x +^ {width over 2} , ~y +^ {height over 2}  ]%, 
+and the infinitely thin path describing the entire circle or ellipse 
+intersects the horizontal axis at % [ x, ~y +^ {height over 2}  ]% and 
+% [ x +^ width , ~y +^ { height over 2 }] %
+and intersects the vertical axis at % [ x +^ { width over 2 } , ~y ]% and 
+% [ x +^ { width over 2 }, ~y +^ height ]%.
+These coordinates can be fractional
+and so are not truncated to discrete coordinates.
+The path should be defined by the ideal mathematical path.  
+For a wide line with line-width lw, 
+the bounding outlines for filling are given        
+by the two infinitely thin paths consisting of all points whose perpendicular
+distance from the path of the circle/ellipse is equal to lw/2
+(which may be a fractional value).
+The cap-style and join-style are applied the same as for a line
+corresponding to the tangent of the circle/ellipse at the endpoint.
+.LP
+For an arc specified as % [ ~x, ~y, ~width, ~height, ~angle1, ~angle2  ]%,
+the angles must be specified
+in the effectively skewed coordinate system of the ellipse (for a
+circle, the angles and coordinate systems are identical).  The
+relationship between these angles and angles expressed in the normal
+coordinate system of the screen (as measured with a protractor) is as
+follows:
+.LP
+.Ds
+% roman "skewed-angle" ~ = ~ atan left ( tan ( roman "normal-angle" )
+ * width over height right ) +^ adjust%
+.De
+.LP
+The skewed-angle and normal-angle are expressed in radians (rather
+than in degrees scaled by 64) in the range % [ 0 , ~2 pi  ]% and where atan
+returns a value in the range % [ - pi over 2 , ~pi over 2  ] %
+and adjust is:
+.LP
+.TS
+l l.
+%0%    for normal-angle in the range % [ 0 , ~pi over 2  ]%
+%pi%   for normal-angle in the range % [ pi over 2 , ~{3 pi} over 2  ]%
+%2 pi% for normal-angle in the range % [ {3 pi} over 2 , ~2 pi  ]%
+.TE
+.LP
+For any given arc, 
+.ZN XDrawArc
+and
+.ZN XDrawArcs
+do not draw a pixel more than once.  
+If two arcs join correctly and if the line-width is greater than zero 
+and the arcs intersect, 
+.ZN XDrawArc
+and
+.ZN XDrawArcs
+do not draw a pixel more than once.
+Otherwise, 
+the intersecting pixels of intersecting arcs are drawn multiple times.
+Specifying an arc with one endpoint and a clockwise extent draws the same pixels
+as specifying the other endpoint and an equivalent counterclockwise extent,
+except as it affects joins.
+.LP
+If the last point in one arc coincides with the first point in the following 
+arc, the two arcs will join correctly.  
+If the first point in the first arc coincides with the last point in the last 
+arc, the two arcs will join correctly.
+By specifying one axis to be zero, a horizontal or vertical line can be
+drawn.
+Angles are computed based solely on the coordinate system and ignore the
+aspect ratio.
+.LP
+Both functions use these GC components: 
+function, plane-mask, line-width, line-style, cap-style, join-style, 
+fill-style, subwindow-mode, clip-x-origin, clip-y-origin, and clip-mask.
+They also use these GC mode-dependent components: 
+foreground, background, tile, stipple, tile-stipple-x-origin, 
+tile-stipple-y-origin, dash-offset, and dash-list.
+.LP
+.ZN XDrawArc
+and
+.ZN XDrawArcs
+can generate
+.ZN BadDrawable ,
+.ZN BadGC ,
+and
+.ZN BadMatch 
+errors.
+.SH STRUCTURES
+The
+.ZN XArc
+structure contains:
+.LP
+.EX
+typedef struct {
+       short x, y;
+       unsigned short width, height;
+       short angle1, angle2;             /\&* Degrees * 64 */
+} XArc;
+.EE
+.LP
+All x and y members are signed integers.
+The width and height members are 16-bit unsigned integers.
+You should be careful not to generate coordinates and sizes
+out of the 16-bit ranges, because the protocol only has 16-bit fields
+for these values.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadDrawable
+A value for a Drawable argument does not name a defined Window or Pixmap.
+.TP 1i
+.ZN BadGC
+A value for a GContext argument does not name a defined GContext.
+.TP 1i
+.ZN BadMatch
+An
+.ZN InputOnly
+window is used as a Drawable.
+.TP 1i
+.ZN BadMatch
+Some argument or pair of arguments has the correct type and range but fails
+to match in some other way required by the request.
+.SH "SEE ALSO"
+XDrawLine(__libmansuffix__),
+XDrawPoint(__libmansuffix__),
+XDrawRectangle(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XDrawArcs.man b/man/XDrawArcs.man
new file mode 100644 (file)
index 0000000..30b9b85
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XDrawArc.__libmansuffix__
diff --git a/man/XDrawImageString.man b/man/XDrawImageString.man
new file mode 100644 (file)
index 0000000..480e2d4
--- /dev/null
@@ -0,0 +1,252 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XDrawImageString __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XDrawImageString, XDrawImageString16 \- draw image text
+.SH SYNTAX
+.HP
+int XDrawImageString\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, GC
+\fIgc\fP\^, int \fIx\fP\^, int \fIy\fP\^, char *\fIstring\fP\^, int
+\fIlength\fP\^); 
+.HP
+int XDrawImageString16\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, GC
+\fIgc\fP\^, int \fIx\fP\^, int \fIy\fP\^, XChar2b *\fIstring\fP\^, int
+\fIlength\fP\^); 
+.SH ARGUMENTS
+.IP \fId\fP 1i
+Specifies the drawable. 
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fIlength\fP 1i
+Specifies the number of characters in the string argument.
+.IP \fIstring\fP 1i
+Specifies the character string.
+.ds Xy , which are relative to the origin of the specified drawable \
+and define the origin of the first character
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.SH DESCRIPTION
+The
+.ZN XDrawImageString16
+function is similar to
+.ZN XDrawImageString 
+except that it uses 2-byte or 16-bit characters.
+Both functions also use both the foreground and background pixels 
+of the GC in the destination.
+.LP
+The effect is first to fill a
+destination rectangle with the background pixel defined in the GC and then
+to paint the text with the foreground pixel.
+The upper-left corner of the filled rectangle is at:
+.LP
+.Ds
+[x, y \- font-ascent]
+.De
+.LP
+The width is:
+.LP
+.Ds
+overall-width
+.De
+.LP
+The height is:
+.LP
+.Ds
+font-ascent + font-descent
+.De
+.LP
+The overall-width, font-ascent, and font-descent
+are as would be returned by 
+.ZN XQueryTextExtents 
+using gc and string.
+The function and fill-style defined in the GC are ignored for these functions. 
+The effective function is 
+.ZN GXcopy ,
+and the effective fill-style is
+.ZN FillSolid .
+.LP
+For fonts defined with 2-byte matrix indexing
+and used with
+.ZN XDrawImageString ,
+each byte is used as a byte2 with a byte1 of zero.
+.LP
+Both functions use these GC components: 
+plane-mask, foreground, background, font, subwindow-mode, clip-x-origin, 
+clip-y-origin, and clip-mask.
+.LP
+.ZN XDrawImageString
+and
+.ZN XDrawImageString16
+can generate
+.ZN BadDrawable ,
+.ZN BadGC ,
+and
+.ZN BadMatch 
+errors.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadDrawable
+A value for a Drawable argument does not name a defined Window or Pixmap.
+.TP 1i
+.ZN BadGC
+A value for a GContext argument does not name a defined GContext.
+.TP 1i
+.ZN BadMatch
+An
+.ZN InputOnly
+window is used as a Drawable.
+.TP 1i
+.ZN BadMatch
+Some argument or pair of arguments has the correct type and range but fails
+to match in some other way required by the request.
+.SH "SEE ALSO"
+XDrawString(__libmansuffix__),
+XDrawText(__libmansuffix__),
+XLoadFont(__libmansuffix__),
+XTextExtents(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XDrawImageString16.man b/man/XDrawImageString16.man
new file mode 100644 (file)
index 0000000..ff07b25
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XDrawImageString.__libmansuffix__
diff --git a/man/XDrawLine.man b/man/XDrawLine.man
new file mode 100644 (file)
index 0000000..8f22ecf
--- /dev/null
@@ -0,0 +1,308 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XDrawLine __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XDrawLine, XDrawLines, XDrawSegments, XSegment \- draw lines, polygons, and line structure
+.SH SYNTAX
+.HP
+int XDrawLine\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, GC \fIgc\fP\^,
+int \fIx1\fP\^, int \fIy1\fP\^, int \fIx2\fP\^, int \fIy2\fP\^); 
+.HP 
+int XDrawLines\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, GC
+\fIgc\fP\^, XPoint *\fIpoints\fP\^, int \fInpoints\fP\^, int \fImode\fP\^); 
+.HP 
+int XDrawSegments\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, GC
+\fIgc\fP\^, XSegment *\fIsegments\fP\^, int \fInsegments\fP\^); 
+.SH ARGUMENTS
+.IP \fId\fP 1i
+Specifies the drawable. 
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fImode\fP 1i
+Specifies the coordinate mode. 
+You can pass
+.ZN CoordModeOrigin
+or
+.ZN CoordModePrevious .
+.IP \fInpoints\fP 1i
+Specifies the number of points in the array.
+.IP \fInsegments\fP 1i
+Specifies the number of segments in the array.
+.IP \fIpoints\fP 1i
+Specifies an array of points.
+.IP \fIsegments\fP 1i
+Specifies an array of segments.
+.IP \fIx1\fP 1i
+.br
+.ns
+.IP \fIy1\fP 1i
+.br
+.ns
+.IP \fIx2\fP 1i
+.br
+.ns
+.IP \fIy2\fP 1i
+Specify the points (x1, y1) and (x2, y2) to be connected.
+.SH DESCRIPTION
+The
+.ZN XDrawLine
+function uses the components of the specified GC to
+draw a line between the specified set of points (x1, y1) and (x2, y2).
+It does not perform joining at coincident endpoints.
+For any given line, 
+.ZN XDrawLine 
+does not draw a pixel more than once.
+If lines intersect, the intersecting pixels are drawn multiple times.  
+.LP
+The
+.ZN XDrawLines
+function uses the components of the specified GC to draw 
+npoints\-1 lines between each pair of points (point[i], point[i+1]) 
+in the array of
+.ZN XPoint
+structures.
+It draws the lines in the order listed in the array.
+The lines join correctly at all intermediate points, and if the first and last
+points coincide, the first and last lines also join correctly.
+For any given line, 
+.ZN XDrawLines
+does not draw a pixel more than once.
+If thin (zero line-width) lines intersect, 
+the intersecting pixels are drawn multiple times.
+If wide lines intersect, the intersecting pixels are drawn only once, as though
+the entire 
+.ZN PolyLine 
+protocol request were a single, filled shape.
+.ZN CoordModeOrigin
+treats all coordinates as relative to the origin,
+and
+.ZN CoordModePrevious
+treats all coordinates after the first as relative to the previous point.
+.LP
+The
+.ZN XDrawSegments 
+function draws multiple, unconnected lines. 
+For each segment, 
+.ZN XDrawSegments 
+draws a
+line between (x1, y1) and (x2, y2).
+It draws the lines in the order listed in the array of
+.ZN XSegment
+structures and does not perform joining at coincident endpoints.
+For any given line, 
+.ZN XDrawSegments
+does not draw a pixel more than once.  
+If lines intersect, the intersecting pixels are drawn multiple times.  
+.LP
+All three functions use these GC components:
+function, plane-mask, line-width,
+line-style, cap-style, fill-style, subwindow-mode,
+clip-x-origin, clip-y-origin, and clip-mask.
+The
+.ZN XDrawLines
+function also uses the join-style GC component.
+All three functions also use these GC mode-dependent components:
+foreground, background, tile, stipple, tile-stipple-x-origin, 
+tile-stipple-y-origin, dash-offset, and dash-list.
+.LP
+.ZN XDrawLine ,
+.ZN XDrawLines ,
+and
+.ZN XDrawSegments
+can generate
+.ZN BadDrawable ,
+.ZN BadGC ,
+and
+.ZN BadMatch 
+errors.
+.ZN XDrawLines
+can also generate a
+.ZN BadValue 
+error.
+.SH STRUCTURES
+The
+.ZN XSegment
+structure contains:
+.LP
+.Ds 0
+.TA .5i
+.ta .5i
+typedef struct {
+       short x1, y1, x2, y2;
+} XSegment;
+.De
+.LP
+All x and y members are signed integers.
+The width and height members are 16-bit unsigned integers.
+You should be careful not to generate coordinates and sizes
+out of the 16-bit ranges, because the protocol only has 16-bit fields
+for these values.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadDrawable
+A value for a Drawable argument does not name a defined Window or Pixmap.
+.TP 1i
+.ZN BadGC
+A value for a GContext argument does not name a defined GContext.
+.TP 1i
+.ZN BadMatch
+An
+.ZN InputOnly
+window is used as a Drawable.
+.TP 1i
+.ZN BadMatch
+Some argument or pair of arguments has the correct type and range but fails
+to match in some other way required by the request.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.SH "SEE ALSO"
+XDrawArc(__libmansuffix__),
+XDrawPoint(__libmansuffix__),
+XDrawRectangle(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XDrawLines.man b/man/XDrawLines.man
new file mode 100644 (file)
index 0000000..ae1ad04
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XDrawLine.__libmansuffix__
diff --git a/man/XDrawPoint.man b/man/XDrawPoint.man
new file mode 100644 (file)
index 0000000..ca0e0b9
--- /dev/null
@@ -0,0 +1,252 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XDrawPoint __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XDrawPoint, XDrawPoints, XPoint \- draw points and points structure
+.SH SYNTAX
+.HP
+int XDrawPoint\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, GC
+\fIgc\fP\^, int \fIx\fP\^, int \fIy\fP\^); 
+.HP
+int XDrawPoints\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, GC
+\fIgc\fP\^, XPoint *\fIpoints\fP\^, int \fInpoints\fP\^, int \fImode\fP\^); 
+.SH ARGUMENTS
+.IP \fId\fP 1i
+Specifies the drawable. 
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fImode\fP 1i
+Specifies the coordinate mode. 
+You can pass
+.ZN CoordModeOrigin
+or
+.ZN CoordModePrevious .
+.IP \fInpoints\fP 1i
+Specifies the number of points in the array.
+.IP \fIpoints\fP 1i
+Specifies an array of points.
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates where you want the point drawn.
+.SH DESCRIPTION
+The
+.ZN XDrawPoint
+function uses the foreground pixel and function components of the
+GC to draw a single point into the specified drawable; 
+.ZN XDrawPoints
+draws multiple points this way.
+.ZN CoordModeOrigin
+treats all coordinates as relative to the origin,
+and
+.ZN CoordModePrevious
+treats all coordinates after the first as relative to the previous point.
+.ZN XDrawPoints
+draws the points in the order listed in the array.
+.LP
+Both functions use these GC components: function, plane-mask,
+foreground, subwindow-mode, clip-x-origin, clip-y-origin, and clip-mask.
+.LP
+.ZN XDrawPoint
+can generate
+.ZN BadDrawable ,
+.ZN BadGC ,
+and 
+.ZN BadMatch 
+errors.
+.ZN XDrawPoints
+can generate
+.ZN BadDrawable ,
+.ZN BadGC ,
+.ZN BadMatch ,
+and
+.ZN BadValue 
+errors.
+.SH STRUCTURES
+The
+.ZN XPoint
+structure contains:
+.LP
+.Ds 0
+.TA .5i
+.ta .5i
+typedef struct {
+       short x, y;
+} XPoint;
+.De
+.LP
+All x and y members are signed integers.
+The width and height members are 16-bit unsigned integers.
+You should be careful not to generate coordinates and sizes
+out of the 16-bit ranges, because the protocol only has 16-bit fields
+for these values.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadDrawable
+A value for a Drawable argument does not name a defined Window or Pixmap.
+.TP 1i
+.ZN BadGC
+A value for a GContext argument does not name a defined GContext.
+.TP 1i
+.ZN BadMatch
+An
+.ZN InputOnly
+window is used as a Drawable.
+.TP 1i
+.ZN BadMatch
+Some argument or pair of arguments has the correct type and range but fails
+to match in some other way required by the request.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.SH "SEE ALSO"
+XDrawArc(__libmansuffix__),
+XDrawLine(__libmansuffix__),
+XDrawRectangle(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XDrawPoints.man b/man/XDrawPoints.man
new file mode 100644 (file)
index 0000000..972f3c1
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XDrawPoint.__libmansuffix__
diff --git a/man/XDrawRectangle.man b/man/XDrawRectangle.man
new file mode 100644 (file)
index 0000000..1383825
--- /dev/null
@@ -0,0 +1,252 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XDrawRectangle __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XDrawRectangle, XDrawRectangles, XRectangle \- draw rectangles and rectangles structure
+.SH SYNTAX
+.HP
+int XDrawRectangle\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, GC
+\fIgc\fP\^, int \fIx\fP\^, int \fIy\fP\^, unsigned int \fIwidth\fP\^, unsigned
+int \fIheight\fP\^); 
+.HP
+int XDrawRectangles\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, GC
+\fIgc\fP\^, XRectangle \fIrectangles\fP\^[\^]\^, int \fInrectangles\fP\^); 
+.SH ARGUMENTS
+.IP \fId\fP 1i
+Specifies the drawable. 
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fInrectangles\fP 1i
+Specifies the number of rectangles in the array.
+.IP \fIrectangles\fP 1i
+Specifies an array of rectangles.
+.ds Wh , which specify the dimensions of the rectangle
+.IP \fIwidth\fP 1i
+.br
+.ns
+.IP \fIheight\fP 1i
+Specify the width and height\*(Wh.
+.ds Xy , which specify the upper-left corner of the rectangle
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.SH DESCRIPTION
+The
+.ZN XDrawRectangle
+and
+.ZN XDrawRectangles
+functions draw the outlines of the specified rectangle or rectangles as
+if a five-point 
+.ZN PolyLine 
+protocol request were specified for each rectangle:
+.IP
+[x,y] [x+width,y] [x+width,y+height] [x,y+height] [x,y]
+.LP 
+For the specified rectangle or rectangles, 
+these functions do not draw a pixel more than once.
+.ZN XDrawRectangles
+draws the rectangles in the order listed in the array.
+If rectangles intersect,
+the intersecting pixels are drawn multiple times.
+.LP
+Both functions use these GC components: 
+function, plane-mask, line-width,
+line-style, cap-style, join-style, fill-style, 
+subwindow-mode, clip-x-origin, clip-y-origin, and clip-mask.
+They also use these GC mode-dependent components: 
+foreground, background, tile, stipple, tile-stipple-x-origin, 
+tile-stipple-y-origin, dash-offset, and dash-list.
+.LP
+.ZN XDrawRectangle
+and
+.ZN XDrawRectangles
+can generate
+.ZN BadDrawable ,
+.ZN BadGC ,
+and
+.ZN BadMatch 
+errors.
+.SH STRUCTURES
+The
+.ZN XRectangle
+structure contains:
+.LP
+.Ds 0
+.TA .5i
+.ta .5i
+typedef struct {
+       short x, y;
+       unsigned short width, height;
+} XRectangle;
+.De
+.LP
+All x and y members are signed integers.
+The width and height members are 16-bit unsigned integers.
+You should be careful not to generate coordinates and sizes
+out of the 16-bit ranges, because the protocol only has 16-bit fields
+for these values.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadDrawable
+A value for a Drawable argument does not name a defined Window or Pixmap.
+.TP 1i
+.ZN BadGC
+A value for a GContext argument does not name a defined GContext.
+.TP 1i
+.ZN BadMatch
+An
+.ZN InputOnly
+window is used as a Drawable.
+.TP 1i
+.ZN BadMatch
+Some argument or pair of arguments has the correct type and range but fails
+to match in some other way required by the request.
+.SH "SEE ALSO"
+XDrawArc(__libmansuffix__),
+XDrawLine(__libmansuffix__),
+XDrawPoint(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XDrawRectangles.man b/man/XDrawRectangles.man
new file mode 100644 (file)
index 0000000..9bb2a50
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XDrawRectangle.__libmansuffix__
diff --git a/man/XDrawSegments.man b/man/XDrawSegments.man
new file mode 100644 (file)
index 0000000..ae1ad04
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XDrawLine.__libmansuffix__
diff --git a/man/XDrawString.man b/man/XDrawString.man
new file mode 100644 (file)
index 0000000..d9a9d35
--- /dev/null
@@ -0,0 +1,218 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XDrawString __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XDrawString, XDrawString16 \- draw text characters
+.SH SYNTAX
+.HP
+int XDrawString\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, GC
+\fIgc\fP\^, int \fIx\fP\^, int \fIy\fP\^, char *\fIstring\fP\^, int
+\fIlength\fP\^); 
+.HP
+int XDrawString16\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, GC
+\fIgc\fP\^, int \fIx\fP\^, int \fIy\fP\^, XChar2b *\fIstring\fP\^, int
+\fIlength\fP\^); 
+.SH ARGUMENTS
+.IP \fId\fP 1i
+Specifies the drawable. 
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fIlength\fP 1i
+Specifies the number of characters in the string argument.
+.IP \fIstring\fP 1i
+Specifies the character string.
+.ds Xy , which are relative to the origin of the specified drawable \
+and define the origin of the first character
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.SH DESCRIPTION
+Each character image, as defined by the font in the GC, is treated as an
+additional mask for a fill operation on the drawable.
+The drawable is modified only where the font character has a bit set to 1.
+For fonts defined with 2-byte matrix indexing
+and used with
+.ZN XDrawString16 ,
+each byte is used as a byte2 with a byte1 of zero.
+.LP
+Both functions use these GC components: 
+function, plane-mask, fill-style, font, subwindow-mode, clip-x-origin, 
+clip-y-origin, and clip-mask.
+They also use these GC mode-dependent components: 
+foreground, background, tile, stipple, tile-stipple-x-origin, 
+and tile-stipple-y-origin.
+.LP
+.ZN XDrawString
+and
+.ZN XDrawString16
+can generate
+.ZN BadDrawable ,
+.ZN BadGC ,
+and
+.ZN BadMatch 
+errors.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadDrawable
+A value for a Drawable argument does not name a defined Window or Pixmap.
+.TP 1i
+.ZN BadGC
+A value for a GContext argument does not name a defined GContext.
+.TP 1i
+.ZN BadMatch
+An
+.ZN InputOnly
+window is used as a Drawable.
+.TP 1i
+.ZN BadMatch
+Some argument or pair of arguments has the correct type and range but fails
+to match in some other way required by the request.
+.SH "SEE ALSO"
+XDrawImageString(__libmansuffix__),
+XDrawText(__libmansuffix__),
+XLoadFont(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XDrawString16.man b/man/XDrawString16.man
new file mode 100644 (file)
index 0000000..b044b7b
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XDrawString.__libmansuffix__
diff --git a/man/XDrawText.man b/man/XDrawText.man
new file mode 100644 (file)
index 0000000..132ea97
--- /dev/null
@@ -0,0 +1,289 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XDrawText __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XDrawText, XDrawText16, XTextItem, XTextItem16 \- draw polytext text and text drawing structures
+.SH SYNTAX
+.HP
+int XDrawText\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, GC \fIgc\fP\^,
+int \fIx\fP\^, int \fIy\fP\^, XTextItem *\fIitems\fP\^, int \fInitems\fP\^); 
+.HP
+int XDrawText16\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, GC
+\fIgc\fP\^, int \fIx\fP\^, int \fIy\fP\^, XTextItem16 *\fIitems\fP\^, int
+\fInitems\fP\^); 
+.SH ARGUMENTS
+.IP \fId\fP 1i
+Specifies the drawable. 
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fIitems\fP 1i
+Specifies an array of text items.
+.IP \fInitems\fP 1i
+Specifies the number of text items in the array.
+.ds Xy , which are relative to the origin of the specified drawable \
+and define the origin of the first character
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.SH DESCRIPTION
+The
+.ZN XDrawText16
+function is similar to
+.ZN XDrawText 
+except that it uses 2-byte or 16-bit characters.
+Both functions allow complex spacing and font shifts between counted strings.
+.LP
+Each text item is processed in turn.
+A font member other than 
+.ZN None
+in an item causes the font to be stored in the GC
+and used for subsequent text.  
+A text element delta specifies an additional change
+in the position along the x axis before the string is drawn. 
+The delta is always added to the character origin
+and is not dependent on any characteristics of the font.
+Each character image, as defined by the font in the GC, is treated as an
+additional mask for a fill operation on the drawable.
+The drawable is modified only where the font character has a bit set to 1.
+If a text item generates a
+.ZN BadFont
+error, the previous text items may have been drawn.
+.LP
+For fonts defined with linear indexing rather than 2-byte matrix indexing,
+each 
+.ZN XChar2b
+structure is interpreted as a 16-bit number with byte1 as the 
+most significant byte.
+.LP
+Both functions use these GC components:
+function, plane-mask, fill-style, font, subwindow-mode, 
+clip-x-origin, clip-y-origin, and clip-mask.
+They also use these GC mode-dependent components: 
+foreground, background, tile, stipple, tile-stipple-x-origin, 
+and tile-stipple-y-origin.
+.LP
+.ZN XDrawText
+and
+.ZN XDrawText16
+can generate
+.ZN BadDrawable ,
+.ZN BadFont ,
+.ZN BadGC ,
+and
+.ZN BadMatch 
+errors.
+.SH STRUCTURES
+The
+.ZN XTextItem
+and
+.ZN XTextItem16
+structures contain:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       char *chars;    /\&* pointer to string */
+       int nchars;     /\&* number of characters */
+       int delta;      /\&* delta between strings */
+       Font font;      /\&* Font to print it in, None don't change */
+} XTextItem;
+.De
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       XChar2b *chars; /\&* pointer to two-byte characters */
+       int nchars;     /\&* number of characters */
+       int delta;      /\&* delta between strings */
+       Font font;      /\&* font to print it in, None don't change */
+} XTextItem16;
+.De
+.LP
+If the font member is not
+.ZN None ,
+the font is changed before printing and also is stored in the GC.
+If an error was generated during text drawing,
+the previous items may have been drawn.
+The baseline of the characters are drawn starting at the x and y
+coordinates that you pass in the text drawing functions.
+.LP
+For example, consider the background rectangle drawn by
+.ZN XDrawImageString .
+If you want the upper-left corner of the background rectangle
+to be at pixel coordinate (x,y), pass the (x,y + ascent)
+as the baseline origin coordinates to the text functions.
+The ascent is the font ascent, as given in the
+.ZN XFontStruct
+structure.
+If you want the lower-left corner of the background rectangle
+to be at pixel coordinate (x,y), pass the (x,y \- descent + 1)
+as the baseline origin coordinates to the text functions.
+The descent is the font descent, as given in the
+.ZN XFontStruct
+structure.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadDrawable
+A value for a Drawable argument does not name a defined Window or Pixmap.
+.TP 1i
+.ZN BadFont
+A value for a Font or GContext argument does not name a defined Font.
+.TP 1i
+.ZN BadGC
+A value for a GContext argument does not name a defined GContext.
+.TP 1i
+.ZN BadMatch
+An
+.ZN InputOnly
+window is used as a Drawable.
+.SH "SEE ALSO"
+XDrawImageString(__libmansuffix__),
+XDrawString(__libmansuffix__),
+XLoadFont(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XDrawText16.man b/man/XDrawText16.man
new file mode 100644 (file)
index 0000000..dfd6bfa
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XDrawText.__libmansuffix__
diff --git a/man/XEmptyRegion.man b/man/XEmptyRegion.man
new file mode 100644 (file)
index 0000000..bc00d4c
--- /dev/null
@@ -0,0 +1,209 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XEmptyRegion __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XEmptyRegion, XEqualRegion, XPointInRegion, XRectInRegion \- determine if regions are empty or equal
+.SH SYNTAX
+.HP
+Bool XEmptyRegion\^(\^Region \fIr\fP\^); 
+.HP
+Bool XEqualRegion\^(\^Region \fIr1\fP\^, Region \fIr2\fP\^); 
+.HP
+Bool XPointInRegion\^(\^Region \fIr\fP\^, int \fIx\fP\^, int \fIy\fP\^); 
+.HP
+int XRectInRegion\^(\^Region \fIr\fP\^, int \fIx\fP\^, int \fIy\fP\^, unsigned
+int \fIwidth\fP\^, unsigned int \fIheight\fP\^); 
+.SH ARGUMENTS
+.IP \fIr\fP 1i
+Specifies the region.
+.IP \fIr1\fP 1i
+.br
+.ns
+.IP \fIr2\fP 1i
+Specify the two regions.
+.ds Wh , which define the rectangle
+.IP \fIwidth\fP 1i
+.br
+.ns
+.IP \fIheight\fP 1i
+Specify the width and height\*(Wh.
+.ds Xy , which define the point \
+or the coordinates of the upper-left corner of the rectangle
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.SH DESCRIPTION
+The
+.ZN XEmptyRegion
+function returns
+.ZN True
+if the region is empty.
+.LP
+The
+.ZN XEqualRegion
+function returns
+.ZN True
+if the two regions have the same offset, size, and shape.
+.LP
+The
+.ZN XPointInRegion
+function returns 
+.ZN True
+if the point (x, y) is contained in the region r.
+.LP
+The
+.ZN XRectInRegion
+function returns
+.ZN RectangleIn
+if the rectangle is entirely in the specified region,
+.ZN RectangleOut
+if the rectangle is entirely out of the specified region,
+and
+.ZN RectanglePart
+if the rectangle is partially in the specified region.
+.SH "SEE ALSO"
+XCreateRegion(__libmansuffix__),
+XIntersectRegion(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XEnableAccessControl.man b/man/XEnableAccessControl.man
new file mode 100644 (file)
index 0000000..13e833b
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAddHost.__libmansuffix__
diff --git a/man/XEqualRegion.man b/man/XEqualRegion.man
new file mode 100644 (file)
index 0000000..d2d2d03
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XEmptyRegion.__libmansuffix__
diff --git a/man/XErrorEvent.man b/man/XErrorEvent.man
new file mode 100644 (file)
index 0000000..37bb020
--- /dev/null
@@ -0,0 +1,203 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XErrorEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XErrorEvent \- X error event structure
+.SH STRUCTURES
+The 
+.ZN XErrorEvent
+structure contains:
+.LP
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+typedef struct {
+       int type;
+       Display *display;       /\&* Display the event was read from */
+       unsigned long serial;           /\&* serial number of failed request */
+       unsigned char error_code;       /\&* error code of failed request */
+       unsigned char request_code;     /\&* Major op-code of failed request */
+       unsigned char minor_code;       /\&* Minor op-code of failed request */
+       XID resourceid;         /\&* resource id */
+} XErrorEvent;
+.De
+.LP
+When you receive this event,
+the structure members are set as follows.
+.LP
+The serial member is the number of requests, starting from one, 
+sent over the network connection since it was opened. 
+It is the number that was the value of 
+.ZN NextRequest 
+immediately before the failing call was made.  
+The request_code member is a protocol request
+of the procedure that failed, as defined in 
+.hN X11/Xproto.h .
+.SH "SEE ALSO"
+AllPlanes(__libmansuffix__),
+XAnyEvent(__libmansuffix__),
+XButtonEvent(__libmansuffix__),
+XCreateWindowEvent(__libmansuffix__),
+XCirculateEvent(__libmansuffix__),
+XCirculateRequestEvent(__libmansuffix__),
+XColormapEvent(__libmansuffix__),
+XConfigureEvent(__libmansuffix__),
+XConfigureRequestEvent(__libmansuffix__),
+XCrossingEvent(__libmansuffix__),
+XDestroyWindowEvent(__libmansuffix__),
+XExposeEvent(__libmansuffix__),
+XFocusChangeEvent(__libmansuffix__),
+XGraphicsExposeEvent(__libmansuffix__),
+XGravityEvent(__libmansuffix__),
+XKeymapEvent(__libmansuffix__),
+XMapEvent(__libmansuffix__),
+XMapRequestEvent(__libmansuffix__),
+XPropertyEvent(__libmansuffix__),
+XReparentEvent(__libmansuffix__),
+XResizeRequestEvent(__libmansuffix__),
+XSelectionClearEvent(__libmansuffix__),
+XSelectionEvent(__libmansuffix__),
+XSelectionRequestEvent(__libmansuffix__),
+XUnmapEvent(__libmansuffix__),
+XVisibilityEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XEvent.man b/man/XEvent.man
new file mode 100644 (file)
index 0000000..680f680
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAnyEvent.__libmansuffix__
diff --git a/man/XEventsQueued.man b/man/XEventsQueued.man
new file mode 100644 (file)
index 0000000..1fc2e3e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XFlush.__libmansuffix__
diff --git a/man/XExposeEvent.man b/man/XExposeEvent.man
new file mode 100644 (file)
index 0000000..ea2eef7
--- /dev/null
@@ -0,0 +1,232 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XExposeEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XExposeEvent \- Expose event structure
+.SH STRUCTURES
+The structure for
+.ZN Expose  
+events contains:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int type;       /\&* Expose */
+       unsigned long serial;   /\&* # of last request processed by server */
+       Bool send_event;        /\&* true if this came from a SendEvent request */
+       Display *display;       /\&* Display the event was read from */
+       Window window;
+       int x, y;
+       int width, height;
+       int count;      /\&* if nonzero, at least this many more */
+} XExposeEvent;
+.De
+.LP
+When you receive this event,
+the structure members are set as follows.
+.LP
+The type member is set to the event type constant name that uniquely identifies
+it.
+For example, when the X server reports a
+.ZN GraphicsExpose
+event to a client application, it sends an
+.ZN XGraphicsExposeEvent
+structure with the type member set to
+.ZN GraphicsExpose .
+The display member is set to a pointer to the display the event was read on.
+The send_event member is set to
+.ZN True
+if the event came from a
+.ZN SendEvent
+protocol request.
+The serial member is set from the serial number reported in the protocol
+but expanded from the 16-bit least-significant bits to a full 32-bit value.
+The window member is set to the window that is most useful to toolkit
+dispatchers.
+.LP
+The window member is set to the exposed (damaged) window.
+The x and y members are set to the coordinates relative to the window's origin
+and indicate the upper-left corner of the rectangle.
+The width and height members are set to the size (extent) of the rectangle.
+The count member is set to the number of
+.ZN Expose
+events that are to follow.
+If count is zero, no more
+.ZN Expose
+events follow for this window.
+However, if count is nonzero, at least that number of 
+.ZN Expose 
+events (and possibly more) follow for this window.
+Simple applications that do not want to optimize redisplay by distinguishing
+between subareas of its window can just ignore all
+.ZN Expose
+events with nonzero counts and perform full redisplays
+on events with zero counts.
+.SH "SEE ALSO"
+XAnyEvent(__libmansuffix__),
+XButtonEvent(__libmansuffix__),
+XCreateWindowEvent(__libmansuffix__),
+XCirculateEvent(__libmansuffix__),
+XCirculateRequestEvent(__libmansuffix__),
+XColormapEvent(__libmansuffix__),
+XConfigureEvent(__libmansuffix__),
+XConfigureRequestEvent(__libmansuffix__),
+XCrossingEvent(__libmansuffix__),
+XDestroyWindowEvent(__libmansuffix__),
+XErrorEvent(__libmansuffix__),
+XFocusChangeEvent(__libmansuffix__),
+XGraphicsExposeEvent(__libmansuffix__),
+XGravityEvent(__libmansuffix__),
+XKeymapEvent(__libmansuffix__),
+XMapEvent(__libmansuffix__),
+XMapRequestEvent(__libmansuffix__),
+XPropertyEvent(__libmansuffix__),
+XReparentEvent(__libmansuffix__),
+XResizeRequestEvent(__libmansuffix__),
+XSelectionClearEvent(__libmansuffix__),
+XSelectionEvent(__libmansuffix__),
+XSelectionRequestEvent(__libmansuffix__),
+XUnmapEvent(__libmansuffix__),
+XVisibilityEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XExtendedMaxRequestSize.man b/man/XExtendedMaxRequestSize.man
new file mode 100644 (file)
index 0000000..7949dfa
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/AllPlanes.__libmansuffix__
diff --git a/man/XExtentsOfFontSet.man b/man/XExtentsOfFontSet.man
new file mode 100644 (file)
index 0000000..2242729
--- /dev/null
@@ -0,0 +1,173 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XExtentsOfFontSet __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XExtentsOfFontSet \- obtain the maximum extents structure for a font set
+.SH SYNTAX
+.HP
+XFontSetExtents *XExtentsOfFontSet\^(\^XFontSet \fIfont_set\fP\^); 
+.SH ARGUMENTS
+.IP \fIfont_set\fP 1i
+Specifies the font set.
+.SH DESCRIPTION
+The
+.ZN XExtentsOfFontSet
+function returns an
+.ZN XFontSetExtents
+structure for the fonts used by the Xmb and Xwc layers
+for the given font set.
+.LP
+The 
+.ZN XFontSetExtents
+structure is owned by Xlib and should not be modified
+or freed by the client.
+It will be freed by a call to 
+.ZN XFreeFontSet
+with the associated 
+.ZN XFontSet .
+Until freed, its contents will not be modified by Xlib.
+.SH "SEE ALSO"
+XCreateFontSet(__libmansuffix__),
+XFontsOfFontSet(__libmansuffix__),
+XFontSetExtents(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XFetchBuffer.man b/man/XFetchBuffer.man
new file mode 100644 (file)
index 0000000..03d3c46
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XStoreBytes.__libmansuffix__
diff --git a/man/XFetchBytes.man b/man/XFetchBytes.man
new file mode 100644 (file)
index 0000000..03d3c46
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XStoreBytes.__libmansuffix__
diff --git a/man/XFetchName.man b/man/XFetchName.man
new file mode 100644 (file)
index 0000000..45257dc
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetWMName.__libmansuffix__
diff --git a/man/XFillArc.man b/man/XFillArc.man
new file mode 100644 (file)
index 0000000..eecf0ed
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XFillRectangle.__libmansuffix__
diff --git a/man/XFillArcs.man b/man/XFillArcs.man
new file mode 100644 (file)
index 0000000..eecf0ed
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XFillRectangle.__libmansuffix__
diff --git a/man/XFillPolygon.man b/man/XFillPolygon.man
new file mode 100644 (file)
index 0000000..eecf0ed
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XFillRectangle.__libmansuffix__
diff --git a/man/XFillRectangle.man b/man/XFillRectangle.man
new file mode 100644 (file)
index 0000000..3ae9ce3
--- /dev/null
@@ -0,0 +1,394 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XFillRectangle __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XFillRectangle, XFillRectangles, XFillPolygon, XFillArc, XFillArcs \- fill rectangles, polygons, or arcs
+.SH SYNTAX
+.HP
+int XFillRectangle\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, GC
+\fIgc\fP\^, int \fIx\fP\^, int \fIy\fP\^, unsigned int \fIwidth\fP\^, unsigned
+int \fIheight\fP\^); 
+.HP
+int XFillRectangles\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, GC
+\fIgc\fP\^, XRectangle *\fIrectangles\fP\^, int \fInrectangles\fP\^); 
+.HP
+int XFillPolygon\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, GC
+\fIgc\fP\^, XPoint *\fIpoints\fP\^, int \fInpoints\fP\^, int \fIshape\fP\^,
+int \fImode\fP\^);
+.HP
+int XFillArc\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, GC \fIgc\fP\^, 
+int \fIx\fP\^, int \fIy\fP\^, unsigned int \fIwidth\fP\^, unsigned int
+\fIheight\fP\^, int \fIangle1\fP\^, int \fIangle2\fP\^); 
+.HP
+int XFillArcs\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, GC \fIgc\fP\^,
+XArc *\fIarcs\fP\^, int \fInarcs\fP\^); 
+.SH ARGUMENTS
+.IP \fIangle1\fP 1i
+Specifies the start of the arc relative to the three-o'clock position
+from the center, in units of degrees * 64.
+.IP \fIangle2\fP 1i
+Specifies the path and extent of the arc relative to the start of the
+arc, in units of degrees * 64.
+.IP \fIarcs\fP 1i
+Specifies an array of arcs.
+.IP \fId\fP 1i
+Specifies the drawable. 
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fImode\fP 1i
+Specifies the coordinate mode. 
+You can pass
+.ZN CoordModeOrigin
+or
+.ZN CoordModePrevious .
+.IP \fInarcs\fP 1i
+Specifies the number of arcs in the array.
+.IP \fInpoints\fP 1i
+Specifies the number of points in the array.
+.IP \fInrectangles\fP 1i
+Specifies the number of rectangles in the array.
+.IP \fIpoints\fP 1i
+Specifies an array of points.
+.IP \fIrectangles\fP 1i
+Specifies an array of rectangles.
+.IP \fIshape\fP 1i
+Specifies a shape that helps the server to improve performance.
+You can pass 
+.ZN Complex , 
+.ZN Convex , 
+or 
+.ZN Nonconvex .
+.ds Wh , which are the dimensions of the rectangle to be filled \
+or the major and minor axes of the arc
+.IP \fIwidth\fP 1i
+.br
+.ns
+.IP \fIheight\fP 1i
+Specify the width and height\*(Wh.
+.ds Xy , which are relative to the origin of the drawable \
+and specify the upper-left corner of the rectangle
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.SH DESCRIPTION
+The
+.ZN XFillRectangle
+and
+.ZN XFillRectangles
+functions fill the specified rectangle or rectangles
+as if a four-point 
+.ZN FillPolygon
+protocol request were specified for each rectangle:
+.LP
+.Ds
+[x,y] [x+width,y] [x+width,y+height] [x,y+height]
+.De
+.LP
+Each function uses the x and y coordinates,
+width and height dimensions, and GC you specify.
+.LP
+.ZN XFillRectangles
+fills the rectangles in the order listed in the array.  
+For any given rectangle,
+.ZN XFillRectangle
+and
+.ZN XFillRectangles
+do not draw a pixel more than once.  
+If rectangles intersect, the intersecting pixels are
+drawn multiple times.
+.LP
+Both functions use these GC components: 
+function, plane-mask, fill-style, subwindow-mode, 
+clip-x-origin, clip-y-origin, and clip-mask.
+They also use these GC mode-dependent components: 
+foreground, background, tile, stipple, tile-stipple-x-origin, 
+and tile-stipple-y-origin.
+.LP
+.ZN XFillRectangle
+and
+.ZN XFillRectangles
+can generate
+.ZN BadDrawable ,
+.ZN BadGC ,
+and
+.ZN BadMatch 
+errors.
+.LP
+.ZN XFillPolygon 
+fills the region closed by the specified path.
+The path is closed
+automatically if the last point in the list does not coincide with the
+first point.
+.ZN XFillPolygon
+does not draw a pixel of the region more than once.
+.ZN CoordModeOrigin
+treats all coordinates as relative to the origin,
+and
+.ZN CoordModePrevious
+treats all coordinates after the first as relative to the previous point.
+.LP
+Depending on the specified shape, the following occurs: 
+.IP \(bu 5
+If shape is
+.ZN Complex , 
+the path may self-intersect. 
+Note that contiguous coincident points in the path are not treated 
+as self-intersection.
+.IP \(bu 5
+If shape is
+.ZN Convex , 
+for every pair of points inside the polygon,
+the line segment connecting them does not intersect the path.
+If known by the client,
+specifying 
+.ZN Convex 
+can improve performance.  
+If you specify
+.ZN Convex 
+for a path that is not convex, 
+the graphics results are undefined.
+.IP \(bu 5
+If shape is
+.ZN Nonconvex , 
+the path does not self-intersect, but the shape is not
+wholly convex. 
+If known by the client, 
+specifying 
+.ZN Nonconvex 
+instead of
+.ZN Complex 
+may improve performance.  
+If you specify
+.ZN Nonconvex 
+for a self-intersecting path, the graphics results are undefined.
+.LP
+The fill-rule of the GC controls the filling behavior of 
+self-intersecting polygons.
+.LP
+This function uses these GC components: 
+function, plane-mask, fill-style, fill-rule, subwindow-mode, clip-x-origin, 
+clip-y-origin, and clip-mask.
+It also uses these GC mode-dependent components: 
+foreground, background, tile, stipple, tile-stipple-x-origin, 
+and tile-stipple-y-origin.
+.LP
+.ZN XFillPolygon
+can generate
+.ZN BadDrawable ,
+.ZN BadGC ,
+.ZN BadMatch ,
+and
+.ZN BadValue 
+errors.
+.LP
+For each arc, 
+.ZN XFillArc
+or
+.ZN XFillArcs
+fills the region closed by the infinitely thin path
+described by the specified arc and, depending on the 
+arc-mode specified in the GC, one or two line segments. 
+For 
+.ZN ArcChord , 
+the single line segment joining the endpoints of the arc is used.  
+For 
+.ZN ArcPieSlice ,
+the two line segments joining the endpoints of the arc with the center
+point are used.  
+.ZN XFillArcs
+fills the arcs in the order listed in the array.  
+For any given arc,  
+.ZN XFillArc
+and
+.ZN XFillArcs
+do not draw a pixel more than once.  
+If regions intersect, 
+the intersecting pixels are drawn multiple times.
+.LP
+Both functions use these GC components: 
+function, plane-mask, fill-style, arc-mode, subwindow-mode, clip-x-origin, 
+clip-y-origin, and clip-mask.
+They also use these GC mode-dependent components: 
+foreground, background, tile, stipple, tile-stipple-x-origin, 
+and tile-stipple-y-origin.
+.LP
+.ZN XFillArc
+and
+.ZN XFillArcs
+can generate
+.ZN BadDrawable ,
+.ZN BadGC ,
+and
+.ZN BadMatch 
+errors.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadDrawable
+A value for a Drawable argument does not name a defined Window or Pixmap.
+.TP 1i
+.ZN BadGC
+A value for a GContext argument does not name a defined GContext.
+.TP 1i
+.ZN BadMatch
+An
+.ZN InputOnly
+window is used as a Drawable.
+.TP 1i
+.ZN BadMatch
+Some argument or pair of arguments has the correct type and range but fails
+to match in some other way required by the request.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.SH "SEE ALSO"
+XDrawArc(__libmansuffix__),
+XDrawPoint(__libmansuffix__),
+XDrawRectangle(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XFillRectangles.man b/man/XFillRectangles.man
new file mode 100644 (file)
index 0000000..eecf0ed
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XFillRectangle.__libmansuffix__
diff --git a/man/XFilterEvent.man b/man/XFilterEvent.man
new file mode 100644 (file)
index 0000000..2a006f0
--- /dev/null
@@ -0,0 +1,186 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XFilterEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XFilterEvent \- filter X events for an input method
+.SH SYNTAX
+.HP
+Bool XFilterEvent\^(\^XEvent *\fIevent\fP\^, Window \fIw\fP\^); 
+.SH ARGUMENTS
+.ds Ev event to filter
+.IP \fIevent\fP 1i
+Specifies the \*(Ev.
+.ds Wi for which the filter is to be applied
+.IP \fIw\fP 1i
+Specifies the window \*(Wi.
+.SH DESCRIPTION
+If the window argument is
+.ZN None ,
+.ZN XFilterEvent 
+applies the filter to the window specified in the
+.ZN XEvent
+structure.
+The window argument is provided so that layers above Xlib
+that do event redirection can indicate to which window an event
+has been redirected.
+.LP
+If
+.ZN XFilterEvent
+returns
+.ZN True ,
+then some input method has filtered the event,
+and the client should discard the event.
+If
+.ZN XFilterEvent
+returns
+.ZN False ,
+then the client should continue processing the event.
+.LP
+If a grab has occurred in the client and
+.ZN XFilterEvent
+returns
+.ZN True ,
+the client should ungrab the keyboard.
+.SH "SEE ALSO"
+XNextEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XFindContext.man b/man/XFindContext.man
new file mode 100644 (file)
index 0000000..f0b9747
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSaveContext.__libmansuffix__
diff --git a/man/XFlush.man b/man/XFlush.man
new file mode 100644 (file)
index 0000000..87302f0
--- /dev/null
@@ -0,0 +1,264 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XFlush __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XFlush, XSync, XEventsQueued, XPending \- handle output buffer or event queue
+.SH SYNTAX
+.HP
+int XFlush\^(\^Display *\fIdisplay\fP\^); 
+.HP
+int XSync\^(\^Display *\fIdisplay\fP\^, Bool \fIdiscard\fP\^); 
+.HP
+int XEventsQueued\^(\^Display *\fIdisplay\fP\^, int \fImode\fP\^); 
+.HP
+int XPending\^(\^Display *\fIdisplay\fP\^); 
+.SH ARGUMENTS
+.IP \fIdiscard\fP 1i
+Specifies a Boolean value that indicates whether 
+.ZN XSync
+discards all events on the event queue.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fImode\fP 1i
+Specifies the mode.
+You can pass
+.ZN QueuedAlready ,
+.ZN QueuedAfterFlush ,
+or
+.ZN QueuedAfterReading .
+.SH DESCRIPTION
+The
+.ZN XFlush
+function
+flushes the output buffer.
+Most client applications need not use this function because the output
+buffer is automatically flushed as needed by calls to
+.ZN XPending ,
+.ZN XNextEvent ,
+and
+.ZN XWindowEvent .
+.IN "XPending"
+.IN "XNextEvent"
+.IN "XWindowEvent"
+Events generated by the server may be enqueued into the library's event queue.
+.LP
+The
+.ZN XSync
+function
+flushes the output buffer and then waits until all requests have been received
+and processed by the X server.
+Any errors generated must be handled by the error handler.
+For each protocol error received by Xlib,
+.ZN XSync
+calls the client application's error handling routine (see section 11.8.2).
+Any events generated by the server are enqueued into the library's 
+event queue.
+.LP
+Finally, if you passed 
+.ZN False ,
+.ZN XSync
+does not discard the events in the queue.
+If you passed 
+.ZN True ,
+.ZN XSync 
+discards all events in the queue,
+including those events that were on the queue before
+.ZN XSync
+was called.
+Client applications seldom need to call
+.ZN XSync .
+.LP
+If mode is 
+.ZN QueuedAlready ,
+.ZN XEventsQueued 
+returns the number of events
+already in the event queue (and never performs a system call).
+If mode is 
+.ZN QueuedAfterFlush , 
+.ZN XEventsQueued
+returns the number of events already in the queue if the number is nonzero.
+If there are no events in the queue, 
+.ZN XEventsQueued
+flushes the output buffer, 
+attempts to read more events out of the application's connection,
+and returns the number read.
+If mode is 
+.ZN QueuedAfterReading , 
+.ZN XEventsQueued
+returns the number of events already in the queue if the number is nonzero. 
+If there are no events in the queue, 
+.ZN XEventsQueued
+attempts to read more events out of the application's connection 
+without flushing the output buffer and returns the number read.
+.LP
+.ZN XEventsQueued
+always returns immediately without I/O if there are events already in the
+queue.
+.ZN XEventsQueued
+with mode 
+.ZN QueuedAfterFlush
+is identical in behavior to
+.ZN XPending .
+.ZN XEventsQueued
+with mode
+.ZN QueuedAlready
+is identical to the
+.ZN XQLength
+function.
+.LP
+The
+.ZN XPending
+function returns the number of events that have been received from the
+X server but have not been removed from the event queue.
+.ZN XPending
+is identical to
+.ZN XEventsQueued
+with the mode
+.ZN QueuedAfterFlush
+specified.
+.SH "SEE ALSO"
+AllPlanes(__libmansuffix__),
+XIfEvent(__libmansuffix__),
+XNextEvent(__libmansuffix__),
+XPutBackEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XFocusChangeEvent.man b/man/XFocusChangeEvent.man
new file mode 100644 (file)
index 0000000..b95c89d
--- /dev/null
@@ -0,0 +1,266 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XFocusChangeEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XFocusChangeEvent \- FocusIn and FocusOut event structure
+.SH STRUCTURES
+The structure for
+.ZN FocusIn  
+and
+.ZN FocusOut
+events contains:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int type;       /\&* FocusIn or FocusOut */
+       unsigned long serial;   /\&* # of last request processed by server */
+       Bool send_event;        /\&* true if this came from a SendEvent request */
+       Display *display;       /\&* Display the event was read from */
+       Window window;  /\&* window of event */
+       int mode;       /\&* NotifyNormal, NotifyGrab, NotifyUngrab */
+       int detail;
+               /\&*
+               * NotifyAncestor, NotifyVirtual, NotifyInferior, 
+               * NotifyNonlinear,NotifyNonlinearVirtual, NotifyPointer,
+               * NotifyPointerRoot, NotifyDetailNone 
+               */
+} XFocusChangeEvent;
+typedef XFocusChangeEvent XFocusInEvent;
+typedef XFocusChangeEvent XFocusOutEvent;
+.De
+.LP
+When you receive these events,
+the structure members are set as follows.
+.LP
+The type member is set to the event type constant name that uniquely identifies
+it.
+For example, when the X server reports a
+.ZN GraphicsExpose
+event to a client application, it sends an
+.ZN XGraphicsExposeEvent
+structure with the type member set to
+.ZN GraphicsExpose .
+The display member is set to a pointer to the display the event was read on.
+The send_event member is set to
+.ZN True
+if the event came from a
+.ZN SendEvent
+protocol request.
+The serial member is set from the serial number reported in the protocol
+but expanded from the 16-bit least-significant bits to a full 32-bit value.
+The window member is set to the window that is most useful to toolkit
+dispatchers.
+.LP
+The window member is set to the window on which the
+.ZN FocusIn
+or
+.ZN FocusOut
+event was generated.
+This is the window used by the X server to report the event. 
+The mode member is set to indicate whether the focus events 
+are normal focus events, 
+focus events while grabbed,
+focus events
+when a grab activates, or focus events when a grab deactivates.
+The X server can set the mode member to 
+.ZN NotifyNormal ,
+.ZN NotifyWhileGrabbed ,
+.ZN NotifyGrab ,
+or
+.ZN NotifyUngrab .
+.LP
+All 
+.ZN FocusOut
+events caused by a window unmap are generated after any
+.ZN UnmapNotify
+event; however, the X protocol does not constrain the ordering of 
+.ZN FocusOut
+events with respect to
+generated 
+.ZN EnterNotify ,
+.ZN LeaveNotify ,
+.ZN VisibilityNotify ,
+and
+.ZN Expose
+events.
+.LP
+Depending on the event mode,
+the detail member is set to indicate the notify detail and can be
+.ZN NotifyAncestor ,
+.ZN NotifyVirtual ,
+.ZN NotifyInferior ,
+.ZN NotifyNonlinear ,
+.ZN NotifyNonlinearVirtual ,
+.ZN NotifyPointer ,
+.ZN NotifyPointerRoot ,
+or
+.ZN NotifyDetailNone .
+.SH "SEE ALSO"
+XAnyEvent(__libmansuffix__),
+XButtonEvent(__libmansuffix__),
+XCreateWindowEvent(__libmansuffix__),
+XCirculateEvent(__libmansuffix__),
+XCirculateRequestEvent(__libmansuffix__),
+XColormapEvent(__libmansuffix__),
+XConfigureEvent(__libmansuffix__),
+XConfigureRequestEvent(__libmansuffix__),
+XCrossingEvent(__libmansuffix__),
+XDestroyWindowEvent(__libmansuffix__),
+XErrorEvent(__libmansuffix__),
+XExposeEvent(__libmansuffix__),
+XGraphicsExposeEvent(__libmansuffix__),
+XGravityEvent(__libmansuffix__),
+XKeymapEvent(__libmansuffix__),
+XMapEvent(__libmansuffix__),
+XMapRequestEvent(__libmansuffix__),
+XPropertyEvent(__libmansuffix__),
+XReparentEvent(__libmansuffix__),
+XResizeRequestEvent(__libmansuffix__),
+XSelectionClearEvent(__libmansuffix__),
+XSelectionEvent(__libmansuffix__),
+XSelectionRequestEvent(__libmansuffix__),
+XUnmapEvent(__libmansuffix__),
+XVisibilityEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XFontProp.man b/man/XFontProp.man
new file mode 100644 (file)
index 0000000..ca6fa1f
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XLoadFont.__libmansuffix__
diff --git a/man/XFontSetExtents.man b/man/XFontSetExtents.man
new file mode 100644 (file)
index 0000000..79ad9e6
--- /dev/null
@@ -0,0 +1,193 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XFontSetExtents __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XFontSetExtents \- XFontSetExtents structure
+.SH STRUCTURES
+The
+.ZN XFontSetExtents
+structure contains:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       XRectangle max_ink_extent;      /\&* over all drawable characters */
+       XRectangle max_logical_extent;  /\&* over all drawable characters */
+} XFontSetExtents;
+.De
+.LP
+The 
+.ZN XRectangle
+structures used to return font set metrics are the usual Xlib screen-oriented 
+rectangles
+with x, y giving the upper left corner, and width and height always positive.
+.LP
+The max_ink_extent member gives the maximum extent, over all drawable characters, of
+the rectangles that bound the character glyph image drawn in the
+foreground color, relative to a constant origin.
+See 
+.ZN XmbTextExtents
+and
+.ZN XwcTextExtents
+for detailed semantics.
+.LP
+The max_logical_extent member gives the maximum extent,
+over all drawable characters, of the rectangles 
+that specify minimum spacing to other graphical features,
+relative to a constant origin.
+Other graphical features drawn by the client, for example,
+a border surrounding the text, should not intersect this rectangle.
+The max_logical_extent member should be used to compute minimum 
+interline spacing and the minimum area that must be allowed
+in a text field to draw a given number of arbitrary characters.
+.LP
+Due to context-dependent rendering,
+appending a given character to a string may change 
+the string's extent by an amount other than that character's
+individual extent.
+.SH "SEE ALSO"
+XCreateFontSet(__libmansuffix__),
+XExtentsOfFontSet(__libmansuffix__),
+XFontsOfFontSet(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XFontStruct.man b/man/XFontStruct.man
new file mode 100644 (file)
index 0000000..ca6fa1f
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XLoadFont.__libmansuffix__
diff --git a/man/XFontsOfFontSet.man b/man/XFontsOfFontSet.man
new file mode 100644 (file)
index 0000000..3c783ef
--- /dev/null
@@ -0,0 +1,288 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XFontsOfFontSet __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XFontsOfFontSet, XBaseFontNameListOfFontSet, XLocaleOfFontSet, XContextDependentDrawing, XContextualDrawing, XDirectionalDependentDrawing \- obtain fontset information
+.SH SYNTAX
+.HP
+int XFontsOfFontSet\^(\^XFontSet \fIfont_set\fP\^, XFontStruct
+***\fIfont_struct_list_return\fP\^, char ***\fIfont_name_list_return\fP\^); 
+.HP
+char *XBaseFontNameListOfFontSet\^(\^XFontSet \fIfont_set\fP\^); 
+.HP
+char *XLocaleOfFontSet\^(\^XFontSet \fIfont_set\fP\^); 
+.HP
+Bool XContextDependentDrawing\^(\^XFontSet \fIfont_set\fP\^); 
+.HP
+Bool XContextualDrawing\^(\^XFontSet \fIfont_set\fP\^); 
+.HP
+Bool XDirectionalDependentDrawing\^(\^XFontSet \fIfont_set\fP\^); 
+.SH ARGUMENTS
+.IP \fIfont_set\fP 1i
+Specifies the font set.
+.IP \fIfont_name_list_return\fP 1i
+Returns the list of font names.
+.IP \fIfont_struct_list_return\fP 1i
+Returns the list of font structs.
+.SH DESCRIPTION
+The
+.ZN XFontsOfFontSet
+function returns a list of one or more 
+.ZN XFontStructs
+and font names for the fonts used by the Xmb and Xwc layers
+for the given font set.
+A list of pointers to the
+.ZN XFontStruct
+structures is returned to font_struct_list_return.
+A list of pointers to null-terminated, fully specified font name strings
+in the locale of the font set is returned to font_name_list_return.
+The font_name_list order corresponds to the font_struct_list order.
+The number of
+.ZN XFontStruct
+structures and font names is returned as the value of the function.
+.LP
+Because it is not guaranteed that a given character will be imaged using a
+single font glyph,
+there is no provision for mapping a character or default string 
+to the font properties, font ID, or direction hint for the font 
+for the character.
+The client may access the 
+.ZN XFontStruct
+list to obtain these values for all the fonts currently in use.
+.LP
+Xlib does not guarantee that fonts are loaded from the server
+at the creation of an 
+.ZN XFontSet .
+Xlib may choose to cache font data, loading it only as needed to draw text 
+or compute text dimensions.
+Therefore, existence of the per_char metrics in the 
+.ZN XFontStruct
+structures in the
+.ZN XFontStructSet
+is undefined.
+Also, note that all properties in the 
+.ZN XFontStruct
+structures are in the STRING encoding.
+.LP
+The 
+.ZN XFontStruct
+and font name lists are owned by Xlib 
+and should not be modified or freed by the client.
+They will be freed by a call to
+.ZN XFreeFontSet
+with the associated
+.ZN XFontSet .
+Until freed, their contents will not be modified by Xlib.
+.LP
+The
+.ZN XBaseFontNameListOfFontSet
+function returns the original base font name list supplied
+by the client when the 
+.ZN XFontSet
+was created.
+A null-terminated string containing a list of
+comma-separated font names is returned
+as the value of the function.
+White space may appear immediately on either side of separating commas.
+.LP
+If 
+.ZN XCreateFontSet
+obtained an XLFD name from the font properties for the font specified
+by a non-XLFD base name, the
+.ZN XBaseFontNameListOfFontSet
+function will return the XLFD name instead of the non-XLFD base name.
+.LP
+The base font name list is owned by Xlib and should not be modified or
+freed by the client.
+It will be freed by a call to 
+.ZN XFreeFontSet
+with the associated 
+.ZN XFontSet .
+Until freed, its contents will not be modified by Xlib.
+.LP
+The
+.ZN XLocaleOfFontSet
+function
+returns the name of the locale bound to the specified
+.ZN XFontSet ,
+as a null-terminated string.
+.LP
+The returned locale name string is owned by Xlib
+and should not be modified or freed by the client.
+It may be freed by a call to
+.ZN XFreeFontSet
+with the associated 
+.ZN XFontSet .
+Until freed, it will not be modified by Xlib.
+.LP
+The
+.ZN XContextDependentDrawing
+function returns
+.ZN True
+if the drawing functions implement implicit text directionality or
+if text drawn with the font_set might include context-dependent drawing;
+otherwise, it returns
+.ZN False .
+.LP
+The
+.ZN XContextualDrawing
+function returns
+.ZN True
+if text drawn with the font set might include context-dependent drawing;
+otherwise, it returns
+.ZN False .
+.LP
+The
+.ZN XDirectionalDependentDrawing
+function returns
+.ZN True
+if the drawing functions implement implicit text directionality;
+otherwise, it returns
+.ZN False .
+.SH "SEE ALSO"
+XCreateFontSet(__libmansuffix__),
+XCreateOM(__libmansuffix__),
+XCreateOC(__libmansuffix__),
+XExtentsOfFontSet(__libmansuffix__),
+XFontSetExtents(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XForceScreenSaver.man b/man/XForceScreenSaver.man
new file mode 100644 (file)
index 0000000..13eba4e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetScreenSaver.__libmansuffix__
diff --git a/man/XFree.man b/man/XFree.man
new file mode 100644 (file)
index 0000000..f0a8d1f
--- /dev/null
@@ -0,0 +1,158 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XFree __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XFree \- free client data
+.SH SYNTAX
+int XFree\^(\^void *\fIdata\fP\^); 
+.SH ARGUMENTS
+.IP \fIdata\fP 1i
+Specifies the data that are to be freed.
+.SH DESCRIPTION
+The
+.ZN XFree
+function is a general-purpose Xlib routine that frees the specified data.
+You must use it to free any objects that were allocated by Xlib,
+unless an alternate function is explicitly specified for the object.
+A NULL pointer cannot be passed to this function.
+.SH "SEE ALSO"
+\fI\*(xL\fP
diff --git a/man/XFreeColormap.man b/man/XFreeColormap.man
new file mode 100644 (file)
index 0000000..f9fb228
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XCreateColormap.__libmansuffix__
diff --git a/man/XFreeColors.man b/man/XFreeColors.man
new file mode 100644 (file)
index 0000000..5d64d87
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAllocColor.__libmansuffix__
diff --git a/man/XFreeCursor.man b/man/XFreeCursor.man
new file mode 100644 (file)
index 0000000..7f94888
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XRecolorCursor.__libmansuffix__
diff --git a/man/XFreeEventData.man b/man/XFreeEventData.man
new file mode 100644 (file)
index 0000000..3736bad
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XGetEventData.__libmansuffix__
diff --git a/man/XFreeExtensionList.man b/man/XFreeExtensionList.man
new file mode 100644 (file)
index 0000000..95e51b6
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XQueryExtension.__libmansuffix__
diff --git a/man/XFreeFont.man b/man/XFreeFont.man
new file mode 100644 (file)
index 0000000..ca6fa1f
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XLoadFont.__libmansuffix__
diff --git a/man/XFreeFontInfo.man b/man/XFreeFontInfo.man
new file mode 100644 (file)
index 0000000..2df58d0
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XListFonts.__libmansuffix__
diff --git a/man/XFreeFontNames.man b/man/XFreeFontNames.man
new file mode 100644 (file)
index 0000000..2df58d0
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XListFonts.__libmansuffix__
diff --git a/man/XFreeFontPath.man b/man/XFreeFontPath.man
new file mode 100644 (file)
index 0000000..bf81b9f
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetFontPath.__libmansuffix__
diff --git a/man/XFreeFontSet.man b/man/XFreeFontSet.man
new file mode 100644 (file)
index 0000000..55e4c6f
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XCreateFontSet.__libmansuffix__
diff --git a/man/XFreeGC.man b/man/XFreeGC.man
new file mode 100644 (file)
index 0000000..927a6a9
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XCreateGC.__libmansuffix__
diff --git a/man/XFreeModifiermap.man b/man/XFreeModifiermap.man
new file mode 100644 (file)
index 0000000..cc772af
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XChangeKeyboardMapping.__libmansuffix__
diff --git a/man/XFreePixmap.man b/man/XFreePixmap.man
new file mode 100644 (file)
index 0000000..07599d0
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XCreatePixmap.__libmansuffix__
diff --git a/man/XFreeStringList.man b/man/XFreeStringList.man
new file mode 100644 (file)
index 0000000..faf0beb
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XStringListToTextProperty.__libmansuffix__
diff --git a/man/XGCValues.man b/man/XGCValues.man
new file mode 100644 (file)
index 0000000..927a6a9
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XCreateGC.__libmansuffix__
diff --git a/man/XGContextFromGC.man b/man/XGContextFromGC.man
new file mode 100644 (file)
index 0000000..927a6a9
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XCreateGC.__libmansuffix__
diff --git a/man/XGenericEventCookie.man b/man/XGenericEventCookie.man
new file mode 100644 (file)
index 0000000..3736bad
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XGetEventData.__libmansuffix__
diff --git a/man/XGetAtomName.man b/man/XGetAtomName.man
new file mode 100644 (file)
index 0000000..7d6a69b
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XInternAtom.__libmansuffix__
diff --git a/man/XGetAtomNames.man b/man/XGetAtomNames.man
new file mode 100644 (file)
index 0000000..7d6a69b
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XInternAtom.__libmansuffix__
diff --git a/man/XGetClassHint.man b/man/XGetClassHint.man
new file mode 100644 (file)
index 0000000..02d6722
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAllocClassHint.__libmansuffix__
diff --git a/man/XGetCommand.man b/man/XGetCommand.man
new file mode 100644 (file)
index 0000000..a56ee48
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetCommand.__libmansuffix__
diff --git a/man/XGetErrorDatabaseText.man b/man/XGetErrorDatabaseText.man
new file mode 100644 (file)
index 0000000..de67624
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetErrorHandler.__libmansuffix__
diff --git a/man/XGetErrorText.man b/man/XGetErrorText.man
new file mode 100644 (file)
index 0000000..de67624
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetErrorHandler.__libmansuffix__
diff --git a/man/XGetEventData.man b/man/XGetEventData.man
new file mode 100644 (file)
index 0000000..fdbab45
--- /dev/null
@@ -0,0 +1,223 @@
+.\" Copyright \(co 2009 Red Hat, Inc.
+.\"
+.\" 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.
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XGetEventData __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XGetEventData, XFreeEventData, XGenericEventCookie \- retrieve and free additional event data through cookies.
+.SH SYNTAX
+.HP
+Bool XGetEventData\^(\^Display *\fIdisplay\fP\^, XGenericEventCookie *\fIcookie\fP\^);
+.HP
+void XFreeEventData\^(\^Display *\fIdisplay\fP\^, XGenericEventCookie *\fIcookie\fP\^);
+.HP
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIcookie\fP 1i
+Specifies the cookie to free or retrieve the data for.
+
+.SH STRUCTURES
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int type;
+       unsigned long serial;
+       Bool send_event;
+       Display *display;
+       int extension;
+       int evtype;
+       unsigned int cookie;
+       void *data;
+} XGenericEventCookie;
+.De
+
+.SH DESCRIPTION
+Some extension
+.ZN XGenericEvents
+require additional memory to store information.
+For these events, the library returns a
+.ZN XGenericEventCookie
+with a token ('cookie') unique to this event. The
+.ZN XGenericEventCookie 's
+data pointer is undefined until
+.ZN XGetEventData
+is called.
+
+The
+.ZN XGetEventData
+function retrieves this extra data for the given cookie. No round-trip to
+the server is required. If the cookie is invalid or the
+event is not an event handled by cookie handlers,
+.ZN False
+is returned. If
+.ZN XGetEventData
+returns
+.ZN True ,
+the cookie's data pointer points to the memory containing the event
+information. A client must call
+.ZN XFreeEventData
+to free this memory.
+.ZN XGetEventData
+returns
+.ZN False
+for multiple calls for the same event cookie.
+
+The
+.ZN XFreeEventData
+function frees the data associated with a cookie. A client must call
+.ZN XFreeEventData
+for each cookie claimed with
+.ZN XGetEventData .
+
+.SH EXAMPLE CODE
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+XEvent event;
+XGenericEventCookie *cookie = &ev;
+
+XNextEvent(display, &event);
+if (XGetEventData(display, cookie)) {
+    handle_cookie_event(cookie->data);
+} else
+    handle_event(&event);
+}
+XFreeEventData(display, cookie);
+.De
+
+.SH NOTES
+A cookie is defined as unclaimed if it has been returned to the client
+through
+.ZN XNextEvent
+but its data has not been retrieved via
+.ZN XGetEventData .
+Subsequent calls to
+.ZN XNextEvent
+may free memory associated with unclaimed cookies.
+Multi-threaded X clients must ensure that
+.ZN XGetEventData
+is called before the next call to
+.ZN XNextEvent .
+
+.SH "SEE ALSO"
+XNextEvent(__libmansuffix__),
+.br
+\fI\*(xL\fP
+
diff --git a/man/XGetFontPath.man b/man/XGetFontPath.man
new file mode 100644 (file)
index 0000000..bf81b9f
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetFontPath.__libmansuffix__
diff --git a/man/XGetFontProperty.man b/man/XGetFontProperty.man
new file mode 100644 (file)
index 0000000..ca6fa1f
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XLoadFont.__libmansuffix__
diff --git a/man/XGetGCValues.man b/man/XGetGCValues.man
new file mode 100644 (file)
index 0000000..927a6a9
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XCreateGC.__libmansuffix__
diff --git a/man/XGetGeometry.man b/man/XGetGeometry.man
new file mode 100644 (file)
index 0000000..d58c103
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XGetWindowAttributes.__libmansuffix__
diff --git a/man/XGetICValues.man b/man/XGetICValues.man
new file mode 100644 (file)
index 0000000..8afda35
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetICValues.__libmansuffix__
diff --git a/man/XGetIMValues.man b/man/XGetIMValues.man
new file mode 100644 (file)
index 0000000..6365409
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XOpenIM.__libmansuffix__
diff --git a/man/XGetIconName.man b/man/XGetIconName.man
new file mode 100644 (file)
index 0000000..bf1ba60
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetWMIconName.__libmansuffix__
diff --git a/man/XGetIconSizes.man b/man/XGetIconSizes.man
new file mode 100644 (file)
index 0000000..afe574e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAllocIconSize.__libmansuffix__
diff --git a/man/XGetImage.man b/man/XGetImage.man
new file mode 100644 (file)
index 0000000..12a2ab2
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XPutImage.__libmansuffix__
diff --git a/man/XGetInputFocus.man b/man/XGetInputFocus.man
new file mode 100644 (file)
index 0000000..39d128b
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetInputFocus.__libmansuffix__
diff --git a/man/XGetKeyboardControl.man b/man/XGetKeyboardControl.man
new file mode 100644 (file)
index 0000000..4434d01
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XChangeKeyboardControl.__libmansuffix__
diff --git a/man/XGetKeyboardMapping.man b/man/XGetKeyboardMapping.man
new file mode 100644 (file)
index 0000000..cc772af
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XChangeKeyboardMapping.__libmansuffix__
diff --git a/man/XGetModifierMapping.man b/man/XGetModifierMapping.man
new file mode 100644 (file)
index 0000000..cc772af
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XChangeKeyboardMapping.__libmansuffix__
diff --git a/man/XGetMotionEvents.man b/man/XGetMotionEvents.man
new file mode 100644 (file)
index 0000000..bfd75c0
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSendEvent.__libmansuffix__
diff --git a/man/XGetOCValues.man b/man/XGetOCValues.man
new file mode 100644 (file)
index 0000000..12d5a3d
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XCreateOC.__libmansuffix__
diff --git a/man/XGetOMValues.man b/man/XGetOMValues.man
new file mode 100644 (file)
index 0000000..3b4acf5
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XOpenOM.__libmansuffix__
diff --git a/man/XGetPixel.man b/man/XGetPixel.man
new file mode 100644 (file)
index 0000000..19e5be3
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XInitImage.__libmansuffix__
diff --git a/man/XGetPointerControl.man b/man/XGetPointerControl.man
new file mode 100644 (file)
index 0000000..5f1df8a
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XChangePointerControl.__libmansuffix__
diff --git a/man/XGetPointerMapping.man b/man/XGetPointerMapping.man
new file mode 100644 (file)
index 0000000..b592401
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetPointerMapping.__libmansuffix__
diff --git a/man/XGetRGBColormaps.man b/man/XGetRGBColormaps.man
new file mode 100644 (file)
index 0000000..da749f6
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAllocStandardColormap.__libmansuffix__
diff --git a/man/XGetScreenSaver.man b/man/XGetScreenSaver.man
new file mode 100644 (file)
index 0000000..13eba4e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetScreenSaver.__libmansuffix__
diff --git a/man/XGetSelectionOwner.man b/man/XGetSelectionOwner.man
new file mode 100644 (file)
index 0000000..c33cbe8
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetSelectionOwner.__libmansuffix__
diff --git a/man/XGetSubImage.man b/man/XGetSubImage.man
new file mode 100644 (file)
index 0000000..12a2ab2
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XPutImage.__libmansuffix__
diff --git a/man/XGetTextProperty.man b/man/XGetTextProperty.man
new file mode 100644 (file)
index 0000000..d104567
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetTextProperty.__libmansuffix__
diff --git a/man/XGetTransientForHint.man b/man/XGetTransientForHint.man
new file mode 100644 (file)
index 0000000..63d87a3
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetTransientForHint.__libmansuffix__
diff --git a/man/XGetVisualInfo.man b/man/XGetVisualInfo.man
new file mode 100644 (file)
index 0000000..7d7dca6
--- /dev/null
@@ -0,0 +1,313 @@
+'\" t
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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
+'\" t
+.TH XGetVisualInfo __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XGetVisualInfo, XMatchVisualInfo, XVisualIDFromVisual, XVisualInfo \- obtain visual information and visual structure
+.SH SYNTAX
+.HP
+XVisualInfo *XGetVisualInfo\^(\^Display *\fIdisplay\fP\^, long
+\fIvinfo_mask\fP\^, XVisualInfo *\fIvinfo_template\fP\^, int
+*\fInitems_return\fP\^); 
+.HP
+Status XMatchVisualInfo\^(\^Display *\fIdisplay\fP\^, int \fIscreen\fP\^, int
+\fIdepth\fP\^, int \fIclass\fP\^, XVisualInfo *\fIvinfo_return\fP\^); 
+.HP
+VisualID XVisualIDFromVisual\^(\^Visual *\^\fIvisual\fP\^); 
+.SH ARGUMENTS
+.IP \fIclass\fP 1i
+Specifies the class of the screen.
+.IP \fIdepth\fP 1i
+Specifies the depth of the screen.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fInitems_return\fP 1i
+Returns the number of matching visual structures.
+.IP \fIscreen\fP 1i
+Specifies the screen.
+.IP \fIvisual\fP 1i
+Specifies the visual type.
+.IP \fIvinfo_mask\fP 1i
+Specifies the visual mask value.
+.IP \fIvinfo_return\fP 1i
+Returns the matched visual information.
+.IP \fIvinfo_template\fP 1i
+Specifies the visual attributes that are to be used in matching the visual
+structures.
+.SH DESCRIPTION
+The
+.ZN XGetVisualInfo
+function returns a list of visual structures that have attributes 
+equal to the attributes specified by vinfo_template.
+If no visual structures match the template using the specified vinfo_mask,
+.ZN XGetVisualInfo
+returns a NULL.
+To free the data returned by this function, use
+.ZN XFree .
+.LP
+The
+.ZN XMatchVisualInfo
+function returns the visual information for a visual that matches the specified
+depth and class for a screen.
+Because multiple visuals that match the specified depth and class can exist,
+the exact visual chosen is undefined.
+If a visual is found,
+.ZN XMatchVisualInfo
+returns nonzero and the information on the visual to vinfo_return.
+Otherwise, when a visual is not found,
+.ZN XMatchVisualInfo
+returns zero.
+.LP
+The
+.ZN XVisualIDFromVisual
+function returns the visual ID for the specified visual type.
+.SH STRUCTURES
+The
+.ZN XVisualInfo
+structure contains:
+.LP
+.LP
+/\&* Visual information mask bits */
+.TS
+lw(.5i) lw(2.5i) lw(.8i).
+T{
+\&#define
+T}     T{
+.ZN VisualNoMask
+T}     T{
+0x0
+T}
+T{
+\&#define
+T}     T{
+.ZN VisualIDMask
+T}     T{
+0x1
+T}
+T{
+\&#define
+T}     T{
+.ZN VisualScreenMask
+T}     T{
+0x2
+T}
+T{
+\&#define
+T}     T{
+.ZN VisualDepthMask
+T}     T{
+0x4
+T}
+T{
+\&#define
+T}     T{
+.ZN VisualClassMask
+T}     T{
+0x8
+T}
+T{
+\&#define
+T}     T{
+.ZN VisualRedMaskMask
+T}     T{
+0x10
+T}
+T{
+\&#define
+T}     T{
+.ZN VisualGreenMaskMask
+T}     T{
+0x20
+T}
+T{
+\&#define
+T}     T{
+.ZN VisualBlueMaskMask
+T}     T{
+0x40
+T}
+T{
+\&#define
+T}     T{
+.ZN VisualColormapSizeMask
+T}     T{
+0x80
+T}
+T{
+\&#define
+T}     T{
+.ZN VisualBitsPerRGBMask
+T}     T{
+0x100
+T}
+T{
+\&#define
+T}     T{
+.ZN VisualAllMask
+T}     T{
+0x1FF
+T}
+.TE
+.IN "XVisualInfo" "" "@DEF@"
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+/\&* Values */
+
+typedef struct {
+       Visual *visual;
+       VisualID visualid;
+       int screen;
+       int depth;
+       int class;
+       unsigned long red_mask;
+       unsigned long green_mask;
+       unsigned long blue_mask;
+       int colormap_size;
+       int bits_per_rgb;
+} XVisualInfo;
+.De
+.SH "SEE ALSO"
+XFree(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XGetWMClientMachine.man b/man/XGetWMClientMachine.man
new file mode 100644 (file)
index 0000000..0f7027c
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetWMClientMachine.__libmansuffix__
diff --git a/man/XGetWMColormapWindows.man b/man/XGetWMColormapWindows.man
new file mode 100644 (file)
index 0000000..41aa066
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetWMColormapWindows.__libmansuffix__
diff --git a/man/XGetWMHints.man b/man/XGetWMHints.man
new file mode 100644 (file)
index 0000000..1e15d7e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAllocWMHints.__libmansuffix__
diff --git a/man/XGetWMIconName.man b/man/XGetWMIconName.man
new file mode 100644 (file)
index 0000000..bf1ba60
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetWMIconName.__libmansuffix__
diff --git a/man/XGetWMName.man b/man/XGetWMName.man
new file mode 100644 (file)
index 0000000..45257dc
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetWMName.__libmansuffix__
diff --git a/man/XGetWMNormalHints.man b/man/XGetWMNormalHints.man
new file mode 100644 (file)
index 0000000..9fbee38
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAllocSizeHints.__libmansuffix__
diff --git a/man/XGetWMProtocols.man b/man/XGetWMProtocols.man
new file mode 100644 (file)
index 0000000..c2af57f
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetWMProtocols.__libmansuffix__
diff --git a/man/XGetWMSizeHints.man b/man/XGetWMSizeHints.man
new file mode 100644 (file)
index 0000000..9fbee38
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAllocSizeHints.__libmansuffix__
diff --git a/man/XGetWindowAttributes.man b/man/XGetWindowAttributes.man
new file mode 100644 (file)
index 0000000..de85601
--- /dev/null
@@ -0,0 +1,395 @@
+'\" t
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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
+'\" t
+.TH XGetWindowAttributes __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XGetWindowAttributes, XGetGeometry, XWindowAttributes \- get current window attribute or geometry and current window attributes structure
+.SH SYNTAX
+.HP
+Status XGetWindowAttributes\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^,
+XWindowAttributes *\fIwindow_attributes_return\fP\^); 
+.HP
+Status XGetGeometry\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, Window
+*\fIroot_return\fP\^, int *\fIx_return\fP\^, int *\fIy_return\fP\^, unsigned
+int *\fIwidth_return\fP\^, unsigned int *\fIheight_return\fP\^, unsigned int
+*\fIborder_width_return\fP\^, unsigned int *\fIdepth_return\fP\^); 
+.SH ARGUMENTS
+.IP \fIborder_width_return\fP 1i
+Returns the border width in pixels. 
+.ds Dr , which can be a window or a pixmap
+.IP \fId\fP 1i
+Specifies the drawable\*(Dr. 
+.IP \fIdepth_return\fP 1i
+Returns the depth of the drawable (bits per pixel for the object).
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIroot_return\fP 1i
+Returns the root window.
+.ds Wi whose current attributes you want to obtain
+.IP \fIw\fP 1i
+Specifies the window \*(Wi.
+.IP \fIwidth_return\fP 1i
+.br
+.ns
+.IP \fIheight_return\fP 1i
+Return the drawable's dimensions (width and height).
+.IP \fIwindow_attributes_return\fP 1i
+Returns the specified window's attributes in the
+.ZN XWindowAttributes
+structure.
+.IP \fIx_return\fP 1i
+.br
+.ns
+.IP \fIy_return\fP 1i
+Return the x and y coordinates that define the location of the drawable.
+For a window, 
+these coordinates specify the upper-left outer corner relative to
+its parent's origin.
+For pixmaps, these coordinates are always zero.
+.SH DESCRIPTION
+The
+.ZN XGetWindowAttributes
+function returns the current attributes for the specified window to an
+.ZN XWindowAttributes
+structure.  It returns a nonzero status on success; otherwise, it returns a
+zero status.
+.LP
+.ZN XGetWindowAttributes
+can generate
+.ZN BadDrawable
+and
+.ZN BadWindow
+errors.
+.LP
+The
+.ZN XGetGeometry
+function returns the root window and the current geometry of the drawable.
+The geometry of the drawable includes the x and y coordinates, width and height,
+border width, and depth.
+These are described in the argument list.
+It is legal to pass to this function a window whose class is
+.ZN InputOnly .
+It returns a nonzero status on success; otherwise, it returns a
+zero status.
+.SH STRUCTURES
+The
+.ZN XWindowAttributes
+structure contains:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int x, y;       /\&* location of window */
+       int width, height;      /\&* width and height of window */
+       int border_width;       /\&* border width of window */
+       int depth;      /\&* depth of window */
+       Visual *visual; /\&* the associated visual structure */
+       Window root;    /\&* root of screen containing window */
+       int class;      /\&* InputOutput, InputOnly*/
+       int bit_gravity;        /\&* one of the bit gravity values */
+       int win_gravity;        /\&* one of the window gravity values */
+       int backing_store;      /\&* NotUseful, WhenMapped, Always */
+       unsigned long backing_planes;   /\&* planes to be preserved if possible */
+       unsigned long backing_pixel;    /\&* value to be used when restoring planes */
+       Bool save_under;        /\&* boolean, should bits under be saved? */
+       Colormap colormap;      /\&* color map to be associated with window */
+       Bool map_installed;     /\&* boolean, is color map currently installed*/
+       int map_state;  /\&* IsUnmapped, IsUnviewable, IsViewable */
+       long all_event_masks;   /\&* set of events all people have interest in*/
+       long your_event_mask;   /\&* my event mask */
+       long do_not_propagate_mask;     /\&* set of events that should not propagate */
+       Bool override_redirect; /\&* boolean value for override-redirect */
+       Screen *screen; /\&* back pointer to correct screen */
+} XWindowAttributes;
+.De
+.LP
+The x and y members are set to the upper-left outer
+corner relative to the parent window's origin.
+The width and height members are set to the inside size of the window, 
+not including the border.
+The border_width member is set to the window's border width in pixels.
+The depth member is set to the depth of the window 
+(that is, bits per pixel for the object).
+The visual member is a pointer to the screen's associated
+.ZN Visual
+structure.
+The root member is set to the root window of the screen containing the window.
+The class member is set to the window's class and can be either
+.ZN InputOutput
+or
+.ZN InputOnly .
+.LP
+The bit_gravity member is set to the window's bit gravity
+and can be one of the following:
+.LP
+.TS
+lw(1.5i) lw(1.5i).
+T{
+.ZN ForgetGravity
+T}     T{
+.ZN EastGravity
+T}
+T{
+.ZN NorthWestGravity
+T}     T{
+.ZN SouthWestGravity
+T}
+T{
+.ZN NorthGravity
+T}     T{
+.ZN SouthGravity
+T}
+T{
+.ZN NorthEastGravity
+T}     T{
+.ZN SouthEastGravity
+T}
+T{
+.ZN WestGravity
+T}     T{
+.ZN StaticGravity
+T}
+.ZN CenterGravity
+.TE
+.LP
+The win_gravity member is set to the window's window gravity
+and can be one of the following:
+.LP
+.TS
+lw(1.5i) lw(1.5i).
+T{
+.ZN UnmapGravity
+T}     T{
+.ZN EastGravity
+T}
+T{
+.ZN NorthWestGravity
+T}     T{
+.ZN SouthWestGravity
+T}
+T{
+.ZN NorthGravity
+T}     T{
+.ZN SouthGravity
+T}
+T{
+.ZN NorthEastGravity
+T}     T{
+.ZN SouthEastGravity
+T}
+T{
+.ZN WestGravity
+T}     T{
+.ZN StaticGravity
+T}
+.ZN CenterGravity
+.TE
+.LP
+For additional information on gravity,
+see section 3.3.
+.LP
+The backing_store member is set to indicate how the X server should maintain
+the contents of a window 
+and can be 
+.ZN WhenMapped ,
+.ZN Always ,
+or
+.ZN NotUseful .
+The backing_planes member is set to indicate (with bits set to 1) which bit 
+planes of the window hold dynamic data that must be preserved in backing_stores 
+and during save_unders.
+The backing_pixel member is set to indicate what values to use 
+for planes not set in backing_planes.
+.LP
+The save_under member is set to 
+.ZN True
+or
+.ZN False .
+The colormap member is set to the colormap for the specified window and can be
+a colormap ID or 
+.ZN None .
+The map_installed member is set to indicate whether the colormap is 
+currently installed and can be 
+.ZN True
+or
+.ZN False .
+The map_state member is set to indicate the state of the window and can be
+.ZN IsUnmapped ,
+.ZN IsUnviewable ,
+or
+.ZN IsViewable .
+.ZN IsUnviewable
+is used if the window is mapped but some ancestor is unmapped.
+.LP
+The all_event_masks member is set to the bitwise inclusive OR of all event 
+masks selected on the window by all clients.
+The your_event_mask member is set to the bitwise inclusive OR of all event 
+masks selected by the querying client.
+The do_not_propagate_mask member is set to the bitwise inclusive OR of the 
+set of events that should not propagate.
+.LP
+The override_redirect member is set to indicate whether this window overrides
+structure control facilities and can be 
+.ZN True
+or
+.ZN False .
+Window manager clients should ignore the window if this member is
+.ZN True .
+.LP
+The screen member is set to a screen pointer that gives you a back pointer 
+to the correct screen.
+This makes it easier to obtain the screen information without
+having to loop over the root window fields to see which field matches.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadDrawable
+A value for a Drawable argument does not name a defined Window or Pixmap.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XQueryPointer(__libmansuffix__),
+XQueryTree(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XGetWindowProperty.man b/man/XGetWindowProperty.man
new file mode 100644 (file)
index 0000000..da9460a
--- /dev/null
@@ -0,0 +1,476 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XGetWindowProperty __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XGetWindowProperty, XListProperties, XChangeProperty, XRotateWindowProperties, XDeleteProperty \- obtain and change window properties
+.SH SYNTAX
+.HP
+int XGetWindowProperty\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, Atom
+\fIproperty\fP\^, long \fIlong_offset\fP\^, long \fIlong_length\fP\^, Bool
+\fIdelete\fP\^, Atom \fIreq_type\fP\^, Atom *\fIactual_type_return\fP\^, int
+*\fIactual_format_return\fP\^, unsigned long *\fInitems_return\fP\^, unsigned
+long *\fIbytes_after_return\fP\^, unsigned char **\fIprop_return\fP\^); 
+.HP
+Atom *XListProperties\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, int
+*\fInum_prop_return\fP\^); 
+.HP
+int XChangeProperty\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, Atom
+\fIproperty\fP\^, Atom \fItype\fP\^, int \fIformat\fP\^, int \fImode\fP\^,
+unsigned char *\fIdata\fP\^, int \fInelements\fP\^); 
+.HP
+int XRotateWindowProperties\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^,
+Atom \fIproperties\fP\^[]\^, int \fInum_prop\fP\^, int \fInpositions\fP\^); 
+.HP
+int XDeleteProperty\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, Atom
+\fIproperty\fP\^); 
+.SH ARGUMENTS
+.IP \fIactual_format_return\fP 1i
+Returns the actual format of the property.
+.IP \fIactual_type_return\fP 1i
+Returns the atom identifier  that defines the actual type of the property.
+.IP \fIbytes_after_return\fP 1i
+Returns the number of bytes remaining to be read in the property if 
+a partial read was performed.
+.IP \fIdata\fP 1i
+Specifies the property data.
+.IP \fIdelete\fP 1i
+Specifies a Boolean value that determines whether the property is deleted.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIformat\fP 1i
+Specifies whether the data should be viewed as a list
+of 8-bit, 16-bit, or 32-bit quantities.
+Possible values are 8, 16, and 32.
+This information allows the X server to correctly perform
+byte-swap operations as necessary.
+If the format is 16-bit or 32-bit,
+you must explicitly cast your data pointer to an (unsigned char *) in the call
+to 
+.ZN XChangeProperty .
+.IP \fIlong_length\fP 1i
+Specifies the length in 32-bit multiples of the data to be retrieved.
+.IP \fIlong_offset\fP 1i
+Specifies the offset in the specified property (in 32-bit quantities) 
+where the data is to be retrieved.
+.\" Changed name of this file to prop_mode.a on 1/13/87
+.IP \fImode\fP 1i
+Specifies the mode of the operation.
+You can pass
+.ZN PropModeReplace ,
+.ZN PropModePrepend ,
+or
+.ZN PropModeAppend .
+.IP \fInelements\fP 1i
+Specifies the number of elements of the specified data format.
+.IP \fInitems_return\fP 1i
+Returns the actual number of 8-bit, 16-bit, or 32-bit items 
+stored in the prop_return data.
+.IP \fInum_prop\fP 1i
+Specifies the length of the properties array.
+.IP \fInum_prop_return\fP 1i
+Returns the length of the properties array.
+.IP \fInpositions\fP 1i
+Specifies the rotation amount.
+.IP \fIprop_return\fP 1i
+Returns the data in the specified format.
+If the returned format is 8, the returned data is represented as a
+char array. If the returned format is 16, the returned data is
+represented as a array of short int type and should be cast to that
+type to obtain the elements. If the returned format is 32, the
+property data will be stored as an array of longs (which in a 64-bit
+application will be 64-bit values that are padded in the upper 4 bytes).
+.IP \fIproperty\fP 1i
+Specifies the property name.
+.IP \fIproperties\fP 1i
+Specifies the array of properties that are to be rotated.
+.IP \fIreq_type\fP 1i
+Specifies the atom identifier associated with the property type or
+.ZN AnyPropertyType .
+.IP \fItype\fP 1i
+Specifies the type of the property.
+The X server does not interpret the type but simply
+passes it back to an application that later calls 
+.ZN XGetWindowProperty .
+.ds Wi whose property you want to obtain, change, rotate or delete
+.IP \fIw\fP 1i
+Specifies the window \*(Wi.
+.SH DESCRIPTION
+The
+.ZN XGetWindowProperty
+function returns the actual type of the property; the actual format of the property;
+the number of 8-bit, 16-bit, or 32-bit items transferred; the number of bytes remaining
+to be read in the property; and a pointer to the data actually returned.
+.ZN XGetWindowProperty
+sets the return arguments as follows:
+.IP \(bu 5
+If the specified property does not exist for the specified window,
+.ZN XGetWindowProperty 
+returns 
+.ZN None
+to actual_type_return and the value zero to 
+actual_format_return and bytes_after_return.
+The nitems_return argument is empty.
+In this case, the delete argument is ignored.
+.IP \(bu 5
+If the specified property exists 
+but its type does not match the specified type,
+.ZN XGetWindowProperty 
+returns the actual property type to actual_type_return, 
+the actual property format (never zero) to actual_format_return, 
+and the property length in bytes
+(even if the actual_format_return is 16 or 32) 
+to bytes_after_return.
+It also ignores the delete argument.
+The nitems_return argument is empty.
+.IP \(bu 5
+If the specified property exists and either you assign 
+.ZN AnyPropertyType 
+to the req_type argument or the specified type matches the actual property type,
+.ZN XGetWindowProperty 
+returns the actual property type to actual_type_return and the actual
+property format (never zero) to actual_format_return. 
+It also returns a value to bytes_after_return and nitems_return, by 
+defining the following
+values:
+.IP
+.nf
+       N = actual length of the stored property in bytes
+            (even if the format is 16 or 32)
+       I = 4 * long_offset
+       T = N - I
+       L = MINIMUM(T, 4 * long_length)
+       A = N - (I + L)
+.fi
+.IP
+The returned value starts at byte index I in the property (indexing
+from zero), and its length in bytes is L.
+If the value for long_offset causes L to be negative,
+a
+.ZN BadValue
+error results. 
+The value of bytes_after_return is A, 
+giving the number of trailing unread bytes in the stored property.
+.LP
+If the returned format is 8, the returned data is represented as a
+.ZN char
+array.
+If the returned format is 16, the returned data is represented as a
+.ZN short
+array and should be cast to that type to obtain the elements.
+If the returned format is 32, the returned data is represented as a
+.ZN long
+array and should be cast to that type to obtain the elements.
+.LP
+.ZN XGetWindowProperty
+always allocates one extra byte in prop_return 
+(even if the property is zero length) 
+and sets it to zero so that simple properties consisting of characters
+do not have to be copied into yet another string before use.
+.LP
+If delete is 
+.ZN True 
+and bytes_after_return is zero, 
+.ZN XGetWindowProperty
+deletes the property 
+from the window and generates a 
+.ZN PropertyNotify 
+event on the window.
+.LP
+The function returns
+.ZN Success
+if it executes successfully.
+To free the resulting data,
+use
+.ZN XFree .
+.LP
+.ZN XGetWindowProperty
+can generate
+.ZN BadAtom ,
+.ZN BadValue ,
+and
+.ZN BadWindow 
+errors.
+.LP
+The
+.ZN XListProperties
+function returns a pointer to an array of atom properties that are defined for 
+the specified window or returns NULL if no properties were found.
+To free the memory allocated by this function, use
+.ZN XFree .
+.LP
+.ZN XListProperties
+can generate a
+.ZN BadWindow 
+error.
+.LP
+The
+.ZN XChangeProperty
+function alters the property for the specified window and
+causes the X server to generate a
+.ZN PropertyNotify
+event on that window.
+.ZN XChangeProperty
+performs the following:
+.IP \(bu 5
+If mode is
+.ZN PropModeReplace ,
+.ZN XChangeProperty
+discards the previous property value and stores the new data.
+.IP \(bu 5
+If mode is
+.ZN PropModePrepend
+or
+.ZN PropModeAppend ,
+.ZN XChangeProperty
+inserts the specified data before the beginning of the existing data
+or onto the end of the existing data, respectively.
+The type and format must match the existing property value,
+or a
+.ZN BadMatch
+error results.
+If the property is undefined, 
+it is treated as defined with the correct type and
+format with zero-length data.
+.LP
+If the specified format is 8, the property data must be a
+.ZN char
+array.
+If the specified format is 16, the property data must be a
+.ZN short
+array.
+If the specified format is 32, the property data must be a
+.ZN long
+array.
+.LP
+The lifetime of a property is not tied to the storing client.
+Properties remain until explicitly deleted, until the window is destroyed,
+or until the server resets.
+For a discussion of what happens when the connection to the X server is closed,
+see section 2.6. 
+The maximum size of a property is server dependent and can vary dynamically
+depending on the amount of memory the server has available.
+(If there is insufficient space, a
+.ZN BadAlloc
+error results.)
+.LP
+.ZN XChangeProperty
+can generate
+.ZN BadAlloc ,
+.ZN BadAtom ,
+.ZN BadMatch ,
+.ZN BadValue ,
+and
+.ZN BadWindow 
+errors.
+.LP
+The
+.ZN XRotateWindowProperties
+function allows you to rotate properties on a window and causes
+the X server to generate
+.ZN PropertyNotify
+events.
+If the property names in the properties array are viewed as being numbered 
+starting from zero and if there are num_prop property names in the list,
+then the value associated with property name I becomes the value associated 
+with property name (I + npositions) mod N for all I from zero to N \- 1.
+The effect is to rotate the states by npositions places around the virtual ring
+of property names (right for positive npositions, 
+left for negative npositions).
+If npositions mod N is nonzero,
+the X server generates a
+.ZN PropertyNotify
+event for each property in the order that they are listed in the array.
+If an atom occurs more than once in the list or no property with that 
+name is defined for the window,
+a 
+.ZN BadMatch 
+error results.
+If a 
+.ZN BadAtom 
+or 
+.ZN BadMatch 
+error results,
+no properties are changed.
+.LP
+.ZN XRotateWindowProperties
+can generate
+.ZN BadAtom ,
+.ZN BadMatch ,
+and
+.ZN BadWindow 
+errors.
+.LP
+The
+.ZN XDeleteProperty
+function deletes the specified property only if the
+property was defined on the specified window
+and causes the X server to generate a
+.ZN PropertyNotify
+event on the window unless the property does not exist.
+.LP
+.ZN XDeleteProperty
+can generate
+.ZN BadAtom
+and
+.ZN BadWindow 
+errors.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadAtom
+A value for an Atom argument does not name a defined Atom.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XFree(__libmansuffix__),
+XInternAtom(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XGetXCBConnection.man b/man/XGetXCBConnection.man
new file mode 100644 (file)
index 0000000..3b4ad11
--- /dev/null
@@ -0,0 +1,44 @@
+.\" Copyright \(co 2006 Josh Triplett
+.\"
+.\" 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.
+.\"
+.TH XGetXCBConnection __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XGetXCBConnection \- get the XCB connection for an Xlib Display
+.SH SYNTAX
+.HP
+ #include <X11/Xlib-xcb.h>
+.HP
+xcb_connection_t *XGetXCBConnection(Display *\fIdpy\fP); 
+.SH ARGUMENTS
+.IP \fIdpy\fP 1i
+Specifies the connection to the X server.
+.IN "Environment" "DISPLAY"
+.SH DESCRIPTION
+The \fIXGetXCBConnection\fP function returns the XCB connection associated with
+an Xlib Display.  Clients can use this XCB connection with functions from the
+XCB library, just as they would with an XCB connection created with XCB.
+Callers of this function must link to libX11-xcb and a version of Xlib built
+with XCB support.
+.SH "SEE ALSO"
+XOpenDisplay(__libmansuffix__),
+XSetEventQueueOwner(__libmansuffix__),
+.br
+\fIXlib \- C Language X Interface\fP
diff --git a/man/XGrabButton.man b/man/XGrabButton.man
new file mode 100644 (file)
index 0000000..9a7f0c2
--- /dev/null
@@ -0,0 +1,312 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XGrabButton __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XGrabButton, XUngrabButton \- grab pointer buttons
+.SH SYNTAX
+.HP 
+int XGrabButton\^(\^Display *\fIdisplay\fP\^, unsigned int \fIbutton\fP\^,
+unsigned int \fImodifiers\fP\^, Window \fIgrab_window\fP\^, Bool
+\fIowner_events\fP\^, unsigned int \fIevent_mask\fP\^, int
+\fIpointer_mode\fP\^, \fIkeyboard_mode\fP\^, Window \fIconfine_to\fP\^, Cursor
+\fIcursor\fP\^); 
+.HP
+int XUngrabButton\^(\^Display *\fIdisplay\fP\^, unsigned int \fIbutton\fP\^,
+unsigned int \fImodifiers\fP\^, Window \fIgrab_window\fP\^); 
+.SH ARGUMENTS
+.ds Bu grabbed or released
+.IP \fIbutton\fP 1i
+Specifies the pointer button that is to be \*(Bu or
+.ZN AnyButton .
+.IP \fIconfine_to\fP 1i
+Specifies the window to confine the pointer in or
+.ZN None .
+.IP \fIcursor\fP 1i
+Specifies the cursor that is to be displayed or
+.ZN None .
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIevent_mask\fP 1i
+Specifies which pointer events are reported to the client.
+The mask is the bitwise inclusive OR of the valid pointer event mask bits.
+.IP \fIgrab_window\fP 1i
+Specifies the grab window.
+.IP \fIkeyboard_mode\fP 1i
+Specifies further processing of keyboard events.
+You can pass 
+.ZN GrabModeSync 
+or
+.ZN GrabModeAsync .
+.IP \fImodifiers\fP 1i
+Specifies the set of keymasks or
+.ZN AnyModifier .
+The mask is the bitwise inclusive OR of the valid keymask bits.
+.IP \fIowner_events\fP 1i
+Specifies a Boolean value that indicates whether the pointer 
+events are to be reported as usual or reported with respect to the grab window 
+if selected by the event mask.
+.IP \fIpointer_mode\fP 1i
+Specifies further processing of pointer events.
+You can pass 
+.ZN GrabModeSync 
+or
+.ZN GrabModeAsync .
+.SH DESCRIPTION
+The
+.ZN XGrabButton
+function establishes a passive grab.
+In the future,
+the pointer is actively grabbed (as for
+.ZN XGrabPointer ),
+the last-pointer-grab time is set to the time at which the button was pressed
+(as transmitted in the
+.ZN ButtonPress
+event), and the
+.ZN ButtonPress
+event is reported if all of the following conditions are true:
+.IP \(bu 5
+The pointer is not grabbed, and the specified button is logically pressed
+when the specified modifier keys are logically down,
+and no other buttons or modifier keys are logically down.
+.IP \(bu 5
+The grab_window contains the pointer.
+.IP \(bu 5
+The confine_to window (if any) is viewable.
+.IP \(bu 5
+A passive grab on the same button/key combination does not exist
+on any ancestor of grab_window.
+.LP
+The interpretation of the remaining arguments is as for
+.ZN XGrabPointer .
+The active grab is terminated automatically when the logical state of the
+pointer has all buttons released
+(independent of the state of the logical modifier keys),
+at which point a 
+.ZN ButtonRelease
+event is reported to the grabbing window.
+.LP
+Note that the logical state of a device (as seen by client applications)
+may lag the physical state if device event processing is frozen.
+.LP
+This request overrides all previous grabs by the same client on the same
+button/key combinations on the same window.
+A modifiers of 
+.ZN AnyModifier 
+is equivalent to issuing the grab request for all
+possible modifier combinations (including the combination of no modifiers).  
+It is not required that all modifiers specified have currently assigned 
+KeyCodes.
+A button of 
+.ZN AnyButton 
+is equivalent to
+issuing the request for all possible buttons.
+Otherwise, it is not required that the specified button currently be assigned
+to a physical button.
+.LP
+If some other client has already issued a 
+.ZN XGrabButton
+with the same button/key combination on the same window, a
+.ZN BadAccess 
+error results.
+When using 
+.ZN AnyModifier 
+or 
+.ZN AnyButton , 
+the request fails completely,
+and a
+.ZN BadAccess
+error results (no grabs are
+established) if there is a conflicting grab for any combination.
+.ZN XGrabButton
+has no effect on an active grab.
+.LP
+.ZN XGrabButton
+can generate
+.ZN BadCursor ,
+.ZN BadValue ,
+and
+.ZN BadWindow 
+errors.
+.LP
+The
+.ZN XUngrabButton
+function releases the passive button/key combination on the specified window if
+it was grabbed by this client.
+A modifiers of 
+.ZN AnyModifier 
+is
+equivalent to issuing 
+the ungrab request for all possible modifier combinations, including 
+the combination of no modifiers.
+A button of 
+.ZN AnyButton 
+is equivalent to issuing the
+request for all possible buttons.
+.ZN XUngrabButton
+has no effect on an active grab.
+.LP
+.ZN XUngrabButton
+can generate
+.ZN BadValue
+and
+.ZN BadWindow 
+errors.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadCursor
+A value for a Cursor argument does not name a defined Cursor.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XAllowEvents(__libmansuffix__),
+XGrabPointer(__libmansuffix__),
+XGrabKey(__libmansuffix__),
+XGrabKeyboard(__libmansuffix__),
+.br
+\fI\*(xL\fP
diff --git a/man/XGrabKey.man b/man/XGrabKey.man
new file mode 100644 (file)
index 0000000..8b31dd1
--- /dev/null
@@ -0,0 +1,298 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XGrabKey __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XGrabKey, XUngrabKey \- grab keyboard keys
+.SH SYNTAX
+.HP
+int XGrabKey\^(\^Display *\fIdisplay\fP\^, int \fIkeycode\fP\^, unsigned int
+\fImodifiers\fP\^, Window \fIgrab_window\fP\^, Bool \fIowner_events\fP\^, int
+\fIpointer_mode\fP\^, int \fIkeyboard_mode\fP\^); 
+.HP
+int XUngrabKey\^(\^Display *\fIdisplay\fP\^, int \fIkeycode\fP\^, unsigned int
+\fImodifiers\fP\^, Window \fIgrab_window\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIgrab_window\fP 1i
+Specifies the grab window.
+.IP \fIkeyboard_mode\fP 1i
+Specifies further processing of keyboard events.
+You can pass 
+.ZN GrabModeSync 
+or
+.ZN GrabModeAsync .
+.IP \fIkeycode\fP 1i
+Specifies the KeyCode or
+.ZN AnyKey .
+.IP \fImodifiers\fP 1i
+Specifies the set of keymasks or
+.ZN AnyModifier .
+The mask is the bitwise inclusive OR of the valid keymask bits.
+.IP \fIowner_events\fP 1i
+Specifies a Boolean value that indicates whether the keyboard events 
+are to be reported as usual.
+.IP \fIpointer_mode\fP 1i
+Specifies further processing of pointer events.
+You can pass 
+.ZN GrabModeSync 
+or
+.ZN GrabModeAsync .
+.SH DESCRIPTION
+The
+.ZN XGrabKey
+function establishes a passive grab on the keyboard.
+In the future,
+the keyboard is actively grabbed (as for
+.ZN XGrabKeyboard ),
+the last-keyboard-grab time is set to the time at which the key was pressed
+(as transmitted in the
+.ZN KeyPress
+event), and the
+.ZN KeyPress
+event is reported if all of the following conditions are true:
+.IP \(bu 5
+The keyboard is not grabbed and the specified key
+(which can itself be a modifier key) is logically pressed
+when the specified modifier keys are logically down,
+and no other modifier keys are logically down.
+.IP \(bu 5
+Either the grab_window is an ancestor of (or is) the focus window,
+or the grab_window is a descendant of the focus window and contains the pointer.
+.IP \(bu 5
+A passive grab on the same key combination does not exist
+on any ancestor of grab_window.
+.LP
+The interpretation of the remaining arguments is as for 
+.ZN XGrabKeyboard .
+The active grab is terminated automatically when the logical state of the
+keyboard has the specified key released
+(independent of the logical state of the modifier keys),
+at which point a 
+.ZN KeyRelease
+event is reported to the grabbing window.
+.LP
+Note that the logical state of a device (as seen by client applications)
+may lag the physical state if device event processing is frozen.
+.LP
+A modifiers argument of 
+.ZN AnyModifier
+is equivalent to issuing the request for all
+possible modifier combinations (including the combination of no
+modifiers).  
+It is not required that all modifiers specified have
+currently assigned KeyCodes.
+A keycode argument of 
+.ZN AnyKey
+is equivalent to issuing
+the request for all possible KeyCodes.
+Otherwise, the specified keycode must be in
+the range specified by min_keycode and max_keycode in the connection
+setup, 
+or a
+.ZN BadValue
+error results.
+.LP
+If some other client has issued a 
+.ZN XGrabKey
+with the same key combination on the same window, a 
+.ZN BadAccess 
+error results.
+When using
+.ZN AnyModifier
+or 
+.ZN AnyKey ,
+the request fails completely,
+and a
+.ZN BadAccess 
+error results (no grabs are established) 
+if there is a conflicting grab for any combination.
+.LP
+.ZN XGrabKey
+can generate
+.ZN BadAccess ,
+.ZN BadValue ,
+and
+.ZN BadWindow 
+errors.
+.LP
+The
+.ZN XUngrabKey
+function releases the key combination on the specified window if it was grabbed
+by this client.
+It has no effect on an active grab.
+A modifiers of
+.ZN AnyModifier
+is equivalent to issuing
+the request for all possible modifier combinations
+(including the combination of no modifiers).
+A keycode argument of
+.ZN AnyKey
+is equivalent to issuing the request for all possible key codes.
+.LP
+.ZN XUngrabKey
+can generate
+.ZN BadValue
+and
+.ZN BadWindow 
+error.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAccess
+A client attempted
+to grab a key/button combination already grabbed by another client.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XAllowEvents(__libmansuffix__),
+XGrabButton(__libmansuffix__),
+XGrabKeyboard(__libmansuffix__),
+XGrabPointer(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XGrabKeyboard.man b/man/XGrabKeyboard.man
new file mode 100644 (file)
index 0000000..e448b3b
--- /dev/null
@@ -0,0 +1,297 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XGrabKeyboard __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XGrabKeyboard, XUngrabKeyboard \- grab the keyboard
+.SH SYNTAX
+.HP
+int XGrabKeyboard\^(\^Display *\fIdisplay\fP\^, Window \fIgrab_window\fP\^,
+Bool \fIowner_events\fP\^, int \fIpointer_mode\fP\^, int
+\fIkeyboard_mode\fP\^, Time \fItime\fP\^); 
+.HP
+int XUngrabKeyboard\^(\^Display *\fIdisplay\fP\^, Time \fItime\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIgrab_window\fP 1i
+Specifies the grab window.
+.IP \fIkeyboard_mode\fP 1i
+Specifies further processing of keyboard events.
+You can pass 
+.ZN GrabModeSync 
+or
+.ZN GrabModeAsync .
+.IP \fIowner_events\fP 1i
+Specifies a Boolean value that indicates whether the keyboard events 
+are to be reported as usual.
+.IP \fIpointer_mode\fP 1i
+Specifies further processing of pointer events.
+You can pass 
+.ZN GrabModeSync 
+or
+.ZN GrabModeAsync .
+.IP \fItime\fP 1i
+Specifies the time.
+You can pass either a timestamp or
+.ZN CurrentTime .
+.SH DESCRIPTION
+The
+.ZN XGrabKeyboard
+function actively grabs control of the keyboard and generates
+.ZN FocusIn
+and
+.ZN FocusOut
+events.
+Further key events are reported only to the
+grabbing client.
+.ZN XGrabKeyboard
+overrides any active keyboard grab by this client.
+If owner_events is 
+.ZN False , 
+all generated key events are reported with
+respect to grab_window.  
+If owner_events is 
+.ZN True  
+and if a generated
+key event would normally be reported to this client, it is reported
+normally; otherwise, the event is reported with respect to the
+grab_window.  
+Both 
+.ZN KeyPress 
+and 
+.ZN KeyRelease 
+events are always reported,
+independent of any event selection made by the client.
+.LP
+If the keyboard_mode argument is 
+.ZN GrabModeAsync ,
+keyboard event processing continues
+as usual. 
+If the keyboard is currently frozen by this client, 
+then processing of keyboard events is resumed.
+If the keyboard_mode  argument is
+.ZN GrabModeSync ,
+the state of the keyboard (as seen by client applications) appears to freeze,
+and the X server generates no further keyboard events until the
+grabbing client issues a releasing 
+.ZN XAllowEvents 
+call or until the keyboard grab is released.
+Actual keyboard changes are not lost while the keyboard is frozen; 
+they are simply queued in the server for later processing.
+.LP
+If pointer_mode is 
+.ZN GrabModeAsync ,
+pointer event processing is unaffected
+by activation of the grab.  
+If pointer_mode is 
+.ZN GrabModeSync ,
+the state of the pointer (as seen by client applications) appears to freeze, 
+and the X server generates no further pointer events 
+until the grabbing client issues a releasing 
+.ZN XAllowEvents 
+call or until the keyboard grab is released.
+Actual pointer changes are not lost while the pointer is frozen; 
+they are simply queued in the server for later processing.
+.LP
+If the keyboard is actively grabbed by some other client,
+.ZN XGrabKeyboard
+fails and returns
+.ZN AlreadyGrabbed .
+If grab_window is not viewable,
+it fails and returns
+.ZN GrabNotViewable .
+If the keyboard is frozen by an active grab of another client,
+it fails and returns
+.ZN GrabFrozen .
+If the specified time is earlier than the last-keyboard-grab time 
+or later than the current X server time,
+it fails and returns
+.ZN GrabInvalidTime .
+Otherwise, the last-keyboard-grab time is set to the specified time
+.Pn ( CurrentTime 
+is replaced by the current X server time).
+.LP
+.ZN XGrabKeyboard
+can generate
+.ZN BadValue
+and
+.ZN BadWindow 
+errors.
+.LP
+The
+.ZN XUngrabKeyboard
+function
+releases the keyboard and any queued events if this client has it actively grabbed from
+either
+.ZN XGrabKeyboard
+or
+.ZN XGrabKey .
+.ZN XUngrabKeyboard
+does not release the keyboard and any queued events
+if the specified time is earlier than
+the last-keyboard-grab time or is later than the current X server time.
+It also generates
+.ZN FocusIn 
+and 
+.ZN FocusOut 
+events.
+The X server automatically performs an 
+.ZN UngrabKeyboard 
+request if the event window for an
+active keyboard grab becomes not viewable.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XAllowEvents(__libmansuffix__),
+XGrabButton(__libmansuffix__),
+XGrabKey(__libmansuffix__),
+XGrabPointer(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XGrabPointer.man b/man/XGrabPointer.man
new file mode 100644 (file)
index 0000000..23426cc
--- /dev/null
@@ -0,0 +1,365 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XGrabPointer __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XGrabPointer, XUngrabPointer, XChangeActivePointerGrab \- grab the pointer
+.SH SYNTAX
+.HP
+int XGrabPointer\^(\^Display *\fIdisplay\fP\^, Window \fIgrab_window\fP\^,
+Bool \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
+int XUngrabPointer\^(\^Display *\fIdisplay\fP\^, Time \fItime\fP\^); 
+.HP
+int XChangeActivePointerGrab\^(\^Display *\fIdisplay\fP\^, unsigned int
+\fIevent_mask\fP\^, Cursor \fIcursor\fP\^, Time \fItime\fP\^); 
+.SH ARGUMENTS
+.IP \fIconfine_to\fP 1i
+Specifies the window to confine the pointer in or
+.ZN None .
+.IP \fIcursor\fP 1i
+Specifies the cursor that is to be displayed during the grab or
+.ZN None . 
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIevent_mask\fP 1i
+Specifies which pointer events are reported to the client.
+The mask is the bitwise inclusive OR of the valid pointer event mask bits.
+.IP \fIgrab_window\fP 1i
+Specifies the grab window.
+.IP \fIkeyboard_mode\fP 1i
+Specifies further processing of keyboard events.
+You can pass 
+.ZN GrabModeSync 
+or
+.ZN GrabModeAsync .
+.IP \fIowner_events\fP 1i
+Specifies a Boolean value that indicates whether the pointer 
+events are to be reported as usual or reported with respect to the grab window 
+if selected by the event mask.
+.IP \fIpointer_mode\fP 1i
+Specifies further processing of pointer events.
+You can pass 
+.ZN GrabModeSync 
+or
+.ZN GrabModeAsync .
+.IP \fItime\fP 1i
+Specifies the time.
+You can pass either a timestamp or
+.ZN CurrentTime .
+.SH DESCRIPTION
+The
+.ZN XGrabPointer
+function actively grabs control of the pointer and returns
+.ZN GrabSuccess
+if the grab was successful.
+Further pointer events are reported only to the grabbing client.
+.ZN XGrabPointer
+overrides any active pointer grab by this client.
+If owner_events is 
+.ZN False , 
+all generated pointer events
+are reported with respect to grab_window and are reported only if
+selected by event_mask.
+If owner_events is 
+.ZN True
+and if a generated
+pointer event would normally be reported to this client, 
+it is reported as usual. 
+Otherwise, the event is reported with respect to the
+grab_window and is reported only if selected by event_mask.
+For either value of owner_events, unreported events are discarded.
+.LP
+If the pointer_mode is 
+.ZN GrabModeAsync , 
+pointer event processing continues as usual.
+If the pointer is currently frozen by this client, 
+the processing of events for the pointer is resumed.
+If the pointer_mode is 
+.ZN GrabModeSync , 
+the state of the pointer, as seen by
+client applications,
+appears to freeze, and the X server generates no further pointer events
+until the grabbing client calls 
+.ZN XAllowEvents
+or until the pointer grab is released.
+Actual pointer changes are not lost while the pointer is frozen;
+they are simply queued in the server for later processing.
+.LP
+If the keyboard_mode is 
+.ZN GrabModeAsync , 
+keyboard event processing is unaffected by activation of the grab.
+If the keyboard_mode is 
+.ZN GrabModeSync , 
+the state of the keyboard, as seen by
+client applications,
+appears to freeze, and the X server generates no further keyboard events
+until the grabbing client calls 
+.ZN XAllowEvents
+or until the pointer grab is released.
+Actual keyboard changes are not lost while the pointer is frozen;
+they are simply queued in the server for later processing.
+.LP
+If a cursor is specified, it is displayed regardless of what
+window the pointer is in.  
+If 
+.ZN None
+is specified,
+the normal cursor for that window is displayed
+when the pointer is in grab_window or one of its subwindows;
+otherwise, the cursor for grab_window is displayed.
+.LP
+If a confine_to window is specified,
+the pointer is restricted to stay contained in that window.
+The confine_to window need have no relationship to the grab_window.
+If the pointer is not initially in the confine_to window, 
+it is warped automatically to the closest edge 
+just before the grab activates and enter/leave events are generated as usual. 
+If the confine_to window is subsequently reconfigured, 
+the pointer is warped automatically, as necessary, 
+to keep it contained in the window.
+.LP
+The time argument allows you to avoid certain circumstances that come up
+if applications take a long time to respond or if there are long network
+delays.
+Consider a situation where you have two applications, both
+of which normally grab the pointer when clicked on.
+If both applications specify the timestamp from the event, 
+the second application may wake up faster and successfully grab the pointer
+before the first application. 
+The first application then will get an indication that the other application 
+grabbed the pointer before its request was processed.
+.LP
+.ZN XGrabPointer 
+generates
+.ZN EnterNotify 
+and
+.ZN LeaveNotify 
+events.
+.LP
+Either if grab_window or confine_to window is not viewable
+or if the confine_to window lies completely outside the boundaries of the root
+window,
+.ZN XGrabPointer
+fails and returns
+.ZN GrabNotViewable .
+If the pointer is actively grabbed by some other client,
+it fails and returns
+.ZN AlreadyGrabbed .
+If the pointer is frozen by an active grab of another client,
+it fails and returns
+.ZN GrabFrozen .
+If the specified time is earlier than the last-pointer-grab time or later 
+than the current X server time, it fails and returns
+.ZN GrabInvalidTime .
+Otherwise, the last-pointer-grab time is set to the specified time
+.Pn ( CurrentTime 
+is replaced by the current X server time).
+.LP
+.ZN XGrabPointer
+can generate
+.ZN BadCursor ,
+.ZN BadValue ,
+and
+.ZN BadWindow 
+errors.
+.LP
+The
+.ZN XUngrabPointer
+function releases the pointer and any queued events
+if this client has actively grabbed the pointer from
+.ZN XGrabPointer ,
+.ZN XGrabButton ,
+or from a normal button press.
+.ZN XUngrabPointer
+does not release the pointer if the specified
+time is earlier than the last-pointer-grab time or is later than the
+current X server time.
+It also generates 
+.ZN EnterNotify 
+and 
+.ZN LeaveNotify 
+events.
+The X server performs an 
+.ZN UngrabPointer 
+request automatically if the event window or confine_to window 
+for an active pointer grab becomes not viewable
+or if window reconfiguration causes the confine_to window to lie completely
+outside the boundaries of the root window.
+.LP
+The
+.ZN XChangeActivePointerGrab
+function changes the specified dynamic parameters if the pointer is actively
+grabbed by the client and if the specified time is no earlier than the
+last-pointer-grab time and no later than the current X server time.
+This function has no effect on the passive parameters of a
+.ZN XGrabButton .
+The interpretation of event_mask and cursor is the same as described in
+.ZN XGrabPointer .
+.LP
+.ZN XChangeActivePointerGrab
+can generate a
+.ZN BadCursor 
+and
+.ZN BadValue
+error.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadCursor
+A value for a Cursor argument does not name a defined Cursor.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XAllowEvents(__libmansuffix__),
+XGrabButton(__libmansuffix__),
+XGrabKey(__libmansuffix__),
+XGrabKeyboard(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XGrabServer.man b/man/XGrabServer.man
new file mode 100644 (file)
index 0000000..03b2b90
--- /dev/null
@@ -0,0 +1,170 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XGrabServer __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XGrabServer, XUngrabServer \- grab the server
+.SH SYNTAX
+.HP
+int XGrabServer\^(\^Display *\fIdisplay\fP\^); 
+.HP
+int XUngrabServer\^(\^Display *\fIdisplay\fP\^);
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.SH DESCRIPTION
+The
+.ZN XGrabServer
+function disables processing of requests and close downs on all other 
+connections than the one this request arrived on.
+You should not grab the X server any more than is absolutely necessary.
+.LP
+The
+.ZN XUngrabServer
+function restarts processing of requests and close downs on other connections.
+You should avoid grabbing the X server as much as possible.
+.SH "SEE ALSO"
+XGrabButton(__libmansuffix__),
+XGrabKey(__libmansuffix__),
+XGrabKeyboard(__libmansuffix__),
+XGrabPointer(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XGraphicsExposeEvent.man b/man/XGraphicsExposeEvent.man
new file mode 100644 (file)
index 0000000..8360822
--- /dev/null
@@ -0,0 +1,276 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XGraphicsExposeEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XGraphicsExposeEvent, XNoExposeEvent \- GraphicsExpose and NoExpose event structures
+.SH STRUCTURES
+The structures for
+.ZN GraphicsExpose
+and
+.ZN NoExpose
+events contain:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int type;       /\&* GraphicsExpose */
+       unsigned long serial;   /\&* # of last request processed by server */
+       Bool send_event;        /\&* true if this came from a SendEvent request */
+       Display *display;       /\&* Display the event was read from */
+       Drawable drawable;
+       int x, y;
+       int width, height;
+       int count;      /\&* if nonzero, at least this many more */
+       int major_code; /\&* core is CopyArea or CopyPlane */
+       int minor_code; /\&* not defined in the core */
+} XGraphicsExposeEvent;
+.De
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int type;       /\&* NoExpose */
+       unsigned long serial;   /\&* # of last request processed by server */
+       Bool send_event;        /\&* true if this came from a SendEvent request */
+       Display *display;       /\&* Display the event was read from */
+       Drawable drawable;
+       int major_code; /\&* core is CopyArea or CopyPlane */
+       int minor_code; /\&* not defined in the core */
+} XNoExposeEvent;
+.De
+.LP
+When you receive these events,
+their structure members are set as follows.
+.LP
+The type member is set to the event type constant name that uniquely identifies
+it.
+For example, when the X server reports a
+.ZN GraphicsExpose
+event to a client application, it sends an
+.ZN XGraphicsExposeEvent
+structure with the type member set to
+.ZN GraphicsExpose .
+The display member is set to a pointer to the display the event was read on.
+The send_event member is set to
+.ZN True
+if the event came from a
+.ZN SendEvent
+protocol request.
+The serial member is set from the serial number reported in the protocol
+but expanded from the 16-bit least-significant bits to a full 32-bit value.
+The window member is set to the window that is most useful to toolkit
+dispatchers.
+.LP
+Both structures have these common members: drawable, major_code, and minor_code.
+The drawable member is set to the drawable of the destination region on 
+which the graphics request was to be performed.
+The major_code member is set to the graphics request initiated by the client
+and can be either
+.ZN X_CopyArea
+or
+.ZN X_CopyPlane .
+If it is
+.ZN X_CopyArea ,
+a call to
+.ZN XCopyArea
+initiated the request.
+If it is
+.ZN X_CopyPlane ,
+a call to
+.ZN XCopyPlane
+initiated the request.
+These constants are defined in 
+.hN X11/Xproto.h .
+The minor_code member,
+like the major_code member, 
+indicates which graphics request was initiated by
+the client. 
+However, the minor_code member is not defined by the core
+X protocol and will be zero in these cases, 
+although it may be used by an extension.
+.LP
+The 
+.ZN XGraphicsExposeEvent
+structure has these additional members: x, y, width, height, and count. 
+The x and y members are set to the coordinates relative to the drawable's origin
+and indicate the upper-left corner of the rectangle.
+The width and height members are set to the size (extent) of the rectangle.
+The count member is set to the number of
+.ZN GraphicsExpose
+events to follow.
+If count is zero, no more
+.ZN GraphicsExpose
+events follow for this window.
+However, if count is nonzero, at least that number of
+.ZN GraphicsExpose
+events (and possibly more) are to follow for this window.
+.SH "SEE ALSO"
+XAnyEvent(__libmansuffix__),
+XButtonEvent(__libmansuffix__),
+XCreateWindowEvent(__libmansuffix__),
+XCirculateEvent(__libmansuffix__),
+XCirculateRequestEvent(__libmansuffix__),
+XColormapEvent(__libmansuffix__),
+XConfigureEvent(__libmansuffix__),
+XConfigureRequestEvent(__libmansuffix__),
+XCopyArea(__libmansuffix__),
+XCrossingEvent(__libmansuffix__),
+XDestroyWindowEvent(__libmansuffix__),
+XErrorEvent(__libmansuffix__),
+XExposeEvent(__libmansuffix__),
+XFocusChangeEvent(__libmansuffix__),
+XGravityEvent(__libmansuffix__),
+XKeymapEvent(__libmansuffix__),
+XMapEvent(__libmansuffix__),
+XMapRequestEvent(__libmansuffix__),
+XPropertyEvent(__libmansuffix__),
+XReparentEvent(__libmansuffix__),
+XResizeRequestEvent(__libmansuffix__),
+XSelectionClearEvent(__libmansuffix__),
+XSelectionEvent(__libmansuffix__),
+XSelectionRequestEvent(__libmansuffix__),
+XUnmapEvent(__libmansuffix__),
+XVisibilityEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XGravityEvent.man b/man/XGravityEvent.man
new file mode 100644 (file)
index 0000000..09f5654
--- /dev/null
@@ -0,0 +1,224 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XGravityEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XGravityEvent \- GravityNotify event structure
+.SH STRUCTURES
+The structure for
+.ZN GravityNotify
+events contains:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int type;       /\&* GravityNotify */
+       unsigned long serial;   /\&* # of last request processed by server */
+       Bool send_event;        /\&* true if this came from a SendEvent request */
+       Display *display;       /\&* Display the event was read from */
+       Window event;
+       Window window;
+       int x, y;
+} XGravityEvent;
+.De
+.LP
+When you receive this event,
+the structure members are set as follows.
+.LP
+The type member is set to the event type constant name that uniquely identifies
+it.
+For example, when the X server reports a
+.ZN GraphicsExpose
+event to a client application, it sends an
+.ZN XGraphicsExposeEvent
+structure with the type member set to
+.ZN GraphicsExpose .
+The display member is set to a pointer to the display the event was read on.
+The send_event member is set to
+.ZN True
+if the event came from a
+.ZN SendEvent
+protocol request.
+The serial member is set from the serial number reported in the protocol
+but expanded from the 16-bit least-significant bits to a full 32-bit value.
+The window member is set to the window that is most useful to toolkit
+dispatchers.
+.LP
+The event member is set either to the window that was moved or to its parent,
+depending on whether
+.ZN StructureNotify
+or
+.ZN SubstructureNotify
+was selected.
+The window member is set to the child window that was moved.
+The x and y members are set to the coordinates relative to the 
+new parent window's origin
+and indicate the position of the upper-left outside corner of the 
+window.
+.SH "SEE ALSO"
+XAnyEvent(__libmansuffix__),
+XButtonEvent(__libmansuffix__),
+XCreateWindowEvent(__libmansuffix__),
+XCirculateEvent(__libmansuffix__),
+XCirculateRequestEvent(__libmansuffix__),
+XColormapEvent(__libmansuffix__),
+XConfigureEvent(__libmansuffix__),
+XConfigureRequestEvent(__libmansuffix__),
+XCrossingEvent(__libmansuffix__),
+XDestroyWindowEvent(__libmansuffix__),
+XErrorEvent(__libmansuffix__),
+XExposeEvent(__libmansuffix__),
+XFocusChangeEvent(__libmansuffix__),
+XGraphicsExposeEvent(__libmansuffix__),
+XKeymapEvent(__libmansuffix__),
+XMapEvent(__libmansuffix__),
+XMapRequestEvent(__libmansuffix__),
+XPropertyEvent(__libmansuffix__),
+XReparentEvent(__libmansuffix__),
+XResizeRequestEvent(__libmansuffix__),
+XSelectionClearEvent(__libmansuffix__),
+XSelectionEvent(__libmansuffix__),
+XSelectionRequestEvent(__libmansuffix__),
+XUnmapEvent(__libmansuffix__),
+XVisibilityEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XHostAddress.man b/man/XHostAddress.man
new file mode 100644 (file)
index 0000000..13e833b
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAddHost.__libmansuffix__
diff --git a/man/XIMOfIC.man b/man/XIMOfIC.man
new file mode 100644 (file)
index 0000000..2c9fd66
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XCreateIC.__libmansuffix__
diff --git a/man/XIconSize.man b/man/XIconSize.man
new file mode 100644 (file)
index 0000000..afe574e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAllocIconSize.__libmansuffix__
diff --git a/man/XIconifyWindow.man b/man/XIconifyWindow.man
new file mode 100644 (file)
index 0000000..a4e6be8
--- /dev/null
@@ -0,0 +1,256 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XIconifyWindow __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XIconifyWindow, XWithdrawWindow, XReconfigureWMWindow \- manipulate top-level windows
+.SH SYNTAX
+.HP
+Status XIconifyWindow\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP, int
+\fIscreen_number\fP\^); 
+.HP
+Status XWithdrawWindow\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, int
+\fIscreen_number\fP\^); 
+.HP
+Status XReconfigureWMWindow\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^,
+int \fIscreen_number\fP\^, unsigned int \fIvalue_mask\fP\^, XWindowChanges
+*\fIvalues\fP); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIscreen_number\fP 1i
+Specifies the appropriate screen number on the host server.
+.IP \fIvalue_mask\fP 1i
+Specifies which values are to be set using information in
+the values structure.
+This mask is the bitwise inclusive OR of the valid configure window values bits.
+.IP \fIvalues\fP 1i
+Specifies the 
+.ZN XWindowChanges 
+structure.
+.IP \fIw\fP 1i
+Specifies the window.
+.SH DESCRIPTION
+The 
+.ZN XIconifyWindow 
+function sends a WM_CHANGE_STATE 
+.ZN ClientMessage 
+event with a format of 32 and a first data element of 
+.ZN IconicState 
+(as described in section 4.1.4 of the 
+\fIInter-Client Communication Conventions Manual\fP)
+and a window of w
+to the root window of the specified screen
+with an event mask set to
+.ZN SubstructureNotifyMask |
+.ZN SubstructureRedirectMask .
+Window managers may elect to receive this message and
+if the window is in its normal state, 
+may treat it as a request to change the window's state from normal to iconic.
+If the WM_CHANGE_STATE property cannot be interned, 
+.ZN XIconifyWindow
+does not send a message and returns a zero status.
+It returns a nonzero status if the client message is sent successfully;
+otherwise, it returns a zero status.
+.LP
+The 
+.ZN XWithdrawWindow 
+function unmaps the specified window 
+and sends a synthetic 
+.ZN UnmapNotify 
+event to the root window of the specified screen.
+Window managers may elect to receive this message 
+and may treat it as a request to change the window's state to withdrawn.
+When a window is in the withdrawn state, 
+neither its normal nor its iconic representations is visible.
+It returns a nonzero status if the 
+.ZN UnmapNotify 
+event is successfully sent; 
+otherwise, it returns a zero status.
+.LP
+.ZN XWithdrawWindow
+can generate a
+.ZN BadWindow
+error.
+.LP
+The 
+.ZN XReconfigureWMWindow 
+function issues a 
+.ZN ConfigureWindow 
+request on the specified top-level window.
+If the stacking mode is changed and the request fails with a 
+.ZN BadMatch 
+error, 
+the error is trapped by Xlib and a synthetic 
+.ZN ConfigureRequestEvent 
+containing the same configuration parameters is sent to the root 
+of the specified window.
+Window managers may elect to receive this event 
+and treat it as a request to reconfigure the indicated window.
+It returns a nonzero status if the request or event is successfully sent;
+otherwise, it returns a zero status.
+.LP
+.ZN XReconfigureWMWindow
+can generate
+.ZN BadValue
+and
+.ZN BadWindow
+errors.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XChangeWindowAttributes(__libmansuffix__),
+XConfigureWindow(__libmansuffix__),
+XCreateWindow(__libmansuffix__),
+XDestroyWindow(__libmansuffix__),
+XRaiseWindow(__libmansuffix__),
+XMapWindow(__libmansuffix__),
+XUnmapWindow(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XIfEvent.man b/man/XIfEvent.man
new file mode 100644 (file)
index 0000000..ebfbf8c
--- /dev/null
@@ -0,0 +1,251 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XIfEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XIfEvent, XCheckIfEvent, XPeekIfEvent \- check the event queue with a predicate procedure
+.SH SYNTAX
+.HP
+int XIfEvent\^(\^Display *\fIdisplay\fP\^, XEvent *\fIevent_return\fP\^, Bool
+(\^*\fIpredicate\fP\^)\^(\^)\^, XPointer \fIarg\fP\^); 
+.HP
+Bool XCheckIfEvent\^(\^Display *\fIdisplay\fP\^, XEvent *\fIevent_return\fP\^,
+Bool (\^*\fIpredicate\fP\^)\^(\^)\^, XPointer \fIarg\fP\^); 
+.HP
+int XPeekIfEvent\^(\^Display *\fIdisplay\fP\^, XEvent *\fIevent_return\fP\^,
+Bool (\^*\fIpredicate\fP\^)\^(\^)\^, XPointer \fIarg\fP\^); 
+.SH ARGUMENTS
+.IP \fIarg\fP 1i
+Specifies the user-supplied argument that will be passed to the predicate procedure.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.ds Ev \ either a copy of or 
+.IP \fIevent_return\fP 1i
+Returns\*(Ev the matched event's associated structure.
+.IP \fIpredicate\fP 1i
+Specifies the procedure that is to be called to determine
+if the next event in the queue matches what you want.
+.SH DESCRIPTION
+The
+.ZN XIfEvent
+function completes only when the specified predicate
+procedure returns 
+.ZN True 
+for an event, 
+which indicates an event in the queue matches.
+.ZN XIfEvent
+flushes the output buffer if it blocks waiting for additional events.
+.ZN XIfEvent
+removes the matching event from the queue 
+and copies the structure into the client-supplied
+.ZN XEvent
+structure.
+.LP
+When the predicate procedure finds a match,
+.ZN XCheckIfEvent
+copies the matched event into the client-supplied
+.ZN XEvent
+structure and returns 
+.ZN True .
+(This event is removed from the queue.)
+If the predicate procedure finds no match,
+.ZN XCheckIfEvent
+returns
+.ZN False ,
+and the output buffer will have been flushed.
+All earlier events stored in the queue are not discarded.
+.LP
+The
+.ZN XPeekIfEvent
+function returns only when the specified predicate
+procedure returns 
+.ZN True
+for an event.
+After the predicate procedure finds a match,
+.ZN XPeekIfEvent
+copies the matched event into the client-supplied
+.ZN XEvent
+structure without removing the event from the queue.
+.ZN XPeekIfEvent
+flushes the output buffer if it blocks waiting for additional events.
+.LP
+Each of these functions requires you to pass a predicate procedure that 
+determines if an event matches what you want.
+Your predicate procedure must decide if the event is useful
+without calling any Xlib functions.
+If the predicate directly or indirectly causes the state of the event queue
+to change, the result is not defined.
+If Xlib has been initialized for threads, the predicate is called with
+the display locked and the result of a call by the predicate to any
+Xlib function that locks the display is not defined unless the caller
+has first called
+.ZN XLockDisplay .
+.LP
+The predicate procedure and its associated arguments are:
+.HP
+Bool (\^*\fIpredicate\fP\^)\^(\^Display *\fIdisplay\fP, XEvent *\fIevent\fP, XPointer \fIarg\fP\^)
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIevent\fP 1i
+Specifies the
+.ZN XEvent
+structure.
+.IP \fIarg\fP 1i
+Specifies the argument passed in from the 
+.ZN XIfEvent ,
+.ZN XCheckIfEvent ,
+or
+.ZN XPeekIfEvent 
+function.
+.LP
+The predicate procedure is called once for each
+event in the queue until it finds a match. 
+After finding a match, the predicate procedure must return 
+.ZN True .
+If it did not find a match, it must return
+.ZN False .
+.SH "SEE ALSO"
+XAnyEvent(__libmansuffix__),
+XNextEvent(__libmansuffix__),
+XPutBackEvent(__libmansuffix__)
+XSendEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XInitImage.man b/man/XInitImage.man
new file mode 100644 (file)
index 0000000..b58a946
--- /dev/null
@@ -0,0 +1,314 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XCreateImage __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XInitImage, XCreateImage, XGetPixel, XPutPixel, XSubImage, XAddPixel, XDestroyImage \- image utilities
+.SH SYNTAX
+.HP
+Status XInitImage\^(\^XImage *\fIimage\fP\^); 
+.HP
+XImage *XCreateImage\^(\^Display *\fIdisplay\fP\^, Visual *\fIvisual\fP\^,
+unsigned int \fIdepth\fP\^, int \fIformat\fP\^, int \fIoffset\fP\^, char
+*\fIdata\fP\^, unsigned int \fIwidth\fP\^, unsigned int \fIheight\fP\^, int
+\fIbitmap_pad\fP\^, int \fIbytes_per_line\fP\^); 
+.HP
+unsigned long XGetPixel\^(\^XImage *\fIximage\fP\^, int \fIx\fP\^, int
+\fIy\fP\^); 
+.HP
+int XPutPixel\^(\^XImage *\fIximage\fP\^, int \fIx\fP\^, int \fIy\fP\^,
+unsigned long \fIpixel\fP\^); 
+.HP
+XImage *XSubImage\^(\^XImage *\fIximage\fP\^, int \fIx\fP\^, int \fIy\fP\^,
+unsigned int \fIsubimage_width\fP\^, unsigned int \fIsubimage_height\fP\^); 
+.HP
+int XAddPixel\^(\^XImage *\fIximage\fP\^, long \fIvalue\fP\^); 
+.HP
+int XDestroyImage\^(\^XImage *\^\fIximage\fP\^); 
+.SH ARGUMENTS
+.IP \fIbitmap_pad\fP 1i
+Specifies the quantum of a scanline (8, 16, or 32).
+In other words, the start of one scanline is separated in client memory from 
+the start of the next scanline by an integer multiple of this many bits.  
+.IP \fIbytes_per_line\fP 1i
+Specifies the number of bytes in the client image between
+the start of one scanline and the start of the next.  
+.IP \fIdata\fP 1i
+Specifies the image data.
+.IP \fIdepth\fP 1i
+Specifies the depth of the image.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIformat\fP 1i
+Specifies the format for the image.
+You can pass
+.ZN XYBitmap ,
+.ZN XYPixmap ,
+or 
+.ZN ZPixmap .
+.IP \fIheight\fP 1i
+Specifies the height of the image, in pixels.
+.IP \fIoffset\fP 1i
+Specifies the number of pixels to ignore at the beginning of the scanline.
+.IP \fIpixel\fP 1i
+Specifies the new pixel value.
+.IP \fIsubimage_height\fP 1i
+Specifies the height of the new subimage, in pixels.
+.IP \fIsubimage_width\fP 1i
+Specifies the width of the new subimage, in pixels.
+.IP \fIvalue\fP 1i
+Specifies the constant value that is to be added.
+.IP \fIvisual\fP 1i
+Specifies the
+.ZN Visual
+structure.
+.IP \fIwidth\fP 1i
+Specifies the width of the image, in pixels.
+.IP \fIximage\fP 1i
+Specifies the image.
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates.
+.SH DESCRIPTION
+The
+.ZN XInitImage
+function initializes the internal image manipulation routines of an
+image structure, based on the values of the various structure members.
+All fields other than the manipulation routines must already be initialized.
+If the bytes_per_line member is zero,
+.ZN XInitImage
+will assume the image data is contiguous in memory and set the
+bytes_per_line member to an appropriate value based on the other
+members; otherwise, the value of bytes_per_line is not changed.
+All of the manipulation routines are initialized to functions
+that other Xlib image manipulation functions need to operate on the
+type of image specified by the rest of the structure.
+.LP
+This function must be called for any image constructed by the client
+before passing it to any other Xlib function.
+Image structures created or returned by Xlib do not need to be
+initialized in this fashion.
+.LP
+This function returns a nonzero status if initialization of the
+structure is successful.  It returns zero if it detected some error
+or inconsistency in the structure, in which case the image is not changed.
+.LP
+The
+.ZN XCreateImage
+function allocates the memory needed for an
+.ZN XImage
+structure for the
+specified display but does not allocate space for the image itself.
+Rather, it initializes the structure byte-order, bit-order, and bitmap-unit
+values from the display and returns a pointer to the 
+.ZN XImage 
+structure.
+The red, green, and blue mask values are defined for Z format images only
+and are derived from the 
+.ZN Visual 
+structure passed in.
+Other values also are passed in.
+The offset permits the rapid displaying of the image without requiring each 
+scanline to be shifted into position.
+If you pass a zero value in bytes_per_line,
+Xlib assumes that the scanlines are contiguous
+in memory and calculates the value of bytes_per_line itself.
+.LP
+Note that when the image is created using
+.ZN XCreateImage ,
+.ZN XGetImage ,
+or
+.ZN XSubImage ,
+the destroy procedure that the 
+.ZN XDestroyImage
+function calls frees both the image structure 
+and the data pointed to by the image structure.
+.LP
+The basic functions used to get a pixel, set a pixel, create a subimage,
+and add a constant value to an image are defined in the image object.
+The functions in this section are really macro invocations of the functions
+in the image object and are defined in
+.hN X11/Xutil.h .
+.LP
+The
+.ZN XGetPixel
+function returns the specified pixel from the named image.
+The pixel value is returned in normalized format (that is,
+the least significant byte of the long is the least significant byte
+of the pixel).
+The image must contain the x and y coordinates.
+.LP
+The
+.ZN XPutPixel
+function overwrites the pixel in the named image with the specified pixel value.
+The input pixel value must be in normalized format
+(that is, the least significant byte of the long is the least significant
+byte of the pixel).
+The image must contain the x and y coordinates.
+.LP
+The
+.ZN XSubImage
+function creates a new image that is a subsection of an existing one.
+It allocates the memory necessary for the new
+.ZN XImage
+structure
+and returns a pointer to the new image.
+The data is copied from the source image,
+and the image must contain the rectangle defined by x, y, subimage_width,
+and subimage_height.
+.LP
+The
+.ZN XAddPixel
+function adds a constant value to every pixel in an image.
+It is useful when you have a base pixel value from allocating
+color resources and need to manipulate the image to that form.
+.LP
+The
+.ZN XDestroyImage
+function deallocates the memory associated with the
+.ZN XImage
+structure.
+.SH "SEE ALSO"
+XPutImage(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XInitThreads.man b/man/XInitThreads.man
new file mode 100644 (file)
index 0000000..51db3f5
--- /dev/null
@@ -0,0 +1,203 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XInitThreads __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XInitThreads, XLockDisplay, XUnlockDisplay \- multi-threading support
+.SH SYNTAX
+.HP
+Status XInitThreads\^(void);
+.HP
+void XLockDisplay\^(\^Display *\fIdisplay\fP\^); 
+.HP
+void XUnlockDisplay\^(\^Display *\fIdisplay\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.SH DESCRIPTION
+The
+.ZN XInitThreads
+function initializes Xlib support for concurrent threads.
+This function must be the first Xlib function a
+multi-threaded program calls, and it must complete
+before any other Xlib call is made.
+This function returns a nonzero status if initialization was
+successful; otherwise, it returns zero.
+On systems that do not support threads, this function always returns zero.
+.LP
+It is only necessary to call this function if multiple threads
+might use Xlib concurrently.  If all calls to Xlib functions
+are protected by some other access mechanism (for example,
+a mutual exclusion lock in a toolkit or through explicit client
+programming), Xlib thread initialization is not required.
+It is recommended that single-threaded programs not call this function.
+
+.LP
+The
+.ZN XLockDisplay
+function locks out all other threads from using the specified display.
+Other threads attempting to use the display will block until
+the display is unlocked by this thread.
+Nested calls to
+.ZN XLockDisplay
+work correctly; the display will not actually be unlocked until
+.ZN XUnlockDisplay
+has been called the same number of times as
+.ZN XLockDisplay .
+This function has no effect unless Xlib was successfully initialized
+for threads using
+.ZN XInitThreads .
+.LP
+The
+.ZN XUnlockDisplay
+function allows other threads to use the specified display again.
+Any threads that have blocked on the display are allowed to continue.
+Nested locking works correctly; if
+.ZN XLockDisplay
+has been called multiple times by a thread, then
+.ZN XUnlockDisplay
+must be called an equal number of times before the display is
+actually unlocked.
+This function has no effect unless Xlib was successfully initialized
+for threads using
+.ZN XInitThreads .
+.SH "SEE ALSO"
+\fI\*(xL\fP
diff --git a/man/XInsertModifiermapEntry.man b/man/XInsertModifiermapEntry.man
new file mode 100644 (file)
index 0000000..cc772af
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XChangeKeyboardMapping.__libmansuffix__
diff --git a/man/XInstallColormap.man b/man/XInstallColormap.man
new file mode 100644 (file)
index 0000000..15a1ce5
--- /dev/null
@@ -0,0 +1,246 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XInstallColormap __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XInstallColormap, XUninstallColormap, XListInstalledColormaps \- control colormaps
+.SH SYNTAX
+.HP
+int XInstallColormap\^(\^Display *\fIdisplay\fP\^, Colormap \fIcolormap\fP\^);
+.HP
+int XUninstallColormap\^(\^Display *\fIdisplay\fP\^, Colormap
+\fIcolormap\fP\^); 
+.HP
+Colormap *XListInstalledColormaps\^(\^Display *\fIdisplay\fP\^, Window
+\fIw\fP\^, int *\fInum_return\fP\^); 
+.SH ARGUMENTS
+.IP \fIcolormap\fP 1i
+Specifies the colormap.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fInum_return\fP 1i
+Returns the number of currently installed colormaps.
+.ds Wi that determines the screen
+.IP \fIw\fP 1i
+Specifies the window \*(Wi.
+.SH DESCRIPTION
+The
+.ZN XInstallColormap
+function installs the specified colormap for its associated screen.
+All windows associated with this colormap immediately display with
+true colors.
+You associated the windows with this colormap when you created them by calling
+.ZN XCreateWindow ,
+.ZN XCreateSimpleWindow ,
+.ZN XChangeWindowAttributes ,
+or
+.ZN XSetWindowColormap .
+.LP
+If the specified colormap is not already an installed colormap, 
+the X server generates a
+.ZN ColormapNotify
+event on each window that has that colormap.
+In addition, for every other colormap that is installed as 
+a result of a call to
+.ZN XInstallColormap ,
+the X server generates a
+.ZN ColormapNotify
+event on each window that has that colormap.
+.LP
+.ZN XInstallColormap
+can generate a
+.ZN BadColor 
+error.
+.LP
+The
+.ZN XUninstallColormap
+function removes the specified colormap from the required
+list for its screen.
+As a result,
+the specified colormap might be uninstalled, 
+and the X server might implicitly install or uninstall additional colormaps.
+Which colormaps get installed or uninstalled is server dependent
+except that the required list must remain installed.
+.LP
+If the specified colormap becomes uninstalled, 
+the X server generates a
+.ZN ColormapNotify
+event on each window that has that colormap.
+In addition, for every other colormap that is installed or uninstalled as a 
+result of a call to 
+.ZN XUninstallColormap ,
+the X server generates a
+.ZN ColormapNotify
+event on each window that has that colormap.
+.LP
+.ZN XUninstallColormap
+can generate a
+.ZN BadColor 
+error.
+.LP
+The
+.ZN XListInstalledColormaps
+function returns a list of the currently installed colormaps for the screen 
+of the specified window.
+The order of the colormaps in the list is not significant
+and is no explicit indication of the required list.
+When the allocated list is no longer needed,
+free it by using
+.ZN XFree .
+.LP
+.ZN XListInstalledColormaps
+can generate a
+.ZN BadWindow 
+error.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadColor
+A value for a Colormap argument does not name a defined Colormap.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XChangeWindowAttributes(__libmansuffix__),
+XCreateColormap(__libmansuffix__),
+XCreateWindow(__libmansuffix__),
+XFree(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XInternAtom.man b/man/XInternAtom.man
new file mode 100644 (file)
index 0000000..237ed91
--- /dev/null
@@ -0,0 +1,279 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XInternAtom __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XInternAtom, XInternAtoms, XGetAtomName, XGetAtomNames \- create or return atom names
+.SH SYNTAX
+.HP
+Atom XInternAtom\^(\^Display *\fIdisplay\fP\^, char *\fIatom_name\fP\^, Bool
+\fIonly_if_exists\fP\^); 
+.HP
+Status XInternAtoms\^(\^Display *\fIdisplay\fP\^, char **\fInames\fP\^, int
+\fIcount\fP\^, Bool \fIonly_if_exists\fP\^, Atom *\fIatoms_return\fP\^); 
+.HP
+char *XGetAtomName\^(\^Display *\fIdisplay\fP\^, Atom \fIatom\fP\^); 
+.HP
+Status XGetAtomNames\^(\^Display *\fIdisplay\fP\^, Atom *\fIatoms\fP\^, int
+\fIcount\fP\^, char **\fInames_return\fP\^); 
+.SH ARGUMENTS
+.IP \fIatom\fP 1i
+Specifies the atom for the property name you want returned.
+.IP \fIatoms\fP 1i
+Specifies the array of atoms.
+.IP \fIatom_name\fP 1i
+Specifies the name associated with the atom you want returned.
+.IP \fIatoms_return\fP 1i
+Returns the atoms.
+.ds Cn atom names in the array
+.IP \fIcount\fP 1i
+Specifies the number of \*(Cn.
+.ds Cn atoms in the array
+.IP \fIcount\fP 1i
+Specifies the number of \*(Cn.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fInames\fP 1i
+Specifies the array of atom names.
+.IP \fInames_return\fP 1i
+Returns the atom names.
+.IP \fIonly_if_exists\fP 1i
+Specifies a Boolean value that indicates whether the atom must be created.
+.SH DESCRIPTION
+The
+.ZN XInternAtom
+function returns the atom identifier associated with the specified atom_name
+string.
+If only_if_exists is 
+.ZN False ,
+the atom is created if it does not exist.
+Therefore,
+.ZN XInternAtom
+can return
+.ZN None .
+If the atom name is not in the Host Portable Character Encoding, 
+the result is implementation-dependent.
+Uppercase and lowercase matter;
+the strings ``thing'', ``Thing'', and ``thinG'' 
+all designate different atoms.  
+The atom will remain defined even after the client's connection closes.
+It will become undefined only when the last connection to
+the X server closes.
+.LP
+.ZN XInternAtom
+can generate
+.ZN BadAlloc 
+and
+.ZN BadValue 
+errors.
+.LP
+The
+.ZN XInternAtoms
+function returns the atom identifiers associated with the specified names.
+The atoms are stored in the atoms_return array supplied by the caller.
+Calling this function is equivalent to calling
+.ZN XInternAtom
+for each of the names in turn with the specified value of only_if_exists,
+but this function minimizes the number of round-trip protocol exchanges
+between the client and the X server.
+.LP
+This function returns a nonzero status if atoms are returned for
+all of the names;
+otherwise, it returns zero.
+.LP
+.ZN XInternAtoms
+can generate
+.ZN BadAlloc 
+and
+.ZN BadValue 
+errors.
+.LP
+The
+.ZN XGetAtomName
+function returns the name associated with the specified atom.
+If the data returned by the server is in the Latin Portable Character Encoding,
+then the returned string is in the Host Portable Character Encoding.
+Otherwise, the result is implementation-dependent.
+To free the resulting string,
+call
+.ZN XFree .
+.LP
+.ZN XGetAtomName
+can generate a
+.ZN BadAtom 
+error.
+.LP
+The
+.ZN XGetAtomNames
+function returns the names associated with the specified atoms.
+The names are stored in the names_return array supplied by the caller.
+Calling this function is equivalent to calling
+.ZN XGetAtomName
+for each of the atoms in turn,
+but this function minimizes the number of round-trip protocol exchanges
+between the client and the X server.
+.LP
+This function returns a nonzero status if names are returned for
+all of the atoms;
+otherwise, it returns zero.
+.LP
+.ZN XGetAtomNames
+can generate a
+.ZN BadAtom 
+error.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadAtom
+A value for an Atom argument does not name a defined Atom.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.SH "SEE ALSO"
+XFree(__libmansuffix__),
+XGetWindowProperty(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XInternAtoms.man b/man/XInternAtoms.man
new file mode 100644 (file)
index 0000000..7d6a69b
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XInternAtom.__libmansuffix__
diff --git a/man/XInternalConnectionNumbers.man b/man/XInternalConnectionNumbers.man
new file mode 100644 (file)
index 0000000..c3e5bf0
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAddConnectionWatch.__libmansuffix__
diff --git a/man/XIntersectRegion.man b/man/XIntersectRegion.man
new file mode 100644 (file)
index 0000000..8d96803
--- /dev/null
@@ -0,0 +1,225 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XIntersectRegion __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XIntersectRegion, XUnionRegion, XUnionRectWithRegion, XSubtractRegion, XXorRegion, XOffsetRegion, XShrinkRegion \- region arithmetic
+.SH SYNTAX
+.HP
+int XIntersectRegion\^(\^Region \fIsra\fP\^, Region \fIsrb\fP\^, Region
+\fIdr_return\fP\^); 
+.HP
+int XUnionRegion\^(\^Region \fIsra\fP\^, Region \fIsrb\fP\^, Region
+\fIdr_return\fP\^); 
+.HP
+int XUnionRectWithRegion\^(\^XRectangle *\fIrectangle\fP\^, Region
+\fIsrc_region\fP\^, Region \fIdest_region_return\fP\^); 
+.HP
+int XSubtractRegion\^(\^Region \fIsra\fP\^, Region \fIsrb\fP\^, Region
+\fIdr_return\fP\^); 
+.HP
+int XXorRegion\^(\^Region \fIsra\fP\^, Region \fIsrb\fP\^, Region
+\fIdr_return\fP\^); 
+.HP
+int XOffsetRegion\^(\^Region \fIr\fP\^, int \fIdx\fP\^, int \fIdy\fP\^); 
+.HP
+int XShrinkRegion\^(\^Region \fIr\fP\^, int \fIdx\fP\^, int \fIdy\fP\^); 
+.SH ARGUMENTS
+.IP \fIdest_region_return\fP 1i
+Returns the destination region.
+.IP \fIdr_return\fP 1i
+Returns the result of the computation.
+ds Dy move or shrink
+.IP \fIdx\fP 1i
+.br
+.ns
+.IP \fIdy\fP 1i
+Specify the x and y coordinates,
+which define the amount you want to \*(Dy the specified region.
+.IP \fIr\fP 1i
+Specifies the region.
+.IP \fIrectangle\fP 1i
+Specifies the rectangle.
+.IP \fIsra\fP 1i
+.br
+.ns
+.IP \fIsrb\fP 1i
+Specify the two regions with which you want to perform the computation.
+.IP \fIsrc_region\fP 1i
+Specifies the source region to be used.
+.SH DESCRIPTION
+The
+.ZN XIntersectRegion
+function computes the intersection of two regions.
+.LP
+The
+.ZN XUnionRegion
+function computes the union of two regions.
+.LP
+The
+.ZN XUnionRectWithRegion
+function updates the destination region from a union of the specified rectangle
+and the specified source region.
+.LP
+The
+.ZN XSubtractRegion
+function subtracts srb from sra and stores the results in dr_return.
+.LP
+The
+.ZN XXorRegion
+function calculates the difference between the union and intersection
+of two regions.
+.LP
+The
+.ZN XOffsetRegion
+function moves the specified region by a specified amount.
+.LP
+The
+.ZN XShrinkRegion
+function reduces the specified region by a specified amount.
+Positive values shrink the size of the region,
+and negative values expand the region.
+.SH "SEE ALSO"
+XCreateRegion(__libmansuffix__),
+XDrawRectangle(__libmansuffix__),
+XEmptyRegion(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XKeyEvent.man b/man/XKeyEvent.man
new file mode 100644 (file)
index 0000000..07c1ecb
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XButtonEvent.__libmansuffix__
diff --git a/man/XKeyboardControl.man b/man/XKeyboardControl.man
new file mode 100644 (file)
index 0000000..4434d01
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XChangeKeyboardControl.__libmansuffix__
diff --git a/man/XKeycodeToKeysym.man b/man/XKeycodeToKeysym.man
new file mode 100644 (file)
index 0000000..32bc404
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XStringToKeysym.__libmansuffix__
diff --git a/man/XKeymapEvent.man b/man/XKeymapEvent.man
new file mode 100644 (file)
index 0000000..2bd9346
--- /dev/null
@@ -0,0 +1,220 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XKeymapEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XKeymapEvent \- KeymapNotify event structure
+.SH STRUCTURES
+The structure for
+.ZN KeymapNotify  
+events contains:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+/\&* generated on EnterWindow and FocusIn when KeymapState selected */
+typedef struct {
+       int type;       /\&* KeymapNotify */
+       unsigned long serial;   /\&* # of last request processed by server */
+       Bool send_event;        /\&* true if this came from a SendEvent request */
+       Display *display;       /\&* Display the event was read from */
+       Window window;
+       char key_vector[32];
+} XKeymapEvent;        
+.De
+.LP
+When you receive this event,
+the structure members are set as follows.
+.LP
+The type member is set to the event type constant name that uniquely identifies
+it.
+For example, when the X server reports a
+.ZN GraphicsExpose
+event to a client application, it sends an
+.ZN XGraphicsExposeEvent
+structure with the type member set to
+.ZN GraphicsExpose .
+The display member is set to a pointer to the display the event was read on.
+The send_event member is set to
+.ZN True
+if the event came from a
+.ZN SendEvent
+protocol request.
+The serial member is set from the serial number reported in the protocol
+but expanded from the 16-bit least-significant bits to a full 32-bit value.
+The window member is set to the window that is most useful to toolkit
+dispatchers.
+.LP
+The window member is not used but is present to aid some toolkits.
+The key_vector member is set to the bit vector of the keyboard.
+Each bit set to 1 indicates that the corresponding key 
+is currently pressed.
+The vector is represented as 32 bytes.
+Byte N (from 0) contains the bits for keys 8N to 8N + 7 
+with the least significant bit in the byte representing key 8N.
+.SH "SEE ALSO"
+XAnyEvent(__libmansuffix__),
+XButtonEvent(__libmansuffix__),
+XCreateWindowEvent(__libmansuffix__),
+XCirculateEvent(__libmansuffix__),
+XCirculateRequestEvent(__libmansuffix__),
+XColormapEvent(__libmansuffix__),
+XConfigureEvent(__libmansuffix__),
+XConfigureRequestEvent(__libmansuffix__),
+XCrossingEvent(__libmansuffix__),
+XDestroyWindowEvent(__libmansuffix__),
+XErrorEvent(__libmansuffix__),
+XExposeEvent(__libmansuffix__),
+XFocusChangeEvent(__libmansuffix__),
+XGraphicsExposeEvent(__libmansuffix__),
+XGravityEvent(__libmansuffix__),
+XMapEvent(__libmansuffix__),
+XMapRequestEvent(__libmansuffix__),
+XPropertyEvent(__libmansuffix__),
+XReparentEvent(__libmansuffix__),
+XResizeRequestEvent(__libmansuffix__),
+XSelectionClearEvent(__libmansuffix__),
+XSelectionEvent(__libmansuffix__),
+XSelectionRequestEvent(__libmansuffix__),
+XUnmapEvent(__libmansuffix__),
+XVisibilityEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XKeysymToKeycode.man b/man/XKeysymToKeycode.man
new file mode 100644 (file)
index 0000000..32bc404
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XStringToKeysym.__libmansuffix__
diff --git a/man/XKeysymToString.man b/man/XKeysymToString.man
new file mode 100644 (file)
index 0000000..32bc404
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XStringToKeysym.__libmansuffix__
diff --git a/man/XKillClient.man b/man/XKillClient.man
new file mode 100644 (file)
index 0000000..1c6c793
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetCloseDownMode.__libmansuffix__
diff --git a/man/XListDepths.man b/man/XListDepths.man
new file mode 100644 (file)
index 0000000..7949dfa
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/AllPlanes.__libmansuffix__
diff --git a/man/XListExtensions.man b/man/XListExtensions.man
new file mode 100644 (file)
index 0000000..95e51b6
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XQueryExtension.__libmansuffix__
diff --git a/man/XListFonts.man b/man/XListFonts.man
new file mode 100644 (file)
index 0000000..4077220
--- /dev/null
@@ -0,0 +1,265 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XListFonts __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XListFonts, XFreeFontNames, XListFontsWithInfo, XFreeFontInfo \- obtain or free font names and information
+.SH SYNTAX
+.HP
+char **XListFonts\^(\^Display *\^\fIdisplay\fP\^, char *\^\fIpattern\fP\^, int
+\fImaxnames\fP\^, int *\^\fIactual_count_return\fP\^); 
+.HP
+int XFreeFontNames\^(\^char *\fIlist\fP\^[\^]\^); 
+.HP
+char **XListFontsWithInfo\^(\^Display *\fIdisplay\fP\^, char *\fIpattern\fP\^,
+int \fImaxnames\fP\^, int *\fIcount_return\fP\^, XFontStruct
+**\fIinfo_return\fP\^); 
+.HP
+int XFreeFontInfo(\^char **\fInames\fP\^, XFontStruct *\fIfree_info\fP, int
+\fIactual_count\fP\^); 
+.SH ARGUMENTS
+.IP \fIactual_count\fP 1i
+Specifies the actual number of font names.
+
+.IP \fIactual_count_return\fP 1i
+Returns the actual number of font names.
+.IP \fIcount_return\fP 1i
+Returns the actual number of matched font names.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIinfo_return\fP 1i
+Returns the font information.
+.IP \fIfree_info\fP 1i
+Specifies the font information.
+
+.IP \fIlist\fP 1i
+Specifies the array of strings you want to free.
+.IP \fImaxnames\fP 1i
+Specifies the maximum number of names to be returned.
+.IP \fInames\fP 1i
+Specifies the list of font names.
+
+.IP \fIpattern\fP 1i
+Specifies the null-terminated pattern string that can contain wildcard 
+characters.
+.SH DESCRIPTION
+The
+.ZN XListFonts
+function returns an array of available font names 
+(as controlled by the font search path; see
+.ZN XSetFontPath )
+that match the string you passed to the pattern argument.
+The pattern string can contain any characters,
+but each asterisk (*) is a wildcard for any number of characters,
+and each question mark (?) is a wildcard for a single character.
+If the pattern string is not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+Use of uppercase or lowercase does not matter.
+Each returned string is null-terminated.
+If the data returned by the server is in the Latin Portable Character Encoding,
+then the returned strings are in the Host Portable Character Encoding.
+Otherwise, the result is implementation-dependent.
+If there are no matching font names,
+.ZN XListFonts
+returns NULL.
+The client should call
+.ZN XFreeFontNames
+when finished with the result to free the memory.
+.LP
+The
+.ZN XFreeFontNames
+function frees the array and strings returned by
+.ZN XListFonts 
+or
+.ZN XListFontsWithInfo .
+.LP
+The
+.ZN XListFontsWithInfo
+function returns a list of font names that match the specified pattern and their
+associated font information.
+The list of names is limited to size specified by maxnames.
+The information returned for each font is identical to what
+.ZN XLoadQueryFont
+would return except that the per-character metrics are not returned.
+The pattern string can contain any characters,
+but each asterisk (*) is a wildcard for any number of characters,
+and each question mark (?) is a wildcard for a single character.
+If the pattern string is not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+Use of uppercase or lowercase does not matter.
+Each returned string is null-terminated.
+If the data returned by the server is in the Latin Portable Character Encoding,
+then the returned strings are in the Host Portable Character Encoding.
+Otherwise, the result is implementation-dependent.
+If there are no matching font names,
+.ZN XListFontsWithInfo
+returns NULL.
+.LP
+To free only the allocated name array,
+the client should call
+.ZN XFreeFontNames .
+To free both the name array and the font information array
+or to free just the font information array,
+the client should call
+.ZN XFreeFontInfo .
+.LP
+The
+.ZN XFreeFontInfo
+function frees a font structure or an array of font structures
+and optionally an array of font names.
+If NULL is passed for names, no font names are freed.
+If a font structure for an open font (returned by
+.ZN XLoadQueryFont )
+is passed, the structure is freed,
+but the font is not closed; use
+.ZN XUnloadFont
+to close the font.
+.LP
+Note that
+.ZN XListFontsWithInfo
+is not thread-safe. If other threads make X requests on the same
+.ZN Display ,
+then this function's behavior is undefined.
+.SH "SEE ALSO"
+XLoadFont(__libmansuffix__),
+XSetFontPath(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XListFontsWithInfo.man b/man/XListFontsWithInfo.man
new file mode 100644 (file)
index 0000000..2df58d0
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XListFonts.__libmansuffix__
diff --git a/man/XListHosts.man b/man/XListHosts.man
new file mode 100644 (file)
index 0000000..13e833b
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAddHost.__libmansuffix__
diff --git a/man/XListInstalledColormaps.man b/man/XListInstalledColormaps.man
new file mode 100644 (file)
index 0000000..7f0ced3
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XInstallColormap.__libmansuffix__
diff --git a/man/XListPixmapFormats.man b/man/XListPixmapFormats.man
new file mode 100644 (file)
index 0000000..4e27094
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/ImageByteOrder.__libmansuffix__
diff --git a/man/XListProperties.man b/man/XListProperties.man
new file mode 100644 (file)
index 0000000..ce26c3d
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XGetWindowProperty.__libmansuffix__
diff --git a/man/XLoadFont.man b/man/XLoadFont.man
new file mode 100644 (file)
index 0000000..b85fcb2
--- /dev/null
@@ -0,0 +1,539 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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
+.de EX
+.sp
+.nf
+.ft CW
+..
+.de EE
+.ft R
+.fi
+.sp
+..
+.TH XLoadFont __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XLoadFont, XQueryFont, XLoadQueryFont, XFreeFont, XGetFontProperty, XUnloadFont, XCharStruct, XFontProp, XChar2b, XFontStruct \- load or unload fonts and font metric structures
+.SH SYNTAX
+.HP
+Font XLoadFont\^(\^Display *\fIdisplay\fP\^, char *\fIname\fP\^); 
+.HP
+XFontStruct *XQueryFont\^(\^Display *\fIdisplay\fP\^, XID \fIfont_ID\fP\^); 
+.HP
+XFontStruct *XLoadQueryFont\^(\^Display *\fIdisplay\fP\^, char
+*\fIname\fP\^); 
+.HP
+int XFreeFont\^(\^Display *\fIdisplay\fP\^, XFontStruct *\fIfont_struct\fP\^);
+.HP
+Bool XGetFontProperty\^(\^XFontStruct *\fIfont_struct\fP\^, Atom \fIatom\fP\^,
+unsigned long *\fIvalue_return\fP\^); 
+.HP
+int XUnloadFont\^(\^Display *\fIdisplay\fP\^, Font \fIfont\fP\^); 
+.SH ARGUMENTS
+.IP \fIatom\fP 1i
+Specifies the atom for the property name you want returned.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIfont\fP 1i
+Specifies the font.
+.IP \fIfont_ID\fP 1i
+Specifies the font ID or the 
+.ZN GContext
+ID.
+.IP \fIfont_struct\fP 1i
+Specifies the storage associated with the font.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fIname\fP 1i
+Specifies the name of the font,
+which is a null-terminated string.
+.IP \fIvalue_return\fP 1i
+Returns the value of the font property.
+.SH DESCRIPTION
+The
+.ZN XLoadFont
+function loads the specified font and returns its associated font ID.
+If the font name is not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+Use of uppercase or lowercase does not matter.
+When the characters ``?'' and ``*'' are used in a font name, a
+pattern match is performed and any matching font is used.
+In the pattern, 
+the ``?'' character will match any single character, 
+and the ``*'' character will match any number of characters.
+A structured format for font names is specified in the X Consortium standard 
+\fIX Logical Font Description Conventions\fP.
+If 
+.ZN XLoadFont
+was unsuccessful at loading the specified font, 
+a 
+.ZN BadName 
+error results.
+Fonts are not associated with a particular screen 
+and can be stored as a component
+of any GC.
+When the font is no longer needed, call 
+.ZN XUnloadFont .
+.LP
+.ZN XLoadFont
+can generate
+.ZN BadAlloc 
+and
+.ZN BadName 
+errors.
+.LP
+The
+.ZN XQueryFont
+function returns a pointer to the
+.ZN XFontStruct
+structure, which contains information associated with the font.
+You can query a font or the font stored in a GC.
+The font ID stored in the 
+.ZN XFontStruct
+structure will be the 
+.ZN GContext 
+ID, and you need to be careful when using this ID in other functions
+(see
+.ZN XGContextFromGC ).
+If the font does not exist,
+.ZN XQueryFont
+returns NULL.
+To free this data, use
+.ZN XFreeFontInfo .
+.LP
+.ZN XLoadQueryFont
+can generate a
+.ZN BadAlloc 
+error.
+.LP
+The
+.ZN XLoadQueryFont
+function provides the most common way for accessing a font.
+.ZN XLoadQueryFont
+both opens (loads) the specified font and returns a pointer to the
+appropriate
+.ZN XFontStruct
+structure.
+If the font name is not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+If the font does not exist,
+.ZN XLoadQueryFont
+returns NULL.
+.LP
+The
+.ZN XFreeFont
+function deletes the association between the font resource ID and the specified 
+font and frees the
+.ZN XFontStruct
+structure.
+The font itself will be freed when no other resource references it.
+The data and the font should not be referenced again.
+.LP
+.ZN XFreeFont
+can generate a
+.ZN BadFont 
+error.
+.LP
+Given the atom for that property,
+the
+.ZN XGetFontProperty
+function returns the value of the specified font property. 
+.ZN XGetFontProperty
+also returns 
+.ZN False
+if the property was not defined or 
+.ZN True
+if it was defined.
+A set of predefined atoms exists for font properties,
+which can be found in
+.hN X11/Xatom.h .
+This set contains the standard properties associated with
+a font.
+Although it is not guaranteed,
+it is likely that the predefined font properties will be present.
+.LP
+The
+.ZN XUnloadFont
+function deletes the association between the font resource ID and the specified font.
+The font itself will be freed when no other resource references it.
+The font should not be referenced again.
+.LP
+.ZN XUnloadFont
+can generate a
+.ZN BadFont 
+error.
+.SH STRUCTURES
+The
+.ZN XFontStruct
+structure contains all of the information for the font
+and consists of the font-specific information as well as
+a pointer to an array of
+.ZN XCharStruct
+structures for the
+characters contained in the font.
+The
+.ZN XFontStruct ,
+.ZN XFontProp ,
+and
+.ZN XCharStruct
+structures contain:
+.LP
+.IN "XCharStruct" "" "@DEF@"
+.EX
+typedef struct {
+       short lbearing; /\&* origin to left edge of raster */
+       short rbearing; /\&* origin to right edge of raster */
+       short width;    /\&* advance to next char's origin */
+       short ascent;   /\&* baseline to top edge of raster */
+       short descent;  /\&* baseline to bottom edge of raster */
+       unsigned short attributes;      /\&* per char flags (not predefined) */
+} XCharStruct;
+.EE
+.LP
+.IN "XFontProp" "" "@DEF@"
+.EX
+typedef struct {
+       Atom    name;
+       unsigned long card32;
+} XFontProp;
+.EE
+.LP
+.IN "XChar2b" "" "@DEF@"
+.EX
+typedef struct {       /\&* normal 16 bit characters are two bytes */
+    unsigned char byte1;
+    unsigned char byte2;
+} XChar2b;
+.EE
+.LP
+.IN "XFontStruct" "" "@DEF@"
+.EX
+typedef struct {
+       XExtData *ext_data;     /\&* hook for extension to hang data */
+       Font fid;       /\&* Font id for this font */
+       unsigned direction;     /\&* hint about the direction font is painted */
+       unsigned min_char_or_byte2;     /\&* first character */
+       unsigned max_char_or_byte2;     /\&* last character */
+       unsigned min_byte1;     /\&* first row that exists */
+       unsigned max_byte1;     /\&* last row that exists */
+       Bool all_chars_exist;   /\&* flag if all characters have nonzero size */
+       unsigned default_char;  /\&* char to print for undefined character */
+       int n_properties;       /\&* how many properties there are */
+       XFontProp *properties;  /\&* pointer to array of additional properties */
+       XCharStruct min_bounds; /\&* minimum bounds over all existing char */
+       XCharStruct max_bounds; /\&* maximum bounds over all existing char */
+       XCharStruct *per_char;  /\&* first_char to last_char information */
+       int ascent;     /\&* logical extent above baseline for spacing */
+       int descent;    /\&* logical decent below baseline for spacing */
+} XFontStruct;
+.EE
+.LP
+X supports single byte/character, two bytes/character matrix,
+and 16-bit character text operations.
+Note that any of these forms can be used with a font, but a
+single byte/character text request can only specify a single byte
+(that is, the first row of a 2-byte font).
+You should view 2-byte fonts as a two-dimensional matrix of defined
+characters: byte1 specifies the range of defined rows and
+byte2 defines the range of defined columns of the font.
+Single byte/character fonts have one row defined, and the byte2 range
+specified in the structure defines a range of characters.
+.LP
+The bounding box of a character is defined by the 
+.ZN XCharStruct 
+of that character.
+When characters are absent from a font,
+the default_char is used.
+When fonts have all characters of the same size,
+only the information in the
+.ZN XFontStruct
+min and max bounds are used.
+.LP
+The members of the 
+.ZN XFontStruct 
+have the following semantics:
+.IP \(bu 5
+The direction member can be either 
+.ZN FontLeftToRight 
+or 
+.ZN FontRightToLeft . 
+It is just a hint as to whether most 
+.ZN XCharStruct 
+elements 
+have a positive 
+.Pn ( FontLeftToRight ) 
+or a negative 
+.Pn ( FontRightToLeft )
+character width 
+metric.
+The core protocol defines no support for vertical text.
+.IP \(bu 5
+If the min_byte1 and max_byte1 members are both zero, min_char_or_byte2
+specifies the linear character index corresponding to the first element
+of the per_char array, and max_char_or_byte2 specifies the linear character
+index of the last element.
+.IP
+If either min_byte1 or max_byte1 are nonzero, both
+min_char_or_byte2 and max_char_or_byte2 are less than 256, 
+and the 2-byte character index values corresponding to the
+per_char array element N (counting from 0) are:
+.IP
+.EX
+       byte1 = N/D + min_byte1
+       byte2 = N\\D + min_char_or_byte2
+.EE
+where:
+.EX
+        D = max_char_or_byte2 \- min_char_or_byte2 + 1
+        / = integer division
+        \e\e = integer modulus
+.EE
+.IP \(bu 5
+If the per_char pointer is NULL, 
+all glyphs between the first and last character indexes
+inclusive have the same information,
+as given by both min_bounds and max_bounds.
+.IP \(bu 5
+If all_chars_exist is 
+.ZN True ,
+all characters in the per_char array have nonzero bounding boxes.
+.IP \(bu 5
+The default_char member specifies the character that will be used when an
+undefined or nonexistent character is printed.  
+The default_char is a 16-bit character (not a 2-byte character).
+For a font using 2-byte matrix format, 
+the default_char has byte1 in the most-significant byte
+and byte2 in the least significant byte.
+If the default_char itself specifies an undefined or nonexistent character, 
+no printing is performed for an undefined or nonexistent character.
+.IP \(bu 5
+The min_bounds and max_bounds members contain the most extreme values of
+each individual 
+.ZN XCharStruct 
+component over all elements of this array
+(and ignore nonexistent characters).
+The bounding box of the font (the smallest
+rectangle enclosing the shape obtained by superimposing all of the
+characters at the same origin [x,y]) has its upper-left coordinate at:
+.Ds
+       [x + min_bounds.lbearing, y \- max_bounds.ascent]
+.De
+.IP
+Its width is:
+.Ds
+       max_bounds.rbearing \- min_bounds.lbearing
+.De
+.IP
+Its height is:
+.Ds
+       max_bounds.ascent + max_bounds.descent
+.De
+.IP \(bu 5
+The ascent member is the logical extent of the font above the baseline that is
+used for determining line spacing.
+Specific characters may extend beyond
+this.
+.IP \(bu 5
+The descent member is the logical extent of the font at or below the
+baseline that is used for determining line spacing.
+Specific characters may extend beyond this.
+.IP \(bu 5
+If the baseline is at Y-coordinate y,
+the logical extent of the font is inclusive between the Y-coordinate 
+values (y \- font.ascent) and (y + font.descent \- 1).
+Typically,
+the minimum interline spacing between rows of text is given
+by ascent + descent.
+.LP
+For a character origin at [x,y],
+the bounding box of a character (that is, 
+the smallest rectangle that encloses the character's shape)
+described in terms of 
+.ZN XCharStruct 
+components is a rectangle with its upper-left corner at:
+.LP
+.Ds
+[x + lbearing, y \- ascent]
+.De
+.LP
+Its width is:
+.LP
+.Ds
+rbearing \- lbearing
+.De
+.LP
+Its height is:
+.LP
+.Ds
+ascent + descent
+.De
+.LP
+The origin for the next character is defined to be:
+.LP
+.Ds
+[x + width, y]
+.De
+.LP
+The lbearing member defines the extent of the left edge of the character ink
+from the origin.
+The rbearing member defines the extent of the right edge of the character ink
+from the origin.
+The ascent member defines the extent of the top edge of the character ink
+from the origin.
+The descent member defines the extent of the bottom edge of the character ink
+from the origin.
+The width member defines the logical width of the character.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadFont
+A value for a Font or GContext argument does not name a defined Font.
+.TP 1i
+.ZN BadName
+A font or color of the specified name does not exist.
+.SH "SEE ALSO"
+XCreateGC(__libmansuffix__),
+XListFonts(__libmansuffix__),
+XSetFontPath(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XLoadQueryFont.man b/man/XLoadQueryFont.man
new file mode 100644 (file)
index 0000000..ca6fa1f
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XLoadFont.__libmansuffix__
diff --git a/man/XLocaleOfFontSet.man b/man/XLocaleOfFontSet.man
new file mode 100644 (file)
index 0000000..ba0cd76
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XFontsOfFontSet.__libmansuffix__
diff --git a/man/XLocaleOfIM.man b/man/XLocaleOfIM.man
new file mode 100644 (file)
index 0000000..6365409
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XOpenIM.__libmansuffix__
diff --git a/man/XLocaleOfOM.man b/man/XLocaleOfOM.man
new file mode 100644 (file)
index 0000000..3b4acf5
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XOpenOM.__libmansuffix__
diff --git a/man/XLockDisplay.man b/man/XLockDisplay.man
new file mode 100644 (file)
index 0000000..24cf8b4
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XInitThreads.__libmansuffix__
diff --git a/man/XLookupColor.man b/man/XLookupColor.man
new file mode 100644 (file)
index 0000000..f0c2a90
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XQueryColor.__libmansuffix__
diff --git a/man/XLookupKeysym.man b/man/XLookupKeysym.man
new file mode 100644 (file)
index 0000000..bdbfe31
--- /dev/null
@@ -0,0 +1,277 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XLookupKeysym __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XLookupKeysym, XRefreshKeyboardMapping, XLookupString, XRebindKeysym \- handle keyboard input events in Latin-1
+.SH SYNTAX
+.HP
+KeySym XLookupKeysym(\^XKeyEvent *\fIkey_event\fP\^, int \fIindex\fP\^); 
+.HP
+int XRefreshKeyboardMapping(\^XMappingEvent *\fIevent_map\fP\^); 
+.HP
+int XLookupString(\^XKeyEvent *\fIevent_struct\fP\^, char
+*\fIbuffer_return\fP\^, int \fIbytes_buffer\fP\^, KeySym
+*\fIkeysym_return\fP\^, XComposeStatus *\fIstatus_in_out\fP\^); 
+.HP
+int XRebindKeysym(\^Display *\fIdisplay\fP\^, KeySym \fIkeysym\fP\^, KeySym
+\fIlist\fP\^[\^]\^, int \fImod_count\fP\^, unsigned char *\fIstring\fP\^, int
+\fInum_bytes\fP\^); 
+.SH ARGUMENTS
+.IP \fIbuffer_return\fP 1i
+Returns the translated characters.
+.IP \fIbytes_buffer\fP 1i
+Specifies the length of the buffer.
+No more than bytes_buffer of translation are returned.
+.IP \fInum_bytes\fP 1i
+Specifies the number of bytes in the string argument.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIevent_map\fP 1i
+Specifies the mapping event that is to be used.
+.IP \fIevent_struct\fP 1i
+Specifies the key event structure to be used.
+You can pass
+.ZN XKeyPressedEvent
+or
+.ZN XKeyReleasedEvent .
+.IP \fIindex\fP 1i
+Specifies the index into the KeySyms list for the event's KeyCode.
+.IP \fIkey_event\fP 1i
+Specifies the 
+.ZN KeyPress
+or
+.ZN KeyRelease
+event.
+.IP \fIkeysym\fP 1i
+Specifies the KeySym that is to be \*(Fn.
+.IP \fIkeysym_return\fP 1i
+Returns the KeySym computed from the event if this argument is not NULL.
+.IP \fIlist\fP 1i
+Specifies the KeySyms to be used as modifiers.
+.IP \fImod_count\fP 1i
+Specifies the number of modifiers in the modifier list.
+.IP \fIstatus_in_out\fP 1i
+Specifies or returns the 
+.ZN XComposeStatus 
+structure or NULL.
+.IP \fIstring\fP 1i
+Specifies the string that is copied and will be returned by 
+.ZN XLookupString .
+.SH DESCRIPTION
+The
+.ZN XLookupKeysym
+function uses a given keyboard event and the index you specified to return
+the KeySym from the list that corresponds to the KeyCode member in the
+.ZN XKeyPressedEvent
+or
+.ZN XKeyReleasedEvent
+structure.
+If no KeySym is defined for the KeyCode of the event,
+.ZN XLookupKeysym
+returns
+.ZN NoSymbol .
+.LP
+The
+.ZN XRefreshKeyboardMapping
+function refreshes the stored modifier and keymap information.
+You usually call this function when a
+.ZN MappingNotify
+event with a request member of
+.ZN MappingKeyboard
+or
+.ZN MappingModifier
+occurs.
+The result is to update Xlib's knowledge of the keyboard.
+.LP
+The
+.ZN XLookupString
+function translates a key event to a KeySym and a string.
+The KeySym is obtained by using the standard interpretation of the
+.ZN Shift ,
+.ZN Lock ,
+group, and numlock modifiers as defined in the X Protocol specification.
+If the KeySym has been rebound (see
+.ZN XRebindKeysym ),
+the bound string will be stored in the buffer.
+Otherwise, the KeySym is mapped, if possible, to an ISO Latin-1 character
+or (if the Control modifier is on) to an ASCII control character,
+and that character is stored in the buffer.
+.ZN XLookupString
+returns the number of characters that are stored in the buffer.
+.LP
+If present (non-NULL),
+the
+.ZN XComposeStatus
+structure records the state,
+which is private to Xlib,
+that needs preservation across calls to
+.ZN XLookupString
+to implement compose processing.
+The creation of
+.ZN XComposeStatus
+structures is implementation-dependent;
+a portable program must pass NULL for this argument.
+.LP
+The
+.ZN XRebindKeysym
+function can be used to rebind the meaning of a KeySym for the client.
+It does not redefine any key in the X server but merely
+provides an easy way for long strings to be attached to keys.
+.ZN XLookupString
+returns this string when the appropriate set of
+modifier keys are pressed and when the KeySym would have been used for
+the translation.
+No text conversions are performed;
+the client is responsible for supplying appropriately encoded strings.
+Note that you can rebind a KeySym that may not exist.
+.SH "SEE ALSO"
+XButtonEvent(__libmansuffix__),
+XMapEvent(__libmansuffix__),
+XStringToKeysym(__libmansuffix__),
+XkbLookupKeySym(__libmansuffix__),
+XkbRefreshKeyboardMapping(__libmansuffix__),
+XmbLookupString(__libmansuffix__),
+XwcLookupString(__libmansuffix__),
+Xutf8LookupString(__libmansuffix__),
+Compose(__filemansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XLookupString.man b/man/XLookupString.man
new file mode 100644 (file)
index 0000000..37d1597
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XLookupKeysym.__libmansuffix__
diff --git a/man/XLowerWindow.man b/man/XLowerWindow.man
new file mode 100644 (file)
index 0000000..37f4b5f
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XRaiseWindow.__libmansuffix__
diff --git a/man/XMapEvent.man b/man/XMapEvent.man
new file mode 100644 (file)
index 0000000..551c2bc
--- /dev/null
@@ -0,0 +1,290 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XMapEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XMapEvent, XMappingEvent \- MapNotify and MappingNotify event structures
+.SH STRUCTURES
+The structure for
+.ZN MapNotify
+events contains:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int type;       /\&* MapNotify */
+       unsigned long serial;   /\&* # of last request processed by server */
+       Bool send_event;        /\&* true if this came from a SendEvent request */
+       Display *display;       /\&* Display the event was read from */
+       Window event;
+       Window window;
+       Bool override_redirect; /\&* boolean, is override set... */
+} XMapEvent;
+.De
+.LP
+When you receive this event,
+the structure members are set as follows.
+.LP
+The type member is set to the event type constant name that uniquely identifies
+it.
+For example, when the X server reports a
+.ZN GraphicsExpose
+event to a client application, it sends an
+.ZN XGraphicsExposeEvent
+structure with the type member set to
+.ZN GraphicsExpose .
+The display member is set to a pointer to the display the event was read on.
+The send_event member is set to
+.ZN True
+if the event came from a
+.ZN SendEvent
+protocol request.
+The serial member is set from the serial number reported in the protocol
+but expanded from the 16-bit least-significant bits to a full 32-bit value.
+The window member is set to the window that is most useful to toolkit
+dispatchers.
+.LP
+The event member is set either to the window that was mapped or to its parent,
+depending on whether
+.ZN StructureNotify
+or
+.ZN SubstructureNotify
+was selected.
+The window member is set to the window that was mapped.
+The override_redirect member is set to the override-redirect attribute
+of the window.
+Window manager clients normally should ignore this window 
+if the override-redirect attribute is
+.ZN True ,
+because these events usually are generated from pop-ups,
+which override structure control.
+.LP
+The structure for
+.ZN MappingNotify
+events is:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int type;       /\&* MappingNotify */
+       unsigned long serial;   /\&* # of last request processed by server */
+       Bool send_event;        /\&* true if this came from a SendEvent request */
+       Display *display;       /\&* Display the event was read from */
+       Window window;  /\&* unused */
+       int request;    /\&* one of MappingModifier, MappingKeyboard,
+                  MappingPointer */
+       int first_keycode;      /\&* first keycode */
+       int count;      /\&* defines range of change w. first_keycode*/
+} XMappingEvent;
+.De
+.LP
+When you receive this event,
+the structure members are set as follows.
+.LP
+The type member is set to the event type constant name that uniquely identifies
+it.
+For example, when the X server reports a
+.ZN GraphicsExpose
+event to a client application, it sends an
+.ZN XGraphicsExposeEvent
+structure with the type member set to
+.ZN GraphicsExpose .
+The display member is set to a pointer to the display the event was read on.
+The send_event member is set to
+.ZN True
+if the event came from a
+.ZN SendEvent
+protocol request.
+The serial member is set from the serial number reported in the protocol
+but expanded from the 16-bit least-significant bits to a full 32-bit value.
+The window member is set to the window that is most useful to toolkit
+dispatchers.
+.LP
+The request member is set to indicate the kind of mapping change that occurred
+and can be
+.ZN MappingModifier ,
+.ZN MappingKeyboard ,
+.ZN MappingPointer .
+If it is
+.ZN MappingModifier ,
+the modifier mapping was changed.
+If it is
+.ZN MappingKeyboard ,
+the keyboard mapping was changed.
+If it is
+.ZN MappingPointer ,
+the pointer button mapping was changed. 
+The first_keycode and count members are set only 
+if the request member was set to
+.ZN MappingKeyboard .
+The number in first_keycode represents the first number in the range 
+of the altered mapping, 
+and count represents the number of keycodes altered.
+.SH "SEE ALSO"
+XAnyEvent(__libmansuffix__),
+XButtonEvent(__libmansuffix__),
+XCreateWindowEvent(__libmansuffix__),
+XCirculateEvent(__libmansuffix__),
+XCirculateRequestEvent(__libmansuffix__),
+XColormapEvent(__libmansuffix__),
+XConfigureEvent(__libmansuffix__),
+XConfigureRequestEvent(__libmansuffix__),
+XCrossingEvent(__libmansuffix__),
+XDestroyWindowEvent(__libmansuffix__),
+XErrorEvent(__libmansuffix__),
+XExposeEvent(__libmansuffix__),
+XFocusChangeEvent(__libmansuffix__),
+XGraphicsExposeEvent(__libmansuffix__),
+XGravityEvent(__libmansuffix__),
+XKeymapEvent(__libmansuffix__),
+XMapRequestEvent(__libmansuffix__),
+XPropertyEvent(__libmansuffix__),
+XReparentEvent(__libmansuffix__),
+XResizeRequestEvent(__libmansuffix__),
+XSelectionClearEvent(__libmansuffix__),
+XSelectionEvent(__libmansuffix__),
+XSelectionRequestEvent(__libmansuffix__),
+XUnmapEvent(__libmansuffix__),
+XVisibilityEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XMapRaised.man b/man/XMapRaised.man
new file mode 100644 (file)
index 0000000..aa62f4d
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XMapWindow.__libmansuffix__
diff --git a/man/XMapRequestEvent.man b/man/XMapRequestEvent.man
new file mode 100644 (file)
index 0000000..e30edf4
--- /dev/null
@@ -0,0 +1,214 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XMapRequestEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XMapRequestEvent \- MapRequest event structure
+.SH STRUCTURES
+The structure for
+.ZN MapRequest
+events contains:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int type;       /\&* MapRequest */
+       unsigned long serial;   /\&* # of last request processed by server */
+       Bool send_event;        /\&* true if this came from a SendEvent request */
+       Display *display;       /\&* Display the event was read from */
+       Window parent;
+       Window window;
+} XMapRequestEvent;
+.De
+.LP
+When you receive this event,
+the structure members are set as follows.
+.LP
+The type member is set to the event type constant name that uniquely identifies
+it.
+For example, when the X server reports a
+.ZN GraphicsExpose
+event to a client application, it sends an
+.ZN XGraphicsExposeEvent
+structure with the type member set to
+.ZN GraphicsExpose .
+The display member is set to a pointer to the display the event was read on.
+The send_event member is set to
+.ZN True
+if the event came from a
+.ZN SendEvent
+protocol request.
+The serial member is set from the serial number reported in the protocol
+but expanded from the 16-bit least-significant bits to a full 32-bit value.
+The window member is set to the window that is most useful to toolkit
+dispatchers.
+.LP
+The parent member is set to the parent window.
+The window member is set to the window to be mapped.
+.SH "SEE ALSO"
+XAnyEvent(__libmansuffix__),
+XButtonEvent(__libmansuffix__),
+XCreateWindowEvent(__libmansuffix__),
+XCirculateEvent(__libmansuffix__),
+XCirculateRequestEvent(__libmansuffix__),
+XColormapEvent(__libmansuffix__),
+XConfigureEvent(__libmansuffix__),
+XConfigureRequestEvent(__libmansuffix__),
+XCrossingEvent(__libmansuffix__),
+XDestroyWindowEvent(__libmansuffix__),
+XErrorEvent(__libmansuffix__),
+XExposeEvent(__libmansuffix__),
+XFocusChangeEvent(__libmansuffix__),
+XGraphicsExposeEvent(__libmansuffix__),
+XGravityEvent(__libmansuffix__),
+XKeymapEvent(__libmansuffix__),
+XMapEvent(__libmansuffix__),
+XPropertyEvent(__libmansuffix__),
+XReparentEvent(__libmansuffix__),
+XResizeRequestEvent(__libmansuffix__),
+XSelectionClearEvent(__libmansuffix__),
+XSelectionEvent(__libmansuffix__),
+XSelectionRequestEvent(__libmansuffix__),
+XUnmapEvent(__libmansuffix__),
+XVisibilityEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XMapSubwindows.man b/man/XMapSubwindows.man
new file mode 100644 (file)
index 0000000..aa62f4d
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XMapWindow.__libmansuffix__
diff --git a/man/XMapWindow.man b/man/XMapWindow.man
new file mode 100644 (file)
index 0000000..b4e6cde
--- /dev/null
@@ -0,0 +1,277 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XMapWindow __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XMapWindow, XMapRaised, XMapSubwindows \- map windows
+.SH SYNTAX
+.HP
+int XMapWindow\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^); 
+.HP
+int XMapRaised\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^); 
+.HP
+int XMapSubwindows\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIw\fP 1i
+Specifies the window.
+.SH DESCRIPTION
+The
+.ZN XMapWindow
+function
+maps the window and all of its
+subwindows that have had map requests.
+Mapping a window that has an unmapped ancestor does not display the
+window but marks it as eligible for display when the ancestor becomes
+mapped.
+Such a window is called unviewable.
+When all its ancestors are mapped,
+the window becomes viewable
+and will be visible on the screen if it is not obscured by another window.
+This function has no effect if the window is already mapped.
+.LP
+If the override-redirect of the window is
+.ZN False 
+and if some other client has selected
+.ZN SubstructureRedirectMask
+on the parent window, then the X server generates a
+.ZN MapRequest
+event, and the
+.ZN XMapWindow
+function does not map the window.
+Otherwise, the window is mapped, and the X server generates a
+.ZN MapNotify
+event.
+.LP
+If the window becomes viewable and no earlier contents for it are remembered,
+the X server tiles the window with its background.
+If the window's background is undefined,
+the existing screen contents are not
+altered, and the X server generates zero or more 
+.ZN Expose
+events.
+If backing-store was maintained while the window was unmapped, no 
+.ZN Expose
+events
+are generated.
+If backing-store will now be maintained, 
+a full-window exposure is always generated.
+Otherwise, only visible regions may be reported.
+Similar tiling and exposure take place for any newly viewable inferiors.
+.LP
+.IN "XMapWindow"
+If the window is an
+.ZN InputOutput 
+window,
+.ZN XMapWindow
+generates 
+.ZN Expose 
+events on each 
+.ZN InputOutput
+window that it causes to be displayed.
+If the client maps and paints the window 
+and if the client begins processing events, 
+the window is painted twice.
+To avoid this,
+first ask for 
+.ZN Expose 
+events and then map the window,
+so the client processes input events as usual.
+The event list will include 
+.ZN Expose 
+for each
+window that has appeared on the screen. 
+The client's normal response to
+an 
+.ZN Expose 
+event should be to repaint the window.
+This method usually leads to simpler programs and to proper interaction
+with window managers.
+.LP
+.ZN XMapWindow
+can generate a
+.ZN BadWindow 
+error.
+.LP
+The
+.ZN XMapRaised
+function
+essentially is similar to
+.ZN XMapWindow
+in that it maps the window and all of its
+subwindows that have had map requests.
+However, it also raises the specified window to the top of the stack.
+.LP
+.ZN XMapRaised
+can generate a
+.ZN BadWindow 
+error.
+.LP
+The
+.ZN XMapSubwindows
+.IN "XMapSubwindows"
+function maps all subwindows for a specified window in top-to-bottom stacking 
+order.
+The X server generates
+.ZN Expose
+events on each newly displayed window.
+This may be much more efficient than mapping many windows
+one at a time because the server needs to perform much of the work
+only once, for all of the windows, rather than for each window.
+.LP
+.ZN XMapSubwindows
+can generate a
+.ZN BadWindow 
+error.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XChangeWindowAttributes(__libmansuffix__),
+XConfigureWindow(__libmansuffix__),
+XCreateWindow(__libmansuffix__),
+XDestroyWindow(__libmansuffix__),
+XRaiseWindow(__libmansuffix__),
+XUnmapWindow(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XMappingEvent.man b/man/XMappingEvent.man
new file mode 100644 (file)
index 0000000..4cd9d84
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XMapEvent.__libmansuffix__
diff --git a/man/XMaskEvent.man b/man/XMaskEvent.man
new file mode 100644 (file)
index 0000000..6f5346e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XNextEvent.__libmansuffix__
diff --git a/man/XMatchVisualInfo.man b/man/XMatchVisualInfo.man
new file mode 100644 (file)
index 0000000..8a408c5
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XGetVisualInfo.__libmansuffix__
diff --git a/man/XMaxRequestSize.man b/man/XMaxRequestSize.man
new file mode 100644 (file)
index 0000000..7949dfa
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/AllPlanes.__libmansuffix__
diff --git a/man/XModifierKeymap.man b/man/XModifierKeymap.man
new file mode 100644 (file)
index 0000000..cc772af
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XChangeKeyboardMapping.__libmansuffix__
diff --git a/man/XMotionEvent.man b/man/XMotionEvent.man
new file mode 100644 (file)
index 0000000..07c1ecb
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XButtonEvent.__libmansuffix__
diff --git a/man/XMoveResizeWindow.man b/man/XMoveResizeWindow.man
new file mode 100644 (file)
index 0000000..4c16c27
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XConfigureWindow.__libmansuffix__
diff --git a/man/XMoveWindow.man b/man/XMoveWindow.man
new file mode 100644 (file)
index 0000000..4c16c27
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XConfigureWindow.__libmansuffix__
diff --git a/man/XNewModifiermap.man b/man/XNewModifiermap.man
new file mode 100644 (file)
index 0000000..cc772af
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XChangeKeyboardMapping.__libmansuffix__
diff --git a/man/XNextEvent.man b/man/XNextEvent.man
new file mode 100644 (file)
index 0000000..8480757
--- /dev/null
@@ -0,0 +1,309 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XNextEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XNextEvent, XPeekEvent, XWindowEvent, XCheckWindowEvent, XMaskEvent, XCheckMaskEvent, XCheckTypedEvent, XCheckTypedWindowEvent \- select events by type
+.SH SYNTAX
+.HP
+int XNextEvent\^(\^Display *\fIdisplay\fP\^, XEvent *\fIevent_return\fP\^); 
+.HP
+int XPeekEvent\^(\^Display *\fIdisplay\fP\^, XEvent *\fIevent_return\fP\^); 
+.HP
+int XWindowEvent\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, long
+\fIevent_mask\fP\^, XEvent *\fIevent_return\fP\^); 
+.HP
+Bool XCheckWindowEvent\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, long
+\fIevent_mask\fP\^, XEvent *\fIevent_return\fP\^); 
+.HP
+int XMaskEvent\^(\^Display *\fIdisplay\fP\^, long \fIevent_mask\fP\^, XEvent
+*\fIevent_return\fP\^); 
+.HP
+Bool XCheckMaskEvent\^(\^Display *\fIdisplay\fP\^, long \fIevent_mask\fP\^,
+XEvent *\fIevent_return\fP\^); 
+.HP
+Bool XCheckTypedEvent\^(\^Display *\fIdisplay\fP\^, int \fIevent_type\fP\^,
+XEvent *\fIevent_return\fP\^); 
+.HP
+Bool XCheckTypedWindowEvent\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^,
+int \fIevent_type\fP\^, XEvent *\fIevent_return\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIevent_mask\fP 1i
+Specifies the event mask.
+.IP \fIevent_return\fP 1i
+Returns the matched event's associated structure.
+.IP \fIevent_return\fP 1i
+Returns the next event in the queue.
+.IP \fIevent_return\fP 1i
+Returns a copy of the matched event's associated structure.
+.IP \fIevent_type\fP 1i
+Specifies the event type to be compared.
+
+.ds Wi \ whose event uou are interested in
+.IP \fIw\fP 1i
+Specifies the window \*(Wi.
+.SH DESCRIPTION
+The
+.ZN XNextEvent
+function copies the first event from the event queue into the specified
+.ZN XEvent
+structure and then removes it from the queue.
+If the event queue is empty,
+.ZN XNextEvent
+flushes the output buffer and blocks until an event is received.
+.LP
+The
+.ZN XPeekEvent
+function returns the first event from the event queue,
+but it does not remove the event from the queue.
+If the queue is empty,
+.ZN XPeekEvent
+flushes the output buffer and blocks until an event is received.
+It then copies the event into the client-supplied
+.ZN XEvent
+structure without removing it from the event queue.
+.LP
+The
+.ZN XWindowEvent
+function searches the event queue for an event that matches both the specified
+window and event mask.
+When it finds a match,
+.ZN XWindowEvent
+removes that event from the queue and copies it into the specified
+.ZN XEvent
+structure.
+The other events stored in the queue are not discarded.
+If a matching event is not in the queue,
+.ZN XWindowEvent
+flushes the output buffer and blocks until one is received.
+.LP
+The
+.ZN XCheckWindowEvent
+function searches the event queue and then the events available 
+on the server connection for the first event that matches the specified window
+and event mask.
+If it finds a match,
+.ZN XCheckWindowEvent
+removes that event, copies it into the specified
+.ZN XEvent
+structure, and returns
+.ZN True .
+The other events stored in the queue are not discarded.
+If the event you requested is not available,
+.ZN XCheckWindowEvent
+returns
+.ZN False ,
+and the output buffer will have been flushed.
+.LP
+The
+.ZN XMaskEvent
+function searches the event queue for the events associated with the 
+specified mask.
+When it finds a match,
+.ZN XMaskEvent
+removes that event and copies it into the specified
+.ZN XEvent
+structure.
+The other events stored in the queue are not discarded.
+If the event you requested is not in the queue,
+.ZN XMaskEvent
+flushes the output buffer and blocks until one is received.
+.LP
+The
+.ZN XCheckMaskEvent
+function searches the event queue and then any events available on the
+server connection for the first event that matches the specified mask.
+If it finds a match,
+.ZN XCheckMaskEvent
+removes that event, copies it into the specified
+.ZN XEvent
+structure, and returns
+.ZN True .
+The other events stored in the queue are not discarded.
+If the event you requested is not available,
+.ZN XCheckMaskEvent
+returns
+.ZN False ,
+and the output buffer will have been flushed.
+.LP
+The
+.ZN XCheckTypedEvent
+function searches the event queue and then any events available  
+on the server connection for the first event that matches the specified type.
+If it finds a match,
+.ZN XCheckTypedEvent
+removes that event, copies it into the specified
+.ZN XEvent
+structure, and returns
+.ZN True .
+The other events in the queue are not discarded.
+If the event is not available,
+.ZN XCheckTypedEvent
+returns
+.ZN False ,
+and the output buffer will have been flushed.
+.LP
+The
+.ZN XCheckTypedWindowEvent
+function searches the event queue and then any events available  
+on the server connection for the first event that matches the specified
+type and window.
+If it finds a match,
+.ZN XCheckTypedWindowEvent
+removes the event from the queue, copies it into the specified
+.ZN XEvent
+structure, and returns
+.ZN True .
+The other events in the queue are not discarded.
+If the event is not available,
+.ZN XCheckTypedWindowEvent
+returns
+.ZN False ,
+and the output buffer will have been flushed.
+.SH "SEE ALSO"
+XAnyEvent(__libmansuffix__),
+XIfEvent(__libmansuffix__),
+XPutBackEvent(__libmansuffix__),
+XSendEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XNoExposeEvent.man b/man/XNoExposeEvent.man
new file mode 100644 (file)
index 0000000..fa8deb7
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XGraphicsExposeEvent.__libmansuffix__
diff --git a/man/XNoOp.man b/man/XNoOp.man
new file mode 100644 (file)
index 0000000..a85752b
--- /dev/null
@@ -0,0 +1,158 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XNoOp __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XNoOp \- No Operation
+.SH SYNTAX
+int XNoOp\^(\^Display *\fIdisplay\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.SH DESCRIPTION
+The
+.ZN XNoOp
+function sends a 
+.ZN NoOperation 
+protocol request to the X server,
+thereby exercising the connection.
+.SH "SEE ALSO"
+\fI\*(xL\fP
diff --git a/man/XOMOfOC.man b/man/XOMOfOC.man
new file mode 100644 (file)
index 0000000..12d5a3d
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XCreateOC.__libmansuffix__
diff --git a/man/XOffsetRegion.man b/man/XOffsetRegion.man
new file mode 100644 (file)
index 0000000..585c177
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XIntersectRegion.__libmansuffix__
diff --git a/man/XOpenDisplay.man b/man/XOpenDisplay.man
new file mode 100644 (file)
index 0000000..76d6737
--- /dev/null
@@ -0,0 +1,256 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XOpenDisplay __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XOpenDisplay, XCloseDisplay \- connect or disconnect to X server
+.SH SYNTAX
+.HP
+Display *XOpenDisplay\^(\^char *\fIdisplay_name\fP\^); 
+.HP
+int XCloseDisplay\^(Display *\fIdisplay\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIdisplay_name\fP 1i
+Specifies the hardware display name, which determines the display
+and communications domain to be used.
+On a POSIX-conformant system, if the display_name is NULL, 
+it defaults to the value of the DISPLAY environment variable. 
+.IN "Environment" "DISPLAY"
+.SH DESCRIPTION
+The
+.ZN XOpenDisplay
+function returns a 
+.ZN Display 
+structure that serves as the
+connection to the X server and that contains all the information
+about that X server.
+.ZN XOpenDisplay
+connects your application to the X server through TCP 
+or DECnet communications protocols,
+or through some local inter-process communication protocol.
+.IN "Protocol" "TCP"
+.IN "Protocol" "DECnet"
+If the hostname is a host machine name and a single colon (:)
+separates the hostname and display number,
+.ZN XOpenDisplay
+connects using TCP streams.
+If the hostname is not specified,
+Xlib uses whatever it believes is the fastest transport.
+If the hostname is a host machine name and a double colon (::)
+separates the hostname and display number,
+.ZN XOpenDisplay
+connects using DECnet.
+A single X server can support any or all of these transport mechanisms
+simultaneously.
+A particular Xlib implementation can support many more of these transport
+mechanisms.
+.LP
+.IN "Display"
+If successful, 
+.ZN XOpenDisplay 
+returns a pointer to a 
+.ZN Display 
+structure,
+which is defined in 
+.hN X11/Xlib.h .
+If 
+.ZN XOpenDisplay 
+does not succeed, it returns NULL.
+After a successful call to
+.ZN XOpenDisplay ,
+all of the screens in the display can be used by the client.
+The screen number specified in the display_name argument is returned 
+by the 
+.ZN DefaultScreen
+macro (or the
+.ZN XDefaultScreen
+function).
+You can access elements of the
+.ZN Display
+and
+.ZN Screen
+structures only by using the information macros or functions.
+For information about using macros and functions to obtain information from 
+the
+.ZN Display 
+structure,
+see section 2.2.1.
+.LP
+The
+.ZN XCloseDisplay
+function closes the connection to the X server for the display specified in the
+.ZN Display
+structure and destroys all windows, resource IDs
+.Pn ( Window ,
+.ZN Font ,
+.ZN Pixmap ,
+.ZN Colormap ,
+.ZN Cursor ,
+and
+.ZN GContext ),
+or other resources that the client has created
+on this display, unless the close-down mode of the resource has been changed
+(see
+.ZN XSetCloseDownMode ).
+Therefore, these windows, resource IDs, and other resources should never be 
+referenced again or an error will be generated.
+Before exiting, you should call
+.ZN XCloseDisplay
+explicitly so that any pending errors are reported as
+.ZN XCloseDisplay
+performs a final
+.ZN XSync
+operation.
+.IN "Resource IDs"
+.IN "XCloseDisplay"
+.LP
+.ZN XCloseDisplay
+can generate a
+.ZN BadGC
+error.
+.SH "SEE ALSO"
+AllPlanes(__libmansuffix__),
+XFlush(__libmansuffix__),
+XSetCloseDownMode(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XOpenIM.man b/man/XOpenIM.man
new file mode 100644 (file)
index 0000000..c559705
--- /dev/null
@@ -0,0 +1,304 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XOpenIM __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XOpenIM, XCloseIM, XSetIMValues, XGetIMValues, XDisplayOfIM, XLocaleOfIM, XRegisterIMInstantiateCallback, XUnregisterIMInstantiateCallback \- open, close, and obtain input method information
+.SH SYNTAX
+.HP
+XIM XOpenIM\^(\^Display *\fIdisplay\fP\^, XrmDatabase \fIdb\fP\^, char
+*\fIres_name\fP\^, char *\fIres_class\fP\^); 
+.HP
+Status XCloseIM\^(\^XIM \fIim\fP\^); 
+.HP
+char *XSetIMValues\^(\^XIM \fIim\fP\^, ...); 
+.HP
+char *XGetIMValues\^(\^XIM \fIim\fP\^, ...); 
+.HP
+Display *XDisplayOfIM\^(\^XIM \fIim\fP\^); 
+.HP
+char *XLocaleOfIM\^(\^XIM \fIim\fP\^); 
+.HP
+Bool XRegisterIMInstantiateCallback\^(\^Display *\fIdisplay\fP\^, XrmDatabase
+\fIdb\fP\^, char *\fIres_name\fP\^, char *\fIres_class\fP\^, XIDProc
+\fIcallback\fP\^, XPointer \fIclient_data\fP\^); 
+.HP
+Bool XUnregisterIMInstantiateCallback\^(\^Display *\fIdisplay\fP\^,
+XrmDatabase \fIdb\fP\^, char *\fIres_name\fP\^, char *\fIres_class\fP\^,
+XIDProc \fIcallback\fP\^, XPointer \fIclient_data\fP\^); 
+.LP
+.SH ARGUMENTS
+.IP \fIcallback\fP 1i
+Specifies a pointer to the input method instantiate callback.
+.IP \fIclient_data\fP 1i
+Specifies the additional client data.
+.IP \fIdb\fP 1i
+Specifies a pointer to the resource database.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIim\fP 1i
+Specifies the input method.
+.IP \fIres_class\fP 1i
+Specifies the full class name of the application.
+.IP \fIres_name\fP 1i
+Specifies the full resource name of the application.
+.ds Al \ to set or get XIM values
+.IP ... 1i
+Specifies the variable length argument list\*(Al.
+.SH DESCRIPTION
+The
+.ZN XOpenIM
+function opens an input method, 
+matching the current locale and modifiers specification.
+Current locale and modifiers are bound to the input method at opening time.
+The locale associated with an input method cannot be changed dynamically.
+This implies that the strings returned by
+.ZN XmbLookupString
+or
+.ZN XwcLookupString ,
+for any input context affiliated with a given input method
+will be encoded in the locale current at the time the input method is opened.
+.LP
+The specific input method to which this call will be routed
+is identified on the basis of the current locale. 
+.ZN XOpenIM
+will identify a default input method corresponding to the
+current locale.
+That default can be modified using 
+.ZN XSetLocaleModifiers
+for the input method modifier.
+.LP
+The db argument is the resource database to be used by the input method
+for looking up resources that are private to the input method.
+It is not intended that this database be used to look
+up values that can be set as IC values in an input context.
+If db is NULL,
+no database is passed to the input method.
+.LP
+The res_name and res_class arguments specify the resource name 
+and class of the application. 
+They are intended to be used as prefixes by the input method
+when looking up resources that are common to all input contexts
+that may be created for this input method.
+The characters used for resource names and classes must be in the
+X Portable Character Set.
+The resources looked up are not fully specified
+if res_name or res_class is NULL.
+.LP
+The res_name and res_class arguments are not assumed to exist beyond
+the call to
+.ZN XOpenIM .
+The specified resource database is assumed to exist for the lifetime
+of the input method.
+.LP
+.ZN XOpenIM
+returns NULL if no input method could be opened.
+.LP
+The
+.ZN XCloseIM
+function closes the specified input method.
+.LP
+The
+.ZN XSetIMValues
+function presents a variable argument list programming interface
+for setting attributes of the specified input method.
+It returns NULL if it succeeds;
+otherwise,
+it returns the name of the first argument that could not be set.
+Xlib does not attempt to set arguments from the supplied list that
+follow the failed argument;
+all arguments in the list preceding the failed argument have been set
+correctly.
+.LP
+The
+.ZN XGetIMValues
+function presents a variable argument list programming interface
+for querying properties or features of the specified input method.
+This function returns NULL if it succeeds;
+otherwise,
+it returns the name of the first argument that could not be obtained.
+.LP
+Each XIM value argument (following a name) must point to
+a location where the XIM value is to be stored.
+That is, if the XIM value is of type T,
+the argument must be of type T*.
+If T itself is a pointer type,
+then
+.ZN XGetIMValues
+allocates memory to store the actual data,
+and the client is responsible for freeing this data by calling
+.ZN XFree
+with the returned pointer.
+.LP
+The
+.ZN XDisplayOfIM
+function returns the display associated with the specified input method.
+.LP
+The
+.ZN XLocaleOfIM
+function returns the locale associated with the specified input method.
+.LP
+The
+.ZN XRegisterIMInstantiateCallback
+function registers a callback to be invoked whenever a new input method
+becomes available for the specified display that matches the current
+locale and modifiers.
+.LP
+The function returns 
+.ZN True
+if it succeeds; otherwise, it returns 
+.ZN False .
+.LP
+The
+.ZN XUnregisterIMInstantiateCallback
+function removes an input method instantiation callback previously
+registered.
+The function returns
+.ZN True
+if it succeeds; otherwise, it returns 
+.ZN False .
+.SH "SEE ALSO"
+XCreateIC(__libmansuffix__),
+XSetICFocus(__libmansuffix__),
+XSetICValues(__libmansuffix__),
+XmbResetIC(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XOpenOM.man b/man/XOpenOM.man
new file mode 100644 (file)
index 0000000..3d67b0c
--- /dev/null
@@ -0,0 +1,257 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\" Copyright \(co 2000  The XFree86 Project, Inc.
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\"
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XOpenOM __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XOpenOM, XCloseOM, XSetOMValues, XGetOMValues, XDisplayOfOM, XLocaleOfOM \- open output methods
+.SH SYNTAX
+.HP
+XOM XOpenOM\^(\^Display *\fIdisplay\fP\^, XrmDatabase \fIdb\fP\^, char
+*\fIres_name\fP\^, char *\fIres_class\fP\^); 
+.HP
+Status XCloseOM\^(\^XOM \fIom\fP\^); 
+.HP
+char *XSetOMValues\^(\^XOM \fIom\fP\^); 
+.HP
+char *XGetOMValues\^(\^XOM \fIom\fP\^); 
+.HP
+Display *XDisplayOfOM\^(\^XOM \fIom\fP\^); 
+.HP
+char *XLocaleOfOM\^(\^XOM \fIom\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIdb\fP 1i
+Specifies a pointer to the resource database.
+.IP \fIres_name\fP 1i
+Specifies the full resource name of the application.
+.IP \fIres_class\fP 1i
+Specifies the full class name of the application.
+.IP \fIom\fP 1i
+Specifies the output method.
+.ds Al \ to set or get XOM values
+.IP ... 1i
+Specifies the variable length argument list\*(Al.
+.SH DESCRIPTION
+The
+.ZN XOpenOM
+function opens an output method
+matching the current locale and modifiers specification.
+The current locale and modifiers are bound to the output method
+when
+.ZN XOpenOM
+is called.
+The locale associated with an output method cannot be changed.
+.LP
+The specific output method to which this call will be routed
+is identified on the basis of the current locale and modifiers.
+.ZN XOpenOM
+will identify a default output method corresponding to the
+current locale.
+That default can be modified using 
+.ZN XSetLocaleModifiers
+to set the output method modifier.
+.LP
+The db argument is the resource database to be used by the output method
+for looking up resources that are private to the output method.
+It is not intended that this database be used to look
+up values that can be set as OC values in an output context.
+If db is NULL,
+no database is passed to the output method.
+.LP
+The res_name and res_class arguments specify the resource name 
+and class of the application. 
+They are intended to be used as prefixes by the output method
+when looking up resources that are common to all output contexts
+that may be created for this output method.
+The characters used for resource names and classes must be in the
+X Portable Character Set.
+The resources looked up are not fully specified
+if res_name or res_class is NULL.
+.LP
+The res_name and res_class arguments are not assumed to exist beyond
+the call to
+.ZN XOpenOM .
+The specified resource database is assumed to exist for the lifetime
+of the output method.
+.LP
+.ZN XOpenOM
+returns NULL if no output method could be opened.
+.LP
+The
+.ZN XCloseOM
+function closes the specified output method.
+.LP
+The
+.ZN XSetOMValues
+function presents a variable argument list programming interface
+for setting properties or features of the specified output method.
+This function returns NULL if it succeeds;
+otherwise,
+it returns the name of the first argument that could not be set.
+Xlib does not attempt to set arguments from the supplied list that
+follow the failed argument;
+all arguments in the list preceding the failed argument have been set
+correctly.
+.LP
+No standard arguments are currently defined by Xlib.
+.LP
+The
+.ZN XGetOMValues
+function presents a variable argument list programming interface
+for querying properties or features of the specified output method.
+This function returns NULL if it succeeds;
+otherwise,
+it returns the name of the first argument that could not be obtained.
+.LP
+The
+.ZN XDisplayOfOM
+function returns the display associated with the specified output method.
+.LP
+The
+.ZN XLocaleOfOM
+returns the locale associated with the specified output method.
+.SH "SEE ALSO"
+XCreateOC(__libmansuffix__),
+XCreateFontSet(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XParseColor.man b/man/XParseColor.man
new file mode 100644 (file)
index 0000000..f0c2a90
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XQueryColor.__libmansuffix__
diff --git a/man/XParseGeometry.man b/man/XParseGeometry.man
new file mode 100644 (file)
index 0000000..057895f
--- /dev/null
@@ -0,0 +1,283 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XParseGeometry __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XParseGeometry, XWMGeometry \- parse window geometry
+.SH SYNTAX
+.HP
+int XParseGeometry\^(\^char *\fIparsestring\fP\^, int *\fIx_return\fP\^, int
+*\fIy_return\fP\^, unsigned int *\fIwidth_return\fP\^, unsigned int
+*\fIheight_return\fP\^); 
+.HP
+int XWMGeometry\^(\^Display *\fIdisplay\fP\^, int \fIscreen\fP\^, char
+*\fIuser_geom\fP\^, char *\fIdef_geom\fP\^, unsigned int \fIbwidth\fP\^,
+XSizeHints *\fIhints\fP\^, int *\fIx_return\fP, int *\fIy_return\fP\^, int
+*\fIwidth_return\fP\^, int *\fIheight_return\fP\^, int
+*\fIgravity_return\fP\^); 
+.SH ARGUMENTS
+.IP \fIposition\fP 1i
+.br
+.ns
+.IP \fIdefault_position\fP 1i
+Specify the geometry specifications.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIfheight\fP 1i
+.br
+.ns
+.IP \fIfwidth\fP 1i
+Specify the font height and width in pixels (increment size).
+.IP \fIparsestring\fP 1i
+Specifies the string you want to parse.
+.IP \fIscreen\fP 1i
+Specifies the screen.
+.IP \fIwidth_return\fP 1i
+.br
+.ns
+.IP \fIheight_return\fP 1i
+Return the width and height determined.
+.IP \fIxadder\fP 1i
+.br
+.ns
+.IP \fIyadder\fP 1i
+Specify additional interior padding needed in the window.
+.IP \fIx_return\fP 1i
+.br
+.ns
+.IP \fIy_return\fP 1i
+Return the x and y offsets.
+.IP \fIbwidth\fP 1i
+Specifies the border width.
+.IP \fIhints\fP 1i
+Specifies the size hints for the window in its normal state.
+.IP \fIdef_geom\fP 1i
+Specifies the application's default geometry or NULL.
+.IP \fIgravity_return\fP 1i
+Returns the window gravity.
+.IP \fIuser_geom\fP 1i
+Specifies the user-specified geometry or NULL.
+.SH DESCRIPTION
+By convention,
+X applications use a standard string to indicate window size and placement.
+.ZN XParseGeometry
+makes it easier to conform to this standard because it allows you
+to parse the standard window geometry.
+Specifically, this function lets you parse strings of the form:
+.LP
+.\" Start marker code here
+.Ds
+[=][<\fIwidth\fP>{xX}<\fIheight\fP>][{+-}<\fIxoffset\fP>{+-}<\fIyoffset\fP>] 
+.De
+.\" End marker code here
+.LP
+The fields map into the arguments associated with this function.
+(Items enclosed in <\^> are integers, items in [\^] are optional, and
+items enclosed in {\^} indicate ``choose one of.''
+Note that the brackets should not appear in the actual string.)
+If the string is not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+.LP
+The
+.ZN XParseGeometry
+function returns a bitmask that indicates which of the four values (width,
+height, xoffset, and yoffset) were actually found in the string 
+and whether the x and y values are negative. 
+By convention, \-0 is not equal to +0, because the user needs to
+be able to say ``position the window relative to the right or bottom edge.''
+For each value found, the corresponding argument is updated.
+For each value not found, the argument is left unchanged.
+The bits are represented by
+.ZN XValue , 
+.ZN YValue , 
+.ZN WidthValue , 
+.ZN HeightValue ,
+.ZN XNegative , 
+or
+.ZN YNegative
+and are defined in 
+.hN X11/Xutil.h .
+They will be set whenever one of the values is defined 
+or one of the signs is set.
+.LP
+If the function returns either the 
+.ZN XValue 
+or 
+.ZN YValue 
+flag,
+you should place the window at the requested position.
+.LP
+The 
+.ZN XWMGeometry 
+function combines any geometry information (given in the format used by 
+.ZN XParseGeometry )
+specified by the user and by the calling program with size hints 
+(usually the ones to be stored in WM_NORMAL_HINTS) and returns the position, 
+size, and gravity
+.Pn ( NorthWestGravity , 
+.ZN NorthEastGravity , 
+.ZN SouthEastGravity ,
+or
+.ZN SouthWestGravity ) 
+that describe the window.
+If the base size is not set in the 
+.ZN XSizeHints
+structure, 
+the minimum size is used if set.
+Otherwise, a base size of zero is assumed.
+If no minimum size is set in the hints structure, 
+the base size is used.
+A mask (in the form returned by 
+.ZN XParseGeometry ) 
+that describes which values came from the user specification 
+and whether or not the position coordinates are relative
+to the right and bottom edges is returned.
+Note that these coordinates will have already been accounted for 
+in the x_return and y_return values.
+.LP
+Note that invalid geometry specifications can cause a width or height 
+of zero to be returned.
+The caller may pass the address of the hints win_gravity field 
+as gravity_return to update the hints directly.
+.SH "SEE ALSO"
+XSetWMProperties(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XPeekEvent.man b/man/XPeekEvent.man
new file mode 100644 (file)
index 0000000..6f5346e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XNextEvent.__libmansuffix__
diff --git a/man/XPeekIfEvent.man b/man/XPeekIfEvent.man
new file mode 100644 (file)
index 0000000..089e0a4
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XIfEvent.__libmansuffix__
diff --git a/man/XPending.man b/man/XPending.man
new file mode 100644 (file)
index 0000000..1fc2e3e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XFlush.__libmansuffix__
diff --git a/man/XPixmapFormatValues.man b/man/XPixmapFormatValues.man
new file mode 100644 (file)
index 0000000..4e27094
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/ImageByteOrder.__libmansuffix__
diff --git a/man/XPoint.man b/man/XPoint.man
new file mode 100644 (file)
index 0000000..972f3c1
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XDrawPoint.__libmansuffix__
diff --git a/man/XPointInRegion.man b/man/XPointInRegion.man
new file mode 100644 (file)
index 0000000..d2d2d03
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XEmptyRegion.__libmansuffix__
diff --git a/man/XPolygonRegion.man b/man/XPolygonRegion.man
new file mode 100644 (file)
index 0000000..ef5e48b
--- /dev/null
@@ -0,0 +1,182 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XPolygonRegion __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XPolygonRegion, XClipBox \- generate regions
+.SH SYNTAX
+.HP
+Region XPolygonRegion\^(\^XPoint \fIpoints\fP[]\^, int \fIn\fP\^, int
+\fIfill_rule\fP\^); 
+.HP
+int XClipBox\^(\^Region \fIr\fP\^, XRectangle *\fIrect_return\fP\^); 
+.SH ARGUMENTS
+.IP \fIfill_rule\fP 1i
+Specifies the fill-rule you want to set for the specified GC.
+You can pass 
+.ZN EvenOddRule
+or
+.ZN WindingRule .
+.IP \fIn\fP 1i
+Specifies the number of points in the polygon. 
+.IP \fIpoints\fP 1i
+Specifies an array of points.
+.IP \fIr\fP 1i
+Specifies the region.
+.IP \fIrect_return\fP 1i
+Returns the smallest enclosing rectangle.
+.SH DESCRIPTION
+The
+.ZN XPolygonRegion
+function returns a region for the polygon defined by the points array.
+For an explanation of fill_rule,
+see
+.ZN XCreateGC .
+.LP
+The
+.ZN XClipBox
+function returns the smallest rectangle enclosing the specified region.
+.SH "SEE ALSO"
+XCreateGC(__libmansuffix__),
+XDrawPoint(__libmansuffix__),
+XDrawRectangle(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XProcessInternalConnection.man b/man/XProcessInternalConnection.man
new file mode 100644 (file)
index 0000000..c3e5bf0
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAddConnectionWatch.__libmansuffix__
diff --git a/man/XPropertyEvent.man b/man/XPropertyEvent.man
new file mode 100644 (file)
index 0000000..53c8e78
--- /dev/null
@@ -0,0 +1,244 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XPropertyEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XPropertyEvent \- PropertyNotify event structure
+.SH STRUCTURES
+The structure for
+.ZN PropertyNotify
+events contains:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int type;       /\&* PropertyNotify */
+       unsigned long serial;   /\&* # of last request processed by server */
+       Bool send_event;        /\&* true if this came from a SendEvent request */
+       Display *display;       /\&* Display the event was read from */
+       Window window;
+       Atom atom;
+       Time time;
+       int state;      /\&* PropertyNewValue or PropertyDelete */
+} XPropertyEvent;
+.De
+.LP
+When you receive this event,
+the structure members are set as follows.
+.LP
+The type member is set to the event type constant name that uniquely identifies
+it.
+For example, when the X server reports a
+.ZN GraphicsExpose
+event to a client application, it sends an
+.ZN XGraphicsExposeEvent
+structure with the type member set to
+.ZN GraphicsExpose .
+The display member is set to a pointer to the display the event was read on.
+The send_event member is set to
+.ZN True
+if the event came from a
+.ZN SendEvent
+protocol request.
+The serial member is set from the serial number reported in the protocol
+but expanded from the 16-bit least-significant bits to a full 32-bit value.
+The window member is set to the window that is most useful to toolkit
+dispatchers.
+.LP
+The window member is set to the window whose associated 
+property was changed.
+The atom member is set to the property's atom and indicates which
+property was changed or desired.
+The time member is set to the server time when the property was changed.
+The state member is set to indicate whether the property was changed 
+to a new value or deleted and can be
+.ZN PropertyNewValue
+or
+.ZN PropertyDelete .
+The state member is set to
+.ZN PropertyNewValue
+when a property of the window is changed using
+.ZN XChangeProperty
+or
+.ZN XRotateWindowProperties
+(even when adding zero-length data using
+.ZN XChangeProperty )
+and when replacing all or part of a property with identical data using
+.ZN XChangeProperty
+or 
+.ZN XRotateWindowProperties .
+The state member is set to
+.ZN PropertyDelete
+when a property of the window is deleted using
+.ZN XDeleteProperty
+or, if the delete argument is 
+.ZN True ,
+.ZN XGetWindowProperty .
+.SH "SEE ALSO"
+XAnyEvent(__libmansuffix__),
+XButtonEvent(__libmansuffix__),
+XCreateWindowEvent(__libmansuffix__),
+XCirculateEvent(__libmansuffix__),
+XCirculateRequestEvent(__libmansuffix__),
+XColormapEvent(__libmansuffix__),
+XConfigureEvent(__libmansuffix__),
+XConfigureRequestEvent(__libmansuffix__),
+XCrossingEvent(__libmansuffix__),
+XDestroyWindowEvent(__libmansuffix__),
+XErrorEvent(__libmansuffix__),
+XExposeEvent(__libmansuffix__),
+XFocusChangeEvent(__libmansuffix__),
+XGetWindowProperty(__libmansuffix__),
+XGraphicsExposeEvent(__libmansuffix__),
+XGravityEvent(__libmansuffix__),
+XKeymapEvent(__libmansuffix__),
+XMapEvent(__libmansuffix__),
+XMapRequestEvent(__libmansuffix__),
+XReparentEvent(__libmansuffix__),
+XResizeRequestEvent(__libmansuffix__),
+XSelectionClearEvent(__libmansuffix__),
+XSelectionEvent(__libmansuffix__),
+XSelectionRequestEvent(__libmansuffix__),
+XUnmapEvent(__libmansuffix__),
+XVisibilityEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XPutBackEvent.man b/man/XPutBackEvent.man
new file mode 100644 (file)
index 0000000..1632572
--- /dev/null
@@ -0,0 +1,168 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XPutBackEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XPutBackEvent \- put events back on the queue
+.SH SYNTAX
+.HP
+XPutBackEvent\^(\^Display *\fIdisplay\fP\^, XEvent *\fIevent\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIevent\fP 1i
+Specifies the event.
+.SH DESCRIPTION
+The
+.ZN XPutBackEvent
+function pushes an event back onto the head of the display's event queue
+by copying the event into the queue.
+This can be useful if you read an event and then decide that you
+would rather deal with it later.
+There is no limit to the number of times in succession that you can call
+.ZN XPutBackEvent .
+.SH "SEE ALSO"
+XAnyEvent(__libmansuffix__),
+XIfEvent(__libmansuffix__),
+XNextEvent(__libmansuffix__),
+XSendEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XPutImage.man b/man/XPutImage.man
new file mode 100644 (file)
index 0000000..010ac41
--- /dev/null
@@ -0,0 +1,403 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XPutImage __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XPutImage, XGetImage, XGetSubImage \- transfer images
+.SH SYNTAX
+.HP
+int XPutImage\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, GC \fIgc\fP\^,
+XImage *\fIimage\fP\^, int \fIsrc_x\fP\^, int \fIsrc_y\fP\^, int
+\fIdest_x\fP\^, int \fIdest_y\fP\^, unsigned int \fIwidth\fP\^, unsigned int
+\fIheight\fP\^); 
+.HP
+XImage *XGetImage\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, int
+\fIx\fP\^, int \fIy\fP\^, unsigned int \fIwidth\fP\^, unsigned int
+\fIheight\fP\^, unsigned long \fIplane_mask\fP\^, int \fIformat\fP\^); 
+.HP
+XImage *XGetSubImage\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, int
+\fIx\fP\^, int \fIy\fP\^, unsigned int \fIwidth\fP\^, unsigned int
+\fIheight\fP\^, unsigned long \fIplane_mask\fP\^, int \fIformat\fP\^, XImage
+*\fIdest_image\fP\^, int \fIdest_x\fP\^, \fIdest_y\fP\^); 
+.SH ARGUMENTS
+.IP \fId\fP 1i
+Specifies the drawable. 
+.IP \fIdest_image\fP 1i
+Specifies the destination image.
+.ds Dx , which are relative to the origin of the drawable \
+and are the coordinates of the subimage \
+or which are relative to the origin of the destination rectangle, \
+specify its upper-left corner, and determine where the subimage \
+is placed in the destination image
+.IP \fIdest_x\fP 1i
+.br
+.ns
+.IP \fIdest_y\fP 1i
+Specify the x and y coordinates\*(Dx.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIformat\fP 1i
+Specifies the format for the image.
+You can pass
+.ZN XYPixmap
+or 
+.ZN ZPixmap .
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fIimage\fP 1i
+Specifies the image you want combined with the rectangle. 
+.IP \fIplane_mask\fP 1i
+Specifies the plane mask.
+.\" *** JIM: NEED MORE INFO FOR THIS. ***
+.IP \fIsrc_x\fP 1i
+Specifies the offset in X from the left edge of the image defined
+by the 
+.ZN XImage 
+structure.
+.IP \fIsrc_y\fP 1i
+Specifies the offset in Y from the top edge of the image defined
+by the 
+.ZN XImage 
+structure.
+.ds Wh \ of the subimage, which define the dimensions of the rectangle
+.IP \fIwidth\fP 1i
+.br
+.ns
+.IP \fIheight\fP 1i
+Specify the width and height\*(Wh.
+.ds Xy , which are relative to the origin of the drawable \
+and define the upper-left corner of the rectangle
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.SH DESCRIPTION
+The
+.ZN XPutImage
+function
+combines an image with a rectangle of the specified drawable.
+The section of the image defined by the src_x, src_y, width, and height 
+arguments is drawn on the specified part of the drawable.
+If 
+.ZN XYBitmap 
+format is used, the depth of the image must be one,
+or a
+.ZN BadMatch 
+error results.
+The foreground pixel in the GC defines the source for the one bits in the image,
+and the background pixel defines the source for the zero bits.
+For 
+.ZN XYPixmap 
+and 
+.ZN ZPixmap , 
+the depth of the image must match the depth of the drawable,
+or a
+.ZN BadMatch
+error results.
+.LP
+If the characteristics of the image (for example, byte_order and bitmap_unit)
+differ from what the server requires,
+.ZN XPutImage 
+automatically makes the appropriate
+conversions.
+.LP
+This function uses these GC components: 
+function, plane-mask, subwindow-mode, clip-x-origin, clip-y-origin, 
+and clip-mask.
+It also uses these GC mode-dependent components:
+foreground and background.
+.LP
+.ZN XPutImage
+can generate
+.ZN BadDrawable ,
+.ZN BadGC ,
+.ZN BadMatch ,
+and
+.ZN BadValue 
+errors.
+.LP
+The
+.ZN XGetImage
+function returns a pointer to an
+.ZN XImage
+structure.
+This structure provides you with the contents of the specified rectangle of
+the drawable in the format you specify.
+If the format argument is 
+.ZN XYPixmap ,
+the image contains only the bit planes you passed to the plane_mask argument.
+If the plane_mask argument only requests a subset of the planes of the
+display, the depth of the returned image will be the number of planes
+requested.
+If the format argument is 
+.ZN ZPixmap ,
+.ZN XGetImage
+returns as zero the bits in all planes not 
+specified in the plane_mask argument.
+The function performs no range checking on the values in plane_mask and ignores
+extraneous bits.
+.LP
+.ZN XGetImage
+returns the depth of the image to the depth member of the
+.ZN XImage
+structure.
+The depth of the image is as specified when the drawable was created,
+except when getting a subset of the planes in 
+.ZN XYPixmap
+format, when the depth is given by the number of bits set to 1 in plane_mask.
+.LP
+If the drawable is a pixmap, 
+the given rectangle must be wholly contained within the pixmap, 
+or a
+.ZN BadMatch
+error results.
+If the drawable is a window, 
+the window must be viewable, 
+and it must be the case that if there were no inferiors or overlapping windows,
+the specified rectangle of the window would be fully visible on the screen
+and wholly contained within the outside edges of the window,
+or a
+.ZN BadMatch
+error results.
+Note that the borders of the window can be included and read with
+this request.
+If the window has backing-store, the backing-store contents are
+returned for regions of the window that are obscured by noninferior
+windows. 
+If the window does not have backing-store,
+the returned contents of such obscured regions are undefined.
+The returned contents of visible regions of inferiors
+of a different depth than the specified window's depth are also undefined.
+The pointer cursor image is not included in the returned contents.
+If a problem occurs,
+.ZN XGetImage
+returns NULL.
+.LP
+.ZN XGetImage
+can generate
+.ZN BadDrawable ,
+.ZN BadMatch ,
+and
+.ZN BadValue 
+errors.
+.LP
+The 
+.ZN XGetSubImage 
+function updates dest_image with the specified subimage in the same manner as 
+.ZN XGetImage . 
+If the format argument is 
+.ZN XYPixmap ,
+the image contains only the bit planes you passed to the plane_mask argument.
+If the format argument is 
+.ZN ZPixmap ,
+.ZN XGetSubImage
+returns as zero the bits in all planes not 
+specified in the plane_mask argument.
+The function performs no range checking on the values in plane_mask and ignores
+extraneous bits.
+As a convenience,
+.ZN XGetSubImage
+returns a pointer to the same
+.ZN XImage
+structure specified by dest_image.
+.LP
+The depth of the destination
+.ZN XImage
+structure must be the same as that of the drawable.
+If the specified subimage does not fit at the specified location
+on the destination image, the right and bottom edges are clipped.
+If the drawable is a pixmap,
+the given rectangle must be wholly contained within the pixmap,
+or a
+.ZN BadMatch
+error results.
+If the drawable is a window, 
+the window must be viewable, 
+and it must be the case that if there were no inferiors or overlapping windows,
+the specified rectangle of the window would be fully visible on the screen
+and wholly contained within the outside edges of the window,
+or a
+.ZN BadMatch
+error results.
+If the window has backing-store, 
+then the backing-store contents are returned for regions of the window 
+that are obscured by noninferior windows. 
+If the window does not have backing-store, 
+the returned contents of such obscured regions are undefined.
+The returned contents of visible regions of inferiors
+of a different depth than the specified window's depth are also undefined.
+If a problem occurs,
+.ZN XGetSubImage
+returns NULL.
+.LP
+.ZN XGetSubImage
+can generate
+.ZN BadDrawable ,
+.ZN BadGC ,
+.ZN BadMatch ,
+and
+.ZN BadValue 
+errors.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadDrawable
+A value for a Drawable argument does not name a defined Window or Pixmap.
+.TP 1i
+.ZN BadGC
+A value for a GContext argument does not name a defined GContext.
+.TP 1i
+.ZN BadMatch
+An
+.ZN InputOnly
+window is used as a Drawable.
+.TP 1i
+.ZN BadMatch
+Some argument or pair of arguments has the correct type and range but fails
+to match in some other way required by the request.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.SH "SEE ALSO"
+\fI\*(xL\fP
diff --git a/man/XPutPixel.man b/man/XPutPixel.man
new file mode 100644 (file)
index 0000000..19e5be3
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XInitImage.__libmansuffix__
diff --git a/man/XQueryBestCursor.man b/man/XQueryBestCursor.man
new file mode 100644 (file)
index 0000000..7f94888
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XRecolorCursor.__libmansuffix__
diff --git a/man/XQueryBestSize.man b/man/XQueryBestSize.man
new file mode 100644 (file)
index 0000000..993491f
--- /dev/null
@@ -0,0 +1,287 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XQueryBestSize __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XQueryBestSize, XQueryBestTile, XQueryBestStipple \- determine efficient sizes
+.SH SYNTAX
+.HP
+Status XQueryBestSize\^(\^Display *\fIdisplay\fP\^, int \fIclass\fP\^,
+Drawable \fIwhich_screen\fP\^, unsigned int \fIwidth\fP, unsigned int
+\fIheight\fP\^, unsigned int *\fIwidth_return\fP, unsigned int
+*\fIheight_return\fP\^); 
+.HP
+Status XQueryBestTile\^(\^Display *\fIdisplay\fP\^, Drawable
+\fIwhich_screen\fP\^, unsigned int \fIwidth\fP, unsigned int \fIheight\fP\^,
+unsigned int *\fIwidth_return\fP, unsigned int *\fIheight_return\fP\^);
+.HP
+Status XQueryBestStipple\^(\^Display *\fIdisplay\fP\^, Drawable
+\fIwhich_screen\fP\^, unsigned int \fIwidth\fP, unsigned int \fIheight\fP\^,
+unsigned int *\fIwidth_return\fP, unsigned int *\fIheight_return\fP\^); 
+.SH ARGUMENTS
+.IP \fIclass\fP 1i
+Specifies the class that you are interested in.
+You can pass 
+.ZN TileShape , 
+.ZN CursorShape , 
+or 
+.ZN StippleShape .
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIwidth\fP 1i
+.br
+.ns
+.IP \fIheight\fP 1i
+Specify the width and height.
+.IP \fIwhich_screen\fP 1i
+Specifies any drawable on the screen.
+.IP \fIwidth_return\fP 1i
+.br
+.ns
+.IP \fIheight_return\fP 1i
+Return the width and height of the object best supported 
+by the display hardware.
+.SH DESCRIPTION
+The
+.ZN XQueryBestSize
+function returns the best or closest size to the specified size.
+For 
+.ZN CursorShape ,
+this is the largest size that can be fully displayed on the screen specified by
+which_screen.
+For 
+.ZN TileShape ,
+this is the size that can be tiled fastest.
+For 
+.ZN StippleShape ,
+this is the size that can be stippled fastest.
+For 
+.ZN CursorShape ,
+the drawable indicates the desired screen.
+For 
+.ZN TileShape 
+and 
+.ZN StippleShape ,
+the drawable indicates the screen and possibly the window class and depth.
+An 
+.ZN InputOnly 
+window cannot be used as the drawable for 
+.ZN TileShape
+or 
+.ZN StippleShape ,
+or a
+.ZN BadMatch 
+error results.
+.LP
+.ZN XQueryBestSize
+can generate
+.ZN BadDrawable ,
+.ZN BadMatch ,
+and
+.ZN BadValue 
+errors.
+.LP
+The
+.ZN XQueryBestTile
+function returns the best or closest size, that is, the size that can be
+tiled fastest on the screen specified by which_screen.
+The drawable indicates the screen and possibly the window class and depth.
+If an 
+.ZN InputOnly 
+window is used as the drawable, a 
+.ZN BadMatch 
+error results.
+.LP
+.ZN XQueryBestTile
+can generate
+.ZN BadDrawable
+and
+.ZN BadMatch 
+errors.
+.LP
+The
+.ZN XQueryBestStipple
+function returns the best or closest size, that is, the size that can be
+stippled fastest on the screen specified by which_screen.
+The drawable indicates the screen and possibly the window class and depth.
+If an
+.ZN InputOnly
+window is used as the drawable, a
+.ZN BadMatch
+error results.
+.LP
+.ZN XQueryBestStipple
+can generate
+.ZN BadDrawable
+and
+.ZN BadMatch 
+errors.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadMatch
+An
+.ZN InputOnly
+window is used as a Drawable.
+.TP 1i
+.ZN BadDrawable
+A value for a Drawable argument does not name a defined Window or Pixmap.
+.TP 1i
+.ZN BadMatch
+The values do not exist for an
+.ZN InputOnly
+window.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.SH "SEE ALSO"
+XCreateGC(__libmansuffix__),
+XSetArcMode(__libmansuffix__),
+XSetClipOrigin(__libmansuffix__),
+XSetFillStyle(__libmansuffix__),
+XSetFont(__libmansuffix__),
+XSetLineAttributes(__libmansuffix__),
+XSetState(__libmansuffix__),
+XSetTile(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XQueryBestStipple.man b/man/XQueryBestStipple.man
new file mode 100644 (file)
index 0000000..ff5be0f
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XQueryBestSize.__libmansuffix__
diff --git a/man/XQueryBestTile.man b/man/XQueryBestTile.man
new file mode 100644 (file)
index 0000000..ff5be0f
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XQueryBestSize.__libmansuffix__
diff --git a/man/XQueryColor.man b/man/XQueryColor.man
new file mode 100644 (file)
index 0000000..fb8c8b5
--- /dev/null
@@ -0,0 +1,344 @@
+'\" t
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XQueryColor __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XQueryColor, XQueryColors, XLookupColor, XParseColor \- obtain color values
+.SH SYNTAX
+.HP
+int XQueryColor\^(\^Display *\fIdisplay\fP\^, Colormap \fIcolormap\fP\^, XColor
+*\fIdef_in_out\fP\^); 
+.HP
+int XQueryColors\^(\^Display *\fIdisplay\fP\^, Colormap \fIcolormap\fP\^,
+XColor \fIdefs_in_out\fP[\^]\^, int \fIncolors\fP\^); 
+.HP
+Status XLookupColor\^(\^Display *\fIdisplay\fP\^, Colormap \fIcolormap\fP\^,
+char *\fIcolor_name\fP\^, XColor *\fIexact_def_return\fP\^, XColor
+*\fIscreen_def_return\fP\^); 
+.HP
+Status XParseColor\^(\^Display *\fIdisplay\fP\^, Colormap \fIcolormap\fP\^,
+char *\fIspec\fP\^, XColor *\fIexact_def_return\fP\^); 
+.SH ARGUMENTS
+.IP \fIcolormap\fP 1i
+Specifies the colormap.
+.IP \fIcolor_name\fP 1i
+Specifies the color name string (for example, red) whose color 
+definition structure you want returned.
+.IP \fIdef_in_out\fP 1i
+Specifies and returns the RGB values for the pixel specified in the structure.
+.IP \fIdefs_in_out\fP 1i
+Specifies and returns an array of color definition structures for the pixel
+specified in the structure.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIexact_def_return\fP 1i
+Returns the exact RGB values.
+.IP \fIncolors\fP 1i
+.\"Specifies the number of color definition structures. 
+Specifies the number of 
+.ZN XColor
+structures in the color definition array.
+.IP \fIscreen_def_return\fP 1i
+Returns the closest RGB values provided by the hardware.
+.IP \fIspec\fP 1i
+Specifies the color name string;
+case is ignored.
+.IP \fIexact_def_return\fP 1i
+Returns the exact color value for later use and sets the
+.ZN DoRed ,
+.ZN DoGreen ,
+and
+.ZN DoBlue
+flags.
+.SH DESCRIPTION
+The
+.ZN XQueryColor
+function returns the current RGB value for the pixel in the
+.ZN XColor
+structure and sets the
+.ZN DoRed ,
+.ZN DoGreen ,
+and
+.ZN DoBlue
+flags.
+The
+.ZN XQueryColors
+function returns the RGB value for each pixel in each
+.ZN XColor
+structure and sets the
+.ZN DoRed ,
+.ZN DoGreen ,
+and
+.ZN DoBlue
+flags in each structure.
+
+.LP
+.ZN XQueryColor
+and
+.ZN XQueryColors
+can generate
+.ZN BadColor
+and
+.ZN BadValue 
+errors.
+.LP
+The
+.ZN XLookupColor
+function looks up the string name of a color with respect to the screen
+associated with the specified colormap.
+It returns both the exact color values and
+the closest values provided by the screen 
+with respect to the visual type of the specified colormap.
+If the color name is not in the Host Portable Character Encoding, 
+the result is implementation-dependent.
+Use of uppercase or lowercase does not matter.
+.ZN XLookupColor
+returns nonzero if the name is resolved;
+otherwise, it returns zero.
+.LP
+The
+.ZN XParseColor
+function looks up the string name of a color with respect to the screen
+associated with the specified colormap.
+It returns the exact color value.
+If the color name is not in the Host Portable Character Encoding, 
+the result is implementation-dependent.
+Use of uppercase or lowercase does not matter.
+.ZN XParseColor
+returns nonzero if the name is resolved;
+otherwise, it returns zero.
+.LP
+.ZN XLookupColor
+and
+.ZN XParseColor
+can generate
+.ZN BadColor 
+error.
+.SH "COLOR NAMES"
+An RGB Device specification is identified by
+the prefix ``rgb:'' and conforms to the following syntax:
+.LP
+.\" Start marker code here
+.Ds 0
+rgb:\fI<red>/<green>/<blue>\fP
+
+    \fI<red>\fP, \fI<green>\fP, \fI<blue>\fP := \fIh\fP | \fIhh\fP | \fIhhh\fP | \fIhhhh\fP
+    \fIh\fP := single hexadecimal digits (case insignificant)
+.De
+.\" End marker code here
+.LP
+Note that \fIh\fP indicates the value scaled in 4 bits, 
+\fIhh\fP the value scaled in 8 bits,
+\fIhhh\fP the value scaled in 12 bits,
+and \fIhhhh\fP the value scaled in 16 bits, respectively.
+.LP
+For backward compatibility, an older syntax for RGB Device is
+supported, but its continued use is not encouraged.
+The syntax is an initial sharp sign character followed by
+a numeric specification, in one of the following formats:
+.LP
+.TS
+l l.
+\&#RGB (4 bits each)
+\&#RRGGBB      (8 bits each)
+\&#RRRGGGBBB   (12 bits each)
+\&#RRRRGGGGBBBB        (16 bits each)
+.TE
+.LP
+The R, G, and B represent single hexadecimal digits.
+When fewer than 16 bits each are specified, 
+they represent the most significant bits of the value
+(unlike the ``rgb:'' syntax, in which values are scaled).
+For example, the string ``#3a7'' is the same as ``#3000a0007000''.
+.LP
+An RGB intensity specification is identified
+by the prefix ``rgbi:'' and conforms to the following syntax:
+.LP
+.\" Start marker code here
+.Ds 0
+rgbi:\fI<red>/<green>/<blue>\fP
+.De
+.\" End marker code here
+.LP
+Note that red, green, and blue are floating-point values
+between 0.0 and 1.0, inclusive.
+The input format for these values is an optional sign,
+a string of numbers possibly containing a decimal point,
+and an optional exponent field containing an E or e 
+followed by a possibly signed integer string.
+.LP
+The standard device-independent string specifications have
+the following syntax:
+.LP
+.\" Start marker code here
+.Ds 0
+CIEXYZ:\fI<X>/<Y>/<Z>\fP
+CIEuvY:\fI<u>/<v>/<Y>\fP
+CIExyY:\fI<x>/<y>/<Y>\fP
+CIELab:\fI<L>/<a>/<b>\fP
+CIELuv:\fI<L>/<u>/<v>\fP
+TekHVC:\fI<H>/<V>/<C>\fP
+.De
+.\" End marker code here
+.LP
+All of the values (C, H, V, X, Y, Z, a, b, u, v, y, x) are
+floating-point values.
+The syntax for these values is an optional plus or minus sign,
+a string of digits possibly containing a decimal point,
+and an optional exponent field consisting of an ``E'' or ``e''
+followed by an optional plus or minus followed by a string of digits.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadColor
+A value for a Colormap argument does not name a defined Colormap.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.SH "SEE ALSO"
+XAllocColor(__libmansuffix__),
+XCreateColormap(__libmansuffix__),
+XStoreColors(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XQueryColors.man b/man/XQueryColors.man
new file mode 100644 (file)
index 0000000..f0c2a90
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XQueryColor.__libmansuffix__
diff --git a/man/XQueryExtension.man b/man/XQueryExtension.man
new file mode 100644 (file)
index 0000000..bfc0964
--- /dev/null
@@ -0,0 +1,67 @@
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc
+.\"
+.\" Rewritten for X.org by Chris Lee <clee@freedesktop.org>
+.\"
+.\" Permission to use, copy, modify, distribute, and sell this documentation 
+.\" for any purpose and without fee is hereby granted, provided that the above
+.\" copyright notice and this permission notice appear in all copies.
+.\" Chris Lee makes no representations about the suitability for any purpose
+.\" of the information in this document.  It is provided \`\`as-is'' without
+.\" express or implied warranty.
+.\"
+.ds xL Programming with Xlib
+.TH XQueryExtension __libmansuffix__ __xorgversion__ "X FUNCTIONS"
+.SH NAME
+XQueryExtension, XListExtensions, XFreeExtensionList \- list available extensions
+.SH SYNTAX
+.HP
+Bool XQueryExtension(\^\fIdisplay, \fIname\fP, \fImajor_opcode_return\fP, \fIfirst_event_return\fP, \fIfirst_error_return\fP\^)
+.HP
+char **XListExtensions(\^\fIdisplay\fP, \fInextensions_return\fP\^)
+.HP
+XFreeExtensionList(\^\fIlist\fP\^)
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIname\fP 1i
+Specifies the extension name.
+.IP \fImajor_opcode_return\fP 1i
+Returns the major opcode.
+.IP \fIfirst_event_return\fP 1i
+Returns the first event code, if any.
+.IP \fIfirst_error_return\fP 1i
+Returns the first error code, if any.
+.IP \fInextensions_return\fP 1i
+Returns the number of extensions listed.
+.IP \fIlist\fP 1i
+Specifies the list of extension names.
+.SH DESCRIPTION
+.LP
+The \fIXQueryExtension\fP function determines if the named extension is
+present.  If the extension is not present, \fIXQueryExtension\fP returns
+\fIFalse\fP; otherwise, it returns \fITrue\fP.  If the extension is present,
+\fIXQueryExtension\fP returns the major opcode for the extension to
+major_opcode_return; otherwise, it returns zero.  Any minor opcode and the
+request formats are specific to the extension.  If the extension involves
+additional event types, \fIXQueryExtension\fP returns the base event type code
+to first_event_return; otherwise, it returns zero. The format of the events is
+specific to the extension.  If the extension involves additional error codes,
+\fIXQueryExtension\fP returns the base error code to first_error_return;
+otherwise, it returns zero.  The format of additional data in the errors is
+specific to the extension.  If the extension name is not in the Host Portable
+Character Encoding the result is implementation-dependent.  Uppercase and
+lowercase matter; the strings ``thing'', ``Thing'', and ``thinG'' are all
+considered different names.
+.LP
+The \fIXListExtensions\fP function returns a list of all extensions supported
+by the server. If the data returned by the server is in the Latin Portable
+Character Encoding, then the returned strings are in the Host Portable
+Character Encoding. Otherwise, the result is implementation-dependent.
+.LP
+The \fIXFreeExtensionList\fP function frees the memory allocated by
+\fIXListExtensions\fP.
diff --git a/man/XQueryFont.man b/man/XQueryFont.man
new file mode 100644 (file)
index 0000000..ca6fa1f
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XLoadFont.__libmansuffix__
diff --git a/man/XQueryKeymap.man b/man/XQueryKeymap.man
new file mode 100644 (file)
index 0000000..4434d01
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XChangeKeyboardControl.__libmansuffix__
diff --git a/man/XQueryPointer.man b/man/XQueryPointer.man
new file mode 100644 (file)
index 0000000..0550ddd
--- /dev/null
@@ -0,0 +1,219 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XQueryPointer __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XQueryPointer \- get pointer coordinates
+.SH SYNTAX
+.HP
+Bool XQueryPointer\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, Window
+*\fIroot_return\fP\^, Window *\fIchild_return\fP\^, int
+*\fIroot_x_return\fP\^, int *\fIroot_y_return\fP\^, int *\fIwin_x_return\fP\^,
+int *\fIwin_y_return\fP\^, unsigned int *\fImask_return\fP\^); 
+.SH ARGUMENTS
+.IP \fIchild_return\fP 1i
+Returns the child window that the pointer is located in, if any.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fImask_return\fP 1i
+Returns the current state of the modifier keys and pointer buttons.
+.ds Ro that the pointer is in
+.IP \fIroot_return\fP 1i
+Returns the root window \*(Ro.
+.IP \fIroot_x_return\fP 1i
+.br
+.ns
+.IP \fIroot_y_return\fP 1i
+Return the pointer coordinates relative to the root window's origin.
+.IP \fIw\fP 1i
+Specifies the window.
+.IP \fIwin_x_return\fP 1i
+.br
+.ns
+.IP \fIwin_y_return\fP 1i
+Return the pointer coordinates relative to the specified window.
+.SH DESCRIPTION
+The
+.ZN XQueryPointer
+function returns the root window the pointer is logically on and the pointer
+coordinates relative to the root window's origin.
+If
+.ZN XQueryPointer
+returns 
+.ZN False , 
+the pointer is not on the same screen as the specified window, and
+.ZN XQueryPointer
+returns 
+.ZN None
+to child_return and zero to win_x_return and win_y_return.
+If 
+.ZN XQueryPointer
+returns 
+.ZN True , 
+the pointer coordinates returned to win_x_return and win_y_return
+are relative to the origin of the specified window.
+In this case, 
+.ZN XQueryPointer
+returns the child that contains the pointer, if any,
+or else
+.ZN None
+to child_return.
+.LP
+.ZN XQueryPointer
+returns the current logical state of the keyboard buttons 
+and the modifier keys in mask_return.
+It sets mask_return to the bitwise inclusive OR of one or more
+of the button or modifier key bitmasks to match 
+the current state of the mouse buttons and the modifier keys.
+.LP
+.ZN XQueryPointer
+can generate a
+.ZN BadWindow 
+error.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XGetWindowAttributes(__libmansuffix__),
+XQueryTree(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XQueryTextExtents.man b/man/XQueryTextExtents.man
new file mode 100644 (file)
index 0000000..cbe0209
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XTextExtents.__libmansuffix__
diff --git a/man/XQueryTextExtents16.man b/man/XQueryTextExtents16.man
new file mode 100644 (file)
index 0000000..cbe0209
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XTextExtents.__libmansuffix__
diff --git a/man/XQueryTree.man b/man/XQueryTree.man
new file mode 100644 (file)
index 0000000..e5f6d78
--- /dev/null
@@ -0,0 +1,194 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XQueryTree __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XQueryTree \- query window tree information
+.SH SYNTAX
+.HP
+Status XQueryTree\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, Window
+*\fIroot_return\fP\^, Window *\fIparent_return\fP\^, Window
+**\fIchildren_return\fP\^, unsigned int *\fInchildren_return\fP\^); 
+.SH ARGUMENTS
+.IP \fIchildren_return\fP 1i
+Returns the list of children.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fInchildren_return\fP 1i
+Returns the number of children.
+.IP \fIparent_return\fP 1i
+Returns the parent window.
+.IP \fIroot_return\fP 1i
+Returns the root window.
+.ds Wi whose list of children, root, parent, and number of children \
+you want to obtain
+.IP \fIw\fP 1i
+Specifies the window \*(Wi.
+.SH DESCRIPTION
+The
+.ZN XQueryTree
+function returns the root ID, the parent window ID, 
+a pointer to the list of children windows
+(NULL when there are no children), 
+and the number of children in the list for the specified window.
+The children are listed in current stacking order, from bottom-most 
+(first) to top-most (last).
+.ZN XQueryTree
+returns zero if it fails and nonzero if it succeeds.
+To free a non-NULL children list when it is no longer needed, use 
+.ZN XFree .
+.LP
+.ZN XQueryTree
+can generate a
+.ZN BadWindow
+error.
+.SH BUGS
+This really should return a screen *, not a root window ID.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XFree(__libmansuffix__),
+XGetWindowAttributes(__libmansuffix__),
+XQueryPointer(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XRaiseWindow.man b/man/XRaiseWindow.man
new file mode 100644 (file)
index 0000000..3926b16
--- /dev/null
@@ -0,0 +1,346 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XRaiseWindow __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XRaiseWindow, XLowerWindow, XCirculateSubwindows, XCirculateSubwindowsUp, XCirculateSubwindowsDown, XRestackWindows \- change window stacking order
+.SH SYNTAX
+.HP
+int XRaiseWindow\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^); 
+.HP
+int XLowerWindow\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^); 
+.HP
+int XCirculateSubwindows\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, int
+\fIdirection\fP\^); 
+.HP
+int XCirculateSubwindowsUp\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^); 
+.HP
+int XCirculateSubwindowsDown\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^); 
+.HP
+int XRestackWindows\^(\^Display *\fIdisplay\fP\^, Window \fIwindows\fP\^[], int
+\fInwindows\fP\^); 
+.SH ARGUMENTS
+.IP \fIdirection\fP 1i
+Specifies the direction (up or down) that you want to circulate
+the window. 
+You can pass 
+.ZN RaiseLowest
+or
+.ZN LowerHighest .
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fInwindows\fP 1i
+Specifies the number of windows to be restacked.
+.IP \fIw\fP 1i
+Specifies the window.
+.IP \fIwindows\fP 1i
+Specifies an array containing the windows to be restacked.
+.SH DESCRIPTION
+The
+.ZN XRaiseWindow
+function
+raises the specified window to the top of the stack so that no sibling window
+obscures it.
+If the windows are regarded as overlapping sheets of paper stacked 
+on a desk,
+then raising a window is analogous to moving the sheet to the top of
+the stack but leaving its x and y location on the desk constant.
+Raising a mapped window may generate 
+.ZN Expose
+events for the window and any mapped subwindows that were formerly obscured.  
+.LP
+If the override-redirect attribute of the window is 
+.ZN False 
+and some
+other client has selected 
+.ZN SubstructureRedirectMask 
+on the parent, the X server generates a
+.ZN ConfigureRequest 
+event, and no processing is performed.
+Otherwise, the window is raised.
+.LP
+.ZN XRaiseWindow
+can generate a
+.ZN BadWindow 
+error.
+.LP
+The
+.ZN XLowerWindow
+function lowers the specified window to the bottom of the stack
+so that it does not obscure any sibling
+windows.
+If the windows are regarded as overlapping sheets of paper
+stacked on a desk, then lowering a window is analogous to moving the
+sheet to the bottom of the stack but leaving its x and y location on
+the desk constant.
+Lowering a mapped window will generate 
+.ZN Expose 
+events on any windows it formerly obscured.
+.LP
+If the override-redirect attribute of the window is 
+.ZN False 
+and some
+other client has selected 
+.ZN SubstructureRedirectMask 
+on the parent, the X server generates a
+.ZN ConfigureRequest 
+event, and no processing is performed.  
+Otherwise, the window is lowered to the bottom of the
+stack.
+.LP
+.ZN XLowerWindow
+can generate a
+.ZN BadWindow 
+error.
+.LP
+The
+.ZN XCirculateSubwindows
+function circulates children of the specified window in the specified 
+direction.
+If you specify
+.ZN RaiseLowest ,
+.ZN XCirculateSubwindows
+raises the lowest mapped child (if any) that is occluded 
+by another child to the top of the stack.
+If you specify
+.ZN LowerHighest ,
+.ZN XCirculateSubwindows
+lowers the highest mapped child (if any) that occludes another child
+to the bottom of the stack.
+Exposure processing is then performed on formerly obscured windows.
+If some other client has selected 
+.ZN SubstructureRedirectMask 
+on the window, the X server generates a 
+.ZN CirculateRequest 
+event, and no further processing is performed.
+If a child is actually restacked,
+the X server generates a
+.ZN CirculateNotify
+event. 
+.LP
+.ZN XCirculateSubwindows
+can generate
+.ZN BadValue
+and
+.ZN BadWindow 
+errors.
+.LP
+The
+.ZN XCirculateSubwindowsUp
+function raises the lowest mapped child of the specified window that
+is partially
+or completely
+occluded by another child.
+Completely unobscured children are not affected.
+This is a convenience function equivalent to
+.ZN XCirculateSubwindows
+with
+.ZN RaiseLowest
+specified.
+.LP
+.ZN XCirculateSubwindowsUp
+can generate a
+.ZN BadWindow 
+error.
+.LP
+The
+.ZN XCirculateSubwindowsDown
+function lowers the highest mapped child of the specified window that partially
+or completely occludes another child.
+Completely unobscured children are not affected.
+This is a convenience function equivalent to
+.ZN XCirculateSubwindows
+with
+.ZN LowerHighest
+specified.
+.LP
+.ZN XCirculateSubwindowsDown
+can generate a
+.ZN BadWindow 
+error.
+.LP
+The
+.ZN XRestackWindows
+function restacks the windows in the order specified,
+from top to bottom.
+The stacking order of the first window in the windows array is unaffected,
+but the other windows in the array are stacked underneath the first window,
+in the order of the array.
+The stacking order of the other windows is not affected.
+For each window in the window array that is not a sibling of the first window,
+a
+.ZN BadMatch
+error results.
+.LP
+If the override-redirect attribute of a window is 
+.ZN False 
+and some
+other client has selected 
+.ZN SubstructureRedirectMask 
+on the parent, the X server generates 
+.ZN ConfigureRequest 
+events for each window whose override-redirect flag is not set, 
+and no further processing is performed.
+Otherwise, the windows will be restacked in top-to-bottom order.
+.LP
+.ZN XRestackWindows
+can generate
+.ZN BadWindow 
+error.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XChangeWindowAttributes(__libmansuffix__),
+XConfigureWindow(__libmansuffix__),
+XCreateWindow(__libmansuffix__),
+XDestroyWindow(__libmansuffix__),
+XMapWindow(__libmansuffix__),
+XUnmapWindow(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XReadBitmapFile.man b/man/XReadBitmapFile.man
new file mode 100644 (file)
index 0000000..28fbf57
--- /dev/null
@@ -0,0 +1,356 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XReadBitmapFile __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XReadBitmapFile, XReadBitmapFileData, XWriteBitmapFile, XCreatePixmapFromBitmapData, XCreateBitmapFromData \- manipulate bitmaps
+.SH SYNTAX
+.HP
+int XReadBitmapFile(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, char
+*\fIfilename\fP\^, unsigned int *\fIwidth_return\fP, unsigned int
+*\fIheight_return\fP\^, Pixmap *\fIbitmap_return\fP\^, int
+*\fIx_hot_return\fP, int *\fIy_hot_return\fP\^); 
+.HP
+int XReadBitmapFileData(\^char *\fIfilename\fP\^, unsigned int
+*\fIwidth_return\fP, unsigned int *\fIheight_return\fP\^, unsigned char
+*\fIdata_return\fP\^, int *\fIx_hot_return\fP, int *\fIy_hot_return\fP\^); 
+.HP
+int XWriteBitmapFile(\^Display *\fIdisplay\fP\^, char *\fIfilename\fP\^,
+Pixmap \fIbitmap\fP\^, unsigned int \fIwidth\fP, unsigned int \fIheight\fP\^,
+int \fIx_hot\fP, int \fIy_hot\fP\^); 
+.HP
+Pixmap XCreatePixmapFromBitmapData\^(\^Display *\fIdisplay\fP\^, Drawable
+\fId\fP\^, char *\fIdata\fP\^, unsigned int \fIwidth\fP, unsigned int
+\fIheight\fP\^, unsigned long \fIfg\fP, unsigned long \fIbg\fP\^, unsigned int
+\fIdepth\fP\^); 
+.HP
+Pixmap XCreateBitmapFromData(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^,
+char *\fIdata\fP\^, unsigned int \fIwidth\fP, unsigned int \fIheight\fP\^); 
+.SH ARGUMENTS
+.IP \fIbitmap\fP 1i
+Specifies the bitmap.
+.IP \fIbitmap_return\fP 1i
+Returns the bitmap that is created.
+.ds Dr \ that indicates the screen
+.IP \fId\fP 1i
+Specifies the drawable\*(Dr. 
+.IP \fIdata\fP 1i
+Specifies the data in bitmap format.
+.IP \fIdata\fP 1i
+Specifies the location of the bitmap data.
+.IP \fIdata_return\fP 1i
+Returns the bitmap data.
+.IP \fIdepth\fP 1i
+Specifies the depth of the pixmap.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIfg\fP 1i
+.br
+.ns
+.IP \fIbg\fP 1i
+Specify the foreground and background pixel values to use.
+.IP \fIfilename\fP 1i
+Specifies the file name to use.
+The format of the file name is operating-system dependent.
+.IP \fIwidth\fP 1i
+.br
+.ns
+.IP \fIheight\fP 1i
+Specify the width and height.
+.IP \fIwidth_return\fP 1i
+.br
+.ns
+.IP \fIheight_return\fP 1i
+Return the width and height values of the read in bitmap file.
+.IP \fIx_hot\fP 1i
+.br
+.ns
+.IP \fIy_hot\fP 1i
+Specify where to place the hotspot coordinates (or \-1,\-1 if none are present)
+in the file.
+.IP \fIx_hot_return\fP 1i
+.br
+.ns
+.IP \fIy_hot_return\fP 1i
+Return the hotspot coordinates.
+.SH DESCRIPTION
+The
+.ZN XReadBitmapFile
+function reads in a file containing a bitmap.
+The file is parsed in the encoding of the current locale.
+The ability to read other than the standard format 
+is implementation-dependent.
+If the file cannot be opened, 
+.ZN XReadBitmapFile 
+returns 
+.ZN BitmapOpenFailed .  
+If the file can be opened but does not contain valid bitmap data, 
+it returns 
+.ZN BitmapFileInvalid .  
+If insufficient working storage is allocated,
+it returns
+.ZN BitmapNoMemory .  
+If the file is readable and valid,
+it returns 
+.ZN BitmapSuccess .
+.LP
+.ZN XReadBitmapFile 
+returns the bitmap's height and width, as read
+from the file, to width_return and height_return.
+It then creates a pixmap of the appropriate size, 
+reads the bitmap data from the file into the pixmap,
+and assigns the pixmap to the caller's variable bitmap.  
+The caller must free the bitmap using 
+.ZN XFreePixmap 
+when finished.
+If \fIname\fP_x_hot and \fIname\fP_y_hot exist,
+.ZN XReadBitmapFile 
+returns them to x_hot_return and y_hot_return;
+otherwise, it returns \-1,\-1.
+.LP
+.ZN XReadBitmapFile
+can generate
+.ZN BadAlloc
+and
+.ZN BadDrawable
+errors.
+.LP
+The
+.ZN XReadBitmapFileData
+function reads in a file containing a bitmap, in the same manner as
+.ZN XReadBitmapFile ,
+but returns the data directly rather than creating a pixmap in the server.
+The bitmap data is returned in data_return; the client must free this
+storage when finished with it by calling
+.ZN XFree .
+The status and other return values are the same as for
+.ZN XReadBitmapFile .
+.LP
+The
+.ZN XWriteBitmapFile
+function writes a bitmap out to a file in the X Version 11 format.
+The name used in the output file is derived from the file name
+by deleting the directory prefix.
+The file is written in the encoding of the current locale.
+If the file cannot be opened for writing, 
+it returns 
+.ZN BitmapOpenFailed .  
+If insufficient memory is allocated,
+.ZN XWriteBitmapFile
+returns
+.ZN BitmapNoMemory ;
+otherwise, on no error,
+it returns
+.ZN BitmapSuccess .
+If x_hot and y_hot are not \-1, \-1, 
+.ZN XWriteBitmapFile
+writes them out as the hotspot coordinates for the bitmap.
+.LP
+.ZN XWriteBitmapFile
+can generate
+.ZN BadDrawable
+and
+.ZN BadMatch
+errors.
+.LP
+The
+.ZN XCreatePixmapFromBitmapData
+function creates a pixmap of the given depth and then does a bitmap-format
+.ZN XPutImage
+of the data into it.
+The depth must be supported by the screen of the specified drawable,
+or a
+.ZN BadMatch
+error results.
+.LP
+.ZN XCreatePixmapFromBitmapData
+can generate
+.ZN BadAlloc
+and
+.ZN BadMatch
+errors.
+.LP
+The
+.ZN XCreateBitmapFromData
+function allows you to include in your C program (using
+.ZN #include )
+a bitmap file that was written out by
+.ZN XWriteBitmapFile
+(X version 11 format only) without reading in the bitmap file.
+The following example creates a gray bitmap:
+.LP
+.Ds 0
+\&#include "gray.bitmap"
+.sp 6p
+Pixmap bitmap;
+bitmap = XCreateBitmapFromData(display, window, gray_bits, gray_width, gray_height);
+.De
+.LP
+If insufficient working storage was allocated,
+.ZN XCreateBitmapFromData
+returns
+.ZN None .
+It is your responsibility to free the
+bitmap using
+.ZN XFreePixmap
+when finished.
+.LP
+.ZN XCreateBitmapFromData
+can generate a
+.ZN BadAlloc
+error.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadDrawable
+A value for a Drawable argument does not name a defined Window or Pixmap.
+.TP 1i
+.ZN BadMatch
+An
+.ZN InputOnly
+window is used as a Drawable.
+.SH "SEE ALSO"
+XCreatePixmap(__libmansuffix__),
+XPutImage(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XReadBitmapFileData.man b/man/XReadBitmapFileData.man
new file mode 100644 (file)
index 0000000..ff0c276
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XReadBitmapFile.__libmansuffix__
diff --git a/man/XRebindKeysym.man b/man/XRebindKeysym.man
new file mode 100644 (file)
index 0000000..37d1597
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XLookupKeysym.__libmansuffix__
diff --git a/man/XRecolorCursor.man b/man/XRecolorCursor.man
new file mode 100644 (file)
index 0000000..0a5608f
--- /dev/null
@@ -0,0 +1,232 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XRecolorCursor __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XRecolorCursor, XFreeCursor, XQueryBestCursor \- manipulate cursors
+.SH SYNTAX
+.HP
+int XRecolorCursor\^(\^Display *\fIdisplay\fP\^, Cursor \fIcursor\fP\^, XColor
+*\fIforeground_color\fP\^, XColor *\fIbackground_color\fP\^); 
+.HP
+int XFreeCursor\^(\^Display *\fIdisplay\fP\^, Cursor \fIcursor\fP\^); 
+.HP
+Status XQueryBestCursor\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^,
+unsigned int \fIwidth\fP\^, unsigned int \fIheight\fP\^, unsigned int
+*\fIwidth_return\fP\^, unsigned int *\fIheight_return\fP\^); 
+.SH ARGUMENTS
+.IP \fIbackground_color\fP 1i
+Specifies the RGB values for the background of the source.
+.IP \fIcursor\fP 1i
+Specifies the cursor. 
+.ds Dr , which indicates the screen
+.IP \fId\fP 1i
+Specifies the drawable\*(Dr. 
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIforeground_color\fP 1i
+Specifies the RGB values for the foreground of the source. 
+.ds Wh  of the cursor that you want the size information for
+.IP \fIwidth\fP 1i
+.br
+.ns
+.IP \fIheight\fP 1i
+Specify the width and height\*(Wh.
+.IP \fIwidth_return\fP 1i
+.br
+.ns
+.IP \fIheight_return\fP 1i
+Return the best width and height that is closest to the specified width 
+and height.
+.SH DESCRIPTION
+The
+.ZN XRecolorCursor
+function changes the color of the specified cursor, and
+if the cursor is being displayed on a screen,
+the change is visible immediately.
+The pixel members of the
+.ZN XColor
+structures are ignored; only the RGB values are used.
+.LP
+.ZN XRecolorCursor
+can generate a
+.ZN BadCursor 
+error.
+.LP
+The
+.ZN XFreeCursor
+function deletes the association between the cursor resource ID 
+and the specified cursor.
+The cursor storage is freed when no other resource references it.
+The specified cursor ID should not be referred to again.
+.LP
+.ZN XFreeCursor
+can generate a
+.ZN BadCursor 
+error.
+.LP
+Some displays allow larger cursors than other displays.
+The
+.ZN XQueryBestCursor
+function provides a way to find out what size cursors are actually
+possible on the display.
+.IN "Cursor" "limitations" 
+It returns the largest size that can be displayed.
+Applications should be prepared to use smaller cursors on displays that
+cannot support large ones.
+.LP
+.ZN XQueryBestCursor
+can generate a
+.ZN BadDrawable 
+error.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadCursor
+A value for a Cursor argument does not name a defined Cursor.
+.TP 1i
+.ZN BadDrawable
+A value for a Drawable argument does not name a defined Window or Pixmap.
+.SH "SEE ALSO"
+XCreateColormap(__libmansuffix__),
+XCreateFontCursor(__libmansuffix__),
+XDefineCursor(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XReconfigureWMWindow.man b/man/XReconfigureWMWindow.man
new file mode 100644 (file)
index 0000000..ad57b19
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XIconifyWindow.__libmansuffix__
diff --git a/man/XRectInRegion.man b/man/XRectInRegion.man
new file mode 100644 (file)
index 0000000..d2d2d03
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XEmptyRegion.__libmansuffix__
diff --git a/man/XRectangle.man b/man/XRectangle.man
new file mode 100644 (file)
index 0000000..9bb2a50
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XDrawRectangle.__libmansuffix__
diff --git a/man/XRefreshKeyboardMapping.man b/man/XRefreshKeyboardMapping.man
new file mode 100644 (file)
index 0000000..37d1597
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XLookupKeysym.__libmansuffix__
diff --git a/man/XRegisterIMInstantiateCallback.man b/man/XRegisterIMInstantiateCallback.man
new file mode 100644 (file)
index 0000000..6365409
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XOpenIM.__libmansuffix__
diff --git a/man/XRemoveConnectionWatch.man b/man/XRemoveConnectionWatch.man
new file mode 100644 (file)
index 0000000..c3e5bf0
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAddConnectionWatch.__libmansuffix__
diff --git a/man/XRemoveFromSaveSet.man b/man/XRemoveFromSaveSet.man
new file mode 100644 (file)
index 0000000..b690595
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XChangeSaveSet.__libmansuffix__
diff --git a/man/XRemoveHost.man b/man/XRemoveHost.man
new file mode 100644 (file)
index 0000000..13e833b
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAddHost.__libmansuffix__
diff --git a/man/XRemoveHosts.man b/man/XRemoveHosts.man
new file mode 100644 (file)
index 0000000..13e833b
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAddHost.__libmansuffix__
diff --git a/man/XReparentEvent.man b/man/XReparentEvent.man
new file mode 100644 (file)
index 0000000..fc67d43
--- /dev/null
@@ -0,0 +1,231 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XReparentEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XReparentEvent \- ReparentNotify event structure
+.SH STRUCTURES
+The structure for
+.ZN ReparentNotify
+events contains:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int type;       /\&* ReparentNotify */
+       unsigned long serial;   /\&* # of last request processed by server */
+       Bool send_event;        /\&* true if this came from a SendEvent request */
+       Display *display;       /\&* Display the event was read from */
+       Window event;
+       Window window;
+       Window parent;
+       int x, y;
+       Bool override_redirect;
+} XReparentEvent;
+.De
+.LP
+When you receive this event,
+the structure members are set as follows.
+.LP
+The type member is set to the event type constant name that uniquely identifies
+it.
+For example, when the X server reports a
+.ZN GraphicsExpose
+event to a client application, it sends an
+.ZN XGraphicsExposeEvent
+structure with the type member set to
+.ZN GraphicsExpose .
+The display member is set to a pointer to the display the event was read on.
+The send_event member is set to
+.ZN True
+if the event came from a
+.ZN SendEvent
+protocol request.
+The serial member is set from the serial number reported in the protocol
+but expanded from the 16-bit least-significant bits to a full 32-bit value.
+The window member is set to the window that is most useful to toolkit
+dispatchers.
+.LP
+The event member is set either to the reparented window
+or to the old or the new parent, depending on whether
+.ZN StructureNotify
+or
+.ZN SubstructureNotify
+was selected. 
+The window member is set to the window that was reparented.
+The parent member is set to the new parent window.
+The x and y members are set to the reparented window's coordinates relative 
+to the new parent window's
+origin and define the upper-left outer corner of the reparented window.
+The override_redirect member is set to the override-redirect attribute of the
+window specified by the window member.
+Window manager clients normally should ignore this window 
+if the override_redirect member is
+.ZN True .
+.SH "SEE ALSO"
+XAnyEvent(__libmansuffix__),
+XButtonEvent(__libmansuffix__),
+XCreateWindowEvent(__libmansuffix__),
+XCirculateEvent(__libmansuffix__),
+XCirculateRequestEvent(__libmansuffix__),
+XColormapEvent(__libmansuffix__),
+XConfigureEvent(__libmansuffix__),
+XConfigureRequestEvent(__libmansuffix__),
+XCrossingEvent(__libmansuffix__),
+XDestroyWindowEvent(__libmansuffix__),
+XErrorEvent(__libmansuffix__),
+XExposeEvent(__libmansuffix__),
+XFocusChangeEvent(__libmansuffix__),
+XGraphicsExposeEvent(__libmansuffix__),
+XGravityEvent(__libmansuffix__),
+XKeymapEvent(__libmansuffix__),
+XMapEvent(__libmansuffix__),
+XMapRequestEvent(__libmansuffix__),
+XPropertyEvent(__libmansuffix__),
+XResizeRequestEvent(__libmansuffix__),
+XSelectionClearEvent(__libmansuffix__),
+XSelectionEvent(__libmansuffix__),
+XSelectionRequestEvent(__libmansuffix__),
+XUnmapEvent(__libmansuffix__),
+XVisibilityEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XReparentWindow.man b/man/XReparentWindow.man
new file mode 100644 (file)
index 0000000..14653a7
--- /dev/null
@@ -0,0 +1,228 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XReparentWindow __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XReparentWindow \- reparent windows
+.SH SYNTAX
+.HP
+int XReparentWindow\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, Window
+\fIparent\fP\^, int \fIx\fP\^, int \fIy\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIparent\fP 1i
+Specifies the parent window.
+.IP \fIw\fP 1i
+Specifies the window.
+.ds Xy of the position in the new parent window
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.SH DESCRIPTION
+If the specified window is mapped,
+.ZN XReparentWindow
+automatically performs an
+.ZN UnmapWindow
+request on it, removes it from its current position in the hierarchy,
+and inserts it as the child of the specified parent.
+The window is placed in the stacking order on top with respect to
+sibling windows.
+.LP
+After reparenting the specified window,
+.ZN XReparentWindow
+causes the X server to generate a
+.ZN ReparentNotify
+event.
+The override_redirect member returned in this event is
+set to the window's corresponding attribute.
+Window manager clients usually should ignore this window if this member
+is set to
+.ZN True .
+Finally, if the specified window was originally mapped,
+the X server automatically performs a
+.ZN MapWindow
+request on it.
+.LP
+The X server performs normal exposure processing on formerly obscured
+windows.
+The X server might not generate 
+.ZN Expose 
+events for regions from the initial
+.ZN UnmapWindow
+request that are immediately obscured by the final
+.ZN MapWindow
+request.
+A
+.ZN BadMatch
+error results if:
+.IP \(bu 5
+The new parent window is not on the same screen as
+the old parent window.
+.IP \(bu 5
+The new parent window is the specified window or an inferior of the
+specified window.
+.IP \(bu 5
+The new parent is
+.ZN InputOnly ,
+and the window is not.
+.IP \(bu 5
+The specified window has a
+.ZN ParentRelative
+background, and the new parent window is not the same depth as the
+specified window.
+.LP
+.ZN XReparentWindow
+can generate
+.ZN BadMatch
+and
+.ZN BadWindow 
+errors.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XChangeSaveSet(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XResetScreenSaver.man b/man/XResetScreenSaver.man
new file mode 100644 (file)
index 0000000..13eba4e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetScreenSaver.__libmansuffix__
diff --git a/man/XResizeRequestEvent.man b/man/XResizeRequestEvent.man
new file mode 100644 (file)
index 0000000..291a410
--- /dev/null
@@ -0,0 +1,216 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XResizeRequestEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XResizeRequestEvent \- ResizeRequest event structure
+.SH STRUCTURES
+The structure for
+.ZN ResizeRequest
+events contains:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int type;       /\&* ResizeRequest */
+       unsigned long serial;   /\&* # of last request processed by server */
+       Bool send_event;        /\&* true if this came from a SendEvent request */
+       Display *display;       /\&* Display the event was read from */
+       Window window;
+       int width, height;
+} XResizeRequestEvent;
+.De
+.LP
+When you receive this event,
+the structure members are set as follows.
+.LP
+The type member is set to the event type constant name that uniquely identifies
+it.
+For example, when the X server reports a
+.ZN GraphicsExpose
+event to a client application, it sends an
+.ZN XGraphicsExposeEvent
+structure with the type member set to
+.ZN GraphicsExpose .
+The display member is set to a pointer to the display the event was read on.
+The send_event member is set to
+.ZN True
+if the event came from a
+.ZN SendEvent
+protocol request.
+The serial member is set from the serial number reported in the protocol
+but expanded from the 16-bit least-significant bits to a full 32-bit value.
+The window member is set to the window that is most useful to toolkit
+dispatchers.
+.LP
+The window member is set to the window whose size another 
+client attempted to change.
+The width and height members are set to the inside size of the window, 
+excluding the border.
+.SH "SEE ALSO"
+XAnyEvent(__libmansuffix__),
+XButtonEvent(__libmansuffix__),
+XCreateWindowEvent(__libmansuffix__),
+XCirculateEvent(__libmansuffix__),
+XCirculateRequestEvent(__libmansuffix__),
+XColormapEvent(__libmansuffix__),
+XConfigureEvent(__libmansuffix__),
+XConfigureRequestEvent(__libmansuffix__),
+XCrossingEvent(__libmansuffix__),
+XDestroyWindowEvent(__libmansuffix__),
+XErrorEvent(__libmansuffix__),
+XExposeEvent(__libmansuffix__),
+XFocusChangeEvent(__libmansuffix__),
+XGraphicsExposeEvent(__libmansuffix__),
+XGravityEvent(__libmansuffix__),
+XKeymapEvent(__libmansuffix__),
+XMapEvent(__libmansuffix__),
+XMapRequestEvent(__libmansuffix__),
+XPropertyEvent(__libmansuffix__),
+XReparentEvent(__libmansuffix__),
+XSelectionClearEvent(__libmansuffix__),
+XSelectionEvent(__libmansuffix__),
+XSelectionRequestEvent(__libmansuffix__),
+XUnmapEvent(__libmansuffix__),
+XVisibilityEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XResizeWindow.man b/man/XResizeWindow.man
new file mode 100644 (file)
index 0000000..4c16c27
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XConfigureWindow.__libmansuffix__
diff --git a/man/XResourceManagerString.man b/man/XResourceManagerString.man
new file mode 100644 (file)
index 0000000..50c1a25
--- /dev/null
@@ -0,0 +1,184 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XResourceManagerString __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XResourceManagerString, XScreenResourceString \- obtain server resource properties
+.SH SYNTAX
+.HP
+char *XResourceManagerString\^(\^Display *\fIdisplay\fP\^); 
+.HP
+char *XScreenResourceString\^(\^Screen *\fIscreen\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIscreen\fP 1i
+Specifies the screen.
+.SH DESCRIPTION
+The
+.ZN XResourceManagerString
+function returns the RESOURCE_MANAGER property from the server's root
+window of screen zero, which was returned when the connection was opened using
+.ZN XOpenDisplay .
+The property is converted from type STRING to the current locale.
+The conversion is identical to that produced by 
+.ZN XmbTextPropertyToTextList
+for a single element STRING property.
+The returned string is owned by Xlib and should not be freed by the client.
+The property value must be in a format that is acceptable to
+.ZN XrmGetStringDatabase .
+If no property exists, NULL is returned.
+.LP
+The
+.ZN XScreenResourceString
+function returns the SCREEN_RESOURCES property from the root window of the
+specified screen.
+The property is converted from type STRING to the current locale.
+The conversion is identical to that produced by 
+.ZN XmbTextPropertyToTextList
+for a single element STRING property.
+The property value must be in a format that is acceptable to
+.ZN XrmGetStringDatabase .
+If no property exists, NULL is returned.
+The caller is responsible for freeing the returned string by using
+.ZN XFree .
+.SH "SEE ALSO"
+\fI\*(xL\fP
diff --git a/man/XRestackWindows.man b/man/XRestackWindows.man
new file mode 100644 (file)
index 0000000..37f4b5f
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XRaiseWindow.__libmansuffix__
diff --git a/man/XRotateBuffers.man b/man/XRotateBuffers.man
new file mode 100644 (file)
index 0000000..03d3c46
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XStoreBytes.__libmansuffix__
diff --git a/man/XRotateWindowProperties.man b/man/XRotateWindowProperties.man
new file mode 100644 (file)
index 0000000..ce26c3d
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XGetWindowProperty.__libmansuffix__
diff --git a/man/XSaveContext.man b/man/XSaveContext.man
new file mode 100644 (file)
index 0000000..64481cc
--- /dev/null
@@ -0,0 +1,205 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSaveContext __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSaveContext, XFindContext, XDeleteContext, XUniqueContext \- associative look-up routines
+.SH SYNTAX
+.HP
+int XSaveContext(\^Display *\fIdisplay\fP\^, XID \fIrid\fP\^, XContext
+\fIcontext\fP\^, XPointer \fIdata\fP\^); 
+.HP
+int XFindContext(\^Display *\fIdisplay\fP\^, XID \fIrid\fP\^, XContext
+\fIcontext\fP\^, XPointer *\fIdata_return\fP\^); 
+.HP
+int XDeleteContext(\^Display *\fIdisplay\fP\^, XID \fIrid\fP, XContext
+\fIcontext\fP); 
+.LP
+XContext XUniqueContext(void); 
+.SH ARGUMENTS
+.IP \fIcontext\fP 1i
+Specifies the context type to which the data belongs. 
+.IP \fIdata\fP 1i
+Specifies the data to be associated with the window and type.
+.IP \fIdata_return\fP 1i
+Returns the data.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIrid\fP 1i
+Specifies the resource ID with which the data is associated.
+.SH DESCRIPTION
+If an entry with the specified resource ID and type already exists,
+.ZN XSaveContext
+overrides it with the specified context.
+The
+.ZN XSaveContext
+function returns a nonzero error code if an error has occurred
+and zero otherwise.
+Possible errors are
+.ZN XCNOMEM
+(out of memory).
+.LP
+Because it is a return value,
+the data is a pointer.
+The
+.ZN XFindContext
+function returns a nonzero error code if an error has occurred
+and zero otherwise.
+Possible errors are
+.ZN XCNOENT
+(context-not-found).
+.LP
+The
+.ZN XDeleteContext
+function deletes the entry for the given resource ID 
+and type from the data structure.
+This function returns the same error codes that
+.ZN XFindContext
+returns if called with the same arguments.
+.ZN XDeleteContext
+does not free the data whose address was saved.
+.LP
+The
+.ZN XUniqueContext
+function creates a unique context type that may be used in subsequent calls to
+.ZN XSaveContext .
+.SH "SEE ALSO"
+\fI\*(xL\fP
diff --git a/man/XScreenNumberOfScreen.man b/man/XScreenNumberOfScreen.man
new file mode 100644 (file)
index 0000000..1bb28e7
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/BlackPixelOfScreen.__libmansuffix__
diff --git a/man/XScreenResourceString.man b/man/XScreenResourceString.man
new file mode 100644 (file)
index 0000000..17d28f3
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XResourceManagerString.__libmansuffix__
diff --git a/man/XSegment.man b/man/XSegment.man
new file mode 100644 (file)
index 0000000..ae1ad04
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XDrawLine.__libmansuffix__
diff --git a/man/XSelectInput.man b/man/XSelectInput.man
new file mode 100644 (file)
index 0000000..39b7639
--- /dev/null
@@ -0,0 +1,212 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSelectInput __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSelectInput \- select input events
+.SH SYNTAX
+.HP
+int XSelectInput\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, long
+\fIevent_mask\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIevent_mask\fP 1i
+Specifies the event mask.
+.ds Wi whose events you are interested in
+.IP \fIw\fP 1i
+Specifies the window \*(Wi.
+.SH DESCRIPTION
+The
+.ZN XSelectInput
+function requests that the X server report the events associated with the 
+specified event mask.
+Initially, X will not report any of these events.
+Events are reported relative to a window.
+If a window is not interested in a device event, it usually propagates to
+the closest ancestor that is interested,
+unless the do_not_propagate mask prohibits it.
+.IN "Event" "propagation"
+.LP
+Setting the event-mask attribute of a window overrides any previous call
+for the same window but not for other clients.
+Multiple clients can select for the same events on the same window
+with the following restrictions:
+.IP \(bu 5
+Multiple clients can select events on the same window because their event masks
+are disjoint.
+When the X server generates an event, it reports it
+to all interested clients.
+.IP \(bu 5
+Only one client at a time can select
+.ZN CirculateRequest ,
+.ZN ConfigureRequest ,
+or
+.ZN MapRequest
+events, which are associated with
+the event mask
+.ZN SubstructureRedirectMask . 
+.IP \(bu 5
+Only one client at a time can select
+a
+.ZN ResizeRequest
+event, which is associated with
+the event mask
+.ZN ResizeRedirectMask . 
+.IP \(bu 5
+Only one client at a time can select a 
+.ZN ButtonPress 
+event, which is associated with
+the event mask
+.ZN ButtonPressMask .
+.LP
+The server reports the event to all interested clients.
+.LP
+.ZN XSelectInput
+can generate a
+.ZN BadWindow 
+error.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+\fI\*(xL\fP
diff --git a/man/XSelectionClearEvent.man b/man/XSelectionClearEvent.man
new file mode 100644 (file)
index 0000000..bf04e43
--- /dev/null
@@ -0,0 +1,221 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSelectionClearEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSelectionClearEvent \- SelectionClear event structure
+.SH STRUCTURES
+The structure for
+.ZN SelectionClear
+events contains:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int type;       /\&* SelectionClear */
+       unsigned long serial;   /\&* # of last request processed by server */
+       Bool send_event;        /\&* true if this came from a SendEvent request */
+       Display *display;       /\&* Display the event was read from */
+       Window window;
+       Atom selection;
+       Time time;
+} XSelectionClearEvent;
+.De
+.LP
+When you receive this event,
+the structure members are set as follows.
+.LP
+The type member is set to the event type constant name that uniquely identifies
+it.
+For example, when the X server reports a
+.ZN GraphicsExpose
+event to a client application, it sends an
+.ZN XGraphicsExposeEvent
+structure with the type member set to
+.ZN GraphicsExpose .
+The display member is set to a pointer to the display the event was read on.
+The send_event member is set to
+.ZN True
+if the event came from a
+.ZN SendEvent
+protocol request.
+The serial member is set from the serial number reported in the protocol
+but expanded from the 16-bit least-significant bits to a full 32-bit value.
+The window member is set to the window that is most useful to toolkit
+dispatchers.
+.LP
+The selection member is set to the selection atom.
+The time member is set to the last change time recorded for the 
+selection.
+The window member is the window that was specified by the current owner
+(the owner losing the selection) in its
+.ZN XSetSelectionOwner
+call.
+.SH "SEE ALSO"
+XAnyEvent(__libmansuffix__),
+XButtonEvent(__libmansuffix__),
+XCreateWindowEvent(__libmansuffix__),
+XCirculateEvent(__libmansuffix__),
+XCirculateRequestEvent(__libmansuffix__),
+XColormapEvent(__libmansuffix__),
+XConfigureEvent(__libmansuffix__),
+XConfigureRequestEvent(__libmansuffix__),
+XCrossingEvent(__libmansuffix__),
+XDestroyWindowEvent(__libmansuffix__),
+XErrorEvent(__libmansuffix__),
+XExposeEvent(__libmansuffix__),
+XFocusChangeEvent(__libmansuffix__),
+XGraphicsExposeEvent(__libmansuffix__),
+XGravityEvent(__libmansuffix__),
+XKeymapEvent(__libmansuffix__),
+XMapEvent(__libmansuffix__),
+XMapRequestEvent(__libmansuffix__),
+XPropertyEvent(__libmansuffix__),
+XReparentEvent(__libmansuffix__),
+XResizeRequestEvent(__libmansuffix__),
+XSelectionEvent(__libmansuffix__),
+XSelectionRequestEvent(__libmansuffix__),
+XSetSelectionOwner(__libmansuffix__),
+XUnmapEvent(__libmansuffix__),
+XVisibilityEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XSelectionEvent.man b/man/XSelectionEvent.man
new file mode 100644 (file)
index 0000000..618bb6a
--- /dev/null
@@ -0,0 +1,229 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSelectionEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSelectionEvent \- SelectionNotify event structure
+.SH STRUCTURES
+The structure for
+.ZN SelectionNotify
+events contains:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int type;       /\&* SelectionNotify */
+       unsigned long serial;   /\&* # of last request processed by server */
+       Bool send_event;        /\&* true if this came from a SendEvent request */
+       Display *display;       /\&* Display the event was read from */
+       Window requestor;
+       Atom selection;
+       Atom target;
+       Atom property;  /\&* atom or None */
+       Time time;
+} XSelectionEvent;
+.De
+.LP
+When you receive this event,
+the structure members are set as follows.
+.LP
+The type member is set to the event type constant name that uniquely identifies
+it.
+For example, when the X server reports a
+.ZN GraphicsExpose
+event to a client application, it sends an
+.ZN XGraphicsExposeEvent
+structure with the type member set to
+.ZN GraphicsExpose .
+The display member is set to a pointer to the display the event was read on.
+The send_event member is set to
+.ZN True
+if the event came from a
+.ZN SendEvent
+protocol request.
+The serial member is set from the serial number reported in the protocol
+but expanded from the 16-bit least-significant bits to a full 32-bit value.
+The window member is set to the window that is most useful to toolkit
+dispatchers.
+.LP
+The requestor member is set to the window associated with
+the requestor of the selection.
+The selection member is set to the atom that indicates the selection.
+For example, PRIMARY is used for the primary selection.
+The target member is set to the atom that indicates the converted type.
+For example, PIXMAP is used for a pixmap.
+The property member is set to the atom that indicates which
+property the result was stored on.
+If the conversion failed, 
+the property member is set to
+.ZN None .
+The time member is set to the time the conversion took place and
+can be a timestamp or
+.ZN CurrentTime .
+.SH "SEE ALSO"
+XAnyEvent(__libmansuffix__),
+XButtonEvent(__libmansuffix__),
+XCreateWindowEvent(__libmansuffix__),
+XCirculateEvent(__libmansuffix__),
+XCirculateRequestEvent(__libmansuffix__),
+XColormapEvent(__libmansuffix__),
+XConfigureEvent(__libmansuffix__),
+XConfigureRequestEvent(__libmansuffix__),
+XCrossingEvent(__libmansuffix__),
+XDestroyWindowEvent(__libmansuffix__),
+XErrorEvent(__libmansuffix__),
+XExposeEvent(__libmansuffix__),
+XFocusChangeEvent(__libmansuffix__),
+XGraphicsExposeEvent(__libmansuffix__),
+XGravityEvent(__libmansuffix__),
+XKeymapEvent(__libmansuffix__),
+XMapEvent(__libmansuffix__),
+XMapRequestEvent(__libmansuffix__),
+XPropertyEvent(__libmansuffix__),
+XReparentEvent(__libmansuffix__),
+XResizeRequestEvent(__libmansuffix__),
+XSelectionClearEvent(__libmansuffix__),
+XSelectionRequestEvent(__libmansuffix__),
+XUnmapEvent(__libmansuffix__),
+XVisibilityEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XSelectionRequestEvent.man b/man/XSelectionRequestEvent.man
new file mode 100644 (file)
index 0000000..6ec5cc1
--- /dev/null
@@ -0,0 +1,233 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSelectionRequestEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSelectionRequestEvent \- SelectionRequest event structure
+.SH STRUCTURES
+The structure for
+.ZN SelectionRequest
+events contains:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int type;       /\&* SelectionRequest */
+       unsigned long serial;   /\&* # of last request processed by server */
+       Bool send_event;        /\&* true if this came from a SendEvent request */
+       Display *display;       /\&* Display the event was read from */
+       Window owner;
+       Window requestor;
+       Atom selection;
+       Atom target;
+       Atom property;
+       Time time;
+} XSelectionRequestEvent;
+.De
+.LP
+When you receive this event,
+the structure members are set as follows.
+.LP
+The type member is set to the event type constant name that uniquely identifies
+it.
+For example, when the X server reports a
+.ZN GraphicsExpose
+event to a client application, it sends an
+.ZN XGraphicsExposeEvent
+structure with the type member set to
+.ZN GraphicsExpose .
+The display member is set to a pointer to the display the event was read on.
+The send_event member is set to
+.ZN True
+if the event came from a
+.ZN SendEvent
+protocol request.
+The serial member is set from the serial number reported in the protocol
+but expanded from the 16-bit least-significant bits to a full 32-bit value.
+The window member is set to the window that is most useful to toolkit
+dispatchers.
+.LP
+The owner member is set to the window
+that was specified by the current owner in its
+.ZN XSetSelectionOwner
+call.
+The requestor member is set to the window requesting the selection.
+The selection member is set to the atom that names the selection.
+For example, PRIMARY is used to indicate the primary selection.
+The target member is set to the atom that indicates the type
+the selection is desired in.
+The property member can be a property name or 
+.ZN None .
+The time member is set to the timestamp or 
+.ZN CurrentTime 
+value from the
+.ZN ConvertSelection
+request.
+.SH "SEE ALSO"
+XAnyEvent(__libmansuffix__),
+XButtonEvent(__libmansuffix__),
+XCreateWindowEvent(__libmansuffix__),
+XCirculateEvent(__libmansuffix__),
+XCirculateRequestEvent(__libmansuffix__),
+XColormapEvent(__libmansuffix__),
+XConfigureEvent(__libmansuffix__),
+XConfigureRequestEvent(__libmansuffix__),
+XCrossingEvent(__libmansuffix__),
+XDestroyWindowEvent(__libmansuffix__),
+XErrorEvent(__libmansuffix__),
+XExposeEvent(__libmansuffix__),
+XFocusChangeEvent(__libmansuffix__),
+XGraphicsExposeEvent(__libmansuffix__),
+XGravityEvent(__libmansuffix__),
+XKeymapEvent(__libmansuffix__),
+XMapEvent(__libmansuffix__),
+XMapRequestEvent(__libmansuffix__),
+XPropertyEvent(__libmansuffix__),
+XReparentEvent(__libmansuffix__),
+XResizeRequestEvent(__libmansuffix__),
+XSelectionClearEvent(__libmansuffix__),
+XSelectionEvent(__libmansuffix__),
+XSetSelectionOwner(__libmansuffix__),
+XUnmapEvent(__libmansuffix__),
+XVisibilityEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XSendEvent.man b/man/XSendEvent.man
new file mode 100644 (file)
index 0000000..7dcf99c
--- /dev/null
@@ -0,0 +1,314 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSendEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSendEvent, XDisplayMotionBufferSize, XGetMotionEvents, XTimeCoord \- send events and pointer motion history structure
+.SH SYNTAX
+.HP
+Status XSendEvent\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, Bool
+\fIpropagate\fP\^, long \fIevent_mask\fP\^, XEvent *\fIevent_send\fP\^); 
+.HP
+unsigned long XDisplayMotionBufferSize\^(\^Display *\fIdisplay\fP\^); 
+.HP
+XTimeCoord *XGetMotionEvents\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^,
+Time \fIstart\fP\^, Time \fIstop\fP\^, int *\fInevents_return\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIevent_mask\fP 1i
+Specifies the event mask.
+.IP \fIevent_send\fP 1i
+Specifies the event that is to be sent.
+.IP \fInevents_return\fP 1i
+Returns the number of events from the motion history buffer.
+.IP \fIpropagate\fP 1i
+Specifies a Boolean value.
+.IP \fIstart\fP 1i
+.br
+.ns
+.IP \fIstop\fP 1i
+Specify the time interval in which the events are returned from the motion
+history buffer.
+You can pass a timestamp or
+.ZN CurrentTime .
+.ds Wi the window the event is to be sent to,
+.ZN PointerWindow ,
+or
+.ZN InputFocus .
+.IP \fIw\fP 1i
+Specifies the window \*(Wi.
+.SH DESCRIPTION
+The
+.ZN XSendEvent
+function identifies the destination window, 
+determines which clients should receive the specified events, 
+and ignores any active grabs.
+This function requires you to pass an event mask.
+For a discussion of the valid event mask names,
+see section 10.3.
+This function uses the w argument to identify the destination window as follows:
+.IP \(bu 5
+If w is
+.ZN PointerWindow ,
+the destination window is the window that contains the pointer.
+.IP \(bu 5
+If w is
+.ZN InputFocus 
+and if the focus window contains the pointer, 
+the destination window is the window that contains the pointer; 
+otherwise, the destination window is the focus window.
+.LP
+To determine which clients should receive the specified events,
+.ZN XSendEvent
+uses the propagate argument as follows:
+.IP \(bu 5
+If event_mask is the empty set,
+the event is sent to the client that created the destination window.
+If that client no longer exists,
+no event is sent.
+.IP \(bu 5
+If propagate is 
+.ZN False ,
+the event is sent to every client selecting on destination any of the event
+types in the event_mask argument.
+.IP \(bu 5
+If propagate is 
+.ZN True 
+and no clients have selected on destination any of
+the event types in event-mask, the destination is replaced with the
+closest ancestor of destination for which some client has selected a
+type in event-mask and for which no intervening window has that type in its
+do-not-propagate-mask. 
+If no such window exists or if the window is
+an ancestor of the focus window and 
+.ZN InputFocus 
+was originally specified
+as the destination, the event is not sent to any clients.
+Otherwise, the event is reported to every client selecting on the final
+destination any of the types specified in event_mask.
+.LP
+The event in the
+.ZN XEvent
+structure must be one of the core events or one of the events
+defined by an extension (or a 
+.ZN BadValue
+error results) so that the X server can correctly byte-swap 
+the contents as necessary.  
+The contents of the event are
+otherwise unaltered and unchecked by the X server except to force send_event to
+.ZN True
+in the forwarded event and to set the serial number in the event correctly;
+therefore these fields
+and the display field are ignored by
+.ZN XSendEvent .
+.LP
+.ZN XSendEvent
+returns zero if the conversion to wire protocol format failed
+and returns nonzero otherwise.
+.ZN XSendEvent
+can generate
+.ZN BadValue 
+and
+.ZN BadWindow 
+errors.
+.LP
+The server may retain the recent history of the pointer motion
+and do so to a finer granularity than is reported by
+.ZN MotionNotify
+events.
+The
+.ZN XGetMotionEvents
+function makes this history available.
+.LP
+The
+.ZN XGetMotionEvents
+function returns all events in the motion history buffer that fall between the
+specified start and stop times, inclusive, and that have coordinates
+that lie within the specified window (including its borders) at its present
+placement.
+If the server does not support motion history, 
+if the start time is later than the stop time,
+or if the start time is in the future, 
+no events are returned;
+.ZN XGetMotionEvents
+returns NULL.
+If the stop time is in the future, it is equivalent to specifying
+.ZN CurrentTime .
+.ZN XGetMotionEvents
+can generate a
+.ZN BadWindow 
+error.
+.SH STRUCTURES
+The
+.ZN XTimeCoord
+structure contains:
+.LP
+.Ds 0
+.TA .5i
+.ta .5i
+typedef struct {
+       Time time;
+       short x, y;
+} XTimeCoord;
+.De
+.LP
+The time member is set to the time, in milliseconds. 
+The x and y members are set to the coordinates of the pointer and
+are reported relative to the origin
+of the specified window.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XAnyEvent(__libmansuffix__),
+XIfEvent(__libmansuffix__),
+XNextEvent(__libmansuffix__),
+XPutBackEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XSetAccessControl.man b/man/XSetAccessControl.man
new file mode 100644 (file)
index 0000000..13e833b
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAddHost.__libmansuffix__
diff --git a/man/XSetAfterFunction.man b/man/XSetAfterFunction.man
new file mode 100644 (file)
index 0000000..43b5ea1
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSynchronize.__libmansuffix__
diff --git a/man/XSetArcMode.man b/man/XSetArcMode.man
new file mode 100644 (file)
index 0000000..dc4e123
--- /dev/null
@@ -0,0 +1,242 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSetArcMode __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSetArcMode, XSetSubwindowMode, XSetGraphicsExposure \- GC convenience routines
+.SH SYNTAX
+.HP
+int XSetArcMode\^(\^Display *\fIdisplay\fP\^, GC \fIgc\fP\^, int
+\fIarc_mode\fP\^); 
+.HP
+int XSetSubwindowMode\^(\^Display *\fIdisplay\fP\^, GC \fIgc\fP\^, int
+\fIsubwindow_mode\fP\^); 
+.HP
+int XSetGraphicsExposures\^(\^Display *\fIdisplay\fP\^, GC \fIgc\fP\^, Bool
+\fIgraphics_exposures\fP\^); 
+.SH ARGUMENTS
+.IP \fIarc_mode\fP 1i
+Specifies the arc mode.
+You can pass
+.ZN ArcChord
+or
+.ZN ArcPieSlice .
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fIgraphics_exposures\fP 1i
+Specifies a Boolean value that indicates whether you want
+.ZN GraphicsExpose
+and
+.ZN NoExpose
+events to be reported when calling
+.ZN XCopyArea
+and
+.ZN XCopyPlane
+with this GC.
+.IP \fIsubwindow_mode\fP 1i
+Specifies the subwindow mode.
+You can pass
+.ZN ClipByChildren
+or
+.ZN IncludeInferiors .
+.SH DESCRIPTION
+The
+.ZN XSetArcMode
+function sets the arc mode in the specified GC.
+.LP
+.ZN XSetArcMode
+can generate
+.ZN BadAlloc ,
+.ZN BadGC ,
+and
+.ZN BadValue 
+errors.
+.LP
+The
+.ZN XSetSubwindowMode
+function sets the subwindow mode in the specified GC.
+.LP
+.ZN XSetSubwindowMode
+can generate
+.ZN BadAlloc ,
+.ZN BadGC ,
+and
+.ZN BadValue 
+errors.
+.LP
+The
+.ZN XSetGraphicsExposures
+function sets the graphics-exposures flag in the specified GC.
+.LP
+.ZN XSetGraphicsExposures
+can generate
+.ZN BadAlloc ,
+.ZN BadGC ,
+and
+.ZN BadValue 
+errors.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadGC
+A value for a GContext argument does not name a defined GContext.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.SH "SEE ALSO"
+XCopyArea(__libmansuffix__),
+XCreateGC(__libmansuffix__),
+XQueryBestSize(__libmansuffix__),
+XSetClipOrigin(__libmansuffix__),
+XSetFillStyle(__libmansuffix__),
+XSetFont(__libmansuffix__),
+XSetLineAttributes(__libmansuffix__),
+XSetState(__libmansuffix__),
+XSetTile(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XSetBackground.man b/man/XSetBackground.man
new file mode 100644 (file)
index 0000000..08ff447
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetState.__libmansuffix__
diff --git a/man/XSetClassHint.man b/man/XSetClassHint.man
new file mode 100644 (file)
index 0000000..02d6722
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAllocClassHint.__libmansuffix__
diff --git a/man/XSetClipMask.man b/man/XSetClipMask.man
new file mode 100644 (file)
index 0000000..c028d47
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetClipOrigin.__libmansuffix__
diff --git a/man/XSetClipOrigin.man b/man/XSetClipOrigin.man
new file mode 100644 (file)
index 0000000..83decc7
--- /dev/null
@@ -0,0 +1,294 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSetClipOrigin __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSetClipOrigin, XSetClipMask, XSetClipRectangles \- GC convenience routines
+.SH SYNTAX
+.HP
+int XSetClipOrigin\^(\^Display *\fIdisplay\fP\^, GC \fIgc\fP\^, int
+\fIclip_x_origin\fP\^, int \fIclip_y_origin\fP\^); 
+.HP
+int XSetClipMask\^(\^Display *\fIdisplay\fP\^, GC \fIgc\fP\^, Pixmap
+\fIpixmap\fP\^); 
+.HP
+int XSetClipRectangles\^(\^Display *\fIdisplay\fP\^, GC \fIgc\fP\^, int
+\fIclip_x_origin\fP\^, int \fIclip_y_origin\fP\^, XRectangle
+\fIrectangles\fP[]\^, int \fIn\fP\^, int \fIordering\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIclip_x_origin\fP 1i
+.br
+.ns
+.IP \fIclip_y_origin\fP 1i
+Specify the x and y coordinates of the clip-mask origin.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fIn\fP 1i
+Specifies the number of rectangles. 
+.IP \fIordering\fP 1i
+Specifies the ordering relations on the rectangles.
+You can pass
+.ZN Unsorted ,
+.ZN YSorted ,
+.ZN YXSorted ,
+or
+.ZN YXBanded .
+.IP \fIpixmap\fP 1i
+Specifies the pixmap or
+.ZN None .
+.IP \fIrectangles\fP 1i
+Specifies an array of rectangles that define the clip-mask.
+.SH DESCRIPTION
+The
+.ZN XSetClipOrigin
+function sets the clip origin in the specified GC.
+The clip-mask origin is interpreted relative to the origin of whatever
+destination drawable is specified in the graphics request.
+.LP
+.ZN XSetClipOrigin
+can generate
+.ZN BadAlloc
+and
+.ZN BadGC 
+errors.
+.LP
+The
+.ZN XSetClipMask
+function sets the clip-mask in the specified GC to the specified pixmap.
+If the clip-mask is set to
+.ZN None ,
+the pixels are are always drawn (regardless of the clip-origin).
+.LP
+.ZN XSetClipMask
+can generate
+.ZN BadAlloc ,
+.ZN BadGC ,
+.ZN BadMatch ,
+and
+.ZN BadValue 
+errors.
+.LP
+The
+.ZN XSetClipRectangles
+function changes the clip-mask in the specified GC 
+to the specified list of rectangles and sets the clip origin.
+The output is clipped to remain contained within the
+rectangles.
+The clip-origin is interpreted relative to the origin of
+whatever destination drawable is specified in a graphics request.  
+The rectangle coordinates are interpreted relative to the clip-origin.  
+The rectangles should be nonintersecting, or the graphics results will be
+undefined.
+Note that the list of rectangles can be empty, 
+which effectively disables output.
+This is the opposite of passing
+.ZN None
+as the clip-mask in
+.ZN XCreateGC ,
+.ZN XChangeGC ,
+and
+.ZN XSetClipMask .
+.LP
+If known by the client, ordering relations on the rectangles can be
+specified with the ordering argument. 
+This may provide faster operation
+by the server. 
+If an incorrect ordering is specified, the X server may generate a
+.ZN BadMatch
+error, but it is not required to do so.
+If no error is generated, the graphics
+results are undefined.
+.ZN Unsorted 
+means the rectangles are in arbitrary order.
+.ZN YSorted 
+means that the rectangles are nondecreasing in their Y origin.
+.ZN YXSorted 
+additionally constrains 
+.ZN YSorted 
+order in that all
+rectangles with an equal Y origin are nondecreasing in their X
+origin.  
+.ZN YXBanded 
+additionally constrains 
+.ZN YXSorted 
+by requiring that,
+for every possible Y scanline, all rectangles that include that
+scanline have an identical Y origins and Y extents.
+.LP
+.ZN XSetClipRectangles
+can generate
+.ZN BadAlloc ,
+.ZN BadGC ,
+.ZN BadMatch ,
+and
+.ZN BadValue 
+errors.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadGC
+A value for a GContext argument does not name a defined GContext.
+.TP 1i
+.ZN BadMatch
+Some argument or pair of arguments has the correct type and range but fails
+to match in some other way required by the request.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.SH "SEE ALSO"
+XCreateGC(__libmansuffix__),
+XDrawRectangle(__libmansuffix__),
+XQueryBestSize(__libmansuffix__),
+XSetArcMode(__libmansuffix__),
+XSetFillStyle(__libmansuffix__),
+XSetFont(__libmansuffix__),
+XSetLineAttributes(__libmansuffix__),
+XSetState(__libmansuffix__),
+XSetTile(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XSetClipRectangles.man b/man/XSetClipRectangles.man
new file mode 100644 (file)
index 0000000..c028d47
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetClipOrigin.__libmansuffix__
diff --git a/man/XSetCloseDownMode.man b/man/XSetCloseDownMode.man
new file mode 100644 (file)
index 0000000..27405c4
--- /dev/null
@@ -0,0 +1,220 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSetCloseDownMode __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSetCloseDownMode, XKillClient \- control clients
+.SH SYNTAX
+.HP
+int XSetCloseDownMode\^(\^Display *\fIdisplay\fP\^, int \fIclose_mode\fP\^); 
+.HP
+int XKillClient\^(\^Display *\fIdisplay\fP\^, XID \fIresource\fP\^); 
+.SH ARGUMENTS
+.IP \fIclose_mode\fP 1i
+Specifies the client close-down mode.
+You can pass 
+.ZN DestroyAll , 
+.ZN RetainPermanent , 
+or
+.ZN RetainTemporary . 
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIresource\fP 1i
+Specifies any resource associated with the client that you want to destroy or
+.ZN AllTemporary .
+.SH DESCRIPTION
+The
+.ZN XSetCloseDownMode
+defines what will happen to the client's resources at connection close.
+A connection starts in
+.ZN DestroyAll
+mode.
+For information on what happens to the client's resources when the
+close_mode argument is
+.ZN RetainPermanent
+or
+.ZN RetainTemporary ,
+see section 2.6.
+.LP
+.ZN XSetCloseDownMode
+can generate a
+.ZN BadValue 
+error.
+.LP
+The
+.ZN XKillClient
+function
+forces a close down of the client
+that created the resource
+if a valid resource is specified.
+If the client has already terminated in
+either 
+.ZN RetainPermanent 
+or 
+.ZN RetainTemporary 
+mode, all of the client's
+resources are destroyed.
+If 
+.ZN AllTemporary 
+is specified, the resources of all clients that have terminated in
+.ZN RetainTemporary 
+are destroyed (see section 2.5).
+This permits implementation of window manager facilities that aid debugging.
+A client can set its close-down mode to
+.ZN RetainTemporary .
+If the client then crashes,
+its windows would not be destroyed. 
+The programmer can then inspect the application's window tree 
+and use the window manager to destroy the zombie windows.
+.LP
+.ZN XKillClient
+can generate a
+.ZN BadValue 
+error.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.SH "SEE ALSO"
+\fI\*(xL\fP
diff --git a/man/XSetCommand.man b/man/XSetCommand.man
new file mode 100644 (file)
index 0000000..86caed3
--- /dev/null
@@ -0,0 +1,224 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSetCommand __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSetCommand, XGetCommand \- set or read a window's WM_COMMAND property
+.SH SYNTAX
+.HP
+int XSetCommand\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, char
+**\fIargv\fP\^, int \fIargc\fP\^); 
+.HP
+Status XGetCommand\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, char
+***\fIargv_return\fP\^, int *\fIargc_return\fP\^); 
+.SH ARGUMENTS
+.IP \fIargc\fP 1i
+Specifies the number of arguments.
+.IP \fIargc_return\fP 1i
+Returns the number of arguments returned.
+.IP \fIargv\fP 1i
+Specifies the application's argument list.
+.IP \fIargv_return\fP 1i
+Returns the application's argument list.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIw\fP 1i
+Specifies the window.
+.SH DESCRIPTION
+The
+.ZN XSetCommand
+function sets the command and arguments used to invoke the
+application.
+(Typically, argv is the argv array of your main program.)
+If the strings are not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+.LP
+.ZN XSetCommand
+can generate
+.ZN BadAlloc
+and
+.ZN BadWindow 
+errors.
+.LP
+The 
+.ZN XGetCommand 
+function reads the WM_COMMAND property from the specified window 
+and returns a string list.
+If the WM_COMMAND property exists, 
+it is of type STRING and format 8.
+If sufficient memory can be allocated to contain the string list, 
+.ZN XGetCommand
+fills in the argv_return and argc_return arguments
+and returns a nonzero status.
+Otherwise, or if any other error is encountered, it returns a zero status.
+If the data returned by the server is in the Latin Portable Character Encoding,
+then the returned strings are in the Host Portable Character Encoding.
+Otherwise, the result is implementation-dependent.
+To free the memory allocated to the string list, use
+.ZN XFreeStringList .
+.SH PROPERTIES
+.TP 1i
+\s-1WM_COMMAND\s+1
+The command and arguments, null-separated, used to invoke the
+application.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XAllocClassHint(__libmansuffix__),
+XAllocIconSize(__libmansuffix__),
+XAllocSizeHints(__libmansuffix__),
+XAllocWMHints(__libmansuffix__),
+XSetTransientForHint(__libmansuffix__),
+XSetTextProperty(__libmansuffix__),
+XSetWMClientMachine(__libmansuffix__),
+XSetWMColormapWindows(__libmansuffix__),
+XSetWMIconName(__libmansuffix__),
+XSetWMName(__libmansuffix__),
+XSetWMProperties(__libmansuffix__),
+XSetWMProtocols(__libmansuffix__),
+XStringListToTextProperty(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XSetDashes.man b/man/XSetDashes.man
new file mode 100644 (file)
index 0000000..179e674
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetLineAttributes.__libmansuffix__
diff --git a/man/XSetErrorHandler.man b/man/XSetErrorHandler.man
new file mode 100644 (file)
index 0000000..c601837
--- /dev/null
@@ -0,0 +1,275 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSetErrorHandler __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSetErrorHandler, XGetErrorText, XDisplayName, XSetIOErrorHandler, XGetErrorDatabaseText \- default error handlers
+.SH SYNTAX
+.HP
+int (*XSetErrorHandler\^(\^int (\^*\^\fIhandler\fP\^)\^(Display *, XErrorEvent
+*)\^)\^)\^(\^); 
+.HP
+int XGetErrorText\^(\^Display *\fIdisplay\fP\^, int \fIcode\fP\^, char
+*\fIbuffer_return\fP\^, int \fIlength\fP\^); 
+.HP
+char *XDisplayName\^(\^char *\fIstring\fP\^); 
+.HP
+int (*XSetIOErrorHandler\^(\^int (\^*\^\fIhandler\fP\^)(Display
+*)\^)\^)\^(\^); 
+.HP
+int XGetErrorDatabaseText\^(\^Display *\fIdisplay\fP\^, char *\fIname\fP, char
+*\fImessage\fP\^, char *\fIdefault_string\fP\^, char *\fIbuffer_return\fP\^,
+int \fIlength\fP\^); 
+.SH ARGUMENTS
+.IP \fIbuffer_return\fP 1i
+Returns the error description.
+.IP \fIcode\fP 1i
+Specifies the error code for which you want to obtain a description.
+.IP \fIdefault_string\fP 1i
+Specifies the default error message if none is found in the database.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIhandler\fP 1i
+Specifies the program's supplied error handler.
+.IP \fIlength\fP 1i
+Specifies the size of the buffer.
+.IP \fImessage\fP 1i
+Specifies the type of the error message.
+.IP \fIname\fP 1i
+Specifies the name of the application.
+.IP \fIstring\fP 1i
+Specifies the character string.
+.SH DESCRIPTION
+Xlib generally calls the program's
+supplied error handler whenever an error is received.
+It is not called on
+.ZN BadName
+errors from
+.ZN OpenFont ,
+.ZN LookupColor ,
+or
+.ZN AllocNamedColor
+protocol requests or on
+.ZN BadFont
+errors from a
+.ZN QueryFont
+protocol request.
+These errors generally are reflected back to the program through the
+procedural interface.
+Because this condition is not assumed to be fatal, 
+it is acceptable for your error handler to return;
+the returned value is ignored.
+However, the error handler should not
+call any functions (directly or indirectly) on the display
+that will generate protocol requests or that will look for input events.
+The previous error handler is returned.
+.LP
+The
+.ZN XGetErrorText
+function copies a null-terminated string describing the specified error code
+into the specified buffer.
+The returned text is in the encoding of the current locale.
+It is recommended that you use this function to obtain an error description
+because extensions to Xlib may define their own error codes
+and error strings.
+.LP
+The
+.ZN XDisplayName
+function returns the name of the display that 
+.ZN XOpenDisplay
+would attempt to use.
+If a NULL string is specified,
+.ZN XDisplayName
+looks in the environment for the display and returns the display name that
+.ZN XOpenDisplay
+would attempt to use.
+This makes it easier to report to the user precisely which display the
+program attempted to open when the initial connection attempt failed.
+.LP
+The
+.ZN XSetIOErrorHandler
+sets the fatal I/O error handler.
+Xlib calls the program's supplied error handler if any sort of system call
+error occurs (for example, the connection to the server was lost).
+This is assumed to be a fatal condition,
+and the called routine should not return.
+If the I/O error handler does return,
+the client process exits.
+.LP
+Note that the previous error handler is returned.
+.LP
+The
+.ZN XGetErrorDatabaseText
+function returns a null-terminated message
+(or the default message) from the error message
+database.
+Xlib uses this function internally to look up its error messages.
+The text in the default_string argument is assumed
+to be in the encoding of the current locale,
+and the text stored in the buffer_return argument
+is in the encoding of the current locale.
+.LP
+The name argument should generally be the name of your application.
+The message argument should indicate which type of error message you want.
+If the name and message are not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+Xlib uses three predefined ``application names'' to report errors.
+In these names,
+uppercase and lowercase matter.
+.IP XProtoError 1i
+The protocol error number is used as a string for the message argument.
+.IP XlibMessage 1i
+These are the message strings that are used internally by the library.
+.IP XRequest 1i
+For a core protocol request,
+the major request protocol number is used for the message argument.
+For an extension request,
+the extension name (as given by
+.ZN InitExtension )
+followed by a period (\.) and the minor request protocol number 
+is used for the message argument.
+If no string is found in the error database,
+the default_string is returned to the buffer argument.
+.SH "SEE ALSO"
+XOpenDisplay(__libmansuffix__),
+XSynchronize(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XSetEventQueueOwner.man b/man/XSetEventQueueOwner.man
new file mode 100644 (file)
index 0000000..d9740d4
--- /dev/null
@@ -0,0 +1,58 @@
+.\" Copyright \(co 2006 Josh Triplett
+.\"
+.\" 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.
+.\"
+.TH XSetEventQueueOwner __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSetEventQueueOwner \- set event queue owner on a shared Xlib/XCB connection
+.SH SYNTAX
+.HP
+ #include <X11/Xlib-xcb.h>
+.HP
+void XSetEventQueueOwner(Display *\fIdpy\fP, enum XEventQueueOwner \fIowner\fP); 
+.SH ARGUMENTS
+.IP \fIdpy\fP 1i
+Specifies the connection to the X server.
+.IP \fIowner\fP 1i
+Specifies the event queue ownership:
+.RS
+.TP
+\fIXlibOwnsEventQueue\fP (default)
+Xlib owns the event queue.  Use the Xlib event-handling functions.  Do not
+call the XCB event-handling functions.
+.TP
+\fIXCBOwnsEventQueue\fP
+XCB owns the event queue.  Use the XCB event-handling functions.  Do not call
+the Xlib event-handling functions.
+.RE
+.IN "Environment" "DISPLAY"
+.SH DESCRIPTION
+While a client using Xlib/XCB can issue requests and handle their replies or
+errors with either Xlib or XCB, only one can own and handle the event queue.
+By default, Xlib must own the event queue, for compatibility with legacy Xlib
+clients.  Clients can call \fIXSetEventQueueOwner\fP immediately after
+\fIXOpenDisplay\fP to let XCB own the event queue instead.  Clients may not
+call \fIXSetEventQueueOwner\fP at any other time, as this will potentially
+lose responses.
+.SH "SEE ALSO"
+XOpenDisplay(__libmansuffix__),
+XGetXCBConnection(__libmansuffix__),
+.br
+\fIXlib \- C Language X Interface\fP
diff --git a/man/XSetFillRule.man b/man/XSetFillRule.man
new file mode 100644 (file)
index 0000000..52941d0
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetFillStyle.__libmansuffix__
diff --git a/man/XSetFillStyle.man b/man/XSetFillStyle.man
new file mode 100644 (file)
index 0000000..3de363c
--- /dev/null
@@ -0,0 +1,218 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSetFillStyle __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSetFillStyle, XSetFillRule \- GC convenience routines
+.SH SYNTAX
+.HP
+int XSetFillStyle\^(\^Display *\fIdisplay\fP\^, GC \fIgc\fP\^, int
+\fIfill_style\fP\^); 
+.HP
+int XSetFillRule\^(\^Display *\fIdisplay\fP\^, GC \fIgc\fP\^, int
+\fIfill_rule\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIfill_rule\fP 1i
+Specifies the fill-rule you want to set for the specified GC.
+You can pass 
+.ZN EvenOddRule
+or
+.ZN WindingRule .
+.IP \fIfill_style\fP 1i
+Specifies the fill-style you want to set for the specified GC.
+You can pass
+.ZN FillSolid ,
+.ZN FillTiled ,
+.ZN FillStippled ,
+or
+.ZN FillOpaqueStippled .
+.IP \fIgc\fP 1i
+Specifies the GC.
+.SH DESCRIPTION
+The
+.ZN XSetFillStyle
+function sets the fill-style in the specified GC.
+.LP
+.ZN XSetFillStyle
+can generate
+.ZN BadAlloc ,
+.ZN BadGC ,
+and
+.ZN BadValue 
+errors.
+.LP
+The
+.ZN XSetFillRule
+function sets the fill-rule in the specified GC.
+.LP
+.ZN XSetFillRule
+can generate
+.ZN BadAlloc ,
+.ZN BadGC ,
+and
+.ZN BadValue 
+errors.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadGC
+A value for a GContext argument does not name a defined GContext.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.SH "SEE ALSO"
+XCreateGC(__libmansuffix__),
+XQueryBestSize(__libmansuffix__),
+XSetArcMode(__libmansuffix__),
+XSetClipOrigin(__libmansuffix__),
+XSetFont(__libmansuffix__),
+XSetLineAttributes(__libmansuffix__),
+XSetState(__libmansuffix__),
+XSetTile(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XSetFont.man b/man/XSetFont.man
new file mode 100644 (file)
index 0000000..7021959
--- /dev/null
@@ -0,0 +1,187 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSetFont __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSetFont \- GC convenience routines
+.SH SYNTAX
+.HP
+int XSetFont\^(\^Display *\fIdisplay\fP\^, GC \fIgc\fP\^, Font \fIfont\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIfont\fP 1i
+Specifies the font.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.SH DESCRIPTION
+The
+.ZN XSetFont
+function sets the current font in the specified GC.
+.LP
+.ZN XSetFont
+can generate
+.ZN BadAlloc ,
+.ZN BadFont ,
+and
+.ZN BadGC 
+errors.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadFont
+A value for a Font or GContext argument does not name a defined Font.
+.TP 1i
+.ZN BadGC
+A value for a GContext argument does not name a defined GContext.
+.SH "SEE ALSO"
+XCreateGC(__libmansuffix__),
+XQueryBestSize(__libmansuffix__),
+XSetArcMode(__libmansuffix__),
+XSetClipOrigin(__libmansuffix__),
+XSetFillStyle(__libmansuffix__),
+XSetLineAttributes(__libmansuffix__),
+XSetState(__libmansuffix__),
+XSetTile(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XSetFontPath.man b/man/XSetFontPath.man
new file mode 100644 (file)
index 0000000..b2336f6
--- /dev/null
@@ -0,0 +1,213 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSetFontPath __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSetFontPath, XGetFontPath, XFreeFontPath \- set, get, or free the font search path
+.SH SYNTAX
+int XSetFontPath\^(\^Display *\fIdisplay\fP\^, char **\fIdirectories\fP\^, int
+\fIndirs\fP\^); 
+.HP
+char **XGetFontPath\^(\^Display *\fIdisplay\fP\^, int *\fInpaths_return\fP\^);
+.HP
+int XFreeFontPath\^(\^char **\fIlist\fP\^); 
+.SH ARGUMENTS
+.IP \fIdirectories\fP 1i
+Specifies the directory path used to look for a font.
+Setting the path to the empty list restores the default path defined
+for the X server.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIlist\fP 1i
+Specifies the array of strings you want to free.
+.IP \fIndirs\fP 1i
+Specifies the number of directories in the path.
+.IP \fInpaths_return\fP 1i
+Returns the number of strings in the font path array.
+.SH DESCRIPTION
+The
+.ZN XSetFontPath
+function defines the directory search path for font lookup.
+There is only one search path per X server, not one per client.
+The encoding and interpretation of the strings are implementation-dependent,
+but typically they specify directories or font servers to be searched 
+in the order listed.
+An X server is permitted to cache font information internally;
+for example, it might cache an entire font from a file and not
+check on subsequent opens of that font to see if the underlying
+font file has changed.
+However,
+when the font path is changed,
+the X server is guaranteed to flush all cached information about fonts 
+for which there currently are no explicit resource IDs allocated.
+The meaning of an error from this request is implementation-dependent.
+.LP
+.ZN XSetFontPath
+can generate a
+.ZN BadValue 
+error.
+.LP
+The
+.ZN XGetFontPath
+function allocates and returns an array of strings containing the search path.
+The contents of these strings are implementation-dependent
+and are not intended to be interpreted by client applications.
+When it is no longer needed,
+the data in the font path should be freed by using
+.ZN XFreeFontPath .
+.LP
+The
+.ZN XFreeFontPath
+function
+frees the data allocated by
+.ZN XGetFontPath .
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.SH "SEE ALSO"
+XListFont(__libmansuffix__),
+XLoadFonts(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XSetForeground.man b/man/XSetForeground.man
new file mode 100644 (file)
index 0000000..08ff447
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetState.__libmansuffix__
diff --git a/man/XSetFunction.man b/man/XSetFunction.man
new file mode 100644 (file)
index 0000000..08ff447
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetState.__libmansuffix__
diff --git a/man/XSetGraphicsExposure.man b/man/XSetGraphicsExposure.man
new file mode 100644 (file)
index 0000000..5580581
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetArcMode.__libmansuffix__
diff --git a/man/XSetICFocus.man b/man/XSetICFocus.man
new file mode 100644 (file)
index 0000000..63a60bd
--- /dev/null
@@ -0,0 +1,184 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSetICFocus __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSetICFocus, XUnsetICFocus \- set and unset input context focus
+.SH SYNTAX
+.HP
+void XSetICFocus\^(\^XIC \fIic\fP\^); 
+.HP
+void XUnsetICFocus\^(\^XIC \fIic\fP\^); 
+.SH ARGUMENTS
+.IP \fIic\fP 1i
+Specifies the input context.
+.SH DESCRIPTION
+The
+.ZN XSetICFocus
+function allows a client to notify an input method that the focus window
+attached to the specified input context has received keyboard focus.
+The input method should take action to provide appropriate feedback.
+Complete feedback specification is a matter of user interface policy.
+.LP
+Calling
+.ZN XSetICFocus
+does not affect the focus window value.
+.LP
+The
+.ZN XUnsetICFocus
+function allows a client to notify an input method that the specified input context
+has lost the keyboard focus and that no more input is expected on the focus window
+attached to that input context.
+The input method should take action to provide appropriate feedback.
+Complete feedback specification is a matter of user interface policy.
+.LP
+Calling
+.ZN XUnsetICFocus
+does not affect the focus window value;
+the client may still receive 
+events from the input method that are directed to the focus window.
+.SH "SEE ALSO"
+XCreateIC(__libmansuffix__),
+XOpenIM(__libmansuffix__),
+XSetICValues(__libmansuffix__),
+XmbResetIC(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XSetICValues.man b/man/XSetICValues.man
new file mode 100644 (file)
index 0000000..36deb6e
--- /dev/null
@@ -0,0 +1,235 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSetICValues __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSetICValues, XGetICValues \- set and obtain XIC values
+.SH SYNTAX
+.HP
+char * XSetICValues\^(\^XIC \fIic\fP, ...\^); 
+.HP
+char * XGetICValues\^(\^XIC \fIic\fP, ...\^); 
+.SH ARGUMENTS
+.IP \fIic\fP 1i
+Specifies the input context.
+.ds Al \ to set or get XIC values
+.IP ... 1i
+Specifies the variable length argument list\*(Al.
+.SH DESCRIPTION
+The
+.ZN XSetICValues
+function returns NULL if no error occurred; 
+otherwise,
+it returns the name of the first argument that could not be set.
+An argument might not be set for any of the following reasons:
+.IP \(bu 5
+The argument is read-only (for example,
+.ZN XNFilterEvents ).
+.IP \(bu 5
+The argument name is not recognized.
+.IP \(bu 5
+An implementation-dependent error occurs.
+.LP
+Each value to be set must be an appropriate datum,
+matching the data type imposed by the semantics of the argument.
+.LP
+The
+.ZN XSetICValues
+can generate
+.ZN BadAtom ,
+.ZN BadColor ,
+.ZN BadCursor ,
+.ZN BadPixmap ,
+and
+.ZN BadWindow
+errors.
+.LP
+The
+.ZN XGetICValues
+function returns NULL if no error occurred; otherwise,
+it returns the name of the first argument that could not be obtained.
+An argument could not be obtained for any of the following reasons:
+.IP \(bu 5
+The argument name is not recognized.
+.IP \(bu 5
+The input method encountered an implementation-dependent error.
+.LP
+Each IC attribute value argument (following a name) must point to
+a location where the IC value is to be stored.
+That is, if the IC value is of type T,
+the argument must be of type T*.
+If T itself is a pointer type,
+then
+.ZN XGetICValues
+allocates memory to store the actual data,
+and the client is responsible for freeing this data by calling
+.ZN XFree
+with the returned pointer.
+The exception to this rule is for an IC value of type
+.ZN XNVaNestedList
+(for preedit and status attributes).
+In this case,  the argument must also be of type
+.ZN XVaNestedList .
+Then, the rule of changing type T to T* and freeing the allocated data
+applies to each element of the nested list.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAtom
+A value for an Atom argument does not name a defined Atom.
+.TP 1i
+.ZN BadColor
+A value for a Colormap argument does not name a defined Colormap.
+.TP 1i
+.ZN BadCursor
+A value for a Cursor argument does not name a defined Cursor.
+.TP 1i
+.ZN BadPixmap
+A value for a Pixmap argument does not name a defined Pixmap.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XCreateIC(__libmansuffix__),
+XOpenIM(__libmansuffix__),
+XSetICFocus(__libmansuffix__),
+XmbResetIC(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XSetIMValues.man b/man/XSetIMValues.man
new file mode 100644 (file)
index 0000000..6365409
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XOpenIM.__libmansuffix__
diff --git a/man/XSetIOErrorHandler.man b/man/XSetIOErrorHandler.man
new file mode 100644 (file)
index 0000000..de67624
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetErrorHandler.__libmansuffix__
diff --git a/man/XSetIconName.man b/man/XSetIconName.man
new file mode 100644 (file)
index 0000000..bf1ba60
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetWMIconName.__libmansuffix__
diff --git a/man/XSetIconSizes.man b/man/XSetIconSizes.man
new file mode 100644 (file)
index 0000000..afe574e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAllocIconSize.__libmansuffix__
diff --git a/man/XSetInputFocus.man b/man/XSetInputFocus.man
new file mode 100644 (file)
index 0000000..6b6f57d
--- /dev/null
@@ -0,0 +1,275 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSetInputFocus __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSetInputFocus, XGetInputFocus \- control input focus
+.SH SYNTAX
+.HP
+int XSetInputFocus\^(\^Display *\fIdisplay\fP\^, Window \fIfocus\fP\^, int
+\fIrevert_to\fP\^, Time \fItime\fP\^); 
+.HP
+int XGetInputFocus\^(\^Display *\fIdisplay\fP\^, Window *\fIfocus_return\fP\^,
+int *\fIrevert_to_return\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIfocus\fP 1i
+Specifies the window,
+.ZN PointerRoot ,
+or
+.ZN None .
+.IP \fIfocus_return\fP 1i
+Returns the focus window,
+.ZN PointerRoot ,
+or 
+.ZN None .
+.IP \fIrevert_to\fP 1i
+Specifies where the input focus reverts to if the window becomes not
+viewable.
+You can pass 
+.ZN RevertToParent , 
+.ZN RevertToPointerRoot , 
+or 
+.ZN RevertToNone .
+.IP \fIrevert_to_return\fP 1i
+Returns the current focus state
+.Pn ( RevertToParent , 
+.ZN RevertToPointerRoot , 
+or 
+.ZN RevertToNone ).
+.IP \fItime\fP 1i
+Specifies the time.
+You can pass either a timestamp or
+.ZN CurrentTime .
+.SH DESCRIPTION
+The
+.ZN XSetInputFocus
+function changes the input focus and the last-focus-change time.
+It has no effect if the specified time is earlier than the current
+last-focus-change time or is later than the current X server time.
+Otherwise, the last-focus-change time is set to the specified time
+.Pn ( CurrentTime 
+is replaced by the current X server time).
+.ZN XSetInputFocus
+causes the X server to generate
+.ZN FocusIn 
+and 
+.ZN FocusOut 
+events.
+.LP
+Depending on the focus argument,
+the following occurs: 
+.IP \(bu 5
+If focus is
+.ZN None ,
+all keyboard events are discarded until a new focus window is set,
+and the revert_to argument is ignored.
+.IP \(bu 5
+If focus is a window, 
+it becomes the keyboard's focus window.
+If a generated keyboard event would normally be reported to this window
+or one of its inferiors, the event is reported as usual. 
+Otherwise, the event is reported relative to the focus window.
+.IP \(bu 5
+If focus is
+.ZN PointerRoot ,
+the focus window is dynamically taken to be the root window of whatever screen 
+the pointer is on at each keyboard event.  
+In this case, the revert_to argument is ignored.
+.LP
+The specified focus window must be viewable at the time 
+.ZN XSetInputFocus
+is called,
+or a
+.ZN BadMatch
+error results.
+If the focus window later becomes not viewable, 
+the X server
+evaluates the revert_to argument to determine the new focus window as follows: 
+.IP \(bu 5
+If revert_to is
+.ZN RevertToParent ,
+the focus reverts to the parent (or the closest viewable ancestor), 
+and the new revert_to value is taken to be
+.ZN RevertToNone .  
+.IP \(bu 5
+If revert_to is
+.ZN RevertToPointerRoot 
+or 
+.ZN RevertToNone ,
+the focus reverts to
+.ZN PointerRoot
+or
+.ZN None ,
+respectively.
+When the focus reverts,
+the X server generates
+.ZN FocusIn
+and
+.ZN FocusOut
+events, but the last-focus-change time is not affected.
+.LP
+.ZN XSetInputFocus
+can generate
+.ZN BadMatch ,
+.ZN BadValue ,
+and
+.ZN BadWindow 
+errors.
+.LP
+The
+.ZN XGetInputFocus
+function returns the focus window and the current focus state.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XWarpPointer(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XSetLineAttributes.man b/man/XSetLineAttributes.man
new file mode 100644 (file)
index 0000000..6900430
--- /dev/null
@@ -0,0 +1,267 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSetLineAttributes __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSetLineAttributes, XSetDashes \- GC convenience routines
+.SH SYNTAX
+.HP
+int XSetLineAttributes\^(\^Display *\fIdisplay\fP\^, GC \fIgc\fP\^, unsigned
+int \fIline_width\fP\^, int \fIline_style\fP\^, int \fIcap_style\fP\^, int
+\fIjoin_style\fP\^); 
+.HP
+int XSetDashes\^(\^Display *\fIdisplay\fP\^, GC \fIgc\fP\^, int
+\fIdash_offset\fP\^, char \fIdash_list\fP[]\^, int \fIn\fP\^); 
+.SH ARGUMENTS
+.IP \fIcap_style\fP 1i
+Specifies the line-style and cap-style you want to set for the specified GC.
+You can pass
+.ZN CapNotLast ,
+.ZN CapButt ,
+.ZN CapRound ,
+or
+.ZN CapProjecting .
+.IP \fIdash_list\fP 1i
+Specifies the dash-list for the dashed line-style
+you want to set for the specified GC. 
+.IP \fIdash_offset\fP 1i
+Specifies the phase of the pattern for the dashed line-style you want to set
+for the specified GC. 
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fIjoin_style\fP 1i
+Specifies the line join-style you want to set for the specified GC.
+You can pass
+.ZN JoinMiter ,
+.ZN JoinRound ,
+or
+.ZN JoinBevel .
+.IP \fIline_style\fP 1i
+Specifies the line-style you want to set for the specified GC.
+You can pass
+.ZN LineSolid ,
+.ZN LineOnOffDash ,
+or
+.ZN LineDoubleDash .
+.IP \fIline_width\fP 1i
+Specifies the line-width you want to set for the specified GC.
+.IP \fIn\fP 1i
+Specifies the number of elements in dash_list. 
+.SH DESCRIPTION
+The
+.ZN XSetLineAttributes
+function sets the line drawing components in the specified GC.
+.LP
+.ZN XSetLineAttributes
+can generate
+.ZN BadAlloc ,
+.ZN BadGC ,
+and
+.ZN BadValue 
+errors.
+.LP
+The
+.ZN XSetDashes
+function sets the dash-offset and dash-list attributes for dashed line styles
+in the specified GC.
+There must be at least one element in the specified dash_list,
+or a
+.ZN BadValue
+error results. 
+The initial and alternating elements (second, fourth, and so on) 
+of the dash_list are the even dashes, and
+the others are the odd dashes.
+Each element specifies a dash length in pixels.
+All of the elements must be nonzero,
+or a
+.ZN BadValue
+error results.
+Specifying an odd-length list is equivalent to specifying the same list
+concatenated with itself to produce an even-length list.
+.LP
+The dash-offset defines the phase of the pattern,
+specifying how many pixels into the dash-list the pattern
+should actually begin in any single graphics request.
+Dashing is continuous through path elements combined with a join-style
+but is reset to the dash-offset between each sequence of joined lines.
+.LP
+The unit of measure for dashes is the same for the ordinary coordinate system.
+Ideally, a dash length is measured along the slope of the line, but implementations
+are only required to match this ideal for horizontal and vertical lines.
+Failing the ideal semantics, it is suggested that the length be measured along the
+major axis of the line.
+The major axis is defined as the x axis for lines drawn at an angle of between
+\-45 and +45 degrees or between 135 and 225 degrees from the x axis.
+For all other lines, the major axis is the y axis.
+.LP
+.ZN XSetDashes
+can generate
+.ZN BadAlloc ,
+.ZN BadGC ,
+and
+.ZN BadValue 
+errors.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadGC
+A value for a GContext argument does not name a defined GContext.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.SH "SEE ALSO"
+XCreateGC(__libmansuffix__),
+XQueryBestSize(__libmansuffix__),
+XSetArcMode(__libmansuffix__),
+XSetClipOrigin(__libmansuffix__),
+XSetFillStyle(__libmansuffix__),
+XSetFont(__libmansuffix__),
+XSetState(__libmansuffix__),
+XSetTile(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XSetLocaleModifiers.man b/man/XSetLocaleModifiers.man
new file mode 100644 (file)
index 0000000..3f7971e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSupportsLocale.__libmansuffix__
diff --git a/man/XSetModifierMapping.man b/man/XSetModifierMapping.man
new file mode 100644 (file)
index 0000000..cc772af
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XChangeKeyboardMapping.__libmansuffix__
diff --git a/man/XSetOCValues.man b/man/XSetOCValues.man
new file mode 100644 (file)
index 0000000..12d5a3d
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XCreateOC.__libmansuffix__
diff --git a/man/XSetOMValues.man b/man/XSetOMValues.man
new file mode 100644 (file)
index 0000000..3b4acf5
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XOpenOM.__libmansuffix__
diff --git a/man/XSetPlaneMask.man b/man/XSetPlaneMask.man
new file mode 100644 (file)
index 0000000..08ff447
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetState.__libmansuffix__
diff --git a/man/XSetPointerMapping.man b/man/XSetPointerMapping.man
new file mode 100644 (file)
index 0000000..d164028
--- /dev/null
@@ -0,0 +1,217 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSetPointerMapping __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSetPointerMapping, XGetPointerMapping \- manipulate pointer settings
+.SH SYNTAX
+.HP
+int XSetPointerMapping\^(\^Display *\fIdisplay\fP\^, unsigned char
+\fImap\fP\^[]\^, int \fInmap\fP\^); 
+.HP
+int XGetPointerMapping\^(\^Display *\fIdisplay\fP\^, unsigned char
+\fImap_return\fP\^[]\^, int \fInmap\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fImap\fP 1i
+Specifies the mapping list.
+.IP \fImap_return\fP 1i
+Returns the mapping list.
+.IP \fInmap\fP 1i
+Specifies the number of items in the mapping list.
+.SH DESCRIPTION
+The
+.ZN XSetPointerMapping
+function sets the mapping of the pointer.
+If it succeeds, the X server generates a
+.ZN MappingNotify
+event, and
+.ZN XSetPointerMapping
+returns
+.ZN MappingSuccess .
+Element map[i] defines the logical button number for the physical button
+i+1.
+The length of the list must be the same as
+.ZN XGetPointerMapping
+would return,
+or a
+.ZN BadValue
+error results.
+A zero element disables a button, and elements are not restricted in
+value by the number of physical buttons.
+However, no two elements can have the same nonzero value,
+or a
+.ZN BadValue
+error results.
+If any of the buttons to be altered are logically in the down state,
+.ZN XSetPointerMapping
+returns
+.ZN MappingBusy ,
+and the mapping is not changed.
+.LP
+.ZN XSetPointerMapping
+can generate a
+.ZN BadValue 
+error.
+.LP
+The
+.ZN XGetPointerMapping
+function returns the current mapping of the pointer.
+Pointer buttons are numbered starting from one.
+.ZN XGetPointerMapping
+returns the number of physical buttons actually on the pointer.
+The nominal mapping for a pointer is map[i]=i+1.
+The nmap argument specifies the length of the array where the pointer
+mapping is returned, and only the first nmap elements are returned 
+in map_return.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.SH "SEE ALSO"
+XChangeKeyboardControl(__libmansuffix__),
+XChangeKeyboardMapping(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XSetRGBColormaps.man b/man/XSetRGBColormaps.man
new file mode 100644 (file)
index 0000000..da749f6
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAllocStandardColormap.__libmansuffix__
diff --git a/man/XSetRegion.man b/man/XSetRegion.man
new file mode 100644 (file)
index 0000000..a643153
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XCreateRegion.__libmansuffix__
diff --git a/man/XSetScreenSaver.man b/man/XSetScreenSaver.man
new file mode 100644 (file)
index 0000000..e605817
--- /dev/null
@@ -0,0 +1,290 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSetScreenSaver __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSetScreenSaver, XForceScreenSaver, XActivateScreenSaver, XResetScreenSaver, XGetScreenSaver \- manipulate the screen saver
+.SH SYNTAX
+.HP
+int XSetScreenSaver\^(\^Display *\fIdisplay\fP\^, int \fItimeout\fP\^,
+int \fIinterval\fP\^, int \fIprefer_blanking\fP\^, int
+\fIallow_exposures\fP\^); 
+.HP
+int XForceScreenSaver\^(\^Display *\fIdisplay\fP\^, int \fImode\fP\^); 
+.HP
+int XActivateScreenSaver\^(\^Display *\fIdisplay\fP\^); 
+.HP
+int XResetScreenSaver\^(\^Display *\fIdisplay\fP\^); 
+.HP
+int XGetScreenSaver\^(\^Display *\fIdisplay\fP\^, int *\fItimeout_return\fP\^,
+int *\fIinterval_return\fP\^, int *\fIprefer_blanking_return\fP\^, int
+*\fIallow_exposures_return\fP\^); 
+.SH ARGUMENTS
+.IP \fIallow_exposures\fP 1i
+Specifies the screen save control values.
+You can pass
+.ZN DontAllowExposures ,
+.ZN AllowExposures ,
+or
+.ZN DefaultExposures .
+.IP \fIallow_exposures_return\fP 1i
+Returns the current screen save control value
+.Pn ( DontAllowExposures ,
+.ZN AllowExposures ,
+or
+.ZN DefaultExposures ).
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIinterval\fP 1i
+Specifies the interval, in seconds, between screen saver alterations.
+.IP \fIinterval_return\fP 1i
+Returns the interval between screen saver invocations.
+.IP \fImode\fP 1i
+Specifies the mode that is to be applied.
+You can pass
+.ZN ScreenSaverActive
+or
+.ZN ScreenSaverReset .
+.IP \fIprefer_blanking\fP 1i
+Specifies how to enable screen blanking.
+You can pass
+.ZN DontPreferBlanking ,
+.ZN PreferBlanking ,
+or
+.ZN DefaultBlanking .
+.IP \fIprefer_blanking_return\fP 1i
+Returns the current screen blanking preference
+.Pn ( DontPreferBlanking ,
+.ZN PreferBlanking ,
+or
+.ZN DefaultBlanking ).
+.IP \fItimeout\fP 1i
+Specifies the timeout, in seconds, until the screen saver turns on.
+.IP \fItimeout_return\fP 1i
+Returns the timeout, in seconds, until the screen saver turns on.
+.SH DESCRIPTION
+Timeout and interval are specified in seconds. 
+A timeout of 0 disables the screen saver 
+(but an activated screen saver is not deactivated),
+and a timeout of \-1 restores the default.
+Other negative values generate a
+.ZN BadValue
+error.
+If the timeout value is nonzero, 
+.ZN XSetScreenSaver
+enables the screen saver.
+An interval of 0 disables the random-pattern motion.
+Both values are limited to a 16-bit signed integer range by the wire protocol,
+despite the C prototype.
+If no input from devices (keyboard, mouse, and so on) is generated 
+for the specified number of timeout seconds once the screen saver is enabled,
+the screen saver is activated.
+.LP
+For each screen, 
+if blanking is preferred and the hardware supports video blanking, 
+the screen simply goes blank.  
+Otherwise, if either exposures are allowed or the screen can be regenerated 
+without sending 
+.ZN Expose 
+events to clients, 
+the screen is tiled with the root window background tile randomly 
+re-origined each interval seconds.
+Otherwise, the screens' state do not change, 
+and the screen saver is not activated.
+The screen saver is deactivated,
+and all screen states are restored at the next
+keyboard or pointer input or at the next call to
+.ZN XForceScreenSaver
+with mode
+.ZN ScreenSaverReset .  
+.LP
+If the server-dependent screen saver method supports periodic change,
+the interval argument serves as a hint about how long the change period
+should be, and zero hints that no periodic change should be made.
+Examples of ways to change the screen include scrambling the colormap
+periodically, moving an icon image around the screen periodically, or tiling
+the screen with the root window background tile, randomly re-origined
+periodically.
+.LP
+.ZN XSetScreenSaver
+can generate a
+.ZN BadValue 
+error.
+.LP
+If the specified mode is 
+.ZN ScreenSaverActive 
+and the screen saver currently is deactivated,
+.ZN XForceScreenSaver
+activates the screen saver even if the screen saver had been disabled
+with a timeout of zero.
+If the specified mode is 
+.ZN ScreenSaverReset 
+and the screen saver currently is enabled,
+.ZN XForceScreenSaver
+deactivates the screen saver if it was activated,
+and the activation timer is reset to its initial state 
+(as if device input had been received).
+.LP
+.ZN XForceScreenSaver
+can generate a
+.ZN BadValue 
+error.
+.LP
+The
+.ZN XActivateScreenSaver
+function activates the screen saver.
+.LP
+The
+.ZN XResetScreenSaver
+function resets the screen saver.
+.LP
+The
+.ZN XGetScreenSaver
+function gets the current screen saver values.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.SH "SEE ALSO"
+\fI\*(xL\fP
diff --git a/man/XSetSelectionOwner.man b/man/XSetSelectionOwner.man
new file mode 100644 (file)
index 0000000..011cf1d
--- /dev/null
@@ -0,0 +1,278 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSetSelectionOwner __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSetSelectionOwner, XGetSelectionOwner, XConvertSelection \- manipulate window selection
+.SH SYNTAX
+.HP
+int XSetSelectionOwner\^(\^Display *\fIdisplay\fP\^, Atom \fIselection\fP\^,
+Window \fIowner\fP\^, Time \fItime\fP\^); 
+.HP
+Window XGetSelectionOwner\^(\^Display *\fIdisplay\fP\^, Atom
+\fIselection\fP\^); 
+.HP
+int XConvertSelection\^(\^Display *\fIdisplay\fP\^, Atom \fIselection\fP\^,
+Atom \fItarget\fP\^, Atom \fIproperty\fP\^, Window \fIrequestor\fP\^, Time
+\fItime\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIowner\fP 1i
+Specifies the owner of the specified selection atom.
+You can pass a window or
+.ZN None .
+.IP \fIproperty\fP 1i
+Specifies the property name.
+You also can pass
+.ZN None .
+.IP \fIrequestor\fP 1i
+Specifies the requestor.
+.IP \fIselection\fP 1i
+Specifies the selection atom.
+.IP \fItarget\fP 1i
+Specifies the target atom.
+.IP \fItime\fP 1i
+Specifies the time.
+You can pass either a timestamp or
+.ZN CurrentTime .
+.SH DESCRIPTION
+The
+.ZN XSetSelectionOwner
+function changes the owner and last-change time for the specified selection
+and has no effect if the specified time is earlier than the current
+last-change time of the specified selection 
+or is later than the current X server time.
+Otherwise, the last-change time is set to the specified time,
+with
+.ZN CurrentTime
+replaced by the current server time.
+If the owner window is specified as
+.ZN None ,
+then the owner of the selection becomes 
+.ZN None
+(that is, no owner).
+Otherwise, the owner of the selection becomes the client executing
+the request.
+.LP 
+If the new owner (whether a client or
+.ZN None )
+is not
+the same as the current owner of the selection and the current
+owner is not
+.ZN None ,
+the current owner is sent a 
+.ZN SelectionClear 
+event.
+If the client that is the owner of a selection is later
+terminated (that is, its connection is closed)
+or if the owner window it has specified in the request is later
+destroyed,
+the owner of the selection automatically
+reverts to
+.ZN None ,
+but the last-change time is not affected.
+The selection atom is uninterpreted by the X server.
+.ZN XGetSelectionOwner
+returns the owner window, which is reported in 
+.ZN SelectionRequest
+and
+.ZN SelectionClear
+events.
+Selections are global to the X server.
+.LP
+.ZN XSetSelectionOwner
+can generate
+.ZN BadAtom
+and
+.ZN BadWindow 
+errors.
+.LP
+The
+.ZN XGetSelectionOwner
+function
+returns the window ID associated with the window that currently owns the
+specified selection.
+If no selection was specified, the function returns the constant
+.ZN None .
+If
+.ZN None
+is returned,
+there is no owner for the selection.
+.LP
+.ZN XGetSelectionOwner
+can generate a
+.ZN BadAtom 
+error.
+.LP
+.ZN XConvertSelection
+requests that the specified selection be converted to the specified target
+type:
+.IP \(bu 5
+If the specified selection has an owner, the X server sends a
+.ZN SelectionRequest
+event to that owner.
+.IP \(bu 5
+If no owner for the specified
+selection exists, the X server generates a
+.ZN SelectionNotify
+event to the
+requestor with property
+.ZN None .
+.LP
+The arguments are passed on unchanged in either of the events.
+There are two predefined selection atoms: PRIMARY and SECONDARY.
+.LP
+.ZN XConvertSelection
+can generate
+.ZN BadAtom
+and
+.ZN BadWindow 
+errors.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAtom
+A value for an Atom argument does not name a defined Atom.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+\fI\*(xL\fP
diff --git a/man/XSetState.man b/man/XSetState.man
new file mode 100644 (file)
index 0000000..0d15236
--- /dev/null
@@ -0,0 +1,256 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSetState __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSetState, XSetFunction, XSetPlaneMask, XSetForeground, XSetBackground \- GC convenience routines
+.SH SYNTAX
+.HP
+int XSetState\^(\^Display *\fIdisplay\fP\^, GC \fIgc\fP\^, unsigned long
+\fIforeground\fP\^, unsigned int \fIbackground\fP\^, int \fIfunction\fP\^,
+unsigned long \fIplane_mask\fP\^); 
+.HP
+int XSetFunction\^(\^Display *\fIdisplay\fP\^, GC \fIgc\fP\^, int
+\fIfunction\fP\^); 
+.HP
+int XSetPlaneMask\^(\^Display *\fIdisplay\fP\^, GC \fIgc\fP\^, unsigned long
+\fIplane_mask\fP\^); 
+.HP
+int XSetForeground\^(\^Display *\fIdisplay\fP\^, GC \fIgc\fP\^, unsigned long
+\fIforeground\fP\^); 
+.HP
+int XSetBackground\^(\^Display *\fIdisplay\fP\^, GC \fIgc\fP\^, unsigned long
+\fIbackground\fP\^); 
+.SH ARGUMENTS
+.IP \fIbackground\fP 1i
+Specifies the background you want to set for the specified GC.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIforeground\fP 1i
+Specifies the foreground you want to set for the specified GC.
+.IP \fIfunction\fP 1i
+Specifies the function you want to set for the specified GC.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fIplane_mask\fP 1i
+Specifies the plane mask.
+.\" *** JIM: NEED MORE INFO FOR THIS. ***
+.SH DESCRIPTION
+The
+.ZN XSetState
+function sets the foreground, background, plane mask, and function components
+for the specified GC.
+.LP
+.ZN XSetState
+can generate
+.ZN BadAlloc ,
+.ZN BadGC ,
+and
+.ZN BadValue 
+errors.
+.LP
+.ZN XSetFunction
+sets a specified value in the specified GC.
+.LP
+.ZN XSetFunction
+can generate
+.ZN BadAlloc ,
+.ZN BadGC ,
+and
+.ZN BadValue 
+errors.
+.LP
+The
+.ZN XSetPlaneMask
+function sets the plane mask in the specified GC.
+.LP
+.ZN XSetPlaneMask
+can generate
+.ZN BadAlloc 
+and
+.ZN BadGC 
+errors.
+.LP
+The
+.ZN XSetForeground
+function sets the foreground in the specified GC.
+.LP
+.ZN XSetForeground
+can generate
+.ZN BadAlloc
+and
+.ZN BadGC 
+errors.
+.LP
+The
+.ZN XSetBackground
+function sets the background in the specified GC.
+.LP
+.ZN XSetBackground
+can generate
+.ZN BadAlloc
+and
+.ZN BadGC 
+errors.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadGC
+A value for a GContext argument does not name a defined GContext.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.SH "SEE ALSO"
+XCreateGC(__libmansuffix__),
+XQueryBestSize(__libmansuffix__),
+XSetArcMode(__libmansuffix__),
+XSetClipOrigin(__libmansuffix__),
+XSetFillStyle(__libmansuffix__),
+XSetFont(__libmansuffix__),
+XSetLineAttributes(__libmansuffix__),
+XSetTile(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XSetStipple.man b/man/XSetStipple.man
new file mode 100644 (file)
index 0000000..ddc27f7
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetTile.__libmansuffix__
diff --git a/man/XSetSubwindowMode.man b/man/XSetSubwindowMode.man
new file mode 100644 (file)
index 0000000..5580581
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetArcMode.__libmansuffix__
diff --git a/man/XSetTSOrigin.man b/man/XSetTSOrigin.man
new file mode 100644 (file)
index 0000000..ddc27f7
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetTile.__libmansuffix__
diff --git a/man/XSetTextProperty.man b/man/XSetTextProperty.man
new file mode 100644 (file)
index 0000000..d966ae1
--- /dev/null
@@ -0,0 +1,267 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSetTextProperty __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSetTextProperty, XGetTextProperty \- set and read text properties
+.SH SYNTAX
+.HP
+void XSetTextProperty\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^,
+XTextProperty *\fItext_prop\fP\^, Atom \fIproperty\fP\^); 
+.HP
+Status XGetTextProperty\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^,
+XTextProperty *\fItext_prop_return\fP\^, Atom \fIproperty\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIproperty\fP 1i
+Specifies the property name.
+.IP \fItext_prop\fP 1i
+Specifies the
+.ZN XTextProperty
+structure to be used.
+.IP \fItext_prop_return\fP 1i
+Returns the
+.ZN XTextProperty
+structure.
+.SH DESCRIPTION
+The
+.ZN XSetTextProperty
+function replaces the existing specified property for the named window 
+with the data, type, format, and number of items determined 
+by the value field, the encoding field, the format field, 
+and the nitems field, respectively, of the specified
+.ZN XTextProperty
+structure.
+If the property does not already exist,
+.ZN XSetTextProperty
+sets it for the specified window.
+.LP
+.ZN XSetTextProperty
+can generate
+.ZN BadAlloc ,
+.ZN BadAtom ,
+.ZN BadValue ,
+and
+.ZN BadWindow
+errors.
+.LP
+The
+.ZN XGetTextProperty 
+function reads the specified property from the window
+and stores the data in the returned
+.ZN XTextProperty
+structure.
+It stores the data in the value field,
+the type of the data in the encoding field,
+the format of the data in the format field, 
+and the number of items of data in the nitems field.
+An extra byte containing null (which is not included in the nitems member) 
+is stored at the end of the value field of text_prop_return.
+The particular interpretation of the property's encoding 
+and data as text is left to the calling application.
+If the specified property does not exist on the window,
+.ZN XGetTextProperty
+sets the value field to NULL, 
+the encoding field to
+.ZN None , 
+the format field to zero, 
+and the nitems field to zero.
+.LP
+If it was able to read and store the data in the
+.ZN XTextProperty
+structure,
+.ZN XGetTextProperty
+returns a nonzero status; 
+otherwise, it returns a zero status.
+.LP
+.ZN XGetTextProperty
+can generate
+.ZN BadAtom 
+and
+.ZN BadWindow
+errors.
+.SH PROPERTIES
+.TP 1i
+\s-1WM_CLIENT_MACHINE\s+1
+The string name of the machine on which the client application is running.
+.TP 1i
+\s-1WM_COMMAND\s+1
+The command and arguments, null-separated, used to invoke the
+application.
+.TP 1i
+\s-1WM_ICON_NAME\s+1
+The name to be used in an icon.
+.TP 1i
+\s-1WM_NAME\s+1
+The name of the application.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadAtom
+A value for an Atom argument does not name a defined Atom.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XAllocClassHint(__libmansuffix__),
+XAllocIconSize(__libmansuffix__),
+XAllocSizeHints(__libmansuffix__),
+XAllocWMHints(__libmansuffix__),
+XSetCommand(__libmansuffix__),
+XSetTransientForHint(__libmansuffix__),
+XSetWMClientMachine(__libmansuffix__),
+XSetWMColormapWindows(__libmansuffix__),
+XSetWMIconName(__libmansuffix__),
+XSetWMName(__libmansuffix__),
+XSetWMProperties(__libmansuffix__),
+XSetWMProtocols(__libmansuffix__),
+XStringListToTextProperty(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XSetTile.man b/man/XSetTile.man
new file mode 100644 (file)
index 0000000..8f9e2a4
--- /dev/null
@@ -0,0 +1,241 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSetTile __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSetTile, XSetStipple, XSetTSOrigin \- GC convenience routines
+.SH SYNTAX
+.HP
+int XSetTile\^(\^Display *\fIdisplay\fP\^, GC \fIgc\fP\^, Pixmap
+\fItile\fP\^); 
+.HP
+int XSetStipple\^(\^Display *\fIdisplay\fP\^, GC \fIgc\fP\^, Pixmap
+\fIstipple\fP\^); 
+.HP
+int XSetTSOrigin\^(\^Display *\fIdisplay\fP\^, GC \fIgc\fP\^, int
+\fIts_x_origin\fP\^, int \fIts_y_origin\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fIstipple\fP 1i
+Specifies the stipple you want to set for the specified GC.
+.IP \fItile\fP 1i
+Specifies the fill tile you want to set for the specified GC. 
+.IP \fIts_x_origin\fP 1i
+.br
+.ns
+.IP \fIts_y_origin\fP 1i
+Specify the x and y coordinates of the tile and stipple origin.
+.SH DESCRIPTION
+The
+.ZN XSetTile
+function sets the fill tile in the specified GC.
+The tile and GC must have the same depth,
+or a
+.ZN BadMatch
+error results.
+.LP
+.ZN XSetTile
+can generate
+.ZN BadAlloc ,
+.ZN BadGC ,
+.ZN BadMatch ,
+and
+.ZN BadPixmap 
+errors.
+.LP
+The
+.ZN XSetStipple
+function sets the stipple in the specified GC.
+The stipple must have a depth of one,
+or a
+.ZN BadMatch
+error results.
+.LP
+.ZN XSetStipple
+can generate
+.ZN BadAlloc ,
+.ZN BadGC ,
+.ZN BadMatch ,
+and
+.ZN BadPixmap 
+errors.
+.LP
+The
+.ZN XSetTSOrigin
+function sets the tile/stipple origin in the specified GC.
+When graphics requests call for tiling or stippling,
+the parent's origin will be interpreted relative to whatever destination
+drawable is specified in the graphics request.
+.LP
+.ZN XSetTSOrigin
+can generate
+.ZN BadAlloc
+and
+.ZN BadGC 
+errors.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadGC
+A value for a GContext argument does not name a defined GContext.
+.TP 1i
+.ZN BadMatch
+Some argument or pair of arguments has the correct type and range but fails
+to match in some other way required by the request.
+.TP 1i
+.ZN BadPixmap
+A value for a Pixmap argument does not name a defined Pixmap.
+.SH "SEE ALSO"
+XCreateGC(__libmansuffix__),
+XQueryBestSize(__libmansuffix__),
+XSetArcMode(__libmansuffix__),
+XSetClipOrigin(__libmansuffix__),
+XSetFillStyle(__libmansuffix__),
+XSetFont(__libmansuffix__),
+XSetLineAttributes(__libmansuffix__),
+XSetState(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XSetTransientForHint.man b/man/XSetTransientForHint.man
new file mode 100644 (file)
index 0000000..fc4cf5c
--- /dev/null
@@ -0,0 +1,211 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSetTransientForHint __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSetTransientForHint, XGetTransientForHint \- set or read a window's WM_TRANSIENT_FOR property
+.SH SYNTAX
+.HP
+int XSetTransientForHint\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^,
+Window \fIprop_window\fP\^); 
+.HP
+Status XGetTransientForHint\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^,
+Window *\fIprop_window_return\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIw\fP 1i
+Specifies the window.
+.IP \fIprop_window\fP 1i
+Specifies the window that the WM_TRANSIENT_FOR property is to be set to.
+.IP \fIprop_window_return\fP 1i
+Returns the WM_TRANSIENT_FOR property of the specified window.
+.SH DESCRIPTION
+The
+.ZN XSetTransientForHint
+function sets the WM_TRANSIENT_FOR property of the specified window to the 
+specified prop_window.
+.LP
+.ZN XSetTransientForHint
+can generate
+.ZN BadAlloc
+and
+.ZN BadWindow 
+errors.
+.LP
+The
+.ZN XGetTransientForHint
+function returns the WM_TRANSIENT_FOR property for the specified window.
+It returns a nonzero status on success;
+otherwise, it returns a zero status.
+.LP
+.ZN XGetTransientForHint
+can generate a
+.ZN BadWindow 
+error.
+.SH PROPERTIES
+.TP 1i
+\s-1WM_TRANSIENT_FOR\s+1
+Set by application programs to indicate to the window manager that a transient
+top-level window, such as a dialog box.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XAllocClassHint(__libmansuffix__),
+XAllocIconSize(__libmansuffix__),
+XAllocSizeHints(__libmansuffix__),
+XAllocWMHints(__libmansuffix__),
+XSetCommand(__libmansuffix__),
+XSetTextProperty(__libmansuffix__),
+XSetWMClientMachine(__libmansuffix__),
+XSetWMColormapWindows(__libmansuffix__),
+XSetWMIconName(__libmansuffix__),
+XSetWMName(__libmansuffix__),
+XSetWMProperties(__libmansuffix__),
+XSetWMProtocols(__libmansuffix__),
+XStringListToTextProperty(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XSetWMClientMachine.man b/man/XSetWMClientMachine.man
new file mode 100644 (file)
index 0000000..bae111b
--- /dev/null
@@ -0,0 +1,198 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSetWMClientMachine __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSetWMClientMachine, XGetWMClientMachine \- set or read a window's WM_CLIENT_MACHINE property
+.SH SYNTAX
+.HP
+void XSetWMClientMachine\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^,
+XTextProperty *\fItext_prop\fP\^); 
+.HP
+Status XGetWMClientMachine\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^,
+XTextProperty *\fItext_prop_return\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fItext_prop\fP 1i
+Specifies the
+.ZN XTextProperty
+structure to be used.
+.IP \fItext_prop_return\fP 1i
+Returns the
+.ZN XTextProperty
+structure.
+.IP \fIw\fP 1i
+Specifies the window.
+.SH DESCRIPTION
+The
+.ZN XSetWMClientMachine
+convenience function calls
+.ZN XSetTextProperty
+to set the WM_CLIENT_MACHINE property.
+.LP
+The
+.ZN XGetWMClientMachine
+convenience function performs an 
+.ZN XGetTextProperty 
+on the WM_CLIENT_MACHINE property.
+It returns a nonzero status on success;
+otherwise, it returns a zero status.
+.SH PROPERTIES
+.TP 1i
+\s-1WM_CLIENT_MACHINE\s+1
+The string name of the machine on which the client application is running.
+.SH "SEE ALSO"
+XAllocClassHint(__libmansuffix__),
+XAllocIconSize(__libmansuffix__),
+XAllocSizeHints(__libmansuffix__),
+XAllocWMHints(__libmansuffix__),
+XSetCommand(__libmansuffix__),
+XSetTransientForHint(__libmansuffix__),
+XSetTextProperty(__libmansuffix__),
+XSetWMColormapWindows(__libmansuffix__),
+XSetWMIconName(__libmansuffix__),
+XSetWMName(__libmansuffix__),
+XSetWMProperties(__libmansuffix__),
+XSetWMProtocols(__libmansuffix__),
+XStringListToTextProperty(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XSetWMColormapWindows.man b/man/XSetWMColormapWindows.man
new file mode 100644 (file)
index 0000000..e205db3
--- /dev/null
@@ -0,0 +1,238 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSetWMColormapWindows __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSetWMColormapWindows, XGetWMColormapWindows \- set or read a window's WM_COLORMAP_WINDOWS property
+.SH SYNTAX
+.HP
+Status XSetWMColormapWindows\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^,
+Window *\fIcolormap_windows\fP\^, int \fIcount\fP\^); 
+.HP
+Status XGetWMColormapWindows\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^,
+Window **\fIcolormap_windows_return\fP\^, int *\fIcount_return\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIcolormap_windows\fP 1i
+Specifies the list of windows.
+.IP \fIcolormap_windows_return\fP 1i
+Returns the list of windows.
+.ds Cn windows in the list
+.IP \fIcount\fP 1i
+Specifies the number of \*(Cn.
+.ds Cn windows in the list
+.IP \fIcount_return\fP 1i
+Returns the number of \*(Cn.
+.IP \fIw\fP 1i
+Specifies the window.
+.SH DESCRIPTION
+The 
+.ZN XSetWMColormapWindows 
+function replaces the WM_COLORMAP_WINDOWS property on the specified
+window with the list of windows specified by the colormap_windows argument.
+It the property does not already exist,
+.ZN XSetWMColormapWindows
+sets the WM_COLORMAP_WINDOWS property on the specified
+window to the list of windows specified by the colormap_windows argument.
+The property is stored with a type of WINDOW and a format of 32.
+If it cannot intern the WM_COLORMAP_WINDOWS atom,
+.ZN XSetWMColormapWindows
+returns a zero status.
+Otherwise, it returns a nonzero status.
+.LP
+.ZN XSetWMColormapWindows
+can generate
+.ZN BadAlloc
+and
+.ZN BadWindow
+errors.
+.LP
+The 
+.ZN XGetWMColormapWindows 
+function returns the list of window identifiers stored 
+in the WM_COLORMAP_WINDOWS property on the specified window.
+These identifiers indicate the colormaps that the window manager
+may need to install for this window.
+If the property exists, is of type WINDOW, is of format 32, 
+and the atom WM_COLORMAP_WINDOWS can be interned, 
+.ZN XGetWMColormapWindows
+sets the windows_return argument to a list of window identifiers, 
+sets the count_return argument to the number of elements in the list, 
+and returns a nonzero status.
+Otherwise, it sets neither of the return arguments
+and returns a zero status.
+To release the list of window identifiers, use
+.ZN XFree . 
+.LP
+.ZN XGetWMColormapWindows
+can generate a
+.ZN BadWindow
+error.
+.SH PROPERTIES
+.TP 1i
+\s-1WM_COLORMAP_WINDOWS\s+1
+The list of window IDs that may need a different colormap
+from that of their top-level window.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XAllocClassHint(__libmansuffix__),
+XAllocIconSize(__libmansuffix__),
+XAllocSizeHints(__libmansuffix__),
+XAllocWMHints(__libmansuffix__),
+XFree(__libmansuffix__),
+XSetCommand(__libmansuffix__),
+XSetTransientForHint(__libmansuffix__),
+XSetTextProperty(__libmansuffix__),
+XSetWMClientMachine(__libmansuffix__),
+XSetWMIconName(__libmansuffix__),
+XSetWMName(__libmansuffix__),
+XSetWMProperties(__libmansuffix__),
+XSetWMProtocols(__libmansuffix__),
+XStringListToTextProperty(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XSetWMHints.man b/man/XSetWMHints.man
new file mode 100644 (file)
index 0000000..1e15d7e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAllocWMHints.__libmansuffix__
diff --git a/man/XSetWMIconName.man b/man/XSetWMIconName.man
new file mode 100644 (file)
index 0000000..f0c87bd
--- /dev/null
@@ -0,0 +1,250 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSetWMIconName __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSetWMIconName, XGetWMIconName, XSetIconName, XGetIconName \- set or read a window's WM_ICON_NAME property
+.SH SYNTAX
+.HP
+void XSetWMIconName\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^,
+XTextProperty *\fItext_prop\fP\^); 
+.HP
+Status XGetWMIconName\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^,
+XTextProperty *\fItext_prop_return\fP\^); 
+.HP
+int XSetIconName\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, char
+*\fIicon_name\fP\^); 
+.HP
+Status XGetIconName\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, char
+**\fIicon_name_return\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIicon_name\fP 1i
+Specifies the icon name,
+which should be a null-terminated string.
+.IP \fIicon_name_return\fP 1i
+Returns the window's icon name,
+which is a null-terminated string.
+.IP \fItext_prop\fP 1i
+Specifies the
+.ZN XTextProperty
+structure to be used.
+.IP \fItext_prop_return\fP 1i
+Returns the
+.ZN XTextProperty
+structure.
+.IP \fIw\fP 1i
+Specifies the window.
+.SH DESCRIPTION
+The
+.ZN XSetWMIconName
+convenience function calls
+.ZN XSetTextProperty
+to set the WM_ICON_NAME property.
+.LP
+The 
+.ZN XGetWMIconName 
+convenience function calls
+.ZN XGetTextProperty 
+to obtain the WM_ICON_NAME property.
+It returns a nonzero status on success;
+otherwise, it returns a zero status.
+.LP
+The
+.ZN XSetIconName
+function sets the name to be displayed in a window's icon.
+.LP
+.ZN XSetIconName
+can generate
+.ZN BadAlloc
+and
+.ZN BadWindow
+errors.
+.LP
+The
+.ZN XGetIconName
+function returns the name to be displayed in the specified window's icon.
+If it succeeds, it returns a nonzero status; otherwise, 
+if no icon name has been set for the window,
+it returns zero.
+If you never assigned a name to the window,
+.ZN XGetIconName
+sets icon_name_return to NULL.
+If the data returned by the server is in the Latin Portable Character Encoding,
+then the returned string is in the Host Portable Character Encoding.
+Otherwise, the result is implementation-dependent.
+When finished with it, a client must free
+the icon name string using
+.ZN XFree .
+.LP
+.ZN XGetIconName
+can generate a
+.ZN BadWindow
+error.
+.SH PROPERTIES
+.TP 1i
+\s-1WM_ICON_NAME\s+1
+The name to be used in an icon.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XAllocClassHint(__libmansuffix__),
+XAllocIconSize(__libmansuffix__),
+XAllocSizeHints(__libmansuffix__),
+XAllocWMHints(__libmansuffix__),
+XFree(__libmansuffix__),
+XSetCommand(__libmansuffix__),
+XSetTransientForHint(__libmansuffix__),
+XSetTextProperty(__libmansuffix__),
+XSetWMClientMachine(__libmansuffix__),
+XSetWMColormapWindows(__libmansuffix__),
+XSetWMName(__libmansuffix__),
+XSetWMProperties(__libmansuffix__),
+XSetWMProtocols(__libmansuffix__),
+XStringListToTextProperty(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XSetWMName.man b/man/XSetWMName.man
new file mode 100644 (file)
index 0000000..37f2b80
--- /dev/null
@@ -0,0 +1,257 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSetWMName __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSetWMName, XGetWMName, XStoreName, XFetchName \- set or read a window's WM_NAME property
+.SH SYNTAX
+.HP
+void XSetWMName\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, XTextProperty
+*\fItext_prop\fP\^); 
+.HP
+Status XGetWMName\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^,
+XTextProperty *\fItext_prop_return\fP\^); 
+.HP
+int XStoreName\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, char
+*\fIwindow_name\fP\^); 
+.HP
+Status XFetchName\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, char
+**\fIwindow_name_return\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fItext_prop\fP 1i
+Specifies the
+.ZN XTextProperty
+structure to be used.
+.IP \fItext_prop_return\fP 1i
+Returns the
+.ZN XTextProperty
+structure.
+.IP \fIw\fP 1i
+Specifies the window.
+.IP \fIwindow_name\fP 1i
+Specifies the window name,
+which should be a null-terminated string.
+.IP \fIwindow_name_return\fP 1i
+Returns the window name, which is a null-terminated string.
+.SH DESCRIPTION
+The
+.ZN XSetWMName
+convenience function calls
+.ZN XSetTextProperty 
+to set the WM_NAME property.
+.LP
+The
+.ZN XGetWMName 
+convenience function calls
+.ZN XGetTextProperty 
+to obtain the WM_NAME property.
+It returns a nonzero status on success;
+otherwise, it returns a zero status.
+.LP
+The
+.ZN XStoreName
+function assigns the name passed to window_name to the specified window.
+A window manager can display the window name in some prominent
+place, such as the title bar, to allow users to identify windows easily.
+Some window managers may display a window's name in the window's icon,
+although they are encouraged to use the window's icon name
+if one is provided by the application.
+If the string is not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+.LP
+.ZN XStoreName
+can generate
+.ZN BadAlloc
+and
+.ZN BadWindow
+errors.
+.LP
+The
+.ZN XFetchName
+function returns the name of the specified window.
+If it succeeds,
+it returns a nonzero status; 
+otherwise, no name has been set for the window,
+and it returns zero.
+If the WM_NAME property has not been set for this window,
+.ZN XFetchName
+sets window_name_return to NULL.
+If the data returned by the server is in the Latin Portable Character Encoding,
+then the returned string is in the Host Portable Character Encoding.
+Otherwise, the result is implementation-dependent.
+When finished with it, a client must free
+the window name string using
+.ZN XFree .
+.LP
+.ZN XFetchName
+can generate a
+.ZN BadWindow
+error.
+.SH PROPERTIES
+.TP 1i
+\s-1WM_NAME\s+1
+The name of the application.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XAllocClassHint(__libmansuffix__),
+XAllocIconSize(__libmansuffix__),
+XAllocSizeHints(__libmansuffix__),
+XAllocWMHints(__libmansuffix__),
+XFree(__libmansuffix__),
+XSetCommand(__libmansuffix__),
+XSetTransientForHint(__libmansuffix__),
+XSetTextProperty(__libmansuffix__),
+XSetWMClientMachine(__libmansuffix__),
+XSetWMColormapWindows(__libmansuffix__),
+XSetWMIconName(__libmansuffix__),
+XSetWMProperties(__libmansuffix__),
+XSetWMProtocols(__libmansuffix__),
+XStringListToTextProperty(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XSetWMNormalHints.man b/man/XSetWMNormalHints.man
new file mode 100644 (file)
index 0000000..9fbee38
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAllocSizeHints.__libmansuffix__
diff --git a/man/XSetWMProperties.man b/man/XSetWMProperties.man
new file mode 100644 (file)
index 0000000..8a9b1c3
--- /dev/null
@@ -0,0 +1,390 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\" Copyright \(co 2000  The XFree86 Project, Inc.
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\"
+.\" 
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSetWMProperties __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSetWMProperties, XmbSetWMProperties, Xutf8SetWMProperties \- set standard window properties
+.SH SYNTAX
+.HP
+void XSetWMProperties\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^,
+XTextProperty *\fIwindow_name\fP\^, XTextProperty *\fIicon_name\fP\^, char
+**\fIargv\fP\^, int \fIargc\fP\^, XSizeHints *\fInormal_hints\fP\^, XWMHints
+*\fIwm_hints\fP\^, XClassHint *\fIclass_hints\fP\^); 
+.HP
+void XmbSetWMProperties\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, char
+*\fIwindow_name\fP\^, char *\fIicon_name\fP\^, char *\fIargv\fP\^[], int
+\fIargc\fP\^, XSizeHints *\fInormal_hints\fP\^, XWMHints *\fIwm_hints\fP\^,
+XClassHint *\fIclass_hints\fP\^); 
+.HP
+void Xutf8SetWMProperties\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, char
+*\fIwindow_name\fP\^, char *\fIicon_name\fP\^, char *\fIargv\fP\^[], int
+\fIargc\fP\^, XSizeHints *\fInormal_hints\fP\^, XWMHints *\fIwm_hints\fP\^,
+XClassHint *\fIclass_hints\fP\^); 
+.SH ARGUMENTS
+.IP \fIargc\fP 1i
+Specifies the number of arguments.
+.IP \fIargv\fP 1i
+Specifies the application's argument list.
+.IP \fIclass_hints\fP 1i
+Specifies the
+.ZN XClassHint
+structure to be used.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIicon_name\fP 1i
+Specifies the icon name,
+which should be a null-terminated string.
+.IP \fInormal_hints\fP 1i
+Specifies the size hints for the window in its normal state.
+.IP \fIw\fP 1i
+Specifies the window.
+.IP \fIwindow_name\fP 1i
+Specifies the window name,
+which should be a null-terminated string.
+.IP \fIwm_hints\fP 1i
+Specifies the
+.ZN XWMHints
+structure to be used.
+.SH DESCRIPTION
+The 
+.ZN XSetWMProperties 
+convenience function provides a single programming interface 
+for setting those essential window properties that are used 
+for communicating with other clients (particularly window and session
+managers).
+.LP
+If the window_name argument is non-NULL, 
+.ZN XSetWMProperties
+calls
+.ZN XSetWMName ,
+which in turn, sets the WM_NAME property (see section 14.1.4).
+If the icon_name argument is non-NULL,
+.ZN XSetWMProperties
+calls
+.ZN XSetWMIconName ,
+which sets the WM_ICON_NAME property (see section 14.1.5).
+If the argv argument is non-NULL, 
+.ZN XSetWMProperties
+calls
+.ZN XSetCommand ,
+which sets the WM_COMMAND property (see section 14.2.1).
+Note that an argc of zero is allowed to indicate a zero-length command.
+Note also that the hostname of this machine is stored using
+.ZN XSetWMClientMachine 
+(see section 14.2.2).
+.LP
+If the normal_hints argument is non-NULL, 
+.ZN XSetWMProperties
+calls
+.ZN XSetWMNormalHints ,
+which sets the WM_NORMAL_HINTS property (see section 14.1.7).
+If the wm_hints argument is non-NULL, 
+.ZN XSetWMProperties
+calls
+.ZN XSetWMHints ,
+which sets the WM_HINTS property (see section 14.1.6).
+.LP
+If the class_hints argument is non-NULL, 
+.ZN XSetWMProperties
+calls
+.ZN XSetClassHint ,
+which sets the WM_CLASS property (see section 14.1.8).
+If the res_name member in the
+.ZN XClassHint
+structure is set to the NULL pointer and the RESOURCE_NAME environment 
+variable is set, 
+then the value of the environment variable is substituted for res_name.
+If the res_name member is NULL, 
+the environment variable is not set, 
+and argv and argv[0] are set, 
+then the value of argv[0], stripped of
+any directory prefixes, is substituted for res_name.
+.LP
+The
+.ZN XmbSetWMProperties
+and
+.ZN Xutf8SetWMProperties
+convenience functions provide a simple programming interface 
+for setting those essential window properties that are used 
+for communicating with other clients
+(particularly window and session managers).
+.LP
+If the window_name argument is non-NULL,
+they set the WM_NAME property.
+If the icon_name argument is non-NULL,
+they set the WM_ICON_NAME property.
+The window_name and icon_name arguments are null-terminated strings, for
+.ZN XmbSetWMProperties
+in the encoding of the current locale, for
+.ZN Xutf8SetWMProperties
+in UTF-8 encoding.
+If the arguments can be fully converted to the STRING encoding,
+the properties are created with type ``STRING''; 
+otherwise, the arguments are converted to Compound Text, 
+and the properties are created with type ``COMPOUND_TEXT''.
+.LP
+If the normal_hints argument is non-NULL,
+.ZN XmbSetWMProperties
+and
+.ZN Xutf8SetWMProperties
+call
+.ZN XSetWMNormalHints ,
+which sets the WM_NORMAL_HINTS property (see section 14.1.7).
+If the wm_hints argument is non-NULL, 
+.ZN XmbSetWMProperties
+and
+.ZN Xutf8SetWMProperties
+call
+.ZN XSetWMHints ,
+which sets the WM_HINTS property (see section 14.1.6).
+.LP
+If the argv argument is non-NULL,
+.ZN XmbSetWMProperties
+and
+.ZN Xutf8SetWMProperties
+set the WM_COMMAND property from argv and argc.
+An argc of zero indicates a zero-length command.
+.LP
+The hostname of the machine is stored using 
+.ZN XSetWMClientMachine 
+(see section 14.2.2).
+.LP
+If the class_hints argument is non-NULL,
+.ZN XmbSetWMProperties
+and
+.ZN Xutf8SetWMProperties
+set the WM_CLASS property.
+If the res_name member in the 
+.ZN XClassHint
+structure is set to the NULL pointer and the RESOURCE_NAME
+environment variable is set,
+the value of the environment variable is substituted for res_name.
+If the res_name member is NULL,
+the environment variable is not set, and argv and argv[0] are set,
+then the value of argv[0], stripped of any directory prefixes,
+is substituted for res_name.
+.LP
+It is assumed that the supplied class_hints.res_name and argv,
+the RESOURCE_NAME environment variable, and the hostname of the machine
+are in the encoding of the current locale.
+The corresponding WM_CLASS, WM_COMMAND, and WM_CLIENT_MACHINE properties
+are typed according to the local host locale announcer.
+No encoding conversion is performed for these strings prior to storage
+in the properties.
+.LP
+For clients that need to process the property text in a locale,
+.ZN XmbSetWMProperties
+and
+.ZN Xutf8SetWMProperties
+set the WM_LOCALE_NAME property to be the name of the current locale.
+The name is assumed to be in the Host Portable Character Encoding
+and is converted to STRING for storage in the property.
+.LP
+.ZN XSetWMProperties ,
+.ZN XmbSetWMProperties
+and
+.ZN Xutf8SetWMProperties
+can generate
+.ZN BadAlloc
+and
+.ZN BadWindow
+errors.
+.LP
+The function
+.ZN Xutf8SetWMProperties
+is an extension introduced by The XFree86 Project, Inc. in their 4.0.2
+release. Its presence is
+indicated by the macro
+.ZN X_HAVE_UTF8_STRING .
+.SH PROPERTIES
+.TP 1i
+\s-1WM_CLASS\s+1
+Set by application programs to allow window and session
+managers to obtain the application's resources from the resource database.
+.TP 1i
+\s-1WM_CLIENT_MACHINE\s+1
+The string name of the machine on which the client application is running.
+.TP 1i
+\s-1WM_COMMAND\s+1
+The command and arguments, null-separated, used to invoke the
+application.
+.TP 1i
+\s-1WM_HINTS\s+1
+Additional hints set by the client for use by the window manager.
+The C type of this property is 
+.ZN XWMHints .
+.TP 1i
+\s-1WM_ICON_NAME\s+1
+The name to be used in an icon.
+.TP 1i
+\s-1WM_NAME\s+1
+The name of the application.
+.TP 1i
+\s-1WM_NORMAL_HINTS\s+1
+Size hints for a window in its normal state.
+The C type of this property is
+.ZN XSizeHints .
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XAllocClassHint(__libmansuffix__),
+XAllocIconSize(__libmansuffix__),
+XAllocSizeHints(__libmansuffix__),
+XAllocWMHints(__libmansuffix__),
+XParseGeometry(__libmansuffix__),
+XSetCommand(__libmansuffix__),
+XSetTransientForHint(__libmansuffix__),
+XSetTextProperty(__libmansuffix__),
+XSetWMClientMachine(__libmansuffix__),
+XSetWMColormapWindows(__libmansuffix__),
+XSetWMIconName(__libmansuffix__),
+XSetWMName(__libmansuffix__),
+XSetWMProtocols(__libmansuffix__),
+XStringListToTextProperty(__libmansuffix__),
+XTextListToTextProperty(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XSetWMProtocols.man b/man/XSetWMProtocols.man
new file mode 100644 (file)
index 0000000..f3fefb6
--- /dev/null
@@ -0,0 +1,236 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSetWMProtocols __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSetWMProtocols, XGetWMProtocols \- set or read a window's WM_PROTOCOLS property
+.SH SYNTAX
+.HP
+Status XSetWMProtocols\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, Atom
+*\fIprotocols\fP\^, int \fIcount\fP\^); 
+.HP
+Status XGetWMProtocols\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^, Atom
+**\fIprotocols_return\fP\^, int *\fIcount_return\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.ds Cn protocols in the list
+.IP \fIcount\fP 1i
+Specifies the number of \*(Cn.
+.ds Cn protocols in the list
+.IP \fIcount_return\fP 1i
+Returns the number of \*(Cn.
+.IP \fIprotocols\fP 1i
+Specifies the list of protocols.
+.IP \fIprotocols_return\fP 1i
+Returns the list of protocols.
+.SH DESCRIPTION
+The 
+.ZN XSetWMProtocols 
+function replaces the WM_PROTOCOLS property on the specified window 
+with the list of atoms specified by the protocols argument.
+If the property does not already exist,
+.ZN XSetWMProtocols
+sets the WM_PROTOCOLS property on the specified window
+to the list of atoms specified by the protocols argument.
+The property is stored with a type of ATOM and a format of 32.
+If it cannot intern the WM_PROTOCOLS atom, 
+.ZN XSetWMProtocols
+returns a zero status.
+Otherwise, it returns a nonzero status.
+.LP
+.ZN XSetWMProtocols
+can generate
+.ZN BadAlloc
+and
+.ZN BadWindow
+errors.
+.LP
+The 
+.ZN XGetWMProtocols 
+function returns the list of atoms stored in the WM_PROTOCOLS property 
+on the specified window.
+These atoms describe window manager protocols in which the owner 
+of this window is willing to participate.
+If the property exists, is of type ATOM, is of format 32, 
+and the atom WM_PROTOCOLS can be interned, 
+.ZN XGetWMProtocols
+sets the protocols_return argument to a list of atoms, 
+sets the count_return argument to the number of elements in the list, 
+and returns a nonzero status.
+Otherwise, it sets neither of the return arguments
+and returns a zero status.
+To release the list of atoms, use
+.ZN XFree .
+.LP
+.ZN XGetWMProtocols
+can generate a
+.ZN BadWindow
+error.
+.SH PROPERTIES
+.TP 1i
+\s-1WM_PROTOCOLS\s+1
+List of atoms that identify the communications protocols between the
+client and window manager in which the client is willing to participate.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XAllocClassHint(__libmansuffix__),
+XAllocIconSize(__libmansuffix__),
+XAllocSizeHints(__libmansuffix__),
+XAllocWMHints(__libmansuffix__),
+XFree(__libmansuffix__),
+XSetCommand(__libmansuffix__),
+XSetTransientForHint(__libmansuffix__),
+XSetTextProperty(__libmansuffix__),
+XSetWMClientMachine(__libmansuffix__),
+XSetWMColormapWindows(__libmansuffix__),
+XSetWMIconName(__libmansuffix__),
+XSetWMName(__libmansuffix__),
+XSetWMProperties(__libmansuffix__),
+XStringListToTextProperty(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XSetWMSizeHints.man b/man/XSetWMSizeHints.man
new file mode 100644 (file)
index 0000000..9fbee38
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAllocSizeHints.__libmansuffix__
diff --git a/man/XSetWindowAttributes.man b/man/XSetWindowAttributes.man
new file mode 100644 (file)
index 0000000..e24be56
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XCreateWindow.__libmansuffix__
diff --git a/man/XSetWindowBackground.man b/man/XSetWindowBackground.man
new file mode 100644 (file)
index 0000000..490a619
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XChangeWindowAttributes.__libmansuffix__
diff --git a/man/XSetWindowBackgroundPixmap.man b/man/XSetWindowBackgroundPixmap.man
new file mode 100644 (file)
index 0000000..490a619
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XChangeWindowAttributes.__libmansuffix__
diff --git a/man/XSetWindowBorder.man b/man/XSetWindowBorder.man
new file mode 100644 (file)
index 0000000..490a619
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XChangeWindowAttributes.__libmansuffix__
diff --git a/man/XSetWindowBorderPixmap.man b/man/XSetWindowBorderPixmap.man
new file mode 100644 (file)
index 0000000..490a619
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XChangeWindowAttributes.__libmansuffix__
diff --git a/man/XSetWindowBorderWidth.man b/man/XSetWindowBorderWidth.man
new file mode 100644 (file)
index 0000000..4c16c27
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XConfigureWindow.__libmansuffix__
diff --git a/man/XSetWindowColormap.man b/man/XSetWindowColormap.man
new file mode 100644 (file)
index 0000000..490a619
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XChangeWindowAttributes.__libmansuffix__
diff --git a/man/XShrinkRegion.man b/man/XShrinkRegion.man
new file mode 100644 (file)
index 0000000..585c177
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XIntersectRegion.__libmansuffix__
diff --git a/man/XSizeHints.man b/man/XSizeHints.man
new file mode 100644 (file)
index 0000000..9fbee38
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAllocSizeHints.__libmansuffix__
diff --git a/man/XStandardColormap.man b/man/XStandardColormap.man
new file mode 100644 (file)
index 0000000..da749f6
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAllocStandardColormap.__libmansuffix__
diff --git a/man/XStoreBuffer.man b/man/XStoreBuffer.man
new file mode 100644 (file)
index 0000000..03d3c46
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XStoreBytes.__libmansuffix__
diff --git a/man/XStoreBytes.man b/man/XStoreBytes.man
new file mode 100644 (file)
index 0000000..8cc82d7
--- /dev/null
@@ -0,0 +1,253 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XStoreBytes __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XStoreBytes, XStoreBuffer, XFetchBytes, XFetchBuffer, XRotateBuffers \- manipulate cut and paste buffers
+.SH SYNTAX
+.HP
+int XStoreBytes\^(\^Display *\fIdisplay\fP\^, char *\fIbytes\fP\^, int
+\^\fInbytes\fP\^); 
+.HP
+int XStoreBuffer\^(\^Display *\fIdisplay\fP\^, char *\fIbytes\fP\^, int
+\^\fInbytes\fP\^, int \fIbuffer\fP\^); 
+.HP
+char *XFetchBytes\^(\^Display *\fIdisplay\fP\^, int *\fInbytes_return\fP\^); 
+.HP
+char *XFetchBuffer\^(\^Display *\fIdisplay\fP\^, int *\fInbytes_return\fP\^,
+int \fIbuffer\fP\^); 
+.HP
+int XRotateBuffers\^(\^Display *\fIdisplay\fP\^, int \fIrotate\fP\^); 
+.SH ARGUMENTS
+.ds Fn in which you want to store the bytes \
+or from which you want the stored data returned
+.IP \fIbuffer\fP 1i
+Specifies the buffer \*(Fn.
+.IP \fIbytes\fP 1i
+Specifies the bytes, which are not necessarily ASCII or null-terminated.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fInbytes\fP 1i
+Specifies the number of bytes to be stored.
+.IP \fInbytes_return\fP 1i
+Returns the number of bytes in the buffer.
+.IP \fIrotate\fP 1i
+Specifies how much to rotate the cut buffers.
+.SH DESCRIPTION
+The data can have embedded null characters
+and need not be null-terminated.
+The cut buffer's contents can be retrieved later by
+any client calling
+.ZN XFetchBytes .
+.LP
+.ZN XStoreBytes
+can generate a
+.ZN BadAlloc
+error.
+.LP
+If an invalid buffer is specified, the call has no effect.
+The data can have embedded null characters
+and need not be null-terminated.
+.LP
+.ZN XStoreBuffer
+can generate a
+.ZN BadAlloc
+error.
+.LP
+The
+.ZN XFetchBytes
+function
+returns the number of bytes in the nbytes_return argument,
+if the buffer contains data.
+Otherwise, the function
+returns NULL and sets nbytes to 0.
+The appropriate amount of storage is allocated and the pointer returned.
+The client must free this storage when finished with it by calling
+.ZN XFree .
+.LP
+The
+.ZN XFetchBuffer
+function returns zero to the nbytes_return argument 
+if there is no data in the buffer or if an invalid
+buffer is specified.
+.LP
+.ZN XFetchBuffer
+can generate a
+.ZN BadValue 
+error.
+.LP
+The
+.ZN XRotateBuffers
+function rotates the cut
+buffers, such that buffer 0 becomes buffer n, 
+buffer 1 becomes n + 1 mod 8, and so on.
+This cut buffer numbering is global to the display.
+Note that
+.ZN XRotateBuffers
+generates
+.ZN BadMatch
+errors if any of the eight buffers have not been created.
+.LP
+.ZN XRotateBuffers
+can generate a
+.ZN BadMatch
+error.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAlloc
+The server failed to allocate the requested resource or server memory.
+.TP 1i
+.ZN BadAtom
+A value for an Atom argument does not name a defined Atom.
+.TP 1i
+.ZN BadMatch
+Some argument or pair of arguments has the correct type and range but fails
+to match in some other way required by the request.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.SH "SEE ALSO"
+XFree(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XStoreColor.man b/man/XStoreColor.man
new file mode 100644 (file)
index 0000000..f6cbf0e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XStoreColors.__libmansuffix__
diff --git a/man/XStoreColors.man b/man/XStoreColors.man
new file mode 100644 (file)
index 0000000..6dccc93
--- /dev/null
@@ -0,0 +1,304 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XStoreColors __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XStoreColors, XStoreColor, XStoreNamedColor \- set colors
+.SH SYNTAX
+.HP
+int XStoreColors\^(\^Display *\fIdisplay\fP\^, Colormap \fIcolormap\fP\^,
+XColor \fIcolor\fP\^[\^]\^, int \fIncolors\fP\^); 
+.HP
+int XStoreColor\^(\^Display *\fIdisplay\fP\^, Colormap \fIcolormap\fP\^,
+XColor *\fIcolor\fP\^); 
+.HP
+int XStoreNamedColor\^(\^Display *\fIdisplay\fP\^, Colormap \fIcolormap\fP\^,
+char *\^\fIcolor\fP\^, unsigned long \fIpixel\fP\^, int \fIflags\fP\^);
+.SH ARGUMENTS
+.ds Co pixel and RGB values or the color name string (for example, red)
+.IP \fIcolor\fP 1i
+Specifies the \*(Co.
+.IP \fIcolor\fP 1i
+Specifies an array of color definition structures to be stored.
+.IP \fIcolormap\fP 1i
+Specifies the colormap.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIflags\fP 1i
+Specifies which red, green, and blue components are set.
+.IP \fIncolors\fP 1i
+.\"Specifies the number of color definition structures. 
+Specifies the number of 
+.ZN XColor
+structures in the color definition array.
+.IP \fIpixel\fP 1i
+Specifies the entry in the colormap. 
+.SH DESCRIPTION
+The
+.ZN XStoreColors
+function changes the colormap entries of the pixel values
+specified in the pixel members of the
+.ZN XColor
+structures.
+You specify which color components are to be changed by setting 
+.ZN DoRed ,
+.ZN DoGreen ,
+and/or
+.ZN DoBlue
+in the flags member of the
+.ZN XColor
+structures.
+If the colormap is an installed map for its screen, the
+changes are visible immediately.
+.ZN XStoreColors 
+changes the specified pixels if they are allocated writable in the colormap 
+by any client, even if one or more pixels generates an error.
+If a specified pixel is not a valid index into the colormap, a
+.ZN BadValue
+error results.
+If a specified pixel either is unallocated or is allocated read-only, a
+.ZN BadAccess
+error results.
+If more than one pixel is in error, 
+the one that gets reported is arbitrary.
+.LP
+.ZN XStoreColors
+can generate
+.ZN BadAccess ,
+.ZN BadColor ,
+and
+.ZN BadValue 
+errors.
+.LP
+The
+.ZN XStoreColor
+function changes the colormap entry of the pixel value specified in the
+pixel member of the
+.ZN XColor
+structure.
+You specified this value in the
+pixel member of the
+.ZN XColor
+structure.
+This pixel value must be a read/write cell and a valid index into the colormap.
+If a specified pixel is not a valid index into the colormap,
+a
+.ZN BadValue
+error results.
+.ZN XStoreColor
+also changes the red, green, and/or blue color components.
+You specify which color components are to be changed by setting
+.ZN DoRed ,
+.ZN DoGreen ,
+and/or
+.ZN DoBlue
+in the flags member of the
+.ZN XColor
+structure.
+If the colormap is an installed map for its screen, 
+the changes are visible immediately.
+.LP
+.ZN XStoreColor
+can generate
+.ZN BadAccess ,
+.ZN BadColor ,
+and 
+.ZN BadValue 
+errors.
+.LP
+The
+.ZN XStoreNamedColor
+function looks up the named color with respect to the screen associated with
+the colormap and stores the result in the specified colormap.
+The pixel argument determines the entry in the colormap.
+The flags argument determines which of the red, green, and blue components 
+are set. 
+You can set this member to the
+bitwise inclusive OR of the bits 
+.ZN DoRed , 
+.ZN DoGreen , 
+and 
+.ZN DoBlue .
+If the color name is not in the Host Portable Character Encoding, 
+the result is implementation-dependent.
+Use of uppercase or lowercase does not matter.
+If the specified pixel is not a valid index into the colormap, a
+.ZN BadValue
+error results.
+If the specified pixel either is unallocated or is allocated read-only, a
+.ZN BadAccess
+error results.
+.LP
+.ZN XStoreNamedColor
+can generate
+.ZN BadAccess ,
+.ZN BadColor ,
+.ZN BadName ,
+and
+.ZN BadValue 
+errors.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAccess
+A client attempted
+to free a color map entry that it did not already allocate.
+.TP 1i
+.ZN BadAccess
+A client attempted
+to store into a read-only color map entry.
+.TP 1i
+.ZN BadColor
+A value for a Colormap argument does not name a defined Colormap.
+.TP 1i
+.ZN BadName
+A font or color of the specified name does not exist.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.SH "SEE ALSO"
+XAllocColor(__libmansuffix__),
+XCreateColormap(__libmansuffix__),
+XQueryColor(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XStoreName.man b/man/XStoreName.man
new file mode 100644 (file)
index 0000000..45257dc
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetWMName.__libmansuffix__
diff --git a/man/XStoreNamedColor.man b/man/XStoreNamedColor.man
new file mode 100644 (file)
index 0000000..f6cbf0e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XStoreColors.__libmansuffix__
diff --git a/man/XStringListToTextProperty.man b/man/XStringListToTextProperty.man
new file mode 100644 (file)
index 0000000..42da5b1
--- /dev/null
@@ -0,0 +1,253 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\" Copyright \(co 2000  The XFree86 Project, Inc.
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\"
+.\" 
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XStringListToTextProperty __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XStringListToTextProperty, XTextPropertyToStringList, XFreeStringList, XTextProperty \- convert string lists and text property structure
+.SH SYNTAX
+.HP
+Status XStringListToTextProperty\^(\^char **\fIlist\fP\^, int \fIcount\fP\^,
+XTextProperty *\fItext_prop_return\fP\^); 
+.HP
+Status XTextPropertyToStringList\^(\^XTextProperty *\fItext_prop\fP\^, char
+***\fIlist_return\fP\^, int *\fIcount_return\fP\^); 
+.HP
+void XFreeStringList\^(\^char **\fIlist\fP\^); 
+.SH ARGUMENTS
+.ds Cn strings
+.IP \fIcount\fP 1i
+Specifies the number of \*(Cn.
+.ds Cn strings
+.IP \fIcount_return\fP 1i
+Returns the number of \*(Cn.
+.IP \fIlist\fP 1i
+Specifies the list of strings to be freed.
+.IP \fIlist\fP 1i
+Specifies a list of null-terminated character strings.
+.IP \fIlist_return\fP 1i
+Returns a list of null-terminated character strings.
+.IP \fItext_prop\fP 1i
+Specifies the
+.ZN XTextProperty
+structure to be used.
+.IP \fItext_prop_return\fP 1i
+Returns the
+.ZN XTextProperty
+structure.
+.SH DESCRIPTION
+The 
+.ZN XStringListToTextProperty 
+function sets the specified 
+.ZN XTextProperty
+to be of type STRING (format 8) with a value representing the
+concatenation of the specified list of null-separated character strings.
+An extra null byte (which is not included in the nitems member) 
+is stored at the end of the value field of text_prop_return.
+The strings are assumed (without verification) to be in the STRING encoding.
+If insufficient memory is available for the new value string, 
+.ZN XStringListToTextProperty
+does not set any fields in the
+.ZN XTextProperty
+structure and returns a zero status.
+Otherwise, it returns a nonzero status.
+To free the storage for the value field, use 
+.ZN XFree .
+.LP
+The 
+.ZN XTextPropertyToStringList 
+function returns a list of strings representing the null-separated elements 
+of the specified
+.ZN XTextProperty
+structure.
+The data in text_prop must be of type STRING and format 8. 
+Multiple elements of the property 
+(for example, the strings in a disjoint text selection) 
+are separated by NULL (encoding 0).
+The contents of the property are not null-terminated.
+If insufficient memory is available for the list and its elements, 
+.ZN XTextPropertyToStringList
+sets no return values and returns a zero status.
+Otherwise, it returns a nonzero status.
+To free the storage for the list and its contents, use 
+.ZN XFreeStringList .
+.LP
+The 
+.ZN XFreeStringList 
+function releases memory allocated by 
+.ZN XmbTextPropertyToTextList ,
+.ZN Xutf8TextPropertyToTextList
+and
+.ZN XTextPropertyToStringList
+and the missing charset list allocated by 
+.ZN XCreateFontSet .
+.SH STRUCTURES
+The
+.ZN XTextProperty
+structure contains:
+.LP
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+typedef struct {
+       unsigned char *value;   /\&* property data */
+       Atom encoding;  /\&* type of property */
+       int format;     /\&* 8, 16, or 32 */
+       unsigned long nitems;   /\&* number of items in value */
+} XTextProperty;
+.De
+.SH "SEE ALSO"
+XAllocClassHint(__libmansuffix__),
+XAllocIconSize(__libmansuffix__),
+XAllocSizeHints(__libmansuffix__),
+XAllocWMHints(__libmansuffix__),
+XFree(__libmansuffix__),
+XSetCommand(__libmansuffix__),
+XSetTransientForHint(__libmansuffix__),
+XSetTextProperty(__libmansuffix__),
+XSetWMClientMachine(__libmansuffix__),
+XSetWMColormapWindows(__libmansuffix__),
+XSetWMIconName(__libmansuffix__),
+XSetWMName(__libmansuffix__),
+XSetWMProperties(__libmansuffix__),
+XSetWMProtocols(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XStringToKeysym.man b/man/XStringToKeysym.man
new file mode 100644 (file)
index 0000000..515ca91
--- /dev/null
@@ -0,0 +1,226 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XStringToKeysym __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XStringToKeysym, XKeysymToString, XKeycodeToKeysym, XKeysymToKeycode, XConvertCase \- convert keysyms
+.SH SYNTAX
+.HP
+KeySym XStringToKeysym\^(\^char *\fIstring\fP\^); 
+.HP
+char *XKeysymToString\^(\^KeySym \fIkeysym\fP\^); 
+.HP
+KeySym XKeycodeToKeysym\^(\^Display *\fIdisplay\fP\^, KeyCode \fIkeycode\fP\^,
+int \fIindex\fP\^); 
+.HP
+KeyCode XKeysymToKeycode\^(\^Display *\fIdisplay\fP\^, KeySym \fIkeysym\fP\^);
+.HP
+void XConvertCase(\^KeySym \fIkeysym\fP\^, KeySym *\fIlower_return\fP\^,
+KeySym *\fIupper_return\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIindex\fP 1i
+Specifies the element of KeyCode vector.
+.IP \fIkeycode\fP 1i
+Specifies the KeyCode.
+.ds Fn searched for or converted
+.IP \fIkeysym\fP 1i
+Specifies the KeySym that is to be \*(Fn.
+.IP \fIlower_return\fP 1i
+Returns the lowercase form of keysym, or keysym.
+.IP \fIstring\fP 1i
+Specifies the name of the KeySym that is to be converted.
+.IP \fIupper_return\fP 1i
+Returns the uppercase form of keysym, or keysym.
+.SH DESCRIPTION
+Standard KeySym names are obtained from
+.hN X11/keysymdef.h
+by removing the XK_ prefix from each name.
+KeySyms that are not part of the Xlib standard also may be obtained
+with this function.
+The set of KeySyms that are available in this manner 
+and the mechanisms by which Xlib obtains them is implementation-dependent.
+.LP
+If the KeySym name is not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+If the specified string does not match a valid KeySym,
+.ZN XStringToKeysym
+returns
+.ZN NoSymbol .
+.LP
+The returned string is in a static area and must not be modified.
+The returned string is in the Host Portable Character Encoding.
+If the specified KeySym is not defined,
+.ZN XKeysymToString
+returns a NULL.
+.LP
+The
+.ZN XKeycodeToKeysym
+function uses internal Xlib tables
+and returns the KeySym defined for the specified KeyCode and
+the element of the KeyCode vector.
+If no symbol is defined,
+.ZN XKeycodeToKeysym
+returns
+.ZN NoSymbol .
+.ZN XKeycodeToKeysym
+predates the XKB extension. If you want to lookup a KeySym while
+using XKB you have to use
+.ZN XkbKeycodeToKeysym .
+.LP
+If the specified KeySym is not defined for any KeyCode,
+.ZN XKeysymToKeycode
+returns zero.
+.LP
+The
+.ZN XConvertCase
+function returns the uppercase and lowercase forms of the specified Keysym,
+if the KeySym is subject to case conversion;
+otherwise, the specified KeySym is returned to both lower_return and
+upper_return.
+Support for conversion of other than Latin and Cyrillic KeySyms is
+implementation-dependent.
+.SH "SEE ALSO"
+XkbKeycodeToKeysym(__libmansuffix__),
+XLookupKeysym(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XSubImage.man b/man/XSubImage.man
new file mode 100644 (file)
index 0000000..19e5be3
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XInitImage.__libmansuffix__
diff --git a/man/XSubtractRegion.man b/man/XSubtractRegion.man
new file mode 100644 (file)
index 0000000..585c177
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XIntersectRegion.__libmansuffix__
diff --git a/man/XSupportsLocale.man b/man/XSupportsLocale.man
new file mode 100644 (file)
index 0000000..786aa6e
--- /dev/null
@@ -0,0 +1,227 @@
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSupportsLocale __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSupportsLocale, XSetLocaleModifiers \- determine locale support and configure locale modifiers
+.SH SYNTAX
+.HP
+Bool XSupportsLocale\^(void); 
+.HP
+char *XSetLocaleModifiers\^(\^char *\fImodifier_list\fP\^); 
+.SH ARGUMENTS
+.IP \fImodifier_list\fP 1i
+Specifies the modifiers.
+.SH DESCRIPTION
+The 
+.ZN XSupportsLocale
+function returns 
+.ZN True
+if Xlib functions are capable of operating under the current locale.
+If it returns 
+.ZN False ,
+Xlib locale-dependent functions for which the 
+.ZN XLocaleNotSupported 
+return status is defined will return 
+.ZN XLocaleNotSupported .
+Other Xlib locale-dependent routines will operate in the ``C'' locale.
+.LP
+The
+.ZN XSetLocaleModifiers
+function sets the X modifiers for the current locale setting.
+The modifier_list argument is a null-terminated string of the form
+``{@\^\fIcategory\fP\^=\^\fIvalue\fP\^}'', that is,
+having zero or more concatenated ``@\^\fIcategory\fP\^=\^\fIvalue\fP\^''
+entries, where \fIcategory\fP is a category name 
+and \fIvalue\fP is the (possibly empty) setting for that category.
+The values are encoded in the current locale.
+Category names are restricted to the POSIX Portable Filename Character Set.
+.LP
+The local host X locale modifiers announcer (on POSIX-compliant systems,
+the XMODIFIERS environment variable) is appended to the modifier_list to
+provide default values on the local host.
+If a given category appears more than once in the list,
+the first setting in the list is used.
+If a given category is not included in the full modifier list,
+the category is set to an implementation-dependent default
+for the current locale.
+An empty value for a category explicitly specifies the
+implementation-dependent default.
+.LP
+If the function is successful, it returns a pointer to a string.
+The contents of the string are such that a subsequent call with that string
+(in the same locale) will restore the modifiers to the same settings.
+If modifier_list is a NULL pointer,
+.ZN XSetLocaleModifiers
+also returns a pointer to such a string,
+and the current locale modifiers are not changed.
+.LP
+If invalid values are given for one or more modifier categories supported by
+the locale, a NULL pointer is returned, and none of the
+current modifiers are changed.
+.LP
+At program startup,
+the modifiers that are in effect are unspecified until
+the first successful call to set them.  Whenever the locale is changed, the
+modifiers that are in effect become unspecified until the next successful call
+to set them.
+Clients should always call
+.ZN XSetLocaleModifiers
+with a non-NULL modifier_list after setting the locale
+before they call any locale-dependent Xlib routine.
+.LP
+The only standard modifier category currently defined is ``im'',
+which identifies the desired input method.
+The values for input method are not standardized.
+A single locale may use multiple input methods,
+switching input method under user control.
+The modifier may specify the initial input method in effect
+or an ordered list of input methods.
+Multiple input methods may be specified in a single im value string
+in an implementation-dependent manner.
+.LP
+The returned modifiers string is owned by Xlib and should not be modified or
+freed by the client.
+It may be freed by Xlib after the current locale or modifiers are changed.
+Until freed, it will not be modified by Xlib.
+.SH "SEE ALSO"
+\fI\*(xL\fP
diff --git a/man/XSync.man b/man/XSync.man
new file mode 100644 (file)
index 0000000..1fc2e3e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XFlush.__libmansuffix__
diff --git a/man/XSynchronize.man b/man/XSynchronize.man
new file mode 100644 (file)
index 0000000..cf59c90
--- /dev/null
@@ -0,0 +1,179 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XSynchronize __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XSynchronize, XSetAfterFunction \- enable or disable synchronization 
+.SH SYNTAX
+.HP
+int (*XSynchronize\^(\^Display *\fIdisplay\fP\^, Bool \fIonoff\fP\^))(); 
+.HP
+int (*XSetAfterFunction\^(\^Display *\fIdisplay\fP\^, int
+(\^*\^\fIprocedure\fP\^)\^()))(); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIprocedure\fP 1i
+Specifies the procedure to be called.
+.IP \fIonoff\fP 1i
+Specifies a Boolean value that indicates whether to enable 
+or disable synchronization.
+.SH DESCRIPTION
+The
+.ZN XSynchronize
+function returns 
+the previous after function.
+If onoff is 
+.ZN True , 
+.ZN XSynchronize
+turns on synchronous behavior.
+If onoff is
+.ZN False ,
+.ZN XSynchronize 
+turns off synchronous behavior.
+.LP
+The specified procedure is called with only a display pointer.
+.ZN XSetAfterFunction
+returns the previous after function.
+.SH "SEE ALSO"
+XSetErrorHandler(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XTextExtents.man b/man/XTextExtents.man
new file mode 100644 (file)
index 0000000..c0c524f
--- /dev/null
@@ -0,0 +1,290 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XTextExtents __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XTextExtents, XTextExtents16, XQueryTextExtents, XQueryTextExtents16 \- compute or query text extents
+.SH SYNTAX
+.HP
+int XTextExtents\^(\^XFontStruct *\fIfont_struct\fP\^, char *\fIstring\fP\^,
+int \fInchars\fP\^, int *\fIdirection_return\fP\^, int
+*\fIfont_ascent_return\fP, int *\fIfont_descent_return\fP\^, XCharStruct
+*\fIoverall_return\fP\^); 
+.HP
+int XTextExtents16\^(\^XFontStruct *\fIfont_struct\fP\^, XChar2b
+*\fIstring\fP\^, int \fInchars\fP\^, int *\fIdirection_return\fP\^, int
+*\fIfont_ascent_return\fP, int *\fIfont_descent_return\fP\^, XCharStruct
+*\fIoverall_return\fP\^); 
+.HP
+int XQueryTextExtents\^(\^Display *\fIdisplay\fP\^, XID \fIfont_ID\fP\^, char
+*\fIstring\fP\^, int \fInchars\fP\^, int *\fIdirection_return\fP\^, int
+*\fIfont_ascent_return\fP, int *\fIfont_descent_return\fP\^, XCharStruct
+*\fIoverall_return\fP\^);
+.HP
+int XQueryTextExtents16\^(\^Display *\fIdisplay\fP\^, XID \fIfont_ID\fP\^,
+XChar2b *\fIstring\fP\^, int \fInchars\fP\^, int *\fIdirection_return\fP\^,
+int *\fIfont_ascent_return\fP, int *\fIfont_descent_return\fP\^, XCharStruct
+*\fIoverall_return\fP\^); 
+.SH ARGUMENTS
+.IP \fIdirection_return\fP 1i
+Returns the value of the direction hint
+.Pn ( FontLeftToRight
+or
+.ZN FontRightToLeft ).
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIfont_ID\fP 1i
+Specifies either the font ID or the 
+.ZN GContext
+ID that contains the font.
+.IP \fIfont_ascent_return\fP 1i
+Returns the font ascent.
+.IP \fIfont_descent_return\fP 1i
+Returns the font descent.
+.IP \fIfont_struct\fP 1i
+Specifies the 
+.ZN XFontStruct 
+structure.
+.IP \fInchars\fP 1i
+Specifies the number of characters in the character string.
+.IP \fIstring\fP 1i
+Specifies the character string.
+.IP \fIoverall_return\fP 1i
+Returns the overall size in the specified
+.ZN XCharStruct 
+structure.
+.SH DESCRIPTION
+The
+.ZN XTextExtents
+and
+.ZN XTextExtents16
+functions 
+perform the size computation locally and, thereby,
+avoid the round-trip overhead of
+.ZN XQueryTextExtents 
+and
+.ZN XQueryTextExtents16 .
+Both functions return an
+.ZN XCharStruct
+structure, whose members are set to the values as follows.
+.LP
+The ascent member is set to the maximum of the ascent metrics of all
+characters in the string.
+The descent member is set to the maximum of the descent metrics.
+The width member is set to the sum of the character-width metrics of all
+characters in the string.
+For each character in the string,
+let W be the sum of the character-width metrics of all characters preceding 
+it in the string.
+Let L be the left-side-bearing metric of the character plus W.
+Let R be the right-side-bearing metric of the character plus W.
+The lbearing member is set to the minimum L of all characters in the string.
+The rbearing member is set to the maximum R.
+.LP
+For fonts defined with linear indexing rather than 2-byte matrix indexing,
+each 
+.ZN XChar2b 
+structure is interpreted as a 16-bit number with byte1 as the 
+most significant byte.
+If the font has no defined default character,
+undefined characters in the string are taken to have all zero metrics.
+.LP
+The
+.ZN XQueryTextExtents
+and
+.ZN XQueryTextExtents16
+functions return the bounding box of the specified 8-bit and 16-bit
+character string in the specified font or the font contained in the
+specified GC.
+These functions query the X server and, therefore, suffer the round-trip
+overhead that is avoided by
+.ZN XTextExtents
+and 
+.ZN XTextExtents16 .
+Both functions return a
+.ZN XCharStruct 
+structure, whose members are set to the values as follows.
+.LP
+The ascent member is set to the maximum of the ascent metrics 
+of all characters in the string.
+The descent member is set to the maximum of the descent metrics.
+The width member is set to the sum of the character-width metrics 
+of all characters in the string.
+For each character in the string,
+let W be the sum of the character-width metrics of all characters preceding
+it in the string.
+Let L be the left-side-bearing metric of the character plus W.
+Let R be the right-side-bearing metric of the character plus W.
+The lbearing member is set to the minimum L of all characters in the string.
+The rbearing member is set to the maximum R.
+.LP
+For fonts defined with linear indexing rather than 2-byte matrix indexing,
+each 
+.ZN XChar2b 
+structure is interpreted as a 16-bit number with byte1 as the 
+most significant byte.
+If the font has no defined default character,
+undefined characters in the string are taken to have all zero metrics.
+.LP
+Characters with all zero metrics are ignored.
+If the font has no defined default_char,
+the undefined characters in the string are also ignored.
+.LP
+.ZN XQueryTextExtents
+and
+.ZN XQueryTextExtents16
+can generate
+.ZN BadFont
+and
+.ZN BadGC 
+errors.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadFont
+A value for a Font or GContext argument does not name a defined Font.
+.TP 1i
+.ZN BadGC
+A value for a GContext argument does not name a defined GContext.
+.SH "SEE ALSO"
+XLoadFont(__libmansuffix__),
+XTextWidth(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XTextExtents16.man b/man/XTextExtents16.man
new file mode 100644 (file)
index 0000000..cbe0209
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XTextExtents.__libmansuffix__
diff --git a/man/XTextItem.man b/man/XTextItem.man
new file mode 100644 (file)
index 0000000..dfd6bfa
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XDrawText.__libmansuffix__
diff --git a/man/XTextItem16.man b/man/XTextItem16.man
new file mode 100644 (file)
index 0000000..dfd6bfa
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XDrawText.__libmansuffix__
diff --git a/man/XTextProperty.man b/man/XTextProperty.man
new file mode 100644 (file)
index 0000000..faf0beb
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XStringListToTextProperty.__libmansuffix__
diff --git a/man/XTextPropertyToStringList.man b/man/XTextPropertyToStringList.man
new file mode 100644 (file)
index 0000000..faf0beb
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XStringListToTextProperty.__libmansuffix__
diff --git a/man/XTextWidth.man b/man/XTextWidth.man
new file mode 100644 (file)
index 0000000..b9ec942
--- /dev/null
@@ -0,0 +1,169 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XTextWidth __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XTextWidth, XTextWidth16 \- compute text width
+.SH SYNTAX
+.HP
+int XTextWidth\^(\^XFontStruct *\fIfont_struct\fP\^, char *\fIstring\fP\^,
+int \fIcount\fP\^); 
+.HP
+int XTextWidth16\^(\^XFontStruct *\fIfont_struct\fP\^, XChar2b
+*\fIstring\fP\^, int \fIcount\fP\^); 
+.SH ARGUMENTS
+.IP \fIcount\fP 1i
+Specifies the character count in the specified string.
+.IP \fIfont_struct\fP 1i
+Specifies the font used for the width computation.
+.IP \fIstring\fP 1i
+Specifies the character string.
+.SH DESCRIPTION
+The
+.ZN XTextWidth
+and
+.ZN XTextWidth16
+functions return the width of the specified 8-bit or 2-byte character strings.
+.SH "SEE ALSO"
+XLoadFont(__libmansuffix__),
+XTextExtents(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XTextWidth16.man b/man/XTextWidth16.man
new file mode 100644 (file)
index 0000000..9a013fd
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XTextWidth.__libmansuffix__
diff --git a/man/XTimeCoord.man b/man/XTimeCoord.man
new file mode 100644 (file)
index 0000000..bfd75c0
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSendEvent.__libmansuffix__
diff --git a/man/XTranslateCoordinates.man b/man/XTranslateCoordinates.man
new file mode 100644 (file)
index 0000000..019d123
--- /dev/null
@@ -0,0 +1,200 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XTranslateCoordinates __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XTranslateCoordinates \- translate window coordinates
+.SH SYNTAX
+.HP
+Bool XTranslateCoordinates\^(\^Display *\fIdisplay\fP\^, Window \fIsrc_w\fP\^,
+\fIdest_w\fP\^, int \fIsrc_x\fP\^, int \fIsrc_y\fP\^, int
+*\fIdest_x_return\fP\^, int *\fIdest_y_return\fP\^, Window
+*\fIchild_return\fP\^); 
+.SH ARGUMENTS
+.IP \fIchild_return\fP 1i
+Returns the child if the coordinates are contained in a mapped child of the
+destination window.
+.IP \fIdest_w\fP 1i
+Specifies the destination window.
+.IP \fIdest_x_return\fP 1i
+.br
+.ns
+.IP \fIdest_y_return\fP 1i
+Return the x and y coordinates within the destination window.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIsrc_w\fP 1i
+Specifies the source window.
+.IP \fIsrc_x\fP 1i
+.br
+.ns
+.IP \fIsrc_y\fP 1i
+Specify the x and y coordinates within the source window.
+.SH DESCRIPTION
+If
+.ZN XTranslateCoordinates
+returns
+.ZN True ,
+it takes the src_x and src_y coordinates relative
+to the source window's origin and returns these coordinates to 
+dest_x_return and dest_y_return
+relative to the destination window's origin.
+If
+.ZN XTranslateCoordinates
+returns 
+.ZN False , 
+src_w and dest_w are on different screens,
+and dest_x_return and dest_y_return are zero.
+If the coordinates are contained in a mapped child of dest_w,
+that child is returned to child_return.
+Otherwise, child_return is set to
+.ZN None .
+.LP
+.ZN XTranslateCoordinates
+can generate a
+.ZN BadWindow 
+error.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+\fI\*(xL\fP
diff --git a/man/XUndefineCursor.man b/man/XUndefineCursor.man
new file mode 100644 (file)
index 0000000..ce28160
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XDefineCursor.__libmansuffix__
diff --git a/man/XUngrabButton.man b/man/XUngrabButton.man
new file mode 100644 (file)
index 0000000..c284212
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XGrabButton.__libmansuffix__
diff --git a/man/XUngrabKey.man b/man/XUngrabKey.man
new file mode 100644 (file)
index 0000000..141a941
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XGrabKey.__libmansuffix__
diff --git a/man/XUngrabKeyboard.man b/man/XUngrabKeyboard.man
new file mode 100644 (file)
index 0000000..51d9e90
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XGrabKeyboard.__libmansuffix__
diff --git a/man/XUngrabPointer.man b/man/XUngrabPointer.man
new file mode 100644 (file)
index 0000000..fce3041
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XGrabPointer.__libmansuffix__
diff --git a/man/XUngrabServer.man b/man/XUngrabServer.man
new file mode 100644 (file)
index 0000000..59e851e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XGrabServer.__libmansuffix__
diff --git a/man/XUninstallColormap.man b/man/XUninstallColormap.man
new file mode 100644 (file)
index 0000000..7f0ced3
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XInstallColormap.__libmansuffix__
diff --git a/man/XUnionRectWithRegion.man b/man/XUnionRectWithRegion.man
new file mode 100644 (file)
index 0000000..585c177
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XIntersectRegion.__libmansuffix__
diff --git a/man/XUnionRegion.man b/man/XUnionRegion.man
new file mode 100644 (file)
index 0000000..585c177
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XIntersectRegion.__libmansuffix__
diff --git a/man/XUniqueContext.man b/man/XUniqueContext.man
new file mode 100644 (file)
index 0000000..f0b9747
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSaveContext.__libmansuffix__
diff --git a/man/XUnloadFont.man b/man/XUnloadFont.man
new file mode 100644 (file)
index 0000000..ca6fa1f
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XLoadFont.__libmansuffix__
diff --git a/man/XUnlockDisplay.man b/man/XUnlockDisplay.man
new file mode 100644 (file)
index 0000000..24cf8b4
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XInitThreads.__libmansuffix__
diff --git a/man/XUnmapEvent.man b/man/XUnmapEvent.man
new file mode 100644 (file)
index 0000000..edc4f64
--- /dev/null
@@ -0,0 +1,226 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XUnmapEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XUnmapEvent \- UnmapNotify event structure
+.SH STRUCTURES
+The structure for
+.ZN UnmapNotify
+events contains:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int type;       /\&* UnmapNotify */
+       unsigned long serial;   /\&* # of last request processed by server */
+       Bool send_event;        /\&* true if this came from a SendEvent request */
+       Display *display;       /\&* Display the event was read from */
+       Window event;
+       Window window;
+       Bool from_configure;
+} XUnmapEvent;
+.De
+.LP
+When you receive this event,
+the structure members are set as follows.
+.LP
+The type member is set to the event type constant name that uniquely identifies
+it.
+For example, when the X server reports a
+.ZN GraphicsExpose
+event to a client application, it sends an
+.ZN XGraphicsExposeEvent
+structure with the type member set to
+.ZN GraphicsExpose .
+The display member is set to a pointer to the display the event was read on.
+The send_event member is set to
+.ZN True
+if the event came from a
+.ZN SendEvent
+protocol request.
+The serial member is set from the serial number reported in the protocol
+but expanded from the 16-bit least-significant bits to a full 32-bit value.
+The window member is set to the window that is most useful to toolkit
+dispatchers.
+.LP
+The event member is set either to the unmapped window or to its parent,
+depending on whether
+.ZN StructureNotify
+or
+.ZN SubstructureNotify
+was selected.
+This is the window used by the X server to report the event.
+The window member is set to the window that was unmapped.
+The from_configure member is set to
+.ZN True 
+if the event was generated as a result of a resizing of the window's parent when
+the window itself had a win_gravity of
+.ZN UnmapGravity .
+.SH "SEE ALSO"
+XAnyEvent(__libmansuffix__),
+XButtonEvent(__libmansuffix__),
+XCreateWindowEvent(__libmansuffix__),
+XCirculateEvent(__libmansuffix__),
+XCirculateRequestEvent(__libmansuffix__),
+XColormapEvent(__libmansuffix__),
+XConfigureEvent(__libmansuffix__),
+XConfigureRequestEvent(__libmansuffix__),
+XCrossingEvent(__libmansuffix__),
+XDestroyWindowEvent(__libmansuffix__),
+XErrorEvent(__libmansuffix__),
+XExposeEvent(__libmansuffix__),
+XFocusChangeEvent(__libmansuffix__),
+XGraphicsExposeEvent(__libmansuffix__),
+XGravityEvent(__libmansuffix__),
+XKeymapEvent(__libmansuffix__),
+XMapEvent(__libmansuffix__),
+XMapRequestEvent(__libmansuffix__),
+XPropertyEvent(__libmansuffix__),
+XReparentEvent(__libmansuffix__),
+XResizeRequestEvent(__libmansuffix__),
+XSelectionClearEvent(__libmansuffix__),
+XSelectionEvent(__libmansuffix__),
+XSelectionRequestEvent(__libmansuffix__),
+XVisibilityEvent(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XUnmapSubwindows.man b/man/XUnmapSubwindows.man
new file mode 100644 (file)
index 0000000..bce33d5
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XUnmapWindow.__libmansuffix__
diff --git a/man/XUnmapWindow.man b/man/XUnmapWindow.man
new file mode 100644 (file)
index 0000000..5c6cd33
--- /dev/null
@@ -0,0 +1,210 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XUnmapWindow __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XUnmapWindow, XUnmapSubwindows \- unmap windows
+.SH SYNTAX
+.HP
+int XUnmapWindow\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^); 
+.HP
+int XUnmapSubwindows\^(\^Display *\fIdisplay\fP\^, Window \fIw\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIw\fP 1i
+Specifies the window.
+.SH DESCRIPTION
+The
+.ZN XUnmapWindow
+function unmaps the specified window and causes the X server to generate an
+.ZN UnmapNotify
+.IN "UnmapNotify Event"
+.IN "XUnmapWindow"
+event.
+If the specified window is already unmapped, 
+.ZN XUnmapWindow 
+has no effect.
+Normal exposure processing on formerly obscured windows is performed.
+Any child window will no longer be visible until another map call is
+made on the parent.
+In other words, the subwindows are still mapped but are not visible
+until the parent is mapped.
+Unmapping a window will generate 
+.ZN Expose 
+events on windows that were formerly obscured by it.
+.LP
+.ZN XUnmapWindow
+can generate a
+.ZN BadWindow 
+error.
+.LP
+The
+.ZN XUnmapSubwindows
+function unmaps all subwindows for the specified window in bottom-to-top
+stacking order.
+It causes the X server to generate an
+.ZN UnmapNotify
+event on each subwindow and 
+.ZN Expose 
+events on formerly obscured windows.
+.IN "UnmapNotify Event"
+Using this function is much more efficient than unmapping multiple windows
+one at a time because the server needs to perform much of the work
+only once, for all of the windows, rather than for each window.
+.LP
+.ZN XUnmapSubwindows
+can generate a
+.ZN BadWindow 
+error.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XChangeWindowAttributes(__libmansuffix__),
+XConfigureWindow(__libmansuffix__),
+XCreateWindow(__libmansuffix__),
+XDestroyWindow(__libmansuffix__),
+XMapWindow(__libmansuffix__)
+XRaiseWindow(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XUnregisterIMInstantiateCallback.man b/man/XUnregisterIMInstantiateCallback.man
new file mode 100644 (file)
index 0000000..6365409
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XOpenIM.__libmansuffix__
diff --git a/man/XUnsetICFocus.man b/man/XUnsetICFocus.man
new file mode 100644 (file)
index 0000000..7f2d2dd
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetICFocus.__libmansuffix__
diff --git a/man/XVaCreateNestedList.man b/man/XVaCreateNestedList.man
new file mode 100644 (file)
index 0000000..7ccdadb
--- /dev/null
@@ -0,0 +1,169 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XVaCreateNestedList __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XVaCreateNestedList \- allocate a nested variable argument list
+.SH SYNTAX
+typedef void * XVaNestedList;
+.HP
+XVaNestedList XVaCreateNestedList\^(\^int \fIdummy\fP\^, ...\^); 
+.SH ARGUMENTS
+.IP \fIdummy\fP 1i
+Specifies an unused argument (required by ANSI C).
+.ds Al
+.IP ... 1i
+Specifies the variable length argument list\*(Al.
+.SH DESCRIPTION
+The
+.ZN XVaCreateNestedList
+function allocates memory and copies its arguments into
+a single list pointer,
+which may be used as a value for arguments requiring a list value.
+Any entries are copied as specified.
+Data passed by reference is not copied;
+the caller must ensure data remains valid for the lifetime
+of the nested list.
+The list should be freed using
+.ZN XFree
+when it is no longer needed.
+.SH "SEE ALSO"
+\fI\*(xL\fP
diff --git a/man/XVisibilityEvent.man b/man/XVisibilityEvent.man
new file mode 100644 (file)
index 0000000..0cdf54c
--- /dev/null
@@ -0,0 +1,244 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XVisibilityEvent __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XVisibilityEvent \- VisibilityNotify event structure
+.SH STRUCTURES
+The structure for
+.ZN VisibilityNotify
+events contains:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       int type;       /\&* VisibilityNotify */
+       unsigned long serial;   /\&* # of last request processed by server */
+       Bool send_event;        /\&* true if this came from a SendEvent request */
+       Display *display;       /\&* Display the event was read from */
+       Window window;
+       int state;
+} XVisibilityEvent;
+.De
+.LP
+When you receive this event,
+the structure members are set as follows.
+.LP
+The type member is set to the event type constant name that uniquely identifies
+it.
+For example, when the X server reports a
+.ZN GraphicsExpose
+event to a client application, it sends an
+.ZN XGraphicsExposeEvent
+structure with the type member set to
+.ZN GraphicsExpose .
+The display member is set to a pointer to the display the event was read on.
+The send_event member is set to
+.ZN True
+if the event came from a
+.ZN SendEvent
+protocol request.
+The serial member is set from the serial number reported in the protocol
+but expanded from the 16-bit least-significant bits to a full 32-bit value.
+The window member is set to the window that is most useful to toolkit
+dispatchers.
+.LP
+The window member is set to the window whose visibility state changes.
+The state member is set to the state of the window's visibility and can be
+.ZN VisibilityUnobscured ,
+.ZN VisibilityPartiallyObscured ,
+or
+.ZN VisibilityFullyObscured .
+The X server ignores all of a window's subwindows
+when determining the visibility state of the window and processes 
+.ZN VisibilityNotify
+events according to the following:
+.IP \(bu 5
+When the window changes state from partially obscured, fully obscured,
+or not viewable to viewable and completely unobscured,
+the X server generates the event with the state member of the
+.ZN XVisibilityEvent
+structure set to
+.ZN VisibilityUnobscured .
+.IP \(bu 5
+When the window changes state from viewable and completely unobscured or 
+not viewable to viewable and partially obscured,
+the X server generates the event with the state member of the
+.ZN XVisibilityEvent
+structure set to
+.ZN VisibilityPartiallyObscured .
+.IP \(bu 5
+When the window changes state from viewable and completely unobscured, 
+viewable and partially obscured, or not viewable to viewable and 
+fully obscured,
+the X server generates the event with the state member of the
+.ZN XVisibilityEvent
+structure set to
+.ZN VisibilityFullyObscured .
+.SH "SEE ALSO"
+XAnyEvent(__libmansuffix__),
+XButtonEvent(__libmansuffix__),
+XCreateWindowEvent(__libmansuffix__),
+XCirculateEvent(__libmansuffix__),
+XCirculateRequestEvent(__libmansuffix__),
+XColormapEvent(__libmansuffix__),
+XConfigureEvent(__libmansuffix__),
+XConfigureRequestEvent(__libmansuffix__),
+XCrossingEvent(__libmansuffix__),
+XDestroyWindowEvent(__libmansuffix__),
+XErrorEvent(__libmansuffix__),
+XExposeEvent(__libmansuffix__),
+XFocusChangeEvent(__libmansuffix__),
+XGraphicsExposeEvent(__libmansuffix__),
+XGravityEvent(__libmansuffix__),
+XKeymapEvent(__libmansuffix__),
+XMapEvent(__libmansuffix__),
+XMapRequestEvent(__libmansuffix__),
+XPropertyEvent(__libmansuffix__),
+XReparentEvent(__libmansuffix__),
+XResizeRequestEvent(__libmansuffix__),
+XSelectionClearEvent(__libmansuffix__),
+XSelectionEvent(__libmansuffix__),
+XSelectionRequestEvent(__libmansuffix__),
+XUnmapEvent(__libmansuffix__),
+.br
+\fI\*(xL\fP
diff --git a/man/XVisualIDFromVisual.man b/man/XVisualIDFromVisual.man
new file mode 100644 (file)
index 0000000..8a408c5
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XGetVisualInfo.__libmansuffix__
diff --git a/man/XVisualInfo.man b/man/XVisualInfo.man
new file mode 100644 (file)
index 0000000..8a408c5
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XGetVisualInfo.__libmansuffix__
diff --git a/man/XWMGeometry.man b/man/XWMGeometry.man
new file mode 100644 (file)
index 0000000..6fd2279
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XParseGeometry.__libmansuffix__
diff --git a/man/XWMHints.man b/man/XWMHints.man
new file mode 100644 (file)
index 0000000..1e15d7e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XAllocWMHints.__libmansuffix__
diff --git a/man/XWarpPointer.man b/man/XWarpPointer.man
new file mode 100644 (file)
index 0000000..930e8a5
--- /dev/null
@@ -0,0 +1,217 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XWarpPointer __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XWarpPointer \- move pointer
+.SH SYNTAX
+.HP
+int XWarpPointer\^(\^Display *\fIdisplay\fP\^, Window \fIsrc_w\fP\^, Window
+\fIdest_w\fP\^, int \fIsrc_x\fP\^, int \fIsrc_y\fP\^, unsigned int
+\fIsrc_width\fP\^, unsigned int \fIsrc_height\fP\^, int \fIdest_x\fP\^, int
+\fIdest_y\fP\^); 
+.SH ARGUMENTS
+.IP \fIdest_w\fP 1i
+Specifies the destination window or
+.ZN None .
+.IP \fIdest_x\fP 1i
+.br
+.ns
+.IP \fIdest_y\fP 1i
+Specify the x and y coordinates within the destination window.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIsrc_x\fP 1i
+.br
+.ns
+.IP \fIsrc_y\fP 1i
+.br
+.ns
+.IP \fIsrc_width\fP 1i
+.br
+.ns
+.IP \fIsrc_height\fP 1i
+Specify a rectangle in the source window.
+.IP \fIsrc_w\fP 1i
+Specifies the source window or
+.ZN None .
+.SH DESCRIPTION
+If dest_w is
+.ZN None ,
+.ZN XWarpPointer
+moves the pointer by the offsets (dest_x, dest_y) relative to the current
+position of the pointer.
+If dest_w is a window,
+.ZN XWarpPointer
+moves the pointer to the offsets (dest_x, dest_y) relative to the origin of
+dest_w.
+However, if src_w is a window,
+the move only takes place if the window src_w contains the pointer 
+and if the specified rectangle of src_w contains the pointer.
+.LP
+The src_x and src_y coordinates are relative to the origin of src_w.
+If src_height is zero,
+it is replaced with the current height of src_w minus src_y.
+If src_width is zero,
+it is replaced with the current width of src_w minus src_x.
+.LP
+There is seldom any reason for calling this function. 
+The pointer should normally be left to the user.
+If you do use this function, however, it generates events just as if the user
+had instantaneously moved the pointer from one position to another.
+Note that you cannot use
+.ZN XWarpPointer
+to move the pointer outside the confine_to window of an active pointer grab.
+An attempt to do so will only move the pointer as far as the closest edge of the
+confine_to window. 
+.LP
+.ZN XWarpPointer
+can generate a
+.ZN BadWindow 
+error.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadWindow
+A value for a Window argument does not name a defined Window.
+.SH "SEE ALSO"
+XSetInputFocus(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XWindowAttributes.man b/man/XWindowAttributes.man
new file mode 100644 (file)
index 0000000..d58c103
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XGetWindowAttributes.__libmansuffix__
diff --git a/man/XWindowChanges.man b/man/XWindowChanges.man
new file mode 100644 (file)
index 0000000..4c16c27
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XConfigureWindow.__libmansuffix__
diff --git a/man/XWindowEvent.man b/man/XWindowEvent.man
new file mode 100644 (file)
index 0000000..6f5346e
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XNextEvent.__libmansuffix__
diff --git a/man/XWithdrawWindow.man b/man/XWithdrawWindow.man
new file mode 100644 (file)
index 0000000..ad57b19
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XIconifyWindow.__libmansuffix__
diff --git a/man/XWriteBitmapFile.man b/man/XWriteBitmapFile.man
new file mode 100644 (file)
index 0000000..ff0c276
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XReadBitmapFile.__libmansuffix__
diff --git a/man/XXorRegion.man b/man/XXorRegion.man
new file mode 100644 (file)
index 0000000..585c177
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XIntersectRegion.__libmansuffix__
diff --git a/man/XcmsAllocColor.man b/man/XcmsAllocColor.man
new file mode 100644 (file)
index 0000000..0cef6a8
--- /dev/null
@@ -0,0 +1,255 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XcmsAllocColor __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XcmsAllocColor, XcmsAllocNamedColor \- allocate colors
+.SH SYNTAX
+.HP
+Status XcmsAllocColor\^(\^Display *\fIdisplay\fP\^, Colormap \fIcolormap\fP\^,
+XcmsColor *\fIcolor_in_out\fP\^, XcmsColorFormat \fIresult_format\fP\^); 
+.HP
+Status XcmsAllocNamedColor\^(\^Display *\fIdisplay\fP\^, Colormap
+\fIcolormap\fP\^, char *\fIcolor_string\fP\^, XcmsColor
+*\fIcolor_screen_return\fP\^, XcmsColor *\fIcolor_exact_return\fP\^, XcmsColorFormat \fIresult_format\fP\^);
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIcolormap\fP 1i
+Specifies the colormap.
+.IP \fIcolor_exact_return\fP 1i
+Returns the color specification parsed from the color string
+or parsed from the corresponding string found in a color-name database.
+.IP \fIcolor_in_out\fP 1i
+Specifies the color to allocate and returns the pixel and color 
+that is actually used in the colormap.
+.IP \fIcolor_screen_return\fP 1i
+Returns the pixel value of the color cell and color specification 
+that actually is stored for that cell.
+.ds St \ whose color definition structure is to be returned
+.IP \fIcolor_string\fP 1i
+Specifies the color string\*(St.
+.IP \fIresult_format\fP 1i
+Specifies the color format for the returned color specification.
+.SH DESCRIPTION
+The
+.ZN XcmsAllocColor
+function is similar to
+.ZN XAllocColor
+except the color can be specified in any format.
+The
+.ZN XcmsAllocColor
+function ultimately calls 
+.ZN XAllocColor
+to allocate a read-only color cell (colormap entry) with the specified color.
+.ZN XcmsAllocColor
+first converts the color specified
+to an RGB value and then passes this to
+.ZN XAllocColor .
+.ZN XcmsAllocColor
+returns the pixel value of the color cell and the color specification
+actually allocated.
+This returned color specification is the result of converting the RGB value
+returned by 
+.ZN XAllocColor 
+into the format specified with the result_format argument.
+If there is no interest in a returned color specification, 
+unnecessary computation can be bypassed if result_format is set to
+.ZN XcmsRGBFormat .
+The corresponding colormap cell is read-only.
+If this routine returns 
+.ZN XcmsFailure , 
+the color_in_out color specification is left unchanged.
+.LP
+.ZN XcmsAllocColor
+can generate a
+.ZN BadColor
+errors.
+.LP
+The
+.ZN XcmsAllocNamedColor
+function is similar to
+.ZN XAllocNamedColor
+except that the color returned can be in any format specified.
+This function
+ultimately calls
+.ZN XAllocColor
+to allocate a read-only color cell with
+the color specified by a color string.
+The color string is parsed into an
+.ZN XcmsColor
+structure (see
+.ZN XcmsLookupColor ),
+converted
+to an RGB value, and finally passed to
+.ZN XAllocColor .
+If the color name is not in the Host Portable Character Encoding, 
+the result is implementation-dependent.
+Use of uppercase or lowercase does not matter.
+.LP
+This function returns both the color specification as a result
+of parsing (exact specification) and the actual color specification
+stored (screen specification).
+This screen specification is the result of converting the RGB value
+returned by
+.ZN XAllocColor
+into the format specified in result_format.
+If there is no interest in a returned color specification,
+unnecessary computation can be bypassed if result_format is set to
+.ZN XcmsRGBFormat .
+If color_screen_return and color_exact_return
+point to the same structure, the pixel field will be set correctly,
+but the color values are undefined.
+.LP
+.LP
+.ZN XcmsAllocNamedColor
+can generate a
+.ZN BadColor
+errors.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadColor
+A value for a Colormap argument does not name a defined Colormap.
+.SH "SEE ALSO"
+XcmsQueryColor(__libmansuffix__),
+XcmsStoreColor(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XcmsAllocNamedColor.man b/man/XcmsAllocNamedColor.man
new file mode 100644 (file)
index 0000000..6801d86
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XcmsAllocColor.__libmansuffix__
diff --git a/man/XcmsCCCOfColormap.man b/man/XcmsCCCOfColormap.man
new file mode 100644 (file)
index 0000000..26ce027
--- /dev/null
@@ -0,0 +1,187 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XcmsCCCOfColormap __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XcmsCCCOfColormap, XcmsSetCCCOfColormap \- query and modify CCC of a colormap
+.SH SYNTAX
+.HP
+XcmsCCC XcmsCCCOfColormap\^(\^Display *\fIdisplay\fP\^, Colormap
+\fIcolormap\fP\^);
+.HP
+XcmsCCC XcmsSetCCCOfColormap\^(\^Display *\fIdisplay\fP\^, Colormap
+\fIcolormap\fP\^, XcmsCCC \fIccc\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIccc\fP 1i
+Specifies the CCC.
+.IP \fIcolormap\fP 1i
+Specifies the colormap.
+.SH DESCRIPTION
+The
+.ZN XcmsCCCOfColormap
+function returns the CCC associated with the specified colormap.
+Once obtained, 
+the CCC attributes can be queried or modified.
+Unless the CCC associated with the specified colormap is changed with
+.ZN XcmsSetCCCOfColormap ,
+this CCC is used when the specified colormap is used as an argument 
+to color functions.
+.LP
+The
+.ZN XcmsSetCCCOfColormap
+function changes the CCC associated with the specified colormap.
+It returns the CCC previously associated with the colormap.
+If they are not used again in the application,
+CCCs should be freed by calling
+.ZN XcmsFreeCCC .
+Several colormaps may share the same CCC without restriction; this
+includes the CCCs generated by Xlib with each colormap.  Xlib, however,
+creates a new CCC with each new colormap.
+.SH "SEE ALSO"
+DisplayOfCCC(__libmansuffix__),
+XcmsConvertColors(__libmansuffix__),
+XcmsCreateCCC(__libmansuffix__),
+XcmsDefaultCCC(__libmansuffix__),
+XcmsSetWhitePoint(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XcmsCIELab.man b/man/XcmsCIELab.man
new file mode 100644 (file)
index 0000000..a002aa6
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XcmsColor.__libmansuffix__
diff --git a/man/XcmsCIELabQueryMaxC.man b/man/XcmsCIELabQueryMaxC.man
new file mode 100644 (file)
index 0000000..03beb48
--- /dev/null
@@ -0,0 +1,221 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XcmsCIELabQueryMax __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XcmsCIELabQueryMaxC, XcmsCIELabQueryMaxL, XcmsCIELabQueryMaxLC, XcmsCIELabQueryMinL \- obtain the CIE L*a*b* coordinates
+.SH SYNTAX
+.HP
+Status XcmsCIELabQueryMaxC\^(\^XcmsCCC \fIccc\fP\^, XcmsFloat
+\fIhue_angle\fP\^, XcmsFloat \fIL_star\fP\^, XcmsColor *\fIcolor_return\fP\^);
+.HP
+Status XcmsCIELabQueryMaxL\^(\^XcmsCCC \fIccc\fP\^, XcmsFloat
+\fIhue_angle\fP\^, XcmsFloat \fIchroma\fP\^, XcmsColor *\fIcolor_return\fP\^);
+.HP
+Status XcmsCIELabQueryMaxLC\^(\^XcmsCCC \fIccc\fP\^, XcmsFloat
+\fIhue_angle\fP\^, XcmsColor *\fIcolor_return\fP\^); 
+.HP
+Status XcmsCIELabQueryMinL\^(\^XcmsCCC \fIccc\fP\^, XcmsFloat
+\fIhue_angle\fP\^, XcmsFloat \fIchroma\fP\^, XcmsColor *\fIcolor_return\fP\^);
+.SH ARGUMENTS
+.IP \fIccc\fP 1i
+Specifies the CCC.
+Note that the CCC's Client White Point and White Point Adjustment procedures
+are ignored.
+.ds Ch maximum lightness (MaxL) or minimum lightness (MinL)
+.IP \fIchroma\fP 1i
+Specifies the chroma at which to find \*(Ch.
+.ds Lc maximum chroma (MaxC and MaxLC), maximum lightness (MaxL), \
+or minimum lightness (MinL)
+.ds lC hue angle and lightness (MaxC), hue angle and chroma (MaxL and MinL), \
+or hue angle (MaxLC)
+.IP \fIcolor_return\fP 1i
+Returns the CIE L*a*b* coordinates of \*(Lc
+displayable by the screen for the given \*(lC.
+The white point associated with the returned
+color specification is the Screen White Point.
+The value returned in the pixel member is undefined.
+.ds Ha maximum chroma (MaxC and MaxLC), maximum lightness (MaxL), \
+or minimum lightness (MinL)
+.IP \fIhue_angle\fP 1i
+Specifies the hue angle (in degrees) at which to find \*(Ha.
+.ds Ls maximum chroma (MaxC)
+.IP \fIL_star\fP 1i
+Specifies the lightness (L*) at which to find \*(Ls.
+.SH DESCRIPTION
+The
+.ZN XcmsCIELabQueryMaxC
+function, given a hue angle and lightness,
+finds the point of maximum chroma displayable by the screen.
+It returns this point in CIE L*a*b* coordinates.
+.LP
+The
+.ZN XcmsCIELabQueryMaxL
+function, given a hue angle and chroma,
+finds the point in CIE L*a*b* color space of maximum 
+lightness (L*) displayable by the screen.
+It returns this point in CIE L*a*b* coordinates.
+An 
+.ZN XcmsFailure
+return value usually indicates that the given chroma
+is beyond maximum for the given hue angle.
+.LP
+The
+.ZN XcmsCIELabQueryMaxLC
+function, given a hue angle,
+finds the point of maximum chroma displayable by the screen.
+It returns this point in CIE L*a*b* coordinates.
+.LP
+The
+.ZN XcmsCIELabQueryMinL
+function, given a hue angle and chroma,
+finds the point of minimum lightness (L*) displayable by the screen.
+It returns this point in CIE L*a*b* coordinates.
+An 
+.ZN XcmsFailure
+return value usually indicates that the given chroma
+is beyond maximum for the given hue angle.
+.SH "SEE ALSO"
+XcmsCIELuvQueryMaxC(__libmansuffix__),
+XcmsTekHVCQueryMaxC(__libmansuffix__),
+XcmsQueryBlack(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XcmsCIELabQueryMaxL.man b/man/XcmsCIELabQueryMaxL.man
new file mode 100644 (file)
index 0000000..6cb1ff1
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XcmsCIELabQueryMaxC.__libmansuffix__
diff --git a/man/XcmsCIELabQueryMaxLC.man b/man/XcmsCIELabQueryMaxLC.man
new file mode 100644 (file)
index 0000000..6cb1ff1
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XcmsCIELabQueryMaxC.__libmansuffix__
diff --git a/man/XcmsCIELabQueryMinL.man b/man/XcmsCIELabQueryMinL.man
new file mode 100644 (file)
index 0000000..6cb1ff1
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XcmsCIELabQueryMaxC.__libmansuffix__
diff --git a/man/XcmsCIELuv.man b/man/XcmsCIELuv.man
new file mode 100644 (file)
index 0000000..a002aa6
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XcmsColor.__libmansuffix__
diff --git a/man/XcmsCIELuvQueryMaxC.man b/man/XcmsCIELuvQueryMaxC.man
new file mode 100644 (file)
index 0000000..41113dd
--- /dev/null
@@ -0,0 +1,221 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XcmsCIELuvQueryMaxC __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XcmsCIELuvQueryMaxC, XcmsCIELuvQueryMaxL, XcmsCIELuvQueryMaxLC, XcmsCIELuvQueryMinL \- obtain the CIE L*u*v* coordinates
+.SH SYNTAX
+.HP
+Status XcmsCIELuvQueryMaxC\^(\^XcmsCCC \fIccc\fP\^, XcmsFloat
+\fIhue_angle\fP\^, XcmsFloat \fIL_star\fP\^, XcmsColor *\fIcolor_return\fP\^);
+.HP
+Status XcmsCIELuvQueryMaxL\^(\^XcmsCCC \fIccc\fP\^, XcmsFloat
+\fIhue_angle\fP\^, XcmsFloat \fIchroma\fP\^, XcmsColor *\fIcolor_return\fP\^);
+.HP
+Status XcmsCIELuvQueryMaxLC\^(\^XcmsCCC \fIccc\fP\^, XcmsFloat
+\fIhue_angle\fP\^, XcmsColor *\fIcolor_return\fP\^); 
+.HP
+Status XcmsCIELuvQueryMinL\^(\^XcmsCCC \fIccc\fP\^, XcmsFloat
+\fIhue_angle\fP\^, XcmsFloat \fIchroma\fP\^, XcmsColor *\fIcolor_return\fP\^);
+.SH ARGUMENTS
+.IP \fIccc\fP 1i
+Specifies the CCC.
+Note that the CCC's Client White Point and White Point Adjustment procedures
+are ignored.
+.ds Ch maximum lightness (MaxL) or minimum lightness (MinL)
+.IP \fIchroma\fP 1i
+Specifies the chroma at which to find \*(Ch.
+.ds Lc maximum chroma (MaxC and MaxLC), maximum lightness (MaxL), \
+or minimum lightness (MinL)
+.ds lC hue angle and lightness (MaxC), hue angle and chroma (MaxL and MinL), \
+or hue angle (MaxLC)
+.IP \fIcolor_return\fP 1i
+Returns the CIE L*u*v* coordinates of \*(Lc
+displayable by the screen for the given \*(lC.
+The white point associated with the returned
+color specification is the Screen White Point.
+The value returned in the pixel member is undefined.
+.ds Ha maximum chroma (MaxC and MaxLC), maximum lightness (MaxL), \
+or minimum lightness (MinL)
+.IP \fIhue_angle\fP 1i
+Specifies the hue angle (in degrees) at which to find \*(Ha.
+.ds Ls maximum chroma (MaxC) or maximum lightness (MaxL)
+.IP \fIL_star\fP 1i
+Specifies the lightness (L*) at which to find \*(Ls.
+.SH DESCRIPTION
+The
+.ZN XcmsCIELuvQueryMaxC
+function, given a hue angle and lightness,
+finds the point of maximum chroma displayable by the screen.
+It returns this point in CIE L*u*v* coordinates.
+.LP
+The
+.ZN XcmsCIELuvQueryMaxL
+function, given a hue angle and chroma,
+finds the point in CIE L*u*v* color space of maximum 
+lightness (L*) displayable by the screen.
+It returns this point in CIE L*u*v* coordinates.
+An 
+.ZN XcmsFailure
+return value usually indicates that the given chroma
+is beyond maximum for the given hue angle.
+.LP
+The
+.ZN XcmsCIELuvQueryMaxLC
+function, given a hue angle,
+finds the point of maximum chroma displayable by the screen.
+It returns this point in CIE L*u*v* coordinates.
+.LP
+The
+.ZN XcmsCIELuvQueryMinL
+function, given a hue angle and chroma,
+finds the point of minimum lightness (L*) displayable by the screen.
+It returns this point in CIE L*u*v* coordinates.
+An 
+.ZN XcmsFailure
+return value usually indicates that the given chroma
+is beyond maximum for the given hue angle.
+.SH "SEE ALSO"
+XcmsCIELabQueryMaxC(__libmansuffix__),
+XcmsTekHVCQueryMaxC(__libmansuffix__),
+XcmsQueryBlack(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XcmsCIELuvQueryMaxL.man b/man/XcmsCIELuvQueryMaxL.man
new file mode 100644 (file)
index 0000000..fb59872
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XcmsCIELuvQueryMaxC.__libmansuffix__
diff --git a/man/XcmsCIELuvQueryMaxLC.man b/man/XcmsCIELuvQueryMaxLC.man
new file mode 100644 (file)
index 0000000..fb59872
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XcmsCIELuvQueryMaxC.__libmansuffix__
diff --git a/man/XcmsCIELuvQueryMinL.man b/man/XcmsCIELuvQueryMinL.man
new file mode 100644 (file)
index 0000000..fb59872
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XcmsCIELuvQueryMaxC.__libmansuffix__
diff --git a/man/XcmsCIEXYZ.man b/man/XcmsCIEXYZ.man
new file mode 100644 (file)
index 0000000..a002aa6
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XcmsColor.__libmansuffix__
diff --git a/man/XcmsCIEuvY.man b/man/XcmsCIEuvY.man
new file mode 100644 (file)
index 0000000..a002aa6
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XcmsColor.__libmansuffix__
diff --git a/man/XcmsCIExyY.man b/man/XcmsCIExyY.man
new file mode 100644 (file)
index 0000000..a002aa6
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XcmsColor.__libmansuffix__
diff --git a/man/XcmsColor.man b/man/XcmsColor.man
new file mode 100644 (file)
index 0000000..9bd38f5
--- /dev/null
@@ -0,0 +1,263 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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
+.de EX
+.sp
+.nf
+.ft CW
+..
+.de EE
+.ft R
+.fi
+.sp
+..
+.TH XcmsColor __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XcmsColor, XcmsRGB, XcmsRGBi, XcmsCIEXYZ, XcmsCIEuvY, XcmsCIExyY, XcmsCIELab, XcmsCIELuv, XcmsTekHVC, XcmsPad \- Xcms color structure
+.SH STRUCTURES
+The structure for
+.ZN XcmsColor
+contains:
+.LP
+.EX
+typedef unsigned long XcmsColorFormat;                 /\&* Color Specification Format */
+
+typedef struct {
+       union {
+               XcmsRGB RGB;
+               XcmsRGBi RGBi;
+               XcmsCIEXYZ CIEXYZ;
+               XcmsCIEuvY CIEuvY;
+               XcmsCIExyY CIExyY;
+               XcmsCIELab CIELab;
+               XcmsCIELuv CIELuv;
+               XcmsTekHVC TekHVC;
+               XcmsPad Pad;
+       } spec;
+       unsigned long pixel;
+       XcmsColorFormat format;
+} XcmsColor;                   /\&* Xcms Color Structure */
+.EE
+.LP
+.EX
+typedef double XcmsFloat;
+
+typedef struct {
+       unsigned short red;     /\&* 0x0000 to 0xffff */
+       unsigned short green;   /\&* 0x0000 to 0xffff */
+       unsigned short blue;    /\&* 0x0000 to 0xffff */
+} XcmsRGB;             /\&* RGB Device */
+.EE
+.LP
+.EX
+typedef struct {
+       XcmsFloat red;  /\&* 0.0 to 1.0 */
+       XcmsFloat green;        /\&* 0.0 to 1.0 */
+       XcmsFloat blue; /\&* 0.0 to 1.0 */
+} XcmsRGBi;            /\&* RGB Intensity */
+.EE
+.LP
+.EX
+typedef struct {
+       XcmsFloat X;
+       XcmsFloat Y;    /\&* 0.0 to 1.0 */
+       XcmsFloat Z;
+} XcmsCIEXYZ;          /\&* CIE XYZ */
+.EE
+.LP
+.EX
+typedef struct {
+       XcmsFloat u_prime;      /\&* 0.0 to ~0.6 */
+       XcmsFloat v_prime;      /\&* 0.0 to ~0.6 */
+       XcmsFloat Y;    /\&* 0.0 to 1.0 */
+} XcmsCIEuvY;          /\&* CIE u'v'Y */
+.EE
+.LP
+.EX
+typedef struct {
+       XcmsFloat x;    /\&* 0.0 to ~.75 */
+       XcmsFloat y;    /\&* 0.0 to ~.85 */
+       XcmsFloat Y;    /\&* 0.0 to 1.0 */
+} XcmsCIExyY;          /\&* CIE xyY */
+.EE
+.LP
+.EX
+typedef struct {
+       XcmsFloat L_star;       /\&* 0.0 to 100.0 */
+       XcmsFloat a_star;
+       XcmsFloat b_star;
+} XcmsCIELab;          /\&* CIE L*a*b* */
+.EE
+.LP
+.EX
+typedef struct {
+       XcmsFloat L_star;       /\&* 0.0 to 100.0 */
+       XcmsFloat u_star;
+       XcmsFloat v_star;
+} XcmsCIELuv;          /\&* CIE L*u*v* */
+.EE
+.LP
+.EX
+typedef struct {
+       XcmsFloat H;    /\&* 0.0 to 360.0 */
+       XcmsFloat V;    /\&* 0.0 to 100.0 */
+       XcmsFloat C;    /\&* 0.0 to 100.0 */
+} XcmsTekHVC;          /\&* TekHVC */
+.EE
+.LP
+.EX
+typedef struct {
+       XcmsFloat pad0;
+       XcmsFloat pad1;
+       XcmsFloat pad2;
+       XcmsFloat pad3;
+} XcmsPad;             /\&* four doubles */
+.EE
+.SH DESCRIPTION
+The
+.ZN XcmsColor
+structure contains a union of substructures,
+each supporting color specification encoding for a particular color space.
+.SH "SEE ALSO"
+XcmsAllocColor(__libmansuffix__),
+XcmsStoreColor(__libmansuffix__),
+XcmsConvertColors(__libmansuffix__),
+.LP
+\fI\*(xL\fP
diff --git a/man/XcmsConvertColors.man b/man/XcmsConvertColors.man
new file mode 100644 (file)
index 0000000..1c4c416
--- /dev/null
@@ -0,0 +1,201 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XcmsConvertColors __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XcmsConvertColors \- convert CCC color specifications
+.SH SYNTAX
+.HP
+Status XcmsConvertColors\^(\^XcmsCCC \fIccc\fP\^, XcmsColor
+\fIcolors_in_out\fP\^[\^]\^, unsigned int \fIncolors\fP\^, XcmsColorFormat
+\fItarget_format\fP\^, Bool \fIcompression_flags_return\fP\^[\^]\^); 
+.SH ARGUMENTS
+.IP \fIccc\fP 1i
+Specifies the CCC.
+If Conversion is between device-independent color spaces only
+(for example, TekHVC to CIELuv),
+the CCC is necessary only to specify the Client White Point.
+.IP \fIcolors_in_out\fP 1i
+Specifies an array of color specifications.
+Pixel members are ignored and remain unchanged upon return.
+.IP \fIcompression_flags_return\fP 1i
+Returns an array of Boolean values indicating compression status.
+If a non-NULL pointer is supplied,
+each element of the array is set to
+.ZN True
+if the corresponding color was compressed and
+.ZN False
+otherwise.
+Pass NULL if the compression status is not useful.
+.IP \fIncolors\fP 1i
+Specifies the number of 
+.ZN XcmsColor
+structures in the color-specification array.
+.IP \fItarget_format\fP 1i
+Specifies the target color specification format.
+.SH DESCRIPTION
+The
+.ZN XcmsConvertColors
+function converts the color specifications in the specified array of
+.ZN XcmsColor
+structures from their current format to a single target format,
+using the specified CCC.
+When the return value is
+.ZN XcmsFailure ,
+the contents of the color specification array are left unchanged.
+.LP
+The array may contain a mixture of color specification formats
+(for example, 3 CIE XYZ, 2 CIE Luv, and so on).
+When the array contains both device-independent and
+device-dependent color specifications and the target_format argument specifies
+a device-dependent format (for example,
+.ZN XcmsRGBiFormat ,
+.ZN XcmsRGBFormat ),
+all specifications are converted to CIE XYZ format and then to the target
+device-dependent format.
+.SH "SEE ALSO"
+DisplayOfCCC(__libmansuffix__),
+XcmsCCCOfColormap(__libmansuffix__),
+XcmsCreateCCC(__libmansuffix__),
+XcmsDefaultCCC(__libmansuffix__),
+XcmsSetWhitePoint(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XcmsCreateCCC.man b/man/XcmsCreateCCC.man
new file mode 100644 (file)
index 0000000..65465d8
--- /dev/null
@@ -0,0 +1,202 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XcmsCreateCCC __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XcmsCreateCCC, XcmsFreeCCC \- creating and destroying CCCs
+.SH SYNTAX
+.HP
+XcmsCCC XcmsCreateCCC\^(\^Display *\fIdisplay\fP\^, int \fIscreen_number\fP\^,
+Visual *\fIvisual\fP\^, XcmsColor *\fIclient_white_point\fP\^,
+XcmsCompressionProc \fIcompression_proc\fP\^, XPointer
+\fIcompression_client_data\fP\^, XcmsWhiteAdjustProc
+\fIwhite_adjust_proc\fP\^, XPointer \fIwhite_adjust_client_data\fP\^); 
+.LP
+void XcmsFreeCCC\^(\^XcmsCCC \fIccc\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIccc\fP 1i
+Specifies the CCC.
+.IP \fIclient_white_point\fP 1i
+Specifies the Client White Point.
+If NULL is specified, 
+the Client White Point is to be assumed to be the same as the
+Screen White Point.
+Note that the pixel member is ignored.
+.IP \fIcompression_client_data\fP 1i
+Specifies client data for use by the gamut compression procedure or NULL.
+.IP \fIcompression_proc\fP 1i
+Specifies the gamut compression procedure that is to be applied 
+when a color lies outside the screen's color gamut.
+If NULL is specified and a function using this CCC must convert
+a color specification to a device-dependent format and encounters a color
+that lies outside the screen's color gamut, 
+that function will return
+.ZN XcmsFailure .
+.IP \fIscreen_number\fP 1i
+Specifies the appropriate screen number on the host server.
+.IP \fIvisual\fP 1i
+Specifies the visual type.
+.IP \fIwhite_adjust_client_data\fP 1i
+Specifies client data for use with the white point adjustment procedure or NULL.
+.IP \fIwhite_adjust_proc\fP 1i
+Specifies the white adjustment procedure that is to be applied
+when the Client White Point differs from the Screen White Point.
+NULL indicates that no white point adjustment is desired.
+.SH DESCRIPTION
+The
+.ZN XcmsCreateCCC
+function creates a CCC for the specified display, screen, and visual.
+.LP
+The
+.ZN XcmsFreeCCC
+function frees the memory used for the specified CCC.
+Note that default CCCs and those currently associated with colormaps
+are ignored.
+.SH "SEE ALSO"
+DisplayOfCCC(__libmansuffix__),
+XcmsCCCOfColormap(__libmansuffix__),
+XcmsConvertColors(__libmansuffix__),
+XcmsDefaultCCC(__libmansuffix__),
+XcmsSetWhitePoint(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XcmsDefaultCCC.man b/man/XcmsDefaultCCC.man
new file mode 100644 (file)
index 0000000..64c9a91
--- /dev/null
@@ -0,0 +1,169 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XcmsDefaultCCC __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XcmsDefaultCCC \- obtain the default CCC for a screen
+.SH SYNTAX
+.HP
+XcmsCCC XcmsDefaultCCC\^(\^Display *\fIdisplay\fP\^, int
+\fIscreen_number\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIscreen_number\fP 1i
+Specifies the appropriate screen number on the host server.
+.SH DESCRIPTION
+The
+.ZN XcmsDefaultCCC
+function returns the default CCC for the specified screen.
+Its visual is the default visual of the screen.
+Its initial gamut compression and white point
+adjustment procedures as well as the associated client data are implementation
+specific.
+.SH "SEE ALSO"
+DisplayOfCCC(__libmansuffix__),
+XcmsCCCOfColormap(__libmansuffix__),
+XcmsConvertColors(__libmansuffix__),
+XcmsCreateCCC(__libmansuffix__),
+XcmsSetWhitePoint(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XcmsFreeCCC.man b/man/XcmsFreeCCC.man
new file mode 100644 (file)
index 0000000..2c2455f
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XcmsCreateCCC.__libmansuffix__
diff --git a/man/XcmsLookupColor.man b/man/XcmsLookupColor.man
new file mode 100644 (file)
index 0000000..d6a76c3
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XcmsQueryColor.__libmansuffix__
diff --git a/man/XcmsPad.man b/man/XcmsPad.man
new file mode 100644 (file)
index 0000000..a002aa6
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XcmsColor.__libmansuffix__
diff --git a/man/XcmsQueryBlack.man b/man/XcmsQueryBlack.man
new file mode 100644 (file)
index 0000000..baa8294
--- /dev/null
@@ -0,0 +1,205 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XcmsQueryBlack __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XcmsQueryBlack, XcmsQueryBlue, XcmsQueryGreen, XcmsQueryRed, XcmsQueryWhite \- obtain black, blue, green, red, and white CCC color specifications
+.SH SYNTAX
+.HP
+Status XcmsQueryBlack\^(\^XcmsCCC \fIccc\fP\^, XcmsColorFormat
+\fItarget_format\fP\^, XcmsColor *\fIcolor_return\fP\^); 
+.HP
+Status XcmsQueryBlue\^(\^XcmsCCC \fIccc\fP\^, XcmsColorFormat
+\fItarget_format\fP\^, XcmsColor *\fIcolor_return\fP\^); 
+.HP
+Status XcmsQueryGreen\^(\^XcmsCCC \fIccc\fP\^, XcmsColorFormat
+\fItarget_format\fP\^, XcmsColor *\fIcolor_return\fP\^); 
+.HP
+Status XcmsQueryRed\^(\^XcmsCCC \fIccc\fP\^, XcmsColorFormat
+\fItarget_format\fP\^, XcmsColor *\fIcolor_return\fP\^); 
+.HP
+Status XcmsQueryWhite\^(\^XcmsCCC \fIccc\fP\^, XcmsColorFormat
+\fItarget_format\fP\^, XcmsColor *\fIcolor_return\fP\^); 
+.SH ARGUMENTS
+.IP \fIccc\fP 1i
+Specifies the CCC.
+Note that the CCC's Client White Point and White Point Adjustment procedures
+are ignored.
+.ds Cs
+.IP \fIcolor_return\fP 1i
+Returns the color specification in the specified target format
+for \*(Cs.
+The white point associated with the returned
+color specification is the Screen White Point.
+The value returned in the pixel member is undefined.
+.IP \fItarget_format\fP 1i
+Specifies the target color specification format.
+.SH DESCRIPTION
+The
+.ZN XcmsQueryBlack
+function returns the color specification in the specified target format
+for zero-intensity red, green, and blue.
+.LP
+The
+.ZN XcmsQueryBlue
+function returns the color specification in the specified target format
+for full-intensity blue while red and green are zero.
+.LP
+The
+.ZN XcmsQueryGreen
+function returns the color specification in the specified target format
+for full-intensity green while red and blue are zero.
+.LP
+The
+.ZN XcmsQueryRed
+function returns the color specification in the specified target format
+for full-intensity red while green and blue are zero.
+.LP
+The
+.ZN XcmsQueryWhite
+function returns the color specification in the specified target format
+for full-intensity red, green, and blue.
+.SH "SEE ALSO"
+XcmsCIELabQueryMaxC(__libmansuffix__),
+XcmsCIELuvQueryMaxC(__libmansuffix__),
+XcmsTekHVCQueryMaxC(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XcmsQueryBlue.man b/man/XcmsQueryBlue.man
new file mode 100644 (file)
index 0000000..484bd71
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XcmsQueryBlack.__libmansuffix__
diff --git a/man/XcmsQueryColor.man b/man/XcmsQueryColor.man
new file mode 100644 (file)
index 0000000..61fa50f
--- /dev/null
@@ -0,0 +1,266 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XcmsQueryColor __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XcmsQueryColor, XcmsQueryColors, XcmsLookupColor \- obtain color values
+.SH SYNTAX
+.HP
+Status XcmsQueryColor\^(\^Display *\fIdisplay\fP\^, Colormap \fIcolormap\fP\^,
+XcmsColor *\fIcolor_in_out\fP\^, XcmsColorFormat \fIresult_format\fP\^); 
+.HP
+Status XcmsQueryColors\^(\^Display *\fIdisplay\fP\^, Colormap
+\fIcolormap\fP\^, XcmsColor \fIcolors_in_out\fP\^[\^]\^, unsigned int
+\fIncolors\fP\^, XcmsColorFormat \fIresult_format\fP\^); 
+.HP
+Status XcmsLookupColor\^(\^Display *\fIdisplay\fP\^, Colormap
+\fIcolormap\fP\^, char *\fIcolor_string\fP\^, XcmsColor
+*\fIcolor_exact_return\fP\^, XcmsColor *\fIcolor_screen_return\fP\^,
+XcmsColorFormat \fIresult_format\fP\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIcolormap\fP 1i
+Specifies the colormap.
+.IP \fIcolor_exact_return\fP 1i
+Returns the color specification parsed from the color string
+or parsed from the corresponding string found in a color-name database.
+.IP \fIcolor_in_out\fP 1i
+Specifies the pixel member that indicates the color cell to query.
+The color specification stored for the color cell is returned in this
+.ZN XcmsColor
+structure.
+.IP \fIcolor_screen_return\fP 1i
+Returns the color that can be reproduced on the screen.
+.ds St
+.IP \fIcolor_string\fP 1i
+Specifies the color string\*(St.
+.IP \fIresult_format\fP 1i
+Specifies the color format for the returned color
+specifications (color_screen_return and color_exact_return arguments).
+If the format is
+.ZN XcmsUndefinedFormat
+and the color string contains a
+numerical color specification,
+the specification is returned in the format used in that numerical
+color specification.
+If the format is
+.ZN XcmsUndefinedFormat
+and the color string contains a color name,
+the specification is returned in the format used 
+to store the color in the database.
+.IP \fIncolors\fP 1i
+Specifies the number of 
+.ZN XcmsColor
+structures in the color-specification array.
+.SH DESCRIPTION
+The
+.ZN XcmsQueryColor
+function obtains the RGB value
+for the pixel value in the pixel member of the specified
+.ZN XcmsColor
+structure and then
+converts the value to the target format as
+specified by the result_format argument.
+If the pixel is not a valid index in the specified colormap, a
+.ZN BadValue
+error results.
+The
+.ZN XcmsQueryColors
+function obtains the RGB values
+for pixel values in the pixel members of
+.ZN XcmsColor
+structures and then
+converts the values to the target format as
+specified by the result_format argument.
+If a pixel is not a valid index into the specified colormap, a
+.ZN BadValue
+error results.
+If more than one pixel is in error,
+the one that gets reported is arbitrary.
+.LP
+.ZN XcmsQueryColor
+and
+.ZN XcmsQueryColors
+can generate
+.ZN BadColor
+and
+.ZN BadValue
+errors.
+.LP
+The
+.ZN XcmsLookupColor
+function looks up the string name of a color with respect to the screen
+associated with the specified colormap.
+It returns both the exact color values and
+the closest values provided by the screen 
+with respect to the visual type of the specified colormap.
+The values are returned in the format specified by result_format.
+If the color name is not in the Host Portable Character Encoding, 
+the result is implementation-dependent.
+Use of uppercase or lowercase does not matter.
+.ZN XcmsLookupColor
+returns
+.ZN XcmsSuccess
+or
+.ZN XcmsSuccessWithCompression
+if the name is resolved; otherwise, it returns
+.ZN XcmsFailure .
+If
+.ZN XcmsSuccessWithCompression
+is returned, the color specification returned in 
+color_screen_return is the result of gamut compression.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadColor
+A value for a Colormap argument does not name a defined Colormap.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.SH "SEE ALSO"
+XcmsAllocColor(__libmansuffix__),
+XcmsStoreColor(__libmansuffix__),
+XQueryColor(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XcmsQueryColors.man b/man/XcmsQueryColors.man
new file mode 100644 (file)
index 0000000..d6a76c3
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XcmsQueryColor.__libmansuffix__
diff --git a/man/XcmsQueryGreen.man b/man/XcmsQueryGreen.man
new file mode 100644 (file)
index 0000000..484bd71
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XcmsQueryBlack.__libmansuffix__
diff --git a/man/XcmsQueryRed.man b/man/XcmsQueryRed.man
new file mode 100644 (file)
index 0000000..484bd71
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XcmsQueryBlack.__libmansuffix__
diff --git a/man/XcmsQueryWhite.man b/man/XcmsQueryWhite.man
new file mode 100644 (file)
index 0000000..484bd71
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XcmsQueryBlack.__libmansuffix__
diff --git a/man/XcmsRGB.man b/man/XcmsRGB.man
new file mode 100644 (file)
index 0000000..a002aa6
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XcmsColor.__libmansuffix__
diff --git a/man/XcmsRGBi.man b/man/XcmsRGBi.man
new file mode 100644 (file)
index 0000000..a002aa6
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XcmsColor.__libmansuffix__
diff --git a/man/XcmsSetCCCOfColormap.man b/man/XcmsSetCCCOfColormap.man
new file mode 100644 (file)
index 0000000..9ad132d
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XcmsCCCOfColormap.__libmansuffix__
diff --git a/man/XcmsSetWhiteAdjustProc.man b/man/XcmsSetWhiteAdjustProc.man
new file mode 100644 (file)
index 0000000..536e659
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XcmsSetWhitePoint.__libmansuffix__
diff --git a/man/XcmsSetWhitePoint.man b/man/XcmsSetWhitePoint.man
new file mode 100644 (file)
index 0000000..c93c026
--- /dev/null
@@ -0,0 +1,197 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XcmsSetWhitePoint __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XcmsSetWhitePoint, XcmsSetWhiteAdjustProc \- modifying CCC attributes
+.SH SYNTAX
+.HP
+Status XcmsSetWhitePoint\^(\^XcmsCCC \fIccc\fP\^, XcmsColor *\fIcolor\fP\^); 
+.HP
+XcmsWhiteAdjustProc XcmsSetWhiteAdjustProc\^(\^XcmsCCC \fIccc\fP\^,
+XcmsWhiteAdjustProc \fIwhite_adjust_proc\fP\^, XPointer \fIclient_data\fP\^); 
+.SH ARGUMENTS
+.IP \fIccc\fP 1i
+Specifies the CCC.
+.ds Cd the white point adjustment procedure
+.IP \fIclient_data\fP 1i
+Specifies client data for \*(Cd or NULL.
+.ds Co new Client White Point
+.IP \fIcolor\fP 1i
+Specifies the \*(Co.
+.IP \fIwhite_adjust_proc\fP 1i
+Specifies the white point adjustment procedure.
+.SH DESCRIPTION
+The
+.ZN XcmsSetWhitePoint
+function changes the Client White Point in the specified CCC.
+Note that the pixel member is ignored 
+and that the color specification is left unchanged upon return.
+The format for the new white point must be
+.ZN XcmsCIEXYZFormat ,
+.ZN XcmsCIEuvYFormat ,
+.ZN XcmsCIExyYFormat ,
+or
+.ZN XcmsUndefinedFormat .
+If the color argument is NULL, this function sets the format component of the
+Client White Point specification to
+.ZN XcmsUndefinedFormat ,
+indicating that the Client White Point is assumed to be the same as the
+Screen White Point.
+.LP
+This function returns nonzero status
+if the format for the new white point is valid;
+otherwise, it returns zero.
+
+.LP
+The
+.ZN XcmsSetWhiteAdjustProc
+function first sets the white point adjustment procedure and client data 
+in the specified CCC with the newly specified procedure and client data
+and then returns the old procedure.
+.SH "SEE ALSO"
+DisplayOfCCC(__libmansuffix__),
+XcmsCCCOfColormap(__libmansuffix__),
+XcmsConvertColors(__libmansuffix__),
+XcmsCreateCCC(__libmansuffix__),
+XcmsDefaultCCC(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XcmsStoreColor.man b/man/XcmsStoreColor.man
new file mode 100644 (file)
index 0000000..c9774d1
--- /dev/null
@@ -0,0 +1,306 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XcmsStoreColor __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XcmsStoreColor, XcmsStoreColors \- set colors
+.SH SYNTAX
+.HP
+Status XcmsStoreColor\^(\^Display *\fIdisplay\fP\^, Colormap \fIcolormap\fP\^,
+XcmsColor *\fIcolor\fP\^); 
+.HP
+Status XcmsStoreColors\^(\^Display *\fIdisplay\fP\^, Colormap
+\fIcolormap\fP\^, XcmsColor \fIcolors\fP\^[\^]\^, int \fIncolors\fP\^, Bool
+\fIcompression_flags_return\fP\^[\^]\^); 
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIcolor\fP 1i
+Specifies the color cell and the color to store.
+Values specified in this
+.ZN XcmsColor
+structure remain unchanged on return.
+.IP \fIcolors\fP 1i
+Specifies the color specification array of
+.ZN XcmsColor
+structures, each specifying a color cell and the color to store in that
+cell.
+Values specified in the array remain unchanged upon return.
+.IP \fIcolormap\fP 1i
+Specifies the colormap.
+.IP \fIcompression_flags_return\fP 1i
+Returns an array of Boolean values indicating compression status.
+If a non-NULL pointer is supplied,
+each element of the array is set to
+.ZN True
+if the corresponding color was compressed and
+.ZN False
+otherwise.
+Pass NULL if the compression status is not useful.
+.IP \fIncolors\fP 1i
+Specifies the number of 
+.ZN XcmsColor
+structures in the color-specification array.
+.SH DESCRIPTION
+The
+.ZN XcmsStoreColor
+function converts the color specified in the
+.ZN XcmsColor
+structure into RGB values.
+It then uses this RGB specification in an
+.ZN XColor
+structure, whose three flags 
+.Pn ( DoRed , 
+.ZN DoGreen ,
+and
+.ZN DoBlue )
+are set, in a call to
+.ZN XStoreColor
+to change the color cell specified by the pixel member of the
+.ZN XcmsColor
+structure.
+This pixel value must be a valid index for the specified colormap,
+and the color cell specified by the pixel value must be a read/write cell.
+If the pixel value is not a valid index, a
+.ZN BadValue
+error results.
+If the color cell is unallocated or is allocated read-only, a
+.ZN BadAccess
+error results.
+If the colormap is an installed map for its screen, 
+the changes are visible immediately.
+.LP
+Note that 
+.ZN XStoreColor
+has no return value; therefore, an
+.ZN XcmsSuccess
+return value from this function indicates that the conversion 
+to RGB succeeded and the call to
+.ZN XStoreColor
+was made.
+To obtain the actual color stored, use
+.ZN XcmsQueryColor .
+Because of the screen's hardware limitations or gamut compression,
+the color stored in the colormap may not be identical
+to the color specified.
+.LP
+.ZN XcmsStoreColor
+can generate
+.ZN BadAccess ,
+.ZN BadColor ,
+and
+.ZN BadValue
+errors.
+.LP
+The
+.ZN XcmsStoreColors
+function converts the colors specified in the array of
+.ZN XcmsColor
+structures into RGB values and then uses these RGB specifications in
+.ZN XColor
+structures, whose three flags 
+.Pn ( DoRed , 
+.ZN DoGreen ,
+and
+.ZN DoBlue )
+are set, in a call to
+.ZN XStoreColors
+to change the color cells specified by the pixel member of the corresponding
+.ZN XcmsColor
+structure.
+Each pixel value must be a valid index for the specified colormap,
+and the color cell specified by each pixel value must be a read/write cell.
+If a pixel value is not a valid index, a
+.ZN BadValue
+error results.
+If a color cell is unallocated or is allocated read-only, a
+.ZN BadAccess
+error results.
+If more than one pixel is in error,
+the one that gets reported is arbitrary.
+If the colormap is an installed map for its screen, 
+the changes are visible immediately.
+.LP
+Note that 
+.ZN XStoreColors
+has no return value; therefore, an
+.ZN XcmsSuccess
+return value from this function indicates that conversions 
+to RGB succeeded and the call to
+.ZN XStoreColors
+was made.
+To obtain the actual colors stored, use
+.ZN XcmsQueryColors .
+Because of the screen's hardware limitations or gamut compression,
+the colors stored in the colormap may not be identical
+to the colors specified.
+.LP
+.LP
+.ZN XcmsStoreColors
+can generate
+.ZN BadAccess ,
+.ZN BadColor ,
+and
+.ZN BadValue
+errors.
+.SH DIAGNOSTICS
+.TP 1i
+.ZN BadAccess
+A client attempted
+to free a color map entry that it did not already allocate.
+.TP 1i
+.ZN BadAccess
+A client attempted
+to store into a read-only color map entry.
+.TP 1i
+.ZN BadColor
+A value for a Colormap argument does not name a defined Colormap.
+.TP 1i
+.ZN BadValue
+Some numeric value falls outside the range of values accepted by the request.
+Unless a specific range is specified for an argument, the full range defined
+by the argument's type is accepted.  Any argument defined as a set of
+alternatives can generate this error.
+.SH "SEE ALSO"
+XcmsAllocColor(__libmansuffix__),
+XcmsQueryColor(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XcmsStoreColors.man b/man/XcmsStoreColors.man
new file mode 100644 (file)
index 0000000..59d7ad3
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XcmsStoreColor.__libmansuffix__
diff --git a/man/XcmsTekHVC.man b/man/XcmsTekHVC.man
new file mode 100644 (file)
index 0000000..a002aa6
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XcmsColor.__libmansuffix__
diff --git a/man/XcmsTekHVCQueryMaxC.man b/man/XcmsTekHVCQueryMaxC.man
new file mode 100644 (file)
index 0000000..3e0f40e
--- /dev/null
@@ -0,0 +1,243 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XcmsTekHVCQueryMaxC __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XcmsTekHVCQueryMaxC, XcmsTekHVCQueryMaxV, XcmsTekHVCQueryMaxVC, XcmsTekHVCQueryMaxVSamples, XcmsTekHVCQueryMinV \- obtain the TekHVC coordinates
+.SH SYNTAX
+.HP
+Status XcmsTekHVCQueryMaxC\^(\^XcmsCCC \fIccc\fP\^, XcmsFloat \fIhue\fP\^,
+XcmsFloat \fIvalue\fP\^, XcmsColor *\fIcolor_return\fP\^); 
+.HP
+Status XcmsTekHVCQueryMaxV\^(\^XcmsCCC \fIccc\fP\^, XcmsFloat \fIhue\fP\^,
+XcmsFloat \fIchroma\fP\^, XcmsColor *\fIcolor_return\fP\^); 
+.HP
+Status XcmsTekHVCQueryMaxVC\^(\^XcmsCCC \fIccc\fP\^, XcmsFloat \fIhue\fP\^,
+XcmsColor *\fIcolor_return\fP\^); 
+.HP
+Status XcmsTekHVCQueryMaxVSamples\^(\^XcmsCCC \fIccc\fP\^, XcmsFloat
+\fIhue\fP\^, XcmsColor \fIcolors_return[]\fP\^, unsigned int
+\fInsamples\fP\^); 
+.HP
+Status XcmsTekHVCQueryMinV\^(\^XcmsCCC \fIccc\fP\^, XcmsFloat \fIhue\fP\^,
+XcmsFloat \fIchroma\fP\^, XcmsColor *\fIcolor_return\fP\^); 
+.SH ARGUMENTS
+.IP \fIccc\fP 1i
+Specifies the CCC.
+Note that the CCC's Client White Point and White Point Adjustment procedures
+are ignored.
+.ds Ch maximum Value (MaxV)
+.IP \fIchroma\fP 1i
+Specifies the chroma at which to find \*(Ch.
+.IP \fIcolors_return\fP 1i
+Returns nsamples of color specifications in XcmsTekHVC
+such that the Chroma is the maximum attainable for the Value and Hue.
+The white point associated with the returned
+color specification is the Screen White Point.
+The value returned in the pixel member is undefined.
+.ds Lc maximum Chroma along with the actual Hue and Value (MaxC), \
+maximum Value along with the Hue and Chroma (MaxV), \
+color specification in XcmsTekHVC for the maximum Chroma, \
+the Value at which that maximum Chroma is reached and actual Hue (MaxVC) \
+or minimum Value and the actual Hue and Chroma (MinL)
+.ds lC maximum Chroma (MaxC and MaxVC), maximum Value (MaxV), or \
+minimum Value (MinL)
+.IP \fIcolor_return\fP 1i
+Returns the \*(Lc at which the \*(lC was found.
+The white point associated with the returned
+color specification is the Screen White Point.
+The value returned in the pixel member is undefined.
+.ds Hu in which to find the maximum Chroma (MaxC and MaxVC), \
+maximum Value (MaxV), the maximum Chroma/Value samples (MaxVSamples), \
+or the minimum Value (MinL)
+.IP \fIhue\fP 1i
+Specifies the Hue \*(Hu.
+.IP \fInsamples\fP 1i
+Specifies the number of samples.
+.ds Va maximum Chroma (MaxC) or minimum Value (MinL)
+.IP \fIvalue\fP 1i
+Specifies the Value in which to find the \*(Va.
+.SH DESCRIPTION
+The
+.ZN XcmsTekHVCQueryMaxC
+function, given a Hue and Value,
+determines the maximum Chroma in TekHVC color space
+displayable by the screen.
+It returns the maximum Chroma along with the actual Hue
+and Value at which the maximum Chroma was found.
+.LP
+The
+.ZN XcmsTekHVCQueryMaxV
+function, given a Hue and Chroma,
+determines the maximum Value in TekHVC color space
+displayable by the screen.
+It returns the maximum Value and the actual Hue and Chroma
+at which the maximum Value was found.
+.LP
+The
+.ZN XcmsTekHVCQueryMaxVC
+function, given a Hue,
+determines the maximum Chroma in TekHVC color space displayable by the screen
+and the Value at which that maximum Chroma is reached.
+It returns the maximum Chroma,
+the Value at which that maximum Chroma is reached,
+and the actual Hue for which the maximum Chroma was found.
+.LP
+The
+.ZN XcmsTekHVCQueryMaxVSamples
+returns nsamples of maximum Value, the Chroma at which that maximum Value
+is reached, and the actual Hue for which the maximum Chroma was found.
+These sample points may then be used to plot the maximum Value/Chroma
+boundary of the screen's color gamut for the specified Hue in TekHVC color
+space.
+.LP
+The
+.ZN XcmsTekHVCQueryMinV
+function, given a Hue and Chroma,
+determines the minimum Value in TekHVC color space displayable by the screen.
+It returns the minimum Value and the actual Hue and Chroma at which
+the minimum Value was found.
+.SH "SEE ALSO"
+XcmsCIELabQueryMaxC(__libmansuffix__),
+XcmsCIELuvQueryMaxC(__libmansuffix__),
+XcmsQueryBlack(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XcmsTekHVCQueryMaxV.man b/man/XcmsTekHVCQueryMaxV.man
new file mode 100644 (file)
index 0000000..7a55e35
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XcmsTekHVCQueryMaxC.__libmansuffix__
diff --git a/man/XcmsTekHVCQueryMaxVC.man b/man/XcmsTekHVCQueryMaxVC.man
new file mode 100644 (file)
index 0000000..7a55e35
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XcmsTekHVCQueryMaxC.__libmansuffix__
diff --git a/man/XcmsTekHVCQueryMaxVSamples.man b/man/XcmsTekHVCQueryMaxVSamples.man
new file mode 100644 (file)
index 0000000..7a55e35
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XcmsTekHVCQueryMaxC.__libmansuffix__
diff --git a/man/XcmsTekHVCQueryMinV.man b/man/XcmsTekHVCQueryMinV.man
new file mode 100644 (file)
index 0000000..7a55e35
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XcmsTekHVCQueryMaxC.__libmansuffix__
diff --git a/man/XmbDrawImageString.man b/man/XmbDrawImageString.man
new file mode 100644 (file)
index 0000000..c4d728f
--- /dev/null
@@ -0,0 +1,216 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\" Copyright \(co 2000  The XFree86 Project, Inc.
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\"
+.\" 
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XmbDrawImageString __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XmbDrawImageString, XwcDrawImageString, Xutf8DrawImageString \- draw image text using a single font set
+.SH SYNTAX
+.HP
+void XmbDrawImageString\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^,
+XFontSet \fIfont_set\fP\^, GC \fIgc\fP\^, int \fIx\fP\^, int \fIy\fP\^, char
+*\fIstring\fP\^, int \fInum_bytes\fP\^); 
+.HP
+void XwcDrawImageString\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^,
+XFontSet \fIfont_set\fP\^, GC \fIgc\fP\^, int \fIx\fP\^, int \fIy\fP\^,
+wchar_t *\fIstring\fP\^, int \fInum_wchars\fP\^); 
+.HP
+void Xutf8DrawImageString\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^,
+XFontSet \fIfont_set\fP\^, GC \fIgc\fP\^, int \fIx\fP\^, int \fIy\fP\^, char
+*\fIstring\fP\^, int \fInum_bytes\fP\^); 
+.SH ARGUMENTS
+.IP \fId\fP 1i
+Specifies the drawable. 
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIfont_set\fP 1i
+Specifies the font set.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fInum_bytes\fP 1i
+Specifies the number of bytes in the string argument.
+.IP \fInum_wchars\fP 1i
+Specifies the number of characters in the string argument.
+.IP \fIstring\fP 1i
+Specifies the character string.
+.ds Xy
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.SH DESCRIPTION
+The
+.ZN XmbDrawImageString ,
+.ZN XwcDrawImageString
+and
+.ZN Xutf8DrawImageString
+functions fill a destination rectangle with the background pixel defined
+in the GC and then paint the text with the foreground pixel.
+The filled rectangle is the rectangle returned to overall_logical_return by
+.ZN XmbTextExtents ,
+.ZN XwcTextExtents
+or 
+.ZN Xutf8TextExtents
+for the same text and 
+.ZN XFontSet .
+.LP
+When the 
+.ZN XFontSet
+has missing charsets, each unavailable character is drawn 
+with the default string returned by 
+.ZN XCreateFontSet .
+The behavior for an invalid codepoint is undefined.
+.LP
+The function
+.ZN Xutf8TextExtents
+is an extension introduced by The XFree86 Project, Inc. in their 4.0.2
+release. Its presence is
+indicated by the macro
+.ZN X_HAVE_UTF8_STRING .
+.SH "SEE ALSO"
+XDrawImageString(__libmansuffix__),
+XDrawString(__libmansuffix__),
+XDrawText(__libmansuffix__),
+XmbDrawString(__libmansuffix__),
+XmbDrawText(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XmbDrawString.man b/man/XmbDrawString.man
new file mode 100644 (file)
index 0000000..f093364
--- /dev/null
@@ -0,0 +1,207 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\" Copyright \(co 2000  The XFree86 Project, Inc.
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\"
+.\" 
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XmbDrawString __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XmbDrawString, XwcDrawString, Xutf8DrawString \- draw text using a single font set
+.SH SYNTAX
+.HP
+void XmbDrawString\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, XFontSet
+\fIfont_set\fP\^, GC \fIgc\fP\^, int \fIx\fP\^, int \fIy\fP\^, char
+*\fIstring\fP\^, int \fInum_bytes\fP\^); 
+.HP
+void XwcDrawString\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, XFontSet
+\fIfont_set\fP\^, GC \fIgc\fP\^, int \fIx\fP\^, int \fIy\fP\^, wchar_t
+*\fIstring\fP\^, int \fInum_wchars\fP\^); 
+.HP
+void Xutf8DrawString\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^,
+XFontSet \fIfont_set\fP\^, GC \fIgc\fP\^, int \fIx\fP\^, int \fIy\fP\^, char
+*\fIstring\fP\^, int \fInum_bytes\fP\^);
+.SH ARGUMENTS
+.IP \fId\fP 1i
+Specifies the drawable. 
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIfont_set\fP 1i
+Specifies the font set.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fInum_bytes\fP 1i
+Specifies the number of bytes in the string argument.
+.IP \fInum_wchars\fP 1i
+Specifies the number of characters in the string argument.
+.IP \fIstring\fP 1i
+Specifies the character string.
+.ds Xy
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.SH DESCRIPTION
+The
+.ZN XmbDrawString ,
+.ZN XwcDrawString
+and
+.ZN Xutf8DrawString
+functions draw the specified text with the foreground pixel.
+When the 
+.ZN XFontSet
+has missing charsets, each unavailable character is drawn 
+with the default string returned by 
+.ZN XCreateFontSet .
+The behavior for an invalid codepoint is undefined.
+.LP
+The function
+.ZN Xutf8DrawString
+is an extension introduced by The XFree86 Project, Inc. in their 4.0.2
+release. Its presence is
+indicated by the macro
+.ZN X_HAVE_UTF8_STRING .
+.SH "SEE ALSO"
+XDrawImageString(__libmansuffix__),
+XDrawString(__libmansuffix__),
+XDrawText(__libmansuffix__),
+XmbDrawImageString(__libmansuffix__),
+XmbDrawText(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XmbDrawText.man b/man/XmbDrawText.man
new file mode 100644 (file)
index 0000000..9b94256
--- /dev/null
@@ -0,0 +1,255 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\" Copyright \(co 2000  The XFree86 Project, Inc.
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\"
+.\" 
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XmbDrawText __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XmbDrawText, XwcDrawText, Xutf8DrawText \- draw text using multiple font sets 
+.SH SYNTAX
+.HP
+void XmbDrawText\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, GC
+\fIgc\fP\^, int \fIx\fP\^, int \fIy\fP\^, XmbTextItem *\fIitems\fP\^, int
+\fInitems\fP\^); 
+.HP
+void XwcDrawText\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, GC
+\fIgc\fP\^, int \fIx\fP\^, int \fIy\fP\^, XwcTextItem *\fIitems\fP\^, int
+\fInitems\fP\^); 
+.HP
+void Xutf8DrawText\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, GC
+\fIgc\fP\^, int \fIx\fP\^, int \fIy\fP\^, XmbTextItem *\fIitems\fP\^, int \fInitems\fP\^);
+.SH ARGUMENTS
+.IP \fId\fP 1i
+Specifies the drawable. 
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIgc\fP 1i
+Specifies the GC.
+.IP \fIitems\fP 1i
+Specifies an array of text items.
+.IP \fInitems\fP 1i
+Specifies the number of text items in the array.
+.ds Xy
+.IP \fIx\fP 1i
+.br
+.ns
+.IP \fIy\fP 1i
+Specify the x and y coordinates\*(Xy.
+.SH DESCRIPTION
+The
+.ZN XmbDrawText ,
+.ZN XwcDrawText 
+and 
+.ZN Xutf8DrawText 
+functions allow complex spacing and font set shifts between text strings.
+Each text item is processed in turn, with the origin of a text
+element advanced in the primary draw direction by the escapement of the
+previous text item.
+A text item delta specifies an additional escapement of the text item
+drawing origin in the primary draw direction.
+A font_set member other than 
+.ZN None
+in an item causes the font set to be used for this and subsequent text items
+in the text_items list.
+Leading text items with a font_set member set to
+.ZN None
+will not be drawn.
+.LP
+.ZN XmbDrawText ,
+.ZN XwcDrawText
+and
+.ZN Xutf8DrawText
+do not perform any context-dependent rendering between text segments.
+Clients may compute the drawing metrics by passing each text segment to
+.ZN XmbTextExtents ,
+.ZN XwcTextExtents ,
+.ZN Xutf8TextExtents
+or
+.ZN XmbTextPerCharExtents ,
+.ZN XwcTextPerCharExtents .
+.ZN Xutf8TextPerCharExtents .
+When the 
+.ZN XFontSet
+has missing charsets, each unavailable character is drawn 
+with the default string returned by 
+.ZN XCreateFontSet .
+The behavior for an invalid codepoint is undefined.
+.LP
+The function
+.ZN Xutf8DrawText
+is an extension introduced by The XFree86 Project, Inc. in their 4.0.2
+release. Its presence is
+indicated by the macro
+.ZN X_HAVE_UTF8_STRING .
+.SH STRUCTURES
+The
+.ZN XmbTextItem
+structure contains:
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+typedef struct {
+       char *chars;    /\&* pointer to string */
+       int nchars;     /\&* number of bytes */
+       int delta;      /\&* pixel delta between strings */
+       XFontSet font_set;      /\&* fonts, None means don't change */
+} XmbTextItem;
+.De
+The
+.ZN XwcTextItem
+structure contains:
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+typedef struct {
+       wchar_t *chars; /\&* pointer to wide char string */
+       int nchars;     /\&* number of wide characters */
+       int delta;      /\&* pixel delta between strings */
+       XFontSet font_set;      /\&* fonts, None means don't change */
+} XwcTextItem;
+.De
+.SH "SEE ALSO"
+XDrawImageString(__libmansuffix__),
+XDrawString(__libmansuffix__),
+XDrawText(__libmansuffix__),
+XmbDrawImageString(__libmansuffix__),
+XmbDrawString(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XmbLookupString.man b/man/XmbLookupString.man
new file mode 100644 (file)
index 0000000..72bf2cd
--- /dev/null
@@ -0,0 +1,311 @@
+'\" t
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\" Copyright \(co 2000  The XFree86 Project, Inc.
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\"
+.\" 
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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
+'\" t
+.TH XmbLookupString __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XmbLookupString, XwcLookupString, Xutf8LookupString \- obtain composed input from an input method
+.SH SYNTAX
+.HP
+int XmbLookupString\^(\^XIC \fIic\fP\^, XKeyPressedEvent *\fIevent\fP, char
+*\fIbuffer_return\fP\^, int \fIbytes_buffer\fP\^, KeySym
+*\fIkeysym_return\fP\^, Status *\fIstatus_return\fP\^); 
+.HP
+int XwcLookupString\^(\^XIC \fIic\fP\^, XKeyPressedEvent *\fIevent\fP\^,
+wchar_t *\fIbuffer_return\fP\^, int \fIwchars_buffer\fP\^, KeySym
+*\fIkeysym_return\fP\^, Status *\fIstatus_return\fP\^); 
+.HP
+int Xutf8LookupString\^(\^XIC \fIic\fP\^, XKeyPressedEvent *\fIevent\fP, char
+*\fIbuffer_return\fP\^, int \fIbytes_buffer\fP\^, KeySym
+*\fIkeysym_return\fP\^, Status *\fIstatus_return\fP\^); 
+.SH ARGUMENTS
+.IP \fIbuffer_return\fP 1i
+Returns a multibyte string or wide character string (if any)
+from the input method.
+.IP \fIbytes_buffer\fP 1i
+.br
+.ns
+.IP \fIwchars_buffer\fP 1i
+Specifies space available in the return buffer.
+.ds Ev key event to be used
+.IP \fIevent\fP 1i
+Specifies the \*(Ev.
+.IP \fIic\fP 1i
+Specifies the input context.
+.IP \fIkeysym_return\fP 1i
+Returns the KeySym computed from the event if this argument is not NULL.
+.IP \fIstatus_return\fP 1i
+Returns a value indicating what kind of data is returned.
+.SH DESCRIPTION
+The
+.ZN XmbLookupString ,
+.ZN XwcLookupString
+and
+.ZN Xutf8LookupString
+functions return the string from the input method specified
+in the buffer_return argument.
+If no string is returned,
+the buffer_return argument is unchanged.
+.LP
+The KeySym into which the KeyCode from the event was mapped is returned
+in the keysym_return argument if it is non-NULL and the status_return
+argument indicates that a KeySym was returned.
+If both a string and a KeySym are returned,
+the KeySym value does not necessarily correspond to the string returned.
+.LP
+.ZN XmbLookupString
+and
+.ZN Xutf8LookupString
+return the length of the string in bytes, and
+.ZN XwcLookupString
+returns the length of the string in characters.
+Both
+.ZN XmbLookupString
+and
+.ZN XwcLookupString
+return text in the encoding of the locale bound to the input method
+of the specified input context, and
+.ZN Xutf8LookupString
+returns text in UTF-8 encoding.
+.LP
+Each string returned by
+.ZN XmbLookupString
+and
+.ZN XwcLookupString
+begins in the initial state of the encoding of the locale
+(if the encoding of the locale is state-dependent).
+.NT
+To ensure proper input processing,
+it is essential that the client pass only 
+.ZN KeyPress
+events to
+.ZN XmbLookupString ,
+.ZN XwcLookupString
+and
+.ZN Xutf8LookupString .
+Their behavior when a client passes a 
+.ZN KeyRelease
+event is undefined.
+.NE
+.LP
+Clients should check the status_return argument before
+using the other returned values.
+These three functions each return a value to status_return 
+that indicates what has been returned in the other arguments.
+The possible values returned are:
+.TS
+lw(1.5i) lw(4.3i).
+T{
+.ZN XBufferOverflow
+T}     T{
+The input string to be returned is too large for the supplied buffer_return.
+The required size (for
+.ZN XmbLookupString ,
+.ZN Xutf8LookupString
+in bytes; for
+.ZN XwcLookupString
+in characters) is returned as the value of the function,
+and the contents of buffer_return and keysym_return are not modified.
+The client should recall the function with the same event
+and a buffer of adequate size to obtain the string.
+T}
+T{
+.ZN XLookupNone
+T}     T{
+No consistent input has been composed so far.
+The contents of buffer_return and keysym_return are not modified, 
+and the function returns zero.
+T}
+T{
+.ZN XLookupChars
+T}     T{
+Some input characters have been composed.
+They are placed in the buffer_return argument, using the encoding
+described above,
+and the string length is returned as the value of the function.
+The content of the keysym_return argument is not modified.
+T}
+T{
+.ZN XLookupKeySym
+T}     T{
+A KeySym has been returned instead of a string
+and is returned in keysym_return.
+The content of the buffer_return argument is not modified,
+and the function returns zero.
+T}
+T{
+.ZN XLookupBoth
+T}     T{
+Both a KeySym and a string are returned;
+.ZN XLookupChars
+and
+.ZN XLookupKeySym
+occur simultaneously.
+T}
+.TE
+.LP
+It does not make any difference if the input context passed as an argument to
+.ZN XmbLookupString ,
+.ZN XwcLookupString
+and
+.ZN Xutf8LookupString
+is the one currently in possession of the focus or not.
+Input may have been composed within an input context before it lost the focus,
+and that input may be returned on subsequent calls to
+.ZN XmbLookupString ,
+.ZN XwcLookupString
+or
+.ZN Xutf8LookupString
+even though it does not have any more keyboard focus.
+.LP
+The function
+.ZN Xutf8LookupString
+is an extension introduced by The XFree86 Project, Inc. in their 4.0.2
+release. Its presence is
+indicated by the macro
+.ZN X_HAVE_UTF8_STRING .
+.SH "SEE ALSO"
+XLookupKeysym(__libmansuffix__),
+Compose(__filemansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XmbResetIC.man b/man/XmbResetIC.man
new file mode 100644 (file)
index 0000000..ac67c4a
--- /dev/null
@@ -0,0 +1,211 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\" Copyright \(co 2000  The XFree86 Project, Inc.
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\"
+.\" 
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XmbResetIC __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XmbResetIC, XwcResetIC, Xutf8ResetIC \- reset the state of an input context
+.SH SYNTAX
+.HP
+char *XmbResetIC\^(\^XIC \fIic\fP\^); 
+.HP
+wchar_t *XwcResetIC\^(\^XIC \fIic\fP\^); 
+.HP
+char *Xutf8ResetIC\^(\^XIC \fIic\fP\^); 
+.SH ARGUMENTS
+.IP \fIic\fP 1i
+Specifies the input context.
+.SH DESCRIPTION
+When
+.ZN XNResetState
+is set to
+.ZN XIMInitialState ,
+.ZN XmbResetIC ,
+.ZN XwcResetIC
+and
+.ZN Xutf8ResetIC
+reset an input context to its initial state;
+when
+.ZN XNResetState
+is set to
+.ZN XIMPreserveState ,
+the current input context state is preserved.
+In both cases, any input pending on that context is deleted.
+The input method is required to clear the preedit area, if any,
+and update the status accordingly.
+Calling 
+.ZN XmbResetIC ,
+.ZN XwcResetIC
+or
+.ZN Xutf8ResetIC
+does not change the focus.
+.LP
+The return value of
+.ZN XmbResetIC
+is its current preedit string as a multibyte string.
+The return value of
+.ZN XwcResetIC
+is its current preedit string as a wide character string.
+The return value of
+.ZN Xutf8ResetIC
+is its current preedit string as an UTF-8 string.
+If there is any preedit text drawn or visible to the user,
+then these procedures must return a non-NULL string.
+If there is no visible preedit text, 
+then it is input method implementation-dependent 
+whether these procedures return a non-NULL string or NULL.
+.LP
+The client should free the returned string by calling
+.ZN XFree .
+.LP
+The function
+.ZN Xutf8ResetIC
+is an extension introduced by The XFree86 Project, Inc. in their 4.0.2
+release. Its presence is
+indicated by the macro
+.ZN X_HAVE_UTF8_STRING .
+.SH "SEE ALSO"
+XCreateIC(__libmansuffix__),
+XOpenIM(__libmansuffix__),
+XSetICFocus(__libmansuffix__),
+XSetICValues(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XmbSetWMProperties.man b/man/XmbSetWMProperties.man
new file mode 100644 (file)
index 0000000..1d3bd24
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetWMProperties.__libmansuffix__
diff --git a/man/XmbTextEscapement.man b/man/XmbTextEscapement.man
new file mode 100644 (file)
index 0000000..f6cdd14
--- /dev/null
@@ -0,0 +1,190 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\" Copyright \(co 2000  The XFree86 Project, Inc.
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\"
+.\" 
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XmbTextEscapement __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XmbTextEscapement, XwcTextEscapement, Xutf8TextEscapement \- obtain the escapement of text
+.SH SYNTAX
+.HP
+int XmbTextEscapement\^(\^XFontSet \fIfont_set\fP\^, char *\fIstring\fP\^, int
+\fInum_bytes\fP\^); 
+.HP
+int XwcTextEscapement\^(\^XFontSet \fIfont_set\fP\^, wchar_t *\fIstring\fP\^,
+int \fInum_wchars\fP\^); 
+.HP
+int Xutf8TextEscapement\^(\^XFontSet \fIfont_set\fP\^, char *\fIstring\fP\^, 
+int \fInum_bytes\fP\^); 
+.SH ARGUMENTS
+.IP \fIfont_set\fP 1i
+Specifies the font set.
+.IP \fInum_bytes\fP 1i
+Specifies the number of bytes in the string argument.
+.IP \fInum_wchars\fP 1i
+Specifies the number of characters in the string argument.
+.IP \fIstring\fP 1i
+Specifies the character string.
+.SH DESCRIPTION
+The
+.ZN XmbTextEscapement ,
+.ZN XwcTextEscapement
+and
+.ZN Xutf8TextEscapement
+functions return the escapement in pixels of the specified string as a value,
+using the fonts loaded for the specified font set.
+The escapement is the distance in pixels in the primary draw
+direction from the drawing origin to the origin of the next character to
+be drawn, assuming that the rendering of the next character is not
+dependent on the supplied string.
+.LP
+Regardless of the character rendering order,
+the escapement is always positive.
+.LP
+The function
+.ZN Xutf8TextEscapement
+is an extension introduced by The XFree86 Project, Inc. in their 4.0.2
+release. Its presence is
+indicated by the macro
+.ZN X_HAVE_UTF8_STRING .
+.SH "SEE ALSO"
+XmbTextExtents(__libmansuffix__),
+XmbTextPerCharExtents(__libmansuffix__)
+\fI\*(xL\fP
diff --git a/man/XmbTextExtents.man b/man/XmbTextExtents.man
new file mode 100644 (file)
index 0000000..4ff3366
--- /dev/null
@@ -0,0 +1,226 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\" Copyright \(co 2000  The XFree86 Project, Inc.
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\"
+.\" 
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XmbTextExtents __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XmbTextExtents, XwcTextExtents, Xutf8TextExtents \- compute text extents
+.SH SYNTAX
+.HP
+int XmbTextExtents\^(\^XFontSet \fIfont_set\fP\^, char *\fIstring\fP\^, int
+\fInum_bytes\fP\^, XRectangle *\fIoverall_ink_return\fP\^, XRectangle
+*\fIoverall_logical_return\fP\^); 
+.HP
+int XwcTextExtents\^(\^XFontSet \fIfont_set\fP\^, wchar_t *\fIstring\fP\^, int
+\fInum_wchars\fP\^, XRectangle *\fIoverall_ink_return\fP\^, XRectangle
+*\fIoverall_logical_return\fP\^); 
+.HP
+int Xutf8TextExtents\^(\^XFontSet \fIfont_set\fP\^, char *\fIstring\fP\^, int
+\fInum_bytes\fP\^, XRectangle *\fIoverall_ink_return\fP\^, XRectangle
+*\fIoverall_logical_return\fP\^);
+.SH ARGUMENTS
+.IP \fIfont_set\fP 1i
+Specifies the font set.
+.IP \fInum_bytes\fP 1i
+Specifies the number of bytes in the string argument.
+.IP \fInum_wchars\fP 1i
+Specifies the number of characters in the string argument.
+.ds Ov dimensions
+.IP \fIoverall_ink_return\fP 1i
+Returns the overall ink \*(Ov.
+.IP \fIoverall_logical_return\fP 1i
+Returns the overall logical \*(Ov.
+.IP \fIstring\fP 1i
+Specifies the character string.
+.SH DESCRIPTION
+The
+.ZN XmbTextExtents ,
+.ZN XwcTextExtents
+and
+.ZN Xutf8TextExtents
+functions set the components of the specified overall_ink_return and
+overall_logical_return
+arguments to the overall bounding box of the string's image
+and a logical bounding box for spacing purposes, respectively.
+They return the value returned by 
+.ZN XmbTextEscapement ,
+.ZN XwcTextEscapement
+or
+.ZN Xutf8TextEscapement .
+These metrics are relative to the drawing origin of the string,
+using the fonts loaded for the specified font set.
+.LP
+If the overall_ink_return argument is non-NULL,
+it is set to the bounding box of the string's character ink.
+The overall_ink_return for a nondescending, horizontally drawn
+Latin character is conventionally entirely above the baseline;
+that is, overall_ink_return.height <= \-overall_ink_return.y.
+The overall_ink_return for a nonkerned character
+is entirely at, and to the right of, the origin;
+that is, overall_ink_return.x >= 0.
+A character consisting of a single pixel at the origin would set
+overall_ink_return fields y = 0, x = 0, width = 1, and height = 1.
+.LP
+If the overall_logical_return argument is non-NULL,
+it is set to the bounding box that provides minimum spacing
+to other graphical features for the string.
+Other graphical features, for example, a border surrounding the text,
+should not intersect this rectangle.
+.LP
+When the 
+.ZN XFontSet
+has missing charsets,
+metrics for each unavailable character are taken 
+from the default string returned by 
+.ZN XCreateFontSet 
+so that the metrics represent the text as it will actually be drawn.
+The behavior for an invalid codepoint is undefined.
+.LP
+The function
+.ZN Xutf8TextExtents
+is an extension introduced by The XFree86 Project, Inc. in their 4.0.2
+release. Its presence is
+indicated by the macro
+.ZN X_HAVE_UTF8_STRING .
+.SH "SEE ALSO"
+XmbTextEscapement(__libmansuffix__),
+XmbTextPerCharExtents(__libmansuffix__)
+\fI\*(xL\fP
diff --git a/man/XmbTextListToTextProperty.man b/man/XmbTextListToTextProperty.man
new file mode 100644 (file)
index 0000000..5f1aad7
--- /dev/null
@@ -0,0 +1,459 @@
+'\" t
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\" Copyright \(co 2000  The XFree86 Project, Inc.
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\"
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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
+'\" t
+.TH XmbTextListToTextProperty __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XmbTextListToTextProperty, XwcTextListToTextProperty, Xutf8TextListToTextProperty, XmbTextPropertyToTextList, XwcTextPropertyToTextList, Xutf8TextPropertyToTextList, XwcFreeStringList, XDefaultString \- convert text lists and text property structures
+.SH SYNTAX
+.HP
+int XmbTextListToTextProperty\^(\^Display *\fIdisplay\fP\^, char
+**\fIlist\fP\^, int \fIcount\fP\^, XICCEncodingStyle \fIstyle\fP\^,
+XTextProperty *\fItext_prop_return\fP\^); 
+.HP
+int XwcTextListToTextProperty\^(\^Display *\fIdisplay\fP\^, wchar_t
+**\fIlist\fP\^, int \fIcount\fP\^, XICCEncodingStyle \fIstyle\fP\^,
+XTextProperty *\fItext_prop_return\fP\^); 
+.HP
+int Xutf8TextListToTextProperty\^(\^Display *\fIdisplay\fP\^, char
+**\fIlist\fP\^, int \fIcount\fP\^, XICCEncodingStyle \fIstyle\fP\^,
+XTextProperty *\fItext_prop_return\fP\^); 
+.HP
+int XmbTextPropertyToTextList\^(\^Display *\fIdisplay\fP\^, XTextProperty
+*\fItext_prop\fP\^, char ***\fIlist_return\fP\^, int *\fIcount_return\fP\^); 
+.HP
+int XwcTextPropertyToTextList\^(\^Display *\fIdisplay\fP\^, XTextProperty
+*\fItext_prop\fP\^, wchar_t ***\fIlist_return\fP\^, int
+*\fIcount_return\fP\^); 
+.HP
+int Xutf8TextPropertyToTextList\^(\^Display *\fIdisplay\fP\^, XTextProperty
+*\fItext_prop\fP\^, char ***\fIlist_return\fP\^, int *\fIcount_return\fP\^); 
+.HP
+void XwcFreeStringList\^(\^wchar_t **\fIlist\fP\^); 
+.HP
+char *XDefaultString\^(void)
+.SH ARGUMENTS
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIlist\fP 1i
+Specifies a list of null-terminated character strings.
+.IP \fIcount\fP 1i
+Specifies the number of strings specified.
+.IP \fIstyle\fP 1i
+Specifies the manner in which the property is encoded.
+.IP \fItext_prop_return\fP 1i
+Returns the
+.ZN XTextProperty
+structure.
+.IP \fItext_prop\fP 1i
+Specifies the
+.ZN XTextProperty
+structure to be used.
+.IP \fIlist_return\fP 1i
+Returns a list of null-terminated character strings.
+.ds Cn strings
+.IP \fIcount_return\fP 1i
+Returns the number of \*(Cn.
+.IP \fIlist\fP 1i
+Specifies the list of strings to be freed.
+.SH DESCRIPTION
+The
+.ZN XmbTextListToTextProperty ,
+.ZN XwcTextListToTextProperty
+and
+.ZN Xutf8TextListToTextProperty
+functions set the specified 
+.ZN XTextProperty
+value to a set of null-separated elements representing the concatenation
+of the specified list of null-terminated text strings. The input text
+strings must be given in the current locale encoding (for
+.ZN XmbTextListToTextProperty
+and
+.ZN XwcTextListToTextProperty ),
+or in UTF-8 encoding (for
+.ZN Xutf8TextListToTextProperty ).
+.LP
+The functions set the encoding field of text_prop_return to an
+.ZN Atom 
+for the specified display 
+naming the encoding determined by the specified style
+and convert the specified text list to this encoding for storage in
+the text_prop_return value field.
+If the style 
+.ZN XStringStyle
+or 
+.ZN XCompoundTextStyle
+is specified,
+this encoding is ``STRING'' or ``COMPOUND_TEXT'', respectively.
+If the style
+.ZN XUTF8StringStyle
+is specified,
+this encoding is ``UTF8_STRING''. 
+(This is an extension introduced by The XFree86 Project, Inc. in their 4.0.2
+release. Its presence is indicated by the macro
+.ZN X_HAVE_UTF8_STRING .)
+If the style 
+.ZN XTextStyle
+is specified,
+this encoding is the encoding of the current locale.
+If the style 
+.ZN XStdICCTextStyle
+is specified,
+this encoding is ``STRING'' if the text is fully convertible to STRING,
+else ``COMPOUND_TEXT''.
+A final terminating null byte is stored at the end of the value field 
+of text_prop_return but is not included in the nitems member.
+.LP
+If insufficient memory is available for the new value string,
+the functions return 
+.ZN XNoMemory .
+If the current locale is not supported,
+the functions return 
+.ZN XLocaleNotSupported .
+In both of these error cases,
+the functions do not set text_prop_return.
+.LP
+To determine if the functions are guaranteed not to return
+.ZN XLocaleNotSupported ,
+use
+.ZN XSupportsLocale .
+.LP
+If the supplied text is not fully convertible to the specified encoding,
+the functions return the number of unconvertible characters.
+Each unconvertible character is converted to an implementation-defined and
+encoding-specific default string.
+Otherwise, the functions return 
+.ZN Success .
+Note that full convertibility to all styles except 
+.ZN XStringStyle
+is guaranteed.
+.LP
+To free the storage for the value field, use
+.ZN XFree .
+.LP
+The 
+.ZN XmbTextPropertyToTextList ,
+.ZN XwcTextPropertyToTextList
+and 
+.ZN Xutf8TextPropertyToTextList
+functions return a list of text strings representing the
+null-separated elements of the specified
+.ZN XTextProperty
+structure. The returned strings are encoded using the current locale encoding
+(for
+.ZN XmbTextPropertyToTextList
+and
+.ZN XwcTextPropertyToTextList )
+or in UTF-8 (for
+.ZN Xutf8TextPropertyToTextList ).
+The data in text_prop must be format 8.
+.LP
+Multiple elements of the property (for example, the strings in a disjoint
+text selection) are separated by a null byte.
+The contents of the property are not required to be null-terminated;
+any terminating null should not be included in text_prop.nitems.
+.LP
+If insufficient memory is available for the list and its elements,
+.ZN XmbTextPropertyToTextList ,
+.ZN XwcTextPropertyToTextList
+and
+.ZN Xutf8TextPropertyToTextList
+return 
+.ZN XNoMemory .
+If the current locale is not supported,
+the functions return
+.ZN XLocaleNotSupported .
+Otherwise, if the encoding field of text_prop is not convertible 
+to the encoding of the current locale,
+the functions return
+.ZN XConverterNotFound .
+For supported locales,
+existence of a converter from COMPOUND_TEXT, STRING, UTF8_STRING
+or the encoding of the current locale is guaranteed if
+.ZN XSupportsLocale 
+returns 
+.ZN True
+for the current locale (but the actual text
+may contain unconvertible characters).
+Conversion of other encodings is implementation-dependent.
+In all of these error cases,
+the functions do not set any return values.
+.LP
+Otherwise, 
+.ZN XmbTextPropertyToTextList ,
+.ZN XwcTextPropertyToTextList
+and
+.ZN Xutf8TextPropertyToTextList
+return the list of null-terminated text strings to list_return
+and the number of text strings to count_return.
+.LP
+If the value field of text_prop is not fully convertible to the
+encoding of the current locale,
+the functions return the number of unconvertible characters.
+Each unconvertible character is converted to a string in the
+current locale that is specific to the current locale.
+To obtain the value of this string, 
+use
+.ZN XDefaultString .
+Otherwise,
+.ZN XmbTextPropertyToTextList ,
+.ZN XwcTextPropertyToTextList
+and
+.ZN Xutf8TextPropertyToTextList
+return 
+.ZN Success .
+.LP
+To free the storage for the list and its contents returned by
+.ZN XmbTextPropertyToTextList
+or
+.ZN Xutf8TextPropertyToTextList ,
+use
+.ZN XFreeStringList .
+To free the storage for the list and its contents returned by
+.ZN XwcTextPropertyToTextList ,
+use
+.ZN XwcFreeStringList .
+.LP
+The
+.ZN XwcFreeStringList
+function frees memory allocated by
+.ZN XwcTextPropertyToTextList .
+.LP
+The
+.ZN XDefaultString
+function returns the default string used by Xlib for text conversion
+(for example, in 
+.ZN XmbTextPropertyToTextList ).
+The default string is the string in the current locale that is output 
+when an unconvertible character is found during text conversion.
+If the string returned by
+.ZN XDefaultString
+is the empty string ("\^"),
+no character is output in the converted text.
+.ZN XDefaultString
+does not return NULL.
+.LP
+The string returned by 
+.ZN XDefaultString
+is independent of the default string for text drawing;
+see 
+.ZN XCreateFontSet
+to obtain the default string for an
+.ZN XFontSet .
+.LP
+The behavior when an invalid codepoint is supplied to any Xlib function is
+undefined.
+.LP
+The returned string is null-terminated.
+It is owned by Xlib and should not be modified or freed by the client.
+It may be freed after the current locale is changed.
+Until freed, it will not be modified by Xlib.
+.LP
+The functions
+.ZN Xutf8TextListToTextProperty
+and
+.ZN Xutf8TextPropertyToTextList
+are extensions introduced by The XFree86 Project, Inc. in their 4.0.2
+release. Their presence is
+indicated by the macro
+.ZN X_HAVE_UTF8_STRING .
+.SH STRUCTURES
+The
+.ZN XTextProperty
+structure contains:
+.LP
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+typedef struct {
+       unsigned char *value;   /\&* property data */
+       Atom encoding;  /\&* type of property */
+       int format;     /\&* 8, 16, or 32 */
+       unsigned long nitems;   /\&* number of items in value */
+} XTextProperty;
+.De
+.LP
+The
+.ZN XICCEncodingStyle
+structure contains:
+.LP
+.TS
+lw(.5i) lw(2i) lw(2.5i).
+T{
+\&#define
+T}     T{
+.ZN XNoMemory
+T}     T{
+\-1
+T}
+T{
+\&#define
+T}     T{
+.ZN XLocaleNotSupported
+T}     T{
+\-2
+T}
+T{
+\&#define
+T}     T{
+.ZN XConverterNotFound
+T}     T{
+\-3
+T}
+.TE
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+typedef enum {
+       XStringStyle,           /\&* STRING */
+       XCompoundTextStyle,     /\&* COMPOUND_TEXT */
+       XTextStyle,             /\&* text in owner's encoding (current locale) */
+       XStdICCTextStyle,       /\&* STRING, else COMPOUND_TEXT */
+       XUTF8StringStyle        /\&* UTF8_STRING */
+} XICCEncodingStyle;
+.De
+.SH "SEE ALSO"
+XSetTextProperty(__libmansuffix__),
+XStringListToTextProperty(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XmbTextPerCharExtents.man b/man/XmbTextPerCharExtents.man
new file mode 100644 (file)
index 0000000..cfaa153
--- /dev/null
@@ -0,0 +1,256 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\" Copyright \(co 2000  The XFree86 Project, Inc.
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\"
+.\" 
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XmbTextPerCharExtents __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XmbTextPerCharExtents, XwcTextPerCharExtents, Xutf8TextPerCharExtents \- obtain per-character information for a text string
+.SH SYNTAX
+.HP
+Status XmbTextPerCharExtents\^(\^XFontSet \fIfont_set\fP\^, char
+*\fIstring\fP\^, int \fInum_bytes\fP\^, XRectangle *\fIink_array_return\fP\^,
+XRectangle *\fIlogical_array_return\fP\^, int \fIarray_size\fP\^, int
+*\fInum_chars_return\fP\^, XRectangle *\fIoverall_ink_return\fP\^, XRectangle
+*\fIoverall_logical_return\fP\^); 
+.HP
+Status XwcTextPerCharExtents\^(\^XFontSet \fIfont_set\fP\^, wchar_t
+*\fIstring\fP\^, int \fInum_wchars\fP\^, XRectangle
+*\fIink_array_return\fP\^, XRectangle *\fIlogical_array_return\fP, int
+\fIarray_size\fP\^, int *\fInum_chars_return\fP\^, XRectangle
+*\fIoverall_ink_return\fP\^, XRectangle *\fIoverall_logical_return\fP\^); 
+.HP
+Status Xutf8TextPerCharExtents\^(\^XFontSet \fIfont_set\fP\^, char
+*\fIstring\fP\^, int \fInum_bytes\fP\^, XRectangle *\fIink_array_return\fP\^,
+XRectangle *\fIlogical_array_return\fP\^, int \fIarray_size\fP\^, int
+*\fInum_chars_return\fP\^, XRectangle *\fIoverall_ink_return\fP\^, XRectangle
+*\fIoverall_logical_return\fP\^);
+.SH ARGUMENTS
+.IP \fIarray_size\fP 1i
+Specifies the size of ink_array_return and logical_array_return.
+The caller must pass in arrays of this size.
+.IP \fIfont_set\fP 1i
+Specifies the font set.
+.IP \fIink_array_return\fP 1i
+Returns the ink dimensions for each character.
+.IP \fIlogical_array_return\fP 1i
+Returns the logical dimensions for each character.
+.IP \fInum_bytes\fP 1i
+Specifies the number of bytes in the string argument.
+.IP \fInum_chars_return\fP 1i
+Returns the number of characters in the string argument.
+.IP \fInum_wchars\fP 1i
+Specifies the number of characters in the string argument.
+.ds Ov extents of the entire string
+.IP \fIoverall_ink_return\fP 1i
+Returns the overall ink \*(Ov.
+.IP \fIoverall_logical_return\fP 1i
+Returns the overall logical \*(Ov.
+.IP \fIstring\fP 1i
+Specifies the character string.
+.SH DESCRIPTION
+The
+.ZN XmbTextPerCharExtents ,
+.ZN XwcTextPerCharExtents
+and
+.ZN Xutf8TextPerCharExtents
+functions return the text dimensions of each character of the specified text,
+using the fonts loaded for the specified font set.
+Each successive element of ink_array_return and logical_array_return
+is set to the successive character's drawn metrics,
+relative to the drawing origin of the string and one 
+rectangle
+for each character in the supplied text string.
+The number of elements of ink_array_return and logical_array_return
+that have been set is returned to num_chars_return.
+.LP
+Each element of ink_array_return is set to the bounding box 
+of the corresponding character's drawn foreground color.
+Each element of logical_array_return is set to the bounding box 
+that provides minimum spacing to other graphical features
+for the corresponding character.
+Other graphical features should not intersect any of the
+logical_array_return rectangles.
+.LP
+Note that an 
+.ZN XRectangle
+represents the effective drawing dimensions of the character,
+regardless of the number of font glyphs that are used to draw
+the character or the direction in which the character is drawn.
+If multiple characters map to a single character glyph,
+the dimensions of all the 
+.ZN XRectangles
+of those characters are the same.
+.LP
+When the 
+.ZN XFontSet
+has missing charsets, metrics for each unavailable
+character are taken from the default string returned by 
+.ZN XCreateFontSet
+so that the metrics represent the text as it will actually be drawn.
+The behavior for an invalid codepoint is undefined.
+.LP
+If the array_size is too small for the number of characters in the
+supplied text, the functions return zero
+and num_chars_return is set to the number of rectangles required.
+Otherwise, the functions return a nonzero value.
+.LP
+If the overall_ink_return or overall_logical_return argument is non-NULL,
+.ZN XmbTextPerCharExtents ,
+.ZN XwcTextPerCharExtents
+and 
+.ZN Xutf8TextPerCharExtents
+return the maximum extent of the string's metrics to overall_ink_return
+or overall_logical_return, as returned by 
+.ZN XmbTextExtents ,
+.ZN XwcTextExtents
+or 
+.ZN Xutf8TextExtents .
+.LP
+The function
+.ZN Xutf8TextPerCharExtents
+is an extension introduced by The XFree86 Project, Inc. in their 4.0.2
+release. Its presence is
+indicated by the macro
+.ZN X_HAVE_UTF8_STRING .
+.SH "SEE ALSO"
+XmbTextEscapement(__libmansuffix__),
+XmbTextExtents(__libmansuffix__)
+\fI\*(xL\fP
diff --git a/man/XmbTextPropertyToTextList.man b/man/XmbTextPropertyToTextList.man
new file mode 100644 (file)
index 0000000..5e871ab
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XmbTextListToTextProperty.__libmansuffix__
diff --git a/man/XrmCombineDatabase.man b/man/XrmCombineDatabase.man
new file mode 100644 (file)
index 0000000..29cd76f
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XrmMergeDatabases.__libmansuffix__
diff --git a/man/XrmCombineFileDatabase.man b/man/XrmCombineFileDatabase.man
new file mode 100644 (file)
index 0000000..29cd76f
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XrmMergeDatabases.__libmansuffix__
diff --git a/man/XrmDestroyDatabase.man b/man/XrmDestroyDatabase.man
new file mode 100644 (file)
index 0000000..baefa90
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XrmGetFileDatabase.__libmansuffix__
diff --git a/man/XrmEnumerateDatabase.man b/man/XrmEnumerateDatabase.man
new file mode 100644 (file)
index 0000000..4fe6817
--- /dev/null
@@ -0,0 +1,234 @@
+'\" t
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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
+'\" t
+.TH XrmEnumerateDatabase __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XrmEnumerateDatabase \- enumerate resource database entries
+.SH SYNTAX
+.TS
+lw(.5i) lw(2i) lw(2.5i).
+T{
+\&#define
+T}     T{
+.ZN XrmEnumAllLevels
+T}     T{
+0
+T}
+T{
+\&#define
+T}     T{
+.ZN XrmEnumOneLevel
+T}     T{
+1
+T}
+.TE
+.HP
+Bool XrmEnumerateDatabase\^(\^XrmDatabase \fIdatabase\fP\^, XrmNameList
+\fIname_prefix\fP\^, XrmClassList \fIclass_prefix\fP\^, int \fImode\fP\^, Bool
+(\^*\fIproc\fP\^)\^(\^)\^, XPointer \fIarg\fP\^); 
+.SH ARGUMENTS
+.IP \fIdatabase\fP 1i
+Specifies the resource database.
+.IP \fIname_prefix\fP 1i
+Specifies the resource name prefix.
+.IP \fIclass_prefix\fP 1i
+Specifies the resource class prefix.
+.IP \fImode\fP 1i
+Specifies the number of levels to enumerate.
+.IP \fIproc\fP 1i
+Specifies the procedure that is to be called for each matching entry.
+.IP \fIarg\fP 1i
+Specifies the user-supplied argument that will be passed to the procedure.
+.SH DESCRIPTION
+The
+.ZN XrmEnumerateDatabase
+function calls the specified procedure for each resource in the database
+that would match some completion of the given name/class resource prefix.
+The order in which resources are found is implementation-dependent.
+If mode is
+.ZN XrmEnumOneLevel ,
+a resource must match the given name/class prefix with
+just a single name and class appended.  If mode is
+.ZN XrmEnumAllLevels ,
+the resource must match the given name/class prefix with one or more names and
+classes appended.
+If the procedure returns
+.ZN True ,
+the enumeration terminates and the function returns
+.ZN True . 
+If the procedure always returns
+.ZN False ,
+all matching resources are enumerated and the function returns
+.ZN False .
+.LP
+The procedure is called with the following arguments:
+.LP
+.\" Start marker code here
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+(*\fIproc\fP\^)(\^\fIdatabase\fP, \fIbindings\fP, \fIquarks\fP, \fItype\fP, \fIvalue\fP, \fIarg\fP\^)
+       XrmDatabase *\fIdatabase\fP\^;
+       XrmBindingList \fIbindings\fP\^;
+       XrmQuarkList \fIquarks\fP\^;
+       XrmRepresentation *\fItype\fP\^;
+       XrmValue *\fIvalue\fP\^;
+       XPointer \fIarg\fP\^;
+.De
+.\" End marker code here
+.LP
+The bindings and quarks lists are terminated by
+.ZN NULLQUARK .
+Note that pointers
+to the database and type are passed, but these values should not be modified.
+.LP
+The procedure must not modify the database.
+If Xlib has been initialized for threads, the procedure is called with
+the database locked and the result of a call by the procedure to any
+Xlib function using the same database is not defined.
+.SH "SEE ALSO"
+XrmGetResource(__libmansuffix__),
+XrmInitialize(__libmansuffix__),
+XrmPutResource(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XrmGetDatabase.man b/man/XrmGetDatabase.man
new file mode 100644 (file)
index 0000000..baefa90
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XrmGetFileDatabase.__libmansuffix__
diff --git a/man/XrmGetFileDatabase.man b/man/XrmGetFileDatabase.man
new file mode 100644 (file)
index 0000000..08d0810
--- /dev/null
@@ -0,0 +1,323 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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
+.de EX
+.sp
+.nf
+.ft CW
+..
+.de EE
+.ft R
+.fi
+.sp
+..
+.TH XrmGetFileDatabase __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XrmGetFileDatabase, XrmPutFileDatabase, XrmGetStringDatabase, XrmLocaleOfDatabase, XrmGetDatabase, XrmSetDatabase, XrmDestroyDatabase \- retrieve and store resource databases
+.SH SYNTAX
+.HP
+XrmDatabase XrmGetFileDatabase\^(\^char *\fIfilename\fP\^); 
+.HP
+void XrmPutFileDatabase\^(\^XrmDatabase \fIdatabase\fP\^, char
+*\fIstored_db\fP\^); 
+.HP
+XrmDatabase XrmGetStringDatabase\^(\^char *\fIdata\fP\^, 
+.HP
+char *XrmLocaleOfDatabase\^(\^XrmDatabase \fIdatabase\fP\^); 
+.HP
+XrmDatabase XrmGetDatabase\^(\^Display *\fIdisplay\fP\^); 
+.HP
+void XrmSetDatabase\^(\^Display *\fIdisplay\fP\^, XrmDatabase
+\fIdatabase\fP\^); 
+.HP
+void XrmDestroyDatabase\^(\^XrmDatabase \fIdatabase\fP\^); 
+.SH ARGUMENTS
+.IP \fIfilename\fP 1i
+Specifies the resource database file name.
+.IP \fIdatabase\fP 1i
+Specifies the database that is to be used.
+.IP \fIstored_db\fP 1i
+Specifies the file name for the stored database.
+.IP \fIdata\fP 1i
+Specifies the database contents using a string.
+.IP \fIdatabase\fP 1i
+Specifies the resource database.
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.SH DESCRIPTION
+The
+.ZN XrmGetFileDatabase
+function opens the specified file,
+creates a new resource database, and loads it with the specifications
+read in from the specified file.
+The specified file should contain a sequence of entries in valid ResourceLine
+format (see section 15.1); the database that results from reading a file
+with incorrect syntax is implementation-dependent.
+The file is parsed in the current locale, 
+and the database is created in the current locale.
+If it cannot open the specified file,
+.ZN XrmGetFileDatabase
+returns NULL.
+.LP
+The
+.ZN XrmPutFileDatabase
+function stores a copy of the specified database in the specified file.
+Text is written to the file as a sequence of entries in valid
+ResourceLine format (see section 15.1).
+The file is written in the locale of the database.
+Entries containing resource names that are not in the Host Portable Character
+Encoding or containing values that are not in the encoding of the database
+locale, are written in an implementation-dependent manner.
+The order in which entries are written is implementation-dependent.
+Entries with representation types other than ``String'' are ignored.
+.LP
+The
+.ZN XrmGetStringDatabase
+function creates a new database and stores the resources specified
+in the specified null-terminated string.
+.ZN XrmGetStringDatabase
+is similar to
+.ZN XrmGetFileDatabase
+except that it reads the information out of a string instead of out of a file.
+The string should contain a sequence of entries in valid ResourceLine
+format (see section 15.1) terminated by a null character;
+the database that results from using a string
+with incorrect syntax is implementation-dependent.
+The string is parsed in the current locale, 
+and the database is created in the current locale.
+.LP
+If database is NULL,
+.ZN XrmDestroyDatabase
+returns immediately.
+.LP
+The
+.ZN XrmLocaleOfDatabase
+function returns the name of the locale bound to the specified
+database, as a null-terminated string.
+The returned locale name string is owned by Xlib and should not be
+modified or freed by the client.
+Xlib is not permitted to free the string until the database is destroyed.
+Until the string is freed,
+it will not be modified by Xlib.
+.LP
+The
+.ZN XrmGetDatabase
+function returns the database associated with the specified display.
+It returns NULL if a database has not yet been set.
+.LP
+The
+.ZN XrmSetDatabase
+function associates the specified resource database (or NULL)
+with the specified display.
+The database previously associated with the display (if any) is not destroyed.
+A client or toolkit may find this function convenient for retaining a database
+once it is constructed.
+.SH "FILE SYNTAX"
+The syntax of a resource file is a sequence of resource lines
+terminated by newline characters or the end of the file.
+The syntax of an individual resource line is:
+.LP
+.\" Start marker code here
+.EX
+ResourceLine   =       Comment | IncludeFile | ResourceSpec | <empty line>
+Comment        =       "!" {<any character except null or newline>}
+IncludeFile    =       "#" WhiteSpace "include" WhiteSpace FileName WhiteSpace
+FileName       =       <valid filename for operating system>
+ResourceSpec   =       WhiteSpace ResourceName WhiteSpace ":" WhiteSpace Value
+ResourceName   =       [Binding] {Component Binding} ComponentName
+Binding        =       "\&." | "*"
+WhiteSpace     =       {<space> | <horizontal tab>}
+Component      =       "?" | ComponentName
+ComponentName  =       NameChar {NameChar}
+NameChar       =       "a"\-"z" | "A"\-"Z" | "0"\-"9" | "_" | "-"
+Value  =       {<any character except null or unescaped newline>}
+.EE
+.LP
+Elements separated by vertical bar (|) are alternatives.
+Curly braces ({\&.\&.\&.}) indicate zero or more repetitions
+of the enclosed elements.
+Square brackets ([\&.\&.\&.]) indicate that the enclosed element is optional.
+Quotes ("\&.\&.\&.") are used around literal characters.
+.LP
+IncludeFile lines are interpreted by replacing the line with the
+contents of the specified file.
+The word ``include'' must be in lowercase.
+The file name is interpreted relative to the directory of the file in
+which the line occurs (for example, if the file name contains no
+directory or contains a relative directory specification).
+.LP
+If a ResourceName contains a contiguous sequence of two or more Binding
+characters, the sequence will be replaced with single ``\&.'' character
+if the sequence contains only ``\&.'' characters;
+otherwise, the sequence will be replaced with a single ``*'' character.
+.LP
+A resource database never contains more than one entry for a given
+ResourceName.  If a resource file contains multiple lines with the
+same ResourceName, the last line in the file is used.
+.LP
+Any white space characters before or after the name or colon in a ResourceSpec
+are ignored.
+To allow a Value to begin with white space,
+the two-character sequence ``\^\\\^\fIspace\fP'' (backslash followed by space)
+is recognized and replaced by a space character,
+and the two-character sequence ``\^\\\^\fItab\fP''
+(backslash followed by horizontal tab)
+is recognized and replaced by a horizontal tab character.
+To allow a Value to contain embedded newline characters,
+the two-character sequence ``\^\\\^n'' is recognized and replaced by a
+newline character.
+To allow a Value to be broken across multiple lines in a text file,
+the two-character sequence ``\^\\\^\fInewline\fP''
+(backslash followed by newline) is
+recognized and removed from the value.
+To allow a Value to contain arbitrary character codes,
+the four-character sequence ``\^\\\^\fInnn\fP'',
+where each \fIn\fP 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.
+.SH "SEE ALSO"
+XrmGetResource(__libmansuffix__),
+XrmInitialize(__libmansuffix__),
+XrmPutResource(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XrmGetResource.man b/man/XrmGetResource.man
new file mode 100644 (file)
index 0000000..2745892
--- /dev/null
@@ -0,0 +1,325 @@
+'\" e
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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
+'\" e
+.TH XrmGetResource __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XrmGetResource, XrmQGetResource, XrmQGetSearchList, XrmQGetSearchResource \- retrieve database resources and search lists
+.SH SYNTAX
+.HP
+Bool XrmGetResource\^(\^XrmDatabase \fIdatabase\fP\^, char *\fIstr_name\fP\^,
+char *\fIstr_class\fP\^, char **\fIstr_type_return\fP\^, XrmValue
+*\fIvalue_return\fP\^); 
+.HP
+Bool XrmQGetResource\^(\^XrmDatabase \fIdatabase\fP\^, XrmNameList
+\fIquark_name\fP\^, XrmClassList \fIquark_class\fP\^, XrmRepresentation
+*\fIquark_type_return\fP\^, XrmValue *\fIvalue_return\fP\^); 
+.HP
+typedef XrmHashTable *XrmSearchList;
+.sp
+Bool XrmQGetSearchList\^(\^XrmDatabase \fIdatabase\fP\^, XrmNameList
+\fInames\fP\^, XrmClassList \fIclasses\fP\^, XrmSearchList
+\fIlist_return\fP\^, int \fIlist_length\fP\^); 
+.HP
+Bool XrmQGetSearchResource\^(\^XrmSearchList \fIlist\fP\^, XrmName
+\fIname\fP\^, XrmClass \fIclass\fP\^, XrmRepresentation *\fItype_return\fP\^, 
+XrmValue *\fIvalue_return\fP\^); 
+.SH ARGUMENTS
+.IP \fIclass\fP 1i
+Specifies the resource class.
+.IP \fIclasses\fP 1i
+Specifies a list of resource classes.
+.IP \fIdatabase\fP 1i
+Specifies the database that is to be used.
+.IP \fIlist\fP 1i
+Specifies the search list returned by
+.ZN XrmQGetSearchList .
+.IP \fIlist_length\fP 1i
+Specifies the number of entries (not the byte size) allocated for list_return.
+.IP \fIlist_return\fP 1i
+Returns a search list for further use.
+.IP \fIname\fP 1i
+Specifies the resource name.
+.IP \fInames\fP 1i
+Specifies a list of resource names.
+.IP \fIquark_class\fP 1i
+Specifies the fully qualified class of the value being retrieved (as a quark).
+.IP \fIquark_name\fP 1i
+Specifies the fully qualified name of the value being retrieved (as a quark).
+.IP \fIquark_type_return\fP 1i
+Returns the representation type of the destination (as a quark).
+.IP \fIstr_class\fP 1i
+Specifies the fully qualified class of the value being retrieved (as a string).
+.IP \fIstr_name\fP 1i
+Specifies the fully qualified name of the value being retrieved (as a string).
+.IP \fIstr_type_return\fP 1i
+Returns the representation type of the destination (as a string).
+.IP \fItype_return\fP 1i
+Returns data representation type.
+.IP \fIvalue_return\fP 1i
+Returns the value in the database.
+.SH DESCRIPTION
+The 
+.ZN XrmGetResource 
+and 
+.ZN XrmQGetResource 
+functions retrieve a resource from the specified database.
+Both take a fully qualified name/class pair, a destination
+resource representation, and the address of a value
+(size/address pair).  
+The value and returned type point into database memory;
+therefore, you must not modify the data.
+.LP
+The database only frees or overwrites entries on
+.ZN XrmPutResource , 
+.ZN XrmQPutResource ,
+or 
+.ZN XrmMergeDatabases .
+A client that is not storing new values into the database or
+is not merging the database should be safe using the address passed 
+back at any time until it exits.
+If a resource was found, both
+.ZN XrmGetResource 
+and
+.ZN XrmQGetResource 
+return 
+.ZN True ;
+otherwise, they return 
+.ZN False .
+.LP
+The
+.ZN XrmQGetSearchList
+function takes a list of names and classes
+and returns a list of database levels where a match might occur.
+The returned list is in best-to-worst order and
+uses the same algorithm as 
+.ZN XrmGetResource 
+for determining precedence.
+If list_return was large enough for the search list,
+.ZN XrmQGetSearchList
+returns 
+.ZN True ;
+otherwise, it returns
+.ZN False .
+.LP
+The size of the search list that the caller must allocate is
+dependent upon the number of levels and wildcards in the resource specifiers 
+that are stored in the database.
+The worst case length is %3 sup n%,
+where \fIn\fP is the number of name or class components in names or classes.
+.LP
+When using 
+.ZN XrmQGetSearchList 
+followed by multiple probes for resources with a common name and class prefix,
+only the common prefix should be specified in the name and class list to 
+.ZN XrmQGetSearchList .
+.LP
+The
+.ZN XrmQGetSearchResource
+function searches the specified database levels for the resource 
+that is fully identified by the specified name and class.
+The search stops with the first match.
+.ZN XrmQGetSearchResource
+returns 
+.ZN True 
+if the resource was found;
+otherwise, it returns
+.ZN False .
+.LP
+A call to 
+.ZN XrmQGetSearchList 
+with a name and class list containing all but the last component 
+of a resource name followed by a call to 
+.ZN XrmQGetSearchResource 
+with the last component name and class returns the same database entry as 
+.ZN XrmGetResource 
+and 
+.ZN XrmQGetResource 
+with the fully qualified name and class.
+.SH "MATCHING RULES"
+The algorithm for determining which resource database entry
+matches a given query is the heart of the resource manager.
+All queries must fully specify the name and class of the desired resource
+(use of the characters ``*'' and ``?'' are not permitted).
+The library supports up to 100 components in a full name or class.
+Resources are stored in the database with only partially specified
+names and classes, using pattern matching constructs.
+An asterisk (*) is a loose binding and is used to represent any number
+of intervening components, including none.
+A period (.) is a tight binding and is used to separate immediately
+adjacent components.
+A question mark (?) is used to match any single component name or class.
+A database entry cannot end in a loose binding;
+the final component (which cannot be the character ``?'') must be specified.
+The lookup algorithm searches the database for the entry that most
+closely matches (is most specific for) the full name and class being queried.
+When more than one database entry matches the full name and class,
+precedence rules are used to select just one.
+.LP
+The full name and class are scanned from left to right (from highest
+level in the hierarchy to lowest), one component at a time.
+At each level, the corresponding component and/or binding of each
+matching entry is determined, and these matching components and
+bindings are compared according to precedence rules.
+Each of the rules is applied at each level before moving to the next level,
+until a rule selects a single entry over all others.
+The rules, in order of precedence, are:
+.IP 1. 5
+An entry that contains a matching component (whether name, class,
+or the character ``?'')
+takes precedence over entries that elide the level (that is, entries
+that match the level in a loose binding).
+.IP 2. 5
+An entry with a matching name takes precedence over both
+entries with a matching class and entries that match using the character ``?''.
+An entry with a matching class takes precedence over
+entries that match using the character ``?''.
+.IP 3. 5
+An entry preceded by a tight binding takes precedence over entries
+preceded by a loose binding.
+.SH "SEE ALSO"
+XrmInitialize(__libmansuffix__),
+XrmMergeDatabases(__libmansuffix__),
+XrmPutResource(__libmansuffix__),
+XrmUniqueQuark(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XrmGetStringDatabase.man b/man/XrmGetStringDatabase.man
new file mode 100644 (file)
index 0000000..baefa90
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XrmGetFileDatabase.__libmansuffix__
diff --git a/man/XrmInitialize.man b/man/XrmInitialize.man
new file mode 100644 (file)
index 0000000..3e6dcd1
--- /dev/null
@@ -0,0 +1,263 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XrmInitialize __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XrmInitialize, XrmParseCommand, XrmValue, XrmOptionKind, XrmOptionDescRec \- initialize the Resource Manager, Resource Manager structures, and parse the command line
+.SH SYNTAX
+.HP
+void XrmInitialize\^(void\^);
+.HP
+void XrmParseCommand\^(\^XrmDatabase *\fIdatabase\fP\^, XrmOptionDescList
+\fItable\fP\^, int \fItable_count\fP\^, char *\fIname\fP\^, int
+*\fIargc_in_out\fP\^, char **\fIargv_in_out\fP\^); 
+.SH ARGUMENTS
+.IP \fIargc_in_out\fP 1i
+Specifies the number of arguments and returns the number of remaining arguments.
+.IP \fIargv_in_out\fP 1i
+Specifies the command line arguments
+and returns the remaining arguments.
+.IP \fIdatabase\fP 1i
+Specifies the resource database.
+.IP \fIname\fP 1i
+Specifies the application name.
+.IP \fItable\fP 1i
+Specifies the table of command line arguments to be parsed.
+.IP \fItable_count\fP 1i
+Specifies the number of entries in the table.
+.SH DESCRIPTION
+The
+.ZN XrmInitialize
+function initialize the resource manager.
+It must be called before any other Xrm functions are used.
+.LP
+The
+.ZN XrmParseCommand
+function parses an (argc, argv) pair according to the specified option table,
+loads recognized options into the specified database with type ``String,''
+and modifies the (argc, argv) pair to remove all recognized options.
+If database contains NULL,
+.ZN XrmParseCommand
+creates a new database and returns a pointer to it.
+Otherwise, entries are added to the database specified.
+If a database is created, it is created in the current locale.
+.LP
+The specified table is used to parse the command line.
+Recognized options in the table are removed from argv,
+and entries are added to the specified resource database
+in the order they occur in argv.
+The table entries contain information on the option string,
+the option name, the style of option, 
+and a value to provide if the option kind is 
+.ZN XrmoptionNoArg .
+The option names are compared byte-for-byte to arguments in argv,
+independent of any locale.
+The resource values given in the table are stored in the resource database
+without modification.
+All resource database entries are created
+using a ``String'' representation type.
+The argc argument specifies the number of arguments in argv
+and is set on return to the remaining number of arguments that were not parsed.
+The name argument should be the name of your application
+for use in building the database entry.
+The name argument is prefixed to the resourceName in the option table
+before storing a database entry.
+The name argument is treated as a single component, even if it
+has embedded periods.
+No separating (binding) character is inserted,
+so the table must contain either a period (.) or an asterisk (*)
+as the first character in each resourceName entry.
+To specify a more completely qualified resource name,
+the resourceName entry can contain multiple components.
+If the name argument and the resourceNames are not in the
+Host Portable Character Encoding,
+the result is implementation-dependent.
+.SH STRUCTURES
+The
+.ZN XrmValue ,
+.ZN XrmOptionKind ,
+and
+.ZN XrmOptionDescRec
+structures contain:
+.LP
+.Ds 0
+.TA .5i 3i
+.ta .5i 3i
+typedef struct {
+       unsigned int size;
+       XPointer addr;
+} XrmValue, *XrmValuePtr;
+.De
+.LP
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+typedef enum {
+       XrmoptionNoArg, /\&* Value is specified in XrmOptionDescRec.value */
+       XrmoptionIsArg, /\&* Value is the option string itself */
+       XrmoptionStickyArg,     /\&* Value is characters immediately following option */
+       XrmoptionSepArg,        /\&* Value is next argument in argv */
+       XrmoptionResArg,        /\&* Resource and value in next argument in argv */
+       XrmoptionSkipArg,       /\&* Ignore this option and the next argument in argv */
+       XrmoptionSkipLine,      /\&* Ignore this option and the rest of argv */
+       XrmoptionSkipNArgs      /\&* Ignore this option and the next
+               \ \ \ XrmOptionDescRec.value arguments in argv */
+} XrmOptionKind;
+.De
+.LP
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+typedef struct {
+       char *option;   /\&* Option specification string in argv                    */
+       char *specifier;        /\&* Binding and resource name (sans application name)    */
+       XrmOptionKind argKind;  /\&* Which style of option it is            */
+       XPointer value; /\&* Value to provide if XrmoptionNoArg or 
+               \ \ \ XrmoptionSkipNArgs   */
+} XrmOptionDescRec, *XrmOptionDescList;
+.De
+.SH "SEE ALSO"
+XrmGetResource(__libmansuffix__),
+XrmMergeDatabases(__libmansuffix__),
+XrmPutResource(__libmansuffix__),
+XrmUniqueQuark(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XrmLocaleOfDatabase.man b/man/XrmLocaleOfDatabase.man
new file mode 100644 (file)
index 0000000..baefa90
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XrmGetFileDatabase.__libmansuffix__
diff --git a/man/XrmMergeDatabases.man b/man/XrmMergeDatabases.man
new file mode 100644 (file)
index 0000000..bb4d3bd
--- /dev/null
@@ -0,0 +1,215 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XrmMergeDatabases __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XrmMergeDatabases, XrmCombineDatabase, XrmCombineFileDatabase \- merge resource databases
+.SH SYNTAX
+.HP
+void XrmMergeDatabases(\^XrmDatabase \fIsource_db\fP, XrmDatabase
+*\fItarget_db\fP\^); 
+.HP
+void XrmCombineDatabase(\^XrmDatabase \fIsource_db\fP, XrmDatabase
+*\fItarget_db\fP, Bool \fIoverride\fP\^); 
+.HP
+Status XrmCombineFileDatabase(\^char *\fIfilename\fP, XrmDatabase
+*\fItarget_db\fP\^, Bool \fIoverride\fP); 
+.SH ARGUMENTS
+.IP \fIsource_db\fP 1i
+Specifies the resource database that is to be merged into the target database.
+.IP \fItarget_db\fP 1i
+Specifies the resource database into which the source 
+database is to be merged.
+.IP \fIfilename\fP 1i
+Specifies the resource database file name.
+.IP \fIoverride\fP 1i
+Specifies whether source entries override target ones.
+.SH DESCRIPTION
+Calling the
+.ZN XrmMergeDatabases
+function is equivalent to calling the
+.ZN XrmCombineDatabase
+function with an override argument of
+.ZN True .
+.LP
+The
+.ZN XrmCombineDatabase
+function merges the contents of one database into another.
+If the same specifier is used for an entry in both databases,
+the entry in the source_db will replace the entry in the target_db
+if override is
+.ZN True ;
+otherwise, the entry in source_db is discarded.
+If target_db contains NULL,
+.ZN XrmCombineDatabase
+simply stores source_db in it.
+Otherwise, source_db is destroyed by the merge, but the database pointed
+to by target_db is not destroyed.
+The database entries are merged without changing values or types,
+regardless of the locales of the databases.
+The locale of the target database is not modified.
+.LP
+The
+.ZN XrmCombineFileDatabase
+function merges the contents of a resource file into a database.
+If the same specifier is used for an entry in both the file and
+the database,
+the entry in the file will replace the entry in the database
+if override is
+.ZN True ;
+otherwise, the entry in the file is discarded.
+The file is parsed in the current locale.
+If the file cannot be read,
+a zero status is returned;
+otherwise, a nonzero status is returned.
+If target_db contains NULL,
+.ZN XrmCombineFileDatabase
+creates and returns a new database to it.
+Otherwise, the database pointed to by target_db is not destroyed by the merge.
+The database entries are merged without changing values or types,
+regardless of the locale of the database.
+The locale of the target database is not modified.
+.SH "SEE ALSO"
+XrmGetResource(__libmansuffix__),
+XrmInitialize(__libmansuffix__),
+XrmPutResource(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XrmOptionDescRec.man b/man/XrmOptionDescRec.man
new file mode 100644 (file)
index 0000000..f6f0953
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XrmInitialize.__libmansuffix__
diff --git a/man/XrmOptionKind.man b/man/XrmOptionKind.man
new file mode 100644 (file)
index 0000000..f6f0953
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XrmInitialize.__libmansuffix__
diff --git a/man/XrmParseCommand.man b/man/XrmParseCommand.man
new file mode 100644 (file)
index 0000000..f6f0953
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XrmInitialize.__libmansuffix__
diff --git a/man/XrmPermStringToQuark.man b/man/XrmPermStringToQuark.man
new file mode 100644 (file)
index 0000000..29467e6
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XrmUniqueQuark.__libmansuffix__
diff --git a/man/XrmPutFileDatabase.man b/man/XrmPutFileDatabase.man
new file mode 100644 (file)
index 0000000..baefa90
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XrmGetFileDatabase.__libmansuffix__
diff --git a/man/XrmPutLineResource.man b/man/XrmPutLineResource.man
new file mode 100644 (file)
index 0000000..8af1fc3
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XrmPutResource.__libmansuffix__
diff --git a/man/XrmPutResource.man b/man/XrmPutResource.man
new file mode 100644 (file)
index 0000000..fb9638e
--- /dev/null
@@ -0,0 +1,252 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XrmPutResource __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XrmPutResource, XrmQPutResource, XrmPutStringResource, XrmQPutStringResource, XrmPutLineResource \- store database resources
+.SH SYNTAX
+.HP
+void XrmPutResource\^(\^XrmDatabase *\fIdatabase\fP\^, char
+*\fIspecifier\fP\^, char *\fItype\fP\^, XrmValue *\fIvalue\fP\^); 
+.HP
+void XrmQPutResource\^(\^XrmDatabase *\fIdatabase\fP\^, XrmBindingList
+\fIbindings\fP\^, XrmQuarkList \fIquarks\fP\^, XrmRepresentation \fItype\fP\^,
+XrmValue *\fIvalue\fP\^); 
+.HP
+void XrmPutStringResource\^(\^XrmDatabase *\fIdatabase\fP\^, char
+*\fIspecifier\fP\^, char *\fIvalue\fP\^); 
+.HP
+void XrmQPutStringResource\^(\^XrmDatabase *\fIdatabase\fP\^, XrmBindingList
+\fIbindings\fP\^, XrmQuarkList \fIquarks\fP\^, char *\fIvalue\fP\^); 
+.HP
+void XrmPutLineResource\^(\^XrmDatabase *\fIdatabase\fP\^, char
+*\fIline\fP\^); 
+.SH ARGUMENTS
+.IP \fIbindings\fP 1i
+Specifies a list of bindings.
+.IP \fIdatabase\fP 1i
+Specifies the resource database.
+.IP \fIline\fP 1i
+Specifies the resource name and value pair as a single string.
+.IP \fIquarks\fP 1i
+Specifies the complete or partial name or the class list of the resource.
+.IP \fIspecifier\fP 1i
+Specifies a complete or partial specification of the resource.
+.IP \fItype\fP 1i
+Specifies the type of the resource.
+.IP \fIvalue\fP 1i
+Specifies the value of the resource, which is specified as a string.
+.SH DESCRIPTION
+If database contains NULL,
+.ZN XrmPutResource
+creates a new database and returns a pointer to it.
+.ZN XrmPutResource
+is a convenience function that calls
+.ZN XrmStringToBindingQuarkList
+followed by:
+.LP
+.Ds
+XrmQPutResource(database, bindings, quarks, XrmStringToQuark(type), value)
+.De
+.LP
+If the specifier and type are not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+The value is stored in the database without modification.
+.LP
+If database contains NULL,
+.ZN XrmQPutResource
+creates a new database and returns a pointer to it.
+If a resource entry with the identical bindings and quarks already
+exists in the database, the previous type and value are replaced by the new
+specified type and value.
+The value is stored in the database without modification.
+.LP
+If database contains NULL,
+.ZN XrmPutStringResource
+creates a new database and returns a pointer to it.
+.ZN XrmPutStringResource
+adds a resource with the specified value to the specified database.
+.ZN XrmPutStringResource
+is a convenience function that first calls
+.ZN XrmStringToBindingQuarkList
+on the specifier and then calls
+.ZN XrmQPutResource ,
+using a ``String'' representation type.
+If the specifier is not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+The value is stored in the database without modification.
+.LP
+If database contains NULL,
+.ZN XrmQPutStringResource
+creates a new database and returns a pointer to it.
+.ZN XrmQPutStringResource
+is a convenience routine that constructs an
+.ZN XrmValue
+for the value string (by calling
+.ZN strlen
+to compute the size) and
+then calls
+.ZN XrmQPutResource ,
+using a ``String'' representation type.
+The value is stored in the database without modification.
+.LP
+If database contains NULL,
+.ZN XrmPutLineResource
+creates a new database and returns a pointer to it.
+.ZN XrmPutLineResource
+adds a single resource entry to the specified database.
+The line should be in valid ResourceLine format (see section 15.1)
+terminated by a newline or null character;
+the database that results from using a string
+with incorrect syntax is implementation-dependent.
+The string is parsed in the locale of the database.
+If the
+.ZN ResourceName
+is not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+Note that comment lines are not stored.
+.SH "SEE ALSO"
+XrmGetResource(__libmansuffix__),
+XrmInitialize(__libmansuffix__),
+XrmMergeDatabases(__libmansuffix__),
+XrmUniqueQuark(__libmansuffix__)
+.br
+\fI\*(xL\fP
diff --git a/man/XrmPutStringResource.man b/man/XrmPutStringResource.man
new file mode 100644 (file)
index 0000000..8af1fc3
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XrmPutResource.__libmansuffix__
diff --git a/man/XrmQGetResource.man b/man/XrmQGetResource.man
new file mode 100644 (file)
index 0000000..806a063
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XrmGetResource.__libmansuffix__
diff --git a/man/XrmQGetSearchList.man b/man/XrmQGetSearchList.man
new file mode 100644 (file)
index 0000000..806a063
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XrmGetResource.__libmansuffix__
diff --git a/man/XrmQGetSearchResource.man b/man/XrmQGetSearchResource.man
new file mode 100644 (file)
index 0000000..806a063
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XrmGetResource.__libmansuffix__
diff --git a/man/XrmQPutResource.man b/man/XrmQPutResource.man
new file mode 100644 (file)
index 0000000..8af1fc3
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XrmPutResource.__libmansuffix__
diff --git a/man/XrmQPutStringResource.man b/man/XrmQPutStringResource.man
new file mode 100644 (file)
index 0000000..8af1fc3
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XrmPutResource.__libmansuffix__
diff --git a/man/XrmQuarkToString.man b/man/XrmQuarkToString.man
new file mode 100644 (file)
index 0000000..29467e6
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XrmUniqueQuark.__libmansuffix__
diff --git a/man/XrmSetDatabase.man b/man/XrmSetDatabase.man
new file mode 100644 (file)
index 0000000..baefa90
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XrmGetFileDatabase.__libmansuffix__
diff --git a/man/XrmStringToBindingQuarkList.man b/man/XrmStringToBindingQuarkList.man
new file mode 100644 (file)
index 0000000..29467e6
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XrmUniqueQuark.__libmansuffix__
diff --git a/man/XrmStringToQuark.man b/man/XrmStringToQuark.man
new file mode 100644 (file)
index 0000000..29467e6
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XrmUniqueQuark.__libmansuffix__
diff --git a/man/XrmStringToQuarkList.man b/man/XrmStringToQuarkList.man
new file mode 100644 (file)
index 0000000..29467e6
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XrmUniqueQuark.__libmansuffix__
diff --git a/man/XrmUniqueQuark.man b/man/XrmUniqueQuark.man
new file mode 100644 (file)
index 0000000..78ae2e6
--- /dev/null
@@ -0,0 +1,303 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+.\" OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" Except as contained in this notice, the name of the X Consortium shall
+.\" not be used in advertising or otherwise to promote the sale, use or
+.\" other dealings in this Software without prior written authorization
+.\" from the X Consortium.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" 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 all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\" 
+.\"
+.ds xT X Toolkit Intrinsics \- C Language Interface
+.ds xW Athena X Widgets \- C Language X Toolkit Interface
+.ds xL Xlib \- C Language X Interface
+.ds xC Inter-Client Communication Conventions Manual
+.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 hN
+.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 XrmUniqueQuark __libmansuffix__ __xorgversion__ "XLIB FUNCTIONS"
+.SH NAME
+XrmUniqueQuark, XrmStringToQuark, XrmPermStringToQuark, XrmQuarkToString, XrmStringToQuarkList, XrmStringToBindingQuarkList \- manipulate resource quarks
+.SH SYNOPSIS
+.HP
+XrmQuark XrmUniqueQuark\^(void); 
+.LP
+\&#define XrmStringToName(string) XrmStringToQuark(string)
+.br
+\&#define XrmStringToClass(string) XrmStringToQuark(string)
+.br
+\&#define XrmStringToRepresentation(string) XrmStringToQuark(string)
+.HP
+int XrmQuark XrmStringToQuark\^(\^char *\fIstring\fP\^); 
+.HP
+XrmQuark XrmPermStringToQuark\^(\^char *\fIstring\fP\^); 
+.LP
+\&#define XrmStringToName(string) XrmStringToQuark(string)
+.br
+\&#define XrmStringToClass(string) XrmStringToQuark(string)
+.br
+\&#define XrmStringToRepresentation(string) XrmStringToQuark(string)
+.HP
+XrmQuark XrmStringToQuark\^(\^char *\fIstring\fP\^); 
+.HP
+XrmQuark XrmPermStringToQuark\^(\^char *\fIstring\fP\^); 
+.LP
+\&#define XrmNameToString(name) XrmQuarkToString(name)
+.br
+\&#define XrmClassToString(class) XrmQuarkToString(class)
+.br
+\&#define XrmRepresentationToString(type) XrmQuarkToString(type)
+.HP
+char *XrmQuarkToString\^(\^XrmQuark \fIquark\fP\^); 
+.LP
+\&#define XrmStringToNameList(str, name)  XrmStringToQuarkList((str), (name))
+.br
+\&#define XrmStringToClassList(str,class) XrmStringToQuarkList((str), (class))
+.sp
+.HP
+void XrmStringToQuarkList\^(\^char *\fIstring\fP\^, XrmQuarkList
+\fIquarks_return\fP\^); 
+.HP
+XrmStringToBindingQuarkList\^(\^char *\fIstring\fP\^, XrmBindingList
+\fIbindings_return\fP\^, XrmQuarkList \fIquarks_return\fP\^); 
+.SH ARGUMENTS
+.IP \fIbindings_return\fP 1i
+Returns the binding list.
+.IP \fIquark\fP 1i
+Specifies the quark for which the equivalent string is desired.
+.IP \fIquarks_return\fP 1i
+Returns the list of quarks.
+.ds Ql \ or quark list
+.IP \fIstring\fP 1i
+Specifies the string for which a quark\*(Ql is to be allocated.
+.SH DESCRIPTION
+The
+.ZN XrmUniqueQuark
+function allocates a quark that is guaranteed not to represent any string that
+is known to the resource manager.
+.LP
+These functions can be used to convert from string to quark representation.
+If the string is not in the Host Portable Character Encoding,
+the conversion is implementation-dependent.
+The string argument to
+.ZN XrmStringToQuark
+need not be permanently allocated storage.
+.ZN XrmPermStringToQuark
+is just like
+.ZN XrmStringToQuark ,
+except that Xlib is permitted to assume the string argument is permanently
+allocated,
+and, hence, that it can be used as the value to be returned by
+.ZN XrmQuarkToString .
+.LP
+For any given quark, if
+.ZN XrmStringToQuark
+returns a non-NULL value,
+all future calls will return the same value (identical address).
+.LP
+These functions can be used to convert from quark representation to string.
+The string pointed to by the return value must not be modified or freed.
+The returned string is byte-for-byte equal to the original
+string passed to one of the string-to-quark routines.
+If no string exists for that quark,
+.ZN XrmQuarkToString
+returns NULL.
+For any given quark, if
+.ZN XrmQuarkToString
+returns a non-NULL value,
+all future calls will return the same value (identical address).
+.LP
+These functions can be used to convert from string to quark representation.
+If the string is not in the Host Portable Character Encoding,
+the conversion is implementation-dependent.
+The string argument to
+.ZN XrmStringToQuark
+need not be permanently allocated storage.
+.ZN XrmPermStringToQuark
+is just like
+.ZN XrmStringToQuark ,
+except that Xlib is permitted to assume the string argument is permanently
+allocated,
+and, hence, that it can be used as the value to be returned by
+.ZN XrmQuarkToString .
+.LP
+For any given quark, if
+.ZN XrmStringToQuark
+returns a non-NULL value,
+all future calls will return the same value (identical address).
+.LP
+The
+.ZN XrmStringToQuarkList
+function converts the null-terminated string (generally a fully qualified name)
+to a list of quarks.
+The caller must allocate sufficient space for the quarks list before calling 
+.ZN XrmStringToQuarkList .
+Note that the string must be in the valid ResourceName format 
+(see section 15.1).
+If the string is not in the Host Portable Character Encoding,
+the conversion is implementation-dependent.
+.LP
+A binding list is a list of type
+.ZN XrmBindingList
+and indicates if components of name or class lists are bound tightly or loosely
+(that is, if wildcarding of intermediate components is specified).
+.LP
+.EX
+typedef enum {XrmBindTightly, XrmBindLoosely} XrmBinding, *XrmBindingList;
+.EE
+.LP
+.ZN XrmBindTightly
+indicates that a period separates the components, and
+.ZN XrmBindLoosely
+indicates that an asterisk separates the components.
+.LP
+The
+.ZN XrmStringToBindingQuarkList
+function converts the specified string to a binding list and a quark list.
+The caller must allocate sufficient space for the quarks list and the
+binding list before calling 
+.ZN XrmStringToBindingQuarkList .
+If the string is not in the Host Portable Character Encoding
+the conversion is implementation-dependent.
+Component names in the list are separated by a period or
+an asterisk character.
+If the string does not start with period or asterisk,
+a period is assumed.
+For example, ``*a.b*c'' becomes:
+.LP
+.TS
+l l l.
+quarks a       b       c
+bindings       loose   tight   loose
+.TE
+.SH "SEE ALSO"
+XrmGetResource(__libmansuffix__),
+XrmInitialize(__libmansuffix__),
+XrmMergeDatabases(__libmansuffix__),
+XrmPutResource(__libmansuffix__)
+.LP
+\fI\*(xL\fP
diff --git a/man/XrmValue.man b/man/XrmValue.man
new file mode 100644 (file)
index 0000000..f6f0953
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XrmInitialize.__libmansuffix__
diff --git a/man/Xutf8DrawImageString.man b/man/Xutf8DrawImageString.man
new file mode 100644 (file)
index 0000000..503e289
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XmbDrawImageString.__libmansuffix__
diff --git a/man/Xutf8DrawString.man b/man/Xutf8DrawString.man
new file mode 100644 (file)
index 0000000..d95517d
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XmbDrawString.__libmansuffix__
diff --git a/man/Xutf8DrawText.man b/man/Xutf8DrawText.man
new file mode 100644 (file)
index 0000000..5e8eba9
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XmbDrawText.__libmansuffix__
diff --git a/man/Xutf8LookupString.man b/man/Xutf8LookupString.man
new file mode 100644 (file)
index 0000000..5267832
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XmbLookupString.__libmansuffix__
diff --git a/man/Xutf8ResetIC.man b/man/Xutf8ResetIC.man
new file mode 100644 (file)
index 0000000..c6c16fd
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XmbResetIC.__libmansuffix__
diff --git a/man/Xutf8SetWMProperties.man b/man/Xutf8SetWMProperties.man
new file mode 100644 (file)
index 0000000..1d3bd24
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XSetWMProperties.__libmansuffix__
diff --git a/man/Xutf8TextEscapement.man b/man/Xutf8TextEscapement.man
new file mode 100644 (file)
index 0000000..17e8ea7
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XmbTextEscapement.__libmansuffix__
diff --git a/man/Xutf8TextExtents.man b/man/Xutf8TextExtents.man
new file mode 100644 (file)
index 0000000..24f0a0d
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XmbTextExtents.__libmansuffix__
diff --git a/man/Xutf8TextListToTextProperty.man b/man/Xutf8TextListToTextProperty.man
new file mode 100644 (file)
index 0000000..5e871ab
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XmbTextListToTextProperty.__libmansuffix__
diff --git a/man/Xutf8TextPerCharExtents.man b/man/Xutf8TextPerCharExtents.man
new file mode 100644 (file)
index 0000000..389ca96
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XmbTextPerCharExtents.__libmansuffix__
diff --git a/man/Xutf8TextPropertyToTextList.man b/man/Xutf8TextPropertyToTextList.man
new file mode 100644 (file)
index 0000000..5e871ab
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XmbTextListToTextProperty.__libmansuffix__
diff --git a/man/XwcDrawImageString.man b/man/XwcDrawImageString.man
new file mode 100644 (file)
index 0000000..503e289
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XmbDrawImageString.__libmansuffix__
diff --git a/man/XwcDrawString.man b/man/XwcDrawString.man
new file mode 100644 (file)
index 0000000..d95517d
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XmbDrawString.__libmansuffix__
diff --git a/man/XwcDrawText.man b/man/XwcDrawText.man
new file mode 100644 (file)
index 0000000..5e8eba9
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XmbDrawText.__libmansuffix__
diff --git a/man/XwcFreeStringList.man b/man/XwcFreeStringList.man
new file mode 100644 (file)
index 0000000..5e871ab
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XmbTextListToTextProperty.__libmansuffix__
diff --git a/man/XwcLookupString.man b/man/XwcLookupString.man
new file mode 100644 (file)
index 0000000..5267832
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XmbLookupString.__libmansuffix__
diff --git a/man/XwcResetIC.man b/man/XwcResetIC.man
new file mode 100644 (file)
index 0000000..c6c16fd
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XmbResetIC.__libmansuffix__
diff --git a/man/XwcTextEscapement.man b/man/XwcTextEscapement.man
new file mode 100644 (file)
index 0000000..17e8ea7
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XmbTextEscapement.__libmansuffix__
diff --git a/man/XwcTextExtents.man b/man/XwcTextExtents.man
new file mode 100644 (file)
index 0000000..24f0a0d
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XmbTextExtents.__libmansuffix__
diff --git a/man/XwcTextListToTextProperty.man b/man/XwcTextListToTextProperty.man
new file mode 100644 (file)
index 0000000..5e871ab
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XmbTextListToTextProperty.__libmansuffix__
diff --git a/man/XwcTextPerCharExtents.man b/man/XwcTextPerCharExtents.man
new file mode 100644 (file)
index 0000000..389ca96
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XmbTextPerCharExtents.__libmansuffix__
diff --git a/man/XwcTextPropertyToTextList.man b/man/XwcTextPropertyToTextList.man
new file mode 100644 (file)
index 0000000..5e871ab
--- /dev/null
@@ -0,0 +1 @@
+.so man__libmansuffix__/XmbTextListToTextProperty.__libmansuffix__
diff --git a/man/xkb/Makefile.am b/man/xkb/Makefile.am
new file mode 100644 (file)
index 0000000..484a85a
--- /dev/null
@@ -0,0 +1,215 @@
+libmandir = $(LIB_MAN_DIR)
+
+libman_PRE = \
+       XkbActionCtrls.man                      \
+       XkbAddDeviceLedInfo.man                 \
+       XkbAddGeomColor.man                     \
+       XkbAddGeomDoodad.man                    \
+       XkbAddGeomKey.man                       \
+       XkbAddGeomKeyAlias.man                  \
+       XkbAddGeomOutline.man                   \
+       XkbAddGeomOverlay.man                   \
+       XkbAddGeomOverlayKey.man                \
+       XkbAddGeomOverlayRow.man                \
+       XkbAddGeomProperty.man                  \
+       XkbAddGeomRow.man                       \
+       XkbAddGeomSection.man                   \
+       XkbAddGeomShape.man                     \
+       XkbAddSymInterpret.man                  \
+       XkbAllocClientMap.man                   \
+       XkbAllocCompatMap.man                   \
+       XkbAllocControls.man                    \
+       XkbAllocDeviceInfo.man                  \
+       XkbAllocDeviceLedInfo.man               \
+       XkbAllocGeomColors.man                  \
+       XkbAllocGeomDoodads.man                 \
+       XkbAllocGeomKeyAliases.man              \
+       XkbAllocGeomKeys.man                    \
+       XkbAllocGeomOutlines.man                \
+       XkbAllocGeomOverlayKey.man              \
+       XkbAllocGeomOverlayRows.man             \
+       XkbAllocGeomOverlays.man                \
+       XkbAllocGeomPoints.man                  \
+       XkbAllocGeomProps.man                   \
+       XkbAllocGeomRows.man                    \
+       XkbAllocGeomSectionDoodads.man          \
+       XkbAllocGeomSections.man                \
+       XkbAllocGeomShapes.man                  \
+       XkbAllocGeometry.man                    \
+       XkbAllocIndicatorMaps.man               \
+       XkbAllocKeyboard.man                    \
+       XkbAllocNames.man                       \
+       XkbAllocServerMap.man                   \
+       XkbApplyCompatMapToKey.man              \
+       XkbBell.man                             \
+       XkbBellEvent.man                        \
+       XkbChangeControls.man                   \
+       XkbChangeDeviceInfo.man                 \
+       XkbChangeEnabledControls.man            \
+       XkbChangeIndicators.man                 \
+       XkbChangeMap.man                        \
+       XkbChangeNames.man                      \
+       XkbChangeTypesOfKey.man                 \
+       XkbComputeRowBounds.man                 \
+       XkbComputeSectionBounds.man             \
+       XkbComputeShapeBounds.man               \
+       XkbComputeShapeTop.man                  \
+       XkbCopyKeyType.man                      \
+       XkbCopyKeyTypes.man                     \
+       XkbDeviceBell.man                       \
+       XkbDeviceBellEvent.man                  \
+       XkbFindOverlayForKey.man                \
+       XkbForceBell.man                        \
+       XkbForceDeviceBell.man                  \
+       XkbFreeClientMap.man                    \
+       XkbFreeCompatMap.man                    \
+       XkbFreeComponentList.man                \
+       XkbFreeControls.man                     \
+       XkbFreeDeviceInfo.man                   \
+       XkbFreeGeomColors.man                   \
+       XkbFreeGeomDoodads.man                  \
+       XkbFreeGeomKeyAliases.man               \
+       XkbFreeGeomKeys.man                     \
+       XkbFreeGeomOutlines.man                 \
+       XkbFreeGeomOverlayKeys.man              \
+       XkbFreeGeomOverlayRows.man              \
+       XkbFreeGeomOverlays.man                 \
+       XkbFreeGeomPoints.man                   \
+       XkbFreeGeomProperties.man               \
+       XkbFreeGeomRows.man                     \
+       XkbFreeGeomSections.man                 \
+       XkbFreeGeomShapes.man                   \
+       XkbFreeGeometry.man                     \
+       XkbFreeIndicatorMaps.man                \
+       XkbFreeKeyboard.man                     \
+       XkbFreeNames.man                        \
+       XkbFreeServerMap.man                    \
+       XkbGetAccessXTimeout.man                \
+       XkbGetAutoRepeatRate.man                \
+       XkbGetAutoResetControls.man             \
+       XkbGetBounceKeysDelay.man               \
+       XkbGetCompatMap.man                     \
+       XkbGetControls.man                      \
+       XkbGetControlsChanges.man               \
+       XkbGetDetectableAutoRepeat.man          \
+       XkbGetDeviceButtonActions.man           \
+       XkbGetDeviceInfo.man                    \
+       XkbGetDeviceInfoChanges.man             \
+       XkbGetDeviceLedInfo.man                 \
+       XkbGetGeometry.man                      \
+       XkbGetIndicatorChanges.man              \
+       XkbGetIndicatorMap.man                  \
+       XkbGetIndicatorState.man                \
+       XkbGetKeyActions.man                    \
+       XkbGetKeyBehaviors.man                  \
+       XkbGetKeyExplicitComponents.man         \
+       XkbGetKeyModifierMap.man                \
+       XkbGetKeySyms.man                       \
+       XkbGetKeyTypes.man                      \
+       XkbGetKeyVirtualModMap.man              \
+       XkbGetKeyboard.man                      \
+       XkbGetKeyboardByName.man                \
+       XkbGetMap.man                           \
+       XkbGetNameChanges.man                   \
+       XkbGetNamedGeometry.man                 \
+       XkbGetNamedIndicator.man                \
+       XkbGetNames.man                         \
+       XkbGetSlowKeysDelay.man                 \
+       XkbGetState.man                         \
+       XkbGetStickyKeysOptions.man             \
+       XkbGetUpdatedMap.man                    \
+       XkbGetVirtualMods.man                   \
+       XkbGetXlibControls.man                  \
+       XkbIgnoreExtension.man                  \
+       XkbInitCanonicalKeyTypes.man            \
+       XkbKeyAction.man                        \
+       XkbKeyActionEntry.man                   \
+       XkbKeyActionsPtr.man                    \
+       XkbKeyGroupInfo.man                     \
+       XkbKeyGroupWidth.man                    \
+       XkbKeyGroupsWidth.man                   \
+       XkbKeyHasActions.man                    \
+       XkbKeyNumActions.man                    \
+       XkbKeyNumGroups.man                     \
+       XkbKeyNumSyms.man                       \
+       XkbKeySymEntry.man                      \
+       XkbKeySymsOffset.man                    \
+       XkbKeySymsPtr.man                       \
+       XkbKeyType.man                          \
+       XkbKeyTypeIndex.man                     \
+       XkbKeyTypesForCoreSymbols.man           \
+       XkbKeycodeToKeysym.man                  \
+       XkbKeysymToModifiers.man                \
+       XkbLatchGroup.man                       \
+       XkbLatchModifiers.man                   \
+       XkbLibraryVersion.man                   \
+       XkbListComponents.man                   \
+       XkbLockGroup.man                        \
+       XkbLockModifiers.man                    \
+       XkbLookupKeyBinding.man                 \
+       XkbLookupKeySym.man                     \
+       XkbModActionVMods.man                   \
+       XkbNoteControlsChanges.man              \
+       XkbNoteDeviceChanges.man                \
+       XkbNoteIndicatorChanges.man             \
+       XkbNoteNameChanges.man                  \
+       XkbOpenDisplay.man                      \
+       XkbOutOfRangeGroupInfo.man              \
+       XkbOutOfRangeGroupNumber.man            \
+       XkbPtrActionX.man                       \
+       XkbPtrActionY.man                       \
+       XkbQueryExtension.man                   \
+       XkbRefreshKeyboardMapping.man           \
+       XkbResizeDeviceButtonActions.man        \
+       XkbResizeKeyActions.man                 \
+       XkbResizeKeySyms.man                    \
+       XkbResizeKeyType.man                    \
+       XkbSAActionSetCtrls.man                 \
+       XkbSAGroup.man                          \
+       XkbSAPtrDfltValue.man                   \
+       XkbSARedirectSetVMods.man               \
+       XkbSARedirectSetVModsMask.man           \
+       XkbSARedirectVMods.man                  \
+       XkbSARedirectVModsMask.man              \
+       XkbSAScreen.man                         \
+       XkbSASetGroup.man                       \
+       XkbSASetPtrDfltValue.man                \
+       XkbSASetScreen.man                      \
+       XkbSelectEventDetails.man               \
+       XkbSelectEvents.man                     \
+       XkbSetAccessXTimeout.man                \
+       XkbSetAutoRepeatRate.man                \
+       XkbSetAutoResetControls.man             \
+       XkbSetBounceKeysDelay.man               \
+       XkbSetCompatMap.man                     \
+       XkbSetControls.man                      \
+       XkbSetDebuggingFlags.man                \
+       XkbSetDetectableAutoRepeat.man          \
+       XkbSetDeviceButtonActions.man           \
+       XkbSetDeviceInfo.man                    \
+       XkbSetIgnoreLockMods.man                \
+       XkbSetIndicatorMap.man                  \
+       XkbSetMap.man                           \
+       XkbSetModActionVMods.man                \
+       XkbSetNamedIndicator.man                \
+       XkbSetNames.man                         \
+       XkbSetPtrActionX.man                    \
+       XkbSetPtrActionY.man                    \
+       XkbSetServerInternalMods.man            \
+       XkbSetXlibControls.man                  \
+       XkbTranslateKeyCode.man                 \
+       XkbTranslateKeySym.man                  \
+       XkbUpdateMapFromCore.man                \
+       XkbVirtualModsToReal.man                
+
+libman_DATA = $(libman_PRE:man=@LIB_MAN_SUFFIX@)
+
+EXTRA_DIST = $(libman_PRE)
+
+CLEANFILES = $(libman_DATA)
+
+SUFFIXES = .$(LIB_MAN_SUFFIX) .man
+
+# 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/xkb/XkbActionCtrls.man b/man/xkb/XkbActionCtrls.man
new file mode 100644 (file)
index 0000000..a35d156
--- /dev/null
@@ -0,0 +1,136 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbActionCtrls __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbActionCtrls \- Returns the ctrls fields of act converted to an unsigned int
+.SH SYNOPSIS
+.HP
+.B unsigned int XkbActionCtrls
+.BI "(\^XkbCtrlsAction " "act" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- act
+action from which to extract controls
+.SH DESCRIPTION
+.LP
+Actions associated with the XkbCtrlsAction structure change the state of the 
+boolean controls.
+
+The 
+.I type 
+field can have any one of the values shown in Table 1.
+
+.TS
+c s
+l l
+l lw(4i).
+Table 1 Controls Action Types
+_
+Type   Effect
+_
+XkbSA_SetControls      T{
+A key press enables any boolean controls specified in the ctrls fields that were 
+not already enabled at 
+the time of the key press.
+A key release disables any controls enabled by the key press.
+This action can cause XkbControlsNotify events.
+T}
+XkbSA_LockControls     T{
+If the XkbSA_LockNoLock bit is not set in the flags field, a key press enables 
+any controls specified in 
+the ctrls fields that were not already enabled at the time of the key press.
+.br
+If the XkbSA_LockNoUnlock bit is not set in the flags field, a key release 
+disables any controls 
+specified in the ctrls fields that were not already disabled at the time of the 
+key press.
+.br
+This action can cause XkbControlsNotify events.
+T}
+.TE
+
+The 
+.I flags 
+field is composed of the bitwise inclusive OR of the masks shown in Table 2.
+
+.TS
+c s
+l l
+l lw(4i).
+Table 2 Control Action Flags
+_
+Flag   Meaning
+_
+XkbSA_LockNoLock       T{
+If set, and the action type is XkbSA_LockControls, the server only disables 
+controls.
+T}
+XkbSA_LockNoUnlock     T{
+If set, and the action type is XkbSA_LockControls, the server only enables 
+controls.
+T}
+.TE
+
+The XkbSA_SetControls action implements a key that enables a boolean control 
+when pressed and disables it 
+when released. The XkbSA_LockControls action is used to implement a key that 
+toggles the state of a 
+boolean control each time it is pressed and released. The XkbSA_LockNoLock and 
+XkbSA_LockNoUnlock flags 
+allow modifying the toggling behavior to only unlock or only lock the boolean 
+control.
+
+The 
+.I ctrls0, ctrls1, ctrls2, 
+and 
+.I ctrls3 
+fields represent the boolean controls in the 
+.I enabled_ctrls 
+field of the controls structure. Xkb macros, to convert between the two formats.
+
+.I XkbActionCtrls 
+returns the 
+.I ctrls 
+fields of 
+.I act 
+converted to an unsigned int.
+.SH STRUCTURES
+.LP
+.nf
+
+    typedef struct _XkbCtrlsAction {
+        unsigned char    type;    /\(** XkbSA_SetControls, XkbSA_LockControls */
+        unsigned char    flags;   /\(** with type, controls enabling and disabling 
+of controls */
+        unsigned char    ctrls3;  /\(** ctrls0 through ctrls3 represent the boolean 
+controls */
+        unsigned char    ctrls2;  /\(** ctrls0 through ctrls3 represent the boolean 
+controls */
+        unsigned char    ctrls1;  /\(** ctrls0 through ctrls3 represent the boolean 
+controls */
+        unsigned char    ctrls0;  /\(** ctrls0 through ctrls3 represent the boolean 
+controls */
+    } XkbCtrlsAction;
+.fi
diff --git a/man/xkb/XkbAddDeviceLedInfo.man b/man/xkb/XkbAddDeviceLedInfo.man
new file mode 100644 (file)
index 0000000..e6ee42b
--- /dev/null
@@ -0,0 +1,117 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbAddDeviceLedInfo __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAddDeviceLedInfo \- Initialize an XkbDeviceLedInfoRec structure
+.SH SYNOPSIS
+.HP
+.B XkbDeviceLedInfoPtr XkbAddDeviceLedInfo
+.BI "(\^XkbDeviceInfoPtr " "device_info" "\^,"
+.BI "unsigned int " "led_class" "\^,"
+.BI "unsigned int " "led_id" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- device_info
+structure in which to add LED info
+.TP
+.I \- led_class
+input extension class for LED device of interest
+.TP
+.I \- led_id
+input extension ID for LED device of interest
+.SH DESCRIPTION
+.LP
+.I XkbAddDeviceLedInfo 
+first checks to see whether an entry matching 
+.I led_class 
+and 
+.I led_id 
+already exists in the 
+.I device_info->leds 
+array. If it finds a matching entry, it returns a pointer to that entry. Otherwise, it checks to be sure 
+there is at least one empty entry in
+.I device_info->leds 
+and extends it if there is not enough room. It then increments
+.I device_info->num_leds 
+and fills in the next available entry in 
+.I device_info->leds 
+with 
+.I led_class 
+and 
+.I led_id.
+
+If successful, 
+.I XkbAddDeviceLedInfo 
+returns a pointer to the XkbDeviceLedInfoRec structure that was initialized. If unable to allocate 
+sufficient storage, or if 
+.I device_info 
+points to an invalid XkbDeviceInfoRec structure, or if 
+.I led_class 
+or 
+.I led_id 
+are inappropriate, 
+.I XkbAddDeviceLedInfo 
+returns NULL.
+
+To allocate additional space for button actions in an XkbDeviceInfoRec structure, use 
+.I XkbResizeDeviceButtonActions.
+
+.SH STRUCTURES
+.LP
+Information about X Input Extension devices is transferred between a client program and the Xkb 
+extension in an XkbDeviceInfoRec structure:
+.nf
+
+    typedef struct {
+        char *               name;          /\(** name for device */
+        Atom                 type;          /\(** name for class of devices */
+        unsigned short       device_spec;   /\(** device of interest */
+        Bool                 has_own_state; /\(** True=>this device has its own state */
+        unsigned short       supported;     /\(** bits indicating supported capabilities */
+        unsigned short       unsupported;   /\(** bits indicating unsupported capabilities */
+        unsigned short       num_btns;      /\(** number of entries in btn_acts */
+        XkbAction *          btn_acts;      /\(** button actions */
+        unsigned short       sz_leds;       /\(** total number of entries in LEDs vector */
+        unsigned short       num_leds;      /\(** number of valid entries in LEDs vector */
+        unsigned short       dflt_kbd_fb;   /\(** input extension ID of default (core kbd) indicator */
+        unsigned short       dflt_led_fb;   /\(** input extension ID of default indicator feedback */
+        XkbDeviceLedInfoPtr  leds;          /\(** LED descriptions */
+    } XkbDeviceInfoRec, *XkbDeviceInfoPtr;
+    
+
+    typedef struct {
+        unsigned short      led_class;        /\(** class for this LED device*/
+        unsigned short      led_id;           /\(** ID for this LED device */
+        unsigned int        phys_indicators;  /\(** bits for which LEDs physically present */
+        unsigned int        maps_present;     /\(** bits for which LEDs have maps in maps */
+        unsigned int        names_present;    /\(** bits for which LEDs are in names */
+        unsigned int        state;            /\(** 1 bit => corresponding LED is on */
+        Atom                names[XkbNumIndicators];   /\(** names for LEDs */
+        XkbIndicatorMapRec  maps;             /\(** indicator maps for each LED */
+    } XkbDeviceLedInfoRec, *XkbDeviceLedInfoPtr;
+
+.fi    
+.SH "SEE ALSO"
+.BR XkbResizeDeviceButtonActions (__libmansuffix__)
diff --git a/man/xkb/XkbAddGeomColor.man b/man/xkb/XkbAddGeomColor.man
new file mode 100644 (file)
index 0000000..68f4cd3
--- /dev/null
@@ -0,0 +1,96 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbAddGeomColor __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAddGeomColor \-  Add one color name to an existing keyboard geometry 
+description
+.SH SYNOPSIS
+.HP
+.B XkbColorPtr XkbAddGeomColor
+.BI "(\^XkbGeometryPtr " "geom" "\^,"
+.BI "char *" "spec" "\^,"
+.BI "unsigned int " "pixel" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- geom
+geometry to be updated
+.TP
+.I \- spec
+color to be added
+.TP
+.I \- pixel
+color to be added
+.SH DESCRIPTION
+.LP
+Xkb provides functions to add a single new element to the top-level keyboard 
+geometry. In each case the 
+.I num_ * 
+fields of the corresponding structure is incremented by 1. These functions do 
+not change 
+.I sz_* 
+unless there is no more room in the array. Some of these functions fill in the 
+values of the element's structure from the arguments. For other functions, you 
+must explicitly write code to fill the structure's elements.
+
+The top-level geometry description includes a list of 
+.I geometry properties. 
+A geometry property associates an arbitrary string with an equally arbitrary 
+name. Programs that display images of keyboards can use geometry properties as 
+hints, but they are not interpreted by Xkb. No other geometry structures refer 
+to geometry properties.
+
+.I XkbAddGeomColor 
+adds the specified color 
+.I name 
+and 
+.I pixel 
+to the specified geometry 
+.I geom. 
+The top-level geometry description includes a list of up to MaxColors (32) 
+.I color names. 
+A color 
+.I name 
+is a string whose interpretation is not specified by Xkb and neither is the
+.I pixel 
+value's interpretation. All other geometry data structures refer to colors using 
+their indices in this global list or pointers to colors in this list.
+.I XkbAddGeomColor 
+returns NULL if any of the parameters is empty or if it was not able to allocate 
+space for the color. To allocate space for an arbitrary number of colors to a 
+geometry, use the 
+.I XkbAllocGeomColors 
+function.
+.SH STRUCTURES
+.LP
+.nf
+
+    typedef struct _XkbColor {
+        unsigned int    pixel;      /\(** color */
+        char *          spec;       /\(** color name */
+    } XkbColorRec,*XkbColorPtr;
+    
+.fi
+.SH "SEE ALSO"
+.BR XkbAllocGeomColors (__libmansuffix__)
+
diff --git a/man/xkb/XkbAddGeomDoodad.man b/man/xkb/XkbAddGeomDoodad.man
new file mode 100644 (file)
index 0000000..b6519fd
--- /dev/null
@@ -0,0 +1,109 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbAddGeomDoodad __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAddGeomDoodad \- Add one doodad to a section of a keyboard geometry or to the 
+top-level geometry
+.SH SYNOPSIS
+.HP
+.B XkbDoodadPtr XkbAddGeomDoodad
+.BI "(\^XkbGeometryPtr " "geom" "\^,"
+.BI "XkbSectionPtr " "section" "\^,"
+.BI "Atom " "name" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- geom
+geometry to which the doodad is added
+.TP
+.I \- section
+section, if any, to which the doodad is added
+.TP
+.I \- name
+name of the new doodad 
+.SH DESCRIPTION
+.LP
+Xkb provides functions to add a single new element to the top-level keyboard 
+geometry. In each case the 
+.I num_ * 
+fields of the corresponding structure is incremented by 1. These functions do 
+not change 
+.I sz_* 
+unless there is no more room in the array. Some of these functions fill in the 
+values of the element's structure from the arguments. For other functions, you 
+must explicitly write code to fill the structure's elements.
+
+The top-level geometry description includes a list of 
+.I geometry properties. 
+A geometry property associates an arbitrary string with an equally arbitrary 
+name. Programs that display images of keyboards can use geometry properties as 
+hints, but they are not interpreted by Xkb. No other geometry structures refer 
+to geometry properties.
+
+A 
+.I doodad 
+describes some visible aspect of the keyboard that is not a key and is not a 
+section. 
+.I XkbAddGeomDoodad 
+adds a doodad with name specified by 
+.I name 
+to the geometry 
+.I geom 
+if 
+.I section 
+is NULL or to the section of the geometry specified by 
+.I section 
+if 
+.I section 
+is not NULL. 
+.I XkbAddGeomDoodad 
+returns NULL if any of the parameters is empty or if it was not able to allocate 
+space for the doodad. If there is already a doodad with the name 
+.I name 
+in the doodad array for the geometry (if 
+.I section 
+is NULL) or the section (if 
+.I section 
+is non-NULL), a pointer to that doodad is returned. To allocate space for an 
+arbitrary number of doodads to a section, use the 
+.I XkbAllocGeomSectionDoodads 
+function. To allocate space for an arbitrary number of doodads to a keyboard 
+geometry, use the 
+.I XkbAllocGeomDoodads 
+function.
+.SH STRUCTURES
+.LP
+.nf
+
+    typedef union _XkbDoodad {
+        XkbAnyDoodadRec            any;
+        XkbShapeDoodadRec          shape;
+        XkbTextDoodadRec           text;
+        XkbIndicatorDoodadRec      indicator;
+        XkbLogoDoodadRec           logo;
+    } XkbDoodadRec, *XkbDoodadPtr;
+    
+.fi
+.SH "SEE ALSO"
+.BR XkbAllocGeomDoodads (__libmansuffix__),
+.BR XkbAllocGeomSectionDoodads (__libmansuffix__)
diff --git a/man/xkb/XkbAddGeomKey.man b/man/xkb/XkbAddGeomKey.man
new file mode 100644 (file)
index 0000000..31fd1c3
--- /dev/null
@@ -0,0 +1,76 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbAddGeomKey __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAddGeomKey \- Add one key at the end of an existing row of keys
+.SH SYNOPSIS
+.HP
+.B XkbKeyPtr XkbAddGeomKey
+.BI "(\^XkbRowPtr " "row" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- row
+row to be updated
+.SH DESCRIPTION
+.LP
+Xkb provides functions to add a single new element to the top-level keyboard geometry. In each case 
+the 
+.I num_ * 
+fields of the corresponding structure is incremented by 1. These functions do not change 
+.I sz_* 
+unless there is no more room in the array. Some of these functions fill in the values of the 
+element's structure from the arguments. For other functions, you must explicitly write code to fill 
+the structure's elements.
+
+The top-level geometry description includes a list of 
+.I geometry properties. 
+A geometry property associates an arbitrary string with an equally arbitrary name. Programs that 
+display images of keyboards can use geometry properties as hints, but they are not interpreted by 
+Xkb. No other geometry structures refer to geometry properties.
+
+Keys are grouped into rows. 
+.I XkbAddGeomKey 
+adds one key to the end of the specified 
+.I row. 
+The key is allocated and zeroed. 
+.I XkbAddGeomKey 
+returns NULL if 
+.I row 
+is empty or if it was not able to allocate space for the key. To allocate space for an arbitrary 
+number of keys to a row, use 
+.I XkbAllocGeomKeys.
+.SH STRUCTURES
+.LP
+.nf
+
+    typedef struct _XkbKey {              /\(** key in a row */
+        XkbKeyNameRec   name;             /\(** key name */
+        short           gap;              /\(** gap in mm/10 from previous key in row */
+        unsigned char   shape_ndx;        /\(** index of shape for key */
+        unsigned char   color_ndx;        /\(** index of color for key body */
+    } XkbKeyRec, *XkbKeyPtr;
+    
+.fi
+.SH "SEE ALSO"
+.BR XkbAllocGeomKeys (__libmansuffix__)
diff --git a/man/xkb/XkbAddGeomKeyAlias.man b/man/xkb/XkbAddGeomKeyAlias.man
new file mode 100644 (file)
index 0000000..5a612c6
--- /dev/null
@@ -0,0 +1,85 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbAddGeomKeyAlias __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAddGeomKeyAlias \- Add one key alias to an existing keyboard geometry 
+description
+.SH SYNOPSIS
+.HP
+.B XkbKeyAliasPtr XkbAddGeomKeyAlias
+.BI "(\^XkbGeometryPtr " "geom" "\^,"
+.BI "char *" "alias" "\^,"
+.BI "char *" "real" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- geom
+geometry to be updated
+.TP
+.I \- alias
+alias to be added
+.TP
+.I \- real
+real name to be bound to the new alias
+.SH DESCRIPTION
+.LP
+Xkb provides functions to add a single new element to the top-level keyboard 
+geometry. In each case the 
+.I num_ * 
+fields of the corresponding structure is incremented by 1. These functions do 
+not change 
+.I sz_* 
+unless there is no more room in the array. Some of these functions fill in the 
+values of the element's structure from the arguments. For other functions, you 
+must explicitly write code to fill the structure's elements.
+
+The top-level geometry description includes a list of 
+.I geometry properties. 
+A geometry property associates an arbitrary string with an equally arbitrary 
+name. Programs that display images of keyboards can use geometry properties as 
+hints, but they are not interpreted by Xkb. No other geometry structures refer 
+to geometry properties.
+
+.I XkbAddGeomKeyAlias 
+adds one key alias with the value 
+.I alias 
+to the geometry 
+.I geom, 
+and associates it with the key whose real name is 
+.I real. XkbAddGeomKeyAlias 
+returns NULL if any of the parameters is empty or if it was not able to allocate 
+space for the alias. To allocate space for an arbitrary number of aliases, use 
+the 
+.I XkbAllocGeomKeyAliases 
+function.
+.SH STRUCTURES
+.LP
+.nf
+
+    typedef struct {
+        char            real[XkbKeyNameLength];   /\(** this key name must be in the keys array */
+        char            alias[XkbKeyNameLength];  /\(** symbolic key name as alias for the key */
+    } XkbKeyAliasRec,*XkbKeyAliasPtr;
+.fi
+.SH "SEE ALSO"
+.BR XkbAllocGeomKeyAliases (__libmansuffix__)
diff --git a/man/xkb/XkbAddGeomOutline.man b/man/xkb/XkbAddGeomOutline.man
new file mode 100644 (file)
index 0000000..fcb3b50
--- /dev/null
@@ -0,0 +1,82 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbAddGeomOutline __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAddGeomOutline \- Add one outline to an existing shape
+.SH SYNOPSIS
+.HP
+.B XkbOutlinePtr XkbAddGeomOutline
+.BI "(\^XkbShapePtr " "shape" "\^,"
+.BI "int " "sz_points" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- shape
+shape to be updated
+.TP
+.I \- sz_points
+number of points to be reserved
+.SH DESCRIPTION
+.LP
+Xkb provides functions to add a single new element to the top-level keyboard 
+geometry. In each case the 
+.I num_ * 
+fields of the corresponding structure is incremented by 1. These functions do 
+not change 
+.I sz_* 
+unless there is no more room in the array. Some of these functions fill in the 
+values of the element's structure from the arguments. For other functions, you 
+must explicitly write code to fill the structure's elements.
+
+The top-level geometry description includes a list of 
+.I geometry properties. 
+A geometry property associates an arbitrary string with an equally arbitrary 
+name. Programs that display images of keyboards can use geometry properties as 
+hints, but they are not interpreted by Xkb. No other geometry structures refer 
+to geometry properties.
+
+An outline consists of an arbitrary number of points. 
+.I XkbAddGeomOutline 
+adds an outline to the specified 
+.I shape 
+by reserving 
+.I sz_points 
+points for it. The new outline is allocated and zeroed. 
+.I XkbAddGeomOutline 
+returns NULL if any of the parameters is empty or if it was not able to allocate 
+space. To allocate space for an arbitrary number of outlines to a shape, use
+.I XkbAllocGeomOutlines.
+.SH STRUCTURES
+.LP
+.nf
+
+    typedef struct _XkbOutline {
+        unsigned short    num_points;      /\(** number of points in the outline */
+        unsigned short    sz_points;       /\(** size of the points array */
+        unsigned short    corner_radius;   /\(** draw corners as circles with this radius */
+        XkbPointPtr       points;          /\(** array of points defining the outline */
+    } XkbOutlineRec, *XkbOutlinePtr;
+    
+.fi
+.SH "SEE ALSO"
+.BR XkbAllocGeomOutlines (__libmansuffix__)
diff --git a/man/xkb/XkbAddGeomOverlay.man b/man/xkb/XkbAddGeomOverlay.man
new file mode 100644 (file)
index 0000000..1092bb0
--- /dev/null
@@ -0,0 +1,91 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbAddGeomOverlay __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAddGeomOverlay \- Add one overlay to a section
+.SH SYNOPSIS
+.HP
+.B XkbOverlayPtr XkbAddGeomOverlay
+.BI "(\^XkbSectionPtr " "section" "\^,"
+.BI "Atom " "name" "\^,"
+.BI "int " "sz_rows" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- section
+section to which an overlay will be added
+.TP
+.I \- name
+name of the overlay
+.TP
+.I \- sz_rows
+number of rows to reserve in the overlay
+.SH DESCRIPTION
+.LP
+Xkb provides functions to add a single new element to the top-level keyboard 
+geometry. In each case the 
+.I num_ * 
+fields of the corresponding structure is incremented by 1. These functions do 
+not change 
+.I sz_* 
+unless there is no more room in the array. Some of these functions fill in the 
+values of the element's structure from the arguments. For other functions, you 
+must explicitly write code to fill the structure's elements.
+
+The top-level geometry description includes a list of 
+.I geometry properties. 
+A geometry property associates an arbitrary string with an equally arbitrary 
+name. Programs that display images of keyboards can use geometry properties as 
+hints, but they are not interpreted by Xkb. No other geometry structures refer 
+to geometry properties.
+
+.I XkbAddGeomOverlay 
+adds an overlay with the specified name to the specified 
+.I section. 
+The new overlay is created with space allocated for 
+.I sz_rows 
+rows. If an overlay with name 
+.I name 
+already exists in the section, a pointer to the existing overlay is returned.
+.I XkbAddGeomOverlay 
+returns NULL if any of the parameters is empty or if it was not able to allocate 
+space for the overlay. To allocate space for an arbitrary number of overlays to 
+a section, use the 
+.I XkbAllocGeomOverlay 
+function.
+.SH STRUCTURES
+.LP
+.nf
+
+    typedef struct _XkbOverlayRec {
+        Atom                  name;            /\(** overlay name */
+        XkbSectionPtr         section_under;   /\(** the section under this overlay */
+        unsigned short        num_rows;        /\(** number of rows in the rows array */
+        unsigned short        sz_rows;         /\(** size of the rows array */
+        XkbOverlayRowPtr      rows;            /\(** array of rows in the overlay */
+        XkbBoundsPtr          bounds;          /\(** bounding box for the overlay */
+    } XkbOverlayRec,*XkbOverlayPtr;
+    
+.fi
+.SH "SEE ALSO"
+.BR XkbAllocGeomOverlay (__libmansuffix__)
diff --git a/man/xkb/XkbAddGeomOverlayKey.man b/man/xkb/XkbAddGeomOverlayKey.man
new file mode 100644 (file)
index 0000000..bf9813f
--- /dev/null
@@ -0,0 +1,81 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbAddGeomOverlayKey __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAddGeomOverlayKey \- Add a key to an existing overlay row
+.SH SYNOPSIS
+.HP
+.B XkbOverlayKeyPtr XkbAddGeomOverlayKey
+.BI "(\^XkbOverlayPtr " "overlay" "\^,"
+.BI "XkbRowPtr " "row" "\^,"
+.BI "char *" "under" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- overlay
+overlay to be updated
+.TP
+.I \- row
+row in overlay to be updated
+.TP
+.I \- under
+primary name of the key to be considered 
+.SH DESCRIPTION
+.LP
+Xkb provides functions to add a single new element to the top-level keyboard 
+geometry. In each case the 
+.I num_ * 
+fields of the corresponding structure is incremented by 1. These functions do 
+not change 
+.I sz_* 
+unless there is no more room in the array. Some of these functions fill in the 
+values of the element's structure from the arguments. For other functions, you 
+must explicitly write code to fill the structure's elements.
+
+The top-level geometry description includes a list of 
+.I geometry properties. 
+A geometry property associates an arbitrary string with an equally arbitrary 
+name. Programs that display images of keyboards can use geometry properties as 
+hints, but they are not interpreted by Xkb. No other geometry structures refer 
+to geometry properties.
+
+.I XkbAddGeomOverlayKey 
+adds one key to the 
+.I row 
+in the 
+.I overlay. 
+If there is no key named 
+.I under 
+in the row of the underlying section, 
+.I XkbAddGeomOverlayKey 
+returns NULL.
+.SH STRUCTURES
+.LP
+.nf
+
+    typedef struct _XkbOverlayKey {
+        XkbKeyNameRec           over;      /\(** name of this overlay key */
+        XkbKeyNameRec           under;     /\(** name of the key under this overlay key */
+    } XkbOverlayKeyRec,*XkbOverlayKeyPtr;
+.fi
+
diff --git a/man/xkb/XkbAddGeomOverlayRow.man b/man/xkb/XkbAddGeomOverlayRow.man
new file mode 100644 (file)
index 0000000..499224e
--- /dev/null
@@ -0,0 +1,86 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbAddGeomOverlayRow __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAddGeomOverlayRow \- Add a row to an existing overlay
+.SH SYNOPSIS
+.HP
+.B XkbOverlayRowPtr XkbAddGeomOverlayRow
+.BI "(\^XkbOverlayPtr " "overlay" "\^,"
+.BI "XkbRowPtr " "row_under" "\^,"
+.BI "int " "sz_keys" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- overlay
+overlay to be updated
+.TP
+.I \- row_under
+row to be overlayed in the section overlay overlays
+.TP
+.I \- sz_keys
+number of keys to reserve in the row
+.SH DESCRIPTION
+.LP
+Xkb provides functions to add a single new element to the top-level keyboard 
+geometry. In each case the 
+.I num_ * 
+fields of the corresponding structure is incremented by 1. These functions do 
+not change 
+.I sz_* 
+unless there is no more room in the array. Some of these functions fill in the 
+values of the element's structure from the arguments. For other functions, you 
+must explicitly write code to fill the structure's elements.
+
+The top-level geometry description includes a list of 
+.I geometry properties. 
+A geometry property associates an arbitrary string with an equally arbitrary 
+name. Programs that display images of keyboards can use geometry properties as 
+hints, but they are not interpreted by Xkb. No other geometry structures refer 
+to geometry properties.
+
+.I XkbAddGeomOverlayRow 
+adds one row to the 
+.I overlay. 
+The new row contains space for 
+.I sz_keys 
+keys. If 
+. I row_under 
+specifies a row that doesn't exist on the underlying section,
+.I  XkbAddGeomOverlayRow 
+returns NULL and doesn't change the overlay. 
+.I XkbAddGeomOverlayRow 
+returns NULL if any of the parameters is empty or if it was not able to allocate 
+space for the overlay.
+.SH STRUCTURES
+.LP
+.nf
+
+    typedef struct _XkbOverlayRow {
+        unsigned short      row_under;    /\(** index into the row under this overlay row */
+        unsigned short      num_keys;     /\(** number of keys in the keys array */
+        unsigned short      sz_keys;      /\(** size of the keys array */
+        XkbOverlayKeyPtr    keys;         /\(** array of keys in the overlay row */
+    } XkbOverlayRowRec,*XkbOverlayRowPtr;
+
+.fi
diff --git a/man/xkb/XkbAddGeomProperty.man b/man/xkb/XkbAddGeomProperty.man
new file mode 100644 (file)
index 0000000..bcc7375
--- /dev/null
@@ -0,0 +1,86 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbAddGeomProperty __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAddGeomProperty \- Add one property to an existing keyboard geometry 
+description
+.SH SYNOPSIS
+.HP
+.B XkbPropertyPtr XkbAddGeomProperty
+.BI "(\^XkbGeometryPtr " "geom" "\^,"
+.BI "char *" "name" "\^,"
+.BI "char *" "value" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- geom
+geometry to be updated
+.TP
+.I \- name
+name of the new property
+.TP
+.I \- value
+value for the new property
+.SH DESCRIPTION
+.LP
+Xkb provides functions to add a single new element to the top-level keyboard 
+geometry. In each case the 
+.I num_ * 
+fields of the corresponding structure is incremented by 1. These functions do 
+not change 
+.I sz_* 
+unless there is no more room in the array. Some of these functions fill in the 
+values of the element's structure from the arguments. For other functions, you 
+must explicitly write code to fill the structure's elements.
+
+The top-level geometry description includes a list of 
+.I geometry properties. 
+A geometry property associates an arbitrary string with an equally arbitrary 
+name. Programs that display images of keyboards can use geometry properties as 
+hints, but they are not interpreted by Xkb. No other geometry structures refer 
+to geometry properties.
+
+.I XkbAddGeomProperty 
+adds one property with the specified 
+.I name 
+and 
+.I value 
+to the keyboard geometry specified by 
+.I geom. XkbAddGeomProperty 
+returns NULL if any of the parameters is empty or if it was not able to allocate 
+space for the property. To allocate space for an arbitrary number of properties, 
+use the 
+.I XkbAllocGeomProps 
+function.
+.SH STRUCTURES
+.LP
+.nf
+
+    typedef struct _XkbProperty {
+        char *         name;       /\(** property name */
+        char *         value;      /\(** property value */
+    } XkbPropertyRec,*XkbPropertyPtr;
+
+.fi
+.SH "SEE ALSO"
+.BR XkbAllocGeomProps (__libmansuffix__)
diff --git a/man/xkb/XkbAddGeomRow.man b/man/xkb/XkbAddGeomRow.man
new file mode 100644 (file)
index 0000000..e400cb8
--- /dev/null
@@ -0,0 +1,76 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbAddGeomRow __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAddGeomRow \- Add a row to a section
+.SH SYNOPSIS
+.HP
+.B XkbRowPtr XkbAddGeomRow
+.BI "(\^XkbSectionPtr " "section" "\^,"
+.BI "int " "sz_keys" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- section
+section to be updated 
+.TP
+.I \- sz_keys
+number of keys to be reserved
+.SH DESCRIPTION
+.LP
+Xkb provides functions to add a single new element to the top-level keyboard geometry. In each case the 
+.I num_ * 
+fields of the corresponding structure is incremented by 1. These functions do not change 
+.I sz_* 
+unless there is no more room in the array. Some of these functions fill in the values of the element's structure from the arguments. For other functions, you must explicitly write code to fill the structure's elements.
+
+The top-level geometry description includes a list of 
+.I geometry properties. 
+A geometry property associates an arbitrary string with an equally arbitrary name. Programs that display images of keyboards can use geometry properties as hints, but they are not interpreted by Xkb. No other geometry structures refer to geometry properties.
+
+One of the components of a keyboard geometry section is one or more rows of keys. 
+.I XkbAddGeomRow 
+adds one row to the specified 
+.I section. 
+The newly created row contains space for the number of keys specified in
+.I sz_keys. 
+They are allocated and zeroed, but otherwise uninitialized. 
+.I XkbAddGeomRow 
+returns NULL if any of the parameters is empty or if it was not able to allocate space for the row. To allocate space for an arbitrary number of rows to a section, use the 
+.I XkbAllocGeomRows 
+function.
+.SH STRUCTURES
+.LP
+.nf
+typedef struct _XkbRow {
+        short           top;
+        short           left;
+        unsigned short  num_keys;
+        unsigned short  sz_keys;
+        int             vertical;
+        XkbKeyPtr       keys;
+        XkbBoundsRec    bounds;
+} XkbRowRec, *XkbRowPtr;         
+.fi
+.SH "SEE ALSO"
+.BR XkbAllocGeomRows (__libmansuffix__)
diff --git a/man/xkb/XkbAddGeomSection.man b/man/xkb/XkbAddGeomSection.man
new file mode 100644 (file)
index 0000000..5f0fac4
--- /dev/null
@@ -0,0 +1,119 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbAddGeomSection __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAddGeomSection \- Add one section to an existing keyboard geometry
+.SH SYNOPSIS
+.HP
+.B XkbSectionPtr XkbAddGeomSection
+.BI "(\^XkbGeometryPtr " "geom" "\^,"
+.BI "Atom " "name" "\^,"
+.BI "int " "sz_rows" "\^,"
+.BI "int " "sz_doodads" "\^,"
+.BI "int " "sz_overlays" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- geom
+geometry to be updated
+.TP
+.I \- name
+name of the new section
+.TP
+.I \- sz_rows
+number of rows to reserve in the section
+.TP
+.I \- sz_doodads
+number of doodads to reserve in the section
+.TP
+.I \- sz_overlays
+number of overlays to reserve in the section
+.SH DESCRIPTION
+.LP
+Xkb provides functions to add a single new element to the top-level keyboard 
+geometry. In each case the 
+.I num_ * 
+fields of the corresponding structure is incremented by 1. These functions do 
+not change 
+.I sz_* 
+unless there is no more room in the array. Some of these functions fill in the 
+values of the element's structure from the arguments. For other functions, you 
+must explicitly write code to fill the structure's elements.
+
+The top-level geometry description includes a list of 
+.I geometry properties. 
+A geometry property associates an arbitrary string with an equally arbitrary 
+name. Programs that display images of keyboards can use geometry properties as 
+hints, but they are not interpreted by Xkb. No other geometry structures refer 
+to geometry properties.
+
+A keyboard geometry contains an arbitrary number of sections. 
+.I XkbAddGeomSection 
+adds one section to an existing keyboard geometry 
+.I geom. 
+The new section contains space for the number of rows, doodads, and overlays 
+specified by 
+.I sz_rows, sz_doodads, 
+and 
+.I sz_overlays. 
+The new section is allocated and zeroed and given the name specified by 
+.I name. 
+If a section with name 
+.I name 
+already exists in the geometry, a pointer to the existing section is returned.
+.I XkbAddGeomSection 
+returns NULL if any of the parameters is empty or if it was not able to allocate 
+space for the section. To allocate space for an arbitrary number of sections to 
+a geometry, use 
+.I XkbAllocGeomSections.
+.SH STRUCTURES
+.LP
+.nf
+
+typedef struct _XkbSection {
+    Atom                    name;        /\(** section name */
+    unsigned char           priority;    /\(** drawing priority, 0=>highest, 255=>lowest */
+    short                   top;         /\(** top coordinate of section origin */
+    short                   left;        /\(** left coordinate of row origin */
+    unsigned short          width;       /\(** section width, in mm/10 */
+    unsigned short          height;      /\(** section height, in mm/10 */
+    short                   angle;       /\(** angle of section rotation, counterclockwise */
+    unsigned short          num_rows;    /\(** number of rows in the rows array */
+    unsigned short          num_doodads; /\(** number of doodads in the doodads array */
+    unsigned short          num_overlays; /\(** number of overlays in the overlays array */
+    unsigned short          sz_rows;      /\(** size of the rows array */
+    unsigned short          sz_doodads;   /\(** size of the doodads array */
+    unsigned short          sz_overlays;  /\(** size of the overlays array */
+    XkbRowPtr               rows;         /\(** section rows array */
+    XkbDoodadPtr            doodads;      /\(** section doodads array */
+    XkbBoundsRec            bounds;       /\(** bounding box for the section, before rotation*/
+    XkbOverlayPtr           overlays;     /\(** section overlays array */
+} XkbSectionRec, *XkbSectionPtr;
+
+.fi
+.I top 
+and 
+.I left 
+are the origin of the section, relative to the origin of the keyboard, in mm/10. angle is in 1/10 degrees.
+.SH "SEE ALSO"
+.BR XkbAllocGeomSections (__libmansuffix__)
diff --git a/man/xkb/XkbAddGeomShape.man b/man/xkb/XkbAddGeomShape.man
new file mode 100644 (file)
index 0000000..1159081
--- /dev/null
@@ -0,0 +1,89 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbAddGeomShape __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAddGeomShape \- Add a shape to a keyboard geometry
+.SH SYNOPSIS
+.HP
+.B XkbShapePtr XkbAddGeomShape
+.BI "(\^XkbGeometryPtr " "geom" "\^,"
+.BI "Atom " "name" "\^,"
+.BI "int " "sz_outlines" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- geom
+geometry to be updated
+.TP
+.I \- name
+name of the new shape
+.TP
+.I \- sz_outlines
+number of outlines to be reserved
+.SH DESCRIPTION
+.LP
+Xkb provides functions to add a single new element to the top-level keyboard geometry. In each case the 
+.I num_ * 
+fields of the corresponding structure is incremented by 1. These functions do not change 
+.I sz_* 
+unless there is no more room in the array. Some of these functions fill in the values of the element's structure from the 
+arguments. For other functions, you must explicitly write code to fill the structure's elements.
+
+The top-level geometry description includes a list of 
+.I geometry properties. 
+A geometry property associates an arbitrary string with an equally arbitrary name. Programs that display images of 
+keyboards can use geometry properties as hints, but they are not interpreted by Xkb. No other geometry structures refer to 
+geometry properties.
+
+A geometry contains an arbitrary number of shapes, each of which is made up of an arbitrary number of outlines.
+.I XkbAddGeomShape 
+adds a shape to a geometry 
+.I geom 
+by allocating space for 
+.I sz_outlines 
+outlines for it and giving it the name specified by 
+.I name. 
+If a shape with name 
+.I name 
+already exists in the geometry, a pointer to the existing shape is returned. 
+.I XkbAddGeomShape 
+returns NULL if any of the parameters is empty or if it was not able to allocate space. To allocate space for an arbitrary 
+number of geometry shapes, use 
+.I XkbAllocGeomShapes.
+.SH STRUCTURES
+.LP
+.nf
+
+    typedef struct _XkbShape {
+        Atom              name;           /\(** shape's name */
+        unsigned short    num_outlines;   /\(** number of outlines for the shape */
+        unsigned short    sz_outlines;    /\(** size of the outlines array */
+        XkbOutlinePtr     outlines;       /\(** array of outlines for the shape */
+        XkbOutlinePtr     approx;         /\(** pointer into the array to the approximating outline */
+        XkbOutlinePtr     primary;        /\(** pointer into the array to the primary outline */
+        XkbBoundsRec      bounds;         /\(** bounding box for the shape; encompasses all outlines */
+    } XkbShapeRec, *XkbShapePtr;
+    
+.fi
+.SH "SEE ALSO"
+.BR XkbAllocGeomShapes (__libmansuffix__)
diff --git a/man/xkb/XkbAddSymInterpret.man b/man/xkb/XkbAddSymInterpret.man
new file mode 100644 (file)
index 0000000..0171602
--- /dev/null
@@ -0,0 +1,65 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbAddSymInterpret __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAddSymInterpret \- Add a symbol interpretation to the list of symbol 
+interpretations in an XkbCompatRec
+.SH SYNOPSIS
+.HP
+.B XkbSymInterpretPtr XkbAddSymInterpret
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "XkbSymInterpretPtr " "si" "\^,"
+.BI "Bool " "updateMap" "\^,"
+.BI "XkbChangesPtr " "changes" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+keyboard description to be updated 
+.TP
+.I \- si
+symbol interpretation to be added
+.TP
+.I \- updateMap
+True=>apply compatibility map to keys
+.TP
+.I \- changes
+changes are put here 
+.SH DESCRIPTION
+.LP
+.I XkbAddSymInterpret 
+adds 
+.I si 
+to the list of symbol interpretations in 
+.I xkb. 
+If 
+.I updateMap 
+is True, it (re)applies the compatibility map to all of the keys on the 
+keyboard. If 
+.I changes 
+is non-NULL, it reports the parts of the keyboard that were affected (unless
+.I updateMap 
+is True, not much changes). 
+.I XkbAddSymInterpret 
+returns a pointer to the actual new symbol interpretation in the list or NULL if 
+it failed.
diff --git a/man/xkb/XkbAllocClientMap.man b/man/xkb/XkbAllocClientMap.man
new file mode 100644 (file)
index 0000000..1e2a194
--- /dev/null
@@ -0,0 +1,164 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbAllocClientMap __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAllocClientMap \- Allocate and initialize an empty client map description 
+record
+.SH SYNOPSIS
+.HP
+.B Status XkbAllocClientMap
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "unsigned int " "which" "\^,"
+.BI "unsigned int " "type_count" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+keyboard description in which to allocate client map
+.TP
+.I \- which
+mask selecting map components to allocate
+.TP
+.I \- type_count
+value of num_types field in map to be allocated 
+.SH DESCRIPTION
+.LP
+Calling 
+.I XkbGetMap 
+should be sufficient for most applications to get client and server maps. As a 
+result, most applications do not need to directly allocate client and server 
+maps.
+
+If you change the number of key types or construct map components without 
+loading the necessary components from the X server, do not allocate any map 
+components directly using 
+.I malloc 
+or 
+.I Xmalloc. 
+Instead, use the Xkb allocators, 
+.I XkbAllocClientMap, 
+and 
+.I XkbAllocServerMap.
+
+Similarly, use the Xkb destructors, 
+.I XkbFreeClientMap, 
+and 
+.I XkbFreeServerMap 
+instead of 
+.I free 
+or 
+.I Xfree.
+
+.I XkbAllocClientMap 
+allocates and initializes an empty client map in the 
+.I map 
+field of the keyboard description specified by 
+.I xkb. 
+The 
+.I which 
+parameter specifies the particular components of the client map structure to 
+allocate and is a mask composed by a bitwise inclusive OR of one or more of the 
+masks shown in Table 1.
+.bp
+.TS
+c s
+l l
+l lw(4i).
+Table 1 XkbAllocClientMap Masks
+_
+Mask   Effect
+_
+XkbKeyTypesMask        T{
+The type_count field specifies the number of entries to preallocate for the 
+types field of the client map. If the type_count field is less than 
+XkbNumRequiredTypes returns BadValue.
+T}
+.sp
+XkbKeySymsMask T{
+The min_key_code and max_key_code fields of the xkb parameter are used to 
+allocate the syms and key_sym_map fields of the client map. The fields are 
+allocated to contain the maximum number of entries necessary for max_key_code - 
+min_key_code + 1 keys.
+T}
+.sp
+XkbModifierMapMask     T{
+The min_key_code and max_key_code fields of the xkb parameter are used to 
+allocate the modmap field of the client map. The field is allocated to contain 
+the maximum number of entries necessary for max_key_code - min_key_code + 1 
+keys.
+T}
+.TE
+
+NOTE: The 
+.I min_key_code 
+and 
+.I max_key_code 
+fields of the 
+.I xkb 
+parameter must be legal values if the XkbKeySymsMask or XkbModifierMapMask masks 
+are set in the 
+.I which 
+parameter. If they are not valid, 
+.I XkbAllocClientMap 
+returns BadValue. 
+
+If the client map of the keyboard description is not NULL, and any fields are 
+already allocated in the client map, 
+.I XkbAllocClientMap 
+does not overwrite the existing values; it simply ignores that part of the 
+request. The only exception is the 
+.I types 
+array. If 
+.I type_count 
+is greater than the current 
+.I num_types 
+field of the client map, 
+.I XkbAllocClientMap 
+resizes the 
+.I types 
+array and resets the 
+.I num_types 
+field accordingly.
+
+If 
+.I XkbAllocClientMap 
+is successful, it returns Success. Otherwise, it can return either BadMatch, 
+BadAlloc, or BadValue errors.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadMatch
+A compatible version of Xkb was not available in the server or an argument has 
+correct type and range, but is otherwise invalid
+.TP 15
+.B BadValue
+An argument is out of range
+.SH "SEE ALSO"
+.BR XkbAllocClientMap (__libmansuffix__),
+.BR XkbAllocServerMap (__libmansuffix__),
+.BR XkbFreeClientMap, (__libmansuffix__),
+.BR XkbFreeServerMap (__libmansuffix__),
+.BR XkbGetMap (__libmansuffix__)
diff --git a/man/xkb/XkbAllocCompatMap.man b/man/xkb/XkbAllocCompatMap.man
new file mode 100644 (file)
index 0000000..e20d208
--- /dev/null
@@ -0,0 +1,108 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbAllocCompatMap __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAllocCompatMap \- Allocate a new compatibility map if you do not already have one available
+.SH SYNOPSIS
+.HP
+.B Status XkbAllocCompatMap
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "unsigned int " "which" "\^,"
+.BI "unsigned int " "num_si" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+keyboard description in which to allocate compat map
+.TP
+.I \- which
+mask of compatibility map components to allocate
+.TP
+.I \- num_si
+number of symbol interpretations to allocate
+.SH DESCRIPTION
+.LP
+.I xkb 
+specifies the keyboard description for which compatibility maps are to be allocated. The compatibility map is the 
+.I compat 
+field in this structure.
+
+.I which 
+specifies the compatibility map components to be allocated (see XkbGetCompatMap). 
+.I which 
+is an inclusive OR of the bits shown in Table 1.
+
+.TS
+c s s
+l l l.
+Table 1 Compatibility Map Component Masks
+_
+Mask   Value   Affecting
+_
+XkbSymInterpMask       (1<<0)  Symbol interpretations
+XkbGroupCompatMask     (1<<1)  Group maps
+XkbAllCompatMask       (0x3)   All compatibility map components
+.TE
+
+.I num_si 
+specifies the total number of entries to allocate in the symbol interpretation vector
+.I (xkb.compat.sym_interpret).
+
+.I XkbAllocCompatMap 
+returns Success if successful, BadMatch if 
+.I xkb 
+is NULL, or BadAlloc if errors are encountered when attempting to allocate storage.
+.SH STRUCTURES
+.LP
+.nf
+
+    typedef struct {
+        KeySym            sym;          /\(** keysym of interest or NULL */
+        unsigned char     flags;        /\(** XkbSI_AutoRepeat, XkbSI_LockingKey */
+        unsigned char     match;        /\(** specifies how mods is interpreted */
+        unsigned char     mods;         /\(** modifier bits, correspond to eight real modifiers */
+        unsigned char     virtual_mod;  /\(** 1 modifier to add to key virtual mod map */
+        XkbAnyAction      act;          /\(** action to bind to symbol position on key */
+    } XkbSymInterpretRec,*XkbSymInterpretPtr;
+    
+.fi
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadMatch
+A compatible version of Xkb was not available in the server or an argument has correct type and range, but is otherwise invalid
+.SH "SEE ALSO"
+.BR XkbGetCompatMap (__libmansuffix__)
+.SH NOTES
+.LP
+Note that symbol interpretations in a compatibility map (the 
+.I sym_interpret 
+vector of XkbSymInterpretRec structures) are also allocated using this same function. To ensure that there is sufficient space in the symbol interpretation vector for entries to be added, use
+.I XkbAllocCompatMap 
+specifying 
+.I which 
+as XkbSymInterpretMask and the number of free symbol interpretations needed in 
+.I num_si.
diff --git a/man/xkb/XkbAllocControls.man b/man/xkb/XkbAllocControls.man
new file mode 100644 (file)
index 0000000..9e9b355
--- /dev/null
@@ -0,0 +1,138 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbAllocControls __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAllocControls \- Allocates an XkbControlsRec structure in the XkbDescRec
+.SH SYNOPSIS
+.HP
+.B Status XkbAllocControls
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "unsigned int " "which" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+Xkb description in which to allocate ctrls rec
+.TP
+.I \- which
+mask of components of ctrls to allocate
+.SH DESCRIPTION
+.LP
+The need to allocate an XkbControlsRec structure seldom arises; Xkb creates one 
+when an application calls 
+.I XkbGetControls 
+or a related function. For those situations where there is not an XkbControlsRec 
+structure allocated in the XkbDescRec, allocate one by calling 
+.I XkbAllocControls.
+
+.I XkbAllocControls 
+allocates the 
+.I ctrls 
+field of the 
+.I xkb 
+parameter, initializes all fields to zero, and returns Success. If the 
+.I ctrls 
+field is not NULL, 
+.I XkbAllocControls 
+simply returns Success. If 
+.I xkb 
+is NULL, 
+.I XkbAllocControls 
+reports a BadMatch error. If the 
+.I ctrls 
+field could not be allocated, it reports a BadAlloc error.
+
+The 
+.I which 
+mask specifies the individual fields of the 
+.I ctrls 
+structure to be allocated and can contain any of the valid masks defined in 
+Table 1. 
+(SHOULD THIS COMMENT BE LEFT IN????)
+Because none of the currently existing controls have any structures associated 
+with them, which is currently of little practical value in this call.
+
+Table 1 shows the actual values for the individual mask bits used to select 
+controls for 
+modification and to enable and disable the control. Note that the same mask bit 
+is used to 
+specify general modifications to the parameters used to configure the control 
+(which), and to 
+enable and disable the control (enabled_ctrls). The anomalies in the table (no 
+"ok" in column) 
+are for controls that have no configurable attributes; and for controls that are 
+not boolean 
+controls and therefore cannot be enabled or disabled.
+
+.TS
+c s s s
+l l l l
+l l l l
+l l l l. 
+Table 1 Controls Mask Bits
+_
+Mask Bit       which or        enabled Value
+       changed_ctrls   _ctrls
+_
+XkbRepeatKeysMask      ok      ok      (1L<<0)
+XkbSlowKeysMask        ok      ok      (1L<<1)
+XkbBounceKeysMask      ok      ok      (1L<<2)
+XkbStickyKeysMask      ok      ok      (1L<<3)
+XkbMouseKeysMask       ok      ok      (1L<<4)
+XkbMouseKeysAccelMask  ok      ok      (1L<<5)
+XkbAccessXKeysMask     ok      ok      (1L<<6)
+XkbAccessXTimeoutMask  ok      ok      (1L<<7)
+XkbAccessXFeedbackMask ok      ok      (1L<<8)
+XkbAudibleBellMask             ok      (1L<<9)
+XkbOverlay1Mask                ok      (1L<<10)
+XkbOverlay2Mask                ok      (1L<<11)
+XkbIgnoreGroupLockMask         ok      (1L<<12)
+XkbGroupsWrapMask      ok              (1L<<27)
+XkbInternalModsMask    ok              (1L<<28)
+XkbIgnoreLockModsMask  ok              (1L<<29)
+XkbPerKeyRepeatMask    ok              (1L<<30)
+XkbControlsEnabledMask ok              (1L<<31)
+XkbAccessXOptionsMask  ok      ok      (XkbStickyKeysMask | 
+                       XkbAccessXFeedbackMask)
+XkbAllBooleanCtrlsMask         ok      (0x00001FFF) 
+XkbAllControlsMask     ok              (0xF8001FFF)
+.TE
+.nh
+.SH "RETURN VALUES"
+.TP 15
+SUCCESS
+allocates the ctrls field of the xkb parameter, initializes all fields to zero
+.sp
+.in 20
+the ctrls field is not NULL
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadMatch
+A compatible version of Xkb was not available in the server or an argument has 
+correct type and range, but is otherwise invalid
+.SH "SEE ALSO"
+.BR XkbGetControls (__libmansuffix__)
diff --git a/man/xkb/XkbAllocDeviceInfo.man b/man/xkb/XkbAllocDeviceInfo.man
new file mode 100644 (file)
index 0000000..a4cb2a6
--- /dev/null
@@ -0,0 +1,100 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbAllocDeviceInfo __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAllocDeviceInfo \- Obtain an XkbDeviceInfoRec structure
+.SH SYNOPSIS
+.HP
+.B XkbDeviceInfoPtr XkbAllocDeviceInfo
+.BI "(\^unsigned int " "device_spec" "\^,"
+.BI "unsigned int " "n_buttons" "\^,"
+.BI "unsigned int " "sz_leds" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- device_spec
+device ID with which structure will be used
+.TP
+.I \- n_buttons
+number of button actions to allocate space for
+.TP
+.I \- sz_leds
+number of LED feedbacks to allocate space for
+.SH DESCRIPTION
+.LP
+.I XkbAllocDeviceInfo 
+allocates space for an XkbDeviceInfoRec structure and initializes that structure's 
+.I device_spec 
+field with the device ID specified by 
+.I device_spec. 
+If 
+.I n_buttons 
+is nonzero, 
+.I n_buttons 
+XkbActions are linked into the XkbDeviceInfoRec structure and initialized to zero. If 
+.I sz_leds 
+is nonzero, 
+.I sz_leds 
+XkbDeviceLedInfoRec structures are also allocated and linked into the XkbDeviceInfoRec structure. If 
+you request XkbDeviceLedInfoRec structures be allocated using this request, you must initialize them 
+explicitly.
+
+To obtain an XkbDeviceLedInfoRec structure, use 
+.I XkbAllocDeviceLedInfo.
+.SH STRUCTURES
+.LP
+Information about X Input Extension devices is transferred between a client program and the Xkb 
+extension in an XkbDeviceInfoRec structure:
+.nf
+
+    typedef struct {
+        char *               name;          /\(** name for device */
+        Atom                 type;          /\(** name for class of devices */
+        unsigned short       device_spec;   /\(** device of interest */
+        Bool                 has_own_state; /\(** True=>this device has its own state */
+        unsigned short       supported;     /\(** bits indicating supported capabilities */
+        unsigned short       unsupported;   /\(** bits indicating unsupported capabilities */
+        unsigned short       num_btns;      /\(** number of entries in btn_acts */
+        XkbAction *          btn_acts;      /\(** button actions */
+        unsigned short       sz_leds;       /\(** total number of entries in LEDs vector */
+        unsigned short       num_leds;      /\(** number of valid entries in LEDs vector */
+        unsigned short       dflt_kbd_fb;   /\(** input extension ID of default (core kbd) indicator */
+        unsigned short       dflt_led_fb;   /\(** input extension ID of default indicator feedback */
+        XkbDeviceLedInfoPtr  leds;          /\(** LED descriptions */
+    } XkbDeviceInfoRec, *XkbDeviceInfoPtr;
+    
+
+    typedef struct {
+        unsigned short      led_class;        /\(** class for this LED device*/
+        unsigned short      led_id;           /\(** ID for this LED device */
+        unsigned int        phys_indicators;  /\(** bits for which LEDs physically present */
+        unsigned int        maps_present;     /\(** bits for which LEDs have maps in maps */
+        unsigned int        names_present;    /\(** bits for which LEDs are in names */
+        unsigned int        state;            /\(** 1 bit => corresponding LED is on */
+        Atom                names[XkbNumIndicators];   /\(** names for LEDs */
+        XkbIndicatorMapRec  maps;             /\(** indicator maps for each LED */
+    } XkbDeviceLedInfoRec, *XkbDeviceLedInfoPtr;
+.fi    
+.SH "SEE ALSO"
+.BR XkbAllocDeviceLedInfo (__libmansuffix__)
diff --git a/man/xkb/XkbAllocDeviceLedInfo.man b/man/xkb/XkbAllocDeviceLedInfo.man
new file mode 100644 (file)
index 0000000..76428e5
--- /dev/null
@@ -0,0 +1,113 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbAllocDeviceLedInfo __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAllocDeviceLedInfo \- Obtain an XkbDeviceLedInfoRec structure
+.SH SYNOPSIS
+.HP
+.B Status XkbAllocDeviceLedInfo
+.BI "(\^XkbDeviceInfoPtr " "device_info" "\^,"
+.BI "int " "num_needed" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- device_info
+structure in which to allocate LED space
+.TP
+.I \- num_needed
+number of indicators to allocate space for
+.SH DESCRIPTION
+.LP
+.I XkbAllocDeviceLedInfo 
+allocates space for an XkbDeviceLedInfoRec and places it in
+.I device_info. 
+If 
+.I num_needed 
+is nonzero, 
+.I num_needed 
+XkbIndicatorMapRec structures are also allocated and linked into the XkbDeviceLedInfoRec structure. If you request XkbIndicatorMapRec structures be allocated using this request, you must initialize them explicitly. All other fields are initialized to zero.
+
+To initialize an XkbDeviceLedInfoRec structure, use 
+.I XkbAddDeviceLedInfo.
+.SH STRUCTURES
+.LP
+Information about X Input Extension devices is transferred between a client program and the Xkb 
+extension in an XkbDeviceInfoRec structure:
+.nf
+
+    typedef struct {
+        char *               name;          /\(** name for device */
+        Atom                 type;          /\(** name for class of devices */
+        unsigned short       device_spec;   /\(** device of interest */
+        Bool                 has_own_state; /\(** True=>this device has its own state */
+        unsigned short       supported;     /\(** bits indicating supported capabilities */
+        unsigned short       unsupported;   /\(** bits indicating unsupported capabilities */
+        unsigned short       num_btns;      /\(** number of entries in btn_acts */
+        XkbAction *          btn_acts;      /\(** button actions */
+        unsigned short       sz_leds;       /\(** total number of entries in LEDs vector */
+        unsigned short       num_leds;      /\(** number of valid entries in LEDs vector */
+        unsigned short       dflt_kbd_fb;   /\(** input extension ID of default (core kbd) indicator */
+        unsigned short       dflt_led_fb;   /\(** input extension ID of default indicator feedback */
+        XkbDeviceLedInfoPtr  leds;          /\(** LED descriptions */
+    } XkbDeviceInfoRec, *XkbDeviceInfoPtr;
+    
+
+    typedef struct {
+        unsigned short      led_class;        /\(** class for this LED device*/
+        unsigned short      led_id;           /\(** ID for this LED device */
+        unsigned int        phys_indicators;  /\(** bits for which LEDs physically present */
+        unsigned int        maps_present;     /\(** bits for which LEDs have maps in maps */
+        unsigned int        names_present;    /\(** bits for which LEDs are in names */
+        unsigned int        state;            /\(** 1 bit => corresponding LED is on */
+        Atom                names[XkbNumIndicators];   /\(** names for LEDs */
+        XkbIndicatorMapRec  maps;             /\(** indicator maps for each LED */
+    } XkbDeviceLedInfoRec, *XkbDeviceLedInfoPtr;
+
+.fi    
+Each indicator has its own set of attributes that specify whether clients can explicitly set its state and whether it tracks the keyboard state. The attributes of each indicator are held in the maps array, which is an array of XkbIndicatorRec structures:
+.nf
+
+    typedef struct {
+        unsigned char   flags;            /\(** how the indicator can be changed */
+        unsigned char   which_groups;     /\(** match criteria for groups */
+        unsigned char   groups;           /\(** which keyboard groups the indicator watches */
+        unsigned char   which_mods;       /\(** match criteria for modifiers */
+        XkbModsRec      mods;             /\(** which modifiers the indicator watches */
+        unsigned int    ctrls;            /\(** which controls the indicator watches */
+    } XkbIndicatorMapRec, *XkbIndicatorMapPtr;
+    
+.fi    
+This indicator map specifies for each indicator:
+
+.IP \(bu 5
+The conditions under which the keyboard modifier state affects the indicator
+.IP \(bu 5
+The conditions under which the keyboard group state affects the indicator
+.IP \(bu 5
+The conditions under which the state of the boolean controls affects the indicator
+.IP \(bu 5
+The effect (if any) of attempts to explicitly change the state of the indicator using the functions XkbSetControls or XChangeKeyboardControl    
+.SH "SEE ALSO"
+.BR XkbAddDeviceLedInfo (__libmansuffix__),
+.BR XkbSetControls (__libmansuffix__)
diff --git a/man/xkb/XkbAllocGeomColors.man b/man/xkb/XkbAllocGeomColors.man
new file mode 100644 (file)
index 0000000..f3224e1
--- /dev/null
@@ -0,0 +1,70 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbAllocGeomColors __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAllocGeomColors \- Allocate geometry colors
+.SH SYNOPSIS
+.HP
+.B Status XkbAllocGeomColors
+.BI "(\^XkbGeometryPtr " "geom" "\^,"
+.BI "int " "num_needed" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- geom
+geometry for which colors should be allocated
+.TP
+.I \- num_needed
+number of new colors required
+.SH DESCRIPTION
+.LP
+Xkb provides a number of functions to allocate and free subcomponents of a 
+keyboard geometry. Use these functions to create or modify keyboard geometries. 
+Note that these functions merely allocate space for the new element(s), and it 
+is up to you to fill in the values explicitly in your code. These allocation 
+functions increase 
+.I sz_* 
+but never touch 
+.I num_* 
+(unless there is an allocation failure, in which case they reset both 
+.I sz_* 
+and 
+.I num_* 
+to zero). These functions return Success if they succeed, BadAlloc if they are 
+not able to allocate space, or BadValue if a parameter is not as expected.
+
+.I XkbAllocGeomColors 
+allocates space for 
+.I num_needed 
+colors and adds them to the specified geometry 
+.I geom. 
+A color name is a string whose interpretation is not specified by Xkb. All other 
+geometry data structures refer to colors using their indices in this global list 
+or pointers to colors in this list.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbAllocGeomDoodads.man b/man/xkb/XkbAllocGeomDoodads.man
new file mode 100644 (file)
index 0000000..882aaf2
--- /dev/null
@@ -0,0 +1,69 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbAllocGeomDoodads __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAllocGeomDoodads \- Allocate doodads that are global to a keyboard geometry
+.SH SYNOPSIS
+.HP
+.B Status XkbAllocGeomDoodads
+.BI "(\^XkbGeometryPtr " "geom" "\^,"
+.BI "int " "num_needed" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- geom
+geometry for which doodads should be allocated
+.TP
+.I \- num_needed
+number of new doodads required
+.SH DESCRIPTION
+.LP
+Xkb provides a number of functions to allocate and free subcomponents of a 
+keyboard geometry. Use these functions to create or modify keyboard geometries. 
+Note that these functions merely allocate space for the new element(s), and it 
+is up to you to fill in the values explicitly in your code. These allocation 
+functions increase 
+.I sz_* 
+but never touch 
+.I num_* 
+(unless there is an allocation failure, in which case they reset both 
+.I sz_* 
+and 
+.I num_* 
+to zero). These functions return Success if they succeed, BadAlloc if they are 
+not able to allocate space, or BadValue if a parameter is not as expected.
+
+.I XkbAllocGeomDoodads 
+allocates 
+.I num_needed 
+doodads and adds them to the specified geometry 
+.I geom. 
+No initialization of the doodads is done.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbAllocGeomKeyAliases.man b/man/xkb/XkbAllocGeomKeyAliases.man
new file mode 100644 (file)
index 0000000..9daa767
--- /dev/null
@@ -0,0 +1,74 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbAllocGeomKeyAliases __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAllocGeomKeyAliases \- Allocate geometry key aliases
+.SH SYNOPSIS
+.HP
+.B Status XkbAllocGeomKeyAliases
+.BI "(\^XkbGeometryPtr " "geom" "\^,"
+.BI "int " "num_needed" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- geom
+geometry for which key aliases should be allocated
+.TP
+.I \- num_needed
+number of new key aliases required
+.SH DESCRIPTION
+.LP
+Xkb provides a number of functions to allocate and free subcomponents of a 
+keyboard geometry. Use these functions to create or modify keyboard geometries. 
+Note that these functions merely allocate space for the new element(s), and it 
+is up to you to fill in the values explicitly in your code. These allocation 
+functions increase 
+.I sz_* 
+but never touch 
+.I num_* 
+(unless there is an allocation failure, in which case they reset both 
+.I sz_* 
+and 
+.I num_* 
+to zero). These functions return Success if they succeed, BadAlloc if they are 
+not able to allocate space, or BadValue if a parameter is not as expected.
+
+.I XkbAllocGeomKeyAliases 
+allocates space for 
+.I num_needed 
+key aliases and adds them to the specified geometry 
+.I geom. 
+A key alias is a pair of strings that associates an alternate name for a key 
+with the real name for that key.
+
+To free geometry key aliases, use 
+.I XkbFreeGeomKeyAliases.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
+.SH "SEE ALSO"
+.BR XkbFreeGeomKeyAliases (__libmansuffix__)
diff --git a/man/xkb/XkbAllocGeomKeys.man b/man/xkb/XkbAllocGeomKeys.man
new file mode 100644 (file)
index 0000000..cfa979d
--- /dev/null
@@ -0,0 +1,68 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbAllocGeomKeys __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAllocGeomKeys \- Allocate space for an arbitrary number of keys to a row
+.SH SYNOPSIS
+.HP
+.B Status XkbAllocGeomKeys
+.BI "(\^XkbRowPtr " "row" "\^,"
+.BI "int " "num_needed" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- row
+row to which keys should be allocated
+.TP
+.I \- num_needed
+number of new keys required 
+.SH DESCRIPTION
+.LP
+Xkb provides a number of functions to allocate and free subcomponents of a 
+keyboard geometry. Use these functions to create or modify keyboard geometries. 
+Note that these functions merely allocate space for the new element(s), and it 
+is up to you to fill in the values explicitly in your code. These allocation 
+functions increase 
+.I sz_* 
+but never touch 
+.I num_* 
+(unless there is an allocation failure, in which case they reset both 
+.I sz_* 
+and 
+.I num_* 
+to zero). These functions return Success if they succeed, BadAlloc if they are 
+not able to allocate space, or BadValue if a parameter is not as expected.
+
+.I XkbAllocGeomKeys 
+allocates 
+.I num_needed 
+keys and adds them to the 
+.I row. 
+No initialization of the keys is done.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbAllocGeomOutlines.man b/man/xkb/XkbAllocGeomOutlines.man
new file mode 100644 (file)
index 0000000..5a191bb
--- /dev/null
@@ -0,0 +1,74 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbAllocGeomOutlines __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAllocGeomOutlines \- Allocate space for an arbitrary number of outlines to a 
+shape
+.SH SYNOPSIS
+.HP
+.B Status XkbAllocGeomOutlines
+.BI "(\^XkbShapePtr " "shape" "\^,"
+.BI "int " "num_needed" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- shape
+shape for which outlines should be allocated
+.TP
+.I \- num_needed
+number of new outlines required
+.SH DESCRIPTION
+.LP
+Xkb provides a number of functions to allocate and free subcomponents of a 
+keyboard geometry. Use these functions to create or modify keyboard geometries. 
+Note that these functions merely allocate space for the new element(s), and it 
+is up to you to fill in the values explicitly in your code. These allocation 
+functions increase 
+.I sz_* 
+but never touch 
+.I num_* 
+(unless there is an allocation failure, in which case they reset both 
+.I sz_* 
+and 
+.I num_* 
+to zero). These functions return Success if they succeed, BadAlloc if they are 
+not able to allocate space, or BadValue if a parameter is not as expected.
+
+.I XkbAllocGeomOutlines 
+allocates space for 
+.I num_needed 
+outlines in the specified 
+.I shape. 
+The outlines are not initialized.
+
+To free geometry outlines, use 
+.I XkbFreeGeomOutlines.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
+.SH "SEE ALSO"
+.BR XkbFreeGeomOutlines (__libmansuffix__)
diff --git a/man/xkb/XkbAllocGeomOverlayKey.man b/man/xkb/XkbAllocGeomOverlayKey.man
new file mode 100644 (file)
index 0000000..157b7ef
--- /dev/null
@@ -0,0 +1,64 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbAllocGeomOverlayKeys __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAllocGeomOverlayKeys \- Allocate keys in an overlay row
+.SH SYNOPSIS
+.HP
+.B Status XkbAllocGeomOverlayKeys
+.BI "(\^XkbOverlayRowPtr " "row" "\^,"
+.BI "int " "num_needed" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- row
+section for which rows should be allocated
+.TP
+.I \- num_needed
+number of new rows required
+.SH DESCRIPTION
+.LP
+Xkb provides a number of functions to allocate and free subcomponents of a keyboard geometry. Use these functions to create or modify keyboard geometries. Note that these functions merely allocate space for the new element(s), and it is up to you to fill in the values explicitly in your code. These allocation functions increase 
+.I sz_* 
+but never touch 
+.I num_* 
+(unless there is an allocation failure, in which case they reset both 
+.I sz_* 
+and 
+.I num_* 
+to zero). These functions return Success if they succeed, BadAlloc if they are not able to allocate space, or BadValue if a parameter is not as expected.
+
+.I XkbAllocGeomOverlayKeys 
+allocates 
+.I num_needed 
+keys and adds them to the 
+.I row. 
+No initialization of the keys is done.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbAllocGeomOverlayRows.man b/man/xkb/XkbAllocGeomOverlayRows.man
new file mode 100644 (file)
index 0000000..c1c952b
--- /dev/null
@@ -0,0 +1,73 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbAllocGeomOverlayRows __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAllocGeomOverlayRows \- Allocate rows in a overlay
+.SH SYNOPSIS
+.HP
+.B Status XkbAllocGeomOverlayRows
+.BI "(\^XkbOverlayPtr " "overlay" "\^,"
+.BI "int " "num_needed" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- overlay
+section for which rows should be allocated
+.TP
+.I \- num_needed
+number of new rows required
+.SH DESCRIPTION
+.LP
+Xkb provides a number of functions to allocate and free subcomponents of a 
+keyboard geometry. Use these functions to create or modify keyboard geometries. 
+Note that these functions merely allocate space for the new element(s), and it 
+is up to you to fill in the values explicitly in your code. These allocation 
+functions increase 
+.I sz_* 
+but never touch 
+.I num_* 
+(unless there is an allocation failure, in which case they reset both 
+.I sz_* 
+and 
+.I num_* 
+to zero). These functions return Success if they succeed, BadAlloc if they are 
+not able to allocate space, or BadValue if a parameter is not as expected.
+
+.I XkbAllocGeomOverlayRows 
+allocates 
+.I num_needed 
+rows and adds them to the 
+.I overlay. 
+No initialization of the rows is done.
+
+To free rows in an overlay, use 
+.I XkbFreeGeomOverlayRows.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
+.SH "SEE ALSO"
+.BR XkbFreeGeomOverlayRows (__libmansuffix__)
diff --git a/man/xkb/XkbAllocGeomOverlays.man b/man/xkb/XkbAllocGeomOverlays.man
new file mode 100644 (file)
index 0000000..4cf95a7
--- /dev/null
@@ -0,0 +1,63 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbAllocGeomOverlays __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAllocGeomOverlays \- Allocate overlays in a section
+.SH SYNOPSIS
+.HP
+.B Status XkbAllocGeomOverlays
+.BI "(\^XkbSectionPtr " "section" "\^,"
+.BI "int " "num_needed" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- section
+section for which overlays should be allocated
+.TP
+.I \- num_needed
+number of new overlays required
+.SH DESCRIPTION
+.LP
+Xkb provides a number of functions to allocate and free subcomponents of a keyboard geometry. Use these functions to create or modify keyboard geometries. Note that these functions merely allocate space for the new element(s), and it is up to you to fill in the values explicitly in your code. These allocation functions increase 
+.I sz_* 
+but never touch 
+.I num_* 
+(unless there is an allocation failure, in which case they reset both 
+.I sz_* 
+and 
+.I num_* 
+to zero). These functions return Success if they succeed, BadAlloc if they are not able to allocate space, or BadValue if a parameter is not as expected.
+
+.I XkbAllocGeomOverlays 
+allocates 
+.I num_needed 
+overlays and adds them to the 
+.I section. 
+No initialization of the overlays is done.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbAllocGeomPoints.man b/man/xkb/XkbAllocGeomPoints.man
new file mode 100644 (file)
index 0000000..91c1637
--- /dev/null
@@ -0,0 +1,68 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbAllocGeomPoints __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAllocGeomPoints \- Allocate points in an outline
+.SH SYNOPSIS
+.HP
+.B Status XkbAllocGeomPoints
+.BI "(\^XkbOutlinePtr " "outline" "\^,"
+.BI "int " "num_needed" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- outline
+outline for which points should be allocated
+.TP
+.I \- num_needed
+number of new points required
+.SH DESCRIPTION
+.LP
+Xkb provides a number of functions to allocate and free subcomponents of a 
+keyboard geometry. Use these functions to create or modify keyboard geometries. 
+Note that these functions merely allocate space for the new element(s), and it 
+is up to you to fill in the values explicitly in your code. These allocation 
+functions increase 
+.I sz_* 
+but never touch 
+.I num_* 
+(unless there is an allocation failure, in which case they reset both 
+.I sz_* 
+and 
+.I num_* 
+to zero). These functions return Success if they succeed, BadAlloc if they are 
+not able to allocate space, or BadValue if a parameter is not as expected.
+
+.I XkbAllocGeomPoints 
+allocates space for 
+.I num_needed 
+points in the specified 
+.I outline. 
+The points are not initialized.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbAllocGeomProps.man b/man/xkb/XkbAllocGeomProps.man
new file mode 100644 (file)
index 0000000..1a85990
--- /dev/null
@@ -0,0 +1,71 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbAllocGeomProps __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAllocGeomProps \- Allocate geometry properties
+.SH SYNOPSIS
+.HP
+.B Status XkbAllocGeomProps
+.BI "(\^XkbGeometryPtr " "geom" "\^,"
+.BI "int " "num_needed" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- geom
+_summary_
+.TP
+.I \- num_needed
+_summary_
+.SH DESCRIPTION
+.LP
+Xkb provides a number of functions to allocate and free subcomponents of a 
+keyboard geometry. Use these functions to create or modify keyboard geometries. 
+Note that these functions merely allocate space for the new element(s), and it 
+is up to you to fill in the values explicitly in your code. These allocation 
+functions increase 
+.I sz_* 
+but never touch 
+.I num_* 
+(unless there is an allocation failure, in which case they reset both 
+.I sz_* 
+and 
+.I num_* 
+to zero). These functions return Success if they succeed, BadAlloc if they are 
+not able to allocate space, or BadValue if a parameter is not as expected.
+
+.I XkbAllocGeomProps 
+allocates space for 
+.I num_needed 
+properties and adds them to the specified geometry 
+.I geom. 
+No initialization of the properties is done. A geometry property associates an 
+arbitrary string with an equally arbitrary name. Geometry properties can be used 
+to provide hints to programs that display images of keyboards, but they are not 
+interpreted by Xkb. No other geometry structures refer to geometry properties.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbAllocGeomRows.man b/man/xkb/XkbAllocGeomRows.man
new file mode 100644 (file)
index 0000000..4677290
--- /dev/null
@@ -0,0 +1,68 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbAllocGeomRows __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAllocGeomRows \- Allocate rows in a section
+.SH SYNOPSIS
+.HP
+.B Status XkbAllocGeomRows
+.BI "(\^XkbSectionPtr " "section" "\^,"
+.BI "int " "num_needed" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- section
+section for which rows should be allocated
+.TP
+.I \- num_needed
+number of new rows required
+.SH DESCRIPTION
+.LP
+Xkb provides a number of functions to allocate and free subcomponents of a 
+keyboard geometry. Use these functions to create or modify keyboard geometries. 
+Note that these functions merely allocate space for the new element(s), and it 
+is up to you to fill in the values explicitly in your code. These allocation 
+functions increase 
+.I sz_* 
+but never touch 
+.I num_* 
+(unless there is an allocation failure, in which case they reset both 
+.I sz_* 
+and 
+.I num_* 
+to zero). These functions return Success if they succeed, BadAlloc if they are 
+not able to allocate space, or BadValue if a parameter is not as expected.
+
+.I XkbAllocGeomRows 
+allocates 
+.I num_needed 
+rows and adds them to the 
+.I section. 
+No initialization of the rows is done.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbAllocGeomSectionDoodads.man b/man/xkb/XkbAllocGeomSectionDoodads.man
new file mode 100644 (file)
index 0000000..36664aa
--- /dev/null
@@ -0,0 +1,74 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbAllocGeomSectionDoodads __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAllocGeomSectionDoodads \- Allocate doodads that are specific to a section
+.SH SYNOPSIS
+.HP
+.B Status XkbAllocGeomSectionDoodads
+.BI "(\^XkbSectionPtr " "section" "\^,"
+.BI "int " "num_needed" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- section
+section for which doodads should be allocated
+.TP
+.I \- num_needed
+number of new doodads required
+.SH DESCRIPTION
+.LP
+Xkb provides a number of functions to allocate and free subcomponents of a 
+keyboard geometry. Use these functions to create or modify keyboard geometries. 
+Note that these functions merely allocate space for the new element(s), and it 
+is up to you to fill in the values explicitly in your code. These allocation 
+functions increase 
+.I sz_* 
+but never touch 
+.I num_* 
+(unless there is an allocation failure, in which case they reset both 
+.I sz_* 
+and 
+.I num_* 
+to zero). These functions return Success if they succeed, BadAlloc if they are 
+not able to allocate space, or BadValue if a parameter is not as expected.
+
+.I XkbAllocGeomSectionDoodads 
+allocates 
+.I num_needed 
+doodads and adds them to the specified 
+.I section. 
+No initialization of the doodads is done.
+
+To free geometry doodads, use 
+.I XkbFreeGeomDoodads.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
+.SH "SEE ALSO"
+.BR XkbFreeGeomDoodads (__libmansuffix__)
diff --git a/man/xkb/XkbAllocGeomSections.man b/man/xkb/XkbAllocGeomSections.man
new file mode 100644 (file)
index 0000000..4bbe543
--- /dev/null
@@ -0,0 +1,73 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbAllocGeomSections __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAllocGeomSections \- Allocate geometry sections
+.SH SYNOPSIS
+.HP
+.B Status XkbAllocGeomSections
+.BI "(\^XkbGeometryPtr " "geom" "\^,"
+.BI "int " "num_needed" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- geom
+geometry for which sections should be allocated
+.TP
+.I \- num_needed
+number of new sections required
+.SH DESCRIPTION
+.LP
+Xkb provides a number of functions to allocate and free subcomponents of a 
+keyboard geometry. Use these functions to create or modify keyboard geometries. 
+Note that these functions merely allocate space for the new element(s), and it 
+is up to you to fill in the values explicitly in your code. These allocation 
+functions increase 
+.I sz_* 
+but never touch 
+.I num_* 
+(unless there is an allocation failure, in which case they reset both 
+.I sz_* 
+and 
+.I num_* 
+to zero). These functions return Success if they succeed, BadAlloc if they are 
+not able to allocate space, or BadValue if a parameter is not as expected.
+
+.I XkbAllocGeomSections 
+allocates 
+.I num_needed 
+sections and adds them to the geometry 
+.I geom. 
+No initialization of the sections is done.
+
+To free geometry sections, use 
+.I XkbFreeGeomSections.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
+.SH "SEE ALSO"
+.BR XkbFreeGeomSections (__libmansuffix__)
diff --git a/man/xkb/XkbAllocGeomShapes.man b/man/xkb/XkbAllocGeomShapes.man
new file mode 100644 (file)
index 0000000..2b7d50f
--- /dev/null
@@ -0,0 +1,74 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbAllocGeomShapes __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAllocGeomShapes \- Allocate space for an arbitrary number of geometry shapes
+.SH SYNOPSIS
+.HP
+.B Status XkbAllocGeomShapes
+.BI "(\^XkbGeometryPtr " "geom" "\^,"
+.BI "int " "num_needed" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- geom
+geometry for which shapes should be allocated
+.TP
+.I \- num_needed
+number of new shapes required
+.SH DESCRIPTION
+.LP
+Xkb provides a number of functions to allocate and free subcomponents of a 
+keyboard geometry. Use these functions to create or modify keyboard geometries. 
+Note that these functions merely allocate space for the new element(s), and it 
+is up to you to fill in the values explicitly in your code. These allocation 
+functions increase 
+.I sz_* 
+but never touch 
+.I num_* 
+(unless there is an allocation failure, in which case they reset both 
+.I sz_* 
+and 
+.I num_* 
+to zero). These functions return Success if they succeed, BadAlloc if they are 
+not able to allocate space, or BadValue if a parameter is not as expected.
+
+.I XkbAllocGeomShapes 
+allocates space for 
+.I num_needed 
+shapes in the specified geometry 
+.I geom. 
+The shapes are not initialized.
+
+To free geometry shapes, use 
+.I XkbFreeGeomShapes.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
+.SH "SEE ALSO"
+.BR XkbFreeGeomShapes (__libmansuffix__)
+
diff --git a/man/xkb/XkbAllocGeometry.man b/man/xkb/XkbAllocGeometry.man
new file mode 100644 (file)
index 0000000..7ff05bc
--- /dev/null
@@ -0,0 +1,85 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbAllocGeometry __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAllocGeometry \- Allocate an entire geometry
+.SH SYNOPSIS
+.HP
+.B Status XkbAllocGeometry
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "XkbGeometrySizesPtr " "sizes" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+keyboard description for which geometry is to be allocated
+.TP
+.I \- sizes
+initial sizes for all geometry components
+.SH DESCRIPTION
+.LP
+Xkb provides a number of functions to allocate and free subcomponents of a 
+keyboard geometry. Use these functions to create or modify keyboard geometries. 
+Note that these functions merely allocate space for the new element(s), and it 
+is up to you to fill in the values explicitly in your code. These allocation 
+functions increase 
+.I sz_* 
+but never touch 
+.I num_* 
+(unless there is an allocation failure, in which case they reset both 
+.I sz_* 
+and 
+.I num_* 
+to zero). These functions return Success if they succeed, BadAlloc if they are 
+not able to allocate space, or BadValue if a parameter is not as expected.
+
+.I XkbAllocGeometry 
+allocates a keyboard geometry and adds it to the keyboard description specified 
+by 
+.I xkb. 
+The keyboard description should be obtained via the 
+.I XkbGetKeyboard 
+or 
+.I XkbAllocKeyboard 
+functions. The 
+.I sizes 
+parameter specifies the number of elements to be reserved for the subcomponents 
+of the keyboard geometry and can be zero or more. These subcomponents include 
+the 
+.I properties, colors, shapes, sections, and doodads. 
+
+To free an entire geometry, use 
+.I XkbFreeGeometry.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
+.SH "SEE ALSO"
+.BR XkbAllocKeyboard (__libmansuffix__),
+.BR XkbFreeGeometry (__libmansuffix__),
+.BR XkbGetKeyboard (__libmansuffix__)
+
diff --git a/man/xkb/XkbAllocIndicatorMaps.man b/man/xkb/XkbAllocIndicatorMaps.man
new file mode 100644 (file)
index 0000000..ee37c15
--- /dev/null
@@ -0,0 +1,65 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbAllocIndicatorMaps __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAllocIndicatorMaps \- Allocates, directly, the 
+.I indicators 
+member of the keyboard description record 
+.SH SYNOPSIS
+.HP
+.B Status XkbAllocIndicatorMaps
+.BI "(\^variable_type *" "xkb" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+keyboard description structure
+.SH DESCRIPTION
+.LP
+The 
+.I xkb 
+parameter must point to a valid keyboard description. If it doesn't, 
+.I XkbAllocIndicatorMaps 
+returns a BadMatch error. Otherwise, 
+.I XkbAllocIndicatorMaps 
+allocates and initializes the 
+.I indicators 
+member of the keyboard description record and returns Success. If 
+.I XkbAllocIndicatorMaps 
+was unable to allocate the indicators record, it reports a BadAlloc error.
+.SH RETURN VALUES"
+.TP 15
+Success
+The 
+.I XkbAllocIndicatorMaps 
+function returns Success if it is successful in allocating and initializing the 
+.I indicators 
+member of the keyboard description record.
+.SH DIAGNOSTICS
+.TP 15
+.B BadMatch
+A compatible version of Xkb was not available in the server or an argument has 
+correct type and range, but is otherwise invalid
+.TP 15
+.B BadAlloc
+Unable to allocate storage
diff --git a/man/xkb/XkbAllocKeyboard.man b/man/xkb/XkbAllocKeyboard.man
new file mode 100644 (file)
index 0000000..96522fe
--- /dev/null
@@ -0,0 +1,54 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbAllocKeyboard __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAllocKeyboard \-  Creates a keyboard description from scratch
+.SH SYNOPSIS
+.HP
+.B XkbDescRec XkbAllocKeyboard
+.BI "(\^void\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH DESCRIPTION
+.LP
+Applications seldom need to directly allocate a keyboard description; calling
+.I XkbGetKeyboard 
+usually suffices. In the event you need to create a keyboard description from 
+scratch, however, use 
+.I XkbAllocKeyboard 
+rather than directly calling 
+.I malloc.
+
+If 
+.I XkbAllocKeyboard 
+fails to allocate the keyboard description, it returns NULL. 
+Otherwise, it returns a pointer to an empty keyboard description structure. The 
+.I device_spec 
+field will have been initialized to XkbUseCoreKbd. You may then 
+either fill in the structure components or use Xkb functions to obtain values 
+for the structure components from a keyboard device. 
+.SH "SEE ALSO"
+.BR malloc (3F),
+.BR XkbUseCoreKbd (__libmansuffix__),
+.BR XkbGetKeyboard (__libmansuffix__)
+
+
diff --git a/man/xkb/XkbAllocNames.man b/man/xkb/XkbAllocNames.man
new file mode 100644 (file)
index 0000000..18aa4c1
--- /dev/null
@@ -0,0 +1,116 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbAllocNames __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAllocNames \- Allocate symbolic names structures
+.SH SYNOPSIS
+.HP
+.B Status XkbAllocNames
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "unsigned int " "which" "\^,"
+.BI "int " "num_rg" "\^,"
+.BI "int " "num_key_aliases" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+keyboard description for which names are to be allocated
+.TP
+.I \- which
+mask of names to be allocated
+.TP
+.I \- num_rg
+total number of radio group names needed
+.TP
+.I \- num_key_aliases
+total number of key aliases needed
+.SH DESCRIPTION
+.LP
+Most applications do not need to directly allocate symbolic names structures. Do 
+not allocate a names structure directly using 
+.I malloc 
+or 
+.I Xmalloc 
+if your application changes the number of key aliases or radio groups or 
+constructs a symbolic names structure without loading the necessary components 
+from the X server. Instead use 
+.I XkbAllocNames.
+
+.I XkbAllocNames 
+can return BadAlloc, BadMatch, and BadValue errors. The 
+.I which 
+parameter is the bitwise inclusive OR of the valid names mask bits defined in 
+Table 1.
+
+.TS
+c s s s
+l l l l.
+Table 1 Symbolic Names Masks
+_
+Mask Bit       Value   Keyboard        Field
+               Component
+_
+XkbKeycodesNameMask    (1<<0)  Xkb->names      keycodes
+XkbGeometryNameMask    (1<<1)  Xkb->names      geometry
+XkbSymbolsNameMask     (1<<2)  Xkb->names      symbols
+XkbPhysSymbolsNameMask (1<<3)  Xkb->names      phys_symbols
+XkbTypesNameMask       (1<<4)  Xkb->names      type
+XkbCompatNameMask      (1<<5)  Xkb->names      compat
+XkbKeyTypeNamesMask    (1<<6)  Xkb->map        type[*].name
+XkbKTLevelNamesMask    (1<<7)  Xkb->map        type[*].lvl_names[*]
+XkbIndicatorNamesMask  (1<<8)  Xkb->names      indicators[*]
+XkbKeyNamesMask        (1<<9)  Xkb->names      keys[*], num_keys
+XkbKeyAliasesMask      (1<<10) Xkb->names      key_aliases[*], num_key_aliases
+XkbVirtualModNamesMask (1<<11) Xkb->names      vmods[*]
+XkbGroupNamesMask      (1<<12) Xkb->names      groups[*]
+XkbRGNamesMask (1<<13) Xkb->names      radio_groups[*], num_rg
+XkbComponentNamesMask  (0x3f)  Xkb->names      keycodes,
+                       geometry,
+                       symbols,
+                       physical symbols,
+                       types, and
+                       compatibility map
+XkbAllNamesMask        (0x3fff)        Xkb->names      all name components
+.TE
+
+Do not free symbolic names structures directly using 
+.I free 
+or 
+.I XFree. 
+Use 
+.I XkbFreeNames 
+instead.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadMatch
+A compatible version of Xkb was not available in the server or an argument has 
+correct type and range, but is otherwise invalid
+.TP 15
+.B BadValue
+An argument is out of range
+.SH "SEE ALSO"
+.BR XkbFreeNames (__libmansuffix__)
diff --git a/man/xkb/XkbAllocServerMap.man b/man/xkb/XkbAllocServerMap.man
new file mode 100644 (file)
index 0000000..ed24259
--- /dev/null
@@ -0,0 +1,121 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbAllocServerMap __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbAllocServerMap \- Allocate and initialize an empty server map description record
+.SH SYNOPSIS
+.HP
+.B Status XkbAllocServerMap
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "unsigned int " "which" "\^,"
+.BI "unsigned int " "count_acts" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+keyboard description in which to allocate server map
+.TP
+.I \- which
+mask selecting map components to allocate
+.TP
+.I \- count_acts
+value of num_acts field in map to be allocated
+.SH DESCRIPTION
+.LP
+.I XkbAllocServerMap 
+allocates and initializes an empty server map in the 
+.I server 
+field of the keyboard description specified by 
+.I xkb. 
+The 
+.I which 
+parameter specifies the particular components of the server map structure to allocate, as specified in Table 1. 
+
+.TS
+c s
+l l
+l lw(4i).
+Table 1 XkbAllocServerMap Masks
+_
+Mask   Effect
+_
+XkbExplicitComponentsMask      T{
+The min_key_code and max_key_code fields of the xkb parameter are used to
+allocate the explicit field of the server map.
+T}
+.sp
+XkbKeyActionsMask      T{
+The min_key_code and max_key_code fields of the xkb parameter are used to allocate the key_acts field of the server map. The count_acts parameter is used to allocate the acts field of the server map.
+T}
+.sp
+XkbKeyBehaviorsMask    T{
+The min_key_code and max_key_code fields of the xkb parameter are used to allocate the behaviors field of the server map.
+T}
+.sp
+XkbVirtualModMapMask   T{
+The min_key_code and max_key_code fields of the xkb parameter are used to allocate the vmodmap field of the server map.
+T}
+
+.TE
+
+If the server map of the keyboard description is not NULL and any fields are already allocated in the server map, 
+.I XkbAllocServerMap 
+does not overwrite the existing values. The only exception is with the 
+.I acts 
+array. If the 
+.I count_acts 
+parameter is greater than the current 
+.I num_acts 
+field of the server map, 
+.I XkbAllocServerMap 
+resizes the 
+.I acts 
+array and resets the 
+.I num_acts 
+field accordingly.
+
+If 
+.I XkbAllocServerMap 
+is successful, it returns Success. Otherwise, it can return either BadMatch or BadAlloc errors.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadMatch
+A compatible version of Xkb was not available in the server or an argument has correct type and range, but is otherwise invalid
+.TP 15
+.B BadValue
+An argument is out of range
+.SH NOTES
+.LP
+The 
+.I min_key_code 
+and 
+.I max_key_code 
+fields of the 
+.I xkb 
+parameter must be legal values. If they are not valid, 
+.I XkbAllocServerMap 
+returns BadValue. 
diff --git a/man/xkb/XkbApplyCompatMapToKey.man b/man/xkb/XkbApplyCompatMapToKey.man
new file mode 100644 (file)
index 0000000..ef342be
--- /dev/null
@@ -0,0 +1,362 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbApplyCompatMapToKey __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbApplyCompatMapToKey \- Apply the new compatibility mapping to an individual 
+key to get its semantics updated
+.SH SYNOPSIS
+.HP
+.B Bool XkbApplyCompatMapToKey
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "KeyCode " "key" "\^,"
+.BI "XkbChangesPtr " "changes" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+keyboard description to be updated
+.TP
+.I \- key
+key to be updated
+.TP
+.I \- changes
+notes changes to the Xkb keyboard description
+.SH DESCRIPTION
+.LP
+.I XkbApplyCompatMapToKey 
+essentially performs the operation described in Core Keyboard Mapping to Xkb 
+Keyboard Mapping Transformation to a specific key. This updates the behavior, 
+actions, repeat status, and virtual modifier bindings of the key.
+
+.B Core Keyboard Mapping to Xkb Keyboard Mapping Transformation
+
+When a core protocol keyboard mapping request is received by the server, the 
+server's core keyboard map is updated, and then the Xkb map maintained by the 
+server is updated. Because a client may have explicitly configured some of the 
+Xkb keyboard mapping in the server, this automatic regeneration of the Xkb 
+keyboard mapping from the core protocol keyboard mapping should not modify any 
+components of the Xkb keyboard mapping that were explicitly set by a client. The 
+client must set explicit override controls to prevent this from happening (see 
+Explicit Components-Avoiding Automatic Remapping by the Server). The core-to-Xkb 
+mapping is done as follows:
+
+.B Explicit Components-Avoiding Automatic Remapping by the Server
+
+Whenever a client remaps the keyboard using core protocol requests, Xkb examines 
+the map to determine likely default values for the components that cannot be 
+specified using the core protocol.
+
+This automatic remapping might replace definitions explicitly requested by an 
+application, so the Xkb keyboard description defines an explicit components mask 
+for each key. Any aspects of the automatic remapping listed in the explicit 
+components mask for a key are not changed by the automatic keyboard mapping. 
+
+The explicit components masks are held in the 
+.I explicit 
+field of the server map, which is an array indexed by keycode. Each entry in 
+this array is a mask that is a bitwise inclusive OR of the values shown in Table 
+1.
+
+.TS
+c s s
+l l l
+l l lw(3i).
+Table 1 Explicit Component Masks
+_
+Bit in Explicit Mask   Value   Protects Against
+_
+ExplicitKeyType1       (1<<0)  T{
+Automatic determination of the key type associated with Group1.
+T}
+ExplicitKeyType2       (1<<1)  T{
+Automatic determination of the key type associated with Group2.
+T}
+ExplicitKeyType3       (1<<2)  T{
+Automatic determination of the key type associated with Group3.
+T}
+ExplicitKeyType4       (1<<3)  T{
+Automatic determination of the key type associated with Group4.
+T}
+ExplicitInterpret      (1<<4)  T{
+Application of any of the fields of a symbol interpretation to the key in 
+question.
+T}
+ExplicitAutoRepeat     (1<<5)  T{
+Automatic determination of auto-repeat status for the key, as specified in a 
+symbol interpretation.
+T}
+ExplicitBehavior       (1<<6)  T{
+Automatic assignment of the XkbKB_Lock behavior to the key, if the 
+XkbSI_LockingKey flag is set in a symbol interpretation.
+T}
+ExplicitVModMap        (1<<7)  T{
+Automatic determination of the virtual modifier map for the key based on the 
+actions assigned to the key and the symbol interpretations that match the key.
+T}
+.TE
+.TP 4
+1.
+Map the symbols from the keys in the core keyboard map to groups and symbols on 
+keys in the Xkb keyboard map. The core keyboard mapping is of fixed width, so 
+each key in the core mapping has the same number of symbols associated with it. 
+The Xkb mapping allows a different number of symbols to be associated with each 
+key; those symbols may be divided into a different number of groups (1-4) for 
+each key. For each key, this process therefore involves partitioning the fixed 
+number of symbols from the core mapping into a set of variable-length groups 
+with a variable number of symbols in each group. For example, if the core 
+protocol map is of width five, the partition for one key might result in one 
+group with two symbols and another with three symbols. A different key might 
+result in two groups with two symbols plus a third group with one symbol. The 
+core protocol map requires at least two symbols in each of the first two groups.
+.TP 4
+1a.
+For each changed key, determine the number of groups represented in the new core 
+keyboard map. This results in a tentative group count for each key in the Xkb 
+map.
+.TP 4
+1b.
+For each changed key, determine the number of symbols in each of the groups 
+found in step 1a. There is one explicit override control associated with each of 
+the four possible groups for each Xkb key, ExplicitKeyType1 through 
+ExplicitKeyType4. If no explicit override control is set for a group, the number 
+of symbols used for that group from the core map is two.  If the explicit 
+override control is set for a group on the key, the number of symbols used for 
+that Xkb group from the core map is the width of the Xkb group with one 
+exception: because of the core protocol requirement for at least two symbols in 
+each of groups one and two, the number of symbols used for groups one and two is 
+the maximum of 2 or the width of the Xkb group.
+.TP 4
+1c.
+For each changed key, assign the symbols in the core map to the appropriate 
+group on the key. If the total number of symbols required by the Xkb map for a 
+particular key needs more symbols than the core protocol map contains, the 
+additional symbols are taken to be NoSymbol keysyms appended to the end of the 
+core set. If the core map contains more symbols than are needed by the Xkb map, 
+trailing symbols in the core map are discarded. In the absence of an explicit 
+override for group one or two, symbols are assigned in order by group; the first 
+symbols in the core map are assigned to group one, in order, followed by group 
+two, and so on. For example, if the core map contained eight symbols per key, 
+and a particular Xkb map contained 2 symbols for G1 and G2 and three for G3, the 
+symbols would be assigned as (G is group, L is shift level):
+.nf
+
+              G1L1 G1L2 G2L1 G2L2 G3L1 G3L2 G3L3
+                    
+.fi                    
+If an explicit override control is set for group one or two, the symbols are 
+taken from the core set in a somewhat different order. The first four symbols 
+from the core set are assigned to G1L1, G1L2, G2L1, G2L2, respectively. If group 
+one requires more symbols, they are taken next, and then any additional symbols 
+needed by group two. Group three and four symbols are taken in complete sequence 
+after group two. For example, a key with four groups and three symbols in each 
+group would take symbols from the core set in the following order:
+.nf
+
+   G1L1 G1L2 G2L1 G2L2 G1L3 G2L3 G3L1 G3L2 G3L3 G4L1 G4L2 G4L3
+         
+.fi         
+As previously noted, the core protocol map requires at lease two symbols in 
+groups one and two. Because of this, if an explicit override control for an Xkb 
+key is set and group one and / or group two is of width one, it is not possible 
+to generate the symbols taken from the core protocol set and assigned to 
+position G1L2 and / or G2L2.
+.TP 4
+1d.
+For each group on each changed key, assign a key type appropriate for the 
+symbols in the group.
+.TP 4
+1e.
+For each changed key, remove any empty or redundant groups.
+
+At this point, the groups and their associated symbols have been assigned to the 
+corresponding key definitions in the Xkb map.
+.TP 4
+2.
+Apply symbol interpretations to modify key operation. This phase is completely 
+skipped if the  ExplicitInterpret override control bit is set in the explicit 
+controls mask for the Xkb key (see Explicit Components-Avoiding Automatic 
+Remapping by the Server).
+.TP 4
+2a.
+For each symbol on each changed key, attempt to match the symbol and modifiers 
+from the Xkb map to a symbol interpretation describing how to generate the 
+symbol.
+.TP 4
+2b.
+When a match is found in step 2a, apply the symbol interpretation to change the 
+semantics associated with the symbol in the Xkb key map. If no match is found, 
+apply a default interpretation.
+.LP
+The symbol interpretations used in step 2 are configurable and may be specified 
+using XkbSymInterpretRec structures referenced by the sym_interpret field of an 
+XkbCompatMapRec.
+
+.B Symbol Interpretations - the XkbSymInterpretRec Structure
+
+Symbol interpretations are used to guide the X server when it modifies the Xkb 
+keymap in step 2. An initial set of symbol interpretations is loaded by the 
+server when it starts. A client may add new ones using XkbSetCompatMap.
+
+Symbol interpretations result in key semantics being set. When a symbol 
+interpretation is applied, the following components of server key event 
+processing may be modified for the particular key involved:
+.nf
+
+    Virtual modifier map
+    Auto repeat
+    Key behavior (may be set to XkbKB_Lock)
+    Key action
+            
+.fi            
+The XkbSymInterpretRec structure specifies a symbol interpretation:
+.nf
+typedef struct {
+    KeySym        sym;         /\(** keysym of interest or NULL */
+    unsigned char flags;       /\(** XkbSI_AutoRepeat, XkbSI_LockingKey */
+    unsigned char match;       /\(** specifies how mods is interpreted */
+    unsigned char mods;        /\(** modifier bits, correspond to eight real modifiers */
+    unsigned char virtual_mod; /\(** 1 modifier to add to key virtual mod map */
+    XkbAnyAction  act;         /\(** action to bind to symbol position on key */
+} XkbSymInterpretRec,*XkbSymInterpretPtr;
+    
+.fi    
+If sym is not NULL, it limits the symbol interpretation to keys on which that 
+particular keysym is selected by the modifiers matching the criteria specified 
+by 
+.I mods 
+and 
+.I match. 
+If 
+.I sym 
+is NULL, the interpretation may be applied to any symbol selected on a key when 
+the modifiers match the criteria specified by 
+.I mods 
+and 
+.I match.
+
+.I match 
+must be one of the values shown in Table 2 and specifies how the real modifiers 
+specified in 
+.I mods 
+are to be interpreted.
+
+.TS
+c s s
+l l l
+l l lw(3i).
+Table 2 Symbol Interpretation Match Criteria
+_
+Match Criteria Value   Effect
+_
+XkbSI_NoneOf   (0)     T{
+None of the bits that are on in mods can be set, but other bits can be.
+T}
+XkbSI_AnyOfOrNone      (1)     T{
+Zero or more of the bits that are on in mods can be set, as well as others.
+T}
+XkbSI_AnyOf    (2)     T{
+One or more of the bits that are on in mods can be set, as well as any others.
+T}
+XkbSI_AllOf    (3)     T{
+All of the bits that are on in mods must be set, but others may be set as well.
+T}
+XkbSI_Exactly  (4)     T{
+All of the bits that are on in mods must be set, and no other bits may be set.
+T}
+.TE
+
+In addition to the above bits, 
+.I match 
+may contain the XkbSI_LevelOneOnly bit, in which case the modifier match 
+criteria specified by 
+.I mods 
+and 
+.I match 
+applies only if 
+.I sym 
+is in level one of its group; otherwise, 
+.I mods 
+and 
+.I match 
+are ignored and the symbol matches a condition where no modifiers are set.
+.nf
+
+\&#define XkbSI_LevelOneOnly  (0x80)  /\(** use mods + match only if sym is level 1 */
+    
+.fi    
+If no matching symbol interpretation is found, the server uses a default 
+interpretation where:
+.nf
+
+    sym =           0
+    flags =         XkbSI_AutoRepeat
+    match =         XkbSI_AnyOfOrNone
+    mods =          0
+    virtual_mod =   XkbNoModifier
+    act =           SA_NoAction
+    
+.fi    
+When a matching symbol interpretation is found in step 2a, the interpretation is 
+applied to modify the Xkb map as follows.
+
+The 
+.I act 
+field specifies a single action to be bound to the symbol position; any key event that selects the symbol 
+causes the action to be taken. Valid actions are defined in Key Actions.
+
+If the Xkb keyboard map for the key does not have its ExplicitVModMap control set, the XkbSI_LevelOneOnly bit 
+and symbol position are examined. If the XkbSI_LevelOneOnly bit is not set in
+.I match 
+or the symbol is in position G1L1, the 
+.I virtual_mod 
+field is examined. If 
+.I virtual_mod 
+is not XkbNoModifier, 
+.I virtual_mod 
+specifies a single virtual modifier to be added to the virtual modifier map for the key. 
+.I virtual_mod 
+is specified as an index in the range [0..15]. 
+
+If the matching symbol is in position G1L1 of the key, two bits in the flags field potentially specify 
+additional behavior modifications:
+.nf
+
+\&#define  XkbSI_AutoRepeat  (1<<0)  /\(** key repeats if sym is in position G1L1 */
+\&#define  XkbSI_LockingKey  (1<<1)  /\(** set KB_Lock behavior if sym is in psn G1L1 */
+    
+.fi
+If the Xkb keyboard map for the key does not have its ExplicitAutoRepeat control set, its auto repeat behavior 
+is set based on the value of the XkbSI_AutoRepeat bit. If the XkbSI_AutoRepeat bit is set, the auto-repeat 
+behavior of the key is turned on; otherwise, it is turned off.
+
+If the Xkb keyboard map for the key does not have its ExplicitBehavior control set, its locking behavior is 
+set based on the value of the XkbSI_LockingKey bit. If XkbSI_LockingKey is set, the key behavior is set to 
+KB_Lock; otherwise, it is turned off.
+.SH "SEE ALSO"
+.BR XkbKeyAction (__libmansuffix__),
+.BR XkbKeyActionEntry (__libmansuffix__),
+.BR XkbKeyActionsPtr (__libmansuffix__),
+.BR XkbKeyHasActions (__libmansuffix__),
+.BR XkbKeyNumActions (__libmansuffix__)
diff --git a/man/xkb/XkbBell.man b/man/xkb/XkbBell.man
new file mode 100644 (file)
index 0000000..c6fc0e0
--- /dev/null
@@ -0,0 +1,328 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbBell __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbBell \- Rings the bell on the default keyboard
+.SH SYNOPSIS
+.HP
+.B Bool XkbBell
+.BI "(\^Display *" "display" "\^,"
+.BI "Window " "window" "\^,"
+.BI "int " "percent" "\^,"
+.BI "Atom " "name" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- display
+connection to the X server
+.TP
+.I \- window
+event window, or None
+.TP
+.I \- percent
+relative volume, which can range from -100 to 100 inclusive
+.TP
+.I \- name
+a bell name, or NULL
+.SH DESCRIPTION
+.LP
+The core X protocol allows only applications to explicitly sound the system bell 
+with a 
+given duration, pitch, and volume. Xkb extends this capability by allowing 
+clients to 
+attach symbolic names to bells, disable audible bells, and receive an event 
+whenever the 
+keyboard bell is rung. For the purposes of this document, the 
+.I audible 
+bell is defined to be the system bell, or the default keyboard bell, as opposed 
+to any 
+other audible sound generated elsewhere in the system. 
+You can ask to receive XkbBellNotify events when any client rings any one of the 
+following:
+
+.IP \(bu 5
+The default bell
+.IP \(bu 5
+Any bell on an input device that can be specified by a bell_class and bell_id 
+pair
+.IP \(bu 5
+Any bell specified only by an arbitrary name. (This is, from the server's point 
+of view, 
+merely a name, and not connected with any physical sound-generating device. Some 
+client 
+application must generate the sound, or visual feedback, if any, that is 
+associated with 
+the name.)
+
+.LP
+You can also ask to receive XkbBellNotify events when the server rings the 
+default bell 
+or if any client has requested events only (without the bell sounding) for any 
+of the 
+bell types previously listed.
+
+You can disable audible bells on a global basis. For example, a client that 
+replaces the 
+keyboard bell with some other audible cue might want to turn off the AudibleBell 
+control 
+to prevent the server from also generating a sound and avoid cacophony. If you 
+disable 
+audible bells and request to receive XkbBellNotify events, you can generate 
+feedback 
+different from the default bell.
+
+You can, however, override the AudibleBell control by calling one of the 
+functions that 
+force the ringing of a bell in spite of the setting of the AudibleBell control - 
+.I XkbForceDeviceBell 
+or 
+.I XkbForceBell. 
+In this case the server does not generate a bell event.
+
+Just as some keyboards can produce keyclicks to indicate when a key is pressed 
+or 
+repeating, Xkb can provide feedback for the controls by using special beep 
+codes. The 
+AccessXFeedback control is used to configure the specific types of operations 
+that 
+generate feedback.
+
+Bell Names
+
+You can associate a name to an act of ringing a bell by converting the name to 
+an Atom 
+and then using this name when you call the functions listed in this chapter. If 
+an event 
+is generated as a result, the name is then passed to all other clients 
+interested in 
+receiving XkbBellNotify events. Note that these are arbitrary names and that 
+there is no 
+binding to any sounds. Any sounds or other effects (such as visual bells on the 
+screen) 
+must be generated by a client application upon receipt of the bell event 
+containing the 
+name. There is no default name for the default keyboard bell. The server does 
+generate 
+some predefined bells for the AccessX controls. These named bells are shown in 
+Table 1 below; the name is included in any bell event sent to clients that have 
+requested to receive XkbBellNotify events.
+
+.TS
+c s
+l l
+lW(4I) l.
+Table 1 Predefined Bells
+_
+Action Named Bell
+_
+Indicator turned on    AX_IndicatorOn
+Indicator turned off   AX_IndicatorOff
+More than one indicator changed state  AX_IndicatorChange
+Control turned on      AX_FeatureOn
+Control turned off     AX_FeatureOff
+More than one control changed state    AX_FeatureChange
+T{ SlowKeys and BounceKeys about to be turned on or off
+T}     AX_SlowKeysWarning
+SlowKeys key pressed   AX_SlowKeyPress
+SlowKeys key accepted  AX_SlowKeyAccept
+SlowKeys key rejected  AX_SlowKeyReject
+Accepted SlowKeys key released AX_SlowKeyRelease
+BounceKeys key rejected        AX_BounceKeyReject
+StickyKeys key latched AX_StickyLatch
+StickyKeys key locked  AX_StickyLock
+StickyKeys key unlocked        AX_StickyUnlock
+.TE
+
+Audible Bells
+
+Using Xkb you can generate bell events that do not necessarily ring the system 
+bell. This 
+is useful if you need to use an audio server instead of the system beep. For 
+example, 
+when an audio client starts, it could disable the audible bell (the system bell) 
+and then 
+listen for XkbBellNotify events. When it receives a XkbBellNotify event, the 
+audio client 
+could then send a request to an audio server to play a sound.
+
+You can control the audible bells feature by passing the XkbAudibleBellMask to
+.I XkbChangeEnabledControls. 
+If you set XkbAudibleBellMask on, the server rings the system bell when a bell 
+event 
+occurs. This is the default. If you set XkbAudibleBellMask off and a bell event 
+occurs, 
+the server does not ring the system bell unless you call 
+.I XkbForceDeviceBell 
+or 
+.I XkbForceBell.
+
+Audible bells are also part of the per-client auto-reset controls.
+
+Bell Functions
+
+Use the functions described in this section to ring bells and to generate bell 
+events. 
+
+The input extension has two types of feedbacks that can generate bells - bell 
+feedback 
+and keyboard feedback. Some of the functions in this section have
+.I bell_class 
+and 
+.I bell_id 
+parameters; set them as follows: Set 
+.I bell_class 
+to BellFeedbackClass or KbdFeedbackClass. A device can have more than one 
+feedback of 
+each type; set 
+.I bell_id 
+to the particular bell feedback of 
+.I bell_class 
+type.
+
+Table 2 shows the conditions that cause a bell to sound or an XkbBellNotifyEvent 
+to be generated when a bell function is called.
+
+.TS
+c s s s
+l l l l
+l l l l.
+Table 2 Bell Sounding and Bell Event Generating
+_
+Function called        AudibleBell     Server sounds a bell    Server sends an 
+XkbBellNotifyEvent
+_
+XkbDeviceBell  On      Yes     Yes
+XkbDeviceBell  Off     No      Yes
+XkbBell        On      Yes     Yes
+XkbBell        Off     No      Yes
+XkbDeviceBellEvent     On or Off       No      Yes
+XkbBellEvent   On or Off       No      Yes
+XkbDeviceForceBell     On or Off       Yes     No
+XkbForceBell   On or Off       Yes     No
+.TE
+
+If a compatible keyboard extension isn't present in the X server, 
+.I XkbBell 
+calls 
+.I XBell 
+with the specified 
+.I display 
+and 
+.I percent, 
+and returns False. Otherwise, 
+.I XkbBell 
+calls 
+.I XkbDeviceBell 
+with the specified 
+.I display, window, percent, 
+and 
+.I name, 
+a 
+.I device_spec 
+of XkbUseCoreKbd, a 
+.I bell_class 
+of XkbDfltXIClass, and a 
+.I bell_id 
+of XkbDfltXIId, and returns True.
+If you have disabled the audible bell, the server does not ring the system bell, 
+although it does generate a XkbBellNotify event.
+You can call 
+.I XkbBell 
+without first initializing the keyboard extension.
+.SH "RETURN VALUES"
+.TP 15
+FALSE
+The XkbBell function returns FALSE if XlibDisplayNoXkb is set.
+.SH STRUCTURES
+.LP
+Xkb generates XkbBellNotify events for all bells except for those resulting from 
+calls to 
+.I XkbForceDeviceBell 
+and 
+.I XkbForceBell. 
+To receive XkbBellNotify events under all possible conditions, pass 
+XkbBellNotifyMask in 
+both the 
+.I bits_to_change 
+and 
+.I values_for_bits 
+parameters to 
+.I XkbSelectEvents.
+
+The XkbBellNotify event has no event details. It is either selected or it is 
+not. 
+However, you can call 
+.I XkbSelectEventDetails 
+using XkbBellNotify as the 
+.I event_type 
+and specifying XkbAllBellNotifyMask in 
+.I bits_to_change 
+and 
+.I values_for_bits. 
+This has the same effect as a call to 
+.I XkbSelectEvents.
+
+The structure for the XkbBellNotify event type contains:
+.nf
+
+   typedef struct _XkbBellNotify {
+       int            type;        /\(** Xkb extension base event code */
+       unsigned long  serial;      /\(** X server serial number for event */
+       Bool           send_event;  /\(** True => synthetically generated */
+       Display *      display;     /\(** server connection where event generated */
+       Time           time;        /\(** server time when event generated */
+       int            xkb_type;    /\(** XkbBellNotify */
+       unsigned int   device;      /\(** Xkb device ID, will not be XkbUseCoreKbd 
+*/
+       int            percent;     /\(** requested volume as % of max */
+       int            pitch;       /\(** requested pitch in Hz */
+       int            duration;    /\(** requested duration in microseconds */
+       unsigned int   bell_class;  /\(** X input extension feedback class */
+       unsigned int   bell_id;     /\(** X input extension feedback ID */
+       Atom           name;        /\(** "name" of requested bell */
+       Window         window;      /\(** window associated with event */
+       Bool           event_only;  /\(** False -> the server did not produce a beep 
+*/
+   } XkbBellNotifyEvent;
+   
+.fi   
+If your application needs to generate visual bell feedback on the screen when it 
+receives 
+a bell event, use the window ID in the XkbBellNotifyEvent, if present.
+
+.SH "SEE ALSO"
+.BR XBell (__libmansuffix__),
+.BR XkbBellNotify (__libmansuffix__),
+.BR XkbChangeEnabledControls (__libmansuffix__),
+.BR XkbDeviceBell (__libmansuffix__),
+.BR XkbForceBell (__libmansuffix__),
+.BR XkbForceDeviceBell (__libmansuffix__),
+.BR XkbUseCoreKbd (__libmansuffix__)
+
+
+
+
+
diff --git a/man/xkb/XkbBellEvent.man b/man/xkb/XkbBellEvent.man
new file mode 100644 (file)
index 0000000..bf6f469
--- /dev/null
@@ -0,0 +1,325 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbBellEvent __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbBellEvent \- Provides a function that initiates a bell event for the keyboard 
+without ringing the bell
+.SH SYNOPSIS
+.HP
+.B Bool XkbBellEvent
+.BI "(\^Display *" "display" "\^,"
+.BI "Window " "window" "\^,"
+.BI "int " "percent" "\^,"
+.BI "Atom " "name" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- display
+connection to the X server
+.TP
+.I \- window
+the event window, or None 
+.TP
+.I \- percent,
+relative volume, which can range from -100 to 100 inclusive
+.TP
+.I \- name
+a bell name, or NULL
+.SH DESCRIPTION
+.LP
+The core X protocol allows only applications to explicitly sound the system bell 
+with a 
+given duration, pitch, and volume. Xkb extends this capability by allowing 
+clients to 
+attach symbolic names to bells, disable audible bells, and receive an event 
+whenever the 
+keyboard bell is rung. For the purposes of this document, the 
+.I audible 
+bell is defined to be the system bell, or the default keyboard bell, as opposed 
+to any 
+other audible sound generated elsewhere in the system. 
+You can ask to receive XkbBellNotify events when any client rings any one of the 
+following:
+
+.IP \(bu 5
+The default bell
+.IP \(bu 5
+Any bell on an input device that can be specified by a bell_class and bell_id 
+pair
+.IP \(bu 5
+Any bell specified only by an arbitrary name. (This is, from the server's point 
+of view, 
+merely a name, and not connected with any physical sound-generating device. Some 
+client 
+application must generate the sound, or visual feedback, if any, that is 
+associated with 
+the name.)
+
+You can also ask to receive XkbBellNotify events when the server rings the 
+default bell 
+or if any client has requested events only (without the bell sounding) for any 
+of the 
+bell types previously listed.
+
+You can disable audible bells on a global basis. For example, a client that 
+replaces the 
+keyboard bell with some other audible cue might want to turn off the AudibleBell 
+control 
+to prevent the server from also generating a sound and avoid cacophony. If you 
+disable 
+audible bells and request to receive XkbBellNotify events, you can generate 
+feedback 
+different from the default bell.
+
+You can, however, override the AudibleBell control by calling one of the 
+functions that 
+force the ringing of a bell in spite of the setting of the AudibleBell control - 
+.I XkbForceDeviceBell or 
+.I XkbForceBell. 
+In this case the server does not generate a bell event.
+
+Just as some keyboards can produce keyclicks to indicate when a key is pressed 
+or 
+repeating, Xkb can provide feedback for the controls by using special beep 
+codes. The 
+AccessXFeedback control is used to configure the specific types of operations 
+that 
+generate feedback.
+
+Bell Names
+
+You can associate a name to an act of ringing a bell by converting the name to 
+an Atom 
+and then using this name when you call the functions listed in this chapter. If 
+an event 
+is generated as a result, the name is then passed to all other clients 
+interested in 
+receiving XkbBellNotify events. Note that these are arbitrary names and that 
+there is no 
+binding to any sounds. Any sounds or other effects (such as visual bells on the 
+screen) 
+must be generated by a client application upon receipt of the bell event 
+containing the 
+name. There is no default name for the default keyboard bell. The server does 
+generate 
+some predefined bells for the AccessX controls. These named bells are shown in 
+Table 1; the name is included in any bell event sent to clients that have 
+requested to 
+receive XkbBellNotify events.
+
+.TS
+c s
+l l
+lW(4i) l.
+Table 1 Predefined Bells
+_
+Action Named Bell
+_
+Indicator turned on    AX_IndicatorOn
+Indicator turned off   AX_IndicatorOff
+More than one indicator changed state  AX_IndicatorChange
+Control turned on      AX_FeatureOn
+Control turned off     AX_FeatureOff
+More than one control changed state    AX_FeatureChange
+T{
+SlowKeys and BounceKeys about to be turned on or off
+T}     AX_SlowKeysWarning
+SlowKeys key pressed   AX_SlowKeyPress
+SlowKeys key accepted  AX_SlowKeyAccept
+SlowKeys key rejected  AX_SlowKeyReject
+Accepted SlowKeys key released AX_SlowKeyRelease
+BounceKeys key rejected        AX_BounceKeyReject
+StickyKeys key latched AX_StickyLatch
+StickyKeys key locked  AX_StickyLock
+StickyKeys key unlocked        AX_StickyUnlock
+.TE
+
+Audible Bells
+
+Using Xkb you can generate bell events that do not necessarily ring the system 
+bell. This 
+is useful if you need to use an audio server instead of the system beep. For 
+example, 
+when an audio client starts, it could disable the audible bell (the system bell) 
+and then 
+listen for XkbBellNotify events. When it receives a XkbBellNotify event, the 
+audio client 
+could then send a request to an audio server to play a sound.
+
+You can control the audible bells feature by passing the XkbAudibleBellMask to
+.I XkbChangeEnabledControls. 
+If you set XkbAudibleBellMask on, the server rings the system bell when a bell 
+event 
+occurs. This is the default. If you set XkbAudibleBellMask off and a bell event 
+occurs, 
+the server does not ring the system bell unless you call 
+.I XkbForceDeviceBell 
+or 
+.I XkbForceBell.
+
+Audible bells are also part of the per-client auto-reset controls.
+
+Bell Functions
+
+Use the functions described in this section to ring bells and to generate bell 
+events. 
+
+The input extension has two types of feedbacks that can generate bells - bell 
+feedback 
+and keyboard feedback. Some of the functions in this section have
+.I bell_class 
+and 
+.I bell_id 
+parameters; set them as follows: Set 
+.I bell_class 
+to BellFeedbackClass or KbdFeedbackClass. A device can have more than one 
+feedback of 
+each type; set 
+.I bell_id 
+to the particular bell feedback of 
+.I bell_class 
+type.
+
+Table 2 shows the conditions that cause a bell to sound or an 
+XkbBellNotifyEvent 
+to be generated when a bell function is called.
+
+.TS
+c s s s
+l l l l
+l l l l.
+Table 2 Bell Sounding and Bell Event Generating
+_
+Function called        AudibleBell     Server sounds a bell    Server sends an 
+XkbBellNotifyEvent
+_
+XkbDeviceBell  On      Yes     Yes
+XkbDeviceBell  Off     No      Yes
+XkbBell        On      Yes     Yes
+XkbBell        Off     No      Yes
+XkbDeviceBellEvent     On or Off       No      Yes
+XkbBellEvent   On or Off       No      Yes
+XkbDeviceForceBell     On or Off       Yes     No
+XkbForceBell   On or Off       Yes     No
+.TE
+
+If a compatible keyboard extension isn't present in the X server, 
+.I XkbBellEvent 
+immediately returns False. Otherwise, 
+.I XkbBellEvent 
+calls 
+.I XkbDeviceBellEvent 
+with the specified 
+.I display, window, percent, 
+and 
+.I name, 
+a 
+.I device_spec 
+of XkbUseCoreKbd, a 
+.I bell_class 
+of XkbDfltXIClass, and a 
+.I bell_id 
+of XkbDfltXIId, and returns what 
+.I XkbDeviceBellEvent 
+returns.
+
+.I XkbBellEvent 
+generates a XkbBellNotify event.
+
+You can call 
+.I XkbBellEvent 
+without first initializing the keyboard extension.
+.SH "RETURN VALUES"
+.TP 15
+False
+The 
+.I XkbBellEvent
+immediately returns False, if a compatible keyboard extension isn't present in 
+the X server.
+.SH STRUCTURES
+Xkb generates XkbBellNotify events for all bells except for those resulting from 
+calls to 
+.I XkbForceDeviceBell 
+and 
+.I XkbForceBell. 
+To receive XkbBellNotify events under all possible conditions, pass 
+XkbBellNotifyMask in 
+both the 
+.I bits_to_change 
+and 
+.I values_for_bits 
+parameters to 
+.I XkbSelectEvents.
+
+The XkbBellNotify event has no event details. It is either selected or it is 
+not. 
+However, you can call 
+.I XkbSelectEventDetails 
+using XkbBellNotify as the 
+.I event_type 
+and specifying XkbAllBellNotifyMask in 
+.I bits_to_change 
+and 
+.I values_for_bits. 
+This has the same effect as a call to 
+.I XkbSelectEvents.
+
+The structure for the XkbBellNotify event type contains:
+.nf
+
+   typedef struct _XkbBellNotify {
+       int            type;        /\(** Xkb extension base event code */
+       unsigned long  serial;      /\(** X server serial number for event */
+       Bool           send_event;  /\(** True => synthetically generated */
+       Display *      display;     /\(** server connection where event generated */
+       Time           time;        /\(** server time when event generated */
+       int            xkb_type;    /\(** XkbBellNotify */
+       unsigned int   device;      /\(** Xkb device ID, will not be XkbUseCoreKbd 
+*/
+       int            percent;     /\(** requested volume as % of max */
+       int            pitch;       /\(** requested pitch in Hz */
+       int            duration;    /\(** requested duration in microseconds */
+       unsigned int   bell_class;  /\(** X input extension feedback class */
+       unsigned int   bell_id;     /\(** X input extension feedback ID */
+       Atom           name;        /\(** "name" of requested bell */
+       Window         window;      /\(** window associated with event */
+       Bool           event_only;  /\(** False -> the server did not produce a beep 
+*/
+   } XkbBellNotifyEvent;
+   
+.fi   
+If your application needs to generate visual bell feedback on the screen when it 
+receives 
+a bell event, use the window ID in the XkbBellNotifyEvent, if present.
+
+.SH "SEE ALSO"
+.BR XkbChangeEnabledControls (__libmansuffix__),
+.BR XkbDeviceBellEvent (__libmansuffix__),
+.BR XkbForceBell (__libmansuffix__),
+.BR XkbForceDeviceBell (__libmansuffix__),
+.BR XkbSelectEventDetails (__libmansuffix__),
+.BR XkbSelectEvents (__libmansuffix__)
+
+
+
diff --git a/man/xkb/XkbChangeControls.man b/man/xkb/XkbChangeControls.man
new file mode 100644 (file)
index 0000000..751e0c9
--- /dev/null
@@ -0,0 +1,322 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbChangeControls __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbChangeControls \- Provides a flexible method for updating the controls in a 
+server to match those in 
+the changed keyboard description
+.SH SYNOPSIS
+.HP
+.B Bool XkbChangeControls
+.BI "(\^Display *" "dpy" "\^,"
+.BI "XkbDescPtr " "xkb" "\^,"
+.BI "XkbControlsChangesPtr " "changes" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to X server
+.TP
+.I \- xkb
+keyboard description with changed xkb->ctrls
+.TP
+.I \- changes
+which parts of xkb->ctrls have changed
+.SH DESCRIPTION
+.LP
+The XkbControlsChangesRec structure allows applications to track modifications 
+to an XkbControlsRec 
+structure and thereby reduce the amount of traffic sent to the server. The same 
+XkbControlsChangesRec 
+structure may be used in several successive modifications to the same 
+XkbControlsRec structure, then 
+subsequently used to cause all of the changes, and only the changes, to be 
+propagated to the server. 
+
+The 
+.I changed_ctrls 
+field is a mask specifying which logical sets of data in the controls structure 
+have been modified. In 
+this context, modified means 
+.I set, 
+that is, if a value is set to the same value it previously contained, it has 
+still been modified, and is 
+noted as changed. Valid values for 
+.I changed_ctrls 
+are any combination of the masks listed in Table 1 that have "ok" in the 
+.I changed_ctrls 
+column. Setting a bit implies the corresponding data fields from the "Relevant 
+XkbControlsRec Data 
+Fields" column in Table 1 have been modified. The 
+.I enabled_ctrls_changes 
+field specifies which bits in the 
+.I enabled_ctrls 
+field have changed. If the number of keyboard groups has changed, the 
+.I num_groups_changed 
+field is set to True.
+
+Table 1 shows the actual values for the individual mask bits used to select 
+controls for 
+modification and to enable and disable the control. Note that the same mask bit 
+is used to 
+specify general modifications to the parameters used to configure the control 
+(which), and to 
+enable and disable the control (enabled_ctrls). The anomalies in the table (no 
+"ok" in column) 
+are for controls that have no configurable attributes; and for controls that are 
+not boolean 
+controls and therefore cannot be enabled or disabled.
+
+.TS
+c s s s s
+l l l l l
+l l l l l
+l l l l l
+l l l l l
+lw(1.5i) lw(1.5i) l lw(1.5i) l.
+Table 1 Xkb Controls
+_
+Control        Control
+       Selection       Relevant
+       Mask    XkbControlsRec  Boolean Control
+       (which parameter)       DataFields      enabled_ctrls bit       Section
+_       
+T{
+AccessXFeedback
+T}     T{
+XkbAccessXFeedbackMask
+T}     ax_options:     T{
+XkbAccessXFeedbackMask
+T}     10.6.3
+                 XkbAX_*FBMask
+T{
+AccessXKeys
+T}                     T{
+XkbAccessXKeysMask
+T}     10.6.1
+T{
+AccessXTimeout
+T}     T{
+XkbAccessXTimeoutMask
+T}     ax_timeout      T{
+XkbAccessXTimeoutMask
+T}     10.6.2
+               axt_opts_mask
+               axt_opts_values
+               axt_ctrls_mask
+               axt_ctrls_values
+T{
+AudibleBell
+T}                     T{
+XkbAudibleBellMask
+T}     9.2
+T{
+AutoReset
+T}                             10.1.2
+T{
+BounceKeys
+T}     T{
+XkbBounceKeysMask
+T}     debounce_delay  T{
+XkbBounceKeysMask
+T}     10.6.7
+T{
+Detectable-
+T}                             10.3.3
+T{
+Autorepeat
+T}
+T{
+EnabledControls
+T}     T{
+XkbControlsEnabledMask
+T}     enabled_ctrls   T{
+Non-Boolean Control
+T}     10.1.1
+T{
+GroupsWrap
+T}     T{
+XkbGroupsWrapMask
+T}     groups_wrap     T{
+Non-Boolean Control
+T}     10.7.1
+T{
+IgnoreGroupLock
+T}                     T{
+XkbIgnoreGroupLockMask
+T}     10.7.3
+T{
+IgnoreLockMods
+T}     T{
+XkbIgnoreLockModsMask
+T}     ignore_lock     T{
+Non-Boolean Control
+T}     5.1
+T{
+InternalMods
+T}     T{
+XkbInternalModsMask
+T}     internal        T{
+Non-Boolean Control
+T}     5.1
+T{
+MouseKeys
+T}     T{
+XkbMouseKeysMask
+T}     mk_dflt_btn     T{
+XkbMouseKeysMask
+T}     10.5.1
+T{
+MouseKeysAccel
+T}     T{
+XkbMouseKeysAccelMask
+T}     mk_delay        T{
+XkbMouseKeysAccelMask
+T}     10.5.2
+               mk_interval
+               mk_time_to_max
+               mk_max_speed
+               mk_curve
+T{
+Overlay1
+T}                     T{
+XkbOverlay1Mask
+T}     10.4
+T{
+Overlay2
+T}                     T{
+XkbOverlay2Mask
+T}     10.4
+T{
+PerKeyRepeat
+T}     T{
+XkbPerKeyRepeatMask
+T}     per_key_repeat  T{
+Non-Boolean Control
+T}     10.3.1
+T{
+RepeatKeys
+T}     T{
+XkbRepeatKeysMask
+T}     repeat_delay    T{
+XkbRepeatKeysMask
+T}     10.3
+                       repeat_interval
+T{
+SlowKeys
+T}     T{
+XkbSlowKeysMask
+T}     slow_keys_delay T{
+XkbSlowKeysMask
+T}     10.6.6
+T{
+StickyKeys
+T}     T{
+XkbStickyKeysMask
+T}     ax_options:     T{
+XkbStickyKeysMask
+T}     10.6.8
+                 XkbAX_TwoKeysMask
+                 XkbAX_LatchToLockMask
+.TE                      
+
+Table 2 shows the actual values for the individual mask bits used to select 
+controls for 
+modification and to enable and disable the control. Note that the same mask bit 
+is used to 
+specify general modifications to the parameters used to configure the control 
+(which), and to 
+enable and disable the control (enabled_ctrls). The anomalies in the table (no 
+"ok" in column) 
+are for controls that have no configurable attributes; and for controls that are 
+not boolean 
+controls and therefore cannot be enabled or disabled.
+
+.TS
+c s s s
+l l l l
+l l l l
+l l l l. 
+Table 2 Controls Mask Bits
+_
+Mask Bit       which or        enabled Value
+       changed_ctrls   _ctrls
+_
+XkbRepeatKeysMask      ok      ok      (1L<<0)
+XkbSlowKeysMask        ok      ok      (1L<<1)
+XkbBounceKeysMask      ok      ok      (1L<<2)
+XkbStickyKeysMask      ok      ok      (1L<<3)
+XkbMouseKeysMask       ok      ok      (1L<<4)
+XkbMouseKeysAccelMask  ok      ok      (1L<<5)
+XkbAccessXKeysMask     ok      ok      (1L<<6)
+XkbAccessXTimeoutMask  ok      ok      (1L<<7)
+XkbAccessXFeedbackMask ok      ok      (1L<<8)
+XkbAudibleBellMask             ok      (1L<<9)
+XkbOverlay1Mask                ok      (1L<<10)
+XkbOverlay2Mask                ok      (1L<<11)
+XkbIgnoreGroupLockMask         ok      (1L<<12)
+XkbGroupsWrapMask      ok              (1L<<27)
+XkbInternalModsMask    ok              (1L<<28)
+XkbIgnoreLockModsMask  ok              (1L<<29)
+XkbPerKeyRepeatMask    ok              (1L<<30)
+XkbControlsEnabledMask ok              (1L<<31)
+XkbAccessXOptionsMask  ok      ok      (XkbStickyKeysMask | 
+                       XkbAccessXFeedbackMask)
+XkbAllBooleanCtrlsMask         ok      (0x00001FFF) 
+XkbAllControlsMask     ok              (0xF8001FFF)
+.TE
+
+
+
+
+If you have an Xkb description with controls that have been modified and an 
+XkbControlsChangesRec that 
+describes the changes that have been made, the 
+.I XkbChangeControls 
+function provides a flexible method for updating the controls in a server to 
+match those in the changed 
+keyboard description.
+
+.I XkbChangeControls 
+copies any controls fields specified by 
+.I changes 
+from the keyboard description controls structure, 
+.I xkb->ctrls, 
+to the server specified by 
+.I dpy.
+.SH STRUCTURES
+.LP
+The XkbControlsChangesRec structure is defined as follows:
+.nf
+
+typedef struct _XkbControlsChanges {
+    unsigned int  changed_ctrls;         /\(** bits indicating changed control data 
+*/
+    unsigned int  enabled_ctrls_changes; /\(** bits indicating enabled/disabled 
+controls */
+    Bool          num_groups_changed;    /\(** True if number of keyboard groups 
+changed */
+} XkbControlsChangesRec,*XkbControlsChangesPtr;
+
+.fi
diff --git a/man/xkb/XkbChangeDeviceInfo.man b/man/xkb/XkbChangeDeviceInfo.man
new file mode 100644 (file)
index 0000000..01e0266
--- /dev/null
@@ -0,0 +1,74 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbChangeDeviceInfo __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbChangeDeviceInfo \- Update the server's description of a device with the changes noted in an 
+XkbDeviceChangesRec
+.SH SYNOPSIS
+.HP
+.B Bool XkbChangeDeviceInfo
+.BI "(\^Display *" "dpy" "\^,"
+.BI "XkbDeviceInfoPtr " "device_info" "\^,"
+.BI "XkbDeviceChangesPtr " "changes" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to X server
+.TP
+.I \- device_info
+local copy of device state and configuration
+.TP
+.I \- changes
+note specifying changes in device_info
+.SH DESCRIPTION
+.LP
+.I XkbChangeDeviceInfo 
+updates the server's description of the device specified in 
+.I device_info->device_spec 
+with the changes specified in 
+.I changes 
+and contained in 
+.I device_info. 
+The update is made by an 
+.I XkbSetDeviceInfo 
+request.
+.SH STRUCTURES
+.LP
+Changes to an Xkb extension device may be tracked by listening to XkbDeviceExtensionNotify events 
+and accumulating the changes in an XkbDeviceChangesRec structure. The changes noted in the 
+structure may then be used in subsequent operations to update either a server configuration or a 
+local copy of an Xkb extension device configuration. The changes structure is defined as follows:
+.nf
+
+typedef struct _XkbDeviceChanges {
+    unsigned int         changed;        /\(** bits indicating what has changed */
+    unsigned short       first_btn;      /\(** number of first button which changed, if any */
+    unsigned short       num_btns;       /\(** number of buttons that have changed */
+    XkbDeviceLedChangesRec leds;
+} XkbDeviceChangesRec,*XkbDeviceChangesPtr;
+
+.fi
+.SH "SEE ALSO"
+.BR XkbSetDeviceInfo (__libmansuffix__)
diff --git a/man/xkb/XkbChangeEnabledControls.man b/man/xkb/XkbChangeEnabledControls.man
new file mode 100644 (file)
index 0000000..2a563fb
--- /dev/null
@@ -0,0 +1,164 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbChangeEnabledControls __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbChangeEnabledControls \- Manipulates the EnabledControls control
+.SH SYNOPSIS
+.HP
+.B Bool XkbChangeEnabledControls
+.BI "(\^Display *" "dpy" "\^,"
+.BI "unsigned int " "device_spec" "\^,"
+.BI "unsigned int " "mask" "\^,"
+.BI "unsigned int " "values" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to X server
+.TP
+.I \- device_spec
+ keyboard device to modify
+.TP
+.I \- mask
+1 bit -> controls to enable / disable
+.TP
+.I \- values
+1 bit => enable, 0 bit => disable 
+.SH DESCRIPTION
+.LP
+The EnabledControls control is a bit mask where each bit that is turned on means the 
+corresponding control is enabled, and when turned off, disabled. It corresponds to the 
+.I enabled_ctrls 
+field of an XkbControlsRec structure (see STRUCTURES). The bits describing which controls are 
+turned on or off are defined in Table 1.
+
+Table 1 shows the actual values for the individual mask bits used to select controls for 
+modification and to enable and disable the control. Note that the same mask bit is used to 
+specify general modifications to the parameters used to configure the control (which), and to 
+enable and disable the control (enabled_ctrls). The anomalies in the table (no "ok" in column) 
+are for controls that have no configurable attributes; and for controls that are not boolean 
+controls and therefore cannot be enabled or disabled.
+.bp
+.TS
+c s s s
+l l l l
+l l l l
+l l l l. 
+Table 1 Controls Mask Bits
+_
+Mask Bit       which or        enabled Value
+       changed_ctrls   _ctrls
+_
+XkbRepeatKeysMask      ok      ok      (1L<<0)
+XkbSlowKeysMask        ok      ok      (1L<<1)
+XkbBounceKeysMask      ok      ok      (1L<<2)
+XkbStickyKeysMask      ok      ok      (1L<<3)
+XkbMouseKeysMask       ok      ok      (1L<<4)
+XkbMouseKeysAccelMask  ok      ok      (1L<<5)
+XkbAccessXKeysMask     ok      ok      (1L<<6)
+XkbAccessXTimeoutMask  ok      ok      (1L<<7)
+XkbAccessXFeedbackMask ok      ok      (1L<<8)
+XkbAudibleBellMask             ok      (1L<<9)
+XkbOverlay1Mask                ok      (1L<<10)
+XkbOverlay2Mask                ok      (1L<<11)
+XkbIgnoreGroupLockMask         ok      (1L<<12)
+XkbGroupsWrapMask      ok              (1L<<27)
+XkbInternalModsMask    ok              (1L<<28)
+XkbIgnoreLockModsMask  ok              (1L<<29)
+XkbPerKeyRepeatMask    ok              (1L<<30)
+XkbControlsEnabledMask ok              (1L<<31)
+XkbAccessXOptionsMask  ok      ok      (XkbStickyKeysMask | 
+                       XkbAccessXFeedbackMask)
+XkbAllBooleanCtrlsMask         ok      (0x00001FFF) 
+XkbAllControlsMask     ok              (0xF8001FFF)
+.TE
+
+The 
+.I mask 
+parameter specifies the boolean controls to be enabled or disabled, and the 
+.I values 
+mask specifies the new state for those controls. Valid values for both of these 
+masks are composed of a bitwise inclusive OR of bits taken from the set of mask 
+bits in Table 1, using only those masks with "ok" in the 
+.I enabled_ctrls 
+column.
+
+If the X server does not support a compatible version of Xkb or the Xkb 
+extension has not been properly initialized, 
+.I XkbChangeEnabledControls 
+returns False; otherwise, it sends the request to the X server and returns True.
+
+Note that the EnabledControls control only enables and disables controls; it 
+does not configure them. Some controls, such as the AudibleBell control, have no 
+configuration attributes and are therefore manipulated solely by enabling and 
+disabling them. Others, however, have additional attributes to configure their 
+behavior. For example, the RepeatControl control uses 
+.I repeat_delay 
+and 
+.I repeat_interval 
+fields to describe the timing behavior of keys that repeat. The RepeatControl 
+behavior is turned on or off depending on the value of the XkbRepeatKeysMask 
+bit, but you must use other means, as described in this chapter, to configure 
+its behavior in detail.
+.SH "RETURN VALUES"
+.TP 15
+True
+The X server supports a compatible version of Xkb.
+.TP 15
+False
+The X server does not support a compatible version of Xkb or the Xkb extension has not been properly initialized.
+.SH STRUCTURES
+.LP
+.nf
+The XkbControlsRec structure is defined as follows:
+
+    #define XkbMaxLegalKeyCode     255
+    #define XkbPerKeyBitArraySize  ((XkbMaxLegalKeyCode+1)/8)
+    
+    
+    typedef struct {
+        unsigned char   mk_dflt_btn;      /\(** default button for keyboard driven mouse */
+        unsigned char   num_groups;       /\(** number of keyboard groups */
+        unsigned char   groups_wrap;      /\(** how to wrap out-of-bounds groups */
+        XkbModsRec      internal;         /\(** defines server internal modifiers */
+        XkbModsRec      ignore_lock;      /\(** modifiers to ignore when checking for grab */
+        unsigned int    enabled_ctrls;    /\(** 1 bit => corresponding boolean control enabled */
+        unsigned short  repeat_delay;     /\(** ms delay until first repeat */
+        unsigned short  repeat_interval;  /\(** ms delay between repeats */
+        unsigned short  slow_keys_delay;  /\(** ms minimum time key must be down to be ok */
+        unsigned short  debounce_delay;   /\(** ms delay before key reactivated */
+        unsigned short  mk_delay;         /\(** ms delay to second mouse motion event */
+        unsigned short  mk_interval;      /\(** ms delay between repeat mouse events */
+        unsigned short  mk_time_to_max;   /\(** # intervals until constant mouse move */
+        unsigned short  mk_max_speed;     /\(** multiplier for maximum mouse speed */
+        short           mk_curve;         /\(** determines mouse move curve type */
+        unsigned short  ax_options;       /\(** 1 bit => Access X option enabled */
+        unsigned short  ax_timeout;       /\(** seconds until Access X disabled */
+        unsigned short  axt_opts_mask;    /\(** 1 bit => options to reset on Access X timeout */
+        unsigned short  axt_opts_values;  /\(** 1 bit => turn option on, 0=> off */
+        unsigned int    axt_ctrls_mask;   /\(** which bits in enabled_ctrls to modify */
+        unsigned int    axt_ctrls_values; /\(** values for new bits in enabled_ctrls */
+        unsigned char   per_key_repeat[XkbPerKeyBitArraySize];  /\(** per key auto repeat */
+     } XkbControlsRec, *XkbControlsPtr;
+.fi
diff --git a/man/xkb/XkbChangeIndicators.man b/man/xkb/XkbChangeIndicators.man
new file mode 100644 (file)
index 0000000..d7580e7
--- /dev/null
@@ -0,0 +1,156 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbChangeIndicators __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbChangeIndicators \- Changes indicator maps or state without passing the 
+entire keyboard description
+.SH SYNOPSIS
+.HP
+.B Bool XkbChangeIndicators
+.BI "(\^Display *" "dpy" "\^,"
+.BI "XkbDescPtr " "xkb" "\^,"
+.BI "XkbIndicatorChangesPtr " "changes" "\^,"
+.BI "unsigned int " "state" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to the X server 
+.TP
+.I \- xkb
+keyboard description from which names are to be taken. 
+.TP
+.I \- changes
+indicators to be updated on the server
+.TP
+.I \- state
+new state of indicators listed in changes->state_changes
+.SH DESCRIPTION
+.LP
+The XkbIndicatorChangesRec identifies small modifications to the indicator map. 
+Use it with the function 
+.I XkbChangeIndicators 
+to reduce the amount of traffic sent to the server (see STRUCTURES).
+    
+The 
+.I state_changes 
+field is a mask that specifies the indicators that have changed state, and
+.I map_changes 
+is a mask that specifies the indicators whose maps have changed.
+
+.I XkbChangeIndicators 
+copies any maps specified by 
+.I changes 
+from the keyboard description, 
+.I xkb, 
+to the server specified by 
+.I dpy. 
+If any bits are set in the 
+.I state_changes 
+field of 
+.I changes, XkbChangeIndicators 
+also sets the state of those indicators to the values specified in the 
+.I state 
+mask. A 1 bit in 
+.I state 
+turns the corresponding indicator on, a 0 bit turns it off.
+
+In addition, it can also generate XkbIndicatorStateNotify and 
+XkbIndicatorMapNotify events.
+
+Whenever an indicator changes state, the server sends XkbIndicatorStateNotify events 
+to all interested clients. Similarly, whenever an indicator's map changes, the 
+server sends XkbIndicatorMapNotify events to all interested clients.
+
+To receive XkbIndicatorStateNotify events, use 
+.I XkbSelectEvents 
+with both the 
+.I bits_to_change 
+and 
+.I values_for_bits 
+parameters containing XkbIndicatorStateNotifyMask. To receive XkbIndicatorMapNotify 
+events, use 
+.I XkbSelectEvents 
+with XkbIndicatorMapNotifyMask.
+
+To receive events for only specific indicators, use 
+.I XkbSelectEventDetails. 
+Set the 
+.I event_type 
+parameter to XkbIndicatorStateNotify or XkbIndicatorMapNotify, and set both the
+.I bits_to_change 
+and 
+.I values_for_bits 
+detail parameters to a mask where each bit specifies one indicator, turning on those 
+bits that specify the indicators for which you want to receive events.
+
+.I xkb_type 
+is either XkbIndicatorStateNotify or XkbIndicatorMapNotify, depending on whether the 
+event is a kbIndicatorStateNotify event or kbIndicatorMapNotify event.
+
+The 
+.I changed 
+parameter is a mask that is the bitwise inclusive OR of the indicators that have 
+changed. If the event is of type XkbIndicatorMapNotify, 
+.I changed 
+reports the maps that changed. If the event is of type XkbIndicatorStateNotify,
+.I changed 
+reports the indicators that have changed state. 
+.I state 
+is a mask that specifies the current state of all indicators, whether they have 
+changed or not, for both XkbIndicatorStateNotify and IndicatorMapNotify events.
+.SH STRUCTURES
+.LP
+.nf
+     typedef struct _XkbIndicatorChanges {
+         unsigned int        state_changes;
+         unsigned int         map_changes;
+     }XkbIndicatorChangesRec,*XkbIndicatorChangesPtr;
+     
+.fi 
+Both types of indicator events use the same structure:
+
+.nf
+    typedef struct _XkbIndicatorNotify {
+        int            type;        /\(** Xkb extension base event code */
+        unsigned long  serial;      /\(** X server serial number for event */
+        Bool           send_event;  /\(** True => synthetically generated */
+        Display *      display;     /\(** server connection where event generated */
+        Time           time;        /\(** server time when event generated */
+        int            xkb_type;    /\(** specifies state or map notify */
+        int            device;      /\(** Xkb device ID, will not be XkbUseCoreKbd*/
+        unsigned int   changed;     /\(** mask of indicators with new state or map */
+        unsigned int   state;       /\(** current state of all indicators */
+    } XkbIndicatorNotifyEvent;
+     
+.fi     
+.SH DIAGNOSTICS
+.TP 15
+.B BadAtom
+A name is neither a valid Atom or None
+.TP 15
+.B BadImplementation
+Invalid reply from server
+.SH "SEE ALSO"
+.BR XkbIndicatorMapNotify (__libmansuffix__),
+.BR XkbIndicatorStateNotify (__libmansuffix__)
diff --git a/man/xkb/XkbChangeMap.man b/man/xkb/XkbChangeMap.man
new file mode 100644 (file)
index 0000000..a6725ce
--- /dev/null
@@ -0,0 +1,135 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbChangeMap __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbChangeMap \- Update only partial components of a keyboard description, modify 
+the appropriate fields in the server and map components of a local copy of the 
+keyboard description
+.SH SYNOPSIS
+.HP
+.B Bool XkbChangeMap
+.BI "(\^Display *" "dpy" "\^,"
+.BI "XkbDescPtr " "xkb" "\^,"
+.BI "XkbMapChangesPtr " "changes" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to X server
+.TP
+.I \- xkb
+description from which new values are taken
+.TP
+.I \- changes
+identifies component parts to update
+.SH DESCRIPTION
+.LP
+To update only partial components of a keyboard description, modify the 
+appropriate fields in the server and map components of a local copy of the 
+keyboard description, then call 
+.I XkbChangeMap 
+with an XkbMapChangesRec structure indicating which components have changed.
+
+.I XkbChangeMap 
+copies any components specified by the 
+.I changes 
+structure from the keyboard description, 
+.I xkb, 
+to the X server specified by 
+.I dpy.
+
+If any components specified by 
+.I changes 
+are not present in the 
+.I xkb 
+parameter, 
+.I XkbChangeMap 
+returns False. Otherwise, it sends a request to the server and returns True. 
+
+.I XkbChangeMap 
+can generate BadAlloc, BadLength, and BadValue protocol errors. 
+.SH "RETURN VALUES"
+.TP 15
+True
+The XkbChangeMap function returns True if the components specified by 
+.I changes 
+are present in the 
+.I xkb 
+parameter.
+.TP 15
+False
+The XkbChangeMap function returns False if the components specified by 
+.I changes 
+are not present in the 
+.I xkb 
+parameter.
+.SH STRUCTURES
+.LP
+Use the XkbMapChangesRec structure to identify and track partial modifications 
+to the mapping components and to reduce the amount of traffic between the server 
+and clients.
+.nf
+
+typedef struct _XkbMapChanges {
+    unsigned short   changed;            /\(** identifies valid components in 
+structure */
+    KeyCode          min_key_code;       /\(** lowest numbered keycode for device 
+*/
+    KeyCode          max_key_code;       /\(** highest numbered keycode for device 
+*/
+    unsigned char    first_type;         /\(** index of first key type modified */
+    unsigned char    num_types;          /\(** # types modified */
+    KeyCode          first_key_sym;      /\(** first key whose key_sym_map changed 
+*/
+    unsigned char    num_key_syms;       /\(** # key_sym_map entries changed */
+    KeyCode          first_key_act;      /\(** first key whose key_acts entry 
+changed */
+    unsigned char    num_key_acts;       /\(** # key_acts entries changed */
+    KeyCode          first_key_behavior; /\(** first key whose behaviors changed */
+    unsigned char    num_key_behaviors;  /\(** # behaviors entries changed */
+    KeyCode          first_key_explicit; /\(** first key whose explicit entry 
+changed */
+    unsigned char    num_key_explicit;   /\(** # explicit entries changed */
+    KeyCode          first_modmap_key;   /\(** first key whose modmap entry changed 
+*/
+    unsigned char    num_modmap_keys;    /\(** # modmap entries changed */
+    KeyCode          first_vmodmap_key;  /\(** first key whose vmodmap changed */
+    unsigned char    num_vmodmap_keys;   /\(** # vmodmap entries changed */
+    unsigned char    pad1;               /\(** reserved */
+    unsigned short   vmods;              /\(** mask indicating which vmods changed 
+*/
+} XkbMapChangesRec,*XkbMapChangesPtr;
+
+.fi
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadLength
+The length of a request is shorter or longer than that required to minimally 
+contain the arguments
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbChangeNames.man b/man/xkb/XkbChangeNames.man
new file mode 100644 (file)
index 0000000..5b369a6
--- /dev/null
@@ -0,0 +1,186 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbChangeNames __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbChangeNames \- _summary-line_
+.SH SYNOPSIS
+.HP
+.B Bool XkbChangeNames
+.BI "(\^Display *" "dpy" "\^,"
+.BI "unsigned int " "which" "\^,"
+.BI "XkbDescPtr " "Xkb" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to the X server
+.TP
+.I \- which
+mask of names or map components to be updated
+.TP
+.I \- Xkb
+keyboard description to be updated
+.SH DESCRIPTION
+.LP
+.I XkbChangeNames 
+provides a more flexible method for changing symbolic names than 
+.I XkbSetNames 
+and requires the use of an XkbNameChangesRec structure. 
+
+.I XkbChangeNames 
+copies any names specified by 
+.I changes 
+from the keyboard description, 
+.I xkb, 
+to the X server specified by 
+.I dpy. XkbChangeNames 
+aborts and returns False if any illegal type names or type shift level names are 
+specified by changes.
+
+To change the symbolic names in the server, first modify a local copy of the 
+keyboard description and then use either 
+.I XkbSetNames, 
+or, to save network traffic, use a XkbNameChangesRec structure and call
+.I XkbChangeNames 
+to download the changes to the server. 
+.I XkbSetNames 
+and 
+.I XkbChangeNames 
+can generate BadAlloc, BadAtom, BadLength, BadMatch, and BadImplementation 
+errors.
+.SH STRUCTURES
+.LP
+The XkbNameChangesRec allows applications to identify small modifications to the 
+symbolic names and 
+effectively reduces the amount of traffic sent to the server:
+.nf
+
+    typedef struct _XkbNameChanges {
+        unsigned int   changed;            /\(** name components that have changed 
+*/
+        unsigned char  first_type;         /\(** first key type with a new name */
+        unsigned char  num_types;          /\(** number of types with new names */
+        unsigned char  first_lvl;          /\(** first key type with new level 
+names */
+        unsigned char  num_lvls;           /\(** number of key types with new level 
+names */
+        unsigned char  num_aliases;        /\(** if key aliases changed, total 
+number of key aliases */
+        unsigned char  num_rg;             /\(** if radio groups changed, total 
+number of radio groups */
+        unsigned char  first_key;          /\(** first key with a new name */
+        unsigned char  num_keys;           /\(** number of keys with new names */
+        unsigned short changed_vmods;      /\(** mask of virtual modifiers for 
+which names have changed */
+        unsigned long  changed_indicators; /\(** mask of indicators for which names 
+were changed */
+        unsigned char  changed_groups;     /\(** mask of groups for which names 
+were changed */
+    } XkbNameChangesRec, *XkbNameChangesPtr
+    
+.fi    
+The 
+.I changed 
+field specifies the name components that have changed and is the bitwise 
+inclusive OR of the valid names 
+mask bits defined in Table 1. The rest of the fields in the structure specify 
+the ranges that have changed 
+for the various kinds of symbolic names, as shown in Table 2.
+
+Xkb provides several functions that work with symbolic names. Each of these 
+functions uses a mask to 
+specify individual fields of the structures described above. These masks and 
+their relationships to the 
+fields in a keyboard description are shown in Table 1.
+
+.TS
+c s s s
+l l l l.
+Table 1 Symbolic Names Masks
+_
+Mask Bit       Value   Keyboard        Field
+               Component
+_
+XkbKeycodesNameMask    (1<<0)  Xkb->names      keycodes
+XkbGeometryNameMask    (1<<1)  Xkb->names      geometry
+XkbSymbolsNameMask     (1<<2)  Xkb->names      symbols
+XkbPhysSymbolsNameMask (1<<3)  Xkb->names      phys_symbols
+XkbTypesNameMask       (1<<4)  Xkb->names      type
+XkbCompatNameMask      (1<<5)  Xkb->names      compat
+XkbKeyTypeNamesMask    (1<<6)  Xkb->map        type[*].name
+XkbKTLevelNamesMask    (1<<7)  Xkb->map        type[*].lvl_names[*]
+XkbIndicatorNamesMask  (1<<8)  Xkb->names      indicators[*]
+XkbKeyNamesMask        (1<<9)  Xkb->names      keys[*], num_keys
+XkbKeyAliasesMask      (1<<10) Xkb->names      key_aliases[*], num_key_aliases
+XkbVirtualModNamesMask (1<<11) Xkb->names      vmods[*]
+XkbGroupNamesMask      (1<<12) Xkb->names      groups[*]
+XkbRGNamesMask (1<<13) Xkb->names      radio_groups[*], num_rg
+XkbComponentNamesMask  (0x3f)  Xkb->names      keycodes,
+                       geometry,
+                       symbols,
+                       physical symbols,
+                       types, and
+                       compatibility map
+XkbAllNamesMask        (0x3fff)        Xkb->names      all name components
+.TE
+
+.TS
+c s s s
+l l l l.
+Table 2 XkbNameChanges Fields
+_
+Mask   Fields  Component       Field
+_
+XkbKeyTypeNamesMask    first_type,     Xkb->map        type[*].name
+       num_types
+XkbKTLevelNamesMask    first_lvl,      Xkb->map        type[*].lvl_names[*]
+       num_lvls
+XkbKeyAliasesMask      num_aliases     Xkb->names      key_aliases[*]
+XkbRGNamesMask num_rg  Xkb->names      radio_groups[*]
+XkbKeyNamesMask        first_key,      Xkb->names      keys[*]
+       num_keys
+XkbVirtualModNamesMask changed_vmods   Xkb->names      vmods[*]
+XkbIndicatorNamesMask  changed_indicators      Xkb->names      indicators[*]
+XkbGroupNamesMask      changed_groups  Xkb->names      groups[*]
+.TE
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadAtom
+A name is neither a valid Atom or None
+.TP 15
+.B BadImplementation
+Invalid reply from server
+.TP 15
+.B BadLength
+The length of a request is shorter or longer than that required to minimally 
+contain the arguments
+.TP 15
+.B BadMatch
+A compatible version of Xkb was not available in the server or an argument has 
+correct type and range, but is otherwise invalid
+.SH "SEE ALSO"
+.BR XkbSetNames (__libmansuffix__)
diff --git a/man/xkb/XkbChangeTypesOfKey.man b/man/xkb/XkbChangeTypesOfKey.man
new file mode 100644 (file)
index 0000000..e253cf3
--- /dev/null
@@ -0,0 +1,202 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbChangeTypesOfKey __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbChangeTypesOfKey \- Change the number of groups and the types bound to a key 
+.SH SYNOPSIS
+.HP
+.B Status XkbChangeTypesOfKey
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "int " "key" "\^,"
+.BI "int " "n_groups" "\^,"
+.BI "unsigned int " "groups" "\^,"
+.BI "int *" "new_types_in" "\^,"
+.BI "XkbMapChangesPtr " "p_changes" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+keyboard description to be changed
+.TP
+.I \- key
+keycode for key of interest
+.TP
+.I \- n_groups
+new number of groups for key
+.TP
+.I \- groups
+mask indicating groups to change
+.TP
+.I \- new_types_in
+indices for new groups specified in groups
+.TP
+.I \- p_changes
+notes changes made to xkb
+.SH DESCRIPTION
+.LP
+.I XkbChangeTypesOfKey 
+reallocates the symbols and actions bound to the key, if necessary, and 
+initializes any new symbols 
+or actions to NoSymbol or NoAction, as appropriate. If the p_changes parameter 
+is not NULL, 
+.I XkbChangeTypesOfKey 
+adds the XkbKeySymsMask to the changes field of 
+.I p_changes 
+and modifies the 
+.I first_key_sym 
+and 
+.I num_key_syms 
+fields of 
+.I p_changes 
+to include the 
+.I key 
+that was changed. See STRUCTURE for more information on the XkbMapChangesPtr 
+structure. If 
+successful, 
+.I XkbChangeTypesOfKey 
+returns Success.
+
+The 
+.I n_groups 
+parameter specifies the new number of groups for the key. The 
+.I groups 
+parameter is a mask specifying the groups for which new types are supplied and 
+is a bitwise 
+inclusive OR of the following masks: XkbGroup1Mask, XkbGroup2Mask, 
+XkbGroup3Mask, and XkbGroup4Mask.
+
+The 
+.I new_types_in 
+parameter is an integer array of length 
+.I n_groups. 
+Each entry represents the type to use for the associated group and is an index 
+into 
+.I xkb->map->types. 
+The 
+.I new_types_in 
+array is indexed by group index; if 
+.I n_groups 
+is four and 
+.I groups 
+only has Group1Mask and Group3Mask set, 
+.I new_types_in 
+looks like this:
+.nf
+
+    new_types_in[0] = type for Group1
+    new_types_in[1] = ignored
+    new_types_in[2] = type for Group3
+    new_types_in[3] = ignored
+    
+.fi    
+For convenience, Xkb provides the following constants to use as indices to the 
+groups:
+
+.TS
+c s
+l l
+l l.
+Table 1 Group Index Constants
+_
+Constant Name  Value
+_
+XkbGroup1Index 0
+XkbGroup2Index 1
+XkbGroup3Index 2
+XkbGroup4Index 3
+.TE
+
+If the Xkb extension has not been properly initialized, 
+.I XkbChangeTypesOfKey 
+returns BadAccess. If the 
+.I xkb 
+parameter it not valid (that is, it is NULL or it does not contain a valid 
+client map), 
+.I XkbChangeTypesOfKey 
+returns BadMatch. If the 
+.I key 
+is not a valid keycode, 
+.I n_groups 
+is greater than XkbNumKbdGroups, or the 
+.I groups 
+mask does not contain any of the valid group mask bits, 
+.I XkbChangeTypesOfKey 
+returns BadValue. If it is necessary to resize the key symbols or key actions 
+arrays and any 
+allocation errors occur, 
+.I XkbChangeTypesOfKey 
+returns BadAlloc.
+.SH STRUCTURES
+.LP
+Use the XkbMapChangesRec structure to identify and track partial modifications 
+to the mapping 
+components and to reduce the amount of traffic between the server and clients.
+.nf
+
+typedef struct _XkbMapChanges {
+    unsigned short   changed;            /\(** identifies valid components in 
+structure */
+    KeyCode          min_key_code;       /\(** lowest numbered keycode for device 
+*/
+    KeyCode          max_key_code;       /\(** highest numbered keycode for device 
+*/
+    unsigned char    first_type;         /\(** index of first key type modified */
+    unsigned char    num_types;          /\(** # types modified */
+    KeyCode          first_key_sym;      /\(** first key whose key_sym_map changed 
+*/
+    unsigned char    num_key_syms;       /\(** # key_sym_map entries changed */
+    KeyCode          first_key_act;      /\(** first key whose key_acts entry 
+changed */
+    unsigned char    num_key_acts;       /\(** # key_acts entries changed */
+    KeyCode          first_key_behavior; /\(** first key whose behaviors changed */
+    unsigned char    num_key_behaviors;  /\(** # behaviors entries changed */
+    KeyCode          first_key_explicit; /\(** first key whose explicit entry 
+changed */
+    unsigned char    num_key_explicit;   /\(** # explicit entries changed */
+    KeyCode          first_modmap_key;   /\(** first key whose modmap entry changed 
+*/
+    unsigned char    num_modmap_keys;    /\(** # modmap entries changed */
+    KeyCode          first_vmodmap_key;  /\(** first key whose vmodmap changed */
+    unsigned char    num_vmodmap_keys;   /\(** # vmodmap entries changed */
+    unsigned char    pad1;               /\(** reserved */
+    unsigned short   vmods;              /\(** mask indicating which vmods changed 
+*/
+} XkbMapChangesRec,*XkbMapChangesPtr;
+
+.fi
+.SH DIAGNOSTICS
+.TP 15
+.B BadAccess
+The Xkb extension has not been properly initialized
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadMatch
+A compatible version of Xkb was not available in the server or an argument has 
+correct type and 
+range, but is otherwise invalid
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbComputeRowBounds.man b/man/xkb/XkbComputeRowBounds.man
new file mode 100644 (file)
index 0000000..b72ca5b
--- /dev/null
@@ -0,0 +1,50 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbComputeRowBounds __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbComputeRowBounds \-  Update the bounding box of a row
+.SH SYNOPSIS
+.HP
+.B Bool XkbComputeRowBounds
+.BI "(\^XkbGeometryPtr " "geom" "\^,"
+.BI "XkbSectionPtr " "section" "\^,"
+.BI "XkbRowPtr " "row" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- geom
+geometry that contains the section
+.TP
+.I \- section
+section that contains the row
+.TP
+.I \- row
+row to be examined and updated
+.SH DESCRIPTION
+.LP
+.I XkbComputeRowBounds 
+checks the bounds of all keys in the 
+.I row 
+and updates the bounding box of the row if necessary. 
+.I XkbComputeRowBounds 
+returns False if any of the arguments is NULL; otherwise, it returns True.
diff --git a/man/xkb/XkbComputeSectionBounds.man b/man/xkb/XkbComputeSectionBounds.man
new file mode 100644 (file)
index 0000000..ce56c0c
--- /dev/null
@@ -0,0 +1,50 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbComputeSectionBounds __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbComputeSectionBounds \- Update the bounding box of a section
+.SH SYNOPSIS
+.HP
+.B Bool XkbComputeSectionBounds
+.BI "(\^XkbGeometryPtr " "geom" "\^,"
+.BI "XkbSectionPtr " "section" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- geom
+geometry that contains the section
+.TP
+.I \- section
+section to be examined and updated
+.SH DESCRIPTION
+.LP
+ If you add or delete a row to or from a section, or if you change the geometry 
+of any of the rows in that section, you may need to update the bounding box for 
+that section. 
+.I XkbComputeSectionBounds 
+examines all the rows of the 
+.I section 
+and updates the bounding box of that section so that it contains all rows.
+.I XkbComputeSectionBounds 
+returns False if any of the arguments is NULL; otherwise, it returns True.
diff --git a/man/xkb/XkbComputeShapeBounds.man b/man/xkb/XkbComputeShapeBounds.man
new file mode 100644 (file)
index 0000000..d370183
--- /dev/null
@@ -0,0 +1,82 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbComputeShapeBounds __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbComputeShapeBounds \- Updates the bounding box of a shape
+.SH SYNOPSIS
+.HP
+.B Bool XkbComputeShapeBounds
+.BI "(\^XkbShapePtr " "shape" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- shape
+shape to be examined
+.SH DESCRIPTION
+.LP
+Xkb provides a number of convenience functions to help use a keyboard geometry. These include 
+functions to return the bounding box of a shape's top surface and to update the bounding box 
+of a shape row or section.
+
+A shape is made up of a number of outlines. Each outline is a polygon made up of a number of 
+points. The bounding box of a shape is a rectangle that contains all the outlines of that 
+shape. 
+
+A ShapeRec contains a BoundsRec that describes the bounds of the shape. If you add or delete 
+an outline to or from a shape, the bounding box must be updated.
+
+.I XkbComputeShapeBounds 
+updates the BoundsRec contained in the 
+.I shape 
+by examining all the outlines of the shape and setting the BoundsRec to the minimum x and 
+minimum y, and maximum x and maximum y values found in those outlines. 
+.I XkbComputeShapeBounds 
+returns False if 
+.I shape 
+is NULL or if there are no outlines for the shape; otherwise, it returns True.
+
+If you add or delete a key to or from a row, or if you update the shape of one of the keys in that row, you may need to update the bounding box of that row. To update the bounding box of a row, use 
+.I XkbComputeRowBounds.
+.SH STRUCTURES
+.LP
+.nf
+
+typedef struct _XkbShape {
+    Atom           name;         /\(** shape's name */
+    unsigned short num_outlines; /\(** number of outlines for the shape */
+    unsigned short sz_outlines;  /\(** size of the outlines array */
+    XkbOutlinePtr  outlines;     /\(** array of outlines for the shape */
+    XkbOutlinePtr  approx;       /\(** pointer into the array to the approximating outline */
+    XkbOutlinePtr  primary;      /\(** pointer into the array to the primary outline */
+    XkbBoundsRec   bounds;       /\(** bounding box for the shape; encompasses all outlines */
+} XkbShapeRec, *XkbShapePtr;
+
+typedef struct _XkbBounds {
+    short      x1,y1;  /\(** upper left corner of the bounds, in mm/10 */
+    short      x2,y2;  /\(** lower right corner of the bounds, in mm/10 */
+} XkbBoundsRec, *XkbBoundsPtr;
+
+.fi
+.SH "SEE ALSO"
+.BR XkbComputeRowBounds (__libmansuffix__)
+
diff --git a/man/xkb/XkbComputeShapeTop.man b/man/xkb/XkbComputeShapeTop.man
new file mode 100644 (file)
index 0000000..5bcf469
--- /dev/null
@@ -0,0 +1,75 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbComputeShapeTop __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbComputeShapeTop \- Determines the bounding box of the top surface of a shape
+.SH SYNOPSIS
+.HP
+.B Bool XkbComputeShapeTop
+.BI "(\^XkbShapePtr " "shape" "\^,"
+.BI "XkbBoundsPtr " "bounds_rtrn" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- shape
+shape to be examined
+.TP
+.I \- bounds_rtrn
+backfilled with the bounding box for the shape
+.SH DESCRIPTION
+.LP
+Xkb provides a number of convenience functions to help use a keyboard geometry. 
+These include functions to return the bounding box of a shape's top surface and 
+to update the bounding box of a shape row or section.
+
+A shape is made up of a number of outlines. Each outline is a polygon made up of 
+a number of points. The bounding box of a shape is a rectangle that contains all 
+the outlines of that shape. 
+
+.I XkbComputeShapeTop 
+returns a BoundsRec that contains two x and y coordinates. These coordinates
+describe the corners of a rectangle that contains the outline that describes the 
+top surface of the shape. The top surface is defined to be the approximating 
+outline if the 
+.I approx 
+field of 
+.I shape 
+is not NULL. If 
+.I approx 
+is NULL, the top surface is defined as the last outline in the 
+.I shape's 
+array of outlines. 
+.I XkbComputeShapeTop 
+returns False if 
+.I shape 
+is NULL or if there are no outlines for the shape; otherwise, it returns True.
+.SH STRUCTURES
+.LP
+.nf
+
+typedef struct _XkbBounds {
+       short   x1,y1;  /\(** upper left corner of the bounds, in mm/10 */
+       short   x2,y2;  /\(** lower right corner of the bounds, in mm/10 */
+} XkbBoundsRec, *XkbBoundsPtr;
+
+.fi
diff --git a/man/xkb/XkbCopyKeyType.man b/man/xkb/XkbCopyKeyType.man
new file mode 100644 (file)
index 0000000..cfcbd43
--- /dev/null
@@ -0,0 +1,94 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbCopyKeyType __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbCopyKeyType \- Copy one XkbKeyTypeRec structures
+.SH SYNOPSIS
+.HP
+.B Status XkbCopyKeyType
+.BI "(\^XkbKeyTypePtr " "from" "\^,"
+.BI "XkbKeyTypePtr " "into" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- from
+pointer to XkbKeyTypeRec to be copied
+.TP
+.I \- into
+pointer to XkbKeyTypeRec to be changed
+.SH DESCRIPTION
+.LP
+.I XkbCopyKeyType 
+copies the key type specified by 
+.I from 
+to the key type specified by 
+.I into. 
+Both must point to legal XkbKeyTypeRec structures. Xkb assumes 
+.I from 
+and 
+.I into 
+point to different places. As a result, overlaps can be fatal. 
+.I XkbCopyKeyType 
+frees any existing 
+.I map, preserve, 
+and 
+.I level_names 
+in 
+.I into 
+prior to copying. If any allocation errors occur while copying 
+.I from 
+to 
+.I into, XkbCopyKeyType 
+returns BadAlloc. Otherwise, 
+.I XkbCopyKeyType 
+copies 
+.I from 
+to 
+.I into 
+and returns Success. 
+.SH STRUCTURES
+.LP
+Key types are used to determine the shift level of a key given the current state of the 
+keyboard. The set of all possible key types for the Xkb keyboard description are held in the
+.I types 
+field of the client map, whose total size is stored in 
+.I size_types, 
+and whose total number of valid entries is stored in 
+.I num_types. 
+Key types are defined using the following structure:
+.nf
+
+typedef struct {                   /\(** Key Type */
+    XkbModsRec        mods;        /\(** modifiers used to compute shift level */
+    unsigned char     num_levels;  /\(** total # shift levels, do not modify directly */
+    unsigned char     map_count;   /\(** # entries in map, preserve (if non-NULL) */
+    XkbKTMapEntryPtr  map;         /\(** vector of modifiers for each shift level */
+    XkbModsPtr        preserve;    /\(** mods to preserve for corresponding map entry */
+    Atom              name;        /\(** name of key type */
+    Atom *            level_names; /\(** array of names of each shift level */
+} XkbKeyTypeRec, *XkbKeyTypePtr;
+.fi
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
diff --git a/man/xkb/XkbCopyKeyTypes.man b/man/xkb/XkbCopyKeyTypes.man
new file mode 100644 (file)
index 0000000..1c70adb
--- /dev/null
@@ -0,0 +1,116 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbCopyKeyTypes __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbCopyKeyTypes \- Copy more than one XkbKeyTypeRec structure
+.SH SYNOPSIS
+.HP
+.B Status XkbCopyKeyTypes
+.BI "(\^XkbKeyTypePtr " "from" "\^,"
+.BI "XkbKeyTypePtr " "into" "\^,"
+.BI "int " "num_types" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- from
+pointer to array of XkbKeyTypeRecs to copy
+.TP
+.I \- into
+pointer to array of XkbKeyTypeRecs to change
+.TP
+.I \- num_types
+number of types to copy
+.SH DESCRIPTION
+.LP
+.I XkbCopyKeyTypes 
+copies 
+.I num_types 
+XkbKeyTypeRec structures from the array specified by 
+.I from 
+into the array specified by 
+.I into. 
+It is intended for copying between, rather than within, keyboard descriptions, 
+so it 
+doesn't check for overlaps. The same rules that apply to the 
+.I from 
+and 
+.I into 
+parameters in 
+.I XkbCopyKeyType 
+apply to each entry of the 
+.I from 
+and 
+.I into 
+arrays of 
+.I XkbCopyKeyTypes. 
+If any allocation errors occur while copying 
+.I from 
+to 
+.I into, XkbCopyKeyTypes 
+returns BadAlloc. Otherwise, 
+.I XkbCopyKeyTypes 
+copies 
+.I from 
+to 
+.I into 
+and returns Success.
+.SH "RETURN VALUES"
+.TP 15
+Success
+The XkbCopyKeyTypes function returns Success when there are no allocation 
+errors.
+.SH STRUCTURES
+.LP
+Key types are used to determine the shift level of a key given the current state 
+of the 
+keyboard. The set of all possible key types for the Xkb keyboard description are 
+held in 
+the
+.I types 
+field of the client map, whose total size is stored in 
+.I size_types, 
+and whose total number of valid entries is stored in 
+.I num_types. 
+Key types are defined using the following structure:
+.nf
+
+typedef struct {                   /\(** Key Type */
+    XkbModsRec        mods;        /\(** modifiers used to compute shift level */
+    unsigned char     num_levels;  /\(** total # shift levels, do not modify 
+directly */
+    unsigned char     map_count;   /\(** # entries in map, preserve (if non-NULL) 
+*/
+    XkbKTMapEntryPtr  map;         /\(** vector of modifiers for each shift level 
+*/
+    XkbModsPtr        preserve;    /\(** mods to preserve for corresponding map 
+entry */
+    Atom              name;        /\(** name of key type */
+    Atom *            level_names; /\(** array of names of each shift level */
+} XkbKeyTypeRec, *XkbKeyTypePtr;
+.fi
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.SH "SEE ALSO"
+.BR XkbCopyKeyType (__libmansuffix__)
diff --git a/man/xkb/XkbDeviceBell.man b/man/xkb/XkbDeviceBell.man
new file mode 100644 (file)
index 0000000..bf78681
--- /dev/null
@@ -0,0 +1,291 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbDeviceBell __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbDeviceBell \- Rings the bell on an X input extension device or the default keyboard
+.SH SYNOPSIS
+.HP
+.B Bool XkbDeviceBell
+.BI "(\^Display *" "display" "\^,"
+.BI "Window " "window" "\^,"
+.BI "unsigned int " "device_spec" "\^,"
+.BI "unsigned int " "bell_class" "\^,"
+.BI "unsigned int " "bell_id" "\^,"
+.BI "int " "percent" "\^,"
+.BI "Atom " "name" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- display
+connection to the X server
+.TP
+.I \- window
+window for which the bell is generated, or None
+.TP
+.I \- device_spec
+device ID, or XkbUseCoreKbd
+.TP
+.I \- bell_class
+X input extension bell class of the bell to be rung
+.TP
+.I \- bell_id
+X input extension bell ID of the bell to be rung
+.TP
+.I \- percent
+bell volume, from -100 to 100 inclusive
+.TP
+.I \- name
+a name for the bell, or NULL
+.SH DESCRIPTION
+.LP
+The core X protocol allows only applications to explicitly sound the system bell with a 
+given duration, pitch, and volume. Xkb extends this capability by allowing clients to 
+attach symbolic names to bells, disable audible bells, and receive an event whenever the 
+keyboard bell is rung. For the purposes of this document, the 
+.I audible 
+bell is defined to be the system bell, or the default keyboard bell, as opposed to any 
+other audible sound generated elsewhere in the system. 
+You can ask to receive XkbBellNotify events when any client rings any one of the 
+following:
+
+.IP \(bu 5
+The default bell
+.IP \(bu 5
+Any bell on an input device that can be specified by a bell_class and bell_id pair
+.IP \(bu 5
+Any bell specified only by an arbitrary name. (This is, from the server's point of view, 
+merely a name, and not connected with any physical sound-generating device. Some client 
+application must generate the sound, or visual feedback, if any, that is associated with 
+the name.)
+
+You can also ask to receive XkbBellNotify events when the server rings the default bell 
+or if any client has requested events only (without the bell sounding) for any of the 
+bell types previously listed.
+
+You can disable audible bells on a global basis. For example, a client that replaces the 
+keyboard bell with some other audible cue might want to turn off the AudibleBell control 
+to prevent the server from also generating a sound and avoid cacophony. If you disable 
+audible bells and request to receive XkbBellNotify events, you can generate feedback 
+different from the default bell.
+
+You can, however, override the AudibleBell control by calling one of the functions that 
+force the ringing of a bell in spite of the setting of the AudibleBell control - 
+.I XkbForceDeviceBell 
+or 
+.I XkbForceBell. 
+In this case the server does not generate a bell event.
+
+Just as some keyboards can produce keyclicks to indicate when a key is pressed or 
+repeating, Xkb can provide feedback for the controls by using special beep codes. The 
+AccessXFeedback control is used to configure the specific types of operations that 
+generate feedback.
+
+Bell Names
+
+You can associate a name to an act of ringing a bell by converting the name to an Atom 
+and then using this name when you call the functions listed in this chapter. If an event 
+is generated as a result, the name is then passed to all other clients interested in 
+receiving XkbBellNotify events. Note that these are arbitrary names and that there is no 
+binding to any sounds. Any sounds or other effects (such as visual bells on the screen) 
+must be generated by a client application upon receipt of the bell event containing the 
+name. There is no default name for the default keyboard bell. The server does generate 
+some predefined bells for the AccessX controls. These named bells are shown in the Table 1
+; the name is included in any bell event sent to clients that have requested to 
+receive XkbBellNotify events.
+
+.TS
+c s
+l l
+lW(4i) l.
+Table 1 Predefined Bells
+_
+Action Named Bell
+_
+Indicator turned on    AX_IndicatorOn
+Indicator turned off   AX_IndicatorOff
+More than one indicator changed state  AX_IndicatorChange
+Control turned on      AX_FeatureOn
+Control turned off     AX_FeatureOff
+More than one control changed state    AX_FeatureChange
+T{
+SlowKeys and BounceKeys about to be turned on or off
+T}     AX_SlowKeysWarning
+SlowKeys key pressed   AX_SlowKeyPress
+SlowKeys key accepted  AX_SlowKeyAccept
+SlowKeys key rejected  AX_SlowKeyReject
+Accepted SlowKeys key released AX_SlowKeyRelease
+BounceKeys key rejected        AX_BounceKeyReject
+StickyKeys key latched AX_StickyLatch
+StickyKeys key locked  AX_StickyLock
+StickyKeys key unlocked        AX_StickyUnlock
+.TE
+
+Audible Bells
+
+Using Xkb you can generate bell events that do not necessarily ring the system bell. This 
+is useful if you need to use an audio server instead of the system beep. For example, 
+when an audio client starts, it could disable the audible bell (the system bell) and then 
+listen for XkbBellNotify events. When it receives a XkbBellNotify event, the audio client 
+could then send a request to an audio server to play a sound.
+
+You can control the audible bells feature by passing the XkbAudibleBellMask to
+.I XkbChangeEnabledControls. 
+If you set XkbAudibleBellMask on, the server rings the system bell when a bell event 
+occurs. This is the default. If you set XkbAudibleBellMask off and a bell event occurs, 
+the server does not ring the system bell unless you call 
+.I XkbForceDeviceBell 
+or 
+.I XkbForceBell.
+
+Audible bells are also part of the per-client auto-reset controls.
+
+Bell Functions
+
+Use the functions described in this section to ring bells and to generate bell events. 
+
+The input extension has two types of feedbacks that can generate bells - bell feedback 
+and keyboard feedback. Some of the functions in this section have
+.I bell_class 
+and 
+.I bell_id 
+parameters; set them as follows: Set 
+.I bell_class 
+to BellFeedbackClass or KbdFeedbackClass. A device can have more than one feedback of 
+each type; set 
+.I bell_id 
+to the particular bell feedback of 
+.I bell_class 
+type.
+
+The Table 2 shows the conditions that cause a bell to sound or an XkbBellNotifyEvent 
+to be generated when a bell function is called.
+
+.TS
+c s s s
+l l l l
+l l l l.
+Table 2 Bell Sounding and Bell Event Generating
+_
+Function called        AudibleBell     Server sounds a bell    Server sends an 
+XkbBellNotifyEvent
+_
+XkbDeviceBell  On      Yes     Yes
+XkbDeviceBell  Off     No      Yes
+XkbBell        On      Yes     Yes
+XkbBell        Off     No      Yes
+XkbDeviceBellEvent     On or Off       No      Yes
+XkbBellEvent   On or Off       No      Yes
+XkbDeviceForceBell     On or Off       Yes     No
+XkbForceBell   On or Off       Yes     No
+.TE
+
+Set 
+.I percent 
+to be the volume relative to the base volume for the keyboard as described for .I XBell.
+
+Note that 
+.I bell_class 
+and 
+.I bell_id 
+indicate the bell to physically ring. 
+.I name 
+is simply an arbitrary moniker for the client application's use.
+
+To determine the current feedback settings of an extension input device, use 
+.I XGetFeedbackControl. 
+See the X input extension documentation for more information on
+.I XGetFeedbackControl 
+and related data structures.
+
+If a compatible keyboard extension is not present in the X server, 
+.I XkbDeviceBell 
+immediately returns False. Otherwise, 
+.I XkbDeviceBell 
+rings the bell as specified for the display and keyboard device and returns True. If you have disabled the audible bell, the server does not ring the system bell, although it does generate a 
+.I XkbBellNotify 
+event.
+
+You can call 
+.I XkbDeviceBell 
+without first initializing the keyboard extension.
+.SH STRUCTURES
+Xkb generates XkbBellNotify events for all bells except for those resulting from calls to 
+.I XkbForceDeviceBell 
+and 
+.I XkbForceBell. 
+To receive XkbBellNotify events under all possible conditions, pass XkbBellNotifyMask in 
+both the 
+.I bits_to_change 
+and 
+.I values_for_bits 
+parameters to 
+.I XkbSelectEvents.
+
+The XkbBellNotify event has no event details. It is either selected or it is not. 
+However, you can call 
+.I XkbSelectEventDetails 
+using XkbBellNotify as the 
+.I event_type 
+and specifying XkbAllBellNotifyMask in 
+.I bits_to_change 
+and 
+.I values_for_bits. 
+This has the same effect as a call to 
+.I XkbSelectEvents.
+
+The structure for the XkbBellNotify event type contains:
+.nf
+
+   typedef struct _XkbBellNotify {
+       int            type;        /\(** Xkb extension base event code */
+       unsigned long  serial;      /\(** X server serial number for event */
+       Bool           send_event;  /\(** True => synthetically generated */
+       Display *      display;     /\(** server connection where event generated */
+       Time           time;        /\(** server time when event generated */
+       int            xkb_type;    /\(** XkbBellNotify */
+       unsigned int   device;      /\(** Xkb device ID, will not be XkbUseCoreKbd */
+       int            percent;     /\(** requested volume as % of max */
+       int            pitch;       /\(** requested pitch in Hz */
+       int            duration;    /\(** requested duration in microseconds */
+       unsigned int   bell_class;  /\(** X input extension feedback class */
+       unsigned int   bell_id;     /\(** X input extension feedback ID */
+       Atom           name;        /\(** "name" of requested bell */
+       Window         window;      /\(** window associated with event */
+       Bool           event_only;  /\(** False -> the server did not produce a beep */
+   } XkbBellNotifyEvent;
+   
+.fi   
+If your application needs to generate visual bell feedback on the screen when it receives 
+a bell event, use the window ID in the XkbBellNotifyEvent, if present.
+
+.SH "SEE ALSO"
+.BR XBell (__libmansuffix__),
+.BR XkbBellNotify (__libmansuffix__),
+.BR XkbChangeEnabledControls (__libmansuffix__),
+.BR XkbDeviceBell (__libmansuffix__),
+.BR XkbForceBell (__libmansuffix__),
+.BR XkbForceDeviceBell (__libmansuffix__),
+.BR XGetFeedbackControl (__libmansuffix__),
+.BR XkbSelectEvents (__libmansuffix__)
+
diff --git a/man/xkb/XkbDeviceBellEvent.man b/man/xkb/XkbDeviceBellEvent.man
new file mode 100644 (file)
index 0000000..92a31d5
--- /dev/null
@@ -0,0 +1,322 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbDeviceBellEvent __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbDeviceBellEvent \- Creates a bell event for an X input extension device or 
+for the keyboard, without ringing the corresponding bell
+.SH SYNOPSIS
+.HP
+.B Bool XkbDeviceBellEvent
+.BI "(\^Display *" "display" "\^,"
+.BI "Window " "window" "\^,"
+.BI "unsigned int " "device_spec" "\^,"
+.BI "unsigned int " "bell_class" "\^,"
+.BI "unsigned int " "bell_id" "\^,"
+.BI "int " "percent" "\^,"
+.BI "Atom " "name" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- display
+connection to the X server
+.TP
+.I \- window
+event window, or None
+.TP
+.I \- device_spec
+device ID, or XkbUseCoreKbd
+.TP
+.I \- bell_class
+input extension bell class for the event 
+.TP
+.I \- bell_id
+input extension bell ID for the event 
+.TP
+.I \- percent
+volume for the bell, which can range from -100 to 100 inclusive
+.TP
+.I \- name
+a bell name, or NULL
+.SH DESCRIPTION
+.LP
+The core X protocol allows only applications to explicitly sound the system bell with 
+a 
+given duration, pitch, and volume. Xkb extends this capability by allowing clients to 
+attach symbolic names to bells, disable audible bells, and receive an event whenever 
+the 
+keyboard bell is rung. For the purposes of this document, the 
+.I audible 
+bell is defined to be the system bell, or the default keyboard bell, as opposed to 
+any 
+other audible sound generated elsewhere in the system. 
+You can ask to receive XkbBellNotify events when any client rings any one of the 
+following:
+
+.IP \(bu 5
+The default bell
+.IP \(bu 5
+Any bell on an input device that can be specified by a bell_class and bell_id pair
+.IP \(bu 5
+Any bell specified only by an arbitrary name. (This is, from the server's point of 
+view, 
+merely a name, and not connected with any physical sound-generating device. Some 
+client 
+application must generate the sound, or visual feedback, if any, that is associated 
+with 
+the name.)
+
+You can also ask to receive XkbBellNotify events when the server rings the default 
+bell 
+or if any client has requested events only (without the bell sounding) for any of the 
+bell types previously listed.
+
+You can disable audible bells on a global basis. For example, a client that replaces 
+the 
+keyboard bell with some other audible cue might want to turn off the AudibleBell 
+control 
+to prevent the server from also generating a sound and avoid cacophony. If you 
+disable 
+audible bells and request to receive XkbBellNotify events, you can generate feedback 
+different from the default bell.
+
+You can, however, override the AudibleBell control by calling one of the functions 
+that 
+force the ringing of a bell in spite of the setting of the AudibleBell control - 
+.I XkbForceDeviceBell 
+or 
+.I XkbForceBell. 
+In this case the server does not generate a bell event.
+
+Just as some keyboards can produce keyclicks to indicate when a key is pressed or 
+repeating, Xkb can provide feedback for the controls by using special beep codes. The 
+AccessXFeedback control is used to configure the specific types of operations that 
+generate feedback.
+
+Bell Names
+
+You can associate a name to an act of ringing a bell by converting the name to an 
+Atom 
+and then using this name when you call the functions listed in this chapter. If an 
+event 
+is generated as a result, the name is then passed to all other clients interested in 
+receiving XkbBellNotify events. Note that these are arbitrary names and that there is 
+no 
+binding to any sounds. Any sounds or other effects (such as visual bells on the 
+screen) 
+must be generated by a client application upon receipt of the bell event containing 
+the 
+name. There is no default name for the default keyboard bell. The server does 
+generate 
+some predefined bells for the AccessX controls. These named bells are shown in the 
+Table 1
+below; the name is included in any bell event sent to clients that have requested to 
+receive XkbBellNotify events.
+
+.TS
+c s
+l l
+lW(4i) l.
+Table 1 Predefined Bells
+_
+Action Named Bell
+_
+Indicator turned on    AX_IndicatorOn
+Indicator turned off   AX_IndicatorOff
+More than one indicator changed state  AX_IndicatorChange
+Control turned on      AX_FeatureOn
+Control turned off     AX_FeatureOff
+More than one control changed state    AX_FeatureChange
+T{
+SlowKeys and BounceKeys about to be turned on or off
+T}     AX_SlowKeysWarning
+SlowKeys key pressed   AX_SlowKeyPress
+SlowKeys key accepted  AX_SlowKeyAccept
+SlowKeys key rejected  AX_SlowKeyReject
+Accepted SlowKeys key released AX_SlowKeyRelease
+BounceKeys key rejected        AX_BounceKeyReject
+StickyKeys key latched AX_StickyLatch
+StickyKeys key locked  AX_StickyLock
+StickyKeys key unlocked        AX_StickyUnlock
+.TE
+
+Audible Bells
+
+Using Xkb you can generate bell events that do not necessarily ring the system bell. 
+This 
+is useful if you need to use an audio server instead of the system beep. For example, 
+when an audio client starts, it could disable the audible bell (the system bell) and 
+then 
+listen for XkbBellNotify events. When it receives a XkbBellNotify event, the audio 
+client 
+could then send a request to an audio server to play a sound.
+
+You can control the audible bells feature by passing the XkbAudibleBellMask to
+.I XkbChangeEnabledControls. 
+If you set XkbAudibleBellMask on, the server rings the system bell when a bell event 
+occurs. This is the default. If you set XkbAudibleBellMask off and a bell event 
+occurs, 
+the server does not ring the system bell unless you call 
+.I XkbForceDeviceBell 
+or 
+.I XkbForceBell.
+
+Audible bells are also part of the per-client auto-reset controls.
+
+Bell Functions
+
+Use the functions described in this section to ring bells and to generate bell 
+events. 
+
+The input extension has two types of feedbacks that can generate bells - bell 
+feedback 
+and keyboard feedback. Some of the functions in this section have
+.I bell_class 
+and 
+.I bell_id 
+parameters; set them as follows: Set 
+.I bell_class 
+to BellFeedbackClass or KbdFeedbackClass. A device can have more than one feedback of 
+each type; set 
+.I bell_id 
+to the particular bell feedback of 
+.I bell_class 
+type.
+
+Table 2 shows the conditions that cause a bell to sound or an 
+XkbBellNotifyEvent 
+to be generated when a bell function is called.
+
+.TS
+c s s s
+l l l l
+l l l l.
+Table 2 Bell Sounding and Bell Event Generating
+_
+Function called        AudibleBell     Server sounds a bell    Server sends an 
+XkbBellNotifyEvent
+_
+XkbDeviceBell  On      Yes     Yes
+XkbDeviceBell  Off     No      Yes
+XkbBell        On      Yes     Yes
+XkbBell        Off     No      Yes
+XkbDeviceBellEvent     On or Off       No      Yes
+XkbBellEvent   On or Off       No      Yes
+XkbDeviceForceBell     On or Off       Yes     No
+XkbForceBell   On or Off       Yes     No
+.TE
+
+If a compatible keyboard extension isn't present in the X server, 
+.I XkbDeviceBellEvent 
+immediately returns False. Otherwise, 
+.I XkbDeviceBellEvent 
+causes an XkbBellNotify event to be sent to all interested clients and returns 
+True. Set 
+.I percent 
+to be the volume relative to the base volume for the keyboard as described for 
+.I XBell.
+
+In addition, 
+.I XkbDeviceBellEvent 
+may generate Atom protocol errors as well as XkbBellNotify events. You can call 
+.I XkbBell 
+without first initializing the keyboard extension.
+.SH "RETURN VALUES"
+.TP 15
+True
+The  
+.I XkbDeviceBellEvent 
+sends an XkbBellNotify event to to all interested clients and returns 
+True.
+.TP 15
+False
+If a compatible keyboard extension isn't present in the X server, 
+.I XkbDeviceBellEvent 
+immediately returns False
+.SH STRUCTURES
+.TP
+Xkb generates XkbBellNotify events for all bells except for those resulting from 
+calls to 
+.I XkbForceDeviceBell 
+and 
+.I XkbForceBell. 
+To receive XkbBellNotify events under all possible conditions, pass XkbBellNotifyMask 
+in 
+both the 
+.I bits_to_change 
+and 
+.I values_for_bits 
+parameters to 
+.I XkbSelectEvents.
+
+The XkbBellNotify event has no event details. It is either selected or it is not. 
+However, you can call 
+.I XkbSelectEventDetails 
+using XkbBellNotify as the 
+.I event_type 
+and specifying XkbAllBellNotifyMask in 
+.I bits_to_change 
+and 
+.I values_for_bits. 
+This has the same effect as a call to 
+.I XkbSelectEvents.
+
+The structure for the XkbBellNotify event type contains:
+.nf
+
+   typedef struct _XkbBellNotify {
+       int            type;        /\(** Xkb extension base event code */
+       unsigned long  serial;      /\(** X server serial number for event */
+       Bool           send_event;  /\(** True => synthetically generated */
+       Display *      display;     /\(** server connection where event generated */
+       Time           time;        /\(** server time when event generated */
+       int            xkb_type;    /\(** XkbBellNotify */
+       unsigned int   device;      /\(** Xkb device ID, will not be XkbUseCoreKbd */
+       int            percent;     /\(** requested volume as % of max */
+       int            pitch;       /\(** requested pitch in Hz */
+       int            duration;    /\(** requested duration in microseconds */
+       unsigned int   bell_class;  /\(** X input extension feedback class */
+       unsigned int   bell_id;     /\(** X input extension feedback ID */
+       Atom           name;        /\(** "name" of requested bell */
+       Window         window;      /\(** window associated with event */
+       Bool           event_only;  /\(** False -> the server did not produce a beep */
+   } XkbBellNotifyEvent;
+   
+.fi   
+If your application needs to generate visual bell feedback on the screen when it 
+receives 
+a bell event, use the window ID in the XkbBellNotifyEvent, if present.
+
+.SH "SEE ALSO"
+.BR XBell (__libmansuffix__),
+.BR XkbBellNotify (__libmansuffix__),
+.BR XkbChangeEnabledControls (__libmansuffix__),
+.BR XkbDeviceBell (__libmansuffix__),
+.BR XkbForceBell (__libmansuffix__),
+.BR XkbForceDeviceBell (__libmansuffix__),
+.BR XkbSelectEvents (__libmansuffix__),
+.BR XkbSelectEventDetails (__libmansuffix__),
+.BR XkbUseCoreKbd (__libmansuffix__)
+
+
+
diff --git a/man/xkb/XkbFindOverlayForKey.man b/man/xkb/XkbFindOverlayForKey.man
new file mode 100644 (file)
index 0000000..4036e10
--- /dev/null
@@ -0,0 +1,52 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbFindOverlayForKey __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbFindOverlayForKey \- Find the alternate name by using the primary name for a 
+key that is part of an overlay
+.SH SYNOPSIS
+.HP
+.B char * XkbFindOverlayForKey
+.BI "(\^XkbGeometryPtr " "geom" "\^,"
+.BI "XkbSectionPtr " "section" "\^,"
+.BI "char *" "under" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- geom
+geometry that contains the section
+.TP
+.I \- section
+section to be searched for matching keys
+.TP
+.I \- under
+primary name of the key to be considered
+.SH DESCRIPTION
+.LP
+Keys that can generate multiple keycodes may be associated with multiple names. 
+Such keys have a primary name and an alternate name.
+
+.I XkbFindOverlayForKey 
+uses the primary name of the key, 
+.I under,
+to look up the alternate name, which it returns.
diff --git a/man/xkb/XkbForceBell.man b/man/xkb/XkbForceBell.man
new file mode 100644 (file)
index 0000000..bb3f7fc
--- /dev/null
@@ -0,0 +1,314 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbForceBell __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbForceBell \- Overrides user preference settings for audible bells to ring the 
+bell on the default keyboard
+.SH SYNOPSIS
+.HP
+.B Bool XkbForceBell
+.BI "(\^Display *" "display" "\^,"
+.BI "int " "percent" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- display
+connection to the X server
+.TP
+.I \- percent
+volume for the bell, which can range from -100 to 100 inclusive
+.SH DESCRIPTION
+.LP
+The core X protocol allows only applications to explicitly sound the system bell 
+with a 
+given duration, pitch, and volume. Xkb extends this capability by allowing clients 
+to 
+attach symbolic names to bells, disable audible bells, and receive an event whenever 
+the 
+keyboard bell is rung. For the purposes of this document, the 
+.I audible 
+bell is defined to be the system bell, or the default keyboard bell, as opposed to 
+any 
+other audible sound generated elsewhere in the system. 
+You can ask to receive XkbBellNotify events when any client rings any one of the 
+following:
+
+.IP \(bu 5
+The default bell
+.IP \(bu 5
+Any bell on an input device that can be specified by a bell_class and bell_id pair
+.IP \(bu 5
+Any bell specified only by an arbitrary name. (This is, from the server's point of 
+view, 
+merely a name, and not connected with any physical sound-generating device. Some 
+client 
+application must generate the sound, or visual feedback, if any, that is associated 
+with 
+the name.)
+
+.LP
+You can also ask to receive XkbBellNotify events when the server rings the default 
+bell 
+or if any client has requested events only (without the bell sounding) for any of 
+the 
+bell types previously listed.
+
+You can disable audible bells on a global basis. For example, a client that replaces 
+the 
+keyboard bell with some other audible cue might want to turn off the AudibleBell 
+control 
+to prevent the server from also generating a sound and avoid cacophony. If you 
+disable 
+audible bells and request to receive XkbBellNotify events, you can generate feedback 
+different from the default bell.
+
+You can, however, override the AudibleBell control by calling one of the functions 
+that 
+force the ringing of a bell in spite of the setting of the AudibleBell control - 
+.I XkbForceDeviceBell 
+or 
+.I XkbForceBell. 
+In this case the server does not generate a bell event.
+
+Just as some keyboards can produce keyclicks to indicate when a key is pressed or 
+repeating, Xkb can provide feedback for the controls by using special beep codes. 
+The 
+AccessXFeedback control is used to configure the specific types of operations that 
+generate feedback.
+
+.B Bell Names
+
+You can associate a name to an act of ringing a bell by converting the name to an 
+Atom 
+and then using this name when you call the functions listed in this chapter. If an 
+event 
+is generated as a result, the name is then passed to all other clients interested in 
+receiving XkbBellNotify events. Note that these are arbitrary names and that there 
+is no 
+binding to any sounds. Any sounds or other effects (such as visual bells on the 
+screen) 
+must be generated by a client application upon receipt of the bell event containing 
+the 
+name. There is no default name for the default keyboard bell. The server does 
+generate 
+some predefined bells for the AccessX controls. These named bells are shown in the 
+Table 1; the name is included in any bell event sent to clients that have requested to 
+receive XkbBellNotify events.
+
+.TS
+c s
+l l
+lW(4i) l.
+Table 1 Predefined Bells
+_
+Action Named Bell
+_
+Indicator turned on    AX_IndicatorOn
+Indicator turned off   AX_IndicatorOff
+More than one indicator changed state  AX_IndicatorChange
+Control turned on      AX_FeatureOn
+Control turned off     AX_FeatureOff
+More than one control changed state    AX_FeatureChange
+T{
+SlowKeys and BounceKeys about to be turned on or off
+T}     AX_SlowKeysWarning
+SlowKeys key pressed   AX_SlowKeyPress
+SlowKeys key accepted  AX_SlowKeyAccept
+SlowKeys key rejected  AX_SlowKeyReject
+Accepted SlowKeys key released AX_SlowKeyRelease
+BounceKeys key rejected        AX_BounceKeyReject
+StickyKeys key latched AX_StickyLatch
+StickyKeys key locked  AX_StickyLock
+StickyKeys key unlocked        AX_StickyUnlock
+.TE
+
+.B Audible Bells
+
+Using Xkb you can generate bell events that do not necessarily ring the system bell. 
+This 
+is useful if you need to use an audio server instead of the system beep. For 
+example, 
+when an audio client starts, it could disable the audible bell (the system bell) and 
+then 
+listen for XkbBellNotify events. When it receives a XkbBellNotify event, the audio 
+client 
+could then send a request to an audio server to play a sound.
+
+You can control the audible bells feature by passing the XkbAudibleBellMask to
+.I XkbChangeEnabledControls. 
+If you set XkbAudibleBellMask on, the server rings the system bell when a bell event 
+occurs. This is the default. If you set XkbAudibleBellMask off and a bell event 
+occurs, 
+the server does not ring the system bell unless you call 
+.I XkbForceDeviceBell 
+or 
+.I XkbForceBell.
+
+Audible bells are also part of the per-client auto-reset controls.
+
+Bell Functions
+
+Use the functions described in this section to ring bells and to generate bell 
+events. 
+
+The input extension has two types of feedbacks that can generate bells - bell 
+feedback 
+and keyboard feedback. Some of the functions in this section have
+.I bell_class 
+and 
+.I bell_id 
+parameters; set them as follows: Set 
+.I bell_class 
+to BellFeedbackClass or KbdFeedbackClass. A device can have more than one feedback 
+of 
+each type; set 
+.I bell_id 
+to the particular bell feedback of 
+.I bell_class 
+type.
+
+Table 2 shows the conditions that cause a bell to sound or an XkbBellNotifyEvent to be generated when a bell function is 
+called.
+
+.TS
+c s s s
+l l l l
+l l l l.
+Table 2 Bell Sounding and Bell Event Generating
+_
+Function called        AudibleBell     Server sounds a bell    Server sends an 
+XkbBellNotifyEvent
+_
+XkbDeviceBell  On      Yes     Yes
+XkbDeviceBell  Off     No      Yes
+XkbBell        On      Yes     Yes
+XkbBell        Off     No      Yes
+XkbDeviceBellEvent     On or Off       No      Yes
+XkbBellEvent   On or Off       No      Yes
+XkbDeviceForceBell     On or Off       Yes     No
+XkbForceBell   On or Off       Yes     No
+.TE
+
+
+If a compatible keyboard extension isn't present in the X server, 
+.I XkbForceBell 
+calls 
+.I XBell 
+with the specified 
+.I display 
+and 
+.I percent 
+and returns False. Otherwise, 
+.I XkbForceBell 
+calls 
+.I XkbForceDeviceBell 
+with the specified 
+.I display 
+and 
+.I percent, device_spec 
+=XkbUseCoreKbd, 
+.I bell_class 
+= XkbDfltXIClass, 
+.I bell_id 
+= XkbDfltXIId, 
+.I window 
+= None, and 
+.I name 
+= NULL, and returns what 
+.I XkbForceDeviceBell 
+returns.
+
+.I XkbForceBell 
+does not cause an XkbBellNotify event.
+
+You can call 
+.I XkbBell 
+without first initializing the keyboard extension.
+.SH "RETURNS VALUES"
+.TP 15
+False
+The 
+.I XkbForceBell 
+function returns False when a compatible keyboard extension isn't present in the X server.
+.SH STRUCTURES
+.LP
+Xkb generates XkbBellNotify events for all bells except for those resulting from 
+calls to 
+.I XkbForceDeviceBell 
+and 
+.I XkbForceBell. 
+To receive XkbBellNotify events under all possible conditions, pass 
+XkbBellNotifyMask in 
+both the 
+.I bits_to_change 
+and 
+.I values_for_bits 
+parameters to 
+.I XkbSelectEvents.
+
+The XkbBellNotify event has no event details. It is either selected or it is not. 
+However, you can call 
+.I XkbSelectEventDetails 
+using XkbBellNotify as the 
+.I event_type 
+and specifying XkbAllBellNotifyMask in 
+.I bits_to_change 
+and 
+.I values_for_bits. 
+This has the same effect as a call to 
+.I XkbSelectEvents.
+
+The structure for the XkbBellNotify event type contains:
+.nf
+
+   typedef struct _XkbBellNotify {
+       int            type;        /\(** Xkb extension base event code */
+       unsigned long  serial;      /\(** X server serial number for event */
+       Bool           send_event;  /\(** True => synthetically generated */
+       Display *      display;     /\(** server connection where event generated */
+       Time           time;        /\(** server time when event generated */
+       int            xkb_type;    /\(** XkbBellNotify */
+       unsigned int   device;      /\(** Xkb device ID, will not be XkbUseCoreKbd */
+       int            percent;     /\(** requested volume as % of max */
+       int            pitch;       /\(** requested pitch in Hz */
+       int            duration;    /\(** requested duration in microseconds */
+       unsigned int   bell_class;  /\(** X input extension feedback class */
+       unsigned int   bell_id;     /\(** X input extension feedback ID */
+       Atom           name;        /\(** "name" of requested bell */
+       Window         window;      /\(** window associated with event */
+       Bool           event_only;  /\(** False -> the server did not produce a beep */
+   } XkbBellNotifyEvent;
+   
+.fi   
+If your application needs to generate visual bell feedback on the screen when it 
+receives 
+a bell event, use the window ID in the XkbBellNotifyEvent, if present.
+
+.SH "SEE ALSO"
+.BR XBell (__libmansuffix__),
+.BR XkbBell (__libmansuffix__),
+.BR XkbChangeEnabledControls (__libmansuffix__),
+.BR XkbForceDeviceBell (__libmansuffix__),
+.BR XkbSelectEventDetails (__libmansuffix__),
+.BR XkbSelectEvents (__libmansuffix__)
diff --git a/man/xkb/XkbForceDeviceBell.man b/man/xkb/XkbForceDeviceBell.man
new file mode 100644 (file)
index 0000000..6419dec
--- /dev/null
@@ -0,0 +1,299 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbForceDeviceBell __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbForceDeviceBell \- Rings the bell on any keyboard, overriding user preference 
+settings for audible bells
+.SH SYNOPSIS
+.HP
+.B Bool XkbForceDeviceBell
+.BI "(\^Display *" "display" "\^,"
+.BI "Window " "window" "\^,"
+.BI "unsigned int " "device_spec" "\^,"
+.BI "unsigned int " "bell_class" "\^,"
+.BI "unsigned int " "bell_id" "\^,"
+.BI "int " "percent" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- display
+connection to the X server
+.TP
+.I \- window
+event window, or None
+.TP
+.I \- device_spec
+device ID, or XkbUseCoreKbd
+.TP
+.I \- bell_class
+input extension class of the bell to be rung 
+.TP
+.I \- bell_id
+input extension ID of the bell to be rung
+.TP
+.I \- percent
+relative volume, which can range from -100 to 100 inclusive 
+.SH DESCRIPTION
+.LP
+The core X protocol allows only applications to explicitly sound the system bell 
+with a 
+given duration, pitch, and volume. Xkb extends this capability by allowing clients 
+to 
+attach symbolic names to bells, disable audible bells, and receive an event 
+whenever the 
+keyboard bell is rung. For the purposes of this document, the 
+.I audible 
+bell is defined to be the system bell, or the default keyboard bell, as opposed to 
+any 
+other audible sound generated elsewhere in the system. 
+You can ask to receive XkbBellNotify events when any client rings any one of the 
+following:
+
+.IP \(bu 5
+The default bell
+.IP \(bu 5
+Any bell on an input device that can be specified by a bell_class and bell_id pair
+.IP \(bu 5
+Any bell specified only by an arbitrary name. (This is, from the server's point of 
+view, 
+merely a name, and not connected with any physical sound-generating device. Some 
+client 
+application must generate the sound, or visual feedback, if any, that is associated 
+with 
+the name.)
+
+.LP
+You can also ask to receive XkbBellNotify events when the server rings the default 
+bell 
+or if any client has requested events only (without the bell sounding) for any of 
+the 
+bell types previously listed.
+
+You can disable audible bells on a global basis. For example, a client that 
+replaces the 
+keyboard bell with some other audible cue might want to turn off the AudibleBell 
+control 
+to prevent the server from also generating a sound and avoid cacophony. If you 
+disable 
+audible bells and request to receive XkbBellNotify events, you can generate 
+feedback 
+different from the default bell.
+
+You can, however, override the AudibleBell control by calling one of the functions 
+that 
+force the ringing of a bell in spite of the setting of the AudibleBell control - 
+.I XkbForceDeviceBell 
+or 
+.I XkbForceBell. 
+In this case the server does not generate a bell event.
+
+Just as some keyboards can produce keyclicks to indicate when a key is pressed or repeating, Xkb 
+can provide feedback for the controls by using special beep codes. The AccessXFeedback control 
+is used to configure the specific types of operations that generate feedback.
+
+Bell Names
+
+You can associate a name to an act of ringing a bell by converting the name to an Atom 
+and then using this name when you call the functions listed in this chapter. If an event 
+is generated as a result, the name is then passed to all other clients interested in receiving 
+XkbBellNotify events. Note that these are arbitrary names and that there is no binding to any 
+sounds. Any sounds or other effects (such as visual bells on the screen) must be generated by a 
+client application upon receipt of the bell event containing the name. There is no default name 
+for the default keyboard bell. The server does generate some predefined bells for the AccessX 
+controls. These named bells are shown in Table 1; the name is included in any bell event sent to 
+clients that have requested to receive XkbBellNotify events.
+
+.TS
+c s
+l l
+lW(4i) l.
+Table 1 Predefined Bells
+_
+Action Named Bell
+_
+Indicator turned on    AX_IndicatorOn
+Indicator turned off   AX_IndicatorOff
+More than one indicator changed state  AX_IndicatorChange
+Control turned on      AX_FeatureOn
+Control turned off     AX_FeatureOff
+More than one control changed state    AX_FeatureChange
+T{
+SlowKeys and BounceKeys about to be turned on or off
+T}     AX_SlowKeysWarning
+SlowKeys key pressed   AX_SlowKeyPress
+SlowKeys key accepted  AX_SlowKeyAccept
+SlowKeys key rejected  AX_SlowKeyReject
+Accepted SlowKeys key released AX_SlowKeyRelease
+BounceKeys key rejected        AX_BounceKeyReject
+StickyKeys key latched AX_StickyLatch
+StickyKeys key locked  AX_StickyLock
+StickyKeys key unlocked        AX_StickyUnlock
+.TE
+
+Audible Bells
+
+Using Xkb you can generate bell events that do not necessarily ring the system bell. This 
+is useful if you need to use an audio server instead of the system beep. For example, 
+when an audio client starts, it could disable the audible bell (the system bell) and then 
+listen for XkbBellNotify events. When it receives a XkbBellNotify event, the audio client could 
+then send a request to an audio server to play a sound.
+
+You can control the audible bells feature by passing the XkbAudibleBellMask to
+.I XkbChangeEnabledControls. 
+If you set XkbAudibleBellMask on, the server rings the system bell when a bell event occurs. 
+This is the default. If you set XkbAudibleBellMask off and a bell event occurs, the server does 
+not ring the system bell unless you call 
+.I XkbForceDeviceBell 
+or 
+.I XkbForceBell.
+
+Audible bells are also part of the per-client auto-reset controls.
+
+Bell Functions
+
+Use the functions described in this section to ring bells and to generate bell events. 
+
+The input extension has two types of feedbacks that can generate bells - bell feedback and 
+keyboard feedback. Some of the functions in this section have
+.I bell_class 
+and 
+.I bell_id 
+parameters; set them as follows: Set 
+.I bell_class 
+to BellFeedbackClass or KbdFeedbackClass. A device can have more than one feedback of each type; 
+set 
+.I bell_id 
+to the particular bell feedback of 
+.I bell_class 
+type.
+
+Table 2 shows the conditions that cause a bell to sound or an XkbBellNotifyEvent to be generated 
+when a bell function is called.
+
+.TS
+c s s s
+l l l l
+l l l l.
+Table 2 Bell Sounding and Bell Event Generating
+_
+Function called        AudibleBell     Server sounds a bell    Server sends an 
+XkbBellNotifyEvent
+_
+XkbDeviceBell  On      Yes     Yes
+XkbDeviceBell  Off     No      Yes
+XkbBell        On      Yes     Yes
+XkbBell        Off     No      Yes
+XkbDeviceBellEvent     On or Off       No      Yes
+XkbBellEvent   On or Off       No      Yes
+XkbDeviceForceBell     On or Off       Yes     No
+XkbForceBell   On or Off       Yes     No
+.TE
+
+
+If a compatible keyboard extension isn't present in the X server, 
+.I XkbForceDeviceBell 
+immediately returns False. Otherwise, 
+.I XkbForceDeviceBell 
+rings the bell as specified for the display and keyboard device and returns 
+True. Set 
+.I percent 
+to be the volume relative to the base volume for the keyboard as described for
+.I XBell.
+
+There is no 
+.I name 
+parameter because 
+.I XkbForceDeviceBell 
+does not cause an XkbBellNotify event.
+
+You can call 
+.I XkbBell 
+without first initializing the keyboard extension.
+.SH STRUCTURES
+.LP
+Xkb generates XkbBellNotify events for all bells except for those resulting from 
+calls to 
+.I XkbForceDeviceBell 
+and 
+.I XkbForceBell. 
+To receive XkbBellNotify events under all possible conditions, pass 
+XkbBellNotifyMask in 
+both the 
+.I bits_to_change 
+and 
+.I values_for_bits 
+parameters to 
+.I XkbSelectEvents.
+
+The XkbBellNotify event has no event details. It is either selected or it is not. 
+However, you can call 
+.I XkbSelectEventDetails 
+using XkbBellNotify as the 
+.I event_type 
+and specifying XkbAllBellNotifyMask in 
+.I bits_to_change 
+and 
+.I values_for_bits. 
+This has the same effect as a call to 
+.I XkbSelectEvents.
+
+The structure for the XkbBellNotify event type contains:
+.nf
+
+   typedef struct _XkbBellNotify {
+       int            type;        /\(** Xkb extension base event code */
+       unsigned long  serial;      /\(** X server serial number for event */
+       Bool           send_event;  /\(** True => synthetically generated */
+       Display *      display;     /\(** server connection where event generated */
+       Time           time;        /\(** server time when event generated */
+       int            xkb_type;    /\(** XkbBellNotify */
+       unsigned int   device;      /\(** Xkb device ID, will not be XkbUseCoreKbd */
+       int            percent;     /\(** requested volume as % of max */
+       int            pitch;       /\(** requested pitch in Hz */
+       int            duration;    /\(** requested duration in microseconds */
+       unsigned int   bell_class;  /\(** X input extension feedback class */
+       unsigned int   bell_id;     /\(** X input extension feedback ID */
+       Atom           name;        /\(** "name" of requested bell */
+       Window         window;      /\(** window associated with event */
+       Bool           event_only;  /\(** False -> the server did not produce a beep */
+   } XkbBellNotifyEvent;
+   
+.fi   
+If your application needs to generate visual bell feedback on the screen when it 
+receives 
+a bell event, use the window ID in the XkbBellNotifyEvent, if present.
+.SH "SEE ALSO"
+.BR XBell (__libmansuffix__),
+.BR XkbBell (__libmansuffix__),
+.BR XkbBellNotify (__libmansuffix__),
+.BR XkbChangeEnabledControls (__libmansuffix__),
+.BR XkbDeviceBell (__libmansuffix__),
+.BR XkbForceBell (__libmansuffix__),
+.BR XkbForceDeviceBell (__libmansuffix__),
+.BR XkbSelectEventDetails (__libmansuffix__),
+.BR XkbSelectEvents (__libmansuffix__)
+
+
+
+
diff --git a/man/xkb/XkbFreeClientMap.man b/man/xkb/XkbFreeClientMap.man
new file mode 100644 (file)
index 0000000..2eb2d68
--- /dev/null
@@ -0,0 +1,201 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbFreeClientMap __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbFreeClientMap \- Free memory used by the client map member of an XkbDescRec 
+structure
+.SH SYNOPSIS
+.HP
+.B void XkbFreeClientMap
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "unsigned int " "which" "\^,"
+.BI "Bool " "free_all" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+keyboard description containing client map to free
+.TP
+.I \- which
+mask identifying components of map to free
+.TP
+.I \- free_all
+True => free all client components and map itself 
+.SH DESCRIPTION
+.LP
+.I XkbFreeClientMap 
+frees the components of client map specified by 
+.I which 
+in the XkbDescRec structure specified by the 
+.I xkb 
+parameter and sets the corresponding structure component values to NULL. The
+.I which 
+parameter specifies a combination of the client map masks shown in Table 1.
+
+If 
+.I free_all 
+is True, 
+.I which 
+is ignored; 
+.I XkbFreeClientMap 
+frees every non-NULL structure component in the client map, frees the 
+XkbClientMapRec 
+structure referenced by the 
+.I map 
+member of the 
+.I xkb 
+parameter, and sets the 
+.I map 
+member to NULL.
+
+.TS
+c s
+l l
+l lw(4i).
+Table 1 XkbAllocClientMap Masks
+_
+Mask   Effect
+_
+XkbKeyTypesMask        T{
+The type_count field specifies the number of entries to preallocate for the 
+types field of the client map. If the type_count field is less than 
+XkbNumRequiredTypes returns BadValue.
+T}
+.sp
+XkbKeySymsMask T{
+The min_key_code and max_key_code fields of the xkb parameter are used to 
+allocate the syms and key_sym_map fields of the client map. The fields are 
+allocated to contain the maximum number of entries necessary for max_key_code - 
+min_key_code + 1 keys.
+T}
+.sp
+XkbModifierMapMask     T{
+The min_key_code and max_key_code fields of the xkb parameter are used to 
+allocate the modmap field of the client map. The field is allocated to contain 
+the maximum number of entries necessary for max_key_code - min_key_code + 1 
+keys.
+T}
+.TE
+
+NOTE: The 
+.I min_key_code 
+and 
+.I max_key_code 
+fields of the 
+.I xkb 
+parameter must be legal values if the XkbKeySymsMask or XkbModifierMapMask masks 
+are set in the 
+.I which 
+parameter. If they are not valid, 
+.I XkbAllocClientMap 
+returns BadValue. 
+.SH STRUCTURES
+.LP
+The complete description of an Xkb keyboard is given by an XkbDescRec. The 
+component 
+structures in the XkbDescRec represent the major Xkb components.
+
+.nf
+typedef struct {
+   struct _XDisplay * display;      /\(** connection to X server */
+   unsigned short     flags;        /\(** private to Xkb, do not modify */
+   unsigned short     device_spec;  /\(** device of interest */
+   KeyCode            min_key_code; /\(** minimum keycode for device */
+   KeyCode            max_key_code; /\(** maximum keycode for device */
+   XkbControlsPtr     ctrls;        /\(** controls */
+   XkbServerMapPtr    server;       /\(** server keymap */
+   XkbClientMapPtr    map;          /\(** client keymap */
+   XkbIndicatorPtr    indicators;   /\(** indicator map */
+   XkbNamesPtr        names;        /\(** names for all components */
+   XkbCompatMapPtr    compat;       /\(** compatibility map */
+   XkbGeometryPtr     geom;         /\(** physical geometry of keyboard */
+} XkbDescRec, *XkbDescPtr;
+
+.fi
+The 
+.I display 
+field points to an X display structure. The 
+.I flags field is private to the library: modifying 
+.I flags 
+may yield unpredictable results. The 
+.I device_spec 
+field specifies the device identifier of the keyboard input device, or 
+XkbUseCoreKeyboard, which specifies the core keyboard device. The 
+.I min_key_code
+and 
+.I max_key_code 
+fields specify the least and greatest keycode that can be returned by the 
+keyboard. 
+
+Each structure component has a corresponding mask bit that is used in function 
+calls to 
+indicate that the structure should be manipulated in some manner, such as 
+allocating it 
+or freeing it. These masks and their relationships to the fields in the 
+XkbDescRec are 
+shown in Table 2.
+
+.TS
+c s s
+l l l
+l l l.
+Table 2 Mask Bits for XkbDescRec
+_
+Mask Bit       XkbDescRec Field        Value
+_
+XkbControlsMask        ctrls   (1L<<0)
+XkbServerMapMask       server  (1L<<1)
+XkbIClientMapMask      map     (1L<<2)
+XkbIndicatorMapMask    indicators      (1L<<3)
+XkbNamesMask   names   (1L<<4)
+XkbCompatMapMask       compat  (1L<<5)
+XkbGeometryMask        geom    (1L<<6)
+XkbAllComponentsMask   All Fields      (0x7f)
+.TE
+
+The 
+.I map 
+field of the complete Xkb keyboard description is a pointer to the Xkb client 
+map, which is 
+of type XkbClientMapRec:
+.nf
+   typedef struct {                   /\(** Client Map */
+      unsigned char     size_types;   /\(** # occupied entries in types */
+      unsigned char     num_types;    /\(** # entries in types */
+      XkbKeyTypePtr     types;        /\(** vector of key types used by this keymap */
+      unsigned short    size_syms;    /\(** length of the syms array */
+      unsigned short    num_syms;     /\(** # entries in syms */
+      KeySym *          syms;         /\(** linear 2d tables of keysyms, 1 per key */
+      XkbSymMapPtr      key_sym_map;  /\(** 1 per keycode, maps keycode to syms */
+      unsigned char *   modmap;       /\(** 1 per keycode, real mods bound to key */
+} XkbClientMapRec, *XkbClientMapPtr;
+
+.fi
+.SH DIAGNOSTICS
+.TP 15
+.B BadValue
+An argument is out of range
+.SH "SEE ALSO"
+.BR XkbAllocClientMap (__libmansuffix__)
diff --git a/man/xkb/XkbFreeCompatMap.man b/man/xkb/XkbFreeCompatMap.man
new file mode 100644 (file)
index 0000000..2675394
--- /dev/null
@@ -0,0 +1,164 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbFreeCompatMap __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbFreeCompatMap \- Free an entire compatibility map or selected portions of one
+.SH SYNOPSIS
+.HP
+.B void XkbFreeCompatMap
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "unsigned int " "which" "\^,"
+.BI "Bool " "free_map" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+Xkb description in which to free compatibility map
+.TP
+.I \- which
+mask of compatibility map components to free
+.TP
+.I \- free_map
+True => free XkbCompatMap structure itself
+.SH DESCRIPTION
+.LP
+.I which 
+specifies the compatibility map components to be freed (see XkbGetCompatMap). 
+.I which 
+is an inclusive OR of the bits shown in Table 1.
+
+.TS
+c s s
+l l l.
+Table 1 Compatibility Map Component Masks
+_
+Mask   Value   Affecting
+_
+XkbSymInterpMask       (1<<0)  Symbol interpretations
+XkbGroupCompatMask     (1<<1)  Group maps
+XkbAllCompatMask       (0x3)   All compatibility map components
+.TE
+
+.I free_map 
+indicates whether the XkbCompatMap structure itself should be freed. If 
+.I free_map 
+is True, 
+.I which 
+is ignored, all non-NULL compatibility map components are freed, and the 
+.I compat 
+field in the XkbDescRec referenced by 
+.I xkb 
+is set to NULL.
+.SH STRUCTURES
+.LP
+.nf
+
+    typedef struct _XkbCompatMapRec {
+        XkbSymInterpretPtr    sym_interpret;            /\(** symbol based key semantics*/
+        XkbModsRec            groups[XkbNumKbdGroups];  /\(** group => modifier map */
+        unsigned short        num_si;                   /\(** # structures used in sym_interpret */
+        unsigned short        size_si;                  /\(** # structures allocated in sym_interpret */
+    } XkbCompatMapRec, *XkbCompatMapPtr;
+    
+.fi
+
+The complete description of an Xkb keyboard is given by an XkbDescRec. The component 
+structures in the XkbDescRec represent the major Xkb components outlined in Figure 1.1.
+
+.nf
+typedef struct {
+   struct _XDisplay * display;      /\(** connection to X server */
+   unsigned short     flags;        /\(** private to Xkb, do not modify */
+   unsigned short     device_spec;  /\(** device of interest */
+   KeyCode            min_key_code; /\(** minimum keycode for device */
+   KeyCode            max_key_code; /\(** maximum keycode for device */
+   XkbControlsPtr     ctrls;        /\(** controls */
+   XkbServerMapPtr    server;       /\(** server keymap */
+   XkbClientMapPtr    map;          /\(** client keymap */
+   XkbIndicatorPtr    indicators;   /\(** indicator map */
+   XkbNamesPtr        names;        /\(** names for all components */
+   XkbCompatMapPtr    compat;       /\(** compatibility map */
+   XkbGeometryPtr     geom;         /\(** physical geometry of keyboard */
+} XkbDescRec, *XkbDescPtr;
+
+.fi
+The 
+.I display 
+field points to an X display structure. The 
+.I flags field is private to the library: modifying 
+.I flags 
+may yield unpredictable results. The 
+.I device_spec 
+field specifies the device identifier of the keyboard input device, or 
+XkbUseCoreKeyboard, which specifies the core keyboard device. The 
+.I min_key_code
+and 
+.I max_key_code 
+fields specify the least and greatest keycode that can be returned by the keyboard. 
+The other fields specify structure components of the keyboard description and are 
+described in detail in other sections of this document. Table 2 identifies the 
+subsequent sections of this document that discuss the individual components of the 
+XkbDescRec.
+
+.TS
+c s
+l l
+l l.
+Table 2 XkbDescRec Component References
+_
+XkbDescRec Field       For more info
+_
+ctrls  Chapter 10
+server Chapter 16
+map    Chapter 15
+indicators     Chapter 8
+names  Chapter 18
+compat Chapter 17
+geom   Chapter 13
+.TE
+
+Each structure component has a corresponding mask bit that is used in function calls to 
+indicate that the structure should be manipulated in some manner, such as allocating it 
+or freeing it. These masks and their relationships to the fields in the XkbDescRec are 
+shown in Table 3.
+
+.TS
+c s s
+l l l
+l l l.
+Table 3 Mask Bits for XkbDescRec
+_
+Mask Bit       XkbDescRec Field        Value
+_      
+XkbControlsMask        ctrls   (1L<<0)
+XkbServerMapMask       server  (1L<<1)
+XkbIClientMapMask      map     (1L<<2)
+XkbIndicatorMapMask    indicators      (1L<<3)
+XkbNamesMask   names   (1L<<4)
+XkbCompatMapMask       compat  (1L<<5)
+XkbGeometryMask        geom    (1L<<6)
+XkbAllComponentsMask   All Fields      (0x7f)
+.TE
+.SH "SEE ALSO"
+.BR XkbGetCompatMap (__libmansuffix__)
diff --git a/man/xkb/XkbFreeComponentList.man b/man/xkb/XkbFreeComponentList.man
new file mode 100644 (file)
index 0000000..85aa4ef
--- /dev/null
@@ -0,0 +1,44 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbFreeComponentList __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbFreeComponentList \- Free the structure returned by 
+.I XkbListComponents
+.SH SYNOPSIS
+.HP
+.B void XkbFreeComponentList
+.BI "(\^XkbComponentListPtr " "list" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- list
+pointer to XkbComponentListRec to free
+.SH DESCRIPTION
+.LP
+When you are done using the structure returned by 
+.I XkbListComponents, 
+free it using 
+.I XkbFreeComponentList.
+.SH "SEE ALSO"
+.BR XkbListComponents (__libmansuffix__)
diff --git a/man/xkb/XkbFreeControls.man b/man/xkb/XkbFreeControls.man
new file mode 100644 (file)
index 0000000..1b0737b
--- /dev/null
@@ -0,0 +1,113 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbFreeControls __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbFreeControls \- Frees memory used by the ctrls member of an XkbDescRec structure
+.SH SYNOPSIS
+.HP
+.B void XkbFreeControls
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "unsigned int " "which" "\^,"
+.BI "Bool " "free_all" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+Xkb description in which to free controls components
+.TP
+.I \- which
+mask of components of ctrls to free
+.TP
+.I \- free_all
+True => free everything + ctrls itself
+.SH DESCRIPTION
+.LP
+.I XkbFreeControls 
+frees the specified components of the 
+.I ctrls 
+field in the 
+.I xkb 
+keyboard description and sets the corresponding structure component values to NULL or zero. The 
+.I which 
+mask specifies the fields of 
+.I ctrls 
+to be freed and can contain any of the controls components specified in Table 1.
+
+Table 1 shows the actual values for the individual mask bits used to select 
+controls for 
+modification and to enable and disable the control. Note that the same mask bit 
+is used to 
+specify general modifications to the parameters used to configure the control 
+(which), and to 
+enable and disable the control (enabled_ctrls). The anomalies in the table (no 
+"ok" in column) 
+are for controls that have no configurable attributes; and for controls that are 
+not boolean 
+controls and therefore cannot be enabled or disabled.
+
+.TS
+c s s s
+l l l l
+l l l l
+l l l l. 
+Table 1 Controls Mask Bits
+_
+Mask Bit       which or        enabled Value
+       changed_ctrls   _ctrls
+_
+XkbRepeatKeysMask      ok      ok      (1L<<0)
+XkbSlowKeysMask        ok      ok      (1L<<1)
+XkbBounceKeysMask      ok      ok      (1L<<2)
+XkbStickyKeysMask      ok      ok      (1L<<3)
+XkbMouseKeysMask       ok      ok      (1L<<4)
+XkbMouseKeysAccelMask  ok      ok      (1L<<5)
+XkbAccessXKeysMask     ok      ok      (1L<<6)
+XkbAccessXTimeoutMask  ok      ok      (1L<<7)
+XkbAccessXFeedbackMask ok      ok      (1L<<8)
+XkbAudibleBellMask             ok      (1L<<9)
+XkbOverlay1Mask                ok      (1L<<10)
+XkbOverlay2Mask                ok      (1L<<11)
+XkbIgnoreGroupLockMask         ok      (1L<<12)
+XkbGroupsWrapMask      ok              (1L<<27)
+XkbInternalModsMask    ok              (1L<<28)
+XkbIgnoreLockModsMask  ok              (1L<<29)
+XkbPerKeyRepeatMask    ok              (1L<<30)
+XkbControlsEnabledMask ok              (1L<<31)
+XkbAccessXOptionsMask  ok      ok      (XkbStickyKeysMask | 
+                       XkbAccessXFeedbackMask)
+XkbAllBooleanCtrlsMask         ok      (0x00001FFF) 
+XkbAllControlsMask     ok              (0xF8001FFF)
+.TE
+
+If 
+.I free_all 
+is True, 
+.I XkbFreeControls 
+frees every non-NULL structure component in the controls, frees the XkbControlsRec structure referenced by the 
+.I ctrls 
+member of 
+.I xkb, 
+and sets 
+.I ctrls 
+to NULL.
diff --git a/man/xkb/XkbFreeDeviceInfo.man b/man/xkb/XkbFreeDeviceInfo.man
new file mode 100644 (file)
index 0000000..10fb37e
--- /dev/null
@@ -0,0 +1,176 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbFreeDeviceInfo __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbFreeDeviceInfo \- Free an XkbDeviceInfoRec structure
+.SH SYNOPSIS
+.HP
+.B void XkbFreeDeviceInfo
+.BI "(\^XkbDeviceInfoPtr " "device_info" "\^,"
+.BI "unsigned int " "which" "\^,"
+.BI "Bool " "free_all" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- device_info
+pointer to XkbDeviceInfoRec in which to free items
+.TP
+.I \- which
+mask of components of device_info to free
+.TP
+.I \- free_all
+True => free everything, including device_info
+.SH DESCRIPTION
+.LP
+If 
+.I free_all 
+is True, the 
+.I XkbFreeDeviceInfo 
+frees all components of 
+.I device_info 
+and the XkbDeviceInfoRec structure pointed to by 
+.I device_info 
+itself. If 
+.I free_all 
+is False, the value of 
+.I which 
+determines which subcomponents are freed. 
+.I which 
+is an inclusive OR of one or more of the values from Table 1. If 
+.I which 
+contains XkbXI_ButtonActionsMask, all button actions associated with 
+.I device_info 
+are freed, 
+.I device_info->btn_acts 
+is set to NULL, and 
+.I device_info->num_btns 
+is set to zero. If 
+.I which 
+contains all bits in XkbXI_IndicatorsMask, all XkbDeviceLedInfoRec structures associated with 
+.I device_info 
+are freed, 
+.I device_info->leds 
+is set to NULL, and 
+.I device_info->sz_leds 
+and 
+.I device_info->num_leds 
+are set to zero. If 
+.I which 
+contains XkbXI_IndicatorMapsMask, all indicator maps associated with 
+.I device_info 
+are cleared, but the number of LEDs and the leds structures themselves is preserved. If 
+.I which 
+contains XkbXI_IndicatorNamesMask, all indicator names associated with
+.I device_info 
+are cleared, but the number of LEDs and the leds structures themselves is preserved. If 
+.I which 
+contains XkbXI_IndicatorStateMask, the indicator state associated with the
+.I device_info 
+leds are set to zeros but the number of LEDs and the leds structures themselves is preserved.
+.bp
+.nf
+                         Table 1 XkbDeviceInfoRec Mask Bits                        
+____________________________________________________________________________________
+Name                         XkbDeviceInfoRec Value     Capability If Set
+                             Fields Effected            
+____________________________________________________________________________________
+XkbXI_KeyboardsMask                           (1L <<0) Clients can use all
+                                                       Xkb requests and events
+                                                       with KeyClass devices 
+                                                       supported by the input
+                                                       device extension.
+
+XkbXI_ButtonActionsMask       num_btns        (1L <<1) Clients can assign key 
+                              btn_acts                 actions to buttons 
+                                                       non-KeyClass input
+                                                       extension devices.
+                           
+XkbXI_IndicatorNamesMask      leds->names     (1L <<2) Clients can assign
+                                                       names to indicators on
+                                                       non-KeyClass input
+                                                       extension devices.
+                                                             
+XkbXI_IndicatorMapsMask       leds->maps      (1L <<3) Clients can assign
+                                                       indicator maps to
+                                                       indicators on 
+                                                       non-KeyClass input
+                                                       extension devices.
+
+XkbXI_IndicatorStateMask      leds->state     (1L <<4) Clients can request 
+                                                       the status of indicators
+                                                       on non-KeyClass input
+                                                       extension devices.
+
+XkbXI_IndicatorsMask          sz_leds         (0x1c)   XkbXI_IndicatorNamesMask |
+                              num_leds                 XkbXI_IndicatorMapsMask |
+                              leds->*                  XkbXI_IndicatorStateMask
+
+XkbXI_UnsupportedFeaturesMask unsupported     (1L <<15)
+
+XkbXI_AllDeviceFeaturesMask   Those selected  (0x1e)   XkbXI_IndicatorsMask |
+                              by Value Column          XkbSI_ButtonActionsMask
+                              masks 
+
+XkbXI_AllFeaturesMask         Those selected  (0x1f)   XkbSI_AllDeviceFeaturesMask |
+                              by Value Column          XkbSI_KeyboardsMask
+                              masks
+
+XkbXI_AllDetailsMask          Those selected  (0x801f) XkbXI_AllFeaturesMask |
+                              by Value column          XkbXI_UnsupportedFeaturesMask
+                              masks
+.fi
+.SH STRUCTURES
+.LP
+Information about X Input Extension devices is transferred between a client program and the Xkb 
+extension in an XkbDeviceInfoRec structure:
+.nf
+
+typedef struct {
+    char *               name;          /\(** name for device */
+    Atom                 type;          /\(** name for class of devices */
+    unsigned short       device_spec;   /\(** device of interest */
+    Bool                 has_own_state; /\(** True=>this device has its own state */
+    unsigned short       supported;     /\(** bits indicating supported capabilities */
+    unsigned short       unsupported;   /\(** bits indicating unsupported capabilities */
+    unsigned short       num_btns;      /\(** number of entries in btn_acts */
+    XkbAction *          btn_acts;      /\(** button actions */
+    unsigned short       sz_leds;       /\(** total number of entries in LEDs vector */
+    unsigned short       num_leds;      /\(** number of valid entries in LEDs vector */
+    unsigned short       dflt_kbd_fb;   /\(** input extension ID of default (core kbd) indicator */
+    unsigned short       dflt_led_fb;   /\(** input extension ID of default indicator feedback */
+    XkbDeviceLedInfoPtr  leds;          /\(** LED descriptions */
+} XkbDeviceInfoRec, *XkbDeviceInfoPtr;
+    
+typedef struct {
+    unsigned short      led_class;        /\(** class for this LED device*/
+    unsigned short      led_id;           /\(** ID for this LED device */
+    unsigned int        phys_indicators;  /\(** bits for which LEDs physically present */
+    unsigned int        maps_present;     /\(** bits for which LEDs have maps in maps */
+    unsigned int        names_present;    /\(** bits for which LEDs are in names */
+    unsigned int        state;            /\(** 1 bit => corresponding LED is on */
+    Atom                names[XkbNumIndicators];   /\(** names for LEDs */
+    XkbIndicatorMapRec  maps;             /\(** indicator maps for each LED */
+} XkbDeviceLedInfoRec, *XkbDeviceLedInfoPtr;
+
+.fi    
diff --git a/man/xkb/XkbFreeGeomColors.man b/man/xkb/XkbFreeGeomColors.man
new file mode 100644 (file)
index 0000000..76ebf38
--- /dev/null
@@ -0,0 +1,80 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbFreeGeomColors __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbFreeGeomColors \- Free geometry colors
+.SH SYNOPSIS
+.HP
+.B void XkbFreeGeomColors
+.BI "(\^XkbGeometryPtr " "geom" "\^,"
+.BI "int " "first" "\^,"
+.BI "int " "count" "\^,"
+.BI "Bool " "free_all" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- geom
+geometry in which colors should be freed 
+.TP
+.I \- first
+first color to be freed 
+.TP
+.I \- count
+number of colors to be freed
+.TP
+.I \- free_all
+True => all colors are freed
+.SH DESCRIPTION
+.LP
+Xkb provides a number of functions to allocate and free subcomponents of a 
+keyboard geometry. Use these functions to create or modify keyboard geometries. 
+Note that these functions merely allocate space for the new element(s), and it 
+is up to you to fill in the values explicitly in your code. These allocation 
+functions increase 
+.I sz_* 
+but never touch 
+.I num_* 
+(unless there is an allocation failure, in which case they reset both 
+.I sz_* 
+and 
+.I num_* 
+to zero). These functions return Success if they succeed, BadAlloc if they are 
+not able to allocate space, or BadValue if a parameter is not as expected.
+
+If 
+.I free_all 
+is True, all colors are freed regardless of the value of 
+.I first
+or 
+.I count. 
+Otherwise, 
+.I count 
+colors are freed beginning with the one specified by 
+.I first.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbFreeGeomDoodads.man b/man/xkb/XkbFreeGeomDoodads.man
new file mode 100644 (file)
index 0000000..9371a8c
--- /dev/null
@@ -0,0 +1,78 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbFreeGeomDoodads __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbFreeGeomDoodads \- Free geometry doodads
+.SH SYNOPSIS
+.HP
+.B void XkbFreeGeomDoodads
+.BI "(\^XkbDoodadPtr " "doodads" "\^,"
+.BI "int " "count" "\^,"
+.BI "Bool " "free_all" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- doodads
+doodads to be freed 
+.TP
+.I \- count
+number of doodads to be freed
+.TP
+.I \- free_all
+True => all doodads are freed
+.SH DESCRIPTION
+.LP
+Xkb provides a number of functions to allocate and free subcomponents of a 
+keyboard geometry. Use these functions to create or modify keyboard geometries. 
+Note that these functions merely allocate space for the new element(s), and it 
+is up to you to fill in the values explicitly in your code. These allocation 
+functions increase 
+.I sz_* 
+but never touch 
+.I num_* 
+(unless there is an allocation failure, in which case they reset both 
+.I sz_* 
+and 
+.I num_* 
+to zero). These functions return Success if they succeed, BadAlloc if they are 
+not able to allocate space, or BadValue if a parameter is not as expected.
+
+If 
+.I free_all 
+is True, all doodads in the array are freed, regardless of the value of 
+.I count. 
+Otherwise, 
+.I count 
+doodads are freed.
+.SH "RETURN VALUES"
+.TP 15
+Success
+The XkbFreeGeomDoodads function returns Success if there are no allocation 
+errors.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbFreeGeomKeyAliases.man b/man/xkb/XkbFreeGeomKeyAliases.man
new file mode 100644 (file)
index 0000000..15ad0b2
--- /dev/null
@@ -0,0 +1,89 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbFreeGeomKeyAliases __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbFreeGeomKeyAliases \- Free geometry key aliases
+.SH SYNOPSIS
+.HP
+.B void XkbFreeGeomKeyAliases
+.BI "(\^XkbGeometryPtr " "geom" "\^,"
+.BI "int " "first" "\^,"
+.BI "int " "count" "\^,"
+.BI "Bool " "free_all" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- geom
+geometry in which key aliases should be freed
+.TP
+.I \- first
+first key alias to be freed
+.TP
+.I \- count
+number of key aliases to be freed
+.TP
+.I \- free_all
+True => all key aliases are freed
+.SH DESCRIPTION
+.LP
+Xkb provides a number of functions to allocate and free subcomponents of a 
+keyboard geometry. Use these functions to create or modify keyboard geometries. 
+Note that these functions merely allocate space for the new element(s), and it 
+is up to you to fill in the values explicitly in your code. These allocation 
+functions increase 
+.I sz_* 
+but never touch 
+.I num_* 
+(unless there is an allocation failure, in which case they reset both 
+.I sz_* 
+and 
+.I num_* 
+to zero). These functions return Success if they succeed, BadAlloc if they are 
+not able to allocate space, or BadValue if a parameter is not as expected.
+
+If 
+.I free_all 
+is True, all aliases in the top level of the specified geometry 
+.I geom 
+are freed regardless of the value of 
+.I first 
+or 
+.I count. 
+Otherwise, 
+.I count 
+aliases in 
+.I geom 
+are freed beginning with the one specified by 
+.I first.
+.SH "RETURN VALUES"
+.TP 15
+Success
+The XkbFreeGeomKeyAliases function returns Success if there are no allocation 
+errors.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbFreeGeomKeys.man b/man/xkb/XkbFreeGeomKeys.man
new file mode 100644 (file)
index 0000000..a99e2d4
--- /dev/null
@@ -0,0 +1,58 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbFreeGeomKeys __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbFreeGeomKeys \-  Free geometry keys
+.SH SYNOPSIS
+.HP
+.B void XkbFreeGeomKeys
+.BI "(\^XkbRowPtr " "row" "\^,"
+.BI "int " "first" "\^,"
+.BI "int " "count" "\^,"
+.BI "Bool " "free_all" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- row
+row in which keys should be freed 
+.TP
+.I \- first
+first key to be freed
+.TP
+.I \- count
+number of keys to be freed
+.TP
+.I \- free_all
+True => all keys are freed
+.SH DESCRIPTION
+.LP
+If 
+.I free_all 
+is True, all keys are freed regardless of the value of 
+.I first 
+or 
+.I count. 
+Otherwise, 
+.I count 
+keys are freed beginning with the one specified by 
+.I first.
diff --git a/man/xkb/XkbFreeGeomOutlines.man b/man/xkb/XkbFreeGeomOutlines.man
new file mode 100644 (file)
index 0000000..0aa5a34
--- /dev/null
@@ -0,0 +1,58 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbFreeGeomOutlines __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbFreeGeomOutlines \- Free geometry outlines
+.SH SYNOPSIS
+.HP
+.B void XkbFreeGeomOutlines
+.BI "(\^XkbShapePtr " "shape" "\^,"
+.BI "int " "first" "\^,"
+.BI "int " "count" "\^,"
+.BI "Bool " "free_all" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- shape
+shape in which outlines should be freed
+.TP
+.I \- first
+first outline to be freed
+.TP
+.I \- count
+number of outlines to be freed
+.TP
+.I \- free_all
+True => all outlines are freed
+.SH DESCRIPTION
+.LP
+If 
+.I free_all 
+is True, all outlines are freed regardless of the value of 
+.I first 
+or 
+.I count. 
+Otherwise, 
+.I count 
+outlines are freed beginning with the one specified by 
+.I first.
diff --git a/man/xkb/XkbFreeGeomOverlayKeys.man b/man/xkb/XkbFreeGeomOverlayKeys.man
new file mode 100644 (file)
index 0000000..f4fb4dc
--- /dev/null
@@ -0,0 +1,86 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbFreeGeomOverlayKeys __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbFreeGeomOverlayKeys \- Free keys in an overlay row
+.SH SYNOPSIS
+.HP
+.B void XkbFreeGeomOverlayKeys
+.BI "(\^XkbRowPtr " "row" "\^,"
+.BI "int " "first" "\^,"
+.BI "int " "count" "\^,"
+.BI "Bool " "free_all" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- row
+row in which keys should be freed 
+.TP
+.I \- first
+first key to be freed
+.TP
+.I \- count
+number of keys to be freed
+.TP
+.I \- free_all
+True => all keys are freed
+.SH DESCRIPTION
+.LP
+Xkb provides a number of functions to allocate and free subcomponents of a 
+keyboard geometry. Use these functions to create or modify keyboard geometries. 
+Note that these functions merely allocate space for the new element(s), and it 
+is up to you to fill in the values explicitly in your code. These allocation 
+functions increase 
+.I sz_* 
+but never touch 
+.I num_* 
+(unless there is an allocation failure, in which case they reset both 
+.I sz_* 
+and 
+.I num_* 
+to zero). These functions return Success if they succeed, BadAlloc if they are 
+not able to allocate space, or BadValue if a parameter is not as expected.
+
+If 
+.I free_all 
+is True, all keys are freed regardless of the value of 
+.I first 
+and 
+.I count. 
+Otherwise, the number of keys specified by 
+.I count 
+are freed, beginning with the key specified by 
+.I first 
+in the specified row.
+.SH "RETURN VALUES"
+.TP 15
+Success
+The XkbFreeGeomOverlayKeys function returns Success if there are no allocation 
+or argument errors.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbFreeGeomOverlayRows.man b/man/xkb/XkbFreeGeomOverlayRows.man
new file mode 100644 (file)
index 0000000..0371c01
--- /dev/null
@@ -0,0 +1,86 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbFreeGeomOverlayRows __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbFreeGeomOverlayRows \- Free rows in an overlay
+.SH SYNOPSIS
+.HP
+.B void XkbFreeGeomOverlayRows
+.BI "(\^XkbSectionPtr " "overlay" "\^,"
+.BI "int " "first" "\^,"
+.BI "int " "count" "\^,"
+.BI "Bool " "free_all" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- overlay
+section in which rows should be freed
+.TP
+.I \- first
+first row to be freed
+.TP
+.I \- count
+number of rows to be freed
+.TP
+.I \- free_all
+True => all rows are freed
+.SH DESCRIPTION
+.LP
+Xkb provides a number of functions to allocate and free subcomponents of a 
+keyboard geometry. Use these functions to create or modify keyboard geometries. 
+Note that these functions merely allocate space for the new element(s), and it 
+is up to you to fill in the values explicitly in your code. These allocation 
+functions increase 
+.I sz_* 
+but never touch 
+.I num_* 
+(unless there is an allocation failure, in which case they reset both 
+.I sz_* 
+and 
+.I num_* 
+to zero). These functions return Success if they succeed, BadAlloc if they are 
+not able to allocate space, or BadValue if a parameter is not as expected.
+
+If 
+.I free_all 
+is True, all rows are freed regardless of the value of 
+.I first 
+and 
+.I count. 
+Otherwise, the number of rows specified by 
+.I count 
+are freed, beginning with the row specified by 
+.I first 
+in the specified overlay.
+.SH "RETURN VALUES"
+.TP 15
+Success
+The XkbFreeGeomOverlayRows function returns Success if there are no allocation 
+or argument errors.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbFreeGeomOverlays.man b/man/xkb/XkbFreeGeomOverlays.man
new file mode 100644 (file)
index 0000000..399df3c
--- /dev/null
@@ -0,0 +1,86 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbFreeGeomOverlays __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbFreeGeomOverlays \- Free rows in a section
+.SH SYNOPSIS
+.HP
+.B void XkbFreeGeomOverlays
+.BI "(\^XkbSectionPtr " "section" "\^,"
+.BI "int " "first" "\^,"
+.BI "int " "count" "\^,"
+.BI "Bool " "free_all" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- section
+section in which overlays should be freed 
+.TP
+.I \- first
+first overlay to be freed
+.TP
+.I \- count
+number of overlays to be freed
+.TP
+.I \- free_all
+True => all overlays are freed
+.SH DESCRIPTION
+.LP
+Xkb provides a number of functions to allocate and free subcomponents of a 
+keyboard geometry. Use these functions to create or modify keyboard geometries. 
+Note that these functions merely allocate space for the new element(s), and it 
+is up to you to fill in the values explicitly in your code. These allocation 
+functions increase 
+.I sz_* 
+but never touch 
+.I num_* 
+(unless there is an allocation failure, in which case they reset both 
+.I sz_* 
+and 
+.I num_* 
+to zero). These functions return Success if they succeed, BadAlloc if they are 
+not able to allocate space, or BadValue if a parameter is not as expected.
+
+If 
+.I free_all 
+is True, all overlays are freed regardless of the value of 
+.I first 
+and 
+.I count. 
+Otherwise, the number of overlays specified by 
+.I count 
+are freed, beginning with the overlay specified by 
+.I first 
+in the specified section.
+.SH "RETURN VALUES"
+.TP 15
+Success
+The XkbFreeGeomOverlays functions returns Success if there are no allocation or 
+argument errors.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbFreeGeomPoints.man b/man/xkb/XkbFreeGeomPoints.man
new file mode 100644 (file)
index 0000000..7f62191
--- /dev/null
@@ -0,0 +1,86 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbFreeGeomPoints __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbFreeGeomPoints \- Free points in a outline
+.SH SYNOPSIS
+.HP
+.B void XkbFreeGeomPoints
+.BI "(\^XkbOutlinePtr " "outline" "\^,"
+.BI "int " "first" "\^,"
+.BI "int " "count" "\^,"
+.BI "Bool " "free_all" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- outline
+outline in which points should be freed
+.TP
+.I \- first
+first point to be freed
+.TP
+.I \- count
+number of points to be freed
+.TP
+.I \- free_all
+True => all points are freed 
+.SH DESCRIPTION
+.LP
+Xkb provides a number of functions to allocate and free subcomponents of a 
+keyboard geometry. Use these functions to create or modify keyboard geometries. 
+Note that these functions merely allocate space for the new element(s), and it 
+is up to you to fill in the values explicitly in your code. These allocation 
+functions increase 
+.I sz_* 
+but never touch 
+.I num_* 
+(unless there is an allocation failure, in which case they reset both 
+.I sz_* 
+and 
+.I num_* 
+to zero). These functions return Success if they succeed, BadAlloc if they are 
+not able to allocate space, or BadValue if a parameter is not as expected.
+
+If 
+.I free_all 
+is True, all points are freed regardless of the value of 
+>i first 
+and 
+.I count. 
+Otherwise, the number of points specified by 
+.I count 
+are freed, beginning with the point specified by 
+.I first 
+in the specified outline.
+.SH "RETURN VALUES"
+.TP 15
+Success
+The XkbFreeGeomPoints function returns Success when there are no allocation or 
+argument errors.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbFreeGeomProperties.man b/man/xkb/XkbFreeGeomProperties.man
new file mode 100644 (file)
index 0000000..b1d9b92
--- /dev/null
@@ -0,0 +1,85 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbFreeGeomProperties __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbFreeGeomProperties \- Free geometry properties
+.SH SYNOPSIS
+.HP
+.B void XkbFreeGeomProperties
+.BI "(\^XkbGeometryPtr " "geom" "\^,"
+.BI "int " "first" "\^,"
+.BI "int " "count" "\^,"
+.BI "Bool *" "free_all" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- geom
+geometry in which properties should be freed
+.TP
+.I \- first
+first property to be freed 
+.TP
+.I \- count
+number of properties to be freed 
+.TP
+.I \- free_all
+True => all properties are freed
+.SH DESCRIPTION
+.LP
+Xkb provides a number of functions to allocate and free subcomponents of a 
+keyboard geometry. Use these functions to create or modify keyboard geometries. 
+Note that these functions merely allocate space for the new element(s), and it 
+is up to you to fill in the values explicitly in your code. These allocation 
+functions increase 
+.I sz_* 
+but never touch 
+.I num_* 
+(unless there is an allocation failure, in which case they reset both 
+.I sz_* 
+and 
+.I num_* 
+to zero). These functions return Success if they succeed, BadAlloc if they are 
+not able to allocate space, or BadValue if a parameter is not as expected.
+
+If 
+.I free_all 
+is True, all properties are freed regardless of the value of 
+.I first 
+or 
+.I count. 
+Otherwise, 
+.I count 
+properties are freed beginning with the one specified by 
+.I first.
+.SH "RETURN VALUES"
+.TP 15
+Success
+The XkbFreeGeomProperties function returns Success when there are no allocation 
+or argument errors.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbFreeGeomRows.man b/man/xkb/XkbFreeGeomRows.man
new file mode 100644 (file)
index 0000000..ceb489a
--- /dev/null
@@ -0,0 +1,86 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbFreeGeomRows __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbFreeGeomRows \- Free rows in a section
+.SH SYNOPSIS
+.HP
+.B void XkbFreeGeomRows
+.BI "(\^XkbSectionPtr " "section" "\^,"
+.BI "int " "first" "\^,"
+.BI "int " "count" "\^,"
+.BI "Bool " "free_all" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- section
+section in which rows should be freed 
+.TP
+.I \- first
+first row to be freed
+.TP
+.I \- count
+number of rows to be freed
+.TP
+.I \- free_all
+True => all rows are freed
+.SH DESCRIPTION
+.LP
+Xkb provides a number of functions to allocate and free subcomponents of a 
+keyboard geometry. Use these functions to create or modify keyboard geometries. 
+Note that these functions merely allocate space for the new element(s), and it 
+is up to you to fill in the values explicitly in your code. These allocation 
+functions increase 
+.I sz_* 
+but never touch 
+.I num_* 
+(unless there is an allocation failure, in which case they reset both 
+.I sz_* 
+and 
+.I num_* 
+to zero). These functions return Success if they succeed, BadAlloc if they are 
+not able to allocate space, or BadValue if a parameter is not as expected.
+
+If 
+.I free_all 
+is True, all rows are freed regardless of the value of 
+.I first 
+and 
+.I count. 
+Otherwise, the number of rows specified by 
+.I count 
+are freed, beginning with the row specified by 
+.I first 
+in the specified section.
+.SH "RETURN VALUES"
+.TP 15
+Success
+The XkbFreeGeomRows function returns Success when there are no allocation 
+or argument errors.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbFreeGeomSections.man b/man/xkb/XkbFreeGeomSections.man
new file mode 100644 (file)
index 0000000..f67a16a
--- /dev/null
@@ -0,0 +1,86 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbFreeGeomSections __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbFreeGeomSections \- Free geometry sections
+.SH SYNOPSIS
+.HP
+.B void XkbFreeGeomSections
+.BI "(\^XkbGeometryPtr " "geom" "\^,"
+.BI "int " "first" "\^,"
+.BI "int " "count" "\^,"
+.BI "Bool " "free_all" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- geom
+geometry in which sections should be freed
+.TP
+.I \- first
+first section to be freed
+.TP
+.I \- count
+number of sections to be freed 
+.TP
+.I \- free_all
+True => all sections are freed
+.SH DESCRIPTION
+.LP
+Xkb provides a number of functions to allocate and free subcomponents of a 
+keyboard geometry. Use these functions to create or modify keyboard geometries. 
+Note that these functions merely allocate space for the new element(s), and it 
+is up to you to fill in the values explicitly in your code. These allocation 
+functions increase 
+.I sz_* 
+but never touch 
+.I num_* 
+(unless there is an allocation failure, in which case they reset both 
+.I sz_* 
+and 
+.I num_* 
+to zero). These functions return Success if they succeed, BadAlloc if they are 
+not able to allocate space, or BadValue if a parameter is not as expected.
+
+If 
+.I free_all 
+is True, all sections are freed regardless of the value of 
+.I first 
+and 
+.I count. 
+Otherwise, the number of sections specified by 
+.I count 
+are freed, beginning with the section specified by 
+.I first 
+in the specified geometry.
+.SH "RETURN VALUES"
+.TP 15
+Success
+The XkbFreeGeomSections function returns Success when there are no allocation 
+or argument errors.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbFreeGeomShapes.man b/man/xkb/XkbFreeGeomShapes.man
new file mode 100644 (file)
index 0000000..168860f
--- /dev/null
@@ -0,0 +1,85 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbFreeGeomShapes __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbFreeGeomShapes \- Free geometry shapes
+.SH SYNOPSIS
+.HP
+.B void XkbFreeGeomShapes
+.BI "(\^XkbGeometryPtr " "geom" "\^,"
+.BI "int " "first" "\^,"
+.BI "int " "count" "\^,"
+.BI "Bool " "free_all" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- geom
+geometry in which shapes should be freed
+.TP
+.I \- first
+first shape to be freed
+.TP
+.I \- count
+number of shapes to be freed 
+.TP
+.I \- free_all
+True => all shapes are freed
+.SH DESCRIPTION
+.LP
+Xkb provides a number of functions to allocate and free subcomponents of a 
+keyboard geometry. Use these functions to create or modify keyboard geometries. 
+Note that these functions merely allocate space for the new element(s), and it 
+is up to you to fill in the values explicitly in your code. These allocation 
+functions increase 
+.I sz_* 
+but never touch 
+.I num_* 
+(unless there is an allocation failure, in which case they reset both 
+.I sz_* 
+and 
+.I num_* 
+to zero). These functions return Success if they succeed, BadAlloc if they are 
+not able to allocate space, or BadValue if a parameter is not as expected.
+
+If 
+.I free_all 
+is True, all shapes in the geometry are freed regardless of the values of 
+.I first 
+and 
+.I count. 
+Otherwise, 
+.I count 
+shapes are freed, beginning with the shape specified by 
+.I first.
+.SH "RETURN VALUES"
+.TP 15
+Success
+The XkbFreeGeomShapes function returns Success when there are no allocation 
+or argument errors.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbFreeGeometry.man b/man/xkb/XkbFreeGeometry.man
new file mode 100644 (file)
index 0000000..36af778
--- /dev/null
@@ -0,0 +1,91 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbFreeGeometry __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbFreeGeometry \- Free an entire geometry
+.SH SYNOPSIS
+.HP
+.B void XkbFreeGeometry
+.BI "(\^XkbGeometryPtr " "geom" "\^,"
+.BI "unsigned int " "which" "\^,"
+.BI "Bool " "free_all" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- geom
+geometry to be freed
+.TP
+.I \- which
+mask of geometry components to be freed 
+.TP
+.I \- free_all
+True => the entire geometry is freed
+.SH DESCRIPTION
+.LP
+Xkb provides a number of functions to allocate and free subcomponents of a 
+keyboard geometry. Use these functions to create or modify keyboard geometries. 
+Note that these functions merely allocate space for the new element(s), and it 
+is up to you to fill in the values explicitly in your code. These allocation 
+functions increase 
+.I sz_* 
+but never touch 
+.I num_* 
+(unless there is an allocation failure, in which case they reset both 
+.I sz_* 
+and 
+.I num_* 
+to zero). These functions return Success if they succeed, BadAlloc if they are 
+not able to allocate space, or BadValue if a parameter is not as expected.
+
+The values of 
+.I which 
+and 
+.I free_all 
+determine how much of the specified geometry is freed. The valid values for
+.I which 
+are:
+
+.nf
+    #define   XkbGeomPropertiesMask      (1<<0)
+    #define   XkbGeomColorsMask          (1<<1)
+    #define   XkbGeomShapesMask          (1<<2)
+    #define   XkbGeomSectionsMask        (1<<3)
+    #define   XkbGeomDoodadsMask         (1<<4)
+    #define   XkbGeomKeyAliasesMask      (1<<5)
+    #define   XkbGeomAllMask             (0x3f)
+    
+.fi    
+If 
+.I free_all 
+is True, the entire geometry is freed regardless of the value of 
+.I which. 
+Otherwise, the portions of the geometry specified by 
+.I which 
+are freed.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbFreeIndicatorMaps.man b/man/xkb/XkbFreeIndicatorMaps.man
new file mode 100644 (file)
index 0000000..f713757
--- /dev/null
@@ -0,0 +1,48 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbFreeIndicatorMaps __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbFreeIndicatorMaps \- Frees memory used by the 
+.I indicators 
+member of an XkbDescRec structure
+.SH SYNOPSIS
+.HP
+.B void XkbFreeIndicatorMaps
+.BI "(\^XkbDescPtr " "xkb" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+keyboard description structure
+.SH DESCRIPTION
+.LP
+If the 
+.I indicators 
+member of the keyboard description record pointed to by 
+.I xkb 
+is not NULL, 
+.I XkbFreeIndicatorMaps 
+frees the memory associated with the 
+.I indicators 
+member of 
+.I xkb.
diff --git a/man/xkb/XkbFreeKeyboard.man b/man/xkb/XkbFreeKeyboard.man
new file mode 100644 (file)
index 0000000..afa928e
--- /dev/null
@@ -0,0 +1,62 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbFreeKeyboard __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbFreeKeyboard \-  Destroys either an entire XkbDescRec or just some of its 
+members
+.SH SYNOPSIS
+.HP
+.B void XkbFreeKeyboard
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "unsigned int " "which" "\^,"
+.BI "Bool " "free_all" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I xkb
+keyboard description with components to free 
+.TP
+.I which
+mask selecting components to free
+.TP
+.I free_all
+True => free all components and 
+.I xkb
+.SH DESCRIPTION
+.LP
+.I XkbFreeKeyboard 
+frees the components of 
+.I xkb 
+specified by 
+.I which 
+and sets the corresponding values to NULL. If 
+.I
+free_all 
+is True, 
+.I XkbFreeKeyboard 
+frees every non-NULL component of 
+.I xkb 
+and then frees the 
+.I xkb 
+structure itself.
+
diff --git a/man/xkb/XkbFreeNames.man b/man/xkb/XkbFreeNames.man
new file mode 100644 (file)
index 0000000..cdb021e
--- /dev/null
@@ -0,0 +1,93 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbFreeNames __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbFreeNames \- Free symbolic names structures
+.SH SYNOPSIS
+.HP
+.B void XkbFreeNames
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "unsigned int " "which" "\^,"
+.BI "Bool " "free_map" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+keyboard description for which names are to be freed
+.TP
+.I \- which
+mask of names components to be freed
+.TP
+.I \- free_map
+True => XkbNamesRec structure itself should be freed
+.SH DESCRIPTION
+.LP
+Do not free symbolic names structures directly using 
+.I free 
+or 
+.I XFree. 
+Use 
+.I XkbFreeNames 
+instead.
+
+The 
+.I which 
+parameter is the bitwise inclusive OR of the valid names mask bits defined in 
+Table 1.
+
+Xkb provides several functions that work with symbolic names. Each of these 
+functions uses a mask to specify individual fields of the structures described 
+above. These masks and their relationships to the fields in a keyboard 
+description are shown in Table 1.
+
+.TS
+c s s s
+l l l l.
+Table 1 Symbolic Names Masks
+_
+Mask Bit       Value   Keyboard        Field
+               Component
+_
+XkbKeycodesNameMask    (1<<0)  Xkb->names      keycodes
+XkbGeometryNameMask    (1<<1)  Xkb->names      geometry
+XkbSymbolsNameMask     (1<<2)  Xkb->names      symbols
+XkbPhysSymbolsNameMask (1<<3)  Xkb->names      phys_symbols
+XkbTypesNameMask       (1<<4)  Xkb->names      type
+XkbCompatNameMask      (1<<5)  Xkb->names      compat
+XkbKeyTypeNamesMask    (1<<6)  Xkb->map        type[*].name
+XkbKTLevelNamesMask    (1<<7)  Xkb->map        type[*].lvl_names[*]
+XkbIndicatorNamesMask  (1<<8)  Xkb->names      indicators[*]
+XkbKeyNamesMask        (1<<9)  Xkb->names      keys[*], num_keys
+XkbKeyAliasesMask      (1<<10) Xkb->names      key_aliases[*], num_key_aliases
+XkbVirtualModNamesMask (1<<11) Xkb->names      vmods[*]
+XkbGroupNamesMask      (1<<12) Xkb->names      groups[*]
+XkbRGNamesMask (1<<13) Xkb->names      radio_groups[*], num_rg
+XkbComponentNamesMask  (0x3f)  Xkb->names      keycodes,
+                       geometry,
+                       symbols,
+                       physical symbols,
+                       types, and
+                       compatibility map
+XkbAllNamesMask        (0x3fff)        Xkb->names      all name components
+.TE
diff --git a/man/xkb/XkbFreeServerMap.man b/man/xkb/XkbFreeServerMap.man
new file mode 100644 (file)
index 0000000..e0d591e
--- /dev/null
@@ -0,0 +1,187 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbFreeServerMap __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbFreeServerMap \- Free memory used by the server member of an XkbDescRec 
+structure
+.SH SYNOPSIS
+.HP
+.B void XkbFreeServerMap
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "unsigned int " "which" "\^,"
+.BI "Bool " "free_all" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+keyboard description containing server map to free
+.TP
+.I \- which
+mask identifying components of map to free
+.TP
+.I \- free_all
+True => free all server map components and server itself
+.SH DESCRIPTION
+.LP
+The 
+.I XkbFreeServerMap 
+function frees the specified components of server map in the XkbDescRec 
+structure specified by the 
+.I xkb 
+parameter and sets the corresponding structure component values to NULL. The
+.I which parameter specifies a combination of the server map masks and is a 
+bitwise inclusive OR 
+of the masks listed in Table 1. If 
+.I free_all 
+is True, 
+.I which 
+is ignored and 
+.I XkbFreeServerMap 
+frees every non-NULL structure component in the server map, frees the 
+XkbServerMapRec structure 
+referenced by the 
+.I server 
+member of the 
+.I xkb 
+parameter, and sets the 
+.I server 
+member to NULL.
+
+.TS
+c s
+l l
+l lw(4i).
+Table 1 XkbAllocServerMap Masks
+_
+Mask   Effect
+_
+XkbExplicitComponentsMask      T{
+The min_key_code and max_key_code fields of the xkb parameter are used to
+allocate the explicit field of the server map.
+T}
+.sp
+XkbKeyActionsMask      T{
+The min_key_code and max_key_code fields of the xkb parameter are used to 
+allocate the key_acts 
+field of the server map. The count_acts parameter is used to allocate the acts 
+field of the 
+server map.
+T}
+.sp
+XkbKeyBehaviorsMask    T{
+The min_key_code and max_key_code fields of the xkb parameter are used to 
+allocate the behaviors 
+field of the server map.
+T}
+.sp
+XkbVirtualModMapMask   T{
+The min_key_code and max_key_code fields of the xkb parameter are used to 
+allocate the vmodmap 
+field of the server map.
+T}
+
+.TE
+.SH STRUCTURES
+.LP
+The complete description of an Xkb keyboard is given by an XkbDescRec. The 
+component 
+structures in the XkbDescRec represent the major Xkb components.
+
+.nf
+typedef struct {
+   struct _XDisplay * display;      /\(** connection to X server */
+   unsigned short     flags;        /\(** private to Xkb, do not modify */
+   unsigned short     device_spec;  /\(** device of interest */
+   KeyCode            min_key_code; /\(** minimum keycode for device */
+   KeyCode            max_key_code; /\(** maximum keycode for device */
+   XkbControlsPtr     ctrls;        /\(** controls */
+   XkbServerMapPtr    server;       /\(** server keymap */
+   XkbClientMapPtr    map;          /\(** client keymap */
+   XkbIndicatorPtr    indicators;   /\(** indicator map */
+   XkbNamesPtr        names;        /\(** names for all components */
+   XkbCompatMapPtr    compat;       /\(** compatibility map */
+   XkbGeometryPtr     geom;         /\(** physical geometry of keyboard */
+} XkbDescRec, *XkbDescPtr;
+
+.fi
+The 
+.I display 
+field points to an X display structure. The 
+.I flags field is private to the library: modifying 
+.I flags 
+may yield unpredictable results. The 
+.I device_spec 
+field specifies the device identifier of the keyboard input device, or 
+XkbUseCoreKeyboard, which specifies the core keyboard device. The 
+.I min_key_code
+and 
+.I max_key_code 
+fields specify the least and greatest keycode that can be returned by the 
+keyboard. 
+
+Each structure component has a corresponding mask bit that is used in function 
+calls to 
+indicate that the structure should be manipulated in some manner, such as 
+allocating it 
+or freeing it. These masks and their relationships to the fields in the 
+XkbDescRec are 
+shown in Table 2.
+
+.TS
+c s s
+l l l
+l l l.
+Table 2 Mask Bits for XkbDescRec
+_
+Mask Bit       XkbDescRec Field        Value
+_
+XkbControlsMask        ctrls   (1L<<0)
+XkbServerMapMask       server  (1L<<1)
+XkbIClientMapMask      map     (1L<<2)
+XkbIndicatorMapMask    indicators      (1L<<3)
+XkbNamesMask   names   (1L<<4)
+XkbCompatMapMask       compat  (1L<<5)
+XkbGeometryMask        geom    (1L<<6)
+XkbAllComponentsMask   All Fields      (0x7f)
+.TE
+
+The Xkb server map contains the information the server needs to interpret key 
+events and is of 
+type XkbServerMapRec:
+
+.nf
+\&#define XkbNumVirtualMods          16
+
+typedef struct {                    /\(** Server Map */
+    unsigned short    num_acts;     /\(** # of occupied entries in acts */
+    unsigned short    size_acts;    /\(** # of entries in acts */
+    XkbAction *       acts;         /\(** linear 2d tables of key actions, 1 per keycode */
+    XkbBehavior *     behaviors;    /\(** key behaviors,1 per keycode */
+    unsigned short *  key_acts;     /\(** index into acts, 1 per keycode */
+    unsigned char *   explicit;     /\(** explicit overrides of core remapping, 1 per key */
+    unsigned char     vmods[XkbNumVirtualMods]; /\(** real mods bound to virtual mods */
+    unsigned short *  vmodmap;      /\(** virtual mods bound to key, 1 per keycode*/
+} XkbServerMapRec, *XkbServerMapPtr;
+
+.fi
diff --git a/man/xkb/XkbGetAccessXTimeout.man b/man/xkb/XkbGetAccessXTimeout.man
new file mode 100644 (file)
index 0000000..9eb9fd4
--- /dev/null
@@ -0,0 +1,140 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetAccessXTimeout __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetAccessXTimeout \- Queries the current AccessXTimeout options for a 
+keyboard device
+.SH SYNOPSIS
+.HP
+.B Bool XkbGetAccessXTimeout
+.BI "(\^Display *" "display" "\^,"
+.BI "unsigned int " "device_spec" "\^,"
+.BI "unsigned short *" "timeout_rtrn" "\^,"
+.BI "unsigned int *" "ctrls_mask_rtrn" "\^,"
+.BI "unsigned int *" "ctrls_values_rtrn" "\^,"
+.BI "unsigned short *" "options_mask_rtrn" "\^,"
+.BI "unsigned short *" "options_values_rtrn" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- display
+unsigned short
+.TP
+.I \- device_spec
+device to query, or XkbUseCoreKbd 
+.TP
+.I \- timeout_rtrn
+delay until AccessXTimeout, seconds
+.TP
+.I \- ctrls_mask_rtrn
+backfilled with controls to modify
+.TP
+.I \- ctrls_values_rtrn
+backfilled with on/off status for controls
+.TP
+.I \- options_mask_rtrn
+backfilled with ax_options to modify
+.TP
+.I \- options_values_rtrn
+backfilled with values for ax_options
+.SH DESCRIPTION
+.LP
+In environments where computers are shared, features such as SlowKeys present a 
+problem: if 
+SlowKeys is on, the keyboard can appear to be unresponsive because keys are not 
+accepted 
+until they are held for a certain period of time. To help solve this problem, 
+Xkb provides 
+an AccessXTimeout control to automatically change the enabled/disabled state of 
+any boolean 
+controls and to change the value of the AccessXKeys and AccessXFeedback control 
+attributes 
+if the keyboard is idle for a specified period of time.
+
+When a timeout as specified by AccessXTimeout occurs and a control is 
+consequently modified, 
+Xkb generates an XkbControlsNotify event.
+
+.I XkbGetAccessXTimeout 
+sends a request to the X server to obtain the current values for the 
+AccessXTimeout attributes, waits for a reply, and backfills the values into the 
+appropriate arguments. The parameters 
+.I options_mask_rtrn 
+and 
+.I options_values_rtrn 
+are backfilled with the options to modify and the values for 
+.I ax_options, 
+which is a field in the XkbControlsRec structure.
+.I XkbGetAccessXTimeout 
+returns True if successful; if a compatible version of the Xkb extension is not 
+available in the server, 
+.I XkbGetAccessXTimeout 
+returns False.
+.SH "RETURN VALUES"
+.TP 15
+True
+The 
+.I XkbGetAccessXTimeout 
+returns True when it successfully sends a request to the X server to obtain the 
+current values for the AccessXTimeout attributes, waits for a reply, and 
+backfills the values into the appropriate arguments.
+.TP 15
+False
+The 
+.I XkbGetAccessXTimeout 
+funtion returns False if a compatible version of the Xkb extension is not 
+available in the 
+server.
+.SH STRUCTURES
+.LP
+.nf
+The XkbControlsRec structure is defined as follows:
+
+\&#define XkbMaxLegalKeyCode     255
+\&#define XkbPerKeyBitArraySize  ((XkbMaxLegalKeyCode+1)/8)
+    
+typedef struct {
+    unsigned char   mk_dflt_btn;      /\(** default button for keyboard driven mouse */
+    unsigned char   num_groups;       /\(** number of keyboard groups */
+    unsigned char   groups_wrap;      /\(** how to wrap out-of-bounds groups */
+    XkbModsRec      internal;         /\(** defines server internal modifiers */
+    XkbModsRec      ignore_lock;      /\(** modifiers to ignore when checking for grab */
+    unsigned int    enabled_ctrls;    /\(** 1 bit => corresponding boolean control enabled */
+    unsigned short  repeat_delay;     /\(** ms delay until first repeat */
+    unsigned short  repeat_interval;  /\(** ms delay between repeats */
+    unsigned short  slow_keys_delay;  /\(** ms minimum time key must be down to be ok */
+    unsigned short  debounce_delay;   /\(** ms delay before key reactivated */
+    unsigned short  mk_delay;         /\(** ms delay to second mouse motion event */
+    unsigned short  mk_interval;      /\(** ms delay between repeat mouse events */
+    unsigned short  mk_time_to_max;   /\(** # intervals until constant mouse move */
+    unsigned short  mk_max_speed;     /\(** multiplier for maximum mouse speed */
+    short           mk_curve;         /\(** determines mouse move curve type */
+    unsigned short  ax_options;       /\(** 1 bit => Access X option enabled */
+    unsigned short  ax_timeout;       /\(** seconds until Access X disabled */
+    unsigned short  axt_opts_mask;    /\(** 1 bit => options to reset on Access X timeout */
+    unsigned short  axt_opts_values;  /\(** 1 bit => turn option on, 0=> off */
+    unsigned int    axt_ctrls_mask;   /\(** which bits in enabled_ctrls to modify */
+    unsigned int    axt_ctrls_values; /\(** values for new bits in enabled_ctrls */
+    unsigned char   per_key_repeat[XkbPerKeyBitArraySize];  /\(** per key auto repeat */
+} XkbControlsRec, *XkbControlsPtr;
+.fi
diff --git a/man/xkb/XkbGetAutoRepeatRate.man b/man/xkb/XkbGetAutoRepeatRate.man
new file mode 100644 (file)
index 0000000..ffbc8b8
--- /dev/null
@@ -0,0 +1,84 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetAutoRepeatRate __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetAutoRepeatRate \- Gets the current attributes of the RepeatKeys control 
+for a keyboard device
+.SH SYNOPSIS
+.HP
+.B Bool XkbGetAutoRepeatRate
+.BI "(\^Display *" "display" "\^,"
+.BI "unsigned int " "device_spec" "\^,"
+.BI "unsigned int *" "timeout_rtrn" "\^,"
+.BI "unsigned int *" "interval_rtrn" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- display
+connection to X server
+.TP
+.I \- device_spec
+desired device ID, or XkbUseCoreKbd
+.TP
+.I \- timeout_rtrn
+backfilled with initial repeat delay, ms
+.TP
+.I \- interval_rtrn
+backfilled with subsequent repeat delay, ms
+.SH DESCRIPTION
+.LP
+The core protocol allows only control over whether or not the entire keyboard or 
+individual keys should auto-repeat when held down. RepeatKeys is a boolean 
+control that extends this capability by adding control over the delay until a 
+key begins to repeat and the rate at which it repeats. RepeatKeys is coupled 
+with the core auto-repeat control: when RepeatKeys is enabled or disabled, the 
+core auto-repeat is enabled or disabled and vice versa.
+
+Auto-repeating keys are controlled by two attributes. The first, 
+.I timeout, 
+is the delay after the initial press of an auto-repeating key and the first 
+generated repeat event. The second, 
+.I interval, 
+is the delay between all subsequent generated repeat events. As with all boolean 
+controls, configuring the attributes that determine how the control operates 
+does not automatically enable the control as a whole.
+
+.I XkbGetAutoRepeatRate 
+queries the server for the current values of the RepeatControls control 
+attributes, backfills 
+.I timeout_rtrn 
+and 
+.I interval_rtrn 
+with them, and returns True. If a compatible version of the Xkb extension is not 
+available in the server 
+.I XkbGetAutoRepeatRate 
+returns False.
+.SH "RETURN VALUES"
+.TP 15
+True
+The XkbGetAutoRepeatRate function returns True if a compatible version of the 
+Xkb extension is available in the server.
+.TP 15
+False
+The XkbGetAutoRepeatRate function returns False if a compatible version of the 
+Xkb extension is not available in the server.
diff --git a/man/xkb/XkbGetAutoResetControls.man b/man/xkb/XkbGetAutoResetControls.man
new file mode 100644 (file)
index 0000000..667db53
--- /dev/null
@@ -0,0 +1,91 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetAutoResetControls __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetAutoResetControls \- Gets the current values of the auto-reset controls
+.SH SYNOPSIS
+.HP
+.B Bool XkbGetAutoResetControls
+.BI "(\^Display *" "dpy" "\^,"
+.BI "unsigned int  *" "auto_ctrls" "\^,"
+.BI "unsigned int  *" "auto_values" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+ connection to X server
+.TP
+.I \- auto_ctrls
+ specifies which bits in auto_values are relevant
+.TP
+.I \- auto_values
+1 bit => corresponding control has auto-reset on
+.SH DESCRIPTION
+.LP
+You can configure the boolean controls to automatically be enabled or 
+disabled when a program exits. This capability is controlled via two masks 
+maintained in the X server on a per-client basis. There is no client-side Xkb 
+data structure corresponding to these masks. Whenever the client exits for 
+any reason, any boolean controls specified in the 
+.I auto-reset mask 
+are set to the corresponding value from the 
+.I auto-reset values 
+mask. This makes it 
+possible for clients to "clean up after themselves" automatically, even if 
+abnormally terminated. The bits used in the masks correspond to the 
+EnabledControls control bits.
+
+For example, a client that replaces the keyboard bell with some other audible 
+cue might want to turn off the AudibleBell control to prevent the server from 
+also generating a sound and avoid cacophony. If the client were to exit 
+without resetting the AudibleBell control, the user would be left without any 
+feedback at all. Setting AudibleBell in both the auto-reset mask and 
+auto-reset values guarantees that the audible bell will be turned back on 
+when the client exits.
+
+.I XkbGetAutoResetControls 
+backfills 
+.I auto_ctrls 
+and 
+.I auto_values 
+with the AutoReset control attributes for this particular client. It returns 
+True if successful, and False otherwise.
+.SH "RETURN VALUES"
+.TP 15
+True
+The 
+.I XkbGetAutoResetControls 
+function returns True when it successfully backfills 
+.I auto_ctrls 
+and 
+.I auto_values 
+with the AutoReset control attributes for this particular client.
+.TP 15
+False
+The 
+.I XkbGetAutoResetControls 
+function returns False when it does not successfully backfill
+.I auto_ctrls 
+and 
+.I auto_values 
+with the AutoReset control attributes for this particular client.
diff --git a/man/xkb/XkbGetBounceKeysDelay.man b/man/xkb/XkbGetBounceKeysDelay.man
new file mode 100644 (file)
index 0000000..1df882d
--- /dev/null
@@ -0,0 +1,212 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetBounceKeysDelay __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetBounceKeysDelay \- Queries the current BounceKeys delay for a keyboard 
+device.
+.SH SYNOPSIS
+.HP
+.B Bool XkbGetBounceKeysDelay
+.BI "(\^Display *" "display" "\^,"
+.BI "unsigned int " "device_spec" "\^,"
+.BI "unsigned int *" "delay_rtrn" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- display
+connection to X server
+.TP
+.I \- device_spec
+device ID, or XkbUseCoreKbd
+.TP
+.I \- delay_rtrn
+backfilled with bounce keys delay, ms 
+.SH DESCRIPTION
+.LP
+The server can generate XkbAccessXNotify events for some of the global keyboard 
+controls. 
+The detail field describes what AccessX event just occurred and can be any of 
+the values in 
+Table 1.
+
+.TS
+c s
+l l
+l lw(4i).
+Table 1 AccessXNotify Events
+_
+detail Reason
+_
+XkbAXN_SKPress T{
+A key was pressed when SlowKeys was enabled.
+T}
+XkbAXN_SKAccept        T{
+A key was accepted (held longer than the SlowKeys delay).
+T}
+XkbAXN_SKRelease       T{
+An accepted SlowKeys key was released.
+T}
+XkbAXN_SKReject        T{
+A key was rejected (released before the SlowKeys delay expired).
+T}
+XkbAXN_BKAccept        T{
+A key was accepted by BounceKeys.
+T}
+XkbAXN_BKReject        T{
+A key was rejected (pressed before the BounceKeys delay expired).
+T}
+XkbAXN_AXKWarning      T{
+AccessXKeys is about to turn on/off StickyKeys or BounceKeys.
+T}
+.TE
+
+
+The 
+.I keycode 
+field reports the keycode of the key for which the event occurred. If the action 
+is related to
+.I SlowKeys, 
+the 
+.I slowKeysDelay 
+field contains the current SlowKeys acceptance delay. If the action is related 
+to BounceKeys, 
+the 
+.I debounceDelay 
+field contains the current BounceKeys debounce delay.
+
+Selecting for AccessX Events
+
+To receive XkbAccessXNotify events under all possible conditions, use 
+.I XkbSelectEvents
+and pass XkbAccesXNotifyMask in both 
+.I bits_to_change 
+and 
+.I values_for_bits.
+
+To receive XkbStateNotify events only under certain conditions, use 
+.I XkbSelectEventDetails 
+using XkbAccessXNotify as the 
+.I event_type 
+and specifying the desired state changes in 
+.I bits_to_change 
+and 
+.I values_for_bits 
+using mask bits from Table 2.
+
+.TS
+c s s
+l l l
+l l lw(3i).
+Table 2 AccessXNotify Event Details
+_
+XkbAccessXNotify Event Details Value   Circumstances
+_
+XkbAXN_SKPressMask     (1<<0)  T{
+Slow key press notification wanted
+T}
+XkbAXN_SKAcceptMask    (1<<1)  T{
+Slow key accept notification wanted
+T}
+XkbAXN_SKRejectMask    (1<<2)  T{
+Slow key reject notification wanted
+T}
+XkbAXN_SKReleaseMask   (1<<3)  T{
+Slow key release notification wanted
+T}
+XkbAXN_BKAcceptMask    (1<<4)  T{
+Bounce key accept notification wanted
+T}
+XkbAXN_BKRejectMask    (1<<5)  T{
+Bounce key reject notification wanted
+T}
+XkbAXN_AXKWarningMask  (1<<6)  T{
+AccessX warning notification wanted
+T}
+XkbAllAccessXEventsMask        (0x7f)  T{
+All AccessX features notifications wanted
+T}
+.TE
+
+Some users may accidentally "bounce" on a key when they release it. They press 
+it once, then accidentally press it again after they release it. The BounceKeys 
+control temporarily disables a key after it has been pressed, effectively 
+"debouncing" the keyboard. The period of time the key is disabled after it is 
+released is known as the 
+.I BounceKeys delay. 
+BounceKeys is a boolean control.
+
+When the BounceKeys control is active, the server reports acceptance or 
+rejection of any key to interested clients by sending an appropriate 
+AccessXNotify event (see STRUCTURES).
+
+.I XkbGetBounceKeysDelay 
+requests the attributes of the BounceKeys control from the server, waits for a 
+reply, and backfills 
+.I delay_rtrn 
+with the BounceKeys delay attribute. 
+.I XkbGetBounceKeysDelay 
+returns True if successful; if a compatible version of the Xkb extension is not 
+available in the server 
+.I XkbGetSlowKeysDelay 
+returns False.
+.SH "RETURN VALUES"
+.TP 15
+True
+The 
+.I XkbGetBounceKeysDelay 
+function returns True when it successfully requests the attributes of the 
+BounceKeys control from the server, waits for a 
+reply, and backfills 
+.I delay_rtrn 
+with the BounceKeys delay attribute.
+.TP 15
+False
+The 
+.I XkbGetBounceKeysDelay 
+function returns False if a compatible version of the Xkb extension is not 
+available in the server. 
+.SH STRUCTURES
+.LP
+The structure for the XkbAccessXNotify event type is as follows:
+
+.nf
+typedef struct {
+    int            type;           /\(** Xkb extension base event code */
+    unsigned long  serial;         /\(** X server serial number for event */
+    Bool           send_event;     /\(** True => synthetically generated */
+    Display *      display;        /\(** server connection where event generated */
+    Time           time;           /\(** server time when event generated */
+    int            xkb_type;       /\(** XkbAccessXNotify */
+    int            device;         /\(** Xkb device ID, will not be XkbUseCoreKbd 
+*/
+    int            detail;         /\(** XkbAXN_* */
+    KeyCode        keycode;        /\(** key of event */
+    int            slowKeysDelay;  /\(** current SlowKeys delay */
+    int            debounceDelay;  /\(** current debounce delay */
+} XkbAccessXNotifyEvent;
+    
+.fi    
+.SH "SEE ALSO"
+.BR XkbGetSlowKeysDelay (__libmansuffix__)
+
diff --git a/man/xkb/XkbGetCompatMap.man b/man/xkb/XkbGetCompatMap.man
new file mode 100644 (file)
index 0000000..d7d0a88
--- /dev/null
@@ -0,0 +1,116 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetCompatMap __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetCompatMap \- Fetch any combination of the current compatibility map 
+components from the server
+.SH SYNOPSIS
+.HP
+.B Status XkbGetCompatMap
+.BI "(\^Display *" "display" "\^,"
+.BI "unsigned int " "which" "\^,"
+.BI "XkbDescRec *" "xkb" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- display
+connection to server
+.TP
+.I \- which
+mask of compatibility map components to fetch
+.TP
+.I \- xkb
+keyboard description where results placed
+.SH DESCRIPTION
+.LP
+When another client modifies the compatibility map, you are notified if you have 
+selected for XkbCompatMapNotify events. 
+.I XkbGetCompatMap 
+is particularly useful when you receive an event of this type, as it allows you 
+to update your program's version of the compatibility map to match the modified 
+version now in the server. If your program is dealing with multiple servers and 
+needs to configure them all in a similar manner, the updated compatibility map 
+may be used to reconfigure other servers. 
+
+.I XkbGetCompatMap 
+fetches the components of the compatibility map specified in 
+.I which 
+from the server specified by 
+.I display 
+and places them in the 
+.I compat 
+structure of the keyboard description 
+.I xkb. 
+Valid values for 
+.I which 
+are an inclusive OR of the values shown in Table 1.
+
+.TS
+c s s
+l l l
+l l l.
+Table 1 Compatibility Map Component Masks
+_
+Mask   Value   Affecting
+_
+XkbSymInterpMask       (1<<0)  Symbol interpretations
+XkbGroupCompatMask     (1<<1)  Group maps
+XkbAllCompatMask       (0x3)   All compatibility map components
+.TE
+
+If no compatibility map structure is allocated in 
+.I xkb 
+upon entry, 
+.I XkbGetCompatMap 
+allocates one. If one already exists, its contents are overwritten with the 
+returned results.
+
+.I XkbGetCompatMap 
+fetches compatibility map information for the device specified by the
+.I device_spec 
+field of 
+.I xkb. 
+Unless you have specifically modified this field, it is the default keyboard 
+device. 
+.I XkbGetCompatMap 
+returns Success if successful, BadAlloc if it is unable to obtain necessary 
+storage for either the return values or work space, BadMatch if the 
+.I dpy 
+field of the 
+.I xkb 
+argument is non-NULL and does not match the 
+.I display 
+argument, and BadLength under certain conditions caused by server or Xkb 
+implementation errors.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadLength
+The length of a request is shorter or longer than that required to minimally contain the arguments
+.TP 15
+.B BadMatch
+A compatible version of Xkb was not available in the server or an argument has 
+correct type and range, but is otherwise invalid
diff --git a/man/xkb/XkbGetControls.man b/man/xkb/XkbGetControls.man
new file mode 100644 (file)
index 0000000..fc9b8c0
--- /dev/null
@@ -0,0 +1,162 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetControls __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetControls \- Finds the current state of Xkb server controls
+.SH SYNOPSIS
+.HP
+.B Status XkbGetControls
+.BI "(\^Display *" "display" "\^,"
+.BI "unsigned long " "which" "\^,"
+.BI "XkbDescPtr " "xkb" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- display
+connection to X server
+.TP
+.I \- which
+mask of controls requested
+.TP
+.I \- xkb
+keyboard description for controls information
+.SH DESCRIPTION
+.LP
+.I XkbGetControls 
+queries the server for the requested control information, waits for a reply, and 
+then copies the server's values for the requested information into the 
+.I ctrls 
+structure of the 
+.I xkb 
+argument. Only those components specified by the 
+.I which 
+parameter are copied. Valid values for 
+.I which 
+are any combination of the masks listed in Table 1 that have "ok" in the
+.I which 
+column.
+
+Table 1 shows the actual values for the individual mask bits used to select 
+controls for 
+modification and to enable and disable the control. Note that the same mask bit 
+is used to 
+specify general modifications to the parameters used to configure the control 
+(which), and to 
+enable and disable the control (enabled_ctrls). The anomalies in Table 1 (no 
+"ok" in column) 
+are for controls that have no configurable attributes; and for controls that are 
+not boolean 
+controls and therefore cannot be enabled or disabled.
+
+.TS
+c s s s
+l l l l
+l l l l
+l l l l. 
+Table 1 Controls Mask Bits
+_
+Mask Bit       which or        enabled Value
+       changed_ctrls   _ctrls
+_
+XkbRepeatKeysMask      ok      ok      (1L<<0)
+XkbSlowKeysMask        ok      ok      (1L<<1)
+XkbBounceKeysMask      ok      ok      (1L<<2)
+XkbStickyKeysMask      ok      ok      (1L<<3)
+XkbMouseKeysMask       ok      ok      (1L<<4)
+XkbMouseKeysAccelMask  ok      ok      (1L<<5)
+XkbAccessXKeysMask     ok      ok      (1L<<6)
+XkbAccessXTimeoutMask  ok      ok      (1L<<7)
+XkbAccessXFeedbackMask ok      ok      (1L<<8)
+XkbAudibleBellMask             ok      (1L<<9)
+XkbOverlay1Mask                ok      (1L<<10)
+XkbOverlay2Mask                ok      (1L<<11)
+XkbIgnoreGroupLockMask         ok      (1L<<12)
+XkbGroupsWrapMask      ok              (1L<<27)
+XkbInternalModsMask    ok              (1L<<28)
+XkbIgnoreLockModsMask  ok              (1L<<29)
+XkbPerKeyRepeatMask    ok              (1L<<30)
+XkbControlsEnabledMask ok              (1L<<31)
+XkbAccessXOptionsMask  ok      ok      (XkbStickyKeysMask | 
+                       XkbAccessXFeedbackMask)
+XkbAllBooleanCtrlsMask         ok      (0x00001FFF) 
+XkbAllControlsMask     ok              (0xF8001FFF)
+.TE
+
+
+If 
+.I xkb->ctrls 
+is NULL, 
+.I XkbGetControls 
+allocates and initializes it before obtaining the values specified by 
+.I which. 
+If 
+.I xkb->ctrls 
+is not NULL, 
+.I XkbGetControls 
+modifies only those portions of 
+.I xkb->ctrls 
+corresponding to the values specified by 
+.I which.
+
+.I XkbGetControls 
+returns Success if successful; otherwise, it returns BadAlloc if it cannot 
+obtain sufficient storage, BadMatch if 
+.I xkb 
+is NULL or 
+.I which 
+is empty, or BadImplementation.
+
+To free the 
+.I ctrls 
+member of a keyboard description, use 
+.I XkbFreeControls.
+
+The 
+.I num_groups 
+field in the 
+.I ctrls 
+structure is always filled in by 
+.I XkbGetControls, 
+regardless of which bits are selected by 
+.I which.
+.SH "RETURN VALUES"
+.TP 15
+Success
+The 
+.I XkbGetControls 
+function returns Success if successful.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadImplementation
+Invalid reply from server
+.TP 15
+.B BadMatch
+A compatible version of Xkb was not available in the server or an argument has 
+correct type and range, but is otherwise invalid
+
+.SH "SEE ALSO"
+.BR XkbFreeControls (__libmansuffix__)
diff --git a/man/xkb/XkbGetControlsChanges.man b/man/xkb/XkbGetControlsChanges.man
new file mode 100644 (file)
index 0000000..25e6381
--- /dev/null
@@ -0,0 +1,230 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetControlsChanges __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetControlsChanges \- Updates a local copy of a keyboard description with the 
+changes previously noted by one or more calls to XkbNoteControlsChanges
+.SH SYNOPSIS
+.HP
+XkbGetControlsChanges
+.BI "(\^Display *" "dpy" "\^,"
+.BI "XkbDescPtr " "xkb" "\^,"
+.BI "XkbNameChangesPtr " "changes" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to X server
+.TP
+.I \- xkb
+xkb->ctrls will be updated
+.TP
+.I \- changes
+indicates which parts of xkb->ctrls to update
+.SH DESCRIPTION
+.LP
+Whenever a field in the controls structure changes in the server's keyboard 
+description, the server sends an XkbControlsNotify event to all interested 
+clients.To receive XkbControlsNotify events under all possible conditions, use
+.I XkbSelectEvents 
+and pass XkbControlsNotifyMask in both 
+.I bits_to_change 
+and 
+.I values_for_bits.
+
+To receive XkbControlsNotify events only under certain conditions, use
+.I XkbSelectEventDetails 
+using XkbControlsNotify as the 
+.I event_type 
+and specifying the desired state changes in 
+.I bits_to_change 
+and 
+.I values_for_bits 
+using mask bits from Table 1.
+
+Table 1 shows the actual values for the individual mask bits used to select 
+controls for 
+modification and to enable and disable the control. Note that the same mask bit 
+is used to 
+specify general modifications to the parameters used to configure the control 
+(which), and to 
+enable and disable the control (enabled_ctrls). The anomalies in the table (no 
+"ok" in column) 
+are for controls that have no configurable attributes; and for controls that are 
+not boolean 
+controls and therefore cannot be enabled or disabled.
+
+.TS
+c s s s
+l l l l
+l l l l
+l l l l. 
+Table 1 Controls Mask Bits
+_
+Mask Bit       which or        enabled Value
+       changed_ctrls   _ctrls
+_
+XkbRepeatKeysMask      ok      ok      (1L<<0)
+XkbSlowKeysMask        ok      ok      (1L<<1)
+XkbBounceKeysMask      ok      ok      (1L<<2)
+XkbStickyKeysMask      ok      ok      (1L<<3)
+XkbMouseKeysMask       ok      ok      (1L<<4)
+XkbMouseKeysAccelMask  ok      ok      (1L<<5)
+XkbAccessXKeysMask     ok      ok      (1L<<6)
+XkbAccessXTimeoutMask  ok      ok      (1L<<7)
+XkbAccessXFeedbackMask ok      ok      (1L<<8)
+XkbAudibleBellMask             ok      (1L<<9)
+XkbOverlay1Mask                ok      (1L<<10)
+XkbOverlay2Mask                ok      (1L<<11)
+XkbIgnoreGroupLockMask         ok      (1L<<12)
+XkbGroupsWrapMask      ok              (1L<<27)
+XkbInternalModsMask    ok              (1L<<28)
+XkbIgnoreLockModsMask  ok              (1L<<29)
+XkbPerKeyRepeatMask    ok              (1L<<30)
+XkbControlsEnabledMask ok              (1L<<31)
+XkbAccessXOptionsMask  ok      ok      (XkbStickyKeysMask | 
+XkbAccessXFeedbackMask)
+XkbAllBooleanCtrlsMask         ok      (0x00001FFF) 
+XkbAllControlsMask     ok              (0xF8001FFF)
+.TE
+
+The 
+.I changed_ctrls 
+field specifies the controls components that have changed and consists of bits 
+taken from the masks defined in Table 10.7 with "ok" in the 
+.I changed_ctrls 
+column.
+
+The controls currently enabled in the server are reported in the 
+.I enabled_ctrls 
+field. If any controls were just enabled or disabled (that is, the contents of 
+the 
+.I enabled_ctrls 
+field changed), they are flagged in the 
+.I enabled_ctrl_changes 
+field. The valid bits for these fields are the masks listed in Table 10.7 with 
+"ok" in the 
+.I enabled_ctrls 
+column. The 
+.I num_groups 
+field reports the number of groups bound to the key belonging to the most number 
+of groups and is automatically updated when the keyboard mapping changes.
+
+If the change was caused by a request from a client, the 
+.I keycode 
+and 
+.I event_type 
+fields are set to zero and the 
+.I req_major 
+and 
+.I req_minor 
+fields identify the request. The 
+.I req_major value is the same as the major extension opcode. Otherwise,
+.I event_type 
+is set to the type of event that caused the change (one of KeyPress, KeyRelease, 
+DeviceKeyPress, DeviceKeyRelease, ButtonPress or ButtonRelease), and 
+.I req_major 
+and 
+.I req_minor 
+are undefined. If 
+.I event_type 
+is KeyPress, KeyRelease, DeviceKeyPress, or DeviceKeyRelease, the 
+.I keycode 
+field is set to the key that caused the change. If 
+.I event_type 
+is ButtonPress or ButtonRelease, 
+.I keycode 
+contains the button number. 
+
+When a client receives an XkbControlsNotify event, it can note the changes in a 
+changes structure using 
+.I XkbNoteControlsChanges.
+
+.I XkbGetControlsChanges 
+examines the 
+.I changes 
+parameter, queries the server for the necessary information, and copies the 
+results into the 
+.I xkb->ctrls 
+keyboard description. If the 
+.I ctrls 
+field of 
+.I xkb 
+is NULL, 
+.I XkbGetControlsChanges 
+allocates and initializes it. To free the 
+.I ctrls 
+field, use 
+XkbFreeControls.
+
+.I XkbGetControlsChanges 
+returns Success if successful and can generate BadAlloc, BadImplementation, and 
+BadMatch errors.
+.SH "RETURN VALUES"
+.TP 15
+Success
+The 
+.I XkbGetControlsChanges 
+function returns Success if the query of the server was successful.
+.SH STRUCTURES
+.LP
+.nf
+The structure for the XkbControlsNotify event is defined as follows:
+
+typedef struct {
+    int           type;          /\(** Xkb extension base event code */
+    unsigned long serial;        /\(** X server serial number for event */
+    Bool          send_event;    /\(** True => synthetically generated */
+    Display *     display;       /\(** server connection where event generated */
+    Time          time;          /\(** server time when event generated */
+    int           xkb_type;      /\(** XkbCompatMapNotify */
+    int           device;        /\(** Xkb device ID, will not be XkbUseCoreKbd */
+    unsigned int  changed_ctrls; /\(** bits indicating which controls data have 
+changed*/
+    unsigned int  enabled_ctrls; /\(** controls currently enabled in server */
+    unsigned int  enabled_ctrl_changes; /\(** bits indicating enabled/disabled 
+controls */
+    int           num_groups;    /\(** current number of keyboard groups */
+    KeyCode       keycode;       /\(** != 0 => keycode of key causing change */
+    char          event_type;    /\(** Type of event causing change */
+    char          req_major;     /\(** major event code of event causing change */
+    char          req_minor;     /\(** minor event code of event causing change */
+} XkbControlsNotifyEvent;
+.fi
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadImplementation
+Invalid reply from server
+.TP 15
+.B BadMatch
+A compatible version of Xkb was not available in the server or an argument has 
+correct type and range, but is otherwise invalid
+.SH "SEE ALSO"
+.BR XkbFreeControls (__libmansuffix__),
+.BR XkbNoteControlsChanges (__libmansuffix__),
+.BR XkbSelectEventDetails (__libmansuffix__),
+.BR XkbSelectEvents (__libmansuffix__)
diff --git a/man/xkb/XkbGetDetectableAutoRepeat.man b/man/xkb/XkbGetDetectableAutoRepeat.man
new file mode 100644 (file)
index 0000000..5bffb75
--- /dev/null
@@ -0,0 +1,92 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetDetectableAutoRepeat __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetDetectableAutoRepeat \- Determines whether or not the server supports
+DetectableAutoRepeat
+.SH SYNOPSIS
+.HP
+.B Bool XkbGetDetectableAutoRepeat
+.BI "(\^Display *" "display" "\^,"
+.BI "Bool *" "supported_rtrn" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- display
+connection to X server
+.TP
+.I \- supported_rtrn
+backfilled True if DetectableAutoRepeat supported
+.SH DESCRIPTION
+.LP
+Auto-repeat is the generation of multiple key events by a keyboard when the user
+presses a key and holds it down. Keyboard hardware and device-dependent X server
+software often implement auto-repeat by generating multiple KeyPress events with no
+intervening KeyRelease event. The standard behavior of the X server is to generate
+a KeyRelease event for every KeyPress event. If the keyboard hardware and
+device-dependent software of the X server implement auto-repeat by generating
+multiple KeyPress events, the device-independent part of the X server by default
+synthetically generates a KeyRelease event after each KeyPress event. This provides
+predictable behavior for X clients, but does not allow those clients to detect the
+fact that a key is auto-repeating.
+
+Xkb allows clients to request
+.I detectable auto-repeat.
+If a client requests and the server supports DetectableAutoRepeat, Xkb generates
+KeyRelease events only when the key is physically released. If DetectableAutoRepeat
+is not supported or has not been requested, the server synthesizes a KeyRelease
+event for each repeating KeyPress event it generates.
+
+DetectableAutoRepeat, unlike other controls, is not contained in the XkbControlsRec
+structure, nor can it be enabled or disabled via the EnabledControls control.
+Instead, query and set DetectableAutoRepeat using
+.I XkbGetDetectableAutoRepeat
+and
+.I XkbSetDetectableAutoRepeat.
+
+DetectableAutoRepeat is a condition that applies to all keyboard devices for a
+client's connection to a given X server; it cannot be selectively set for some
+devices and not for others. For this reason, none of the Xkb library functions
+involving DetectableAutoRepeat involve a device specifier.
+
+.I XkbGetDetectableAutoRepeat
+queries the server for the current state of DetectableAutoRepeat and waits for a
+reply. If
+.I supported_rtrn
+is not NULL, it backfills
+.I supported_rtrn
+with True if the server supports DetectableAutoRepeat, and False otherwise.
+.I XkbGetDetectableAutoRepeat
+returns the current state of DetectableAutoRepeat for the requesting client:
+True if DetectableAutoRepeat is set, and False otherwise.
+.SH "RETURN VALUES"
+.TP 15
+True
+The
+.I XkbGetDetectableAutoRepeat
+function returns True if the server supports DetectableAutoRepeat.
+.TP 15
+False
+The
+.I XkbGetDetectableAutoRepeat
+function returns False if the server does not support DetectableAutoRepeat.
diff --git a/man/xkb/XkbGetDeviceButtonActions.man b/man/xkb/XkbGetDeviceButtonActions.man
new file mode 100644 (file)
index 0000000..b3f8f74
--- /dev/null
@@ -0,0 +1,114 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetDeviceButtonActions __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetDeviceButtonActions \- Query the button actions associated with an X Input 
+Extension device
+.SH SYNOPSIS
+.HP
+.B Status XkbGetDeviceButtonActions
+.BI "(\^Display *" "dpy" "\^,"
+.BI "XkbDeviceInfoPtr " "device_info" "\^,"
+.BI "Bool " "all_buttons" "\^,"
+.BI "unsigned int " "first_button" "\^,"
+.BI "unsigned int " "num_buttons" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to X server
+.TP
+.I \- device_info
+structure to update with results
+.TP
+.I \- all_buttons
+True => get information for all buttons
+.TP
+.I \- first_button
+number of first button for which info is desired
+.TP
+.I \- num_buttons
+number of buttons for which info is desired
+.SH DESCRIPTION
+.LP
+.I XkbGetDeviceButtonActions 
+queries the server for the desired button information for the device indicated 
+by the 
+.I device_spec 
+field of 
+.I device_info 
+and waits for a reply. If successful, 
+.I XkbGetDeviceButtonActions 
+backfills the button actions 
+.I (btn_acts 
+field of 
+.I device_info) 
+for only the requested buttons, updates the 
+.I name, type, supported, 
+and 
+.I unsupported 
+fields, and returns Success.
+
+.I all_buttons, first_button 
+and 
+.I num_buttons 
+specify the device buttons for which actions should be returned. Setting
+.I all_buttons 
+to True requests actions for all device buttons; if 
+.I all_buttons 
+is False, 
+.I first_button 
+and 
+.I num_buttons 
+specify a range of buttons for which actions are requested.
+
+If a compatible version of Xkb is not available in the server or the Xkb 
+extension has not been properly initialized, 
+.I XkbGetDeviceButtonActions 
+returns BadAccess. If allocation errors occur, a BadAlloc status is returned. If 
+the specified device 
+.I (device_info->device_spec) 
+is invalid, a BadKeyboard status is returned. If the device has no buttons, a 
+BadMatch status is returned. If 
+.I first_button 
+and 
+.I num_buttons 
+specify illegal buttons, a BadValue status is returned. 
+.SH DIAGNOSTICS
+.TP 15
+.B BadAccess
+The Xkb extension has not been properly initialized
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadKeyboard
+The device specified was not a valid core or input extension device
+.TP 15
+.B BadMatch
+A compatible version of Xkb was not available in the server or an argument has 
+correct type and range, but is otherwise invalid
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbGetDeviceInfo.man b/man/xkb/XkbGetDeviceInfo.man
new file mode 100644 (file)
index 0000000..f34c4d9
--- /dev/null
@@ -0,0 +1,247 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetDeviceInfo __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetDeviceInfo \- Determine whether the X server allows Xkb access to particular capabilities of input devices other than 
+the core X keyboard, or to determine the status of indicator maps, indicator names or button actions on a non-KeyClass 
+extension device
+.SH SYNOPSIS
+.HP
+.B XkbDeviceInfoPtr XkbGetDeviceInfo
+.BI "(\^Display *" "dpy" "\^,"
+.BI "unsigned int " "which" "\^,"
+.BI "unsigned int " "device_spec" "\^,"
+.BI "unsigned int " "ind_class" "\^,"
+.BI "unsigned int " "ind_id" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to X server
+.TP
+.I \- which
+mask indicating information to return
+.TP
+.I \- device_spec
+device ID, or XkbUseCoreKbd
+.TP
+.I \- ind_class
+feedback class for indicator requests
+.TP
+.I \- ind_id
+feedback ID for indicator requests
+.SH DESCRIPTION
+.LP
+To determine whether the X server allows Xkb access to particular capabilities of input devices other than the core X 
+keyboard, or to determine the status of indicator maps, indicator names or button actions on a non-KeyClass extension 
+device, use 
+.I XkbGetDeviceInfo. 
+
+.I XkbGetDeviceInfo 
+returns information about the input device specified by 
+.I device_spec. 
+Unlike the 
+.I device_spec 
+parameter of most Xkb functions, 
+.I device_spec 
+does not need to be a keyboard device. It must, however, indicate either the core keyboard or a valid X Input Extension 
+device. 
+
+The 
+.I which 
+parameter is a mask specifying optional information to be returned. It is an inclusive OR of one or more of the values from 
+Table 1 and causes the returned XkbDeviceInfoRec to contain values for the corresponding fields specified in the table.
+
+.nf
+                         Table 1 XkbDeviceInfoRec Mask Bits                        
+____________________________________________________________________________________
+Name                         XkbDeviceInfoRec Value     Capability If Set
+                             Fields Effected            
+____________________________________________________________________________________
+XkbXI_KeyboardsMask                           (1L <<0) Clients can use all
+                                                       Xkb requests and events
+                                                       with KeyClass devices 
+                                                       supported by the input
+                                                       device extension.
+
+XkbXI_ButtonActionsMask       num_btns        (1L <<1) Clients can assign key 
+                              btn_acts                 actions to buttons 
+                                                       non-KeyClass input
+                                                       extension devices.
+                           
+XkbXI_IndicatorNamesMask      leds->names     (1L <<2) Clients can assign
+                                                       names to indicators on
+                                                       non-KeyClass input
+                                                       extension devices.
+                                                             
+XkbXI_IndicatorMapsMask       leds->maps      (1L <<3) Clients can assign
+                                                       indicator maps to
+                                                       indicators on 
+                                                       non-KeyClass input
+                                                       extension devices.
+
+XkbXI_IndicatorStateMask      leds->state     (1L <<4) Clients can request 
+                                                       the status of indicators
+                                                       on non-KeyClass input
+                                                       extension devices.
+
+XkbXI_IndicatorsMask          sz_leds         (0x1c)   XkbXI_IndicatorNamesMask |
+                              num_leds                 XkbXI_IndicatorMapsMask |
+                              leds->*                  XkbXI_IndicatorStateMask
+
+XkbXI_UnsupportedFeaturesMask unsupported     (1L <<15)
+
+XkbXI_AllDeviceFeaturesMask   Those selected  (0x1e)   XkbXI_IndicatorsMask |
+                              by Value Column          XkbSI_ButtonActionsMask
+                              masks 
+
+XkbXI_AllFeaturesMask         Those selected  (0x1f)   XkbSI_AllDeviceFeaturesMask |
+                              by Value Column          XkbSI_KeyboardsMask
+                              masks
+
+XkbXI_AllDetailsMask          Those selected  (0x801f) XkbXI_AllFeaturesMask |
+                              by Value column          XkbXI_UnsupportedFeaturesMask
+                              masks
+.fi
+
+The XkbDeviceInfoRec returned by 
+.I XkbGetDeviceInfo 
+always has values for 
+.I name 
+(may be a null string, ""), 
+.I type, supported, unsupported, has_own_state, dflt_kbd_fd, 
+and 
+.I dflt_kbd_fb. 
+Other fields are filled in as specified by 
+.I which.
+
+Upon return, the 
+.I supported 
+field will be set to the inclusive OR of zero or more bits from Table 1; each bit set indicates an optional Xkb extension 
+device feature supported by the server implementation, and a client may modify the associated behavior.
+
+If the XkbButtonActionsMask bit is set in 
+.I which, 
+the XkbDeviceInfoRec returned will have the button actions 
+.I (btn_acts 
+field) filled in for all buttons.
+
+If 
+.I which 
+includes one of the bits in XkbXI_IndicatorsMask, the feedback class of the indicators must be specified in
+.I ind_class, 
+and the feedback ID of the indicators must be specified in 
+.I ind_id. 
+If the request does not include any of the bits in XkbXI_IndicatorsMask, the 
+.I ind_class 
+and 
+.I ind_id 
+parameters are ignored. The class and ID can be obtained via the input device extension 
+.I XListInputDevices 
+request. 
+
+If any of the XkbXI_IndicatorsMask bits are set in 
+.I which, 
+the XkbDeviceInfoRec returned will have filled in the portions of the 
+.I leds 
+structure corresponding to the indicator feedback identified by 
+.I ind_class 
+and 
+.I ind_id. 
+The 
+.I leds 
+vector of the XkbDeviceInfoRec is allocated if necessary and 
+.I sz_leds 
+and 
+.I num_leds 
+filled in. The 
+.I led_class, led_id 
+and 
+.I phys_indicators 
+fields of the 
+.I leds 
+entry corresponding to 
+.I ind_class 
+and 
+.I ind_id 
+are always filled in. If 
+.I which 
+contains XkbXI_IndicatorNamesMask, the 
+.I names_present 
+and 
+.I names 
+fields of the 
+.I leds 
+structure corresponding to 
+.I ind_class 
+and 
+.I ind_id 
+are returned. If 
+.I which 
+contains XkbXI_IndicatorStateMask, the corresponding 
+.I state 
+field is updated. If 
+.I which 
+contains XkbXI_IndicatorMapsMask, the 
+.I maps_present 
+and 
+.I maps 
+fields are updated.
+
+Xkb provides convenience functions to request subsets of the information available via 
+.I XkbGetDeviceInfo. 
+These convenience functions mirror some of the mask bits. The functions all take an XkbDeviceInfoPtr as an input argument 
+and operate on the X Input Extension device specified by the 
+.I device_spec 
+field of the structure. Only the parts of the structure indicated in the function description are updated. The 
+XkbDeviceInfoRec structure used in the function call can be obtained by calling 
+.I XkbGetDeviceInfo 
+or can be allocated by calling 
+.I XkbAllocDeviceInfo.
+.SH STRUCTURES
+.LP
+Information about X Input Extension devices is transferred between a client program and the Xkb extension in an 
+XkbDeviceInfoRec structure:
+.nf
+
+typedef struct {
+    char *               name;          /\(** name for device */
+    Atom                 type;          /\(** name for class of devices */
+    unsigned short       device_spec;   /\(** device of interest */
+    Bool                 has_own_state; /\(** True=>this device has its own state */
+    unsigned short       supported;     /\(** bits indicating supported capabilities */
+    unsigned short       unsupported;   /\(** bits indicating unsupported capabilities */
+    unsigned short       num_btns;      /\(** number of entries in btn_acts */
+    XkbAction *          btn_acts;      /\(** button actions */
+    unsigned short       sz_leds;       /\(** total number of entries in LEDs vector */
+    unsigned short       num_leds;      /\(** number of valid entries in LEDs vector */
+    unsigned short       dflt_kbd_fb;   /\(** input extension ID of default (core kbd) indicator */
+    unsigned short       dflt_led_fb;   /\(** input extension ID of default indicator feedback */
+    XkbDeviceLedInfoPtr  leds;          /\(** LED descriptions */
+} XkbDeviceInfoRec, *XkbDeviceInfoPtr;
+    
+.fi
+.SH "SEE ALSO"
+.BR XkbAllocDeviceInfo (__libmansuffix__),
+.BR XListInputDevices (__libmansuffix__)
diff --git a/man/xkb/XkbGetDeviceInfoChanges.man b/man/xkb/XkbGetDeviceInfoChanges.man
new file mode 100644 (file)
index 0000000..69b5fb5
--- /dev/null
@@ -0,0 +1,62 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetDeviceInfoChanges __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetDeviceInfoChanges \- Query the changes that have occurred in the button 
+actions or indicator names and indicator maps associated with an input extension 
+device
+.SH SYNOPSIS
+.HP
+.B Status XkbGetDeviceInfoChanges
+.BI "(\^Display *" "dpy" "\^,"
+.BI "XkbDeviceInfoPtr " "device_info" "\^,"
+.BI "XkbDeviceChangesPtr " "changes" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to X server
+.TP
+.I \- device_info
+structure to update with results
+.TP
+.I \- changes
+contains notes of changes that have occurred
+.SH DESCRIPTION
+.LP
+The 
+.I changes->changed 
+field indicates which attributes of the device specified in 
+.I changes->device 
+have changed. The parameters describing the changes are contained in the other 
+fields of 
+.I changes. XkbGetDeviceInfoChanges 
+uses that information to call 
+.I XkbGetDeviceInfo 
+to obtain the current status of those attributes that have changed. It then 
+updates the local description of the device in 
+.I device_info 
+with the new information.
+.SH "SEE ALSO"
+.BR XkbGetDeviceInfo (__libmansuffix__)
diff --git a/man/xkb/XkbGetDeviceLedInfo.man b/man/xkb/XkbGetDeviceLedInfo.man
new file mode 100644 (file)
index 0000000..81e0662
--- /dev/null
@@ -0,0 +1,153 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetDeviceLedInfo __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetDeviceLedInfo \- Query the indicator names, maps, and state associated 
+with an LED feedback of an input extension device
+.SH SYNOPSIS
+.HP
+.B Status XkbGetDeviceLedInfo
+.BI "(\^Display *" "dpy" "\^,"
+.BI "XkbDeviceInfoPtr " "device_info" "\^,"
+.BI "unsigned int " "led_class" "\^,"
+.BI "unsigned int " "led_id" "\^,"
+.BI "unsigned int " "which" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to X server
+.TP
+.I \- device_info
+structure to update with results
+.TP
+.I \- led_class
+LED feedback class assigned by input extension
+.TP
+.I \- led_id
+LED feedback ID assigned by input extension
+.TP
+.I \- which
+mask indicating desired information
+.SH DESCRIPTION
+.LP
+.I XkbGetDeviceLedInfo 
+queries the server for the desired LED information for the feedback specified by
+.I led_class 
+and 
+.I led_id 
+for the X input extension device indicated by 
+.I device_spec->device_info 
+and waits for a reply. If successful, 
+.I XkbGetDeviceLedInfo 
+backfills the relevant fields of 
+.I device_info 
+as determined by 
+.I which 
+with the results and returns Success. Valid values for 
+.I which 
+are the inclusive OR of any of XkbXI_IndicatorNamesMask, 
+XkbXI_IndicatorMapsMask, and XkbXI_IndicatorStateMask.
+
+The fields of 
+.I device_info 
+that are filled in when this request succeeds are 
+.I name, type, supported, 
+and 
+.I unsupported, 
+and portions of the 
+.I leds 
+structure corresponding to 
+.I led_class 
+and 
+.I led_id 
+as indicated by the bits set in 
+.I which. 
+The 
+.I device_info->leds 
+vector is allocated if necessary and 
+.I sz_leds 
+and 
+.I num_leds 
+filled in. The 
+.I led_class, led_id 
+and 
+.I phys_indicators 
+fields of the 
+.I device_info->leds 
+entry corresponding to 
+.I led_class 
+and 
+.I led_id 
+are always filled in. 
+
+If 
+.I which 
+contains XkbXI_IndicatorNamesMask, the 
+.I names_present 
+and 
+.I names 
+fields of the 
+.I device_info->leds 
+structure corresponding to 
+.I led_class 
+and 
+.I led_id 
+are updated, if 
+.I which 
+contains XkbXI_IndicatorStateMask, the corresponding 
+.I state 
+field is updated, and if 
+.I which 
+contains XkbXI_IndicatorMapsMask, the 
+.I maps_present 
+and 
+.I maps 
+fields are updated.
+
+If a compatible version of Xkb is not available in the server or the Xkb 
+extension has not been properly initialized, 
+.I XkbGetDeviceLedInfo 
+returns BadAccess. If allocation errors occur, a BadAlloc status is returned. If 
+the device has no indicators, a BadMatch error is returned. If 
+.I ledClass 
+or 
+.I ledID 
+have illegal values, a BadValue error is returned. If they have legal values but 
+do not specify a feedback that contains LEDs and is associated with the 
+specified device, a BadMatch error is returned. 
+.SH DIAGNOSTICS
+.TP 15
+.B BadAccess
+The Xkb extension has not been properly initialized
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadMatch
+A compatible version of Xkb was not available in the server or an argument has 
+correct type and range, but is otherwise invalid
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbGetGeometry.man b/man/xkb/XkbGetGeometry.man
new file mode 100644 (file)
index 0000000..afe3346
--- /dev/null
@@ -0,0 +1,72 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetGeometry __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetGeometry \- Loads a keyboard geometry if you already have the keyboard 
+description
+.SH SYNOPSIS
+.HP
+.B Status XkbGetGeometry
+.BI "(\^Display *" "dpy" "\^,"
+.BI "XkbDescPtr " "xkb" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to the X server
+.TP
+.I \- xkb
+keyboard description that contains the ID for the keyboard and into which the 
+geometry should be loaded
+.SH DESCRIPTION
+.LP
+You can load a keyboard geometry as part of the keyboard description returned by
+.I XkbGetKeyboard. 
+However, if a keyboard description has been previously loaded, you can instead 
+obtain the geometry by calling the 
+.I XkbGetGeometry. 
+In this case, the geometry returned is the one associated with the keyboard 
+whose device ID is contained in the keyboard description.
+
+.I XkbGetGeometry 
+can return BadValue, BadImplementation, BadName, BadAlloc, or BadLength errors 
+or Success if it succeeds.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadImplementation
+Invalid reply from server
+.TP 15
+.B BadLength
+The length of a request is shorter or longer than that required to minimally 
+contain the arguments
+.TP 15
+.B BadName
+A font or color of the specified name does not exist
+.TP 15
+.B BadValue
+An argument is out of range
+.SH "SEE ALSO"
+.BR XkbGetKeyboard (__libmansuffix__)
diff --git a/man/xkb/XkbGetIndicatorChanges.man b/man/xkb/XkbGetIndicatorChanges.man
new file mode 100644 (file)
index 0000000..8497006
--- /dev/null
@@ -0,0 +1,153 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetIndicatorChanges __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetIndicatorChanges \- Updates a local copy of the keyboard description with 
+the actual values of one or more calls to XkbNoteIndicatorChanges
+.SH SYNOPSIS
+.HP
+.B Status XkbGetIndicatorChanges
+.BI "(\^Display *" "dpy" "\^,"
+.BI "XkbDescPtr " "xkb" "\^,"
+.BI "XkbIndicatorChangesPtr " "changes" "\^,"
+.BI "unsigned int " "state" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to the X server
+.TP
+.I \- xkb
+keyboard description to hold the new values 
+.TP
+.I \- changes
+indicator maps/state to be obtained from the server
+.TP
+.I \- state
+backfilled with the state of the indicators
+.SH DESCRIPTION
+.LP
+Whenever an indicator changes state, the server sends XkbIndicatorStateNotify events to all 
+interested clients. Similarly, whenever an indicator's map changes, the server sends 
+XkbIndicatorMapNotify events to all interested clients.
+
+To receive XkbIndicatorStateNotify events, use 
+.I XkbSelectEvents 
+with both the 
+.I bits_to_change 
+and 
+.I values_for_bits 
+parameters containing XkbIndicatorStateNotifyMask. To receive XkbIndicatorMapNotify events, 
+use 
+.I XkbSelectEvents 
+with XkbIndicatorMapNotifyMask.
+
+To receive events for only specific indicators, use 
+.I XkbSelectEventDetails. 
+Set the 
+.I event_type 
+parameter to XkbIndicatorStateNotify or XkbIndicatorMapNotify, and set both the
+.I bits_to_change 
+and 
+.I values_for_bits 
+detail parameters to a mask where each bit specifies one indicator, turning on those bits that 
+specify the indicators for which you want to receive events.
+
+Both types of indicator events use the same structure:
+.nf
+
+typedef struct _XkbIndicatorNotify {
+  int            type;       /\(** Xkb extension base event code */
+  unsigned long  serial;     /\(** X server serial number for event */
+  Bool           send_event; /\(** True => synthetically generated */
+  Display *      display;    /\(** server connection where event generated */
+  Time           time;       /\(** server time when event generated */
+  int            xkb_type;   /\(** specifies state or map notify */
+  int            device;     /\(** Xkb device ID, will not be XkbUseCoreKbd */
+  unsigned int   changed;    /\(** mask of indicators with new state or map */
+  unsigned int   state;      /\(** current state of all indicators */
+} XkbIndicatorNotifyEvent;
+     
+.fi     
+.I xkb_type 
+is either XkbIndicatorStateNotify or XkbIndicatorMapNotify, depending on whether the event is 
+a kbIndicatorStateNotify event or kbIndicatorMapNotify event.
+
+The 
+.I changed 
+parameter is a mask that is the bitwise inclusive OR of the indicators that have changed. If 
+the event is of type XkbIndicatorMapNotify, 
+.I changed 
+reports the maps that changed. If the event is of type XkbIndicatorStateNotify, 
+.I changed 
+reports the indicators that have changed state. 
+.I state 
+is a mask that specifies the current state of all indicators, whether they have changed or 
+not, for both XkbIndicatorStateNotify and IndicatorMapNotify events.
+
+When your client application receives either a XkbIndicatorStateNotify event or 
+XkbIndicatorMapNotify event, you can note the changes in a changes structure by calling
+.I XkbNoteIndicatorChanges.
+
+.I XkbGetIndicatorChanges 
+examines the 
+.I changes 
+parameter, pulls over the necessary information from the server, and copies the 
+results into the 
+.I xkb 
+keyboard description. If any bits are set in the 
+.I state_changes 
+field of 
+.I changes, XkbGetIndicatorChanges 
+also places the state of those indicators in 
+.I state. 
+If the 
+.I indicators 
+field of 
+.I xkb 
+is NULL, 
+.I XkbGetIndicatorChanges 
+allocates and initializes it. To free the 
+.I indicators 
+field, use 
+.I XkbFreeIndicators.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadImplementation
+Invalid reply from server
+.TP 15
+.B BadMatch
+A compatible version of Xkb was not available in the server or an argument has 
+correct type and range, but is otherwise invalid
+.SH "SEE ALSO"
+.BR XkbFreeIndicators (__libmansuffix__),
+.BR XkbGetIndicatorChanges (__libmansuffix__),
+.BR XkbNoteIndicatorChanges (__libmansuffix__),
+.BR XkbSelectEvents (__libmansuffix__),
+.BR XkbSelectEventDetail (__libmansuffix__)
+
+
+
diff --git a/man/xkb/XkbGetIndicatorMap.man b/man/xkb/XkbGetIndicatorMap.man
new file mode 100644 (file)
index 0000000..7da8279
--- /dev/null
@@ -0,0 +1,87 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetIndicatorMap __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetIndicatorMap \- Gets the map for one or more indicators, using a mask to 
+specify the indicators
+.SH SYNOPSIS
+.HP
+.B Status XkbGetIndicatorMap
+.BI "(\^Display *" "dpy" "\^,"
+.BI "unsigned int " "which" "\^,"
+.BI "XkbDescPtr " "desc" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to the X server
+.TP
+.I \- which
+mask of indicators for which maps should be returned
+.TP
+.I \- desc
+keyboard description to be updated
+.SH DESCRIPTION
+.LP
+Xkb allows applications to obtain information about indicators using two 
+different methods. The first method, which is similar to the core X 
+implementation, uses a mask to specify the indicators. The second method, which 
+is more suitable for applications concerned with interoperability, uses 
+indicator names. The correspondence between the indicator name and the bit 
+position in masks is as follows: one of the parameters returned from
+.I XkbGetNamedIndicators 
+is an index that is the bit position to use in any function call that requires a 
+mask of indicator bits, as well as the indicator's index into the 
+XkbIndicatorRec array of indicator maps.
+
+
+.I XkbGetIndicatorMap 
+obtains the maps from the server for only those indicators specified by the 
+.I which 
+mask and copies the values into the keyboard description specified by 
+.I desc. 
+If the 
+.I indicators 
+field of the 
+.I desc 
+parameter is NULL, 
+.I XkbGetIndicatorMap 
+allocates and initializes it.
+
+To free the indicator maps, use 
+.I XkbFreeIndicatorMaps.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadMatch
+A compatible version of Xkb was not available in the server or an argument has 
+correct type and range, but is otherwise invalid
+.TP 15
+.B BadImplementation
+Invalid reply from server
+.SH "SEE ALSO"
+.BR XkbFreeIndicatorMaps (__libmansuffix__),
+.BR XkbGetNamedIndicators (__libmansuffix__)
+
diff --git a/man/xkb/XkbGetIndicatorState.man b/man/xkb/XkbGetIndicatorState.man
new file mode 100644 (file)
index 0000000..8504752
--- /dev/null
@@ -0,0 +1,79 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetIndicatorState __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetIndicatorState \- Obtains the current state of the keyboard indicators
+.SH SYNOPSIS
+.HP
+.B Status XkbGetIndicatorState
+.BI "(\^Display *" "display" "\^,"
+.BI "unsigned int " "device_spec" "\^,"
+.BI "unsigned int " "state_return" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- display
+connection to the X server
+.TP
+.I \- device_spec
+device ID, or XkbUseCoreKbd
+.TP
+.I \- state_return
+backfilled with a mask of the indicator state
+.SH DESCRIPTION
+.LP
+Xkb allows applications to obtain information about indicators using two 
+different methods. The first method, which is similar to the core X 
+implementation, uses a mask to specify the indicators. The second method, which 
+is more suitable for applications concerned with interoperability, uses 
+indicator names. The correspondence between the indicator name and the bit 
+position in masks is as follows: one of the parameters returned from
+.I XkbGetNamedIndicators 
+is an index that is the bit position to use in any function call that requires a 
+mask of indicator bits, as well as the indicator's index into the 
+XkbIndicatorRec array of indicator maps.
+
+.I XkbGetIndicatorState 
+queries the 
+.I display 
+for the state of the indicators on the device specified by the 
+.I device_spec. 
+For each indicator that is "turned on" on the device, the associated bit is set 
+in 
+.I state_return. 
+If a compatible version of the Xkb extension is not available in the server,
+.I XkbGetIndicatorState
+returns a BadMatch error. Otherwise, it sends the request to the X server, 
+places the state of the indicators into 
+.I state_return, 
+and returns Success. Thus the value reported by 
+.I XkbGetIndicatorState 
+is identical to the value reported by the core protocol.
+.SH DIAGNOSTICS
+.TP 15
+.B BadMatch
+A compatible version of Xkb was not available in the server or an argument has 
+correct type and range, but is otherwise invalid
+.SH "SEE ALSO"
+.BR XkbGetNamedIndicators (__libmansuffix__)
+
diff --git a/man/xkb/XkbGetKeyActions.man b/man/xkb/XkbGetKeyActions.man
new file mode 100644 (file)
index 0000000..726add4
--- /dev/null
@@ -0,0 +1,92 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetKeyActions __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetKeyActions \- Update the actions (the key_acts array) for a subset of the 
+keys in a keyboard description
+.SH SYNOPSIS
+.HP
+.B Status XkbGetKeyActions
+.BI "(\^Display *" "dpy" "\^,"
+.BI "unsigned int " "first" "\^,"
+.BI "unsigned int " "num" "\^,"
+.BI "XkbDescPtr " "xkb" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to X server
+.TP
+.I \- first
+keycode of first key of interest
+.TP
+.I \- num
+number of keys desired
+.TP
+.I \- xkb
+pointer to keyboard description where result is stored
+.SH DESCRIPTION
+.LP
+.I XkbGetKeyActions 
+sends a request to the server to obtain the actions for 
+.I num 
+keys on the keyboard starting with key 
+.I first. 
+It waits for a reply and returns the actions in the 
+.I server->key_acts 
+field of 
+.I xkb. 
+If successful, 
+.I XkbGetKeyActions 
+returns Success. The 
+.I xkb 
+parameter must be a pointer to a valid Xkb keyboard description.
+
+If the 
+.I server 
+map, in the 
+.I xkb 
+parameter, has not been allocated, 
+.I XkbGetKeyActions 
+allocates and initializes it before obtaining the actions.
+
+If the server does not have a compatible version of Xkb, or the Xkb extension 
+has not been properly initialized, 
+.I XkbGetKeyActions 
+returns BadAccess. If 
+.I num 
+is less than 1 or greater than XkbMaxKeyCount, 
+.I XkbGetKeyActions 
+returns BadValue. If any allocation errors occur, 
+.I XkbGetKeyActions 
+returns BadAlloc. 
+.SH DIAGNOSTICS
+.TP 15
+.B BadAccess
+The Xkb extension has not been properly initialized
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbGetKeyBehaviors.man b/man/xkb/XkbGetKeyBehaviors.man
new file mode 100644 (file)
index 0000000..3d2ae10
--- /dev/null
@@ -0,0 +1,90 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbChangeTypesOfKey __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbChangeTypesOfKey \- Obtain the behaviors (the behaviors array) for a subset of the keys in 
+a keyboard description from the server
+.SH SYNOPSIS
+.HP
+.B Status XkbChangeTypesOfKey
+.BI "(\^Display *" "dpy" "\^,"
+.BI "unsigned int " "first" "\^,"
+.BI "unsigned int " "num" "\^,"
+.BI "XkbDescPtr " "xkb" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to server
+.TP
+.I \- first
+keycode of first key to get
+.TP
+.I \- num
+number of keys for which behaviors are desired
+.TP
+.I \- xkb
+Xkb description to contain the result
+.SH DESCRIPTION
+.LP
+.I XkbGetKeyBehaviors 
+sends a request to the server to obtain the behaviors for 
+.I num 
+keys on the keyboard starting with the key whose keycode is 
+.I first. 
+It waits for a reply and returns the behaviors in the 
+.I server->behaviors 
+field of 
+.I xkb. 
+If successful, 
+.I XkbGetKeyBehaviors 
+returns Success.
+
+If the 
+.I server 
+map in the 
+.I xkb 
+parameter has not been allocated, 
+.I XkbGetKeyBehaviors 
+allocates and initializes it before obtaining the actions.
+
+If the server does not have a compatible version of Xkb, or the Xkb extension has not been 
+properly initialized, 
+.I XkbGetKeyBehaviors 
+returns BadAccess. If 
+.I num 
+is less than 1 or greater than XkbMaxKeyCount, 
+.I XkbGetKeyBehaviors 
+returns BadValue. If any allocation errors occur, 
+.I XkbGetKeyBehaviors 
+returns BadAlloc. 
+.SH DIAGNOSTICS
+.TP 15
+.B BadAccess
+The Xkb extension has not been properly initialized
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbGetKeyExplicitComponents.man b/man/xkb/XkbGetKeyExplicitComponents.man
new file mode 100644 (file)
index 0000000..8026d30
--- /dev/null
@@ -0,0 +1,151 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetKeyExplicitComponents __libmansuffix__ "20 Jul 1999" "X v11 Rel. 6.4" "XKB FUNCTION"
+.SH NAME
+XkbGetKeyExplicitComponents \- Obtain the explicit components (the explicit 
+array) for a subset of the keys in a keyboard description
+.SH SYNOPSIS
+.HP
+.B Status XkbGetKeyExplicitComponents
+.BI "(\^Display *" "dpy" "\^,"
+.BI "unsigned int " "first" "\^,"
+.BI "unsigned int " "num" "\^,"
+.BI "XkbDescPtr " "xkb" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to server
+.TP
+.I \- first
+keycode of first key to fetch
+.TP
+.I \- num
+number of keys for which to get explicit info
+.TP
+.I \- xkb
+Xkb description in which to put results
+.SH DESCRIPTION
+.LP
+Whenever a client remaps the keyboard using core protocol requests, Xkb examines 
+the map to determine likely default values for the components that cannot be 
+specified using the core protocol (see Core Keyboard Mapping to Xkb Keyboard 
+Mapping Transformation for more information on how Xkb chooses the default 
+values).
+
+DO THE FOUR PAGES OF "CORE KEYBOARD MAPPING TO XKB KEYBOARD MAPPING 
+TRANSFORMATION" NEED TO BE ADDED HERE?
+
+This automatic remapping might replace definitions explicitly requested by an 
+application, so the Xkb keyboard description defines an explicit components mask 
+for each key. Any aspects of the automatic remapping listed in the explicit 
+components mask for a key are not changed by the automatic keyboard mapping.
+The explicit components masks are held in the 
+.I explicit 
+field of the server map, which is an array indexed by keycode. Each entry in 
+this array is a mask that is a bitwise inclusive OR of the values shown in Table 
+1.
+.TS
+c s s
+l l l
+l l lw(3i).
+Table 1 Explicit Component Masks
+_
+Bit in Explicit Mask   Value   Protects Against
+_
+ExplicitKeyType1       (1<<0)  T{
+Automatic determination of the key type associated with Group1.
+T}
+ExplicitKeyType2       (1<<1)  T{
+Automatic determination of the key type associated with Group2.
+T}
+ExplicitKeyType3       (1<<2)  T{
+Automatic determination of the key type associated with Group3.
+T}
+ExplicitKeyType4       (1<<3)  T{
+Automatic determination of the key type associated with Group4.
+T}
+ExplicitInterpret      (1<<4)  T{
+Application of any of the fields of a symbol interpretation to the key in 
+question.
+T}
+ExplicitAutoRepeat     (1<<5)  T{
+Automatic determination of auto-repeat status for the key, as specified in a 
+symbol interpretation.
+T}
+ExplicitBehavior       (1<<6)  T{
+Automatic assignment of the XkbKB_Lock behavior to the key, if the 
+XkbSI_LockingKey flag is set in a symbol interpretation.
+T}
+ExplicitVModMap        (1<<7)  T{
+Automatic determination of the virtual modifier map for the key based on the 
+actions assigned to the key and the symbol interpretations that match the key.
+T}
+.TE
+
+.I XkbGetKeyExplicitComponents 
+sends a request to the server to obtain the explicit components for 
+.I num 
+keys on the keyboard starting with key 
+.I first. 
+It waits for a reply and returns the explicit components in the 
+.I server->explicit 
+array of 
+.I xkb. 
+If successful, 
+.I XkbGetKeyExplicitComponents 
+returns Success. The 
+.I xkb 
+parameter must be a pointer to a valid Xkb keyboard description.
+
+If the 
+.I server 
+map in the 
+.I xkb 
+parameter has not been allocated, 
+.I XkbGetKeyExplicitComponents 
+allocates and initializes it before obtaining the actions.
+
+If the server does not have a compatible version of Xkb, or the Xkb extension 
+has not been properly initialized, 
+.I XkbGetKeyExplicitComponents 
+returns BadMatch. If 
+.I num 
+is less than 1 or greater than XkbMaxKeyCount, 
+.I XkbGetKeyExplicitComponents 
+returns BadValue. If any allocation errors occur, 
+.I XkbGetKeyExplicitComponents 
+returns BadAlloc.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadMatch
+A compatible version of Xkb was not available in the server or an argument has 
+correct type and range, but is otherwise invalid
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbGetKeyModifierMap.man b/man/xkb/XkbGetKeyModifierMap.man
new file mode 100644 (file)
index 0000000..03a0ff9
--- /dev/null
@@ -0,0 +1,93 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetKeyModifierMap __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetKeyModifierMap \- Update the modifier map for one or more of the keys in a 
+keyboard description
+.SH SYNOPSIS
+.HP
+.B Status XkbGetKeyModifierMap
+.BI "(\^Display *" "dpy" "\^,"
+.BI "unsigned int " "first" "\^,"
+.BI "unsigned int " "num" "\^,"
+.BI "XkbDescPtr " "xkb" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to X server
+.TP
+.I \- first
+keycode of first key to get
+.TP
+.I \- num
+number of keys for which information is desired
+.TP
+.I \- xkb
+keyboard description to update
+.SH DESCRIPTION
+.LP
+The 
+.I modmap 
+entry of the client map is an array, indexed by keycode, specifying the real 
+modifiers bound to a key. Each entry is a mask composed of a bitwise inclusive 
+OR of the legal real modifiers: ShiftMask, LockMask, ControlMask, Mod1Mask, 
+Mod2Mask, Mod3Mask, Mod4Mask, and Mod5Mask. If a bit is set in a 
+.I modmap 
+entry, the corresponding key is bound to that modifier.
+
+Pressing or releasing the key bound to a modifier changes the modifier set and 
+unset state. The particular manner in which the modifier set and unset state 
+changes is determined by the behavior and actions assigned to the key.
+
+.I XkbGetKeyModifierMap 
+sends a request to the server for the modifier mappings for 
+.I num 
+keys starting with the key whose keycode is 
+.I first. 
+It waits for a reply and places the results in the 
+.I xkb->map->modmap 
+array. If successful, 
+.I XkbGetKeyModifier 
+returns Success.
+If the map component of the 
+.I xkb 
+parameter has not been allocated, 
+.I XkbGetKeyModifierMap 
+allocates and initializes it. 
+
+If a compatible version of Xkb is not available in the server or the Xkb 
+extension has not been properly initialized, 
+.I XkbGetKeySyms 
+returns BadAccess. If any allocation errors occur while obtaining the modifier 
+map, 
+.I XkbGetKeyModifierMap 
+returns BadAlloc.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAccess
+The Xkb extension has not been properly initialized
+.TP 15
+.B BadAlloc
+Unable to allocate storage
diff --git a/man/xkb/XkbGetKeySyms.man b/man/xkb/XkbGetKeySyms.man
new file mode 100644 (file)
index 0000000..a68da7f
--- /dev/null
@@ -0,0 +1,99 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetKeySyms __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetKeySyms \- Obtain the symbols for a subset of the keys in a keyboard 
+description
+.SH SYNOPSIS
+.HP
+.B Status XkbGetKeySyms
+.BI "(\^Display *" "dpy" "\^,"
+.BI "unsigned int " "first" "\^,"
+.BI "unsigned int " "num" "\^,"
+.BI "XkbDescPtr " "xkb" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to X server
+.TP
+.I \- first
+keycode of first key to get
+.TP
+.I \- num
+number of keycodes for which syms desired 
+.TP
+.I \- xkb
+Xkb description to be updated
+.SH DESCRIPTION
+.LP
+.I XkbGetKeySyms 
+sends a request to the server to obtain the set of keysyms bound to 
+.I num 
+keys starting with the key whose keycode is 
+.I first. 
+It waits for a reply and returns the keysyms in the 
+.I map.syms 
+field of 
+.I xkb. 
+If successful, 
+.I XkbGetKeySyms 
+returns Success. The 
+.I xkb 
+parameter must be a pointer to a valid Xkb keyboard description.
+
+If the client 
+.I map 
+in the xkb parameter has not been allocated, 
+.I XkbGetKeySyms 
+allocates and initializes it before obtaining the symbols. 
+
+If a compatible version of Xkb is not available in the server or the Xkb 
+extension has not been properly initialized, 
+.I XkbGetKeySyms 
+returns BadAccess. If 
+.I num 
+is less than 1 or greater than XkbMaxKeyCount, 
+.I XkbGetKeySyms 
+returns BadValue. If any allocation errors occur, 
+.I XkbGetKeySyms 
+returns BadAlloc.
+.SH "RETURN VALUES"
+.TP 15
+Success
+The 
+.I XkbGetKeySyms 
+function returns Success if it gets a reply to a request to the server to obtain the set of keysyms bound to 
+.I num 
+keys starting with the key whose keycode is 
+.I first. 
+.SH DIAGNOSTICS
+.TP 15
+.B BadAccess
+The Xkb extension has not been properly initialized
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbGetKeyTypes.man b/man/xkb/XkbGetKeyTypes.man
new file mode 100644 (file)
index 0000000..d685209
--- /dev/null
@@ -0,0 +1,82 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetKeyTypes __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetKeyTypes \- Obtain the list of available key types in the server's 
+keyboard mapping
+.SH SYNOPSIS
+.HP
+.B Status XkbGetKeyTypes
+.BI "(\^Display *" "dpy" "\^,"
+.BI "unsigned int " "first" "\^,"
+.BI "unsigned int " "num" "\^,"
+.BI "XkbDescPtr " "xkb" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to X server
+.TP
+.I \- first
+index to first type to get, 0 => 1st type
+.TP
+.I \- num
+number of key types to be returned
+.TP
+.I \- xkb
+keyboard description containing client map to update
+.SH DESCRIPTION
+.LP
+.I XkbGetKeyTypes 
+queries the server for the desired types, waits for a reply, and returns the 
+desired types in the 
+.I xkb->map->types. 
+If successful, it returns Success.
+
+.I XkbGetKeyTypes 
+returns BadAccess if the Xkb extension has not been properly initialized and 
+BadValue if the combination of 
+.I first 
+and 
+.I num 
+results in numbers out of valid range.
+
+.B NOTE: 
+.I XkbGetKeyTypes 
+is used to obtain descriptions of the key types themselves, not the key types 
+bound to individual keys. To obtain the key types bound to an individual key, 
+refer to the 
+.I key_sym_map 
+field of the client map.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAccess
+The Xkb extension has not been properly initialized
+.TP 15
+.B BadValue
+An argument is out of range
+.SH "SEE ALSO"
+.BR XkbKeyType (__libmansuffix__),
+.BR XkbKeyTypeIndex (__libmansuffix__)
+
diff --git a/man/xkb/XkbGetKeyVirtualModMap.man b/man/xkb/XkbGetKeyVirtualModMap.man
new file mode 100644 (file)
index 0000000..2416b6f
--- /dev/null
@@ -0,0 +1,103 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetKeyVirtualModMap __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetKeyVirtualModMap \- Obtain the virtual modifier map (the vmodmap array) 
+for a subset of the keys in a keyboard description
+.SH SYNOPSIS
+.HP
+.B Status XkbGetKeyVirtualModMap
+.BI "(\^Display *" "dpy" "\^,"
+.BI "unsigned int " "first" "\^,"
+.BI "unsigned int " "num" "\^,"
+.BI "XkbDescPtr " "xkb" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to server
+.TP
+.I \- first
+keycode of first key to fetch
+.TP
+.I \- num
+number of keys for which virtual mod maps are desired
+.TP
+.I \- xkb
+Xkb description where results will be placed
+.SH DESCRIPTION
+.LP
+.I XkbGetKeyVirutalModmap 
+sends a request to the server to obtain the virtual modifier mappings for 
+.I num 
+keys on the keyboard starting with key 
+.I first. 
+It waits for a reply and returns the virtual modifier mappings in the
+.I server->vmodmap 
+array of 
+.I xkb. 
+If successful, 
+.I XkbGetKeyVirtualModMap 
+returns Success. The 
+.I xkb 
+parameter must be a pointer to a valid Xkb keyboard description.
+
+If the 
+.I server 
+map in the 
+.I xkb 
+parameter has not been allocated, 
+.I XkbGetKeyVirtualModMap 
+allocates and initializes it before obtaining the virtual modifier mappings.
+
+If the server does not have a compatible version of Xkb, or the Xkb extension 
+has not been properly initialized, 
+.I XkbGetKeyVirtualModMap 
+returns BadMatch. If 
+.I num 
+is less than 1 or greater than XkbMaxKeyCount, 
+.I XkbGetKeyVirtualModMap 
+returns BadValue. If any allocation errors occur, 
+.I XkbGetKeyVirtualModMap 
+returns BadAlloc.
+.SH "RETURN VALUES"
+.TP 15
+Success
+The 
+.I XkbGetKeyVirutalModmap 
+function returns Success following a successful reply from the server to obtain 
+the virtual modifier mappings for 
+.I num 
+keys on the keyboard starting with key 
+.I first. 
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadMatch
+A compatible version of Xkb was not available in the server or an argument has 
+correct type and range, but is otherwise invalid
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbGetKeyboard.man b/man/xkb/XkbGetKeyboard.man
new file mode 100644 (file)
index 0000000..ef44afb
--- /dev/null
@@ -0,0 +1,92 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetKeyboard __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetKeyboard \-   Retrieves one or more components of a keyboard device 
+description
+.SH SYNOPSIS
+.HP
+.B XkbDescPtr XkbGetKeyboard
+.BI "(\^Display *" "display" "\^,"
+.BI "unsigned int " "which" "\^,"
+.BI "unsigned int " "device_spec" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I display
+connection to the X server 
+.TP
+.I device_spec
+device ID, or XkbUseCoreKbd
+.TP
+.I bits_to_change
+determines events to be selected / deselected
+.TP
+.I values_for_bits
+1=>select, 0->deselect; for events in bits_to_change
+.SH DESCRIPTION
+.LP
+.I XkbGetKeyboard 
+allocates and returns a pointer to a keyboard description. It queries the server for those 
+components specified in the 
+.I which 
+parameter for device 
+.I device_spec 
+and copies the results to the XkbDescRec it allocated. The remaining fields in the keyboard 
+description are set to NULL. The valid masks for 
+.I which 
+are those listed in Table 1.
+
+.TS
+c s s
+l l l
+l l l.
+Table 1 Mask Bits for XkbDescRec
+_
+Mask Bit       XkbDescRec Field        Value
+_
+XkbControlsMask        ctrls   (1L<<0)
+XkbServerMapMask       server  (1L<<1)
+XkbIClientMapMask      map     (1L<<2)
+XkbIndicatorMapMask    indicators      (1L<<3)
+XkbNamesMask   names   (1L<<4)
+XkbCompatMapMask       compat  (1L<<5)
+XkbGeometryMask        geom    (1L<<6)
+XkbAllComponentsMask   All Fields      (1L<<7)
+.TE
+
+.I XkbGetKeyboard 
+is used to read the current description for one or more components of a keyboard device. It calls
+.I XkbGetKeyboardByName 
+as follows:
+
+.I XkbGetKeyboardByName(dpy, device_spec, 
+NULL, 
+.I which, which, 
+False).
+.SH DIAGNOSTICS
+.TP 15
+.SM BadAlloc
+Unable to allocate storage
+
diff --git a/man/xkb/XkbGetKeyboardByName.man b/man/xkb/XkbGetKeyboardByName.man
new file mode 100644 (file)
index 0000000..974552c
--- /dev/null
@@ -0,0 +1,385 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetKeyboardByName __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetKeyboardByName \- Build a new keyboard description from a set of named 
+components, and to optionally have the server use the resulting description to 
+replace an active one
+.SH SYNOPSIS
+.HP
+.B XkbDescPtr XkbGetKeyboardByName
+.BI "(\^Display *" "dpy" "\^,"
+.BI "unsigned int " "device_spec" "\^,"
+.BI "XkbComponentNamesPtr " "names" "\^,"
+.BI "unsigned int " "want" "\^,"
+.BI "unsigned int " "need" "\^,"
+.BI "Bool " "load" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to X server
+.TP
+.I \- device_spec
+device ID, or XkbUseCoreKbd
+.TP
+.I \- names
+names of components to fetch
+.TP
+.I \- want
+desired structures in returned record
+.TP
+.I \- need
+mandatory structures in returned record
+.TP
+.I \- load
+True => load into 
+.I device_spec
+.SH DESCRIPTION
+.LP
+A client may request that the server fetch one or more components from its 
+database and use those components to build a new server keyboard description. 
+The new keyboard description may be built from scratch, or it may be built 
+starting with the current keyboard description for a particular device. Once the 
+keyboard description is built, all or part of it may be returned to the client. 
+The parts returned to the client need not include all of the parts used to build 
+the description. At the time it requests the server to build a new keyboard 
+description, a client may also request that the server use the new description 
+internally to replace the current keyboard description for a specific device, in 
+which case the behavior of the device changes accordingly.
+
+To build a new keyboard description from a set of named components, and to 
+optionally have the server use the resulting description to replace an active 
+one, use 
+.I XkbGetKeyboardByName.
+
+.I names 
+contains a set of expressions describing the keyboard components the 
+server should use to build the new keyboard description. 
+.I want 
+and 
+.I need 
+are bit fields describing the parts of the resulting keyboard description that 
+should be present in the returned XkbDescRec.
+The individual fields in 
+.I names 
+are 
+.I component expressions 
+composed of keyboard component names (no wildcarding as may be used in
+.I XkbListComponents), 
+the special component name symbol `%', and the special operator characters `+' 
+and `|'. A component expression is parsed left to right, as follows:
+
+.IP \(bu 5
+The special component name "computed" may be used in keycodes component 
+expressions and refers to a component consisting of a set of keycodes computed 
+automatically by the server as needed.
+.IP \(bu 5
+The special component name "canonical" may be used in types component 
+expressions and refers to a partial component defining the four standard key 
+types: ALPHABETIC, ONE_LEVEL, TWO_LEVEL, and KEYPAD.
+.IP \(bu 5
+The special component name `%' refers to the keyboard description for the device 
+specified in device_spec or the keymap names component. If a keymap names 
+component is specified that does not begin with `+' or `|' and does not contain 
+`%', then `%' refers to the description generated by the keymap names component. 
+Otherwise, it refers to the keyboard description for device_spec.
+.IP \(bu 5
+The `+' operator specifies that the following component should override the 
+currently assembled description; any definitions that are present in both 
+components are taken from the second.
+.IP \(bu 5
+The `|' operator specifies that the next specified component should augment the 
+currently assembled description; any definitions that are present in both 
+components are taken from the first.
+.IP \(bu 5
+If the component expression begins with an operator, a leading `%' is implied.
+.IP \(bu 5
+If any unknown or illegal characters appear anywhere in the expression, the 
+entire expression is invalid and is ignored.
+
+For example, if 
+.I names->symbols 
+contained the expression "+de", it specifies that 
+the default member of the "de" class of symbols should be applied to the current 
+keyboard mapping, overriding any existing definitions (it could also be written 
+"+de(default)").
+
+Here is a slightly more involved example: the expression 
+"acme(ascii)+de(basic)|iso9995-3" constructs a German (de) mapping for the ASCII 
+keyboard supplied by the "acme" vendor. The new definition begins with the 
+symbols for the ASCII keyboard for Acme 
+.I (acme(ascii)), 
+overrides them with definitions for the basic German keyboard 
+.I (de(basic)), 
+and then applies the definitions from the default iso9995-3 keyboard 
+.I (iso9995-3) 
+to any undefined keys or groups of keys (part three of the iso9995 standard 
+defines a common set of bindings for the secondary group, but allows national 
+layouts to override those definitions where necessary). 
+
+.B NOTE 
+The interpretation of the above expression components (acme, ascii, de, basic, 
+iso9995-3) is not defined by Xkb; only the operations and their ordering are.
+
+Note that the presence of a keymap 
+.I names 
+component that does not contain `%' (either explicit or implied by virtue of an 
+expression starting with an operator) indicates a description that is 
+independent of the keyboard description for the device specified in 
+.I device_spec. 
+The same is true of requests in which the keymap names component is empty and 
+all five other names components contain expressions void of references to `%'. 
+Requests of this form allow you to deal with keyboard definitions independent of 
+any actual device.
+
+The server parses all non-NULL fields in 
+.I names 
+and uses them to build a keyboard description. However, before parsing the 
+expressions in 
+.I names, 
+the server ORs the bits in 
+.I want 
+and 
+.I need 
+together and examines the result in relationship to the expressions in 
+.I names. 
+Table 1 identifies the components that are required for each of the possible 
+bits in 
+.I want 
+or 
+.I need. 
+If a required component has not been specified in the 
+.I names structure (the corresponding field is NULL), the server substitutes the 
+expression "%", resulting in the component values being taken from 
+.I device_spec. 
+In addition, if 
+.I load 
+is True, the server modifies 
+.I names 
+if necessary (again using a "%" entry) to ensure all of the following fields are 
+non-NULL: 
+.I types, keycodes, symbols, 
+and 
+.I compat.
+.bp
+.TS
+c s s
+l l l. 
+Table 1 Want and Need Mask Bits and Required Names Components
+_
+want or need mask bit  Required names Components       value
+_
+XkbGBN_TypesMask       Types   (1L<<0)
+XkbGBN_CompatMapMask   Compat  (1L<<1)
+XkbGBN_ClientSymbolsMask       Types + Symbols + Keycodes      (1L<<2)
+XkbGBN_ServerSymbolsMask       Types + Symbols + Keycodes      (1L<<3)
+XkbGBN_SymbolsMask     Symbols (1L<<1)
+XkbGBN_IndicatorMapMask        Compat  (1L<<4)
+XkbGBN_KeyNamesMask    Keycodes        (1L<<5)
+XkbGBN_GeometryMask    Geometry        (1L<<6)
+XkbGBN_OtherNamesMask  Types + Symbols + Keycodes + Compat + Geometry  (1L<<7)
+XkbGBN_AllComponentsMask               (0xff)
+.TE
+
+.I need 
+specifies a set of keyboard components that the server must be able to 
+resolve in order for 
+.I XkbGetKeyboardByName 
+to succeed; if any of the components specified in 
+.I need 
+cannot be successfully resolved, 
+.I XkbGetKeyboardByName 
+fails.
+
+.I want 
+specifies a set of keyboard components that the server should attempt to 
+resolve, but that are not mandatory. If the server is unable to resolve any of 
+these components, 
+.I XkbGetKeyboardByName 
+still succeeds. Bits specified in 
+.I want 
+that are also specified in 
+.I need 
+have no effect in the context of 
+.I want.
+
+If 
+.I load 
+is True, the server updates its keyboard description for 
+.I device_spec 
+to match the result of the keyboard description just built. If load is False, 
+the 
+server's description for device 
+.I device_spec 
+is not updated. In all cases, the parts specified by 
+.I want 
+and 
+.I need 
+from the just-built keyboard description are returned.
+
+The 
+.I names 
+structure in an XkbDescRec keyboard description record contains one field for 
+each of the five component types used to build a keyboard description. When a 
+keyboard description is built from a set of database components, the 
+corresponding fields in this 
+.I names 
+structure are set to match the expressions used to build the component. 
+
+Building a New Keyboard Description from the Server Database
+
+The information returned to the client in the XkbDescRec is essentially the 
+result of a series of calls to extract information from a fictitious device 
+whose description matches the one just built. The calls corresponding to each of 
+the mask bits are summarized in Table 2, together with the XkbDescRec 
+components that are filled in.
+
+.TS
+c s s
+l l l.
+Table 2 XkbDescRec Components Returned for Values of Want & Needs
+_
+Request (want+need)    Fills in Xkb components Equivalent Function Call
+_
+XkbGBN_TypesMask       map.types       XkbGetUpdatedMap(dpy, XkbTypesMask, Xkb)
+XkbGBN_ServerSymbolsMask       server  XkbGetUpdatedMap(dpy, 
+XkbAllClientInfoMask, Xkb)
+XkbGBN_ClientSymbolsMask       map, including map.types        
+XkbGetUpdatedMap(dpy, XkbAllServerInfoMask, Xkb)
+XkbGBN_IndicatorMaps   indicators      XkbGetIndicatorMap(dpy, 
+XkbAllIndicators, Xkb)
+XkbGBN_CompatMapMask   compat  XkbGetCompatMap(dpy, XkbAllCompatMask, Xkb)
+XkbGBN_GeometryMask    geom    XkbGetGeometry(dpy, Xkb)
+XkbGBN_KeyNamesMask    names.keys      XkbGetNames(dpy, XkbKeyNamesMask |
+       names.key_aliases       XkbKeyAliasesMask, Xkb)
+XkbGBN_OtherNamesMask  names.keycodes  XkbGetNames(dpy, XkbAllNamesMask &      
+       names.geometry  ~(XkbKeyNamesMask | XkbKeyAliasesMask),
+       names.symbols   Xkb)
+       names.types
+       map.types[*].lvl_names[*]
+       names.compat
+       names.vmods
+       names.indicators
+       names.groups
+       names.radio_groups
+       names.phys_symbols
+.TE
+
+There is no way to determine which components specified in 
+.I want 
+(but not in 
+.I need) 
+were actually fetched, other than breaking the call into successive calls to 
+.I XkbGetKeyboardByName 
+and specifying individual components.
+
+.I XkbGetKeyboardByName 
+always sets 
+.I min_key_code 
+and 
+.I max_key_code 
+in the returned XkbDescRec structure.
+
+.I XkbGetKeyboardByName 
+is synchronous; it sends the request to the server to build a new keyboard 
+description and waits for the reply. If successful, the return value is 
+non-NULL. 
+.I XkbGetKeyboardByName 
+generates a BadMatch protocol error if errors are encountered when building the 
+keyboard description.
+.SH STRUCTURES
+.LP
+The complete description of an Xkb keyboard is given by an XkbDescRec. The 
+component 
+structures in the XkbDescRec represent the major Xkb components outlined in 
+Figure 1.1.
+
+.nf
+typedef struct {
+   struct _XDisplay * display;      /\(** connection to X server */
+   unsigned short     flags;        /\(** private to Xkb, do not modify */
+   unsigned short     device_spec;  /\(** device of interest */
+   KeyCode            min_key_code; /\(** minimum keycode for device */
+   KeyCode            max_key_code; /\(** maximum keycode for device */
+   XkbControlsPtr     ctrls;        /\(** controls */
+   XkbServerMapPtr    server;       /\(** server keymap */
+   XkbClientMapPtr    map;          /\(** client keymap */
+   XkbIndicatorPtr    indicators;   /\(** indicator map */
+   XkbNamesPtr        names;        /\(** names for all components */
+   XkbCompatMapPtr    compat;       /\(** compatibility map */
+   XkbGeometryPtr     geom;         /\(** physical geometry of keyboard */
+} XkbDescRec, *XkbDescPtr;
+
+.fi
+The 
+.I display 
+field points to an X display structure. The 
+.I flags field is private to the library: modifying 
+.I flags 
+may yield unpredictable results. The 
+.I device_spec 
+field specifies the device identifier of the keyboard input device, or 
+XkbUseCoreKeyboard, which specifies the core keyboard device. The 
+.I min_key_code
+and 
+.I max_key_code 
+fields specify the least and greatest keycode that can be returned by the 
+keyboard. 
+
+Each structure component has a corresponding mask bit that is used in function 
+calls to 
+indicate that the structure should be manipulated in some manner, such as 
+allocating it 
+or freeing it. These masks and their relationships to the fields in the 
+XkbDescRec are 
+shown in Table 3.
+
+.TS
+c s s
+l l l
+l l l.
+Table 3 Mask Bits for XkbDescRec
+_
+Mask Bit       XkbDescRec Field        Value
+_
+XkbControlsMask        ctrls   (1L<<0)
+XkbServerMapMask       server  (1L<<1)
+XkbIClientMapMask      map     (1L<<2)
+XkbIndicatorMapMask    indicators      (1L<<3)
+XkbNamesMask   names   (1L<<4)
+XkbCompatMapMask       compat  (1L<<5)
+XkbGeometryMask        geom    (1L<<6)
+XkbAllComponentsMask   All Fields      (0x7f)
+.TE
+.SH DIAGNOSTICS
+.TP 15
+.B BadMatch
+A compatible version of Xkb was not available in the server or an argument has 
+correct type and range, but is otherwise invalid
+.SH "SEE ALSO"
+.BR XkbListComponents (__libmansuffix__)
+
+
diff --git a/man/xkb/XkbGetMap.man b/man/xkb/XkbGetMap.man
new file mode 100644 (file)
index 0000000..b51704c
--- /dev/null
@@ -0,0 +1,321 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetMap __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetMap \- Allocate an XkbDescRec structure and populate it with the server's 
+keyboard 
+client map and server map
+.SH SYNOPSIS
+.HP
+.B XkbDescPtr XkbGetMap
+.BI "(\^Display *" "display" "\^,"
+.BI "unsigned int " "which" "\^,"
+.BI "unsigned int " "device_spec" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- display
+connection to X server
+.TP
+.I \- which
+mask selecting subcomponents to populate
+.TP
+.I \- device_spec
+device_id, or XkbUseCoreKbd
+.SH DESCRIPTION
+.LP
+Xkb provides two functions to obtain the keyboard mapping components from the 
+server. The 
+first function, 
+.I XkbGetMap, 
+allocates an XkbDescRec structure, retrieves mapping components from the server, 
+and 
+stores them in the XkbDescRec structure it just allocated. The second function, 
+.I XkbGetUpdatedMap, 
+retrieves mapping components from the server and stores them in an XkbDescRec 
+structure 
+that has previously been allocated.
+
+To allocate an XkbDescRec structure and populate it with the server's keyboard 
+client map 
+and server map, use 
+.I XkbGetMap. XkbGetMap 
+is similar to 
+.I XkbGetKeyboard,
+but is used only for obtaining the address of an XkbDescRec structure that is 
+populated 
+with keyboard mapping components. It allows finer control over which 
+substructures of the 
+keyboard mapping components are to be populated.
+.I XkbGetKeyboard 
+always returns fully populated components, while 
+.I XkbGetMap 
+can be instructed to return a partially populated component.
+
+The 
+.I which mask is a bitwise inclusive OR of the masks defined in Table 14.1. Only 
+those 
+portions of the keyboard server map and the keyboard client maps that are 
+specified in 
+.I which 
+are allocated and populated. 
+
+In addition to allocating and obtaining the server map and the client map,
+.I XkbGetMap 
+also sets the 
+.I device_spec, 
+the 
+.I min_key_code, 
+and 
+.I max_key_code 
+fields of the keyboard description. 
+
+.I XkbGetMap 
+is synchronous; it queries the server for the desired information, waits for a 
+reply, and 
+then returns. If successful, 
+.I XkbGetMap 
+returns a pointer to the XkbDescRec structure it allocated. If unsuccessful,
+.I XkbGetMap 
+returns NULL. When unsuccessful, one of the following protocol errors is also 
+generated: 
+BadAlloc (unable to allocate the XkbDescRec structure), BadValue (some mask bits 
+in 
+.I which 
+are undefined), or BadImplementation (a compatible version of the Xkb extension 
+is not 
+available in the server). To free the returned data, use
+.I XkbFreeClientMap.
+
+Xkb also provides convenience functions to get partial component definitions 
+from the 
+server. These functions are specified in the "convenience functions" column in 
+Table 
+1. Refer to the sections listed in the table for more information on these 
+functions.
+
+.TS
+c s s s s
+c s s s s
+l l l l l
+l l l l l
+lw(3i) l l lw(1i) lw(3i).
+Table 1 Xkb Mapping Component Masks
+and Convenience Functions
+_
+Mask   Value   Map     Fields  Convenience
+                               Functions
+_
+T{
+XkbKeyTypesMask
+T}     (1<<0)  client  T{
+types
+.br
+size_types
+.br
+num_types
+T}     T{
+XkbGetKeyTypes
+.br
+XkbResizeKeyType
+.br
+XkbCopyKeyType
+.br
+XkbCopyKeyTypes
+T}
+T{
+XkbKeySymsMask
+T}     (1<<1)  client  T{
+syms
+.br
+size_syms
+.br
+num_syms
+.br
+key_sym_map
+T}     T{
+XkbGetKeySyms
+.br
+XkbResizeKeySyms
+.br
+XkbChangeTypesOfKey
+T}
+T{
+XkbModifierMapMask
+T}     (1<<2)  client  modmap  T{
+XkbGetKeyModifierMap
+T}
+T{
+XkbExplicitComponentsMask
+T}     (1<<3)  server  T{
+explicit
+T}     T{
+XkbGetKeyExplicitComponents
+T}
+T{
+XkbKeyActionsMask
+T}     (1<<4)  server  T{
+key_acts
+.br
+acts
+.br
+num_acts
+.br
+size_acts
+T}     T{
+XkbGetKeyActions
+.br
+XkbResizeKeyActions
+T}
+T{
+XkbKeyBehaviorsMask
+T}     (1<<5)  server  T{
+behaviors
+T}     T{
+XkbGetKeyBehaviors
+T}
+T{
+XkbVirtualModsMask
+T}     (1<<6)  server  T{
+vmods
+T}     T{
+XkbGetVirtualMods
+T}
+T{
+XkbVirtualModMapMask
+T}     (1<<7)  server  T{
+vmodmap
+T}     T{
+XkbGetVirtualModMap
+T}
+.TE
+
+.nf
+.bp
+Xkb defines combinations of these masks for convenience:
+   
+   #define XkbResizableInfoMask   (XkbKeyTypesMask)
+   #define XkbAllClientInfoMask   (XkbKeyTypesMask | XkbKeySymsMask |
+                                   XkbModifierMapMask)
+   #define XkbAllServerInfoMask   (XkbExplicitComponentsMask |
+                                   XkbKeyActionsMask | 
+                                   XkbKeyBehaviorsMask |
+                                   XkbVirtualModsMask | 
+                                   XkbVirtualModMapMask)
+   #define XkbAllMapComponentsMask XkbAllClientInfoMask | 
+                                   XkbAllServerInfoMask)
+      
+.fi      
+Key types, symbol maps, and actions are all interrelated: changes in one require 
+changes 
+in the others. The convenience functions make it easier to edit these components 
+and 
+handle the interdependencies. 
+
+.SH STRUCTURES
+.LP
+The complete description of an Xkb keyboard is given by an XkbDescRec. The 
+component 
+structures in the XkbDescRec represent the major Xkb components.
+
+.nf
+typedef struct {
+   struct _XDisplay * display;      /\(** connection to X server */
+   unsigned short     flags;        /\(** private to Xkb, do not modify */
+   unsigned short     device_spec;  /\(** device of interest */
+   KeyCode            min_key_code; /\(** minimum keycode for device */
+   KeyCode            max_key_code; /\(** maximum keycode for device */
+   XkbControlsPtr     ctrls;        /\(** controls */
+   XkbServerMapPtr    server;       /\(** server keymap */
+   XkbClientMapPtr    map;          /\(** client keymap */
+   XkbIndicatorPtr    indicators;   /\(** indicator map */
+   XkbNamesPtr        names;        /\(** names for all components */
+   XkbCompatMapPtr    compat;       /\(** compatibility map */
+   XkbGeometryPtr     geom;         /\(** physical geometry of keyboard */
+} XkbDescRec, *XkbDescPtr;
+
+.fi
+The 
+.I display 
+field points to an X display structure. The 
+.I flags field is private to the library: modifying 
+.I flags 
+may yield unpredictable results. The 
+.I device_spec 
+field specifies the device identifier of the keyboard input device, or 
+XkbUseCoreKeyboard, which specifies the core keyboard device. The 
+.I min_key_code
+and 
+.I max_key_code 
+fields specify the least and greatest keycode that can be returned by the 
+keyboard. 
+
+Each structure component has a corresponding mask bit that is used in function 
+calls to 
+indicate that the structure should be manipulated in some manner, such as 
+allocating it 
+or freeing it. These masks and their relationships to the fields in the 
+XkbDescRec are 
+shown in Table 2.
+
+.TS
+c s s
+l l l
+l l l.
+Table 2 Mask Bits for XkbDescRec
+_
+Mask Bit       XkbDescRec Field        Value
+_
+XkbControlsMask        ctrls   (1L<<0)
+XkbServerMapMask       server  (1L<<1)
+XkbIClientMapMask      map     (1L<<2)
+XkbIndicatorMapMask    indicators      (1L<<3)
+XkbNamesMask   names   (1L<<4)
+XkbCompatMapMask       compat  (1L<<5)
+XkbGeometryMask        geom    (1L<<6)
+XkbAllComponentsMask   All Fields      (0x7f)
+.TE
+.SH "SEE ALSO"
+.BR XkbChangeTypesOfKey (__libmansuffix__),
+.BR XkbCopyKeyType (__libmansuffix__),
+.BR XkbCopyKeyTypes (__libmansuffix__),
+.BR XkbFreeClientMap (__libmansuffix__),
+.BR XkbGetKeyActions (__libmansuffix__),
+.BR XkbGetKeyBehaviors (__libmansuffix__),
+.BR XkbGetKeyboard (__libmansuffix__),
+.BR XkbGetKeyExplicitComponents (__libmansuffix__),
+.BR XkbGetKeyModifierMap (__libmansuffix__),
+.BR XkbGetKeySyms (__libmansuffix__),
+.BR XkbGetKeyTypes (__libmansuffix__),
+.BR XkbGetUpdatedMap (__libmansuffix__),
+.BR XkbGetVirtualModMap (__libmansuffix__),
+.BR XkbGetVirtualMods (__libmansuffix__),
+.BR XkbResizeKeyActions (__libmansuffix__),
+.BR XkbResizeKeySyms (__libmansuffix__),
+.BR XkbResizeKeyType (__libmansuffix__)
+
+
+
+
+
diff --git a/man/xkb/XkbGetNameChanges.man b/man/xkb/XkbGetNameChanges.man
new file mode 100644 (file)
index 0000000..359c7c9
--- /dev/null
@@ -0,0 +1,70 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetNameChanges __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetNameChanges \- Update the local copy of the keyboard description with the 
+actual values of the results of one or more calls to 
+.I XkbNoteNameChanges
+.SH SYNOPSIS
+.HP
+.B Status XkbGetNameChanges
+.BI "(\^Display *" "dpy" "\^,"
+.BI "XkbDescPtr " "xkb" "\^,"
+.BI "XkbNameChangesPtr " "changes" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to the X server
+.TP
+.I \- xkb
+keyboard description to which names are copied
+.TP
+.I \- changes
+names components to be obtained from the server
+.SH DESCRIPTION
+.LP
+.I XkbGetNameChanges 
+examines the 
+.I changes 
+parameter, retrieves the necessary information from the server, and places the 
+results into the 
+.I xkb 
+keyboard description.
+
+.I XkbGetNamesChanges 
+can generate BadAlloc, BadImplementation, and BadMatch errors.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadImplementation
+Invalid reply from server
+.TP 15
+.B BadMatch
+A compatible version of Xkb was not available in the server or an argument has 
+correct type and range, but is otherwise invalid
+.SH "SEE ALSO"
+.BR XkbNoteNameChanges (__libmansuffix__)
diff --git a/man/xkb/XkbGetNamedGeometry.man b/man/xkb/XkbGetNamedGeometry.man
new file mode 100644 (file)
index 0000000..29222e8
--- /dev/null
@@ -0,0 +1,159 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetNamedGeometry __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetNamedGeometry \- Loads a keyboard geometry description from this database 
+by name
+.SH SYNTAX
+.HP
+.B Status XkbGetNamedGeometry
+.BI "(\^Display *" "dpy" "\^,"
+.BI "XkbDescPtr " "xkb" "\^,"
+.BI "Atom " "name" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to the X server
+.TP
+.I \- xkb
+keyboard description into which the geometry should be loaded
+.TP
+.I \- name
+name of the geometry to be loaded
+.SH DESCRIPTION
+.LP
+It is also possible to load a keyboard geometry by name. The X server maintains 
+a database 
+of keyboard components (see below).
+
+.I XkbGetNamedGeometry 
+can return BadName if the name cannot be found.
+
+The X server maintains a database of keyboard components, identified by 
+component type. 
+The database contains all the information necessary to build a complete keyboard 
+description for a particular device, as well as to assemble partial 
+descriptions. Table 1 identifies the component types and the type of information 
+they contain.
+
+.TS
+c s s
+l l l
+l l l
+l lw(2i) lw(2i).
+Table 1 Server Database Keyboard Components
+_
+Component      Component Primary Contents      May also contain
+Type
+_
+Keymap T{
+Complete keyboard description
+.br 
+Normally assembled using a complete component from each of the other types
+T}
+.sp
+Keycodes       T{
+Symbolic name for each key
+.br
+Minimum and maximum legal keycodes
+T}     T{
+Aliases for some keys
+.br
+Symbolic names for indicators
+.br
+Description of indicators physically present
+T}
+.sp
+Types  Key types       T{
+Real modifier bindings and symbolic names for some virtual modifiers
+T}
+.sp
+Compatibility  T{
+Rules used to assign actions to keysyms
+T}     T{
+Maps for some indicators
+.br
+Real modifier bindings and symbolic names for some virtual modifiers
+T}
+.sp
+Symbols        T{
+Symbol mapping for keyboard keys
+.br
+Modifier mapping
+.br
+Symbolic names for groups
+T}     T{
+Explicit actions and behaviors for some keys
+.br
+Real modifier bindings and symbolic names for some virtual modifiers
+T}
+.sp
+Geometry       Layout of the keyboard  T{
+Aliases for some keys; overrides keycodes component aliases
+.br
+Symbolic names for some indicators
+.br
+Description of indicators physically present
+T}
+.TE
+
+While a keymap is a database entry for a complete keyboard description, and 
+therefore 
+logically different from the individual component database entries, the rules 
+for 
+processing keymap entries are identical to those for the individual components. 
+In the 
+discussion that follows, the term component is used to refer to either 
+individual 
+components or a keymap.
+
+There may be multiple entries for each of the component types. An entry may be 
+either
+.I complete 
+or 
+.I partial. 
+Partial entries describe only a piece of the corresponding keyboard component 
+and are 
+designed to be combined with other entries of the same type to form a complete 
+entry.
+
+For example, a partial symbols map might describe the differences between a 
+common ASCII 
+keyboard and some national layout. Such a partial map is not useful on its own 
+because it 
+does not include those symbols that are the same on both the ASCII and national 
+layouts 
+(such as function keys). On the other hand, this partial map can be used to 
+configure 
+.I any 
+ASCII keyboard to use a national layout.
+
+When a keyboard description is built, the components are processed in the order 
+in which 
+they appear in Table 1; later definitions override earlier ones.
+.SH DIAGNOSTICS
+.TP 15
+.B BadName
+A font or color of the specified name does not exist.
diff --git a/man/xkb/XkbGetNamedIndicator.man b/man/xkb/XkbGetNamedIndicator.man
new file mode 100644 (file)
index 0000000..803d656
--- /dev/null
@@ -0,0 +1,116 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetNamedIndicator __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetNamedIndicator \- Look up the indicator map and other information for an 
+indicator by name
+.SH SYNOPSIS
+.HP
+.B Bool XkbGetNamedIndicator
+.BI "(\^Display *" "dpy" "\^,"
+.BI "unsigned int " "dev_spec" "\^,"
+.BI "Atom " "name" "\^,"
+.BI "int *" "ndx_rtrn" "\^,"
+.BI "Bool *" "state_rtrn" "\^,"
+.BI "XkbIndicatorMapPtr " "map_rtrn" "\^,"
+.BI "Bool *" "real_rtrn" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to the X server 
+.TP
+.I \- dev_spec
+keyboard device ID, or XkbUseCoreKbd
+.TP
+.I \- name
+name of the indicator to be retrieved
+.TP
+.I \- ndx_rtrn
+backfilled with the index of the retrieved indicator
+.TP
+.I \- state_rtrn
+backfilled with the current state of the retrieved indicator
+.TP
+.I \- map_rtrn
+ backfilled with the mapping for the retrieved indicator 
+.TP
+.I \- real_rtrn
+backfilled with True if the named indicator is real (physical)
+.SH DESCRIPTION
+.LP
+Xkb also allows applications to refer to indicators by name. Use 
+.I XkbGetNames 
+to get the indicator names. Using names eliminates the need for hard-coding 
+bitmask values for particular keyboards. For example, instead of using 
+vendor-specific constants such as WSKBLed_ScrollLock mask on Digital 
+workstations or XLED_SCROLL_LOCK on Sun workstations, you can instead use
+.I XkbGetNamedIndicator 
+to look up information on the indicator named "Scroll Lock." 
+
+If the device specified by 
+.I device_spec 
+has an indicator named 
+.I name, XkbGetNamedIndicator 
+returns True and populates the rest of the parameters with information about the 
+indicator. Otherwise, 
+.I XkbGetNamedIndicator 
+returns False.
+
+The 
+.I ndx_rtrn 
+field returns the zero-based index of the named indicator. This index is the bit 
+position to use in any function call that requires a mask of indicator bits, as 
+well as the indicator's index into the XkbIndicatorRec array of indicator maps. 
+.I state_rtrn 
+returns the current state of the named indicator (True = on, False = off). 
+.I map_rtrn 
+returns the indicator map for the named indicator. In addition, if the indicator 
+is mapped to a physical LED, the 
+.I real_rtrn 
+parameter is set to True.
+
+Each of the "
+.I _rtrn
+" arguments is optional; you can pass NULL for any unneeded "
+.I _rtrn
+" arguments.
+.SH "RETURN VALUES"
+.TP 15
+True
+The 
+.I XkbGetNamedIndicator 
+function returns True if the device specified by 
+.I device_spec 
+has an indicator named 
+.I name.
+.TP 15
+False
+The 
+.I XkbGetNamedIndicator 
+function returns False if the device specified by 
+.I device_spec 
+does not have an indicator named 
+.I name.
+.SH "SEE ALSO"
+.BR XkbGetNames (__libmansuffix__)
diff --git a/man/xkb/XkbGetNames.man b/man/xkb/XkbGetNames.man
new file mode 100644 (file)
index 0000000..9d5ca5e
--- /dev/null
@@ -0,0 +1,135 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetNames __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetNames \- Obtain symbolic names from the server
+.SH SYNOPSIS
+.HP
+.B Status XkbGetNames
+.BI "(\^Display *" "dpy" "\^,"
+.BI "unsigned int " "which" "\^,"
+.BI "XkbDescPtr " "Xkb" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to the X server
+.TP
+.I \- which
+mask of names or map components to be updated
+.TP
+.I \- Xkb
+keyboard description to be updated
+.SH DESCRIPTION
+.LP
+.I XkbGetNames 
+retrieves symbolic names for the components of the keyboard extension from the X server. The 
+.I which 
+parameter specifies the name components to be updated in the 
+.I xkb 
+parameter, and is the bitwise inclusive OR of the valid names mask bits defined in Table 1.
+
+
+.TS
+c s s s
+l l l l.
+Table 1 Symbolic Names Masks
+_
+Mask Bit       Value   Keyboard        Field
+               Component
+_
+XkbKeycodesNameMask    (1<<0)  Xkb->names      keycodes
+XkbGeometryNameMask    (1<<1)  Xkb->names      geometry
+XkbSymbolsNameMask     (1<<2)  Xkb->names      symbols
+XkbPhysSymbolsNameMask (1<<3)  Xkb->names      phys_symbols
+XkbTypesNameMask       (1<<4)  Xkb->names      type
+XkbCompatNameMask      (1<<5)  Xkb->names      compat
+XkbKeyTypeNamesMask    (1<<6)  Xkb->map        type[*].name
+XkbKTLevelNamesMask    (1<<7)  Xkb->map        type[*].lvl_names[*]
+XkbIndicatorNamesMask  (1<<8)  Xkb->names      indicators[*]
+XkbKeyNamesMask        (1<<9)  Xkb->names      keys[*], num_keys
+XkbKeyAliasesMask      (1<<10) Xkb->names      key_aliases[*], num_key_aliases
+XkbVirtualModNamesMask (1<<11) Xkb->names      vmods[*]
+XkbGroupNamesMask      (1<<12) Xkb->names      groups[*]
+XkbRGNamesMask (1<<13) Xkb->names      radio_groups[*], num_rg
+XkbComponentNamesMask  (0x3f)  Xkb->names      keycodes,
+                       geometry,
+                       symbols,
+                       physical symbols,
+                       types, and
+                       compatibility map
+XkbAllNamesMask        (0x3fff)        Xkb->names      all name components
+.TE
+
+If the 
+.I names 
+field of the keyboard description 
+.I xkb 
+is NULL, 
+.I XkbGetNames 
+allocates and initializes the 
+.I names 
+component of the keyboard description before obtaining the values specified by
+.I which. 
+If the 
+.I names field of 
+.I xkb 
+is not NULL, 
+.I XkbGetNames 
+obtains the values specified by 
+.I which 
+and copies them into the keyboard description 
+.I Xkb.
+
+If the 
+.I map 
+component of the 
+.I xkb 
+parameter is NULL, 
+.I XkbGetNames 
+does not retrieve type or shift level names, even if XkbKeyTypeNamesMask or XkbKTLevelNamesMask are set in 
+.I which.
+
+.I XkbGetNames 
+can return Success, or BadAlloc, BadLength, BadMatch, and BadImplementation errors.
+
+To free symbolic names, use 
+.I XkbFreeNames.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadImplementation
+Invalid reply from server
+.TP 15
+.B BadLength
+The length of a request is shorter or longer than that required to minimally contain the arguments
+.TP 15
+.B BadMatch
+A compatible version of Xkb was not available in the server or an argument has correct type and range, but 
+is otherwise invalid
+.SH "SEE ALSO"
+.BR XkbFreeNames (__libmansuffix__)
+
diff --git a/man/xkb/XkbGetSlowKeysDelay.man b/man/xkb/XkbGetSlowKeysDelay.man
new file mode 100644 (file)
index 0000000..5472ad7
--- /dev/null
@@ -0,0 +1,215 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetSlowKeysDelay __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetSlowKeysDelay \- Gets the SlowKeys acceptance delay for a keyboard device
+.SH SYNOPSIS
+.HP
+.B Bool XkbGetSlowKeysDelay
+.BI "(\^Display *" "display" "\^,"
+.BI "unsigned int " "device_spec" "\^,"
+.BI "unsigned int *" "delay_rtrn" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- display
+connection to X server
+.TP
+.I \- device_spec
+device ID, or XkbUseCoreKbd
+.TP
+.I \- delay_rtrn
+backfilled with SlowKeys delay, ms
+.SH DESCRIPTION
+.LP
+Some users may accidentally bump keys while moving a hand or typing stick toward 
+the key they want. Usually, the keys that are accidentally bumped are just hit 
+for a very short period of time. The SlowKeys control helps filter these 
+accidental bumps by telling the server to wait a specified period, called the 
+.I SlowKeys acceptance delay, 
+before delivering key events. If the key is released before this period elapses, 
+no key events are generated. Users can then bump any number of keys on their way 
+to the one they want without accidentally getting those characters. Once they 
+have reached the key they want, they can then hold the desired key long enough 
+for the computer to accept it. SlowKeys is a boolean control with one 
+configurable attribute. 
+
+When the SlowKeys control is active, the server reports the initial key press, 
+subsequent acceptance or rejection, and release of any key to interested clients 
+by sending an appropriate AccessXNotify event (see section 10.6.4).
+
+The server can generate XkbAccessXNotify events for some of the global keyboard 
+controls. 
+The detail field describes what AccessX event just occurred and can be any of 
+the values in 
+Table 1.
+The server can generate XkbAccessXNotify events for some of the global keyboard 
+controls. 
+The detail field describes what AccessX event just occurred and can be any of 
+the values in 
+Table 1.
+
+.TS
+c s
+l l
+l lw(4i).
+Table 1 AccessXNotify Events
+_
+detail Reason
+_
+XkbAXN_SKPress T{
+A key was pressed when SlowKeys was enabled.
+T}
+XkbAXN_SKAccept        T{
+A key was accepted (held longer than the SlowKeys delay).
+T}
+XkbAXN_SKRelease       T{
+An accepted SlowKeys key was released.
+T}
+XkbAXN_SKReject        T{
+A key was rejected (released before the SlowKeys delay expired).
+T}
+XkbAXN_BKAccept        T{
+A key was accepted by BounceKeys.
+T}
+XkbAXN_BKReject        T{
+A key was rejected (pressed before the BounceKeys delay expired).
+T}
+XkbAXN_AXKWarning      T{
+AccessXKeys is about to turn on/off StickyKeys or BounceKeys.
+T}
+.TE
+
+
+The 
+.I keycode 
+field reports the keycode of the key for which the event occurred. If the action 
+is related to
+.I SlowKeys, 
+the 
+.I slowKeysDelay 
+field contains the current SlowKeys acceptance delay. If the action is related 
+to BounceKeys, 
+the 
+.I debounceDelay 
+field contains the current BounceKeys debounce delay.
+
+Selecting for AccessX Events
+
+To receive XkbAccessXNotify events under all possible conditions, use 
+.I XkbSelectEvents
+and pass XkbAccesXNotifyMask in both 
+.I bits_to_change 
+and 
+.I values_for_bits.
+
+To receive XkbStateNotify events only under certain conditions, use 
+.I XkbSelectEventDetails 
+using XkbAccessXNotify as the 
+.I event_type 
+and specifying the desired state changes in 
+.I bits_to_change 
+and 
+.I values_for_bits 
+using mask bits from Table 2.
+
+.TS
+c s s
+l l l
+l l lw(3i).
+Table 2 AccessXNotify Event Details
+_
+XkbAccessXNotify Event Details Value   Circumstances
+_
+XkbAXN_SKPressMask     (1<<0)  T{
+Slow key press notification wanted
+T}
+XkbAXN_SKAcceptMask    (1<<1)  T{
+Slow key accept notification wanted
+T}
+XkbAXN_SKRejectMask    (1<<2)  T{
+Slow key reject notification wanted
+T}
+XkbAXN_SKReleaseMask   (1<<3)  T{
+Slow key release notification wanted
+T}
+XkbAXN_BKAcceptMask    (1<<4)  T{
+Bounce key accept notification wanted
+T}
+XkbAXN_BKRejectMask    (1<<5)  T{
+Bounce key reject notification wanted
+T}
+XkbAXN_AXKWarningMask  (1<<6)  T{
+AccessX warning notification wanted
+T}
+XkbAllAccessXEventsMask        (0x7f)  T{
+All AccessX features notifications wanted
+T}
+.TE
+
+.I XkbGetSlowKeysDelay 
+requests the attributes of the SlowKeys control from the server, waits for a 
+reply and backfills 
+.I delay_rtrn 
+with the SlowKeys delay attribute. 
+.I XkbGetSlowKeysDelay 
+returns True if successful; , 
+.I XkbGetSlowKeysDelay 
+returns False.
+.SH "RETURN VALUES"
+.TP 15
+True
+The 
+.I XkbGetSlowKeysDelay 
+function returns True if the request of the Slowkeys control from the server was 
+successful.
+.I 
+.TP 15
+False
+The 
+.I XkbGetSlowKeysDelay 
+function returns False if a compatible version of the Xkb extension is not 
+available in the server.
+.SH STRUCTURES
+.LP
+The structure for the XkbAccessXNotify event type is as follows:
+
+.nf
+typedef struct {
+    int            type;           /\(** Xkb extension base event code */
+    unsigned long  serial;         /\(** X server serial number for event */
+    Bool           send_event;     /\(** True => synthetically generated */
+    Display *      display;        /\(** server connection where event generated */
+    Time           time;           /\(** server time when event generated */
+    int            xkb_type;       /\(** XkbAccessXNotify */
+    int            device;         /\(** Xkb device ID, will not be XkbUseCoreKbd 
+*/
+    int            detail;         /\(** XkbAXN_* */
+    KeyCode        keycode;        /\(** key of event */
+    int            slowKeysDelay;  /\(** current SlowKeys delay */
+    int            debounceDelay;  /\(** current debounce delay */
+} XkbAccessXNotifyEvent;
+    
+.fi    
+
diff --git a/man/xkb/XkbGetState.man b/man/xkb/XkbGetState.man
new file mode 100644 (file)
index 0000000..4547e59
--- /dev/null
@@ -0,0 +1,55 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetState __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetState \-  Obtains the keyboard state 
+.SH SYNOPSIS
+.HP
+.B Status XkbGetState
+.BI "(\^Display *" "display" "\^,"
+.BI "unsigned int " "device_spec" "\^,"
+.BI "XkbStatePtr " "state_return" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I display
+connection to the X server 
+.TP
+.I device_spec
+device ID, or XkbUseCoreKbd
+.TP
+.I state_return
+backfilled with Xkb state
+.SH DESCRIPTION
+.LP
+The 
+.I XkbGetState 
+function queries the server for the current keyboard state, waits 
+for a reply, and then backfills 
+.I state_return 
+with the results.
+
+All group values are expressed as group indices in the range [0..3]. Modifiers 
+and the compatibility modifier state values are expressed as the bitwise union 
+of the core X11 modifier masks. The pointer button state is reported as in the 
+core X11 protocol.
diff --git a/man/xkb/XkbGetStickyKeysOptions.man b/man/xkb/XkbGetStickyKeysOptions.man
new file mode 100644 (file)
index 0000000..ed7a2dc
--- /dev/null
@@ -0,0 +1,115 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetStickyKeysOptions __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetStickyKeysOptions \- Queries the current StickyKeys attributes for a keyboard device
+.SH SYNOPSIS
+.HP
+.B Bool XkbGetStickyKeysOptions
+.BI "(\^Display *" "display" "\^,"
+.BI "unsigned int " "device_spec" "\^,"
+.BI "unsigned int *" "options_rtrn" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- display
+connection to X server
+.TP
+.I \- device_spec
+device ID, or XkbUseCoreKbd
+.TP
+.I \- options_rtrn
+backfilled with StickyKeys option mask
+.SH DESCRIPTION
+.LP
+The StickyKeys control has two options that can be accessed via the 
+.I ax_options 
+of an XkbControlsRec structure. The first option, TwoKeys, specifies whether StickyKeys should 
+automatically turn off when two keys are pressed at the same time. This feature is useful for 
+shared computers so people who do not want them do not need to turn StickyKeys off if a previous 
+user left StickyKeys on. The second option, LatchToLock, specifies whether or not StickyKeys 
+locks a modifier when pressed twice in a row.
+
+.I XkbGetStickyKeysOptions 
+requests the attributes of the StickyKeys control from the server, waits for a reply, and 
+backfills 
+.I options_rtrn 
+with a mask indicating whether the individual StickyKeys options are on or off. Valid bits in 
+.I options_rtrn 
+are:
+.nf
+
+     XkbAX_TwoKeysMask
+     XkbAX_LatchToLockMask
+     
+.fi     
+.I XkbGetStickyKeysOptions 
+returns True if successful; if a compatible version of the Xkb extension is not available in the 
+server 
+.I XkbGetStickyKeysOptions 
+returns False.
+.SH "RETURN VALUES"
+.TP 15
+True
+The 
+.I XkbGetStickyKeysOptions 
+function returns True if the request for the attributes of the StickyKeys control from the 
+server was successful.
+.TP 15
+False
+The 
+.I XkbGetStickyKeysOptions 
+function returns False if a compatible version of the Xkb extension is not available in the 
+server. 
+.SH STRUCTURES
+.nf
+The XkbControlsRec structure is defined as follows:
+
+    #define XkbMaxLegalKeyCode     255
+    #define XkbPerKeyBitArraySize  ((XkbMaxLegalKeyCode+1)/8)
+    
+    typedef struct {
+        unsigned char   mk_dflt_btn;      /\(** default button for keyboard driven mouse */
+        unsigned char   num_groups;       /\(** number of keyboard groups */
+        unsigned char   groups_wrap;      /\(** how to wrap out-of-bounds groups */
+        XkbModsRec      internal;         /\(** defines server internal modifiers */
+        XkbModsRec      ignore_lock;      /\(** modifiers to ignore when checking for grab */
+        unsigned int    enabled_ctrls;    /\(** 1 bit => corresponding boolean control enabled */
+        unsigned short  repeat_delay;     /\(** ms delay until first repeat */
+        unsigned short  repeat_interval;  /\(** ms delay between repeats */
+        unsigned short  slow_keys_delay;  /\(** ms minimum time key must be down to be ok */
+        unsigned short  debounce_delay;   /\(** ms delay before key reactivated */
+        unsigned short  mk_delay;         /\(** ms delay to second mouse motion event */
+        unsigned short  mk_interval;      /\(** ms delay between repeat mouse events */
+        unsigned short  mk_time_to_max;   /\(** # intervals until constant mouse move */
+        unsigned short  mk_max_speed;     /\(** multiplier for maximum mouse speed */
+        short           mk_curve;         /\(** determines mouse move curve type */
+        unsigned short  ax_options;       /\(** 1 bit => Access X option enabled */
+        unsigned short  ax_timeout;       /\(** seconds until Access X disabled */
+        unsigned short  axt_opts_mask;    /\(** 1 bit => options to reset on Access X timeout */
+        unsigned short  axt_opts_values;  /\(** 1 bit => turn option on, 0=> off */
+        unsigned int    axt_ctrls_mask;   /\(** which bits in enabled_ctrls to modify */
+        unsigned int    axt_ctrls_values; /\(** values for new bits in enabled_ctrls */
+        unsigned char   per_key_repeat[XkbPerKeyBitArraySize];  /\(** per key auto repeat */
+     } XkbControlsRec, *XkbControlsPtr;
+.fi
diff --git a/man/xkb/XkbGetUpdatedMap.man b/man/xkb/XkbGetUpdatedMap.man
new file mode 100644 (file)
index 0000000..917ea66
--- /dev/null
@@ -0,0 +1,262 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetUpdatedMap __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetUpdatedMap \-  Update the client or server map information in an existing 
+keyboard description
+.SH SYNOPSIS
+.HP
+.B Status XkbGetUpdatedMap
+.BI "(\^Display *" "display" "\^,"
+.BI "unsigned int " "which" "\^,"
+.BI "XkbDescPtr " "xkb" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- display
+connection to X server
+.TP
+.I \- which
+mask selecting subcomponents to populate
+.TP
+.I \- xkb
+keyboard description to be updated
+.SH DESCRIPTION
+.LP
+The 
+.I which 
+parameter is a bitwise inclusive OR of the masks in Table 1. If the needed 
+components of the 
+.I xkb 
+structure are not already allocated, 
+.I XkbGetUpdatedMap 
+allocates them. 
+.I XkbGetUpdatedMap 
+fetches the requested information for the device specified in the XkbDescRec 
+passed in the 
+.I xkb 
+parameter.
+
+.TS
+c s s s s
+c s s s s
+l l l l l
+l l l l l
+lw(3i) l l lw(1i) lw(3i).
+Table 1 Xkb Mapping Component Masks
+and Convenience Functions
+_
+Mask   Value   Map     Fields  Convenience
+                               Functions
+_
+T{
+XkbKeyTypesMask
+T}     (1<<0)  client  T{
+types
+.br
+size_types
+.br
+num_types
+T}     T{
+XkbGetKeyTypes
+.br
+XkbResizeKeyType
+.br
+XkbCopyKeyType
+.br
+XkbCopyKeyTypes
+T}
+T{
+XkbKeySymsMask
+T}     (1<<1)  client  T{
+syms
+.br
+size_syms
+.br
+num_syms
+.br
+key_sym_map
+T}     T{
+XkbGetKeySyms
+.br
+XkbResizeKeySyms
+.br
+XkbChangeTypesOfKey
+T}
+T{
+XkbModifierMapMask
+T}     (1<<2)  client  modmap  T{
+XkbGetKeyModifierMap
+T}
+T{
+XkbExplicitComponentsMask
+T}     (1<<3)  server  T{
+explicit
+T}     T{
+XkbGetKeyExplicitComponents
+T}
+T{
+XkbKeyActionsMask
+T}     (1<<4)  server  T{
+key_acts
+.br
+acts
+.br
+num_acts
+.br
+size_acts
+T}     T{
+XkbGetKeyActions
+.br
+XkbResizeKeyActions
+T}
+T{
+XkbKeyBehaviorsMask
+T}     (1<<5)  server  T{
+behaviors
+T}     T{
+XkbGetKeyBehaviors
+T}
+T{
+XkbVirtualModsMask
+T}     (1<<6)  server  T{
+vmods
+T}     T{
+XkbGetVirtualMods
+T}
+T{
+XkbVirtualModMapMask
+T}     (1<<7)  server  T{
+vmodmap
+T}     T{
+XkbGetVirtualModMap
+T}
+.TE
+
+.I XkbGetUpdatedMap 
+is synchronous; it queries the server for the desired information, waits for a 
+reply, and then returns. If successful, 
+.I XkbGetUpdatedMap 
+returns Success. If unsuccessful, 
+.I XkbGetUpdatedMap 
+returns one of the following: BadAlloc (unable to allocate a component in the 
+XkbDescRec structure), BadValue (some mask bits in 
+.I which 
+are undefined), BadImplementation (a compatible version of the Xkb extension is 
+not available in the server or the reply from the server was invalid).
+.SH "RETURN VALUES"
+.TP 15
+Success
+The 
+.I XkbGetUpdatedMap 
+function returns Success if a reply is received to the server query for the desired information.
+.SH STRUCTURES
+.LP
+The complete description of an Xkb keyboard is given by an XkbDescRec. The 
+component 
+structures in the XkbDescRec represent the major Xkb components.
+
+.nf
+typedef struct {
+   struct _XDisplay * display;      /\(** connection to X server */
+   unsigned short     flags;        /\(** private to Xkb, do not modify */
+   unsigned short     device_spec;  /\(** device of interest */
+   KeyCode            min_key_code; /\(** minimum keycode for device */
+   KeyCode            max_key_code; /\(** maximum keycode for device */
+   XkbControlsPtr     ctrls;        /\(** controls */
+   XkbServerMapPtr    server;       /\(** server keymap */
+   XkbClientMapPtr    map;          /\(** client keymap */
+   XkbIndicatorPtr    indicators;   /\(** indicator map */
+   XkbNamesPtr        names;        /\(** names for all components */
+   XkbCompatMapPtr    compat;       /\(** compatibility map */
+   XkbGeometryPtr     geom;         /\(** physical geometry of keyboard */
+} XkbDescRec, *XkbDescPtr;
+
+.fi
+The 
+.I display 
+field points to an X display structure. The 
+.I flags 
+field is private to the library: modifying 
+.I flags 
+may yield unpredictable results. The 
+.I device_spec 
+field specifies the device identifier of the keyboard input device, or 
+XkbUseCoreKeyboard, which specifies the core keyboard device. The 
+.I min_key_code
+and 
+.I max_key_code 
+fields specify the least and greatest keycode that can be returned by the 
+keyboard. 
+
+Each structure component has a corresponding mask bit that is used in function 
+calls to 
+indicate that the structure should be manipulated in some manner, such as 
+allocating it 
+or freeing it. These masks and their relationships to the fields in the 
+XkbDescRec are 
+shown in Table 2.
+.bp
+.TS
+c s s
+l l l
+l l l.
+Table 2 Mask Bits for XkbDescRec
+_
+Mask Bit       XkbDescRec Field        Value
+_
+XkbControlsMask        ctrls   (1L<<0)
+XkbServerMapMask       server  (1L<<1)
+XkbIClientMapMask      map     (1L<<2)
+XkbIndicatorMapMask    indicators      (1L<<3)
+XkbNamesMask   names   (1L<<4)
+XkbCompatMapMask       compat  (1L<<5)
+XkbGeometryMask        geom    (1L<<6)
+XkbAllComponentsMask   All Fields      (0x7f)
+.TE
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadImplementation
+Invalid reply from server
+.TP 15
+.B BadValue
+An argument is out of range
+.SH "SEE ALSO"
+.BR XkbChangeTypesOfKey (__libmansuffix__),
+.BR XkbCopyKeyType (__libmansuffix__),
+.BR XkbCopyKeyTypes (__libmansuffix__),
+.BR XkbGetKeyActions (__libmansuffix__),
+.BR XkbGetKeyBehaviors (__libmansuffix__),
+.BR XkbGetKeyExplicitComponents (__libmansuffix__),
+.BR XkbGetKeyModifierMap (__libmansuffix__),
+.BR XkbGetKeySyms (__libmansuffix__),
+.BR XkbGetKeyTypes (__libmansuffix__),
+.BR XkbResizeKeyActions (__libmansuffix__),
+.BR XkbResizeKeySyms (__libmansuffix__),
+.BR XkbResizeKeyType (__libmansuffix__),
+.BR XkbGetVirtualModMap (__libmansuffix__),
+.BR XkbGetVirtualMods (__libmansuffix__)
diff --git a/man/xkb/XkbGetVirtualMods.man b/man/xkb/XkbGetVirtualMods.man
new file mode 100644 (file)
index 0000000..28844f4
--- /dev/null
@@ -0,0 +1,208 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetVirtualMods __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetVirtualMods \- Obtain a subset of the virtual modifier bindings (the vmods 
+array) in a keyboard description
+.SH SYNOPSIS
+.HP
+.B Status XkbGetVirtualMods
+.BI "(\^Display *" "dpy" "\^,"
+.BI "unsigned int " "which" "\^,"
+.BI "XkbDescPtr " "xkb" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to server
+.TP
+.I \- which
+mask indicating virtual modifier bindings to get
+.TP
+.I \- xkb
+Xkb description where results will be placed
+.SH DESCRIPTION
+.LP
+.I XkbGetVirtualMods 
+sends a request to the server to obtain the 
+.I vmods 
+entries for the virtual modifiers specified in the mask, 
+.I which, 
+and waits for a reply. 
+
+Virtual modifiers are named by converting their string name to an X Atom and storing the Atom in the 
+.I names.vmods 
+array in an XkbDescRec structure. The position of a name Atom in the 
+.I names.vmods 
+array defines the bit position used to represent the virtual modifier and also the index used when 
+accessing virtual modifier information in arrays: the name in the i-th (0 relative) entry of 
+.I names.vmods 
+is the i-th virtual modifier, represented by the mask (1<<i). Throughout Xkb, various functions have 
+a parameter that is a mask representing virtual modifier choices. In each case, the i-th bit (0 
+relative) of the mask represents the i-th virtual modifier.
+
+To set the name of a virtual modifier, use 
+.I XkbSetNames, 
+using XkbVirtualModNamesMask in 
+.I which 
+and the name in the 
+.I xkb 
+argument; to retrieve indicator names, use 
+.I XkbGetNames.
+
+For each bit set in 
+.I which, XkbGetVirtualMods 
+updates the corresponding virtual modifier definition in the 
+.I server->vmods 
+array of 
+.I xkb. 
+The 
+.I xkb 
+parameter must be a pointer to a valid Xkb keyboard description. If successful,
+.I XkbGetVirtualMods 
+returns Success.
+
+.B Virtual Modifier Names and Masks
+
+Virtual modifiers are named by converting their string name to an X Atom and 
+storing the Atom in the 
+.I names.vmods 
+array in an XkbDescRec structure. The position of a name Atom in the 
+.I names.vmods 
+array defines the bit position used to represent the virtual modifier and also 
+the index used when accessing virtual modifier information in arrays: the name 
+in the i-th (0 relative) entry of 
+.I names.vmods 
+is the i-th virtual modifier, represented by the mask (1<<i). Throughout Xkb, 
+various functions have a parameter that is a mask representing virtual modifier 
+choices. In each case, the i-th bit (0 relative) of the mask represents the i-th 
+virtual modifier.
+
+To set the name of a virtual modifier, use 
+.I XkbSetNames, 
+using XkbVirtualModNamesMask in 
+.I which 
+and the name in the 
+.I xkb 
+argument; to retrieve indicator names, use 
+.I XkbGetNames.
+
+If the 
+.I server 
+map has not been allocated in the 
+.I xkb 
+parameter, 
+.I XkbGetVirtualMods 
+allocates and initializes it before obtaining the virtual modifier bindings.
+
+If the server does not have a compatible version of Xkb, or the Xkb extension 
+has not been properly initialized, 
+.I XkbGetVirtualMods 
+returns BadMatch. Any errors in allocation cause 
+.I XkbGetVirtualMods 
+to return BadAlloc.
+.SH "RETURN VALUES"
+.TP 15
+Success
+The 
+.I XkbGetVirtualMods 
+function returns Success when it successfully updates the corresponding virtual modifier definition 
+in the 
+.I server->vmods 
+array of 
+.I xkb. 
+.SH STRUCTURES
+.LP
+The complete description of an Xkb keyboard is given by an XkbDescRec. The 
+component 
+structures in the XkbDescRec represent the major Xkb components.
+
+.nf
+typedef struct {
+   struct _XDisplay * display;      /\(** connection to X server */
+   unsigned short     flags;        /\(** private to Xkb, do not modify */
+   unsigned short     device_spec;  /\(** device of interest */
+   KeyCode            min_key_code; /\(** minimum keycode for device */
+   KeyCode            max_key_code; /\(** maximum keycode for device */
+   XkbControlsPtr     ctrls;        /\(** controls */
+   XkbServerMapPtr    server;       /\(** server keymap */
+   XkbClientMapPtr    map;          /\(** client keymap */
+   XkbIndicatorPtr    indicators;   /\(** indicator map */
+   XkbNamesPtr        names;        /\(** names for all components */
+   XkbCompatMapPtr    compat;       /\(** compatibility map */
+   XkbGeometryPtr     geom;         /\(** physical geometry of keyboard */
+} XkbDescRec, *XkbDescPtr;
+
+.fi
+The 
+.I display 
+field points to an X display structure. The 
+.I flags 
+field is private to the library: modifying 
+.I flags 
+may yield unpredictable results. The 
+.I device_spec 
+field specifies the device identifier of the keyboard input device, or XkbUseCoreKeyboard, which 
+specifies the core keyboard device. The 
+.I min_key_code
+and 
+.I max_key_code 
+fields specify the least and greatest keycode that can be returned by the keyboard.
+
+Each structure component has a corresponding mask bit that is used in function 
+calls to 
+indicate that the structure should be manipulated in some manner, such as 
+allocating it 
+or freeing it. These masks and their relationships to the fields in the 
+XkbDescRec are 
+shown in Table 1.
+
+.TS
+c s s
+l l l
+l l l.
+Table 1 Mask Bits for XkbDescRec
+_
+Mask Bit       XkbDescRec Field        Value
+_
+XkbControlsMask        ctrls   (1L<<0)
+XkbServerMapMask       server  (1L<<1)
+XkbIClientMapMask      map     (1L<<2)
+XkbIndicatorMapMask    indicators      (1L<<3)
+XkbNamesMask   names   (1L<<4)
+XkbCompatMapMask       compat  (1L<<5)
+XkbGeometryMask        geom    (1L<<6)
+XkbAllComponentsMask   All Fields      (0x7f)
+.TE
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadMatch
+A compatible version of Xkb was not available in the server or an argument has 
+correct type and range, but is otherwise invalid
+.SH "SEE ALSO"
+.BR XkbGetNames (__libmansuffix__),
+.BR XkbSetNames (__libmansuffix__)
diff --git a/man/xkb/XkbGetXlibControls.man b/man/xkb/XkbGetXlibControls.man
new file mode 100644 (file)
index 0000000..95ccb1e
--- /dev/null
@@ -0,0 +1,61 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbGetXlibControls __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbGetXlibControls \- Determines the current state of the Library Controls
+.SH SYNOPSIS
+.HP
+.B unsigned int XkbGetXlibControls
+.BI "(\^Display  *" "display" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- display
+connection to X server
+.SH DESCRIPTION
+.LP
+.I XkbGetXlibControls 
+returns the current state of the Library Controls as a bit mask that is an 
+inclusive OR of the control masks from Table 1 for the controls that are 
+enabled. For the optional compose processing controls, the fact that a control 
+is enabled does not imply that it is actually implemented.
+
+.TS
+c s
+l l
+l l.
+Table 1 Library Control Masks
+_
+Library Control Mask   Value
+_
+XkbLC_ForceLatin1Lookup        (1 << 0)
+XkbLC_ConsumeLookupMods        (1 << 1)
+XkbLC_AlwaysConsumeShiftAndLock        (1 << 2)
+XkbLC_IgnoreNewKeyboards       (1 << 3)
+XkbLC_ConsumeKeysOnComposeFail (1 << 29)
+XkbLC_ComposeLED       (1 << 30)
+XkbLC_BeepOnComposeFail        (1 << 31)
+XkbLC_AllControls      (0xc0000007)
+.TE
+
diff --git a/man/xkb/XkbIgnoreExtension.man b/man/xkb/XkbIgnoreExtension.man
new file mode 100644 (file)
index 0000000..c65e4a9
--- /dev/null
@@ -0,0 +1,79 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbIgnoreExtension __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbIgnoreExtension \-  Prevents core X library keyboard functions from using the 
+X Keyboard Extension
+.SH SYNOPSIS
+.HP
+.B Bool XkbIgnoreExtension
+.BI "(\^Bool *" "ignore" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I ignore
+True means ignore the extension
+.SH DESCRIPTION
+.LP
+If a server supports the Xkb extension, the X library normally implements preXkb 
+keyboard functions using the Xkb keyboard description and state. The server Xkb 
+keyboard state may differ from the preXkb keyboard state. This difference does 
+not affect most clients, but there are exceptions. To allow these clients to 
+work properly, you may instruct the extension not to use Xkb functionality.
+
+Call 
+.I XkbIgnoreExtension 
+to prevent core X library keyboard functions from using 
+the X Keyboard Extension. You must call 
+.I XkbIgnoreExtension 
+before you open a 
+server connection; Xkb does not provide a way to enable or disable use of the 
+extension once a connection is established.
+
+.I XkbIgnoreExtension 
+tells the X library whether to use the X Keyboard Extension 
+on any subsequently opened X display connections. If ignore is True, the library 
+does not initialize the Xkb extension when it opens a new display. This forces 
+the X server to use compatibility mode and communicate with the client using 
+only core protocol requests and events. If ignore is False, the library treats 
+subsequent calls to 
+.I XOpenDisplay 
+normally and uses Xkb extension requests, 
+events, and state. Do not explicitly use Xkb on a connection for which it is 
+disabled. 
+.I XkbIgnoreExtension 
+returns False if it was unable to apply the ignore 
+request.
+.SH "RETURN VALUES"
+.TP 15
+True
+The 
+.I XkbIgnoreExtension 
+returns True if 
+.TP 15
+False
+The 
+.I XkbIgnoreExtension 
+function returns False if it was unable to apply the ignore request.
+.SH "SEE ALSO"
+.BR XOpenDisplay (__libmansuffix__)
diff --git a/man/xkb/XkbInitCanonicalKeyTypes.man b/man/xkb/XkbInitCanonicalKeyTypes.man
new file mode 100644 (file)
index 0000000..6925bec
--- /dev/null
@@ -0,0 +1,84 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbInitCanonicalKeyTypes __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbInitCanonicalKeyTypes \- Set the definitions of the canonical key types in a 
+client map to their default values
+.SH SYNOPSIS
+.HP
+.B Status XkbInitCanonicalKeyTypes
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "unsigned int " "which" "\^,"
+.BI "int " "keypadVMod" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+keyboard description containing client map to initialize
+.TP
+.I \- which
+mask of types to initialize
+.TP
+.I \- keypadVMod
+index of NumLock virtual modifier
+.SH DESCRIPTION
+.LP
+.I XkbInitCanonicalKeyTypes 
+initializes the first XkbNumRequiredTypes key types of the keyboard specified by 
+the 
+.I xkb 
+parameter to their default values. The 
+.I which 
+parameter specifies what canonical key types to initialize and is a bitwise 
+inclusive OR of the following masks: XkbOneLevelMask, XkbTwoLevelMask, 
+XkbAlphabeticMask, and XkbKeypadMask. Only those canonical types specified by 
+the 
+.I which 
+mask are initialized.
+
+If XkbKeypadMask is set in the 
+.I which 
+parameter, 
+.I XkbInitCanonicalKeyTypes 
+looks up the NumLock named virtual modifier to determine which virtual modifier 
+to use when initializing the KEYPAD key type. If the NumLock virtual modifier 
+does not exist, 
+.I XkbInitCanonicalKeyTypes 
+creates it.
+
+.I XkbInitCanonicalKeyTypes 
+normally returns Success. It returns BadAccess if the Xkb extension has not been 
+properly initialized, and BadAccess if the 
+xkb parameter is not valid.
+.SH "RETURN VALUES"
+.TP 15
+Success
+The 
+.I XkbInitCanonicalKeyTypes 
+funtion return Success if the Xkb extension has been properly initialized and 
+the xkb parameter is valid.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAccess
+The Xkb extension has not been properly initialized
diff --git a/man/xkb/XkbKeyAction.man b/man/xkb/XkbKeyAction.man
new file mode 100644 (file)
index 0000000..3dc76b2
--- /dev/null
@@ -0,0 +1,133 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbKeyAction __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbKeyAction \-  Returns the key action
+.SH SYNOPSIS
+.HP
+.B XkbAction XkbKeyAction
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "KeyCode " "keycode" "\^,"
+.BI "int " "idx" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+Xkb description of interest
+.TP
+.I \- keycode
+keycode of interest
+.TP
+.I \- idx
+index for group and shift level
+.SH DESCRIPTION
+.LP
+A key action defines the effect key presses and releases have on the internal 
+state of the server. For 
+example, the expected key action associated with pressing the Shift key is to 
+set the Shift modifier. 
+There is zero or one key action associated with each keysym bound to each key.
+
+Just as the entire list of key symbols for the keyboard mapping is held in the
+.I syms 
+field of the client map, the entire list of key actions for the keyboard mapping 
+is held in the 
+.I acts 
+array of the server map. The total size of 
+.I acts 
+is specified by 
+.I size_acts, 
+and the number of entries is specified by 
+.I num_acts. 
+
+The 
+.I key_acts 
+array, indexed by keycode, describes the actions associated with a key. The
+.I key_acts 
+array has 
+.I min_key_code 
+unused entries at the start to allow direct indexing using a keycode. If a
+.I key_acts 
+entry is zero, it means the key does not have any actions associated with it. If 
+an entry is not zero, 
+the entry represents an index into the 
+.I acts 
+field of the server map, much as the 
+.I offset 
+field of a KeySymMapRec structure is an index into the 
+.I syms 
+field of the client map. 
+
+The reason the 
+.I acts 
+field is a linear list of XkbActions is to reduce the memory consumption 
+associated with a keymap. 
+Because Xkb allows individual keys to have multiple shift levels and a different 
+number of groups per 
+key, a single two-dimensional array of KeySyms would potentially be very large 
+and sparse. Instead, Xkb 
+provides a small two-dimensional array of XkbActions for each key. To store all 
+of these individual 
+arrays, Xkb concatenates each array together in the 
+.I acts 
+field of the server map.
+
+The key action structures consist only of fields of type char or unsigned char. 
+This is done to 
+optimize data transfer when the server sends bytes over the wire. If the fields 
+are anything but bytes, 
+the server has to sift through all of the actions and swap any nonbyte fields. 
+Because they consist of 
+nothing but bytes, it can just copy them out.
+
+.I XkbKeyAction 
+returns the key action indexed by 
+.I idx 
+in the two-dimensional array of key actions associated with the key 
+corresponding to 
+.I keycode.idx 
+may be computed from the group and shift level of interest as follows:
+.nf
+
+    idx = group_index * key_width + shift_level
+.fi    
+.SH STRUCTURES
+.LP
+The KeySymMapRec structure is defined as follows:
+.nf
+
+    #define XkbNumKbdGroups             4
+    #define XkbMaxKbdGroup              (XkbNumKbdGroups-1)
+    
+    typedef struct {                    /\(** map to keysyms for a single keycode 
+*/
+        unsigned char       kt_index[XkbNumKbdGroups];  /\(** key type index for 
+each group */
+        unsigned char       group_info; /\(** # of groups and out of range group 
+handling */
+        unsigned char       width;      /\(** max # of shift levels for key */
+        unsigned short      offset;     /\(** index to keysym table in syms array 
+*/
+} XkbSymMapRec, *XkbSymMapPtr;
+
+.fi
diff --git a/man/xkb/XkbKeyActionEntry.man b/man/xkb/XkbKeyActionEntry.man
new file mode 100644 (file)
index 0000000..d8da89b
--- /dev/null
@@ -0,0 +1,137 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbKeyActionEntry __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbKeyActionEntry \- Returns a pointer to the key action corresponding to
+group grp and shift level lvl from the two-dimensional table of key actions
+associated with the key corresponding to
+keycode
+.SH SYNOPSIS
+.HP
+.B XkbAction * XkbKeyActionEntry
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "KeyCode " "keycode" "\^,"
+.BI "int " "shift" "\^,"
+.BI "int " "grp" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+Xkb description of interest
+.TP
+.I \- keycode
+keycode of interest
+.TP
+.I \- shift
+shift level within group
+.TP
+.I \- grp
+group index for group of interest
+.SH DESCRIPTION
+.LP
+A key action defines the effect key presses and releases have on the internal 
+state of the server. For example, 
+the expected key action associated with pressing the Shift key is to set the 
+Shift modifier. There is zero or one 
+key action associated with each keysym bound to each key.
+
+Just as the entire list of key symbols for the keyboard mapping is held in the
+.I syms 
+field of the client map, the entire list of key actions for the keyboard mapping 
+is held in the 
+.I acts 
+array of the server map. The total size of 
+.I acts 
+is specified by 
+.I size_acts, 
+and the number of entries is specified by 
+.I num_acts. 
+
+The 
+.I key_acts 
+array, indexed by keycode, describes the actions associated with a key. The
+.I key_acts 
+array has 
+.I min_key_code 
+unused entries at the start to allow direct indexing using a keycode. If a
+.I key_acts 
+entry is zero, it means the key does not have any actions associated with it. If 
+an entry is not zero, the entry 
+represents an index into the 
+.I acts 
+field of the server map, much as the 
+.I offset 
+field of a KeySymMapRec structure is an index into the 
+.I syms 
+field of the client map. 
+
+The reason the 
+.I acts 
+field is a linear list of XkbActions is to reduce the memory consumption 
+associated with a keymap. Because Xkb 
+allows individual keys to have multiple shift levels and a different number of 
+groups per key, a single 
+two-dimensional array of KeySyms would potentially be very large and sparse. 
+Instead, Xkb provides a small 
+two-dimensional array of XkbActions for each key. To store all of these 
+individual arrays, Xkb concatenates each 
+array together in the 
+.I acts 
+field of the server map.
+
+The key action structures consist only of fields of type char or unsigned char. 
+This is done to optimize data 
+transfer when the server sends bytes over the wire. If the fields are anything 
+but bytes, the server has to sift 
+through all of the actions and swap any nonbyte fields. Because they consist of 
+nothing but bytes, it can just 
+copy them out.
+
+.I XkbKeyActionEntry 
+returns the key action corresponding to group 
+.I grp 
+and shift level 
+.I lvl 
+from the two-dimensional table of key actions associated with the key 
+corresponding to 
+.I keycode.
+.SH STRUCTURES
+.LP
+The KeySymMapRec structure is defined as follows:
+.nf
+
+    #define XkbNumKbdGroups             4
+    #define XkbMaxKbdGroup              (XkbNumKbdGroups-1)
+    
+    typedef struct {                    /\(** map to keysyms for a single keycode 
+*/
+        unsigned char       kt_index[XkbNumKbdGroups];  /\(** key type index for 
+each group */
+        unsigned char       group_info; /\(** # of groups and out of range group 
+handling */
+        unsigned char       width;      /\(** max # of shift levels for key */
+        unsigned short      offset;     /\(** index to keysym table in syms array 
+*/
+} XkbSymMapRec, *XkbSymMapPtr;
+
+.fi
diff --git a/man/xkb/XkbKeyActionsPtr.man b/man/xkb/XkbKeyActionsPtr.man
new file mode 100644 (file)
index 0000000..56b1403
--- /dev/null
@@ -0,0 +1,134 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbKeyActionsPtr __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbKeyActionsPtr \-  Returns a pointer to the two-dimensional array of key 
+actions associated with 
+the key corresponding to keycode
+.SH SYNOPSIS
+.HP
+.B XkbKeyActionPtr XkbKeyActionsPtr
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "KeyCode " "keycode" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+Xkb description of interest 
+.TP
+.I \- keycode
+keycode of interest
+.SH DESCRIPTION
+.LP
+A key action defines the effect key presses and releases have on the internal 
+state of the server. 
+For example, the expected key action associated with pressing the Shift key is 
+to set the Shift 
+modifier. There is zero or one key action associated with each keysym bound to 
+each key.
+
+Just as the entire list of key symbols for the keyboard mapping is held in the
+.I syms 
+field of the client map, the entire list of key actions for the keyboard mapping 
+is held in the 
+.I acts 
+array of the server map. The total size of 
+.I acts 
+is specified by 
+.I size_acts, 
+and the number of entries is specified by 
+.I num_acts. 
+
+The 
+.I key_acts 
+array, indexed by keycode, describes the actions associated with a key. The
+.I key_acts 
+array has 
+.I min_key_code 
+unused entries at the start to allow direct indexing using a keycode. If a
+.I key_acts 
+entry is zero, it means the key does not have any actions associated with it. If 
+an entry is not 
+zero, the entry represents an index into the 
+.I acts 
+field of the server map, much as the 
+.I offset 
+field of a KeySymMapRec structure is an index into the 
+.I syms 
+field of the client map. 
+
+The reason the 
+.I acts 
+field is a linear list of XkbActions is to reduce the memory consumption 
+associated with a keymap. 
+Because Xkb allows individual keys to have multiple shift levels and a different 
+number of groups per 
+key, a single two-dimensional array of KeySyms would potentially be very large 
+and sparse. Instead, 
+Xkb provides a small two-dimensional array of XkbActions for each key. To store 
+all of these 
+individual arrays, Xkb concatenates each array together in the 
+.I acts 
+field of the server map.
+
+The key action structures consist only of fields of type char or unsigned char. 
+This is done to 
+optimize data transfer when the server sends bytes over the wire. If the fields 
+are anything but 
+bytes, the server has to sift through all of the actions and swap any nonbyte 
+fields. Because they 
+consist of nothing but bytes, it can just copy them out.
+
+.I XkbKeyActionsPtr 
+returns a pointer to the two-dimensional array of key actions associated with 
+the key corresponding 
+to 
+.I keycode. 
+Use 
+.I XkbKeyActionsPtr 
+only if the key actually has some actions associated with it, that is,
+.I XkbKeyNumActions
+(xkb, keycode) returns something greater than zero.
+.SH STRUCTURES
+.LP
+The KeySymMapRec structure is defined as follows:
+.nf
+
+    #define XkbNumKbdGroups             4
+    #define XkbMaxKbdGroup              (XkbNumKbdGroups-1)
+    
+    typedef struct {                    /\(** map to keysyms for a single keycode 
+*/
+        unsigned char       kt_index[XkbNumKbdGroups];  /\(** key type index for 
+each group */
+        unsigned char       group_info; /\(** # of groups and out of range group 
+handling */
+        unsigned char       width;      /\(** max # of shift levels for key */
+        unsigned short      offset;     /\(** index to keysym table in syms array 
+*/
+} XkbSymMapRec, *XkbSymMapPtr;
+
+.fi
+.SH "SEE ALSO"
+.BR XkbKeyNumActions (__libmansuffix__)
diff --git a/man/xkb/XkbKeyGroupInfo.man b/man/xkb/XkbKeyGroupInfo.man
new file mode 100644 (file)
index 0000000..31aebf4
--- /dev/null
@@ -0,0 +1,198 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbKeyGroupInfo __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbKeyGroupInfo \- Returns the number of groups of symbols bound to the key 
+corresponding to 
+keycode
+.SH SYNOPSIS
+.HP
+.B unsigned char XkbKeyGroupInfo
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "KeyCode " "keycode" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+Xkb description of interest
+.TP
+.I \- keycode
+keycode of interest
+.SH DESCRIPTION
+.LP
+The 
+.I group_info 
+field of an XkbSymMapRec is an encoded value containing the number of groups of 
+symbols bound 
+to the 
+key as well as the specification of the treatment of out-of-range groups. It is 
+legal for a 
+key to 
+have zero groups, in which case it also has zero symbols and all events from 
+that key yield 
+NoSymbol. 
+To obtain the number of groups of symbols bound to the key, use 
+.I XkbKeyNumGroups. 
+To change the number of groups bound to a key, use 
+.I XkbChangeTypesOfKey. 
+To obtain a mask that determines the treatment of out-of-range groups, use
+.I XkbKeyGroupInfo 
+and 
+.I XkbOutOfRangeGroupInfo.
+
+The keyboard controls contain a 
+.I groups_wrap 
+field specifying the handling of illegal groups on a global basis. That is, when 
+the user 
+performs an 
+action causing the effective group to go out of the legal range, the 
+.I groups_wrap 
+field specifies how to normalize the effective keyboard group to a group that is 
+legal for the 
+keyboard as a whole, but there is no guarantee that the normalized group will be 
+within the 
+range of 
+legal groups for any individual key. The per-key 
+.I group_info 
+field specifies how a key treats a legal effective group if the key does not 
+have a type 
+specified for 
+the group of concern. For example, the Enter key usually has just one group 
+defined. If the 
+user 
+performs an action causing the global keyboard group to change to Group2, the 
+.I group_info 
+field for the Enter key describes how to handle this situation.
+
+Out-of-range groups for individual keys are mapped to a legal group using the 
+same options as 
+are used 
+for the overall keyboard group. The particular type of mapping used is 
+controlled by the bits 
+set in 
+the 
+.I group_info 
+flag, as shown in Table 1.
+.bp
+.TS
+c s
+l l
+l l.
+Table 1 group_info Range Normalization
+_
+Bits set in group_info Normalization method
+_
+XkbRedirectIntoRange   XkbRedirectIntoRange
+XkbClampIntoRange      XkbClampIntoRange
+none of the above      XkbWrapIntoRange
+.TE
+
+.I XkbKeyGroupInfo 
+returns the group_info field from the XkbSymMapRec structure associated with the 
+key corresponding to 
+.I keycode.
+.SH STRUCTURES
+.LP
+The KeySymMapRec structure is defined as follows:
+.nf
+
+\&#define XkbNumKbdGroups             4
+\&#define XkbMaxKbdGroup              (XkbNumKbdGroups-1)
+    
+typedef struct {                    /\(** map to keysyms for a single keycode */
+    unsigned char       kt_index[XkbNumKbdGroups];  /\(** key type index for each group */
+    unsigned char       group_info; /\(** # of groups and out of range group handling */
+    unsigned char       width;      /\(** max # of shift levels for key */
+    unsigned short      offset;     /\(** index to keysym table in syms array */
+} XkbSymMapRec, *XkbSymMapPtr;
+
+.fi
+
+.nf
+The XkbControlsRec structure is defined as follows:
+
+\&#define XkbMaxLegalKeyCode     255
+\&#define XkbPerKeyBitArraySize  ((XkbMaxLegalKeyCode+1)/8)
+    
+typedef struct {
+    unsigned char   mk_dflt_btn;      /\(** default button for keyboard driven mouse */
+    unsigned char   num_groups;       /\(** number of keyboard groups */
+    unsigned char   groups_wrap;      /\(** how to wrap out-of-bounds groups */
+    XkbModsRec      internal;         /\(** defines server internal modifiers */
+    XkbModsRec      ignore_lock;      /\(** modifiers to ignore when checking for grab */
+    unsigned int    enabled_ctrls;    /\(** 1 bit => corresponding boolean control enabled */
+    unsigned short  repeat_delay;     /\(** ms delay until first repeat */
+    unsigned short  repeat_interval;  /\(** ms delay between repeats */
+    unsigned short  slow_keys_delay;  /\(** ms minimum time key must be down to be ok */
+    unsigned short  debounce_delay;   /\(** ms delay before key reactivated */
+    unsigned short  mk_delay;         /\(** ms delay to second mouse motion event */
+    unsigned short  mk_interval;      /\(** ms delay between repeat mouse events */
+    unsigned short  mk_time_to_max;   /\(** # intervals until constant mouse move */
+    unsigned short  mk_max_speed;     /\(** multiplier for maximum mouse speed */
+    short           mk_curve;         /\(** determines mouse move curve type */
+    unsigned short  ax_options;       /\(** 1 bit => Access X option enabled */
+    unsigned short  ax_timeout;       /\(** seconds until Access X disabled */
+    unsigned short  axt_opts_mask;    /\(** 1 bit => options to reset on Access X timeout */
+    unsigned short  axt_opts_values;  /\(** 1 bit => turn option on, 0=> off */
+    unsigned int    axt_ctrls_mask;   /\(** which bits in enabled_ctrls to modify */
+    unsigned int    axt_ctrls_values; /\(** values for new bits in enabled_ctrls */
+    unsigned char   per_key_repeat[XkbPerKeyBitArraySize];  /\(** per key auto repeat */
+} XkbControlsRec, *XkbControlsPtr;
+.fi
+
+.nf
+The XkbControlsRec structure is defined as follows:
+
+\&#define XkbMaxLegalKeyCode     255
+\&#define XkbPerKeyBitArraySize  ((XkbMaxLegalKeyCode+1)/8)
+    
+typedef struct {
+    unsigned char   mk_dflt_btn;      /\(** default button for keyboard driven mouse */
+    unsigned char   num_groups;       /\(** number of keyboard groups */
+    unsigned char   groups_wrap;      /\(** how to wrap out-of-bounds groups */
+    XkbModsRec      internal;         /\(** defines server internal modifiers */
+    XkbModsRec      ignore_lock;      /\(** modifiers to ignore when checking for grab */
+    unsigned int    enabled_ctrls;    /\(** 1 bit => corresponding boolean control enabled */
+    unsigned short  repeat_delay;     /\(** ms delay until first repeat */
+    unsigned short  repeat_interval;  /\(** ms delay between repeats */
+    unsigned short  slow_keys_delay;  /\(** ms minimum time key must be down to be ok */
+    unsigned short  debounce_delay;   /\(** ms delay before key reactivated */
+    unsigned short  mk_delay;         /\(** ms delay to second mouse motion event */
+    unsigned short  mk_interval;      /\(** ms delay between repeat mouse events */
+    unsigned short  mk_time_to_max;   /\(** # intervals until constant mouse move */
+    unsigned short  mk_max_speed;     /\(** multiplier for maximum mouse speed */
+    short           mk_curve;         /\(** determines mouse move curve type */
+    unsigned short  ax_options;       /\(** 1 bit => Access X option enabled */
+    unsigned short  ax_timeout;       /\(** seconds until Access X disabled */
+    unsigned short  axt_opts_mask;    /\(** 1 bit => options to reset on Access X timeout */
+    unsigned short  axt_opts_values;  /\(** 1 bit => turn option on, 0=> off */
+    unsigned int    axt_ctrls_mask;   /\(** which bits in enabled_ctrls to modify */
+    unsigned int    axt_ctrls_values; /\(** values for new bits in enabled_ctrls */
+    unsigned char   per_key_repeat[XkbPerKeyBitArraySize];  /\(** per key auto repeat */
+} XkbControlsRec, *XkbControlsPtr;
+.fi
+.SH "SEE ALSO"
+.BR XkbChangeTypesOfKey (__libmansuffix__),
+.BR XkbKeyGroupInfo (__libmansuffix__),
+.BR XkbOutOfRangeGroupInfo (__libmansuffix__)
diff --git a/man/xkb/XkbKeyGroupWidth.man b/man/xkb/XkbKeyGroupWidth.man
new file mode 100644 (file)
index 0000000..8d2f9da
--- /dev/null
@@ -0,0 +1,72 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbKeyGroupWidth __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbKeyGroupWidth \-  Computes the width of the type associated with the group
+.I grp 
+for the key corresponding to 
+.I keycode
+.SH SYNOPSIS
+.HP
+.B int XkbKeyGroupWidth
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "KeyCode " "keycode" "\^,"
+.BI "int " "grp" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+Xkb description of interest
+.TP
+.I \- keycode
+keycode of interest
+.TP
+.I \- grp
+group of interest
+.SH DESCRIPTION
+.LP
+The key width and number of groups associated with a key are used to form a 
+small two-dimensional array of KeySyms for a key. This array may be different 
+sizes for different keys. The array for a single key is stored as a linear list, 
+in row-major order. The arrays for all of the keys are stored in the 
+.I syms 
+field of the client map. There is one row for each group associated with a key 
+and one column for each level. The index corresponding to a given group and 
+shift level is computed as:
+.nf
+
+     idx = group_index * key_width + shift_level
+     
+.fi
+The 
+.I offset 
+field of the 
+.I key_sym_map 
+entry for a key is used to access the beginning of the array.
+
+.I XkbKeyGroupWidth 
+computes the width of the type associated with the group 
+.I grp 
+for the key corresponding to 
+.I keycode.
diff --git a/man/xkb/XkbKeyGroupsWidth.man b/man/xkb/XkbKeyGroupsWidth.man
new file mode 100644 (file)
index 0000000..84609d0
--- /dev/null
@@ -0,0 +1,64 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbKeyGroupsWidth __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbKeyGroupsWidth \- Computes the maximum width associated with the key 
+corresponding to 
+.I keycode
+.SH SYNOPSIS
+.HP
+.B int XkbKeyGroupsWidth
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "KeyCode " "keycode" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+Xkb description of interest
+.TP
+.I \- keycode
+keycode of interest
+.SH DESCRIPTION
+.LP
+The key width and number of groups associated with a key are used to form a 
+small two-dimensional array of KeySyms for a key. This array may be different 
+sizes for different keys. The array for a single key is stored as a linear list, 
+in row-major order. The arrays for all of the keys are stored in the 
+.I syms 
+field of the client map. There is one row for each group associated with a key 
+and one column for each level. The index corresponding to a given group and 
+shift level is computed as:
+.nf
+
+     idx = group_index * key_width + shift_level
+     
+.fi
+The 
+.I offset 
+field of the 
+.I key_sym_map 
+entry for a key is used to access the beginning of the array.
+
+.I XkbKeyGroupsWidth 
+computes the maximum width associated with the key corresponding to 
+.I keycode.
diff --git a/man/xkb/XkbKeyHasActions.man b/man/xkb/XkbKeyHasActions.man
new file mode 100644 (file)
index 0000000..6e94184
--- /dev/null
@@ -0,0 +1,125 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbKeyHasActions __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbKeyHasActions \- Determines if the key corresponding to 
+.I keycode
+has any actions associated with it
+.SH SYNOPSIS
+.HP
+.B int XkbKeyHasActions
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "KeyCode " "keycode" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+Xkb description of interest
+.TP
+.I \- keycode
+keycode of interest 
+.SH DESCRIPTION
+.LP
+A key action defines the effect key presses and releases have on the internal state of the 
+server. For example, the expected key action associated with pressing the Shift key is to set 
+the Shift modifier. There is zero or one key action associated with each keysym bound to each 
+key.
+
+Just as the entire list of key symbols for the keyboard mapping is held in the
+.I syms 
+field of the client map, the entire list of key actions for the keyboard mapping is held in the 
+.I acts 
+array of the server map. The total size of 
+.I acts 
+is specified by 
+.I size_acts, 
+and the number of entries is specified by 
+.I num_acts. 
+
+The 
+.I key_acts 
+array, indexed by keycode, describes the actions associated with a key. The
+.I key_acts 
+array has 
+.I min_key_code 
+unused entries at the start to allow direct indexing using a keycode. If a
+.I key_acts 
+entry is zero, it means the key does not have any actions associated with it. If an entry is not 
+zero, the entry represents an index into the 
+.I acts 
+field of the server map, much as the 
+.I offset 
+field of a KeySymMapRec structure is an index into the 
+.I syms 
+field of the client map. 
+
+The reason the 
+.I acts 
+field is a linear list of XkbActions is to reduce the memory consumption associated with a 
+keymap. Because Xkb allows individual keys to have multiple shift levels and a different number 
+of groups per key, a single two-dimensional array of KeySyms would potentially be very large and 
+sparse. Instead, Xkb provides a small two-dimensional array of XkbActions for each key. To store 
+all of these individual arrays, Xkb concatenates each array together in the 
+.I acts 
+field of the server map.
+
+The key action structures consist only of fields of type char or unsigned char. This is done to 
+optimize data transfer when the server sends bytes over the wire. If the fields are anything but 
+bytes, the server has to sift through all of the actions and swap any nonbyte fields. Because 
+they consist of nothing but bytes, it can just copy them out.
+
+.I XkbKeyHasActions 
+returns True if the key corresponding to 
+.I keycode 
+has any actions associated with it; otherwise, it returns False.
+.SH "RETURN VALUES"
+.TP 15
+True
+The 
+.I XkbKeyHasActions 
+function will return True if the key corresponding to 
+.I keycode 
+has any actions associated with it.
+.TP 15
+False
+The 
+.I XkbKeyHasActions 
+function will return False if the key corresponding to 
+.I keycode 
+does not have any actions associated with it.
+.SH STRUCTURES
+.LP
+The KeySymMapRec structure is defined as follows:
+.nf
+
+    #define XkbNumKbdGroups             4
+    #define XkbMaxKbdGroup              (XkbNumKbdGroups-1)
+    
+    typedef struct {                    /\(** map to keysyms for a single keycode */
+        unsigned char       kt_index[XkbNumKbdGroups];  /\(** key type index for each group */
+        unsigned char       group_info; /\(** # of groups and out of range group handling */
+        unsigned char       width;      /\(** max # of shift levels for key */
+        unsigned short      offset;     /\(** index to keysym table in syms array */
+} XkbSymMapRec, *XkbSymMapPtr;
+
+.fi
diff --git a/man/xkb/XkbKeyNumActions.man b/man/xkb/XkbKeyNumActions.man
new file mode 100644 (file)
index 0000000..37dea9c
--- /dev/null
@@ -0,0 +1,113 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbKeyNumActions __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbKeyNumActions \- Computes the number of actions associated with the key corresponding to 
+keycode
+.SH SYNOPSIS
+.HP
+.B int XkbKeyNumActions
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "KeyCode " "keycode" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+Xkb description of interest
+.TP
+.I \- keycode
+keycode of interest 
+.SH DESCRIPTION
+.LP
+A key action defines the effect key presses and releases have on the internal state of the 
+server. For example, the expected key action associated with pressing the Shift key is to set 
+the Shift modifier. There is zero or one key action associated with each keysym bound to each 
+key.
+
+Just as the entire list of key symbols for the keyboard mapping is held in the
+.I syms 
+field of the client map, the entire list of key actions for the keyboard mapping is held in the 
+.I acts 
+array of the server map. The total size of 
+.I acts 
+is specified by 
+.I size_acts, 
+and the number of entries is specified by 
+.I num_acts. 
+
+The 
+.I key_acts 
+array, indexed by keycode, describes the actions associated with a key. The
+.I key_acts 
+array has 
+.I min_key_code 
+unused entries at the start to allow direct indexing using a keycode. If a
+.I key_acts 
+entry is zero, it means the key does not have any actions associated with it. If an entry is not 
+zero, the entry represents an index into the 
+.I acts 
+field of the server map, much as the 
+.I offset 
+field of a KeySymMapRec structure is an index into the 
+.I syms 
+field of the client map. 
+
+The reason the 
+.I acts 
+field is a linear list of XkbActions is to reduce the memory consumption associated with a 
+keymap. Because Xkb allows individual keys to have multiple shift levels and a different number 
+of groups per key, a single two-dimensional array of KeySyms would potentially be very large and 
+sparse. Instead, Xkb provides a small two-dimensional array of XkbActions for each key. To store 
+all of these individual arrays, Xkb concatenates each array together in the 
+.I acts 
+field of the server map.
+
+The key action structures consist only of fields of type char or unsigned char. This is done to 
+optimize data transfer when the server sends bytes over the wire. If the fields are anything but 
+bytes, the server has to sift through all of the actions and swap any nonbyte fields. Because 
+they consist of nothing but bytes, it can just copy them out.
+
+.I XkbKeyNumActions 
+computes the number of actions associated with the key corresponding to 
+.I keycode. 
+This should be the same value as the result of 
+.I XkbKeyNumSyms.
+.SH STRUCTURES
+.LP
+The KeySymMapRec structure is defined as follows:
+.nf
+
+    #define XkbNumKbdGroups             4
+    #define XkbMaxKbdGroup              (XkbNumKbdGroups-1)
+    
+    typedef struct {                    /\(** map to keysyms for a single keycode */
+        unsigned char       kt_index[XkbNumKbdGroups];  /\(** key type index for each group */
+        unsigned char       group_info; /\(** # of groups and out of range group handling */
+        unsigned char       width;      /\(** max # of shift levels for key */
+        unsigned short      offset;     /\(** index to keysym table in syms array */
+} XkbSymMapRec, *XkbSymMapPtr;
+
+.fi
+.SH "SEE ALSO"
+.BR XkbKeyNumSyms (__libmansuffix__)
diff --git a/man/xkb/XkbKeyNumGroups.man b/man/xkb/XkbKeyNumGroups.man
new file mode 100644 (file)
index 0000000..5377473
--- /dev/null
@@ -0,0 +1,310 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbKeyNumGroups __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbKeyNumGroups \- Returns the number of groups of symbols bound to the key 
+corresponding to keycode
+.SH SYNOPSIS
+.HP
+.B int XkbKeyNumGroups
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "KeyCode " "keycode" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+Xkb description of interest
+.TP
+.I \- keycode
+keycode of interest
+.SH DESCRIPTION
+.LP
+The 
+.I group_info 
+field of an XkbSymMapRec is an encoded value containing the number of groups of 
+symbols bound to the 
+key as well as the specification of the treatment of out-of-range groups. It is 
+legal for a key to 
+have zero groups, in which case it also has zero symbols and all events from 
+that key yield NoSymbol. 
+To obtain the number of groups of symbols bound to the key, use 
+.I XkbKeyNumGroups. 
+To change the number of groups bound to a key, use 
+.I XkbChangeTypesOfKey. 
+To obtain a mask that determines the treatment of out-of-range groups, use
+.I XkbKeyGroupInfo 
+and 
+.I XkbOutOfRangeGroupInfo.
+
+The keyboard controls contain a 
+.I groups_wrap 
+field specifying the handling of illegal groups on a global basis. That is, when 
+the user performs an 
+action causing the effective group to go out of the legal range, the 
+.I groups_wrap 
+field specifies how to normalize the effective keyboard group to a group that is 
+legal for the 
+keyboard as a whole, but there is no guarantee that the normalized group will be 
+within the range of 
+legal groups for any individual key. The per-key 
+.I group_info 
+field specifies how a key treats a legal effective group if the key does not 
+have a type specified for 
+the group of concern. For example, the Enter key usually has just one group 
+defined. If the user 
+performs an action causing the global keyboard group to change to Group2, the 
+.I group_info 
+field for the Enter key describes how to handle this situation.
+
+Out-of-range groups for individual keys are mapped to a legal group using the 
+same options as are used 
+for the overall keyboard group. The particular type of mapping used is 
+controlled by the bits set in 
+the 
+.I group_info 
+flag, as shown in Table 1.
+.bp
+.TS
+c s
+l l
+l l.
+Table 1 group_info Range Normalization
+_
+Bits set in group_info Normalization method
+_
+XkbRedirectIntoRange   XkbRedirectIntoRange
+XkbClampIntoRange      XkbClampIntoRange
+none of the above      XkbWrapIntoRange
+.TE
+
+.\"--- Chapter 10
+The Xkb extension is composed of two parts: a server extension, and a 
+client-side X library extension. 
+This chapter discusses functions used to modify controls effecting the behavior 
+of the server portion 
+of the Xkb extension. X Library Controls discusses functions used to modify 
+controls that affect only 
+the behavior of the client portion of the extension; those controls are known as 
+Library Controls.
+
+Xkb contains control features that affect the entire keyboard, known as global 
+keyboard controls. Some 
+of the controls may be selectively enabled and disabled; these controls are 
+known as the 
+.I Boolean Controls. 
+Boolean Controls can be turned on or off under program control and can also be 
+automatically set to an 
+on or off condition when a client program exits. The remaining controls, known 
+as the 
+.I Non-Boolean Controls, 
+are always active. The XkbControlsRec structure describes the current state of 
+most of the global 
+controls and the attributes effecting the behavior of each of these Xkb 
+features. This chapter 
+describes the Xkb controls and how to manipulate them.
+
+There are two possible components for each of the Boolean Controls: attributes 
+describing how the 
+control should work, and a state describing whether the behavior as a whole is 
+enabled or disabled. 
+The attributes and state for most of these controls are held in the 
+XkbControlsRec structure.
+
+You can manipulate the Xkb controls individually, via convenience functions, or 
+as a whole. To treat 
+them as a group, modify an XkbControlsRec structure to describe all of the 
+changes to be made, and 
+then pass that structure and appropriate flags to an Xkb library function, or 
+use a 
+XkbControlsChangesRec to reduce network traffic. When using a convenience 
+function to manipulate one 
+control individually, you do not use an XkbControlsRec structure directly.
+
+The Xkb controls are grouped as shown in Table 2.
+
+.TS
+c s s 
+l l l
+lw(2i) l l.
+Table 2 Xkb Keyboard Controls
+_
+Type of Control        Control Name    Boolean Control?
+_
+T{
+Controls for enabling and disabling other controls
+T}     EnabledControls No
+       AutoReset       No
+T{
+Control for bell behavior
+T}     AudibleBell     Boolean
+T{
+Controls for repeat key behavior
+T}     PerKeyRepeat    No
+       RepeatKeys      Boolean
+       DetectableAutorepeat    Boolean
+T{
+Controls for keyboard overlays
+T}     Overlay1        Boolean
+       Overlay2        Boolean
+T{
+Controls for using the mouse from the keyboard
+T}     MouseKeys       Boolean
+       MouseKeysAccel  Boolean
+T{
+Controls for better keyboard access by
+T}     AccessXFeedback Boolean
+T{
+physically impaired persons
+T}     AccessXKeys     Boolean
+       AccessXTimeout  Boolean
+       BounceKeys      Boolean
+       SlowKeys        Boolean
+       StickyKeys      Boolean
+T{
+Controls for general keyboard mapping
+T}     GroupsWrap      No
+       IgnoreGroupLock Boolean
+       IgnoreLockMods  No
+       InternalMods    No
+.TE    
+
+The individual categories and controls are described first, together with 
+functions for manipulating 
+them.
+.SH STRUCTURES
+.LP
+The KeySymMapRec structure is defined as follows:
+.nf
+
+    #define XkbNumKbdGroups             4
+    #define XkbMaxKbdGroup              (XkbNumKbdGroups-1)
+    
+    typedef struct {                    /\(** map to keysyms for a single keycode 
+*/
+        unsigned char       kt_index[XkbNumKbdGroups];  /\(** key type index for 
+each group */
+        unsigned char       group_info; /\(** # of groups and out of range group 
+handling */
+        unsigned char       width;      /\(** max # of shift levels for key */
+        unsigned short      offset;     /\(** index to keysym table in syms array 
+*/
+} XkbSymMapRec, *XkbSymMapPtr;
+
+.fi
+
+.nf
+The XkbControlsRec structure is defined as follows:
+
+    #define XkbMaxLegalKeyCode     255
+    #define XkbPerKeyBitArraySize  ((XkbMaxLegalKeyCode+1)/8)
+    
+    
+    typedef struct {
+        unsigned char   mk_dflt_btn;      /\(** default button for keyboard driven 
+mouse */
+        unsigned char   num_groups;       /\(** number of keyboard groups */
+        unsigned char   groups_wrap;      /\(** how to wrap out-of-bounds groups */
+        XkbModsRec      internal;         /\(** defines server internal modifiers 
+*/
+        XkbModsRec      ignore_lock;      /\(** modifiers to ignore when checking 
+for grab */
+        unsigned int    enabled_ctrls;    /\(** 1 bit => corresponding boolean 
+control enabled */
+        unsigned short  repeat_delay;     /\(** ms delay until first repeat */
+        unsigned short  repeat_interval;  /\(** ms delay between repeats */
+        unsigned short  slow_keys_delay;  /\(** ms minimum time key must be down to 
+be ok */
+        unsigned short  debounce_delay;   /\(** ms delay before key reactivated */
+        unsigned short  mk_delay;         /\(** ms delay to second mouse motion 
+event */
+        unsigned short  mk_interval;      /\(** ms delay between repeat mouse 
+events */
+        unsigned short  mk_time_to_max;   /\(** # intervals until constant mouse 
+move */
+        unsigned short  mk_max_speed;     /\(** multiplier for maximum mouse speed 
+*/
+        short           mk_curve;         /\(** determines mouse move curve type */
+        unsigned short  ax_options;       /\(** 1 bit => Access X option enabled */
+        unsigned short  ax_timeout;       /\(** seconds until Access X disabled */
+        unsigned short  axt_opts_mask;    /\(** 1 bit => options to reset on Access 
+X timeout */
+        unsigned short  axt_opts_values;  /\(** 1 bit => turn option on, 0=> off */
+        unsigned int    axt_ctrls_mask;   /\(** which bits in enabled_ctrls to 
+modify */
+        unsigned int    axt_ctrls_values; /\(** values for new bits in 
+enabled_ctrls */
+        unsigned char   per_key_repeat[XkbPerKeyBitArraySize];  /\(** per key auto 
+repeat */
+     } XkbControlsRec, *XkbControlsPtr;
+.fi
+
+.nf
+The XkbControlsRec structure is defined as follows:
+
+    #define XkbMaxLegalKeyCode     255
+    #define XkbPerKeyBitArraySize  ((XkbMaxLegalKeyCode+1)/8)
+    
+    
+    typedef struct {
+        unsigned char   mk_dflt_btn;      /\(** default button for keyboard driven 
+mouse */
+        unsigned char   num_groups;       /\(** number of keyboard groups */
+        unsigned char   groups_wrap;      /\(** how to wrap out-of-bounds groups */
+        XkbModsRec      internal;         /\(** defines server internal modifiers 
+*/
+        XkbModsRec      ignore_lock;      /\(** modifiers to ignore when checking 
+for grab */
+        unsigned int    enabled_ctrls;    /\(** 1 bit => corresponding boolean 
+control enabled */
+        unsigned short  repeat_delay;     /\(** ms delay until first repeat */
+        unsigned short  repeat_interval;  /\(** ms delay between repeats */
+        unsigned short  slow_keys_delay;  /\(** ms minimum time key must be down to 
+be ok */
+        unsigned short  debounce_delay;   /\(** ms delay before key reactivated */
+        unsigned short  mk_delay;         /\(** ms delay to second mouse motion 
+event */
+        unsigned short  mk_interval;      /\(** ms delay between repeat mouse 
+events */
+        unsigned short  mk_time_to_max;   /\(** # intervals until constant mouse 
+move */
+        unsigned short  mk_max_speed;     /\(** multiplier for maximum mouse speed 
+*/
+        short           mk_curve;         /\(** determines mouse move curve type */
+        unsigned short  ax_options;       /\(** 1 bit => Access X option enabled */
+        unsigned short  ax_timeout;       /\(** seconds until Access X disabled */
+        unsigned short  axt_opts_mask;    /\(** 1 bit => options to reset on Access 
+X timeout */
+        unsigned short  axt_opts_values;  /\(** 1 bit => turn option on, 0=> off */
+        unsigned int    axt_ctrls_mask;   /\(** which bits in enabled_ctrls to 
+modify */
+        unsigned int    axt_ctrls_values; /\(** values for new bits in 
+enabled_ctrls */
+        unsigned char   per_key_repeat[XkbPerKeyBitArraySize];  /\(** per key auto 
+repeat */
+     } XkbControlsRec, *XkbControlsPtr;
+.fi
+.SH "SEE ALSO"
+.BR XkbChangeTypesOfKey (__libmansuffix__),
+.BR XkbKeyGroupInfo (__libmansuffix__),
+.BR XkbOutOfRangeGroupInfo. (__libmansuffix__)
diff --git a/man/xkb/XkbKeyNumSyms.man b/man/xkb/XkbKeyNumSyms.man
new file mode 100644 (file)
index 0000000..74b4812
--- /dev/null
@@ -0,0 +1,65 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbKeyNumSyms __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbKeyNumSyms \- Returns the total number of keysyms for the key corresponding 
+to 
+.I keycode
+.SH SYNOPSIS
+.HP
+.B int XkbKeyNumSyms
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "KeyCode " "keycode" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+Xkb description of interest
+.TP
+.I \- keycode
+keycode of interest
+.SH DESCRIPTION
+.LP
+The key width and number of groups associated with a key are used to form a 
+small two-dimensional array of KeySyms for a key. This array may be different 
+sizes for different keys. The array for a single key is stored as a linear list, 
+in row-major order. The arrays for all of the keys are stored in the 
+.I syms 
+field of the client map. There is one row for each group associated with a key 
+and one column for each level. The index corresponding to a given group and 
+shift level is computed as:
+.nf
+
+     idx = group_index * key_width + shift_level
+     
+.fi
+The 
+.I offset 
+field of the 
+.I key_sym_map 
+entry for a key is used to access the beginning of the array.
+
+.I XkbKeyNumSyms 
+returns the total number of keysyms for the key corresponding to 
+.I keycode.
diff --git a/man/xkb/XkbKeySymEntry.man b/man/xkb/XkbKeySymEntry.man
new file mode 100644 (file)
index 0000000..8c8a790
--- /dev/null
@@ -0,0 +1,79 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbKeySymEntry __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbKeySymEntry \-  Returns the keysym corresponding to shift level 
+.I shift 
+and group 
+.I grp 
+from the two-dimensional array of keysyms for the key corresponding to 
+.I keycode
+.SH SYNOPSIS
+.HP
+.B KeySym XkbKeySymEntry
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "KeyCode " "keycode" "\^,"
+.BI "int " "shift" "\^,"
+.BI "int " "grp" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+Xkb description of interest
+.TP
+.I \- keycode
+keycode of interest 
+.TP
+.I \- shift
+shift level of interest
+.TP
+.I \- grp
+group of interest
+.SH DESCRIPTION
+.LP
+The key width and number of groups associated with a key are used to form a 
+small two-dimensional array of KeySyms for a key. This array may be different 
+sizes for different keys. The array for a single key is stored as a linear list, 
+in row-major order. The arrays for all of the keys are stored in the 
+.I syms 
+field of the client map. There is one row for each group associated with a key 
+and one column for each level. The index corresponding to a given group and 
+shift level is computed as:
+.nf
+
+     idx = group_index * key_width + shift_level
+     
+.fi
+The 
+.I offset 
+field of the 
+.I key_sym_map 
+entry for a key is used to access the beginning of the array.
+
+.I XkbKeySymEntry 
+returns the keysym corresponding to shift level 
+.I shift 
+and group 
+.I grp 
+from the two-dimensional array of keysyms for the key corresponding to 
+.I keycode.
diff --git a/man/xkb/XkbKeySymsOffset.man b/man/xkb/XkbKeySymsOffset.man
new file mode 100644 (file)
index 0000000..123c546
--- /dev/null
@@ -0,0 +1,66 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbKeySymsOffset __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbKeySymsOffset \- Returns the offset of the two-dimensional array of keysyms 
+for the key corresponding to 
+.I keycode
+.SH SYNOPSIS
+.HP
+.B int XkbKeySymsOffset
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "KeyCode " "keycode" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+Xkb description of interest
+.TP
+.I \- keycode
+keycode of interest
+.SH DESCRIPTION
+.LP
+The key width and number of groups associated with a key are used to form a 
+small two-dimensional array of KeySyms for a key. This array may be different 
+sizes for different keys. The array for a single key is stored as a linear list, 
+in row-major order. The arrays for all of the keys are stored in the 
+.I syms 
+field of the client map. There is one row for each group associated with a key 
+and one column for each level. The index corresponding to a given group and 
+shift level is computed as:
+.nf
+
+     idx = group_index * key_width + shift_level
+     
+.fi
+The 
+.I offset 
+field of the 
+.I key_sym_map 
+entry for a key is used to access the beginning of the array.
+
+.I XkbKeySymsOffset 
+returns the offset of the two-dimensional array of keysyms for the key 
+corresponding to 
+.I keycode.
diff --git a/man/xkb/XkbKeySymsPtr.man b/man/xkb/XkbKeySymsPtr.man
new file mode 100644 (file)
index 0000000..f423165
--- /dev/null
@@ -0,0 +1,66 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbKeySymsPtr __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbKeySymsPtr \- Returns the pointer to the two-dimensional array of keysyms for 
+the key corresponding to 
+.I keycode
+.SH SYNOPSIS
+.HP
+.B KeySym * XkbKeySymsPtr
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "KeyCode " "keycode" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+Xkb description of interest
+.TP
+.I \- keycode
+keycode of interest
+.SH DESCRIPTION
+.LP
+The key width and number of groups associated with a key are used to form a 
+small two-dimensional array of KeySyms for a key. This array may be different 
+sizes for different keys. The array for a single key is stored as a linear list, 
+in row-major order. The arrays for all of the keys are stored in the 
+.I syms 
+field of the client map. There is one row for each group associated with a key 
+and one column for each level. The index corresponding to a given group and 
+shift level is computed as:
+.nf
+
+     idx = group_index * key_width + shift_level
+     
+.fi
+The 
+.I offset 
+field of the 
+.I key_sym_map 
+entry for a key is used to access the beginning of the array.
+
+.I XkbKeySymsPtr 
+returns the pointer to the two-dimensional array of keysyms for the key 
+corresponding to 
+.I keycode.
diff --git a/man/xkb/XkbKeyType.man b/man/xkb/XkbKeyType.man
new file mode 100644 (file)
index 0000000..81ff92f
--- /dev/null
@@ -0,0 +1,70 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbKeyType __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbKeyType \- Obtain the index of a key type or the pointer to a key type
+.SH SYNOPSIS
+.HP
+.B XkbKeyTypePtr XkbKeyType
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "KeyCode " "keycode" "\^,"
+.BI "int " "group" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+Xkb description of interest
+.TP
+.I \- keycode
+keycode of interest
+.TP
+.I \- group
+group index
+.SH DESCRIPTION
+.LP
+.I XkbKeyType 
+returns a pointer to the key type in the 
+.I types 
+vector of the client map in 
+.I xkb 
+corresponding to the given 
+.I keycode 
+and 
+.I group 
+index.
+.SH STRUCTURES
+.LP
+.nf
+
+typedef struct {                             /\(** Key Type */
+       XkbModsRec              mods;           /\(** modifiers used to compute shift level */
+       unsigned char           num_levels;     /\(** total # shift levels, do not modify directly */
+       unsigned char           map_count;      /\(** # entries in map, preserve (if non-NULL) */
+       XkbKTMapEntryPtr        map;            /\(** vector of modifiers for each shift level */
+       XkbModsPtr              preserve;       /\(** mods to preserve for corresponding map entry */
+       Atom                    name;           /\(** name of key type */
+       Atom *                  level_names;    /\(** array of names of each shift level */
+} XkbKeyTypeRec, *XkbKeyTypePtr;
+
+.fi
diff --git a/man/xkb/XkbKeyTypeIndex.man b/man/xkb/XkbKeyTypeIndex.man
new file mode 100644 (file)
index 0000000..e198e72
--- /dev/null
@@ -0,0 +1,56 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbKeyTypeIndex __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbKeyTypeIndex \- Obtain the index of a key type or the pointer to a key type
+.SH SYNOPSIS
+.HP
+.B int XkbKeyTypeIndex
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "KeyCode " "keycode" "\^,"
+.BI "int " "group" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+Xkb description of interest
+.TP
+.I \- keycode
+keycode of interest
+.TP
+.I \- group
+group index
+.SH DESCRIPTION
+.LP
+.I XkbKeyTypeIndex 
+computes an index into the 
+.I types 
+vector of the client map in 
+.I xkb 
+from the given 
+.I keycode 
+and 
+.I group 
+index.
+
diff --git a/man/xkb/XkbKeyTypesForCoreSymbols.man b/man/xkb/XkbKeyTypesForCoreSymbols.man
new file mode 100644 (file)
index 0000000..e7678d5
--- /dev/null
@@ -0,0 +1,228 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbKeyTypesForCoreSymbols __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbKeyTypesForCoreSymbols \- Determine the Xkb key types appropriate for the 
+symbols bound to a key in a core keyboard mapping
+.SH SYNOPSIS
+.HP
+.B int XkbKeyTypesForCoreSymbols
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "int " "map_width" "\^,"
+.BI "KeySym *" "core_syms" "\^,"
+.BI "unsigned int " "protected" "\^,"
+.BI "int *" "types_inout" "\^,"
+.BI "KeySym *" "xkb_syms_rtrn" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+keyboard description in which to place symbols
+.TP
+.I \- map_width
+width of core protocol keymap in xkb_syms_rtrn
+.TP
+.I \- core_syms
+core protocol format array of KeySyms
+.TP
+.I \- protected
+explicit key types
+.TP
+.I \- types_inout
+backfilled with the canonical types bound to groups one and two for the key
+.TP
+.I \- xkb_syms_rtrn
+backfilled with symbols bound to the key in the Xkb mapping
+.SH DESCRIPTION
+.LP
+.I XkbKeyTypesForCoreSymbols 
+expands the symbols in 
+.I core_syms 
+and types in 
+.I types_inout,
+then chooses canonical key types (canonical key types are 
+defined The Canonical Key Types) for groups 1 and 2 using the rules specified by 
+the Xkb protocol and places them in xkb_syms_rtrn, which will be non-NULL.
+
+.B The Canonical Key Types
+
+Xkb allows up to XkbMaxKeyTypes (255) key types to be defined, but requires at 
+least XkbNumRequiredTypes (4) predefined types to be in a key map. These 
+predefined key types are referred to as the canonical key types and describe the 
+types of keys available on most keyboards. The definitions for the canonical key 
+types are held in the first XkbNumRequiredTypes entries of the 
+.I types 
+field of the client map and are indexed using the following constants:
+.nf
+
+    XkbOneLevelIndex
+    XkbTwoLevelIndex
+    XkbAlphabeticIndex
+    XkbKeypadIndex
+    
+.fi
+    
+ONE_LEVEL
+
+The ONE_LEVEL key type describes groups that have only one symbol. The default 
+ONE_LEVEL key type has no map entries and does not pay attention to any 
+modifiers. A symbolic representation of this key type could look like the 
+following:
+.nf
+
+    type "ONE_LEVEL" {
+         modifiers = None;
+         map[None]= Level1;
+         level_name[Level1]= "Any";
+    };
+    
+.fi    
+The description of the ONE_LEVEL key type is stored in the 
+types[XkbOneLevelIndex] entry of the client key map.
+
+TWO_LEVEL
+
+The TWO_LEVEL key type describes groups that consist of two symbols but are 
+neither alphabetic nor numeric keypad keys. The default TWO_LEVEL type uses only 
+the Shift modifier. It returns shift level two if Shift is set, and level one if 
+it is not. A symbolic representation of this key type could look like the 
+following:
+.nf
+
+    type "TWO_LEVEL" {
+        modifiers = Shift;
+        map[Shift]= Level2;
+        level_name[Level1]= "Base";
+        level_name[Level2]= "Shift";
+    };
+    
+.fi
+    
+The description of the TWO_LEVEL key type is stored in the 
+types[XkbTwoLevelIndex] entry of the client key map.
+
+ALPHABETIC
+
+The ALPHABETIC key type describes groups consisting of two symbols: the 
+lowercase form of a symbol followed by the uppercase form of the same symbol. 
+The default ALPHABETIC type implements locale-sensitive "Shift cancels CapsLock" 
+behavior using both the Shift and Lock modifiers as follows:
+
+.IP \(bu 5
+If Shift and Lock are both set, the default ALPHABETIC type yields level one.
+.IP \(bu 5
+If Shift alone is set, it yields level two.
+.IP \(bu 5
+If Lock alone is set, it yields level one, but preserves the Lock modifier so 
+Xlib notices and applies the appropriate capitalization rules. The Xlib 
+functions are locale-sensitive and apply different capitalization rules for 
+different locales.
+.IP \(bu 5
+If neither Shift nor Lock is set, it yields level one.
+
+A symbolic representation of this key type could look like the following:
+.nf
+
+    type "ALPHABETIC" {
+        modifiers = Shift+Lock;
+        map[Shift]= Level2;
+        preserve[Lock]= Lock;
+        level_name[Level1]= "Base";
+        level_name[Level2]= "Caps";
+    };
+    
+.fi    
+The description of the ALPHABETIC key type is stored in the 
+types[XkbAlphabeticIndex] entry of the client key map.
+
+KEYPAD
+
+The KEYPAD key type describes groups that consist of two symbols, at least one 
+of which is a numeric keypad symbol. The numeric keypad symbol is assumed to 
+reside at level two. The default KEYPAD key type implements "Shift cancels 
+NumLock" behavior using the Shift modifier and the real modifier bound to the 
+virtual modifier named "NumLock," known as the NumLock modifier, as follows:
+
+.IP \(bu 5
+If Shift and NumLock are both set, the default KEYPAD type yields level one.
+.IP \(bu 5
+If Shift alone is set, it yields level two.
+.IP \(bu 5
+If NumLock alone is set, it yields level two.
+.IP \(bu 5
+If neither Shift nor NumLock is set, it yields level one.
+
+A symbolic representation of this key type could look like the following:
+.nf
+
+    type "KEYPAD" {
+        modifiers = Shift+NumLock;
+        map[None]= Level1;
+        map[Shift]= Level2;
+        map[NumLock]= Level2;
+        map[Shift+NumLock]= Level1;
+        level_name[Level1]= "Base";
+        level_name[Level2]= "Caps";
+    };
+    
+.fi    
+The description of the KEYPAD key type is stored in the types[XkbKeypadIndex] 
+entry of the client key map.
+
+A core keymap is a two-dimensional array of keysyms. It has 
+.I map_width 
+columns and 
+.I max_key_code 
+rows. 
+.I XkbKeyTypesForCoreSymbols 
+takes a single row from a core keymap, determines the number of groups 
+associated with it, the type of each group, and the symbols bound to each group. 
+The return value is the number of groups, 
+.I types_inout 
+has the types for each group, and 
+.I xkb_syms_rtrn 
+has the symbols in Xkb order (that is, groups are contiguous, regardless of 
+size).
+
+.I protected 
+contains the explicitly protected key types. There is one  explicit override 
+control associated with each of the four possible groups for each Xkb key, 
+ExplicitKeyType1 through ExplicitKeyType4; 
+.I protected 
+is an inclusive OR of these controls. 
+.I map_width 
+is the width of the core keymap and is not dependent on any Xkb definitions.
+.I types_inout 
+is an array of four type indices. On input, 
+.I types_inout 
+contains the indices of any types already assigned to the key, in case they are 
+explicitly protected from change.
+
+Upon return, 
+.I types_inout 
+contains any automatically selected (that is, canonical) types plus any 
+protected types. Canonical types are assigned to all four groups if there are 
+enough symbols to do so. The four entries in 
+.I types_inout 
+correspond to the four groups for the key in question. 
diff --git a/man/xkb/XkbKeycodeToKeysym.man b/man/xkb/XkbKeycodeToKeysym.man
new file mode 100644 (file)
index 0000000..32efa01
--- /dev/null
@@ -0,0 +1,60 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbKeycodeToKeysym __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbKeycodeToKeysym \- Finds the keysym bound to a particular key at a specified 
+group and shift level
+.SH SYNOPSIS
+.HP
+.B KeySym XkbKeycodeToKeysym
+.BI "(\^Display *" "dpy" "\^,"
+.BI "KeyCode " "kc" "\^,"
+.BI "unsigned int " "group" "\^,"
+.BI "unsigned int " "level" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to X server 
+.TP
+.I \- kc
+key of interest 
+.TP
+.I \- group
+group of interest 
+.TP
+.I \- level
+shift level of interest 
+.SH DESCRIPTION
+.LP
+.I XkbKeycodeToKeysym 
+returns the keysym bound to a particular group and shift level for a particular 
+key on the core keyboard. If 
+.I kc 
+is not a legal keycode for the core keyboard, or if 
+.I group 
+or 
+.I level 
+are out of range for the specified key, 
+.I XkbKeycodeToKeysym 
+returns NoSymbol.
diff --git a/man/xkb/XkbKeysymToModifiers.man b/man/xkb/XkbKeysymToModifiers.man
new file mode 100644 (file)
index 0000000..acc432a
--- /dev/null
@@ -0,0 +1,52 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbKeysymToModifiers __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbKeysymToModifiers \- Finds the set of modifiers bound to a particular keysym 
+on the core keyboard
+.SH SYNOPSIS
+.HP
+.B unsigned int XkbKeysymToModifiers
+.BI "(\^Display *" "dpy" "\^,"
+.BI "KeySym " "ks" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to X server
+.TP
+.I \- ks
+keysym of interest
+.SH DESCRIPTION
+.LP
+.I XkbKeysymToModifiers 
+finds the set of modifiers currently bound to the keysym 
+.I ks 
+on the core keyboard. The value returned is the mask of modifiers bound to the 
+keysym 
+.I ks. 
+If no modifiers are bound to the keysym, 
+.I XkbKeysymToModifiers 
+returns zero; otherwise, it returns the inclusive OR of zero or more of the 
+following: ShiftMask, ControlMask, LockMask, Mod1Mask, Mod2Mask, Mod3Mask, 
+Mod4Mask, and Mod5Mask.
diff --git a/man/xkb/XkbLatchGroup.man b/man/xkb/XkbLatchGroup.man
new file mode 100644 (file)
index 0000000..8e7c431
--- /dev/null
@@ -0,0 +1,83 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbLatchGroup __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbLatchGroup \-  Latches the keysym group
+.SH SYNOPSIS
+.HP
+.B Bool XkbLatchGroup
+.BI "(\^Display *" "display" "\^,"
+.BI "unsigned int " "device_spec" "\^,"
+.BI "unsigned int " "group" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I display
+connection to the X server 
+.TP
+.I device_spec
+device ID, or XkbUseCoreKbd
+.TP
+.I group
+index of the keysym group to latch
+.SH DESCRIPTION
+.LP
+
+.I XkbLatchGroup 
+sends a request to the server to latch the specified 
+.I group
+and 
+does not wait for a reply. It returns True if the request was sent and False 
+otherwise.
+
+Reference the keysym group indices with these symbolic constants:
+
+.TS
+c s
+l l
+l l.
+Table 1 Symbolic Group Names
+_
+Symbolic Name  Value
+_
+XkbGroup1Index 0
+XkbGroup2Index 1
+XkbGroup3Index 2
+XkbGroup4Index 3
+.TE
+.SH "RETURN VALUES"
+.TP 15
+True
+The 
+.I XkbLatchGroup 
+function returns True if a request was sent to the server to latch the specified 
+.I group.
+.TP 15
+False
+The 
+.I XkbLatchGroup 
+function returns False if the request was not sent.
+
+
+
diff --git a/man/xkb/XkbLatchModifiers.man b/man/xkb/XkbLatchModifiers.man
new file mode 100644 (file)
index 0000000..940dc6d
--- /dev/null
@@ -0,0 +1,104 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbLatchModifiers __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbLatchModifiers \-  Latches and unlatches any of the eight real keyboard 
+modifiers
+.SH SYNOPSIS
+.HP
+.B Bool XkbLatchModifiers
+.BI "(\^Display *" "display" "\^,"
+.BI "unsigned int " "device_spec" "\^,"
+.BI "unsigned int " "affect" "\^,"
+.BI "unsigned int " "values" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I display
+connection to the X server 
+.TP
+.I device_spec
+device ID, or XkbUseCoreKbd
+.TP
+.I affect
+mask of real modifiers whose lock state is to change
+.TP
+.I values
+1 => lock, 0 => unlock; only for modifiers selected by affect
+.SH DESCRIPTION
+.LP
+.I XkbLatchModifiers 
+sends a request to the server to latch the real modifiers 
+selected by both 
+.I affect 
+and 
+.I values 
+and to unlatch the real modifiers selected by 
+.I affect
+, but not selected by 
+.I values. 
+
+.I XkbLatchModifiers 
+does not wait for a reply from the server. It returns True if 
+the request was sent, and False otherwise.
+
+The functions in this section that change the use of modifiers use a mask in the 
+parameter affect. It is a bitwise inclusive OR of the legal modifier masks: 
+
+.TS
+c 
+l 
+l.
+Table 1 Real Modifier Masks
+_
+Mask
+_
+ShiftMask
+LockMask
+ControlMask
+Mod1Mask
+Mod2Mask
+Mod3Mask
+Mod4Mask
+Mod5Mask
+.TE
+.SH "RETURN VALUES"
+.TP 15
+True
+The 
+.I XkbLatchModifiers 
+function returns True if a request was sent to the server to latch the real modifiers selected by both 
+.I affect 
+and 
+.I values 
+and to unlatch the real modifiers selected by 
+.I affect
+, but not selected by 
+.I values. 
+.TP 15
+False
+The 
+.I XkbLatchModifiers 
+function returns False if the request was not sent.
+
diff --git a/man/xkb/XkbLibraryVersion.man b/man/xkb/XkbLibraryVersion.man
new file mode 100644 (file)
index 0000000..fc00e78
--- /dev/null
@@ -0,0 +1,92 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbLibraryVersion __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbLibraryVersion \-  Determines the compatibility of a library at runtime.
+.SH SYNOPSIS
+.HP
+.B Bool XkbLibraryVersion
+.BI "(\^int *" "lib_major_in_out" "\^,"
+.BI "int *" "lib_minor_in_out" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I lib_major_in_out
+Specifies and returns the major Xkb library version.
+.TP
+.I lib_minor_in_out
+Specifies and returns the minor Xkb library version.
+.SH DESCRIPTION
+.LP
+If an application is dynamically linked, both the X server and the client-side X 
+library must contain the Xkb extension in order for the client to use the Xkb 
+extension capabilities. Therefore a dynamically linked application must check 
+both the library and the server for compatibility before using Xkb function 
+calls. A properly written program must check for compatibility between the 
+version of the Xkb library that is dynamically loaded and the one used when the 
+application was built. It must then check the server version for compatibility 
+with the version of Xkb in the library.
+
+If your application is statically linked, you must still check for server 
+compatibility and may check library compatibility. (It is possible to compile 
+against one set of header files and link against a different, incompatible, 
+version of the library, although this should not normally occur.)
+
+Pass the symbolic value XkbMajorVersion in 
+.I lib_major_in_out 
+and XkbMinorVersion in 
+.I lib_minor_in_out. 
+These arguments represent the version of the library used 
+at compile time. The 
+.I XkbLibraryVersion 
+function backfills the major and minor version numbers of the library used at 
+run time in 
+.I lib_major_in_out and 
+.I lib_minor_in_out. 
+If the versions of the compile time and run time libraries are 
+compatible, 
+.I XkbLibraryVersion 
+returns True, otherwise, it returns False.
+
+In addition, in order to use the Xkb extension, you must ensure that the 
+extension is present in the server and that the server supports the version of 
+the extension expected by the client. Use 
+.I XkbQueryExtension 
+to do this, as described in the next section.
+.SH "RETURN VALUES"
+.TP 15
+True
+The 
+.I XkbLibraryVersion 
+returns True if the versions of the compile time and run time libraries are 
+compatible.
+.TP 15
+False
+The 
+.I XkbLibraryVersion 
+returns False if the versions of the compile time and run time libraries are not 
+compatible.
+.SH "SEE ALSO"
+.BR XkbMajorVersion (__libmansuffix__),
+.BR XkbMinorVersion (__libmansuffix__),
+.BR XkbQueryExtension (__libmansuffix__)
diff --git a/man/xkb/XkbListComponents.man b/man/xkb/XkbListComponents.man
new file mode 100644 (file)
index 0000000..29602b6
--- /dev/null
@@ -0,0 +1,165 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbListComponents __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbListComponents \- List of components for one or more component types
+.SH SYNOPSIS
+.HP
+.B XkbComponentListPtr XkbListComponents
+.BI "(\^Display *" "dpy" "\^,"
+.BI "unsigned int " "device_spec" "\^,"
+.BI "XkbComponentNamesPtr " "ptrns" "\^,"
+.BI "int *" "max_inout" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to X server
+.TP
+.I \- device_spec
+device ID, or XkbUseCoreKbd
+.TP
+.I \- ptrns
+namelist for components of interest
+.TP
+.I \- max_inout
+max # returned names, # left over
+.SH DESCRIPTION
+.LP
+You may ask the server for a list of components for one or more component types. The request takes the 
+form of a set of patterns, one pattern for each of the component types, including a pattern for the 
+complete keyboard description. To obtain this list, use 
+.I XkbListComponents.
+
+.I XkbListComponents 
+queries the server for a list of component names matching the patterns specified in 
+.I ptrns. 
+It waits for a reply and returns the matching component names in an XkbComponentListRec structure. 
+When you are done using the structure, you should free it using 
+.I XkbFreeComponentList. device_spec 
+indicates a particular device in which the caller is interested. A server is allowed (but not 
+required) to restrict its reply to portions of the database that are relevant for that particular 
+device.
+
+.I ptrns 
+is a pointer to an XkbComponentNamesRec. Each of the fields in 
+.I ptrns 
+contains a pattern naming the components of interest. Each of the patterns is composed of characters 
+from the ISO Latin1 encoding, but can contain only parentheses, the wildcard characters `?' and `*', 
+and characters permitted in a component class or member name. A pattern may be NULL, in which case no 
+components for that type is returned. Pattern matches with component names are case sensitive. The `?' 
+wildcard matches any single character, except a left or right parenthesis; the `*' wildcard matches 
+any number of characters, except a left or right parenthesis. If an implementation allows additional 
+characters in a component class or member name other than those required by the Xkb extension, the 
+result of comparing one of the additional characters to either of the wildcard characters is 
+implementation-dependent.
+
+If a pattern contains illegal characters, the illegal characters are ignored. The matching process is 
+carried out as if the illegal characters were omitted from the pattern.
+
+.I max_inout 
+is used to throttle the amount of data passed to and from the server. On input, it specifies the 
+maximum number of names to be returned (the total number of names in all component categories). Upon 
+return from 
+.I XkbListComponents, 
+max_inout contains the number of names that matched the request but were not returned because of the 
+limit.
+
+.B Component Names
+
+Component names have the form 
+.I "class(member)" 
+where 
+.I class 
+describes a subset of the available components for a particular type and the optional 
+.I member 
+identifies a specific component from that subset. For example, the name "atlantis(acme)" for a symbols 
+component might specify the symbols used for the atlantis national keyboard layout by the vendor 
+"acme." Each class has an optional 
+.I default 
+member - references that specify a class but not a member refer to the default member of the class, if 
+one exists. Xkb places no constraints on the interpretation of the class and member names used in 
+component names.
+
+The 
+.I class 
+and 
+.I member 
+names are both specified using characters from the Latin-1 character set. Xkb implementations must 
+accept all alphanumeric characters, minus (`-') and underscore (`_') in class or member names, and 
+must not accept parentheses, plus, vertical bar, percent sign, asterisk, question mark, or white 
+space. The use of other characters is implementation-dependent.
+.SH STRUCTURES
+.LP
+The component name patterns used to describe the request are passed to
+.I XkbListComponents 
+using an XkbComponentNamesRec structure. This structure has no special allocation constraints or 
+interrelationships with other structures; allocate and free this structure using standard 
+.I malloc 
+and 
+.I free 
+calls or their equivalent:
+.nf
+
+    typedef struct _XkbComponentNames {
+        char *         keymap;           /\(** keymap names */
+        char *         keycodes;         /\(** keycode names */
+        char *         types;            /\(** type names */
+        char *         compat;           /\(** compatibility map names */
+        char *         symbols;          /\(** symbol names */
+        char *         geometry;         /\(** geometry names */
+    } XkbComponentNamesRec, *XkbComponentNamesPtr;
+    
+.fi    
+.I XkbListComponents 
+returns a pointer to an XkbComponentListRec:
+.nf
+
+    typedef struct _XkbComponentList {
+        int                      num_keymaps;  /\(** number of entries in keymap */
+        int                      num_keycodes; /\(** number of entries in keycodes */
+        int                      num_types;    /\(** number of entries in types */
+        int                      num_compat;   /\(** number of entries in compat */
+        int                      num_symbols;  /\(** number of entries in symbols */
+        int                      num_geometry; /\(** number of entries in geometry;
+        XkbComponentNamePtr      keymap;       /\(** keymap names */
+        XkbComponentNamePtr      keycodes;     /\(** keycode names */
+        XkbComponentNamePtr      types;        /\(** type names */
+        XkbComponentNamePtr      compat;       /\(** compatibility map names */
+        XkbComponentNamePtr      symbols;      /\(** symbol names */
+        XkbComponentNamePtr      geometry;     /\(** geometry names */
+    } XkbComponentListRec, *XkbComponentListPtr;
+    
+    typedef struct _XkbComponentName {
+        unsigned short           flags;        /\(** hints regarding component name */
+        char *                   name;         /\(** name of component */
+    } XkbComponentNameRec, *XkbComponentNamePtr;
+    
+.fi   
+.SH "SEE ALSO"
+.BR XkbFreeComponentList (__libmansuffix__) 
+.SH NOTES
+.LP
+Note that the structure used to specify patterns on input is an XkbComponentNamesRec, and that used to 
+hold the individual component names upon return is an XkbComponentNameRec (no trailing `s' in Name).
diff --git a/man/xkb/XkbLockGroup.man b/man/xkb/XkbLockGroup.man
new file mode 100644 (file)
index 0000000..413d530
--- /dev/null
@@ -0,0 +1,81 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbLockGroup __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbLockGroup \-  Locks the keysym group
+.SH SYNOPSIS
+.HP
+.B Bool XkbLockGroup
+.BI "(\^Display *" "display" "\^,"
+.BI "unsigned int " "device_spec" "\^,"
+.BI "unsigned int " "group" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I display
+connection to the X server 
+.TP
+.I device_spec
+device ID, or XkbUseCoreKbd
+.TP
+.I group
+index of the keysym group to lock
+.SH DESCRIPTION
+.LP
+.I XkbLockGroup 
+sends a request to the server to lock the specified 
+.I group 
+and does not wait for a reply. It returns True if the request was sent and 
+False otherwise.
+
+Reference the keysym group indices with these symbolic constants:
+
+.TS
+c s
+l l
+l l.
+Table 1 Symbolic Group Names
+_
+Symbolic Name  Value
+_
+XkbGroup1Index 0
+XkbGroup2Index 1
+XkbGroup3Index 2
+XkbGroup4Index 3
+.TE
+.SH "RETURN VALUES"
+.TP 15
+True
+The 
+.I XkbLockGroup
+function returns True when a request was sent to the server to lock the 
+specified 
+.I group
+and does not wait for a reply.
+.TP 15
+False
+The 
+.I XkbLockGroup
+function returns False if the request was not sent.
+
diff --git a/man/xkb/XkbLockModifiers.man b/man/xkb/XkbLockModifiers.man
new file mode 100644 (file)
index 0000000..3d03823
--- /dev/null
@@ -0,0 +1,102 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbLockModifiers __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbLockModifiers \-  Locks and unlocks any of the eight real keyboard modifiers
+.SH SYNOPSIS
+.HP
+.B Bool XkbLockModifiers
+.BI "(\^Display *" "display" "\^,"
+.BI "unsigned int " "device_spec" "\^,"
+.BI "unsigned int " "affect" "\^,"
+.BI "unsigned int " "values" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I display
+connection to the X server 
+.TP
+.I device_spec
+device ID, or XkbUseCoreKbd
+.TP
+.I affect
+mask of real modifiers whose lock state is to change
+.TP
+.I values
+1 => lock, 0 => unlock; only for modifiers selected by affect
+.SH DESCRIPTION
+.LP
+.I XkbLockModifiers 
+sends a request to the server to lock the real modifiers 
+selected by both 
+.I affect 
+and 
+.I values
+and to unlock the real modifiers selected by 
+.I affect, 
+but not selected by 
+.I values. XkbLockModifiers 
+does not wait for a reply from the server. It returns True if the request was 
+sent, and False otherwise.
+
+The functions in this section that change the use of modifiers use a mask in the 
+parameter affect. It is a bitwise inclusive OR of the legal modifier masks: 
+
+.TS
+c 
+l 
+l.
+Table 1 Real Modifier Masks
+_
+Mask
+_
+ShiftMask
+LockMask
+ControlMask
+Mod1Mask
+Mod2Mask
+Mod3Mask
+Mod4Mask
+Mod5Mask
+.TE
+.SH "RETURN VALUES"
+.TP 15
+True
+The 
+.I XkbLockModifiers 
+function returns True if a request is sent to the server to lock the real 
+modifiers 
+selected by both 
+.I affect 
+and 
+.I values
+and to unlock the real modifiers selected by 
+.I affect, 
+but not selected by 
+.I values.
+.TP 15
+False
+The 
+.I XkbLockModifiers 
+function returns False if the request was not sent.
diff --git a/man/xkb/XkbLookupKeyBinding.man b/man/xkb/XkbLookupKeyBinding.man
new file mode 100644 (file)
index 0000000..7671ad5
--- /dev/null
@@ -0,0 +1,84 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbLookupKeyBinding __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbLookupKeyBinding \- Find the string bound to a key by XRebindKeySym
+.SH SYNOPSIS
+.HP
+.B int XkbLookupKeyBinding
+.BI "(\^Display *" "dpy" "\^,"
+.BI "KeySym " "sym" "\^,"
+.BI "unsigned int " "state" "\^,"
+.BI "char *" "buf" "\^,"
+.BI "int " "nbytes" "\^,"
+.BI "int *" "extra_rtrn" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to server
+.TP
+.I \- sym
+connection to server
+.TP
+.I \- state
+state for which string is to be looked up
+.TP
+.I \- buf
+buffer into which returned string is written
+.TP
+.I \- nbytes
+size of buffer in bytes
+.TP
+.I \- extra_rtrn
+backfilled with number bytes overflow
+.SH DESCRIPTION
+.LP
+.I XkbLookupKeyBinding 
+is the equivalent of the core 
+.I XLookupString 
+function.
+
+.I XRebindKeysym 
+binds an ASCII string to a specified keysym, so that the string and keysym are 
+returned when the key is pressed and a specified list of modifiers are also 
+being held down. 
+.I XkbLookupKeyBinding 
+returns in 
+.I buf 
+the string associated with the keysym 
+.I sym 
+and modifier state 
+.I state. buf 
+is NULL terminated unless there's an overflow. If the string returned is larger 
+than 
+.I nbytes, 
+a count of bytes that does not fit into the buffer is returned in 
+.I extra_rtrn. 
+.I XkbTranslateKeySym 
+returns the number of bytes that it placed into 
+.I buf.
+.SH "SEE ALSO"
+.BR XkbTranslateKeySym (__libmansuffix__),
+.BR XLookupString (__libmansuffix__),
+.BR XRebindKeysym (__libmansuffix__)
diff --git a/man/xkb/XkbLookupKeySym.man b/man/xkb/XkbLookupKeySym.man
new file mode 100644 (file)
index 0000000..fe9cb13
--- /dev/null
@@ -0,0 +1,71 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbLookupKeySym __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbLookupKeySym \- Find the symbol associated with a key for a particular state
+.SH SYNOPSIS
+.HP
+.B Bool XkbLookupKeySym
+.BI "(\^Display *" "dpy" "\^,"
+.BI "KeyCode " "key" "\^,"
+.BI "unsigned int " "state" "\^,"
+.BI "unsigned int *" "mods_rtrn" "\^,"
+.BI "KeySym *" "sym_rtrn" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to X server
+.TP
+.I \- key
+key for which symbols are to be found
+.TP
+.I \- state
+state for which symbol should be found
+.TP
+.I \- mods_rtrn
+backfilled with unconsumed modifiers
+.TP
+.I \- sym_rtrn
+backfilled with symbol associated with key + state
+.SH DESCRIPTION
+.LP
+.I XkbLookupKeySym 
+is the equivalent of the core 
+.I XLookupKeySym 
+function. For the core keyboard, given a keycode 
+.I key 
+and an Xkb state 
+.I state, XkbLookupKeySym 
+returns the symbol associated with the key in 
+.I sym_rtrn 
+and the list of modifiers that should still be applied in 
+.I mods_rtrn. 
+The 
+.I state 
+parameter is the state from a KeyPress or KeyRelease event. 
+.I XkbLookupKeySym 
+returns True if it succeeds.
+.SH "SEE ALSO"
+.BR XLookupKeySym (__libmansuffix__)
+
diff --git a/man/xkb/XkbModActionVMods.man b/man/xkb/XkbModActionVMods.man
new file mode 100644 (file)
index 0000000..bdf47db
--- /dev/null
@@ -0,0 +1,48 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbModActionVMods __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbModActionVMods \- Returns the vmods1 and vmods2 fields of act converted to the vmods format of an 
+Xkb modifier description
+.SH SYNOPSIS
+.HP
+.B unsigned short XkbModActionVMods
+.BI "(\^XkbAction " "act" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- act
+action from which to extract virtual mods
+.SH DESCRIPTION
+.LP
+.I XkbModActionVMods 
+returns the 
+.I vmods1 
+and 
+.I vmods2 
+fields of 
+.I act 
+converted to the 
+.I vmods 
+format of an Xkb modifier description.
diff --git a/man/xkb/XkbNoteControlsChanges.man b/man/xkb/XkbNoteControlsChanges.man
new file mode 100644 (file)
index 0000000..cf40ed0
--- /dev/null
@@ -0,0 +1,200 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbNoteControlsChanges __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbNoteControlsChanges \- Notes the changes in a changes structure when a client receives an XkbControlsNotify 
+event
+.SH SYNOPSIS
+.HP
+.B void XkbNoteControlsChanges
+.BI "(\^XkbControlsChangesPtr " "changes" "\^,"
+.BI "XkbControlsNotifyEvent *" "new" "\^,"
+.BI "unsigned int " "wanted" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- changes
+records changes indicated by new
+.TP
+.I \- new
+tells which things have changed
+.TP
+.I \- wanted
+tells which parts of new to record in changes
+.SH DESCRIPTION
+.LP
+Whenever a field in the controls structure changes in the server's keyboard description, the server sends an 
+XkbControlsNotify event to all interested clients.To receive XkbControlsNotify events under all possible 
+conditions, use
+.I XkbSelectEvents 
+and pass XkbControlsNotifyMask in both 
+.I bits_to_change 
+and 
+.I values_for_bits.
+
+To receive XkbControlsNotify events only under certain conditions, use
+.I XkbSelectEventDetails 
+using XkbControlsNotify as the 
+.I event_type 
+and specifying the desired state changes in 
+.I bits_to_change 
+and 
+.I values_for_bits 
+using mask bits from Table 1.
+
+Table 1 shows the actual values for the individual mask bits used to select 
+controls for 
+modification and to enable and disable the control. Note that the same mask bit 
+is used to 
+specify general modifications to the parameters used to configure the control 
+(which), and to 
+enable and disable the control (enabled_ctrls). The anomalies in the table (no 
+"ok" in column) 
+are for controls that have no configurable attributes; and for controls that are 
+not boolean 
+controls and therefore cannot be enabled or disabled.
+
+.TS
+c s s s
+l l l l
+l l l l
+l l l l. 
+Table 1 Controls Mask Bits
+_
+Mask Bit       which or        enabled Value
+       changed_ctrls   _ctrls
+_
+XkbRepeatKeysMask      ok      ok      (1L<<0)
+XkbSlowKeysMask        ok      ok      (1L<<1)
+XkbBounceKeysMask      ok      ok      (1L<<2)
+XkbStickyKeysMask      ok      ok      (1L<<3)
+XkbMouseKeysMask       ok      ok      (1L<<4)
+XkbMouseKeysAccelMask  ok      ok      (1L<<5)
+XkbAccessXKeysMask     ok      ok      (1L<<6)
+XkbAccessXTimeoutMask  ok      ok      (1L<<7)
+XkbAccessXFeedbackMask ok      ok      (1L<<8)
+XkbAudibleBellMask             ok      (1L<<9)
+XkbOverlay1Mask                ok      (1L<<10)
+XkbOverlay2Mask                ok      (1L<<11)
+XkbIgnoreGroupLockMask         ok      (1L<<12)
+XkbGroupsWrapMask      ok              (1L<<27)
+XkbInternalModsMask    ok              (1L<<28)
+XkbIgnoreLockModsMask  ok              (1L<<29)
+XkbPerKeyRepeatMask    ok              (1L<<30)
+XkbControlsEnabledMask ok              (1L<<31)
+XkbAccessXOptionsMask  ok      ok      (XkbStickyKeysMask | 
+XkbAccessXFeedbackMask)
+XkbAllBooleanCtrlsMask         ok      (0x00001FFF) 
+XkbAllControlsMask     ok              (0xF8001FFF)
+.TE
+
+The 
+.I changed_ctrls 
+field specifies the controls components that have changed and consists of bits taken from the masks defined in 
+Table 1 with "ok" in the 
+.I changed_ctrls 
+column.
+
+The controls currently enabled in the server are reported in the 
+.I enabled_ctrls 
+field. If any controls were just enabled or disabled (that is, the contents of the 
+.I enabled_ctrls 
+field changed), they are flagged in the 
+.I enabled_ctrl_changes 
+field. The valid bits for these fields are the masks listed in Table 1 with "ok" in the 
+.I enabled_ctrls 
+column. The 
+.I num_groups 
+field reports the number of groups bound to the key belonging to the most number of groups and is automatically 
+updated 
+when the keyboard mapping changes.
+
+If the change was caused by a request from a client, the 
+.I keycode 
+and 
+.I event_type 
+fields are set to zero and the 
+.I req_major 
+and 
+.I req_minor 
+fields identify the request. The 
+.I req_major value is the same as the major extension opcode. Otherwise,
+.I event_type 
+is set to the type of event that caused the change (one of KeyPress, KeyRelease, DeviceKeyPress, 
+DeviceKeyRelease, 
+ButtonPress or ButtonRelease), and 
+.I req_major 
+and 
+.I req_minor 
+are undefined. If 
+.I event_type 
+is KeyPress, KeyRelease, DeviceKeyPress, or DeviceKeyRelease, the 
+.I keycode 
+field is set to the key that caused the change. If 
+.I event_type 
+is ButtonPress or ButtonRelease, 
+.I keycode 
+contains the button number. 
+
+When a client receives an XkbControlsNotify event, it can note the changes in a changes structure using 
+.I XkbNoteControlsChanges.
+
+The 
+.I wanted 
+parameter is a bitwise inclusive OR of bits taken from the set of masks specified in Table 1 with "ok" in the 
+.I changed_ctrls 
+column. 
+.I XkbNoteControlsChanges 
+copies any changes reported in 
+.I new 
+and specified in 
+.I wanted 
+into the changes record specified by 
+.I old.
+.SH STRUCTURES
+.LP
+.nf
+The structure for the XkbControlsNotify event is defined as follows:
+
+typedef struct {
+    int           type;          /\(** Xkb extension base event code */
+    unsigned long serial;        /\(** X server serial number for event */
+    Bool          send_event;    /\(** True => synthetically generated */
+    Display *     display;       /\(** server connection where event generated */
+    Time          time;          /\(** server time when event generated */
+    int           xkb_type;      /\(** XkbCompatMapNotify */
+    int           device;        /\(** Xkb device ID, will not be XkbUseCoreKbd */
+    unsigned int  changed_ctrls; /\(** bits indicating which controls data have changed*/
+    unsigned int  enabled_ctrls; /\(** controls currently enabled in server */
+    unsigned int  enabled_ctrl_changes; /\(** bits indicating enabled/disabled controls */
+    int           num_groups;    /\(** current number of keyboard groups */
+    KeyCode       keycode;       /\(** != 0 => keycode of key causing change */
+    char          event_type;    /\(** Type of event causing change */
+    char          req_major;     /\(** major event code of event causing change */
+    char          req_minor;     /\(** minor event code of event causing change */
+} XkbControlsNotifyEvent;
+.fi
+.SH "SEE ALSO"
+.BR XkbSelectEventDetails (__libmansuffix__),
+.BR XkbSelectEvents (__libmansuffix__)
diff --git a/man/xkb/XkbNoteDeviceChanges.man b/man/xkb/XkbNoteDeviceChanges.man
new file mode 100644 (file)
index 0000000..c97f611
--- /dev/null
@@ -0,0 +1,135 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbNoteDeviceChanges __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbNoteDeviceChanges \- Note device changes reported in an XkbExtensionDeviceNotify event
+.SH SYNOPSIS
+.HP
+.B void XkbNoteDeviceChanges
+.BI "(\^XkbDeviceChangesPtr " "old" "\^,"
+.BI "XkbExtensionDeviceNotifyEvent *" "new" "\^,"
+.BI "unsigned int " "wanted" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- old
+structure tracking state changes
+.TP
+.I \- new
+event indicating state changes
+.TP
+.I \- wanted
+mask indicating changes to note
+.SH DESCRIPTION
+.LP
+The 
+.I wanted 
+field specifies the changes that should be noted in 
+.I old, 
+and is composed of the bitwise inclusive OR of one or more of the masks from Table 1. The
+.I reason 
+field of the event in 
+.I new 
+indicates the types of changes the event is reporting. 
+.I XkbNoteDeviceChanges 
+updates the XkbDeviceChangesRec specified by 
+.I old 
+with the changes that are both specified in 
+.I wanted 
+and contained in 
+.I new->reason.
+
+.nf
+                         Table 1 XkbDeviceInfoRec Mask Bits                        
+____________________________________________________________________________________
+Name                         XkbDeviceInfoRec Value     Capability If Set
+                             Fields Effected            
+____________________________________________________________________________________
+XkbXI_KeyboardsMask                           (1L <<0) Clients can use all
+                                                       Xkb requests and events
+                                                       with KeyClass devices 
+                                                       supported by the input
+                                                       device extension.
+
+XkbXI_ButtonActionsMask       num_btns        (1L <<1) Clients can assign key 
+                              btn_acts                 actions to buttons 
+                                                       non-KeyClass input
+                                                       extension devices.
+                           
+XkbXI_IndicatorNamesMask      leds->names     (1L <<2) Clients can assign
+                                                       names to indicators on
+                                                       non-KeyClass input
+                                                       extension devices.
+                                                             
+XkbXI_IndicatorMapsMask       leds->maps      (1L <<3) Clients can assign
+                                                       indicator maps to
+                                                       indicators on 
+                                                       non-KeyClass input
+                                                       extension devices.
+
+XkbXI_IndicatorStateMask      leds->state     (1L <<4) Clients can request 
+                                                       the status of indicators
+                                                       on non-KeyClass input
+                                                       extension devices.
+
+XkbXI_IndicatorsMask          sz_leds         (0x1c)   XkbXI_IndicatorNamesMask |
+                              num_leds                 XkbXI_IndicatorMapsMask |
+                              leds->*                  XkbXI_IndicatorStateMask
+
+XkbXI_UnsupportedFeaturesMask unsupported     (1L <<15)
+
+XkbXI_AllDeviceFeaturesMask   Those selected  (0x1e)   XkbXI_IndicatorsMask |
+                              by Value Column          XkbSI_ButtonActionsMask
+                              masks 
+
+XkbXI_AllFeaturesMask         Those selected  (0x1f)   XkbSI_AllDeviceFeaturesMask |
+                              by Value Column          XkbSI_KeyboardsMask
+                              masks
+
+XkbXI_AllDetailsMask          Those selected  (0x801f) XkbXI_AllFeaturesMask |
+                              by Value column          XkbXI_UnsupportedFeaturesMask
+                              masks
+.fi
+
+To update a local copy of the state and configuration of an X input extension device with the changes 
+previously noted in an XkbDeviceChangesRec structure, use
+.I XkbGetDeviceInfoChanges.
+.SH STRUCTURES
+.LP
+Changes to an Xkb extension device may be tracked by listening to XkbDeviceExtensionNotify events and 
+accumulating the changes in an XkbDeviceChangesRec structure. The changes noted in the structure may 
+then be used in subsequent operations to update either a server configuration or a local copy of an 
+Xkb extension device configuration. The changes structure is defined as follows:
+.nf
+
+typedef struct _XkbDeviceChanges {
+    unsigned int         changed;       /\(** bits indicating what has changed */
+    unsigned short       first_btn;     /\(** number of first button which changed, if any */
+    unsigned short       num_btns;      /\(** number of buttons that have changed */
+    XkbDeviceLedChangesRec leds;
+} XkbDeviceChangesRec,*XkbDeviceChangesPtr;
+
+.fi
+.SH "SEE ALSO"
+.BR XkbGetDeviceInfoChanges (__libmansuffix__)
diff --git a/man/xkb/XkbNoteIndicatorChanges.man b/man/xkb/XkbNoteIndicatorChanges.man
new file mode 100644 (file)
index 0000000..eba152d
--- /dev/null
@@ -0,0 +1,123 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbNoteIndicatorChanges __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbNoteIndicatorChanges \- Notes the changes in a changes structure 
+.SH SYNOPSIS
+.HP
+.B void XkbNoteIndicatorChanges
+.BI "(\^XkbIndicatorChangesPtr " "old" "\^,"
+.BI "XkbIndicatorNotifyEvent *" "new" "\^,"
+.BI "unsigned int " "wanted" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- old
+XkbIndicatorChanges structure to be updated
+.TP
+.I \- new
+event from which changes are to be copied
+.TP
+.I \- wanted
+which changes are to be noted
+.SH DESCRIPTION
+.LP
+Whenever an indicator changes state, the server sends XkbIndicatorStateNotify events to all 
+interested clients. Similarly, whenever an indicator's map changes, the server sends 
+XkbIndicatorMapNotify events to all interested clients.
+
+To receive XkbIndicatorStateNotify events, use 
+.I XkbSelectEvents 
+with both the 
+.I bits_to_change 
+and 
+.I values_for_bits 
+parameters containing XkbIndicatorStateNotifyMask. To receive XkbIndicatorMapNotify events, 
+use 
+.I XkbSelectEvents 
+with XkbIndicatorMapNotifyMask.
+
+To receive events for only specific indicators, use 
+.I XkbSelectEventDetails. 
+Set the 
+.I event_type 
+parameter to XkbIndicatorStateNotify or XkbIndicatorMapNotify, and set both the
+.I bits_to_change 
+and 
+.I values_for_bits 
+detail parameters to a mask where each bit specifies one indicator, turning on those bits that 
+specify the indicators for which you want to receive events.
+
+The 
+.I changed 
+parameter is a mask that is the bitwise inclusive OR of the indicators that have changed. If 
+the event is of type XkbIndicatorMapNotify, 
+.I changed 
+reports the maps that changed. If the event is of type XkbIndicatorStateNotify, 
+.I changed 
+reports the indicators that have changed state. 
+.I state 
+is a mask that specifies the current state of all indicators, whether they have changed or 
+not, for both XkbIndicatorStateNotify and IndicatorMapNotify events.
+
+When your client application receives either a XkbIndicatorStateNotify event or 
+XkbIndicatorMapNotify event, you can note the changes in a changes structure by calling
+.I XkbNoteIndicatorChanges.
+
+
+The 
+.I wanted 
+parameter is the bitwise inclusive OR of XkbIndicatorMapMask and 
+XkbIndicatorStateMask. 
+.I XkbNoteIndicatorChanges 
+copies any changes reported in 
+.I new 
+and specified in 
+.I wanted 
+into the changes record specified by 
+.I old.
+.SH STRUCTURES
+Both types of indicator events use the same structure:
+.nf
+
+typedef struct _XkbIndicatorNotify {
+  int            type;       /\(** Xkb extension base event code */
+  unsigned long  serial;     /\(** X server serial number for event */
+  Bool           send_event; /\(** True => synthetically generated */
+  Display *      display;    /\(** server connection where event generated */
+  Time           time;       /\(** server time when event generated */
+  int            xkb_type;   /\(** specifies state or map notify */
+  int            device;     /\(** Xkb device ID, will not be XkbUseCoreKbd */
+  unsigned int   changed;    /\(** mask of indicators with new state or map */
+  unsigned int   state;      /\(** current state of all indicators */
+} XkbIndicatorNotifyEvent;
+     
+.fi     
+.I xkb_type 
+is either XkbIndicatorStateNotify or XkbIndicatorMapNotify, depending on whether the event is 
+a kbIndicatorStateNotify event or kbIndicatorMapNotify event.
+.SH "SEE ALSO"
+.BR XkbIndicatorMapMask (__libmansuffix__),
+.BR XkbIndicatorStateMask (__libmansuffix__),
+.BR XkbSelectEventDetails (__libmansuffix__),
+.BR XkbSelectEvents (__libmansuffix__)
diff --git a/man/xkb/XkbNoteNameChanges.man b/man/xkb/XkbNoteNameChanges.man
new file mode 100644 (file)
index 0000000..fe028f0
--- /dev/null
@@ -0,0 +1,92 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbNoteNameChanges __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbNoteNameChanges \- Note the changed names in a changes structure
+.SH SYNOPSIS
+.HP
+.B void XkbNoteNameChanges
+.BI "(\^XkbNameChangesPtr " "old" "\^,"
+.BI "XkbNamesNotifyEvent *" "new" "\^,"
+.BI "unsigned int " "wanted" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- old
+XkbNameChanges structure to be updated
+.TP
+.I \- new
+event from which changes are to be copied
+.TP
+.I \- wanted
+types of names for which changes are to be noted
+.SH DESCRIPTION
+.LP
+When your application receives a XkbNamesNotify event, you can note the changed 
+names in a changes structure using 
+.I XkbNoteNameChanges.
+
+The 
+.I wanted 
+parameter is the bitwise inclusive OR of the valid names mask bits shown in 
+Table 1. 
+.I XkbNoteNameChanges 
+copies any changes that are reported in 
+.I new 
+and specified in 
+.I wanted 
+into the changes record specified by 
+.I old.
+
+.TS
+c s s s
+l l l l.
+Table 1 Symbolic Names Masks
+_
+Mask Bit       Value   Keyboard        Field
+               Component
+_
+XkbKeycodesNameMask    (1<<0)  Xkb->names      keycodes
+XkbGeometryNameMask    (1<<1)  Xkb->names      geometry
+XkbSymbolsNameMask     (1<<2)  Xkb->names      symbols
+XkbPhysSymbolsNameMask (1<<3)  Xkb->names      phys_symbols
+XkbTypesNameMask       (1<<4)  Xkb->names      type
+XkbCompatNameMask      (1<<5)  Xkb->names      compat
+XkbKeyTypeNamesMask    (1<<6)  Xkb->map        type[*].name
+XkbKTLevelNamesMask    (1<<7)  Xkb->map        type[*].lvl_names[*]
+XkbIndicatorNamesMask  (1<<8)  Xkb->names      indicators[*]
+XkbKeyNamesMask        (1<<9)  Xkb->names      keys[*], num_keys
+XkbKeyAliasesMask      (1<<10) Xkb->names      key_aliases[*], num_key_aliases
+XkbVirtualModNamesMask (1<<11) Xkb->names      vmods[*]
+XkbGroupNamesMask      (1<<12) Xkb->names      groups[*]
+XkbRGNamesMask (1<<13) Xkb->names      radio_groups[*], num_rg
+XkbComponentNamesMask  (0x3f)  Xkb->names      keycodes,
+                       geometry,
+                       symbols,
+                       physical symbols,
+                       types, and
+                       compatibility map
+XkbAllNamesMask        (0x3fff)        Xkb->names      all name components
+.TE
+
diff --git a/man/xkb/XkbOpenDisplay.man b/man/xkb/XkbOpenDisplay.man
new file mode 100644 (file)
index 0000000..78b6520
--- /dev/null
@@ -0,0 +1,150 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbOpenDisplay __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbOpenDisplay \-  Checks for a compatible version of the Xkb extension in both 
+the library and the server, and initializes the extension for use.
+.SH SYNOPSIS
+.HP
+.B Display XkbOpenDisplay
+.BI "(\^char *" "display_name" "\^,"
+.BI "int *" "event_rtrn" "\^,"
+.BI "int *" "error_rtrn" "\^,"
+.BI "int *" "major_in_out" "\^,"
+.BI "int *" "minor_in_out" "\^,"
+.BI "int *" "reason_rtrn" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I display_name
+hardware display name, which determines the display and communications domain to 
+be used
+.TP
+.I event_rtrn
+backfilled with the extension base event code
+.TP
+.I error_rtrn
+backfilled with the extension base error code
+.TP
+.I major_in_out
+compile time lib major version in, server major version out
+.TP
+.I minor_in_out
+compile time lib min version in, server minor version out 
+.TP
+.I reason_rtrn
+backfilled with a status code 
+.SH DESCRIPTION
+.LP
+As a convenience, you can use the function 
+.I XkbOpenDisplay 
+to perform these three 
+tasks at once: open a connection to an X server, check for a compatible version 
+of the Xkb extension in both the library and the server, and initialize the 
+extension for use.
+
+.I XkbOpenDisplay 
+is a convenience function that opens an X display connection and 
+initializes the X keyboard extension. In all cases, upon return 
+.I reason_rtrn 
+contains a status value indicating success or the type of failure. If 
+.I major_in_out 
+and 
+.I minor_in_out 
+are not NULL, 
+.I XkbOpenDisplay 
+first calls 
+.I XkbLibraryVersion 
+to determine whether the client library is compatible, passing 
+it the values pointed to by 
+.I major_in_out and 
+.I minor_in_out. If the library is 
+incompatible, 
+.I XkbOpenDisplay backfills 
+.I major_in_out 
+and 
+.I minor_in_out 
+with the 
+major and minor extension versions of the library being used and returns NULL. 
+If the library is compatible, 
+.I XkbOpenDisplay 
+next calls 
+.I XOpenDisplay 
+with the 
+.I display_name. 
+If this fails, the function returns NULL. If successful, 
+.I XkbOpenDisplay 
+calls 
+.I XkbQueryExtension 
+and backfills the major and minor Xkb 
+server extension version numbers in 
+.I major_in_out and 
+.I minor_in_out. If the server 
+extension version is not compatible with the library extension version or if the 
+server extension is not present, 
+.I XkbOpenDisplay 
+closes the display and returns 
+NULL. When successful, the function returns the display connection.
+
+The possible values for reason_rtrn are:
+
+.IP \(bu 5
+XkbOD_BadLibraryVersion indicates XkbLibraryVersion returned False.
+.IP \(bu 5
+XkbOD_ConnectionRefused indicates the display could not be opened.
+.IP \(bu 5
+XkbOD_BadServerVersion indicates the library and the server have incompatible 
+extension versions.
+.IP \(bu 5
+XkbOD_NonXkbServer indicates the extension is not present in the X server.
+.IP \(bu 5
+XkbOD_Success indicates that the function succeeded.
+.SH "RETURN VALUES"
+.TP 15
+NULL
+The 
+.I XkbOpenDisplay 
+function returns NULL if the library is incompatible.
+.sp
+.in 20
+The 
+.I XkbOpenDisplay 
+function returns NULL if the call to 
+.I XOpenDisplay 
+with the 
+.I display_name
+fails.
+.sp
+.in 20
+The 
+.I XkbOpenDisplay 
+function returns NULL and closes the display if the server extension version is not 
+compatible with the library extension version or if the server extension is not present.
+.SH DIAGNOSTICS
+.TP 15
+.SM BadAccess
+The Xkb extension has not been properly initialized
+.SH "SEE ALSO"
+.BR XkbLibraryVersion (__libmansuffix__),
+.BR XkbQueryExtension (__libmansuffix__),
+.BR XOpenDisplay (__libmansuffix__)
diff --git a/man/xkb/XkbOutOfRangeGroupInfo.man b/man/xkb/XkbOutOfRangeGroupInfo.man
new file mode 100644 (file)
index 0000000..f49f767
--- /dev/null
@@ -0,0 +1,186 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbOutOfRangeGroupInfo __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbOutOfRangeGroupInfo \- Returns only the out-of-range processing information 
+from the group_info field of an XkbSymMapRec structure
+.SH SYNOPSIS
+.HP
+.B unsigned char XkbOutOfRangeGroupInfo
+.BI "(\^unsigned char " "grp_inf" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- grp_inf
+Xkb description of interest
+.SH DESCRIPTION
+.LP
+.I XkbOutOfRangeGroupInfo 
+returns only the out-of-range processing information from the 
+.I group_info 
+field of an XkbSymMapRec structure.
+
+The 
+.I group_info 
+field of an XkbSymMapRec is an encoded value containing the number of groups of 
+symbols bound to the 
+key as well as the specification of the treatment of out-of-range groups. It is 
+legal for a key to 
+have zero groups, in which case it also has zero symbols and all events from 
+that key yield NoSymbol. 
+To obtain the number of groups of symbols bound to the key, use 
+.I XkbKeyNumGroups. 
+To change the number of groups bound to a key, use 
+.I XkbChangeTypesOfKey. 
+To obtain a mask that determines the treatment of out-of-range groups, use
+.I XkbKeyGroupInfo 
+and 
+.I XkbOutOfRangeGroupInfo.
+
+The keyboard controls contain a 
+.I groups_wrap 
+field specifying the handling of illegal groups on a global basis. That is, when 
+the user performs an 
+action causing the effective group to go out of the legal range, the 
+.I groups_wrap 
+field specifies how to normalize the effective keyboard group to a group that is 
+legal for the 
+keyboard as a whole, but there is no guarantee that the normalized group will be 
+within the range of 
+legal groups for any individual key. The per-key 
+.I group_info 
+field specifies how a key treats a legal effective group if the key does not 
+have a type specified for 
+the group of concern. For example, the Enter key usually has just one group 
+defined. If the user 
+performs an action causing the global keyboard group to change to Group2, the 
+.I group_info 
+field for the Enter key describes how to handle this situation.
+
+Out-of-range groups for individual keys are mapped to a legal group using the 
+same options as are used 
+for the overall keyboard group. The particular type of mapping used is 
+controlled by the bits set in 
+the 
+.I group_info 
+flag, as shown in Table 1.
+.bp
+.TS
+c s
+l l
+l l.
+Table 1 group_info Range Normalization
+_
+Bits set in group_info Normalization method
+_
+XkbRedirectIntoRange   XkbRedirectIntoRange
+XkbClampIntoRange      XkbClampIntoRange
+none of the above      XkbWrapIntoRange
+.TE
+.SH STRUCTURES
+.LP
+The KeySymMapRec structure is defined as follows:
+.nf
+
+    #define XkbNumKbdGroups             4
+    #define XkbMaxKbdGroup              (XkbNumKbdGroups-1)
+    
+    typedef struct {                    /\(** map to keysyms for a single keycode */
+        unsigned char       kt_index[XkbNumKbdGroups];  /\(** key type index for each group */
+        unsigned char       group_info; /\(** # of groups and out of range group handling */
+        unsigned char       width;      /\(** max # of shift levels for key */
+        unsigned short      offset;     /\(** index to keysym table in syms array */
+} XkbSymMapRec, *XkbSymMapPtr;
+
+.fi
+
+.nf
+The XkbControlsRec structure is defined as follows:
+
+    #define XkbMaxLegalKeyCode     255
+    #define XkbPerKeyBitArraySize  ((XkbMaxLegalKeyCode+1)/8)
+    
+    
+    typedef struct {
+        unsigned char   mk_dflt_btn;      /\(** default button for keyboard driven mouse */
+        unsigned char   num_groups;       /\(** number of keyboard groups */
+        unsigned char   groups_wrap;      /\(** how to wrap out-of-bounds groups */
+        XkbModsRec      internal;         /\(** defines server internal modifiers */
+        XkbModsRec      ignore_lock;      /\(** modifiers to ignore when checking for grab */
+        unsigned int    enabled_ctrls;    /\(** 1 bit => corresponding boolean control enabled */
+        unsigned short  repeat_delay;     /\(** ms delay until first repeat */
+        unsigned short  repeat_interval;  /\(** ms delay between repeats */
+        unsigned short  slow_keys_delay;  /\(** ms minimum time key must be down to be ok */
+        unsigned short  debounce_delay;   /\(** ms delay before key reactivated */
+        unsigned short  mk_delay;         /\(** ms delay to second mouse motion event */
+        unsigned short  mk_interval;      /\(** ms delay between repeat mouse events */
+        unsigned short  mk_time_to_max;   /\(** # intervals until constant mouse move */
+        unsigned short  mk_max_speed;     /\(** multiplier for maximum mouse speed */
+        short           mk_curve;         /\(** determines mouse move curve type */
+        unsigned short  ax_options;       /\(** 1 bit => Access X option enabled */
+        unsigned short  ax_timeout;       /\(** seconds until Access X disabled */
+        unsigned short  axt_opts_mask;    /\(** 1 bit => options to reset on Access X timeout */
+        unsigned short  axt_opts_values;  /\(** 1 bit => turn option on, 0=> off */
+        unsigned int    axt_ctrls_mask;   /\(** which bits in enabled_ctrls to modify */
+        unsigned int    axt_ctrls_values; /\(** values for new bits in enabled_ctrls */
+        unsigned char   per_key_repeat[XkbPerKeyBitArraySize];  /\(** per key auto repeat */
+     } XkbControlsRec, *XkbControlsPtr;
+.fi
+
+.nf
+The XkbControlsRec structure is defined as follows:
+
+    #define XkbMaxLegalKeyCode     255
+    #define XkbPerKeyBitArraySize  ((XkbMaxLegalKeyCode+1)/8)
+    
+    
+    typedef struct {
+        unsigned char   mk_dflt_btn;      /\(** default button for keyboard driven mouse */
+        unsigned char   num_groups;       /\(** number of keyboard groups */
+        unsigned char   groups_wrap;      /\(** how to wrap out-of-bounds groups */
+        XkbModsRec      internal;         /\(** defines server internal modifiers */
+        XkbModsRec      ignore_lock;      /\(** modifiers to ignore when checking for grab */
+        unsigned int    enabled_ctrls;    /\(** 1 bit => corresponding boolean control enabled */
+        unsigned short  repeat_delay;     /\(** ms delay until first repeat */
+        unsigned short  repeat_interval;  /\(** ms delay between repeats */
+        unsigned short  slow_keys_delay;  /\(** ms minimum time key must be down to be ok */
+        unsigned short  debounce_delay;   /\(** ms delay before key reactivated */
+        unsigned short  mk_delay;         /\(** ms delay to second mouse motion event */
+        unsigned short  mk_interval;      /\(** ms delay between repeat mouse events */
+        unsigned short  mk_time_to_max;   /\(** # intervals until constant mouse move */
+        unsigned short  mk_max_speed;     /\(** multiplier for maximum mouse speed */
+        short           mk_curve;         /\(** determines mouse move curve type */
+        unsigned short  ax_options;       /\(** 1 bit => Access X option enabled */
+        unsigned short  ax_timeout;       /\(** seconds until Access X disabled */
+        unsigned short  axt_opts_mask;    /\(** 1 bit => options to reset on Access X timeout */
+        unsigned short  axt_opts_values;  /\(** 1 bit => turn option on, 0=> off */
+        unsigned int    axt_ctrls_mask;   /\(** which bits in enabled_ctrls to modify */
+        unsigned int    axt_ctrls_values; /\(** values for new bits in enabled_ctrls */
+        unsigned char   per_key_repeat[XkbPerKeyBitArraySize];  /\(** per key auto repeat */
+     } XkbControlsRec, *XkbControlsPtr;
+.fi
+.SH "SEE ALSO"
+.BR XkbChangeTypesOfKey (__libmansuffix__),
+.BR XkbKeyGroupInfo (__libmansuffix__),
+.BR XkbOutOfRangeGroupInfo. (__libmansuffix__)
diff --git a/man/xkb/XkbOutOfRangeGroupNumber.man b/man/xkb/XkbOutOfRangeGroupNumber.man
new file mode 100644 (file)
index 0000000..915d3f6
--- /dev/null
@@ -0,0 +1,187 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbOutOfRangeGroupNumber __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbOutOfRangeGroupNumber \- Returns the out-of-range group number, represented 
+as a group index, from the group_info field of an XkbSymMapRec structure
+.SH SYNOPSIS
+.HP
+.B unsigned char XkbOutOfRangeGroupNumber
+.BI "(\^unsigned char " "grp_inf" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- grp_inf
+Xkb description of interest
+.SH DESCRIPTION
+.LP
+.I XkbOutOfRangeGroupNumber 
+returns the out-of-range group number, represented as a group index, from the
+.I group_info 
+field of an XkbSymMapRec structure.
+
+The 
+.I group_info 
+field of an XkbSymMapRec is an encoded value containing the number of groups of 
+symbols bound to the 
+key as well as the specification of the treatment of out-of-range groups. It is 
+legal for a key to 
+have zero groups, in which case it also has zero symbols and all events from 
+that key yield NoSymbol. 
+To obtain the number of groups of symbols bound to the key, use 
+.I XkbKeyNumGroups. 
+To change the number of groups bound to a key, use 
+.I XkbChangeTypesOfKey. 
+To obtain a mask that determines the treatment of out-of-range groups, use
+.I XkbKeyGroupInfo 
+and 
+.I XkbOutOfRangeGroupInfo.
+
+The keyboard controls contain a 
+.I groups_wrap 
+field specifying the handling of illegal groups on a global basis. That is, when 
+the user performs an 
+action causing the effective group to go out of the legal range, the 
+.I groups_wrap 
+field specifies how to normalize the effective keyboard group to a group that is 
+legal for the 
+keyboard as a whole, but there is no guarantee that the normalized group will be 
+within the range of 
+legal groups for any individual key. The per-key 
+.I group_info 
+field specifies how a key treats a legal effective group if the key does not 
+have a type specified for 
+the group of concern. For example, the Enter key usually has just one group 
+defined. If the user 
+performs an action causing the global keyboard group to change to Group2, the 
+.I group_info 
+field for the Enter key describes how to handle this situation.
+
+Out-of-range groups for individual keys are mapped to a legal group using the 
+same options as are used 
+for the overall keyboard group. The particular type of mapping used is 
+controlled by the bits set in 
+the 
+.I group_info 
+flag, as shown in Table 1.
+
+
+.TS
+c s
+l l
+l l.
+Table 1 group_info Range Normalization
+_
+Bits set in group_info Normalization method
+_
+XkbRedirectIntoRange   XkbRedirectIntoRange
+XkbClampIntoRange      XkbClampIntoRange
+none of the above      XkbWrapIntoRange
+.TE
+.SH STRUCTURES
+.LP
+The KeySymMapRec structure is defined as follows:
+.nf
+
+    #define XkbNumKbdGroups             4
+    #define XkbMaxKbdGroup              (XkbNumKbdGroups-1)
+    
+    typedef struct {                    /\(** map to keysyms for a single keycode */
+        unsigned char       kt_index[XkbNumKbdGroups];  /\(** key type index for each group */
+        unsigned char       group_info; /\(** # of groups and out of range group handling */
+        unsigned char       width;      /\(** max # of shift levels for key */
+        unsigned short      offset;     /\(** index to keysym table in syms array */
+} XkbSymMapRec, *XkbSymMapPtr;
+
+.fi
+
+.nf
+The XkbControlsRec structure is defined as follows:
+
+    #define XkbMaxLegalKeyCode     255
+    #define XkbPerKeyBitArraySize  ((XkbMaxLegalKeyCode+1)/8)
+    
+    
+    typedef struct {
+        unsigned char   mk_dflt_btn;      /\(** default button for keyboard driven mouse */
+        unsigned char   num_groups;       /\(** number of keyboard groups */
+        unsigned char   groups_wrap;      /\(** how to wrap out-of-bounds groups */
+        XkbModsRec      internal;         /\(** defines server internal modifiers */
+        XkbModsRec      ignore_lock;      /\(** modifiers to ignore when checking for grab */
+        unsigned int    enabled_ctrls;    /\(** 1 bit => corresponding boolean control enabled */
+        unsigned short  repeat_delay;     /\(** ms delay until first repeat */
+        unsigned short  repeat_interval;  /\(** ms delay between repeats */
+        unsigned short  slow_keys_delay;  /\(** ms minimum time key must be down to be ok */
+        unsigned short  debounce_delay;   /\(** ms delay before key reactivated */
+        unsigned short  mk_delay;         /\(** ms delay to second mouse motion event */
+        unsigned short  mk_interval;      /\(** ms delay between repeat mouse events */
+        unsigned short  mk_time_to_max;   /\(** # intervals until constant mouse move */
+        unsigned short  mk_max_speed;     /\(** multiplier for maximum mouse speed */
+        short           mk_curve;         /\(** determines mouse move curve type */
+        unsigned short  ax_options;       /\(** 1 bit => Access X option enabled */
+        unsigned short  ax_timeout;       /\(** seconds until Access X disabled */
+        unsigned short  axt_opts_mask;    /\(** 1 bit => options to reset on Access X timeout */
+        unsigned short  axt_opts_values;  /\(** 1 bit => turn option on, 0=> off */
+        unsigned int    axt_ctrls_mask;   /\(** which bits in enabled_ctrls to modify */
+        unsigned int    axt_ctrls_values; /\(** values for new bits in enabled_ctrls */
+        unsigned char   per_key_repeat[XkbPerKeyBitArraySize];  /\(** per key auto repeat */
+     } XkbControlsRec, *XkbControlsPtr;
+.fi
+
+.nf
+The XkbControlsRec structure is defined as follows:
+
+    #define XkbMaxLegalKeyCode     255
+    #define XkbPerKeyBitArraySize  ((XkbMaxLegalKeyCode+1)/8)
+    
+    
+    typedef struct {
+        unsigned char   mk_dflt_btn;      /\(** default button for keyboard driven mouse */
+        unsigned char   num_groups;       /\(** number of keyboard groups */
+        unsigned char   groups_wrap;      /\(** how to wrap out-of-bounds groups */
+        XkbModsRec      internal;         /\(** defines server internal modifiers */
+        XkbModsRec      ignore_lock;      /\(** modifiers to ignore when checking for grab */
+        unsigned int    enabled_ctrls;    /\(** 1 bit => corresponding boolean control enabled */
+        unsigned short  repeat_delay;     /\(** ms delay until first repeat */
+        unsigned short  repeat_interval;  /\(** ms delay between repeats */
+        unsigned short  slow_keys_delay;  /\(** ms minimum time key must be down to be ok */
+        unsigned short  debounce_delay;   /\(** ms delay before key reactivated */
+        unsigned short  mk_delay;         /\(** ms delay to second mouse motion event */
+        unsigned short  mk_interval;      /\(** ms delay between repeat mouse events */
+        unsigned short  mk_time_to_max;   /\(** # intervals until constant mouse move */
+        unsigned short  mk_max_speed;     /\(** multiplier for maximum mouse speed */
+        short           mk_curve;         /\(** determines mouse move curve type */
+        unsigned short  ax_options;       /\(** 1 bit => Access X option enabled */
+        unsigned short  ax_timeout;       /\(** seconds until Access X disabled */
+        unsigned short  axt_opts_mask;    /\(** 1 bit => options to reset on Access X timeout */
+        unsigned short  axt_opts_values;  /\(** 1 bit => turn option on, 0=> off */
+        unsigned int    axt_ctrls_mask;   /\(** which bits in enabled_ctrls to modify */
+        unsigned int    axt_ctrls_values; /\(** values for new bits in enabled_ctrls */
+        unsigned char   per_key_repeat[XkbPerKeyBitArraySize];  /\(** per key auto repeat */
+     } XkbControlsRec, *XkbControlsPtr;
+.fi
+.SH "SEE ALSO"
+.BR XkbChangeTypesOfKey (__libmansuffix__),
+.BR XkbKeyGroupInfo (__libmansuffix__),
+.BR XkbOutOfRangeGroupInfo (__libmansuffix__)
diff --git a/man/xkb/XkbPtrActionX.man b/man/xkb/XkbPtrActionX.man
new file mode 100644 (file)
index 0000000..7116185
--- /dev/null
@@ -0,0 +1,104 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbPtrActionX __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbPtrActionX \- Returns the high_XXX and low_XXX fields of act converted to a 
+signed int
+.SH SYNOPSIS
+.HP
+.B int XkbPtrActionX
+.BI "(\^XkbPtrAction " "act" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- act
+action from which to extract X
+.SH DESCRIPTION
+.LP
+Actions associated with the XkbPtrAction structure move the pointer when keys 
+are pressed and released.
+
+If the MouseKeys control is not enabled, KeyPress and KeyRelease events are 
+treated as though the action is XkbSA_NoAction.
+
+If the MouseKeys control is enabled, a server action of type XkbSA_MovePtr 
+instructs the server to generate core pointer MotionNotify events rather than 
+the usual KeyPress event, and the corresponding KeyRelease event disables any 
+mouse keys timers that were created as a result of handling the XkbSA_MovePtr 
+action.
+
+The 
+.I type 
+field of the XkbPtrAction structure is always XkbSA_MovePtr.
+
+The 
+.I flags 
+field is a bitwise inclusive OR of the masks shown in Table 1.
+
+.TS
+c s
+l l
+l lw(4i).
+Table 1 Pointer Action Types
+_
+Action Type    Meaning
+_
+XkbSA_NoAcceleration   T{
+If not set, and the MouseKeysAccel control is enabled, the KeyPress initiates a 
+mouse keys timer for this key; every time the timer expires, the cursor moves.
+T}
+XkbSA_MoveAbsoluteX    T{
+If set, the X portion of the structure specifies the new pointer X coordinate. 
+Otherwise, the X portion is added to the current pointer X coordinate to 
+determine the new pointer X coordinate.
+T}
+XkbSA_MoveAbsoluteY    T{
+If set, the Y portion of the structure specifies the new pointer Y coordinate. 
+Otherwise, the Y portion is added to the current pointer Y coordinate to 
+determine the new pointer Y coordinate.
+T}
+.TE
+
+Each of the X and Y coordinates of the XkbPtrAction structure is composed of
+two signed 16-bit values, that is, the X coordinate is composed of 
+.I high_XXX 
+and 
+.I low_XXX, 
+and similarly for the Y coordinate. Xkb provides the following macros, to 
+convert between a signed integer and two signed 16-bit values in XkbPtrAction 
+structures.
+.SH STRUCTURES
+.LP
+.nf
+
+    typedef struct _XkbPtrAction {
+        unsigned char    type;         /\(** XkbSA_MovePtr */
+        unsigned char    flags;        /\(** determines type of pointer motion */
+        unsigned char    high_XXX;     /\(** x coordinate, high bits*/
+        unsigned char    low_XXX;      /\(** y coordinate, low bits */
+        unsigned char    high_YYY;     /\(** x coordinate, high bits */
+        unsigned char    low_YYY;      /\(** y coordinate, low bits */
+    } XkbPtrAction;
+
+.fi    
diff --git a/man/xkb/XkbPtrActionY.man b/man/xkb/XkbPtrActionY.man
new file mode 100644 (file)
index 0000000..ad10214
--- /dev/null
@@ -0,0 +1,104 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbPtrActionY __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbPtrActionY \- Returns the high_YYY and low_YYY fields of act converted to a 
+signed int
+.SH SYNOPSIS
+.HP
+.B int XkbPtrActionY
+.BI "(\^XkbPtrAction " "act" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- act
+action from which to extract Y
+.SH DESCRIPTION
+.LP
+Actions associated with the XkbPtrAction structure move the pointer when keys 
+are pressed and released.
+
+If the MouseKeys control is not enabled, KeyPress and KeyRelease events are 
+treated as though the action is XkbSA_NoAction.
+
+If the MouseKeys control is enabled, a server action of type XkbSA_MovePtr 
+instructs the server to generate core pointer MotionNotify events rather than 
+the usual KeyPress event, and the corresponding KeyRelease event disables any 
+mouse keys timers that were created as a result of handling the XkbSA_MovePtr 
+action.
+
+The 
+.I type 
+field of the XkbPtrAction structure is always XkbSA_MovePtr.
+
+The 
+.I flags 
+field is a bitwise inclusive OR of the masks shown in Table 1.
+
+.TS
+c s
+l l
+l lw(4i).
+Table 1 Pointer Action Types
+_
+Action Type    Meaning
+_
+XkbSA_NoAcceleration   T{
+If not set, and the MouseKeysAccel control is enabled, the KeyPress initiates a 
+mouse keys timer for this key; every time the timer expires, the cursor moves.
+T}
+XkbSA_MoveAbsoluteX    T{
+If set, the X portion of the structure specifies the new pointer X coordinate. 
+Otherwise, the X portion is added to the current pointer X coordinate to 
+determine the new pointer X coordinate.
+T}
+XkbSA_MoveAbsoluteY    T{
+If set, the Y portion of the structure specifies the new pointer Y coordinate. 
+Otherwise, the Y portion is added to the current pointer Y coordinate to 
+determine the new pointer Y coordinate.
+T}
+.TE
+
+Each of the X and Y coordinates of the XkbPtrAction structure is composed of
+two signed 16-bit values, that is, the X coordinate is composed of 
+.I high_XXX 
+and 
+.I low_XXX, 
+and similarly for the Y coordinate. Xkb provides the following macros, to 
+convert between a signed integer and two signed 16-bit values in XkbPtrAction 
+structures.
+.SH STRUCTURES
+.LP
+.nf
+
+    typedef struct _XkbPtrAction {
+        unsigned char    type;         /\(** XkbSA_MovePtr */
+        unsigned char    flags;        /\(** determines type of pointer motion */
+        unsigned char    high_XXX;     /\(** x coordinate, high bits*/
+        unsigned char    low_XXX;      /\(** y coordinate, low bits */
+        unsigned char    high_YYY;     /\(** x coordinate, high bits */
+        unsigned char    low_YYY;      /\(** y coordinate, low bits */
+    } XkbPtrAction;
+
+.fi    
diff --git a/man/xkb/XkbQueryExtension.man b/man/xkb/XkbQueryExtension.man
new file mode 100644 (file)
index 0000000..9f73dd0
--- /dev/null
@@ -0,0 +1,126 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbQueryExtension __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbQueryExtension \-  Determines the compatibility of a library at runtime.
+.SH SYNOPSIS
+.HP
+.B Bool XkbQueryExtension
+.BI "(\^Display *" "dpy" "\^,"
+.BI "int *" "opcode_rtrn" "\^,"
+.BI "int *" "event_rtrn" "\^,"
+.BI "int *" "error_rtrn" "\^,"
+.BI "int *" "major_in_out" "\^,"
+.BI "int *" "minor_in_out" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I dpy
+connection to the X server
+.TP
+.I opcode_rtrn
+backfilled with the major extension opcode
+.TP
+.I event_rtrn
+backfilled with the extension base event code
+.TP
+.I error_rtrn
+backfilled with the extension base error code
+.TP
+.I major_in_out
+compile time lib major version in, server major version out
+.TP
+.I minor_in_out
+compile time lib min version in, server minor version out 
+.SH DESCRIPTION
+.LP
+Call 
+.I XkbQueryExtension 
+to check for the presence and compatibility of the 
+extension in the server and to initialize the extension. Because of potential 
+version mismatches, you cannot use the generic extension mechanism functions 
+(
+.I XQueryExtension 
+and 
+.I XInitExtension
+) for checking for the presence of, and 
+initializing the Xkb extension.
+You must call 
+.I XkbQueryExtension 
+or 
+.I XkbOpenDisplay 
+before using any other Xkb 
+library interfaces, unless such usage is explicitly allowed in the interface 
+description in this document. The exceptions are: 
+.I XkbIgnoreExtension, XkbLibraryVersion, 
+and a handful of audible-bell functions. You should not use 
+any other Xkb functions if the extension is not present or is uninitialized. In 
+general, calls to Xkb library functions made prior to initializing the Xkb 
+extension cause BadAccess protocol errors.
+
+.I XkbQueryExtension 
+both determines whether a compatible Xkb extension is present 
+in the X server and initializes the extension when it is present.
+
+The 
+.I XkbQueryExtension 
+function determines whether a compatible version of the X 
+Keyboard Extension is present in the server. If a compatible extension is 
+present, 
+.I XkbQueryExtension 
+returns True; otherwise, it returns False. 
+
+If a compatible version of Xkb is present, 
+.I XkbQueryExtension 
+initializes the 
+extension. It backfills the major opcode for the keyboard extension in
+.I opcode_rtrn, 
+the base event code in 
+.I event_rtrn, 
+the base error code in
+.I error_rtrn, 
+and the major and minor version numbers of the extension in
+.I major_in_out 
+and 
+.I minor_in_out. 
+The major opcode is reported in the 
+.I req_major 
+fields of some Xkb events. For a discussion of the base event code. 
+.SH "RETURN VALUES"
+.TP 15
+True
+The 
+.I XkbQueryExtension 
+function returns True if it determines a compatible version of the X 
+Keyboard Extension is present in the server. 
+.TP 15
+False
+The 
+.I XkbQueryExtension 
+function returns False if it determines a compatible version of the X 
+Keyboard Extension is not present in the server.
+.SH "SEE ALSO"
+.BR XkbIgnoreExtension (__libmansuffix__),
+.BR XkbLibraryVersion (__libmansuffix__),
+.BR XkbOpenDisplay (__libmansuffix__)
diff --git a/man/xkb/XkbRefreshKeyboardMapping.man b/man/xkb/XkbRefreshKeyboardMapping.man
new file mode 100644 (file)
index 0000000..29173b6
--- /dev/null
@@ -0,0 +1,68 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbRefreshKeyboardMapping __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbRefreshKeyboardMapping \- Update the keyboard description that is internal to the X 
+library
+.SH SYNOPSIS
+.HP
+.B Status XkbRefreshKeyboardMapping
+.BI "(\^XkbMapNotifyEvent *" "event" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- event
+event initiating remapping
+.SH DESCRIPTION
+.LP
+.I XkbRefreshKeyboardMapping 
+is the Xkb equivalent of the core 
+.I XRefreshKeyboardMapping 
+function. It requests that the X server send the current key mapping information to 
+this client. A client usually invokes 
+.I XkbRefreshKeyboardMapping 
+after receiving an XkbMapNotify event. 
+.I XkbRefreshKeyboardMapping 
+returns Success if it succeeds and BadMatch if the event is not an Xkb event.
+
+The XkbMapNotify event can be generated when some client calls 
+.I XkbSetMap, XkbChangeMap, XkbGetKeyboardByName, 
+or any of the standard X library functions that change the keyboard mapping or modifier 
+mapping.
+.SH "RETURN VALUES"
+.TP 15
+Success
+The 
+.I XkbRefreshKeyboardMapping 
+function returns Success when the request that the X server send the current key mapping information to 
+this client is successful.
+.SH DIAGNOSTICS
+.TP 15
+.B BadMatch
+A compatible version of Xkb was not available in the server or an argument has correct 
+type and range, but is otherwise invalid
+.SH "SEE ALSO"
+.BR XkbChangeMap (__libmansuffix__),
+.BR XkbGetKeyboardByName (__libmansuffix__),
+.BR XkbSetMap (__libmansuffix__),
+.BR XRefreshKeyboardMapping (__libmansuffix__)
diff --git a/man/xkb/XkbResizeDeviceButtonActions.man b/man/xkb/XkbResizeDeviceButtonActions.man
new file mode 100644 (file)
index 0000000..da63f6f
--- /dev/null
@@ -0,0 +1,93 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbResizeDeviceButtonActions __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbResizeDeviceButtonActions \- Allocate additional space for button actions in an XkbDeviceInfoRec structure
+.SH SYNOPSIS
+.HP
+.B Status XkbResizeDeviceButtonActions
+.BI "(\^XkbDeviceInfoPtr " "device_info" "\^,"
+.BI "unsigned int " "new_total" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- device_info
+structure in which to allocate button actions
+.TP
+.I \- new_total
+new total number of button actions needed
+.SH DESCRIPTION
+.LP
+.I XkbResizeDeviceButtonActions 
+reallocates space, if necessary, to make sure there is room for a total of
+.I new_total 
+button actions in the 
+.I device_info 
+structure. Any new entries allocated are zeroed. If successful,
+.I XkbResizeDeviceButtonActions 
+returns Success. If 
+.I new_total 
+is zero, all button actions are deleted, 
+.I device_info->num_btns 
+is set to zero, and 
+.I device_info->btn_acts 
+is set to NULL. If 
+.I device_info 
+is invalid or 
+.I new_total 
+is greater than 255, BadValue is returned. If a memory allocation failure occurs, a BadAlloc is returned. 
+
+To free an XkbDeviceInfoRec structure, use 
+.I XkbFreeDeviceInfo.
+.SH STRUCTURES
+.LP
+Information about X Input Extension devices is transferred between a client program and the Xkb 
+extension in an XkbDeviceInfoRec structure:
+.nf
+
+    typedef struct {
+        char *               name;          /\(** name for device */
+        Atom                 type;          /\(** name for class of devices */
+        unsigned short       device_spec;   /\(** device of interest */
+        Bool                 has_own_state; /\(** True=>this device has its own state */
+        unsigned short       supported;     /\(** bits indicating supported capabilities */
+        unsigned short       unsupported;   /\(** bits indicating unsupported capabilities */
+        unsigned short       num_btns;      /\(** number of entries in btn_acts */
+        XkbAction *          btn_acts;      /\(** button actions */
+        unsigned short       sz_leds;       /\(** total number of entries in LEDs vector */
+        unsigned short       num_leds;      /\(** number of valid entries in LEDs vector */
+        unsigned short       dflt_kbd_fb;   /\(** input extension ID of default (core kbd) indicator */
+        unsigned short       dflt_led_fb;   /\(** input extension ID of default indicator feedback */
+        XkbDeviceLedInfoPtr  leds;          /\(** LED descriptions */
+    } XkbDeviceInfoRec, *XkbDeviceInfoPtr;
+.fi
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
+.SH "SEE ALSO"
+.BR XkbFreeDeviceInfo (__libmansuffix__)
diff --git a/man/xkb/XkbResizeKeyActions.man b/man/xkb/XkbResizeKeyActions.man
new file mode 100644 (file)
index 0000000..b316aaa
--- /dev/null
@@ -0,0 +1,100 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbResizeKeyActions __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbResizeKeyActions \- Change the number of actions bound to a key
+.SH SYNOPSIS
+.HP
+.B XkbAction * XkbResizeKeyActions
+.BI "(\^XkbDescRec *" "xkb" "\^,"
+.BI "int " "key" "\^,"
+.BI "int " "needed" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+keyboard description to change
+.TP
+.I \- key
+keycode of key to change
+.TP
+.I \- needed
+new number of actions required
+.SH DESCRIPTION
+.LP
+The 
+.I xkb 
+parameter points to the keyboard description containing the 
+.I key 
+whose number of actions is to be changed. The 
+.I key 
+parameter is the keycode of the key to change, and needed specifies the new 
+number of actions required for the key.
+
+.I XkbResizeKeyActions 
+reserves the space needed for the actions and returns a pointer to the beginning 
+of the new array that holds the actions. It can change the 
+.I acts, num_acts, 
+and 
+.I size_acts 
+fields of 
+.I xkb->server 
+if it is necessary to reallocate the 
+.I acts 
+array.
+
+If 
+.I needed 
+is greater than the current number of keysyms for the key, 
+.I XkbResizeKeyActions 
+initializes all new actions in the array to NoAction.
+
+Because the number of actions needed by a key is normally computed as width * 
+number of groups, and 
+.I XkbResizeKeyActions 
+does not modify either the width or number of groups for the key, a discrepancy 
+exists on return from 
+.I XkbResizeKeyActions 
+between the space allocated for the actions and the number required. The unused 
+entries in the list of actions returned by 
+.I XkbResizeKeyActions 
+are not preserved across future calls to any of the map editing functions, so 
+you must update the key actions (which updates the width and number of groups 
+for the key) before calling another allocator function. A call to
+.I XkbChangeTypesOfKey 
+updates these.
+
+If any allocation errors occur while resizing the number of actions bound to the 
+key, 
+.I XkbResizeKeyActions 
+returns NULL.
+.SH "SEE ALSO"
+.BR XkbChangeTypesOfKey (__libmansuffix__),
+.BR XkbResizeKeySyms (__libmansuffix__)
+.SH NOTES
+.LP
+A change to the number of actions bound to a key should be accompanied by a 
+change in the number of symbols bound to a key. Refer to 
+.I XkbResizeKeySyms 
+for more information on changing the number of symbols bound to a key.
diff --git a/man/xkb/XkbResizeKeySyms.man b/man/xkb/XkbResizeKeySyms.man
new file mode 100644 (file)
index 0000000..9219ee5
--- /dev/null
@@ -0,0 +1,98 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbResizeKeySyms __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbResizeKeySyms \- Change the number of symbols bound to a key
+.SH SYNOPSIS
+.HP
+.B KeySym * XkbResizeKeySyms
+.BI "(\^XkbDescRec *" "xkb" "\^,"
+.BI "int " "key" "\^,"
+.BI "int " "needed" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+keyboard description to be changed
+.TP
+.I \- key
+keycode for key to modify
+.TP
+.I \- needed
+new number of keysyms required for key
+.SH DESCRIPTION
+.LP
+.I XkbResizeKeySyms 
+reserves the space needed for 
+.I needed 
+keysyms and returns a pointer to the beginning of the new array that holds the 
+keysyms. It adjusts the 
+.I offset 
+field of the 
+.I key_sym_map 
+entry for the key if necessary and can also change the 
+.I syms, num_syms, 
+and 
+.I size_syms 
+fields of 
+.I xkb->map 
+if it is necessary to reallocate the 
+.I syms 
+array. 
+.I XkbResizeKeySyms 
+does not modify either the width or number of groups associated with the key.
+
+If 
+.I needed 
+is greater than the current number of keysyms for the key, 
+.I XkbResizeKeySyms 
+initializes all new keysyms in the array to NoSymbol.
+
+Because the number of symbols needed by a key is normally computed as width * 
+number of groups, and 
+.I XkbResizeKeySyms 
+does not modify either the width or number of groups for the key, a discrepancy 
+exists upon return from 
+.I XkbResizeKeySyms 
+between the space allocated for the keysyms and the number required. The unused 
+entries in the list of symbols returned by 
+.I XkbResizeKeySyms 
+are not preserved across future calls to any of the map editing functions, so 
+you must update the key symbol mapping (which updates the width and number of 
+groups for the key) before calling another allocator function. A call to
+.I XkbChangeTypesOfKey 
+will update the mapping.
+
+If any allocation errors occur while resizing the number of symbols bound to the 
+key, 
+.I XkbResizeKeySyms 
+returns NULL.
+.SH "SEE ALSO"
+.BR XkbChangeTypesOfKey (__libmansuffix__),
+.BR XkbResizeKeyActions (__libmansuffix__)
+.SH NOTES
+.LP
+A change to the number of symbols bound to a key should be accompanied by a 
+change in the number of actions bound to a key. Refer to XkbResizeKeyActions for 
+more information on changing the number of actions bound to a key.
diff --git a/man/xkb/XkbResizeKeyType.man b/man/xkb/XkbResizeKeyType.man
new file mode 100644 (file)
index 0000000..a19158a
--- /dev/null
@@ -0,0 +1,137 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbResizeKeyType __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbResizeKeyType \- Change the number of levels in a key type
+.SH SYNOPSIS
+.HP
+.B Status XkbResizeKeyType
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "int " "type_ndx" "\^,"
+.BI "int " "map_count" "\^,"
+.BI "Bool " "want_preserve" "\^,"
+.BI "int " "new_num_lvls" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+keyboard description containing client map to update
+.TP
+.I \- type_ndx
+index in xkb->map->types of type to change
+.TP
+.I \- map_count
+total # of map entries needed for the type
+.TP
+.I \- want_preserve
+True => list of preserved modifiers is necessary
+.TP
+.I \- new_num_lvls
+new max # of levels for type
+.SH DESCRIPTION
+.LP
+.I XkbResizeKeyType 
+changes the type specified by 
+.I xkb->map->types[type_ndx], 
+and reallocates the symbols and actions bound to all keys that use the type, if 
+necessary. 
+.I XkbResizeKeyType 
+updates only the local copy of the types in 
+.I xkb; 
+to update the server's copy for the physical device, use 
+.I XkbSetMap 
+or 
+.I XkbChangeMap 
+after calling 
+.I XkbResizeKeyType.
+
+The 
+.I map_count 
+parameter specifies the total number of map entries needed for the type, and can 
+be zero or greater. If 
+.I map_count 
+is zero, 
+.I XkbResizeKeyType 
+frees the existing 
+.I map 
+and 
+.I preserve 
+entries for the type if they exist and sets them to NULL.
+
+The 
+.I want_preserve 
+parameter specifies whether a 
+.I preserve 
+list for the key should be created. If 
+.I want_preserve 
+is True, the 
+.I preserve 
+list with 
+.I map_count 
+entries is allocated or reallocated if it already exists. Otherwise, if
+.I want_preserve 
+is False, the 
+.I preserve 
+field is freed if necessary and set to NULL.
+
+The 
+.I new_num_lvls 
+parameter specifies the new maximum number of shift levels for the type and is 
+used to calculate and resize the symbols and actions bound to all keys that use 
+the type.
+
+If 
+.I type_ndx 
+does not specify a legal type, 
+.I new_num_lvls 
+is less than 1, or the 
+.I map_count 
+is less than zero, 
+.I XkbResizeKeyType 
+returns BadValue. If 
+.I XkbResizeKeyType 
+encounters any problems with allocation, it returns BadAlloc. Otherwise, it 
+returns Success.
+.SH "RETURN VALUES"
+.TP 15
+Success
+The 
+.I XkbResizeKeyType 
+function returns Success if 
+.I type_ndx 
+specifies a legal type,   
+.I new_num_lvls 
+is greater than zero and 
+.I map_count 
+is positive.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadValue
+An argument is out of range
+.SH "SEE ALSO"
+.BR XkbChangeMap (__libmansuffix__),
+.BR XkbSetMap (__libmansuffix__)
diff --git a/man/xkb/XkbSAActionSetCtrls.man b/man/xkb/XkbSAActionSetCtrls.man
new file mode 100644 (file)
index 0000000..b6da9fb
--- /dev/null
@@ -0,0 +1,150 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbSAActionSetCtrls __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSAActionSetCtrls \- Sets the 
+.I ctrls0 
+through 
+.I ctrls3
+fields of 
+.I act
+from 
+.I ctrls
+.SH SYNOPSIS
+.HP
+.B void XkbSAActionSetCtrls
+.BI "(\^XkbCtrlsAction " "act" "\^,"
+.BI "unsigned int " "ctrls" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- act
+action in which to set ctrls0-ctrls3
+.TP
+.I \- ctrls
+value to set in ctrls0-ctrls3
+.SH DESCRIPTION
+.LP
+Actions associated with the XkbCtrlsAction structure change the state of the 
+boolean controls.
+
+The 
+.I type 
+field can have any one of the values shown in Table 1.
+
+.TS
+c s
+l l
+l lw(4i).
+Table 1 Controls Action Types
+_
+Type   Effect
+_
+XkbSA_SetControls      T{
+A key press enables any boolean controls specified in the ctrls fields that were 
+not already enabled at 
+the time of the key press.
+A key release disables any controls enabled by the key press.
+This action can cause XkbControlsNotify events.
+T}
+XkbSA_LockControls     T{
+If the XkbSA_LockNoLock bit is not set in the flags field, a key press enables 
+any controls specified in 
+the ctrls fields that were not already enabled at the time of the key press.
+.br
+If the XkbSA_LockNoUnlock bit is not set in the flags field, a key release 
+disables any controls 
+specified in the ctrls fields that were not already disabled at the time of the 
+key press.
+.br
+This action can cause XkbControlsNotify events.
+T}
+.TE
+
+The 
+.I flags 
+field is composed of the bitwise inclusive OR of the masks shown in Table 2.
+
+.TS
+c s
+l l
+l lw(4i).
+Table 2 Control Action Flags
+_
+Flag   Meaning
+_
+XkbSA_LockNoLock       T{
+If set, and the action type is XkbSA_LockControls, the server only disables 
+controls.
+T}
+XkbSA_LockNoUnlock     T{
+If set, and the action type is XkbSA_LockControls, the server only enables 
+controls.
+T}
+.TE
+
+The XkbSA_SetControls action implements a key that enables a boolean control 
+when pressed and disables it 
+when released. The XkbSA_LockControls action is used to implement a key that 
+toggles the state of a 
+boolean control each time it is pressed and released. The XkbSA_LockNoLock and 
+XkbSA_LockNoUnlock flags 
+allow modifying the toggling behavior to only unlock or only lock the boolean 
+control.
+
+The 
+.I ctrls0, ctrls1, ctrls2, 
+and 
+.I ctrls3 
+fields represent the boolean controls in the 
+.I enabled_ctrls 
+field of the controls structure. Xkb macros, to convert between the two formats.
+
+.I XkbSAActionSetCtrls 
+sets the 
+.I ctrls0 
+through 
+.I ctrls3 
+fields of 
+.I act 
+from 
+.I ctrls.
+.SH STRUCTURES
+.LP
+.nf
+
+    typedef struct _XkbCtrlsAction {
+        unsigned char    type;    /\(** XkbSA_SetControls, XkbSA_LockControls */
+        unsigned char    flags;   /\(** with type, controls enabling and disabling 
+of controls */
+        unsigned char    ctrls3;  /\(** ctrls0 through ctrls3 represent the boolean 
+controls */
+        unsigned char    ctrls2;  /\(** ctrls0 through ctrls3 represent the boolean 
+controls */
+        unsigned char    ctrls1;  /\(** ctrls0 through ctrls3 represent the boolean 
+controls */
+        unsigned char    ctrls0;  /\(** ctrls0 through ctrls3 represent the boolean 
+controls */
+    } XkbCtrlsAction;
+.fi
diff --git a/man/xkb/XkbSAGroup.man b/man/xkb/XkbSAGroup.man
new file mode 100644 (file)
index 0000000..14ce14a
--- /dev/null
@@ -0,0 +1,60 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbSAGroup __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSAGroup \- Returns the group_XXX field of act converted to a signed int
+.SH SYNOPSIS
+.HP
+.B int XkbSAGroup
+.BI "(\^XkbAction " "act" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- act
+action from which to extract group
+.SH DESCRIPTION
+.LP
+.I XkbSAGroup 
+returns the 
+.I group_XXX 
+field of 
+.I act 
+converted to a signed int. 
+.SH STRUCTURE
+.LP
+Actions associated with the XkbGroupAction structure change the current group 
+state when keys are 
+pressed and released:
+.nf
+
+    typedef struct _XkbGroupAction {
+        unsigned char    type;       /\(** XkbSA_{Set|Latch|Lock}Group */
+        unsigned char    flags;      /\(** with type, controls the effect on groups 
+*/
+        char             group_XXX;  /\(** represents a group index or delta */
+    } XkbGroupAction;
+   
+.SH WARNING
+.LP
+This manpage seems to be incomplete
diff --git a/man/xkb/XkbSAPtrDfltValue.man b/man/xkb/XkbSAPtrDfltValue.man
new file mode 100644 (file)
index 0000000..8efd3e4
--- /dev/null
@@ -0,0 +1,107 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbSAPtrDfltValue __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSAPtrDfltValue \- Returns the valueXXX field of act converted to a signed int
+.SH SYNOPSIS
+.HP
+.B int XkbSAPtrDfltValue
+.BI "(\^XkbAction " "act" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- act
+action from which to extract group
+.SH DESCRIPTION
+.LP
+Actions associated with the XkbPtrDfltAction structure change the mk_dflt_btn 
+attribute of the MouseKeys control.
+
+If the MouseKeys control is not enabled, KeyPress and KeyRelease events are 
+treated as though the action is XkbSA_NoAction. Otherwise, this action changes 
+the 
+.I mk_dflt_btn 
+attribute of the MouseKeys control.
+
+The 
+.I type 
+field of the XkbPtrDfltAction structure should always be XkbSA_SetPtrDflt.
+
+The 
+.I flags 
+field is composed of the bitwise inclusive OR of the values shown in Table 1 
+(currently there is only one value defined).
+
+.TS
+c s
+l l
+l lw(4i).
+Table 1 Pointer Default Flags
+_
+Flag   Meaning
+_
+XkbSA_DfltBtnAbsolute  T{
+If set, the value field represents an absolute pointer button. Otherwise, the 
+value field represents the amount to be added to the current default button.
+T}
+.TE
+
+The 
+.I affect 
+field specifies what changes as a result of this action. The only valid value 
+for the 
+.I affect 
+field is XkbSA_AffectDfltBtn.
+
+The 
+.I valueXXX 
+field is a signed character that represents the new button value for the
+.I mk_dflt_btn 
+attribute of the MouseKeys control. If XkbSA_DfltBtnAbsolute is set in 
+.I flags, valueXXX 
+specifies the button to be used; otherwise, 
+.I valueXXX 
+specifies the amount to be added to the current default button. In either case, 
+illegal button choices are wrapped back around into range. Xkb provides macros, 
+to convert between the integer and signed character values in XkbPtrDfltAction 
+structures.
+
+.I XkbSAPtrDfltValue 
+returns the 
+.I valueXXX 
+field of 
+.I act 
+converted to a signed int. 
+.SH STRUCTURES
+.LP
+.nf
+
+    typedef struct _XkbPtrDfltAction {
+        unsigned char    type;      /\(** XkbSA_SetPtrDflt */
+        unsigned char    flags;     /\(** controls the pointer button number */
+        unsigned char    affect;    /\(** XkbSA_AffectDfltBtn */
+        char             valueXXX;  /\(** new default button member */
+    } XkbPtrDfltAction;
+
+.fi
diff --git a/man/xkb/XkbSARedirectSetVMods.man b/man/xkb/XkbSARedirectSetVMods.man
new file mode 100644 (file)
index 0000000..70565d7
--- /dev/null
@@ -0,0 +1,109 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbSARedirectSetVMods __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSARedirectSetVMods \- Sets the vmods0 and vmods1 of act from v
+.SH SYNOPSIS
+.HP
+.B void XkbSARedirectSetVMods
+.BI "(\^XkbRedirectKeyAction " "act" "\^,"
+.BI "unsigned int " "v" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- act
+action in which to set vmods
+.TP
+.I \- v
+new value for virtual modifiers
+.SH DESCRIPTION
+.LP
+Actions associated with the XkbRedirectKeyAction structure generate KeyPress and KeyRelease events 
+containing a keycode different from the key that was pressed or released.
+
+The 
+.I type 
+field for the XkbRedirectKeyAction structure should always be XkbSA_RedirectKey.
+Key presses cause a KeyPress event for the key specified by the 
+.I new_key 
+field instead of the actual key. The state reported in this event reports the current effective 
+modifiers changed as follows: any real modifiers selected by the 
+.I mods_mask 
+field are set to corresponding values from the 
+.I mods 
+field. Any real modifiers bound to the virtual modifiers specified by the
+.I vmods_mask0 
+and 
+.I vmods_mask1 
+fields are either set or cleared, depending on the corresponding values in the
+.I vmods0 
+and 
+.I vmods1 
+fields. If the real and virtual modifier definitions specify conflicting values for a single modifier, 
+the real modifier definition has priority.
+
+Key releases cause a KeyRelease event for the key specified by the 
+.I new_key 
+field instead of the actual key. The state for this event consists of the effective keyboard modifiers 
+at the time of the release, changed as described previously.
+
+The XkbSA_RedirectKey action normally redirects to another key on the same device as the key that 
+caused the event, unless that device does not belong to the input extension KeyClass, in which case 
+this action causes an event on the core keyboard device. (The input extension categorizes devices by 
+breaking them into classes. Keyboards, and other input devices with keys, are classified as KeyClass 
+devices by the input extension.)
+
+The 
+.I vmods_mask0 
+and 
+.I vmods_mask1 
+fields actually represent one 
+.I vmods_mask 
+value. Xkb provides macros to convert between the two formats.
+
+
+.I XkbSARedirectSetVModsMask 
+sets the 
+.I vmods0 
+and 
+.I vmods1 
+of 
+.I act 
+from 
+.I v.
+.SH STRUCTURES
+.LP
+.nf
+
+    typedef struct_XkbRedirectKeyAction {
+        unsigned char   type;        /\(** XkbSA_RedirectKey */
+        unsigned char   new_key;     /\(** keycode to be put in event */
+        unsigned char   mods_mask;   /\(** mask of real mods to be reset */
+        unsigned char   mods;        /\(** mask of real mods to take values from */
+        unsigned char   vmods_mask0; /\(** first half of mask of virtual mods to be reset */
+        unsigned char   vmods_mask1; /\(** other half of mask of virtual mods to be reset */
+        unsigned char   vmods0;      /\(** first half of mask of virtual mods to take values from */
+        unsigned char   vmods1;      /\(** other half of mask of virtual mods to take values from */
+    } XkbRedirectKeyAction;
+    
+.fi
diff --git a/man/xkb/XkbSARedirectSetVModsMask.man b/man/xkb/XkbSARedirectSetVModsMask.man
new file mode 100644 (file)
index 0000000..3e627a8
--- /dev/null
@@ -0,0 +1,122 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbSARedirectSetVModsMask __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSARedirectSetVModsMask \- Sets the vmods_mask0 and vmods_mask1 fields of act 
+from vm
+.SH SYNOPSIS
+.HP
+.B void XkbSARedirectSetVModsMask
+.BI "(\^XkbRedirectKeyAction " "act" "\^,"
+.BI "unsigned int " "vm" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- act
+action in which to set vmods
+.TP
+.I \- vm
+new value for virtual modifier mask
+.SH DESCRIPTION
+.LP
+Actions associated with the XkbRedirectKeyAction structure generate KeyPress and 
+KeyRelease events 
+containing a keycode different from the key that was pressed or released.
+
+The 
+.I type 
+field for the XkbRedirectKeyAction structure should always be XkbSA_RedirectKey.
+Key presses cause a KeyPress event for the key specified by the 
+.I new_key 
+field instead of the actual key. The state reported in this event reports the 
+current effective 
+modifiers changed as follows: any real modifiers selected by the 
+.I mods_mask 
+field are set to corresponding values from the 
+.I mods 
+field. Any real modifiers bound to the virtual modifiers specified by the
+.I vmods_mask0 
+and 
+.I vmods_mask1 
+fields are either set or cleared, depending on the corresponding values in the
+.I vmods0 
+and 
+.I vmods1 
+fields. If the real and virtual modifier definitions specify conflicting values 
+for a single modifier, 
+the real modifier definition has priority.
+
+Key releases cause a KeyRelease event for the key specified by the 
+.I new_key 
+field instead of the actual key. The state for this event consists of the 
+effective keyboard modifiers 
+at the time of the release, changed as described previously.
+
+The XkbSA_RedirectKey action normally redirects to another key on the same 
+device as the key that 
+caused the event, unless that device does not belong to the input extension 
+KeyClass, in which case 
+this action causes an event on the core keyboard device. (The input extension 
+categorizes devices by 
+breaking them into classes. Keyboards, and other input devices with keys, are 
+classified as KeyClass 
+devices by the input extension.)
+
+The 
+.I vmods_mask0 
+and 
+.I vmods_mask1 
+fields actually represent one 
+.I vmods_mask 
+value. Xkb provides macros to convert between the two formats.
+
+.I XkbSARedirectSetVModsMask 
+sets the 
+.I vmods_mask0 
+and 
+.I vmods_mask1 
+fields of 
+.I act 
+from 
+.I vm. 
+.SH STRUCTURES
+.LP
+.nf
+
+    typedef struct_XkbRedirectKeyAction {
+        unsigned char   type;        /\(** XkbSA_RedirectKey */
+        unsigned char   new_key;     /\(** keycode to be put in event */
+        unsigned char   mods_mask;   /\(** mask of real mods to be reset */
+        unsigned char   mods;        /\(** mask of real mods to take values from */
+        unsigned char   vmods_mask0; /\(** first half of mask of virtual mods to be 
+reset */
+        unsigned char   vmods_mask1; /\(** other half of mask of virtual mods to be 
+reset */
+        unsigned char   vmods0;      /\(** first half of mask of virtual mods to 
+take values from */
+        unsigned char   vmods1;      /\(** other half of mask of virtual mods to 
+take values from */
+    } XkbRedirectKeyAction;
+    
+.fi
diff --git a/man/xkb/XkbSARedirectVMods.man b/man/xkb/XkbSARedirectVMods.man
new file mode 100644 (file)
index 0000000..cd6b3cb
--- /dev/null
@@ -0,0 +1,116 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbSARedirectVMods __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSARedirectVMods \- Returns the vmods0 and vmods1 fields of act converted to 
+an unsigned int
+.SH SYNOPSIS
+.HP
+.B unsigned int XkbSARedirectVMods
+.BI "(\^XkbRedirectKeyAction " "act" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- act
+action from which to extract vmods
+.SH DESCRIPTION
+.LP
+Actions associated with the XkbRedirectKeyAction structure generate KeyPress and 
+KeyRelease events 
+containing a keycode different from the key that was pressed or released.
+
+The 
+.I type 
+field for the XkbRedirectKeyAction structure should always be XkbSA_RedirectKey.
+Key presses cause a KeyPress event for the key specified by the 
+.I new_key 
+field instead of the actual key. The state reported in this event reports the 
+current effective 
+modifiers changed as follows: any real modifiers selected by the 
+.I mods_mask 
+field are set to corresponding values from the 
+.I mods 
+field. Any real modifiers bound to the virtual modifiers specified by the
+.I vmods_mask0 
+and 
+.I vmods_mask1 
+fields are either set or cleared, depending on the corresponding values in the
+.I vmods0 
+and 
+.I vmods1 
+fields. If the real and virtual modifier definitions specify conflicting values 
+for a single modifier, 
+the real modifier definition has priority.
+
+Key releases cause a KeyRelease event for the key specified by the 
+.I new_key 
+field instead of the actual key. The state for this event consists of the 
+effective keyboard modifiers 
+at the time of the release, changed as described previously.
+
+The XkbSA_RedirectKey action normally redirects to another key on the same 
+device as the key that 
+caused the event, unless that device does not belong to the input extension 
+KeyClass, in which case 
+this action causes an event on the core keyboard device. (The input extension 
+categorizes devices by 
+breaking them into classes. Keyboards, and other input devices with keys, are 
+classified as KeyClass 
+devices by the input extension.)
+
+The 
+.I vmods_mask0 
+and 
+.I vmods_mask1 
+fields actually represent one 
+.I vmods_mask 
+value. Xkb provides macros to convert between the two formats.
+
+.I XkbSARedirectVModsMask 
+returns the 
+.I vmods0 
+and 
+.I vmods1 
+fields of 
+.I act 
+converted to an unsigned int. 
+.SH STRUCTURES
+.LP
+.nf
+
+    typedef struct_XkbRedirectKeyAction {
+        unsigned char   type;        /\(** XkbSA_RedirectKey */
+        unsigned char   new_key;     /\(** keycode to be put in event */
+        unsigned char   mods_mask;   /\(** mask of real mods to be reset */
+        unsigned char   mods;        /\(** mask of real mods to take values from */
+        unsigned char   vmods_mask0; /\(** first half of mask of virtual mods to be 
+reset */
+        unsigned char   vmods_mask1; /\(** other half of mask of virtual mods to be 
+reset */
+        unsigned char   vmods0;      /\(** first half of mask of virtual mods to 
+take values from */
+        unsigned char   vmods1;      /\(** other half of mask of virtual mods to 
+take values from */
+    } XkbRedirectKeyAction;
+    
+.fi
diff --git a/man/xkb/XkbSARedirectVModsMask.man b/man/xkb/XkbSARedirectVModsMask.man
new file mode 100644 (file)
index 0000000..b87efc2
--- /dev/null
@@ -0,0 +1,117 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbSARedirectVModsMask __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSARedirectVModsMask \- Returns the vmods_mask0 and vmods_mask1 fields of act 
+converted to an unsigned int
+.SH SYNOPSIS
+.HP
+.B unsigned int XkbSARedirectVModsMask
+.BI "(\^XkbRedirectKeyAction " "act" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- act
+action from which to extract vmods
+.SH DESCRIPTION
+.LP
+Actions associated with the XkbRedirectKeyAction structure generate KeyPress and 
+KeyRelease events 
+containing a keycode different from the key that was pressed or released.
+
+The 
+.I type 
+field for the XkbRedirectKeyAction structure should always be XkbSA_RedirectKey.
+Key presses cause a KeyPress event for the key specified by the 
+.I new_key 
+field instead of the actual key. The state reported in this event reports the 
+current effective 
+modifiers changed as follows: any real modifiers selected by the 
+.I mods_mask 
+field are set to corresponding values from the 
+.I mods 
+field. Any real modifiers bound to the virtual modifiers specified by the
+.I vmods_mask0 
+and 
+.I vmods_mask1 
+fields are either set or cleared, depending on the corresponding values in the
+.I vmods0 
+and 
+.I vmods1 
+fields. If the real and virtual modifier definitions specify conflicting values 
+for a single modifier, 
+the real modifier definition has priority.
+
+Key releases cause a KeyRelease event for the key specified by the 
+.I new_key 
+field instead of the actual key. The state for this event consists of the 
+effective keyboard modifiers 
+at the time of the release, changed as described previously.
+
+The XkbSA_RedirectKey action normally redirects to another key on the same 
+device as the key that 
+caused the event, unless that device does not belong to the input extension 
+KeyClass, in which case 
+this action causes an event on the core keyboard device. (The input extension 
+categorizes devices by 
+breaking them into classes. Keyboards, and other input devices with keys, are 
+classified as KeyClass 
+devices by the input extension.)
+
+The 
+.I vmods_mask0 
+and 
+.I vmods_mask1 
+fields actually represent one 
+.I vmods_mask 
+value. Xkb provides macros to convert between the two formats.
+
+.I XkbSARedirectVModsMask 
+returns the 
+.I vmods_mask0 
+and 
+.I vmods_mask1 
+fields of 
+.I act 
+converted to an unsigned int. 
+.bp
+.SH STRUCTURES
+.LP
+.nf
+
+    typedef struct_XkbRedirectKeyAction {
+        unsigned char   type;        /\(** XkbSA_RedirectKey */
+        unsigned char   new_key;     /\(** keycode to be put in event */
+        unsigned char   mods_mask;   /\(** mask of real mods to be reset */
+        unsigned char   mods;        /\(** mask of real mods to take values from */
+        unsigned char   vmods_mask0; /\(** first half of mask of virtual mods to be 
+reset */
+        unsigned char   vmods_mask1; /\(** other half of mask of virtual mods to be 
+reset */
+        unsigned char   vmods0;      /\(** first half of mask of virtual mods to 
+take values from */
+        unsigned char   vmods1;      /\(** other half of mask of virtual mods to 
+take values from */
+    } XkbRedirectKeyAction;
+    
+.fi
diff --git a/man/xkb/XkbSAScreen.man b/man/xkb/XkbSAScreen.man
new file mode 100644 (file)
index 0000000..8ffb33a
--- /dev/null
@@ -0,0 +1,102 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbSAScreen __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSAScreen \- Returns the screenXXX field of act converted to a signed int
+.SH SYNOPSIS
+.HP
+.B int XkbSAScreen 
+.BI "(\^XkbSwitchScreenAction " "act" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- act
+action from which to extract screen
+.SH DESCRIPTION
+.LP
+Actions associated with the XkbSwitchScreen action structure change the active 
+screen on a multiscreen display.
+
+The 
+.I type 
+field of the XkbSwitchScreenAction structure should always be 
+XkbSA_SwitchScreen.
+
+The 
+.I flags 
+field is composed of the bitwise inclusive OR of the masks shown in Table 1.
+
+.TS
+c s
+l l
+l lw(4i).
+Table 1 Switch Screen Action Flags
+_
+Flag   Meaning
+_
+XkbSA_SwitchAbsolute   T{
+If set, the screenXXX field represents the index of the new screen. Otherwise, 
+it represents an offset from the current screen to the new screen.
+T}
+XkbSA_SwitchApplication        T{
+If not set, the action should switch to another screen on the same server. 
+Otherwise, it should switch to another X server or application that shares the 
+same physical display.
+T}
+.TE
+
+The 
+.I screenXXX 
+field is a signed character value that represents either the relative or 
+absolute screen index, depending on the state of the XkbSA_SwitchAbsolute bit in 
+the 
+.I flags 
+field. Xkb provides the following macros to convert between the integer and 
+signed character value for screen numbers in XkbSwitchScreenAction structures.
+
+.I XkbSAScreen 
+macro returns the 
+.I screenXXX 
+field of 
+.I act 
+converted to a signed int. 
+.SH STRUCTURES
+.LP
+.nf
+
+    typedef struct _XkbSwitchScreenAction {
+        unsigned char    type;        /\(** XkbSA_SwitchScreen */
+        unsigned char    flags;       /\(** controls screen switching */
+        char             screenXXX;   /\(** screen number or delta */
+    } XkbSwitchScreenAction;
+
+.fi
+
+.SH NOTES
+.LP
+The XkbSwitchScreen action is optional. Servers are free to ignore the action or 
+any of its 
+flags if they do not support the requested behavior. If the action is ignored, 
+it behaves like XkbSA_NoAction. Otherwise, key press and key release events do 
+not generate an event. 
diff --git a/man/xkb/XkbSASetGroup.man b/man/xkb/XkbSASetGroup.man
new file mode 100644 (file)
index 0000000..c95e064
--- /dev/null
@@ -0,0 +1,63 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbSASetGroup __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSASetGroup \- Sets the group_XXX field of act from the group index grp
+.SH SYNTAX
+.HP
+.B void XkbSASetGroup
+.BI "(\^XkbAction " "act" "\^,"
+.BI "int " "grp" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- act
+action from which to set group
+.TP
+.I \- grp
+group index to set in group_XXX
+.SH DESCRIPTION
+.LP
+.I XkbSASetGroup 
+sets the 
+.I group_XXX 
+field of 
+.I act 
+from the group index 
+.I grp. 
+.SH STRUCTURE
+.LP
+Actions associated with the XkbGroupAction structure change the current group state when keys are 
+pressed and released:
+.nf
+
+    typedef struct _XkbGroupAction {
+        unsigned char    type;       /\(** XkbSA_{Set|Latch|Lock}Group */
+        unsigned char    flags;      /\(** with type, controls the effect on groups */
+        char             group_XXX;  /\(** represents a group index or delta */
+    } XkbGroupAction;
+    
+.SH WARNING
+.LP
+This manpage seems to be incomplete
diff --git a/man/xkb/XkbSASetPtrDfltValue.man b/man/xkb/XkbSASetPtrDfltValue.man
new file mode 100644 (file)
index 0000000..595cbb5
--- /dev/null
@@ -0,0 +1,104 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbSASetPtrDfltValue __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSASetPtrDfltValue \- Sets the valueXXX field of act from val
+.SH SYNOPSIS
+.HP
+.B void XkbSASetPtrDfltValue
+.BI "(\^XkbAction " "act" "\^,"
+.BI "int " "val" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- act
+action in which to set valueXXX
+.TP
+.I \- val
+value to set in valueXXX
+.SH DESCRIPTION
+.LP
+Actions associated with the XkbPtrDfltAction structure change the mk_dflt_btn 
+attribute of the MouseKeys control.
+
+If the MouseKeys control is not enabled, KeyPress and KeyRelease events are 
+treated as though the action is XkbSA_NoAction. Otherwise, this action changes 
+the 
+.I mk_dflt_btn 
+attribute of the MouseKeys control.
+
+The 
+.I type 
+field of the XkbPtrDfltAction structure should always be XkbSA_SetPtrDflt.
+
+The 
+.I flags 
+field is composed of the bitwise inclusive OR of the values shown in Table 1 
+(currently there is only one value defined).
+
+.TS
+c s
+l l
+l lw(4i).
+Table 1 Pointer Default Flags
+_
+Flag   Meaning
+_
+XkbSA_DfltBtnAbsolute  T{
+If set, the value field represents an absolute pointer button. Otherwise, the 
+value field represents the amount to be added to the current default button.
+T}
+.TE
+
+The 
+.I affect 
+field specifies what changes as a result of this action. The only valid value 
+for the 
+.I affect 
+field is XkbSA_AffectDfltBtn.
+
+The 
+.I valueXXX 
+field is a signed character that represents the new button value for the
+.I mk_dflt_btn 
+attribute of the MouseKeys control. If XkbSA_DfltBtnAbsolute is set in 
+.I flags, valueXXX 
+specifies the button to be used; otherwise, 
+.I valueXXX 
+specifies the amount to be added to the current default button. In either case, 
+illegal button choices are wrapped back around into range. Xkb provides macros, 
+to convert between the integer and signed character values in XkbPtrDfltAction 
+structures.
+.SH STRUCTURES
+.LP
+.nf
+
+    typedef struct _XkbPtrDfltAction {
+        unsigned char    type;      /\(** XkbSA_SetPtrDflt */
+        unsigned char    flags;     /\(** controls the pointer button number */
+        unsigned char    affect;    /\(** XkbSA_AffectDfltBtn */
+        char             valueXXX;  /\(** new default button member */
+    } XkbPtrDfltAction;
+
+.fi
diff --git a/man/xkb/XkbSASetScreen.man b/man/xkb/XkbSASetScreen.man
new file mode 100644 (file)
index 0000000..601246d
--- /dev/null
@@ -0,0 +1,97 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbSASetScreen __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSASetScreen \- Sets the screenXXX field of act from s
+.SH SYNOPSIS
+.HP
+.B void XkbSASetScreen
+.BI "(\^XkbSwitchScreenAction " "act" "\^,"
+.BI "int " "s" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- act
+action in which to set screenXXX
+.TP
+.I \- s
+value to set in screenXXX
+.SH DESCRIPTION
+.LP
+Actions associated with the XkbSwitchScreen action structure change the active 
+screen on a multiscreen display.
+
+The 
+.I type 
+field of the XkbSwitchScreenAction structure should always be 
+XkbSA_SwitchScreen.
+
+The 
+.I flags 
+field is composed of the bitwise inclusive OR of the masks shown in Table 1.
+
+.TS
+c s
+l l
+l lw(4i).
+Table 1 Switch Screen Action Flags
+_
+Flag   Meaning
+_
+XkbSA_SwitchAbsolute   T{
+If set, the screenXXX field represents the index of the new screen. Otherwise, 
+it represents an offset from the current screen to the new screen.
+T}
+XkbSA_SwitchApplication        T{
+If not set, the action should switch to another screen on the same server. 
+Otherwise, it should switch to another X server or application that shares the 
+same physical display.
+T}
+.TE
+
+The 
+.I screenXXX 
+field is a signed character value that represents either the relative or 
+absolute screen index, depending on the state of the XkbSA_SwitchAbsolute bit in 
+the 
+.I flags 
+field. Xkb provides the following macros to convert between the integer and 
+signed character value for screen numbers in XkbSwitchScreenAction structures.
+.SH STRUCTURES
+.LP
+.nf
+
+    typedef struct _XkbSwitchScreenAction {
+        unsigned char    type;        /\(** XkbSA_SwitchScreen */
+        unsigned char    flags;       /\(** controls screen switching */
+        char             screenXXX;   /\(** screen number or delta */
+    } XkbSwitchScreenAction;
+
+.fi
+.SH NOTES
+.LP
+This action is optional. Servers are free to ignore the action or any of its 
+flags if they do not support the requested behavior. If the action is ignored, 
+it behaves like XkbSA_NoAction. Otherwise, key press and key release events do 
+not generate an event. 
diff --git a/man/xkb/XkbSelectEventDetails.man b/man/xkb/XkbSelectEventDetails.man
new file mode 100644 (file)
index 0000000..cd341f9
--- /dev/null
@@ -0,0 +1,145 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbSelectEventDetails __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSelectEventDetails \-  Selects or deselects for a specific Xkb event and 
+optionally places conditions on when events of that type are reported to your 
+client 
+.SH SYNOPSIS
+.HP
+.B Bool XkbSelectEventDetails
+.BI "(\^Display *" "display" "\^,"
+.BI "unsigned int " "device_spec" "\^,"
+.BI "unsigned int " "event_type" "\^,"
+.BI "unsigned long int " "bits_to_change" "\^,"
+.BI "unsigned long int " "values_for_bits" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I display
+connection to the X server 
+.TP
+.I device_spec
+device ID, or XkbUseCoreKbd
+.TP
+.I event_type
+Xkb event type of interest
+.TP
+.I bits_to_change
+determines events to be selected / deselected
+.TP
+.I values_for_bits
+1=>select, 0->deselect; for events in bits_to_change
+.SH DESCRIPTION
+.LP
+Xkb events are selected using an event mask, much the same as normal core X 
+events are selected. However, unlike selecting core X events, where you must 
+specify the selection status (on or off) for all possible event types whenever 
+you wish to change the selection criteria for any one event, Xkb allows you to 
+restrict the specification to only the event types you wish to change. This 
+means that you do not need to remember the event selection values for all 
+possible types each time you want to change one of them.
+
+Many Xkb event types are generated under several different circumstances. When 
+selecting to receive an Xkb event, you may specify either that you want it 
+delivered under all circumstances, or that you want it delivered only for a 
+subset of the possible circumstances.
+You can also deselect an event type that was previously selected for, using the 
+same granularity.
+
+Xkb provides two functions to select and deselect delivery of Xkb events. 
+.I XkbSelectEvents 
+allows you to select or deselect delivery of more than one Xkb event type at 
+once. Events selected using 
+.I XkbSelectEvents 
+are delivered to your program under all circumstances that generate the events. 
+To restrict delivery of an event to a subset of the conditions under which it 
+occurs, use 
+.I XkbSelectEventDetails. XkbSelectEventDetails 
+only allows you to change the selection conditions for a single event at a time, 
+but it provides a means of fine-tuning the conditions under which the event is 
+delivered.
+
+To select or deselect for a specific Xkb event and optionally place conditions 
+on when events of that type are reported to your client, use 
+.I XkbSelectEventDetails. 
+This allows you to exercise a finer granularity of 
+control over delivery of Xkb events with 
+.I XkbSelectEvents.
+
+While 
+.I XkbSelectEvents 
+allows multiple events to be selected, 
+.I XkbSelectEventDetails 
+changes the selection criteria for a single type of Xkb 
+event. The interpretation of the 
+.I bits_to_change 
+and 
+.I values_for_bits 
+masks depends on the event type in question.
+.I XkbSelectEventDetails 
+changes the Xkb event selection mask for the keyboard 
+specified by 
+.I device_spec 
+and the Xkb event specified by 
+.I event_type. 
+To turn on event selection for an event detail, set the bit for the 
+detail in the 
+.I bits_to_change 
+parameter and set the corresponding bit in the 
+.I values_for_bits 
+parameter. To turn off event detail selection for a detail, set 
+the bit for the detail in the 
+.I bits_to_change 
+parameter and do not set the corresponding bit in the 
+.I values_for_bits 
+parameter.
+
+If an invalid event type is specified, a BadValue protocol error results. If a 
+bit is not set in the 
+.I bits_to_change 
+parameter, but the corresponding bit is set in the
+.I values_for_bits 
+parameter, a BadMatch protocol error results. If an undefined 
+bit is set in either the 
+.I bits_to_change 
+or the 
+.I values_for_bits 
+parameter, a BadValue protocol error results.
+
+For each type of Xkb event, the legal event details that you can specify in the 
+.I XkbSelectEventDetails 
+request are listed in the chapters that describe each event in detail.
+.SH DIAGNOSTICS
+.TP 15
+.SM BadMatch
+A compatible version of Xkb was not available in the server or an argument has 
+correct type and range, but is otherwise invalid
+.TP 15
+.SM BadValue
+An argument is out of range
+.SH "SEE ALSO"
+.BR XkbSelectEvents (__libmansuffix__),
+.BR XkbUseCoreKbd (__libmansuffix__)
diff --git a/man/xkb/XkbSelectEvents.man b/man/xkb/XkbSelectEvents.man
new file mode 100644 (file)
index 0000000..27ff98b
--- /dev/null
@@ -0,0 +1,170 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbSelectEvents __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSelectEvents \-  Selects and / or deselects for delivery of one or more Xkb 
+events and has them delivered under all conditions 
+.SH SYNOPSIS
+.HP
+.B Bool XkbSelectEvents
+.BI "(\^Display *" "display" "\^,"
+.BI "unsigned int " "device_spec" "\^,"
+.BI "unsigned long int " "bits_to_change" "\^,"
+.BI "unsigned long int " "values_for_bits" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I display
+connection to the X server 
+.TP
+.I device_spec
+device ID, or XkbUseCoreKbd
+.TP
+.I bits_to_change
+determines events to be selected / deselected
+.TP
+.I values_for_bits
+1=>select, 0->deselect; for events in bits_to_change
+.SH DESCRIPTION
+.LP
+Xkb events are selected using an event mask, much the same as normal core X 
+events are selected. However, unlike selecting core X events, where you must 
+specify the selection status (on or off) for all possible event types whenever 
+you wish to change the selection criteria for any one event, Xkb allows you to 
+restrict the specification to only the event types you wish to change. This 
+means that you do not need to remember the event selection values for all 
+possible types each time you want to change one of them.
+
+Many Xkb event types are generated under several different circumstances. When 
+selecting to receive an Xkb event, you may specify either that you want it 
+delivered under all circumstances, or that you want it delivered only for a 
+subset of the possible circumstances. 
+
+You can also deselect an event type that was previously selected for, using the 
+same granularity.
+
+Xkb provides two functions to select and deselect delivery of Xkb events. 
+.I XkbSelectEvents 
+allows you to select or deselect delivery of more than one Xkb 
+event type at once. Events selected using 
+.I XkbSelectEvents 
+are delivered to your program under all circumstances that generate the events. 
+To restrict delivery of an event to a subset of the conditions under which it 
+occurs, use 
+.I XkbSelectEventDetails. XkbSelectEventDetails 
+only allows you to change the selection conditions for a single event at a time, 
+but it provides a means of fine-tuning the conditions under which the event is 
+delivered.
+
+This request changes the Xkb event selection mask for the keyboard specified by 
+.I device_spec.
+
+Each Xkb event that can be selected is represented by a bit in the
+.I bits_to_change 
+and 
+.I values_for_bits 
+masks. Only the event selection bits specified by the 
+.I bits_to_change 
+parameter are affected; any unspecified bits are left unchanged. To turn on 
+event selection for an event, set the bit for the event in the 
+.I bits_to_change 
+parameter and set the corresponding bit in the 
+.I values_for_bits 
+parameter. To turn off event selection for an event, set the bit for the event 
+in the 
+.I bits_to_change 
+parameter and do not set the corresponding bit in the 
+.I values_for_bits 
+parameter. The valid values for both of these parameters are an inclusive 
+bitwise OR of the masks shown in Table 1. There is no interface to return your 
+client's current event selection mask. Clients cannot set other clients' event 
+selection masks.
+
+The X server reports the events defined by Xkb to your client application only 
+if you have requested them via a call to 
+.I XkbSelectEvents 
+or 
+.I XkbSelectEventDetails. 
+Specify the event types in which you are interested in a mask.
+
+Table 1 lists the event mask constants that can be specified with the 
+.I XkbSelectEvents 
+request and the circumstances in which the mask should be specified.
+
+.TS
+c s s
+l l l
+l l l.
+Table 1 XkbSelectEvents Mask Constants
+_
+Event Mask     Value   Notification Wanted
+_
+XkbNewKeyboardNotifyMask       (1L<<0) Keyboard geometry change 
+XkbMapNotifyMask       (1L<<1) Keyboard mapping change 
+XkbStateNotifyMask     (1L<<2) Keyboard state change 
+XkbControlsNotifyMask  (1L<<3) Keyboard control change 
+XkbIndicatorStateNotifyMask    (1L<<4) Keyboard indicator state change 
+XkbIndicatorMapNotifyMask      (1L<<5) Keyboard indicator map change 
+XkbNamesNotifyMask     (1L<<6) Keyboard name change 
+XkbCompatMapNotifyMask (1L<<7) Keyboard compat map change 
+XkbBellNotifyMask      (1L<<8) Bell 
+XkbActionMessageMask   (1L<<9) Action message 
+XkbAccessXNotifyMask   (1L<<10)        AccessX features 
+XkbExtensionDeviceNotifyMask   (1L<<11)        Extension device 
+XkbAllEventsMask       (0xFFF) All Xkb events
+.TE
+If a bit is not set in the 
+.I bits_to_change 
+parameter, but the corresponding bit is set in the 
+.I values_for_bits 
+parameter, a BadMatch protocol error results. If an undefined bit is set in 
+either the 
+.I bits_to_change 
+or the 
+.I values_for_bits 
+parameter, a BadValue protocol error results.
+
+All event selection bits are initially zero for clients using the Xkb extension. 
+Once you set some bits, they remain set for your client until you clear them via 
+another call to 
+.I XkbSelectEvents. 
+
+.I XkbSelectEvents 
+returns False if the Xkb extension has not been initilialized and True 
+otherwise.
+.SH "RETURN VALUES"
+.TP 15
+True
+The 
+.I XkbSelectEvents 
+function returns True if the Xkb extension has been initilialized.
+.TP 15
+False
+The 
+.I XkbSelectEvents 
+function returns False if the Xkb extension has not been initilialized.
+.SH "SEE ALSO"
+.BR XkbSelectEventDetails (__libmansuffix__),
+.BR XkbUseCoreKbd (__libmansuffix__)
diff --git a/man/xkb/XkbSetAccessXTimeout.man b/man/xkb/XkbSetAccessXTimeout.man
new file mode 100644 (file)
index 0000000..0051469
--- /dev/null
@@ -0,0 +1,193 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbSetAccessXTimeout __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSetAccessXTimeout \- Configures the AccessXTimeout options for a keyboard 
+device
+.SH SYNOPSIS
+.HP
+.B Bool XkbSetAccessXTimeout
+.BI "(\^Display *" "display" "\^,"
+.BI "unsigned int " "device_spec" "\^,"
+.BI "unsigned short " "timeout" "\^,"
+.BI "unsigned int " "ctrls_mask" "\^,"
+.BI "unsigned int " "ctrls_values" "\^,"
+.BI "unsigned short " "opts_mask" "\^,"
+.BI "unsigned short " "opts_values" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- display
+connection to X server
+.TP
+.I \- device_spec
+device to configure, or XkbUseCoreKbd
+.TP
+.I \- timeout
+seconds idle until AccessXTimeout occurs
+.TP
+.I \- ctrls_mask
+boolean controls to modify 
+.TP
+.I \- ctrls_values
+new bits for controls selected by ctrls_mask
+.TP
+.I \- opts_mask
+ax_options to change
+.TP
+.I \- opts_values
+new bits for ax_options selected by opts_mask
+.SH DESCRIPTION
+.LP
+In environments where computers are shared, features such as SlowKeys present a 
+problem: if SlowKeys is on, the keyboard can appear to be unresponsive because 
+keys are not accepted until they are held for a certain period of time. To help 
+solve this problem, Xkb provides an AccessXTimeout control to automatically 
+change the enabled/disabled state of any boolean controls and to change the 
+value of the AccessXKeys and AccessXFeedback control attributes if the keyboard 
+is idle for a specified period of time.
+
+When a timeout as specified by AccessXTimeout occurs and a control is 
+consequently modified, Xkb generates an XkbControlsNotify event. For more 
+information on XkbControlsNotify events.
+
+.I timeout 
+specifies the number of seconds the keyboard must be idle before the controls 
+are modified. 
+.I ctrls_mask 
+specifies what controls are to be enabled or disabled, and 
+.I ctrls_values 
+specifies whether those controls are to be enabled or disabled. The bit values 
+correspond to those for enabling and disabling boolean controls using 
+.I XkbChangeEnabledControls.
+ The 
+.I opts_mask 
+field specifies which attributes of the AccessXKeys and AccessXFeedback controls 
+are to be changed, and 
+.I opts_values 
+specifies the new values for those options. The bit values correspond to those 
+for the 
+.I ax_options 
+field of an XkbDescRec.
+
+.I XkbSetAccessXTimeout 
+sends a request to configure the AccessXTimeout control to the server. It does 
+not wait for a reply, and normally returns True. If a compatible version of the 
+Xkb extension is not available in the server, 
+.I XkbSetAccessXTimeout 
+returns False.
+.SH "RETURN VALUES"
+.TP 15
+True
+The 
+.I XkbSetAccessXTimeout
+function returns True when a compatible version of the Xkb extension is available in the server.
+.TP 15
+False
+The 
+.I XkbSetAccessXTimeout
+function returns False when a compatible version of the Xkb extension is not available in the server.
+.SH STRUCTURES
+.LP
+The complete description of an Xkb keyboard is given by an XkbDescRec. The component 
+structures in the XkbDescRec represent the major Xkb components.
+
+.nf
+typedef struct {
+   struct _XDisplay * display;      /\(** connection to X server */
+   unsigned short     flags;        /\(** private to Xkb, do not modify */
+   unsigned short     device_spec;  /\(** device of interest */
+   KeyCode            min_key_code; /\(** minimum keycode for device */
+   KeyCode            max_key_code; /\(** maximum keycode for device */
+   XkbControlsPtr     ctrls;        /\(** controls */
+   XkbServerMapPtr    server;       /\(** server keymap */
+   XkbClientMapPtr    map;          /\(** client keymap */
+   XkbIndicatorPtr    indicators;   /\(** indicator map */
+   XkbNamesPtr        names;        /\(** names for all components */
+   XkbCompatMapPtr    compat;       /\(** compatibility map */
+   XkbGeometryPtr     geom;         /\(** physical geometry of keyboard */
+} XkbDescRec, *XkbDescPtr;
+
+.fi
+The 
+.I display 
+field points to an X display structure. The 
+.I flags field is private to the library: modifying 
+.I flags 
+may yield unpredictable results. The 
+.I device_spec 
+field specifies the device identifier of the keyboard input device, or 
+XkbUseCoreKeyboard, which specifies the core keyboard device. The 
+.I min_key_code
+and 
+.I max_key_code 
+fields specify the least and greatest keycode that can be returned by the keyboard. 
+
+Each structure component has a corresponding mask bit that is used in function calls to 
+indicate that the structure should be manipulated in some manner, such as allocating it 
+or freeing it. These masks and their relationships to the fields in the XkbDescRec are 
+shown in Table 1.
+
+.TS
+c s s
+l l l
+l l l.
+Table 1 Mask Bits for XkbDescRec
+_
+Mask Bit       XkbDescRec Field        Value
+_
+XkbControlsMask        ctrls   (1L<<0)
+XkbServerMapMask       server  (1L<<1)
+XkbIClientMapMask      map     (1L<<2)
+XkbIndicatorMapMask    indicators      (1L<<3)
+XkbNamesMask   names   (1L<<4)
+XkbCompatMapMask       compat  (1L<<5)
+XkbGeometryMask        geom    (1L<<6)
+XkbAllComponentsMask   All Fields      (0x7f)
+.TE
+
+The structure for the XkbControlsNotify event is defined as follows:
+.nf
+
+    typedef struct {
+        int           type;          /\(** Xkb extension base event code */
+        unsigned long serial;        /\(** X server serial number for event */
+        Bool          send_event;    /\(** True => synthetically generated */
+        Display *     display;       /\(** server connection where event generated */
+        Time          time;          /\(** server time when event generated */
+        int           xkb_type;      /\(** XkbCompatMapNotify */
+        int           device;        /\(** Xkb device ID, will not be XkbUseCoreKbd */
+        unsigned int  changed_ctrls; /\(** bits indicating which controls data have changed*/
+        unsigned int  enabled_ctrls; /\(** controls currently enabled in server */
+        unsigned int  enabled_ctrl_changes; /\(** bits indicating enabled/disabled controls */
+        int           num_groups;    /\(** current number of keyboard groups */
+        KeyCode       keycode;       /\(** != 0 => keycode of key causing change */
+        char          event_type;    /\(** Type of event causing change */
+        char          req_major;     /\(** major event code of event causing change */
+        char          req_minor;     /\(** minor event code of event causing change */
+    } XkbControlsNotifyEvent;
+    
+.fi    
+.SH "SEE ALSO"
+.BR XkbChangeEnabledControls (__libmansuffix__)
diff --git a/man/xkb/XkbSetAutoRepeatRate.man b/man/xkb/XkbSetAutoRepeatRate.man
new file mode 100644 (file)
index 0000000..3deec37
--- /dev/null
@@ -0,0 +1,98 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbSetAutoRepeatRate __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSetAutoRepeatRate \- Sets the attributes of the RepeatKeys control for a 
+keyboard device
+.SH SYNOPSIS
+.HP
+.B Bool XkbSetAutoRepeatRate
+.BI "(\^Display *" "display" "\^,"
+.BI "unsigned int " "device_spec" "\^,"
+.BI "unsigned int " "timeout" "\^,"
+.BI "unsigned int " "interval" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- display
+connection to X server
+.TP
+.I \- device_spec
+device to configure, or XkbUseCoreKbd
+.TP
+.I \- timeout
+initial delay, ms
+.TP
+.I \- interval
+delay between repeats, ms
+.SH DESCRIPTION
+.LP
+The core protocol allows only control over whether or not the entire keyboard or 
+individual keys should auto-repeat when held down. RepeatKeys is a boolean 
+control that extends this capability by adding control over the delay until a 
+key begins to repeat and the rate at which it repeats. RepeatKeys is coupled 
+with the core auto-repeat control: when RepeatKeys is enabled or disabled, the 
+core auto-repeat is enabled or disabled and vice versa.
+
+Auto-repeating keys are controlled by two attributes. The first, 
+.I timeout, 
+is the delay after the initial press of an auto-repeating key and the first 
+generated repeat event. The second, 
+.I interval, 
+is the delay between all subsequent generated repeat events. As with all boolean 
+controls, configuring the attributes that determine how the control operates 
+does not automatically enable the control as a whole.
+
+.I XkbSetAutoRepeatRate 
+sends a request to the X server to configure the AutoRepeat control attributes 
+to the values specified in 
+.I timeout 
+and 
+.I interval.
+.I XkbSetAutoRepeatRate 
+does not wait for a reply; it normally returns True. Specifying a zero value for 
+either 
+.I timeout 
+or 
+.I interval 
+causes the server to generate a BadValue protocol error. If a compatible version 
+of the Xkb extension is not available in the server, 
+.I XkbSetAutoRepeatRate 
+returns False.
+.SH "RETURN VALUES"
+.TP 15
+True
+The 
+.I XkbSetAutoRepeatRate 
+function returns True normally.
+.TP 15
+False
+The 
+.I XkbSetAutoRepeatRate 
+function returns False if a compatible version of the Xkb extension is not 
+available in the server.
+.SH DIAGNOSTICS
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbSetAutoResetControls.man b/man/xkb/XkbSetAutoResetControls.man
new file mode 100644 (file)
index 0000000..ecaf891
--- /dev/null
@@ -0,0 +1,100 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbSetAutoResetControls __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSetAutoResetControls \- Changes the current values of the AutoReset control 
+attributes
+.SH SYNOPSIS
+.HP
+.B Bool XkbSetAutoResetControls
+.BI "(\^Display *" "dpy" "\^,"
+.BI "unsigned int " "changes" "\^,"
+.BI "unsigned int *" "auto_ctrls" "\^,"
+.BI "unsigned int *" "auto_values" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to X server
+.TP
+.I \- changes
+controls for which to change auto-reset values
+.TP
+.I \- auto_ctrls
+controls from changes that should auto reset 
+.TP
+.I \- auto_values
+1 bit => auto-reset on
+.SH DESCRIPTION
+.LP
+.I XkbSetAutoResetControls 
+changes the auto-reset status and associated auto-reset values for the controls 
+selected by 
+.I changes. 
+For any control selected by 
+.I changes, 
+if the corresponding bit is set in 
+.I auto_ctrls, 
+the control is configured to auto-reset when the client exits. If the 
+corresponding bit in 
+.I auto_values 
+is on, the control is turned on when the client exits; if zero, the control is 
+turned off when the client exits. For any control selected by 
+.I changes, 
+if the corresponding bit is not set in 
+.I auto_ctrls, 
+the control is configured to not reset when the client exits. 
+
+For example:
+
+.nf
+To leave the auto-reset controls for StickyKeys the way they are:
+
+       ok = XkbSetAutoResetControls(dpy, 0, 0, 0);
+       
+To change the auto-reset controls so that StickyKeys are unaffected when the 
+client exits:
+
+       ok = XkbSetAutoResetControls(dpy, XkbStickyKeysMask, 0, 0);
+       
+To change the auto-reset controls so that StickyKeys are turned off when the 
+client exits:
+
+       ok = XkbSetAutoResetControls(dpy, XkbStickyKeysMask, XkbStickyKeysMask, 0);
+       
+To change the auto-reset controls so that StickyKeys are turned on when the 
+client exits:
+
+       ok = XkbSetAutoResetControls(dpy, XkbStickyKeysMask, XkbStickyKeysMask, 
+XkbStickyKeysMask);
+
+.fi
+.I XkbSetAutoResetControls 
+backfills 
+.I auto_ctrls 
+and 
+.I auto_values 
+with the auto-reset controls for this particular client. Note that all of the 
+bits are valid in the returned values, not just the ones selected in the 
+.I changes 
+mask.
diff --git a/man/xkb/XkbSetBounceKeysDelay.man b/man/xkb/XkbSetBounceKeysDelay.man
new file mode 100644 (file)
index 0000000..9637f0e
--- /dev/null
@@ -0,0 +1,207 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbSetBounceKeysDelay __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSetBounceKeysDelay \- Sets the BounceKeys delay for a keyboard device
+.SH SYNOPSIS
+.HP
+.B Bool XkbSetBounceKeysDelay
+.BI "(\^Display *" "display" "\^,"
+.BI "unsigned int " "device_spec" "\^,"
+.BI "unsigned int *" "delay" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- display
+connection to X server
+.TP
+.I \- device_spec
+device ID, or XkbUseCoreKbd
+.TP
+.I \- delay
+backfilled with bounce keys delay, ms
+.SH DESCRIPTION
+.LP
+The server can generate XkbAccessXNotify events for some of the global keyboard 
+controls. 
+The detail field describes what AccessX event just occurred and can be any of 
+the values in 
+Table 1.
+
+.TS
+c s
+l l
+l lw(4i).
+Table 1 AccessXNotify Events
+_
+detail Reason
+_
+XkbAXN_SKPress T{
+A key was pressed when SlowKeys was enabled.
+T}
+XkbAXN_SKAccept        T{
+A key was accepted (held longer than the SlowKeys delay).
+T}
+XkbAXN_SKRelease       T{
+An accepted SlowKeys key was released.
+T}
+XkbAXN_SKReject        T{
+A key was rejected (released before the SlowKeys delay expired).
+T}
+XkbAXN_BKAccept        T{
+A key was accepted by BounceKeys.
+T}
+XkbAXN_BKReject        T{
+A key was rejected (pressed before the BounceKeys delay expired).
+T}
+XkbAXN_AXKWarning      T{
+AccessXKeys is about to turn on/off StickyKeys or BounceKeys.
+T}
+.TE
+
+The 
+.I keycode 
+field reports the keycode of the key for which the event occurred. If the action 
+is related to
+.I SlowKeys, 
+the 
+.I slowKeysDelay 
+field contains the current SlowKeys acceptance delay. If the action is related 
+to BounceKeys, 
+the 
+.I debounceDelay 
+field contains the current BounceKeys debounce delay.
+
+Selecting for AccessX Events
+
+To receive XkbAccessXNotify events under all possible conditions, use 
+.I XkbSelectEvents
+and pass XkbAccesXNotifyMask in both 
+.I bits_to_change 
+and 
+.I values_for_bits.
+
+To receive XkbStateNotify events only under certain conditions, use 
+.I XkbSelectEventDetails 
+using XkbAccessXNotify as the 
+.I event_type 
+and specifying the desired state changes in 
+.I bits_to_change 
+and 
+.I values_for_bits 
+using mask bits from Table 2.
+
+.TS
+c s s
+l l l
+l l lw(3i).
+Table 2 AccessXNotify Event Details
+_
+XkbAccessXNotify Event Details Value   Circumstances
+_
+XkbAXN_SKPressMask     (1<<0)  T{
+Slow key press notification wanted
+T}
+XkbAXN_SKAcceptMask    (1<<1)  T{
+Slow key accept notification wanted
+T}
+XkbAXN_SKRejectMask    (1<<2)  T{
+Slow key reject notification wanted
+T}
+XkbAXN_SKReleaseMask   (1<<3)  T{
+Slow key release notification wanted
+T}
+XkbAXN_BKAcceptMask    (1<<4)  T{
+Bounce key accept notification wanted
+T}
+XkbAXN_BKRejectMask    (1<<5)  T{
+Bounce key reject notification wanted
+T}
+XkbAXN_AXKWarningMask  (1<<6)  T{
+AccessX warning notification wanted
+T}
+XkbAllAccessXEventsMask        (0x7f)  T{
+All AccessX features notifications wanted
+T}
+.TE
+
+Some users may accidentally "bounce" on a key when they release it. They press 
+it once, then accidentally press it again after they release it. The BounceKeys 
+control temporarily disables a key after it has been pressed, effectively 
+"debouncing" the keyboard. The period of time the key is disabled after it is 
+released is known as the 
+.I BounceKeys delay. 
+BounceKeys is a boolean control.
+
+When the BounceKeys control is active, the server reports acceptance or 
+rejection of any key to interested clients by sending an appropriate 
+AccessXNotify event.
+
+.I XkbSetBounceKeysDelay
+sends a request to configure the BounceKeys control to the server. It does not 
+wait for a reply and normally returns True. Specifying a value of zero for the 
+delay parameter causes 
+.I XkbSetBounceKeysDelay 
+to generate a BadValue protocol error. If a compatible version of the Xkb 
+extension is not available in the server, 
+.I XkbSetBounceKeysDelay 
+returns False.
+.SH "RETURN VALUES"
+.TP 15
+True
+The 
+.I XkbSetBounceKeysDelay
+function returns True when it sends a request to configure the BounceKeys 
+control to the server.
+.TP 15
+False
+The 
+.I XkbSetBounceKeysDelay
+function returns False if a compatible version of the Xkb extension is not 
+available in the server.
+.SH STRUCTURES
+.LP
+The structure for the XkbAccessXNotify event type is as follows:
+
+.nf
+typedef struct {
+    int            type;           /\(** Xkb extension base event code */
+    unsigned long  serial;         /\(** X server serial number for event */
+    Bool           send_event;     /\(** True => synthetically generated */
+    Display *      display;        /\(** server connection where event generated */
+    Time           time;           /\(** server time when event generated */
+    int            xkb_type;       /\(** XkbAccessXNotify */
+    int            device;         /\(** Xkb device ID, will not be XkbUseCoreKbd 
+*/
+    int            detail;         /\(** XkbAXN_* */
+    KeyCode        keycode;        /\(** key of event */
+    int            slowKeysDelay;  /\(** current SlowKeys delay */
+    int            debounceDelay;  /\(** current debounce delay */
+} XkbAccessXNotifyEvent;
+    
+.fi    
+.SH DIAGNOSTICS
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbSetCompatMap.man b/man/xkb/XkbSetCompatMap.man
new file mode 100644 (file)
index 0000000..49d77a8
--- /dev/null
@@ -0,0 +1,203 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbSetCompatMap __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSetCompatMap \- Modify the server's compatibility map
+.SH SYNOPSIS
+.HP
+.B Bool XkbSetCompatMap
+.BI "(\^Display *" "display" "\^,"
+.BI "unsigned int " "which" "\^,"
+.BI "XkbDescPtr " "xkb" "\^,"
+.BI "Bool " "update_actions" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- display
+connection to server
+.TP
+.I \- which
+mask of compat map components to set
+.TP
+.I \- xkb
+source for compat map components
+.TP
+.I \- update_actions
+True => apply to server's keyboard map 
+.SH DESCRIPTION
+.LP
+To modify the server's compatibility map, first modify a local copy of the Xkb 
+compatibility map, then call 
+.I XkbSetCompatMap. 
+You may allocate a new compatibility map for this purpose using
+.I XkbAllocCompatMap. 
+You may also use a compatibility map from another server, although you need to 
+adjust the 
+.I device_spec 
+field in the XkbDescRec accordingly. Note that symbol interpretations in a 
+compatibility map (
+.I sym_interpret, 
+the vector of XkbSymInterpretRec structures) are also allocated using this same 
+function.
+
+.I XkbSetCompatMap 
+copies compatibility map information from the keyboard description in 
+.I xkb 
+to the server specified in 
+.I display
+'s compatibility map for the device specified by the 
+.I device_spec 
+field of 
+.I xkb. 
+Unless you have specifically modified this field, it is the default keyboard 
+device. 
+.I which 
+specifies the compatibility map components to be set, and is an inclusive OR of 
+the bits shown in Table 1.
+
+.TS
+c s s
+l l l
+l l lw(3i).
+Table 1 Compatibility Map Component Masks
+_
+Mask   Value   Affecting
+_
+XkbSymInterpMask       (1<<0)  Symbol interpretations
+XkbGroupCompatMask     (1<<1)  Group maps
+XkbAllCompatMask       (0x3)   All compatibility map components
+.TE
+
+After updating its compatibility map for the specified device, if 
+.I update_actions 
+is True, the server applies the new compatibility map to its entire keyboard for 
+the device to generate a new set of key semantics, compatibility state, and a 
+new core keyboard map. If 
+.I update_actions 
+is False, the new compatibility map is not used to generate any modifications to 
+the current device semantics, state, or core keyboard map. One reason for not 
+applying the compatibility map immediately would be if one server was being 
+configured to match another on a piecemeal basis; the map should not be applied 
+until everything is updated. To force an update at a later time, use
+.I XkbSetCompatMap 
+specifying 
+.I which 
+as zero and 
+.I update_actions 
+as True. 
+
+.I XkbSetCompatMap 
+returns True if successful and False if unsuccessful. The server may report 
+problems it encounters when processing the request subsequently via protocol 
+errors.
+.SH "RETURN VALUES"
+.TP 15
+True
+The 
+.I XkbSetCompatMap 
+function returns True if successful.
+.TP 15
+False
+The 
+.I XkbSetCompatMap 
+function returns False if unsuccessful.
+.SH STRUCTURES
+.LP
+The complete description of an Xkb keyboard is given by an XkbDescRec. The 
+component 
+structures in the XkbDescRec represent the major Xkb components.
+
+.nf
+typedef struct {
+   struct _XDisplay * display;      /\(** connection to X server */
+   unsigned short     flags;        /\(** private to Xkb, do not modify */
+   unsigned short     device_spec;  /\(** device of interest */
+   KeyCode            min_key_code; /\(** minimum keycode for device */
+   KeyCode            max_key_code; /\(** maximum keycode for device */
+   XkbControlsPtr     ctrls;        /\(** controls */
+   XkbServerMapPtr    server;       /\(** server keymap */
+   XkbClientMapPtr    map;          /\(** client keymap */
+   XkbIndicatorPtr    indicators;   /\(** indicator map */
+   XkbNamesPtr        names;        /\(** names for all components */
+   XkbCompatMapPtr    compat;       /\(** compatibility map */
+   XkbGeometryPtr     geom;         /\(** physical geometry of keyboard */
+} XkbDescRec, *XkbDescPtr;
+
+.fi
+The 
+.I display 
+field points to an X display structure. The 
+.I flags field is private to the library: modifying 
+.I flags 
+may yield unpredictable results. The 
+.I device_spec 
+field specifies the device identifier of the keyboard input device, or 
+XkbUseCoreKeyboard, which specifies the core keyboard device. The 
+.I min_key_code
+and 
+.I max_key_code 
+fields specify the least and greatest keycode that can be returned by the 
+keyboard. 
+
+Each structure component has a corresponding mask bit that is used in function 
+calls to 
+indicate that the structure should be manipulated in some manner, such as 
+allocating it 
+or freeing it. These masks and their relationships to the fields in the 
+XkbDescRec are 
+shown in Table 2.
+
+.TS
+c s s
+l l l
+l l l.
+Table 2 Mask Bits for XkbDescRec
+_
+Mask Bit       XkbDescRec Field        Value
+_
+XkbControlsMask        ctrls   (1L<<0)
+XkbServerMapMask       server  (1L<<1)
+XkbIClientMapMask      map     (1L<<2)
+XkbIndicatorMapMask    indicators      (1L<<3)
+XkbNamesMask   names   (1L<<4)
+XkbCompatMapMask       compat  (1L<<5)
+XkbGeometryMask        geom    (1L<<6)
+XkbAllComponentsMask   All Fields      (0x7f)
+.TE
+
+The XkbSymInterpretRec structure specifies a symbol interpretation:
+.nf
+    typedef struct {
+        KeySym        sym;         /\(** keysym of interest or NULL */
+        unsigned char flags;       /\(** XkbSI_AutoRepeat, XkbSI_LockingKey */
+        unsigned char match;       /\(** specifies how mods is interpreted */
+        unsigned char mods;        /\(** modifier bits, correspond to eight real modifiers */
+        unsigned char virtual_mod; /\(** 1 modifier to add to key virtual mod map */
+        XkbAnyAction  act;         /\(** action to bind to symbol position on key */
+    } XkbSymInterpretRec,*XkbSymInterpretPtr;
+    
+.fi    
+.SH "SEE ALSO"
+.BR XkbAllocCompatMap (__libmansuffix__)
diff --git a/man/xkb/XkbSetControls.man b/man/xkb/XkbSetControls.man
new file mode 100644 (file)
index 0000000..8993ad0
--- /dev/null
@@ -0,0 +1,167 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbSetControls __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSetControls \- Copies changes to the X server based on a modified ctrls 
+structure in a local copy of the keyboard description
+.SH SYNOPSIS
+.HP
+.B Bool XkbSetControls
+.BI "(\^Display *" "display" "\^,"
+.BI "unsigned long " "which" "\^,"
+.BI "XkbDescPtr " "xkb" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- display
+connection to X server
+.TP
+.I \- which
+mask of controls requested
+.TP
+.I \- xkb
+keyboard description for controls information
+.SH DESCRIPTION
+.LP
+For each bit that is set in the 
+.I which 
+parameter, 
+.I XkbSetControls 
+sends the corresponding values from the 
+.I xkb->ctrls 
+field to the server. Valid values for 
+.I which 
+are any combination of the masks listed in Table 1 that have "ok" in the
+.I which 
+column.
+
+Table 1 shows the actual values for the individual mask bits used to select 
+controls for 
+modification and to enable and disable the control. Note that the same mask bit 
+is used to 
+specify general modifications to the parameters used to configure the control 
+(which), and to 
+enable and disable the control (enabled_ctrls). The anomalies in the table (no 
+"ok" in column) 
+are for controls that have no configurable attributes; and for controls that are 
+not boolean 
+controls and therefore cannot be enabled or disabled.
+
+.TS
+c s s s
+l l l l
+l l l l
+l l l l. 
+Table 1 Controls Mask Bits
+_
+Mask Bit       which or        enabled Value
+       changed_ctrls   _ctrls
+_
+XkbRepeatKeysMask      ok      ok      (1L<<0)
+XkbSlowKeysMask        ok      ok      (1L<<1)
+XkbBounceKeysMask      ok      ok      (1L<<2)
+XkbStickyKeysMask      ok      ok      (1L<<3)
+XkbMouseKeysMask       ok      ok      (1L<<4)
+XkbMouseKeysAccelMask  ok      ok      (1L<<5)
+XkbAccessXKeysMask     ok      ok      (1L<<6)
+XkbAccessXTimeoutMask  ok      ok      (1L<<7)
+XkbAccessXFeedbackMask ok      ok      (1L<<8)
+XkbAudibleBellMask             ok      (1L<<9)
+XkbOverlay1Mask                ok      (1L<<10)
+XkbOverlay2Mask                ok      (1L<<11)
+XkbIgnoreGroupLockMask         ok      (1L<<12)
+XkbGroupsWrapMask      ok              (1L<<27)
+XkbInternalModsMask    ok              (1L<<28)
+XkbIgnoreLockModsMask  ok              (1L<<29)
+XkbPerKeyRepeatMask    ok              (1L<<30)
+XkbControlsEnabledMask ok              (1L<<31)
+XkbAccessXOptionsMask  ok      ok      (XkbStickyKeysMask | 
+                       XkbAccessXFeedbackMask)
+XkbAllBooleanCtrlsMask         ok      (0x00001FFF) 
+XkbAllControlsMask     ok              (0xF8001FFF)
+.TE
+
+If 
+.I xkb->ctrls 
+is NULL, the server does not support a compatible version of Xkb, or the Xkb 
+extension has not been properly initialized, 
+.I XkbSetControls 
+returns False. Otherwise, it sends the request to the X server and returns True.
+
+Note that changes to attributes of controls in the XkbControlsRec structure are 
+apparent only when the associated control is enabled, although the corresponding 
+values are still updated in the X server. For example, the 
+.I repeat_delay 
+and 
+.I repeat_interval 
+fields are ignored unless the RepeatKeys control is enabled (that is, the X 
+server's equivalent of 
+.I xkb->ctrls 
+has XkbRepeatKeyMask set in 
+.I enabled_ctrls). 
+It is permissible to modify the attributes of a control in one call to
+.I XkbSetControls 
+and enable the control in a subsequent call. See 
+.I XkbChangeEnabledControls 
+for more information on enabling and disabling controls.
+
+Note that the 
+.I enabled_ctrls 
+field is itself a control - the EnabledControls control. As such, to set a 
+specific configuration of enabled and disabled boolean controls, you must set
+.I enabled_ctrls 
+to the appropriate bits to enable only the controls you want and disable all 
+others, then specify the XkbControlsEnabledMask in a call to 
+.I XkbSetControls. 
+
+Because this is somewhat awkward if all you want to do is enable and disable 
+controls, and not modify any of their attributes, a convenience function is also 
+provided for this purpose, 
+.I XkbChangeEnabledControls.
+.SH "RETURN VALUES"
+.TP 15
+True
+The 
+.I XkbSetControls 
+function returns True when it sends the request to the X server.
+.TP 15
+False
+The 
+.I XkbSetControls 
+function returns False when 
+.I xkb->ctrls 
+is NULL, the server does not support a compatible version of Xkb, or the Xkb 
+extension has not been properly initialized.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadMatch
+A compatible version of Xkb was not available in the server or an argument has 
+correct type and range, but is otherwise invalid
+.SH "SEE ALSO"
+.BR XkbChangeEnabledControls (__libmansuffix__),
+.BR XkbFreeControls (__libmansuffix__)
+
diff --git a/man/xkb/XkbSetDebuggingFlags.man b/man/xkb/XkbSetDebuggingFlags.man
new file mode 100644 (file)
index 0000000..358ccf8
--- /dev/null
@@ -0,0 +1,169 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbSetDebuggingFlags __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSetDebuggingFlags \- Change the values of any of the debug controls
+.SH SYNOPSIS
+.HP
+.B Bool XkbSetDebuggingFlags
+.BI "(\^Display *" "display" "\^,"
+.BI "unsigned int " "mask" "\^,"
+.BI "unsigned int " "flags" "\^,"
+.BI "char *" "msg" "\^,"
+.BI "unsigned int " "ctrls_mask" "\^,"
+.BI "unsigned int " "ctrls" "\^,"
+.BI "unsigned int *" "ret_flags" "\^,"
+.BI "unsigned int *" "ret_ctrls" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- display
+connection to X server
+.TP
+.I \- mask
+mask selecting debug output flags to change
+.TP
+.I \- flags
+values for debug output flags selected by mask
+.TP
+.I \- msg
+message to print right now
+.TP
+.I \- ctrls_mask
+mask selecting debug controls to change 
+.TP
+.I \- ctrls
+values for debug controls selected by ctrls_mask
+.TP
+.I \- ret_flags
+resulting state of all debug output flags
+.TP
+.I \- ret_ctrls
+resulting state of all debug controls
+.SH DESCRIPTION
+.LP
+The debugging aids are intended for use primarily by Xkb implementors and are 
+optional in any implementation.
+
+There are two bitmasks that may be used to control debugging. One bitmask 
+controls the output of debugging information, and the other controls behavior. 
+Both bitmasks are initially all zeros.
+
+To change the values of any of the debug controls, use 
+.I XkbSetDebuggingFlags.
+
+.I XkbSetDebuggingFlags 
+modifies the debug output flags as specified by 
+.I mask 
+and 
+flags, 
+modifies the debug controls flags as specified by 
+.I ctrls_mask 
+and 
+ctrls, 
+prints the message 
+.I msg, 
+and backfills 
+.I ret_flags 
+and 
+.I ret_ctrls 
+with the resulting debug output and debug controls flags. 
+
+When bits are set in the debug output masks, 
+.I mask 
+and 
+.I flags, 
+Xkb prints debug information corresponding to each bit at appropriate points 
+during its processing. The device to which the output is written is 
+implementation-dependent, but is normally the same device to which X server 
+error messages are directed; thus the bits that can be set in 
+.I mask 
+and 
+.I flags 
+is implementation-specific. To turn on a debug output selection, set the bit for 
+the output in the 
+.I mask 
+parameter and set the corresponding bit in the 
+.I flags 
+parameter. To turn off event selection for an event, set the bit for the output 
+in the 
+.I mask 
+parameter and do not set the corresponding bit in the 
+.I flags 
+parameter.
+
+When bits are set in the debug controls masks, 
+.I ctrls_mask 
+and 
+.I ctrls, 
+Xkb modifies its behavior according to each controls bit. 
+.I ctrls_mask 
+and 
+ctrls 
+are related in the same way that 
+.I mask 
+and 
+.I flags 
+are. The valid controls bits are defined in Table 1.
+
+.TS
+c s s
+l l l.
+Table 1 Debug Control Masks
+_
+Debug Control Mask     Value   Meaning
+_
+XkbDF_DisableLocks     (1 << 0)        Disable actions that lock modifiers
+.TE
+
+.I XkbSetDebuggingFlags 
+returns True if successful and False otherwise. The only protocol error it may 
+generate is BadAlloc, if for some reason it is unable to allocate storage. 
+
+.I XkbSetDebuggingFlags 
+is intended for developer use and may be disabled in production X servers. If it 
+is disabled, 
+.I XkbSetDebuggingFlags 
+has no effect and does not generate any protocol errors.
+
+The message in 
+.I msg 
+is written immediately. The device to which it is written is implementation 
+dependent but is normally the same device where X server error messages are 
+directed. 
+.SH "RETURN VALUES"
+.TP 15
+True
+The 
+.I XkbSetDebuggingFlags 
+function returns True when successful.
+.TP 15
+False
+The 
+.I XkbSetDebuggingFlags 
+function returns False when not successful.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
diff --git a/man/xkb/XkbSetDetectableAutoRepeat.man b/man/xkb/XkbSetDetectableAutoRepeat.man
new file mode 100644 (file)
index 0000000..30d6d41
--- /dev/null
@@ -0,0 +1,105 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbSetDetectableAutoRepeat __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSetDetectableAutoRepeat \- Sets DetectableAutoRepeat
+.SH SYNTAX
+.HP
+.B Bool XkbSetDetectableAutoRepeat
+.BI "(\^Display *" "display" "\^,"
+.BI "Bool " "detectable" "\^,"
+.BI "Bool *" "supported_rtrn" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- display
+connection to X server
+.TP
+.I \- detectable
+True => set DetectableAutoRepeat
+.TP
+.I \- supported_rtrn
+backfilled True if DetectableAutoRepeat supported
+.SH DESCRIPTION
+.LP
+Auto-repeat is the generation of multiple key events by a keyboard when the user
+presses a key and holds it down. Keyboard hardware and device-dependent X server
+software often implement auto-repeat by generating multiple KeyPress events with
+no intervening KeyRelease event. The standard behavior of the X server is to
+generate a KeyRelease event for every KeyPress event. If the keyboard hardware
+and device-dependent software of the X server implement auto-repeat by
+generating multiple KeyPress events, the device-independent part of the X server
+by default synthetically generates a KeyRelease event after each KeyPress event.
+This provides predictable behavior for X clients, but does not allow those
+clients to detect the fact that a key is auto-repeating.
+
+Xkb allows clients to request
+.I detectable auto-repeat.
+If a client requests and the server supports DetectableAutoRepeat, Xkb generates
+KeyRelease events only when the key is physically released. If
+DetectableAutoRepeat is not supported or has not been requested, the server
+synthesizes a KeyRelease event for each repeating KeyPress event it generates.
+
+DetectableAutoRepeat, unlike other controls, is not contained in the
+XkbControlsRec structure, nor can it be enabled or disabled via the
+EnabledControls control. Instead, query and set DetectableAutoRepeat using
+.I XkbGetDetectableAutoRepeat
+and
+.I XkbSetDetectableAutoRepeat.
+
+DetectableAutoRepeat is a condition that applies to all keyboard devices for a
+client's connection to a given X server; it cannot be selectively set for some
+devices and not for others. For this reason, none of the Xkb library functions
+involving DetectableAutoRepeat involve a device specifier.
+
+This request affects all keyboard activity for the requesting client only; other
+clients still see the expected nondetectable auto-repeat behavior, unless they
+have requested otherwise.
+
+.I XkbSetDetectableAutoRepeat
+sends a request to the server to set DetectableAutoRepeat on for the current
+client if
+.I detectable
+is True, and off if
+.I detectable
+is False; it then waits for a reply. If
+.I supported_rtrn
+is not NULL,
+.I XkbSetDetectableAutoRepeat
+backfills
+.I supported_rtrn
+with True if the server supports DetectableAutoRepeat, and False if it does not.
+.I XkbSetDetectableAutoRepeat
+returns the current state of DetectableAutoRepeat for the requesting client:
+True if DetectableAutoRepeat is set, and False otherwise.
+.SH "RETURN VALUES"
+.TP 15
+True
+The
+.I XkbSetDetectableAutoRepeat
+function returns True if DetectableAutoRepeat is set.
+.TP 15
+False
+The
+.I XkbSetDetectableAutoRepeat
+function returns False if DetectableAutoRepeat is not set.
diff --git a/man/xkb/XkbSetDeviceButtonActions.man b/man/xkb/XkbSetDeviceButtonActions.man
new file mode 100644 (file)
index 0000000..e61d403
--- /dev/null
@@ -0,0 +1,90 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbSetDeviceButtonActions __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSetDeviceButtonActions \- Change only the button actions for an input extension device
+.SH SYNTAX
+.HP
+.B Bool XkbSetDeviceButtonActions
+.BI "(\^Display *" "dpy" "\^,"
+.BI "XkbDeviceInfoPtr " "device" "\^,"
+.BI "unsigned int " "first_button" "\^,"
+.BI "unsigned int " "num_buttons" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to X server
+.TP
+.I \- device
+structure defining the device and modifications
+.TP
+.I \- first_button
+number of first button to update, 0 relative
+.TP
+.I \- num_buttons
+number of buttons to update
+.SH DESCRIPTION
+.LP
+.I XkbSetDeviceButtonActions 
+assigns actions to the buttons of the device specified in 
+.I device_info->device_spec. 
+Actions are assigned to 
+.I num_buttons 
+buttons beginning with 
+.I first_button 
+and are taken from the actions specified in 
+.I device_info->btn_acts.
+
+If the server does not support assignment of Xkb actions to extension device buttons,
+.I XkbSetDeviceButtonActions 
+has no effect and returns False. If the device has no buttons or if 
+.I first_button 
+or 
+.I num_buttons 
+specify buttons outside of the valid range as determined by 
+.I device_info->num_btns, 
+the function has no effect and returns False. Otherwise, 
+.I XkbSetDeviceButtonActions 
+sends a request to the server to change the actions for the specified buttons and returns 
+True.
+
+If the actual request sent to the server involved illegal button numbers, a BadValue protocol 
+error is generated. If an invalid device identifier is specified in 
+.I device_info->device_spec, 
+a BadKeyboard protocol error results. If the actual device specified in
+.I device_info->device_spec 
+does not contain buttons and a request affecting buttons is made, a BadMatch protocol error is 
+generated.
+.SH DIAGNOSTICS
+.TP 15
+.B BadKeyboard
+The device specified was not a valid core or input extension device
+.TP 15
+.B BadMatch
+A compatible version of Xkb was not available in the server or an argument has correct type 
+and range, but is otherwise invalid
+.TP 15
+.B BadValue
+An argument is out of range
diff --git a/man/xkb/XkbSetDeviceInfo.man b/man/xkb/XkbSetDeviceInfo.man
new file mode 100644 (file)
index 0000000..1a2b00f
--- /dev/null
@@ -0,0 +1,221 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbSetDeviceInfo __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSetDeviceInfo \- Modify some or all of the characteristics of an X Input 
+Extension device
+.SH SYNOPSIS
+.HP
+.B Bool XkbSetDeviceInfo
+.BI "(\^Display *" "dpy" "\^,"
+.BI "unsigned int " "which" "\^,"
+.BI "XkbDeviceInfoPtr " "device_info" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to X server
+.TP
+.I \- which
+mask indicating characteristics to modify
+.TP
+.I \- device_info
+structure defining the device and modifications
+.SH DESCRIPTION
+.LP
+To change characteristics of an X Input Extension device in the server, first 
+modify a local copy of the device structure and then use either
+.I XkbSetDeviceInfo, 
+or, to save network traffic, use an XkbDeviceChangesRec structure and call
+.I XkbChangeDeviceInfo 
+to download the changes to the server.
+
+.I XkbSetDeviceInfo 
+sends a request to the server to modify the characteristics of the device 
+specified in the
+.I device_info 
+structure. The particular characteristics modified are identified by the bits 
+set in 
+.I which 
+and take their values from the relevant fields in 
+device_info (see Table 1). XkbSetDeviceInfo returns True if the request was 
+successfully sent to the server. If the X server implementation does not allow 
+interaction between the X input extension and the Xkb Extension, the function 
+does nothing and returns False.
+.bp
+.nf
+                         Table 1 XkbDeviceInfoRec Mask Bits
+____________________________________________________________________________________
+Name                         XkbDeviceInfoRec Value     Capability If Set
+                             Fields Effected            
+____________________________________________________________________________________
+XkbXI_KeyboardsMask                           (1L <<0) Clients can use all
+                                                       Xkb requests and events
+                                                       with KeyClass devices 
+                                                       supported by the input
+                                                       device extension.
+
+XkbXI_ButtonActionsMask       num_btns        (1L <<1) Clients can assign key 
+                              btn_acts                 actions to buttons 
+                                                       non-KeyClass input
+                                                       extension devices.
+                           
+XkbXI_IndicatorNamesMask      leds->names     (1L <<2) Clients can assign
+                                                       names to indicators on
+                                                       non-KeyClass input
+                                                       extension devices.
+                                                             
+XkbXI_IndicatorMapsMask       leds->maps      (1L <<3) Clients can assign
+                                                       indicator maps to
+                                                       indicators on 
+                                                       non-KeyClass input
+                                                       extension devices.
+
+XkbXI_IndicatorStateMask      leds->state     (1L <<4) Clients can request 
+                                                       the status of indicators
+                                                       on non-KeyClass input
+                                                       extension devices.
+
+XkbXI_IndicatorsMask          sz_leds         (0x1c)   XkbXI_IndicatorNamesMask |
+                              num_leds                 XkbXI_IndicatorMapsMask |
+                              leds->*                  XkbXI_IndicatorStateMask
+
+XkbXI_UnsupportedFeaturesMask unsupported     (1L <<15)
+
+XkbXI_AllDeviceFeaturesMask   Those selected  (0x1e)   XkbXI_IndicatorsMask |
+                              by Value Column          XkbSI_ButtonActionsMask
+                              masks 
+
+XkbXI_AllFeaturesMask         Those selected  (0x1f)   XkbSI_AllDeviceFeaturesMask |
+                              by Value Column          XkbSI_KeyboardsMask
+                              masks
+
+XkbXI_AllDetailsMask          Those selected  (0x801f) XkbXI_AllFeaturesMask |
+                              by Value column          XkbXI_UnsupportedFeaturesMask
+                              masks
+.fi
+
+The 
+.I which 
+parameter specifies which aspects of the device should be changed and is a 
+bitmask composed of an inclusive OR or one or more of the following bits: 
+XkbXI_ButtonActionsMask, XkbXI_IndicatorNamesMask, XkbXI_IndicatorMapsMask. If 
+the features requested to be manipulated in 
+.I which 
+are valid for the device, but the server does not support assignment of one or 
+more of them, that particular portion of the request is ignored.
+If the device specified in 
+.I device_info->device_spec 
+does not contain buttons and a request affecting buttons is made, or the device 
+does not contain indicators and a request affecting indicators is made, a 
+BadMatch protocol error results.
+
+If the XkbXI_ButtonActionsMask bit is set in the 
+.I supported 
+mask returned by 
+.I XkbGetDeviceInfo, 
+the Xkb extension allows applications to assign key actions to buttons on input 
+extension devices other than the core keyboard device. If the 
+XkbXI_ButtonActionsMask is set in 
+.I which, 
+the actions for all buttons specified in 
+.I device_info 
+are set to the XkbActions specified in 
+.I device_info->btn_acts. 
+If the number of buttons requested to be updated is not valid for the device,
+.I XkbSetDeviceInfo 
+returns False and a BadValue protocol error results.
+
+If the XkbXI_IndicatorMaps and / or XkbXI_IndicatorNamesMask bit is set in the 
+.I supported 
+mask returned by 
+.I XkbGetDeviceInfo, 
+the Xkb extension allows applications to assign maps and / or names to the 
+indicators of nonkeyboard extension devices. If supported, maps and / or names 
+can be assigned to all extension device indicators, whether they are part of a 
+keyboard feedback or part of an indicator feedback.
+If the XkbXI_IndicatorMapsMask and / or XkbXI_IndicatorNamesMask flag is set in 
+.I which, 
+the indicator maps and / or names for all 
+.I device_info->num_leds 
+indicator devices specified in 
+.I device_info->leds 
+are set to the maps and / or names specified in 
+.I device_info->leds. device_info->leds->led_class 
+and 
+.I led_id 
+specify the input extension class and device ID for each indicator device to 
+modify; if they have invalid values, a BadValue protocol error results and 
+.I XkbSetDeviceInfo 
+returns False. If they have legal values but do not specify a keyboard or 
+indicator class feedback for the device in question, a BadMatch error results. 
+If any of the values in
+.I device_info->leds->names 
+are not a valid Atom or None, a BadAtom protocol error results.
+.SH "RETURN VALUES"
+.TP 15
+True
+The 
+.I XkbSetDeviceInfo 
+function returns True if the request was successfully sent to the server.
+.TP 15
+False
+The 
+.I XkbSetDeviceInfo 
+function returns False if the X server implementation does not allow interaction 
+between the X input extension and the Xkb Extension.
+.SH STRUCTURES
+.LP
+Changes to an Xkb extension device may be tracked by listening to 
+XkbDeviceExtensionNotify events and accumulating the changes in an 
+XkbDeviceChangesRec structure. The changes noted in the structure may then be 
+used in subsequent operations to update either a server configuration or a local 
+copy of an Xkb extension device configuration. The changes structure is defined 
+as follows:
+.nf
+
+typedef struct _XkbDeviceChanges {
+    unsigned int    changed;    /\(** bits indicating what has changed */
+    unsigned short  first_btn;  /\(** number of first button which changed, if any */
+    unsigned short  num_btns;   /\(** number of buttons that have changed */
+    XkbDeviceLedChangesRec leds;
+} XkbDeviceChangesRec,*XkbDeviceChangesPtr;
+
+.fi
+.SH DIAGNOSTICS
+.TP 15
+.B BadAtom
+A name is neither a valid Atom or None
+.TP 15
+.B BadMatch
+A compatible version of Xkb was not available in the server or an argument has 
+correct type and range, but is otherwise invalid
+.TP 15
+.B BadValue
+An argument is out of range
+.SH "SEE ALSO"
+.BR XkbChangeDeviceInfo (__libmansuffix__),
+.BR XkbGetDeviceInfo (__libmansuffix__)
diff --git a/man/xkb/XkbSetIgnoreLockMods.man b/man/xkb/XkbSetIgnoreLockMods.man
new file mode 100644 (file)
index 0000000..e3dd33d
--- /dev/null
@@ -0,0 +1,194 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbSetIgnoreLockMods __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSetIgnoreLockMods \- Sets the modifiers that, if locked, are not to be 
+reported in matching events to passive grabs
+.SH SYNOPSIS
+.HP
+.B Bool XkbSetIgnoreLockMods
+.BI "(\^Display *" "display" "\^,"
+.BI "unsigned int " "device_spec" "\^,"
+.BI "unsigned int " "affect_real" "\^,"
+.BI "unsigned int " "real_values" "\^,"
+.BI "unsigned int " "affect_virtual" "\^,"
+.BI "unsigned int " "virtual_values" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- display
+connection to the X server
+.TP
+.I \- device_spec
+device ID, or XkbUseCoreKbd
+.TP
+.I \- affect_real
+mask of real modifiers affected by this call
+.TP
+.I \- real_values
+values for affected real modifiers (1=>set, 0=>unset) 
+.TP
+.I \- affect_virtual
+mask of virtual modifiers affected by this call 
+.TP
+.I \- virtual_values
+values for affected virtual modifiers (1=>set, 0=>unset) 
+.SH DESCRIPTION
+.LP
+The core protocol does not provide a way to exclude specific modifiers from grab 
+calculations, with the result that locking modifiers sometimes have 
+unanticipated side effects.
+
+The IgnoreLockMods control specifies modifiers that should be excluded from grab 
+calculations. These modifiers are also not reported in any core events except 
+KeyPress and KeyRelease events that do not activate a passive grab and that do 
+not occur while a grab is active.
+
+Manipulate the IgnoreLockMods control via the 
+.I ignore_lock 
+field in the XkbControlsRec structure, then use 
+.I XkbSetControls 
+and 
+.I XkbGetControls 
+to query and change this control. Alternatively, use 
+.I XkbSetIgnoreLockMods.
+
+.I XkbSetIgnoreLockMods 
+sends a request to the server to change the server's IgnoreLockMods control.
+.I affect_real 
+and 
+.I real_values 
+are masks of real modifier bits indicating which real modifiers are to be added 
+and removed from the server's IgnoreLockMods control. Modifiers selected by both
+.I affect_real 
+and 
+.I real_values 
+are added to the server's IgnoreLockMods control; those selected by 
+.I affect_real 
+but not by 
+.I real_values 
+are removed from the server's IgnoreLockMods control. Valid values for 
+.I affect_real 
+and 
+.I real_values 
+consist of any combination of the eight core modifier bits: ShiftMask, LockMask, 
+ControlMask, Mod1Mask - Mod5Mask. 
+.I affect_virtual 
+and 
+.I virtual_values 
+are masks of virtual modifier bits indicating which virtual modifiers are to be 
+added and removed from the server's IgnoreLockMods control. Modifiers selected 
+by both 
+.I affect_virtual 
+and 
+.I virtual_values 
+are added to the server's IgnoreLockMods control; those selected by 
+.I affect_virtual 
+but not by 
+.I virtual_values 
+are removed from the server's IgnoreLockMods control. See below for a discussion 
+of virtual modifier masks to use in 
+.I affect_virtual 
+and 
+.I virtual_values. XkbSetIgnoreLockMods 
+does not wait for a reply from the server. It returns True if the request was 
+sent, and False otherwise.
+
+Virtual modifiers are named by converting their string name to an X Atom and 
+storing the Atom in the 
+.I names.vmods 
+array in an XkbDescRec structure. The position of a name Atom in the 
+.I names.vmods 
+array defines the bit position used to represent the virtual modifier and also 
+the index used when accessing virtual modifier information in arrays: the name 
+in the i-th (0 relative) entry of 
+.I names.vmods 
+is the i-th virtual modifier, represented by the mask (1<<i). Throughout Xkb, 
+various functions have a parameter that is a mask representing virtual modifier 
+choices. In each case, the i-th bit (0 relative) of the mask represents the i-th 
+virtual modifier.
+
+To set the name of a virtual modifier, use 
+.I XkbSetNames, 
+using XkbVirtualModNamesMask in 
+.I which 
+and the name in the 
+.I xkb 
+argument; to retrieve indicator names, use 
+.I XkbGetNames.
+.SH STRUCTURES
+.LP
+The complete description of an Xkb keyboard is given by an XkbDescRec. The 
+component structures in the XkbDescRec represent the major Xkb components.
+.nf
+
+typedef struct {
+    struct _XDisplay * display;      /\(** connection to X server */
+    unsigned short     flags;        /\(** private to Xkb, do not modify */
+    unsigned short     device_spec;  /\(** device of interest */
+    KeyCode            min_key_code; /\(** minimum keycode for device */
+    KeyCode            max_key_code; /\(** maximum keycode for device */
+    XkbControlsPtr     ctrls;        /\(** controls */
+    XkbServerMapPtr    server;       /\(** server keymap */
+    XkbClientMapPtr    map;          /\(** client keymap */
+    XkbIndicatorPtr    indicators;   /\(** indicator map */
+    XkbNamesPtr        names;        /\(** names for all components */
+    XkbCompatMapPtr    compat;       /\(** compatibility map */
+    XkbGeometryPtr     geom;         /\(** physical geometry of keyboard */
+} XkbDescRec, *XkbDescPtr;
+
+.fi
+The display field points to an X display structure. The flags field is private 
+to the library: modifying flags may yield unpredictable results. The device_spec 
+field specifies the device identifier of the keyboard input device, or 
+XkbUseCoreKeyboard, which specifies the core keyboard device. The min_key_code 
+and max_key_code fields specify the least and greatest keycode that can be 
+returned by the keyboard.
+Each structure component has a corresponding mask bit that is used in function 
+calls to indicate that the structure should be manipulated in some manner, such 
+as allocating it or freeing it. These masks and their relationships to the 
+fields in the XkbDescRec are shown in Table 1.
+
+.TS
+c s s
+l l l
+l l l.
+Table 1 Mask Bits for XkbDescRec
+_
+Mask Bit       XkbDescRec Field        Value
+_
+XkbControlsMask        ctrls   (1L<<0)
+XkbServerMapMask       server  (1L<<1)
+XkbIClientMapMask      map     (1L<<2)
+XkbIndicatorMapMask    indicators      (1L<<3)
+XkbNamesMask   names   (1L<<4)
+XkbCompatMapMask       compat  (1L<<5)
+XkbGeometryMask        geom    (1L<<6)
+XkbAllComponentsMask   All Fields      (0x7f)
+.SH "SEE ALSO"
+.BR XkbGetControls (__libmansuffix__),
+.BR XkbGetNames (__libmansuffix__),
+.BR XkbSetControls (__libmansuffix__),
+.BR XkbSetNames (__libmansuffix__)
diff --git a/man/xkb/XkbSetIndicatorMap.man b/man/xkb/XkbSetIndicatorMap.man
new file mode 100644 (file)
index 0000000..5d5a48b
--- /dev/null
@@ -0,0 +1,180 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbSetIndicatorMap __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSetIndicatorMap \- Downloads the changes to the server based on modifications 
+to a local copy of the keyboard description which will update the maps for one 
+or more indicators
+.SH SYNOPSIS
+.HP
+.B Bool XkbSetIndicatorMap
+.BI "(\^Display *" "dpy" "\^,"
+.BI "unsigned int " "which" "\^,"
+.BI "XkbDescPtr " "desc" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to the X server
+.TP
+.I \- which
+mask of indicators to change
+.TP
+.I \- desc
+keyboard description from which the maps are taken
+.SH DESCRIPTION
+.LP
+This section discusses the effects of explicitly changing indicators depending 
+upon different settings in the indicator map. See Tables 1 and Table 2 for 
+information on the effects of the indicator map fields when explicit changes are 
+made.
+
+.TS
+c s s
+c s s
+l l l
+l l lw(3i).
+Table 1 XkbIndicatorMapRec which_groups and groups, 
+Indicator Drives Keyboard
+_
+which_groups   New State       Effect on Keyboard Group State
+_
+XkbIM_UseNone  On or Off       No effect
+XkbIM_UseBase  On or Off       No effect
+XkbIM_UseLatched       On      T{
+The groups field is treated as a group mask. The keyboard group latch is changed 
+to the lowest numbered 
+group specified in groups; if groups is empty, the  keyboard group latch is 
+changed to zero.
+T}
+XkbIM_UseLatched       Off     T{
+The groups field is treated as a group mask. If the indicator is explicitly 
+extinguished, keyboard group 
+latch is changed to the lowest numbered group not specified in groups; if groups 
+is zero, the keyboard 
+group latch is set to the index of the highest legal keyboard group.
+T}
+XkbIM_UseLocked or
+.br
+XkbIM_UseEffective     On      T{
+If the groups mask is empty, group is not changed; otherwise, the locked 
+keyboard group is changed to the 
+lowest numbered group specified in groups.
+T}
+XkbIM_UseLocked or
+.br
+XkbIM_UseEffective     Off     T{
+Locked keyboard group is changed to the lowest numbered group that is not 
+specified in the groups mask, or 
+to Group1 if the groups mask contains all keyboard groups.
+T}
+
+.TE
+
+.TS
+c s s
+c s s
+l l l
+l l lw(3i).
+Table 2 XkbIndicatorMapRec which_mods and mods,
+Indicator Drives Keyboard
+_
+which_mods     New State       Effect on Keyboard Modifiers
+_
+XkbIM_UseNone or XkbIM_UseBase On or Off       No Effect
+XkbIM_UseLatched       On      T{
+Any modifiers specified in the mask field of mods are added to the latched 
+modifiers.
+T}
+XkbIM_UseLatched       Off     T{
+Any modifiers specified in the mask field of mods are removed from the latched 
+modifiers.
+T}
+XkbIM_UseLocked, XkbIM_UseCompat, or XkbIM_UseEffective        On      T{
+Any modifiers specified in the mask field of mods are added to the locked 
+modifiers.
+T}
+XkbIM_UseLocked        Off     T{
+Any modifiers specified in the mask field of mods are removed from the locked 
+modifiers.
+T}
+XkbIM_UseCompat or XkbIM_UseEffective  Off     T{
+Any modifiers specified in the mask field of mods are removed from both the 
+locked and latched modifiers.
+T}
+.TE
+
+If XkbIM_LEDDrivesKB is set and XkbIM_NoExplicit is not, and if you call a 
+function that updates the server's image of the indicator map (such as
+.I XkbSetIndicatorMap 
+or 
+.I XkbSetNamedIndicator),
+ Xkb changes the keyboard state and controls to reflect the other fields of the 
+indicator map. If you attempt to explicitly change the value of an indicator for 
+which XkbIM_LEDDrivesKB is absent or for which XkbIM_NoExplicit is present, 
+keyboard state or controls are unaffected.
+If neither XkbIM_NoAutomatic nor XkbIM_NoExplicit is set in an indicator map, 
+Xkb honors any request to change the state of the indicator, but the new state 
+might be immediately superseded by automatic changes to the indicator state if 
+the keyboard state or controls change.
+
+The effects of changing an indicator that drives the keyboard are cumulative; it 
+is possible for a single change to affect keyboard group, modifiers, and 
+controls simultaneously.
+
+If you change an indicator for which both the XkbIM_LEDDrivesKB and 
+XkbIM_NoAutomatic flags are specified, Xkb applies the keyboard changes 
+specified in the other indicator map fields and changes the indicator to reflect 
+the state that was explicitly requested. The indicator remains in the new state 
+until it is explicitly changed again.
+
+If the XkbIM_NoAutomatic flag is not set and XkbIM_LEDDrivesKB is set, Xkb 
+applies the changes specified in the other indicator map fields and sets the 
+state of the indicator to the values specified by the indicator map. Note that 
+it is possible in this case for the indicator to end up in a different state 
+than the one that was explicitly requested. For example, Xkb does not extinguish 
+an indicator with 
+.I which_mods 
+of XkbIM_UseBase and 
+.I mods 
+of Shift if, at the time Xkb processes the request to extinguish the indicator, 
+one of the Shift keys is physically depressed.
+
+If you explicitly light an indicator for which XkbIM_LEDDrivesKB is set, Xkb 
+enables all of the boolean controls specified in the 
+.I ctrls 
+field of its indicator map. Explicitly extinguishing such an indicator causes 
+Xkb to disable all of the boolean controls specified in 
+.I ctrls. 
+
+For each bit set in the 
+.I which 
+parameter, 
+.I XkbSetIndicatorMap 
+sends the corresponding indicator map from the 
+.I desc 
+parameter to the server.
+.SH "SEE ALSO"
+.BR XkbSetNamedIndicator (__libmansuffix__)
diff --git a/man/xkb/XkbSetMap.man b/man/xkb/XkbSetMap.man
new file mode 100644 (file)
index 0000000..e322c40
--- /dev/null
@@ -0,0 +1,383 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbSetMap __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSetMap \- Send a complete new set of values for entire components to the 
+server. 
+.SH SYNOPSIS
+.HP
+.B Bool XkbSetMap
+.BI "(\^Display *" "dpy" "\^,"
+.BI "unsigned int " "which" "\^,"
+.BI "XkbDescPtr " "xkb" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to X server
+.TP
+.I \- which
+mask selecting subcomponents to update
+.TP
+.I \- xkb
+description from which new values are taken
+.SH DESCRIPTION
+.LP
+There are two ways to make changes to map components: either change a local copy 
+of the keyboard map and 
+call 
+.I XkbSetMap 
+to send the modified map to the server, or, to reduce network traffic, use an 
+XkbMapChangesRec structure 
+and call 
+.I XkbChangeMap.
+
+Use 
+.I XkbSetMap 
+to send a complete new set of values for entire components (for example, all 
+symbols, all actions, and so 
+on) to the server. The 
+.I which 
+parameter specifies the components to be sent to the server, and is a bitwise 
+inclusive OR of the masks 
+listed in Table 1. The 
+.I xkb 
+parameter is a pointer to an XkbDescRec structure and contains the information 
+to be copied to the server. 
+For each bit set in the 
+.I which 
+parameter, 
+.I XkbSetMap 
+takes the corresponding structure values from the 
+.I xkb 
+parameter and sends it to the server specified by 
+.I dpy. 
+
+If any components specified by 
+.I which 
+are not present in the 
+.I xkb 
+parameter, 
+.I XkbSetMap 
+returns False. Otherwise, it sends the update request to the server and returns 
+True. 
+.I XkbSetMap 
+can generate BadAlloc, BadLength, and BadValue protocol errors.
+
+Key types, symbol maps, and actions are all interrelated; changes in one require 
+changes in the others. Xkb 
+provides functions to make it easier to edit these components and handle the 
+interdependencies. Table 1 
+lists these helper functions and provides a pointer to where they are defined.
+
+.TS
+c s s s s
+c s s s s
+l l l l l
+l l l l l
+lw(2i) l l lw(1i) lw(3i).
+Table 1 Xkb Mapping Component Masks
+and Convenience Functions
+_
+Mask   Value   Map     Fields  Convenience     
+                               Functions
+_
+T{
+XkbKeyTypesMask
+T}     (1<<0)  client  T{
+types
+.br
+size_types
+.br
+num_types
+T}     T{
+XkbGetKeyTypes
+.br
+XkbResizeKeyType
+.br
+XkbCopyKeyType
+.br
+XkbCopyKeyTypes
+T}
+T{
+XkbKeySymsMask
+T}     (1<<1)  client  T{
+syms
+.br
+size_syms
+.br
+num_syms
+.br
+key_sym_map
+T}     T{
+XkbGetKeySyms
+.br
+XkbResizeKeySyms
+.br
+XkbChangeTypesOfKey
+T}
+T{
+XkbModifierMapMask
+T}     (1<<2)  client  modmap  T{
+XkbGetKeyModifierMap
+T}
+T{
+XkbExplicitComponentsMask
+T}     (1<<3)  server  T{
+explicit
+T}     T{
+XkbGetKeyExplicitComponents
+T}
+T{
+XkbKeyActionsMask
+T}     (1<<4)  server  T{
+key_acts
+.br
+acts
+.br
+num_acts
+.br
+size_acts
+T}     T{
+XkbGetKeyActions
+.br
+XkbResizeKeyActions
+T}
+T{
+XkbKeyBehaviorsMask
+T}     (1<<5)  server  T{
+behaviors
+T}     T{
+XkbGetKeyBehaviors
+T}
+T{
+XkbVirtualModsMask
+T}     (1<<6)  server  T{
+vmods
+T}     T{
+XkbGetVirtualMods
+T}
+T{
+XkbVirtualModMapMask
+T}     (1<<7)  server  T{
+vmodmap
+T}     T{
+XkbGetVirtualModMap
+T}
+.TE
+
+The 
+.I changed 
+field identifies the map components that have changed in an XkbDescRec structure 
+and may contain any of the 
+bits in Table 1, which are also shown in Table 2. Every 1 bit in 
+.I changed 
+also identifies which other fields in the XkbMapChangesRec structure contain 
+valid values, as indicated in 
+Table 2. The 
+.I min_key_code 
+and 
+.I max_key_code 
+fields are for reference only; they are ignored on any requests sent to the 
+server and are always updated 
+by the server whenever it returns the data for an XkbMapChangesRec.  
+.bp
+.TS
+c s s 
+l l l
+l l l
+l l l
+l lw(2i) lw(3i).
+Table 2 XkbMapChangesRec Masks
+_
+       Valid
+Mask   XkbMapChangesRec        XkbDescRec Field Containing
+       Fields  Changed Data
+_
+XkbKeyTypesMask        first_type,     map->type[first_type] ..
+       num_types       map->type[first_type + num_types - 1]
+.sp
+XkbKeySymsMask first_key_sym,  map->key_sym_map[first_key_sym] ..
+       num_key_syms    map->key_sym_map[first_key_sym +
+               num_key_syms - 1]
+XkbModifierMapMask     first_modmap_key,       map->modmap[first_modmap_key] ..
+       num_modmap_keys map->modmap[first_modmap_key +
+               num_modmap_keys-1]
+XkbExplicitComponentsMask      first_key_explicit,     
+server->explicit[first_key_explicit] ..
+       num_key_explicit        server->explicit[first_key_explicit +
+               num_key_explicit - 1]
+XkbKeyActionsMask      first_key_act,  server->key_acts[first_key_act] ..
+       num_key_acts    server->key_acts[first_key_act +
+               num_key_acts - 1]
+XkbKeyBehaviorsMask    first_key_behavior,     
+server->behaviors[first_key_behavior] ..
+       num_key_behaviors       server->behaviors[first_key_behavior +
+               num_key_behaviors - 1]
+XkbVirtualModsMask     vmods   server->vmods[*]
+XkbVirtualModMapMask   first_vmodmap_key,      
+server->vmodmap[first_vmodmap_key]
+       num_vmodmap_keys         ..
+               server->vmodmap[first_vmodmap_key
+               + num_vmodmap_keys - 1]
+.TE
+.SH "RETURN VALUES"
+.TP 15
+True
+The 
+.I XkbSetMap 
+function returns True all components specified by 
+.I which 
+are present in the 
+.I xkb 
+parameter.
+.TP 15
+False
+The 
+.I XkbSetMap 
+function returns False if any component specified by 
+.I which 
+is not present in the 
+.I xkb 
+parameter.
+.SH STRUCTURES
+.LP
+
+Use the XkbMapChangesRec structure to identify and track partial modifications 
+to the mapping components 
+and to reduce the amount of traffic between the server and clients.
+.nf
+
+typedef struct _XkbMapChanges {
+    unsigned short   changed;            /\(** identifies valid components in structure */
+    KeyCode          min_key_code;       /\(** lowest numbered keycode for device */
+    KeyCode          max_key_code;       /\(** highest numbered keycode for device */
+    unsigned char    first_type;         /\(** index of first key type modified */
+    unsigned char    num_types;          /\(** # types modified */
+    KeyCode          first_key_sym;      /\(** first key whose key_sym_map changed */
+    unsigned char    num_key_syms;       /\(** # key_sym_map entries changed */
+    KeyCode          first_key_act;      /\(** first key whose key_acts entry changed */
+    unsigned char    num_key_acts;       /\(** # key_acts entries changed */
+    KeyCode          first_key_behavior; /\(** first key whose behaviors changed */
+    unsigned char    num_key_behaviors;  /\(** # behaviors entries changed */
+    KeyCode          first_key_explicit; /\(** first key whose explicit entry changed */
+    unsigned char    num_key_explicit;   /\(** # explicit entries changed */
+    KeyCode          first_modmap_key;   /\(** first key whose modmap entry changed */
+    unsigned char    num_modmap_keys;    /\(** # modmap entries changed */
+    KeyCode          first_vmodmap_key;  /\(** first key whose vmodmap changed */
+    unsigned char    num_vmodmap_keys;   /\(** # vmodmap entries changed */
+    unsigned char    pad1;               /\(** reserved */
+    unsigned short   vmods;              /\(** mask indicating which vmods changed */
+} XkbMapChangesRec,*XkbMapChangesPtr;
+
+.fi
+
+The complete description of an Xkb keyboard is given by an XkbDescRec. The 
+component 
+structures in the XkbDescRec represent the major Xkb components.
+
+.nf
+typedef struct {
+   struct _XDisplay * display;      /\(** connection to X server */
+   unsigned short     flags;        /\(** private to Xkb, do not modify */
+   unsigned short     device_spec;  /\(** device of interest */
+   KeyCode            min_key_code; /\(** minimum keycode for device */
+   KeyCode            max_key_code; /\(** maximum keycode for device */
+   XkbControlsPtr     ctrls;        /\(** controls */
+   XkbServerMapPtr    server;       /\(** server keymap */
+   XkbClientMapPtr    map;          /\(** client keymap */
+   XkbIndicatorPtr    indicators;   /\(** indicator map */
+   XkbNamesPtr        names;        /\(** names for all components */
+   XkbCompatMapPtr    compat;       /\(** compatibility map */
+   XkbGeometryPtr     geom;         /\(** physical geometry of keyboard */
+} XkbDescRec, *XkbDescPtr;
+
+.fi
+The 
+.I display 
+field points to an X display structure. The 
+.I flags field is private to the library: modifying 
+.I flags 
+may yield unpredictable results. The 
+.I device_spec 
+field specifies the device identifier of the keyboard input device, or 
+XkbUseCoreKeyboard, which specifies the core keyboard device. The 
+.I min_key_code
+and 
+.I max_key_code 
+fields specify the least and greatest keycode that can be returned by the 
+keyboard. 
+
+Each structure component has a corresponding mask bit that is used in function 
+calls to 
+indicate that the structure should be manipulated in some manner, such as 
+allocating it 
+or freeing it. These masks and their relationships to the fields in the 
+XkbDescRec are 
+shown in Table 3.
+.bp
+.TS
+c s s
+l l l
+l l l.
+Table 3 Mask Bits for XkbDescRec
+_
+Mask Bit       XkbDescRec Field        Value
+_
+XkbControlsMask        ctrls   (1L<<0)
+XkbServerMapMask       server  (1L<<1)
+XkbIClientMapMask      map     (1L<<2)
+XkbIndicatorMapMask    indicators      (1L<<3)
+XkbNamesMask   names   (1L<<4)
+XkbCompatMapMask       compat  (1L<<5)
+XkbGeometryMask        geom    (1L<<6)
+XkbAllComponentsMask   All Fields      (0x7f)
+.TE
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadLength
+The length of a request is shorter or longer than that required to minimally 
+contain the arguments
+.TP 15
+.B BadValue
+An argument is out of range
+.SH "SEE ALSO"
+.BR XkbChangeMap (__libmansuffix__),
+.BR XkbChangeTypesOfKey (__libmansuffix__),
+.BR XkbCopyKeyType (__libmansuffix__),
+.BR XkbCopyKeyTypes (__libmansuffix__),
+.BR XkbGetKeyActions (__libmansuffix__),
+.BR XkbGetKeyBehaviors (__libmansuffix__),
+.BR XkbGetKeyExplicitComponents (__libmansuffix__),
+.BR XkbGetKeyModifierMap (__libmansuffix__),
+.BR XkbGetKeySyms (__libmansuffix__),
+.BR XkbGetKeyTypes (__libmansuffix__),
+.BR XkbResizeKeyActions (__libmansuffix__),
+.BR XkbResizeKeySyms (__libmansuffix__),
+.BR XkbResizeKeyType (__libmansuffix__),
+.BR XkbGetVirtualModMap (__libmansuffix__),
+.BR XkbGetVirtualMods (__libmansuffix__)
diff --git a/man/xkb/XkbSetModActionVMods.man b/man/xkb/XkbSetModActionVMods.man
new file mode 100644 (file)
index 0000000..cb2178b
--- /dev/null
@@ -0,0 +1,57 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbSetModActionVMods __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSetModActionVMods \- Sets the vmods1 and vmods2 fields of act using the vmods 
+format of an Xkb modifier description
+.SH SYNOPSIS
+.HP
+.B void XkbSetModActionVMods
+.BI "(\^XkbAction " "act" "\^,"
+.BI "unsigned short " "vmods" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- act
+action in which to set vmods
+.TP
+.I \- vmods
+virtual mods to set
+.SH DESCRIPTION
+.LP
+.I XkbSetModActionVMods 
+sets the 
+.I vmods1 
+and 
+.I vmods2 
+fields of 
+.I act 
+using the 
+.I vmods 
+format of an Xkb modifier description. 
+.SH NOTES
+.LP
+Despite the fact that the first parameter of these two macros is of type 
+XkbAction, these macros may be used only with Actions of type XkbModAction and 
+XkbISOAction.
diff --git a/man/xkb/XkbSetNamedIndicator.man b/man/xkb/XkbSetNamedIndicator.man
new file mode 100644 (file)
index 0000000..5cd558d
--- /dev/null
@@ -0,0 +1,119 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbSetNamedIndicator __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSetNamedIndicator \- Names an indicator if it is not already named; toggles 
+the state of the indicator; sets the indicator to a specified state and sets the 
+indicator map for the indicator
+.SH SYNOPSIS
+.HP
+.B Bool XkbSetNamedIndicator
+.BI "(\^Display *" "dpy" "\^,"
+.BI "unsigned int " "device_spec" "\^,"
+.BI "Atom " "name" "\^,"
+.BI "Bool " "change_state" "\^,"
+.BI "Bool " "state" "\^,"
+.BI "Bool " "create_new" "\^,"
+.BI "XkbIndicatorMapPtr " "map" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to the X server
+.TP
+.I \- device_spec
+device ID, or XkbUseCoreKbd
+.TP
+.I \- name
+name of the indicator to change
+.TP
+.I \- change_state
+whether to change the indicator state or not
+.TP
+.I \- state
+desired new state for the indicator
+.TP
+.I \- create_new
+whether a new indicator with the specified name should be created when necessary
+.TP
+.I \- map
+new map for the indicator
+.SH DESCRIPTION
+.LP
+If a compatible version of the Xkb extension is not available in the server, 
+.I XkbSetNamedIndicator 
+returns False. Otherwise, it sends a request to the X server to change the 
+indicator specified by 
+.I name 
+and returns True.
+If 
+.I change_state 
+is True, and the optional parameter, 
+.I state, 
+is not NULL, 
+.I XkbSetNamedIndicator 
+tells the server to change the state of the named indicator to the value 
+specified by 
+.I state. 
+
+If an indicator with the name specified by 
+.I name 
+does not already exist, the 
+.I create_new 
+parameter tells the server whether it should create a new named indicator. If 
+.I create_new 
+is True, the server finds the first indicator that doesn't have a name and gives 
+it the name specified by 
+.I name. 
+If the optional parameter, 
+.I map, is not NULL, 
+.I XkbSetNamedIndicator 
+tells the server to change the indicator's map to the values specified in 
+.I map.
+
+In addition, it can also generate XkbIndicatorStateNotify, 
+XkbIndicatorMapNotify, and XkbNamesNotify events.
+.SH "RETURN VALUES"
+.TP 15
+True
+The 
+.I XkbSetNamedIndicator 
+function returns True if a compatible version of the Xkb extension is available in the server.
+.TP 15
+False
+The 
+.I XkbSetNamedIndicator 
+function returns False if a compatible version of the Xkb extension is not available in the server.
+.SH DIAGNOSTICS
+.TP 15
+.B BadAtom
+A name is neither a valid Atom or None
+.TP 15
+.B BadImplementation
+Invalid reply from server
+.SH "SEE ALSO"
+.BR XkbIndicatorMapNotify (__libmansuffix__),
+.BR XkbIndicatorStateNotify (__libmansuffix__),
+.BR XkbNamesNotify (__libmansuffix__)
+
diff --git a/man/xkb/XkbSetNames.man b/man/xkb/XkbSetNames.man
new file mode 100644 (file)
index 0000000..de64eb2
--- /dev/null
@@ -0,0 +1,208 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbSetNames __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSetNames \- Change the symbolic names in the server
+.SH SYNOPSIS
+.HP
+.B Bool XkbSetNames
+.BI "(\^Display *" "dpy" "\^,"
+.BI "unsigned int " "which" "\^,"
+.BI "unsigned int " "first_type" "\^,"
+.BI "unsigned int " "num_types" "\^,"
+.BI "XkbDescPtr " "xkb" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to the X server
+.TP
+.I \- which
+mask of names or map components to be changed
+.TP
+.I \- first_type
+first type whose name is to be changed
+.TP
+.I \- num_types
+number of types for which names are to be changed
+.TP
+.I \- xkb
+keyboard description from which names are to be taken
+.SH DESCRIPTION
+.LP
+To change the symbolic names in the server, first modify a local copy of the 
+keyboard description and then 
+use either 
+.I XkbSetNames, 
+or, to save network traffic, use a XkbNameChangesRecstructure and call
+.I XkbChangeNames 
+to download the changes to the server. 
+.I XkbSetNames 
+and 
+.I XkbChangeNames 
+can generate BadAlloc, BadAtom, BadLength, BadMatch, and BadImplementation 
+errors.
+
+Use 
+.I XkbSetNames 
+to change many names at the same time. For each bit set in 
+.I which, XkbSetNames 
+takes the corresponding value (or values in the case of arrays) from the 
+keyboard description 
+.I xkb 
+and sends it to the server.
+
+The 
+.I first_type 
+and 
+.I num_types 
+arguments are used only if XkbKeyTypeNamesMask or XkbKTLevelNamesMask is set in
+.I which 
+and specify a subset of the types for which the corresponding names are to be 
+changed. If either or both of 
+these mask bits are set but the specified types are illegal, 
+.I XkbSetNames 
+returns False and does not update any of the names specified in 
+.I which. 
+The specified types are illegal if 
+.I xkb 
+does not include a map component or if 
+.I first_type 
+and 
+.I num_types 
+specify types that are not defined in the keyboard description.
+.SH STRUCTURES
+.LP
+The XkbNameChangesRec allows applications to identify small modifications to the 
+symbolic names and 
+effectively reduces the amount of traffic sent to the server:
+.nf
+
+    typedef struct _XkbNameChanges {
+        unsigned int   changed;          /\(** name components that have changed */
+        unsigned char  first_type;       /\(** first key type with a new name */
+        unsigned char  num_types;        /\(** number of types with new names */
+        unsigned char  first_lvl;        /\(** first key type with new level names 
+*/
+        unsigned char  num_lvls;         /\(** number of key types with new level 
+names */
+        unsigned char  num_aliases;      /\(** if key aliases changed, total number 
+of key aliases */
+        unsigned char  num_rg;           /\(** if radio groups changed, total 
+number of radio groups */
+        unsigned char  first_key;        /\(** first key with a new name */
+        unsigned char  num_keys;         /\(** number of keys with new names */
+        unsigned short changed_vmods;    /\(** mask of virtual modifiers for which 
+names have changed */
+        unsigned long  changed_indicators; /\(** mask of indicators for which names 
+were changed */
+        unsigned char  changed_groups;     /\(** mask of groups for which names 
+were changed */
+    } XkbNameChangesRec, *XkbNameChangesPtr
+    
+.fi    
+The 
+.I changed 
+field specifies the name components that have changed and is the bitwise 
+inclusive OR of the valid names 
+mask bits defined in Table 1. The rest of the fields in the structure specify 
+the ranges that have changed 
+for the various kinds of symbolic names, as shown in Table 2.
+
+Xkb provides several functions that work with symbolic names. Each of these 
+functions uses a mask to 
+specify individual fields of the structures described above. These masks and 
+their relationships to the 
+fields in a keyboard description are shown in Table 1.
+
+.TS
+c s s s
+l l l l.
+Table 1 Symbolic Names Masks
+_
+Mask Bit       Value   Keyboard        Field
+               Component
+_
+XkbKeycodesNameMask    (1<<0)  Xkb->names      keycodes
+XkbGeometryNameMask    (1<<1)  Xkb->names      geometry
+XkbSymbolsNameMask     (1<<2)  Xkb->names      symbols
+XkbPhysSymbolsNameMask (1<<3)  Xkb->names      phys_symbols
+XkbTypesNameMask       (1<<4)  Xkb->names      type
+XkbCompatNameMask      (1<<5)  Xkb->names      compat
+XkbKeyTypeNamesMask    (1<<6)  Xkb->map        type[*].name
+XkbKTLevelNamesMask    (1<<7)  Xkb->map        type[*].lvl_names[*]
+XkbIndicatorNamesMask  (1<<8)  Xkb->names      indicators[*]
+XkbKeyNamesMask        (1<<9)  Xkb->names      keys[*], num_keys
+XkbKeyAliasesMask      (1<<10) Xkb->names      key_aliases[*], num_key_aliases
+XkbVirtualModNamesMask (1<<11) Xkb->names      vmods[*]
+XkbGroupNamesMask      (1<<12) Xkb->names      groups[*]
+XkbRGNamesMask (1<<13) Xkb->names      radio_groups[*], num_rg
+XkbComponentNamesMask  (0x3f)  Xkb->names      keycodes,
+                       geometry,
+                       symbols,
+                       physical symbols,
+                       types, and
+                       compatibility map
+XkbAllNamesMask        (0x3fff)        Xkb->names      all name components
+.TE
+
+.TS
+c s s s
+l l l l.
+Table 2 XkbNameChanges Fields
+_
+Mask   Fields  Component       Field
+_
+XkbKeyTypeNamesMask    first_type,     Xkb->map        type[*].name
+       num_types
+XkbKTLevelNamesMask    first_lvl,      Xkb->map        type[*].lvl_names[*]
+       num_lvls
+XkbKeyAliasesMask      num_aliases     Xkb->names      key_aliases[*]
+XkbRGNamesMask num_rg  Xkb->names      radio_groups[*]
+XkbKeyNamesMask        first_key,      Xkb->names      keys[*]
+       num_keys
+XkbVirtualModNamesMask changed_vmods   Xkb->names      vmods[*]
+XkbIndicatorNamesMask  changed_indicators      Xkb->names      indicators[*]
+XkbGroupNamesMask      changed_groups  Xkb->names      groups[*]
+.TE
+.SH DIAGNOSTICS
+.TP 15
+.B BadAlloc
+Unable to allocate storage
+.TP 15
+.B BadAtom
+A name is neither a valid Atom or None
+.TP 15
+.B BadImplementation
+Invalid reply from server
+.TP 15
+.B BadLength
+The length of a request is shorter or longer than that required to minimally 
+contain the arguments
+.TP 15
+.B BadMatch
+A compatible version of Xkb was not available in the server or an argument has 
+correct type and range, but is otherwise invalid
+.SH "SEE ALSO"
+.BR XkbChangeNames (__libmansuffix__)
diff --git a/man/xkb/XkbSetPtrActionX.man b/man/xkb/XkbSetPtrActionX.man
new file mode 100644 (file)
index 0000000..2bd56b2
--- /dev/null
@@ -0,0 +1,108 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbSetPtrActionX __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSetPtrActionX \- Sets the high_XXX and low_XXX fields of act from the signed 
+integer value x
+.SH SYNOPSIS
+.HP
+.B void XkbSetPtrActionX
+.BI "(\^XkbPtrAction " "act" "\^,"
+.BI "int " "x" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- act
+action in which to set X
+.TP
+.I \- x
+new value to set
+.SH DESCRIPTION
+.LP
+Actions associated with the XkbPtrAction structure move the pointer when keys 
+are pressed and released.
+
+If the MouseKeys control is not enabled, KeyPress and KeyRelease events are 
+treated as though the action is XkbSA_NoAction.
+
+If the MouseKeys control is enabled, a server action of type XkbSA_MovePtr 
+instructs the server to generate core pointer MotionNotify events rather than 
+the usual KeyPress event, and the corresponding KeyRelease event disables any 
+mouse keys timers that were created as a result of handling the XkbSA_MovePtr 
+action.
+
+The 
+.I type 
+field of the XkbPtrAction structure is always XkbSA_MovePtr.
+
+The 
+.I flags 
+field is a bitwise inclusive OR of the masks shown in Table 1.
+
+.TS
+c s
+l l
+l lw(4i).
+Table 1 Pointer Action Types
+_
+Action Type    Meaning
+_
+XkbSA_NoAcceleration   T{
+If not set, and the MouseKeysAccel control is enabled, the KeyPress initiates a 
+mouse keys timer for this key; every time the timer expires, the cursor moves.
+T}
+XkbSA_MoveAbsoluteX    T{
+If set, the X portion of the structure specifies the new pointer X coordinate. 
+Otherwise, the X portion is added to the current pointer X coordinate to 
+determine the new pointer X coordinate.
+T}
+XkbSA_MoveAbsoluteY    T{
+If set, the Y portion of the structure specifies the new pointer Y coordinate. 
+Otherwise, the Y portion is added to the current pointer Y coordinate to 
+determine the new pointer Y coordinate.
+T}
+.TE
+
+Each of the X and Y coordinates of the XkbPtrAction structure is composed of
+two signed 16-bit values, that is, the X coordinate is composed of 
+.I high_XXX 
+and 
+.I low_XXX, 
+and similarly for the Y coordinate. Xkb provides the following macros, to 
+convert between a signed integer and two signed 16-bit values in XkbPtrAction 
+structures.
+.SH STRUCTURES
+.LP
+.nf
+
+    typedef struct _XkbPtrAction {
+        unsigned char    type;         /\(** XkbSA_MovePtr */
+        unsigned char    flags;        /\(** determines type of pointer motion */
+        unsigned char    high_XXX;     /\(** x coordinate, high bits*/
+        unsigned char    low_XXX;      /\(** y coordinate, low bits */
+        unsigned char    high_YYY;     /\(** x coordinate, high bits */
+        unsigned char    low_YYY;      /\(** y coordinate, low bits */
+    } XkbPtrAction;
+
+.fi    
diff --git a/man/xkb/XkbSetPtrActionY.man b/man/xkb/XkbSetPtrActionY.man
new file mode 100644 (file)
index 0000000..d8da0f2
--- /dev/null
@@ -0,0 +1,108 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbSetPtrActionY __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSetPtrActionY \- Sets the high_YYY and low_YYY fields of act from the signed 
+integer value y
+.SH SYNOPSIS
+.HP
+.B void XkbSetPtrActionY
+.BI "(\^XkbPtrAction " "act" "\^,"
+.BI "int " "y" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- act
+action in which to set Y
+.TP
+.I \- y
+new value to set
+.SH DESCRIPTION
+.LP
+Actions associated with the XkbPtrAction structure move the pointer when keys 
+are pressed and released.
+
+If the MouseKeys control is not enabled, KeyPress and KeyRelease events are 
+treated as though the action is XkbSA_NoAction.
+
+If the MouseKeys control is enabled, a server action of type XkbSA_MovePtr 
+instructs the server to generate core pointer MotionNotify events rather than 
+the usual KeyPress event, and the corresponding KeyRelease event disables any 
+mouse keys timers that were created as a result of handling the XkbSA_MovePtr 
+action.
+
+The 
+.I type 
+field of the XkbPtrAction structure is always XkbSA_MovePtr.
+
+The 
+.I flags 
+field is a bitwise inclusive OR of the masks shown in Table 1.
+
+.TS
+c s
+l l
+l lw(4i).
+Table 1 Pointer Action Types
+_
+Action Type    Meaning
+_
+XkbSA_NoAcceleration   T{
+If not set, and the MouseKeysAccel control is enabled, the KeyPress initiates a 
+mouse keys timer for this key; every time the timer expires, the cursor moves.
+T}
+XkbSA_MoveAbsoluteX    T{
+If set, the X portion of the structure specifies the new pointer X coordinate. 
+Otherwise, the X portion is added to the current pointer X coordinate to 
+determine the new pointer X coordinate.
+T}
+XkbSA_MoveAbsoluteY    T{
+If set, the Y portion of the structure specifies the new pointer Y coordinate. 
+Otherwise, the Y portion is added to the current pointer Y coordinate to 
+determine the new pointer Y coordinate.
+T}
+.TE
+
+Each of the X and Y coordinates of the XkbPtrAction structure is composed of
+two signed 16-bit values, that is, the X coordinate is composed of 
+.I high_XXX 
+and 
+.I low_XXX, 
+and similarly for the Y coordinate. Xkb provides the following macros, to 
+convert between a signed integer and two signed 16-bit values in XkbPtrAction 
+structures.
+.SH STRUCTURES
+.LP
+.nf
+
+    typedef struct _XkbPtrAction {
+        unsigned char    type;         /\(** XkbSA_MovePtr */
+        unsigned char    flags;        /\(** determines type of pointer motion */
+        unsigned char    high_XXX;     /\(** x coordinate, high bits*/
+        unsigned char    low_XXX;      /\(** y coordinate, low bits */
+        unsigned char    high_YYY;     /\(** x coordinate, high bits */
+        unsigned char    low_YYY;      /\(** y coordinate, low bits */
+    } XkbPtrAction;
+
+.fi    
diff --git a/man/xkb/XkbSetServerInternalMods.man b/man/xkb/XkbSetServerInternalMods.man
new file mode 100644 (file)
index 0000000..93ede9b
--- /dev/null
@@ -0,0 +1,198 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbSetServerInternalMods __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSetServerInternalMods \- Sets the modifiers that are consumed by the server 
+before events are delivered to the client
+.SH SYNOPSIS
+.HP
+.B Bool XkbSetServerInternalMods
+.BI "(\^Display *" "display" "\^,"
+.BI "unsigned int " "device_spec" "\^,"
+.BI "unsigned int " "affect_real" "\^,"
+.BI "unsigned int " "real_values" "\^,"
+.BI "unsigned int " "affect_virtual" "\^,"
+.BI "unsigned int " "virtual_values" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- display
+connection to the X server
+.TP
+.I \- device_spec
+device ID, or XkbUseCoreKbd
+.TP
+.I \- affect_real
+mask of real modifiers affected by this call
+.TP
+.I \- real_values
+values for affected real modifiers (1=>set, 0=>unset) 
+.TP
+.I \- affect_virtual
+mask of virtual modifiers affected by this call 
+.TP
+.I \- virtual_values
+values for affected virtual modifiers (1=>set, 0=>unset) 
+.SH DESCRIPTION
+.LP
+The core protocol does not provide any means to prevent a modifier from being 
+reported in events sent to clients; Xkb, however makes this possible via the 
+InternalMods control. It specifies modifiers that should be consumed by the 
+server and not reported to clients. When a key is pressed and a modifier that 
+has its bit set in the InternalMods control is reported to the server, the 
+server uses the modifier when determining the actions to apply for the key. The 
+server then clears the bit, so it is not actually reported to the client. In 
+addition, modifiers specified in the InternalMods control are not used to 
+determine grabs and are not used to calculate core protocol compatibility state.
+
+Manipulate the InternalMods control via the 
+.I internal 
+field in the XkbControlsRec structure, using 
+.I XkbSetControls 
+and 
+.I XkbGetControls. 
+Alternatively, use 
+.I XkbSetServerInternalMods.
+
+.I XkbSetServerInternalMods 
+sends a request to the server to change the internal modifiers consumed by the 
+server. 
+.I affect_real 
+and 
+.I real_values 
+are masks of real modifier bits indicating which real modifiers are to be added 
+and removed from the server's internal modifiers control. Modifiers selected by 
+both 
+.I affect_real 
+and 
+.I real_values 
+are added to the server's internal modifiers control; those selected by
+.I affect_real 
+but not by 
+.I real_values 
+are removed from the server's internal modifiers mask. Valid values for
+.I affect_real 
+and 
+.I real_values 
+consist of any combination of the eight core modifier bits: ShiftMask, LockMask, 
+ControlMask, Mod1Mask - Mod5Mask. 
+.I affect_virtual 
+and 
+.I virtual_values 
+are masks of virtual modifier bits indicating which virtual modifiers are to be 
+added and removed from the server's internal modifiers control. Modifiers 
+selected by both 
+.I affect_virtual 
+and 
+.I virtual_values 
+are added to the server's internal modifiers control; those selected by
+.I affect_virtual 
+but not by 
+.I virtual_values 
+are removed from the server's internal modifiers control. See below for a 
+discussion of virtual modifier masks to use in 
+.I affect_virtual 
+and 
+.I virtual_values. XkbSetServerInternalMods 
+does not wait for a reply from the server. It returns True if the request was 
+sent and False otherwise.
+
+Virtual modifiers are named by converting their string name to an X Atom and 
+storing the Atom in the 
+.I names.vmods 
+array in an XkbDescRec structure. The position of a name Atom in the 
+.I names.vmods 
+array defines the bit position used to represent the virtual modifier and also 
+the index used when accessing virtual modifier information in arrays: the name 
+in the i-th (0 relative) entry of 
+.I names.vmods 
+is the i-th virtual modifier, represented by the mask (1<<i). Throughout Xkb, 
+various functions have a parameter that is a mask representing virtual modifier 
+choices. In each case, the i-th bit (0 relative) of the mask represents the i-th 
+virtual modifier.
+
+To set the name of a virtual modifier, use 
+.I XkbSetNames, 
+using XkbVirtualModNamesMask in 
+.I which 
+and the name in the 
+.I xkb 
+argument; to retrieve indicator names, use 
+.I XkbGetNames.
+.SH STRUCTURES
+.LP
+The complete description of an Xkb keyboard is given by an XkbDescRec. The 
+component structures in the XkbDescRec represent the major Xkb components 
+outlined in Figure 1.1.
+.nf
+
+typedef struct {
+    struct _XDisplay * display;      /\(** connection to X server */
+    unsigned short     flags;        /\(** private to Xkb, do not modify */
+    unsigned short     device_spec;  /\(** device of interest */
+    KeyCode            min_key_code; /\(** minimum keycode for device */
+    KeyCode            max_key_code; /\(** maximum keycode for device */
+    XkbControlsPtr     ctrls;        /\(** controls */
+    XkbServerMapPtr    server;       /\(** server keymap */
+    XkbClientMapPtr    map;          /\(** client keymap */
+    XkbIndicatorPtr    indicators;   /\(** indicator map */
+    XkbNamesPtr        names;        /\(** names for all components */
+    XkbCompatMapPtr    compat;       /\(** compatibility map */
+    XkbGeometryPtr     geom;         /\(** physical geometry of keyboard */
+} XkbDescRec, *XkbDescPtr;
+
+.fi
+The display field points to an X display structure. The flags field is private 
+to the library: modifying flags may yield unpredictable results. The device_spec 
+field specifies the device identifier of the keyboard input device, or 
+XkbUseCoreKeyboard, which specifies the core keyboard device. The min_key_code 
+and max_key_code fields specify the least and greatest keycode that can be 
+returned by the keyboard.
+Each structure component has a corresponding mask bit that is used in function 
+calls to indicate that the structure should be manipulated in some manner, such 
+as allocating it or freeing it. These masks and their relationships to the 
+fields in the XkbDescRec are shown in Table 1.
+
+.TS
+c s s
+l l l
+l l l.
+Table 1 Mask Bits for XkbDescRec
+_
+Mask Bit       XkbDescRec Field        Value
+_
+XkbControlsMask        ctrls   (1L<<0)
+XkbServerMapMask       server  (1L<<1)
+XkbIClientMapMask      map     (1L<<2)
+XkbIndicatorMapMask    indicators      (1L<<3)
+XkbNamesMask   names   (1L<<4)
+XkbCompatMapMask       compat  (1L<<5)
+XkbGeometryMask        geom    (1L<<6)
+XkbAllComponentsMask   All Fields      (0x7f)
+.SH "SEE ALSO"
+.BR XkbGetControls (__libmansuffix__),
+.BR XkbGetNames (__libmansuffix__),
+.BR XkbSetControls (__libmansuffix__),
+.BR XkbSetNames (__libmansuffix__)
diff --git a/man/xkb/XkbSetXlibControls.man b/man/xkb/XkbSetXlibControls.man
new file mode 100644 (file)
index 0000000..05a2898
--- /dev/null
@@ -0,0 +1,105 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbSetXlibControls __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbSetXlibControls \- Changes the state of the Library Controls
+.SH SYNOPSIS
+.HP
+.B unsigned int XkbSetXlibControls
+.BI "(\^Display *" "display" "\^,"
+.BI "unsigned long " "bits_to_change" "\^,"
+.BI "unsigned long " "values_for_bits" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- display
+connection to X server
+.TP
+.I \- bits_to_change
+selects controls to be modified 
+.TP
+.I \- values_for_bits
+turns selected controls on (1) or off (0)
+.SH DESCRIPTION
+.LP
+.I XkbSetXlibControls 
+modifies the state of the controls selected by 
+.I bits_to_change; 
+only the controls selected by 
+.I bits_to_change 
+are modified. If the bit corresponding to a control is on in 
+.I bits_to_change 
+and also on in 
+.I values_for_bits, 
+the control is enabled. If the bit corresponding to a control is on in
+.I bits_to_change 
+but off in 
+.I values_for_bits, 
+the control is disabled. 
+.I bits_to_change 
+should be an inclusive OR of bits from Table 1.
+
+.TS
+c s
+l l
+l l.
+Table 1 Library Control Masks
+_
+Library Control Mask   Value
+_
+XkbLC_ForceLatin1Lookup        (1 << 0)
+XkbLC_ConsumeLookupMods        (1 << 1)
+XkbLC_AlwaysConsumeShiftAndLock        (1 << 2)
+XkbLC_IgnoreNewKeyboards       (1 << 3)
+XkbLC_ConsumeKeysOnComposeFail (1 << 29)
+XkbLC_ComposeLED       (1 << 30)
+XkbLC_BeepOnComposeFail        (1 << 31)
+XkbLC_AllControls      (0xc0000007)
+.TE
+.SH "RETURN VALUES"
+.TP 15
+(1 << 0)
+XkbLC_ForceLatin1Lookup
+.TP 15
+(1 << 1)
+XkbLC_ConsumeLookupMods
+.TP 15
+(1 << 2)
+XkbLC_AlwaysConsumeShiftAndLock
+.TP 15
+(1 << 3)
+XkbLC_IgnoreNewKeyboards
+.TP 15
+(1 << 29)
+XkbLC_ConsumeKeysOnComposeFail
+.TP 15
+(1 << 30)
+XkbLC_ComposeLED
+.TP 15
+(1 << 31)
+XkbLC_BeepOnComposeFail
+.TP 15
+(0xc0000007)
+XkbLC_AllControls
+
diff --git a/man/xkb/XkbTranslateKeyCode.man b/man/xkb/XkbTranslateKeyCode.man
new file mode 100644 (file)
index 0000000..7f1afdd
--- /dev/null
@@ -0,0 +1,71 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbTranslateKeyCode __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbTranslateKeyCode \-  Translate a keycode to a key symbol and modifiers
+.SH SYNOPSIS
+.HP
+.B Bool XkbTranslateKeyCode
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "KeyCode " "key" "\^,"
+.BI "unsigned int " "mods" "\^,"
+.BI "unsigned int *" "mods_rtrn" "\^,"
+.BI "KeySym *" "keysym_rtrn" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+keyboard description to use for translation
+.TP
+.I \- key
+keycode to translate
+.TP
+.I \- mods
+modifiers to apply when translating key
+.TP
+.I \- mods_rtrn
+backfilled with unconsumed modifiers
+.TP
+.I \- keysym_rtrn
+keysym resulting from translation
+.SH DESCRIPTION
+.LP
+.I mods_rtrn 
+is backfilled with the modifiers consumed by the translation process. 
+.I mods 
+is a bitwise inclusive OR of the legal modifier masks: ShiftMask, LockMask, 
+ControlMask, Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask.The 
+AlwaysConsumeShiftAndLock library control (see below), if enabled, causes
+.I XkbTranslateKeyCode 
+to consume shift and lock. 
+.I XkbTranslateKeyCode 
+returns True if the translation resulted in a keysym, and False if it resulted 
+in NoSymbol.
+
+The AlwaysConsumeShiftAndLock control, if enabled, forces 
+.I XLookupString 
+to consume the Shift and Lock modifiers when processing all keys, even if the 
+definition for the key type does not specify these modifiers. The 
+AlwaysConsumeShiftAndLock control is unset by default. 
+.SH "SEE ALSO"
+.BR XLookupString (__libmansuffix__)
diff --git a/man/xkb/XkbTranslateKeySym.man b/man/xkb/XkbTranslateKeySym.man
new file mode 100644 (file)
index 0000000..9a23ce2
--- /dev/null
@@ -0,0 +1,81 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbTranslateKeySym __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbTranslateKeySym \- Find the string and symbol associated with a keysym for a 
+given keyboard state
+.SH SYNOPSIS
+.HP
+.B int XkbTranslateKeySym
+.BI "(\^Display *" "dpy" "\^,"
+.BI "KeySym *" "sym_inout" "\^,"
+.BI "unsigned int " "mods" "\^,"
+.BI "char *" "buf" "\^,"
+.BI "int " "nbytes" "\^,"
+.BI "int *" "extra_rtrn" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- dpy
+connection to X server
+.TP
+.I \- sym_inout
+symbol to be translated; result of translation
+.TP
+.I \- mods
+modifiers to apply to sym_inout 
+.TP
+.I \- buf
+buffer into which returned string is written 
+.TP
+.I \- nbytes
+size of buffer in bytes
+.TP
+.I \- extra_rtrn
+number of bytes overflow
+.SH DESCRIPTION
+.LP
+.I XkbTranslateKeySym 
+applies the transformations specified in 
+.I mods 
+to the symbol specified by 
+.I sym_inout. 
+It returns in 
+.I buf 
+the string, if any, associated with the keysym for the current locale. If the 
+transformations in 
+.I mods 
+changes the keysym, 
+.I sym_inout 
+is updated accordingly. If the string returned is larger than 
+.I nbytes,
+a count of bytes that does not fit into the buffer is returned in 
+.I extra_rtrn. XkbTranslateKeySym 
+returns the number of bytes it placed into 
+.I buf.
+.SH "RETURN VALUES"
+.TP 15
+buf
+Returns the string, if any, associated with the keysym for the current locale.
+
+
diff --git a/man/xkb/XkbUpdateMapFromCore.man b/man/xkb/XkbUpdateMapFromCore.man
new file mode 100644 (file)
index 0000000..e65d598
--- /dev/null
@@ -0,0 +1,110 @@
+'\" t
+.\" Copyright 1999 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.
+.\"
+.TH XkbUpdateMapFromCore __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbUpdateMapFromCore \-  Update a local Xkb keyboard map to reflect the mapping 
+expressed by a core format mapping
+.SH SYNOPSIS
+.HP
+.B Bool XkbUpdateMapFromCore
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "KeyCode " "first_key" "\^,"
+.BI "int " "num_keys" "\^,"
+.BI "int " "map_width" "\^,"
+.BI "KeySym *" "core_keysyms" "\^,"
+.BI "XkbChangesPtr " "changes" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+keyboard description to update
+.TP
+.I \- first_key
+keycode of first key description to update
+.TP
+.I \- num_keys
+number of key descriptions to update
+.TP
+.I \- map_width
+width of core protocol keymap
+.TP
+.I \- core_keysyms
+symbols in core protocol keymap
+.TP
+.I \- changes
+backfilled with changes made to Xkb
+.SH DESCRIPTION
+.LP
+Xkb provides several functions that make it easier to apply the compatibility 
+map to configure a client-side Xkb keyboard mapping, given a core protocol 
+representation of part or all of a keyboard mapping. Obtain a core protocol 
+representation of a keyboard mapping from an actual server (by using
+.I XGetKeyboardMapping, 
+for example), a data file, or some other source.
+
+.I XkbUpdateMapFromCore 
+interprets input argument information representing a keyboard map in core format 
+to update the Xkb keyboard description passed in 
+.I xkb. 
+Only a portion of the Xkb map is updated - the portion corresponding to keys 
+with keycodes in the range 
+.I first_key 
+through 
+.I first_key + num_keys - 1. 
+If 
+.I XkbUpdateMapFromCore 
+is being called in response to a MappingNotify event, 
+.I first_key 
+and 
+.I num_keys 
+are reported in the MappingNotify event. 
+.I core_keysyms 
+contains the keysyms corresponding to the keycode range being updated, in core 
+keyboard description order. 
+.I map_width 
+is the number of keysyms per key in 
+.I core_keysyms. 
+Thus, the first 
+.I map_width 
+entries in 
+.I core_keysyms 
+are for the key with keycode 
+.I first_key, 
+the next 
+.I map_width 
+entries are for key 
+.I first_key + 1, 
+and so on.
+
+In addition to modifying the Xkb keyboard mapping in 
+.I xkb, XkbUpdateMapFromCore 
+backfills the changes structure whose address is passed in 
+.I changes 
+to indicate the modifications that were made. You may then use 
+.I changes 
+in subsequent calls such as 
+.I XkbSetMap, 
+to propagate the local modifications to a server.
+.SH "SEE ALSO"
+.BR XkbSetMap (__libmansuffix__)
diff --git a/man/xkb/XkbVirtualModsToReal.man b/man/xkb/XkbVirtualModsToReal.man
new file mode 100644 (file)
index 0000000..9c1ebbf
--- /dev/null
@@ -0,0 +1,130 @@
+.\" Copyright 1999 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.
+.\"
+.TH XkbVirtualModsToReal __libmansuffix__ __xorgversion__ "XKB FUNCTIONS"
+.SH NAME
+XkbVirtualModsToReal \- Determines the mapping of virtual modifiers to core X 
+protocol modifiers
+.SH SYNOPSIS
+.HP
+.B Bool XkbVirtualModsToReal
+.BI "(\^XkbDescPtr " "xkb" "\^,"
+.BI "unsigned int " "virtual_mask" "\^,"
+.BI "unsigned int *" "mask_rtrn" "\^);"
+.if n .ti +5n
+.if t .ti +.5i
+.SH ARGUMENTS
+.TP
+.I \- xkb
+keyboard description for input device
+.TP
+.I \- virtual_mask
+virtual modifier mask to translate
+.TP
+.I \- mask_rtrn
+backfilled with real modifiers
+.SH DESCRIPTION
+.LP
+Xkb maintains a 
+.I virtual modifier mapping, 
+which lists the virtual modifiers associated with, or bound to, each key. The 
+real modifiers bound to a virtual modifier always include all of the modifiers 
+bound to any of the keys that specify that virtual modifier in their virtual 
+modifier mapping. The 
+.I server.vmodmap 
+array indicates which virtual modifiers are bound to each key; each entry is a 
+bitmask for the virtual modifier bits. The 
+.I server.vmodmap 
+array is indexed by keycode.
+
+The 
+.I vmodmap 
+and 
+.I vmods 
+members of the server map are the "master" virtual modifier definitions. Xkb 
+automatically propagates any changes to these fields to all other fields that 
+use virtual modifier mappings.
+
+For example, if Mod3 is bound to the Num_Lock key by the core protocol modifier 
+mapping, and the NumLock virtual modifier is bound to they Num_Lock key by the 
+virtual modifier mapping, Mod3 is added to the set of modifiers associated with 
+NumLock.
+
+The virtual modifier mapping is normally updated whenever actions are 
+automatically applied to symbols and few applications should need to change the 
+virtual modifier mapping explicitly.
+
+Use 
+.I XkbGetMap
+to get the virtual modifiers from the server or use 
+.I XkbGetVirtualMods 
+to update a local copy of the virtual modifiers bindings from the server. To set 
+the binding of a virtual modifier to a real modifier, use 
+.I XkbGetVirtualMods
+
+If the keyboard description defined by 
+.I xkb 
+includes bindings for virtual modifiers, 
+.I XkbVirtualModsToReal 
+uses those bindings to determine the set of real modifiers that correspond to 
+the set of virtual modifiers specified in 
+.I virtual_mask. 
+The 
+.I virtual_mask 
+parameter is a mask specifying the virtual modifiers to translate; the i-th bit 
+(0 relative) of the mask represents the i-th virtual modifier. If 
+.I mask_rtrn 
+is non-NULL, 
+.I XkbVirtualModsToReal 
+backfills it with the resulting real modifier mask. If the keyboard description 
+in 
+.I xkb 
+does not include virtual modifier bindings, 
+.I XkbVirtualModsToReal 
+returns False; otherwise, it returns True.
+.SH "RETURN VALUES"
+.TP 15
+True
+The 
+.I XkbVirtualModsToReal 
+function returns True if the keyboard description 
+in 
+.I xkb 
+does include virtual modifier bindings.
+.TP 15
+False
+The 
+.I XkbVirtualModsToReal 
+function returns False if the keyboard description 
+in 
+.I xkb 
+does not include virtual modifier bindings.
+.SH "SEE ALSO"
+.BR XkbGetMap (__libmansuffix__),
+.BR XkbGetVirtualMods (__libmansuffix__)
+.SH NOTES
+.LP
+It is possible for a local (client-side) keyboard description (the 
+.I xkb 
+parameter) to not contain any virtual modifier information (simply because the 
+client has not requested it) while the server's corresponding definition may 
+contain virtual modifier information. 
+
diff --git a/modules/Makefile.am b/modules/Makefile.am
new file mode 100644 (file)
index 0000000..76e3383
--- /dev/null
@@ -0,0 +1 @@
+SUBDIRS=im lc om
diff --git a/modules/im/Makefile.am b/modules/im/Makefile.am
new file mode 100644 (file)
index 0000000..0974cf6
--- /dev/null
@@ -0,0 +1 @@
+SUBDIRS=ximcp
diff --git a/modules/im/ximcp/Makefile.am b/modules/im/ximcp/Makefile.am
new file mode 100644 (file)
index 0000000..16a6ca8
--- /dev/null
@@ -0,0 +1,59 @@
+AM_CPPFLAGS= \
+       -I$(top_srcdir)/include \
+       -I$(top_srcdir)/include/X11 \
+       -I$(top_builddir)/include \
+       -I$(top_builddir)/include/X11 \
+       -I$(top_srcdir)/src/xcms \
+       -I$(top_srcdir)/src/xkb \
+       -I$(top_srcdir)/src/xlibi18n \
+       -D_BSD_SOURCE -DXIM_t -DTRANS_CLIENT
+
+AM_CFLAGS= \
+       $(X11_CFLAGS) \
+       $(BIGFONT_CFLAGS) \
+       $(MALLOC_ZERO_CFLAGS) \
+       $(CWARNFLAGS)
+
+if XLIB_LOADABLE_I18N
+
+commonlibdir = $(X11_LOCALELIBDIR)/common
+commonlib_LTLIBRARIES=ximcp.la
+ximcp_la_LDFLAGS = -module -version-number 2:0:0
+ximcp_la_LIBADD = $(I18N_MODULE_LIBS)
+
+else
+
+noinst_LTLIBRARIES=libximcp.la
+
+endif
+
+
+ximcp_la_SOURCES = \
+       imCallbk.c \
+       imDefFlt.c \
+       imDefIc.c \
+       imDefIm.c \
+       imDefLkup.c \
+       imDispch.c \
+       imEvToWire.c \
+       imExten.c \
+       imImSw.c \
+       imInsClbk.c \
+       imInt.c \
+       imLcFlt.c \
+       imLcGIc.c \
+       imLcIc.c \
+       imLcIm.c \
+       imLcLkup.c \
+       imLcPrs.c \
+       imLcSIc.c \
+       imRmAttr.c \
+       imRm.c \
+       imThaiFlt.c \
+       imThaiIc.c \
+       imThaiIm.c \
+       imTrans.c \
+       imTransR.c \
+       imTrX.c
+
+libximcp_la_SOURCES = $(ximcp_la_SOURCES)
diff --git a/modules/im/ximcp/imCallbk.c b/modules/im/ximcp/imCallbk.c
new file mode 100644 (file)
index 0000000..6275bbf
--- /dev/null
@@ -0,0 +1,754 @@
+/***********************************************************************
+Copyright 1993 by Digital Equipment Corporation, Maynard, Massachusetts,
+Copyright 1994 by FUJITSU LIMITED
+Copyright 1994 by Sony Corporation
+
+                        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 names of Digital, FUJITSU
+LIMITED and Sony Corporation not be used in advertising or publicity
+pertaining to distribution of the software without specific, written
+prior permission.
+
+DIGITAL, FUJITSU LIMITED AND SONY CORPORATION DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL DIGITAL, FUJITSU LIMITED
+AND SONY CORPORATION 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.
+
+  Author: Hiroyuki Miyamoto  Digital Equipment Corporation
+                             miyamoto@jrd.dec.com
+  Modifier: Takashi Fujiwara FUJITSU LIMITED
+                            fujiwara@a80.tech.yk.fujitsu.co.jp
+           Makoto Wakamatsu Sony Corporation
+                            makoto@sm.sony.co.jp
+
+***********************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "Ximint.h"
+#include "XlcPubI.h"
+#ifdef X_LOCALE
+#define mblen(a,b)     _Xmblen(a,b)
+extern int _Xmblen ();
+#endif
+
+#define sz_CARD8                 1
+#define sz_INT8                  1
+#define sz_CARD16                2
+#define sz_INT16                 2
+#define sz_BITMASK16             sz_CARD16
+#define sz_CARD32                4
+#define sz_INT32                 4
+#define sz_BITMASK32             sz_CARD32
+#define sz_XIMID                 sizeof(XIMID)
+#define sz_XICID                 sizeof(XICID)
+#define sz_XIMATTRID             sizeof(XIMATTRID)
+#define sz_XICATTRID             sizeof(XICATTRID)
+#define sz_ximPacketHeader       (XIM_HEADER_SIZE + sz_XIMID + sz_XICID)
+#define sz_ximGeometry           0
+#define sz_ximStrConversion      (sz_CARD32 + sz_CARD32 + sz_CARD32 + sz_CARD32)
+#define sz_ximPreeditStart       0
+#define sz_ximPreeditStartReply  sz_INT32
+#define sz_ximPreeditCaret       (sz_INT32 + sz_CARD32 + sz_CARD32)
+#define sz_ximPreeditCaretReply  sz_CARD32
+#define sz_ximPreeditDone        0
+#define sz_ximStatusStart        0
+#define sz_ximStatusDone         0
+
+typedef enum {
+    XimCbSuccess,
+    XimCbNoCallback,
+    XimCbError,
+    XimCbQueued,
+    XimCbBadContextID,
+    XimCbBadOpcode
+} XimCbStatus;
+
+typedef XimCbStatus (*XimCb)(
+                            Xim, Xic, char*, int
+                            );
+
+#define PACKET_TO_MAJOROPCODE(p) (*(CARD8*)((CARD8*)(p)))
+#define PACKET_TO_MINOROPCODE(p) (*(CARD8*)((CARD8*)(p) + sz_CARD8))
+#define PACKET_TO_LENGTH(p) (*(CARD16*)((CARD8*)(p) + sz_CARD8 + sz_CARD8))
+#define PACKET_TO_IMID(p) (*(XIMID*)((CARD8*)(p) + XIM_HEADER_SIZE))
+#define PACKET_TO_ICID(p) (*(XICID*)((CARD8*)(p) + XIM_HEADER_SIZE + sz_XIMID))
+
+#define _XimWriteData(im,len,data) \
+    (im->private.proto.write((im),(len),(XPointer)(data)))
+#define _XimReadData(im,buf,buf_len,len) \
+    (im->private.proto.read((im),(XPointer)(buf),(buf_len),&(len)))
+#define _XimFlushData(im) im->private.proto.flush((im))
+
+Private XimCbStatus _XimGeometryCallback(Xim, Xic, char*, int);
+Private XimCbStatus _XimStrConversionCallback(Xim, Xic, char*, int);
+Private XimCbStatus _XimPreeditStartCallback(Xim, Xic, char*, int);
+Private XimCbStatus _XimPreeditDoneCallback(Xim, Xic, char*, int);
+Private void _free_memory_for_text(XIMText*);
+Private XimCbStatus _XimPreeditDrawCallback(Xim, Xic, char*, int);
+Private XimCbStatus _XimPreeditCaretCallback(Xim, Xic, char*, int);
+Private XimCbStatus _XimStatusStartCallback(Xim, Xic, char*, int);
+Private XimCbStatus _XimStatusDoneCallback(Xim, Xic, char*, int);
+Private XimCbStatus _XimStatusDrawCallback(Xim, Xic, char*, int);
+Private XimCbStatus _XimPreeditStateNotifyCallback(Xim, Xic, char *, int);
+
+#if defined(__STDC__) && ((defined(sun) && defined(SVR4)) || defined(WIN32))
+#define RConst /**/
+#else
+#define RConst const
+#endif
+
+/* NOTE:
+ * the table below depends on the protocol number
+ * defined in the IM Protocol document.
+ */
+static RConst XimCb callback_table[] = {
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* #000-009 */
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* #010-019 */
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* #020-029 */
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* #030-039 */
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* #040-049 */
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* #050-059 */
+    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* #060-069 */
+    _XimGeometryCallback,      /* #070 */
+    _XimStrConversionCallback, /* #071 */
+    NULL,                      /* #072 */
+    _XimPreeditStartCallback,  /* #073 */
+    NULL,                      /* #074 */
+    _XimPreeditDrawCallback,   /* #075 */
+    _XimPreeditCaretCallback,  /* #076 */
+    NULL,                      /* #077 */
+    _XimPreeditDoneCallback,   /* #078 */
+    _XimStatusStartCallback,   /* #079 */
+    _XimStatusDrawCallback,    /* #080 */
+    _XimStatusDoneCallback,    /* #081 */
+    _XimPreeditStateNotifyCallback     /* #082 */
+    };
+
+
+Private Bool
+_XimIsReadyForProcess(Xic ic)
+{
+    return(!ic->private.proto.waitCallback); /* check HM */
+}
+
+Private void
+_XimProcessPendingCallbacks(Xic ic)
+{
+    XimPendingCallback pcbq;
+
+    while (((pcbq = ic->private.proto.pend_cb_que) != (XimPendingCallback)NULL)
+          && _XimIsReadyForProcess(ic)) {
+       (void) (*callback_table[pcbq->major_opcode])(pcbq->im,
+                                                    pcbq->ic,
+                                                    pcbq->proto,
+                                                    pcbq->proto_len);
+       ic->private.proto.pend_cb_que = pcbq->next;
+       Xfree(pcbq->proto);     /* free memory of XimPendingCallback */
+       Xfree(pcbq);
+    }
+}
+
+Private void
+_XimPutCbIntoQueue(Xic ic, XimPendingCallback call_data)
+{
+    XimPendingCallback pcbq = ic->private.proto.pend_cb_que;
+
+    /* Queuing is FIFO
+     */
+    while (pcbq != (XimPendingCallback)NULL) {
+       if (pcbq->next == (XimPendingCallback)NULL) {
+           break;
+       }
+       pcbq = pcbq->next;
+    }
+    if (pcbq == (XimPendingCallback)NULL) {
+       ic->private.proto.pend_cb_que = call_data;
+    }
+    else {
+       pcbq->next = call_data;
+    }
+}
+
+Public Bool
+_XimCbDispatch(Xim xim,
+              INT16 len,
+              XPointer data,
+              XPointer call_data)
+{
+    /* `data' points to the beginning of the packet defined in IM Protocol doc.
+     */
+    int major_opcode = PACKET_TO_MAJOROPCODE(data);
+    XIMID imid = PACKET_TO_IMID(data);
+    XICID icid = PACKET_TO_ICID(data);
+    Xim im = (Xim)call_data;   /* check HM */
+    Xic ic = _XimICOfXICID(im, icid);
+    char* proto;
+    int proto_len;
+
+    /* check validity of im/ic
+     */
+    if ((imid != im->private.proto.imid) || !ic) {
+       return False; /* status = XimCbBadContextID; */
+    }
+
+    /* process pending callbacks
+     */
+    _XimProcessPendingCallbacks(ic);
+
+    /* check if the protocol should be processed here
+     */
+    if (major_opcode > 82) {
+       return False; /* status = XimCbBadOpcode; */
+    }
+    if (!callback_table[major_opcode]) {
+       return False; /* status = XimCbBadOpcode; */
+    }
+
+    /* move the pointer ahead by the IM Protocol packet header size
+     */
+    proto = (char*)data + sz_ximPacketHeader;
+    proto_len = (int)len - sz_ximPacketHeader;
+
+    /* check if it can be processed right away
+     * and if no, queue the protocol, otherwise invoke a callback
+     */
+    if (!_XimIsReadyForProcess(ic)) {
+
+       /* queue the protocol
+        */
+       XimPendingCallback pcb;
+       char *proto_buf = (proto_len > 0) ? (char*)Xmalloc(proto_len) : NULL;
+
+       pcb = (XimPendingCallback)Xmalloc(sizeof(XimPendingCallbackRec));
+       if (pcb && (proto_len <= 0 || proto_buf)) {
+           if (proto_len > 0)
+               memcpy(proto_buf, proto, proto_len);
+
+           pcb->major_opcode = major_opcode;
+           pcb->im = im;
+           pcb->ic = ic;
+           pcb->proto = proto_buf;
+           pcb->proto_len = proto_len;
+           pcb->next = (XimPendingCallback)NULL; /* queue is FIFO */
+           _XimPutCbIntoQueue(ic, pcb);
+           /* status = XimCbQueued; */
+       } else {
+           /* status = XimCbError; */
+           Xfree(pcb);
+           Xfree(proto_buf);
+       }
+    }
+    else {
+       /* invoke each callback according to the major opcode.
+        * `proto' points to the next address of IM-ID and IC-ID.
+        * `proto_len' specifies the packet length.
+        */
+       (void) (*callback_table[major_opcode])(im, ic, proto, proto_len);
+    }
+    return True;
+}
+
+Private XimCbStatus
+_XimGeometryCallback(Xim im,
+                    Xic ic,
+                    char* proto,
+                    int len)
+{
+    XICCallback* cb = &ic->core.geometry_callback;
+
+    /* invoke the callack
+     */
+    if (cb && cb->callback) {
+       (*cb->callback)((XIC)ic, cb->client_data, (XPointer)NULL);
+    }
+    else {
+
+       /* no callback registered
+        */
+       return XimCbNoCallback;
+    }
+
+    return XimCbSuccess;
+}
+
+Private XimCbStatus
+_XimStrConversionCallback(Xim im,
+                         Xic ic,
+                         char* proto,
+                         int len)
+{
+    XICCallback* cb = &ic->core.string_conversion_callback; /* check HM */
+    XIMStringConversionCallbackStruct cbrec;
+
+    /* invoke the callback
+     */
+    if (cb && cb->callback) {
+       int p = XIM_HEADER_SIZE;
+       cbrec.position = (XIMStringConversionPosition)
+           *(CARD32*)&proto[p]; p += sz_CARD32;
+       cbrec.direction = (XIMCaretDirection)
+           *(CARD32*)&proto[p]; p += sz_CARD32;
+       cbrec.operation = (XIMStringConversionOperation)
+           *(CARD32*)&proto[p]; p += sz_CARD32;
+       cbrec.factor = (unsigned short)
+           *(CARD32*)&proto[p];
+
+       (*cb->callback)((XIC)ic, cb->client_data, (XPointer)&cbrec);
+    }
+    else {
+
+       /* no callback registered
+        */
+       _XimError(im, ic,
+                 (CARD16)XIM_BadSomething,
+                 (INT16)len,
+                 (CARD16)XIM_STR_CONVERSION,
+                 (char*)proto); /* send XIM_ERROR */
+       return XimCbNoCallback;
+    }
+
+    /* send a reply
+     */
+    {
+       CARD8   *buf;
+       INT16    buf_len;
+       int      p, length_in_bytes, i;
+
+       /* Assumption:
+        * `cbrec.text->length' means the string length in characters
+        */
+       {
+           length_in_bytes = (cbrec.text->encoding_is_wchar)?
+               sizeof(wchar_t) * cbrec.text->length: /* wchar */
+               strlen(cbrec.text->string.mbs); /* mb */
+           buf_len = XIM_HEADER_SIZE +
+               sz_CARD16 +
+               2 + length_in_bytes +
+               XIM_PAD(2 + length_in_bytes) +
+               2 + 2 + sz_CARD32 * cbrec.text->length;
+           buf = (CARD8*)Xmalloc(buf_len);
+       }
+       _XimSetHeader((XPointer)buf, XIM_STR_CONVERSION_REPLY, 0, &buf_len);
+       buf_len -= XIM_HEADER_SIZE; /* added by _XimSetHeader (HACK) */
+       p = XIM_HEADER_SIZE;
+       *(CARD16*)&buf[p] = (CARD16)im->private.proto.imid; p += sz_CARD16;
+       *(CARD16*)&buf[p] = (CARD16)ic->private.proto.icid; p += sz_CARD16;
+       *(CARD16*)&buf[p] = (CARD16)cbrec.text->length; p += sz_CARD16;
+       memcpy(&buf[p],&cbrec.text->string.mbs,length_in_bytes);
+       p += length_in_bytes;
+       *(CARD16*)&buf[p] = (CARD16)(sz_CARD32*cbrec.text->length);
+       p += XIM_PAD(2);
+       for (i = 0; i < (int)cbrec.text->length; i++) {
+           *(CARD32*)&buf[p] = (CARD32)cbrec.text->feedback[i];
+           p += sz_CARD32;
+       }
+
+       if (!(_XimWriteData(im, buf_len, buf))) {
+           return XimCbError;
+       }
+       _XimFlushData(im);
+
+       Xfree(buf);
+    }
+
+    return XimCbSuccess;
+}
+
+Private XimCbStatus
+_XimPreeditStartCallback(Xim im,
+                        Xic ic,
+                        char* proto,
+                        int len)
+{
+    XICCallback* cb = &ic->core.preedit_attr.start_callback;
+    int ret;
+
+    /* invoke the callback
+     */
+    if (cb && cb->callback){
+       ret = (*(cb->callback))((XIC)ic, cb->client_data, (XPointer)NULL);
+    }
+    else {
+
+       /* no callback registered
+        */
+       _XimError(im, ic,
+                 (CARD16)XIM_BadSomething,
+                 (INT16)len,
+                 (CARD16)XIM_PREEDIT_START,
+                 (char*)proto); /* send XIM_ERROR */
+       return XimCbNoCallback;
+    }
+
+    /* send a reply
+     */
+    {
+       CARD32 buf32[(sz_ximPacketHeader + sz_ximPreeditStartReply) / 4];
+       CARD8 *buf = (CARD8 *)buf32;
+       INT16 buf_len = sz_XIMID + sz_XICID + sz_ximPreeditStartReply;
+       int p;
+
+       _XimSetHeader((XPointer)buf, XIM_PREEDIT_START_REPLY, 0, &buf_len);
+       p = XIM_HEADER_SIZE;
+       *(CARD16*)&buf[p] = (CARD16)im->private.proto.imid; p += sz_CARD16;
+       *(CARD16*)&buf[p] = (CARD16)ic->private.proto.icid; p += sz_CARD16;
+       *(INT32*)&buf[p]  = (INT32)ret;
+
+       if (!(_XimWriteData(im, buf_len, buf))) {
+           return XimCbError;
+       }
+       _XimFlushData(im);
+    }
+
+    return XimCbSuccess;
+}
+
+Private XimCbStatus
+_XimPreeditDoneCallback(Xim im,
+                       Xic ic,
+                       char* proto,
+                       int len)
+{
+    XICCallback* cb = &ic->core.preedit_attr.done_callback;
+
+    /* invoke the callback
+     */
+    if (cb && cb->callback) {
+       (*cb->callback)((XIC)ic, cb->client_data, (XPointer)NULL);
+    }
+    else {
+
+       /* no callback registered
+        */
+       return XimCbNoCallback;
+    }
+
+    return XimCbSuccess;
+}
+
+Private void
+_read_text_from_packet(Xim im,
+                      char* buf,
+                      XIMText** text_ptr)
+{
+    int status;
+    XIMText* text;
+    int tmp_len;
+    char* tmp_buf;
+    Status s = 0;
+
+    status = (int)*(BITMASK32*)buf; buf += sz_BITMASK32;
+
+    /* string part
+     */
+    if (status & 0x00000001) /* "no string" bit on */ {
+       buf += sz_CARD16;       /* skip "length of preedit string" */
+       buf += 2;               /* pad */
+       *text_ptr = (XIMText*)NULL;
+       return;
+    }
+
+    *text_ptr = text = (XIMText*)Xmalloc(sizeof(XIMText));
+    if (text == (XIMText*)NULL) return;
+
+       tmp_len = (int)*(CARD16*)buf;
+       buf += sz_CARD16;
+       if ((tmp_buf = (char*)Xmalloc(tmp_len + 1))) {
+           memcpy(tmp_buf, buf, tmp_len);
+           tmp_buf[tmp_len] = '\0';
+
+           text->encoding_is_wchar = False;
+           text->length = im->methods->ctstombs((XIM)im,
+                                       tmp_buf, tmp_len,
+                                       NULL, 0, &s); /* CT? HM */
+           if (s != XLookupNone) {
+#ifndef NO_DEC_I18N_FIX
+                /* Allow for NULL-terminated */
+                if ((text->string.multi_byte =
+                    (char*)Xmalloc(text->length *
+                      XLC_PUBLIC(im->core.lcd,mb_cur_max) + 1))) {
+#else
+               if (text->string.multi_byte = (char*)Xmalloc(text->length+1)) {
+#endif
+                       int tmp;
+#ifndef NO_DEC_I18N_FIX
+                        char *char_tmp;
+                        int char_len;
+#endif
+                       tmp = im->methods->ctstombs((XIM)im,
+                                          tmp_buf, tmp_len,
+#ifndef NO_DEC_I18N_FIX
+                                           text->string.multi_byte,
+                                           text->length * XLC_PUBLIC(im->core.lcd,mb_cur_max) + 1,
+#else
+                                          text->string.multi_byte, text->length,
+#endif
+                                          &s);
+                       text->string.multi_byte[tmp] = '\0';
+#ifndef NO_DEC_I18N_FIX
+                        text->length = 0;
+                        char_tmp =  text->string.multi_byte;
+                        while (*char_tmp != '\0') {
+                              char_len = mblen(char_tmp, strlen(char_tmp));
+                              char_tmp = char_tmp + char_len;
+                              (text->length)++;
+                        }
+#endif
+               }
+           }
+           else {
+               text->length = 0;
+               text->string.multi_byte = NULL;
+           }
+
+           Xfree(tmp_buf);
+       }
+       buf += tmp_len;
+
+       buf += XIM_PAD(sz_CARD16 + tmp_len); /* pad */
+
+    /* feedback part
+     */
+    if (status & 0x00000002) /* "no feedback" bit on */ {
+       text->feedback = (XIMFeedback*)NULL;
+    }
+    else {
+       int i, j;
+
+       i = (int)*(CARD16*)buf; buf += sz_CARD16;
+       buf += sz_CARD16; /* skip `unused' */
+       text->feedback = (XIMFeedback*)Xmalloc(i*(sizeof(XIMFeedback)/sizeof(CARD32)));
+       j = 0;
+       while (i > 0) {
+           text->feedback[j] = (XIMFeedback)*(CARD32*)buf;
+           buf += sz_CARD32;
+           i -= sz_CARD32;
+           j++;
+       }
+       /*
+        * text->length tells how long both the status string and
+        * the feedback array are. If there's "no string" the
+        * text->length was set to zero previously. See above.
+        * But if there is feedback (i.e. not "no feedback") then
+        * we need to convey the length of the feedback array.
+        * It might have been better if the protocol sent two
+        * different values, one for the length of the status
+        * string and one for the length of the feedback array.
+        */
+       if (status & 0x00000001) /* "no string" bit on */ {
+           text->length = j;
+       }
+    }
+}
+
+Private void
+_free_memory_for_text(XIMText* text)
+{
+    if (text) {
+       if (text->string.multi_byte)
+           Xfree(text->string.multi_byte);
+       if (text->feedback)
+           Xfree(text->feedback);
+       Xfree(text);
+    }
+}
+
+Private XimCbStatus
+_XimPreeditDrawCallback(Xim im,
+                       Xic ic,
+                       char* proto,
+                       int len)
+{
+    XICCallback* cb = &ic->core.preedit_attr.draw_callback;
+    XIMPreeditDrawCallbackStruct cbs;
+
+    /* invoke the callback
+     */
+    if (cb && cb->callback) {
+       cbs.caret      = (int)*(INT32*)proto; proto += sz_INT32;
+       cbs.chg_first  = (int)*(INT32*)proto; proto += sz_INT32;
+       cbs.chg_length = (int)*(INT32*)proto; proto += sz_INT32;
+       _read_text_from_packet(im, proto, &cbs.text);
+
+       (*cb->callback)((XIC)ic, cb->client_data, (XPointer)&cbs);
+
+       _free_memory_for_text((XIMText*)cbs.text);
+    }
+    else {
+
+       /* no callback registered
+        */
+       return XimCbNoCallback;
+    }
+
+    return XimCbSuccess;
+}
+
+Private XimCbStatus
+_XimPreeditCaretCallback(Xim im,
+                        Xic ic,
+                        char* proto,
+                        int len)
+{
+    XICCallback* cb = &ic->core.preedit_attr.caret_callback;
+    XIMPreeditCaretCallbackStruct cbs;
+
+    /* invoke the callback
+     */
+    if (cb && cb->callback) {
+       cbs.position  = (int)*(INT32*)proto; proto += sz_INT32;
+       cbs.direction = (XIMCaretDirection)*(CARD32*)proto; proto += sz_CARD32;
+       cbs.style     = (XIMCaretStyle)*(CARD32*)proto; proto += sz_CARD32;
+
+       (*cb->callback)((XIC)ic, cb->client_data, (XPointer)&cbs);
+    }
+    else {
+
+       /* no callback registered
+        */
+       _XimError(im, ic,
+                 (CARD16)XIM_BadSomething,
+                 (INT16)len,
+                 (CARD16)XIM_PREEDIT_CARET,
+                 (char*)proto); /* send XIM_ERROR */
+       return XimCbNoCallback;
+    }
+
+    /* Send a reply
+     */
+    {
+       CARD8 buf[sz_ximPacketHeader + sz_ximPreeditCaretReply];
+       INT16 len = sz_XIMID + sz_XICID + sz_ximPreeditCaretReply;
+       int p;
+
+       _XimSetHeader((XPointer)buf, XIM_PREEDIT_CARET_REPLY, 0, &len);
+       p = XIM_HEADER_SIZE;
+       *(CARD16*)&buf[p] = (CARD16)im->private.proto.imid; p += sz_CARD16;
+       *(CARD16*)&buf[p] = (CARD16)ic->private.proto.icid; p += sz_CARD16;
+       *(CARD32*)&buf[p] = (CARD32)cbs.position;
+
+       if (!(_XimWriteData(im, len, buf))) {
+           return XimCbError;
+       }
+       _XimFlushData(im);
+    }
+
+    return XimCbSuccess;
+}
+
+Private XimCbStatus
+_XimStatusStartCallback(Xim im,
+                       Xic ic,
+                       char* proto,
+                       int len)
+{
+    XICCallback* cb = &ic->core.status_attr.start_callback;
+
+    /* invoke the callback
+     */
+    if (cb && cb->callback) {
+       (*cb->callback)((XIC)ic, cb->client_data, (XPointer)NULL);
+    }
+    else {
+
+       /* no callback registered
+        */
+       return XimCbNoCallback;
+    }
+
+    return XimCbSuccess;
+}
+
+Private XimCbStatus
+_XimStatusDoneCallback(Xim im,
+                      Xic ic,
+                      char* proto,
+                      int len)
+{
+    XICCallback* cb = &ic->core.status_attr.done_callback;
+
+    /* invoke the callback
+     */
+    if (cb && cb->callback) {
+       (*cb->callback)((XIC)ic, cb->client_data, (XPointer)NULL);
+    }
+    else {
+
+       /* no callback registered
+        */
+       return XimCbNoCallback;
+    }
+
+    return XimCbSuccess;
+}
+
+Private XimCbStatus
+_XimStatusDrawCallback(Xim im,
+                      Xic ic,
+                      char* proto,
+                      int len)
+{
+    XICCallback* cb = &ic->core.status_attr.draw_callback;
+    XIMStatusDrawCallbackStruct cbs;
+
+    /* invoke the callback
+     */
+    if (cb && cb->callback) {
+       cbs.type = (XIMStatusDataType)*(CARD32*)proto; proto += sz_CARD32;
+       if (cbs.type == XIMTextType) {
+           _read_text_from_packet(im, proto, &cbs.data.text);
+       }
+       else if (cbs.type == XIMBitmapType) {
+           cbs.data.bitmap = (Pixmap)*(CARD32*)proto;
+       }
+
+       (*cb->callback)((XIC)ic, cb->client_data, (XPointer)&cbs);
+
+       if (cbs.type == XIMTextType)
+           _free_memory_for_text((XIMText *)cbs.data.text);
+    }
+    else {
+
+       /* no callback registered
+        */
+       return XimCbNoCallback;
+    }
+
+    return XimCbSuccess;
+}
+
+Private XimCbStatus
+_XimPreeditStateNotifyCallback( Xim im, Xic ic, char* proto, int len )
+{
+    XICCallback        *cb = &ic->core.preedit_attr.state_notify_callback;
+
+    /* invoke the callack
+     */
+    if( cb  &&  cb->callback ) {
+       XIMPreeditStateNotifyCallbackStruct cbrec;
+
+       cbrec.state = *(BITMASK32 *)proto;
+       (*cb->callback)( (XIC)ic, cb->client_data, (XPointer)&cbrec );
+    }
+    else {
+       /* no callback registered
+        */
+       return XimCbNoCallback;
+    }
+
+    return XimCbSuccess;
+}
+
diff --git a/modules/im/ximcp/imDefFlt.c b/modules/im/ximcp/imDefFlt.c
new file mode 100644 (file)
index 0000000..1e4f389
--- /dev/null
@@ -0,0 +1,413 @@
+/******************************************************************
+
+           Copyright 1992, 1993, 1994 by FUJITSU LIMITED
+
+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 FUJITSU LIMITED
+not be used in advertising or publicity pertaining to distribution
+of the software without specific, written prior permission.
+FUJITSU LIMITED makes no representations about the suitability of
+this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL FUJITSU LIMITED 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.
+
+  Author: Takashi Fujiwara     FUJITSU LIMITED
+                               fujiwara@a80.tech.yk.fujitsu.co.jp
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <X11/Xatom.h>
+#include "Xlibint.h"
+#include "Xutil.h"
+#include "Xlcint.h"
+#include "Ximint.h"
+
+Private long
+_XimTriggerCheck(
+    Xim                         im,
+    XKeyEvent          *ev,
+    INT32               len,
+    CARD32             *keylist)
+{
+    register long       i;
+    KeySym              keysym;
+    CARD32              buf32[BUFSIZE/4];
+    char               *buf = (char *)buf32;
+    int                         modifier;
+    int                         modifier_mask;
+    CARD32              min_len = sizeof(CARD32)   /* sizeof keysym */
+                                + sizeof(CARD32)   /* sizeof modifier */
+                                + sizeof(CARD32);  /* sizeof modifier mask */
+
+    XLookupString(ev, buf, BUFSIZE, &keysym, NULL);
+    if (!keysym)
+       return -1;
+
+    for (i = 0; len >= min_len; i += 3, len -= min_len) {
+       modifier      = keylist[i + 1];
+       modifier_mask = keylist[i + 2];
+       if (((KeySym)keylist[i] == keysym)
+        && ((ev->state & modifier_mask) == modifier))
+           return i;
+    }
+    return -1;
+}
+
+Private long
+_XimTriggerOnCheck(
+    Xim                 im,
+    XKeyEvent  *ev)
+{
+    return _XimTriggerCheck(im, ev, (INT32)im->private.proto.im_onkeylist[0],
+                                       &im->private.proto.im_onkeylist[1]);
+}
+
+Private long
+_XimTriggerOffCheck(
+    Xim                 im,
+    XKeyEvent  *ev)
+{
+    return _XimTriggerCheck(im, ev, (INT32)im->private.proto.im_offkeylist[0],
+                                       &im->private.proto.im_offkeylist[1]);
+}
+
+Private Bool
+_XimOnKeysCheck(
+    Xic                 ic,
+    XKeyEvent  *ev)
+{
+    Xim                 im = (Xim)ic->core.im;
+    long        idx;
+
+    if (IS_DYNAMIC_EVENT_FLOW(ic->core.im) &&
+           im->private.proto.im_onkeylist &&
+           im->private.proto.im_onkeylist[0]) {
+       if ((idx = _XimTriggerOnCheck(im, ev)) >= 0) {
+           (void)_XimTriggerNotify(im, ic, 0, (CARD32)idx); /* Trigger on */
+           return True;
+       }
+    }
+    return False;
+}
+
+Private Bool
+_XimOffKeysCheck(
+    Xic                 ic,
+    XKeyEvent  *ev)
+{
+    Xim                 im = (Xim)ic->core.im;
+    long        idx;
+
+    if (IS_DYNAMIC_EVENT_FLOW(ic->core.im) &&
+           im->private.proto.im_offkeylist &&
+           im->private.proto.im_offkeylist[0]) {
+       if ((idx = _XimTriggerOffCheck(im, ev)) >= 0) {
+           _XimTriggerNotify(im, ic, 1, (CARD32)idx); /* Trigger off */
+           return True;
+       }
+    }
+    return False;
+}
+
+Private void
+_XimPendingFilter(
+    Xic                 ic)
+{
+    Xim          im = (Xim)ic->core.im;
+
+    if (IS_NEED_SYNC_REPLY(im)) {
+       (void)_XimProcSyncReply(im, ic);
+       UNMARK_NEED_SYNC_REPLY(im);
+    }
+    return;
+}
+
+Private Bool
+_XimProtoKeypressFilter(
+    Xic                 ic,
+    XKeyEvent  *ev)
+{
+    Xim                im = (Xim)ic->core.im;
+
+    if (IS_FABRICATED(im)) {
+       _XimPendingFilter(ic);
+       UNMARK_FABRICATED(im);
+       return NOTFILTERD;
+    }
+
+    if (IS_NEGLECT_EVENT(ic, KeyPressMask))
+       return FILTERD;
+
+#ifdef XIM_CONNECTABLE
+    if (!IS_IC_CONNECTED(ic)) {
+       if (IS_CONNECTABLE(im)) {
+           if (_XimConnectServer(im)) {
+               if (!_XimReCreateIC(ic)) {
+                   _XimDelayModeSetAttr(im);
+                   return NOTFILTERD;
+               }
+           } else {
+               return NOTFILTERD;
+           }
+       } else {
+           return NOTFILTERD;
+       }
+    }
+#else
+    if (!IS_IC_CONNECTED(ic))
+       return NOTFILTERD;
+#endif /* XIM_CONNECTABLE */
+
+    if (!IS_FORWARD_EVENT(ic, KeyPressMask)) {
+       if (_XimOnKeysCheck(ic, ev))
+           return FILTERD;
+       return NOTFILTERD;
+    }
+    if (_XimOffKeysCheck(ic, ev))
+       return FILTERD;
+
+    if (_XimForwardEvent(ic, (XEvent *)ev,
+                               IS_SYNCHRONOUS_EVENT(ic, KeyPressMask)))
+       return FILTERD;
+
+    return NOTFILTERD;
+}
+
+Private Bool
+_XimFilterKeypress(
+    Display            *d,
+    Window              w,
+    XEvent             *ev,
+    XPointer            client_data)
+{
+    return _XimProtoKeypressFilter((Xic)client_data, (XKeyEvent *)ev );
+}
+
+Private Bool
+_XimProtoKeyreleaseFilter(
+    Xic                 ic,
+    XKeyEvent  *ev)
+{
+    Xim                im = (Xim)ic->core.im;
+
+    if (IS_FABRICATED(im)) {
+       _XimPendingFilter(ic);
+       UNMARK_FABRICATED(im);
+       return NOTFILTERD;
+    }
+
+    if (IS_NEGLECT_EVENT(ic, KeyReleaseMask))
+       return FILTERD;
+
+#ifdef XIM_CONNECTABLE
+    if (!IS_IC_CONNECTED(ic)) {
+       if (IS_CONNECTABLE(im)) {
+           if (_XimConnectServer(im)) {
+               if (!_XimReCreateIC(ic)) {
+                   _XimDelayModeSetAttr(im);
+                   return NOTFILTERD;
+               }
+           } else {
+               return NOTFILTERD;
+           }
+       } else {
+           return NOTFILTERD;
+       }
+    }
+#else
+    if (!IS_IC_CONNECTED(ic))
+       return NOTFILTERD;
+#endif /* XIM_CONNECTABLE */
+
+    if (!IS_FORWARD_EVENT(ic, KeyReleaseMask)) {
+       if (_XimOnKeysCheck(ic, ev))
+           return FILTERD;
+       return NOTFILTERD;
+    }
+    if (_XimOffKeysCheck(ic, ev))
+           return FILTERD;
+
+    if (_XimForwardEvent(ic, (XEvent *)ev,
+                               IS_SYNCHRONOUS_EVENT(ic, KeyPressMask)))
+       return FILTERD;
+
+    return NOTFILTERD;
+}
+
+Private Bool
+_XimFilterKeyrelease(
+    Display            *d,
+    Window              w,
+    XEvent             *ev,
+    XPointer            client_data)
+{
+    return _XimProtoKeyreleaseFilter((Xic)client_data, (XKeyEvent *)ev);
+}
+
+Private void
+_XimRegisterKeyPressFilter(
+    Xic                 ic)
+{
+    if (ic->core.focus_window) {
+       if (!(ic->private.proto.registed_filter_event & KEYPRESS_MASK)) {
+           _XRegisterFilterByType (ic->core.im->core.display,
+                                   ic->core.focus_window,
+                                   KeyPress, KeyPress,
+                                   _XimFilterKeypress,
+                                   (XPointer)ic);
+           ic->private.proto.registed_filter_event |= KEYPRESS_MASK;
+       }
+    }
+    return;
+}
+
+Private void
+_XimRegisterKeyReleaseFilter(
+    Xic                 ic)
+{
+    if (ic->core.focus_window) {
+       if (!(ic->private.proto.registed_filter_event & KEYRELEASE_MASK)) {
+           _XRegisterFilterByType (ic->core.im->core.display,
+                                   ic->core.focus_window,
+                                   KeyRelease, KeyRelease,
+                                   _XimFilterKeyrelease,
+                                   (XPointer)ic);
+           ic->private.proto.registed_filter_event |= KEYRELEASE_MASK;
+       }
+    }
+    return;
+}
+
+Private void
+_XimUnregisterKeyPressFilter(
+    Xic                 ic)
+{
+    if (ic->core.focus_window) {
+       if (ic->private.proto.registed_filter_event & KEYPRESS_MASK) {
+           _XUnregisterFilter (ic->core.im->core.display,
+                               ic->core.focus_window,
+                               _XimFilterKeypress,
+                               (XPointer)ic);
+           ic->private.proto.registed_filter_event &= ~KEYPRESS_MASK;
+       }
+    }
+    return;
+}
+
+Private void
+_XimUnregisterKeyReleaseFilter(
+    Xic                 ic)
+{
+    if (ic->core.focus_window) {
+       if (ic->private.proto.registed_filter_event & KEYRELEASE_MASK) {
+           _XUnregisterFilter (ic->core.im->core.display,
+                               ic->core.focus_window,
+                               _XimFilterKeyrelease,
+                               (XPointer)ic);
+           ic->private.proto.registed_filter_event &= ~KEYRELEASE_MASK;
+       }
+    }
+    return;
+}
+
+Public void
+_XimRegisterFilter(
+    Xic                 ic)
+{
+    _XimRegisterKeyPressFilter(ic);
+    if (IS_FORWARD_EVENT(ic, KeyReleaseMask))
+       _XimRegisterKeyReleaseFilter(ic);
+    return;
+}
+
+Public void
+_XimUnregisterFilter(
+    Xic                 ic)
+{
+    _XimUnregisterKeyPressFilter(ic);
+    _XimUnregisterKeyReleaseFilter(ic);
+    return;
+}
+
+Public void
+_XimReregisterFilter(
+    Xic                 ic)
+{
+    if (IS_FORWARD_EVENT(ic, KeyReleaseMask))
+       _XimRegisterKeyReleaseFilter(ic);
+    else
+       _XimUnregisterKeyReleaseFilter(ic);
+
+    return;
+}
+
+Private Bool
+_XimFilterServerDestroy(
+    Display            *d,
+    Window              w,
+    XEvent             *ev,
+    XPointer            client_data)
+{
+    Xim                         im = (Xim)client_data;
+
+    if (ev->type == DestroyNotify) {
+       UNMARK_SERVER_CONNECTED(im);
+#ifdef XIM_CONNECTABLE
+       if (!IS_SERVER_CONNECTED(im) && IS_RECONNECTABLE(im)) {
+           _XimServerReconectableDestroy();
+           return True;
+       }
+#endif /* XIM_CONNECTABLE */
+       _XimServerDestroy(im);
+    }
+    return True;
+}
+
+Public void
+_XimRegisterServerFilter(
+    Xim                 im)
+{
+    if (im->private.proto.im_window) {
+       if (!(im->private.proto.registed_filter_event & DESTROYNOTIFY_MASK)) {
+           _XRegisterFilterByMask(im->core.display,
+                   im->private.proto.im_window,
+                   StructureNotifyMask,
+                   _XimFilterServerDestroy,
+                   (XPointer)im);
+           XSelectInput(im->core.display, im->private.proto.im_window,
+                        StructureNotifyMask);
+           im->private.proto.registed_filter_event |= DESTROYNOTIFY_MASK;
+       }
+    }
+    return;
+}
+
+Public void
+_XimUnregisterServerFilter(
+    Xim                 im)
+{
+    if (im->private.proto.im_window) {
+       if (im->private.proto.registed_filter_event & DESTROYNOTIFY_MASK) {
+           _XUnregisterFilter(im->core.display,
+                   im->private.proto.im_window,
+                   _XimFilterServerDestroy,
+                   (XPointer)im);
+           im->private.proto.registed_filter_event &= ~DESTROYNOTIFY_MASK;
+       }
+    }
+    return;
+}
+
diff --git a/modules/im/ximcp/imDefIc.c b/modules/im/ximcp/imDefIc.c
new file mode 100644 (file)
index 0000000..a06f6a7
--- /dev/null
@@ -0,0 +1,1577 @@
+/*
+ * Copyright 1991, 1992 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 1992, 1993, 1994 by FUJITSU LIMITED
+
+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 FUJITSU LIMITED
+not be used in advertising or publicity pertaining to distribution
+of the software without specific, written prior permission.
+FUJITSU LIMITED makes no representations about the suitability of
+this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL FUJITSU LIMITED 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.
+
+  Author: Hideki Hiura (hhiura@Sun.COM) Sun Microsystems, Inc.
+          Takashi Fujiwara     FUJITSU LIMITED
+                               fujiwara@a80.tech.yk.fujitsu.co.jp
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "Ximint.h"
+
+Private Bool
+_XimCreateICCheck(
+    Xim          im,
+    INT16        len,
+    XPointer    data,
+    XPointer     arg)
+{
+    CARD16     *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
+    CARD8       major_opcode = *((CARD8 *)data);
+    CARD8       minor_opcode = *((CARD8 *)data + 1);
+    XIMID       imid = buf_s[0];
+
+    if ((major_opcode == XIM_CREATE_IC_REPLY)
+     && (minor_opcode == 0)
+     && (imid == im->private.proto.imid))
+       return True;
+    if ((major_opcode == XIM_ERROR)
+     && (minor_opcode == 0)
+     && (buf_s[2] & XIM_IMID_VALID)
+     && (imid == im->private.proto.imid))
+       return True;
+    return False;
+}
+
+#ifdef XIM_CONNECTABLE
+Public Bool
+_XimReCreateIC(ic)
+    Xic                         ic;
+{
+    Xim                         im = (Xim)ic->core.im;
+    Xic                         save_ic;
+    XIMResourceList     res;
+    unsigned int         num;
+    XIMStyle            input_style = ic->core.input_style;
+    XimDefICValues      ic_values;
+    INT16               len;
+    CARD16             *buf_s;
+    char               *tmp;
+    CARD32              tmp_buf32[BUFSIZE/4];
+    char               *tmp_buf = (char *)tmp_buf32;
+    char               *buf;
+    int                         buf_size;
+    char               *data;
+    int                         data_len;
+    int                         ret_len;
+    int                         total;
+    int                         idx;
+    CARD32              reply32[BUFSIZE/4];
+    char               *reply = (char *)reply32;
+    XPointer            preply;
+    int                         ret_code;
+
+    if (!(save_ic = (Xic)Xmalloc(sizeof(XicRec))))
+       return False;
+    memcpy((char *)save_ic, (char *)ic, sizeof(XicRec));
+
+    ic->core.filter_events = im->private.proto.forward_event_mask;
+    ic->private.proto.forward_event_mask =
+                               im->private.proto.forward_event_mask;
+    ic->private.proto.synchronous_event_mask =
+                               im->private.proto.synchronous_event_mask;
+
+    num = im->core.ic_num_resources;
+    buf_size = sizeof(XIMResource) * num;
+    if (!(res = (XIMResourceList)Xmalloc(buf_size)))
+       goto ErrorOnReCreateIC;
+    (void)memcpy((char *)res, (char *)im->core.ic_resources, buf_size);
+    ic->private.proto.ic_resources     = res;
+    ic->private.proto.ic_num_resources = num;
+
+    num = im->private.proto.ic_num_inner_resources;
+    buf_size = sizeof(XIMResource) * num;
+    if (!(res = (XIMResourceList)Xmalloc(buf_size)))
+       goto ErrorOnReCreateIC;
+    (void)memcpy((char *)res,
+                       (char *)im->private.proto.ic_inner_resources, buf_size);
+    ic->private.proto.ic_inner_resources     = res;
+    ic->private.proto.ic_num_inner_resources = num;
+
+    _XimSetICMode(ic->private.proto.ic_resources,
+                       ic->private.proto.ic_num_resources, input_style);
+
+    _XimSetICMode(ic->private.proto.ic_inner_resources,
+                       ic->private.proto.ic_num_inner_resources, input_style);
+
+    _XimGetCurrentICValues(ic, &ic_values);
+    buf = tmp_buf;
+    buf_size = XIM_HEADER_SIZE + sizeof(CARD16) + sizeof(INT16);
+    data_len = BUFSIZE - buf_size;
+    total = 0;
+    idx = 0;
+    for (;;) {
+       data = &buf[buf_size];
+       if (!_XimEncodeSavedICATTRIBUTE(ic, ic->private.proto.ic_resources,
+               ic->private.proto.ic_num_resources, &idx, data, data_len,
+               &ret_len, (XPointer)&ic_values, XIM_CREATEIC)) {
+           if (buf != tmp_buf)
+               Xfree(buf);
+           goto ErrorOnReCreateIC;
+       }
+
+       total += ret_len;
+       if (idx == -1) {
+           break;
+       }
+
+       buf_size += ret_len;
+       if (buf == tmp_buf) {
+           if (!(tmp = (char *)Xmalloc(buf_size + data_len))) {
+               goto ErrorOnReCreateIC;
+           }
+           memcpy(tmp, buf, buf_size);
+           buf = tmp;
+       } else {
+           if (!(tmp = (char *)Xrealloc(buf, (buf_size + data_len)))) {
+               Xfree(buf);
+               goto ErrorOnReCreateIC;
+           }
+           buf = tmp;
+       }
+    }
+
+    buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
+    buf_s[0] = im->private.proto.imid;
+    buf_s[1] = (INT16)total;
+
+    len = (INT16)(sizeof(CARD16) + sizeof(INT16) + total);
+    _XimSetHeader((XPointer)buf, XIM_CREATE_IC, 0, &len);
+    if (!(_XimWrite(im, len, (XPointer)buf))) {
+       if (buf != tmp_buf)
+           Xfree(buf);
+       goto ErrorOnReCreateIC;
+    }
+    _XimFlush(im);
+    if (buf != tmp_buf)
+       Xfree(buf);
+    ic->private.proto.waitCallback = True;
+    buf_size = BUFSIZE;
+    ret_code = _XimRead(im, &len, (XPointer)reply, buf_size,
+                                                _XimCreateICCheck, 0);
+    if (ret_code == XIM_TRUE) {
+       preply = reply;
+    } else if (ret_code == XIM_OVERFLOW) {
+       if (len <= 0) {
+           preply = reply;
+       } else {
+           buf_size = (int)len;
+           preply = (XPointer)Xmalloc(buf_size);
+           ret_code = _XimRead(im, &len, preply, buf_size,
+                                                _XimCreateICCheck, 0);
+           if (ret_code != XIM_TRUE) {
+               Xfree(preply);
+               ic->private.proto.waitCallback = False;
+               goto ErrorOnReCreateIC;
+           }
+       }
+    } else {
+       ic->private.proto.waitCallback = False;
+       goto ErrorOnReCreateIC;
+    }
+    ic->private.proto.waitCallback = False;
+    buf_s = (CARD16 *)((char *)preply + XIM_HEADER_SIZE);
+    if (*((CARD8 *)preply) == XIM_ERROR) {
+       _XimProcError(im, 0, (XPointer)&buf_s[3]);
+       if (reply != preply)
+           Xfree(preply);
+       goto ErrorOnReCreateIC;
+    }
+
+    ic->private.proto.icid = buf_s[1];         /* icid */
+    if (reply != preply)
+       Xfree(preply);
+
+    _XimRegisterFilter(ic);
+    MARK_IC_CONNECTED(ic);
+    if (save_ic->private.proto.ic_resources)
+       Xfree(save_ic->private.proto.ic_resources);
+    if (save_ic->private.proto.ic_inner_resources)
+       Xfree(save_ic->private.proto.ic_inner_resources);
+    Xfree(save_ic);
+    return True;
+
+ErrorOnReCreateIC:
+    memcpy((char *)ic, (char *)save_ic, sizeof(XicRec));
+    Xfree(save_ic);
+    return False;
+}
+
+Private char *
+_XimDelayModeGetICValues(ic, arg)
+    Xic                         ic;
+    XIMArg             *arg;
+{
+    XimDefICValues      ic_values;
+
+    _XimGetCurrentICValues(ic, &ic_values);
+    return  _XimGetICValueData(ic, (XPointer)&ic_values,
+                               ic->private.proto.ic_resources,
+                               ic->private.proto.ic_num_resources,
+                               arg, XIM_GETICVALUES);
+}
+#endif /* XIM_CONNECTABLE */
+
+Private Bool
+_XimGetICValuesCheck(
+    Xim          im,
+    INT16        len,
+    XPointer    data,
+    XPointer     arg)
+{
+    Xic                 ic = (Xic)arg;
+    CARD16     *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
+    CARD8       major_opcode = *((CARD8 *)data);
+    CARD8       minor_opcode = *((CARD8 *)data + 1);
+    XIMID       imid = buf_s[0];
+    XICID       icid = buf_s[1];
+
+    if ((major_opcode == XIM_GET_IC_VALUES_REPLY)
+     && (minor_opcode == 0)
+     && (imid == im->private.proto.imid)
+     && (icid == ic->private.proto.icid))
+       return True;
+    if ((major_opcode == XIM_ERROR)
+     && (minor_opcode == 0)
+     && (buf_s[2] & XIM_IMID_VALID)
+     && (imid == im->private.proto.imid)
+     && (buf_s[2] & XIM_ICID_VALID)
+     && (icid == ic->private.proto.icid))
+       return True;
+    return False;
+}
+
+Private char *
+_XimProtoGetICValues(
+    XIC                         xic,
+    XIMArg             *arg)
+{
+    Xic                         ic = (Xic)xic;
+    Xim                         im = (Xim)ic->core.im;
+    register XIMArg    *p;
+    register XIMArg    *pp;
+    register int        n;
+    CARD8              *buf;
+    CARD16             *buf_s;
+    INT16               len;
+    CARD32              reply32[BUFSIZE/4];
+    char               *reply = (char *)reply32;
+    XPointer            preply = NULL;
+    int                         buf_size;
+    int                         ret_code;
+    char               *makeid_name;
+    char               *decode_name;
+    CARD16             *data = NULL;
+    INT16               data_len = 0;
+
+#ifndef XIM_CONNECTABLE
+    if (!IS_IC_CONNECTED(ic))
+       return arg->name;
+#else
+    if (!IS_IC_CONNECTED(ic)) {
+       if (IS_CONNECTABLE(im)) {
+           if (_XimConnectServer(im)) {
+               if (!_XimReCreateIC(ic)) {
+                   _XimDelayModeSetAttr(im);
+                   return _XimDelayModeGetICValues(ic, arg);
+               }
+           } else {
+               return _XimDelayModeGetICValues(ic, arg);
+           }
+        } else {
+           return arg->name;
+        }
+    }
+#endif /* XIM_CONNECTABLE */
+
+    for (n = 0, p = arg; p && p->name; p++) {
+       n++;
+       if ((strcmp(p->name, XNPreeditAttributes) == 0)
+        || (strcmp(p->name, XNStatusAttributes) == 0)) {
+            n++;
+            for (pp = (XIMArg *)p->value; pp && pp->name; pp++)
+               n++;
+       }
+    }
+
+    if (!n)
+       return (char *)NULL;
+
+    buf_size =  sizeof(CARD16) * n;
+    buf_size += XIM_HEADER_SIZE
+            + sizeof(CARD16)
+            + sizeof(CARD16)
+            + sizeof(INT16)
+            + XIM_PAD(2 + buf_size);
+
+    if (!(buf = (CARD8 *)Xmalloc(buf_size)))
+       return arg->name;
+    buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
+
+    makeid_name = _XimMakeICAttrIDList(ic, ic->private.proto.ic_resources,
+                               ic->private.proto.ic_num_resources, arg,
+                               &buf_s[3], &len, XIM_GETICVALUES);
+
+    if (len > 0) {
+       buf_s[0] = im->private.proto.imid;              /* imid */
+       buf_s[1] = ic->private.proto.icid;              /* icid */
+       buf_s[2] = len;                         /* length of ic-attr-id */
+       len += sizeof(INT16);                       /* sizeof length of attr */
+       XIM_SET_PAD(&buf_s[2], len);            /* pad */
+       len += sizeof(CARD16)                   /* sizeof imid */
+            + sizeof(CARD16);                  /* sizeof icid */
+
+       _XimSetHeader((XPointer)buf, XIM_GET_IC_VALUES, 0, &len);
+       if (!(_XimWrite(im, len, (XPointer)buf))) {
+           Xfree(buf);
+           return arg->name;
+       }
+       _XimFlush(im);
+       Xfree(buf);
+       buf_size = BUFSIZE;
+       ret_code = _XimRead(im, &len, (XPointer)reply, buf_size,
+                                _XimGetICValuesCheck, (XPointer)ic);
+       if (ret_code == XIM_TRUE) {
+           preply = reply;
+       } else if (ret_code == XIM_OVERFLOW) {
+           if (len <= 0) {
+               preply = reply;
+           } else {
+               buf_size = (int)len;
+               preply = (XPointer)Xmalloc(len);
+               ret_code = _XimRead(im, &len, preply, buf_size,
+                               _XimGetICValuesCheck, (XPointer)ic);
+               if (ret_code != XIM_TRUE) {
+                   if (preply != reply)
+                       Xfree(preply);
+                   return arg->name;
+               }
+           }
+       } else {
+           return arg->name;
+       }
+       buf_s = (CARD16 *)((char *)preply + XIM_HEADER_SIZE);
+       if (*((CARD8 *)preply) == XIM_ERROR) {
+           _XimProcError(im, 0, (XPointer)&buf_s[3]);
+           if (reply != preply)
+               Xfree(preply);
+           return arg->name;
+       }
+       data = &buf_s[4];
+       data_len = buf_s[2];
+    }
+    else if (len < 0) {
+       return arg->name;
+    }
+
+    decode_name = _XimDecodeICATTRIBUTE(ic, ic->private.proto.ic_resources,
+                       ic->private.proto.ic_num_resources, data, data_len,
+                       arg, XIM_GETICVALUES);
+    if (reply != preply)
+       Xfree(preply);
+
+    if (decode_name)
+       return decode_name;
+    else
+       return makeid_name;
+}
+
+#ifdef XIM_CONNECTABLE
+Private Bool
+_XimCheckNestQuarkList(quark_list, num_quark, quark, separator)
+    XrmQuark           *quark_list;
+    int                         num_quark;
+    XrmQuark            quark;
+    XrmQuark            separator;
+{
+    register int        i;
+
+    for (i = 0; i < num_quark; i++) {
+       if (quark_list[i] == separator) {
+           break;
+       }
+       if (quark_list[i] == quark) {
+           return True;
+       }
+    }
+    return False;
+}
+
+Private Bool
+_XimCheckNestedQuarkList(quark_list, idx, num_quark, arg, separator)
+    XrmQuark           **quark_list;
+    int                          idx;
+    int                         *num_quark;
+    XIMArg              *arg;
+    XrmQuark             separator;
+{
+    XrmQuark            *q_list = *quark_list;
+    int                          n_quark = *num_quark;
+    register XIMArg     *p;
+    XrmQuark             quark;
+    XrmQuark            *tmp;
+    register int         i;
+
+    for (p = arg; p && p->name; p++) {
+       quark = XrmStringToQuark(p->name);
+       if (_XimCheckNestQuarkList(&q_list[idx], n_quark - idx,
+                                                       quark, separator)) {
+           continue;
+       }
+       if (!(tmp = (XrmQuark *)Xmalloc((sizeof(XrmQuark) * (n_quark + 1))))) {
+           *quark_list = q_list;
+           *num_quark = n_quark;
+           return False;
+       }
+       n_quark++;
+       for (i = 0; i < idx; i++) {
+           tmp[i] = q_list[i];
+       }
+       tmp[i] = quark;
+       for (i = idx  + 1; i < n_quark; i++) {
+           tmp[i] = q_list[i - 1];
+       }
+       q_list = tmp;
+    }
+    *quark_list = q_list;
+    *num_quark = n_quark;
+    return True;
+}
+
+Private Bool
+_XimCheckICQuarkList(quark_list, num_quark, quark, idx)
+    XrmQuark           *quark_list;
+    int                         num_quark;
+    XrmQuark            quark;
+    int                        *idx;
+{
+    register int        i;
+
+    for (i = 0; i < num_quark; i++) {
+       if (quark_list[i] == quark) {
+           *idx = i;
+           return True;
+       }
+    }
+    return False;
+}
+
+Private Bool
+_XimSaveICValues(ic, arg)
+    Xic                         ic;
+    XIMArg             *arg;
+{
+    register XIMArg    *p;
+    register int        n;
+    XrmQuark           *quark_list;
+    XrmQuark           *tmp;
+    XrmQuark            quark;
+    int                         num_quark;
+    XrmQuark            pre_quark;
+    XrmQuark            sts_quark;
+    XrmQuark            separator;
+    int                         idx;
+
+    pre_quark = XrmStringToQuark(XNPreeditAttributes);
+    sts_quark = XrmStringToQuark(XNStatusAttributes);
+    separator = XrmStringToQuark(XNSeparatorofNestedList);
+
+    if (quark_list = ic->private.proto.saved_icvalues) {
+       num_quark = ic->private.proto.num_saved_icvalues;
+       for (p = arg; p && p->name; p++) {
+           quark = XrmStringToQuark(p->name);
+           if ((quark == pre_quark) || (quark == sts_quark)) {
+               if (!_XimCheckICQuarkList(quark_list, num_quark, quark, &idx)) {
+                   register XIMArg     *pp;
+                   int                  nn;
+                   XrmQuark            *q_list;
+
+                   for (pp = (XIMArg *)p->value, nn = 0;
+                                               pp && pp->name; pp++, nn++);
+                   if (!(tmp = (XrmQuark *)Xrealloc(quark_list,
+                               (sizeof(XrmQuark) * (num_quark + nn + 2))))) {
+                       ic->private.proto.saved_icvalues = quark_list;
+                       ic->private.proto.num_saved_icvalues = num_quark;
+                       return False;
+                   }
+                   quark_list = tmp;
+                   q_list = &quark_list[num_quark];
+                   num_quark += nn + 2;
+                   *q_list++ = quark;
+                   for (pp = (XIMArg *)p->value;
+                                       pp && pp->name; pp++, quark_list++) {
+                       *q_list = XrmStringToQuark(pp->name);
+                   }
+                   *q_list = separator;
+               } else {
+                   if (!_XimCheckNestedQuarkList(&quark_list, idx + 1,
+                               &num_quark, (XIMArg *)p->value, separator)) {
+                       ic->private.proto.saved_icvalues = quark_list;
+                       ic->private.proto.num_saved_icvalues = num_quark;
+                       return False;
+                   }
+               }
+           } else {
+               if (_XimCheckICQuarkList(quark_list, num_quark, quark, &idx)) {
+                   continue;
+               }
+               if (!(tmp = (XrmQuark *)Xrealloc(quark_list,
+                               (sizeof(XrmQuark) * (num_quark + 1))))) {
+                   ic->private.proto.saved_icvalues = quark_list;
+                   ic->private.proto.num_saved_icvalues = num_quark;
+                   return False;
+               }
+               quark_list = tmp;
+               quark_list[num_quark] = quark;
+               num_quark++;
+           }
+       }
+       ic->private.proto.saved_icvalues = quark_list;
+       ic->private.proto.num_saved_icvalues = num_quark;
+       return True;
+    }
+
+    for (p = arg, n = 0; p && p->name; p++, n++) {
+       if ((!strcmp(p->name, XNPreeditAttributes))
+        || (!strcmp(p->name, XNStatusAttributes))) {
+           register XIMArg     *pp;
+           int                  nn;
+
+           for (pp = (XIMArg *)p->value, nn = 0; pp && pp->name; pp++, nn++);
+           n += nn + 1;
+       }
+    }
+
+    if (!(quark_list = (XrmQuark *)Xmalloc(sizeof(XrmQuark) * n))) {
+       return False;
+    }
+
+    ic->private.proto.saved_icvalues = quark_list;
+    ic->private.proto.num_saved_icvalues = n;
+    for (p = arg; p && p->name; p++, quark_list++) {
+       *quark_list = XrmStringToQuark(p->name);
+       if ((*quark_list == pre_quark) || (*quark_list == sts_quark)) {
+           register XIMArg     *pp;
+
+           quark_list++;
+           for (pp = (XIMArg *)p->value; pp && pp->name; pp++, quark_list++) {
+               *quark_list = XrmStringToQuark(pp->name);
+           }
+           *quark_list = separator;
+       }
+    }
+    return True;
+}
+
+Private char *
+_XimDelayModeSetICValues(ic, arg)
+    Xic                         ic;
+    XIMArg             *arg;
+{
+    XimDefICValues      ic_values;
+    char               *name;
+
+    _XimGetCurrentICValues(ic, &ic_values);
+    name = _XimSetICValueData(ic, (XPointer)&ic_values,
+                       ic->private.proto.ic_resources,
+                       ic->private.proto.ic_num_resources,
+                       arg, XIM_SETICVALUES, False);
+    _XimSetCurrentICValues(ic, &ic_values);
+    return name;
+}
+#endif /* XIM_CONNECTABLE */
+
+Private Bool
+_XimSetICValuesCheck(
+    Xim          im,
+    INT16        len,
+    XPointer    data,
+    XPointer     arg)
+{
+    Xic                 ic = (Xic)arg;
+    CARD16     *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
+    CARD8       major_opcode = *((CARD8 *)data);
+    CARD8       minor_opcode = *((CARD8 *)data + 1);
+    XIMID       imid = buf_s[0];
+    XICID       icid = buf_s[1];
+
+    if ((major_opcode == XIM_SET_IC_VALUES_REPLY)
+     && (minor_opcode == 0)
+     && (imid == im->private.proto.imid)
+     && (icid == ic->private.proto.icid))
+       return True;
+    if ((major_opcode == XIM_ERROR)
+     && (minor_opcode == 0)
+     && (buf_s[2] & XIM_IMID_VALID)
+     && (imid == im->private.proto.imid)
+     && (buf_s[2] & XIM_ICID_VALID)
+     && (icid == ic->private.proto.icid))
+       return True;
+    return False;
+}
+
+Private char *
+_XimProtoSetICValues(
+    XIC                         xic,
+    XIMArg             *arg)
+{
+    Xic                         ic = (Xic)xic;
+    Xim                         im = (Xim)ic->core.im;
+    XimDefICValues      ic_values;
+    INT16               len;
+    CARD16             *buf_s;
+    char               *tmp;
+    CARD32              tmp_buf32[BUFSIZE/4];
+    char               *tmp_buf = (char *)tmp_buf32;
+    char               *buf;
+    int                         buf_size;
+    char               *data;
+    int                         data_len;
+    int                         ret_len;
+    int                         total;
+    XIMArg             *arg_ret;
+    CARD32              reply32[BUFSIZE/4];
+    char               *reply = (char *)reply32;
+    XPointer            preply = NULL;
+    int                         ret_code;
+    BITMASK32           flag = 0L;
+    char               *name;
+    char               *tmp_name = (arg) ? arg->name : NULL;
+
+#ifndef XIM_CONNECTABLE
+    if (!IS_IC_CONNECTED(ic))
+       return tmp_name;
+#else
+    if (!_XimSaveICValues(ic, arg))
+       return NULL;
+
+    if (!IS_IC_CONNECTED(ic)) {
+       if (IS_CONNECTABLE(im)) {
+           if (_XimConnectServer(im)) {
+               if (!_XimReCreateIC(ic)) {
+                   _XimDelayModeSetAttr(im);
+                   return _XimDelayModeSetICValues(ic, arg);
+               }
+           } else {
+               return _XimDelayModeSetICValues(ic, arg);
+           }
+        } else {
+           return tmp_name;
+        }
+    }
+#endif /* XIM_CONNECTABLE */
+
+    _XimGetCurrentICValues(ic, &ic_values);
+    buf = tmp_buf;
+    buf_size = XIM_HEADER_SIZE
+       + sizeof(CARD16) + sizeof(CARD16) + sizeof(INT16) + sizeof(CARD16);
+    data_len = BUFSIZE - buf_size;
+    total = 0;
+    arg_ret = arg;
+    for (;;) {
+       data = &buf[buf_size];
+       if ((name = _XimEncodeICATTRIBUTE(ic, ic->private.proto.ic_resources,
+                       ic->private.proto.ic_num_resources, arg, &arg_ret,
+                       data, data_len, &ret_len, (XPointer)&ic_values,
+                       &flag, XIM_SETICVALUES))) {
+           break;
+       }
+
+       total += ret_len;
+       if (!(arg = arg_ret)) {
+           break;
+       }
+
+       buf_size += ret_len;
+       if (buf == tmp_buf) {
+           if (!(tmp = (char *)Xmalloc(buf_size + data_len))) {
+               return tmp_name;
+           }
+           memcpy(tmp, buf, buf_size);
+           buf = tmp;
+       } else {
+           if (!(tmp = (char *)Xrealloc(buf, (buf_size + data_len)))) {
+               Xfree(buf);
+               return tmp_name;
+           }
+           buf = tmp;
+       }
+    }
+    _XimSetCurrentICValues(ic, &ic_values);
+
+    if (!total) {
+        return tmp_name;
+    }
+
+    buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
+
+#ifdef EXT_MOVE
+    if (_XimExtenMove(im, ic, flag, &buf_s[4], (INT16)total))
+       return name;
+#endif
+
+    buf_s[0] = im->private.proto.imid;
+    buf_s[1] = ic->private.proto.icid;
+    buf_s[2] = (INT16)total;
+    buf_s[3] = 0;
+    len = (INT16)(sizeof(CARD16) + sizeof(CARD16)
+                               + sizeof(INT16) + sizeof(CARD16) + total);
+
+    _XimSetHeader((XPointer)buf, XIM_SET_IC_VALUES, 0, &len);
+    if (!(_XimWrite(im, len, (XPointer)buf))) {
+       if (buf != tmp_buf)
+           Xfree(buf);
+       return tmp_name;
+    }
+    _XimFlush(im);
+    if (buf != tmp_buf)
+       Xfree(buf);
+    ic->private.proto.waitCallback = True;
+    buf_size = BUFSIZE;
+    ret_code = _XimRead(im, &len, (XPointer)reply, buf_size,
+                                       _XimSetICValuesCheck, (XPointer)ic);
+    if (ret_code == XIM_TRUE) {
+       preply = reply;
+    } else if (ret_code == XIM_OVERFLOW) {
+       buf_size = (int)len;
+       preply = (XPointer)Xmalloc(buf_size);
+       ret_code = _XimRead(im, &len, preply, buf_size,
+                                       _XimSetICValuesCheck, (XPointer)ic);
+       if (ret_code != XIM_TRUE) {
+           Xfree(preply);
+           ic->private.proto.waitCallback = False;
+           return tmp_name;
+       }
+    } else {
+       ic->private.proto.waitCallback = False;
+       return tmp_name;
+    }
+    ic->private.proto.waitCallback = False;
+    buf_s = (CARD16 *)((char *)preply + XIM_HEADER_SIZE);
+    if (*((CARD8 *)preply) == XIM_ERROR) {
+       _XimProcError(im, 0, (XPointer)&buf_s[3]);
+       if (reply != preply)
+           Xfree(preply);
+       return tmp_name;
+    }
+    if (reply != preply)
+       Xfree(preply);
+
+    return name;
+}
+
+Private Bool
+_XimDestroyICCheck(
+    Xim          im,
+    INT16        len,
+    XPointer    data,
+    XPointer     arg)
+{
+    Xic                 ic = (Xic)arg;
+    CARD16     *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
+    CARD8       major_opcode = *((CARD8 *)data);
+    CARD8       minor_opcode = *((CARD8 *)data + 1);
+    XIMID       imid = buf_s[0];
+    XICID       icid = buf_s[1];
+    Bool        ret = False;
+
+    if ((major_opcode == XIM_DESTROY_IC_REPLY)
+     && (minor_opcode == 0)
+     && (imid == im->private.proto.imid)
+     && (icid == ic->private.proto.icid))
+       ret = True;
+    if ((major_opcode == XIM_ERROR)
+     && (minor_opcode == 0)
+     && (buf_s[2] & XIM_IMID_VALID)
+     && (imid == im->private.proto.imid)
+     && (buf_s[2] & XIM_ICID_VALID)
+     && (icid == ic->private.proto.icid))
+    ret = False;
+    return ret;
+}
+
+Private void
+_XimProtoICFree(
+    Xic                 ic)
+{
+#ifdef XIM_CONNECTABLE
+    Xim                 im = (Xim)ic->core.im;
+#endif
+
+    if (ic->private.proto.preedit_font) {
+       Xfree(ic->private.proto.preedit_font);
+       ic->private.proto.preedit_font = NULL;
+    }
+    if (ic->private.proto.status_font) {
+       Xfree(ic->private.proto.status_font);
+       ic->private.proto.status_font = NULL;
+    }
+    if (ic->private.proto.commit_info) {
+       _XimFreeCommitInfo(ic);
+       ic->private.proto.commit_info = NULL;
+    }
+    if (ic->private.proto.ic_inner_resources) {
+       Xfree(ic->private.proto.ic_inner_resources);
+       ic->private.proto.ic_inner_resources = NULL;
+    }
+
+#ifdef XIM_CONNECTABLE
+    if (IS_SERVER_CONNECTED(im) && IS_RECONNECTABLE(im)) {
+       return;
+    }
+#endif /* XIM_CONNECTABLE */
+
+    if (ic->private.proto.saved_icvalues) {
+       Xfree(ic->private.proto.saved_icvalues);
+       ic->private.proto.saved_icvalues = NULL;
+    }
+    if (ic->private.proto.ic_resources) {
+       Xfree(ic->private.proto.ic_resources);
+       ic->private.proto.ic_resources = NULL;
+    }
+    if (ic->core.hotkey) {
+       Xfree(ic->core.hotkey);
+       ic->core.hotkey = NULL;
+    }
+
+    return;
+}
+
+Private void
+_XimProtoDestroyIC(
+    XIC                 xic)
+{
+    Xic                 ic = (Xic)xic;
+    Xim                 im = (Xim)ic->core.im;
+    CARD32      buf32[BUFSIZE/4];
+    CARD8      *buf = (CARD8 *)buf32;
+    CARD16     *buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
+    INT16       len;
+    CARD32      reply32[BUFSIZE/4];
+    char       *reply = (char *)reply32;
+    XPointer    preply;
+    int                 buf_size;
+    int                 ret_code;
+
+    if (IS_SERVER_CONNECTED(im)) {
+       buf_s[0] = im->private.proto.imid;              /* imid */
+       buf_s[1] = ic->private.proto.icid;              /* icid */
+
+       len = sizeof(CARD16)                    /* sizeof imid */
+           + sizeof(CARD16);                   /* sizeof icid */
+
+       _XimSetHeader((XPointer)buf, XIM_DESTROY_IC, 0, &len);
+       (void)_XimWrite(im, len, (XPointer)buf);
+       _XimFlush(im);
+       buf_size = BUFSIZE;
+       ret_code = _XimRead(im, &len, (XPointer)reply, buf_size,
+                                       _XimDestroyICCheck, (XPointer)ic);
+       if (ret_code == XIM_OVERFLOW) {
+           buf_size = len;
+           preply = (XPointer)Xmalloc(buf_size);
+           (void)_XimRead(im, &len, preply, buf_size,
+                                       _XimDestroyICCheck, (XPointer)ic);
+           Xfree(preply);
+       }
+    }
+    UNMARK_IC_CONNECTED(ic);
+    _XimUnregisterFilter(ic);
+    _XimProtoICFree(ic);
+    return;
+}
+
+Private void
+_XimProtoSetFocus(
+    XIC                 xic)
+{
+    Xic                 ic = (Xic)xic;
+    Xim                 im = (Xim)ic->core.im;
+    CARD32      buf32[BUFSIZE/4];
+    CARD8      *buf = (CARD8 *)buf32;
+    CARD16     *buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
+    INT16       len;
+
+#ifndef XIM_CONNECTABLE
+    if (!IS_IC_CONNECTED(ic))
+       return;
+#else
+    if (!IS_IC_CONNECTED(ic)) {
+       if (IS_CONNECTABLE(im)) {
+           if (_XimConnectServer(im)) {
+               if (!_XimReCreateIC(ic)) {
+                   _XimDelayModeSetAttr(im);
+                   return;
+               }
+           } else {
+               return;
+           }
+       } else {
+           return;
+       }
+    }
+#endif /* XIM_CONNECTABLE */
+
+    buf_s[0] = im->private.proto.imid;         /* imid */
+    buf_s[1] = ic->private.proto.icid;         /* icid */
+
+    len = sizeof(CARD16)                       /* sizeof imid */
+       + sizeof(CARD16);                       /* sizeof icid */
+
+    _XimSetHeader((XPointer)buf, XIM_SET_IC_FOCUS, 0, &len);
+    (void)_XimWrite(im, len, (XPointer)buf);
+    _XimFlush(im);
+
+    _XimRegisterFilter(ic);
+    return;
+}
+
+Private void
+_XimProtoUnsetFocus(
+    XIC                 xic)
+{
+    Xic                 ic = (Xic)xic;
+    Xim                 im = (Xim)ic->core.im;
+    CARD32      buf32[BUFSIZE/4];
+    CARD8      *buf = (CARD8 *)buf32;
+    CARD16     *buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
+    INT16       len;
+
+#ifndef XIM_CONNECTABLE
+    if (!IS_IC_CONNECTED(ic))
+       return;
+#else
+    if (!IS_IC_CONNECTED(ic)) {
+       if (IS_CONNECTABLE(im)) {
+           if (_XimConnectServer(im)) {
+               if (!_XimReCreateIC(ic)) {
+                   _XimDelayModeSetAttr(im);
+                   return;
+               }
+           } else {
+               return;
+           }
+       } else {
+           return;
+       }
+    }
+#endif /* XIM_CONNECTABLE */
+
+    buf_s[0] = im->private.proto.imid;         /* imid */
+    buf_s[1] = ic->private.proto.icid;         /* icid */
+
+    len = sizeof(CARD16)                       /* sizeof imid */
+       + sizeof(CARD16);                       /* sizeof icid */
+
+    _XimSetHeader((XPointer)buf, XIM_UNSET_IC_FOCUS, 0, &len);
+    (void)_XimWrite(im, len, (XPointer)buf);
+    _XimFlush(im);
+
+    _XimUnregisterFilter(ic);
+    return;
+}
+
+Private Bool
+_XimResetICCheck(
+    Xim          im,
+    INT16        len,
+    XPointer    data,
+    XPointer     arg)
+{
+    Xic                 ic = (Xic)arg;
+    CARD16     *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
+    CARD8       major_opcode = *((CARD8 *)data);
+    CARD8       minor_opcode = *((CARD8 *)data + 1);
+    XIMID       imid = buf_s[0];
+    XICID       icid = buf_s[1];
+
+    if ((major_opcode == XIM_RESET_IC_REPLY)
+     && (minor_opcode == 0)
+     && (imid == im->private.proto.imid)
+     && (icid == ic->private.proto.icid))
+       return True;
+    if ((major_opcode == XIM_ERROR)
+     && (minor_opcode == 0)
+     && (buf_s[2] & XIM_IMID_VALID)
+     && (imid == im->private.proto.imid)
+     && (buf_s[2] & XIM_ICID_VALID)
+     && (icid == ic->private.proto.icid))
+       return True;
+    return False;
+}
+
+Private char *
+_XimProtoReset(
+    XIC                 xic,
+    char *     (*retfunc) (Xim im, Xic ic, XPointer buf) )
+{
+    Xic                 ic = (Xic)xic;
+    Xim                 im = (Xim)ic->core.im;
+    CARD32      buf32[BUFSIZE/4];
+    CARD8      *buf = (CARD8 *)buf32;
+    CARD16     *buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
+    INT16       len;
+    CARD32      reply32[BUFSIZE/4];
+    char       *reply = (char *)reply32;
+    XPointer    preply;
+    int                 buf_size;
+    int                 ret_code;
+    char       *commit;
+
+    if (!IS_IC_CONNECTED(ic))
+       return (char *)NULL;
+
+    buf_s[0] = im->private.proto.imid;         /* imid */
+    buf_s[1] = ic->private.proto.icid;         /* icid */
+
+    len = sizeof(CARD16)                       /* sizeof imid */
+       + sizeof(CARD16);                       /* sizeof icid */
+
+    _XimSetHeader((XPointer)buf, XIM_RESET_IC, 0, &len);
+    if (!(_XimWrite(im, len, (XPointer)buf)))
+       return NULL;
+    _XimFlush(im);
+    ic->private.proto.waitCallback = True;
+    buf_size = BUFSIZE;
+    ret_code = _XimRead(im, &len, (XPointer)reply, buf_size,
+                                       _XimResetICCheck, (XPointer)ic);
+    if (ret_code == XIM_TRUE) {
+       preply = reply;
+    } else if (ret_code == XIM_OVERFLOW) {
+       if (len < 0) {
+           preply = reply;
+       } else {
+           buf_size = len;
+           preply = (XPointer)Xmalloc(buf_size);
+           ret_code = _XimRead(im, &len, preply, buf_size,
+                                       _XimResetICCheck, (XPointer)ic);
+           if (ret_code != XIM_TRUE) {
+               Xfree(preply);
+               ic->private.proto.waitCallback = False;
+               return NULL;
+           }
+       }
+    } else {
+       ic->private.proto.waitCallback = False;
+       return NULL;
+    }
+    ic->private.proto.waitCallback = False;
+    buf_s = (CARD16 *)((char *)preply + XIM_HEADER_SIZE);
+    if (*((CARD8 *)preply) == XIM_ERROR) {
+       _XimProcError(im, 0, (XPointer)&buf_s[3]);
+       if (reply != preply)
+           free(preply);
+       return NULL;
+    }
+
+    commit = retfunc(im, ic, (XPointer)&buf_s[2]);
+
+    if (reply != preply)
+       Xfree(preply);
+    return commit;
+}
+
+Private char *
+_XimCommitedMbString(
+    Xim                         im,
+    Xic                         ic,
+    XPointer            buf)
+{
+    CARD16             *buf_s = (CARD16 *)buf;
+    XimCommitInfo       info;
+    int                         len;
+    int                         new_len;
+    char               *commit;
+    char               *new_commit = NULL;
+    char               *str;
+    Status              status;
+
+    len = 0;
+    for (info = ic->private.proto.commit_info; info; info = info->next)
+       len += info->string_len;
+    len += buf_s[0];
+    if ( len == 0 )
+       return( NULL );
+
+    if (!(commit = (char *)Xmalloc(len + 1)))
+       goto Error_On_Reset;
+
+    str = commit;
+    for (info = ic->private.proto.commit_info; info; info = info->next) {
+       (void)memcpy(str, info->string, info->string_len);
+       str += info->string_len;
+    }
+    (void)memcpy(str, (char *)&buf_s[1], buf_s[0]);
+    commit[len] = '\0';
+
+    new_len = im->methods->ctstombs((XIM)im, commit, len, NULL, 0, &status);
+    if (status != XLookupNone) {
+       if (!(new_commit = Xmalloc(new_len + 1))) {
+           Xfree(commit);
+           goto Error_On_Reset;
+       }
+       (void)im->methods->ctstombs((XIM)im, commit, len,
+                                               new_commit, new_len, NULL);
+       new_commit[new_len] = '\0';
+    }
+    Xfree(commit);
+
+Error_On_Reset:
+    _XimFreeCommitInfo( ic );
+    return new_commit;
+}
+
+Private char *
+_XimProtoMbReset(
+    XIC                 xic)
+{
+    return _XimProtoReset(xic, _XimCommitedMbString);
+}
+
+Private wchar_t *
+_XimCommitedWcString(
+    Xim                 im,
+    Xic                 ic,
+    XPointer    buf)
+{
+    CARD16             *buf_s = (CARD16 *)buf;
+    XimCommitInfo       info;
+    int                         len;
+    int                         new_len;
+    char               *commit;
+    wchar_t            *new_commit = (wchar_t *)NULL;
+    char               *str;
+    Status              status;
+
+    len = 0;
+    for (info = ic->private.proto.commit_info; info; info = info->next)
+       len += info->string_len;
+    len += buf_s[0];
+    if ( len == 0 )
+       return( (wchar_t *)NULL );
+
+    if (!(commit = (char *)Xmalloc(len + 1)))
+       goto Error_On_Reset;
+
+    str = commit;
+    for (info = ic->private.proto.commit_info; info; info = info->next) {
+       (void)memcpy(str, info->string, info->string_len);
+       str += info->string_len;
+    }
+    (void)memcpy(str, (char *)&buf_s[1], buf_s[0]);
+    commit[len] = '\0';
+
+    new_len = im->methods->ctstowcs((XIM)im, commit, len, NULL, 0, &status);
+    if (status != XLookupNone) {
+       if (!(new_commit =
+                    (wchar_t *)Xmalloc(sizeof(wchar_t) * (new_len + 1)))) {
+           Xfree(commit);
+           goto Error_On_Reset;
+       }
+       (void)im->methods->ctstowcs((XIM)im, commit, len,
+                                               new_commit, new_len, NULL);
+       new_commit[new_len] = (wchar_t)'\0';
+    }
+    Xfree(commit);
+
+Error_On_Reset:
+    _XimFreeCommitInfo( ic );
+    return new_commit;
+}
+
+Private wchar_t *
+_XimProtoWcReset(
+    XIC                 xic)
+{
+    return (wchar_t *) _XimProtoReset(xic,
+                       (char * (*) (Xim, Xic, XPointer)) _XimCommitedWcString);
+}
+
+Private char *
+_XimCommitedUtf8String(
+    Xim                         im,
+    Xic                         ic,
+    XPointer            buf)
+{
+    CARD16             *buf_s = (CARD16 *)buf;
+    XimCommitInfo       info;
+    int                         len;
+    int                         new_len;
+    char               *commit;
+    char               *new_commit = NULL;
+    char               *str;
+    Status              status;
+
+    len = 0;
+    for (info = ic->private.proto.commit_info; info; info = info->next)
+       len += info->string_len;
+    len += buf_s[0];
+    if ( len == 0 )
+       return( NULL );
+
+    if (!(commit = (char *)Xmalloc(len + 1)))
+       goto Error_On_Reset;
+
+    str = commit;
+    for (info = ic->private.proto.commit_info; info; info = info->next) {
+       (void)memcpy(str, info->string, info->string_len);
+       str += info->string_len;
+    }
+    (void)memcpy(str, (char *)&buf_s[1], buf_s[0]);
+    commit[len] = '\0';
+
+    new_len = im->methods->ctstoutf8((XIM)im, commit, len, NULL, 0, &status);
+    if (status != XLookupNone) {
+       if (!(new_commit = Xmalloc(new_len + 1))) {
+           Xfree(commit);
+           goto Error_On_Reset;
+       }
+       (void)im->methods->ctstoutf8((XIM)im, commit, len,
+                                               new_commit, new_len, NULL);
+       new_commit[new_len] = '\0';
+    }
+    Xfree(commit);
+
+Error_On_Reset:
+    _XimFreeCommitInfo( ic );
+    return new_commit;
+}
+
+Private char *
+_XimProtoUtf8Reset(
+    XIC                 xic)
+{
+    return _XimProtoReset(xic, _XimCommitedUtf8String);
+}
+
+Private XICMethodsRec ic_methods = {
+    _XimProtoDestroyIC,                /* destroy */
+    _XimProtoSetFocus,         /* set_focus */
+    _XimProtoUnsetFocus,       /* unset_focus */
+    _XimProtoSetICValues,      /* set_values */
+    _XimProtoGetICValues,      /* get_values */
+    _XimProtoMbReset,          /* mb_reset */
+    _XimProtoWcReset,          /* wc_reset */
+    _XimProtoUtf8Reset,                /* utf8_reset */
+    _XimProtoMbLookupString,   /* mb_lookup_string */
+    _XimProtoWcLookupString,   /* wc_lookup_string */
+    _XimProtoUtf8LookupString  /* utf8_lookup_string */
+};
+
+Private Bool
+_XimGetInputStyle(
+    XIMArg             *arg,
+    XIMStyle           *input_style)
+{
+    register XIMArg    *p;
+
+    for (p = arg; p && p->name; p++) {
+       if (!(strcmp(p->name, XNInputStyle))) {
+           *input_style = (XIMStyle)p->value;
+           return True;
+       }
+    }
+    return False;
+}
+
+#ifdef XIM_CONNECTABLE
+Private Bool
+_XimDelayModeCreateIC(
+    Xic                         ic,
+    XIMArg             *values,
+    XIMResourceList     res,
+    unsigned int        num)
+{
+    Xim                         im = (Xim)ic->core.im;
+    XimDefICValues      ic_values;
+    int                         len;
+    XIMStyle            input_style;
+
+    bzero((char *)&ic_values, sizeof(XimDefICValues));
+    _XimGetCurrentICValues(ic, &ic_values);
+    if (!(_XimGetInputStyle(values, &input_style)))
+       return False;
+
+    _XimSetICMode(res, num, input_style);
+
+    if (_XimSetICValueData(ic, (XPointer)&ic_values, res, num,
+                                       values, XIM_CREATEIC, False)) {
+       return False;
+    }
+    _XimSetCurrentICValues(ic, &ic_values);
+    if (!_XimSetICDefaults(ic, (XPointer)&ic_values,
+                                       XIM_SETICDEFAULTS, res, num)) {
+       return False;
+    }
+    ic_values.filter_events = KeyPressMask;
+    _XimSetCurrentICValues(ic, &ic_values);
+    _XimRegisterFilter(ic);
+
+    return True;
+}
+
+Public Bool
+_XimReconnectModeCreateIC(ic)
+    Xic                         ic;
+{
+    Xim                         im = (Xim)ic->core.im;
+    int                         len;
+    XIMStyle            input_style = ic->core.input_style;
+    XIMResourceList     res;
+    unsigned int        num;
+
+    num = im->core.ic_num_resources;
+    len = sizeof(XIMResource) * num;
+    if (!(res = (XIMResourceList)Xmalloc(len)))
+       return False;
+    (void)memcpy((char *)res, (char *)im->core.ic_resources, len);
+    ic->private.proto.ic_resources     = res;
+    ic->private.proto.ic_num_resources = num;
+
+    _XimSetICMode(res, num, input_style);
+
+    ic->core.filter_events = KeyPressMask;
+
+    return True;
+}
+#endif /* XIM_CONNECTABLE */
+
+Public XIC
+_XimProtoCreateIC(
+    XIM                         xim,
+    XIMArg             *arg)
+{
+    Xim                         im = (Xim)xim;
+    Xic                         ic;
+    XimDefICValues      ic_values;
+    XIMResourceList     res;
+    unsigned int         num;
+    XIMStyle            input_style;
+    INT16               len;
+    CARD16             *buf_s;
+    char               *tmp;
+    CARD32              tmp_buf32[BUFSIZE/4];
+    char               *tmp_buf = (char *)tmp_buf32;
+    char               *buf;
+    int                         buf_size;
+    char               *data;
+    int                         data_len;
+    int                         ret_len;
+    int                         total;
+    XIMArg             *arg_ret;
+    CARD32              reply32[BUFSIZE/4];
+    char               *reply = (char *)reply32;
+    XPointer            preply;
+    int                         ret_code;
+
+#ifdef XIM_CONNECTABLE
+    if (!IS_SERVER_CONNECTED(im) && !IS_CONNECTABLE(im))
+       return (XIC)NULL;
+#else
+    if (!IS_SERVER_CONNECTED(im))
+       return (XIC)NULL;
+#endif /* XIM_CONNECTABLE */
+
+    if (!(_XimGetInputStyle(arg, &input_style)))
+       return (XIC)NULL;
+
+    if ((ic = Xcalloc(1, sizeof(XicRec))) == (Xic)NULL)
+       return (XIC)NULL;
+
+    ic->methods = &ic_methods;
+    ic->core.im = (XIM)im;
+    ic->core.input_style = input_style;
+
+    num = im->core.ic_num_resources;
+    len = sizeof(XIMResource) * num;
+    if (!(res = (XIMResourceList)Xmalloc(len)))
+       goto ErrorOnCreatingIC;
+    (void)memcpy((char *)res, (char *)im->core.ic_resources, len);
+    ic->private.proto.ic_resources     = res;
+    ic->private.proto.ic_num_resources = num;
+
+#ifdef XIM_CONNECTABLE
+    if (!_XimSaveICValues(ic, arg))
+       return False;
+
+    if (!IS_SERVER_CONNECTED(im)) {
+       if (!_XimConnectServer(im)) {
+           if (_XimDelayModeCreateIC(ic, arg, res, num)) {
+               return (XIC)ic;
+           }
+           goto ErrorOnCreatingIC;
+       }
+    }
+#endif /* XIM_CONNECTABLE */
+
+    ic->core.filter_events = im->private.proto.forward_event_mask;
+    ic->private.proto.forward_event_mask =
+                               im->private.proto.forward_event_mask;
+    ic->private.proto.synchronous_event_mask =
+                               im->private.proto.synchronous_event_mask;
+
+    num = im->private.proto.ic_num_inner_resources;
+    len = sizeof(XIMResource) * num;
+    if (!(res = (XIMResourceList)Xmalloc(len)))
+       goto ErrorOnCreatingIC;
+    (void)memcpy((char *)res,
+                        (char *)im->private.proto.ic_inner_resources, len);
+    ic->private.proto.ic_inner_resources     = res;
+    ic->private.proto.ic_num_inner_resources = num;
+
+    _XimSetICMode(ic->private.proto.ic_resources,
+                       ic->private.proto.ic_num_resources, input_style);
+
+    _XimSetICMode(ic->private.proto.ic_inner_resources,
+                       ic->private.proto.ic_num_inner_resources, input_style);
+
+    _XimGetCurrentICValues(ic, &ic_values);
+    buf = tmp_buf;
+    buf_size = XIM_HEADER_SIZE + sizeof(CARD16) + sizeof(INT16);
+    data_len = BUFSIZE - buf_size;
+    total = 0;
+    arg_ret = arg;
+    for (;;) {
+       data = &buf[buf_size];
+       if (_XimEncodeICATTRIBUTE(ic, ic->private.proto.ic_resources,
+               ic->private.proto.ic_num_resources, arg, &arg_ret, data,
+               data_len, &ret_len, (XPointer)&ic_values, 0, XIM_CREATEIC)) {
+           goto ErrorOnCreatingIC;
+       }
+
+       total += ret_len;
+       if (!(arg = arg_ret)) {
+           break;
+       }
+
+       buf_size += ret_len;
+       if (buf == tmp_buf) {
+           if (!(tmp = (char *)Xmalloc(buf_size + data_len))) {
+               goto ErrorOnCreatingIC;
+           }
+           memcpy(tmp, buf, buf_size);
+           buf = tmp;
+       } else {
+           if (!(tmp = (char *)Xrealloc(buf, (buf_size + data_len)))) {
+               Xfree(buf);
+               goto ErrorOnCreatingIC;
+           }
+           buf = tmp;
+       }
+    }
+    _XimSetCurrentICValues(ic, &ic_values);
+
+    if (!(_XimCheckCreateICValues(ic->private.proto.ic_resources,
+                                       ic->private.proto.ic_num_resources)))
+       goto ErrorOnCreatingIC;
+
+    _XimRegisterFilter(ic);
+
+    buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
+    buf_s[0] = im->private.proto.imid;
+    buf_s[1] = (INT16)total;
+
+    len = (INT16)(sizeof(CARD16) + sizeof(INT16) + total);
+    _XimSetHeader((XPointer)buf, XIM_CREATE_IC, 0, &len);
+    if (!(_XimWrite(im, len, (XPointer)buf))) {
+       if (buf != tmp_buf)
+           Xfree(buf);
+       goto ErrorOnCreatingIC;
+    }
+    _XimFlush(im);
+    if (buf != tmp_buf)
+       Xfree(buf);
+    ic->private.proto.waitCallback = True;
+    buf_size = BUFSIZE;
+    ret_code = _XimRead(im, &len, (XPointer)reply, buf_size,
+                                                _XimCreateICCheck, 0);
+    if (ret_code == XIM_TRUE) {
+       preply = reply;
+    } else if (ret_code == XIM_OVERFLOW) {
+       if (len <= 0) {
+           preply = reply;
+       } else {
+           buf_size = (int)len;
+           preply = (XPointer)Xmalloc(buf_size);
+           ret_code = _XimRead(im, &len, preply, buf_size,
+                                                _XimCreateICCheck, 0);
+           if (ret_code != XIM_TRUE) {
+               Xfree(preply);
+               ic->private.proto.waitCallback = False;
+               goto ErrorOnCreatingIC;
+           }
+       }
+    } else {
+       ic->private.proto.waitCallback = False;
+       goto ErrorOnCreatingIC;
+    }
+    ic->private.proto.waitCallback = False;
+    buf_s = (CARD16 *)((char *)preply + XIM_HEADER_SIZE);
+    if (*((CARD8 *)preply) == XIM_ERROR) {
+       _XimProcError(im, 0, (XPointer)&buf_s[3]);
+       if (reply != preply)
+           Xfree(preply);
+       goto ErrorOnCreatingIC;
+    }
+
+    ic->private.proto.icid = buf_s[1];         /* icid */
+    if (reply != preply)
+       Xfree(preply);
+    MARK_IC_CONNECTED(ic);
+    return (XIC)ic;
+
+ErrorOnCreatingIC:
+    _XimUnregisterFilter(ic);
+    if (ic->private.proto.ic_resources)
+       Xfree(ic->private.proto.ic_resources);
+    if (ic->private.proto.ic_inner_resources)
+       Xfree(ic->private.proto.ic_inner_resources);
+    Xfree(ic);
+    return (XIC)NULL;
+}
diff --git a/modules/im/ximcp/imDefIm.c b/modules/im/ximcp/imDefIm.c
new file mode 100644 (file)
index 0000000..18a3cc8
--- /dev/null
@@ -0,0 +1,2044 @@
+/*
+ * Copyright 1990, 1991, 1992 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 1992, 1993, 1994 by FUJITSU LIMITED
+         Copyright 1993, 1994 by Sony Corporation
+
+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 Digital, FUJITSU
+LIMITED and Sony Corporation not be used in advertising or publicity
+pertaining to distribution of the software without specific, written
+prior permission.
+
+DIGITAL, FUJITSU LIMITED AND SONY CORPORATION DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL DIGITAL, FUJITSU LIMITED
+AND SONY CORPORATION 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.
+
+  Author: Hideki Hiura (hhiura@Sun.COM) Sun Microsystems, Inc.
+          Takashi Fujiwara     FUJITSU LIMITED
+                               fujiwara@a80.tech.yk.fujitsu.co.jp
+          Makoto Wakamatsu     Sony Corporation
+                               makoto@sm.sony.co.jp
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <X11/Xatom.h>
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "XlcPublic.h"
+#include "XlcPubI.h"
+#include "XimTrInt.h"
+#include "Ximint.h"
+
+
+Public int
+_XimCheckDataSize(
+    XPointer    buf,
+    int                 len)
+{
+    CARD16     *buf_s = (CARD16 *)buf;
+
+    if(len < XIM_HEADER_SIZE)
+       return -1;
+    return  buf_s[1];
+}
+
+Public void
+_XimSetHeader(
+    XPointer    buf,
+    CARD8       major_opcode,
+    CARD8       minor_opcode,
+    INT16      *len
+)
+{
+    CARD8      *buf_b = (CARD8 *)buf;
+    CARD16     *buf_s = (CARD16 *)buf;
+
+    buf_b[0] = major_opcode;
+    buf_b[1] = minor_opcode;
+    buf_s[1] = ((*len) / 4);
+    *len += XIM_HEADER_SIZE;
+    return;
+}
+
+Public char
+_XimGetMyEndian(void)
+{
+    CARD16      test_card = 1;
+
+    if(*((char *)&test_card))
+       return LITTLEENDIAN;
+    else
+       return BIGENDIAN;
+}
+
+Private Bool
+_XimCheckServerName(
+    Xim                   im,
+    char         *str)
+{
+    char         *server_name = im->core.im_name;
+    int                   len;
+    int                   str_len;
+    int                   category_len = strlen(XIM_SERVER_CATEGORY);
+    char         *pp;
+    register char *p;
+
+    if(server_name && *server_name)
+       len = strlen(server_name);
+    else
+       return True;
+
+    if((int)strlen(str) < category_len)
+       return False;
+
+    if(strncmp(str, XIM_SERVER_CATEGORY, category_len))
+       return False;
+
+    pp = &str[category_len];
+
+    for(;;) {
+       for(p = pp; (*p != ',') && (*p); p++);
+       str_len = (int)(p - pp);
+
+       if((len == str_len) && (!strncmp(pp, server_name, len)))
+           break;
+       if(!(*p))
+           return False;
+       pp = p + 1;
+    }
+    return True;
+}
+
+Private char *
+_XimCheckLocaleName(
+    Xim                   im,
+    char         *address,
+    int                   address_len,
+    char         *locale_name[],
+    int                   len)
+{
+    int                   category_len;
+    char         *pp;
+    register char *p;
+    register int   n;
+    Bool           finish = False;
+
+    category_len = strlen(XIM_LOCAL_CATEGORY);
+    if(address_len < category_len)
+       return (char*)NULL;
+
+    if(strncmp(address, XIM_LOCAL_CATEGORY, category_len))
+       return (char*)NULL;
+
+    pp = &address[category_len];
+
+    for(;;) {
+       for( p = pp; *p && *p != ','; p++);
+       if (!*p)
+           finish = True;
+       address_len = (int)(p - pp);
+       *p = '\0';
+
+       for( n = 0; n < len; n++ )
+           if( locale_name[n] && !_XlcCompareISOLatin1( pp, locale_name[n] ) )
+               return locale_name[n];
+       if (finish)
+           break;
+       pp = p + 1;
+    }
+    return (char *)NULL;
+}
+
+Private Bool
+_XimCheckTransport(
+    char         *address,
+    int                   address_len,
+    const char   *transport,
+    int                   len,
+    char        **trans_addr)
+{
+    int                   category_len = strlen(XIM_TRANSPORT_CATEGORY);
+    char         *pp;
+    register char *p;
+
+    if(address_len < category_len)
+       return False;
+
+    if(strncmp(address, XIM_TRANSPORT_CATEGORY, category_len))
+       return False;
+
+    pp = &address[category_len];
+
+    for(;;) {
+       *trans_addr = pp;
+
+       for(p = pp; (*p != '/') && (*p != ',') && (*p); p++);
+       if(*p == ',') {
+           pp = p + 1;
+           continue;
+       }
+       if(!(*p))
+           return False;
+
+       address_len = (int)(p - pp);
+
+       if((len == address_len) && (!strncmp(pp, transport, len)))
+           break;
+       pp = p + 1;
+    }
+    pp = p + 1;
+    for(p = pp; (*p != ',') && (*p); p++);
+    if (*p)
+       *p = '\0';
+    return True;
+}
+
+Private Bool
+_CheckSNEvent(
+    Display            *display,
+    XEvent             *xevent,
+    XPointer            arg)
+{
+    XSelectionEvent    *event = (XSelectionEvent *)xevent;
+    Window              window = *(Window*)arg;
+
+    if((event->type == SelectionNotify) && (window == event->requestor))
+       return True;
+    return False;
+}
+
+Private Bool
+_XimGetSelectionNotify(
+    Display             *display,
+    Window               window,
+    Atom                 target,
+    char               **ret_address)
+{
+    XEvent               event;
+    XSelectionEvent     *ev = (XSelectionEvent *)&event;
+    Atom                 actual_type;
+    int                          actual_format;
+    unsigned long        nitems, bytes_after;
+
+    for(;;) {
+       XIfEvent(display, &event, _CheckSNEvent, (XPointer)&window);
+       if((ev->type == SelectionNotify) && (window == ev->requestor))
+           break;
+    }
+
+    if(ev->property == (Atom)None)
+       return False;
+    if( XGetWindowProperty( display, window, target, 0L, 1000000L,
+                           True, target, &actual_type, &actual_format,
+                           &nitems, &bytes_after,
+                           (unsigned char **)&*ret_address ) != Success )
+       return False;
+    return True;
+}
+
+Private Bool
+_XimPreConnectionIM(
+    Xim                         im,
+    Atom                selection)
+{
+    Display            *display = im->core.display;
+    Atom                locales, transport;
+    char               *address;
+    XLCd                lcd;
+    char               *language;
+    char               *territory;
+    char               *codeset;
+    char               *trans_addr;
+    char               *locale_name[4], *locale;
+    int                         llen, tlen, clen;
+    register int        i;
+    Window              window;
+    char               *str;
+
+    if(!(lcd = im->core.lcd))
+       return False;
+
+    for( i = 0; i < 4; i++ )
+       locale_name[i] = NULL;
+    /* requestor window */
+    if(!(window = XCreateSimpleWindow(display, DefaultRootWindow(display),
+                                                       0, 0, 1, 1, 1, 0, 0)))
+       return False;
+
+    /* server name check */
+    if( !(str = XGetAtomName( display, selection )) )
+       return False;
+    if(!_XimCheckServerName(im, str)) {
+       XFree( (XPointer)str );
+       goto Error;
+    }
+    XFree( (XPointer)str );
+
+    /* locale name check */
+    _XGetLCValues(lcd, XlcNLanguage, &language, XlcNTerritory, &territory,
+                    XlcNCodeset, &codeset, NULL);
+    llen = strlen( language );
+    tlen = territory ? strlen( territory ): 0;
+    clen = codeset ? strlen( codeset ): 0;
+
+    if( tlen != 0  &&  clen != 0 ) {
+       if( (locale_name[0] = Xmalloc(llen+tlen+clen+3)) != NULL )
+           sprintf( locale_name[0], "%s_%s.%s", language, territory, codeset );
+    }
+    if( clen != 0 ) {
+       if( (locale_name[1] = Xmalloc(llen+clen+2)) != NULL )
+           sprintf( locale_name[1], "%s.%s", language, codeset );
+       else
+           goto Error;
+    }
+    if( tlen != 0 ) {
+       if( (locale_name[2] = Xmalloc(llen+tlen+2)) != NULL )
+           sprintf( locale_name[2], "%s_%s", language, territory );
+       else
+           goto Error;
+    }
+    if( (locale_name[3] = Xmalloc(llen+1)) != NULL )
+       strcpy( locale_name[3], language );
+    else
+       goto Error;
+    if((locales = XInternAtom(display, XIM_LOCALES, True)) == (Atom)None)
+       goto Error;
+
+    XConvertSelection(display, selection, locales, locales, window,
+                     CurrentTime);
+    if(!(_XimGetSelectionNotify(display, window, locales, &address)))
+       goto Error;
+
+    if((locale = _XimCheckLocaleName(im, address, strlen(address), locale_name,
+                                    4)) == NULL) {
+       XFree((XPointer)address);
+       goto Error;
+    }
+    im->private.proto.locale_name = locale;
+    for( i = 0; i < 4; i++ ) {
+       if( locale_name[i] != NULL  &&  locale_name[i] != locale ) {
+           XFree( locale_name[i] );
+           locale_name[i] = NULL;
+       }
+    }
+    XFree((XPointer)address);
+
+    /* transport check */
+    if((transport = XInternAtom(display, XIM_TRANSPORT, True)) == (Atom)None)
+       goto Error;
+
+    XConvertSelection(display, selection, transport, transport, window,
+                     CurrentTime);
+    if(!_XimGetSelectionNotify(display, window, transport, &address))
+       goto Error;
+
+    for(i = 0; _XimTransportRec[i].transportname ; i++) {
+       if( _XimCheckTransport(address, strlen(address),
+                               _XimTransportRec[i].transportname,
+                               strlen(_XimTransportRec[i].transportname),
+                                &trans_addr)) {
+           if( _XimTransportRec[i].config(im, trans_addr) ) {
+               XFree((XPointer)address);
+               XDestroyWindow(display, window);
+               return True;
+           }
+       }
+    }
+
+    XFree((XPointer)address);
+Error:
+    for( i = 0; i < 4; i++ )
+       if( locale_name[i] != NULL )
+           XFree( locale_name[i] );
+    XDestroyWindow(display, window);
+    return False;
+}
+
+Private Bool
+_XimPreConnect(
+    Xim                    im)
+{
+    Display       *display = im->core.display;
+    Atom           imserver;
+    Atom           actual_type;
+    int                    actual_format;
+    unsigned long   nitems;
+    unsigned long   bytes_after;
+    unsigned char  *prop_return;
+    Atom          *atoms;
+    Window         im_window = 0;
+    register int    i;
+
+    if((imserver = XInternAtom(display, XIM_SERVERS, True)) == (Atom)None)
+       return False;
+
+    if(XGetWindowProperty(display, RootWindow(display, 0),
+                       imserver, 0L, 1000000L, False, XA_ATOM, &actual_type,
+                       &actual_format, &nitems, &bytes_after,
+                       &prop_return) != Success)
+       return False;
+
+    if( (actual_type != XA_ATOM) || (actual_format != 32) ) {
+       if( nitems )
+           XFree((XPointer)prop_return);
+       return False;
+    }
+
+    atoms = (Atom *)prop_return;
+    for(i = 0; i < nitems; i++) {
+       if((im_window = XGetSelectionOwner(display, atoms[i])) == (Window)None)
+           continue;
+
+       if(_XimPreConnectionIM(im, atoms[i]))
+           break;
+    }
+
+    XFree((XPointer)prop_return);
+    if(i >= nitems)
+       return False;
+
+    im->private.proto.im_window = im_window;
+    return True;
+}
+
+Private Bool
+_XimGetAuthProtocolNames(
+    Xim                 im,
+    CARD16     *buf,
+    CARD8      *num,
+    INT16      *len)
+{
+    if (!IS_USE_AUTHORIZATION_FUNC(im)) {
+       *num = 0;
+       *len = 0;
+       return True;
+    }
+    /*
+     * Not yet
+     */
+    return True;
+}
+
+Private Bool
+_XimSetAuthReplyData(
+    Xim                 im,
+    XPointer    buf,
+    INT16      *len)
+{
+    /*
+     * Not yet
+     */
+    *len = 0;
+    return True;
+}
+
+Private Bool
+_XimSetAuthNextData(
+    Xim                 im,
+    XPointer    buf,
+    INT16      *len)
+{
+    /*
+     * Not yet
+     */
+    *len = 0;
+    return True;
+}
+
+Private Bool
+_XimSetAuthRequiredData(
+    Xim                 im,
+    XPointer    buf,
+    INT16      *len)
+{
+    /*
+     * Not yet
+     */
+    *len = 0;
+    return True;
+}
+
+Private Bool
+_XimCheckAuthSetupData(
+    Xim                 im,
+    XPointer    buf)
+{
+    /*
+     * Not yet
+     */
+    return True;
+}
+
+Private Bool
+_XimCheckAuthNextData(
+    Xim                 im,
+    XPointer    buf)
+{
+    /*
+     * Not yet
+     */
+    return True;
+}
+
+#define        NO_MORE_AUTH    2
+#define        GOOD_AUTH       1
+#define        BAD_AUTH        0
+
+Private int
+_XimClientAuthCheck(
+    Xim                 im,
+    XPointer    buf)
+{
+    /*
+     * Not yet
+     */
+    return NO_MORE_AUTH;
+}
+
+Private void
+_XimAuthNG(
+    Xim                 im)
+{
+    CARD32      buf32[BUFSIZE/4];
+    CARD8      *buf = (CARD8 *)buf32;
+    INT16       len = 0;
+
+    _XimSetHeader((XPointer)buf, XIM_AUTH_NG, 0, &len);
+    (void)_XimWrite(im, len, (XPointer)buf);
+    _XimFlush(im);
+    return;
+}
+
+Private        Bool
+_XimAllRecv(
+    Xim                 im,
+    INT16       len,
+    XPointer    data,
+    XPointer    arg)
+{
+    return True;
+}
+
+#define        CLIENT_WAIT1            1
+#define        CLIENT_WAIT2            2
+
+Private Bool
+_XimConnection(
+    Xim                 im)
+{
+    CARD32      buf32[BUFSIZE/4];
+    CARD8      *buf = (CARD8 *)buf32;
+    CARD8      *buf_b = &buf[XIM_HEADER_SIZE];
+    CARD16     *buf_s = (CARD16 *)((XPointer)buf_b);
+    INT16       len;
+    CARD8       num;
+    CARD32      reply32[BUFSIZE/4];
+    char       *reply = (char *)reply32;
+    XPointer    preply;
+    int                 buf_size;
+    int                 ret_code;
+    CARD8       major_opcode;
+    int                 wait_mode;
+    int                 ret;
+
+    if(!(_XimConnect(im)))     /* Transport Connect */
+       return False;
+
+    if(!_XimDispatchInit(im))
+       return False;
+
+    _XimRegProtoIntrCallback(im, XIM_ERROR, 0, _XimErrorCallback, (XPointer)im);
+
+    if(!_XimGetAuthProtocolNames(im, &buf_s[4], &num, &len))
+       return False;
+
+    im->private.proto.protocol_major_version = PROTOCOLMAJORVERSION;
+    im->private.proto.protocol_minor_version = PROTOCOLMINORVERSION;
+
+    buf_b[0] = _XimGetMyEndian();
+    buf_b[1] = 0;
+    buf_s[1] = PROTOCOLMAJORVERSION;
+    buf_s[2] = PROTOCOLMINORVERSION;
+    buf_s[3] = num;
+    len  += sizeof(CARD8)
+          + sizeof(CARD8)
+          + sizeof(CARD16)
+          + sizeof(CARD16)
+          + sizeof(CARD16);
+
+    major_opcode = XIM_CONNECT;
+    wait_mode = (IS_USE_AUTHORIZATION_FUNC(im)) ? CLIENT_WAIT1 : CLIENT_WAIT2;
+
+    for(;;) {
+       _XimSetHeader((XPointer)buf, major_opcode, 0, &len);
+       if (!(_XimWrite(im, len, (XPointer)buf)))
+           return False;
+       _XimFlush(im);
+       buf_size = BUFSIZE;
+       ret_code = _XimRead(im, &len, reply, buf_size, _XimAllRecv, 0);
+       if(ret_code == XIM_TRUE) {
+           preply = reply;
+       } else if(ret_code == XIM_OVERFLOW) {
+           if(len <= 0) {
+               preply = reply;
+           } else {
+               buf_size = len;
+               preply = (XPointer)Xmalloc(buf_size);
+               ret_code = _XimRead(im, &len, preply, buf_size, _XimAllRecv, 0);
+               if(ret_code != XIM_TRUE) {
+                   Xfree(preply);
+                   return False;
+               }
+           }
+       } else
+           return False;
+
+       major_opcode = *((CARD8 *)preply);
+       buf_s = (CARD16 *)((char *)preply + XIM_HEADER_SIZE);
+
+       if (wait_mode == CLIENT_WAIT1) {
+           if (major_opcode == XIM_AUTH_REQUIRED) {
+               ret = _XimClientAuthCheck(im, (XPointer)buf_s);
+               if(reply != preply)
+                   Xfree(preply);
+               if (ret == NO_MORE_AUTH) {
+                   if (!(_XimSetAuthReplyData(im,
+                               (XPointer)&buf[XIM_HEADER_SIZE], &len))) {
+                       _XimAuthNG(im);
+                       return False;
+                   }
+                   major_opcode = XIM_AUTH_REPLY;
+                   wait_mode = CLIENT_WAIT2;
+               } else if (ret == GOOD_AUTH) {
+                   if (!(_XimSetAuthNextData(im,
+                               (XPointer)&buf[XIM_HEADER_SIZE], &len))) {
+                       _XimAuthNG(im);
+                       return False;
+                   }
+                   major_opcode = XIM_AUTH_NEXT;
+               } else {        /* BAD_AUTH */
+                   _XimAuthNG(im);
+                   return False;
+               }
+           } else {
+               if(reply != preply)
+                   Xfree(preply);
+               _XimAuthNG(im);
+               return False;
+           }
+       } else {        /* CLIENT_WAIT2 */
+           if (major_opcode == XIM_CONNECT_REPLY) {
+               break;
+           } else if (major_opcode == XIM_AUTH_SETUP) {
+               if (!(_XimCheckAuthSetupData(im, (XPointer)buf_s))) {
+                   _XimAuthNG(im);
+                   return False;
+               }
+               if(reply != preply)
+                   Xfree(preply);
+               if (!(_XimSetAuthRequiredData(im,
+                               (XPointer)&buf[XIM_HEADER_SIZE], &len))) {
+                   _XimAuthNG(im);
+                   return False;
+               }
+               major_opcode = XIM_AUTH_REQUIRED;
+           } else if (major_opcode == XIM_AUTH_NEXT) {
+               if (!(_XimCheckAuthNextData(im, (XPointer)buf_s))) {
+                   _XimAuthNG(im);
+                   return False;
+               }
+               if(reply != preply)
+                   Xfree(preply);
+               if (!(_XimSetAuthRequiredData(im,
+                               (XPointer)&buf[XIM_HEADER_SIZE], &len))) {
+                   _XimAuthNG(im);
+                   return False;
+               }
+               major_opcode = XIM_AUTH_REQUIRED;
+           } else if (major_opcode == XIM_AUTH_NG) {
+               if(reply != preply)
+                   Xfree(preply);
+               return False;
+           } else {
+               _XimAuthNG(im);
+               if(reply != preply)
+                   Xfree(preply);
+               return False;
+           }
+       }
+    }
+
+    if (!( buf_s[0] == im->private.proto.protocol_major_version
+        && buf_s[1] == im->private.proto.protocol_minor_version)) {
+       if(reply != preply)
+           Xfree(preply);
+       return False;
+    }
+    if(reply != preply)
+       Xfree(preply);
+    MARK_SERVER_CONNECTED(im);
+
+    _XimRegProtoIntrCallback(im, XIM_REGISTER_TRIGGERKEYS, 0,
+                                _XimRegisterTriggerKeysCallback, (XPointer)im);
+    return True;
+}
+
+Private        Bool
+_XimDisconnectCheck(
+    Xim                 im,
+    INT16       len,
+    XPointer    data,
+    XPointer    arg)
+{
+    CARD8       major_opcode = *((CARD8 *)data);
+    CARD8       minor_opcode = *((CARD8 *)data + 1);
+
+    if ((major_opcode == XIM_DISCONNECT_REPLY)
+     && (minor_opcode == 0))
+       return True;
+    if ((major_opcode == XIM_ERROR)
+     && (minor_opcode == 0))
+       return True;
+    return False;
+}
+
+Private Bool
+_XimDisconnect(
+    Xim                 im)
+{
+    CARD32      buf32[BUFSIZE/4];
+    CARD8      *buf = (CARD8 *)buf32;
+    INT16       len = 0;
+    CARD32      reply32[BUFSIZE/4];
+    char       *reply = (char *)reply32;
+    XPointer    preply;
+    int                 buf_size;
+    int                 ret_code;
+
+    if (IS_SERVER_CONNECTED(im)) {
+       _XimSetHeader((XPointer)buf, XIM_DISCONNECT, 0, &len);
+       if (!(_XimWrite(im, len, (XPointer)buf)))
+           return False;
+       _XimFlush(im);
+       buf_size = BUFSIZE;
+       ret_code = _XimRead(im, &len, (XPointer)reply, buf_size,
+                                               _XimDisconnectCheck, 0);
+       if(ret_code == XIM_OVERFLOW) {
+           if(len > 0) {
+               buf_size = len;
+               preply = (XPointer)Xmalloc(buf_size);
+               ret_code = _XimRead(im, &len, preply, buf_size,
+                                                _XimDisconnectCheck, 0);
+               Xfree(preply);
+               if(ret_code != XIM_TRUE)
+                   return False;
+           }
+       } else if(ret_code == XIM_FALSE)
+           return False;
+
+    }
+    if (!(_XimShutdown(im)))   /* Transport shutdown */
+       return False;
+    return True;
+}
+
+Private        Bool
+_XimOpenCheck(
+    Xim                 im,
+    INT16       len,
+    XPointer    data,
+    XPointer    arg)
+{
+    CARD8       major_opcode = *((CARD8 *)data);
+    CARD8       minor_opcode = *((CARD8 *)data + 1);
+
+    if ((major_opcode == XIM_OPEN_REPLY)
+     && (minor_opcode == 0))
+       return True;
+    if ((major_opcode == XIM_ERROR)
+     && (minor_opcode == 0))
+       return True;
+    return False;
+}
+
+Private Bool
+_XimOpen(
+    Xim                         im)
+{
+    CARD32              buf32[BUFSIZE/4];
+    CARD8              *buf = (CARD8 *)buf32;
+    CARD8              *buf_b = &buf[XIM_HEADER_SIZE];
+    CARD16             *buf_s;
+    INT16               len;
+    CARD32              reply32[BUFSIZE/4];
+    char               *reply = (char *)reply32;
+    XPointer            preply;
+    int                         buf_size;
+    int                         ret_code;
+    char               *locale_name;
+
+    locale_name = im->private.proto.locale_name;
+    len = strlen(locale_name);
+    buf_b[0] = (BYTE)len;                         /* length of locale name */
+    (void)strcpy((char *)&buf_b[1], locale_name);  /* locale name */
+    len += sizeof(BYTE);                          /* sizeof length */
+    XIM_SET_PAD(buf_b, len);                      /* pad */
+
+    _XimSetHeader((XPointer)buf, XIM_OPEN, 0, &len);
+    if (!(_XimWrite(im, len, (XPointer)buf)))
+       return False;
+    _XimFlush(im);
+    buf_size = BUFSIZE;
+    ret_code = _XimRead(im, &len, reply, buf_size,
+                                       _XimOpenCheck, 0);
+    if(ret_code == XIM_TRUE) {
+       preply = reply;
+    } else if(ret_code == XIM_OVERFLOW) {
+       if(len <= 0) {
+           preply = reply;
+       } else {
+           buf_size = len;
+           preply = (XPointer)Xmalloc(buf_size);
+           ret_code = _XimRead(im, &len, preply, buf_size,
+                                       _XimOpenCheck, 0);
+           if(ret_code != XIM_TRUE) {
+               Xfree(preply);
+               return False;
+           }
+       }
+    } else
+       return False;
+    buf_s = (CARD16 *)((char *)preply + XIM_HEADER_SIZE);
+    if (*((CARD8 *)preply) == XIM_ERROR) {
+       _XimProcError(im, 0, (XPointer)&buf_s[3]);
+       if(reply != preply)
+           Xfree(preply);
+       return False;
+    }
+
+    im->private.proto.imid = buf_s[0];         /* imid */
+
+    if (!(_XimGetAttributeID(im, &buf_s[1]))) {
+       if(reply != preply)
+           Xfree(preply);
+       return False;
+    }
+    if(reply != preply)
+       Xfree(preply);
+
+    if (!(_XimSetInnerIMResourceList(&(im->private.proto.im_inner_resources),
+                               &(im->private.proto.im_num_inner_resources))))
+       return False;
+
+    if (!(_XimSetInnerICResourceList(&(im->private.proto.ic_inner_resources),
+                               &(im->private.proto.ic_num_inner_resources))))
+       return False;
+
+    _XimSetIMMode(im->core.im_resources, im->core.im_num_resources);
+    _XimSetIMMode(im->private.proto.im_inner_resources,
+                               im->private.proto.im_num_inner_resources);
+
+    /* Transport Callbak */
+    _XimRegProtoIntrCallback(im, XIM_SET_EVENT_MASK, 0,
+                                _XimSetEventMaskCallback, (XPointer)im);
+    _XimRegProtoIntrCallback(im, XIM_FORWARD_EVENT, 0,
+                                _XimForwardEventCallback, (XPointer)im);
+    _XimRegProtoIntrCallback(im, XIM_COMMIT, 0,
+                                _XimCommitCallback, (XPointer)im);
+    _XimRegProtoIntrCallback(im, XIM_SYNC, 0,
+                                _XimSyncCallback, (XPointer)im);
+
+    if(!_XimExtension(im))
+       return False;
+
+    /* register a hook for callback protocols */
+    _XimRegisterDispatcher(im, _XimCbDispatch, (XPointer)im);
+
+    return True;
+}
+
+Private        Bool
+_XimCloseCheck(
+    Xim                 im,
+    INT16       len,
+    XPointer    data,
+    XPointer    arg)
+{
+    CARD16     *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
+    CARD8       major_opcode = *((CARD8 *)data);
+    CARD8       minor_opcode = *((CARD8 *)data + 1);
+    XIMID       imid = buf_s[0];
+
+    if ((major_opcode == XIM_CLOSE_REPLY)
+     && (minor_opcode == 0)
+     && (imid == im->private.proto.imid))
+       return True;
+    if ((major_opcode == XIM_ERROR)
+     && (minor_opcode == 0)
+     && (buf_s[2] & XIM_IMID_VALID)
+     && (imid == im->private.proto.imid))
+       return True;
+    return False;
+}
+
+Private Bool
+_XimClose(
+    Xim                 im)
+{
+    CARD32      buf32[BUFSIZE/4];
+    CARD8      *buf = (CARD8 *)buf32;
+    CARD16     *buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
+    INT16       len;
+    CARD32      reply32[BUFSIZE/4];
+    char       *reply = (char *)reply32;
+    XPointer    preply;
+    int                 buf_size;
+    int                 ret_code;
+
+    if (!IS_SERVER_CONNECTED(im))
+       return True;
+
+    buf_s[0] = im->private.proto.imid;         /* imid */
+    buf_s[1] = 0;                              /* unused */
+    len = sizeof(CARD16)                       /* sizeof imid */
+        + sizeof(CARD16);                      /* sizeof unused */
+
+    _XimSetHeader((XPointer)buf, XIM_CLOSE, 0, &len);
+    if (!(_XimWrite(im, len, (XPointer)buf)))
+       return False;
+    _XimFlush(im);
+    buf_size = BUFSIZE;
+    ret_code = _XimRead(im, &len, (XPointer)reply, buf_size,
+                                               _XimCloseCheck, 0);
+    if(ret_code == XIM_TRUE) {
+       preply = reply;
+    } else if(ret_code == XIM_OVERFLOW) {
+       if(len <= 0) {
+           preply = reply;
+       } else {
+           buf_size = len;
+           preply = (XPointer)Xmalloc(buf_size);
+           ret_code = _XimRead(im, &len, preply, buf_size, _XimCloseCheck, 0);
+           if(ret_code != XIM_TRUE) {
+               Xfree(preply);
+               return False;
+           }
+       }
+    } else
+       return False;
+    buf_s = (CARD16 *)((char *)preply + XIM_HEADER_SIZE);
+    if (*((CARD8 *)preply) == XIM_ERROR) {
+       _XimProcError(im, 0, (XPointer)&buf_s[3]);
+       if(reply != preply)
+           Xfree(preply);
+       return False;
+    }
+
+    if(reply != preply)
+       Xfree(preply);
+    return True;
+}
+
+Public void
+_XimProtoIMFree(
+    Xim                  im)
+{
+    /* XIMPrivateRec */
+    if (im->private.proto.im_onkeylist) {
+       Xfree(im->private.proto.im_onkeylist);
+       im->private.proto.im_onkeylist = NULL;
+    }
+    if (im->private.proto.im_offkeylist) {
+       Xfree(im->private.proto.im_offkeylist);
+       im->private.proto.im_offkeylist = NULL;
+    }
+    if (im->private.proto.intrproto) {
+       _XimFreeProtoIntrCallback(im);
+       im->private.proto.intrproto = NULL;
+    }
+    if (im->private.proto.im_inner_resources) {
+       Xfree(im->private.proto.im_inner_resources);
+       im->private.proto.im_inner_resources = NULL;
+    }
+    if (im->private.proto.ic_inner_resources) {
+       Xfree(im->private.proto.ic_inner_resources);
+       im->private.proto.ic_inner_resources = NULL;
+    }
+    if (im->private.proto.hold_data) {
+       Xfree(im->private.proto.hold_data);
+       im->private.proto.hold_data = NULL;
+    }
+    if (im->private.proto.locale_name) {
+       Xfree(im->private.proto.locale_name);
+       im->private.proto.locale_name = NULL;
+    }
+    if (im->private.proto.ctom_conv) {
+       _XlcCloseConverter(im->private.proto.ctom_conv);
+       im->private.proto.ctom_conv = NULL;
+    }
+    if (im->private.proto.ctow_conv) {
+       _XlcCloseConverter(im->private.proto.ctow_conv);
+       im->private.proto.ctow_conv = NULL;
+    }
+    if (im->private.proto.ctoutf8_conv) {
+       _XlcCloseConverter(im->private.proto.ctoutf8_conv);
+       im->private.proto.ctoutf8_conv = NULL;
+    }
+    if (im->private.proto.cstomb_conv) {
+       _XlcCloseConverter(im->private.proto.cstomb_conv);
+       im->private.proto.cstomb_conv = NULL;
+    }
+    if (im->private.proto.cstowc_conv) {
+       _XlcCloseConverter(im->private.proto.cstowc_conv);
+       im->private.proto.cstowc_conv = NULL;
+    }
+    if (im->private.proto.cstoutf8_conv) {
+       _XlcCloseConverter(im->private.proto.cstoutf8_conv);
+       im->private.proto.cstoutf8_conv = NULL;
+    }
+    if (im->private.proto.ucstoc_conv) {
+       _XlcCloseConverter(im->private.proto.ucstoc_conv);
+       im->private.proto.ucstoc_conv = NULL;
+    }
+    if (im->private.proto.ucstoutf8_conv) {
+       _XlcCloseConverter(im->private.proto.ucstoutf8_conv);
+       im->private.proto.ucstoutf8_conv = NULL;
+    }
+
+#ifdef XIM_CONNECTABLE
+    if (!IS_SERVER_CONNECTED(im) && IS_RECONNECTABLE(im)) {
+       return;
+    }
+#endif /* XIM_CONNECTABLE */
+
+    if (im->private.proto.saved_imvalues) {
+        Xfree(im->private.proto.saved_imvalues);
+        im->private.proto.saved_imvalues = NULL;
+    }
+    if (im->private.proto.default_styles) {
+       Xfree(im->private.proto.default_styles);
+       im->private.proto.default_styles = NULL;
+    }
+
+    /* core */
+    if (im->core.res_name) {
+        Xfree(im->core.res_name);
+       im->core.res_name = NULL;
+    }
+    if (im->core.res_class) {
+        Xfree(im->core.res_class);
+       im->core.res_class = NULL;
+    }
+    if (im->core.im_values_list) {
+       Xfree(im->core.im_values_list);
+       im->core.im_values_list = NULL;
+    }
+    if (im->core.ic_values_list) {
+       Xfree(im->core.ic_values_list);
+       im->core.ic_values_list = NULL;
+    }
+    if (im->core.im_name) {
+       Xfree(im->core.im_name);
+       im->core.im_name = NULL;
+    }
+    if (im->core.styles) {
+       Xfree(im->core.styles);
+       im->core.styles = NULL;
+    }
+    if (im->core.im_resources) {
+        Xfree(im->core.im_resources);
+       im->core.im_resources = NULL;
+    }
+    if (im->core.ic_resources) {
+        Xfree(im->core.ic_resources);
+       im->core.ic_resources = NULL;
+    }
+
+    return;
+}
+
+Private Status
+_XimProtoCloseIM(
+    XIM                 xim)
+{
+    Xim                 im = (Xim)xim;
+    XIC                 ic;
+    XIC                 next;
+    Status      status;
+
+    ic = im->core.ic_chain;
+    while (ic) {
+       (*ic->methods->destroy) (ic);
+       next = ic->core.next;
+#ifdef XIM_CONNECTABLE
+       if (!(!IS_SERVER_CONNECTED(im) && IS_RECONNECTABLE(im))) {
+           Xfree ((char *) ic);
+       }
+#else
+       Xfree ((char *) ic);
+#endif /* XIM_CONNECTABLE */
+       ic = next;
+    }
+#ifdef XIM_CONNECTABLE
+    if (!(!IS_SERVER_CONNECTED(im) && IS_RECONNECTABLE(im)))
+       im->core.ic_chain = NULL;
+#else
+    im->core.ic_chain = NULL;
+#endif
+
+    _XimUnregisterServerFilter(im);
+    _XimResetIMInstantiateCallback(im);
+    status = (Status)_XimClose(im);
+    status = (Status)_XimDisconnect(im) && status;
+    _XimProtoIMFree(im);
+#ifdef XIM_CONNECTABLE
+    if (!IS_SERVER_CONNECTED(im) && IS_RECONNECTABLE(im)) {
+       _XimReconnectModeSetAttr(im);
+        for (ic = im->core.ic_chain; ic; ic = ic->core.next) {
+           _XimReconnectModeCreateIC(ic);
+        }
+       return 0;
+    }
+#endif /* XIM_CONNECTABLE */
+    _XimDestroyIMStructureList(im);
+    return status;
+}
+
+#ifdef XIM_CONNECTABLE
+Private Bool
+_XimCheckIMQuarkList(
+    XrmQuark           *quark_list,
+    int                         num_quark,
+    XrmQuark            quark)
+{
+    register int        i;
+
+    for (i = 0; i < num_quark; i++) {
+       if (quark_list[i] == quark) {
+           return True;
+       }
+    }
+    return False;
+}
+
+Private Bool
+_XimSaveIMValues(
+    Xim                         im,
+    XIMArg             *arg)
+{
+    register XIMArg    *p;
+    register int        n;
+    XrmQuark           *quark_list;
+    XrmQuark           *tmp;
+    XrmQuark            quark;
+    int                         num_quark;
+
+    if (quark_list = im->private.proto.saved_imvalues) {
+       num_quark = im->private.proto.num_saved_imvalues;
+       for (p = arg; p && p->name; p++) {
+           quark = XrmStringToQuark(p->name);
+           if (_XimCheckIMQuarkList(quark_list, num_quark, quark)) {
+               continue;
+           }
+           if (!(tmp = (XrmQuark *)Xrealloc(quark_list,
+                               (sizeof(XrmQuark) * (num_quark + 1))))) {
+               im->private.proto.saved_imvalues = quark_list;
+               im->private.proto.num_saved_imvalues = num_quark;
+               return False;
+           }
+           num_quark++;
+           quark_list = tmp;
+           quark_list[num_quark] = quark;
+       }
+       im->private.proto.saved_imvalues = quark_list;
+       im->private.proto.num_saved_imvalues = num_quark;
+       return True;
+    }
+
+    for (p = arg, n = 0; p && p->name; p++, n++);
+
+    if (!(quark_list = (XrmQuark *)Xmalloc(sizeof(XrmQuark) * n))) {
+       return False;
+    }
+
+    im->private.proto.saved_imvalues = quark_list;
+    im->private.proto.num_saved_imvalues = n;
+    for (p = arg; p && p->name; p++, quark_list++) {
+       *quark_list = XrmStringToQuark(p->name);
+    }
+
+    return True;
+}
+
+Private char *
+_XimDelayModeSetIMValues(
+    Xim                         im,
+    XIMArg             *arg)
+{
+    XimDefIMValues      im_values;
+    char               *name;
+    XIMArg             *values;
+
+    _XimGetCurrentIMValues(im, &im_values);
+    name = _XimSetIMValueData(im, (XPointer)&im_values, values,
+               im->core.im_resources, im->core.im_num_resources);
+    _XimSetCurrentIMValues(im, &im_values);
+
+    return name;
+}
+#endif /* XIM_CONNECTABLE */
+
+Private Bool
+_XimSetIMValuesCheck(
+    Xim          im,
+    INT16        len,
+    XPointer    data,
+    XPointer     arg)
+{
+    CARD16     *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
+    CARD8       major_opcode = *((CARD8 *)data);
+    CARD8       minor_opcode = *((CARD8 *)data + 1);
+    XIMID       imid = buf_s[0];
+
+    if ((major_opcode == XIM_SET_IM_VALUES_REPLY)
+     && (minor_opcode == 0)
+     && (imid == im->private.proto.imid))
+       return True;
+    if ((major_opcode == XIM_ERROR)
+     && (minor_opcode == 0)
+     && (buf_s[2] & XIM_IMID_VALID)
+     && (imid == im->private.proto.imid))
+       return True;
+    return False;
+}
+
+Private char *
+_XimProtoSetIMValues(
+    XIM                         xim,
+    XIMArg             *arg)
+{
+    Xim                         im = (Xim)xim;
+    XimDefIMValues      im_values;
+    INT16               len;
+    CARD16             *buf_s;
+    char               *tmp;
+    CARD32              tmp_buf32[BUFSIZE/4];
+    char               *tmp_buf = (char *)tmp_buf32;
+    char               *buf;
+    int                         buf_size;
+    char               *data;
+    int                         data_len;
+    int                         ret_len;
+    int                         total;
+    XIMArg             *arg_ret;
+    CARD32              reply32[BUFSIZE/4];
+    char               *reply = (char *)reply32;
+    XPointer            preply;
+    int                         ret_code;
+    char               *name;
+
+#ifndef XIM_CONNECTABLE
+    if (!IS_SERVER_CONNECTED(im))
+       return arg->name;
+#else
+    if (!_XimSaveIMValues(im, arg))
+       return arg->name;
+
+    if (!IS_SERVER_CONNECTED(im)) {
+       if (IS_CONNECTABLE(im)) {
+           if (!_XimConnectServer(im)) {
+               return _XimDelayModeSetIMValues(im, arg);
+           }
+        } else {
+           return arg->name;
+        }
+    }
+#endif /* XIM_CONNECTABLE */
+
+    _XimGetCurrentIMValues(im, &im_values);
+    buf = tmp_buf;
+    buf_size = XIM_HEADER_SIZE + sizeof(CARD16) + sizeof(INT16);
+    data_len = BUFSIZE - buf_size;
+    total = 0;
+    arg_ret = arg;
+    for (;;) {
+       data = &buf[buf_size];
+       if ((name = _XimEncodeIMATTRIBUTE(im, im->core.im_resources,
+               im->core.im_num_resources, arg, &arg_ret, data, data_len,
+               &ret_len, (XPointer)&im_values, XIM_SETIMVALUES))) {
+           if (buf != tmp_buf)
+               Xfree(buf);
+           break;
+       }
+
+       total += ret_len;
+       if (!(arg = arg_ret)) {
+           break;
+       }
+
+       buf_size += ret_len;
+       if (buf == tmp_buf) {
+           if (!(tmp = (char *)Xmalloc(buf_size + data_len))) {
+               return arg->name;
+           }
+           memcpy(tmp, buf, buf_size);
+           buf = tmp;
+       } else {
+           if (!(tmp = (char *)Xrealloc(buf, (buf_size + data_len)))) {
+               Xfree(buf);
+               return arg->name;
+           }
+           buf = tmp;
+       }
+    }
+    _XimSetCurrentIMValues(im, &im_values);
+
+    if (!total)
+       return (char *)NULL;
+
+    buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
+    buf_s[0] = im->private.proto.imid;
+    buf_s[1] = (INT16)total;
+
+    len = (INT16)(sizeof(CARD16) + sizeof(INT16) + total);
+    _XimSetHeader((XPointer)buf, XIM_SET_IM_VALUES, 0, &len);
+    if (!(_XimWrite(im, len, (XPointer)buf))) {
+       if (buf != tmp_buf)
+           Xfree(buf);
+       return arg->name;
+    }
+    _XimFlush(im);
+    if (buf != tmp_buf)
+       Xfree(buf);
+    buf_size = BUFSIZE;
+    ret_code = _XimRead(im, &len, (XPointer)reply, buf_size,
+                                        _XimSetIMValuesCheck, 0);
+    if(ret_code == XIM_TRUE) {
+       preply = reply;
+    } else if(ret_code == XIM_OVERFLOW) {
+       if(len <= 0) {
+           preply = reply;
+       } else {
+           buf_size = (int)len;
+           preply = (XPointer)Xmalloc(buf_size);
+           ret_code = _XimRead(im, &len, reply, buf_size,
+                                       _XimSetIMValuesCheck, 0);
+           if(ret_code != XIM_TRUE) {
+               Xfree(preply);
+               return arg->name;
+           }
+       }
+    } else
+       return arg->name;
+    buf_s = (CARD16 *)((char *)preply + XIM_HEADER_SIZE);
+    if (*((CARD8 *)preply) == XIM_ERROR) {
+       _XimProcError(im, 0, (XPointer)&buf_s[3]);
+       if(reply != preply)
+           Xfree(preply);
+       return arg->name;
+    }
+    if(reply != preply)
+       Xfree(preply);
+
+    return name;
+}
+
+#ifdef XIM_CONNECTABLE
+Private char *
+_XimDelayModeGetIMValues(
+    Xim                         im,
+    XIMArg             *arg)
+{
+    XimDefIMValues      im_values;
+
+    _XimGetCurrentIMValues(im, &im_values);
+    return(_XimGetIMValueData(im, (XPointer)&im_values, arg,
+                       im->core.im_resources, im->core.im_num_resources));
+}
+#endif /* XIM_CONNECTABLE */
+
+Private Bool
+_XimGetIMValuesCheck(
+    Xim          im,
+    INT16        len,
+    XPointer    data,
+    XPointer     arg)
+{
+    CARD16     *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
+    CARD8       major_opcode = *((CARD8 *)data);
+    CARD8       minor_opcode = *((CARD8 *)data + 1);
+    XIMID       imid = buf_s[0];
+
+    if ((major_opcode == XIM_GET_IM_VALUES_REPLY)
+     && (minor_opcode == 0)
+     && (imid == im->private.proto.imid))
+       return True;
+    if ((major_opcode == XIM_ERROR)
+     && (minor_opcode == 0)
+     && (buf_s[2] & XIM_IMID_VALID)
+     && (imid == im->private.proto.imid))
+       return True;
+    return False;
+}
+
+Private char *
+_XimProtoGetIMValues(
+    XIM                         xim,
+    XIMArg             *arg)
+{
+    Xim                         im = (Xim)xim;
+    register XIMArg    *p;
+    register int        n;
+    CARD8              *buf;
+    CARD16             *buf_s;
+    INT16               len;
+    CARD32              reply32[BUFSIZE/4];
+    char               *reply = (char *)reply32;
+    XPointer            preply = NULL;
+    int                         buf_size;
+    int                         ret_code;
+    char               *makeid_name;
+    char               *decode_name;
+    CARD16             *data = NULL;
+    INT16               data_len = 0;
+
+#ifndef XIM_CONNECTABLE
+    if (!IS_SERVER_CONNECTED(im))
+       return arg->name;
+#else
+    if (!IS_SERVER_CONNECTED(im)) {
+       if (IS_CONNECTABLE(im)) {
+           if (!_XimConnectServer(im)) {
+               return _XimDelayModeGetIMValues(im, arg);
+           }
+        } else {
+           return arg->name;
+        }
+    }
+#endif /* XIM_CONNECTABLE */
+
+    for (n = 0, p = arg; p->name; p++)
+       n++;
+
+    if (!n)
+       return (char *)NULL;
+
+    buf_size =  sizeof(CARD16) * n;
+    buf_size += XIM_HEADER_SIZE
+            + sizeof(CARD16)
+            + sizeof(INT16)
+            + XIM_PAD(buf_size);
+
+    if (!(buf = (CARD8 *)Xmalloc(buf_size)))
+       return arg->name;
+    buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
+
+    makeid_name = _XimMakeIMAttrIDList(im, im->core.im_resources,
+                               im->core.im_num_resources, arg,
+                               &buf_s[2], &len, XIM_GETIMVALUES);
+
+    if (len) {
+       buf_s[0] = im->private.proto.imid;      /* imid */
+       buf_s[1] = len;                         /* length of im-attr-id */
+       XIM_SET_PAD(&buf_s[2], len);            /* pad */
+       len += sizeof(CARD16)                   /* sizeof imid */
+            + sizeof(INT16);                   /* sizeof length of attr */
+
+       _XimSetHeader((XPointer)buf, XIM_GET_IM_VALUES, 0, &len);
+       if (!(_XimWrite(im, len, (XPointer)buf))) {
+           Xfree(buf);
+           return arg->name;
+       }
+       _XimFlush(im);
+       Xfree(buf);
+       buf_size = BUFSIZE;
+       ret_code = _XimRead(im, &len, (XPointer)reply, buf_size,
+                                               _XimGetIMValuesCheck, 0);
+       if(ret_code == XIM_TRUE) {
+           preply = reply;
+       } else if(ret_code == XIM_OVERFLOW) {
+           if(len <= 0) {
+               preply = reply;
+           } else {
+               buf_size = len;
+               preply = (XPointer)Xmalloc(buf_size);
+               ret_code = _XimRead(im, &len, preply, buf_size,
+                                               _XimGetIMValuesCheck, 0);
+               if(ret_code != XIM_TRUE) {
+                   Xfree(preply);
+                   return arg->name;
+               }
+           }
+       } else
+           return arg->name;
+       buf_s = (CARD16 *)((char *)preply + XIM_HEADER_SIZE);
+       if (*((CARD8 *)preply) == XIM_ERROR) {
+           _XimProcError(im, 0, (XPointer)&buf_s[3]);
+           if(reply != preply)
+               Xfree(preply);
+           return arg->name;
+       }
+       data = &buf_s[2];
+       data_len = buf_s[1];
+    }
+    decode_name = _XimDecodeIMATTRIBUTE(im, im->core.im_resources,
+                       im->core.im_num_resources, data, data_len,
+                       arg, XIM_GETIMVALUES);
+    if (reply != preply)
+       Xfree(preply);
+
+    if (decode_name)
+       return decode_name;
+    else
+       return makeid_name;
+}
+
+Private XIMMethodsRec     im_methods = {
+    _XimProtoCloseIM,           /* close */
+    _XimProtoSetIMValues,       /* set_values */
+    _XimProtoGetIMValues,       /* get_values */
+    _XimProtoCreateIC,          /* create_ic */
+    _Ximctstombs,              /* ctstombs */
+    _Ximctstowcs,              /* ctstowcs */
+    _Ximctstoutf8              /* ctstoutf8 */
+};
+
+Private Bool
+_XimSetEncodingByName(
+    Xim                  im,
+    char       **buf,
+    int                 *len)
+{
+    char       *encoding = (char *)NULL;
+    int                 encoding_len;
+    int                 compound_len;
+    BYTE       *ret;
+
+    _XGetLCValues(im->core.lcd, XlcNCodeset, &encoding, NULL);
+    if (!encoding) {
+       *buf = (char *)NULL;
+       *len = 0;
+       return True;
+    }
+    encoding_len = strlen(encoding);
+    compound_len = strlen("COMPOUND_TEXT");
+    *len = encoding_len + sizeof(BYTE) + compound_len + sizeof(BYTE);
+    if (!(ret = (BYTE *)Xmalloc(*len))) {
+       return False;
+    }
+    *buf = (char *)ret;
+
+    ret[0] = (BYTE)encoding_len;
+    (void)strncpy((char *)&ret[1], encoding, encoding_len);
+    ret += (encoding_len + sizeof(BYTE));
+    ret[0] = (BYTE)compound_len;
+    (void)strncpy((char *)&ret[1], "COMPOUND_TEXT", compound_len);
+    return True;
+}
+
+Private Bool
+_XimSetEncodingByDetail(
+    Xim                 im,
+    char       **buf,
+    int                 *len)
+{
+    *len = 0;
+    *buf = NULL;
+    return True;
+}
+
+Private Bool
+_XimGetEncoding(
+    Xim                 im,
+    CARD16     *buf,
+    char       *name,
+    int                 name_len,
+    char       *detail,
+    int                 detail_len)
+{
+    XLCd        lcd = im->core.lcd;
+    CARD16      category = buf[0];
+    CARD16      idx = buf[1];
+    int                 len;
+    XlcConv     ctom_conv = NULL;
+    XlcConv     ctow_conv = NULL;
+    XlcConv     ctoutf8_conv = NULL;
+    XlcConv     conv;
+    XimProtoPrivateRec *private = &im->private.proto;
+
+    if (idx == (CARD16)XIM_Default_Encoding_IDX) { /* XXX */
+       if (!(ctom_conv = _XlcOpenConverter(lcd,
+                                XlcNCompoundText, lcd, XlcNMultiByte)))
+           return False;
+       if (!(ctow_conv = _XlcOpenConverter(lcd,
+                                XlcNCompoundText, lcd, XlcNWideChar)))
+           return False;
+       if (!(ctoutf8_conv = _XlcOpenConverter(lcd,
+                                XlcNCompoundText, lcd, XlcNUtf8String)))
+           return False;
+    }
+
+    if (category == XIM_Encoding_NameCategory) {
+       while (name_len > 0) {
+           len = (int)name[0];
+           if (!strncmp(&name[1], "COMPOUND_TEXT", len)) {
+               if (!(ctom_conv = _XlcOpenConverter(lcd,
+                                XlcNCompoundText, lcd, XlcNMultiByte)))
+                   return False;
+               if (!(ctow_conv = _XlcOpenConverter(lcd,
+                                XlcNCompoundText, lcd, XlcNWideChar)))
+                   return False;
+               if (!(ctoutf8_conv = _XlcOpenConverter(lcd,
+                                XlcNCompoundText, lcd, XlcNUtf8String)))
+                   return False;
+               break;
+           } else {
+               /*
+                * Not yet
+                */
+           }
+           len += sizeof(BYTE);
+           name_len -= len;
+           name += len;
+       }
+    } else if (category == XIM_Encoding_DetailCategory) {
+       /*
+        * Not yet
+        */
+    } else {
+       return False;
+    }
+
+    private->ctom_conv = ctom_conv;
+    private->ctow_conv = ctow_conv;
+    private->ctoutf8_conv = ctoutf8_conv;
+
+    if (!(conv = _XlcOpenConverter(lcd,        XlcNCharSet, lcd, XlcNMultiByte)))
+       return False;
+    private->cstomb_conv = conv;
+
+    if (!(conv = _XlcOpenConverter(lcd,        XlcNCharSet, lcd, XlcNWideChar)))
+       return False;
+    private->cstowc_conv = conv;
+
+    if (!(conv = _XlcOpenConverter(lcd,        XlcNCharSet, lcd, XlcNUtf8String)))
+       return False;
+    private->cstoutf8_conv = conv;
+
+    if (!(conv = _XlcOpenConverter(lcd,        XlcNUcsChar, lcd, XlcNChar)))
+       return False;
+    private->ucstoc_conv = conv;
+
+    if (!(conv = _XlcOpenConverter(lcd,        XlcNUcsChar, lcd, XlcNUtf8String)))
+       return False;
+    private->ucstoutf8_conv = conv;
+
+    return True;
+}
+
+Private        Bool
+_XimEncodingNegoCheck(
+    Xim                 im,
+    INT16       len,
+    XPointer    data,
+    XPointer    arg)
+{
+    CARD16     *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
+    CARD8       major_opcode = *((CARD8 *)data);
+    CARD8       minor_opcode = *((CARD8 *)data + 1);
+    XIMID       imid = buf_s[0];
+
+    if ((major_opcode == XIM_ENCODING_NEGOTIATION_REPLY)
+     && (minor_opcode == 0)
+     && (imid == im->private.proto.imid))
+       return True;
+    if ((major_opcode == XIM_ERROR)
+     && (minor_opcode == 0)
+     && (buf_s[2] & XIM_IMID_VALID)
+     && (imid == im->private.proto.imid))
+       return True;
+    return False;
+}
+
+Private Bool
+_XimEncodingNegotiation(
+    Xim                 im)
+{
+    char       *name_ptr = 0;
+    int                 name_len = 0;
+    char       *detail_ptr = 0;
+    int                 detail_len = 0;
+    CARD8      *buf;
+    CARD16     *buf_s;
+    INT16       len;
+    CARD32      reply32[BUFSIZE/4];
+    char       *reply = (char *)reply32;
+    XPointer    preply;
+    int                 buf_size;
+    int                 ret_code;
+
+    if (!(_XimSetEncodingByName(im, &name_ptr, &name_len)))
+       return False;
+
+    if (!(_XimSetEncodingByDetail(im, &detail_ptr, &detail_len)))
+       goto free_name_ptr;
+
+    len = sizeof(CARD16)
+       + sizeof(INT16)
+       + name_len
+       + XIM_PAD(name_len)
+       + sizeof(INT16)
+       + sizeof(CARD16)
+       + detail_len;
+
+    if (!(buf = (CARD8 *)Xmalloc(XIM_HEADER_SIZE + len)))
+       goto free_detail_ptr;
+
+    buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
+
+    buf_s[0] = im->private.proto.imid;
+    buf_s[1] = (INT16)name_len;
+    if (name_ptr)
+       (void)memcpy((char *)&buf_s[2], name_ptr, name_len);
+    XIM_SET_PAD(&buf_s[2], name_len);
+    buf_s = (CARD16 *)((char *)&buf_s[2] + name_len);
+    buf_s[0] = detail_len;
+    buf_s[1] = 0;
+    if (detail_ptr)
+       (void)memcpy((char *)&buf_s[2], detail_ptr, detail_len);
+
+    _XimSetHeader((XPointer)buf, XIM_ENCODING_NEGOTIATION, 0, &len);
+    if (!(_XimWrite(im, len, (XPointer)buf))) {
+       Xfree(buf);
+       goto free_detail_ptr;
+    }
+    _XimFlush(im);
+    Xfree(buf);
+    buf_size = BUFSIZE;
+    ret_code = _XimRead(im, &len, (XPointer)reply, buf_size,
+                                       _XimEncodingNegoCheck, 0);
+    if(ret_code == XIM_TRUE) {
+       preply = reply;
+    } else if(ret_code == XIM_OVERFLOW) {
+       if(len <= 0) {
+           preply = reply;
+       } else {
+           buf_size = len;
+           preply = (XPointer)Xmalloc(buf_size);
+           ret_code = _XimRead(im, &len, preply, buf_size,
+                                       _XimEncodingNegoCheck, 0);
+           if(ret_code != XIM_TRUE)
+               goto free_preply;
+       }
+    } else
+       goto free_detail_ptr;
+    buf_s = (CARD16 *)((char *)preply + XIM_HEADER_SIZE);
+    if (*((CARD8 *)preply) == XIM_ERROR) {
+       _XimProcError(im, 0, (XPointer)&buf_s[3]);
+       goto free_preply;
+    }
+
+    if (!(_XimGetEncoding(im, &buf_s[1], name_ptr, name_len,
+                                               detail_ptr, detail_len)))
+       goto free_preply;
+
+    if (name_ptr)
+       Xfree(name_ptr);
+    if (detail_ptr)
+       Xfree(detail_ptr);
+
+    if(reply != preply)
+       Xfree(preply);
+
+    return True;
+
+free_preply:
+    if (reply != preply)
+       Xfree(preply);
+
+free_detail_ptr:
+    Xfree(detail_ptr);
+
+free_name_ptr:
+    Xfree(name_ptr);
+
+    return False;
+}
+
+#ifdef XIM_CONNECTABLE
+Private Bool
+_XimSendSavedIMValues(
+    Xim                         im)
+{
+    XimDefIMValues      im_values;
+    INT16               len;
+    CARD16             *buf_s;
+    char               *tmp;
+    CARD32              tmp_buf32[BUFSIZE/4];
+    char               *tmp_buf = (char *)tmp_buf32;
+    char               *buf;
+    int                         buf_size;
+    char               *data;
+    int                         data_len;
+    int                         ret_len;
+    int                         total;
+    int                         idx;
+    CARD32              reply32[BUFSIZE/4];
+    char               *reply = (char *)reply32;
+    XPointer            preply;
+    int                         ret_code;
+
+    _XimGetCurrentIMValues(im, &im_values);
+    buf = tmp_buf;
+    buf_size = XIM_HEADER_SIZE + sizeof(CARD16) + sizeof(INT16);
+    data_len = BUFSIZE - buf_size;
+    total = 0;
+    idx = 0;
+    for (;;) {
+       data = &buf[buf_size];
+       if (!_XimEncodeSavedIMATTRIBUTE(im, im->core.im_resources,
+               im->core.im_num_resources, &idx, data, data_len,
+               &ret_len, (XPointer)&im_values, XIM_SETIMVALUES)) {
+           if (buf != tmp_buf)
+               Xfree(buf);
+           return False;
+       }
+
+       total += ret_len;
+       if (idx == -1) {
+           break;
+       }
+
+       buf_size += ret_len;
+       if (buf == tmp_buf) {
+           if (!(tmp = (char *)Xmalloc(buf_size + data_len))) {
+               return False;
+           }
+           memcpy(tmp, buf, buf_size);
+           buf = tmp;
+       } else {
+           if (!(tmp = (char *)Xrealloc(buf, (buf_size + data_len)))) {
+               Xfree(buf);
+               return False;
+           }
+           buf = tmp;
+       }
+    }
+
+    if (!total)
+       return True;
+
+    buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
+    buf_s[0] = im->private.proto.imid;
+    buf_s[1] = (INT16)total;
+
+    len = (INT16)(sizeof(CARD16) + sizeof(INT16) + total);
+    _XimSetHeader((XPointer)buf, XIM_SET_IM_VALUES, 0, &len);
+    if (!(_XimWrite(im, len, (XPointer)buf))) {
+       if (buf != tmp_buf)
+           Xfree(buf);
+       return False;
+    }
+    _XimFlush(im);
+    if (buf != tmp_buf)
+       Xfree(buf);
+    buf_size = BUFSIZE;
+    ret_code = _XimRead(im, &len, (XPointer)reply, buf_size,
+                                        _XimSetIMValuesCheck, 0);
+    if(ret_code == XIM_TRUE) {
+       preply = reply;
+    } else if(ret_code == XIM_OVERFLOW) {
+       if(len <= 0) {
+           preply = reply;
+       } else {
+           buf_size = (int)len;
+           preply = (XPointer)Xmalloc(buf_size);
+           ret_code = _XimRead(im, &len, reply, buf_size,
+                                       _XimSetIMValuesCheck, 0);
+           if(ret_code != XIM_TRUE) {
+               Xfree(preply);
+               return False;
+           }
+       }
+    } else
+       return False;
+
+    buf_s = (CARD16 *)((char *)preply + XIM_HEADER_SIZE);
+    if (*((CARD8 *)preply) == XIM_ERROR) {
+       _XimProcError(im, 0, (XPointer)&buf_s[3]);
+       if(reply != preply)
+           Xfree(preply);
+       return False;
+    }
+    if(reply != preply)
+       Xfree(preply);
+
+    return True;
+}
+
+Private void
+_XimDelayModeIMFree(
+    Xim                 im)
+{
+    if (im->core.im_resources) {
+       Xfree(im->core.im_resources);
+       im->core.im_resources = NULL;
+    }
+    if (im->core.ic_resources) {
+       Xfree(im->core.ic_resources);
+       im->core.ic_resources = NULL;
+    }
+    if (im->core.im_values_list) {
+       Xfree(im->core.im_values_list);
+       im->core.im_values_list = NULL;
+    }
+    if (im->core.ic_values_list) {
+       Xfree(im->core.ic_values_list);
+       im->core.ic_values_list = NULL;
+    }
+    return;
+}
+
+Public Bool
+_XimConnectServer(
+    Xim                 im)
+{
+    Xim                 save_im;
+
+    if (!(save_im = (Xim)Xmalloc(sizeof(XimRec))))
+       return False;
+    memcpy((char *)save_im, (char *)im, sizeof(XimRec));
+
+    if (_XimPreConnect(im) && _XimConnection(im)
+                       && _XimOpen(im) && _XimEncodingNegotiation(im)) {
+       if (_XimSendSavedIMValues(im)) {
+           _XimDelayModeIMFree(save_im);
+           _XimRegisterServerFilter(im);
+           Xfree(save_im);
+           return True;
+       }
+    }
+    memcpy((char *)im, (char *)save_im, sizeof(XimRec));
+    Xfree(save_im);
+    return False;
+}
+
+Public Bool
+_XimDelayModeSetAttr(
+    Xim                         im)
+{
+    XimDefIMValues      im_values;
+
+    if(!_XimSetIMResourceList(&im->core.im_resources,
+                                               &im->core.im_num_resources)) {
+       return False;
+    }
+    if(!_XimSetICResourceList(&im->core.ic_resources,
+                                               &im->core.ic_num_resources)) {
+       return False;
+    }
+
+    _XimSetIMMode(im->core.im_resources, im->core.im_num_resources);
+
+    _XimGetCurrentIMValues(im, &im_values);
+    if(!_XimSetLocalIMDefaults(im, (XPointer)&im_values,
+                       im->core.im_resources, im->core.im_num_resources)) {
+       return False;
+    }
+    _XimSetCurrentIMValues(im, &im_values);
+    if (im->private.proto.default_styles) {
+        if (im->core.styles)
+           Xfree(im->core.styles);
+        im->core.styles = im->private.proto.default_styles;
+    }
+
+    return True;
+}
+
+Private Bool
+_XimReconnectModeSetAttr(
+    Xim                         im)
+{
+    XimDefIMValues      im_values;
+
+    if(!_XimSetIMResourceList(&im->core.im_resources,
+                                               &im->core.im_num_resources)) {
+       return False;
+    }
+    if(!_XimSetICResourceList(&im->core.ic_resources,
+                                               &im->core.ic_num_resources)) {
+       return False;
+    }
+
+    _XimSetIMMode(im->core.im_resources, im->core.im_num_resources);
+
+    if (im->private.proto.default_styles) {
+        if (im->core.styles)
+           Xfree(im->core.styles);
+        im->core.styles = im->private.proto.default_styles;
+    }
+
+    return True;
+}
+#endif /* XIM_CONNECTABLE */
+
+Public Bool
+_XimProtoOpenIM(
+    Xim                 im)
+{
+    _XimInitialResourceInfo();
+
+    im->methods = &im_methods;
+
+#ifdef XIM_CONNECTABLE
+    _XimSetProtoResource(im);
+#endif /* XIM_CONNECTABLE */
+
+    if (_XimPreConnect(im)) {
+       if (_XimConnection(im) && _XimOpen(im) && _XimEncodingNegotiation(im)) {
+           _XimRegisterServerFilter(im);
+           return True;
+       }
+       _XimShutdown(im);
+#ifdef XIM_CONNECTABLE
+    } else if (IS_DELAYBINDABLE(im)) {
+       if (_XimDelayModeSetAttr(im))
+           return True;
+#endif /* XIM_CONNECTABLE */
+    }
+    _XimProtoIMFree(im);
+    return False;
+}
diff --git a/modules/im/ximcp/imDefLkup.c b/modules/im/ximcp/imDefLkup.c
new file mode 100644 (file)
index 0000000..cf75919
--- /dev/null
@@ -0,0 +1,1166 @@
+/******************************************************************
+
+           Copyright 1992, 1993, 1994 by FUJITSU LIMITED
+
+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 FUJITSU LIMITED
+not be used in advertising or publicity pertaining to distribution
+of the software without specific, written prior permission.
+FUJITSU LIMITED makes no representations about the suitability of
+this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL FUJITSU LIMITED 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.
+
+  Author: Takashi Fujiwara     FUJITSU LIMITED
+                               fujiwara@a80.tech.yk.fujitsu.co.jp
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <X11/Xatom.h>
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "Ximint.h"
+
+Public Xic
+_XimICOfXICID(
+    Xim                  im,
+    XICID        icid)
+{
+    Xic                  pic;
+
+    for (pic = (Xic)im->core.ic_chain; pic; pic = (Xic)pic->core.next) {
+       if (pic->private.proto.icid == icid)
+           return pic;
+    }
+    return (Xic)0;
+}
+
+Private void
+_XimProcIMSetEventMask(
+    Xim                 im,
+    XPointer    buf)
+{
+    EVENTMASK  *buf_l = (EVENTMASK *)buf;
+
+    im->private.proto.forward_event_mask     = buf_l[0];
+    im->private.proto.synchronous_event_mask = buf_l[1];
+    return;
+}
+
+Private void
+_XimProcICSetEventMask(
+    Xic                 ic,
+    XPointer    buf)
+{
+    EVENTMASK  *buf_l = (EVENTMASK *)buf;
+
+    ic->private.proto.forward_event_mask     = buf_l[0];
+    ic->private.proto.synchronous_event_mask = buf_l[1];
+    _XimReregisterFilter(ic);
+    return;
+}
+
+Public Bool
+_XimSetEventMaskCallback(
+    Xim                 xim,
+    INT16       len,
+    XPointer    data,
+    XPointer    call_data)
+{
+    CARD16     *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
+    XIMID        imid = buf_s[0];
+    XICID        icid = buf_s[1];
+    Xim                 im = (Xim)call_data;
+    Xic                 ic;
+
+    if (imid == im->private.proto.imid) {
+       if (icid) {
+           ic = _XimICOfXICID(im, icid);
+           _XimProcICSetEventMask(ic, (XPointer)&buf_s[2]);
+       } else {
+           _XimProcIMSetEventMask(im, (XPointer)&buf_s[2]);
+       }
+       return True;
+    }
+    return False;
+}
+
+Private Bool
+_XimSyncCheck(
+    Xim          im,
+    INT16        len,
+    XPointer    data,
+    XPointer     arg)
+{
+    Xic                 ic  = (Xic)arg;
+    CARD16     *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
+    CARD8       major_opcode = *((CARD8 *)data);
+    CARD8       minor_opcode = *((CARD8 *)data + 1);
+    XIMID       imid = buf_s[0];
+    XICID       icid = buf_s[1];
+
+    if ((major_opcode == XIM_SYNC_REPLY)
+     && (minor_opcode == 0)
+     && (imid == im->private.proto.imid)
+     && (icid == ic->private.proto.icid))
+       return True;
+    if ((major_opcode == XIM_ERROR)
+     && (minor_opcode == 0)
+     && (buf_s[2] & XIM_IMID_VALID)
+     && (imid == im->private.proto.imid)
+     && (buf_s[2] & XIM_ICID_VALID)
+     && (icid == ic->private.proto.icid))
+       return True;
+    return False;
+}
+
+Public Bool
+_XimSync(
+    Xim                 im,
+    Xic                 ic)
+{
+    CARD32      buf32[BUFSIZE/4];
+    CARD8      *buf = (CARD8 *)buf32;
+    CARD16     *buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
+    INT16       len;
+    CARD32      reply32[BUFSIZE/4];
+    char       *reply = (char *)reply32;
+    XPointer    preply;
+    int                 buf_size;
+    int                 ret_code;
+
+    buf_s[0] = im->private.proto.imid;         /* imid */
+    buf_s[1] = ic->private.proto.icid;         /* icid */
+
+    len = sizeof(CARD16)                       /* sizeof imid */
+       + sizeof(CARD16);                       /* sizeof icid */
+
+    _XimSetHeader((XPointer)buf, XIM_SYNC, 0, &len);
+    if (!(_XimWrite(im, len, (XPointer)buf)))
+       return False;
+    _XimFlush(im);
+    buf_size = BUFSIZE;
+    ret_code = _XimRead(im, &len, (XPointer)reply, buf_size,
+                                       _XimSyncCheck, (XPointer)ic);
+    if(ret_code == XIM_TRUE) {
+       preply = reply;
+    } else if(ret_code == XIM_OVERFLOW) {
+       if(len <= 0) {
+           preply = reply;
+       } else {
+           buf_size = len;
+           preply = (XPointer)Xmalloc(len);
+           ret_code = _XimRead(im, &len, preply, buf_size,
+                                       _XimSyncCheck, (XPointer)ic);
+           if(ret_code != XIM_TRUE) {
+               Xfree(preply);
+               return False;
+           }
+       }
+    } else {
+       return False;
+    }
+    buf_s = (CARD16 *)((char *)preply + XIM_HEADER_SIZE);
+    if (*((CARD8 *)preply) == XIM_ERROR) {
+       _XimProcError(im, 0, (XPointer)&buf_s[3]);
+       if(reply != preply)
+           Xfree(preply);
+       return False;
+    }
+    if(reply != preply)
+       Xfree(preply);
+    return True;
+}
+
+Public Bool
+_XimProcSyncReply(
+    Xim                 im,
+    Xic                 ic)
+{
+    CARD32      buf32[BUFSIZE/4];
+    CARD8      *buf = (CARD8 *)buf32;
+    CARD16     *buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
+    INT16       len;
+
+    buf_s[0] = im->private.proto.imid;         /* imid */
+    buf_s[1] = ic->private.proto.icid;         /* icid */
+
+    len = sizeof(CARD16)                       /* sizeof imid */
+       + sizeof(CARD16);                       /* sizeof icid */
+
+    _XimSetHeader((XPointer)buf, XIM_SYNC_REPLY, 0, &len);
+    if (!(_XimWrite(im, len, (XPointer)buf)))
+       return False;
+    _XimFlush(im);
+    return True;
+}
+
+Public Bool
+_XimRespSyncReply(
+    Xic                 ic,
+    BITMASK16   mode)
+{
+    if (mode & XimSYNCHRONUS) /* SYNC Request */
+       MARK_NEED_SYNC_REPLY(ic->core.im);
+
+    return True;
+}
+
+Public Bool
+_XimSyncCallback(
+    Xim                 xim,
+    INT16       len,
+    XPointer    data,
+    XPointer    call_data)
+{
+    CARD16     *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
+    XIMID        imid = buf_s[0];
+    XICID        icid = buf_s[1];
+    Xim                 im = (Xim)call_data;
+    Xic                 ic;
+
+    if ((imid == im->private.proto.imid)
+     && (ic = _XimICOfXICID(im, icid))) {
+       (void)_XimProcSyncReply(im, ic);
+       return True;
+    }
+    return False;
+}
+
+Private INT16
+_XimSetEventToWire(
+    XEvent     *ev,
+    xEvent     *event)
+{
+    if (!(_XimProtoEventToWire(ev, event, False)))
+       return 0;
+    event->u.u.sequenceNumber =
+               ((XAnyEvent *)ev)->serial & (unsigned long)0xffff;
+    return sz_xEvent;
+}
+
+Private Bool
+_XimForwardEventCore(
+    Xic                 ic,
+    XEvent     *ev,
+    Bool        sync)
+{
+    Xim                 im = (Xim)ic->core.im;
+    CARD32      buf32[BUFSIZE/4];
+    CARD8      *buf = (CARD8 *)buf32;
+    CARD16     *buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
+    CARD32      reply32[BUFSIZE/4];
+    char       *reply = (char *)reply32;
+    XPointer    preply;
+    int                 buf_size;
+    int                 ret_code;
+    INT16       len;
+
+    if (!(len = _XimSetEventToWire(ev, (xEvent *)&buf_s[4])))
+       return False;                           /* X event */
+
+    buf_s[0] = im->private.proto.imid;         /* imid */
+    buf_s[1] = ic->private.proto.icid;         /* icid */
+    buf_s[2] = sync ? XimSYNCHRONUS : 0;       /* flag */
+    buf_s[3] =
+        (CARD16)((((XAnyEvent *)ev)->serial & ~((unsigned long)0xffff)) >> 16);
+                                               /* serial number */
+
+    len += sizeof(CARD16)                      /* sizeof imid */
+        + sizeof(CARD16)                       /* sizeof icid */
+        + sizeof(BITMASK16)                    /* sizeof flag */
+        + sizeof(CARD16);                      /* sizeof serila number */
+
+    _XimSetHeader((XPointer)buf, XIM_FORWARD_EVENT, 0, &len);
+    if (!(_XimWrite(im, len, (XPointer)buf)))
+       return False;
+    _XimFlush(im);
+
+    if (sync) {
+       buf_size = BUFSIZE;
+       ret_code = _XimRead(im, &len, (XPointer)reply, buf_size,
+                                       _XimSyncCheck, (XPointer)ic);
+       if(ret_code == XIM_TRUE) {
+           preply = reply;
+       } else if(ret_code == XIM_OVERFLOW) {
+           if(len <= 0) {
+               preply = reply;
+           } else {
+               buf_size = len;
+               preply = (XPointer)Xmalloc(len);
+               ret_code = _XimRead(im, &len, preply, buf_size,
+                                       _XimSyncCheck, (XPointer)ic);
+               if(ret_code != XIM_TRUE) {
+                   Xfree(preply);
+                   return False;
+               }
+           }
+       } else {
+           return False;
+       }
+       buf_s = (CARD16 *)((char *)preply + XIM_HEADER_SIZE);
+       if (*((CARD8 *)preply) == XIM_ERROR) {
+           _XimProcError(im, 0, (XPointer)&buf_s[3]);
+           if(reply != preply)
+               Xfree(preply);
+           return False;
+       }
+       if(reply != preply)
+           Xfree(preply);
+    }
+    return True;
+}
+
+Public Bool
+_XimForwardEvent(
+    Xic                 ic,
+    XEvent     *ev,
+    Bool        sync)
+{
+#ifdef EXT_FORWARD
+    if (((ev->type == KeyPress) || (ev->type == KeyRelease)))
+       if (_XimExtForwardKeyEvent(ic, (XKeyEvent *)ev, sync))
+           return True;
+#endif
+    return _XimForwardEventCore(ic, ev, sync);
+}
+
+Private void
+_XimProcEvent(
+    Display            *d,
+    Xic                         ic,
+    XEvent             *ev,
+    CARD16             *buf)
+{
+    INT16       serial = buf[0];
+    xEvent     *xev = (xEvent *)&buf[1];
+
+    _XimProtoWireToEvent(ev, xev, False);
+    ev->xany.serial |= serial << 16;
+    ev->xany.send_event = False;
+    ev->xany.display = d;
+    MARK_FABRICATED(ic->core.im);
+    return;
+}
+
+Private Bool
+_XimForwardEventRecv(
+    Xim                 im,
+    Xic                 ic,
+    XPointer    buf)
+{
+    CARD16     *buf_s = (CARD16 *)buf;
+    Display    *d = im->core.display;
+    XEvent      ev;
+
+    _XimProcEvent(d, ic, &ev, &buf_s[1]);
+
+    (void)_XimRespSyncReply(ic, buf_s[0]);
+
+    XPutBackEvent(d, &ev);
+
+    return True;
+}
+
+Public Bool
+_XimForwardEventCallback(
+    Xim                 xim,
+    INT16       len,
+    XPointer    data,
+    XPointer    call_data)
+{
+    CARD16     *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
+    XIMID        imid = buf_s[0];
+    XICID        icid = buf_s[1];
+    Xim                 im = (Xim)call_data;
+    Xic                 ic;
+
+    if ((imid == im->private.proto.imid)
+     && (ic = _XimICOfXICID(im, icid))) {
+       (void)_XimForwardEventRecv(im, ic, (XPointer)&buf_s[2]);
+       return True;
+    }
+    return False;
+}
+
+Private Bool
+_XimRegisterTriggerkey(
+    Xim                         im,
+    XPointer            buf)
+{
+    CARD32             *buf_l = (CARD32 *)buf;
+    CARD32              len;
+    CARD32             *key;
+
+    if (IS_DYNAMIC_EVENT_FLOW(im))     /* already Dynamic event flow mode */
+       return True;
+
+    /*
+     *  register onkeylist
+     */
+
+    len = buf_l[0];                            /* length of on-keys */
+    len += sizeof(INT32);                      /* sizeof length of on-keys */
+
+    if (!(key = (CARD32 *)Xmalloc(len))) {
+       _XimError(im, 0, XIM_BadAlloc, (INT16)0, (CARD16)0, (char *)NULL);
+       return False;
+    }
+    memcpy((char *)key, (char *)buf_l, len);
+    im->private.proto.im_onkeylist = key;
+
+    MARK_DYNAMIC_EVENT_FLOW(im);
+
+    /*
+     *  register offkeylist
+     */
+
+    buf_l = (CARD32 *)((char *)buf + len);
+    len = buf_l[0];                            /* length of off-keys */
+    len += sizeof(INT32);                      /* sizeof length of off-keys */
+
+    if (!(key = (CARD32 *)Xmalloc(len))) {
+       _XimError(im, 0, XIM_BadAlloc, (INT16)0, (CARD16)0, (char *)NULL);
+       return False;
+    }
+
+    memcpy((char *)key, (char *)buf_l, len);
+    im->private.proto.im_offkeylist = key;
+
+    return True;
+}
+
+Public Bool
+_XimRegisterTriggerKeysCallback(
+    Xim                 xim,
+    INT16       len,
+    XPointer    data,
+    XPointer    call_data)
+{
+    CARD16     *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
+    Xim                 im = (Xim)call_data;
+
+    (void )_XimRegisterTriggerkey(im, (XPointer)&buf_s[2]);
+    return True;
+}
+
+Public EVENTMASK
+_XimGetWindowEventmask(
+    Xic                 ic)
+{
+    Xim                        im = (Xim )ic->core.im;
+    XWindowAttributes  atr;
+
+    if (!XGetWindowAttributes(im->core.display, ic->core.focus_window, &atr))
+       return 0;
+    return (EVENTMASK)atr.your_event_mask;
+}
+
+
+Private Bool
+_XimTriggerNotifyCheck(
+    Xim          im,
+    INT16        len,
+    XPointer    data,
+    XPointer     arg)
+{
+    Xic                 ic  = (Xic)arg;
+    CARD16     *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
+    CARD8       major_opcode = *((CARD8 *)data);
+    CARD8       minor_opcode = *((CARD8 *)data + 1);
+    XIMID       imid = buf_s[0];
+    XICID       icid = buf_s[1];
+
+    if ((major_opcode == XIM_TRIGGER_NOTIFY_REPLY)
+     && (minor_opcode == 0)
+     && (imid == im->private.proto.imid)
+     && (icid == ic->private.proto.icid))
+       return True;
+    if ((major_opcode == XIM_ERROR)
+     && (minor_opcode == 0)
+     && (buf_s[2] & XIM_IMID_VALID)
+     && (imid == im->private.proto.imid)
+     && (buf_s[2] & XIM_ICID_VALID)
+     && (icid == ic->private.proto.icid))
+       return True;
+    return False;
+}
+
+Public Bool
+_XimTriggerNotify(
+    Xim                 im,
+    Xic                 ic,
+    int                 mode,
+    CARD32      idx)
+{
+    CARD32      buf32[BUFSIZE/4];
+    CARD8      *buf = (CARD8 *)buf32;
+    CARD16     *buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
+    CARD32     *buf_l = (CARD32 *)&buf[XIM_HEADER_SIZE];
+    CARD32      reply32[BUFSIZE/4];
+    char       *reply = (char *)reply32;
+    XPointer    preply;
+    int                 buf_size;
+    int                 ret_code;
+    INT16       len;
+    EVENTMASK   mask = _XimGetWindowEventmask(ic);
+
+    buf_s[0] = im->private.proto.imid; /* imid */
+    buf_s[1] = ic->private.proto.icid; /* icid */
+    buf_l[1] = mode;                   /* flag */
+    buf_l[2] = idx;                    /* index of keys list */
+    buf_l[3] = mask;                   /* select-event-mask */
+
+    len = sizeof(CARD16)               /* sizeof imid */
+       + sizeof(CARD16)                /* sizeof icid */
+       + sizeof(CARD32)                /* sizeof flag */
+       + sizeof(CARD32)                /* sizeof index of key list */
+       + sizeof(EVENTMASK);            /* sizeof select-event-mask */
+
+    _XimSetHeader((XPointer)buf, XIM_TRIGGER_NOTIFY, 0, &len);
+    if (!(_XimWrite(im, len, (XPointer)buf)))
+       return False;
+    _XimFlush(im);
+    buf_size = BUFSIZE;
+    ret_code = _XimRead(im, &len, (XPointer)reply, buf_size,
+                               _XimTriggerNotifyCheck, (XPointer)ic);
+    if(ret_code == XIM_TRUE) {
+       preply = reply;
+    } else if(ret_code == XIM_OVERFLOW) {
+       if(len <= 0) {
+           preply = reply;
+       } else {
+           buf_size = len;
+           preply = (XPointer)Xmalloc(len);
+           ret_code = _XimRead(im, &len, (XPointer)reply, buf_size,
+                               _XimTriggerNotifyCheck, (XPointer)ic);
+           if(ret_code != XIM_TRUE) {
+               Xfree(preply);
+               return False;
+           }
+       }
+    } else {
+       return False;
+    }
+    buf_s = (CARD16 *)((char *)preply + XIM_HEADER_SIZE);
+    if (*((CARD8 *)preply) == XIM_ERROR) {
+       _XimProcError(im, 0, (XPointer)&buf_s[3]);
+       if(reply != preply)
+           Xfree(preply);
+       return False;
+    }
+    if(reply != preply)
+       Xfree(preply);
+    return True;
+}
+
+Private Bool
+_XimRegCommitInfo(
+    Xic                         ic,
+    char               *string,
+    int                         string_len,
+    KeySym             *keysym,
+    int                         keysym_len)
+{
+    XimCommitInfo      info;
+
+    if (!(info = (XimCommitInfo)Xmalloc(sizeof(XimCommitInfoRec))))
+       return False;
+    info->string       = string;
+    info->string_len   = string_len;
+    info->keysym       = keysym;
+    info->keysym_len   = keysym_len;
+    info->next = ic->private.proto.commit_info;
+    ic->private.proto.commit_info = info;
+    return True;
+}
+
+Private void
+_XimUnregCommitInfo(
+    Xic                        ic)
+{
+    XimCommitInfo      info;
+
+    if (!(info = ic->private.proto.commit_info))
+       return;
+
+    if (info->string)
+       Xfree(info->string);
+    if (info->keysym)
+       Xfree(info->keysym);
+    ic->private.proto.commit_info = info->next;
+    Xfree(info);
+    return;
+}
+
+Public void
+_XimFreeCommitInfo(
+    Xic                        ic)
+{
+    while (ic->private.proto.commit_info)
+       _XimUnregCommitInfo(ic);
+    return;
+}
+
+Private Bool
+_XimProcKeySym(
+    Xic                          ic,
+    CARD32               sym,
+    KeySym             **xim_keysym,
+    int                         *xim_keysym_len)
+{
+    Xim                         im = (Xim)ic->core.im;
+
+    if (!(*xim_keysym = (KeySym *)Xmalloc(sizeof(KeySym)))) {
+       _XimError(im, ic, XIM_BadAlloc, (INT16)0, (CARD16)0, (char *)NULL);
+       return False;
+    }
+
+    **xim_keysym = (KeySym)sym;
+    *xim_keysym_len = 1;
+
+    return True;
+}
+
+Private Bool
+_XimProcCommit(
+    Xic                  ic,
+    BYTE        *buf,
+    int                  len,
+    char       **xim_string,
+    int                 *xim_string_len)
+{
+    Xim                 im = (Xim)ic->core.im;
+    char       *string;
+
+    if (!(string = (char *)Xmalloc(len + 1))) {
+       _XimError(im, ic, XIM_BadAlloc, (INT16)0, (CARD16)0, (char *)NULL);
+       return False;
+    }
+
+    (void)memcpy(string, (char *)buf, len);
+    string[len] = '\0';
+
+    *xim_string = string;
+    *xim_string_len = len;
+    return True;
+}
+
+Private Bool
+_XimCommitRecv(
+    Xim                 im,
+    Xic                 ic,
+    XPointer    buf)
+{
+    CARD16     *buf_s = (CARD16 *)buf;
+    BITMASK16   flag = buf_s[0];
+    XKeyEvent   ev;
+    char       *string = NULL;
+    int                 string_len = 0;
+    KeySym     *keysym = NULL;
+    int                 keysym_len = 0;
+
+    if ((flag & XimLookupBoth) == XimLookupChars) {
+       if (!(_XimProcCommit(ic, (BYTE *)&buf_s[2],
+                                       (int)buf_s[1], &string, &string_len)))
+           return False;
+
+    } else if ((flag & XimLookupBoth) == XimLookupKeySym) {
+       if (!(_XimProcKeySym(ic, *(CARD32 *)&buf_s[2], &keysym, &keysym_len)))
+           return False;
+
+    } else if ((flag & XimLookupBoth) == XimLookupBoth) {
+       if (!(_XimProcKeySym(ic, *(CARD32 *)&buf_s[2], &keysym, &keysym_len)))
+           return False;
+
+       if (!(_XimProcCommit(ic, (BYTE *)&buf_s[5],
+                                       (int)buf_s[4], &string, &string_len))) {
+           Xfree(keysym);
+           return False;
+       }
+    }
+
+    if (!(_XimRegCommitInfo(ic, string, string_len, keysym, keysym_len))) {
+       if (string)
+           Xfree(string);
+       if (keysym)
+           Xfree(keysym);
+       _XimError(im, ic, XIM_BadAlloc, (INT16)0, (CARD16)0, (char *)NULL);
+       return False;
+    }
+
+    (void)_XimRespSyncReply(ic, flag);
+
+    MARK_FABRICATED(im);
+
+    ev.type = KeyPress;
+    ev.send_event = False;
+    ev.display = im->core.display;
+    ev.window = ic->core.focus_window;
+    ev.keycode = 0;
+    ev.state = 0;
+
+    XPutBackEvent(im->core.display, (XEvent *)&ev);
+
+    return True;
+}
+
+Public Bool
+_XimCommitCallback(
+    Xim                 xim,
+    INT16       len,
+    XPointer    data,
+    XPointer    call_data)
+{
+    CARD16     *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
+    XIMID        imid = buf_s[0];
+    XICID        icid = buf_s[1];
+    Xim                 im = (Xim)call_data;
+    Xic                 ic;
+
+    if ((imid == im->private.proto.imid)
+     && (ic = _XimICOfXICID(im, icid))) {
+       (void)_XimCommitRecv(im, ic, (XPointer)&buf_s[2]);
+       return True;
+    }
+    return False;
+}
+
+Public void
+_XimProcError(
+    Xim                 im,
+    Xic                 ic,
+    XPointer    data)
+{
+    return;
+}
+
+Public Bool
+_XimErrorCallback(
+    Xim                 xim,
+    INT16       len,
+    XPointer    data,
+    XPointer    call_data)
+{
+    CARD16     *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
+    BITMASK16   flag = buf_s[2];
+    XIMID        imid;
+    XICID        icid;
+    Xim                 im = (Xim)call_data;
+    Xic                 ic = NULL;
+
+    if (flag & XIM_IMID_VALID) {
+       imid = buf_s[0];
+       if (imid != im->private.proto.imid)
+           return False;
+    }
+    if (flag & XIM_ICID_VALID) {
+       icid = buf_s[1];
+       if (!(ic = _XimICOfXICID(im, icid)))
+           return False;
+    }
+    _XimProcError(im, ic, (XPointer)&buf_s[3]);
+
+    return True;
+}
+
+Public Bool
+_XimError(
+    Xim                 im,
+    Xic                 ic,
+    CARD16      error_code,
+    INT16       detail_length,
+    CARD16      type,
+    char       *detail)
+{
+    CARD32      buf32[BUFSIZE/4];
+    CARD8      *buf = (CARD8 *)buf32;
+    CARD16     *buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
+    INT16       len = 0;
+
+    buf_s[0] = im->private.proto.imid; /* imid */
+    buf_s[2] = XIM_IMID_VALID;         /* flag */
+    if (ic) {
+       buf_s[1] = ic->private.proto.icid;      /* icid */
+       buf_s[2] |= XIM_ICID_VALID;             /* flag */
+    }
+    buf_s[3] = error_code;                     /* Error Code */
+    buf_s[4] = detail_length;                  /* length of error detail */
+    buf_s[5] = type;                           /* type of error detail */
+
+    if (detail_length && detail) {
+       len = detail_length;
+       memcpy((char *)&buf_s[6], detail, len);
+       XIM_SET_PAD(&buf_s[6], len);
+    }
+
+    len += sizeof(CARD16)              /* sizeof imid */
+        + sizeof(CARD16)               /* sizeof icid */
+        + sizeof(BITMASK16)            /* sizeof flag */
+        + sizeof(CARD16)               /* sizeof error_code */
+        + sizeof(INT16)                /* sizeof length of detail */
+        + sizeof(CARD16);              /* sizeof type */
+
+    _XimSetHeader((XPointer)buf, XIM_ERROR, 0, &len);
+    if (!(_XimWrite(im, len, (XPointer)buf)))
+       return False;
+    _XimFlush(im);
+    return True;
+}
+
+Private int
+_Ximctsconvert(
+    XlcConv     conv,
+    char       *from,
+    int                 from_len,
+    char       *to,
+    int                 to_len,
+    Status     *state)
+{
+    int                 from_left;
+    int                 to_left;
+    int                 from_savelen;
+    int                 to_savelen;
+    int                 from_cnvlen;
+    int                 to_cnvlen;
+    char       *from_buf;
+    char       *to_buf;
+    char        scratchbuf[BUFSIZ];
+    Status      tmp_state;
+
+    if (!state)
+       state = &tmp_state;
+
+    if (!conv || !from || !from_len) {
+       *state = XLookupNone;
+       return 0;
+    }
+
+    /* Reset the converter.  The CompoundText at 'from' starts in
+       initial state.  */
+    _XlcResetConverter(conv);
+
+    from_left = from_len;
+    to_left = BUFSIZ;
+    from_cnvlen = 0;
+    to_cnvlen = 0;
+    for (;;) {
+       from_buf = &from[from_cnvlen];
+       from_savelen = from_left;
+       to_buf = &scratchbuf[to_cnvlen];
+       to_savelen = to_left;
+       if (_XlcConvert(conv, (XPointer *)&from_buf, &from_left,
+                                (XPointer *)&to_buf, &to_left, NULL, 0) < 0) {
+           *state = XLookupNone;
+           return 0;
+       }
+       from_cnvlen += (from_savelen - from_left);
+       to_cnvlen += (to_savelen - to_left);
+       if (from_left == 0) {
+           if (!to_cnvlen) {
+               *state = XLookupNone;
+               return 0;
+           }
+          break;
+       }
+    }
+
+    if (!to || !to_len || (to_len < to_cnvlen)) {
+       *state = XBufferOverflow;
+    } else {
+       memcpy(to, scratchbuf, to_cnvlen);
+       *state = XLookupChars;
+    }
+    return to_cnvlen;
+}
+
+Public int
+_Ximctstombs(XIM xim, char *from, int from_len,
+            char *to, int to_len, Status *state)
+{
+    return _Ximctsconvert(((Xim)xim)->private.proto.ctom_conv,
+                         from, from_len, to, to_len, state);
+}
+
+Public int
+_Ximctstowcs(
+    XIM                 xim,
+    char       *from,
+    int                 from_len,
+    wchar_t    *to,
+    int                 to_len,
+    Status     *state)
+{
+    Xim                 im = (Xim)xim;
+    XlcConv     conv = im->private.proto.ctow_conv;
+    int                 from_left;
+    int                 to_left;
+    int                 from_savelen;
+    int                 to_savelen;
+    int                 from_cnvlen;
+    int                 to_cnvlen;
+    char       *from_buf;
+    wchar_t    *to_buf;
+    wchar_t     scratchbuf[BUFSIZ];
+    Status      tmp_state;
+
+    if (!state)
+       state = &tmp_state;
+
+    if (!conv || !from || !from_len) {
+       *state = XLookupNone;
+       return 0;
+    }
+
+    /* Reset the converter.  The CompoundText at 'from' starts in
+       initial state.  */
+    _XlcResetConverter(conv);
+
+    from_left = from_len;
+    to_left = BUFSIZ;
+    from_cnvlen = 0;
+    to_cnvlen = 0;
+    for (;;) {
+       from_buf = &from[from_cnvlen];
+       from_savelen = from_left;
+       to_buf = &scratchbuf[to_cnvlen];
+       to_savelen = to_left;
+       if (_XlcConvert(conv, (XPointer *)&from_buf, &from_left,
+                                (XPointer *)&to_buf, &to_left, NULL, 0) < 0) {
+           *state = XLookupNone;
+           return 0;
+       }
+       from_cnvlen += (from_savelen - from_left);
+       to_cnvlen += (to_savelen - to_left);
+       if (from_left == 0) {
+           if (!to_cnvlen){
+               *state = XLookupNone;
+               return 0;
+           }
+           break;
+       }
+    }
+
+    if (!to || !to_len || (to_len < to_cnvlen)) {
+       *state = XBufferOverflow;
+    } else {
+       memcpy(to, scratchbuf, to_cnvlen * sizeof(wchar_t));
+       *state = XLookupChars;
+    }
+    return to_cnvlen;
+}
+
+Public int
+_Ximctstoutf8(
+    XIM                 xim,
+    char       *from,
+    int                 from_len,
+    char       *to,
+    int                 to_len,
+    Status     *state)
+{
+    return _Ximctsconvert(((Xim)xim)->private.proto.ctoutf8_conv,
+                         from, from_len, to, to_len, state);
+}
+
+Public int
+_XimProtoMbLookupString(
+    XIC                         xic,
+    XKeyEvent          *ev,
+    char               *buffer,
+    int                         bytes,
+    KeySym             *keysym,
+    Status             *state)
+{
+    Xic                         ic = (Xic)xic;
+    Xim                         im = (Xim)ic->core.im;
+    int                         ret;
+    Status              tmp_state;
+    XimCommitInfo       info;
+
+    if (!IS_SERVER_CONNECTED(im))
+       return 0;
+
+    if (!state)
+       state = &tmp_state;
+
+    if ((ev->type == KeyPress) && (ev->keycode == 0)) { /* Filter function */
+       if (!(info = ic->private.proto.commit_info)) {
+           *state = XLookupNone;
+           return 0;
+       }
+
+       ret = im->methods->ctstombs((XIM)im, info->string,
+                               info->string_len, buffer, bytes, state);
+       if (*state == XBufferOverflow)
+            return ret;
+       if (keysym && (info->keysym && *(info->keysym))) {
+           *keysym = *(info->keysym);
+           if (*state == XLookupChars)
+               *state = XLookupBoth;
+           else
+               *state = XLookupKeySym;
+       }
+       _XimUnregCommitInfo(ic);
+
+    } else  if (ev->type == KeyPress) {
+       ret = _XimLookupMBText(ic, ev, buffer, bytes, keysym, NULL);
+       if (ret > 0) {
+           if (ret > bytes)
+               *state = XBufferOverflow;
+           else if (keysym && *keysym != NoSymbol)
+               *state = XLookupBoth;
+           else
+               *state = XLookupChars;
+       } else {
+           if (keysym && *keysym != NoSymbol)
+               *state = XLookupKeySym;
+           else
+               *state = XLookupNone;
+       }
+    } else {
+       *state = XLookupNone;
+       ret = 0;
+    }
+
+    return ret;
+}
+
+Public int
+_XimProtoWcLookupString(
+    XIC                         xic,
+    XKeyEvent          *ev,
+    wchar_t            *buffer,
+    int                         bytes,
+    KeySym             *keysym,
+    Status             *state)
+{
+    Xic                         ic = (Xic)xic;
+    Xim                         im = (Xim)ic->core.im;
+    int                         ret;
+    Status              tmp_state;
+    XimCommitInfo       info;
+
+    if (!IS_SERVER_CONNECTED(im))
+       return 0;
+
+    if (!state)
+       state = &tmp_state;
+
+    if (ev->type == KeyPress && ev->keycode == 0) { /* Filter function */
+       if (!(info = ic->private.proto.commit_info)) {
+           *state = XLookupNone;
+           return 0;
+       }
+
+       ret = im->methods->ctstowcs((XIM)im, info->string,
+                               info->string_len, buffer, bytes, state);
+       if (*state == XBufferOverflow)
+           return ret;
+       if (keysym && (info->keysym && *(info->keysym))) {
+           *keysym = *(info->keysym);
+           if (*state == XLookupChars)
+               *state = XLookupBoth;
+           else
+               *state = XLookupKeySym;
+       }
+       _XimUnregCommitInfo(ic);
+
+    } else if (ev->type == KeyPress) {
+       ret = _XimLookupWCText(ic, ev, buffer, bytes, keysym, NULL);
+       if (ret > 0) {
+           if (ret > bytes)
+               *state = XBufferOverflow;
+           else if (keysym && *keysym != NoSymbol)
+               *state = XLookupBoth;
+           else
+               *state = XLookupChars;
+       } else {
+           if (keysym && *keysym != NoSymbol)
+               *state = XLookupKeySym;
+           else
+               *state = XLookupNone;
+       }
+    } else {
+       *state = XLookupNone;
+       ret = 0;
+    }
+
+    return ret;
+}
+
+Public int
+_XimProtoUtf8LookupString(
+    XIC                         xic,
+    XKeyEvent          *ev,
+    char               *buffer,
+    int                         bytes,
+    KeySym             *keysym,
+    Status             *state)
+{
+    Xic                         ic = (Xic)xic;
+    Xim                         im = (Xim)ic->core.im;
+    int                         ret;
+    Status              tmp_state;
+    XimCommitInfo       info;
+
+    if (!IS_SERVER_CONNECTED(im))
+       return 0;
+
+    if (!state)
+       state = &tmp_state;
+
+    if (ev->type == KeyPress && ev->keycode == 0) { /* Filter function */
+       if (!(info = ic->private.proto.commit_info)) {
+           *state = XLookupNone;
+           return 0;
+       }
+
+       ret = im->methods->ctstoutf8((XIM)im, info->string,
+                               info->string_len, buffer, bytes, state);
+       if (*state == XBufferOverflow)
+           return ret;
+       if (keysym && (info->keysym && *(info->keysym))) {
+           *keysym = *(info->keysym);
+           if (*state == XLookupChars)
+               *state = XLookupBoth;
+           else
+               *state = XLookupKeySym;
+       }
+       _XimUnregCommitInfo(ic);
+
+    } else if (ev->type == KeyPress) {
+       ret = _XimLookupUTF8Text(ic, ev, buffer, bytes, keysym, NULL);
+       if (ret > 0) {
+           if (ret > bytes)
+               *state = XBufferOverflow;
+           else if (keysym && *keysym != NoSymbol)
+               *state = XLookupBoth;
+           else
+               *state = XLookupChars;
+       } else {
+           if (keysym && *keysym != NoSymbol)
+               *state = XLookupKeySym;
+           else
+               *state = XLookupNone;
+       }
+    } else {
+       *state = XLookupNone;
+       ret = 0;
+    }
+
+    return ret;
+}
diff --git a/modules/im/ximcp/imDispch.c b/modules/im/ximcp/imDispch.c
new file mode 100644 (file)
index 0000000..f9b4bdb
--- /dev/null
@@ -0,0 +1,104 @@
+/******************************************************************
+
+                Copyright 1993, 1994 by FUJITSU LIMITED
+
+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 FUJITSU LIMITED
+not be used in advertising or publicity pertaining to distribution
+of the software without specific, written prior permission.
+FUJITSU LIMITED makes no representations about the suitability of
+this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL FUJITSU LIMITED 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.
+
+  Author: Takashi Fujiwara     FUJITSU LIMITED
+                               fujiwara@a80.tech.yk.fujitsu.co.jp
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <X11/Xlib.h>
+#include "Xlibint.h"
+#include "Xutil.h"
+#include "Xlcint.h"
+#include "Ximint.h"
+
+
+Public Bool
+_XimRegProtoIntrCallback(
+    Xim                 im,
+    CARD16      major_code,
+    CARD16      minor_code,
+    Bool       (*proc)(
+                        Xim, INT16, XPointer, XPointer
+                       ),
+
+    XPointer    call_data)
+{
+    XimProtoIntrRec    *rec;
+
+    if (!(rec = (XimProtoIntrRec *)Xmalloc(sizeof(XimProtoIntrRec))))
+        return False;
+    rec->func       = proc;
+    rec->major_code = major_code;
+    rec->minor_code = minor_code;
+    rec->call_data  = call_data;
+    rec->next       = im->private.proto.intrproto;
+    im->private.proto.intrproto = rec;
+    return True;
+}
+
+Public void
+_XimFreeProtoIntrCallback(Xim im)
+{
+    register XimProtoIntrRec *rec, *next;
+
+    for (rec = im->private.proto.intrproto; rec;) {
+       next = rec->next;
+       Xfree(rec);
+       rec = next;
+    }
+    im->private.proto.intrproto = NULL;
+    return;
+}
+
+Private Bool
+_XimTransportIntr(
+    Xim                 im,
+    INT16       len,
+    XPointer    data,
+    XPointer    call_data)
+{
+    Xim                         call_im = (Xim)call_data;
+    XimProtoIntrRec    *rec = call_im->private.proto.intrproto;
+    CARD8               major_opcode = *((CARD8 *)data);
+    CARD8               minor_opcode = *((CARD8 *)data + 1);
+
+    for (; rec; rec = rec->next) {
+       if ((major_opcode == (CARD8)rec->major_code)
+        && (minor_opcode == (CARD8)rec->minor_code))
+           if ((*rec->func)(call_im, len, data, rec->call_data))
+               return True;
+    }
+    return False;
+}
+
+Public Bool
+_XimDispatchInit(Xim im)
+{
+    if (_XimRegisterDispatcher(im, _XimTransportIntr, (XPointer)im))
+       return True;
+    return False;
+}
diff --git a/modules/im/ximcp/imEvToWire.c b/modules/im/ximcp/imEvToWire.c
new file mode 100644 (file)
index 0000000..497c865
--- /dev/null
@@ -0,0 +1,788 @@
+/***********************************************************
+Copyright 1993 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 <X11/Xlibint.h>
+#include <X11/Xlib.h>
+#include "Ximint.h"
+
+
+#define sw16(n, s) ((s) ?                    \
+                     (((n) << 8 & 0xff00) | \
+                      ((n) >> 8 & 0xff)     \
+                     ) : n)
+
+#define sw32(n, s) ((s) ?                         \
+                     (((n) << 24 & 0xff000000) | \
+                      ((n) <<  8 & 0xff0000) |   \
+                      ((n) >>  8 & 0xff00) |     \
+                      ((n) >> 24 & 0xff)         \
+                     ) : n)
+
+Status
+_XimProtoEventToWire(
+    register XEvent *re,       /* pointer to where event should be reformatted */
+    register xEvent *event,    /* wire protocol event */
+    Bool sw)         /* swap byte? */
+{
+       switch (event->u.u.type = re->type) {
+             case KeyPress:
+             case KeyRelease:
+               {
+                       register XKeyEvent *ev = (XKeyEvent*) re;
+                       event->u.keyButtonPointer.root  = sw32(ev->root, sw);
+                       event->u.keyButtonPointer.event  =
+                           sw32(ev->window, sw);
+                       event->u.keyButtonPointer.child  =
+                           sw32(ev->subwindow, sw);
+                       event->u.keyButtonPointer.time   = sw32(ev->time, sw);
+                       event->u.keyButtonPointer.eventX = sw16(ev->x, sw) ;
+                       event->u.keyButtonPointer.eventY = sw16(ev->y, sw) ;
+                       event->u.keyButtonPointer.rootX  =
+                           sw16(ev->x_root, sw);
+                       event->u.keyButtonPointer.rootY  =
+                           sw16(ev->y_root, sw);
+                       event->u.keyButtonPointer.state  = sw16(ev->state, sw);
+                       event->u.keyButtonPointer.sameScreen = ev->same_screen;
+                       event->u.u.detail = ev->keycode;
+               }
+               break;
+             case ButtonPress:
+             case ButtonRelease:
+               {
+                       register XButtonEvent *ev =  (XButtonEvent *) re;
+                       event->u.keyButtonPointer.root   = sw32(ev->root, sw);
+                       event->u.keyButtonPointer.event  = sw32(ev->window, sw);
+                       event->u.keyButtonPointer.child  = sw32(ev->subwindow, sw);
+                       event->u.keyButtonPointer.time   = sw32(ev->time, sw);
+                       event->u.keyButtonPointer.eventX = sw16(ev->x, sw);
+                       event->u.keyButtonPointer.eventY = sw16(ev->y, sw);
+                       event->u.keyButtonPointer.rootX  = sw16(ev->x_root, sw);
+                       event->u.keyButtonPointer.rootY  = sw16(ev->y_root, sw);
+                       event->u.keyButtonPointer.state  = sw16(ev->state, sw);
+                       event->u.keyButtonPointer.sameScreen    = ev->same_screen;
+                       event->u.u.detail               = ev->button;
+               }
+               break;
+             case MotionNotify:
+               {
+                       register XMotionEvent *ev =   (XMotionEvent *)re;
+                       event->u.keyButtonPointer.root  = sw32(ev->root, sw);
+                       event->u.keyButtonPointer.event = sw32(ev->window, sw);
+                       event->u.keyButtonPointer.child = sw32(ev->subwindow, sw);
+                       event->u.keyButtonPointer.time  = sw32(ev->time, sw);
+                       event->u.keyButtonPointer.eventX= sw16(ev->x, sw);
+                       event->u.keyButtonPointer.eventY= sw16(ev->y, sw);
+                       event->u.keyButtonPointer.rootX = sw16(ev->x_root, sw);
+                       event->u.keyButtonPointer.rootY = sw16(ev->y_root, sw);
+                       event->u.keyButtonPointer.state = sw16(ev->state, sw);
+                       event->u.keyButtonPointer.sameScreen= ev->same_screen;
+                       event->u.u.detail               = ev->is_hint;
+               }
+               break;
+             case EnterNotify:
+             case LeaveNotify:
+               {
+                       register XCrossingEvent *ev   = (XCrossingEvent *) re;
+                       event->u.enterLeave.root        = sw32(ev->root, sw);
+                       event->u.enterLeave.event       = sw32(ev->window, sw);
+                       event->u.enterLeave.child       = sw32(ev->subwindow, sw);
+                       event->u.enterLeave.time        = sw32(ev->time, sw);
+                       event->u.enterLeave.eventX      = sw16(ev->x, sw);
+                       event->u.enterLeave.eventY      = sw16(ev->y, sw);
+                       event->u.enterLeave.rootX       = sw16(ev->x_root, sw);
+                       event->u.enterLeave.rootY       = sw16(ev->y_root, sw);
+                       event->u.enterLeave.state       = sw16(ev->state, sw);
+                       event->u.enterLeave.mode        = ev->mode;
+                       event->u.enterLeave.flags       = 0;
+                       if (ev->same_screen) {
+                               event->u.enterLeave.flags |= ELFlagSameScreen;
+                               }
+                       if (ev->focus) {
+                               event->u.enterLeave.flags |= ELFlagFocus;
+                               }
+                       event->u.u.detail               = ev->detail;
+               }
+                 break;
+             case FocusIn:
+             case FocusOut:
+               {
+                       register XFocusChangeEvent *ev = (XFocusChangeEvent *) re;
+                       event->u.focus.window   = sw32(ev->window, sw);
+                       event->u.focus.mode     = ev->mode;
+                       event->u.u.detail       = ev->detail;
+               }
+                 break;
+             case KeymapNotify:
+               {
+                       register XKeymapEvent *ev = (XKeymapEvent *) re;
+                       memcpy((char *)(((xKeymapEvent *) event)->map),
+                              &ev->key_vector[1],
+                              sizeof (((xKeymapEvent *) event)->map));
+               }
+               break;
+             case Expose:
+               {
+                       register XExposeEvent *ev = (XExposeEvent *) re;
+                       event->u.expose.window          = sw32(ev->window, sw);
+                       event->u.expose.x               = sw16(ev->x, sw);
+                       event->u.expose.y               = sw16(ev->y, sw);
+                       event->u.expose.width           = sw16(ev->width, sw);
+                       event->u.expose.height          = sw16(ev->height, sw);
+                       event->u.expose.count           = sw16(ev->count, sw);
+               }
+               break;
+             case GraphicsExpose:
+               {
+                   register XGraphicsExposeEvent *ev =
+                       (XGraphicsExposeEvent *) re;
+                   event->u.graphicsExposure.drawable  = sw32(ev->drawable, sw);
+                   event->u.graphicsExposure.x         = sw16(ev->x, sw);
+                   event->u.graphicsExposure.y         = sw16(ev->y, sw);
+                   event->u.graphicsExposure.width     = sw16(ev->width, sw);
+                   event->u.graphicsExposure.height    = sw16(ev->height, sw);
+                   event->u.graphicsExposure.count     = sw16(ev->count, sw);
+                   event->u.graphicsExposure.majorEvent= ev->major_code;
+                   event->u.graphicsExposure.minorEvent= sw16(ev->minor_code, sw);
+               }
+               break;
+             case NoExpose:
+               {
+                   register XNoExposeEvent *ev = (XNoExposeEvent *) re;
+                   event->u.noExposure.drawable        = sw32(ev->drawable, sw);
+                   event->u.noExposure.majorEvent      = ev->major_code;
+                   event->u.noExposure.minorEvent      = sw16(ev->minor_code, sw);
+               }
+               break;
+             case VisibilityNotify:
+               {
+                   register XVisibilityEvent *ev = (XVisibilityEvent *) re;
+                   event->u.visibility.window          = sw32(ev->window, sw);
+                   event->u.visibility.state           = ev->state;
+               }
+               break;
+             case CreateNotify:
+               {
+                   register XCreateWindowEvent *ev =
+                        (XCreateWindowEvent *) re;
+                   event->u.createNotify.window        = sw32(ev->window, sw);
+                   event->u.createNotify.parent        = sw32(ev->parent, sw);
+                   event->u.createNotify.x             = sw16(ev->x, sw);
+                   event->u.createNotify.y             = sw16(ev->y, sw);
+                   event->u.createNotify.width         = sw16(ev->width, sw);
+                   event->u.createNotify.height        = sw16(ev->height, sw);
+                   event->u.createNotify.borderWidth   = sw16(ev->border_width, sw);
+                   event->u.createNotify.override      = ev->override_redirect;
+               }
+               break;
+             case DestroyNotify:
+               {
+                   register XDestroyWindowEvent *ev =
+                               (XDestroyWindowEvent *) re;
+                   event->u.destroyNotify.window       = sw32(ev->window, sw);
+                   event->u.destroyNotify.event        = sw32(ev->event, sw);
+               }
+               break;
+             case UnmapNotify:
+               {
+                   register XUnmapEvent *ev = (XUnmapEvent *) re;
+                   event->u.unmapNotify.window = sw32(ev->window, sw);
+                   event->u.unmapNotify.event  = sw32(ev->event, sw);
+                   event->u.unmapNotify.fromConfigure  = ev->from_configure;
+               }
+               break;
+             case MapNotify:
+               {
+                   register XMapEvent *ev = (XMapEvent *) re;
+                   event->u.mapNotify.window   = sw32(ev->window, sw);
+                   event->u.mapNotify.event    = sw32(ev->event, sw);
+                   event->u.mapNotify.override = ev->override_redirect;
+               }
+               break;
+             case MapRequest:
+               {
+                   register XMapRequestEvent *ev = (XMapRequestEvent *) re;
+                   event->u.mapRequest.window  = sw32(ev->window, sw);
+                   event->u.mapRequest.parent  = sw32(ev->parent, sw);
+               }
+               break;
+             case ReparentNotify:
+               {
+                   register XReparentEvent *ev = (XReparentEvent *) re;
+                   event->u.reparent.window    = sw32(ev->window, sw);
+                   event->u.reparent.event     = sw32(ev->event, sw);
+                   event->u.reparent.parent    = sw32(ev->parent, sw);
+                   event->u.reparent.x         = sw16(ev->x, sw);
+                   event->u.reparent.y         = sw16(ev->y, sw);
+                   event->u.reparent.override  = ev->override_redirect;
+               }
+               break;
+             case ConfigureNotify:
+               {
+                   register XConfigureEvent *ev = (XConfigureEvent *) re;
+                   event->u.configureNotify.window     = sw32(ev->window, sw);
+                   event->u.configureNotify.event      = sw32(ev->event, sw);
+                   event->u.configureNotify.aboveSibling       = sw32(ev->above, sw);
+                   event->u.configureNotify.x          = sw16(ev->x, sw);
+                   event->u.configureNotify.y          = sw16(ev->y, sw);
+                   event->u.configureNotify.width      = sw16(ev->width, sw);
+                   event->u.configureNotify.height     = sw16(ev->height, sw);
+                   event->u.configureNotify.borderWidth= sw16(ev->border_width, sw);
+                   event->u.configureNotify.override   = ev->override_redirect;
+               }
+               break;
+             case ConfigureRequest:
+               {
+                   register XConfigureRequestEvent *ev =
+                       (XConfigureRequestEvent *) re;
+                   event->u.configureRequest.window    = sw32(ev->window, sw);
+                   event->u.configureRequest.parent    = sw32(ev->parent, sw);
+                   event->u.configureRequest.sibling   = sw32(ev->above, sw);
+                   event->u.configureRequest.x         = sw16(ev->x, sw);
+                   event->u.configureRequest.y         = sw16(ev->y, sw);
+                   event->u.configureRequest.width     = sw16(ev->width, sw);
+                   event->u.configureRequest.height    = sw16(ev->height, sw);
+                   event->u.configureRequest.borderWidth= sw16(ev->border_width, sw);
+                   event->u.configureRequest.valueMask= sw16(ev->value_mask, sw);
+                   event->u.u.detail                   = ev->detail;
+               }
+               break;
+             case GravityNotify:
+               {
+                   register XGravityEvent *ev  = (XGravityEvent *) re;
+                   event->u.gravity.window     = sw32(ev->window, sw);
+                   event->u.gravity.event      = sw32(ev->event, sw);
+                   event->u.gravity.x          = sw16(ev->x, sw);
+                   event->u.gravity.y          = sw16(ev->y, sw);
+               }
+               break;
+             case ResizeRequest:
+               {
+                   register XResizeRequestEvent *ev =
+                       (XResizeRequestEvent *) re;
+                   event->u.resizeRequest.window       = sw32(ev->window, sw);
+                   event->u.resizeRequest.width        = sw16(ev->width, sw);
+                   event->u.resizeRequest.height       = sw16(ev->height, sw);
+               }
+               break;
+             case CirculateNotify:
+               {
+                   register XCirculateEvent *ev = (XCirculateEvent *) re;
+                   event->u.circulate.window           = sw32(ev->window, sw);
+                   event->u.circulate.event            = sw32(ev->event, sw);
+                   event->u.circulate.place            = ev->place;
+               }
+               break;
+             case CirculateRequest:
+               {
+                   register XCirculateRequestEvent *ev =
+                       (XCirculateRequestEvent *) re;
+                   event->u.circulate.window           = sw32(ev->window, sw);
+                   event->u.circulate.event            = sw32(ev->parent, sw);
+                   event->u.circulate.place            = ev->place;
+               }
+               break;
+             case PropertyNotify:
+               {
+                   register XPropertyEvent *ev = (XPropertyEvent *) re;
+                   event->u.property.window            = sw32(ev->window, sw);
+                   event->u.property.atom              = sw32(ev->atom, sw);
+                   event->u.property.time              = sw32(ev->time, sw);
+                   event->u.property.state             = ev->state;
+               }
+               break;
+             case SelectionClear:
+               {
+                   register XSelectionClearEvent *ev =
+                        (XSelectionClearEvent *) re;
+                   event->u.selectionClear.window      = sw32(ev->window, sw);
+                   event->u.selectionClear.atom        = sw32(ev->selection, sw);
+                   event->u.selectionClear.time        = sw32(ev->time, sw);
+               }
+               break;
+             case SelectionRequest:
+               {
+                   register XSelectionRequestEvent *ev =
+                       (XSelectionRequestEvent *) re;
+                   event->u.selectionRequest.owner     = sw32(ev->owner, sw);
+                   event->u.selectionRequest.requestor = sw32(ev->requestor, sw);
+                   event->u.selectionRequest.selection = sw32(ev->selection, sw);
+                   event->u.selectionRequest.target    = sw32(ev->target, sw);
+                   event->u.selectionRequest.property  = sw32(ev->property, sw);
+                   event->u.selectionRequest.time      = sw32(ev->time, sw);
+               }
+               break;
+             case SelectionNotify:
+               {
+                   register XSelectionEvent *ev = (XSelectionEvent *) re;
+                   event->u.selectionNotify.requestor  = sw32(ev->requestor, sw);
+                   event->u.selectionNotify.selection  = sw32(ev->selection, sw);
+                   event->u.selectionNotify.target     = sw32(ev->target, sw);
+                   event->u.selectionNotify.property   = sw32(ev->property, sw);
+                   event->u.selectionNotify.time       = sw32(ev->time, sw);
+               }
+               break;
+             case ColormapNotify:
+               {
+                   register XColormapEvent *ev = (XColormapEvent *) re;
+                   event->u.colormap.window            = sw32(ev->window, sw);
+                   event->u.colormap.colormap          = sw32(ev->colormap, sw);
+                   event->u.colormap.new               = ev->new;
+                   event->u.colormap.state             = ev->state;
+               }
+               break;
+             case ClientMessage:
+               {
+                  register int i;
+                  register XClientMessageEvent *ev
+                                       = (XClientMessageEvent *) re;
+                  event->u.clientMessage.window = sw32(ev->window, sw);
+                  event->u.u.detail             = ev->format;
+                  switch (ev->format) {
+                       case 8:
+                         event->u.clientMessage.u.b.type   = sw32(ev->message_type, sw);
+                         for (i = 0; i < 20; i++)
+                          event->u.clientMessage.u.b.bytes[i] = ev->data.b[i];
+                         break;
+                       case 16:
+                         event->u.clientMessage.u.s.type   = sw32(ev->message_type, sw);
+                         event->u.clientMessage.u.s.shorts0   = sw16(ev->data.s[0], sw);
+                         event->u.clientMessage.u.s.shorts1   = sw16(ev->data.s[1], sw);
+                         event->u.clientMessage.u.s.shorts2   = sw16(ev->data.s[2], sw);
+                         event->u.clientMessage.u.s.shorts3   = sw16(ev->data.s[3], sw);
+                         event->u.clientMessage.u.s.shorts4   = sw16(ev->data.s[4], sw);
+                         event->u.clientMessage.u.s.shorts5   = sw16(ev->data.s[5], sw);
+                         event->u.clientMessage.u.s.shorts6   = sw16(ev->data.s[6], sw);
+                         event->u.clientMessage.u.s.shorts7   = sw16(ev->data.s[7], sw);
+                         event->u.clientMessage.u.s.shorts8   = sw16(ev->data.s[8], sw);
+                         event->u.clientMessage.u.s.shorts9   = sw16(ev->data.s[9], sw);
+                         break;
+                       case 32:
+                         event->u.clientMessage.u.l.type   = sw32(ev->message_type, sw);
+                         event->u.clientMessage.u.l.longs0   = sw32(ev->data.l[0], sw);
+                         event->u.clientMessage.u.l.longs1   = sw32(ev->data.l[1], sw);
+                         event->u.clientMessage.u.l.longs2   = sw32(ev->data.l[2], sw);
+                         event->u.clientMessage.u.l.longs3   = sw32(ev->data.l[3], sw);
+                         event->u.clientMessage.u.l.longs4   = sw32(ev->data.l[4], sw);
+                         break;
+                       default:
+                         /* client passing bogus data, let server complain */
+                         break;
+                       }
+                   }
+               break;
+             case MappingNotify:
+                 {
+                   register XMappingEvent *ev = (XMappingEvent *) re;
+                   event->u.mappingNotify.firstKeyCode = ev->first_keycode;
+                   event->u.mappingNotify.request      = ev->request;
+                   event->u.mappingNotify.count        = ev->count;
+                  }
+               break;
+
+             default:
+               return(0);
+       }
+       /* Common process */
+       if (((XAnyEvent *)re)->send_event)
+           event->u.u.type |= 0x80;
+       event->u.u.sequenceNumber =
+           ((XAnyEvent *)re)->serial & ~((unsigned long)0xffff);
+       event->u.u.sequenceNumber = sw16(event->u.u.sequenceNumber, sw);
+       return(1);
+}
+
+
+/*
+ * reformat a wire event into an XEvent structure of the right type.
+ */
+Bool
+_XimProtoWireToEvent(
+    register XEvent *re,       /* pointer to where event should be reformatted */
+    register xEvent *event,    /* wire protocol event */
+    Bool sw)                /* swap byte? */
+{
+
+       re->type = event->u.u.type & 0x7f;
+       ((XAnyEvent *)re)->serial = sw16(event->u.u.sequenceNumber, sw);
+       ((XAnyEvent *)re)->send_event = ((event->u.u.type & 0x80) != 0);
+       ((XAnyEvent *)re)->display = NULL;
+
+       /* Ignore the leading bit of the event type since it is set when a
+               client sends an event rather than the server. */
+
+       switch (event-> u.u.type & 0177) {
+             case KeyPress:
+             case KeyRelease:
+               {
+                       register XKeyEvent *ev = (XKeyEvent*) re;
+                       ev->root        = sw32(event->u.keyButtonPointer.root, sw);
+                       ev->window      = sw32(event->u.keyButtonPointer.event, sw);
+                       ev->subwindow   = sw32(event->u.keyButtonPointer.child, sw);
+                       ev->time        = sw32(event->u.keyButtonPointer.time, sw);
+                       ev->x           = cvtINT16toInt(sw16(event->u.keyButtonPointer.eventX, sw));
+                       ev->y           = cvtINT16toInt(sw16(event->u.keyButtonPointer.eventY, sw));
+                       ev->x_root      = cvtINT16toInt(sw16(event->u.keyButtonPointer.rootX, sw));
+                       ev->y_root      = cvtINT16toInt(sw16(event->u.keyButtonPointer.rootY, sw));
+                       ev->state       = sw16(event->u.keyButtonPointer.state, sw);
+                       ev->same_screen = event->u.keyButtonPointer.sameScreen;
+                       ev->keycode     = event->u.u.detail;
+               }
+               break;
+             case ButtonPress:
+             case ButtonRelease:
+               {
+                       register XButtonEvent *ev =  (XButtonEvent *) re;
+                       ev->root        = sw32(event->u.keyButtonPointer.root, sw);
+                       ev->window      = sw32(event->u.keyButtonPointer.event, sw);
+                       ev->subwindow   = sw32(event->u.keyButtonPointer.child, sw);
+                       ev->time        = sw32(event->u.keyButtonPointer.time, sw);
+                       ev->x           = cvtINT16toInt(sw16(event->u.keyButtonPointer.eventX, sw));
+                       ev->y           = cvtINT16toInt(sw16(event->u.keyButtonPointer.eventY, sw));
+                       ev->x_root      = cvtINT16toInt(sw16(event->u.keyButtonPointer.rootX, sw));
+                       ev->y_root      = cvtINT16toInt(sw16(event->u.keyButtonPointer.rootY, sw));
+                       ev->state       = sw16(event->u.keyButtonPointer.state, sw);
+                       ev->same_screen = event->u.keyButtonPointer.sameScreen;
+                       ev->button      = event->u.u.detail;
+               }
+               break;
+             case MotionNotify:
+               {
+                       register XMotionEvent *ev =   (XMotionEvent *)re;
+                       ev->root        = sw32(event->u.keyButtonPointer.root, sw);
+                       ev->window      = sw32(event->u.keyButtonPointer.event, sw);
+                       ev->subwindow   = sw32(event->u.keyButtonPointer.child, sw);
+                       ev->time        = sw32(event->u.keyButtonPointer.time, sw);
+                       ev->x           = cvtINT16toInt(sw16(event->u.keyButtonPointer.eventX, sw));
+                       ev->y           = cvtINT16toInt(sw16(event->u.keyButtonPointer.eventY, sw));
+                       ev->x_root      = cvtINT16toInt(sw16(event->u.keyButtonPointer.rootX, sw));
+                       ev->y_root      = cvtINT16toInt(sw16(event->u.keyButtonPointer.rootY, sw));
+                       ev->state       = sw16(event->u.keyButtonPointer.state, sw);
+                       ev->same_screen = event->u.keyButtonPointer.sameScreen;
+                       ev->is_hint     = event->u.u.detail;
+               }
+               break;
+             case EnterNotify:
+             case LeaveNotify:
+               {
+                       register XCrossingEvent *ev   = (XCrossingEvent *) re;
+                       ev->root        = sw32(event->u.enterLeave.root, sw);
+                       ev->window      = sw32(event->u.enterLeave.event, sw);
+                       ev->subwindow   = sw32(event->u.enterLeave.child, sw);
+                       ev->time        = sw32(event->u.enterLeave.time, sw);
+                       ev->x           = cvtINT16toInt(sw16(event->u.enterLeave.eventX, sw));
+                       ev->y           = cvtINT16toInt(sw16(event->u.enterLeave.eventY, sw));
+                       ev->x_root      = cvtINT16toInt(sw16(event->u.enterLeave.rootX, sw));
+                       ev->y_root      = cvtINT16toInt(sw16(event->u.enterLeave.rootY, sw));
+                       ev->state       = sw16(event->u.enterLeave.state, sw);
+                       ev->mode        = event->u.enterLeave.mode;
+                       ev->same_screen = (event->u.enterLeave.flags &
+                               ELFlagSameScreen) && True;
+                       ev->focus       = (event->u.enterLeave.flags &
+                               ELFlagFocus) && True;
+                       ev->detail      = event->u.u.detail;
+               }
+                 break;
+             case FocusIn:
+             case FocusOut:
+               {
+                       register XFocusChangeEvent *ev = (XFocusChangeEvent *) re;
+                       ev->window      = sw32(event->u.focus.window, sw);
+                       ev->mode        = event->u.focus.mode;
+                       ev->detail      = event->u.u.detail;
+               }
+                 break;
+             case KeymapNotify:
+               {
+                       register XKeymapEvent *ev = (XKeymapEvent *) re;
+                       ev->window      = None;
+                       memcpy(&ev->key_vector[1],
+                              (char *)((xKeymapEvent *) event)->map,
+                              sizeof (((xKeymapEvent *) event)->map));
+               }
+               break;
+             case Expose:
+               {
+                       register XExposeEvent *ev = (XExposeEvent *) re;
+                       ev->window      = sw32(event->u.expose.window, sw);
+                       ev->x           = sw16(event->u.expose.x, sw);
+                       ev->y           = sw16(event->u.expose.y, sw);
+                       ev->width       = sw16(event->u.expose.width, sw);
+                       ev->height      = sw16(event->u.expose.height, sw);
+                       ev->count       = sw16(event->u.expose.count, sw);
+               }
+               break;
+             case GraphicsExpose:
+               {
+                   register XGraphicsExposeEvent *ev =
+                       (XGraphicsExposeEvent *) re;
+                   ev->drawable        = sw32(event->u.graphicsExposure.drawable, sw);
+                   ev->x               = sw16(event->u.graphicsExposure.x, sw);
+                   ev->y               = sw16(event->u.graphicsExposure.y, sw);
+                   ev->width           = sw16(event->u.graphicsExposure.width, sw);
+                   ev->height          = sw16(event->u.graphicsExposure.height, sw);
+                   ev->count           = sw16(event->u.graphicsExposure.count, sw);
+                   ev->major_code      = event->u.graphicsExposure.majorEvent;
+                   ev->minor_code      = sw16(event->u.graphicsExposure.minorEvent, sw);
+               }
+               break;
+             case NoExpose:
+               {
+                   register XNoExposeEvent *ev = (XNoExposeEvent *) re;
+                   ev->drawable        = sw32(event->u.noExposure.drawable, sw);
+                   ev->major_code      = event->u.noExposure.majorEvent;
+                   ev->minor_code      = sw16(event->u.noExposure.minorEvent, sw);
+               }
+               break;
+             case VisibilityNotify:
+               {
+                   register XVisibilityEvent *ev = (XVisibilityEvent *) re;
+                   ev->window          = sw32(event->u.visibility.window, sw);
+                   ev->state           = event->u.visibility.state;
+               }
+               break;
+             case CreateNotify:
+               {
+                   register XCreateWindowEvent *ev =
+                        (XCreateWindowEvent *) re;
+                   ev->window          = sw32(event->u.createNotify.window, sw);
+                   ev->parent          = sw32(event->u.createNotify.parent, sw);
+                   ev->x               = cvtINT16toInt(sw16(event->u.createNotify.x, sw));
+                   ev->y               = cvtINT16toInt(sw16(event->u.createNotify.y, sw));
+                   ev->width           = sw16(event->u.createNotify.width, sw);
+                   ev->height          = sw16(event->u.createNotify.height, sw);
+                   ev->border_width    = sw16(event->u.createNotify.borderWidth, sw);
+                   ev->override_redirect       = event->u.createNotify.override;
+               }
+               break;
+             case DestroyNotify:
+               {
+                   register XDestroyWindowEvent *ev =
+                               (XDestroyWindowEvent *) re;
+                   ev->window          = sw32(event->u.destroyNotify.window, sw);
+                   ev->event           = sw32(event->u.destroyNotify.event, sw);
+               }
+               break;
+             case UnmapNotify:
+               {
+                   register XUnmapEvent *ev = (XUnmapEvent *) re;
+                   ev->window          = sw32(event->u.unmapNotify.window, sw);
+                   ev->event           = sw32(event->u.unmapNotify.event, sw);
+                   ev->from_configure  = event->u.unmapNotify.fromConfigure;
+               }
+               break;
+             case MapNotify:
+               {
+                   register XMapEvent *ev = (XMapEvent *) re;
+                   ev->window          = sw32(event->u.mapNotify.window, sw);
+                   ev->event           = sw32(event->u.mapNotify.event, sw);
+                   ev->override_redirect       = event->u.mapNotify.override;
+               }
+               break;
+             case MapRequest:
+               {
+                   register XMapRequestEvent *ev = (XMapRequestEvent *) re;
+                   ev->window          = sw32(event->u.mapRequest.window, sw);
+                   ev->parent          = sw32(event->u.mapRequest.parent, sw);
+               }
+               break;
+             case ReparentNotify:
+               {
+                   register XReparentEvent *ev = (XReparentEvent *) re;
+                   ev->event           = sw32(event->u.reparent.event, sw);
+                   ev->window          = sw32(event->u.reparent.window, sw);
+                   ev->parent          = sw32(event->u.reparent.parent, sw);
+                   ev->x               = cvtINT16toInt(sw16(event->u.reparent.x, sw));
+                   ev->y               = cvtINT16toInt(sw16(event->u.reparent.y, sw));
+                   ev->override_redirect       = event->u.reparent.override;
+               }
+               break;
+             case ConfigureNotify:
+               {
+                   register XConfigureEvent *ev = (XConfigureEvent *) re;
+                   ev->event   = sw32(event->u.configureNotify.event, sw);
+                   ev->window  = sw32(event->u.configureNotify.window, sw);
+                   ev->above   = sw32(event->u.configureNotify.aboveSibling, sw);
+                   ev->x       = cvtINT16toInt(sw16(event->u.configureNotify.x, sw));
+                   ev->y       = cvtINT16toInt(sw16(event->u.configureNotify.y, sw));
+                   ev->width   = sw16(event->u.configureNotify.width, sw);
+                   ev->height  = sw16(event->u.configureNotify.height, sw);
+                   ev->border_width  = sw16(event->u.configureNotify.borderWidth, sw);
+                   ev->override_redirect = event->u.configureNotify.override;
+               }
+               break;
+             case ConfigureRequest:
+               {
+                   register XConfigureRequestEvent *ev =
+                       (XConfigureRequestEvent *) re;
+                   ev->window          = sw32(event->u.configureRequest.window, sw);
+                   ev->parent          = sw32(event->u.configureRequest.parent, sw);
+                   ev->above           = sw32(event->u.configureRequest.sibling, sw);
+                   ev->x               = cvtINT16toInt(sw16(event->u.configureRequest.x, sw));
+                   ev->y               = cvtINT16toInt(sw16(event->u.configureRequest.y, sw));
+                   ev->width           = sw16(event->u.configureRequest.width, sw);
+                   ev->height          = sw16(event->u.configureRequest.height, sw);
+                   ev->border_width    = sw16(event->u.configureRequest.borderWidth, sw);
+                   ev->value_mask      = sw16(event->u.configureRequest.valueMask, sw);
+                   ev->detail          = event->u.u.detail;
+               }
+               break;
+             case GravityNotify:
+               {
+                   register XGravityEvent *ev = (XGravityEvent *) re;
+                   ev->window          = sw32(event->u.gravity.window, sw);
+                   ev->event           = sw32(event->u.gravity.event, sw);
+                   ev->x               = cvtINT16toInt(sw16(event->u.gravity.x, sw));
+                   ev->y               = cvtINT16toInt(sw16(event->u.gravity.y, sw));
+               }
+               break;
+             case ResizeRequest:
+               {
+                   register XResizeRequestEvent *ev =
+                       (XResizeRequestEvent *) re;
+                   ev->window          = sw32(event->u.resizeRequest.window, sw);
+                   ev->width           = sw16(event->u.resizeRequest.width, sw);
+                   ev->height          = sw16(event->u.resizeRequest.height, sw);
+               }
+               break;
+             case CirculateNotify:
+               {
+                   register XCirculateEvent *ev = (XCirculateEvent *) re;
+                   ev->window          = sw32(event->u.circulate.window, sw);
+                   ev->event           = sw32(event->u.circulate.event, sw);
+                   ev->place           = event->u.circulate.place;
+               }
+               break;
+             case CirculateRequest:
+               {
+                   register XCirculateRequestEvent *ev =
+                       (XCirculateRequestEvent *) re;
+                   ev->window          = sw32(event->u.circulate.window, sw);
+                   ev->parent          = sw32(event->u.circulate.event, sw);
+                   ev->place           = event->u.circulate.place;
+               }
+               break;
+             case PropertyNotify:
+               {
+                   register XPropertyEvent *ev = (XPropertyEvent *) re;
+                   ev->window          = sw32(event->u.property.window, sw);
+                   ev->atom            = sw32(event->u.property.atom, sw);
+                   ev->time            = sw32(event->u.property.time, sw);
+                   ev->state           = event->u.property.state;
+               }
+               break;
+             case SelectionClear:
+               {
+                   register XSelectionClearEvent *ev =
+                        (XSelectionClearEvent *) re;
+                   ev->window          = sw32(event->u.selectionClear.window, sw);
+                   ev->selection       = sw32(event->u.selectionClear.atom, sw);
+                   ev->time            = sw32(event->u.selectionClear.time, sw);
+               }
+               break;
+             case SelectionRequest:
+               {
+                   register XSelectionRequestEvent *ev =
+                       (XSelectionRequestEvent *) re;
+                   ev->owner           = sw32(event->u.selectionRequest.owner, sw);
+                   ev->requestor       = sw32(event->u.selectionRequest.requestor, sw);
+                   ev->selection       = sw32(event->u.selectionRequest.selection, sw);
+                   ev->target          = sw32(event->u.selectionRequest.target, sw);
+                   ev->property        = sw32(event->u.selectionRequest.property, sw);
+                   ev->time            = sw32(event->u.selectionRequest.time, sw);
+               }
+               break;
+             case SelectionNotify:
+               {
+                   register XSelectionEvent *ev = (XSelectionEvent *) re;
+                   ev->requestor       = sw32(event->u.selectionNotify.requestor, sw);
+                   ev->selection       = sw32(event->u.selectionNotify.selection, sw);
+                   ev->target          = sw32(event->u.selectionNotify.target, sw);
+                   ev->property        = sw32(event->u.selectionNotify.property, sw);
+                   ev->time            = sw32(event->u.selectionNotify.time, sw);
+               }
+               break;
+             case ColormapNotify:
+               {
+                   register XColormapEvent *ev = (XColormapEvent *) re;
+                   ev->window          = sw32(event->u.colormap.window, sw);
+                   ev->colormap        = sw32(event->u.colormap.colormap, sw);
+                   ev->new             = event->u.colormap.new;
+                   ev->state           = event->u.colormap.state;
+               }
+               break;
+             case ClientMessage:
+               {
+                  register int i;
+                  register XClientMessageEvent *ev
+                                       = (XClientMessageEvent *) re;
+                  ev->window           = sw32(event->u.clientMessage.window, sw);
+                  ev->format           = event->u.u.detail;
+                  switch (ev->format) {
+                       case 8:
+                          ev->message_type = sw32(event->u.clientMessage.u.b.type, sw);
+                          for (i = 0; i < 20; i++)
+                            ev->data.b[i] = event->u.clientMessage.u.b.bytes[i];
+                          break;
+                       case 16:
+                          ev->message_type = sw32(event->u.clientMessage.u.s.type, sw);
+                          ev->data.s[0] = cvtINT16toShort(sw16(event->u.clientMessage.u.s.shorts0, sw));
+                          ev->data.s[1] = cvtINT16toShort(sw16(event->u.clientMessage.u.s.shorts1, sw));
+                          ev->data.s[2] = cvtINT16toShort(sw16(event->u.clientMessage.u.s.shorts2, sw));
+                          ev->data.s[3] = cvtINT16toShort(sw16(event->u.clientMessage.u.s.shorts3, sw));
+                          ev->data.s[4] = cvtINT16toShort(sw16(event->u.clientMessage.u.s.shorts4, sw));
+                          ev->data.s[5] = cvtINT16toShort(sw16(event->u.clientMessage.u.s.shorts5, sw));
+                          ev->data.s[6] = cvtINT16toShort(sw16(event->u.clientMessage.u.s.shorts6, sw));
+                          ev->data.s[7] = cvtINT16toShort(sw16(event->u.clientMessage.u.s.shorts7, sw));
+                          ev->data.s[8] = cvtINT16toShort(sw16(event->u.clientMessage.u.s.shorts8, sw));
+                          ev->data.s[9] = cvtINT16toShort(sw16(event->u.clientMessage.u.s.shorts9, sw));
+                          break;
+                       case 32:
+                          ev->message_type = sw32(event->u.clientMessage.u.l.type, sw);
+                          ev->data.l[0] = cvtINT32toLong(sw32(event->u.clientMessage.u.l.longs0, sw));
+                          ev->data.l[1] = cvtINT32toLong(sw32(event->u.clientMessage.u.l.longs1, sw));
+                          ev->data.l[2] = cvtINT32toLong(sw32(event->u.clientMessage.u.l.longs2, sw));
+                          ev->data.l[3] = cvtINT32toLong(sw32(event->u.clientMessage.u.l.longs3, sw));
+                          ev->data.l[4] = cvtINT32toLong(sw32(event->u.clientMessage.u.l.longs4, sw));
+                          break;
+                       default: /* XXX should never occur */
+                               break;
+                   }
+               }
+               break;
+             case MappingNotify:
+               {
+                  register XMappingEvent *ev = (XMappingEvent *)re;
+                  ev->window           = 0;
+                  ev->first_keycode    = event->u.mappingNotify.firstKeyCode;
+                  ev->request          = event->u.mappingNotify.request;
+                  ev->count            = event->u.mappingNotify.count;
+               }
+               break;
+             default:
+               return(False);
+       }
+       return(True);
+}
diff --git a/modules/im/ximcp/imExten.c b/modules/im/ximcp/imExten.c
new file mode 100644 (file)
index 0000000..65e59bc
--- /dev/null
@@ -0,0 +1,576 @@
+/******************************************************************
+
+           Copyright 1992, 1993, 1994 by FUJITSU LIMITED
+
+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 FUJITSU LIMITED
+not be used in advertising or publicity pertaining to distribution
+of the software without specific, written prior permission.
+FUJITSU LIMITED makes no representations about the suitability of
+this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL FUJITSU LIMITED 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.
+
+  Author: Takashi Fujiwara     FUJITSU LIMITED
+                               fujiwara@a80.tech.yk.fujitsu.co.jp
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <X11/Xatom.h>
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "Ximint.h"
+
+/*
+ * index of extensions
+ */
+
+#define        XIM_EXT_SET_EVENT_MASK_IDX      0
+#ifdef EXT_FORWARD
+#define        XIM_EXT_FORWARD_KEYEVENT_IDX    1
+#endif
+#ifdef EXT_MOVE
+#define        XIM_EXT_MOVE_IDX                2
+#endif
+
+typedef struct _XIM_QueryExtRec {
+    Bool        is_support;
+    const char *name;
+    int                 name_len;
+    CARD16      major_opcode;
+    CARD16      minor_opcode;
+    int                 idx;
+} XIM_QueryExtRec;
+
+Private XIM_QueryExtRec        extensions[] = {
+       {False, "XIM_EXT_SET_EVENT_MASK", 0, 0, 0,
+                                       XIM_EXT_SET_EVENT_MASK_IDX},
+#ifdef EXT_FORWARD
+       {False, "XIM_EXT_FORWARD_KEYEVENT", 0, 0, 0,
+                                       XIM_EXT_FORWARD_KEYEVENT_IDX},
+#endif
+#ifdef EXT_MOVE
+       {False, "XIM_EXT_MOVE", 0, 0, 0, XIM_EXT_MOVE_IDX},
+#endif
+       {False, NULL, 0, 0, 0, 0}               /* dummy */
+};
+
+Private int
+_XimIsSupportExt(
+    int                 idx)
+{
+    register int i;
+    int                 n = XIMNumber(extensions) - 1;
+
+    for (i = 0; i < n; i++) {
+       if (extensions[i].idx == idx) {
+           if (extensions[i].is_support)
+               return i;
+           else
+               break;
+       }
+    }
+    return -1;
+}
+
+Private Bool
+_XimProcExtSetEventMask(
+    Xim                 im,
+    Xic                 ic,
+    XPointer    buf)
+{
+    EVENTMASK  *buf_l = (EVENTMASK *)buf;
+    EVENTMASK   select_mask = _XimGetWindowEventmask(ic);
+
+    ic->private.proto.filter_event_mask      = buf_l[0];
+    ic->private.proto.intercept_event_mask   = buf_l[1];
+    ic->private.proto.select_event_mask      = buf_l[2];
+    ic->private.proto.forward_event_mask     = buf_l[3];
+    ic->private.proto.synchronous_event_mask = buf_l[4];
+
+    select_mask &= ~ic->private.proto.intercept_event_mask;
+                                               /* deselected event mask */
+    select_mask |= ic->private.proto.select_event_mask;
+                                               /* selected event mask */
+    XSelectInput(im->core.display, ic->core.focus_window, select_mask);
+    _XimReregisterFilter(ic);
+
+    if (!(_XimProcSyncReply(im, ic)))
+       return False;
+    return True;
+}
+
+Private Bool
+_XimExtSetEventMaskCallback(
+    Xim                 xim,
+    INT16       len,
+    XPointer    data,
+    XPointer    call_data)
+{
+    CARD16     *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
+    XIMID       imid = buf_s[0];
+    XICID       icid = buf_s[1];
+    Xim                 im = (Xim)call_data;
+    Xic                 ic;
+
+    if ((imid == im->private.proto.imid)
+     && (ic = _XimICOfXICID(im, icid))) {
+       (void)_XimProcExtSetEventMask(im, ic, (XPointer)&buf_s[2]);
+       return True;
+    }
+    return False;
+}
+
+#ifdef EXT_FORWARD
+Private Bool
+_XimProcExtForwardKeyEvent(
+    Xim                 im,
+    Xic                 ic,
+    XPointer    buf)
+{
+    CARD8      *buf_b = (CARD8 *)buf;
+    CARD16     *buf_s = (CARD16 *)buf;
+    CARD32     *buf_l = (CARD32 *)buf;
+    XEvent      ev;
+    XKeyEvent  *kev = (XKeyEvent *)&ev;
+
+    bzero(&ev, sizeof(XEvent));
+    kev->send_event    = False;
+    kev->display       = im->core.display;
+    kev->serial                = buf_s[1];             /* sequence number */
+    kev->type          = buf_b[4] & 0x7f;      /* xEvent.u.u.type */
+    kev->keycode       = buf_b[5];             /* Keycode */
+    kev->state         = buf_s[3];             /* state */
+    kev->time          = buf_l[2];             /* time */
+
+    XPutBackEvent(im->core.display, &ev);
+
+    _XimRespSyncReply(ic, buf_s[0]);
+    MARK_FABRICATED(im);
+
+    return True;
+}
+
+Private Bool
+_XimExtForwardKeyEventCallback(
+    Xim                 xim,
+    INT16       len,
+    XPointer    data,
+    XPointer    call_data)
+{
+    CARD16     *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
+    XIMID       imid = buf_s[0];
+    XICID       icid = buf_s[1];
+    Xim                 im = (Xim)call_data;
+    Xic                 ic;
+
+    if ((imid == im->private.proto.imid)
+     && (ic = _XimICOfXICID(im, icid))) {
+       (void)_XimProcExtForwardKeyEvent(im, ic, (XPointer)&buf_s[2]);
+       return True;
+    }
+    return False;
+}
+
+Private Bool
+_XimExtForwardKeyEventCheck(
+    Xim          im,
+    INT16        len,
+    XPointer    data,
+    XPointer     arg)
+{
+    Xic                 ic  = (Xic)arg;
+    CARD16     *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
+    CARD8       major_opcode = *((CARD8 *)data);
+    CARD8       minor_opcode = *((CARD8 *)data + 1);
+    XIMID       imid = buf_s[0];
+    XICID       icid = buf_s[1];
+
+    if ((major_opcode == XIM_SYNC_REPLY)
+     && (minor_opcode == 0)
+     && (imid == im->private.proto.imid)
+     && (icid == ic->private.proto.icid))
+    if ((major_opcode == XIM_ERROR)
+     && (minor_opcode == 0)
+     && (buf_s[2] & XIM_IMID_VALID)
+     && (imid == im->private.proto.imid)
+     && (buf_s[2] & XIM_ICID_VALID)
+     && (icid == ic->private.proto.icid))
+       return True;
+    return False;
+}
+
+Public Bool
+_XimExtForwardKeyEvent(
+    Xic                 ic,
+    XKeyEvent  *ev,
+    Bool        sync)
+{
+    Xim                 im = (Xim) ic->core.im;
+    CARD32      buf32[BUFSIZE/4];
+    CARD8      *buf = (CARD8 *)buf32;
+    CARD8      *buf_b = &buf[XIM_HEADER_SIZE];
+    CARD16     *buf_s = (CARD16 *)buf_b;
+    CARD32     *buf_l = (CARD32 *)buf_b;
+    CARD32      reply32[BUFSIZE/4];
+    char       *reply = (char *)reply32;
+    XPointer   preply;
+    int                buf_size;
+    int                ret_code;
+    INT16      len;
+    int                idx;
+
+    if ((idx = _XimIsSupportExt(XIM_EXT_FORWARD_KEYEVENT_IDX)) < 0)
+       return False;
+
+    buf_s[0] = im->private.proto.imid;         /* imid */
+    buf_s[1] = ic->private.proto.icid;         /* icid */
+    buf_s[2] = sync ? XimSYNCHRONUS : 0;       /* flag */
+    buf_s[3] = (CARD16)(((XAnyEvent *)ev)->serial & ((unsigned long) 0xffff));
+                                               /* sequence number */
+    buf_b[8] = ev->type;                       /* xEvent.u.u.type */
+    buf_b[9] = ev->keycode;                    /* keycode */
+    buf_s[5] = ev->state;                      /* state */
+    buf_l[3] = ev->time;                       /* time */
+    len = sizeof(CARD16)                       /* sizeof imid */
+       + sizeof(CARD16)                        /* sizeof icid */
+       + sizeof(BITMASK16)                     /* sizeof flag */
+       + sizeof(CARD16)                        /* sizeof sequence number */
+       + sizeof(BYTE)                          /* sizeof xEvent.u.u.type */
+       + sizeof(BYTE)                          /* sizeof keycode */
+       + sizeof(CARD16)                        /* sizeof state */
+       + sizeof(CARD32);                       /* sizeof time */
+
+    _XimSetHeader((XPointer)buf,
+               extensions[idx].major_opcode,
+               extensions[idx].minor_opcode, &len);
+    if (!(_XimWrite(im, len, (XPointer)buf)))
+       return False;
+    _XimFlush(im);
+    if (sync) {
+       buf_size = BUFSIZE;
+       ret_code = _XimRead(im, &len, (XPointer)reply, buf_size,
+                               _XimExtForwardKeyEventCheck, (XPointer)ic);
+       if(ret_code == XIM_TRUE) {
+           preply = reply;
+       } else if(ret_code == XIM_OVERFLOW) {
+           if(len <= 0) {
+               preply = reply;
+           } else {
+               buf_sizex = len;
+               preply = (XPointer)Xmalloc(buf_size);
+               ret_code = _XimRead(im, &len, preply, buf_size,
+                               _XimExtForwardKeyEventCheck, (XPointer)ic);
+               if(ret_code != XIM_TRUE) {
+                   Xfree(preply);
+                   return False;
+               }
+           }
+       } else
+           return False;
+       buf_s = (CARD16 *)((char *)preply + XIM_HEADER_SIZE);
+       if (*((CARD8 *)preply) == XIM_ERROR) {
+           _XimProcError(im, 0, (XPointer)&buf_s[3]);
+           if(reply != preply)
+               Xfree(preply);
+           return False;
+       }
+       if(reply != preply)
+           Xfree(preply);
+    }
+    return True;
+}
+#endif /* EXT_FORWARD */
+
+Private int
+_XimCheckExtensionListSize(void)
+{
+    register int i;
+    int                 len;
+    int                 total = 0;
+    int                 n = XIMNumber(extensions) - 1;
+
+    for (i = 0; i < n; i++) {
+       len = strlen(extensions[i].name);
+       extensions[i].name_len = len;
+       len += sizeof(BYTE);
+       total += len;
+    }
+    return total;
+}
+
+Private void
+_XimSetExtensionList(
+    CARD8      *buf)
+{
+    register int i;
+    int                 len;
+    int                 n = XIMNumber(extensions) - 1;
+
+    for (i = 0; i < n; i++) {
+       len = extensions[i].name_len;
+       buf[0] = (BYTE)len;
+       (void)strcpy((char *)&buf[1], extensions[i].name);
+       len += sizeof(BYTE);
+       buf += len;
+    }
+    return;
+}
+
+Private unsigned int
+_XimCountNumberOfExtension(
+    INT16       total,
+    CARD8      *ext)
+{
+    unsigned int n;
+    INT16       len;
+    INT16       min_len = sizeof(CARD8)
+                        + sizeof(CARD8)
+                        + sizeof(INT16);
+
+    n = 0;
+    while (total > min_len) {
+       len = *((INT16 *)(&ext[2]));
+       len += (min_len + XIM_PAD(len));
+       total -= len;
+       ext += len;
+       n++;
+    }
+    return n;
+}
+
+Private Bool
+_XimParseExtensionList(
+    Xim                         im,
+    CARD16             *data)
+{
+    int                         num = XIMNumber(extensions) - 1;
+    unsigned int        n;
+    CARD8              *buf;
+    register int        i;
+    register int        j;
+    INT16               len;
+
+    if (!(n = _XimCountNumberOfExtension(data[0], (CARD8 *)&data[1])))
+       return True;
+
+    buf = (CARD8 *)&data[1];;
+    for (i = 0; i < n; i++) {
+       len = *((INT16 *)(&buf[2]));
+       for (j = 0; j < num; j++) {
+           if (!(strncmp(extensions[j].name, (char *)&buf[4], len))) {
+               extensions[j].major_opcode = buf[0];
+               extensions[j].minor_opcode = buf[1];
+               extensions[j].is_support   = True;
+               break;
+           }
+       }
+       len += sizeof(CARD8)            /* sizeof major_opcode */
+            + sizeof(CARD8)            /* sizeof minor_opcode */
+            + sizeof(INT16)            /* sizeof length */
+            + XIM_PAD(len);            /* sizeof pad */
+       buf += len;
+    }
+
+    return True;
+}
+
+Private Bool
+_XimQueryExtensionCheck(
+    Xim          im,
+    INT16        len,
+    XPointer    data,
+    XPointer     arg)
+{
+    CARD16     *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
+    CARD8       major_opcode = *((CARD8 *)data);
+    CARD8       minor_opcode = *((CARD8 *)data + 1);
+    XIMID       imid = buf_s[0];
+
+    if ((major_opcode == XIM_QUERY_EXTENSION_REPLY)
+     && (minor_opcode == 0)
+     && (imid == im->private.proto.imid))
+       return True;
+    if ((major_opcode == XIM_ERROR)
+     && (minor_opcode == 0)
+     && (buf_s[2] & XIM_IMID_VALID)
+     && (imid == im->private.proto.imid))
+       return True;
+    return False;
+}
+
+Public Bool
+_XimExtension(
+    Xim                 im)
+{
+    CARD8      *buf;
+    CARD16     *buf_s;
+    int                 buf_len;
+    INT16       len;
+    CARD32      reply32[BUFSIZE/4];
+    char       *reply = (char *)reply32;
+    XPointer    preply;
+    int                 buf_size;
+    int                 ret_code;
+    int                 idx;
+
+    if (!(len = _XimCheckExtensionListSize()))
+       return True;
+
+    buf_len = XIM_HEADER_SIZE
+           + sizeof(CARD16)
+           + sizeof(INT16)
+           + len
+           + XIM_PAD(len);
+
+    if (!(buf = (CARD8 *)Xmalloc(buf_len)))
+       return False;
+    buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
+
+    buf_s[0] = im->private.proto.imid; /* imid */
+    buf_s[1] = len;                    /* length of Extensions */
+    _XimSetExtensionList((CARD8 *)&buf_s[2]);
+                                       /* extensions supported */
+    XIM_SET_PAD(&buf_s[2], len);       /* pad */
+    len += sizeof(CARD16)              /* sizeof imid */
+        + sizeof(INT16);               /* sizeof length of extensions */
+
+    _XimSetHeader((XPointer)buf, XIM_QUERY_EXTENSION, 0, &len);
+    if (!(_XimWrite(im, len, (XPointer)buf))) {
+        XFree(buf);
+       return False;
+    }
+    XFree(buf);
+    _XimFlush(im);
+    buf_size = BUFSIZE;
+    ret_code = _XimRead(im, &len, (XPointer)reply, buf_size,
+                                       _XimQueryExtensionCheck, 0);
+    if(ret_code == XIM_TRUE) {
+       preply = reply;
+    } else if(ret_code == XIM_OVERFLOW) {
+       if(len <= 0) {
+           preply = reply;
+       } else {
+           buf_size = len;
+           preply = (XPointer)Xmalloc(buf_size);
+           ret_code = _XimRead(im, &len, reply, buf_size,
+                                       _XimQueryExtensionCheck, 0);
+           if(ret_code != XIM_TRUE) {
+               Xfree(preply);
+               return False;
+           }
+       }
+    } else
+       return False;
+    buf_s = (CARD16 *)((char *)preply + XIM_HEADER_SIZE);
+    if (*((CARD8 *)preply) == XIM_ERROR) {
+       _XimProcError(im, 0, (XPointer)&buf_s[3]);
+       if(reply != preply)
+           Xfree(preply);
+       return False;
+    }
+
+    if (!(_XimParseExtensionList(im, &buf_s[1]))) {
+       if(reply != preply)
+           Xfree(preply);
+       return False;
+    }
+    if(reply != preply)
+       Xfree(preply);
+
+    if ((idx = _XimIsSupportExt(XIM_EXT_SET_EVENT_MASK_IDX)) >= 0)
+       _XimRegProtoIntrCallback(im,
+               extensions[idx].major_opcode,
+               extensions[idx].minor_opcode,
+               _XimExtSetEventMaskCallback, (XPointer)im);
+#ifdef EXT_FORWARD
+    if ((idx = _XimIsSupportExt(XIM_EXT_FORWARD_KEYEVENT_IDX)) >= 0)
+       _XimRegProtoIntrCallback(im,
+               extensions[idx].major_opcode,
+               extensions[idx].minor_opcode,
+               _XimExtForwardKeyEventCallback, (XPointer)im);
+#endif
+
+    return True;
+}
+
+#ifdef EXT_MOVE
+/* flag of ExtenArgCheck */
+#define        EXT_XNSPOTLOCATION      (1L<<0)
+
+/* macro for ExtenArgCheck */
+#define SET_EXT_XNSPOTLOCATION(flag) (flag |= EXT_XNSPOTLOCATION)
+#define IS_EXT_XNSPOTLOCATION(flag)  (flag & EXT_XNSPOTLOCATION)
+
+/* length of XPoint attribute */
+#define        XIM_Xpoint_length       12
+
+Private Bool
+_XimExtMove(
+    Xim                 im,
+    Xic                 ic,
+    CARD16      x,
+    CARD16      y)
+{
+    CARD32      buf32[BUFSIZE/4];
+    CARD8      *buf = (CARD8 *)buf32;
+    CARD16     *buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
+    INT16       len;
+    int                idx;
+
+    if ((idx = _XimIsSupportExt(XIM_EXT_MOVE_IDX)) < 0)
+       return False;
+
+    buf_s[0] = im->private.proto.imid; /* imid */
+    buf_s[1] = ic->private.proto.icid; /* icid */
+    buf_s[2] = x;                      /* X */
+    buf_s[3] = y;                      /* Y */
+    len = sizeof(CARD16)               /* sizeof imid */
+       + sizeof(CARD16)                /* sizeof icid */
+       + sizeof(INT16)                 /* sizeof X */
+       + sizeof(INT16);                /* sizeof Y */
+
+    _XimSetHeader((XPointer)buf, extensions[idx].major_opcode,
+                       extensions[idx].minor_opcode, &len);
+    if (!(_XimWrite(im, len, (XPointer)buf)))
+       return False;
+    _XimFlush(im);
+    return True;
+}
+
+Public BITMASK32
+_XimExtenArgCheck(
+    XIMArg     *arg)
+{
+    CARD32     flag = 0L;
+    if (!strcmp(arg->name, XNSpotLocation))
+       SET_EXT_XNSPOTLOCATION(flag);
+    return flag;
+}
+
+Public Bool
+_XimExtenMove(
+    Xim                 im,
+    Xic                 ic,
+    CARD32      flag,
+    CARD16     *buf,
+    INT16       length)
+{
+    if ((IS_EXT_XNSPOTLOCATION(flag)) && (length == XIM_Xpoint_length))
+       return _XimExtMove(im, ic, buf[4], buf[5]);
+    return False;
+}
+#endif /* EXT_MOVE */
diff --git a/modules/im/ximcp/imImSw.c b/modules/im/ximcp/imImSw.c
new file mode 100644 (file)
index 0000000..acad4b8
--- /dev/null
@@ -0,0 +1,55 @@
+/******************************************************************
+
+          Copyright 1992, 1993 by FUJITSU LIMITED
+          Copyright 1993 by Digital Equipment Corporation
+
+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 FUJITSU LIMITED and
+Digital Equipment Corporation not be used in advertising or publicity
+pertaining to distribution of the software without specific, written
+prior permission.  FUJITSU LIMITED and Digital Equipment Corporation
+makes no representations about the suitability of this software for
+any purpose.  It is provided "as is" without express or implied
+warranty.
+
+FUJITSU LIMITED AND DIGITAL EQUIPMENT CORPORATION DISCLAIM ALL
+WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+FUJITSU LIMITED AND DIGITAL EQUIPMENT CORPORATION 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.
+
+  Author:    Takashi Fujiwara     FUJITSU LIMITED
+                                         fujiwara@a80.tech.yk.fujitsu.co.jp
+  Modifier:  Franky Ling          Digital Equipment Corporation
+                                 frankyling@hgrd01.enet.dec.com
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "Ximint.h"
+#include "XimImSw.h"
+
+Private Bool
+_XimCheckIfDefault(
+    Xim                im)
+{
+    return(True);
+}
+
+XimImsportSW _XimImSportRec[] = {
+    { _XimCheckIfLocalProcessing, _XimLocalOpenIM, _XimLocalIMFree },
+    { _XimCheckIfThaiProcessing,       _XimThaiOpenIM,  _XimThaiIMFree },
+    { _XimCheckIfDefault,         _XimProtoOpenIM, _XimProtoIMFree },
+    { NULL,                       NULL,                 NULL },
+};
diff --git a/modules/im/ximcp/imInsClbk.c b/modules/im/ximcp/imInsClbk.c
new file mode 100644 (file)
index 0000000..68d56d5
--- /dev/null
@@ -0,0 +1,288 @@
+/******************************************************************
+
+           Copyright 1993, 1994 by Sony Corporation
+
+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 Sony Corporation
+ not be used in advertising or publicity pertaining to distribution
+ of the software without specific, written prior permission.
+Sony Corporation makes no representations about the suitability of
+ this software for any purpose. It is provided "as is" without
+ express or implied warranty.
+
+SONY CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL SONY CORPORATION 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.
+
+  Author:   Makoto Wakamatsu   Sony Corporation
+                               makoto@sm.sony.co.jp
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include       <X11/Xatom.h>
+#include       "Xlibint.h"
+#include       "Xlcint.h"
+#include       "XlcPublic.h"
+#include       "Ximint.h"
+
+
+typedef struct _XimInstCallback {
+    Bool                        call;
+    Bool                        destroy;
+    Display                    *display;
+    XLCd                        lcd;
+    char                        name[XIM_MAXLCNAMELEN];
+    char                       *modifiers;
+    XrmDatabase                         rdb;
+    char                       *res_name;
+    char                       *res_class;
+    XIDProc                     callback;
+    XPointer                    client_data;
+    struct _XimInstCallback    *next;
+} XimInstCallbackRec, *XimInstCallback;
+
+
+Private XimInstCallback        callback_list   = NULL;
+Private Bool           lock            = False;
+
+
+Private void
+MakeLocale( XLCd lcd, char locale[] )
+{
+    char       *language, *territory, *codeset;
+
+    _XGetLCValues( lcd, XlcNLanguage, &language, XlcNTerritory, &territory,
+                    XlcNCodeset, &codeset, NULL );
+
+    strcpy( locale, language );
+    if( territory  &&  *territory ) {
+       strcat( locale, "_" );
+       strcat( locale, territory );
+    }
+    if( codeset  &&  *codeset ) {
+       strcat( locale, "." );
+       strcat( locale, codeset );
+    }
+}
+
+
+Private Bool
+_XimFilterPropertyNotify(
+    Display    *display,
+    Window      window,
+    XEvent     *event,
+    XPointer    client_data)
+{
+    Atom               ims, actual_type, *atoms;
+    int                        actual_format;
+    unsigned long      nitems, bytes_after;
+    int                        ii;
+    XIM                        xim;
+    Bool               flag = False;
+    XimInstCallback    icb, picb, tmp;
+
+    if( (ims = XInternAtom( display, XIM_SERVERS, True )) == None  ||
+       event->xproperty.atom != ims  ||
+       event->xproperty.state == PropertyDelete )
+       return( False );
+
+    if( XGetWindowProperty( display, RootWindow(display, 0), ims, 0L, 1000000L,
+                           False, XA_ATOM, &actual_type, &actual_format,
+                           &nitems, &bytes_after, (unsigned char **)&atoms )
+           != Success ) {
+       return( False );
+    }
+    if( actual_type != XA_ATOM  ||  actual_format != 32 ) {
+       XFree( atoms );
+       return( False );
+    }
+
+    lock = True;
+    for( ii = 0; ii < nitems; ii++, atoms ) {
+       if(XGetSelectionOwner (display, atoms[ii])) {
+           for( icb = callback_list; icb; icb = icb->next ) {
+               if( !icb->call  &&  !icb->destroy ) {
+                   xim = (*icb->lcd->methods->open_im)( icb->lcd, display,
+                                                        icb->rdb,
+                                                        icb->res_name,
+                                                        icb->res_class );
+                   if( xim ) {
+                       xim->methods->close( (XIM)xim );
+                       flag = True;
+                       icb->call = True;
+                       icb->callback( icb->display, icb->client_data, NULL );
+                   }
+               }
+           }
+           break;
+       }
+    }
+    XFree( atoms );
+
+    for( icb = callback_list, picb = NULL; icb; ) {
+       if( icb->destroy ) {
+           if( picb )
+               picb->next = icb->next;
+           else
+               callback_list = icb->next;
+           tmp = icb;
+           icb = icb->next;
+           XFree( tmp );
+       }
+       else {
+           picb = icb;
+           icb = icb->next;
+       }
+    }
+    lock = False;
+
+    return( flag );
+}
+
+
+Public Bool
+_XimRegisterIMInstantiateCallback(
+    XLCd        lcd,
+    Display    *display,
+    XrmDatabase         rdb,
+    char       *res_name,
+    char       *res_class,
+    XIDProc     callback,
+    XPointer    client_data)
+{
+    XimInstCallback    icb, tmp;
+    XIM                        xim;
+    Window             root;
+    XWindowAttributes  attr;
+
+    if( lock )
+       return( False );
+
+    icb = (XimInstCallback)Xmalloc(sizeof(XimInstCallbackRec));
+    if( !icb )
+       return( False );
+    icb->call = icb->destroy = False;
+    icb->display = display;
+    icb->lcd = lcd;
+    MakeLocale( lcd, icb->name );
+    icb->modifiers = lcd->core->modifiers;     /* XXXXX */
+    icb->rdb = rdb;
+    icb->res_name = res_name;
+    icb->res_class = res_class;
+    icb->callback = callback;
+    icb->client_data = client_data;
+    icb->next = NULL;
+
+    if( !callback_list )
+       callback_list = icb;
+    else {
+       for( tmp = callback_list; tmp->next; tmp = tmp->next );
+       tmp->next = icb;
+    }
+
+    xim = (*lcd->methods->open_im)( lcd, display, rdb, res_name, res_class );
+
+    if( icb == callback_list ) {
+       root = RootWindow( display, 0 );
+       XGetWindowAttributes( display, root, &attr );
+       _XRegisterFilterByType( display, root, PropertyNotify, PropertyNotify,
+                               _XimFilterPropertyNotify, (XPointer)NULL );
+       XSelectInput( display, root,
+                     attr.your_event_mask | PropertyChangeMask );
+    }
+
+    if( xim ) {
+       lock = True;
+       xim->methods->close( (XIM)xim );
+       lock = False;
+       icb->call = True;
+       callback( display, client_data, NULL );
+    }
+
+    return( True );
+}
+
+
+Public Bool
+_XimUnRegisterIMInstantiateCallback(
+    XLCd        lcd,
+    Display    *display,
+    XrmDatabase         rdb,
+    char       *res_name,
+    char       *res_class,
+    XIDProc     callback,
+    XPointer    client_data)
+{
+    char               locale[XIM_MAXLCNAMELEN];
+    XimInstCallback    icb, picb;
+
+    if( !callback_list )
+       return( False );
+
+    MakeLocale( lcd, locale );
+
+    for( icb = callback_list, picb = NULL; icb; picb = icb, icb = icb->next ) {
+       if( !strcmp( locale, icb->name )  &&
+           (lcd->core->modifiers == icb->modifiers  ||         /* XXXXX */
+            (lcd->core->modifiers  &&  icb->modifiers  &&
+             !strcmp( lcd->core->modifiers, icb->modifiers )))  &&
+           rdb == icb->rdb  &&                                 /* XXXXX */
+           ((res_name == NULL  &&  icb->res_name == NULL)  ||
+            (res_name != NULL  &&  icb->res_name != NULL  &&
+             !strcmp( res_name, icb->res_name )))  &&
+           ((res_class == NULL  &&  icb->res_class == NULL)  ||
+            (res_class != NULL  &&  icb->res_class != NULL  &&
+             !strcmp( res_class, icb->res_class )))  &&
+           (callback == icb->callback)  &&
+           (client_data  ==  icb->client_data)  &&             /* XXXXX */
+           !icb->destroy ) {
+           if( lock )
+               icb->destroy = True;
+           else {
+               if( !picb ) {
+                   callback_list = icb->next;
+                   _XUnregisterFilter( display, RootWindow(display, 0),
+                                       _XimFilterPropertyNotify,
+                                       (XPointer)NULL );
+               }
+               else
+                   picb->next = icb->next;
+               _XCloseLC( icb->lcd );
+               XFree( icb );
+           }
+           return( True );
+       }
+    }
+    return( False );
+}
+
+
+Public void
+_XimResetIMInstantiateCallback(Xim xim)
+{
+    char                locale[XIM_MAXLCNAMELEN];
+    XimInstCallback     icb;
+    XLCd                lcd = xim->core.lcd;
+
+    if( !callback_list  &&  lock )
+       return;
+
+    MakeLocale( lcd, locale );
+
+    for( icb = callback_list; icb; icb = icb->next )
+       if( !strcmp( locale, icb->name )  &&
+           (lcd->core->modifiers == icb->modifiers  ||
+            (lcd->core->modifiers  &&  icb->modifiers  &&
+             !strcmp( lcd->core->modifiers, icb->modifiers ))) )
+           icb->call = False;
+}
diff --git a/modules/im/ximcp/imInt.c b/modules/im/ximcp/imInt.c
new file mode 100644 (file)
index 0000000..26f4991
--- /dev/null
@@ -0,0 +1,263 @@
+/******************************************************************
+
+           Copyright 1992, 1993, 1994 by FUJITSU LIMITED
+
+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 FUJITSU LIMITED
+not be used in advertising or publicity pertaining to distribution
+of the software without specific, written prior permission.
+FUJITSU LIMITED makes no representations about the suitability of
+this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL FUJITSU LIMITED 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.
+
+  Author: Takashi Fujiwara     FUJITSU LIMITED
+                               fujiwara@a80.tech.yk.fujitsu.co.jp
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <X11/Xatom.h>
+#include <X11/Xlib.h>
+#include <X11/Xmd.h>
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "Ximint.h"
+#include "XimImSw.h"
+
+Private Xim            *_XimCurrentIMlist  = (Xim *)NULL;
+Private int             _XimCurrentIMcount = 0;
+
+Private Bool
+_XimSetIMStructureList(
+    Xim                  im)
+{
+    register int  i;
+    Xim                 *xim;
+
+    if(!(_XimCurrentIMlist)) {
+       if(!(_XimCurrentIMlist = (Xim *)Xmalloc(sizeof(Xim))))
+           return False;
+       _XimCurrentIMlist[0] = im;
+       _XimCurrentIMcount   = 1;
+    }
+    else {
+       for(i = 0; i < _XimCurrentIMcount; i++) {
+           if(!( _XimCurrentIMlist[i])) {
+               _XimCurrentIMlist[i] = im;
+               break;
+           }
+       }
+       if(i >= _XimCurrentIMcount) {
+           if(!(xim = (Xim *)Xrealloc(_XimCurrentIMlist,
+                                        ((i + 1) * sizeof(Xim)))))
+               return False;
+           _XimCurrentIMlist                     = xim;
+           _XimCurrentIMlist[_XimCurrentIMcount] = im;
+           _XimCurrentIMcount++;
+       }
+    }
+    return True;
+}
+
+Public void
+_XimDestroyIMStructureList(Xim im)
+{
+    register int  i;
+
+    for(i = 0; i < _XimCurrentIMcount; i++) {
+       if(_XimCurrentIMlist[i] == im) {
+           _XimCurrentIMlist[i] = NULL;
+           break;
+       }
+    }
+    return;
+}
+
+Public void
+_XimServerDestroy(Xim im_2_destroy)
+{
+    register int  i;
+    Xim                  im;
+    XIC                  ic;
+
+    for(i = 0; i < _XimCurrentIMcount; i++) {
+       if(!(im = _XimCurrentIMlist[i]))
+           continue;
+       /*
+        * Only continue if this im is the one to be destroyed.
+        */
+       if (im != im_2_destroy)
+           continue;
+
+       if (im->core.destroy_callback.callback)
+           (*im->core.destroy_callback.callback)((XIM)im,
+                       im->core.destroy_callback.client_data, NULL);
+       for (ic = im->core.ic_chain; ic; ic = ic->core.next) {
+           if (ic->core.destroy_callback.callback) {
+               (*ic->core.destroy_callback.callback)(ic,
+                       ic->core.destroy_callback.client_data, NULL);
+           }
+       }
+       _XimResetIMInstantiateCallback( im );
+       (void)im->methods->close((XIM)im);
+       Xfree(im);
+       _XimCurrentIMlist[i] = NULL;
+       return;
+    }
+}
+
+#ifdef XIM_CONNECTABLE
+Public void
+_XimServerReconectableDestroy(void)
+{
+    register int  i;
+    Xim                  im;
+    XIC                  ic;
+
+    for(i = 0; i < _XimCurrentIMcount; i++) {
+       if(!(im = _XimCurrentIMlist[i]))
+           continue;
+
+       if (im->core.destroy_callback.callback)
+           (*im->core.destroy_callback.callback)(im,
+                       im->core.destroy_callback.client_data, NULL);
+       for (ic = im->core.ic_chain; ic; ic = ic->core.next) {
+           if (ic->core.destroy_callback.callback) {
+               (*ic->core.destroy_callback.callback)(ic,
+                       ic->core.destroy_callback.client_data, NULL);
+           }
+       }
+       _XimResetIMInstantiateCallback( im );
+       (void)im->methods->close((XIM)im);
+    }
+    return;
+}
+#endif /* XIM_CONNECTABLE */
+
+Private const char *
+_XimStrstr(
+    register const char *src,
+    register const char *dest)
+{
+    int                         len;
+
+    len = strlen(dest);
+    while((src = strchr(src, *dest))) {
+       if(!strncmp(src, dest, len))
+           return src;
+       src++;
+    }
+    return NULL;
+}
+
+Private char *
+_XimMakeImName(
+    XLCd          lcd)
+{
+    const char* begin = NULL;
+    const char* end = NULL;
+    char* ret = NULL;
+    const char* ximmodifier = XIMMODIFIER;
+
+    if(lcd->core->modifiers != NULL && *lcd->core->modifiers != '\0') {
+       begin = _XimStrstr(lcd->core->modifiers, ximmodifier);
+       if (begin != NULL) {
+           end = begin += strlen(ximmodifier);
+           while (*end && *end != '@')
+               end++;
+       }
+    }
+    ret = Xmalloc(end - begin + 1);
+    if (ret != NULL) {
+       if (begin != NULL && end != NULL) {
+           (void)strncpy(ret, begin, end - begin);
+           ret[end - begin] = '\0';
+       } else {
+           ret[0] = '\0';
+       }
+    }
+
+    return ret;
+}
+
+Public XIM
+_XimOpenIM(
+    XLCd                lcd,
+    Display            *dpy,
+    XrmDatabase                 rdb,
+    char               *res_name,
+    char               *res_class)
+{
+    Xim                         im;
+    register int        i;
+
+    if (!(im = Xcalloc(1, sizeof(XimRec))))
+       return (XIM)NULL;
+
+    im->core.lcd       = lcd;
+    im->core.ic_chain  = (XIC)NULL;
+    im->core.display   = dpy;
+    im->core.rdb       = rdb;
+    im->core.res_name  = NULL;
+    im->core.res_class = NULL;
+    if((res_name != NULL) && (*res_name != '\0')){
+       if(!(im->core.res_name  = strdup(res_name)))
+           goto Error1;
+    }
+    if((res_class != NULL) && (*res_class != '\0')){
+       if(!(im->core.res_class = strdup(res_class)))
+           goto Error2;
+    }
+    if(!(im->core.im_name = _XimMakeImName(lcd)))
+       goto Error3;
+
+    for(i= 0; ; i++) {
+       if(_XimImSportRec[i].checkprocessing(im)) {
+           if(!(_XimImSportRec[i].im_open(im)))
+               goto Error4;
+           if(!_XimSetIMStructureList(im))
+               goto Error4;
+           return (XIM)im;
+       }
+    }
+
+Error4 :
+    _XimImSportRec[i].im_free(im);
+    Xfree(im);
+    return NULL;
+Error3 :
+    if(im->core.im_name)
+       Xfree(im->core.im_name);
+Error2:
+    if(im->core.res_class)
+       Xfree(im->core.res_class);
+Error1:
+    if(im->core.res_name)
+       Xfree(im->core.res_name);
+    Xfree(im);
+    return NULL;
+}
+
+Public Bool
+_XInitIM(XLCd lcd)
+{
+    if(lcd == (XLCd)NULL)
+       return False;
+    lcd->methods->open_im = _XimOpenIM;
+    lcd->methods->register_callback = _XimRegisterIMInstantiateCallback;
+    lcd->methods->unregister_callback = _XimUnRegisterIMInstantiateCallback;
+    return True;
+}
diff --git a/modules/im/ximcp/imLcFlt.c b/modules/im/ximcp/imLcFlt.c
new file mode 100644 (file)
index 0000000..a706090
--- /dev/null
@@ -0,0 +1,157 @@
+/******************************************************************
+
+              Copyright 1992 by Fuji Xerox Co., Ltd.
+              Copyright 1992, 1994 by FUJITSU LIMITED
+
+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 Fuji Xerox,
+FUJITSU LIMITED not be used in advertising or publicity pertaining
+to distribution of the software without specific, written prior
+permission. Fuji Xerox, FUJITSU LIMITED make no representations
+about the suitability of this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+FUJI XEROX, FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL FUJI XEROX,
+FUJITSU LIMITED 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.
+
+  Author   : Kazunori Nishihara        Fuji Xerox
+  Modifier : Takashi Fujiwara   FUJITSU LIMITED
+                                fujiwara@a80.tech.yk.fujitsu.co.jp
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include <X11/keysym.h>
+#include "Xlcint.h"
+#include "Ximint.h"
+
+Bool
+_XimLocalFilter(Display *d, Window w, XEvent *ev, XPointer client_data)
+{
+    Xic                 ic = (Xic)client_data;
+    KeySym      keysym;
+    static char         buf[256];
+    static unsigned prevcode = 0, prevstate = 0;
+    unsigned    currstate;
+    DefTree    *b = ic->private.local.base.tree;
+    DTIndex     t;
+    Bool        braille = False, anymodifier = False;
+
+    if(ev->xkey.keycode == 0)
+       return (False);
+
+    XLookupString((XKeyEvent *)ev, buf, sizeof(buf), &keysym, NULL);
+
+    if(keysym >= XK_braille_dot_1 && keysym <= XK_braille_dot_8) {
+       if(ev->type == KeyPress) {
+           ic->private.local.brl_pressed |=
+               1<<(keysym-XK_braille_dot_1);
+           return(True);
+       } else {
+           if(!ic->private.local.brl_committing
+                   || ev->xkey.time - ic->private.local.brl_release_start > 300) {
+               ic->private.local.brl_committing = ic->private.local.brl_pressed;
+               ic->private.local.brl_release_start = ev->xkey.time;
+           }
+           ic->private.local.brl_pressed &= ~(1<<(keysym-XK_braille_dot_1));
+           if(!ic->private.local.brl_pressed && ic->private.local.brl_committing) {
+               /* Commited a braille pattern, let it go through compose tree */
+               keysym = XK_braille_blank | ic->private.local.brl_committing;
+               ev->type = KeyPress;
+               braille = True;
+           } else {
+               return(True);
+           }
+       }
+    }
+
+    if(((Xim)ic->core.im)->private.local.top == 0 )
+       goto emit_braille;
+
+    currstate = ev->xkey.state;
+    if(ev->type == KeyPress) {
+       prevcode = ev->xkey.keycode;
+       prevstate = currstate;
+
+       if(IsModifierKey(keysym))
+           return(False);
+       prevcode = 0;
+    } else {
+       if(prevcode != ev->xkey.keycode)
+           return False;
+
+       /* For lookup, we use the state at the time when the key was pressed, */
+       /* because this state was not affected by the modifier that is mapped */
+       /* to the key. */
+       ev->xkey.state = prevstate;
+       XLookupString((XKeyEvent *)ev, buf, sizeof(buf), &keysym, NULL);
+    }
+
+    for(t = ic->private.local.context; t; t = b[t].next) {
+       if(IsModifierKey(b[t].keysym))
+           anymodifier = True;
+       if(((ev->xkey.state & b[t].modifier_mask) == b[t].modifier) &&
+          (keysym == b[t].keysym))
+           break;
+    }
+
+    /* Restore the state */
+    ev->xkey.state = currstate;
+
+    if(t) { /* Matched */
+       if(b[t].succession) { /* Intermediate */
+           ic->private.local.context = b[t].succession;
+           return (ev->type == KeyPress);
+       } else { /* Terminate (reached to leaf) */
+           ic->private.local.composed = t;
+           ic->private.local.brl_committed = 0;
+           /* return back to client KeyPressEvent keycode == 0 */
+           ev->xkey.keycode = 0;
+           ev->xkey.type = KeyPress;
+           XPutBackEvent(d, ev);
+           if(prevcode){
+               /* For modifier key releases, restore the event, as we do not */
+               /* filter it.  */
+               ev->xkey.type = KeyRelease;
+               ev->xkey.keycode = prevcode;
+           }
+           /* initialize internal state for next key sequence */
+           ic->private.local.context = ((Xim)ic->core.im)->private.local.top;
+           return (ev->type == KeyPress);
+       }
+    } else { /* Unmatched */
+       /* Unmatched modifier key releases abort matching only in the case that */
+       /* there was any modifier that would have matched */
+       if((ic->private.local.context == ((Xim)ic->core.im)->private.local.top) ||
+          (ev->type == KeyRelease && !anymodifier)) {
+           goto emit_braille;
+       }
+       /* Error (Sequence Unmatch occured) */
+       /* initialize internal state for next key sequence */
+       ic->private.local.context = ((Xim)ic->core.im)->private.local.top;
+       return (ev->type == KeyPress);
+    }
+
+emit_braille:
+    if(braille) {
+       /* Braille pattern is not in compose tree, emit alone */
+       ic->private.local.brl_committed = ic->private.local.brl_committing;
+       ic->private.local.composed = 0;
+       ev->xkey.keycode = 0;
+       _XPutBackEvent(d, ev);
+       return(True);
+    }
+    return(False);
+}
diff --git a/modules/im/ximcp/imLcGIc.c b/modules/im/ximcp/imLcGIc.c
new file mode 100644 (file)
index 0000000..26930c4
--- /dev/null
@@ -0,0 +1,47 @@
+/******************************************************************
+
+                Copyright 1992,1993, 1994 by FUJITSU LIMITED
+
+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 FUJITSU LIMITED
+not be used in advertising or publicity pertaining to distribution
+of the software without specific, written prior permission.
+FUJITSU LIMITED makes no representations about the suitability of
+this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL FUJITSU LIMITED 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.
+
+  Author: Takashi Fujiwara     FUJITSU LIMITED
+                               fujiwara@a80.tech.yk.fujitsu.co.jp
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "Ximint.h"
+
+Public char *
+_XimLocalGetICValues(XIC xic, XIMArg *values)
+{
+    Xic                         ic = (Xic)xic;
+    XimDefICValues      ic_values;
+
+    _XimGetCurrentICValues(ic, &ic_values);
+    return(_XimGetICValueData(ic, (XPointer)&ic_values,
+                               ic->private.local.ic_resources,
+                               ic->private.local.ic_num_resources,
+                               values, XIM_GETICVALUES));
+}
diff --git a/modules/im/ximcp/imLcIc.c b/modules/im/ximcp/imLcIc.c
new file mode 100644 (file)
index 0000000..4933885
--- /dev/null
@@ -0,0 +1,199 @@
+/******************************************************************
+
+                Copyright 1992,1993, 1994 by FUJITSU LIMITED
+
+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 FUJITSU LIMITED
+not be used in advertising or publicity pertaining to distribution
+of the software without specific, written prior permission.
+FUJITSU LIMITED makes no representations about the suitability of
+this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL FUJITSU LIMITED 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.
+
+  Author: Takashi Fujiwara     FUJITSU LIMITED
+                               fujiwara@a80.tech.yk.fujitsu.co.jp
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include <X11/Xlib.h>
+#include <X11/Xmd.h>
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "Ximint.h"
+
+Private void
+_XimLocalUnSetFocus(
+    XIC         xic)
+{
+    Xic  ic = (Xic)xic;
+    ((Xim)ic->core.im)->private.local.current_ic = (XIC)NULL;
+
+    if (ic->core.focus_window)
+       _XUnregisterFilter(ic->core.im->core.display,
+                       ic->core.focus_window, _XimLocalFilter, (XPointer)ic);
+    return;
+}
+
+Private void
+_XimLocalDestroyIC(
+    XIC         xic)
+{
+    Xic         ic = (Xic)xic;
+
+    if(((Xim)ic->core.im)->private.local.current_ic == (XIC)ic) {
+       ((Xim)ic->core.im)->private.local.current_ic = (XIC)NULL;
+    }
+    if (ic->core.focus_window)
+       _XUnregisterFilter(ic->core.im->core.display,
+                       ic->core.focus_window, _XimLocalFilter, (XPointer)ic);
+    if(ic->private.local.ic_resources) {
+       Xfree(ic->private.local.ic_resources);
+       ic->private.local.ic_resources = NULL;
+    }
+    return;
+}
+
+Private void
+_XimLocalSetFocus(
+    XIC         xic)
+{
+    Xic         ic = (Xic)xic;
+    XIC         current_ic = ((Xim)ic->core.im)->private.local.current_ic;
+
+    if (current_ic == (XIC)ic)
+       return;
+
+    if (current_ic != (XIC)NULL) {
+       _XimLocalUnSetFocus(current_ic);
+    }
+    ((Xim)ic->core.im)->private.local.current_ic = (XIC)ic;
+
+    if (ic->core.focus_window)
+       _XRegisterFilterByType(ic->core.im->core.display,
+                       ic->core.focus_window, KeyPress, KeyRelease,
+                       _XimLocalFilter, (XPointer)ic);
+    return;
+}
+
+Private void
+_XimLocalReset(
+    XIC         xic)
+{
+    Xic         ic = (Xic)xic;
+    ic->private.local.composed       = 0;
+    ic->private.local.context        = ((Xim)ic->core.im)->private.local.top;
+    ic->private.local.brl_pressed    = 0;
+    ic->private.local.brl_committing = 0;
+    ic->private.local.brl_committed  = 0;
+}
+
+Private char *
+_XimLocalMbReset(
+    XIC         xic)
+{
+    _XimLocalReset(xic);
+    return (char *)NULL;
+}
+
+Private wchar_t *
+_XimLocalWcReset(
+    XIC         xic)
+{
+    _XimLocalReset(xic);
+    return (wchar_t *)NULL;
+}
+
+Private XICMethodsRec Local_ic_methods = {
+    _XimLocalDestroyIC,        /* destroy */
+    _XimLocalSetFocus,         /* set_focus */
+    _XimLocalUnSetFocus,       /* unset_focus */
+    _XimLocalSetICValues,      /* set_values */
+    _XimLocalGetICValues,      /* get_values */
+    _XimLocalMbReset,          /* mb_reset */
+    _XimLocalWcReset,          /* wc_reset */
+    _XimLocalMbReset,          /* utf8_reset */
+    _XimLocalMbLookupString,   /* mb_lookup_string */
+    _XimLocalWcLookupString,   /* wc_lookup_string */
+    _XimLocalUtf8LookupString  /* utf8_lookup_string */
+};
+
+Public XIC
+_XimLocalCreateIC(
+    XIM                         im,
+    XIMArg             *values)
+{
+    Xic                         ic;
+    XimDefICValues      ic_values;
+    XIMResourceList     res;
+    unsigned int        num;
+    int                         len;
+
+    if((ic = Xcalloc(1, sizeof(XicRec))) == (Xic)NULL) {
+       return ((XIC)NULL);
+    }
+
+    ic->methods = &Local_ic_methods;
+    ic->core.im = im;
+    ic->private.local.base           = ((Xim)im)->private.local.base;
+    ic->private.local.context        = ((Xim)im)->private.local.top;
+    ic->private.local.composed       = 0;
+    ic->private.local.brl_pressed    = 0;
+    ic->private.local.brl_committing = 0;
+    ic->private.local.brl_committed  = 0;
+
+    num = im->core.ic_num_resources;
+    len = sizeof(XIMResource) * num;
+    if((res = (XIMResourceList)Xmalloc(len)) == (XIMResourceList)NULL) {
+       goto Set_Error;
+    }
+    (void)memcpy((char *)res, (char *)im->core.ic_resources, len);
+    ic->private.local.ic_resources     = res;
+    ic->private.local.ic_num_resources = num;
+
+    bzero((char *)&ic_values, sizeof(XimDefICValues));
+    if(_XimCheckLocalInputStyle(ic, (XPointer)&ic_values, values,
+                                im->core.styles, res, num) == False) {
+       goto Set_Error;
+    }
+
+    _XimSetICMode(res, num, ic_values.input_style);
+
+    if(_XimSetICValueData(ic, (XPointer)&ic_values,
+                       ic->private.local.ic_resources,
+                       ic->private.local.ic_num_resources,
+                       values, XIM_CREATEIC, True)) {
+       goto Set_Error;
+    }
+    ic_values.filter_events = KeyPressMask | KeyReleaseMask;
+    _XimSetCurrentICValues(ic, &ic_values);
+    if(_XimSetICDefaults(ic, (XPointer)&ic_values,
+                               XIM_SETICDEFAULTS, res, num) == False) {
+       goto Set_Error;
+    }
+    _XimSetCurrentICValues(ic, &ic_values);
+
+    return((XIC)ic);
+
+Set_Error :
+    if (ic->private.local.ic_resources) {
+       Xfree(ic->private.local.ic_resources);
+       ic->private.local.ic_resources = NULL;
+    }
+    Xfree(ic);
+    return((XIC)NULL);
+}
diff --git a/modules/im/ximcp/imLcIm.c b/modules/im/ximcp/imLcIm.c
new file mode 100644 (file)
index 0000000..9041698
--- /dev/null
@@ -0,0 +1,732 @@
+/******************************************************************
+
+          Copyright 1992, 1993, 1994 by FUJITSU LIMITED
+          Copyright 1993 by Digital Equipment Corporation
+
+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 FUJITSU LIMITED and
+Digital Equipment Corporation not be used in advertising or publicity
+pertaining to distribution of the software without specific, written
+prior permission.  FUJITSU LIMITED and Digital Equipment Corporation
+makes no representations about the suitability of this software for
+any purpose.  It is provided "as is" without express or implied
+warranty.
+
+FUJITSU LIMITED AND DIGITAL EQUIPMENT CORPORATION DISCLAIM ALL
+WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+FUJITSU LIMITED AND DIGITAL EQUIPMENT CORPORATION 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.
+
+  Author:    Takashi Fujiwara     FUJITSU LIMITED
+                                         fujiwara@a80.tech.yk.fujitsu.co.jp
+  Modifier:  Franky Ling          Digital Equipment Corporation
+                                 frankyling@hgrd01.enet.dec.com
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+
+#include <X11/Xmd.h>
+#include <X11/Xatom.h>
+#include <X11/Xos.h>
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "XlcPublic.h"
+#include "XlcPubI.h"
+#include "Ximint.h"
+#include <ctype.h>
+#include <assert.h>
+
+#ifdef COMPOSECACHE
+#  include <sys/types.h>
+#  include <sys/stat.h>
+#  include <sys/mman.h>
+#  include <langinfo.h>
+#endif
+
+
+#ifdef COMPOSECACHE
+
+/* include trailing '/' for cache directory, file prefix otherwise */
+#define XIM_GLOBAL_CACHE_DIR "/var/cache/libx11/compose/"
+#define XIM_HOME_CACHE_DIR   "/.compose-cache/"
+#define XIM_CACHE_MAGIC      ('X' | 'i'<<8 | 'm'<<16 | 'C'<<24)
+#define XIM_CACHE_VERSION    4
+#define XIM_CACHE_TREE_ALIGNMENT 4
+
+#define XIM_HASH_PRIME_1 13
+#define XIM_HASH_PRIME_2 1234096939
+
+typedef INT32 DTStructIndex;
+struct _XimCacheStruct {
+    INT32           id;
+    INT32           version;
+    DTStructIndex   tree;
+    DTStructIndex   mb;
+    DTStructIndex   wc;
+    DTStructIndex   utf8;
+    DTStructIndex   size;
+    DTIndex         top;
+    DTIndex         treeused;
+    DTCharIndex     mbused;
+    DTCharIndex     wcused;
+    DTCharIndex     utf8used;
+    char            fname[1];
+    /* char encoding[1] */
+};
+
+Private struct  _XimCacheStruct* _XimCache_mmap = NULL;
+Private DefTreeBase _XimCachedDefaultTreeBase;
+Private int     _XimCachedDefaultTreeRefcount = 0;
+
+#endif
+
+
+Public Bool
+_XimCheckIfLocalProcessing(Xim im)
+{
+    FILE        *fp;
+    char        *name;
+
+    if(strcmp(im->core.im_name, "") == 0) {
+       name = _XlcFileName(im->core.lcd, COMPOSE_FILE);
+       if (name != (char *)NULL) {
+           fp = _XFopenFile (name, "r");
+           Xfree(name);
+           if (fp != (FILE *)NULL) {
+               fclose(fp);
+               return(True);
+           }
+       }
+       return(False);
+    } else if(strcmp(im->core.im_name, "local") == 0 ||
+             strcmp(im->core.im_name, "none" ) == 0 ) {
+       return(True);
+    }
+    return(False);
+}
+
+Private void
+XimFreeDefaultTree(
+    DefTreeBase *b)
+{
+    if (!b) return;
+    if (b->tree == NULL) return;
+#ifdef COMPOSECACHE
+    if (b->tree == _XimCachedDefaultTreeBase.tree) {
+        _XimCachedDefaultTreeRefcount--;
+        /* No deleting, it's a cache after all. */
+        return;
+    }
+#endif
+    Xfree (b->tree);
+    if (b->mb)    Xfree (b->mb);
+    if (b->wc)    Xfree (b->wc);
+    if (b->utf8)  Xfree (b->utf8);
+    b->tree = NULL;
+    b->mb   = NULL;
+    b->wc   = NULL;
+    b->utf8 = NULL;
+    b->treeused = b->treesize = 0;
+    b->mbused   = b->mbsize   = 0;
+    b->wcused   = b->wcsize   = 0;
+    b->utf8used = b->utf8size = 0;
+}
+
+Public void
+_XimLocalIMFree(
+    Xim                im)
+{
+    XimFreeDefaultTree(&im->private.local.base);
+    im->private.local.top = 0;
+
+    if(im->core.im_resources) {
+       Xfree(im->core.im_resources);
+       im->core.im_resources = NULL;
+    }
+    if(im->core.ic_resources) {
+       Xfree(im->core.ic_resources);
+       im->core.ic_resources = NULL;
+    }
+    if(im->core.im_values_list) {
+       Xfree(im->core.im_values_list);
+       im->core.im_values_list = NULL;
+    }
+    if(im->core.ic_values_list) {
+       Xfree(im->core.ic_values_list);
+       im->core.ic_values_list = NULL;
+    }
+    if(im->core.styles) {
+       Xfree(im->core.styles);
+       im->core.styles = NULL;
+    }
+    if(im->core.res_name) {
+       Xfree(im->core.res_name);
+       im->core.res_name = NULL;
+    }
+    if(im->core.res_class) {
+       Xfree(im->core.res_class);
+       im->core.res_class = NULL;
+    }
+    if(im->core.im_name) {
+       Xfree(im->core.im_name);
+       im->core.im_name = NULL;
+    }
+    if (im->private.local.ctom_conv) {
+       _XlcCloseConverter(im->private.local.ctom_conv);
+        im->private.local.ctom_conv = NULL;
+    }
+    if (im->private.local.ctow_conv) {
+       _XlcCloseConverter(im->private.local.ctow_conv);
+       im->private.local.ctow_conv = NULL;
+    }
+    if (im->private.local.ctoutf8_conv) {
+       _XlcCloseConverter(im->private.local.ctoutf8_conv);
+       im->private.local.ctoutf8_conv = NULL;
+    }
+    if (im->private.local.cstomb_conv) {
+       _XlcCloseConverter(im->private.local.cstomb_conv);
+        im->private.local.cstomb_conv = NULL;
+    }
+    if (im->private.local.cstowc_conv) {
+       _XlcCloseConverter(im->private.local.cstowc_conv);
+       im->private.local.cstowc_conv = NULL;
+    }
+    if (im->private.local.cstoutf8_conv) {
+       _XlcCloseConverter(im->private.local.cstoutf8_conv);
+       im->private.local.cstoutf8_conv = NULL;
+    }
+    if (im->private.local.ucstoc_conv) {
+       _XlcCloseConverter(im->private.local.ucstoc_conv);
+       im->private.local.ucstoc_conv = NULL;
+    }
+    if (im->private.local.ucstoutf8_conv) {
+       _XlcCloseConverter(im->private.local.ucstoutf8_conv);
+       im->private.local.ucstoutf8_conv = NULL;
+    }
+    return;
+}
+
+Private Status
+_XimLocalCloseIM(
+    XIM                xim)
+{
+    Xim                im = (Xim)xim;
+    XIC                ic;
+    XIC                next;
+
+    ic = im->core.ic_chain;
+    im->core.ic_chain = NULL;
+    while (ic) {
+       (*ic->methods->destroy) (ic);
+       next = ic->core.next;
+       Xfree ((char *) ic);
+       ic = next;
+    }
+    _XimLocalIMFree(im);
+    _XimDestroyIMStructureList(im);
+    return(True);
+}
+
+Public char *
+_XimLocalGetIMValues(
+    XIM                         xim,
+    XIMArg             *values)
+{
+    Xim                         im = (Xim)xim;
+    XimDefIMValues      im_values;
+
+    _XimGetCurrentIMValues(im, &im_values);
+    return(_XimGetIMValueData(im, (XPointer)&im_values, values,
+                       im->core.im_resources, im->core.im_num_resources));
+}
+
+Public char *
+_XimLocalSetIMValues(
+    XIM                         xim,
+    XIMArg             *values)
+{
+    Xim                         im = (Xim)xim;
+    XimDefIMValues      im_values;
+    char               *name = (char *)NULL;
+
+    _XimGetCurrentIMValues(im, &im_values);
+    name = _XimSetIMValueData(im, (XPointer)&im_values, values,
+               im->core.im_resources, im->core.im_num_resources);
+    _XimSetCurrentIMValues(im, &im_values);
+    return(name);
+}
+
+
+#ifdef COMPOSECACHE
+
+Private Bool
+_XimReadCachedDefaultTree(
+    int          fd_cache,
+    const char  *name,
+    const char  *encoding,
+    DTStructIndex size)
+{
+    struct _XimCacheStruct* m;
+    int namelen = strlen (name) + 1;
+    int encodinglen = strlen (encoding) + 1;
+
+    m = mmap (NULL, size, PROT_READ, MAP_PRIVATE, fd_cache, 0);
+    if (m == NULL || m == MAP_FAILED)
+        return False;
+    assert (m->id == XIM_CACHE_MAGIC);
+    assert (m->version == XIM_CACHE_VERSION);
+    if (size != m->size ||
+       size < XOffsetOf (struct _XimCacheStruct, fname) + namelen + encodinglen) {
+       fprintf (stderr, "Ignoring broken XimCache %s [%s]\n", name, encoding);
+        munmap (m, size);
+        return False;
+    }
+    if (strncmp (name, m->fname, namelen) != 0) {
+       /* m->fname may *not* be terminated - but who cares here */
+       fprintf (stderr, "Filename hash clash - expected %s, got %s\n",
+                name, m->fname);
+        munmap (m, size);
+        return False;
+    }
+    if (strncmp (encoding, m->fname + namelen, encodinglen) != 0) {
+       /* m->fname+namelen may *not* be terminated - but who cares here */
+       fprintf (stderr, "Enoding hash clash - expected %s, got %s\n",
+                encoding, m->fname + namelen);
+        munmap (m, size);
+        return False;
+    }
+    _XimCache_mmap    = m;
+    _XimCachedDefaultTreeBase.tree = (DefTree *) (((char *) m) + m->tree);
+    _XimCachedDefaultTreeBase.mb   =             (((char *) m) + m->mb);
+    _XimCachedDefaultTreeBase.wc   = (wchar_t *) (((char *) m) + m->wc);
+    _XimCachedDefaultTreeBase.utf8 =             (((char *) m) + m->utf8);
+    _XimCachedDefaultTreeBase.treeused = m->treeused;
+    _XimCachedDefaultTreeBase.mbused   = m->mbused;
+    _XimCachedDefaultTreeBase.wcused   = m->wcused;
+    _XimCachedDefaultTreeBase.utf8used = m->utf8used;
+    /* treesize etc. is ignored because only used during parsing */
+    _XimCachedDefaultTreeRefcount = 0;
+/* fprintf (stderr, "read cached tree at %p: %s\n", (void *) m, name); */
+    return True;
+}
+
+Private unsigned int strToHash (
+    const char *name)
+{
+    unsigned int hash = 0;
+    while (*name)
+       hash = hash * XIM_HASH_PRIME_1 + *(unsigned const char *)name++;
+    return hash % XIM_HASH_PRIME_2;
+}
+
+
+/* Returns read-only fd of cache file, -1 if none.
+ * Sets *res to cache filename if safe. Sets *size to file size of cache. */
+Private int _XimCachedFileName (
+    const char *dir, const char *name,
+    const char *intname, const char *encoding,
+    uid_t uid, int isglobal, char **res, off_t *size)
+{
+    struct stat st_name, st;
+    int    fd;
+    unsigned int len, hash, hash2;
+    struct _XimCacheStruct *m;
+    /* There are some races here with 'dir', but we are either in our own home
+     * or the global cache dir, and not inside some public writable dir */
+/* fprintf (stderr, "XimCachedFileName for dir %s name %s intname %s encoding %s uid %d\n", dir, name, intname, encoding, uid); */
+    if (stat (name, &st_name) == -1 || ! S_ISREG (st_name.st_mode)
+       || stat (dir, &st) == -1 || ! S_ISDIR (st.st_mode) || st.st_uid != uid
+       || (st.st_mode & 0022) != 0000) {
+       *res = NULL;
+       return -1;
+    }
+    len   = strlen (dir);
+    hash  = strToHash (intname);
+    hash2 = strToHash (encoding);
+    *res  = Xmalloc (len + 1 + 27 + 1);  /* Max VERSION 9999 */
+
+    if (len == 0 || dir [len-1] != '/')
+       sprintf (*res, "%s/%c%d_%03x_%08x_%08x", dir, _XimGetMyEndian(),
+               XIM_CACHE_VERSION, (unsigned int)sizeof (DefTree), hash, hash2);
+    else
+       sprintf (*res, "%s%c%d_%03x_%08x_%08x", dir, _XimGetMyEndian(),
+               XIM_CACHE_VERSION, (unsigned int)sizeof (DefTree), hash, hash2);
+
+/* fprintf (stderr, "-> %s\n", *res); */
+    if ( (fd = _XOpenFile (*res, O_RDONLY)) == -1)
+       return -1;
+
+    if (fstat (fd, &st) == -1) {
+       Xfree (*res);
+       *res = NULL;
+       close (fd);
+       return -1;
+    }
+    *size = st.st_size;
+
+    if (! S_ISREG (st.st_mode) || st.st_uid != uid
+       || (st.st_mode & 0022) != 0000 || st.st_mtime <= st_name.st_mtime
+       || (st.st_mtime < time (NULL) - 24*60*60 && ! isglobal)) {
+
+       close (fd);
+       if (unlink (*res) != 0) {
+           Xfree (*res);
+           *res = NULL;                /* cache is not safe */
+       }
+       return -1;
+    }
+
+    m = mmap (NULL, sizeof (struct _XimCacheStruct), PROT_READ, MAP_PRIVATE,
+             fd, 0);
+    if (m == NULL || m == MAP_FAILED) {
+       close (fd);
+       Xfree (*res);
+       *res = NULL;
+        return -1;
+    }
+    if (*size < sizeof (struct _XimCacheStruct) || m->id != XIM_CACHE_MAGIC) {
+       munmap (m, sizeof (struct _XimCacheStruct));
+       close (fd);
+       fprintf (stderr, "Ignoring broken XimCache %s\n", *res);
+       Xfree (*res);
+       *res = NULL;
+        return -1;
+    }
+    if (m->version != XIM_CACHE_VERSION) {
+       munmap (m, sizeof (struct _XimCacheStruct));
+       close (fd);
+       if (unlink (*res) != 0) {
+           Xfree (*res);
+           *res = NULL;                /* cache is not safe */
+       }
+       return -1;
+    }
+    munmap (m, sizeof (struct _XimCacheStruct));
+
+    return fd;
+}
+
+
+Private Bool _XimLoadCache (
+    int         fd,
+    const char *name,
+    const char *encoding,
+    off_t       size,
+    Xim         im)
+{
+    if (_XimCache_mmap ||
+       _XimReadCachedDefaultTree (fd, name, encoding, size)) {
+       _XimCachedDefaultTreeRefcount++;
+       memcpy (&im->private.local.base, &_XimCachedDefaultTreeBase,
+              sizeof (_XimCachedDefaultTreeBase));
+       im->private.local.top = _XimCache_mmap->top;
+       return True;
+    }
+
+    return False;
+}
+
+
+Private void
+_XimWriteCachedDefaultTree(
+    const char *name,
+    const char *encoding,
+    const char *cachename,
+    Xim                im)
+{
+    int   fd;
+    FILE *fp;
+    struct _XimCacheStruct *m;
+    int   msize = (XOffsetOf(struct _XimCacheStruct, fname)
+                  + strlen(name) + strlen(encoding) + 2
+                  + XIM_CACHE_TREE_ALIGNMENT-1) & -XIM_CACHE_TREE_ALIGNMENT;
+    DefTreeBase *b = &im->private.local.base;
+
+    if (! b->tree && ! (b->tree = Xmalloc (sizeof(DefTree))) )
+       return;
+    if (! b->mb   && ! (b->mb   = Xmalloc (1)) )
+       return;
+    if (! b->wc   && ! (b->wc   = Xmalloc (sizeof(wchar_t))) )
+       return;
+    if (! b->utf8 && ! (b->utf8 = Xmalloc (1)) )
+       return;
+
+    /* First entry is always unused */
+    memset (b->tree, 0, sizeof(DefTree));
+    b->mb[0]   = 0;
+    b->wc[0]   = 0;
+    b->utf8[0] = 0;
+
+    m = Xmalloc (msize);
+    memset (m, 0, msize);
+    m->id       = XIM_CACHE_MAGIC;
+    m->version  = XIM_CACHE_VERSION;
+    m->top      = im->private.local.top;
+    m->treeused = b->treeused;
+    m->mbused   = b->mbused;
+    m->wcused   = b->wcused;
+    m->utf8used = b->utf8used;
+    /* Tree first, then wide chars, then the rest due to alignment */
+    m->tree     = msize;
+    m->wc       = msize   + sizeof (DefTree) * m->treeused;
+    m->mb       = m->wc   + sizeof (wchar_t) * m->wcused;
+    m->utf8     = m->mb   +                    m->mbused;
+    m->size     = m->utf8 +                    m->utf8used;
+    strcpy (m->fname, name);
+    strcpy (m->fname+strlen(name)+1, encoding);
+
+    /* This STILL might be racy on NFS */
+    if ( (fd = _XOpenFileMode (cachename, O_WRONLY | O_CREAT | O_EXCL,
+                              0600)) < 0) {
+       Xfree(m);
+       return;
+    }
+    if (! (fp = fdopen (fd, "wb")) ) {
+       close (fd);
+       Xfree(m);
+       return;
+    }
+    fwrite (m, msize, 1, fp);
+    fwrite (im->private.local.base.tree, sizeof(DefTree), m->treeused, fp);
+    fwrite (im->private.local.base.wc,   sizeof(wchar_t), m->wcused,   fp);
+    fwrite (im->private.local.base.mb,   1,               m->mbused,   fp);
+    fwrite (im->private.local.base.utf8, 1,               m->utf8used, fp);
+    if (fclose (fp) != 0)
+       unlink (cachename);
+    _XimCache_mmap = m;
+    memcpy (&_XimCachedDefaultTreeBase, &im->private.local.base,
+           sizeof (_XimCachedDefaultTreeBase));
+/* fprintf (stderr, "wrote tree %s size %ld to %s\n", name, m->size, cachename); */
+}
+
+#endif
+
+
+Private void
+_XimCreateDefaultTree(
+    Xim                im)
+{
+    FILE *fp = NULL;
+    char *name, *tmpname = NULL, *intname;
+    char *cachename = NULL;
+    /* Should use getpwent() instead of $HOME (cross-platform?) */
+    char *home = getenv("HOME");
+    char *cachedir = NULL;
+    char *tmpcachedir = NULL;
+    int   hl = home ? strlen (home) : 0;
+#ifdef COMPOSECACHE
+    const char *encoding = nl_langinfo (CODESET);
+    uid_t euid = geteuid ();
+    gid_t egid = getegid ();
+    int   cachefd = -1;
+    off_t size;
+#endif
+
+    name = getenv("XCOMPOSEFILE");
+    if (name == (char *) NULL) {
+       if (home != (char *) NULL) {
+            tmpname = name = Xmalloc(hl + 10 + 1);
+            if (name != (char *) NULL) {
+               int fd;
+               strcpy(name, home);
+               strcpy(name + hl, "/.XCompose");
+               if ( (fd = _XOpenFile (name, O_RDONLY)) < 0) {
+                   Xfree (name);
+                   name = tmpname = NULL;
+               } else
+                   close (fd);
+            }
+        }
+    }
+
+    if (name == (char *) NULL) {
+        tmpname = name = _XlcFileName(im->core.lcd, COMPOSE_FILE);
+    }
+    intname = name;
+
+#ifdef COMPOSECACHE
+    if (getuid () == euid && getgid () == egid && euid != 0) {
+       char *c;
+       /* Usage: XCOMPOSECACHE=<cachedir>[=<filename>]
+        * cachedir: directory of cache files
+        * filename: internally used name for cache file */
+        cachedir = getenv("XCOMPOSECACHE");
+       if (cachedir && (c = strchr (cachedir, '='))) {
+           tmpcachedir = strdup (cachedir);
+           intname = tmpcachedir + (c-cachedir) + 1;
+           tmpcachedir[c-cachedir] = '\0';
+           cachedir = tmpcachedir;
+       }
+    }
+
+    if (! cachedir) {
+       cachefd = _XimCachedFileName (XIM_GLOBAL_CACHE_DIR, name, intname,
+                                     encoding, 0, 1, &cachename, &size);
+       if (cachefd != -1) {
+           if (_XimLoadCache (cachefd, intname, encoding, size, im)) {
+               if (tmpcachedir)
+                   Xfree  (tmpcachedir);
+               if (tmpname)
+                   Xfree (tmpname);
+               if (cachename)
+                   Xfree (cachename);
+               close (cachefd);
+               return;
+           }
+           close (cachefd);
+       }
+       if (cachename)
+           Xfree (cachename);
+       cachename = NULL;
+    }
+
+    if (getuid () == euid && getgid () == egid && euid != 0 && home) {
+
+       if (! cachedir) {
+           tmpcachedir = cachedir = Xmalloc (hl+strlen(XIM_HOME_CACHE_DIR)+1);
+           strcpy (cachedir, home);
+           strcat (cachedir, XIM_HOME_CACHE_DIR);
+       }
+       cachefd = _XimCachedFileName (cachedir, name, intname, encoding,
+                                     euid, 0, &cachename, &size);
+       if (cachefd != -1) {
+           if (_XimLoadCache (cachefd, intname, encoding, size, im)) {
+               if (tmpcachedir)
+                   Xfree  (tmpcachedir);
+               if (tmpname)
+                   Xfree (tmpname);
+               if (cachename)
+                   Xfree (cachename);
+               close (cachefd);
+               return;
+           }
+           close (cachefd);
+       }
+    }
+#endif
+
+    if (! (fp = _XFopenFile (name, "r"))) {
+       if (tmpcachedir)
+           Xfree  (tmpcachedir);
+       if (tmpname)
+           Xfree (tmpname);
+       if (cachename)
+           Xfree (cachename);
+        return;
+    }
+    _XimParseStringFile(fp, im);
+    fclose(fp);
+
+#ifdef COMPOSECACHE
+    if (cachename) {
+       assert (euid != 0);
+       _XimWriteCachedDefaultTree (intname, encoding, cachename, im);
+    }
+#endif
+
+    if (tmpcachedir)
+       Xfree  (tmpcachedir);
+    if (tmpname)
+       Xfree (tmpname);
+    if (cachename)
+       Xfree (cachename);
+}
+
+Private XIMMethodsRec      Xim_im_local_methods = {
+    _XimLocalCloseIM,           /* close */
+    _XimLocalSetIMValues,       /* set_values */
+    _XimLocalGetIMValues,       /* get_values */
+    _XimLocalCreateIC,          /* create_ic */
+    _XimLcctstombs,            /* ctstombs */
+    _XimLcctstowcs,            /* ctstowcs */
+    _XimLcctstoutf8            /* ctstoutf8 */
+};
+
+Public Bool
+_XimLocalOpenIM(
+    Xim                         im)
+{
+    XLCd                lcd = im->core.lcd;
+    XlcConv             conv;
+    XimDefIMValues      im_values;
+    XimLocalPrivateRec*  private = &im->private.local;
+
+    _XimInitialResourceInfo();
+    if(_XimSetIMResourceList(&im->core.im_resources,
+                               &im->core.im_num_resources) == False) {
+       goto Open_Error;
+    }
+    if(_XimSetICResourceList(&im->core.ic_resources,
+                               &im->core.ic_num_resources) == False) {
+       goto Open_Error;
+    }
+
+    _XimSetIMMode(im->core.im_resources, im->core.im_num_resources);
+
+    _XimGetCurrentIMValues(im, &im_values);
+    if(_XimSetLocalIMDefaults(im, (XPointer)&im_values,
+               im->core.im_resources, im->core.im_num_resources) == False) {
+       goto Open_Error;
+    }
+    _XimSetCurrentIMValues(im, &im_values);
+
+    if (!(conv = _XlcOpenConverter(lcd,        XlcNCompoundText, lcd, XlcNMultiByte)))
+       goto Open_Error;
+    private->ctom_conv = conv;
+
+    if (!(conv = _XlcOpenConverter(lcd,        XlcNCompoundText, lcd, XlcNWideChar)))
+       goto Open_Error;
+    private->ctow_conv = conv;
+
+    if (!(conv = _XlcOpenConverter(lcd,        XlcNCompoundText, lcd, XlcNUtf8String)))
+       goto Open_Error;
+    private->ctoutf8_conv = conv;
+
+    if (!(conv = _XlcOpenConverter(lcd,        XlcNCharSet, lcd, XlcNMultiByte)))
+       goto Open_Error;
+    private->cstomb_conv = conv;
+
+    if (!(conv = _XlcOpenConverter(lcd,        XlcNCharSet, lcd, XlcNWideChar)))
+       goto Open_Error;
+    private->cstowc_conv = conv;
+
+    if (!(conv = _XlcOpenConverter(lcd,        XlcNCharSet, lcd, XlcNUtf8String)))
+       goto Open_Error;
+    private->cstoutf8_conv = conv;
+
+    if (!(conv = _XlcOpenConverter(lcd,        XlcNUcsChar, lcd, XlcNChar)))
+       goto Open_Error;
+    private->ucstoc_conv = conv;
+
+    if (!(conv = _XlcOpenConverter(lcd,        XlcNUcsChar, lcd, XlcNUtf8String)))
+       goto Open_Error;
+    private->ucstoutf8_conv = conv;
+
+    private->base.treeused = 1;
+    private->base.mbused   = 1;
+    private->base.wcused   = 1;
+    private->base.utf8used = 1;
+
+    _XimCreateDefaultTree(im);
+
+    im->methods = &Xim_im_local_methods;
+    private->current_ic = (XIC)NULL;
+
+    return(True);
+
+Open_Error :
+    _XimLocalIMFree(im);
+    return(False);
+}
diff --git a/modules/im/ximcp/imLcLkup.c b/modules/im/ximcp/imLcLkup.c
new file mode 100644 (file)
index 0000000..8e4111a
--- /dev/null
@@ -0,0 +1,417 @@
+/******************************************************************
+
+              Copyright 1992 by Fuji Xerox Co., Ltd.
+              Copyright 1992, 1994  by FUJITSU LIMITED
+
+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 Fuji Xerox,
+FUJITSU LIMITED not be used in advertising or publicity pertaining
+to distribution of the software without specific, written prior
+permission.  Fuji Xerox, FUJITSU LIMITED  make no representations
+about the suitability of this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+FUJI XEROX, FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL FUJI XEROX,
+FUJITSU LIMITED 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.
+
+  Author: Kazunori Nishihara   Fuji Xerox
+          Takashi Fujiwara     FUJITSU LIMITED
+                               fujiwara@a80.tech.yk.fujitsu.co.jp
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include <X11/Xatom.h>
+#include <X11/Xos.h>
+#include <X11/Xlib.h>
+#include <X11/keysym.h>
+#include <X11/Xutil.h>
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "XlcPubI.h"
+#include "Ximint.h"
+
+Public int
+_XimLocalMbLookupString(XIC xic, XKeyEvent *ev, char *buffer, int bytes,
+                       KeySym *keysym, Status *status)
+{
+    Xic                 ic = (Xic)xic;
+    int                 ret;
+    DefTree    *b  = ic->private.local.base.tree;
+    char       *mb = ic->private.local.base.mb;
+
+    if(ev->type != KeyPress) {
+       if(status) *status = XLookupNone;
+       return(0);
+    }
+    if(ev->keycode == 0 &&
+          (  (ic->private.local.composed != 0)
+           ||(ic->private.local.brl_committed != 0))) {
+       if (ic->private.local.brl_committed != 0) { /* Braille Event */
+           unsigned char pattern = ic->private.local.brl_committed;
+           char mb[XLC_PUBLIC(ic->core.im->core.lcd, mb_cur_max)];
+           ret = _Xlcwctomb(ic->core.im->core.lcd, mb, BRL_UC_ROW | pattern);
+           if(ret > bytes) {
+               if(status) *status = XBufferOverflow;
+               return(ret);
+           }
+           if(keysym) *keysym = XK_braille_blank | pattern;
+           if(ret > 0) {
+               if (keysym) {
+                   if(status) *status = XLookupBoth;
+               } else {
+                   if(status) *status = XLookupChars;
+               }
+               memcpy(buffer, mb, ret);
+           } else {
+               if(keysym) {
+                   if(status) *status = XLookupKeySym;
+               } else {
+                   if(status) *status = XLookupNone;
+               }
+           }
+       } else { /* Composed Event */
+           ret = strlen(&mb[b[ic->private.local.composed].mb]);
+           if(ret > bytes) {
+               if(status) *status = XBufferOverflow;
+               return(ret);
+           }
+           memcpy(buffer, &mb[b[ic->private.local.composed].mb], ret);
+           if(keysym) *keysym = b[ic->private.local.composed].ks;
+           if (ret > 0) {
+               if (keysym && *keysym != NoSymbol) {
+                   if(status) *status = XLookupBoth;
+               } else {
+                   if(status) *status = XLookupChars;
+               }
+           } else {
+               if(keysym && *keysym != NoSymbol) {
+                   if(status) *status = XLookupKeySym;
+               } else {
+                   if(status) *status = XLookupNone;
+               }
+           }
+       }
+       return (ret);
+    } else { /* Throughed Event */
+       ret = _XimLookupMBText(ic, ev, buffer, bytes, keysym, NULL);
+       if(ret > 0) {
+           if (ret > bytes) {
+               if (status) *status = XBufferOverflow;
+           } else if (keysym && *keysym != NoSymbol) {
+               if(status) *status = XLookupBoth;
+           } else {
+               if(status) *status = XLookupChars;
+           }
+       } else {
+           if(keysym && *keysym != NoSymbol) {
+               if(status) *status = XLookupKeySym;
+           } else {
+               if(status) *status = XLookupNone;
+           }
+       }
+    }
+    return (ret);
+}
+
+Public int
+_XimLocalWcLookupString(XIC xic, XKeyEvent *ev, wchar_t *buffer, int wlen,
+                       KeySym *keysym, Status *status)
+{
+    Xic                 ic = (Xic)xic;
+    int                 ret;
+    DefTree    *b  = ic->private.local.base.tree;
+    wchar_t    *wc = ic->private.local.base.wc;
+
+    if(ev->type != KeyPress) {
+       if(status) *status = XLookupNone;
+       return(0);
+    }
+    if(ev->keycode == 0) {
+       if (ic->private.local.brl_committed != 0) { /* Braille Event */
+           unsigned char pattern = ic->private.local.brl_committed;
+           ret = 1;
+           if (ret > wlen) {
+               if(status) *status = XBufferOverflow;
+               return (ret);
+           }
+           *buffer = BRL_UC_ROW | pattern;
+           if(keysym) {
+               *keysym = XK_braille_blank | pattern;
+               if(status) *status = XLookupBoth;
+           } else
+               if(status) *status = XLookupChars;
+       } else { /* Composed Event */
+           ret = _Xwcslen(&wc[b[ic->private.local.composed].wc]);
+           if(ret > wlen) {
+               if(status) *status = XBufferOverflow;
+               return (ret);
+           }
+           memcpy((char *)buffer, (char *)&wc[b[ic->private.local.composed].wc],
+                  ret * sizeof(wchar_t));
+           if(keysym) *keysym = b[ic->private.local.composed].ks;
+           if (ret > 0) {
+               if (keysym && *keysym != NoSymbol) {
+                   if(status) *status = XLookupBoth;
+               } else {
+                   if(status) *status = XLookupChars;
+               }
+           } else {
+               if(keysym && *keysym != NoSymbol) {
+                   if(status) *status = XLookupKeySym;
+               } else {
+                   if(status) *status = XLookupNone;
+               }
+           }
+       }
+       return (ret);
+    } else { /* Throughed Event */
+       ret = _XimLookupWCText(ic, ev, buffer, wlen, keysym, NULL);
+       if(ret > 0) {
+           if (ret > wlen) {
+               if (status) *status = XBufferOverflow;
+           } else if (keysym && *keysym != NoSymbol) {
+               if(status) *status = XLookupBoth;
+           } else {
+               if(status) *status = XLookupChars;
+           }
+       } else {
+           if(keysym && *keysym != NoSymbol) {
+               if(status) *status = XLookupKeySym;
+           } else {
+               if(status) *status = XLookupNone;
+           }
+       }
+    }
+    return (ret);
+}
+
+Public int
+_XimLocalUtf8LookupString(XIC xic, XKeyEvent *ev, char *buffer, int bytes,
+                         KeySym *keysym, Status *status)
+{
+    Xic                 ic = (Xic)xic;
+    int                 ret;
+    DefTree    *b    = ic->private.local.base.tree;
+    char       *utf8 = ic->private.local.base.utf8;
+
+    if(ev->type != KeyPress) {
+       if(status) *status = XLookupNone;
+       return(0);
+    }
+    if(ev->keycode == 0) {
+       if (ic->private.local.brl_committed != 0) { /* Braille Event */
+           unsigned char pattern = ic->private.local.brl_committed;
+           ret = 3;
+           if (ret > bytes) {
+               if(status) *status = XBufferOverflow;
+               return (ret);
+           }
+           buffer[0] = 0xe0 | ((BRL_UC_ROW >> 12) & 0x0f);
+           buffer[1] = 0x80 | ((BRL_UC_ROW >> 8) & 0x30) | (pattern >> 6);
+           buffer[2] = 0x80 | (pattern & 0x3f);
+           if(keysym) {
+               *keysym = XK_braille_blank | pattern;
+               if(status) *status = XLookupBoth;
+           } else
+               if(status) *status = XLookupChars;
+       } else { /* Composed Event */
+           ret = strlen(&utf8[b[ic->private.local.composed].utf8]);
+           if(ret > bytes) {
+               if(status) *status = XBufferOverflow;
+               return (ret);
+           }
+           memcpy(buffer, &utf8[b[ic->private.local.composed].utf8], ret);
+           if(keysym) *keysym = b[ic->private.local.composed].ks;
+           if (ret > 0) {
+               if (keysym && *keysym != NoSymbol) {
+                   if(status) *status = XLookupBoth;
+               } else {
+                   if(status) *status = XLookupChars;
+               }
+           } else {
+               if(keysym && *keysym != NoSymbol) {
+                   if(status) *status = XLookupKeySym;
+               } else {
+                   if(status) *status = XLookupNone;
+               }
+           }
+       }
+       return (ret);
+    } else { /* Throughed Event */
+       ret = _XimLookupUTF8Text(ic, ev, buffer, bytes, keysym, NULL);
+       if(ret > 0) {
+           if (ret > bytes) {
+               if (status) *status = XBufferOverflow;
+           } else if (keysym && *keysym != NoSymbol) {
+               if(status) *status = XLookupBoth;
+           } else {
+               if(status) *status = XLookupChars;
+           }
+       } else {
+           if(keysym && *keysym != NoSymbol) {
+               if(status) *status = XLookupKeySym;
+           } else {
+               if(status) *status = XLookupNone;
+           }
+       }
+    }
+    return (ret);
+}
+
+Private int
+_XimLcctsconvert(
+    XlcConv     conv,
+    char       *from,
+    int                 from_len,
+    char       *to,
+    int                 to_len,
+    Status     *state)
+{
+    int                 from_left;
+    int                 to_left;
+    int                 from_savelen;
+    int                 to_savelen;
+    int                 from_cnvlen;
+    int                 to_cnvlen;
+    char       *from_buf;
+    char       *to_buf;
+    char        scratchbuf[BUFSIZ];
+    Status      tmp_state;
+
+    if (!state)
+       state = &tmp_state;
+
+    if (!conv || !from || !from_len) {
+       *state = XLookupNone;
+       return 0;
+    }
+
+    /* Reset the converter.  The CompoundText at 'from' starts in
+       initial state.  */
+    _XlcResetConverter(conv);
+
+    from_left = from_len;
+    to_left = BUFSIZ;
+    from_cnvlen = 0;
+    to_cnvlen = 0;
+    for (;;) {
+       from_buf = &from[from_cnvlen];
+       from_savelen = from_left;
+       to_buf = &scratchbuf[to_cnvlen];
+       to_savelen = to_left;
+       if (_XlcConvert(conv, (XPointer *)&from_buf, &from_left,
+                                (XPointer *)&to_buf, &to_left, NULL, 0) < 0) {
+           *state = XLookupNone;
+           return 0;
+       }
+       from_cnvlen += (from_savelen - from_left);
+       to_cnvlen += (to_savelen - to_left);
+       if (from_left == 0) {
+           if (!to_cnvlen) {
+               *state = XLookupNone;
+               return 0;
+           }
+          break;
+       }
+    }
+
+    if (!to || !to_len || (to_len < to_cnvlen)) {
+       *state = XBufferOverflow;
+    } else {
+       memcpy(to, scratchbuf, to_cnvlen);
+       *state = XLookupChars;
+    }
+    return to_cnvlen;
+}
+
+Public int
+_XimLcctstombs(XIM xim, char *from, int from_len,
+              char *to, int to_len, Status *state)
+{
+    return _XimLcctsconvert(((Xim)xim)->private.local.ctom_conv,
+                           from, from_len, to, to_len, state);
+}
+
+Public int
+_XimLcctstowcs(XIM xim, char *from, int from_len,
+              wchar_t *to, int to_len, Status *state)
+{
+    Xim                 im = (Xim)xim;
+    XlcConv     conv = im->private.local.ctow_conv;
+    int                 from_left;
+    int                 to_left;
+    int                 from_savelen;
+    int                 to_savelen;
+    int                 from_cnvlen;
+    int                 to_cnvlen;
+    char       *from_buf;
+    wchar_t    *to_buf;
+    wchar_t     scratchbuf[BUFSIZ];
+    Status      tmp_state;
+
+    if (!state)
+       state = &tmp_state;
+
+    if (!conv || !from || !from_len) {
+       *state = XLookupNone;
+       return 0;
+    }
+
+    /* Reset the converter.  The CompoundText at 'from' starts in
+       initial state.  */
+    _XlcResetConverter(conv);
+
+    from_left = from_len;
+    to_left = BUFSIZ;
+    from_cnvlen = 0;
+    to_cnvlen = 0;
+    for (;;) {
+       from_buf = &from[from_cnvlen];
+       from_savelen = from_left;
+       to_buf = &scratchbuf[to_cnvlen];
+       to_savelen = to_left;
+       if (_XlcConvert(conv, (XPointer *)&from_buf, &from_left,
+                                (XPointer *)&to_buf, &to_left, NULL, 0) < 0) {
+           *state = XLookupNone;
+           return 0;
+       }
+       from_cnvlen += (from_savelen - from_left);
+       to_cnvlen += (to_savelen - to_left);
+       if (from_left == 0) {
+           if (!to_cnvlen){
+               *state = XLookupNone;
+               return 0;
+           }
+           break;
+       }
+    }
+
+    if (!to || !to_len || (to_len < to_cnvlen)) {
+       *state = XBufferOverflow;
+    } else {
+       memcpy(to, scratchbuf, to_cnvlen * sizeof(wchar_t));
+       *state = XLookupChars;
+    }
+    return to_cnvlen;
+}
+
+Public int
+_XimLcctstoutf8(XIM xim, char *from, int from_len,
+               char *to, int to_len, Status *state)
+{
+    return _XimLcctsconvert(((Xim)xim)->private.local.ctoutf8_conv,
+                           from, from_len, to, to_len, state);
+}
diff --git a/modules/im/ximcp/imLcPrs.c b/modules/im/ximcp/imLcPrs.c
new file mode 100644 (file)
index 0000000..4e54385
--- /dev/null
@@ -0,0 +1,685 @@
+/******************************************************************
+
+              Copyright 1992 by Oki Technosystems Laboratory, Inc.
+              Copyright 1992 by Fuji Xerox Co., Ltd.
+
+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 Oki Technosystems
+Laboratory and Fuji Xerox not be used in advertising or publicity
+pertaining to distribution of the software without specific, written
+prior permission.
+Oki Technosystems Laboratory and Fuji Xerox make no representations
+about the suitability of this software for any purpose.  It is provided
+"as is" without express or implied warranty.
+
+OKI TECHNOSYSTEMS LABORATORY AND FUJI XEROX DISCLAIM ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL OKI TECHNOSYSTEMS
+LABORATORY AND FUJI XEROX 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.
+
+  Author: Yasuhiro Kawai       Oki Technosystems Laboratory
+  Author: Kazunori Nishihara   Fuji Xerox
+
+******************************************************************/
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <X11/Xlib.h>
+#include <X11/Xmd.h>
+#include <X11/Xos.h>
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "Ximint.h"
+#include <sys/stat.h>
+#include <stdio.h>
+
+#define XLC_BUFSIZE 256
+
+extern int _Xmbstowcs(
+    wchar_t    *wstr,
+    char       *str,
+    int                len
+);
+
+extern int _Xmbstoutf8(
+    char       *ustr,
+    const char *str,
+    int                len
+);
+
+/*
+ *     Parsing File Format:
+ *
+ *     FILE          ::= { [PRODUCTION] [COMMENT] "\n"}
+ *     PRODUCTION    ::= LHS ":" RHS [ COMMENT ]
+ *     COMMENT       ::= "#" {<any character except null or newline>}
+ *     LHS           ::= EVENT { EVENT }
+ *     EVENT         ::= [MODIFIER_LIST] "<" keysym ">"
+ *     MODIFIER_LIST ::= ("!" {MODIFIER} ) | "None"
+ *     MODIFIER      ::= ["~"] modifier_name
+ *     RHS           ::= ( STRING | keysym | STRING keysym )
+ *     STRING        ::= '"' { CHAR } '"'
+ *     CHAR          ::= GRAPHIC_CHAR | ESCAPED_CHAR
+ *     GRAPHIC_CHAR  ::= locale (codeset) dependent code
+ *     ESCAPED_CHAR  ::= ('\\' | '\"' | OCTAL | HEX )
+ *     OCTAL         ::= '\' OCTAL_CHAR [OCTAL_CHAR [OCTAL_CHAR]]
+ *     OCTAL_CHAR    ::= (0|1|2|3|4|5|6|7)
+ *     HEX           ::= '\' (x|X) HEX_CHAR [HEX_CHAR]]
+ *     HEX_CHAR      ::= (0|1|2|3|4|5|6|7|8|9|A|B|C|D|E|F|a|b|c|d|e|f)
+ *
+ */
+
+static int
+nextch(
+    FILE *fp,
+    int *lastch)
+{
+    int c;
+
+    if (*lastch != 0) {
+       c = *lastch;
+       *lastch = 0;
+    } else {
+       c = getc(fp);
+       if (c == '\\') {
+           c = getc(fp);
+           if (c == '\n') {
+               c = getc(fp);
+           } else {
+               ungetc(c, fp);
+               c = '\\';
+           }
+       }
+    }
+    return(c);
+}
+
+static void
+putbackch(
+    int c,
+    int *lastch)
+{
+    *lastch = c;
+}
+
+#define ENDOFFILE 0
+#define ENDOFLINE 1
+#define COLON 2
+#define LESS 3
+#define GREATER 4
+#define EXCLAM 5
+#define TILDE 6
+#define STRING 7
+#define KEY 8
+#define ERROR 9
+
+#ifndef isalnum
+#define isalnum(c)      \
+    (('0' <= (c) && (c) <= '9')  || \
+     ('A' <= (c) && (c) <= 'Z')  || \
+     ('a' <= (c) && (c) <= 'z'))
+#endif
+
+static int
+nexttoken(
+    FILE *fp,
+    char *tokenbuf,
+    int *lastch)
+{
+    int c;
+    int token;
+    char *p;
+    int i, j;
+
+    while ((c = nextch(fp, lastch)) == ' ' || c == '\t') {
+    }
+    switch (c) {
+      case EOF:
+       token = ENDOFFILE;
+       break;
+      case '\n':
+       token = ENDOFLINE;
+       break;
+      case '<':
+       token = LESS;
+       break;
+      case '>':
+       token = GREATER;
+       break;
+      case ':':
+       token = COLON;
+       break;
+      case '!':
+       token = EXCLAM;
+       break;
+      case '~':
+       token = TILDE;
+       break;
+      case '"':
+       p = tokenbuf;
+       while ((c = nextch(fp, lastch)) != '"') {
+           if (c == '\n' || c == EOF) {
+               putbackch(c, lastch);
+               token = ERROR;
+               goto string_error;
+           } else if (c == '\\') {
+               c = nextch(fp, lastch);
+               switch (c) {
+                 case '\\':
+                 case '"':
+                   *p++ = c;
+                   break;
+                 case 'n':
+                   *p++ = '\n';
+                   break;
+                 case 'r':
+                   *p++ = '\r';
+                   break;
+                 case 't':
+                   *p++ = '\t';
+                   break;
+                 case '0':
+                 case '1':
+                 case '2':
+                 case '3':
+                 case '4':
+                 case '5':
+                 case '6':
+                 case '7':
+                   i = c - '0';
+                   c = nextch(fp, lastch);
+                   for (j = 0; j < 2 && c >= '0' && c <= '7'; j++) {
+                       i <<= 3;
+                       i += c - '0';
+                       c = nextch(fp, lastch);
+                   }
+                   putbackch(c, lastch);
+                   *p++ = (char)i;
+                   break;
+                 case 'X':
+                 case 'x':
+                   i = 0;
+                   for (j = 0; j < 2; j++) {
+                       c = nextch(fp, lastch);
+                       i <<= 4;
+                       if (c >= '0' && c <= '9') {
+                           i += c - '0';
+                       } else if (c >= 'A' && c <= 'F') {
+                           i += c - 'A' + 10;
+                       } else if (c >= 'a' && c <= 'f') {
+                           i += c - 'a' + 10;
+                       } else {
+                           putbackch(c, lastch);
+                           i >>= 4;
+                           break;
+                       }
+                   }
+                   if (j == 0) {
+                       token = ERROR;
+                       goto string_error;
+                   }
+                   *p++ = (char)i;
+                   break;
+                 case EOF:
+                   putbackch(c, lastch);
+                   token = ERROR;
+                   goto string_error;
+                 default:
+                   *p++ = c;
+                   break;
+               }
+           } else {
+               *p++ = c;
+           }
+       }
+       *p = '\0';
+       token = STRING;
+       break;
+      case '#':
+       while ((c = nextch(fp, lastch)) != '\n' && c != EOF) {
+       }
+       if (c == '\n') {
+           token = ENDOFLINE;
+       } else {
+           token = ENDOFFILE;
+       }
+       break;
+      default:
+       if (isalnum(c) || c == '_' || c == '-') {
+           p = tokenbuf;
+           *p++ = c;
+           c = nextch(fp, lastch);
+           while (isalnum(c) || c == '_' || c == '-') {
+               *p++ = c;
+               c = nextch(fp, lastch);
+           }
+           *p = '\0';
+           putbackch(c, lastch);
+           token = KEY;
+       } else {
+           token = ERROR;
+       }
+       break;
+    }
+string_error:
+    return(token);
+}
+
+static long
+modmask(
+    char *name)
+{
+    struct _modtbl {
+       const char name[6];
+       long mask;
+    };
+
+    static const struct _modtbl tbl[] = {
+       { "Ctrl",       ControlMask     },
+        { "Lock",      LockMask        },
+        { "Caps",      LockMask        },
+        { "Shift",     ShiftMask       },
+        { "Alt",       Mod1Mask        },
+        { "Meta",      Mod1Mask        }};
+
+    int i, num_entries = sizeof (tbl) / sizeof (tbl[0]);
+
+    for (i = 0; i < num_entries; i++)
+        if (!strcmp (name, tbl[i].name))
+            return tbl[i].mask;
+
+    return 0;
+}
+
+static char*
+TransFileName(Xim im, char *name)
+{
+   char *home = NULL, *lcCompose = NULL;
+   char dir[XLC_BUFSIZE];
+   char *i = name, *ret, *j;
+   int l = 0;
+
+   while (*i) {
+      if (*i == '%') {
+         i++;
+         switch (*i) {
+             case '%':
+                 l++;
+                break;
+             case 'H':
+                home = getenv("HOME");
+                if (home)
+                     l += strlen(home);
+                break;
+             case 'L':
+                 if (lcCompose == NULL)
+                     lcCompose = _XlcFileName(im->core.lcd, COMPOSE_FILE);
+                 if (lcCompose)
+                     l += strlen(lcCompose);
+                break;
+             case 'S':
+                 xlocaledir(dir, XLC_BUFSIZE);
+                 l += strlen(dir);
+                break;
+         }
+      } else {
+         l++;
+      }
+      i++;
+   }
+
+   j = ret = Xmalloc(l+1);
+   if (ret == NULL)
+      return ret;
+   i = name;
+   while (*i) {
+      if (*i == '%') {
+         i++;
+         switch (*i) {
+             case '%':
+                 *j++ = '%';
+                break;
+             case 'H':
+                if (home) {
+                    strcpy(j, home);
+                    j += strlen(home);
+                }
+                break;
+             case 'L':
+                if (lcCompose) {
+                    strcpy(j, lcCompose);
+                    j += strlen(lcCompose);
+                 }
+                break;
+             case 'S':
+                 strcpy(j, dir);
+                 j += strlen(dir);
+                break;
+         }
+          i++;
+      } else {
+         *j++ = *i++;
+      }
+   }
+   *j = '\0';
+   Xfree(lcCompose);
+   return ret;
+}
+
+#ifndef MB_LEN_MAX
+#define MB_LEN_MAX 6
+#endif
+
+static int
+get_mb_string (Xim im, char *buf, KeySym ks)
+{
+    XPointer from, to;
+    int from_len, to_len, len;
+    XPointer args[1];
+    XlcCharSet charset;
+    char local_buf[MB_LEN_MAX];
+    unsigned int ucs;
+    ucs = KeySymToUcs4(ks);
+
+    from = (XPointer) &ucs;
+    to =   (XPointer) local_buf;
+    from_len = 1;
+    to_len = MB_LEN_MAX;
+    args[0] = (XPointer) &charset;
+    if (_XlcConvert(im->private.local.ucstoc_conv,
+                    &from, &from_len, &to, &to_len, args, 1 ) != 0) {
+         return 0;
+    }
+
+    from = (XPointer) local_buf;
+    to =   (XPointer) buf;
+    from_len = MB_LEN_MAX - to_len;
+    to_len = MB_LEN_MAX + 1;
+    args[0] = (XPointer) charset;
+    if (_XlcConvert(im->private.local.cstomb_conv,
+                    &from, &from_len, &to, &to_len, args, 1 ) != 0) {
+         return 0;
+    }
+    len = MB_LEN_MAX + 1 - to_len;
+    buf[len] = '\0';
+    return len;
+}
+
+#define AllMask (ShiftMask | LockMask | ControlMask | Mod1Mask)
+#define LOCAL_WC_BUFSIZE 128
+#define LOCAL_UTF8_BUFSIZE 256
+#define SEQUENCE_MAX   10
+
+static int
+parseline(
+    FILE *fp,
+    Xim   im,
+    char* tokenbuf)
+{
+    int token;
+    DTModifier modifier_mask;
+    DTModifier modifier;
+    DTModifier tmp;
+    KeySym keysym = NoSymbol;
+    DTIndex *top = &im->private.local.top;
+    DefTreeBase *b   = &im->private.local.base;
+    DTIndex t;
+    DefTree *p = NULL;
+    Bool exclam, tilde;
+    KeySym rhs_keysym = 0;
+    char *rhs_string_mb;
+    int l;
+    int lastch = 0;
+    char local_mb_buf[MB_LEN_MAX+1];
+    wchar_t local_wc_buf[LOCAL_WC_BUFSIZE], *rhs_string_wc;
+    char local_utf8_buf[LOCAL_UTF8_BUFSIZE], *rhs_string_utf8;
+
+    struct DefBuffer {
+       DTModifier modifier_mask;
+       DTModifier modifier;
+       KeySym keysym;
+    };
+
+    struct DefBuffer buf[SEQUENCE_MAX];
+    int i, n;
+
+    do {
+       token = nexttoken(fp, tokenbuf, &lastch);
+    } while (token == ENDOFLINE);
+
+    if (token == ENDOFFILE) {
+       return(-1);
+    }
+
+    n = 0;
+    do {
+       if ((token == KEY) && (strcmp("include", tokenbuf) == 0)) {
+            char *filename;
+            FILE *infp;
+            token = nexttoken(fp, tokenbuf, &lastch);
+            if (token != KEY && token != STRING)
+                goto error;
+            if ((filename = TransFileName(im, tokenbuf)) == NULL)
+                goto error;
+            infp = _XFopenFile(filename, "r");
+                Xfree(filename);
+            if (infp == NULL)
+                goto error;
+            _XimParseStringFile(infp, im);
+            fclose(infp);
+            return (0);
+       } else if ((token == KEY) && (strcmp("None", tokenbuf) == 0)) {
+           modifier = 0;
+           modifier_mask = AllMask;
+           token = nexttoken(fp, tokenbuf, &lastch);
+       } else {
+           modifier_mask = modifier = 0;
+           exclam = False;
+           if (token == EXCLAM) {
+               exclam = True;
+               token = nexttoken(fp, tokenbuf, &lastch);
+           }
+           while (token == TILDE || token == KEY) {
+               tilde = False;
+               if (token == TILDE) {
+                   tilde = True;
+                   token = nexttoken(fp, tokenbuf, &lastch);
+                   if (token != KEY)
+                       goto error;
+               }
+               tmp = modmask(tokenbuf);
+               if (!tmp) {
+                   goto error;
+               }
+               modifier_mask |= tmp;
+               if (tilde) {
+                   modifier &= ~tmp;
+               } else {
+                   modifier |= tmp;
+               }
+               token = nexttoken(fp, tokenbuf, &lastch);
+           }
+           if (exclam) {
+               modifier_mask = AllMask;
+           }
+       }
+
+       if (token != LESS) {
+           goto error;
+       }
+
+       token = nexttoken(fp, tokenbuf, &lastch);
+       if (token != KEY) {
+           goto error;
+       }
+
+       token = nexttoken(fp, tokenbuf, &lastch);
+       if (token != GREATER) {
+           goto error;
+       }
+
+       keysym = XStringToKeysym(tokenbuf);
+       if (keysym == NoSymbol) {
+           goto error;
+       }
+
+       buf[n].keysym = keysym;
+       buf[n].modifier = modifier;
+       buf[n].modifier_mask = modifier_mask;
+       n++;
+       if( n >= SEQUENCE_MAX )
+           goto error;
+       token = nexttoken(fp, tokenbuf, &lastch);
+    } while (token != COLON);
+
+    token = nexttoken(fp, tokenbuf, &lastch);
+    if (token == STRING) {
+       l = strlen(tokenbuf) + 1;
+       while (b->mbused + l > b->mbsize) {
+           b->mbsize = b->mbsize ? b->mbsize * 1.5 : 1024;
+           if (! (b->mb = Xrealloc (b->mb, b->mbsize)) )
+               goto error;
+       }
+       rhs_string_mb = &b->mb[b->mbused];
+       b->mbused    += l;
+       strcpy(rhs_string_mb, tokenbuf);
+       token = nexttoken(fp, tokenbuf, &lastch);
+       if (token == KEY) {
+           rhs_keysym = XStringToKeysym(tokenbuf);
+           if (rhs_keysym == NoSymbol) {
+               goto error;
+           }
+           token = nexttoken(fp, tokenbuf, &lastch);
+       }
+       if (token != ENDOFLINE && token != ENDOFFILE) {
+           goto error;
+       }
+    } else if (token == KEY) {
+       rhs_keysym = XStringToKeysym(tokenbuf);
+       if (rhs_keysym == NoSymbol) {
+           goto error;
+       }
+       token = nexttoken(fp, tokenbuf, &lastch);
+       if (token != ENDOFLINE && token != ENDOFFILE) {
+           goto error;
+       }
+
+        l = get_mb_string(im, local_mb_buf, rhs_keysym);
+       while (b->mbused + l + 1 > b->mbsize) {
+           b->mbsize = b->mbsize ? b->mbsize * 1.5 : 1024;
+           if (! (b->mb = Xrealloc (b->mb, b->mbsize)) )
+               goto error;
+       }
+       rhs_string_mb = &b->mb[b->mbused];
+       b->mbused    += l + 1;
+        memcpy(rhs_string_mb, local_mb_buf, l);
+       rhs_string_mb[l] = '\0';
+    } else {
+       goto error;
+    }
+
+    l = _Xmbstowcs(local_wc_buf, rhs_string_mb, LOCAL_WC_BUFSIZE - 1);
+    if (l == LOCAL_WC_BUFSIZE - 1) {
+       local_wc_buf[l] = (wchar_t)'\0';
+    }
+    while (b->wcused + l + 1 > b->wcsize) {
+       b->wcsize = b->wcsize ? b->wcsize * 1.5 : 512;
+       if (! (b->wc = Xrealloc (b->wc, sizeof(wchar_t) * b->wcsize)) )
+           goto error;
+    }
+    rhs_string_wc = &b->wc[b->wcused];
+    b->wcused    += l + 1;
+    memcpy((char *)rhs_string_wc, (char *)local_wc_buf, (l + 1) * sizeof(wchar_t) );
+
+    l = _Xmbstoutf8(local_utf8_buf, rhs_string_mb, LOCAL_UTF8_BUFSIZE - 1);
+    if (l == LOCAL_UTF8_BUFSIZE - 1) {
+       local_utf8_buf[l] = '\0';
+    }
+    while (b->utf8used + l + 1 > b->utf8size) {
+       b->utf8size = b->utf8size ? b->utf8size * 1.5 : 1024;
+       if (! (b->utf8 = Xrealloc (b->utf8, b->utf8size)) )
+           goto error;
+    }
+    rhs_string_utf8 = &b->utf8[b->utf8used];
+    b->utf8used    += l + 1;
+    memcpy(rhs_string_utf8, local_utf8_buf, l + 1);
+
+    for (i = 0; i < n; i++) {
+       for (t = *top; t; t = b->tree[t].next) {
+           if (buf[i].keysym        == b->tree[t].keysym &&
+               buf[i].modifier      == b->tree[t].modifier &&
+               buf[i].modifier_mask == b->tree[t].modifier_mask) {
+               break;
+           }
+       }
+       if (t) {
+           p = &b->tree[t];
+           top = &p->succession;
+       } else {
+           while (b->treeused >= b->treesize) {
+               DefTree *old     = b->tree;
+               int      oldsize = b->treesize;
+               b->treesize = b->treesize ? b->treesize * 1.5 : 256;
+               if (! (b->tree = Xrealloc (b->tree, sizeof(DefTree) * b->treesize)) )
+                   goto error;
+               if (top >= (DTIndex *) old && top < (DTIndex *) &old[oldsize])
+                   top = (DTIndex *) (((char *) top) + (((char *)b->tree)-(char *)old));
+           }
+           p = &b->tree[b->treeused];
+           p->keysym        = buf[i].keysym;
+           p->modifier      = buf[i].modifier;
+           p->modifier_mask = buf[i].modifier_mask;
+           p->succession    = 0;
+           p->next          = *top;
+           p->mb            = 0;
+           p->wc            = 0;
+           p->utf8          = 0;
+           p->ks            = NoSymbol;
+           *top = b->treeused;
+           top = &p->succession;
+           b->treeused++;
+       }
+    }
+
+    /* old entries no longer freed... */
+    p->mb   = rhs_string_mb   - b->mb;
+    p->wc   = rhs_string_wc   - b->wc;
+    p->utf8 = rhs_string_utf8 - b->utf8;
+    p->ks   = rhs_keysym;
+    return(n);
+error:
+    while (token != ENDOFLINE && token != ENDOFFILE) {
+       token = nexttoken(fp, tokenbuf, &lastch);
+    }
+    return(0);
+}
+
+void
+_XimParseStringFile(
+    FILE *fp,
+    Xim   im)
+{
+    char tb[8192];
+    char* tbp;
+    struct stat st;
+
+    if (fstat (fileno (fp), &st) != -1) {
+       unsigned long size = (unsigned long) st.st_size;
+       if (size <= sizeof tb) tbp = tb;
+       else tbp = malloc (size);
+
+       if (tbp != NULL) {
+           while (parseline(fp, im, tbp) >= 0) {}
+           if (tbp != tb) free (tbp);
+       }
+    }
+}
diff --git a/modules/im/ximcp/imLcSIc.c b/modules/im/ximcp/imLcSIc.c
new file mode 100644 (file)
index 0000000..0959193
--- /dev/null
@@ -0,0 +1,54 @@
+/******************************************************************
+
+          Copyright 1990, 1991, 1992, 1993, 1994 by FUJITSU LIMITED
+
+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 FUJITSU LIMITED
+not be used in advertising or publicity pertaining to distribution
+of the software without specific, written prior permission.
+FUJITSU LIMITED makes no representations about the suitability of
+this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL FUJITSU LIMITED 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.
+
+  Author: Takashi Fujiwara     FUJITSU LIMITED
+                               fujiwara@a80.tech.yk.fujitsu.co.jp
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include <X11/Xlib.h>
+#include <X11/Xmd.h>
+#include <X11/Xutil.h>
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "Ximint.h"
+
+Public char *
+_XimLocalSetICValues(XIC xic, XIMArg *values)
+{
+    XimDefICValues      ic_values;
+    Xic                         ic = (Xic)xic;
+    char               *name;
+
+    _XimGetCurrentICValues(ic, &ic_values);
+    name = _XimSetICValueData(ic, (XPointer)&ic_values,
+                               ic->private.local.ic_resources,
+                               ic->private.local.ic_num_resources,
+                               values, XIM_SETICVALUES, True);
+    _XimSetCurrentICValues(ic, &ic_values);
+    return(name);
+}
diff --git a/modules/im/ximcp/imRm.c b/modules/im/ximcp/imRm.c
new file mode 100644 (file)
index 0000000..01e74c2
--- /dev/null
@@ -0,0 +1,3196 @@
+/******************************************************************
+
+         Copyright 1990, 1991, 1992,1993, 1994 by FUJITSU LIMITED
+         Copyright 1994                        by Sony Corporation
+
+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 FUJITSU LIMITED
+and Sony Corporation not be used in advertising or publicity
+pertaining to distribution of the software without specific,
+written prior permission. FUJITSU LIMITED and Sony Corporation make
+no representations about the suitability of this software for any
+purpose. It is provided "as is" without express or implied warranty.
+
+FUJITSU LIMITED AND SONY CORPORATION DISCLAIM ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL FUJITSU LIMITED AND
+SONY CORPORATION 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.
+
+  Author: Takashi Fujiwara     FUJITSU LIMITED
+                              fujiwara@a80.tech.yk.fujitsu.co.jp
+  Modifier: Makoto Wakamatsu   Sony Corporation
+                              makoto@sm.sony.co.jp
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include <X11/Xlib.h>
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "Ximint.h"
+#include "Xresource.h"
+
+#define GET_NAME(x) name_table + x.name_offset
+
+typedef struct _XimValueOffsetInfo {
+    unsigned short name_offset;
+    XrmQuark            quark;
+    unsigned int        offset;
+    Bool                (*defaults)(
+       struct _XimValueOffsetInfo *, XPointer, XPointer, unsigned long
+                        );
+    Bool                (*encode)(
+       struct _XimValueOffsetInfo *, XPointer, XPointer
+                        );
+    Bool                (*decode)(
+       struct _XimValueOffsetInfo *, XPointer, XPointer
+                        );
+} XimValueOffsetInfoRec, *XimValueOffsetInfo;
+
+#ifdef XIM_CONNECTABLE
+Private Bool
+_XimCheckBool(str)
+    char       *str;
+{
+    if(!strcmp(str, "True") || !strcmp(str, "true") ||
+       !strcmp(str, "Yes")  || !strcmp(str, "yes")  ||
+       !strcmp(str, "ON")   || !strcmp(str, "on"))
+       return True;
+    return False;
+}
+
+Public void
+_XimSetProtoResource(im)
+    Xim                 im;
+{
+    char       res_name_buf[256];
+    char*      res_name;
+    char       res_class_buf[256];
+    char*      res_class;
+    char*      str_type;
+    XrmValue   value;
+    XIMStyle   preedit_style = 0;
+    XIMStyle   status_style = 0;
+    XIMStyles* imstyles;
+    char*      dotximdot = ".xim.";
+    char*      ximdot = "xim.";
+    char*      dotXimdot = ".Xim.";
+    char*      Ximdot = "Xim.";
+
+    if (!im->core.rdb)
+       return;
+
+    if (strlen (im->core.res_name) < 200) res_name = res_name_buf;
+    else res_name = Xmalloc (strlen (im->core.res_name) + 50);
+    if (strlen (im->core.res_class) < 200) res_class = res_class_buf;
+    else res_class = Xmalloc (strlen (im->core.res_class) + 50);
+    /* pretend malloc always works */
+
+    (void) sprintf (res_name, "%s%s%s",
+       im->core.res_name != NULL ? im->core.res_name : "*",
+       im->core.res_name != NULL ? dotximdot : ximdot,
+       "useAuth");
+    (void) sprintf (res_class, "%s%s%s",
+       im->core.res_class != NULL ? im->core.res_class : "*",
+       im->core.res_class != NULL ? dotXimdot : Ximdot,
+       "UseAuth");
+    bzero(&value, sizeof(XrmValue));
+    if(XrmGetResource(im->core.rdb, res_name, res_class, &str_type, &value)) {
+       if(_XimCheckBool(value.addr)) {
+           MARK_USE_AUTHORIZATION_FUNC(im);
+       }
+    }
+
+    (void) sprintf (res_name, "%s%s%s",
+       im->core.res_name != NULL ? im->core.res_name : "*",
+       im->core.res_name != NULL ? dotximdot : ximdot,
+       "delaybinding");
+    (void) sprintf (res_class, "%s%s%s",
+       im->core.res_class != NULL ? im->core.res_class : "*",
+       im->core.res_class != NULL ? dotXimdot : Ximdot,
+       "Delaybinding");
+    bzero(&value, sizeof(XrmValue));
+    if(XrmGetResource(im->core.rdb, res_name, res_class, &str_type, &value)) {
+       if(_XimCheckBool(value.addr)) {
+           MARK_DELAYBINDABLE(im);
+       }
+    }
+
+    (void) sprintf (res_name, "%s%s%s",
+       im->core.res_name != NULL ? im->core.res_name : "*",
+       im->core.res_name != NULL ? dotximdot : ximdot,
+       "reconnect");
+    (void) sprintf (res_class, "%s%s%s",
+       im->core.res_class != NULL ? im->core.res_class : "*",
+       im->core.res_class != NULL ? dotXimdot : Ximdot,
+       "Reconnect");
+    bzero(&value, sizeof(XrmValue));
+    if(XrmGetResource(im->core.rdb, res_name, res_class, &str_type, &value)) {
+       if(_XimCheckBool(value.addr)) {
+           MARK_RECONNECTABLE(im);
+       }
+    }
+
+    if(!IS_CONNECTABLE(im)) {
+       if (res_name != res_name_buf) Xfree (res_name);
+       if (res_class != res_class_buf) Xfree (res_class);
+       return;
+    }
+
+    (void) sprintf (res_name, "%s%s%s",
+       im->core.res_name != NULL ? im->core.res_name : "*",
+       im->core.res_name != NULL ? dotximdot : ximdot,
+       "preeditDefaultStyle");
+    (void) sprintf (res_class, "%s%s%s",
+       im->core.res_class != NULL ? im->core.res_class : "*",
+       im->core.res_class != NULL ? dotXimdot : Ximdot,
+       "PreeditDefaultStyle");
+    if(XrmGetResource(im->core.rdb, res_name, res_class, &str_type, &value)) {
+       if(!strcmp(value.addr, "XIMPreeditArea"))
+           preedit_style = XIMPreeditArea;
+       else if(!strcmp(value.addr, "XIMPreeditCallbacks"))
+           preedit_style = XIMPreeditCallbacks;
+       else if(!strcmp(value.addr, "XIMPreeditPosition"))
+           preedit_style = XIMPreeditPosition;
+       else if(!strcmp(value.addr, "XIMPreeditNothing"))
+           preedit_style = XIMPreeditNothing;
+       else if(!strcmp(value.addr, "XIMPreeditNone"))
+           preedit_style = XIMPreeditNone;
+    }
+    if(!preedit_style)
+       preedit_style = XIMPreeditNothing;
+
+    (void) sprintf (res_name, "%s%s%s",
+       im->core.res_name != NULL ? im->core.res_name : "*",
+       im->core.res_name != NULL ? dotximdot : ximdot,
+       "statusDefaultStyle");
+    (void) sprintf (res_class, "%s%s%s",
+       im->core.res_class != NULL ? im->core.res_class : "*",
+       im->core.res_class != NULL ? dotXimdot : Ximdot,
+       "StatusDefaultStyle");
+    if(XrmGetResource(im->core.rdb, res_name, res_class, &str_type, &value)) {
+       if(!strcmp(value.addr, "XIMStatusArea"))
+           status_style = XIMStatusArea;
+       else if(!strcmp(value.addr, "XIMStatusCallbacks"))
+           status_style = XIMStatusCallbacks;
+       else if(!strcmp(value.addr, "XIMStatusNothing"))
+           status_style = XIMStatusNothing;
+       else if(!strcmp(value.addr, "XIMStatusNone"))
+           status_style = XIMStatusNone;
+    }
+    if(!status_style)
+       status_style = XIMStatusNothing;
+
+    if(!(imstyles = (XIMStyles *)Xmalloc(sizeof(XIMStyles) + sizeof(XIMStyle)))){
+       if (res_name != res_name_buf) Xfree (res_name);
+       if (res_class != res_class_buf) Xfree (res_class);
+       return;
+    }
+    imstyles->count_styles = 1;
+    imstyles->supported_styles =
+                       (XIMStyle *)((char *)imstyles + sizeof(XIMStyles));
+    imstyles->supported_styles[0] = preedit_style | status_style;
+    im->private.proto.default_styles = imstyles;
+    if (res_name != res_name_buf) Xfree (res_name);
+    if (res_class != res_class_buf) Xfree (res_class);
+}
+#endif /* XIM_CONNECTABLE */
+
+static const char name_table[] =
+    /*   0 */ XNQueryInputStyle"\0"
+    /*  16 */ XNClientWindow"\0"
+    /*  29 */ XNInputStyle"\0"
+    /*  40 */ XNFocusWindow"\0"
+    /*  52 */ XNResourceName"\0"
+    /*  65 */ XNResourceClass"\0"
+    /*  79 */ XNGeometryCallback"\0"
+    /*  96 */ XNDestroyCallback"\0"
+    /* 112 */ XNFilterEvents"\0"
+    /* 125 */ XNPreeditStartCallback"\0"
+    /* 146 */ XNPreeditDoneCallback"\0"
+    /* 166 */ XNPreeditDrawCallback"\0"
+    /* 186 */ XNPreeditCaretCallback"\0"
+    /* 207 */ XNPreeditStateNotifyCallback"\0"
+    /* 234 */ XNPreeditAttributes"\0"
+    /* 252 */ XNStatusStartCallback"\0"
+    /* 272 */ XNStatusDoneCallback"\0"
+    /* 291 */ XNStatusDrawCallback"\0"
+    /* 310 */ XNStatusAttributes"\0"
+    /* 327 */ XNArea"\0"
+    /* 332 */ XNAreaNeeded"\0"
+    /* 343 */ XNSpotLocation"\0"
+    /* 356 */ XNColormap"\0"
+    /* 365 */ XNStdColormap"\0"
+    /* 377 */ XNForeground"\0"
+    /* 388 */ XNBackground"\0"
+    /* 399 */ XNBackgroundPixmap"\0"
+    /* 416 */ XNFontSet"\0"
+    /* 424 */ XNLineSpace"\0"
+    /* 434 */ XNCursor"\0"
+    /* 441 */ XNQueryIMValuesList"\0"
+    /* 459 */ XNQueryICValuesList"\0"
+    /* 477 */ XNVisiblePosition"\0"
+    /* 493 */ XNStringConversionCallback"\0"
+    /* 518 */ XNStringConversion"\0"
+    /* 535 */ XNResetState"\0"
+    /* 546 */ XNHotKey"\0"
+    /* 553 */ XNHotKeyState"\0"
+    /* 565 */ XNPreeditState
+;
+
+#define OFFSET_XNQUERYINPUTSTYLE 0
+#define OFFSET_XNCLIENTWINDOW 16
+#define OFFSET_XNINPUTSTYLE 29
+#define OFFSET_XNFOCUSWINDOW 40
+#define OFFSET_XNRESOURCENAME 52
+#define OFFSET_XNRESOURCECLASS 65
+#define OFFSET_XNGEOMETRYCALLBACK 79
+#define OFFSET_XNDESTROYCALLBACK 96
+#define OFFSET_XNFILTEREVENTS 112
+#define OFFSET_XNPREEDITSTARTCALLBACK 125
+#define OFFSET_XNPREEDITDONECALLBACK 146
+#define OFFSET_XNPREEDITDRAWCALLBACK 166
+#define OFFSET_XNPREEDITCARETCALLBACK 186
+#define OFFSET_XNPREEDITSTATENOTIFYCALLBACK 207
+#define OFFSET_XNPREEDITATTRIBUTES 234
+#define OFFSET_XNSTATUSSTARTCALLBACK 252
+#define OFFSET_XNSTATUSDONECALLBACK 272
+#define OFFSET_XNSTATUSDRAWCALLBACK 291
+#define OFFSET_XNSTATUSATTRIBUTES 310
+#define OFFSET_XNAREA 327
+#define OFFSET_XNAREANEEDED 332
+#define OFFSET_XNSPOTLOCATION 343
+#define OFFSET_XNCOLORMAP 356
+#define OFFSET_XNSTDCOLORMAP 365
+#define OFFSET_XNFOREGROUND 377
+#define OFFSET_XNBACKGROUND 388
+#define OFFSET_XNBACKGROUNDPIXMAP 399
+#define OFFSET_XNFONTSET 416
+#define OFFSET_XNLINESPACE 424
+#define OFFSET_XNCURSOR 434
+#define OFFSET_XNQUERYIMVALUESLIST 441
+#define OFFSET_XNQUERYICVALUESLIST 459
+#define OFFSET_XNVISIBLEPOSITION 477
+#define OFFSET_XNSTRINGCONVERSIONCALLBACK 493
+#define OFFSET_XNSTRINGCONVERSION 518
+#define OFFSET_XNRESETSTATE 535
+#define OFFSET_XNHOTKEY 546
+#define OFFSET_XNHOTKEYSTATE 553
+#define OFFSET_XNPREEDITSTATE 565
+
+/* offsets into name_table */
+static const unsigned short supported_local_im_values_list[] = {
+    OFFSET_XNQUERYINPUTSTYLE,
+    OFFSET_XNRESOURCENAME,
+    OFFSET_XNRESOURCECLASS,
+    OFFSET_XNDESTROYCALLBACK,
+    OFFSET_XNQUERYIMVALUESLIST,
+    OFFSET_XNQUERYICVALUESLIST,
+    OFFSET_XNVISIBLEPOSITION
+};
+
+/* offsets into name_table */
+static const unsigned short supported_local_ic_values_list[] = {
+    OFFSET_XNINPUTSTYLE,
+    OFFSET_XNCLIENTWINDOW,
+    OFFSET_XNFOCUSWINDOW,
+    OFFSET_XNRESOURCENAME,
+    OFFSET_XNRESOURCECLASS,
+    OFFSET_XNGEOMETRYCALLBACK,
+    OFFSET_XNFILTEREVENTS,
+    OFFSET_XNDESTROYCALLBACK,
+    OFFSET_XNSTRINGCONVERSIONCALLBACK,
+    OFFSET_XNSTRINGCONVERSIONCALLBACK,
+    OFFSET_XNRESETSTATE,
+    OFFSET_XNHOTKEY,
+    OFFSET_XNHOTKEYSTATE,
+    OFFSET_XNPREEDITATTRIBUTES,
+    OFFSET_XNSTATUSATTRIBUTES,
+    OFFSET_XNAREA,
+    OFFSET_XNAREANEEDED,
+    OFFSET_XNSPOTLOCATION,
+    OFFSET_XNCOLORMAP,
+    OFFSET_XNSTDCOLORMAP,
+    OFFSET_XNFOREGROUND,
+    OFFSET_XNBACKGROUND,
+    OFFSET_XNBACKGROUNDPIXMAP,
+    OFFSET_XNFONTSET,
+    OFFSET_XNLINESPACE,
+    OFFSET_XNCURSOR,
+    OFFSET_XNPREEDITSTARTCALLBACK,
+    OFFSET_XNPREEDITDONECALLBACK,
+    OFFSET_XNPREEDITDRAWCALLBACK,
+    OFFSET_XNPREEDITCARETCALLBACK,
+    OFFSET_XNSTATUSSTARTCALLBACK,
+    OFFSET_XNSTATUSDONECALLBACK,
+    OFFSET_XNSTATUSDRAWCALLBACK,
+    OFFSET_XNPREEDITSTATE,
+    OFFSET_XNPREEDITSTATENOTIFYCALLBACK
+};
+
+static XIMStyle const supported_local_styles[] = {
+    XIMPreeditNone     | XIMStatusNone,
+    XIMPreeditNothing  | XIMStatusNothing,
+    0                                          /* dummy */
+};
+
+Private  Bool
+_XimDefaultStyles(
+    XimValueOffsetInfo   info,
+    XPointer             top,
+    XPointer             parm,                 /* unused */
+    unsigned long        mode)                 /* unused */
+{
+    XIMStyles           *styles;
+    XIMStyles          **out;
+    register int         i;
+    unsigned int         n;
+    int                          len;
+    XPointer             tmp;
+
+    n = XIMNumber(supported_local_styles) - 1;
+    len = sizeof(XIMStyles) + sizeof(XIMStyle) * n;
+    if(!(tmp = Xcalloc(1, len))) {
+       return False;
+    }
+
+    styles = (XIMStyles *)tmp;
+    if (n > 0) {
+       styles->count_styles = (unsigned short)n;
+       styles->supported_styles =
+                               (XIMStyle *)((char *)tmp + sizeof(XIMStyles));
+       for(i = 0; i < n; i++) {
+           styles->supported_styles[i] = supported_local_styles[i];
+       }
+    }
+
+    out = (XIMStyles **)((char *)top + info->offset);
+    *out = styles;
+    return True;
+}
+
+Private  Bool
+_XimDefaultIMValues(
+    XimValueOffsetInfo   info,
+    XPointer             top,
+    XPointer             parm,                 /* unused */
+    unsigned long        mode)                 /* unused */
+{
+    XIMValuesList       *values_list;
+    XIMValuesList      **out;
+    register int         i;
+    unsigned int         n;
+    int                          len;
+    XPointer             tmp;
+
+    n = XIMNumber(supported_local_im_values_list);
+    len = sizeof(XIMValuesList) + sizeof(char **) * n;
+    if(!(tmp = Xcalloc(1, len))) {
+       return False;
+    }
+
+    values_list = (XIMValuesList *)tmp;
+    if (n > 0) {
+       values_list->count_values = (unsigned short)n;
+       values_list->supported_values
+                        = (char **)((char *)tmp + sizeof(XIMValuesList));
+       for(i = 0; i < n; i++) {
+           values_list->supported_values[i] =
+               (char *)name_table + supported_local_im_values_list[i];
+       }
+    }
+
+    out = (XIMValuesList **)((char *)top + info->offset);
+    *out = values_list;
+    return True;
+}
+
+Private  Bool
+_XimDefaultICValues(
+    XimValueOffsetInfo   info,
+    XPointer             top,
+    XPointer             parm,                 /* unused */
+    unsigned long        mode)                 /* unused */
+{
+    XIMValuesList       *values_list;
+    XIMValuesList      **out;
+    register int         i;
+    unsigned int         n;
+    int                          len;
+    XPointer             tmp;
+
+    n = XIMNumber(supported_local_ic_values_list);
+    len = sizeof(XIMValuesList) + sizeof(char **) * n;
+    if(!(tmp = Xcalloc(1, len))) {
+       return False;
+    }
+
+    values_list = (XIMValuesList *)tmp;
+    if (n > 0) {
+       values_list->count_values = (unsigned short)n;
+       values_list->supported_values
+                        = (char **)((char *)tmp + sizeof(XIMValuesList));
+       for(i = 0; i < n; i++) {
+           values_list->supported_values[i] =
+               (char *)name_table + supported_local_ic_values_list[i];
+       }
+    }
+
+    out = (XIMValuesList **)((char *)top + info->offset);
+    *out = values_list;
+    return True;
+}
+
+Private  Bool
+_XimDefaultVisiblePos(
+    XimValueOffsetInfo   info,
+    XPointer             top,
+    XPointer             parm,                 /* unused */
+    unsigned long        mode)                 /* unused */
+{
+    Bool               *out;
+
+    out = (Bool *)((char *)top + info->offset);
+    *out = False;
+    return True;
+}
+
+Private  Bool
+_XimDefaultFocusWindow(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            parm,
+    unsigned long       mode)
+{
+    Xic                         ic = (Xic)parm;
+    Window             *out;
+
+    if(ic->core.client_window == (Window)NULL) {
+       return True;
+    }
+
+    out = (Window *)((char *)top + info->offset);
+    *out = ic->core.client_window;
+    return True;
+}
+
+Private  Bool
+_XimDefaultResName(
+    XimValueOffsetInfo   info,
+    XPointer             top,
+    XPointer             parm,
+    unsigned long        mode)
+{
+    Xic                          ic = (Xic)parm;
+    Xim                          im = (Xim)ic->core.im;
+    char               **out;
+
+    if(im->core.res_name == (char *)NULL) {
+       return True;
+    }
+
+    out = (char **)((char *)top + info->offset);
+    *out = im->core.res_name;
+    return True;
+}
+
+Private  Bool
+_XimDefaultResClass(
+    XimValueOffsetInfo    info,
+    XPointer              top,
+    XPointer              parm,
+    unsigned long         mode)
+{
+    Xic                          ic = (Xic)parm;
+    Xim                          im = (Xim)ic->core.im;
+    char               **out;
+
+    if(im->core.res_class == (char *)NULL) {
+       return True;
+    }
+
+    out = (char **)((char *)top + info->offset);
+    *out = im->core.res_class;
+    return True;
+}
+
+Private  Bool
+_XimDefaultDestroyCB(
+    XimValueOffsetInfo   info,
+    XPointer             top,
+    XPointer             parm,
+    unsigned long        mode)
+{
+    Xic                         ic = (Xic)parm;
+    Xim                         im = (Xim)ic->core.im;
+    XIMCallback                *out;
+
+    out = (XIMCallback *)((char *)top + info->offset);
+    *out = im->core.destroy_callback;
+    return True;
+}
+
+Private  Bool
+_XimDefaultResetState(
+    XimValueOffsetInfo   info,
+    XPointer             top,
+    XPointer             parm,
+    unsigned long        mode)
+{
+    XIMResetState      *out;
+
+    out = (XIMResetState *)((char *)top + info->offset);
+    *out = XIMInitialState;
+    return True;
+}
+
+Private  Bool
+_XimDefaultHotKeyState(
+    XimValueOffsetInfo   info,
+    XPointer             top,
+    XPointer             parm,
+    unsigned long        mode)
+{
+    XIMHotKeyState     *out;
+
+    out = (XIMHotKeyState *)((char *)top + info->offset);
+    *out = XIMHotKeyStateOFF;
+    return True;
+}
+
+Private  Bool
+_XimDefaultArea(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            parm,
+    unsigned long       mode)
+{
+    Xic                         ic = (Xic)parm;
+    Xim                         im = (Xim)ic->core.im;
+    Window              root_return;
+    int                         x_return, y_return;
+    unsigned int        width_return, height_return;
+    unsigned int        border_width_return;
+    unsigned int        depth_return;
+    XRectangle          area;
+    XRectangle         *out;
+
+    if(ic->core.focus_window == (Window)NULL) {
+       return True;
+    }
+    if(XGetGeometry(im->core.display, (Drawable)ic->core.focus_window,
+               &root_return, &x_return, &y_return, &width_return,
+               &height_return, &border_width_return, &depth_return)
+               == (Status)Success) {
+       return True;
+    }
+    area.x     = 0;
+    area.y     = 0;
+    area.width = width_return;
+    area.height        = height_return;
+
+    out = (XRectangle *)((char *)top + info->offset);
+    *out = area;
+    return True;
+}
+
+Private  Bool
+_XimDefaultColormap(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            parm,
+    unsigned long       mode)
+{
+    Xic                         ic = (Xic)parm;
+    Xim                         im = (Xim)ic->core.im;
+    XWindowAttributes   win_attr;
+    Colormap           *out;
+
+    if(ic->core.client_window == (Window)NULL) {
+       return True;
+    }
+    if(XGetWindowAttributes(im->core.display, ic->core.client_window,
+                                       &win_attr) == (Status)Success) {
+       return True;
+    }
+
+    out = (Colormap *)((char *)top + info->offset);
+    *out = win_attr.colormap;
+    return True;
+}
+
+Private  Bool
+_XimDefaultStdColormap(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            parm,
+    unsigned long       mode)
+{
+    Atom               *out;
+
+    out = (Atom *)((char *)top + info->offset);
+    *out = (Atom)0;
+    return True;
+}
+
+Private  Bool
+_XimDefaultFg(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            parm,
+    unsigned long       mode)
+{
+    Xic                         ic = (Xic)parm;
+    Xim                         im = (Xim)ic->core.im;
+    unsigned long       fg;
+    unsigned long      *out;
+
+    fg = WhitePixel(im->core.display, DefaultScreen(im->core.display));
+    out = (unsigned long *)((char *)top + info->offset);
+    *out = fg;
+    return True;
+}
+
+Private  Bool
+_XimDefaultBg(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            parm,
+    unsigned long       mode)
+{
+    Xic                         ic = (Xic)parm;
+    Xim                         im = (Xim)ic->core.im;
+    unsigned long       bg;
+    unsigned long      *out;
+
+    bg = BlackPixel(im->core.display, DefaultScreen(im->core.display));
+    out = (unsigned long *)((char *)top + info->offset);
+    *out = bg;
+    return True;
+}
+
+Private  Bool
+_XimDefaultBgPixmap(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            parm,
+    unsigned long       mode)
+{
+    Pixmap             *out;
+
+    out = (Pixmap *)((char *)top + info->offset);
+    *out = (Pixmap)0;
+    return True;
+}
+
+Private  Bool
+_XimDefaultFontSet(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            parm,
+    unsigned long       mode)
+{
+    XFontSet           *out;
+
+    out = (XFontSet *)((char *)top + info->offset);
+    *out = 0;
+    return True;
+}
+
+Private  Bool
+_XimDefaultLineSpace(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            parm,
+    unsigned long       mode)
+{
+    Xic                         ic = (Xic)parm;
+    XFontSet            fontset;
+    XFontSetExtents    *fset_extents;
+    int                         line_space = 0;
+    int                        *out;
+
+    if(mode & XIM_PREEDIT_ATTR) {
+       fontset = ic->core.preedit_attr.fontset;
+    } else if(mode & XIM_STATUS_ATTR) {
+       fontset = ic->core.status_attr.fontset;
+    } else {
+       return True;
+    }
+    if (fontset) {
+       fset_extents = XExtentsOfFontSet(fontset);
+       line_space = fset_extents->max_logical_extent.height;
+    }
+    out = (int *)((char *)top + info->offset);
+    *out = line_space;
+    return True;
+}
+
+Private  Bool
+_XimDefaultCursor(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            parm,
+    unsigned long       mode)
+{
+    Cursor             *out;
+
+    out = (Cursor *)((char *)top + info->offset);
+    *out = (Cursor)0;
+    return True;
+}
+
+Private  Bool
+_XimDefaultPreeditState(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            parm,
+    unsigned long       mode)
+{
+    XIMPreeditState    *out;
+
+    out = (XIMPreeditState *)((char *)top + info->offset);
+    *out = XIMPreeditDisable;
+    return True;
+}
+
+Private  Bool
+_XimDefaultNest(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            parm,
+    unsigned long       mode)
+{
+    return True;
+}
+
+Private  Bool
+_XimEncodeCallback(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    XIMCallback                *out;
+
+    out = (XIMCallback *)((char *)top + info->offset);
+    *out = *((XIMCallback *)val);
+    return True;
+}
+
+Private  Bool
+_XimEncodeString(
+    XimValueOffsetInfo   info,
+    XPointer             top,
+    XPointer             val)
+{
+    char                *string;
+    char               **out;
+
+    if(val == (XPointer)NULL) {
+       return False;
+    }
+    if (!(string = strdup((char *)val))) {
+       return False;
+    }
+
+    out = (char **)((char *)top + info->offset);
+    if(*out) {
+       Xfree(*out);
+    }
+    *out = string;
+    return True;
+}
+
+Private  Bool
+_XimEncodeStyle(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    XIMStyle           *out;
+
+    out = (XIMStyle *)((char *)top + info->offset);
+    *out = (XIMStyle)val;
+    return True;
+}
+
+Private  Bool
+_XimEncodeWindow(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    Window             *out;
+
+    out = (Window *)((char *)top + info->offset);
+    *out = (Window)val;
+    return True;
+}
+
+Private  Bool
+_XimEncodeStringConv(
+    XimValueOffsetInfo          info,
+    XPointer                    top,
+    XPointer                    val)
+{
+    /*
+     * Not yet
+     */
+    return True;
+}
+
+Private  Bool
+_XimEncodeResetState(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    XIMResetState      *out;
+
+    out = (XIMResetState *)((char *)top + info->offset);
+    *out = (XIMResetState)val;
+    return True;
+}
+
+Private  Bool
+_XimEncodeHotKey(
+    XimValueOffsetInfo   info,
+    XPointer             top,
+    XPointer             val)
+{
+    XIMHotKeyTriggers   *hotkey = (XIMHotKeyTriggers *)val;
+    XIMHotKeyTriggers  **out;
+    XIMHotKeyTriggers   *key_list;
+    XIMHotKeyTrigger    *key;
+    XPointer             tmp;
+    int                          num;
+    int                          len;
+    register int         i;
+
+    if(hotkey == (XIMHotKeyTriggers *)NULL) {
+       return True;
+    }
+
+    if((num = hotkey->num_hot_key) == 0) {
+       return True;
+    }
+
+    len = sizeof(XIMHotKeyTriggers) + sizeof(XIMHotKeyTrigger) * num;
+    if(!(tmp = (XPointer)Xmalloc(len))) {
+       return False;
+    }
+
+    key_list = (XIMHotKeyTriggers *)tmp;
+    key = (XIMHotKeyTrigger *)((char *)tmp + sizeof(XIMHotKeyTriggers));
+
+    for(i = 0; i < num; i++) {
+       key[i] = hotkey->key[i];
+    }
+
+    key_list->num_hot_key = num;
+    key_list->key = key;
+
+    out = (XIMHotKeyTriggers **)((char *)top + info->offset);
+    *out = key_list;
+    return True;
+}
+
+Private  Bool
+_XimEncodeHotKetState(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    XIMHotKeyState     *out;
+
+    out = (XIMHotKeyState *)((char *)top + info->offset);
+    *out = (XIMHotKeyState)val;
+    return True;
+}
+
+Private  Bool
+_XimEncodeRectangle(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    XRectangle         *out;
+
+    out = (XRectangle *)((char *)top + info->offset);
+    *out = *((XRectangle *)val);
+    return True;
+}
+
+Private  Bool
+_XimEncodeSpot(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    XPoint             *out;
+
+    out = (XPoint *)((char *)top + info->offset);
+    *out = *((XPoint *)val);
+    return True;
+}
+
+Private  Bool
+_XimEncodeColormap(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    Colormap           *out;
+
+    out = (Colormap *)((char *)top + info->offset);
+    *out = (Colormap)val;
+    return True;
+}
+
+Private  Bool
+_XimEncodeStdColormap(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    Atom               *out;
+
+    out = (Atom *)((char *)top + info->offset);
+    *out = (Atom)val;
+    return True;
+}
+
+Private  Bool
+_XimEncodeLong(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    unsigned long      *out;
+
+    out = (unsigned long *)((char *)top + info->offset);
+    *out = (unsigned long)val;
+    return True;
+}
+
+Private  Bool
+_XimEncodeBgPixmap(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    Pixmap             *out;
+
+    out = (Pixmap *)((char *)top + info->offset);
+    *out = (Pixmap)val;
+    return True;
+}
+
+Private  Bool
+_XimEncodeFontSet(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    XFontSet           *out;
+
+    out = (XFontSet *)((char *)top + info->offset);
+    *out = (XFontSet)val;
+    return True;
+}
+
+Private  Bool
+_XimEncodeLineSpace(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    int                        *out;
+
+    out = (int *)((char *)top + info->offset);
+    *out = (long)val;
+    return True;
+}
+
+Private  Bool
+_XimEncodeCursor(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    Cursor             *out;
+
+    out = (Cursor *)((char *)top + info->offset);
+    *out = (Cursor)val;
+    return True;
+}
+
+Private  Bool
+_XimEncodePreeditState(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    XIMPreeditState    *out;
+
+    out = (XIMPreeditState *)((char *)top + info->offset);
+    *out = (XIMPreeditState)val;
+    return True;
+}
+
+Private  Bool
+_XimEncodeNest(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    return True;
+}
+
+Private  Bool
+_XimDecodeStyles(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    XIMStyles          *styles;
+    XIMStyles          *out;
+    register int        i;
+    unsigned int        num;
+    int                         len;
+    XPointer            tmp;
+
+    if(val == (XPointer)NULL) {
+       return False;
+    }
+
+    styles = *((XIMStyles **)((char *)top + info->offset));
+    num = styles->count_styles;
+
+    len = sizeof(XIMStyles) + sizeof(XIMStyle) * num;
+    if(!(tmp = Xcalloc(1, len))) {
+       return False;
+    }
+
+    out = (XIMStyles *)tmp;
+    if(num >0) {
+       out->count_styles = (unsigned short)num;
+       out->supported_styles = (XIMStyle *)((char *)tmp + sizeof(XIMStyles));
+
+       for(i = 0; i < num; i++) {
+           out->supported_styles[i] = styles->supported_styles[i];
+       }
+    }
+    *((XIMStyles **)val) = out;
+    return True;
+}
+
+Private  Bool
+_XimDecodeValues(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    XIMValuesList      *values_list;
+    XIMValuesList      *out;
+    register int        i;
+    unsigned int        num;
+    int                         len;
+    XPointer            tmp;
+
+    if(val == (XPointer)NULL) {
+       return False;
+    }
+
+    values_list = *((XIMValuesList **)((char *)top + info->offset));
+    num = values_list->count_values;
+
+    len = sizeof(XIMValuesList) + sizeof(char **) * num;
+    if(!(tmp = Xcalloc(1, len))) {
+       return False;
+    }
+
+    out = (XIMValuesList *)tmp;
+    if(num) {
+       out->count_values = (unsigned short)num;
+       out->supported_values = (char **)((char *)tmp + sizeof(XIMValuesList));
+
+       for(i = 0; i < num; i++) {
+           out->supported_values[i] = values_list->supported_values[i];
+       }
+    }
+    *((XIMValuesList **)val) = out;
+    return True;
+}
+
+Private  Bool
+_XimDecodeCallback(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    XIMCallback                *in;
+    XIMCallback                *callback;
+
+    in = (XIMCallback *)((char *)top + info->offset);
+    if(!(callback = (XIMCallback *)Xmalloc(sizeof(XIMCallback)))) {
+       return False;
+    }
+    callback->client_data = in->client_data;
+    callback->callback    = in->callback;
+
+    *((XIMCallback **)val) = callback;
+    return True;
+}
+
+Private  Bool
+_XimDecodeString(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    char               *in;
+    char               *string;
+
+    in = *((char **)((char *)top + info->offset));
+    if (in != NULL) {
+       string = strdup(in);
+    } else {
+       string = Xcalloc(1, 1); /* strdup("") */
+    }
+    if (string == NULL) {
+       return False;
+    }
+    *((char **)val) = string;
+    return True;
+}
+
+Private  Bool
+_XimDecodeBool(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    Bool               *in;
+
+    in = (Bool *)((char *)top + info->offset);
+    *((Bool *)val) = *in;
+    return True;
+}
+
+Private  Bool
+_XimDecodeStyle(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    XIMStyle           *in;
+
+    in = (XIMStyle *)((char *)top + info->offset);
+    *((XIMStyle *)val) = *in;
+    return True;
+}
+
+Private  Bool
+_XimDecodeWindow(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    Window             *in;
+
+    in = (Window *)((char *)top + info->offset);
+    *((Window *)val) = *in;
+    return True;
+}
+
+Private  Bool
+_XimDecodeStringConv(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    /*
+     * Not yet
+     */
+    return True;
+}
+
+Private  Bool
+_XimDecodeResetState(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    XIMResetState      *in;
+
+    in = (XIMResetState *)((char *)top + info->offset);
+    *((XIMResetState *)val) = *in;
+    return True;
+}
+
+Private  Bool
+_XimDecodeHotKey(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    XIMHotKeyTriggers  *in;
+    XIMHotKeyTriggers  *hotkey;
+    XIMHotKeyTrigger   *key;
+    XPointer            tmp;
+    int                         num;
+    int                         len;
+    register int        i;
+
+    in = *((XIMHotKeyTriggers **)((char *)top + info->offset));
+    num = in->num_hot_key;
+    len = sizeof(XIMHotKeyTriggers) + sizeof(XIMHotKeyTrigger) * num;
+    if(!(tmp = (XPointer)Xmalloc(len))) {
+       return False;
+    }
+
+    hotkey = (XIMHotKeyTriggers *)tmp;
+    key = (XIMHotKeyTrigger *)((char *)tmp + sizeof(XIMHotKeyTriggers));
+
+    for(i = 0; i < num; i++) {
+       key[i] = in->key[i];
+    }
+    hotkey->num_hot_key = num;
+    hotkey->key = key;
+
+    *((XIMHotKeyTriggers **)val) = hotkey;
+    return True;
+}
+
+Private  Bool
+_XimDecodeHotKetState(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    XIMHotKeyState     *in;
+
+    in = (XIMHotKeyState *)((char *)top + info->offset);
+    *((XIMHotKeyState *)val) = *in;
+    return True;
+}
+
+Private  Bool
+_XimDecodeRectangle(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    XRectangle         *in;
+    XRectangle         *rect;
+
+    in = (XRectangle *)((char *)top + info->offset);
+    if(!(rect = (XRectangle *)Xmalloc(sizeof(XRectangle)))) {
+       return False;
+    }
+    *rect = *in;
+    *((XRectangle **)val) = rect;
+    return True;
+}
+
+Private  Bool
+_XimDecodeSpot(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    XPoint             *in;
+    XPoint             *spot;
+
+    in = (XPoint *)((char *)top + info->offset);
+    if(!(spot = (XPoint *)Xmalloc(sizeof(XPoint)))) {
+       return False;
+    }
+    *spot = *in;
+    *((XPoint **)val) = spot;
+    return True;
+}
+
+Private  Bool
+_XimDecodeColormap(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    Colormap           *in;
+
+    in = (Colormap *)((char *)top + info->offset);
+    *((Colormap *)val) = *in;
+    return True;
+}
+
+Private  Bool
+_XimDecodeStdColormap(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    Atom               *in;
+
+    in = (Atom *)((char *)top + info->offset);
+    *((Atom *)val) = *in;
+    return True;
+}
+
+Private  Bool
+_XimDecodeLong(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    unsigned long      *in;
+
+    in = (unsigned long *)((char *)top + info->offset);
+    *((unsigned long *)val) = *in;
+    return True;
+}
+
+Private  Bool
+_XimDecodeBgPixmap(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    Pixmap             *in;
+
+    in = (Pixmap *)((char *)top + info->offset);
+    *((Pixmap *)val) = *in;
+    return True;
+}
+
+Private  Bool
+_XimDecodeFontSet(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    XFontSet           *in;
+
+    in = (XFontSet *)((char *)top + info->offset);
+    *((XFontSet *)val) = *in;
+    return True;
+}
+
+Private  Bool
+_XimDecodeLineSpace(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    int                *in;
+
+    in = (int *)((char *)top + info->offset);
+    *((int *)val) = *in;
+    return True;
+}
+
+Private  Bool
+_XimDecodeCursor(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    Cursor             *in;
+
+    in = (Cursor *)((char *)top + info->offset);
+    *((Cursor *)val) = *in;
+    return True;
+}
+
+Private  Bool
+_XimDecodePreeditState(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    XIMPreeditState    *in;
+
+    in = (XIMPreeditState *)((char *)top + info->offset);
+    *((XIMPreeditState *)val) = *in;
+    return True;
+}
+
+Private  Bool
+_XimDecodeNest(
+    XimValueOffsetInfo  info,
+    XPointer            top,
+    XPointer            val)
+{
+    return True;
+}
+
+static XIMResource     im_resources[] = {
+    {XNQueryInputStyle,                   0, XimType_XIMStyles,        0, 0, 0},
+    {XNDestroyCallback,                   0,  0,                       0, 0, 0},
+    {XNResourceName,              0, XimType_STRING8,          0, 0, 0},
+    {XNResourceClass,             0, XimType_STRING8,          0, 0, 0},
+    {XNQueryIMValuesList,         0, 0,                        0, 0, 0},
+    {XNQueryICValuesList,         0, 0,                        0, 0, 0},
+    {XNVisiblePosition,                   0, 0,                        0, 0, 0}
+};
+
+static XIMResource     im_inner_resources[] = {
+    {XNDestroyCallback,                   0, 0,                        0, 0, 0},
+    {XNResourceName,              0, XimType_STRING8,          0, 0, 0},
+    {XNResourceClass,             0, XimType_STRING8,          0, 0, 0},
+    {XNQueryIMValuesList,         0, 0,                        0, 0, 0},
+    {XNQueryICValuesList,         0, 0,                        0, 0, 0},
+    {XNVisiblePosition,                   0, 0,                        0, 0, 0}
+};
+
+static XIMResource     ic_resources[] = {
+    {XNInputStyle,                0, XimType_CARD32,           0, 0, 0},
+    {XNClientWindow,              0, XimType_Window,           0, 0, 0},
+    {XNFocusWindow,               0, XimType_Window,           0, 0, 0},
+    {XNResourceName,              0, XimType_STRING8,          0, 0, 0},
+    {XNResourceClass,             0, XimType_STRING8,          0, 0, 0},
+    {XNGeometryCallback,          0, 0,                        0, 0, 0},
+    {XNFilterEvents,              0, XimType_CARD32,           0, 0, 0},
+    {XNDestroyCallback,                   0, 0,                        0, 0, 0},
+    {XNStringConversionCallback,   0, 0,                       0, 0, 0},
+    {XNStringConversion,          0, XimType_XIMStringConversion,0, 0, 0},
+    {XNResetState,                0, 0,                        0, 0, 0},
+    {XNHotKey,                    0, XimType_XIMHotKeyTriggers,0, 0, 0},
+    {XNHotKeyState,               0, XimType_XIMHotKeyState,   0, 0, 0},
+    {XNPreeditAttributes,         0, XimType_NEST,             0, 0, 0},
+    {XNStatusAttributes,          0, XimType_NEST,             0, 0, 0},
+    {XNArea,                      0, XimType_XRectangle,       0, 0, 0},
+    {XNAreaNeeded,                0, XimType_XRectangle,       0, 0, 0},
+    {XNSpotLocation,              0, XimType_XPoint,           0, 0, 0},
+    {XNColormap,                  0, XimType_CARD32,           0, 0, 0},
+    {XNStdColormap,               0, XimType_CARD32,           0, 0, 0},
+    {XNForeground,                0, XimType_CARD32,           0, 0, 0},
+    {XNBackground,                0, XimType_CARD32,           0, 0, 0},
+    {XNBackgroundPixmap,          0, XimType_CARD32,           0, 0, 0},
+    {XNFontSet,                           0, XimType_XFontSet,         0, 0, 0},
+    {XNLineSpace,                 0, XimType_CARD32,           0, 0, 0},
+    {XNCursor,                    0, XimType_CARD32,           0, 0, 0},
+    {XNPreeditStartCallback,      0, 0,                        0, 0, 0},
+    {XNPreeditDoneCallback,       0, 0,                        0, 0, 0},
+    {XNPreeditDrawCallback,       0, 0,                        0, 0, 0},
+    {XNPreeditCaretCallback,      0, 0,                        0, 0, 0},
+    {XNStatusStartCallback,       0, 0,                        0, 0, 0},
+    {XNStatusDoneCallback,        0, 0,                        0, 0, 0},
+    {XNStatusDrawCallback,        0, 0,                        0, 0, 0},
+    {XNPreeditState,              0, 0,                        0, 0, 0},
+    {XNPreeditStateNotifyCallback, 0, 0,                       0, 0, 0},
+};
+
+static XIMResource     ic_inner_resources[] = {
+    {XNResourceName,              0, XimType_STRING8,          0, 0, 0},
+    {XNResourceClass,             0, XimType_STRING8,          0, 0, 0},
+    {XNGeometryCallback,          0, 0,                        0, 0, 0},
+    {XNDestroyCallback,                   0, 0,                        0, 0, 0},
+    {XNStringConversionCallback,   0, 0,                       0, 0, 0},
+    {XNPreeditStartCallback,      0, 0,                        0, 0, 0},
+    {XNPreeditDoneCallback,       0, 0,                        0, 0, 0},
+    {XNPreeditDrawCallback,       0, 0,                        0, 0, 0},
+    {XNPreeditCaretCallback,      0, 0,                        0, 0, 0},
+    {XNStatusStartCallback,       0, 0,                        0, 0, 0},
+    {XNStatusDoneCallback,        0, 0,                        0, 0, 0},
+    {XNStatusDrawCallback,        0, 0,                        0, 0, 0},
+    {XNPreeditStateNotifyCallback, 0, 0,                       0, 0, 0},
+};
+
+static XimValueOffsetInfoRec im_attr_info[] = {
+    {OFFSET_XNQUERYINPUTSTYLE,          0,
+       XOffsetOf(XimDefIMValues, styles),
+       _XimDefaultStyles,       NULL,                  _XimDecodeStyles},
+
+    {OFFSET_XNDESTROYCALLBACK,          0,
+       XOffsetOf(XimDefIMValues, destroy_callback),
+       NULL,                    _XimEncodeCallback,    _XimDecodeCallback},
+
+    {OFFSET_XNRESOURCENAME,             0,
+       XOffsetOf(XimDefIMValues, res_name),
+       NULL,                    _XimEncodeString,      _XimDecodeString},
+
+    {OFFSET_XNRESOURCECLASS,            0,
+       XOffsetOf(XimDefIMValues, res_class),
+       NULL,                    _XimEncodeString,      _XimDecodeString},
+
+    {OFFSET_XNQUERYIMVALUESLIST,                0,
+       XOffsetOf(XimDefIMValues, im_values_list),
+       _XimDefaultIMValues,     NULL,                  _XimDecodeValues},
+
+    {OFFSET_XNQUERYICVALUESLIST,                0,
+       XOffsetOf(XimDefIMValues, ic_values_list),
+       _XimDefaultICValues,     NULL,                  _XimDecodeValues},
+
+    {OFFSET_XNVISIBLEPOSITION,                  0,
+       XOffsetOf(XimDefIMValues, visible_position),
+       _XimDefaultVisiblePos,   NULL,                  _XimDecodeBool}
+};
+
+static XimValueOffsetInfoRec ic_attr_info[] = {
+    {OFFSET_XNINPUTSTYLE,               0,
+       XOffsetOf(XimDefICValues, input_style),
+       NULL,                    _XimEncodeStyle,       _XimDecodeStyle},
+
+    {OFFSET_XNCLIENTWINDOW,             0,
+       XOffsetOf(XimDefICValues, client_window),
+       NULL,                    _XimEncodeWindow,      _XimDecodeWindow},
+
+    {OFFSET_XNFOCUSWINDOW,              0,
+       XOffsetOf(XimDefICValues, focus_window),
+       _XimDefaultFocusWindow,  _XimEncodeWindow,      _XimDecodeWindow},
+
+    {OFFSET_XNRESOURCENAME,             0,
+       XOffsetOf(XimDefICValues, res_name),
+       _XimDefaultResName,      _XimEncodeString,      _XimDecodeString},
+
+    {OFFSET_XNRESOURCECLASS,            0,
+       XOffsetOf(XimDefICValues, res_class),
+       _XimDefaultResClass,     _XimEncodeString,      _XimDecodeString},
+
+    {OFFSET_XNGEOMETRYCALLBACK,         0,
+       XOffsetOf(XimDefICValues, geometry_callback),
+       NULL,                    _XimEncodeCallback,    _XimDecodeCallback},
+
+    {OFFSET_XNFILTEREVENTS,             0,
+       XOffsetOf(XimDefICValues, filter_events),
+       NULL,                    NULL,                  _XimDecodeLong},
+
+    {OFFSET_XNDESTROYCALLBACK,          0,
+       XOffsetOf(XimDefICValues, destroy_callback),
+       _XimDefaultDestroyCB,    _XimEncodeCallback,    _XimDecodeCallback},
+
+    {OFFSET_XNSTRINGCONVERSIONCALLBACK, 0,
+       XOffsetOf(XimDefICValues, string_conversion_callback),
+       NULL,                    _XimEncodeCallback,    _XimDecodeCallback},
+
+    {OFFSET_XNSTRINGCONVERSION,         0,
+       XOffsetOf(XimDefICValues, string_conversion),
+       NULL,                    _XimEncodeStringConv,  _XimDecodeStringConv},
+
+    {OFFSET_XNRESETSTATE,               0,
+       XOffsetOf(XimDefICValues, reset_state),
+       _XimDefaultResetState,   _XimEncodeResetState,  _XimDecodeResetState},
+
+    {OFFSET_XNHOTKEY,                   0,
+       XOffsetOf(XimDefICValues, hotkey),
+       NULL,                    _XimEncodeHotKey,      _XimDecodeHotKey},
+
+    {OFFSET_XNHOTKEYSTATE,              0,
+       XOffsetOf(XimDefICValues, hotkey_state),
+       _XimDefaultHotKeyState,  _XimEncodeHotKetState, _XimDecodeHotKetState},
+
+    {OFFSET_XNPREEDITATTRIBUTES,        0,
+       XOffsetOf(XimDefICValues, preedit_attr),
+       _XimDefaultNest,         _XimEncodeNest,        _XimDecodeNest},
+
+    {OFFSET_XNSTATUSATTRIBUTES,         0,
+       XOffsetOf(XimDefICValues, status_attr),
+       _XimDefaultNest,         _XimEncodeNest,        _XimDecodeNest},
+};
+
+static XimValueOffsetInfoRec ic_pre_attr_info[] = {
+    {OFFSET_XNAREA,                     0,
+       XOffsetOf(ICPreeditAttributes, area),
+       _XimDefaultArea,         _XimEncodeRectangle,   _XimDecodeRectangle},
+
+    {OFFSET_XNAREANEEDED,               0,
+       XOffsetOf(ICPreeditAttributes, area_needed),
+       NULL,                    _XimEncodeRectangle,   _XimDecodeRectangle},
+
+    {OFFSET_XNSPOTLOCATION,             0,
+       XOffsetOf(ICPreeditAttributes, spot_location),
+       NULL,                    _XimEncodeSpot,        _XimDecodeSpot},
+
+    {OFFSET_XNCOLORMAP,                 0,
+       XOffsetOf(ICPreeditAttributes, colormap),
+       _XimDefaultColormap,     _XimEncodeColormap,    _XimDecodeColormap},
+
+    {OFFSET_XNSTDCOLORMAP,              0,
+       XOffsetOf(ICPreeditAttributes, std_colormap),
+       _XimDefaultStdColormap,  _XimEncodeStdColormap, _XimDecodeStdColormap},
+
+    {OFFSET_XNFOREGROUND,               0,
+       XOffsetOf(ICPreeditAttributes, foreground),
+       _XimDefaultFg,           _XimEncodeLong,        _XimDecodeLong},
+
+    {OFFSET_XNBACKGROUND,               0,
+       XOffsetOf(ICPreeditAttributes, background),
+       _XimDefaultBg,           _XimEncodeLong,        _XimDecodeLong},
+
+    {OFFSET_XNBACKGROUNDPIXMAP,         0,
+       XOffsetOf(ICPreeditAttributes, background_pixmap),
+       _XimDefaultBgPixmap,     _XimEncodeBgPixmap,    _XimDecodeBgPixmap},
+
+    {OFFSET_XNFONTSET,                  0,
+       XOffsetOf(ICPreeditAttributes, fontset),
+       _XimDefaultFontSet,      _XimEncodeFontSet,     _XimDecodeFontSet},
+
+    {OFFSET_XNLINESPACE,                0,
+       XOffsetOf(ICPreeditAttributes, line_spacing),
+       _XimDefaultLineSpace,    _XimEncodeLineSpace,   _XimDecodeLineSpace},
+
+    {OFFSET_XNCURSOR,                   0,
+       XOffsetOf(ICPreeditAttributes, cursor),
+       _XimDefaultCursor,       _XimEncodeCursor,      _XimDecodeCursor},
+
+    {OFFSET_XNPREEDITSTARTCALLBACK,     0,
+       XOffsetOf(ICPreeditAttributes, start_callback),
+       NULL,                    _XimEncodeCallback,    _XimDecodeCallback},
+
+    {OFFSET_XNPREEDITDONECALLBACK,      0,
+       XOffsetOf(ICPreeditAttributes, done_callback),
+       NULL,                    _XimEncodeCallback,    _XimDecodeCallback},
+
+    {OFFSET_XNPREEDITDRAWCALLBACK,      0,
+       XOffsetOf(ICPreeditAttributes, draw_callback),
+       NULL,                    _XimEncodeCallback,    _XimDecodeCallback},
+
+    {OFFSET_XNPREEDITCARETCALLBACK,     0,
+       XOffsetOf(ICPreeditAttributes, caret_callback),
+       NULL,                    _XimEncodeCallback,    _XimDecodeCallback},
+
+    {OFFSET_XNPREEDITSTATE,             0,
+       XOffsetOf(ICPreeditAttributes, preedit_state),
+       _XimDefaultPreeditState, _XimEncodePreeditState,_XimDecodePreeditState},
+
+    {OFFSET_XNPREEDITSTATENOTIFYCALLBACK, 0,
+       XOffsetOf(ICPreeditAttributes, state_notify_callback),
+       NULL,                    _XimEncodeCallback,    _XimDecodeCallback},
+};
+
+static XimValueOffsetInfoRec ic_sts_attr_info[] = {
+    {OFFSET_XNAREA,                     0,
+       XOffsetOf(ICStatusAttributes, area),
+       _XimDefaultArea,         _XimEncodeRectangle,   _XimDecodeRectangle},
+
+    {OFFSET_XNAREANEEDED,               0,
+       XOffsetOf(ICStatusAttributes, area_needed),
+       NULL,                    _XimEncodeRectangle,   _XimDecodeRectangle},
+
+    {OFFSET_XNCOLORMAP,                 0,
+       XOffsetOf(ICStatusAttributes, colormap),
+       _XimDefaultColormap,     _XimEncodeColormap,    _XimDecodeColormap},
+
+    {OFFSET_XNSTDCOLORMAP,              0,
+       XOffsetOf(ICStatusAttributes, std_colormap),
+       _XimDefaultStdColormap,  _XimEncodeStdColormap, _XimDecodeStdColormap},
+
+    {OFFSET_XNFOREGROUND,               0,
+       XOffsetOf(ICStatusAttributes, foreground),
+       _XimDefaultFg,           _XimEncodeLong,        _XimDecodeLong},
+
+    {OFFSET_XNBACKGROUND,               0,
+       XOffsetOf(ICStatusAttributes, background),
+       _XimDefaultBg,           _XimEncodeLong,        _XimDecodeLong},
+
+    {OFFSET_XNBACKGROUNDPIXMAP,         0,
+       XOffsetOf(ICStatusAttributes, background_pixmap),
+       _XimDefaultBgPixmap,     _XimEncodeBgPixmap,    _XimDecodeBgPixmap},
+
+    {OFFSET_XNFONTSET,                  0,
+       XOffsetOf(ICStatusAttributes, fontset),
+       _XimDefaultFontSet,      _XimEncodeFontSet,     _XimDecodeFontSet},
+
+    {OFFSET_XNLINESPACE,                0,
+       XOffsetOf(ICStatusAttributes, line_spacing),
+       _XimDefaultLineSpace,    _XimEncodeLineSpace,   _XimDecodeLineSpace},
+
+    {OFFSET_XNCURSOR,                   0,
+       XOffsetOf(ICStatusAttributes, cursor),
+       _XimDefaultCursor,       _XimEncodeCursor,      _XimDecodeCursor},
+
+    {OFFSET_XNSTATUSSTARTCALLBACK,      0,
+       XOffsetOf(ICStatusAttributes, start_callback),
+       NULL,                    _XimEncodeCallback,    _XimDecodeCallback},
+
+    {OFFSET_XNSTATUSDONECALLBACK,       0,
+       XOffsetOf(ICStatusAttributes, done_callback),
+       NULL,                    _XimEncodeCallback,    _XimDecodeCallback},
+
+    {OFFSET_XNSTATUSDRAWCALLBACK,       0,
+       XOffsetOf(ICStatusAttributes, draw_callback),
+       NULL,                    _XimEncodeCallback,    _XimDecodeCallback}
+};
+
+typedef struct _XimIMMode {
+    unsigned short name_offset;
+    unsigned short      mode;
+} XimIMMode;
+
+static const XimIMMode im_mode[] = {
+    {OFFSET_XNQUERYINPUTSTYLE,
+               (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_GET)},
+    {OFFSET_XNDESTROYCALLBACK,
+               (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_SET | XIM_MODE_IM_GET)},
+    {OFFSET_XNRESOURCENAME,
+               (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_SET | XIM_MODE_IM_GET)},
+    {OFFSET_XNRESOURCECLASS,
+               (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_SET | XIM_MODE_IM_GET)},
+    {OFFSET_XNQUERYIMVALUESLIST,
+               (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_GET)},
+    {OFFSET_XNQUERYICVALUESLIST,
+               (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_GET)},
+    {OFFSET_XNVISIBLEPOSITION,
+               (XIM_MODE_IM_DEFAULT | XIM_MODE_IM_GET)}
+};
+
+typedef struct _XimICMode {
+    unsigned short name_offset;
+    unsigned short      preedit_callback_mode;
+    unsigned short      preedit_position_mode;
+    unsigned short      preedit_area_mode;
+    unsigned short      preedit_nothing_mode;
+    unsigned short      preedit_none_mode;
+    unsigned short      status_callback_mode;
+    unsigned short      status_area_mode;
+    unsigned short      status_nothing_mode;
+    unsigned short      status_none_mode;
+} XimICMode;
+
+static const XimICMode ic_mode[] = {
+    {OFFSET_XNINPUTSTYLE,
+               (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_GET),
+               (XIM_MODE_STS_CREATE | XIM_MODE_STS_GET),
+               (XIM_MODE_STS_CREATE | XIM_MODE_STS_GET),
+               (XIM_MODE_STS_CREATE | XIM_MODE_STS_GET),
+               (XIM_MODE_STS_CREATE | XIM_MODE_STS_GET)},
+    {OFFSET_XNCLIENTWINDOW,
+               (XIM_MODE_PRE_ONCE | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_ONCE | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_ONCE | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_ONCE | XIM_MODE_PRE_GET),
+               0,
+               (XIM_MODE_STS_ONCE | XIM_MODE_STS_GET),
+               (XIM_MODE_STS_ONCE | XIM_MODE_STS_GET),
+               (XIM_MODE_STS_ONCE | XIM_MODE_STS_GET),
+               0},
+    {OFFSET_XNFOCUSWINDOW,
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               0,
+               (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               0},
+    {OFFSET_XNRESOURCENAME,
+               0,
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               0,
+               0,
+               (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               0},
+    {OFFSET_XNRESOURCECLASS,
+               0,
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               0,
+               0,
+               (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               0},
+    {OFFSET_XNGEOMETRYCALLBACK,
+               0,
+               0,
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               0,
+               0,
+               0,
+               (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               0,
+               0},
+    {OFFSET_XNFILTEREVENTS,
+               XIM_MODE_PRE_GET,
+               XIM_MODE_PRE_GET,
+               XIM_MODE_PRE_GET,
+               XIM_MODE_PRE_GET,
+               0,
+               XIM_MODE_STS_GET,
+               XIM_MODE_STS_GET,
+               XIM_MODE_STS_GET,
+               XIM_MODE_STS_GET},
+    {OFFSET_XNDESTROYCALLBACK,
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               0,
+               0,
+               0,
+               0},
+    {OFFSET_XNSTRINGCONVERSIONCALLBACK,
+               (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               0,
+               0,
+               0,
+               0},
+    {OFFSET_XNSTRINGCONVERSION,
+               XIM_MODE_PRE_SET,
+               XIM_MODE_PRE_SET,
+               XIM_MODE_PRE_SET,
+               XIM_MODE_PRE_SET,
+               XIM_MODE_PRE_SET,
+               0,
+               0,
+               0,
+               0},
+    {OFFSET_XNRESETSTATE,
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               0,
+               0,
+               0,
+               0,
+               0},
+    {OFFSET_XNHOTKEY,
+               (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               0,
+               0,
+               0,
+               0,
+               0},
+    {OFFSET_XNHOTKEYSTATE,
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               0,
+               0,
+               0,
+               0,
+               0},
+    {OFFSET_XNPREEDITATTRIBUTES,
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               0,
+               0,
+               0,
+               0,
+               0},
+    {OFFSET_XNSTATUSATTRIBUTES,
+               0,
+               0,
+               0,
+               0,
+               0,
+               (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               0},
+    {OFFSET_XNAREA,
+               0,
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               0,
+               0,
+               0,
+               (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               0,
+               0},
+    {OFFSET_XNAREANEEDED,
+               0,
+               0,
+               (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               0,
+               0,
+               0,
+               (XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               0,
+               0},
+    {OFFSET_XNSPOTLOCATION,
+               0, /*(XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),*/
+               (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               0,
+               (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               0,
+               0,
+               0,
+               0},
+    {OFFSET_XNCOLORMAP,
+               0,
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               0,
+               0,
+               (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               0},
+    {OFFSET_XNSTDCOLORMAP,
+               0,
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               0,
+               0,
+               (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               0},
+    {OFFSET_XNFOREGROUND,
+               0,
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               0,
+               0,
+               (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               0},
+    {OFFSET_XNBACKGROUND,
+               0,
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               0,
+               0,
+               (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               0},
+    {OFFSET_XNBACKGROUNDPIXMAP,
+               0,
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               0,
+               0,
+               (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               0},
+    {OFFSET_XNFONTSET,
+               0,
+               (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               0,
+               0,
+               (XIM_MODE_STS_CREATE | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               0},
+    {OFFSET_XNLINESPACE,
+               0,
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               0,
+               0,
+               (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               0},
+    {OFFSET_XNCURSOR,
+               0,
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               0,
+               0,
+               (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               (XIM_MODE_STS_DEFAULT | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               0},
+    {OFFSET_XNPREEDITSTARTCALLBACK,
+               (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               0,
+               0,
+               0,
+               0,
+               0,
+               0,
+               0,
+               0},
+    {OFFSET_XNPREEDITDONECALLBACK,
+               (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               0,
+               0,
+               0,
+               0,
+               0,
+               0,
+               0,
+               0},
+    {OFFSET_XNPREEDITDRAWCALLBACK,
+               (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               0,
+               0,
+               0,
+               0,
+               0,
+               0,
+               0,
+               0},
+    {OFFSET_XNPREEDITCARETCALLBACK,
+               (XIM_MODE_PRE_CREATE | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               0,
+               0,
+               0,
+               0,
+               0,
+               0,
+               0,
+               0},
+    {OFFSET_XNPREEDITSTATE,
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_DEFAULT | XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               0,
+               0,
+               0,
+               0,
+               0},
+    {OFFSET_XNPREEDITSTATENOTIFYCALLBACK,
+               (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               (XIM_MODE_PRE_SET | XIM_MODE_PRE_GET),
+               0,
+               0,
+               0,
+               0,
+               0},
+    {OFFSET_XNSTATUSSTARTCALLBACK,
+               0,
+               0,
+               0,
+               0,
+               0,
+               (XIM_MODE_STS_CREATE | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               0,
+               0,
+               0},
+    {OFFSET_XNSTATUSDONECALLBACK,
+               0,
+               0,
+               0,
+               0,
+               0,
+               (XIM_MODE_STS_CREATE | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               0,
+               0,
+               0},
+    {OFFSET_XNSTATUSDRAWCALLBACK,
+               0,
+               0,
+               0,
+               0,
+               0,
+               (XIM_MODE_STS_CREATE | XIM_MODE_STS_SET | XIM_MODE_STS_GET),
+               0,
+               0,
+               0}
+};
+
+/* the quarks are separated from im_mode/ic_mode so those arrays
+ * can be const.
+ */
+static XrmQuark im_mode_quark[sizeof(im_mode) / sizeof(im_mode[0])];
+static XrmQuark ic_mode_quark[sizeof(ic_mode) / sizeof(ic_mode[0])];
+
+Private Bool
+_XimSetResourceList(
+    XIMResourceList     *res_list,
+    unsigned int        *list_num,
+    XIMResourceList      resource,
+    unsigned int         num_resource,
+    unsigned short       id)
+{
+    register int         i;
+    int                          len;
+    XIMResourceList      res;
+
+    len = sizeof(XIMResource) * num_resource;
+    if(!(res = Xcalloc(1, len))) {
+       return False;
+    }
+
+    for(i = 0; i < num_resource; i++, id++) {
+       res[i]    = resource[i];
+       res[i].id = id;
+    }
+
+    _XIMCompileResourceList(res, num_resource);
+    *res_list  = res;
+    *list_num  = num_resource;
+    return True;
+}
+
+Public Bool
+_XimSetIMResourceList(
+    XIMResourceList    *res_list,
+    unsigned int       *list_num)
+{
+    return _XimSetResourceList(res_list, list_num,
+                               im_resources, XIMNumber(im_resources), 100);
+}
+
+Public Bool
+_XimSetICResourceList(
+    XIMResourceList    *res_list,
+    unsigned int       *list_num)
+{
+    return _XimSetResourceList(res_list, list_num,
+                               ic_resources, XIMNumber(ic_resources), 200);
+}
+
+Public Bool
+_XimSetInnerIMResourceList(
+    XIMResourceList    *res_list,
+    unsigned int       *list_num)
+{
+    return _XimSetResourceList(res_list, list_num,
+               im_inner_resources, XIMNumber(im_inner_resources), 100);
+}
+
+Public Bool
+_XimSetInnerICResourceList(
+    XIMResourceList    *res_list,
+    unsigned int       *list_num)
+{
+    return _XimSetResourceList(res_list, list_num,
+               ic_inner_resources, XIMNumber(ic_inner_resources), 200);
+}
+
+Private XIMResourceList
+_XimGetResourceListRecByMode(
+    XIMResourceList     res_list,
+    unsigned int        list_num,
+    unsigned short      mode)
+{
+    register int        i;
+
+    for(i = 0; i < list_num; i++) {
+       if (res_list[i].mode & mode) {
+           return (XIMResourceList)&res_list[i];
+       }
+    }
+    return (XIMResourceList)NULL;
+}
+
+Public Bool
+_XimCheckCreateICValues(
+    XIMResourceList     res_list,
+    unsigned int        list_num)
+{
+    if (!_XimGetResourceListRecByMode(res_list, list_num, XIM_MODE_IC_CREATE)) {
+       return True;
+    }
+    return False;
+}
+
+Public XIMResourceList
+_XimGetResourceListRecByQuark(
+    XIMResourceList     res_list,
+    unsigned int        list_num,
+    XrmQuark            quark)
+{
+    register int        i;
+
+    for(i = 0; i < list_num; i++) {
+       if (res_list[i].xrm_name == quark) {
+           return (XIMResourceList)&res_list[i];
+       }
+    }
+    return (XIMResourceList)NULL;
+}
+
+Public XIMResourceList
+_XimGetResourceListRec(
+    XIMResourceList     res_list,
+    unsigned int        list_num,
+    const char         *name)
+{
+    XrmQuark            quark = XrmStringToQuark(name);
+
+    return _XimGetResourceListRecByQuark(res_list, list_num, quark);
+}
+
+Public char *
+_XimSetIMValueData(
+    Xim                         im,
+    XPointer            top,
+    XIMArg             *values,
+    XIMResourceList     res_list,
+    unsigned int        list_num)
+{
+    register XIMArg    *p;
+    XIMResourceList     res;
+    int                         check;
+
+    for(p = values; p->name != NULL; p++) {
+       if(!(res = _XimGetResourceListRec(res_list, list_num, p->name))) {
+           return p->name;
+       }
+       check = _XimCheckIMMode(res, XIM_SETIMVALUES);
+       if(check == XIM_CHECK_INVALID) {
+           continue;
+       } else if (check == XIM_CHECK_ERROR) {
+           return p->name;
+       }
+
+       if(!_XimEncodeLocalIMAttr(res, top, p->value)) {
+           return p->name;
+       }
+    }
+    return NULL;
+}
+
+Public char *
+_XimGetIMValueData(
+    Xim                         im,
+    XPointer            top,
+    XIMArg             *values,
+    XIMResourceList     res_list,
+    unsigned int        list_num)
+{
+    register XIMArg    *p;
+    XIMResourceList     res;
+    int                         check;
+
+    for(p = values; p->name != NULL; p++) {
+       if(!(res = _XimGetResourceListRec(res_list, list_num, p->name))) {
+           return p->name;
+       }
+       check = _XimCheckIMMode(res, XIM_GETIMVALUES);
+       if(check == XIM_CHECK_INVALID) {
+           continue;
+       } else if (check == XIM_CHECK_ERROR) {
+           return p->name;
+       }
+
+       if(!_XimDecodeLocalIMAttr(res, top, p->value)) {
+           return p->name;
+       }
+    }
+    return NULL;
+}
+
+Public void
+_XimSetIMMode(
+    XIMResourceList    res_list,
+    unsigned int       list_num)
+{
+    XIMResourceList    res;
+    unsigned int       n = XIMNumber(im_mode);
+    register int       i;
+
+    for(i = 0; i < n; i++) {
+       if(!(res = _XimGetResourceListRecByQuark(res_list,
+                                               list_num, im_mode_quark[i]))) {
+           continue;
+       }
+       res->mode = im_mode[i].mode;
+    }
+    return;
+}
+
+Private int
+_XimCheckSetIMDefaultsMode(
+    XIMResourceList    res)
+{
+    if(res->mode & XIM_MODE_IM_DEFAULT) {
+       return XIM_CHECK_VALID;
+    }
+    return XIM_CHECK_INVALID;
+}
+
+Private int
+_XimCheckSetIMValuesMode(
+    XIMResourceList    res)
+{
+    if(res->mode & XIM_MODE_IM_SET) {
+       return XIM_CHECK_VALID;
+    }
+    return XIM_CHECK_INVALID;
+}
+
+Private int
+ _XimCheckGetIMValuesMode(
+    XIMResourceList    res)
+{
+    if(res->mode & XIM_MODE_IM_GET) {
+       return XIM_CHECK_VALID;
+    }
+    return XIM_CHECK_INVALID;
+}
+
+Public int
+ _XimCheckIMMode(
+    XIMResourceList    res,
+    unsigned long      mode)
+{
+    if(res->mode == 0) {
+       return XIM_CHECK_INVALID;
+    }
+    if(mode & XIM_SETIMDEFAULTS) {
+       return _XimCheckSetIMDefaultsMode(res);
+    } else if (mode & XIM_SETIMVALUES) {
+       return _XimCheckSetIMValuesMode(res);
+    } else if (mode & XIM_GETIMVALUES) {
+       return _XimCheckGetIMValuesMode(res);
+    } else {
+       return XIM_CHECK_ERROR;
+    }
+}
+
+Public void
+_XimSetICMode(XIMResourceList res_list, unsigned int list_num, XIMStyle style)
+{
+    XIMResourceList    res;
+    unsigned int       n = XIMNumber(ic_mode);
+    register int       i;
+    unsigned int       pre_offset;
+    unsigned int       sts_offset;
+
+    if(style & XIMPreeditArea) {
+       pre_offset = XOffsetOf(XimICMode, preedit_area_mode);
+    } else if(style & XIMPreeditCallbacks) {
+       pre_offset = XOffsetOf(XimICMode, preedit_callback_mode);
+    } else if(style & XIMPreeditPosition) {
+       pre_offset = XOffsetOf(XimICMode, preedit_position_mode);
+    } else if(style & XIMPreeditNothing) {
+       pre_offset = XOffsetOf(XimICMode, preedit_nothing_mode);
+    } else {
+       pre_offset = XOffsetOf(XimICMode, preedit_none_mode);
+    }
+
+    if(style & XIMStatusArea) {
+       sts_offset = XOffsetOf(XimICMode, status_area_mode);
+    } else if(style & XIMStatusCallbacks) {
+       sts_offset = XOffsetOf(XimICMode, status_callback_mode);
+    } else if(style & XIMStatusNothing) {
+       sts_offset = XOffsetOf(XimICMode, status_nothing_mode);
+    } else {
+       sts_offset = XOffsetOf(XimICMode, status_none_mode);
+    }
+
+    for(i = 0; i < n; i++) {
+       if(!(res = _XimGetResourceListRecByQuark(res_list,
+                                               list_num, ic_mode_quark[i]))) {
+           continue;
+       }
+       res->mode = ( (*(unsigned short *)((char *)&ic_mode[i] + pre_offset))
+                   | (*(unsigned short *)((char *)&ic_mode[i] + sts_offset)));
+    }
+    return;
+}
+
+Private int
+_XimCheckSetICDefaultsMode(
+    XIMResourceList    res,
+    unsigned long      mode)
+{
+    if(mode & XIM_PREEDIT_ATTR) {
+       if(!(res->mode & XIM_MODE_PRE_MASK)) {
+           return XIM_CHECK_INVALID;
+       }
+
+       if(res->mode & XIM_MODE_PRE_CREATE) {
+           return XIM_CHECK_ERROR;
+       } else if (!(res->mode & XIM_MODE_PRE_DEFAULT)) {
+           return XIM_CHECK_INVALID;
+       }
+
+    } else if(mode & XIM_STATUS_ATTR) {
+       if(!(res->mode & XIM_MODE_STS_MASK)) {
+           return XIM_CHECK_INVALID;
+       }
+
+       if(res->mode & XIM_MODE_STS_CREATE) {
+           return XIM_CHECK_ERROR;
+       }
+       if(!(res->mode & XIM_MODE_STS_DEFAULT)) {
+           return XIM_CHECK_INVALID;
+       }
+
+    } else {
+       if(!res->mode) {
+           return XIM_CHECK_INVALID;
+       }
+
+       if(res->mode & XIM_MODE_IC_CREATE) {
+           return XIM_CHECK_ERROR;
+       }
+       if(!(res->mode & XIM_MODE_IC_DEFAULT)) {
+           return XIM_CHECK_INVALID;
+       }
+    }
+    return XIM_CHECK_VALID;
+}
+
+Private int
+_XimCheckCreateICMode(
+    XIMResourceList    res,
+    unsigned long      mode)
+{
+    if(mode & XIM_PREEDIT_ATTR) {
+       if(!(res->mode & XIM_MODE_PRE_MASK)) {
+           return XIM_CHECK_INVALID;
+       }
+
+       if(res->mode & XIM_MODE_PRE_CREATE) {
+           res->mode &= ~XIM_MODE_PRE_CREATE;
+       } else if(res->mode & XIM_MODE_PRE_ONCE) {
+           res->mode &= ~XIM_MODE_PRE_ONCE;
+       } else if(res->mode & XIM_MODE_PRE_DEFAULT) {
+           res->mode &= ~XIM_MODE_PRE_DEFAULT;
+       } else if (!(res->mode & XIM_MODE_PRE_SET)) {
+           return XIM_CHECK_ERROR;
+       }
+
+    } else if(mode & XIM_STATUS_ATTR) {
+       if(!(res->mode & XIM_MODE_STS_MASK)) {
+           return  XIM_CHECK_INVALID;
+       }
+
+       if(res->mode & XIM_MODE_STS_CREATE) {
+           res->mode &= ~XIM_MODE_STS_CREATE;
+       } else if(res->mode & XIM_MODE_STS_ONCE) {
+           res->mode &= ~XIM_MODE_STS_ONCE;
+       } else if(res->mode & XIM_MODE_STS_DEFAULT) {
+           res->mode &= ~XIM_MODE_STS_DEFAULT;
+       } else if (!(res->mode & XIM_MODE_STS_SET)) {
+           return XIM_CHECK_ERROR;
+       }
+
+    } else {
+       if(!res->mode) {
+           return XIM_CHECK_INVALID;
+       }
+
+       if(res->mode & XIM_MODE_IC_CREATE) {
+           res->mode &= ~XIM_MODE_IC_CREATE;
+       } else if(res->mode & XIM_MODE_IC_ONCE) {
+           res->mode &= ~XIM_MODE_IC_ONCE;
+       } else if(res->mode & XIM_MODE_IC_DEFAULT) {
+           res->mode &= ~XIM_MODE_IC_DEFAULT;
+       } else if (!(res->mode & XIM_MODE_IC_SET)) {
+           return XIM_CHECK_ERROR;
+       }
+    }
+    return XIM_CHECK_VALID;
+}
+
+Private int
+_XimCheckSetICValuesMode(
+    XIMResourceList    res,
+    unsigned long      mode)
+{
+    if(mode & XIM_PREEDIT_ATTR) {
+       if(!(res->mode & XIM_MODE_PRE_MASK)) {
+           return XIM_CHECK_INVALID;
+       }
+
+       if(res->mode & XIM_MODE_PRE_ONCE) {
+           res->mode &= ~XIM_MODE_PRE_ONCE;
+       } else if(!(res->mode & XIM_MODE_PRE_SET)) {
+           return XIM_CHECK_ERROR;
+       }
+
+    } else if(mode & XIM_STATUS_ATTR) {
+       if(!(res->mode & XIM_MODE_STS_MASK)) {
+           return XIM_CHECK_INVALID;
+       }
+
+       if(res->mode & XIM_MODE_STS_ONCE) {
+           res->mode &= ~XIM_MODE_STS_ONCE;
+       } else if(!(res->mode & XIM_MODE_STS_SET)) {
+           return XIM_CHECK_ERROR;
+       }
+
+    } else {
+       if(!res->mode) {
+           return XIM_CHECK_INVALID;
+       }
+
+       if(res->mode & XIM_MODE_IC_ONCE) {
+           res->mode &= ~XIM_MODE_IC_ONCE;
+       } else if(!(res->mode & XIM_MODE_IC_SET)) {
+           return XIM_CHECK_ERROR;
+       }
+    }
+    return XIM_CHECK_VALID;
+}
+
+Private int
+_XimCheckGetICValuesMode(
+    XIMResourceList    res,
+    unsigned long      mode)
+{
+    if(mode & XIM_PREEDIT_ATTR) {
+       if(!(res->mode & XIM_MODE_PRE_MASK)) {
+           return XIM_CHECK_INVALID;
+       }
+
+       if(!(res->mode & XIM_MODE_PRE_GET)) {
+           return XIM_CHECK_ERROR;
+       }
+
+    } else if(mode & XIM_STATUS_ATTR) {
+       if(!(res->mode & XIM_MODE_STS_MASK)) {
+           return XIM_CHECK_INVALID;
+       }
+
+       if(!(res->mode & XIM_MODE_STS_GET)) {
+           return XIM_CHECK_ERROR;
+       }
+
+    } else {
+       if(!res->mode) {
+           return XIM_CHECK_INVALID;
+       }
+
+       if(!(res->mode & XIM_MODE_IC_GET)) {
+           return XIM_CHECK_ERROR;
+       }
+    }
+    return XIM_CHECK_VALID;
+}
+
+Public int
+ _XimCheckICMode(
+    XIMResourceList     res,
+    unsigned long       mode)
+{
+    if(mode &XIM_SETICDEFAULTS) {
+       return _XimCheckSetICDefaultsMode(res, mode);
+    } else if (mode & XIM_CREATEIC) {
+       return _XimCheckCreateICMode(res, mode);
+    } else if (mode & XIM_SETICVALUES) {
+       return _XimCheckSetICValuesMode(res, mode);
+    } else if (mode & XIM_GETICVALUES) {
+       return _XimCheckGetICValuesMode(res, mode);
+    } else {
+       return XIM_CHECK_ERROR;
+    }
+}
+
+Public Bool
+_XimSetLocalIMDefaults(
+    Xim                         im,
+    XPointer            top,
+    XIMResourceList     res_list,
+    unsigned int        list_num)
+{
+    XimValueOffsetInfo  info;
+    unsigned int        num;
+    register int        i;
+    XIMResourceList     res;
+    int                         check;
+
+    info = im_attr_info;
+    num  = XIMNumber(im_attr_info);
+
+    for(i = 0; i < num; i++) {
+       if((res = _XimGetResourceListRecByQuark( res_list, list_num,
+                               info[i].quark)) == (XIMResourceList)NULL) {
+           return False;
+       }
+
+       check = _XimCheckIMMode(res, XIM_SETIMDEFAULTS);
+       if(check == XIM_CHECK_INVALID) {
+           continue;
+       } else if (check == XIM_CHECK_ERROR) {
+           return False;
+       }
+
+       if(!info[i].defaults) {
+           continue;
+       }
+       if(!(info[i].defaults(&info[i], top, (XPointer)NULL, 0))) {
+           return False;
+       }
+    }
+    return True;
+}
+
+Public Bool
+_XimSetICDefaults(
+    Xic                         ic,
+    XPointer            top,
+    unsigned long       mode,
+    XIMResourceList     res_list,
+    unsigned int        list_num)
+{
+    unsigned int        num;
+    XimValueOffsetInfo  info;
+    register int        i;
+    XIMResourceList     res;
+    int                         check;
+    XrmQuark            pre_quark;
+    XrmQuark            sts_quark;
+
+    pre_quark = XrmStringToQuark(XNPreeditAttributes);
+    sts_quark = XrmStringToQuark(XNStatusAttributes);
+
+    if(mode & XIM_PREEDIT_ATTR) {
+       info = ic_pre_attr_info;
+       num  = XIMNumber(ic_pre_attr_info);
+    } else if(mode & XIM_STATUS_ATTR) {
+       info = ic_sts_attr_info;
+       num  = XIMNumber(ic_sts_attr_info);
+    } else {
+       info = ic_attr_info;
+       num  = XIMNumber(ic_attr_info);
+    }
+
+    for(i = 0; i < num; i++) {
+       if(info[i].quark == pre_quark) {
+           if(!_XimSetICDefaults(ic, (XPointer)((char *)top + info[i].offset),
+                       (mode | XIM_PREEDIT_ATTR), res_list, list_num)) {
+               return False;
+           }
+       } else if (info[i].quark == sts_quark) {
+           if(!_XimSetICDefaults(ic, (XPointer)((char *)top + info[i].offset),
+                       (mode | XIM_STATUS_ATTR), res_list, list_num)) {
+               return False;
+           }
+       } else {
+           if(!(res = _XimGetResourceListRecByQuark(res_list, list_num,
+                                                       info[i].quark))) {
+               return False;
+           }
+
+           check = _XimCheckICMode(res, mode);
+           if (check == XIM_CHECK_INVALID) {
+               continue;
+           } else if (check == XIM_CHECK_ERROR) {
+               return False;
+           }
+
+           if (!info[i].defaults) {
+               continue;
+           }
+           if (!(info[i].defaults(&info[i], top, (XPointer)ic, mode))) {
+               return False;
+           }
+       }
+    }
+    return True;
+}
+
+Private Bool
+_XimEncodeAttr(
+    XimValueOffsetInfo  info,
+    unsigned int        num,
+    XIMResourceList     res,
+    XPointer            top,
+    XPointer            val)
+{
+    register int        i;
+
+    for(i = 0; i < num; i++ ) {
+       if(info[i].quark == res->xrm_name) {
+           if(!info[i].encode) {
+               return False;
+           }
+           return (*info[i].encode)(&info[i], top, val);
+       }
+    }
+    return False;
+}
+
+Public Bool
+_XimEncodeLocalIMAttr(
+    XIMResourceList     res,
+    XPointer            top,
+    XPointer            val)
+{
+    return _XimEncodeAttr(im_attr_info, XIMNumber(im_attr_info),
+                                       res, top, val);
+}
+
+Public Bool
+_XimEncodeLocalICAttr(
+    Xic                         ic,
+    XIMResourceList     res,
+    XPointer            top,
+    XIMArg             *arg,
+    unsigned long       mode)
+{
+    unsigned int        num;
+    XimValueOffsetInfo  info;
+
+    if(mode & XIM_PREEDIT_ATTR) {
+       info = ic_pre_attr_info;
+       num  = XIMNumber(ic_pre_attr_info);
+    } else if(mode & XIM_STATUS_ATTR) {
+       info = ic_sts_attr_info;
+       num  = XIMNumber(ic_sts_attr_info);
+    } else {
+       info = ic_attr_info;
+       num  = XIMNumber(ic_attr_info);
+    }
+
+    return _XimEncodeAttr(info, num, res, top, arg->value);
+}
+
+Private Bool
+_XimEncodeLocalTopValue(
+    Xic                         ic,
+    XIMResourceList     res,
+    XPointer            val,
+    Bool                flag)
+{
+    XIMArg             *p = (XIMArg *)val;
+
+    if (res->xrm_name == XrmStringToQuark(XNClientWindow)) {
+       ic->core.client_window = (Window)p->value;
+       if (ic->core.focus_window == (Window)0)
+           ic->core.focus_window = ic->core.client_window;
+       if (flag) {
+           _XRegisterFilterByType(ic->core.im->core.display,
+                       ic->core.focus_window,
+                       KeyPress, KeyRelease, _XimLocalFilter, (XPointer)ic);
+       }
+    } else if (res->xrm_name == XrmStringToQuark(XNFocusWindow)) {
+       if (ic->core.client_window) {
+           if (flag) {
+               _XUnregisterFilter(ic->core.im->core.display,
+                       ic->core.focus_window, _XimLocalFilter, (XPointer)ic);
+           }
+           ic->core.focus_window = (Window)p->value;
+           if (flag) {
+               _XRegisterFilterByType(ic->core.im->core.display,
+                       ic->core.focus_window, KeyPress, KeyRelease,
+                       _XimLocalFilter, (XPointer)ic);
+           }
+       } else
+           ic->core.focus_window = (Window)p->value;
+    }
+    return True;
+}
+
+Private Bool
+_XimEncodeLocalPreeditValue(
+    Xic                         ic,
+    XIMResourceList     res,
+    XPointer            val)
+{
+    XIMArg             *p = (XIMArg *)val;
+
+    if (res->xrm_name == XrmStringToQuark(XNStdColormap)) {
+       XStandardColormap       *colormap_ret;
+       int                      count;
+
+       if (!(XGetRGBColormaps(ic->core.im->core.display,
+                               ic->core.focus_window, &colormap_ret,
+                               &count, (Atom)p->value)))
+           return False;
+
+       Xfree(colormap_ret);
+    }
+    return True;
+}
+
+Private Bool
+_XimEncodeLocalStatusValue(
+    Xic                         ic,
+    XIMResourceList     res,
+    XPointer            val)
+{
+    XIMArg             *p = (XIMArg *)val;
+
+    if (res->xrm_name == XrmStringToQuark(XNStdColormap)) {
+       XStandardColormap       *colormap_ret;
+       int                      count;
+
+       if (!(XGetRGBColormaps(ic->core.im->core.display,
+                               ic->core.focus_window, &colormap_ret,
+                               &count, (Atom)p->value)))
+           return False;
+
+       Xfree(colormap_ret);
+    }
+    return True;
+}
+
+Public char *
+_XimSetICValueData(
+    Xic                         ic,
+    XPointer            top,
+    XIMResourceList     res_list,
+    unsigned int        list_num,
+    XIMArg             *values,
+    unsigned long       mode,
+    Bool                flag)
+{
+    register  XIMArg   *p;
+    XIMResourceList     res;
+    char               *name;
+    int                         check;
+    XrmQuark            pre_quark;
+    XrmQuark            sts_quark;
+
+    pre_quark = XrmStringToQuark(XNPreeditAttributes);
+    sts_quark = XrmStringToQuark(XNStatusAttributes);
+
+    for(p = values; p->name != NULL; p++) {
+       if((res = _XimGetResourceListRec(res_list, list_num,
+                                       p->name)) == (XIMResourceList)NULL) {
+           return p->name;
+       }
+       if(res->xrm_name == pre_quark) {
+           if(((name = _XimSetICValueData(ic,
+                       (XPointer)(&((XimDefICValues *)top)->preedit_attr),
+                       res_list, list_num, (XIMArg *)p->value,
+                       (mode | XIM_PREEDIT_ATTR), flag)))) {
+               return name;
+           }
+       } else if(res->xrm_name == sts_quark) {
+           if(((name = _XimSetICValueData(ic,
+                       (XPointer)(&((XimDefICValues *)top)->status_attr),
+                       res_list, list_num, (XIMArg *)p->value,
+                       (mode | XIM_STATUS_ATTR), flag)))) {
+               return name;
+           }
+       } else {
+           check = _XimCheckICMode(res, mode);
+           if(check == XIM_CHECK_INVALID) {
+               continue;
+           } else if(check == XIM_CHECK_ERROR) {
+               return p->name;
+           }
+
+           if(mode & XIM_PREEDIT_ATTR) {
+               if (!_XimEncodeLocalPreeditValue(ic, res, (XPointer)p))
+                   return p->name;
+           } else if(mode & XIM_STATUS_ATTR) {
+               if (!_XimEncodeLocalStatusValue(ic, res, (XPointer)p))
+                   return p->name;
+           } else {
+               if (!_XimEncodeLocalTopValue(ic, res, (XPointer)p, flag))
+                   return p->name;
+           }
+           if(_XimEncodeLocalICAttr(ic, res, top, p, mode) == False) {
+               return p->name;
+           }
+       }
+    }
+    return NULL;
+}
+
+Private Bool
+_XimCheckInputStyle(
+    XIMStyles          *styles,
+    XIMStyle            style)
+{
+    int                         num = styles->count_styles;
+    register int        i;
+
+    for(i = 0; i < num; i++) {
+       if(styles->supported_styles[i] == style) {
+           return True;
+       }
+    }
+    return False;
+}
+
+Public Bool
+_XimCheckLocalInputStyle(
+    Xic                         ic,
+    XPointer            top,
+    XIMArg             *values,
+    XIMStyles          *styles,
+    XIMResourceList     res_list,
+    unsigned int        list_num)
+{
+    XrmQuark            quark = XrmStringToQuark(XNInputStyle);
+    register XIMArg    *p;
+    XIMResourceList     res;
+
+    for(p = values; p && p->name != NULL; p++) {
+       if(quark == XrmStringToQuark(p->name)) {
+           if(!(res = _XimGetResourceListRec(res_list, list_num, p->name))) {
+               return False;
+           }
+           if(!_XimEncodeLocalICAttr(ic, res, top, p, 0)) {
+               return False;
+           }
+           if (_XimCheckInputStyle(styles,
+                       ((XimDefICValues *)top)->input_style)) {
+               return True;
+           }
+           return False;
+       }
+    }
+    return False;
+}
+
+Private Bool
+_XimDecodeAttr(
+    XimValueOffsetInfo  info,
+    unsigned int        num,
+    XIMResourceList     res,
+    XPointer            top,
+    XPointer            val)
+{
+    register int        i;
+
+    for(i = 0; i < num; i++ ) {
+       if(info[i].quark == res->xrm_name) {
+           if(!info[i].decode) {
+               return False;
+           }
+           return (*info[i].decode)(&info[i], top, val);
+       }
+    }
+    return False;
+}
+
+Public Bool
+_XimDecodeLocalIMAttr(
+    XIMResourceList     res,
+    XPointer            top,
+    XPointer            val)
+{
+    return _XimDecodeAttr(im_attr_info, XIMNumber(im_attr_info),
+                                       res, top, val);
+}
+
+Public Bool
+_XimDecodeLocalICAttr(
+    XIMResourceList     res,
+    XPointer            top,
+    XPointer            val,
+    unsigned long       mode)
+{
+    unsigned int        num;
+    XimValueOffsetInfo  info;
+
+    if(mode & XIM_PREEDIT_ATTR) {
+       info = ic_pre_attr_info;
+       num  = XIMNumber(ic_pre_attr_info);
+    } else if(mode & XIM_STATUS_ATTR) {
+       info = ic_sts_attr_info;
+       num  = XIMNumber(ic_sts_attr_info);
+    } else {
+       info = ic_attr_info;
+       num  = XIMNumber(ic_attr_info);
+    }
+
+    return _XimDecodeAttr(info, num, res, top, val);
+}
+
+Public char *
+_XimGetICValueData(Xic ic, XPointer top, XIMResourceList res_list,
+                  unsigned int  list_num, XIMArg *values, unsigned long mode)
+{
+    register  XIMArg   *p;
+    XIMResourceList     res;
+    char               *name;
+    int                         check;
+    XrmQuark            pre_quark;
+    XrmQuark            sts_quark;
+
+    pre_quark = XrmStringToQuark(XNPreeditAttributes);
+    sts_quark = XrmStringToQuark(XNStatusAttributes);
+
+    for(p = values; p->name != NULL; p++) {
+       if((res = _XimGetResourceListRec(res_list, list_num,
+                                       p->name)) == (XIMResourceList)NULL) {
+           return p->name;
+       }
+       if(res->xrm_name == pre_quark) {
+           if((name = _XimGetICValueData(ic,
+                       (XPointer)(&((XimDefICValues *)top)->preedit_attr),
+                       res_list, list_num, (XIMArg *)p->value,
+                       (mode | XIM_PREEDIT_ATTR)))) {
+               return name;
+           }
+       } else if(res->xrm_name == sts_quark) {
+           if((name = _XimGetICValueData(ic,
+                       (XPointer)(&((XimDefICValues *)top)->status_attr),
+                       res_list, list_num, (XIMArg *)p->value,
+                       (mode | XIM_STATUS_ATTR)))) {
+               return name;
+           }
+       } else {
+           check = _XimCheckICMode(res, mode);
+           if(check == XIM_CHECK_INVALID) {
+               continue;
+           } else if(check == XIM_CHECK_ERROR) {
+               return p->name;
+           }
+
+           if(_XimDecodeLocalICAttr(res, top, p->value, mode) == False) {
+               return p->name;
+           }
+       }
+    }
+    return NULL;
+}
+
+Public void
+_XimGetCurrentIMValues(Xim im, XimDefIMValues *im_values)
+{
+    bzero((char *)im_values, sizeof(XimDefIMValues));
+
+    im_values->styles          = im->core.styles;
+    im_values->im_values_list  = im->core.im_values_list;
+    im_values->ic_values_list  = im->core.ic_values_list;
+    im_values->destroy_callback = im->core.destroy_callback;
+    im_values->res_name                = im->core.res_name;
+    im_values->res_class       = im->core.res_class;
+    im_values->visible_position        = im->core.visible_position;
+}
+
+Public void
+_XimSetCurrentIMValues(Xim im, XimDefIMValues *im_values)
+{
+    im->core.styles            = im_values->styles;
+    im->core.im_values_list    = im_values->im_values_list;
+    im->core.ic_values_list    = im_values->ic_values_list;
+    im->core.destroy_callback  = im_values->destroy_callback;
+    im->core.res_name          = im_values->res_name;
+    im->core.res_class         = im_values->res_class;
+    im->core.visible_position  = im_values->visible_position;
+}
+
+Public void
+_XimGetCurrentICValues(Xic ic, XimDefICValues *ic_values)
+{
+    bzero((char *)ic_values, sizeof(XimDefICValues));
+
+    ic_values->input_style      = ic->core.input_style;
+    ic_values->client_window    = ic->core.client_window;
+    ic_values->focus_window     = ic->core.focus_window;
+    ic_values->filter_events    = ic->core.filter_events;
+    ic_values->geometry_callback = ic->core.geometry_callback;
+    ic_values->res_name                 = ic->core.res_name;
+    ic_values->res_class        = ic->core.res_class;
+    ic_values->destroy_callback         = ic->core.destroy_callback;
+    ic_values->string_conversion_callback
+                                = ic->core.string_conversion_callback;
+    ic_values->string_conversion = ic->core.string_conversion;
+    ic_values->reset_state      = ic->core.reset_state;
+    ic_values->hotkey           = ic->core.hotkey;
+    ic_values->hotkey_state     = ic->core.hotkey_state;
+    ic_values->preedit_attr     = ic->core.preedit_attr;
+    ic_values->status_attr      = ic->core.status_attr;
+}
+
+Public void
+_XimSetCurrentICValues(
+    Xic                         ic,
+    XimDefICValues     *ic_values)
+{
+    ic->core.input_style       = ic_values->input_style;
+    ic->core.client_window     = ic_values->client_window;
+    if (ic_values->focus_window)
+       ic->core.focus_window   = ic_values->focus_window;
+    ic->core.filter_events     = ic_values->filter_events;
+    ic->core.geometry_callback = ic_values->geometry_callback;
+    ic->core.res_name          = ic_values->res_name;
+    ic->core.res_class         = ic_values->res_class;
+    ic->core.destroy_callback  = ic_values->destroy_callback;
+    ic->core.string_conversion_callback
+                               = ic_values->string_conversion_callback;
+    ic->core.string_conversion = ic_values->string_conversion;
+    ic->core.reset_state       = ic_values->reset_state;
+    ic->core.hotkey            = ic_values->hotkey;
+    ic->core.hotkey_state      = ic_values->hotkey_state;
+    ic->core.preedit_attr      = ic_values->preedit_attr;
+    ic->core.status_attr       = ic_values->status_attr;
+}
+
+Private void
+_XimInitialIMOffsetInfo(void)
+{
+    unsigned int        n = XIMNumber(im_attr_info);
+    register int        i;
+
+    for(i = 0; i < n; i++) {
+       im_attr_info[i].quark = XrmStringToQuark(GET_NAME(im_attr_info[i]));
+    }
+}
+
+Private void
+_XimInitialICOffsetInfo(void)
+{
+    unsigned int        n;
+    register int        i;
+
+    n = XIMNumber(ic_attr_info);
+    for(i = 0; i < n; i++) {
+       ic_attr_info[i].quark = XrmStringToQuark(GET_NAME(ic_attr_info[i]));
+    }
+
+    n = XIMNumber(ic_pre_attr_info);
+    for(i = 0; i < n; i++) {
+       ic_pre_attr_info[i].quark = XrmStringToQuark(GET_NAME(ic_pre_attr_info[i]));
+    }
+
+    n = XIMNumber(ic_sts_attr_info);
+    for(i = 0; i < n; i++) {
+       ic_sts_attr_info[i].quark = XrmStringToQuark(GET_NAME(ic_sts_attr_info[i]));
+    }
+}
+
+Private void
+_XimInitialIMMode(void)
+{
+    unsigned int       n = XIMNumber(im_mode);
+    register int       i;
+
+    for(i = 0; i < n; i++) {
+       im_mode_quark[i] = XrmStringToQuark(GET_NAME(im_mode[i]));
+    }
+}
+
+Private void
+_XimInitialICMode(void)
+{
+    unsigned int       n = XIMNumber(ic_mode);
+    register int       i;
+
+    for(i = 0; i < n; i++) {
+       ic_mode_quark[i] = XrmStringToQuark(GET_NAME(ic_mode[i]));
+    }
+}
+
+Public void
+_XimInitialResourceInfo(void)
+{
+    static Bool        init_flag = False;
+
+    if(init_flag == True) {
+       return;
+    }
+    _XimInitialIMOffsetInfo();
+    _XimInitialICOffsetInfo();
+    _XimInitialIMMode();
+    _XimInitialICMode();
+    init_flag = True;
+}
diff --git a/modules/im/ximcp/imRmAttr.c b/modules/im/ximcp/imRmAttr.c
new file mode 100644 (file)
index 0000000..c047715
--- /dev/null
@@ -0,0 +1,1518 @@
+/******************************************************************
+
+           Copyright 1992, 1993, 1994 by FUJITSU LIMITED
+
+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 FUJITSU LIMITED
+not be used in advertising or publicity pertaining to distribution
+of the software without specific, written prior permission.
+FUJITSU LIMITED makes no representations about the suitability of
+this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL FUJITSU LIMITED 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.
+
+  Author: Takashi Fujiwara     FUJITSU LIMITED
+                               fujiwara@a80.tech.yk.fujitsu.co.jp
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "Ximint.h"
+
+
+Private XIMResourceList
+_XimGetNestedListSeparator(
+    XIMResourceList     res_list,              /* LISTofIMATTR or IMATTR */
+    unsigned int        res_num)
+{
+    return  _XimGetResourceListRec(res_list, res_num, XNSeparatorofNestedList);
+}
+
+Private Bool
+_XimCheckInnerIMAttributes(
+    Xim                         im,
+    XIMArg             *arg,
+    unsigned long       mode)
+{
+    XIMResourceList     res;
+    int                         check;
+
+    if (!(res = _XimGetResourceListRec(im->private.proto.im_inner_resources,
+                       im->private.proto.im_num_inner_resources, arg->name)))
+       return False;
+
+    check = _XimCheckIMMode(res, mode);
+    if(check == XIM_CHECK_INVALID)
+       return True;
+    else if(check == XIM_CHECK_ERROR)
+       return False;
+
+    return True;
+}
+
+Public char *
+_XimMakeIMAttrIDList(
+    Xim                         im,
+    XIMResourceList     res_list,
+    unsigned int        res_num,
+    XIMArg             *arg,
+    CARD16             *buf,
+    INT16              *len,
+    unsigned long       mode)
+{
+    register XIMArg    *p;
+    XIMResourceList     res;
+    int                         check;
+
+    *len = 0;
+    if (!arg)
+       return (char *)NULL;
+
+    for (p = arg; p->name; p++) {
+       if (!(res = _XimGetResourceListRec(res_list, res_num, p->name))) {
+           if (_XimCheckInnerIMAttributes(im, p, mode))
+               continue;
+           return p->name;
+       }
+
+       check = _XimCheckIMMode(res, mode);
+       if (check == XIM_CHECK_INVALID)
+           continue;
+       else if (check == XIM_CHECK_ERROR)
+           return p->name;
+
+       *buf = res->id;
+       *len += sizeof(CARD16);
+        buf++;
+    }
+    return (char *)NULL;
+}
+
+Private Bool
+_XimCheckInnerICAttributes(
+    Xic                         ic,
+    XIMArg             *arg,
+    unsigned long       mode)
+{
+    XIMResourceList     res;
+    int                         check;
+
+    if (!(res = _XimGetResourceListRec(ic->private.proto.ic_inner_resources,
+                       ic->private.proto.ic_num_inner_resources, arg->name)))
+       return False;
+
+    check = _XimCheckICMode(res, mode);
+    if(check == XIM_CHECK_INVALID)
+       return True;
+    else if(check == XIM_CHECK_ERROR)
+       return False;
+
+    return True;
+}
+
+Public char *
+_XimMakeICAttrIDList(
+    Xic                         ic,
+    XIMResourceList     res_list,
+    unsigned int        res_num,
+    XIMArg             *arg,
+    CARD16             *buf,
+    INT16              *len,
+    unsigned long       mode)
+{
+    register XIMArg    *p;
+    XIMResourceList     res;
+    int                         check;
+    XrmQuark            pre_quark;
+    XrmQuark            sts_quark;
+    char               *name;
+    INT16               new_len;
+
+    *len = 0;
+    if (!arg)
+       return (char *)NULL;
+
+    pre_quark = XrmStringToQuark(XNPreeditAttributes);
+    sts_quark = XrmStringToQuark(XNStatusAttributes);
+
+    for (p = arg; p && p->name; p++) {
+       if (!(res = _XimGetResourceListRec(res_list, res_num, p->name))) {
+           if (_XimCheckInnerICAttributes(ic, p, mode))
+               continue;
+           *len = -1;
+           return p->name;
+       }
+
+       check = _XimCheckICMode(res, mode);
+       if(check == XIM_CHECK_INVALID)
+           continue;
+       else if(check == XIM_CHECK_ERROR) {
+           *len = -1;
+           return p->name;
+       }
+
+       *buf = res->id;
+       *len += sizeof(CARD16);
+       buf++;
+       if (res->resource_size == XimType_NEST) {
+           if (res->xrm_name == pre_quark) {
+               if ((name = _XimMakeICAttrIDList(ic, res_list, res_num,
+                               (XIMArg *)p->value, buf, &new_len,
+                               (mode | XIM_PREEDIT_ATTR)))) {
+                   if (new_len < 0) *len = -1;
+                   else *len += new_len;
+                   return name;
+               }
+               *len += new_len;
+               buf = (CARD16 *)((char *)buf + new_len);
+           } else if (res->xrm_name == sts_quark) {
+               if ((name = _XimMakeICAttrIDList(ic, res_list, res_num,
+                               (XIMArg *)p->value, buf, &new_len,
+                               (mode | XIM_STATUS_ATTR)))) {
+                   if (new_len < 0) *len = -1;
+                   else *len += new_len;
+                   return name;
+               }
+               *len += new_len;
+               buf = (CARD16 *)((char *)buf + new_len);
+           }
+
+           if (!(res = _XimGetNestedListSeparator(res_list, res_num))) {
+               p++;
+               if (p) {
+                   *len = -1;
+                   return p->name;
+               }
+               else {
+                   return (char *)NULL;
+               }
+           }
+           *buf = res->id;
+           *len += sizeof(CARD16);
+           buf++;
+       }
+    }
+    return (char *)NULL;
+}
+
+Private Bool
+_XimAttributeToValue(
+    Xic                          ic,
+    XIMResourceList      res,
+    CARD16              *data,
+    INT16                data_len,
+    XPointer             value,
+    BITMASK32            mode)
+{
+    switch (res->resource_size) {
+    case XimType_SeparatorOfNestedList:
+    case XimType_NEST:
+       break;
+
+    case XimType_CARD8:
+    case XimType_CARD16:
+    case XimType_CARD32:
+    case XimType_Window:
+    case XimType_XIMHotKeyState:
+       _XCopyToArg((XPointer)data, (XPointer *)&value, data_len);
+       break;
+
+    case XimType_STRING8:
+       {
+           char        *str;
+
+           if (!(value))
+               return False;
+
+           if (!(str = (char *)Xmalloc(data_len + 1)))
+               return False;
+
+           (void)memcpy(str, (char *)data, data_len);
+           str[data_len] = '\0';
+
+           *((char **)value) = str;
+           break;
+       }
+
+    case XimType_XIMStyles:
+       {
+           INT16                num = data[0];
+           register CARD32     *style_list = (CARD32 *)&data[2];
+           XIMStyle            *style;
+           XIMStyles           *rep;
+           register int         i;
+           char                *p;
+           int                  alloc_len;
+
+           if (!(value))
+               return False;
+
+           alloc_len = sizeof(XIMStyles) + sizeof(XIMStyle) * num;
+           if (!(p = (char *)Xmalloc(alloc_len)))
+               return False;
+
+           rep   = (XIMStyles *)p;
+           style = (XIMStyle *)(p + sizeof(XIMStyles));
+
+           for (i = 0; i < num; i++)
+               style[i] = (XIMStyle)style_list[i];
+
+           rep->count_styles = (unsigned short)num;
+           rep->supported_styles = style;
+           *((XIMStyles **)value) = rep;
+           break;
+       }
+
+    case XimType_XRectangle:
+       {
+           XRectangle  *rep;
+
+           if (!(value))
+               return False;
+
+           if (!(rep = (XRectangle *)Xmalloc(sizeof(XRectangle))))
+               return False;
+
+           rep->x      = data[0];
+           rep->y      = data[1];
+           rep->width  = data[2];
+           rep->height = data[3];
+           *((XRectangle **)value) = rep;
+           break;
+       }
+
+    case XimType_XPoint:
+       {
+           XPoint      *rep;
+
+           if (!(value))
+               return False;
+
+           if (!(rep = (XPoint *)Xmalloc(sizeof(XPoint))))
+               return False;
+
+           rep->x = data[0];
+           rep->y = data[1];
+           *((XPoint **)value) = rep;
+           break;
+       }
+
+    case XimType_XFontSet:
+       {
+           INT16        len = data[0];
+           char        *base_name;
+           XFontSet     rep = (XFontSet)NULL;
+           char        **missing_list = NULL;
+           int          missing_count;
+           char        *def_string;
+
+           if (!(value))
+               return False;
+           if (!ic)
+               return False;
+
+           if (!(base_name = (char *)Xmalloc(len + 1)))
+               return False;
+
+           (void)strncpy(base_name, (char *)&data[1], (int)len);
+           base_name[len] = '\0';
+
+           if (mode & XIM_PREEDIT_ATTR) {
+               if (!strcmp(base_name, ic->private.proto.preedit_font)) {
+                   rep = ic->core.preedit_attr.fontset;
+               } else if (!ic->private.proto.preedit_font_length) {
+                   rep = XCreateFontSet(ic->core.im->core.display,
+                                       base_name, &missing_list,
+                                       &missing_count, &def_string);
+               }
+           } else if (mode & XIM_STATUS_ATTR) {
+               if (!strcmp(base_name, ic->private.proto.status_font)) {
+                   rep = ic->core.status_attr.fontset;
+               } else if (!ic->private.proto.status_font_length) {
+                   rep = XCreateFontSet(ic->core.im->core.display,
+                                       base_name, &missing_list,
+                                       &missing_count, &def_string);
+               }
+           }
+
+           Xfree(base_name);
+           Xfree(missing_list);
+           *((XFontSet *)value) = rep;
+           break;
+       }
+
+    case XimType_XIMHotKeyTriggers:
+       {
+           INT32                        num = *((CARD32 *)data);
+           register CARD32             *key_list = (CARD32 *)&data[2];
+           XIMHotKeyTrigger            *key;
+           XIMHotKeyTriggers           *rep;
+           register int                 i;
+           char                        *p;
+           int                          alloc_len;
+
+           if (!(value))
+               return False;
+
+           alloc_len = sizeof(XIMHotKeyTriggers)
+                     + sizeof(XIMHotKeyTrigger) * num;
+           if (!(p = (char *)Xmalloc(alloc_len)))
+               return False;
+
+           rep = (XIMHotKeyTriggers *)p;
+           key = (XIMHotKeyTrigger *)(p + sizeof(XIMHotKeyTriggers));
+
+           for (i = 0; i < num; i++, key_list += 3) {
+               key[i].keysym        = (KeySym)key_list[0]; /* keysym */
+               key[i].modifier      = (int)key_list[1];    /* modifier */
+               key[i].modifier_mask = (int)key_list[2];    /* modifier_mask */
+           }
+
+           rep->num_hot_key = (int)num;
+           rep->key = key;
+           *((XIMHotKeyTriggers **)value) = rep;
+           break;
+       }
+
+    case XimType_XIMStringConversion:
+       {
+           break;
+       }
+
+    default:
+       return False;
+    }
+    return True;
+}
+
+Private Bool
+_XimDecodeInnerIMATTRIBUTE(
+    Xim                         im,
+    XIMArg             *arg)
+{
+    XIMResourceList     res;
+    XimDefIMValues      im_values;
+
+    if (!(res = _XimGetResourceListRec(im->private.proto.im_inner_resources,
+                       im->private.proto.im_num_inner_resources, arg->name)))
+       return False;
+
+    _XimGetCurrentIMValues(im, &im_values);
+    return _XimDecodeLocalIMAttr(res, (XPointer)&im_values, arg->value);
+}
+
+Public char *
+_XimDecodeIMATTRIBUTE(
+    Xim                         im,
+    XIMResourceList     res_list,
+    unsigned int        res_num,
+    CARD16             *data,
+    INT16               data_len,
+    XIMArg             *arg,
+    BITMASK32           mode)
+{
+    register XIMArg    *p;
+    XIMResourceList     res;
+    int                         check;
+    INT16               len;
+    CARD16             *buf;
+    INT16               total;
+    INT16               min_len = sizeof(CARD16)       /* sizeof attributeID */
+                                + sizeof(INT16);       /* sizeof length */
+
+    for (p = arg; p->name; p++) {
+       if (!(res = _XimGetResourceListRec(res_list, res_num, p->name))) {
+           if (_XimDecodeInnerIMATTRIBUTE(im, p))
+               continue;
+           return p->name;
+       }
+
+       check = _XimCheckIMMode(res, mode);
+       if(check == XIM_CHECK_INVALID)
+           continue;
+       else if(check == XIM_CHECK_ERROR)
+           return p->name;
+
+       total = data_len;
+       buf = data;
+       while (total >= min_len) {
+           if (res->id == buf[0])
+               break;
+
+           len = buf[1];
+           len += XIM_PAD(len) + min_len;
+           buf = (CARD16 *)((char *)buf + len);
+           total -= len;
+       }
+       if (total < min_len)
+           return p->name;
+
+       if (!(_XimAttributeToValue((Xic) im->private.local.current_ic,
+                                  res, &buf[2], buf[1], p->value, mode)))
+           return p->name;
+    }
+    return (char *)NULL;
+}
+
+Private Bool
+_XimDecodeInnerICATTRIBUTE(
+    Xic                         ic,
+    XIMArg             *arg,
+    unsigned long       mode)
+{
+    XIMResourceList     res;
+    XimDefICValues      ic_values;
+
+    if (!(res = _XimGetResourceListRec(ic->private.proto.ic_inner_resources,
+                       ic->private.proto.ic_num_inner_resources, arg->name)))
+       return False;
+
+    _XimGetCurrentICValues(ic, &ic_values);
+    if (!_XimDecodeLocalICAttr(res, (XPointer)&ic_values, arg->value, mode))
+       return False;
+    _XimSetCurrentICValues(ic, &ic_values);
+    return True;
+}
+
+Public char *
+_XimDecodeICATTRIBUTE(
+    Xic                         ic,
+    XIMResourceList     res_list,
+    unsigned int        res_num,
+    CARD16             *data,
+    INT16               data_len,
+    XIMArg             *arg,
+    BITMASK32           mode)
+{
+    register XIMArg    *p;
+    XIMResourceList     res;
+    int                         check;
+    INT16               len;
+    CARD16             *buf;
+    INT16               total;
+    char               *name;
+    INT16               min_len = sizeof(CARD16)       /* sizeof attributeID */
+                                + sizeof(INT16);       /* sizeof length */
+    XrmQuark            pre_quark;
+    XrmQuark            sts_quark;
+
+    if (!arg)
+       return (char *)NULL;
+
+    pre_quark = XrmStringToQuark(XNPreeditAttributes);
+    sts_quark = XrmStringToQuark(XNStatusAttributes);
+
+    for (p = arg; p->name; p++) {
+       if (!(res = _XimGetResourceListRec(res_list, res_num, p->name))) {
+           if (_XimDecodeInnerICATTRIBUTE(ic, p, mode))
+               continue;
+           return p->name;
+       }
+
+       check = _XimCheckICMode(res, mode);
+       if (check == XIM_CHECK_INVALID)
+           continue;
+       else if (check == XIM_CHECK_ERROR)
+           return p->name;
+
+       total = data_len;
+       buf = data;
+       while (total >= min_len) {
+           if (res->id == buf[0])
+               break;
+
+           len = buf[1];
+           len += XIM_PAD(len) + min_len;
+           buf = (CARD16 *)((char *)buf + len);
+           total -= len;
+       }
+       if (total < min_len)
+           return p->name;
+
+       if (res->resource_size == XimType_NEST) {
+           if (res->xrm_name == pre_quark) {
+               if ((name = _XimDecodeICATTRIBUTE(ic, res_list, res_num,
+                       &buf[2], buf[1], (XIMArg *)p->value,
+                       (mode | XIM_PREEDIT_ATTR))))
+                   return name;
+           } else if (res->xrm_name == sts_quark) {
+               if ((name = _XimDecodeICATTRIBUTE(ic, res_list, res_num,
+                       &buf[2], buf[1], (XIMArg *)p->value,
+                       (mode | XIM_STATUS_ATTR))))
+                   return name;
+           }
+       } else {
+           if (!(_XimAttributeToValue(ic, res, &buf[2], buf[1],
+                                                       p->value, mode)))
+               return p->name;
+       }
+    }
+    return (char *)NULL;
+}
+
+Private Bool
+_XimValueToAttribute(
+    XIMResourceList     res,
+    XPointer            buf,
+    int                         buf_size,
+    XPointer            value,
+    int                        *len,
+    unsigned long       mode,
+    XPointer            param)
+{
+    int                         ret_len;
+
+    switch (res->resource_size) {
+    case XimType_SeparatorOfNestedList:
+    case XimType_NEST:
+       *len = 0;
+       break;
+
+    case XimType_CARD8:
+       ret_len = sizeof(CARD8);
+       if (buf_size < ret_len + XIM_PAD(ret_len)) {
+           *len = -1;
+           return False;
+       }
+
+       *((CARD8 *)buf) = (CARD8)(long)value;
+       *len = ret_len;
+       break;
+
+    case XimType_CARD16:
+       ret_len = sizeof(CARD16);
+       if (buf_size < ret_len + XIM_PAD(ret_len)) {
+           *len = -1;
+           return False;
+       }
+
+       *((CARD16 *)buf) = (CARD16)(long)value;
+       *len = ret_len;
+       break;
+
+    case XimType_CARD32:
+    case XimType_Window:
+    case XimType_XIMHotKeyState:
+       ret_len = sizeof(CARD32);
+       if (buf_size < ret_len + XIM_PAD(ret_len)) {
+           *len = -1;
+           return False;
+       }
+
+       *((CARD32 *)buf) = (CARD32)(long)value;
+       *len = ret_len;
+       break;
+
+    case XimType_STRING8:
+       if (!value) {
+           *len = 0;
+           return False;
+       }
+
+       ret_len = strlen((char *)value);
+       if (buf_size < ret_len + XIM_PAD(ret_len)) {
+           *len = -1;
+           return False;
+       }
+
+       (void)memcpy((char *)buf, (char *)value, ret_len);
+       *len = ret_len;
+       break;
+
+    case XimType_XRectangle:
+       {
+           XRectangle  *rect = (XRectangle *)value;
+           CARD16      *buf_s = (CARD16 *)buf;
+
+           if (!rect) {
+               *len = 0;
+               return False;
+           }
+
+           ret_len = sizeof(INT16)             /* sizeof X */
+                   + sizeof(INT16)             /* sizeof Y */
+                   + sizeof(CARD16)            /* sizeof width */
+                   + sizeof(CARD16);           /* sizeof height */
+           if (buf_size < ret_len + XIM_PAD(ret_len)) {
+               *len = -1;
+               return False;
+           }
+
+           buf_s[0] = (CARD16)rect->x;         /* X */
+           buf_s[1] = (CARD16)rect->y;         /* Y */
+           buf_s[2] = (CARD16)rect->width;     /* width */
+           buf_s[3] = (CARD16)rect->height;    /* heght */
+           *len = ret_len;
+           break;
+       }
+
+    case XimType_XPoint:
+       {
+           XPoint      *point = (XPoint *)value;
+           CARD16      *buf_s = (CARD16 *)buf;
+
+           if (!point) {
+               *len = 0;
+               return False;
+           }
+
+           ret_len = sizeof(INT16)             /* sizeof X */
+                   + sizeof(INT16);            /* sizeof Y */
+           if (buf_size < ret_len + XIM_PAD(ret_len)) {
+               *len = -1;
+               return False;
+           }
+
+           buf_s[0] = (CARD16)point->x;                /* X */
+           buf_s[1] = (CARD16)point->y;                /* Y */
+           *len = ret_len;
+           break;
+       }
+
+    case XimType_XFontSet:
+       {
+           XFontSet     font = (XFontSet)value;
+           Xic          ic = (Xic)param;
+           char        *base_name = NULL;
+           int          length = 0;
+           CARD16      *buf_s = (CARD16 *)buf;
+
+           if (!font) {
+               *len = 0;
+               return False;
+           }
+
+           if (mode & XIM_PREEDIT_ATTR) {
+               base_name = ic->private.proto.preedit_font;
+               length    = ic->private.proto.preedit_font_length;
+           } else if (mode & XIM_STATUS_ATTR) {
+               base_name = ic->private.proto.status_font;
+               length    = ic->private.proto.status_font_length;
+           }
+
+           if (!base_name) {
+               *len = 0;
+               return False;
+           }
+
+           ret_len = sizeof(CARD16)            /* sizeof length of Base name */
+                   + length;                   /* sizeof Base font name list */
+           if (buf_size < ret_len + XIM_PAD(ret_len)) {
+               *len = -1;
+               return False;
+           }
+
+           buf_s[0] = (INT16)length;           /* length of Base font name */
+           (void)memcpy((char *)&buf_s[1], base_name, length);
+                                               /* Base font name list */
+           *len = ret_len;
+           break;
+       }
+
+    case XimType_XIMHotKeyTriggers:
+       {
+           XIMHotKeyTriggers   *hotkey = (XIMHotKeyTriggers *)value;
+           INT32                num;
+           CARD32              *buf_l = (CARD32 *)buf;
+           register CARD32     *key = (CARD32 *)&buf_l[1];
+           register int         i;
+
+           if (!hotkey) {
+               *len = 0;
+               return False;
+           }
+           num = (INT32)hotkey->num_hot_key;
+
+           ret_len = sizeof(INT32)             /* sizeof number of key list */
+                  + (sizeof(CARD32)            /* sizeof keysyn */
+                  +  sizeof(CARD32)            /* sizeof modifier */
+                  +  sizeof(CARD32))           /* sizeof modifier_mask */
+                  *  num;                      /* number of key list */
+           if (buf_size < ret_len + XIM_PAD(ret_len)) {
+               *len = -1;
+               return False;
+           }
+
+           buf_l[0] = num;             /* number of key list */
+           for (i = 0; i < num; i++, key += 3) {
+               key[0] = (CARD32)(hotkey->key[i].keysym);
+                                               /* keysym */
+               key[1] = (CARD32)(hotkey->key[i].modifier);
+                                               /* modifier */
+               key[2] = (CARD32)(hotkey->key[i].modifier_mask);
+                                               /* modifier_mask */
+           }
+           *len = ret_len;
+           break;
+       }
+
+    case XimType_XIMStringConversion:
+       {
+           *len = 0;
+           break;
+       }
+
+    default:
+       return False;
+    }
+    return True;
+}
+
+Private Bool
+_XimSetInnerIMAttributes(
+    Xim                         im,
+    XPointer            top,
+    XIMArg             *arg,
+    unsigned long       mode)
+{
+    XIMResourceList     res;
+    int                         check;
+
+    if (!(res = _XimGetResourceListRec(im->private.proto.im_inner_resources,
+                       im->private.proto.im_num_inner_resources, arg->name)))
+       return False;
+
+    check = _XimCheckIMMode(res, mode);
+    if(check == XIM_CHECK_INVALID)
+       return True;
+    else if(check == XIM_CHECK_ERROR)
+       return False;
+
+    return _XimEncodeLocalIMAttr(res, top, arg->value);
+}
+
+Public char *
+_XimEncodeIMATTRIBUTE(
+    Xim                          im,
+    XIMResourceList      res_list,
+    unsigned int         res_num,
+    XIMArg              *arg,
+    XIMArg             **arg_ret,
+    char                *buf,
+    int                          size,
+    int                         *ret_len,
+    XPointer             top,
+    unsigned long        mode)
+{
+    register XIMArg    *p;
+    XIMResourceList     res;
+    int                         check;
+    CARD16             *buf_s;
+    int                         len;
+    int                         min_len = sizeof(CARD16) /* sizeof attribute ID */
+                                + sizeof(INT16); /* sizeof value length */
+
+    *ret_len = 0;
+    for (p = arg; p->name; p++) {
+       if (!(res = _XimGetResourceListRec(res_list, res_num, p->name))) {
+           if (_XimSetInnerIMAttributes(im, top, p, mode))
+               continue;
+           return p->name;
+       }
+
+       check = _XimCheckIMMode(res, mode);
+       if (check == XIM_CHECK_INVALID)
+           continue;
+       else if (check == XIM_CHECK_ERROR)
+           return p->name;
+
+       if (!(_XimEncodeLocalIMAttr(res, top, p->value)))
+           return p->name;
+
+       buf_s = (CARD16 *)buf;
+       if (!(_XimValueToAttribute(res, (XPointer)&buf_s[2], (size - min_len),
+                               p->value, &len, mode, (XPointer)NULL)))
+           return p->name;
+
+       if (len == 0) {
+           continue;
+       } else if (len < 0) {
+           *arg_ret = p;
+           return (char *)NULL;
+       }
+
+       buf_s[0] = res->id;                     /* attribute ID */
+       buf_s[1] = len;                         /* value length */
+       XIM_SET_PAD(&buf_s[2], len);            /* pad */
+       len += min_len;
+
+       buf += len;
+       *ret_len += len;
+       size -= len;
+    }
+    *arg_ret = (XIMArg *)NULL;
+    return (char *)NULL;
+}
+
+#ifdef XIM_CONNECTABLE
+Public Bool
+_XimEncodeSavedIMATTRIBUTE(
+    Xim                         im,
+    XIMResourceList     res_list,
+    unsigned int        res_num,
+    int                        *idx,
+    char               *buf,
+    int                         size,
+    int                        *ret_len,
+    XPointer            top,
+    unsigned long       mode)
+{
+    register int        i;
+    int                         num = im->private.proto.num_saved_imvalues;
+    XrmQuark           *quark_list = im->private.proto.saved_imvalues;
+    XIMResourceList     res;
+    XPointer            value;
+    CARD16             *buf_s;
+    int                         len;
+    int                         min_len = sizeof(CARD16) /* sizeof attribute ID */
+                                + sizeof(INT16); /* sizeof value length */
+
+    if (!im->private.proto.saved_imvalues) {
+       *idx = -1;
+       *ret_len = 0;
+       return True;
+    }
+
+    *ret_len = 0;
+    for (i = *idx; i < num; i++) {
+       if (!(res = _XimGetResourceListRecByQuark(res_list,
+                                               res_num, quark_list[i])))
+           continue;
+
+       if (!_XimDecodeLocalIMAttr(res, top, value))
+           return False;
+
+       buf_s = (CARD16 *)buf;
+       if (!(_XimValueToAttribute(res, (XPointer)&buf_s[2],
+                       (size - min_len), value, &len, mode, (XPointer)NULL)))
+           return False;
+
+       if (len == 0) {
+           continue;
+       } else if (len < 0) {
+           *idx = i;
+           return True;
+       }
+
+       buf_s[0] = res->id;                     /* attribute ID */
+       buf_s[1] = len;                         /* value length */
+       XIM_SET_PAD(&buf_s[2], len);            /* pad */
+       len += min_len;
+
+       buf += len;
+       *ret_len += len;
+       size -= len;
+    }
+    *idx = -1;
+    return True;
+}
+#endif /* XIM_CONNECTABLE */
+
+Private Bool
+_XimEncodeTopValue(
+    Xic                         ic,
+    XIMResourceList     res,
+    XIMArg             *p)
+{
+    if (res->xrm_name == XrmStringToQuark(XNClientWindow)) {
+       ic->core.client_window = (Window)p->value;
+       if (ic->core.focus_window == (Window)0)
+           ic->core.focus_window = ic->core.client_window;
+       _XimRegisterFilter(ic);
+
+    } else if (res->xrm_name == XrmStringToQuark(XNFocusWindow)) {
+       if (ic->core.client_window) {
+           _XimUnregisterFilter(ic);
+           ic->core.focus_window = (Window)p->value;
+           _XimRegisterFilter(ic);
+       } else /* client_window not yet */
+           ic->core.focus_window = (Window)p->value;
+    }
+    return True;
+}
+
+Private Bool
+_XimEncodePreeditValue(
+    Xic                         ic,
+    XIMResourceList     res,
+    XIMArg             *p)
+{
+    if (res->xrm_name == XrmStringToQuark(XNStdColormap)) {
+       XStandardColormap       *colormap_ret;
+       int                      count;
+
+       if (!(XGetRGBColormaps(ic->core.im->core.display,
+                               ic->core.focus_window, &colormap_ret,
+                               &count, (Atom)p->value)))
+           return False;
+
+       XFree(colormap_ret);
+    } else if (res->xrm_name == XrmStringToQuark(XNFontSet)) {
+       int               list_ret;
+       XFontStruct     **struct_list;
+       char            **name_list;
+       char             *tmp;
+       int               len;
+       register int      i;
+
+       if (!p->value)
+           return False;
+
+       if (ic->private.proto.preedit_font)
+           Xfree(ic->private.proto.preedit_font);
+
+       list_ret = XFontsOfFontSet((XFontSet)p->value,
+                                                &struct_list, &name_list);
+       for (i = 0, len = 0; i < list_ret; i++) {
+            len += (strlen(name_list[i]) + sizeof(char));
+       }
+       if (!(tmp = Xmalloc(len + 1))) {
+           ic->private.proto.preedit_font = NULL;
+           return False;
+       }
+
+       tmp[0] = '\0';
+       for (i = 0; i < list_ret; i++) {
+           strcat(tmp, name_list[i]);
+           strcat(tmp, ",");
+       }
+       tmp[len - 1] = 0;
+       ic->private.proto.preedit_font        = tmp;
+       ic->private.proto.preedit_font_length = len - 1;
+    }
+    return True;
+}
+
+Private Bool
+_XimEncodeStatusValue(
+    Xic                         ic,
+    XIMResourceList     res,
+    XIMArg             *p)
+{
+    if (res->xrm_name == XrmStringToQuark(XNStdColormap)) {
+       XStandardColormap       *colormap_ret = NULL;
+       int                      count;
+
+       if (!(XGetRGBColormaps(ic->core.im->core.display,
+                               ic->core.focus_window, &colormap_ret,
+                               &count, (Atom)p->value)))
+           return False;
+
+       XFree(colormap_ret);
+    } else if (res->xrm_name == XrmStringToQuark(XNFontSet)) {
+       int               list_ret;
+       XFontStruct     **struct_list;
+       char            **name_list;
+       char             *tmp;
+       int               len;
+       register int      i;
+
+       if (!p->value)
+           return False;
+
+       if (ic->private.proto.status_font)
+           Xfree(ic->private.proto.status_font);
+
+       list_ret = XFontsOfFontSet((XFontSet)p->value,
+                                                &struct_list, &name_list);
+       for (i = 0, len = 0; i < list_ret; i++) {
+            len += (strlen(name_list[i]) + sizeof(char));
+       }
+       if (!(tmp = Xmalloc(len+1))) {
+           ic->private.proto.status_font = NULL;
+           return False;
+       }
+
+       tmp[0] = '\0';
+       for(i = 0; i < list_ret; i++) {
+           strcat(tmp, name_list[i]);
+           strcat(tmp, ",");
+       }
+       tmp[len - 1] = 0;
+       ic->private.proto.status_font        = tmp;
+       ic->private.proto.status_font_length = len - 1;
+    }
+    return True;
+}
+
+Private Bool
+_XimSetInnerICAttributes(
+    Xic                         ic,
+    XPointer            top,
+    XIMArg             *arg,
+    unsigned long       mode)
+{
+    XIMResourceList     res;
+    int                         check;
+
+    if (!(res = _XimGetResourceListRec(ic->private.proto.ic_inner_resources,
+                       ic->private.proto.ic_num_inner_resources, arg->name)))
+       return False;
+
+    check = _XimCheckICMode(res, mode);
+    if(check == XIM_CHECK_INVALID)
+       return True;
+    else if(check == XIM_CHECK_ERROR)
+       return False;
+
+    return _XimEncodeLocalICAttr(ic, res, top, arg, mode);
+}
+
+Public char *
+_XimEncodeICATTRIBUTE(
+    Xic                          ic,
+    XIMResourceList      res_list,
+    unsigned int         res_num,
+    XIMArg              *arg,
+    XIMArg             **arg_ret,
+    char                *buf,
+    int                          size,
+    int                         *ret_len,
+    XPointer             top,
+    BITMASK32           *flag,
+    unsigned long        mode)
+{
+    register XIMArg    *p;
+    XIMResourceList     res;
+    int                         check;
+    CARD16             *buf_s;
+    int                         len;
+    int                         min_len = sizeof(CARD16) /* sizeof attribute ID */
+                                + sizeof(INT16); /* sizeof value length */
+    XrmQuark            pre_quark;
+    XrmQuark            sts_quark;
+    char               *name;
+
+    pre_quark = XrmStringToQuark(XNPreeditAttributes);
+    sts_quark = XrmStringToQuark(XNStatusAttributes);
+
+    *ret_len = 0;
+    for (p = arg; p && p->name; p++) {
+       buf_s = (CARD16 *)buf;
+       if (!(res = _XimGetResourceListRec(res_list, res_num, p->name))) {
+           if (_XimSetInnerICAttributes(ic, top, p, mode))
+               continue;
+           return p->name;
+       }
+
+       check = _XimCheckICMode(res, mode);
+       if (check == XIM_CHECK_INVALID)
+           continue;
+       else if (check == XIM_CHECK_ERROR)
+           return p->name;
+
+       if (mode & XIM_PREEDIT_ATTR) {
+           if (!(_XimEncodePreeditValue(ic, res, p)))
+               return p->name;
+       } else if (mode & XIM_STATUS_ATTR) {
+           if (!(_XimEncodeStatusValue(ic, res, p)))
+               return p->name;
+       } else {
+           if (!(_XimEncodeTopValue(ic, res, p)))
+               return p->name;
+       }
+
+       if (res->resource_size == XimType_NEST) {
+           XimDefICValues      *ic_attr = (XimDefICValues *)top;
+
+           if (res->xrm_name == pre_quark) {
+               XIMArg          *arg_rt;
+               if ((name = _XimEncodeICATTRIBUTE(ic, res_list, res_num,
+                               (XIMArg *)p->value, &arg_rt,
+                               (char *)&buf_s[2], (size - min_len),
+                                &len, (XPointer)&ic_attr->preedit_attr, flag,
+                               (mode | XIM_PREEDIT_ATTR)))) {
+                   return name;
+               }
+
+           } else if (res->xrm_name == sts_quark) {
+               XIMArg          *arg_rt;
+               if ((name = _XimEncodeICATTRIBUTE(ic, res_list, res_num,
+                               (XIMArg *)p->value,  &arg_rt,
+                               (char *)&buf_s[2], (size - min_len),
+                                &len, (XPointer)&ic_attr->status_attr, flag,
+                               (mode | XIM_STATUS_ATTR)))) {
+                   return name;
+               }
+           }
+       } else {
+#ifdef EXT_MOVE
+           if (flag)
+               *flag |= _XimExtenArgCheck(p);
+#endif
+           if (!(_XimEncodeLocalICAttr(ic, res, top, p, mode)))
+               return p->name;
+
+           if (!(_XimValueToAttribute(res, (XPointer)&buf_s[2],
+                               (size - min_len), p->value,
+                               &len, mode, (XPointer)ic)))
+               return p->name;
+       }
+
+       if (len == 0) {
+           continue;
+       } else if (len < 0) {
+           *arg_ret = p;
+           return (char *)NULL;
+       }
+
+       buf_s[0] = res->id;                     /* attribute ID */
+       buf_s[1] = len;                         /* value length */
+       XIM_SET_PAD(&buf_s[2], len);            /* pad */
+       len += min_len;
+
+       buf += len;
+       *ret_len += len;
+       size -= len;
+    }
+    *arg_ret = (XIMArg *)NULL;
+    return (char *)NULL;
+}
+
+#ifdef XIM_CONNECTABLE
+Private Bool
+_XimEncodeSavedPreeditValue(
+    Xic                          ic,
+    XIMResourceList      res,
+    XPointer             value)
+{
+    int                          list_ret;
+    XFontStruct                **struct_list;
+    char               **name_list;
+    char                *tmp;
+    int                          len;
+    register int         i;
+
+    if (res->xrm_name == XrmStringToQuark(XNFontSet)) {
+       if (!value)
+           return False;
+
+       if (ic->private.proto.preedit_font)
+           Xfree(ic->private.proto.preedit_font);
+
+       list_ret = XFontsOfFontSet((XFontSet)value,
+                                               &struct_list, &name_list);
+       for(i = 0, len = 0; i < list_ret; i++) {
+           len += (strlen(name_list[i]) + sizeof(char));
+       }
+       if(!(tmp = Xmalloc(len + 1))) {
+           ic->private.proto.preedit_font = NULL;
+           return False;
+       }
+
+       tmp[0] = '\0';
+       for(i = 0; i < list_ret; i++) {
+           strcat(tmp, name_list[i]);
+           strcat(tmp, ",");
+       }
+       tmp[len - 1] = 0;
+       ic->private.proto.preedit_font        = tmp;
+       ic->private.proto.preedit_font_length = len - 1;
+    }
+    return True;
+}
+
+Private Bool
+_XimEncodeSavedStatusValue(
+    Xic                          ic,
+    XIMResourceList      res,
+    XPointer             value)
+{
+    int                          list_ret;
+    XFontStruct                **struct_list;
+    char               **name_list;
+    char                *tmp;
+    int                          len;
+    register int         i;
+
+    if (res->xrm_name == XrmStringToQuark(XNFontSet)) {
+       if (!value)
+           return False;
+
+       if (ic->private.proto.status_font)
+           Xfree(ic->private.proto.status_font);
+
+       list_ret = XFontsOfFontSet((XFontSet)value,
+                                               &struct_list, &name_list);
+       for(i = 0, len = 0; i < list_ret; i++) {
+           len += (strlen(name_list[i]) + sizeof(char));
+       }
+       if(!(tmp = Xmalloc(len + 1))) {
+           ic->private.proto.status_font = NULL;
+           return False;
+       }
+
+       tmp[0] = '\0';
+       for(i = 0; i < list_ret; i++) {
+           strcat(tmp, name_list[i]);
+           strcat(tmp, ",");
+       }
+       tmp[len - 1] = 0;
+       ic->private.proto.status_font        = tmp;
+       ic->private.proto.status_font_length = len - 1;
+    }
+    return True;
+}
+
+Public Bool
+_XimEncodeSavedICATTRIBUTE(
+    Xic                         ic,
+    XIMResourceList     res_list,
+    unsigned int        res_num,
+    int                        *idx,
+    char               *buf,
+    int                         size,
+    int                        *ret_len,
+    XPointer            top,
+    unsigned long       mode)
+{
+    int                         i;
+    int                         num = ic->private.proto.num_saved_icvalues;
+    XrmQuark           *quark_list = ic->private.proto.saved_icvalues;
+    XIMResourceList     res;
+    XPointer            value;
+    CARD16             *buf_s;
+    int                         len;
+    int                         min_len = sizeof(CARD16) /* sizeof attribute ID */
+                                + sizeof(INT16); /* sizeof value length */
+    XrmQuark            pre_quark;
+    XrmQuark            sts_quark;
+    XrmQuark            separator;
+
+    if (!ic->private.proto.saved_icvalues) {
+       *idx = -1;
+       *ret_len = 0;
+       return True;
+    }
+
+    pre_quark = XrmStringToQuark(XNPreeditAttributes);
+    sts_quark = XrmStringToQuark(XNStatusAttributes);
+    separator = XrmStringToQuark(XNSeparatorofNestedList);
+
+    *ret_len = 0;
+    for (i = *idx; i < num; i++) {
+       if (quark_list[i] == separator) {
+           *idx = i;
+           return True;
+       }
+
+       if (!(res = _XimGetResourceListRecByQuark(res_list,
+                                               res_num, quark_list[i])))
+           continue;
+
+       if (!_XimDecodeLocalICAttr(res, top,(XPointer)&value, mode))
+           return False;
+
+       if (mode & XIM_PREEDIT_ATTR) {
+           if (!(_XimEncodeSavedPreeditValue(ic, res, value))) {
+               return False;
+           }
+       } else if (mode & XIM_STATUS_ATTR) {
+           if (!(_XimEncodeSavedStatusValue(ic, res, value))) {
+               return False;
+           }
+       }
+
+       buf_s = (CARD16 *)buf;
+       if (res->resource_size == XimType_NEST) {
+           XimDefICValues      *ic_attr = (XimDefICValues *)top;
+
+           i++;
+           if (res->xrm_name == pre_quark) {
+               if (!_XimEncodeSavedICATTRIBUTE(ic, res_list, res_num,
+                                &i, (char *)&buf_s[2], (size - min_len),
+                                &len, (XPointer)&ic_attr->preedit_attr,
+                               (mode | XIM_PREEDIT_ATTR))) {
+                   return False;
+               }
+
+           } else if (res->xrm_name == sts_quark) {
+               if (!_XimEncodeSavedICATTRIBUTE(ic, res_list, res_num,
+                               &i, (char *)&buf_s[2], (size - min_len),
+                               &len, (XPointer)&ic_attr->status_attr,
+                               (mode | XIM_STATUS_ATTR))) {
+                   return False;
+               }
+           }
+       } else {
+           if (!(_XimValueToAttribute(res, (XPointer)&buf_s[2],
+                               (size - min_len), value,
+                               &len, mode, (XPointer)ic))) {
+               return False;
+           }
+       }
+
+       if (len == 0) {
+           continue;
+       } else if (len < 0) {
+           if (quark_list[i] == separator)
+               i++;
+           *idx = i;
+           return True;
+       }
+
+       buf_s[0] = res->id;                     /* attribute ID */
+       buf_s[1] = len;                         /* value length */
+       XIM_SET_PAD(&buf_s[2], len);            /* pad */
+       len += min_len;
+
+       buf += len;
+       *ret_len += len;
+       size -= len;
+    }
+    *idx = -1;
+    return True;
+}
+#endif /* XIM_CONNECTABLE */
+
+Private unsigned int
+_XimCountNumberOfAttr(
+    INT16       total,
+    CARD16     *attr,
+    int                *names_len)
+{
+    unsigned int n;
+    INT16       len;
+    INT16       min_len = sizeof(CARD16)       /* sizeof attribute ID */
+                        + sizeof(CARD16)       /* sizeof type of value */
+                        + sizeof(INT16);       /* sizeof length of attribute */
+
+    n = 0;
+    *names_len = 0;
+    while (total > min_len) {
+       len = attr[2];
+       *names_len += (len + 1);
+       len += (min_len + XIM_PAD(len + 2));
+       total -= len;
+       attr = (CARD16 *)((char *)attr + len);
+       n++;
+    }
+    return n;
+}
+
+Public Bool
+_XimGetAttributeID(
+    Xim                          im,
+    CARD16              *buf)
+{
+    unsigned int         n;
+    XIMResourceList      res;
+    char                *names;
+    int                          names_len;
+    XPointer             tmp;
+    XIMValuesList       *values_list;
+    char               **values;
+    int                          values_len;
+    register int         i;
+    INT16                len;
+    INT16                min_len = sizeof(CARD16) /* sizeof attribute ID */
+                                 + sizeof(CARD16) /* sizeof type of value */
+                                 + sizeof(INT16); /* sizeof length of attr */
+    /*
+     * IM attribute ID
+     */
+
+    if (!(n = _XimCountNumberOfAttr(buf[0], &buf[1], &names_len)))
+       return False;
+
+    if (!(res = Xcalloc(n, sizeof(XIMResource))))
+       return False;
+
+    values_len = sizeof(XIMValuesList) + (sizeof(char **) * n) + names_len;
+    if (!(tmp = Xcalloc(1, values_len))) {
+       Xfree(res);
+       return False;
+    }
+
+    values_list = (XIMValuesList *)tmp;
+    values = (char **)((char *)tmp + sizeof(XIMValuesList));
+    names = (char *)((char *)values + (sizeof(char **) * n));
+
+    values_list->count_values = n;
+    values_list->supported_values = values;
+
+    buf++;
+    for (i = 0; i < n; i++) {
+       len = buf[2];
+       (void)memcpy(names, (char *)&buf[3], len);
+       values[i] = names;
+       names[len] = '\0';
+       res[i].resource_name = names;
+       res[i].resource_size = buf[1];
+       res[i].id            = buf[0];
+       names += (len + 1);
+       len += (min_len + XIM_PAD(len + 2));
+       buf = (CARD16 *)((char *)buf + len);
+    }
+    _XIMCompileResourceList(res, n);
+
+    if (im->core.im_resources)
+       Xfree(im->core.im_resources);
+    if (im->core.im_values_list)
+       Xfree(im->core.im_values_list);
+    im->core.im_resources     = res;
+    im->core.im_num_resources = n;
+    im->core.im_values_list   = values_list;
+
+    /*
+     * IC attribute ID
+     */
+
+    if (!(n = _XimCountNumberOfAttr(buf[0], &buf[2], &names_len)))
+       return False;
+
+    if (!(res = Xcalloc(n, sizeof(XIMResource))))
+       return False;
+
+    values_len = sizeof(XIMValuesList) + (sizeof(char **) * n) + names_len;
+    if (!(tmp = Xcalloc(1, values_len))) {
+       Xfree(res);
+       return False;
+    }
+
+    values_list = (XIMValuesList *)tmp;
+    values = (char **)((char *)tmp + sizeof(XIMValuesList));
+    names = (char *)((char *)values + (sizeof(char **) * n));
+
+    values_list->count_values = n;
+    values_list->supported_values = values;
+
+    buf += 2;
+    for (i = 0; i < n; i++) {
+       len = buf[2];
+       (void)memcpy(names, (char *)&buf[3], len);
+       values[i] = names;
+       names[len] = '\0';
+       res[i].resource_name = names;
+       res[i].resource_size = buf[1];
+       res[i].id            = buf[0];
+       names += (len + 1);
+       len += (min_len + XIM_PAD(len + 2));
+       buf = (CARD16 *)((char *)buf + len);
+    }
+    _XIMCompileResourceList(res, n);
+
+    if (im->core.ic_resources)
+       Xfree(im->core.ic_resources);
+    if (im->core.ic_values_list)
+       Xfree(im->core.ic_values_list);
+    im->core.ic_resources     = res;
+    im->core.ic_num_resources = n;
+    im->core.ic_values_list   = values_list;
+
+    return True;
+}
diff --git a/modules/im/ximcp/imThaiFlt.c b/modules/im/ximcp/imThaiFlt.c
new file mode 100644 (file)
index 0000000..12e3de2
--- /dev/null
@@ -0,0 +1,1421 @@
+/***********************************************************
+
+Copyright 1993, 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 1993 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.
+
+******************************************************************/
+
+/*
+**++
+**  FACILITY:
+**
+**      Xlib
+**
+**  ABSTRACT:
+**
+**     Thai specific functions.
+**     Handles character classifications, composibility checking,
+**     Input sequence check and other Thai specific requirements
+**     according to WTT specification and DEC extensions.
+**
+**  MODIFICATION HISTORY:
+**
+**/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include <X11/Xlib.h>
+#include <X11/Xmd.h>
+#include <X11/keysym.h>
+#include <X11/Xutil.h>
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "Ximint.h"
+#include "XimThai.h"
+#include "XlcPubI.h"
+
+
+#define SPACE   32
+
+/* character classification table */
+#define TACTIS_CHARS 256
+Private
+char const tactis_chtype[TACTIS_CHARS] = {
+    CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,  /*  0 -  7 */
+    CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,  /*  8 - 15 */
+    CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,  /* 16 - 23 */
+    CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,  /* 24 - 31 */
+    NON,  NON,  NON,  NON,  NON,  NON,  NON,  NON,   /* 32 - 39 */
+    NON,  NON,  NON,  NON,  NON,  NON,  NON,  NON,   /* 40 - 47 */
+    NON,  NON,  NON,  NON,  NON,  NON,  NON,  NON,   /* 48 - 55 */
+    NON,  NON,  NON,  NON,  NON,  NON,  NON,  NON,   /* 56 - 63 */
+    NON,  NON,  NON,  NON,  NON,  NON,  NON,  NON,   /* 64 - 71 */
+    NON,  NON,  NON,  NON,  NON,  NON,  NON,  NON,   /* 72 - 79 */
+    NON,  NON,  NON,  NON,  NON,  NON,  NON,  NON,   /* 80 - 87 */
+    NON,  NON,  NON,  NON,  NON,  NON,  NON,  NON,   /* 88 - 95 */
+    NON,  NON,  NON,  NON,  NON,  NON,  NON,  NON,   /* 96 - 103 */
+    NON,  NON,  NON,  NON,  NON,  NON,  NON,  NON,   /* 104 - 111 */
+    NON,  NON,  NON,  NON,  NON,  NON,  NON,  NON,   /* 112 - 119 */
+    NON,  NON,  NON,  NON,  NON,  NON,  NON,  CTRL,  /* 120 - 127 */
+    CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,  /* 128 - 135 */
+    CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,  /* 136 - 143 */
+    CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,  /* 144 - 151 */
+    CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, CTRL,  /* 152 - 159 */
+    NON,  CONS, CONS, CONS, CONS, CONS, CONS, CONS,  /* 160 - 167 */
+    CONS, CONS, CONS, CONS, CONS, CONS, CONS, CONS,  /* 168 - 175 */
+    CONS, CONS, CONS, CONS, CONS, CONS, CONS, CONS,  /* 176 - 183 */
+    CONS, CONS, CONS, CONS, CONS, CONS, CONS, CONS,  /* 184 - 191 */
+    CONS, CONS, CONS, CONS,  FV3, CONS,  FV3, CONS,  /* 192 - 199 */
+    CONS, CONS, CONS, CONS, CONS, CONS, CONS, NON,   /* 200 - 207 */
+    FV1,  AV2,  FV1,  FV1,  AV1,  AV3,  AV2,  AV3,   /* 208 - 215 */
+    BV1,  BV2,  BD,   NON,  NON,  NON,  NON,  NON,   /* 216 - 223 */
+    LV,   LV,   LV,   LV,   LV,   FV2,  NON,  AD2,   /* 224 - 231 */
+    TONE, TONE, TONE, TONE, AD1,  AD1,  AD3,  NON,   /* 232 - 239 */
+    NON,  NON,  NON,  NON,  NON,  NON,  NON,  NON,   /* 240 - 247 */
+    NON,  NON,  NON,  NON,  NON,  NON,  NON,  CTRL   /* 248 - 255 */
+};
+
+/* Composibility checking tables */
+#define NC  0   /* NOT COMPOSIBLE - following char displays in next cell */
+#define CP  1   /* COMPOSIBLE - following char is displayed in the same cell
+                                as leading char, also implies ACCEPT */
+#define XC  3   /* Non-display */
+#define AC  4   /* ACCEPT - display the following char in the next cell */
+#define RJ  5   /* REJECT - discard that following char, ignore it */
+
+#define CH_CLASSES      17  /* 17 classes of chars */
+
+Private
+char const write_rules_lookup[CH_CLASSES][CH_CLASSES] = {
+        /* Table 0: writing/outputing rules */
+        /* row: leading char,  column: following char */
+/* CTRL NON CONS LV FV1 FV2 FV3 BV1 BV2 BD TONE AD1 AD2 AD3 AV1 AV2 AV3 */
+   {XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*CTRL*/
+  ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*NON*/
+  ,{XC, NC, NC, NC, NC, NC, NC, CP, CP, CP, CP, CP, CP, CP, CP, CP, CP}/*CONS*/
+  ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*LV*/
+  ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*FV1*/
+  ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*FV2*/
+  ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*FV3*/
+  ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, CP, CP, NC, NC, NC, NC, NC}/*BV1*/
+  ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, CP, NC, NC, NC, NC, NC, NC}/*BV2*/
+  ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*BD*/
+  ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*TONE*/
+  ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*AD1*/
+  ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*AD2*/
+  ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC, NC}/*AD3*/
+  ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, CP, CP, NC, NC, NC, NC, NC}/*AV1*/
+  ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, CP, NC, NC, NC, NC, NC, NC}/*AV2*/
+  ,{XC, NC, NC, NC, NC, NC, NC, NC, NC, NC, CP, NC, CP, NC, NC, NC, NC}/*AV3*/
+};
+
+Private
+char const wtt_isc1_lookup[CH_CLASSES][CH_CLASSES] = {
+      /* Table 1: WTT default input sequence check rules */
+      /* row: leading char,  column: following char */
+/* CTRL NON CONS LV FV1 FV2 FV3 BV1 BV2 BD TONE AD1 AD2 AD3 AV1 AV2 AV3 */
+   {XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*CTRL*/
+  ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*NON*/
+  ,{XC, AC, AC, AC, AC, AC, AC, CP, CP, CP, CP, CP, CP, CP, CP, CP, CP}/*CONS*/
+  ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*LV*/
+  ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*FV1*/
+  ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*FV2*/
+  ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*FV3*/
+  ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, CP, CP, RJ, RJ, RJ, RJ, RJ}/*BV1*/
+  ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, CP, RJ, RJ, RJ, RJ, RJ, RJ}/*BV2*/
+  ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*BD*/
+  ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*TONE*/
+  ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*AD1*/
+  ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*AD2*/
+  ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*AD3*/
+  ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, CP, CP, RJ, RJ, RJ, RJ, RJ}/*AV1*/
+  ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, CP, RJ, RJ, RJ, RJ, RJ, RJ}/*AV2*/
+  ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, CP, RJ, CP, RJ, RJ, RJ, RJ}/*AV3*/
+};
+
+Private
+char const wtt_isc2_lookup[CH_CLASSES][CH_CLASSES] = {
+      /* Table 2: WTT strict input sequence check rules */
+      /* row: leading char,  column: following char */
+/* CTRL NON CONS LV FV1 FV2 FV3 BV1 BV2 BD TONE AD1 AD2 AD3 AV1 AV2 AV3 */
+   {XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*CTRL*/
+  ,{XC, AC, AC, AC, RJ, RJ, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*NON*/
+  ,{XC, AC, AC, AC, AC, RJ, AC, CP, CP, CP, CP, CP, CP, CP, CP, CP, CP}/*CONS*/
+  ,{XC, RJ, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*LV*/
+  ,{XC, AC, AC, AC, AC, RJ, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*FV1*/
+  ,{XC, AC, AC, AC, AC, RJ, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*FV2*/
+  ,{XC, AC, AC, AC, RJ, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*FV3*/
+  ,{XC, AC, AC, AC, AC, RJ, AC, RJ, RJ, RJ, CP, CP, RJ, RJ, RJ, RJ, RJ}/*BV1*/
+  ,{XC, AC, AC, AC, RJ, RJ, AC, RJ, RJ, RJ, CP, RJ, RJ, RJ, RJ, RJ, RJ}/*BV2*/
+  ,{XC, AC, AC, AC, RJ, RJ, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*BD*/
+  ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*TONE*/
+  ,{XC, AC, AC, AC, RJ, RJ, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*AD1*/
+  ,{XC, AC, AC, AC, RJ, RJ, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*AD2*/
+  ,{XC, AC, AC, AC, RJ, RJ, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*AD3*/
+  ,{XC, AC, AC, AC, RJ, RJ, AC, RJ, RJ, RJ, CP, CP, RJ, RJ, RJ, RJ, RJ}/*AV1*/
+  ,{XC, AC, AC, AC, RJ, RJ, AC, RJ, RJ, RJ, CP, RJ, RJ, RJ, RJ, RJ, RJ}/*AV2*/
+  ,{XC, AC, AC, AC, RJ, RJ, AC, RJ, RJ, RJ, CP, RJ, CP, RJ, RJ, RJ, RJ}/*AV3*/
+};
+
+Private
+char const thaicat_isc_lookup[CH_CLASSES][CH_CLASSES] = {
+      /* Table 3: Thaicat input sequence check rules */
+      /* row: leading char,  column: following char */
+/* CTRL NON CONS LV FV1 FV2 FV3 BV1 BV2 BD TONE AD1 AD2 AD3 AV1 AV2 AV3 */
+   {XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*CTRL*/
+  ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*NON*/
+  ,{XC, AC, AC, AC, AC, AC, AC, CP, CP, CP, CP, CP, CP, CP, CP, CP, CP}/*CONS*/
+  ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*LV*/
+  ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*FV1*/
+  ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*FV2*/
+  ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ} /*FV3*/
+  ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, CP, CP, RJ, RJ, RJ, RJ, RJ}/*BV1*/
+  ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, CP, RJ, RJ, RJ, RJ, RJ, RJ}/*BV2*/
+  ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*BD*/
+  ,{XC, AC, AC, AC, AC, AC, AC, CP, CP, RJ, RJ, RJ, RJ, RJ, CP, CP, CP}/*TONE*/
+  ,{XC, AC, AC, AC, AC, AC, AC, CP, RJ, RJ, RJ, RJ, RJ, RJ, CP, RJ, RJ}/*AD1*/
+  ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, CP}/*AD2*/
+  ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ, RJ}/*AD3*/
+  ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, CP, CP, RJ, RJ, RJ, RJ, RJ}/*AV1*/
+  ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, CP, RJ, RJ, RJ, RJ, RJ, RJ}/*AV2*/
+  ,{XC, AC, AC, AC, AC, AC, AC, RJ, RJ, RJ, CP, RJ, CP, RJ, RJ, RJ, RJ}/*AV3*/
+};
+
+
+/* returns classification of a char */
+Private int
+THAI_chtype (unsigned char     ch)
+{
+    return tactis_chtype[ch];
+}
+
+#ifdef UNUSED
+/* returns the display level */
+Private int
+THAI_chlevel (unsigned char    ch)
+{
+    int     chlevel;
+
+    switch (tactis_chtype[ch])
+    {
+        case CTRL:
+            chlevel = NON;
+            break;
+        case BV1:
+        case BV2:
+        case BD:
+            chlevel = BELOW;
+            break;
+        case TONE:
+        case AD1:
+        case AD2:
+            chlevel = TOP;
+            break;
+        case AV1:
+        case AV2:
+        case AV3:
+        case AD3:
+            chlevel = ABOVE;
+            break;
+        case NON:
+        case CONS:
+        case LV:
+        case FV1:
+        case FV2:
+        case FV3:
+        default: /* if tactis_chtype is invalid */
+            chlevel = BASE;
+            break;
+    }
+    return chlevel;
+}
+
+
+/* return True if char is non-spacing */
+Private Bool
+THAI_isdead (unsigned char     ch)
+{
+    return ((tactis_chtype[ch] == CTRL) || (tactis_chtype[ch] == BV1) ||
+            (tactis_chtype[ch] == BV2)  || (tactis_chtype[ch] == BD)  ||
+            (tactis_chtype[ch] == TONE) || (tactis_chtype[ch] == AD1) ||
+            (tactis_chtype[ch] == AD2)  || (tactis_chtype[ch] == AD3) ||
+            (tactis_chtype[ch] == AV1)  || (tactis_chtype[ch] == AV2) ||
+            (tactis_chtype[ch] == AV3));
+}
+
+
+/* return True if char is consonant */
+Private Bool
+THAI_iscons (unsigned char     ch)
+{
+    return (tactis_chtype[ch] == CONS);
+}
+
+
+/* return True if char is vowel */
+Private Bool
+THAI_isvowel (unsigned char    ch)
+{
+    return ((tactis_chtype[ch] == LV)  || (tactis_chtype[ch] == FV1) ||
+            (tactis_chtype[ch] == FV2) || (tactis_chtype[ch] == FV3) ||
+            (tactis_chtype[ch] == BV1) || (tactis_chtype[ch] == BV2) ||
+            (tactis_chtype[ch] == AV1) || (tactis_chtype[ch] == AV2) ||
+            (tactis_chtype[ch] == AV3));
+}
+
+
+/* return True if char is tonemark */
+Private Bool
+THAI_istone (unsigned char     ch)
+{
+    return (tactis_chtype[ch] == TONE);
+}
+#endif
+
+Private Bool
+THAI_iscomposible (
+    unsigned char      follow_ch,
+    unsigned char      lead_ch)
+{/* "Can follow_ch be put in the same display cell as lead_ch?" */
+
+    return (write_rules_lookup[THAI_chtype(lead_ch)][THAI_chtype(follow_ch)]
+            == CP);
+}
+
+Private Bool
+THAI_isaccepted (
+    unsigned char      follow_ch,
+    unsigned char      lead_ch,
+    unsigned char      mode)
+{
+    Bool iskeyvalid; /*  means "Can follow_ch be keyed in after lead_ch?" */
+
+    switch (mode)
+    {
+        case WTT_ISC1:
+            iskeyvalid =
+          (wtt_isc1_lookup[THAI_chtype(lead_ch)][THAI_chtype(follow_ch)] != RJ);
+            break;
+        case WTT_ISC2:
+            iskeyvalid =
+          (wtt_isc2_lookup[THAI_chtype(lead_ch)][THAI_chtype(follow_ch)] != RJ);
+            break;
+        case THAICAT_ISC:
+            iskeyvalid =
+       (thaicat_isc_lookup[THAI_chtype(lead_ch)][THAI_chtype(follow_ch)] != RJ);
+            break;
+        default:
+            iskeyvalid = True;
+            break;
+    }
+
+    return iskeyvalid;
+}
+
+#ifdef UNUSED
+Private void
+THAI_apply_write_rules(
+    unsigned char      *instr,
+    unsigned char      *outstr,
+    unsigned char      insert_ch,
+    int                *num_insert_ch)
+{
+/*
+Input parameters:
+    instr - input string
+    insert_ch specify what char to be added when invalid composition is found
+Output parameters:
+    outstr - output string after input string has been applied the rules
+    num_insert_ch - number of insert_ch added to outstr.
+*/
+    unsigned char   *lead_ch = NULL, *follow_ch = NULL, *out_ch = NULL;
+
+    *num_insert_ch = 0;
+    lead_ch = follow_ch = instr;
+    out_ch = outstr;
+    if ((*lead_ch == '\0') || !(THAI_find_chtype(instr,DEAD)))
+    {   /* Empty string or can't find any non-spacing char*/
+        strcpy((char *)outstr, (char *)instr);
+    } else { /* String of length >= 1, keep looking */
+        follow_ch++;
+        if (THAI_isdead(*lead_ch)) { /* is first char non-spacing? */
+            *out_ch++ = SPACE;
+            (*num_insert_ch)++;
+        }
+        *out_ch++ = *lead_ch;
+        while (*follow_ch != '\0')  /* more char in string to check */
+        {
+            if (THAI_isdead(*follow_ch) &&
+                 !THAI_iscomposible(*follow_ch,*lead_ch))
+            {
+                *out_ch++ = SPACE;
+                (*num_insert_ch)++;
+            }
+            *out_ch++ = *follow_ch;
+            lead_ch = follow_ch;
+            follow_ch++;
+        }
+        *out_ch = '\0';
+    }
+}
+
+Private int
+THAI_find_chtype (
+    unsigned char      *instr,
+    int                chtype)
+{
+/*
+Input parameters:
+    instr - input string
+    chtype - type of character to look for
+Output parameters:
+    function returns first position of character with matched chtype
+    function returns -1 if it does not find.
+*/
+    int i = 0, position = -1;
+
+    switch (chtype)
+    {
+        case DEAD:
+            for (i = 0; *instr != '\0' && THAI_isdead(*instr); i++, instr++)
+               ;
+            if (*instr != '\0') position = i;
+            break;
+        default:
+            break;
+    }
+    return position;
+}
+
+
+Private int
+THAI_apply_scm(
+    unsigned char      *instr,
+    unsigned char      *outstr,
+    unsigned char      spec_ch,
+    int                num_sp,
+    unsigned char      insert_ch)
+{
+    unsigned char   *scan, *outch;
+    int             i, dead_count, found_count;
+    Bool            isconsecutive;
+
+    scan = instr;
+    outch = outstr;
+    dead_count = found_count = 0;
+    isconsecutive = False;
+    while (*scan != '\0') {
+        if (THAI_isdead(*scan))
+            dead_count++;       /* count number of non-spacing char */
+        if (*scan == spec_ch)
+            if (!isconsecutive)
+                found_count++;      /* count number consecutive spec char found */
+        *outch++ = *scan++;
+        if (found_count == num_sp) {
+            for (i = 0; i < dead_count; i++)
+                *outch++ = insert_ch;
+            dead_count = found_count = 0;
+        }
+    }
+    /* what to return? */
+    return 0; /* probably not right but better than returning garbage */
+}
+
+
+/* The following functions are copied from XKeyBind.c */
+
+Private void ComputeMaskFromKeytrans();
+Private int IsCancelComposeKey(KeySym *symbol, XKeyEvent *event);
+Private void SetLed(Display *dpy, int num, int state);
+Private CARD8 FindKeyCode();
+
+
+/* The following functions are specific to this module */
+
+Private int XThaiTranslateKey();
+Private int XThaiTranslateKeySym();
+
+
+Private KeySym HexIMNormalKey(
+    XicThaiPart *thai_part,
+    KeySym symbol,
+    XKeyEvent *event);
+Private KeySym HexIMFirstComposeKey(
+    XicThaiPart *thai_part,
+    KeySym symbol,
+    XKeyEvent *event);
+Private KeySym HexIMSecondComposeKey(
+    XicThaiPart *thai_part,
+    KeySym symbol
+    XKeyEvent *event);
+Private KeySym HexIMComposeSequence(KeySym ks1, KeySym ks2);
+Private void InitIscMode(Xic ic);
+Private Bool ThaiComposeConvert(
+    Display *dpy,
+    KeySym insym,
+    KeySym *outsym, KeySym *lower, KeySym *upper);
+#endif
+
+/*
+ * Definitions
+ */
+
+#define BellVolume             0
+
+#define ucs2tis(wc)  \
+ (unsigned char) ( \
+   (0<=(wc)&&(wc)<=0x7F) ? \
+     (wc) : \
+     ((0x0E01<=(wc)&&(wc)<=0x0E5F) ? ((wc)-0x0E00+0xA0) : 0))
+/* "c" is an unsigned char */
+#define tis2ucs(c)  \
+  ( \
+   ((c)<=0x7F) ? \
+     (wchar_t)(c) : \
+     ((0x0A1<=(c)) ? ((wchar_t)(c)-0xA0+0x0E00) : 0))
+
+/*
+ * Macros to save and recall last input character in XIC
+ */
+#define IC_SavePreviousChar(ic,ch) \
+                ((ic)->private.local.base.mb[(ic)->private.local.base.tree[(ic)->private.local.context].mb] = (char) (ch))
+#define IC_ClearPreviousChar(ic) \
+                ((ic)->private.local.base.mb[(ic)->private.local.base.tree[(ic)->private.local.context].mb] = 0)
+#define IC_GetPreviousChar(ic) \
+               (IC_RealGetPreviousChar(ic,1))
+#define IC_GetContextChar(ic) \
+               (IC_RealGetPreviousChar(ic,2))
+#define IC_DeletePreviousChar(ic) \
+               (IC_RealDeletePreviousChar(ic))
+
+Private unsigned char
+IC_RealGetPreviousChar(Xic ic, unsigned short pos)
+{
+    XICCallback* cb = &ic->core.string_conversion_callback;
+    DefTreeBase *b = &ic->private.local.base;
+
+    if (cb && cb->callback) {
+        XIMStringConversionCallbackStruct screc;
+        unsigned char c;
+
+        /* Use a safe value of position = 0 and stretch the range to desired
+         * place, as XIM protocol is unclear here whether it could be negative
+         */
+        screc.position = 0;
+        screc.direction = XIMBackwardChar;
+        screc.operation = XIMStringConversionRetrieval;
+        screc.factor = pos;
+        screc.text = 0;
+
+        (cb->callback)((XIC)ic, cb->client_data, (XPointer)&screc);
+        if (!screc.text)
+            return (unsigned char) b->mb[b->tree[(ic)->private.local.context].mb];
+        if ((screc.text->feedback &&
+             *screc.text->feedback == XIMStringConversionLeftEdge) ||
+            screc.text->length < 1)
+        {
+            c = 0;
+        } else {
+            Xim     im;
+            XlcConv conv;
+            int     from_left;
+            int     to_left;
+            char   *from_buf;
+            char   *to_buf;
+
+            im = (Xim) XIMOfIC((XIC)ic);
+            if (screc.text->encoding_is_wchar) {
+                conv = _XlcOpenConverter(im->core.lcd, XlcNWideChar,
+                                         im->core.lcd, XlcNCharSet);
+                from_buf = (char *) screc.text->string.wcs;
+                from_left = screc.text->length * sizeof(wchar_t);
+            } else {
+                conv = _XlcOpenConverter(im->core.lcd, XlcNMultiByte,
+                                         im->core.lcd, XlcNCharSet);
+                from_buf = screc.text->string.mbs;
+                from_left = screc.text->length;
+            }
+            to_buf = (char *)&c;
+            to_left = 1;
+
+            _XlcResetConverter(conv);
+            if (_XlcConvert(conv, (XPointer *)&from_buf, &from_left,
+                            (XPointer *)&to_buf, &to_left, NULL, 0) < 0)
+            {
+                c = (unsigned char) b->mb[b->tree[(ic)->private.local.context].mb];
+            }
+            _XlcCloseConverter(conv);
+
+            XFree(screc.text->string.mbs);
+        }
+        XFree(screc.text);
+        return c;
+    } else {
+        return (unsigned char) b->mb[b->tree[(ic)->private.local.context].mb];
+    }
+}
+
+Private unsigned char
+IC_RealDeletePreviousChar(Xic ic)
+{
+    XICCallback* cb = &ic->core.string_conversion_callback;
+
+    if (cb && cb->callback) {
+        XIMStringConversionCallbackStruct screc;
+        unsigned char c;
+
+        screc.position = 0;
+        screc.direction = XIMBackwardChar;
+        screc.operation = XIMStringConversionSubstitution;
+        screc.factor = 1;
+        screc.text = 0;
+
+        (cb->callback)((XIC)ic, cb->client_data, (XPointer)&screc);
+        if (!screc.text) { return 0; }
+        if ((screc.text->feedback &&
+             *screc.text->feedback == XIMStringConversionLeftEdge) ||
+            screc.text->length < 1)
+        {
+            c = 0;
+        } else {
+            if (screc.text->encoding_is_wchar) {
+                c = ucs2tis(screc.text->string.wcs[0]);
+                XFree(screc.text->string.wcs);
+            } else {
+                c = screc.text->string.mbs[0];
+                XFree(screc.text->string.mbs);
+            }
+        }
+        XFree(screc.text);
+        return c;
+    } else {
+        return 0;
+    }
+}
+/*
+ * Input sequence check mode in XIC
+ */
+#define IC_IscMode(ic)         ((ic)->private.local.thai.input_mode)
+
+/*
+ * Max. size of string handled by the two String Lookup functions.
+ */
+#define STR_LKUP_BUF_SIZE      256
+
+/*
+ * Size of buffer to contain previous locale name.
+ */
+#define SAV_LOCALE_NAME_SIZE   256
+
+/*
+ * Size of buffer to contain the IM modifier.
+ */
+#define MAXTHAIIMMODLEN 20
+
+#define AllMods (ShiftMask|LockMask|ControlMask| \
+                Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask)
+
+
+#define IsISOControlKey(ks) ((ks) >= XK_2 && (ks) <= XK_8)
+
+#define IsValidControlKey(ks)   (((((ks)>=XK_A && (ks)<=XK_asciitilde) || \
+                (ks)==XK_space || (ks)==XK_Delete) && \
+                ((ks)!=0)))
+
+#define COMPOSE_LED 2
+
+#ifdef UNUSED
+typedef KeySym (*StateProc)(
+    XicThaiPart *thai_part,
+    KeySym symbol,
+    XKeyEvent *event);
+
+
+/*
+ * macros to classify XKeyEvent state field
+ */
+
+#define IsShift(state) (((state) & ShiftMask) != 0)
+#define IsLock(state) (((state) & LockMask) != 0)
+#define IsControl(state) (((state) & ControlMask) != 0)
+#define IsMod1(state) (((state) & Mod1Mask) != 0)
+#define IsMod2(state) (((state) & Mod2Mask) != 0)
+#define IsMod3(state) (((state) & Mod3Mask) != 0)
+#define IsMod4(state) (((state) & Mod4Mask) != 0)
+#define IsMod5(state) (((state) & Mod5Mask) != 0)
+
+/*
+ * key starts Thai compose sequence (Hex input method) if :
+ */
+
+#define IsComposeKey(ks, event)  \
+       (( ks==XK_Alt_L &&      \
+          IsControl((event)->state) && \
+          !IsShift((event)->state))    \
+        ? True : False)
+
+
+/*
+ *  State handler to implement the Thai hex input method.
+ */
+
+Private int const nstate_handlers = 3;
+Private StateProc state_handler[] = {
+       HexIMNormalKey,
+       HexIMFirstComposeKey,
+       HexIMSecondComposeKey
+};
+
+
+/*
+ *  Table for 'Thai Compose' character input.
+ *  The current implementation uses latin-1 keysyms.
+ */
+struct _XMapThaiKey {
+       KeySym from;
+       KeySym to;
+};
+
+Private struct _XMapThaiKey const ThaiComposeTable[] = {
+       { /* 0xa4 */ XK_currency,       /* 0xa5 */ XK_yen },
+       { /* 0xa2 */ XK_cent,           /* 0xa3 */ XK_sterling },
+       { /* 0xe6 */ XK_ae,             /* 0xef */ XK_idiaeresis },
+       { /* 0xd3 */ XK_Oacute,         /* 0xee */ XK_icircumflex },
+       { /* 0xb9 */ XK_onesuperior,    /* 0xfa */ XK_uacute },
+       { /* 0xd2 */ XK_Ograve,         /* 0xe5 */ XK_aring },
+       { /* 0xbc */ XK_onequarter,     /* 0xfb */ XK_ucircumflex },
+       {            XK_VoidSymbol,                XK_VoidSymbol }
+};
+
+struct _XKeytrans {
+       struct _XKeytrans *next;/* next on list */
+       char *string;           /* string to return when the time comes */
+       int len;                /* length of string (since NULL is legit)*/
+       KeySym key;             /* keysym rebound */
+       unsigned int state;     /* modifier state */
+       KeySym *modifiers;      /* modifier keysyms you want */
+       int mlen;               /* length of modifier list */
+};
+
+
+/* Convert keysym to 'Thai Compose' keysym */
+/* The current implementation use latin-1 keysyms */
+Private Bool
+ThaiComposeConvert(
+    Display *dpy,
+    KeySym insym,
+    KeySym *outsym, KeySym *lower, KeySym *upper)
+{
+    struct _XMapThaiKey const *table_entry = ThaiComposeTable;
+
+    while (table_entry->from != XK_VoidSymbol) {
+       if (table_entry->from == insym) {
+           *outsym = table_entry->to;
+           *lower = *outsym;
+           *upper = *outsym;
+           return True;
+       }
+       table_entry++;
+    }
+    return False;
+}
+
+Private int
+XThaiTranslateKey(
+    register Display *dpy,
+    KeyCode keycode,
+    register unsigned int modifiers,
+    unsigned int *modifiers_return,
+    KeySym *keysym_return,
+    KeySym *lsym_return,
+    KeySym *usym_return)
+{
+    int per;
+    register KeySym *syms;
+    KeySym sym = 0, lsym = 0, usym = 0;
+
+    if ((! dpy->keysyms) && (! _XKeyInitialize(dpy)))
+       return 0;
+    *modifiers_return = (ShiftMask|LockMask) | dpy->mode_switch;
+    if (((int)keycode < dpy->min_keycode) || ((int)keycode > dpy->max_keycode))
+    {
+       *keysym_return = NoSymbol;
+       return 1;
+    }
+    per = dpy->keysyms_per_keycode;
+    syms = &dpy->keysyms[(keycode - dpy->min_keycode) * per];
+    while ((per > 2) && (syms[per - 1] == NoSymbol))
+       per--;
+    if ((per > 2) && (modifiers & dpy->mode_switch)) {
+       syms += 2;
+       per -= 2;
+    }
+    if (!(modifiers & ShiftMask) &&
+       (!(modifiers & LockMask) || (dpy->lock_meaning == NoSymbol))) {
+       if ((per == 1) || (syms[1] == NoSymbol))
+           XConvertCase(syms[0], keysym_return, &usym);
+       else {
+           XConvertCase(syms[0], &lsym, &usym);
+           *keysym_return = syms[0];
+       }
+    } else if (!(modifiers & LockMask) ||
+              (dpy->lock_meaning != XK_Caps_Lock)) {
+       if ((per == 1) || ((usym = syms[1]) == NoSymbol))
+           XConvertCase(syms[0], &lsym, &usym);
+       *keysym_return = usym;
+    } else {
+       if ((per == 1) || ((sym = syms[1]) == NoSymbol))
+           sym = syms[0];
+       XConvertCase(sym, &lsym, &usym);
+       if (!(modifiers & ShiftMask) && (sym != syms[0]) &&
+           ((sym != usym) || (lsym == usym)))
+           XConvertCase(syms[0], &lsym, &usym);
+       *keysym_return = usym;
+    }
+    /*
+     * ThaiCat keyboard support :
+     * When the Shift and Thai keys are hold for some keys a 'Thai Compose'
+     * character code is generated which is different from column 3 and
+     * 4 of the keymap.
+     * Since we don't know whether ThaiCat keyboard or WTT keyboard is
+     * in use, the same mapping is done for all Thai input.
+     * We just arbitary choose to use column 3 keysyms as the indices of
+     * this mapping.
+     * When the control key is also hold, this mapping has no effect.
+     */
+    if ((modifiers & Mod1Mask) &&
+       (modifiers & ShiftMask) &&
+       !(modifiers & ControlMask)) {
+       if (ThaiComposeConvert(dpy, syms[0], &sym, &lsym, &usym))
+           *keysym_return = sym;
+    }
+
+    if (*keysym_return == XK_VoidSymbol)
+       *keysym_return = NoSymbol;
+    *lsym_return = lsym;
+    *usym_return = usym;
+    return 1;
+}
+
+/*
+ * XThaiTranslateKeySym
+ *
+ * Translate KeySym to TACTIS code output.
+ * The current implementation uses ISO latin-1 keysym.
+ * Should be changed to TACTIS keysyms when they are defined by the
+ * standard.
+ */
+Private int
+XThaiTranslateKeySym(
+    Display *dpy,
+    register KeySym symbol,
+    register KeySym lsym,
+    register KeySym usym,
+    unsigned int modifiers,
+    unsigned char *buffer,
+    int nbytes)
+{
+    KeySym ckey = 0;
+    register struct _XKeytrans *p;
+    int length;
+    unsigned long hiBytes;
+    register unsigned char c;
+
+    /*
+     * initialize length = 1 ;
+     */
+    length = 1;
+
+    if (!symbol)
+       return 0;
+    /* see if symbol rebound, if so, return that string. */
+    for (p = dpy->key_bindings; p; p = p->next) {
+       if (((modifiers & AllMods) == p->state) && (symbol == p->key)) {
+           length = p->len;
+           if (length > nbytes) length = nbytes;
+           memcpy (buffer, p->string, length);
+           return length;
+       }
+    }
+    /* try to convert to TACTIS, handling control */
+    hiBytes = symbol >> 8;
+    if (!(nbytes &&
+         ((hiBytes == 0) ||
+          ((hiBytes == 0xFF) &&
+           (((symbol >= XK_BackSpace) && (symbol <= XK_Clear)) ||
+            (symbol == XK_Return) ||
+            (symbol == XK_Escape) ||
+            (symbol == XK_KP_Space) ||
+            (symbol == XK_KP_Tab) ||
+            (symbol == XK_KP_Enter) ||
+            ((symbol >= XK_KP_Multiply) && (symbol <= XK_KP_9)) ||
+            (symbol == XK_KP_Equal) ||
+             (symbol == XK_Scroll_Lock) ||
+#ifdef DXK_PRIVATE /* DEC private keysyms */
+             (symbol == DXK_Remove) ||
+#endif
+             (symbol == NoSymbol) ||
+            (symbol == XK_Delete))))))
+       return 0;
+
+    /* if X keysym, convert to ascii by grabbing low 7 bits */
+    if (symbol == XK_KP_Space)
+       c = XK_space & 0x7F; /* patch encoding botch */
+/* not for Thai
+    else if (symbol == XK_hyphen)
+       c = XK_minus & 0xFF; */ /* map to equiv character */
+    else if (hiBytes == 0xFF)
+       c = symbol & 0x7F;
+    else
+       c = symbol & 0xFF;
+    /* only apply Control key if it makes sense, else ignore it */
+    if (modifiers & ControlMask) {
+    if (!(IsKeypadKey(lsym) || lsym==XK_Return || lsym==XK_Tab)) {
+        if (IsISOControlKey(lsym)) ckey = lsym;
+        else if (IsISOControlKey(usym)) ckey = usym;
+        else if (lsym == XK_question) ckey = lsym;
+        else if (usym == XK_question) ckey = usym;
+        else if (IsValidControlKey(lsym)) ckey = lsym;
+        else if (IsValidControlKey(usym)) ckey = usym;
+        else length = 0;
+
+        if (length != 0) {
+        if (ckey == XK_2) c = '\000';
+        else if (ckey >= XK_3 && ckey <= XK_7)
+            c = (char)(ckey-('3'-'\033'));
+        else if (ckey == XK_8) c = '\177';
+        else if (ckey == XK_Delete) c = '\030';
+        else if (ckey == XK_question) c = '\037';
+        else if (ckey == XK_quoteleft) c = '\036';  /* KLee 1/24/91 */
+        else c = (char)(ckey & 0x1f);
+        }
+    }
+    }
+    /*
+     *  ThaiCat has a key that generates two TACTIS codes D1 & E9.
+     *  It is represented by the latin-1 keysym XK_thorn (0xfe).
+     *  If c is XK_thorn, this key is pressed and it is converted to
+     *  0xd1 0xe9.
+     */
+    if (c == XK_thorn) {
+       buffer[0] = 0xd1;
+       buffer[1] = 0xe9;
+       buffer[2] = '\0';
+       return 2;
+    }
+    else {
+       /* Normal case */
+        buffer[0] = c;
+       buffer[1] = '\0';
+        return 1;
+    }
+}
+
+/*
+ * given a KeySym, returns the first keycode containing it, if any.
+ */
+Private CARD8
+FindKeyCode(
+    register Display *dpy,
+    register KeySym code)
+{
+
+    register KeySym *kmax = dpy->keysyms +
+       (dpy->max_keycode - dpy->min_keycode + 1) * dpy->keysyms_per_keycode;
+    register KeySym *k = dpy->keysyms;
+    while (k < kmax) {
+       if (*k == code)
+           return (((k - dpy->keysyms) / dpy->keysyms_per_keycode) +
+                   dpy->min_keycode);
+       k += 1;
+       }
+    return 0;
+}
+
+/*
+ * given a list of modifiers, computes the mask necessary for later matching.
+ * This routine must lookup the key in the Keymap and then search to see
+ * what modifier it is bound to, if any.  Sets the AnyModifier bit if it
+ * can't map some keysym to a modifier.
+ */
+Private void
+ComputeMaskFromKeytrans(
+    Display *dpy,
+    register struct _XKeytrans *p)
+{
+    register int i;
+    register CARD8 code;
+    register XModifierKeymap *m = dpy->modifiermap;
+
+    p->state = AnyModifier;
+    for (i = 0; i < p->mlen; i++) {
+       /* if not found, then not on current keyboard */
+       if ((code = FindKeyCode(dpy, p->modifiers[i])) == 0)
+               return;
+       /* code is now the keycode for the modifier you want */
+       {
+           register int j = m->max_keypermod<<3;
+
+           while ((--j >= 0) && (code != m->modifiermap[j]))
+               ;
+           if (j < 0)
+               return;
+           p->state |= (1<<(j/m->max_keypermod));
+       }
+    }
+    p->state &= AllMods;
+}
+
+/************************************************************************
+ *
+ *
+ * Compose handling routines - compose handlers 0,1,2
+ *
+ *
+ ************************************************************************/
+
+#define NORMAL_KEY_STATE 0
+#define FIRST_COMPOSE_KEY_STATE 1
+#define SECOND_COMPOSE_KEY_STATE 2
+
+Private
+KeySym HexIMNormalKey(
+    XicThaiPart *thai_part,
+    KeySym symbol,
+    XKeyEvent *event)
+{
+    if (IsComposeKey (symbol, event))  /* start compose sequence       */
+       {
+       SetLed (event->display,COMPOSE_LED, LedModeOn);
+       thai_part->comp_state = FIRST_COMPOSE_KEY_STATE;
+       return NoSymbol;
+       }
+    return symbol;
+}
+
+
+Private
+KeySym HexIMFirstComposeKey(
+    XicThaiPart *thai_part,
+    KeySym symbol,
+    XKeyEvent *event)
+{
+    if (IsModifierKey (symbol)) return symbol; /* ignore shift etc. */
+    if (IsCancelComposeKey (&symbol, event))   /* cancel sequence */
+       {
+       SetLed (event->display,COMPOSE_LED, LedModeOff);
+       thai_part->comp_state = NORMAL_KEY_STATE;
+       return symbol;
+       }
+    if (IsComposeKey (symbol, event))          /* restart sequence ?? */
+       {
+       return NoSymbol;                        /* no state change necessary */
+       }
+
+    thai_part->keysym = symbol;                /* save key pressed */
+    thai_part->comp_state = SECOND_COMPOSE_KEY_STATE;
+    return NoSymbol;
+}
+
+Private
+KeySym HexIMSecondComposeKey(
+    XicThaiPart *thai_part,
+    KeySym symbol,
+    XKeyEvent *event)
+{
+    if (IsModifierKey (symbol)) return symbol; /* ignore shift etc. */
+    if (IsComposeKey (symbol, event))          /* restart sequence ? */
+       {
+       thai_part->comp_state =FIRST_COMPOSE_KEY_STATE;
+       return NoSymbol;
+       }
+    SetLed (event->display,COMPOSE_LED, LedModeOff);
+    if (IsCancelComposeKey (&symbol, event))   /* cancel sequence ? */
+       {
+       thai_part->comp_state = NORMAL_KEY_STATE;
+       return symbol;
+       }
+
+    if ((symbol = HexIMComposeSequence (thai_part->keysym, symbol))
+                                                               ==NoSymbol)
+       { /* invalid compose sequence */
+       XBell(event->display, BellVolume);
+       }
+    thai_part->comp_state = NORMAL_KEY_STATE; /* reset to normal state */
+    return symbol;
+}
+
+
+/*
+ * Interprets two keysyms entered as hex digits and return the Thai keysym
+ * correspond to the TACTIS code formed.
+ * The current implementation of this routine returns ISO Latin Keysyms.
+ */
+
+Private
+KeySym HexIMComposeSequence(KeySym ks1, KeySym ks2)
+{
+int    hi_digit;
+int    lo_digit;
+int    tactis_code;
+
+    if ((ks1 >= XK_0) && (ks1 <= XK_9))
+       hi_digit = ks1 - XK_0;
+    else if ((ks1 >= XK_A) && (ks1 <= XK_F))
+       hi_digit = ks1 - XK_A + 10;
+    else if ((ks1 >= XK_a) && (ks1 <= XK_f))
+       hi_digit = ks1 - XK_a + 10;
+    else       /* out of range */
+       return NoSymbol;
+
+    if ((ks2 >= XK_0) && (ks2 <= XK_9))
+       lo_digit = ks2 - XK_0;
+    else if ((ks2 >= XK_A) && (ks2 <= XK_F))
+       lo_digit = ks2 - XK_A + 10;
+    else if ((ks2 >= XK_a) && (ks2 <= XK_f))
+       lo_digit = ks2 - XK_a + 10;
+    else       /* out of range */
+       return NoSymbol;
+
+    tactis_code = hi_digit * 0x10 + lo_digit ;
+
+    return (KeySym)tactis_code;
+
+}
+
+/*
+ * routine determines
+ *     1) whether key event should cancel a compose sequence
+ *     2) whether cancelling key event should be processed or ignored
+ */
+
+Private
+int IsCancelComposeKey(
+    KeySym *symbol,
+    XKeyEvent *event)
+{
+    if (*symbol==XK_Delete && !IsControl(event->state) &&
+                                               !IsMod1(event->state)) {
+       *symbol=NoSymbol;  /* cancel compose sequence, and ignore key */
+       return True;
+    }
+    if (IsComposeKey(*symbol, event)) return False;
+    return (
+       IsControl (event->state) ||
+       IsMod1(event->state) ||
+       IsKeypadKey (*symbol) ||
+       IsFunctionKey (*symbol) ||
+       IsMiscFunctionKey (*symbol) ||
+#ifdef DXK_PRIVATE /* DEC private keysyms */
+       *symbol == DXK_Remove ||
+#endif
+       IsPFKey (*symbol) ||
+       IsCursorKey (*symbol) ||
+       (*symbol >= XK_Tab && *symbol < XK_Multi_key)
+               ? True : False);        /* cancel compose sequence and pass */
+                                       /* cancelling key through           */
+}
+
+
+/*
+ *     set specified keyboard LED on or off
+ */
+
+Private
+void SetLed(
+    Display *dpy,
+    int num,
+    int state)
+{
+    XKeyboardControl led_control;
+
+    led_control.led_mode = state;
+    led_control.led = num;
+    XChangeKeyboardControl (dpy, KBLed | KBLedMode,    &led_control);
+}
+#endif
+
+/*
+ * Initialize ISC mode from im modifier
+ */
+Private void InitIscMode(Xic ic)
+{
+    Xim im;
+    char *im_modifier_name;
+
+    /* If already defined, just return */
+
+    if (IC_IscMode(ic)) return;
+
+    /* Get IM modifier */
+
+    im = (Xim) XIMOfIC((XIC)ic);
+    im_modifier_name = im->core.im_name;
+
+    /* Match with predefined value, default is Basic Check */
+
+    if (!strncmp(im_modifier_name,"BasicCheck",MAXTHAIIMMODLEN+1))
+       IC_IscMode(ic) = WTT_ISC1;
+    else if (!strncmp(im_modifier_name,"Strict",MAXTHAIIMMODLEN+1))
+       IC_IscMode(ic) = WTT_ISC2;
+    else if (!strncmp(im_modifier_name,"Thaicat",MAXTHAIIMMODLEN+1))
+       IC_IscMode(ic) = THAICAT_ISC;
+    else if (!strncmp(im_modifier_name,"Passthrough",MAXTHAIIMMODLEN+1))
+       IC_IscMode(ic) = NOISC;
+    else
+       IC_IscMode(ic) = WTT_ISC1;
+
+    return;
+}
+
+/*
+ * Helper functions for _XimThaiFilter()
+ */
+Private Bool
+ThaiFltAcceptInput(Xic ic, unsigned char new_char, KeySym symbol)
+{
+    DefTreeBase *b = &ic->private.local.base;
+    b->wc[b->tree[ic->private.local.composed].wc+0] = tis2ucs(new_char);
+    b->wc[b->tree[ic->private.local.composed].wc+1] = '\0';
+
+    if ((new_char <= 0x1f) || (new_char == 0x7f))
+        b->tree[ic->private.local.composed].keysym = symbol;
+    else
+        b->tree[ic->private.local.composed].keysym = NoSymbol;
+
+    return True;
+}
+
+Private Bool
+ThaiFltReorderInput(Xic ic, unsigned char previous_char, unsigned char new_char)
+{
+    DefTreeBase *b = &ic->private.local.base;
+    if (!IC_DeletePreviousChar(ic)) return False;
+    b->wc[b->tree[ic->private.local.composed].wc+0] = tis2ucs(new_char);
+    b->wc[b->tree[ic->private.local.composed].wc+1] = tis2ucs(previous_char);
+    b->wc[b->tree[ic->private.local.composed].wc+2] = '\0';
+
+    b->tree[ic->private.local.composed].keysym = NoSymbol;
+
+    return True;
+}
+
+Private Bool
+ThaiFltReplaceInput(Xic ic, unsigned char new_char, KeySym symbol)
+{
+    DefTreeBase *b = &ic->private.local.base;
+    if (!IC_DeletePreviousChar(ic)) return False;
+    b->wc[b->tree[ic->private.local.composed].wc+0] = tis2ucs(new_char);
+    b->wc[b->tree[ic->private.local.composed].wc+1] = '\0';
+
+    if ((new_char <= 0x1f) || (new_char == 0x7f))
+        b->tree[ic->private.local.composed].keysym = symbol;
+    else
+        b->tree[ic->private.local.composed].keysym = NoSymbol;
+
+    return True;
+}
+
+Private unsigned
+NumLockMask(Display *d)
+{
+    int i;
+    XModifierKeymap *map;
+    KeyCode numlock_keycode = XKeysymToKeycode (d, XK_Num_Lock);
+    if (numlock_keycode == NoSymbol)
+        return 0;
+
+    map = XGetModifierMapping (d);
+    if (!map)
+        return 0;
+
+    for (i = 0; i < 8; i++) {
+        if (map->modifiermap[map->max_keypermod * i] == numlock_keycode) {
+            XFreeModifiermap(map);
+            return 1 << i;
+        }
+    }
+    XFreeModifiermap(map);
+    return 0;
+}
+
+/*
+ * Filter function for TACTIS
+ */
+Bool
+_XimThaiFilter(Display *d, Window w, XEvent *ev, XPointer client_data)
+{
+    Xic                    ic = (Xic)client_data;
+    KeySym         symbol;
+    int            isc_mode; /* Thai Input Sequence Check mode */
+    unsigned char   previous_char; /* Last inputted Thai char */
+    unsigned char   new_char;
+#ifdef UNUSED
+    unsigned int    modifiers;
+    KeySym         lsym,usym;
+    int                    state;
+    XicThaiPart     *thai_part;
+    char           buf[10];
+#endif
+    wchar_t        wbuf[10];
+    Bool            isReject;
+    DefTreeBase    *b = &ic->private.local.base;
+
+    if ((ev->type != KeyPress)
+        || (ev->xkey.keycode == 0))
+        return False;
+
+    if (!IC_IscMode(ic)) InitIscMode(ic);
+
+    XwcLookupString((XIC)ic, &ev->xkey, wbuf, sizeof(wbuf) / sizeof(wbuf[0]),
+                   &symbol, NULL);
+
+    if ((ev->xkey.state & (AllMods & ~(ShiftMask|LockMask|NumLockMask(d)))) ||
+         ((symbol >> 8 == 0xFF) &&
+         ((XK_BackSpace <= symbol && symbol <= XK_Clear) ||
+           (symbol == XK_Return) ||
+           (symbol == XK_Pause) ||
+           (symbol == XK_Scroll_Lock) ||
+           (symbol == XK_Sys_Req) ||
+           (symbol == XK_Escape) ||
+           (symbol == XK_Delete) ||
+           IsCursorKey(symbol) ||
+           IsKeypadKey(symbol) ||
+           IsMiscFunctionKey(symbol) ||
+           IsFunctionKey(symbol))))
+        {
+            IC_ClearPreviousChar(ic);
+            return False;
+        }
+    if (((symbol >> 8 == 0xFF) &&
+         IsModifierKey(symbol)) ||
+#ifdef XK_XKB_KEYS
+        ((symbol >> 8 == 0xFE) &&
+         (XK_ISO_Lock <= symbol && symbol <= XK_ISO_Last_Group_Lock)) ||
+#endif
+        (symbol == NoSymbol))
+    {
+        return False;
+    }
+#ifdef UNUSED
+    if (! XThaiTranslateKey(ev->xkey.display, ev->xkey.keycode, ev->xkey.state,
+                       &modifiers, &symbol, &lsym, &usym))
+       return False;
+
+    /*
+     *  Hex input method processing
+     */
+
+    thai_part = &ic->private.local.thai;
+    state = thai_part->comp_state;
+    if (state >= 0 && state < nstate_handlers) /* call handler for state */
+    {
+        symbol = (* state_handler[state])(thai_part, symbol, (XKeyEvent *)ev);
+    }
+
+    /*
+     *  Translate KeySym into mb.
+     */
+    count = XThaiTranslateKeySym(ev->xkey.display, symbol, lsym,
+                               usym, ev->xkey.state, buf, 10);
+
+    if (!symbol && !count)
+       return True;
+
+    /* Return symbol if cannot convert to character */
+    if (!count)
+       return False;
+#endif
+
+    /*
+     *  Thai Input sequence check
+     */
+    isc_mode = IC_IscMode(ic);
+    if (!(previous_char = IC_GetPreviousChar(ic))) previous_char = ' ';
+    new_char = ucs2tis(wbuf[0]);
+    isReject = True;
+    if (THAI_isaccepted(new_char, previous_char, isc_mode)) {
+        ThaiFltAcceptInput(ic, new_char, symbol);
+        isReject = False;
+    } else {
+        unsigned char context_char;
+
+        context_char = IC_GetContextChar(ic);
+        if (context_char) {
+            if (THAI_iscomposible(new_char, context_char)) {
+                if (THAI_iscomposible(previous_char, new_char)) {
+                    isReject = !ThaiFltReorderInput(ic, previous_char, new_char);
+                } else if (THAI_iscomposible(previous_char, context_char)) {
+                    isReject = !ThaiFltReplaceInput(ic, new_char, symbol);
+                } else if (THAI_chtype(previous_char) == FV1
+                           && THAI_chtype(new_char) == TONE) {
+                    isReject = !ThaiFltReorderInput(ic, previous_char, new_char);
+                }
+            } else if (THAI_isaccepted(new_char, context_char, isc_mode)) {
+                isReject = !ThaiFltReplaceInput(ic, new_char, symbol);
+            }
+        }
+    }
+    if (isReject) {
+        /* reject character */
+        XBell(ev->xkey.display, BellVolume);
+        return True;
+    }
+
+    _Xlcwcstombs(ic->core.im->core.lcd, &b->mb[b->tree[ic->private.local.composed].mb],
+                &b->wc[b->tree[ic->private.local.composed].wc], 10);
+
+    _Xlcmbstoutf8(ic->core.im->core.lcd, &b->utf8[b->tree[ic->private.local.composed].utf8],
+                 &b->mb[b->tree[ic->private.local.composed].mb], 10);
+
+    /* Remember the last character inputted
+     * (as fallback in case StringConversionCallback is not provided)
+     */
+    IC_SavePreviousChar(ic, new_char);
+
+    ev->xkey.keycode = 0;
+    XPutBackEvent(d, ev);
+    return True;
+}
diff --git a/modules/im/ximcp/imThaiIc.c b/modules/im/ximcp/imThaiIc.c
new file mode 100644 (file)
index 0000000..95433f3
--- /dev/null
@@ -0,0 +1,227 @@
+/******************************************************************
+
+          Copyright 1992, 1993, 1994 by FUJITSU LIMITED
+          Copyright 1993 by Digital Equipment Corporation
+
+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 FUJITSU LIMITED and
+Digital Equipment Corporation not be used in advertising or publicity
+pertaining to distribution of the software without specific, written
+prior permission.  FUJITSU LIMITED and Digital Equipment Corporation
+makes no representations about the suitability of this software for
+any purpose.  It is provided "as is" without express or implied
+warranty.
+
+FUJITSU LIMITED AND DIGITAL EQUIPMENT CORPORATION DISCLAIM ALL
+WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+FUJITSU LIMITED AND DIGITAL EQUIPMENT CORPORATION 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.
+
+  Author:    Takashi Fujiwara     FUJITSU LIMITED
+                                         fujiwara@a80.tech.yk.fujitsu.co.jp
+  Modifier:  Franky Ling          Digital Equipment Corporation
+                                 frankyling@hgrd01.enet.dec.com
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include <X11/Xlib.h>
+#include <X11/Xmd.h>
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "Ximint.h"
+
+Private void
+_XimThaiUnSetFocus(
+    XIC         xic)
+{
+    Xic  ic = (Xic)xic;
+    ((Xim)ic->core.im)->private.local.current_ic = (XIC)NULL;
+
+    if (ic->core.focus_window)
+       _XUnregisterFilter(ic->core.im->core.display, ic->core.focus_window,
+                       _XimThaiFilter, (XPointer)ic);
+    return;
+}
+
+Private void
+_XimThaiDestroyIC(
+    XIC         xic)
+{
+    Xic         ic = (Xic)xic;
+    DefTreeBase *b = &ic->private.local.base;
+
+    if(((Xim)ic->core.im)->private.local.current_ic == (XIC)ic) {
+       _XimThaiUnSetFocus(xic);
+    }
+    if(ic->private.local.ic_resources) {
+       Xfree(ic->private.local.ic_resources);
+       ic->private.local.ic_resources = NULL;
+    }
+
+    if (b->tree)  Xfree (b->tree);
+    if (b->mb)    Xfree (b->mb);
+    if (b->wc)    Xfree (b->wc);
+    if (b->utf8)  Xfree (b->utf8);
+    b->tree = NULL;
+    b->mb   = NULL;
+    b->wc   = NULL;
+    b->utf8 = NULL;
+    return;
+}
+
+Private void
+_XimThaiSetFocus(
+    XIC         xic)
+{
+    Xic         ic = (Xic)xic;
+    XIC         current_ic = ((Xim)ic->core.im)->private.local.current_ic;
+
+    if (current_ic == (XIC)ic)
+       return;
+
+    if (current_ic != (XIC)NULL) {
+       _XimThaiUnSetFocus(current_ic);
+    }
+    ((Xim)ic->core.im)->private.local.current_ic = (XIC)ic;
+
+    if (ic->core.focus_window)
+       _XRegisterFilterByType(ic->core.im->core.display, ic->core.focus_window,
+                       KeyPress, KeyPress, _XimThaiFilter, (XPointer)ic);
+    return;
+}
+
+Private void
+_XimThaiReset(
+    XIC         xic)
+{
+    Xic         ic = (Xic)xic;
+    DefTreeBase *b   = &ic->private.local.base;
+    ic->private.local.thai.comp_state = 0;
+    ic->private.local.thai.keysym = 0;
+    b->mb[b->tree[ic->private.local.composed].mb] = '\0';
+    b->wc[b->tree[ic->private.local.composed].wc] = '\0';
+    b->utf8[b->tree[ic->private.local.composed].utf8] = '\0';
+}
+
+Private char *
+_XimThaiMbReset(
+    XIC         xic)
+{
+    _XimThaiReset(xic);
+    return (char *)NULL;
+}
+
+Private wchar_t *
+_XimThaiWcReset(
+    XIC         xic)
+{
+    _XimThaiReset(xic);
+    return (wchar_t *)NULL;
+}
+
+Private XICMethodsRec Thai_ic_methods = {
+    _XimThaiDestroyIC,         /* destroy */
+    _XimThaiSetFocus,          /* set_focus */
+    _XimThaiUnSetFocus,        /* unset_focus */
+    _XimLocalSetICValues,      /* set_values */
+    _XimLocalGetICValues,      /* get_values */
+    _XimThaiMbReset,           /* mb_reset */
+    _XimThaiWcReset,           /* wc_reset */
+    _XimThaiMbReset,           /* utf8_reset */
+    _XimLocalMbLookupString,   /* mb_lookup_string */
+    _XimLocalWcLookupString,   /* wc_lookup_string */
+    _XimLocalUtf8LookupString  /* utf8_lookup_string */
+};
+
+XIC
+_XimThaiCreateIC(
+    XIM                         im,
+    XIMArg             *values)
+{
+    Xic                         ic;
+    XimDefICValues      ic_values;
+    XIMResourceList     res;
+    unsigned int        num;
+    int                         len;
+    DefTree             *tree;
+
+    if((ic = Xcalloc(1, sizeof(XicRec))) == (Xic)NULL) {
+       return ((XIC)NULL);
+    }
+
+    ic->methods = &Thai_ic_methods;
+    ic->core.im = im;
+    ic->core.filter_events = KeyPressMask;
+
+    if (! (ic->private.local.base.tree = tree = (DefTree *)Xmalloc(sizeof(DefTree)*3)) )
+       goto Set_Error;
+    if (! (ic->private.local.base.mb = (char *)Xmalloc(21)) )
+       goto Set_Error;
+    if (! (ic->private.local.base.wc = (wchar_t*)Xmalloc(sizeof(wchar_t)*21)) )
+       goto Set_Error;
+    if (! (ic->private.local.base.utf8 = (char *)Xmalloc(21)) )
+       goto Set_Error;
+    ic->private.local.context = 1;
+    tree[1].mb   = 1;
+    tree[1].wc   = 1;
+    tree[1].utf8 = 1;
+    ic->private.local.composed = 2;
+    tree[2].mb   = 11;
+    tree[2].wc   = 11;
+    tree[2].utf8 = 11;
+
+    ic->private.local.thai.comp_state = 0;
+    ic->private.local.thai.keysym = 0;
+    ic->private.local.thai.input_mode = 0;
+
+    num = im->core.ic_num_resources;
+    len = sizeof(XIMResource) * num;
+    if((res = (XIMResourceList)Xmalloc(len)) == (XIMResourceList)NULL) {
+       goto Set_Error;
+    }
+    (void)memcpy((char *)res, (char *)im->core.ic_resources, len);
+    ic->private.local.ic_resources     = res;
+    ic->private.local.ic_num_resources = num;
+
+    bzero((char *)&ic_values, sizeof(XimDefICValues));
+    if(_XimCheckLocalInputStyle(ic, (XPointer)&ic_values, values,
+                                im->core.styles, res, num) == False) {
+       goto Set_Error;
+    }
+
+    _XimSetICMode(res, num, ic_values.input_style);
+
+    if(_XimSetICValueData(ic, (XPointer)&ic_values,
+                       ic->private.local.ic_resources,
+                       ic->private.local.ic_num_resources,
+                       values, XIM_CREATEIC, True)) {
+       goto Set_Error;
+    }
+    if(_XimSetICDefaults(ic, (XPointer)&ic_values,
+                               XIM_SETICDEFAULTS, res, num) == False) {
+       goto Set_Error;
+    }
+    ic_values.filter_events = KeyPressMask;
+    _XimSetCurrentICValues(ic, &ic_values);
+
+    return ((XIC)ic);
+
+Set_Error :
+    if (ic->private.local.ic_resources) {
+       Xfree(ic->private.local.ic_resources);
+    }
+    Xfree(ic);
+    return((XIC)NULL);
+}
diff --git a/modules/im/ximcp/imThaiIm.c b/modules/im/ximcp/imThaiIm.c
new file mode 100644 (file)
index 0000000..767b52c
--- /dev/null
@@ -0,0 +1,235 @@
+/******************************************************************
+
+          Copyright 1992, 1993, 1994 by FUJITSU LIMITED
+          Copyright 1993 by Digital Equipment Corporation
+
+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 FUJITSU LIMITED and
+Digital Equipment Corporation not be used in advertising or publicity
+pertaining to distribution of the software without specific, written
+prior permission.  FUJITSU LIMITED and Digital Equipment Corporation
+makes no representations about the suitability of this software for
+any purpose.  It is provided "as is" without express or implied
+warranty.
+
+FUJITSU LIMITED AND DIGITAL EQUIPMENT CORPORATION DISCLAIM ALL
+WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+FUJITSU LIMITED AND DIGITAL EQUIPMENT CORPORATION 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.
+
+  Author:    Takashi Fujiwara     FUJITSU LIMITED
+                                         fujiwara@a80.tech.yk.fujitsu.co.jp
+  Modifier:  Franky Ling          Digital Equipment Corporation
+                                 frankyling@hgrd01.enet.dec.com
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include <X11/Xlib.h>
+#include <X11/Xmd.h>
+#include <X11/Xatom.h>
+#include <X11/Xos.h>
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "XlcPublic.h"
+#include "XlcPubI.h"
+#include "Ximint.h"
+
+Private XIMMethodsRec      Xim_im_thai_methods = {
+    _XimThaiCloseIM,           /* close */
+    _XimLocalSetIMValues,      /* set_values */
+    _XimLocalGetIMValues,      /* get_values */
+    _XimThaiCreateIC,          /* create_ic */
+    _XimLcctstombs,            /* ctstombs */
+    _XimLcctstowcs,            /* ctstowcs */
+    _XimLcctstoutf8            /* ctstoutf8 */
+};
+
+#define THAI_LANGUAGE_NAME     "th"
+
+Bool
+_XimCheckIfThaiProcessing(Xim im)
+{
+    char *language;
+
+    _XGetLCValues(im->core.lcd, XlcNLanguage, &language, NULL);
+    if(strcmp(language, THAI_LANGUAGE_NAME) == 0 &&
+       (strcmp(im->core.im_name, "") == 0 ||
+        strcmp(im->core.im_name, "BasicCheck") == 0 ||
+        strcmp(im->core.im_name, "Strict") == 0 ||
+        strcmp(im->core.im_name, "Thaicat") == 0 ||
+        strcmp(im->core.im_name, "Passthrough") == 0))
+    {
+       return(True);
+    }
+    return(False);
+}
+
+Public Bool
+_XimThaiOpenIM(Xim im)
+{
+    XLCd                lcd = im->core.lcd;
+    XlcConv             conv;
+    XimDefIMValues      im_values;
+    XimLocalPrivateRec*  private = &im->private.local;
+
+    _XimInitialResourceInfo();
+    if(_XimSetIMResourceList(&im->core.im_resources,
+                               &im->core.im_num_resources) == False) {
+       goto Open_Error;
+    }
+    if(_XimSetICResourceList(&im->core.ic_resources,
+                               &im->core.ic_num_resources) == False) {
+       goto Open_Error;
+    }
+
+    _XimSetIMMode(im->core.im_resources, im->core.im_num_resources);
+
+    _XimGetCurrentIMValues(im, &im_values);
+    if(_XimSetLocalIMDefaults(im, (XPointer)&im_values,
+               im->core.im_resources, im->core.im_num_resources) == False) {
+       goto Open_Error;
+    }
+    _XimSetCurrentIMValues(im, &im_values);
+
+    if (!(conv = _XlcOpenConverter(lcd,        XlcNCompoundText, lcd, XlcNMultiByte)))
+       goto Open_Error;
+    private->ctom_conv = conv;
+
+    if (!(conv = _XlcOpenConverter(lcd,        XlcNCompoundText, lcd, XlcNWideChar)))
+       goto Open_Error;
+    private->ctow_conv = conv;
+
+    if (!(conv = _XlcOpenConverter(lcd,        XlcNCompoundText, lcd, XlcNUtf8String)))
+       goto Open_Error;
+    private->ctoutf8_conv = conv;
+
+    if (!(conv = _XlcOpenConverter(lcd,        XlcNCharSet, lcd, XlcNMultiByte)))
+       goto Open_Error;
+    private->cstomb_conv = conv;
+
+    if (!(conv = _XlcOpenConverter(lcd,        XlcNCharSet, lcd, XlcNWideChar)))
+       goto Open_Error;
+    private->cstowc_conv = conv;
+
+    if (!(conv = _XlcOpenConverter(lcd,        XlcNCharSet, lcd, XlcNUtf8String)))
+       goto Open_Error;
+    private->cstoutf8_conv = conv;
+
+    if (!(conv = _XlcOpenConverter(lcd,        XlcNUcsChar, lcd, XlcNChar)))
+       goto Open_Error;
+    private->ucstoc_conv = conv;
+
+    if (!(conv = _XlcOpenConverter(lcd,        XlcNUcsChar, lcd, XlcNUtf8String)))
+       goto Open_Error;
+    private->ucstoutf8_conv = conv;
+
+    im->methods = &Xim_im_thai_methods;
+    private->current_ic = (XIC)NULL;
+
+    return(True);
+
+Open_Error :
+    _XimThaiIMFree(im);
+    return(False);
+}
+
+Public void
+_XimThaiIMFree(Xim im)
+{
+    if(im->core.im_resources) {
+       Xfree(im->core.im_resources);
+       im->core.im_resources = NULL;
+    }
+    if(im->core.ic_resources) {
+       Xfree(im->core.ic_resources);
+       im->core.ic_resources = NULL;
+    }
+    if(im->core.im_values_list) {
+       Xfree(im->core.im_values_list);
+       im->core.im_values_list = NULL;
+    }
+    if(im->core.ic_values_list) {
+       Xfree(im->core.ic_values_list);
+       im->core.ic_values_list = NULL;
+    }
+    if(im->core.styles) {
+       Xfree(im->core.styles);
+       im->core.styles = NULL;
+    }
+    if(im->core.res_name) {
+       Xfree(im->core.res_name);
+       im->core.res_name = NULL;
+    }
+    if(im->core.res_class) {
+       Xfree(im->core.res_class);
+       im->core.res_class = NULL;
+    }
+    if(im->core.im_name) {
+       Xfree(im->core.im_name);
+       im->core.im_name = NULL;
+    }
+    if (im->private.local.ctom_conv) {
+       _XlcCloseConverter(im->private.local.ctom_conv);
+       im->private.local.ctom_conv = NULL;
+    }
+    if (im->private.local.ctow_conv) {
+       _XlcCloseConverter(im->private.local.ctow_conv);
+       im->private.local.ctow_conv = NULL;
+    }
+    if (im->private.local.ctoutf8_conv) {
+       _XlcCloseConverter(im->private.local.ctoutf8_conv);
+       im->private.local.ctoutf8_conv = NULL;
+    }
+    if (im->private.local.cstomb_conv) {
+       _XlcCloseConverter(im->private.local.cstomb_conv);
+       im->private.local.cstomb_conv = NULL;
+    }
+    if (im->private.local.cstowc_conv) {
+       _XlcCloseConverter(im->private.local.cstowc_conv);
+       im->private.local.cstowc_conv = NULL;
+    }
+    if (im->private.local.cstoutf8_conv) {
+       _XlcCloseConverter(im->private.local.cstoutf8_conv);
+       im->private.local.cstoutf8_conv = NULL;
+    }
+    if (im->private.local.ucstoc_conv) {
+       _XlcCloseConverter(im->private.local.ucstoc_conv);
+       im->private.local.ucstoc_conv = NULL;
+    }
+    if (im->private.local.ucstoutf8_conv) {
+       _XlcCloseConverter(im->private.local.ucstoutf8_conv);
+       im->private.local.ucstoutf8_conv = NULL;
+    }
+    return;
+}
+
+Public Status
+_XimThaiCloseIM(XIM xim)
+{
+    Xim                im = (Xim)xim;
+    XIC                ic;
+    XIC                next;
+
+    ic = im->core.ic_chain;
+    im->core.ic_chain = NULL;
+    while (ic) {
+       (*ic->methods->destroy) (ic);
+       next = ic->core.next;
+       Xfree ((char *) ic);
+       ic = next;
+    }
+    _XimThaiIMFree(im);
+    return(True);
+}
diff --git a/modules/im/ximcp/imTrX.c b/modules/im/ximcp/imTrX.c
new file mode 100644 (file)
index 0000000..d85d1d1
--- /dev/null
@@ -0,0 +1,518 @@
+/*
+ * Copyright 1992 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 1992, 1993, 1994 by FUJITSU LIMITED
+
+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 FUJITSU LIMITED
+not be used in advertising or publicity pertaining to distribution
+of the software without specific, written prior permission.
+FUJITSU LIMITED makes no representations about the suitability of
+this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL FUJITSU LIMITED 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.
+
+  Author: Hideki Hiura (hhiura@Sun.COM) Sun Microsystems, Inc.
+          Takashi Fujiwara     FUJITSU LIMITED
+                               fujiwara@a80.tech.yk.fujitsu.co.jp
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <string.h>
+#include <X11/Xatom.h>
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "Ximint.h"
+#include "XimTrInt.h"
+#include "XimTrX.h"
+
+Private Bool
+_XimXRegisterDispatcher(
+    Xim                         im,
+    Bool                (*callback)(
+                                    Xim, INT16, XPointer, XPointer
+                                    ),
+    XPointer            call_data)
+{
+    XIntrCallbackPtr    rec;
+    XSpecRec           *spec = (XSpecRec *)im->private.proto.spec;
+
+    if (!(rec = (XIntrCallbackPtr)Xmalloc(sizeof(XIntrCallbackRec))))
+        return False;
+
+    rec->func       = callback;
+    rec->call_data  = call_data;
+    rec->next       = spec->intr_cb;
+    spec->intr_cb   = rec;
+    return True;
+}
+
+Private void
+_XimXFreeIntrCallback(
+    Xim                         im)
+{
+    XSpecRec           *spec = (XSpecRec *)im->private.proto.spec;
+    register XIntrCallbackPtr rec, next;
+
+    for (rec = spec->intr_cb; rec;) {
+       next = rec->next;
+       Xfree(rec);
+       rec = next;
+    }
+    return;
+}
+
+Private Bool
+_XimXCallDispatcher(Xim im, INT16 len, XPointer data)
+{
+    register XIntrCallbackRec  *rec;
+    XSpecRec           *spec = (XSpecRec *)im->private.proto.spec;
+
+    for (rec = spec->intr_cb; rec; rec = rec->next) {
+       if ((*rec->func)(im, len, data, rec->call_data))
+           return True;
+    }
+    return False;
+}
+
+Private Bool
+_XimXFilterWaitEvent(
+    Display    *d,
+    Window      w,
+    XEvent     *ev,
+    XPointer    arg)
+{
+    Xim                 im = (Xim)arg;
+    XSpecRec   *spec = (XSpecRec *)im->private.proto.spec;
+    Bool ret;
+
+    spec->ev = (XPointer)ev;
+    ret = _XimFilterWaitEvent(im);
+
+    /*
+     * If ev is a pointer to a stack variable, there could be
+     * a coredump later on if the pointer is dereferenced.
+     * Therefore, reset to NULL to force reinitialization in
+     * _XimXRead().
+     *
+     * Keep in mind _XimXRead may be called again when the stack
+     * is very different.
+     */
+     spec->ev = (XPointer)NULL;
+
+     return ret;
+}
+
+Private Bool
+_CheckConnect(
+    Display    *display,
+    XEvent     *event,
+    XPointer    xim)
+{
+    Xim                 im = (Xim)xim;
+    XSpecRec   *spec = (XSpecRec *)im->private.proto.spec;
+
+    if ((event->type == ClientMessage)
+     && (event->xclient.message_type == spec->imconnectid)) {
+       return True;
+    }
+    return False;
+}
+
+Private Bool
+_XimXConnect(Xim im)
+{
+    XEvent      event;
+    XSpecRec   *spec = (XSpecRec *)im->private.proto.spec;
+    CARD32      major_code;
+    CARD32      minor_code;
+
+    if (!(spec->lib_connect_wid = XCreateSimpleWindow(im->core.display,
+               DefaultRootWindow(im->core.display), 0, 0, 1, 1, 1, 0, 0))) {
+       return False;
+    }
+
+    event.xclient.type         = ClientMessage;
+    event.xclient.display      = im->core.display;
+    event.xclient.window       = im->private.proto.im_window;
+    event.xclient.message_type = spec->imconnectid;
+    event.xclient.format       = 32;
+    event.xclient.data.l[0]    = (CARD32)spec->lib_connect_wid;
+    event.xclient.data.l[1]    = spec->major_code;
+    event.xclient.data.l[2]    = spec->minor_code;
+    event.xclient.data.l[3]    = 0;
+    event.xclient.data.l[4]    = 0;
+
+    if(event.xclient.data.l[1] == 1 || event.xclient.data.l[1] == 2) {
+       XWindowAttributes        atr;
+       long                     event_mask;
+
+       XGetWindowAttributes(im->core.display, spec->lib_connect_wid, &atr);
+       event_mask = atr.your_event_mask | PropertyChangeMask;
+       XSelectInput(im->core.display, spec->lib_connect_wid, event_mask);
+       _XRegisterFilterByType(im->core.display, spec->lib_connect_wid,
+                       PropertyNotify, PropertyNotify,
+                        _XimXFilterWaitEvent, (XPointer)im);
+    }
+
+    XSendEvent(im->core.display, im->private.proto.im_window,
+                False, NoEventMask, &event);
+    XFlush(im->core.display);
+
+    for (;;) {
+       XIfEvent(im->core.display, &event, _CheckConnect, (XPointer)im);
+       if (event.xclient.type != ClientMessage) {
+           return False;
+       }
+       if (event.xclient.message_type == spec->imconnectid)
+           break;
+    }
+
+    spec->ims_connect_wid = (Window)event.xclient.data.l[0];
+    major_code = (CARD32)event.xclient.data.l[1];
+    minor_code = (CARD32)event.xclient.data.l[2];
+
+    if (((major_code == 0) && (minor_code <= 2)) ||
+       ((major_code == 1) && (minor_code == 0)) ||
+       ((major_code == 2) && (minor_code <= 1))) {
+       spec->major_code = major_code;
+       spec->minor_code = minor_code;
+    }
+    if (((major_code == 0) && (minor_code == 2)) ||
+       ((major_code == 2) && (minor_code == 1))) {
+       spec->BoundarySize = (CARD32)event.xclient.data.l[3];
+    }
+
+    /* ClientMessage Event Filter */
+    _XRegisterFilterByType(im->core.display, spec->lib_connect_wid,
+                       ClientMessage, ClientMessage,
+                        _XimXFilterWaitEvent, (XPointer)im);
+    return True;
+}
+
+Private Bool
+_XimXShutdown(Xim im)
+{
+    XSpecRec   *spec = (XSpecRec *)im->private.proto.spec;
+
+    if (!spec)
+       return True;
+
+    /* ClientMessage Event Filter */
+    _XUnregisterFilter(im->core.display,
+           ((XSpecRec *)im->private.proto.spec)->lib_connect_wid,
+           _XimXFilterWaitEvent, (XPointer)im);
+    XDestroyWindow(im->core.display,
+           ((XSpecRec *)im->private.proto.spec)->lib_connect_wid);
+    _XimXFreeIntrCallback(im);
+    Xfree(spec);
+    im->private.proto.spec = 0;
+    return True;
+}
+
+Private char *
+_NewAtom(
+    char       *atomName)
+{
+    static int  sequence = 0;
+
+    (void)sprintf(atomName, "_client%d", sequence);
+    sequence = ((sequence < 20) ? sequence + 1 : 0);
+    return atomName;
+}
+
+Private Bool
+_XimXWrite(Xim im, INT16 len, XPointer data)
+{
+    Atom        atom;
+    char        atomName[16];
+    XSpecRec   *spec = (XSpecRec *)im->private.proto.spec;
+    XEvent      event;
+    CARD8      *p;
+    CARD32      major_code = spec->major_code;
+    CARD32      minor_code = spec->minor_code;
+    int                 BoundSize;
+
+    bzero(&event,sizeof(XEvent));
+    event.xclient.type         = ClientMessage;
+    event.xclient.display      = im->core.display;
+    event.xclient.window       = spec->ims_connect_wid;
+    if(major_code == 1 && minor_code == 0) {
+        BoundSize = 0;
+    } else if((major_code == 0 && minor_code == 2) ||
+              (major_code == 2 && minor_code == 1)) {
+        BoundSize = spec->BoundarySize;
+    } else if(major_code == 0 && minor_code == 1) {
+        BoundSize = len;
+    } else {
+        BoundSize = XIM_CM_DATA_SIZE;
+    }
+    if (len > BoundSize) {
+       event.xclient.message_type = spec->improtocolid;
+       atom = XInternAtom(im->core.display, _NewAtom(atomName), False);
+       XChangeProperty(im->core.display, spec->ims_connect_wid,
+                       atom, XA_STRING, 8, PropModeAppend,
+                       (unsigned char *)data, len);
+       if(major_code == 0) {
+           event.xclient.format = 32;
+           event.xclient.data.l[0] = (long)len;
+           event.xclient.data.l[1] = (long)atom;
+           XSendEvent(im->core.display, spec->ims_connect_wid,
+                                       False, NoEventMask, &event);
+       }
+    } else {
+       int              length;
+
+       event.xclient.format = 8;
+       for(length = 0 ; length < len ; length += XIM_CM_DATA_SIZE) {
+           p = (CARD8 *)&event.xclient.data.b[0];
+           if((length + XIM_CM_DATA_SIZE) >= len) {
+               event.xclient.message_type = spec->improtocolid;
+               bzero(p, XIM_CM_DATA_SIZE);
+               memcpy((char *)p, (data + length), (len - length));
+           } else {
+               event.xclient.message_type = spec->immoredataid;
+               memcpy((char *)p, (data + length), XIM_CM_DATA_SIZE);
+           }
+           XSendEvent(im->core.display, spec->ims_connect_wid,
+                                       False, NoEventMask, &event);
+       }
+    }
+
+    return True;
+}
+
+Private Bool
+_XimXGetReadData(
+    Xim                          im,
+    char                *buf,
+    int                          buf_len,
+    int                         *ret_len,
+    XEvent              *event)
+{
+    char                *data;
+    int                          len;
+
+    char                 tmp_buf[XIM_CM_DATA_SIZE];
+    XSpecRec            *spec = (XSpecRec *)im->private.proto.spec;
+    unsigned long        length;
+    Atom                 prop;
+    int                          return_code;
+    Atom                 type_ret;
+    int                          format_ret;
+    unsigned long        nitems;
+    unsigned long        bytes_after_ret;
+    unsigned char       *prop_ret;
+
+    if ((event->type == ClientMessage) &&
+        !((event->xclient.message_type == spec->improtocolid) ||
+          (event->xclient.message_type == spec->immoredataid))) {
+         /* This event has nothing to do with us,
+          * FIXME should not have gotten here then...
+          */
+         return False;
+    } else if ((event->type == ClientMessage) && (event->xclient.format == 8)) {
+        data = event->xclient.data.b;
+       if (buf_len >= XIM_CM_DATA_SIZE) {
+           (void)memcpy(buf, data, XIM_CM_DATA_SIZE);
+           *ret_len = XIM_CM_DATA_SIZE;
+       } else {
+           (void)memcpy(buf, data, buf_len);
+           len = XIM_CM_DATA_SIZE - buf_len;
+           (void)memcpy(tmp_buf, &data[buf_len], len);
+           bzero(data, XIM_CM_DATA_SIZE);
+           (void)memcpy(data, tmp_buf, len);
+           XPutBackEvent(im->core.display, event);
+           *ret_len = buf_len;
+       }
+    } else if ((event->type == ClientMessage)
+                               && (event->xclient.format == 32)) {
+       length = (unsigned long)event->xclient.data.l[0];
+       prop   = (Atom)event->xclient.data.l[1];
+       return_code = XGetWindowProperty(im->core.display,
+               spec->lib_connect_wid, prop, 0L,
+               (long)((length + 3)/ 4), True, AnyPropertyType,
+               &type_ret, &format_ret, &nitems, &bytes_after_ret, &prop_ret);
+       if (return_code != Success || format_ret == 0 || nitems == 0) {
+           if (return_code == Success)
+               XFree(prop_ret);
+           return False;
+       }
+       if (buf_len >= length) {
+           (void)memcpy(buf, prop_ret, (int)nitems);
+           *ret_len  = (int)nitems;
+           if (bytes_after_ret > 0) {
+               XFree(prop_ret);
+               if (XGetWindowProperty(im->core.display,
+                                      spec->lib_connect_wid, prop, 0L,
+                                      ((length + bytes_after_ret + 3)/ 4),
+                                      True, AnyPropertyType,
+                                      &type_ret, &format_ret, &nitems,
+                                      &bytes_after_ret,
+                                      &prop_ret) == Success) {
+                   XChangeProperty(im->core.display, spec->lib_connect_wid, prop,
+                                   XA_STRING, 8, PropModePrepend, &prop_ret[length],
+                                   (nitems - length));
+               } else {
+                   return False;
+               }
+           }
+       } else {
+           (void)memcpy(buf, prop_ret, buf_len);
+           *ret_len  = buf_len;
+           len = nitems - buf_len;
+
+           if (bytes_after_ret > 0) {
+               XFree(prop_ret);
+               if (XGetWindowProperty(im->core.display,
+                                      spec->lib_connect_wid, prop, 0L,
+                                      ((length + bytes_after_ret + 3)/ 4),
+                                      True, AnyPropertyType,
+                                      &type_ret, &format_ret, &nitems,
+                                      &bytes_after_ret, &prop_ret) != Success) {
+                   return False;
+               }
+           }
+           XChangeProperty(im->core.display, spec->lib_connect_wid, prop,
+                   XA_STRING, 8, PropModePrepend, &prop_ret[buf_len], len);
+           event->xclient.data.l[0] = (long)len;
+           event->xclient.data.l[1] = (long)prop;
+           XPutBackEvent(im->core.display, event);
+       }
+       XFree(prop_ret);
+    } else if (event->type == PropertyNotify) {
+       prop = event->xproperty.atom;
+       return_code = XGetWindowProperty(im->core.display,
+               spec->lib_connect_wid, prop, 0L,
+               1000000L, True, AnyPropertyType,
+               &type_ret, &format_ret, &nitems, &bytes_after_ret, &prop_ret);
+       if (return_code != Success || format_ret == 0 || nitems == 0) {
+           if (return_code == Success)
+               XFree(prop_ret);
+           return False;
+       }
+       if (buf_len >= nitems) {
+           (void)memcpy(buf, prop_ret, (int)nitems);
+           *ret_len  = (int)nitems;
+       } else {
+           (void)memcpy(buf, prop_ret, buf_len);
+           *ret_len  = buf_len;
+           len = nitems - buf_len;
+           XChangeProperty(im->core.display, spec->lib_connect_wid, prop,
+               XA_STRING, 8, PropModePrepend, &prop_ret[buf_len], len);
+       }
+       XFree(prop_ret);
+    }
+    return True;
+}
+
+Private Bool
+_CheckCMEvent(
+    Display    *display,
+    XEvent     *event,
+    XPointer    xim)
+{
+    Xim                 im = (Xim)xim;
+    XSpecRec   *spec = (XSpecRec *)im->private.proto.spec;
+    CARD32      major_code = spec->major_code;
+
+    if ((event->type == ClientMessage)
+     &&((event->xclient.message_type == spec->improtocolid) ||
+        (event->xclient.message_type == spec->immoredataid)))
+       return True;
+    if((major_code == 1 || major_code == 2) &&
+       (event->type == PropertyNotify) &&
+       (event->xproperty.state == PropertyNewValue))
+       return True;
+    return False;
+}
+
+Private Bool
+_XimXRead(Xim im, XPointer recv_buf, int buf_len, int *ret_len)
+{
+    XEvent     *ev;
+    XEvent      event;
+    int                 len = 0;
+    XSpecRec   *spec = (XSpecRec *)im->private.proto.spec;
+    XPointer     arg = spec->ev;
+
+    if (!arg) {
+       bzero(&event, sizeof(XEvent));
+       ev = &event;
+       XIfEvent(im->core.display, ev, _CheckCMEvent, (XPointer)im);
+    } else {
+       ev = (XEvent *)arg;
+       spec->ev = (XPointer)NULL;
+    }
+    if (!(_XimXGetReadData(im, recv_buf, buf_len, &len, ev)))
+       return False;
+    *ret_len = len;
+    return True;
+}
+
+Private void
+_XimXFlush(Xim im)
+{
+    XFlush(im->core.display);
+    return;
+}
+
+Public Bool
+_XimXConf(Xim im, char *address)
+{
+    XSpecRec   *spec;
+
+    if (!(spec = Xcalloc(1, sizeof(XSpecRec))))
+       return False;
+
+    spec->improtocolid = XInternAtom(im->core.display, _XIM_PROTOCOL, False);
+    spec->imconnectid  = XInternAtom(im->core.display, _XIM_XCONNECT, False);
+    spec->immoredataid = XInternAtom(im->core.display, _XIM_MOREDATA, False);
+    spec->major_code = MAJOR_TRANSPORT_VERSION;
+    spec->minor_code = MINOR_TRANSPORT_VERSION;
+
+    im->private.proto.spec     = (XPointer)spec;
+    im->private.proto.connect  = _XimXConnect;
+    im->private.proto.shutdown = _XimXShutdown;
+    im->private.proto.write    = _XimXWrite;
+    im->private.proto.read     = _XimXRead;
+    im->private.proto.flush    = _XimXFlush;
+    im->private.proto.register_dispatcher  = _XimXRegisterDispatcher;
+    im->private.proto.call_dispatcher = _XimXCallDispatcher;
+
+    return True;
+}
diff --git a/modules/im/ximcp/imTrans.c b/modules/im/ximcp/imTrans.c
new file mode 100644 (file)
index 0000000..0ac08aa
--- /dev/null
@@ -0,0 +1,313 @@
+/*
+ * Copyright 1992 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 1992, 1993, 1994 by FUJITSU LIMITED
+
+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 FUJITSU LIMITED
+not be used in advertising or publicity pertaining to distribution
+of the software without specific, written prior permission.
+FUJITSU LIMITED makes no representations about the suitability of
+this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL FUJITSU LIMITED 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.
+
+  Author: Hideki Hiura (hhiura@Sun.COM) Sun Microsystems, Inc.
+          Takashi Fujiwara     FUJITSU LIMITED
+                               fujiwara@a80.tech.yk.fujitsu.co.jp
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include <X11/Xatom.h>
+#include <X11/Xmd.h>
+#include "Xlibint.h"
+#include <X11/Xtrans/Xtrans.h>
+#include "Xlcint.h"
+#include "Ximint.h"
+#include "XimTrans.h"
+#include "XimTrInt.h"
+
+#ifdef WIN32
+#include <X11/Xwindows.h>
+#endif
+
+
+#ifndef XIM_CONNECTION_RETRIES
+#define XIM_CONNECTION_RETRIES 5
+#endif
+
+
+Private Bool
+_XimTransConnect(
+    Xim                         im)
+{
+    TransSpecRec       *spec = (TransSpecRec *)im->private.proto.spec;
+    int                        connect_stat, retry;
+    Window             window;
+
+    for (retry = XIM_CONNECTION_RETRIES; retry >= 0; retry--)
+    {
+       if ((spec->trans_conn = _XimXTransOpenCOTSClient (
+           spec->address)) == NULL)
+       {
+           break;
+       }
+
+       if ((connect_stat = _XimXTransConnect (
+           spec->trans_conn, spec->address)) < 0)
+       {
+           _XimXTransClose (spec->trans_conn);
+           spec->trans_conn = NULL;
+
+           if (connect_stat == TRANS_TRY_CONNECT_AGAIN)
+               continue;
+           else
+               break;
+       }
+       else
+           break;
+    }
+
+    if (spec->trans_conn == NULL)
+       return False;
+
+    spec->fd = _XimXTransGetConnectionNumber (spec->trans_conn);
+
+    if (!(window = XCreateSimpleWindow(im->core.display,
+               DefaultRootWindow(im->core.display), 0, 0, 1, 1, 1, 0, 0)))
+       return False;
+    spec->window = window;
+
+    _XRegisterFilterByType(im->core.display, window, KeyPress, KeyPress,
+                               _XimTransFilterWaitEvent, (XPointer)im);
+
+    return _XRegisterInternalConnection(im->core.display, spec->fd,
+                       (_XInternalConnectionProc)_XimTransInternalConnection,
+                       (XPointer)im);
+}
+
+
+Private Bool
+_XimTransShutdown(
+    Xim im)
+{
+    TransSpecRec *spec = (TransSpecRec *)im->private.proto.spec;
+
+    _XimXTransDisconnect(spec->trans_conn);
+    (void)_XimXTransClose(spec->trans_conn);
+    _XimFreeTransIntrCallback(im);
+    _XUnregisterInternalConnection(im->core.display, spec->fd);
+    _XUnregisterFilter(im->core.display, spec->window,
+                               _XimTransFilterWaitEvent, (XPointer)im);
+    XDestroyWindow(im->core.display, spec->window);
+    Xfree(spec->address);
+    Xfree(spec);
+    return True;
+}
+
+
+
+Public Bool
+_XimTransRegisterDispatcher(
+    Xim                                 im,
+    Bool                        (*callback)(
+                                            Xim, INT16, XPointer, XPointer
+                                            ),
+    XPointer                    call_data)
+{
+    TransSpecRec               *spec = (TransSpecRec *)im->private.proto.spec;
+    TransIntrCallbackPtr        rec;
+
+    if (!(rec = (TransIntrCallbackPtr)Xmalloc(sizeof(TransIntrCallbackRec))))
+        return False;
+
+    rec->func       = callback;
+    rec->call_data  = call_data;
+    rec->next       = spec->intr_cb;
+    spec->intr_cb   = rec;
+    return True;
+}
+
+
+Public void
+_XimFreeTransIntrCallback(
+    Xim                                 im)
+{
+    TransSpecRec               *spec = (TransSpecRec *)im->private.proto.spec;
+    register TransIntrCallbackPtr       rec, next;
+
+    for (rec = spec->intr_cb; rec;) {
+       next = rec->next;
+       Xfree(rec);
+       rec = next;
+    }
+    return;
+}
+
+
+Public Bool
+_XimTransCallDispatcher(Xim im, INT16 len, XPointer data)
+{
+    TransSpecRec               *spec = (TransSpecRec *)im->private.proto.spec;
+    TransIntrCallbackRec       *rec;
+
+    for (rec = spec->intr_cb; rec; rec = rec->next) {
+       if ((*rec->func)(im, len, data, rec->call_data))
+           return True;
+    }
+    return False;
+}
+
+
+Public Bool
+_XimTransFilterWaitEvent(
+    Display            *d,
+    Window              w,
+    XEvent             *ev,
+    XPointer            arg)
+{
+    Xim                         im = (Xim)arg;
+    TransSpecRec       *spec = (TransSpecRec *)im->private.proto.spec;
+
+    spec->is_putback  = False;
+    return _XimFilterWaitEvent(im);
+}
+
+
+Public void
+_XimTransInternalConnection(
+    Display            *d,
+    int                         fd,
+    XPointer            arg)
+{
+    Xim                         im = (Xim)arg;
+    XEvent              ev;
+    XKeyEvent          *kev;
+    TransSpecRec       *spec = (TransSpecRec *)im->private.proto.spec;
+
+    if (spec->is_putback)
+       return;
+    kev = (XKeyEvent *)&ev;
+    kev->type = KeyPress;
+    kev->send_event = False;
+    kev->display = im->core.display;
+    kev->window = spec->window;
+    kev->keycode = 0;
+    XPutBackEvent(im->core.display, &ev);
+    XFlush(im->core.display);
+    spec->is_putback = True;
+    return;
+}
+
+
+Public Bool
+_XimTransWrite(Xim im, INT16 len, XPointer data)
+{
+    TransSpecRec       *spec   = (TransSpecRec *)im->private.proto.spec;
+    char               *buf = (char *)data;
+    register int        nbyte;
+
+    while (len > 0) {
+       if ((nbyte = _XimXTransWrite(spec->trans_conn, buf, len)) <= 0)
+           return False;
+       len -= nbyte;
+       buf += nbyte;
+    }
+    return True;
+}
+
+
+Public Bool
+_XimTransRead(
+    Xim                         im,
+    XPointer            recv_buf,
+    int                         buf_len,
+    int                        *ret_len)
+{
+    TransSpecRec       *spec = (TransSpecRec *)im->private.proto.spec;
+    int                         len;
+
+    if (buf_len == 0) {
+       *ret_len = 0;
+       return True;
+    }
+    if ((len = _XimXTransRead(spec->trans_conn, recv_buf, buf_len)) <= 0)
+       return False;
+    *ret_len = len;
+    return True;
+}
+
+
+Public void
+_XimTransFlush(
+    Xim                 im)
+{
+    return;
+}
+
+
+
+Public Bool
+_XimTransConf(
+    Xim                         im,
+    char               *address)
+{
+    char               *paddr;
+    TransSpecRec       *spec;
+
+    if (!(paddr = strdup(address)))
+       return False;
+
+    if (!(spec = Xcalloc(1, sizeof(TransSpecRec)))) {
+       Xfree(paddr);
+       return False;
+    }
+
+    spec->address   = paddr;
+
+    im->private.proto.spec     = (XPointer)spec;
+    im->private.proto.connect  = _XimTransConnect;
+    im->private.proto.shutdown = _XimTransShutdown;
+    im->private.proto.write    = _XimTransWrite;
+    im->private.proto.read     = _XimTransRead;
+    im->private.proto.flush    = _XimTransFlush;
+    im->private.proto.register_dispatcher = _XimTransRegisterDispatcher;
+    im->private.proto.call_dispatcher = _XimTransCallDispatcher;
+
+    return True;
+}
diff --git a/modules/im/ximcp/imTransR.c b/modules/im/ximcp/imTransR.c
new file mode 100644 (file)
index 0000000..25315b1
--- /dev/null
@@ -0,0 +1,312 @@
+/*
+ * Copyright 1992 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 1992, 1993, 1994 by FUJITSU LIMITED
+
+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 FUJITSU LIMITED
+not be used in advertising or publicity pertaining to distribution
+of the software without specific, written prior permission.
+FUJITSU LIMITED makes no representations about the suitability of
+this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL FUJITSU LIMITED 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.
+
+  Author: Hideki Hiura (hhiura@Sun.COM) Sun Microsystems, Inc.
+          Takashi Fujiwara     FUJITSU LIMITED
+                               fujiwara@a80.tech.yk.fujitsu.co.jp
+
+******************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "XimTrInt.h"
+#include "Ximint.h"
+
+Public TransportSW _XimTransportRec[] = {
+    { "X",          _XimXConf },  /* 1st entry must be X.
+                                       This will be a fallback */
+#ifdef TCPCONN
+    { "tcp",        _XimTransConf }, /* use X transport lib */
+#endif /* TCPCONN */
+#if defined(UNIXCONN) || defined(LOCALCONN)
+    { "local",      _XimTransConf }, /* use X transport lib */
+#endif /* UNIXCONN */
+#ifdef DNETCONN
+    { "dnet",     _XimTransConf }, /* use X transport lib */
+#endif /* DNETCONN */
+#ifdef STREAMSCONN
+    { "streams",    _XimTransConf }, /* use X transport lib */
+#endif /* STREAMSCONN */
+    { (char *)NULL, (Bool (*)(Xim, char *))NULL },
+};
+
+Public Bool
+_XimConnect(Xim im)
+{
+    return im->private.proto.connect(im);
+}
+
+Public Bool
+_XimShutdown(Xim im)
+{
+    return im->private.proto.shutdown(im);
+}
+
+Public Bool
+_XimWrite(Xim im, INT16 len, XPointer data)
+{
+    return im->private.proto.write(im, len, data);
+}
+
+Private int
+_CheckProtocolData(
+    Xim                  im,
+    char        *recv_buf)
+{
+    int                 data_len;
+
+    data_len = (int)(((*((CARD16 *)recv_buf + 1)) * 4) + XIM_HEADER_SIZE);
+    return data_len;
+}
+
+Private int
+_XimReadData(
+    Xim                 im,
+    INT16      *len,
+    XPointer    buf,
+    int                 buf_size)
+{
+    char       *hold_buf;
+    char       *tmp;
+    int                 data_len;
+    int                 packet_size;
+    int                 ret_len;
+    register int i;
+
+    if (buf_size < XIM_HEADER_SIZE) {
+       *len = (INT16)XIM_HEADER_SIZE;
+       return XIM_OVERFLOW;
+    }
+
+    bzero(buf, buf_size);
+    packet_size = 0;
+    data_len = 0;
+
+    if ((hold_buf = im->private.proto.hold_data)) {
+       data_len = im->private.proto.hold_data_len;
+       if (data_len >= XIM_HEADER_SIZE) {
+           packet_size = _CheckProtocolData(im, hold_buf);
+           if (packet_size > buf_size) {
+               *len = (INT16)packet_size;
+               return XIM_OVERFLOW;
+           }
+           if (packet_size <= data_len) {
+               memcpy(buf, hold_buf, packet_size);
+               for (i = packet_size; i < data_len; i++) {
+                   if (hold_buf[i])
+                       break;
+               }
+               data_len -= i;
+
+               if (data_len) {
+                   if (!(tmp = (char *)Xmalloc(data_len))) {
+                       return XIM_FALSE;
+                   }
+                   memcpy(tmp, &hold_buf[i], data_len);
+                   im->private.proto.hold_data = tmp;
+                   im->private.proto.hold_data_len = data_len;
+               } else {
+                   im->private.proto.hold_data = 0;
+                   im->private.proto.hold_data_len = 0;
+               }
+               Xfree(hold_buf);
+               *len = (INT16)packet_size;
+               return XIM_TRUE;
+           }
+       }
+       memcpy(buf, hold_buf, data_len);
+       buf_size -= data_len;
+       Xfree(hold_buf);
+       im->private.proto.hold_data = 0;
+       im->private.proto.hold_data_len = 0;
+    }
+
+    if (!packet_size) {
+       while (data_len < XIM_HEADER_SIZE) {
+           if (!(im->private.proto.read(im,
+                       (XPointer)&buf[data_len], buf_size, &ret_len))) {
+               return XIM_FALSE;
+           }
+           data_len += ret_len;
+           buf_size -= ret_len;
+       }
+       packet_size = _CheckProtocolData(im, buf);
+    }
+
+    if (packet_size > buf_size) {
+       if (!(tmp = (char *)Xmalloc(data_len))) {
+           return XIM_FALSE;
+       }
+       memcpy(tmp, buf, data_len);
+       bzero(buf, data_len);
+       im->private.proto.hold_data = tmp;
+       im->private.proto.hold_data_len = data_len;
+       *len = (INT16)packet_size;
+       return XIM_OVERFLOW;
+    }
+
+    while (data_len < packet_size) {
+       if (!(im->private.proto.read(im,
+                       (XPointer)&buf[data_len], buf_size, &ret_len))) {
+           return XIM_FALSE;
+       }
+       data_len += ret_len;
+       buf_size -= ret_len;
+    }
+
+    for (i = packet_size; i < data_len; i++) {
+       if (buf[i])
+           break;
+    }
+    data_len -= i;
+
+    if (data_len) {
+       if (!(tmp = (char *)Xmalloc(data_len))) {
+           return XIM_FALSE;
+       }
+       memcpy(tmp, &buf[i], data_len);
+       bzero(&buf[i], data_len);
+       im->private.proto.hold_data = tmp;
+       im->private.proto.hold_data_len = data_len;
+    } else {
+       im->private.proto.hold_data = 0;
+       im->private.proto.hold_data_len = 0;
+    }
+    *len = (INT16)packet_size;
+    return XIM_TRUE;
+}
+
+Private Bool
+_XimCallDispatcher(
+    Xim                 im,
+    INT16       len,
+    XPointer    data)
+{
+    return im->private.proto.call_dispatcher(im, len, data);
+}
+
+Public int
+_XimRead(Xim im, INT16 *len, XPointer buf, int buf_size,
+        Bool (*predicate)(Xim, INT16, XPointer, XPointer), XPointer arg)
+{
+    INT16       read_len;
+    int                 ret_code;
+
+    for (;;) {
+       ret_code = _XimReadData(im, &read_len, buf, buf_size);
+       if(ret_code != XIM_TRUE) {
+           return ret_code;
+       }
+       if ((*predicate)(im, read_len, buf, arg))
+           break;
+       if (_XimCallDispatcher(im, read_len, buf))
+           continue;
+       _XimError(im, 0, XIM_BadProtocol, (INT16)0, (CARD16)0, (char *)NULL);
+    }
+    *len = read_len;
+    return True;
+}
+
+Public Bool
+_XimRegisterDispatcher(
+    Xim                 im,
+    Bool        (*callback)(
+                            Xim, INT16, XPointer, XPointer
+                            ),
+    XPointer    call_data)
+{
+    return im->private.proto.register_dispatcher(im, callback, call_data);
+}
+
+Public void
+_XimFlush(Xim im)
+{
+    im->private.proto.flush(im);
+    return;
+}
+
+Public Bool
+_XimFilterWaitEvent(Xim im)
+{
+    INT16       read_len;
+    CARD32      reply32[BUFSIZE/4];
+    char       *reply = (char *)reply32;
+    XPointer    preply;
+    int                 buf_size;
+    int                 ret_code;
+
+    buf_size = BUFSIZE;
+    ret_code = _XimReadData(im, &read_len, (XPointer)reply, buf_size);
+    if(ret_code == XIM_TRUE) {
+       preply = reply;
+    } else if(ret_code == XIM_OVERFLOW) {
+       if(read_len <= 0) {
+           preply = reply;
+       } else {
+           buf_size = (int)read_len;
+           preply = (XPointer)Xmalloc(buf_size);
+           ret_code = _XimReadData(im, &read_len, preply, buf_size);
+           if(ret_code != XIM_TRUE) {
+               if (preply != reply)
+                   Xfree(preply);
+               return False;
+           }
+       }
+    } else {
+       return False;
+    }
+    if (_XimCallDispatcher(im, read_len, preply)) {
+       if(reply != preply)
+           Xfree(preply);
+       return True;
+    }
+    _XimError(im, 0, XIM_BadProtocol, (INT16)0, (CARD16)0, (char *)NULL);
+    if(reply != preply)
+       Xfree(preply);
+    return True;
+}
diff --git a/modules/lc/Makefile.am b/modules/lc/Makefile.am
new file mode 100644 (file)
index 0000000..3cad2d6
--- /dev/null
@@ -0,0 +1 @@
+SUBDIRS=Utf8 def gen xlocale
diff --git a/modules/lc/Utf8/Makefile.am b/modules/lc/Utf8/Makefile.am
new file mode 100644 (file)
index 0000000..50049c2
--- /dev/null
@@ -0,0 +1,34 @@
+AM_CPPFLAGS= \
+       -I$(top_srcdir)/include \
+       -I$(top_srcdir)/include/X11 \
+       -I$(top_builddir)/include \
+       -I$(top_builddir)/include/X11 \
+       -I$(top_srcdir)/src/xcms \
+       -I$(top_srcdir)/src/xkb \
+       -I$(top_srcdir)/src/xlibi18n \
+       -D_BSD_SOURCE
+
+AM_CFLAGS= \
+       $(X11_CFLAGS) \
+       $(BIGFONT_CFLAGS) \
+       $(MALLOC_ZERO_CFLAGS) \
+       $(CWARNFLAGS)
+
+if XLIB_LOADABLE_I18N
+
+commonlibdir = $(X11_LOCALELIBDIR)/common
+commonlib_LTLIBRARIES=xlcUTF8Load.la
+xlcUTF8Load_la_LDFLAGS = -module -version-number 2:0:0
+xlcUTF8Load_la_LIBADD = $(I18N_MODULE_LIBS)
+
+else
+
+noinst_LTLIBRARIES = libxlcUTF8Load.la
+
+endif
+
+
+xlcUTF8Load_la_SOURCES = \
+       lcUTF8Load.c
+
+libxlcUTF8Load_la_SOURCES = $(xlcUTF8Load_la_SOURCES)
diff --git a/modules/lc/Utf8/lcUTF8Load.c b/modules/lc/Utf8/lcUTF8Load.c
new file mode 100644 (file)
index 0000000..82ea3b5
--- /dev/null
@@ -0,0 +1,70 @@
+/******************************************************************
+
+              Copyright 1993 by SunSoft, Inc.
+              Copyright 1999-2000 by Bruno Haible
+
+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 names of SunSoft, Inc. and
+Bruno Haible not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.  SunSoft, Inc. and Bruno Haible make no representations
+about the suitability of this software for any purpose.  It is
+provided "as is" without express or implied warranty.
+
+SunSoft Inc. AND Bruno Haible DISCLAIM ALL WARRANTIES WITH REGARD
+TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS, IN NO EVENT SHALL SunSoft, Inc. OR Bruno Haible 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.
+
+******************************************************************/
+
+/*
+ * This file contains the UTF-8 locale loader.
+ *     Supports: all locales with codeset UTF-8.
+ *     Platforms: all systems.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include "Xlibint.h"
+#include "XlcPubI.h"
+#include "XlcGeneric.h"
+
+XLCd
+_XlcUtf8Loader(
+    const char *name)
+{
+    XLCd lcd;
+
+    lcd = _XlcCreateLC(name, _XlcGenericMethods);
+    if (lcd == (XLCd) NULL)
+       return lcd;
+
+    /* The official IANA name for UTF-8 is "UTF-8" in upper case with a dash. */
+    if (!XLC_PUBLIC_PART(lcd)->codeset) {
+       _XlcDestroyLC(lcd);
+       return (XLCd) NULL;
+    }
+    else if (!_XlcCompareISOLatin1(XLC_PUBLIC_PART(lcd)->codeset, "UTF-8")) {
+        _XlcAddUtf8LocaleConverters(lcd);
+    }
+    else if (!_XlcCompareISOLatin1(XLC_PUBLIC_PART(lcd)->codeset, "GB18030")) {
+        _XlcAddGB18030LocaleConverters(lcd);
+    }
+    else {
+       _XlcDestroyLC(lcd);
+       return (XLCd) NULL;
+    }
+
+    _XlcAddUtf8Converters(lcd);
+
+    return lcd;
+}
diff --git a/modules/lc/def/Makefile.am b/modules/lc/def/Makefile.am
new file mode 100644 (file)
index 0000000..3307077
--- /dev/null
@@ -0,0 +1,32 @@
+AM_CPPFLAGS= \
+       -I$(top_srcdir)/include \
+       -I$(top_srcdir)/include/X11 \
+       -I$(top_builddir)/include \
+       -I$(top_builddir)/include/X11 \
+       -I$(top_srcdir)/src/xcms \
+       -I$(top_srcdir)/src/xkb \
+       -I$(top_srcdir)/src/xlibi18n \
+       -D_BSD_SOURCE
+
+AM_CFLAGS= \
+       $(X11_CFLAGS) \
+       $(BIGFONT_CFLAGS) \
+       $(CWARNFLAGS)
+
+if XLIB_LOADABLE_I18N
+
+commonlibdir = $(X11_LOCALELIBDIR)/common
+commonlib_LTLIBRARIES=xlcDef.la
+xlcDef_la_LDFLAGS = -module -version-number 2:0:0
+xlcDef_la_LIBADD = $(I18N_MODULE_LIBS)
+
+else
+
+noinst_LTLIBRARIES = libxlcDef.la
+
+endif
+
+xlcDef_la_SOURCES = \
+       lcDefConv.c
+
+libxlcDef_la_SOURCES = $(xlcDef_la_SOURCES)
diff --git a/modules/lc/def/lcDefConv.c b/modules/lc/def/lcDefConv.c
new file mode 100644 (file)
index 0000000..12a4861
--- /dev/null
@@ -0,0 +1,791 @@
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * 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 TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA 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.
+ *
+ * Author: Katsuhisa Yano      TOSHIBA Corp.
+ *                             mopi@osa.ilab.toshiba.co.jp
+ */
+/*
+ * 2000
+ * Modifier: Ivan Pascal        The XFree86 Project
+ */
+
+/*
+ * The default locale loader.
+ * Supports: one byte per char (iso8859 like) locales.
+ * How: converts bytes to wide characters in a 1:1 manner.
+ * Platforms: all systems.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XlcGeneric.h"
+
+#ifndef MB_LEN_MAX
+#define MB_LEN_MAX 6
+#endif
+
+#if !defined(Lynx_22) && !defined(X_LOCALE)
+#define STDCVT
+#endif
+
+#define GR     0x80
+#define GL     0x7f
+
+typedef struct _StateRec *State;
+typedef struct _StateRec {
+    CodeSet     GL_codeset;
+    CodeSet     GR_codeset;
+    wchar_t     wc_mask;
+    wchar_t     wc_encode_mask;
+    Bool        (*MBtoWC) (State state, const char *ch, wchar_t *wc);
+    Bool        (*WCtoMB) (State state, wchar_t wc, char *ch);
+} StateRec;
+
+static
+Bool MBtoWCdef(
+    State    state,
+    const char *ch,
+    wchar_t  *wc)
+{
+    wchar_t wc_encoding;
+    CodeSet codeset = (*ch & GR) ? state->GR_codeset : state->GL_codeset;
+    if (!codeset)
+       return False;
+    wc_encoding = codeset->wc_encoding;
+    *wc = ((wchar_t) *ch & state->wc_mask) | wc_encoding;
+    return True;
+}
+
+#ifdef STDCVT
+static
+Bool MBtoWCstd(
+    State   state,
+    const char *ch,
+    wchar_t *wc)
+{
+    return (mbtowc(wc, ch, 1) == 1);
+}
+#endif
+
+static
+Bool WCtoMBdef(
+    State   state,
+    wchar_t wc,
+    char    *ch)
+{
+    wchar_t wc_encoding = wc & state->wc_encode_mask;
+    CodeSet codeset;
+
+    codeset = state->GL_codeset;
+    if (codeset && (wc_encoding == codeset->wc_encoding)) {
+       *ch = wc & state->wc_mask;
+       return True;
+    }
+    codeset = state->GR_codeset;
+    if (codeset && (wc_encoding == codeset->wc_encoding)) {
+       *ch = (wc & state->wc_mask) | GR;
+       return True;
+    }
+    return False;
+}
+
+#ifdef STDCVT
+static
+Bool WCtoMBstd(
+    State   state,
+    wchar_t wc,
+    char    *ch)
+{
+    return (wctomb(ch, wc) == 1);
+}
+#endif
+
+static
+XlcCharSet get_charset(
+    State  state,
+    char   side)
+{
+    CodeSet codeset = side ? state->GR_codeset : state->GL_codeset;
+    if (codeset) {
+       int i;
+       XlcCharSet charset;
+       for (i = 0; i < codeset->num_charsets; i++) {
+           charset = codeset->charset_list[i];
+           if (*charset->ct_sequence != '\0')
+               return charset;
+       }
+       return *(codeset->charset_list);
+    }
+    return (XlcCharSet) NULL;
+}
+
+static int
+def_mbstowcs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    const char *src = (const char *) *from;
+    wchar_t *dst = (wchar_t *) * to;
+    State state = (State) conv->state;
+    int unconv = 0;
+
+    if (from == NULL || *from == NULL)
+       return 0;
+
+    while (*from_left && *to_left) {
+       (*from_left)--;
+       if (state->MBtoWC (state, src++, dst)) {
+           dst++;
+           (*to_left)--;
+       } else {
+           unconv++;
+       }
+    }
+    *from = (XPointer) src;
+    *to = (XPointer) dst;
+    return unconv;
+}
+
+static int
+def_wcstombs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    const wchar_t *src = (const wchar_t *) * from;
+    char  *dst = (char *) *to;
+    State state = (State) conv->state;
+    char ch[MB_LEN_MAX];
+    int unconv = 0;
+
+    if (from == NULL || *from == NULL)
+       return 0;
+
+    while (*from_left && *to_left) {
+       (*from_left)--;
+       if (state->WCtoMB (state, *src++, ch)) {
+           *dst++ = *ch;
+           (*to_left)--;
+       } else {
+           unconv++;
+       }
+    }
+    *from = (XPointer) src;
+    *to = (XPointer) dst;
+    return unconv;
+}
+
+static int
+mbstostr(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    const char *src = (const char *) *from;
+    char *dst = (char *) *to;
+    CodeSet codeset;
+    State state = (State) conv->state;
+    char ch;
+    int unconv = 0;
+
+    if (from == NULL || *from == NULL)
+       return 0;
+
+    while (*from_left && *to_left) {
+       ch = *src++;
+       (*from_left)--;
+
+       codeset = (ch & GR) ? state->GR_codeset : state->GL_codeset;
+       if (codeset && codeset->string_encoding) {
+           *dst++ = ch;
+           (*to_left)--;
+       } else {
+           unconv++;
+       }
+    }
+    *from = (XPointer) src;
+    *to = (XPointer) dst;
+    return unconv;
+}
+
+static int
+wcstostr(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    const wchar_t *src = (const wchar_t *) *from;
+    char *dst = (char *) *to;
+    CodeSet codeset;
+    State state = (State) conv->state;
+    char ch[MB_LEN_MAX];
+    int unconv = 0;
+
+    if (from == NULL || *from == NULL)
+       return 0;
+
+    while (*from_left && *to_left) {
+       (*from_left)--;
+       if (state->WCtoMB (state, *src++, ch)) {
+           codeset = (*ch & GR) ? state->GR_codeset : state->GL_codeset;
+           if (codeset && codeset->string_encoding) {
+               *dst++ = *ch;
+               (*to_left)--;
+           } else {
+               unconv++;
+           }
+       } else {
+           unconv++;
+       }
+    }
+    *from = (XPointer) src;
+    *to = (XPointer) dst;
+    return unconv;
+}
+
+static int
+mbstocs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    const char *src = (const char *) *from;
+    char *dst = (char *) *to;
+    int length;
+    State state = (State) conv->state;
+    char cur_side;
+    int unconv = 0;
+
+    if (from == NULL || *from == NULL)
+       return 0;
+
+    length = min(*from_left, *to_left);
+
+    cur_side = *src & GR;
+    while (length) {
+       if ((char) (*src & GR) != cur_side)
+           break;
+       *dst++ = *src++;
+       length--;
+    }
+
+    if (num_args > 0) {
+       XlcCharSet      charset = get_charset(state, cur_side);
+       if (charset) {
+           *((XlcCharSet *) args[0]) = charset;
+       } else {
+           dst = *to;
+           unconv = -1;
+       }
+    }
+    *from_left -= src - (char *) *from;
+    *to_left -= dst - (char *) *to;
+    *from = (XPointer) src;
+    *to = (XPointer) dst;
+    return unconv;
+}
+
+static int
+wcstocs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    const wchar_t *src = (const wchar_t *) * from;
+    char *dst = (char *) *to;
+    State state = (State) conv->state;
+    char cur_side = 0, ch[MB_LEN_MAX];
+    int unconv = 0;
+    Bool found = False;
+
+    if (from == NULL || *from == NULL)
+       return 0;
+
+    while (*from_left) {
+       if ((found = state->WCtoMB (state, *src, ch)))
+           break;
+       unconv++;
+       src++;
+       (*from_left)--;
+    }
+
+    if (found) {
+       cur_side = *ch & GR;
+       while (*from_left && *to_left) {
+           (*from_left)--;
+           if (state->WCtoMB (state, *src++, ch)) {
+               if ((char) (*ch & GR) != cur_side) {
+                   src--;
+                   (*from_left)++;
+                   break;
+               } else {
+                   *dst++ = *ch;
+                   (*to_left)--;
+               }
+           } else {
+               unconv++;
+           }
+       }
+    } else {
+       unconv++;
+    }
+
+    if (num_args > 0) {
+       XlcCharSet charset = get_charset(state, cur_side);
+       if (charset) {
+           *((XlcCharSet *) args[0]) = charset;
+       } else {
+           unconv = -1;
+       }
+    }
+    *from = (XPointer) src;
+    *to = (XPointer) dst;
+    return unconv;
+}
+
+static int
+cstombs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    const char *src = (const char *) *from;
+    char *dst = (char *) *to;
+    CodeSet codeset;
+    XlcCharSet charset;
+    State state = (State) conv->state;
+    unsigned char cur_side = 0;
+    int i;
+    Bool found = False;
+
+    if (from == NULL || *from == NULL)
+       return 0;
+
+    if (num_args > 0) {
+       charset = (XlcCharSet) args[0];
+       if (charset == NULL)
+           return -1;
+    } else {
+       return -1;
+    }
+
+    if ((charset->side == XlcGL) || (charset->side == XlcGLGR)) {
+       codeset = state->GL_codeset;
+       if (codeset) {
+           for (i = 0; i < codeset->num_charsets; i++)
+               if (charset == codeset->charset_list[i]) {
+                   found = True;
+                   cur_side = 0;
+                   break;
+               }
+       }
+    }
+    if (!found && ((charset->side == XlcGR) || (charset->side == XlcGLGR))) {
+       codeset = state->GR_codeset;
+       if (codeset) {
+           for (i = 0; i < codeset->num_charsets; i++)
+               if (charset == codeset->charset_list[i]) {
+                   found = True;
+                   cur_side = GR;
+                   break;
+               }
+       }
+    }
+    if (found) {
+       int length = min(*from_left, *to_left);
+       while (length) {
+           *dst++ = *src++ | cur_side;
+           length--;
+       }
+    } else {
+       return -1;
+    }
+
+    *from_left -= src - (char *) *from;
+    *to_left -= dst - (char *) *to;
+    *from = (XPointer) src;
+    *to = (XPointer) dst;
+    return 0;
+}
+
+static int
+cstowcs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    const char *src = (const char *) *from;
+    wchar_t *dst = (wchar_t *) * to;
+    CodeSet codeset;
+    XlcCharSet charset;
+    State state = (State) conv->state;
+    Bool found = False;
+    int i, unconv = 0;
+    unsigned char cur_side = 0;
+
+    if (from == NULL || *from == NULL)
+       return 0;
+
+    if (num_args > 0) {
+       charset = (XlcCharSet) args[0];
+       if (charset == NULL)
+           return -1;
+    } else {
+       return -1;
+    }
+
+    if ((charset->side == XlcGL) || (charset->side == XlcGLGR)) {
+       codeset = state->GL_codeset;
+       if (codeset) {
+           for (i = 0; i < codeset->num_charsets; i++)
+               if (charset == codeset->charset_list[i]) {
+                   found = True;
+                   cur_side = 0;
+                   break;
+               }
+       }
+    }
+    if (!found && ((charset->side == XlcGR) || (charset->side == XlcGLGR))) {
+       codeset = state->GR_codeset;
+       if (codeset) {
+           for (i = 0; i < codeset->num_charsets; i++)
+               if (charset == codeset->charset_list[i]) {
+                   found = True;
+                   cur_side = GR;
+                   break;
+               }
+       }
+    }
+    if (found) {
+       char ch;
+       while (*from_left && *to_left) {
+           ch = *src++ | cur_side;
+           (*from_left)--;
+           if (state->MBtoWC (state, &ch, dst)) {
+               dst++;
+               (*to_left)--;
+           } else {
+               unconv++;
+           }
+       }
+    } else {
+       return -1;
+    }
+    *from = (XPointer) src;
+    *to = (XPointer) dst;
+    return unconv;
+}
+
+static int
+strtombs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    const char *src = (const char *) *from;
+    char *dst = (char *) *to;
+    int length;
+
+    if (from == NULL || *from == NULL)
+       return 0;
+
+    length = min(*from_left, *to_left);
+    while (length) {
+       *dst++ = *src++;
+       length--;
+    }
+
+    *from_left -= src - (char *) *from;
+    *to_left -= dst - (char *) *to;
+    *from = (XPointer) src;
+    *to = (XPointer) dst;
+    return 0;
+}
+
+static void
+close_converter(
+    XlcConv conv)
+{
+    if (conv->state)
+       Xfree((char *) conv->state);
+
+    Xfree((char *) conv);
+}
+
+static XlcConv
+create_conv(
+    XLCd lcd,
+    XlcConvMethods methods)
+{
+    XlcConv conv;
+    State state;
+
+    conv = (XlcConv) Xcalloc(1, sizeof(XlcConvRec));
+    if (conv == NULL)
+       return (XlcConv) NULL;
+
+    state = (State) Xmalloc(sizeof(StateRec));
+    if (state == NULL) {
+       close_converter(conv);
+       return (XlcConv) NULL;
+    }
+    state->GL_codeset = XLC_GENERIC(lcd, initial_state_GL);
+    state->GR_codeset = XLC_GENERIC(lcd, initial_state_GR);
+    state->wc_mask = (1 << XLC_GENERIC(lcd, wc_shift_bits)) - 1;
+    state->wc_encode_mask = XLC_GENERIC(lcd, wc_encode_mask);
+
+#ifdef STDCVT
+    if (XLC_GENERIC(lcd, use_stdc_env) == True)
+       state->MBtoWC = &MBtoWCstd;
+    else
+#endif
+       state->MBtoWC = &MBtoWCdef;
+
+#ifdef STDCVT
+    if (XLC_GENERIC(lcd, use_stdc_env) == True)
+       state->WCtoMB = &WCtoMBstd;
+    else
+#endif
+       state->WCtoMB = &WCtoMBdef;
+
+    conv->methods = methods;
+    conv->state = (XPointer) state;
+
+    return conv;
+}
+
+static XlcConvMethodsRec mbstowcs_methods = {
+    close_converter,
+    def_mbstowcs,
+    NULL
+};
+
+static XlcConv
+open_mbstowcs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &mbstowcs_methods);
+}
+
+static XlcConvMethodsRec mbstostr_methods = {
+    close_converter,
+    mbstostr,
+    NULL
+};
+
+static XlcConv
+open_mbstostr(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &mbstostr_methods);
+}
+
+static XlcConvMethodsRec mbstocs_methods = {
+    close_converter,
+    mbstocs,
+    NULL
+};
+
+static XlcConv
+open_mbstocs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &mbstocs_methods);
+}
+
+static XlcConvMethodsRec wcstombs_methods = {
+    close_converter,
+    def_wcstombs,
+    NULL
+};
+
+static XlcConv
+open_wcstombs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &wcstombs_methods);
+}
+
+static XlcConvMethodsRec wcstostr_methods = {
+    close_converter,
+    wcstostr,
+    NULL
+};
+
+static XlcConv
+open_wcstostr(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &wcstostr_methods);
+}
+
+static XlcConvMethodsRec wcstocs_methods = {
+    close_converter,
+    wcstocs,
+    NULL
+};
+
+static XlcConv
+open_wcstocs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &wcstocs_methods);
+}
+
+static XlcConvMethodsRec strtombs_methods = {
+    close_converter,
+    strtombs,
+    NULL
+};
+
+static XlcConv
+open_strtombs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &strtombs_methods);
+}
+
+static XlcConvMethodsRec cstombs_methods = {
+    close_converter,
+    cstombs,
+    NULL
+};
+
+static XlcConv
+open_cstombs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &cstombs_methods);
+}
+
+static XlcConvMethodsRec cstowcs_methods = {
+    close_converter,
+    cstowcs,
+    NULL
+};
+
+static XlcConv
+open_cstowcs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &cstowcs_methods);
+}
+
+XLCd
+_XlcDefaultLoader(
+    const char *name)
+{
+    XLCd lcd;
+
+    lcd = _XlcCreateLC(name, _XlcGenericMethods);
+    if (lcd == NULL)
+       return lcd;
+
+    if (XLC_PUBLIC(lcd, mb_cur_max) != 1){
+        _XlcDestroyLC(lcd);
+        return (XLCd) NULL;
+    }
+
+    _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNWideChar, open_mbstowcs);
+    _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNString, open_mbstostr);
+    _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCharSet, open_mbstocs);
+    _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNChar, open_mbstocs);
+
+    _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNMultiByte, open_wcstombs);
+    _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNString, open_wcstostr);
+    _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCharSet, open_wcstocs);
+
+    _XlcSetConverter(lcd, XlcNString, lcd, XlcNMultiByte, open_strtombs);
+    _XlcSetConverter(lcd, XlcNString, lcd, XlcNWideChar, open_mbstowcs);
+
+    _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNMultiByte, open_cstombs);
+    _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNWideChar, open_cstowcs);
+
+    _XlcAddUtf8Converters(lcd);
+
+    return lcd;
+}
diff --git a/modules/lc/gen/Makefile.am b/modules/lc/gen/Makefile.am
new file mode 100644 (file)
index 0000000..8ed02a5
--- /dev/null
@@ -0,0 +1,32 @@
+AM_CPPFLAGS= \
+       -I$(top_srcdir)/include \
+       -I$(top_srcdir)/include/X11 \
+       -I$(top_builddir)/include \
+       -I$(top_builddir)/include/X11 \
+       -I$(top_srcdir)/src/xcms \
+       -I$(top_srcdir)/src/xkb \
+       -I$(top_srcdir)/src/xlibi18n \
+       -D_BSD_SOURCE
+
+AM_CFLAGS= \
+       $(X11_CFLAGS) \
+       $(BIGFONT_CFLAGS) \
+       $(CWARNFLAGS)
+
+if XLIB_LOADABLE_I18N
+
+commonlibdir = $(X11_LOCALELIBDIR)/common
+commonlib_LTLIBRARIES=xlibi18n.la
+xlibi18n_la_LDFLAGS = -module -version-number 2:0:0
+xlibi18n_la_LIBADD = $(I18N_MODULE_LIBS)
+
+else
+
+noinst_LTLIBRARIES = libxlibi18n.la
+
+endif
+
+xlibi18n_la_SOURCES = \
+       lcGenConv.c
+
+libxlibi18n_la_SOURCES = $(xlibi18n_la_SOURCES)
diff --git a/modules/lc/gen/lcGenConv.c b/modules/lc/gen/lcGenConv.c
new file mode 100644 (file)
index 0000000..42d63c5
--- /dev/null
@@ -0,0 +1,3145 @@
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * 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 TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA 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.
+ *
+ * Author: Katsuhisa Yano      TOSHIBA Corp.
+ *                             mopi@osa.ilab.toshiba.co.jp
+ */
+/*
+ *  (c) Copyright 1995 FUJITSU LIMITED
+ *  This is source code modified by FUJITSU LIMITED under the Joint
+ *  Development Agreement for the CDE/Motif PST.
+ *
+ *   Modifier: Masayoshi Shimamura      FUJITSU LIMITED
+ *
+ */
+/*
+ *  2000
+ *  Modifier: Ivan Pascal      The XFree86 Project
+ */
+
+/*
+ * A generic locale loader for all kinds of ISO-2022 based codesets.
+ * Supports: all locales.
+ * How: Provides generic converters for ISO-2022 based codesets. Extensible as
+ *      far as ISO-2022 is extensible: codesets can be given by name in the
+ *      stream. Overall distinction between GL (0x00..0x7f) and GR (0x80..0xff).
+ *      In every chunk between escape sequences, the number of bytes per
+ *      character (char_size) is constant.
+ * Platforms: all systems.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XlcGeneric.h"
+#include <stdio.h>
+
+#if !defined(Lynx_22) && !defined(X_LOCALE)
+#define STDCVT
+#endif
+
+typedef struct _CTDataRec {
+    const char *name;
+    const char *encoding; /* Compound Text encoding */
+} CTDataRec, *CTData;
+
+static CTDataRec directionality_data[] =
+{
+    { "BEGIN_LEFT-TO-RIGHT_TEXT", "\2331]" },
+    { "BEGIN_RIGHT-TO-LEFT_TEXT", "\2332]" },
+    { "END_OF_STRING", "\233]" },
+};
+
+typedef struct _StateRec {
+    XLCd lcd;
+    /* CT state */
+    XlcCharSet charset;                /* charset of current state */
+    XlcCharSet GL_charset;     /* charset of initial state in GL */
+    XlcCharSet GR_charset;     /* charset of initial state in GR */
+    /* MB shift state */
+    CodeSet  GL_codeset;
+    CodeSet  GR_codeset;
+} StateRec, *State;
+
+#define GR      0x80    /* begins right-side (non-ascii) region */
+#define GL      0x7f    /* ends left-side (ascii) region        */
+#define ESC    0x1b
+#define CSI    0x9b
+#define STX    0x02
+
+#define isrightside(c)   ((c) & GR)
+#define isleftside(c)  (!isrightside(c))
+
+/* Forward declarations for local routines. */
+static int mbstocts (XlcConv conv, XPointer *from, int *from_left,
+                    XPointer *to, int *to_left, XPointer *args, int num_args);
+static int ctstombs (XlcConv conv, XPointer *from, int *from_left,
+                    XPointer *to, int *to_left, XPointer *args, int num_args);
+static int cstombs (XlcConv conv, XPointer *from, int *from_left,
+                   XPointer *to, int *to_left, XPointer *args, int num_args);
+
+/* ------------------------------------------------------------------------- */
+/*                             Misc                                         */
+/* ------------------------------------------------------------------------- */
+
+static int
+compare(
+    const char *src,
+    const char *encoding,
+    int length)
+{
+    const char *start = src;
+
+    while (length-- > 0) {
+       if (*src++ != *encoding++)
+           return 0;
+       if (*encoding == '\0')
+           return src - start;
+    }
+
+    return 0;
+}
+
+static unsigned long
+conv_to_dest(
+    Conversion conv,
+    unsigned long code)
+{
+    int i;
+    int conv_num = conv->conv_num;
+    FontScope convlist = conv->convlist;
+
+    for (i = 0; i < conv_num; i++) {
+       if (convlist[i].start <= code && code <= convlist[i].end) {
+           switch (convlist[i].shift_direction) {
+           case '+':
+               return(code + convlist[i].shift);
+           case '-':
+               return(code - convlist[i].shift);
+            default:
+               return(code);
+           }
+       }
+    }
+
+    return(code);
+}
+
+static unsigned long
+conv_to_source(
+    Conversion conv,
+    unsigned long code)
+{
+    int i;
+    int conv_num;
+    FontScope convlist;
+    unsigned long start_p;
+    unsigned long start_m;
+    unsigned long end_p;
+    unsigned long end_m;
+
+    if (!conv)
+       return(code);
+
+    conv_num = conv->conv_num;
+    convlist = conv->convlist;
+
+    for (i = 0; i < conv_num; i++) {
+        switch (convlist[i].shift_direction) {
+       case '+':
+            start_p = convlist[i].start + convlist[i].shift;
+            end_p = convlist[i].end + convlist[i].shift;
+           if (start_p <= code && code <= end_p)
+               return(code - convlist[i].shift);
+            break;
+       case '-':
+            start_m = convlist[i].start - convlist[i].shift;
+            end_m = convlist[i].end - convlist[i].shift;
+           if (start_m <= code && code <= end_m)
+               return(code + convlist[i].shift);
+            break;
+        default:
+           continue;
+       }
+    }
+
+    return(code);
+}
+
+static unsigned long
+mb_to_gi(
+    unsigned long mb,
+    CodeSet codeset)
+{
+    int i;
+    unsigned long mb_tmp, mask = 0;
+
+    if (codeset->mbconv) {
+       mb_tmp = conv_to_dest(codeset->mbconv, mb);
+       if (mb_tmp != mb)
+           return(mb_tmp);
+    }
+
+    if (codeset->side == XlcC0 || codeset->side == XlcGL ||
+       codeset->side == XlcC1 || codeset->side == XlcGR) {
+
+        for (i = 0; i < codeset->length; i++)
+           mask = (mask << 8) | GL;
+       mb = mb & mask;
+    }
+
+    return(mb);
+}
+
+static unsigned long
+gi_to_mb(
+    unsigned long glyph_index,
+    CodeSet codeset)
+{
+    int i;
+    unsigned long mask = 0;
+
+    if (codeset->side == XlcC1 || codeset->side == XlcGR) {
+        for (i = 0; i < codeset->length; i++)
+           mask = (mask << 8) | GR;
+       glyph_index = glyph_index | mask;
+    }
+
+    if (codeset->mbconv)
+        return( conv_to_source(codeset->mbconv, glyph_index) );
+
+    return(glyph_index);
+}
+
+static Bool
+gi_to_wc(
+    XLCd lcd,
+    unsigned long glyph_index,
+    CodeSet codeset,
+    wchar_t *wc)
+{
+    unsigned char mask = 0;
+    unsigned long wc_encoding = codeset->wc_encoding;
+    int length = codeset->length;
+    unsigned long wc_shift_bits = XLC_GENERIC(lcd, wc_shift_bits);
+
+    mask = (1 << wc_shift_bits) - 1 ;
+
+    for (*wc = 0, length--; length >= 0; length--)
+       *wc = (*wc << wc_shift_bits) | ((glyph_index >> (length * 8 )) & mask);
+
+    *wc = *wc | wc_encoding;
+
+    return(True);
+}
+
+static Bool
+wc_to_gi(
+    XLCd lcd,
+    wchar_t wc,
+    unsigned long *glyph_index,
+    CodeSet *codeset)
+{
+    int i;
+    unsigned char mask = 0;
+    unsigned long wc_encoding;
+    unsigned long wc_encode_mask = XLC_GENERIC(lcd, wc_encode_mask);
+    unsigned long wc_shift_bits = XLC_GENERIC(lcd, wc_shift_bits);
+    int codeset_num = XLC_GENERIC(lcd, codeset_num);
+    CodeSet *codeset_list = XLC_GENERIC(lcd, codeset_list);
+
+    wc_encoding = wc & wc_encode_mask;
+    for (*codeset = NULL, i = 0; i < codeset_num; i++) {
+       if (wc_encoding == codeset_list[i]->wc_encoding) {
+           *codeset = codeset_list[i];
+           break;
+        }
+    }
+    if (*codeset == NULL)
+       return(False);
+
+    mask = (1 << wc_shift_bits) - 1 ;
+
+    wc = wc & ~wc_encode_mask;
+    for (*glyph_index = 0, i = (*codeset)->length - 1; i >= 0; i--)
+       *glyph_index = (*glyph_index << 8) |
+                     ( ((unsigned long)wc >> (i * wc_shift_bits)) & mask );
+
+    return(True);
+}
+
+static CodeSet
+mb_parse_codeset(
+    State state,
+    int num,
+    const char **inbufptr,
+    int *from_left)
+{
+    int len;
+    int from_len = (*from_left) + 1;
+    const char *src = (*inbufptr) - 1;
+    ParseInfo *mb_parse_list = XLC_GENERIC(state->lcd, mb_parse_list);
+    ParseInfo parse_info;
+    CodeSet codeset;
+
+    for (--num ; (parse_info = mb_parse_list[num]) != NULL; num++) {
+       len = compare(src, parse_info->encoding, from_len);
+       if (len > 0) {
+           codeset = parse_info->codeset;
+           if (parse_info->type == E_LSL)
+               state->GL_codeset = codeset;
+           else if (parse_info->type == E_LSR)
+               state->GR_codeset = codeset;
+           --len;
+           *inbufptr += len;
+           *from_left -= len;
+           return codeset;
+       }
+    }
+    return (CodeSet) NULL;
+}
+
+static CodeSet
+byteM_parse_codeset(
+    XLCd lcd,
+    const char *inbufptr)
+{
+    unsigned char ch;
+    CodeSet codeset;
+    ByteInfoList byteM;
+    ByteInfoListRec byteM_rec;
+    ByteInfo byteinfo;
+    ByteInfoRec byteinfo_rec;
+    Bool hit = False;
+    int i, j, k;
+
+    int codeset_num               = XLC_GENERIC(lcd, codeset_num);
+    CodeSet *codeset_list         = XLC_GENERIC(lcd, codeset_list);
+
+    for (i = 0; i < codeset_num; i++) {
+        codeset = codeset_list[i];
+        byteM = codeset->byteM;
+        if (codeset->side != XlcNONE || byteM == NULL)
+           continue;
+
+        for (j = 0; j < codeset->length; j++) {
+           ch = *((unsigned char *)(inbufptr + j));
+           byteM_rec = byteM[j];
+           byteinfo = byteM_rec.byteinfo;
+
+           for (hit = False, k = 0; k < byteM_rec.byteinfo_num; k++) {
+               byteinfo_rec = byteinfo[k];
+               if (byteinfo_rec.start <= ch && ch <= byteinfo_rec.end) {
+                   hit = True;
+                   break;
+                }
+            }
+
+            if (!hit)
+               break;
+        }
+
+        if (hit)
+           return(codeset);
+    }
+
+    return(NULL);
+}
+
+#define GLGR_parse_codeset(ch) \
+     (isrightside(ch) ? (state->GR_codeset) : \
+                        (state->GL_codeset) )
+
+static XlcCharSet
+gi_parse_charset(
+    unsigned long glyph_index,
+    CodeSet codeset)
+{
+    int i;
+    XlcCharSet *charset_list = codeset->charset_list;
+    int num_charsets = codeset->num_charsets;
+    ExtdSegment ctextseg = codeset->ctextseg;
+    XlcCharSet charset = NULL;
+    int area_num;
+    FontScope area;
+
+    /* lockup ct sequence */
+    for (i = 0; i < num_charsets; i++) {
+       charset = charset_list[i];
+        if (*charset->ct_sequence != '\0')
+           break;
+    }
+    if (i >= num_charsets)
+       return(NULL);
+
+    if (charset->source != CSsrcStd)
+        return (charset);
+
+    if (!ctextseg)
+        return(charset);
+
+    area = ctextseg->area;
+    area_num = ctextseg->area_num;
+
+    for (i = 0; i < area_num; i++) {
+
+        if (area[i].start <= glyph_index && glyph_index <= area[i].end) {
+
+           charset = ctextseg->charset;
+
+            if (*charset->ct_sequence == '\0')
+                return(NULL);
+
+           break;
+       }
+    }
+
+    return(charset);
+}
+
+static Bool
+ct_parse_csi(
+    const char *inbufptr,
+    int *ctr_seq_len)
+{
+    int i;
+    int num = sizeof(directionality_data) / sizeof(directionality_data[0]);
+
+    for (i = 0; i < num; i++) {
+       if ( !(*ctr_seq_len = strlen(directionality_data[i].encoding)) )
+           continue;
+
+       if ( strncmp(inbufptr, directionality_data[i].encoding,
+                                               *ctr_seq_len) == 0)
+            return(True);
+    }
+
+    return(False);
+}
+
+static int
+cmp_esc_sequence(
+    const char *inbufptr,
+    XlcCharSet charset)
+{
+    int seq_len, name_len, total_len;
+    unsigned char byte_m, byte_l;
+    const char *ct_sequence =  charset->ct_sequence;
+    const char *encoding_name = charset->encoding_name;
+
+    /* check esc sequence */
+    if ( !(seq_len = strlen(ct_sequence) ) )
+       return(0);
+    if ( strncmp(inbufptr, ct_sequence, seq_len) != 0)
+       return(0);
+
+    /* Standard Character Set Encoding ? */
+    if (charset->source == CSsrcStd)
+        return(seq_len);
+
+    /*
+     *   Non-Standard Character Set Encoding
+     *
+     * +--- ---+-----+-----+-----+----   ----+-----+-----+-------   ------+
+     * | ctseq |  M  |  L  |     encoding name     | STX |     contents   |
+     * +--- ---+-----+-----+-----+----   ----+-----+-----+-------   ------+
+     *  4bytes  1byte 1byte     variable length     1byte  variable length
+     *                            |                                              |
+     *                            +----------------------------------------------+
+     *                              rest length  = ((M - 128) * 128) + (L - 128)
+     */
+
+    /* get length of encoding name */
+    inbufptr += seq_len;
+    byte_m = *inbufptr++;
+    byte_l = *inbufptr++;
+    name_len = strlen(encoding_name);
+
+    if (((byte_m - 128) * 128 + (byte_l - 128) - 1) < name_len)
+       return(0);
+
+    if ( _XlcNCompareISOLatin1(inbufptr, encoding_name, name_len) != 0 )
+       return(0);
+
+    /* check STX (Start of Text) */
+    inbufptr = inbufptr + name_len;
+    if ( *inbufptr != STX )
+       return(0);
+
+    total_len = seq_len + name_len + 3;
+    return(total_len);
+}
+
+static Bool
+ct_parse_charset(
+    XLCd lcd,
+    const char *inbufptr,
+    XlcCharSet *charset,
+    int *ctr_seq_len)
+{
+    int i, j;
+    ExtdSegment ctextseg;
+    int num_charsets;
+    XlcCharSet *charset_list;
+    CodeSet codeset;
+    int codeset_num       = XLC_GENERIC(lcd, codeset_num);
+    CodeSet *codeset_list = XLC_GENERIC(lcd, codeset_list);
+    int segment_conv_num  = XLC_GENERIC(lcd, segment_conv_num);
+    SegConv segment_conv  = XLC_GENERIC(lcd, segment_conv);
+
+    /* get charset from XLC_XLOCALE by escape sequence */
+
+    for (i = 0; i < codeset_num; i++) {
+       codeset = codeset_list[i];
+
+       num_charsets = codeset->num_charsets;
+       charset_list = codeset->charset_list;
+       ctextseg     = codeset->ctextseg;
+
+       for (j = 0; j < num_charsets; j++) {
+           *charset = charset_list[j];
+            if ((*ctr_seq_len = cmp_esc_sequence(inbufptr, *charset)))
+               return(True);
+       }
+
+       if (ctextseg) {
+           *charset = ctextseg->charset;
+            if ((*ctr_seq_len = cmp_esc_sequence(inbufptr, *charset)))
+               return(True);
+       }
+    }
+
+    /* get charset from XLC_SEGMENTCONVERSION by escape sequence */
+
+    if (!segment_conv)
+       return(False);
+
+    for (i = 0; i < segment_conv_num; i++) {
+       *charset = segment_conv[i].source;
+        if ((*ctr_seq_len = cmp_esc_sequence(inbufptr, *charset)))
+           return(True);
+       *charset = segment_conv[i].dest;
+        if ((*ctr_seq_len = cmp_esc_sequence(inbufptr, *charset)))
+           return(True);
+    }
+
+    return(False);
+}
+
+static Bool
+segment_conversion(
+    XLCd lcd,
+    XlcCharSet *charset,
+    unsigned long *glyph_index)
+{
+    int i;
+    int segment_conv_num = XLC_GENERIC(lcd, segment_conv_num);
+    SegConv segment_conv = XLC_GENERIC(lcd, segment_conv);
+    FontScopeRec range;
+    ConversionRec conv_rec;
+
+    if (!segment_conv)
+       return(True);
+
+    for (i = 0; i < segment_conv_num; i++) {
+       if (segment_conv[i].source == *charset)
+           break;
+    }
+
+    if (i >= segment_conv_num)
+       return(True);
+
+    range = segment_conv[i].range;
+    if (*glyph_index < range.start || range.end < *glyph_index)
+       return(True);
+
+    *charset = segment_conv[i].dest;
+    conv_rec.conv_num = segment_conv[i].conv_num;
+    conv_rec.convlist = segment_conv[i].conv;
+    *glyph_index = conv_to_dest(&conv_rec, *glyph_index);
+
+    return(True);
+}
+
+static CodeSet
+_XlcGetCodeSetFromName(
+    XLCd lcd,
+    const char *name)
+{
+    int i, j;
+    XlcCharSet charset;
+    int num_charsets;
+    XlcCharSet *charset_list;
+    CodeSet codeset;
+
+    int codeset_num       = XLC_GENERIC(lcd, codeset_num);
+    CodeSet *codeset_list = XLC_GENERIC(lcd, codeset_list);
+
+    for (i = 0; i < codeset_num; i++) {
+        codeset = codeset_list[i];
+
+        num_charsets = codeset->num_charsets;
+        charset_list = codeset->charset_list;
+
+        for (j = 0; j < num_charsets; j++) {
+            charset = charset_list[j];
+
+            if (!strlen(charset->name))
+                continue;
+            if ( strcmp(charset->name, name) == 0)
+                return(codeset);
+        }
+    }
+
+    return(NULL);
+}
+
+static Bool
+_XlcGetCodeSetFromCharSet(
+    XLCd lcd,
+    XlcCharSet charset,
+    CodeSet *codeset,
+    unsigned long *glyph_index)
+{
+    int j, num;
+    CodeSet *codeset_list = XLC_GENERIC(lcd, codeset_list);
+    XlcCharSet *charset_list;
+    int codeset_num, num_charsets;
+    Conversion ctconv;
+    unsigned long glyph_index_tmp = 0;
+    ExtdSegment ctextseg;
+
+    codeset_num = XLC_GENERIC(lcd, codeset_num);
+
+    for (num = 0 ; num < codeset_num; num++) {
+        *codeset = codeset_list[num];
+        ctconv = (*codeset)->ctconv;
+       ctextseg = (*codeset)->ctextseg;
+
+        num_charsets = (*codeset)->num_charsets;
+        charset_list = (*codeset)->charset_list;
+
+        glyph_index_tmp = conv_to_source(ctconv, *glyph_index);
+
+        if (charset->source == CSsrcStd) {
+
+            /* Standard Character Set Encoding */
+           if (glyph_index_tmp == *glyph_index) {
+                for (j = 0; j < num_charsets; j++) {
+                    if (charset_list[j] == charset) {
+                        goto end_loop;
+                    }
+                }
+            }
+
+       } else {
+
+            /* Non-Standard Character Set Encoding */
+            for (j = 0; j < num_charsets; j++) {
+                if (charset_list[j] == charset) {
+                    goto end_loop;
+                }
+            }
+
+            if (glyph_index_tmp != *glyph_index) {
+               if (ctextseg && ctextseg->charset == charset) {
+                   goto end_loop;
+                }
+            }
+
+       }
+
+    }
+
+end_loop:
+    if (num < codeset_num) {
+       *glyph_index = glyph_index_tmp;
+       return(True);
+    }
+
+    return(False);
+}
+
+#define check_string_encoding(codeset) (codeset->string_encoding)
+
+static void
+output_ulong_value(
+    char *outbufptr,
+    unsigned long code,
+    int length,
+    XlcSide side)
+{
+    int i;
+
+    for (i = (length - 1) * 8; i >= 0; i -= 8) {
+       *outbufptr = ( code >> i) & 0xff;
+
+       if (side == XlcC0 || side == XlcGL) {
+           *outbufptr = *outbufptr & GL;
+       } else if (side == XlcC1 || side == XlcGR) {
+           *outbufptr = *outbufptr | GR;
+       }
+
+       outbufptr++;
+    }
+}
+
+/* -------------------------------------------------------------------------- */
+/*                             Init                                          */
+/* -------------------------------------------------------------------------- */
+
+static XlcCharSet default_GL_charset = 0;
+static XlcCharSet default_GR_charset = 0;
+
+static void
+init_state(
+    XlcConv conv)
+{
+    State state = (State) conv->state;
+
+    /* for CT */
+    state->charset = NULL;
+    state->GL_charset = default_GL_charset;
+    state->GR_charset = default_GR_charset;
+
+    /* for MB shift state */
+    state->GL_codeset = XLC_GENERIC(state->lcd, initial_state_GL);
+    state->GR_codeset = XLC_GENERIC(state->lcd, initial_state_GR);
+}
+
+/* -------------------------------------------------------------------------- */
+/*                             Convert                                       */
+/* -------------------------------------------------------------------------- */
+
+static int
+mbstowcs_org(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    State state = (State) conv->state;
+    XLCd lcd = state->lcd;
+
+    unsigned char ch;
+    unsigned long mb = 0;
+    wchar_t wc;
+
+    int length = 0, len_left = 0;
+    int unconv_num = 0;
+    int num;
+
+    CodeSet codeset = NULL;
+
+    const char *inbufptr = *from;
+    wchar_t *outbufptr = (wchar_t *) *to;
+    int from_size = *from_left;
+
+    unsigned char *mb_parse_table = XLC_GENERIC(lcd, mb_parse_table);
+
+    if (from == NULL || *from == NULL) {
+       _XlcResetConverter(conv);
+        return( 0 );
+    }
+
+    if (*from_left > *to_left)
+        *from_left = *to_left;
+
+    while (*from_left && *to_left) {
+
+       ch = *inbufptr++;
+       (*from_left)--;
+
+       /* null ? */
+       if (!ch) {
+            if (outbufptr) {*outbufptr++ = L'\0';}
+           (*to_left)--;
+
+           /* error check */
+            if (len_left) {
+               unconv_num += (length - len_left);
+               len_left = 0;
+            }
+
+           continue;
+       }
+
+       /* same mb char data */
+        if (len_left)
+           goto output_one_wc;
+
+        /* next mb char data for single shift ? */
+       if (mb_parse_table && (num = mb_parse_table[ch]) ) {
+           codeset = mb_parse_codeset(state, num, &inbufptr, from_left);
+            if (codeset != NULL) {
+               length = len_left = codeset->length;
+               mb = 0;
+               continue;
+           }
+        }
+
+       /* next mb char data for byteM ? */
+       if ((codeset = byteM_parse_codeset(lcd, (inbufptr - 1))))
+           goto next_mb_char;
+
+       /* next mb char data for GL or GR side ? */
+       if ((codeset = GLGR_parse_codeset(ch)))
+           goto next_mb_char;
+
+        /* can't find codeset for the ch */
+        unconv_num++;
+        continue;
+
+next_mb_char:
+        length = len_left = codeset->length;
+       mb = 0;
+
+output_one_wc:
+       mb = (mb << 8) | ch;  /* 1 byte left shift */
+       len_left--;
+
+        /* last of one mb char data */
+        if (!len_left) {
+            gi_to_wc(lcd, mb_to_gi(mb, codeset), codeset, &wc);
+            if (outbufptr) {*outbufptr++ = wc;}
+           (*to_left)--;
+        }
+
+    } /* end of while */
+
+    /* error check on last char */
+    if (len_left) {
+       inbufptr -= (length - len_left);
+       (*from_left) += (length - len_left);
+       unconv_num += (length - len_left);
+    }
+
+    *from = (XPointer) ((const char *) *from + from_size);
+    *from_left = 0;
+    *to = (XPointer) outbufptr;
+
+    return unconv_num;
+}
+
+static int
+stdc_mbstowcs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    const char *src = *((const char **) from);
+    wchar_t *dst = *((wchar_t **) to);
+    int src_left = *from_left;
+    int dst_left = *to_left;
+    int length, unconv_num = 0;
+
+    while (src_left > 0 && dst_left > 0) {
+       length = mbtowc(dst, src, src_left);
+
+       if (length > 0) {
+           src += length;
+           src_left -= length;
+           if (dst)
+               dst++;
+           dst_left--;
+       } else if (length < 0) {
+           src++;
+           src_left--;
+           unconv_num++;
+        } else {
+            /* null ? */
+            src++;
+            src_left--;
+            if (dst)
+                *dst++ = L'\0';
+            dst_left--;
+        }
+    }
+
+    *from = (XPointer) src;
+    if (dst)
+       *to = (XPointer) dst;
+    *from_left = src_left;
+    *to_left = dst_left;
+
+    return unconv_num;
+}
+
+static int
+wcstombs_org(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    State state = (State) conv->state;
+    XLCd lcd = state->lcd;
+
+    char *encoding;
+    unsigned long mb, glyph_index;
+    wchar_t wc;
+
+    int length;
+    int unconv_num = 0;
+
+    CodeSet codeset;
+
+    const wchar_t *inbufptr = (const wchar_t *) *from;
+    char *outbufptr = *to;
+    int from_size = *from_left;
+
+    const char *default_string = XLC_PUBLIC(lcd, default_string);
+    int defstr_len = strlen(default_string);
+
+
+    if (*from_left > *to_left)
+        *from_left = *to_left;
+
+    while (*from_left && *to_left) {
+
+        wc = *inbufptr++;
+        (*from_left)--;
+
+        /* null ? */
+        if (!wc) {
+            if (outbufptr) {*outbufptr++ = '\0';}
+            (*to_left)--;
+
+            continue;
+        }
+
+        /* convert */
+       if ( !wc_to_gi(lcd, wc, &glyph_index, &codeset) ) {
+
+           /* output default_string of XDefaultString() */
+            if (*to_left < defstr_len)
+               break;
+           if (outbufptr) {
+                strncpy((char *)outbufptr, default_string, defstr_len);
+                outbufptr += defstr_len;
+            }
+           (*to_left) -= defstr_len;
+
+            unconv_num++;
+
+        } else {
+            mb = gi_to_mb(glyph_index, codeset);
+           if (codeset->parse_info) {
+                Bool need_shift = False;
+                switch (codeset->parse_info->type) {
+                    case E_LSL :
+                        if (codeset != state->GL_codeset) {
+                            need_shift = True;
+                            state->GL_codeset = codeset;
+                        }
+                        break;
+                    case E_LSR :
+                        if (codeset != state->GR_codeset) {
+                            need_shift = True;
+                            state->GR_codeset = codeset;
+                        }
+                        break;
+                    /* case E_SS */
+                    default:
+                        need_shift = True;
+                }
+
+               /* output shift sequence */
+                if (need_shift) {
+                   encoding = codeset->parse_info->encoding;
+                    length = strlen(encoding);
+                    if (*to_left < length)
+                       break;
+                   if (outbufptr) {
+                        strncpy((char *)outbufptr, encoding, length);
+                       outbufptr += length;
+                    }
+                   (*to_left) -= length;
+                }
+            }
+
+            /* output characters */
+           length = codeset->length;
+            if (*to_left < length)
+               break;
+
+           if (outbufptr) {
+               output_ulong_value(outbufptr, mb, length, XlcNONE);
+               outbufptr += length;
+           }
+
+           (*to_left) -= length;
+        }
+
+    } /* end of while */
+
+    *from = (XPointer) ((const wchar_t *) *from + from_size);
+    *from_left = 0;
+    *to = (XPointer) outbufptr;
+
+    return unconv_num;
+}
+
+static int
+stdc_wcstombs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    const wchar_t *src = *((const wchar_t **) from);
+    char *dst = *((char **) to);
+    int src_left = *from_left;
+    int dst_left = *to_left;
+    int length, unconv_num = 0;
+
+    while (src_left > 0 && dst_left >= MB_CUR_MAX) {
+       length = wctomb(dst, *src);             /* XXX */
+
+        if (length > 0) {
+           src++;
+           src_left--;
+           if (dst)
+               dst += length;
+           dst_left -= length;
+       } else if (length < 0) {
+           src++;
+           src_left--;
+           unconv_num++;
+       }
+    }
+
+    *from = (XPointer) src;
+    if (dst)
+      *to = (XPointer) dst;
+    *from_left = src_left;
+    *to_left = dst_left;
+
+    return unconv_num;
+}
+
+static int
+wcstocts(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    State state = (State) conv->state;
+    XLCd lcd = state->lcd;
+
+    unsigned long glyph_index;
+    wchar_t wc;
+
+    int total_len, seq_len, name_len;
+    int unconv_num = 0;
+    Bool first_flag = True, standard_flag;
+    XlcSide side;
+
+    CodeSet codeset;
+    XlcCharSet charset, old_charset = NULL;
+    const char *ct_sequence;
+
+    const wchar_t *inbufptr = (const wchar_t *) *from;
+    char *outbufptr = *to;
+    int from_size = *from_left;
+    char *ext_seg_len = NULL;
+
+    if (*from_left > *to_left)
+        *from_left = *to_left;
+
+    while (*from_left && *to_left) {
+
+        wc = *inbufptr++;
+        (*from_left)--;
+
+        /* null ? */
+        if (!wc) {
+            if (outbufptr) {*outbufptr++ = '\0';}
+            (*to_left)--;
+
+            continue;
+        }
+
+        /* convert */
+       if ( !wc_to_gi(lcd, wc, &glyph_index, &codeset) ) {
+            unconv_num++;
+           continue;
+        }
+
+        /* parse charset */
+        if ( !(charset = gi_parse_charset(glyph_index, codeset)) ) {
+            unconv_num++;
+           continue;
+        }
+
+        /* Standard Character Set Encoding ? */
+       standard_flag = charset->source == CSsrcStd ? True : False;
+
+        /*
+         *   Non-Standard Character Set Encoding
+         *
+         * +-----+-----+-----+-----+-----+-----+-----+----   ----+-----+-----+
+         * |     esc sequence      |  M  |  L  |     encoding name     | STX |
+         * +-----+-----+-----+-----+-----+-----+-----+----   ----+-----+-----+
+         *           4bytes         1byte 1byte     variable length     1byte
+         *                        |                                         |
+         *                        +-----------------------------------------+
+         *                          name length  = ((M - 128) * 128) + (L - 128)
+         */
+
+        /* make encoding data */
+       ct_sequence = charset->ct_sequence;
+       side = charset->side;
+        seq_len = strlen(ct_sequence);
+       if (standard_flag) {
+            name_len = 0;
+           total_len = seq_len;
+       } else {
+            name_len = strlen(charset->encoding_name) + 1;
+           total_len = seq_len + name_len + 2;
+       }
+
+        /* output escape sequence of CT */
+       if ( (charset != old_charset) &&
+           !(first_flag && charset->string_encoding) ){
+
+            if ( (ext_seg_len != NULL) && outbufptr) {
+                int i = (outbufptr - ext_seg_len) - 2;
+                *ext_seg_len++ = i / 128 + 128;
+                *ext_seg_len   = i % 128 + 128;
+                ext_seg_len = NULL;
+            }
+
+           if (*to_left < total_len + 1) {
+                unconv_num++;
+               break;
+           }
+
+           if (outbufptr) {
+               strcpy((char *)outbufptr, ct_sequence);
+               outbufptr += seq_len;
+
+                if (!standard_flag) {
+                    const char *i = charset->encoding_name;
+                    ext_seg_len = outbufptr;
+                    outbufptr += 2;
+                   for (; *i ; i++)
+                        *outbufptr++ = ((*i >= 'A') && (*i <= 'Z')) ?
+                                       *i - 'A' + 'a' : *i;
+                   *outbufptr++ = STX;
+                }
+           }
+
+           (*to_left) -= total_len;
+
+           first_flag = False;
+           old_charset = charset;
+       }
+
+        /* output glyph index */
+       if (codeset->ctconv)
+            glyph_index = conv_to_dest(codeset->ctconv, glyph_index);
+        if (*to_left < charset->char_size) {
+            unconv_num++;
+           break;
+        }
+
+       if (outbufptr) {
+          output_ulong_value(outbufptr, glyph_index, charset->char_size, side);
+          outbufptr += charset->char_size;
+       }
+
+       (*to_left) -= charset->char_size;
+
+    } /* end of while */
+
+    if ( (ext_seg_len != NULL) && outbufptr) {
+        int i = (outbufptr - ext_seg_len) - 2;
+        *ext_seg_len++ = i / 128 + 128;
+        *ext_seg_len   = i % 128 + 128;
+    }
+
+    *from = (XPointer) ((const wchar_t *) *from + from_size);
+    *from_left = 0;
+    *to = (XPointer) outbufptr;
+
+    return unconv_num;
+}
+
+static int
+stdc_wcstocts(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    XPointer buf = Xmalloc((*from_left) * MB_CUR_MAX);
+    char *buf_ptr1 = buf;
+    int buf_left1 = (*from_left) * MB_CUR_MAX;
+    char *buf_ptr2 = buf_ptr1;
+    int buf_left2;
+    int unconv_num1 = 0, unconv_num2 = 0;
+
+    unconv_num1 = stdc_wcstombs(conv,
+               from, from_left, &buf_ptr1, &buf_left1, args, num_args);
+    if (unconv_num1 < 0)
+        goto ret;
+
+    buf_left2 = buf_ptr1 - buf_ptr2;
+
+    unconv_num2 = mbstocts(conv,
+               &buf_ptr2, &buf_left2, to, to_left, args, num_args);
+    if (unconv_num2 < 0)
+        goto ret;
+
+ret:
+    if (buf)
+       Xfree((char *)buf);
+
+    return (unconv_num1 + unconv_num2);
+}
+
+static int
+ctstowcs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    State state = (State) conv->state;
+    XLCd lcd = state->lcd;
+
+    unsigned char ch;
+    unsigned long glyph_index = 0;
+    wchar_t wc;
+
+    int ctr_seq_len = 0, gi_len_left = 0, gi_len = 0;
+    int unconv_num = 0;
+
+    CodeSet codeset = NULL;
+    XlcCharSet charset_tmp;
+
+    const char *inbufptr = *from;
+    wchar_t *outbufptr = (wchar_t *) *to;
+    int from_size = *from_left;
+
+    _XlcResetConverter(conv); /* ??? */
+
+    if (from == NULL || *from == NULL) {
+       _XlcResetConverter(conv);
+        return( 0 );
+    }
+
+    if (*from_left > *to_left)
+        *from_left = *to_left;
+
+    while (*from_left && *to_left) {
+
+       ch = *inbufptr++;
+       (*from_left)--;
+
+       /* null ? */
+       if (!ch) {
+            if (outbufptr) {*outbufptr++ = L'\0';}
+           (*to_left)--;
+
+           /* error check */
+            if (gi_len_left) {
+               unconv_num += (gi_len - gi_len_left);
+               gi_len_left = 0;
+            }
+
+           continue;
+       }
+
+       /* same glyph_index data */
+        if (gi_len_left)
+           goto output_one_wc;
+
+        /* control sequence ? */
+        if (ch == CSI) {
+            if ( !ct_parse_csi(inbufptr - 1, &ctr_seq_len) )
+               goto skip_the_seg;
+
+           if (*from_left + 1 < ctr_seq_len) {
+               inbufptr--;
+               (*from_left)++;
+               unconv_num += *from_left;
+               break;
+           }
+
+            /* skip the control sequence */
+           inbufptr += (ctr_seq_len - 1);
+           *from_left -= (ctr_seq_len - 1);
+
+            continue;
+       }
+
+        /* escape sequence ? */
+        if (ch == ESC) {
+           if ( !ct_parse_charset(lcd,
+                       inbufptr - 1, &state->charset, &ctr_seq_len) )
+               goto skip_the_seg;
+
+           if (state->charset->side == XlcC0 ||
+               state->charset->side == XlcGL)
+             {
+               state->GL_charset = state->charset;
+             }
+           else if (state->charset->side == XlcC1 ||
+                    state->charset->side == XlcGR)
+             {
+               state->GR_charset = state->charset;
+             }
+           else if (state->charset->side == XlcGLGR)
+             {
+               state->GL_charset = state->charset;
+               state->GR_charset = state->charset;
+             }
+
+           if (*from_left + 1 < ctr_seq_len) {
+               inbufptr--;
+               (*from_left)++;
+               unconv_num += *from_left;
+               break;
+           }
+
+            /* skip the escape sequence */
+           inbufptr += (ctr_seq_len - 1);
+           *from_left -= (ctr_seq_len - 1);
+
+            continue;
+        }
+
+       /* check current state */
+       if (isleftside(ch))
+         state->charset = state->GL_charset;
+       else
+         state->charset = state->GR_charset;
+
+       gi_len = gi_len_left = state->charset->char_size;
+       glyph_index = 0;
+
+output_one_wc:
+        if (state->charset->side == XlcC1 || state->charset->side == XlcGR)
+            glyph_index = (glyph_index << 8) | (ch & GL);
+        else
+            glyph_index = (glyph_index << 8) | ch;
+
+       gi_len_left--;
+
+        /* last of one glyph_index data */
+        if (!gi_len_left) {
+
+           /* segment conversion */
+           charset_tmp = state->charset;
+           segment_conversion(lcd, &charset_tmp, &glyph_index);
+
+            /* get codeset */
+            if ( !_XlcGetCodeSetFromCharSet(lcd, charset_tmp,
+                                               &codeset, &glyph_index) ) {
+               unconv_num += gi_len;
+               continue;
+            }
+
+            /* convert glyph index to wicd char */
+            gi_to_wc(lcd, glyph_index, codeset, &wc);
+            if (outbufptr) {*outbufptr++ = wc;}
+           (*to_left)--;
+        }
+
+        continue;
+
+skip_the_seg:
+       /* skip until next escape or control sequence */
+        while ( *from_left ) {
+           ch = *inbufptr++;
+           (*from_left)--;
+           unconv_num++;
+
+            if (ch == ESC || ch == CSI) {
+               inbufptr--;
+               (*from_left)++;
+               unconv_num--;
+               break;
+           }
+        }
+
+        if ( !(*from_left) )
+           break;
+
+    } /* end of while */
+
+    /* error check on last char */
+    if (gi_len_left) {
+       inbufptr -= (gi_len - gi_len_left);
+       (*from_left) += (gi_len - gi_len_left);
+       unconv_num += (gi_len - gi_len_left);
+    }
+
+    *from = (XPointer) ((const char *) *from + from_size);
+    *from_left = 0;
+    *to = (XPointer) outbufptr;
+
+    return unconv_num;
+}
+
+static int
+cstowcs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    State state = (State) conv->state;
+    XLCd lcd = state->lcd;
+
+    unsigned char ch;
+    unsigned long glyph_index = 0;
+    wchar_t wc;
+    int gi_len_left = 0, gi_len = 0;
+
+    int unconv_num = 0;
+
+    CodeSet codeset = NULL;
+    XlcCharSet charset, charset_tmp;
+
+    const char *inbufptr = *from;
+    wchar_t *outbufptr = (wchar_t *) *to;
+    int from_size = *from_left;
+
+    if (from == NULL || *from == NULL) {
+        return( 0 );
+    }
+
+    charset = (XlcCharSet) args[0];
+
+    while (*from_left && *to_left) {
+
+        if (!gi_len_left) {
+            gi_len_left = gi_len = charset->char_size;
+            glyph_index = 0;
+        }
+
+       ch = *inbufptr++;
+       (*from_left)--;
+
+       /* null ? */
+       if (!ch) {
+            if (outbufptr) {*outbufptr++ = L'\0';}
+           (*to_left)--;
+
+           /* error check */
+            if (gi_len_left) {
+               unconv_num += (gi_len - gi_len_left);
+               gi_len_left = 0;
+            }
+           continue;
+       }
+
+        if (charset->side == XlcC1 || charset->side == XlcGR)
+            glyph_index = (glyph_index << 8) | (ch & GL);
+        else
+            glyph_index = (glyph_index << 8) | ch;
+
+       gi_len_left--;
+
+        /* last of one glyph_index data */
+        if (!gi_len_left) {
+
+           /* segment conversion */
+           charset_tmp = charset;
+           segment_conversion(lcd, &charset_tmp, &glyph_index);
+
+            /* get codeset */
+            if ( !_XlcGetCodeSetFromCharSet(lcd, charset_tmp,
+                                               &codeset, &glyph_index) ) {
+               unconv_num += gi_len;
+               continue;
+            }
+
+            /* convert glyph index to wicd char */
+            gi_to_wc(lcd, glyph_index, codeset, &wc);
+            if (outbufptr) {*outbufptr++ = wc;}
+           (*to_left)--;
+        }
+
+    } /* end of while */
+
+    /* error check on last char */
+    if (gi_len_left) {
+       inbufptr -= (gi_len - gi_len_left);
+       (*from_left) += (gi_len - gi_len_left);
+       unconv_num += (gi_len - gi_len_left);
+    }
+
+    *from = (XPointer) ((const char *) *from + from_size);
+    *from_left = 0;
+    *to = (XPointer) outbufptr;
+
+    return unconv_num;
+}
+
+static int
+stdc_ctstowcs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    XPointer buf = Xmalloc((*from_left) * MB_CUR_MAX);
+    char *buf_ptr1 = buf;
+    int buf_left1 = (*from_left) * MB_CUR_MAX;
+    char *buf_ptr2 = buf_ptr1;
+    int buf_left2;
+    int unconv_num1 = 0, unconv_num2 = 0;
+
+    unconv_num1 = ctstombs(conv,
+               from, from_left, &buf_ptr1, &buf_left1, args, num_args);
+    if (unconv_num1 < 0)
+        goto ret;
+
+    buf_left2 = buf_ptr1 - buf_ptr2;
+
+    unconv_num2 = stdc_mbstowcs(conv,
+               &buf_ptr2, &buf_left2, to, to_left, args, num_args);
+    if (unconv_num2 < 0)
+        goto ret;
+
+ret:
+    if (buf)
+       Xfree((char *)buf);
+
+    return (unconv_num1 + unconv_num2);
+}
+
+static int
+stdc_cstowcs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    XPointer buf = Xmalloc((*from_left) * MB_CUR_MAX);
+    char *buf_ptr1 = buf;
+    int buf_left1 = (*from_left) * MB_CUR_MAX;
+    char *buf_ptr2 = buf_ptr1;
+    int buf_left2;
+    int unconv_num1 = 0, unconv_num2 = 0;
+
+    unconv_num1 = cstombs(conv,
+               from, from_left, &buf_ptr1, &buf_left1, args, num_args);
+    if (unconv_num1 < 0)
+        goto ret;
+
+    buf_left2 = buf_ptr1 - buf_ptr2;
+
+    unconv_num2 = stdc_mbstowcs(conv,
+               &buf_ptr2, &buf_left2, to, to_left, args, num_args);
+    if (unconv_num2 < 0)
+        goto ret;
+
+ret:
+    if (buf)
+       Xfree((char *)buf);
+
+    return (unconv_num1 + unconv_num2);
+}
+
+static int
+mbstocts(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    XPointer buf = Xmalloc((*from_left) * sizeof(wchar_t));
+    char *buf_ptr1 = buf;
+    int buf_left1 = (*from_left);
+    char *buf_ptr2 = buf_ptr1;
+    int buf_left2;
+    int unconv_num1 = 0, unconv_num2 = 0;
+
+    unconv_num1 = mbstowcs_org(conv,
+               from, from_left, &buf_ptr1, &buf_left1, args, num_args);
+    if (unconv_num1 < 0)
+        goto ret;
+
+    buf_left2 = (buf_ptr1 - buf_ptr2) / sizeof(wchar_t);
+
+    unconv_num2 += wcstocts(conv,
+               &buf_ptr2, &buf_left2, to, to_left, args, num_args);
+    if (unconv_num2 < 0)
+        goto ret;
+
+ret:
+    if (buf)
+       Xfree((char *)buf);
+
+    return (unconv_num1 + unconv_num2);
+}
+
+static int
+mbstostr(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    State state = (State) conv->state;
+    XLCd lcd = state->lcd;
+
+    unsigned char ch;
+    unsigned long mb = 0;
+
+    int length = 0, len_left = 0;
+    int unconv_num = 0;
+    int num;
+
+    CodeSet codeset = NULL;
+
+    const char *inbufptr = *from;
+    char *outbufptr = *to;
+    int from_size = *from_left;
+
+    unsigned char *mb_parse_table = XLC_GENERIC(lcd, mb_parse_table);
+
+    if (from == NULL || *from == NULL) {
+       _XlcResetConverter(conv);
+        return( 0 );
+    }
+
+    if (*from_left > *to_left)
+        *from_left = *to_left;
+
+    while (*from_left && *to_left) {
+
+       ch = *inbufptr++;
+       (*from_left)--;
+
+       /* null ? */
+       if (!ch) {
+            if (outbufptr) {*outbufptr++ = '\0';}
+           (*to_left)--;
+
+            /* error check */
+            if (len_left) {
+                unconv_num += (length - len_left);
+                len_left = 0;
+            }
+
+           continue;
+       }
+
+        /* same mb char data */
+        if (len_left)
+            goto output_one_mb;
+
+        /* next mb char data for single shift ? */
+       if (mb_parse_table && (num = mb_parse_table[ch]) ) {
+           codeset = mb_parse_codeset(state, num, &inbufptr, from_left);
+            if (codeset != NULL) {
+               length = len_left = codeset->length;
+               mb = 0;
+               continue;
+           }
+        }
+
+       /* next char data : byteM ? */
+       if ((codeset = byteM_parse_codeset(lcd, (inbufptr - 1))))
+           goto next_mb_char;
+
+       /* next char data : GL or GR side ? */
+       if ((codeset = GLGR_parse_codeset(ch)))
+           goto next_mb_char;
+
+        /* can't find codeset for the ch */
+        unconv_num++;
+        continue;
+
+next_mb_char:
+        length = len_left = codeset->length;
+        mb = 0;
+
+output_one_mb:
+        mb = (mb << 8) | ch;  /* 1 byte left shift */
+        len_left--;
+
+        /* last of one mb char data */
+        if (!len_left) {
+            if (check_string_encoding(codeset)) {
+                if (outbufptr) {*outbufptr++ = mb & 0xff;}
+               (*to_left)--;
+            } else {
+               unconv_num++;
+            }
+        }
+
+    } /* end of while */
+
+    /* error check on last char */
+    if (len_left) {
+        inbufptr -= (length - len_left);
+        (*from_left) += (length - len_left);
+        unconv_num += (length - len_left);
+    }
+
+    *from = (XPointer) ((const char *) *from + from_size);
+    *from_left = 0;
+    *to = (XPointer) outbufptr;
+
+    return unconv_num;
+}
+
+static int
+mbtocs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    State state = (State) conv->state;
+    XLCd lcd = state->lcd;
+
+    unsigned char ch;
+    unsigned long mb = 0;
+    unsigned long glyph_index;
+
+    int length = 0, len_left = 0, char_len;
+    int unconv_num = 0;
+    int num;
+    XlcSide side;
+
+    CodeSet codeset = NULL;
+    XlcCharSet charset = NULL;
+
+    const char *inbufptr = *from;
+    char *outbufptr = *to;
+    int from_size = *from_left;
+
+    unsigned char *mb_parse_table = XLC_GENERIC(lcd, mb_parse_table);
+
+    if (from == NULL || *from == NULL) {
+       _XlcResetConverter(conv);
+        return( 0 );
+    }
+
+    while (*from_left && *to_left) {
+
+       ch = *inbufptr++;
+       (*from_left)--;
+
+       /* null ? */
+       if (!ch) {
+            unconv_num = 1;
+            if (len_left)
+               unconv_num += (length - len_left);
+           break;
+       }
+
+       /* same mb char data */
+        if (len_left)
+           goto output;
+
+        /* next mb char data for single shift ? */
+       if (mb_parse_table && (num = mb_parse_table[ch]) ) {
+           codeset = mb_parse_codeset(state, num, &inbufptr, from_left);
+            if (codeset != NULL) {
+               length = len_left = codeset->length;
+               mb = 0;
+               continue;
+           }
+        }
+
+       /* next mb char data for byteM ? */
+       if ((codeset = byteM_parse_codeset(lcd, (inbufptr - 1))))
+           goto next_mb_char;
+
+       /* next mb char data for GL or GR side ? */
+       if ((codeset = GLGR_parse_codeset(ch)))
+           goto next_mb_char;
+
+        /* can't find codeset for the ch */
+        unconv_num = 1;
+        break;
+
+next_mb_char:
+        length = len_left = codeset->length;
+       mb = 0;
+
+output:
+       mb = (mb << 8) | ch;  /* 1 byte left shift */
+       len_left--;
+
+        /* last of one mb char data */
+        if (!len_left) {
+            glyph_index = mb_to_gi(mb, codeset);
+            if (!(charset = gi_parse_charset(glyph_index, codeset))) {
+                unconv_num = length;
+                break;
+            }
+            char_len = charset->char_size;
+           side = charset->side;
+
+            /* output glyph index */
+            if (codeset->ctconv)
+                glyph_index = conv_to_dest(codeset->ctconv, glyph_index);
+            if (*to_left < char_len) {
+                unconv_num = length;
+                break;
+            }
+
+           if (outbufptr) {
+               output_ulong_value(outbufptr, glyph_index, char_len, side);
+               outbufptr += char_len;
+           }
+
+            (*to_left) -= char_len;
+
+            break;
+        }
+
+    } /* end of while */
+
+    /* error end */
+    if (unconv_num) {
+        *from = (XPointer) ((const char *) *from + from_size);
+        *from_left = 0;
+        *to = (XPointer) outbufptr;
+       return -1;
+    }
+
+    /* normal end */
+    *from = (XPointer) inbufptr;
+    *to = (XPointer) outbufptr;
+
+    if (num_args > 0)
+        *((XlcCharSet *) args[0]) = charset;
+
+    return 0;
+}
+
+static int
+mbstocs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    int ret;
+    XlcCharSet charset_old, charset = NULL;
+    XPointer tmp_args[1];
+
+    const char *inbufptr;
+    int        in_left;
+    char *outbufptr;
+    int        out_left;
+    tmp_args[0] = (XPointer) &charset;
+
+    ret = mbtocs(conv, from, from_left, to, to_left, tmp_args, 1);
+    charset_old = charset;
+
+    while ( ret == 0 && *from_left && *to_left) {
+       inbufptr = *from;
+       in_left = *from_left;
+       outbufptr = *to;
+       out_left = *to_left;
+        ret = mbtocs(conv, from, from_left, to, to_left, tmp_args, 1);
+        if (charset_old != charset) {
+           *from = (XPointer) inbufptr;
+           *from_left = in_left;
+           *to = (XPointer) outbufptr;
+           *to_left = out_left;
+           break;
+        }
+    }
+
+    if (num_args > 0)
+        *((XlcCharSet *) args[0]) = charset_old;
+
+    /* error end */
+    if (ret != 0)
+       return( -1 );
+
+    return(0);
+}
+
+static int
+wcstostr(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    State state = (State) conv->state;
+    XLCd lcd = state->lcd;
+
+    char *encoding;
+    unsigned long mb, glyph_index;
+    wchar_t wc;
+
+    int length;
+    int unconv_num = 0;
+
+    CodeSet codeset;
+
+    const wchar_t *inbufptr = (const wchar_t *) *from;
+    char *outbufptr = *to;
+    int from_size = *from_left;
+
+    const char *default_string = XLC_PUBLIC(lcd, default_string);
+    int defstr_len = strlen(default_string);
+
+
+    if (*from_left > *to_left)
+        *from_left = *to_left;
+
+    while (*from_left && *to_left) {
+
+        wc = *inbufptr++;
+        (*from_left)--;
+
+        /* null ? */
+        if (!wc) {
+            if (outbufptr) {*outbufptr++ = '\0';}
+            (*to_left)--;
+
+            continue;
+        }
+
+        /* convert */
+       if ( !wc_to_gi(lcd, wc, &glyph_index, &codeset) ) {
+
+           /* output default_string of XDefaultString() */
+            if (*to_left < defstr_len)
+               break;
+           if (outbufptr) {
+                strncpy((char *)outbufptr, default_string, defstr_len);
+               outbufptr += defstr_len;
+            }
+           (*to_left) -= defstr_len;
+
+            unconv_num++;
+
+        } else {
+            mb = gi_to_mb(glyph_index, codeset);
+
+           if (check_string_encoding(codeset)) {
+               if (codeset->parse_info) {
+                    Bool need_shift = False;
+                    switch (codeset->parse_info->type) {
+                        case E_LSL :
+                            if (codeset != state->GL_codeset) {
+                                need_shift = True;
+                                state->GL_codeset = codeset;
+                            }
+                            break;
+                        case E_LSR :
+                            if (codeset != state->GR_codeset) {
+                                need_shift = True;
+                                state->GR_codeset = codeset;
+                            }
+                            break;
+                        /* case E_SS */
+                        default:
+                            need_shift = True;
+                    }
+
+                   /* output shift sequence */
+                    if (need_shift) {
+                       encoding = codeset->parse_info->encoding;
+                        length = strlen(encoding);
+                        if (*to_left < length)
+                           break;
+
+                       if (outbufptr) {
+                            strncpy((char *)outbufptr, encoding, length);
+                           outbufptr += length;
+                        }
+                       (*to_left) -= length;
+                    }
+                }
+
+                /* output characters */
+               length = codeset->length;
+                if (*to_left < length)
+                   break;
+
+               if (outbufptr) {
+                   output_ulong_value(outbufptr, mb, length, XlcNONE);
+                   outbufptr += length;
+               }
+
+               (*to_left) -= length;
+            } else {
+               unconv_num++;
+            }
+        }
+
+    } /* end of while */
+
+    *from = (XPointer) ((const wchar_t *) *from + from_size);
+    *from_left = 0;
+    *to = (XPointer) outbufptr;
+
+    return unconv_num;
+}
+
+static int
+stdc_wcstostr(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    XPointer buf = Xmalloc((*from_left) * MB_CUR_MAX);
+    char *buf_ptr1 = buf;
+    int buf_left1 = (*from_left) * MB_CUR_MAX;
+    char *buf_ptr2 = buf_ptr1;
+    int buf_left2;
+    int unconv_num1 = 0, unconv_num2 = 0;
+
+    unconv_num1 = stdc_wcstombs(conv,
+               from, from_left, &buf_ptr1, &buf_left1, args, num_args);
+    if (unconv_num1 < 0)
+        goto ret;
+
+    buf_left2 = buf_ptr1 - buf_ptr2;
+
+    unconv_num2 = mbstostr(conv,
+               &buf_ptr2, &buf_left2, to, to_left, args, num_args);
+    if (unconv_num2 < 0)
+        goto ret;
+
+ret:
+    if (buf)
+       Xfree((char *)buf);
+
+    return (unconv_num1 + unconv_num2);
+}
+
+static int
+wctocs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    State state = (State) conv->state;
+    XLCd lcd = state->lcd;
+
+    wchar_t wc;
+    unsigned long glyph_index;
+
+    int char_len;
+    int unconv_num = 0;
+    XlcSide side;
+
+    CodeSet codeset;
+    XlcCharSet charset = NULL;
+
+    const wchar_t *inbufptr = (const wchar_t *) *from;
+    char *outbufptr = *to;
+    int from_size = *from_left;
+
+    if (*from_left > *to_left)
+        *from_left = *to_left;
+
+    if (*from_left && *to_left) {
+
+        wc = *inbufptr++;
+        (*from_left)--;
+
+        /* null ? */
+        if (!wc) {
+            unconv_num = 1;
+            goto end;
+        }
+
+        /* convert */
+       if ( !wc_to_gi(lcd, wc, &glyph_index, &codeset) ) {
+            unconv_num = 1;
+           goto end;
+        }
+
+        if ( !(charset = gi_parse_charset(glyph_index, codeset)) ) {
+            unconv_num = 1;
+           goto end;
+        }
+       char_len = charset->char_size;
+       side = charset->side;
+
+        /* output glyph index */
+       if (codeset->ctconv)
+            glyph_index = conv_to_dest(codeset->ctconv, glyph_index);
+        if (*to_left < char_len) {
+            unconv_num++;
+           goto end;
+        }
+
+        if (outbufptr) {
+            output_ulong_value(outbufptr, glyph_index, char_len, side);
+            outbufptr += char_len;
+        }
+
+       (*to_left) -= char_len;
+
+    }
+
+end:
+
+     /* error end */
+    if (unconv_num) {
+        *from = (XPointer) ((const wchar_t *) *from + from_size);
+        *from_left = 0;
+        *to = (XPointer) outbufptr;
+        return -1;
+    }
+
+    /* normal end */
+    *from = (XPointer) inbufptr;
+    *to = (XPointer) outbufptr;
+
+    if (num_args > 0)
+        *((XlcCharSet *) args[0]) = charset;
+
+    return 0;
+}
+
+static int
+stdc_wctocs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    const wchar_t *src = *((const wchar_t **) from);
+    wchar_t wch;
+    XPointer tmp_from, save_from = *from;
+    char tmp[32];
+    int length, ret, src_left = *from_left;
+    int from_size = *from_left;
+
+    if (src_left > 0 && *to_left > 0) {
+       if ((wch = *src)) {
+           length = wctomb(tmp, wch);
+       } else {
+           goto end;
+       }
+
+       if (length < 0)
+           goto end;
+
+       tmp_from = (XPointer) tmp;
+       ret = mbtocs(conv, &tmp_from, &length, to, to_left, args, num_args);
+       if (ret < 0)
+           goto end;
+
+       src++;
+       src_left--;
+    }
+
+end:
+     /* error end */
+    if (save_from == (XPointer) src) {
+        *from = (XPointer) ((const wchar_t *) *from + from_size);
+        *from_left = 0;
+       return -1;
+    }
+
+    /* normal end */
+    *from = (XPointer) src;
+    *from_left = src_left;
+
+    return 0;
+}
+
+static int
+wcstocs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    int ret;
+    XlcCharSet charset_old, charset = NULL;
+    XPointer tmp_args[1];
+
+    const wchar_t *inbufptr;
+    int        in_left;
+    XPointer outbufptr;
+    int        out_left;
+    tmp_args[0] = (XPointer) &charset;
+
+    ret = wctocs(conv, from, from_left, to, to_left, tmp_args, 1);
+    charset_old = charset;
+
+    while ( ret == 0 && *from_left && *to_left) {
+       inbufptr = (const wchar_t *) *from;
+       in_left = *from_left;
+       outbufptr = *to;
+       out_left = *to_left;
+        ret = wctocs(conv, from, from_left, to, to_left, tmp_args, 1);
+        if (charset_old != charset) {
+           *from = (XPointer) inbufptr;
+           *from_left = in_left;
+           *to = (XPointer) outbufptr;
+           *to_left = out_left;
+           break;
+        }
+    }
+
+    if (num_args > 0)
+        *((XlcCharSet *) args[0]) = charset_old;
+
+    /* error end */
+    if (ret != 0)
+       return( -1 );
+
+    return(0);
+}
+
+#ifdef STDCVT
+
+static int
+stdc_wcstocs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    int ret;
+    XlcCharSet charset_old, charset = NULL;
+    XPointer tmp_args[1];
+
+    const wchar_t *inbufptr;
+    int        in_left;
+    XPointer outbufptr;
+    int        out_left;
+    tmp_args[0] = (XPointer) &charset;
+
+    ret = stdc_wctocs(conv, from, from_left, to, to_left, tmp_args, 1);
+    charset_old = charset;
+
+    while ( ret == 0 && *from_left && *to_left ) {
+       inbufptr = (const wchar_t *) *from;
+       in_left = *from_left;
+       outbufptr = *to;
+       out_left = *to_left;
+        ret = stdc_wctocs(conv, from, from_left, to, to_left, tmp_args, 1);
+        if (charset_old != charset) {
+           *from = (XPointer) inbufptr;
+           *from_left = in_left;
+           *to = (XPointer) outbufptr;
+           *to_left = out_left;
+           break;
+        }
+    }
+
+    if (num_args > 0)
+        *((XlcCharSet *) args[0]) = charset_old;
+
+    /* error end */
+    if (ret != 0)
+       return( -1 );
+
+    return(0);
+}
+
+#endif
+
+static int
+ctstombs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    XPointer buf = Xmalloc((*from_left) * sizeof(wchar_t));
+    char *buf_ptr1 = buf;
+    int buf_left1 = (*from_left);
+    char *buf_ptr2 = buf_ptr1;
+    int buf_left2;
+    int unconv_num1 = 0, unconv_num2 = 0;
+
+    unconv_num1 = ctstowcs(conv,
+               from, from_left, &buf_ptr1, &buf_left1, args, num_args);
+    if (unconv_num1 < 0)
+        goto ret;
+
+    buf_left2 = (buf_ptr1 - buf_ptr2) / sizeof(wchar_t);
+
+    unconv_num2 += wcstombs_org(conv,
+               &buf_ptr2, &buf_left2, to, to_left, args, num_args);
+    if (unconv_num2 < 0)
+        goto ret;
+
+ret:
+    if (buf)
+       Xfree((char *)buf);
+
+    return (unconv_num1 + unconv_num2);
+}
+
+static int
+cstombs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    XPointer buf = Xmalloc((*from_left) * sizeof(wchar_t));
+    char *buf_ptr1 = buf;
+    int buf_left1 = (*from_left);
+    char *buf_ptr2 = buf_ptr1;
+    int buf_left2;
+    int unconv_num1 = 0, unconv_num2 = 0;
+
+    unconv_num1 = cstowcs(conv,
+               from, from_left, &buf_ptr1, &buf_left1, args, num_args);
+    if (unconv_num1 < 0)
+        goto ret;
+
+    buf_left2 = (buf_ptr1 - buf_ptr2) / sizeof(wchar_t);
+
+    unconv_num2 += wcstombs_org(conv,
+               &buf_ptr2, &buf_left2, to, to_left, args, num_args);
+    if (unconv_num2 < 0)
+        goto ret;
+
+ret:
+    if (buf)
+       Xfree((char *)buf);
+
+    return (unconv_num1 + unconv_num2);
+}
+
+static int
+strtombs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    State state = (State) conv->state;
+    XLCd lcd = state->lcd;
+
+    char *encoding;
+    unsigned long mb, glyph_index;
+    unsigned char ch;
+
+    int length;
+    int unconv_num = 0;
+
+    CodeSet codeset;
+
+    const char *inbufptr = *from;
+    char *outbufptr = *to;
+    int from_size = *from_left;
+
+    if (*from_left > *to_left)
+        *from_left = *to_left;
+
+    while (*from_left && *to_left) {
+
+        ch = *inbufptr++;
+        (*from_left)--;
+
+        /* null ? */
+        if (!ch) {
+            if (outbufptr) {*outbufptr++ = '\0';}
+            (*to_left)--;
+
+            continue;
+        }
+
+        /* convert */
+        if (isleftside(ch)) {
+           glyph_index = ch;
+           codeset = _XlcGetCodeSetFromName(lcd, "ISO8859-1:GL");
+       } else {
+           glyph_index = ch & GL;
+           codeset = _XlcGetCodeSetFromName(lcd, "ISO8859-1:GR");
+       }
+
+        if (!codeset) {
+           unconv_num++;
+           continue;
+        }
+
+        mb = gi_to_mb(glyph_index, codeset);
+       if (codeset->parse_info) {
+            Bool need_shift = False;
+            switch (codeset->parse_info->type) {
+                case E_LSL :
+                    if (codeset != state->GL_codeset) {
+                        need_shift = True;
+                        state->GL_codeset = codeset;
+                    }
+                    break;
+                case E_LSR :
+                    if (codeset != state->GR_codeset) {
+                        need_shift = True;
+                        state->GR_codeset = codeset;
+                    }
+                    break;
+                /* case E_SS */
+                default:
+                    need_shift = True;
+            }
+
+           /* output shift sequence */
+            if (need_shift) {
+                encoding = codeset->parse_info->encoding;
+                length = strlen(encoding);
+                if (*to_left < length)
+                   break;
+               if (outbufptr) {
+                    strncpy((char *)outbufptr, encoding, length);
+                   outbufptr += length;
+                }
+               (*to_left) -= length;
+           }
+        }
+
+        /* output characters */
+       length = codeset->length;
+        if (*to_left < length)
+           break;
+
+        if (outbufptr) {
+            output_ulong_value(outbufptr, mb, length, XlcNONE);
+            outbufptr += length;
+        }
+
+       (*to_left) -= length;
+
+    } /* end of while */
+
+    *from = (XPointer) ((const char *) *from + from_size);
+    *from_left = 0;
+    *to = (XPointer) outbufptr;
+
+    return unconv_num;
+}
+
+static int
+strtowcs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    State state = (State) conv->state;
+    XLCd lcd = state->lcd;
+
+    unsigned char ch;
+    unsigned long glyph_index;
+    wchar_t wc;
+
+    int unconv_num = 0;
+    CodeSet codeset;
+
+    const char *inbufptr = *from;
+    wchar_t *outbufptr = (wchar_t *)*to;
+    int from_size = *from_left;
+
+    if (*from_left > *to_left)
+        *from_left = *to_left;
+
+    while (*from_left && *to_left) {
+
+        ch = *inbufptr++;
+        (*from_left)--;
+
+        /* null ? */
+        if (!ch) {
+            if (outbufptr) {*outbufptr++ = L'\0';}
+            (*to_left)--;
+
+            continue;
+        }
+
+        /* convert */
+        if (isleftside(ch)) {
+           glyph_index = ch;
+           codeset = _XlcGetCodeSetFromName(lcd, "ISO8859-1:GL");
+       } else {
+           glyph_index = ch & GL;
+           codeset = _XlcGetCodeSetFromName(lcd, "ISO8859-1:GR");
+       }
+
+        if (!codeset) {
+           unconv_num++;
+           continue;
+        }
+
+        gi_to_wc(lcd, glyph_index, codeset, &wc);
+       if (outbufptr) {*outbufptr++ = wc;}
+       (*to_left)--;
+
+    } /* end of while */
+
+    *from = (XPointer) ((const char *) *from + from_size);
+    *from_left = 0;
+    *to = (XPointer) outbufptr;
+
+    return unconv_num;
+}
+
+static int
+stdc_strtowcs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    XPointer buf = Xmalloc((*from_left) * MB_CUR_MAX);
+    char *buf_ptr1 = buf;
+    int buf_left1 = (*from_left) * MB_CUR_MAX;
+    char *buf_ptr2 = buf_ptr1;
+    int buf_left2;
+    int unconv_num1 = 0, unconv_num2 = 0;
+
+    unconv_num1 = strtombs(conv,
+               from, from_left, &buf_ptr1, &buf_left1, args, num_args);
+    if (unconv_num1 < 0)
+        goto ret;
+
+    buf_left2 = buf_ptr1 - buf_ptr2;
+
+    unconv_num2 = stdc_mbstowcs(conv,
+               &buf_ptr2, &buf_left2, to, to_left, args, num_args);
+    if (unconv_num2 < 0)
+        goto ret;
+
+ret:
+    if (buf)
+       Xfree((char *)buf);
+
+    return (unconv_num1 + unconv_num2);
+}
+
+/* -------------------------------------------------------------------------- */
+/*                             Close                                         */
+/* -------------------------------------------------------------------------- */
+
+static void
+close_converter(
+    XlcConv conv)
+{
+    if (conv->state) {
+       Xfree((char *) conv->state);
+    }
+
+    if (conv->methods) {
+       Xfree((char *) conv->methods);
+    }
+
+    Xfree((char *) conv);
+}
+
+/* -------------------------------------------------------------------------- */
+/*                             Open                                          */
+/* -------------------------------------------------------------------------- */
+
+static XlcConv
+create_conv(
+    XLCd lcd,
+    XlcConvMethods methods)
+{
+    XlcConv conv;
+    State state;
+
+    conv = (XlcConv) Xcalloc(1, sizeof(XlcConvRec));
+    if (conv == NULL)
+       return (XlcConv) NULL;
+
+    conv->methods = (XlcConvMethods) Xmalloc(sizeof(XlcConvMethodsRec));
+    if (conv->methods == NULL)
+       goto err;
+    *conv->methods = *methods;
+    conv->methods->reset = init_state;
+
+    conv->state = Xcalloc(1, sizeof(StateRec));
+    if (conv->state == NULL)
+       goto err;
+
+    state = (State) conv->state;
+    state->lcd = lcd;
+
+    _XlcResetConverter(conv);
+
+    return conv;
+
+err:
+    close_converter(conv);
+
+    return (XlcConv) NULL;
+}
+
+static XlcConvMethodsRec mbstocts_methods = {
+    close_converter,
+    mbstocts,
+    NULL
+};
+
+static XlcConv
+open_mbstocts(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &mbstocts_methods);
+}
+
+static XlcConvMethodsRec mbstostr_methods = {
+    close_converter,
+    mbstostr,
+    NULL
+};
+
+static XlcConv
+open_mbstostr(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &mbstostr_methods);
+}
+
+static XlcConvMethodsRec mbstocs_methods = {
+    close_converter,
+    mbstocs,
+    NULL
+};
+
+static XlcConv
+open_mbstocs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &mbstocs_methods);
+}
+
+static XlcConvMethodsRec mbtocs_methods = {
+    close_converter,
+    mbtocs,
+    NULL
+};
+
+static XlcConv
+open_mbtocs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &mbtocs_methods);
+}
+
+static XlcConvMethodsRec ctstombs_methods = {
+    close_converter,
+    ctstombs,
+    NULL
+};
+
+static XlcConv
+open_ctstombs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &ctstombs_methods);
+}
+
+static XlcConvMethodsRec cstombs_methods = {
+    close_converter,
+    cstombs,
+    NULL
+};
+
+static XlcConv
+open_cstombs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &cstombs_methods);
+}
+
+static XlcConvMethodsRec strtombs_methods = {
+    close_converter,
+    strtombs,
+    NULL
+};
+
+static XlcConv
+open_strtombs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &strtombs_methods);
+}
+
+#ifdef STDCVT
+
+static XlcConvMethodsRec stdc_mbstowcs_methods = {
+    close_converter,
+    stdc_mbstowcs,
+    NULL
+};
+
+static XlcConv
+open_stdc_mbstowcs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &stdc_mbstowcs_methods);
+}
+
+static XlcConvMethodsRec stdc_wcstombs_methods = {
+    close_converter,
+    stdc_wcstombs,
+    NULL
+};
+
+static XlcConv
+open_stdc_wcstombs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &stdc_wcstombs_methods);
+}
+
+static XlcConvMethodsRec stdc_wcstocts_methods = {
+    close_converter,
+    stdc_wcstocts,
+    NULL
+};
+
+static XlcConv
+open_stdc_wcstocts(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &stdc_wcstocts_methods);
+}
+
+static XlcConvMethodsRec stdc_wcstostr_methods = {
+    close_converter,
+    stdc_wcstostr,
+    NULL
+};
+
+static XlcConv
+open_stdc_wcstostr(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &stdc_wcstostr_methods);
+}
+
+static XlcConvMethodsRec stdc_wcstocs_methods = {
+    close_converter,
+    stdc_wcstocs,
+    NULL
+};
+
+static XlcConv
+open_stdc_wcstocs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &stdc_wcstocs_methods);
+}
+
+static XlcConvMethodsRec stdc_wctocs_methods = {
+    close_converter,
+    stdc_wctocs,
+    NULL
+};
+
+static XlcConv
+open_stdc_wctocs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &stdc_wctocs_methods);
+}
+
+static XlcConvMethodsRec stdc_ctstowcs_methods = {
+    close_converter,
+    stdc_ctstowcs,
+    NULL
+};
+
+static XlcConv
+open_stdc_ctstowcs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &stdc_ctstowcs_methods);
+}
+
+static XlcConvMethodsRec stdc_cstowcs_methods = {
+    close_converter,
+    stdc_cstowcs,
+    NULL
+};
+
+static XlcConv
+open_stdc_cstowcs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &stdc_cstowcs_methods);
+}
+
+static XlcConvMethodsRec stdc_strtowcs_methods = {
+    close_converter,
+    stdc_strtowcs,
+    NULL
+};
+
+static XlcConv
+open_stdc_strtowcs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &stdc_strtowcs_methods);
+}
+
+#endif /* STDCVT */
+
+static XlcConvMethodsRec mbstowcs_methods = {
+    close_converter,
+    mbstowcs_org,
+    NULL
+};
+
+static XlcConv
+open_mbstowcs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &mbstowcs_methods);
+}
+
+static XlcConvMethodsRec wcstombs_methods = {
+    close_converter,
+    wcstombs_org,
+    NULL
+};
+
+static XlcConv
+open_wcstombs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &wcstombs_methods);
+}
+
+static XlcConvMethodsRec wcstocts_methods = {
+    close_converter,
+    wcstocts,
+    NULL
+};
+
+static XlcConv
+open_wcstocts(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &wcstocts_methods);
+}
+
+static XlcConvMethodsRec wcstostr_methods = {
+    close_converter,
+    wcstostr,
+    NULL
+};
+
+static XlcConv
+open_wcstostr(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &wcstostr_methods);
+}
+
+static XlcConvMethodsRec wcstocs_methods = {
+    close_converter,
+    wcstocs,
+    NULL
+};
+
+static XlcConv
+open_wcstocs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &wcstocs_methods);
+}
+
+static XlcConvMethodsRec wctocs_methods = {
+    close_converter,
+    wctocs,
+    NULL
+};
+
+static XlcConv
+open_wctocs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &wctocs_methods);
+}
+
+static XlcConvMethodsRec ctstowcs_methods = {
+    close_converter,
+    ctstowcs,
+    NULL
+};
+
+static XlcConv
+open_ctstowcs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &ctstowcs_methods);
+}
+
+static XlcConvMethodsRec cstowcs_methods = {
+    close_converter,
+    cstowcs,
+    NULL
+};
+
+static XlcConv
+open_cstowcs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &cstowcs_methods);
+}
+
+static XlcConvMethodsRec strtowcs_methods = {
+    close_converter,
+    strtowcs,
+    NULL
+};
+
+static XlcConv
+open_strtowcs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &strtowcs_methods);
+}
+
+/* -------------------------------------------------------------------------- */
+/*                             Loader                                        */
+/* -------------------------------------------------------------------------- */
+
+XLCd
+_XlcGenericLoader(
+    const char *name)
+{
+    XLCd lcd;
+#ifdef STDCVT
+    XLCdGenericPart *gen;
+#endif
+
+    lcd = _XlcCreateLC(name, _XlcGenericMethods);
+
+    if (lcd == NULL)
+       return lcd;
+
+    default_GL_charset = _XlcGetCharSet("ISO8859-1:GL");
+    default_GR_charset = _XlcGetCharSet("ISO8859-1:GR");
+
+    _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCompoundText, open_mbstocts);
+    _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNString,       open_mbstostr);
+    _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCharSet,      open_mbstocs);
+    _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNChar,         open_mbtocs);
+    _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNMultiByte, open_ctstombs);
+    _XlcSetConverter(lcd, XlcNString,    lcd, XlcNMultiByte,    open_strtombs);
+    _XlcSetConverter(lcd, XlcNCharSet,   lcd, XlcNMultiByte,    open_cstombs);
+
+#ifdef STDCVT
+     gen = XLC_GENERIC_PART(lcd);
+
+     if (gen->use_stdc_env != True) {
+#endif
+        _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNWideChar,     open_mbstowcs);
+        _XlcSetConverter(lcd, XlcNWideChar,  lcd, XlcNMultiByte,    open_wcstombs);
+        _XlcSetConverter(lcd, XlcNWideChar,  lcd, XlcNCompoundText, open_wcstocts);
+        _XlcSetConverter(lcd, XlcNWideChar,  lcd, XlcNString,       open_wcstostr);
+        _XlcSetConverter(lcd, XlcNWideChar,  lcd, XlcNCharSet,      open_wcstocs);
+        _XlcSetConverter(lcd, XlcNWideChar,  lcd, XlcNChar,         open_wctocs);
+        _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNWideChar,  open_ctstowcs);
+        _XlcSetConverter(lcd, XlcNString,    lcd, XlcNWideChar,     open_strtowcs);
+        _XlcSetConverter(lcd, XlcNCharSet,   lcd, XlcNWideChar,     open_cstowcs);
+#ifdef STDCVT
+    }
+#endif
+
+#ifdef STDCVT
+    if (gen->use_stdc_env == True) {
+        _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNWideChar,     open_stdc_mbstowcs);
+        _XlcSetConverter(lcd, XlcNWideChar,  lcd, XlcNMultiByte,    open_stdc_wcstombs);
+        _XlcSetConverter(lcd, XlcNWideChar,  lcd, XlcNCompoundText, open_stdc_wcstocts);
+        _XlcSetConverter(lcd, XlcNWideChar,  lcd, XlcNString,       open_stdc_wcstostr);
+        _XlcSetConverter(lcd, XlcNWideChar,  lcd, XlcNCharSet,      open_stdc_wcstocs);
+        _XlcSetConverter(lcd, XlcNWideChar,  lcd, XlcNChar,         open_stdc_wctocs);
+        _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNWideChar,  open_stdc_ctstowcs);
+        _XlcSetConverter(lcd, XlcNString,    lcd, XlcNWideChar,     open_stdc_strtowcs);
+        _XlcSetConverter(lcd, XlcNCharSet,   lcd, XlcNWideChar,     open_stdc_cstowcs);
+    }
+#endif
+
+    _XlcAddUtf8Converters(lcd);
+
+    return lcd;
+}
diff --git a/modules/lc/xlocale/Makefile.am b/modules/lc/xlocale/Makefile.am
new file mode 100644 (file)
index 0000000..70a221f
--- /dev/null
@@ -0,0 +1,35 @@
+AM_CPPFLAGS= \
+       -I$(top_srcdir)/include \
+       -I$(top_srcdir)/include/X11 \
+       -I$(top_builddir)/include \
+       -I$(top_builddir)/include/X11 \
+       -I$(top_srcdir)/src/xcms \
+       -I$(top_srcdir)/src/xkb \
+       -I$(top_srcdir)/src/xlibi18n \
+       -D_BSD_SOURCE
+
+AM_CFLAGS= \
+       $(X11_CFLAGS) \
+       $(BIGFONT_CFLAGS) \
+       $(CWARNFLAGS)
+
+if XLIB_LOADABLE_I18N
+
+commonlibdir = $(X11_LOCALELIBDIR)/common
+commonlib_LTLIBRARIES=xlocale.la
+xlocale_la_LDFLAGS = -module -version-number 2:0:0
+xlocale_la_LIBADD = $(I18N_MODULE_LIBS)
+
+else
+
+noinst_LTLIBRARIES = libxlocale.la
+
+endif
+
+
+xlocale_la_SOURCES = \
+       lcEuc.c \
+       lcJis.c \
+       lcSjis.c
+       
+libxlocale_la_SOURCES = $(xlocale_la_SOURCES)
diff --git a/modules/lc/xlocale/lcEuc.c b/modules/lc/xlocale/lcEuc.c
new file mode 100644 (file)
index 0000000..442e309
--- /dev/null
@@ -0,0 +1,1537 @@
+/******************************************************************
+
+        Copyright 1992, 1993 by FUJITSU LIMITED
+        Copyright 1993 by Fujitsu Open Systems Solutions, Inc.
+
+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 FUJITSU LIMITED and
+Fujitsu Open Systems Solutions, Inc. not be used in advertising or
+publicity pertaining to distribution of the software without specific,
+written prior permission.
+FUJITSU LIMITED and Fujitsu Open Systems Solutions, Inc. makes no
+representations about the suitability of this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+FUJITSU LIMITED AND FUJITSU OPEN SYSTEMS SOLUTIONS, INC. DISCLAIMS ALL
+WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL FUJITSU OPEN SYSTEMS
+SOLUTIONS, INC. AND FUJITSU LIMITED 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.
+
+    Authors: Shigeru Yamada            (yamada@ossi.com)
+             Jeffrey Bloomfield                (jeffb@ossi.com)
+             Yoshiyuki Segawa          (segawa@ossi.com)
+
+*****************************************************************/
+
+/*
+ * An EUC locale.
+ * Supports: all locales with codeset eucJP, eucKR, eucCN, eucTW.
+ * How: Provides converters for euc*.
+ * Platforms: Only those defining X_LOCALE (only Lynx, Linux-libc5, OS/2).
+ */
+
+#ifdef X_LOCALE
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XlcGeneric.h"
+
+#include <ctype.h>
+#ifdef WIN32
+#define isascii __isascii
+#endif
+
+#define CS0     codesets[0]             /* Codeset 0 - 7-bit ASCII      */
+#define CS1     codesets[1]             /* Codeset 1 - Kanji            */
+#define CS2     codesets[2]             /* Codeset 2 - Half-Kana        */
+#define CS3     codesets[3]             /* Codeset 3 - User defined     */
+
+#define SS2    0x8e    /* Single-shift char: CS2 */
+#define SS3    0x8f    /* Single-shift char: CS3 */
+
+#define ASCII_CODESET   0
+#define KANJI_CODESET   1
+#define KANA_CODESET    2
+#define USERDEF_CODESET 3
+#define MAX_CODESETS
+
+#define GR     0x80    /* begins right-side (non-ascii) region */
+#define GL     0x7f    /* ends left-side (ascii) region        */
+
+#define isleftside(c)  (((c) & GR) ? 0 : 1)
+#define isrightside(c) (!isleftside(c))
+
+#define BIT8OFF(c)     ((c) & GL)
+#define BIT8ON(c)      ((c) | GR)
+
+typedef unsigned char   Uchar;
+typedef unsigned long   Ulong;
+typedef unsigned int   Uint;
+
+static CodeSet GetCodeSetFromCharSet (XLCd lcd, XlcCharSet charset);
+static CodeSet wc_codeset (XLCd lcd, wchar_t wch);
+
+#define BADCHAR(min_ch, c)  (BIT8OFF(c) < (char)min_ch && BIT8OFF(c) != 0x0 && \
+                            BIT8OFF(c) != '\t' && BIT8OFF(c) != '\n' && \
+                            BIT8OFF(c) != 0x1b)
+
+/*
+ * Notes:
+ * 1. Defining FORCE_INDIRECT_CONVERTER (see _XlcEucLoader())
+ *    forces indirect (charset) conversions (e.g. wcstocs()<->cstombs()).
+ * 2. Using direct converters (e.g. mbstowcs()) decreases conversion
+ *    times by 20-40% (depends on specific converter used).
+ */
+
+static int
+euc_mbstowcs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    XLCd lcd = (XLCd)conv->state;
+
+    Uchar ch;
+    int chr_len = 0;
+    int sshift =  False;
+    int shift_mult = 0;
+    Uint chrcode;
+
+    Uint wc_encode = 0;
+    Uint wc_tmp = 0;
+
+    int cs0flg = False;
+    int cs1flg = False;
+    int length = 0;
+    int unconv_num = 0;
+
+    Bool new_char;
+
+    const char *inbufptr = *from;
+    wchar_t *outbufptr = (wchar_t *) *to;
+
+    CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
+    int codeset_num = XLC_GENERIC(lcd, codeset_num);
+    Ulong wc_shift = XLC_GENERIC(lcd, wc_shift_bits);
+
+    for (new_char = True; *from_left > 0 && *to_left > 0;) {
+
+       ch = *inbufptr++;
+
+       if (isleftside(ch)) {                           /* CS0 */
+            if (ASCII_CODESET >= codeset_num) {
+               unconv_num++;
+               (*from_left)--;
+               continue;
+           }
+           if( cs0flg == True) {
+               new_char = True;
+               cs0flg = False;
+           }
+           length = CS0->length;
+           *outbufptr++ = (wchar_t)ch;
+           (*from_left)--;
+           (*to_left)--;
+           continue;
+       }
+       else if (ch == SS2) {                           /* CS2 */
+           if (KANA_CODESET >= codeset_num) {
+               unconv_num++;
+               (*from_left)--;
+               continue;
+           }
+           if (sshift == True || cs1flg == True) {
+               cs1flg = False;
+               unconv_num++;
+               continue;
+           }
+           length = CS2->length;
+           wc_encode = CS2->wc_encoding;
+           chrcode = 0;
+           sshift = True;
+           cs0flg = True;
+           (*from_left)--;
+           continue;
+       }
+       else if (ch == SS3) {                           /* CS3 */
+           if (USERDEF_CODESET >= codeset_num) {
+               unconv_num++;
+               (*from_left)--;
+               continue;
+           }
+           if (sshift == True || cs1flg == True) {
+               cs1flg = False;
+               unconv_num++;
+               continue;
+           }
+           length = CS3->length;
+           if (*from_left < 1 )
+               unconv_num++;
+           wc_encode = CS3->wc_encoding;
+           chrcode = 0;
+           sshift = True;
+           cs0flg = True;
+           (*from_left)--;
+           continue;
+
+       } else {                                        /* CS1 */
+           if (KANJI_CODESET >= codeset_num) {
+               unconv_num++;
+               (*from_left)--;
+               continue;
+           }
+           if (sshift == False) {
+               length = CS1->length;
+               if (*from_left < 1)
+                   unconv_num++;
+               wc_encode = CS1->wc_encoding;
+           }
+           chrcode = BIT8OFF(ch);
+           cs0flg = True;
+           cs1flg = True;
+           (*from_left)--;
+       }
+
+       if (new_char) {                         /* begin new character */
+           chr_len = length;
+           shift_mult = length - 1;
+           new_char = False;
+       }
+
+       chrcode <<= (wc_shift * shift_mult);
+       shift_mult--;
+       wc_tmp |= chrcode;
+
+       if (--chr_len == 0) {
+           wc_tmp |= wc_encode;
+           *outbufptr++ = wc_tmp;
+           (*to_left)--;
+
+           new_char = True;
+           sshift = False;
+           cs0flg = False;
+           cs1flg = False;
+           wc_tmp  = (Uint)0;
+       }
+
+    }  /* end for */
+
+    *to = (XPointer)outbufptr;
+
+    if (cs0flg == True || cs1flg == True)      /* error check on last char */
+       unconv_num++;
+
+    return unconv_num;
+}
+
+
+static int
+euc_wcstombs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    const wchar_t *inbufptr = (const wchar_t *) *from;
+    XPointer outbufptr = *to;
+    wchar_t  wch;
+    int length;
+    Uchar tmp;
+    int unconv_num = 0;
+
+    XLCd lcd = (XLCd)conv->state;
+    CodeSet codeset;
+    Ulong wc_shift = XLC_GENERIC(lcd, wc_shift_bits);
+
+    for (; *from_left > 0 && *to_left > 0; (*from_left)-- ) {
+
+       wch = *inbufptr++;
+
+       if (!(codeset = wc_codeset(lcd, wch))) {
+           unconv_num++;
+           (*from_left)--;
+           continue;
+       }
+
+       length = codeset->length;
+       wch ^= (wchar_t)codeset->wc_encoding;
+
+       if (codeset->parse_info) {      /* put out SS2 or SS3 */
+           if (*to_left < length + 1) {
+               unconv_num++;
+               break;
+           }
+           *outbufptr++ = *codeset->parse_info->encoding;
+           (*to_left)--;
+        } else {
+           if (*to_left < length) {
+               unconv_num++;
+               break;
+           }
+       }
+
+       do {
+           length--;
+           tmp = (wch>>(wchar_t)(length * wc_shift));
+
+           if (codeset->side == XlcGR)
+               tmp = BIT8ON(tmp);
+
+           *outbufptr++ = (Uchar)tmp;
+           (*to_left)--;
+       } while (length);
+    }
+
+    *to = (XPointer)outbufptr;
+
+    return unconv_num;
+}
+
+
+static int
+euc_mbtocs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    XLCd lcd = (XLCd)conv->state;
+    XlcCharSet charset;
+    CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
+    int codeset_num = XLC_GENERIC(lcd, codeset_num);
+    int length;
+    int unconv_num = 0;
+    int min_ch = 0;
+    const char *src = *from;
+    char *dst = *to;
+
+    if (isleftside(*src)) {                    /* 7-bit (CS0) */
+       if (ASCII_CODESET >= codeset_num)
+           return -1;
+       charset = *CS0->charset_list;
+    }
+    else if ((Uchar)*src == SS2) {             /* half-kana (CS2) */
+       if (KANA_CODESET >= codeset_num)
+           return -1;
+       charset = *CS2->charset_list;
+       src++;
+       (*from_left)--;
+    }
+    else if ((Uchar)*src == SS3) {             /* user-def */
+       if (USERDEF_CODESET >= codeset_num)
+           return -1;
+       charset = *CS3->charset_list;
+       src++;
+       (*from_left)--;
+    }
+    else  {                                    /* Kanji (CS1) */
+       if (KANJI_CODESET >= codeset_num)
+           return -1;
+       charset = *CS1->charset_list;
+    }
+
+    if(*from_left < charset->char_size || *to_left < charset->char_size)
+       return -1;
+
+    min_ch = 0x20;
+    if (charset->set_size == 94)
+       if (charset->char_size > 1 || charset->side == XlcGR)
+           min_ch = 0x21;
+
+    length = charset->char_size;
+    do {
+       if(BADCHAR(min_ch, *src)) {
+           unconv_num++;
+           src++;
+           break;
+       }
+       switch (charset->side) {
+           case XlcGL:
+               *dst++ = BIT8OFF(*src++);
+               break;
+           case XlcGR:
+               *dst++ = BIT8ON(*src++);
+               break;
+           default:
+               *dst++ = *src++;
+               break;
+           }
+    } while (--length);
+
+    *to = dst;
+    *from = (XPointer) src;
+    *from_left -= charset->char_size;
+    *to_left -= charset->char_size - length;
+
+    if (num_args > 0)
+       *((XlcCharSet *) args[0]) = charset;
+
+    return unconv_num;
+}
+
+
+static int
+euc_mbstocs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    const char *tmp_from;
+    char *tmp_to;
+    int tmp_from_left, tmp_to_left;
+    XlcCharSet charset, tmp_charset;
+    XPointer tmp_args[1];
+    int unconv_num = 0, ret;
+
+/* Determine the charset of the segment and convert one characater: */
+
+    tmp_args[0] = (XPointer) &charset; /* charset from euc_mbtocs() */
+    while
+      ((ret = euc_mbtocs(conv, from, from_left, to, to_left, tmp_args, 1)) > 0)
+       unconv_num += ret;
+    if ( ret < 0 )
+       return ret;
+
+    tmp_from = *from;
+    tmp_from_left = *from_left;
+    tmp_to_left = *to_left;
+    tmp_to = *to;
+
+/* Convert remainder of the segment: */
+
+    tmp_args[0] = (XPointer) &tmp_charset;
+    while( (ret = euc_mbtocs(conv, (XPointer *) &tmp_from, &tmp_from_left,
+                    (XPointer *) &tmp_to, &tmp_to_left, tmp_args, 1)) >= 0 ) {
+
+       if (ret > 0) {
+           unconv_num += ret;
+           continue;
+       }
+
+       if (tmp_charset != charset)  /* quit on end of segment */
+           break;
+
+       *from = (XPointer) tmp_from;
+       *from_left = tmp_from_left;
+       *to = (XPointer) tmp_to;
+       *to_left = tmp_to_left;
+    }
+
+    if (num_args > 0)
+       *((XlcCharSet *) args[0]) = charset;
+
+    return unconv_num;
+}
+
+
+static int
+euc_wcstocs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    XLCd lcd = (XLCd)conv->state;
+    const wchar_t *wcptr = (const wchar_t *) *from;
+    char *bufptr = (char *) *to;
+    wchar_t wch;
+    char *tmpptr;
+    int length;
+    CodeSet codeset;
+    Ulong wc_encoding;
+    int wcstr_len = *from_left, buf_len = *to_left;
+
+    if (!(codeset = wc_codeset(lcd, *wcptr)))
+       return -1;
+
+    wc_encoding = codeset->wc_encoding;
+
+    if (wcstr_len < buf_len / codeset->length)
+       buf_len = wcstr_len * codeset->length;
+
+    for ( ; wcstr_len > 0 && buf_len > 0; wcptr++, wcstr_len--) {
+       wch = *wcptr;
+
+       if ((wch & XLC_GENERIC(lcd, wc_encode_mask)) != wc_encoding)
+           break;
+
+       length = codeset->length;
+
+       buf_len -= length;
+       bufptr += length;
+       tmpptr = bufptr - 1;
+
+       while (length--) {
+           *tmpptr-- = codeset->length == 1 && codeset->side == XlcGR ?
+             BIT8ON(wch) : BIT8OFF(wch);
+           wch >>= (wchar_t)XLC_GENERIC(lcd, wc_shift_bits);
+       }
+    }
+
+    if (num_args > 0)
+       *((XlcCharSet *) args[0]) = *codeset->charset_list;
+
+    *from_left -= wcptr - (wchar_t *) *from;
+    *from = (XPointer) wcptr;
+
+    *to_left -= bufptr - *to;
+    *to = bufptr;
+
+    return 0;
+}
+
+
+static int
+euc_cstombs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    XLCd lcd = (XLCd)conv->state;
+    const char *csptr = *from;
+    char *bufptr = *to;
+    int csstr_len = *from_left;
+    int buf_len = *to_left;
+    int length;
+    CodeSet codeset;
+    int cvt_length;
+
+    if (num_args < 1)
+       return -1;
+
+    if (!(codeset = GetCodeSetFromCharSet(lcd, (XlcCharSet) args[0])))
+       return -1;
+
+    cvt_length = 0;
+    csstr_len /= codeset->length;
+    buf_len /= codeset->length;
+
+    if (codeset->parse_info)
+       csstr_len *= 2;
+
+    if (csstr_len < buf_len)
+       buf_len = csstr_len;
+
+    cvt_length += buf_len * codeset->length;
+
+    if (bufptr) {
+       while (buf_len--) {
+           if (codeset->parse_info)    /* put out SS2 or SS3 */
+               *bufptr++ = *codeset->parse_info->encoding;
+
+           length = codeset->length;
+           while (length--)
+               *bufptr++ = codeset->side == XlcGR ?
+                 BIT8ON(*csptr++) : BIT8OFF(*csptr++);
+       }
+    }
+
+    *from_left -= csptr - *from;
+    *from = (XPointer) csptr;
+    if (bufptr)
+       *to += cvt_length;
+    *to_left -= cvt_length;
+
+    return 0;
+}
+
+
+static int
+euc_cstowcs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    XLCd lcd = (XLCd)conv->state;
+    const char *csptr = *from;
+    wchar_t *bufptr = (wchar_t *) *to;
+    wchar_t *toptr = (wchar_t *) *to;
+    int csstr_len = *from_left;
+    int buf_len = *to_left;
+    wchar_t wch;
+    int length;
+    Ulong wc_shift_bits = XLC_GENERIC(lcd, wc_shift_bits);
+    CodeSet codeset;
+
+    if (num_args < 1)
+       return -1;
+
+    if (!(codeset = GetCodeSetFromCharSet(lcd, (XlcCharSet) args[0])))
+        return -1;
+
+    csstr_len /= codeset->length;
+    if (csstr_len < buf_len)
+       buf_len = csstr_len;
+    *to_left -= buf_len;
+
+    if (bufptr) {
+
+       toptr += buf_len;
+       *to = (XPointer) toptr;
+
+        while (buf_len--) {
+
+            wch = (wchar_t) BIT8OFF(*csptr);
+            csptr++;
+
+            length = codeset->length - 1;
+            while (length--) {
+                wch = (wch << wc_shift_bits) | BIT8OFF(*csptr);
+                csptr++;
+            }
+            *bufptr++ = wch | codeset->wc_encoding;
+        }
+    }
+    *from_left -= csptr - *from;
+    *from = (XPointer) csptr;
+
+    return 0;
+}
+
+
+static CodeSet
+wc_codeset(
+    XLCd lcd,
+    wchar_t wch)
+{
+    CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
+    int end = XLC_GENERIC(lcd, codeset_num);
+    Ulong widech = (Ulong)(wch & XLC_GENERIC(lcd, wc_encode_mask));
+
+    for (; --end >= 0; codesets++)
+       if ( widech == (*codesets)->wc_encoding )
+           return *codesets;
+
+    return NULL;
+}
+
+
+static CodeSet
+GetCodeSetFromCharSet(
+    XLCd lcd,
+    XlcCharSet charset)
+{
+    CodeSet *codeset = XLC_GENERIC(lcd, codeset_list);
+    XlcCharSet *charset_list;
+    int codeset_num, num_charsets;
+
+    codeset_num = XLC_GENERIC(lcd, codeset_num);
+
+    for ( ; codeset_num-- > 0; codeset++) {
+       num_charsets = (*codeset)->num_charsets;
+       charset_list = (*codeset)->charset_list;
+
+       for ( ; num_charsets-- > 0; charset_list++)
+           if (*charset_list == charset)
+               return *codeset;
+    }
+
+    return (CodeSet) NULL;
+}
+
+
+static XlcConv
+create_conv(
+    XLCd lcd,
+    XlcConvMethods methods)
+{
+    XlcConv conv;
+
+    conv = (XlcConv) Xmalloc(sizeof(XlcConvRec));
+    if (conv == NULL)
+       return (XlcConv) NULL;
+
+    conv->methods = methods;
+    conv->state = (XPointer) lcd;
+    return conv;
+}
+
+
+/*
+ *    Stripped down Direct CT converters for EUC
+ *
+ */
+
+typedef struct _CTDataRec {
+    int side;
+    int length;
+    char *name;
+    Ulong wc_encoding;
+    char sshift;
+    char *ct_encoding;
+    int ct_encoding_len;
+    int set_size;
+    Uchar min_ch;
+    Uchar ct_type;
+} CTDataRec, *CTData;
+
+typedef struct _StateRec {
+    CTData GL_charset;
+    CTData GR_charset;
+    CTData charset;
+} StateRec, *State;
+
+#define CT_STD  0
+#define CT_NSTD 1
+#define CT_DIR  2
+#define CT_EXT0 3
+#define CT_EXT1 4
+#define CT_EXT2 5
+#define CT_VER  6
+
+static CTDataRec ctdata[] =
+{
+  { XlcGL,      1, "ISO8859-1:GL",       0, 0, "\033(B"   ,  3, 0, 0, CT_STD  },
+  { XlcGR,      1, "ISO8859-1:GR",       0, 0, "\033-A"   ,  3, 0, 0, CT_STD  },
+  { XlcGL,      1, "JISX0201.1976-0:GL", 0, 0, "\033(J"   ,  3, 0, 0, CT_STD  },
+  { XlcGR,      1, "JISX0201.1976-0:GR", 0, 0, "\033)I"   ,  3, 0, 0, CT_STD  },
+  { XlcGL,      2, "JISX0208.1983-0:GL", 0, 0, "\033$(B"  ,  4, 0, 0, CT_STD  },
+  { XlcGR,      2, "JISX0208.1983-0:GR", 0, 0, "\033$)B"  ,  4, 0, 0, CT_STD  },
+  { XlcGL,      2, "JISX0212.1990-0:GL", 0, 0, "\033$(D"  ,  4, 0, 0, CT_STD  },
+  { XlcGR,      2, "JISX0212.1990-0:GR", 0, 0, "\033$)D"  ,  4, 0, 0, CT_STD  },
+  { XlcUnknown, 0, "Ignore-Ext-Status?", 0, 0, "\033#"    ,  2, 0, 0, CT_VER  },
+  { XlcUnknown, 0, "NonStd-?-OctetChar", 0, 0, "\033%/0"  ,  4, 0, 0, CT_NSTD },
+  { XlcUnknown, 1, "NonStd-1-OctetChar", 0, 0, "\033%/1"  ,  4, 0, 0, CT_NSTD },
+  { XlcUnknown, 2, "NonStd-2-OctetChar", 0, 0, "\033%/2"  ,  4, 0, 0, CT_NSTD },
+  { XlcUnknown, 3, "NonStd-3-OctetChar", 0, 0, "\033%/3"  ,  4, 0, 0, CT_NSTD },
+  { XlcUnknown, 4, "NonStd-4-OctetChar", 0, 0, "\033%/4"  ,  4, 0, 0, CT_NSTD },
+  { XlcUnknown, 0, "Extension-2"       , 0, 0, "\033%/"   ,  3, 0, 0, CT_EXT2 },
+  { XlcUnknown, 0, "Extension-0"       , 0, 0, "\033"     ,  1, 0, 0, CT_EXT0 },
+  { XlcUnknown, 0, "Begin-L-to-R-Text",  0, 0, "\2331]"   ,  3, 0, 0, CT_DIR  },
+  { XlcUnknown, 0, "Begin-R-to-L-Text",  0, 0, "\2332]"   ,  3, 0, 0, CT_DIR  },
+  { XlcUnknown, 0, "End-Of-String",      0, 0, "\233]"    ,  2, 0, 0, CT_DIR  },
+  { XlcUnknown, 0, "Extension-1"       , 0, 0, "\233"     ,  1, 0, 0, CT_EXT1 },
+};
+
+/* Note on above table:  euc_ctstombs() and euc_ctstowcs() parser depends on
+ * certain table entries occuring in decreasing string length--
+ *   1.  CT_EXT2 and CT_EXT0 entries must occur after CT_NSTD entries.
+ *   2.  CT_DIR and CT_EXT1 entries must occur after CT_DIR entries.
+ */
+
+static CTData ctd_endp = ctdata + ((sizeof(ctdata) / sizeof(CTDataRec))) - 1;
+static CTData ctdptr[sizeof(ctdata) / sizeof(CTDataRec)];
+
+#define Ascii   0
+#define Kanji   1
+#define Kana    2
+#define Userdef 3
+
+/*
+ * initCTptr(): Set ctdptr[] to point at ctdata[], indexed by codeset_num.
+ */
+static void
+initCTptr(
+    XLCd lcd)
+{
+    int num_codesets = XLC_GENERIC(lcd, codeset_num);
+    int num_charsets;
+    int i, j;
+    CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
+    CodeSet codeset;
+    XlcCharSet charset;
+    CTData ctdp = ctdata;
+
+    ctdptr[Ascii] = &ctdata[0];                /* failsafe */
+
+    for (i = 0; i < num_codesets; i++) {
+
+       codeset = codesets[i];
+       num_charsets = codeset->num_charsets;
+
+       for (j = 0; j < num_charsets; j++) {
+
+           charset = codeset->charset_list[j];
+
+           for (ctdp = ctdata; ctdp <= ctd_endp; ctdp++)
+
+               if (! strcmp(ctdp->name, charset->name)) {
+
+                   ctdptr[codeset->cs_num] = ctdp;
+
+                   ctdptr[codeset->cs_num]->wc_encoding = codeset->wc_encoding;
+
+                   ctdptr[codeset->cs_num]->set_size =
+                     charset->set_size;
+
+                   ctdptr[codeset->cs_num]->min_ch =
+                     charset->set_size == 94 &&
+                     (ctdptr[codeset->cs_num]->length > 1 ||
+                     ctdptr[codeset->cs_num]->side == XlcGR) ? 0x21 : 0x20;
+
+                   if (codeset->parse_info) {
+                       ctdptr[codeset->cs_num]->sshift =
+                         *codeset->parse_info->encoding;
+                   }
+
+                   break;
+               }
+       }
+    }
+}
+
+
+#define SKIP_I(str)     while (*(str) >= 0x20 && *(str) <=  0x2f) (str)++;
+#define SKIP_P(str)     while (*(str) >= 0x30 && *(str) <=  0x3f) (str)++;
+
+static int
+euc_ctstowcs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    XLCd lcd = (XLCd)conv->state;
+    Ulong wc_shift_bits = XLC_GENERIC(lcd, wc_shift_bits);
+    const char *inbufptr = *from;
+    const char *inbuf_base;
+    wchar_t *outbufptr = (wchar_t *) *to;
+    wchar_t *outbuf_base = outbufptr;
+    int clen, length;
+    int unconv_num = 0;
+    unsigned int ct_seglen = 0;
+    Uchar ct_type = 0;
+    int shift_mult;
+    wchar_t wc_tmp;
+    wchar_t wch;
+    Ulong wc_encoding;
+    CTData ctdp = ctdata;
+    CTData GL_ctdp = ctdp;     /* GL ctdp save */
+    CTData GR_ctdp = ctdp;     /* GR ctdp save */
+    Bool save_outbuf = True;
+    /* If outbufptr is NULL, doen't save output, but just counts
+       a length to hold the output */
+    if (outbufptr == NULL) save_outbuf = False;
+
+    for (length = ctdata[Ascii].length; *from_left > 0; (*from_left) -= length)
+    {
+       ct_type = CT_STD;
+       /* change GL/GR charset */
+       if(ctdp->side == XlcGR && isleftside(*inbufptr)){
+           /* select GL side */
+           ctdp = GL_ctdp;
+           length = ctdp->length;
+           ct_type = ctdp->ct_type;
+       }else if(ctdp->side == XlcGL && isrightside(*inbufptr)){
+           /* select GR side */
+           ctdp = GR_ctdp;
+           length = ctdp->length;
+           ct_type = ctdp->ct_type;
+       }
+       if (*inbufptr == '\033' || *inbufptr == (char)'\233') {
+           for (ctdp = ctdata; ctdp <= ctd_endp ; ctdp++) {
+
+               if(!strncmp(inbufptr, ctdp->ct_encoding, ctdp->ct_encoding_len))
+               {
+                   inbufptr += ctdp->ct_encoding_len;
+                   (*from_left) -= ctdp->ct_encoding_len;
+                   if (ctdp->length) {
+                       length = ctdp->length;
+                       if( *from_left < length ) {
+                           *to = (XPointer)outbufptr;
+                           *to_left -= outbufptr - outbuf_base;
+                           return( unconv_num + *from_left );
+                       }
+                   }
+                   ct_type = ctdp->ct_type;
+                   if(ctdp->side == XlcGL){
+                       GL_ctdp = ctdp; /* save GL ctdp */
+                   }else{
+                       GR_ctdp = ctdp; /* save GR ctdp */
+                   }
+                   break;
+               }
+           }
+           if (ctdp > ctd_endp)        /* failed to match CT sequence */
+               unconv_num++;
+       }
+
+/* The following code insures that non-standard encodings, direction, extension,
+ * and version strings are ignored; subject to change in future.
+ */
+       switch (ct_type) {
+       case CT_STD:
+           break;
+       case CT_EXT2:
+           inbufptr++;
+           (*from_left)--;
+       case CT_NSTD:
+           ct_seglen = (BIT8OFF(*inbufptr) << 7) + BIT8OFF(*(inbufptr+1)) + 2;
+           inbufptr += ct_seglen;
+           (*from_left) -= ct_seglen;
+           continue;
+       case CT_EXT0:
+           inbuf_base = inbufptr;
+           SKIP_I(inbufptr);
+           inbufptr++;
+           ct_seglen = (unsigned)(inbufptr - inbuf_base);
+           *(from_left) -= ct_seglen;
+           continue;
+       case CT_EXT1:
+           inbuf_base = inbufptr;
+           SKIP_P(inbufptr);
+           SKIP_I(inbufptr);
+           inbufptr++;
+           ct_seglen = (unsigned)(inbufptr - inbuf_base);
+           *(from_left) -= ct_seglen;
+           continue;
+       case CT_DIR:
+           continue;
+       case CT_VER:
+           inbufptr += 2;
+           *(from_left) -= 2;
+           continue;
+       }
+
+       wc_encoding = (ctdp == ctdptr[Kana] && isleftside(*inbufptr)) ?
+           ctdptr[Ascii]->wc_encoding: ctdp->wc_encoding;
+
+       shift_mult = length - 1;
+       wch = (wchar_t)0;
+       clen = length;
+
+       do {
+           wc_tmp = BIT8OFF(*inbufptr++) << (wc_shift_bits * shift_mult);
+           wch |= wc_tmp;
+           shift_mult--;
+       } while (--clen);
+
+       if (save_outbuf == True)
+           *outbufptr++ = wch | wc_encoding;
+       if (--*to_left == 0 && *from_left != length) {
+           *to = (XPointer)outbufptr;
+           unconv_num = *from_left;
+           return unconv_num;
+       }
+    }
+
+    *to = (XPointer)outbufptr;
+
+    return unconv_num;
+
+}
+
+
+#define byte1                  (length == codeset->length - 1)
+#define byte2                  (byte1 == 0)
+#define kanji                  (codeset->cs_num == 1)
+#define kana                   (codeset->cs_num == 2)
+#define userdef                        (codeset->cs_num == 3)
+
+static int
+euc_wcstocts(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    int ct_len = *to_left;
+    const wchar_t *inbufptr = (const wchar_t *) *from;
+    char *ctptr = *to;
+    XPointer ct_base = ctptr;
+    wchar_t  wch;
+    int length;
+    int unconv_num = 0;
+    Uchar tmp;
+    Uchar t1 = 0;
+    int num_conv;
+
+    StateRec ct_state;
+    XLCd lcd = (XLCd)conv->state;
+    CTData charset;
+    CodeSet codeset;
+    Ulong wc_shift = XLC_GENERIC(lcd, wc_shift_bits);
+
+/* Initial State: */
+    ct_state.GL_charset = ctdptr[0]; /* Codeset 0 */
+    ct_state.GR_charset = NULL;
+
+    if (*from_left > *to_left)
+       *from_left = *to_left;
+
+    for (; *from_left > 0 ; (*from_left)-- ) {
+
+       wch = *inbufptr++;
+
+       if (!(codeset = wc_codeset(lcd, wch))) {
+           unconv_num++;
+           (*from_left)--;
+           continue;
+       }
+
+       charset = ctdptr[codeset->cs_num];
+
+       length = codeset->length;
+       wch ^= (wchar_t)codeset->wc_encoding;
+
+       if ( (charset->side == XlcGR && charset != ct_state.GR_charset) ||
+            (charset->side == XlcGL && charset != ct_state.GL_charset) ) {
+
+           ct_len -= ctdptr[codeset->cs_num]->ct_encoding_len;
+
+           if (ct_len < 0) {
+               unconv_num++;
+               break;
+           }
+
+           if (ctptr) {
+               strcpy(ctptr, ctdptr[codeset->cs_num]->ct_encoding);
+               ctptr += ctdptr[codeset->cs_num]->ct_encoding_len;
+           }
+       }
+
+       if (charset->side == XlcGR) {
+           ct_state.GR_charset = charset;
+           ct_state.GL_charset = NULL;
+       } else if (charset->side == XlcGL) {
+           ct_state.GL_charset = charset;
+           ct_state.GR_charset = NULL;
+       }
+
+       do {
+
+           length--;
+           tmp = wch>>(wchar_t)( (Ulong)length * wc_shift);
+
+           if (kana) {
+               if (BADCHAR(charset->min_ch, (char)tmp)) {
+                   unconv_num++;
+                   break;
+               }
+               *ctptr++ = (char)BIT8ON(tmp);
+           }
+
+           else if (byte1 && (kanji || userdef))
+               t1 = tmp;
+
+           else if (byte2 && (kanji || userdef)) {
+               if (BADCHAR(charset->min_ch, (char)t1) ||
+                 BADCHAR(charset->min_ch, (char)tmp)) {
+                   unconv_num++;
+                   break;
+               }
+               if (charset->side == XlcGR) {
+                   *ctptr++ = (char)BIT8ON(t1);
+                   *ctptr++ = (char)BIT8ON(tmp);
+               } else {
+                   *ctptr++ = (char)BIT8OFF(t1);
+                   *ctptr++ = (char)BIT8OFF(tmp);
+               }
+           }
+
+           else {
+               if (BADCHAR(charset->min_ch, (char)tmp)) {
+                   unconv_num++;
+                   break;
+               }
+               *ctptr++ = (char)tmp;
+           }
+
+
+       } while (length);
+
+    }  /* end for */
+
+    *to = (XPointer)ctptr;
+
+    if ((num_conv = (int)(ctptr - ct_base)) > 0)
+       (*to_left) -= num_conv;
+
+    return unconv_num;
+}
+#undef byte1
+#undef byte2
+#undef kana
+#undef kanji
+#undef userdef
+
+
+#define byte1  (ctdp->length == clen)
+#define kana    (ctdp == ctdptr[Kana] && isrightside(*inbufptr))
+/* #define kanji   (ctdp == ctdptr[Kanji]) */
+#define kanji   (strstr(ctdp->name, "JISX0208"))
+#define userdef (ctdp == ctdptr[Userdef])
+
+static int
+euc_ctstombs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    char *inbufptr = *from;
+    XPointer outbufptr = *to;
+    const char *inbuf_base;
+    XPointer outbuf_base = outbufptr;
+    int clen, length;
+    int unconv_num = 0;
+    unsigned int ct_seglen = 0;
+    Uchar ct_type = 0;
+    CTData ctdp = &ctdata[0];  /* default */
+    CTData GL_ctdp = ctdp;     /* GL ctdp save */
+    CTData GR_ctdp = ctdp;     /* GR ctdp save */
+    Bool save_outbuf = True;
+    /* If outbufptr is NULL, doen't save output, but just counts
+       a length to hold the output */
+    if (outbufptr == NULL) save_outbuf = False;
+
+    for (length = ctdata[Ascii].length; *from_left > 0; (*from_left) -= length)
+    {
+       ct_type = CT_STD;
+       /* change GL/GR charset */
+       if(ctdp->side == XlcGR && isleftside(*inbufptr)){
+           /* select GL side */
+           ctdp = GL_ctdp;
+           length = ctdp->length;
+           ct_type = ctdp->ct_type;
+       }else if(ctdp->side == XlcGL && isrightside(*inbufptr)){
+           /* select GR side */
+           ctdp = GR_ctdp;
+           length = ctdp->length;
+           ct_type = ctdp->ct_type;
+       }
+       if (*inbufptr == '\033' || *inbufptr == (char)'\233') {
+
+           for (ctdp = ctdata; ctdp <= ctd_endp ; ctdp++) {
+
+               if(!strncmp(inbufptr, ctdp->ct_encoding, ctdp->ct_encoding_len))
+               {
+                   inbufptr += ctdp->ct_encoding_len;
+                   (*from_left) -= ctdp->ct_encoding_len;
+                   if (ctdp->length) {
+                       length = ctdp->length;
+                       if( *from_left < length ) {
+                           *to = (XPointer)outbufptr;
+                           *to_left -= outbufptr - outbuf_base;
+                           return( unconv_num + *from_left );
+                       }
+                   }
+                   ct_type = ctdp->ct_type;
+                   if(ctdp->side == XlcGL){
+                       GL_ctdp = ctdp; /* save GL ctdp */
+                   }else{
+                       GR_ctdp = ctdp; /* save GR ctdp */
+                   }
+                   break;
+               }
+           }
+           if (ctdp > ctd_endp)        /* failed to match CT sequence */
+               unconv_num++;
+       }
+
+/* The following code insures that non-standard encodings, direction, extension,
+ * and version strings are ignored; subject to change in future.
+ */
+       switch (ct_type) {
+       case CT_STD:
+           break;
+       case CT_EXT2:
+           inbufptr++;
+           (*from_left)--;
+       case CT_NSTD:
+           ct_seglen = (BIT8OFF(*inbufptr) << 7) + BIT8OFF(*(inbufptr+1)) + 2;
+           inbufptr += ct_seglen;
+           (*from_left) -= ct_seglen;
+           continue;
+       case CT_EXT0:
+           inbuf_base = inbufptr;
+           SKIP_I(inbufptr);
+           inbufptr++;
+           ct_seglen = (unsigned)(inbufptr - inbuf_base);
+           *(from_left) -= ct_seglen;
+           continue;
+       case CT_EXT1:
+           inbuf_base = inbufptr;
+           SKIP_P(inbufptr);
+           SKIP_I(inbufptr);
+           inbufptr++;
+           ct_seglen = (unsigned)(inbufptr - inbuf_base);
+           *(from_left) -= ct_seglen;
+           continue;
+       case CT_DIR:
+           continue;
+       case CT_VER:
+           inbufptr += 2;
+           *(from_left) -= 2;
+           continue;
+       }
+
+       clen = length;
+       do {
+
+           if (byte1) {
+               if (kanji) {
+                   /* FIXME: assignment of read-only location */
+                   *inbufptr = BIT8ON(*inbufptr);
+                   *(inbufptr+1) = BIT8ON(*(inbufptr+1));
+               }
+               else if (kana || userdef) {
+                   if (save_outbuf == True) {
+                       *outbufptr++ = ctdp->sshift;
+                   }
+                   (*to_left)--;
+               }
+           }
+           if (save_outbuf == True) {
+               *outbufptr++ = *inbufptr;
+           }
+           (*to_left)--;
+           inbufptr++;
+
+           if (*to_left == 0 && *from_left != length) {
+               *to = (XPointer)outbufptr;
+               unconv_num = *from_left;
+               return unconv_num;
+           }
+       } while (--clen);
+    }
+
+    *to = outbufptr;
+
+    return unconv_num;
+
+}
+#undef byte1
+#undef kana
+#undef kanji
+#undef userdef
+
+
+static int
+euc_mbstocts(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    int ct_len = *to_left;
+    int cs_num;
+    int clen, length = 0;
+    int unconv_num = 0;
+    int num_conv;
+    const char *inbufptr = *from;
+    char *ctptr = *to;
+    XPointer ct_base = ctptr;
+
+    StateRec ct_state;
+    CTData charset;
+    XLCd lcd = (XLCd) conv->state;
+    int codeset_num = XLC_GENERIC(lcd, codeset_num);
+
+/* Initial State: */
+    ct_state.GL_charset = NULL;
+    ct_state.GR_charset = NULL;
+
+    if (*from_left > *to_left)
+        *from_left = *to_left;
+
+    for (;*from_left > 0; (*from_left) -= length) {
+
+       if (isleftside(*inbufptr)) {            /* 7-bit (CS0) */
+           if (ASCII_CODESET >= codeset_num) {
+               unconv_num++;
+               (*from_left)--;
+               continue;
+           }
+           cs_num = Ascii;
+           charset = ctdptr[Ascii];
+       }
+       else if ((Uchar)*inbufptr == SS2) {     /* Kana */
+           if (KANA_CODESET >= codeset_num) {
+               unconv_num++;
+               (*from_left)--;
+               continue;
+           }
+           cs_num = Kana;
+           charset = ctdptr[Kana];
+           inbufptr++;
+           (*from_left)--;
+       }
+       else if ((Uchar)*inbufptr == SS3) {     /* Userdef */
+           if (USERDEF_CODESET >= codeset_num) {
+               unconv_num++;
+               (*from_left)--;
+               continue;
+           }
+           cs_num = Userdef;
+           charset = ctdptr[Userdef];
+           inbufptr++;
+           (*from_left)--;
+       }
+       else {
+           if (KANJI_CODESET >= codeset_num) {
+               unconv_num++;
+               (*from_left)--;
+               continue;
+           }
+           cs_num = Kanji;
+           charset = ctdptr[Kanji];
+       }
+
+       length = charset->length;
+
+       if (BADCHAR(charset->min_ch, *inbufptr))
+            continue;
+
+       if ( (charset->side == XlcGR && charset != ct_state.GR_charset) ||
+            (charset->side == XlcGL && charset != ct_state.GL_charset) ) {
+
+           ct_len -= ctdptr[cs_num]->ct_encoding_len;
+           if (ct_len < 0) {
+               unconv_num++;
+               break;
+           }
+
+           if (ctptr) {
+               strcpy(ctptr, ctdptr[cs_num]->ct_encoding);
+               ctptr += ctdptr[cs_num]->ct_encoding_len;
+           }
+       }
+
+       if (charset->side == XlcGR) {
+           ct_state.GR_charset = charset;
+           ct_state.GL_charset = NULL;
+       } else if (charset->side == XlcGL) {
+           ct_state.GL_charset = charset;
+           ct_state.GR_charset = NULL;
+       }
+
+       clen = length;
+
+       do {
+           *ctptr++ = charset == ct_state.GR_charset ?
+               BIT8ON(*inbufptr++) : BIT8OFF(*inbufptr++);
+       } while (--clen);
+    }
+
+    *to = (XPointer)ctptr;
+
+    if ((num_conv = (int)(ctptr - ct_base)) > 0)
+       (*to_left) -= num_conv;
+    return unconv_num;
+
+}
+
+
+static void
+close_converter(
+    XlcConv conv)
+{
+       Xfree((char *) conv);
+}
+
+enum { MBSTOCS, WCSTOCS, MBTOCS, CSTOMBS, CSTOWCS, MBSTOWCS, WCSTOMBS,
+       CTSTOWCS, CTSTOMBS, WCSTOCTS, MBSTOCTS };
+
+static XlcConvMethodsRec conv_methods[] = {
+    {close_converter, euc_mbstocs,  NULL },
+    {close_converter, euc_wcstocs,  NULL },
+    {close_converter, euc_mbtocs,   NULL },
+    {close_converter, euc_cstombs,  NULL },
+    {close_converter, euc_cstowcs,  NULL },
+    {close_converter, euc_mbstowcs, NULL },
+    {close_converter, euc_wcstombs, NULL },
+    {close_converter, euc_ctstowcs, NULL },
+    {close_converter, euc_ctstombs, NULL },
+    {close_converter, euc_wcstocts, NULL },
+    {close_converter, euc_mbstocts, NULL },
+};
+
+
+static XlcConv
+open_mbstocs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &conv_methods[MBSTOCS]);
+}
+
+static XlcConv
+open_wcstocs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &conv_methods[WCSTOCS]);
+}
+
+static XlcConv
+open_mbtocs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &conv_methods[MBTOCS]);
+}
+
+static XlcConv
+open_cstombs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &conv_methods[CSTOMBS]);
+}
+
+static XlcConv
+open_cstowcs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &conv_methods[CSTOWCS]);
+}
+
+static XlcConv
+open_mbstowcs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &conv_methods[MBSTOWCS]);
+}
+
+static XlcConv
+open_wcstombs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &conv_methods[WCSTOMBS]);
+}
+
+static XlcConv
+open_ctstowcs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &conv_methods[CTSTOWCS]);
+}
+
+static XlcConv
+open_ctstombs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &conv_methods[CTSTOMBS]);
+}
+
+static XlcConv
+open_wcstocts(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &conv_methods[WCSTOCTS]);
+}
+
+static XlcConv
+open_mbstocts(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &conv_methods[MBSTOCTS]);
+}
+
+XLCd
+_XlcEucLoader(
+    const char *name)
+{
+    XLCd lcd;
+
+    lcd = _XlcCreateLC(name, _XlcGenericMethods);
+    if (lcd == NULL)
+       return lcd;
+
+    if (!XLC_PUBLIC_PART(lcd)->codeset ||
+       (_XlcNCompareISOLatin1(XLC_PUBLIC_PART(lcd)->codeset, "euc", 3))) {
+       _XlcDestroyLC(lcd);
+       return (XLCd) NULL;
+    }
+
+    initCTptr(lcd);
+
+    _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCharSet, open_mbstocs);
+    _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCharSet, open_wcstocs);
+    _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNMultiByte, open_cstombs);
+    _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNWideChar, open_cstowcs);
+    _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNChar, open_mbtocs);
+
+#ifndef FORCE_INDIRECT_CONVERTER
+    _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNMultiByte, open_ctstombs);
+    _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNWideChar, open_ctstowcs);
+    _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCompoundText, open_mbstocts);
+    _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNWideChar, open_mbstowcs);
+    _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCompoundText, open_wcstocts);
+    _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNMultiByte, open_wcstombs);
+#endif
+
+    _XlcAddUtf8Converters(lcd);
+
+    return lcd;
+}
+
+#else
+typedef int dummy;
+#endif /* X_LOCALE */
diff --git a/modules/lc/xlocale/lcJis.c b/modules/lc/xlocale/lcJis.c
new file mode 100644 (file)
index 0000000..551862d
--- /dev/null
@@ -0,0 +1,944 @@
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * 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 TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA 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.
+ *
+ * Author: Katsuhisa Yano      TOSHIBA Corp.
+ *                             mopi@osa.ilab.toshiba.co.jp
+ */
+
+/*
+ * A Japanese JIS locale.
+ * Supports: all locales with codeset JIS7.
+ * How: Provides converters for JIS.
+ * Platforms: Only those defining X_LOCALE (only Lynx, Linux-libc5, OS/2).
+ */
+
+#ifdef X_LOCALE
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XlcGeneric.h"
+#include <stdio.h>
+
+#if !defined(X_LOCALE)
+#define STDCVT
+#endif
+
+typedef struct _StateRec {
+    XLCd lcd;
+    XlcCharSet charset;
+    XlcCharSet GL_charset;
+    XlcCharSet GR_charset;
+} StateRec, *State;
+
+static void
+init_state(
+    XlcConv conv)
+{
+    State state = (State) conv->state;
+    XLCdGenericPart *gen = XLC_GENERIC_PART(state->lcd);
+    CodeSet codeset;
+
+    codeset = gen->initial_state_GL;
+    if (codeset && codeset->charset_list)
+       state->GL_charset = *codeset->charset_list;
+    codeset = gen->initial_state_GR;
+    if (codeset && codeset->charset_list)
+       state->GR_charset = *codeset->charset_list;
+
+    if (state->GL_charset == NULL)
+       if ((codeset = *gen->codeset_list) != NULL)
+           state->GL_charset = *codeset->charset_list;
+}
+
+static int
+compare(
+    const char *src,
+    const char *encoding,
+    int length)
+{
+    const char *start = src;
+
+    while (length-- > 0) {
+       if (*src++ != *encoding++)
+           return 0;
+       if (*encoding == '\0')
+           return src - start;
+    }
+
+    return 0;
+}
+
+static int
+mbtocs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    State state = (State) conv->state;
+    XLCd lcd = state->lcd;
+    const char *src;
+    char *dst;
+    unsigned char *mb_parse_table;
+    ParseInfo *parse_list, parse_info;
+    XlcCharSet charset;
+    int length, number, encoding_len = 0;
+    int i;
+
+    src = *((const char **) from);
+    dst = *((char **) to);
+
+    mb_parse_table = XLC_GENERIC(lcd, mb_parse_table);
+    if (mb_parse_table != NULL) {
+       number = mb_parse_table[(unsigned char) *src];
+       if (number > 0) {
+           parse_list = XLC_GENERIC(lcd, mb_parse_list) + number - 1;
+           for ( ; (parse_info = *parse_list) != NULL; parse_list++) {
+               encoding_len = compare(src, parse_info->encoding, *from_left);
+               if (encoding_len > 0) {
+                   switch (parse_info->type) {
+                       case E_SS:
+                           src += encoding_len;
+                           charset = *parse_info->codeset->charset_list;
+                           goto found;
+                       case E_LSL:
+                       case E_LSR:
+                           src += encoding_len;
+                           charset = *parse_info->codeset->charset_list;
+                           if (parse_info->type == E_LSL)
+                               state->GL_charset = charset;
+                           else
+                               state->GR_charset = charset;
+                           length = 0;
+                           goto end;
+                       case E_GL:
+                           charset = state->GL_charset;
+                           goto found;
+                       case E_GR:
+                           charset = state->GR_charset;
+                           goto found;
+                       default:
+                           break;
+                   }
+               }
+           }
+       }
+    }
+
+    if ((*src & 0x80) && state->GR_charset)
+       charset = state->GR_charset;
+    else
+       charset = state->GL_charset;
+
+found:
+    if (charset == NULL ||
+       (num_args == 2 && (XlcCharSet) args[1] != charset))
+       return -1;
+
+    length = charset->char_size;
+    if (length > *from_left - encoding_len)
+       return -1;
+
+    if (dst) {
+       if (length > *to_left)
+           return -1;
+       if (charset->side == XlcGL) {
+           for (i = 0; i < length; i++)
+               *dst++ = *src++ & 0x7f;
+       } else if (charset->side == XlcGR) {
+           for (i = 0; i < length; i++)
+               *dst++ = *src++ | 0x80;
+       } else {
+           for (i = 0; i < length; i++)
+               *dst++ = *src++;
+       }
+       *to = (XPointer) dst;
+       *to_left -= length;
+    }
+end:
+    *from = (XPointer) src;
+    *from_left -= encoding_len + length;
+    state->charset = charset;
+    if (num_args == 1)
+       *((XlcCharSet *) args[0]) = charset;
+
+    return 0;
+}
+
+static int
+mbstocs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    XlcCharSet charset = NULL;
+    XPointer tmp_args[2], save_from = *from;
+    int ret, unconv_num = 0, tmp_num = 1;
+
+    tmp_args[0] = (XPointer) &charset;
+
+    while (*from_left > 0 && *to_left > 0) {
+       ret = mbtocs(conv, from, from_left, to, to_left, tmp_args, tmp_num);
+       if (ret < 0)
+           break;
+       unconv_num += ret;
+       if (tmp_num == 1 && charset) {
+           tmp_args[1] = (XPointer) charset;
+           tmp_num = 2;
+       }
+    }
+
+    if (save_from == *from)
+       return -1;
+
+    if (num_args > 0)
+       *((XlcCharSet *) args[0]) = charset;
+
+    return unconv_num;
+}
+
+static CodeSet
+wc_parse_codeset(
+    XLCd lcd,
+    const wchar_t *wcstr)
+{
+    CodeSet *codeset;
+    unsigned long wc_encoding;
+    int num;
+
+    wc_encoding = *wcstr & XLC_GENERIC(lcd, wc_encode_mask);
+    num = XLC_GENERIC(lcd, codeset_num);
+    codeset = XLC_GENERIC(lcd, codeset_list);
+    while (num-- > 0) {
+       if (wc_encoding == (*codeset)->wc_encoding)
+           return *codeset;
+       codeset++;
+    }
+
+    return NULL;
+}
+
+static int
+wcstocs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    State state = (State) conv->state;
+    XLCd lcd = state->lcd;
+    const wchar_t *wcptr;
+    char *bufptr;
+    wchar_t wch;
+    char *tmpptr;
+    int length;
+    CodeSet codeset;
+    unsigned long wc_encoding;
+    int wcstr_len, buf_len;
+
+    if (from == NULL || *from == NULL)
+       return 0;
+
+    wcptr = *((const wchar_t **) from);
+    bufptr = *((char **) to);
+    wcstr_len = *from_left;
+    buf_len = *to_left;
+
+    codeset = wc_parse_codeset(lcd, wcptr);
+    if (codeset == NULL)
+       return -1;
+    wc_encoding = codeset->wc_encoding;
+
+    if (wcstr_len < buf_len / codeset->length)
+       buf_len = wcstr_len * codeset->length;
+
+    for ( ; wcstr_len > 0 && buf_len > 0; wcptr++, wcstr_len--) {
+       wch = *wcptr;
+       if ((wch & XLC_GENERIC(lcd, wc_encode_mask)) != wc_encoding)
+           break;
+       length = codeset->length;
+       buf_len -= length;
+       bufptr += length;
+
+       tmpptr = bufptr - 1;
+       if ((*codeset->charset_list)->side == XlcGL) {
+           while (length--) {
+               *tmpptr-- = (unsigned char) (wch & 0x7f);
+               wch >>= (wchar_t)XLC_GENERIC(lcd, wc_shift_bits);
+           }
+       } else if ((*codeset->charset_list)->side == XlcGR) {
+           while (length--) {
+               *tmpptr-- = (unsigned char) (wch | 0x80);
+               wch >>= (wchar_t)XLC_GENERIC(lcd, wc_shift_bits);
+           }
+       } else {
+           while (length--) {
+               *tmpptr-- = (unsigned char) wch;
+               wch >>= (wchar_t)XLC_GENERIC(lcd, wc_shift_bits);
+           }
+       }
+    }
+
+    if (num_args > 0)
+       *((XlcCharSet *) args[0]) = *codeset->charset_list;
+
+    *from_left -= wcptr - *((wchar_t **) from);
+    *from = (XPointer) wcptr;
+
+    *to_left -= bufptr - *((char **) to);
+    *to = bufptr;
+
+    return 0;
+}
+
+static CodeSet
+GetCodeSetFromCharSet(
+    XLCd lcd,
+    XlcCharSet charset)
+{
+    CodeSet *codeset = XLC_GENERIC(lcd, codeset_list);
+    XlcCharSet *charset_list;
+    int codeset_num, num_charsets;
+
+    codeset_num = XLC_GENERIC(lcd, codeset_num);
+
+    for ( ; codeset_num-- > 0; codeset++) {
+       num_charsets = (*codeset)->num_charsets;
+       charset_list = (*codeset)->charset_list;
+
+       for ( ; num_charsets-- > 0; charset_list++)
+           if (*charset_list == charset)
+               return *codeset;
+    }
+
+    return (CodeSet) NULL;
+}
+
+static int
+cstombs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    State state = (State) conv->state;
+    const char *csptr;
+    char *bufptr;
+    int csstr_len;
+    int buf_len;
+    int num, encoding_len = 0;
+    CodeSet codeset;
+    XlcCharSet charset;
+    EncodingType type;
+    int cvt_length;
+
+    csptr = *((const char **) from);
+    bufptr = *((char **) to);
+    csstr_len = *from_left;
+    buf_len = *to_left;
+
+    if (num_args < 1)
+       return -1;
+
+    charset = (XlcCharSet) args[0];
+
+    codeset = GetCodeSetFromCharSet(state->lcd, charset);
+    if (codeset == NULL)
+       return -1;
+
+    cvt_length = 0;
+    if (codeset->parse_info) {
+       switch (type = codeset->parse_info->type) {
+           case E_SS:
+               encoding_len = strlen(codeset->parse_info->encoding);
+               break;
+           case E_LSL:
+           case E_LSR:
+               if (type == E_LSL) {
+                   if (charset == state->GL_charset)
+                       break;
+               } else {
+                   if (charset == state->GR_charset)
+                       break;
+               }
+               encoding_len = strlen(codeset->parse_info->encoding);
+               if (encoding_len > buf_len)
+                   return -1;
+               cvt_length += encoding_len;
+               if (bufptr) {
+                   strcpy(bufptr, codeset->parse_info->encoding);
+                   bufptr += encoding_len;
+               }
+               buf_len -= encoding_len;
+               encoding_len = 0;
+               if (type == E_LSL)
+                   state->GL_charset = charset;
+               else
+                   state->GR_charset = charset;
+               break;
+           default:
+               break;
+       }
+    }
+
+    csstr_len /= codeset->length;
+    buf_len /= codeset->length + encoding_len;
+    if (csstr_len < buf_len)
+       buf_len = csstr_len;
+
+    cvt_length += buf_len * (encoding_len + codeset->length);
+    if (bufptr) {
+       while (buf_len--) {
+           if (encoding_len) {
+               strcpy(bufptr, codeset->parse_info->encoding);
+               bufptr += encoding_len;
+           }
+           num = codeset->length;
+           if (codeset->side == XlcGL) {
+               while (num--)
+                   *bufptr++ = *csptr++ & 0x7f;
+           } else if (codeset->side == XlcGR) {
+               while (num--)
+                   *bufptr++ = *csptr++ | 0x80;
+           } else {
+               while (num--)
+                   *bufptr++ = *csptr++;
+           }
+       }
+    }
+
+    *from_left -= csptr - *((char **) from);
+    *from = (XPointer) csptr;
+
+    if (bufptr)
+       *to = (XPointer) bufptr;
+    *to_left -= cvt_length;
+
+    return 0;
+}
+
+static int
+cstowcs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    State state = (State) conv->state;
+    XLCd lcd = state->lcd;
+    const char *csptr;
+    wchar_t *bufptr;
+    int csstr_len;
+    int buf_len;
+    wchar_t wch;
+    unsigned long code_mask, wc_encoding;
+    int num, length, wc_shift_bits;
+    CodeSet codeset;
+
+    csptr = *((const char **) from);
+    bufptr = *((wchar_t **) to);
+    csstr_len = *from_left;
+    buf_len = *to_left;
+
+    if (num_args < 1)
+       return -1;
+
+    codeset = GetCodeSetFromCharSet(lcd, (XlcCharSet) args[0]);
+    if (codeset == NULL)
+       return -1;
+
+    length = codeset->length;
+    csstr_len /= length;
+    if (csstr_len < buf_len)
+       buf_len = csstr_len;
+
+    code_mask = ~XLC_GENERIC(lcd, wc_encode_mask);
+    wc_encoding = codeset->wc_encoding;
+    wc_shift_bits = XLC_GENERIC(lcd, wc_shift_bits);
+
+    *to_left -= buf_len;
+
+    if (bufptr) {
+       while (buf_len--) {
+           wch = (wchar_t) (*csptr++ & 0x7f);
+           num = length - 1;
+           while (num--)
+               wch = (wch << wc_shift_bits) | (*csptr++ & 0x7f);
+
+           *bufptr++ = (wch & code_mask) | wc_encoding;
+       }
+    }
+
+    *from_left -= csptr - *((char **) from);
+    *from = (XPointer) csptr;
+
+    if (bufptr)
+       *to = (XPointer) bufptr;
+
+    return 0;
+}
+
+
+static void
+close_converter(
+    XlcConv conv)
+{
+    if (conv->state) {
+       Xfree((char *) conv->state);
+    }
+
+    Xfree((char *) conv);
+}
+
+static XlcConv
+create_conv(
+    XLCd lcd,
+    XlcConvMethods methods)
+{
+    XlcConv conv;
+    State state;
+
+    conv = (XlcConv) Xmalloc(sizeof(XlcConvRec));
+    if (conv == NULL)
+       return (XlcConv) NULL;
+
+    conv->methods = (XlcConvMethods) Xmalloc(sizeof(XlcConvMethodsRec));
+    if (conv->methods == NULL)
+       goto err;
+    *conv->methods = *methods;
+    if (XLC_PUBLIC(lcd, is_state_depend))
+       conv->methods->reset = init_state;
+
+    conv->state = Xcalloc(1, sizeof(StateRec));
+    if (conv->state == NULL)
+       goto err;
+
+    state = (State) conv->state;
+    state->lcd = lcd;
+    init_state(conv);
+
+    return conv;
+
+err:
+    close_converter(conv);
+
+    return (XlcConv) NULL;
+}
+
+static XlcConvMethodsRec mbstocs_methods = {
+    close_converter,
+    mbstocs,
+    NULL
+};
+
+static XlcConv
+open_mbstocs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &mbstocs_methods);
+}
+
+static XlcConvMethodsRec wcstocs_methods = {
+    close_converter,
+    wcstocs,
+    NULL
+};
+
+static XlcConv
+open_wcstocs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &wcstocs_methods);
+}
+
+static XlcConvMethodsRec mbtocs_methods = {
+    close_converter,
+    mbtocs,
+    NULL
+};
+
+static XlcConv
+open_mbtocs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &mbtocs_methods);
+}
+
+static XlcConvMethodsRec cstombs_methods = {
+    close_converter,
+    cstombs,
+    NULL
+};
+
+static XlcConv
+open_cstombs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &cstombs_methods);
+}
+
+static XlcConvMethodsRec cstowcs_methods = {
+    close_converter,
+    cstowcs,
+    NULL
+};
+
+static XlcConv
+open_cstowcs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &cstowcs_methods);
+}
+
+#ifdef STDCVT
+static int
+stdc_mbstowcs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    const char *src = *((const char **) from);
+    wchar_t *dst = *((wchar_t **) to);
+    int src_left = *from_left;
+    int dst_left = *to_left;
+    int length;
+
+    while (src_left > 0 && dst_left > 0) {
+       length = mbtowc(dst, src, src_left);
+       if (length < 0)
+           break;
+
+       src += length;
+       src_left -= length;
+       if (dst)
+           dst++;
+       dst_left--;
+
+       if (length == 0) {
+           src++;
+           src_left--;
+           break;
+       }
+    }
+
+    if (*from_left == src_left)
+       return -1;
+
+    *from = (XPointer) src;
+    if (dst)
+       *to = (XPointer) dst;
+    *from_left = src_left;
+    *to_left = dst_left;
+
+    return 0;
+}
+
+static int
+stdc_wcstombs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    const wchar_t *src = *((const wchar_t **) from);
+    char *dst = *((char **) to);
+    int src_left = *from_left;
+    int dst_left = *to_left;
+    int length;
+
+    while (src_left > 0 && dst_left > 0) {
+       length = wctomb(dst, *src);             /* XXX */
+       if (length < 0 || dst_left < length)
+           break;
+
+       src++;
+       src_left--;
+       dst += length;
+       dst_left -= length;
+
+       if (length == 0) {
+           dst++;
+           dst_left--;
+           break;
+       }
+    }
+
+    if (*from_left == src_left)
+       return -1;
+
+    *from = (XPointer) src;
+    *to = (XPointer) dst;
+    *from_left = src_left;
+    *to_left = dst_left;
+
+    return 0;
+}
+
+static int
+stdc_wcstocs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    const wchar_t *src = *((const wchar_t **) from);
+    wchar_t wch;
+    XlcCharSet charset = NULL;
+    XPointer tmp_args[2], tmp_from, save_from = *from;
+    char tmp[32];
+    int length, ret, src_left = *from_left;
+    int unconv_num = 0, tmp_num = 1;
+
+    tmp_args[0] = (XPointer) &charset;
+
+    while (src_left > 0 && *to_left > 0) {
+       if (wch = *src) {
+           length = wctomb(tmp, wch);
+       } else {
+           length = 1;
+           *tmp = '\0';
+       }
+
+       if (length < 0)
+           break;
+
+       tmp_from = (XPointer) tmp;
+       ret = mbtocs(conv, &tmp_from, &length, to, to_left, tmp_args, tmp_num);
+       if (ret < 0)
+           break;
+       unconv_num += ret;
+       if (tmp_num == 1 && charset) {
+           tmp_args[1] = (XPointer) charset;
+           tmp_num = 2;
+       }
+
+       src++;
+       src_left--;
+    }
+
+    if (save_from == (XPointer) src)
+       return -1;
+
+    *from = (XPointer) src;
+    *from_left = src_left;
+
+    if (num_args > 0)
+       *((XlcCharSet *) args[0]) = charset;
+
+    return unconv_num;
+}
+
+#define DefineLocalBuf         char local_buf[BUFSIZ]
+#define AllocLocalBuf(length)  (length > BUFSIZ ? (char*) Xmalloc(length) : local_buf)
+#define FreeLocalBuf(ptr)      if (ptr != local_buf) Xfree(ptr)
+
+static int
+stdc_cstowcs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    XLCd lcd = ((State) conv->state)->lcd;
+    DefineLocalBuf;
+    XPointer buf, save_buf;
+    int length, left, ret;
+
+    left = length = *to_left * XLC_PUBLIC(lcd, mb_cur_max);
+    buf = save_buf = (XPointer) AllocLocalBuf(length);
+    if (buf == NULL)
+       return -1;
+
+    ret = cstombs(conv, from, from_left, &buf, &left, args, num_args);
+    if (ret < 0)
+       goto err;
+
+    buf = save_buf;
+    length -= left;
+    if (stdc_mbstowcs(conv, &buf, &length, to, to_left, args, num_args) < 0)
+       ret = -1;
+
+err:
+    FreeLocalBuf(save_buf);
+
+    return ret;
+}
+
+static XlcConvMethodsRec stdc_mbstowcs_methods = {
+    close_converter,
+    stdc_mbstowcs,
+    NULL
+};
+
+static XlcConv
+open_stdc_mbstowcs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &stdc_mbstowcs_methods);
+}
+
+static XlcConvMethodsRec stdc_wcstombs_methods = {
+    close_converter,
+    stdc_wcstombs,
+    NULL
+};
+
+static XlcConv
+open_stdc_wcstombs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &stdc_wcstombs_methods);
+}
+
+static XlcConvMethodsRec stdc_wcstocs_methods = {
+    close_converter,
+    stdc_wcstocs,
+    NULL
+};
+
+static XlcConv
+open_stdc_wcstocs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &stdc_wcstocs_methods);
+}
+
+static XlcConvMethodsRec stdc_cstowcs_methods = {
+    close_converter,
+    stdc_cstowcs,
+    NULL
+};
+
+static XlcConv
+open_stdc_cstowcs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &stdc_cstowcs_methods);
+}
+#endif /* STDCVT */
+
+XLCd
+_XlcJisLoader(
+    const char *name)
+{
+    XLCd lcd;
+#ifdef STDCVT
+    XLCdGenericPart *gen;
+#endif
+
+    lcd = _XlcCreateLC(name, _XlcGenericMethods);
+    if (lcd == NULL)
+       return lcd;
+
+    if (!XLC_PUBLIC_PART(lcd)->codeset ||
+       (_XlcCompareISOLatin1(XLC_PUBLIC_PART(lcd)->codeset, "JIS7"))) {
+        _XlcDestroyLC(lcd);
+        return (XLCd) NULL;
+    }
+
+    _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNChar, open_mbtocs);
+    _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCharSet, open_mbstocs);
+    _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNMultiByte, open_cstombs);
+
+#ifdef STDCVT
+    gen = XLC_GENERIC_PART(lcd);
+
+    if (gen->use_stdc_env == True) {
+       _XlcSetConverter(lcd,XlcNMultiByte,lcd,XlcNWideChar,open_stdc_mbstowcs);
+       _XlcSetConverter(lcd,XlcNWideChar,lcd,XlcNMultiByte,open_stdc_wcstombs);
+    }
+    if (gen->force_convert_to_mb == True) {
+       _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCharSet,open_stdc_wcstocs);
+       _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNWideChar,open_stdc_cstowcs);
+    } else {
+#endif
+    _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCharSet, open_wcstocs);
+    _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNWideChar, open_cstowcs);
+#ifdef STDCVT
+    }
+#endif
+
+    _XlcAddUtf8Converters(lcd);
+
+    return lcd;
+}
+
+#else
+typedef int dummy;
+#endif /* X_LOCALE */
diff --git a/modules/lc/xlocale/lcSjis.c b/modules/lc/xlocale/lcSjis.c
new file mode 100644 (file)
index 0000000..74dd033
--- /dev/null
@@ -0,0 +1,1612 @@
+/****************************************************************
+
+        Copyright 1992, 1993 by FUJITSU LIMITED
+        Copyright 1993 by Fujitsu Open Systems Solutions, Inc.
+       Copyright 1994 by Sony Corporation
+
+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 FUJITSU LIMITED,
+Fujitsu Open Systems Solutions, Inc. and Sony Corporation  not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+FUJITSU LIMITED, Fujitsu Open Systems Solutions, Inc. and
+Sony Corporation make no representations about the suitability of
+this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+
+FUJITSU LIMITED, FUJITSU OPEN SYSTEMS SOLUTIONS, INC. AND SONY
+CORPORATION DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
+IN NO EVENT SHALL FUJITSU OPEN SYSTEMS SOLUTIONS, INC., FUJITSU LIMITED
+AND SONY CORPORATION 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.
+
+    Authors: Jeffrey Bloomfield                (jeffb@ossi.com)
+            Shigeru Yamada             (yamada@ossi.com)
+             Yoshiyuki Segawa          (segawa@ossi.com)
+    Modifier:Makoto Wakamatsu   Sony Corporation
+                               makoto@sm.sony.co.jp
+
+*****************************************************************/
+
+/*
+ * A Japanese SJIS locale.
+ * Supports: all locales with codeset SJIS.
+ * How: Provides converters for SJIS.
+ * Platforms: Only those defining X_LOCALE (only Lynx, Linux-libc5, OS/2).
+ */
+
+#ifdef X_LOCALE
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XlcGeneric.h"
+
+#include <ctype.h>
+#ifdef WIN32
+#define isascii __isascii
+#endif
+
+#define CS0    codesets[0]             /* Codeset 0 - 7-bit ASCII      */
+#define CS1    codesets[1]             /* Codeset 1 - Kanji            */
+#define CS2    codesets[2]             /* Codeset 2 - Half-Kana        */
+#define CS3    codesets[3]             /* Codeset 3 - User defined     */
+
+#define ascii          (codeset->cs_num == 0)
+#define kanji          (codeset->cs_num == 1)
+#define kana           (codeset->cs_num == 2)
+#define userdef                (codeset->cs_num == 3)
+
+#define        ASCII_CODESET   0
+#define KANJI_CODESET  1
+#define KANA_CODESET   2
+#define USERDEF_CODESET        3
+#define MAX_CODESETS   4
+
+#define GR     0x80    /* begins right-side (non-ascii) region */
+#define GL     0x7f    /* ends left-side (ascii) region        */
+
+#define isleftside(c)  (((c) & GR) ? 0 : 1)
+#define isrightside(c) (!isleftside(c))
+
+typedef unsigned char   Uchar;
+typedef unsigned long  Ulong;
+typedef unsigned int   Uint;
+
+/* Acceptable range for 2nd byte of SJIS multibyte char */
+#define VALID_MULTIBYTE(c) \
+                       ((0x40<=((Uchar)c) && ((Uchar)c)<=0x7e) \
+                       || (0x80<=((Uchar)c) && ((Uchar)c)<=0xfc))
+
+#ifndef iskanji
+#define iskanji(c)     ((0x81<=((Uchar)c) && ((Uchar)c)<=0x9f) \
+                       || (0xe0<=((Uchar)c) && ((Uchar)c)<=0xef))
+#endif /* !iskanji */
+
+#ifndef iskana
+#define iskana(c)      (0xa1<=((Uchar)c) && ((Uchar)c)<=0xdf)
+#endif /* !iskana */
+
+#define        isuserdef(c)    (0xf0<=((Uchar)c) && ((Uchar)c)<=0xfc)
+
+#define BIT8OFF(c)     ((c) & GL)
+#define BIT8ON(c)      ((c) | GR)
+
+
+static void jis_to_sjis (Uchar *p1, Uchar *p2);
+static void sjis_to_jis (Uchar *p1, Uchar *p2);
+static CodeSet wc_codeset (XLCd lcd, wchar_t wch);
+
+
+/*
+ * Notes:
+ * 1.  16-bit widechar format is limited to 14 data bits.  Since the 2nd byte
+ *     of SJIS multibyte chars are in the ranges of 0x40 - 7E and 0x80 - 0xFC,
+ *     SJIS cannot map directly into 16 bit widechar format within the confines
+ *     of a single codeset.  Therefore, for SJIS widechar conversion, SJIS Kanji
+ *     is mapped into the JIS codeset.  (The algorithms used in jis_to_sjis()
+ *     and sjis_to_jis() are from Ken Lunde (lunde@mv.us.adobe.com) and are in
+ *     the public domain.)
+ * 2.  Defining FORCE_INDIRECT_CONVERTER (see _XlcEucLoader())
+ *     forces indirect (charset) conversions (e.g. wcstocs()<->cstombs()).
+ * 3.  Using direct converters (e.g. mbstowcs()) decreases conversion
+ *     times by 20-40% (depends on specific converter used).
+ */
+
+
+static int
+sjis_mbstowcs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+
+    XLCd lcd = (XLCd)conv->state;
+
+    int chr_len = 0;
+    int shift_mult = 0;
+    Uint chrcode = 0;
+
+    Uchar ch, ch2;
+    Uint wc_encode = 0;
+    Uint wc_tmp = 0;
+
+    Bool new_char;
+
+    int firstbyte;
+    int length = 0;
+    int num_conv;
+    int unconv_num = 0;
+
+    const char *inbufptr = *from;
+    wchar_t *outbufptr = (wchar_t *) *to;
+    wchar_t *outbuf_base = outbufptr;
+
+    CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
+    int codeset_num = XLC_GENERIC(lcd, codeset_num);
+    Ulong wc_shift = XLC_GENERIC(lcd, wc_shift_bits);
+
+    if (*from_left > *to_left)
+       *from_left = *to_left;
+
+     for (new_char = True, firstbyte = True; *from_left > 0; (*from_left)--) {
+
+       ch = *inbufptr++;
+
+       if (firstbyte) {
+           if (ASCII_CODESET >= codeset_num) {
+               unconv_num++;
+               (*from_left)--;
+               continue;
+           }
+           if (isascii(ch)) {
+               length = CS0->length;
+               *outbufptr++ = (wchar_t)ch;
+               continue;
+           }
+           else if (iskanji(ch)) {
+               if (KANJI_CODESET >= codeset_num) {
+                   unconv_num++;
+                   (*from_left)--;
+                   continue;
+               }
+               firstbyte = False;
+               length = CS1->length;
+               if (*from_left < length || *to_left < length)
+                   return -1;
+               wc_encode = CS1->wc_encoding;
+               ch2 = *inbufptr;
+               sjis_to_jis(&ch, &ch2);
+               chrcode = ch;
+           }
+           else if (iskana(ch)) {
+               if (KANA_CODESET >= codeset_num) {
+                   unconv_num++;
+                   (*from_left)--;
+                   continue;
+               }
+               length = CS2->length;
+               wc_encode = CS2->wc_encoding;
+               chrcode = BIT8OFF(ch);
+           }
+           else if (isuserdef(ch)) {
+               if (USERDEF_CODESET >= codeset_num) {
+                   unconv_num++;
+                   (*from_left)--;
+                   continue;
+               }
+               firstbyte = False;
+               length = CS3->length;
+               if (*from_left < length || *to_left < length)
+                   return -1;
+               wc_encode = CS3->wc_encoding;
+               ch2 = *inbufptr;
+               sjis_to_jis(&ch, &ch2);
+               chrcode = ch;
+           }
+           else /* unknown */ {
+               unconv_num++;
+               (*from_left)--;
+               continue;
+           }
+       } else {                        /* 2nd byte of multibyte char */
+           if (!VALID_MULTIBYTE((Uchar) *(inbufptr-1))) {
+               unconv_num++;
+               firstbyte = True;
+           }
+           chrcode = ch2;
+       }
+
+       if (new_char) {
+           chr_len = length;
+           shift_mult = length - 1;
+           new_char = False;
+       }
+
+       chrcode <<= (wc_shift * shift_mult);
+       shift_mult--;
+       wc_tmp |= chrcode;
+       if (--chr_len == 0) {
+           wc_tmp |= wc_encode;
+           *outbufptr++ = wc_tmp;
+
+           firstbyte = True;
+           new_char = True;
+           wc_tmp = (Uint)0;
+       }
+
+    } /* end for */
+
+    *to = (XPointer)outbufptr;
+
+    if ((num_conv = outbufptr - outbuf_base) > 0)
+       (*to_left) -= num_conv;
+
+    return unconv_num;
+}
+
+
+#define byte1          (length == codeset->length - 1)
+#define byte2          (byte1 == 0)
+
+static int
+sjis_wcstombs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    const wchar_t *inbufptr = (const wchar_t *) *from;
+    XPointer outbufptr = *to;
+    XPointer outbuf_base = outbufptr;
+    wchar_t  wch;
+    int length;
+    Uchar tmp;
+    Uchar t1, t2;
+    int num_conv;
+    int unconv_num = 0;
+
+    XLCd lcd = (XLCd)conv->state;
+    CodeSet codeset;
+    Ulong wc_shift = XLC_GENERIC(lcd, wc_shift_bits);
+
+    if (*from_left > *to_left)
+       *from_left = *to_left;
+
+    for (; *from_left > 0 ; (*from_left)-- ) {
+
+       wch = *inbufptr++;
+
+       if (!(codeset = wc_codeset(lcd, wch))) {
+           unconv_num++;
+           (*from_left)--;
+           continue;
+       }
+
+       length = codeset->length;
+       wch ^= (wchar_t)codeset->wc_encoding;
+
+       do {
+           length--;
+           tmp = wch>>(wchar_t)( (Ulong)length * wc_shift);
+
+           if (kana)
+               tmp = BIT8ON(tmp);
+
+           else if (byte1 && (kanji || userdef)) {
+               t1 = BIT8OFF(tmp);
+               continue;
+           }
+
+           else if (byte2 && (kanji || userdef)) {
+               t2 = BIT8OFF(tmp);
+               jis_to_sjis(&t1, &t2);
+               *outbufptr++ = (char)t1;
+               tmp = t2;
+           }
+
+           *outbufptr++ = (char)tmp;
+       } while (length);
+
+    }  /* end for */
+
+    *to = (XPointer)outbufptr;
+
+    if ((num_conv = (int)(outbufptr - outbuf_base)) > 0)
+       (*to_left) -= num_conv;
+
+    return unconv_num;
+}
+#undef byte1
+#undef byte2
+
+/*
+ * sjis<->jis conversion for widechar kanji (See Note at top of file)
+ */
+static void
+sjis_to_jis(
+    Uchar *p1,
+    Uchar *p2)
+{
+  Uchar c1 = *p1;
+  Uchar c2 = *p2;
+  Uchar adjust = c2 < 0x9f;
+  Uchar rowOffset = c1 < 0xa0 ? 0x70 : 0xb0;
+  Uchar cellOffset = adjust ? (0x1f + (c2 > 0x7f)) : 0x7e;
+
+  *p1 = ((c1 - rowOffset) << 1) - adjust;
+  *p2 -= cellOffset;
+}
+
+static void
+jis_to_sjis(
+    Uchar *p1,
+    Uchar *p2)
+{
+  Uchar c1 = *p1;
+  Uchar c2 = *p2;
+  Uchar rowOffset = c1 < 0x5f ? 0x70 : 0xb0;
+  Uchar cellOffset = c1 % 2 ? 0x1f + (c2 > 0x5f) : 0x7e;
+
+  *p1 = ((Uchar)(c1 + 1) >> 1) + rowOffset;
+  *p2 = c2 + cellOffset;
+}
+
+static CodeSet
+wc_codeset(
+    XLCd lcd,
+    wchar_t wch)
+{
+    CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
+#if !defined(__sony_news)  ||  defined(SVR4)
+    int end = XLC_GENERIC(lcd, codeset_num);
+    Ulong widech = (Ulong)(wch & XLC_GENERIC(lcd, wc_encode_mask));
+
+    for (; --end >= 0; codesets++)
+       if ( widech == (*codesets)->wc_encoding )
+           return *codesets;
+
+    return NULL;
+#else
+    if( iskanji(wch >> 8) )
+       return( codesets[1] );
+    if( iskana(wch & 0xff) )
+       return( codesets[2] );
+    return( codesets[0] );
+#endif
+}
+
+
+static int
+sjis_mbtocs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    XLCd lcd = (XLCd)conv->state;
+    XlcCharSet charset = NULL;
+    int char_size = 0;
+    int unconv_num = 0;
+    const char *src = *from;
+    char *dst = *to;
+    CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
+    int codeset_num = XLC_GENERIC(lcd, codeset_num);
+
+    if (iskanji(*src)) {
+       if (KANJI_CODESET >= codeset_num)
+           return -1;
+       charset = *CS1->charset_list;
+       char_size = charset->char_size;
+
+       if (*from_left >= char_size && *to_left >= char_size) {
+           *dst++ = *src++;
+           *dst++ = *src++;
+           if (!VALID_MULTIBYTE((Uchar) *(src-1))) /* check 2nd byte */
+               unconv_num++;
+           sjis_to_jis((Uchar *)(dst-2), (Uchar *)(dst-1));
+       } else
+           return -1;
+    }
+    else if (isuserdef(*src)) {
+       if (USERDEF_CODESET >= codeset_num)
+           return -1;
+       charset = *CS3->charset_list;
+       char_size = charset->char_size;
+
+       if (*from_left >= char_size && *to_left >= char_size) {
+           *dst++ = *src++;
+           *dst++ = *src++;
+           if (!VALID_MULTIBYTE((Uchar) *(src-1))) /* check 2nd byte */
+               unconv_num++;
+           sjis_to_jis((Uchar *)(dst-2), (Uchar *)(dst-1));
+       } else
+           return -1;
+    }
+    else if (isascii(*src)) {
+       if (ASCII_CODESET >= codeset_num)
+           return -1;
+       charset = *CS0->charset_list;
+       char_size = charset->char_size;
+
+       if (*from_left >= char_size && *to_left >= char_size)
+           *dst++ = *src++;
+       else
+           return -1;
+    }
+    else if (iskana(*src)) {
+       if (KANA_CODESET >= codeset_num)
+           return  -1;
+       charset = *CS2->charset_list;
+       char_size = charset->char_size;
+
+       if (*from_left >= char_size && *to_left >= char_size)
+           *dst++ = *src++;
+       else
+          return -1;
+    }
+    else       /* unknown */
+       return -1;
+
+    *from_left -= char_size;
+    *to_left -= char_size;
+
+    *to = (XPointer) dst;
+    *from = (XPointer) src;
+
+    if (num_args > 0)
+       *((XlcCharSet *) args[0]) = charset;
+
+    return unconv_num;
+}
+
+
+static int
+sjis_mbstocs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    const char *tmp_from;
+    char *tmp_to;
+    int tmp_from_left, tmp_to_left;
+    XlcCharSet charset, tmp_charset;
+    XPointer tmp_args[1];
+    int unconv_num = 0, ret;
+
+/* Determine the charset of the segment and convert one character: */
+
+    tmp_args[0] = (XPointer) &charset; /* charset from sjis_mbtocs() */
+    while
+      ((ret = sjis_mbtocs(conv, from, from_left, to, to_left, tmp_args, 1)) > 0)
+       unconv_num += ret;
+    if ( ret < 0 )
+       return ret;
+
+    tmp_from = *from;
+    tmp_from_left = *from_left;
+    tmp_to_left = *to_left;
+    tmp_to = *to;
+
+/* Convert remainder of the segment: */
+
+    tmp_args[0] = (XPointer) &tmp_charset;
+    while( (ret = sjis_mbtocs(conv, (XPointer *) &tmp_from, &tmp_from_left,
+                    (XPointer *) &tmp_to, &tmp_to_left, tmp_args, 1)) >= 0 ) {
+
+       if (ret > 0) {
+           unconv_num += ret;
+           continue;
+       }
+
+       if (tmp_charset != charset)  /* quit on end of segment */
+           break;
+
+       *from = (XPointer) tmp_from;
+       *from_left = tmp_from_left;
+       *to = (XPointer) tmp_to;
+       *to_left = tmp_to_left;
+    }
+
+    if (num_args > 0)
+       *((XlcCharSet *) args[0]) = charset;
+
+    return unconv_num;
+}
+
+static int
+sjis_wcstocs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    XLCd lcd = (XLCd) conv->state;
+    const wchar_t *wcptr = *((const wchar_t **)from);
+    char *bufptr = *((char **) to);
+    wchar_t wch;
+    char *tmpptr;
+    int length;
+    CodeSet codeset;
+    Ulong wc_encoding;
+    int buf_len = *to_left;
+    int wcstr_len = *from_left;
+
+    if (!(codeset = wc_codeset(lcd, *wcptr)))
+       return -1;
+
+    if (wcstr_len < buf_len / codeset->length)
+       buf_len = wcstr_len * codeset->length;
+
+#if !defined(__sony_news)  ||  defined(SVR4)
+    wc_encoding = codeset->wc_encoding;
+
+    for ( ; wcstr_len > 0 && buf_len > 0; wcptr++, wcstr_len--) {
+       wch = *wcptr;
+
+       if ((wch & XLC_GENERIC(lcd, wc_encode_mask)) != wc_encoding)
+           break;
+
+       length = codeset->length;
+
+       buf_len -= length;
+       bufptr += length;
+       tmpptr = bufptr - 1;
+
+       while (length--) {
+           *tmpptr-- = kana ? BIT8ON(wch) : BIT8OFF(wch);
+           wch >>= (wchar_t)XLC_GENERIC(lcd, wc_shift_bits);
+       }
+    }
+#else
+    length = codeset->length;
+    for( ; wcstr_len > 0  &&  buf_len > 0; wcptr++, wcstr_len-- ) {
+       wch = *wcptr;
+       if( codeset != wc_codeset( lcd, wch ) )
+           break;
+
+       buf_len -= length;
+       if( length == 2 ) {
+           unsigned short      code;
+
+           code = sjis2jis( wch & 0xffff );
+           *bufptr++ = code >> 8;
+           *bufptr++ = code & 0xff;
+       }
+       else
+           *bufptr++ = wch & 0xff;
+    }
+#endif
+
+    if (num_args > 0)
+       *((XlcCharSet *) args[0]) = *codeset->charset_list;
+
+    *from_left -= wcptr - (wchar_t *) *from;
+    *from = (XPointer) wcptr;
+
+    *to_left -= bufptr - *to;
+    *to = bufptr;
+
+    return 0;
+}
+
+static CodeSet
+GetCodeSetFromCharSet(
+    XLCd lcd,
+    XlcCharSet charset)
+{
+    CodeSet *codeset = XLC_GENERIC(lcd, codeset_list);
+    XlcCharSet *charset_list;
+    int codeset_num, num_charsets;
+
+    codeset_num = XLC_GENERIC(lcd, codeset_num);
+
+    for ( ; codeset_num-- > 0; codeset++) {
+       num_charsets = (*codeset)->num_charsets;
+       charset_list = (*codeset)->charset_list;
+
+       for ( ; num_charsets-- > 0; charset_list++)
+           if (*charset_list == charset)
+               return *codeset;
+    }
+
+    return (CodeSet) NULL;
+}
+
+
+static int
+sjis_cstombs(
+    XlcConv conv,
+    char **from,
+    int *from_left,
+    char **to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    XLCd lcd = (XLCd) conv->state;
+    const char *csptr = *from;
+    char *bufptr = *to;
+    int csstr_len = *from_left;
+    int buf_len = *to_left;
+    int length;
+    CodeSet codeset;
+    int cvt_length = 0;
+
+    if (num_args < 1)
+       return -1;
+
+    if (!(codeset = GetCodeSetFromCharSet(lcd, (XlcCharSet) args[0])))
+       return -1;
+
+    csstr_len /= codeset->length;
+    buf_len /= codeset->length;
+    if (csstr_len < buf_len)
+       buf_len = csstr_len;
+
+    cvt_length += buf_len * codeset->length;
+
+    if (bufptr) {
+       while (buf_len--) {
+           length = codeset->length;
+           while (length--)
+               *bufptr++ = codeset->length == 1 && codeset->side == XlcGR ?
+                 BIT8ON(*csptr++) : BIT8OFF(*csptr++);
+
+           if (codeset->length == 2)
+               jis_to_sjis((Uchar *)(bufptr-2), (Uchar *)(bufptr-1));
+       }
+    }
+
+    *from_left -= csptr - *from;
+    *from = (XPointer) csptr;
+
+    if (bufptr)
+       *to += cvt_length;
+    *to_left -= cvt_length;
+
+
+    return 0;
+}
+
+static int
+sjis_cstowcs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    XLCd lcd = (XLCd) conv->state;
+    const char *csptr = (const char *) *from;
+    wchar_t *bufptr = (wchar_t *) *to;
+    wchar_t *toptr = (wchar_t *) *to;
+    int csstr_len = *from_left;
+    int buf_len = *to_left;
+    wchar_t wch;
+    int length;
+    Ulong wc_shift_bits = (int)XLC_GENERIC(lcd, wc_shift_bits);
+    CodeSet codeset;
+
+    if (num_args < 1)
+       return -1;
+
+    if (!(codeset = GetCodeSetFromCharSet(lcd, (XlcCharSet) args[0])))
+       return -1;
+
+    csstr_len /= codeset->length;
+    if (csstr_len < buf_len)
+       buf_len = csstr_len;
+
+    *to_left -= buf_len;
+
+    if (bufptr) {
+
+       toptr += buf_len;
+       *to = (XPointer) toptr;
+
+       while (buf_len--) {
+           wch = (wchar_t) BIT8OFF(*csptr);
+           csptr++;
+
+           length = codeset->length - 1;
+           while (length--) {
+               wch = (wch << wc_shift_bits) | BIT8OFF(*csptr);
+               csptr++;
+           }
+           *bufptr++ = wch | codeset->wc_encoding;
+       }
+    }
+
+    *from_left -= csptr - *from;
+    *from = (XPointer) csptr;
+
+    return 0;
+}
+
+
+/*
+ *    Stripped down Direct CT converters for SJIS
+ *
+ */
+
+#define BADCHAR(min_ch, c)  (BIT8OFF(c) < (char)min_ch && BIT8OFF(c) != 0x0 && \
+                            BIT8OFF(c) != '\t' && BIT8OFF(c) != '\n' && \
+                            BIT8OFF(c) != 0x1b)
+
+typedef struct _CTDataRec {
+    int side;
+    int length;
+    char *name;
+    Ulong wc_encoding;
+    char *ct_encoding;
+    int ct_encoding_len;
+    int set_size;
+    Uchar min_ch;
+    Uchar ct_type;
+} CTDataRec, *CTData;
+
+typedef struct _StateRec {
+    CTData GL_charset;
+    CTData GR_charset;
+    CTData charset;
+} StateRec, *State;
+
+#define CT_STD  0
+#define CT_NSTD 1
+#define CT_DIR  2
+#define CT_EXT0 3
+#define CT_EXT1 4
+#define CT_EXT2 5
+#define CT_VER  6
+
+static CTDataRec ctdata[] =
+{
+    { XlcGL,      1, "ISO8859-1:GL",       0, "\033(B"   ,  3, 0, 0, CT_STD  },
+    { XlcGR,      1, "ISO8859-1:GR",       0, "\033-A"   ,  3, 0, 0, CT_STD  },
+    { XlcGL,      1, "JISX0201.1976-0:GL", 0, "\033(J"   ,  3, 0, 0, CT_STD  },
+    { XlcGR,      1, "JISX0201.1976-0:GR", 0, "\033)I"   ,  3, 0, 0, CT_STD  },
+    { XlcGL,      2, "JISX0208.1983-0:GL", 0, "\033$(B"  ,  4, 0, 0, CT_STD  },
+    { XlcGR,      2, "JISX0208.1983-0:GR", 0, "\033$)B"  ,  4, 0, 0, CT_STD  },
+    { XlcGL,      2, "JISX0212.1990-0:GL", 0, "\033$(D"  ,  4, 0, 0, CT_STD  },
+    { XlcGR,      2, "JISX0212.1990-0:GR", 0, "\033$)D"  ,  4, 0, 0, CT_STD  },
+    { XlcUnknown, 0, "Ignore-Ext-Status?", 0, "\033#"    ,  2, 0, 0, CT_VER  },
+    { XlcUnknown, 0, "NonStd-?-OctetChar", 0, "\033%/0"  ,  4, 0, 0, CT_NSTD },
+    { XlcUnknown, 1, "NonStd-1-OctetChar", 0, "\033%/1"  ,  4, 0, 0, CT_NSTD },
+    { XlcUnknown, 2, "NonStd-2-OctetChar", 0, "\033%/2"  ,  4, 0, 0, CT_NSTD },
+    { XlcUnknown, 3, "NonStd-3-OctetChar", 0, "\033%/3"  ,  4, 0, 0, CT_NSTD },
+    { XlcUnknown, 4, "NonStd-4-OctetChar", 0, "\033%/4"  ,  4, 0, 0, CT_NSTD },
+    { XlcUnknown, 0, "Extension-2"       , 0, "\033%/"   ,  3, 0, 0, CT_EXT2 },
+    { XlcUnknown, 0, "Extension-0"       , 0, "\033"     ,  1, 0, 0, CT_EXT0 },
+    { XlcUnknown, 0, "Begin-L-to-R-Text",  0, "\2331]"   ,  3, 0, 0, CT_DIR  },
+    { XlcUnknown, 0, "Begin-R-to-L-Text",  0, "\2332]"   ,  3, 0, 0, CT_DIR  },
+    { XlcUnknown, 0, "End-Of-String",      0, "\233]"    ,  2, 0, 0, CT_DIR  },
+    { XlcUnknown, 0, "Extension-1"       , 0, "\233"     ,  1, 0, 0, CT_EXT1 },
+};
+
+/* Note on above table:  sjis_ctstombs() and sjis_ctstowcs() parser depends on
+ * certain table entries occuring in decreasing string length--
+ *   1.  CT_EXT2 and CT_EXT0 entries must occur after CT_NSTD entries.
+ *   2.  CT_DIR and CT_EXT1 entries must occur after CT_DIR entries.
+ */
+
+static CTData ctdptr[sizeof(ctdata) / sizeof(CTDataRec)];
+static CTData ctd_endp = ctdata + ((sizeof(ctdata) / sizeof(CTDataRec))) - 1;
+
+#define Ascii   0
+#define Kanji   1
+#define Kana    2
+#define Userdef 3
+
+/*
+ * initCTptr(): Set ctptr[] to point at ctdata[], indexed by codeset_num.
+ */
+static void
+initCTptr(
+    XLCd lcd)
+{
+    int num_codesets = XLC_GENERIC(lcd, codeset_num);
+    int num_charsets;
+    int i, j;
+    CodeSet *codesets = XLC_GENERIC(lcd, codeset_list);
+    CodeSet codeset;
+    XlcCharSet charset;
+    CTData ctdp = ctdata;
+
+    ctdptr[Ascii] = &ctdata[0];         /* failsafe */
+
+    for (i = 0; i < num_codesets; i++) {
+
+       codeset = codesets[i];
+       num_charsets = codeset->num_charsets;
+
+       for (j = 0; j < num_charsets; j++) {
+
+           charset = codeset->charset_list[j];
+
+           for (ctdp = ctdata; ctdp <= ctd_endp; ctdp++)
+
+               if (! strcmp(ctdp->name, charset->name)) {
+
+                   ctdptr[codeset->cs_num] = ctdp;
+
+                   ctdptr[codeset->cs_num]->wc_encoding = codeset->wc_encoding;
+
+                   ctdptr[codeset->cs_num]->set_size =
+                     charset->set_size;
+
+                   ctdptr[codeset->cs_num]->min_ch =
+                     charset->set_size == 94 &&
+                     (ctdptr[codeset->cs_num]->length > 1 ||
+                     ctdptr[codeset->cs_num]->side == XlcGR) ? 0x21 : 0x20;
+
+                   break;
+               }
+       }
+    }
+}
+
+
+static int
+sjis_mbstocts(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    int ct_len = *to_left;
+    int cs_num;
+    int clen;
+    int unconv_num = 0;
+    int num_conv;
+    const char *inbufptr = *from;
+    char *ctptr = *to;
+    XPointer ct_base = ctptr;
+
+    StateRec ct_state;
+    CTData charset = NULL;
+    XLCd lcd = (XLCd) conv->state;
+    int codeset_num = XLC_GENERIC(lcd, codeset_num);
+
+/* Initial State: */
+
+    ct_state.GL_charset = ctdptr[Ascii];
+    ct_state.GR_charset = NULL;
+
+    if (*from_left > *to_left)
+        *from_left = *to_left;
+
+    for (;*from_left > 0; (*from_left) -= charset->length) {
+
+       if (iskanji(*inbufptr)) {
+           if (KANJI_CODESET >= codeset_num) {
+               unconv_num++;
+               (*from_left)--;
+               continue;
+           }
+           cs_num = Kanji;
+           charset = ctdptr[Kanji];
+           if (!VALID_MULTIBYTE((Uchar) *(inbufptr+1)))
+               unconv_num++;
+       }
+       else if (isuserdef(*inbufptr)) {
+           if (USERDEF_CODESET >= codeset_num) {
+               unconv_num++;
+               (*from_left)--;
+               continue;
+           }
+           cs_num = Userdef;
+           charset = ctdptr[Userdef];
+           if (!VALID_MULTIBYTE((Uchar) *(inbufptr+1)))
+               unconv_num++;
+       }
+       else if (isascii(*inbufptr)) {
+           if (ASCII_CODESET >= codeset_num) {
+               unconv_num++;
+               (*from_left)--;
+               continue;
+           }
+           cs_num = Ascii;
+           charset = ctdptr[Ascii];
+       }
+       else if (iskana(*inbufptr)) {
+           if (KANA_CODESET >= codeset_num) {
+               unconv_num++;
+               (*from_left)--;
+               continue;
+           }
+           cs_num = Kana;
+           charset = ctdptr[Kana];
+       }
+       else {           /* unknown */
+           unconv_num++;
+           (*from_left)--;
+           continue;
+       }
+
+       if ( (charset->side == XlcGR && charset != ct_state.GR_charset) ||
+            (charset->side == XlcGL && charset != ct_state.GL_charset) ) {
+
+           ct_len -= ctdptr[cs_num]->ct_encoding_len;
+           if (ct_len < 0) {
+               unconv_num++;
+               break;
+           }
+
+           if (ctptr) {
+               strcpy(ctptr, ctdptr[cs_num]->ct_encoding);
+               ctptr += ctdptr[cs_num]->ct_encoding_len;
+           }
+       }
+
+       clen = charset->length;
+       do {
+           *ctptr++ = *inbufptr++;
+       } while (--clen);
+
+       if (charset->length >= 2) {
+           sjis_to_jis((Uchar *)(ctptr-2), (Uchar *)(ctptr-1));
+           if (BADCHAR(charset->min_ch, *(ctptr-2)) ||
+                 BADCHAR(charset->min_ch, *(ctptr-1))) {
+               unconv_num++;
+               continue;
+           }
+       }
+       else
+           if (BADCHAR(charset->min_ch, *(ctptr-1))) {
+               unconv_num++;
+               continue;
+           }
+
+       if (charset->side == XlcGR)
+           ct_state.GR_charset = charset;
+       else if (charset->side == XlcGL)
+           ct_state.GL_charset = charset;
+
+       if (charset->side == XlcGR) {
+         clen = charset->length;
+         do {
+           (*(Uchar *)(ctptr-clen)) = BIT8ON(*(Uchar *)(ctptr-clen));
+         } while (--clen);
+       }
+    }
+
+    *to = (XPointer)ctptr;
+
+    if ((num_conv = (int)(ctptr - ct_base)) > 0)
+       (*to_left) -= num_conv;
+
+    return unconv_num;
+
+}
+
+
+#define byte1          (length == codeset->length - 1)
+#define byte2          (byte1 == 0)
+
+static int
+sjis_wcstocts(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    int ct_len = *to_left;
+    const wchar_t *inbufptr = (const wchar_t *) *from;
+    char *ctptr = *to;
+    XPointer ct_base = ctptr;
+    wchar_t  wch;
+    int length;
+    Uchar tmp;
+    Uchar t1 = 0;
+    int num_conv;
+
+    StateRec ct_state;
+    XLCd lcd = (XLCd)conv->state;
+    CTData charset;
+    CodeSet codeset;
+    int unconv_num = 0;
+    Ulong wc_shift = XLC_GENERIC(lcd, wc_shift_bits);
+
+/* Initial State: */
+    ct_state.GL_charset = ctdptr[0]; /* Codeset 0 */
+    ct_state.GR_charset = NULL;
+
+    if (*from_left > *to_left)
+       *from_left = *to_left;
+
+    for (; *from_left > 0 ; (*from_left)-- ) {
+
+       wch = *inbufptr++;
+
+        if (!(codeset = wc_codeset(lcd, wch))) {
+            unconv_num++;
+            (*from_left)--;
+            continue;
+        }
+
+       charset = ctdptr[codeset->cs_num];
+
+       length = codeset->length;
+       wch ^= (wchar_t)codeset->wc_encoding;
+
+       if ( (charset->side == XlcGR && charset != ct_state.GR_charset) ||
+            (charset->side == XlcGL && charset != ct_state.GL_charset) ) {
+
+           ct_len -= ctdptr[codeset->cs_num]->ct_encoding_len;
+           if (ct_len < 0) {
+               unconv_num++;
+               break;
+           }
+
+           if (ctptr) {
+               strcpy(ctptr, ctdptr[codeset->cs_num]->ct_encoding);
+               ctptr += ctdptr[codeset->cs_num]->ct_encoding_len;
+           }
+
+       }
+
+       if (charset->side == XlcGR)
+           ct_state.GR_charset = charset;
+       else if (charset->side == XlcGL)
+           ct_state.GL_charset = charset;
+
+       do {
+           length--;
+           tmp = wch>>(wchar_t)( (Ulong)length * wc_shift);
+
+           if (kana) {
+               if (BADCHAR(charset->min_ch, (char)tmp)) {
+                   unconv_num++;
+                   break;
+               }
+               *ctptr++ = (char)BIT8ON(tmp);
+           }
+
+           else if (byte1 && (kanji || userdef)) {
+               t1 = tmp;
+           }
+
+           else if (byte2 && (kanji || userdef)) {
+               if (BADCHAR(charset->min_ch, (char)t1) ||
+                 BADCHAR(charset->min_ch, (char)tmp)) {
+                   unconv_num++;
+                   break;
+               }
+
+               *ctptr++ = (char)BIT8OFF(t1);
+               *ctptr++ = (char)BIT8OFF(tmp);
+           }
+
+           else {
+               if (BADCHAR(charset->min_ch, (char)tmp)) {
+                   unconv_num++;
+                   break;
+               }
+               *ctptr++ = (char)tmp;
+           }
+       } while (length);
+
+    }  /* end for */
+
+    *to = (XPointer)ctptr;
+
+    if ((num_conv = (int)(ctptr - ct_base)) > 0)
+       (*to_left) -= num_conv;
+
+    return unconv_num;
+}
+#undef byte1
+#undef byte2
+
+#define SKIP_I(str)    while (*(str) >= 0x20 && *(str) <=  0x2f) (str)++;
+#define SKIP_P(str)    while (*(str) >= 0x30 && *(str) <=  0x3f) (str)++;
+
+static int
+sjis_ctstombs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    const char *inbufptr =  *from;
+    XPointer outbufptr =  *to;
+    const char *inbuf_base;
+    XPointer outbuf_base = outbufptr;
+    int clen, length;
+    int unconv_num = 0;
+    int num_conv;
+    unsigned int ct_seglen = 0;
+    Uchar ct_type;
+    CTData ctdp = ctdata;      /* default */
+    CTData GL_ctdp = ctdp;     /* GL ctdp save */
+    CTData GR_ctdp = ctdp;     /* GR ctdp save */
+
+    if (*from_left > *to_left)
+       *from_left = *to_left;
+
+    for (length = ctdata[Ascii].length; *from_left > 0 ; (*from_left) -= length)
+    {
+       ct_type = CT_STD;
+       /* change GL/GR charset */
+       if(ctdp->side == XlcGR && isleftside(*inbufptr)){
+           /* select GL side */
+           ctdp = GL_ctdp;
+           length = ctdp->length;
+           ct_type = ctdp->ct_type;
+       }else if(ctdp->side == XlcGL && isrightside(*inbufptr)){
+           /* select GR side */
+           ctdp = GR_ctdp;
+           length = ctdp->length;
+           ct_type = ctdp->ct_type;
+       }
+       if (*inbufptr == '\033' || *inbufptr == (char)'\233') {
+
+           for (ctdp = ctdata; ctdp <= ctd_endp ; ctdp++) {
+
+               if(!strncmp(inbufptr, ctdp->ct_encoding, ctdp->ct_encoding_len))
+               {
+                   inbufptr += ctdp->ct_encoding_len;
+                   (*from_left) -= ctdp->ct_encoding_len;
+                   if( ctdp->length ) {
+                       length = ctdp->length;
+                       if( *from_left < length ) {
+                           *to = (XPointer)outbufptr;
+                           *to_left -= outbufptr - outbuf_base;
+                           return( unconv_num + *from_left );
+                       }
+                   }
+                   ct_type = ctdp->ct_type;
+                   if(ctdp->side == XlcGL){
+                       GL_ctdp = ctdp; /* save GL ctdp */
+                   }else{
+                       GR_ctdp = ctdp; /* save GR ctdp */
+                   }
+                   break;
+               }
+           }
+           if (ctdp > ctd_endp)        /* failed to match CT sequence */
+               unconv_num++;
+       }
+
+/* The following code insures that non-standard encodings, direction, extension,
+ * and version strings are ignored; subject to change in future.
+ */
+       switch (ct_type) {
+         case CT_STD:
+           break;
+         case CT_EXT2:
+           inbufptr++;
+           (*from_left)--;
+         case CT_NSTD:
+           ct_seglen = (BIT8OFF(*inbufptr) << 7) + BIT8OFF(*(inbufptr+1)) + 2;
+           inbufptr += ct_seglen;
+           (*from_left) -= ct_seglen;
+           continue;
+         case CT_EXT0:
+           inbuf_base = inbufptr;
+           SKIP_I(inbufptr);
+           inbufptr++;
+           ct_seglen = (unsigned)(inbufptr - inbuf_base);
+           (*from_left) -= ct_seglen;
+           continue;
+         case CT_EXT1:
+           inbuf_base = inbufptr;
+           SKIP_P(inbufptr);
+           SKIP_I(inbufptr);
+           inbufptr++;
+           ct_seglen = (unsigned)(inbufptr - inbuf_base);
+           (*from_left) -= ct_seglen;
+           continue;
+         case CT_DIR:
+           continue;
+         case CT_VER:
+           inbufptr += 2;
+           (*from_left) -= 2;
+           continue;
+       }
+
+       if (ctdp->side == XlcGL || isrightside (*inbufptr)) {
+           clen = length;
+       } else {
+           clen = 1;
+           *from_left += length - clen;
+       }
+       do {
+           Uchar mask = (length == 2) ? GL : -1;
+           *outbufptr++ = *inbufptr++ & mask;
+       } while (--clen);
+
+       if (length >= 2)
+           jis_to_sjis((Uchar *)(outbufptr-2), (Uchar *)(outbufptr-1));
+    }
+
+    *to = (XPointer)outbufptr;
+
+    if ((num_conv = (int)(outbufptr - outbuf_base)) > 0)
+       (*to_left) -= num_conv;
+
+    return unconv_num;
+}
+
+
+static int
+sjis_ctstowcs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    XLCd lcd = (XLCd)conv->state;
+    Ulong wc_shift_bits = XLC_GENERIC(lcd, wc_shift_bits);
+    const char *inbufptr = *from;
+    const char *inbuf_base;
+    wchar_t *outbufptr = (wchar_t *) *to;
+    wchar_t *outbuf_base = outbufptr;
+    int clen, length;
+    int num_conv;
+    int unconv_num = 0;
+    unsigned int ct_seglen = 0;
+    Uchar ct_type = 0;
+    int shift_mult;
+    wchar_t wc_tmp;
+    wchar_t wch;
+    Ulong wc_encoding;
+    CTData ctdp = ctdata;
+    CTData GL_ctdp = ctdp;     /* GL ctdp save */
+    CTData GR_ctdp = ctdp;     /* GR ctdp save */
+
+    if (*from_left > *to_left)
+       *from_left = *to_left;
+
+    for (length = ctdata[Ascii].length; *from_left > 0; (*from_left) -= length )
+    {
+       ct_type = CT_STD;
+       /* change GL/GR charset */
+       if(ctdp->side == XlcGR && isleftside(*inbufptr)){
+           /* select GL side */
+           ctdp = GL_ctdp;
+           length = ctdp->length;
+           ct_type = ctdp->ct_type;
+       }else if(ctdp->side == XlcGL && isrightside(*inbufptr)){
+           /* select GR side */
+           ctdp = GR_ctdp;
+           length = ctdp->length;
+           ct_type = ctdp->ct_type;
+       }
+       if (*inbufptr == '\033' || *inbufptr == (char)'\233') {
+           for (ctdp = ctdata; ctdp <= ctd_endp ; ctdp++) {
+
+               if(!strncmp(inbufptr, ctdp->ct_encoding, ctdp->ct_encoding_len))
+               {
+                   inbufptr += ctdp->ct_encoding_len;
+                   (*from_left) -= ctdp->ct_encoding_len;
+                   if( ctdp->length ) {
+                       length = ctdp->length;
+                       if( *from_left < length ) {
+                           *to = (XPointer)outbufptr;
+                           *to_left -= outbufptr - outbuf_base;
+                           return( unconv_num + *from_left );
+                       }
+                   }
+                   ct_type = ctdp->ct_type;
+                   if(ctdp->side == XlcGL){
+                       GL_ctdp = ctdp; /* save GL ctdp */
+                   }else{
+                       GR_ctdp = ctdp; /* save GR ctdp */
+                   }
+                   break;
+               }
+           }
+           if (ctdp > ctd_endp)        /* failed to match CT sequence */
+               unconv_num++;
+       }
+
+/* The following block of code insures that non-standard encodings, direction,
+ * extension, and version strings are ignored; subject to change in future.
+ */
+       switch (ct_type) {
+         case CT_STD:
+           break;
+         case CT_EXT2:
+           inbufptr++;
+           (*from_left)--;
+         case CT_NSTD:
+           ct_seglen = (BIT8OFF(*inbufptr) << 7) + BIT8OFF(*(inbufptr+1)) + 2;
+           inbufptr += ct_seglen;
+           (*from_left) -= ct_seglen;
+           continue;
+         case CT_EXT0:
+           inbuf_base = inbufptr;
+           SKIP_I(inbufptr);
+           inbufptr++;
+           ct_seglen = (unsigned)(inbufptr - inbuf_base);
+           (*from_left) -= ct_seglen;
+           continue;
+         case CT_EXT1:
+           inbuf_base = inbufptr;
+           SKIP_P(inbufptr);
+           SKIP_I(inbufptr);
+           inbufptr++;
+           ct_seglen = (unsigned)(inbufptr - inbuf_base);
+           (*from_left) -= ct_seglen;
+           continue;
+         case CT_DIR:
+           continue;
+         case CT_VER:
+           inbufptr += 2;
+           (*from_left) -= 2;
+           continue;
+       }
+#if !defined(__sony_news)  ||  defined(SVR4)
+       if (ctdp->side == XlcGL || isrightside (*inbufptr)) {
+           clen = length;
+           wc_encoding = ctdp->wc_encoding;
+       } else {
+           clen = 1;
+           *from_left += length - clen;
+           wc_encoding = ctdptr[Ascii]->wc_encoding;
+       }
+       shift_mult = clen - 1;
+       wch = (wchar_t)0;
+
+       do {
+           wc_tmp = BIT8OFF(*inbufptr++) << (wc_shift_bits * shift_mult);
+           wch |= wc_tmp;
+           shift_mult--;
+       } while (--clen);
+       *outbufptr++ = wch | wc_encoding;
+#else
+       if( length == 1 )
+           *outbufptr++ = (unsigned char)*inbufptr++;
+       else if( length == 2 ) {
+           unsigned short      code;
+           code = (*inbufptr << 8) | *(inbufptr+1);
+           *outbufptr++ = jis2sjis( code );
+           inbufptr += 2;
+       }
+#endif
+    }
+    *to = (XPointer)outbufptr;
+
+    if ((num_conv = (int)(outbufptr - outbuf_base)) > 0)
+       (*to_left) -= num_conv ;
+
+    return unconv_num;
+
+}
+#undef BADCHAR
+
+static void
+close_converter(
+    XlcConv conv)
+{
+       Xfree((char *) conv);
+}
+
+
+static XlcConv
+create_conv(
+    XLCd lcd,
+    XlcConvMethods methods)
+{
+    XlcConv conv;
+
+    conv = (XlcConv) Xmalloc(sizeof(XlcConvRec));
+    if (conv == NULL)
+       return (XlcConv) NULL;
+
+    conv->methods = methods;
+    conv->state = (XPointer) lcd;
+    return conv;
+}
+
+
+enum { MBSTOCS, WCSTOCS, MBTOCS, CSTOMBS, CSTOWCS, MBSTOWCS, WCSTOMBS,
+       WCSTOCTS, MBSTOCTS, CTSTOMBS, CTSTOWCS };
+
+static XlcConvMethodsRec conv_methods[] = {
+    {close_converter, sjis_mbstocs,  NULL },
+    {close_converter, sjis_wcstocs,  NULL },
+    {close_converter, sjis_mbtocs,   NULL },
+    {close_converter, sjis_cstombs,  NULL },
+    {close_converter, sjis_cstowcs,  NULL },
+    {close_converter, sjis_mbstowcs, NULL },
+    {close_converter, sjis_wcstombs, NULL },
+    {close_converter, sjis_wcstocts, NULL },
+    {close_converter, sjis_mbstocts, NULL },
+    {close_converter, sjis_ctstombs, NULL },
+    {close_converter, sjis_ctstowcs, NULL },
+};
+
+
+static XlcConv
+open_mbstocs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &conv_methods[MBSTOCS]);
+}
+
+static XlcConv
+open_wcstocs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &conv_methods[WCSTOCS]);
+}
+
+static XlcConv
+open_mbtocs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &conv_methods[MBTOCS]);
+}
+
+static XlcConv
+open_cstombs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &conv_methods[CSTOMBS]);
+}
+
+static XlcConv
+open_cstowcs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &conv_methods[CSTOWCS]);
+}
+
+static XlcConv
+open_mbstowcs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &conv_methods[MBSTOWCS]);
+}
+
+static XlcConv
+open_wcstombs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &conv_methods[WCSTOMBS]);
+}
+
+static XlcConv
+open_wcstocts(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &conv_methods[WCSTOCTS]);
+}
+
+static XlcConv
+open_mbstocts(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &conv_methods[MBSTOCTS]);
+}
+
+static XlcConv
+open_ctstombs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &conv_methods[CTSTOMBS]);
+}
+
+static XlcConv
+open_ctstowcs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &conv_methods[CTSTOWCS]);
+}
+
+XLCd
+_XlcSjisLoader(
+    const char *name)
+{
+    XLCd lcd;
+
+    lcd = _XlcCreateLC(name, _XlcGenericMethods);
+    if (lcd == NULL)
+       return lcd;
+
+    if (!XLC_PUBLIC_PART(lcd)->codeset ||
+       (_XlcCompareISOLatin1(XLC_PUBLIC_PART(lcd)->codeset, "SJIS"))) {
+       _XlcDestroyLC(lcd);
+       return (XLCd) NULL;
+    }
+
+    initCTptr(lcd);
+
+    _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCharSet, open_mbstocs);
+    _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCharSet, open_wcstocs);
+    _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNMultiByte, open_cstombs);
+    _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNWideChar, open_cstowcs);
+    _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNChar, open_mbtocs);
+
+#ifndef FORCE_INDIRECT_CONVERTER
+    _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNMultiByte, open_ctstombs);
+    _XlcSetConverter(lcd, XlcNCompoundText, lcd, XlcNWideChar, open_ctstowcs);
+    _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCompoundText, open_mbstocts);
+    _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNWideChar, open_mbstowcs);
+    _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCompoundText, open_wcstocts);
+    _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNMultiByte, open_wcstombs);
+#endif
+
+    _XlcAddUtf8Converters(lcd);
+
+    return lcd;
+}
+
+#else
+typedef int dummy;
+#endif /* X_LOCALE */
diff --git a/modules/om/Makefile.am b/modules/om/Makefile.am
new file mode 100644 (file)
index 0000000..24f4c06
--- /dev/null
@@ -0,0 +1 @@
+SUBDIRS=generic
diff --git a/modules/om/generic/Makefile.am b/modules/om/generic/Makefile.am
new file mode 100644 (file)
index 0000000..4a10b38
--- /dev/null
@@ -0,0 +1,42 @@
+AM_CPPFLAGS= \
+       -I$(top_srcdir)/include \
+       -I$(top_srcdir)/include/X11 \
+       -I$(top_builddir)/include \
+       -I$(top_builddir)/include/X11 \
+       -I$(top_srcdir)/src/xcms \
+       -I$(top_srcdir)/src/xkb \
+       -I$(top_srcdir)/src/xlibi18n \
+       -I$(top_srcdir)/src \
+       -D_BSD_SOURCE
+
+AM_CFLAGS= \
+       $(X11_CFLAGS) \
+       $(BIGFONT_CFLAGS) \
+       $(MALLOC_ZERO_CFLAGS) \
+       $(CWARNFLAGS)
+
+if XLIB_LOADABLE_I18N
+
+commonlibdir = $(X11_LOCALELIBDIR)/common
+commonlib_LTLIBRARIES=xomGeneric.la
+xomGeneric_la_LDFLAGS = -module -version-number 2:0:0
+xomGeneric_la_LIBADD = $(I18N_MODULE_LIBS)
+
+else
+
+noinst_LTLIBRARIES = libxomGeneric.la
+
+endif
+
+
+xomGeneric_la_SOURCES = \
+       omDefault.c \
+       omGeneric.c \
+       omImText.c \
+       omText.c \
+       omTextEsc.c \
+       omTextExt.c \
+       omTextPer.c \
+       omXChar.c
+
+libxomGeneric_la_SOURCES = $(xomGeneric_la_SOURCES)
diff --git a/modules/om/generic/omDefault.c b/modules/om/generic/omDefault.c
new file mode 100644 (file)
index 0000000..322690f
--- /dev/null
@@ -0,0 +1,449 @@
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * 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 TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA 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.
+ *
+ * Author: Katsuhisa Yano      TOSHIBA Corp.
+ *                             mopi@osa.ilab.toshiba.co.jp
+ */
+/*
+ *  (c) Copyright 1995 FUJITSU LIMITED
+ *  This is source code modified by FUJITSU LIMITED under the Joint
+ *  Development Agreement for the CDE/Motif PST.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XomGeneric.h"
+#include <X11/Xos.h>
+#include <X11/Xatom.h>
+#include <stdio.h>
+
+#define DefineLocalBuf         char local_buf[BUFSIZ]
+#define AllocLocalBuf(length)  (length > BUFSIZ ? (char *)Xmalloc(length) : local_buf)
+#define FreeLocalBuf(ptr)      if (ptr != local_buf) Xfree(ptr)
+
+static Bool
+wcs_to_mbs(
+    XOC oc,
+    char *to,
+    _Xconst wchar_t *from,
+    int length)
+{
+    XlcConv conv;
+    int to_left, ret;
+
+    conv = _XomInitConverter(oc, XOMWideChar);
+    if (conv == NULL)
+       return False;
+
+    to_left = length;
+    ret = _XlcConvert(conv, (XPointer *) &from, &length, (XPointer *) &to,
+                     &to_left, NULL, 0);
+    if (ret != 0 || length > 0)
+       return False;
+
+    return True;
+}
+
+static Bool
+utf8_to_mbs(
+    XOC oc,
+    char *to,
+    _Xconst char *from,
+    int length)
+{
+    XlcConv conv;
+    int to_left, ret;
+
+    conv = _XomInitConverter(oc, XOMUtf8String);
+    if (conv == NULL)
+       return False;
+
+    to_left = length;
+    ret = _XlcConvert(conv, (XPointer *) &from, &length, (XPointer *) &to,
+                     &to_left, NULL, 0);
+    if (ret != 0 || length > 0)
+       return False;
+
+    return True;
+}
+
+int
+_XmbDefaultTextEscapement(XOC oc, _Xconst char *text, int length)
+{
+    return XTextWidth(*oc->core.font_info.font_struct_list, text, length);
+}
+
+int
+_XwcDefaultTextEscapement(XOC oc, _Xconst wchar_t *text, int length)
+{
+    DefineLocalBuf;
+    char *buf = AllocLocalBuf(length);
+    int ret;
+
+    if (buf == NULL)
+       return 0;
+
+    if (wcs_to_mbs(oc, buf, text, length) == False) {
+       ret = 0;
+       goto err;
+    }
+
+    ret = _XmbDefaultTextEscapement(oc, buf, length);
+
+err:
+    FreeLocalBuf(buf);
+
+    return ret;
+}
+
+int
+_Xutf8DefaultTextEscapement(XOC oc, _Xconst char *text, int length)
+{
+    DefineLocalBuf;
+    char *buf = AllocLocalBuf(length);
+    int ret;
+
+    if (buf == NULL)
+       return 0;
+
+    if (utf8_to_mbs(oc, buf, text, length) == False) {
+       ret = 0;
+       goto err;
+    }
+
+    ret = _XmbDefaultTextEscapement(oc, buf, length);
+
+err:
+    FreeLocalBuf(buf);
+
+    return ret;
+}
+
+int
+_XmbDefaultTextExtents(XOC oc, _Xconst char *text, int length,
+                      XRectangle *overall_ink, XRectangle *overall_logical)
+{
+    int direction, logical_ascent, logical_descent;
+    XCharStruct overall;
+
+    XTextExtents(*oc->core.font_info.font_struct_list, text, length, &direction,
+                &logical_ascent, &logical_descent, &overall);
+
+    if (overall_ink) {
+       overall_ink->x = overall.lbearing;
+       overall_ink->y = -(overall.ascent);
+       overall_ink->width = overall.rbearing - overall.lbearing;
+       overall_ink->height = overall.ascent + overall.descent;
+    }
+
+    if (overall_logical) {
+       overall_logical->x = 0;
+        overall_logical->y = -(logical_ascent);
+       overall_logical->width = overall.width;
+        overall_logical->height = logical_ascent + logical_descent;
+    }
+
+    return overall.width;
+}
+
+int
+_XwcDefaultTextExtents(XOC oc, _Xconst wchar_t *text, int length,
+                      XRectangle *overall_ink, XRectangle *overall_logical)
+{
+    DefineLocalBuf;
+    char *buf = AllocLocalBuf(length);
+    int ret;
+
+    if (buf == NULL)
+       return 0;
+
+    if (wcs_to_mbs(oc, buf, text, length) == False) {
+       ret = 0;
+       goto err;
+    }
+
+    ret = _XmbDefaultTextExtents(oc, buf, length, overall_ink, overall_logical);
+
+err:
+    FreeLocalBuf(buf);
+
+    return ret;
+}
+
+int
+_Xutf8DefaultTextExtents(XOC oc, _Xconst char *text, int length,
+                        XRectangle *overall_ink, XRectangle *overall_logical)
+{
+    DefineLocalBuf;
+    char *buf = AllocLocalBuf(length);
+    int ret;
+
+    if (buf == NULL)
+       return 0;
+
+    if (utf8_to_mbs(oc, buf, text, length) == False) {
+       ret = 0;
+       goto err;
+    }
+
+    ret = _XmbDefaultTextExtents(oc, buf, length, overall_ink, overall_logical);
+
+err:
+    FreeLocalBuf(buf);
+
+    return ret;
+}
+
+Status
+_XmbDefaultTextPerCharExtents(XOC oc, _Xconst char *text, int length,
+                             XRectangle *ink_buf, XRectangle *logical_buf,
+                             int buf_size, int *num_chars,
+                             XRectangle *overall_ink,
+                             XRectangle *overall_logical)
+{
+    XFontStruct *font = *oc->core.font_info.font_struct_list;
+    XCharStruct *def, *cs, overall;
+    Bool first = True;
+
+    if (buf_size < length)
+       return 0;
+
+    bzero((char *) &overall, sizeof(XCharStruct));
+    *num_chars = 0;
+
+    CI_GET_DEFAULT_INFO_1D(font, def)
+
+    while (length-- > 0) {
+       CI_GET_CHAR_INFO_1D(font, *text, def, cs)
+       text++;
+       if (cs == NULL)
+           continue;
+
+       ink_buf->x = overall.width + cs->lbearing;
+       ink_buf->y = -(cs->ascent);
+       ink_buf->width = cs->rbearing - cs->lbearing;
+       ink_buf->height = cs->ascent + cs->descent;
+       ink_buf++;
+
+       logical_buf->x = overall.width;
+       logical_buf->y = -(font->ascent);
+       logical_buf->width = cs->width;
+       logical_buf->height = font->ascent + font->descent;
+       logical_buf++;
+
+       if (first) {
+           overall = *cs;
+           first = False;
+       } else {
+           overall.ascent = max(overall.ascent, cs->ascent);
+           overall.descent = max(overall.descent, cs->descent);
+           overall.lbearing = min(overall.lbearing, overall.width +
+                                  cs->lbearing);
+           overall.rbearing = max(overall.rbearing, overall.width +
+                                  cs->rbearing);
+           overall.width += cs->width;
+       }
+
+       (*num_chars)++;
+    }
+
+    if (overall_ink) {
+       overall_ink->x = overall.lbearing;
+       overall_ink->y = -(overall.ascent);
+       overall_ink->width = overall.rbearing - overall.lbearing;
+       overall_ink->height = overall.ascent + overall.descent;
+    }
+
+    if (overall_logical) {
+       overall_logical->x = 0;
+       overall_logical->y = -(font->ascent);
+       overall_logical->width = overall.width;
+       overall_logical->height = font->ascent + font->descent;
+    }
+
+    return 1;
+}
+
+Status
+_XwcDefaultTextPerCharExtents(XOC oc, _Xconst wchar_t *text, int length,
+                             XRectangle *ink_buf, XRectangle *logical_buf,
+                             int buf_size, int *num_chars,
+                             XRectangle *overall_ink,
+                             XRectangle *overall_logical)
+{
+    DefineLocalBuf;
+    char *buf = AllocLocalBuf(length);
+    Status ret;
+
+    if (buf == NULL)
+       return 0;
+
+    if (wcs_to_mbs(oc, buf, text, length) == False) {
+       ret = 0;
+       goto err;
+    }
+
+    ret = _XmbDefaultTextPerCharExtents(oc, buf, length, ink_buf, logical_buf,
+                                       buf_size, num_chars, overall_ink,
+                                       overall_logical);
+
+err:
+    FreeLocalBuf(buf);
+
+    return ret;
+}
+
+Status
+_Xutf8DefaultTextPerCharExtents(XOC oc, _Xconst char *text, int length,
+                               XRectangle *ink_buf, XRectangle *logical_buf,
+                               int buf_size, int *num_chars,
+                               XRectangle *overall_ink,
+                               XRectangle *overall_logical)
+{
+    DefineLocalBuf;
+    char *buf = AllocLocalBuf(length);
+    Status ret;
+
+    if (buf == NULL)
+       return 0;
+
+    if (utf8_to_mbs(oc, buf, text, length) == False) {
+       ret = 0;
+       goto err;
+    }
+
+    ret = _XmbDefaultTextPerCharExtents(oc, buf, length, ink_buf, logical_buf,
+                                       buf_size, num_chars, overall_ink,
+                                       overall_logical);
+
+err:
+    FreeLocalBuf(buf);
+
+    return ret;
+}
+
+int
+_XmbDefaultDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
+                     _Xconst char *text, int length)
+{
+    XFontStruct *font = *oc->core.font_info.font_struct_list;
+
+    XSetFont(dpy, gc, font->fid);
+    XDrawString(dpy, d, gc, x, y, text, length);
+
+    return XTextWidth(font, text, length);
+}
+
+int
+_XwcDefaultDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
+                     _Xconst wchar_t *text, int length)
+{
+    DefineLocalBuf;
+    char *buf = AllocLocalBuf(length);
+    int ret;
+
+    if (buf == NULL)
+       return 0;
+
+    if (wcs_to_mbs(oc, buf, text, length) == False) {
+       ret = 0;
+       goto err;
+    }
+
+    ret = _XmbDefaultDrawString(dpy, d, oc, gc, x, y, buf, length);
+
+err:
+    FreeLocalBuf(buf);
+
+    return ret;
+}
+
+int
+_Xutf8DefaultDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
+                       _Xconst char *text, int length)
+{
+    DefineLocalBuf;
+    char *buf = AllocLocalBuf(length);
+    int ret;
+
+    if (buf == NULL)
+       return 0;
+
+    if (utf8_to_mbs(oc, buf, text, length) == False) {
+       ret = 0;
+       goto err;
+    }
+
+    ret = _XmbDefaultDrawString(dpy, d, oc, gc, x, y, buf, length);
+
+err:
+    FreeLocalBuf(buf);
+
+    return ret;
+}
+
+void
+_XmbDefaultDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
+                          int y, _Xconst char *text, int length)
+{
+    XSetFont(dpy, gc, (*oc->core.font_info.font_struct_list)->fid);
+    XDrawImageString(dpy, d, gc, x, y, text, length);
+}
+
+void
+_XwcDefaultDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
+                          int y, _Xconst wchar_t *text, int length)
+{
+    DefineLocalBuf;
+    char *buf = AllocLocalBuf(length);
+
+    if (buf == NULL)
+       return;
+
+    if (wcs_to_mbs(oc, buf, text, length) == False)
+       goto err;
+
+    _XmbDefaultDrawImageString(dpy, d, oc, gc, x, y, buf, length);
+
+err:
+    FreeLocalBuf(buf);
+}
+
+void
+_Xutf8DefaultDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
+                            int y, _Xconst char *text, int length)
+{
+    DefineLocalBuf;
+    char *buf = AllocLocalBuf(length);
+
+    if (buf == NULL)
+       return;
+
+    if (utf8_to_mbs(oc, buf, text, length) == False)
+       goto err;
+
+    _XmbDefaultDrawImageString(dpy, d, oc, gc, x, y, buf, length);
+
+err:
+    FreeLocalBuf(buf);
+}
diff --git a/modules/om/generic/omGeneric.c b/modules/om/generic/omGeneric.c
new file mode 100644 (file)
index 0000000..7f02c85
--- /dev/null
@@ -0,0 +1,2169 @@
+/*  #define FONTDEBUG */
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * 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 TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA 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.
+ *
+ * Author: Katsuhisa Yano      TOSHIBA Corp.
+ *                             mopi@osa.ilab.toshiba.co.jp
+ */
+/*
+ * Copyright 1995 by FUJITSU LIMITED
+ * This is source code modified by FUJITSU LIMITED under the Joint
+ * Development Agreement for the CDE/Motif PST.
+ *
+ * Modifier:  Takanori Tateno   FUJITSU LIMITED
+ *
+ */
+
+/*
+ * Fixed the algorithms in parse_fontname() and parse_fontdata()
+ * to improve the logic for determining which font should be
+ * returned for a given CharSet.  We even added some comments
+ * so that you can figure out what in the heck we're doing. We
+ * realize this is a departure from the norm, but hey, we're
+ * rebels! :-) :-)
+ *
+ * Modifiers: Jeff Walls, Paul Anderson: HEWLETT-PACKARD
+ */
+/*
+ * Cleaned up mess, removed some blabla
+ * Egbert Eich, SuSE Linux AG
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XomGeneric.h"
+#include "XlcGeneric.h"
+#include <X11/Xos.h>
+#include <X11/Xatom.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#define MAXFONTS               100
+#define        PIXEL_SIZE_FIELD         7
+#define        POINT_SIZE_FIELD         8
+#define        CHARSET_ENCODING_FIELD  14
+#define XLFD_MAX_LEN           255
+
+#if 0
+extern int _XmbDefaultTextEscapement(), _XwcDefaultTextEscapement(),
+          _Xutf8DefaultTextEscapement();
+extern int _XmbDefaultTextExtents(), _XwcDefaultTextExtents(),
+          _Xutf8DefaultTextExtents();
+extern Status _XmbDefaultTextPerCharExtents(), _XwcDefaultTextPerCharExtents(),
+             _Xutf8DefaultTextPerCharExtents();
+extern int _XmbDefaultDrawString(), _XwcDefaultDrawString(),
+          _Xutf8DefaultDrawString();
+extern void _XmbDefaultDrawImageString(), _XwcDefaultDrawImageString(),
+           _Xutf8DefaultDrawImageString();
+
+extern int _XmbGenericTextEscapement(), _XwcGenericTextEscapement(),
+          _Xutf8GenericTextEscapement();
+extern int _XmbGenericTextExtents(), _XwcGenericTextExtents(),
+          _Xutf8GenericTextExtents();
+extern Status _XmbGenericTextPerCharExtents(), _XwcGenericTextPerCharExtents(),
+             _Xutf8GenericTextPerCharExtents();
+extern int _XmbGenericDrawString(), _XwcGenericDrawString(),
+          _Xutf8GenericDrawString();
+extern void _XmbGenericDrawImageString(), _XwcGenericDrawImageString(),
+           _Xutf8GenericDrawImageString();
+
+extern void _XlcDbg_printValue (const char *str, char **value, int num);
+#endif
+
+/* For VW/UDC start */
+
+static FontData
+init_fontdata(
+    FontData   font_data,
+    int                font_data_count)
+{
+    FontData   fd;
+    int                i;
+
+    fd = (FontData)Xmalloc(sizeof(FontDataRec) * font_data_count);
+    if(fd == (FontData) NULL)
+       return False;
+
+    memset(fd, 0x00, sizeof(FontData) * font_data_count);
+    for(i = 0 ; i < font_data_count ; i++)
+       fd[i] = font_data[i];
+
+    return fd;
+}
+
+static VRotate
+init_vrotate(
+    FontData   font_data,
+    int                font_data_count,
+    int                type,
+    CodeRange  code_range,
+    int                code_range_num)
+{
+    VRotate    vrotate;
+    int                i;
+
+    if(type == VROTATE_NONE)
+       return (VRotate)NULL;
+
+    vrotate = (VRotate)Xmalloc(sizeof(VRotateRec) * font_data_count);
+    if(vrotate == (VRotate) NULL)
+       return False;
+
+    memset(vrotate, 0x00, sizeof(VRotateRec) * font_data_count);
+    for(i = 0 ; i < font_data_count ; i++) {
+       vrotate[i].charset_name = font_data[i].name;
+       vrotate[i].side = font_data[i].side;
+       if(type == VROTATE_PART) {
+           vrotate[i].num_cr = code_range_num;
+           vrotate[i].code_range = code_range;
+       }
+    }
+
+    return vrotate;
+}
+
+static Bool
+init_fontset(
+    XOC oc)
+{
+    XOCGenericPart *gen;
+    FontSet font_set;
+    OMData data;
+    int count;
+
+    count = XOM_GENERIC(oc->core.om)->data_num;
+    data = XOM_GENERIC(oc->core.om)->data;
+
+    font_set = (FontSet) Xmalloc(sizeof(FontSetRec) * count);
+    if (font_set == NULL)
+       return False;
+    memset((char *) font_set, 0x00, sizeof(FontSetRec) * count);
+
+    gen = XOC_GENERIC(oc);
+    gen->font_set_num = count;
+    gen->font_set = font_set;
+
+    for ( ; count-- > 0; data++, font_set++) {
+       font_set->charset_count = data->charset_count;
+       font_set->charset_list = data->charset_list;
+
+       if((font_set->font_data = init_fontdata(data->font_data,
+                                 data->font_data_count)) == NULL)
+           goto err;
+       font_set->font_data_count = data->font_data_count;
+       if((font_set->substitute = init_fontdata(data->substitute,
+                                  data->substitute_num)) == NULL)
+           goto err;
+       font_set->substitute_num = data->substitute_num;
+       if((font_set->vmap = init_fontdata(data->vmap,
+                            data->vmap_num)) == NULL)
+           goto err;
+       font_set->vmap_num       = data->vmap_num;
+
+       if(data->vrotate_type != VROTATE_NONE) {
+           /* A vrotate member is specified primary font data */
+           /* as initial value.                               */
+           if((font_set->vrotate = init_vrotate(data->font_data,
+                                                data->font_data_count,
+                                                data->vrotate_type,
+                                                data->vrotate,
+                                                data->vrotate_num)) == NULL)
+               goto err;
+           font_set->vrotate_num = data->font_data_count;
+       }
+    }
+    return True;
+
+err:
+    if(font_set->font_data)
+       Xfree(font_set->font_data);
+    if(font_set->substitute)
+       Xfree(font_set->substitute);
+    if(font_set->vmap)
+       Xfree(font_set->vmap);
+    if(font_set->vrotate)
+       Xfree(font_set->vrotate);
+    if(font_set)
+       Xfree(font_set);
+    gen->font_set = (FontSet) NULL;
+    gen->font_set_num = 0;
+    return False;
+}
+
+/* For VW/UDC end */
+
+static char *
+get_prop_name(
+    Display *dpy,
+    XFontStruct        *fs)
+{
+    unsigned long fp;
+
+    if (XGetFontProperty(fs, XA_FONT, &fp))
+       return XGetAtomName(dpy, fp);
+
+    return (char *) NULL;
+}
+
+/* For VW/UDC start */
+
+static Bool
+load_fontdata(
+    XOC                oc,
+    FontData   font_data,
+    int                font_data_num)
+{
+    Display    *dpy = oc->core.om->core.display;
+    FontData   fd = font_data;
+
+    if(font_data == NULL) return(True);
+    for( ; font_data_num-- ; fd++) {
+       if(fd->xlfd_name != (char *) NULL && fd->font == NULL) {
+           fd->font = XLoadQueryFont(dpy, fd->xlfd_name);
+           if (fd->font == NULL){
+               return False;
+           }
+       }
+    }
+    return True;
+}
+
+static Bool
+load_fontset_data(
+    XOC                oc,
+    FontSet    font_set)
+{
+    Display    *dpy = oc->core.om->core.display;
+
+    if(font_set->font_name == (char *)NULL) return False ;
+
+   /* If font_set->font is not NULL, it contains the *best*
+    * match font for this FontSet.
+    * -- jjw/pma (HP)
+    */
+    if(font_set->font == NULL) {
+       font_set->font = XLoadQueryFont(dpy, font_set->font_name);
+       if (font_set->font == NULL){
+               return False;
+       }
+    }
+    return True;
+}
+
+static Bool
+load_font(
+    XOC oc)
+{
+    XOCGenericPart *gen = XOC_GENERIC(oc);
+    FontSet font_set = gen->font_set;
+    int num = gen->font_set_num;
+
+    for ( ; num-- > 0; font_set++) {
+       if (font_set->font_name == NULL)
+           continue;
+
+        if (load_fontset_data (oc, font_set) != True)
+           return False;
+#ifndef TESTVERSION
+       if(load_fontdata(oc, font_set->font_data,
+                        font_set->font_data_count) != True)
+           return False;
+
+       if(load_fontdata(oc, font_set->substitute,
+                        font_set->substitute_num) != True)
+           return False;
+#endif
+
+/* Add 1996.05.20 */
+        if( oc->core.orientation == XOMOrientation_TTB_RTL ||
+            oc->core.orientation == XOMOrientation_TTB_LTR ){
+           if (font_set->vpart_initialize == 0) {
+              load_fontdata(oc, font_set->vmap, font_set->vmap_num);
+              load_fontdata(oc, (FontData) font_set->vrotate,
+                        font_set->vrotate_num);
+                font_set->vpart_initialize = 1;
+           }
+        }
+
+       if (font_set->font->min_byte1 || font_set->font->max_byte1)
+           font_set->is_xchar2b = True;
+       else
+           font_set->is_xchar2b = False;
+    }
+
+    return True;
+}
+
+/* For VW/UDC end */
+
+static Bool
+load_font_info(
+    XOC oc)
+{
+    Display *dpy = oc->core.om->core.display;
+    XOCGenericPart *gen = XOC_GENERIC(oc);
+    FontSet font_set = gen->font_set;
+    char **fn_list;
+    int fn_num, num = gen->font_set_num;
+
+    for ( ; num-- > 0; font_set++) {
+       if (font_set->font_name == NULL)
+           continue;
+
+       if (font_set->info == NULL) {
+           fn_list = XListFontsWithInfo(dpy, font_set->font_name, 1, &fn_num,
+                                        &font_set->info);
+           if (font_set->info == NULL)
+               return False;
+
+           XFreeFontNames(fn_list);
+       }
+    }
+
+    return True;
+}
+
+/* For Vertical Writing start */
+
+static void
+check_fontset_extents(
+    XCharStruct                *overall,
+    int                        *logical_ascent,
+    int                 *logical_descent,
+    XFontStruct                *font)
+{
+    overall->lbearing = min(overall->lbearing, font->min_bounds.lbearing);
+    overall->rbearing = max(overall->rbearing, font->max_bounds.rbearing);
+    overall->ascent   = max(overall->ascent,   font->max_bounds.ascent);
+    overall->descent  = max(overall->descent,  font->max_bounds.descent);
+    overall->width    = max(overall->width,    font->max_bounds.width);
+    *logical_ascent   = max(*logical_ascent,   font->ascent);
+    *logical_descent  = max(*logical_descent,  font->descent);
+}
+
+/* For Vertical Writing end */
+
+static void
+set_fontset_extents(
+    XOC oc)
+{
+    XRectangle *ink = &oc->core.font_set_extents.max_ink_extent;
+    XRectangle *logical = &oc->core.font_set_extents.max_logical_extent;
+    XFontStruct **font_list, *font;
+    XCharStruct overall;
+    int logical_ascent, logical_descent;
+    int        num = oc->core.font_info.num_font;
+
+    font_list = oc->core.font_info.font_struct_list;
+    font = *font_list++;
+    overall = font->max_bounds;
+    overall.lbearing = font->min_bounds.lbearing;
+    logical_ascent = font->ascent;
+    logical_descent = font->descent;
+
+    /* For Vertical Writing start */
+
+    while (--num > 0) {
+       font = *font_list++;
+       check_fontset_extents(&overall, &logical_ascent, &logical_descent,
+                             font);
+    }
+
+    {
+       XOCGenericPart  *gen = XOC_GENERIC(oc);
+       FontSet         font_set = gen->font_set;
+       FontData        font_data;
+       int             font_set_num = gen->font_set_num;
+       int             font_data_count;
+
+       for( ; font_set_num-- ; font_set++) {
+           if(font_set->vmap_num > 0) {
+               font_data = font_set->vmap;
+               font_data_count = font_set->vmap_num;
+               for( ; font_data_count-- ; font_data++) {
+                   if(font_data->font != NULL) {
+                       check_fontset_extents(&overall, &logical_ascent,
+                                             &logical_descent,
+                                             font_data->font);
+                   }
+               }
+           }
+
+           if(font_set->vrotate_num > 0 && font_set->vrotate != NULL) {
+               font_data = (FontData) font_set->vrotate;
+               font_data_count = font_set->vrotate_num;
+               for( ; font_data_count-- ; font_data++) {
+                   if(font_data->font != NULL) {
+                       check_fontset_extents(&overall, &logical_ascent,
+                                             &logical_descent,
+                                             font_data->font);
+                   }
+               }
+           }
+       }
+    }
+
+    /* For Vertical Writing start */
+
+    ink->x = overall.lbearing;
+    ink->y = -(overall.ascent);
+    ink->width = overall.rbearing - overall.lbearing;
+    ink->height = overall.ascent + overall.descent;
+
+    logical->x = 0;
+    logical->y = -(logical_ascent);
+    logical->width = overall.width;
+    logical->height = logical_ascent + logical_descent;
+}
+
+static Bool
+init_core_part(
+    XOC oc)
+{
+    XOCGenericPart *gen = XOC_GENERIC(oc);
+    FontSet font_set;
+    int font_set_num;
+    XFontStruct **font_struct_list;
+    char **font_name_list, *font_name_buf;
+    int        count, length;
+
+    font_set = gen->font_set;
+    font_set_num = gen->font_set_num;
+    count = length = 0;
+
+    for ( ; font_set_num-- > 0; font_set++) {
+       if (font_set->font_name == NULL)
+           continue;
+
+       length += strlen(font_set->font_name) + 1;
+
+       count++;
+    }
+    if (count == 0)
+        return False;
+
+    font_struct_list = (XFontStruct **) Xmalloc(sizeof(XFontStruct *) * count);
+    if (font_struct_list == NULL)
+       return False;
+
+    font_name_list = (char **) Xmalloc(sizeof(char *) * count);
+    if (font_name_list == NULL)
+       goto err;
+
+    font_name_buf = (char *) Xmalloc(length);
+    if (font_name_buf == NULL)
+       goto err;
+
+    oc->core.font_info.num_font = count;
+    oc->core.font_info.font_name_list = font_name_list;
+    oc->core.font_info.font_struct_list = font_struct_list;
+
+    font_set = gen->font_set;
+    font_set_num = gen->font_set_num;
+
+    for (count = 0; font_set_num-- > 0; font_set++) {
+       if (font_set->font_name == NULL)
+           continue;
+
+       font_set->id = count;
+       if (font_set->font)
+           *font_struct_list++ = font_set->font;
+       else
+           *font_struct_list++ = font_set->info;
+       strcpy(font_name_buf, font_set->font_name);
+       Xfree(font_set->font_name);
+       *font_name_list++ = font_set->font_name = font_name_buf;
+       font_name_buf += strlen(font_name_buf) + 1;
+
+       count++;
+    }
+
+    set_fontset_extents(oc);
+
+    return True;
+
+err:
+    if (font_name_list)
+       Xfree(font_name_list);
+    Xfree(font_struct_list);
+
+    return False;
+}
+
+static char *
+get_font_name(
+    XOC oc,
+    char *pattern)
+{
+    char **list, *name;
+    int count = 0;
+
+    list = XListFonts(oc->core.om->core.display, pattern, 1, &count);
+    if (list == NULL)
+       return NULL;
+
+    name = strdup(*list);
+
+    XFreeFontNames(list);
+
+    return name;
+}
+
+/* For VW/UDC start*/
+
+static char *
+get_rotate_fontname(
+    char *font_name)
+{
+    char *pattern = NULL, *ptr = NULL;
+    char *fields[CHARSET_ENCODING_FIELD];
+    char str_pixel[32], str_point[4];
+    char *rotate_font_ptr = NULL;
+    int pixel_size = 0;
+    int field_num = 0, len = 0;
+
+    if(font_name == (char *) NULL || (len = strlen(font_name)) <= 0
+       || len > XLFD_MAX_LEN)
+       return NULL;
+
+    pattern = strdup(font_name);
+    if(!pattern)
+       return NULL;
+
+    memset(fields, 0, sizeof(char *) * 14);
+    ptr = pattern;
+    while(isspace(*ptr)) {
+       ptr++;
+    }
+    if(*ptr == '-')
+       ptr++;
+
+    for(field_num = 0 ; field_num < CHARSET_ENCODING_FIELD && ptr && *ptr ;
+                       ptr++, field_num++) {
+       fields[field_num] = ptr;
+
+       if((ptr = strchr(ptr, '-'))) {
+           *ptr = '\0';
+       } else {
+           field_num++;        /* Count last field */
+           break;
+       }
+    }
+
+    if(field_num < CHARSET_ENCODING_FIELD)
+       goto free_pattern;
+
+    /* Pixel Size field : fields[6] */
+    for(ptr = fields[PIXEL_SIZE_FIELD - 1] ; ptr && *ptr; ptr++) {
+       if(!isdigit(*ptr)) {
+           if(*ptr == '['){ /* 960730 */
+               strcpy(pattern, font_name);
+               return(pattern);
+           }
+           goto free_pattern;
+       }
+    }
+    pixel_size = atoi(fields[PIXEL_SIZE_FIELD - 1]);
+    sprintf(str_pixel, "[ 0 ~%d %d 0 ]", pixel_size, pixel_size);
+    fields[6] = str_pixel;
+
+    /* Point Size field : fields[7] */
+    strcpy(str_point, "*");
+    fields[POINT_SIZE_FIELD - 1] = str_point;
+
+    len = 0;
+    for (field_num = 0; field_num < CHARSET_ENCODING_FIELD &&
+                       fields[field_num]; field_num++) {
+       len += 1 + strlen(fields[field_num]);
+    }
+
+    /* Max XLFD length is 255 */
+    if (len > XLFD_MAX_LEN)
+       goto free_pattern;
+
+    rotate_font_ptr = (char *)Xmalloc(len + 1);
+    if(!rotate_font_ptr)
+       goto free_pattern;
+
+    rotate_font_ptr[0] = '\0';
+
+    for(field_num = 0 ; field_num < CHARSET_ENCODING_FIELD &&
+                       fields[field_num] ; field_num++) {
+       strcat(rotate_font_ptr, "-");
+       strcat(rotate_font_ptr, fields[field_num]);
+    }
+
+free_pattern:
+    Xfree(pattern);
+
+    return rotate_font_ptr;
+}
+
+static Bool
+is_match_charset(
+    FontData   font_data,
+    char       *font_name)
+{
+    char *last;
+    int length, name_len;
+
+    name_len = strlen(font_name);
+    last = font_name + name_len;
+
+    length = strlen(font_data->name);
+    if (length > name_len)
+       return False;
+
+    if (_XlcCompareISOLatin1(last - length, font_data->name) == 0)
+       return True;
+
+    return False;
+}
+
+#if 0
+static char *
+get_font_name_from_list(
+    XOC oc,
+    char *pattern,
+    FontData    font_data)
+{
+    char **list, *name = (char *)NULL, *fname;
+    int count = 0, i;
+
+    list = XListFonts(oc->core.om->core.display, pattern, MAXFONTS, &count);
+    if (list == NULL)
+       return NULL;
+
+    for (i = 0; i < count; i++) {
+        fname = list[i];
+        if(is_match_charset(font_data, fname) == True) {
+            name = strdup(fname);
+            break;
+        }
+    }
+
+    XFreeFontNames(list);
+
+    return name;
+}
+#endif
+
+static int
+parse_all_name(
+    XOC                oc,
+    FontData   font_data,
+    char       *pattern)
+{
+
+#ifdef OLDCODE
+    if(is_match_charset(font_data, pattern) != True)
+       return False;
+
+    font_data->xlfd_name = strdup(pattern);
+    if(font_data->xlfd_name == NULL)
+       return (-1);
+
+    return True;
+#else  /* OLDCODE */
+    Display *dpy = oc->core.om->core.display;
+    char **fn_list = NULL, *prop_fname = NULL;
+    int list_num;
+    XFontStruct *fs_list;
+    if(is_match_charset(font_data, pattern) != True) {
+       /*
+        * pattern should not contain any wildcard (execpt '?')
+        * this was probably added to make this case insensitive.
+        */
+       if ((fn_list = XListFontsWithInfo(dpy, pattern,
+                                     MAXFONTS,
+                                     &list_num, &fs_list)) == NULL) {
+            return False;
+        }
+       /* shouldn't we loop here ? */
+        else if ((prop_fname = get_prop_name(dpy, fs_list)) == NULL) {
+            XFreeFontInfo(fn_list, fs_list, list_num);
+            return False;
+        }
+        else if ((is_match_charset(font_data, prop_fname) != True)) {
+            XFree(prop_fname);
+            XFreeFontInfo(fn_list, fs_list, list_num);
+            return False;
+        }
+        else {
+           font_data->xlfd_name = prop_fname;
+            XFreeFontInfo(fn_list, fs_list, list_num);
+            return True;
+        }
+    }
+
+    font_data->xlfd_name = strdup(pattern);
+    if(font_data->xlfd_name == NULL)
+       return (-1);
+
+    return True;
+#endif /* OLDCODE */
+}
+
+static int
+parse_omit_name(
+    XOC                oc,
+    FontData   font_data,
+    char       *pattern)
+{
+    char*      last = (char *) NULL;
+    char*      base_name;
+    char       buf[XLFD_MAX_LEN + 1];
+    int                length = 0;
+    int                num_fields;
+   /*
+    * If the font specified by "pattern" is expandable to be
+    * a member of "font_data"'s FontSet, we've found a match.
+    */
+    if(is_match_charset(font_data, pattern) == True) {
+       if ((font_data->xlfd_name = get_font_name(oc, pattern)) != NULL) {
+           return True;
+       }
+    }
+
+    length = strlen (pattern);
+
+    if (length > XLFD_MAX_LEN)
+       return -1;
+
+    strcpy(buf, pattern);
+    last = buf + length - 1;
+
+    /* Replace the original encoding with the encoding for this FontSet. */
+
+    /* Figure out how many fields have been specified in this xlfd. */
+    for (num_fields = 0, base_name = buf; *base_name != '\0'; base_name++)
+       if (*base_name == '-') num_fields++;
+
+    switch (num_fields) {
+    case 12:
+       /* This is the best way to have specifed the fontset.  In this
+        * case, there is no original encoding. E.g.,
+         *       -*-*-*-*-*-*-14-*-*-*-*-*
+        * To this, we'll append a dash:
+         *       -*-*-*-*-*-*-14-*-*-*-*-*-
+        * then append the encoding to get:
+         *       -*-*-*-*-*-*-14-*-*-*-*-*-JISX0208.1990-0
+        */
+       /*
+        * Take care of:
+        *       -*-*-*-*-*-*-14-*-*-*-*-
+        */
+       if (*(last) == '-')
+           *++last = '*';
+
+       *++last = '-';
+       break;
+    case 13:
+       /* Got the charset, not the encoding, zap the charset  In this
+        * case, there is no original encoding, but there is a charset. E.g.,
+         *       -*-*-*-*-*-*-14-*-*-*-*-*-jisx0212.1990
+        * To this, we remove the charset:
+         *       -*-*-*-*-*-*-14-*-*-*-*-*-
+        * then append the new encoding to get:
+         *       -*-*-*-*-*-*-14-*-*-*-*-*-JISX0208.1990-0
+        */
+       last = strrchr (buf, '-');
+       num_fields = 12;
+       break;
+    case 14:
+       /* Both the charset and the encoding are specified.  Get rid
+        * of them so that we can append the new charset encoding.  E.g.,
+         *       -*-*-*-*-*-*-14-*-*-*-*-*-jisx0212.1990-0
+        * To this, we'll remove the encoding and charset to get:
+         *       -*-*-*-*-*-*-14-*-*-*-*-*-
+        * then append the new encoding to get:
+         *       -*-*-*-*-*-*-14-*-*-*-*-*-JISX0208.1990-0
+        */
+       last = strrchr (buf, '-');
+       *last = '\0';
+       last = strrchr (buf, '-');
+       num_fields = 12;
+       break;
+    default:
+       if (*last != '-')
+           *++last = '-';
+       break;
+    }
+
+   /* At this point, "last" is pointing to the last "-" in the
+    * xlfd, and all xlfd's at this point take a form similar to:
+    *       -*-*-*-*-*-*-14-*-*-*-*-*-
+    * (i.e., no encoding).
+    * After the strcpy, we'll end up with something similar to:
+    *       -*-*-*-*-*-*-14-*-*-*-*-*-JISX0208.1990-0
+    *
+    * If the modified font is found in the current FontSet,
+    * we've found a match.
+    */
+
+    last++;
+
+    if ((last - buf) + strlen(font_data->name) > XLFD_MAX_LEN)
+       return -1;
+
+    strcpy(last, font_data->name);
+    if ((font_data->xlfd_name = get_font_name(oc, buf)) != NULL)
+       return True;
+
+    /* This may mot be needed anymore as XListFonts() takes care of this */
+    while (num_fields < 12) {
+       if ((last - buf) > (XLFD_MAX_LEN - 2))
+           return -1;
+       *last = '*';
+       *(last + 1) = '-';
+       strcpy(last + 2, font_data->name);
+       num_fields++;
+       last+=2;
+       if ((font_data->xlfd_name = get_font_name(oc, buf)) != NULL)
+           return True;
+    }
+
+
+    return False;
+}
+
+
+typedef enum{C_PRIMARY, C_SUBSTITUTE, C_VMAP, C_VROTATE } ClassType;
+
+static int
+parse_fontdata(
+    XOC                 oc,
+    FontSet      font_set,
+    FontData    font_data,
+    int                 font_data_count,
+    char        **name_list,
+    int                 name_list_count,
+    ClassType   class,
+    FontDataRec *font_data_return)
+{
+
+    char       **cur_name_list = name_list;
+    char       *font_name      = (char *) NULL;
+    char       *pattern        = (char *) NULL;
+    int                found_num       = 0, ret = 0;
+    int                count           = name_list_count;
+
+    if(name_list == NULL || count <= 0) {
+       return False;
+    }
+
+    if(font_data == NULL || font_data_count <= 0) {
+       return False;
+    }
+
+    /* Loop through each font encoding defined in the "font_data" FontSet. */
+    for ( ; font_data_count-- > 0; font_data++) {
+       Bool    is_found = False;
+       font_name = (char *) NULL;
+       count = name_list_count;
+       cur_name_list = name_list;
+
+       /*
+       * Loop through each font specified by the user
+       * in the call to XCreateFontset().
+       */
+       while (count-- > 0) {
+            pattern = *cur_name_list++;
+           if (pattern == NULL || *pattern == '\0')
+               continue;
+#ifdef FONTDEBUG
+               fprintf(stderr,"Font pattern: %s %s\n",
+               pattern,font_data->name);
+#endif
+
+           /*
+            * If the current font is fully specified (i.e., the
+            * xlfd contains no wildcards) and the font exists on
+            * the X Server, we have a match.
+            */
+           if (strchr(pattern, '*') == NULL &&
+               (font_name = get_font_name(oc, pattern))) {
+               /*
+               * Find the full xlfd name for this font. If the font is
+               * already in xlfd format, it is simply returned.  If the
+               * font is an alias for another font, the xlfd of the
+               * aliased font is returned.
+               */
+               ret = parse_all_name(oc, font_data, font_name);
+               Xfree(font_name);
+
+                if (ret == -1)    return -1;
+               if (ret == False) continue;
+               /*
+               * Since there was an exact match of a fully-specified font
+               * or a font alias, we can return now since the desired font
+               * was found for the current font encoding for this FontSet.
+               *
+               * Previous implementations of this algorithm would
+               * not return here. Instead, they continued searching
+               * through the font encodings for this FontSet. The side-effect
+               * of that behavior is you may return a "substitute" match
+               * instead of an "exact" match.  We believe there should be a
+               * preference on exact matches.  Therefore, as soon as we
+               * find one, we bail.
+               *
+               * Also, previous implementations seemed to think it was
+               * important to find either a primary or substitute font
+               * for each Font encoding in the FontSet before returning an
+               * acceptable font.  We don't believe this is necessary.
+               * All the client cares about is finding a reasonable font
+               * for what was passed in.  If we find an exact match,
+               * there's no reason to look any further.
+               *
+               * -- jjw/pma (HP)
+               */
+               if (font_data_return) {
+                   font_data_return->xlfd_name = strdup(font_data->xlfd_name);
+                   if (!font_data_return->xlfd_name) return -1;
+
+                   font_data_return->side      = font_data->side;
+               }
+#ifdef FONTDEBUG
+               fprintf(stderr,"XLFD name: %s\n",font_data->xlfd_name);
+#endif
+
+               return True;
+           }
+           /*
+            * If the font name is not fully specified
+            * (i.e., it has wildcards), we have more work to do.
+            * See the comments in parse_omit_name()
+            * for the list of things to do.
+            */
+           ret = parse_omit_name(oc, font_data, pattern);
+
+            if (ret == -1)    return -1;
+           if (ret == False) continue;
+
+           /*
+           * A font which matched the wild-carded specification was found.
+           * Only update the return data if a font has not yet been found.
+           * This maintains the convention that FontSets listed higher in
+           * a CodeSet in the Locale Database have higher priority than
+           * those FontSets listed lower in the CodeSet.  In the following
+           * example:
+           *
+           * fs1 {
+           *        charset     HP-JIS:GR
+           *        font        JISX0208.1990-0:GL;\
+           *                    JISX0208.1990-1:GR;\
+           *                    JISX0208.1983-0:GL;\
+           *                    JISX0208.1983-1:GR
+           * }
+           *
+           * a font found in the JISX0208.1990-0 FontSet will have a
+           * higher priority than a font found in the JISX0208.1983-0
+           * FontSet.
+           */
+           if (font_data_return && font_data_return->xlfd_name == NULL) {
+
+#ifdef FONTDEBUG
+               fprintf(stderr,"XLFD name: %s\n",font_data->xlfd_name);
+#endif
+               font_data_return->xlfd_name = strdup(font_data->xlfd_name);
+                if (!font_data_return->xlfd_name) return -1;
+
+               font_data_return->side      = font_data->side;
+           }
+
+           found_num++;
+           is_found = True;
+
+           break;
+       }
+
+       switch(class) {
+         case C_PRIMARY:
+              if(is_found == False) {
+                /*
+                 * Did not find a font for the current FontSet.  Check the
+                 * FontSet's "substitute" font for a match.  If we find a
+                 * match, we'll keep searching in hopes of finding an exact
+                 * match later down the FontSet list.
+                 *
+                 * when we return and we have found a font font_data_return
+                 * contains the first (ie. best) match no matter if this
+                 * is a C_PRIMARY or a C_SUBSTITUTE font
+                 */
+                 ret = parse_fontdata(oc, font_set, font_set->substitute,
+                                      font_set->substitute_num, name_list,
+                                      name_list_count, C_SUBSTITUTE,
+                                      font_data_return);
+                  if (ret == -1)    return -1;
+                 if (ret == False) continue;
+
+                 found_num++;
+                 is_found = True;
+               }
+#ifdef TESTVERSION
+              else
+                  return True;
+#endif
+              break;
+
+         case C_SUBSTITUTE:
+         case C_VMAP:
+              if(is_found == True)
+                 return True;
+              break;
+
+         case C_VROTATE:
+              if(is_found == True) {
+                 char  *rotate_name;
+
+                 if((rotate_name = get_rotate_fontname(font_data->xlfd_name))
+                    != NULL) {
+                     Xfree(font_data->xlfd_name);
+                     font_data->xlfd_name = rotate_name;
+
+                     return True;
+                 }
+                 Xfree(font_data->xlfd_name);
+                 font_data->xlfd_name = NULL;
+                 return False;
+              }
+              break;
+       }
+    }
+
+    if(class == C_PRIMARY && found_num >= 1)
+       return True;
+
+    return False;
+}
+
+
+static int
+parse_vw(
+    XOC                oc,
+    FontSet    font_set,
+    char       **name_list,
+    int                count)
+{
+    FontData   vmap = font_set->vmap;
+    VRotate    vrotate = font_set->vrotate;
+    int                vmap_num = font_set->vmap_num;
+    int                vrotate_num = font_set->vrotate_num;
+    int                ret = 0, i = 0;
+
+    if(vmap_num > 0) {
+       if(parse_fontdata(oc, font_set, vmap, vmap_num, name_list,
+                         count, C_VMAP,NULL) == -1)
+           return (-1);
+    }
+
+    if(vrotate_num > 0) {
+       ret = parse_fontdata(oc, font_set, (FontData) vrotate, vrotate_num,
+                            name_list, count, C_VROTATE, NULL);
+       if(ret == -1) {
+           return (-1);
+       } else if(ret == False) {
+           CodeRange   code_range;
+           int         num_cr;
+           int         sub_num = font_set->substitute_num;
+
+           code_range = vrotate[0].code_range; /* ? */
+           num_cr = vrotate[0].num_cr;         /* ? */
+           for(i = 0 ; i < vrotate_num ; i++) {
+               if(vrotate[i].xlfd_name)
+                   Xfree(vrotate[i].xlfd_name);
+           }
+           Xfree(vrotate);
+
+           if(sub_num > 0) {
+               vrotate = font_set->vrotate = (VRotate)Xmalloc
+                                               (sizeof(VRotateRec) * sub_num);
+               if(font_set->vrotate == (VRotate)NULL)
+                   return (-1);
+               memset(font_set->vrotate, 0x00, sizeof(VRotateRec) * sub_num);
+
+               for(i = 0 ; i < sub_num ; i++) {
+                   vrotate[i].charset_name = font_set->substitute[i].name;
+                   vrotate[i].side = font_set->substitute[i].side;
+                   vrotate[i].code_range = code_range;
+                   vrotate[i].num_cr = num_cr;
+               }
+               vrotate_num = font_set->vrotate_num = sub_num;
+           } else {
+               vrotate = font_set->vrotate = (VRotate)NULL;
+           }
+
+           ret = parse_fontdata(oc, font_set, (FontData) vrotate, vrotate_num,
+                                name_list, count, C_VROTATE, NULL);
+           if(ret == -1)
+               return (-1);
+       }
+    }
+
+    return True;
+}
+
+static int
+parse_fontname(
+    XOC oc)
+{
+    XOCGenericPart *gen = XOC_GENERIC(oc);
+    FontSet     font_set;
+    FontDataRec font_data_return;
+    char *base_name, **name_list;
+    int font_set_num = 0;
+    int found_num = 0;
+    int count = 0;
+    int        ret;
+    int i;
+
+    name_list = _XParseBaseFontNameList(oc->core.base_name_list, &count);
+    if (name_list == NULL)
+       return -1;
+
+    font_set = gen->font_set;
+    font_set_num = gen->font_set_num;
+
+   /* Loop through all of the CharSets defined in the Locale
+    * database for the current Locale.
+    */
+    for( ; font_set_num-- > 0 ; font_set++) {
+       if(font_set->font_name)
+           continue;
+
+       if(font_set->font_data_count > 0) {
+
+           /*
+           * If there are a non-zero number of FontSets defined
+           * for this CharSet.
+            * Try to find a font for this CharSet.  If we find an
+           * acceptable font, we save the information for return
+           * to the client.  If we do not find an acceptable font,
+           * a "missing_charset" will be reported to the client
+           * for this CharSet.
+           */
+           font_data_return. xlfd_name = NULL;
+           font_data_return.side       = XlcUnknown;
+
+           ret = parse_fontdata(oc, font_set, font_set->font_data,
+                                font_set->font_data_count,
+                                name_list, count, C_PRIMARY,
+                                &font_data_return);
+           if(ret == -1) {
+               goto err;
+           } else if(ret == True) {
+               /*
+                * We can't just loop thru fontset->font_data to
+                * find the first (ie. best) match: parse_fontdata
+                * will try a substitute font if no primary one could
+                * be matched. It returns the required information in
+                * font_data_return.
+                */
+               font_set->font_name = strdup(font_data_return.xlfd_name);
+               if(font_set->font_name == (char *) NULL)
+                   goto err;
+
+               font_set->side = font_data_return.side;
+
+                Xfree (font_data_return.xlfd_name);
+                font_data_return.xlfd_name = NULL;
+
+               if(parse_vw(oc, font_set, name_list, count) == -1)
+                   goto err;
+               found_num++;
+           }
+
+       } else if(font_set->substitute_num > 0) {
+           /*
+           * If there are no FontSets defined for this
+           * CharSet.  We can only find "substitute" fonts.
+           */
+           ret = parse_fontdata(oc, font_set, font_set->substitute,
+                                font_set->substitute_num,
+                                name_list, count, C_SUBSTITUTE, NULL);
+           if(ret == -1) {
+               goto err;
+           } else if(ret == True) {
+               for(i=0;i<font_set->substitute_num;i++){
+                   if(font_set->substitute[i].xlfd_name != NULL){
+                       break;
+                   }
+               }
+               font_set->font_name = strdup(font_set->substitute[i].xlfd_name);
+               if(font_set->font_name == (char *) NULL)
+                   goto err;
+
+               font_set->side = font_set->substitute[i].side;
+               if(parse_vw(oc, font_set, name_list, count) == -1)
+                   goto err;
+
+               found_num++;
+           }
+       }
+    }
+
+    base_name = strdup(oc->core.base_name_list);
+    if (base_name == NULL)
+       goto err;
+
+    oc->core.base_name_list = base_name;
+
+    XFreeStringList(name_list);
+
+    return found_num;
+
+err:
+    XFreeStringList(name_list);
+    /* Prevent this from being freed twice */
+    oc->core.base_name_list = NULL;
+
+    return -1;
+}
+
+/* For VW/UDC end*/
+
+static Bool
+set_missing_list(
+    XOC oc)
+{
+    XOCGenericPart *gen = XOC_GENERIC(oc);
+    FontSet font_set;
+    char **charset_list, *charset_buf;
+    int        count, length, font_set_num;
+    int result = 1;
+
+    font_set = gen->font_set;
+    font_set_num = gen->font_set_num;
+    count = length = 0;
+
+    for ( ; font_set_num-- > 0; font_set++) {
+       if (font_set->info || font_set->font) {
+           continue;
+       }
+
+       /* Change 1996.01.23 start */
+       if(font_set->font_data_count <= 0 ||
+          font_set->font_data == (FontData)NULL) {
+           if(font_set->substitute_num <= 0 ||
+              font_set->substitute == (FontData)NULL) {
+               if(font_set->charset_list != NULL){
+                length +=
+                 strlen(font_set->charset_list[0]->encoding_name) + 1;
+               } else {
+                 length += 1;
+               }
+           } else {
+               length += strlen(font_set->substitute->name) + 1;
+           }
+       } else {
+           length += strlen(font_set->font_data->name) + 1;
+       }
+       /* Change 1996.01.23 end */
+       count++;
+    }
+
+    if (count < 1) {
+       return True;
+    }
+
+    charset_list = (char **) Xmalloc(sizeof(char *) * count);
+    if (charset_list == NULL) {
+       return False;
+    }
+
+    charset_buf = (char *) Xmalloc(length);
+    if (charset_buf == NULL) {
+       Xfree(charset_list);
+       return False;
+    }
+
+    oc->core.missing_list.charset_list = charset_list;
+    oc->core.missing_list.charset_count = count;
+
+    font_set = gen->font_set;
+    font_set_num = gen->font_set_num;
+
+    for ( ; font_set_num-- > 0; font_set++) {
+       if (font_set->info || font_set->font) {
+           continue;
+       }
+
+       /* Change 1996.01.23 start */
+       if(font_set->font_data_count <= 0 ||
+          font_set->font_data == (FontData)NULL) {
+           if(font_set->substitute_num <= 0 ||
+              font_set->substitute == (FontData)NULL) {
+               if(font_set->charset_list != NULL){
+                strcpy(charset_buf,
+                       font_set->charset_list[0]->encoding_name);
+               } else {
+                strcpy(charset_buf, "");
+               }
+               result = 0;
+           } else {
+               strcpy(charset_buf, font_set->substitute->name);
+           }
+       } else {
+           strcpy(charset_buf, font_set->font_data->name);
+       }
+       /* Change 1996.01.23 end */
+       *charset_list++ = charset_buf;
+       charset_buf += strlen(charset_buf) + 1;
+    }
+
+    if(result == 0) {
+       return(False);
+    }
+
+    return True;
+}
+
+static Bool
+create_fontset(
+    XOC oc)
+{
+    XOMGenericPart *gen = XOM_GENERIC(oc->core.om);
+    int found_num;
+
+    if (init_fontset(oc) == False)
+        return False;
+
+    found_num = parse_fontname(oc);
+    if (found_num <= 0) {
+       if (found_num == 0)
+           set_missing_list(oc);
+       return False;
+    }
+
+    if (gen->on_demand_loading == True) {
+       if (load_font_info(oc) == False)
+           return False;
+    } else {
+       if (load_font(oc) == False)
+           return False;
+    }
+
+    if (init_core_part(oc) == False)
+       return False;
+
+    if (set_missing_list(oc) == False)
+       return False;
+
+    return True;
+}
+
+/* For VW/UDC start */
+static void
+free_fontdataOC(
+    Display    *dpy,
+    FontData   font_data,
+    int                font_data_count)
+{
+    for( ; font_data_count-- ; font_data++) {
+       if(font_data->xlfd_name){
+           Xfree(font_data->xlfd_name);
+           font_data->xlfd_name = NULL;
+       }
+       if(font_data->font){                            /* ADD 1996.01.7 */
+           if(font_data->font->fid)                    /* Add 1996.01.23 */
+               XFreeFont(dpy,font_data->font);         /* ADD 1996.01.7 */
+           else                                        /* Add 1996.01.23 */
+               XFreeFontInfo(NULL, font_data->font, 1);/* Add 1996.01.23 */
+           font_data->font = NULL;
+       }
+/*
+ * font_data->name and font_data->scopes belong to the OM not OC.
+ * To save space this data is shared between OM and OC. We are
+ * not allowed to free it here.
+ * It has been moved to free_fontdataOM()
+ */
+/*
+       if(font_data->scopes){
+           Xfree(font_data->scopes);
+           font_data->scopes = NULL;
+       }
+       if(font_data->name){
+           Xfree(font_data->name);
+           font_data->name = NULL;
+       }
+*/
+    }
+}
+
+static void destroy_fontdata(
+    XOCGenericPart *gen,
+    Display *dpy)
+{
+    FontSet    font_set = (FontSet) NULL;
+    int                font_set_num = 0;
+
+    if (gen->font_set) {
+       font_set = gen->font_set;
+       font_set_num = gen->font_set_num;
+       for( ; font_set_num-- ; font_set++) {
+           if (font_set->font) {
+               if(font_set->font->fid)
+                   XFreeFont(dpy,font_set->font);
+               else
+                   XFreeFontInfo(NULL, font_set->font, 1);
+               font_set->font = NULL;
+           }
+           if(font_set->font_data) {
+               if (font_set->info)
+                   XFreeFontInfo(NULL, font_set->info, 1);
+               free_fontdataOC(dpy,
+                       font_set->font_data, font_set->font_data_count);
+               Xfree(font_set->font_data);
+               font_set->font_data = NULL;
+           }
+           if(font_set->substitute) {
+               free_fontdataOC(dpy,
+                       font_set->substitute, font_set->substitute_num);
+               Xfree(font_set->substitute);
+               font_set->substitute = NULL;
+           }
+           if(font_set->vmap) {
+               free_fontdataOC(dpy,
+                       font_set->vmap, font_set->vmap_num);
+               Xfree(font_set->vmap);
+               font_set->vmap = NULL;
+           }
+           if(font_set->vrotate) {
+               free_fontdataOC(dpy,
+                       (FontData)font_set->vrotate,
+                             font_set->vrotate_num);
+               Xfree(font_set->vrotate);
+               font_set->vrotate = NULL;
+           }
+       }
+       Xfree(gen->font_set);
+       gen->font_set = NULL;
+    }
+}
+/* For VW/UDC end */
+
+static void
+destroy_oc(
+    XOC oc)
+{
+    Display *dpy = oc->core.om->core.display;
+    XOCGenericPart *gen = XOC_GENERIC(oc);
+
+    if (gen->mbs_to_cs)
+       _XlcCloseConverter(gen->mbs_to_cs);
+
+    if (gen->wcs_to_cs)
+       _XlcCloseConverter(gen->wcs_to_cs);
+
+    if (gen->utf8_to_cs)
+       _XlcCloseConverter(gen->utf8_to_cs);
+
+/* For VW/UDC start */ /* Change 1996.01.8 */
+    destroy_fontdata(gen,dpy);
+/*
+*/
+/* For VW/UDC end */
+
+    if (oc->core.base_name_list)
+       Xfree(oc->core.base_name_list);
+
+    if (oc->core.font_info.font_name_list)
+       XFreeStringList(oc->core.font_info.font_name_list);
+
+    if (oc->core.font_info.font_struct_list) {
+       Xfree(oc->core.font_info.font_struct_list);
+    }
+
+    if (oc->core.missing_list.charset_list)
+       XFreeStringList(oc->core.missing_list.charset_list);
+
+#ifdef notdef
+    if (oc->core.res_name)
+       Xfree(oc->core.res_name);
+    if (oc->core.res_class)
+       Xfree(oc->core.res_class);
+#endif
+
+    Xfree(oc);
+}
+
+static char *
+set_oc_values(
+    XOC oc,
+    XlcArgList args,
+    int num_args)
+{
+    XOCGenericPart *gen = XOC_GENERIC(oc);
+    FontSet font_set = gen->font_set;
+    char *ret;
+    int num = gen->font_set_num;
+
+    if (oc->core.resources == NULL)
+       return NULL;
+
+    ret = _XlcSetValues((XPointer) oc, oc->core.resources,
+                       oc->core.num_resources, args, num_args, XlcSetMask);
+    if(ret != NULL){
+       return(ret);
+    } else {
+       for ( ; num-- > 0; font_set++) {
+           if (font_set->font_name == NULL)
+               continue;
+           if (font_set->vpart_initialize != 0)
+               continue;
+           if( oc->core.orientation == XOMOrientation_TTB_RTL ||
+               oc->core.orientation == XOMOrientation_TTB_LTR ){
+               load_fontdata(oc, font_set->vmap, font_set->vmap_num);
+               load_fontdata(oc, (FontData) font_set->vrotate,
+                           font_set->vrotate_num);
+               font_set->vpart_initialize = 1;
+           }
+       }
+       return(NULL);
+    }
+}
+
+static char *
+get_oc_values(
+    XOC oc,
+    XlcArgList args,
+    int num_args)
+{
+    if (oc->core.resources == NULL)
+       return NULL;
+
+    return _XlcGetValues((XPointer) oc, oc->core.resources,
+                        oc->core.num_resources, args, num_args, XlcGetMask);
+}
+
+static XOCMethodsRec oc_default_methods = {
+    destroy_oc,
+    set_oc_values,
+    get_oc_values,
+    _XmbDefaultTextEscapement,
+    _XmbDefaultTextExtents,
+    _XmbDefaultTextPerCharExtents,
+    _XmbDefaultDrawString,
+    _XmbDefaultDrawImageString,
+    _XwcDefaultTextEscapement,
+    _XwcDefaultTextExtents,
+    _XwcDefaultTextPerCharExtents,
+    _XwcDefaultDrawString,
+    _XwcDefaultDrawImageString,
+    _Xutf8DefaultTextEscapement,
+    _Xutf8DefaultTextExtents,
+    _Xutf8DefaultTextPerCharExtents,
+    _Xutf8DefaultDrawString,
+    _Xutf8DefaultDrawImageString
+};
+
+static XOCMethodsRec oc_generic_methods = {
+    destroy_oc,
+    set_oc_values,
+    get_oc_values,
+    _XmbGenericTextEscapement,
+    _XmbGenericTextExtents,
+    _XmbGenericTextPerCharExtents,
+    _XmbGenericDrawString,
+    _XmbGenericDrawImageString,
+    _XwcGenericTextEscapement,
+    _XwcGenericTextExtents,
+    _XwcGenericTextPerCharExtents,
+    _XwcGenericDrawString,
+    _XwcGenericDrawImageString,
+    _Xutf8GenericTextEscapement,
+    _Xutf8GenericTextExtents,
+    _Xutf8GenericTextPerCharExtents,
+    _Xutf8GenericDrawString,
+    _Xutf8GenericDrawImageString
+};
+
+typedef struct _XOCMethodsListRec {
+    const char *name;
+    XOCMethods methods;
+} XOCMethodsListRec, *XOCMethodsList;
+
+static XOCMethodsListRec oc_methods_list[] = {
+    { "default", &oc_default_methods },
+    { "generic", &oc_generic_methods }
+};
+
+static XlcResource oc_resources[] = {
+    { XNBaseFontName, NULLQUARK, sizeof(char *),
+      XOffsetOf(XOCRec, core.base_name_list), XlcCreateMask | XlcGetMask },
+    { XNOMAutomatic, NULLQUARK, sizeof(Bool),
+      XOffsetOf(XOCRec, core.om_automatic), XlcGetMask },
+    { XNMissingCharSet, NULLQUARK, sizeof(XOMCharSetList),
+      XOffsetOf(XOCRec, core.missing_list), XlcGetMask },
+    { XNDefaultString, NULLQUARK, sizeof(char *),
+      XOffsetOf(XOCRec, core.default_string), XlcGetMask },
+    { XNOrientation, NULLQUARK, sizeof(XOrientation),
+      XOffsetOf(XOCRec, core.orientation), XlcDefaultMask | XlcSetMask | XlcGetMask },
+    { XNResourceName, NULLQUARK, sizeof(char *),
+      XOffsetOf(XOCRec, core.res_name), XlcSetMask | XlcGetMask },
+    { XNResourceClass, NULLQUARK, sizeof(char *),
+      XOffsetOf(XOCRec, core.res_class), XlcSetMask | XlcGetMask },
+    { XNFontInfo, NULLQUARK, sizeof(XOMFontInfo),
+      XOffsetOf(XOCRec, core.font_info), XlcGetMask }
+};
+
+static XOC
+create_oc(
+    XOM om,
+    XlcArgList args,
+    int num_args)
+{
+    XOC oc;
+    XOMGenericPart *gen = XOM_GENERIC(om);
+    XOCMethodsList methods_list = oc_methods_list;
+    int count;
+
+    oc = Xcalloc(1, sizeof(XOCGenericRec));
+    if (oc == NULL)
+       return (XOC) NULL;
+
+    oc->core.om = om;
+
+    if (oc_resources[0].xrm_name == NULLQUARK)
+       _XlcCompileResourceList(oc_resources, XlcNumber(oc_resources));
+
+    if (_XlcSetValues((XPointer) oc, oc_resources, XlcNumber(oc_resources),
+                     args, num_args, XlcCreateMask | XlcDefaultMask))
+       goto err;
+
+    if (oc->core.base_name_list == NULL)
+       goto err;
+
+    oc->core.resources = oc_resources;
+    oc->core.num_resources = XlcNumber(oc_resources);
+
+    if (create_fontset(oc) == False)
+       goto err;
+
+    oc->methods = &oc_generic_methods;
+
+    if (gen->object_name) {
+       count = XlcNumber(oc_methods_list);
+
+       for ( ; count-- > 0; methods_list++) {
+           if (!_XlcCompareISOLatin1(gen->object_name, methods_list->name)) {
+               oc->methods = methods_list->methods;
+               break;
+           }
+       }
+    }
+
+    return oc;
+
+err:
+    destroy_oc(oc);
+
+    return (XOC) NULL;
+}
+
+static void
+free_fontdataOM(
+    FontData   font_data,
+    int                font_data_count)
+{
+    for( ; font_data_count-- ; font_data++) {
+       if(font_data->name){
+           Xfree(font_data->name);
+           font_data->name = NULL;
+       }
+       if(font_data->scopes){
+           Xfree(font_data->scopes);
+           font_data->scopes = NULL;
+       }
+    }
+}
+
+static Status
+close_om(
+    XOM om)
+{
+    XOMGenericPart *gen = XOM_GENERIC(om);
+    OMData data;
+    int count;
+
+    if ((data = gen->data)) {
+       for (count = gen->data_num; count-- > 0; data++) {
+           if (data->charset_list){
+               Xfree(data->charset_list);
+               data->charset_list = NULL;
+           }
+           /* free font_data for om */
+           if (data->font_data) {
+               free_fontdataOM(data->font_data,data->font_data_count);
+               Xfree(data->font_data);
+               data->font_data = NULL;
+           }
+           /* free substitute for om */
+           if (data->substitute) {
+               free_fontdataOM(data->substitute,data->substitute_num);
+               Xfree(data->substitute);
+               data->substitute = NULL;
+           }
+           /* free vmap for om */
+           if (data->vmap) {
+               free_fontdataOM(data->vmap,data->vmap_num);
+               Xfree(data->vmap);
+               data->vmap = NULL;
+           }
+           /* free vrotate for om */
+           if (data->vrotate) {
+               Xfree(data->vrotate);
+               data->vrotate = NULL;
+           }
+       }
+       Xfree(gen->data);
+       gen->data = NULL;
+    }
+
+    if (gen->object_name){
+       Xfree(gen->object_name);
+       gen->object_name = NULL;
+    }
+
+    if (om->core.res_name){
+       Xfree(om->core.res_name);
+       om->core.res_name = NULL;
+    }
+    if (om->core.res_class){
+       Xfree(om->core.res_class);
+       om->core.res_class = NULL;
+    }
+    if (om->core.required_charset.charset_list &&
+       om->core.required_charset.charset_count > 0){
+       XFreeStringList(om->core.required_charset.charset_list);
+       om->core.required_charset.charset_list = NULL;
+    } else {
+       Xfree((char*)om->core.required_charset.charset_list);
+       om->core.required_charset.charset_list = NULL;
+    }
+    if (om->core.orientation_list.orientation){
+       Xfree(om->core.orientation_list.orientation);
+       om->core.orientation_list.orientation = NULL;
+    }
+
+    Xfree(om);
+
+    return 1;
+}
+
+static char *
+set_om_values(
+    XOM om,
+    XlcArgList args,
+    int num_args)
+{
+    if (om->core.resources == NULL)
+       return NULL;
+
+    return _XlcSetValues((XPointer) om, om->core.resources,
+                        om->core.num_resources, args, num_args, XlcSetMask);
+}
+
+static char *
+get_om_values(
+    XOM om,
+    XlcArgList args,
+    int num_args)
+{
+    if (om->core.resources == NULL)
+       return NULL;
+
+    return _XlcGetValues((XPointer) om, om->core.resources,
+                        om->core.num_resources, args, num_args, XlcGetMask);
+}
+
+static XOMMethodsRec methods = {
+    close_om,
+    set_om_values,
+    get_om_values,
+    create_oc
+};
+
+static XlcResource om_resources[] = {
+    { XNRequiredCharSet, NULLQUARK, sizeof(XOMCharSetList),
+      XOffsetOf(XOMRec, core.required_charset), XlcGetMask },
+    { XNQueryOrientation, NULLQUARK, sizeof(XOMOrientation),
+      XOffsetOf(XOMRec, core.orientation_list), XlcGetMask },
+    { XNDirectionalDependentDrawing, NULLQUARK, sizeof(Bool),
+      XOffsetOf(XOMRec, core.directional_dependent), XlcGetMask },
+    { XNContextualDrawing, NULLQUARK, sizeof(Bool),
+      XOffsetOf(XOMRec, core.contextual_drawing), XlcGetMask }
+};
+
+static XOM
+create_om(
+    XLCd lcd,
+    Display *dpy,
+    XrmDatabase rdb,
+    _Xconst char *res_name,
+    _Xconst char *res_class)
+{
+    XOM om;
+
+    om = Xcalloc(1, sizeof(XOMGenericRec));
+    if (om == NULL)
+       return (XOM) NULL;
+
+    om->methods = &methods;
+    om->core.lcd = lcd;
+    om->core.display = dpy;
+    om->core.rdb = rdb;
+    if (res_name) {
+       om->core.res_name = strdup(res_name);
+       if (om->core.res_name == NULL)
+           goto err;
+    }
+    if (res_class) {
+       om->core.res_class = strdup(res_class);
+       if (om->core.res_class == NULL)
+           goto err;
+    }
+
+    if (om_resources[0].xrm_name == NULLQUARK)
+       _XlcCompileResourceList(om_resources, XlcNumber(om_resources));
+
+    om->core.resources = om_resources;
+    om->core.num_resources = XlcNumber(om_resources);
+
+    return om;
+
+err:
+    close_om(om);
+
+    return (XOM) NULL;
+}
+
+static OMData
+add_data(
+    XOM om)
+{
+    XOMGenericPart *gen = XOM_GENERIC(om);
+    OMData new;
+    int num;
+
+    if ((num = gen->data_num))
+        new = (OMData) Xrealloc(gen->data, (num + 1) * sizeof(OMDataRec));
+    else
+        new = (OMData) Xmalloc(sizeof(OMDataRec));
+
+    if (new == NULL)
+        return NULL;
+
+    gen->data_num = num + 1;
+    gen->data = new;
+
+    new += num;
+    bzero((char *) new, sizeof(OMDataRec));
+
+    return new;
+}
+
+/* For VW/UDC */
+
+FontData
+read_EncodingInfo(
+    int count,
+    char **value)
+{
+    FontData font_data,ret;
+    char *buf, *bufptr,*scp;
+    int len;
+    font_data = Xcalloc(count, sizeof(FontDataRec));
+    if (font_data == NULL)
+        return NULL;
+
+    ret = font_data;
+    for ( ; count-- > 0; font_data++) {
+/*
+        strcpy(buf, *value++);
+*/
+       buf = *value; value++;
+        if ((bufptr = strchr(buf, ':'))) {
+           len = (int)(bufptr - buf);
+            bufptr++ ;
+       } else
+            len = strlen(buf);
+        font_data->name = (char *) Xmalloc(len + 1);
+        if (font_data->name == NULL) {
+            Xfree(font_data);
+            return NULL;
+       }
+        strncpy(font_data->name, buf,len);
+       font_data->name[len] = 0;
+        if (bufptr && _XlcCompareISOLatin1(bufptr, "GL") == 0)
+            font_data->side = XlcGL;
+        else if (bufptr && _XlcCompareISOLatin1(bufptr, "GR") == 0)
+            font_data->side = XlcGR;
+        else
+            font_data->side = XlcGLGR;
+
+        if (bufptr && (scp = strchr(bufptr, '['))){
+            font_data->scopes = _XlcParse_scopemaps(scp,&(font_data->scopes_num));
+        }
+    }
+    return(ret);
+}
+
+static CodeRange read_vrotate(
+    int count,
+    char **value,
+    int *type,
+    int *vrotate_num)
+{
+    CodeRange   range;
+    if(!strcmp(value[0],"all")){
+       *type        = VROTATE_ALL ;
+       *vrotate_num = 0 ;
+       return (NULL);
+    } else if(*(value[0]) == '['){
+       *type        = VROTATE_PART ;
+        range = (CodeRange) _XlcParse_scopemaps(value[0],vrotate_num);
+       return (range);
+    } else {
+       *type        = VROTATE_NONE ;
+       *vrotate_num = 0 ;
+       return (NULL);
+    }
+}
+
+static void read_vw(
+    XLCd    lcd,
+    OMData  font_set,
+    int     num)
+{
+    char **value, buf[BUFSIZ];
+    int count;
+
+    sprintf(buf, "fs%d.font.vertical_map", num);
+    _XlcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
+    if (count > 0){
+        _XlcDbg_printValue(buf,value,count);
+        font_set->vmap_num = count;
+        font_set->vmap = read_EncodingInfo(count,value);
+    }
+
+    sprintf(buf, "fs%d.font.vertical_rotate", num);
+    _XlcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
+    if (count > 0){
+        _XlcDbg_printValue(buf,value,count);
+        font_set->vrotate = read_vrotate(count,value,&(font_set->vrotate_type),
+                               &(font_set->vrotate_num));
+    }
+}
+/* VW/UDC end */
+static Bool
+init_om(
+    XOM om)
+{
+    XLCd lcd = om->core.lcd;
+    XOMGenericPart *gen = XOM_GENERIC(om);
+    OMData data;
+    XlcCharSet *charset_list;
+    FontData font_data;
+    char **required_list;
+    XOrientation *orientation;
+    char **value, buf[BUFSIZ], *bufptr;
+    int count = 0, num = 0, length = 0;
+
+    _XlcGetResource(lcd, "XLC_FONTSET", "on_demand_loading", &value, &count);
+    if (count > 0 && _XlcCompareISOLatin1(*value, "True") == 0)
+       gen->on_demand_loading = True;
+
+    _XlcGetResource(lcd, "XLC_FONTSET", "object_name", &value, &count);
+    if (count > 0) {
+       gen->object_name = strdup(*value);
+       if (gen->object_name == NULL)
+           return False;
+    }
+
+    for (num = 0; ; num++) {
+
+        sprintf(buf, "fs%d.charset.name", num);
+        _XlcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
+
+        if( count < 1){
+            sprintf(buf, "fs%d.charset", num);
+            _XlcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
+            if (count < 1)
+                break;
+        }
+
+       data = add_data(om);
+       if (data == NULL)
+           return False;
+
+       charset_list = (XlcCharSet *) Xmalloc(sizeof(XlcCharSet) * count);
+       if (charset_list == NULL)
+           return False;
+       data->charset_list = charset_list;
+       data->charset_count = count;
+
+       while (count-- > 0){
+           *charset_list++ = _XlcGetCharSet(*value++);
+        }
+        sprintf(buf, "fs%d.charset.udc_area", num);
+        _XlcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
+        if( count > 0){
+            UDCArea udc;
+            int i,flag = 0;
+            udc = (UDCArea)Xmalloc(count * sizeof(UDCAreaRec));
+           if (udc == NULL)
+               return False;
+            for(i=0;i<count;i++){
+                sscanf(value[i],"\\x%lx,\\x%lx", &(udc[i].start),
+                      &(udc[i].end));
+            }
+            for(i=0;i<data->charset_count;i++){
+               if(data->charset_list[i]->udc_area == NULL){
+                   data->charset_list[i]->udc_area     = udc;
+                   data->charset_list[i]->udc_area_num = count;
+                   flag = 1;
+               }
+            }
+           if(flag == 0){
+               Xfree(udc);
+           }
+        }
+
+        sprintf(buf, "fs%d.font.primary", num);
+        _XlcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
+        if (count < 1){
+            sprintf(buf, "fs%d.font", num);
+            _XlcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
+            if (count < 1)
+                return False;
+        }
+
+       font_data = read_EncodingInfo(count,value);
+       if (font_data == NULL)
+           return False;
+
+       data->font_data = font_data;
+       data->font_data_count = count;
+
+        sprintf(buf, "fs%d.font.substitute", num);
+        _XlcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
+        if (count > 0){
+            font_data = read_EncodingInfo(count,value);
+            if (font_data == NULL)
+               return False;
+            data->substitute      = font_data;
+            data->substitute_num = count;
+        } else {
+            sprintf(buf, "fs%d.font", num);
+            _XlcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
+            if (count < 1) {
+                data->substitute      = NULL;
+                data->substitute_num = 0;
+           } else {
+                font_data = read_EncodingInfo(count,value);
+                data->substitute      = font_data;
+                data->substitute_num = count;
+           }
+       }
+        read_vw(lcd,data,num);
+       length += strlen(data->font_data->name) + 1;
+    }
+
+    /* required charset list */
+    required_list = (char **) Xmalloc(sizeof(char *) * gen->data_num);
+    if (required_list == NULL)
+       return False;
+
+    om->core.required_charset.charset_list = required_list;
+    om->core.required_charset.charset_count = gen->data_num;
+
+    count = gen->data_num;
+    data = gen->data;
+
+    if (count > 0) {
+       bufptr = (char *) Xmalloc(length);
+       if (bufptr == NULL) {
+           Xfree(required_list);
+           return False;
+       }
+
+       for ( ; count-- > 0; data++) {
+           strcpy(bufptr, data->font_data->name);
+           *required_list++ = bufptr;
+           bufptr += strlen(bufptr) + 1;
+       }
+    }
+
+    /* orientation list */
+    orientation = (XOrientation *) Xmalloc(sizeof(XOrientation) * 2);
+    if (orientation == NULL)
+       return False;
+
+    orientation[0] = XOMOrientation_LTR_TTB;
+    orientation[1] = XOMOrientation_TTB_RTL;
+    om->core.orientation_list.orientation = orientation;
+    om->core.orientation_list.num_orientation = 2;
+
+    /* directional dependent drawing */
+    om->core.directional_dependent = False;
+
+    /* contexual drawing */
+    om->core.contextual_drawing = False;
+
+    /* context dependent */
+    om->core.context_dependent = False;
+
+    return True;
+}
+
+XOM
+_XomGenericOpenOM(XLCd lcd, Display *dpy, XrmDatabase rdb,
+                 _Xconst char *res_name, _Xconst char *res_class)
+{
+    XOM om;
+
+    om = create_om(lcd, dpy, rdb, res_name, res_class);
+    if (om == NULL)
+       return (XOM) NULL;
+
+    if (init_om(om) == False)
+       goto err;
+
+    return om;
+
+err:
+    close_om(om);
+
+    return (XOM) NULL;
+}
+
+Bool
+_XInitOM(
+    XLCd lcd)
+{
+    lcd->methods->open_om = _XomGenericOpenOM;
+
+    return True;
+}
diff --git a/modules/om/generic/omImText.c b/modules/om/generic/omImText.c
new file mode 100644 (file)
index 0000000..1bc08bc
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * 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 TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA 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.
+ *
+ * Author: Katsuhisa Yano      TOSHIBA Corp.
+ *                             mopi@osa.ilab.toshiba.co.jp
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XomGeneric.h"
+
+#if 0
+extern int _XomGenericTextExtents(), _XomGenericDrawString();
+#endif
+
+#define GET_VALUE_MASK (GCFunction | GCForeground | GCBackground | GCFillStyle)
+#define SET_VALUE_MASK (GCFunction | GCForeground | GCFillStyle)
+
+static void
+_XomGenericDrawImageString(
+    Display *dpy,
+    Drawable d,
+    XOC oc,
+    GC gc,
+    int x, int y,
+    XOMTextType type,
+    XPointer text,
+    int length)
+{
+    XGCValues values;
+    XRectangle extent;
+
+    XGetGCValues(dpy, gc, GET_VALUE_MASK, &values);
+
+    XSetFunction(dpy, gc, GXcopy);
+    XSetForeground(dpy, gc, values.background);
+    XSetFillStyle(dpy, gc, FillSolid);
+
+    _XomGenericTextExtents(oc, type, text, length, 0, &extent);
+    XFillRectangle(dpy, d, gc, x + extent.x, y + extent.y, extent.width,
+                  extent.height);
+
+    XChangeGC(dpy, gc, SET_VALUE_MASK, &values);
+
+    _XomGenericDrawString(dpy, d, oc, gc, x, y, type, text, length);
+}
+
+void
+_XmbGenericDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
+                          int y, _Xconst char *text, int length)
+{
+    _XomGenericDrawImageString(dpy, d, oc, gc, x, y, XOMMultiByte,
+                              (XPointer) text, length);
+}
+
+void
+_XwcGenericDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
+                          int y, _Xconst wchar_t *text, int length)
+{
+    _XomGenericDrawImageString(dpy, d, oc, gc, x, y, XOMWideChar,
+                              (XPointer) text, length);
+}
+
+void
+_Xutf8GenericDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
+                            int y, _Xconst char *text, int length)
+{
+    _XomGenericDrawImageString(dpy, d, oc, gc, x, y, XOMUtf8String,
+                              (XPointer) text, length);
+}
diff --git a/modules/om/generic/omText.c b/modules/om/generic/omText.c
new file mode 100644 (file)
index 0000000..bfceca9
--- /dev/null
@@ -0,0 +1,370 @@
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * 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 TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA 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.
+ *
+ * Author: Katsuhisa Yano      TOSHIBA Corp.
+ *                             mopi@osa.ilab.toshiba.co.jp
+ */
+/*
+ * Copyright 1995 by FUJITSU LIMITED
+ * This is source code modified by FUJITSU LIMITED under the Joint
+ * Development Agreement for the CDE/Motif PST.
+ */
+/*
+ * Modifiers: Jeff Walls, Paul Anderson (HEWLETT-PACKARD)
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XomGeneric.h"
+#include <stdio.h>
+
+/* For VW/UDC */
+
+static int
+is_rotate(
+    XOC                oc,
+    XFontStruct        *font)
+{
+    XOCGenericPart     *gen = XOC_GENERIC(oc);
+    FontSet            font_set;
+    VRotate            vrotate;
+    int                        font_set_count;
+    int                        vrotate_num;
+
+    font_set = gen->font_set;
+    font_set_count = gen->font_set_num;
+    for( ; font_set_count-- ; font_set++) {
+       if((font_set->vrotate_num > 0) && (font_set->vrotate)) {
+           vrotate = font_set->vrotate;
+           vrotate_num = font_set->vrotate_num;
+           for( ; vrotate_num-- ; vrotate++)
+               if(vrotate->font == font)
+                   return True;
+       }
+    }
+    return False;
+}
+
+static int
+is_codemap(
+    XOC                oc,
+    XFontStruct        *font)
+{
+    XOCGenericPart     *gen = XOC_GENERIC(oc);
+    FontSet            font_set;
+    FontData           vmap;
+    int                        font_set_count;
+    int                        vmap_num;
+
+    font_set = gen->font_set;
+    font_set_count = gen->font_set_num;
+    for( ; font_set_count-- ; font_set++) {
+       if(font_set->vmap_num > 0) {
+           vmap = font_set->vmap;
+           vmap_num = font_set->vmap_num;
+           for( ; vmap_num-- ; vmap++)
+               if(vmap->font == font)
+                   return True;
+       }
+    }
+    return False;
+}
+
+static int
+draw_vertical(
+    Display    *dpy,
+    Drawable   d,
+    XOC                oc,
+    GC         gc,
+    XFontStruct        *font,
+    Bool       is_xchar2b,
+    int                x, int y,
+    XPointer   text,
+    int                length)
+{
+    XChar2b    *buf2b;
+    char       *buf;
+    int                wx = 0, wy = 0;
+    int                direction = 0;
+    int                font_ascent_return = 0, font_descent_return = 0;
+    int                i;
+    XCharStruct        overall;
+
+    wy = y;
+    if (is_xchar2b) {
+       for(i = 0, buf2b = (XChar2b *) text ; i < length ; i++, buf2b++) {
+           if(is_rotate(oc, font) == True) {
+               XTextExtents16(font, buf2b, 1,
+                              &direction, &font_ascent_return,
+                              &font_descent_return, &overall);
+               wx = x - (int)((overall.rbearing - overall.lbearing) >> 1) -
+                        (int) overall.lbearing;
+               wy += overall.ascent;
+               XDrawString16(dpy, d, gc, wx, wy, buf2b, 1);
+               wy += overall.descent;
+           } else {
+               wx = x - (int)((font->max_bounds.rbearing -
+                               font->min_bounds.lbearing) >> 1) -
+                        (int) font->min_bounds.lbearing;
+               wy += font->max_bounds.ascent;
+               XDrawString16(dpy, d, gc, wx, wy, buf2b, 1);
+               wy += font->max_bounds.descent;
+           }
+       }
+    } else {
+       for(i = 0, buf = (char *)text ; i < length && *buf ; i++, buf++) {
+           if(is_rotate(oc, font) == True) {
+               XTextExtents(font, buf, 1,
+                            &direction, &font_ascent_return,
+                            &font_descent_return, &overall);
+               wx = x - (int)((overall.rbearing - overall.lbearing) >> 1) -
+                        (int) overall.lbearing;
+               wy += overall.ascent;
+               XDrawString(dpy, d, gc, wx, wy, buf, 1);
+               wy += overall.descent;
+           } else {
+               wx = x - (int)((font->max_bounds.rbearing -
+                               font->min_bounds.lbearing) >> 1) -
+                        (int) font->min_bounds.lbearing;
+               wy += font->max_bounds.ascent;
+               XDrawString(dpy, d, gc, wx, wy, buf, 1);
+               wy += font->max_bounds.descent;
+           }
+       }
+    }
+    return wy;
+}
+
+#define VMAP          0
+#define VROTATE       1
+#define FONTSCOPE     2
+
+static int
+DrawStringWithFontSet(
+    Display *dpy,
+    Drawable d,
+    XOC oc,
+    FontSet fs,
+    GC gc,
+    int x, int y,
+    XPointer text,
+    int length)
+{
+    XFontStruct *font;
+    Bool is_xchar2b;
+    unsigned char *ptr;
+    int ptr_len, char_len = 0;
+    FontData fd;
+    int ret = 0;
+
+    ptr = (unsigned char *)text;
+    is_xchar2b = fs->is_xchar2b;
+
+    while (length > 0) {
+        fd = _XomGetFontDataFromFontSet(fs,
+                       ptr,length,&ptr_len,is_xchar2b,FONTSCOPE);
+       if(ptr_len <= 0)
+           break;
+
+       /* First, see if the "Best Match" font for the FontSet was set.
+       * If it was, use that font.  If it was not set, then use the
+       * font defined by font_set->font_data[0] (which is what
+       * _XomGetFontDataFromFontSet() always seems to return for
+       * non-VW text).  Note that given the new algorithm in
+       * parse_fontname() and parse_fontdata(), fs->font will
+       * *always* contain good data.   We should probably remove
+       * the check for "fd->font", but we won't :-) -- jjw/pma (HP)
+       */
+        if((font = fs->font) == (XFontStruct *) NULL){
+
+           if(fd == (FontData) NULL ||
+              (font = fd->font) == (XFontStruct *) NULL)
+               break;
+        }
+
+       switch(oc->core.orientation) {
+         case XOMOrientation_LTR_TTB:
+         case XOMOrientation_RTL_TTB:
+            XSetFont(dpy, gc, font->fid);
+
+           if (is_xchar2b) {
+               char_len = ptr_len / sizeof(XChar2b);
+               XDrawString16(dpy, d, gc, x, y, (XChar2b *)ptr, char_len);
+               x += XTextWidth16(font, (XChar2b *)ptr, char_len);
+            } else {
+               char_len = ptr_len;
+               XDrawString(dpy, d, gc, x, y, (char *)ptr, char_len);
+               x += XTextWidth(font, (char *)ptr, char_len);
+           }
+           break;
+         case XOMOrientation_TTB_RTL:
+         case XOMOrientation_TTB_LTR:
+           if(fs->font == font) {
+               fd = _XomGetFontDataFromFontSet(fs,
+                       ptr,length,&ptr_len,is_xchar2b,VMAP);
+               if(ptr_len <= 0)
+                   break;
+               if(fd == (FontData) NULL ||
+                  (font = fd->font) == (XFontStruct *) NULL)
+                   break;
+
+               if(is_codemap(oc, fd->font) == False) {
+                   fd = _XomGetFontDataFromFontSet(fs,
+                            ptr,length,&ptr_len,is_xchar2b,VROTATE);
+                   if(ptr_len <= 0)
+                       break;
+                   if(fd == (FontData) NULL ||
+                      (font = fd->font) == (XFontStruct *) NULL)
+                       break;
+               }
+           }
+
+           if(is_xchar2b)
+               char_len = ptr_len / sizeof(XChar2b);
+           else
+               char_len = ptr_len;
+            XSetFont(dpy, gc, font->fid);
+           y = draw_vertical(dpy, d, oc, gc, font, is_xchar2b, x, y,
+                              (char *)ptr, char_len);
+           break;
+
+         case XOMOrientation_Context:
+           /* never used? */
+           break;
+       }
+
+       if(char_len <= 0)
+           break;
+
+        length -= char_len;
+        ptr += ptr_len;
+    }
+
+    switch(oc->core.orientation) {
+      case XOMOrientation_LTR_TTB:
+      case XOMOrientation_RTL_TTB:
+       ret = x;
+       break;
+      case XOMOrientation_TTB_RTL:
+      case XOMOrientation_TTB_LTR:
+       ret = y;
+       break;
+      case XOMOrientation_Context:
+       /* not used? */
+       break;
+    }
+    return ret;
+}
+
+/* For VW/UDC */
+
+int
+_XomGenericDrawString(
+    Display *dpy,
+    Drawable d,
+    XOC oc,
+    GC gc,
+    int x, int y,
+    XOMTextType type,
+    XPointer text,
+    int length)
+{
+    XlcConv conv;
+    XFontStruct *font;
+    Bool is_xchar2b;
+/* VW/UDC */
+    XPointer args[3];
+    FontSet fs;
+/* VW/UDC */
+    XChar2b xchar2b_buf[BUFSIZ], *buf;
+    int start_x = x;
+    int start_y = y;
+    int left = 0, buf_len = 0;
+    int next = 0;
+
+    conv = _XomInitConverter(oc, type);
+    if (conv == NULL)
+       return -1;
+
+    args[0] = (XPointer) &font;
+    args[1] = (XPointer) &is_xchar2b;
+    args[2] = (XPointer) &fs;
+
+    while (length > 0) {
+       buf = xchar2b_buf;
+       left = buf_len = BUFSIZ;
+
+       if (_XomConvert(oc, conv, (XPointer *) &text, &length,
+                       (XPointer *) &buf, &left, args, 3) < 0)
+           break;
+       buf_len -= left;
+
+/* For VW/UDC */
+       next = DrawStringWithFontSet(dpy, d, oc, fs, gc, x, y,
+                                    (XPointer)xchar2b_buf, buf_len);
+
+       switch(oc->core.orientation) {
+         case XOMOrientation_LTR_TTB:
+         case XOMOrientation_RTL_TTB:
+           x = next;
+           break;
+         case XOMOrientation_TTB_RTL:
+         case XOMOrientation_TTB_LTR:
+           y = next;
+           break;
+          case XOMOrientation_Context:
+           /* not used */
+           break;
+       }
+/* For VW/UDC */
+    }
+
+    x -= start_x;
+    y -= start_y;
+
+    return x;
+}
+
+int
+_XmbGenericDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
+                     _Xconst char *text, int length)
+{
+    return _XomGenericDrawString(dpy, d, oc, gc, x, y, XOMMultiByte,
+                                (XPointer) text, length);
+}
+
+int
+_XwcGenericDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
+                     _Xconst wchar_t *text, int length)
+{
+    return _XomGenericDrawString(dpy, d, oc, gc, x, y, XOMWideChar,
+                                (XPointer) text, length);
+}
+
+int
+_Xutf8GenericDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
+                       _Xconst char *text, int length)
+{
+    return _XomGenericDrawString(dpy, d, oc, gc, x, y, XOMUtf8String,
+                                (XPointer) text, length);
+}
diff --git a/modules/om/generic/omTextEsc.c b/modules/om/generic/omTextEsc.c
new file mode 100644 (file)
index 0000000..df1fb10
--- /dev/null
@@ -0,0 +1,300 @@
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * 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 TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA 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.
+ *
+ * Author: Katsuhisa Yano      TOSHIBA Corp.
+ *                             mopi@osa.ilab.toshiba.co.jp
+ */
+/*
+ * Copyright 1995 by FUJITSU LIMITED
+ * This is source code modified by FUJITSU LIMITED under the Joint
+ * Development Agreement for the CDE/Motif PST.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XomGeneric.h"
+#include <stdio.h>
+
+/* For VW/UDC start */
+
+#define        VMAP            0
+#define        VROTATE         1
+#define        FONTSCOPE       2
+
+static int
+is_rotate(
+    XOC         oc,
+    XFontStruct *font)
+{
+    XOCGenericPart      *gen = XOC_GENERIC(oc);
+    FontSet             font_set;
+    VRotate             vrotate;
+    int                 font_set_count;
+    int                 vrotate_num;
+
+    font_set = gen->font_set;
+    font_set_count = gen->font_set_num;
+    for( ; font_set_count-- ; font_set++) {
+       if((font_set->vrotate_num > 0) && (font_set->vrotate != NULL)) {
+           vrotate = font_set->vrotate;
+           vrotate_num = font_set->vrotate_num;
+           for( ; vrotate_num-- ; vrotate++)
+               if(vrotate->font == font)
+                   return True;
+       }
+    }
+    return False;
+}
+
+static int
+is_codemap(
+    XOC         oc,
+    XFontStruct *font)
+{
+    XOCGenericPart      *gen = XOC_GENERIC(oc);
+    FontSet             font_set;
+    FontData            vmap;
+    int                 font_set_count;
+    int                 vmap_num;
+
+    font_set = gen->font_set;
+    font_set_count = gen->font_set_num;
+    for( ; font_set_count-- ; font_set++) {
+       if(font_set->vmap_num > 0) {
+           vmap = font_set->vmap;
+           vmap_num = font_set->vmap_num;
+           for( ; vmap_num-- ; vmap++)
+               if(vmap->font == font)
+                   return True;
+       }
+    }
+    return False;
+}
+
+static int
+escapement_vertical(
+    XOC         oc,
+    XFontStruct *font,
+    Bool        is_xchar2b,
+    XPointer    text,
+    int         length)
+{
+    XChar2b    *buf2b;
+    char       *buf;
+    int                escapement = 0, i;
+
+    if(is_xchar2b) {
+       for(i = 0, buf2b = (XChar2b *) text ; i < length ; i++, buf2b++) {
+           if(is_rotate(oc, font) == True) {
+               escapement += _XTextHeight16(font, buf2b, 1);
+           } else {
+               escapement += (int) (font->max_bounds.ascent +
+                                    font->max_bounds.descent);
+           }
+       }
+    } else {
+       for(i = 0, buf = (char *)text ; i < length && *buf ; i++, buf++) {
+           if(is_rotate(oc, font) == True) {
+               escapement += _XTextHeight(font, buf, 1);
+           } else {
+               escapement += (int) (font->max_bounds.ascent +
+                                    font->max_bounds.descent);
+           }
+       }
+    }
+    return escapement;
+}
+
+
+static int
+TextWidthWithFontSet(
+    FontSet    font_set,
+    XOC                oc,
+    XPointer    text,
+    int         length)
+{
+    FontData           fd;
+    XFontStruct                *font;
+    unsigned char      *ptr = (unsigned char *)text;
+    Bool               is_xchar2b;
+    int                        ptr_len = length;
+    int                        escapement = 0, char_len = 0;
+
+    if(font_set == (FontSet) NULL)
+       return escapement;
+
+    is_xchar2b = font_set->is_xchar2b;
+
+    while(length > 0) {
+       fd = _XomGetFontDataFromFontSet(font_set, ptr, length, &ptr_len,
+                                              is_xchar2b, FONTSCOPE);
+       if(ptr_len <= 0)
+           break;
+
+       /*
+        * First, see if the "Best Match" font for the FontSet was set.
+        * If it was, use that font.  If it was not set, then use the
+        * font defined by font_set->font_data[0] (which is what
+        * _XomGetFontDataFromFontSet() always seems to return for
+        * non-VW text).  Note that given the new algorithm in
+        * parse_fontname() and parse_fontdata(), fs->font will
+        * *always* contain good data.   We should probably remove
+        * the check for "fd->font", but we won't :-) -- jjw/pma (HP)
+        *
+        * Above comment and way this is done propagated from omText.c
+        * Note that fd->font is junk so using the result of the
+        * above call /needs/ to be ignored.
+        *
+        * Owen Taylor <otaylor@redhat.com>     12 Jul 2000
+        *
+        */
+
+       if(fd == (FontData) NULL ||
+          (font = font_set->font) == (XFontStruct *) NULL) {
+
+           if((font = fd->font) == (XFontStruct *) NULL)
+               break;
+       }
+
+       switch(oc->core.orientation) {
+         case XOMOrientation_LTR_TTB:
+         case XOMOrientation_RTL_TTB:
+           if (is_xchar2b) {
+               char_len = ptr_len / sizeof(XChar2b);
+               escapement += XTextWidth16(font, (XChar2b *)ptr, char_len);
+           } else {
+               char_len = ptr_len;
+               escapement += XTextWidth(font, (char *)ptr, char_len);
+           }
+           break;
+
+         case XOMOrientation_TTB_LTR:
+         case XOMOrientation_TTB_RTL:
+           if(font_set->font == font) {
+               fd = _XomGetFontDataFromFontSet(font_set, ptr, length, &ptr_len,
+                                               is_xchar2b, VMAP);
+               if(ptr_len <= 0)
+                   break;
+               if(fd == (FontData) NULL ||
+                  (font = fd->font) == (XFontStruct *) NULL)
+                   break;
+
+               if(is_codemap(oc, fd->font) == False) {
+                   fd = _XomGetFontDataFromFontSet(font_set, ptr, length,
+                                                   &ptr_len, is_xchar2b,
+                                                   VROTATE);
+                   if(ptr_len <= 0)
+                       break;
+                   if(fd == (FontData) NULL ||
+                      (font = fd->font) == (XFontStruct *) NULL)
+                       break;
+               }
+           }
+
+           if(is_xchar2b)
+               char_len = ptr_len / sizeof(XChar2b);
+           else
+               char_len = ptr_len;
+           escapement += escapement_vertical(oc, font, is_xchar2b,
+                                             (XPointer) ptr, char_len);
+           break;
+
+         case XOMOrientation_Context:
+           /* not used? */
+            break;
+       }
+
+       if(char_len <= 0)
+           break;
+
+       length -= char_len;
+       ptr += ptr_len;
+    }
+
+    return escapement;
+}
+
+/* For VW/UDC end */
+
+static int
+_XomGenericTextEscapement(
+    XOC oc,
+    XOMTextType type,
+    XPointer text,
+    int length)
+{
+    XlcConv conv;
+    XFontStruct *font;
+    Bool is_xchar2b;
+/* VW/UDC */
+    XPointer args[3];
+    FontSet font_set;
+/* VW/UDC */
+    XChar2b xchar2b_buf[BUFSIZ], *buf;
+    int escapement = 0;
+    int buf_len = 0, left = 0;
+
+    conv = _XomInitConverter(oc, type);
+    if (conv == NULL)
+       return escapement;
+
+    args[0] = (XPointer) &font;
+    args[1] = (XPointer) &is_xchar2b;
+    args[2] = (XPointer) &font_set;
+
+    while (length > 0) {
+       buf = xchar2b_buf;
+       left = buf_len = BUFSIZ;
+
+       if (_XomConvert(oc, conv, (XPointer *) &text, &length,
+                       (XPointer *) &buf, &left, args, 3) < 0)
+           break;
+       buf_len -= left;
+
+/* VW/UDC */
+       escapement += TextWidthWithFontSet(font_set, oc,
+                                          (XPointer) xchar2b_buf, buf_len);
+/* VW/UDC */
+    }
+
+    return escapement;
+}
+
+int
+_XmbGenericTextEscapement(XOC oc, _Xconst char *text, int length)
+{
+    return _XomGenericTextEscapement(oc, XOMMultiByte, (XPointer) text, length);
+}
+
+int
+_XwcGenericTextEscapement(XOC oc, _Xconst wchar_t *text, int length)
+{
+    return _XomGenericTextEscapement(oc, XOMWideChar, (XPointer) text, length);
+}
+
+int
+_Xutf8GenericTextEscapement(XOC oc, _Xconst char *text, int length)
+{
+    return _XomGenericTextEscapement(oc, XOMUtf8String, (XPointer) text,
+                                    length);
+}
diff --git a/modules/om/generic/omTextExt.c b/modules/om/generic/omTextExt.c
new file mode 100644 (file)
index 0000000..baeadf6
--- /dev/null
@@ -0,0 +1,135 @@
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * 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 TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA 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.
+ *
+ * Author: Katsuhisa Yano      TOSHIBA Corp.
+ *                             mopi@osa.ilab.toshiba.co.jp
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XomGeneric.h"
+#include <stdio.h>
+
+int
+_XomGenericTextExtents(
+    XOC oc,
+    XOMTextType type,
+    XPointer text,
+    int length,
+    XRectangle *overall_ink,
+    XRectangle *overall_logical)
+{
+    XlcConv conv;
+    XFontStruct *font;
+    Bool is_xchar2b;
+    XPointer args[2];
+    XChar2b xchar2b_buf[BUFSIZ], *buf;
+    int direction, logical_ascent, logical_descent, tmp_ascent, tmp_descent;
+    XCharStruct overall, tmp_overall;
+    int buf_len, left;
+    Bool first = True;
+
+    conv = _XomInitConverter(oc, type);
+    if (conv == NULL)
+       return 0;
+
+    bzero((char *) &overall, sizeof(XCharStruct));
+    logical_ascent = logical_descent = 0;
+
+    args[0] = (XPointer) &font;
+    args[1] = (XPointer) &is_xchar2b;
+
+    while (length > 0) {
+       buf = xchar2b_buf;
+       left = buf_len = BUFSIZ;
+
+       if (_XomConvert(oc, conv, (XPointer *) &text, &length,
+                       (XPointer *) &buf, &left, args, 2) < 0)
+           break;
+       buf_len -= left;
+
+       if (is_xchar2b)
+           XTextExtents16(font, xchar2b_buf, buf_len, &direction,
+                          &tmp_ascent, &tmp_descent, &tmp_overall);
+       else
+           XTextExtents(font, (char *) xchar2b_buf, buf_len, &direction,
+                        &tmp_ascent, &tmp_descent, &tmp_overall);
+
+       if (first) {    /* initialize overall */
+           overall = tmp_overall;
+           logical_ascent = tmp_ascent;
+           logical_descent = tmp_descent;
+           first = False;
+       } else {
+           overall.lbearing = min(overall.lbearing,
+                                  overall.width + tmp_overall.lbearing);
+           overall.rbearing = max(overall.rbearing,
+                                  overall.width + tmp_overall.rbearing);
+           overall.ascent = max(overall.ascent, tmp_overall.ascent);
+           overall.descent = max(overall.descent, tmp_overall.descent);
+           overall.width += tmp_overall.width;
+           logical_ascent = max(logical_ascent, tmp_ascent);
+           logical_descent = max(logical_descent, tmp_descent);
+       }
+    }
+
+    if (overall_ink) {
+       overall_ink->x = overall.lbearing;
+       overall_ink->y = -(overall.ascent);
+       overall_ink->width = overall.rbearing - overall.lbearing;
+       overall_ink->height = overall.ascent + overall.descent;
+    }
+
+    if (overall_logical) {
+       overall_logical->x = 0;
+        overall_logical->y = -(logical_ascent);
+       overall_logical->width = overall.width;
+        overall_logical->height = logical_ascent + logical_descent;
+    }
+
+    return overall.width;
+}
+
+int
+_XmbGenericTextExtents(XOC oc, _Xconst char *text, int length,
+                      XRectangle *overall_ink, XRectangle *overall_logical)
+{
+    return _XomGenericTextExtents(oc, XOMMultiByte, (XPointer) text, length,
+                                 overall_ink, overall_logical);
+}
+
+int
+_XwcGenericTextExtents(XOC oc, _Xconst wchar_t *text, int length,
+                      XRectangle *overall_ink, XRectangle *overall_logical)
+{
+    return _XomGenericTextExtents(oc, XOMWideChar, (XPointer) text, length,
+                                 overall_ink, overall_logical);
+}
+
+int
+_Xutf8GenericTextExtents(XOC oc, _Xconst char *text, int length,
+                        XRectangle *overall_ink, XRectangle *overall_logical)
+{
+    return _XomGenericTextExtents(oc, XOMUtf8String, (XPointer) text, length,
+                                 overall_ink, overall_logical);
+}
diff --git a/modules/om/generic/omTextPer.c b/modules/om/generic/omTextPer.c
new file mode 100644 (file)
index 0000000..ae08fe6
--- /dev/null
@@ -0,0 +1,202 @@
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * 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 TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA 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.
+ *
+ * Author: Katsuhisa Yano      TOSHIBA Corp.
+ *                             mopi@osa.ilab.toshiba.co.jp
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XomGeneric.h"
+#include <stdio.h>
+
+static Status
+_XomGenericTextPerCharExtents(
+    XOC oc,
+    XOMTextType type,
+    XPointer text,
+    int length,
+    XRectangle *ink_buf,
+    XRectangle *logical_buf,
+    int buf_size,
+    int *num_chars,
+    XRectangle *overall_ink,
+    XRectangle *overall_logical)
+{
+    XlcConv conv;
+    XFontStruct *font;
+    Bool is_xchar2b;
+    XPointer args[2];
+    XChar2b xchar2b_buf[BUFSIZ], *xchar2b_ptr;
+    char *xchar_ptr = NULL;
+    XCharStruct *def, *cs, overall;
+    int buf_len, left, require_num;
+    int logical_ascent, logical_descent;
+    Bool first = True;
+
+    conv = _XomInitConverter(oc, type);
+    if (conv == NULL)
+       return 0;
+
+    bzero((char *) &overall, sizeof(XCharStruct));
+    logical_ascent = logical_descent = require_num = *num_chars = 0;
+
+    args[0] = (XPointer) &font;
+    args[1] = (XPointer) &is_xchar2b;
+
+    while (length > 0) {
+       xchar2b_ptr = xchar2b_buf;
+       left = buf_len = BUFSIZ;
+
+       if (_XomConvert(oc, conv, (XPointer *) &text, &length,
+                       (XPointer *) &xchar2b_ptr, &left, args, 2) < 0)
+           break;
+       buf_len -= left;
+
+       if (require_num) {
+           require_num += buf_len;
+           continue;
+       }
+       if (buf_size < buf_len) {
+           require_num = *num_chars + buf_len;
+           continue;
+       }
+       buf_size -= buf_len;
+
+       if (first) {
+           logical_ascent = font->ascent;
+           logical_descent = font->descent;
+       } else {
+           logical_ascent = max(logical_ascent, font->ascent);
+           logical_descent = max(logical_descent, font->descent);
+       }
+
+       if (is_xchar2b) {
+           CI_GET_DEFAULT_INFO_2D(font, def)
+           xchar2b_ptr = xchar2b_buf;
+       } else {
+           CI_GET_DEFAULT_INFO_1D(font, def)
+           xchar_ptr = (char *) xchar2b_buf;
+       }
+
+       while (buf_len-- > 0) {
+           if (is_xchar2b) {
+               CI_GET_CHAR_INFO_2D(font, xchar2b_ptr->byte1,
+                                   xchar2b_ptr->byte2, def, cs)
+               xchar2b_ptr++;
+           } else {
+               CI_GET_CHAR_INFO_1D(font, *xchar_ptr, def, cs)
+               xchar_ptr++;
+           }
+           if (cs == NULL)
+               continue;
+
+           ink_buf->x = overall.width + cs->lbearing;
+           ink_buf->y = -(cs->ascent);
+           ink_buf->width = cs->rbearing - cs->lbearing;
+           ink_buf->height = cs->ascent + cs->descent;
+           ink_buf++;
+
+           logical_buf->x = overall.width;
+           logical_buf->y = -(font->ascent);
+           logical_buf->width = cs->width;
+           logical_buf->height = font->ascent + font->descent;
+           logical_buf++;
+
+           if (first) {
+               overall = *cs;
+               first = False;
+           } else {
+               overall.ascent = max(overall.ascent, cs->ascent);
+               overall.descent = max(overall.descent, cs->descent);
+               overall.lbearing = min(overall.lbearing,
+                                      overall.width + cs->lbearing);
+               overall.rbearing = max(overall.rbearing,
+                                      overall.width + cs->rbearing);
+               overall.width += cs->width;
+           }
+
+           (*num_chars)++;
+       }
+    }
+
+    if (require_num) {
+       *num_chars = require_num;
+       return 0;
+    } else {
+       if (overall_ink) {
+           overall_ink->x = overall.lbearing;
+           overall_ink->y = -(overall.ascent);
+           overall_ink->width = overall.rbearing - overall.lbearing;
+           overall_ink->height = overall.ascent + overall.descent;
+       }
+
+       if (overall_logical) {
+           overall_logical->x = 0;
+           overall_logical->y = -(logical_ascent);
+           overall_logical->width = overall.width;
+           overall_logical->height = logical_ascent + logical_descent;
+       }
+    }
+
+    return 1;
+}
+
+Status
+_XmbGenericTextPerCharExtents(XOC oc, _Xconst char *text, int length,
+                             XRectangle *ink_buf, XRectangle *logical_buf,
+                             int buf_size, int *num_chars,
+                             XRectangle *overall_ink,
+                             XRectangle *overall_logical)
+{
+    return _XomGenericTextPerCharExtents(oc, XOMMultiByte, (XPointer) text,
+                                        length, ink_buf, logical_buf, buf_size,
+                                        num_chars, overall_ink,
+                                        overall_logical);
+}
+
+Status
+_XwcGenericTextPerCharExtents(XOC oc, _Xconst wchar_t *text, int length,
+                             XRectangle *ink_buf, XRectangle *logical_buf,
+                             int buf_size, int *num_chars,
+                             XRectangle *overall_ink,
+                             XRectangle *overall_logical)
+{
+    return _XomGenericTextPerCharExtents(oc, XOMWideChar, (XPointer) text,
+                                        length, ink_buf, logical_buf, buf_size,
+                                        num_chars, overall_ink,
+                                        overall_logical);
+}
+
+Status
+_Xutf8GenericTextPerCharExtents(XOC oc, _Xconst char *text, int length,
+                               XRectangle *ink_buf, XRectangle *logical_buf,
+                               int buf_size, int *num_chars,
+                               XRectangle *overall_ink,
+                               XRectangle *overall_logical)
+{
+    return _XomGenericTextPerCharExtents(oc, XOMUtf8String, (XPointer) text,
+                                        length, ink_buf, logical_buf, buf_size,
+                                        num_chars, overall_ink,
+                                        overall_logical);
+}
diff --git a/modules/om/generic/omXChar.c b/modules/om/generic/omXChar.c
new file mode 100644 (file)
index 0000000..ff517d5
--- /dev/null
@@ -0,0 +1,477 @@
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * 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 TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA 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.
+ *
+ * Author: Katsuhisa Yano      TOSHIBA Corp.
+ *                             mopi@osa.ilab.toshiba.co.jp
+ */
+/*
+ * Copyright 1995 by FUJITSU LIMITED
+ * This is source code modified by FUJITSU LIMITED under the Joint
+ * Development Agreement for the CDE/Motif PST.
+ *
+ * Modifier: Takanori Tateno   FUJITSU LIMITED
+ *
+ */
+/*
+ * Modifiers: Jeff Walls, Paul Anderson (HEWLETT-PACKARD)
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XlcPublic.h"
+#include "XomGeneric.h"
+#include <stdio.h>
+
+/* for VW/UDC start */
+static Bool
+ismatch_scopes(
+    FontData      fontdata,
+    unsigned long *value,
+    Bool         is_shift)
+{
+    register int scopes_num = fontdata->scopes_num;
+    FontScope scopes = fontdata->scopes;
+    if (!scopes_num)
+        return False;
+
+    if(fontdata->font == NULL)
+       return False;
+
+    for(;scopes_num--;scopes++)
+        if ((scopes->start <= (*value & 0x7f7f)) &&
+                        ((scopes->end) >= (*value & 0x7f7f))){
+           if(is_shift == True) {
+                if(scopes->shift){
+                    if(scopes->shift_direction == '+'){
+                        *value += scopes->shift ;
+                    } else if( scopes->shift_direction == '-'){
+                        *value -= scopes->shift ;
+                    }
+                }
+            }
+            return True;
+        }
+
+    return False;
+}
+
+static int
+check_vertical_fonttype(
+    char       *name)
+{
+    char       *ptr;
+    int                type = 0;
+
+    if(name == (char *)NULL || (int) strlen(name) <= 0)
+       return False;
+
+    /* Obtains the pointer of CHARSET_ENCODING_FIELD. */
+    if((ptr = strchr(name, '-')) == (char *) NULL)
+       return False;
+    ptr++;
+
+    /* Obtains the pointer of vertical_map font type. */
+    if((ptr = strchr(ptr, '.')) == (char *) NULL)
+       return False;
+    ptr++;
+
+    switch(*ptr) {
+      case '1':
+       type = 1;       break;
+      case '2':
+       type = 2;       break;
+      case '3':
+       type = 3;       break;
+    }
+    return type;
+}
+
+/*
+*/
+#define VMAP          0
+#define VROTATE       1
+#define FONTSCOPE     2
+
+FontData
+_XomGetFontDataFromFontSet(
+    FontSet fs,
+    unsigned char *str,
+    int len,
+    int *len_ret,
+    int is2b,
+    int type)          /* VMAP , VROTATE , else */
+{
+    unsigned long value;
+    int num,i,hit,csize;
+    FontData fontdata;
+    unsigned char *c;
+    int vfont_type;
+
+    c = str;
+    hit = -1;
+    if(type == VMAP){
+       fontdata = fs->vmap;
+       num      = fs->vmap_num;
+    } else if(type == VROTATE){
+        fontdata = (FontData)fs->vrotate;
+       num      = fs->vrotate_num;
+    } else {
+       if(fs->font_data_count <= 0 || fs->font_data == (FontData)NULL) {
+           fontdata = fs->substitute;
+           num      = fs->substitute_num;
+       }else {
+            fontdata = fs->font_data;
+           num      = fs->font_data_count;
+       }
+       /* CDExc20229 fix */
+       if(fontdata == NULL || num == 0){
+           return(NULL);
+       }
+    }
+
+
+    if(is2b){
+        csize = 2;
+    } else {
+        csize = 1;
+    }
+
+    for(;len;len--){
+        if(is2b){
+            value = (((unsigned long)*c) << 8)|(unsigned long)*(c + 1);
+        } else {
+            value = (unsigned long)*c;
+        }
+
+       /* ### NOTE: This routine DOES NOT WORK!
+       * ###       We can work around the problem in the calling routine,
+       * ###       but we really need to understand this better.  As it
+       * ###       stands, the algorithm ALWAYS returns "fontdata[0]"
+       * ###       for non-VW text!  This is clearly wrong.  In fact,
+       * ###       given the new parse_font[name|data]() algorithms,
+       * ###       we may not even need this routine to do anything
+       * ###       for non-VW text (since font_set->font always contains
+       * ###       the best font for this fontset).  -- jjw/pma (HP)
+       */
+        for (i=0;i<num;i++) {
+           if(type == VROTATE) {
+               if(fontdata[i].font) {
+                   /* If the num_cr equal zero, all character is rotated. */
+                   if(fontdata[i].scopes_num == 0) {
+                       break;
+                   } else {
+                       /* The vertical rotate glyph is not have code shift. */
+                       if (ismatch_scopes(&(fontdata[i]),&value,False)) {
+                           break;
+                       }
+                   }
+               }
+           } else if(type == VMAP) {
+               if(fontdata[i].font) {
+                   vfont_type = check_vertical_fonttype(fontdata[i].name);
+                   if(vfont_type == 0 || vfont_type == 1) {
+                       break;
+                   } else if(vfont_type == 2 || vfont_type == 3) {
+                       if(fontdata[i].scopes_num <= 0)
+                           break;
+
+                       if (ismatch_scopes(&(fontdata[i]),&value,True)) {
+                           break;
+                       }
+                   }
+               }
+           } else { /* FONTSCOPE */
+               if(fontdata[i].font) {
+                   if(fontdata[i].scopes_num <= 0)
+                        break;
+                   if (ismatch_scopes(&(fontdata[i]),&value,True)){
+                       break;
+                    }
+               }
+           }
+        }
+        if((hit != -1) && (i != hit)){
+            break;
+        }
+        if(i == num){
+            if( type == VROTATE || type == VMAP){
+               /* Change 1996.01.23 start */
+               if(fs->font_data_count <= 0 ||
+                  fs->font_data == (FontData)NULL)
+                   fontdata = fs->substitute;
+               else
+                   fontdata = fs->font_data;
+               /* Change 1996.01.23 end */
+           }
+           hit = 0;
+            c += csize;
+           break;
+        }
+        if( hit == -1 ) hit = i;
+        if(is2b){
+            *c = (unsigned char)(value >> 8);
+            *(c + 1) = (unsigned char)(value);
+        } else {
+            *c = (unsigned char)value;
+        }
+        c += csize;
+    }
+    *len_ret = (c - str);
+    return(&(fontdata[hit]));
+}
+/* for VW/UDC end   */
+
+static FontSet
+_XomGetFontSetFromCharSet(
+    XOC oc,
+    XlcCharSet charset)
+{
+    register FontSet font_set = XOC_GENERIC(oc)->font_set;
+    register int num = XOC_GENERIC(oc)->font_set_num;
+    XlcCharSet *charset_list;
+    int charset_count;
+
+    for ( ; num-- > 0; font_set++) {
+       charset_count = font_set->charset_count;
+       charset_list = font_set->charset_list;
+       for ( ; charset_count-- > 0; charset_list++)
+           if (*charset_list == charset)
+               return font_set;
+    }
+
+    return (FontSet) NULL;
+}
+
+#ifdef MUSTCOPY
+static void
+cs_to_xchar2b(
+    register char *from,
+    register XChar2b *to,
+    register length)
+{
+    while (length-- > 0) {
+       to->byte1 = *from++;
+       to->byte2 = *from++;
+       to++;
+    }
+}
+
+static void
+cs_to_xchar2b_gl(
+    register char *from,
+    register XChar2b *to,
+    register length)
+{
+    while (length-- > 0) {
+       to->byte1 = *from++ & 0x7f;
+       to->byte2 = *from++ & 0x7f;
+       to++;
+    }
+}
+
+static void
+cs_to_xchar2b_gr(
+    register char *from,
+    register XChar2b *to,
+    register length)
+{
+    while (length-- > 0) {
+       to->byte1 = *from++ | 0x80;
+       to->byte2 = *from++ | 0x80;
+       to++;
+    }
+}
+#endif
+
+static void
+shift_to_gl(
+    register char *text,
+    register int length)
+{
+    while (length-- > 0)
+       *text++ &= 0x7f;
+}
+
+static void
+shift_to_gr(
+    register char *text,
+    register int length)
+{
+    while (length-- > 0)
+       *text++ |= 0x80;
+}
+
+static Bool
+load_font(
+    XOC oc,
+    FontSet font_set)
+{
+    font_set->font = XLoadQueryFont(oc->core.om->core.display,
+                       oc->core.font_info.font_name_list[font_set->id]);
+    if (font_set->font == NULL)
+       return False;
+
+    oc->core.font_info.font_struct_list[font_set->id] = font_set->font;
+    XFreeFontInfo(NULL, font_set->info, 1);
+    font_set->info = NULL;
+
+    if (font_set->font->min_byte1 || font_set->font->max_byte1)
+       font_set->is_xchar2b = True;
+    else
+       font_set->is_xchar2b = False;
+
+    return True;
+}
+
+int
+_XomConvert(
+    XOC oc,
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    XPointer cs, lc_args[1];
+    XlcCharSet charset;
+    int length, cs_left, ret;
+    FontSet font_set;
+#ifdef MUSTCOPY
+    XChar2b *xchar2b;
+    char *buf, buf_local[BUFSIZ];
+#endif
+
+    cs = *to;
+    cs_left = *to_left;
+    lc_args[0] = (XPointer) &charset;
+
+    ret = _XlcConvert(conv, from, from_left, &cs, &cs_left, lc_args, 1);
+    if (ret < 0)
+       return -1;
+
+    font_set = _XomGetFontSetFromCharSet(oc, charset);
+    if (font_set == NULL)
+       return -1;
+
+    if (font_set->font == NULL && load_font(oc, font_set) == False)
+       return -1;
+
+    length = *to_left - cs_left;
+
+#ifdef MUSTCOPY
+    if (font_set->is_xchar2b) {
+       buf = (length > BUFSIZ) ? Xmalloc(length) : buf_local;
+       if (buf == NULL)
+           return -1;
+       memcpy(buf, (char *) *to, length);
+
+       xchar2b = (XChar2b *) *to;
+       length >>= 1;
+
+       if (font_set->side == charset->side)
+           cs_to_xchar2b(buf, xchar2b, length);
+       else if (font_set->side == XlcGL)
+           cs_to_xchar2b_gl(buf, xchar2b, length);
+       else if (font_set->side == XlcGR)
+           cs_to_xchar2b_gr(buf, xchar2b, length);
+       else
+           cs_to_xchar2b(buf, xchar2b, length);
+
+       if (buf != buf_local)
+           Xfree(buf);
+
+       *to = (XPointer) (xchar2b + length);
+       *to_left -= length;
+    } else
+#endif
+    {
+       if (font_set->side != charset->side) {
+           if (font_set->side == XlcGL)
+               shift_to_gl(*to, length);
+           else if (font_set->side == XlcGR)
+               shift_to_gr(*to, length);
+       }
+
+       if (font_set->is_xchar2b)
+           length >>= 1;
+       *to = cs;
+       *to_left -= length;
+    }
+
+    *((XFontStruct **) args[0]) = font_set->font;
+    *((Bool *) args[1]) = font_set->is_xchar2b;
+    if(num_args >= 3){
+        *((FontSet *) args[2]) = font_set;
+    }
+
+    return ret;
+}
+
+XlcConv
+_XomInitConverter(
+    XOC oc,
+    XOMTextType type)
+{
+    XOCGenericPart *gen = XOC_GENERIC(oc);
+    XlcConv *convp;
+    const char *conv_type;
+    XlcConv conv;
+    XLCd lcd;
+
+    switch (type) {
+    case XOMWideChar:
+       convp = &gen->wcs_to_cs;
+       conv_type = XlcNWideChar;
+       break;
+    case XOMMultiByte:
+       convp = &gen->mbs_to_cs;
+       conv_type = XlcNMultiByte;
+       break;
+    case XOMUtf8String:
+       convp = &gen->utf8_to_cs;
+       conv_type = XlcNUtf8String;
+       break;
+    default:
+       return (XlcConv) NULL;
+    }
+
+    conv = *convp;
+    if (conv) {
+       _XlcResetConverter(conv);
+       return conv;
+    }
+
+    lcd = oc->core.om->core.lcd;
+
+    conv = _XlcOpenConverter(lcd, conv_type, lcd, XlcNFontCharSet);
+    if (conv == (XlcConv) NULL) {
+        conv = _XlcOpenConverter(lcd, conv_type, lcd, XlcNCharSet);
+        if (conv == (XlcConv) NULL)
+           return (XlcConv) NULL;
+    }
+
+    *convp = conv;
+    return conv;
+}
diff --git a/nls/C/Compose.pre b/nls/C/Compose.pre
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/nls/C/XI18N_OBJS b/nls/C/XI18N_OBJS
new file mode 100644 (file)
index 0000000..32e4f35
--- /dev/null
@@ -0,0 +1,8 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for euro locales
+#
+XLC    common/xlibi18n _XlcGenericLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM      # XIM_open
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
+
diff --git a/nls/C/XLC_LOCALE.pre b/nls/C/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..4653930
--- /dev/null
@@ -0,0 +1,61 @@
+XCOMM  XLocale Database Sample for C.
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name    ISO8859-1:GL
+       }
+       font    {
+               primary         ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          STRING
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+force_convert_to_mb    True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     ISO8859-1:GL
+}
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     ISO8859-1:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/Makefile.am b/nls/Makefile.am
new file mode 100644 (file)
index 0000000..0eced4c
--- /dev/null
@@ -0,0 +1,52 @@
+
+x11localedir = $(X11_LOCALEDATADIR)
+CLEANFILES =
+SUFFIXES =
+
+EXTRA_DIST = locale.alias.pre compose.dir.pre locale.dir.pre \
+       compose-check.pl
+
+x11locale_DATA = locale.alias locale.dir compose.dir
+
+CLEANFILES += \
+       locale.alias locale.alias.l1 locale.alias.l2 \
+       compose.dir compose.dir.l1 compose.dir.l2 \
+       locale.dir locale.dir.l1 locale.dir.l2 \
+       XLC_LOCALE
+
+include $(top_srcdir)/cpprules.in
+
+# Global data files
+
+locale.alias: locale.alias.pre
+       $(AM_V_GEN)$(RAWCPP) $(RAWCPPFLAGS) $(CPP_FILES_FLAGS) < $(srcdir)/locale.alias.pre | $(CPP_SED_MAGIC) > locale.alias.l1
+       $(SED) -e '/^[^#][^        ]*:/s/://' -e '/^[^#].*[        ].*:/d' \
+        < locale.alias.l1 > locale.alias.l2
+       cat locale.alias.l2 locale.alias.l1 > locale.alias
+
+compose.dir: compose.dir.pre
+       $(AM_V_GEN)$(RAWCPP) $(RAWCPPFLAGS) $(CPP_FILES_FLAGS) < $(srcdir)/compose.dir.pre | $(CPP_SED_MAGIC) > compose.dir.l1
+       $(SED) -e '/^[^#][^        ]*:/s/://' -e '/^[^#].*[        ].*:/d' \
+        < compose.dir.l1 > compose.dir.l2
+       cat compose.dir.l2 compose.dir.l1 > compose.dir
+
+locale.dir: locale.dir.pre
+       $(AM_V_GEN)$(RAWCPP) $(RAWCPPFLAGS) $(CPP_FILES_FLAGS) < $(srcdir)/locale.dir.pre | $(CPP_SED_MAGIC) > locale.dir.l1
+       $(SED) -e '/^[^#][^        ]*:/s/://' -e '/^[^#].*[        ].*:/d' \
+        < locale.dir.l1 > locale.dir.l2
+       cat locale.dir.l2 locale.dir.l1 > locale.dir
+
+if HAVE_PERL
+TESTS_ENVIRONMENT = $(PERL)
+TESTS = $(srcdir)/compose-check.pl
+endif HAVE_PERL
+
+
+# Per-locale data files
+
+nobase_dist_x11locale_DATA = $(locales:%=%/XI18N_OBJS)
+
+nobase_x11locale_DATA = $(locales:%=%/XLC_LOCALE) $(locales:%=%/Compose)
+EXTRA_DIST += $(nobase_x11locale_DATA:%=%.pre)
+CLEANFILES += $(nobase_x11locale_DATA)
+
diff --git a/nls/am_ET.UTF-8/Compose.pre b/nls/am_ET.UTF-8/Compose.pre
new file mode 100644 (file)
index 0000000..760d946
--- /dev/null
@@ -0,0 +1,360 @@
+XCOMM 
+XCOMM UTF-8 (Unicode) compose sequence
+XCOMM for Ethiopean layout.
+XCOMM Designed as a part of OLPC project
+XCOMM
+XCOMM 2007 Sergey Udaltsov <svu@gnome.org>
+XCOMM
+
+
+XCOMM
+XCOMM Group I
+XCOMM
+
+XCOMM Modifier: /u/
+<u> <U1200> : "ሁ" U1201 # key h (base character ሀ)
+<u> <U1208> : "ሉ" U1209 # key l (base character ለ)
+<u> <U1218> : "ሙ" U1219 # key m (base character መ)
+<u> <U1228> : "ሩ" U1229 # key r (base character ረ)
+<u> <U1230> : "ሱ" U1231 # key s (base character ሰ)
+<u> <U1240> : "ቁ" U1241 # key q (base character ቀ)
+<u> <U1260> : "ቡ" U1261 # key b (base character በ)
+<u> <U1270> : "ቱ" U1271 # key t (base character ተ)
+<u> <U1290> : "ኑ" U1291 # key n (base character ነ)
+<u> <U12A0> : "ኡ" U12A1 # key x (base character አ)
+<u> <U12A8> : "ኩ" U12A9 # key k (base character ከ)
+<u> <U12C8> : "ዉ" U12C9 # key w (base character ወ)
+<u> <U12D8> : "ዙ" U12D9 # key z (base character ዘ)
+<u> <U12E8> : "ዩ" U12E9 # key y (base character የ)
+<u> <U12F0> : "ዱ" U12F1 # key d (base character ደ)
+<u> <U1300> : "ጁ" U1301 # key j (base character ጀ)
+<u> <U1308> : "ጉ" U1309 # key g (base character ገ)
+<u> <U1340> : "ፁ" U1341 # key [ (base character ፀ)
+<u> <U1348> : "ፉ" U1349 # key f (base character ፈ)
+<u> <U1350> : "ፑ" U1351 # key p (base character ፐ)
+<u> <U1238> : "ሹ" U1239 # key v (base character ሸ)
+<u> <U1328> : "ጩ" U1329 # key ] (base character ጨ)
+
+XCOMM Modifier: /i/
+<i> <U1200> : "ሂ" U1202 # key h (base character ሀ)
+<i> <U1208> : "ሊ" U120A # key l (base character ለ)
+<i> <U1218> : "ሚ" U121A # key m (base character መ)
+<i> <U1228> : "ሪ" U122A # key r (base character ረ)
+<i> <U1230> : "ሲ" U1232 # key s (base character ሰ)
+<i> <U1240> : "ቂ" U1242 # key q (base character ቀ)
+<i> <U1260> : "ቢ" U1262 # key b (base character በ)
+<i> <U1270> : "ቲ" U1272 # key t (base character ተ)
+<i> <U1290> : "ኒ" U1292 # key n (base character ነ)
+<i> <U12A0> : "ኢ" U12A2 # key x (base character አ)
+<i> <U12A8> : "ኪ" U12AA # key k (base character ከ)
+<i> <U12C8> : "ዊ" U12CA # key w (base character ወ)
+<i> <U12D8> : "ዚ" U12DA # key z (base character ዘ)
+<i> <U12E8> : "ዪ" U12EA # key y (base character የ)
+<i> <U12F0> : "ዲ" U12F2 # key d (base character ደ)
+<i> <U1300> : "ጂ" U1302 # key j (base character ጀ)
+<i> <U1308> : "ጊ" U130A # key g (base character ገ)
+<i> <U1340> : "ፂ" U1342 # key [ (base character ፀ)
+<i> <U1348> : "ፊ" U134A # key f (base character ፈ)
+<i> <U1350> : "ፒ" U1352 # key p (base character ፐ)
+<i> <U1238> : "ሺ" U123A # key v (base character ሸ)
+<i> <U1328> : "ጪ" U132A # key ] (base character ጨ)
+
+XCOMM Modifier: /a/
+<a> <U1200> : "ሃ" U1203 # key h (base character ሀ)
+<a> <U1208> : "ላ" U120B # key l (base character ለ)
+<a> <U1218> : "ማ" U121B # key m (base character መ)
+<a> <U1228> : "ራ" U122B # key r (base character ረ)
+<a> <U1230> : "ሳ" U1233 # key s (base character ሰ)
+<a> <U1240> : "ቃ" U1243 # key q (base character ቀ)
+<a> <U1260> : "ባ" U1263 # key b (base character በ)
+<a> <U1270> : "ታ" U1273 # key t (base character ተ)
+<a> <U1290> : "ና" U1293 # key n (base character ነ)
+<a> <U12A0> : "ኣ" U12A3 # key x (base character አ)
+<a> <U12A8> : "ካ" U12AB # key k (base character ከ)
+<a> <U12C8> : "ዋ" U12CB # key w (base character ወ)
+<a> <U12D8> : "ዛ" U12DB # key z (base character ዘ)
+<a> <U12E8> : "ያ" U12EB # key y (base character የ)
+<a> <U12F0> : "ዳ" U12F3 # key d (base character ደ)
+<a> <U1300> : "ጃ" U1303 # key j (base character ጀ)
+<a> <U1308> : "ጋ" U130B # key g (base character ገ)
+<a> <U1340> : "ፃ" U1343 # key [ (base character ፀ)
+<a> <U1348> : "ፋ" U134B # key f (base character ፈ)
+<a> <U1350> : "ፓ" U1353 # key p (base character ፐ)
+<a> <U1238> : "ሻ" U123B # key v (base character ሸ)
+<a> <U1328> : "ጫ" U132B # key ] (base character ጨ)
+
+XCOMM Modifier: /e/
+<e> <U1200> : "ሄ" U1204 # key h (base character ሀ)
+<e> <U1208> : "ሌ" U120C # key l (base character ለ)
+<e> <U1218> : "ሜ" U121C # key m (base character መ)
+<e> <U1228> : "ሬ" U122C # key r (base character ረ)
+<e> <U1230> : "ሴ" U1234 # key s (base character ሰ)
+<e> <U1240> : "ቄ" U1244 # key q (base character ቀ)
+<e> <U1260> : "ቤ" U1264 # key b (base character በ)
+<e> <U1270> : "ቴ" U1274 # key t (base character ተ)
+<e> <U1290> : "ኔ" U1294 # key n (base character ነ)
+<e> <U12A0> : "ኤ" U12A4 # key x (base character አ)
+<e> <U12A8> : "ኬ" U12AC # key k (base character ከ)
+<e> <U12C8> : "ዌ" U12CC # key w (base character ወ)
+<e> <U12D8> : "ዜ" U12DC # key z (base character ዘ)
+<e> <U12E8> : "ዬ" U12EC # key y (base character የ)
+<e> <U12F0> : "ዴ" U12F4 # key d (base character ደ)
+<e> <U1300> : "ጄ" U1304 # key j (base character ጀ)
+<e> <U1308> : "ጌ" U130C # key g (base character ገ)
+<e> <U1340> : "ፄ" U1344 # key [ (base character ፀ)
+<e> <U1348> : "ፌ" U134C # key f (base character ፈ)
+<e> <U1350> : "ፔ" U1354 # key p (base character ፐ)
+<e> <U1238> : "ሼ" U123C # key v (base character ሸ)
+<e> <U1328> : "ጬ" U132C # key ] (base character ጨ)
+
+XCOMM Modifier: /c/
+<c> <U1200> : "ህ" U1205 # key h (base character ሀ)
+<c> <U1208> : "ል" U120D # key l (base character ለ)
+<c> <U1218> : "ም" U121D # key m (base character መ)
+<c> <U1228> : "ር" U122D # key r (base character ረ)
+<c> <U1230> : "ስ" U1235 # key s (base character ሰ)
+<c> <U1240> : "ቅ" U1245 # key q (base character ቀ)
+<c> <U1260> : "ብ" U1265 # key b (base character በ)
+<c> <U1270> : "ት" U1275 # key t (base character ተ)
+<c> <U1290> : "ን" U1295 # key n (base character ነ)
+<c> <U12A0> : "እ" U12A5 # key x (base character አ)
+<c> <U12A8> : "ክ" U12AD # key k (base character ከ)
+<c> <U12C8> : "ው" U12CD # key w (base character ወ)
+<c> <U12D8> : "ዝ" U12DD # key z (base character ዘ)
+<c> <U12E8> : "ይ" U12ED # key y (base character የ)
+<c> <U12F0> : "ድ" U12F5 # key d (base character ደ)
+<c> <U1300> : "ጅ" U1305 # key j (base character ጀ)
+<c> <U1308> : "ግ" U130D # key g (base character ገ)
+<c> <U1340> : "ፅ" U1345 # key [ (base character ፀ)
+<c> <U1348> : "ፍ" U134D # key f (base character ፈ)
+<c> <U1350> : "ፕ" U1355 # key p (base character ፐ)
+<c> <U1238> : "ሽ" U123D # key v (base character ሸ)
+<c> <U1328> : "ጭ" U132D # key ] (base character ጨ)
+
+XCOMM Modifier: /o/
+<o> <U1200> : "ሆ" U1206 # key h (base character ሀ)
+<o> <U1208> : "ሎ" U120E # key l (base character ለ)
+<o> <U1218> : "ሞ" U121E # key m (base character መ)
+<o> <U1228> : "ሮ" U122E # key r (base character ረ)
+<o> <U1230> : "ሶ" U1236 # key s (base character ሰ)
+<o> <U1240> : "ቆ" U1246 # key q (base character ቀ)
+<o> <U1260> : "ቦ" U1266 # key b (base character በ)
+<o> <U1270> : "ቶ" U1276 # key t (base character ተ)
+<o> <U1290> : "ኖ" U1296 # key n (base character ነ)
+<o> <U12A0> : "ኦ" U12A6 # key x (base character አ)
+<o> <U12A8> : "ኮ" U12AE # key k (base character ከ)
+<o> <U12C8> : "ዎ" U12CE # key w (base character ወ)
+<o> <U12D8> : "ዞ" U12DE # key z (base character ዘ)
+<o> <U12E8> : "ዮ" U12EE # key y (base character የ)
+<o> <U12F0> : "ዶ" U12F6 # key d (base character ደ)
+<o> <U1300> : "ጆ" U1306 # key j (base character ጀ)
+<o> <U1308> : "ጎ" U130E # key g (base character ገ)
+<o> <U1340> : "ፆ" U1346 # key [ (base character ፀ)
+<o> <U1348> : "ፎ" U134E # key f (base character ፈ)
+<o> <U1350> : "ፖ" U1356 # key p (base character ፐ)
+<o> <U1238> : "ሾ" U123E # key v (base character ሸ)
+<o> <U1328> : "ጮ" U132E # key ] (base character ጨ)
+
+XCOMM Modifier: /A/
+<A> <U1208> : "ሏ" U120F # key l (base character ለ)
+<A> <U1218> : "ሟ" U121F # key m (base character መ)
+<A> <U1228> : "ሯ" U122F # key r (base character ረ)
+<A> <U1230> : "ሷ" U1237 # key s (base character ሰ)
+<A> <U1240> : "ቋ" U124B # key q (base character ቀ)
+<A> <U1260> : "ቧ" U1267 # key b (base character በ)
+<A> <U1270> : "ቷ" U1277 # key t (base character ተ)
+<A> <U1290> : "ኗ" U1297 # key n (base character ነ)
+<A> <U12A0> : "ኧ" U12A7 # key x (base character አ)
+<A> <U12A8> : "ኳ" U12B3 # key k (base character ከ)
+<A> <U12D8> : "ዟ" U12DF # key z (base character ዘ)
+<A> <U12F0> : "ዷ" U12F7 # key d (base character ደ)
+<A> <U1300> : "ጇ" U1307 # key j (base character ጀ)
+<A> <U1308> : "ጓ" U1313 # key g (base character ገ)
+<A> <U1348> : "ፏ" U134F # key f (base character ፈ)
+<A> <U1350> : "ፗ" U1357 # key p (base character ፐ)
+<A> <U1238> : "ሿ" U123F # key v (base character ሸ)
+<A> <U1328> : "ጯ" U132F # key ] (base character ጨ)
+
+XCOMM Modifier: /U/
+<U> <U1240> : "ቍ" U124D # key q (base character ቀ)
+<U> <U12A8> : "ኵ" U12B5 # key k (base character ከ)
+<U> <U1308> : "ጕ" U1315 # key g (base character ገ)
+
+XCOMM Modifier: /I/
+<I> <U1240> : "ቊ" U124A # key q (base character ቀ)
+<I> <U12A8> : "ኲ" U12B2 # key k (base character ከ)
+<I> <U1308> : "ጒ" U1312 # key g (base character ገ)
+
+XCOMM Modifier: /E/
+<E> <U1240> : "ቌ" U124C # key q (base character ቀ)
+<E> <U12A8> : "ኴ" U12B4 # key k (base character ከ)
+<E> <U1308> : "ጔ" U1314 # key g (base character ገ)
+
+XCOMM Modifier: /O/
+<O> <U1240> : "ቈ" U1248 # key q (base character ቀ)
+<O> <U12A8> : "ኰ" U12B0 # key k (base character ከ)
+<O> <U1308> : "ጐ" U1310 # key g (base character ገ)
+
+XCOMM
+XCOMM Group II
+XCOMM
+XCOMM Modifier: /u/
+<u> <U1210> : "ሑ" U1211 # key h (base character ሐ)
+<u> <U1220> : "ሡ" U1221 # key s (base character ሠ)
+<u> <U1250> : "ቑ" U1251 # key q (base character ቐ)
+<u> <U1278> : "ቹ" U1279 # key c (base character ቸ)
+<u> <U1320> : "ጡ" U1321 # key t (base character ጠ)
+<u> <U1298> : "ኙ" U1299 # key n (base character ኘ)
+<u> <U12D0> : "ዑ" U12D1 # key x (base character ዐ)
+<u> <U12B8> : "ኹ" U12B9 # key k (base character ኸ)
+<u> <U12E0> : "ዡ" U12E1 # key z (base character ዠ)
+<u> <U12F8> : "ዹ" U12F9 # key d (base character ዸ)
+<u> <U1318> : "ጙ" U1319 # key g (base character ጘ)
+<u> <U1338> : "ጹ" U1339 # key [ (base character ጸ)
+<u> <U1330> : "ጱ" U1331 # key p (base character ጰ)
+<u> <U1280> : "ኁ" U1281 # key ] (base character ኀ)
+<u> <U1268> : "ቩ" U1269 # key v (base character ቨ)
+
+XCOMM Modifier: /i/
+<i> <U1210> : "ሒ" U1212 # key h (base character ሐ)
+<i> <U1220> : "ሢ" U1222 # key s (base character ሠ)
+<i> <U1250> : "ቒ" U1252 # key q (base character ቐ)
+<i> <U1278> : "ቺ" U127A # key c (base character ቸ)
+<i> <U1320> : "ጢ" U1322 # key t (base character ጠ)
+<i> <U1298> : "ኚ" U129A # key n (base character ኘ)
+<i> <U12D0> : "ዒ" U12D2 # key x (base character ዐ)
+<i> <U12B8> : "ኺ" U12BA # key k (base character ኸ)
+<i> <U12E0> : "ዢ" U12E2 # key z (base character ዠ)
+<i> <U12F8> : "ዺ" U12FA # key d (base character ዸ)
+<i> <U1318> : "ጚ" U131A # key g (base character ጘ)
+<i> <U1338> : "ጺ" U133A # key [ (base character ጸ)
+<i> <U1330> : "ጲ" U1332 # key p (base character ጰ)
+<i> <U1280> : "ኂ" U1282 # key ] (base character ኀ)
+<i> <U1268> : "ቪ" U126A # key v (base character ቨ)
+
+XCOMM Modifier: /a/
+<a> <U1210> : "ሓ" U1213 # key h (base character ሐ)
+<a> <U1220> : "ሣ" U1223 # key s (base character ሠ)
+<a> <U1250> : "ቓ" U1253 # key q (base character ቐ)
+<a> <U1278> : "ቻ" U127B # key c (base character ቸ)
+<a> <U1320> : "ጣ" U1323 # key t (base character ጠ)
+<a> <U1298> : "ኛ" U129B # key n (base character ኘ)
+<a> <U12D0> : "ዓ" U12D3 # key x (base character ዐ)
+<a> <U12B8> : "ኻ" U12BB # key k (base character ኸ)
+<a> <U12E0> : "ዣ" U12E3 # key z (base character ዠ)
+<a> <U12F8> : "ዻ" U12FB # key d (base character ዸ)
+<a> <U1318> : "ጛ" U131B # key g (base character ጘ)
+<a> <U1338> : "ጻ" U133B # key [ (base character ጸ)
+<a> <U1330> : "ጳ" U1333 # key p (base character ጰ)
+<a> <U1280> : "ኃ" U1283 # key ] (base character ኀ)
+<a> <U1268> : "ቫ" U126B # key v (base character ቨ)
+
+XCOMM Modifier: /e/
+<e> <U1210> : "ሔ" U1214 # key h (base character ሐ)
+<e> <U1220> : "ሤ" U1224 # key s (base character ሠ)
+<e> <U1250> : "ቔ" U1254 # key q (base character ቐ)
+<e> <U1278> : "ቼ" U127C # key c (base character ቸ)
+<e> <U1320> : "ጤ" U1324 # key t (base character ጠ)
+<e> <U1298> : "ኜ" U129C # key n (base character ኘ)
+<e> <U12D0> : "ዔ" U12D4 # key x (base character ዐ)
+<e> <U12B8> : "ኼ" U12BC # key k (base character ኸ)
+<e> <U12E0> : "ዤ" U12E4 # key z (base character ዠ)
+<e> <U12F8> : "ዼ" U12FC # key d (base character ዸ)
+<e> <U1318> : "ጜ" U131C # key g (base character ጘ)
+<e> <U1338> : "ጼ" U133C # key [ (base character ጸ)
+<e> <U1330> : "ጴ" U1334 # key p (base character ጰ)
+<e> <U1280> : "ኄ" U1284 # key ] (base character ኀ)
+<e> <U1268> : "ቬ" U126C # key v (base character ቨ)
+
+XCOMM Modifier: /c/
+<c> <U1210> : "ሕ" U1215 # key h (base character ሐ)
+<c> <U1220> : "ሥ" U1225 # key s (base character ሠ)
+<c> <U1250> : "ቕ" U1255 # key q (base character ቐ)
+<c> <U1278> : "ች" U127D # key c (base character ቸ)
+<c> <U1320> : "ጥ" U1325 # key t (base character ጠ)
+<c> <U1298> : "ኝ" U129D # key n (base character ኘ)
+<c> <U12D0> : "ዕ" U12D5 # key x (base character ዐ)
+<c> <U12B8> : "ኽ" U12BD # key k (base character ኸ)
+<c> <U12E0> : "ዥ" U12E5 # key z (base character ዠ)
+<c> <U12F8> : "ዽ" U12FD # key d (base character ዸ)
+<c> <U1318> : "ጝ" U131D # key g (base character ጘ)
+<c> <U1338> : "ጽ" U133D # key [ (base character ጸ)
+<c> <U1330> : "ጵ" U1335 # key p (base character ጰ)
+<c> <U1280> : "ኅ" U1285 # key ] (base character ኀ)
+<c> <U1268> : "ቭ" U126D # key v (base character ቨ)
+
+XCOMM Modifier: /o/
+<o> <U1210> : "ሖ" U1216 # key h (base character ሐ)
+<o> <U1220> : "ሦ" U1226 # key s (base character ሠ)
+<o> <U1250> : "ቖ" U1256 # key q (base character ቐ)
+<o> <U1278> : "ቾ" U127E # key c (base character ቸ)
+<o> <U1320> : "ጦ" U1326 # key t (base character ጠ)
+<o> <U1298> : "ኞ" U129E # key n (base character ኘ)
+<o> <U12D0> : "ዖ" U12D6 # key x (base character ዐ)
+<o> <U12B8> : "ኾ" U12BE # key k (base character ኸ)
+<o> <U12E0> : "ዦ" U12E6 # key z (base character ዠ)
+<o> <U12F8> : "ዾ" U12FE # key d (base character ዸ)
+<o> <U1318> : "ጞ" U131E # key g (base character ጘ)
+<o> <U1338> : "ጾ" U133E # key [ (base character ጸ)
+<o> <U1330> : "ጶ" U1336 # key p (base character ጰ)
+<o> <U1280> : "ኆ" U1286 # key ] (base character ኀ)
+<o> <U1268> : "ቮ" U126E # key v (base character ቨ)
+
+XCOMM Modifier: /A/
+<A> <U1210> : "ሗ" U1217 # key h (base character ሐ)
+<A> <U1220> : "ሧ" U1227 # key s (base character ሠ)
+<A> <U1250> : "ቛ" U125B # key q (base character ቐ)
+<A> <U1278> : "ቿ" U127F # key c (base character ቸ)
+<A> <U1320> : "ጧ" U1327 # key t (base character ጠ)
+<A> <U1298> : "ኟ" U129F # key n (base character ኘ)
+<A> <U12B8> : "ዃ" U12C3 # key k (base character ኸ)
+<A> <U12E0> : "ዧ" U12E7 # key z (base character ዠ)
+<A> <U12F8> : "ዿ" U12FF # key d (base character ዸ)
+<A> <U1338> : "ጿ" U133F # key [ (base character ጸ)
+<A> <U1330> : "ጷ" U1337 # key p (base character ጰ)
+<A> <U1280> : "ኋ" U128B # key ] (base character ኀ)
+<A> <U1268> : "ቯ" U126F # key v (base character ቨ)
+
+XCOMM Modifier: /U/
+<U> <U1250> : "ቝ" U125D # key q (base character ቐ)
+<U> <U12B8> : "ዅ" U12C5 # key k (base character ኸ)
+
+XCOMM Modifier: /I/
+<I> <U1250> : "ቚ" U125A # key q (base character ቐ)
+<I> <U12B8> : "ዂ" U12C2 # key k (base character ኸ)
+
+XCOMM Modifier: /E/
+<E> <U1250> : "ቜ" U125C # key q (base character ቐ)
+<E> <U12B8> : "ዄ" U12C4 # key k (base character ኸ)
+
+XCOMM Modifier: /O/
+<O> <U1250> : "ቘ" U1258 # key q (base character ቐ)
+<O> <U12B8> : "ዀ" U12C0 # key k (base character ኸ)
+
+XCOMM
+XCOMM Group III
+XCOMM 
+<backslash> <quotedbl> : "፥" U1365 # key "
+<backslash> <apostrophe> : "፦" U1366 # key "
+<backslash> <minus> : "|" U007C # key -
+<backslash> <underscore> : "¥" U00A5 # key _
+<backslash> <question> : "፧" U1367 # key ?
+
+XCOMM 
+XCOMM Khmer digraphs
+XCOMM 
+
+<U17ff> :   "ាំ"
+<U17fe> :   "ោះ"
+<U17fd> :   "េះ"
+<U17fc> :   "ុំ"
+<U17fb> :   "ុះ"
+
+XCOMM
+XCOMM Arabic Lam-Alef ligatures
+XCOMM
+
+<UFEFB>        :   "لا" # ARABIC LIGATURE LAM WITH ALEF
+<UFEF7>        :   "لأ" # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE
+<UFEF9>        :   "لإ" # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW
+<UFEF5>        :   "لآ" # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE
diff --git a/nls/am_ET.UTF-8/XI18N_OBJS b/nls/am_ET.UTF-8/XI18N_OBJS
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/nls/am_ET.UTF-8/XLC_LOCALE.pre b/nls/am_ET.UTF-8/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/nls/armscii-8/Compose.pre b/nls/armscii-8/Compose.pre
new file mode 100644 (file)
index 0000000..f9ac7de
--- /dev/null
@@ -0,0 +1,14 @@
+XCOMM
+XCOMM ARMSCII-8 Compose Sequence
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM
+XCOMM This file currently has no entries.  It appears that a compose file (even
+XCOMM just an empty one) is required for the appropriate keysyms to work for
+XCOMM this encoding.
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+
+XCOMM End of Sequence Definition
diff --git a/nls/armscii-8/XI18N_OBJS b/nls/armscii-8/XI18N_OBJS
new file mode 100644 (file)
index 0000000..02d87c6
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for armscii-8 locale
+#
+XLC    common/xlcDef   _XlcDefaultLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/armscii-8/XLC_LOCALE.pre b/nls/armscii-8/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..72013f7
--- /dev/null
@@ -0,0 +1,79 @@
+XCOMM  XLocale Database Sample for armscii-8.
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         ARMSCII-8:GL
+               substitute      ISO8859-1:GL
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset         ARMSCII-8:GR
+       font            ARMSCII-8:GR
+}
+END XLC_FONTSET
+
+XCOMM
+XCOMM  XLC_CHARSET_DEFINE category
+XCOMM
+XLC_CHARSET_DEFINE
+csd0   {
+       charset_name    ARMSCII-8
+       side            GR
+       length          1
+       string_encoding False
+       sequence        \x1b%/1
+}
+END XLC_CHARSET_DEFINE
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name           ARMSCII-8
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     ARMSCII-8:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     ARMSCII-8:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/compose-check.pl b/nls/compose-check.pl
new file mode 100755 (executable)
index 0000000..399bfa9
--- /dev/null
@@ -0,0 +1,161 @@
+#! /usr/bin/perl
+#
+# Copyright 2009 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.
+#
+
+#
+# Check a compose file for duplicate/conflicting entries and other common errors
+#
+
+# Compose file grammar is defined in modules/im/ximcp/imLcPrs.c
+
+use strict;
+use warnings;
+
+my $error_count = 0;
+
+if (scalar(@ARGV) == 0) {
+  if ( -f 'Compose' ) {
+    push @ARGV, 'Compose';
+  } else {
+    push @ARGV, glob '*/Compose';
+  }
+}
+
+foreach my $cf (@ARGV) {
+  # print "Checking $cf\n";
+  $error_count += check_compose_file($cf);
+}
+
+exit($error_count);
+
+sub check_compose_file {
+  my ($filename) = @_;
+  my $errors = 0;
+
+  my %compose_table = ();
+  my $line = 0;
+  my $pre_file = ($filename =~ m{\.pre$}) ? 1 : 0;
+  my $in_c_comment = 0;
+
+  open my $COMPOSE, '<', $filename or die "Could not open $filename: $!";
+
+ COMPOSE_LINE:
+  while (my $cl = <$COMPOSE>) {
+    $line++;
+    chomp($cl);
+    my $original_line = $cl;
+
+    # Special handling for changes cpp makes to .pre files
+    if ($pre_file == 1) {
+      if ($in_c_comment) {             # Look for end of multi-line C comment
+       if ($cl =~ m{\*/(.*)$}) {
+         $cl = $1;
+         $in_c_comment = 0;
+       } else {
+         next;
+       }
+      }
+      $cl =~ s{/\*.\**/}{};            # Remove single line C comments
+      if ($cl =~ m{^(.*)/\*}) {                # Start of a multi-line C comment
+       $cl = $1;
+       $in_c_comment = 1;
+      }
+      next if $cl =~ m{^\s*XCOMM};     # Skip pre-processing comments
+    }
+
+    $cl =~ s{#.*$}{};                  # Remove comments
+    next if $cl =~ m{^\s*$};           # Skip blank (or comment-only) lines
+    chomp($cl);
+
+    if ($cl =~ m{^(STATE\s+|END_STATE)}) { # Sun extension to compose file syntax
+      %compose_table = ();
+    }
+    elsif ($cl =~ m{^([^:]+)\s*:\s*(.+)$}) {
+      my ($seq, $action) = ($1, $2);
+      $seq =~ s{\s+$}{};
+
+      my @keys = grep { $_ !~ m/^\s*$/ } split /[\s\<\>]+/, $seq;
+
+      my $final_key = pop @keys;
+      my $keytable = \%compose_table;
+
+      foreach my $k (@keys) {
+       if ($k =~ m{^U([[:xdigit:]]+)$}) {
+         $k = 'U' . lc($1);
+       }
+       if (exists $keytable->{$k}) {
+         $keytable = $keytable->{$k};
+         if (ref($keytable) ne 'HASH') {
+           print
+             "Clash with existing sequence in $filename on line $line: $seq\n";
+           print_sequences([$line, $original_line]);
+           print_sequences($keytable);
+           $errors++;
+           next COMPOSE_LINE;
+         }
+       } else {
+         my $new_keytable = {};
+         $keytable->{$k} = $new_keytable;
+         $keytable = $new_keytable;
+       }
+      }
+
+      if (exists $keytable->{$final_key}) {
+       print "Clash with existing sequence in $filename on line $line: $seq\n";
+       print_sequences([$line, $original_line]);
+       print_sequences($keytable->{$final_key});
+       $errors++;
+      } else {
+       $keytable->{$final_key} = [$line, $original_line];
+      }
+    } elsif ($cl =~ m{^(STATE_TYPE:|\@StartDeadKeyMap|\@EndDeadKeyMap)}) {
+      # ignore
+    } elsif ($cl =~ m{^include "(.*)"}) {
+      my $incpath = $1;
+      if (($pre_file == 1) && ($incpath !~ m{^X11_LOCALEDATADIR/})) {
+       print "Include path starts with $incpath instead of X11_LOCALEDATADIR\n",
+        " -- may not find include files when installed in alternate paths\n\n";
+      }
+    } else {
+      print 'Unrecognized pattern in ', $filename, ' on line #', $line, ":\n  ",
+       $cl, "\n";
+    }
+  }
+  close $COMPOSE;
+
+  return $errors;
+}
+
+sub print_sequences {
+  my ($entry_ref) = @_;
+
+  if (ref($entry_ref) eq 'HASH') {
+    foreach my $h (values %{$entry_ref}) {
+      print_sequences($h);
+    }
+  } else {
+    my ($line, $seq) = @{$entry_ref};
+
+    print "  line #", $line, ": ", $seq, "\n";
+  }
+}
diff --git a/nls/compose.dir.pre b/nls/compose.dir.pre
new file mode 100644 (file)
index 0000000..14a2fa9
--- /dev/null
@@ -0,0 +1,420 @@
+XCOMM
+XCOMM  This file contains compose table file name.
+XCOMM  The first word is the compose table file name and
+XCOMM  the second word is full locale name.
+XCOMM
+XCOMM
+iso8859-1/Compose:             C
+iso8859-1/Compose:             af_ZA.ISO8859-1
+iso8859-6/Compose:             ar_AA.ISO8859-6
+iso8859-6/Compose:             ar_BH.ISO8859-6
+iso8859-6/Compose:             ar_DZ.ISO8859-6
+iso8859-6/Compose:             ar_EG.ISO8859-6
+iso8859-6/Compose:             ar_IQ.ISO8859-6
+iso8859-6/Compose:             ar_JO.ISO8859-6
+iso8859-6/Compose:             ar_KW.ISO8859-6
+iso8859-6/Compose:             ar_LB.ISO8859-6
+iso8859-6/Compose:             ar_LY.ISO8859-6
+iso8859-6/Compose:             ar_MA.ISO8859-6
+iso8859-6/Compose:             ar_OM.ISO8859-6
+iso8859-6/Compose:             ar_QA.ISO8859-6
+iso8859-6/Compose:             ar_SA.ISO8859-6
+iso8859-6/Compose:             ar_TN.ISO8859-6
+iso8859-6/Compose:             ar_YE.ISO8859-6
+iso8859-9e/Compose:            az_AZ.ISO8859-9E
+koi8-c/Compose:                        a3_AZ.KOI8-C
+microsoft-cp1251/Compose:      be_BY.CP1251
+iso8859-5/Compose:             bg_BG.ISO8859-5
+microsoft-cp1251/Compose:      bg_BG.CP1251
+iso8859-1/Compose:             br_FR.ISO8859-1
+iso8859-14/Compose:            br_FR.ISO8859-14
+iso8859-15/Compose:            br_FR.ISO8859-15
+iso8859-2/Compose:             bs_BA.ISO8859-2
+iso8859-1/Compose:             ca_AD.ISO8859-1
+iso8859-15/Compose:            ca_AD.ISO8859-15
+iso8859-1/Compose:             ca_ES.ISO8859-1
+iso8859-15/Compose:            ca_ES.ISO8859-15
+iso8859-1/Compose:             ca_FR.ISO8859-1
+iso8859-15/Compose:            ca_FR.ISO8859-15
+iso8859-1/Compose:             ca_IT.ISO8859-1
+iso8859-15/Compose:            ca_IT.ISO8859-15
+iso8859-2/Compose:             cs_CZ.ISO8859-2
+iso8859-1/Compose:             cy_GB.ISO8859-1
+iso8859-14/Compose:            cy_GB.ISO8859-14
+iso8859-15/Compose:            cy_GB.ISO8859-15
+iso8859-1/Compose:             da_DK.ISO8859-1
+iso8859-15/Compose:            da_DK.ISO8859-15
+iso8859-1/Compose:             de_AT.ISO8859-1
+iso8859-15/Compose:            de_AT.ISO8859-15
+iso8859-1/Compose:             de_CH.ISO8859-1
+iso8859-15/Compose:            de_CH.ISO8859-15
+iso8859-1/Compose:             de_DE.ISO8859-1
+iso8859-15/Compose:            de_DE.ISO8859-15
+iso8859-1/Compose:             de_LI.ISO8859-1
+iso8859-15/Compose:            de_LI.ISO8859-15
+iso8859-1/Compose:             de_LU.ISO8859-1
+iso8859-15/Compose:            de_LU.ISO8859-15
+iso8859-7/Compose:             el_GR.ISO8859-7
+iso8859-1/Compose:             en_AU.ISO8859-1
+iso8859-1/Compose:             en_BZ.ISO8859-1
+iso8859-1/Compose:             en_CA.ISO8859-1
+iso8859-1/Compose:             en_GB.ISO8859-1
+iso8859-15/Compose:            en_GB.ISO8859-15
+iso8859-1/Compose:             en_IE.ISO8859-1
+iso8859-15/Compose:            en_IE.ISO8859-15
+iso8859-1/Compose:             en_JM.ISO8859-1
+iso8859-1/Compose:             en_NZ.ISO8859-1
+iso8859-1/Compose:             en_TT.ISO8859-1
+iso8859-1/Compose:             en_UK.ISO8859-1
+iso8859-15/Compose:            en_UK.ISO8859-15
+iso8859-1/Compose:             en_US.ISO8859-1
+iso8859-15/Compose:            en_US.ISO8859-15
+iso8859-1/Compose:             en_ZA.ISO8859-1
+iso8859-15/Compose:            en_ZA.ISO8859-15
+iso8859-3/Compose:             eo_XX.ISO8859-3
+iso8859-1/Compose:             es_AR.ISO8859-1
+iso8859-1/Compose:             es_BO.ISO8859-1
+iso8859-1/Compose:             es_CL.ISO8859-1
+iso8859-1/Compose:             es_CO.ISO8859-1
+iso8859-1/Compose:             es_CR.ISO8859-1
+iso8859-1/Compose:             es_DO.ISO8859-1
+iso8859-1/Compose:             es_EC.ISO8859-1
+iso8859-1/Compose:             es_ES.ISO8859-1
+iso8859-15/Compose:            es_ES.ISO8859-15
+iso8859-1/Compose:             es_GT.ISO8859-1
+iso8859-1/Compose:             es_HN.ISO8859-1
+iso8859-1/Compose:             es_MX.ISO8859-1
+iso8859-1/Compose:             es_NI.ISO8859-1
+iso8859-1/Compose:             es_PA.ISO8859-1
+iso8859-1/Compose:             es_PE.ISO8859-1
+iso8859-1/Compose:             es_PR.ISO8859-1
+iso8859-1/Compose:             es_PY.ISO8859-1
+iso8859-1/Compose:             es_SV.ISO8859-1
+iso8859-1/Compose:             es_UY.ISO8859-1
+iso8859-1/Compose:             es_VE.ISO8859-1
+iso8859-1/Compose:             et_EE.ISO8859-1
+iso8859-4/Compose:             et_EE.ISO8859-4
+iso8859-13/Compose:            et_EE.ISO8859-13
+iso8859-15/Compose:            et_EE.ISO8859-15
+iso8859-1/Compose:             eu_ES.ISO8859-1
+iso8859-15/Compose:            eu_ES.ISO8859-15
+isiri-3342/Compose:            fa_IR.ISIRI-3342
+iso8859-1/Compose:             fi_FI.ISO8859-1
+iso8859-15/Compose:            fi_FI.ISO8859-15
+iso8859-1/Compose:             fo_FO.ISO8859-1
+iso8859-15/Compose:            fo_FO.ISO8859-15
+iso8859-1/Compose:             fr_BE.ISO8859-1
+iso8859-15/Compose:            fr_BE.ISO8859-15
+iso8859-1/Compose:             fr_CA.ISO8859-1
+iso8859-15/Compose:            fr_CA.ISO8859-15
+iso8859-1/Compose:             fr_CH.ISO8859-1
+iso8859-15/Compose:            fr_CH.ISO8859-15
+iso8859-1/Compose:             fr_FR.ISO8859-1
+iso8859-15/Compose:            fr_FR.ISO8859-15
+iso8859-1/Compose:             fr_LU.ISO8859-1
+iso8859-15/Compose:            fr_LU.ISO8859-15
+iso8859-1/Compose:             ga_IE.ISO8859-1
+iso8859-14/Compose:            ga_IE.ISO8859-14
+iso8859-15/Compose:            ga_IE.ISO8859-15
+iso8859-1/Compose:             gd_GB.ISO8859-1
+iso8859-14/Compose:            gd_GB.ISO8859-14
+iso8859-15/Compose:            gd_GB.ISO8859-15
+iso8859-1/Compose:             gl_ES.ISO8859-1
+iso8859-15/Compose:            gl_ES.ISO8859-15
+iso8859-1/Compose:             gv_GB.ISO8859-1
+iso8859-14/Compose:            gv_GB.ISO8859-14
+iso8859-15/Compose:            gv_GB.ISO8859-15
+iso8859-8/Compose:             he_IL.ISO8859-8
+microsoft-cp1255/Compose:      he_IL.CP1255
+iscii-dev/Compose:             hi_IN.ISCII-DEV
+iso8859-2/Compose:             hr_HR.ISO8859-2
+iso8859-2/Compose:             hu_HU.ISO8859-2
+armscii-8/Compose:             hy_AM.ARMSCII-8
+iso8859-1/Compose:             id_ID.ISO8859-1
+iso8859-15/Compose:            id_ID.ISO8859-15
+iso8859-1/Compose:             is_IS.ISO8859-1
+iso8859-15/Compose:            is_IS.ISO8859-15
+iso8859-1/Compose:             it_CH.ISO8859-1
+iso8859-15/Compose:            it_CH.ISO8859-15
+iso8859-1/Compose:             it_IT.ISO8859-1
+iso8859-15/Compose:            it_IT.ISO8859-15
+ja/Compose:                    ja_JP.eucJP
+ja.SJIS/Compose:               ja_JP.SJIS
+ja.JIS/Compose:                        ja_JP.JIS7
+georgian-academy/Compose:      ka_GE.GEORGIAN-ACADEMY
+georgian-ps/Compose:           ka_GE.GEORGIAN-PS
+iso8859-1/Compose:             kl_GL.ISO8859-1
+iso8859-15/Compose:            kl_GL.ISO8859-15
+iso8859-1/Compose:             kw_GB.ISO8859-1
+iso8859-14/Compose:            kw_GB.ISO8859-14
+iso8859-15/Compose:            kw_GB.ISO8859-15
+ko/Compose:                    ko_KR.eucKR
+ibm-cp1133/Compose:            lo_LA.IBM-CP1133
+mulelao-1/Compose:             lo_LA.MULELAO-1
+iso8859-1/Compose:             lt_LN.ISO8859-1
+iso8859-4/Compose:             lt_LT.ISO8859-4
+iso8859-13/Compose:            lt_LT.ISO8859-13
+iso8859-4/Compose:             lv_LV.ISO8859-4
+iso8859-13/Compose:            lv_LV.ISO8859-13
+iso8859-13/Compose:            mi_NZ.ISO8859-13
+iso8859-5/Compose:             mk_MK.ISO8859-5
+XCOMM mk_MK.UTF-8/Compose:             mk_MK.UTF-8
+microsoft-cp1251/Compose:      mk_MK.CP1251
+iso8859-1/Compose:             ms_MY.ISO8859-1
+iso8859-3/Compose:             mt_MT.ISO8859-3
+iso8859-1/Compose:             nl_BE.ISO8859-1
+iso8859-15/Compose:            nl_BE.ISO8859-15
+iso8859-1/Compose:             nl_NL.ISO8859-1
+iso8859-15/Compose:            nl_NL.ISO8859-15
+iso8859-1/Compose:             no_NO.ISO8859-1
+iso8859-15/Compose:            no_NO.ISO8859-15
+iso8859-1/Compose:             nb_NO.ISO8859-1
+iso8859-15/Compose:            nb_NO.ISO8859-15
+iso8859-1/Compose:             nn_NO.ISO8859-1
+iso8859-15/Compose:            nn_NO.ISO8859-15
+iso8859-1/Compose:             nr_ZA.ISO8859-1
+iso8859-15/Compose:            nso_ZA.ISO8859-15
+iso8859-1/Compose:             ny_NO.ISO8859-1
+iso8859-15/Compose:            ny_NO.ISO8859-15
+iso8859-1/Compose:             oc_FR.ISO8859-1
+iso8859-15/Compose:            oc_FR.ISO8859-15
+iso8859-1/Compose:             pd_DE.ISO8859-1
+iso8859-1/Compose:             pd_US.ISO8859-1
+iso8859-1/Compose:             ph_PH.ISO8859-1
+iso8859-2/Compose:             pl_PL.ISO8859-2
+iso8859-1/Compose:             pp_AN.ISO8859-1
+iso8859-1/Compose:             pt_BR.ISO8859-1
+iso8859-15/Compose:            pt_BR.ISO8859-15
+iso8859-1/Compose:             pt_PT.ISO8859-1
+iso8859-15/Compose:            pt_PT.ISO8859-15
+iso8859-2/Compose:             ro_RO.ISO8859-2
+koi8-r/Compose:                        ru_RU.KOI8-R
+iso8859-5/Compose:             ru_RU.ISO8859-5
+microsoft-cp1251/Compose:      ru_RU.CP1251
+koi8-u/Compose:                        ru_UA.KOI8-U
+iso8859-1/Compose:             rw_RW.ISO8859-1
+iso8859-2/Compose:             sh_YU.ISO8859-2
+iso8859-2/Compose:             sk_SK.ISO8859-2
+iso8859-2/Compose:             sl_CS.ISO8859-2
+iso8859-2/Compose:             sl_SI.ISO8859-2
+iso8859-2/Compose:             sq_AL.ISO8859-2
+iso8859-2/Compose:             sr_CS.ISO8859-2
+iso8859-5/Compose:             sr_CS.ISO8859-5
+iso8859-2/Compose:             sr_YU.ISO8859-2
+iso8859-5/Compose:             sr_YU.ISO8859-5
+iso8859-1/Compose:             ss_ZA.ISO8859-1
+iso8859-1/Compose:             st_ZA.ISO8859-1
+iso8859-1/Compose:             sv_FI.ISO8859-1
+iso8859-15/Compose:            sv_FI.ISO8859-15
+iso8859-1/Compose:             sv_SE.ISO8859-1
+iso8859-15/Compose:            sv_SE.ISO8859-15
+tscii-0/Compose:               ta_IN.TSCII-0
+koi8-c/Compose:                        tg_TJ.KOI8-C
+iso8859-1/Compose:             tl_PH.ISO8859-1
+iso8859-15/Compose:            tn_ZA.ISO8859-15
+iso8859-9/Compose:             tr_TR.ISO8859-9
+iso8859-1/Compose:             ts_ZA.ISO8859-1
+tatar-cyr/Compose:             tt_RU.TATAR-CYR
+koi8-c/Compose:                        tt_RU.KOI8-C
+koi8-u/Compose:                        uk_UA.KOI8-U
+microsoft-cp1256/Compose:      ur_PK.CP1256
+vi_VN.viscii/Compose:          vi_VN.VISCII
+vi_VN.tcvn/Compose:            vi_VN.TCVN
+iso8859-1/Compose:             wa_BE.ISO8859-1
+iso8859-1/Compose:             xh_ZA.ISO8859-1
+microsoft-cp1255/Compose:      yi_US.CP1256
+zh_CN/Compose:                 zh_CN.eucCN
+zh_CN/Compose:                 zh_CN.GB2312
+zh_CN.gbk/Compose:             zh_CN.GBK
+zh_CN.gb18030/Compose:         zh_CN.GB18030
+zh_HK.big5/Compose:            zh_HK.big5
+zh_HK.big5/Compose:            zh_HK.Big5
+zh_HK.big5hkscs/Compose:       zh_HK.big5hkscs
+zh_HK.big5hkscs/Compose:       zh_HK.Big5HKSCS
+zh_TW.big5/Compose:            zh_TW.big5
+zh_TW.big5/Compose:            zh_TW.Big5
+zh_TW/Compose:                 zh_TW.eucTW
+iso8859-1/Compose:             zu_ZA.ISO8859-1
+XCOMM
+XCOMM
+en_US.UTF-8/Compose:           af_ZA.UTF-8
+en_US.UTF-8/Compose:           ar_AA.UTF-8
+en_US.UTF-8/Compose:           ar_BH.UTF-8
+en_US.UTF-8/Compose:           ar_DZ.UTF-8
+en_US.UTF-8/Compose:           ar_EG.UTF-8
+en_US.UTF-8/Compose:           ar_IN.UTF-8
+en_US.UTF-8/Compose:           ar_IQ.UTF-8
+en_US.UTF-8/Compose:           ar_JO.UTF-8
+en_US.UTF-8/Compose:           ar_KW.UTF-8
+en_US.UTF-8/Compose:           ar_LB.UTF-8
+en_US.UTF-8/Compose:           ar_LY.UTF-8
+en_US.UTF-8/Compose:           ar_MA.UTF-8
+en_US.UTF-8/Compose:           ar_OM.UTF-8
+en_US.UTF-8/Compose:           ar_QA.UTF-8
+en_US.UTF-8/Compose:           ar_SA.UTF-8
+en_US.UTF-8/Compose:           ar_TN.UTF-8
+en_US.UTF-8/Compose:           ar_YE.UTF-8
+en_US.UTF-8/Compose:           bo_IN.UTF-8
+en_US.UTF-8/Compose:           bs_BA.UTF-8
+en_US.UTF-8/Compose:           az_AZ.UTF-8
+en_US.UTF-8/Compose:           a3_AZ.UTF-8
+en_US.UTF-8/Compose:           be_BY.UTF-8
+en_US.UTF-8/Compose:           bg_BG.UTF-8
+en_US.UTF-8/Compose:           bn_IN.UTF-8
+en_US.UTF-8/Compose:           br_FR.UTF-8
+en_US.UTF-8/Compose:           ca_AD.UTF-8
+en_US.UTF-8/Compose:           ca_ES.UTF-8
+en_US.UTF-8/Compose:           ca_FR.UTF-8
+en_US.UTF-8/Compose:           ca_IT.UTF-8
+en_US.UTF-8/Compose:           cs_CZ.UTF-8
+en_US.UTF-8/Compose:           cy_GB.UTF-8
+en_US.UTF-8/Compose:           cz_CZ.UTF-8
+en_US.UTF-8/Compose:           da_DK.UTF-8
+en_US.UTF-8/Compose:           de_AT.UTF-8
+en_US.UTF-8/Compose:           de_BE.UTF-8
+en_US.UTF-8/Compose:           de_CH.UTF-8
+en_US.UTF-8/Compose:           de_DE.UTF-8
+en_US.UTF-8/Compose:           de_LI.UTF-8
+en_US.UTF-8/Compose:           de_LU.UTF-8
+el_GR.UTF-8/Compose:           el_CY.UTF-8
+el_GR.UTF-8/Compose:           el_GR.UTF-8
+en_US.UTF-8/Compose:           en_AU.UTF-8
+en_US.UTF-8/Compose:           en_BZ.UTF-8
+en_US.UTF-8/Compose:           en_CA.UTF-8
+en_US.UTF-8/Compose:           en_GB.UTF-8
+en_US.UTF-8/Compose:           en_IE.UTF-8
+en_US.UTF-8/Compose:           en_JM.UTF-8
+en_US.UTF-8/Compose:           en_MT.UTF-8
+en_US.UTF-8/Compose:           en_NZ.UTF-8
+en_US.UTF-8/Compose:           en_TT.UTF-8
+en_US.UTF-8/Compose:           en_UK.UTF-8
+en_US.UTF-8/Compose:           en_US.UTF-8
+en_US.UTF-8/Compose:           en_ZA.UTF-8
+en_US.UTF-8/Compose:           eo_XX.UTF-8
+en_US.UTF-8/Compose:           es_AR.UTF-8
+en_US.UTF-8/Compose:           es_BO.UTF-8
+en_US.UTF-8/Compose:           es_CL.UTF-8
+en_US.UTF-8/Compose:           es_CO.UTF-8
+en_US.UTF-8/Compose:           es_CR.UTF-8
+en_US.UTF-8/Compose:           es_DO.UTF-8
+en_US.UTF-8/Compose:           es_EC.UTF-8
+en_US.UTF-8/Compose:           es_ES.UTF-8
+en_US.UTF-8/Compose:           es_GT.UTF-8
+en_US.UTF-8/Compose:           es_HN.UTF-8
+en_US.UTF-8/Compose:           es_MX.UTF-8
+en_US.UTF-8/Compose:           es_NI.UTF-8
+en_US.UTF-8/Compose:           es_PA.UTF-8
+en_US.UTF-8/Compose:           es_PE.UTF-8
+en_US.UTF-8/Compose:           es_PR.UTF-8
+en_US.UTF-8/Compose:           es_PY.UTF-8
+en_US.UTF-8/Compose:           es_SV.UTF-8
+en_US.UTF-8/Compose:           es_US.UTF-8
+en_US.UTF-8/Compose:           es_UY.UTF-8
+en_US.UTF-8/Compose:           es_VE.UTF-8
+en_US.UTF-8/Compose:           et_EE.UTF-8
+en_US.UTF-8/Compose:           eu_ES.UTF-8
+en_US.UTF-8/Compose:           fa_IR.UTF-8
+fi_FI.UTF-8/Compose:           fi_FI.UTF-8
+en_US.UTF-8/Compose:           fo_FO.UTF-8
+en_US.UTF-8/Compose:           fr_BE.UTF-8
+en_US.UTF-8/Compose:           fr_CA.UTF-8
+en_US.UTF-8/Compose:           fr_CH.UTF-8
+en_US.UTF-8/Compose:           fr_FR.UTF-8
+en_US.UTF-8/Compose:           fr_LU.UTF-8
+en_US.UTF-8/Compose:           ga_IE.UTF-8
+en_US.UTF-8/Compose:           gd_GB.UTF-8
+en_US.UTF-8/Compose:           gl_ES.UTF-8
+en_US.UTF-8/Compose:           gu_IN.UTF-8
+en_US.UTF-8/Compose:           gv_GB.UTF-8
+en_US.UTF-8/Compose:           he_IL.UTF-8
+en_US.UTF-8/Compose:           hi_IN.UTF-8
+en_US.UTF-8/Compose:           hne_IN.UTF-8
+en_US.UTF-8/Compose:           hr_HR.UTF-8
+en_US.UTF-8/Compose:           hu_HU.UTF-8
+en_US.UTF-8/Compose:           hy_AM.UTF-8
+en_US.UTF-8/Compose:           id_ID.UTF-8
+en_US.UTF-8/Compose:           is_IS.UTF-8
+en_US.UTF-8/Compose:           it_CH.UTF-8
+en_US.UTF-8/Compose:           it_IT.UTF-8
+en_US.UTF-8/Compose:           iu_CA.UTF-8
+en_US.UTF-8/Compose:           ja_JP.UTF-8
+en_US.UTF-8/Compose:           ka_GE.UTF-8
+en_US.UTF-8/Compose:           kl_GL.UTF-8
+en_US.UTF-8/Compose:           kk_KZ.UTF-8
+en_US.UTF-8/Compose:           kn_IN.UTF-8
+en_US.UTF-8/Compose:           ko_KR.UTF-8
+en_US.UTF-8/Compose:           ks_IN.UTF-8
+en_US.UTF-8/Compose:           ks_IN@devanagari.UTF-8
+en_US.UTF-8/Compose:           kw_GB.UTF-8
+en_US.UTF-8/Compose:           ky_KG.UTF-8
+en_US.UTF-8/Compose:           lo_LA.UTF-8
+en_US.UTF-8/Compose:           lt_LT.UTF-8
+en_US.UTF-8/Compose:           lv_LV.UTF-8
+en_US.UTF-8/Compose:           mai_IN.UTF-8
+en_US.UTF-8/Compose:           mi_NZ.UTF-8
+en_US.UTF-8/Compose:           mk_MK.UTF-8
+en_US.UTF-8/Compose:           ml_IN.UTF-8
+en_US.UTF-8/Compose:           mr_IN.UTF-8
+en_US.UTF-8/Compose:           ms_MY.UTF-8
+en_US.UTF-8/Compose:           mt_MT.UTF-8
+en_US.UTF-8/Compose:           nl_BE.UTF-8
+en_US.UTF-8/Compose:           nl_NL.UTF-8
+en_US.UTF-8/Compose:           nn_NO.UTF-8
+en_US.UTF-8/Compose:           no_NO.UTF-8
+en_US.UTF-8/Compose:           nb_NO.UTF-8
+en_US.UTF-8/Compose:           nr_ZA.UTF-8
+en_US.UTF-8/Compose:           nso_ZA.UTF-8
+en_US.UTF-8/Compose:           ny_NO.UTF-8
+en_US.UTF-8/Compose:           oc_FR.UTF-8
+en_US.UTF-8/Compose:           or_IN.UTF-8
+en_US.UTF-8/Compose:           pa_IN.UTF-8
+en_US.UTF-8/Compose:           pa_PK.UTF-8
+en_US.UTF-8/Compose:           pd_DE.UTF-8
+en_US.UTF-8/Compose:           pd_US.UTF-8
+en_US.UTF-8/Compose:           ph_PH.UTF-8
+en_US.UTF-8/Compose:           pl_PL.UTF-8
+en_US.UTF-8/Compose:           pp_AN.UTF-8
+pt_BR.UTF-8/Compose:           pt_BR.UTF-8
+en_US.UTF-8/Compose:           pt_PT.UTF-8
+en_US.UTF-8/Compose:           ro_RO.UTF-8
+en_US.UTF-8/Compose:           ru_RU.UTF-8
+en_US.UTF-8/Compose:           ru_UA.UTF-8
+en_US.UTF-8/Compose:           rw_RW.UTF-8
+en_US.UTF-8/Compose:           sa_IN.UTF-8
+en_US.UTF-8/Compose:           sd_IN.UTF-8
+en_US.UTF-8/Compose:           sd_IN@devanagari.UTF-8
+en_US.UTF-8/Compose:           sh_BA.UTF-8
+en_US.UTF-8/Compose:           si_LK.UTF-8
+en_US.UTF-8/Compose:           sk_SK.UTF-8
+en_US.UTF-8/Compose:           sl_SI.UTF-8
+en_US.UTF-8/Compose:           sq_AL.UTF-8
+en_US.UTF-8/Compose:           sr_CS.UTF-8
+en_US.UTF-8/Compose:           sr_ME.UTF-8
+en_US.UTF-8/Compose:           sr_RS.UTF-8
+en_US.UTF-8/Compose:           sr_YU.UTF-8
+en_US.UTF-8/Compose:           ss_ZA.UTF-8
+en_US.UTF-8/Compose:           st_ZA.UTF-8
+en_US.UTF-8/Compose:           sv_FI.UTF-8
+en_US.UTF-8/Compose:           sv_SE.UTF-8
+en_US.UTF-8/Compose:           ta_IN.UTF-8
+en_US.UTF-8/Compose:           te_IN.UTF-8
+en_US.UTF-8/Compose:           tg_TJ.UTF-8
+en_US.UTF-8/Compose:           th_TH.UTF-8
+en_US.UTF-8/Compose:           tl_PH.UTF-8
+en_US.UTF-8/Compose:           tn_ZA.UTF-8
+en_US.UTF-8/Compose:           tr_TR.UTF-8
+en_US.UTF-8/Compose:           ts_ZA.UTF-8
+en_US.UTF-8/Compose:           tt_RU.UTF-8
+en_US.UTF-8/Compose:           uk_UA.UTF-8
+en_US.UTF-8/Compose:           ur_PK.UTF-8
+en_US.UTF-8/Compose:           uz_UZ.UTF-8
+en_US.UTF-8/Compose:           ve_ZA.UTF-8
+en_US.UTF-8/Compose:           vi_VN.UTF-8
+en_US.UTF-8/Compose:           wa_BE.UTF-8
+en_US.UTF-8/Compose:           yi_US.UTF-8
+en_US.UTF-8/Compose:           xh_ZA.UTF-8
+en_US.UTF-8/Compose:           zh_TW.UTF-8
+en_US.UTF-8/Compose:           zu_ZA.UTF-8
+en_US.UTF-8/Compose:           bs_BA.UTF-8
+en_US.UTF-8/Compose:           ne_NP.UTF-8
+
diff --git a/nls/el_GR.UTF-8/Compose.pre b/nls/el_GR.UTF-8/Compose.pre
new file mode 100644 (file)
index 0000000..ad90337
--- /dev/null
@@ -0,0 +1,1981 @@
+XCOMM
+XCOMM
+XCOMM UTF-8 compose sequence definitions for the greek keyboard layout.
+XCOMM
+XCOMM This file is mostly meant to be used along with the xkb/symbols/el
+XCOMM symbols definition file. In addition, the dead key definitions in
+XCOMM the machine generated part are really only relevant to the
+XCOMM "polytonic" variant in that file.
+XCOMM
+XCOMM The definitions herein cover the following ISO 10646 / Unicode
+XCOMM ranges:
+XCOMM  - Basic Latin (0000-007F) (complete coverage)
+XCOMM  - Latin-1 Supplement (0080-00FF) (complete coverage)
+XCOMM  - Greek and Coptic (0370-03FF) (only the big ISO 8859-7 based
+XCOMM    part at the beginning)
+XCOMM  - Greek Extended (1F00-1FFF) (complete coverage)
+XCOMM  - There are also six (6) characters from other ranges.
+XCOMM Moreover, the following character sets are completely covered:
+XCOMM  - ISO 8859-1
+XCOMM  - ISO 8859-7
+XCOMM
+XCOMM This file consists of four parts. Two of them have been adapted from
+XCOMM the iso8859-1/Compose and iso8859-7/Compose files. The other two
+XCOMM parts have been created by:
+XCOMM  Vasilis Vasaitis <vvas@hal.csd.auth.gr>
+XCOMM based on the idea and initial implementation by:
+XCOMM  Alejandros Diamandidis <adia@egnatia.ee.auth.gr>
+
+XCOMM Part 1
+XCOMM
+XCOMM ISO 8859-1 (Latin-1) multi-key definitions extracted and converted
+XCOMM from the iso8859-1/Compose file.
+
+XCOMM Special Character
+<Multi_key> <plus> <plus>              : "#"   numbersign
+<Multi_key> <apostrophe> <space>       : "'"   apostrophe
+<Multi_key> <space> <apostrophe>       : "'"   apostrophe
+<Multi_key> <A> <T>                    : "@"   at
+<Multi_key> <parenleft> <parenleft>    : "["   bracketleft
+<Multi_key> <slash> <less>             : "\\"  backslash
+<Multi_key> <less> <slash>             : "\\"  backslash
+<Multi_key> <parenright> <parenright>  : "]"   bracketright
+<Multi_key> <asciicircum> <space>      : "^"   asciicircum
+<Multi_key> <space> <asciicircum>      : "^"   asciicircum
+<Multi_key> <greater> <space>          : "^"   asciicircum
+<Multi_key> <space> <greater>          : "^"   asciicircum
+<Multi_key> <grave> <space>            : "`"   grave
+<Multi_key> <space> <grave>            : "`"   grave
+<Multi_key> <parenleft> <minus>                : "{"   braceleft
+<Multi_key> <minus> <parenleft>                : "{"   braceleft
+<Multi_key> <slash> <asciicircum>      : "|"   bar
+<Multi_key> <asciicircum> <slash>      : "|"   bar
+<Multi_key> <V> <L>                    : "|"   bar
+<Multi_key> <L> <V>                    : "|"   bar
+<Multi_key> <v> <l>                    : "|"   bar
+<Multi_key> <l> <v>                    : "|"   bar
+<Multi_key> <parenright> <minus>       : "}"   braceright
+<Multi_key> <minus> <parenright>       : "}"   braceright
+<Multi_key> <asciitilde> <space>       : "~"   asciitilde
+<Multi_key> <space> <asciitilde>       : "~"   asciitilde
+<Multi_key> <minus> <space>            : "~"   asciitilde
+<Multi_key> <space> <minus>            : "~"   asciitilde
+<Multi_key> <exclam> <exclam>          : "¡"  exclamdown
+<Multi_key> <c> <slash>                        : "¢"  cent
+<Multi_key> <slash> <c>                        : "¢"  cent
+<Multi_key> <C> <slash>                        : "¢"  cent
+<Multi_key> <slash> <C>                        : "¢"  cent
+<Multi_key> <C> <bar>                  : "¢"  cent
+<Multi_key> <bar> <C>                  : "¢"  cent
+<Multi_key> <c> <bar>                  : "¢"  cent
+<Multi_key> <bar> <c>                  : "¢"  cent
+<Multi_key> <l> <minus>                        : "£"  sterling
+<Multi_key> <minus> <l>                        : "£"  sterling
+<Multi_key> <L> <minus>                        : "£"  sterling
+<Multi_key> <minus> <L>                        : "£"  sterling
+<Multi_key> <l> <equal>                        : "£"  sterling
+<Multi_key> <equal> <l>                        : "£"  sterling
+<Multi_key> <L> <equal>                        : "£"  sterling
+<Multi_key> <equal> <L>                        : "£"  sterling
+<Multi_key> <y> <minus>                        : "¥"  yen
+<Multi_key> <minus> <y>                        : "¥"  yen
+<Multi_key> <Y> <minus>                        : "¥"  yen
+<Multi_key> <minus> <Y>                        : "¥"  yen
+<Multi_key> <y> <equal>                        : "¥"  yen
+<Multi_key> <equal> <y>                        : "¥"  yen
+<Multi_key> <Y> <equal>                        : "¥"  yen
+<Multi_key> <equal> <Y>                        : "¥"  yen
+<Multi_key> <s> <o>                    : "§"  section
+<Multi_key> <o> <s>                    : "§"  section
+<Multi_key> <S> <O>                    : "§"  section
+<Multi_key> <O> <S>                    : "§"  section
+<Multi_key> <S> <exclam>               : "§"  section
+<Multi_key> <exclam> <S>               : "§"  section
+<Multi_key> <s> <exclam>               : "§"  section
+<Multi_key> <exclam> <s>               : "§"  section
+<Multi_key> <S> <0>                    : "§"  section
+<Multi_key> <0> <S>                    : "§"  section
+<Multi_key> <s> <0>                    : "§"  section
+<Multi_key> <0> <s>                    : "§"  section
+<Multi_key> <x> <o>                    : "¤"  currency
+<Multi_key> <o> <x>                    : "¤"  currency
+<Multi_key> <X> <O>                    : "¤"  currency
+<Multi_key> <O> <X>                    : "¤"  currency
+<Multi_key> <x> <O>                    : "¤"  currency
+<Multi_key> <O> <x>                    : "¤"  currency
+<Multi_key> <X> <o>                    : "¤"  currency
+<Multi_key> <o> <X>                    : "¤"  currency
+<Multi_key> <x> <0>                    : "¤"  currency
+<Multi_key> <0> <x>                    : "¤"  currency
+<Multi_key> <X> <0>                    : "¤"  currency
+<Multi_key> <0> <X>                    : "¤"  currency
+<Multi_key> <c> <o>                    : "©"  copyright
+<Multi_key> <o> <c>                    : "©"  copyright
+<Multi_key> <C> <O>                    : "©"  copyright
+<Multi_key> <O> <C>                    : "©"  copyright
+<Multi_key> <c> <O>                    : "©"  copyright
+<Multi_key> <O> <c>                    : "©"  copyright
+<Multi_key> <C> <o>                    : "©"  copyright
+<Multi_key> <o> <C>                    : "©"  copyright
+<Multi_key> <c> <0>                    : "©"  copyright
+<Multi_key> <0> <c>                    : "©"  copyright
+<Multi_key> <C> <0>                    : "©"  copyright
+<Multi_key> <0> <C>                    : "©"  copyright
+<Multi_key> <parenleft> <c>            : "©"  copyright
+<Multi_key> <a> <underscore>           : "ª"  ordfeminine
+<Multi_key> <underscore> <a>           : "ª"  ordfeminine
+<Multi_key> <A> <underscore>           : "ª"  ordfeminine
+<Multi_key> <underscore> <A>           : "ª"  ordfeminine
+<Multi_key> <o> <underscore>           : "º"  masculine
+<Multi_key> <underscore> <o>           : "º"  masculine
+<Multi_key> <O> <underscore>           : "º"  masculine
+<Multi_key> <underscore> <O>           : "º"  masculine
+<Multi_key> <less> <less>              : "«"  guillemotleft
+<Multi_key> <greater> <greater>                : "»"  guillemotright
+<Multi_key> <0> <asciicircum>          : "°"  degree
+<Multi_key> <asciicircum> <0>          : "°"  degree
+<Multi_key> <0> <asterisk>             : "°"  degree
+<Multi_key> <asterisk> <0>             : "°"  degree
+<Multi_key> <plus> <minus>             : "±"  plusminus
+<Multi_key> <minus> <plus>             : "±"  plusminus
+<Multi_key> <slash> <u>                        : "µ"  mu
+<Multi_key> <u> <slash>                        : "µ"  mu
+<Multi_key> <slash> <U>                        : "µ"  mu
+<Multi_key> <U> <slash>                        : "µ"  mu
+<Multi_key> <1> <asciicircum>          : "¹"  onesuperior
+<Multi_key> <asciicircum> <1>          : "¹"  onesuperior
+<Multi_key> <S> <1>                    : "¹"  onesuperior
+<Multi_key> <1> <S>                    : "¹"  onesuperior
+<Multi_key> <s> <1>                    : "¹"  onesuperior
+<Multi_key> <1> <s>                    : "¹"  onesuperior
+<Multi_key> <2> <asciicircum>          : "²"  twosuperior
+<Multi_key> <asciicircum> <2>          : "²"  twosuperior
+<Multi_key> <S> <2>                    : "²"  twosuperior
+<Multi_key> <2> <S>                    : "²"  twosuperior
+<Multi_key> <s> <2>                    : "²"  twosuperior
+<Multi_key> <2> <s>                    : "²"  twosuperior
+<Multi_key> <3> <asciicircum>          : "³"  threesuperior
+<Multi_key> <asciicircum> <3>          : "³"  threesuperior
+<Multi_key> <S> <3>                    : "³"  threesuperior
+<Multi_key> <3> <S>                    : "³"  threesuperior
+<Multi_key> <s> <3>                    : "³"  threesuperior
+<Multi_key> <3> <s>                    : "³"  threesuperior
+<Multi_key> <p> <exclam>               : "¶"  paragraph
+<Multi_key> <exclam> <p>               : "¶"  paragraph
+<Multi_key> <P> <exclam>               : "¶"  paragraph
+<Multi_key> <exclam> <P>               : "¶"  paragraph
+<Multi_key> <period> <asciicircum>     : "·"  periodcentered
+<Multi_key> <asciicircum> <period>     : "·"  periodcentered
+<Multi_key> <period> <minus>           : "·"  periodcentered
+<Multi_key> <period> <equal>           : "•" enfilledcircbullet
+<Multi_key> <period> <period>          : "…" ellipsis
+<Multi_key> <1> <4>                    : "¼"  onequarter
+<Multi_key> <1> <2>                    : "½"  onehalf
+<Multi_key> <3> <4>                    : "¾"  threequarters
+<Multi_key> <question> <question>      : "¿"  questiondown
+<Multi_key> <space> <space>            : " "  nobreakspace
+<Multi_key> <bar> <bar>                        : "¦"  brokenbar
+<Multi_key> <exclam> <asciicircum>     : "¦"  brokenbar
+<Multi_key> <asciicircum> <exclam>     : "¦"  brokenbar
+<Multi_key> <V> <B>                    : "¦"  brokenbar
+<Multi_key> <B> <V>                    : "¦"  brokenbar
+<Multi_key> <v> <b>                    : "¦"  brokenbar
+<Multi_key> <b> <v>                    : "¦"  brokenbar
+<Multi_key> <minus> <comma>            : "¬"  notsign
+<Multi_key> <comma> <minus>            : "¬"  notsign
+<Multi_key> <minus> <minus>            : "­"  hyphen
+<Multi_key> <R> <O>                    : "®"  registered
+<Multi_key> <O> <R>                    : "®"  registered
+<Multi_key> <parenleft> <r>            : "®"  registered
+<Multi_key> <minus> <asciicircum>      : "¯"  macron
+<Multi_key> <asciicircum> <minus>      : "¯"  macron
+<Multi_key> <underscore> <asciicircum> : "¯"  macron
+<Multi_key> <asciicircum> <underscore> : "¯"  macron
+<Multi_key> <underscore> <underscore>  : "¯"  macron
+<Multi_key> <minus> <colon>            : "÷"  division
+<Multi_key> <colon> <minus>            : "÷"  division
+<Multi_key> <x> <x>                    : "×"  multiply
+<Multi_key> <apostrophe> <apostrophe>  : "´"  acute
+<Multi_key> <comma> <comma>            : "¸"  cedilla
+<Multi_key> <quotedbl> <quotedbl>      : "¨"  diaeresis
+XCOMM Accented Alphabet
+<Multi_key> <A> <grave>                        : "À"  Agrave
+<Multi_key> <grave> <A>                        : "À"  Agrave
+<Multi_key> <A> <acute>                        : "Á"  Aacute
+<Multi_key> <acute> <A>                        : "Á"  Aacute
+<Multi_key> <A> <apostrophe>           : "Á"  Aacute
+<Multi_key> <apostrophe> <A>           : "Á"  Aacute
+<Multi_key> <A> <asciicircum>          : "Â"  Acircumflex
+<Multi_key> <asciicircum> <A>          : "Â"  Acircumflex
+<Multi_key> <A> <greater>              : "Â"  Acircumflex
+<Multi_key> <greater> <A>              : "Â"  Acircumflex
+<Multi_key> <A> <asciitilde>           : "Ã"  Atilde
+<Multi_key> <asciitilde> <A>           : "Ã"  Atilde
+<Multi_key> <A> <minus>                        : "Ã"  Atilde
+<Multi_key> <minus> <A>                        : "Ã"  Atilde
+<Multi_key> <A> <quotedbl>             : "Ä"  Adiaeresis
+<Multi_key> <quotedbl> <A>             : "Ä"  Adiaeresis
+<Multi_key> <A> <diaeresis>            : "Ä"  Adiaeresis
+<Multi_key> <diaeresis> <A>            : "Ä"  Adiaeresis
+<Multi_key> <A> <asterisk>             : "Å"  Aring
+<Multi_key> <asterisk> <A>             : "Å"  Aring
+<Multi_key> <A> <A>                    : "Å"  Aring
+<Multi_key> <A> <O>                    : "Å"  Aring
+<Multi_key> <A> <E>                    : "Æ"  AE
+<Multi_key> <a> <grave>                        : "à"  agrave
+<Multi_key> <grave> <a>                        : "à"  agrave
+<Multi_key> <a> <acute>                        : "á"  aacute
+<Multi_key> <acute> <a>                        : "á"  aacute
+<Multi_key> <a> <apostrophe>           : "á"  aacute
+<Multi_key> <apostrophe> <a>           : "á"  aacute
+<Multi_key> <a> <asciicircum>          : "â"  acircumflex
+<Multi_key> <asciicircum> <a>          : "â"  acircumflex
+<Multi_key> <a> <greater>              : "â"  acircumflex
+<Multi_key> <greater> <a>              : "â"  acircumflex
+<Multi_key> <a> <asciitilde>           : "ã"  atilde
+<Multi_key> <asciitilde> <a>           : "ã"  atilde
+<Multi_key> <a> <minus>                        : "ã"  atilde
+<Multi_key> <minus> <a>                        : "ã"  atilde
+<Multi_key> <a> <quotedbl>             : "ä"  adiaeresis
+<Multi_key> <quotedbl> <a>             : "ä"  adiaeresis
+<Multi_key> <a> <diaeresis>            : "ä"  adiaeresis
+<Multi_key> <diaeresis> <a>            : "ä"  adiaeresis
+<Multi_key> <a> <asterisk>             : "å"  aring
+<Multi_key> <asterisk> <a>             : "å"  aring
+<Multi_key> <a> <a>                    : "å"  aring
+<Multi_key> <a> <o>                    : "å"  aring
+<Multi_key> <a> <e>                    : "æ"  ae
+<Multi_key> <acute> <C>                        : "Ç"  Ccedilla
+<Multi_key> <acute> <c>                        : "ç"  ccedilla
+<Multi_key> <C> <comma>                        : "Ç"  Ccedilla
+<Multi_key> <C> <cedilla>              : "Ç"  Ccedilla
+<Multi_key> <comma> <C>                        : "Ç"  Ccedilla
+<Multi_key> <cedilla> <C>              : "Ç"  Ccedilla
+<Multi_key> <c> <comma>                        : "ç"  ccedilla
+<Multi_key> <c> <cedilla>              : "ç"  ccedilla
+<Multi_key> <comma> <c>                        : "ç"  ccedilla
+<Multi_key> <cedilla> <c>              : "ç"  ccedilla
+<Multi_key> <minus> <D>                        : "Ð"  ETH
+<Multi_key> <D> <minus>                        : "Ð"  ETH
+<Multi_key> <minus> <d>                        : "ð"  eth
+<Multi_key> <d> <minus>                        : "ð"  eth
+<Multi_key> <E> <grave>                        : "È"  Egrave
+<Multi_key> <grave> <E>                        : "È"  Egrave
+<Multi_key> <E> <acute>                        : "É"  Eacute
+<Multi_key> <acute> <E>                        : "É"  Eacute
+<Multi_key> <E> <apostrophe>           : "É"  Eacute
+<Multi_key> <apostrophe> <E>           : "É"  Eacute
+<Multi_key> <E> <asciicircum>          : "Ê"  Ecircumflex
+<Multi_key> <asciicircum> <E>          : "Ê"  Ecircumflex
+<Multi_key> <E> <greater>              : "Ê"  Ecircumflex
+<Multi_key> <greater> <E>              : "Ê"  Ecircumflex
+<Multi_key> <E> <quotedbl>             : "Ë"  Ediaeresis
+<Multi_key> <quotedbl> <E>             : "Ë"  Ediaeresis
+<Multi_key> <E> <diaeresis>            : "Ë"  Ediaeresis
+<Multi_key> <diaeresis> <E>            : "Ë"  Ediaeresis
+<Multi_key> <e> <grave>                        : "è"  egrave
+<Multi_key> <grave> <e>                        : "è"  egrave
+<Multi_key> <e> <acute>                        : "é"  eacute
+<Multi_key> <acute> <e>                        : "é"  eacute
+<Multi_key> <e> <apostrophe>           : "é"  eacute
+<Multi_key> <apostrophe> <e>           : "é"  eacute
+<Multi_key> <e> <asciicircum>          : "ê"  ecircumflex
+<Multi_key> <asciicircum> <e>          : "ê"  ecircumflex
+<Multi_key> <e> <greater>              : "ê"  ecircumflex
+<Multi_key> <greater> <e>              : "ê"  ecircumflex
+<Multi_key> <e> <quotedbl>             : "ë"  ediaeresis
+<Multi_key> <quotedbl> <e>             : "ë"  ediaeresis
+<Multi_key> <e> <diaeresis>            : "ë"  ediaeresis
+<Multi_key> <diaeresis> <e>            : "ë"  ediaeresis
+<Multi_key> <I> <grave>                        : "Ì"  Igrave
+<Multi_key> <grave> <I>                        : "Ì"  Igrave
+<Multi_key> <I> <acute>                        : "Í"  Iacute
+<Multi_key> <acute> <I>                        : "Í"  Iacute
+<Multi_key> <I> <apostrophe>           : "Í"  Iacute
+<Multi_key> <apostrophe> <I>           : "Í"  Iacute
+<Multi_key> <I> <asciicircum>          : "Î"  Icircumflex
+<Multi_key> <asciicircum> <I>          : "Î"  Icircumflex
+<Multi_key> <I> <greater>              : "Î"  Icircumflex
+<Multi_key> <greater> <I>              : "Î"  Icircumflex
+<Multi_key> <I> <quotedbl>             : "Ï"  Idiaeresis
+<Multi_key> <quotedbl> <I>             : "Ï"  Idiaeresis
+<Multi_key> <I> <diaeresis>            : "Ï"  Idiaeresis
+<Multi_key> <diaeresis> <I>            : "Ï"  Idiaeresis
+<Multi_key> <i> <grave>                        : "ì"  igrave
+<Multi_key> <grave> <i>                        : "ì"  igrave
+<Multi_key> <i> <acute>                        : "í"  iacute
+<Multi_key> <acute> <i>                        : "í"  iacute
+<Multi_key> <i> <apostrophe>           : "í"  iacute
+<Multi_key> <apostrophe> <i>           : "í"  iacute
+<Multi_key> <i> <asciicircum>          : "î"  icircumflex
+<Multi_key> <asciicircum> <i>          : "î"  icircumflex
+<Multi_key> <i> <greater>              : "î"  icircumflex
+<Multi_key> <greater> <i>              : "î"  icircumflex
+<Multi_key> <i> <quotedbl>             : "ï"  idiaeresis
+<Multi_key> <quotedbl> <i>             : "ï"  idiaeresis
+<Multi_key> <i> <diaeresis>            : "ï"  idiaeresis
+<Multi_key> <diaeresis> <i>            : "ï"  idiaeresis
+<Multi_key> <N> <asciitilde>           : "Ñ"  Ntilde
+<Multi_key> <asciitilde> <N>           : "Ñ"  Ntilde
+<Multi_key> <N> <minus>                        : "Ñ"  Ntilde
+<Multi_key> <minus> <N>                        : "Ñ"  Ntilde
+<Multi_key> <n> <asciitilde>           : "ñ"  ntilde
+<Multi_key> <asciitilde> <n>           : "ñ"  ntilde
+<Multi_key> <n> <minus>                        : "ñ"  ntilde
+<Multi_key> <minus> <n>                        : "ñ"  ntilde
+<Multi_key> <O> <grave>                        : "Ò"  Ograve
+<Multi_key> <grave> <O>                        : "Ò"  Ograve
+<Multi_key> <O> <acute>                        : "Ó"  Oacute
+<Multi_key> <acute> <O>                        : "Ó"  Oacute
+<Multi_key> <O> <apostrophe>           : "Ó"  Oacute
+<Multi_key> <apostrophe> <O>           : "Ó"  Oacute
+<Multi_key> <O> <asciicircum>          : "Ô"  Ocircumflex
+<Multi_key> <asciicircum> <O>          : "Ô"  Ocircumflex
+<Multi_key> <O> <greater>              : "Ô"  Ocircumflex
+<Multi_key> <greater> <O>              : "Ô"  Ocircumflex
+<Multi_key> <O> <asciitilde>           : "Õ"  Otilde
+<Multi_key> <asciitilde> <O>           : "Õ"  Otilde
+<Multi_key> <O> <minus>                        : "Õ"  Otilde
+<Multi_key> <minus> <O>                        : "Õ"  Otilde
+<Multi_key> <O> <quotedbl>             : "Ö"  Odiaeresis
+<Multi_key> <quotedbl> <O>             : "Ö"  Odiaeresis
+<Multi_key> <O> <diaeresis>            : "Ö"  Odiaeresis
+<Multi_key> <diaeresis> <O>            : "Ö"  Odiaeresis
+<Multi_key> <O> <slash>                        : "Ø"  Ooblique
+<Multi_key> <slash> <O>                        : "Ø"  Ooblique
+<Multi_key> <o> <grave>                        : "ò"  ograve
+<Multi_key> <grave> <o>                        : "ò"  ograve
+<Multi_key> <o> <acute>                        : "ó"  oacute
+<Multi_key> <acute> <o>                        : "ó"  oacute
+<Multi_key> <o> <apostrophe>           : "ó"  oacute
+<Multi_key> <apostrophe> <o>           : "ó"  oacute
+<Multi_key> <o> <asciicircum>          : "ô"  ocircumflex
+<Multi_key> <asciicircum> <o>          : "ô"  ocircumflex
+<Multi_key> <o> <greater>              : "ô"  ocircumflex
+<Multi_key> <greater> <o>              : "ô"  ocircumflex
+<Multi_key> <o> <asciitilde>           : "õ"  otilde
+<Multi_key> <asciitilde> <o>           : "õ"  otilde
+<Multi_key> <o> <minus>                        : "õ"  otilde
+<Multi_key> <minus> <o>                        : "õ"  otilde
+<Multi_key> <o> <quotedbl>             : "ö"  odiaeresis
+<Multi_key> <quotedbl> <o>             : "ö"  odiaeresis
+<Multi_key> <o> <diaeresis>            : "ö"  odiaeresis
+<Multi_key> <diaeresis> <o>            : "ö"  odiaeresis
+<Multi_key> <o> <slash>                        : "ø"  oslash
+<Multi_key> <slash> <o>                        : "ø"  oslash
+<Multi_key> <U> <grave>                        : "Ù"  Ugrave
+<Multi_key> <grave> <U>                        : "Ù"  Ugrave
+<Multi_key> <U> <acute>                        : "Ú"  Uacute
+<Multi_key> <acute> <U>                        : "Ú"  Uacute
+<Multi_key> <U> <apostrophe>           : "Ú"  Uacute
+<Multi_key> <apostrophe> <U>           : "Ú"  Uacute
+<Multi_key> <U> <asciicircum>          : "Û"  Ucircumflex
+<Multi_key> <asciicircum> <U>          : "Û"  Ucircumflex
+<Multi_key> <U> <greater>              : "Û"  Ucircumflex
+<Multi_key> <greater> <U>              : "Û"  Ucircumflex
+<Multi_key> <U> <quotedbl>             : "Ü"  Udiaeresis
+<Multi_key> <quotedbl> <U>             : "Ü"  Udiaeresis
+<Multi_key> <U> <diaeresis>            : "Ü"  Udiaeresis
+<Multi_key> <diaeresis> <U>            : "Ü"  Udiaeresis
+<Multi_key> <u> <grave>                        : "ù"  ugrave
+<Multi_key> <grave> <u>                        : "ù"  ugrave
+<Multi_key> <u> <acute>                        : "ú"  uacute
+<Multi_key> <acute> <u>                        : "ú"  uacute
+<Multi_key> <u> <apostrophe>           : "ú"  uacute
+<Multi_key> <apostrophe> <u>           : "ú"  uacute
+<Multi_key> <u> <asciicircum>          : "û"  ucircumflex
+<Multi_key> <asciicircum> <u>          : "û"  ucircumflex
+<Multi_key> <u> <greater>              : "û"  ucircumflex
+<Multi_key> <greater> <u>              : "û"  ucircumflex
+<Multi_key> <u> <quotedbl>             : "ü"  udiaeresis
+<Multi_key> <quotedbl> <u>             : "ü"  udiaeresis
+<Multi_key> <u> <diaeresis>            : "ü"  udiaeresis
+<Multi_key> <diaeresis> <u>            : "ü"  udiaeresis
+<Multi_key> <s> <s>                    : "ß"  ssharp
+<Multi_key> <T> <H>                    : "Þ"  THORN
+<Multi_key> <t> <h>                    : "þ"  thorn
+<Multi_key> <Y> <acute>                        : "Ý"  Yacute
+<Multi_key> <acute> <Y>                        : "Ý"  Yacute
+<Multi_key> <Y> <apostrophe>           : "Ý"  Yacute
+<Multi_key> <apostrophe> <Y>           : "Ý"  Yacute
+<Multi_key> <y> <acute>                        : "ý"  yacute
+<Multi_key> <acute> <y>                        : "ý"  yacute
+<Multi_key> <y> <apostrophe>           : "ý"  yacute
+<Multi_key> <apostrophe> <y>           : "ý"  yacute
+<Multi_key> <y> <quotedbl>             : "ÿ"  ydiaeresis
+<Multi_key> <quotedbl> <y>             : "ÿ"  ydiaeresis
+<Multi_key> <y> <diaeresis>            : "ÿ"  ydiaeresis
+<Multi_key> <diaeresis> <y>            : "ÿ"  ydiaeresis
+
+XCOMM Part 2
+XCOMM
+XCOMM Greek Extended multi-key and dead key definitions. These have been
+XCOMM machine-generated by a perl script, found at:
+XCOMM  http://hal.csd.auth.gr/~vvas/i18n/xkb/polytonic-compose.pl
+
+<Multi_key> <greater> <Greek_alpha>                     : "ἀ"  U1f00
+<dead_horn> <Greek_alpha>                               : "ἀ"  U1f00
+<dead_psili> <Greek_alpha>                               : "ἀ"  U1f00
+<Multi_key> <less> <Greek_alpha>                        : "ἁ"  U1f01
+<dead_ogonek> <Greek_alpha>                             : "ἁ"  U1f01
+<dead_dasia> <Greek_alpha>                             : "ἁ"  U1f01
+<Multi_key> <greater> <grave> <Greek_alpha>             : "ἂ"  U1f02
+<Multi_key> <grave> <greater> <Greek_alpha>             : "ἂ"  U1f02
+<dead_horn> <dead_grave> <Greek_alpha>                  : "ἂ"  U1f02
+<dead_psili> <dead_grave> <Greek_alpha>                  : "ἂ"  U1f02
+<dead_grave> <dead_horn> <Greek_alpha>                  : "ἂ"  U1f02
+<dead_grave> <dead_psili> <Greek_alpha>                  : "ἂ"  U1f02
+<Multi_key> <less> <grave> <Greek_alpha>                : "ἃ"  U1f03
+<Multi_key> <grave> <less> <Greek_alpha>                : "ἃ"  U1f03
+<dead_ogonek> <dead_grave> <Greek_alpha>                : "ἃ"  U1f03
+<dead_dasia> <dead_grave> <Greek_alpha>                : "ἃ"  U1f03
+<dead_grave> <dead_ogonek> <Greek_alpha>                : "ἃ"  U1f03
+<dead_grave> <dead_dasia> <Greek_alpha>                : "ἃ"  U1f03
+<Multi_key> <greater> <apostrophe> <Greek_alpha>        : "ἄ"  U1f04
+<Multi_key> <apostrophe> <greater> <Greek_alpha>        : "ἄ"  U1f04
+<dead_horn> <dead_acute> <Greek_alpha>                  : "ἄ"  U1f04
+<dead_psili> <dead_acute> <Greek_alpha>                  : "ἄ"  U1f04
+<dead_acute> <dead_horn> <Greek_alpha>                  : "ἄ"  U1f04
+<dead_acute> <dead_psili> <Greek_alpha>                  : "ἄ"  U1f04
+<Multi_key> <less> <apostrophe> <Greek_alpha>           : "ἅ"  U1f05
+<Multi_key> <apostrophe> <less> <Greek_alpha>           : "ἅ"  U1f05
+<dead_ogonek> <dead_acute> <Greek_alpha>                : "ἅ"  U1f05
+<dead_dasia> <dead_acute> <Greek_alpha>                : "ἅ"  U1f05
+<dead_acute> <dead_ogonek> <Greek_alpha>                : "ἅ"  U1f05
+<dead_acute> <dead_dasia> <Greek_alpha>                : "ἅ"  U1f05
+<Multi_key> <greater> <asciitilde> <Greek_alpha>        : "ἆ"  U1f06
+<Multi_key> <asciitilde> <greater> <Greek_alpha>        : "ἆ"  U1f06
+<dead_horn> <dead_tilde> <Greek_alpha>                  : "ἆ"  U1f06
+<dead_psili> <dead_tilde> <Greek_alpha>                  : "ἆ"  U1f06
+<dead_tilde> <dead_horn> <Greek_alpha>                  : "ἆ"  U1f06
+<dead_tilde> <dead_psili> <Greek_alpha>                  : "ἆ"  U1f06
+<Multi_key> <less> <asciitilde> <Greek_alpha>           : "ἇ"  U1f07
+<Multi_key> <asciitilde> <less> <Greek_alpha>           : "ἇ"  U1f07
+<dead_ogonek> <dead_tilde> <Greek_alpha>                : "ἇ"  U1f07
+<dead_dasia> <dead_tilde> <Greek_alpha>                : "ἇ"  U1f07
+<dead_tilde> <dead_ogonek> <Greek_alpha>                : "ἇ"  U1f07
+<dead_tilde> <dead_dasia> <Greek_alpha>                : "ἇ"  U1f07
+<Multi_key> <greater> <Greek_ALPHA>                     : "Ἀ"  U1f08
+<dead_horn> <Greek_ALPHA>                               : "Ἀ"  U1f08
+<dead_psili> <Greek_ALPHA>                               : "Ἀ"  U1f08
+<Multi_key> <less> <Greek_ALPHA>                        : "Ἁ"  U1f09
+<dead_ogonek> <Greek_ALPHA>                             : "Ἁ"  U1f09
+<dead_dasia> <Greek_ALPHA>                             : "Ἁ"  U1f09
+<Multi_key> <greater> <grave> <Greek_ALPHA>             : "Ἂ"  U1f0a
+<Multi_key> <grave> <greater> <Greek_ALPHA>             : "Ἂ"  U1f0a
+<dead_horn> <dead_grave> <Greek_ALPHA>                  : "Ἂ"  U1f0a
+<dead_psili> <dead_grave> <Greek_ALPHA>                  : "Ἂ"  U1f0a
+<dead_grave> <dead_horn> <Greek_ALPHA>                  : "Ἂ"  U1f0a
+<dead_grave> <dead_psili> <Greek_ALPHA>                  : "Ἂ"  U1f0a
+<Multi_key> <less> <grave> <Greek_ALPHA>                : "Ἃ"  U1f0b
+<Multi_key> <grave> <less> <Greek_ALPHA>                : "Ἃ"  U1f0b
+<dead_ogonek> <dead_grave> <Greek_ALPHA>                : "Ἃ"  U1f0b
+<dead_dasia> <dead_grave> <Greek_ALPHA>                : "Ἃ"  U1f0b
+<dead_grave> <dead_ogonek> <Greek_ALPHA>                : "Ἃ"  U1f0b
+<dead_grave> <dead_dasia> <Greek_ALPHA>                : "Ἃ"  U1f0b
+<Multi_key> <greater> <apostrophe> <Greek_ALPHA>        : "Ἄ"  U1f0c
+<Multi_key> <apostrophe> <greater> <Greek_ALPHA>        : "Ἄ"  U1f0c
+<dead_horn> <dead_acute> <Greek_ALPHA>                  : "Ἄ"  U1f0c
+<dead_psili> <dead_acute> <Greek_ALPHA>                  : "Ἄ"  U1f0c
+<dead_acute> <dead_horn> <Greek_ALPHA>                  : "Ἄ"  U1f0c
+<dead_acute> <dead_psili> <Greek_ALPHA>                  : "Ἄ"  U1f0c
+<Multi_key> <less> <apostrophe> <Greek_ALPHA>           : "Ἅ"  U1f0d
+<Multi_key> <apostrophe> <less> <Greek_ALPHA>           : "Ἅ"  U1f0d
+<dead_ogonek> <dead_acute> <Greek_ALPHA>                : "Ἅ"  U1f0d
+<dead_dasia> <dead_acute> <Greek_ALPHA>                : "Ἅ"  U1f0d
+<dead_acute> <dead_ogonek> <Greek_ALPHA>                : "Ἅ"  U1f0d
+<dead_acute> <dead_dasia> <Greek_ALPHA>                : "Ἅ"  U1f0d
+<Multi_key> <greater> <asciitilde> <Greek_ALPHA>        : "Ἆ"  U1f0e
+<Multi_key> <asciitilde> <greater> <Greek_ALPHA>        : "Ἆ"  U1f0e
+<dead_horn> <dead_tilde> <Greek_ALPHA>                  : "Ἆ"  U1f0e
+<dead_psili> <dead_tilde> <Greek_ALPHA>                  : "Ἆ"  U1f0e
+<dead_tilde> <dead_horn> <Greek_ALPHA>                  : "Ἆ"  U1f0e
+<dead_tilde> <dead_psili> <Greek_ALPHA>                  : "Ἆ"  U1f0e
+<Multi_key> <less> <asciitilde> <Greek_ALPHA>           : "Ἇ"  U1f0f
+<Multi_key> <asciitilde> <less> <Greek_ALPHA>           : "Ἇ"  U1f0f
+<dead_ogonek> <dead_tilde> <Greek_ALPHA>                : "Ἇ"  U1f0f
+<dead_dasia> <dead_tilde> <Greek_ALPHA>                : "Ἇ"  U1f0f
+<dead_tilde> <dead_ogonek> <Greek_ALPHA>                : "Ἇ"  U1f0f
+<dead_tilde> <dead_dasia> <Greek_ALPHA>                : "Ἇ"  U1f0f
+<Multi_key> <greater> <Greek_epsilon>                   : "ἐ"  U1f10
+<dead_horn> <Greek_epsilon>                             : "ἐ"  U1f10
+<dead_psili> <Greek_epsilon>                             : "ἐ"  U1f10
+<Multi_key> <less> <Greek_epsilon>                      : "ἑ"  U1f11
+<dead_ogonek> <Greek_epsilon>                           : "ἑ"  U1f11
+<dead_dasia> <Greek_epsilon>                           : "ἑ"  U1f11
+<Multi_key> <greater> <grave> <Greek_epsilon>           : "ἒ"  U1f12
+<Multi_key> <grave> <greater> <Greek_epsilon>           : "ἒ"  U1f12
+<dead_horn> <dead_grave> <Greek_epsilon>                : "ἒ"  U1f12
+<dead_psili> <dead_grave> <Greek_epsilon>                : "ἒ"  U1f12
+<dead_grave> <dead_horn> <Greek_epsilon>                : "ἒ"  U1f12
+<dead_grave> <dead_psili> <Greek_epsilon>                : "ἒ"  U1f12
+<Multi_key> <less> <grave> <Greek_epsilon>              : "ἓ"  U1f13
+<Multi_key> <grave> <less> <Greek_epsilon>              : "ἓ"  U1f13
+<dead_ogonek> <dead_grave> <Greek_epsilon>              : "ἓ"  U1f13
+<dead_dasia> <dead_grave> <Greek_epsilon>              : "ἓ"  U1f13
+<dead_grave> <dead_ogonek> <Greek_epsilon>              : "ἓ"  U1f13
+<dead_grave> <dead_dasia> <Greek_epsilon>              : "ἓ"  U1f13
+<Multi_key> <greater> <apostrophe> <Greek_epsilon>      : "ἔ"  U1f14
+<Multi_key> <apostrophe> <greater> <Greek_epsilon>      : "ἔ"  U1f14
+<dead_horn> <dead_acute> <Greek_epsilon>                : "ἔ"  U1f14
+<dead_psili> <dead_acute> <Greek_epsilon>                : "ἔ"  U1f14
+<dead_acute> <dead_horn> <Greek_epsilon>                : "ἔ"  U1f14
+<dead_acute> <dead_psili> <Greek_epsilon>                : "ἔ"  U1f14
+<Multi_key> <less> <apostrophe> <Greek_epsilon>         : "ἕ"  U1f15
+<Multi_key> <apostrophe> <less> <Greek_epsilon>         : "ἕ"  U1f15
+<dead_ogonek> <dead_acute> <Greek_epsilon>              : "ἕ"  U1f15
+<dead_dasia> <dead_acute> <Greek_epsilon>              : "ἕ"  U1f15
+<dead_acute> <dead_ogonek> <Greek_epsilon>              : "ἕ"  U1f15
+<dead_acute> <dead_dasia> <Greek_epsilon>              : "ἕ"  U1f15
+<Multi_key> <greater> <Greek_EPSILON>                   : "Ἐ"  U1f18
+<dead_horn> <Greek_EPSILON>                             : "Ἐ"  U1f18
+<dead_psili> <Greek_EPSILON>                             : "Ἐ"  U1f18
+<Multi_key> <less> <Greek_EPSILON>                      : "Ἑ"  U1f19
+<dead_ogonek> <Greek_EPSILON>                           : "Ἑ"  U1f19
+<dead_dasia> <Greek_EPSILON>                           : "Ἑ"  U1f19
+<Multi_key> <greater> <grave> <Greek_EPSILON>           : "Ἒ"  U1f1a
+<Multi_key> <grave> <greater> <Greek_EPSILON>           : "Ἒ"  U1f1a
+<dead_horn> <dead_grave> <Greek_EPSILON>                : "Ἒ"  U1f1a
+<dead_psili> <dead_grave> <Greek_EPSILON>                : "Ἒ"  U1f1a
+<dead_grave> <dead_horn> <Greek_EPSILON>                : "Ἒ"  U1f1a
+<dead_grave> <dead_psili> <Greek_EPSILON>                : "Ἒ"  U1f1a
+<Multi_key> <less> <grave> <Greek_EPSILON>              : "Ἓ"  U1f1b
+<Multi_key> <grave> <less> <Greek_EPSILON>              : "Ἓ"  U1f1b
+<dead_ogonek> <dead_grave> <Greek_EPSILON>              : "Ἓ"  U1f1b
+<dead_dasia> <dead_grave> <Greek_EPSILON>              : "Ἓ"  U1f1b
+<dead_grave> <dead_ogonek> <Greek_EPSILON>              : "Ἓ"  U1f1b
+<dead_grave> <dead_dasia> <Greek_EPSILON>              : "Ἓ"  U1f1b
+<Multi_key> <greater> <apostrophe> <Greek_EPSILON>      : "Ἔ"  U1f1c
+<Multi_key> <apostrophe> <greater> <Greek_EPSILON>      : "Ἔ"  U1f1c
+<dead_horn> <dead_acute> <Greek_EPSILON>                : "Ἔ"  U1f1c
+<dead_psili> <dead_acute> <Greek_EPSILON>                : "Ἔ"  U1f1c
+<dead_acute> <dead_horn> <Greek_EPSILON>                : "Ἔ"  U1f1c
+<dead_acute> <dead_psili> <Greek_EPSILON>                : "Ἔ"  U1f1c
+<Multi_key> <less> <apostrophe> <Greek_EPSILON>         : "Ἕ"  U1f1d
+<Multi_key> <apostrophe> <less> <Greek_EPSILON>         : "Ἕ"  U1f1d
+<dead_ogonek> <dead_acute> <Greek_EPSILON>              : "Ἕ"  U1f1d
+<dead_dasia> <dead_acute> <Greek_EPSILON>              : "Ἕ"  U1f1d
+<dead_acute> <dead_ogonek> <Greek_EPSILON>              : "Ἕ"  U1f1d
+<dead_acute> <dead_dasia> <Greek_EPSILON>              : "Ἕ"  U1f1d
+<Multi_key> <greater> <Greek_eta>                       : "ἠ"  U1f20
+<dead_horn> <Greek_eta>                                 : "ἠ"  U1f20
+<dead_psili> <Greek_eta>                                 : "ἠ"  U1f20
+<Multi_key> <less> <Greek_eta>                          : "ἡ"  U1f21
+<dead_ogonek> <Greek_eta>                               : "ἡ"  U1f21
+<dead_dasia> <Greek_eta>                               : "ἡ"  U1f21
+<Multi_key> <greater> <grave> <Greek_eta>               : "ἢ"  U1f22
+<Multi_key> <grave> <greater> <Greek_eta>               : "ἢ"  U1f22
+<dead_horn> <dead_grave> <Greek_eta>                    : "ἢ"  U1f22
+<dead_psili> <dead_grave> <Greek_eta>                    : "ἢ"  U1f22
+<dead_grave> <dead_horn> <Greek_eta>                    : "ἢ"  U1f22
+<dead_grave> <dead_psili> <Greek_eta>                    : "ἢ"  U1f22
+<Multi_key> <less> <grave> <Greek_eta>                  : "ἣ"  U1f23
+<Multi_key> <grave> <less> <Greek_eta>                  : "ἣ"  U1f23
+<dead_ogonek> <dead_grave> <Greek_eta>                  : "ἣ"  U1f23
+<dead_dasia> <dead_grave> <Greek_eta>                  : "ἣ"  U1f23
+<dead_grave> <dead_ogonek> <Greek_eta>                  : "ἣ"  U1f23
+<dead_grave> <dead_dasia> <Greek_eta>                  : "ἣ"  U1f23
+<Multi_key> <greater> <apostrophe> <Greek_eta>          : "ἤ"  U1f24
+<Multi_key> <apostrophe> <greater> <Greek_eta>          : "ἤ"  U1f24
+<dead_horn> <dead_acute> <Greek_eta>                    : "ἤ"  U1f24
+<dead_psili> <dead_acute> <Greek_eta>                    : "ἤ"  U1f24
+<dead_acute> <dead_horn> <Greek_eta>                    : "ἤ"  U1f24
+<dead_acute> <dead_psili> <Greek_eta>                    : "ἤ"  U1f24
+<Multi_key> <less> <apostrophe> <Greek_eta>             : "ἥ"  U1f25
+<Multi_key> <apostrophe> <less> <Greek_eta>             : "ἥ"  U1f25
+<dead_ogonek> <dead_acute> <Greek_eta>                  : "ἥ"  U1f25
+<dead_dasia> <dead_acute> <Greek_eta>                  : "ἥ"  U1f25
+<dead_acute> <dead_ogonek> <Greek_eta>                  : "ἥ"  U1f25
+<dead_acute> <dead_dasia> <Greek_eta>                  : "ἥ"  U1f25
+<Multi_key> <greater> <asciitilde> <Greek_eta>          : "ἦ"  U1f26
+<Multi_key> <asciitilde> <greater> <Greek_eta>          : "ἦ"  U1f26
+<dead_horn> <dead_tilde> <Greek_eta>                    : "ἦ"  U1f26
+<dead_psili> <dead_tilde> <Greek_eta>                    : "ἦ"  U1f26
+<dead_tilde> <dead_horn> <Greek_eta>                    : "ἦ"  U1f26
+<dead_tilde> <dead_psili> <Greek_eta>                    : "ἦ"  U1f26
+<Multi_key> <less> <asciitilde> <Greek_eta>             : "ἧ"  U1f27
+<Multi_key> <asciitilde> <less> <Greek_eta>             : "ἧ"  U1f27
+<dead_ogonek> <dead_tilde> <Greek_eta>                  : "ἧ"  U1f27
+<dead_dasia> <dead_tilde> <Greek_eta>                  : "ἧ"  U1f27
+<dead_tilde> <dead_ogonek> <Greek_eta>                  : "ἧ"  U1f27
+<dead_tilde> <dead_dasia> <Greek_eta>                  : "ἧ"  U1f27
+<Multi_key> <greater> <Greek_ETA>                       : "Ἠ"  U1f28
+<dead_horn> <Greek_ETA>                                 : "Ἠ"  U1f28
+<dead_psili> <Greek_ETA>                                 : "Ἠ"  U1f28
+<Multi_key> <less> <Greek_ETA>                          : "Ἡ"  U1f29
+<dead_ogonek> <Greek_ETA>                               : "Ἡ"  U1f29
+<dead_dasia> <Greek_ETA>                               : "Ἡ"  U1f29
+<Multi_key> <greater> <grave> <Greek_ETA>               : "Ἢ"  U1f2a
+<Multi_key> <grave> <greater> <Greek_ETA>               : "Ἢ"  U1f2a
+<dead_horn> <dead_grave> <Greek_ETA>                    : "Ἢ"  U1f2a
+<dead_psili> <dead_grave> <Greek_ETA>                    : "Ἢ"  U1f2a
+<dead_grave> <dead_horn> <Greek_ETA>                    : "Ἢ"  U1f2a
+<dead_grave> <dead_psili> <Greek_ETA>                    : "Ἢ"  U1f2a
+<Multi_key> <less> <grave> <Greek_ETA>                  : "Ἣ"  U1f2b
+<Multi_key> <grave> <less> <Greek_ETA>                  : "Ἣ"  U1f2b
+<dead_ogonek> <dead_grave> <Greek_ETA>                  : "Ἣ"  U1f2b
+<dead_dasia> <dead_grave> <Greek_ETA>                  : "Ἣ"  U1f2b
+<dead_grave> <dead_ogonek> <Greek_ETA>                  : "Ἣ"  U1f2b
+<dead_grave> <dead_dasia> <Greek_ETA>                  : "Ἣ"  U1f2b
+<Multi_key> <greater> <apostrophe> <Greek_ETA>          : "Ἤ"  U1f2c
+<Multi_key> <apostrophe> <greater> <Greek_ETA>          : "Ἤ"  U1f2c
+<dead_horn> <dead_acute> <Greek_ETA>                    : "Ἤ"  U1f2c
+<dead_psili> <dead_acute> <Greek_ETA>                    : "Ἤ"  U1f2c
+<dead_acute> <dead_horn> <Greek_ETA>                    : "Ἤ"  U1f2c
+<dead_acute> <dead_psili> <Greek_ETA>                    : "Ἤ"  U1f2c
+<Multi_key> <less> <apostrophe> <Greek_ETA>             : "Ἥ"  U1f2d
+<Multi_key> <apostrophe> <less> <Greek_ETA>             : "Ἥ"  U1f2d
+<dead_ogonek> <dead_acute> <Greek_ETA>                  : "Ἥ"  U1f2d
+<dead_dasia> <dead_acute> <Greek_ETA>                  : "Ἥ"  U1f2d
+<dead_acute> <dead_ogonek> <Greek_ETA>                  : "Ἥ"  U1f2d
+<dead_acute> <dead_dasia> <Greek_ETA>                  : "Ἥ"  U1f2d
+<Multi_key> <greater> <asciitilde> <Greek_ETA>          : "Ἦ"  U1f2e
+<Multi_key> <asciitilde> <greater> <Greek_ETA>          : "Ἦ"  U1f2e
+<dead_horn> <dead_tilde> <Greek_ETA>                    : "Ἦ"  U1f2e
+<dead_psili> <dead_tilde> <Greek_ETA>                    : "Ἦ"  U1f2e
+<dead_tilde> <dead_horn> <Greek_ETA>                    : "Ἦ"  U1f2e
+<dead_tilde> <dead_psili> <Greek_ETA>                    : "Ἦ"  U1f2e
+<Multi_key> <less> <asciitilde> <Greek_ETA>             : "Ἧ"  U1f2f
+<Multi_key> <asciitilde> <less> <Greek_ETA>             : "Ἧ"  U1f2f
+<dead_ogonek> <dead_tilde> <Greek_ETA>                  : "Ἧ"  U1f2f
+<dead_dasia> <dead_tilde> <Greek_ETA>                  : "Ἧ"  U1f2f
+<dead_tilde> <dead_ogonek> <Greek_ETA>                  : "Ἧ"  U1f2f
+<dead_tilde> <dead_dasia> <Greek_ETA>                  : "Ἧ"  U1f2f
+<Multi_key> <greater> <Greek_iota>                      : "ἰ"  U1f30
+<dead_horn> <Greek_iota>                                : "ἰ"  U1f30
+<dead_psili> <Greek_iota>                                : "ἰ"  U1f30
+<Multi_key> <less> <Greek_iota>                         : "ἱ"  U1f31
+<dead_ogonek> <Greek_iota>                              : "ἱ"  U1f31
+<dead_dasia> <Greek_iota>                              : "ἱ"  U1f31
+<Multi_key> <greater> <grave> <Greek_iota>              : "ἲ"  U1f32
+<Multi_key> <grave> <greater> <Greek_iota>              : "ἲ"  U1f32
+<dead_horn> <dead_grave> <Greek_iota>                   : "ἲ"  U1f32
+<dead_psili> <dead_grave> <Greek_iota>                   : "ἲ"  U1f32
+<dead_grave> <dead_horn> <Greek_iota>                   : "ἲ"  U1f32
+<dead_grave> <dead_psili> <Greek_iota>                   : "ἲ"  U1f32
+<Multi_key> <less> <grave> <Greek_iota>                 : "ἳ"  U1f33
+<Multi_key> <grave> <less> <Greek_iota>                 : "ἳ"  U1f33
+<dead_ogonek> <dead_grave> <Greek_iota>                 : "ἳ"  U1f33
+<dead_dasia> <dead_grave> <Greek_iota>                 : "ἳ"  U1f33
+<dead_grave> <dead_ogonek> <Greek_iota>                 : "ἳ"  U1f33
+<dead_grave> <dead_dasia> <Greek_iota>                 : "ἳ"  U1f33
+<Multi_key> <greater> <apostrophe> <Greek_iota>         : "ἴ"  U1f34
+<Multi_key> <apostrophe> <greater> <Greek_iota>         : "ἴ"  U1f34
+<dead_horn> <dead_acute> <Greek_iota>                   : "ἴ"  U1f34
+<dead_psili> <dead_acute> <Greek_iota>                   : "ἴ"  U1f34
+<dead_acute> <dead_horn> <Greek_iota>                   : "ἴ"  U1f34
+<dead_acute> <dead_psili> <Greek_iota>                   : "ἴ"  U1f34
+<Multi_key> <less> <apostrophe> <Greek_iota>            : "ἵ"  U1f35
+<Multi_key> <apostrophe> <less> <Greek_iota>            : "ἵ"  U1f35
+<dead_ogonek> <dead_acute> <Greek_iota>                 : "ἵ"  U1f35
+<dead_dasia> <dead_acute> <Greek_iota>                 : "ἵ"  U1f35
+<dead_acute> <dead_ogonek> <Greek_iota>                 : "ἵ"  U1f35
+<dead_acute> <dead_dasia> <Greek_iota>                 : "ἵ"  U1f35
+<Multi_key> <greater> <asciitilde> <Greek_iota>         : "ἶ"  U1f36
+<Multi_key> <asciitilde> <greater> <Greek_iota>         : "ἶ"  U1f36
+<dead_horn> <dead_tilde> <Greek_iota>                   : "ἶ"  U1f36
+<dead_psili> <dead_tilde> <Greek_iota>                   : "ἶ"  U1f36
+<dead_tilde> <dead_horn> <Greek_iota>                   : "ἶ"  U1f36
+<dead_tilde> <dead_psili> <Greek_iota>                   : "ἶ"  U1f36
+<Multi_key> <less> <asciitilde> <Greek_iota>            : "ἷ"  U1f37
+<Multi_key> <asciitilde> <less> <Greek_iota>            : "ἷ"  U1f37
+<dead_ogonek> <dead_tilde> <Greek_iota>                 : "ἷ"  U1f37
+<dead_dasia> <dead_tilde> <Greek_iota>                 : "ἷ"  U1f37
+<dead_tilde> <dead_ogonek> <Greek_iota>                 : "ἷ"  U1f37
+<dead_tilde> <dead_dasia> <Greek_iota>                 : "ἷ"  U1f37
+<Multi_key> <greater> <Greek_IOTA>                      : "Ἰ"  U1f38
+<dead_horn> <Greek_IOTA>                                : "Ἰ"  U1f38
+<dead_psili> <Greek_IOTA>                                : "Ἰ"  U1f38
+<Multi_key> <less> <Greek_IOTA>                         : "Ἱ"  U1f39
+<dead_ogonek> <Greek_IOTA>                              : "Ἱ"  U1f39
+<dead_dasia> <Greek_IOTA>                              : "Ἱ"  U1f39
+<Multi_key> <greater> <grave> <Greek_IOTA>              : "Ἲ"  U1f3a
+<Multi_key> <grave> <greater> <Greek_IOTA>              : "Ἲ"  U1f3a
+<dead_horn> <dead_grave> <Greek_IOTA>                   : "Ἲ"  U1f3a
+<dead_psili> <dead_grave> <Greek_IOTA>                   : "Ἲ"  U1f3a
+<dead_grave> <dead_horn> <Greek_IOTA>                   : "Ἲ"  U1f3a
+<dead_grave> <dead_psili> <Greek_IOTA>                   : "Ἲ"  U1f3a
+<Multi_key> <less> <grave> <Greek_IOTA>                 : "Ἳ"  U1f3b
+<Multi_key> <grave> <less> <Greek_IOTA>                 : "Ἳ"  U1f3b
+<dead_ogonek> <dead_grave> <Greek_IOTA>                 : "Ἳ"  U1f3b
+<dead_dasia> <dead_grave> <Greek_IOTA>                 : "Ἳ"  U1f3b
+<dead_grave> <dead_ogonek> <Greek_IOTA>                 : "Ἳ"  U1f3b
+<dead_grave> <dead_dasia> <Greek_IOTA>                 : "Ἳ"  U1f3b
+<Multi_key> <greater> <apostrophe> <Greek_IOTA>         : "Ἴ"  U1f3c
+<Multi_key> <apostrophe> <greater> <Greek_IOTA>         : "Ἴ"  U1f3c
+<dead_horn> <dead_acute> <Greek_IOTA>                   : "Ἴ"  U1f3c
+<dead_psili> <dead_acute> <Greek_IOTA>                   : "Ἴ"  U1f3c
+<dead_acute> <dead_horn> <Greek_IOTA>                   : "Ἴ"  U1f3c
+<dead_acute> <dead_psili> <Greek_IOTA>                   : "Ἴ"  U1f3c
+<Multi_key> <less> <apostrophe> <Greek_IOTA>            : "Ἵ"  U1f3d
+<Multi_key> <apostrophe> <less> <Greek_IOTA>            : "Ἵ"  U1f3d
+<dead_ogonek> <dead_acute> <Greek_IOTA>                 : "Ἵ"  U1f3d
+<dead_dasia> <dead_acute> <Greek_IOTA>                 : "Ἵ"  U1f3d
+<dead_acute> <dead_ogonek> <Greek_IOTA>                 : "Ἵ"  U1f3d
+<dead_acute> <dead_dasia> <Greek_IOTA>                 : "Ἵ"  U1f3d
+<Multi_key> <greater> <asciitilde> <Greek_IOTA>         : "Ἶ"  U1f3e
+<Multi_key> <asciitilde> <greater> <Greek_IOTA>         : "Ἶ"  U1f3e
+<dead_horn> <dead_tilde> <Greek_IOTA>                   : "Ἶ"  U1f3e
+<dead_psili> <dead_tilde> <Greek_IOTA>                   : "Ἶ"  U1f3e
+<dead_tilde> <dead_horn> <Greek_IOTA>                   : "Ἶ"  U1f3e
+<dead_tilde> <dead_psili> <Greek_IOTA>                   : "Ἶ"  U1f3e
+<Multi_key> <less> <asciitilde> <Greek_IOTA>            : "Ἷ"  U1f3f
+<Multi_key> <asciitilde> <less> <Greek_IOTA>            : "Ἷ"  U1f3f
+<dead_ogonek> <dead_tilde> <Greek_IOTA>                 : "Ἷ"  U1f3f
+<dead_dasia> <dead_tilde> <Greek_IOTA>                 : "Ἷ"  U1f3f
+<dead_tilde> <dead_ogonek> <Greek_IOTA>                 : "Ἷ"  U1f3f
+<dead_tilde> <dead_dasia> <Greek_IOTA>                 : "Ἷ"  U1f3f
+<Multi_key> <greater> <Greek_omicron>                   : "ὀ"  U1f40
+<dead_horn> <Greek_omicron>                             : "ὀ"  U1f40
+<dead_psili> <Greek_omicron>                             : "ὀ"  U1f40
+<Multi_key> <less> <Greek_omicron>                      : "ὁ"  U1f41
+<dead_ogonek> <Greek_omicron>                           : "ὁ"  U1f41
+<dead_dasia> <Greek_omicron>                           : "ὁ"  U1f41
+<Multi_key> <greater> <grave> <Greek_omicron>           : "ὂ"  U1f42
+<Multi_key> <grave> <greater> <Greek_omicron>           : "ὂ"  U1f42
+<dead_horn> <dead_grave> <Greek_omicron>                : "ὂ"  U1f42
+<dead_psili> <dead_grave> <Greek_omicron>                : "ὂ"  U1f42
+<dead_grave> <dead_horn> <Greek_omicron>                : "ὂ"  U1f42
+<dead_grave> <dead_psili> <Greek_omicron>                : "ὂ"  U1f42
+<Multi_key> <less> <grave> <Greek_omicron>              : "ὃ"  U1f43
+<Multi_key> <grave> <less> <Greek_omicron>              : "ὃ"  U1f43
+<dead_ogonek> <dead_grave> <Greek_omicron>              : "ὃ"  U1f43
+<dead_dasia> <dead_grave> <Greek_omicron>              : "ὃ"  U1f43
+<dead_grave> <dead_ogonek> <Greek_omicron>              : "ὃ"  U1f43
+<dead_grave> <dead_dasia> <Greek_omicron>              : "ὃ"  U1f43
+<Multi_key> <greater> <apostrophe> <Greek_omicron>      : "ὄ"  U1f44
+<Multi_key> <apostrophe> <greater> <Greek_omicron>      : "ὄ"  U1f44
+<dead_horn> <dead_acute> <Greek_omicron>                : "ὄ"  U1f44
+<dead_psili> <dead_acute> <Greek_omicron>                : "ὄ"  U1f44
+<dead_acute> <dead_horn> <Greek_omicron>                : "ὄ"  U1f44
+<dead_acute> <dead_psili> <Greek_omicron>                : "ὄ"  U1f44
+<Multi_key> <less> <apostrophe> <Greek_omicron>         : "ὅ"  U1f45
+<Multi_key> <apostrophe> <less> <Greek_omicron>         : "ὅ"  U1f45
+<dead_ogonek> <dead_acute> <Greek_omicron>              : "ὅ"  U1f45
+<dead_dasia> <dead_acute> <Greek_omicron>              : "ὅ"  U1f45
+<dead_acute> <dead_ogonek> <Greek_omicron>              : "ὅ"  U1f45
+<dead_acute> <dead_dasia> <Greek_omicron>              : "ὅ"  U1f45
+<Multi_key> <greater> <Greek_OMICRON>                   : "Ὀ"  U1f48
+<dead_horn> <Greek_OMICRON>                             : "Ὀ"  U1f48
+<dead_psili> <Greek_OMICRON>                             : "Ὀ"  U1f48
+<Multi_key> <less> <Greek_OMICRON>                      : "Ὁ"  U1f49
+<dead_ogonek> <Greek_OMICRON>                           : "Ὁ"  U1f49
+<dead_dasia> <Greek_OMICRON>                           : "Ὁ"  U1f49
+<Multi_key> <greater> <grave> <Greek_OMICRON>           : "Ὂ"  U1f4a
+<Multi_key> <grave> <greater> <Greek_OMICRON>           : "Ὂ"  U1f4a
+<dead_horn> <dead_grave> <Greek_OMICRON>                : "Ὂ"  U1f4a
+<dead_psili> <dead_grave> <Greek_OMICRON>                : "Ὂ"  U1f4a
+<dead_grave> <dead_horn> <Greek_OMICRON>                : "Ὂ"  U1f4a
+<dead_grave> <dead_psili> <Greek_OMICRON>                : "Ὂ"  U1f4a
+<Multi_key> <less> <grave> <Greek_OMICRON>              : "Ὃ"  U1f4b
+<Multi_key> <grave> <less> <Greek_OMICRON>              : "Ὃ"  U1f4b
+<dead_ogonek> <dead_grave> <Greek_OMICRON>              : "Ὃ"  U1f4b
+<dead_dasia> <dead_grave> <Greek_OMICRON>              : "Ὃ"  U1f4b
+<dead_grave> <dead_ogonek> <Greek_OMICRON>              : "Ὃ"  U1f4b
+<dead_grave> <dead_dasia> <Greek_OMICRON>              : "Ὃ"  U1f4b
+<Multi_key> <greater> <apostrophe> <Greek_OMICRON>      : "Ὄ"  U1f4c
+<Multi_key> <apostrophe> <greater> <Greek_OMICRON>      : "Ὄ"  U1f4c
+<dead_horn> <dead_acute> <Greek_OMICRON>                : "Ὄ"  U1f4c
+<dead_psili> <dead_acute> <Greek_OMICRON>                : "Ὄ"  U1f4c
+<dead_acute> <dead_horn> <Greek_OMICRON>                : "Ὄ"  U1f4c
+<dead_acute> <dead_psili> <Greek_OMICRON>                : "Ὄ"  U1f4c
+<Multi_key> <less> <apostrophe> <Greek_OMICRON>         : "Ὅ"  U1f4d
+<Multi_key> <apostrophe> <less> <Greek_OMICRON>         : "Ὅ"  U1f4d
+<dead_ogonek> <dead_acute> <Greek_OMICRON>              : "Ὅ"  U1f4d
+<dead_dasia> <dead_acute> <Greek_OMICRON>              : "Ὅ"  U1f4d
+<dead_acute> <dead_ogonek> <Greek_OMICRON>              : "Ὅ"  U1f4d
+<dead_acute> <dead_dasia> <Greek_OMICRON>              : "Ὅ"  U1f4d
+<Multi_key> <greater> <Greek_upsilon>                   : "ὐ"  U1f50
+<dead_horn> <Greek_upsilon>                             : "ὐ"  U1f50
+<dead_psili> <Greek_upsilon>                             : "ὐ"  U1f50
+<Multi_key> <less> <Greek_upsilon>                      : "ὑ"  U1f51
+<dead_ogonek> <Greek_upsilon>                           : "ὑ"  U1f51
+<dead_dasia> <Greek_upsilon>                           : "ὑ"  U1f51
+<Multi_key> <greater> <grave> <Greek_upsilon>           : "ὒ"  U1f52
+<Multi_key> <grave> <greater> <Greek_upsilon>           : "ὒ"  U1f52
+<dead_horn> <dead_grave> <Greek_upsilon>                : "ὒ"  U1f52
+<dead_psili> <dead_grave> <Greek_upsilon>                : "ὒ"  U1f52
+<dead_grave> <dead_horn> <Greek_upsilon>                : "ὒ"  U1f52
+<dead_grave> <dead_psili> <Greek_upsilon>                : "ὒ"  U1f52
+<Multi_key> <less> <grave> <Greek_upsilon>              : "ὓ"  U1f53
+<Multi_key> <grave> <less> <Greek_upsilon>              : "ὓ"  U1f53
+<dead_ogonek> <dead_grave> <Greek_upsilon>              : "ὓ"  U1f53
+<dead_dasia> <dead_grave> <Greek_upsilon>              : "ὓ"  U1f53
+<dead_grave> <dead_ogonek> <Greek_upsilon>              : "ὓ"  U1f53
+<dead_grave> <dead_dasia> <Greek_upsilon>              : "ὓ"  U1f53
+<Multi_key> <greater> <apostrophe> <Greek_upsilon>      : "ὔ"  U1f54
+<Multi_key> <apostrophe> <greater> <Greek_upsilon>      : "ὔ"  U1f54
+<dead_horn> <dead_acute> <Greek_upsilon>                : "ὔ"  U1f54
+<dead_psili> <dead_acute> <Greek_upsilon>                : "ὔ"  U1f54
+<dead_acute> <dead_horn> <Greek_upsilon>                : "ὔ"  U1f54
+<dead_acute> <dead_psili> <Greek_upsilon>                : "ὔ"  U1f54
+<Multi_key> <less> <apostrophe> <Greek_upsilon>         : "ὕ"  U1f55
+<Multi_key> <apostrophe> <less> <Greek_upsilon>         : "ὕ"  U1f55
+<dead_ogonek> <dead_acute> <Greek_upsilon>              : "ὕ"  U1f55
+<dead_dasia> <dead_acute> <Greek_upsilon>              : "ὕ"  U1f55
+<dead_acute> <dead_ogonek> <Greek_upsilon>              : "ὕ"  U1f55
+<dead_acute> <dead_dasia> <Greek_upsilon>              : "ὕ"  U1f55
+<Multi_key> <greater> <asciitilde> <Greek_upsilon>      : "ὖ"  U1f56
+<Multi_key> <asciitilde> <greater> <Greek_upsilon>      : "ὖ"  U1f56
+<dead_horn> <dead_tilde> <Greek_upsilon>                : "ὖ"  U1f56
+<dead_psili> <dead_tilde> <Greek_upsilon>                : "ὖ"  U1f56
+<dead_tilde> <dead_horn> <Greek_upsilon>                : "ὖ"  U1f56
+<dead_tilde> <dead_psili> <Greek_upsilon>                : "ὖ"  U1f56
+<Multi_key> <less> <asciitilde> <Greek_upsilon>         : "ὗ"  U1f57
+<Multi_key> <asciitilde> <less> <Greek_upsilon>         : "ὗ"  U1f57
+<dead_ogonek> <dead_tilde> <Greek_upsilon>              : "ὗ"  U1f57
+<dead_dasia> <dead_tilde> <Greek_upsilon>              : "ὗ"  U1f57
+<dead_tilde> <dead_ogonek> <Greek_upsilon>              : "ὗ"  U1f57
+<dead_tilde> <dead_dasia> <Greek_upsilon>              : "ὗ"  U1f57
+<Multi_key> <less> <Greek_UPSILON>                      : "Ὑ"  U1f59
+<dead_ogonek> <Greek_UPSILON>                           : "Ὑ"  U1f59
+<dead_dasia> <Greek_UPSILON>                           : "Ὑ"  U1f59
+<Multi_key> <less> <grave> <Greek_UPSILON>              : "Ὓ"  U1f5b
+<Multi_key> <grave> <less> <Greek_UPSILON>              : "Ὓ"  U1f5b
+<dead_ogonek> <dead_grave> <Greek_UPSILON>              : "Ὓ"  U1f5b
+<dead_dasia> <dead_grave> <Greek_UPSILON>              : "Ὓ"  U1f5b
+<dead_grave> <dead_ogonek> <Greek_UPSILON>              : "Ὓ"  U1f5b
+<dead_grave> <dead_dasia> <Greek_UPSILON>              : "Ὓ"  U1f5b
+<Multi_key> <less> <apostrophe> <Greek_UPSILON>         : "Ὕ"  U1f5d
+<Multi_key> <apostrophe> <less> <Greek_UPSILON>         : "Ὕ"  U1f5d
+<dead_ogonek> <dead_acute> <Greek_UPSILON>              : "Ὕ"  U1f5d
+<dead_dasia> <dead_acute> <Greek_UPSILON>              : "Ὕ"  U1f5d
+<dead_acute> <dead_ogonek> <Greek_UPSILON>              : "Ὕ"  U1f5d
+<dead_acute> <dead_dasia> <Greek_UPSILON>              : "Ὕ"  U1f5d
+<Multi_key> <less> <asciitilde> <Greek_UPSILON>         : "Ὗ"  U1f5f
+<Multi_key> <asciitilde> <less> <Greek_UPSILON>         : "Ὗ"  U1f5f
+<dead_ogonek> <dead_tilde> <Greek_UPSILON>              : "Ὗ"  U1f5f
+<dead_dasia> <dead_tilde> <Greek_UPSILON>              : "Ὗ"  U1f5f
+<dead_tilde> <dead_ogonek> <Greek_UPSILON>              : "Ὗ"  U1f5f
+<dead_tilde> <dead_dasia> <Greek_UPSILON>              : "Ὗ"  U1f5f
+<Multi_key> <greater> <Greek_omega>                     : "ὠ"  U1f60
+<dead_horn> <Greek_omega>                               : "ὠ"  U1f60
+<dead_psili> <Greek_omega>                               : "ὠ"  U1f60
+<Multi_key> <less> <Greek_omega>                        : "ὡ"  U1f61
+<dead_ogonek> <Greek_omega>                             : "ὡ"  U1f61
+<dead_dasia> <Greek_omega>                             : "ὡ"  U1f61
+<Multi_key> <greater> <grave> <Greek_omega>             : "ὢ"  U1f62
+<Multi_key> <grave> <greater> <Greek_omega>             : "ὢ"  U1f62
+<dead_horn> <dead_grave> <Greek_omega>                  : "ὢ"  U1f62
+<dead_psili> <dead_grave> <Greek_omega>                  : "ὢ"  U1f62
+<dead_grave> <dead_horn> <Greek_omega>                  : "ὢ"  U1f62
+<dead_grave> <dead_psili> <Greek_omega>                  : "ὢ"  U1f62
+<Multi_key> <less> <grave> <Greek_omega>                : "ὣ"  U1f63
+<Multi_key> <grave> <less> <Greek_omega>                : "ὣ"  U1f63
+<dead_ogonek> <dead_grave> <Greek_omega>                : "ὣ"  U1f63
+<dead_dasia> <dead_grave> <Greek_omega>                : "ὣ"  U1f63
+<dead_grave> <dead_ogonek> <Greek_omega>                : "ὣ"  U1f63
+<dead_grave> <dead_dasia> <Greek_omega>                : "ὣ"  U1f63
+<Multi_key> <greater> <apostrophe> <Greek_omega>        : "ὤ"  U1f64
+<Multi_key> <apostrophe> <greater> <Greek_omega>        : "ὤ"  U1f64
+<dead_horn> <dead_acute> <Greek_omega>                  : "ὤ"  U1f64
+<dead_psili> <dead_acute> <Greek_omega>                  : "ὤ"  U1f64
+<dead_acute> <dead_horn> <Greek_omega>                  : "ὤ"  U1f64
+<dead_acute> <dead_psili> <Greek_omega>                  : "ὤ"  U1f64
+<Multi_key> <less> <apostrophe> <Greek_omega>           : "ὥ"  U1f65
+<Multi_key> <apostrophe> <less> <Greek_omega>           : "ὥ"  U1f65
+<dead_ogonek> <dead_acute> <Greek_omega>                : "ὥ"  U1f65
+<dead_dasia> <dead_acute> <Greek_omega>                : "ὥ"  U1f65
+<dead_acute> <dead_ogonek> <Greek_omega>                : "ὥ"  U1f65
+<dead_acute> <dead_dasia> <Greek_omega>                : "ὥ"  U1f65
+<Multi_key> <greater> <asciitilde> <Greek_omega>        : "ὦ"  U1f66
+<Multi_key> <asciitilde> <greater> <Greek_omega>        : "ὦ"  U1f66
+<dead_horn> <dead_tilde> <Greek_omega>                  : "ὦ"  U1f66
+<dead_psili> <dead_tilde> <Greek_omega>                  : "ὦ"  U1f66
+<dead_tilde> <dead_horn> <Greek_omega>                  : "ὦ"  U1f66
+<dead_tilde> <dead_psili> <Greek_omega>                  : "ὦ"  U1f66
+<Multi_key> <less> <asciitilde> <Greek_omega>           : "ὧ"  U1f67
+<Multi_key> <asciitilde> <less> <Greek_omega>           : "ὧ"  U1f67
+<dead_ogonek> <dead_tilde> <Greek_omega>                : "ὧ"  U1f67
+<dead_dasia> <dead_tilde> <Greek_omega>                : "ὧ"  U1f67
+<dead_tilde> <dead_ogonek> <Greek_omega>                : "ὧ"  U1f67
+<dead_tilde> <dead_dasia> <Greek_omega>                : "ὧ"  U1f67
+<Multi_key> <greater> <Greek_OMEGA>                     : "Ὠ"  U1f68
+<dead_horn> <Greek_OMEGA>                               : "Ὠ"  U1f68
+<dead_psili> <Greek_OMEGA>                               : "Ὠ"  U1f68
+<Multi_key> <less> <Greek_OMEGA>                        : "Ὡ"  U1f69
+<dead_ogonek> <Greek_OMEGA>                             : "Ὡ"  U1f69
+<dead_dasia> <Greek_OMEGA>                             : "Ὡ"  U1f69
+<Multi_key> <greater> <grave> <Greek_OMEGA>             : "Ὢ"  U1f6a
+<Multi_key> <grave> <greater> <Greek_OMEGA>             : "Ὢ"  U1f6a
+<dead_horn> <dead_grave> <Greek_OMEGA>                  : "Ὢ"  U1f6a
+<dead_psili> <dead_grave> <Greek_OMEGA>                  : "Ὢ"  U1f6a
+<dead_grave> <dead_horn> <Greek_OMEGA>                  : "Ὢ"  U1f6a
+<dead_grave> <dead_psili> <Greek_OMEGA>                  : "Ὢ"  U1f6a
+<Multi_key> <less> <grave> <Greek_OMEGA>                : "Ὣ"  U1f6b
+<Multi_key> <grave> <less> <Greek_OMEGA>                : "Ὣ"  U1f6b
+<dead_ogonek> <dead_grave> <Greek_OMEGA>                : "Ὣ"  U1f6b
+<dead_dasia> <dead_grave> <Greek_OMEGA>                : "Ὣ"  U1f6b
+<dead_grave> <dead_ogonek> <Greek_OMEGA>                : "Ὣ"  U1f6b
+<dead_grave> <dead_dasia> <Greek_OMEGA>                : "Ὣ"  U1f6b
+<Multi_key> <greater> <apostrophe> <Greek_OMEGA>        : "Ὤ"  U1f6c
+<Multi_key> <apostrophe> <greater> <Greek_OMEGA>        : "Ὤ"  U1f6c
+<dead_horn> <dead_acute> <Greek_OMEGA>                  : "Ὤ"  U1f6c
+<dead_psili> <dead_acute> <Greek_OMEGA>                  : "Ὤ"  U1f6c
+<dead_acute> <dead_horn> <Greek_OMEGA>                  : "Ὤ"  U1f6c
+<dead_acute> <dead_psili> <Greek_OMEGA>                  : "Ὤ"  U1f6c
+<Multi_key> <less> <apostrophe> <Greek_OMEGA>           : "Ὥ"  U1f6d
+<Multi_key> <apostrophe> <less> <Greek_OMEGA>           : "Ὥ"  U1f6d
+<dead_ogonek> <dead_acute> <Greek_OMEGA>                : "Ὥ"  U1f6d
+<dead_dasia> <dead_acute> <Greek_OMEGA>                : "Ὥ"  U1f6d
+<dead_acute> <dead_ogonek> <Greek_OMEGA>                : "Ὥ"  U1f6d
+<dead_acute> <dead_dasia> <Greek_OMEGA>                : "Ὥ"  U1f6d
+<Multi_key> <greater> <asciitilde> <Greek_OMEGA>        : "Ὦ"  U1f6e
+<Multi_key> <asciitilde> <greater> <Greek_OMEGA>        : "Ὦ"  U1f6e
+<dead_horn> <dead_tilde> <Greek_OMEGA>                  : "Ὦ"  U1f6e
+<dead_psili> <dead_tilde> <Greek_OMEGA>                  : "Ὦ"  U1f6e
+<dead_tilde> <dead_horn> <Greek_OMEGA>                  : "Ὦ"  U1f6e
+<dead_tilde> <dead_psili> <Greek_OMEGA>                  : "Ὦ"  U1f6e
+<Multi_key> <less> <asciitilde> <Greek_OMEGA>           : "Ὧ"  U1f6f
+<Multi_key> <asciitilde> <less> <Greek_OMEGA>           : "Ὧ"  U1f6f
+<dead_ogonek> <dead_tilde> <Greek_OMEGA>                : "Ὧ"  U1f6f
+<dead_dasia> <dead_tilde> <Greek_OMEGA>                : "Ὧ"  U1f6f
+<dead_tilde> <dead_ogonek> <Greek_OMEGA>                : "Ὧ"  U1f6f
+<dead_tilde> <dead_dasia> <Greek_OMEGA>                : "Ὧ"  U1f6f
+<Multi_key> <grave> <Greek_alpha>                       : "ὰ"  U1f70
+<dead_grave> <Greek_alpha>                              : "ὰ"  U1f70
+<Multi_key> <grave> <Greek_epsilon>                     : "ὲ"  U1f72
+<dead_grave> <Greek_epsilon>                            : "ὲ"  U1f72
+<Multi_key> <grave> <Greek_eta>                         : "ὴ"  U1f74
+<dead_grave> <Greek_eta>                                : "ὴ"  U1f74
+<Multi_key> <grave> <Greek_iota>                        : "ὶ"  U1f76
+<dead_grave> <Greek_iota>                               : "ὶ"  U1f76
+<Multi_key> <grave> <Greek_omicron>                     : "ὸ"  U1f78
+<dead_grave> <Greek_omicron>                            : "ὸ"  U1f78
+<Multi_key> <grave> <Greek_upsilon>                     : "ὺ"  U1f7a
+<dead_grave> <Greek_upsilon>                            : "ὺ"  U1f7a
+<Multi_key> <grave> <Greek_omega>                       : "ὼ"  U1f7c
+<dead_grave> <Greek_omega>                              : "ὼ"  U1f7c
+<Multi_key> <bar> <greater> <Greek_alpha>               : "ᾀ"  U1f80
+<Multi_key> <greater> <bar> <Greek_alpha>               : "ᾀ"  U1f80
+<dead_iota> <dead_horn> <Greek_alpha>                   : "ᾀ"  U1f80
+<dead_iota> <dead_psili> <Greek_alpha>                   : "ᾀ"  U1f80
+<dead_horn> <dead_iota> <Greek_alpha>                   : "ᾀ"  U1f80
+<dead_psili> <dead_iota> <Greek_alpha>                   : "ᾀ"  U1f80
+<Multi_key> <bar> <less> <Greek_alpha>                  : "ᾁ"  U1f81
+<Multi_key> <less> <bar> <Greek_alpha>                  : "ᾁ"  U1f81
+<dead_iota> <dead_ogonek> <Greek_alpha>                 : "ᾁ"  U1f81
+<dead_iota> <dead_dasia> <Greek_alpha>                 : "ᾁ"  U1f81
+<dead_ogonek> <dead_iota> <Greek_alpha>                 : "ᾁ"  U1f81
+<dead_dasia> <dead_iota> <Greek_alpha>                 : "ᾁ"  U1f81
+<Multi_key> <bar> <greater> <grave> <Greek_alpha>       : "ᾂ"  U1f82
+<Multi_key> <bar> <grave> <greater> <Greek_alpha>       : "ᾂ"  U1f82
+<Multi_key> <greater> <bar> <grave> <Greek_alpha>       : "ᾂ"  U1f82
+<Multi_key> <greater> <grave> <bar> <Greek_alpha>       : "ᾂ"  U1f82
+<Multi_key> <grave> <bar> <greater> <Greek_alpha>       : "ᾂ"  U1f82
+<Multi_key> <grave> <greater> <bar> <Greek_alpha>       : "ᾂ"  U1f82
+<dead_iota> <dead_horn> <dead_grave> <Greek_alpha>      : "ᾂ"  U1f82
+<dead_iota> <dead_psili> <dead_grave> <Greek_alpha>      : "ᾂ"  U1f82
+<dead_iota> <dead_grave> <dead_horn> <Greek_alpha>      : "ᾂ"  U1f82
+<dead_iota> <dead_grave> <dead_psili> <Greek_alpha>      : "ᾂ"  U1f82
+<dead_horn> <dead_iota> <dead_grave> <Greek_alpha>      : "ᾂ"  U1f82
+<dead_psili> <dead_iota> <dead_grave> <Greek_alpha>      : "ᾂ"  U1f82
+<dead_horn> <dead_grave> <dead_iota> <Greek_alpha>      : "ᾂ"  U1f82
+<dead_psili> <dead_grave> <dead_iota> <Greek_alpha>      : "ᾂ"  U1f82
+<dead_grave> <dead_iota> <dead_horn> <Greek_alpha>      : "ᾂ"  U1f82
+<dead_grave> <dead_iota> <dead_psili> <Greek_alpha>      : "ᾂ"  U1f82
+<dead_grave> <dead_horn> <dead_iota> <Greek_alpha>      : "ᾂ"  U1f82
+<dead_grave> <dead_psili> <dead_iota> <Greek_alpha>      : "ᾂ"  U1f82
+<Multi_key> <bar> <less> <grave> <Greek_alpha>          : "ᾃ"  U1f83
+<Multi_key> <bar> <grave> <less> <Greek_alpha>          : "ᾃ"  U1f83
+<Multi_key> <less> <bar> <grave> <Greek_alpha>          : "ᾃ"  U1f83
+<Multi_key> <less> <grave> <bar> <Greek_alpha>          : "ᾃ"  U1f83
+<Multi_key> <grave> <bar> <less> <Greek_alpha>          : "ᾃ"  U1f83
+<Multi_key> <grave> <less> <bar> <Greek_alpha>          : "ᾃ"  U1f83
+<dead_iota> <dead_ogonek> <dead_grave> <Greek_alpha>    : "ᾃ"  U1f83
+<dead_iota> <dead_dasia> <dead_grave> <Greek_alpha>    : "ᾃ"  U1f83
+<dead_iota> <dead_grave> <dead_ogonek> <Greek_alpha>    : "ᾃ"  U1f83
+<dead_iota> <dead_grave> <dead_dasia> <Greek_alpha>    : "ᾃ"  U1f83
+<dead_ogonek> <dead_iota> <dead_grave> <Greek_alpha>    : "ᾃ"  U1f83
+<dead_dasia> <dead_iota> <dead_grave> <Greek_alpha>    : "ᾃ"  U1f83
+<dead_ogonek> <dead_grave> <dead_iota> <Greek_alpha>    : "ᾃ"  U1f83
+<dead_dasia> <dead_grave> <dead_iota> <Greek_alpha>    : "ᾃ"  U1f83
+<dead_grave> <dead_iota> <dead_ogonek> <Greek_alpha>    : "ᾃ"  U1f83
+<dead_grave> <dead_iota> <dead_dasia> <Greek_alpha>    : "ᾃ"  U1f83
+<dead_grave> <dead_ogonek> <dead_iota> <Greek_alpha>    : "ᾃ"  U1f83
+<dead_grave> <dead_dasia> <dead_iota> <Greek_alpha>    : "ᾃ"  U1f83
+<Multi_key> <bar> <greater> <apostrophe> <Greek_alpha>  : "ᾄ"  U1f84
+<Multi_key> <bar> <apostrophe> <greater> <Greek_alpha>  : "ᾄ"  U1f84
+<Multi_key> <greater> <bar> <apostrophe> <Greek_alpha>  : "ᾄ"  U1f84
+<Multi_key> <greater> <apostrophe> <bar> <Greek_alpha>  : "ᾄ"  U1f84
+<Multi_key> <apostrophe> <bar> <greater> <Greek_alpha>  : "ᾄ"  U1f84
+<Multi_key> <apostrophe> <greater> <bar> <Greek_alpha>  : "ᾄ"  U1f84
+<dead_iota> <dead_horn> <dead_acute> <Greek_alpha>      : "ᾄ"  U1f84
+<dead_iota> <dead_psili> <dead_acute> <Greek_alpha>      : "ᾄ"  U1f84
+<dead_iota> <dead_acute> <dead_horn> <Greek_alpha>      : "ᾄ"  U1f84
+<dead_iota> <dead_acute> <dead_psili> <Greek_alpha>      : "ᾄ"  U1f84
+<dead_horn> <dead_iota> <dead_acute> <Greek_alpha>      : "ᾄ"  U1f84
+<dead_psili> <dead_iota> <dead_acute> <Greek_alpha>      : "ᾄ"  U1f84
+<dead_horn> <dead_acute> <dead_iota> <Greek_alpha>      : "ᾄ"  U1f84
+<dead_psili> <dead_acute> <dead_iota> <Greek_alpha>      : "ᾄ"  U1f84
+<dead_acute> <dead_iota> <dead_horn> <Greek_alpha>      : "ᾄ"  U1f84
+<dead_acute> <dead_iota> <dead_psili> <Greek_alpha>      : "ᾄ"  U1f84
+<dead_acute> <dead_horn> <dead_iota> <Greek_alpha>      : "ᾄ"  U1f84
+<dead_acute> <dead_psili> <dead_iota> <Greek_alpha>      : "ᾄ"  U1f84
+<Multi_key> <bar> <less> <apostrophe> <Greek_alpha>     : "ᾅ"  U1f85
+<Multi_key> <bar> <apostrophe> <less> <Greek_alpha>     : "ᾅ"  U1f85
+<Multi_key> <less> <bar> <apostrophe> <Greek_alpha>     : "ᾅ"  U1f85
+<Multi_key> <less> <apostrophe> <bar> <Greek_alpha>     : "ᾅ"  U1f85
+<Multi_key> <apostrophe> <bar> <less> <Greek_alpha>     : "ᾅ"  U1f85
+<Multi_key> <apostrophe> <less> <bar> <Greek_alpha>     : "ᾅ"  U1f85
+<dead_iota> <dead_ogonek> <dead_acute> <Greek_alpha>    : "ᾅ"  U1f85
+<dead_iota> <dead_dasia> <dead_acute> <Greek_alpha>    : "ᾅ"  U1f85
+<dead_iota> <dead_acute> <dead_ogonek> <Greek_alpha>    : "ᾅ"  U1f85
+<dead_iota> <dead_acute> <dead_dasia> <Greek_alpha>    : "ᾅ"  U1f85
+<dead_ogonek> <dead_iota> <dead_acute> <Greek_alpha>    : "ᾅ"  U1f85
+<dead_dasia> <dead_iota> <dead_acute> <Greek_alpha>    : "ᾅ"  U1f85
+<dead_ogonek> <dead_acute> <dead_iota> <Greek_alpha>    : "ᾅ"  U1f85
+<dead_dasia> <dead_acute> <dead_iota> <Greek_alpha>    : "ᾅ"  U1f85
+<dead_acute> <dead_iota> <dead_ogonek> <Greek_alpha>    : "ᾅ"  U1f85
+<dead_acute> <dead_iota> <dead_dasia> <Greek_alpha>    : "ᾅ"  U1f85
+<dead_acute> <dead_ogonek> <dead_iota> <Greek_alpha>    : "ᾅ"  U1f85
+<dead_acute> <dead_dasia> <dead_iota> <Greek_alpha>    : "ᾅ"  U1f85
+<Multi_key> <bar> <greater> <asciitilde> <Greek_alpha>  : "ᾆ"  U1f86
+<Multi_key> <bar> <asciitilde> <greater> <Greek_alpha>  : "ᾆ"  U1f86
+<Multi_key> <greater> <bar> <asciitilde> <Greek_alpha>  : "ᾆ"  U1f86
+<Multi_key> <greater> <asciitilde> <bar> <Greek_alpha>  : "ᾆ"  U1f86
+<Multi_key> <asciitilde> <bar> <greater> <Greek_alpha>  : "ᾆ"  U1f86
+<Multi_key> <asciitilde> <greater> <bar> <Greek_alpha>  : "ᾆ"  U1f86
+<dead_iota> <dead_horn> <dead_tilde> <Greek_alpha>      : "ᾆ"  U1f86
+<dead_iota> <dead_psili> <dead_tilde> <Greek_alpha>      : "ᾆ"  U1f86
+<dead_iota> <dead_tilde> <dead_horn> <Greek_alpha>      : "ᾆ"  U1f86
+<dead_iota> <dead_tilde> <dead_psili> <Greek_alpha>      : "ᾆ"  U1f86
+<dead_horn> <dead_iota> <dead_tilde> <Greek_alpha>      : "ᾆ"  U1f86
+<dead_psili> <dead_iota> <dead_tilde> <Greek_alpha>      : "ᾆ"  U1f86
+<dead_horn> <dead_tilde> <dead_iota> <Greek_alpha>      : "ᾆ"  U1f86
+<dead_psili> <dead_tilde> <dead_iota> <Greek_alpha>      : "ᾆ"  U1f86
+<dead_tilde> <dead_iota> <dead_horn> <Greek_alpha>      : "ᾆ"  U1f86
+<dead_tilde> <dead_iota> <dead_psili> <Greek_alpha>      : "ᾆ"  U1f86
+<dead_tilde> <dead_horn> <dead_iota> <Greek_alpha>      : "ᾆ"  U1f86
+<dead_tilde> <dead_psili> <dead_iota> <Greek_alpha>      : "ᾆ"  U1f86
+<Multi_key> <bar> <less> <asciitilde> <Greek_alpha>     : "ᾇ"  U1f87
+<Multi_key> <bar> <asciitilde> <less> <Greek_alpha>     : "ᾇ"  U1f87
+<Multi_key> <less> <bar> <asciitilde> <Greek_alpha>     : "ᾇ"  U1f87
+<Multi_key> <less> <asciitilde> <bar> <Greek_alpha>     : "ᾇ"  U1f87
+<Multi_key> <asciitilde> <bar> <less> <Greek_alpha>     : "ᾇ"  U1f87
+<Multi_key> <asciitilde> <less> <bar> <Greek_alpha>     : "ᾇ"  U1f87
+<dead_iota> <dead_ogonek> <dead_tilde> <Greek_alpha>    : "ᾇ"  U1f87
+<dead_iota> <dead_dasia> <dead_tilde> <Greek_alpha>    : "ᾇ"  U1f87
+<dead_iota> <dead_tilde> <dead_ogonek> <Greek_alpha>    : "ᾇ"  U1f87
+<dead_iota> <dead_tilde> <dead_dasia> <Greek_alpha>    : "ᾇ"  U1f87
+<dead_ogonek> <dead_iota> <dead_tilde> <Greek_alpha>    : "ᾇ"  U1f87
+<dead_dasia> <dead_iota> <dead_tilde> <Greek_alpha>    : "ᾇ"  U1f87
+<dead_ogonek> <dead_tilde> <dead_iota> <Greek_alpha>    : "ᾇ"  U1f87
+<dead_dasia> <dead_tilde> <dead_iota> <Greek_alpha>    : "ᾇ"  U1f87
+<dead_tilde> <dead_iota> <dead_ogonek> <Greek_alpha>    : "ᾇ"  U1f87
+<dead_tilde> <dead_iota> <dead_dasia> <Greek_alpha>    : "ᾇ"  U1f87
+<dead_tilde> <dead_ogonek> <dead_iota> <Greek_alpha>    : "ᾇ"  U1f87
+<dead_tilde> <dead_dasia> <dead_iota> <Greek_alpha>    : "ᾇ"  U1f87
+<Multi_key> <bar> <greater> <Greek_ALPHA>               : "ᾈ"  U1f88
+<Multi_key> <greater> <bar> <Greek_ALPHA>               : "ᾈ"  U1f88
+<dead_iota> <dead_horn> <Greek_ALPHA>                   : "ᾈ"  U1f88
+<dead_iota> <dead_psili> <Greek_ALPHA>                   : "ᾈ"  U1f88
+<dead_horn> <dead_iota> <Greek_ALPHA>                   : "ᾈ"  U1f88
+<dead_psili> <dead_iota> <Greek_ALPHA>                   : "ᾈ"  U1f88
+<Multi_key> <bar> <less> <Greek_ALPHA>                  : "ᾉ"  U1f89
+<Multi_key> <less> <bar> <Greek_ALPHA>                  : "ᾉ"  U1f89
+<dead_iota> <dead_ogonek> <Greek_ALPHA>                 : "ᾉ"  U1f89
+<dead_iota> <dead_dasia> <Greek_ALPHA>                 : "ᾉ"  U1f89
+<dead_ogonek> <dead_iota> <Greek_ALPHA>                 : "ᾉ"  U1f89
+<dead_dasia> <dead_iota> <Greek_ALPHA>                 : "ᾉ"  U1f89
+<Multi_key> <bar> <greater> <grave> <Greek_ALPHA>       : "ᾊ"  U1f8a
+<Multi_key> <bar> <grave> <greater> <Greek_ALPHA>       : "ᾊ"  U1f8a
+<Multi_key> <greater> <bar> <grave> <Greek_ALPHA>       : "ᾊ"  U1f8a
+<Multi_key> <greater> <grave> <bar> <Greek_ALPHA>       : "ᾊ"  U1f8a
+<Multi_key> <grave> <bar> <greater> <Greek_ALPHA>       : "ᾊ"  U1f8a
+<Multi_key> <grave> <greater> <bar> <Greek_ALPHA>       : "ᾊ"  U1f8a
+<dead_iota> <dead_horn> <dead_grave> <Greek_ALPHA>      : "ᾊ"  U1f8a
+<dead_iota> <dead_psili> <dead_grave> <Greek_ALPHA>      : "ᾊ"  U1f8a
+<dead_iota> <dead_grave> <dead_horn> <Greek_ALPHA>      : "ᾊ"  U1f8a
+<dead_iota> <dead_grave> <dead_psili> <Greek_ALPHA>      : "ᾊ"  U1f8a
+<dead_horn> <dead_iota> <dead_grave> <Greek_ALPHA>      : "ᾊ"  U1f8a
+<dead_psili> <dead_iota> <dead_grave> <Greek_ALPHA>      : "ᾊ"  U1f8a
+<dead_horn> <dead_grave> <dead_iota> <Greek_ALPHA>      : "ᾊ"  U1f8a
+<dead_psili> <dead_grave> <dead_iota> <Greek_ALPHA>      : "ᾊ"  U1f8a
+<dead_grave> <dead_iota> <dead_horn> <Greek_ALPHA>      : "ᾊ"  U1f8a
+<dead_grave> <dead_iota> <dead_psili> <Greek_ALPHA>      : "ᾊ"  U1f8a
+<dead_grave> <dead_horn> <dead_iota> <Greek_ALPHA>      : "ᾊ"  U1f8a
+<dead_grave> <dead_psili> <dead_iota> <Greek_ALPHA>      : "ᾊ"  U1f8a
+<Multi_key> <bar> <less> <grave> <Greek_ALPHA>          : "ᾋ"  U1f8b
+<Multi_key> <bar> <grave> <less> <Greek_ALPHA>          : "ᾋ"  U1f8b
+<Multi_key> <less> <bar> <grave> <Greek_ALPHA>          : "ᾋ"  U1f8b
+<Multi_key> <less> <grave> <bar> <Greek_ALPHA>          : "ᾋ"  U1f8b
+<Multi_key> <grave> <bar> <less> <Greek_ALPHA>          : "ᾋ"  U1f8b
+<Multi_key> <grave> <less> <bar> <Greek_ALPHA>          : "ᾋ"  U1f8b
+<dead_iota> <dead_ogonek> <dead_grave> <Greek_ALPHA>    : "ᾋ"  U1f8b
+<dead_iota> <dead_dasia> <dead_grave> <Greek_ALPHA>    : "ᾋ"  U1f8b
+<dead_iota> <dead_grave> <dead_ogonek> <Greek_ALPHA>    : "ᾋ"  U1f8b
+<dead_iota> <dead_grave> <dead_dasia> <Greek_ALPHA>    : "ᾋ"  U1f8b
+<dead_ogonek> <dead_iota> <dead_grave> <Greek_ALPHA>    : "ᾋ"  U1f8b
+<dead_dasia> <dead_iota> <dead_grave> <Greek_ALPHA>    : "ᾋ"  U1f8b
+<dead_ogonek> <dead_grave> <dead_iota> <Greek_ALPHA>    : "ᾋ"  U1f8b
+<dead_dasia> <dead_grave> <dead_iota> <Greek_ALPHA>    : "ᾋ"  U1f8b
+<dead_grave> <dead_iota> <dead_ogonek> <Greek_ALPHA>    : "ᾋ"  U1f8b
+<dead_grave> <dead_iota> <dead_dasia> <Greek_ALPHA>    : "ᾋ"  U1f8b
+<dead_grave> <dead_ogonek> <dead_iota> <Greek_ALPHA>    : "ᾋ"  U1f8b
+<dead_grave> <dead_dasia> <dead_iota> <Greek_ALPHA>    : "ᾋ"  U1f8b
+<Multi_key> <bar> <greater> <apostrophe> <Greek_ALPHA>  : "ᾌ"  U1f8c
+<Multi_key> <bar> <apostrophe> <greater> <Greek_ALPHA>  : "ᾌ"  U1f8c
+<Multi_key> <greater> <bar> <apostrophe> <Greek_ALPHA>  : "ᾌ"  U1f8c
+<Multi_key> <greater> <apostrophe> <bar> <Greek_ALPHA>  : "ᾌ"  U1f8c
+<Multi_key> <apostrophe> <bar> <greater> <Greek_ALPHA>  : "ᾌ"  U1f8c
+<Multi_key> <apostrophe> <greater> <bar> <Greek_ALPHA>  : "ᾌ"  U1f8c
+<dead_iota> <dead_horn> <dead_acute> <Greek_ALPHA>      : "ᾌ"  U1f8c
+<dead_iota> <dead_psili> <dead_acute> <Greek_ALPHA>      : "ᾌ"  U1f8c
+<dead_iota> <dead_acute> <dead_horn> <Greek_ALPHA>      : "ᾌ"  U1f8c
+<dead_iota> <dead_acute> <dead_psili> <Greek_ALPHA>      : "ᾌ"  U1f8c
+<dead_horn> <dead_iota> <dead_acute> <Greek_ALPHA>      : "ᾌ"  U1f8c
+<dead_psili> <dead_iota> <dead_acute> <Greek_ALPHA>      : "ᾌ"  U1f8c
+<dead_horn> <dead_acute> <dead_iota> <Greek_ALPHA>      : "ᾌ"  U1f8c
+<dead_psili> <dead_acute> <dead_iota> <Greek_ALPHA>      : "ᾌ"  U1f8c
+<dead_acute> <dead_iota> <dead_horn> <Greek_ALPHA>      : "ᾌ"  U1f8c
+<dead_acute> <dead_iota> <dead_psili> <Greek_ALPHA>      : "ᾌ"  U1f8c
+<dead_acute> <dead_horn> <dead_iota> <Greek_ALPHA>      : "ᾌ"  U1f8c
+<dead_acute> <dead_psili> <dead_iota> <Greek_ALPHA>      : "ᾌ"  U1f8c
+<Multi_key> <bar> <less> <apostrophe> <Greek_ALPHA>     : "ᾍ"  U1f8d
+<Multi_key> <bar> <apostrophe> <less> <Greek_ALPHA>     : "ᾍ"  U1f8d
+<Multi_key> <less> <bar> <apostrophe> <Greek_ALPHA>     : "ᾍ"  U1f8d
+<Multi_key> <less> <apostrophe> <bar> <Greek_ALPHA>     : "ᾍ"  U1f8d
+<Multi_key> <apostrophe> <bar> <less> <Greek_ALPHA>     : "ᾍ"  U1f8d
+<Multi_key> <apostrophe> <less> <bar> <Greek_ALPHA>     : "ᾍ"  U1f8d
+<dead_iota> <dead_ogonek> <dead_acute> <Greek_ALPHA>    : "ᾍ"  U1f8d
+<dead_iota> <dead_dasia> <dead_acute> <Greek_ALPHA>    : "ᾍ"  U1f8d
+<dead_iota> <dead_acute> <dead_ogonek> <Greek_ALPHA>    : "ᾍ"  U1f8d
+<dead_iota> <dead_acute> <dead_dasia> <Greek_ALPHA>    : "ᾍ"  U1f8d
+<dead_ogonek> <dead_iota> <dead_acute> <Greek_ALPHA>    : "ᾍ"  U1f8d
+<dead_dasia> <dead_iota> <dead_acute> <Greek_ALPHA>    : "ᾍ"  U1f8d
+<dead_ogonek> <dead_acute> <dead_iota> <Greek_ALPHA>    : "ᾍ"  U1f8d
+<dead_dasia> <dead_acute> <dead_iota> <Greek_ALPHA>    : "ᾍ"  U1f8d
+<dead_acute> <dead_iota> <dead_ogonek> <Greek_ALPHA>    : "ᾍ"  U1f8d
+<dead_acute> <dead_iota> <dead_dasia> <Greek_ALPHA>    : "ᾍ"  U1f8d
+<dead_acute> <dead_ogonek> <dead_iota> <Greek_ALPHA>    : "ᾍ"  U1f8d
+<dead_acute> <dead_dasia> <dead_iota> <Greek_ALPHA>    : "ᾍ"  U1f8d
+<Multi_key> <bar> <greater> <asciitilde> <Greek_ALPHA>  : "ᾎ"  U1f8e
+<Multi_key> <bar> <asciitilde> <greater> <Greek_ALPHA>  : "ᾎ"  U1f8e
+<Multi_key> <greater> <bar> <asciitilde> <Greek_ALPHA>  : "ᾎ"  U1f8e
+<Multi_key> <greater> <asciitilde> <bar> <Greek_ALPHA>  : "ᾎ"  U1f8e
+<Multi_key> <asciitilde> <bar> <greater> <Greek_ALPHA>  : "ᾎ"  U1f8e
+<Multi_key> <asciitilde> <greater> <bar> <Greek_ALPHA>  : "ᾎ"  U1f8e
+<dead_iota> <dead_horn> <dead_tilde> <Greek_ALPHA>      : "ᾎ"  U1f8e
+<dead_iota> <dead_psili> <dead_tilde> <Greek_ALPHA>      : "ᾎ"  U1f8e
+<dead_iota> <dead_tilde> <dead_horn> <Greek_ALPHA>      : "ᾎ"  U1f8e
+<dead_iota> <dead_tilde> <dead_psili> <Greek_ALPHA>      : "ᾎ"  U1f8e
+<dead_horn> <dead_iota> <dead_tilde> <Greek_ALPHA>      : "ᾎ"  U1f8e
+<dead_psili> <dead_iota> <dead_tilde> <Greek_ALPHA>      : "ᾎ"  U1f8e
+<dead_horn> <dead_tilde> <dead_iota> <Greek_ALPHA>      : "ᾎ"  U1f8e
+<dead_psili> <dead_tilde> <dead_iota> <Greek_ALPHA>      : "ᾎ"  U1f8e
+<dead_tilde> <dead_iota> <dead_horn> <Greek_ALPHA>      : "ᾎ"  U1f8e
+<dead_tilde> <dead_iota> <dead_psili> <Greek_ALPHA>      : "ᾎ"  U1f8e
+<dead_tilde> <dead_horn> <dead_iota> <Greek_ALPHA>      : "ᾎ"  U1f8e
+<dead_tilde> <dead_psili> <dead_iota> <Greek_ALPHA>      : "ᾎ"  U1f8e
+<Multi_key> <bar> <less> <asciitilde> <Greek_ALPHA>     : "ᾏ"  U1f8f
+<Multi_key> <bar> <asciitilde> <less> <Greek_ALPHA>     : "ᾏ"  U1f8f
+<Multi_key> <less> <bar> <asciitilde> <Greek_ALPHA>     : "ᾏ"  U1f8f
+<Multi_key> <less> <asciitilde> <bar> <Greek_ALPHA>     : "ᾏ"  U1f8f
+<Multi_key> <asciitilde> <bar> <less> <Greek_ALPHA>     : "ᾏ"  U1f8f
+<Multi_key> <asciitilde> <less> <bar> <Greek_ALPHA>     : "ᾏ"  U1f8f
+<dead_iota> <dead_ogonek> <dead_tilde> <Greek_ALPHA>    : "ᾏ"  U1f8f
+<dead_iota> <dead_dasia> <dead_tilde> <Greek_ALPHA>    : "ᾏ"  U1f8f
+<dead_iota> <dead_tilde> <dead_ogonek> <Greek_ALPHA>    : "ᾏ"  U1f8f
+<dead_iota> <dead_tilde> <dead_dasia> <Greek_ALPHA>    : "ᾏ"  U1f8f
+<dead_ogonek> <dead_iota> <dead_tilde> <Greek_ALPHA>    : "ᾏ"  U1f8f
+<dead_dasia> <dead_iota> <dead_tilde> <Greek_ALPHA>    : "ᾏ"  U1f8f
+<dead_ogonek> <dead_tilde> <dead_iota> <Greek_ALPHA>    : "ᾏ"  U1f8f
+<dead_dasia> <dead_tilde> <dead_iota> <Greek_ALPHA>    : "ᾏ"  U1f8f
+<dead_tilde> <dead_iota> <dead_ogonek> <Greek_ALPHA>    : "ᾏ"  U1f8f
+<dead_tilde> <dead_iota> <dead_dasia> <Greek_ALPHA>    : "ᾏ"  U1f8f
+<dead_tilde> <dead_ogonek> <dead_iota> <Greek_ALPHA>    : "ᾏ"  U1f8f
+<dead_tilde> <dead_dasia> <dead_iota> <Greek_ALPHA>    : "ᾏ"  U1f8f
+<Multi_key> <bar> <greater> <Greek_eta>                 : "ᾐ"  U1f90
+<Multi_key> <greater> <bar> <Greek_eta>                 : "ᾐ"  U1f90
+<dead_iota> <dead_horn> <Greek_eta>                     : "ᾐ"  U1f90
+<dead_iota> <dead_psili> <Greek_eta>                     : "ᾐ"  U1f90
+<dead_horn> <dead_iota> <Greek_eta>                     : "ᾐ"  U1f90
+<dead_psili> <dead_iota> <Greek_eta>                     : "ᾐ"  U1f90
+<Multi_key> <bar> <less> <Greek_eta>                    : "ᾑ"  U1f91
+<Multi_key> <less> <bar> <Greek_eta>                    : "ᾑ"  U1f91
+<dead_iota> <dead_ogonek> <Greek_eta>                   : "ᾑ"  U1f91
+<dead_iota> <dead_dasia> <Greek_eta>                   : "ᾑ"  U1f91
+<dead_ogonek> <dead_iota> <Greek_eta>                   : "ᾑ"  U1f91
+<dead_dasia> <dead_iota> <Greek_eta>                   : "ᾑ"  U1f91
+<Multi_key> <bar> <greater> <grave> <Greek_eta>         : "ᾒ"  U1f92
+<Multi_key> <bar> <grave> <greater> <Greek_eta>         : "ᾒ"  U1f92
+<Multi_key> <greater> <bar> <grave> <Greek_eta>         : "ᾒ"  U1f92
+<Multi_key> <greater> <grave> <bar> <Greek_eta>         : "ᾒ"  U1f92
+<Multi_key> <grave> <bar> <greater> <Greek_eta>         : "ᾒ"  U1f92
+<Multi_key> <grave> <greater> <bar> <Greek_eta>         : "ᾒ"  U1f92
+<dead_iota> <dead_horn> <dead_grave> <Greek_eta>        : "ᾒ"  U1f92
+<dead_iota> <dead_psili> <dead_grave> <Greek_eta>        : "ᾒ"  U1f92
+<dead_iota> <dead_grave> <dead_horn> <Greek_eta>        : "ᾒ"  U1f92
+<dead_iota> <dead_grave> <dead_psili> <Greek_eta>        : "ᾒ"  U1f92
+<dead_horn> <dead_iota> <dead_grave> <Greek_eta>        : "ᾒ"  U1f92
+<dead_psili> <dead_iota> <dead_grave> <Greek_eta>        : "ᾒ"  U1f92
+<dead_horn> <dead_grave> <dead_iota> <Greek_eta>        : "ᾒ"  U1f92
+<dead_psili> <dead_grave> <dead_iota> <Greek_eta>        : "ᾒ"  U1f92
+<dead_grave> <dead_iota> <dead_horn> <Greek_eta>        : "ᾒ"  U1f92
+<dead_grave> <dead_iota> <dead_psili> <Greek_eta>        : "ᾒ"  U1f92
+<dead_grave> <dead_horn> <dead_iota> <Greek_eta>        : "ᾒ"  U1f92
+<dead_grave> <dead_psili> <dead_iota> <Greek_eta>        : "ᾒ"  U1f92
+<Multi_key> <bar> <less> <grave> <Greek_eta>            : "ᾓ"  U1f93
+<Multi_key> <bar> <grave> <less> <Greek_eta>            : "ᾓ"  U1f93
+<Multi_key> <less> <bar> <grave> <Greek_eta>            : "ᾓ"  U1f93
+<Multi_key> <less> <grave> <bar> <Greek_eta>            : "ᾓ"  U1f93
+<Multi_key> <grave> <bar> <less> <Greek_eta>            : "ᾓ"  U1f93
+<Multi_key> <grave> <less> <bar> <Greek_eta>            : "ᾓ"  U1f93
+<dead_iota> <dead_ogonek> <dead_grave> <Greek_eta>      : "ᾓ"  U1f93
+<dead_iota> <dead_dasia> <dead_grave> <Greek_eta>      : "ᾓ"  U1f93
+<dead_iota> <dead_grave> <dead_ogonek> <Greek_eta>      : "ᾓ"  U1f93
+<dead_iota> <dead_grave> <dead_dasia> <Greek_eta>      : "ᾓ"  U1f93
+<dead_ogonek> <dead_iota> <dead_grave> <Greek_eta>      : "ᾓ"  U1f93
+<dead_dasia> <dead_iota> <dead_grave> <Greek_eta>      : "ᾓ"  U1f93
+<dead_ogonek> <dead_grave> <dead_iota> <Greek_eta>      : "ᾓ"  U1f93
+<dead_dasia> <dead_grave> <dead_iota> <Greek_eta>      : "ᾓ"  U1f93
+<dead_grave> <dead_iota> <dead_ogonek> <Greek_eta>      : "ᾓ"  U1f93
+<dead_grave> <dead_iota> <dead_dasia> <Greek_eta>      : "ᾓ"  U1f93
+<dead_grave> <dead_ogonek> <dead_iota> <Greek_eta>      : "ᾓ"  U1f93
+<dead_grave> <dead_dasia> <dead_iota> <Greek_eta>      : "ᾓ"  U1f93
+<Multi_key> <bar> <greater> <apostrophe> <Greek_eta>    : "ᾔ"  U1f94
+<Multi_key> <bar> <apostrophe> <greater> <Greek_eta>    : "ᾔ"  U1f94
+<Multi_key> <greater> <bar> <apostrophe> <Greek_eta>    : "ᾔ"  U1f94
+<Multi_key> <greater> <apostrophe> <bar> <Greek_eta>    : "ᾔ"  U1f94
+<Multi_key> <apostrophe> <bar> <greater> <Greek_eta>    : "ᾔ"  U1f94
+<Multi_key> <apostrophe> <greater> <bar> <Greek_eta>    : "ᾔ"  U1f94
+<dead_iota> <dead_horn> <dead_acute> <Greek_eta>        : "ᾔ"  U1f94
+<dead_iota> <dead_psili> <dead_acute> <Greek_eta>        : "ᾔ"  U1f94
+<dead_iota> <dead_acute> <dead_horn> <Greek_eta>        : "ᾔ"  U1f94
+<dead_iota> <dead_acute> <dead_psili> <Greek_eta>        : "ᾔ"  U1f94
+<dead_horn> <dead_iota> <dead_acute> <Greek_eta>        : "ᾔ"  U1f94
+<dead_psili> <dead_iota> <dead_acute> <Greek_eta>        : "ᾔ"  U1f94
+<dead_horn> <dead_acute> <dead_iota> <Greek_eta>        : "ᾔ"  U1f94
+<dead_psili> <dead_acute> <dead_iota> <Greek_eta>        : "ᾔ"  U1f94
+<dead_acute> <dead_iota> <dead_horn> <Greek_eta>        : "ᾔ"  U1f94
+<dead_acute> <dead_iota> <dead_psili> <Greek_eta>        : "ᾔ"  U1f94
+<dead_acute> <dead_horn> <dead_iota> <Greek_eta>        : "ᾔ"  U1f94
+<dead_acute> <dead_psili> <dead_iota> <Greek_eta>        : "ᾔ"  U1f94
+<Multi_key> <bar> <less> <apostrophe> <Greek_eta>       : "ᾕ"  U1f95
+<Multi_key> <bar> <apostrophe> <less> <Greek_eta>       : "ᾕ"  U1f95
+<Multi_key> <less> <bar> <apostrophe> <Greek_eta>       : "ᾕ"  U1f95
+<Multi_key> <less> <apostrophe> <bar> <Greek_eta>       : "ᾕ"  U1f95
+<Multi_key> <apostrophe> <bar> <less> <Greek_eta>       : "ᾕ"  U1f95
+<Multi_key> <apostrophe> <less> <bar> <Greek_eta>       : "ᾕ"  U1f95
+<dead_iota> <dead_ogonek> <dead_acute> <Greek_eta>      : "ᾕ"  U1f95
+<dead_iota> <dead_dasia> <dead_acute> <Greek_eta>      : "ᾕ"  U1f95
+<dead_iota> <dead_acute> <dead_ogonek> <Greek_eta>      : "ᾕ"  U1f95
+<dead_iota> <dead_acute> <dead_dasia> <Greek_eta>      : "ᾕ"  U1f95
+<dead_ogonek> <dead_iota> <dead_acute> <Greek_eta>      : "ᾕ"  U1f95
+<dead_dasia> <dead_iota> <dead_acute> <Greek_eta>      : "ᾕ"  U1f95
+<dead_ogonek> <dead_acute> <dead_iota> <Greek_eta>      : "ᾕ"  U1f95
+<dead_dasia> <dead_acute> <dead_iota> <Greek_eta>      : "ᾕ"  U1f95
+<dead_acute> <dead_iota> <dead_ogonek> <Greek_eta>      : "ᾕ"  U1f95
+<dead_acute> <dead_iota> <dead_dasia> <Greek_eta>      : "ᾕ"  U1f95
+<dead_acute> <dead_ogonek> <dead_iota> <Greek_eta>      : "ᾕ"  U1f95
+<dead_acute> <dead_dasia> <dead_iota> <Greek_eta>      : "ᾕ"  U1f95
+<Multi_key> <bar> <greater> <asciitilde> <Greek_eta>    : "ᾖ"  U1f96
+<Multi_key> <bar> <asciitilde> <greater> <Greek_eta>    : "ᾖ"  U1f96
+<Multi_key> <greater> <bar> <asciitilde> <Greek_eta>    : "ᾖ"  U1f96
+<Multi_key> <greater> <asciitilde> <bar> <Greek_eta>    : "ᾖ"  U1f96
+<Multi_key> <asciitilde> <bar> <greater> <Greek_eta>    : "ᾖ"  U1f96
+<Multi_key> <asciitilde> <greater> <bar> <Greek_eta>    : "ᾖ"  U1f96
+<dead_iota> <dead_horn> <dead_tilde> <Greek_eta>        : "ᾖ"  U1f96
+<dead_iota> <dead_psili> <dead_tilde> <Greek_eta>        : "ᾖ"  U1f96
+<dead_iota> <dead_tilde> <dead_horn> <Greek_eta>        : "ᾖ"  U1f96
+<dead_iota> <dead_tilde> <dead_psili> <Greek_eta>        : "ᾖ"  U1f96
+<dead_horn> <dead_iota> <dead_tilde> <Greek_eta>        : "ᾖ"  U1f96
+<dead_psili> <dead_iota> <dead_tilde> <Greek_eta>        : "ᾖ"  U1f96
+<dead_horn> <dead_tilde> <dead_iota> <Greek_eta>        : "ᾖ"  U1f96
+<dead_psili> <dead_tilde> <dead_iota> <Greek_eta>        : "ᾖ"  U1f96
+<dead_tilde> <dead_iota> <dead_horn> <Greek_eta>        : "ᾖ"  U1f96
+<dead_tilde> <dead_iota> <dead_psili> <Greek_eta>        : "ᾖ"  U1f96
+<dead_tilde> <dead_horn> <dead_iota> <Greek_eta>        : "ᾖ"  U1f96
+<dead_tilde> <dead_psili> <dead_iota> <Greek_eta>        : "ᾖ"  U1f96
+<Multi_key> <bar> <less> <asciitilde> <Greek_eta>       : "ᾗ"  U1f97
+<Multi_key> <bar> <asciitilde> <less> <Greek_eta>       : "ᾗ"  U1f97
+<Multi_key> <less> <bar> <asciitilde> <Greek_eta>       : "ᾗ"  U1f97
+<Multi_key> <less> <asciitilde> <bar> <Greek_eta>       : "ᾗ"  U1f97
+<Multi_key> <asciitilde> <bar> <less> <Greek_eta>       : "ᾗ"  U1f97
+<Multi_key> <asciitilde> <less> <bar> <Greek_eta>       : "ᾗ"  U1f97
+<dead_iota> <dead_ogonek> <dead_tilde> <Greek_eta>      : "ᾗ"  U1f97
+<dead_iota> <dead_dasia> <dead_tilde> <Greek_eta>      : "ᾗ"  U1f97
+<dead_iota> <dead_tilde> <dead_ogonek> <Greek_eta>      : "ᾗ"  U1f97
+<dead_iota> <dead_tilde> <dead_dasia> <Greek_eta>      : "ᾗ"  U1f97
+<dead_ogonek> <dead_iota> <dead_tilde> <Greek_eta>      : "ᾗ"  U1f97
+<dead_dasia> <dead_iota> <dead_tilde> <Greek_eta>      : "ᾗ"  U1f97
+<dead_ogonek> <dead_tilde> <dead_iota> <Greek_eta>      : "ᾗ"  U1f97
+<dead_dasia> <dead_tilde> <dead_iota> <Greek_eta>      : "ᾗ"  U1f97
+<dead_tilde> <dead_iota> <dead_ogonek> <Greek_eta>      : "ᾗ"  U1f97
+<dead_tilde> <dead_iota> <dead_dasia> <Greek_eta>      : "ᾗ"  U1f97
+<dead_tilde> <dead_ogonek> <dead_iota> <Greek_eta>      : "ᾗ"  U1f97
+<dead_tilde> <dead_dasia> <dead_iota> <Greek_eta>      : "ᾗ"  U1f97
+<Multi_key> <bar> <greater> <Greek_ETA>                 : "ᾘ"  U1f98
+<Multi_key> <greater> <bar> <Greek_ETA>                 : "ᾘ"  U1f98
+<dead_iota> <dead_horn> <Greek_ETA>                     : "ᾘ"  U1f98
+<dead_iota> <dead_psili> <Greek_ETA>                     : "ᾘ"  U1f98
+<dead_horn> <dead_iota> <Greek_ETA>                     : "ᾘ"  U1f98
+<dead_psili> <dead_iota> <Greek_ETA>                     : "ᾘ"  U1f98
+<Multi_key> <bar> <less> <Greek_ETA>                    : "ᾙ"  U1f99
+<Multi_key> <less> <bar> <Greek_ETA>                    : "ᾙ"  U1f99
+<dead_iota> <dead_ogonek> <Greek_ETA>                   : "ᾙ"  U1f99
+<dead_iota> <dead_dasia> <Greek_ETA>                   : "ᾙ"  U1f99
+<dead_ogonek> <dead_iota> <Greek_ETA>                   : "ᾙ"  U1f99
+<dead_dasia> <dead_iota> <Greek_ETA>                   : "ᾙ"  U1f99
+<Multi_key> <bar> <greater> <grave> <Greek_ETA>         : "ᾚ"  U1f9a
+<Multi_key> <bar> <grave> <greater> <Greek_ETA>         : "ᾚ"  U1f9a
+<Multi_key> <greater> <bar> <grave> <Greek_ETA>         : "ᾚ"  U1f9a
+<Multi_key> <greater> <grave> <bar> <Greek_ETA>         : "ᾚ"  U1f9a
+<Multi_key> <grave> <bar> <greater> <Greek_ETA>         : "ᾚ"  U1f9a
+<Multi_key> <grave> <greater> <bar> <Greek_ETA>         : "ᾚ"  U1f9a
+<dead_iota> <dead_horn> <dead_grave> <Greek_ETA>        : "ᾚ"  U1f9a
+<dead_iota> <dead_psili> <dead_grave> <Greek_ETA>        : "ᾚ"  U1f9a
+<dead_iota> <dead_grave> <dead_horn> <Greek_ETA>        : "ᾚ"  U1f9a
+<dead_iota> <dead_grave> <dead_psili> <Greek_ETA>        : "ᾚ"  U1f9a
+<dead_horn> <dead_iota> <dead_grave> <Greek_ETA>        : "ᾚ"  U1f9a
+<dead_psili> <dead_iota> <dead_grave> <Greek_ETA>        : "ᾚ"  U1f9a
+<dead_horn> <dead_grave> <dead_iota> <Greek_ETA>        : "ᾚ"  U1f9a
+<dead_psili> <dead_grave> <dead_iota> <Greek_ETA>        : "ᾚ"  U1f9a
+<dead_grave> <dead_iota> <dead_horn> <Greek_ETA>        : "ᾚ"  U1f9a
+<dead_grave> <dead_iota> <dead_psili> <Greek_ETA>        : "ᾚ"  U1f9a
+<dead_grave> <dead_horn> <dead_iota> <Greek_ETA>        : "ᾚ"  U1f9a
+<dead_grave> <dead_psili> <dead_iota> <Greek_ETA>        : "ᾚ"  U1f9a
+<Multi_key> <bar> <less> <grave> <Greek_ETA>            : "ᾛ"  U1f9b
+<Multi_key> <bar> <grave> <less> <Greek_ETA>            : "ᾛ"  U1f9b
+<Multi_key> <less> <bar> <grave> <Greek_ETA>            : "ᾛ"  U1f9b
+<Multi_key> <less> <grave> <bar> <Greek_ETA>            : "ᾛ"  U1f9b
+<Multi_key> <grave> <bar> <less> <Greek_ETA>            : "ᾛ"  U1f9b
+<Multi_key> <grave> <less> <bar> <Greek_ETA>            : "ᾛ"  U1f9b
+<dead_iota> <dead_ogonek> <dead_grave> <Greek_ETA>      : "ᾛ"  U1f9b
+<dead_iota> <dead_dasia> <dead_grave> <Greek_ETA>      : "ᾛ"  U1f9b
+<dead_iota> <dead_grave> <dead_ogonek> <Greek_ETA>      : "ᾛ"  U1f9b
+<dead_iota> <dead_grave> <dead_dasia> <Greek_ETA>      : "ᾛ"  U1f9b
+<dead_ogonek> <dead_iota> <dead_grave> <Greek_ETA>      : "ᾛ"  U1f9b
+<dead_dasia> <dead_iota> <dead_grave> <Greek_ETA>      : "ᾛ"  U1f9b
+<dead_ogonek> <dead_grave> <dead_iota> <Greek_ETA>      : "ᾛ"  U1f9b
+<dead_dasia> <dead_grave> <dead_iota> <Greek_ETA>      : "ᾛ"  U1f9b
+<dead_grave> <dead_iota> <dead_ogonek> <Greek_ETA>      : "ᾛ"  U1f9b
+<dead_grave> <dead_iota> <dead_dasia> <Greek_ETA>      : "ᾛ"  U1f9b
+<dead_grave> <dead_ogonek> <dead_iota> <Greek_ETA>      : "ᾛ"  U1f9b
+<dead_grave> <dead_dasia> <dead_iota> <Greek_ETA>      : "ᾛ"  U1f9b
+<Multi_key> <bar> <greater> <apostrophe> <Greek_ETA>    : "ᾜ"  U1f9c
+<Multi_key> <bar> <apostrophe> <greater> <Greek_ETA>    : "ᾜ"  U1f9c
+<Multi_key> <greater> <bar> <apostrophe> <Greek_ETA>    : "ᾜ"  U1f9c
+<Multi_key> <greater> <apostrophe> <bar> <Greek_ETA>    : "ᾜ"  U1f9c
+<Multi_key> <apostrophe> <bar> <greater> <Greek_ETA>    : "ᾜ"  U1f9c
+<Multi_key> <apostrophe> <greater> <bar> <Greek_ETA>    : "ᾜ"  U1f9c
+<dead_iota> <dead_horn> <dead_acute> <Greek_ETA>        : "ᾜ"  U1f9c
+<dead_iota> <dead_psili> <dead_acute> <Greek_ETA>        : "ᾜ"  U1f9c
+<dead_iota> <dead_acute> <dead_horn> <Greek_ETA>        : "ᾜ"  U1f9c
+<dead_iota> <dead_acute> <dead_psili> <Greek_ETA>        : "ᾜ"  U1f9c
+<dead_horn> <dead_iota> <dead_acute> <Greek_ETA>        : "ᾜ"  U1f9c
+<dead_psili> <dead_iota> <dead_acute> <Greek_ETA>        : "ᾜ"  U1f9c
+<dead_horn> <dead_acute> <dead_iota> <Greek_ETA>        : "ᾜ"  U1f9c
+<dead_psili> <dead_acute> <dead_iota> <Greek_ETA>        : "ᾜ"  U1f9c
+<dead_acute> <dead_iota> <dead_horn> <Greek_ETA>        : "ᾜ"  U1f9c
+<dead_acute> <dead_iota> <dead_psili> <Greek_ETA>        : "ᾜ"  U1f9c
+<dead_acute> <dead_horn> <dead_iota> <Greek_ETA>        : "ᾜ"  U1f9c
+<dead_acute> <dead_psili> <dead_iota> <Greek_ETA>        : "ᾜ"  U1f9c
+<Multi_key> <bar> <less> <apostrophe> <Greek_ETA>       : "ᾝ"  U1f9d
+<Multi_key> <bar> <apostrophe> <less> <Greek_ETA>       : "ᾝ"  U1f9d
+<Multi_key> <less> <bar> <apostrophe> <Greek_ETA>       : "ᾝ"  U1f9d
+<Multi_key> <less> <apostrophe> <bar> <Greek_ETA>       : "ᾝ"  U1f9d
+<Multi_key> <apostrophe> <bar> <less> <Greek_ETA>       : "ᾝ"  U1f9d
+<Multi_key> <apostrophe> <less> <bar> <Greek_ETA>       : "ᾝ"  U1f9d
+<dead_iota> <dead_ogonek> <dead_acute> <Greek_ETA>      : "ᾝ"  U1f9d
+<dead_iota> <dead_dasia> <dead_acute> <Greek_ETA>      : "ᾝ"  U1f9d
+<dead_iota> <dead_acute> <dead_ogonek> <Greek_ETA>      : "ᾝ"  U1f9d
+<dead_iota> <dead_acute> <dead_dasia> <Greek_ETA>      : "ᾝ"  U1f9d
+<dead_ogonek> <dead_iota> <dead_acute> <Greek_ETA>      : "ᾝ"  U1f9d
+<dead_dasia> <dead_iota> <dead_acute> <Greek_ETA>      : "ᾝ"  U1f9d
+<dead_ogonek> <dead_acute> <dead_iota> <Greek_ETA>      : "ᾝ"  U1f9d
+<dead_dasia> <dead_acute> <dead_iota> <Greek_ETA>      : "ᾝ"  U1f9d
+<dead_acute> <dead_iota> <dead_ogonek> <Greek_ETA>      : "ᾝ"  U1f9d
+<dead_acute> <dead_iota> <dead_dasia> <Greek_ETA>      : "ᾝ"  U1f9d
+<dead_acute> <dead_ogonek> <dead_iota> <Greek_ETA>      : "ᾝ"  U1f9d
+<dead_acute> <dead_dasia> <dead_iota> <Greek_ETA>      : "ᾝ"  U1f9d
+<Multi_key> <bar> <greater> <asciitilde> <Greek_ETA>    : "ᾞ"  U1f9e
+<Multi_key> <bar> <asciitilde> <greater> <Greek_ETA>    : "ᾞ"  U1f9e
+<Multi_key> <greater> <bar> <asciitilde> <Greek_ETA>    : "ᾞ"  U1f9e
+<Multi_key> <greater> <asciitilde> <bar> <Greek_ETA>    : "ᾞ"  U1f9e
+<Multi_key> <asciitilde> <bar> <greater> <Greek_ETA>    : "ᾞ"  U1f9e
+<Multi_key> <asciitilde> <greater> <bar> <Greek_ETA>    : "ᾞ"  U1f9e
+<dead_iota> <dead_horn> <dead_tilde> <Greek_ETA>        : "ᾞ"  U1f9e
+<dead_iota> <dead_psili> <dead_tilde> <Greek_ETA>        : "ᾞ"  U1f9e
+<dead_iota> <dead_tilde> <dead_horn> <Greek_ETA>        : "ᾞ"  U1f9e
+<dead_iota> <dead_tilde> <dead_psili> <Greek_ETA>        : "ᾞ"  U1f9e
+<dead_horn> <dead_iota> <dead_tilde> <Greek_ETA>        : "ᾞ"  U1f9e
+<dead_psili> <dead_iota> <dead_tilde> <Greek_ETA>        : "ᾞ"  U1f9e
+<dead_horn> <dead_tilde> <dead_iota> <Greek_ETA>        : "ᾞ"  U1f9e
+<dead_psili> <dead_tilde> <dead_iota> <Greek_ETA>        : "ᾞ"  U1f9e
+<dead_tilde> <dead_iota> <dead_horn> <Greek_ETA>        : "ᾞ"  U1f9e
+<dead_tilde> <dead_iota> <dead_psili> <Greek_ETA>        : "ᾞ"  U1f9e
+<dead_tilde> <dead_horn> <dead_iota> <Greek_ETA>        : "ᾞ"  U1f9e
+<dead_tilde> <dead_psili> <dead_iota> <Greek_ETA>        : "ᾞ"  U1f9e
+<Multi_key> <bar> <less> <asciitilde> <Greek_ETA>       : "ᾟ"  U1f9f
+<Multi_key> <bar> <asciitilde> <less> <Greek_ETA>       : "ᾟ"  U1f9f
+<Multi_key> <less> <bar> <asciitilde> <Greek_ETA>       : "ᾟ"  U1f9f
+<Multi_key> <less> <asciitilde> <bar> <Greek_ETA>       : "ᾟ"  U1f9f
+<Multi_key> <asciitilde> <bar> <less> <Greek_ETA>       : "ᾟ"  U1f9f
+<Multi_key> <asciitilde> <less> <bar> <Greek_ETA>       : "ᾟ"  U1f9f
+<dead_iota> <dead_ogonek> <dead_tilde> <Greek_ETA>      : "ᾟ"  U1f9f
+<dead_iota> <dead_dasia> <dead_tilde> <Greek_ETA>      : "ᾟ"  U1f9f
+<dead_iota> <dead_tilde> <dead_ogonek> <Greek_ETA>      : "ᾟ"  U1f9f
+<dead_iota> <dead_tilde> <dead_dasia> <Greek_ETA>      : "ᾟ"  U1f9f
+<dead_ogonek> <dead_iota> <dead_tilde> <Greek_ETA>      : "ᾟ"  U1f9f
+<dead_dasia> <dead_iota> <dead_tilde> <Greek_ETA>      : "ᾟ"  U1f9f
+<dead_ogonek> <dead_tilde> <dead_iota> <Greek_ETA>      : "ᾟ"  U1f9f
+<dead_dasia> <dead_tilde> <dead_iota> <Greek_ETA>      : "ᾟ"  U1f9f
+<dead_tilde> <dead_iota> <dead_ogonek> <Greek_ETA>      : "ᾟ"  U1f9f
+<dead_tilde> <dead_iota> <dead_dasia> <Greek_ETA>      : "ᾟ"  U1f9f
+<dead_tilde> <dead_ogonek> <dead_iota> <Greek_ETA>      : "ᾟ"  U1f9f
+<dead_tilde> <dead_dasia> <dead_iota> <Greek_ETA>      : "ᾟ"  U1f9f
+<Multi_key> <bar> <greater> <Greek_omega>               : "ᾠ"  U1fa0
+<Multi_key> <greater> <bar> <Greek_omega>               : "ᾠ"  U1fa0
+<dead_iota> <dead_horn> <Greek_omega>                   : "ᾠ"  U1fa0
+<dead_iota> <dead_psili> <Greek_omega>                   : "ᾠ"  U1fa0
+<dead_horn> <dead_iota> <Greek_omega>                   : "ᾠ"  U1fa0
+<dead_psili> <dead_iota> <Greek_omega>                   : "ᾠ"  U1fa0
+<Multi_key> <bar> <less> <Greek_omega>                  : "ᾡ"  U1fa1
+<Multi_key> <less> <bar> <Greek_omega>                  : "ᾡ"  U1fa1
+<dead_iota> <dead_ogonek> <Greek_omega>                 : "ᾡ"  U1fa1
+<dead_iota> <dead_dasia> <Greek_omega>                 : "ᾡ"  U1fa1
+<dead_ogonek> <dead_iota> <Greek_omega>                 : "ᾡ"  U1fa1
+<dead_dasia> <dead_iota> <Greek_omega>                 : "ᾡ"  U1fa1
+<Multi_key> <bar> <greater> <grave> <Greek_omega>       : "ᾢ"  U1fa2
+<Multi_key> <bar> <grave> <greater> <Greek_omega>       : "ᾢ"  U1fa2
+<Multi_key> <greater> <bar> <grave> <Greek_omega>       : "ᾢ"  U1fa2
+<Multi_key> <greater> <grave> <bar> <Greek_omega>       : "ᾢ"  U1fa2
+<Multi_key> <grave> <bar> <greater> <Greek_omega>       : "ᾢ"  U1fa2
+<Multi_key> <grave> <greater> <bar> <Greek_omega>       : "ᾢ"  U1fa2
+<dead_iota> <dead_horn> <dead_grave> <Greek_omega>      : "ᾢ"  U1fa2
+<dead_iota> <dead_psili> <dead_grave> <Greek_omega>      : "ᾢ"  U1fa2
+<dead_iota> <dead_grave> <dead_horn> <Greek_omega>      : "ᾢ"  U1fa2
+<dead_iota> <dead_grave> <dead_psili> <Greek_omega>      : "ᾢ"  U1fa2
+<dead_horn> <dead_iota> <dead_grave> <Greek_omega>      : "ᾢ"  U1fa2
+<dead_psili> <dead_iota> <dead_grave> <Greek_omega>      : "ᾢ"  U1fa2
+<dead_horn> <dead_grave> <dead_iota> <Greek_omega>      : "ᾢ"  U1fa2
+<dead_psili> <dead_grave> <dead_iota> <Greek_omega>      : "ᾢ"  U1fa2
+<dead_grave> <dead_iota> <dead_horn> <Greek_omega>      : "ᾢ"  U1fa2
+<dead_grave> <dead_iota> <dead_psili> <Greek_omega>      : "ᾢ"  U1fa2
+<dead_grave> <dead_horn> <dead_iota> <Greek_omega>      : "ᾢ"  U1fa2
+<dead_grave> <dead_psili> <dead_iota> <Greek_omega>      : "ᾢ"  U1fa2
+<Multi_key> <bar> <less> <grave> <Greek_omega>          : "ᾣ"  U1fa3
+<Multi_key> <bar> <grave> <less> <Greek_omega>          : "ᾣ"  U1fa3
+<Multi_key> <less> <bar> <grave> <Greek_omega>          : "ᾣ"  U1fa3
+<Multi_key> <less> <grave> <bar> <Greek_omega>          : "ᾣ"  U1fa3
+<Multi_key> <grave> <bar> <less> <Greek_omega>          : "ᾣ"  U1fa3
+<Multi_key> <grave> <less> <bar> <Greek_omega>          : "ᾣ"  U1fa3
+<dead_iota> <dead_ogonek> <dead_grave> <Greek_omega>    : "ᾣ"  U1fa3
+<dead_iota> <dead_dasia> <dead_grave> <Greek_omega>    : "ᾣ"  U1fa3
+<dead_iota> <dead_grave> <dead_ogonek> <Greek_omega>    : "ᾣ"  U1fa3
+<dead_iota> <dead_grave> <dead_dasia> <Greek_omega>    : "ᾣ"  U1fa3
+<dead_ogonek> <dead_iota> <dead_grave> <Greek_omega>    : "ᾣ"  U1fa3
+<dead_dasia> <dead_iota> <dead_grave> <Greek_omega>    : "ᾣ"  U1fa3
+<dead_ogonek> <dead_grave> <dead_iota> <Greek_omega>    : "ᾣ"  U1fa3
+<dead_dasia> <dead_grave> <dead_iota> <Greek_omega>    : "ᾣ"  U1fa3
+<dead_grave> <dead_iota> <dead_ogonek> <Greek_omega>    : "ᾣ"  U1fa3
+<dead_grave> <dead_iota> <dead_dasia> <Greek_omega>    : "ᾣ"  U1fa3
+<dead_grave> <dead_ogonek> <dead_iota> <Greek_omega>    : "ᾣ"  U1fa3
+<dead_grave> <dead_dasia> <dead_iota> <Greek_omega>    : "ᾣ"  U1fa3
+<Multi_key> <bar> <greater> <apostrophe> <Greek_omega>  : "ᾤ"  U1fa4
+<Multi_key> <bar> <apostrophe> <greater> <Greek_omega>  : "ᾤ"  U1fa4
+<Multi_key> <greater> <bar> <apostrophe> <Greek_omega>  : "ᾤ"  U1fa4
+<Multi_key> <greater> <apostrophe> <bar> <Greek_omega>  : "ᾤ"  U1fa4
+<Multi_key> <apostrophe> <bar> <greater> <Greek_omega>  : "ᾤ"  U1fa4
+<Multi_key> <apostrophe> <greater> <bar> <Greek_omega>  : "ᾤ"  U1fa4
+<dead_iota> <dead_horn> <dead_acute> <Greek_omega>      : "ᾤ"  U1fa4
+<dead_iota> <dead_psili> <dead_acute> <Greek_omega>      : "ᾤ"  U1fa4
+<dead_iota> <dead_acute> <dead_horn> <Greek_omega>      : "ᾤ"  U1fa4
+<dead_iota> <dead_acute> <dead_psili> <Greek_omega>      : "ᾤ"  U1fa4
+<dead_horn> <dead_iota> <dead_acute> <Greek_omega>      : "ᾤ"  U1fa4
+<dead_psili> <dead_iota> <dead_acute> <Greek_omega>      : "ᾤ"  U1fa4
+<dead_horn> <dead_acute> <dead_iota> <Greek_omega>      : "ᾤ"  U1fa4
+<dead_psili> <dead_acute> <dead_iota> <Greek_omega>      : "ᾤ"  U1fa4
+<dead_acute> <dead_iota> <dead_horn> <Greek_omega>      : "ᾤ"  U1fa4
+<dead_acute> <dead_iota> <dead_psili> <Greek_omega>      : "ᾤ"  U1fa4
+<dead_acute> <dead_horn> <dead_iota> <Greek_omega>      : "ᾤ"  U1fa4
+<dead_acute> <dead_psili> <dead_iota> <Greek_omega>      : "ᾤ"  U1fa4
+<Multi_key> <bar> <less> <apostrophe> <Greek_omega>     : "ᾥ"  U1fa5
+<Multi_key> <bar> <apostrophe> <less> <Greek_omega>     : "ᾥ"  U1fa5
+<Multi_key> <less> <bar> <apostrophe> <Greek_omega>     : "ᾥ"  U1fa5
+<Multi_key> <less> <apostrophe> <bar> <Greek_omega>     : "ᾥ"  U1fa5
+<Multi_key> <apostrophe> <bar> <less> <Greek_omega>     : "ᾥ"  U1fa5
+<Multi_key> <apostrophe> <less> <bar> <Greek_omega>     : "ᾥ"  U1fa5
+<dead_iota> <dead_ogonek> <dead_acute> <Greek_omega>    : "ᾥ"  U1fa5
+<dead_iota> <dead_dasia> <dead_acute> <Greek_omega>    : "ᾥ"  U1fa5
+<dead_iota> <dead_acute> <dead_ogonek> <Greek_omega>    : "ᾥ"  U1fa5
+<dead_iota> <dead_acute> <dead_dasia> <Greek_omega>    : "ᾥ"  U1fa5
+<dead_ogonek> <dead_iota> <dead_acute> <Greek_omega>    : "ᾥ"  U1fa5
+<dead_dasia> <dead_iota> <dead_acute> <Greek_omega>    : "ᾥ"  U1fa5
+<dead_ogonek> <dead_acute> <dead_iota> <Greek_omega>    : "ᾥ"  U1fa5
+<dead_dasia> <dead_acute> <dead_iota> <Greek_omega>    : "ᾥ"  U1fa5
+<dead_acute> <dead_iota> <dead_ogonek> <Greek_omega>    : "ᾥ"  U1fa5
+<dead_acute> <dead_iota> <dead_dasia> <Greek_omega>    : "ᾥ"  U1fa5
+<dead_acute> <dead_ogonek> <dead_iota> <Greek_omega>    : "ᾥ"  U1fa5
+<dead_acute> <dead_dasia> <dead_iota> <Greek_omega>    : "ᾥ"  U1fa5
+<Multi_key> <bar> <greater> <asciitilde> <Greek_omega>  : "ᾦ"  U1fa6
+<Multi_key> <bar> <asciitilde> <greater> <Greek_omega>  : "ᾦ"  U1fa6
+<Multi_key> <greater> <bar> <asciitilde> <Greek_omega>  : "ᾦ"  U1fa6
+<Multi_key> <greater> <asciitilde> <bar> <Greek_omega>  : "ᾦ"  U1fa6
+<Multi_key> <asciitilde> <bar> <greater> <Greek_omega>  : "ᾦ"  U1fa6
+<Multi_key> <asciitilde> <greater> <bar> <Greek_omega>  : "ᾦ"  U1fa6
+<dead_iota> <dead_horn> <dead_tilde> <Greek_omega>      : "ᾦ"  U1fa6
+<dead_iota> <dead_psili> <dead_tilde> <Greek_omega>      : "ᾦ"  U1fa6
+<dead_iota> <dead_tilde> <dead_horn> <Greek_omega>      : "ᾦ"  U1fa6
+<dead_iota> <dead_tilde> <dead_psili> <Greek_omega>      : "ᾦ"  U1fa6
+<dead_horn> <dead_iota> <dead_tilde> <Greek_omega>      : "ᾦ"  U1fa6
+<dead_psili> <dead_iota> <dead_tilde> <Greek_omega>      : "ᾦ"  U1fa6
+<dead_horn> <dead_tilde> <dead_iota> <Greek_omega>      : "ᾦ"  U1fa6
+<dead_psili> <dead_tilde> <dead_iota> <Greek_omega>      : "ᾦ"  U1fa6
+<dead_tilde> <dead_iota> <dead_horn> <Greek_omega>      : "ᾦ"  U1fa6
+<dead_tilde> <dead_iota> <dead_psili> <Greek_omega>      : "ᾦ"  U1fa6
+<dead_tilde> <dead_horn> <dead_iota> <Greek_omega>      : "ᾦ"  U1fa6
+<dead_tilde> <dead_psili> <dead_iota> <Greek_omega>      : "ᾦ"  U1fa6
+<Multi_key> <bar> <less> <asciitilde> <Greek_omega>     : "ᾧ"  U1fa7
+<Multi_key> <bar> <asciitilde> <less> <Greek_omega>     : "ᾧ"  U1fa7
+<Multi_key> <less> <bar> <asciitilde> <Greek_omega>     : "ᾧ"  U1fa7
+<Multi_key> <less> <asciitilde> <bar> <Greek_omega>     : "ᾧ"  U1fa7
+<Multi_key> <asciitilde> <bar> <less> <Greek_omega>     : "ᾧ"  U1fa7
+<Multi_key> <asciitilde> <less> <bar> <Greek_omega>     : "ᾧ"  U1fa7
+<dead_iota> <dead_ogonek> <dead_tilde> <Greek_omega>    : "ᾧ"  U1fa7
+<dead_iota> <dead_dasia> <dead_tilde> <Greek_omega>    : "ᾧ"  U1fa7
+<dead_iota> <dead_tilde> <dead_ogonek> <Greek_omega>    : "ᾧ"  U1fa7
+<dead_iota> <dead_tilde> <dead_dasia> <Greek_omega>    : "ᾧ"  U1fa7
+<dead_ogonek> <dead_iota> <dead_tilde> <Greek_omega>    : "ᾧ"  U1fa7
+<dead_dasia> <dead_iota> <dead_tilde> <Greek_omega>    : "ᾧ"  U1fa7
+<dead_ogonek> <dead_tilde> <dead_iota> <Greek_omega>    : "ᾧ"  U1fa7
+<dead_dasia> <dead_tilde> <dead_iota> <Greek_omega>    : "ᾧ"  U1fa7
+<dead_tilde> <dead_iota> <dead_ogonek> <Greek_omega>    : "ᾧ"  U1fa7
+<dead_tilde> <dead_iota> <dead_dasia> <Greek_omega>    : "ᾧ"  U1fa7
+<dead_tilde> <dead_ogonek> <dead_iota> <Greek_omega>    : "ᾧ"  U1fa7
+<dead_tilde> <dead_dasia> <dead_iota> <Greek_omega>    : "ᾧ"  U1fa7
+<Multi_key> <bar> <greater> <Greek_OMEGA>               : "ᾨ"  U1fa8
+<Multi_key> <greater> <bar> <Greek_OMEGA>               : "ᾨ"  U1fa8
+<dead_iota> <dead_horn> <Greek_OMEGA>                   : "ᾨ"  U1fa8
+<dead_iota> <dead_psili> <Greek_OMEGA>                   : "ᾨ"  U1fa8
+<dead_horn> <dead_iota> <Greek_OMEGA>                   : "ᾨ"  U1fa8
+<dead_psili> <dead_iota> <Greek_OMEGA>                   : "ᾨ"  U1fa8
+<Multi_key> <bar> <less> <Greek_OMEGA>                  : "ᾩ"  U1fa9
+<Multi_key> <less> <bar> <Greek_OMEGA>                  : "ᾩ"  U1fa9
+<dead_iota> <dead_ogonek> <Greek_OMEGA>                 : "ᾩ"  U1fa9
+<dead_iota> <dead_dasia> <Greek_OMEGA>                 : "ᾩ"  U1fa9
+<dead_ogonek> <dead_iota> <Greek_OMEGA>                 : "ᾩ"  U1fa9
+<dead_dasia> <dead_iota> <Greek_OMEGA>                 : "ᾩ"  U1fa9
+<Multi_key> <bar> <greater> <grave> <Greek_OMEGA>       : "ᾪ"  U1faa
+<Multi_key> <bar> <grave> <greater> <Greek_OMEGA>       : "ᾪ"  U1faa
+<Multi_key> <greater> <bar> <grave> <Greek_OMEGA>       : "ᾪ"  U1faa
+<Multi_key> <greater> <grave> <bar> <Greek_OMEGA>       : "ᾪ"  U1faa
+<Multi_key> <grave> <bar> <greater> <Greek_OMEGA>       : "ᾪ"  U1faa
+<Multi_key> <grave> <greater> <bar> <Greek_OMEGA>       : "ᾪ"  U1faa
+<dead_iota> <dead_horn> <dead_grave> <Greek_OMEGA>      : "ᾪ"  U1faa
+<dead_iota> <dead_psili> <dead_grave> <Greek_OMEGA>      : "ᾪ"  U1faa
+<dead_iota> <dead_grave> <dead_horn> <Greek_OMEGA>      : "ᾪ"  U1faa
+<dead_iota> <dead_grave> <dead_psili> <Greek_OMEGA>      : "ᾪ"  U1faa
+<dead_horn> <dead_iota> <dead_grave> <Greek_OMEGA>      : "ᾪ"  U1faa
+<dead_psili> <dead_iota> <dead_grave> <Greek_OMEGA>      : "ᾪ"  U1faa
+<dead_horn> <dead_grave> <dead_iota> <Greek_OMEGA>      : "ᾪ"  U1faa
+<dead_psili> <dead_grave> <dead_iota> <Greek_OMEGA>      : "ᾪ"  U1faa
+<dead_grave> <dead_iota> <dead_horn> <Greek_OMEGA>      : "ᾪ"  U1faa
+<dead_grave> <dead_iota> <dead_psili> <Greek_OMEGA>      : "ᾪ"  U1faa
+<dead_grave> <dead_horn> <dead_iota> <Greek_OMEGA>      : "ᾪ"  U1faa
+<dead_grave> <dead_psili> <dead_iota> <Greek_OMEGA>      : "ᾪ"  U1faa
+<Multi_key> <bar> <less> <grave> <Greek_OMEGA>          : "ᾫ"  U1fab
+<Multi_key> <bar> <grave> <less> <Greek_OMEGA>          : "ᾫ"  U1fab
+<Multi_key> <less> <bar> <grave> <Greek_OMEGA>          : "ᾫ"  U1fab
+<Multi_key> <less> <grave> <bar> <Greek_OMEGA>          : "ᾫ"  U1fab
+<Multi_key> <grave> <bar> <less> <Greek_OMEGA>          : "ᾫ"  U1fab
+<Multi_key> <grave> <less> <bar> <Greek_OMEGA>          : "ᾫ"  U1fab
+<dead_iota> <dead_ogonek> <dead_grave> <Greek_OMEGA>    : "ᾫ"  U1fab
+<dead_iota> <dead_dasia> <dead_grave> <Greek_OMEGA>    : "ᾫ"  U1fab
+<dead_iota> <dead_grave> <dead_ogonek> <Greek_OMEGA>    : "ᾫ"  U1fab
+<dead_iota> <dead_grave> <dead_dasia> <Greek_OMEGA>    : "ᾫ"  U1fab
+<dead_ogonek> <dead_iota> <dead_grave> <Greek_OMEGA>    : "ᾫ"  U1fab
+<dead_dasia> <dead_iota> <dead_grave> <Greek_OMEGA>    : "ᾫ"  U1fab
+<dead_ogonek> <dead_grave> <dead_iota> <Greek_OMEGA>    : "ᾫ"  U1fab
+<dead_dasia> <dead_grave> <dead_iota> <Greek_OMEGA>    : "ᾫ"  U1fab
+<dead_grave> <dead_iota> <dead_ogonek> <Greek_OMEGA>    : "ᾫ"  U1fab
+<dead_grave> <dead_iota> <dead_dasia> <Greek_OMEGA>    : "ᾫ"  U1fab
+<dead_grave> <dead_ogonek> <dead_iota> <Greek_OMEGA>    : "ᾫ"  U1fab
+<dead_grave> <dead_dasia> <dead_iota> <Greek_OMEGA>    : "ᾫ"  U1fab
+<Multi_key> <bar> <greater> <apostrophe> <Greek_OMEGA>  : "ᾬ"  U1fac
+<Multi_key> <bar> <apostrophe> <greater> <Greek_OMEGA>  : "ᾬ"  U1fac
+<Multi_key> <greater> <bar> <apostrophe> <Greek_OMEGA>  : "ᾬ"  U1fac
+<Multi_key> <greater> <apostrophe> <bar> <Greek_OMEGA>  : "ᾬ"  U1fac
+<Multi_key> <apostrophe> <bar> <greater> <Greek_OMEGA>  : "ᾬ"  U1fac
+<Multi_key> <apostrophe> <greater> <bar> <Greek_OMEGA>  : "ᾬ"  U1fac
+<dead_iota> <dead_horn> <dead_acute> <Greek_OMEGA>      : "ᾬ"  U1fac
+<dead_iota> <dead_psili> <dead_acute> <Greek_OMEGA>      : "ᾬ"  U1fac
+<dead_iota> <dead_acute> <dead_horn> <Greek_OMEGA>      : "ᾬ"  U1fac
+<dead_iota> <dead_acute> <dead_psili> <Greek_OMEGA>      : "ᾬ"  U1fac
+<dead_horn> <dead_iota> <dead_acute> <Greek_OMEGA>      : "ᾬ"  U1fac
+<dead_psili> <dead_iota> <dead_acute> <Greek_OMEGA>      : "ᾬ"  U1fac
+<dead_horn> <dead_acute> <dead_iota> <Greek_OMEGA>      : "ᾬ"  U1fac
+<dead_psili> <dead_acute> <dead_iota> <Greek_OMEGA>      : "ᾬ"  U1fac
+<dead_acute> <dead_iota> <dead_horn> <Greek_OMEGA>      : "ᾬ"  U1fac
+<dead_acute> <dead_iota> <dead_psili> <Greek_OMEGA>      : "ᾬ"  U1fac
+<dead_acute> <dead_horn> <dead_iota> <Greek_OMEGA>      : "ᾬ"  U1fac
+<dead_acute> <dead_psili> <dead_iota> <Greek_OMEGA>      : "ᾬ"  U1fac
+<Multi_key> <bar> <less> <apostrophe> <Greek_OMEGA>     : "ᾭ"  U1fad
+<Multi_key> <bar> <apostrophe> <less> <Greek_OMEGA>     : "ᾭ"  U1fad
+<Multi_key> <less> <bar> <apostrophe> <Greek_OMEGA>     : "ᾭ"  U1fad
+<Multi_key> <less> <apostrophe> <bar> <Greek_OMEGA>     : "ᾭ"  U1fad
+<Multi_key> <apostrophe> <bar> <less> <Greek_OMEGA>     : "ᾭ"  U1fad
+<Multi_key> <apostrophe> <less> <bar> <Greek_OMEGA>     : "ᾭ"  U1fad
+<dead_iota> <dead_ogonek> <dead_acute> <Greek_OMEGA>    : "ᾭ"  U1fad
+<dead_iota> <dead_dasia> <dead_acute> <Greek_OMEGA>    : "ᾭ"  U1fad
+<dead_iota> <dead_acute> <dead_ogonek> <Greek_OMEGA>    : "ᾭ"  U1fad
+<dead_iota> <dead_acute> <dead_dasia> <Greek_OMEGA>    : "ᾭ"  U1fad
+<dead_ogonek> <dead_iota> <dead_acute> <Greek_OMEGA>    : "ᾭ"  U1fad
+<dead_dasia> <dead_iota> <dead_acute> <Greek_OMEGA>    : "ᾭ"  U1fad
+<dead_ogonek> <dead_acute> <dead_iota> <Greek_OMEGA>    : "ᾭ"  U1fad
+<dead_dasia> <dead_acute> <dead_iota> <Greek_OMEGA>    : "ᾭ"  U1fad
+<dead_acute> <dead_iota> <dead_ogonek> <Greek_OMEGA>    : "ᾭ"  U1fad
+<dead_acute> <dead_iota> <dead_dasia> <Greek_OMEGA>    : "ᾭ"  U1fad
+<dead_acute> <dead_ogonek> <dead_iota> <Greek_OMEGA>    : "ᾭ"  U1fad
+<dead_acute> <dead_dasia> <dead_iota> <Greek_OMEGA>    : "ᾭ"  U1fad
+<Multi_key> <bar> <greater> <asciitilde> <Greek_OMEGA>  : "ᾮ"  U1fae
+<Multi_key> <bar> <asciitilde> <greater> <Greek_OMEGA>  : "ᾮ"  U1fae
+<Multi_key> <greater> <bar> <asciitilde> <Greek_OMEGA>  : "ᾮ"  U1fae
+<Multi_key> <greater> <asciitilde> <bar> <Greek_OMEGA>  : "ᾮ"  U1fae
+<Multi_key> <asciitilde> <bar> <greater> <Greek_OMEGA>  : "ᾮ"  U1fae
+<Multi_key> <asciitilde> <greater> <bar> <Greek_OMEGA>  : "ᾮ"  U1fae
+<dead_iota> <dead_horn> <dead_tilde> <Greek_OMEGA>      : "ᾮ"  U1fae
+<dead_iota> <dead_psili> <dead_tilde> <Greek_OMEGA>      : "ᾮ"  U1fae
+<dead_iota> <dead_tilde> <dead_horn> <Greek_OMEGA>      : "ᾮ"  U1fae
+<dead_iota> <dead_tilde> <dead_psili> <Greek_OMEGA>      : "ᾮ"  U1fae
+<dead_horn> <dead_iota> <dead_tilde> <Greek_OMEGA>      : "ᾮ"  U1fae
+<dead_psili> <dead_iota> <dead_tilde> <Greek_OMEGA>      : "ᾮ"  U1fae
+<dead_horn> <dead_tilde> <dead_iota> <Greek_OMEGA>      : "ᾮ"  U1fae
+<dead_psili> <dead_tilde> <dead_iota> <Greek_OMEGA>      : "ᾮ"  U1fae
+<dead_tilde> <dead_iota> <dead_horn> <Greek_OMEGA>      : "ᾮ"  U1fae
+<dead_tilde> <dead_iota> <dead_psili> <Greek_OMEGA>      : "ᾮ"  U1fae
+<dead_tilde> <dead_horn> <dead_iota> <Greek_OMEGA>      : "ᾮ"  U1fae
+<dead_tilde> <dead_psili> <dead_iota> <Greek_OMEGA>      : "ᾮ"  U1fae
+<Multi_key> <bar> <less> <asciitilde> <Greek_OMEGA>     : "ᾯ"  U1faf
+<Multi_key> <bar> <asciitilde> <less> <Greek_OMEGA>     : "ᾯ"  U1faf
+<Multi_key> <less> <bar> <asciitilde> <Greek_OMEGA>     : "ᾯ"  U1faf
+<Multi_key> <less> <asciitilde> <bar> <Greek_OMEGA>     : "ᾯ"  U1faf
+<Multi_key> <asciitilde> <bar> <less> <Greek_OMEGA>     : "ᾯ"  U1faf
+<Multi_key> <asciitilde> <less> <bar> <Greek_OMEGA>     : "ᾯ"  U1faf
+<dead_iota> <dead_ogonek> <dead_tilde> <Greek_OMEGA>    : "ᾯ"  U1faf
+<dead_iota> <dead_dasia> <dead_tilde> <Greek_OMEGA>    : "ᾯ"  U1faf
+<dead_iota> <dead_tilde> <dead_ogonek> <Greek_OMEGA>    : "ᾯ"  U1faf
+<dead_iota> <dead_tilde> <dead_dasia> <Greek_OMEGA>    : "ᾯ"  U1faf
+<dead_ogonek> <dead_iota> <dead_tilde> <Greek_OMEGA>    : "ᾯ"  U1faf
+<dead_dasia> <dead_iota> <dead_tilde> <Greek_OMEGA>    : "ᾯ"  U1faf
+<dead_ogonek> <dead_tilde> <dead_iota> <Greek_OMEGA>    : "ᾯ"  U1faf
+<dead_dasia> <dead_tilde> <dead_iota> <Greek_OMEGA>    : "ᾯ"  U1faf
+<dead_tilde> <dead_iota> <dead_ogonek> <Greek_OMEGA>    : "ᾯ"  U1faf
+<dead_tilde> <dead_iota> <dead_dasia> <Greek_OMEGA>    : "ᾯ"  U1faf
+<dead_tilde> <dead_ogonek> <dead_iota> <Greek_OMEGA>    : "ᾯ"  U1faf
+<dead_tilde> <dead_dasia> <dead_iota> <Greek_OMEGA>    : "ᾯ"  U1faf
+<dead_breve> <Greek_alpha>                              : "ᾰ"  U1fb0
+<dead_macron> <Greek_alpha>                             : "ᾱ"  U1fb1
+<dead_breve> <Greek_ALPHA>                              : "Ᾰ"  U1fb8
+<dead_macron> <Greek_ALPHA>                             : "Ᾱ"  U1fb9
+<dead_breve> <Greek_iota>                               : "ῐ"  U1fd0
+<dead_macron> <Greek_iota>                              : "ῑ"  U1fd1
+<dead_breve> <Greek_IOTA>                               : "Ῐ"  U1fd8
+<dead_macron> <Greek_IOTA>                              : "Ῑ"  U1fd9
+<dead_breve> <Greek_upsilon>                            : "ῠ"  U1fe0
+<dead_macron> <Greek_upsilon>                           : "ῡ"  U1fe1
+<dead_breve> <Greek_UPSILON>                            : "Ῠ"  U1fe8
+<dead_macron> <Greek_UPSILON>                           : "Ῡ"  U1fe9
+<Multi_key> <grave> <Greek_ALPHA>                       : "Ὰ"  U1fba
+<dead_grave> <Greek_ALPHA>                              : "Ὰ"  U1fba
+<Multi_key> <grave> <Greek_EPSILON>                     : "Ὲ"  U1fc8
+<dead_grave> <Greek_EPSILON>                            : "Ὲ"  U1fc8
+<Multi_key> <grave> <Greek_ETA>                         : "Ὴ"  U1fca
+<dead_grave> <Greek_ETA>                                : "Ὴ"  U1fca
+<Multi_key> <grave> <Greek_IOTA>                        : "Ὶ"  U1fda
+<dead_grave> <Greek_IOTA>                               : "Ὶ"  U1fda
+<Multi_key> <grave> <Greek_UPSILON>                     : "Ὺ"  U1fea
+<dead_grave> <Greek_UPSILON>                            : "Ὺ"  U1fea
+<Multi_key> <grave> <Greek_OMICRON>                     : "Ὸ"  U1ff8
+<dead_grave> <Greek_OMICRON>                            : "Ὸ"  U1ff8
+<Multi_key> <grave> <Greek_OMEGA>                       : "Ὼ"  U1ffa
+<dead_grave> <Greek_OMEGA>                              : "Ὼ"  U1ffa
+<Multi_key> <bar> <grave> <Greek_alpha>                 : "ᾲ"  U1fb2
+<Multi_key> <grave> <bar> <Greek_alpha>                 : "ᾲ"  U1fb2
+<dead_iota> <dead_grave> <Greek_alpha>                  : "ᾲ"  U1fb2
+<dead_grave> <dead_iota> <Greek_alpha>                  : "ᾲ"  U1fb2
+<Multi_key> <bar> <Greek_alpha>                         : "ᾳ"  U1fb3
+<dead_iota> <Greek_alpha>                               : "ᾳ"  U1fb3
+<Multi_key> <bar> <apostrophe> <Greek_alpha>            : "ᾴ"  U1fb4
+<Multi_key> <apostrophe> <bar> <Greek_alpha>            : "ᾴ"  U1fb4
+<dead_iota> <dead_acute> <Greek_alpha>                  : "ᾴ"  U1fb4
+<dead_acute> <dead_iota> <Greek_alpha>                  : "ᾴ"  U1fb4
+<Multi_key> <asciitilde> <Greek_alpha>                  : "ᾶ"  U1fb6
+<dead_tilde> <Greek_alpha>                              : "ᾶ"  U1fb6
+<Multi_key> <bar> <asciitilde> <Greek_alpha>            : "ᾷ"  U1fb7
+<Multi_key> <asciitilde> <bar> <Greek_alpha>            : "ᾷ"  U1fb7
+<dead_iota> <dead_tilde> <Greek_alpha>                  : "ᾷ"  U1fb7
+<dead_tilde> <dead_iota> <Greek_alpha>                  : "ᾷ"  U1fb7
+<Multi_key> <bar> <grave> <Greek_eta>                   : "ῂ"  U1fc2
+<Multi_key> <grave> <bar> <Greek_eta>                   : "ῂ"  U1fc2
+<dead_iota> <dead_grave> <Greek_eta>                    : "ῂ"  U1fc2
+<dead_grave> <dead_iota> <Greek_eta>                    : "ῂ"  U1fc2
+<Multi_key> <bar> <Greek_eta>                           : "ῃ"  U1fc3
+<dead_iota> <Greek_eta>                                 : "ῃ"  U1fc3
+<Multi_key> <bar> <apostrophe> <Greek_eta>              : "ῄ"  U1fc4
+<Multi_key> <apostrophe> <bar> <Greek_eta>              : "ῄ"  U1fc4
+<dead_iota> <dead_acute> <Greek_eta>                    : "ῄ"  U1fc4
+<dead_acute> <dead_iota> <Greek_eta>                    : "ῄ"  U1fc4
+<Multi_key> <asciitilde> <Greek_eta>                    : "ῆ"  U1fc6
+<dead_tilde> <Greek_eta>                                : "ῆ"  U1fc6
+<Multi_key> <bar> <asciitilde> <Greek_eta>              : "ῇ"  U1fc7
+<Multi_key> <asciitilde> <bar> <Greek_eta>              : "ῇ"  U1fc7
+<dead_iota> <dead_tilde> <Greek_eta>                    : "ῇ"  U1fc7
+<dead_tilde> <dead_iota> <Greek_eta>                    : "ῇ"  U1fc7
+<Multi_key> <quotedbl> <grave> <Greek_iota>             : "ῒ"  U1fd2
+<Multi_key> <grave> <quotedbl> <Greek_iota>             : "ῒ"  U1fd2
+<dead_diaeresis> <dead_grave> <Greek_iota>              : "ῒ"  U1fd2
+<dead_grave> <dead_diaeresis> <Greek_iota>              : "ῒ"  U1fd2
+<Multi_key> <asciitilde> <Greek_iota>                   : "ῖ"  U1fd6
+<dead_tilde> <Greek_iota>                               : "ῖ"  U1fd6
+<Multi_key> <quotedbl> <asciitilde> <Greek_iota>        : "ῗ"  U1fd7
+<Multi_key> <asciitilde> <quotedbl> <Greek_iota>        : "ῗ"  U1fd7
+<dead_diaeresis> <dead_tilde> <Greek_iota>              : "ῗ"  U1fd7
+<dead_tilde> <dead_diaeresis> <Greek_iota>              : "ῗ"  U1fd7
+<Multi_key> <quotedbl> <grave> <Greek_upsilon>          : "ῢ"  U1fe2
+<Multi_key> <grave> <quotedbl> <Greek_upsilon>          : "ῢ"  U1fe2
+<dead_diaeresis> <dead_grave> <Greek_upsilon>           : "ῢ"  U1fe2
+<dead_grave> <dead_diaeresis> <Greek_upsilon>           : "ῢ"  U1fe2
+<Multi_key> <asciitilde> <Greek_upsilon>                : "ῦ"  U1fe6
+<dead_tilde> <Greek_upsilon>                            : "ῦ"  U1fe6
+<Multi_key> <quotedbl> <asciitilde> <Greek_upsilon>     : "ῧ"  U1fe7
+<Multi_key> <asciitilde> <quotedbl> <Greek_upsilon>     : "ῧ"  U1fe7
+<dead_diaeresis> <dead_tilde> <Greek_upsilon>           : "ῧ"  U1fe7
+<dead_tilde> <dead_diaeresis> <Greek_upsilon>           : "ῧ"  U1fe7
+<Multi_key> <bar> <grave> <Greek_omega>                 : "ῲ"  U1ff2
+<Multi_key> <grave> <bar> <Greek_omega>                 : "ῲ"  U1ff2
+<dead_iota> <dead_grave> <Greek_omega>                  : "ῲ"  U1ff2
+<dead_grave> <dead_iota> <Greek_omega>                  : "ῲ"  U1ff2
+<Multi_key> <bar> <Greek_omega>                         : "ῳ"  U1ff3
+<dead_iota> <Greek_omega>                               : "ῳ"  U1ff3
+<Multi_key> <bar> <apostrophe> <Greek_omega>            : "ῴ"  U1ff4
+<Multi_key> <apostrophe> <bar> <Greek_omega>            : "ῴ"  U1ff4
+<dead_iota> <dead_acute> <Greek_omega>                  : "ῴ"  U1ff4
+<dead_acute> <dead_iota> <Greek_omega>                  : "ῴ"  U1ff4
+<Multi_key> <asciitilde> <Greek_omega>                  : "ῶ"  U1ff6
+<dead_tilde> <Greek_omega>                              : "ῶ"  U1ff6
+<Multi_key> <bar> <asciitilde> <Greek_omega>            : "ῷ"  U1ff7
+<Multi_key> <asciitilde> <bar> <Greek_omega>            : "ῷ"  U1ff7
+<dead_iota> <dead_tilde> <Greek_omega>                  : "ῷ"  U1ff7
+<dead_tilde> <dead_iota> <Greek_omega>                  : "ῷ"  U1ff7
+<Multi_key> <bar> <Greek_ALPHA>                         : "ᾼ"  U1fbc
+<dead_iota> <Greek_ALPHA>                               : "ᾼ"  U1fbc
+<Multi_key> <bar> <Greek_ETA>                           : "ῌ"  U1fcc
+<dead_iota> <Greek_ETA>                                 : "ῌ"  U1fcc
+<Multi_key> <bar> <Greek_OMEGA>                         : "ῼ"  U1ffc
+<dead_iota> <Greek_OMEGA>                               : "ῼ"  U1ffc
+<Multi_key> <greater> <Greek_rho>                       : "ῤ"  U1fe4
+<dead_horn> <Greek_rho>                                 : "ῤ"  U1fe4
+<dead_psili> <Greek_rho>                                 : "ῤ"  U1fe4
+<Multi_key> <less> <Greek_rho>                          : "ῥ"  U1fe5
+<dead_ogonek> <Greek_rho>                               : "ῥ"  U1fe5
+<dead_dasia> <Greek_rho>                               : "ῥ"  U1fe5
+<Multi_key> <less> <Greek_RHO>                          : "Ῥ"  U1fec
+<dead_ogonek> <Greek_RHO>                               : "Ῥ"  U1fec
+<dead_dasia> <Greek_RHO>                               : "Ῥ"  U1fec
+<dead_horn> <dead_grave> <space>                        : "῍"  U1fcd
+<dead_psili> <dead_grave> <space>                        : "῍"  U1fcd
+<dead_grave> <dead_horn> <space>                        : "῍"  U1fcd
+<dead_grave> <dead_psili> <space>                        : "῍"  U1fcd
+<dead_horn> <dead_acute> <space>                        : "῎"  U1fce
+<dead_psili> <dead_acute> <space>                        : "῎"  U1fce
+<dead_acute> <dead_horn> <space>                        : "῎"  U1fce
+<dead_acute> <dead_psili> <space>                        : "῎"  U1fce
+<dead_horn> <dead_tilde> <space>                        : "῏"  U1fcf
+<dead_psili> <dead_tilde> <space>                        : "῏"  U1fcf
+<dead_tilde> <dead_horn> <space>                        : "῏"  U1fcf
+<dead_tilde> <dead_psili> <space>                        : "῏"  U1fcf
+<dead_ogonek> <dead_grave> <space>                      : "῝"  U1fdd
+<dead_dasia> <dead_grave> <space>                      : "῝"  U1fdd
+<dead_grave> <dead_ogonek> <space>                      : "῝"  U1fdd
+<dead_grave> <dead_dasia> <space>                      : "῝"  U1fdd
+<dead_ogonek> <dead_acute> <space>                      : "῞"  U1fde
+<dead_dasia> <dead_acute> <space>                      : "῞"  U1fde
+<dead_acute> <dead_ogonek> <space>                      : "῞"  U1fde
+<dead_acute> <dead_dasia> <space>                      : "῞"  U1fde
+<dead_ogonek> <dead_tilde> <space>                      : "῟"  U1fdf
+<dead_dasia> <dead_tilde> <space>                      : "῟"  U1fdf
+<dead_tilde> <dead_ogonek> <space>                      : "῟"  U1fdf
+<dead_tilde> <dead_dasia> <space>                      : "῟"  U1fdf
+<dead_diaeresis> <dead_grave> <space>                   : "῭"  U1fed
+<dead_grave> <dead_diaeresis> <space>                   : "῭"  U1fed
+<dead_diaeresis> <dead_tilde> <space>                   : "῁"  U1fc1
+<dead_tilde> <dead_diaeresis> <space>                   : "῁"  U1fc1
+<dead_horn> <space>                                     : "᾿"  U1fbf
+<dead_psili> <space>                                     : "᾿"  U1fbf
+<dead_horn> <dead_horn>                                 : "᾿"  U1fbf
+<dead_psili> <dead_horn>                                 : "᾿"  U1fbf
+<dead_ogonek> <space>                                   : "῾"  U1ffe
+<dead_dasia> <space>                                   : "῾"  U1ffe
+<dead_ogonek> <dead_ogonek>                             : "῾"  U1ffe
+<dead_dasia> <dead_ogonek>                             : "῾"  U1ffe
+<dead_grave> <space>                                    : "`"  U1fef
+<dead_grave> <dead_grave>                               : "`"  U1fef
+<dead_tilde> <space>                                    : "῀"  U1fc0
+<dead_tilde> <dead_tilde>                               : "῀"  U1fc0
+<dead_horn> <underscore>                                : "᾽"  U1fbd
+<dead_psili> <underscore>                                : "᾽"  U1fbd
+<dead_iota> <underscore>                                : "ι"  U1fbe
+<dead_iota> <space>                                     : "ͺ"  U037a
+<dead_iota> <dead_iota>                                 : "ͺ"  U037a
+
+XCOMM Part 3
+XCOMM
+XCOMM ISO 8859-7 (Greek) multi-key and dead key definitions extracted and
+XCOMM converted from the iso8859-7/Compose file.
+
+<Multi_key> <Greek_ALPHA> <apostrophe> : "Ά" Greek_ALPHAaccent
+<Multi_key> <apostrophe> <Greek_ALPHA> : "Ά" Greek_ALPHAaccent
+<Multi_key> <Greek_EPSILON> <apostrophe>: "Έ" Greek_EPSILONaccent
+<Multi_key> <apostrophe> <Greek_EPSILON>: "Έ" Greek_EPSILONaccent
+<Multi_key> <Greek_ETA> <apostrophe>   : "Ή" Greek_ETAaccent
+<Multi_key> <apostrophe> <Greek_ETA>   : "Ή" Greek_ETAaccent
+<Multi_key> <Greek_IOTA> <apostrophe>  : "Ί" Greek_IOTAaccent
+<Multi_key> <apostrophe> <Greek_IOTA>  : "Ί" Greek_IOTAaccent
+<Multi_key> <Greek_OMICRON> <apostrophe>: "Ό" Greek_OMICRONaccent
+<Multi_key> <apostrophe> <Greek_OMICRON>: "Ό" Greek_OMICRONaccent
+<Multi_key> <Greek_UPSILON> <apostrophe>: "Ύ" Greek_UPSILONaccent
+<Multi_key> <apostrophe> <Greek_UPSILON>: "Ύ" Greek_UPSILONaccent
+<Multi_key> <Greek_OMEGA> <apostrophe> : "Ώ" Greek_OMEGAaccent
+<Multi_key> <apostrophe> <Greek_OMEGA> : "Ώ" Greek_OMEGAaccent
+<Multi_key> <Greek_IOTA> <quotedbl>    : "Ϊ" Greek_IOTAdieresis
+<Multi_key> <quotedbl> <Greek_IOTA>    : "Ϊ" Greek_IOTAdieresis
+<Multi_key> <Greek_UPSILON> <quotedbl> : "Ϋ" Greek_UPSILONdieresis
+<Multi_key> <quotedbl> <Greek_UPSILON> : "Ϋ" Greek_UPSILONdieresis
+
+<Multi_key> <Greek_alpha> <apostrophe> : "ά" Greek_alphaaccent
+<Multi_key> <apostrophe> <Greek_alpha> : "ά" Greek_alphaaccent
+<Multi_key> <Greek_epsilon> <apostrophe>: "έ" Greek_epsilonaccent
+<Multi_key> <apostrophe> <Greek_epsilon>: "έ" Greek_epsilonaccent
+<Multi_key> <Greek_eta> <apostrophe>   : "ή" Greek_etaaccent
+<Multi_key> <apostrophe> <Greek_eta>   : "ή" Greek_etaaccent
+<Multi_key> <Greek_iota> <apostrophe>  : "ί" Greek_iotaaccent
+<Multi_key> <apostrophe> <Greek_iota>  : "ί" Greek_iotaaccent
+<Multi_key> <Greek_omicron> <apostrophe>: "ό" Greek_omicronaccent
+<Multi_key> <apostrophe> <Greek_omicron>: "ό" Greek_omicronaccent
+<Multi_key> <Greek_upsilon> <apostrophe>: "ύ" Greek_upsilonaccent
+<Multi_key> <apostrophe> <Greek_upsilon>: "ύ" Greek_upsilonaccent
+<Multi_key> <Greek_omega> <apostrophe> : "ώ" Greek_omegaaccent
+<Multi_key> <apostrophe> <Greek_omega> : "ώ" Greek_omegaaccent
+<Multi_key> <Greek_iota> <quotedbl>    : "ϊ" Greek_iotadieresis
+<Multi_key> <quotedbl> <Greek_iota>    : "ϊ" Greek_iotadieresis
+<Multi_key> <Greek_upsilon> <quotedbl> : "ϋ" Greek_upsilondieresis
+<Multi_key> <quotedbl> <Greek_upsilon> : "ϋ" Greek_upsilondieresis
+
+<Multi_key> <apostrophe> <quotedbl> <Greek_iota>       : "ΐ" Greek_iotaaccentdieresis
+<Multi_key> <quotedbl> <apostrophe> <Greek_iota>       : "ΐ" Greek_iotaaccentdieresis
+<Multi_key> <apostrophe> <quotedbl> <Greek_upsilon>    : "ΰ" Greek_upsilonaccentdieresis
+<Multi_key> <quotedbl> <apostrophe> <Greek_upsilon>    : "ΰ" Greek_upsilonaccentdieresis
+<Multi_key> <apostrophe> <quotedbl> <space>            : "΅" Greek_accentdieresis
+<Multi_key> <quotedbl> <apostrophe> <space>            : "΅" Greek_accentdieresis
+
+<dead_acute> <Greek_alpha>             : "ά"  Greek_alphaaccent
+<dead_acute> <Greek_epsilon>           : "έ"  Greek_epsilonaccent
+<dead_acute> <Greek_eta>               : "ή"  Greek_etaaccent
+<dead_acute> <Greek_iota>              : "ί"  Greek_iotaaccent
+<dead_acute> <Greek_omicron>           : "ό"  Greek_omicronaccent
+<dead_acute> <Greek_upsilon>           : "ύ"  Greek_upsilonaccent
+<dead_acute> <Greek_omega>             : "ώ"  Greek_omegaaccent
+<dead_acute> <Greek_ALPHA>             : "Ά"  Greek_ALPHAaccent
+<dead_acute> <Greek_EPSILON>           : "Έ"  Greek_EPSILONaccent
+<dead_acute> <Greek_ETA>               : "Ή"  Greek_ETAaccent
+<dead_acute> <Greek_IOTA>              : "Ί"  Greek_IOTAaccent
+<dead_acute> <Greek_OMICRON>           : "Ό"  Greek_OMICRONaccent
+<dead_acute> <Greek_UPSILON>           : "Ύ"  Greek_UPSILONaccent
+<dead_acute> <Greek_OMEGA>             : "Ώ"  Greek_OMEGAaccent
+<dead_acute> <space>                   : "΄"  U0384
+<dead_acute> <dead_acute>              : "΄"  U0384
+<dead_acute> <period>                  : "·"  periodcentered
+<dead_acute> <less>                    : "«"  guillemotleft
+<dead_acute> <greater>                 : "»"  guillemotright
+
+<dead_diaeresis> <Greek_iota>          : "ϊ"  Greek_iotadieresis
+<dead_diaeresis> <Greek_upsilon>       : "ϋ"  Greek_upsilondieresis
+<dead_diaeresis> <Greek_IOTA>          : "Ϊ"  Greek_IOTAdieresis
+<dead_diaeresis> <Greek_UPSILON>       : "Ϋ"  Greek_UPSILONdieresis
+<dead_diaeresis> <space>               : "¨"  diaeresis
+<dead_diaeresis> <dead_diaeresis>      : "¨"  diaeresis
+<dead_diaeresis> <period>              : "·"  periodcentered
+<dead_diaeresis> <less>                        : "«"  guillemotleft
+<dead_diaeresis> <greater>             : "»"  guillemotright
+
+<dead_acute> <dead_diaeresis> <Greek_iota>     : "ΐ"  Greek_iotaaccentdieresis
+<dead_acute> <dead_diaeresis> <Greek_upsilon>  : "ΰ"  Greek_upsilonaccentdieresis
+<dead_acute> <dead_diaeresis> <space>          : "΅"  Greek_accentdieresis
+
+<dead_diaeresis> <dead_acute> <Greek_iota>     : "ΐ"  Greek_iotaaccentdieresis
+<dead_diaeresis> <dead_acute> <Greek_upsilon>  : "ΰ"  Greek_upsilonaccentdieresis
+<dead_diaeresis> <dead_acute> <space>          : "΅"  Greek_accentdieresis
+
+XCOMM Part 4
+XCOMM
+XCOMM Miscellaneous extensions.
+
+<dead_macron> <space>                  : "¯"  macron
+<dead_macron> <dead_macron>            : "¯"  macron
+<dead_breve> <space>                   : "˘"  breve
+<dead_breve> <dead_breve>              : "˘"  breve
+
+<dead_grave> <underscore>              : "`"   grave
+<dead_acute> <underscore>              : "´"  acute
+<dead_tilde> <underscore>              : "~"   asciitilde
+
+<Multi_key> <less> <apostrophe> <space>        : "‘" leftsinglequotemark
+<Multi_key> <apostrophe> <less> <space>        : "‘" leftsinglequotemark
+<Multi_key> <greater> <apostrophe> <space>     : "’" rightsinglequotemark
+<Multi_key> <apostrophe> <greater> <space>     : "’" rightsinglequotemark
+<Multi_key> <asciitilde> <asciitilde>  : "―" Greek_horizbar
+<Multi_key> <asciicircum> <asciicircum>        : "˘"  breve
+
+<Multi_key> <slash> <slash>            : "ʹ"  U0374
+<Multi_key> <backslash> <backslash>    : "͵"  U0375
+<Multi_key> <semicolon> <semicolon>    : ";"  U037e
+<Multi_key> <colon> <colon>            : "·"  U0387
+
+<Multi_key> <C> <equal>                        : "€" EuroSign
+<Multi_key> <equal> <C>                        : "€" EuroSign
+<Multi_key> <c> <equal>                        : "€" EuroSign
+<Multi_key> <equal> <c>                        : "€" EuroSign
+<Multi_key> <E> <equal>                        : "€" EuroSign
+<Multi_key> <equal> <E>                        : "€" EuroSign
+<Multi_key> <e> <equal>                        : "€" EuroSign
+<Multi_key> <equal> <e>                        : "€" EuroSign
+<Multi_key> <Greek_EPSILON> <equal>    : "€" EuroSign
+<Multi_key> <equal> <Greek_EPSILON>    : "€" EuroSign
+<Multi_key> <Greek_epsilon> <equal>    : "€" EuroSign
+<Multi_key> <equal> <Greek_epsilon>    : "€" EuroSign
+
+<Multi_key> <Greek_DELTA> <Greek_RHO>  : "₯" U20af
+<Multi_key> <Greek_DELTA> <Greek_rho>  : "₯" U20af
+<Multi_key> <Greek_delta> <Greek_RHO>  : "₯" U20af
+<Multi_key> <Greek_delta> <Greek_rho>  : "₯" U20af
+
+<Multi_key> <question> <exclam>         : "‽"   U203D # INTERROBANG
+<Multi_key> <exclam> <question>         : "‽"   U203D # INTERROBANG
+
+<Multi_key> <1> <3>                    : "⅓" U2153 # VULGAR FRACTION ONE THIRD
+<Multi_key> <2> <3>                    : "⅔" U2154 # VULGAR FRACTION TWO THIRDS
+<Multi_key> <1> <5>                    : "⅕" U2155 # VULGAR FRACTION ONE FIFTH
+<Multi_key> <2> <5>                    : "⅖" U2156 # VULGAR FRACTION TWO FIFTHS
+<Multi_key> <3> <5>                    : "⅗" U2157 # VULGAR FRACTION THREE FIFTHS
+<Multi_key> <4> <5>                    : "⅘" U2158 # VULGAR FRACTION FOUR FIFTHS
+<Multi_key> <1> <6>                    : "⅙" U2159 # VULGAR FRACTION ONE SIXTH
+<Multi_key> <5> <6>                    : "⅚" U215A # VULGAR FRACTION FIVE SIXTHS
+<Multi_key> <1> <8>                    : "⅛" U215B # VULGAR FRACTION ONE EIGHTH
+<Multi_key> <3> <8>                    : "⅜" U215C # VULGAR FRACTION THREE EIGHTHS
+<Multi_key> <5> <8>                    : "⅝" U215D # VULGAR FRACTION FIVE EIGHTHS
+<Multi_key> <7> <8>                    : "⅞" U215E # VULGAR FRACTION SEVEN EIGHTHS
+
+XCOMM
+XCOMM Khmer digraphs
+XCOMM
+
+<U17ff> :   "ាំ"
+<U17fe> :   "ោះ"
+<U17fd> :   "េះ"
+<U17fc> :   "ុំ"
+<U17fb> :   "ុះ"
+
+XCOMM End
diff --git a/nls/el_GR.UTF-8/XI18N_OBJS b/nls/el_GR.UTF-8/XI18N_OBJS
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/nls/el_GR.UTF-8/XLC_LOCALE.pre b/nls/el_GR.UTF-8/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/nls/en_US.UTF-8/Compose.pre b/nls/en_US.UTF-8/Compose.pre
new file mode 100644 (file)
index 0000000..bf6599a
--- /dev/null
@@ -0,0 +1,5989 @@
+XCOMM UTF-8 (Unicode) compose sequence
+XCOMM David.Monniaux@ens.fr
+XCOMM
+
+XCOMM Part 1 - Manual definitions
+
+XCOMM Spacing versions of dead accents
+<dead_tilde> <space>                   : "~"   asciitilde # TILDE
+<dead_tilde> <dead_tilde>              : "~"   asciitilde # TILDE
+<dead_acute> <space>                   : "'"   apostrophe # APOSTROPHE
+<dead_acute> <dead_acute>              : "´"   acute # ACUTE ACCENT
+<Multi_key> <apostrophe> <apostrophe>  : "´"   acute # ACUTE ACCENT
+<dead_grave> <space>                   : "`"   grave # GRAVE ACCENT
+<dead_grave> <dead_grave>              : "`"   grave # GRAVE ACCENT
+<dead_circumflex> <space>              : "^"   asciicircum # CIRCUMFLEX ACCENT
+<dead_circumflex> <dead_circumflex>    : "^"   asciicircum # CIRCUMFLEX ACCENT
+<dead_abovering> <space>               : "°"   degree # DEGREE SIGN
+<dead_abovering> <dead_abovering>      : "°"   degree # DEGREE SIGN
+<dead_macron> <space>                  : "¯"   macron # MACRON
+<dead_macron> <dead_macron>            : "¯"   macron # MACRON
+<Multi_key> <minus> <asciicircum>      : "¯"   macron # MACRON
+<Multi_key> <asciicircum> <minus>      : "¯"   macron # MACRON
+<Multi_key> <underscore> <underscore>  : "¯"   macron # MACRON
+<Multi_key> <underscore> <asciicircum>         : "¯"   macron # MACRON
+<dead_breve> <space>                   : "˘"   breve # BREVE
+<dead_breve> <dead_breve>              : "˘"   breve # BREVE
+<Multi_key> <space> <parenleft>                : "˘"   breve # BREVE
+<Multi_key> <parenleft> <space>                : "˘"   breve # BREVE
+<dead_abovedot> <space>                : "˙"   abovedot # DOT ABOVE
+<dead_abovedot> <dead_abovedot>        : "˙"   abovedot # DOT ABOVE
+<dead_diaeresis> <dead_diaeresis>      : "¨"   diaeresis # DIAERESIS
+<Multi_key> <quotedbl> <quotedbl>      : "¨"   diaeresis # DIAERESIS
+<dead_diaeresis> <space>               : "\""   quotedbl # REVERSE SOLIDUS
+<dead_doubleacute> <space>             : "˝"   U2dd # DOUBLE ACUTE ACCENT
+<dead_doubleacute> <dead_doubleacute>  : "˝"   U2dd # DOUBLE ACUTE ACCENT
+<dead_caron> <space>                   : "ˇ"   caron # CARON
+<dead_caron> <dead_caron>              : "ˇ"   caron # CARON
+<Multi_key> <space> <less>             : "ˇ"   caron # CARON
+<Multi_key> <less> <space>             : "ˇ"   caron # CARON
+<dead_cedilla> <space>                 : "¸"   cedilla # CEDILLA
+<dead_cedilla> <dead_cedilla>          : "¸"   cedilla # CEDILLA
+<dead_ogonek> <space>                  : "˛"   ogonek # OGONEK
+<dead_ogonek> <dead_ogonek>            : "˛"   ogonek # OGONEK
+<dead_iota> <space>                    : "ͺ"   U37a # GREEK YPOGEGRAMMENI
+<dead_iota> <dead_iota>                : "ͺ"   U37a # GREEK YPOGEGRAMMENI
+<Multi_key> <minus> <minus> <space>    : "­"   U00ad # SOFT HYPHEN
+
+
+XCOMM ASCII characters that may be difficult to access
+XCOMM on some keyboards.
+<Multi_key> <plus> <plus>              : "#"   numbersign # NUMBER SIGN
+<Multi_key> <apostrophe> <space>       : "'"   apostrophe # APOSTROPHE
+<Multi_key> <space> <apostrophe>       : "'"   apostrophe # APOSTROPHE
+<Multi_key> <A> <T>                    : "@"   at # COMMERCIAL AT
+<Multi_key> <parenleft> <parenleft>    : "["   bracketleft # LEFT SQUARE BRACKET
+<Multi_key> <slash> <slash>            : "\\"   backslash # REVERSE SOLIDUS
+<Multi_key> <slash> <less>             : "\\"   backslash # REVERSE SOLIDUS
+<Multi_key> <less> <slash>             : "\\"   backslash # REVERSE SOLIDUS
+<Multi_key> <parenright> <parenright>  : "]"   bracketright # RIGHT SQUARE BRACKET
+
+<Multi_key> <asciicircum> <space>      : "^"   asciicircum # CIRCUMFLEX ACCENT
+<Multi_key> <space> <asciicircum>      : "^"   asciicircum # CIRCUMFLEX ACCENT
+<Multi_key> <greater> <space>          : "^"   asciicircum # CIRCUMFLEX ACCENT
+<Multi_key> <space> <greater>          : "^"   asciicircum # CIRCUMFLEX ACCENT
+
+<Multi_key> <grave> <space>            : "`"   grave # GRAVE ACCENT
+<Multi_key> <space> <grave>            : "`"   grave # GRAVE ACCENT
+
+<Multi_key> <comma> <space>            : "¸"   cedilla # CEDILLA
+<Multi_key> <space> <comma>            : "¸"   cedilla # CEDILLA
+<Multi_key> <comma> <comma>            : "¸"   cedilla # CEDILLA
+
+<Multi_key> <parenleft> <minus>        : "{"   braceleft # LEFT CURLY BRACKET
+<Multi_key> <minus> <parenleft>        : "{"   braceleft # LEFT CURLY BRACKET
+
+<Multi_key> <slash> <asciicircum>      : "|"   bar # VERTICAL LINE
+<Multi_key> <asciicircum> <slash>      : "|"   bar # VERTICAL LINE
+<Multi_key> <V> <L>                    : "|"   bar # VERTICAL LINE
+<Multi_key> <L> <V>                    : "|"   bar # VERTICAL LINE
+<Multi_key> <v> <l>                    : "|"   bar # VERTICAL LINE
+<Multi_key> <l> <v>                    : "|"   bar # VERTICAL LINE
+
+<Multi_key> <parenright> <minus>       : "}"   braceright # RIGHT CURLY BRACKET
+<Multi_key> <minus> <parenright>       : "}"   braceright # RIGHT CURLY BRACKET
+
+<Multi_key> <asciitilde> <space>       : "~"   asciitilde # TILDE
+<Multi_key> <space> <asciitilde>       : "~"   asciitilde # TILDE
+<Multi_key> <minus> <space>            : "~"   asciitilde # TILDE
+<Multi_key> <space> <minus>            : "~"   asciitilde # TILDE
+
+XCOMM Spaces
+<Multi_key> <space> <space>            : " "   nobreakspace # NO-BREAK SPACE
+<Multi_key> <space> <period>           : " "   U2008 # PUNCTUATION SPACE
+
+<Multi_key> <o> <c>                    : "©"   copyright # COPYRIGHT SIGN
+<Multi_key> <o> <C>                    : "©"   copyright # COPYRIGHT SIGN
+<Multi_key> <O> <c>                    : "©"   copyright # COPYRIGHT SIGN
+<Multi_key> <O> <C>                    : "©"   copyright # COPYRIGHT SIGN
+<Multi_key> <C> <o>                    : "©"   copyright # COPYRIGHT SIGN
+<Multi_key> <C> <O>                    : "©"   copyright # COPYRIGHT SIGN
+
+<Multi_key> <o> <r>                    : "®"   registered # REGISTERED SIGN
+<Multi_key> <o> <R>                    : "®"   registered # REGISTERED SIGN
+<Multi_key> <O> <r>                    : "®"   registered # REGISTERED SIGN
+<Multi_key> <O> <R>                    : "®"   registered # REGISTERED SIGN
+<Multi_key> <R> <O>                    : "®"   registered # REGISTERED SIGN
+
+<Multi_key> <period> <greater>         : "›"   U203a # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+<Multi_key> <period> <less>            : "‹"   U2039 # SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+<Multi_key> <period> <period>          : "…"   ellipsis # HORIZONTAL ELLIPSIS
+<Multi_key> <period> <minus>           : "·"   periodcentered # MIDDLE DOT
+<Multi_key> <period> <asciicircum>     : "·"   periodcentered # MIDDLE DOT
+<Multi_key> <asciicircum> <period>     : "·"   periodcentered # MIDDLE DOT
+<Multi_key> <period> <equal>           : "•"   enfilledcircbullet # BULLET
+<Multi_key> <exclam> <asciicircum>     : "¦"   brokenbar # BROKEN BAR
+<Multi_key> <exclam> <exclam>          : "¡"   exclamdown # INVERTED EXCLAMATION MARK
+<Multi_key> <p> <exclam>               : "¶"   paragraph # PILCROW SIGN
+<Multi_key> <P> <exclam>               : "¶"   paragraph # PILCROW SIGN
+<Multi_key> <plus> <minus>             : "±"   plusminus # PLUS-MINUS SIGN
+<Multi_key> <minus> <plus>             : "±"   plusminus # PLUS-MINUS SIGN
+<Multi_key> <question> <question>      : "¿"   questiondown # INVERTED QUESTION MARK
+<Multi_key> <minus> <d>                : "đ"   dstroke # LATIN SMALL LETTER D WITH STROKE
+<Multi_key> <minus> <D>                : "Đ"   Dstroke # LATIN CAPITAL LETTER D WITH STROKE
+<Multi_key> <s> <s>                    : "ß"   ssharp # LATIN SMALL LETTER SHARP S
+<Multi_key> <S> <S>                    : "ẞ"   U1e9e # LATIN CAPITAL LETTER SHARP S
+
+<Multi_key> <o> <e>                    : "œ"   oe # LATIN SMALL LIGATURE OE
+<Multi_key> <O> <E>                    : "Œ"   OE # LATIN CAPITAL LIGATURE OE
+<Multi_key> <a> <e>                    : "æ"   ae # LATIN SMALL LETTER AE
+<Multi_key> <A> <E>                    : "Æ"   AE # LATIN CAPITAL LETTER AE
+<Multi_key> <f> <f>                    : "ff"   Ufb00 # LATIN SMALL LIGATURE FF
+<Multi_key> <f> <i>                    : "fi"   Ufb01 # LATIN SMALL LIGATURE FI
+<Multi_key> <f> <l>                    : "fl"   Ufb02 # LATIN SMALL LIGATURE FL
+<Multi_key> <F> <i>                    : "ffi"   Ufb03 # LATIN SMALL LIGATURE FFI
+<Multi_key> <F> <l>                    : "ffl"   Ufb04 # LATIN SMALL LIGATURE FFL
+<Multi_key> <I> <J>                    : "IJ"   U0132 # LATIN CAPITAL LIGATURE IJ
+<Multi_key> <I> <j>                    : "IJ"   U0132 # LATIN CAPITAL LIGATURE IJ
+<Multi_key> <i> <j>                    : "ij"   U0133 # LATIN SMALL LIGATURE IJ
+
+<Multi_key> <o> <o>                    : "°"   degree # DEGREE SIGN
+<Multi_key> <asterisk> <0>             : "°"   degree # DEGREE SIGN
+<Multi_key> <0> <asterisk>             : "°"   degree # DEGREE SIGN
+
+XCOMM Quotation marks
+<Multi_key> <less> <less>              : "«"   guillemotleft # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+<Multi_key> <greater> <greater>        : "»"   guillemotright # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+<Multi_key> <less> <apostrophe>        : "‘"   U2018 # LEFT SINGLE QUOTATION MARK
+<Multi_key> <apostrophe> <less>        : "‘"   U2018 # LEFT SINGLE QUOTATION MARK
+<Multi_key> <greater> <apostrophe>     : "’"   U2019 # RIGHT SINGLE QUOTATION MARK
+<Multi_key> <apostrophe> <greater>     : "’"   U2019 # RIGHT SINGLE QUOTATION MARK
+<Multi_key> <comma> <apostrophe>       : "‚"   U201a # SINGLE LOW-9 QUOTATION MARK
+<Multi_key> <apostrophe> <comma>       : "‚"   U201a # SINGLE LOW-9 QUOTATION MARK
+<Multi_key> <less> <quotedbl>          : "“"   U201c # LEFT DOUBLE QUOTATION MARK
+<Multi_key> <quotedbl> <less>          : "“"   U201c # LEFT DOUBLE QUOTATION MARK
+<Multi_key> <greater> <quotedbl>       : "”"   U201d # RIGHT DOUBLE QUOTATION MARK
+<Multi_key> <quotedbl> <greater>       : "”"   U201d # RIGHT DOUBLE QUOTATION MARK
+<Multi_key> <comma> <quotedbl>         : "„"   U201e # DOUBLE LOW-9 QUOTATION MARK
+<Multi_key> <quotedbl> <comma>         : "„"   U201e # DOUBLE LOW-9 QUOTATION MARK
+
+XCOMM Per xxx
+<Multi_key> <percent> <o>              : "‰"   U2030 # PER MILLE SIGN
+
+XCOMM Currencies
+<Multi_key> <C> <E>                    : "₠"   U20a0 # EURO-CURRENCY SIGN
+<Multi_key> <C> <slash>                : "₡"   U20a1 # COLON SIGN
+<Multi_key> <slash> <C>                : "₡"   U20a1 # COLON SIGN
+<Multi_key> <C> <r>                    : "₢"   U20a2 # CRUZEIRO SIGN
+<Multi_key> <F> <r>                    : "₣"   U20a3 # FRENCH FRANC SIGN
+<Multi_key> <L> <equal>                : "₤"   U20a4 # LIRA SIGN
+<Multi_key> <equal> <L>                : "₤"   U20a4 # LIRA SIGN
+<Multi_key> <m> <slash>                : "₥"   U20a5 # MILL SIGN
+<Multi_key> <slash> <m>                : "₥"   U20a5 # MILL SIGN
+<Multi_key> <N> <equal>                : "₦"   U20a6 # NAIRA SIGN
+<Multi_key> <equal> <N>                : "₦"   U20a6 # NAIRA SIGN
+<Multi_key> <P> <t>                    : "₧"   U20a7 # PESETA SIGN
+<Multi_key> <R> <s>                    : "₨"   U20a8 # RUPEE SIGN
+<Multi_key> <W> <equal>                : "₩"   U20a9 # WON SIGN
+<Multi_key> <equal> <W>                : "₩"   U20a9 # WON SIGN
+XCOMM "₪" U20aa NEW SHEQEL SIGN
+<Multi_key> <d> <equal>                : "₫"   U20ab # DONG SIGN
+<Multi_key> <equal> <d>                : "₫"   U20ab # DONG SIGN
+<Multi_key> <C> <equal>                : "€"   EuroSign # EURO SIGN
+<Multi_key> <equal> <C>                : "€"   EuroSign # EURO SIGN
+<Multi_key> <c> <equal>                : "€"   EuroSign # EURO SIGN
+<Multi_key> <equal> <c>                : "€"   EuroSign # EURO SIGN
+<Multi_key> <E> <equal>                : "€"   EuroSign # EURO SIGN
+<Multi_key> <equal> <E>                : "€"   EuroSign # EURO SIGN
+<Multi_key> <e> <equal>                : "€"   EuroSign # EURO SIGN
+<Multi_key> <equal> <e>                : "€"   EuroSign # EURO SIGN
+<Multi_key> <Cyrillic_ES> <equal>      : "€"   EuroSign # EURO SIGN
+<Multi_key> <equal> <Cyrillic_ES>      : "€"   EuroSign # EURO SIGN
+<Multi_key> <Cyrillic_IE> <equal>      : "€"   EuroSign # EURO SIGN
+<Multi_key> <equal> <Cyrillic_IE>      : "€"   EuroSign # EURO SIGN
+XCOMM "₭" U20ad KIP SIGN
+XCOMM "₮" U20ae TUGRIK SIGN
+XCOMM "₯" U20af DRACHMA SIGN
+XCOMM "₰" U20b0 GERMAN PENNY SIGN
+XCOMM "₱" U20b1 PESO SIGN
+XCOMM "₲" U20b2 GUARANI SIGN
+XCOMM "₳" U20b3 AUSTRAL SIGN
+XCOMM "₴" U20b4 HRYVNIA SIGN
+XCOMM "₵" U20b5 CEDI SIGN
+
+
+<Multi_key> <bar> <C>                  : "¢"   cent # CENT SIGN
+<Multi_key> <bar> <c>                  : "¢"   cent # CENT SIGN
+<Multi_key> <C> <bar>                  : "¢"   cent # CENT SIGN
+<Multi_key> <c> <bar>                  : "¢"   cent # CENT SIGN
+<Multi_key> <c> <slash>                : "¢"   cent # CENT SIGN
+<Multi_key> <slash> <c>                : "¢"   cent # CENT SIGN
+<Multi_key> <L> <minus>                : "£"   sterling # POUND SIGN
+<Multi_key> <l> <minus>                : "£"   sterling # POUND SIGN
+<Multi_key> <minus> <L>                : "£"   sterling # POUND SIGN
+<Multi_key> <minus> <l>                : "£"   sterling # POUND SIGN
+<Multi_key> <Y> <equal>                : "¥"   yen # YEN SIGN
+<Multi_key> <y> <equal>                : "¥"   yen # YEN SIGN
+<Multi_key> <equal> <Y>                : "¥"   yen # YEN SIGN
+<Multi_key> <equal> <y>                : "¥"   yen # YEN SIGN
+<Multi_key> <Y> <minus>                : "¥"   yen # YEN SIGN
+<Multi_key> <minus> <Y>                : "¥"   yen # YEN SIGN
+<Multi_key> <y> <minus>                : "¥"   yen # YEN SIGN
+<Multi_key> <minus> <y>                : "¥"   yen # YEN SIGN
+
+XCOMM Long S
+<Multi_key> <f> <s>                    : "ſ"   U017f # LATIN SMALL LETTER LONG S
+<Multi_key> <f> <S>                    : "ſ"   U017f # LATIN SMALL LETTER LONG S
+<dead_abovedot> <Multi_key> <f> <s>    : "ẛ"   U1e9b # LATIN SMALL LETTER LONG S WITH DOT ABOVE
+<Multi_key> <dead_abovedot> <f> <s>    : "ẛ"   U1e9b # LATIN SMALL LETTER LONG S WITH DOT ABOVE
+
+XCOMM Dashes
+<Multi_key> <minus> <minus> <period>   : "–"   U2013 # EN DASH
+<Multi_key> <minus> <minus> <minus>    : "—"   U2014 # EM DASH
+
+XCOMM Musical alterations
+<Multi_key> <numbersign> <q>           : "♩"   U2669 # QUARTER NOTE
+<Multi_key> <numbersign> <e>           : "♪"   U266a # EIGHTH NOTE
+<Multi_key> <numbersign> <E>           : "♫"   U266b # BEAMED EIGHTH NOTES
+<Multi_key> <numbersign> <S>           : "♬"   U266c # BEAMED SIXTEENTH NOTES
+<Multi_key> <numbersign> <b>           : "♭"   U266d # MUSIC FLAT SIGN
+<Multi_key> <numbersign> <f>           : "♮"   U266e # MUSIC NATURAL SIGN
+<Multi_key> <numbersign> <numbersign>  : "♯"   U266f # MUSIC SHARP SIGN
+
+XCOMM Other symbols
+<Multi_key> <s> <o>                    : "§"   section # SECTION SIGN
+<Multi_key> <o> <s>                    : "§"   section # SECTION SIGN
+<Multi_key> <S> <O>                    : "§"   section # SECTION SIGN
+<Multi_key> <O> <S>                    : "§"   section # SECTION SIGN
+<Multi_key> <s> <exclam>               : "§"   section # SECTION SIGN
+<Multi_key> <S> <exclam>               : "§"   section # SECTION SIGN
+<Multi_key> <Cyrillic_pe> <Cyrillic_a> : "§"   section # SECTION SIGN
+
+<Multi_key> <o> <x>                    : "¤"   currency # CURRENCY SIGN
+<Multi_key> <x> <o>                    : "¤"   currency # CURRENCY SIGN
+<Multi_key> <o> <X>                    : "¤"   currency # CURRENCY SIGN
+<Multi_key> <X> <o>                    : "¤"   currency # CURRENCY SIGN
+<Multi_key> <O> <X>                    : "¤"   currency # CURRENCY SIGN
+<Multi_key> <X> <O>                    : "¤"   currency # CURRENCY SIGN
+<Multi_key> <O> <x>                    : "¤"   currency # CURRENCY SIGN
+<Multi_key> <x> <O>                    : "¤"   currency # CURRENCY SIGN
+
+<Multi_key> <P> <P>                    : "¶"   paragraph # PILCROW SIGN
+
+<Multi_key> <N> <o>                    : "№" numerosign # NUMERO SIGN
+<Multi_key> <N> <O>                    : "№" numerosign # NUMERO SIGN
+<Multi_key> <Cyrillic_EN> <Cyrillic_o> : "№" numerosign # NUMERO SIGN
+<Multi_key> <Cyrillic_EN> <Cyrillic_O> : "№" numerosign # NUMERO SIGN
+
+<Multi_key> <question> <exclam>         : "⸘"   U2E18 # INVERTED INTERROBANG
+<Multi_key> <exclam> <question>         : "‽"   U203D # INTERROBANG
+
+<Multi_key> <C> <C> <C> <P>             : "☭"   U262D # HAMMER AND SICKLE
+<Multi_key> <O> <A>                     : "Ⓐ"   U24B6 # CIRCLED LATIN CAPITAL LETTER A
+<Multi_key> <less> <3>                  : "♥"   U2665 # BLACK HEART SUIT
+
+<Multi_key> <colon> <parenright>        : "☺"   U263A # WHITE SMILING FACE
+<Multi_key> <colon> <parenleft>         : "☹"   U2639 # WHITE FROWNING FACE
+
+XCOMM Part 2
+
+XCOMM Compose map for Korean Hangul(Choseongul) Conjoining Jamos  automatically
+XCOMM generated  from UnicodeData-2.0.14.txt at
+XCOMM    ftp://ftp.unicode.org/Public/2.0-Update/UnicodeData-2.0.14.txt
+XCOMM   by Jungshik Shin <jshin@jshin.net>  2002-10-17
+XCOMM There are some conflicts among sequences, but I left them alone.
+XCOMM
+XCOMM group 1: cluster jamos made of three basic jamos
+
+/* The follwing block gets overridden by later shorter compositions
+ * <Multi_key> <U1107> <U1109> <U1100>         : "ᄢ"   U1122 # HANGUL CHOSEONG PIEUP-SIOS-KIYEOK
+ * <Multi_key> <U1107> <U1109> <U1103>         : "ᄣ"   U1123 # HANGUL CHOSEONG PIEUP-SIOS-TIKEUT
+ * <Multi_key> <U1107> <U1109> <U1107>         : "ᄤ"   U1124 # HANGUL CHOSEONG PIEUP-SIOS-PIEUP
+ * <Multi_key> <U1107> <U1109> <U1109>         : "ᄥ"   U1125 # HANGUL CHOSEONG PIEUP-SSANGSIOS
+ * <Multi_key> <U1107> <U1109> <U110C>         : "ᄦ"   U1126 # HANGUL CHOSEONG PIEUP-SIOS-CIEUC
+ * <Multi_key> <U1107> <U1107> <U110B>         : "ᄬ"   U112c # HANGUL CHOSEONG KAPYEOUNSSANGPIEUP
+ * <Multi_key> <U1109> <U1107> <U1100>         : "ᄳ"   U1133 # HANGUL CHOSEONG SIOS-PIEUP-KIYEOK
+ * <Multi_key> <U1109> <U1109> <U1109>         : "ᄴ"   U1134 # HANGUL CHOSEONG SIOS-SSANGSIOS
+ * <Multi_key> <U1169> <U1161> <U1175>         : "ᅫ"   U116b # HANGUL JUNGSEONG WAE
+ * <Multi_key> <U116E> <U1165> <U1175>         : "ᅰ"   U1170 # HANGUL JUNGSEONG WE
+ * <Multi_key> <U116E> <U1165> <U1173>         : "ᆋ"   U118b # HANGUL JUNGSEONG U-EO-EU
+ * <Multi_key> <U11A8> <U11BA> <U11A8>         : "ᇄ"   U11c4 # HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK
+ * <Multi_key> <U11AF> <U11A8> <U11BA>         : "ᇌ"   U11cc # HANGUL JONGSEONG RIEUL-KIYEOK-SIOS
+ * <Multi_key> <U11AF> <U11AE> <U11C2>         : "ᇏ"   U11cf # HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH
+ * <Multi_key> <U11AF> <U11B7> <U11A8>         : "ᇑ"   U11d1 # HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK
+ * <Multi_key> <U11AF> <U11B7> <U11BA>         : "ᇒ"   U11d2 # HANGUL JONGSEONG RIEUL-MIEUM-SIOS
+ * <Multi_key> <U11AF> <U11B8> <U11BA>         : "ᇓ"   U11d3 # HANGUL JONGSEONG RIEUL-PIEUP-SIOS
+ * <Multi_key> <U11AF> <U11B8> <U11C2>         : "ᇔ"   U11d4 # HANGUL JONGSEONG RIEUL-PIEUP-HIEUH
+ * <Multi_key> <U11AF> <U11B8> <U11BC>         : "ᇕ"   U11d5 # HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP
+ * <Multi_key> <U11AF> <U11BA> <U11BA>         : "ᇖ"   U11d6 # HANGUL JONGSEONG RIEUL-SSANGSIOS
+ * <Multi_key> <U11B7> <U11BA> <U11BA>         : "ᇞ"   U11de # HANGUL JONGSEONG MIEUM-SSANGSIOS
+ * <Multi_key> <U11BC> <U11A8> <U11A8>         : "ᇭ"   U11ed # HANGUL JONGSEONG IEUNG-SSANGKIYEOK
+ */
+<Multi_key> <U1100> <U1100>    : "ᄁ"   U1101 # HANGUL CHOSEONG SSANGKIYEOK
+<Multi_key> <U1103> <U1103>    : "ᄄ"   U1104 # HANGUL CHOSEONG SSANGTIKEUT
+<Multi_key> <U1107> <U1107>    : "ᄈ"   U1108 # HANGUL CHOSEONG SSANGPIEUP
+<Multi_key> <U1109> <U1109>    : "ᄊ"   U110a # HANGUL CHOSEONG SSANGSIOS
+<Multi_key> <U110C> <U110C>    : "ᄍ"   U110d # HANGUL CHOSEONG SSANGCIEUC
+<Multi_key> <U1102> <U1100>    : "ᄓ"   U1113 # HANGUL CHOSEONG NIEUN-KIYEOK
+<Multi_key> <U1102> <U1102>    : "ᄔ"   U1114 # HANGUL CHOSEONG SSANGNIEUN
+<Multi_key> <U1102> <U1103>    : "ᄕ"   U1115 # HANGUL CHOSEONG NIEUN-TIKEUT
+<Multi_key> <U1102> <U1107>    : "ᄖ"   U1116 # HANGUL CHOSEONG NIEUN-PIEUP
+<Multi_key> <U1103> <U1100>    : "ᄗ"   U1117 # HANGUL CHOSEONG TIKEUT-KIYEOK
+<Multi_key> <U1105> <U1102>    : "ᄘ"   U1118 # HANGUL CHOSEONG RIEUL-NIEUN
+<Multi_key> <U1105> <U1105>    : "ᄙ"   U1119 # HANGUL CHOSEONG SSANGRIEUL
+<Multi_key> <U1105> <U1112>    : "ᄚ"   U111a # HANGUL CHOSEONG RIEUL-HIEUH
+<Multi_key> <U1105> <U110B>    : "ᄛ"   U111b # HANGUL CHOSEONG KAPYEOUNRIEUL
+<Multi_key> <U1106> <U1107>    : "ᄜ"   U111c # HANGUL CHOSEONG MIEUM-PIEUP
+<Multi_key> <U1106> <U110B>    : "ᄝ"   U111d # HANGUL CHOSEONG KAPYEOUNMIEUM
+<Multi_key> <U1107> <U1100>    : "ᄞ"   U111e # HANGUL CHOSEONG PIEUP-KIYEOK
+<Multi_key> <U1107> <U1102>    : "ᄟ"   U111f # HANGUL CHOSEONG PIEUP-NIEUN
+<Multi_key> <U1107> <U1103>    : "ᄠ"   U1120 # HANGUL CHOSEONG PIEUP-TIKEUT
+<Multi_key> <U1107> <U1109>    : "ᄡ"   U1121 # HANGUL CHOSEONG PIEUP-SIOS
+<Multi_key> <U1107> <U110C>    : "ᄧ"   U1127 # HANGUL CHOSEONG PIEUP-CIEUC
+<Multi_key> <U1107> <U110E>    : "ᄨ"   U1128 # HANGUL CHOSEONG PIEUP-CHIEUCH
+<Multi_key> <U1107> <U1110>    : "ᄩ"   U1129 # HANGUL CHOSEONG PIEUP-THIEUTH
+<Multi_key> <U1107> <U1111>    : "ᄪ"   U112a # HANGUL CHOSEONG PIEUP-PHIEUPH
+<Multi_key> <U1107> <U110B>    : "ᄫ"   U112b # HANGUL CHOSEONG KAPYEOUNPIEUP
+<Multi_key> <U1109> <U1100>    : "ᄭ"   U112d # HANGUL CHOSEONG SIOS-KIYEOK
+<Multi_key> <U1109> <U1102>    : "ᄮ"   U112e # HANGUL CHOSEONG SIOS-NIEUN
+<Multi_key> <U1109> <U1103>    : "ᄯ"   U112f # HANGUL CHOSEONG SIOS-TIKEUT
+<Multi_key> <U1109> <U1105>    : "ᄰ"   U1130 # HANGUL CHOSEONG SIOS-RIEUL
+<Multi_key> <U1109> <U1106>    : "ᄱ"   U1131 # HANGUL CHOSEONG SIOS-MIEUM
+<Multi_key> <U1109> <U1107>    : "ᄲ"   U1132 # HANGUL CHOSEONG SIOS-PIEUP
+<Multi_key> <U1109> <U110B>    : "ᄵ"   U1135 # HANGUL CHOSEONG SIOS-IEUNG
+<Multi_key> <U1109> <U110C>    : "ᄶ"   U1136 # HANGUL CHOSEONG SIOS-CIEUC
+<Multi_key> <U1109> <U110E>    : "ᄷ"   U1137 # HANGUL CHOSEONG SIOS-CHIEUCH
+<Multi_key> <U1109> <U110F>    : "ᄸ"   U1138 # HANGUL CHOSEONG SIOS-KHIEUKH
+<Multi_key> <U1109> <U1110>    : "ᄹ"   U1139 # HANGUL CHOSEONG SIOS-THIEUTH
+<Multi_key> <U1109> <U1111>    : "ᄺ"   U113a # HANGUL CHOSEONG SIOS-PHIEUPH
+<Multi_key> <U1109> <U1112>    : "ᄻ"   U113b # HANGUL CHOSEONG SIOS-HIEUH
+<Multi_key> <U113C> <U113C>    : "ᄽ"   U113d # HANGUL CHOSEONG CHITUEUMSSANGSIOS
+<Multi_key> <U113E> <U113E>    : "ᄿ"   U113f # HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS
+<Multi_key> <U110B> <U1100>    : "ᅁ"   U1141 # HANGUL CHOSEONG IEUNG-KIYEOK
+<Multi_key> <U110B> <U1103>    : "ᅂ"   U1142 # HANGUL CHOSEONG IEUNG-TIKEUT
+<Multi_key> <U110B> <U1106>    : "ᅃ"   U1143 # HANGUL CHOSEONG IEUNG-MIEUM
+<Multi_key> <U110B> <U1107>    : "ᅄ"   U1144 # HANGUL CHOSEONG IEUNG-PIEUP
+<Multi_key> <U110B> <U1109>    : "ᅅ"   U1145 # HANGUL CHOSEONG IEUNG-SIOS
+<Multi_key> <U110B> <U1140>    : "ᅆ"   U1146 # HANGUL CHOSEONG IEUNG-PANSIOS
+<Multi_key> <U110B> <U110B>    : "ᅇ"   U1147 # HANGUL CHOSEONG SSANGIEUNG
+<Multi_key> <U110B> <U110C>    : "ᅈ"   U1148 # HANGUL CHOSEONG IEUNG-CIEUC
+<Multi_key> <U110B> <U110E>    : "ᅉ"   U1149 # HANGUL CHOSEONG IEUNG-CHIEUCH
+<Multi_key> <U110B> <U1110>    : "ᅊ"   U114a # HANGUL CHOSEONG IEUNG-THIEUTH
+<Multi_key> <U110B> <U1111>    : "ᅋ"   U114b # HANGUL CHOSEONG IEUNG-PHIEUPH
+<Multi_key> <U110C> <U110B>    : "ᅍ"   U114d # HANGUL CHOSEONG CIEUC-IEUNG
+<Multi_key> <U114E> <U114E>    : "ᅏ"   U114f # HANGUL CHOSEONG CHITUEUMSSANGCIEUC
+<Multi_key> <U1150> <U1150>    : "ᅑ"   U1151 # HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC
+<Multi_key> <U110E> <U110F>    : "ᅒ"   U1152 # HANGUL CHOSEONG CHIEUCH-KHIEUKH
+<Multi_key> <U110E> <U1112>    : "ᅓ"   U1153 # HANGUL CHOSEONG CHIEUCH-HIEUH
+<Multi_key> <U1111> <U1107>    : "ᅖ"   U1156 # HANGUL CHOSEONG PHIEUPH-PIEUP
+<Multi_key> <U1111> <U110B>    : "ᅗ"   U1157 # HANGUL CHOSEONG KAPYEOUNPHIEUPH
+<Multi_key> <U1112> <U1112>    : "ᅘ"   U1158 # HANGUL CHOSEONG SSANGHIEUH
+<Multi_key> <U1161> <U1175>    : "ᅢ"   U1162 # HANGUL JUNGSEONG AE
+<Multi_key> <U1163> <U1175>    : "ᅤ"   U1164 # HANGUL JUNGSEONG YAE
+<Multi_key> <U1165> <U1175>    : "ᅦ"   U1166 # HANGUL JUNGSEONG E
+<Multi_key> <U1167> <U1175>    : "ᅨ"   U1168 # HANGUL JUNGSEONG YE
+<Multi_key> <U1169> <U1161>    : "ᅪ"   U116a # HANGUL JUNGSEONG WA
+<Multi_key> <U1169> <U1175>    : "ᅬ"   U116c # HANGUL JUNGSEONG OE
+<Multi_key> <U116E> <U1165>    : "ᅯ"   U116f # HANGUL JUNGSEONG WEO
+<Multi_key> <U116E> <U1175>    : "ᅱ"   U1171 # HANGUL JUNGSEONG WI
+<Multi_key> <U1173> <U1175>    : "ᅴ"   U1174 # HANGUL JUNGSEONG YI
+<Multi_key> <U1161> <U1169>    : "ᅶ"   U1176 # HANGUL JUNGSEONG A-O
+<Multi_key> <U1161> <U116E>    : "ᅷ"   U1177 # HANGUL JUNGSEONG A-U
+<Multi_key> <U1163> <U1169>    : "ᅸ"   U1178 # HANGUL JUNGSEONG YA-O
+<Multi_key> <U1163> <U116D>    : "ᅹ"   U1179 # HANGUL JUNGSEONG YA-YO
+<Multi_key> <U1165> <U1169>    : "ᅺ"   U117a # HANGUL JUNGSEONG EO-O
+<Multi_key> <U1165> <U116E>    : "ᅻ"   U117b # HANGUL JUNGSEONG EO-U
+<Multi_key> <U1165> <U1173>    : "ᅼ"   U117c # HANGUL JUNGSEONG EO-EU
+<Multi_key> <U1167> <U1169>    : "ᅽ"   U117d # HANGUL JUNGSEONG YEO-O
+<Multi_key> <U1167> <U116E>    : "ᅾ"   U117e # HANGUL JUNGSEONG YEO-U
+<Multi_key> <U1169> <U1165>    : "ᅿ"   U117f # HANGUL JUNGSEONG O-EO
+<Multi_key> <U1169> <U1166>    : "ᆀ"   U1180 # HANGUL JUNGSEONG O-E
+<Multi_key> <U1169> <U1168>    : "ᆁ"   U1181 # HANGUL JUNGSEONG O-YE
+<Multi_key> <U1169> <U1169>    : "ᆂ"   U1182 # HANGUL JUNGSEONG O-O
+<Multi_key> <U1169> <U116E>    : "ᆃ"   U1183 # HANGUL JUNGSEONG O-U
+<Multi_key> <U116D> <U1163>    : "ᆄ"   U1184 # HANGUL JUNGSEONG YO-YA
+<Multi_key> <U116D> <U1164>    : "ᆅ"   U1185 # HANGUL JUNGSEONG YO-YAE
+<Multi_key> <U116D> <U1167>    : "ᆆ"   U1186 # HANGUL JUNGSEONG YO-YEO
+<Multi_key> <U116D> <U1169>    : "ᆇ"   U1187 # HANGUL JUNGSEONG YO-O
+<Multi_key> <U116D> <U1175>    : "ᆈ"   U1188 # HANGUL JUNGSEONG YO-I
+<Multi_key> <U116E> <U1161>    : "ᆉ"   U1189 # HANGUL JUNGSEONG U-A
+<Multi_key> <U116E> <U1162>    : "ᆊ"   U118a # HANGUL JUNGSEONG U-AE
+<Multi_key> <U116E> <U1168>    : "ᆌ"   U118c # HANGUL JUNGSEONG U-YE
+<Multi_key> <U116E> <U116E>    : "ᆍ"   U118d # HANGUL JUNGSEONG U-U
+<Multi_key> <U1172> <U1161>    : "ᆎ"   U118e # HANGUL JUNGSEONG YU-A
+<Multi_key> <U1172> <U1165>    : "ᆏ"   U118f # HANGUL JUNGSEONG YU-EO
+<Multi_key> <U1172> <U1166>    : "ᆐ"   U1190 # HANGUL JUNGSEONG YU-E
+<Multi_key> <U1172> <U1167>    : "ᆑ"   U1191 # HANGUL JUNGSEONG YU-YEO
+<Multi_key> <U1172> <U1168>    : "ᆒ"   U1192 # HANGUL JUNGSEONG YU-YE
+<Multi_key> <U1172> <U116E>    : "ᆓ"   U1193 # HANGUL JUNGSEONG YU-U
+<Multi_key> <U1172> <U1175>    : "ᆔ"   U1194 # HANGUL JUNGSEONG YU-I
+<Multi_key> <U1173> <U116E>    : "ᆕ"   U1195 # HANGUL JUNGSEONG EU-U
+<Multi_key> <U1173> <U1173>    : "ᆖ"   U1196 # HANGUL JUNGSEONG EU-EU
+<Multi_key> <U1174> <U116E>    : "ᆗ"   U1197 # HANGUL JUNGSEONG YI-U
+<Multi_key> <U1175> <U1161>    : "ᆘ"   U1198 # HANGUL JUNGSEONG I-A
+<Multi_key> <U1175> <U1163>    : "ᆙ"   U1199 # HANGUL JUNGSEONG I-YA
+<Multi_key> <U1175> <U1169>    : "ᆚ"   U119a # HANGUL JUNGSEONG I-O
+<Multi_key> <U1175> <U116E>    : "ᆛ"   U119b # HANGUL JUNGSEONG I-U
+<Multi_key> <U1175> <U1173>    : "ᆜ"   U119c # HANGUL JUNGSEONG I-EU
+<Multi_key> <U1175> <U119E>    : "ᆝ"   U119d # HANGUL JUNGSEONG I-ARAEA
+<Multi_key> <U119E> <U1165>    : "ᆟ"   U119f # HANGUL JUNGSEONG ARAEA-EO
+<Multi_key> <U119E> <U116E>    : "ᆠ"   U11a0 # HANGUL JUNGSEONG ARAEA-U
+<Multi_key> <U119E> <U1175>    : "ᆡ"   U11a1 # HANGUL JUNGSEONG ARAEA-I
+<Multi_key> <U119E> <U119E>    : "ᆢ"   U11a2 # HANGUL JUNGSEONG SSANGARAEA
+<Multi_key> <U11A8> <U11A8>    : "ᆩ"   U11a9 # HANGUL JONGSEONG SSANGKIYEOK
+<Multi_key> <U11A8> <U11BA>    : "ᆪ"   U11aa # HANGUL JONGSEONG KIYEOK-SIOS
+<Multi_key> <U11AB> <U11BD>    : "ᆬ"   U11ac # HANGUL JONGSEONG NIEUN-CIEUC
+<Multi_key> <U11AB> <U11C2>    : "ᆭ"   U11ad # HANGUL JONGSEONG NIEUN-HIEUH
+<Multi_key> <U11AF> <U11A8>    : "ᆰ"   U11b0 # HANGUL JONGSEONG RIEUL-KIYEOK
+<Multi_key> <U11AF> <U11B7>    : "ᆱ"   U11b1 # HANGUL JONGSEONG RIEUL-MIEUM
+<Multi_key> <U11AF> <U11B8>    : "ᆲ"   U11b2 # HANGUL JONGSEONG RIEUL-PIEUP
+<Multi_key> <U11AF> <U11BA>    : "ᆳ"   U11b3 # HANGUL JONGSEONG RIEUL-SIOS
+<Multi_key> <U11AF> <U11C0>    : "ᆴ"   U11b4 # HANGUL JONGSEONG RIEUL-THIEUTH
+<Multi_key> <U11AF> <U11C1>    : "ᆵ"   U11b5 # HANGUL JONGSEONG RIEUL-PHIEUPH
+<Multi_key> <U11AF> <U11C2>    : "ᆶ"   U11b6 # HANGUL JONGSEONG RIEUL-HIEUH
+<Multi_key> <U11B8> <U11BA>    : "ᆹ"   U11b9 # HANGUL JONGSEONG PIEUP-SIOS
+<Multi_key> <U11BA> <U11BA>    : "ᆻ"   U11bb # HANGUL JONGSEONG SSANGSIOS
+<Multi_key> <U11A8> <U11AF>    : "ᇃ"   U11c3 # HANGUL JONGSEONG KIYEOK-RIEUL
+<Multi_key> <U11AB> <U11A8>    : "ᇅ"   U11c5 # HANGUL JONGSEONG NIEUN-KIYEOK
+<Multi_key> <U11AB> <U11AE>    : "ᇆ"   U11c6 # HANGUL JONGSEONG NIEUN-TIKEUT
+<Multi_key> <U11AB> <U11BA>    : "ᇇ"   U11c7 # HANGUL JONGSEONG NIEUN-SIOS
+<Multi_key> <U11AB> <U11EB>    : "ᇈ"   U11c8 # HANGUL JONGSEONG NIEUN-PANSIOS
+<Multi_key> <U11AB> <U11C0>    : "ᇉ"   U11c9 # HANGUL JONGSEONG NIEUN-THIEUTH
+<Multi_key> <U11AE> <U11A8>    : "ᇊ"   U11ca # HANGUL JONGSEONG TIKEUT-KIYEOK
+<Multi_key> <U11AE> <U11AF>    : "ᇋ"   U11cb # HANGUL JONGSEONG TIKEUT-RIEUL
+<Multi_key> <U11AF> <U11AB>    : "ᇍ"   U11cd # HANGUL JONGSEONG RIEUL-NIEUN
+<Multi_key> <U11AF> <U11AE>    : "ᇎ"   U11ce # HANGUL JONGSEONG RIEUL-TIKEUT
+<Multi_key> <U11AF> <U11AF>    : "ᇐ"   U11d0 # HANGUL JONGSEONG SSANGRIEUL
+<Multi_key> <U11AF> <U11EB>    : "ᇗ"   U11d7 # HANGUL JONGSEONG RIEUL-PANSIOS
+<Multi_key> <U11AF> <U11BF>    : "ᇘ"   U11d8 # HANGUL JONGSEONG RIEUL-KHIEUKH
+<Multi_key> <U11AF> <U11F9>    : "ᇙ"   U11d9 # HANGUL JONGSEONG RIEUL-YEORINHIEUH
+<Multi_key> <U11B7> <U11A8>    : "ᇚ"   U11da # HANGUL JONGSEONG MIEUM-KIYEOK
+<Multi_key> <U11B7> <U11AF>    : "ᇛ"   U11db # HANGUL JONGSEONG MIEUM-RIEUL
+<Multi_key> <U11B7> <U11B8>    : "ᇜ"   U11dc # HANGUL JONGSEONG MIEUM-PIEUP
+<Multi_key> <U11B7> <U11BA>    : "ᇝ"   U11dd # HANGUL JONGSEONG MIEUM-SIOS
+<Multi_key> <U11B7> <U11EB>    : "ᇟ"   U11df # HANGUL JONGSEONG MIEUM-PANSIOS
+<Multi_key> <U11B7> <U11BE>    : "ᇠ"   U11e0 # HANGUL JONGSEONG MIEUM-CHIEUCH
+<Multi_key> <U11B7> <U11C2>    : "ᇡ"   U11e1 # HANGUL JONGSEONG MIEUM-HIEUH
+<Multi_key> <U11B7> <U11BC>    : "ᇢ"   U11e2 # HANGUL JONGSEONG KAPYEOUNMIEUM
+<Multi_key> <U11B8> <U11AF>    : "ᇣ"   U11e3 # HANGUL JONGSEONG PIEUP-RIEUL
+<Multi_key> <U11B8> <U11C1>    : "ᇤ"   U11e4 # HANGUL JONGSEONG PIEUP-PHIEUPH
+<Multi_key> <U11B8> <U11C2>    : "ᇥ"   U11e5 # HANGUL JONGSEONG PIEUP-HIEUH
+<Multi_key> <U11B8> <U11BC>    : "ᇦ"   U11e6 # HANGUL JONGSEONG KAPYEOUNPIEUP
+<Multi_key> <U11BA> <U11A8>    : "ᇧ"   U11e7 # HANGUL JONGSEONG SIOS-KIYEOK
+<Multi_key> <U11BA> <U11AE>    : "ᇨ"   U11e8 # HANGUL JONGSEONG SIOS-TIKEUT
+<Multi_key> <U11BA> <U11AF>    : "ᇩ"   U11e9 # HANGUL JONGSEONG SIOS-RIEUL
+<Multi_key> <U11BA> <U11B8>    : "ᇪ"   U11ea # HANGUL JONGSEONG SIOS-PIEUP
+<Multi_key> <U11BC> <U11A8>    : "ᇬ"   U11ec # HANGUL JONGSEONG IEUNG-KIYEOK
+<Multi_key> <U11BC> <U11BC>    : "ᇮ"   U11ee # HANGUL JONGSEONG SSANGIEUNG
+<Multi_key> <U11BC> <U11BF>    : "ᇯ"   U11ef # HANGUL JONGSEONG IEUNG-KHIEUKH
+<Multi_key> <U11F0> <U11BA>    : "ᇱ"   U11f1 # HANGUL JONGSEONG YESIEUNG-SIOS
+<Multi_key> <U11F0> <U11EB>    : "ᇲ"   U11f2 # HANGUL JONGSEONG YESIEUNG-PANSIOS
+<Multi_key> <U11C1> <U11B8>    : "ᇳ"   U11f3 # HANGUL JONGSEONG PHIEUPH-PIEUP
+<Multi_key> <U11C1> <U11BC>    : "ᇴ"   U11f4 # HANGUL JONGSEONG KAPYEOUNPHIEUPH
+<Multi_key> <U11C2> <U11AB>    : "ᇵ"   U11f5 # HANGUL JONGSEONG HIEUH-NIEUN
+<Multi_key> <U11C2> <U11AF>    : "ᇶ"   U11f6 # HANGUL JONGSEONG HIEUH-RIEUL
+<Multi_key> <U11C2> <U11B7>    : "ᇷ"   U11f7 # HANGUL JONGSEONG HIEUH-MIEUM
+<Multi_key> <U11C2> <U11B8>    : "ᇸ"   U11f8 # HANGUL JONGSEONG HIEUH-PIEUP
+<Multi_key> <U1121> <U1100>    : "ᄢ"   U1122 # HANGUL CHOSEONG PIEUP-SIOS-KIYEOK
+<Multi_key> <U1121> <U1103>    : "ᄣ"   U1123 # HANGUL CHOSEONG PIEUP-SIOS-TIKEUT
+<Multi_key> <U1121> <U1107>    : "ᄤ"   U1124 # HANGUL CHOSEONG PIEUP-SIOS-PIEUP
+<Multi_key> <U1121> <U1109>    : "ᄥ"   U1125 # HANGUL CHOSEONG PIEUP-SSANGSIOS
+<Multi_key> <U1121> <U110C>    : "ᄦ"   U1126 # HANGUL CHOSEONG PIEUP-SIOS-CIEUC
+<Multi_key> <U1108> <U110B>    : "ᄬ"   U112c # HANGUL CHOSEONG KAPYEOUNSSANGPIEUP
+<Multi_key> <U1132> <U1100>    : "ᄳ"   U1133 # HANGUL CHOSEONG SIOS-PIEUP-KIYEOK
+<Multi_key> <U110A> <U1109>    : "ᄴ"   U1134 # HANGUL CHOSEONG SIOS-SSANGSIOS
+<Multi_key> <U116A> <U1175>    : "ᅫ"   U116b # HANGUL JUNGSEONG WAE
+<Multi_key> <U116F> <U1175>    : "ᅰ"   U1170 # HANGUL JUNGSEONG WE
+<Multi_key> <U116F> <U1173>    : "ᆋ"   U118b # HANGUL JUNGSEONG U-EO-EU
+<Multi_key> <U11AA> <U11A8>    : "ᇄ"   U11c4 # HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK
+<Multi_key> <U11B0> <U11BA>    : "ᇌ"   U11cc # HANGUL JONGSEONG RIEUL-KIYEOK-SIOS
+<Multi_key> <U11CE> <U11C2>    : "ᇏ"   U11cf # HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH
+<Multi_key> <U11B1> <U11A8>    : "ᇑ"   U11d1 # HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK
+<Multi_key> <U11B1> <U11BA>    : "ᇒ"   U11d2 # HANGUL JONGSEONG RIEUL-MIEUM-SIOS
+<Multi_key> <U11B2> <U11BA>    : "ᇓ"   U11d3 # HANGUL JONGSEONG RIEUL-PIEUP-SIOS
+<Multi_key> <U11B2> <U11C2>    : "ᇔ"   U11d4 # HANGUL JONGSEONG RIEUL-PIEUP-HIEUH
+<Multi_key> <U11B2> <U11BC>    : "ᇕ"   U11d5 # HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP
+<Multi_key> <U11B3> <U11BA>    : "ᇖ"   U11d6 # HANGUL JONGSEONG RIEUL-SSANGSIOS
+<Multi_key> <U11DD> <U11BA>    : "ᇞ"   U11de # HANGUL JONGSEONG MIEUM-SSANGSIOS
+<Multi_key> <U11EC> <U11A8>    : "ᇭ"   U11ed # HANGUL JONGSEONG IEUNG-SSANGKIYEOK
+<Multi_key> <U1107> <U112D>    : "ᄢ"   U1122 # HANGUL CHOSEONG PIEUP-SIOS-KIYEOK
+<Multi_key> <U1107> <U112F>    : "ᄣ"   U1123 # HANGUL CHOSEONG PIEUP-SIOS-TIKEUT
+<Multi_key> <U1107> <U1132>    : "ᄤ"   U1124 # HANGUL CHOSEONG PIEUP-SIOS-PIEUP
+<Multi_key> <U1107> <U110A>    : "ᄥ"   U1125 # HANGUL CHOSEONG PIEUP-SSANGSIOS
+<Multi_key> <U1107> <U1136>    : "ᄦ"   U1126 # HANGUL CHOSEONG PIEUP-SIOS-CIEUC
+<Multi_key> <U1107> <U112B>    : "ᄬ"   U112c # HANGUL CHOSEONG KAPYEOUNSSANGPIEUP
+<Multi_key> <U1109> <U111E>    : "ᄳ"   U1133 # HANGUL CHOSEONG SIOS-PIEUP-KIYEOK
+<Multi_key> <U1109> <U110A>    : "ᄴ"   U1134 # HANGUL CHOSEONG SIOS-SSANGSIOS
+<Multi_key> <U1169> <U1162>    : "ᅫ"   U116b # HANGUL JUNGSEONG WAE
+<Multi_key> <U116E> <U1166>    : "ᅰ"   U1170 # HANGUL JUNGSEONG WE
+<Multi_key> <U116E> <U117C>    : "ᆋ"   U118b # HANGUL JUNGSEONG U-EO-EU
+<Multi_key> <U11A8> <U11E7>    : "ᇄ"   U11c4 # HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK
+<Multi_key> <U11AF> <U11AA>    : "ᇌ"   U11cc # HANGUL JONGSEONG RIEUL-KIYEOK-SIOS
+<Multi_key> <U11AF> <U11DA>    : "ᇑ"   U11d1 # HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK
+<Multi_key> <U11AF> <U11DD>    : "ᇒ"   U11d2 # HANGUL JONGSEONG RIEUL-MIEUM-SIOS
+<Multi_key> <U11AF> <U11B9>    : "ᇓ"   U11d3 # HANGUL JONGSEONG RIEUL-PIEUP-SIOS
+<Multi_key> <U11AF> <U11E5>    : "ᇔ"   U11d4 # HANGUL JONGSEONG RIEUL-PIEUP-HIEUH
+<Multi_key> <U11AF> <U11E6>    : "ᇕ"   U11d5 # HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP
+<Multi_key> <U11AF> <U11BB>    : "ᇖ"   U11d6 # HANGUL JONGSEONG RIEUL-SSANGSIOS
+<Multi_key> <U11B7> <U11BB>    : "ᇞ"   U11de # HANGUL JONGSEONG MIEUM-SSANGSIOS
+<Multi_key> <U11BC> <U11A9>    : "ᇭ"   U11ed # HANGUL JONGSEONG IEUNG-SSANGKIYEOK
+
+XCOMM Part 3
+<Multi_key> <comma> <minus>            : "¬"   notsign # NOT SIGN
+<Multi_key> <minus> <comma>            : "¬"   notsign # NOT SIGN
+<dead_circumflex> <Multi_key> <underscore> <a>         : "ª"   ordfeminine # FEMININE ORDINAL INDICATOR
+<Multi_key> <asciicircum> <underscore> <a>     : "ª"   ordfeminine # FEMININE ORDINAL INDICATOR
+<dead_circumflex> <Multi_key> <underbar> <a>   : "ª"   ordfeminine # FEMININE ORDINAL INDICATOR
+<Multi_key> <asciicircum> <underbar> <a>       : "ª"   ordfeminine # FEMININE ORDINAL INDICATOR
+<dead_circumflex> <2>                  : "²"   twosuperior # SUPERSCRIPT TWO
+<Multi_key> <asciicircum> <2>          : "²"   twosuperior # SUPERSCRIPT TWO
+<dead_circumflex> <KP_Space>           : "²"   twosuperior # SUPERSCRIPT TWO
+<Multi_key> <asciicircum> <KP_Space>   : "²"   twosuperior # SUPERSCRIPT TWO
+<dead_circumflex> <KP_2>               : "²"   twosuperior # SUPERSCRIPT TWO
+<Multi_key> <asciicircum> <KP_2>       : "²"   twosuperior # SUPERSCRIPT TWO
+<Multi_key> <2> <asciicircum>          : "²"   twosuperior # SUPERSCRIPT TWO
+<dead_circumflex> <3>                  : "³"   threesuperior # SUPERSCRIPT THREE
+<Multi_key> <asciicircum> <3>          : "³"   threesuperior # SUPERSCRIPT THREE
+<dead_circumflex> <KP_3>               : "³"   threesuperior # SUPERSCRIPT THREE
+<Multi_key> <asciicircum> <KP_3>       : "³"   threesuperior # SUPERSCRIPT THREE
+<Multi_key> <3> <asciicircum>          : "³"   threesuperior # SUPERSCRIPT THREE
+<Multi_key> <m> <u>                    : "µ"   mu # MICRO SIGN
+<Multi_key> <slash> <u>                : "µ"   mu # MICRO SIGN
+<Multi_key> <u> <slash>                : "µ"   mu # MICRO SIGN
+<dead_circumflex> <1>                  : "¹"   onesuperior # SUPERSCRIPT ONE
+<Multi_key> <asciicircum> <1>          : "¹"   onesuperior # SUPERSCRIPT ONE
+<dead_circumflex> <KP_1>               : "¹"   onesuperior # SUPERSCRIPT ONE
+<Multi_key> <asciicircum> <KP_1>       : "¹"   onesuperior # SUPERSCRIPT ONE
+<Multi_key> <1> <asciicircum>          : "¹"   onesuperior # SUPERSCRIPT ONE
+<dead_circumflex> <Multi_key> <underscore> <o>         : "º"   masculine # MASCULINE ORDINAL INDICATOR
+<Multi_key> <asciicircum> <underscore> <o>     : "º"   masculine # MASCULINE ORDINAL INDICATOR
+<dead_circumflex> <Multi_key> <underbar> <o>   : "º"   masculine # MASCULINE ORDINAL INDICATOR
+<Multi_key> <asciicircum> <underbar> <o>       : "º"   masculine # MASCULINE ORDINAL INDICATOR
+<Multi_key> <1> <4>                    : "¼"   onequarter # VULGAR FRACTION ONE QUARTER
+<Multi_key> <1> <2>                    : "½"   onehalf # VULGAR FRACTION ONE HALF
+<Multi_key> <3> <4>                    : "¾"   threequarters # VULGAR FRACTION THREE QUARTERS
+<dead_grave> <A>                       : "À"   Agrave # LATIN CAPITAL LETTER A WITH GRAVE
+<Multi_key> <grave> <A>                : "À"   Agrave # LATIN CAPITAL LETTER A WITH GRAVE
+<Multi_key> <A> <grave>                : "À"   Agrave # LATIN CAPITAL LETTER A WITH GRAVE
+<dead_acute> <A>                       : "Á"   Aacute # LATIN CAPITAL LETTER A WITH ACUTE
+<Multi_key> <acute> <A>                : "Á"   Aacute # LATIN CAPITAL LETTER A WITH ACUTE
+<Multi_key> <apostrophe> <A>           : "Á"   Aacute # LATIN CAPITAL LETTER A WITH ACUTE
+<Multi_key> <A> <apostrophe>           : "Á"   Aacute # LATIN CAPITAL LETTER A WITH ACUTE
+<Multi_key> <A> <acute>                : "Á"   Aacute # LATIN CAPITAL LETTER A WITH ACUTE
+<dead_circumflex> <A>                  : "Â"   Acircumflex # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <A>          : "Â"   Acircumflex # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+<Multi_key> <greater> <A>              : "Â"   Acircumflex # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+<Multi_key> <A> <greater>              : "Â"   Acircumflex # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+<Multi_key> <A> <asciicircum>          : "Â"   Acircumflex # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+<dead_tilde> <A>                       : "Ã"   Atilde # LATIN CAPITAL LETTER A WITH TILDE
+<Multi_key> <asciitilde> <A>           : "Ã"   Atilde # LATIN CAPITAL LETTER A WITH TILDE
+<Multi_key> <A> <asciitilde>           : "Ã"   Atilde # LATIN CAPITAL LETTER A WITH TILDE
+<dead_diaeresis> <A>                   : "Ä"   Adiaeresis # LATIN CAPITAL LETTER A WITH DIAERESIS
+<Multi_key> <quotedbl> <A>             : "Ä"   Adiaeresis # LATIN CAPITAL LETTER A WITH DIAERESIS
+<Multi_key> <A> <quotedbl>             : "Ä"   Adiaeresis # LATIN CAPITAL LETTER A WITH DIAERESIS
+<Multi_key> <A> <diaeresis>            : "Ä"   Adiaeresis # LATIN CAPITAL LETTER A WITH DIAERESIS
+<Multi_key> <diaeresis> <A>            : "Ä"   Adiaeresis # LATIN CAPITAL LETTER A WITH DIAERESIS
+<dead_abovering> <A>                   : "Å"   Aring # LATIN CAPITAL LETTER A WITH RING ABOVE
+<Multi_key> <o> <A>                    : "Å"   Aring # LATIN CAPITAL LETTER A WITH RING ABOVE
+<Multi_key> <asterisk> <A>             : "Å"   Aring # LATIN CAPITAL LETTER A WITH RING ABOVE
+<Multi_key> <A> <asterisk>             : "Å"   Aring # LATIN CAPITAL LETTER A WITH RING ABOVE
+<Multi_key> <A> <A>                    : "Å"   Aring # LATIN CAPITAL LETTER A WITH RING ABOVE
+<dead_cedilla> <C>                     : "Ç"   Ccedilla # LATIN CAPITAL LETTER C WITH CEDILLA
+<Multi_key> <comma> <C>                : "Ç"   Ccedilla # LATIN CAPITAL LETTER C WITH CEDILLA
+<Multi_key> <C> <comma>                : "Ç"   Ccedilla # LATIN CAPITAL LETTER C WITH CEDILLA
+<Multi_key> <cedilla> <C>              : "Ç"   Ccedilla # LATIN CAPITAL LETTER C WITH CEDILLA
+<dead_grave> <E>                       : "È"   Egrave # LATIN CAPITAL LETTER E WITH GRAVE
+<Multi_key> <grave> <E>                : "È"   Egrave # LATIN CAPITAL LETTER E WITH GRAVE
+<Multi_key> <E> <grave>                : "È"   Egrave # LATIN CAPITAL LETTER E WITH GRAVE
+<dead_acute> <E>                       : "É"   Eacute # LATIN CAPITAL LETTER E WITH ACUTE
+<Multi_key> <acute> <E>                : "É"   Eacute # LATIN CAPITAL LETTER E WITH ACUTE
+<Multi_key> <apostrophe> <E>           : "É"   Eacute # LATIN CAPITAL LETTER E WITH ACUTE
+<Multi_key> <E> <apostrophe>           : "É"   Eacute # LATIN CAPITAL LETTER E WITH ACUTE
+<Multi_key> <E> <acute>                : "É"   Eacute # LATIN CAPITAL LETTER E WITH ACUTE
+<dead_circumflex> <E>                  : "Ê"   Ecircumflex # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <E>          : "Ê"   Ecircumflex # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+<Multi_key> <greater> <E>              : "Ê"   Ecircumflex # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+<Multi_key> <E> <greater>              : "Ê"   Ecircumflex # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+<Multi_key> <E> <asciicircum>          : "Ê"   Ecircumflex # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+<dead_diaeresis> <E>                   : "Ë"   Ediaeresis # LATIN CAPITAL LETTER E WITH DIAERESIS
+<Multi_key> <quotedbl> <E>             : "Ë"   Ediaeresis # LATIN CAPITAL LETTER E WITH DIAERESIS
+<Multi_key> <E> <quotedbl>             : "Ë"   Ediaeresis # LATIN CAPITAL LETTER E WITH DIAERESIS
+<Multi_key> <E> <diaeresis>            : "Ë"   Ediaeresis # LATIN CAPITAL LETTER E WITH DIAERESIS
+<Multi_key> <diaeresis> <E>            : "Ë"   Ediaeresis # LATIN CAPITAL LETTER E WITH DIAERESIS
+<dead_grave> <I>                       : "Ì"   Igrave # LATIN CAPITAL LETTER I WITH GRAVE
+<Multi_key> <grave> <I>                : "Ì"   Igrave # LATIN CAPITAL LETTER I WITH GRAVE
+<Multi_key> <I> <grave>                : "Ì"   Igrave # LATIN CAPITAL LETTER I WITH GRAVE
+<dead_acute> <I>                       : "Í"   Iacute # LATIN CAPITAL LETTER I WITH ACUTE
+<Multi_key> <acute> <I>                : "Í"   Iacute # LATIN CAPITAL LETTER I WITH ACUTE
+<Multi_key> <I> <acute>                : "Í"   Iacute # LATIN CAPITAL LETTER I WITH ACUTE
+<Multi_key> <apostrophe> <I>           : "Í"   Iacute # LATIN CAPITAL LETTER I WITH ACUTE
+<Multi_key> <I> <apostrophe>           : "Í"   Iacute # LATIN CAPITAL LETTER I WITH ACUTE
+<dead_circumflex> <I>                  : "Î"   Icircumflex # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <I>          : "Î"   Icircumflex # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+<Multi_key> <I> <asciicircum>          : "Î"   Icircumflex # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+<Multi_key> <greater> <I>              : "Î"   Icircumflex # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+<Multi_key> <I> <greater>              : "Î"   Icircumflex # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+<dead_diaeresis> <I>                   : "Ï"   Idiaeresis # LATIN CAPITAL LETTER I WITH DIAERESIS
+<Multi_key> <quotedbl> <I>             : "Ï"   Idiaeresis # LATIN CAPITAL LETTER I WITH DIAERESIS
+<Multi_key> <I> <quotedbl>             : "Ï"   Idiaeresis # LATIN CAPITAL LETTER I WITH DIAERESIS
+<Multi_key> <diaeresis> <I>            : "Ï"   Idiaeresis # LATIN CAPITAL LETTER I WITH DIAERESIS
+<Multi_key> <I> <diaeresis>            : "Ï"   Idiaeresis # LATIN CAPITAL LETTER I WITH DIAERESIS
+<Multi_key> <D> <H>                    : "Ð"   ETH # LATIN CAPITAL LETTER ETH
+<dead_tilde> <N>                       : "Ñ"   Ntilde # LATIN CAPITAL LETTER N WITH TILDE
+<Multi_key> <asciitilde> <N>           : "Ñ"   Ntilde # LATIN CAPITAL LETTER N WITH TILDE
+<Multi_key> <N> <asciitilde>           : "Ñ"   Ntilde # LATIN CAPITAL LETTER N WITH TILDE
+<dead_grave> <O>                       : "Ò"   Ograve # LATIN CAPITAL LETTER O WITH GRAVE
+<Multi_key> <grave> <O>                : "Ò"   Ograve # LATIN CAPITAL LETTER O WITH GRAVE
+<Multi_key> <O> <grave>                : "Ò"   Ograve # LATIN CAPITAL LETTER O WITH GRAVE
+<dead_acute> <O>                       : "Ó"   Oacute # LATIN CAPITAL LETTER O WITH ACUTE
+<Multi_key> <acute> <O>                : "Ó"   Oacute # LATIN CAPITAL LETTER O WITH ACUTE
+<Multi_key> <O> <acute>                : "Ó"   Oacute # LATIN CAPITAL LETTER O WITH ACUTE
+<Multi_key> <apostrophe> <O>           : "Ó"   Oacute # LATIN CAPITAL LETTER O WITH ACUTE
+<Multi_key> <O> <apostrophe>           : "Ó"   Oacute # LATIN CAPITAL LETTER O WITH ACUTE
+<dead_circumflex> <O>                  : "Ô"   Ocircumflex # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <O>          : "Ô"   Ocircumflex # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+<Multi_key> <O> <asciicircum>          : "Ô"   Ocircumflex # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+<Multi_key> <greater> <O>              : "Ô"   Ocircumflex # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+<Multi_key> <O> <greater>              : "Ô"   Ocircumflex # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+<dead_tilde> <O>                       : "Õ"   Otilde # LATIN CAPITAL LETTER O WITH TILDE
+<Multi_key> <asciitilde> <O>           : "Õ"   Otilde # LATIN CAPITAL LETTER O WITH TILDE
+<Multi_key> <O> <asciitilde>           : "Õ"   Otilde # LATIN CAPITAL LETTER O WITH TILDE
+<dead_diaeresis> <O>                   : "Ö"   Odiaeresis # LATIN CAPITAL LETTER O WITH DIAERESIS
+<Multi_key> <quotedbl> <O>             : "Ö"   Odiaeresis # LATIN CAPITAL LETTER O WITH DIAERESIS
+<Multi_key> <O> <quotedbl>             : "Ö"   Odiaeresis # LATIN CAPITAL LETTER O WITH DIAERESIS
+<Multi_key> <diaeresis> <O>            : "Ö"   Odiaeresis # LATIN CAPITAL LETTER O WITH DIAERESIS
+<Multi_key> <O> <diaeresis>            : "Ö"   Odiaeresis # LATIN CAPITAL LETTER O WITH DIAERESIS
+<Multi_key> <x> <x>                    : "×"   multiply # MULTIPLICATION SIGN
+<dead_stroke> <O>                      : "Ø"   Oslash # LATIN CAPITAL LETTER O WITH STROKE
+<Multi_key> <slash> <O>                : "Ø"   Oslash # LATIN CAPITAL LETTER O WITH STROKE
+<Multi_key> <O> <slash>                : "Ø"   Oslash # LATIN CAPITAL LETTER O WITH STROKE
+<Multi_key> <KP_Divide> <O>            : "Ø"   Oslash # LATIN CAPITAL LETTER O WITH STROKE
+<dead_grave> <U>                       : "Ù"   Ugrave # LATIN CAPITAL LETTER U WITH GRAVE
+<Multi_key> <grave> <U>                : "Ù"   Ugrave # LATIN CAPITAL LETTER U WITH GRAVE
+<Multi_key> <U> <grave>                : "Ù"   Ugrave # LATIN CAPITAL LETTER U WITH GRAVE
+<dead_acute> <U>                       : "Ú"   Uacute # LATIN CAPITAL LETTER U WITH ACUTE
+<Multi_key> <acute> <U>                : "Ú"   Uacute # LATIN CAPITAL LETTER U WITH ACUTE
+<Multi_key> <U> <acute>                : "Ú"   Uacute # LATIN CAPITAL LETTER U WITH ACUTE
+<Multi_key> <apostrophe> <U>           : "Ú"   Uacute # LATIN CAPITAL LETTER U WITH ACUTE
+<Multi_key> <U> <apostrophe>           : "Ú"   Uacute # LATIN CAPITAL LETTER U WITH ACUTE
+<dead_circumflex> <U>                  : "Û"   Ucircumflex # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <U>          : "Û"   Ucircumflex # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+<Multi_key> <U> <asciicircum>          : "Û"   Ucircumflex # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+<Multi_key> <greater> <U>              : "Û"   Ucircumflex # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+<Multi_key> <U> <greater>              : "Û"   Ucircumflex # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+<dead_diaeresis> <U>                   : "Ü"   Udiaeresis # LATIN CAPITAL LETTER U WITH DIAERESIS
+<Multi_key> <quotedbl> <U>             : "Ü"   Udiaeresis # LATIN CAPITAL LETTER U WITH DIAERESIS
+<Multi_key> <U> <quotedbl>             : "Ü"   Udiaeresis # LATIN CAPITAL LETTER U WITH DIAERESIS
+<Multi_key> <diaeresis> <U>            : "Ü"   Udiaeresis # LATIN CAPITAL LETTER U WITH DIAERESIS
+<Multi_key> <U> <diaeresis>            : "Ü"   Udiaeresis # LATIN CAPITAL LETTER U WITH DIAERESIS
+<dead_acute> <Y>                       : "Ý"   Yacute # LATIN CAPITAL LETTER Y WITH ACUTE
+<Multi_key> <acute> <Y>                : "Ý"   Yacute # LATIN CAPITAL LETTER Y WITH ACUTE
+<Multi_key> <Y> <acute>                : "Ý"   Yacute # LATIN CAPITAL LETTER Y WITH ACUTE
+<Multi_key> <apostrophe> <Y>           : "Ý"   Yacute # LATIN CAPITAL LETTER Y WITH ACUTE
+<Multi_key> <Y> <apostrophe>           : "Ý"   Yacute # LATIN CAPITAL LETTER Y WITH ACUTE
+<Multi_key> <T> <H>                    : "Þ"   THORN # LATIN CAPITAL LETTER THORN
+<dead_grave> <a>                       : "à"   agrave # LATIN SMALL LETTER A WITH GRAVE
+<Multi_key> <grave> <a>                : "à"   agrave # LATIN SMALL LETTER A WITH GRAVE
+<Multi_key> <a> <grave>                : "à"   agrave # LATIN SMALL LETTER A WITH GRAVE
+<dead_acute> <a>                       : "á"   aacute # LATIN SMALL LETTER A WITH ACUTE
+<Multi_key> <acute> <a>                : "á"   aacute # LATIN SMALL LETTER A WITH ACUTE
+<Multi_key> <a> <acute>                : "á"   aacute # LATIN SMALL LETTER A WITH ACUTE
+<Multi_key> <apostrophe> <a>           : "á"   aacute # LATIN SMALL LETTER A WITH ACUTE
+<Multi_key> <a> <apostrophe>           : "á"   aacute # LATIN SMALL LETTER A WITH ACUTE
+<dead_circumflex> <a>                  : "â"   acircumflex # LATIN SMALL LETTER A WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <a>          : "â"   acircumflex # LATIN SMALL LETTER A WITH CIRCUMFLEX
+<Multi_key> <a> <asciicircum>          : "â"   acircumflex # LATIN SMALL LETTER A WITH CIRCUMFLEX
+<Multi_key> <greater> <a>              : "â"   acircumflex # LATIN SMALL LETTER A WITH CIRCUMFLEX
+<Multi_key> <a> <greater>              : "â"   acircumflex # LATIN SMALL LETTER A WITH CIRCUMFLEX
+<dead_tilde> <a>                       : "ã"   atilde # LATIN SMALL LETTER A WITH TILDE
+<Multi_key> <asciitilde> <a>           : "ã"   atilde # LATIN SMALL LETTER A WITH TILDE
+<Multi_key> <a> <asciitilde>           : "ã"   atilde # LATIN SMALL LETTER A WITH TILDE
+<dead_diaeresis> <a>                   : "ä"   adiaeresis # LATIN SMALL LETTER A WITH DIAERESIS
+<Multi_key> <quotedbl> <a>             : "ä"   adiaeresis # LATIN SMALL LETTER A WITH DIAERESIS
+<Multi_key> <a> <quotedbl>             : "ä"   adiaeresis # LATIN SMALL LETTER A WITH DIAERESIS
+<Multi_key> <diaeresis> <a>            : "ä"   adiaeresis # LATIN SMALL LETTER A WITH DIAERESIS
+<Multi_key> <a> <diaeresis>            : "ä"   adiaeresis # LATIN SMALL LETTER A WITH DIAERESIS
+<dead_abovering> <a>                   : "å"   aring # LATIN SMALL LETTER A WITH RING ABOVE
+<Multi_key> <o> <a>                    : "å"   aring # LATIN SMALL LETTER A WITH RING ABOVE
+<Multi_key> <asterisk> <a>             : "å"   aring # LATIN SMALL LETTER A WITH RING ABOVE
+<Multi_key> <a> <asterisk>             : "å"   aring # LATIN SMALL LETTER A WITH RING ABOVE
+<Multi_key> <a> <a>                    : "å"   aring # LATIN SMALL LETTER A WITH RING ABOVE
+<dead_cedilla> <c>                     : "ç"   ccedilla # LATIN SMALL LETTER C WITH CEDILLA
+<Multi_key> <comma> <c>                : "ç"   ccedilla # LATIN SMALL LETTER C WITH CEDILLA
+<Multi_key> <c> <comma>                : "ç"   ccedilla # LATIN SMALL LETTER C WITH CEDILLA
+<Multi_key> <cedilla> <c>              : "ç"   ccedilla # LATIN SMALL LETTER C WITH CEDILLA
+<dead_grave> <e>                       : "è"   egrave # LATIN SMALL LETTER E WITH GRAVE
+<Multi_key> <grave> <e>                : "è"   egrave # LATIN SMALL LETTER E WITH GRAVE
+<Multi_key> <e> <grave>                : "è"   egrave # LATIN SMALL LETTER E WITH GRAVE
+<dead_acute> <e>                       : "é"   eacute # LATIN SMALL LETTER E WITH ACUTE
+<Multi_key> <acute> <e>                : "é"   eacute # LATIN SMALL LETTER E WITH ACUTE
+<Multi_key> <e> <acute>                : "é"   eacute # LATIN SMALL LETTER E WITH ACUTE
+<Multi_key> <apostrophe> <e>           : "é"   eacute # LATIN SMALL LETTER E WITH ACUTE
+<Multi_key> <e> <apostrophe>           : "é"   eacute # LATIN SMALL LETTER E WITH ACUTE
+<dead_circumflex> <e>                  : "ê"   ecircumflex # LATIN SMALL LETTER E WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <e>          : "ê"   ecircumflex # LATIN SMALL LETTER E WITH CIRCUMFLEX
+<Multi_key> <e> <asciicircum>          : "ê"   ecircumflex # LATIN SMALL LETTER E WITH CIRCUMFLEX
+<Multi_key> <greater> <e>              : "ê"   ecircumflex # LATIN SMALL LETTER E WITH CIRCUMFLEX
+<Multi_key> <e> <greater>              : "ê"   ecircumflex # LATIN SMALL LETTER E WITH CIRCUMFLEX
+<dead_diaeresis> <e>                   : "ë"   ediaeresis # LATIN SMALL LETTER E WITH DIAERESIS
+<Multi_key> <quotedbl> <e>             : "ë"   ediaeresis # LATIN SMALL LETTER E WITH DIAERESIS
+<Multi_key> <e> <quotedbl>             : "ë"   ediaeresis # LATIN SMALL LETTER E WITH DIAERESIS
+<Multi_key> <diaeresis> <e>            : "ë"   ediaeresis # LATIN SMALL LETTER E WITH DIAERESIS
+<Multi_key> <e> <diaeresis>            : "ë"   ediaeresis # LATIN SMALL LETTER E WITH DIAERESIS
+<dead_grave> <i>                       : "ì"   igrave # LATIN SMALL LETTER I WITH GRAVE
+<Multi_key> <grave> <i>                : "ì"   igrave # LATIN SMALL LETTER I WITH GRAVE
+<Multi_key> <i> <grave>                : "ì"   igrave # LATIN SMALL LETTER I WITH GRAVE
+<dead_acute> <i>                       : "í"   iacute # LATIN SMALL LETTER I WITH ACUTE
+<Multi_key> <acute> <i>                : "í"   iacute # LATIN SMALL LETTER I WITH ACUTE
+<Multi_key> <i> <acute>                : "í"   iacute # LATIN SMALL LETTER I WITH ACUTE
+<Multi_key> <apostrophe> <i>           : "í"   iacute # LATIN SMALL LETTER I WITH ACUTE
+<Multi_key> <i> <apostrophe>           : "í"   iacute # LATIN SMALL LETTER I WITH ACUTE
+<dead_circumflex> <i>                  : "î"   icircumflex # LATIN SMALL LETTER I WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <i>          : "î"   icircumflex # LATIN SMALL LETTER I WITH CIRCUMFLEX
+<Multi_key> <i> <asciicircum>          : "î"   icircumflex # LATIN SMALL LETTER I WITH CIRCUMFLEX
+<Multi_key> <greater> <i>              : "î"   icircumflex # LATIN SMALL LETTER I WITH CIRCUMFLEX
+<Multi_key> <i> <greater>              : "î"   icircumflex # LATIN SMALL LETTER I WITH CIRCUMFLEX
+<dead_diaeresis> <i>                   : "ï"   idiaeresis # LATIN SMALL LETTER I WITH DIAERESIS
+<Multi_key> <quotedbl> <i>             : "ï"   idiaeresis # LATIN SMALL LETTER I WITH DIAERESIS
+<Multi_key> <i> <quotedbl>             : "ï"   idiaeresis # LATIN SMALL LETTER I WITH DIAERESIS
+<Multi_key> <diaeresis> <i>            : "ï"   idiaeresis # LATIN SMALL LETTER I WITH DIAERESIS
+<Multi_key> <i> <diaeresis>            : "ï"   idiaeresis # LATIN SMALL LETTER I WITH DIAERESIS
+<Multi_key> <d> <h>                    : "ð"   eth # LATIN SMALL LETTER ETH
+<dead_tilde> <n>                       : "ñ"   ntilde # LATIN SMALL LETTER N WITH TILDE
+<Multi_key> <asciitilde> <n>           : "ñ"   ntilde # LATIN SMALL LETTER N WITH TILDE
+<Multi_key> <n> <asciitilde>           : "ñ"   ntilde # LATIN SMALL LETTER N WITH TILDE
+<dead_grave> <o>                       : "ò"   ograve # LATIN SMALL LETTER O WITH GRAVE
+<Multi_key> <grave> <o>                : "ò"   ograve # LATIN SMALL LETTER O WITH GRAVE
+<Multi_key> <o> <grave>                : "ò"   ograve # LATIN SMALL LETTER O WITH GRAVE
+<dead_acute> <o>                       : "ó"   oacute # LATIN SMALL LETTER O WITH ACUTE
+<Multi_key> <acute> <o>                : "ó"   oacute # LATIN SMALL LETTER O WITH ACUTE
+<Multi_key> <o> <acute>                : "ó"   oacute # LATIN SMALL LETTER O WITH ACUTE
+<Multi_key> <apostrophe> <o>           : "ó"   oacute # LATIN SMALL LETTER O WITH ACUTE
+<Multi_key> <o> <apostrophe>           : "ó"   oacute # LATIN SMALL LETTER O WITH ACUTE
+<dead_circumflex> <o>                  : "ô"   ocircumflex # LATIN SMALL LETTER O WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <o>          : "ô"   ocircumflex # LATIN SMALL LETTER O WITH CIRCUMFLEX
+<Multi_key> <o> <asciicircum>          : "ô"   ocircumflex # LATIN SMALL LETTER O WITH CIRCUMFLEX
+<Multi_key> <greater> <o>              : "ô"   ocircumflex # LATIN SMALL LETTER O WITH CIRCUMFLEX
+<Multi_key> <o> <greater>              : "ô"   ocircumflex # LATIN SMALL LETTER O WITH CIRCUMFLEX
+<dead_tilde> <o>                       : "õ"   otilde # LATIN SMALL LETTER O WITH TILDE
+<Multi_key> <asciitilde> <o>           : "õ"   otilde # LATIN SMALL LETTER O WITH TILDE
+<Multi_key> <o> <asciitilde>           : "õ"   otilde # LATIN SMALL LETTER O WITH TILDE
+<dead_diaeresis> <o>                   : "ö"   odiaeresis # LATIN SMALL LETTER O WITH DIAERESIS
+<Multi_key> <o> <diaeresis>            : "ö"   odiaeresis # LATIN SMALL LETTER O WITH DIAERESIS
+<Multi_key> <diaeresis> <o>            : "ö"   odiaeresis # LATIN SMALL LETTER O WITH DIAERESIS
+<Multi_key> <quotedbl> <o>             : "ö"   odiaeresis # LATIN SMALL LETTER O WITH DIAERESIS
+<Multi_key> <o> <quotedbl>             : "ö"   odiaeresis # LATIN SMALL LETTER O WITH DIAERESIS
+<Multi_key> <colon> <minus>            : "÷"   division # DIVISION SIGN
+<Multi_key> <minus> <colon>            : "÷"   division # DIVISION SIGN
+<dead_stroke> <o>                      : "ø"   oslash # LATIN SMALL LETTER O WITH STROKE
+<Multi_key> <slash> <o>                : "ø"   oslash # LATIN SMALL LETTER O WITH STROKE
+<Multi_key> <o> <slash>                        : "ø"   oslash # LATIN SMALL LETTER O WITH STROKE
+<Multi_key> <KP_Divide> <o>            : "ø"   oslash # LATIN SMALL LETTER O WITH STROKE
+<dead_grave> <u>                       : "ù"   ugrave # LATIN SMALL LETTER U WITH GRAVE
+<Multi_key> <grave> <u>                : "ù"   ugrave # LATIN SMALL LETTER U WITH GRAVE
+<Multi_key> <u> <grave>                : "ù"   ugrave # LATIN SMALL LETTER U WITH GRAVE
+<dead_acute> <u>                       : "ú"   uacute # LATIN SMALL LETTER U WITH ACUTE
+<Multi_key> <acute> <u>                : "ú"   uacute # LATIN SMALL LETTER U WITH ACUTE
+<Multi_key> <u> <acute>                : "ú"   uacute # LATIN SMALL LETTER U WITH ACUTE
+<Multi_key> <apostrophe> <u>           : "ú"   uacute # LATIN SMALL LETTER U WITH ACUTE
+<Multi_key> <u> <apostrophe>           : "ú"   uacute # LATIN SMALL LETTER U WITH ACUTE
+<dead_circumflex> <u>                  : "û"   ucircumflex # LATIN SMALL LETTER U WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <u>          : "û"   ucircumflex # LATIN SMALL LETTER U WITH CIRCUMFLEX
+<Multi_key> <u> <asciicircum>          : "û"   ucircumflex # LATIN SMALL LETTER U WITH CIRCUMFLEX
+<Multi_key> <greater> <u>              : "û"   ucircumflex # LATIN SMALL LETTER U WITH CIRCUMFLEX
+<Multi_key> <u> <greater>              : "û"   ucircumflex # LATIN SMALL LETTER U WITH CIRCUMFLEX
+<dead_diaeresis> <u>                   : "ü"   udiaeresis # LATIN SMALL LETTER U WITH DIAERESIS
+<Multi_key> <quotedbl> <u>             : "ü"   udiaeresis # LATIN SMALL LETTER U WITH DIAERESIS
+<Multi_key> <u> <quotedbl>             : "ü"   udiaeresis # LATIN SMALL LETTER U WITH DIAERESIS
+<Multi_key> <diaeresis> <u>            : "ü"   udiaeresis # LATIN SMALL LETTER U WITH DIAERESIS
+<Multi_key> <u> <diaeresis>            : "ü"   udiaeresis # LATIN SMALL LETTER U WITH DIAERESIS
+<dead_acute> <y>                       : "ý"   yacute # LATIN SMALL LETTER Y WITH ACUTE
+<Multi_key> <acute> <y>                : "ý"   yacute # LATIN SMALL LETTER Y WITH ACUTE
+<Multi_key> <y> <acute>                : "ý"   yacute # LATIN SMALL LETTER Y WITH ACUTE
+<Multi_key> <apostrophe> <y>           : "ý"   yacute # LATIN SMALL LETTER Y WITH ACUTE
+<Multi_key> <y> <apostrophe>           : "ý"   yacute # LATIN SMALL LETTER Y WITH ACUTE
+<Multi_key> <t> <h>                    : "þ"   thorn # LATIN SMALL LETTER THORN
+<dead_diaeresis> <y>                   : "ÿ"   ydiaeresis # LATIN SMALL LETTER Y WITH DIAERESIS
+<Multi_key> <quotedbl> <y>             : "ÿ"   ydiaeresis # LATIN SMALL LETTER Y WITH DIAERESIS
+<Multi_key> <y> <quotedbl>             : "ÿ"   ydiaeresis # LATIN SMALL LETTER Y WITH DIAERESIS
+<Multi_key> <diaeresis> <y>            : "ÿ"   ydiaeresis # LATIN SMALL LETTER Y WITH DIAERESIS
+<Multi_key> <y> <diaeresis>            : "ÿ"   ydiaeresis # LATIN SMALL LETTER Y WITH DIAERESIS
+<dead_macron> <A>                      : "Ā"   U0100 # LATIN CAPITAL LETTER A WITH MACRON
+<Multi_key> <macron> <A>               : "Ā"   U0100 # LATIN CAPITAL LETTER A WITH MACRON
+<Multi_key> <underscore> <A>           : "Ā"   U0100 # LATIN CAPITAL LETTER A WITH MACRON
+<Multi_key> <A> <underscore>           : "Ā"   U0100 # LATIN CAPITAL LETTER A WITH MACRON
+<Multi_key> <minus> <A>                : "Ā"   U0100 # LATIN CAPITAL LETTER A WITH MACRON
+<Multi_key> <A> <minus>                : "Ā"   U0100 # LATIN CAPITAL LETTER A WITH MACRON
+<dead_macron> <a>                      : "ā"   U0101 # LATIN SMALL LETTER A WITH MACRON
+<Multi_key> <macron> <a>               : "ā"   U0101 # LATIN SMALL LETTER A WITH MACRON
+<Multi_key> <underscore> <a>           : "ā"   U0101 # LATIN SMALL LETTER A WITH MACRON
+<Multi_key> <a> <underscore>           : "ā"   U0101 # LATIN SMALL LETTER A WITH MACRON
+<Multi_key> <minus> <a>                : "ā"   U0100 # LATIN CAPITAL LETTER A WITH MACRON
+<Multi_key> <a> <minus>                : "ā"   U0100 # LATIN CAPITAL LETTER A WITH MACRON
+<dead_breve> <A>                       : "Ă"   U0102 # LATIN CAPITAL LETTER A WITH BREVE
+<Multi_key> <U> <A>                    : "Ă"   U0102 # LATIN CAPITAL LETTER A WITH BREVE
+<Multi_key> <b> <A>                    : "Ă"   U0102 # LATIN CAPITAL LETTER A WITH BREVE
+<Multi_key> <A> <parenleft>            : "Ă"   U0102 # LATIN CAPITAL LETTER A WITH BREVE
+<dead_breve> <a>                       : "ă"   U0103 # LATIN SMALL LETTER A WITH BREVE
+<Multi_key> <U> <a>                    : "ă"   U0103 # LATIN SMALL LETTER A WITH BREVE
+<Multi_key> <b> <a>                    : "ă"   U0103 # LATIN SMALL LETTER A WITH BREVE
+<Multi_key> <a> <parenleft>            : "ă"   U0103 # LATIN SMALL LETTER A WITH BREVE
+<dead_ogonek> <A>                      : "Ą"   U0104 # LATIN CAPITAL LETTER A WITH OGONEK
+<Multi_key> <semicolon> <A>            : "Ą"   U0104 # LATIN CAPITAL LETTER A WITH OGONEK
+<Multi_key> <comma> <A>                : "Ą"   U0104 # LATIN CAPITAL LETTER A WITH OGONEK
+<Multi_key> <A> <comma>                : "Ą"   U0104 # LATIN CAPITAL LETTER A WITH OGONEK
+<dead_ogonek> <a>                      : "ą"   U0105 # LATIN SMALL LETTER A WITH OGONEK
+<Multi_key> <semicolon> <a>            : "ą"   U0105 # LATIN SMALL LETTER A WITH OGONEK
+<Multi_key> <comma> <a>                : "ą"   U0105 # LATIN SMALL LETTER A WITH OGONEK
+<Multi_key> <a> <comma>                : "ą"   U0105 # LATIN SMALL LETTER A WITH OGONEK
+<dead_acute> <C>                       : "Ć"   U0106 # LATIN CAPITAL LETTER C WITH ACUTE
+<Multi_key> <acute> <C>                : "Ć"   U0106 # LATIN CAPITAL LETTER C WITH ACUTE
+<Multi_key> <apostrophe> <C>           : "Ć"   U0106 # LATIN CAPITAL LETTER C WITH ACUTE
+<Multi_key> <C> <apostrophe>           : "Ć"   U0106 # LATIN CAPITAL LETTER C WITH ACUTE
+<dead_acute> <c>                       : "ć"   U0107 # LATIN SMALL LETTER C WITH ACUTE
+<Multi_key> <acute> <c>                : "ć"   U0107 # LATIN SMALL LETTER C WITH ACUTE
+<Multi_key> <apostrophe> <c>           : "ć"   U0107 # LATIN SMALL LETTER C WITH ACUTE
+<Multi_key> <c> <apostrophe>           : "ć"   U0107 # LATIN SMALL LETTER C WITH ACUTE
+<dead_circumflex> <C>                  : "Ĉ"   U0108 # LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <C>          : "Ĉ"   U0108 # LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+<dead_circumflex> <c>                  : "ĉ"   U0109 # LATIN SMALL LETTER C WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <c>          : "ĉ"   U0109 # LATIN SMALL LETTER C WITH CIRCUMFLEX
+<dead_abovedot> <C>                    : "Ċ"   U010A # LATIN CAPITAL LETTER C WITH DOT ABOVE
+<Multi_key> <period> <C>               : "Ċ"   U010A # LATIN CAPITAL LETTER C WITH DOT ABOVE
+<Multi_key> <C> <period>               : "Ċ"   U010A # LATIN CAPITAL LETTER C WITH DOT ABOVE
+<dead_abovedot> <c>                    : "ċ"   U010B # LATIN SMALL LETTER C WITH DOT ABOVE
+<Multi_key> <period> <c>               : "ċ"   U010B # LATIN SMALL LETTER C WITH DOT ABOVE
+<Multi_key> <c> <period>               : "ċ"   U010B # LATIN SMALL LETTER C WITH DOT ABOVE
+<dead_caron> <C>                       : "Č"   U010C # LATIN CAPITAL LETTER C WITH CARON
+<Multi_key> <c> <C>                    : "Č"   U010C # LATIN CAPITAL LETTER C WITH CARON
+<Multi_key> <less> <C>                         : "Č"   U010C # LATIN CAPITAL LETTER C WITH CARON
+<Multi_key> <C> <less>                         : "Č"   U010C # LATIN CAPITAL LETTER C WITH CARON
+<dead_caron> <c>                       : "č"   U010D # LATIN SMALL LETTER C WITH CARON
+<Multi_key> <c> <c>                    : "č"   U010D # LATIN SMALL LETTER C WITH CARON
+<Multi_key> <less> <c>                         : "č"   U010D # LATIN SMALL LETTER C WITH CARON
+<Multi_key> <c> <less>                         : "č"   U010D # LATIN SMALL LETTER C WITH CARON
+<dead_caron> <D>                       : "Ď"   U010E # LATIN CAPITAL LETTER D WITH CARON
+<Multi_key> <c> <D>                    : "Ď"   U010E # LATIN CAPITAL LETTER D WITH CARON
+<Multi_key> <less> <D>                         : "Ď"   U010E # LATIN CAPITAL LETTER D WITH CARON
+<Multi_key> <D> <less>                         : "Ď"   U010E # LATIN CAPITAL LETTER D WITH CARON
+<dead_caron> <d>                       : "ď"   U010F # LATIN SMALL LETTER D WITH CARON
+<Multi_key> <c> <d>                    : "ď"   U010F # LATIN SMALL LETTER D WITH CARON
+<Multi_key> <less> <d>                         : "ď"   U010F # LATIN SMALL LETTER D WITH CARON
+<Multi_key> <d> <less>                         : "ď"   U010F # LATIN SMALL LETTER D WITH CARON
+<dead_stroke> <D>                      : "Đ"   Dstroke # LATIN CAPITAL LETTER D WITH STROKE
+<Multi_key> <slash> <D>                : "Đ"   Dstroke # LATIN CAPITAL LETTER D WITH STROKE
+<Multi_key> <KP_Divide> <D>            : "Đ"   Dstroke # LATIN CAPITAL LETTER D WITH STROKE
+<Multi_key> <D> <minus>                : "Đ"   Dstroke # LATIN CAPITAL LETTER D WITH STROKE
+<dead_stroke> <d>                      : "đ"   dstroke # LATIN SMALL LETTER D WITH STROKE
+<Multi_key> <slash> <d>                : "đ"   dstroke # LATIN SMALL LETTER D WITH STROKE
+<Multi_key> <d> <minus>                : "đ"   dstroke # LATIN SMALL LETTER D WITH STROKE
+<Multi_key> <KP_Divide> <d>            : "đ"   dstroke # LATIN SMALL LETTER D WITH STROKE
+<dead_macron> <E>                      : "Ē"   U0112 # LATIN CAPITAL LETTER E WITH MACRON
+<Multi_key> <macron> <E>               : "Ē"   U0112 # LATIN CAPITAL LETTER E WITH MACRON
+<Multi_key> <underscore> <E>           : "Ē"   U0112 # LATIN CAPITAL LETTER E WITH MACRON
+<Multi_key> <E> <underscore>           : "Ē"   U0112 # LATIN CAPITAL LETTER E WITH MACRON
+<Multi_key> <minus> <E>                : "Ē"   U0112 # LATIN CAPITAL LETTER E WITH MACRON
+<Multi_key> <E> <minus>                : "Ē"   U0112 # LATIN CAPITAL LETTER E WITH MACRON
+<dead_macron> <e>                      : "ē"   U0113 # LATIN SMALL LETTER E WITH MACRON
+<Multi_key> <macron> <e>               : "ē"   U0113 # LATIN SMALL LETTER E WITH MACRON
+<Multi_key> <underscore> <e>           : "ē"   U0113 # LATIN SMALL LETTER E WITH MACRON
+<Multi_key> <e> <underscore>           : "ē"   U0113 # LATIN SMALL LETTER E WITH MACRON
+<Multi_key> <minus> <e>                : "ē"   U0113 # LATIN SMALL LETTER E WITH MACRON
+<Multi_key> <e> <minus>                : "ē"   U0113 # LATIN SMALL LETTER E WITH MACRON
+<dead_breve> <E>                       : "Ĕ"   U0114 # LATIN CAPITAL LETTER E WITH BREVE
+<Multi_key> <U> <E>                    : "Ĕ"   U0114 # LATIN CAPITAL LETTER E WITH BREVE
+<Multi_key> <b> <E>                    : "Ĕ"   U0114 # LATIN CAPITAL LETTER E WITH BREVE
+<dead_breve> <e>                       : "ĕ"   U0115 # LATIN SMALL LETTER E WITH BREVE
+<Multi_key> <U> <e>                    : "ĕ"   U0115 # LATIN SMALL LETTER E WITH BREVE
+<Multi_key> <b> <e>                    : "ĕ"   U0115 # LATIN SMALL LETTER E WITH BREVE
+<dead_abovedot> <E>                    : "Ė"   U0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE
+<Multi_key> <period> <E>               : "Ė"   U0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE
+<Multi_key> <E> <period>               : "Ė"   U0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE
+<dead_abovedot> <e>                    : "ė"   U0117 # LATIN SMALL LETTER E WITH DOT ABOVE
+<Multi_key> <period> <e>               : "ė"   U0117 # LATIN SMALL LETTER E WITH DOT ABOVE
+<Multi_key> <e> <period>               : "ė"   U0117 # LATIN SMALL LETTER E WITH DOT ABOVE
+<dead_ogonek> <E>                      : "Ę"   U0118 # LATIN CAPITAL LETTER E WITH OGONEK
+<Multi_key> <semicolon> <E>            : "Ę"   U0118 # LATIN CAPITAL LETTER E WITH OGONEK
+<Multi_key> <comma> <E>                : "Ę"   U0118 # LATIN CAPITAL LETTER E WITH OGONEK
+<Multi_key> <E> <comma>                : "Ę"   U0118 # LATIN CAPITAL LETTER E WITH OGONEK
+<dead_ogonek> <e>                      : "ę"   U0119 # LATIN SMALL LETTER E WITH OGONEK
+<Multi_key> <semicolon> <e>            : "ę"   U0119 # LATIN SMALL LETTER E WITH OGONEK
+<Multi_key> <comma> <e>                : "ę"   U0119 # LATIN SMALL LETTER E WITH OGONEK
+<Multi_key> <e> <comma>                : "ę"   U0119 # LATIN SMALL LETTER E WITH OGONEK
+<dead_caron> <E>                       : "Ě"   U011A # LATIN CAPITAL LETTER E WITH CARON
+<Multi_key> <c> <E>                    : "Ě"   U011A # LATIN CAPITAL LETTER E WITH CARON
+<Multi_key> <less> <E>                         : "Ě"   U011A # LATIN CAPITAL LETTER E WITH CARON
+<Multi_key> <E> <less>                         : "Ě"   U011A # LATIN CAPITAL LETTER E WITH CARON
+<dead_caron> <e>                       : "ě"   U011B # LATIN SMALL LETTER E WITH CARON
+<Multi_key> <c> <e>                    : "ě"   U011B # LATIN SMALL LETTER E WITH CARON
+<Multi_key> <less> <e>                         : "ě"   U011B # LATIN SMALL LETTER E WITH CARON
+<Multi_key> <e> <less>                         : "ě"   U011B # LATIN SMALL LETTER E WITH CARON
+<dead_circumflex> <G>                  : "Ĝ"   U011C # LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <G>          : "Ĝ"   U011C # LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+<dead_circumflex> <g>                  : "ĝ"   U011D # LATIN SMALL LETTER G WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <g>          : "ĝ"   U011D # LATIN SMALL LETTER G WITH CIRCUMFLEX
+<dead_breve> <G>                       : "Ğ"   U011E # LATIN CAPITAL LETTER G WITH BREVE
+<Multi_key> <U> <G>                    : "Ğ"   U011E # LATIN CAPITAL LETTER G WITH BREVE
+<Multi_key> <G> <U>                    : "Ğ"   U011E # LATIN CAPITAL LETTER G WITH BREVE
+<Multi_key> <b> <G>                    : "Ğ"   U011E # LATIN CAPITAL LETTER G WITH BREVE
+<Multi_key> <breve> <G>                : "Ğ"   U011E # LATIN CAPITAL LETTER G WITH BREVE
+<Multi_key> <G> <breve>                : "Ğ"   U011E # LATIN CAPITAL LETTER G WITH BREVE
+<Multi_key> <G> <parenleft>            : "Ğ"   U011E # LATIN CAPITAL LETTER G WITH BREVE
+<dead_breve> <g>                       : "ğ"   U011F # LATIN SMALL LETTER G WITH BREVE
+<Multi_key> <U> <g>                    : "ğ"   U011F # LATIN SMALL LETTER G WITH BREVE
+<Multi_key> <g> <U>                    : "ğ"   U011F # LATIN SMALL LETTER G WITH BREVE
+<Multi_key> <b> <g>                    : "ğ"   U011F # LATIN SMALL LETTER G WITH BREVE
+<Multi_key> <breve> <g>                : "ğ"   U011F # LATIN SMALL LETTER G WITH BREVE
+<Multi_key> <g> <breve>                : "ğ"   U011F # LATIN SMALL LETTER G WITH BREVE
+<Multi_key> <g> <parenleft>            : "ğ"   U011F # LATIN SMALL LETTER G WITH BREVE
+<dead_abovedot> <G>                    : "Ġ"   U0120 # LATIN CAPITAL LETTER G WITH DOT ABOVE
+<Multi_key> <period> <G>               : "Ġ"   U0120 # LATIN CAPITAL LETTER G WITH DOT ABOVE
+<Multi_key> <G> <period>               : "Ġ"   U0120 # LATIN CAPITAL LETTER G WITH DOT ABOVE
+<dead_abovedot> <g>                    : "ġ"   U0121 # LATIN SMALL LETTER G WITH DOT ABOVE
+<Multi_key> <period> <g>               : "ġ"   U0121 # LATIN SMALL LETTER G WITH DOT ABOVE
+<Multi_key> <g> <period>               : "ġ"   U0121 # LATIN SMALL LETTER G WITH DOT ABOVE
+<dead_cedilla> <G>                     : "Ģ"   U0122 # LATIN CAPITAL LETTER G WITH CEDILLA
+<Multi_key> <comma> <G>                : "Ģ"   U0122 # LATIN CAPITAL LETTER G WITH CEDILLA
+<Multi_key> <G> <comma>                : "Ģ"   U0122 # LATIN CAPITAL LETTER G WITH CEDILLA
+<Multi_key> <cedilla> <G>              : "Ģ"   U0122 # LATIN CAPITAL LETTER G WITH CEDILLA
+<dead_cedilla> <g>                     : "ģ"   U0123 # LATIN SMALL LETTER G WITH CEDILLA
+<Multi_key> <comma> <g>                : "ģ"   U0123 # LATIN SMALL LETTER G WITH CEDILLA
+<Multi_key> <g> <comma>                : "ģ"   U0123 # LATIN SMALL LETTER G WITH CEDILLA
+<Multi_key> <cedilla> <g>              : "ģ"   U0123 # LATIN SMALL LETTER G WITH CEDILLA
+<dead_circumflex> <H>                  : "Ĥ"   U0124 # LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <H>          : "Ĥ"   U0124 # LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+<dead_circumflex> <h>                  : "ĥ"   U0125 # LATIN SMALL LETTER H WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <h>          : "ĥ"   U0125 # LATIN SMALL LETTER H WITH CIRCUMFLEX
+<dead_stroke> <H>                      : "Ħ"   U0126 # LATIN CAPITAL LETTER H WITH STROKE
+<Multi_key> <slash> <H>                : "Ħ"   U0126 # LATIN CAPITAL LETTER H WITH STROKE
+<Multi_key> <KP_Divide> <H>            : "Ħ"   U0126 # LATIN CAPITAL LETTER H WITH STROKE
+<dead_stroke> <h>                      : "ħ"   U0127 # LATIN SMALL LETTER H WITH STROKE
+<Multi_key> <slash> <h>                : "ħ"   U0127 # LATIN SMALL LETTER H WITH STROKE
+<Multi_key> <KP_Divide> <h>            : "ħ"   U0127 # LATIN SMALL LETTER H WITH STROKE
+<dead_tilde> <I>                       : "Ĩ"   U0128 # LATIN CAPITAL LETTER I WITH TILDE
+<Multi_key> <asciitilde> <I>           : "Ĩ"   U0128 # LATIN CAPITAL LETTER I WITH TILDE
+<Multi_key> <I> <asciitilde>           : "Ĩ"   U0128 # LATIN CAPITAL LETTER I WITH TILDE
+<dead_tilde> <i>                       : "ĩ"   U0129 # LATIN SMALL LETTER I WITH TILDE
+<Multi_key> <asciitilde> <i>           : "ĩ"   U0129 # LATIN SMALL LETTER I WITH TILDE
+<Multi_key> <i> <asciitilde>           : "ĩ"   U0129 # LATIN SMALL LETTER I WITH TILDE
+<dead_macron> <I>                      : "Ī"   U012A # LATIN CAPITAL LETTER I WITH MACRON
+<Multi_key> <macron> <I>               : "Ī"   U012A # LATIN CAPITAL LETTER I WITH MACRON
+<Multi_key> <underscore> <I>           : "Ī"   U012A # LATIN CAPITAL LETTER I WITH MACRON
+<Multi_key> <I> <underscore>           : "Ī"   U012A # LATIN CAPITAL LETTER I WITH MACRON
+<Multi_key> <minus> <I>                : "Ī"   U012A # LATIN CAPITAL LETTER I WITH MACRON
+<Multi_key> <I> <minus>                : "Ī"   U012A # LATIN CAPITAL LETTER I WITH MACRON
+<dead_macron> <i>                      : "ī"   U012B # LATIN SMALL LETTER I WITH MACRON
+<Multi_key> <macron> <i>               : "ī"   U012B # LATIN SMALL LETTER I WITH MACRON
+<Multi_key> <underscore> <i>           : "ī"   U012B # LATIN SMALL LETTER I WITH MACRON
+<Multi_key> <i> <underscore>           : "ī"   U012B # LATIN SMALL LETTER I WITH MACRON
+<Multi_key> <minus> <i>                : "ī"   U012B # LATIN SMALL LETTER I WITH MACRON
+<Multi_key> <i> <minus>                : "ī"   U012B # LATIN SMALL LETTER I WITH MACRON
+<dead_breve> <I>                       : "Ĭ"   U012C # LATIN CAPITAL LETTER I WITH BREVE
+<Multi_key> <U> <I>                    : "Ĭ"   U012C # LATIN CAPITAL LETTER I WITH BREVE
+<Multi_key> <b> <I>                    : "Ĭ"   U012C # LATIN CAPITAL LETTER I WITH BREVE
+<dead_breve> <i>                       : "ĭ"   U012D # LATIN SMALL LETTER I WITH BREVE
+<Multi_key> <U> <i>                    : "ĭ"   U012D # LATIN SMALL LETTER I WITH BREVE
+<Multi_key> <b> <i>                    : "ĭ"   U012D # LATIN SMALL LETTER I WITH BREVE
+<dead_ogonek> <I>                      : "Į"   U012E # LATIN CAPITAL LETTER I WITH OGONEK
+<Multi_key> <semicolon> <I>            : "Į"   U012E # LATIN CAPITAL LETTER I WITH OGONEK
+<Multi_key> <comma> <I>                : "Į"   U012E # LATIN CAPITAL LETTER I WITH OGONEK
+<Multi_key> <I> <comma>                : "Į"   U012E # LATIN CAPITAL LETTER I WITH OGONEK
+<dead_ogonek> <i>                      : "į"   U012F # LATIN SMALL LETTER I WITH OGONEK
+<Multi_key> <semicolon> <i>            : "į"   U012F # LATIN SMALL LETTER I WITH OGONEK
+<Multi_key> <i> <semicolon>            : "į"   U012F # LATIN SMALL LETTER I WITH OGONEK
+<Multi_key> <comma> <i>                : "į"   U012F # LATIN SMALL LETTER I WITH OGONEK
+<Multi_key> <i> <comma>                        : "į"   U012F # LATIN SMALL LETTER I WITH OGONEK
+<dead_abovedot> <I>                    : "İ"   U0130 # LATIN CAPITAL LETTER I WITH DOT ABOVE
+<Multi_key> <period> <I>               : "İ"   U0130 # LATIN CAPITAL LETTER I WITH DOT ABOVE
+<Multi_key> <I> <period>               : "İ"   U0130 # LATIN CAPITAL LETTER I WITH DOT ABOVE
+<dead_abovedot> <i>                    : "ı"   U0131 # LATIN SMALL LETTER DOTLESS I
+<Multi_key> <i> <period>               : "ı"   U0131 # LATIN SMALL LETTER DOTLESS I
+<Multi_key> <period> <i>               : "ı"   U0131 # LATIN SMALL LETTER DOTLESS I
+<dead_circumflex> <J>                  : "Ĵ"   U0134 # LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <J>          : "Ĵ"   U0134 # LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+<dead_circumflex> <j>                  : "ĵ"   U0135 # LATIN SMALL LETTER J WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <j>          : "ĵ"   U0135 # LATIN SMALL LETTER J WITH CIRCUMFLEX
+<dead_cedilla> <K>                     : "Ķ"   U0136 # LATIN CAPITAL LETTER K WITH CEDILLA
+<Multi_key> <comma> <K>                : "Ķ"   U0136 # LATIN CAPITAL LETTER K WITH CEDILLA
+<Multi_key> <K> <comma>                : "Ķ"   U0136 # LATIN CAPITAL LETTER K WITH CEDILLA
+<Multi_key> <cedilla> <K>              : "Ķ"   U0136 # LATIN CAPITAL LETTER K WITH CEDILLA
+<dead_cedilla> <k>                     : "ķ"   U0137 # LATIN SMALL LETTER K WITH CEDILLA
+<Multi_key> <comma> <k>                : "ķ"   U0137 # LATIN SMALL LETTER K WITH CEDILLA
+<Multi_key> <k> <comma>                : "ķ"   U0137 # LATIN SMALL LETTER K WITH CEDILLA
+<Multi_key> <cedilla> <k>              : "ķ"   U0137 # LATIN SMALL LETTER K WITH CEDILLA
+<Multi_key> <k> <k>                    : "ĸ"   U0138 # LATIN SMALL LETTER KRA
+<dead_acute> <L>                       : "Ĺ"   U0139 # LATIN CAPITAL LETTER L WITH ACUTE
+<Multi_key> <acute> <L>                : "Ĺ"   U0139 # LATIN CAPITAL LETTER L WITH ACUTE
+<Multi_key> <apostrophe> <L>           : "Ĺ"   U0139 # LATIN CAPITAL LETTER L WITH ACUTE
+<Multi_key> <L> <apostrophe>           : "Ĺ"   U0139 # LATIN CAPITAL LETTER L WITH ACUTE
+<dead_acute> <l>                       : "ĺ"   U013A # LATIN SMALL LETTER L WITH ACUTE
+<Multi_key> <acute> <l>                : "ĺ"   U013A # LATIN SMALL LETTER L WITH ACUTE
+<Multi_key> <apostrophe> <l>           : "ĺ"   U013A # LATIN SMALL LETTER L WITH ACUTE
+<Multi_key> <l> <apostrophe>           : "ĺ"   U013A # LATIN SMALL LETTER L WITH ACUTE
+<dead_cedilla> <L>                     : "Ļ"   U013B # LATIN CAPITAL LETTER L WITH CEDILLA
+<Multi_key> <comma> <L>                : "Ļ"   U013B # LATIN CAPITAL LETTER L WITH CEDILLA
+<Multi_key> <L> <comma>                : "Ļ"   U013B # LATIN CAPITAL LETTER L WITH CEDILLA
+<Multi_key> <cedilla> <L>              : "Ļ"   U013B # LATIN CAPITAL LETTER L WITH CEDILLA
+<dead_cedilla> <l>                     : "ļ"   U013C # LATIN SMALL LETTER L WITH CEDILLA
+<Multi_key> <comma> <l>                : "ļ"   U013C # LATIN SMALL LETTER L WITH CEDILLA
+<Multi_key> <l> <comma>                : "ļ"   U013C # LATIN SMALL LETTER L WITH CEDILLA
+<Multi_key> <cedilla> <l>              : "ļ"   U013C # LATIN SMALL LETTER L WITH CEDILLA
+<dead_caron> <L>                       : "Ľ"   U013D # LATIN CAPITAL LETTER L WITH CARON
+<Multi_key> <c> <L>                    : "Ľ"   U013D # LATIN CAPITAL LETTER L WITH CARON
+<Multi_key> <less> <L>                         : "Ľ"   U013D # LATIN CAPITAL LETTER L WITH CARON
+<Multi_key> <L> <less>                         : "Ľ"   U013D # LATIN CAPITAL LETTER L WITH CARON
+<dead_caron> <l>                       : "ľ"   U013E # LATIN SMALL LETTER L WITH CARON
+<Multi_key> <c> <l>                    : "ľ"   U013E # LATIN SMALL LETTER L WITH CARON
+<Multi_key> <less> <l>                         : "ľ"   U013E # LATIN SMALL LETTER L WITH CARON
+<Multi_key> <l> <less>                         : "ľ"   U013E # LATIN SMALL LETTER L WITH CARON
+<dead_stroke> <L>                      : "Ł"   U0141 # LATIN CAPITAL LETTER L WITH STROKE
+<Multi_key> <slash> <L>                : "Ł"   U0141 # LATIN CAPITAL LETTER L WITH STROKE
+<Multi_key> <L> <slash>                : "Ł"   U0141 # LATIN CAPITAL LETTER L WITH STROKE
+<Multi_key> <KP_Divide> <L>            : "Ł"   U0141 # LATIN CAPITAL LETTER L WITH STROKE
+<dead_stroke> <l>                      : "ł"   U0142 # LATIN SMALL LETTER L WITH STROKE
+<Multi_key> <slash> <l>                : "ł"   U0142 # LATIN SMALL LETTER L WITH STROKE
+<Multi_key> <l> <slash>                : "ł"   U0142 # LATIN SMALL LETTER L WITH STROKE
+<Multi_key> <KP_Divide> <l>            : "ł"   U0142 # LATIN SMALL LETTER L WITH STROKE
+<dead_acute> <N>                       : "Ń"   U0143 # LATIN CAPITAL LETTER N WITH ACUTE
+<Multi_key> <acute> <N>                : "Ń"   U0143 # LATIN CAPITAL LETTER N WITH ACUTE
+<Multi_key> <apostrophe> <N>           : "Ń"   U0143 # LATIN CAPITAL LETTER N WITH ACUTE
+<Multi_key> <N> <apostrophe>           : "Ń"   U0143 # LATIN CAPITAL LETTER N WITH ACUTE
+<dead_acute> <n>                       : "ń"   U0144 # LATIN SMALL LETTER N WITH ACUTE
+<Multi_key> <acute> <n>                : "ń"   U0144 # LATIN SMALL LETTER N WITH ACUTE
+<Multi_key> <apostrophe> <n>           : "ń"   U0144 # LATIN SMALL LETTER N WITH ACUTE
+<Multi_key> <n> <apostrophe>           : "ń"   U0144 # LATIN SMALL LETTER N WITH ACUTE
+<dead_cedilla> <N>                     : "Ņ"   U0145 # LATIN CAPITAL LETTER N WITH CEDILLA
+<Multi_key> <comma> <N>                : "Ņ"   U0145 # LATIN CAPITAL LETTER N WITH CEDILLA
+<Multi_key> <N> <comma>                : "Ņ"   U0145 # LATIN CAPITAL LETTER N WITH CEDILLA
+<Multi_key> <cedilla> <N>              : "Ņ"   U0145 # LATIN CAPITAL LETTER N WITH CEDILLA
+<dead_cedilla> <n>                     : "ņ"   U0146 # LATIN SMALL LETTER N WITH CEDILLA
+<Multi_key> <comma> <n>                : "ņ"   U0146 # LATIN SMALL LETTER N WITH CEDILLA
+<Multi_key> <n> <comma>                : "ņ"   U0146 # LATIN SMALL LETTER N WITH CEDILLA
+<Multi_key> <cedilla> <n>              : "ņ"   U0146 # LATIN SMALL LETTER N WITH CEDILLA
+<dead_caron> <N>                       : "Ň"   U0147 # LATIN CAPITAL LETTER N WITH CARON
+<Multi_key> <c> <N>                    : "Ň"   U0147 # LATIN CAPITAL LETTER N WITH CARON
+<Multi_key> <less> <N>                         : "Ň"   U0147 # LATIN CAPITAL LETTER N WITH CARON
+<Multi_key> <N> <less>                         : "Ň"   U0147 # LATIN CAPITAL LETTER N WITH CARON
+<dead_caron> <n>                       : "ň"   U0148 # LATIN SMALL LETTER N WITH CARON
+<Multi_key> <c> <n>                    : "ň"   U0148 # LATIN SMALL LETTER N WITH CARON
+<Multi_key> <less> <n>                         : "ň"   U0148 # LATIN SMALL LETTER N WITH CARON
+<Multi_key> <n> <less>                         : "ň"   U0148 # LATIN SMALL LETTER N WITH CARON
+<Multi_key> <N> <G>                    : "Ŋ"   U014A # LATIN CAPITAL LETTER ENG
+<Multi_key> <n> <g>                    : "ŋ"   U014B # LATIN SMALL LETTER ENG
+<dead_macron> <O>                      : "Ō"   U014C # LATIN CAPITAL LETTER O WITH MACRON
+<Multi_key> <macron> <O>               : "Ō"   U014C # LATIN CAPITAL LETTER O WITH MACRON
+<Multi_key> <underscore> <O>           : "Ō"   U014C # LATIN CAPITAL LETTER O WITH MACRON
+<Multi_key> <O> <underscore>           : "Ō"   U014C # LATIN CAPITAL LETTER O WITH MACRON
+<Multi_key> <minus> <O>                : "Ō"   U014C # LATIN CAPITAL LETTER O WITH MACRON
+<Multi_key> <O> <minus>                : "Ō"   U014C # LATIN CAPITAL LETTER O WITH MACRON
+<dead_macron> <o>                      : "ō"   U014D # LATIN SMALL LETTER O WITH MACRON
+<Multi_key> <macron> <o>               : "ō"   U014D # LATIN SMALL LETTER O WITH MACRON
+<Multi_key> <underscore> <o>           : "ō"   U014D # LATIN SMALL LETTER O WITH MACRON
+<Multi_key> <o> <underscore>           : "ō"   U014D # LATIN SMALL LETTER O WITH MACRON
+<Multi_key> <minus> <o>                : "ō"   U014D # LATIN SMALL LETTER O WITH MACRON
+<Multi_key> <o> <minus>                : "ō"   U014D # LATIN SMALL LETTER O WITH MACRON
+<dead_breve> <O>                       : "Ŏ"   U014E # LATIN CAPITAL LETTER O WITH BREVE
+<Multi_key> <U> <O>                    : "Ŏ"   U014E # LATIN CAPITAL LETTER O WITH BREVE
+<Multi_key> <b> <O>                    : "Ŏ"   U014E # LATIN CAPITAL LETTER O WITH BREVE
+<dead_breve> <o>                       : "ŏ"   U014F # LATIN SMALL LETTER O WITH BREVE
+<Multi_key> <U> <o>                    : "ŏ"   U014F # LATIN SMALL LETTER O WITH BREVE
+<Multi_key> <b> <o>                    : "ŏ"   U014F # LATIN SMALL LETTER O WITH BREVE
+<dead_doubleacute> <O>                 : "Ő"   U0150 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+<Multi_key> <equal> <O>                : "Ő"   U0150 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+<dead_doubleacute> <o>                 : "ő"   U0151 # LATIN SMALL LETTER O WITH DOUBLE ACUTE
+<Multi_key> <equal> <o>                : "ő"   U0151 # LATIN SMALL LETTER O WITH DOUBLE ACUTE
+<dead_acute> <R>                       : "Ŕ"   U0154 # LATIN CAPITAL LETTER R WITH ACUTE
+<Multi_key> <acute> <R>                : "Ŕ"   U0154 # LATIN CAPITAL LETTER R WITH ACUTE
+<Multi_key> <apostrophe> <R>           : "Ŕ"   U0154 # LATIN CAPITAL LETTER R WITH ACUTE
+<Multi_key> <R> <apostrophe>           : "Ŕ"   U0154 # LATIN CAPITAL LETTER R WITH ACUTE
+<dead_acute> <r>                       : "ŕ"   U0155 # LATIN SMALL LETTER R WITH ACUTE
+<Multi_key> <acute> <r>                : "ŕ"   U0155 # LATIN SMALL LETTER R WITH ACUTE
+<Multi_key> <apostrophe> <r>           : "ŕ"   U0155 # LATIN SMALL LETTER R WITH ACUTE
+<Multi_key> <r> <apostrophe>           : "ŕ"   U0155 # LATIN SMALL LETTER R WITH ACUTE
+<dead_cedilla> <R>                     : "Ŗ"   U0156 # LATIN CAPITAL LETTER R WITH CEDILLA
+<Multi_key> <comma> <R>                : "Ŗ"   U0156 # LATIN CAPITAL LETTER R WITH CEDILLA
+<Multi_key> <R> <comma>                : "Ŗ"   U0156 # LATIN CAPITAL LETTER R WITH CEDILLA
+<Multi_key> <cedilla> <R>              : "Ŗ"   U0156 # LATIN CAPITAL LETTER R WITH CEDILLA
+<dead_cedilla> <r>                     : "ŗ"   U0157 # LATIN SMALL LETTER R WITH CEDILLA
+<Multi_key> <comma> <r>                : "ŗ"   U0157 # LATIN SMALL LETTER R WITH CEDILLA
+<Multi_key> <r> <comma>                : "ŗ"   U0157 # LATIN SMALL LETTER R WITH CEDILLA
+<Multi_key> <cedilla> <r>              : "ŗ"   U0157 # LATIN SMALL LETTER R WITH CEDILLA
+<dead_caron> <R>                       : "Ř"   U0158 # LATIN CAPITAL LETTER R WITH CARON
+<Multi_key> <c> <R>                    : "Ř"   U0158 # LATIN CAPITAL LETTER R WITH CARON
+<Multi_key> <less> <R>                         : "Ř"   U0158 # LATIN CAPITAL LETTER R WITH CARON
+<Multi_key> <R> <less>                         : "Ř"   U0158 # LATIN CAPITAL LETTER R WITH CARON
+<dead_caron> <r>                       : "ř"   U0159 # LATIN SMALL LETTER R WITH CARON
+<Multi_key> <c> <r>                    : "ř"   U0159 # LATIN SMALL LETTER R WITH CARON
+<Multi_key> <less> <r>                         : "ř"   U0159 # LATIN SMALL LETTER R WITH CARON
+<Multi_key> <r> <less>                         : "ř"   U0159 # LATIN SMALL LETTER R WITH CARON
+<dead_acute> <S>                       : "Ś"   U015A # LATIN CAPITAL LETTER S WITH ACUTE
+<Multi_key> <acute> <S>                : "Ś"   U015A # LATIN CAPITAL LETTER S WITH ACUTE
+<Multi_key> <apostrophe> <S>           : "Ś"   U015A # LATIN CAPITAL LETTER S WITH ACUTE
+<Multi_key> <S> <apostrophe>           : "Ś"   U015A # LATIN CAPITAL LETTER S WITH ACUTE
+<dead_acute> <s>                       : "ś"   U015B # LATIN SMALL LETTER S WITH ACUTE
+<Multi_key> <acute> <s>                : "ś"   U015B # LATIN SMALL LETTER S WITH ACUTE
+<Multi_key> <apostrophe> <s>           : "ś"   U015B # LATIN SMALL LETTER S WITH ACUTE
+<Multi_key> <s> <apostrophe>           : "ś"   U015B # LATIN SMALL LETTER S WITH ACUTE
+<dead_circumflex> <S>                  : "Ŝ"   U015C # LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <S>          : "Ŝ"   U015C # LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+<dead_circumflex> <s>                  : "ŝ"   U015D # LATIN SMALL LETTER S WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <s>          : "ŝ"   U015D # LATIN SMALL LETTER S WITH CIRCUMFLEX
+<dead_cedilla> <S>                     : "Ş"   U015E # LATIN CAPITAL LETTER S WITH CEDILLA
+<Multi_key> <comma> <S>                : "Ş"   U015E # LATIN CAPITAL LETTER S WITH CEDILLA
+<Multi_key> <S> <comma>                : "Ş"   U015E # LATIN CAPITAL LETTER S WITH CEDILLA
+<Multi_key> <cedilla> <S>              : "Ş"   U015E # LATIN CAPITAL LETTER S WITH CEDILLA
+<dead_cedilla> <s>                     : "ş"   U015F # LATIN SMALL LETTER S WITH CEDILLA
+<Multi_key> <comma> <s>                : "ş"   U015F # LATIN SMALL LETTER S WITH CEDILLA
+<Multi_key> <s> <comma>                : "ş"   U015F # LATIN SMALL LETTER S WITH CEDILLA
+<Multi_key> <cedilla> <s>              : "ş"   U015F # LATIN SMALL LETTER S WITH CEDILLA
+<Multi_key> <s> <cedilla>              : "ş"   U015F # LATIN SMALL LETTER S WITH CEDILLA
+<dead_caron> <S>                       : "Š"   U0160 # LATIN CAPITAL LETTER S WITH CARON
+<Multi_key> <c> <S>                    : "Š"   U0160 # LATIN CAPITAL LETTER S WITH CARON
+<Multi_key> <less> <S>                         : "Š"   U0160 # LATIN CAPITAL LETTER S WITH CARON
+<Multi_key> <S> <less>                         : "Š"   U0160 # LATIN CAPITAL LETTER S WITH CARON
+<dead_caron> <s>                       : "š"   U0161 # LATIN SMALL LETTER S WITH CARON
+<Multi_key> <c> <s>                    : "š"   U0161 # LATIN SMALL LETTER S WITH CARON
+<Multi_key> <less> <s>                         : "š"   U0161 # LATIN SMALL LETTER S WITH CARON
+<Multi_key> <s> <less>                         : "š"   U0161 # LATIN SMALL LETTER S WITH CARON
+<dead_cedilla> <T>                     : "Ţ"   U0162 # LATIN CAPITAL LETTER T WITH CEDILLA
+<Multi_key> <comma> <T>                : "Ţ"   U0162 # LATIN CAPITAL LETTER T WITH CEDILLA
+<Multi_key> <T> <comma>                : "Ţ"   U0162 # LATIN CAPITAL LETTER T WITH CEDILLA
+<Multi_key> <cedilla> <T>              : "Ţ"   U0162 # LATIN CAPITAL LETTER T WITH CEDILLA
+<dead_cedilla> <t>                     : "ţ"   U0163 # LATIN SMALL LETTER T WITH CEDILLA
+<Multi_key> <comma> <t>                : "ţ"   U0163 # LATIN SMALL LETTER T WITH CEDILLA
+<Multi_key> <t> <comma>                : "ţ"   U0163 # LATIN SMALL LETTER T WITH CEDILLA
+<Multi_key> <cedilla> <t>              : "ţ"   U0163 # LATIN SMALL LETTER T WITH CEDILLA
+<dead_caron> <T>                       : "Ť"   U0164 # LATIN CAPITAL LETTER T WITH CARON
+<Multi_key> <c> <T>                    : "Ť"   U0164 # LATIN CAPITAL LETTER T WITH CARON
+<Multi_key> <less> <T>                         : "Ť"   U0164 # LATIN CAPITAL LETTER T WITH CARON
+<Multi_key> <T> <less>                         : "Ť"   U0164 # LATIN CAPITAL LETTER T WITH CARON
+<dead_caron> <t>                       : "ť"   U0165 # LATIN SMALL LETTER T WITH CARON
+<Multi_key> <c> <t>                    : "ť"   U0165 # LATIN SMALL LETTER T WITH CARON
+<Multi_key> <less> <t>                         : "ť"   U0165 # LATIN SMALL LETTER T WITH CARON
+<Multi_key> <t> <less>                         : "ť"   U0165 # LATIN SMALL LETTER T WITH CARON
+<dead_stroke> <T>                      : "Ŧ"   U0166 # LATIN CAPITAL LETTER T WITH STROKE
+<Multi_key> <slash> <T>                : "Ŧ"   U0166 # LATIN CAPITAL LETTER T WITH STROKE
+<Multi_key> <KP_Divide> <T>            : "Ŧ"   U0166 # LATIN CAPITAL LETTER T WITH STROKE
+<Multi_key> <T> <slash>                : "Ŧ"   U0166 # LATIN CAPITAL LETTER T WITH STROKE
+<Multi_key> <T> <minus>                : "Ŧ"   U0166 # LATIN CAPITAL LETTER T WITH STROKE
+<dead_stroke> <t>                      : "ŧ"   U0167 # LATIN SMALL LETTER T WITH STROKE
+<Multi_key> <slash> <t>                : "ŧ"   U0167 # LATIN SMALL LETTER T WITH STROKE
+<Multi_key> <KP_Divide> <t>            : "ŧ"   U0167 # LATIN SMALL LETTER T WITH STROKE
+<Multi_key> <t> <slash>                : "ŧ"   U0167 # LATIN SMALL LETTER T WITH STROKE
+<Multi_key> <t> <minus>                : "ŧ"   U0167 # LATIN SMALL LETTER T WITH STROKE
+<dead_tilde> <U>                       : "Ũ"   U0168 # LATIN CAPITAL LETTER U WITH TILDE
+<Multi_key> <asciitilde> <U>           : "Ũ"   U0168 # LATIN CAPITAL LETTER U WITH TILDE
+<Multi_key> <U> <asciitilde>           : "Ũ"   U0168 # LATIN CAPITAL LETTER U WITH TILDE
+<dead_tilde> <u>                       : "ũ"   U0169 # LATIN SMALL LETTER U WITH TILDE
+<Multi_key> <asciitilde> <u>           : "ũ"   U0169 # LATIN SMALL LETTER U WITH TILDE
+<Multi_key> <u> <asciitilde>           : "ũ"   U0169 # LATIN SMALL LETTER U WITH TILDE
+<dead_macron> <U>                      : "Ū"   U016A # LATIN CAPITAL LETTER U WITH MACRON
+<Multi_key> <macron> <U>               : "Ū"   U016A # LATIN CAPITAL LETTER U WITH MACRON
+<Multi_key> <underscore> <U>           : "Ū"   U016A # LATIN CAPITAL LETTER U WITH MACRON
+<Multi_key> <U> <underscore>           : "Ū"   U016A # LATIN CAPITAL LETTER U WITH MACRON
+<Multi_key> <minus> <U>                : "Ū"   U016A # LATIN CAPITAL LETTER U WITH MACRON
+<Multi_key> <U> <minus>                : "Ū"   U016A # LATIN CAPITAL LETTER U WITH MACRON
+<dead_macron> <u>                      : "ū"   U016B # LATIN SMALL LETTER U WITH MACRON
+<Multi_key> <macron> <u>               : "ū"   U016B # LATIN SMALL LETTER U WITH MACRON
+<Multi_key> <underscore> <u>           : "ū"   U016B # LATIN SMALL LETTER U WITH MACRON
+<Multi_key> <u> <underscore>           : "ū"   U016B # LATIN SMALL LETTER U WITH MACRON
+<Multi_key> <minus> <u>                : "ū"   U016B # LATIN SMALL LETTER U WITH MACRON
+<Multi_key> <u> <minus>                : "ū"   U016B # LATIN SMALL LETTER U WITH MACRON
+<dead_breve> <U>                       : "Ŭ"   U016C # LATIN CAPITAL LETTER U WITH BREVE
+<Multi_key> <U> <U>                    : "Ŭ"   U016C # LATIN CAPITAL LETTER U WITH BREVE
+<Multi_key> <b> <U>                    : "Ŭ"   U016C # LATIN CAPITAL LETTER U WITH BREVE
+<dead_breve> <u>                       : "ŭ"   U016D # LATIN SMALL LETTER U WITH BREVE
+<Multi_key> <U> <u>                    : "ŭ"   U016D # LATIN SMALL LETTER U WITH BREVE
+<Multi_key> <u> <u>                    : "ŭ"   U016D # LATIN SMALL LETTER U WITH BREVE
+<Multi_key> <b> <u>                    : "ŭ"   U016D # LATIN SMALL LETTER U WITH BREVE
+<dead_abovering> <U>                   : "Ů"   U016E # LATIN CAPITAL LETTER U WITH RING ABOVE
+<Multi_key> <o> <U>                    : "Ů"   U016E # LATIN CAPITAL LETTER U WITH RING ABOVE
+<Multi_key> <asterisk> <U>             : "Ů"   U016E # LATIN CAPITAL LETTER U WITH RING ABOVE
+<Multi_key> <U> <asterisk>             : "Ů"   U016E # LATIN CAPITAL LETTER U WITH RING ABOVE
+<dead_abovering> <u>                   : "ů"   U016F # LATIN SMALL LETTER U WITH RING ABOVE
+<Multi_key> <o> <u>                    : "ů"   U016F # LATIN SMALL LETTER U WITH RING ABOVE
+<Multi_key> <asterisk> <u>             : "ů"   U016F # LATIN SMALL LETTER U WITH RING ABOVE
+<Multi_key> <u> <asterisk>             : "ů"   U016F # LATIN SMALL LETTER U WITH RING ABOVE
+<dead_doubleacute> <U>                 : "Ű"   U0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+<Multi_key> <equal> <U>                : "Ű"   U0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+<dead_doubleacute> <u>                 : "ű"   U0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE
+<Multi_key> <equal> <u>                : "ű"   U0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE
+<dead_ogonek> <U>                      : "Ų"   U0172 # LATIN CAPITAL LETTER U WITH OGONEK
+<Multi_key> <semicolon> <U>            : "Ų"   U0172 # LATIN CAPITAL LETTER U WITH OGONEK
+<Multi_key> <comma> <U>                : "Ų"   U0172 # LATIN CAPITAL LETTER U WITH OGONEK
+<Multi_key> <U> <comma>                : "Ų"   U0172 # LATIN CAPITAL LETTER U WITH OGONEK
+<dead_ogonek> <u>                      : "ų"   U0173 # LATIN SMALL LETTER U WITH OGONEK
+<Multi_key> <semicolon> <u>            : "ų"   U0173 # LATIN SMALL LETTER U WITH OGONEK
+<Multi_key> <comma> <u>                : "ų"   U0173 # LATIN SMALL LETTER U WITH OGONEK
+<Multi_key> <u> <comma>                : "ų"   U0173 # LATIN SMALL LETTER U WITH OGONEK
+<dead_circumflex> <W>                  : "Ŵ"   U0174 # LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <W>          : "Ŵ"   U0174 # LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+<Multi_key> <W> <asciicircum>          : "Ŵ"   U0174 # LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+<dead_circumflex> <w>                  : "ŵ"   U0175 # LATIN SMALL LETTER W WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <w>          : "ŵ"   U0175 # LATIN SMALL LETTER W WITH CIRCUMFLEX
+<Multi_key> <w> <asciicircum>          : "ŵ"   U0175 # LATIN SMALL LETTER W WITH CIRCUMFLEX
+<dead_circumflex> <Y>                  : "Ŷ"   U0176 # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <Y>          : "Ŷ"   U0176 # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+<Multi_key> <Y> <asciicircum>          : "Ŷ"   U0176 # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+<dead_circumflex> <y>                  : "ŷ"   U0177 # LATIN SMALL LETTER Y WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <y>          : "ŷ"   U0177 # LATIN SMALL LETTER Y WITH CIRCUMFLEX
+<Multi_key> <y> <asciicircum>          : "ŷ"   U0177 # LATIN SMALL LETTER Y WITH CIRCUMFLEX
+<dead_diaeresis> <Y>                   : "Ÿ"   U0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS
+<Multi_key> <quotedbl> <Y>             : "Ÿ"   U0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS
+<Multi_key> <Y> <quotedbl>             : "Ÿ"   U0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS
+<Multi_key> <diaeresis> <Y>            : "Ÿ"   U0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS
+<Multi_key> <Y> <diaeresis>            : "Ÿ"   U0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS
+<dead_acute> <Z>                       : "Ź"   U0179 # LATIN CAPITAL LETTER Z WITH ACUTE
+<Multi_key> <acute> <Z>                : "Ź"   U0179 # LATIN CAPITAL LETTER Z WITH ACUTE
+<Multi_key> <apostrophe> <Z>           : "Ź"   U0179 # LATIN CAPITAL LETTER Z WITH ACUTE
+<Multi_key> <Z> <apostrophe>           : "Ź"   U0179 # LATIN CAPITAL LETTER Z WITH ACUTE
+<dead_acute> <z>                       : "ź"   U017A # LATIN SMALL LETTER Z WITH ACUTE
+<Multi_key> <acute> <z>                : "ź"   U017A # LATIN SMALL LETTER Z WITH ACUTE
+<Multi_key> <apostrophe> <z>           : "ź"   U017A # LATIN SMALL LETTER Z WITH ACUTE
+<Multi_key> <z> <apostrophe>           : "ź"   U017A # LATIN SMALL LETTER Z WITH ACUTE
+<dead_abovedot> <Z>                    : "Ż"   U017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE
+<Multi_key> <period> <Z>               : "Ż"   U017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE
+<Multi_key> <Z> <period>               : "Ż"   U017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE
+<dead_abovedot> <z>                    : "ż"   U017C # LATIN SMALL LETTER Z WITH DOT ABOVE
+<Multi_key> <period> <z>               : "ż"   U017C # LATIN SMALL LETTER Z WITH DOT ABOVE
+<Multi_key> <z> <period>               : "ż"   U017C # LATIN SMALL LETTER Z WITH DOT ABOVE
+<dead_caron> <Z>                       : "Ž"   U017D # LATIN CAPITAL LETTER Z WITH CARON
+<Multi_key> <c> <Z>                    : "Ž"   U017D # LATIN CAPITAL LETTER Z WITH CARON
+<Multi_key> <v> <Z>                    : "Ž"   U017D # LATIN CAPITAL LETTER Z WITH CARON
+<Multi_key> <less> <Z>                         : "Ž"   U017D # LATIN CAPITAL LETTER Z WITH CARON
+<Multi_key> <Z> <less>                         : "Ž"   U017D # LATIN CAPITAL LETTER Z WITH CARON
+<dead_caron> <z>                       : "ž"   U017E # LATIN SMALL LETTER Z WITH CARON
+<Multi_key> <c> <z>                    : "ž"   U017E # LATIN SMALL LETTER Z WITH CARON
+<Multi_key> <v> <z>                    : "ž"   U017E # LATIN SMALL LETTER Z WITH CARON
+<Multi_key> <less> <z>                         : "ž"   U017E # LATIN SMALL LETTER Z WITH CARON
+<Multi_key> <z> <less>                         : "ž"   U017E # LATIN SMALL LETTER Z WITH CARON
+<dead_stroke> <b>                      : "ƀ"   U0180 # LATIN SMALL LETTER B WITH STROKE
+<Multi_key> <slash> <b>                : "ƀ"   U0180 # LATIN SMALL LETTER B WITH STROKE
+<Multi_key> <KP_Divide> <b>            : "ƀ"   U0180 # LATIN SMALL LETTER B WITH STROKE
+<dead_stroke> <I>                      : "Ɨ"   U0197 # LATIN CAPITAL LETTER I WITH STROKE
+<Multi_key> <slash> <I>                : "Ɨ"   U0197 # LATIN CAPITAL LETTER I WITH STROKE
+<Multi_key> <KP_Divide> <I>            : "Ɨ"   U0197 # LATIN CAPITAL LETTER I WITH STROKE
+<dead_horn> <O>                        : "Ơ"   U01A0 # LATIN CAPITAL LETTER O WITH HORN
+<Multi_key> <plus> <O>                 : "Ơ"   U01A0 # LATIN CAPITAL LETTER O WITH HORN
+<dead_horn> <o>                        : "ơ"   U01A1 # LATIN SMALL LETTER O WITH HORN
+<Multi_key> <plus> <o>                 : "ơ"   U01A1 # LATIN SMALL LETTER O WITH HORN
+<dead_horn> <U>                        : "Ư"   U01AF # LATIN CAPITAL LETTER U WITH HORN
+<Multi_key> <plus> <U>                 : "Ư"   U01AF # LATIN CAPITAL LETTER U WITH HORN
+<dead_horn> <u>                        : "ư"   U01B0 # LATIN SMALL LETTER U WITH HORN
+<Multi_key> <plus> <u>                 : "ư"   U01B0 # LATIN SMALL LETTER U WITH HORN
+<dead_stroke> <Z>                      : "Ƶ"   U01B5 # LATIN CAPITAL LETTER Z WITH STROKE
+<Multi_key> <slash> <Z>                : "Ƶ"   U01B5 # LATIN CAPITAL LETTER Z WITH STROKE
+<Multi_key> <KP_Divide> <Z>            : "Ƶ"   U01B5 # LATIN CAPITAL LETTER Z WITH STROKE
+<dead_stroke> <z>                      : "ƶ"   U01B6 # LATIN SMALL LETTER Z WITH STROKE
+<Multi_key> <slash> <z>                : "ƶ"   U01B6 # LATIN SMALL LETTER Z WITH STROKE
+<Multi_key> <KP_Divide> <z>            : "ƶ"   U01B6 # LATIN SMALL LETTER Z WITH STROKE
+<dead_caron> <A>                       : "Ǎ"   U01CD # LATIN CAPITAL LETTER A WITH CARON
+<Multi_key> <c> <A>                    : "Ǎ"   U01CD # LATIN CAPITAL LETTER A WITH CARON
+<dead_caron> <a>                       : "ǎ"   U01CE # LATIN SMALL LETTER A WITH CARON
+<Multi_key> <c> <a>                    : "ǎ"   U01CE # LATIN SMALL LETTER A WITH CARON
+<dead_caron> <I>                       : "Ǐ"   U01CF # LATIN CAPITAL LETTER I WITH CARON
+<Multi_key> <c> <I>                    : "Ǐ"   U01CF # LATIN CAPITAL LETTER I WITH CARON
+<dead_caron> <i>                       : "ǐ"   U01D0 # LATIN SMALL LETTER I WITH CARON
+<Multi_key> <c> <i>                    : "ǐ"   U01D0 # LATIN SMALL LETTER I WITH CARON
+<dead_caron> <O>                       : "Ǒ"   U01D1 # LATIN CAPITAL LETTER O WITH CARON
+<Multi_key> <c> <O>                    : "Ǒ"   U01D1 # LATIN CAPITAL LETTER O WITH CARON
+<dead_caron> <o>                       : "ǒ"   U01D2 # LATIN SMALL LETTER O WITH CARON
+<Multi_key> <c> <o>                    : "ǒ"   U01D2 # LATIN SMALL LETTER O WITH CARON
+<dead_caron> <U>                       : "Ǔ"   U01D3 # LATIN CAPITAL LETTER U WITH CARON
+<Multi_key> <c> <U>                    : "Ǔ"   U01D3 # LATIN CAPITAL LETTER U WITH CARON
+<dead_caron> <u>                       : "ǔ"   U01D4 # LATIN SMALL LETTER U WITH CARON
+<Multi_key> <c> <u>                    : "ǔ"   U01D4 # LATIN SMALL LETTER U WITH CARON
+<dead_macron> <Udiaeresis>             : "Ǖ"   U01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <Udiaeresis>      : "Ǖ"   U01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <Udiaeresis>  : "Ǖ"   U01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+<dead_macron> <dead_diaeresis> <U>     : "Ǖ"   U01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+<dead_macron> <Multi_key> <quotedbl> <U>       : "Ǖ"   U01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <dead_diaeresis> <U>      : "Ǖ"   U01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <quotedbl> <U>    : "Ǖ"   U01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <dead_diaeresis> <U>  : "Ǖ"   U01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <quotedbl> <U>        : "Ǖ"   U01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+<dead_macron> <udiaeresis>             : "ǖ"   U01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <udiaeresis>      : "ǖ"   U01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <udiaeresis>  : "ǖ"   U01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+<dead_macron> <dead_diaeresis> <u>     : "ǖ"   U01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+<dead_macron> <Multi_key> <quotedbl> <u>       : "ǖ"   U01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <dead_diaeresis> <u>      : "ǖ"   U01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <quotedbl> <u>    : "ǖ"   U01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <dead_diaeresis> <u>  : "ǖ"   U01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <quotedbl> <u>        : "ǖ"   U01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+<dead_acute> <Udiaeresis>              : "Ǘ"   U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+<Multi_key> <acute> <Udiaeresis>       : "Ǘ"   U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+<Multi_key> <apostrophe> <Udiaeresis>  : "Ǘ"   U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+<dead_acute> <dead_diaeresis> <U>      : "Ǘ"   U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+<dead_acute> <Multi_key> <quotedbl> <U>        : "Ǘ"   U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+<Multi_key> <acute> <dead_diaeresis> <U>       : "Ǘ"   U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+<Multi_key> <acute> <quotedbl> <U>     : "Ǘ"   U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+<Multi_key> <apostrophe> <dead_diaeresis> <U>  : "Ǘ"   U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+<Multi_key> <apostrophe> <quotedbl> <U>        : "Ǘ"   U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+<dead_acute> <udiaeresis>              : "ǘ"   U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+<Multi_key> <acute> <udiaeresis>       : "ǘ"   U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+<Multi_key> <apostrophe> <udiaeresis>  : "ǘ"   U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+<dead_acute> <dead_diaeresis> <u>      : "ǘ"   U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+<dead_acute> <Multi_key> <quotedbl> <u>        : "ǘ"   U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+<Multi_key> <acute> <dead_diaeresis> <u>       : "ǘ"   U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+<Multi_key> <acute> <quotedbl> <u>     : "ǘ"   U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+<Multi_key> <apostrophe> <dead_diaeresis> <u>  : "ǘ"   U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+<Multi_key> <apostrophe> <quotedbl> <u>        : "ǘ"   U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+<dead_caron> <Udiaeresis>              : "Ǚ"   U01D9 # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+<Multi_key> <c> <Udiaeresis>           : "Ǚ"   U01D9 # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+<dead_caron> <dead_diaeresis> <U>      : "Ǚ"   U01D9 # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+<dead_caron> <Multi_key> <quotedbl> <U>        : "Ǚ"   U01D9 # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+<Multi_key> <c> <dead_diaeresis> <U>   : "Ǚ"   U01D9 # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+<Multi_key> <c> <quotedbl> <U>         : "Ǚ"   U01D9 # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+<dead_caron> <udiaeresis>              : "ǚ"   U01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+<Multi_key> <c> <udiaeresis>           : "ǚ"   U01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+<dead_caron> <dead_diaeresis> <u>      : "ǚ"   U01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+<dead_caron> <Multi_key> <quotedbl> <u>        : "ǚ"   U01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+<Multi_key> <c> <dead_diaeresis> <u>   : "ǚ"   U01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+<Multi_key> <c> <quotedbl> <u>         : "ǚ"   U01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+<dead_grave> <Udiaeresis>              : "Ǜ"   U01DB # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+<Multi_key> <grave> <Udiaeresis>       : "Ǜ"   U01DB # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+<dead_grave> <dead_diaeresis> <U>      : "Ǜ"   U01DB # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+<dead_grave> <Multi_key> <quotedbl> <U>        : "Ǜ"   U01DB # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+<Multi_key> <grave> <dead_diaeresis> <U>       : "Ǜ"   U01DB # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+<Multi_key> <grave> <quotedbl> <U>     : "Ǜ"   U01DB # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+<dead_grave> <udiaeresis>              : "ǜ"   U01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+<Multi_key> <grave> <udiaeresis>       : "ǜ"   U01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+<dead_grave> <dead_diaeresis> <u>      : "ǜ"   U01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+<dead_grave> <Multi_key> <quotedbl> <u>        : "ǜ"   U01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+<Multi_key> <grave> <dead_diaeresis> <u>       : "ǜ"   U01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+<Multi_key> <grave> <quotedbl> <u>     : "ǜ"   U01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+<dead_macron> <Adiaeresis>             : "Ǟ"   U01DE # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <Adiaeresis>      : "Ǟ"   U01DE # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <Adiaeresis>  : "Ǟ"   U01DE # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+<dead_macron> <dead_diaeresis> <A>     : "Ǟ"   U01DE # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+<dead_macron> <Multi_key> <quotedbl> <A>       : "Ǟ"   U01DE # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <dead_diaeresis> <A>      : "Ǟ"   U01DE # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <quotedbl> <A>    : "Ǟ"   U01DE # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <dead_diaeresis> <A>  : "Ǟ"   U01DE # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <quotedbl> <A>        : "Ǟ"   U01DE # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+<dead_macron> <adiaeresis>             : "ǟ"   U01DF # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <adiaeresis>      : "ǟ"   U01DF # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <adiaeresis>  : "ǟ"   U01DF # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+<dead_macron> <dead_diaeresis> <a>     : "ǟ"   U01DF # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+<dead_macron> <Multi_key> <quotedbl> <a>       : "ǟ"   U01DF # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <dead_diaeresis> <a>      : "ǟ"   U01DF # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <quotedbl> <a>    : "ǟ"   U01DF # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <dead_diaeresis> <a>  : "ǟ"   U01DF # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <quotedbl> <a>        : "ǟ"   U01DF # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+<dead_macron> <U0226>                  : "Ǡ"   U01E0 # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+<Multi_key> <macron> <U0226>           : "Ǡ"   U01E0 # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+<Multi_key> <underscore> <U0226>       : "Ǡ"   U01E0 # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+<dead_macron> <dead_abovedot> <A>      : "Ǡ"   U01E0 # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+<dead_macron> <Multi_key> <period> <A>         : "Ǡ"   U01E0 # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+<Multi_key> <macron> <dead_abovedot> <A>       : "Ǡ"   U01E0 # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+<Multi_key> <macron> <period> <A>      : "Ǡ"   U01E0 # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+<Multi_key> <underscore> <dead_abovedot> <A>   : "Ǡ"   U01E0 # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+<Multi_key> <underscore> <period> <A>  : "Ǡ"   U01E0 # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+<dead_macron> <U0227>                  : "ǡ"   U01E1 # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+<Multi_key> <macron> <U0227>           : "ǡ"   U01E1 # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+<Multi_key> <underscore> <U0227>       : "ǡ"   U01E1 # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+<dead_macron> <dead_abovedot> <a>      : "ǡ"   U01E1 # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+<dead_macron> <Multi_key> <period> <a>         : "ǡ"   U01E1 # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+<Multi_key> <macron> <dead_abovedot> <a>       : "ǡ"   U01E1 # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+<Multi_key> <macron> <period> <a>      : "ǡ"   U01E1 # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+<Multi_key> <underscore> <dead_abovedot> <a>   : "ǡ"   U01E1 # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+<Multi_key> <underscore> <period> <a>  : "ǡ"   U01E1 # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+<dead_macron> <AE>                     : "Ǣ"   U01E2 # LATIN CAPITAL LETTER AE WITH MACRON
+<Multi_key> <macron> <AE>              : "Ǣ"   U01E2 # LATIN CAPITAL LETTER AE WITH MACRON
+<Multi_key> <underscore> <AE>          : "Ǣ"   U01E2 # LATIN CAPITAL LETTER AE WITH MACRON
+<dead_macron> <ae>                     : "ǣ"   U01E3 # LATIN SMALL LETTER AE WITH MACRON
+<Multi_key> <macron> <ae>              : "ǣ"   U01E3 # LATIN SMALL LETTER AE WITH MACRON
+<Multi_key> <underscore> <ae>          : "ǣ"   U01E3 # LATIN SMALL LETTER AE WITH MACRON
+<dead_stroke> <G>                      : "Ǥ"   U01E4 # LATIN CAPITAL LETTER G WITH STROKE
+<Multi_key> <slash> <G>                : "Ǥ"   U01E4 # LATIN CAPITAL LETTER G WITH STROKE
+<Multi_key> <KP_Divide> <G>            : "Ǥ"   U01E4 # LATIN CAPITAL LETTER G WITH STROKE
+<dead_stroke> <g>                      : "ǥ"   U01E5 # LATIN SMALL LETTER G WITH STROKE
+<Multi_key> <slash> <g>                : "ǥ"   U01E5 # LATIN SMALL LETTER G WITH STROKE
+<Multi_key> <KP_Divide> <g>            : "ǥ"   U01E5 # LATIN SMALL LETTER G WITH STROKE
+<dead_caron> <G>                       : "Ǧ"   U01E6 # LATIN CAPITAL LETTER G WITH CARON
+<Multi_key> <c> <G>                    : "Ǧ"   U01E6 # LATIN CAPITAL LETTER G WITH CARON
+<dead_caron> <g>                       : "ǧ"   U01E7 # LATIN SMALL LETTER G WITH CARON
+<Multi_key> <c> <g>                    : "ǧ"   U01E7 # LATIN SMALL LETTER G WITH CARON
+<dead_caron> <K>                       : "Ǩ"   U01E8 # LATIN CAPITAL LETTER K WITH CARON
+<Multi_key> <c> <K>                    : "Ǩ"   U01E8 # LATIN CAPITAL LETTER K WITH CARON
+<dead_caron> <k>                       : "ǩ"   U01E9 # LATIN SMALL LETTER K WITH CARON
+<Multi_key> <c> <k>                    : "ǩ"   U01E9 # LATIN SMALL LETTER K WITH CARON
+<dead_ogonek> <O>                      : "Ǫ"   U01EA # LATIN CAPITAL LETTER O WITH OGONEK
+<Multi_key> <semicolon> <O>            : "Ǫ"   U01EA # LATIN CAPITAL LETTER O WITH OGONEK
+<dead_ogonek> <o>                      : "ǫ"   U01EB # LATIN SMALL LETTER O WITH OGONEK
+<Multi_key> <semicolon> <o>            : "ǫ"   U01EB # LATIN SMALL LETTER O WITH OGONEK
+<dead_macron> <U01EA>          : "Ǭ"   U01EC # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+<Multi_key> <macron> <U01EA>   : "Ǭ"   U01EC # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+<Multi_key> <underscore> <U01EA>       : "Ǭ"   U01EC # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+<dead_macron> <dead_ogonek> <O>        : "Ǭ"   U01EC # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+<dead_macron> <Multi_key> <semicolon> <O>      : "Ǭ"   U01EC # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+<Multi_key> <macron> <dead_ogonek> <O>         : "Ǭ"   U01EC # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+<Multi_key> <macron> <semicolon> <O>   : "Ǭ"   U01EC # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+<Multi_key> <underscore> <dead_ogonek> <O>     : "Ǭ"   U01EC # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+<Multi_key> <underscore> <semicolon> <O>       : "Ǭ"   U01EC # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+<dead_macron> <U01EB>          : "ǭ"   U01ED # LATIN SMALL LETTER O WITH OGONEK AND MACRON
+<Multi_key> <macron> <U01EB>   : "ǭ"   U01ED # LATIN SMALL LETTER O WITH OGONEK AND MACRON
+<Multi_key> <underscore> <U01EB>       : "ǭ"   U01ED # LATIN SMALL LETTER O WITH OGONEK AND MACRON
+<dead_macron> <dead_ogonek> <o>        : "ǭ"   U01ED # LATIN SMALL LETTER O WITH OGONEK AND MACRON
+<dead_macron> <Multi_key> <semicolon> <o>      : "ǭ"   U01ED # LATIN SMALL LETTER O WITH OGONEK AND MACRON
+<Multi_key> <macron> <dead_ogonek> <o>         : "ǭ"   U01ED # LATIN SMALL LETTER O WITH OGONEK AND MACRON
+<Multi_key> <macron> <semicolon> <o>   : "ǭ"   U01ED # LATIN SMALL LETTER O WITH OGONEK AND MACRON
+<Multi_key> <underscore> <dead_ogonek> <o>     : "ǭ"   U01ED # LATIN SMALL LETTER O WITH OGONEK AND MACRON
+<Multi_key> <underscore> <semicolon> <o>       : "ǭ"   U01ED # LATIN SMALL LETTER O WITH OGONEK AND MACRON
+<dead_caron> <EZH>             : "Ǯ"   U01EE # LATIN CAPITAL LETTER EZH WITH CARON
+<Multi_key> <c> <EZH>          : "Ǯ"   U01EE # LATIN CAPITAL LETTER EZH WITH CARON
+<dead_caron> <ezh>             : "ǯ"   U01EF # LATIN SMALL LETTER EZH WITH CARON
+<Multi_key> <c> <ezh>          : "ǯ"   U01EF # LATIN SMALL LETTER EZH WITH CARON
+<dead_caron> <j>                       : "ǰ"   U01F0 # LATIN SMALL LETTER J WITH CARON
+<Multi_key> <c> <j>                    : "ǰ"   U01F0 # LATIN SMALL LETTER J WITH CARON
+<dead_acute> <G>                       : "Ǵ"   U01F4 # LATIN CAPITAL LETTER G WITH ACUTE
+<Multi_key> <acute> <G>                : "Ǵ"   U01F4 # LATIN CAPITAL LETTER G WITH ACUTE
+<Multi_key> <apostrophe> <G>           : "Ǵ"   U01F4 # LATIN CAPITAL LETTER G WITH ACUTE
+<dead_acute> <g>                       : "ǵ"   U01F5 # LATIN SMALL LETTER G WITH ACUTE
+<Multi_key> <acute> <g>                : "ǵ"   U01F5 # LATIN SMALL LETTER G WITH ACUTE
+<Multi_key> <apostrophe> <g>           : "ǵ"   U01F5 # LATIN SMALL LETTER G WITH ACUTE
+<dead_grave> <N>                       : "Ǹ"   U01F8 # LATIN CAPITAL LETTER N WITH GRAVE
+<Multi_key> <grave> <N>                : "Ǹ"   U01F8 # LATIN CAPITAL LETTER N WITH GRAVE
+<dead_grave> <n>                       : "ǹ"   U01F9 # LATIN SMALL LETTER N WITH GRAVE
+<Multi_key> <grave> <n>                : "ǹ"   U01F9 # LATIN SMALL LETTER N WITH GRAVE
+<dead_acute> <Aring>                   : "Ǻ"   U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+<Multi_key> <acute> <Aring>            : "Ǻ"   U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+<Multi_key> <apostrophe> <Aring>       : "Ǻ"   U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+<dead_acute> <dead_abovering> <A>      : "Ǻ"   U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+<dead_acute> <Multi_key> <o> <A>       : "Ǻ"   U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+<Multi_key> <acute> <dead_abovering> <A>       : "Ǻ"   U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+<Multi_key> <apostrophe> <dead_abovering> <A>  : "Ǻ"   U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+<Multi_key> <asterisk> <apostrophe> <A>        : "Ǻ"   U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+<dead_acute> <aring>                   : "ǻ"   U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+<Multi_key> <acute> <aring>            : "ǻ"   U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+<Multi_key> <apostrophe> <aring>       : "ǻ"   U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+<dead_acute> <dead_abovering> <a>      : "ǻ"   U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+<dead_acute> <Multi_key> <o> <a>       : "ǻ"   U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+<Multi_key> <acute> <dead_abovering> <a>       : "ǻ"   U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+<Multi_key> <apostrophe> <dead_abovering> <a>  : "ǻ"   U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+<Multi_key> <asterisk> <apostrophe> <a>        : "ǻ"   U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+<dead_acute> <AE>                      : "Ǽ"   U01FC # LATIN CAPITAL LETTER AE WITH ACUTE
+<Multi_key> <acute> <AE>               : "Ǽ"   U01FC # LATIN CAPITAL LETTER AE WITH ACUTE
+<Multi_key> <apostrophe> <AE>          : "Ǽ"   U01FC # LATIN CAPITAL LETTER AE WITH ACUTE
+<dead_acute> <ae>                      : "ǽ"   U01FD # LATIN SMALL LETTER AE WITH ACUTE
+<Multi_key> <acute> <ae>               : "ǽ"   U01FD # LATIN SMALL LETTER AE WITH ACUTE
+<Multi_key> <apostrophe> <ae>          : "ǽ"   U01FD # LATIN SMALL LETTER AE WITH ACUTE
+<dead_acute> <Ooblique>                : "Ǿ"   U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+<Multi_key> <acute> <Ooblique>         : "Ǿ"   U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+<Multi_key> <apostrophe> <Ooblique>    : "Ǿ"   U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+<dead_acute> <dead_stroke> <O>         : "Ǿ"   U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+<dead_acute> <Multi_key> <slash> <O>   : "Ǿ"   U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+<Multi_key> <acute> <slash> <O>        : "Ǿ"   U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+<Multi_key> <apostrophe> <slash> <O>   : "Ǿ"   U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+<dead_acute> <Multi_key> <KP_Divide> <O>       : "Ǿ"   U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+<Multi_key> <acute> <KP_Divide> <O>    : "Ǿ"   U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+<Multi_key> <apostrophe> <KP_Divide> <O>       : "Ǿ"   U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+<dead_stroke> <dead_acute> <O>         : "Ǿ"   U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+<dead_acute> <oslash>                  : "ǿ"   U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE
+<Multi_key> <acute> <oslash>           : "ǿ"   U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE
+<Multi_key> <apostrophe> <oslash>      : "ǿ"   U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE
+<dead_acute> <dead_stroke> <o>         : "ǿ"   U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE
+<dead_acute> <Multi_key> <slash> <o>   : "ǿ"   U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE
+<Multi_key> <acute> <slash> <o>        : "ǿ"   U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE
+<Multi_key> <apostrophe> <slash> <o>   : "ǿ"   U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE
+<dead_acute> <Multi_key> <KP_Divide> <o>       : "ǿ"   U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE
+<Multi_key> <acute> <KP_Divide> <o>    : "ǿ"   U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE
+<Multi_key> <apostrophe> <KP_Divide> <o>       : "ǿ"   U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE
+<dead_stroke> <dead_acute> <o>         : "ǿ"   U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE
+<dead_double_grave> <A>                        : "Ȁ"   U0200 # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
+<dead_double_grave> <a>                        : "ȁ"   U0201 # LATIN SMALL LETTER A WITH DOUBLE GRAVE
+<dead_inverted_breve> <A>                      : "Ȃ"   U0202 # LATIN CAPITAL LETTER A WITH INVERTED BREVE
+<dead_inverted_breve> <a>                      : "ȃ"   U0203 # LATIN SMALL LETTER A WITH INVERTED BREVE
+<dead_double_grave> <E>                        : "Ȅ"   U0204 # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
+<dead_double_grave> <e>                        : "ȅ"   U0205 # LATIN SMALL LETTER E WITH DOUBLE GRAVE
+<dead_inverted_breve> <E>                      : "Ȇ"   U0206 # LATIN CAPITAL LETTER E WITH INVERTED BREVE
+<dead_inverted_breve> <e>                      : "ȇ"   U0207 # LATIN SMALL LETTER E WITH INVERTED BREVE
+<dead_double_grave> <I>                        : "Ȉ"   U0208 # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
+<dead_double_grave> <i>                        : "ȉ"   U0209 # LATIN SMALL LETTER I WITH DOUBLE GRAVE
+<dead_inverted_breve> <I>                      : "Ȋ"   U020A # LATIN CAPITAL LETTER I WITH INVERTED BREVE
+<dead_inverted_breve> <i>                      : "ȋ"   U020B # LATIN SMALL LETTER I WITH INVERTED BREVE
+<dead_double_grave> <O>                        : "Ȍ"   U020C # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
+<dead_double_grave> <o>                        : "ȍ"   U020D # LATIN SMALL LETTER O WITH DOUBLE GRAVE
+<dead_inverted_breve> <O>                      : "Ȏ"   U020E # LATIN CAPITAL LETTER O WITH INVERTED BREVE
+<dead_inverted_breve> <o>                      : "ȏ"   U020F # LATIN SMALL LETTER O WITH INVERTED BREVE
+<dead_double_grave> <R>                        : "Ȑ"   U0210 # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
+<dead_double_grave> <r>                        : "ȑ"   U0211 # LATIN SMALL LETTER R WITH DOUBLE GRAVE
+<dead_inverted_breve> <R>                      : "Ȓ"   U0212 # LATIN CAPITAL LETTER R WITH INVERTED BREVE
+<dead_inverted_breve> <r>                      : "ȓ"   U0213 # LATIN SMALL LETTER R WITH INVERTED BREVE
+<dead_double_grave> <U>                        : "Ȕ"   U0214 # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
+<dead_double_grave> <u>                        : "ȕ"   U0215 # LATIN SMALL LETTER U WITH DOUBLE GRAVE
+<dead_inverted_breve> <U>                      : "Ȗ"   U0216 # LATIN CAPITAL LETTER U WITH INVERTED BREVE
+<dead_inverted_breve> <u>                      : "ȗ"   U0217 # LATIN SMALL LETTER U WITH INVERTED BREVE
+<dead_caron> <H>                       : "Ȟ"   U021E # LATIN CAPITAL LETTER H WITH CARON
+<Multi_key> <c> <H>                    : "Ȟ"   U021E # LATIN CAPITAL LETTER H WITH CARON
+<dead_caron> <h>                       : "ȟ"   U021F # LATIN SMALL LETTER H WITH CARON
+<Multi_key> <c> <h>                    : "ȟ"   U021F # LATIN SMALL LETTER H WITH CARON
+<dead_abovedot> <A>                    : "Ȧ"   U0226 # LATIN CAPITAL LETTER A WITH DOT ABOVE
+<Multi_key> <period> <A>               : "Ȧ"   U0226 # LATIN CAPITAL LETTER A WITH DOT ABOVE
+<dead_abovedot> <a>                    : "ȧ"   U0227 # LATIN SMALL LETTER A WITH DOT ABOVE
+<Multi_key> <period> <a>               : "ȧ"   U0227 # LATIN SMALL LETTER A WITH DOT ABOVE
+<dead_cedilla> <E>                     : "Ȩ"   U0228 # LATIN CAPITAL LETTER E WITH CEDILLA
+<Multi_key> <cedilla> <E>              : "Ȩ"   U0228 # LATIN CAPITAL LETTER E WITH CEDILLA
+<dead_cedilla> <e>                     : "ȩ"   U0229 # LATIN SMALL LETTER E WITH CEDILLA
+<Multi_key> <cedilla> <e>              : "ȩ"   U0229 # LATIN SMALL LETTER E WITH CEDILLA
+<dead_macron> <Odiaeresis>             : "Ȫ"   U022A # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <Odiaeresis>      : "Ȫ"   U022A # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <Odiaeresis>  : "Ȫ"   U022A # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+<dead_macron> <dead_diaeresis> <O>     : "Ȫ"   U022A # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+<dead_macron> <Multi_key> <quotedbl> <O>       : "Ȫ"   U022A # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <dead_diaeresis> <O>      : "Ȫ"   U022A # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <quotedbl> <O>    : "Ȫ"   U022A # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <dead_diaeresis> <O>  : "Ȫ"   U022A # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <quotedbl> <O>        : "Ȫ"   U022A # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+<dead_macron> <odiaeresis>             : "ȫ"   U022B # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <odiaeresis>      : "ȫ"   U022B # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <odiaeresis>  : "ȫ"   U022B # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+<dead_macron> <dead_diaeresis> <o>     : "ȫ"   U022B # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+<dead_macron> <Multi_key> <quotedbl> <o>       : "ȫ"   U022B # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <dead_diaeresis> <o>      : "ȫ"   U022B # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <quotedbl> <o>    : "ȫ"   U022B # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <dead_diaeresis> <o>  : "ȫ"   U022B # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <quotedbl> <o>        : "ȫ"   U022B # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+<dead_macron> <Otilde>                 : "Ȭ"   U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+<Multi_key> <macron> <Otilde>          : "Ȭ"   U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+<Multi_key> <underscore> <Otilde>      : "Ȭ"   U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+<dead_macron> <dead_tilde> <O>         : "Ȭ"   U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+<dead_macron> <Multi_key> <asciitilde> <O>     : "Ȭ"   U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+<Multi_key> <macron> <dead_tilde> <O>  : "Ȭ"   U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+<Multi_key> <macron> <asciitilde> <O>  : "Ȭ"   U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+<Multi_key> <underscore> <dead_tilde> <O>      : "Ȭ"   U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+<Multi_key> <underscore> <asciitilde> <O>      : "Ȭ"   U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+<dead_macron> <otilde>                 : "ȭ"   U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON
+<Multi_key> <macron> <otilde>          : "ȭ"   U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON
+<Multi_key> <underscore> <otilde>      : "ȭ"   U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON
+<dead_macron> <dead_tilde> <o>         : "ȭ"   U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON
+<dead_macron> <Multi_key> <asciitilde> <o>     : "ȭ"   U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON
+<Multi_key> <macron> <dead_tilde> <o>  : "ȭ"   U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON
+<Multi_key> <macron> <asciitilde> <o>  : "ȭ"   U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON
+<Multi_key> <underscore> <dead_tilde> <o>      : "ȭ"   U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON
+<Multi_key> <underscore> <asciitilde> <o>      : "ȭ"   U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON
+<dead_abovedot> <O>                    : "Ȯ"   U022E # LATIN CAPITAL LETTER O WITH DOT ABOVE
+<Multi_key> <period> <O>               : "Ȯ"   U022E # LATIN CAPITAL LETTER O WITH DOT ABOVE
+<dead_abovedot> <o>                    : "ȯ"   U022F # LATIN SMALL LETTER O WITH DOT ABOVE
+<Multi_key> <period> <o>               : "ȯ"   U022F # LATIN SMALL LETTER O WITH DOT ABOVE
+<dead_macron> <U022E>          : "Ȱ"   U0230 # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+<Multi_key> <macron> <U022E>   : "Ȱ"   U0230 # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+<Multi_key> <underscore> <U022E>       : "Ȱ"   U0230 # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+<dead_macron> <dead_abovedot> <O>      : "Ȱ"   U0230 # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+<dead_macron> <Multi_key> <period> <O>         : "Ȱ"   U0230 # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+<Multi_key> <macron> <dead_abovedot> <O>       : "Ȱ"   U0230 # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+<Multi_key> <macron> <period> <O>      : "Ȱ"   U0230 # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+<Multi_key> <underscore> <dead_abovedot> <O>   : "Ȱ"   U0230 # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+<Multi_key> <underscore> <period> <O>  : "Ȱ"   U0230 # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+<dead_macron> <U022F>          : "ȱ"   U0231 # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+<Multi_key> <macron> <U022F>   : "ȱ"   U0231 # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+<Multi_key> <underscore> <U022F>       : "ȱ"   U0231 # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+<dead_macron> <dead_abovedot> <o>      : "ȱ"   U0231 # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+<dead_macron> <Multi_key> <period> <o>         : "ȱ"   U0231 # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+<Multi_key> <macron> <dead_abovedot> <o>       : "ȱ"   U0231 # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+<Multi_key> <macron> <period> <o>      : "ȱ"   U0231 # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+<Multi_key> <underscore> <dead_abovedot> <o>   : "ȱ"   U0231 # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+<Multi_key> <underscore> <period> <o>  : "ȱ"   U0231 # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+<dead_macron> <Y>                      : "Ȳ"   U0232 # LATIN CAPITAL LETTER Y WITH MACRON
+<Multi_key> <macron> <Y>               : "Ȳ"   U0232 # LATIN CAPITAL LETTER Y WITH MACRON
+<Multi_key> <underscore> <Y>           : "Ȳ"   U0232 # LATIN CAPITAL LETTER Y WITH MACRON
+<dead_macron> <y>                      : "ȳ"   U0233 # LATIN SMALL LETTER Y WITH MACRON
+<Multi_key> <macron> <y>               : "ȳ"   U0233 # LATIN SMALL LETTER Y WITH MACRON
+<Multi_key> <underscore> <y>           : "ȳ"   U0233 # LATIN SMALL LETTER Y WITH MACRON
+<Multi_key> <e> <e>                    : "ə"   U0259 # LATIN SMALL LETTER SCHWA
+<dead_stroke> <i>                      : "ɨ"   U0268 # LATIN SMALL LETTER I WITH STROKE
+<Multi_key> <slash> <i>                : "ɨ"   U0268 # LATIN SMALL LETTER I WITH STROKE
+<Multi_key> <KP_Divide> <i>            : "ɨ"   U0268 # LATIN SMALL LETTER I WITH STROKE
+<Multi_key> <slash> <U0294>    : "ʡ"   U02A1 # LATIN LETTER GLOTTAL STOP WITH STROKE
+<Multi_key> <KP_Divide> <U0294>        : "ʡ"   U02A1 # LATIN LETTER GLOTTAL STOP WITH STROKE
+<dead_circumflex> <Multi_key> <underscore> <h>         : "ʰ"   U02B0 # MODIFIER LETTER SMALL H
+<Multi_key> <asciicircum> <underscore> <h>     : "ʰ"   U02B0 # MODIFIER LETTER SMALL H
+<dead_circumflex> <Multi_key> <underbar> <h>   : "ʰ"   U02B0 # MODIFIER LETTER SMALL H
+<Multi_key> <asciicircum> <underbar> <h>       : "ʰ"   U02B0 # MODIFIER LETTER SMALL H
+<dead_circumflex> <Multi_key> <underscore> <U0266>     : "ʱ"   U02B1 # MODIFIER LETTER SMALL H WITH HOOK
+<Multi_key> <asciicircum> <underscore> <U0266>         : "ʱ"   U02B1 # MODIFIER LETTER SMALL H WITH HOOK
+<dead_circumflex> <Multi_key> <underbar> <U0266>       : "ʱ"   U02B1 # MODIFIER LETTER SMALL H WITH HOOK
+<Multi_key> <asciicircum> <underbar> <U0266>   : "ʱ"   U02B1 # MODIFIER LETTER SMALL H WITH HOOK
+<dead_circumflex> <Multi_key> <underscore> <j>         : "ʲ"   U02B2 # MODIFIER LETTER SMALL J
+<Multi_key> <asciicircum> <underscore> <j>     : "ʲ"   U02B2 # MODIFIER LETTER SMALL J
+<dead_circumflex> <Multi_key> <underbar> <j>   : "ʲ"   U02B2 # MODIFIER LETTER SMALL J
+<Multi_key> <asciicircum> <underbar> <j>       : "ʲ"   U02B2 # MODIFIER LETTER SMALL J
+<dead_circumflex> <Multi_key> <underscore> <r>         : "ʳ"   U02B3 # MODIFIER LETTER SMALL R
+<Multi_key> <asciicircum> <underscore> <r>     : "ʳ"   U02B3 # MODIFIER LETTER SMALL R
+<dead_circumflex> <Multi_key> <underbar> <r>   : "ʳ"   U02B3 # MODIFIER LETTER SMALL R
+<Multi_key> <asciicircum> <underbar> <r>       : "ʳ"   U02B3 # MODIFIER LETTER SMALL R
+<dead_circumflex> <Multi_key> <underscore> <U0279>     : "ʴ"   U02B4 # MODIFIER LETTER SMALL TURNED R
+<Multi_key> <asciicircum> <underscore> <U0279>         : "ʴ"   U02B4 # MODIFIER LETTER SMALL TURNED R
+<dead_circumflex> <Multi_key> <underbar> <U0279>       : "ʴ"   U02B4 # MODIFIER LETTER SMALL TURNED R
+<Multi_key> <asciicircum> <underbar> <U0279>   : "ʴ"   U02B4 # MODIFIER LETTER SMALL TURNED R
+<dead_circumflex> <Multi_key> <underscore> <U027B>     : "ʵ"   U02B5 # MODIFIER LETTER SMALL TURNED R WITH HOOK
+<Multi_key> <asciicircum> <underscore> <U027B>         : "ʵ"   U02B5 # MODIFIER LETTER SMALL TURNED R WITH HOOK
+<dead_circumflex> <Multi_key> <underbar> <U027B>       : "ʵ"   U02B5 # MODIFIER LETTER SMALL TURNED R WITH HOOK
+<Multi_key> <asciicircum> <underbar> <U027B>   : "ʵ"   U02B5 # MODIFIER LETTER SMALL TURNED R WITH HOOK
+<dead_circumflex> <Multi_key> <underscore> <U0281>     : "ʶ"   U02B6 # MODIFIER LETTER SMALL CAPITAL INVERTED R
+<Multi_key> <asciicircum> <underscore> <U0281>         : "ʶ"   U02B6 # MODIFIER LETTER SMALL CAPITAL INVERTED R
+<dead_circumflex> <Multi_key> <underbar> <U0281>       : "ʶ"   U02B6 # MODIFIER LETTER SMALL CAPITAL INVERTED R
+<Multi_key> <asciicircum> <underbar> <U0281>   : "ʶ"   U02B6 # MODIFIER LETTER SMALL CAPITAL INVERTED R
+<dead_circumflex> <Multi_key> <underscore> <w>         : "ʷ"   U02B7 # MODIFIER LETTER SMALL W
+<Multi_key> <asciicircum> <underscore> <w>     : "ʷ"   U02B7 # MODIFIER LETTER SMALL W
+<dead_circumflex> <Multi_key> <underbar> <w>   : "ʷ"   U02B7 # MODIFIER LETTER SMALL W
+<Multi_key> <asciicircum> <underbar> <w>       : "ʷ"   U02B7 # MODIFIER LETTER SMALL W
+<dead_circumflex> <Multi_key> <underscore> <y>         : "ʸ"   U02B8 # MODIFIER LETTER SMALL Y
+<Multi_key> <asciicircum> <underscore> <y>     : "ʸ"   U02B8 # MODIFIER LETTER SMALL Y
+<dead_circumflex> <Multi_key> <underbar> <y>   : "ʸ"   U02B8 # MODIFIER LETTER SMALL Y
+<Multi_key> <asciicircum> <underbar> <y>       : "ʸ"   U02B8 # MODIFIER LETTER SMALL Y
+<dead_circumflex> <Multi_key> <underscore> <U0263>     : "ˠ"   U02E0 # MODIFIER LETTER SMALL GAMMA
+<Multi_key> <asciicircum> <underscore> <U0263>         : "ˠ"   U02E0 # MODIFIER LETTER SMALL GAMMA
+<dead_circumflex> <Multi_key> <underbar> <U0263>       : "ˠ"   U02E0 # MODIFIER LETTER SMALL GAMMA
+<Multi_key> <asciicircum> <underbar> <U0263>   : "ˠ"   U02E0 # MODIFIER LETTER SMALL GAMMA
+<dead_circumflex> <Multi_key> <underscore> <l>         : "ˡ"   U02E1 # MODIFIER LETTER SMALL L
+<Multi_key> <asciicircum> <underscore> <l>     : "ˡ"   U02E1 # MODIFIER LETTER SMALL L
+<dead_circumflex> <Multi_key> <underbar> <l>   : "ˡ"   U02E1 # MODIFIER LETTER SMALL L
+<Multi_key> <asciicircum> <underbar> <l>       : "ˡ"   U02E1 # MODIFIER LETTER SMALL L
+<dead_circumflex> <Multi_key> <underscore> <s>         : "ˢ"   U02E2 # MODIFIER LETTER SMALL S
+<Multi_key> <asciicircum> <underscore> <s>     : "ˢ"   U02E2 # MODIFIER LETTER SMALL S
+<dead_circumflex> <Multi_key> <underbar> <s>   : "ˢ"   U02E2 # MODIFIER LETTER SMALL S
+<Multi_key> <asciicircum> <underbar> <s>       : "ˢ"   U02E2 # MODIFIER LETTER SMALL S
+<dead_circumflex> <Multi_key> <underscore> <x>         : "ˣ"   U02E3 # MODIFIER LETTER SMALL X
+<Multi_key> <asciicircum> <underscore> <x>     : "ˣ"   U02E3 # MODIFIER LETTER SMALL X
+<dead_circumflex> <Multi_key> <underbar> <x>   : "ˣ"   U02E3 # MODIFIER LETTER SMALL X
+<Multi_key> <asciicircum> <underbar> <x>       : "ˣ"   U02E3 # MODIFIER LETTER SMALL X
+<dead_circumflex> <Multi_key> <underscore> <U0295>     : "ˤ"   U02E4 # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+<Multi_key> <asciicircum> <underscore> <U0295>         : "ˤ"   U02E4 # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+<dead_circumflex> <Multi_key> <underbar> <U0295>       : "ˤ"   U02E4 # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+<Multi_key> <asciicircum> <underbar> <U0295>   : "ˤ"   U02E4 # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+<dead_diaeresis> <acute>               : "̈́"   U0344 # COMBINING GREEK DIALYTIKA TONOS
+<dead_diaeresis> <apostrophe>          : "̈́"   U0344 # COMBINING GREEK DIALYTIKA TONOS
+<Multi_key> <quotedbl> <dead_acute>    : "̈́"   U0344 # COMBINING GREEK DIALYTIKA TONOS
+<Multi_key> <quotedbl> <acute>         : "̈́"   U0344 # COMBINING GREEK DIALYTIKA TONOS
+<Multi_key> <quotedbl> <apostrophe>    : "̈́"   U0344 # COMBINING GREEK DIALYTIKA TONOS
+<dead_acute> <dead_diaeresis> <space>  : "΅"   U0385 # GREEK DIALYTIKA TONOS
+<dead_diaeresis> <dead_acute> <space>  : "΅"   U0385 # GREEK DIALYTIKA TONOS
+<Multi_key> <diaeresis> <dead_acute>   : "΅"   U0385 # GREEK DIALYTIKA TONOS
+<Multi_key> <diaeresis> <acute>        : "΅"   U0385 # GREEK DIALYTIKA TONOS
+<Multi_key> <diaeresis> <apostrophe>   : "΅"   U0385 # GREEK DIALYTIKA TONOS
+<Multi_key> <apostrophe> <quotedbl> <space>    : "΅"   U0385 # GREEK DIALYTIKA TONOS
+<dead_acute> <Greek_ALPHA>             : "Ά"   U0386 # GREEK CAPITAL LETTER ALPHA WITH TONOS
+<Multi_key> <acute> <Greek_ALPHA>      : "Ά"   U0386 # GREEK CAPITAL LETTER ALPHA WITH TONOS
+<Multi_key> <apostrophe> <Greek_ALPHA>         : "Ά"   U0386 # GREEK CAPITAL LETTER ALPHA WITH TONOS
+<Multi_key> <Greek_ALPHA> <apostrophe>         : "Ά"   U0386 # GREEK CAPITAL LETTER ALPHA WITH TONOS
+<dead_acute> <Greek_EPSILON>           : "Έ"   U0388 # GREEK CAPITAL LETTER EPSILON WITH TONOS
+<Multi_key> <acute> <Greek_EPSILON>    : "Έ"   U0388 # GREEK CAPITAL LETTER EPSILON WITH TONOS
+<Multi_key> <apostrophe> <Greek_EPSILON>       : "Έ"   U0388 # GREEK CAPITAL LETTER EPSILON WITH TONOS
+<Multi_key> <Greek_EPSILON> <apostrophe>       : "Έ"   U0388 # GREEK CAPITAL LETTER EPSILON WITH TONOS
+<dead_acute> <Greek_ETA>               : "Ή"   U0389 # GREEK CAPITAL LETTER ETA WITH TONOS
+<Multi_key> <acute> <Greek_ETA>        : "Ή"   U0389 # GREEK CAPITAL LETTER ETA WITH TONOS
+<Multi_key> <apostrophe> <Greek_ETA>   : "Ή"   U0389 # GREEK CAPITAL LETTER ETA WITH TONOS
+<Multi_key> <Greek_ETA> <apostrophe>   : "Ή"   U0389 # GREEK CAPITAL LETTER ETA WITH TONOS
+<dead_acute> <Greek_IOTA>              : "Ί"   U038A # GREEK CAPITAL LETTER IOTA WITH TONOS
+<Multi_key> <acute> <Greek_IOTA>       : "Ί"   U038A # GREEK CAPITAL LETTER IOTA WITH TONOS
+<Multi_key> <apostrophe> <Greek_IOTA>  : "Ί"   U038A # GREEK CAPITAL LETTER IOTA WITH TONOS
+<Multi_key> <Greek_IOTA> <apostrophe>  : "Ί"   U038A # GREEK CAPITAL LETTER IOTA WITH TONOS
+<dead_acute> <Greek_OMICRON>           : "Ό"   U038C # GREEK CAPITAL LETTER OMICRON WITH TONOS
+<Multi_key> <acute> <Greek_OMICRON>    : "Ό"   U038C # GREEK CAPITAL LETTER OMICRON WITH TONOS
+<Multi_key> <apostrophe> <Greek_OMICRON>       : "Ό"   U038C # GREEK CAPITAL LETTER OMICRON WITH TONOS
+<Multi_key> <Greek_OMICRON> <apostrophe>       : "Ό"   U038C # GREEK CAPITAL LETTER OMICRON WITH TONOS
+<dead_acute> <Greek_UPSILON>           : "Ύ"   U038E # GREEK CAPITAL LETTER UPSILON WITH TONOS
+<Multi_key> <acute> <Greek_UPSILON>    : "Ύ"   U038E # GREEK CAPITAL LETTER UPSILON WITH TONOS
+<Multi_key> <apostrophe> <Greek_UPSILON>       : "Ύ"   U038E # GREEK CAPITAL LETTER UPSILON WITH TONOS
+<Multi_key> <Greek_UPSILON> <apostrophe>       : "Ύ"   U038E # GREEK CAPITAL LETTER UPSILON WITH TONOS
+<dead_acute> <Greek_OMEGA>             : "Ώ"   U038F # GREEK CAPITAL LETTER OMEGA WITH TONOS
+<Multi_key> <acute> <Greek_OMEGA>      : "Ώ"   U038F # GREEK CAPITAL LETTER OMEGA WITH TONOS
+<Multi_key> <apostrophe> <Greek_OMEGA>         : "Ώ"   U038F # GREEK CAPITAL LETTER OMEGA WITH TONOS
+<Multi_key> <Greek_OMEGA> <apostrophe>         : "Ώ"   U038F # GREEK CAPITAL LETTER OMEGA WITH TONOS
+<dead_acute> <Greek_iotadieresis>      : "ΐ"   U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+<Multi_key> <acute> <Greek_iotadieresis>       : "ΐ"   U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+<Multi_key> <apostrophe> <Greek_iotadieresis>  : "ΐ"   U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+<dead_acute> <dead_diaeresis> <Greek_iota>     : "ΐ"   U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+<dead_diaeresis> <dead_acute> <Greek_iota>     : "ΐ"   U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+<dead_acute> <Multi_key> <quotedbl> <Greek_iota>       : "ΐ"   U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+<Multi_key> <acute> <dead_diaeresis> <Greek_iota>      : "ΐ"   U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+<Multi_key> <acute> <quotedbl> <Greek_iota>    : "ΐ"   U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+<Multi_key> <apostrophe> <dead_diaeresis> <Greek_iota>         : "ΐ"   U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+<Multi_key> <apostrophe> <quotedbl> <Greek_iota>       : "ΐ"   U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+<Greek_accentdieresis> <Greek_iota>    : "ΐ"   U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+<dead_diaeresis> <Greek_IOTA>          : "Ϊ"   U03AA # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+<Multi_key> <quotedbl> <Greek_IOTA>    : "Ϊ"   U03AA # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+<Multi_key> <Greek_IOTA> <quotedbl>    : "Ϊ"   U03AA # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+<dead_diaeresis> <Greek_UPSILON>       : "Ϋ"   U03AB # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+<Multi_key> <quotedbl> <Greek_UPSILON>         : "Ϋ"   U03AB # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+<Multi_key> <Greek_UPSILON> <quotedbl>         : "Ϋ"   U03AB # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+<dead_acute> <Greek_alpha>             : "ά"   U03AC # GREEK SMALL LETTER ALPHA WITH TONOS
+<Multi_key> <acute> <Greek_alpha>      : "ά"   U03AC # GREEK SMALL LETTER ALPHA WITH TONOS
+<Multi_key> <apostrophe> <Greek_alpha>         : "ά"   U03AC # GREEK SMALL LETTER ALPHA WITH TONOS
+<Multi_key> <Greek_alpha> <apostrophe>         : "ά"   U03AC # GREEK SMALL LETTER ALPHA WITH TONOS
+<dead_acute> <Greek_epsilon>           : "έ"   U03AD # GREEK SMALL LETTER EPSILON WITH TONOS
+<Multi_key> <acute> <Greek_epsilon>    : "έ"   U03AD # GREEK SMALL LETTER EPSILON WITH TONOS
+<Multi_key> <apostrophe> <Greek_epsilon>       : "έ"   U03AD # GREEK SMALL LETTER EPSILON WITH TONOS
+<Multi_key> <Greek_epsilon> <apostrophe>       : "έ"   U03AD # GREEK SMALL LETTER EPSILON WITH TONOS
+<dead_acute> <Greek_eta>               : "ή"   U03AE # GREEK SMALL LETTER ETA WITH TONOS
+<Multi_key> <acute> <Greek_eta>        : "ή"   U03AE # GREEK SMALL LETTER ETA WITH TONOS
+<Multi_key> <apostrophe> <Greek_eta>   : "ή"   U03AE # GREEK SMALL LETTER ETA WITH TONOS
+<Multi_key> <Greek_eta> <apostrophe>   : "ή"   U03AE # GREEK SMALL LETTER ETA WITH TONOS
+<dead_acute> <Greek_iota>              : "ί"   U03AF # GREEK SMALL LETTER IOTA WITH TONOS
+<Multi_key> <acute> <Greek_iota>       : "ί"   U03AF # GREEK SMALL LETTER IOTA WITH TONOS
+<Multi_key> <apostrophe> <Greek_iota>  : "ί"   U03AF # GREEK SMALL LETTER IOTA WITH TONOS
+<dead_acute> <Greek_upsilondieresis>   : "ΰ"   U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+<Multi_key> <acute> <Greek_upsilondieresis>    : "ΰ"   U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+<Multi_key> <apostrophe> <Greek_upsilondieresis>       : "ΰ"   U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+<dead_acute> <dead_diaeresis> <Greek_upsilon>  : "ΰ"   U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+<dead_acute> <Multi_key> <quotedbl> <Greek_upsilon>    : "ΰ"   U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+<Multi_key> <acute> <dead_diaeresis> <Greek_upsilon>   : "ΰ"   U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+<Multi_key> <acute> <quotedbl> <Greek_upsilon>         : "ΰ"   U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+<Multi_key> <apostrophe> <dead_diaeresis> <Greek_upsilon>      : "ΰ"   U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+<Multi_key> <apostrophe> <quotedbl> <Greek_upsilon>    : "ΰ"   U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+<dead_diaeresis> <dead_acute> <Greek_upsilon>          : "ΰ"   U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+<Greek_accentdieresis> <Greek_upsilon> : "ΰ"   U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+<dead_diaeresis> <Greek_iota>          : "ϊ"   U03CA # GREEK SMALL LETTER IOTA WITH DIALYTIKA
+<Multi_key> <quotedbl> <Greek_iota>    : "ϊ"   U03CA # GREEK SMALL LETTER IOTA WITH DIALYTIKA
+<Multi_key> <Greek_iota> <quotedbl>    : "ϊ"   U03CA # GREEK SMALL LETTER IOTA WITH DIALYTIKA
+<dead_diaeresis> <Greek_upsilon>       : "ϋ"   U03CB # GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+<Multi_key> <quotedbl> <Greek_upsilon>         : "ϋ"   U03CB # GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+<Multi_key> <Greek_upsilon> <quotedbl>         : "ϋ"   U03CB # GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+<dead_acute> <Greek_omicron>           : "ό"   U03CC # GREEK SMALL LETTER OMICRON WITH TONOS
+<Multi_key> <acute> <Greek_omicron>    : "ό"   U03CC # GREEK SMALL LETTER OMICRON WITH TONOS
+<Multi_key> <apostrophe> <Greek_omicron>       : "ό"   U03CC # GREEK SMALL LETTER OMICRON WITH TONOS
+<Multi_key> <Greek_omicron> <apostrophe>       : "ό"   U03CC # GREEK SMALL LETTER OMICRON WITH TONOS
+<dead_acute> <Greek_upsilon>           : "ύ"   U03CD # GREEK SMALL LETTER UPSILON WITH TONOS
+<Multi_key> <acute> <Greek_upsilon>    : "ύ"   U03CD # GREEK SMALL LETTER UPSILON WITH TONOS
+<Multi_key> <apostrophe> <Greek_upsilon>       : "ύ"   U03CD # GREEK SMALL LETTER UPSILON WITH TONOS
+<Multi_key> <Greek_upsilon> <apostrophe>       : "ύ"   U03CD # GREEK SMALL LETTER UPSILON WITH TONOS
+<dead_acute> <Greek_omega>             : "ώ"   U03CE # GREEK SMALL LETTER OMEGA WITH TONOS
+<Multi_key> <acute> <Greek_omega>      : "ώ"   U03CE # GREEK SMALL LETTER OMEGA WITH TONOS
+<Multi_key> <apostrophe> <Greek_omega>         : "ώ"   U03CE # GREEK SMALL LETTER OMEGA WITH TONOS
+<Multi_key> <Greek_omega> <apostrophe>         : "ώ"   U03CE # GREEK SMALL LETTER OMEGA WITH TONOS
+<Multi_key> <quotedbl> <U03D2>         : "ϔ"   U03D4 # GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL
+<dead_grave> <Cyrillic_IE>             : "Ѐ"   U0400 # CYRILLIC CAPITAL LETTER IE WITH GRAVE
+<Multi_key> <grave> <Cyrillic_IE>      : "Ѐ"   U0400 # CYRILLIC CAPITAL LETTER IE WITH GRAVE
+<dead_diaeresis> <Cyrillic_IE>         : "Ё"   U0401 # CYRILLIC CAPITAL LETTER IO
+<Multi_key> <quotedbl> <Cyrillic_IE>   : "Ё"   U0401 # CYRILLIC CAPITAL LETTER IO
+<dead_acute> <Cyrillic_GHE>            : "Ѓ"   U0403 # CYRILLIC CAPITAL LETTER GJE
+<Multi_key> <acute> <Cyrillic_GHE>     : "Ѓ"   U0403 # CYRILLIC CAPITAL LETTER GJE
+<Multi_key> <apostrophe> <Cyrillic_GHE>        : "Ѓ"   U0403 # CYRILLIC CAPITAL LETTER GJE
+<dead_diaeresis> <Ukrainian_I>         : "Ї"   U0407 # CYRILLIC CAPITAL LETTER YI
+<Multi_key> <quotedbl> <Ukrainian_I>   : "Ї"   U0407 # CYRILLIC CAPITAL LETTER YI
+<dead_acute> <Cyrillic_KA>             : "Ќ"   U040C # CYRILLIC CAPITAL LETTER KJE
+<Multi_key> <acute> <Cyrillic_KA>      : "Ќ"   U040C # CYRILLIC CAPITAL LETTER KJE
+<Multi_key> <apostrophe> <Cyrillic_KA>         : "Ќ"   U040C # CYRILLIC CAPITAL LETTER KJE
+<dead_grave> <Cyrillic_I>              : "Ѝ"   U040D # CYRILLIC CAPITAL LETTER I WITH GRAVE
+<Multi_key> <grave> <Cyrillic_I>       : "Ѝ"   U040D # CYRILLIC CAPITAL LETTER I WITH GRAVE
+<dead_breve> <Cyrillic_U>              : "Ў"   U040E # CYRILLIC CAPITAL LETTER SHORT U
+<Multi_key> <U> <Cyrillic_U>           : "Ў"   U040E # CYRILLIC CAPITAL LETTER SHORT U
+<Multi_key> <b> <Cyrillic_U>           : "Ў"   U040E # CYRILLIC CAPITAL LETTER SHORT U
+<dead_breve> <Cyrillic_I>              : "Й"   U0419 # CYRILLIC CAPITAL LETTER SHORT I
+<Multi_key> <U> <Cyrillic_I>           : "Й"   U0419 # CYRILLIC CAPITAL LETTER SHORT I
+<Multi_key> <b> <Cyrillic_I>           : "Й"   U0419 # CYRILLIC CAPITAL LETTER SHORT I
+<dead_breve> <Cyrillic_i>              : "й"   U0439 # CYRILLIC SMALL LETTER SHORT I
+<Multi_key> <U> <Cyrillic_i>           : "й"   U0439 # CYRILLIC SMALL LETTER SHORT I
+<Multi_key> <b> <Cyrillic_i>           : "й"   U0439 # CYRILLIC SMALL LETTER SHORT I
+<dead_grave> <Cyrillic_ie>             : "ѐ"   U0450 # CYRILLIC SMALL LETTER IE WITH GRAVE
+<Multi_key> <grave> <Cyrillic_ie>      : "ѐ"   U0450 # CYRILLIC SMALL LETTER IE WITH GRAVE
+<dead_diaeresis> <Cyrillic_ie>         : "ё"   U0451 # CYRILLIC SMALL LETTER IO
+<Multi_key> <quotedbl> <Cyrillic_ie>   : "ё"   U0451 # CYRILLIC SMALL LETTER IO
+<dead_acute> <Cyrillic_ghe>            : "ѓ"   U0453 # CYRILLIC SMALL LETTER GJE
+<Multi_key> <acute> <Cyrillic_ghe>     : "ѓ"   U0453 # CYRILLIC SMALL LETTER GJE
+<Multi_key> <apostrophe> <Cyrillic_ghe>        : "ѓ"   U0453 # CYRILLIC SMALL LETTER GJE
+<dead_diaeresis> <Ukrainian_i>         : "ї"   U0457 # CYRILLIC SMALL LETTER YI
+<Multi_key> <quotedbl> <Ukrainian_i>   : "ї"   U0457 # CYRILLIC SMALL LETTER YI
+<dead_acute> <Cyrillic_ka>             : "ќ"   U045C # CYRILLIC SMALL LETTER KJE
+<Multi_key> <acute> <Cyrillic_ka>      : "ќ"   U045C # CYRILLIC SMALL LETTER KJE
+<Multi_key> <apostrophe> <Cyrillic_ka>         : "ќ"   U045C # CYRILLIC SMALL LETTER KJE
+<dead_grave> <Cyrillic_i>              : "ѝ"   U045D # CYRILLIC SMALL LETTER I WITH GRAVE
+<Multi_key> <grave> <Cyrillic_i>       : "ѝ"   U045D # CYRILLIC SMALL LETTER I WITH GRAVE
+<dead_breve> <Cyrillic_u>              : "ў"   U045E # CYRILLIC SMALL LETTER SHORT U
+<Multi_key> <U> <Cyrillic_u>           : "ў"   U045E # CYRILLIC SMALL LETTER SHORT U
+<Multi_key> <b> <Cyrillic_u>           : "ў"   U045E # CYRILLIC SMALL LETTER SHORT U
+<dead_double_grave> <U0474>            : "Ѷ"   U0476 # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+<dead_double_grave> <U0475>            : "ѷ"   U0477 # CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+<Multi_key> <slash> <Cyrillic_GHE>     : "Ғ"   U0492 # CYRILLIC CAPITAL LETTER GHE WITH STROKE
+<Multi_key> <KP_Divide> <Cyrillic_GHE>         : "Ғ"   U0492 # CYRILLIC CAPITAL LETTER GHE WITH STROKE
+<Multi_key> <slash> <Cyrillic_ghe>     : "ғ"   U0493 # CYRILLIC SMALL LETTER GHE WITH STROKE
+<Multi_key> <KP_Divide> <Cyrillic_ghe>         : "ғ"   U0493 # CYRILLIC SMALL LETTER GHE WITH STROKE
+<Multi_key> <slash> <Cyrillic_KA>      : "Ҟ"   U049E # CYRILLIC CAPITAL LETTER KA WITH STROKE
+<Multi_key> <KP_Divide> <Cyrillic_KA>  : "Ҟ"   U049E # CYRILLIC CAPITAL LETTER KA WITH STROKE
+<Multi_key> <slash> <Cyrillic_ka>      : "ҟ"   U049F # CYRILLIC SMALL LETTER KA WITH STROKE
+<Multi_key> <KP_Divide> <Cyrillic_ka>  : "ҟ"   U049F # CYRILLIC SMALL LETTER KA WITH STROKE
+<Multi_key> <slash> <U04AE>    : "Ұ"   U04B0 # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+<Multi_key> <KP_Divide> <U04AE>        : "Ұ"   U04B0 # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+<Multi_key> <slash> <U04AF>    : "ұ"   U04B1 # CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+<Multi_key> <KP_Divide> <U04AF>        : "ұ"   U04B1 # CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+<dead_breve> <Cyrillic_ZHE>            : "Ӂ"   U04C1 # CYRILLIC CAPITAL LETTER ZHE WITH BREVE
+<Multi_key> <U> <Cyrillic_ZHE>         : "Ӂ"   U04C1 # CYRILLIC CAPITAL LETTER ZHE WITH BREVE
+<Multi_key> <b> <Cyrillic_ZHE>         : "Ӂ"   U04C1 # CYRILLIC CAPITAL LETTER ZHE WITH BREVE
+<dead_breve> <Cyrillic_zhe>            : "ӂ"   U04C2 # CYRILLIC SMALL LETTER ZHE WITH BREVE
+<Multi_key> <U> <Cyrillic_zhe>         : "ӂ"   U04C2 # CYRILLIC SMALL LETTER ZHE WITH BREVE
+<Multi_key> <b> <Cyrillic_zhe>         : "ӂ"   U04C2 # CYRILLIC SMALL LETTER ZHE WITH BREVE
+<dead_breve> <Cyrillic_A>              : "Ӑ"   U04D0 # CYRILLIC CAPITAL LETTER A WITH BREVE
+<Multi_key> <U> <Cyrillic_A>           : "Ӑ"   U04D0 # CYRILLIC CAPITAL LETTER A WITH BREVE
+<Multi_key> <b> <Cyrillic_A>           : "Ӑ"   U04D0 # CYRILLIC CAPITAL LETTER A WITH BREVE
+<dead_breve> <Cyrillic_a>              : "ӑ"   U04D1 # CYRILLIC SMALL LETTER A WITH BREVE
+<Multi_key> <U> <Cyrillic_a>           : "ӑ"   U04D1 # CYRILLIC SMALL LETTER A WITH BREVE
+<Multi_key> <b> <Cyrillic_a>           : "ӑ"   U04D1 # CYRILLIC SMALL LETTER A WITH BREVE
+<dead_diaeresis> <Cyrillic_A>          : "Ӓ"   U04D2 # CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_A>    : "Ӓ"   U04D2 # CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+<dead_diaeresis> <Cyrillic_a>          : "ӓ"   U04D3 # CYRILLIC SMALL LETTER A WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_a>    : "ӓ"   U04D3 # CYRILLIC SMALL LETTER A WITH DIAERESIS
+<dead_breve> <Cyrillic_IE>             : "Ӗ"   U04D6 # CYRILLIC CAPITAL LETTER IE WITH BREVE
+<Multi_key> <U> <Cyrillic_IE>          : "Ӗ"   U04D6 # CYRILLIC CAPITAL LETTER IE WITH BREVE
+<Multi_key> <b> <Cyrillic_IE>          : "Ӗ"   U04D6 # CYRILLIC CAPITAL LETTER IE WITH BREVE
+<dead_breve> <Cyrillic_ie>             : "ӗ"   U04D7 # CYRILLIC SMALL LETTER IE WITH BREVE
+<Multi_key> <U> <Cyrillic_ie>          : "ӗ"   U04D7 # CYRILLIC SMALL LETTER IE WITH BREVE
+<Multi_key> <b> <Cyrillic_ie>          : "ӗ"   U04D7 # CYRILLIC SMALL LETTER IE WITH BREVE
+<dead_diaeresis> <U04D8>       : "Ӛ"   U04DA # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+<Multi_key> <quotedbl> <U04D8>         : "Ӛ"   U04DA # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+<dead_diaeresis> <U04D9>       : "ӛ"   U04DB # CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+<Multi_key> <quotedbl> <U04D9>         : "ӛ"   U04DB # CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+<dead_diaeresis> <Cyrillic_ZHE>        : "Ӝ"   U04DC # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_ZHE>  : "Ӝ"   U04DC # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+<dead_diaeresis> <Cyrillic_zhe>        : "ӝ"   U04DD # CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_zhe>  : "ӝ"   U04DD # CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+<dead_diaeresis> <Cyrillic_ZE>         : "Ӟ"   U04DE # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_ZE>   : "Ӟ"   U04DE # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+<dead_diaeresis> <Cyrillic_ze>         : "ӟ"   U04DF # CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_ze>   : "ӟ"   U04DF # CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+<dead_macron> <Cyrillic_I>             : "Ӣ"   U04E2 # CYRILLIC CAPITAL LETTER I WITH MACRON
+<Multi_key> <macron> <Cyrillic_I>      : "Ӣ"   U04E2 # CYRILLIC CAPITAL LETTER I WITH MACRON
+<Multi_key> <underscore> <Cyrillic_I>  : "Ӣ"   U04E2 # CYRILLIC CAPITAL LETTER I WITH MACRON
+<dead_macron> <Cyrillic_i>             : "ӣ"   U04E3 # CYRILLIC SMALL LETTER I WITH MACRON
+<Multi_key> <macron> <Cyrillic_i>      : "ӣ"   U04E3 # CYRILLIC SMALL LETTER I WITH MACRON
+<Multi_key> <underscore> <Cyrillic_i>  : "ӣ"   U04E3 # CYRILLIC SMALL LETTER I WITH MACRON
+<dead_diaeresis> <Cyrillic_I>          : "Ӥ"   U04E4 # CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_I>    : "Ӥ"   U04E4 # CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+<dead_diaeresis> <Cyrillic_i>          : "ӥ"   U04E5 # CYRILLIC SMALL LETTER I WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_i>    : "ӥ"   U04E5 # CYRILLIC SMALL LETTER I WITH DIAERESIS
+<dead_diaeresis> <Cyrillic_O>          : "Ӧ"   U04E6 # CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_O>    : "Ӧ"   U04E6 # CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+<dead_diaeresis> <Cyrillic_o>          : "ӧ"   U04E7 # CYRILLIC SMALL LETTER O WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_o>    : "ӧ"   U04E7 # CYRILLIC SMALL LETTER O WITH DIAERESIS
+<dead_diaeresis> <U04E8>       : "Ӫ"   U04EA # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+<Multi_key> <quotedbl> <U04E8>         : "Ӫ"   U04EA # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+<dead_diaeresis> <U04E9>       : "ӫ"   U04EB # CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+<Multi_key> <quotedbl> <U04E9>         : "ӫ"   U04EB # CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+<dead_diaeresis> <Cyrillic_E>          : "Ӭ"   U04EC # CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_E>    : "Ӭ"   U04EC # CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+<dead_diaeresis> <Cyrillic_e>          : "ӭ"   U04ED # CYRILLIC SMALL LETTER E WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_e>    : "ӭ"   U04ED # CYRILLIC SMALL LETTER E WITH DIAERESIS
+<dead_macron> <Cyrillic_U>             : "Ӯ"   U04EE # CYRILLIC CAPITAL LETTER U WITH MACRON
+<Multi_key> <macron> <Cyrillic_U>      : "Ӯ"   U04EE # CYRILLIC CAPITAL LETTER U WITH MACRON
+<Multi_key> <underscore> <Cyrillic_U>  : "Ӯ"   U04EE # CYRILLIC CAPITAL LETTER U WITH MACRON
+<dead_macron> <Cyrillic_u>             : "ӯ"   U04EF # CYRILLIC SMALL LETTER U WITH MACRON
+<Multi_key> <macron> <Cyrillic_u>      : "ӯ"   U04EF # CYRILLIC SMALL LETTER U WITH MACRON
+<Multi_key> <underscore> <Cyrillic_u>  : "ӯ"   U04EF # CYRILLIC SMALL LETTER U WITH MACRON
+<dead_diaeresis> <Cyrillic_U>          : "Ӱ"   U04F0 # CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_U>    : "Ӱ"   U04F0 # CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+<dead_diaeresis> <Cyrillic_u>          : "ӱ"   U04F1 # CYRILLIC SMALL LETTER U WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_u>    : "ӱ"   U04F1 # CYRILLIC SMALL LETTER U WITH DIAERESIS
+<dead_doubleacute> <Cyrillic_U>        : "Ӳ"   U04F2 # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+<Multi_key> <equal> <Cyrillic_U>       : "Ӳ"   U04F2 # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+<dead_doubleacute> <Cyrillic_u>        : "ӳ"   U04F3 # CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+<Multi_key> <equal> <Cyrillic_u>       : "ӳ"   U04F3 # CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+<dead_diaeresis> <Cyrillic_CHE>        : "Ӵ"   U04F4 # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_CHE>  : "Ӵ"   U04F4 # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+<dead_diaeresis> <Cyrillic_che>        : "ӵ"   U04F5 # CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_che>  : "ӵ"   U04F5 # CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+<dead_diaeresis> <Cyrillic_YERU>       : "Ӹ"   U04F8 # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_YERU>         : "Ӹ"   U04F8 # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+<dead_diaeresis> <Cyrillic_yeru>       : "ӹ"   U04F9 # CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_yeru>         : "ӹ"   U04F9 # CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+<Multi_key> <U0653> <Arabic_alef>      : "آ"   U0622 # ARABIC LETTER ALEF WITH MADDA ABOVE
+<Multi_key> <U0654> <Arabic_alef>      : "أ"   U0623 # ARABIC LETTER ALEF WITH HAMZA ABOVE
+<Multi_key> <U0654> <Arabic_waw>       : "ؤ"   U0624 # ARABIC LETTER WAW WITH HAMZA ABOVE
+<Multi_key> <U0655> <Arabic_alef>      : "إ"   U0625 # ARABIC LETTER ALEF WITH HAMZA BELOW
+<Multi_key> <U0654> <Arabic_yeh>       : "ئ"   U0626 # ARABIC LETTER YEH WITH HAMZA ABOVE
+<Multi_key> <U0654> <U06D5>    : "ۀ"   U06C0 # ARABIC LETTER HEH WITH YEH ABOVE
+<Multi_key> <U0654> <U06C1>    : "ۂ"   U06C2 # ARABIC LETTER HEH GOAL WITH HAMZA ABOVE
+<Multi_key> <U0654> <U06D2>    : "ۓ"   U06D3 # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+<Multi_key> <U093C> <U0928>    : "ऩ"   U0929 # DEVANAGARI LETTER NNNA
+<Multi_key> <U093C> <U0930>    : "ऱ"   U0931 # DEVANAGARI LETTER RRA
+<Multi_key> <U093C> <U0933>    : "ऴ"   U0934 # DEVANAGARI LETTER LLLA
+<Multi_key> <U093C> <U0915>    : "क़"   U0958 # DEVANAGARI LETTER QA
+<Multi_key> <U093C> <U0916>    : "ख़"   U0959 # DEVANAGARI LETTER KHHA
+<Multi_key> <U093C> <U0917>    : "ग़"   U095A # DEVANAGARI LETTER GHHA
+<Multi_key> <U093C> <U091C>    : "ज़"   U095B # DEVANAGARI LETTER ZA
+<Multi_key> <U093C> <U0921>    : "ड़"   U095C # DEVANAGARI LETTER DDDHA
+<Multi_key> <U093C> <U0922>    : "ढ़"   U095D # DEVANAGARI LETTER RHA
+<Multi_key> <U093C> <U092B>    : "फ़"   U095E # DEVANAGARI LETTER FA
+<Multi_key> <U093C> <U092F>    : "य़"   U095F # DEVANAGARI LETTER YYA
+<Multi_key> <U09C7> <U09BE>    : "ো"   U09CB # BENGALI VOWEL SIGN O
+<Multi_key> <U09C7> <U09D7>    : "ৌ"   U09CC # BENGALI VOWEL SIGN AU
+<Multi_key> <U09BC> <U09A1>    : "ড়"   U09DC # BENGALI LETTER RRA
+<Multi_key> <U09BC> <U09A2>    : "ঢ়"   U09DD # BENGALI LETTER RHA
+<Multi_key> <U09BC> <U09AF>    : "য়"   U09DF # BENGALI LETTER YYA
+<Multi_key> <U0A3C> <U0A32>    : "ਲ਼"   U0A33 # GURMUKHI LETTER LLA
+<Multi_key> <U0A3C> <U0A38>    : "ਸ਼"   U0A36 # GURMUKHI LETTER SHA
+<Multi_key> <U0A3C> <U0A16>    : "ਖ਼"   U0A59 # GURMUKHI LETTER KHHA
+<Multi_key> <U0A3C> <U0A17>    : "ਗ਼"   U0A5A # GURMUKHI LETTER GHHA
+<Multi_key> <U0A3C> <U0A1C>    : "ਜ਼"   U0A5B # GURMUKHI LETTER ZA
+<Multi_key> <U0A3C> <U0A2B>    : "ਫ਼"   U0A5E # GURMUKHI LETTER FA
+<Multi_key> <U0B47> <U0B56>    : "ୈ"   U0B48 # ORIYA VOWEL SIGN AI
+<Multi_key> <U0B47> <U0B3E>    : "ୋ"   U0B4B # ORIYA VOWEL SIGN O
+<Multi_key> <U0B47> <U0B57>    : "ୌ"   U0B4C # ORIYA VOWEL SIGN AU
+<Multi_key> <U0B3C> <U0B21>    : "ଡ଼"   U0B5C # ORIYA LETTER RRA
+<Multi_key> <U0B3C> <U0B22>    : "ଢ଼"   U0B5D # ORIYA LETTER RHA
+<Multi_key> <U0BD7> <U0B92>    : "ஔ"   U0B94 # TAMIL LETTER AU
+<Multi_key> <U0BC6> <U0BBE>    : "ொ"   U0BCA # TAMIL VOWEL SIGN O
+<Multi_key> <U0BC7> <U0BBE>    : "ோ"   U0BCB # TAMIL VOWEL SIGN OO
+<Multi_key> <U0BC6> <U0BD7>    : "ௌ"   U0BCC # TAMIL VOWEL SIGN AU
+<Multi_key> <U0C46> <U0C56>    : "ై"   U0C48 # TELUGU VOWEL SIGN AI
+<Multi_key> <U0CBF> <U0CD5>    : "ೀ"   U0CC0 # KANNADA VOWEL SIGN II
+<Multi_key> <U0CC6> <U0CD5>    : "ೇ"   U0CC7 # KANNADA VOWEL SIGN EE
+<Multi_key> <U0CC6> <U0CD6>    : "ೈ"   U0CC8 # KANNADA VOWEL SIGN AI
+<Multi_key> <U0CC6> <U0CC2>    : "ೊ"   U0CCA # KANNADA VOWEL SIGN O
+<Multi_key> <U0CCA> <U0CD5>    : "ೋ"   U0CCB # KANNADA VOWEL SIGN OO
+/* <Multi_key> <U0CC6> <U0CC2> <U0CD5>         : "ೋ"   U0CCB # KANNADA VOWEL SIGN OO */
+<Multi_key> <U0D46> <U0D3E>    : "ൊ"   U0D4A # MALAYALAM VOWEL SIGN O
+<Multi_key> <U0D47> <U0D3E>    : "ോ"   U0D4B # MALAYALAM VOWEL SIGN OO
+<Multi_key> <U0D46> <U0D57>    : "ൌ"   U0D4C # MALAYALAM VOWEL SIGN AU
+<Multi_key> <U0DD9> <U0DCA>    : "ේ"   U0DDA # SINHALA VOWEL SIGN DIGA KOMBUVA
+<Multi_key> <U0DD9> <U0DCF>    : "ො"   U0DDC # SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA
+<Multi_key> <U0DDC> <U0DCA>    : "ෝ"   U0DDD # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA
+/* <Multi_key> <U0DD9> <U0DCF> <U0DCA>         : "ෝ"   U0DDD # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA */
+<Multi_key> <U0DD9> <U0DDF>    : "ෞ"   U0DDE # SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
+<Multi_key> <U0FB7> <U0F42>    : "གྷ"   U0F43 # TIBETAN LETTER GHA
+<Multi_key> <U0FB7> <U0F4C>    : "ཌྷ"   U0F4D # TIBETAN LETTER DDHA
+<Multi_key> <U0FB7> <U0F51>    : "དྷ"   U0F52 # TIBETAN LETTER DHA
+<Multi_key> <U0FB7> <U0F56>    : "བྷ"   U0F57 # TIBETAN LETTER BHA
+<Multi_key> <U0FB7> <U0F5B>    : "ཛྷ"   U0F5C # TIBETAN LETTER DZHA
+<Multi_key> <U0FB5> <U0F40>    : "ཀྵ"   U0F69 # TIBETAN LETTER KSSA
+<Multi_key> <U0F71> <U0F72>    : "ཱི"   U0F73 # TIBETAN VOWEL SIGN II
+<Multi_key> <U0F71> <U0F74>    : "ཱུ"   U0F75 # TIBETAN VOWEL SIGN UU
+<Multi_key> <U0FB2> <U0F80>    : "ྲྀ"   U0F76 # TIBETAN VOWEL SIGN VOCALIC R
+<Multi_key> <U0FB3> <U0F80>    : "ླྀ"   U0F78 # TIBETAN VOWEL SIGN VOCALIC L
+<Multi_key> <U0F71> <U0F80>    : "ཱྀ"   U0F81 # TIBETAN VOWEL SIGN REVERSED II
+<Multi_key> <U0F92> <U0FB7>    : "ྒྷ"   U0F93 # TIBETAN SUBJOINED LETTER GHA
+<Multi_key> <U0F9C> <U0FB7>    : "ྜྷ"   U0F9D # TIBETAN SUBJOINED LETTER DDHA
+<Multi_key> <U0FA1> <U0FB7>    : "ྡྷ"   U0FA2 # TIBETAN SUBJOINED LETTER DHA
+<Multi_key> <U0FA6> <U0FB7>    : "ྦྷ"   U0FA7 # TIBETAN SUBJOINED LETTER BHA
+<Multi_key> <U0FAB> <U0FB7>    : "ྫྷ"   U0FAC # TIBETAN SUBJOINED LETTER DZHA
+<Multi_key> <U0F90> <U0FB5>    : "ྐྵ"   U0FB9 # TIBETAN SUBJOINED LETTER KSSA
+<Multi_key> <U102E> <U1025>    : "ဦ"   U1026 # MYANMAR LETTER UU
+<dead_belowring> <A>                   : "Ḁ"   U1E00 # LATIN CAPITAL LETTER A WITH RING BELOW
+<dead_belowring> <a>                   : "ḁ"   U1E01 # LATIN SMALL LETTER A WITH RING BELOW
+<dead_abovedot> <B>                    : "Ḃ"   U1E02 # LATIN CAPITAL LETTER B WITH DOT ABOVE
+<Multi_key> <period> <B>               : "Ḃ"   U1E02 # LATIN CAPITAL LETTER B WITH DOT ABOVE
+<Multi_key> <B> <period>               : "Ḃ"   U1E02 # LATIN CAPITAL LETTER B WITH DOT ABOVE
+<dead_abovedot> <b>                    : "ḃ"   U1E03 # LATIN SMALL LETTER B WITH DOT ABOVE
+<Multi_key> <period> <b>               : "ḃ"   U1E03 # LATIN SMALL LETTER B WITH DOT ABOVE
+<Multi_key> <b> <period>               : "ḃ"   U1E03 # LATIN SMALL LETTER B WITH DOT ABOVE
+<dead_belowdot> <B>                    : "Ḅ"   U1E04 # LATIN CAPITAL LETTER B WITH DOT BELOW
+<Multi_key> <exclam> <B>               : "Ḅ"   U1E04 # LATIN CAPITAL LETTER B WITH DOT BELOW
+<dead_belowdot> <b>                    : "ḅ"   U1E05 # LATIN SMALL LETTER B WITH DOT BELOW
+<Multi_key> <exclam> <b>               : "ḅ"   U1E05 # LATIN SMALL LETTER B WITH DOT BELOW
+<dead_belowmacron> <B>                         : "Ḇ"   U1E06 # LATIN CAPITAL LETTER B WITH LINE BELOW
+<dead_belowmacron> <b>                         : "ḇ"   U1E07 # LATIN SMALL LETTER B WITH LINE BELOW
+<dead_acute> <Ccedilla>                : "Ḉ"   U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+<Multi_key> <acute> <Ccedilla>         : "Ḉ"   U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+<Multi_key> <apostrophe> <Ccedilla>    : "Ḉ"   U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+<dead_acute> <dead_cedilla> <C>        : "Ḉ"   U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+<dead_acute> <Multi_key> <comma> <C>   : "Ḉ"   U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+<dead_acute> <Multi_key> <cedilla> <C>         : "Ḉ"   U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+<Multi_key> <acute> <dead_cedilla> <C>         : "Ḉ"   U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+<Multi_key> <acute> <comma> <C>        : "Ḉ"   U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+<Multi_key> <acute> <cedilla> <C>      : "Ḉ"   U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+<Multi_key> <apostrophe> <dead_cedilla> <C>    : "Ḉ"   U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+<Multi_key> <apostrophe> <cedilla> <C> : "Ḉ" U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+<dead_acute> <ccedilla>                : "ḉ"   U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+<Multi_key> <acute> <ccedilla>         : "ḉ"   U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+<Multi_key> <apostrophe> <ccedilla>    : "ḉ"   U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+<dead_acute> <dead_cedilla> <c>        : "ḉ"   U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+<dead_acute> <Multi_key> <comma> <c>   : "ḉ"   U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+<dead_acute> <Multi_key> <cedilla> <c>         : "ḉ"   U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+<Multi_key> <acute> <dead_cedilla> <c>         : "ḉ"   U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+<Multi_key> <acute> <comma> <c>        : "ḉ"   U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+<Multi_key> <acute> <cedilla> <c>      : "ḉ"   U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+<Multi_key> <apostrophe> <dead_cedilla> <c>    : "ḉ"   U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+<Multi_key> <apostrophe> <cedilla> <c> : "ḉ" U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+<dead_abovedot> <D>                    : "Ḋ"   U1E0A # LATIN CAPITAL LETTER D WITH DOT ABOVE
+<Multi_key> <period> <D>               : "Ḋ"   U1E0A # LATIN CAPITAL LETTER D WITH DOT ABOVE
+<Multi_key> <D> <period>               : "Ḋ"   U1E0A # LATIN CAPITAL LETTER D WITH DOT ABOVE
+<dead_abovedot> <d>                    : "ḋ"   U1E0B # LATIN SMALL LETTER D WITH DOT ABOVE
+<Multi_key> <period> <d>               : "ḋ"   U1E0B # LATIN SMALL LETTER D WITH DOT ABOVE
+<Multi_key> <d> <period>               : "ḋ"   U1E0B # LATIN SMALL LETTER D WITH DOT ABOVE
+<dead_belowdot> <D>                    : "Ḍ"   U1E0C # LATIN CAPITAL LETTER D WITH DOT BELOW
+<Multi_key> <exclam> <D>               : "Ḍ"   U1E0C # LATIN CAPITAL LETTER D WITH DOT BELOW
+<dead_belowdot> <d>                    : "ḍ"   U1E0D # LATIN SMALL LETTER D WITH DOT BELOW
+<Multi_key> <exclam> <d>               : "ḍ"   U1E0D # LATIN SMALL LETTER D WITH DOT BELOW
+<dead_belowmacron> <D>                         : "Ḏ"   U1E0E # LATIN CAPITAL LETTER D WITH LINE BELOW
+<dead_belowmacron> <d>                         : "ḏ"   U1E0F # LATIN SMALL LETTER D WITH LINE BELOW
+<dead_cedilla> <D>                     : "Ḑ"   U1E10 # LATIN CAPITAL LETTER D WITH CEDILLA
+<Multi_key> <comma> <D>                : "Ḑ"   U1E10 # LATIN CAPITAL LETTER D WITH CEDILLA
+<Multi_key> <D> <comma>                : "Ḑ"   U1E10 # LATIN CAPITAL LETTER D WITH CEDILLA
+<Multi_key> <cedilla> <D>              : "Ḑ"   U1E10 # LATIN CAPITAL LETTER D WITH CEDILLA
+<dead_cedilla> <d>                     : "ḑ"   U1E11 # LATIN SMALL LETTER D WITH CEDILLA
+<Multi_key> <comma> <d>                : "ḑ"   U1E11 # LATIN SMALL LETTER D WITH CEDILLA
+<Multi_key> <d> <comma>                : "ḑ"   U1E11 # LATIN SMALL LETTER D WITH CEDILLA
+<Multi_key> <cedilla> <d>              : "ḑ"   U1E11 # LATIN SMALL LETTER D WITH CEDILLA
+<dead_belowcircumflex> <D>                     : "Ḓ"   U1E12 # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
+<dead_belowcircumflex> <d>                     : "ḓ"   U1E13 # LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW
+<dead_grave> <Emacron>                 : "Ḕ"   U1E14 # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+<Multi_key> <grave> <Emacron>          : "Ḕ"   U1E14 # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+<dead_grave> <dead_macron> <E>         : "Ḕ"   U1E14 # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+<dead_grave> <Multi_key> <macron> <E>  : "Ḕ"   U1E14 # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+<dead_grave> <Multi_key> <underscore> <E>      : "Ḕ"   U1E14 # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+<Multi_key> <grave> <dead_macron> <E>  : "Ḕ"   U1E14 # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+<Multi_key> <grave> <macron> <E>       : "Ḕ"   U1E14 # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+<Multi_key> <grave> <underscore> <E>   : "Ḕ"   U1E14 # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+<dead_grave> <emacron>                 : "ḕ"   U1E15 # LATIN SMALL LETTER E WITH MACRON AND GRAVE
+<Multi_key> <grave> <emacron>          : "ḕ"   U1E15 # LATIN SMALL LETTER E WITH MACRON AND GRAVE
+<dead_grave> <dead_macron> <e>         : "ḕ"   U1E15 # LATIN SMALL LETTER E WITH MACRON AND GRAVE
+<dead_grave> <Multi_key> <macron> <e>  : "ḕ"   U1E15 # LATIN SMALL LETTER E WITH MACRON AND GRAVE
+<dead_grave> <Multi_key> <underscore> <e>      : "ḕ"   U1E15 # LATIN SMALL LETTER E WITH MACRON AND GRAVE
+<Multi_key> <grave> <dead_macron> <e>  : "ḕ"   U1E15 # LATIN SMALL LETTER E WITH MACRON AND GRAVE
+<Multi_key> <grave> <macron> <e>       : "ḕ"   U1E15 # LATIN SMALL LETTER E WITH MACRON AND GRAVE
+<Multi_key> <grave> <underscore> <e>   : "ḕ"   U1E15 # LATIN SMALL LETTER E WITH MACRON AND GRAVE
+<dead_acute> <Emacron>                 : "Ḗ"   U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <acute> <Emacron>          : "Ḗ"   U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <Emacron>     : "Ḗ"   U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+<dead_acute> <dead_macron> <E>         : "Ḗ"   U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+<dead_acute> <Multi_key> <macron> <E>  : "Ḗ"   U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+<dead_acute> <Multi_key> <underscore> <E>      : "Ḗ"   U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <acute> <dead_macron> <E>  : "Ḗ"   U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <acute> <macron> <E>       : "Ḗ"   U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <acute> <underscore> <E>   : "Ḗ"   U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <dead_macron> <E>     : "Ḗ"   U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <macron> <E>  : "Ḗ"   U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <underscore> <E>      : "Ḗ"   U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+<dead_acute> <emacron>                 : "ḗ"   U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <acute> <emacron>          : "ḗ"   U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <emacron>     : "ḗ"   U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE
+<dead_acute> <dead_macron> <e>         : "ḗ"   U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE
+<dead_acute> <Multi_key> <macron> <e>  : "ḗ"   U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE
+<dead_acute> <Multi_key> <underscore> <e>      : "ḗ"   U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <acute> <dead_macron> <e>  : "ḗ"   U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <acute> <macron> <e>       : "ḗ"   U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <acute> <underscore> <e>   : "ḗ"   U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <dead_macron> <e>     : "ḗ"   U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <macron> <e>  : "ḗ"   U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <underscore> <e>      : "ḗ"   U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE
+<dead_belowcircumflex> <E>                     : "Ḙ"   U1E18 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
+<dead_belowcircumflex> <e>                     : "ḙ"   U1E19 # LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW
+<dead_belowtilde> <E>                          : "Ḛ"   U1E1A # LATIN CAPITAL LETTER E WITH TILDE BELOW
+<dead_belowtilde> <e>                          : "ḛ"   U1E1B # LATIN SMALL LETTER E WITH TILDE BELOW
+<dead_breve> <U0228>           : "Ḝ"   U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <U> <U0228>        : "Ḝ"   U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <b> <U0228>        : "Ḝ"   U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+<dead_breve> <dead_cedilla> <E>        : "Ḝ"   U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+<dead_breve> <Multi_key> <comma> <E>   : "Ḝ"   U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+<dead_breve> <Multi_key> <cedilla> <E>         : "Ḝ"   U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <U> <dead_cedilla> <E>     : "Ḝ"   U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <U> <space> <comma> <E>            : "Ḝ"   U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <U> <cedilla> <E>          : "Ḝ"   U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <b> <dead_cedilla> <E>     : "Ḝ"   U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <b> <comma> <E>            : "Ḝ"   U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <b> <cedilla> <E>          : "Ḝ"   U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+<dead_breve> <U0229>           : "ḝ"   U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <U> <U0229>        : "ḝ"   U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <b> <U0229>        : "ḝ"   U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+<dead_breve> <dead_cedilla> <e>        : "ḝ"   U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+<dead_breve> <Multi_key> <comma> <e>   : "ḝ"   U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+<dead_breve> <Multi_key> <cedilla> <e>         : "ḝ"   U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <U> <dead_cedilla> <e>     : "ḝ"   U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <U> <space> <comma> <e>            : "ḝ"   U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <U> <cedilla> <e>          : "ḝ"   U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <b> <dead_cedilla> <e>     : "ḝ"   U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <b> <comma> <e>            : "ḝ"   U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <b> <cedilla> <e>          : "ḝ"   U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+<dead_abovedot> <F>                    : "Ḟ"   U1E1E # LATIN CAPITAL LETTER F WITH DOT ABOVE
+<Multi_key> <period> <F>               : "Ḟ"   U1E1E # LATIN CAPITAL LETTER F WITH DOT ABOVE
+<Multi_key> <F> <period>               : "Ḟ"   U1E1E # LATIN CAPITAL LETTER F WITH DOT ABOVE
+<dead_abovedot> <f>                    : "ḟ"   U1E1F # LATIN SMALL LETTER F WITH DOT ABOVE
+<Multi_key> <period> <f>               : "ḟ"   U1E1F # LATIN SMALL LETTER F WITH DOT ABOVE
+<Multi_key> <f> <period>               : "ḟ"   U1E1F # LATIN SMALL LETTER F WITH DOT ABOVE
+<dead_macron> <G>                      : "Ḡ"   U1E20 # LATIN CAPITAL LETTER G WITH MACRON
+<Multi_key> <macron> <G>               : "Ḡ"   U1E20 # LATIN CAPITAL LETTER G WITH MACRON
+<Multi_key> <underscore> <G>           : "Ḡ"   U1E20 # LATIN CAPITAL LETTER G WITH MACRON
+<dead_macron> <g>                      : "ḡ"   U1E21 # LATIN SMALL LETTER G WITH MACRON
+<Multi_key> <macron> <g>               : "ḡ"   U1E21 # LATIN SMALL LETTER G WITH MACRON
+<Multi_key> <underscore> <g>           : "ḡ"   U1E21 # LATIN SMALL LETTER G WITH MACRON
+<dead_abovedot> <H>                    : "Ḣ"   U1E22 # LATIN CAPITAL LETTER H WITH DOT ABOVE
+<Multi_key> <period> <H>               : "Ḣ"   U1E22 # LATIN CAPITAL LETTER H WITH DOT ABOVE
+<dead_abovedot> <h>                    : "ḣ"   U1E23 # LATIN SMALL LETTER H WITH DOT ABOVE
+<Multi_key> <period> <h>               : "ḣ"   U1E23 # LATIN SMALL LETTER H WITH DOT ABOVE
+<dead_belowdot> <H>                    : "Ḥ"   U1E24 # LATIN CAPITAL LETTER H WITH DOT BELOW
+<Multi_key> <exclam> <H>               : "Ḥ"   U1E24 # LATIN CAPITAL LETTER H WITH DOT BELOW
+<dead_belowdot> <h>                    : "ḥ"   U1E25 # LATIN SMALL LETTER H WITH DOT BELOW
+<Multi_key> <exclam> <h>               : "ḥ"   U1E25 # LATIN SMALL LETTER H WITH DOT BELOW
+<dead_diaeresis> <H>                   : "Ḧ"   U1E26 # LATIN CAPITAL LETTER H WITH DIAERESIS
+<Multi_key> <quotedbl> <H>             : "Ḧ"   U1E26 # LATIN CAPITAL LETTER H WITH DIAERESIS
+<dead_diaeresis> <h>                   : "ḧ"   U1E27 # LATIN SMALL LETTER H WITH DIAERESIS
+<Multi_key> <quotedbl> <h>             : "ḧ"   U1E27 # LATIN SMALL LETTER H WITH DIAERESIS
+<dead_cedilla> <H>                     : "Ḩ"   U1E28 # LATIN CAPITAL LETTER H WITH CEDILLA
+<Multi_key> <comma> <H>                : "Ḩ"   U1E28 # LATIN CAPITAL LETTER H WITH CEDILLA
+<Multi_key> <H> <comma>                : "Ḩ"   U1E28 # LATIN CAPITAL LETTER H WITH CEDILLA
+<Multi_key> <cedilla> <H>              : "Ḩ"   U1E28 # LATIN CAPITAL LETTER H WITH CEDILLA
+<dead_cedilla> <h>                     : "ḩ"   U1E29 # LATIN SMALL LETTER H WITH CEDILLA
+<Multi_key> <comma> <h>                : "ḩ"   U1E29 # LATIN SMALL LETTER H WITH CEDILLA
+<Multi_key> <h> <comma>                : "ḩ"   U1E29 # LATIN SMALL LETTER H WITH CEDILLA
+<Multi_key> <cedilla> <h>              : "ḩ"   U1E29 # LATIN SMALL LETTER H WITH CEDILLA
+<dead_belowbreve> <H>                          : "Ḫ"   U1E2A # LATIN CAPITAL LETTER H WITH BREVE BELOW
+<dead_belowbreve> <h>                          : "ḫ"   U1E2B # LATIN SMALL LETTER H WITH BREVE BELOW
+<dead_belowtilde> <I>                          : "Ḭ"   U1E2C # LATIN CAPITAL LETTER I WITH TILDE BELOW
+<dead_belowtilde> <i>                          : "ḭ"   U1E2D # LATIN SMALL LETTER I WITH TILDE BELOW
+<dead_acute> <Idiaeresis>              : "Ḯ"   U1E2E # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+<Multi_key> <acute> <Idiaeresis>       : "Ḯ"   U1E2E # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+<Multi_key> <apostrophe> <Idiaeresis>  : "Ḯ"   U1E2E # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+<dead_acute> <dead_diaeresis> <I>      : "Ḯ"   U1E2E # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+<dead_acute> <Multi_key> <quotedbl> <I>        : "Ḯ"   U1E2E # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+<Multi_key> <acute> <dead_diaeresis> <I>       : "Ḯ"   U1E2E # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+<Multi_key> <acute> <quotedbl> <I>     : "Ḯ"   U1E2E # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+<Multi_key> <apostrophe> <dead_diaeresis> <I>  : "Ḯ"   U1E2E # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+<Multi_key> <apostrophe> <quotedbl> <I>        : "Ḯ"   U1E2E # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+<dead_acute> <idiaeresis>              : "ḯ"   U1E2F # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+<Multi_key> <acute> <idiaeresis>       : "ḯ"   U1E2F # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+<Multi_key> <apostrophe> <idiaeresis>  : "ḯ"   U1E2F # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+<dead_acute> <dead_diaeresis> <i>      : "ḯ"   U1E2F # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+<dead_acute> <Multi_key> <quotedbl> <i>        : "ḯ"   U1E2F # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+<Multi_key> <acute> <dead_diaeresis> <i>       : "ḯ"   U1E2F # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+<Multi_key> <acute> <quotedbl> <i>     : "ḯ"   U1E2F # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+<Multi_key> <apostrophe> <dead_diaeresis> <i>  : "ḯ"   U1E2F # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+<Multi_key> <apostrophe> <quotedbl> <i>        : "ḯ"   U1E2F # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+<dead_acute> <K>                       : "Ḱ"   U1E30 # LATIN CAPITAL LETTER K WITH ACUTE
+<Multi_key> <acute> <K>                : "Ḱ"   U1E30 # LATIN CAPITAL LETTER K WITH ACUTE
+<Multi_key> <apostrophe> <K>           : "Ḱ"   U1E30 # LATIN CAPITAL LETTER K WITH ACUTE
+<dead_acute> <k>                       : "ḱ"   U1E31 # LATIN SMALL LETTER K WITH ACUTE
+<Multi_key> <acute> <k>                : "ḱ"   U1E31 # LATIN SMALL LETTER K WITH ACUTE
+<Multi_key> <apostrophe> <k>           : "ḱ"   U1E31 # LATIN SMALL LETTER K WITH ACUTE
+<dead_belowdot> <K>                    : "Ḳ"   U1E32 # LATIN CAPITAL LETTER K WITH DOT BELOW
+<Multi_key> <exclam> <K>               : "Ḳ"   U1E32 # LATIN CAPITAL LETTER K WITH DOT BELOW
+<dead_belowdot> <k>                    : "ḳ"   U1E33 # LATIN SMALL LETTER K WITH DOT BELOW
+<Multi_key> <exclam> <k>               : "ḳ"   U1E33 # LATIN SMALL LETTER K WITH DOT BELOW
+<dead_belowmacron> <K>                         : "Ḵ"   U1E34 # LATIN CAPITAL LETTER K WITH LINE BELOW
+<dead_belowmacron> <k>                         : "ḵ"   U1E35 # LATIN SMALL LETTER K WITH LINE BELOW
+<dead_belowdot> <L>                    : "Ḷ"   U1E36 # LATIN CAPITAL LETTER L WITH DOT BELOW
+<Multi_key> <exclam> <L>               : "Ḷ"   U1E36 # LATIN CAPITAL LETTER L WITH DOT BELOW
+<dead_belowdot> <l>                    : "ḷ"   U1E37 # LATIN SMALL LETTER L WITH DOT BELOW
+<Multi_key> <exclam> <l>               : "ḷ"   U1E37 # LATIN SMALL LETTER L WITH DOT BELOW
+<dead_macron> <U1E36>          : "Ḹ"   U1E38 # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+<Multi_key> <macron> <U1E36>   : "Ḹ"   U1E38 # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+<Multi_key> <underscore> <U1E36>       : "Ḹ"   U1E38 # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+<dead_macron> <dead_belowdot> <L>      : "Ḹ"   U1E38 # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+<dead_macron> <Multi_key> <exclam> <L>         : "Ḹ"   U1E38 # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+<Multi_key> <macron> <dead_belowdot> <L>       : "Ḹ"   U1E38 # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+<Multi_key> <macron> <exclam> <L>      : "Ḹ"   U1E38 # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+<Multi_key> <underscore> <dead_belowdot> <L>   : "Ḹ"   U1E38 # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+<Multi_key> <underscore> <exclam> <L>  : "Ḹ"   U1E38 # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+<dead_macron> <U1E37>          : "ḹ"   U1E39 # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+<Multi_key> <macron> <U1E37>   : "ḹ"   U1E39 # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+<Multi_key> <underscore> <U1E37>       : "ḹ"   U1E39 # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+<dead_macron> <dead_belowdot> <l>      : "ḹ"   U1E39 # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+<dead_macron> <Multi_key> <exclam> <l>         : "ḹ"   U1E39 # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+<Multi_key> <macron> <dead_belowdot> <l>       : "ḹ"   U1E39 # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+<Multi_key> <macron> <exclam> <l>      : "ḹ"   U1E39 # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+<Multi_key> <underscore> <dead_belowdot> <l>   : "ḹ"   U1E39 # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+<Multi_key> <underscore> <exclam> <l>  : "ḹ"   U1E39 # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+<dead_belowmacron> <L>                         : "Ḻ"   U1E3A # LATIN CAPITAL LETTER L WITH LINE BELOW
+<dead_belowmacron> <l>                         : "ḻ"   U1E3B # LATIN SMALL LETTER L WITH LINE BELOW
+<dead_belowcircumflex> <L>                     : "Ḽ"   U1E3C # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
+<dead_belowcircumflex> <l>                     : "ḽ"   U1E3D # LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW
+<dead_acute> <M>                       : "Ḿ"   U1E3E # LATIN CAPITAL LETTER M WITH ACUTE
+<Multi_key> <acute> <M>                : "Ḿ"   U1E3E # LATIN CAPITAL LETTER M WITH ACUTE
+<Multi_key> <apostrophe> <M>           : "Ḿ"   U1E3E # LATIN CAPITAL LETTER M WITH ACUTE
+<dead_acute> <m>                       : "ḿ"   U1E3F # LATIN SMALL LETTER M WITH ACUTE
+<Multi_key> <acute> <m>                : "ḿ"   U1E3F # LATIN SMALL LETTER M WITH ACUTE
+<Multi_key> <apostrophe> <m>           : "ḿ"   U1E3F # LATIN SMALL LETTER M WITH ACUTE
+<dead_abovedot> <M>                    : "Ṁ"   U1E40 # LATIN CAPITAL LETTER M WITH DOT ABOVE
+<Multi_key> <period> <M>               : "Ṁ"   U1E40 # LATIN CAPITAL LETTER M WITH DOT ABOVE
+<Multi_key> <M> <period>               : "Ṁ"   U1E40 # LATIN CAPITAL LETTER M WITH DOT ABOVE
+<dead_abovedot> <m>                    : "ṁ"   U1E41 # LATIN SMALL LETTER M WITH DOT ABOVE
+<Multi_key> <period> <m>               : "ṁ"   U1E41 # LATIN SMALL LETTER M WITH DOT ABOVE
+<Multi_key> <m> <period>               : "ṁ"   U1E41 # LATIN SMALL LETTER M WITH DOT ABOVE
+<dead_belowdot> <M>                    : "Ṃ"   U1E42 # LATIN CAPITAL LETTER M WITH DOT BELOW
+<Multi_key> <exclam> <M>               : "Ṃ"   U1E42 # LATIN CAPITAL LETTER M WITH DOT BELOW
+<dead_belowdot> <m>                    : "ṃ"   U1E43 # LATIN SMALL LETTER M WITH DOT BELOW
+<Multi_key> <exclam> <m>               : "ṃ"   U1E43 # LATIN SMALL LETTER M WITH DOT BELOW
+<dead_abovedot> <N>                    : "Ṅ"   U1E44 # LATIN CAPITAL LETTER N WITH DOT ABOVE
+<Multi_key> <period> <N>               : "Ṅ"   U1E44 # LATIN CAPITAL LETTER N WITH DOT ABOVE
+<dead_abovedot> <n>                    : "ṅ"   U1E45 # LATIN SMALL LETTER N WITH DOT ABOVE
+<Multi_key> <period> <n>               : "ṅ"   U1E45 # LATIN SMALL LETTER N WITH DOT ABOVE
+<dead_belowdot> <N>                    : "Ṇ"   U1E46 # LATIN CAPITAL LETTER N WITH DOT BELOW
+<Multi_key> <exclam> <N>               : "Ṇ"   U1E46 # LATIN CAPITAL LETTER N WITH DOT BELOW
+<dead_belowdot> <n>                    : "ṇ"   U1E47 # LATIN SMALL LETTER N WITH DOT BELOW
+<Multi_key> <exclam> <n>               : "ṇ"   U1E47 # LATIN SMALL LETTER N WITH DOT BELOW
+<dead_belowmacron> <N>                         : "Ṉ"   U1E48 # LATIN CAPITAL LETTER N WITH LINE BELOW
+<dead_belowmacron> <n>                         : "ṉ"   U1E49 # LATIN SMALL LETTER N WITH LINE BELOW
+<dead_belowcircumflex> <N>                     : "Ṋ"   U1E4A # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
+<dead_belowcircumflex> <n>                     : "ṋ"   U1E4B # LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW
+<dead_acute> <Otilde>                  : "Ṍ"   U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+<Multi_key> <acute> <Otilde>           : "Ṍ"   U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+<Multi_key> <apostrophe> <Otilde>      : "Ṍ"   U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+<dead_acute> <dead_tilde> <O>          : "Ṍ"   U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+<dead_acute> <Multi_key> <asciitilde> <O>      : "Ṍ"   U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+<Multi_key> <acute> <dead_tilde> <O>   : "Ṍ"   U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+<Multi_key> <acute> <asciitilde> <O>   : "Ṍ"   U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+<Multi_key> <apostrophe> <dead_tilde> <O>      : "Ṍ"   U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+<Multi_key> <apostrophe> <asciitilde> <O>      : "Ṍ"   U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+<dead_acute> <otilde>                  : "ṍ"   U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE
+<Multi_key> <acute> <otilde>           : "ṍ"   U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE
+<Multi_key> <apostrophe> <otilde>      : "ṍ"   U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE
+<dead_acute> <dead_tilde> <o>          : "ṍ"   U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE
+<dead_acute> <Multi_key> <asciitilde> <o>      : "ṍ"   U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE
+<Multi_key> <acute> <dead_tilde> <o>   : "ṍ"   U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE
+<Multi_key> <acute> <asciitilde> <o>   : "ṍ"   U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE
+<Multi_key> <apostrophe> <dead_tilde> <o>      : "ṍ"   U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE
+<Multi_key> <apostrophe> <asciitilde> <o>      : "ṍ"   U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE
+<dead_diaeresis> <Otilde>              : "Ṏ"   U1E4E # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+<Multi_key> <quotedbl> <Otilde>        : "Ṏ"   U1E4E # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+<dead_diaeresis> <dead_tilde> <O>      : "Ṏ"   U1E4E # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+<dead_diaeresis> <Multi_key> <asciitilde> <O>  : "Ṏ"   U1E4E # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+<Multi_key> <quotedbl> <dead_tilde> <O>        : "Ṏ"   U1E4E # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+<Multi_key> <quotedbl> <asciitilde> <O>        : "Ṏ"   U1E4E # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+<dead_diaeresis> <otilde>              : "ṏ"   U1E4F # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+<Multi_key> <quotedbl> <otilde>        : "ṏ"   U1E4F # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+<dead_diaeresis> <dead_tilde> <o>      : "ṏ"   U1E4F # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+<dead_diaeresis> <Multi_key> <asciitilde> <o>  : "ṏ"   U1E4F # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+<Multi_key> <quotedbl> <dead_tilde> <o>        : "ṏ"   U1E4F # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+<Multi_key> <quotedbl> <asciitilde> <o>        : "ṏ"   U1E4F # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+<dead_grave> <Omacron>                 : "Ṑ"   U1E50 # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+<Multi_key> <grave> <Omacron>          : "Ṑ"   U1E50 # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+<dead_grave> <dead_macron> <O>         : "Ṑ"   U1E50 # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+<dead_grave> <Multi_key> <macron> <O>  : "Ṑ"   U1E50 # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+<dead_grave> <Multi_key> <underscore> <O>      : "Ṑ"   U1E50 # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+<Multi_key> <grave> <dead_macron> <O>  : "Ṑ"   U1E50 # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+<Multi_key> <grave> <macron> <O>       : "Ṑ"   U1E50 # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+<Multi_key> <grave> <underscore> <O>   : "Ṑ"   U1E50 # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+<dead_grave> <omacron>                 : "ṑ"   U1E51 # LATIN SMALL LETTER O WITH MACRON AND GRAVE
+<Multi_key> <grave> <omacron>          : "ṑ"   U1E51 # LATIN SMALL LETTER O WITH MACRON AND GRAVE
+<dead_grave> <dead_macron> <o>         : "ṑ"   U1E51 # LATIN SMALL LETTER O WITH MACRON AND GRAVE
+<dead_grave> <Multi_key> <macron> <o>  : "ṑ"   U1E51 # LATIN SMALL LETTER O WITH MACRON AND GRAVE
+<dead_grave> <Multi_key> <underscore> <o>      : "ṑ"   U1E51 # LATIN SMALL LETTER O WITH MACRON AND GRAVE
+<Multi_key> <grave> <dead_macron> <o>  : "ṑ"   U1E51 # LATIN SMALL LETTER O WITH MACRON AND GRAVE
+<Multi_key> <grave> <macron> <o>       : "ṑ"   U1E51 # LATIN SMALL LETTER O WITH MACRON AND GRAVE
+<Multi_key> <grave> <underscore> <o>   : "ṑ"   U1E51 # LATIN SMALL LETTER O WITH MACRON AND GRAVE
+<dead_acute> <Omacron>                 : "Ṓ"   U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <acute> <Omacron>          : "Ṓ"   U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <Omacron>     : "Ṓ"   U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+<dead_acute> <dead_macron> <O>         : "Ṓ"   U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+<dead_acute> <Multi_key> <macron> <O>  : "Ṓ"   U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+<dead_acute> <Multi_key> <underscore> <O>      : "Ṓ"   U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <acute> <dead_macron> <O>  : "Ṓ"   U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <acute> <macron> <O>       : "Ṓ"   U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <acute> <underscore> <O>   : "Ṓ"   U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <dead_macron> <O>     : "Ṓ"   U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <macron> <O>  : "Ṓ"   U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <underscore> <O>      : "Ṓ"   U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+<dead_acute> <omacron>                 : "ṓ"   U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <acute> <omacron>          : "ṓ"   U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <omacron>     : "ṓ"   U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE
+<dead_acute> <dead_macron> <o>         : "ṓ"   U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE
+<dead_acute> <Multi_key> <macron> <o>  : "ṓ"   U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE
+<dead_acute> <Multi_key> <underscore> <o>      : "ṓ"   U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <acute> <dead_macron> <o>  : "ṓ"   U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <acute> <macron> <o>       : "ṓ"   U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <acute> <underscore> <o>   : "ṓ"   U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <dead_macron> <o>     : "ṓ"   U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <macron> <o>  : "ṓ"   U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <underscore> <o>      : "ṓ"   U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE
+<dead_acute> <P>                       : "Ṕ"   U1E54 # LATIN CAPITAL LETTER P WITH ACUTE
+<Multi_key> <acute> <P>                : "Ṕ"   U1E54 # LATIN CAPITAL LETTER P WITH ACUTE
+<Multi_key> <apostrophe> <P>           : "Ṕ"   U1E54 # LATIN CAPITAL LETTER P WITH ACUTE
+<dead_acute> <p>                       : "ṕ"   U1E55 # LATIN SMALL LETTER P WITH ACUTE
+<Multi_key> <acute> <p>                : "ṕ"   U1E55 # LATIN SMALL LETTER P WITH ACUTE
+<Multi_key> <apostrophe> <p>           : "ṕ"   U1E55 # LATIN SMALL LETTER P WITH ACUTE
+<dead_abovedot> <P>                    : "Ṗ"   U1E56 # LATIN CAPITAL LETTER P WITH DOT ABOVE
+<Multi_key> <period> <P>               : "Ṗ"   U1E56 # LATIN CAPITAL LETTER P WITH DOT ABOVE
+<Multi_key> <P> <period>               : "Ṗ"   U1E56 # LATIN CAPITAL LETTER P WITH DOT ABOVE
+<dead_abovedot> <p>                    : "ṗ"   U1E57 # LATIN SMALL LETTER P WITH DOT ABOVE
+<Multi_key> <period> <p>               : "ṗ"   U1E57 # LATIN SMALL LETTER P WITH DOT ABOVE
+<Multi_key> <p> <period>               : "ṗ"   U1E57 # LATIN SMALL LETTER P WITH DOT ABOVE
+<dead_abovedot> <R>                    : "Ṙ"   U1E58 # LATIN CAPITAL LETTER R WITH DOT ABOVE
+<Multi_key> <period> <R>               : "Ṙ"   U1E58 # LATIN CAPITAL LETTER R WITH DOT ABOVE
+<dead_abovedot> <r>                    : "ṙ"   U1E59 # LATIN SMALL LETTER R WITH DOT ABOVE
+<Multi_key> <period> <r>               : "ṙ"   U1E59 # LATIN SMALL LETTER R WITH DOT ABOVE
+<dead_belowdot> <R>                    : "Ṛ"   U1E5A # LATIN CAPITAL LETTER R WITH DOT BELOW
+<Multi_key> <exclam> <R>               : "Ṛ"   U1E5A # LATIN CAPITAL LETTER R WITH DOT BELOW
+<dead_belowdot> <r>                    : "ṛ"   U1E5B # LATIN SMALL LETTER R WITH DOT BELOW
+<Multi_key> <exclam> <r>               : "ṛ"   U1E5B # LATIN SMALL LETTER R WITH DOT BELOW
+<dead_macron> <U1E5A>          : "Ṝ"   U1E5C # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+<Multi_key> <macron> <U1E5A>   : "Ṝ"   U1E5C # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+<Multi_key> <underscore> <U1E5A>       : "Ṝ"   U1E5C # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+<dead_macron> <dead_belowdot> <R>      : "Ṝ"   U1E5C # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+<dead_macron> <Multi_key> <exclam> <R>         : "Ṝ"   U1E5C # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+<Multi_key> <macron> <dead_belowdot> <R>       : "Ṝ"   U1E5C # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+<Multi_key> <macron> <exclam> <R>      : "Ṝ"   U1E5C # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+<Multi_key> <underscore> <dead_belowdot> <R>   : "Ṝ"   U1E5C # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+<Multi_key> <underscore> <exclam> <R>  : "Ṝ"   U1E5C # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+<dead_macron> <U1E5B>          : "ṝ"   U1E5D # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+<Multi_key> <macron> <U1E5B>   : "ṝ"   U1E5D # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+<Multi_key> <underscore> <U1E5B>       : "ṝ"   U1E5D # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+<dead_macron> <dead_belowdot> <r>      : "ṝ"   U1E5D # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+<dead_macron> <Multi_key> <exclam> <r>         : "ṝ"   U1E5D # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+<Multi_key> <macron> <dead_belowdot> <r>       : "ṝ"   U1E5D # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+<Multi_key> <macron> <exclam> <r>      : "ṝ"   U1E5D # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+<Multi_key> <underscore> <dead_belowdot> <r>   : "ṝ"   U1E5D # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+<Multi_key> <underscore> <exclam> <r>  : "ṝ"   U1E5D # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+<dead_belowmacron> <R>                         : "Ṟ"   U1E5E # LATIN CAPITAL LETTER R WITH LINE BELOW
+<dead_belowmacron> <r>                         : "ṟ"   U1E5F # LATIN SMALL LETTER R WITH LINE BELOW
+<dead_abovedot> <S>                    : "Ṡ"   U1E60 # LATIN CAPITAL LETTER S WITH DOT ABOVE
+<Multi_key> <period> <S>               : "Ṡ"   U1E60 # LATIN CAPITAL LETTER S WITH DOT ABOVE
+<Multi_key> <S> <period>               : "Ṡ"   U1E60 # LATIN CAPITAL LETTER S WITH DOT ABOVE
+<dead_abovedot> <s>                    : "ṡ"   U1E61 # LATIN SMALL LETTER S WITH DOT ABOVE
+<Multi_key> <period> <s>               : "ṡ"   U1E61 # LATIN SMALL LETTER S WITH DOT ABOVE
+<Multi_key> <s> <period>               : "ṡ"   U1E61 # LATIN SMALL LETTER S WITH DOT ABOVE
+<dead_belowdot> <S>                    : "Ṣ"   U1E62 # LATIN CAPITAL LETTER S WITH DOT BELOW
+<Multi_key> <exclam> <S>               : "Ṣ"   U1E62 # LATIN CAPITAL LETTER S WITH DOT BELOW
+<dead_belowdot> <s>                    : "ṣ"   U1E63 # LATIN SMALL LETTER S WITH DOT BELOW
+<Multi_key> <exclam> <s>               : "ṣ"   U1E63 # LATIN SMALL LETTER S WITH DOT BELOW
+<dead_abovedot> <Sacute>               : "Ṥ"   U1E64 # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+<Multi_key> <period> <Sacute>          : "Ṥ"   U1E64 # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+<dead_abovedot> <dead_acute> <S>       : "Ṥ"   U1E64 # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+<dead_abovedot> <Multi_key> <acute> <S>        : "Ṥ"   U1E64 # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+<dead_abovedot> <Multi_key> <apostrophe> <S>   : "Ṥ"   U1E64 # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+<Multi_key> <period> <dead_acute> <S>  : "Ṥ"   U1E64 # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+<Multi_key> <period> <acute> <S>       : "Ṥ"   U1E64 # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+<Multi_key> <period> <apostrophe> <S>  : "Ṥ"   U1E64 # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+<dead_abovedot> <sacute>               : "ṥ"   U1E65 # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+<Multi_key> <period> <sacute>          : "ṥ"   U1E65 # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+<dead_abovedot> <dead_acute> <s>       : "ṥ"   U1E65 # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+<dead_abovedot> <Multi_key> <acute> <s>        : "ṥ"   U1E65 # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+<dead_abovedot> <Multi_key> <apostrophe> <s>   : "ṥ"   U1E65 # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+<Multi_key> <period> <dead_acute> <s>  : "ṥ"   U1E65 # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+<Multi_key> <period> <acute> <s>       : "ṥ"   U1E65 # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+<Multi_key> <period> <apostrophe> <s>  : "ṥ"   U1E65 # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+<dead_abovedot> <Scaron>               : "Ṧ"   U1E66 # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+<Multi_key> <period> <Scaron>          : "Ṧ"   U1E66 # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+<dead_abovedot> <dead_caron> <S>       : "Ṧ"   U1E66 # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+<dead_abovedot> <Multi_key> <c> <S>    : "Ṧ"   U1E66 # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+<Multi_key> <period> <dead_caron> <S>  : "Ṧ"   U1E66 # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+<dead_abovedot> <scaron>               : "ṧ"   U1E67 # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+<Multi_key> <period> <scaron>          : "ṧ"   U1E67 # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+<dead_abovedot> <dead_caron> <s>       : "ṧ"   U1E67 # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+<dead_abovedot> <Multi_key> <c> <s>    : "ṧ"   U1E67 # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+<Multi_key> <period> <dead_caron> <s>  : "ṧ"   U1E67 # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+<dead_abovedot> <U1E62>        : "Ṩ"   U1E68 # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+<Multi_key> <period> <U1E62>   : "Ṩ"   U1E68 # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+<dead_abovedot> <dead_belowdot> <S>    : "Ṩ"   U1E68 # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+<dead_abovedot> <Multi_key> <exclam> <S>       : "Ṩ"   U1E68 # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+<Multi_key> <period> <dead_belowdot> <S>       : "Ṩ"   U1E68 # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+<Multi_key> <period> <exclam> <S>      : "Ṩ"   U1E68 # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+<dead_abovedot> <U1E63>        : "ṩ"   U1E69 # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+<Multi_key> <period> <U1E63>   : "ṩ"   U1E69 # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+<dead_abovedot> <dead_belowdot> <s>    : "ṩ"   U1E69 # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+<dead_abovedot> <Multi_key> <exclam> <s>       : "ṩ"   U1E69 # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+<Multi_key> <period> <dead_belowdot> <s>       : "ṩ"   U1E69 # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+<Multi_key> <period> <exclam> <s>      : "ṩ"   U1E69 # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+<dead_abovedot> <T>                    : "Ṫ"   U1E6A # LATIN CAPITAL LETTER T WITH DOT ABOVE
+<Multi_key> <period> <T>               : "Ṫ"   U1E6A # LATIN CAPITAL LETTER T WITH DOT ABOVE
+<Multi_key> <T> <period>               : "Ṫ"   U1E6A # LATIN CAPITAL LETTER T WITH DOT ABOVE
+<dead_abovedot> <t>                    : "ṫ"   U1E6B # LATIN SMALL LETTER T WITH DOT ABOVE
+<Multi_key> <period> <t>               : "ṫ"   U1E6B # LATIN SMALL LETTER T WITH DOT ABOVE
+<Multi_key> <t> <period>               : "ṫ"   U1E6B # LATIN SMALL LETTER T WITH DOT ABOVE
+<dead_belowdot> <T>                    : "Ṭ"   U1E6C # LATIN CAPITAL LETTER T WITH DOT BELOW
+<Multi_key> <exclam> <T>               : "Ṭ"   U1E6C # LATIN CAPITAL LETTER T WITH DOT BELOW
+<dead_belowdot> <t>                    : "ṭ"   U1E6D # LATIN SMALL LETTER T WITH DOT BELOW
+<Multi_key> <exclam> <t>               : "ṭ"   U1E6D # LATIN SMALL LETTER T WITH DOT BELOW
+<dead_belowmacron> <T>                         : "Ṯ"   U1E6E # LATIN CAPITAL LETTER T WITH LINE BELOW
+<dead_belowmacron> <t>                         : "ṯ"   U1E6F # LATIN SMALL LETTER T WITH LINE BELOW
+<dead_belowcircumflex> <T>                     : "Ṱ"   U1E70 # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
+<dead_belowcircumflex> <t>                     : "ṱ"   U1E71 # LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW
+<dead_belowdiaeresis> <U>                      : "Ṳ"   U1E72 # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
+<dead_belowdiaeresis> <u>                      : "ṳ"   U1E73 # LATIN SMALL LETTER U WITH DIAERESIS BELOW
+<dead_belowtilde> <U>                          : "Ṵ"   U1E74 # LATIN CAPITAL LETTER U WITH TILDE BELOW
+<dead_belowtilde> <u>                          : "ṵ"   U1E75 # LATIN SMALL LETTER U WITH TILDE BELOW
+<dead_belowcircumflex> <U>                     : "Ṷ"   U1E76 # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
+<dead_belowcircumflex> <u>                     : "ṷ"   U1E77 # LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW
+<dead_acute> <Utilde>                  : "Ṹ"   U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+<Multi_key> <acute> <Utilde>           : "Ṹ"   U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+<Multi_key> <apostrophe> <Utilde>      : "Ṹ"   U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+<dead_acute> <dead_tilde> <U>          : "Ṹ"   U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+<dead_acute> <Multi_key> <asciitilde> <U>      : "Ṹ"   U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+<Multi_key> <acute> <dead_tilde> <U>   : "Ṹ"   U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+<Multi_key> <acute> <asciitilde> <U>   : "Ṹ"   U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+<Multi_key> <apostrophe> <dead_tilde> <U>      : "Ṹ"   U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+<Multi_key> <apostrophe> <asciitilde> <U>      : "Ṹ"   U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+<dead_acute> <utilde>                  : "ṹ"   U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE
+<Multi_key> <acute> <utilde>           : "ṹ"   U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE
+<Multi_key> <apostrophe> <utilde>      : "ṹ"   U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE
+<dead_acute> <dead_tilde> <u>          : "ṹ"   U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE
+<dead_acute> <Multi_key> <asciitilde> <u>      : "ṹ"   U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE
+<Multi_key> <acute> <dead_tilde> <u>   : "ṹ"   U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE
+<Multi_key> <acute> <asciitilde> <u>   : "ṹ"   U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE
+<Multi_key> <apostrophe> <dead_tilde> <u>      : "ṹ"   U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE
+<Multi_key> <apostrophe> <asciitilde> <u>      : "ṹ"   U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE
+<dead_diaeresis> <Umacron>             : "Ṻ"   U1E7A # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+<Multi_key> <quotedbl> <Umacron>       : "Ṻ"   U1E7A # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+<dead_diaeresis> <dead_macron> <U>     : "Ṻ"   U1E7A # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+<dead_diaeresis> <Multi_key> <macron> <U>      : "Ṻ"   U1E7A # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+<dead_diaeresis> <Multi_key> <underscore> <U>  : "Ṻ"   U1E7A # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+<Multi_key> <quotedbl> <dead_macron> <U>       : "Ṻ"   U1E7A # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+<Multi_key> <quotedbl> <macron> <U>    : "Ṻ"   U1E7A # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+<Multi_key> <quotedbl> <underscore> <U>        : "Ṻ"   U1E7A # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+<dead_diaeresis> <umacron>             : "ṻ"   U1E7B # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+<Multi_key> <quotedbl> <umacron>       : "ṻ"   U1E7B # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+<dead_diaeresis> <dead_macron> <u>     : "ṻ"   U1E7B # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+<dead_diaeresis> <Multi_key> <macron> <u>      : "ṻ"   U1E7B # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+<dead_diaeresis> <Multi_key> <underscore> <u>  : "ṻ"   U1E7B # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+<Multi_key> <quotedbl> <dead_macron> <u>       : "ṻ"   U1E7B # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+<Multi_key> <quotedbl> <macron> <u>    : "ṻ"   U1E7B # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+<Multi_key> <quotedbl> <underscore> <u>        : "ṻ"   U1E7B # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+<dead_tilde> <V>                       : "Ṽ"   U1E7C # LATIN CAPITAL LETTER V WITH TILDE
+<Multi_key> <asciitilde> <V>           : "Ṽ"   U1E7C # LATIN CAPITAL LETTER V WITH TILDE
+<dead_tilde> <v>                       : "ṽ"   U1E7D # LATIN SMALL LETTER V WITH TILDE
+<Multi_key> <asciitilde> <v>           : "ṽ"   U1E7D # LATIN SMALL LETTER V WITH TILDE
+<dead_belowdot> <V>                    : "Ṿ"   U1E7E # LATIN CAPITAL LETTER V WITH DOT BELOW
+<Multi_key> <exclam> <V>               : "Ṿ"   U1E7E # LATIN CAPITAL LETTER V WITH DOT BELOW
+<dead_belowdot> <v>                    : "ṿ"   U1E7F # LATIN SMALL LETTER V WITH DOT BELOW
+<Multi_key> <exclam> <v>               : "ṿ"   U1E7F # LATIN SMALL LETTER V WITH DOT BELOW
+<dead_grave> <W>                       : "Ẁ"   U1E80 # LATIN CAPITAL LETTER W WITH GRAVE
+<Multi_key> <grave> <W>                : "Ẁ"   U1E80 # LATIN CAPITAL LETTER W WITH GRAVE
+<dead_grave> <w>                       : "ẁ"   U1E81 # LATIN SMALL LETTER W WITH GRAVE
+<Multi_key> <grave> <w>                : "ẁ"   U1E81 # LATIN SMALL LETTER W WITH GRAVE
+<dead_acute> <W>                       : "Ẃ"   U1E82 # LATIN CAPITAL LETTER W WITH ACUTE
+<Multi_key> <acute> <W>                : "Ẃ"   U1E82 # LATIN CAPITAL LETTER W WITH ACUTE
+<Multi_key> <apostrophe> <W>           : "Ẃ"   U1E82 # LATIN CAPITAL LETTER W WITH ACUTE
+<dead_acute> <w>                       : "ẃ"   U1E83 # LATIN SMALL LETTER W WITH ACUTE
+<Multi_key> <acute> <w>                : "ẃ"   U1E83 # LATIN SMALL LETTER W WITH ACUTE
+<Multi_key> <apostrophe> <w>           : "ẃ"   U1E83 # LATIN SMALL LETTER W WITH ACUTE
+<dead_diaeresis> <W>                   : "Ẅ"   U1E84 # LATIN CAPITAL LETTER W WITH DIAERESIS
+<Multi_key> <quotedbl> <W>             : "Ẅ"   U1E84 # LATIN CAPITAL LETTER W WITH DIAERESIS
+<dead_diaeresis> <w>                   : "ẅ"   U1E85 # LATIN SMALL LETTER W WITH DIAERESIS
+<Multi_key> <quotedbl> <w>             : "ẅ"   U1E85 # LATIN SMALL LETTER W WITH DIAERESIS
+<dead_abovedot> <W>                    : "Ẇ"   U1E86 # LATIN CAPITAL LETTER W WITH DOT ABOVE
+<Multi_key> <period> <W>               : "Ẇ"   U1E86 # LATIN CAPITAL LETTER W WITH DOT ABOVE
+<dead_abovedot> <w>                    : "ẇ"   U1E87 # LATIN SMALL LETTER W WITH DOT ABOVE
+<Multi_key> <period> <w>               : "ẇ"   U1E87 # LATIN SMALL LETTER W WITH DOT ABOVE
+<dead_belowdot> <W>                    : "Ẉ"   U1E88 # LATIN CAPITAL LETTER W WITH DOT BELOW
+<Multi_key> <exclam> <W>               : "Ẉ"   U1E88 # LATIN CAPITAL LETTER W WITH DOT BELOW
+<dead_belowdot> <w>                    : "ẉ"   U1E89 # LATIN SMALL LETTER W WITH DOT BELOW
+<Multi_key> <exclam> <w>               : "ẉ"   U1E89 # LATIN SMALL LETTER W WITH DOT BELOW
+<dead_abovedot> <X>                    : "Ẋ"   U1E8A # LATIN CAPITAL LETTER X WITH DOT ABOVE
+<Multi_key> <period> <X>               : "Ẋ"   U1E8A # LATIN CAPITAL LETTER X WITH DOT ABOVE
+<dead_abovedot> <x>                    : "ẋ"   U1E8B # LATIN SMALL LETTER X WITH DOT ABOVE
+<Multi_key> <period> <x>               : "ẋ"   U1E8B # LATIN SMALL LETTER X WITH DOT ABOVE
+<dead_diaeresis> <X>                   : "Ẍ"   U1E8C # LATIN CAPITAL LETTER X WITH DIAERESIS
+<Multi_key> <quotedbl> <X>             : "Ẍ"   U1E8C # LATIN CAPITAL LETTER X WITH DIAERESIS
+<dead_diaeresis> <x>                   : "ẍ"   U1E8D # LATIN SMALL LETTER X WITH DIAERESIS
+<Multi_key> <quotedbl> <x>             : "ẍ"   U1E8D # LATIN SMALL LETTER X WITH DIAERESIS
+<dead_abovedot> <Y>                    : "Ẏ"   U1E8E # LATIN CAPITAL LETTER Y WITH DOT ABOVE
+<Multi_key> <period> <Y>               : "Ẏ"   U1E8E # LATIN CAPITAL LETTER Y WITH DOT ABOVE
+<dead_abovedot> <y>                    : "ẏ"   U1E8F # LATIN SMALL LETTER Y WITH DOT ABOVE
+<Multi_key> <period> <y>               : "ẏ"   U1E8F # LATIN SMALL LETTER Y WITH DOT ABOVE
+<dead_circumflex> <Z>                  : "Ẑ"   U1E90 # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <Z>          : "Ẑ"   U1E90 # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+<dead_circumflex> <z>                  : "ẑ"   U1E91 # LATIN SMALL LETTER Z WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <z>          : "ẑ"   U1E91 # LATIN SMALL LETTER Z WITH CIRCUMFLEX
+<dead_belowdot> <Z>                    : "Ẓ"   U1E92 # LATIN CAPITAL LETTER Z WITH DOT BELOW
+<Multi_key> <exclam> <Z>               : "Ẓ"   U1E92 # LATIN CAPITAL LETTER Z WITH DOT BELOW
+<dead_belowdot> <z>                    : "ẓ"   U1E93 # LATIN SMALL LETTER Z WITH DOT BELOW
+<Multi_key> <exclam> <z>               : "ẓ"   U1E93 # LATIN SMALL LETTER Z WITH DOT BELOW
+<dead_belowmacron> <Z>                         : "Ẕ"   U1E94 # LATIN CAPITAL LETTER Z WITH LINE BELOW
+<dead_belowmacron> <z>                         : "ẕ"   U1E95 # LATIN SMALL LETTER Z WITH LINE BELOW
+<dead_belowmacron> <h>                         : "ẖ"   U1E96 # LATIN SMALL LETTER H WITH LINE BELOW
+<dead_diaeresis> <t>                   : "ẗ"   U1E97 # LATIN SMALL LETTER T WITH DIAERESIS
+<Multi_key> <quotedbl> <t>             : "ẗ"   U1E97 # LATIN SMALL LETTER T WITH DIAERESIS
+<dead_abovering> <w>                   : "ẘ"   U1E98 # LATIN SMALL LETTER W WITH RING ABOVE
+<Multi_key> <o> <w>                    : "ẘ"   U1E98 # LATIN SMALL LETTER W WITH RING ABOVE
+<dead_abovering> <y>                   : "ẙ"   U1E99 # LATIN SMALL LETTER Y WITH RING ABOVE
+<Multi_key> <o> <y>                    : "ẙ"   U1E99 # LATIN SMALL LETTER Y WITH RING ABOVE
+<dead_abovedot> <U017F>        : "ẛ"   U1E9B # LATIN SMALL LETTER LONG S WITH DOT ABOVE
+<Multi_key> <period> <U017F>   : "ẛ"   U1E9B # LATIN SMALL LETTER LONG S WITH DOT ABOVE
+<dead_belowdot> <A>                    : "Ạ"   U1EA0 # LATIN CAPITAL LETTER A WITH DOT BELOW
+<Multi_key> <exclam> <A>               : "Ạ"   U1EA0 # LATIN CAPITAL LETTER A WITH DOT BELOW
+<dead_belowdot> <a>                    : "ạ"   U1EA1 # LATIN SMALL LETTER A WITH DOT BELOW
+<Multi_key> <exclam> <a>               : "ạ"   U1EA1 # LATIN SMALL LETTER A WITH DOT BELOW
+<dead_hook> <A>                        : "Ả"   U1EA2 # LATIN CAPITAL LETTER A WITH HOOK ABOVE
+<Multi_key> <question> <A>             : "Ả"   U1EA2 # LATIN CAPITAL LETTER A WITH HOOK ABOVE
+<dead_hook> <a>                        : "ả"   U1EA3 # LATIN SMALL LETTER A WITH HOOK ABOVE
+<Multi_key> <question> <a>             : "ả"   U1EA3 # LATIN SMALL LETTER A WITH HOOK ABOVE
+<dead_acute> <Acircumflex>             : "Ấ"   U1EA4 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <Acircumflex>      : "Ấ"   U1EA4 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <Acircumflex>         : "Ấ"   U1EA4 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+<dead_acute> <dead_circumflex> <A>     : "Ấ"   U1EA4 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+<dead_acute> <Multi_key> <asciicircum> <A>     : "Ấ"   U1EA4 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <dead_circumflex> <A>      : "Ấ"   U1EA4 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <asciicircum> <A>  : "Ấ"   U1EA4 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <dead_circumflex> <A>         : "Ấ"   U1EA4 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <asciicircum> <A>     : "Ấ"   U1EA4 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+<dead_acute> <acircumflex>             : "ấ"   U1EA5 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <acircumflex>      : "ấ"   U1EA5 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <acircumflex>         : "ấ"   U1EA5 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+<dead_acute> <dead_circumflex> <a>     : "ấ"   U1EA5 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+<dead_acute> <Multi_key> <asciicircum> <a>     : "ấ"   U1EA5 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <dead_circumflex> <a>      : "ấ"   U1EA5 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <asciicircum> <a>  : "ấ"   U1EA5 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <dead_circumflex> <a>         : "ấ"   U1EA5 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <asciicircum> <a>     : "ấ"   U1EA5 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+<dead_grave> <Acircumflex>             : "Ầ"   U1EA6 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <Acircumflex>      : "Ầ"   U1EA6 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+<dead_grave> <dead_circumflex> <A>     : "Ầ"   U1EA6 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+<dead_grave> <Multi_key> <asciicircum> <A>     : "Ầ"   U1EA6 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <dead_circumflex> <A>      : "Ầ"   U1EA6 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <asciicircum> <A>  : "Ầ"   U1EA6 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+<dead_grave> <acircumflex>             : "ầ"   U1EA7 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <acircumflex>      : "ầ"   U1EA7 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+<dead_grave> <dead_circumflex> <a>     : "ầ"   U1EA7 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+<dead_grave> <Multi_key> <asciicircum> <a>     : "ầ"   U1EA7 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <dead_circumflex> <a>      : "ầ"   U1EA7 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <asciicircum> <a>  : "ầ"   U1EA7 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+<dead_hook> <Acircumflex>              : "Ẩ"   U1EA8 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <Acircumflex>   : "Ẩ"   U1EA8 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_hook> <dead_circumflex> <A>      : "Ẩ"   U1EA8 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_hook> <Multi_key> <asciicircum> <A>      : "Ẩ"   U1EA8 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <dead_circumflex> <A>   : "Ẩ"   U1EA8 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <asciicircum> <A>       : "Ẩ"   U1EA8 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_hook> <acircumflex>              : "ẩ"   U1EA9 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <acircumflex>   : "ẩ"   U1EA9 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_hook> <dead_circumflex> <a>      : "ẩ"   U1EA9 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_hook> <Multi_key> <asciicircum> <a>      : "ẩ"   U1EA9 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <dead_circumflex> <a>   : "ẩ"   U1EA9 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <asciicircum> <a>       : "ẩ"   U1EA9 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_tilde> <Acircumflex>             : "Ẫ"   U1EAA # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <Acircumflex>         : "Ẫ"   U1EAA # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+<dead_tilde> <dead_circumflex> <A>     : "Ẫ"   U1EAA # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+<dead_tilde> <Multi_key> <asciicircum> <A>     : "Ẫ"   U1EAA # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <dead_circumflex> <A>         : "Ẫ"   U1EAA # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <asciicircum> <A>     : "Ẫ"   U1EAA # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+<dead_tilde> <acircumflex>             : "ẫ"   U1EAB # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <acircumflex>         : "ẫ"   U1EAB # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+<dead_tilde> <dead_circumflex> <a>     : "ẫ"   U1EAB # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+<dead_tilde> <Multi_key> <asciicircum> <a>     : "ẫ"   U1EAB # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <dead_circumflex> <a>         : "ẫ"   U1EAB # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <asciicircum> <a>     : "ẫ"   U1EAB # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+<dead_circumflex> <U1EA0>      : "Ậ"   U1EAC # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <U1EA0>      : "Ậ"   U1EAC # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+<dead_circumflex> <dead_belowdot> <A>  : "Ậ"   U1EAC # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+<dead_circumflex> <Multi_key> <exclam> <A>     : "Ậ"   U1EAC # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <dead_belowdot> <A>  : "Ậ"   U1EAC # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <exclam> <A>         : "Ậ"   U1EAC # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+<dead_belowdot> <Acircumflex>          : "Ậ"   U1EAC # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+<dead_circumflex> <U1EA1>      : "ậ"   U1EAD # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <U1EA1>      : "ậ"   U1EAD # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+<dead_circumflex> <dead_belowdot> <a>  : "ậ"   U1EAD # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+<dead_circumflex> <Multi_key> <exclam> <a>     : "ậ"   U1EAD # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <dead_belowdot> <a>  : "ậ"   U1EAD # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <exclam> <a>         : "ậ"   U1EAD # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+<dead_belowdot> <acircumflex>          : "ậ"   U1EAD # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+<dead_acute> <Abreve>                  : "Ắ"   U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+<Multi_key> <acute> <Abreve>           : "Ắ"   U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+<Multi_key> <apostrophe> <Abreve>      : "Ắ"   U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+<dead_acute> <dead_breve> <A>          : "Ắ"   U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+<dead_acute> <Multi_key> <U> <A>       : "Ắ"   U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+<dead_acute> <Multi_key> <b> <A>       : "Ắ"   U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+<Multi_key> <acute> <dead_breve> <A>   : "Ắ"   U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+<Multi_key> <acute> <b> <A>            : "Ắ"   U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+<Multi_key> <apostrophe> <dead_breve> <A>      : "Ắ"   U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+<Multi_key> <apostrophe> <b> <A>       : "Ắ"   U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+<dead_acute> <abreve>                  : "ắ"   U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE
+<Multi_key> <acute> <abreve>           : "ắ"   U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE
+<Multi_key> <apostrophe> <abreve>      : "ắ"   U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE
+<dead_acute> <dead_breve> <a>          : "ắ"   U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE
+<dead_acute> <Multi_key> <U> <a>       : "ắ"   U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE
+<dead_acute> <Multi_key> <b> <a>       : "ắ"   U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE
+<Multi_key> <acute> <dead_breve> <a>   : "ắ"   U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE
+<Multi_key> <acute> <b> <a>            : "ắ"   U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE
+<Multi_key> <apostrophe> <dead_breve> <a>      : "ắ"   U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE
+<Multi_key> <apostrophe> <b> <a>       : "ắ"   U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE
+<dead_grave> <Abreve>                  : "Ằ"   U1EB0 # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+<Multi_key> <grave> <Abreve>           : "Ằ"   U1EB0 # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+<dead_grave> <dead_breve> <A>          : "Ằ"   U1EB0 # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+<dead_grave> <Multi_key> <U> <A>       : "Ằ"   U1EB0 # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+<dead_grave> <Multi_key> <b> <A>       : "Ằ"   U1EB0 # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+<Multi_key> <grave> <dead_breve> <A>   : "Ằ"   U1EB0 # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+<Multi_key> <grave> <b> <A>            : "Ằ"   U1EB0 # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+<dead_grave> <abreve>                  : "ằ"   U1EB1 # LATIN SMALL LETTER A WITH BREVE AND GRAVE
+<Multi_key> <grave> <abreve>           : "ằ"   U1EB1 # LATIN SMALL LETTER A WITH BREVE AND GRAVE
+<dead_grave> <dead_breve> <a>          : "ằ"   U1EB1 # LATIN SMALL LETTER A WITH BREVE AND GRAVE
+<dead_grave> <Multi_key> <U> <a>       : "ằ"   U1EB1 # LATIN SMALL LETTER A WITH BREVE AND GRAVE
+<dead_grave> <Multi_key> <b> <a>       : "ằ"   U1EB1 # LATIN SMALL LETTER A WITH BREVE AND GRAVE
+<Multi_key> <grave> <dead_breve> <a>   : "ằ"   U1EB1 # LATIN SMALL LETTER A WITH BREVE AND GRAVE
+<Multi_key> <grave> <b> <a>            : "ằ"   U1EB1 # LATIN SMALL LETTER A WITH BREVE AND GRAVE
+<dead_hook> <Abreve>                   : "Ẳ"   U1EB2 # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+<Multi_key> <question> <Abreve>        : "Ẳ"   U1EB2 # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+<dead_hook> <dead_breve> <A>           : "Ẳ"   U1EB2 # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+<dead_hook> <Multi_key> <U> <A>        : "Ẳ"   U1EB2 # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+<dead_hook> <Multi_key> <b> <A>        : "Ẳ"   U1EB2 # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+<Multi_key> <question> <dead_breve> <A>        : "Ẳ"   U1EB2 # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+<Multi_key> <question> <b> <A>         : "Ẳ"   U1EB2 # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+<dead_hook> <abreve>                   : "ẳ"   U1EB3 # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+<Multi_key> <question> <abreve>        : "ẳ"   U1EB3 # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+<dead_hook> <dead_breve> <a>           : "ẳ"   U1EB3 # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+<dead_hook> <Multi_key> <U> <a>        : "ẳ"   U1EB3 # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+<dead_hook> <Multi_key> <b> <a>        : "ẳ"   U1EB3 # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+<Multi_key> <question> <dead_breve> <a>        : "ẳ"   U1EB3 # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+<Multi_key> <question> <b> <a>         : "ẳ"   U1EB3 # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+<dead_tilde> <Abreve>                  : "Ẵ"   U1EB4 # LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+<Multi_key> <asciitilde> <Abreve>      : "Ẵ"   U1EB4 # LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+<dead_tilde> <dead_breve> <A>          : "Ẵ"   U1EB4 # LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+<dead_tilde> <Multi_key> <U> <A>       : "Ẵ"   U1EB4 # LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+<dead_tilde> <Multi_key> <b> <A>       : "Ẵ"   U1EB4 # LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+<Multi_key> <asciitilde> <dead_breve> <A>      : "Ẵ"   U1EB4 # LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+<Multi_key> <asciitilde> <b> <A>       : "Ẵ"   U1EB4 # LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+<dead_tilde> <abreve>                  : "ẵ"   U1EB5 # LATIN SMALL LETTER A WITH BREVE AND TILDE
+<Multi_key> <asciitilde> <abreve>      : "ẵ"   U1EB5 # LATIN SMALL LETTER A WITH BREVE AND TILDE
+<dead_tilde> <dead_breve> <a>          : "ẵ"   U1EB5 # LATIN SMALL LETTER A WITH BREVE AND TILDE
+<dead_tilde> <Multi_key> <U> <a>       : "ẵ"   U1EB5 # LATIN SMALL LETTER A WITH BREVE AND TILDE
+<dead_tilde> <Multi_key> <b> <a>       : "ẵ"   U1EB5 # LATIN SMALL LETTER A WITH BREVE AND TILDE
+<Multi_key> <asciitilde> <dead_breve> <a>      : "ẵ"   U1EB5 # LATIN SMALL LETTER A WITH BREVE AND TILDE
+<Multi_key> <asciitilde> <b> <a>       : "ẵ"   U1EB5 # LATIN SMALL LETTER A WITH BREVE AND TILDE
+<dead_breve> <U1EA0>           : "Ặ"   U1EB6 # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+<Multi_key> <U> <U1EA0>        : "Ặ"   U1EB6 # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+<Multi_key> <b> <U1EA0>        : "Ặ"   U1EB6 # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+<dead_breve> <dead_belowdot> <A>       : "Ặ"   U1EB6 # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+<dead_breve> <Multi_key> <exclam> <A>  : "Ặ"   U1EB6 # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+<Multi_key> <U> <dead_belowdot> <A>    : "Ặ"   U1EB6 # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+<Multi_key> <U> <exclam> <A>           : "Ặ"   U1EB6 # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+<Multi_key> <b> <dead_belowdot> <A>    : "Ặ"   U1EB6 # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+<Multi_key> <b> <exclam> <A>           : "Ặ"   U1EB6 # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+<dead_belowdot> <Abreve>               : "Ặ"   U1EB6 # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+<dead_breve> <U1EA1>           : "ặ"   U1EB7 # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+<Multi_key> <U> <U1EA1>        : "ặ"   U1EB7 # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+<Multi_key> <b> <U1EA1>        : "ặ"   U1EB7 # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+<dead_breve> <dead_belowdot> <a>       : "ặ"   U1EB7 # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+<dead_breve> <Multi_key> <exclam> <a>  : "ặ"   U1EB7 # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+<Multi_key> <U> <dead_belowdot> <a>    : "ặ"   U1EB7 # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+<Multi_key> <U> <exclam> <a>           : "ặ"   U1EB7 # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+<Multi_key> <b> <dead_belowdot> <a>    : "ặ"   U1EB7 # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+<Multi_key> <b> <exclam> <a>           : "ặ"   U1EB7 # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+<dead_belowdot> <abreve>               : "ặ"   U1EB7 # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+<dead_belowdot> <E>                    : "Ẹ"   U1EB8 # LATIN CAPITAL LETTER E WITH DOT BELOW
+<Multi_key> <exclam> <E>               : "Ẹ"   U1EB8 # LATIN CAPITAL LETTER E WITH DOT BELOW
+<dead_belowdot> <e>                    : "ẹ"   U1EB9 # LATIN SMALL LETTER E WITH DOT BELOW
+<Multi_key> <exclam> <e>               : "ẹ"   U1EB9 # LATIN SMALL LETTER E WITH DOT BELOW
+<dead_hook> <E>                        : "Ẻ"   U1EBA # LATIN CAPITAL LETTER E WITH HOOK ABOVE
+<Multi_key> <question> <E>             : "Ẻ"   U1EBA # LATIN CAPITAL LETTER E WITH HOOK ABOVE
+<dead_hook> <e>                        : "ẻ"   U1EBB # LATIN SMALL LETTER E WITH HOOK ABOVE
+<Multi_key> <question> <e>             : "ẻ"   U1EBB # LATIN SMALL LETTER E WITH HOOK ABOVE
+<dead_tilde> <E>                       : "Ẽ"   U1EBC # LATIN CAPITAL LETTER E WITH TILDE
+<Multi_key> <asciitilde> <E>           : "Ẽ"   U1EBC # LATIN CAPITAL LETTER E WITH TILDE
+<dead_tilde> <e>                       : "ẽ"   U1EBD # LATIN SMALL LETTER E WITH TILDE
+<Multi_key> <asciitilde> <e>           : "ẽ"   U1EBD # LATIN SMALL LETTER E WITH TILDE
+<dead_acute> <Ecircumflex>             : "Ế"   U1EBE # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <Ecircumflex>      : "Ế"   U1EBE # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <Ecircumflex>         : "Ế"   U1EBE # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+<dead_acute> <dead_circumflex> <E>     : "Ế"   U1EBE # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+<dead_acute> <Multi_key> <asciicircum> <E>     : "Ế"   U1EBE # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <dead_circumflex> <E>      : "Ế"   U1EBE # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <asciicircum> <E>  : "Ế"   U1EBE # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <dead_circumflex> <E>         : "Ế"   U1EBE # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <asciicircum> <E>     : "Ế"   U1EBE # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+<dead_acute> <ecircumflex>             : "ế"   U1EBF # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <ecircumflex>      : "ế"   U1EBF # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <ecircumflex>         : "ế"   U1EBF # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+<dead_acute> <dead_circumflex> <e>     : "ế"   U1EBF # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+<dead_acute> <Multi_key> <asciicircum> <e>     : "ế"   U1EBF # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <dead_circumflex> <e>      : "ế"   U1EBF # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <asciicircum> <e>  : "ế"   U1EBF # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <dead_circumflex> <e>         : "ế"   U1EBF # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <asciicircum> <e>     : "ế"   U1EBF # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+<dead_grave> <Ecircumflex>             : "Ề"   U1EC0 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <Ecircumflex>      : "Ề"   U1EC0 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+<dead_grave> <dead_circumflex> <E>     : "Ề"   U1EC0 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+<dead_grave> <Multi_key> <asciicircum> <E>     : "Ề"   U1EC0 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <dead_circumflex> <E>      : "Ề"   U1EC0 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <asciicircum> <E>  : "Ề"   U1EC0 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+<dead_grave> <ecircumflex>             : "ề"   U1EC1 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <ecircumflex>      : "ề"   U1EC1 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+<dead_grave> <dead_circumflex> <e>     : "ề"   U1EC1 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+<dead_grave> <Multi_key> <asciicircum> <e>     : "ề"   U1EC1 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <dead_circumflex> <e>      : "ề"   U1EC1 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <asciicircum> <e>  : "ề"   U1EC1 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+<dead_hook> <Ecircumflex>              : "Ể"   U1EC2 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <Ecircumflex>   : "Ể"   U1EC2 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_hook> <dead_circumflex> <E>      : "Ể"   U1EC2 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_hook> <Multi_key> <asciicircum> <E>      : "Ể"   U1EC2 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <dead_circumflex> <E>   : "Ể"   U1EC2 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <asciicircum> <E>       : "Ể"   U1EC2 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_hook> <ecircumflex>              : "ể"   U1EC3 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <ecircumflex>   : "ể"   U1EC3 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_hook> <dead_circumflex> <e>      : "ể"   U1EC3 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_hook> <Multi_key> <asciicircum> <e>      : "ể"   U1EC3 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <dead_circumflex> <e>   : "ể"   U1EC3 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <asciicircum> <e>       : "ể"   U1EC3 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_tilde> <Ecircumflex>             : "Ễ"   U1EC4 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <Ecircumflex>         : "Ễ"   U1EC4 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+<dead_tilde> <dead_circumflex> <E>     : "Ễ"   U1EC4 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+<dead_tilde> <Multi_key> <asciicircum> <E>     : "Ễ"   U1EC4 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <dead_circumflex> <E>         : "Ễ"   U1EC4 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <asciicircum> <E>     : "Ễ"   U1EC4 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+<dead_tilde> <ecircumflex>             : "ễ"   U1EC5 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <ecircumflex>         : "ễ"   U1EC5 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+<dead_tilde> <dead_circumflex> <e>     : "ễ"   U1EC5 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+<dead_tilde> <Multi_key> <asciicircum> <e>     : "ễ"   U1EC5 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <dead_circumflex> <e>         : "ễ"   U1EC5 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <asciicircum> <e>     : "ễ"   U1EC5 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+<dead_circumflex> <U1EB8>      : "Ệ"   U1EC6 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <U1EB8>      : "Ệ"   U1EC6 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+<dead_circumflex> <dead_belowdot> <E>  : "Ệ"   U1EC6 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+<dead_circumflex> <Multi_key> <exclam> <E>     : "Ệ"   U1EC6 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <dead_belowdot> <E>  : "Ệ"   U1EC6 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <exclam> <E>         : "Ệ"   U1EC6 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+<dead_belowdot> <Ecircumflex>          : "Ệ"   U1EC6 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+<dead_circumflex> <U1EB9>      : "ệ"   U1EC7 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <U1EB9>      : "ệ"   U1EC7 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+<dead_circumflex> <dead_belowdot> <e>  : "ệ"   U1EC7 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+<dead_circumflex> <Multi_key> <exclam> <e>     : "ệ"   U1EC7 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <dead_belowdot> <e>  : "ệ"   U1EC7 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <exclam> <e>         : "ệ"   U1EC7 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+<dead_belowdot> <ecircumflex>          : "ệ"   U1EC7 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+<dead_hook> <I>                        : "Ỉ"   U1EC8 # LATIN CAPITAL LETTER I WITH HOOK ABOVE
+<Multi_key> <question> <I>             : "Ỉ"   U1EC8 # LATIN CAPITAL LETTER I WITH HOOK ABOVE
+<dead_hook> <i>                        : "ỉ"   U1EC9 # LATIN SMALL LETTER I WITH HOOK ABOVE
+<Multi_key> <question> <i>             : "ỉ"   U1EC9 # LATIN SMALL LETTER I WITH HOOK ABOVE
+<dead_belowdot> <I>                    : "Ị"   U1ECA # LATIN CAPITAL LETTER I WITH DOT BELOW
+<Multi_key> <exclam> <I>               : "Ị"   U1ECA # LATIN CAPITAL LETTER I WITH DOT BELOW
+<dead_belowdot> <i>                    : "ị"   U1ECB # LATIN SMALL LETTER I WITH DOT BELOW
+<Multi_key> <exclam> <i>               : "ị"   U1ECB # LATIN SMALL LETTER I WITH DOT BELOW
+<dead_belowdot> <O>                    : "Ọ"   U1ECC # LATIN CAPITAL LETTER O WITH DOT BELOW
+<Multi_key> <exclam> <O>               : "Ọ"   U1ECC # LATIN CAPITAL LETTER O WITH DOT BELOW
+<dead_belowdot> <o>                    : "ọ"   U1ECD # LATIN SMALL LETTER O WITH DOT BELOW
+<Multi_key> <exclam> <o>               : "ọ"   U1ECD # LATIN SMALL LETTER O WITH DOT BELOW
+<dead_hook> <O>                        : "Ỏ"   U1ECE # LATIN CAPITAL LETTER O WITH HOOK ABOVE
+<Multi_key> <question> <O>             : "Ỏ"   U1ECE # LATIN CAPITAL LETTER O WITH HOOK ABOVE
+<dead_hook> <o>                        : "ỏ"   U1ECF # LATIN SMALL LETTER O WITH HOOK ABOVE
+<Multi_key> <question> <o>             : "ỏ"   U1ECF # LATIN SMALL LETTER O WITH HOOK ABOVE
+<dead_acute> <Ocircumflex>             : "Ố"   U1ED0 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <Ocircumflex>      : "Ố"   U1ED0 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <Ocircumflex>         : "Ố"   U1ED0 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+<dead_acute> <dead_circumflex> <O>     : "Ố"   U1ED0 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+<dead_acute> <Multi_key> <asciicircum> <O>     : "Ố"   U1ED0 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <dead_circumflex> <O>      : "Ố"   U1ED0 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <asciicircum> <O>  : "Ố"   U1ED0 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <dead_circumflex> <O>         : "Ố"   U1ED0 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <asciicircum> <O>     : "Ố"   U1ED0 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+<dead_acute> <ocircumflex>             : "ố"   U1ED1 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <ocircumflex>      : "ố"   U1ED1 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <ocircumflex>         : "ố"   U1ED1 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+<dead_acute> <dead_circumflex> <o>     : "ố"   U1ED1 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+<dead_acute> <Multi_key> <asciicircum> <o>     : "ố"   U1ED1 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <dead_circumflex> <o>      : "ố"   U1ED1 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <asciicircum> <o>  : "ố"   U1ED1 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <dead_circumflex> <o>         : "ố"   U1ED1 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <asciicircum> <o>     : "ố"   U1ED1 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+<dead_grave> <Ocircumflex>             : "Ồ"   U1ED2 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <Ocircumflex>      : "Ồ"   U1ED2 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+<dead_grave> <dead_circumflex> <O>     : "Ồ"   U1ED2 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+<dead_grave> <Multi_key> <asciicircum> <O>     : "Ồ"   U1ED2 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <dead_circumflex> <O>      : "Ồ"   U1ED2 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <asciicircum> <O>  : "Ồ"   U1ED2 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+<dead_grave> <ocircumflex>             : "ồ"   U1ED3 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <ocircumflex>      : "ồ"   U1ED3 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+<dead_grave> <dead_circumflex> <o>     : "ồ"   U1ED3 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+<dead_grave> <Multi_key> <asciicircum> <o>     : "ồ"   U1ED3 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <dead_circumflex> <o>      : "ồ"   U1ED3 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <asciicircum> <o>  : "ồ"   U1ED3 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+<dead_hook> <Ocircumflex>              : "Ổ"   U1ED4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <Ocircumflex>   : "Ổ"   U1ED4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_hook> <dead_circumflex> <O>      : "Ổ"   U1ED4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_hook> <Multi_key> <asciicircum> <O>      : "Ổ"   U1ED4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <dead_circumflex> <O>   : "Ổ"   U1ED4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <asciicircum> <O>       : "Ổ"   U1ED4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_hook> <ocircumflex>              : "ổ"   U1ED5 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <ocircumflex>   : "ổ"   U1ED5 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_hook> <dead_circumflex> <o>      : "ổ"   U1ED5 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_hook> <Multi_key> <asciicircum> <o>      : "ổ"   U1ED5 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <dead_circumflex> <o>   : "ổ"   U1ED5 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <asciicircum> <o>       : "ổ"   U1ED5 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_tilde> <Ocircumflex>             : "Ỗ"   U1ED6 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <Ocircumflex>         : "Ỗ"   U1ED6 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+<dead_tilde> <dead_circumflex> <O>     : "Ỗ"   U1ED6 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+<dead_tilde> <Multi_key> <asciicircum> <O>     : "Ỗ"   U1ED6 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <dead_circumflex> <O>         : "Ỗ"   U1ED6 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <asciicircum> <O>     : "Ỗ"   U1ED6 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+<dead_tilde> <ocircumflex>             : "ỗ"   U1ED7 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <ocircumflex>         : "ỗ"   U1ED7 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+<dead_tilde> <dead_circumflex> <o>     : "ỗ"   U1ED7 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+<dead_tilde> <Multi_key> <asciicircum> <o>     : "ỗ"   U1ED7 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <dead_circumflex> <o>         : "ỗ"   U1ED7 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <asciicircum> <o>     : "ỗ"   U1ED7 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+<dead_circumflex> <U1ECC>      : "Ộ"   U1ED8 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <U1ECC>      : "Ộ"   U1ED8 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+<dead_circumflex> <dead_belowdot> <O>  : "Ộ"   U1ED8 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+<dead_circumflex> <Multi_key> <exclam> <O>     : "Ộ"   U1ED8 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <dead_belowdot> <O>  : "Ộ"   U1ED8 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <exclam> <O>         : "Ộ"   U1ED8 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+<dead_belowdot> <Ocircumflex>          : "Ộ"   U1ED8 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+<dead_circumflex> <U1ECD>      : "ộ"   U1ED9 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <U1ECD>      : "ộ"   U1ED9 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+<dead_circumflex> <dead_belowdot> <o>  : "ộ"   U1ED9 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+<dead_circumflex> <Multi_key> <exclam> <o>     : "ộ"   U1ED9 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <dead_belowdot> <o>  : "ộ"   U1ED9 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <exclam> <o>         : "ộ"   U1ED9 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+<dead_belowdot> <ocircumflex>          : "ộ"   U1ED9 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+<dead_acute> <Ohorn>                   : "Ớ"   U1EDA # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+<dead_acute> <U01A0>           : "Ớ"   U1EDA # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+<Multi_key> <acute> <Ohorn>            : "Ớ"   U1EDA # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+<Multi_key> <apostrophe> <Ohorn>       : "Ớ"   U1EDA # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+<dead_acute> <dead_horn> <O>           : "Ớ"   U1EDA # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+<dead_acute> <Multi_key> <plus> <O>    : "Ớ"   U1EDA # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+<Multi_key> <acute> <dead_horn> <O>    : "Ớ"   U1EDA # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+<Multi_key> <acute> <plus> <O>         : "Ớ"   U1EDA # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+<Multi_key> <apostrophe> <dead_horn> <O>       : "Ớ"   U1EDA # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+<Multi_key> <apostrophe> <plus> <O>    : "Ớ"   U1EDA # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+<dead_acute> <ohorn>                   : "ớ"   U1EDB # LATIN SMALL LETTER O WITH HORN AND ACUTE
+<dead_acute> <U01A1>           : "ớ"   U1EDB # LATIN SMALL LETTER O WITH HORN AND ACUTE
+<Multi_key> <acute> <ohorn>            : "ớ"   U1EDB # LATIN SMALL LETTER O WITH HORN AND ACUTE
+<Multi_key> <apostrophe> <ohorn>       : "ớ"   U1EDB # LATIN SMALL LETTER O WITH HORN AND ACUTE
+<dead_acute> <dead_horn> <o>           : "ớ"   U1EDB # LATIN SMALL LETTER O WITH HORN AND ACUTE
+<dead_acute> <Multi_key> <plus> <o>    : "ớ"   U1EDB # LATIN SMALL LETTER O WITH HORN AND ACUTE
+<Multi_key> <acute> <dead_horn> <o>    : "ớ"   U1EDB # LATIN SMALL LETTER O WITH HORN AND ACUTE
+<Multi_key> <acute> <plus> <o>         : "ớ"   U1EDB # LATIN SMALL LETTER O WITH HORN AND ACUTE
+<Multi_key> <apostrophe> <dead_horn> <o>       : "ớ"   U1EDB # LATIN SMALL LETTER O WITH HORN AND ACUTE
+<Multi_key> <apostrophe> <plus> <o>    : "ớ"   U1EDB # LATIN SMALL LETTER O WITH HORN AND ACUTE
+<dead_grave> <Ohorn>                   : "Ờ"   U1EDC # LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+<dead_grave> <U01A0>           : "Ờ"   U1EDC # LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+<Multi_key> <grave> <Ohorn>            : "Ờ"   U1EDC # LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+<dead_grave> <dead_horn> <O>           : "Ờ"   U1EDC # LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+<dead_grave> <Multi_key> <plus> <O>    : "Ờ"   U1EDC # LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+<Multi_key> <grave> <dead_horn> <O>    : "Ờ"   U1EDC # LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+<Multi_key> <grave> <plus> <O>         : "Ờ"   U1EDC # LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+<dead_grave> <ohorn>                   : "ờ"   U1EDD # LATIN SMALL LETTER O WITH HORN AND GRAVE
+<dead_grave> <U01A1>           : "ờ"   U1EDD # LATIN SMALL LETTER O WITH HORN AND GRAVE
+<Multi_key> <grave> <ohorn>            : "ờ"   U1EDD # LATIN SMALL LETTER O WITH HORN AND GRAVE
+<dead_grave> <dead_horn> <o>           : "ờ"   U1EDD # LATIN SMALL LETTER O WITH HORN AND GRAVE
+<dead_grave> <Multi_key> <plus> <o>    : "ờ"   U1EDD # LATIN SMALL LETTER O WITH HORN AND GRAVE
+<Multi_key> <grave> <dead_horn> <o>    : "ờ"   U1EDD # LATIN SMALL LETTER O WITH HORN AND GRAVE
+<Multi_key> <grave> <plus> <o>         : "ờ"   U1EDD # LATIN SMALL LETTER O WITH HORN AND GRAVE
+<dead_hook> <Ohorn>                    : "Ở"   U1EDE # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+<dead_hook> <U01A0>            : "Ở"   U1EDE # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+<Multi_key> <question> <Ohorn>         : "Ở"   U1EDE # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+<dead_hook> <dead_horn> <O>            : "Ở"   U1EDE # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+<dead_hook> <Multi_key> <plus> <O>     : "Ở"   U1EDE # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+<Multi_key> <question> <dead_horn> <O>         : "Ở"   U1EDE # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+<Multi_key> <question> <plus> <O>      : "Ở"   U1EDE # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+<dead_hook> <ohorn>                    : "ở"   U1EDF # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+<dead_hook> <U01A1>            : "ở"   U1EDF # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+<Multi_key> <question> <ohorn>         : "ở"   U1EDF # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+<dead_hook> <dead_horn> <o>            : "ở"   U1EDF # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+<dead_hook> <Multi_key> <plus> <o>     : "ở"   U1EDF # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+<Multi_key> <question> <dead_horn> <o>         : "ở"   U1EDF # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+<Multi_key> <question> <plus> <o>      : "ở"   U1EDF # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+<dead_tilde> <Ohorn>                   : "Ỡ"   U1EE0 # LATIN CAPITAL LETTER O WITH HORN AND TILDE
+<dead_tilde> <U01A0>           : "Ỡ"   U1EE0 # LATIN CAPITAL LETTER O WITH HORN AND TILDE
+<Multi_key> <asciitilde> <Ohorn>       : "Ỡ"   U1EE0 # LATIN CAPITAL LETTER O WITH HORN AND TILDE
+<dead_tilde> <dead_horn> <O>           : "Ỡ"   U1EE0 # LATIN CAPITAL LETTER O WITH HORN AND TILDE
+<dead_tilde> <Multi_key> <plus> <O>    : "Ỡ"   U1EE0 # LATIN CAPITAL LETTER O WITH HORN AND TILDE
+<Multi_key> <asciitilde> <dead_horn> <O>       : "Ỡ"   U1EE0 # LATIN CAPITAL LETTER O WITH HORN AND TILDE
+<Multi_key> <asciitilde> <plus> <O>    : "Ỡ"   U1EE0 # LATIN CAPITAL LETTER O WITH HORN AND TILDE
+<dead_tilde> <ohorn>                   : "ỡ"   U1EE1 # LATIN SMALL LETTER O WITH HORN AND TILDE
+<dead_tilde> <U01A1>           : "ỡ"   U1EE1 # LATIN SMALL LETTER O WITH HORN AND TILDE
+<Multi_key> <asciitilde> <ohorn>       : "ỡ"   U1EE1 # LATIN SMALL LETTER O WITH HORN AND TILDE
+<dead_tilde> <dead_horn> <o>           : "ỡ"   U1EE1 # LATIN SMALL LETTER O WITH HORN AND TILDE
+<dead_tilde> <Multi_key> <plus> <o>    : "ỡ"   U1EE1 # LATIN SMALL LETTER O WITH HORN AND TILDE
+<Multi_key> <asciitilde> <dead_horn> <o>       : "ỡ"   U1EE1 # LATIN SMALL LETTER O WITH HORN AND TILDE
+<Multi_key> <asciitilde> <plus> <o>    : "ỡ"   U1EE1 # LATIN SMALL LETTER O WITH HORN AND TILDE
+<dead_belowdot> <Ohorn>                : "Ợ"   U1EE2 # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+<dead_belowdot> <U01A0>        : "Ợ"   U1EE2 # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+<Multi_key> <exclam> <Ohorn>           : "Ợ"   U1EE2 # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+<dead_belowdot> <dead_horn> <O>        : "Ợ"   U1EE2 # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+<dead_belowdot> <Multi_key> <plus> <O>         : "Ợ"   U1EE2 # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+<Multi_key> <exclam> <dead_horn> <O>   : "Ợ"   U1EE2 # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+<Multi_key> <exclam> <plus> <O>        : "Ợ"   U1EE2 # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+<dead_belowdot> <ohorn>                : "ợ"   U1EE3 # LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+<dead_belowdot> <U01A1>        : "ợ"   U1EE3 # LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+<Multi_key> <exclam> <ohorn>           : "ợ"   U1EE3 # LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+<dead_belowdot> <dead_horn> <o>        : "ợ"   U1EE3 # LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+<dead_belowdot> <Multi_key> <plus> <o>         : "ợ"   U1EE3 # LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+<Multi_key> <exclam> <dead_horn> <o>   : "ợ"   U1EE3 # LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+<Multi_key> <exclam> <plus> <o>        : "ợ"   U1EE3 # LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+<dead_belowdot> <U>                    : "Ụ"   U1EE4 # LATIN CAPITAL LETTER U WITH DOT BELOW
+<Multi_key> <exclam> <U>               : "Ụ"   U1EE4 # LATIN CAPITAL LETTER U WITH DOT BELOW
+<dead_belowdot> <u>                    : "ụ"   U1EE5 # LATIN SMALL LETTER U WITH DOT BELOW
+<Multi_key> <exclam> <u>               : "ụ"   U1EE5 # LATIN SMALL LETTER U WITH DOT BELOW
+<dead_hook> <U>                        : "Ủ"   U1EE6 # LATIN CAPITAL LETTER U WITH HOOK ABOVE
+<Multi_key> <question> <U>             : "Ủ"   U1EE6 # LATIN CAPITAL LETTER U WITH HOOK ABOVE
+<dead_hook> <u>                        : "ủ"   U1EE7 # LATIN SMALL LETTER U WITH HOOK ABOVE
+<Multi_key> <question> <u>             : "ủ"   U1EE7 # LATIN SMALL LETTER U WITH HOOK ABOVE
+<dead_acute> <Uhorn>                   : "Ứ"   U1EE8 # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+<dead_acute> <U01AF>           : "Ứ"   U1EE8 # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+<Multi_key> <acute> <Uhorn>            : "Ứ"   U1EE8 # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+<Multi_key> <apostrophe> <Uhorn>       : "Ứ"   U1EE8 # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+<dead_acute> <dead_horn> <U>           : "Ứ"   U1EE8 # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+<dead_acute> <Multi_key> <plus> <U>    : "Ứ"   U1EE8 # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+<Multi_key> <acute> <dead_horn> <U>    : "Ứ"   U1EE8 # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+<Multi_key> <acute> <plus> <U>         : "Ứ"   U1EE8 # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+<Multi_key> <apostrophe> <dead_horn> <U>       : "Ứ"   U1EE8 # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+<Multi_key> <apostrophe> <plus> <U>    : "Ứ"   U1EE8 # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+<dead_acute> <uhorn>                   : "ứ"   U1EE9 # LATIN SMALL LETTER U WITH HORN AND ACUTE
+<dead_acute> <U01B0>           : "ứ"   U1EE9 # LATIN SMALL LETTER U WITH HORN AND ACUTE
+<Multi_key> <acute> <uhorn>            : "ứ"   U1EE9 # LATIN SMALL LETTER U WITH HORN AND ACUTE
+<Multi_key> <apostrophe> <uhorn>       : "ứ"   U1EE9 # LATIN SMALL LETTER U WITH HORN AND ACUTE
+<dead_acute> <dead_horn> <u>           : "ứ"   U1EE9 # LATIN SMALL LETTER U WITH HORN AND ACUTE
+<dead_acute> <Multi_key> <plus> <u>    : "ứ"   U1EE9 # LATIN SMALL LETTER U WITH HORN AND ACUTE
+<Multi_key> <acute> <dead_horn> <u>    : "ứ"   U1EE9 # LATIN SMALL LETTER U WITH HORN AND ACUTE
+<Multi_key> <acute> <plus> <u>         : "ứ"   U1EE9 # LATIN SMALL LETTER U WITH HORN AND ACUTE
+<Multi_key> <apostrophe> <dead_horn> <u>       : "ứ"   U1EE9 # LATIN SMALL LETTER U WITH HORN AND ACUTE
+<Multi_key> <apostrophe> <plus> <u>    : "ứ"   U1EE9 # LATIN SMALL LETTER U WITH HORN AND ACUTE
+<dead_grave> <Uhorn>                   : "Ừ"   U1EEA # LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+<dead_grave> <U01AF>           : "Ừ"   U1EEA # LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+<Multi_key> <grave> <Uhorn>            : "Ừ"   U1EEA # LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+<dead_grave> <dead_horn> <U>           : "Ừ"   U1EEA # LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+<dead_grave> <Multi_key> <plus> <U>    : "Ừ"   U1EEA # LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+<Multi_key> <grave> <dead_horn> <U>    : "Ừ"   U1EEA # LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+<Multi_key> <grave> <plus> <U>         : "Ừ"   U1EEA # LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+<dead_grave> <uhorn>                   : "ừ"   U1EEB # LATIN SMALL LETTER U WITH HORN AND GRAVE
+<dead_grave> <U01B0>           : "ừ"   U1EEB # LATIN SMALL LETTER U WITH HORN AND GRAVE
+<Multi_key> <grave> <uhorn>            : "ừ"   U1EEB # LATIN SMALL LETTER U WITH HORN AND GRAVE
+<dead_grave> <dead_horn> <u>           : "ừ"   U1EEB # LATIN SMALL LETTER U WITH HORN AND GRAVE
+<dead_grave> <Multi_key> <plus> <u>    : "ừ"   U1EEB # LATIN SMALL LETTER U WITH HORN AND GRAVE
+<Multi_key> <grave> <dead_horn> <u>    : "ừ"   U1EEB # LATIN SMALL LETTER U WITH HORN AND GRAVE
+<Multi_key> <grave> <plus> <u>         : "ừ"   U1EEB # LATIN SMALL LETTER U WITH HORN AND GRAVE
+<dead_hook> <Uhorn>                    : "Ử"   U1EEC # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+<dead_hook> <U01AF>            : "Ử"   U1EEC # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+<Multi_key> <question> <Uhorn>         : "Ử"   U1EEC # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+<dead_hook> <dead_horn> <U>            : "Ử"   U1EEC # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+<dead_hook> <Multi_key> <plus> <U>     : "Ử"   U1EEC # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+<Multi_key> <question> <dead_horn> <U>         : "Ử"   U1EEC # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+<Multi_key> <question> <plus> <U>      : "Ử"   U1EEC # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+<dead_hook> <uhorn>                    : "ử"   U1EED # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+<dead_hook> <U01B0>            : "ử"   U1EED # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+<Multi_key> <question> <uhorn>         : "ử"   U1EED # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+<dead_hook> <dead_horn> <u>            : "ử"   U1EED # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+<dead_hook> <Multi_key> <plus> <u>     : "ử"   U1EED # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+<Multi_key> <question> <dead_horn> <u>         : "ử"   U1EED # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+<Multi_key> <question> <plus> <u>      : "ử"   U1EED # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+<dead_tilde> <Uhorn>                   : "Ữ"   U1EEE # LATIN CAPITAL LETTER U WITH HORN AND TILDE
+<dead_tilde> <U01AF>           : "Ữ"   U1EEE # LATIN CAPITAL LETTER U WITH HORN AND TILDE
+<Multi_key> <asciitilde> <Uhorn>       : "Ữ"   U1EEE # LATIN CAPITAL LETTER U WITH HORN AND TILDE
+<dead_tilde> <dead_horn> <U>           : "Ữ"   U1EEE # LATIN CAPITAL LETTER U WITH HORN AND TILDE
+<dead_tilde> <Multi_key> <plus> <U>    : "Ữ"   U1EEE # LATIN CAPITAL LETTER U WITH HORN AND TILDE
+<Multi_key> <asciitilde> <dead_horn> <U>       : "Ữ"   U1EEE # LATIN CAPITAL LETTER U WITH HORN AND TILDE
+<Multi_key> <asciitilde> <plus> <U>    : "Ữ"   U1EEE # LATIN CAPITAL LETTER U WITH HORN AND TILDE
+<dead_tilde> <uhorn>                   : "ữ"   U1EEF # LATIN SMALL LETTER U WITH HORN AND TILDE
+<dead_tilde> <U01B0>           : "ữ"   U1EEF # LATIN SMALL LETTER U WITH HORN AND TILDE
+<Multi_key> <asciitilde> <uhorn>       : "ữ"   U1EEF # LATIN SMALL LETTER U WITH HORN AND TILDE
+<dead_tilde> <dead_horn> <u>           : "ữ"   U1EEF # LATIN SMALL LETTER U WITH HORN AND TILDE
+<dead_tilde> <Multi_key> <plus> <u>    : "ữ"   U1EEF # LATIN SMALL LETTER U WITH HORN AND TILDE
+<Multi_key> <asciitilde> <dead_horn> <u>       : "ữ"   U1EEF # LATIN SMALL LETTER U WITH HORN AND TILDE
+<Multi_key> <asciitilde> <plus> <u>    : "ữ"   U1EEF # LATIN SMALL LETTER U WITH HORN AND TILDE
+<dead_belowdot> <Uhorn>                : "Ự"   U1EF0 # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+<dead_belowdot> <U01AF>        : "Ự"   U1EF0 # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+<Multi_key> <exclam> <Uhorn>           : "Ự"   U1EF0 # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+<dead_belowdot> <dead_horn> <U>        : "Ự"   U1EF0 # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+<dead_belowdot> <Multi_key> <plus> <U>         : "Ự"   U1EF0 # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+<Multi_key> <exclam> <dead_horn> <U>   : "Ự"   U1EF0 # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+<Multi_key> <exclam> <plus> <U>        : "Ự"   U1EF0 # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+<dead_belowdot> <uhorn>                : "ự"   U1EF1 # LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+<dead_belowdot> <U01B0>        : "ự"   U1EF1 # LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+<Multi_key> <exclam> <uhorn>           : "ự"   U1EF1 # LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+<dead_belowdot> <dead_horn> <u>        : "ự"   U1EF1 # LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+<dead_belowdot> <Multi_key> <plus> <u>         : "ự"   U1EF1 # LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+<Multi_key> <exclam> <dead_horn> <u>   : "ự"   U1EF1 # LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+<Multi_key> <exclam> <plus> <u>        : "ự"   U1EF1 # LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+<dead_grave> <Y>                       : "Ỳ"   U1EF2 # LATIN CAPITAL LETTER Y WITH GRAVE
+<Multi_key> <grave> <Y>                : "Ỳ"   U1EF2 # LATIN CAPITAL LETTER Y WITH GRAVE
+<dead_grave> <y>                       : "ỳ"   U1EF3 # LATIN SMALL LETTER Y WITH GRAVE
+<Multi_key> <grave> <y>                : "ỳ"   U1EF3 # LATIN SMALL LETTER Y WITH GRAVE
+<dead_belowdot> <Y>                    : "Ỵ"   U1EF4 # LATIN CAPITAL LETTER Y WITH DOT BELOW
+<Multi_key> <exclam> <Y>               : "Ỵ"   U1EF4 # LATIN CAPITAL LETTER Y WITH DOT BELOW
+<dead_belowdot> <y>                    : "ỵ"   U1EF5 # LATIN SMALL LETTER Y WITH DOT BELOW
+<Multi_key> <exclam> <y>               : "ỵ"   U1EF5 # LATIN SMALL LETTER Y WITH DOT BELOW
+<dead_hook> <Y>                        : "Ỷ"   U1EF6 # LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+<Multi_key> <question> <Y>             : "Ỷ"   U1EF6 # LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+<dead_hook> <y>                        : "ỷ"   U1EF7 # LATIN SMALL LETTER Y WITH HOOK ABOVE
+<Multi_key> <question> <y>             : "ỷ"   U1EF7 # LATIN SMALL LETTER Y WITH HOOK ABOVE
+<dead_tilde> <Y>                       : "Ỹ"   U1EF8 # LATIN CAPITAL LETTER Y WITH TILDE
+<Multi_key> <asciitilde> <Y>           : "Ỹ"   U1EF8 # LATIN CAPITAL LETTER Y WITH TILDE
+<dead_tilde> <y>                       : "ỹ"   U1EF9 # LATIN SMALL LETTER Y WITH TILDE
+<Multi_key> <asciitilde> <y>           : "ỹ"   U1EF9 # LATIN SMALL LETTER Y WITH TILDE
+<dead_psili> <Greek_alpha>             : "ἀ"   U1F00 # GREEK SMALL LETTER ALPHA WITH PSILI
+<Multi_key> <parenright> <Greek_alpha>         : "ἀ"   U1F00 # GREEK SMALL LETTER ALPHA WITH PSILI
+<dead_dasia> <Greek_alpha>             : "ἁ"   U1F01 # GREEK SMALL LETTER ALPHA WITH DASIA
+<Multi_key> <parenleft> <Greek_alpha>  : "ἁ"   U1F01 # GREEK SMALL LETTER ALPHA WITH DASIA
+<dead_grave> <U1F00>           : "ἂ"   U1F02 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
+<Multi_key> <grave> <U1F00>    : "ἂ"   U1F02 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
+<dead_grave> <dead_psili> <Greek_alpha>        : "ἂ"   U1F02 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
+<dead_grave> <Multi_key> <parenright> <Greek_alpha>    : "ἂ"   U1F02 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
+<Multi_key> <grave> <dead_psili> <Greek_alpha>         : "ἂ"   U1F02 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
+<Multi_key> <grave> <parenright> <Greek_alpha>         : "ἂ"   U1F02 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
+<dead_grave> <U1F01>           : "ἃ"   U1F03 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
+<Multi_key> <grave> <U1F01>    : "ἃ"   U1F03 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
+<dead_grave> <dead_dasia> <Greek_alpha>        : "ἃ"   U1F03 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
+<dead_grave> <Multi_key> <parenleft> <Greek_alpha>     : "ἃ"   U1F03 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
+<Multi_key> <grave> <dead_dasia> <Greek_alpha>         : "ἃ"   U1F03 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
+<Multi_key> <grave> <parenleft> <Greek_alpha>  : "ἃ"   U1F03 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
+<dead_acute> <U1F00>           : "ἄ"   U1F04 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+<Multi_key> <acute> <U1F00>    : "ἄ"   U1F04 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <U1F00>       : "ἄ"   U1F04 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+<dead_acute> <dead_psili> <Greek_alpha>        : "ἄ"   U1F04 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+<dead_acute> <Multi_key> <parenright> <Greek_alpha>    : "ἄ"   U1F04 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+<Multi_key> <acute> <dead_psili> <Greek_alpha>         : "ἄ"   U1F04 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+<Multi_key> <acute> <parenright> <Greek_alpha>         : "ἄ"   U1F04 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <dead_psili> <Greek_alpha>    : "ἄ"   U1F04 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <parenright> <Greek_alpha>    : "ἄ"   U1F04 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+<dead_acute> <U1F01>           : "ἅ"   U1F05 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+<Multi_key> <acute> <U1F01>    : "ἅ"   U1F05 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <U1F01>       : "ἅ"   U1F05 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+<dead_acute> <dead_dasia> <Greek_alpha>        : "ἅ"   U1F05 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+<dead_acute> <Multi_key> <parenleft> <Greek_alpha>     : "ἅ"   U1F05 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+<Multi_key> <acute> <dead_dasia> <Greek_alpha>         : "ἅ"   U1F05 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+<Multi_key> <acute> <parenleft> <Greek_alpha>  : "ἅ"   U1F05 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <dead_dasia> <Greek_alpha>    : "ἅ"   U1F05 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <parenleft> <Greek_alpha>     : "ἅ"   U1F05 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+<dead_tilde> <U1F00>           : "ἆ"   U1F06 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <U1F00>       : "ἆ"   U1F06 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
+<dead_tilde> <dead_psili> <Greek_alpha>        : "ἆ"   U1F06 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenright> <Greek_alpha>    : "ἆ"   U1F06 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <dead_psili> <Greek_alpha>    : "ἆ"   U1F06 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <parenright> <Greek_alpha>    : "ἆ"   U1F06 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
+<dead_tilde> <U1F01>           : "ἇ"   U1F07 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <U1F01>       : "ἇ"   U1F07 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+<dead_tilde> <dead_dasia> <Greek_alpha>        : "ἇ"   U1F07 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenleft> <Greek_alpha>     : "ἇ"   U1F07 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <dead_dasia> <Greek_alpha>    : "ἇ"   U1F07 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <parenleft> <Greek_alpha>     : "ἇ"   U1F07 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+<dead_psili> <Greek_ALPHA>             : "Ἀ"   U1F08 # GREEK CAPITAL LETTER ALPHA WITH PSILI
+<Multi_key> <parenright> <Greek_ALPHA>         : "Ἀ"   U1F08 # GREEK CAPITAL LETTER ALPHA WITH PSILI
+<dead_dasia> <Greek_ALPHA>             : "Ἁ"   U1F09 # GREEK CAPITAL LETTER ALPHA WITH DASIA
+<Multi_key> <parenleft> <Greek_ALPHA>  : "Ἁ"   U1F09 # GREEK CAPITAL LETTER ALPHA WITH DASIA
+<dead_grave> <U1F08>           : "Ἂ"   U1F0A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+<Multi_key> <grave> <U1F08>    : "Ἂ"   U1F0A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+<dead_grave> <dead_psili> <Greek_ALPHA>        : "Ἂ"   U1F0A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+<dead_grave> <Multi_key> <parenright> <Greek_ALPHA>    : "Ἂ"   U1F0A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+<Multi_key> <grave> <dead_psili> <Greek_ALPHA>         : "Ἂ"   U1F0A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+<Multi_key> <grave> <parenright> <Greek_ALPHA>         : "Ἂ"   U1F0A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+<dead_grave> <U1F09>           : "Ἃ"   U1F0B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+<Multi_key> <grave> <U1F09>    : "Ἃ"   U1F0B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+<dead_grave> <dead_dasia> <Greek_ALPHA>        : "Ἃ"   U1F0B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+<dead_grave> <Multi_key> <parenleft> <Greek_ALPHA>     : "Ἃ"   U1F0B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+<Multi_key> <grave> <dead_dasia> <Greek_ALPHA>         : "Ἃ"   U1F0B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+<Multi_key> <grave> <parenleft> <Greek_ALPHA>  : "Ἃ"   U1F0B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+<dead_acute> <U1F08>           : "Ἄ"   U1F0C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+<Multi_key> <acute> <U1F08>    : "Ἄ"   U1F0C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <U1F08>       : "Ἄ"   U1F0C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+<dead_acute> <dead_psili> <Greek_ALPHA>        : "Ἄ"   U1F0C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+<dead_acute> <Multi_key> <parenright> <Greek_ALPHA>    : "Ἄ"   U1F0C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+<Multi_key> <acute> <dead_psili> <Greek_ALPHA>         : "Ἄ"   U1F0C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+<Multi_key> <acute> <parenright> <Greek_ALPHA>         : "Ἄ"   U1F0C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <dead_psili> <Greek_ALPHA>    : "Ἄ"   U1F0C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <parenright> <Greek_ALPHA>    : "Ἄ"   U1F0C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+<dead_acute> <U1F09>           : "Ἅ"   U1F0D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+<Multi_key> <acute> <U1F09>    : "Ἅ"   U1F0D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <U1F09>       : "Ἅ"   U1F0D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+<dead_acute> <dead_dasia> <Greek_ALPHA>        : "Ἅ"   U1F0D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+<dead_acute> <Multi_key> <parenleft> <Greek_ALPHA>     : "Ἅ"   U1F0D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+<Multi_key> <acute> <dead_dasia> <Greek_ALPHA>         : "Ἅ"   U1F0D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+<Multi_key> <acute> <parenleft> <Greek_ALPHA>  : "Ἅ"   U1F0D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <dead_dasia> <Greek_ALPHA>    : "Ἅ"   U1F0D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <parenleft> <Greek_ALPHA>     : "Ἅ"   U1F0D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+<dead_tilde> <U1F08>           : "Ἆ"   U1F0E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <U1F08>       : "Ἆ"   U1F0E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+<dead_tilde> <dead_psili> <Greek_ALPHA>        : "Ἆ"   U1F0E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenright> <Greek_ALPHA>    : "Ἆ"   U1F0E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <dead_psili> <Greek_ALPHA>    : "Ἆ"   U1F0E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <parenright> <Greek_ALPHA>    : "Ἆ"   U1F0E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+<dead_tilde> <U1F09>           : "Ἇ"   U1F0F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <U1F09>       : "Ἇ"   U1F0F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+<dead_tilde> <dead_dasia> <Greek_ALPHA>        : "Ἇ"   U1F0F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenleft> <Greek_ALPHA>     : "Ἇ"   U1F0F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <dead_dasia> <Greek_ALPHA>    : "Ἇ"   U1F0F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <parenleft> <Greek_ALPHA>     : "Ἇ"   U1F0F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+<dead_psili> <Greek_epsilon>           : "ἐ"   U1F10 # GREEK SMALL LETTER EPSILON WITH PSILI
+<Multi_key> <parenright> <Greek_epsilon>       : "ἐ"   U1F10 # GREEK SMALL LETTER EPSILON WITH PSILI
+<dead_dasia> <Greek_epsilon>           : "ἑ"   U1F11 # GREEK SMALL LETTER EPSILON WITH DASIA
+<Multi_key> <parenleft> <Greek_epsilon>        : "ἑ"   U1F11 # GREEK SMALL LETTER EPSILON WITH DASIA
+<dead_grave> <U1F10>           : "ἒ"   U1F12 # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA
+<Multi_key> <grave> <U1F10>    : "ἒ"   U1F12 # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA
+<dead_grave> <dead_psili> <Greek_epsilon>      : "ἒ"   U1F12 # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA
+<dead_grave> <Multi_key> <parenright> <Greek_epsilon>  : "ἒ"   U1F12 # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA
+<Multi_key> <grave> <dead_psili> <Greek_epsilon>       : "ἒ"   U1F12 # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA
+<Multi_key> <grave> <parenright> <Greek_epsilon>       : "ἒ"   U1F12 # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA
+<dead_grave> <U1F11>           : "ἓ"   U1F13 # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA
+<Multi_key> <grave> <U1F11>    : "ἓ"   U1F13 # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA
+<dead_grave> <dead_dasia> <Greek_epsilon>      : "ἓ"   U1F13 # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA
+<dead_grave> <Multi_key> <parenleft> <Greek_epsilon>   : "ἓ"   U1F13 # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA
+<Multi_key> <grave> <dead_dasia> <Greek_epsilon>       : "ἓ"   U1F13 # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA
+<Multi_key> <grave> <parenleft> <Greek_epsilon>        : "ἓ"   U1F13 # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA
+<dead_acute> <U1F10>           : "ἔ"   U1F14 # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+<Multi_key> <acute> <U1F10>    : "ἔ"   U1F14 # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <U1F10>       : "ἔ"   U1F14 # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+<dead_acute> <dead_psili> <Greek_epsilon>      : "ἔ"   U1F14 # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+<dead_acute> <Multi_key> <parenright> <Greek_epsilon>  : "ἔ"   U1F14 # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+<Multi_key> <acute> <dead_psili> <Greek_epsilon>       : "ἔ"   U1F14 # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+<Multi_key> <acute> <parenright> <Greek_epsilon>       : "ἔ"   U1F14 # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <dead_psili> <Greek_epsilon>  : "ἔ"   U1F14 # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <parenright> <Greek_epsilon>  : "ἔ"   U1F14 # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+<dead_acute> <U1F11>           : "ἕ"   U1F15 # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+<Multi_key> <acute> <U1F11>    : "ἕ"   U1F15 # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <U1F11>       : "ἕ"   U1F15 # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+<dead_acute> <dead_dasia> <Greek_epsilon>      : "ἕ"   U1F15 # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+<dead_acute> <Multi_key> <parenleft> <Greek_epsilon>   : "ἕ"   U1F15 # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+<Multi_key> <acute> <dead_dasia> <Greek_epsilon>       : "ἕ"   U1F15 # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+<Multi_key> <acute> <parenleft> <Greek_epsilon>        : "ἕ"   U1F15 # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <dead_dasia> <Greek_epsilon>  : "ἕ"   U1F15 # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <parenleft> <Greek_epsilon>   : "ἕ"   U1F15 # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+<dead_psili> <Greek_EPSILON>           : "Ἐ"   U1F18 # GREEK CAPITAL LETTER EPSILON WITH PSILI
+<Multi_key> <parenright> <Greek_EPSILON>       : "Ἐ"   U1F18 # GREEK CAPITAL LETTER EPSILON WITH PSILI
+<dead_dasia> <Greek_EPSILON>           : "Ἑ"   U1F19 # GREEK CAPITAL LETTER EPSILON WITH DASIA
+<Multi_key> <parenleft> <Greek_EPSILON>        : "Ἑ"   U1F19 # GREEK CAPITAL LETTER EPSILON WITH DASIA
+<dead_grave> <U1F18>           : "Ἒ"   U1F1A # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+<Multi_key> <grave> <U1F18>    : "Ἒ"   U1F1A # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+<dead_grave> <dead_psili> <Greek_EPSILON>      : "Ἒ"   U1F1A # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+<dead_grave> <Multi_key> <parenright> <Greek_EPSILON>  : "Ἒ"   U1F1A # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+<Multi_key> <grave> <dead_psili> <Greek_EPSILON>       : "Ἒ"   U1F1A # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+<Multi_key> <grave> <parenright> <Greek_EPSILON>       : "Ἒ"   U1F1A # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+<dead_grave> <U1F19>           : "Ἓ"   U1F1B # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+<Multi_key> <grave> <U1F19>    : "Ἓ"   U1F1B # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+<dead_grave> <dead_dasia> <Greek_EPSILON>      : "Ἓ"   U1F1B # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+<dead_grave> <Multi_key> <parenleft> <Greek_EPSILON>   : "Ἓ"   U1F1B # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+<Multi_key> <grave> <dead_dasia> <Greek_EPSILON>       : "Ἓ"   U1F1B # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+<Multi_key> <grave> <parenleft> <Greek_EPSILON>        : "Ἓ"   U1F1B # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+<dead_acute> <U1F18>           : "Ἔ"   U1F1C # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+<Multi_key> <acute> <U1F18>    : "Ἔ"   U1F1C # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <U1F18>       : "Ἔ"   U1F1C # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+<dead_acute> <dead_psili> <Greek_EPSILON>      : "Ἔ"   U1F1C # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+<dead_acute> <Multi_key> <parenright> <Greek_EPSILON>  : "Ἔ"   U1F1C # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+<Multi_key> <acute> <dead_psili> <Greek_EPSILON>       : "Ἔ"   U1F1C # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+<Multi_key> <acute> <parenright> <Greek_EPSILON>       : "Ἔ"   U1F1C # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <dead_psili> <Greek_EPSILON>  : "Ἔ"   U1F1C # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <parenright> <Greek_EPSILON>  : "Ἔ"   U1F1C # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+<dead_acute> <U1F19>           : "Ἕ"   U1F1D # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+<Multi_key> <acute> <U1F19>    : "Ἕ"   U1F1D # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <U1F19>       : "Ἕ"   U1F1D # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+<dead_acute> <dead_dasia> <Greek_EPSILON>      : "Ἕ"   U1F1D # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+<dead_acute> <Multi_key> <parenleft> <Greek_EPSILON>   : "Ἕ"   U1F1D # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+<Multi_key> <acute> <dead_dasia> <Greek_EPSILON>       : "Ἕ"   U1F1D # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+<Multi_key> <acute> <parenleft> <Greek_EPSILON>        : "Ἕ"   U1F1D # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <dead_dasia> <Greek_EPSILON>  : "Ἕ"   U1F1D # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <parenleft> <Greek_EPSILON>   : "Ἕ"   U1F1D # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+<dead_psili> <Greek_eta>               : "ἠ"   U1F20 # GREEK SMALL LETTER ETA WITH PSILI
+<Multi_key> <parenright> <Greek_eta>   : "ἠ"   U1F20 # GREEK SMALL LETTER ETA WITH PSILI
+<dead_dasia> <Greek_eta>               : "ἡ"   U1F21 # GREEK SMALL LETTER ETA WITH DASIA
+<Multi_key> <parenleft> <Greek_eta>    : "ἡ"   U1F21 # GREEK SMALL LETTER ETA WITH DASIA
+<dead_grave> <U1F20>           : "ἢ"   U1F22 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA
+<Multi_key> <grave> <U1F20>    : "ἢ"   U1F22 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA
+<dead_grave> <dead_psili> <Greek_eta>  : "ἢ"   U1F22 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA
+<dead_grave> <Multi_key> <parenright> <Greek_eta>      : "ἢ"   U1F22 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA
+<Multi_key> <grave> <dead_psili> <Greek_eta>   : "ἢ"   U1F22 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA
+<Multi_key> <grave> <parenright> <Greek_eta>   : "ἢ"   U1F22 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA
+<dead_grave> <U1F21>           : "ἣ"   U1F23 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA
+<Multi_key> <grave> <U1F21>    : "ἣ"   U1F23 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA
+<dead_grave> <dead_dasia> <Greek_eta>  : "ἣ"   U1F23 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA
+<dead_grave> <Multi_key> <parenleft> <Greek_eta>       : "ἣ"   U1F23 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA
+<Multi_key> <grave> <dead_dasia> <Greek_eta>   : "ἣ"   U1F23 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA
+<Multi_key> <grave> <parenleft> <Greek_eta>    : "ἣ"   U1F23 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA
+<dead_acute> <U1F20>           : "ἤ"   U1F24 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+<Multi_key> <acute> <U1F20>    : "ἤ"   U1F24 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <U1F20>       : "ἤ"   U1F24 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+<dead_acute> <dead_psili> <Greek_eta>  : "ἤ"   U1F24 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+<dead_acute> <Multi_key> <parenright> <Greek_eta>      : "ἤ"   U1F24 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+<Multi_key> <acute> <dead_psili> <Greek_eta>   : "ἤ"   U1F24 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+<Multi_key> <acute> <parenright> <Greek_eta>   : "ἤ"   U1F24 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <dead_psili> <Greek_eta>      : "ἤ"   U1F24 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <parenright> <Greek_eta>      : "ἤ"   U1F24 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+<dead_acute> <U1F21>           : "ἥ"   U1F25 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+<Multi_key> <acute> <U1F21>    : "ἥ"   U1F25 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <U1F21>       : "ἥ"   U1F25 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+<dead_acute> <dead_dasia> <Greek_eta>  : "ἥ"   U1F25 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+<dead_acute> <Multi_key> <parenleft> <Greek_eta>       : "ἥ"   U1F25 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+<Multi_key> <acute> <dead_dasia> <Greek_eta>   : "ἥ"   U1F25 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+<Multi_key> <acute> <parenleft> <Greek_eta>    : "ἥ"   U1F25 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <dead_dasia> <Greek_eta>      : "ἥ"   U1F25 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <parenleft> <Greek_eta>       : "ἥ"   U1F25 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+<dead_tilde> <U1F20>           : "ἦ"   U1F26 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <U1F20>       : "ἦ"   U1F26 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI
+<dead_tilde> <dead_psili> <Greek_eta>  : "ἦ"   U1F26 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenright> <Greek_eta>      : "ἦ"   U1F26 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <dead_psili> <Greek_eta>      : "ἦ"   U1F26 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <parenright> <Greek_eta>      : "ἦ"   U1F26 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI
+<dead_tilde> <U1F21>           : "ἧ"   U1F27 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <U1F21>       : "ἧ"   U1F27 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+<dead_tilde> <dead_dasia> <Greek_eta>  : "ἧ"   U1F27 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenleft> <Greek_eta>       : "ἧ"   U1F27 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <dead_dasia> <Greek_eta>      : "ἧ"   U1F27 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <parenleft> <Greek_eta>       : "ἧ"   U1F27 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+<dead_psili> <Greek_ETA>               : "Ἠ"   U1F28 # GREEK CAPITAL LETTER ETA WITH PSILI
+<Multi_key> <parenright> <Greek_ETA>   : "Ἠ"   U1F28 # GREEK CAPITAL LETTER ETA WITH PSILI
+<dead_dasia> <Greek_ETA>               : "Ἡ"   U1F29 # GREEK CAPITAL LETTER ETA WITH DASIA
+<Multi_key> <parenleft> <Greek_ETA>    : "Ἡ"   U1F29 # GREEK CAPITAL LETTER ETA WITH DASIA
+<dead_grave> <U1F28>           : "Ἢ"   U1F2A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+<Multi_key> <grave> <U1F28>    : "Ἢ"   U1F2A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+<dead_grave> <dead_psili> <Greek_ETA>  : "Ἢ"   U1F2A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+<dead_grave> <Multi_key> <parenright> <Greek_ETA>      : "Ἢ"   U1F2A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+<Multi_key> <grave> <dead_psili> <Greek_ETA>   : "Ἢ"   U1F2A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+<Multi_key> <grave> <parenright> <Greek_ETA>   : "Ἢ"   U1F2A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+<dead_grave> <U1F29>           : "Ἣ"   U1F2B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+<Multi_key> <grave> <U1F29>    : "Ἣ"   U1F2B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+<dead_grave> <dead_dasia> <Greek_ETA>  : "Ἣ"   U1F2B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+<dead_grave> <Multi_key> <parenleft> <Greek_ETA>       : "Ἣ"   U1F2B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+<Multi_key> <grave> <dead_dasia> <Greek_ETA>   : "Ἣ"   U1F2B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+<Multi_key> <grave> <parenleft> <Greek_ETA>    : "Ἣ"   U1F2B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+<dead_acute> <U1F28>           : "Ἤ"   U1F2C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+<Multi_key> <acute> <U1F28>    : "Ἤ"   U1F2C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <U1F28>       : "Ἤ"   U1F2C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+<dead_acute> <dead_psili> <Greek_ETA>  : "Ἤ"   U1F2C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+<dead_acute> <Multi_key> <parenright> <Greek_ETA>      : "Ἤ"   U1F2C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+<Multi_key> <acute> <dead_psili> <Greek_ETA>   : "Ἤ"   U1F2C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+<Multi_key> <acute> <parenright> <Greek_ETA>   : "Ἤ"   U1F2C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <dead_psili> <Greek_ETA>      : "Ἤ"   U1F2C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <parenright> <Greek_ETA>      : "Ἤ"   U1F2C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+<dead_acute> <U1F29>           : "Ἥ"   U1F2D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+<Multi_key> <acute> <U1F29>    : "Ἥ"   U1F2D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <U1F29>       : "Ἥ"   U1F2D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+<dead_acute> <dead_dasia> <Greek_ETA>  : "Ἥ"   U1F2D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+<dead_acute> <Multi_key> <parenleft> <Greek_ETA>       : "Ἥ"   U1F2D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+<Multi_key> <acute> <dead_dasia> <Greek_ETA>   : "Ἥ"   U1F2D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+<Multi_key> <acute> <parenleft> <Greek_ETA>    : "Ἥ"   U1F2D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <dead_dasia> <Greek_ETA>      : "Ἥ"   U1F2D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <parenleft> <Greek_ETA>       : "Ἥ"   U1F2D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+<dead_tilde> <U1F28>           : "Ἦ"   U1F2E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <U1F28>       : "Ἦ"   U1F2E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+<dead_tilde> <dead_psili> <Greek_ETA>  : "Ἦ"   U1F2E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenright> <Greek_ETA>      : "Ἦ"   U1F2E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <dead_psili> <Greek_ETA>      : "Ἦ"   U1F2E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <parenright> <Greek_ETA>      : "Ἦ"   U1F2E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+<dead_tilde> <U1F29>           : "Ἧ"   U1F2F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <U1F29>       : "Ἧ"   U1F2F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+<dead_tilde> <dead_dasia> <Greek_ETA>  : "Ἧ"   U1F2F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenleft> <Greek_ETA>       : "Ἧ"   U1F2F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <dead_dasia> <Greek_ETA>      : "Ἧ"   U1F2F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <parenleft> <Greek_ETA>       : "Ἧ"   U1F2F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+<dead_psili> <Greek_iota>              : "ἰ"   U1F30 # GREEK SMALL LETTER IOTA WITH PSILI
+<Multi_key> <parenright> <Greek_iota>  : "ἰ"   U1F30 # GREEK SMALL LETTER IOTA WITH PSILI
+<dead_dasia> <Greek_iota>              : "ἱ"   U1F31 # GREEK SMALL LETTER IOTA WITH DASIA
+<Multi_key> <parenleft> <Greek_iota>   : "ἱ"   U1F31 # GREEK SMALL LETTER IOTA WITH DASIA
+<dead_grave> <U1F30>           : "ἲ"   U1F32 # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA
+<Multi_key> <grave> <U1F30>    : "ἲ"   U1F32 # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA
+<dead_grave> <dead_psili> <Greek_iota>         : "ἲ"   U1F32 # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA
+<dead_grave> <Multi_key> <parenright> <Greek_iota>     : "ἲ"   U1F32 # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA
+<Multi_key> <grave> <dead_psili> <Greek_iota>  : "ἲ"   U1F32 # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA
+<Multi_key> <grave> <parenright> <Greek_iota>  : "ἲ"   U1F32 # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA
+<dead_grave> <U1F31>           : "ἳ"   U1F33 # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA
+<Multi_key> <grave> <U1F31>    : "ἳ"   U1F33 # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA
+<dead_grave> <dead_dasia> <Greek_iota>         : "ἳ"   U1F33 # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA
+<dead_grave> <Multi_key> <parenleft> <Greek_iota>      : "ἳ"   U1F33 # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA
+<Multi_key> <grave> <dead_dasia> <Greek_iota>  : "ἳ"   U1F33 # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA
+<Multi_key> <grave> <parenleft> <Greek_iota>   : "ἳ"   U1F33 # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA
+<dead_acute> <U1F30>           : "ἴ"   U1F34 # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+<Multi_key> <acute> <U1F30>    : "ἴ"   U1F34 # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <U1F30>       : "ἴ"   U1F34 # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+<dead_acute> <dead_psili> <Greek_iota>         : "ἴ"   U1F34 # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+<dead_acute> <Multi_key> <parenright> <Greek_iota>     : "ἴ"   U1F34 # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+<Multi_key> <acute> <dead_psili> <Greek_iota>  : "ἴ"   U1F34 # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+<Multi_key> <acute> <parenright> <Greek_iota>  : "ἴ"   U1F34 # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <dead_psili> <Greek_iota>     : "ἴ"   U1F34 # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <parenright> <Greek_iota>     : "ἴ"   U1F34 # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+<dead_acute> <U1F31>           : "ἵ"   U1F35 # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+<Multi_key> <acute> <U1F31>    : "ἵ"   U1F35 # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <U1F31>       : "ἵ"   U1F35 # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+<dead_acute> <dead_dasia> <Greek_iota>         : "ἵ"   U1F35 # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+<dead_acute> <Multi_key> <parenleft> <Greek_iota>      : "ἵ"   U1F35 # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+<Multi_key> <acute> <dead_dasia> <Greek_iota>  : "ἵ"   U1F35 # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+<Multi_key> <acute> <parenleft> <Greek_iota>   : "ἵ"   U1F35 # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <dead_dasia> <Greek_iota>     : "ἵ"   U1F35 # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <parenleft> <Greek_iota>      : "ἵ"   U1F35 # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+<dead_tilde> <U1F30>           : "ἶ"   U1F36 # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <U1F30>       : "ἶ"   U1F36 # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI
+<dead_tilde> <dead_psili> <Greek_iota>         : "ἶ"   U1F36 # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenright> <Greek_iota>     : "ἶ"   U1F36 # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <dead_psili> <Greek_iota>     : "ἶ"   U1F36 # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <parenright> <Greek_iota>     : "ἶ"   U1F36 # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI
+<dead_tilde> <U1F31>           : "ἷ"   U1F37 # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <U1F31>       : "ἷ"   U1F37 # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+<dead_tilde> <dead_dasia> <Greek_iota>         : "ἷ"   U1F37 # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenleft> <Greek_iota>      : "ἷ"   U1F37 # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <dead_dasia> <Greek_iota>     : "ἷ"   U1F37 # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <parenleft> <Greek_iota>      : "ἷ"   U1F37 # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+<dead_psili> <Greek_IOTA>              : "Ἰ"   U1F38 # GREEK CAPITAL LETTER IOTA WITH PSILI
+<Multi_key> <parenright> <Greek_IOTA>  : "Ἰ"   U1F38 # GREEK CAPITAL LETTER IOTA WITH PSILI
+<dead_dasia> <Greek_IOTA>              : "Ἱ"   U1F39 # GREEK CAPITAL LETTER IOTA WITH DASIA
+<Multi_key> <parenleft> <Greek_IOTA>   : "Ἱ"   U1F39 # GREEK CAPITAL LETTER IOTA WITH DASIA
+<dead_grave> <U1F38>           : "Ἲ"   U1F3A # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+<Multi_key> <grave> <U1F38>    : "Ἲ"   U1F3A # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+<dead_grave> <dead_psili> <Greek_IOTA>         : "Ἲ"   U1F3A # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+<dead_grave> <Multi_key> <parenright> <Greek_IOTA>     : "Ἲ"   U1F3A # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+<Multi_key> <grave> <dead_psili> <Greek_IOTA>  : "Ἲ"   U1F3A # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+<Multi_key> <grave> <parenright> <Greek_IOTA>  : "Ἲ"   U1F3A # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+<dead_grave> <U1F39>           : "Ἳ"   U1F3B # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+<Multi_key> <grave> <U1F39>    : "Ἳ"   U1F3B # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+<dead_grave> <dead_dasia> <Greek_IOTA>         : "Ἳ"   U1F3B # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+<dead_grave> <Multi_key> <parenleft> <Greek_IOTA>      : "Ἳ"   U1F3B # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+<Multi_key> <grave> <dead_dasia> <Greek_IOTA>  : "Ἳ"   U1F3B # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+<Multi_key> <grave> <parenleft> <Greek_IOTA>   : "Ἳ"   U1F3B # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+<dead_acute> <U1F38>           : "Ἴ"   U1F3C # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+<Multi_key> <acute> <U1F38>    : "Ἴ"   U1F3C # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <U1F38>       : "Ἴ"   U1F3C # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+<dead_acute> <dead_psili> <Greek_IOTA>         : "Ἴ"   U1F3C # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+<dead_acute> <Multi_key> <parenright> <Greek_IOTA>     : "Ἴ"   U1F3C # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+<Multi_key> <acute> <dead_psili> <Greek_IOTA>  : "Ἴ"   U1F3C # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+<Multi_key> <acute> <parenright> <Greek_IOTA>  : "Ἴ"   U1F3C # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <dead_psili> <Greek_IOTA>     : "Ἴ"   U1F3C # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <parenright> <Greek_IOTA>     : "Ἴ"   U1F3C # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+<dead_acute> <U1F39>           : "Ἵ"   U1F3D # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+<Multi_key> <acute> <U1F39>    : "Ἵ"   U1F3D # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <U1F39>       : "Ἵ"   U1F3D # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+<dead_acute> <dead_dasia> <Greek_IOTA>         : "Ἵ"   U1F3D # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+<dead_acute> <Multi_key> <parenleft> <Greek_IOTA>      : "Ἵ"   U1F3D # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+<Multi_key> <acute> <dead_dasia> <Greek_IOTA>  : "Ἵ"   U1F3D # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+<Multi_key> <acute> <parenleft> <Greek_IOTA>   : "Ἵ"   U1F3D # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <dead_dasia> <Greek_IOTA>     : "Ἵ"   U1F3D # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <parenleft> <Greek_IOTA>      : "Ἵ"   U1F3D # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+<dead_tilde> <U1F38>           : "Ἶ"   U1F3E # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <U1F38>       : "Ἶ"   U1F3E # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+<dead_tilde> <dead_psili> <Greek_IOTA>         : "Ἶ"   U1F3E # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenright> <Greek_IOTA>     : "Ἶ"   U1F3E # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <dead_psili> <Greek_IOTA>     : "Ἶ"   U1F3E # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <parenright> <Greek_IOTA>     : "Ἶ"   U1F3E # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+<dead_tilde> <U1F39>           : "Ἷ"   U1F3F # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <U1F39>       : "Ἷ"   U1F3F # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+<dead_tilde> <dead_dasia> <Greek_IOTA>         : "Ἷ"   U1F3F # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenleft> <Greek_IOTA>      : "Ἷ"   U1F3F # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <dead_dasia> <Greek_IOTA>     : "Ἷ"   U1F3F # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <parenleft> <Greek_IOTA>      : "Ἷ"   U1F3F # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+<dead_psili> <Greek_omicron>           : "ὀ"   U1F40 # GREEK SMALL LETTER OMICRON WITH PSILI
+<Multi_key> <parenright> <Greek_omicron>       : "ὀ"   U1F40 # GREEK SMALL LETTER OMICRON WITH PSILI
+<dead_dasia> <Greek_omicron>           : "ὁ"   U1F41 # GREEK SMALL LETTER OMICRON WITH DASIA
+<Multi_key> <parenleft> <Greek_omicron>        : "ὁ"   U1F41 # GREEK SMALL LETTER OMICRON WITH DASIA
+<dead_grave> <U1F40>           : "ὂ"   U1F42 # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA
+<Multi_key> <grave> <U1F40>    : "ὂ"   U1F42 # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA
+<dead_grave> <dead_psili> <Greek_omicron>      : "ὂ"   U1F42 # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA
+<dead_grave> <Multi_key> <parenright> <Greek_omicron>  : "ὂ"   U1F42 # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA
+<Multi_key> <grave> <dead_psili> <Greek_omicron>       : "ὂ"   U1F42 # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA
+<Multi_key> <grave> <parenright> <Greek_omicron>       : "ὂ"   U1F42 # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA
+<dead_grave> <U1F41>           : "ὃ"   U1F43 # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA
+<Multi_key> <grave> <U1F41>    : "ὃ"   U1F43 # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA
+<dead_grave> <dead_dasia> <Greek_omicron>      : "ὃ"   U1F43 # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA
+<dead_grave> <Multi_key> <parenleft> <Greek_omicron>   : "ὃ"   U1F43 # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA
+<Multi_key> <grave> <dead_dasia> <Greek_omicron>       : "ὃ"   U1F43 # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA
+<Multi_key> <grave> <parenleft> <Greek_omicron>        : "ὃ"   U1F43 # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA
+<dead_acute> <U1F40>           : "ὄ"   U1F44 # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+<Multi_key> <acute> <U1F40>    : "ὄ"   U1F44 # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <U1F40>       : "ὄ"   U1F44 # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+<dead_acute> <dead_psili> <Greek_omicron>      : "ὄ"   U1F44 # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+<dead_acute> <Multi_key> <parenright> <Greek_omicron>  : "ὄ"   U1F44 # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+<Multi_key> <acute> <dead_psili> <Greek_omicron>       : "ὄ"   U1F44 # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+<Multi_key> <acute> <parenright> <Greek_omicron>       : "ὄ"   U1F44 # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <dead_psili> <Greek_omicron>  : "ὄ"   U1F44 # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <parenright> <Greek_omicron>  : "ὄ"   U1F44 # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+<dead_acute> <U1F41>           : "ὅ"   U1F45 # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+<Multi_key> <acute> <U1F41>    : "ὅ"   U1F45 # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <U1F41>       : "ὅ"   U1F45 # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+<dead_acute> <dead_dasia> <Greek_omicron>      : "ὅ"   U1F45 # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+<dead_acute> <Multi_key> <parenleft> <Greek_omicron>   : "ὅ"   U1F45 # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+<Multi_key> <acute> <dead_dasia> <Greek_omicron>       : "ὅ"   U1F45 # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+<Multi_key> <acute> <parenleft> <Greek_omicron>        : "ὅ"   U1F45 # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <dead_dasia> <Greek_omicron>  : "ὅ"   U1F45 # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <parenleft> <Greek_omicron>   : "ὅ"   U1F45 # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+<dead_psili> <Greek_OMICRON>           : "Ὀ"   U1F48 # GREEK CAPITAL LETTER OMICRON WITH PSILI
+<Multi_key> <parenright> <Greek_OMICRON>       : "Ὀ"   U1F48 # GREEK CAPITAL LETTER OMICRON WITH PSILI
+<dead_dasia> <Greek_OMICRON>           : "Ὁ"   U1F49 # GREEK CAPITAL LETTER OMICRON WITH DASIA
+<Multi_key> <parenleft> <Greek_OMICRON>        : "Ὁ"   U1F49 # GREEK CAPITAL LETTER OMICRON WITH DASIA
+<dead_grave> <U1F48>           : "Ὂ"   U1F4A # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+<Multi_key> <grave> <U1F48>    : "Ὂ"   U1F4A # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+<dead_grave> <dead_psili> <Greek_OMICRON>      : "Ὂ"   U1F4A # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+<dead_grave> <Multi_key> <parenright> <Greek_OMICRON>  : "Ὂ"   U1F4A # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+<Multi_key> <grave> <dead_psili> <Greek_OMICRON>       : "Ὂ"   U1F4A # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+<Multi_key> <grave> <parenright> <Greek_OMICRON>       : "Ὂ"   U1F4A # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+<dead_grave> <U1F49>           : "Ὃ"   U1F4B # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+<Multi_key> <grave> <U1F49>    : "Ὃ"   U1F4B # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+<dead_grave> <dead_dasia> <Greek_OMICRON>      : "Ὃ"   U1F4B # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+<dead_grave> <Multi_key> <parenleft> <Greek_OMICRON>   : "Ὃ"   U1F4B # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+<Multi_key> <grave> <dead_dasia> <Greek_OMICRON>       : "Ὃ"   U1F4B # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+<Multi_key> <grave> <parenleft> <Greek_OMICRON>        : "Ὃ"   U1F4B # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+<dead_acute> <U1F48>           : "Ὄ"   U1F4C # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+<Multi_key> <acute> <U1F48>    : "Ὄ"   U1F4C # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <U1F48>       : "Ὄ"   U1F4C # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+<dead_acute> <dead_psili> <Greek_OMICRON>      : "Ὄ"   U1F4C # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+<dead_acute> <Multi_key> <parenright> <Greek_OMICRON>  : "Ὄ"   U1F4C # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+<Multi_key> <acute> <dead_psili> <Greek_OMICRON>       : "Ὄ"   U1F4C # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+<Multi_key> <acute> <parenright> <Greek_OMICRON>       : "Ὄ"   U1F4C # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <dead_psili> <Greek_OMICRON>  : "Ὄ"   U1F4C # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <parenright> <Greek_OMICRON>  : "Ὄ"   U1F4C # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+<dead_acute> <U1F49>           : "Ὅ"   U1F4D # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+<Multi_key> <acute> <U1F49>    : "Ὅ"   U1F4D # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <U1F49>       : "Ὅ"   U1F4D # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+<dead_acute> <dead_dasia> <Greek_OMICRON>      : "Ὅ"   U1F4D # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+<dead_acute> <Multi_key> <parenleft> <Greek_OMICRON>   : "Ὅ"   U1F4D # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+<Multi_key> <acute> <dead_dasia> <Greek_OMICRON>       : "Ὅ"   U1F4D # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+<Multi_key> <acute> <parenleft> <Greek_OMICRON>        : "Ὅ"   U1F4D # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <dead_dasia> <Greek_OMICRON>  : "Ὅ"   U1F4D # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <parenleft> <Greek_OMICRON>   : "Ὅ"   U1F4D # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+<dead_psili> <Greek_upsilon>           : "ὐ"   U1F50 # GREEK SMALL LETTER UPSILON WITH PSILI
+<Multi_key> <parenright> <Greek_upsilon>       : "ὐ"   U1F50 # GREEK SMALL LETTER UPSILON WITH PSILI
+<dead_dasia> <Greek_upsilon>           : "ὑ"   U1F51 # GREEK SMALL LETTER UPSILON WITH DASIA
+<Multi_key> <parenleft> <Greek_upsilon>        : "ὑ"   U1F51 # GREEK SMALL LETTER UPSILON WITH DASIA
+<dead_grave> <U1F50>           : "ὒ"   U1F52 # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+<Multi_key> <grave> <U1F50>    : "ὒ"   U1F52 # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+<dead_grave> <dead_psili> <Greek_upsilon>      : "ὒ"   U1F52 # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+<dead_grave> <Multi_key> <parenright> <Greek_upsilon>  : "ὒ"   U1F52 # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+<Multi_key> <grave> <dead_psili> <Greek_upsilon>       : "ὒ"   U1F52 # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+<Multi_key> <grave> <parenright> <Greek_upsilon>       : "ὒ"   U1F52 # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+<dead_grave> <U1F51>           : "ὓ"   U1F53 # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA
+<Multi_key> <grave> <U1F51>    : "ὓ"   U1F53 # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA
+<dead_grave> <dead_dasia> <Greek_upsilon>      : "ὓ"   U1F53 # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA
+<dead_grave> <Multi_key> <parenleft> <Greek_upsilon>   : "ὓ"   U1F53 # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA
+<Multi_key> <grave> <dead_dasia> <Greek_upsilon>       : "ὓ"   U1F53 # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA
+<Multi_key> <grave> <parenleft> <Greek_upsilon>        : "ὓ"   U1F53 # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA
+<dead_acute> <U1F50>           : "ὔ"   U1F54 # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+<Multi_key> <acute> <U1F50>    : "ὔ"   U1F54 # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <U1F50>       : "ὔ"   U1F54 # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+<dead_acute> <dead_psili> <Greek_upsilon>      : "ὔ"   U1F54 # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+<dead_acute> <Multi_key> <parenright> <Greek_upsilon>  : "ὔ"   U1F54 # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+<Multi_key> <acute> <dead_psili> <Greek_upsilon>       : "ὔ"   U1F54 # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+<Multi_key> <acute> <parenright> <Greek_upsilon>       : "ὔ"   U1F54 # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <dead_psili> <Greek_upsilon>  : "ὔ"   U1F54 # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <parenright> <Greek_upsilon>  : "ὔ"   U1F54 # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+<dead_acute> <U1F51>           : "ὕ"   U1F55 # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+<Multi_key> <acute> <U1F51>    : "ὕ"   U1F55 # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <U1F51>       : "ὕ"   U1F55 # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+<dead_acute> <dead_dasia> <Greek_upsilon>      : "ὕ"   U1F55 # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+<dead_acute> <Multi_key> <parenleft> <Greek_upsilon>   : "ὕ"   U1F55 # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+<Multi_key> <acute> <dead_dasia> <Greek_upsilon>       : "ὕ"   U1F55 # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+<Multi_key> <acute> <parenleft> <Greek_upsilon>        : "ὕ"   U1F55 # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <dead_dasia> <Greek_upsilon>  : "ὕ"   U1F55 # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <parenleft> <Greek_upsilon>   : "ὕ"   U1F55 # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+<dead_tilde> <U1F50>           : "ὖ"   U1F56 # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <U1F50>       : "ὖ"   U1F56 # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+<dead_tilde> <dead_psili> <Greek_upsilon>      : "ὖ"   U1F56 # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenright> <Greek_upsilon>  : "ὖ"   U1F56 # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <dead_psili> <Greek_upsilon>  : "ὖ"   U1F56 # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <parenright> <Greek_upsilon>  : "ὖ"   U1F56 # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+<dead_tilde> <U1F51>           : "ὗ"   U1F57 # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <U1F51>       : "ὗ"   U1F57 # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+<dead_tilde> <dead_dasia> <Greek_upsilon>      : "ὗ"   U1F57 # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenleft> <Greek_upsilon>   : "ὗ"   U1F57 # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <dead_dasia> <Greek_upsilon>  : "ὗ"   U1F57 # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <parenleft> <Greek_upsilon>   : "ὗ"   U1F57 # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+<dead_dasia> <Greek_UPSILON>           : "Ὑ"   U1F59 # GREEK CAPITAL LETTER UPSILON WITH DASIA
+<Multi_key> <parenleft> <Greek_UPSILON>        : "Ὑ"   U1F59 # GREEK CAPITAL LETTER UPSILON WITH DASIA
+<dead_grave> <U1F59>           : "Ὓ"   U1F5B # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+<Multi_key> <grave> <U1F59>    : "Ὓ"   U1F5B # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+<dead_grave> <dead_dasia> <Greek_UPSILON>      : "Ὓ"   U1F5B # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+<dead_grave> <Multi_key> <parenleft> <Greek_UPSILON>   : "Ὓ"   U1F5B # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+<Multi_key> <grave> <dead_dasia> <Greek_UPSILON>       : "Ὓ"   U1F5B # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+<Multi_key> <grave> <parenleft> <Greek_UPSILON>        : "Ὓ"   U1F5B # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+<dead_acute> <U1F59>           : "Ὕ"   U1F5D # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+<Multi_key> <acute> <U1F59>    : "Ὕ"   U1F5D # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <U1F59>       : "Ὕ"   U1F5D # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+<dead_acute> <dead_dasia> <Greek_UPSILON>      : "Ὕ"   U1F5D # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+<dead_acute> <Multi_key> <parenleft> <Greek_UPSILON>   : "Ὕ"   U1F5D # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+<Multi_key> <acute> <dead_dasia> <Greek_UPSILON>       : "Ὕ"   U1F5D # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+<Multi_key> <acute> <parenleft> <Greek_UPSILON>        : "Ὕ"   U1F5D # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <dead_dasia> <Greek_UPSILON>  : "Ὕ"   U1F5D # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <parenleft> <Greek_UPSILON>   : "Ὕ"   U1F5D # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+<dead_tilde> <U1F59>           : "Ὗ"   U1F5F # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <U1F59>       : "Ὗ"   U1F5F # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+<dead_tilde> <dead_dasia> <Greek_UPSILON>      : "Ὗ"   U1F5F # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenleft> <Greek_UPSILON>   : "Ὗ"   U1F5F # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <dead_dasia> <Greek_UPSILON>  : "Ὗ"   U1F5F # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <parenleft> <Greek_UPSILON>   : "Ὗ"   U1F5F # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+<dead_psili> <Greek_omega>             : "ὠ"   U1F60 # GREEK SMALL LETTER OMEGA WITH PSILI
+<Multi_key> <parenright> <Greek_omega>         : "ὠ"   U1F60 # GREEK SMALL LETTER OMEGA WITH PSILI
+<dead_dasia> <Greek_omega>             : "ὡ"   U1F61 # GREEK SMALL LETTER OMEGA WITH DASIA
+<Multi_key> <parenleft> <Greek_omega>  : "ὡ"   U1F61 # GREEK SMALL LETTER OMEGA WITH DASIA
+<dead_grave> <U1F60>           : "ὢ"   U1F62 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA
+<Multi_key> <grave> <U1F60>    : "ὢ"   U1F62 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA
+<dead_grave> <dead_psili> <Greek_omega>        : "ὢ"   U1F62 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA
+<dead_grave> <Multi_key> <parenright> <Greek_omega>    : "ὢ"   U1F62 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA
+<Multi_key> <grave> <dead_psili> <Greek_omega>         : "ὢ"   U1F62 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA
+<Multi_key> <grave> <parenright> <Greek_omega>         : "ὢ"   U1F62 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA
+<dead_grave> <U1F61>           : "ὣ"   U1F63 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA
+<Multi_key> <grave> <U1F61>    : "ὣ"   U1F63 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA
+<dead_grave> <dead_dasia> <Greek_omega>        : "ὣ"   U1F63 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA
+<dead_grave> <Multi_key> <parenleft> <Greek_omega>     : "ὣ"   U1F63 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA
+<Multi_key> <grave> <dead_dasia> <Greek_omega>         : "ὣ"   U1F63 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA
+<Multi_key> <grave> <parenleft> <Greek_omega>  : "ὣ"   U1F63 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA
+<dead_acute> <U1F60>           : "ὤ"   U1F64 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+<Multi_key> <acute> <U1F60>    : "ὤ"   U1F64 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <U1F60>       : "ὤ"   U1F64 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+<dead_acute> <dead_psili> <Greek_omega>        : "ὤ"   U1F64 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+<dead_acute> <Multi_key> <parenright> <Greek_omega>    : "ὤ"   U1F64 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+<Multi_key> <acute> <dead_psili> <Greek_omega>         : "ὤ"   U1F64 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+<Multi_key> <acute> <parenright> <Greek_omega>         : "ὤ"   U1F64 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <dead_psili> <Greek_omega>    : "ὤ"   U1F64 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <parenright> <Greek_omega>    : "ὤ"   U1F64 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+<dead_acute> <U1F61>           : "ὥ"   U1F65 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+<Multi_key> <acute> <U1F61>    : "ὥ"   U1F65 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <U1F61>       : "ὥ"   U1F65 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+<dead_acute> <dead_dasia> <Greek_omega>        : "ὥ"   U1F65 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+<dead_acute> <Multi_key> <parenleft> <Greek_omega>     : "ὥ"   U1F65 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+<Multi_key> <acute> <dead_dasia> <Greek_omega>         : "ὥ"   U1F65 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+<Multi_key> <acute> <parenleft> <Greek_omega>  : "ὥ"   U1F65 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <dead_dasia> <Greek_omega>    : "ὥ"   U1F65 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <parenleft> <Greek_omega>     : "ὥ"   U1F65 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+<dead_tilde> <U1F60>           : "ὦ"   U1F66 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <U1F60>       : "ὦ"   U1F66 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI
+<dead_tilde> <dead_psili> <Greek_omega>        : "ὦ"   U1F66 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenright> <Greek_omega>    : "ὦ"   U1F66 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <dead_psili> <Greek_omega>    : "ὦ"   U1F66 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <parenright> <Greek_omega>    : "ὦ"   U1F66 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI
+<dead_tilde> <U1F61>           : "ὧ"   U1F67 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <U1F61>       : "ὧ"   U1F67 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+<dead_tilde> <dead_dasia> <Greek_omega>        : "ὧ"   U1F67 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenleft> <Greek_omega>     : "ὧ"   U1F67 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <dead_dasia> <Greek_omega>    : "ὧ"   U1F67 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <parenleft> <Greek_omega>     : "ὧ"   U1F67 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+<dead_psili> <Greek_OMEGA>             : "Ὠ"   U1F68 # GREEK CAPITAL LETTER OMEGA WITH PSILI
+<Multi_key> <parenright> <Greek_OMEGA>         : "Ὠ"   U1F68 # GREEK CAPITAL LETTER OMEGA WITH PSILI
+<dead_dasia> <Greek_OMEGA>             : "Ὡ"   U1F69 # GREEK CAPITAL LETTER OMEGA WITH DASIA
+<Multi_key> <parenleft> <Greek_OMEGA>  : "Ὡ"   U1F69 # GREEK CAPITAL LETTER OMEGA WITH DASIA
+<dead_grave> <U1F68>           : "Ὢ"   U1F6A # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+<Multi_key> <grave> <U1F68>    : "Ὢ"   U1F6A # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+<dead_grave> <dead_psili> <Greek_OMEGA>        : "Ὢ"   U1F6A # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+<dead_grave> <Multi_key> <parenright> <Greek_OMEGA>    : "Ὢ"   U1F6A # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+<Multi_key> <grave> <dead_psili> <Greek_OMEGA>         : "Ὢ"   U1F6A # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+<Multi_key> <grave> <parenright> <Greek_OMEGA>         : "Ὢ"   U1F6A # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+<dead_grave> <U1F69>           : "Ὣ"   U1F6B # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+<Multi_key> <grave> <U1F69>    : "Ὣ"   U1F6B # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+<dead_grave> <dead_dasia> <Greek_OMEGA>        : "Ὣ"   U1F6B # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+<dead_grave> <Multi_key> <parenleft> <Greek_OMEGA>     : "Ὣ"   U1F6B # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+<Multi_key> <grave> <dead_dasia> <Greek_OMEGA>         : "Ὣ"   U1F6B # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+<Multi_key> <grave> <parenleft> <Greek_OMEGA>  : "Ὣ"   U1F6B # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+<dead_acute> <U1F68>           : "Ὤ"   U1F6C # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+<Multi_key> <acute> <U1F68>    : "Ὤ"   U1F6C # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <U1F68>       : "Ὤ"   U1F6C # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+<dead_acute> <dead_psili> <Greek_OMEGA>        : "Ὤ"   U1F6C # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+<dead_acute> <Multi_key> <parenright> <Greek_OMEGA>    : "Ὤ"   U1F6C # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+<Multi_key> <acute> <dead_psili> <Greek_OMEGA>         : "Ὤ"   U1F6C # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+<Multi_key> <acute> <parenright> <Greek_OMEGA>         : "Ὤ"   U1F6C # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <dead_psili> <Greek_OMEGA>    : "Ὤ"   U1F6C # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <parenright> <Greek_OMEGA>    : "Ὤ"   U1F6C # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+<dead_acute> <U1F69>           : "Ὥ"   U1F6D # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+<Multi_key> <acute> <U1F69>    : "Ὥ"   U1F6D # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <U1F69>       : "Ὥ"   U1F6D # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+<dead_acute> <dead_dasia> <Greek_OMEGA>        : "Ὥ"   U1F6D # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+<dead_acute> <Multi_key> <parenleft> <Greek_OMEGA>     : "Ὥ"   U1F6D # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+<Multi_key> <acute> <dead_dasia> <Greek_OMEGA>         : "Ὥ"   U1F6D # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+<Multi_key> <acute> <parenleft> <Greek_OMEGA>  : "Ὥ"   U1F6D # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <dead_dasia> <Greek_OMEGA>    : "Ὥ"   U1F6D # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <parenleft> <Greek_OMEGA>     : "Ὥ"   U1F6D # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+<dead_tilde> <U1F68>           : "Ὦ"   U1F6E # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <U1F68>       : "Ὦ"   U1F6E # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+<dead_tilde> <dead_psili> <Greek_OMEGA>        : "Ὦ"   U1F6E # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenright> <Greek_OMEGA>    : "Ὦ"   U1F6E # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <dead_psili> <Greek_OMEGA>    : "Ὦ"   U1F6E # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <parenright> <Greek_OMEGA>    : "Ὦ"   U1F6E # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+<dead_tilde> <U1F69>           : "Ὧ"   U1F6F # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <U1F69>       : "Ὧ"   U1F6F # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+<dead_tilde> <dead_dasia> <Greek_OMEGA>        : "Ὧ"   U1F6F # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenleft> <Greek_OMEGA>     : "Ὧ"   U1F6F # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <dead_dasia> <Greek_OMEGA>    : "Ὧ"   U1F6F # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <parenleft> <Greek_OMEGA>     : "Ὧ"   U1F6F # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+<dead_grave> <Greek_alpha>             : "ὰ"   U1F70 # GREEK SMALL LETTER ALPHA WITH VARIA
+<Multi_key> <grave> <Greek_alpha>      : "ὰ"   U1F70 # GREEK SMALL LETTER ALPHA WITH VARIA
+<dead_grave> <Greek_epsilon>           : "ὲ"   U1F72 # GREEK SMALL LETTER EPSILON WITH VARIA
+<Multi_key> <grave> <Greek_epsilon>    : "ὲ"   U1F72 # GREEK SMALL LETTER EPSILON WITH VARIA
+<dead_grave> <Greek_eta>               : "ὴ"   U1F74 # GREEK SMALL LETTER ETA WITH VARIA
+<Multi_key> <grave> <Greek_eta>        : "ὴ"   U1F74 # GREEK SMALL LETTER ETA WITH VARIA
+<dead_grave> <Greek_iota>              : "ὶ"   U1F76 # GREEK SMALL LETTER IOTA WITH VARIA
+<Multi_key> <grave> <Greek_iota>       : "ὶ"   U1F76 # GREEK SMALL LETTER IOTA WITH VARIA
+<dead_grave> <Greek_omicron>           : "ὸ"   U1F78 # GREEK SMALL LETTER OMICRON WITH VARIA
+<Multi_key> <grave> <Greek_omicron>    : "ὸ"   U1F78 # GREEK SMALL LETTER OMICRON WITH VARIA
+<dead_grave> <Greek_upsilon>           : "ὺ"   U1F7A # GREEK SMALL LETTER UPSILON WITH VARIA
+<Multi_key> <grave> <Greek_upsilon>    : "ὺ"   U1F7A # GREEK SMALL LETTER UPSILON WITH VARIA
+<dead_grave> <Greek_omega>             : "ὼ"   U1F7C # GREEK SMALL LETTER OMEGA WITH VARIA
+<Multi_key> <grave> <Greek_omega>      : "ὼ"   U1F7C # GREEK SMALL LETTER OMEGA WITH VARIA
+<dead_iota> <U1F00>            : "ᾀ"   U1F80 # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F00>       : "ᾀ"   U1F80 # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+<dead_iota> <dead_psili> <Greek_alpha>         : "ᾀ"   U1F80 # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <parenright> <Greek_alpha>     : "ᾀ"   U1F80 # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_psili> <Greek_alpha>    : "ᾀ"   U1F80 # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <parenright> <Greek_alpha>    : "ᾀ"   U1F80 # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+<dead_iota> <U1F01>            : "ᾁ"   U1F81 # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F01>       : "ᾁ"   U1F81 # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+<dead_iota> <dead_dasia> <Greek_alpha>         : "ᾁ"   U1F81 # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <parenleft> <Greek_alpha>      : "ᾁ"   U1F81 # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_dasia> <Greek_alpha>    : "ᾁ"   U1F81 # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <parenleft> <Greek_alpha>     : "ᾁ"   U1F81 # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+<dead_iota> <U1F02>            : "ᾂ"   U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F02>       : "ᾂ"   U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <U1F00>       : "ᾂ"   U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <U1F00>        : "ᾂ"   U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <U1F00>  : "ᾂ"   U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <U1F00>       : "ᾂ"   U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <dead_psili> <Greek_alpha>    : "ᾂ"   U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <Multi_key> <parenright> <Greek_alpha>        : "ᾂ"   U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <dead_psili> <Greek_alpha>     : "ᾂ"   U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <parenright> <Greek_alpha>     : "ᾂ"   U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <dead_psili> <Greek_alpha>       : "ᾂ"   U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <parenright> <Greek_alpha>       : "ᾂ"   U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <dead_psili> <Greek_alpha>    : "ᾂ"   U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <parenright> <Greek_alpha>    : "ᾂ"   U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <U1F03>            : "ᾃ"   U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F03>       : "ᾃ"   U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <U1F01>       : "ᾃ"   U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <U1F01>        : "ᾃ"   U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <U1F01>  : "ᾃ"   U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <U1F01>       : "ᾃ"   U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <dead_dasia> <Greek_alpha>    : "ᾃ"   U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <Multi_key> <parenleft> <Greek_alpha>         : "ᾃ"   U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <dead_dasia> <Greek_alpha>     : "ᾃ"   U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <parenleft> <Greek_alpha>      : "ᾃ"   U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <dead_dasia> <Greek_alpha>       : "ᾃ"   U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <parenleft> <Greek_alpha>        : "ᾃ"   U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <dead_dasia> <Greek_alpha>    : "ᾃ"   U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <parenleft> <Greek_alpha>     : "ᾃ"   U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <U1F04>            : "ᾄ"   U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F04>       : "ᾄ"   U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <U1F00>       : "ᾄ"   U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <U1F00>        : "ᾄ"   U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <U1F00>   : "ᾄ"   U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <U1F00>  : "ᾄ"   U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <U1F00>       : "ᾄ"   U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <U1F00>  : "ᾄ"   U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <dead_psili> <Greek_alpha>    : "ᾄ"   U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <Multi_key> <parenright> <Greek_alpha>        : "ᾄ"   U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <dead_psili> <Greek_alpha>     : "ᾄ"   U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <parenright> <Greek_alpha>     : "ᾄ"   U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <dead_psili> <Greek_alpha>        : "ᾄ"   U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <parenright> <Greek_alpha>        : "ᾄ"   U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <dead_psili> <Greek_alpha>       : "ᾄ"   U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <parenright> <Greek_alpha>       : "ᾄ"   U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <dead_psili> <Greek_alpha>    : "ᾄ"   U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <parenright> <Greek_alpha>    : "ᾄ"   U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <dead_psili> <Greek_alpha>       : "ᾄ"   U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <parenright> <Greek_alpha>       : "ᾄ"   U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <U1F05>            : "ᾅ"   U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F05>       : "ᾅ"   U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <U1F01>       : "ᾅ"   U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <U1F01>        : "ᾅ"   U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <U1F01>   : "ᾅ"   U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <U1F01>  : "ᾅ"   U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <U1F01>       : "ᾅ"   U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <U1F01>  : "ᾅ"   U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <dead_dasia> <Greek_alpha>    : "ᾅ"   U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <Multi_key> <parenleft> <Greek_alpha>         : "ᾅ"   U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <dead_dasia> <Greek_alpha>     : "ᾅ"   U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <parenleft> <Greek_alpha>      : "ᾅ"   U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <dead_dasia> <Greek_alpha>        : "ᾅ"   U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <parenleft> <Greek_alpha>         : "ᾅ"   U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <dead_dasia> <Greek_alpha>       : "ᾅ"   U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <parenleft> <Greek_alpha>        : "ᾅ"   U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <dead_dasia> <Greek_alpha>    : "ᾅ"   U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <parenleft> <Greek_alpha>     : "ᾅ"   U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <dead_dasia> <Greek_alpha>       : "ᾅ"   U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <parenleft> <Greek_alpha>        : "ᾅ"   U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <U1F06>            : "ᾆ"   U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F06>       : "ᾆ"   U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <U1F00>       : "ᾆ"   U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <U1F00>   : "ᾆ"   U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <U1F00>  : "ᾆ"   U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <U1F00>  : "ᾆ"   U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <dead_psili> <Greek_alpha>    : "ᾆ"   U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <Multi_key> <parenright> <Greek_alpha>        : "ᾆ"   U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <dead_psili> <Greek_alpha>        : "ᾆ"   U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <parenright> <Greek_alpha>        : "ᾆ"   U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <dead_psili> <Greek_alpha>       : "ᾆ"   U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <parenright> <Greek_alpha>       : "ᾆ"   U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <dead_psili> <Greek_alpha>       : "ᾆ"   U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <parenright> <Greek_alpha>       : "ᾆ"   U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <U1F07>            : "ᾇ"   U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F07>       : "ᾇ"   U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <U1F01>       : "ᾇ"   U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <U1F01>   : "ᾇ"   U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <U1F01>  : "ᾇ"   U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <U1F01>  : "ᾇ"   U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <dead_dasia> <Greek_alpha>    : "ᾇ"   U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <Multi_key> <parenleft> <Greek_alpha>         : "ᾇ"   U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <dead_dasia> <Greek_alpha>        : "ᾇ"   U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <parenleft> <Greek_alpha>         : "ᾇ"   U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <dead_dasia> <Greek_alpha>       : "ᾇ"   U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <parenleft> <Greek_alpha>        : "ᾇ"   U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <dead_dasia> <Greek_alpha>       : "ᾇ"   U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <parenleft> <Greek_alpha>        : "ᾇ"   U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <U1F08>            : "ᾈ"   U1F88 # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F08>       : "ᾈ"   U1F88 # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+<dead_iota> <dead_psili> <Greek_ALPHA>         : "ᾈ"   U1F88 # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <parenright> <Greek_ALPHA>     : "ᾈ"   U1F88 # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_psili> <Greek_ALPHA>    : "ᾈ"   U1F88 # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <parenright> <Greek_ALPHA>    : "ᾈ"   U1F88 # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+<dead_iota> <U1F09>            : "ᾉ"   U1F89 # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F09>       : "ᾉ"   U1F89 # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+<dead_iota> <dead_dasia> <Greek_ALPHA>         : "ᾉ"   U1F89 # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <parenleft> <Greek_ALPHA>      : "ᾉ"   U1F89 # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_dasia> <Greek_ALPHA>    : "ᾉ"   U1F89 # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <parenleft> <Greek_ALPHA>     : "ᾉ"   U1F89 # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+<dead_iota> <U1F0A>            : "ᾊ"   U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F0A>       : "ᾊ"   U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <dead_grave> <U1F08>       : "ᾊ"   U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <U1F08>        : "ᾊ"   U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <U1F08>  : "ᾊ"   U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <U1F08>       : "ᾊ"   U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <dead_grave> <dead_psili> <Greek_ALPHA>    : "ᾊ"   U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <dead_grave> <Multi_key> <parenright> <Greek_ALPHA>        : "ᾊ"   U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <dead_psili> <Greek_ALPHA>     : "ᾊ"   U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <parenright> <Greek_ALPHA>     : "ᾊ"   U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <dead_psili> <Greek_ALPHA>       : "ᾊ"   U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <parenright> <Greek_ALPHA>       : "ᾊ"   U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <dead_psili> <Greek_ALPHA>    : "ᾊ"   U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <parenright> <Greek_ALPHA>    : "ᾊ"   U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <U1F0B>            : "ᾋ"   U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F0B>       : "ᾋ"   U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <dead_grave> <U1F09>       : "ᾋ"   U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <U1F09>        : "ᾋ"   U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <U1F09>  : "ᾋ"   U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <U1F09>       : "ᾋ"   U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <dead_grave> <dead_dasia> <Greek_ALPHA>    : "ᾋ"   U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <dead_grave> <Multi_key> <parenleft> <Greek_ALPHA>         : "ᾋ"   U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <dead_dasia> <Greek_ALPHA>     : "ᾋ"   U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <parenleft> <Greek_ALPHA>      : "ᾋ"   U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <dead_dasia> <Greek_ALPHA>       : "ᾋ"   U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <parenleft> <Greek_ALPHA>        : "ᾋ"   U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <dead_dasia> <Greek_ALPHA>    : "ᾋ"   U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <parenleft> <Greek_ALPHA>     : "ᾋ"   U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <U1F0C>            : "ᾌ"   U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F0C>       : "ᾌ"   U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <dead_acute> <U1F08>       : "ᾌ"   U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <U1F08>        : "ᾌ"   U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <U1F08>   : "ᾌ"   U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <U1F08>  : "ᾌ"   U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <U1F08>       : "ᾌ"   U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <U1F08>  : "ᾌ"   U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <dead_acute> <dead_psili> <Greek_ALPHA>    : "ᾌ"   U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <dead_acute> <Multi_key> <parenright> <Greek_ALPHA>        : "ᾌ"   U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <dead_psili> <Greek_ALPHA>     : "ᾌ"   U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <parenright> <Greek_ALPHA>     : "ᾌ"   U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <dead_psili> <Greek_ALPHA>        : "ᾌ"   U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <parenright> <Greek_ALPHA>        : "ᾌ"   U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <dead_psili> <Greek_ALPHA>       : "ᾌ"   U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <parenright> <Greek_ALPHA>       : "ᾌ"   U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <dead_psili> <Greek_ALPHA>    : "ᾌ"   U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <parenright> <Greek_ALPHA>    : "ᾌ"   U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <dead_psili> <Greek_ALPHA>       : "ᾌ"   U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <parenright> <Greek_ALPHA>       : "ᾌ"   U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <U1F0D>            : "ᾍ"   U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F0D>       : "ᾍ"   U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <dead_acute> <U1F09>       : "ᾍ"   U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <U1F09>        : "ᾍ"   U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <U1F09>   : "ᾍ"   U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <U1F09>  : "ᾍ"   U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <U1F09>       : "ᾍ"   U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <U1F09>  : "ᾍ"   U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <dead_acute> <dead_dasia> <Greek_ALPHA>    : "ᾍ"   U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <dead_acute> <Multi_key> <parenleft> <Greek_ALPHA>         : "ᾍ"   U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <dead_dasia> <Greek_ALPHA>     : "ᾍ"   U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <parenleft> <Greek_ALPHA>      : "ᾍ"   U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <dead_dasia> <Greek_ALPHA>        : "ᾍ"   U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <parenleft> <Greek_ALPHA>         : "ᾍ"   U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <dead_dasia> <Greek_ALPHA>       : "ᾍ"   U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <parenleft> <Greek_ALPHA>        : "ᾍ"   U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <dead_dasia> <Greek_ALPHA>    : "ᾍ"   U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <parenleft> <Greek_ALPHA>     : "ᾍ"   U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <dead_dasia> <Greek_ALPHA>       : "ᾍ"   U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <parenleft> <Greek_ALPHA>        : "ᾍ"   U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <U1F0E>            : "ᾎ"   U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F0E>       : "ᾎ"   U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <dead_tilde> <U1F08>       : "ᾎ"   U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <U1F08>   : "ᾎ"   U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <U1F08>  : "ᾎ"   U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <U1F08>  : "ᾎ"   U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <dead_tilde> <dead_psili> <Greek_ALPHA>    : "ᾎ"   U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <dead_tilde> <Multi_key> <parenright> <Greek_ALPHA>        : "ᾎ"   U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <dead_psili> <Greek_ALPHA>        : "ᾎ"   U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <parenright> <Greek_ALPHA>        : "ᾎ"   U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <dead_psili> <Greek_ALPHA>       : "ᾎ"   U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <parenright> <Greek_ALPHA>       : "ᾎ"   U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <dead_psili> <Greek_ALPHA>       : "ᾎ"   U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <parenright> <Greek_ALPHA>       : "ᾎ"   U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <U1F0F>            : "ᾏ"   U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F0F>       : "ᾏ"   U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <dead_tilde> <U1F09>       : "ᾏ"   U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <U1F09>   : "ᾏ"   U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <U1F09>  : "ᾏ"   U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <U1F09>  : "ᾏ"   U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <dead_tilde> <dead_dasia> <Greek_ALPHA>    : "ᾏ"   U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <dead_tilde> <Multi_key> <parenleft> <Greek_ALPHA>         : "ᾏ"   U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <dead_dasia> <Greek_ALPHA>        : "ᾏ"   U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <parenleft> <Greek_ALPHA>         : "ᾏ"   U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <dead_dasia> <Greek_ALPHA>       : "ᾏ"   U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <parenleft> <Greek_ALPHA>        : "ᾏ"   U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <dead_dasia> <Greek_ALPHA>       : "ᾏ"   U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <parenleft> <Greek_ALPHA>        : "ᾏ"   U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <U1F20>            : "ᾐ"   U1F90 # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F20>       : "ᾐ"   U1F90 # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+<dead_iota> <dead_psili> <Greek_eta>   : "ᾐ"   U1F90 # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <parenright> <Greek_eta>       : "ᾐ"   U1F90 # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_psili> <Greek_eta>      : "ᾐ"   U1F90 # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <parenright> <Greek_eta>      : "ᾐ"   U1F90 # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+<dead_iota> <U1F21>            : "ᾑ"   U1F91 # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F21>       : "ᾑ"   U1F91 # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+<dead_iota> <dead_dasia> <Greek_eta>   : "ᾑ"   U1F91 # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <parenleft> <Greek_eta>        : "ᾑ"   U1F91 # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_dasia> <Greek_eta>      : "ᾑ"   U1F91 # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <parenleft> <Greek_eta>       : "ᾑ"   U1F91 # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+<dead_iota> <U1F22>            : "ᾒ"   U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F22>       : "ᾒ"   U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <U1F20>       : "ᾒ"   U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <U1F20>        : "ᾒ"   U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <U1F20>  : "ᾒ"   U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <U1F20>       : "ᾒ"   U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <dead_psili> <Greek_eta>      : "ᾒ"   U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <Multi_key> <parenright> <Greek_eta>  : "ᾒ"   U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <dead_psili> <Greek_eta>       : "ᾒ"   U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <parenright> <Greek_eta>       : "ᾒ"   U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <dead_psili> <Greek_eta>         : "ᾒ"   U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <parenright> <Greek_eta>         : "ᾒ"   U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <dead_psili> <Greek_eta>      : "ᾒ"   U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <parenright> <Greek_eta>      : "ᾒ"   U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <U1F23>            : "ᾓ"   U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F23>       : "ᾓ"   U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <U1F21>       : "ᾓ"   U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <U1F21>        : "ᾓ"   U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <U1F21>  : "ᾓ"   U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <U1F21>       : "ᾓ"   U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <dead_dasia> <Greek_eta>      : "ᾓ"   U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <Multi_key> <parenleft> <Greek_eta>   : "ᾓ"   U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <dead_dasia> <Greek_eta>       : "ᾓ"   U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <parenleft> <Greek_eta>        : "ᾓ"   U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <dead_dasia> <Greek_eta>         : "ᾓ"   U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <parenleft> <Greek_eta>  : "ᾓ"   U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <dead_dasia> <Greek_eta>      : "ᾓ"   U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <parenleft> <Greek_eta>       : "ᾓ"   U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <U1F24>            : "ᾔ"   U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F24>       : "ᾔ"   U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <U1F20>       : "ᾔ"   U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <U1F20>        : "ᾔ"   U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <U1F20>   : "ᾔ"   U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <U1F20>  : "ᾔ"   U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <U1F20>       : "ᾔ"   U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <U1F20>  : "ᾔ"   U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <dead_psili> <Greek_eta>      : "ᾔ"   U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <Multi_key> <parenright> <Greek_eta>  : "ᾔ"   U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <dead_psili> <Greek_eta>       : "ᾔ"   U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <parenright> <Greek_eta>       : "ᾔ"   U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <dead_psili> <Greek_eta>  : "ᾔ"   U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <parenright> <Greek_eta>  : "ᾔ"   U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <dead_psili> <Greek_eta>         : "ᾔ"   U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <parenright> <Greek_eta>         : "ᾔ"   U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <dead_psili> <Greek_eta>      : "ᾔ"   U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <parenright> <Greek_eta>      : "ᾔ"   U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <dead_psili> <Greek_eta>         : "ᾔ"   U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <parenright> <Greek_eta>         : "ᾔ"   U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <U1F25>            : "ᾕ"   U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F25>       : "ᾕ"   U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <U1F21>       : "ᾕ"   U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <U1F21>        : "ᾕ"   U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <U1F21>   : "ᾕ"   U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <U1F21>  : "ᾕ"   U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <U1F21>       : "ᾕ"   U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <U1F21>  : "ᾕ"   U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <dead_dasia> <Greek_eta>      : "ᾕ"   U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <Multi_key> <parenleft> <Greek_eta>   : "ᾕ"   U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <dead_dasia> <Greek_eta>       : "ᾕ"   U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <parenleft> <Greek_eta>        : "ᾕ"   U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <dead_dasia> <Greek_eta>  : "ᾕ"   U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <parenleft> <Greek_eta>   : "ᾕ"   U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <dead_dasia> <Greek_eta>         : "ᾕ"   U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <parenleft> <Greek_eta>  : "ᾕ"   U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <dead_dasia> <Greek_eta>      : "ᾕ"   U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <parenleft> <Greek_eta>       : "ᾕ"   U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <dead_dasia> <Greek_eta>         : "ᾕ"   U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <parenleft> <Greek_eta>  : "ᾕ"   U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <U1F26>            : "ᾖ"   U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F26>       : "ᾖ"   U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <U1F20>       : "ᾖ"   U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <U1F20>   : "ᾖ"   U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <U1F20>  : "ᾖ"   U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <U1F20>  : "ᾖ"   U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <dead_psili> <Greek_eta>      : "ᾖ"   U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <Multi_key> <parenright> <Greek_eta>  : "ᾖ"   U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <dead_psili> <Greek_eta>  : "ᾖ"   U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <parenright> <Greek_eta>  : "ᾖ"   U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <dead_psili> <Greek_eta>         : "ᾖ"   U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <parenright> <Greek_eta>         : "ᾖ"   U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <dead_psili> <Greek_eta>         : "ᾖ"   U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <parenright> <Greek_eta>         : "ᾖ"   U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <U1F27>            : "ᾗ"   U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F27>       : "ᾗ"   U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <U1F21>       : "ᾗ"   U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <U1F21>   : "ᾗ"   U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <U1F21>  : "ᾗ"   U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <U1F21>  : "ᾗ"   U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <dead_dasia> <Greek_eta>      : "ᾗ"   U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <Multi_key> <parenleft> <Greek_eta>   : "ᾗ"   U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <dead_dasia> <Greek_eta>  : "ᾗ"   U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <parenleft> <Greek_eta>   : "ᾗ"   U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <dead_dasia> <Greek_eta>         : "ᾗ"   U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <parenleft> <Greek_eta>  : "ᾗ"   U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <dead_dasia> <Greek_eta>         : "ᾗ"   U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <parenleft> <Greek_eta>  : "ᾗ"   U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <U1F28>            : "ᾘ"   U1F98 # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F28>       : "ᾘ"   U1F98 # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+<dead_iota> <dead_psili> <Greek_ETA>   : "ᾘ"   U1F98 # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <parenright> <Greek_ETA>       : "ᾘ"   U1F98 # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_psili> <Greek_ETA>      : "ᾘ"   U1F98 # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <parenright> <Greek_ETA>      : "ᾘ"   U1F98 # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+<dead_iota> <U1F29>            : "ᾙ"   U1F99 # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F29>       : "ᾙ"   U1F99 # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+<dead_iota> <dead_dasia> <Greek_ETA>   : "ᾙ"   U1F99 # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <parenleft> <Greek_ETA>        : "ᾙ"   U1F99 # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_dasia> <Greek_ETA>      : "ᾙ"   U1F99 # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <parenleft> <Greek_ETA>       : "ᾙ"   U1F99 # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+<dead_iota> <U1F2A>            : "ᾚ"   U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F2A>       : "ᾚ"   U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <dead_grave> <U1F28>       : "ᾚ"   U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <U1F28>        : "ᾚ"   U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <U1F28>  : "ᾚ"   U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <U1F28>       : "ᾚ"   U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <dead_grave> <dead_psili> <Greek_ETA>      : "ᾚ"   U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <dead_grave> <Multi_key> <parenright> <Greek_ETA>  : "ᾚ"   U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <dead_psili> <Greek_ETA>       : "ᾚ"   U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <parenright> <Greek_ETA>       : "ᾚ"   U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <dead_psili> <Greek_ETA>         : "ᾚ"   U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <parenright> <Greek_ETA>         : "ᾚ"   U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <dead_psili> <Greek_ETA>      : "ᾚ"   U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <parenright> <Greek_ETA>      : "ᾚ"   U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <U1F2B>            : "ᾛ"   U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F2B>       : "ᾛ"   U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <dead_grave> <U1F29>       : "ᾛ"   U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <U1F29>        : "ᾛ"   U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <U1F29>  : "ᾛ"   U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <U1F29>       : "ᾛ"   U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <dead_grave> <dead_dasia> <Greek_ETA>      : "ᾛ"   U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <dead_grave> <Multi_key> <parenleft> <Greek_ETA>   : "ᾛ"   U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <dead_dasia> <Greek_ETA>       : "ᾛ"   U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <parenleft> <Greek_ETA>        : "ᾛ"   U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <dead_dasia> <Greek_ETA>         : "ᾛ"   U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <parenleft> <Greek_ETA>  : "ᾛ"   U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <dead_dasia> <Greek_ETA>      : "ᾛ"   U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <parenleft> <Greek_ETA>       : "ᾛ"   U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <U1F2C>            : "ᾜ"   U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F2C>       : "ᾜ"   U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <dead_acute> <U1F28>       : "ᾜ"   U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <U1F28>        : "ᾜ"   U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <U1F28>   : "ᾜ"   U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <U1F28>  : "ᾜ"   U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <U1F28>       : "ᾜ"   U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <U1F28>  : "ᾜ"   U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <dead_acute> <dead_psili> <Greek_ETA>      : "ᾜ"   U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <dead_acute> <Multi_key> <parenright> <Greek_ETA>  : "ᾜ"   U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <dead_psili> <Greek_ETA>       : "ᾜ"   U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <parenright> <Greek_ETA>       : "ᾜ"   U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <dead_psili> <Greek_ETA>  : "ᾜ"   U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <parenright> <Greek_ETA>  : "ᾜ"   U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <dead_psili> <Greek_ETA>         : "ᾜ"   U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <parenright> <Greek_ETA>         : "ᾜ"   U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <dead_psili> <Greek_ETA>      : "ᾜ"   U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <parenright> <Greek_ETA>      : "ᾜ"   U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <dead_psili> <Greek_ETA>         : "ᾜ"   U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <parenright> <Greek_ETA>         : "ᾜ"   U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <U1F2D>            : "ᾝ"   U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F2D>       : "ᾝ"   U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <dead_acute> <U1F29>       : "ᾝ"   U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <U1F29>        : "ᾝ"   U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <U1F29>   : "ᾝ"   U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <U1F29>  : "ᾝ"   U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <U1F29>       : "ᾝ"   U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <U1F29>  : "ᾝ"   U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <dead_acute> <dead_dasia> <Greek_ETA>      : "ᾝ"   U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <dead_acute> <Multi_key> <parenleft> <Greek_ETA>   : "ᾝ"   U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <dead_dasia> <Greek_ETA>       : "ᾝ"   U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <parenleft> <Greek_ETA>        : "ᾝ"   U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <dead_dasia> <Greek_ETA>  : "ᾝ"   U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <parenleft> <Greek_ETA>   : "ᾝ"   U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <dead_dasia> <Greek_ETA>         : "ᾝ"   U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <parenleft> <Greek_ETA>  : "ᾝ"   U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <dead_dasia> <Greek_ETA>      : "ᾝ"   U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <parenleft> <Greek_ETA>       : "ᾝ"   U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <dead_dasia> <Greek_ETA>         : "ᾝ"   U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <parenleft> <Greek_ETA>  : "ᾝ"   U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <U1F2E>            : "ᾞ"   U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F2E>       : "ᾞ"   U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <dead_tilde> <U1F28>       : "ᾞ"   U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <U1F28>   : "ᾞ"   U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <U1F28>  : "ᾞ"   U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <U1F28>  : "ᾞ"   U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <dead_tilde> <dead_psili> <Greek_ETA>      : "ᾞ"   U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <dead_tilde> <Multi_key> <parenright> <Greek_ETA>  : "ᾞ"   U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <dead_psili> <Greek_ETA>  : "ᾞ"   U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <parenright> <Greek_ETA>  : "ᾞ"   U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <dead_psili> <Greek_ETA>         : "ᾞ"   U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <parenright> <Greek_ETA>         : "ᾞ"   U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <dead_psili> <Greek_ETA>         : "ᾞ"   U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <parenright> <Greek_ETA>         : "ᾞ"   U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <U1F2F>            : "ᾟ"   U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F2F>       : "ᾟ"   U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <dead_tilde> <U1F29>       : "ᾟ"   U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <U1F29>   : "ᾟ"   U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <U1F29>  : "ᾟ"   U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <U1F29>  : "ᾟ"   U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <dead_tilde> <dead_dasia> <Greek_ETA>      : "ᾟ"   U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <dead_tilde> <Multi_key> <parenleft> <Greek_ETA>   : "ᾟ"   U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <dead_dasia> <Greek_ETA>  : "ᾟ"   U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <parenleft> <Greek_ETA>   : "ᾟ"   U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <dead_dasia> <Greek_ETA>         : "ᾟ"   U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <parenleft> <Greek_ETA>  : "ᾟ"   U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <dead_dasia> <Greek_ETA>         : "ᾟ"   U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <parenleft> <Greek_ETA>  : "ᾟ"   U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <U1F60>            : "ᾠ"   U1FA0 # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F60>       : "ᾠ"   U1FA0 # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+<dead_iota> <dead_psili> <Greek_omega>         : "ᾠ"   U1FA0 # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <parenright> <Greek_omega>     : "ᾠ"   U1FA0 # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_psili> <Greek_omega>    : "ᾠ"   U1FA0 # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <parenright> <Greek_omega>    : "ᾠ"   U1FA0 # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+<dead_iota> <U1F61>            : "ᾡ"   U1FA1 # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F61>       : "ᾡ"   U1FA1 # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+<dead_iota> <dead_dasia> <Greek_omega>         : "ᾡ"   U1FA1 # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <parenleft> <Greek_omega>      : "ᾡ"   U1FA1 # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_dasia> <Greek_omega>    : "ᾡ"   U1FA1 # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <parenleft> <Greek_omega>     : "ᾡ"   U1FA1 # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+<dead_iota> <U1F62>            : "ᾢ"   U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F62>       : "ᾢ"   U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <U1F60>       : "ᾢ"   U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <U1F60>        : "ᾢ"   U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <U1F60>  : "ᾢ"   U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <U1F60>       : "ᾢ"   U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <dead_psili> <Greek_omega>    : "ᾢ"   U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <Multi_key> <parenright> <Greek_omega>        : "ᾢ"   U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <dead_psili> <Greek_omega>     : "ᾢ"   U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <parenright> <Greek_omega>     : "ᾢ"   U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <dead_psili> <Greek_omega>       : "ᾢ"   U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <parenright> <Greek_omega>       : "ᾢ"   U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <dead_psili> <Greek_omega>    : "ᾢ"   U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <parenright> <Greek_omega>    : "ᾢ"   U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <U1F63>            : "ᾣ"   U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F63>       : "ᾣ"   U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <U1F61>       : "ᾣ"   U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <U1F61>        : "ᾣ"   U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <U1F61>  : "ᾣ"   U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <U1F61>       : "ᾣ"   U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <dead_dasia> <Greek_omega>    : "ᾣ"   U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <Multi_key> <parenleft> <Greek_omega>         : "ᾣ"   U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <dead_dasia> <Greek_omega>     : "ᾣ"   U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <parenleft> <Greek_omega>      : "ᾣ"   U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <dead_dasia> <Greek_omega>       : "ᾣ"   U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <parenleft> <Greek_omega>        : "ᾣ"   U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <dead_dasia> <Greek_omega>    : "ᾣ"   U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <parenleft> <Greek_omega>     : "ᾣ"   U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <U1F64>            : "ᾤ"   U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F64>       : "ᾤ"   U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <U1F60>       : "ᾤ"   U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <U1F60>        : "ᾤ"   U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <U1F60>   : "ᾤ"   U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <U1F60>  : "ᾤ"   U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <U1F60>       : "ᾤ"   U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <U1F60>  : "ᾤ"   U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <dead_psili> <Greek_omega>    : "ᾤ"   U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <Multi_key> <parenright> <Greek_omega>        : "ᾤ"   U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <dead_psili> <Greek_omega>     : "ᾤ"   U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <parenright> <Greek_omega>     : "ᾤ"   U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <dead_psili> <Greek_omega>        : "ᾤ"   U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <parenright> <Greek_omega>        : "ᾤ"   U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <dead_psili> <Greek_omega>       : "ᾤ"   U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <parenright> <Greek_omega>       : "ᾤ"   U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <dead_psili> <Greek_omega>    : "ᾤ"   U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <parenright> <Greek_omega>    : "ᾤ"   U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <dead_psili> <Greek_omega>       : "ᾤ"   U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <parenright> <Greek_omega>       : "ᾤ"   U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <U1F65>            : "ᾥ"   U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F65>       : "ᾥ"   U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <U1F61>       : "ᾥ"   U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <U1F61>        : "ᾥ"   U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <U1F61>   : "ᾥ"   U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <U1F61>  : "ᾥ"   U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <U1F61>       : "ᾥ"   U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <U1F61>  : "ᾥ"   U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <dead_dasia> <Greek_omega>    : "ᾥ"   U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <Multi_key> <parenleft> <Greek_omega>         : "ᾥ"   U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <dead_dasia> <Greek_omega>     : "ᾥ"   U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <parenleft> <Greek_omega>      : "ᾥ"   U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <dead_dasia> <Greek_omega>        : "ᾥ"   U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <parenleft> <Greek_omega>         : "ᾥ"   U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <dead_dasia> <Greek_omega>       : "ᾥ"   U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <parenleft> <Greek_omega>        : "ᾥ"   U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <dead_dasia> <Greek_omega>    : "ᾥ"   U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <parenleft> <Greek_omega>     : "ᾥ"   U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <dead_dasia> <Greek_omega>       : "ᾥ"   U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <parenleft> <Greek_omega>        : "ᾥ"   U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <U1F66>            : "ᾦ"   U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F66>       : "ᾦ"   U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <U1F60>       : "ᾦ"   U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <U1F60>   : "ᾦ"   U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <U1F60>  : "ᾦ"   U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <U1F60>  : "ᾦ"   U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <dead_psili> <Greek_omega>    : "ᾦ"   U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <Multi_key> <parenright> <Greek_omega>        : "ᾦ"   U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <dead_psili> <Greek_omega>        : "ᾦ"   U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <parenright> <Greek_omega>        : "ᾦ"   U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <dead_psili> <Greek_omega>       : "ᾦ"   U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <parenright> <Greek_omega>       : "ᾦ"   U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <dead_psili> <Greek_omega>       : "ᾦ"   U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <parenright> <Greek_omega>       : "ᾦ"   U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <U1F67>            : "ᾧ"   U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F67>       : "ᾧ"   U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <U1F61>       : "ᾧ"   U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <U1F61>   : "ᾧ"   U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <U1F61>  : "ᾧ"   U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <U1F61>  : "ᾧ"   U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <dead_dasia> <Greek_omega>    : "ᾧ"   U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <Multi_key> <parenleft> <Greek_omega>         : "ᾧ"   U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <dead_dasia> <Greek_omega>        : "ᾧ"   U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <parenleft> <Greek_omega>         : "ᾧ"   U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <dead_dasia> <Greek_omega>       : "ᾧ"   U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <parenleft> <Greek_omega>        : "ᾧ"   U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <dead_dasia> <Greek_omega>       : "ᾧ"   U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <parenleft> <Greek_omega>        : "ᾧ"   U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <U1F68>            : "ᾨ"   U1FA8 # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F68>       : "ᾨ"   U1FA8 # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+<dead_iota> <dead_psili> <Greek_OMEGA>         : "ᾨ"   U1FA8 # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <parenright> <Greek_OMEGA>     : "ᾨ"   U1FA8 # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_psili> <Greek_OMEGA>    : "ᾨ"   U1FA8 # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <parenright> <Greek_OMEGA>    : "ᾨ"   U1FA8 # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+<dead_iota> <U1F69>            : "ᾩ"   U1FA9 # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F69>       : "ᾩ"   U1FA9 # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+<dead_iota> <dead_dasia> <Greek_OMEGA>         : "ᾩ"   U1FA9 # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <parenleft> <Greek_OMEGA>      : "ᾩ"   U1FA9 # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_dasia> <Greek_OMEGA>    : "ᾩ"   U1FA9 # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <parenleft> <Greek_OMEGA>     : "ᾩ"   U1FA9 # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+<dead_iota> <U1F6A>            : "ᾪ"   U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F6A>       : "ᾪ"   U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <dead_grave> <U1F68>       : "ᾪ"   U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <U1F68>        : "ᾪ"   U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <U1F68>  : "ᾪ"   U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <U1F68>       : "ᾪ"   U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <dead_grave> <dead_psili> <Greek_OMEGA>    : "ᾪ"   U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <dead_grave> <Multi_key> <parenright> <Greek_OMEGA>        : "ᾪ"   U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <dead_psili> <Greek_OMEGA>     : "ᾪ"   U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <parenright> <Greek_OMEGA>     : "ᾪ"   U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <dead_psili> <Greek_OMEGA>       : "ᾪ"   U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <parenright> <Greek_OMEGA>       : "ᾪ"   U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <dead_psili> <Greek_OMEGA>    : "ᾪ"   U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <parenright> <Greek_OMEGA>    : "ᾪ"   U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <U1F6B>            : "ᾫ"   U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F6B>       : "ᾫ"   U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <dead_grave> <U1F69>       : "ᾫ"   U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <U1F69>        : "ᾫ"   U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <U1F69>  : "ᾫ"   U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <U1F69>       : "ᾫ"   U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <dead_grave> <dead_dasia> <Greek_OMEGA>    : "ᾫ"   U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <dead_grave> <Multi_key> <parenleft> <Greek_OMEGA>         : "ᾫ"   U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <dead_dasia> <Greek_OMEGA>     : "ᾫ"   U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <parenleft> <Greek_OMEGA>      : "ᾫ"   U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <dead_dasia> <Greek_OMEGA>       : "ᾫ"   U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <parenleft> <Greek_OMEGA>        : "ᾫ"   U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <dead_dasia> <Greek_OMEGA>    : "ᾫ"   U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <parenleft> <Greek_OMEGA>     : "ᾫ"   U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <U1F6C>            : "ᾬ"   U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F6C>       : "ᾬ"   U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <dead_acute> <U1F68>       : "ᾬ"   U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <U1F68>        : "ᾬ"   U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <U1F68>   : "ᾬ"   U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <U1F68>  : "ᾬ"   U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <U1F68>       : "ᾬ"   U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <U1F68>  : "ᾬ"   U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <dead_acute> <dead_psili> <Greek_OMEGA>    : "ᾬ"   U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <dead_acute> <Multi_key> <parenright> <Greek_OMEGA>        : "ᾬ"   U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <dead_psili> <Greek_OMEGA>     : "ᾬ"   U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <parenright> <Greek_OMEGA>     : "ᾬ"   U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <dead_psili> <Greek_OMEGA>        : "ᾬ"   U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <parenright> <Greek_OMEGA>        : "ᾬ"   U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <dead_psili> <Greek_OMEGA>       : "ᾬ"   U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <parenright> <Greek_OMEGA>       : "ᾬ"   U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <dead_psili> <Greek_OMEGA>    : "ᾬ"   U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <parenright> <Greek_OMEGA>    : "ᾬ"   U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <dead_psili> <Greek_OMEGA>       : "ᾬ"   U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <parenright> <Greek_OMEGA>       : "ᾬ"   U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <U1F6D>            : "ᾭ"   U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F6D>       : "ᾭ"   U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <dead_acute> <U1F69>       : "ᾭ"   U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <U1F69>        : "ᾭ"   U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <U1F69>   : "ᾭ"   U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <U1F69>  : "ᾭ"   U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <U1F69>       : "ᾭ"   U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <U1F69>  : "ᾭ"   U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <dead_acute> <dead_dasia> <Greek_OMEGA>    : "ᾭ"   U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <dead_acute> <Multi_key> <parenleft> <Greek_OMEGA>         : "ᾭ"   U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <dead_dasia> <Greek_OMEGA>     : "ᾭ"   U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <parenleft> <Greek_OMEGA>      : "ᾭ"   U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <dead_dasia> <Greek_OMEGA>        : "ᾭ"   U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <parenleft> <Greek_OMEGA>         : "ᾭ"   U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <dead_dasia> <Greek_OMEGA>       : "ᾭ"   U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <parenleft> <Greek_OMEGA>        : "ᾭ"   U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <dead_dasia> <Greek_OMEGA>    : "ᾭ"   U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <parenleft> <Greek_OMEGA>     : "ᾭ"   U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <dead_dasia> <Greek_OMEGA>       : "ᾭ"   U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <parenleft> <Greek_OMEGA>        : "ᾭ"   U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <U1F6E>            : "ᾮ"   U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F6E>       : "ᾮ"   U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <dead_tilde> <U1F68>       : "ᾮ"   U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <U1F68>   : "ᾮ"   U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <U1F68>  : "ᾮ"   U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <U1F68>  : "ᾮ"   U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <dead_tilde> <dead_psili> <Greek_OMEGA>    : "ᾮ"   U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <dead_tilde> <Multi_key> <parenright> <Greek_OMEGA>        : "ᾮ"   U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <dead_psili> <Greek_OMEGA>        : "ᾮ"   U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <parenright> <Greek_OMEGA>        : "ᾮ"   U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <dead_psili> <Greek_OMEGA>       : "ᾮ"   U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <parenright> <Greek_OMEGA>       : "ᾮ"   U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <dead_psili> <Greek_OMEGA>       : "ᾮ"   U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <parenright> <Greek_OMEGA>       : "ᾮ"   U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <U1F6F>            : "ᾯ"   U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F6F>       : "ᾯ"   U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <dead_tilde> <U1F69>       : "ᾯ"   U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <U1F69>   : "ᾯ"   U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <U1F69>  : "ᾯ"   U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <U1F69>  : "ᾯ"   U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <dead_tilde> <dead_dasia> <Greek_OMEGA>    : "ᾯ"   U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <dead_tilde> <Multi_key> <parenleft> <Greek_OMEGA>         : "ᾯ"   U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <dead_dasia> <Greek_OMEGA>        : "ᾯ"   U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <parenleft> <Greek_OMEGA>         : "ᾯ"   U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <dead_dasia> <Greek_OMEGA>       : "ᾯ"   U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <parenleft> <Greek_OMEGA>        : "ᾯ"   U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <dead_dasia> <Greek_OMEGA>       : "ᾯ"   U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <parenleft> <Greek_OMEGA>        : "ᾯ"   U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_breve> <Greek_alpha>             : "ᾰ"   U1FB0 # GREEK SMALL LETTER ALPHA WITH VRACHY
+<Multi_key> <U> <Greek_alpha>          : "ᾰ"   U1FB0 # GREEK SMALL LETTER ALPHA WITH VRACHY
+<Multi_key> <b> <Greek_alpha>          : "ᾰ"   U1FB0 # GREEK SMALL LETTER ALPHA WITH VRACHY
+<dead_macron> <Greek_alpha>            : "ᾱ"   U1FB1 # GREEK SMALL LETTER ALPHA WITH MACRON
+<Multi_key> <macron> <Greek_alpha>     : "ᾱ"   U1FB1 # GREEK SMALL LETTER ALPHA WITH MACRON
+<Multi_key> <underscore> <Greek_alpha>         : "ᾱ"   U1FB1 # GREEK SMALL LETTER ALPHA WITH MACRON
+<dead_iota> <U1F70>            : "ᾲ"   U1FB2 # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F70>       : "ᾲ"   U1FB2 # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <Greek_alpha>         : "ᾲ"   U1FB2 # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <Greek_alpha>  : "ᾲ"   U1FB2 # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <Greek_alpha>    : "ᾲ"   U1FB2 # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <Greek_alpha>         : "ᾲ"   U1FB2 # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+<dead_iota> <Greek_alpha>              : "ᾳ"   U1FB3 # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <Greek_alpha>         : "ᾳ"   U1FB3 # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+<dead_iota> <Greek_alphaaccent>        : "ᾴ"   U1FB4 # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <Greek_alphaaccent>   : "ᾴ"   U1FB4 # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <Greek_alpha>         : "ᾴ"   U1FB4 # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <Greek_alpha>  : "ᾴ"   U1FB4 # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <Greek_alpha>     : "ᾴ"   U1FB4 # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <Greek_alpha>    : "ᾴ"   U1FB4 # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <Greek_alpha>         : "ᾴ"   U1FB4 # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <Greek_alpha>    : "ᾴ"   U1FB4 # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+<dead_tilde> <Greek_alpha>             : "ᾶ"   U1FB6 # GREEK SMALL LETTER ALPHA WITH PERISPOMENI
+<Multi_key> <asciitilde> <Greek_alpha>         : "ᾶ"   U1FB6 # GREEK SMALL LETTER ALPHA WITH PERISPOMENI
+<dead_iota> <U1FB6>            : "ᾷ"   U1FB7 # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1FB6>       : "ᾷ"   U1FB7 # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <Greek_alpha>         : "ᾷ"   U1FB7 # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <Greek_alpha>     : "ᾷ"   U1FB7 # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <Greek_alpha>    : "ᾷ"   U1FB7 # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <Greek_alpha>    : "ᾷ"   U1FB7 # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+<dead_breve> <Greek_ALPHA>             : "Ᾰ"   U1FB8 # GREEK CAPITAL LETTER ALPHA WITH VRACHY
+<Multi_key> <U> <Greek_ALPHA>          : "Ᾰ"   U1FB8 # GREEK CAPITAL LETTER ALPHA WITH VRACHY
+<Multi_key> <b> <Greek_ALPHA>          : "Ᾰ"   U1FB8 # GREEK CAPITAL LETTER ALPHA WITH VRACHY
+<dead_macron> <Greek_ALPHA>            : "Ᾱ"   U1FB9 # GREEK CAPITAL LETTER ALPHA WITH MACRON
+<Multi_key> <macron> <Greek_ALPHA>     : "Ᾱ"   U1FB9 # GREEK CAPITAL LETTER ALPHA WITH MACRON
+<Multi_key> <underscore> <Greek_ALPHA>         : "Ᾱ"   U1FB9 # GREEK CAPITAL LETTER ALPHA WITH MACRON
+<dead_grave> <Greek_ALPHA>             : "Ὰ"   U1FBA # GREEK CAPITAL LETTER ALPHA WITH VARIA
+<Multi_key> <grave> <Greek_ALPHA>      : "Ὰ"   U1FBA # GREEK CAPITAL LETTER ALPHA WITH VARIA
+<dead_iota> <Greek_ALPHA>              : "ᾼ"   U1FBC # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <Greek_ALPHA>         : "ᾼ"   U1FBC # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+<Multi_key> <diaeresis> <dead_tilde>   : "῁"   U1FC1 # GREEK DIALYTIKA AND PERISPOMENI
+<Multi_key> <diaeresis> <asciitilde>   : "῁"   U1FC1 # GREEK DIALYTIKA AND PERISPOMENI
+<dead_iota> <U1F74>            : "ῂ"   U1FC2 # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F74>       : "ῂ"   U1FC2 # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <Greek_eta>   : "ῂ"   U1FC2 # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <Greek_eta>    : "ῂ"   U1FC2 # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <Greek_eta>      : "ῂ"   U1FC2 # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <Greek_eta>   : "ῂ"   U1FC2 # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+<dead_iota> <Greek_eta>                : "ῃ"   U1FC3 # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <Greek_eta>   : "ῃ"   U1FC3 # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+<dead_iota> <Greek_etaaccent>          : "ῄ"   U1FC4 # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <Greek_etaaccent>     : "ῄ"   U1FC4 # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <Greek_eta>   : "ῄ"   U1FC4 # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <Greek_eta>    : "ῄ"   U1FC4 # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <Greek_eta>       : "ῄ"   U1FC4 # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <Greek_eta>      : "ῄ"   U1FC4 # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <Greek_eta>   : "ῄ"   U1FC4 # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <Greek_eta>      : "ῄ"   U1FC4 # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+<dead_tilde> <Greek_eta>               : "ῆ"   U1FC6 # GREEK SMALL LETTER ETA WITH PERISPOMENI
+<Multi_key> <asciitilde> <Greek_eta>   : "ῆ"   U1FC6 # GREEK SMALL LETTER ETA WITH PERISPOMENI
+<dead_iota> <U1FC6>            : "ῇ"   U1FC7 # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1FC6>       : "ῇ"   U1FC7 # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <Greek_eta>   : "ῇ"   U1FC7 # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <Greek_eta>       : "ῇ"   U1FC7 # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <Greek_eta>      : "ῇ"   U1FC7 # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <Greek_eta>      : "ῇ"   U1FC7 # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+<dead_grave> <Greek_EPSILON>           : "Ὲ"   U1FC8 # GREEK CAPITAL LETTER EPSILON WITH VARIA
+<Multi_key> <grave> <Greek_EPSILON>    : "Ὲ"   U1FC8 # GREEK CAPITAL LETTER EPSILON WITH VARIA
+<dead_grave> <Greek_ETA>               : "Ὴ"   U1FCA # GREEK CAPITAL LETTER ETA WITH VARIA
+<Multi_key> <grave> <Greek_ETA>        : "Ὴ"   U1FCA # GREEK CAPITAL LETTER ETA WITH VARIA
+<dead_iota> <Greek_ETA>                : "ῌ"   U1FCC # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <Greek_ETA>   : "ῌ"   U1FCC # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+<Multi_key> <U1FBF> <dead_grave>       : "῍"   U1FCD # GREEK PSILI AND VARIA
+<Multi_key> <U1FBF> <grave>    : "῍"   U1FCD # GREEK PSILI AND VARIA
+<Multi_key> <U1FBF> <dead_acute>       : "῎"   U1FCE # GREEK PSILI AND OXIA
+<Multi_key> <U1FBF> <acute>    : "῎"   U1FCE # GREEK PSILI AND OXIA
+<Multi_key> <U1FBF> <apostrophe>       : "῎"   U1FCE # GREEK PSILI AND OXIA
+<Multi_key> <U1FBF> <dead_tilde>       : "῏"   U1FCF # GREEK PSILI AND PERISPOMENI
+<Multi_key> <U1FBF> <asciitilde>       : "῏"   U1FCF # GREEK PSILI AND PERISPOMENI
+<dead_breve> <Greek_iota>              : "ῐ"   U1FD0 # GREEK SMALL LETTER IOTA WITH VRACHY
+<Multi_key> <U> <Greek_iota>           : "ῐ"   U1FD0 # GREEK SMALL LETTER IOTA WITH VRACHY
+<Multi_key> <b> <Greek_iota>           : "ῐ"   U1FD0 # GREEK SMALL LETTER IOTA WITH VRACHY
+<dead_macron> <Greek_iota>             : "ῑ"   U1FD1 # GREEK SMALL LETTER IOTA WITH MACRON
+<Multi_key> <macron> <Greek_iota>      : "ῑ"   U1FD1 # GREEK SMALL LETTER IOTA WITH MACRON
+<Multi_key> <underscore> <Greek_iota>  : "ῑ"   U1FD1 # GREEK SMALL LETTER IOTA WITH MACRON
+<dead_grave> <Greek_iotadieresis>      : "ῒ"   U1FD2 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+<Multi_key> <grave> <Greek_iotadieresis>       : "ῒ"   U1FD2 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+<dead_grave> <dead_diaeresis> <Greek_iota>     : "ῒ"   U1FD2 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+<dead_grave> <Multi_key> <quotedbl> <Greek_iota>       : "ῒ"   U1FD2 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+<Multi_key> <grave> <dead_diaeresis> <Greek_iota>      : "ῒ"   U1FD2 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+<Multi_key> <grave> <quotedbl> <Greek_iota>    : "ῒ"   U1FD2 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+<dead_tilde> <Greek_iota>              : "ῖ"   U1FD6 # GREEK SMALL LETTER IOTA WITH PERISPOMENI
+<Multi_key> <asciitilde> <Greek_iota>  : "ῖ"   U1FD6 # GREEK SMALL LETTER IOTA WITH PERISPOMENI
+<dead_tilde> <Greek_iotadieresis>      : "ῗ"   U1FD7 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+<Multi_key> <asciitilde> <Greek_iotadieresis>  : "ῗ"   U1FD7 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+<dead_tilde> <dead_diaeresis> <Greek_iota>     : "ῗ"   U1FD7 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+<dead_tilde> <Multi_key> <quotedbl> <Greek_iota>       : "ῗ"   U1FD7 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+<Multi_key> <asciitilde> <dead_diaeresis> <Greek_iota>         : "ῗ"   U1FD7 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+<Multi_key> <asciitilde> <quotedbl> <Greek_iota>       : "ῗ"   U1FD7 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+<dead_breve> <Greek_IOTA>              : "Ῐ"   U1FD8 # GREEK CAPITAL LETTER IOTA WITH VRACHY
+<Multi_key> <U> <Greek_IOTA>           : "Ῐ"   U1FD8 # GREEK CAPITAL LETTER IOTA WITH VRACHY
+<Multi_key> <b> <Greek_IOTA>           : "Ῐ"   U1FD8 # GREEK CAPITAL LETTER IOTA WITH VRACHY
+<dead_macron> <Greek_IOTA>             : "Ῑ"   U1FD9 # GREEK CAPITAL LETTER IOTA WITH MACRON
+<Multi_key> <macron> <Greek_IOTA>      : "Ῑ"   U1FD9 # GREEK CAPITAL LETTER IOTA WITH MACRON
+<Multi_key> <underscore> <Greek_IOTA>  : "Ῑ"   U1FD9 # GREEK CAPITAL LETTER IOTA WITH MACRON
+<dead_grave> <Greek_IOTA>              : "Ὶ"   U1FDA # GREEK CAPITAL LETTER IOTA WITH VARIA
+<Multi_key> <grave> <Greek_IOTA>       : "Ὶ"   U1FDA # GREEK CAPITAL LETTER IOTA WITH VARIA
+<Multi_key> <U1FFE> <dead_grave>       : "῝"   U1FDD # GREEK DASIA AND VARIA
+<Multi_key> <U1FFE> <grave>    : "῝"   U1FDD # GREEK DASIA AND VARIA
+<Multi_key> <U1FFE> <dead_acute>       : "῞"   U1FDE # GREEK DASIA AND OXIA
+<Multi_key> <U1FFE> <acute>    : "῞"   U1FDE # GREEK DASIA AND OXIA
+<Multi_key> <U1FFE> <apostrophe>       : "῞"   U1FDE # GREEK DASIA AND OXIA
+<Multi_key> <U1FFE> <dead_tilde>       : "῟"   U1FDF # GREEK DASIA AND PERISPOMENI
+<Multi_key> <U1FFE> <asciitilde>       : "῟"   U1FDF # GREEK DASIA AND PERISPOMENI
+<dead_breve> <Greek_upsilon>           : "ῠ"   U1FE0 # GREEK SMALL LETTER UPSILON WITH VRACHY
+<Multi_key> <U> <Greek_upsilon>        : "ῠ"   U1FE0 # GREEK SMALL LETTER UPSILON WITH VRACHY
+<Multi_key> <b> <Greek_upsilon>        : "ῠ"   U1FE0 # GREEK SMALL LETTER UPSILON WITH VRACHY
+<dead_macron> <Greek_upsilon>          : "ῡ"   U1FE1 # GREEK SMALL LETTER UPSILON WITH MACRON
+<Multi_key> <macron> <Greek_upsilon>   : "ῡ"   U1FE1 # GREEK SMALL LETTER UPSILON WITH MACRON
+<Multi_key> <underscore> <Greek_upsilon>       : "ῡ"   U1FE1 # GREEK SMALL LETTER UPSILON WITH MACRON
+<dead_grave> <Greek_upsilondieresis>   : "ῢ"   U1FE2 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+<Multi_key> <grave> <Greek_upsilondieresis>    : "ῢ"   U1FE2 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+<dead_grave> <dead_diaeresis> <Greek_upsilon>  : "ῢ"   U1FE2 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+<dead_grave> <Multi_key> <quotedbl> <Greek_upsilon>    : "ῢ"   U1FE2 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+<Multi_key> <grave> <dead_diaeresis> <Greek_upsilon>   : "ῢ"   U1FE2 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+<Multi_key> <grave> <quotedbl> <Greek_upsilon>         : "ῢ"   U1FE2 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+<dead_psili> <Greek_rho>               : "ῤ"   U1FE4 # GREEK SMALL LETTER RHO WITH PSILI
+<Multi_key> <parenright> <Greek_rho>   : "ῤ"   U1FE4 # GREEK SMALL LETTER RHO WITH PSILI
+<dead_dasia> <Greek_rho>               : "ῥ"   U1FE5 # GREEK SMALL LETTER RHO WITH DASIA
+<Multi_key> <parenleft> <Greek_rho>    : "ῥ"   U1FE5 # GREEK SMALL LETTER RHO WITH DASIA
+<dead_tilde> <Greek_upsilon>           : "ῦ"   U1FE6 # GREEK SMALL LETTER UPSILON WITH PERISPOMENI
+<Multi_key> <asciitilde> <Greek_upsilon>       : "ῦ"   U1FE6 # GREEK SMALL LETTER UPSILON WITH PERISPOMENI
+<dead_tilde> <Greek_upsilondieresis>   : "ῧ"   U1FE7 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+<Multi_key> <asciitilde> <Greek_upsilondieresis>       : "ῧ"   U1FE7 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+<dead_tilde> <dead_diaeresis> <Greek_upsilon>  : "ῧ"   U1FE7 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+<dead_tilde> <Multi_key> <quotedbl> <Greek_upsilon>    : "ῧ"   U1FE7 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+<Multi_key> <asciitilde> <dead_diaeresis> <Greek_upsilon>      : "ῧ"   U1FE7 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+<Multi_key> <asciitilde> <quotedbl> <Greek_upsilon>    : "ῧ"   U1FE7 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+<dead_breve> <Greek_UPSILON>           : "Ῠ"   U1FE8 # GREEK CAPITAL LETTER UPSILON WITH VRACHY
+<Multi_key> <U> <Greek_UPSILON>        : "Ῠ"   U1FE8 # GREEK CAPITAL LETTER UPSILON WITH VRACHY
+<Multi_key> <b> <Greek_UPSILON>        : "Ῠ"   U1FE8 # GREEK CAPITAL LETTER UPSILON WITH VRACHY
+<dead_macron> <Greek_UPSILON>          : "Ῡ"   U1FE9 # GREEK CAPITAL LETTER UPSILON WITH MACRON
+<Multi_key> <macron> <Greek_UPSILON>   : "Ῡ"   U1FE9 # GREEK CAPITAL LETTER UPSILON WITH MACRON
+<Multi_key> <underscore> <Greek_UPSILON>       : "Ῡ"   U1FE9 # GREEK CAPITAL LETTER UPSILON WITH MACRON
+<dead_grave> <Greek_UPSILON>           : "Ὺ"   U1FEA # GREEK CAPITAL LETTER UPSILON WITH VARIA
+<Multi_key> <grave> <Greek_UPSILON>    : "Ὺ"   U1FEA # GREEK CAPITAL LETTER UPSILON WITH VARIA
+<dead_dasia> <Greek_RHO>               : "Ῥ"   U1FEC # GREEK CAPITAL LETTER RHO WITH DASIA
+<Multi_key> <parenleft> <Greek_RHO>    : "Ῥ"   U1FEC # GREEK CAPITAL LETTER RHO WITH DASIA
+<Multi_key> <diaeresis> <dead_grave>   : "῭"   U1FED # GREEK DIALYTIKA AND VARIA
+<Multi_key> <diaeresis> <grave>        : "῭"   U1FED # GREEK DIALYTIKA AND VARIA
+<dead_iota> <U1F7C>            : "ῲ"   U1FF2 # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1F7C>       : "ῲ"   U1FF2 # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <Greek_omega>         : "ῲ"   U1FF2 # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <Greek_omega>  : "ῲ"   U1FF2 # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <Greek_omega>    : "ῲ"   U1FF2 # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <Greek_omega>         : "ῲ"   U1FF2 # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+<dead_iota> <Greek_omega>              : "ῳ"   U1FF3 # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <Greek_omega>         : "ῳ"   U1FF3 # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+<dead_iota> <Greek_omegaaccent>        : "ῴ"   U1FF4 # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <Greek_omegaaccent>   : "ῴ"   U1FF4 # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <Greek_omega>         : "ῴ"   U1FF4 # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <Greek_omega>  : "ῴ"   U1FF4 # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <Greek_omega>     : "ῴ"   U1FF4 # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <Greek_omega>    : "ῴ"   U1FF4 # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <Greek_omega>         : "ῴ"   U1FF4 # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <Greek_omega>    : "ῴ"   U1FF4 # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+<dead_tilde> <Greek_omega>             : "ῶ"   U1FF6 # GREEK SMALL LETTER OMEGA WITH PERISPOMENI
+<Multi_key> <asciitilde> <Greek_omega>         : "ῶ"   U1FF6 # GREEK SMALL LETTER OMEGA WITH PERISPOMENI
+<dead_iota> <U1FF6>            : "ῷ"   U1FF7 # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1FF6>       : "ῷ"   U1FF7 # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <Greek_omega>         : "ῷ"   U1FF7 # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <Greek_omega>     : "ῷ"   U1FF7 # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <Greek_omega>    : "ῷ"   U1FF7 # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <Greek_omega>    : "ῷ"   U1FF7 # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+<dead_grave> <Greek_OMICRON>           : "Ὸ"   U1FF8 # GREEK CAPITAL LETTER OMICRON WITH VARIA
+<Multi_key> <grave> <Greek_OMICRON>    : "Ὸ"   U1FF8 # GREEK CAPITAL LETTER OMICRON WITH VARIA
+<dead_grave> <Greek_OMEGA>             : "Ὼ"   U1FFA # GREEK CAPITAL LETTER OMEGA WITH VARIA
+<Multi_key> <grave> <Greek_OMEGA>      : "Ὼ"   U1FFA # GREEK CAPITAL LETTER OMEGA WITH VARIA
+<dead_iota> <Greek_OMEGA>              : "ῼ"   U1FFC # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <Greek_OMEGA>         : "ῼ"   U1FFC # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+<dead_circumflex> <0>                  : "⁰"   U2070 # SUPERSCRIPT ZERO
+<Multi_key> <asciicircum> <0>          : "⁰"   U2070 # SUPERSCRIPT ZERO
+<dead_circumflex> <KP_0>               : "⁰"   U2070 # SUPERSCRIPT ZERO
+<Multi_key> <asciicircum> <KP_0>       : "⁰"   U2070 # SUPERSCRIPT ZERO
+<dead_circumflex> <Multi_key> <underscore> <i>         : "ⁱ"   U2071 # SUPERSCRIPT LATIN SMALL LETTER I
+<Multi_key> <asciicircum> <underscore> <i>     : "ⁱ"   U2071 # SUPERSCRIPT LATIN SMALL LETTER I
+<dead_circumflex> <Multi_key> <underbar> <i>   : "ⁱ"   U2071 # SUPERSCRIPT LATIN SMALL LETTER I
+<Multi_key> <asciicircum> <underbar> <i>       : "ⁱ"   U2071 # SUPERSCRIPT LATIN SMALL LETTER I
+<dead_circumflex> <4>                  : "⁴"   U2074 # SUPERSCRIPT FOUR
+<Multi_key> <asciicircum> <4>          : "⁴"   U2074 # SUPERSCRIPT FOUR
+<dead_circumflex> <KP_4>               : "⁴"   U2074 # SUPERSCRIPT FOUR
+<Multi_key> <asciicircum> <KP_4>       : "⁴"   U2074 # SUPERSCRIPT FOUR
+<dead_circumflex> <5>                  : "⁵"   U2075 # SUPERSCRIPT FIVE
+<Multi_key> <asciicircum> <5>          : "⁵"   U2075 # SUPERSCRIPT FIVE
+<dead_circumflex> <KP_5>               : "⁵"   U2075 # SUPERSCRIPT FIVE
+<Multi_key> <asciicircum> <KP_5>       : "⁵"   U2075 # SUPERSCRIPT FIVE
+<dead_circumflex> <6>                  : "⁶"   U2076 # SUPERSCRIPT SIX
+<Multi_key> <asciicircum> <6>          : "⁶"   U2076 # SUPERSCRIPT SIX
+<dead_circumflex> <KP_6>               : "⁶"   U2076 # SUPERSCRIPT SIX
+<Multi_key> <asciicircum> <KP_6>       : "⁶"   U2076 # SUPERSCRIPT SIX
+<dead_circumflex> <7>                  : "⁷"   U2077 # SUPERSCRIPT SEVEN
+<Multi_key> <asciicircum> <7>          : "⁷"   U2077 # SUPERSCRIPT SEVEN
+<dead_circumflex> <KP_7>               : "⁷"   U2077 # SUPERSCRIPT SEVEN
+<Multi_key> <asciicircum> <KP_7>       : "⁷"   U2077 # SUPERSCRIPT SEVEN
+<dead_circumflex> <8>                  : "⁸"   U2078 # SUPERSCRIPT EIGHT
+<Multi_key> <asciicircum> <8>          : "⁸"   U2078 # SUPERSCRIPT EIGHT
+<dead_circumflex> <KP_8>               : "⁸"   U2078 # SUPERSCRIPT EIGHT
+<Multi_key> <asciicircum> <KP_8>       : "⁸"   U2078 # SUPERSCRIPT EIGHT
+<dead_circumflex> <9>                  : "⁹"   U2079 # SUPERSCRIPT NINE
+<Multi_key> <asciicircum> <9>          : "⁹"   U2079 # SUPERSCRIPT NINE
+<dead_circumflex> <KP_9>               : "⁹"   U2079 # SUPERSCRIPT NINE
+<Multi_key> <asciicircum> <KP_9>       : "⁹"   U2079 # SUPERSCRIPT NINE
+<dead_circumflex> <plus>               : "⁺"   U207A # SUPERSCRIPT PLUS SIGN
+<Multi_key> <asciicircum> <plus>       : "⁺"   U207A # SUPERSCRIPT PLUS SIGN
+<dead_circumflex> <KP_Add>             : "⁺"   U207A # SUPERSCRIPT PLUS SIGN
+<Multi_key> <asciicircum> <KP_Add>     : "⁺"   U207A # SUPERSCRIPT PLUS SIGN
+<dead_circumflex> <U2212>      : "⁻"   U207B # SUPERSCRIPT MINUS
+<Multi_key> <asciicircum> <U2212>      : "⁻"   U207B # SUPERSCRIPT MINUS
+<dead_circumflex> <equal>              : "⁼"   U207C # SUPERSCRIPT EQUALS SIGN
+<Multi_key> <asciicircum> <equal>      : "⁼"   U207C # SUPERSCRIPT EQUALS SIGN
+<dead_circumflex> <KP_Equal>           : "⁼"   U207C # SUPERSCRIPT EQUALS SIGN
+<Multi_key> <asciicircum> <KP_Equal>   : "⁼"   U207C # SUPERSCRIPT EQUALS SIGN
+<dead_circumflex> <parenleft>          : "⁽"   U207D # SUPERSCRIPT LEFT PARENTHESIS
+<Multi_key> <asciicircum> <parenleft>  : "⁽"   U207D # SUPERSCRIPT LEFT PARENTHESIS
+<dead_circumflex> <parenright>         : "⁾"   U207E # SUPERSCRIPT RIGHT PARENTHESIS
+<Multi_key> <asciicircum> <parenright>         : "⁾"   U207E # SUPERSCRIPT RIGHT PARENTHESIS
+<dead_circumflex> <Multi_key> <underscore> <n>         : "ⁿ"   U207F # SUPERSCRIPT LATIN SMALL LETTER N
+<Multi_key> <asciicircum> <underscore> <n>     : "ⁿ"   U207F # SUPERSCRIPT LATIN SMALL LETTER N
+<dead_circumflex> <Multi_key> <underbar> <n>   : "ⁿ"   U207F # SUPERSCRIPT LATIN SMALL LETTER N
+<Multi_key> <asciicircum> <underbar> <n>       : "ⁿ"   U207F # SUPERSCRIPT LATIN SMALL LETTER N
+<Multi_key> <underscore> <0>           : "₀"   U2080 # SUBSCRIPT ZERO
+<Multi_key> <underscore> <KP_0>        : "₀"   U2080 # SUBSCRIPT ZERO
+<Multi_key> <underbar> <0>             : "₀"   U2080 # SUBSCRIPT ZERO
+<Multi_key> <underbar> <KP_0>          : "₀"   U2080 # SUBSCRIPT ZERO
+<Multi_key> <underscore> <1>           : "₁"   U2081 # SUBSCRIPT ONE
+<Multi_key> <underscore> <KP_1>        : "₁"   U2081 # SUBSCRIPT ONE
+<Multi_key> <underbar> <1>             : "₁"   U2081 # SUBSCRIPT ONE
+<Multi_key> <underbar> <KP_1>          : "₁"   U2081 # SUBSCRIPT ONE
+<Multi_key> <underscore> <2>           : "₂"   U2082 # SUBSCRIPT TWO
+<Multi_key> <underscore> <KP_Space>    : "₂"   U2082 # SUBSCRIPT TWO
+<Multi_key> <underscore> <KP_2>        : "₂"   U2082 # SUBSCRIPT TWO
+<Multi_key> <underbar> <2>             : "₂"   U2082 # SUBSCRIPT TWO
+<Multi_key> <underbar> <KP_Space>      : "₂"   U2082 # SUBSCRIPT TWO
+<Multi_key> <underbar> <KP_2>          : "₂"   U2082 # SUBSCRIPT TWO
+<Multi_key> <underscore> <3>           : "₃"   U2083 # SUBSCRIPT THREE
+<Multi_key> <underscore> <KP_3>        : "₃"   U2083 # SUBSCRIPT THREE
+<Multi_key> <underbar> <3>             : "₃"   U2083 # SUBSCRIPT THREE
+<Multi_key> <underbar> <KP_3>          : "₃"   U2083 # SUBSCRIPT THREE
+<Multi_key> <underscore> <4>           : "₄"   U2084 # SUBSCRIPT FOUR
+<Multi_key> <underscore> <KP_4>        : "₄"   U2084 # SUBSCRIPT FOUR
+<Multi_key> <underbar> <4>             : "₄"   U2084 # SUBSCRIPT FOUR
+<Multi_key> <underbar> <KP_4>          : "₄"   U2084 # SUBSCRIPT FOUR
+<Multi_key> <underscore> <5>           : "₅"   U2085 # SUBSCRIPT FIVE
+<Multi_key> <underscore> <KP_5>        : "₅"   U2085 # SUBSCRIPT FIVE
+<Multi_key> <underbar> <5>             : "₅"   U2085 # SUBSCRIPT FIVE
+<Multi_key> <underbar> <KP_5>          : "₅"   U2085 # SUBSCRIPT FIVE
+<Multi_key> <underscore> <6>           : "₆"   U2086 # SUBSCRIPT SIX
+<Multi_key> <underscore> <KP_6>        : "₆"   U2086 # SUBSCRIPT SIX
+<Multi_key> <underbar> <6>             : "₆"   U2086 # SUBSCRIPT SIX
+<Multi_key> <underbar> <KP_6>          : "₆"   U2086 # SUBSCRIPT SIX
+<Multi_key> <underscore> <7>           : "₇"   U2087 # SUBSCRIPT SEVEN
+<Multi_key> <underscore> <KP_7>        : "₇"   U2087 # SUBSCRIPT SEVEN
+<Multi_key> <underbar> <7>             : "₇"   U2087 # SUBSCRIPT SEVEN
+<Multi_key> <underbar> <KP_7>          : "₇"   U2087 # SUBSCRIPT SEVEN
+<Multi_key> <underscore> <8>           : "₈"   U2088 # SUBSCRIPT EIGHT
+<Multi_key> <underscore> <KP_8>        : "₈"   U2088 # SUBSCRIPT EIGHT
+<Multi_key> <underbar> <8>             : "₈"   U2088 # SUBSCRIPT EIGHT
+<Multi_key> <underbar> <KP_8>          : "₈"   U2088 # SUBSCRIPT EIGHT
+<Multi_key> <underscore> <9>           : "₉"   U2089 # SUBSCRIPT NINE
+<Multi_key> <underscore> <KP_9>        : "₉"   U2089 # SUBSCRIPT NINE
+<Multi_key> <underbar> <9>             : "₉"   U2089 # SUBSCRIPT NINE
+<Multi_key> <underbar> <KP_9>          : "₉"   U2089 # SUBSCRIPT NINE
+<Multi_key> <underscore> <plus>        : "₊"   U208A # SUBSCRIPT PLUS SIGN
+<Multi_key> <underscore> <KP_Add>      : "₊"   U208A # SUBSCRIPT PLUS SIGN
+<Multi_key> <underbar> <plus>          : "₊"   U208A # SUBSCRIPT PLUS SIGN
+<Multi_key> <underbar> <KP_Add>        : "₊"   U208A # SUBSCRIPT PLUS SIGN
+<Multi_key> <underscore> <U2212>       : "₋"   U208B # SUBSCRIPT MINUS
+<Multi_key> <underbar> <U2212>         : "₋"   U208B # SUBSCRIPT MINUS
+<Multi_key> <underscore> <equal>       : "₌"   U208C # SUBSCRIPT EQUALS SIGN
+<Multi_key> <underscore> <KP_Equal>    : "₌"   U208C # SUBSCRIPT EQUALS SIGN
+<Multi_key> <underbar> <equal>         : "₌"   U208C # SUBSCRIPT EQUALS SIGN
+<Multi_key> <underbar> <KP_Equal>      : "₌"   U208C # SUBSCRIPT EQUALS SIGN
+<Multi_key> <underscore> <parenleft>   : "₍"   U208D # SUBSCRIPT LEFT PARENTHESIS
+<Multi_key> <underbar> <parenleft>     : "₍"   U208D # SUBSCRIPT LEFT PARENTHESIS
+<Multi_key> <underscore> <parenright>  : "₎"   U208E # SUBSCRIPT RIGHT PARENTHESIS
+<Multi_key> <underbar> <parenright>    : "₎"   U208E # SUBSCRIPT RIGHT PARENTHESIS
+<dead_circumflex> <Multi_key> <S> <M>  : "℠"   U2120 # SERVICE MARK
+<Multi_key> <S> <M>                    : "℠"   U2120 # SERVICE MARK
+<dead_circumflex> <Multi_key> <s> <M>  : "℠"   U2120 # SERVICE MARK
+<Multi_key> <s> <M>                    : "℠"   U2120 # SERVICE MARK
+<dead_circumflex> <Multi_key> <S> <m>  : "℠"   U2120 # SERVICE MARK
+<Multi_key> <S> <m>                    : "℠"   U2120 # SERVICE MARK
+<dead_circumflex> <Multi_key> <s> <m>  : "℠"   U2120 # SERVICE MARK
+<Multi_key> <s> <m>                    : "℠"   U2120 # SERVICE MARK
+<dead_circumflex> <Multi_key> <T> <M>  : "™"   U2122 # TRADE MARK SIGN
+<Multi_key> <T> <M>                    : "™"   U2122 # TRADE MARK SIGN
+<dead_circumflex> <Multi_key> <t> <M>  : "™"   U2122 # TRADE MARK SIGN
+<Multi_key> <t> <M>                    : "™"   U2122 # TRADE MARK SIGN
+<dead_circumflex> <Multi_key> <T> <m>  : "™"   U2122 # TRADE MARK SIGN
+<Multi_key> <T> <m>                    : "™"   U2122 # TRADE MARK SIGN
+<dead_circumflex> <Multi_key> <t> <m>  : "™"   U2122 # TRADE MARK SIGN
+<Multi_key> <t> <m>                    : "™"   U2122 # TRADE MARK SIGN
+<Multi_key> <1> <7>                    : "⅐" U2150 # VULGAR FRACTION ONE SEVENTH
+<Multi_key> <1> <9>                    : "⅑" U2151 # VULGAR FRACTION ONE NINTH
+<Multi_key> <1> <1> <0>                        : "⅒" U2152 # VULGAR FRACTION ONE TENTH
+<Multi_key> <1> <3>                    : "⅓" U2153 # VULGAR FRACTION ONE THIRD
+<Multi_key> <2> <3>                    : "⅔" U2154 # VULGAR FRACTION TWO THIRDS
+<Multi_key> <1> <5>                    : "⅕" U2155 # VULGAR FRACTION ONE FIFTH
+<Multi_key> <2> <5>                    : "⅖" U2156 # VULGAR FRACTION TWO FIFTHS
+<Multi_key> <3> <5>                    : "⅗" U2157 # VULGAR FRACTION THREE FIFTHS
+<Multi_key> <4> <5>                    : "⅘" U2158 # VULGAR FRACTION FOUR FIFTHS
+<Multi_key> <1> <6>                    : "⅙" U2159 # VULGAR FRACTION ONE SIXTH
+<Multi_key> <5> <6>                    : "⅚" U215A # VULGAR FRACTION FIVE SIXTHS
+<Multi_key> <1> <8>                    : "⅛" U215B # VULGAR FRACTION ONE EIGHTH
+<Multi_key> <3> <8>                    : "⅜" U215C # VULGAR FRACTION THREE EIGHTHS
+<Multi_key> <5> <8>                    : "⅝" U215D # VULGAR FRACTION FIVE EIGHTHS
+<Multi_key> <7> <8>                    : "⅞" U215E # VULGAR FRACTION SEVEN EIGHTHS
+<Multi_key> <0> <3>                    : "↉" U2189 # VULGAR FRACTION ZERO THIRDS
+<Multi_key> <slash> <leftarrow>        : "↚"   U219A # LEFTWARDS ARROW WITH STROKE
+<Multi_key> <KP_Divide> <leftarrow>    : "↚"   U219A # LEFTWARDS ARROW WITH STROKE
+<Multi_key> <slash> <rightarrow>       : "↛"   U219B # RIGHTWARDS ARROW WITH STROKE
+<Multi_key> <KP_Divide> <rightarrow>   : "↛"   U219B # RIGHTWARDS ARROW WITH STROKE
+<Multi_key> <slash> <U2194>    : "↮"   U21AE # LEFT RIGHT ARROW WITH STROKE
+<Multi_key> <KP_Divide> <U2194>        : "↮"   U21AE # LEFT RIGHT ARROW WITH STROKE
+<Multi_key> <less> <minus>     : "←" U2190 # LEFTWARDS ARROW
+<Multi_key> <minus> <greater>  : "→" U2192 # RIGHTWARDS ARROW
+<Multi_key> <U2203> <U0338>    : "∄"   U2204 # THERE DOES NOT EXIST
+<Multi_key> <braceleft> <braceright>   : "∅"   U2205 # EMPTY SET
+<Multi_key> <U2208> <U0338>    : "∉"   U2209 # NOT AN ELEMENT OF
+<Multi_key> <U220B> <U0338>    : "∌"   U220C # DOES NOT CONTAIN AS MEMBER
+<Multi_key> <U2223> <U0338>    : "∤"   U2224 # DOES NOT DIVIDE
+<Multi_key> <U2225> <U0338>    : "∦"   U2226 # NOT PARALLEL TO
+<Multi_key> <U223C> <U0338>    : "≁"   U2241 # NOT TILDE
+<Multi_key> <U2243> <U0338>    : "≄"   U2244 # NOT ASYMPTOTICALLY EQUAL TO
+<Multi_key> <approximate> <U0338>      : "≇"   U2247 # NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+<Multi_key> <U2248> <U0338>    : "≉"   U2249 # NOT ALMOST EQUAL TO
+<Multi_key> <slash> <equal>    : "≠"   U2260 # NOT EQUAL TO
+<Multi_key> <equal> <slash>    : "≠"   U2260 # NOT EQUAL TO
+<Multi_key> <equal> <U0338>    : "≠"   U2260 # NOT EQUAL TO
+<Multi_key> <KP_Equal> <U0338>         : "≠"   U2260 # NOT EQUAL TO
+<Multi_key> <identical> <U0338>        : "≢"   U2262 # NOT IDENTICAL TO
+<Multi_key> <less> <equal>     : "≤" U2264 # LESS-THAN OR EQUAL TO
+<Multi_key> <greater> <equal>  : "≥" U2265 # GREATER-THAN OR EQUAL TO
+<Multi_key> <U224D> <U0338>    : "≭"   U226D # NOT EQUIVALENT TO
+<Multi_key> <less> <U0338>     : "≮"   U226E # NOT LESS-THAN
+<Multi_key> <leftcaret> <U0338>        : "≮"   U226E # NOT LESS-THAN
+<Multi_key> <greater> <U0338>  : "≯"   U226F # NOT GREATER-THAN
+<Multi_key> <rightcaret> <U0338>       : "≯"   U226F # NOT GREATER-THAN
+<Multi_key> <lessthanequal> <U0338>    : "≰"   U2270 # NEITHER LESS-THAN NOR EQUAL TO
+<Multi_key> <greaterthanequal> <U0338>         : "≱"   U2271 # NEITHER GREATER-THAN NOR EQUAL TO
+<Multi_key> <U2272> <U0338>    : "≴"   U2274 # NEITHER LESS-THAN NOR EQUIVALENT TO
+<Multi_key> <U2273> <U0338>    : "≵"   U2275 # NEITHER GREATER-THAN NOR EQUIVALENT TO
+<Multi_key> <U2276> <U0338>    : "≸"   U2278 # NEITHER LESS-THAN NOR GREATER-THAN
+<Multi_key> <U2277> <U0338>    : "≹"   U2279 # NEITHER GREATER-THAN NOR LESS-THAN
+<Multi_key> <U227A> <U0338>    : "⊀"   U2280 # DOES NOT PRECEDE
+<Multi_key> <U227B> <U0338>    : "⊁"   U2281 # DOES NOT SUCCEED
+<Multi_key> <includedin> <U0338>       : "⊄"   U2284 # NOT A SUBSET OF
+<Multi_key> <leftshoe> <U0338>         : "⊄"   U2284 # NOT A SUBSET OF
+<Multi_key> <includes> <U0338>         : "⊅"   U2285 # NOT A SUPERSET OF
+<Multi_key> <rightshoe> <U0338>        : "⊅"   U2285 # NOT A SUPERSET OF
+<Multi_key> <U2286> <U0338>    : "⊈"   U2288 # NEITHER A SUBSET OF NOR EQUAL TO
+<Multi_key> <U2287> <U0338>    : "⊉"   U2289 # NEITHER A SUPERSET OF NOR EQUAL TO
+<Multi_key> <righttack> <U0338>        : "⊬"   U22AC # DOES NOT PROVE
+<Multi_key> <U22A8> <U0338>    : "⊭"   U22AD # NOT TRUE
+<Multi_key> <U22A9> <U0338>    : "⊮"   U22AE # DOES NOT FORCE
+<Multi_key> <U22AB> <U0338>    : "⊯"   U22AF # NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+<Multi_key> <U227C> <U0338>    : "⋠"   U22E0 # DOES NOT PRECEDE OR EQUAL
+<Multi_key> <U227D> <U0338>    : "⋡"   U22E1 # DOES NOT SUCCEED OR EQUAL
+<Multi_key> <U2291> <U0338>    : "⋢"   U22E2 # NOT SQUARE IMAGE OF OR EQUAL TO
+<Multi_key> <U2292> <U0338>    : "⋣"   U22E3 # NOT SQUARE ORIGINAL OF OR EQUAL TO
+<Multi_key> <U22B2> <U0338>    : "⋪"   U22EA # NOT NORMAL SUBGROUP OF
+<Multi_key> <U22B3> <U0338>    : "⋫"   U22EB # DOES NOT CONTAIN AS NORMAL SUBGROUP
+<Multi_key> <U22B4> <U0338>    : "⋬"   U22EC # NOT NORMAL SUBGROUP OF OR EQUAL TO
+<Multi_key> <U22B5> <U0338>    : "⋭"   U22ED # DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+<Multi_key> <d> <i>            : "⌀"   U2300 # DIAMETER SIGN
+<Multi_key> <parenleft> <1> <parenright>       : "①"   U2460 # CIRCLED DIGIT ONE
+<Multi_key> <parenleft> <KP_1> <parenright>    : "①"   U2460 # CIRCLED DIGIT ONE
+<Multi_key> <parenleft> <2> <parenright>       : "②"   U2461 # CIRCLED DIGIT TWO
+<Multi_key> <parenleft> <KP_Space> <parenright>        : "②"   U2461 # CIRCLED DIGIT TWO
+<Multi_key> <parenleft> <KP_2> <parenright>    : "②"   U2461 # CIRCLED DIGIT TWO
+<Multi_key> <parenleft> <3> <parenright>       : "③"   U2462 # CIRCLED DIGIT THREE
+<Multi_key> <parenleft> <KP_3> <parenright>    : "③"   U2462 # CIRCLED DIGIT THREE
+<Multi_key> <parenleft> <4> <parenright>       : "④"   U2463 # CIRCLED DIGIT FOUR
+<Multi_key> <parenleft> <KP_4> <parenright>    : "④"   U2463 # CIRCLED DIGIT FOUR
+<Multi_key> <parenleft> <5> <parenright>       : "⑤"   U2464 # CIRCLED DIGIT FIVE
+<Multi_key> <parenleft> <KP_5> <parenright>    : "⑤"   U2464 # CIRCLED DIGIT FIVE
+<Multi_key> <parenleft> <6> <parenright>       : "⑥"   U2465 # CIRCLED DIGIT SIX
+<Multi_key> <parenleft> <KP_6> <parenright>    : "⑥"   U2465 # CIRCLED DIGIT SIX
+<Multi_key> <parenleft> <7> <parenright>       : "⑦"   U2466 # CIRCLED DIGIT SEVEN
+<Multi_key> <parenleft> <KP_7> <parenright>    : "⑦"   U2466 # CIRCLED DIGIT SEVEN
+<Multi_key> <parenleft> <8> <parenright>       : "⑧"   U2467 # CIRCLED DIGIT EIGHT
+<Multi_key> <parenleft> <KP_8> <parenright>    : "⑧"   U2467 # CIRCLED DIGIT EIGHT
+<Multi_key> <parenleft> <9> <parenright>       : "⑨"   U2468 # CIRCLED DIGIT NINE
+<Multi_key> <parenleft> <KP_9> <parenright>    : "⑨"   U2468 # CIRCLED DIGIT NINE
+<Multi_key> <parenleft> <1> <0> <parenright>   : "⑩"   U2469 # CIRCLED NUMBER TEN
+<Multi_key> <parenleft> <1> <KP_0> <parenright>        : "⑩"   U2469 # CIRCLED NUMBER TEN
+<Multi_key> <parenleft> <KP_1> <0> <parenright>        : "⑩"   U2469 # CIRCLED NUMBER TEN
+<Multi_key> <parenleft> <KP_1> <KP_0> <parenright>     : "⑩"   U2469 # CIRCLED NUMBER TEN
+<Multi_key> <parenleft> <1> <1> <parenright>   : "⑪"   U246A # CIRCLED NUMBER ELEVEN
+<Multi_key> <parenleft> <1> <KP_1> <parenright>        : "⑪"   U246A # CIRCLED NUMBER ELEVEN
+<Multi_key> <parenleft> <KP_1> <1> <parenright>        : "⑪"   U246A # CIRCLED NUMBER ELEVEN
+<Multi_key> <parenleft> <KP_1> <KP_1> <parenright>     : "⑪"   U246A # CIRCLED NUMBER ELEVEN
+<Multi_key> <parenleft> <1> <2> <parenright>   : "⑫"   U246B # CIRCLED NUMBER TWELVE
+<Multi_key> <parenleft> <1> <KP_Space> <parenright>    : "⑫"   U246B # CIRCLED NUMBER TWELVE
+<Multi_key> <parenleft> <1> <KP_2> <parenright>        : "⑫"   U246B # CIRCLED NUMBER TWELVE
+<Multi_key> <parenleft> <KP_1> <2> <parenright>        : "⑫"   U246B # CIRCLED NUMBER TWELVE
+<Multi_key> <parenleft> <KP_1> <KP_Space> <parenright>         : "⑫"   U246B # CIRCLED NUMBER TWELVE
+<Multi_key> <parenleft> <KP_1> <KP_2> <parenright>     : "⑫"   U246B # CIRCLED NUMBER TWELVE
+<Multi_key> <parenleft> <1> <3> <parenright>   : "⑬"   U246C # CIRCLED NUMBER THIRTEEN
+<Multi_key> <parenleft> <1> <KP_3> <parenright>        : "⑬"   U246C # CIRCLED NUMBER THIRTEEN
+<Multi_key> <parenleft> <KP_1> <3> <parenright>        : "⑬"   U246C # CIRCLED NUMBER THIRTEEN
+<Multi_key> <parenleft> <KP_1> <KP_3> <parenright>     : "⑬"   U246C # CIRCLED NUMBER THIRTEEN
+<Multi_key> <parenleft> <1> <4> <parenright>   : "⑭"   U246D # CIRCLED NUMBER FOURTEEN
+<Multi_key> <parenleft> <1> <KP_4> <parenright>        : "⑭"   U246D # CIRCLED NUMBER FOURTEEN
+<Multi_key> <parenleft> <KP_1> <4> <parenright>        : "⑭"   U246D # CIRCLED NUMBER FOURTEEN
+<Multi_key> <parenleft> <KP_1> <KP_4> <parenright>     : "⑭"   U246D # CIRCLED NUMBER FOURTEEN
+<Multi_key> <parenleft> <1> <5> <parenright>   : "⑮"   U246E # CIRCLED NUMBER FIFTEEN
+<Multi_key> <parenleft> <1> <KP_5> <parenright>        : "⑮"   U246E # CIRCLED NUMBER FIFTEEN
+<Multi_key> <parenleft> <KP_1> <5> <parenright>        : "⑮"   U246E # CIRCLED NUMBER FIFTEEN
+<Multi_key> <parenleft> <KP_1> <KP_5> <parenright>     : "⑮"   U246E # CIRCLED NUMBER FIFTEEN
+<Multi_key> <parenleft> <1> <6> <parenright>   : "⑯"   U246F # CIRCLED NUMBER SIXTEEN
+<Multi_key> <parenleft> <1> <KP_6> <parenright>        : "⑯"   U246F # CIRCLED NUMBER SIXTEEN
+<Multi_key> <parenleft> <KP_1> <6> <parenright>        : "⑯"   U246F # CIRCLED NUMBER SIXTEEN
+<Multi_key> <parenleft> <KP_1> <KP_6> <parenright>     : "⑯"   U246F # CIRCLED NUMBER SIXTEEN
+<Multi_key> <parenleft> <1> <7> <parenright>   : "⑰"   U2470 # CIRCLED NUMBER SEVENTEEN
+<Multi_key> <parenleft> <1> <KP_7> <parenright>        : "⑰"   U2470 # CIRCLED NUMBER SEVENTEEN
+<Multi_key> <parenleft> <KP_1> <7> <parenright>        : "⑰"   U2470 # CIRCLED NUMBER SEVENTEEN
+<Multi_key> <parenleft> <KP_1> <KP_7> <parenright>     : "⑰"   U2470 # CIRCLED NUMBER SEVENTEEN
+<Multi_key> <parenleft> <1> <8> <parenright>   : "⑱"   U2471 # CIRCLED NUMBER EIGHTEEN
+<Multi_key> <parenleft> <1> <KP_8> <parenright>        : "⑱"   U2471 # CIRCLED NUMBER EIGHTEEN
+<Multi_key> <parenleft> <KP_1> <8> <parenright>        : "⑱"   U2471 # CIRCLED NUMBER EIGHTEEN
+<Multi_key> <parenleft> <KP_1> <KP_8> <parenright>     : "⑱"   U2471 # CIRCLED NUMBER EIGHTEEN
+<Multi_key> <parenleft> <1> <9> <parenright>   : "⑲"   U2472 # CIRCLED NUMBER NINETEEN
+<Multi_key> <parenleft> <1> <KP_9> <parenright>        : "⑲"   U2472 # CIRCLED NUMBER NINETEEN
+<Multi_key> <parenleft> <KP_1> <9> <parenright>        : "⑲"   U2472 # CIRCLED NUMBER NINETEEN
+<Multi_key> <parenleft> <KP_1> <KP_9> <parenright>     : "⑲"   U2472 # CIRCLED NUMBER NINETEEN
+<Multi_key> <parenleft> <2> <0> <parenright>   : "⑳"   U2473 # CIRCLED NUMBER TWENTY
+<Multi_key> <parenleft> <2> <KP_0> <parenright>        : "⑳"   U2473 # CIRCLED NUMBER TWENTY
+<Multi_key> <parenleft> <KP_Space> <0> <parenright>    : "⑳"   U2473 # CIRCLED NUMBER TWENTY
+<Multi_key> <parenleft> <KP_Space> <KP_0> <parenright>         : "⑳"   U2473 # CIRCLED NUMBER TWENTY
+<Multi_key> <parenleft> <KP_2> <0> <parenright>        : "⑳"   U2473 # CIRCLED NUMBER TWENTY
+<Multi_key> <parenleft> <KP_2> <KP_0> <parenright>     : "⑳"   U2473 # CIRCLED NUMBER TWENTY
+<Multi_key> <parenleft> <A> <parenright>       : "Ⓐ"   U24B6 # CIRCLED LATIN CAPITAL LETTER A
+<Multi_key> <parenleft> <B> <parenright>       : "Ⓑ"   U24B7 # CIRCLED LATIN CAPITAL LETTER B
+<Multi_key> <parenleft> <C> <parenright>       : "Ⓒ"   U24B8 # CIRCLED LATIN CAPITAL LETTER C
+<Multi_key> <parenleft> <D> <parenright>       : "Ⓓ"   U24B9 # CIRCLED LATIN CAPITAL LETTER D
+<Multi_key> <parenleft> <E> <parenright>       : "Ⓔ"   U24BA # CIRCLED LATIN CAPITAL LETTER E
+<Multi_key> <parenleft> <F> <parenright>       : "Ⓕ"   U24BB # CIRCLED LATIN CAPITAL LETTER F
+<Multi_key> <parenleft> <G> <parenright>       : "Ⓖ"   U24BC # CIRCLED LATIN CAPITAL LETTER G
+<Multi_key> <parenleft> <H> <parenright>       : "Ⓗ"   U24BD # CIRCLED LATIN CAPITAL LETTER H
+<Multi_key> <parenleft> <I> <parenright>       : "Ⓘ"   U24BE # CIRCLED LATIN CAPITAL LETTER I
+<Multi_key> <parenleft> <J> <parenright>       : "Ⓙ"   U24BF # CIRCLED LATIN CAPITAL LETTER J
+<Multi_key> <parenleft> <K> <parenright>       : "Ⓚ"   U24C0 # CIRCLED LATIN CAPITAL LETTER K
+<Multi_key> <parenleft> <L> <parenright>       : "Ⓛ"   U24C1 # CIRCLED LATIN CAPITAL LETTER L
+<Multi_key> <parenleft> <M> <parenright>       : "Ⓜ"   U24C2 # CIRCLED LATIN CAPITAL LETTER M
+<Multi_key> <parenleft> <N> <parenright>       : "Ⓝ"   U24C3 # CIRCLED LATIN CAPITAL LETTER N
+<Multi_key> <parenleft> <O> <parenright>       : "Ⓞ"   U24C4 # CIRCLED LATIN CAPITAL LETTER O
+<Multi_key> <parenleft> <P> <parenright>       : "Ⓟ"   U24C5 # CIRCLED LATIN CAPITAL LETTER P
+<Multi_key> <parenleft> <Q> <parenright>       : "Ⓠ"   U24C6 # CIRCLED LATIN CAPITAL LETTER Q
+<Multi_key> <parenleft> <R> <parenright>       : "Ⓡ"   U24C7 # CIRCLED LATIN CAPITAL LETTER R
+<Multi_key> <parenleft> <S> <parenright>       : "Ⓢ"   U24C8 # CIRCLED LATIN CAPITAL LETTER S
+<Multi_key> <parenleft> <T> <parenright>       : "Ⓣ"   U24C9 # CIRCLED LATIN CAPITAL LETTER T
+<Multi_key> <parenleft> <U> <parenright>       : "Ⓤ"   U24CA # CIRCLED LATIN CAPITAL LETTER U
+<Multi_key> <parenleft> <V> <parenright>       : "Ⓥ"   U24CB # CIRCLED LATIN CAPITAL LETTER V
+<Multi_key> <parenleft> <W> <parenright>       : "Ⓦ"   U24CC # CIRCLED LATIN CAPITAL LETTER W
+<Multi_key> <parenleft> <X> <parenright>       : "Ⓧ"   U24CD # CIRCLED LATIN CAPITAL LETTER X
+<Multi_key> <parenleft> <Y> <parenright>       : "Ⓨ"   U24CE # CIRCLED LATIN CAPITAL LETTER Y
+<Multi_key> <parenleft> <Z> <parenright>       : "Ⓩ"   U24CF # CIRCLED LATIN CAPITAL LETTER Z
+<Multi_key> <parenleft> <a> <parenright>       : "ⓐ"   U24D0 # CIRCLED LATIN SMALL LETTER A
+<Multi_key> <parenleft> <b> <parenright>       : "ⓑ"   U24D1 # CIRCLED LATIN SMALL LETTER B
+<Multi_key> <parenleft> <c> <parenright>       : "ⓒ"   U24D2 # CIRCLED LATIN SMALL LETTER C
+<Multi_key> <parenleft> <d> <parenright>       : "ⓓ"   U24D3 # CIRCLED LATIN SMALL LETTER D
+<Multi_key> <parenleft> <e> <parenright>       : "ⓔ"   U24D4 # CIRCLED LATIN SMALL LETTER E
+<Multi_key> <parenleft> <f> <parenright>       : "ⓕ"   U24D5 # CIRCLED LATIN SMALL LETTER F
+<Multi_key> <parenleft> <g> <parenright>       : "ⓖ"   U24D6 # CIRCLED LATIN SMALL LETTER G
+<Multi_key> <parenleft> <h> <parenright>       : "ⓗ"   U24D7 # CIRCLED LATIN SMALL LETTER H
+<Multi_key> <parenleft> <i> <parenright>       : "ⓘ"   U24D8 # CIRCLED LATIN SMALL LETTER I
+<Multi_key> <parenleft> <j> <parenright>       : "ⓙ"   U24D9 # CIRCLED LATIN SMALL LETTER J
+<Multi_key> <parenleft> <k> <parenright>       : "ⓚ"   U24DA # CIRCLED LATIN SMALL LETTER K
+<Multi_key> <parenleft> <l> <parenright>       : "ⓛ"   U24DB # CIRCLED LATIN SMALL LETTER L
+<Multi_key> <parenleft> <m> <parenright>       : "ⓜ"   U24DC # CIRCLED LATIN SMALL LETTER M
+<Multi_key> <parenleft> <n> <parenright>       : "ⓝ"   U24DD # CIRCLED LATIN SMALL LETTER N
+<Multi_key> <parenleft> <o> <parenright>       : "ⓞ"   U24DE # CIRCLED LATIN SMALL LETTER O
+<Multi_key> <parenleft> <p> <parenright>       : "ⓟ"   U24DF # CIRCLED LATIN SMALL LETTER P
+<Multi_key> <parenleft> <q> <parenright>       : "ⓠ"   U24E0 # CIRCLED LATIN SMALL LETTER Q
+<Multi_key> <parenleft> <r> <parenright>       : "ⓡ"   U24E1 # CIRCLED LATIN SMALL LETTER R
+<Multi_key> <parenleft> <s> <parenright>       : "ⓢ"   U24E2 # CIRCLED LATIN SMALL LETTER S
+<Multi_key> <parenleft> <t> <parenright>       : "ⓣ"   U24E3 # CIRCLED LATIN SMALL LETTER T
+<Multi_key> <parenleft> <u> <parenright>       : "ⓤ"   U24E4 # CIRCLED LATIN SMALL LETTER U
+<Multi_key> <parenleft> <v> <parenright>       : "ⓥ"   U24E5 # CIRCLED LATIN SMALL LETTER V
+<Multi_key> <parenleft> <w> <parenright>       : "ⓦ"   U24E6 # CIRCLED LATIN SMALL LETTER W
+<Multi_key> <parenleft> <x> <parenright>       : "ⓧ"   U24E7 # CIRCLED LATIN SMALL LETTER X
+<Multi_key> <parenleft> <y> <parenright>       : "ⓨ"   U24E8 # CIRCLED LATIN SMALL LETTER Y
+<Multi_key> <parenleft> <z> <parenright>       : "ⓩ"   U24E9 # CIRCLED LATIN SMALL LETTER Z
+<Multi_key> <parenleft> <0> <parenright>       : "⓪"   U24EA # CIRCLED DIGIT ZERO
+<Multi_key> <parenleft> <KP_0> <parenright>    : "⓪"   U24EA # CIRCLED DIGIT ZERO
+<dead_belowdot> <plus>                  : "⨥"   U2A25 # PLUS SIGN WITH DOT BELOW
+<dead_belowtilde> <plus>                : "⨦"   U2A26 # PLUS SIGN WITH TILDE BELOW
+<dead_belowdot> <minus>                 : "⨪"   U2A2A # MINUS SIGN WITH DOT BELOW
+<dead_belowdot> <equal>                 : "⩦"   U2A66 # EQUALS SIGN WITH DOT BELOW
+<dead_diaeresis> <dead_belowdiaeresis> <equal> : "⩷"   U2A77 # EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
+<dead_belowdiaeresis> <dead_diaeresis> <equal> : "⩷"   U2A77 # EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW
+<Multi_key> <U2ADD> <U0338>    : "⫝̸"   U2ADC # FORKING
+<dead_belowring> <bar>                  : "⫰"   U2AF0 # VERTICAL LINE WITH CIRCLE BELOW
+<dead_voiced_sound> <U304B>    : "が"   U304C # HIRAGANA LETTER GA
+<dead_voiced_sound> <U304D>    : "ぎ"   U304E # HIRAGANA LETTER GI
+<dead_voiced_sound> <U304F>    : "ぐ"   U3050 # HIRAGANA LETTER GU
+<dead_voiced_sound> <U3051>    : "げ"   U3052 # HIRAGANA LETTER GE
+<dead_voiced_sound> <U3053>    : "ご"   U3054 # HIRAGANA LETTER GO
+<dead_voiced_sound> <U3055>    : "ざ"   U3056 # HIRAGANA LETTER ZA
+<dead_voiced_sound> <U3057>    : "じ"   U3058 # HIRAGANA LETTER ZI
+<dead_voiced_sound> <U3059>    : "ず"   U305A # HIRAGANA LETTER ZU
+<dead_voiced_sound> <U305B>    : "ぜ"   U305C # HIRAGANA LETTER ZE
+<dead_voiced_sound> <U305D>    : "ぞ"   U305E # HIRAGANA LETTER ZO
+<dead_voiced_sound> <U305F>    : "だ"   U3060 # HIRAGANA LETTER DA
+<dead_voiced_sound> <U3061>    : "ぢ"   U3062 # HIRAGANA LETTER DI
+<dead_voiced_sound> <U3064>    : "づ"   U3065 # HIRAGANA LETTER DU
+<dead_voiced_sound> <U3066>    : "で"   U3067 # HIRAGANA LETTER DE
+<dead_voiced_sound> <U3068>    : "ど"   U3069 # HIRAGANA LETTER DO
+<dead_voiced_sound> <U306F>    : "ば"   U3070 # HIRAGANA LETTER BA
+<dead_semivoiced_sound> <U306F>        : "ぱ"   U3071 # HIRAGANA LETTER PA
+<dead_voiced_sound> <U3072>    : "び"   U3073 # HIRAGANA LETTER BI
+<dead_semivoiced_sound> <U3072>        : "ぴ"   U3074 # HIRAGANA LETTER PI
+<dead_voiced_sound> <U3075>    : "ぶ"   U3076 # HIRAGANA LETTER BU
+<dead_semivoiced_sound> <U3075>        : "ぷ"   U3077 # HIRAGANA LETTER PU
+<dead_voiced_sound> <U3078>    : "べ"   U3079 # HIRAGANA LETTER BE
+<dead_semivoiced_sound> <U3078>        : "ぺ"   U307A # HIRAGANA LETTER PE
+<dead_voiced_sound> <U307B>    : "ぼ"   U307C # HIRAGANA LETTER BO
+<dead_semivoiced_sound> <U307B>        : "ぽ"   U307D # HIRAGANA LETTER PO
+<dead_voiced_sound> <U3046>    : "ゔ"   U3094 # HIRAGANA LETTER VU
+<dead_voiced_sound> <U309D>    : "ゞ"   U309E # HIRAGANA VOICED ITERATION MARK
+<dead_voiced_sound> <kana_KA>          : "ガ"   U30AC # KATAKANA LETTER GA
+<dead_voiced_sound> <kana_KI>          : "ギ"   U30AE # KATAKANA LETTER GI
+<dead_voiced_sound> <kana_KU>          : "グ"   U30B0 # KATAKANA LETTER GU
+<dead_voiced_sound> <kana_KE>          : "ゲ"   U30B2 # KATAKANA LETTER GE
+<dead_voiced_sound> <kana_KO>          : "ゴ"   U30B4 # KATAKANA LETTER GO
+<dead_voiced_sound> <kana_SA>          : "ザ"   U30B6 # KATAKANA LETTER ZA
+<dead_voiced_sound> <kana_SHI>         : "ジ"   U30B8 # KATAKANA LETTER ZI
+<dead_voiced_sound> <kana_SU>          : "ズ"   U30BA # KATAKANA LETTER ZU
+<dead_voiced_sound> <kana_SE>          : "ゼ"   U30BC # KATAKANA LETTER ZE
+<dead_voiced_sound> <kana_SO>          : "ゾ"   U30BE # KATAKANA LETTER ZO
+<dead_voiced_sound> <kana_TA>          : "ダ"   U30C0 # KATAKANA LETTER DA
+<dead_voiced_sound> <kana_CHI>         : "ヂ"   U30C2 # KATAKANA LETTER DI
+<dead_voiced_sound> <kana_TSU>         : "ヅ"   U30C5 # KATAKANA LETTER DU
+<dead_voiced_sound> <kana_TE>          : "デ"   U30C7 # KATAKANA LETTER DE
+<dead_voiced_sound> <kana_TO>          : "ド"   U30C9 # KATAKANA LETTER DO
+<dead_voiced_sound> <kana_HA>          : "バ"   U30D0 # KATAKANA LETTER BA
+<dead_semivoiced_sound> <kana_HA>      : "パ"   U30D1 # KATAKANA LETTER PA
+<dead_voiced_sound> <kana_HI>          : "ビ"   U30D3 # KATAKANA LETTER BI
+<dead_semivoiced_sound> <kana_HI>      : "ピ"   U30D4 # KATAKANA LETTER PI
+<dead_voiced_sound> <kana_FU>          : "ブ"   U30D6 # KATAKANA LETTER BU
+<dead_semivoiced_sound> <kana_FU>      : "プ"   U30D7 # KATAKANA LETTER PU
+<dead_voiced_sound> <kana_HE>          : "ベ"   U30D9 # KATAKANA LETTER BE
+<dead_semivoiced_sound> <kana_HE>      : "ペ"   U30DA # KATAKANA LETTER PE
+<dead_voiced_sound> <kana_HO>          : "ボ"   U30DC # KATAKANA LETTER BO
+<dead_semivoiced_sound> <kana_HO>      : "ポ"   U30DD # KATAKANA LETTER PO
+<dead_voiced_sound> <kana_U>           : "ヴ"   U30F4 # KATAKANA LETTER VU
+<dead_voiced_sound> <kana_WA>          : "ヷ"   U30F7 # KATAKANA LETTER VA
+<dead_voiced_sound> <U30F0>    : "ヸ"   U30F8 # KATAKANA LETTER VI
+<dead_voiced_sound> <U30F1>    : "ヹ"   U30F9 # KATAKANA LETTER VE
+<dead_voiced_sound> <kana_WO>          : "ヺ"   U30FA # KATAKANA LETTER VO
+<dead_voiced_sound> <U30FD>    : "ヾ"   U30FE # KATAKANA VOICED ITERATION MARK
+<dead_circumflex> <U4E00>      : "㆒"   U3192 # IDEOGRAPHIC ANNOTATION ONE MARK
+<Multi_key> <asciicircum> <U4E00>      : "㆒"   U3192 # IDEOGRAPHIC ANNOTATION ONE MARK
+<dead_circumflex> <U4E8C>      : "㆓"   U3193 # IDEOGRAPHIC ANNOTATION TWO MARK
+<Multi_key> <asciicircum> <U4E8C>      : "㆓"   U3193 # IDEOGRAPHIC ANNOTATION TWO MARK
+<dead_circumflex> <U4E09>      : "㆔"   U3194 # IDEOGRAPHIC ANNOTATION THREE MARK
+<Multi_key> <asciicircum> <U4E09>      : "㆔"   U3194 # IDEOGRAPHIC ANNOTATION THREE MARK
+<dead_circumflex> <U56DB>      : "㆕"   U3195 # IDEOGRAPHIC ANNOTATION FOUR MARK
+<Multi_key> <asciicircum> <U56DB>      : "㆕"   U3195 # IDEOGRAPHIC ANNOTATION FOUR MARK
+<dead_circumflex> <U4E0A>      : "㆖"   U3196 # IDEOGRAPHIC ANNOTATION TOP MARK
+<Multi_key> <asciicircum> <U4E0A>      : "㆖"   U3196 # IDEOGRAPHIC ANNOTATION TOP MARK
+<dead_circumflex> <U4E2D>      : "㆗"   U3197 # IDEOGRAPHIC ANNOTATION MIDDLE MARK
+<Multi_key> <asciicircum> <U4E2D>      : "㆗"   U3197 # IDEOGRAPHIC ANNOTATION MIDDLE MARK
+<dead_circumflex> <U4E0B>      : "㆘"   U3198 # IDEOGRAPHIC ANNOTATION BOTTOM MARK
+<Multi_key> <asciicircum> <U4E0B>      : "㆘"   U3198 # IDEOGRAPHIC ANNOTATION BOTTOM MARK
+<dead_circumflex> <U7532>      : "㆙"   U3199 # IDEOGRAPHIC ANNOTATION FIRST MARK
+<Multi_key> <asciicircum> <U7532>      : "㆙"   U3199 # IDEOGRAPHIC ANNOTATION FIRST MARK
+<dead_circumflex> <U4E59>      : "㆚"   U319A # IDEOGRAPHIC ANNOTATION SECOND MARK
+<Multi_key> <asciicircum> <U4E59>      : "㆚"   U319A # IDEOGRAPHIC ANNOTATION SECOND MARK
+<dead_circumflex> <U4E19>      : "㆛"   U319B # IDEOGRAPHIC ANNOTATION THIRD MARK
+<Multi_key> <asciicircum> <U4E19>      : "㆛"   U319B # IDEOGRAPHIC ANNOTATION THIRD MARK
+<dead_circumflex> <U4E01>      : "㆜"   U319C # IDEOGRAPHIC ANNOTATION FOURTH MARK
+<Multi_key> <asciicircum> <U4E01>      : "㆜"   U319C # IDEOGRAPHIC ANNOTATION FOURTH MARK
+<dead_circumflex> <U5929>      : "㆝"   U319D # IDEOGRAPHIC ANNOTATION HEAVEN MARK
+<Multi_key> <asciicircum> <U5929>      : "㆝"   U319D # IDEOGRAPHIC ANNOTATION HEAVEN MARK
+<dead_circumflex> <U5730>      : "㆞"   U319E # IDEOGRAPHIC ANNOTATION EARTH MARK
+<Multi_key> <asciicircum> <U5730>      : "㆞"   U319E # IDEOGRAPHIC ANNOTATION EARTH MARK
+<dead_circumflex> <U4EBA>      : "㆟"   U319F # IDEOGRAPHIC ANNOTATION MAN MARK
+<Multi_key> <asciicircum> <U4EBA>      : "㆟"   U319F # IDEOGRAPHIC ANNOTATION MAN MARK
+<Multi_key> <parenleft> <2> <1> <parenright>   : "㉑"   U3251 # CIRCLED NUMBER TWENTY ONE
+<Multi_key> <parenleft> <2> <KP_1> <parenright>        : "㉑"   U3251 # CIRCLED NUMBER TWENTY ONE
+<Multi_key> <parenleft> <KP_Space> <1> <parenright>    : "㉑"   U3251 # CIRCLED NUMBER TWENTY ONE
+<Multi_key> <parenleft> <KP_Space> <KP_1> <parenright>         : "㉑"   U3251 # CIRCLED NUMBER TWENTY ONE
+<Multi_key> <parenleft> <KP_2> <1> <parenright>        : "㉑"   U3251 # CIRCLED NUMBER TWENTY ONE
+<Multi_key> <parenleft> <KP_2> <KP_1> <parenright>     : "㉑"   U3251 # CIRCLED NUMBER TWENTY ONE
+<Multi_key> <parenleft> <2> <2> <parenright>   : "㉒"   U3252 # CIRCLED NUMBER TWENTY TWO
+<Multi_key> <parenleft> <2> <KP_Space> <parenright>    : "㉒"   U3252 # CIRCLED NUMBER TWENTY TWO
+<Multi_key> <parenleft> <2> <KP_2> <parenright>        : "㉒"   U3252 # CIRCLED NUMBER TWENTY TWO
+<Multi_key> <parenleft> <KP_Space> <2> <parenright>    : "㉒"   U3252 # CIRCLED NUMBER TWENTY TWO
+<Multi_key> <parenleft> <KP_Space> <KP_Space> <parenright>     : "㉒"   U3252 # CIRCLED NUMBER TWENTY TWO
+<Multi_key> <parenleft> <KP_Space> <KP_2> <parenright>         : "㉒"   U3252 # CIRCLED NUMBER TWENTY TWO
+<Multi_key> <parenleft> <KP_2> <2> <parenright>        : "㉒"   U3252 # CIRCLED NUMBER TWENTY TWO
+<Multi_key> <parenleft> <KP_2> <KP_Space> <parenright>         : "㉒"   U3252 # CIRCLED NUMBER TWENTY TWO
+<Multi_key> <parenleft> <KP_2> <KP_2> <parenright>     : "㉒"   U3252 # CIRCLED NUMBER TWENTY TWO
+<Multi_key> <parenleft> <2> <3> <parenright>   : "㉓"   U3253 # CIRCLED NUMBER TWENTY THREE
+<Multi_key> <parenleft> <2> <KP_3> <parenright>        : "㉓"   U3253 # CIRCLED NUMBER TWENTY THREE
+<Multi_key> <parenleft> <KP_Space> <3> <parenright>    : "㉓"   U3253 # CIRCLED NUMBER TWENTY THREE
+<Multi_key> <parenleft> <KP_Space> <KP_3> <parenright>         : "㉓"   U3253 # CIRCLED NUMBER TWENTY THREE
+<Multi_key> <parenleft> <KP_2> <3> <parenright>        : "㉓"   U3253 # CIRCLED NUMBER TWENTY THREE
+<Multi_key> <parenleft> <KP_2> <KP_3> <parenright>     : "㉓"   U3253 # CIRCLED NUMBER TWENTY THREE
+<Multi_key> <parenleft> <2> <4> <parenright>   : "㉔"   U3254 # CIRCLED NUMBER TWENTY FOUR
+<Multi_key> <parenleft> <2> <KP_4> <parenright>        : "㉔"   U3254 # CIRCLED NUMBER TWENTY FOUR
+<Multi_key> <parenleft> <KP_Space> <4> <parenright>    : "㉔"   U3254 # CIRCLED NUMBER TWENTY FOUR
+<Multi_key> <parenleft> <KP_Space> <KP_4> <parenright>         : "㉔"   U3254 # CIRCLED NUMBER TWENTY FOUR
+<Multi_key> <parenleft> <KP_2> <4> <parenright>        : "㉔"   U3254 # CIRCLED NUMBER TWENTY FOUR
+<Multi_key> <parenleft> <KP_2> <KP_4> <parenright>     : "㉔"   U3254 # CIRCLED NUMBER TWENTY FOUR
+<Multi_key> <parenleft> <2> <5> <parenright>   : "㉕"   U3255 # CIRCLED NUMBER TWENTY FIVE
+<Multi_key> <parenleft> <2> <KP_5> <parenright>        : "㉕"   U3255 # CIRCLED NUMBER TWENTY FIVE
+<Multi_key> <parenleft> <KP_Space> <5> <parenright>    : "㉕"   U3255 # CIRCLED NUMBER TWENTY FIVE
+<Multi_key> <parenleft> <KP_Space> <KP_5> <parenright>         : "㉕"   U3255 # CIRCLED NUMBER TWENTY FIVE
+<Multi_key> <parenleft> <KP_2> <5> <parenright>        : "㉕"   U3255 # CIRCLED NUMBER TWENTY FIVE
+<Multi_key> <parenleft> <KP_2> <KP_5> <parenright>     : "㉕"   U3255 # CIRCLED NUMBER TWENTY FIVE
+<Multi_key> <parenleft> <2> <6> <parenright>   : "㉖"   U3256 # CIRCLED NUMBER TWENTY SIX
+<Multi_key> <parenleft> <2> <KP_6> <parenright>        : "㉖"   U3256 # CIRCLED NUMBER TWENTY SIX
+<Multi_key> <parenleft> <KP_Space> <6> <parenright>    : "㉖"   U3256 # CIRCLED NUMBER TWENTY SIX
+<Multi_key> <parenleft> <KP_Space> <KP_6> <parenright>         : "㉖"   U3256 # CIRCLED NUMBER TWENTY SIX
+<Multi_key> <parenleft> <KP_2> <6> <parenright>        : "㉖"   U3256 # CIRCLED NUMBER TWENTY SIX
+<Multi_key> <parenleft> <KP_2> <KP_6> <parenright>     : "㉖"   U3256 # CIRCLED NUMBER TWENTY SIX
+<Multi_key> <parenleft> <2> <7> <parenright>   : "㉗"   U3257 # CIRCLED NUMBER TWENTY SEVEN
+<Multi_key> <parenleft> <2> <KP_7> <parenright>        : "㉗"   U3257 # CIRCLED NUMBER TWENTY SEVEN
+<Multi_key> <parenleft> <KP_Space> <7> <parenright>    : "㉗"   U3257 # CIRCLED NUMBER TWENTY SEVEN
+<Multi_key> <parenleft> <KP_Space> <KP_7> <parenright>         : "㉗"   U3257 # CIRCLED NUMBER TWENTY SEVEN
+<Multi_key> <parenleft> <KP_2> <7> <parenright>        : "㉗"   U3257 # CIRCLED NUMBER TWENTY SEVEN
+<Multi_key> <parenleft> <KP_2> <KP_7> <parenright>     : "㉗"   U3257 # CIRCLED NUMBER TWENTY SEVEN
+<Multi_key> <parenleft> <2> <8> <parenright>   : "㉘"   U3258 # CIRCLED NUMBER TWENTY EIGHT
+<Multi_key> <parenleft> <2> <KP_8> <parenright>        : "㉘"   U3258 # CIRCLED NUMBER TWENTY EIGHT
+<Multi_key> <parenleft> <KP_Space> <8> <parenright>    : "㉘"   U3258 # CIRCLED NUMBER TWENTY EIGHT
+<Multi_key> <parenleft> <KP_Space> <KP_8> <parenright>         : "㉘"   U3258 # CIRCLED NUMBER TWENTY EIGHT
+<Multi_key> <parenleft> <KP_2> <8> <parenright>        : "㉘"   U3258 # CIRCLED NUMBER TWENTY EIGHT
+<Multi_key> <parenleft> <KP_2> <KP_8> <parenright>     : "㉘"   U3258 # CIRCLED NUMBER TWENTY EIGHT
+<Multi_key> <parenleft> <2> <9> <parenright>   : "㉙"   U3259 # CIRCLED NUMBER TWENTY NINE
+<Multi_key> <parenleft> <2> <KP_9> <parenright>        : "㉙"   U3259 # CIRCLED NUMBER TWENTY NINE
+<Multi_key> <parenleft> <KP_Space> <9> <parenright>    : "㉙"   U3259 # CIRCLED NUMBER TWENTY NINE
+<Multi_key> <parenleft> <KP_Space> <KP_9> <parenright>         : "㉙"   U3259 # CIRCLED NUMBER TWENTY NINE
+<Multi_key> <parenleft> <KP_2> <9> <parenright>        : "㉙"   U3259 # CIRCLED NUMBER TWENTY NINE
+<Multi_key> <parenleft> <KP_2> <KP_9> <parenright>     : "㉙"   U3259 # CIRCLED NUMBER TWENTY NINE
+<Multi_key> <parenleft> <3> <0> <parenright>   : "㉚"   U325A # CIRCLED NUMBER THIRTY
+<Multi_key> <parenleft> <3> <KP_0> <parenright>        : "㉚"   U325A # CIRCLED NUMBER THIRTY
+<Multi_key> <parenleft> <KP_3> <0> <parenright>        : "㉚"   U325A # CIRCLED NUMBER THIRTY
+<Multi_key> <parenleft> <KP_3> <KP_0> <parenright>     : "㉚"   U325A # CIRCLED NUMBER THIRTY
+<Multi_key> <parenleft> <3> <1> <parenright>   : "㉛"   U325B # CIRCLED NUMBER THIRTY ONE
+<Multi_key> <parenleft> <3> <KP_1> <parenright>        : "㉛"   U325B # CIRCLED NUMBER THIRTY ONE
+<Multi_key> <parenleft> <KP_3> <1> <parenright>        : "㉛"   U325B # CIRCLED NUMBER THIRTY ONE
+<Multi_key> <parenleft> <KP_3> <KP_1> <parenright>     : "㉛"   U325B # CIRCLED NUMBER THIRTY ONE
+<Multi_key> <parenleft> <3> <2> <parenright>   : "㉜"   U325C # CIRCLED NUMBER THIRTY TWO
+<Multi_key> <parenleft> <3> <KP_Space> <parenright>    : "㉜"   U325C # CIRCLED NUMBER THIRTY TWO
+<Multi_key> <parenleft> <3> <KP_2> <parenright>        : "㉜"   U325C # CIRCLED NUMBER THIRTY TWO
+<Multi_key> <parenleft> <KP_3> <2> <parenright>        : "㉜"   U325C # CIRCLED NUMBER THIRTY TWO
+<Multi_key> <parenleft> <KP_3> <KP_Space> <parenright>         : "㉜"   U325C # CIRCLED NUMBER THIRTY TWO
+<Multi_key> <parenleft> <KP_3> <KP_2> <parenright>     : "㉜"   U325C # CIRCLED NUMBER THIRTY TWO
+<Multi_key> <parenleft> <3> <3> <parenright>   : "㉝"   U325D # CIRCLED NUMBER THIRTY THREE
+<Multi_key> <parenleft> <3> <KP_3> <parenright>        : "㉝"   U325D # CIRCLED NUMBER THIRTY THREE
+<Multi_key> <parenleft> <KP_3> <3> <parenright>        : "㉝"   U325D # CIRCLED NUMBER THIRTY THREE
+<Multi_key> <parenleft> <KP_3> <KP_3> <parenright>     : "㉝"   U325D # CIRCLED NUMBER THIRTY THREE
+<Multi_key> <parenleft> <3> <4> <parenright>   : "㉞"   U325E # CIRCLED NUMBER THIRTY FOUR
+<Multi_key> <parenleft> <3> <KP_4> <parenright>        : "㉞"   U325E # CIRCLED NUMBER THIRTY FOUR
+<Multi_key> <parenleft> <KP_3> <4> <parenright>        : "㉞"   U325E # CIRCLED NUMBER THIRTY FOUR
+<Multi_key> <parenleft> <KP_3> <KP_4> <parenright>     : "㉞"   U325E # CIRCLED NUMBER THIRTY FOUR
+<Multi_key> <parenleft> <3> <5> <parenright>   : "㉟"   U325F # CIRCLED NUMBER THIRTY FIVE
+<Multi_key> <parenleft> <3> <KP_5> <parenright>        : "㉟"   U325F # CIRCLED NUMBER THIRTY FIVE
+<Multi_key> <parenleft> <KP_3> <5> <parenright>        : "㉟"   U325F # CIRCLED NUMBER THIRTY FIVE
+<Multi_key> <parenleft> <KP_3> <KP_5> <parenright>     : "㉟"   U325F # CIRCLED NUMBER THIRTY FIVE
+<Multi_key> <parenleft> <U1100> <parenright>   : "㉠"   U3260 # CIRCLED HANGUL KIYEOK
+<Multi_key> <parenleft> <U1102> <parenright>   : "㉡"   U3261 # CIRCLED HANGUL NIEUN
+<Multi_key> <parenleft> <U1103> <parenright>   : "㉢"   U3262 # CIRCLED HANGUL TIKEUT
+<Multi_key> <parenleft> <U1105> <parenright>   : "㉣"   U3263 # CIRCLED HANGUL RIEUL
+<Multi_key> <parenleft> <U1106> <parenright>   : "㉤"   U3264 # CIRCLED HANGUL MIEUM
+<Multi_key> <parenleft> <U1107> <parenright>   : "㉥"   U3265 # CIRCLED HANGUL PIEUP
+<Multi_key> <parenleft> <U1109> <parenright>   : "㉦"   U3266 # CIRCLED HANGUL SIOS
+<Multi_key> <parenleft> <U110B> <parenright>   : "㉧"   U3267 # CIRCLED HANGUL IEUNG
+<Multi_key> <parenleft> <U110C> <parenright>   : "㉨"   U3268 # CIRCLED HANGUL CIEUC
+<Multi_key> <parenleft> <U110E> <parenright>   : "㉩"   U3269 # CIRCLED HANGUL CHIEUCH
+<Multi_key> <parenleft> <U110F> <parenright>   : "㉪"   U326A # CIRCLED HANGUL KHIEUKH
+<Multi_key> <parenleft> <U1110> <parenright>   : "㉫"   U326B # CIRCLED HANGUL THIEUTH
+<Multi_key> <parenleft> <U1111> <parenright>   : "㉬"   U326C # CIRCLED HANGUL PHIEUPH
+<Multi_key> <parenleft> <U1112> <parenright>   : "㉭"   U326D # CIRCLED HANGUL HIEUH
+<Multi_key> <parenleft> <U1100> <U1161> <parenright>   : "㉮"   U326E # CIRCLED HANGUL KIYEOK A
+<Multi_key> <parenleft> <U1102> <U1161> <parenright>   : "㉯"   U326F # CIRCLED HANGUL NIEUN A
+<Multi_key> <parenleft> <U1103> <U1161> <parenright>   : "㉰"   U3270 # CIRCLED HANGUL TIKEUT A
+<Multi_key> <parenleft> <U1105> <U1161> <parenright>   : "㉱"   U3271 # CIRCLED HANGUL RIEUL A
+<Multi_key> <parenleft> <U1106> <U1161> <parenright>   : "㉲"   U3272 # CIRCLED HANGUL MIEUM A
+<Multi_key> <parenleft> <U1107> <U1161> <parenright>   : "㉳"   U3273 # CIRCLED HANGUL PIEUP A
+<Multi_key> <parenleft> <U1109> <U1161> <parenright>   : "㉴"   U3274 # CIRCLED HANGUL SIOS A
+<Multi_key> <parenleft> <U110B> <U1161> <parenright>   : "㉵"   U3275 # CIRCLED HANGUL IEUNG A
+<Multi_key> <parenleft> <U110C> <U1161> <parenright>   : "㉶"   U3276 # CIRCLED HANGUL CIEUC A
+<Multi_key> <parenleft> <U110E> <U1161> <parenright>   : "㉷"   U3277 # CIRCLED HANGUL CHIEUCH A
+<Multi_key> <parenleft> <U110F> <U1161> <parenright>   : "㉸"   U3278 # CIRCLED HANGUL KHIEUKH A
+<Multi_key> <parenleft> <U1110> <U1161> <parenright>   : "㉹"   U3279 # CIRCLED HANGUL THIEUTH A
+<Multi_key> <parenleft> <U1111> <U1161> <parenright>   : "㉺"   U327A # CIRCLED HANGUL PHIEUPH A
+<Multi_key> <parenleft> <U1112> <U1161> <parenright>   : "㉻"   U327B # CIRCLED HANGUL HIEUH A
+<Multi_key> <parenleft> <U4E00> <parenright>   : "㊀"   U3280 # CIRCLED IDEOGRAPH ONE
+<Multi_key> <parenleft> <U4E8C> <parenright>   : "㊁"   U3281 # CIRCLED IDEOGRAPH TWO
+<Multi_key> <parenleft> <U4E09> <parenright>   : "㊂"   U3282 # CIRCLED IDEOGRAPH THREE
+<Multi_key> <parenleft> <U56DB> <parenright>   : "㊃"   U3283 # CIRCLED IDEOGRAPH FOUR
+<Multi_key> <parenleft> <U4E94> <parenright>   : "㊄"   U3284 # CIRCLED IDEOGRAPH FIVE
+<Multi_key> <parenleft> <U516D> <parenright>   : "㊅"   U3285 # CIRCLED IDEOGRAPH SIX
+<Multi_key> <parenleft> <U4E03> <parenright>   : "㊆"   U3286 # CIRCLED IDEOGRAPH SEVEN
+<Multi_key> <parenleft> <U516B> <parenright>   : "㊇"   U3287 # CIRCLED IDEOGRAPH EIGHT
+<Multi_key> <parenleft> <U4E5D> <parenright>   : "㊈"   U3288 # CIRCLED IDEOGRAPH NINE
+<Multi_key> <parenleft> <U5341> <parenright>   : "㊉"   U3289 # CIRCLED IDEOGRAPH TEN
+<Multi_key> <parenleft> <U6708> <parenright>   : "㊊"   U328A # CIRCLED IDEOGRAPH MOON
+<Multi_key> <parenleft> <U706B> <parenright>   : "㊋"   U328B # CIRCLED IDEOGRAPH FIRE
+<Multi_key> <parenleft> <U6C34> <parenright>   : "㊌"   U328C # CIRCLED IDEOGRAPH WATER
+<Multi_key> <parenleft> <U6728> <parenright>   : "㊍"   U328D # CIRCLED IDEOGRAPH WOOD
+<Multi_key> <parenleft> <U91D1> <parenright>   : "㊎"   U328E # CIRCLED IDEOGRAPH METAL
+<Multi_key> <parenleft> <U571F> <parenright>   : "㊏"   U328F # CIRCLED IDEOGRAPH EARTH
+<Multi_key> <parenleft> <U65E5> <parenright>   : "㊐"   U3290 # CIRCLED IDEOGRAPH SUN
+<Multi_key> <parenleft> <U682A> <parenright>   : "㊑"   U3291 # CIRCLED IDEOGRAPH STOCK
+<Multi_key> <parenleft> <U6709> <parenright>   : "㊒"   U3292 # CIRCLED IDEOGRAPH HAVE
+<Multi_key> <parenleft> <U793E> <parenright>   : "㊓"   U3293 # CIRCLED IDEOGRAPH SOCIETY
+<Multi_key> <parenleft> <U540D> <parenright>   : "㊔"   U3294 # CIRCLED IDEOGRAPH NAME
+<Multi_key> <parenleft> <U7279> <parenright>   : "㊕"   U3295 # CIRCLED IDEOGRAPH SPECIAL
+<Multi_key> <parenleft> <U8CA1> <parenright>   : "㊖"   U3296 # CIRCLED IDEOGRAPH FINANCIAL
+<Multi_key> <parenleft> <U795D> <parenright>   : "㊗"   U3297 # CIRCLED IDEOGRAPH CONGRATULATION
+<Multi_key> <parenleft> <U52B4> <parenright>   : "㊘"   U3298 # CIRCLED IDEOGRAPH LABOR
+<Multi_key> <parenleft> <U79D8> <parenright>   : "㊙"   U3299 # CIRCLED IDEOGRAPH SECRET
+<Multi_key> <parenleft> <U7537> <parenright>   : "㊚"   U329A # CIRCLED IDEOGRAPH MALE
+<Multi_key> <parenleft> <U5973> <parenright>   : "㊛"   U329B # CIRCLED IDEOGRAPH FEMALE
+<Multi_key> <parenleft> <U9069> <parenright>   : "㊜"   U329C # CIRCLED IDEOGRAPH SUITABLE
+<Multi_key> <parenleft> <U512A> <parenright>   : "㊝"   U329D # CIRCLED IDEOGRAPH EXCELLENT
+<Multi_key> <parenleft> <U5370> <parenright>   : "㊞"   U329E # CIRCLED IDEOGRAPH PRINT
+<Multi_key> <parenleft> <U6CE8> <parenright>   : "㊟"   U329F # CIRCLED IDEOGRAPH ATTENTION
+<Multi_key> <parenleft> <U9805> <parenright>   : "㊠"   U32A0 # CIRCLED IDEOGRAPH ITEM
+<Multi_key> <parenleft> <U4F11> <parenright>   : "㊡"   U32A1 # CIRCLED IDEOGRAPH REST
+<Multi_key> <parenleft> <U5199> <parenright>   : "㊢"   U32A2 # CIRCLED IDEOGRAPH COPY
+<Multi_key> <parenleft> <U6B63> <parenright>   : "㊣"   U32A3 # CIRCLED IDEOGRAPH CORRECT
+<Multi_key> <parenleft> <U4E0A> <parenright>   : "㊤"   U32A4 # CIRCLED IDEOGRAPH HIGH
+<Multi_key> <parenleft> <U4E2D> <parenright>   : "㊥"   U32A5 # CIRCLED IDEOGRAPH CENTRE
+<Multi_key> <parenleft> <U4E0B> <parenright>   : "㊦"   U32A6 # CIRCLED IDEOGRAPH LOW
+<Multi_key> <parenleft> <U5DE6> <parenright>   : "㊧"   U32A7 # CIRCLED IDEOGRAPH LEFT
+<Multi_key> <parenleft> <U53F3> <parenright>   : "㊨"   U32A8 # CIRCLED IDEOGRAPH RIGHT
+<Multi_key> <parenleft> <U533B> <parenright>   : "㊩"   U32A9 # CIRCLED IDEOGRAPH MEDICINE
+<Multi_key> <parenleft> <U5B97> <parenright>   : "㊪"   U32AA # CIRCLED IDEOGRAPH RELIGION
+<Multi_key> <parenleft> <U5B66> <parenright>   : "㊫"   U32AB # CIRCLED IDEOGRAPH STUDY
+<Multi_key> <parenleft> <U76E3> <parenright>   : "㊬"   U32AC # CIRCLED IDEOGRAPH SUPERVISE
+<Multi_key> <parenleft> <U4F01> <parenright>   : "㊭"   U32AD # CIRCLED IDEOGRAPH ENTERPRISE
+<Multi_key> <parenleft> <U8CC7> <parenright>   : "㊮"   U32AE # CIRCLED IDEOGRAPH RESOURCE
+<Multi_key> <parenleft> <U5354> <parenright>   : "㊯"   U32AF # CIRCLED IDEOGRAPH ALLIANCE
+<Multi_key> <parenleft> <U591C> <parenright>   : "㊰"   U32B0 # CIRCLED IDEOGRAPH NIGHT
+<Multi_key> <parenleft> <3> <6> <parenright>   : "㊱"   U32B1 # CIRCLED NUMBER THIRTY SIX
+<Multi_key> <parenleft> <3> <KP_6> <parenright>        : "㊱"   U32B1 # CIRCLED NUMBER THIRTY SIX
+<Multi_key> <parenleft> <KP_3> <6> <parenright>        : "㊱"   U32B1 # CIRCLED NUMBER THIRTY SIX
+<Multi_key> <parenleft> <KP_3> <KP_6> <parenright>     : "㊱"   U32B1 # CIRCLED NUMBER THIRTY SIX
+<Multi_key> <parenleft> <3> <7> <parenright>   : "㊲"   U32B2 # CIRCLED NUMBER THIRTY SEVEN
+<Multi_key> <parenleft> <3> <KP_7> <parenright>        : "㊲"   U32B2 # CIRCLED NUMBER THIRTY SEVEN
+<Multi_key> <parenleft> <KP_3> <7> <parenright>        : "㊲"   U32B2 # CIRCLED NUMBER THIRTY SEVEN
+<Multi_key> <parenleft> <KP_3> <KP_7> <parenright>     : "㊲"   U32B2 # CIRCLED NUMBER THIRTY SEVEN
+<Multi_key> <parenleft> <3> <8> <parenright>   : "㊳"   U32B3 # CIRCLED NUMBER THIRTY EIGHT
+<Multi_key> <parenleft> <3> <KP_8> <parenright>        : "㊳"   U32B3 # CIRCLED NUMBER THIRTY EIGHT
+<Multi_key> <parenleft> <KP_3> <8> <parenright>        : "㊳"   U32B3 # CIRCLED NUMBER THIRTY EIGHT
+<Multi_key> <parenleft> <KP_3> <KP_8> <parenright>     : "㊳"   U32B3 # CIRCLED NUMBER THIRTY EIGHT
+<Multi_key> <parenleft> <3> <9> <parenright>   : "㊴"   U32B4 # CIRCLED NUMBER THIRTY NINE
+<Multi_key> <parenleft> <3> <KP_9> <parenright>        : "㊴"   U32B4 # CIRCLED NUMBER THIRTY NINE
+<Multi_key> <parenleft> <KP_3> <9> <parenright>        : "㊴"   U32B4 # CIRCLED NUMBER THIRTY NINE
+<Multi_key> <parenleft> <KP_3> <KP_9> <parenright>     : "㊴"   U32B4 # CIRCLED NUMBER THIRTY NINE
+<Multi_key> <parenleft> <4> <0> <parenright>   : "㊵"   U32B5 # CIRCLED NUMBER FORTY
+<Multi_key> <parenleft> <4> <KP_0> <parenright>        : "㊵"   U32B5 # CIRCLED NUMBER FORTY
+<Multi_key> <parenleft> <KP_4> <0> <parenright>        : "㊵"   U32B5 # CIRCLED NUMBER FORTY
+<Multi_key> <parenleft> <KP_4> <KP_0> <parenright>     : "㊵"   U32B5 # CIRCLED NUMBER FORTY
+<Multi_key> <parenleft> <4> <1> <parenright>   : "㊶"   U32B6 # CIRCLED NUMBER FORTY ONE
+<Multi_key> <parenleft> <4> <KP_1> <parenright>        : "㊶"   U32B6 # CIRCLED NUMBER FORTY ONE
+<Multi_key> <parenleft> <KP_4> <1> <parenright>        : "㊶"   U32B6 # CIRCLED NUMBER FORTY ONE
+<Multi_key> <parenleft> <KP_4> <KP_1> <parenright>     : "㊶"   U32B6 # CIRCLED NUMBER FORTY ONE
+<Multi_key> <parenleft> <4> <2> <parenright>   : "㊷"   U32B7 # CIRCLED NUMBER FORTY TWO
+<Multi_key> <parenleft> <4> <KP_Space> <parenright>    : "㊷"   U32B7 # CIRCLED NUMBER FORTY TWO
+<Multi_key> <parenleft> <4> <KP_2> <parenright>        : "㊷"   U32B7 # CIRCLED NUMBER FORTY TWO
+<Multi_key> <parenleft> <KP_4> <2> <parenright>        : "㊷"   U32B7 # CIRCLED NUMBER FORTY TWO
+<Multi_key> <parenleft> <KP_4> <KP_Space> <parenright>         : "㊷"   U32B7 # CIRCLED NUMBER FORTY TWO
+<Multi_key> <parenleft> <KP_4> <KP_2> <parenright>     : "㊷"   U32B7 # CIRCLED NUMBER FORTY TWO
+<Multi_key> <parenleft> <4> <3> <parenright>   : "㊸"   U32B8 # CIRCLED NUMBER FORTY THREE
+<Multi_key> <parenleft> <4> <KP_3> <parenright>        : "㊸"   U32B8 # CIRCLED NUMBER FORTY THREE
+<Multi_key> <parenleft> <KP_4> <3> <parenright>        : "㊸"   U32B8 # CIRCLED NUMBER FORTY THREE
+<Multi_key> <parenleft> <KP_4> <KP_3> <parenright>     : "㊸"   U32B8 # CIRCLED NUMBER FORTY THREE
+<Multi_key> <parenleft> <4> <4> <parenright>   : "㊹"   U32B9 # CIRCLED NUMBER FORTY FOUR
+<Multi_key> <parenleft> <4> <KP_4> <parenright>        : "㊹"   U32B9 # CIRCLED NUMBER FORTY FOUR
+<Multi_key> <parenleft> <KP_4> <4> <parenright>        : "㊹"   U32B9 # CIRCLED NUMBER FORTY FOUR
+<Multi_key> <parenleft> <KP_4> <KP_4> <parenright>     : "㊹"   U32B9 # CIRCLED NUMBER FORTY FOUR
+<Multi_key> <parenleft> <4> <5> <parenright>   : "㊺"   U32BA # CIRCLED NUMBER FORTY FIVE
+<Multi_key> <parenleft> <4> <KP_5> <parenright>        : "㊺"   U32BA # CIRCLED NUMBER FORTY FIVE
+<Multi_key> <parenleft> <KP_4> <5> <parenright>        : "㊺"   U32BA # CIRCLED NUMBER FORTY FIVE
+<Multi_key> <parenleft> <KP_4> <KP_5> <parenright>     : "㊺"   U32BA # CIRCLED NUMBER FORTY FIVE
+<Multi_key> <parenleft> <4> <6> <parenright>   : "㊻"   U32BB # CIRCLED NUMBER FORTY SIX
+<Multi_key> <parenleft> <4> <KP_6> <parenright>        : "㊻"   U32BB # CIRCLED NUMBER FORTY SIX
+<Multi_key> <parenleft> <KP_4> <6> <parenright>        : "㊻"   U32BB # CIRCLED NUMBER FORTY SIX
+<Multi_key> <parenleft> <KP_4> <KP_6> <parenright>     : "㊻"   U32BB # CIRCLED NUMBER FORTY SIX
+<Multi_key> <parenleft> <4> <7> <parenright>   : "㊼"   U32BC # CIRCLED NUMBER FORTY SEVEN
+<Multi_key> <parenleft> <4> <KP_7> <parenright>        : "㊼"   U32BC # CIRCLED NUMBER FORTY SEVEN
+<Multi_key> <parenleft> <KP_4> <7> <parenright>        : "㊼"   U32BC # CIRCLED NUMBER FORTY SEVEN
+<Multi_key> <parenleft> <KP_4> <KP_7> <parenright>     : "㊼"   U32BC # CIRCLED NUMBER FORTY SEVEN
+<Multi_key> <parenleft> <4> <8> <parenright>   : "㊽"   U32BD # CIRCLED NUMBER FORTY EIGHT
+<Multi_key> <parenleft> <4> <KP_8> <parenright>        : "㊽"   U32BD # CIRCLED NUMBER FORTY EIGHT
+<Multi_key> <parenleft> <KP_4> <8> <parenright>        : "㊽"   U32BD # CIRCLED NUMBER FORTY EIGHT
+<Multi_key> <parenleft> <KP_4> <KP_8> <parenright>     : "㊽"   U32BD # CIRCLED NUMBER FORTY EIGHT
+<Multi_key> <parenleft> <4> <9> <parenright>   : "㊾"   U32BE # CIRCLED NUMBER FORTY NINE
+<Multi_key> <parenleft> <4> <KP_9> <parenright>        : "㊾"   U32BE # CIRCLED NUMBER FORTY NINE
+<Multi_key> <parenleft> <KP_4> <9> <parenright>        : "㊾"   U32BE # CIRCLED NUMBER FORTY NINE
+<Multi_key> <parenleft> <KP_4> <KP_9> <parenright>     : "㊾"   U32BE # CIRCLED NUMBER FORTY NINE
+<Multi_key> <parenleft> <5> <0> <parenright>   : "㊿"   U32BF # CIRCLED NUMBER FIFTY
+<Multi_key> <parenleft> <5> <KP_0> <parenright>        : "㊿"   U32BF # CIRCLED NUMBER FIFTY
+<Multi_key> <parenleft> <KP_5> <0> <parenright>        : "㊿"   U32BF # CIRCLED NUMBER FIFTY
+<Multi_key> <parenleft> <KP_5> <KP_0> <parenright>     : "㊿"   U32BF # CIRCLED NUMBER FIFTY
+<Multi_key> <parenleft> <kana_A> <parenright>  : "㋐"   U32D0 # CIRCLED KATAKANA A
+<Multi_key> <parenleft> <kana_I> <parenright>  : "㋑"   U32D1 # CIRCLED KATAKANA I
+<Multi_key> <parenleft> <kana_U> <parenright>  : "㋒"   U32D2 # CIRCLED KATAKANA U
+<Multi_key> <parenleft> <kana_E> <parenright>  : "㋓"   U32D3 # CIRCLED KATAKANA E
+<Multi_key> <parenleft> <kana_O> <parenright>  : "㋔"   U32D4 # CIRCLED KATAKANA O
+<Multi_key> <parenleft> <kana_KA> <parenright>         : "㋕"   U32D5 # CIRCLED KATAKANA KA
+<Multi_key> <parenleft> <kana_KI> <parenright>         : "㋖"   U32D6 # CIRCLED KATAKANA KI
+<Multi_key> <parenleft> <kana_KU> <parenright>         : "㋗"   U32D7 # CIRCLED KATAKANA KU
+<Multi_key> <parenleft> <kana_KE> <parenright>         : "㋘"   U32D8 # CIRCLED KATAKANA KE
+<Multi_key> <parenleft> <kana_KO> <parenright>         : "㋙"   U32D9 # CIRCLED KATAKANA KO
+<Multi_key> <parenleft> <kana_SA> <parenright>         : "㋚"   U32DA # CIRCLED KATAKANA SA
+<Multi_key> <parenleft> <kana_SHI> <parenright>        : "㋛"   U32DB # CIRCLED KATAKANA SI
+<Multi_key> <parenleft> <kana_SU> <parenright>         : "㋜"   U32DC # CIRCLED KATAKANA SU
+<Multi_key> <parenleft> <kana_SE> <parenright>         : "㋝"   U32DD # CIRCLED KATAKANA SE
+<Multi_key> <parenleft> <kana_SO> <parenright>         : "㋞"   U32DE # CIRCLED KATAKANA SO
+<Multi_key> <parenleft> <kana_TA> <parenright>         : "㋟"   U32DF # CIRCLED KATAKANA TA
+<Multi_key> <parenleft> <kana_CHI> <parenright>        : "㋠"   U32E0 # CIRCLED KATAKANA TI
+<Multi_key> <parenleft> <kana_TSU> <parenright>        : "㋡"   U32E1 # CIRCLED KATAKANA TU
+<Multi_key> <parenleft> <kana_TE> <parenright>         : "㋢"   U32E2 # CIRCLED KATAKANA TE
+<Multi_key> <parenleft> <kana_TO> <parenright>         : "㋣"   U32E3 # CIRCLED KATAKANA TO
+<Multi_key> <parenleft> <kana_NA> <parenright>         : "㋤"   U32E4 # CIRCLED KATAKANA NA
+<Multi_key> <parenleft> <kana_NI> <parenright>         : "㋥"   U32E5 # CIRCLED KATAKANA NI
+<Multi_key> <parenleft> <kana_NU> <parenright>         : "㋦"   U32E6 # CIRCLED KATAKANA NU
+<Multi_key> <parenleft> <kana_NE> <parenright>         : "㋧"   U32E7 # CIRCLED KATAKANA NE
+<Multi_key> <parenleft> <kana_NO> <parenright>         : "㋨"   U32E8 # CIRCLED KATAKANA NO
+<Multi_key> <parenleft> <kana_HA> <parenright>         : "㋩"   U32E9 # CIRCLED KATAKANA HA
+<Multi_key> <parenleft> <kana_HI> <parenright>         : "㋪"   U32EA # CIRCLED KATAKANA HI
+<Multi_key> <parenleft> <kana_FU> <parenright>         : "㋫"   U32EB # CIRCLED KATAKANA HU
+<Multi_key> <parenleft> <kana_HE> <parenright>         : "㋬"   U32EC # CIRCLED KATAKANA HE
+<Multi_key> <parenleft> <kana_HO> <parenright>         : "㋭"   U32ED # CIRCLED KATAKANA HO
+<Multi_key> <parenleft> <kana_MA> <parenright>         : "㋮"   U32EE # CIRCLED KATAKANA MA
+<Multi_key> <parenleft> <kana_MI> <parenright>         : "㋯"   U32EF # CIRCLED KATAKANA MI
+<Multi_key> <parenleft> <kana_MU> <parenright>         : "㋰"   U32F0 # CIRCLED KATAKANA MU
+<Multi_key> <parenleft> <kana_ME> <parenright>         : "㋱"   U32F1 # CIRCLED KATAKANA ME
+<Multi_key> <parenleft> <kana_MO> <parenright>         : "㋲"   U32F2 # CIRCLED KATAKANA MO
+<Multi_key> <parenleft> <kana_YA> <parenright>         : "㋳"   U32F3 # CIRCLED KATAKANA YA
+<Multi_key> <parenleft> <kana_YU> <parenright>         : "㋴"   U32F4 # CIRCLED KATAKANA YU
+<Multi_key> <parenleft> <kana_YO> <parenright>         : "㋵"   U32F5 # CIRCLED KATAKANA YO
+<Multi_key> <parenleft> <kana_RA> <parenright>         : "㋶"   U32F6 # CIRCLED KATAKANA RA
+<Multi_key> <parenleft> <kana_RI> <parenright>         : "㋷"   U32F7 # CIRCLED KATAKANA RI
+<Multi_key> <parenleft> <kana_RU> <parenright>         : "㋸"   U32F8 # CIRCLED KATAKANA RU
+<Multi_key> <parenleft> <kana_RE> <parenright>         : "㋹"   U32F9 # CIRCLED KATAKANA RE
+<Multi_key> <parenleft> <kana_RO> <parenright>         : "㋺"   U32FA # CIRCLED KATAKANA RO
+<Multi_key> <parenleft> <kana_WA> <parenright>         : "㋻"   U32FB # CIRCLED KATAKANA WA
+<Multi_key> <parenleft> <U30F0> <parenright>   : "㋼"   U32FC # CIRCLED KATAKANA WI
+<Multi_key> <parenleft> <U30F1> <parenright>   : "㋽"   U32FD # CIRCLED KATAKANA WE
+<Multi_key> <parenleft> <kana_WO> <parenright>         : "㋾"   U32FE # CIRCLED KATAKANA WO
+<Multi_key> <U05B4> <hebrew_yod>       : "יִ"   UFB1D # HEBREW LETTER YOD WITH HIRIQ
+<Multi_key> <U05B7> <U05F2>    : "ײַ"   UFB1F # HEBREW LIGATURE YIDDISH YOD YOD PATAH
+<Multi_key> <U05C1> <hebrew_shin>      : "שׁ"   UFB2A # HEBREW LETTER SHIN WITH SHIN DOT
+<Multi_key> <U05C2> <hebrew_shin>      : "שׂ"   UFB2B # HEBREW LETTER SHIN WITH SIN DOT
+<Multi_key> <U05C1> <UFB49>    : "שּׁ"   UFB2C # HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT
+<Multi_key> <U05C1> <U05BC> <hebrew_shin>      : "שּׁ"   UFB2C # HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT
+<Multi_key> <U05C2> <UFB49>    : "שּׂ"   UFB2D # HEBREW LETTER SHIN WITH DAGESH AND SIN DOT
+<Multi_key> <U05C2> <U05BC> <hebrew_shin>      : "שּׂ"   UFB2D # HEBREW LETTER SHIN WITH DAGESH AND SIN DOT
+<Multi_key> <U05B7> <hebrew_aleph>     : "אַ"   UFB2E # HEBREW LETTER ALEF WITH PATAH
+<Multi_key> <U05B8> <hebrew_aleph>     : "אָ"   UFB2F # HEBREW LETTER ALEF WITH QAMATS
+<Multi_key> <U05BC> <hebrew_aleph>     : "אּ"   UFB30 # HEBREW LETTER ALEF WITH MAPIQ
+<Multi_key> <U05BC> <hebrew_bet>       : "בּ"   UFB31 # HEBREW LETTER BET WITH DAGESH
+<Multi_key> <U05BC> <hebrew_beth>      : "בּ"   UFB31 # HEBREW LETTER BET WITH DAGESH
+<Multi_key> <U05BC> <hebrew_gimel>     : "גּ"   UFB32 # HEBREW LETTER GIMEL WITH DAGESH
+<Multi_key> <U05BC> <hebrew_gimmel>    : "גּ"   UFB32 # HEBREW LETTER GIMEL WITH DAGESH
+<Multi_key> <U05BC> <hebrew_dalet>     : "דּ"   UFB33 # HEBREW LETTER DALET WITH DAGESH
+<Multi_key> <U05BC> <hebrew_daleth>    : "דּ"   UFB33 # HEBREW LETTER DALET WITH DAGESH
+<Multi_key> <U05BC> <hebrew_he>        : "הּ"   UFB34 # HEBREW LETTER HE WITH MAPIQ
+<Multi_key> <U05BC> <hebrew_waw>       : "וּ"   UFB35 # HEBREW LETTER VAV WITH DAGESH
+<Multi_key> <U05BC> <hebrew_zain>      : "זּ"   UFB36 # HEBREW LETTER ZAYIN WITH DAGESH
+<Multi_key> <U05BC> <hebrew_zayin>     : "זּ"   UFB36 # HEBREW LETTER ZAYIN WITH DAGESH
+<Multi_key> <U05BC> <hebrew_tet>       : "טּ"   UFB38 # HEBREW LETTER TET WITH DAGESH
+<Multi_key> <U05BC> <hebrew_teth>      : "טּ"   UFB38 # HEBREW LETTER TET WITH DAGESH
+<Multi_key> <U05BC> <hebrew_yod>       : "יּ"   UFB39 # HEBREW LETTER YOD WITH DAGESH
+<Multi_key> <U05BC> <hebrew_finalkaph>         : "ךּ"   UFB3A # HEBREW LETTER FINAL KAF WITH DAGESH
+<Multi_key> <U05BC> <hebrew_kaph>      : "כּ"   UFB3B # HEBREW LETTER KAF WITH DAGESH
+<Multi_key> <U05BC> <hebrew_lamed>     : "לּ"   UFB3C # HEBREW LETTER LAMED WITH DAGESH
+<Multi_key> <U05BC> <hebrew_mem>       : "מּ"   UFB3E # HEBREW LETTER MEM WITH DAGESH
+<Multi_key> <U05BC> <hebrew_nun>       : "נּ"   UFB40 # HEBREW LETTER NUN WITH DAGESH
+<Multi_key> <U05BC> <hebrew_samech>    : "סּ"   UFB41 # HEBREW LETTER SAMEKH WITH DAGESH
+<Multi_key> <U05BC> <hebrew_samekh>    : "סּ"   UFB41 # HEBREW LETTER SAMEKH WITH DAGESH
+<Multi_key> <U05BC> <hebrew_finalpe>   : "ףּ"   UFB43 # HEBREW LETTER FINAL PE WITH DAGESH
+<Multi_key> <U05BC> <hebrew_pe>        : "פּ"   UFB44 # HEBREW LETTER PE WITH DAGESH
+<Multi_key> <U05BC> <hebrew_zade>      : "צּ"   UFB46 # HEBREW LETTER TSADI WITH DAGESH
+<Multi_key> <U05BC> <hebrew_zadi>      : "צּ"   UFB46 # HEBREW LETTER TSADI WITH DAGESH
+<Multi_key> <U05BC> <hebrew_kuf>       : "קּ"   UFB47 # HEBREW LETTER QOF WITH DAGESH
+<Multi_key> <U05BC> <hebrew_qoph>      : "קּ"   UFB47 # HEBREW LETTER QOF WITH DAGESH
+<Multi_key> <U05BC> <hebrew_resh>      : "רּ"   UFB48 # HEBREW LETTER RESH WITH DAGESH
+<Multi_key> <U05BC> <hebrew_shin>      : "שּ"   UFB49 # HEBREW LETTER SHIN WITH DAGESH
+<Multi_key> <U05BC> <hebrew_taf>       : "תּ"   UFB4A # HEBREW LETTER TAV WITH DAGESH
+<Multi_key> <U05BC> <hebrew_taw>       : "תּ"   UFB4A # HEBREW LETTER TAV WITH DAGESH
+<Multi_key> <U05B9> <hebrew_waw>       : "וֹ"   UFB4B # HEBREW LETTER VAV WITH HOLAM
+<Multi_key> <U05BF> <hebrew_bet>       : "בֿ"   UFB4C # HEBREW LETTER BET WITH RAFE
+<Multi_key> <U05BF> <hebrew_beth>      : "בֿ"   UFB4C # HEBREW LETTER BET WITH RAFE
+<Multi_key> <U05BF> <hebrew_kaph>      : "כֿ"   UFB4D # HEBREW LETTER KAF WITH RAFE
+<Multi_key> <U05BF> <hebrew_pe>        : "פֿ"   UFB4E # HEBREW LETTER PE WITH RAFE
+<Multi_key> <U1D157> <U1D165>  : "𝅗𝅥"   U1D15E # MUSICAL SYMBOL HALF NOTE
+<Multi_key> <U1D158> <U1D165>  : "𝅘𝅥"   U1D15F # MUSICAL SYMBOL QUARTER NOTE
+<Multi_key> <U1D15F> <U1D16E>  : "𝅘𝅥𝅮"   U1D160 # MUSICAL SYMBOL EIGHTH NOTE
+/* <Multi_key> <U1D158> <U1D165> <U1D16E>      : "𝅘𝅥𝅮"   U1D160 # MUSICAL SYMBOL EIGHTH NOTE */
+<Multi_key> <U1D15F> <U1D16F>  : "𝅘𝅥𝅯"   U1D161 # MUSICAL SYMBOL SIXTEENTH NOTE
+/* <Multi_key> <U1D158> <U1D165> <U1D16F>      : "𝅘𝅥𝅯"   U1D161 # MUSICAL SYMBOL SIXTEENTH NOTE */
+<Multi_key> <U1D15F> <U1D170>  : "𝅘𝅥𝅰"   U1D162 # MUSICAL SYMBOL THIRTY-SECOND NOTE
+/* <Multi_key> <U1D158> <U1D165> <U1D170>      : "𝅘𝅥𝅰"   U1D162 # MUSICAL SYMBOL THIRTY-SECOND NOTE */
+<Multi_key> <U1D15F> <U1D171>  : "𝅘𝅥𝅱"   U1D163 # MUSICAL SYMBOL SIXTY-FOURTH NOTE
+/* <Multi_key> <U1D158> <U1D165> <U1D171>      : "𝅘𝅥𝅱"   U1D163 # MUSICAL SYMBOL SIXTY-FOURTH NOTE */
+<Multi_key> <U1D15F> <U1D172>  : "𝅘𝅥𝅲"   U1D164 # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE
+/* <Multi_key> <U1D158> <U1D165> <U1D172>      : "𝅘𝅥𝅲"   U1D164 # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE */
+<Multi_key> <U1D1B9> <U1D165>  : "𝆹𝅥"   U1D1BB # MUSICAL SYMBOL MINIMA
+<Multi_key> <U1D1BA> <U1D165>  : "𝆺𝅥"   U1D1BC # MUSICAL SYMBOL MINIMA BLACK
+<Multi_key> <U1D1BB> <U1D16E>  : "𝆹𝅥𝅮"   U1D1BD # MUSICAL SYMBOL SEMIMINIMA WHITE
+/* <Multi_key> <U1D1B9> <U1D165> <U1D16E>      : "𝆹𝅥𝅮"   U1D1BD # MUSICAL SYMBOL SEMIMINIMA WHITE */
+<Multi_key> <U1D1BC> <U1D16E>  : "𝆺𝅥𝅮"   U1D1BE # MUSICAL SYMBOL SEMIMINIMA BLACK
+/* <Multi_key> <U1D1BA> <U1D165> <U1D16E>      : "𝆺𝅥𝅮"   U1D1BE # MUSICAL SYMBOL SEMIMINIMA BLACK */
+<Multi_key> <U1D1BB> <U1D16F>  : "𝆹𝅥𝅯"   U1D1BF # MUSICAL SYMBOL FUSA WHITE
+/* <Multi_key> <U1D1B9> <U1D165> <U1D16F>      : "𝆹𝅥𝅯"   U1D1BF # MUSICAL SYMBOL FUSA WHITE */
+<Multi_key> <U1D1BC> <U1D16F>  : "𝆺𝅥𝅯"   U1D1C0 # MUSICAL SYMBOL FUSA BLACK
+/* <Multi_key> <U1D1BA> <U1D165> <U1D16F>      : "𝆺𝅥𝅯"   U1D1C0 # MUSICAL SYMBOL FUSA BLACK */
+
+XCOMM
+XCOMM Khmer digraphs
+XCOMM
+
+<U17ff> :   "ាំ"
+<U17fe> :   "ោះ"
+<U17fd> :   "េះ"
+<U17fc> :   "ុំ"
+<U17fb> :   "ុះ"
+
+XCOMM
+XCOMM Arabic Lam-Alef ligatures
+XCOMM
+
+<UFEFB>        :   "لا" # ARABIC LIGATURE LAM WITH ALEF
+<UFEF7>        :   "لأ" # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE
+<UFEF9>        :   "لإ" # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW
+<UFEF5>        :   "لآ" # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE
+
+XCOMM
+XCOMM French-Dvorak Bépo compositions
+XCOMM
+
+<dead_abovedot> <Amacron>             : "Ǡ"   U01E0               # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+<dead_abovedot> <amacron>             : "ǡ"   U01E1               # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+<dead_abovedot> <j>                  : "ȷ"   U0237               # LATIN SMALL LETTER DOTLESS J
+<dead_abovedot> <L>                  : "Ŀ"   U013F               # LATIN CAPITAL LETTER L WITH MIDDLE DOT
+<dead_abovedot> <l>                  : "ŀ"   U0140               # LATIN SMALL LETTER L WITH MIDDLE DOT
+<dead_abovedot> <Omacron>            : "Ȱ"   U0230               # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+<dead_abovedot> <omacron>            : "ȱ"   U0231               # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+<dead_abovedot> <nobreakspace>               : "̇"   U0307                #  COMBINING DOT ABOVE
+<dead_acute> <Sabovedot>             : "Ṥ"   U1E64               # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+<dead_acute> <sabovedot>             : "ṥ"   U1E65               # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+<dead_acute> <V>                     : "Ǘ"   U01D7               # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+<dead_acute> <v>                     : "ǘ"   U01D8               # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+<dead_acute> <nobreakspace>          : "́"   U0301      # COMBINING ACUTE ACCENT
+<dead_belowdot> <Sabovedot>          : "Ṩ"   U1E68               # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+<dead_belowdot> <sabovedot>          : "ṩ"   U1E69               # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+<dead_belowdot> <dead_belowdot>       : "̣"   U0323   # COMBINING DOT BELOW
+<dead_belowdot> <nobreakspace>               : "̣"   U0323   # COMBINING DOT BELOW
+<dead_belowdot> <space>              : "̣"   U0323   # COMBINING DOT BELOW
+<dead_breve> <Aacute>                : "Ắ"   Abreveacute         # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+<dead_breve> <Agrave>                : "Ằ"   Abrevegrave         # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+<dead_breve> <Ahook>                 : "Ẳ"   Abrevehook          # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+<dead_breve> <Atilde>                : "Ẵ"   Abrevetilde         # LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+<dead_breve> <aacute>                : "ắ"   abreveacute         # LATIN SMALL LETTER A WITH BREVE AND ACUTE
+<dead_breve> <agrave>                : "ằ"   abrevegrave         # LATIN SMALL LETTER A WITH BREVE AND GRAVE
+<dead_breve> <ahook>                 : "ẳ"   abrevehook          # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+<dead_breve> <atilde>                : "ẵ"   abrevetilde         # LATIN SMALL LETTER A WITH BREVE AND TILDE
+<dead_breve> <nobreakspace>          : "̆"   U0306                # COMBINING BREVE
+<dead_caron> <parenleft>             : "₍"   U208D               # SUBSCRIPT LEFT PARENTHESIS
+<dead_caron> <parenright>            : "₎"   U208E               # SUBSCRIPT RIGHT PARENTHESIS
+<dead_caron> <plus>                  : "₊"   U208A               # SUBSCRIPT PLUS SIGN
+<dead_caron> <minus>                 : "₋"   U208B               # SUBSCRIPT MINUS
+<dead_caron> <0>                     : "₀"   zerosubscript       # SUBSCRIPT ZERO
+<dead_caron> <1>                     : "₁"   onesubscript        # SUBSCRIPT ONE
+<dead_caron> <2>                     : "₂"   twosubscript        # SUBSCRIPT TWO
+<dead_caron> <3>                     : "₃"   threesubscript      # SUBSCRIPT THREE
+<dead_caron> <4>                     : "₄"   foursubscript       # SUBSCRIPT FOUR
+<dead_caron> <5>                     : "₅"   fivesubscript       # SUBSCRIPT FIVE
+<dead_caron> <6>                     : "₆"   sixsubscript        # SUBSCRIPT SIX
+<dead_caron> <7>                     : "₇"   sevensubscript      # SUBSCRIPT SEVEN
+<dead_caron> <8>                     : "₈"   eightsubscript      # SUBSCRIPT EIGHT
+<dead_caron> <9>                     : "₉"   ninesubscript       # SUBSCRIPT NINE
+<dead_caron> <equal>                 : "₌"   U208C               # SUBSCRIPT EQUALS SIGN
+<dead_caron> <U01F2>                 : "Dž"   U01C5               # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
+<dead_caron> <Sabovedot>             : "Ṧ"   U1E66               # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+<dead_caron> <sabovedot>             : "ṧ"   U1E67               # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+<dead_caron> <V>                     : "Ǚ"   U01D9               # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+<dead_caron> <v>                     : "ǚ"   U01DA               # LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+<dead_caron> <nobreakspace>          : "̌"   U030C               # COMBINING CARON
+<dead_cedilla> <Cacute>              : "Ḉ"   U1E08               # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+<dead_cedilla> <ColonSign>           : "₵"   U20B5               # CEDI SIGN
+<dead_cedilla> <cacute>              : "ḉ"   U1E09               # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+<dead_cedilla> <cent>                : "₵"   U20B5               # CEDI SIGN
+<dead_cedilla> <U0114>                       : "Ḝ"   U1E1C               # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+<dead_cedilla> <U0115>                       : "ḝ"   U1E1D               # LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+<dead_cedilla> <nobreakspace>        : "̧"   U0327               # COMBINING CEDILLA
+<dead_circumflex> <minus>            : "⁻"   U207B               # SUPERSCRIPT MINUS
+<dead_circumflex> <Aacute>           : "Ấ"   Acircumflexacute    # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+<dead_circumflex> <Agrave>           : "Ầ"   Acircumflexgrave    # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+<dead_circumflex> <Ahook>            : "Ẩ"   Acircumflexhook     # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_circumflex> <Atilde>           : "Ẫ"   Acircumflextilde    # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+<dead_circumflex> <aacute>           : "ấ"   acircumflexacute    # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+<dead_circumflex> <agrave>           : "ầ"   acircumflexgrave    # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+<dead_circumflex> <ahook>            : "ẩ"   acircumflexhook     # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_circumflex> <atilde>           : "ẫ"   acircumflextilde    # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+<dead_circumflex> <Eacute>           : "Ế"   Ecircumflexacute    # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+<dead_circumflex> <Egrave>           : "Ề"   Ecircumflexgrave    # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+<dead_circumflex> <Ehook>            : "Ể"   Ecircumflexhook     # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_circumflex> <Etilde>           : "Ễ"   Ecircumflextilde    # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+<dead_circumflex> <eacute>           : "ế"   ecircumflexacute    # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+<dead_circumflex> <egrave>           : "ề"   ecircumflexgrave    # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+<dead_circumflex> <ehook>            : "ể"   ecircumflexhook     # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_circumflex> <etilde>           : "ễ"   ecircumflextilde    # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+<dead_circumflex> <Oacute>           : "Ố"   Ocircumflexacute    # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+<dead_circumflex> <Ograve>           : "Ồ"   Ocircumflexgrave    # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+<dead_circumflex> <Ohook>            : "Ổ"   Ocircumflexhook     # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_circumflex> <Otilde>           : "Ỗ"   Ocircumflextilde    # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+<dead_circumflex> <oacute>           : "ố"   ocircumflexacute    # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+<dead_circumflex> <ograve>           : "ồ"   ocircumflexgrave    # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+<dead_circumflex> <ohook>            : "ổ"   ocircumflexhook     # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_circumflex> <otilde>           : "ỗ"   ocircumflextilde    # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+<dead_circumflex> <nobreakspace>      : "̂"   U0302               # COMBINING CIRCUMFLEX ACCENT
+<dead_belowcomma> <S>                : "Ș"   U0218               # LATIN CAPITAL LETTER S WITH COMMA BELOW
+<dead_belowcomma> <s>                : "ș"   U0219               # LATIN SMALL LETTER S WITH COMMA BELOW
+<dead_belowcomma> <T>                : "Ț"   U021A               # LATIN CAPITAL LETTER T WITH COMMA BELOW
+<dead_belowcomma> <t>                : "ț"   U021B               # LATIN SMALL LETTER T WITH COMMA BELOW
+<dead_belowcomma> <dead_belowcomma>   : ","   comma               # COMMA
+<dead_belowcomma> <nobreakspace>      : "̦"   U0326               # COMBINING COMMA BELOW
+<dead_belowcomma> <space>            : ","   comma               # COMMA
+<dead_currency> <A>                  : "₳"   U20B3               # AUSTRAL SIGN
+<dead_currency> <a>                  : "؋"   U060B               # AFGHANI SIGN
+<dead_currency> <B>                  : "₱"   U20B1               # PESO SIGN
+<dead_currency> <b>                  : "฿"   Thai_baht           # THAI CURRENCY SYMBOL BAHT
+<dead_currency> <Ccedilla>           : "₵"   U20B5               # CEDI SIGN
+<dead_currency> <C>                  : "₡"   ColonSign           # COLON SIGN
+<dead_currency> <ccedilla>           : "₵"   U20B5               # CEDI SIGN
+<dead_currency> <c>                  : "¢"   cent                # CENT SIGN
+<dead_currency> <D>                  : "₯"   U20AF               # DRACHMA SIGN
+<dead_currency> <d>                  : "₫"   DongSign            # DONG SIGN
+<dead_currency> <E>                  : "₠"   EcuSign             # EURO-CURRENCY SIGN
+<dead_currency> <e>                  : "€"   EuroSign            # EURO SIGN
+<dead_currency> <F>                  : "₣"   FFrancSign          # FRENCH FRANC SIGN
+<dead_currency> <f>                  : "ƒ"   function            # LATIN SMALL LETTER F WITH HOOK
+<dead_currency> <G>                  : "₲"   U20B2               # GUARANI SIGN
+<dead_currency> <g>                  : "₲"   U20B2               # GUARANI SIGN
+<dead_currency> <H>                  : "₴"   U20B4               # HRYVNIA SIGN
+<dead_currency> <h>                  : "₴"   U20B4               # HRYVNIA SIGN
+<dead_currency> <I>                  : "៛"   U17DB               # KHMER CURRENCY SYMBOL RIEL
+<dead_currency> <i>                  : "﷼"   UFDFC               # RIAL SIGN
+<dead_currency> <K>                  : "₭"   U20AD               # KIP SIGN
+<dead_currency> <k>                  : "₭"   U20AD               # KIP SIGN
+<dead_currency> <L>                  : "₤"   LiraSign            # LIRA SIGN
+<dead_currency> <l>                  : "£"   sterling            # POUND SIGN
+<dead_currency> <M>                  : "ℳ"   U2133               # SCRIPT CAPITAL M
+<dead_currency> <m>                  : "₥"   MillSign            # MILL SIGN
+<dead_currency> <N>                  : "₦"   NairaSign           # NAIRA SIGN
+<dead_currency> <n>                  : "₦"   NairaSign           # NAIRA SIGN
+<dead_currency> <O>                  : "૱"   U0AF1               # GUJARATI RUPEE SIGN
+<dead_currency> <o>                  : "௹"   U0BF9               # TAMIL RUPEE SIGN
+<dead_currency> <P>                  : "₧"   PesetaSign          # PESETA SIGN
+<dead_currency> <p>                  : "₰"   U20B0               # GERMAN PENNY SIGN
+<dead_currency> <r>                  : "₢"   CruzeiroSign        # CRUZEIRO SIGN
+<dead_currency> <R>                  : "₨"   RupeeSign           # RUPEE SIGN
+<dead_currency> <S>                  : "$"   dollar              # DOLLAR SIGN
+<dead_currency> <s>                  : "₪"   NewSheqelSign       # NEW SHEQEL SIGN
+<dead_currency> <T>                  : "₮"   U20AE               # TUGRIK SIGN
+<dead_currency> <t>                  : "৳"   U09F3               # BENGALI RUPEE SIGN
+<dead_currency> <THORN>              : "৲"   U09F2               # BENGALI RUPEE MARK
+<dead_currency> <thorn>              : "৲"   U09F2               # BENGALI RUPEE MARK
+<dead_currency> <U>                  : "圓"   U5713              # YUAN / WEN
+<dead_currency> <u>                  : "元"   U5143              # YUAN / WEN
+<dead_currency> <W>                  : "₩"   WonSign             # WON SIGN
+<dead_currency> <w>                  : "₩"   WonSign             # WON SIGN
+<dead_currency> <Y>                  : "円"   U5186              # YEN
+<dead_currency> <y>                  : "¥"   yen                 # YEN SIGN
+<dead_currency> <dead_currency>       : "¤"   currency            # CURRENCY SIGN
+<dead_currency> <nobreakspace>               : "¤"   currency            # CURRENCY SIGN
+<dead_currency> <space>              : "¤"   currency            # CURRENCY SIGN
+<dead_diaeresis> <Amacron>           : "Ǟ"   U01DE               # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+<dead_diaeresis> <amacron>           : "ǟ"   U01DF               # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+<dead_diaeresis> <Iacute>            : "Ḯ"   U1E2E               # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+<dead_diaeresis> <iacute>            : "ḯ"   U1E2F               # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+<dead_diaeresis> <Omacron>           : "Ȫ"   U022A               # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+<dead_diaeresis> <omacron>           : "ȫ"   U022B               # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+<dead_diaeresis> <Uacute>            : "Ǘ"   U01D7               # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+<dead_diaeresis> <U01D3>             : "Ǚ"   U01D9               # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+<dead_diaeresis> <Ugrave>            : "Ǜ"   U01DB               # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+<dead_diaeresis> <uacute>            : "ǘ"   U01D8               # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+<dead_diaeresis> <U01D4>             : "ǚ"   U01DA               # LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+<dead_diaeresis> <ugrave>            : "ǜ"   U01DC               # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+<dead_diaeresis> <nobreakspace>       : "̈"   U0308                # COMBINING DIAERESIS
+<dead_doubleacute> <nobreakspace>     : "̋"   U030B                # COMBINING DOUBLE ACUTE ACCENT
+<dead_grave> <V>                     : "Ǜ"   U01DB               # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+<dead_grave> <v>                     : "ǜ"   U01DC               # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+<dead_grave> <nobreakspace>          : "̀"   U0300      # COMBINING GRAVE ACCENT
+<dead_greek> <A>            : "Α"   U0391    # GREEK CAPITAL LETTER ALPHA
+<dead_greek> <a>            : "α"   U03B1    # GREEK SMALL LETTER ALPHA
+<dead_greek> <B>            : "Β"   U0392    # GREEK CAPITAL LETTER BETA
+<dead_greek> <b>            : "β"   U03B2    # GREEK SMALL LETTER BETA
+<dead_greek> <D>            : "Δ"   U0394    # GREEK CAPITAL LETTER DELTA
+<dead_greek> <d>            : "δ"   U03B4    # GREEK SMALL LETTER DELTA
+<dead_greek> <E>            : "Ε"   U0395    # GREEK CAPITAL LETTER EPSILON
+<dead_greek> <e>            : "ε"   U03B5    # GREEK SMALL LETTER EPSILON
+<dead_greek> <F>            : "Φ"   U03A6    # GREEK CAPITAL LETTER PHI
+<dead_greek> <f>            : "φ"   U03C6    # GREEK SMALL LETTER PHI
+<dead_greek> <G>            : "Γ"   U0393    # GREEK CAPITAL LETTER GAMMA
+<dead_greek> <g>            : "γ"   U03B3    # GREEK SMALL LETTER GAMMA
+<dead_greek> <H>            : "Η"   U0397    # GREEK CAPITAL LETTER ETA
+<dead_greek> <h>            : "η"   U03B7    # GREEK SMALL LETTER ETA
+<dead_greek> <I>            : "Ι"   U0399    # GREEK CAPITAL LETTER IOTA
+<dead_greek> <i>            : "ι"   U03B9    # GREEK SMALL LETTER IOTA
+<dead_greek> <J>            : "Θ"   U0398    # GREEK CAPITAL LETTER THETA
+<dead_greek> <j>            : "θ"   U03B8    # GREEK SMALL LETTER THETA
+<dead_greek> <K>            : "Κ"   U039A    # GREEK CAPITAL LETTER KAPPA
+<dead_greek> <k>            : "κ"   U03BA    # GREEK SMALL LETTER KAPPA
+<dead_greek> <L>            : "Λ"   U039B    # GREEK CAPITAL LETTER LAMDA
+<dead_greek> <l>            : "λ"   U03BB    # GREEK SMALL LETTER LAMDA
+<dead_greek> <M>            : "Μ"   U039C    # GREEK CAPITAL LETTER MU
+<dead_greek> <m>            : "μ"   U03BC    # GREEK SMALL LETTER MU
+<dead_greek> <N>            : "Ν"   U039D    # GREEK CAPITAL LETTER NU
+<dead_greek> <n>            : "ν"   U03BD    # GREEK SMALL LETTER NU
+<dead_greek> <O>            : "Ο"   U039F    # GREEK CAPITAL LETTER OMICRON
+<dead_greek> <o>            : "ο"   U03BF    # GREEK SMALL LETTER OMICRON
+<dead_greek> <P>            : "Π"   U03A0    # GREEK CAPITAL LETTER PI
+<dead_greek> <p>            : "π"   U03C0    # GREEK SMALL LETTER PI
+<dead_greek> <Q>            : "Χ"   U03A7    # GREEK CAPITAL LETTER CHI
+<dead_greek> <q>            : "χ"   U03C7    # GREEK SMALL LETTER CHI
+<dead_greek> <R>            : "Ρ"   U03A1    # GREEK CAPITAL LETTER RHO
+<dead_greek> <r>            : "ρ"   U03C1    # GREEK SMALL LETTER RHO
+<dead_greek> <S>            : "Σ"   U03A3    # GREEK CAPITAL LETTER SIGMA
+<dead_greek> <s>            : "σ"   U03C3    # GREEK SMALL LETTER SIGMA
+<dead_greek> <T>            : "Τ"   U03A4    # GREEK CAPITAL LETTER TAU
+<dead_greek> <t>            : "τ"   U03C4    # GREEK SMALL LETTER TAU
+<dead_greek> <U>            : "Υ"   U03A5    # GREEK CAPITAL LETTER UPSILON
+<dead_greek> <u>            : "υ"   U03C5    # GREEK SMALL LETTER UPSILON
+<dead_greek> <W>            : "Ω"   U03A9    # GREEK CAPITAL LETTER OMEGA
+<dead_greek> <w>            : "ω"   U03C9    # GREEK SMALL LETTER OMEGA
+<dead_greek> <X>            : "Ξ"   U039E    # GREEK CAPITAL LETTER XI
+<dead_greek> <x>            : "ξ"   U03BE    # GREEK SMALL LETTER XI
+<dead_greek> <Y>            : "Ψ"   U03A8    # GREEK CAPITAL LETTER PSI
+<dead_greek> <y>            : "ψ"   U03C8    # GREEK SMALL LETTER PSI
+<dead_greek> <Z>            : "Ζ"   U0396    # GREEK CAPITAL LETTER ZETA
+<dead_greek> <z>            : "ζ"   U03B6    # GREEK SMALL LETTER ZETA
+<dead_greek> <dead_greek>   : "µ"   U00B5    # MICRO SIGN
+<dead_greek> <nobreakspace> : "µ"   U00B5    # MICRO SIGN
+<dead_greek> <space>        : "µ"   U00B5    # MICRO SIGN
+<dead_hook> <B>                      : "Ɓ"   U0181               # LATIN CAPITAL LETTER B WITH HOOK
+<dead_hook> <b>                      : "ɓ"   U0253               # LATIN SMALL LETTER B WITH HOOK
+<dead_hook> <C>                      : "Ƈ"   U0187               # LATIN CAPITAL LETTER C WITH HOOK
+<dead_hook> <c>                      : "ƈ"   U0188               # LATIN SMALL LETTER C WITH HOOK
+<dead_hook> <D>                      : "Ɗ"   U018A               # LATIN CAPITAL LETTER D WITH HOOK
+<dead_hook> <d>                      : "ɗ"   U0257               # LATIN SMALL LETTER D WITH HOOK
+<dead_hook> <U0256>                  : "ᶑ"   U1D91               # LATIN SMALL LETTER D WITH HOOK AND TAIL
+<dead_hook> <F>                      : "Ƒ"   U0191               # LATIN CAPITAL LETTER F WITH HOOK
+<dead_hook> <f>                      : "ƒ"   function            # LATIN SMALL LETTER F WITH HOOK
+<dead_hook> <G>                      : "Ɠ"   U0193               # LATIN CAPITAL LETTER G WITH HOOK
+<dead_hook> <g>                      : "ɠ"   U0260               # LATIN SMALL LETTER G WITH HOOK
+<dead_hook> <h>                      : "ɦ"   U0266               # LATIN SMALL LETTER H WITH HOOK
+<dead_hook> <U025F>                  : "ʄ"   U0284               # LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK
+<dead_hook> <K>                      : "Ƙ"   U0198               # LATIN CAPITAL LETTER K WITH HOOK
+<dead_hook> <k>                      : "ƙ"   U0199               # LATIN SMALL LETTER K WITH HOOK
+<dead_hook> <M>                      : "Ɱ"   U2C6E               # LATIN CAPITAL LETTER M WITH HOOK
+<dead_hook> <m>                      : "ɱ"   U0271               # LATIN SMALL LETTER M WITH HOOK
+<dead_hook> <N>                      : "Ɲ"   U019D               # LATIN CAPITAL LETTER N WITH LEFT HOOK
+<dead_hook> <n>                      : "ɲ"   U0272               # LATIN SMALL LETTER N WITH LEFT HOOK
+<dead_hook> <P>                      : "Ƥ"   U01A4               # LATIN CAPITAL LETTER P WITH HOOK
+<dead_hook> <p>                      : "ƥ"   U01A5               # LATIN SMALL LETTER P WITH HOOK
+<dead_hook> <q>                      : "ʠ"   U02A0               # LATIN SMALL LETTER Q WITH HOOK
+<dead_hook> <U025C>                  : "ɝ"   U025D               # LATIN SMALL LETTER REVERSED OPEN E WITH HOOK
+<dead_hook> <r>                      : "ɼ"   U027C               # LATIN SMALL LETTER R WITH LONG LEG
+<dead_hook> <s>                      : "ʂ"   U0282               # LATIN SMALL LETTER S WITH HOOK
+<dead_hook> <schwa>                  : "ɚ"   U025A               # LATIN SMALL LETTER SCHWA WITH HOOK
+<dead_hook> <T>                      : "Ƭ"   U01AC               # LATIN CAPITAL LETTER T WITH HOOK
+<dead_hook> <t>                      : "ƭ"   U01AD               # LATIN SMALL LETTER T WITH HOOK
+<dead_hook> <U0279>                  : "ɻ"   U027B               # LATIN SMALL LETTER TURNED R WITH HOOK
+<dead_hook> <V>                      : "Ʋ"   U01B2               # LATIN CAPITAL LETTER V WITH HOOK
+<dead_hook> <v>                      : "ʋ"   U028B               # LATIN SMALL LETTER V WITH HOOK
+<dead_hook> <W>                      : "Ⱳ"   U2C72               # LATIN CAPITAL LETTER W WITH HOOK
+<dead_hook> <w>                      : "ⱳ"   U2C73               # LATIN SMALL LETTER W WITH HOOK
+<dead_hook> <Z>                      : "Ȥ"   U0224               # LATIN CAPITAL LETTER Z WITH HOOK
+<dead_hook> <z>                      : "ȥ"   U0225               # LATIN SMALL LETTER Z WITH HOOK
+<dead_hook> <dead_hook>              : "̉"   U0309                # COMBINING HOOK ABOVE
+<dead_hook> <nobreakspace>           : "̉"   U0309                # COMBINING HOOK ABOVE
+<dead_hook> <space>                  : "̉"   U0309                # COMBINING HOOK ABOVE
+<dead_horn> <Oacute>                 : "Ớ"   Ohornacute          # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+<dead_horn> <Obelowdot>              : "Ợ"   Ohornbelowdot       # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+<dead_horn> <Ograve>                 : "Ờ"   Ohorngrave          # LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+<dead_horn> <Ohook>                  : "Ở"   Ohornhook           # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+<dead_horn> <Otilde>                 : "Ỡ"   Ohorntilde          # LATIN CAPITAL LETTER O WITH HORN AND TILDE
+<dead_horn> <oacute>                 : "ớ"   ohornacute          # LATIN SMALL LETTER O WITH HORN AND ACUTE
+<dead_horn> <obelowdot>              : "ợ"   ohornbelowdot       # LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+<dead_horn> <ograve>                 : "ờ"   ohorngrave          # LATIN SMALL LETTER O WITH HORN AND GRAVE
+<dead_horn> <ohook>                  : "ở"   ohornhook           # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+<dead_horn> <otilde>                 : "ỡ"   ohorntilde          # LATIN SMALL LETTER O WITH HORN AND TILDE
+<dead_horn> <Uacute>                 : "Ứ"   Uhornacute          # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+<dead_horn> <Ubelowdot>              : "Ự"   Uhornbelowdot       # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+<dead_horn> <Ugrave>                 : "Ừ"   Uhorngrave          # LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+<dead_horn> <Uhook>                  : "Ử"   Uhornhook           # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+<dead_horn> <Utilde>                 : "Ữ"   Uhorntilde          # LATIN CAPITAL LETTER U WITH HORN AND TILDE
+<dead_horn> <uacute>                 : "ứ"   uhornacute          # LATIN SMALL LETTER U WITH HORN AND ACUTE
+<dead_horn> <ubelowdot>              : "ự"   uhornbelowdot       # LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+<dead_horn> <ugrave>                 : "ừ"   uhorngrave          # LATIN SMALL LETTER U WITH HORN AND GRAVE
+<dead_horn> <uhook>                  : "ử"   uhornhook           # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+<dead_horn> <utilde>                 : "ữ"   uhorntilde          # LATIN SMALL LETTER U WITH HORN AND TILDE
+<dead_horn> <dead_horn>              : "̛"   U031B                # COMBINING HORN
+<dead_horn> <nobreakspace>           : "̛"   U031B                # COMBINING HORN
+<dead_horn> <space>                  : "̛"   U031B                # COMBINING HORN
+<dead_macron> <Eacute>                       : "Ḗ"   U1E16               # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+<dead_macron> <Egrave>                       : "Ḕ"   U1E14               # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+<dead_macron> <eacute>                       : "ḗ"   U1E17               # LATIN SMALL LETTER E WITH MACRON AND ACUTE
+<dead_macron> <egrave>                       : "ḕ"   U1E15               # LATIN SMALL LETTER E WITH MACRON AND GRAVE
+<dead_macron> <Oacute>                       : "Ṓ"   U1E52               # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+<dead_macron> <Ograve>                       : "Ṑ"   U1E50               # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+<dead_macron> <oacute>                       : "ṓ"   U1E53               # LATIN SMALL LETTER O WITH MACRON AND ACUTE
+<dead_macron> <ograve>                       : "ṑ"   U1E51               # LATIN SMALL LETTER O WITH MACRON AND GRAVE
+<dead_macron> <V>                    : "Ǖ"   U01D5               # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+<dead_macron> <v>                    : "ǖ"   U01D6               # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+<dead_macron> <nobreakspace>         : "̄"   U0304                # COMBINING MACRON
+<dead_ogonek> <Omacron>              : "Ǭ"   U01EC               # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+<dead_ogonek> <omacron>              : "ǭ"   U01ED               # LATIN SMALL LETTER O WITH OGONEK AND MACRON
+<dead_ogonek> <nobreakspace>         : "̨"   U0328                # COMBINING OGONEK
+<dead_abovering> <Aacute>            : "Ǻ"   U01FA               # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+<dead_abovering> <aacute>            : "ǻ"   U01FB               # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+<dead_abovering> <nobreakspace>       : "̊"   U030A                # COMBINING RING ABOVE
+<dead_stroke> <2>                    : "ƻ"   U01BB               # LATIN LETTER TWO WITH STROKE
+<dead_stroke> <equal>                : "≠"   notequal            # NOT EQUAL TO
+<dead_stroke> <A>                    : "Ⱥ"   U023A               # LATIN CAPITAL LETTER A WITH STROKE
+<dead_stroke> <a>                    : "ⱥ"   U2C65               # LATIN SMALL LETTER A WITH STROKE
+<dead_stroke> <B>                    : "Ƀ"   U0243               # LATIN CAPITAL LETTER B WITH STROKE
+<dead_stroke> <C>                    : "Ȼ"   U023B               # LATIN CAPITAL LETTER C WITH STROKE
+<dead_stroke> <c>                    : "ȼ"   U023C               # LATIN SMALL LETTER C WITH STROKE
+<dead_stroke> <E>                    : "Ɇ"   U0246               # LATIN CAPITAL LETTER E WITH STROKE
+<dead_stroke> <e>                    : "ɇ"   U0247               # LATIN SMALL LETTER E WITH STROKE
+<dead_stroke> <greater>              : "≯"   U226F               # NOT GREATER-THAN
+<dead_stroke> <greaterthanequal>      : "≱"   U2271               # NEITHER GREATER-THAN NOR EQUAL TO
+<dead_stroke> <J>                    : "Ɉ"   U0248               # LATIN CAPITAL LETTER J WITH STROKE
+<dead_stroke> <j>                    : "ɉ"   U0249               # LATIN SMALL LETTER J WITH STROKE
+<dead_stroke> <U0269>                : "ᵼ"   U1D7C               # LATIN SMALL LETTER IOTA WITH STROKE
+<dead_stroke> <U0237>                : "ɟ"   U025F               # LATIN SMALL LETTER DOTLESS J WITH STROKE
+<dead_stroke> <less>                 : "≮"   U226E               # NOT LESS-THAN
+<dead_stroke> <lessthanequal>        : "≰"   U2270               # NEITHER LESS-THAN NOR EQUAL TO
+<dead_stroke> <Oacute>                       : "Ǿ"   U01FE               # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+<dead_stroke> <oacute>                       : "ǿ"   U01FF               # LATIN SMALL LETTER O WITH STROKE AND ACUTE
+<dead_stroke> <P>                    : "Ᵽ"   U2C63               # LATIN CAPITAL LETTER P WITH STROKE
+<dead_stroke> <p>                    : "ᵽ"   U1D7D               # LATIN SMALL LETTER P WITH STROKE
+<dead_stroke> <R>                    : "Ɍ"   U024C               # LATIN CAPITAL LETTER R WITH STROKE
+<dead_stroke> <r>                    : "ɍ"   U024D               # LATIN SMALL LETTER R WITH STROKE
+<dead_stroke> <U>                    : "Ʉ"   U0244               # LATIN CAPITAL LETTER U BAR
+<dead_stroke> <u>                    : "ʉ"   U0289               # LATIN SMALL LETTER U BAR
+<dead_stroke> <Y>                    : "Ɏ"   U024E               # LATIN CAPITAL LETTER Y WITH STROKE
+<dead_stroke> <y>                    : "ɏ"   U024F               # LATIN SMALL LETTER Y WITH STROKE
+<dead_stroke> <dead_stroke>          : "/"   slash               # SOLIDUS
+<dead_stroke> <nobreakspace>         : "̸"   U0338                # COMBINING LONG SOLIDUS OVERLAY
+<dead_stroke> <space>                : "/"   slash               # SOLIDUS
+<dead_tilde> <Oacute>                : "Ṍ"   U1E4C               # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+<dead_tilde> <Odiaeresis>            : "Ṏ"   U1E4E               # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+<dead_tilde> <Omacron>                       : "Ȭ"   U022C               # LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+<dead_tilde> <oacute>                : "ṍ"   U1E4D               # LATIN SMALL LETTER O WITH TILDE AND ACUTE
+<dead_tilde> <odiaeresis>            : "ṏ"   U1E4F               # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+<dead_tilde> <omacron>                       : "ȭ"   U022D               # LATIN SMALL LETTER O WITH TILDE AND MACRON
+<dead_tilde> <Uacute>                : "Ṹ"   U1E78               # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+<dead_tilde> <uacute>                : "ṹ"   U1E79               # LATIN SMALL LETTER U WITH TILDE AND ACUTE
+<dead_tilde> <equal>                 : "≃"   similarequal        # ASYMPTOTICALLY EQUAL TO
+<dead_tilde> <less>                  : "≲"   U2272               # LESS-THAN OR EQUIVALENT TO
+<dead_tilde> <greater>                       : "≳"   U2273               # GREATER-THAN OR EQUIVALENT TO
+<dead_tilde> <nobreakspace>          : "̃"   U0303      # COMBINING TILDE
+<dead_acute> <dead_abovedot> <S>      : "Ṥ"   U1E64               # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+<dead_acute> <dead_abovedot> <s>      : "ṥ"   U1E65               # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+<dead_belowdot> <dead_abovedot> <S>   : "Ṩ"   U1E68               # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+<dead_belowdot> <dead_abovedot> <s>   : "ṩ"   U1E69               # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+<dead_caron> <dead_abovedot> <S>      : "Ṧ"   U1E66               # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+<dead_caron> <dead_abovedot> <s>      : "ṧ"   U1E67               # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+<dead_abovedot> <dead_macron> <A>     : "Ǡ"   U01E0               # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+<dead_abovedot> <dead_macron> <a>     : "ǡ"   U01E1               # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+<dead_abovedot> <dead_macron> <O>     : "Ȱ"   U0230               # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+<dead_abovedot> <dead_macron> <o>     : "ȱ"   U0231               # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+<dead_abovedot> <dead_stroke> <j>     : "ɟ"   U025F               # LATIN SMALL LETTER DOTLESS J WITH STROKE
+<dead_stroke> <dead_abovedot> <j>     : "ɟ"   U025F               # LATIN SMALL LETTER DOTLESS J WITH STROKE
+<dead_breve> <dead_acute> <A>        : "Ắ"   Abreveacute         # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+<dead_breve> <dead_acute> <a>        : "ắ"   abreveacute         # LATIN SMALL LETTER A WITH BREVE AND ACUTE
+<dead_cedilla> <dead_acute> <C>       : "Ḉ"   U1E08               # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+<dead_cedilla> <dead_acute> <c>       : "ḉ"   U1E09               # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+<dead_circumflex> <dead_acute> <A>    : "Ấ"   Acircumflexacute    # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+<dead_circumflex> <dead_acute> <a>    : "ấ"   acircumflexacute    # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+<dead_circumflex> <dead_acute> <E>    : "Ế"   Ecircumflexacute    # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+<dead_circumflex> <dead_acute> <e>    : "ế"   ecircumflexacute    # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+<dead_circumflex> <dead_acute> <O>    : "Ố"   Ocircumflexacute    # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+<dead_circumflex> <dead_acute> <o>    : "ố"   ocircumflexacute    # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+<dead_diaeresis> <dead_acute> <I>     : "Ḯ"   U1E2E               # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+<dead_diaeresis> <dead_acute> <i>     : "ḯ"   U1E2F               # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+<dead_diaeresis> <dead_acute> <U>     : "Ǘ"   U01D7               # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+<dead_diaeresis> <dead_acute> <u>     : "ǘ"   U01D8               # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+<dead_horn> <dead_acute> <O>         : "Ớ"   Ohornacute          # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+<dead_horn> <dead_acute> <o>         : "ớ"   ohornacute          # LATIN SMALL LETTER O WITH HORN AND ACUTE
+<dead_horn> <dead_acute> <U>         : "Ứ"   Uhornacute          # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+<dead_horn> <dead_acute> <u>         : "ứ"   uhornacute          # LATIN SMALL LETTER U WITH HORN AND ACUTE
+<dead_macron> <dead_acute> <E>               : "Ḗ"   U1E16               # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+<dead_macron> <dead_acute> <e>               : "ḗ"   U1E17               # LATIN SMALL LETTER E WITH MACRON AND ACUTE
+<dead_macron> <dead_acute> <O>               : "Ṓ"   U1E52               # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+<dead_macron> <dead_acute> <o>               : "ṓ"   U1E53               # LATIN SMALL LETTER O WITH MACRON AND ACUTE
+<dead_abovering> <dead_acute> <A>     : "Ǻ"   U01FA               # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+<dead_abovering> <dead_acute> <a>     : "ǻ"   U01FB               # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+<dead_tilde> <dead_acute> <O>        : "Ṍ"   U1E4C               # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+<dead_tilde> <dead_acute> <o>        : "ṍ"   U1E4D               # LATIN SMALL LETTER O WITH TILDE AND ACUTE
+<dead_tilde> <dead_acute> <U>        : "Ṹ"   U1E78               # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+<dead_tilde> <dead_acute> <u>        : "ṹ"   U1E79               # LATIN SMALL LETTER U WITH TILDE AND ACUTE
+<dead_belowdot> <dead_breve> <A>      : "Ặ"   Abrevebelowdot      # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+<dead_belowdot> <dead_breve> <a>      : "ặ"   abrevebelowdot      # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+<dead_belowdot> <dead_circumflex> <A> : "Ậ"   Acircumflexbelowdot # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+<dead_belowdot> <dead_circumflex> <a> : "ậ"   acircumflexbelowdot # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+<dead_belowdot> <dead_circumflex> <E> : "Ệ"   Ecircumflexbelowdot # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+<dead_belowdot> <dead_circumflex> <e> : "ệ"   ecircumflexbelowdot # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+<dead_belowdot> <dead_circumflex> <O> : "Ộ"   Ocircumflexbelowdot # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+<dead_belowdot> <dead_circumflex> <o> : "ộ"   ocircumflexbelowdot # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+<dead_horn> <dead_belowdot> <O>       : "Ợ"   Ohornbelowdot       # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+<dead_horn> <dead_belowdot> <o>       : "ợ"   ohornbelowdot       # LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+<dead_horn> <dead_belowdot> <U>       : "Ự"   Uhornbelowdot       # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+<dead_horn> <dead_belowdot> <u>       : "ự"   uhornbelowdot       # LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+<dead_belowdot> <dead_macron> <L>     : "Ḹ"   U1E38               # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+<dead_belowdot> <dead_macron> <l>     : "ḹ"   U1E39               # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+<dead_belowdot> <dead_macron> <R>     : "Ṝ"   U1E5C               # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+<dead_belowdot> <dead_macron> <r>     : "ṝ"   U1E5D               # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+<dead_cedilla> <dead_breve> <E>       : "Ḝ"   U1E1C               # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+<dead_cedilla> <dead_breve> <e>       : "ḝ"   U1E1D               # LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+<dead_breve> <dead_grave> <A>        : "Ằ"   Abrevegrave         # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+<dead_breve> <dead_grave> <a>        : "ằ"   abrevegrave         # LATIN SMALL LETTER A WITH BREVE AND GRAVE
+<dead_breve> <dead_hook> <A>         : "Ẳ"   Abrevehook          # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+<dead_breve> <dead_hook> <a>         : "ẳ"   abrevehook          # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+<dead_breve> <dead_tilde> <A>        : "Ẵ"   Abrevetilde         # LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+<dead_breve> <dead_tilde> <a>        : "ẵ"   abrevetilde         # LATIN SMALL LETTER A WITH BREVE AND TILDE
+<dead_diaeresis> <dead_caron> <U>     : "Ǚ"   U01D9               # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+<dead_diaeresis> <dead_caron> <u>     : "ǚ"   U01DA               # LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+<dead_cedilla> <dead_currency> <C>    : "₵"   U20B5               # CEDI SIGN
+<dead_currency> <dead_cedilla> <C>    : "₵"   U20B5               # CEDI SIGN
+<dead_cedilla> <dead_currency> <c>    : "₵"   U20B5               # CEDI SIGN
+<dead_currency> <dead_cedilla> <c>    : "₵"   U20B5               # CEDI SIGN
+<dead_circumflex> <dead_grave> <A>    : "Ầ"   Acircumflexgrave    # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+<dead_circumflex> <dead_grave> <a>    : "ầ"   acircumflexgrave    # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+<dead_circumflex> <dead_grave> <E>    : "Ề"   Ecircumflexgrave    # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+<dead_circumflex> <dead_grave> <e>    : "ề"   ecircumflexgrave    # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+<dead_circumflex> <dead_grave> <O>    : "Ồ"   Ocircumflexgrave    # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+<dead_circumflex> <dead_grave> <o>    : "ồ"   ocircumflexgrave    # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+<dead_circumflex> <dead_hook> <A>     : "Ẩ"   Acircumflexhook     # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_circumflex> <dead_hook> <a>     : "ẩ"   acircumflexhook     # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_circumflex> <dead_hook> <E>     : "Ể"   Ecircumflexhook     # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_circumflex> <dead_hook> <e>     : "ể"   ecircumflexhook     # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_circumflex> <dead_hook> <O>     : "Ổ"   Ocircumflexhook     # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_circumflex> <dead_hook> <o>     : "ổ"   ocircumflexhook     # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_circumflex> <dead_tilde> <A>    : "Ẫ"   Acircumflextilde    # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+<dead_circumflex> <dead_tilde> <a>    : "ẫ"   acircumflextilde    # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+<dead_circumflex> <dead_tilde> <E>    : "Ễ"   Ecircumflextilde    # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+<dead_circumflex> <dead_tilde> <e>    : "ễ"   ecircumflextilde    # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+<dead_circumflex> <dead_tilde> <O>    : "Ỗ"   Ocircumflextilde    # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+<dead_circumflex> <dead_tilde> <o>    : "ỗ"   ocircumflextilde    # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+<dead_diaeresis> <dead_grave> <U>     : "Ǜ"   U01DB               # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+<dead_diaeresis> <dead_grave> <u>     : "ǜ"   U01DC               # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+<dead_diaeresis> <dead_macron> <A>    : "Ǟ"   U01DE               # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+<dead_diaeresis> <dead_macron> <a>    : "ǟ"   U01DF               # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+<dead_diaeresis> <dead_macron> <O>    : "Ȫ"   U022A               # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+<dead_diaeresis> <dead_macron> <o>    : "ȫ"   U022B               # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+<dead_tilde> <dead_diaeresis> <O>     : "Ṏ"   U1E4E               # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+<dead_tilde> <dead_diaeresis> <o>     : "ṏ"   U1E4F               # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+<dead_horn> <dead_grave> <O>         : "Ờ"   Ohorngrave          # LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+<dead_horn> <dead_grave> <o>         : "ờ"   ohorngrave          # LATIN SMALL LETTER O WITH HORN AND GRAVE
+<dead_horn> <dead_grave> <U>         : "Ừ"   Uhorngrave          # LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+<dead_horn> <dead_grave> <u>         : "ừ"   uhorngrave          # LATIN SMALL LETTER U WITH HORN AND GRAVE
+<dead_macron> <dead_grave> <E>               : "Ḕ"   U1E14               # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+<dead_macron> <dead_grave> <e>               : "ḕ"   U1E15               # LATIN SMALL LETTER E WITH MACRON AND GRAVE
+<dead_macron> <dead_grave> <O>               : "Ṑ"   U1E50               # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+<dead_macron> <dead_grave> <o>               : "ṑ"   U1E51               # LATIN SMALL LETTER O WITH MACRON AND GRAVE
+<dead_horn> <dead_hook> <O>          : "Ở"   Ohornhook           # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+<dead_horn> <dead_hook> <o>          : "ở"   ohornhook           # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+<dead_horn> <dead_hook> <U>          : "Ử"   Uhornhook           # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+<dead_horn> <dead_hook> <u>          : "ử"   uhornhook           # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+<dead_horn> <dead_tilde> <O>         : "Ỡ"   Ohorntilde          # LATIN CAPITAL LETTER O WITH HORN AND TILDE
+<dead_horn> <dead_tilde> <o>         : "ỡ"   ohorntilde          # LATIN SMALL LETTER O WITH HORN AND TILDE
+<dead_horn> <dead_tilde> <U>         : "Ữ"   Uhorntilde          # LATIN CAPITAL LETTER U WITH HORN AND TILDE
+<dead_horn> <dead_tilde> <u>         : "ữ"   uhorntilde          # LATIN SMALL LETTER U WITH HORN AND TILDE
+<dead_ogonek> <dead_macron> <O>       : "Ǭ"   U01EC               # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+<dead_ogonek> <dead_macron> <o>       : "ǭ"   U01ED               # LATIN SMALL LETTER O WITH OGONEK AND MACRON
+<dead_tilde> <dead_macron> <O>               : "Ȭ"   U022C               # LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+<dead_tilde> <dead_macron> <o>               : "ȭ"   U022D               # LATIN SMALL LETTER O WITH TILDE AND MACRON
+<dead_greek>  <dead_hook>   <U> : "ϒ"    U03D2    # GREEK UPSILON WITH HOOK SYMBOL
+<dead_hook>   <dead_greek>  <U> : "ϒ"    U03D2    # GREEK UPSILON WITH HOOK SYMBOL
+<dead_greek>  <dead_macron> <A> : "Ᾱ"    U1FB9    # GREEK CAPITAL LETTER ALPHA WITH MACRON
+<dead_macron> <dead_greek>  <A> : "Ᾱ"    U1FB9    # GREEK CAPITAL LETTER ALPHA WITH MACRON
+<dead_greek>  <dead_macron> <a> : "ᾱ"    U1FB1    # GREEK SMALL LETTER ALPHA WITH MACRON
+<dead_macron> <dead_greek>  <a> : "ᾱ"    U1FB1    # GREEK SMALL LETTER ALPHA WITH MACRON
+<dead_greek>  <dead_macron> <I> : "Ῑ"    U1FD9    # GREEK CAPITAL LETTER IOTA WITH MACRON
+<dead_macron> <dead_greek>  <I> : "Ῑ"    U1FD9    # GREEK CAPITAL LETTER IOTA WITH MACRON
+<dead_greek>  <dead_macron> <i> : "ῑ"    U1FD1    # GREEK SMALL LETTER IOTA WITH MACRON
+<dead_macron> <dead_greek>  <i> : "ῑ"    U1FD1    # GREEK SMALL LETTER IOTA WITH MACRON
+<dead_greek>  <dead_macron> <U> : "Ῡ"    U1FE9    # GREEK CAPITAL LETTER UPSILON WITH MACRON
+<dead_macron> <dead_greek>  <U> : "Ῡ"    U1FE9    # GREEK CAPITAL LETTER UPSILON WITH MACRON
+<dead_greek>  <dead_macron> <u> : "ῡ"    U1FE1    # GREEK SMALL LETTER UPSILON WITH MACRON
+<dead_macron> <dead_greek>  <u> : "ῡ"    U1FE1    # GREEK SMALL LETTER UPSILON WITH MACRON
+<dead_greek>  <dead_stroke> <r> : "ϼ"    U03FC    # GREEK RHO WITH STROKE SYMBOL
+<dead_stroke> <dead_greek>  <r> : "ϼ"    U03FC    # GREEK RHO WITH STROKE SYMBOL
+
+XCOMM
+XCOMM Cyrillic NFDs
+XCOMM
+
+<dead_doublegrave> <Cyrillic_a>                        : "а̏"                # CYRILLIC SMALL LETTER A WITH COMBINING DOUBLE GRAVE ACCENT
+<Multi_key> <grave> <grave> <Cyrillic_a>       : "а̏"                # CYRILLIC SMALL LETTER A WITH COMBINING DOUBLE GRAVE ACCENT
+
+<dead_invertedbreve> <Cyrillic_a>              : "а̑"                # CYRILLIC SMALL LETTER A WITH COMBINING INVERTED BREVE
+
+<dead_grave> <Cyrillic_a>                      : "а̀"                # CYRILLIC SMALL LETTER A WITH COMBINING GRAVE ACCENT
+<Multi_key> <grave> <Cyrillic_a>               : "а̀"                # CYRILLIC SMALL LETTER A WITH COMBINING GRAVE ACCENT
+
+<dead_acute> <Cyrillic_a>                      : "а́"                # CYRILLIC SMALL LETTER A WITH COMBINING ACUTE ACCENT
+<Multi_key> <acute> <Cyrillic_a>               : "а́"                # CYRILLIC SMALL LETTER A WITH COMBINING ACUTE ACCENT
+<Multi_key> <apostrophe> <Cyrillic_a>          : "а́"                # CYRILLIC SMALL LETTER A WITH COMBINING ACUTE ACCENT
+
+<dead_macron> <Cyrillic_a>                     : "а̄"                # CYRILLIC SMALL LETTER A WITH COMBINING MACRON
+<Multi_key> <macron> <Cyrillic_a>              : "а̄"                # CYRILLIC SMALL LETTER A WITH COMBINING MACRON
+<Multi_key> <underscore> <Cyrillic_a>          : "а̄"                # CYRILLIC SMALL LETTER A WITH COMBINING MACRON
+
+<dead_circumflex> <Cyrillic_a>                 : "а̂"                # CYRILLIC SMALL LETTER A WITH COMBINING CIRCUMFLEX ACCENT
+<Multi_key> <asciicircum> <Cyrillic_a>         : "а̂"                # CYRILLIC SMALL LETTER A WITH COMBINING CIRCUMFLEX ACCENT
+
+<dead_doublegrave> <Cyrillic_A>                        : "А̏"                # CYRILLIC CAPITAL LETTER A WITH COMBINING DOUBLE GRAVE ACCENT
+<Multi_key> <grave> <grave> <Cyrillic_A>       : "А̏"                # CYRILLIC CAPITAL LETTER A WITH COMBINING DOUBLE GRAVE ACCENT
+
+<dead_invertedbreve> <Cyrillic_A>              : "А̑"                # CYRILLIC CAPITAL LETTER A WITH COMBINING INVERTED BREVE
+
+<dead_grave> <Cyrillic_A>                      : "А̀"                # CYRILLIC CAPITAL LETTER A WITH COMBINING GRAVE ACCENT
+<Multi_key> <grave> <Cyrillic_A>               : "А̀"                # CYRILLIC CAPITAL LETTER A WITH COMBINING GRAVE ACCENT
+
+<dead_acute> <Cyrillic_A>                      : "А́"                # CYRILLIC CAPITAL LETTER A WITH COMBINING ACUTE ACCENT
+<Multi_key> <acute> <Cyrillic_A>               : "А́"                # CYRILLIC CAPITAL LETTER A WITH COMBINING ACUTE ACCENT
+<Multi_key> <apostrophe> <Cyrillic_A>          : "А́"                # CYRILLIC CAPITAL LETTER A WITH COMBINING ACUTE ACCENT
+
+<dead_macron> <Cyrillic_A>                     : "А̄"                # CYRILLIC CAPITAL LETTER A WITH COMBINING MACRON
+<Multi_key> <macron> <Cyrillic_A>              : "А̄"                # CYRILLIC CAPITAL LETTER A WITH COMBINING MACRON
+<Multi_key> <underscore> <Cyrillic_A>          : "А̄"                # CYRILLIC CAPITAL LETTER A WITH COMBINING MACRON
+
+<dead_circumflex> <Cyrillic_A>                 : "А̂"                # CYRILLIC CAPITAL LETTER A WITH COMBINING CIRCUMFLEX ACCENT
+<Multi_key> <asciicircum> <Cyrillic_A>         : "А̂"                # CYRILLIC CAPITAL LETTER A WITH COMBINING CIRCUMFLEX ACCENT
+
+<dead_doublegrave> <Cyrillic_ie>               : "е̏"                # CYRILLIC SMALL LETTER IE WITH COMBINING DOUBLE GRAVE ACCENT
+<Multi_key> <grave> <grave> <Cyrillic_ie>      : "е̏"                # CYRILLIC SMALL LETTER IE WITH COMBINING DOUBLE GRAVE ACCENT
+
+<dead_invertedbreve> <Cyrillic_ie>             : "е̑"                # CYRILLIC SMALL LETTER IE WITH COMBINING INVERTED BREVE
+
+<dead_acute> <Cyrillic_ie>                     : "е́"                # CYRILLIC SMALL LETTER IE WITH COMBINING ACUTE ACCENT
+<Multi_key> <acute> <Cyrillic_ie>              : "е́"                # CYRILLIC SMALL LETTER IE WITH COMBINING ACUTE ACCENT
+<Multi_key> <apostrophe> <Cyrillic_ie>         : "е́"                # CYRILLIC SMALL LETTER IE WITH COMBINING ACUTE ACCENT
+
+<dead_macron> <Cyrillic_ie>                    : "е̄"                # CYRILLIC SMALL LETTER IE WITH COMBINING MACRON
+<Multi_key> <macron> <Cyrillic_ie>             : "е̄"                # CYRILLIC SMALL LETTER IE WITH COMBINING MACRON
+<Multi_key> <underscore> <Cyrillic_ie>         : "е̄"                # CYRILLIC SMALL LETTER IE WITH COMBINING MACRON
+
+<dead_circumflex> <Cyrillic_ie>                        : "е̂"                # CYRILLIC SMALL LETTER IE WITH COMBINING CIRCUMFLEX ACCENT
+<Multi_key> <asciicircum> <Cyrillic_ie>                : "е̂"                # CYRILLIC SMALL LETTER IE WITH COMBINING CIRCUMFLEX ACCENT
+
+<dead_doublegrave> <Cyrillic_IE>               : "Е̏"                # CYRILLIC CAPITAL LETTER IE WITH COMBINING DOUBLE GRAVE ACCENT
+<Multi_key> <grave> <grave> <Cyrillic_IE>      : "Е̏"                # CYRILLIC CAPITAL LETTER IE WITH COMBINING DOUBLE GRAVE ACCENT
+
+<dead_invertedbreve> <Cyrillic_IE>             : "Е̑"                # CYRILLIC CAPITAL LETTER IE WITH COMBINING INVERTED BREVE
+
+<dead_acute> <Cyrillic_IE>                     : "Е́"                # CYRILLIC CAPITAL LETTER IE WITH COMBINING ACUTE ACCENT
+<Multi_key> <acute> <Cyrillic_IE>              : "Е́"                # CYRILLIC CAPITAL LETTER IE WITH COMBINING ACUTE ACCENT
+<Multi_key> <apostrophe> <Cyrillic_IE>         : "Е́"                # CYRILLIC CAPITAL LETTER IE WITH COMBINING ACUTE ACCENT
+
+<dead_macron> <Cyrillic_IE>                    : "Е̄"                # CYRILLIC CAPITAL LETTER IE WITH COMBINING MACRON
+<Multi_key> <macron> <Cyrillic_IE>             : "Е̄"                # CYRILLIC CAPITAL LETTER IE WITH COMBINING MACRON
+<Multi_key> <underscore> <Cyrillic_IE>         : "Е̄"                # CYRILLIC CAPITAL LETTER IE WITH COMBINING MACRON
+
+<dead_circumflex> <Cyrillic_IE>                        : "Е̂"                # CYRILLIC CAPITAL LETTER IE WITH COMBINING CIRCUMFLEX ACCENT
+<Multi_key> <asciicircum> <Cyrillic_IE>                : "Е̂"                # CYRILLIC CAPITAL LETTER IE WITH COMBINING CIRCUMFLEX ACCENT
+
+<dead_doublegrave> <Cyrillic_i>                        : "и̏"                # CYRILLIC SMALL LETTER I WITH COMBINING DOUBLE GRAVE ACCENT
+<Multi_key> <grave> <grave> <Cyrillic_i>       : "и̏"                # CYRILLIC SMALL LETTER I WITH COMBINING DOUBLE GRAVE ACCENT
+
+<dead_invertedbreve> <Cyrillic_i>              : "и̑"                # CYRILLIC SMALL LETTER I WITH COMBINING INVERTED BREVE
+
+<dead_acute> <Cyrillic_i>                      : "и́"                # CYRILLIC SMALL LETTER I WITH COMBINING ACUTE ACCENT
+<Multi_key> <acute> <Cyrillic_i>               : "и́"                # CYRILLIC SMALL LETTER I WITH COMBINING ACUTE ACCENT
+<Multi_key> <apostrophe> <Cyrillic_i>          : "и́"                # CYRILLIC SMALL LETTER I WITH COMBINING ACUTE ACCENT
+
+<dead_circumflex> <Cyrillic_i>                 : "и̂"                # CYRILLIC SMALL LETTER I WITH COMBINING CIRCUMFLEX ACCENT
+<Multi_key> <asciicircum> <Cyrillic_i>         : "и̂"                # CYRILLIC SMALL LETTER I WITH COMBINING CIRCUMFLEX ACCENT
+
+<dead_doublegrave> <Cyrillic_I>                        : "И̏"                # CYRILLIC CAPITAL LETTER I WITH COMBINING DOUBLE GRAVE ACCENT
+<Multi_key> <grave> <grave> <Cyrillic_I>       : "И̏"                # CYRILLIC CAPITAL LETTER I WITH COMBINING DOUBLE GRAVE ACCENT
+
+<dead_invertedbreve> <Cyrillic_I>              : "И̑"                # CYRILLIC CAPITAL LETTER I WITH COMBINING INVERTED BREVE
+
+<dead_acute> <Cyrillic_I>                      : "И́"                # CYRILLIC CAPITAL LETTER I WITH COMBINING ACUTE ACCENT
+<Multi_key> <acute> <Cyrillic_I>               : "И́"                # CYRILLIC CAPITAL LETTER I WITH COMBINING ACUTE ACCENT
+<Multi_key> <apostrophe> <Cyrillic_I>          : "И́"                # CYRILLIC CAPITAL LETTER I WITH COMBINING ACUTE ACCENT
+
+<dead_circumflex> <Cyrillic_I>                 : "И̂"                # CYRILLIC CAPITAL LETTER I WITH COMBINING CIRCUMFLEX ACCENT
+<Multi_key> <asciicircum> <Cyrillic_I>         : "И̂"                # CYRILLIC CAPITAL LETTER I WITH COMBINING CIRCUMFLEX ACCENT
+
+<dead_doublegrave> <Cyrillic_o>                        : "о̏"                # CYRILLIC SMALL LETTER O WITH COMBINING DOUBLE GRAVE ACCENT
+<Multi_key> <grave> <grave> <Cyrillic_o>       : "о̏"                # CYRILLIC SMALL LETTER O WITH COMBINING DOUBLE GRAVE ACCENT
+
+<dead_invertedbreve> <Cyrillic_o>              : "о̑"                # CYRILLIC SMALL LETTER O WITH COMBINING INVERTED BREVE
+
+<dead_grave> <Cyrillic_o>                      : "о̀"                # CYRILLIC SMALL LETTER O WITH COMBINING GRAVE ACCENT
+<Multi_key> <grave> <Cyrillic_o>               : "о̀"                # CYRILLIC SMALL LETTER O WITH COMBINING GRAVE ACCENT
+
+<dead_acute> <Cyrillic_o>                      : "о́"                # CYRILLIC SMALL LETTER O WITH COMBINING ACUTE ACCENT
+<Multi_key> <acute> <Cyrillic_o>               : "о́"                # CYRILLIC SMALL LETTER O WITH COMBINING ACUTE ACCENT
+<Multi_key> <apostrophe> <Cyrillic_o>          : "о́"                # CYRILLIC SMALL LETTER O WITH COMBINING ACUTE ACCENT
+
+<dead_macron> <Cyrillic_o>                     : "о̄"                # CYRILLIC SMALL LETTER O WITH COMBINING MACRON
+<Multi_key> <macron> <Cyrillic_o>              : "о̄"                # CYRILLIC SMALL LETTER O WITH COMBINING MACRON
+<Multi_key> <underscore> <Cyrillic_o>          : "о̄"                # CYRILLIC SMALL LETTER O WITH COMBINING MACRON
+
+<dead_circumflex> <Cyrillic_o>                 : "о̂"                # CYRILLIC SMALL LETTER O WITH COMBINING CIRCUMFLEX ACCENT
+<Multi_key> <asciicircum> <Cyrillic_o>         : "о̂"                # CYRILLIC SMALL LETTER O WITH COMBINING CIRCUMFLEX ACCENT
+
+<dead_doublegrave> <Cyrillic_O>                        : "О̏"                # CYRILLIC CAPITAL LETTER O WITH COMBINING DOUBLE GRAVE ACCENT
+<Multi_key> <grave> <grave> <Cyrillic_O>       : "О̏"                # CYRILLIC CAPITAL LETTER O WITH COMBINING DOUBLE GRAVE ACCENT
+
+<dead_invertedbreve> <Cyrillic_O>              : "О̑"                # CYRILLIC CAPITAL LETTER O WITH COMBINING INVERTED BREVE
+
+<dead_grave> <Cyrillic_O>                      : "О̀"                # CYRILLIC CAPITAL LETTER O WITH COMBINING GRAVE ACCENT
+<Multi_key> <grave> <Cyrillic_O>               : "О̀"                # CYRILLIC CAPITAL LETTER O WITH COMBINING GRAVE ACCENT
+
+<dead_acute> <Cyrillic_O>                      : "О́"                # CYRILLIC CAPITAL LETTER O WITH COMBINING ACUTE ACCENT
+<Multi_key> <acute> <Cyrillic_O>               : "О́"                # CYRILLIC CAPITAL LETTER O WITH COMBINING ACUTE ACCENT
+<Multi_key> <apostrophe> <Cyrillic_O>          : "О́"                # CYRILLIC CAPITAL LETTER O WITH COMBINING ACUTE ACCENT
+
+<dead_macron> <Cyrillic_O>                     : "О̄"                # CYRILLIC CAPITAL LETTER O WITH COMBINING MACRON
+<Multi_key> <macron> <Cyrillic_O>              : "О̄"                # CYRILLIC CAPITAL LETTER O WITH COMBINING MACRON
+<Multi_key> <underscore> <Cyrillic_O>          : "О̄"                # CYRILLIC CAPITAL LETTER O WITH COMBINING MACRON
+
+<dead_circumflex> <Cyrillic_O>                 : "О̂"                # CYRILLIC CAPITAL LETTER O WITH COMBINING CIRCUMFLEX ACCENT
+<Multi_key> <asciicircum> <Cyrillic_O>         : "О̂"                # CYRILLIC CAPITAL LETTER O WITH COMBINING CIRCUMFLEX ACCENT
+
+<dead_doublegrave> <Cyrillic_u>                        : "у̏"                # CYRILLIC SMALL LETTER U WITH COMBINING DOUBLE GRAVE ACCENT
+<Multi_key> <grave> <grave> <Cyrillic_u>       : "у̏"                # CYRILLIC SMALL LETTER U WITH COMBINING DOUBLE GRAVE ACCENT
+
+<dead_invertedbreve> <Cyrillic_u>              : "у̑"                # CYRILLIC SMALL LETTER U WITH COMBINING INVERTED BREVE
+
+<dead_grave> <Cyrillic_u>                      : "у̀"                # CYRILLIC SMALL LETTER U WITH COMBINING GRAVE ACCENT
+<Multi_key> <grave> <Cyrillic_u>               : "у̀"                # CYRILLIC SMALL LETTER U WITH COMBINING GRAVE ACCENT
+
+<dead_acute> <Cyrillic_u>                      : "у́"                # CYRILLIC SMALL LETTER U WITH COMBINING ACUTE ACCENT
+<Multi_key> <acute> <Cyrillic_u>               : "у́"                # CYRILLIC SMALL LETTER U WITH COMBINING ACUTE ACCENT
+<Multi_key> <apostrophe> <Cyrillic_u>          : "у́"                # CYRILLIC SMALL LETTER U WITH COMBINING ACUTE ACCENT
+
+<dead_circumflex> <Cyrillic_u>                 : "у̂"                # CYRILLIC SMALL LETTER U WITH COMBINING CIRCUMFLEX ACCENT
+<Multi_key> <asciicircum> <Cyrillic_u>         : "у̂"                # CYRILLIC SMALL LETTER U WITH COMBINING CIRCUMFLEX ACCENT
+
+<dead_doublegrave> <Cyrillic_U>                        : "У̏"                # CYRILLIC CAPITAL LETTER U WITH COMBINING DOUBLE GRAVE ACCENT
+<Multi_key> <grave> <grave> <Cyrillic_U>       : "У̏"                # CYRILLIC CAPITAL LETTER U WITH COMBINING DOUBLE GRAVE ACCENT
+
+<dead_invertedbreve> <Cyrillic_U>              : "У̑"                # CYRILLIC CAPITAL LETTER U WITH COMBINING INVERTED BREVE
+
+<dead_grave> <Cyrillic_U>                      : "У̀"                # CYRILLIC CAPITAL LETTER U WITH COMBINING GRAVE ACCENT
+<Multi_key> <grave> <Cyrillic_U>               : "У̀"                # CYRILLIC CAPITAL LETTER U WITH COMBINING GRAVE ACCENT
+
+<dead_acute> <Cyrillic_U>                      : "У́"                # CYRILLIC CAPITAL LETTER U WITH COMBINING ACUTE ACCENT
+<Multi_key> <acute> <Cyrillic_U>               : "У́"                # CYRILLIC CAPITAL LETTER U WITH COMBINING ACUTE ACCENT
+<Multi_key> <apostrophe> <Cyrillic_U>          : "У́"                # CYRILLIC CAPITAL LETTER U WITH COMBINING ACUTE ACCENT
+
+<dead_circumflex> <Cyrillic_U>                 : "У̂"                # CYRILLIC CAPITAL LETTER U WITH COMBINING CIRCUMFLEX ACCENT
+<Multi_key> <asciicircum> <Cyrillic_U>         : "У̂"                # CYRILLIC CAPITAL LETTER U WITH COMBINING CIRCUMFLEX ACCENT
+
+<dead_doublegrave> <Cyrillic_er>               : "р̏"                # CYRILLIC SMALL LETTER ER WITH COMBINING DOUBLE GRAVE ACCENT
+<Multi_key> <grave> <grave> <Cyrillic_er>      : "р̏"                # CYRILLIC SMALL LETTER ER WITH COMBINING DOUBLE GRAVE ACCENT
+
+<dead_invertedbreve> <Cyrillic_er>             : "р̑"                # CYRILLIC SMALL LETTER ER WITH COMBINING INVERTED BREVE
+
+<dead_grave> <Cyrillic_er>                     : "р̀"                # CYRILLIC SMALL LETTER ER WITH COMBINING GRAVE ACCENT
+<Multi_key> <grave> <Cyrillic_er>              : "р̀"                # CYRILLIC SMALL LETTER ER WITH COMBINING GRAVE ACCENT
+
+<dead_acute> <Cyrillic_er>                     : "р́"                # CYRILLIC SMALL LETTER ER WITH COMBINING ACUTE ACCENT
+<Multi_key> <acute> <Cyrillic_er>              : "р́"                # CYRILLIC SMALL LETTER ER WITH COMBINING ACUTE ACCENT
+<Multi_key> <apostrophe> <Cyrillic_er>         : "р́"                # CYRILLIC SMALL LETTER ER WITH COMBINING ACUTE ACCENT
+
+<dead_macron> <Cyrillic_er>                    : "р̄"                # CYRILLIC SMALL LETTER ER WITH COMBINING MACRON
+<Multi_key> <macron> <Cyrillic_er>             : "р̄"                # CYRILLIC SMALL LETTER ER WITH COMBINING MACRON
+<Multi_key> <underscore> <Cyrillic_er>         : "р̄"                # CYRILLIC SMALL LETTER ER WITH COMBINING MACRON
+
+<dead_circumflex> <Cyrillic_er>                        : "р̂"                # CYRILLIC SMALL LETTER ER WITH COMBINING CIRCUMFLEX ACCENT
+<Multi_key> <asciicircum> <Cyrillic_er>                : "р̂"                # CYRILLIC SMALL LETTER ER WITH COMBINING CIRCUMFLEX ACCENT
+
+<dead_doublegrave> <Cyrillic_ER>               : "Р̏"                # CYRILLIC CAPITAL LETTER ER WITH COMBINING DOUBLE GRAVE ACCENT
+<Multi_key> <grave> <grave> <Cyrillic_ER>      : "Р̏"                # CYRILLIC CAPITAL LETTER ER WITH COMBINING DOUBLE GRAVE ACCENT
+
+<dead_invertedbreve> <Cyrillic_ER>             : "Р̑"                # CYRILLIC CAPITAL LETTER ER WITH COMBINING INVERTED BREVE
+
+<dead_grave> <Cyrillic_ER>                     : "Р̀"                # CYRILLIC CAPITAL LETTER ER WITH COMBINING GRAVE ACCENT
+<Multi_key> <grave> <Cyrillic_ER>              : "Р̀"                # CYRILLIC CAPITAL LETTER ER WITH COMBINING GRAVE ACCENT
+
+<dead_acute> <Cyrillic_ER>                     : "Р́"                # CYRILLIC CAPITAL LETTER ER WITH COMBINING ACUTE ACCENT
+<Multi_key> <acute> <Cyrillic_ER>              : "Р́"                # CYRILLIC CAPITAL LETTER ER WITH COMBINING ACUTE ACCENT
+<Multi_key> <apostrophe> <Cyrillic_ER>         : "Р́"                # CYRILLIC CAPITAL LETTER ER WITH COMBINING ACUTE ACCENT
+
+<dead_macron> <Cyrillic_ER>                    : "Р̄"                # CYRILLIC CAPITAL LETTER ER WITH COMBINING MACRON
+<Multi_key> <macron> <Cyrillic_ER>             : "Р̄"                # CYRILLIC CAPITAL LETTER ER WITH COMBINING MACRON
+<Multi_key> <underscore> <Cyrillic_ER>         : "Р̄"                # CYRILLIC CAPITAL LETTER ER WITH COMBINING MACRON
+
+<dead_circumflex> <Cyrillic_ER>                        : "Р̂"                # CYRILLIC CAPITAL LETTER ER WITH COMBINING CIRCUMFLEX ACCENT
+<Multi_key> <asciicircum> <Cyrillic_ER>                : "Р̂"                # CYRILLIC CAPITAL LETTER ER WITH COMBINING CIRCUMFLEX ACCENT
+
+<Multi_key> <backslash> <o> <slash>            : "🙌"                # PERSON RAISING BOTH HANDS IN CELEBRATION
+
+XCOMM APL support Geoff Streeter 2012-01-04
+
+XCOMM APL was initially an overstruck language. The original APL terminal was an IBM golfball
+XCOMM with a specially designed golfball. This meant that characters could be overstruck to
+XCOMM produce other characters. This gave APL a richness of primitives which is still powerful
+XCOMM today. Overstrikes were always independent of order.
+
+XCOMM APLs have extended this into a number of dialects. Let us try to support lots of them.
+XCOMM Together with some that have not been used yet. Some traditional ones are not included.
+
+XCOMM Characters from "Mathematical Operators"
+
+<Multi_key> <v> <slash>                         : "√"   U221a   # v / SQUARE ROOT
+<Multi_key> <slash> <v>                         : "√"   U221a   # / v SQUARE ROOT
+<Multi_key> <8> <8>                             : "∞"   U221e   # 8 8 INFINITY
+<Multi_key> <equal> <underscore>                : "≡"   U2261   # = _ IDENTICAL TO
+<Multi_key> <underscore> <U2260>                : "≢"   U2262   # _ ≠ NOT IDENTICAL TO
+<Multi_key> <U2260> <underscore>                : "≢"   U2262   # ≠ _ NOT IDENTICAL TO
+<Multi_key> <less> <underscore>                 : "≤"   U2264   # < _ LESS-THAN OR EQUAL TO
+<Multi_key> <underscore> <less>                 : "≤"   U2264   # _ < LESS-THAN OR EQUAL TO
+<Multi_key> <greater> <underscore>              : "≥"   U2265   # > _ GREATER-THAN OR EQUAL TO
+<Multi_key> <underscore> <greater>              : "≥"   U2265   # _ > GREATER-THAN OR EQUAL TO
+<Multi_key> <underscore> <U2282>                : "⊆"   U2286   # _ ⊂ SUBSET OF OR EQUAL TO
+<Multi_key> <U2282> <underscore>                : "⊆"   U2286   # ⊂ _ SUBSET OF OR EQUAL TO
+<Multi_key> <underscore> <U2283>                : "⊇"   U2287   # _ ⊃ SUPERSET OF OR EQUAL TO
+<Multi_key> <U2283> <underscore>                : "⊇"   U2287   # ⊃ _ SUPERSET OF OR EQUAL TO
+<Multi_key> <U25cb> <minus>                     : "⊖"   U2296   # ○ - CIRCLED MINUS
+<Multi_key> <minus> <U25cb>                     : "⊖"   U2296   # - ○ CIRCLED MINUS
+<Multi_key> <U25cb> <period>                    : "⊙"   U2299   # ○ - CIRCLED DOT
+<Multi_key> <period> <U25cb>                    : "⊙"   U2299   # - ○ CIRCLED DOT
+<Multi_key> <less> <greater>                    : "⋄"   U22c4   # < > DIAMOND OPERATOR
+<Multi_key> <greater> <less>                    : "⋄"   U22c4   # > < DIAMOND OPERATOR
+<Multi_key> <U2227> <U2228>                     : "⋄"   U22c4   # ∧ ∨ DIAMOND OPERATOR
+<Multi_key> <U2228> <U2227>                     : "⋄"   U22c4   # ∨ ∧ DIAMOND OPERATOR
+
+XCOMM Characters from "Miscellaneous Technical"
+
+<Multi_key> <U22a5> <U22a4>                     : "⌶"   U2336   # ⊥ ⊤ APL FUNCTIONAL SYMBOL I-BEAM
+<Multi_key> <U22a4> <U22a5>                     : "⌶"   U2336   # ⊥ ⊤ APL FUNCTIONAL SYMBOL I-BEAM
+<Multi_key> <bracketleft> <bracketright>        : "⌷"   U2337   # [ ] APL FUNCTIONAL SYMBOL SQUISH QUAD
+<Multi_key> <bracketright> <bracketleft>        : "⌷"   U2337   # ] [ APL FUNCTIONAL SYMBOL SQUISH QUAD
+<Multi_key> <U2395> <equal>                     : "⌸"   U2338   # ⎕ = APL FUNCTIONAL SYMBOL QUAD EQUAL
+<Multi_key> <equal> <U2395>                     : "⌸"   U2338   # = ⎕ APL FUNCTIONAL SYMBOL QUAD EQUAL
+<Multi_key> <U2395> <division>                  : "⌹"   U2339   # ⎕ ÷ APL FUNCTIONAL SYMBOL QUAD DIVIDE
+<Multi_key> <division> <U2395>                  : "⌹"   U2339   # ÷ ⎕ APL FUNCTIONAL SYMBOL QUAD DIVIDE
+<Multi_key> <U2395> <U22c4>                     : "⌺"   U233a   # ⎕ ⋄ APL FUNCTIONAL SYMBOL QUAD DIAMOND
+<Multi_key> <U22c4> <U2395>                     : "⌺"   U233a   # ⋄ ⎕ APL FUNCTIONAL SYMBOL QUAD DIAMOND
+<Multi_key> <U2395> <U2218>                     : "⌻"   U233b   # ⎕ ∘ APL FUNCTIONAL SYMBOL QUAD JOT
+<Multi_key> <U2218> <U2395>                     : "⌻"   U233b   # ∘ ⎕ APL FUNCTIONAL SYMBOL QUAD JOT
+<Multi_key> <U2395> <U25cb>                     : "⌼"   U233c   # ⎕ ○ APL FUNCTIONAL SYMBOL QUAD CIRCLE
+<Multi_key> <U25cb> <U2395>                     : "⌼"   U233c   # ○ ⎕ APL FUNCTIONAL SYMBOL QUAD CIRCLE
+<Multi_key> <U25cb> <bar>                       : "⌽"   U233d   # ○ | APL FUNCTIONAL SYMBOL CIRCLE STILE
+<Multi_key> <bar> <U25cb>                       : "⌽"   U233d   # | ○ APL FUNCTIONAL SYMBOL CIRCLE STILE
+<Multi_key> <U25cb> <U2218>                     : "⌾"   U233e   # ○ ∘ APL FUNCTIONAL SYMBOL CIRCLE JOT
+<Multi_key> <U2218> <U25cb>                     : "⌾"   U233e   # ∘ ○ APL FUNCTIONAL SYMBOL CIRCLE JOT
+<Multi_key> <slash> <minus>                     : "⌿"   U233f   # / - APL FUNCTIONAL SYMBOL SLASH BAR
+<Multi_key> <minus> <slash>                     : "⌿"   U233f   # - / APL FUNCTIONAL SYMBOL SLASH BAR
+<Multi_key> <backslash> <minus>                 : "⍀"   U2340   # \ - APL FUNCTIONAL SYMBOL BACKSLASH BAR
+<Multi_key> <minus> <backslash>                 : "⍀"   U2340   # - \ APL FUNCTIONAL SYMBOL BACKSLASH BAR
+<Multi_key> <slash> <U2395>                     : "⍁"   U2341   # / ⎕ APL FUNCTIONAL SYMBOL QUAD SLASH
+<Multi_key> <U2395> <slash>                     : "⍁"   U2341   # ⎕ / APL FUNCTIONAL SYMBOL QUAD SLASH
+<Multi_key> <backslash> <U2395>                 : "⍂"   U2342   # \ ⎕ APL FUNCTIONAL SYMBOL QUAD BACKSLASH
+<Multi_key> <U2395> <backslash>                 : "⍂"   U2342   # ⎕ \ APL FUNCTIONAL SYMBOL QUAD BACKSLASH
+<Multi_key> <less> <U2395>                      : "⍃"   U2343   # < ⎕ APL FUNCTIONAL SYMBOL QUAD LESS-THAN
+<Multi_key> <U2395> <less>                      : "⍃"   U2343   # ⎕ < APL FUNCTIONAL SYMBOL QUAD LESS-THAN
+<Multi_key> <greater> <U2395>                   : "⍄"   U2344   # > ⎕ APL FUNCTIONAL SYMBOL QUAD GREATER-THAN
+<Multi_key> <U2395> <greater>                   : "⍄"   U2344   # ⎕ > APL FUNCTIONAL SYMBOL QUAD GREATER-THAN
+<Multi_key> <U2190> <bar>                       : "⍅"   U2345   # ← | APL FUNCTIONAL SYMBOL LEFTWARDS VANE
+<Multi_key> <bar> <U2190>                       : "⍅"   U2345   # | ← APL FUNCTIONAL SYMBOL LEFTWARDS VANE
+<Multi_key> <U2192> <bar>                       : "⍆"   U2346   # → | APL FUNCTIONAL SYMBOL RIGHTWARDS VANE
+<Multi_key> <bar> <U2192>                       : "⍆"   U2346   # | → APL FUNCTIONAL SYMBOL RIGHTWARDS VANE
+<Multi_key> <U2190> <U2395>                     : "⍇"   U2347   # ← ⎕ APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW
+<Multi_key> <U2395> <U2190>                     : "⍇"   U2347   # ⎕ ← APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW
+<Multi_key> <U2192> <U2395>                     : "⍈"   U2348   # → ⎕ APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW
+<Multi_key> <U2395> <U2192>                     : "⍈"   U2348   # ⎕ → APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW
+<Multi_key> <U25cb> <backslash>                 : "⍉"   U2349   # ○ \ APL FUNCTIONAL SYMBOL CIRCLE SLOPE
+<Multi_key> <backslash> <U25cb>                 : "⍉"   U2349   # \ ○ APL FUNCTIONAL SYMBOL CIRCLE SLOPE
+<Multi_key> <underscore> <U22a5>                : "⍊"   U234a   # _ ⊥ APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR
+<Multi_key> <U22a5> <underscore>                : "⍊"   U234a   # ⊥ _ APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR
+<Multi_key> <U2206> <bar>                       : "⍋"   U234b   # ∆ | APL FUNCTIONAL SYMBOL DELTA STILE
+<Multi_key> <bar> <U2206>                       : "⍋"   U234b   # | ∆ APL FUNCTIONAL SYMBOL DELTA STILE
+<Multi_key> <U2228> <U2395>                     : "⍌"   U234c   # ∨ ⎕ APL FUNCTIONAL SYMBOL QUAD DOWN CARET
+<Multi_key> <U2395> <U2228>                     : "⍌"   U234c   # ⎕ ∨ APL FUNCTIONAL SYMBOL QUAD DOWN CARET
+<Multi_key> <U2206> <U2395>                     : "⍍"   U234d   # ∆ ⎕ APL FUNCTIONAL SYMBOL QUAD DELTA
+<Multi_key> <U2395> <U2206>                     : "⍍"   U234d   # ⎕ ∆ APL FUNCTIONAL SYMBOL QUAD DELTA
+<Multi_key> <U2218> <U22a5>                     : "⍎"   U234e   # ∘ ⊥ APL FUNCTIONAL SYMBOL DOWN TACK JOT
+<Multi_key> <U22a5> <U2218>                     : "⍎"   U234e   # ⊥ ∘ APL FUNCTIONAL SYMBOL DOWN TACK JOT
+<Multi_key> <U2191> <minus>                     : "⍏"   U234f   # ↑ - APL FUNCTIONAL SYMBOL UPWARDS VANE
+<Multi_key> <minus> <U2191>                     : "⍏"   U234f   # - ↑ APL FUNCTIONAL SYMBOL UPWARDS VANE
+<Multi_key> <U2191> <U2395>                     : "⍐"   U2350   # ↑ ⎕ APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW
+<Multi_key> <U2395> <U2191>                     : "⍐"   U2350   # ⎕ ↑ APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW
+XCOMM I cannot get anything to work with <macron>. Given that no extant APLs use ⍑ I will just leave the lines
+XCOMM in place.
+<Multi_key> <macron> <U22a4>                    : "⍑"   U2351   # ¯ ⊤ APL FUNCTIONAL SYMBOL UP TACK OVERBAR
+<Multi_key> <U22a4> <macron>                    : "⍑"   U2351   # ⊤ ¯ APL FUNCTIONAL SYMBOL UP TACK OVERBAR
+<Multi_key> <U2207> <bar>                       : "⍒"   U2352   # ∇ | APL FUNCTIONAL SYMBOL DEL STILE
+<Multi_key> <bar> <U2207>                       : "⍒"   U2352   # | ∇ APL FUNCTIONAL SYMBOL DEL STILE
+<Multi_key> <U2227> <U2395>                     : "⍓"   U2353   # ∧ ⎕ APL FUNCTIONAL SYMBOL QUAD UP CARET
+<Multi_key> <U2395> <U2227>                     : "⍓"   U2353   # ⎕ ∧ APL FUNCTIONAL SYMBOL QUAD UP CARET
+<Multi_key> <U2207> <U2395>                     : "⍔"   U2354   # ∇ ⎕ APL FUNCTIONAL SYMBOL QUAD DEL
+<Multi_key> <U2395> <U2207>                     : "⍔"   U2354   # ⎕ ∇ APL FUNCTIONAL SYMBOL QUAD DEL
+<Multi_key> <U2218> <U22a4>                     : "⍕"   U2355   # ∘ ⊤ APL FUNCTIONAL SYMBOL UP TACK JOT
+<Multi_key> <U22a4> <U2218>                     : "⍕"   U2355   # ⊤ ∘ APL FUNCTIONAL SYMBOL UP TACK JOT
+<Multi_key> <U2193> <minus>                     : "⍖"   U2356   # ↓ - APL FUNCTIONAL SYMBOL DOWNWARDS VANE
+<Multi_key> <minus> <U2193>                     : "⍖"   U2356   # - ↓ APL FUNCTIONAL SYMBOL DOWNWARDS VANE
+<Multi_key> <U2193> <U2395>                     : "⍗"   U2357   # ↓ ⎕ APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW
+<Multi_key> <U2395> <U2193>                     : "⍗"   U2357   # ⎕ ↓ APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW
+XCOMM This line clashes with the <apostrophe> <underscore> <E> (and similar) that appear to be there to provide
+XCOMM a work around for the problems with <macron>. Or to cope with keyboards that do not have <macron> (more likely).
+XCOMM All APL keyboards have <macron>, it is used as the -ve sign for numbers.
+XCOMM I do not know of an extant APL using ⍘
+<Multi_key> <underscore> <apostrophe>           : "⍘"   U2358   # _ ' APL FUNCTIONAL SYMBOL QUOTE UNDERBAR
+<Multi_key> <U2206> <underscore>                : "⍙"   U2359   # ∆ _ APL FUNCTIONAL SYMBOL DELTA UNDERBAR
+<Multi_key> <underscore> <U2206>                : "⍙"   U2359   # _ ∆ APL FUNCTIONAL SYMBOL DELTA UNDERBAR
+<Multi_key> <U22c4> <underscore>                : "⍚"   U235a   # ⋄ _ APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR
+<Multi_key> <underscore> <U22c4>                : "⍚"   U235a   # _ ⋄ APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR
+<Multi_key> <U2218> <underscore>                : "⍛"   U235b   # ∘ _ APL FUNCTIONAL SYMBOL JOT UNDERBAR
+<Multi_key> <underscore> <U2218>                : "⍛"   U235b   # _ ∘ APL FUNCTIONAL SYMBOL JOT UNDERBAR
+<Multi_key> <U25cb> <underscore>                : "⍜"   U235c   # ○ _ APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR
+<Multi_key> <underscore> <U25cb>                : "⍜"   U235c   # _ ○ APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR
+<Multi_key> <U2218> <U2229>                     : "⍝"   U235d   # ∘ ∩ APL FUNCTIONAL SYMBOL UP SHOE JOT
+<Multi_key> <U2229> <U2218>                     : "⍝"   U235d   # ∩ ∘ APL FUNCTIONAL SYMBOL UP SHOE JOT
+<Multi_key> <U2395> <apostrophe>                : "⍞"   U235e   # * ¨ APL FUNCTIONAL SYMBOL QUOTE QUAD
+<Multi_key> <apostrophe> <U2395>                : "⍞"   U235e   # ¨ * APL FUNCTIONAL SYMBOL QUOTE QUAD
+<Multi_key> <U25cb> <asterisk>                  : "⍟"   U235f   # ○ * APL FUNCTIONAL SYMBOL CIRCLE STAR
+<Multi_key> <asterisk> <U25cb>                  : "⍟"   U235f   # * ○ APL FUNCTIONAL SYMBOL CIRCLE STAR
+<Multi_key> <colon> <U2395>                     : "⍠"   U2360   # : ⎕ APL FUNCTIONAL SYMBOL QUAD COLON
+<Multi_key> <U2395> <colon>                     : "⍠"   U2360   # ⎕ : APL FUNCTIONAL SYMBOL QUAD COLON
+<Multi_key> <diaeresis> <U22a4>                 : "⍡"   U2361   # ¨ ⊤ APL FUNCTIONAL SYMBOL UP TACK DIAERESIS
+<Multi_key> <U22a4> <diaeresis>                 : "⍡"   U2361   # ⊤ ¨ APL FUNCTIONAL SYMBOL UP TACK DIAERESIS
+<Multi_key> <diaeresis> <U2207>                 : "⍢"   U2362   # ¨ ∇ APL FUNCTIONAL SYMBOL DEL DIAERESIS
+<Multi_key> <U2207> <diaeresis>                 : "⍢"   U2362   # ∇ ¨ APL FUNCTIONAL SYMBOL DEL DIAERESIS
+<Multi_key> <asterisk> <diaeresis>              : "⍣"   U2363   # * ¨ APL FUNCTIONAL SYMBOL STAR DIAERESIS
+<Multi_key> <diaeresis> <asterisk>              : "⍣"   U2363   # ¨ * APL FUNCTIONAL SYMBOL STAR DIAERESIS
+<Multi_key> <U2218> <diaeresis>                 : "⍤"   U2364   # ∘ ¨ APL FUNCTIONAL SYMBOL JOT DIAERESIS
+<Multi_key> <diaeresis> <U2218>                 : "⍤"   U2364   # ¨ ∘ APL FUNCTIONAL SYMBOL JOT DIAERESIS
+<Multi_key> <U25cb> <diaeresis>                 : "⍥"   U2365   # ○ ¨ APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS
+<Multi_key> <diaeresis> <U25cb>                 : "⍥"   U2365   # ¨ ○ APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS
+<Multi_key> <U222a> <bar>                       : "⍦"   U2366   # ∪ | APL FUNCTIONAL SYMBOL DOWN SHOE STILE
+<Multi_key> <bar> <U222a>                       : "⍦"   U2366   # | ∪ APL FUNCTIONAL SYMBOL DOWN SHOE STILE
+<Multi_key> <U2282> <bar>                       : "⍧"   U2367   # ⊂ | APL FUNCTIONAL SYMBOL LEFT SHOE STILE
+<Multi_key> <bar> <U2282>                       : "⍧"   U2367   # | ⊂ APL FUNCTIONAL SYMBOL LEFT SHOE STILE
+<Multi_key> <asciitilde> <diaeresis>            : "⍨"   U2368   # ~ ¨ APL FUNCTIONAL SYMBOL TILDE DIAERESIS
+<Multi_key> <diaeresis> <greater>               : "⍩"   U2369   # ¨ > APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS
+<Multi_key> <greater> <diaeresis>               : "⍩"   U2369   # > ¨ APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS
+<Multi_key> <U2207> <asciitilde>                : "⍫"   U236b   # ∇ ~ APL FUNCTIONAL SYMBOL DEL TILDE
+<Multi_key> <asciitilde> <U2207>                : "⍫"   U236b   # ~ ∇ APL FUNCTIONAL SYMBOL DEL TILDE
+<Multi_key> <0> <asciitilde>                    : "⍬"   U236c   # 0 ~ APL FUNCTIONAL SYMBOL ZILDE
+<Multi_key> <asciitilde> <0>                    : "⍬"   U236c   # ~ 0 APL FUNCTIONAL SYMBOL ZILDE
+<Multi_key> <bar> <asciitilde>                  : "⍭"   U236d   # | ~ APL FUNCTIONAL SYMBOL STILE TILDE
+<Multi_key> <asciitilde> <bar>                  : "⍭"   U236d   # ~ | APL FUNCTIONAL SYMBOL STILE TILDE
+XCOMM This line does not work. It clashes with
+XCOMM <underscore> <semicolon> <O> for Ǭ and
+XCOMM <underscore> <semicolon> <o> for ǭ.
+XCOMM Given that no extant APLs use ⍮ I will just leave the line in place.
+<Multi_key> <semicolon> <underscore>            : "⍮"   U236e   # ; _ APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR
+<Multi_key> <U2260> <U2395>                     : "⍯"   U236f   # ≠ ⎕ APL FUNCTIONAL SYMBOL QUAD NOT EQUAL
+<Multi_key> <U2395> <U2260>                     : "⍯"   U236f   # ⎕ ≠ APL FUNCTIONAL SYMBOL QUAD NOT EQUAL
+<Multi_key> <question> <U2395>                  : "⍰"   U2370   # ? ⎕ APL FUNCTIONAL SYMBOL QUAD QUESTION
+<Multi_key> <U2395> <question>                  : "⍰"   U2370   # ⎕ ? APL FUNCTIONAL SYMBOL QUAD QUESTION
+<Multi_key> <U2228> <asciitilde>                : "⍱"   U2371   # ∨ ~ APL FUNCTIONAL SYMBOL DOWN CARET TILDE
+<Multi_key> <asciitilde> <U2228>                : "⍱"   U2371   # ~ ∨ APL FUNCTIONAL SYMBOL DOWN CARET TILDE
+<Multi_key> <U2227> <asciitilde>                : "⍲"   U2372   # ∧ ~ APL FUNCTIONAL SYMBOL UP CARET TILDE
+<Multi_key> <asciitilde> <U2227>                : "⍲"   U2372   # ~ ∧ APL FUNCTIONAL SYMBOL UP CARET TILDE
+<Multi_key> <U237a> <underscore>                : "⍶"   U2376   # ⍺ _ APL FUNCTIONAL SYMBOL ALPHA UNDERBAR
+<Multi_key> <underscore> <U237a>                : "⍶"   U2376   # _ ⍺ APL FUNCTIONAL SYMBOL ALPHA UNDERBAR
+<Multi_key> <U220a> <underscore>                : "⍷"   U2377   # ∊ _ APL FUNCTIONAL SYMBOL EPSILON UNDERBAR
+<Multi_key> <underscore> <U220a>                : "⍷"   U2377   # _ ∊ APL FUNCTIONAL SYMBOL EPSILON UNDERBAR
+<Multi_key> <U2373> <underscore>                : "⍸"   U2378   # ⍳ _ APL FUNCTIONAL SYMBOL IOTA UNDERBAR
+<Multi_key> <underscore> <U2373>                : "⍸"   U2378   # _ ⍳ APL FUNCTIONAL SYMBOL IOTA UNDERBAR
+<Multi_key> <U2375> <underscore>                : "⍹"   U2379   # ⍵ _ APL FUNCTIONAL SYMBOL OMEGA UNDERBAR
+<Multi_key> <underscore> <U2375>                : "⍹"   U2379   # _ ⍵ APL FUNCTIONAL SYMBOL OMEGA UNDERBAR
diff --git a/nls/en_US.UTF-8/XI18N_OBJS b/nls/en_US.UTF-8/XI18N_OBJS
new file mode 100644 (file)
index 0000000..f201bf4
--- /dev/null
@@ -0,0 +1,8 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for euro locales
+#
+XLC    common/xlcUTF8Load      _XlcUtf8Loader          # XLC_open
+XOM    common/xomLTRTTB        _XomGenericOpenOM       # XOM_open
+XIM    common/xiiimp           _SwitchOpenIM           # XIM_open
+XIM    common/xiiimp           _XimpLocalOpenIM        # XIM_open
diff --git a/nls/en_US.UTF-8/XLC_LOCALE.pre b/nls/en_US.UTF-8/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..35d009f
--- /dev/null
@@ -0,0 +1,300 @@
+XCOMM  XLocale Database Sample for en_US.UTF-8
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+
+on_demand_loading      True
+
+object_name            generic
+
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name    ISO8859-1:GL
+       }
+       font    {
+               primary         ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class (ISO8859 families)
+fs1    {
+       charset {
+               name    ISO8859-1:GR
+       }
+       font    {
+               primary ISO8859-1:GR
+       }
+}
+XCOMM  fs2 class (ISO8859 families)
+fs2    {
+       charset {
+               name    ISO8859-2:GR
+       }
+       font    {
+               primary ISO8859-2:GR
+       }
+}
+XCOMM  fs3 class (ISO8859 families)
+fs3    {
+       charset {
+               name    ISO8859-3:GR
+       }
+       font    {
+               primary ISO8859-3:GR
+       }
+}
+XCOMM  fs4 class (ISO8859 families)
+fs4    {
+       charset {
+               name    ISO8859-4:GR
+       }
+       font    {
+               primary ISO8859-4:GR
+       }
+}
+XCOMM  fs5 class (ISO8859 families)
+fs5    {
+       charset {
+               name    ISO8859-5:GR
+       }
+       font    {
+               primary ISO8859-5:GR
+       }
+}
+XCOMM  fs6 class (koi8-r)
+fs6    {
+       charset {
+               name    KOI8-R:GR
+       }
+       font    {
+               primary KOI8-R:GR
+       }
+}
+XCOMM  fs7 class (ISO8859 families)
+fs7    {
+       charset {
+               name    ISO8859-7:GR
+       }
+       font    {
+               primary ISO8859-7:GR
+       }
+}
+XCOMM  fs9 class (ISO8859 families)
+fs8    {
+       charset {
+               name    ISO8859-9:GR
+       }
+       font    {
+               primary ISO8859-9:GR
+       }
+}
+XCOMM  fs13 class (ISO8859 families)
+fs9    {
+       charset {
+               name    ISO8859-13:GR
+       }
+       font    {
+               primary ISO8859-13:GR
+       }
+}
+XCOMM  fs14 class (ISO8859 families)
+fs10   {
+       charset {
+               name    ISO8859-14:GR
+       }
+       font    {
+               primary ISO8859-14:GR
+       }
+}
+XCOMM  fs15 class (ISO8859 families)
+fs11   {
+       charset {
+               name    ISO8859-15:GR
+       }
+       font    {
+               primary ISO8859-15:GR
+       }
+}
+XCOMM  fs16 class (Kanji)
+fs12   {
+       charset {
+               name    JISX0208.1983-0:GL
+       }
+       font    {
+               primary JISX0208.1983-0:GL
+       }
+}
+XCOMM   fs17 class (Korean Character)
+fs13   {
+       charset {
+               name    KSC5601.1987-0:GL
+       }
+       font    {
+               primary KSC5601.1987-0:GL
+       }
+}
+XCOMM   fs18 class (Chinese Han Character)
+fs14   {
+       charset {
+               name    GB2312.1980-0:GL
+       }
+       font    {
+               primary GB2312.1980-0:GL
+       }
+}
+XCOMM  fs20 class (Half Kana)
+fs15   {
+       charset {
+               name    JISX0201.1976-0:GR
+       }
+       font    {
+               primary         JISX0201.1976-0:GR
+               vertical_rotate all
+       }
+}
+XCOMM  ISO10646 should come last so the fonts above will actually be used
+XCOMM  fs24 class
+fs16   {
+       charset {
+               name    ISO10646-1
+       }
+       font    {
+               primary ISO10646-1
+       }
+}
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          UTF-8
+mb_cur_max             6
+state_depend_encoding  False
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       ct_encoding     ISO8859-1:GL
+}
+
+XCOMM  cs1 class
+cs1     {
+        side            GR:Default
+        length          1
+        ct_encoding     ISO8859-1:GR
+}
+XCOMM  cs2 class
+cs2     {
+        side            GR
+        length          1
+        ct_encoding     ISO8859-2:GR
+}
+XCOMM  cs3 class
+cs3     {
+        side            GR
+        length          1
+        ct_encoding     ISO8859-3:GR
+}
+XCOMM  cs4 class
+cs4     {
+        side            GR
+        length          1
+        ct_encoding     ISO8859-4:GR
+}
+XCOMM  cs5 class
+cs5     {
+        side            GR
+        length          1
+        ct_encoding     ISO8859-5:GR
+}
+XCOMM  cs6 class
+cs6     {
+        side            GR
+        length          1
+        ct_encoding     KOI8-R:GR
+}
+XCOMM  cs7 class
+cs7     {
+        side            GR
+        length          1
+        ct_encoding     ISO8859-7:GR
+}
+XCOMM  cs9 class
+cs8     {
+        side            GR
+        length          1
+        ct_encoding     ISO8859-9:GR
+}
+XCOMM  cs13 class
+cs9     {
+        side            GR
+        length          1
+        ct_encoding     ISO8859-13:GR
+}
+XCOMM  cs14 class
+cs10     {
+        side            GR
+        length          1
+        ct_encoding     ISO8859-14:GR
+}
+XCOMM  cs15 class
+cs11     {
+        side            GR
+        length          1
+        ct_encoding     ISO8859-15:GR
+}
+XCOMM  cs16 class
+cs12   {
+       side            GR
+       length          2
+       ct_encoding     JISX0208.1983-0:GL; JISX0208.1983-0:GR;\
+                       JISX0208.1983-1:GL; JISX0208.1983-1:GR
+}
+
+XCOMM  cs17 class
+cs13     {
+        side            GL
+        length          2
+        ct_encoding     KSC5601.1987-0:GL; KSC5601.1987-0:GR;\
+                        KSC5601.1987-1:GL; KSC5601.1987-1:GR
+}
+XCOMM  cs18 class
+cs14     {
+        side            GR
+        length          2
+        ct_encoding     GB2312.1980-0:GL; GB2312.1980-0:GR
+}
+XCOMM  cs20 class
+cs15   {
+       side            GR
+       length          1
+       ct_encoding     JISX0201.1976-0:GR
+}
+XCOMM  cs24 class
+cs16   {
+       side            none
+       ct_encoding     ISO10646-1
+}
+
+END XLC_XLOCALE
diff --git a/nls/fi_FI.UTF-8/Compose.pre b/nls/fi_FI.UTF-8/Compose.pre
new file mode 100644 (file)
index 0000000..fbe8597
--- /dev/null
@@ -0,0 +1,427 @@
+XCOMM
+XCOMM Official compose sequences for Finland based on SFS 5966 standard
+XCOMM
+XCOMM This compose sequence map implements all the functionality of Annex 3
+XCOMM and Annex 4 of the standard and additionally defines the sequences
+XCOMM provided in en_US.UTF-8/Compose. SFS 5966 sequences override any
+XCOMM conflicting rules from en_US.UTF-8/Compose.
+XCOMM
+XCOMM Annex 1 of the standard is implemented in the keymap symbols/fi
+XCOMM
+XCOMM Complete rewrite by Marko Myllynen
+XCOMM Original version by Troy Korjuslommi
+XCOMM
+
+XCOMM Use en_US.UTF-8/Compose as the base compose sequence definition set
+include "X11_LOCALEDATADIR/en_US.UTF-8/Compose"
+
+XCOMM Define all the sequences of the standard overriding any sequence
+XCOMM from en_US.UTF-8/Compose if such a sequence was provided already
+
+XCOMM Sequences from Annex 3
+
+XCOMM Sequences with COMBINING ACUTE ACCENT / <dead_acute>
+<dead_acute> <space>                    : "´"   # ACUTE ACCENT
+<dead_acute> <a>                        : "á"   # LATIN CAPITAL LETTER A WITH ACUTE
+<dead_acute> <A>                        : "Á"   # LATIN CAPITAL LETTER A WITH ACUTE
+<dead_acute> <c>                        : "ć"   # LATIN SMALL LETTER C WITH ACUTE
+<dead_acute> <C>                        : "Ć"   # LATIN CAPITAL LETTER C WITH ACUTE
+<dead_acute> <e>                        : "é"   # LATIN SMALL LETTER E WITH ACUTE
+<dead_acute> <E>                        : "É"   # LATIN CAPITAL LETTER E WITH ACUTE
+<dead_acute> <i>                        : "í"   # LATIN SMALL LETTER I WITH ACUTE
+<dead_acute> <I>                        : "Í"   # LATIN CAPITAL LETTER I WITH ACUTE
+<dead_acute> <l>                        : "ĺ"   # LATIN SMALL LETTER L WITH ACUTE
+<dead_acute> <L>                        : "Ĺ"   # LATIN CAPITAL LETTER L WITH ACUTE
+<dead_acute> <n>                        : "ń"   # LATIN SMALL LETTER N WITH ACUTE
+<dead_acute> <N>                        : "Ń"   # LATIN CAPITAL LETTER N WITH ACUTE
+<dead_acute> <o>                        : "ó"   # LATIN SMALL LETTER O WITH ACUTE
+<dead_acute> <O>                        : "Ó"   # LATIN CAPITAL LETTER O WITH ACUTE
+<dead_acute> <r>                        : "ŕ"   # LATIN SMALL LETTER R WITH ACUTE
+<dead_acute> <R>                        : "Ŕ"   # LATIN CAPITAL LETTER R WITH ACUTE
+<dead_acute> <s>                        : "ś"   # LATIN SMALL LETTER S WITH ACUTE
+<dead_acute> <S>                        : "Ś"   # LATIN CAPITAL LETTER S WITH ACUTE
+<dead_acute> <u>                        : "ú"   # LATIN SMALL LETTER U WITH ACUTE
+<dead_acute> <U>                        : "Ú"   # LATIN CAPITAL LETTER U WITH ACUTE
+<dead_acute> <w>                        : "ẃ"   # LATIN SMALL LETTER W WITH ACUTE
+<dead_acute> <W>                        : "Ẃ"   # LATIN CAPITAL LETTER W WITH ACUTE
+<dead_acute> <y>                        : "ý"   # LATIN SMALL LETTER Y WITH ACUTE
+<dead_acute> <Y>                        : "Ý"   # LATIN CAPITAL LETTER Y WITH ACUTE
+<dead_acute> <z>                        : "ź"   # LATIN SMALL LETTER Z WITH ACUTE
+<dead_acute> <Z>                        : "Ź"   # LATIN CAPITAL LETTER Z WITH ACUTE
+<dead_acute> <ae>                       : "ǽ"   # LATIN SMALL LETTER AE WITH ACUTE
+<dead_acute> <AE>                       : "Ǽ"   # LATIN CAPITAL LETTER AE WITH ACUTE
+<dead_acute> <oslash>                   : "ǿ"   # LATIN SMALL LETTER O WITH STROKE AND ACUTE
+<dead_acute> <Oslash>                   : "Ǿ"   # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+<dead_acute> <aring>                    : "ǻ"   # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+<dead_acute> <Aring>                    : "Ǻ"   # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+
+XCOMM Sequences with COMBINING BREVE / <dead_breve>
+<dead_breve> <space>                    : "˘"   # BREVE
+<dead_breve> <a>                        : "ă"   # LATIN SMALL LETTER A WITH BREVE
+<dead_breve> <A>                        : "Ă"   # LATIN CAPITAL LETTER A WITH BREVE
+<dead_breve> <e>                        : "ĕ"   # LATIN SMALL LETTER E WITH BREVE
+<dead_breve> <E>                        : "Ĕ"   # LATIN CAPITAL LETTER E WITH BREVE
+<dead_breve> <g>                        : "ğ"   # LATIN SMALL LETTER G WITH BREVE
+<dead_breve> <G>                        : "Ğ"   # LATIN CAPITAL LETTER G WITH BREVE
+<dead_breve> <i>                        : "ĭ"   # LATIN SMALL LETTER I WITH BREVE
+<dead_breve> <I>                        : "Ĭ"   # LATIN CAPITAL LETTER I WITH BREVE
+<dead_breve> <o>                        : "ŏ"   # LATIN SMALL LETTER O WITH BREVE
+<dead_breve> <O>                        : "Ŏ"   # LATIN CAPITAL LETTER O WITH BREVE
+<dead_breve> <u>                        : "ŭ"   # LATIN SMALL LETTER U WITH BREVE
+<dead_breve> <U>                        : "Ŭ"   # LATIN CAPITAL LETTER U WITH BREVE
+
+XCOMM Sequences with COMBINING CARON / <dead_caron>
+<dead_caron> <space>                    : "ˇ"   # CARON
+<dead_caron> <a>                        : "ǎ"   # LATIN SMALL LETTER A WITH CARON
+<dead_caron> <A>                        : "Ǎ"   # LATIN CAPITAL LETTER A WITH CARON
+<dead_caron> <c>                        : "č"   # LATIN SMALL LETTER C WITH CARON
+<dead_caron> <C>                        : "Č"   # LATIN CAPITAL LETTER C WITH CARON
+<dead_caron> <d>                        : "ď"   # LATIN SMALL LETTER D WITH CARON
+<dead_caron> <D>                        : "Ď"   # LATIN CAPITAL LETTER D WITH CARON
+<dead_caron> <e>                        : "ě"   # LATIN SMALL LETTER E WITH CARON
+<dead_caron> <E>                        : "Ě"   # LATIN CAPITAL LETTER E WITH CARON
+<dead_caron> <g>                        : "ǧ"   # LATIN SMALL LETTER G WITH CARON
+<dead_caron> <G>                        : "Ǧ"   # LATIN CAPITAL LETTER G WITH CARON
+<dead_caron> <h>                        : "ȟ"   # LATIN SMALL LETTER H WITH CARON
+<dead_caron> <H>                        : "Ȟ"   # LATIN CAPITAL LETTER H WITH CARON
+<dead_caron> <i>                        : "ǐ"   # LATIN SMALL LETTER I WITH CARON
+<dead_caron> <I>                        : "Ǐ"   # LATIN CAPITAL LETTER I WITH CARON
+<dead_caron> <k>                        : "ǩ"   # LATIN SMALL LETTER K WITH CARON
+<dead_caron> <K>                        : "Ǩ"   # LATIN CAPITAL LETTER K WITH CARON
+<dead_caron> <l>                        : "ľ"   # LATIN SMALL LETTER L WITH CARON
+<dead_caron> <L>                        : "Ľ"   # LATIN CAPITAL LETTER L WITH CARON
+<dead_caron> <n>                        : "ň"   # LATIN SMALL LETTER N WITH CARON
+<dead_caron> <N>                        : "Ň"   # LATIN CAPITAL LETTER N WITH CARON
+<dead_caron> <o>                        : "ǒ"   # LATIN SMALL LETTER O WITH CARON
+<dead_caron> <O>                        : "Ǒ"   # LATIN CAPITAL LETTER O WITH CARON
+<dead_caron> <r>                        : "ř"   # LATIN SMALL LETTER R WITH CARON
+<dead_caron> <R>                        : "Ř"   # LATIN CAPITAL LETTER R WITH CARON
+<dead_caron> <s>                        : "š"   # LATIN SMALL LETTER S WITH CARON
+<dead_caron> <S>                        : "Š"   # LATIN CAPITAL LETTER S WITH CARON
+<dead_caron> <t>                        : "ť"   # LATIN SMALL LETTER T WITH CARON
+<dead_caron> <T>                        : "Ť"   # LATIN CAPITAL LETTER T WITH CARON
+<dead_caron> <u>                        : "ǔ"   # LATIN SMALL LETTER U WITH CARON
+<dead_caron> <U>                        : "Ǔ"   # LATIN CAPITAL LETTER U WITH CARON
+<dead_caron> <z>                        : "ž"   # LATIN SMALL LETTER Z WITH CARON
+<dead_caron> <Z>                        : "Ž"   # LATIN CAPITAL LETTER Z WITH CARON
+<dead_caron> <ezh>                      : "ǯ"   # LATIN SMALL LETTER EZH WITH CARON
+<dead_caron> <EZH>                      : "Ǯ"   # LATIN CAPITAL LETTER EZH WITH CARON
+
+XCOMM Sequences with COMBINING CEDILLA / <dead_cedilla>
+<dead_cedilla> <space>                  : "¸"   # CEDILLA
+<dead_cedilla> <c>                      : "ç"   # LATIN SMALL LETTER C WITH CEDILLA
+<dead_cedilla> <C>                      : "Ç"   # LATIN CAPITAL LETTER C WITH CEDILLA
+<dead_cedilla> <g>                      : "ģ"   # LATIN SMALL LETTER G WITH CEDILLA
+<dead_cedilla> <G>                      : "Ģ"   # LATIN CAPITAL LETTER G WITH CEDILLA
+<dead_cedilla> <k>                      : "ķ"   # LATIN SMALL LETTER K WITH CEDILLA
+<dead_cedilla> <K>                      : "Ķ"   # LATIN CAPITAL LETTER K WITH CEDILLA
+<dead_cedilla> <l>                      : "ļ"   # LATIN SMALL LETTER L WITH CEDILLA
+<dead_cedilla> <L>                      : "Ļ"   # LATIN CAPITAL LETTER L WITH CEDILLA
+<dead_cedilla> <n>                      : "ņ"   # LATIN SMALL LETTER N WITH CEDILLA
+<dead_cedilla> <N>                      : "Ņ"   # LATIN CAPITAL LETTER N WITH CEDILLA
+<dead_cedilla> <r>                      : "ŗ"   # LATIN SMALL LETTER R WITH CEDILLA
+<dead_cedilla> <R>                      : "Ŗ"   # LATIN CAPITAL LETTER R WITH CEDILLA
+<dead_cedilla> <s>                      : "ş"   # LATIN SMALL LETTER S WITH CEDILLA
+<dead_cedilla> <S>                      : "Ş"   # LATIN CAPITAL LETTER S WITH CEDILLA
+<dead_cedilla> <t>                      : "ţ"   # LATIN SMALL LETTER T WITH CEDILLA
+<dead_cedilla> <T>                      : "Ţ"   # LATIN CAPITAL LETTER T WITH CEDILLA
+
+XCOMM Sequences with COMBINING CIRCUMFLEX ACCENT / <dead_circumflex>
+<dead_circumflex> <space>               : "^"   # CIRCUMFLEX
+<dead_circumflex> <a>                   : "â"   # LATIN SMALL LETTER A WITH CIRCUMFLEX
+<dead_circumflex> <A>                   : "Â"   # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+<dead_circumflex> <c>                   : "ĉ"   # LATIN SMALL LETTER C WITH CIRCUMFLEX
+<dead_circumflex> <C>                   : "Ĉ"   # LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+<dead_circumflex> <e>                   : "ê"   # LATIN SMALL LETTER E WITH CIRCUMFLEX
+<dead_circumflex> <E>                   : "Ê"   # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+<dead_circumflex> <g>                   : "ĝ"   # LATIN SMALL LETTER G WITH CIRCUMFLEX
+<dead_circumflex> <G>                   : "Ĝ"   # LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+<dead_circumflex> <h>                   : "ĥ"   # LATIN SMALL LETTER H WITH CIRCUMFLEX
+<dead_circumflex> <H>                   : "Ĥ"   # LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+<dead_circumflex> <i>                   : "î"   # LATIN SMALL LETTER I WITH CIRCUMFLEX
+<dead_circumflex> <I>                   : "Î"   # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+<dead_circumflex> <j>                   : "ĵ"   # LATIN SMALL LETTER J WITH CIRCUMFLEX
+<dead_circumflex> <J>                   : "Ĵ"   # LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+<dead_circumflex> <o>                   : "ô"   # LATIN SMALL LETTER O WITH CIRCUMFLEX
+<dead_circumflex> <O>                   : "Ô"   # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+<dead_circumflex> <s>                   : "ŝ"   # LATIN SMALL LETTER S WITH CIRCUMFLEX
+<dead_circumflex> <S>                   : "Ŝ"   # LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+<dead_circumflex> <u>                   : "û"   # LATIN SMALL LETTER U WITH CIRCUMFLEX
+<dead_circumflex> <U>                   : "Û"   # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+<dead_circumflex> <w>                   : "ŵ"   # LATIN SMALL LETTER W WITH CIRCUMFLEX
+<dead_circumflex> <W>                   : "Ŵ"   # LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+<dead_circumflex> <y>                   : "ŷ"   # LATIN SMALL LETTER Y WITH CIRCUMFLEX
+<dead_circumflex> <Y>                   : "Ŷ"   # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+
+XCOMM Sequences with COMBINING DIAERESIS / <dead_diaeresis>
+<dead_diaeresis> <space>                : "¨"   # DIAERESIS
+<dead_diaeresis> <a>                    : "ä"   # LATIN SMALL LETTER A WITH DIAERESIS
+<dead_diaeresis> <A>                    : "Ä"   # LATIN CAPITAL LETTER A WITH DIAERESIS
+<dead_diaeresis> <e>                    : "ë"   # LATIN SMALL LETTER E WITH DIAERESIS
+<dead_diaeresis> <E>                    : "Ë"   # LATIN CAPITAL LETTER E WITH DIAERESIS
+<dead_diaeresis> <i>                    : "ï"   # LATIN SMALL LETTER I WITH DIAERESIS
+<dead_diaeresis> <I>                    : "Ï"   # LATIN CAPITAL LETTER I WITH DIAERESIS
+<dead_diaeresis> <o>                    : "ö"   # LATIN SMALL LETTER O WITH DIAERESIS
+<dead_diaeresis> <O>                    : "Ö"   # LATIN CAPITAL LETTER O WITH DIAERESIS
+<dead_diaeresis> <u>                    : "ü"   # LATIN SMALL LETTER U WITH DIAERESIS
+<dead_diaeresis> <U>                    : "Ü"   # LATIN CAPITAL LETTER U WITH DIAERESIS
+<dead_diaeresis> <w>                    : "ẅ"   # LATIN SMALL LETTER W WITH DIAERESIS
+<dead_diaeresis> <W>                    : "Ẅ"   # LATIN CAPITAL LETTER W WITH DIAERESIS
+<dead_diaeresis> <y>                    : "ÿ"   # LATIN SMALL LETTER Y WITH DIAERESIS
+<dead_diaeresis> <Y>                    : "Ÿ"   # LATIN CAPITAL LETTER Y WITH DIAERESIS
+
+XCOMM Sequences with COMBINING DOT ABOVE / <dead_abovedot>
+<dead_abovedot> <space>                 : "˙"   # DOT ABOVE
+<dead_abovedot> <b>                     : "ḃ"   # LATIN SMALL LETTER B WITH DOT ABOVE
+<dead_abovedot> <B>                     : "Ḃ"   # LATIN CAPITAL LETTER B WITH DOT ABOVE
+<dead_abovedot> <c>                     : "ċ"   # LATIN SMALL LETTER C WITH DOT ABOVE
+<dead_abovedot> <C>                     : "Ċ"   # LATIN CAPITAL LETTER C WITH DOT ABOVE
+<dead_abovedot> <d>                     : "ḋ"   # LATIN SMALL LETTER D WITH DOT ABOVE
+<dead_abovedot> <D>                     : "Ḋ"   # LATIN CAPITAL LETTER D WITH DOT ABOVE
+<dead_abovedot> <e>                     : "ė"   # LATIN SMALL LETTER E WITH DOT ABOVE
+<dead_abovedot> <E>                     : "Ė"   # LATIN CAPITAL LETTER E WITH DOT ABOVE
+<dead_abovedot> <f>                     : "ḟ"   # LATIN SMALL LETTER F WITH DOT ABOVE
+<dead_abovedot> <F>                     : "Ḟ"   # LATIN CAPITAL LETTER F WITH DOT ABOVE
+<dead_abovedot> <g>                     : "ġ"   # LATIN SMALL LETTER G WITH DOT ABOVE
+<dead_abovedot> <G>                     : "Ġ"   # LATIN CAPITAL LETTER G WITH DOT ABOVE
+<dead_abovedot> <I>                     : "İ"   # LATIN CAPITAL LETTER I WITH DOT ABOVE
+<dead_abovedot> <m>                     : "ṁ"   # LATIN SMALL LETTER M WITH DOT ABOVE
+<dead_abovedot> <M>                     : "Ṁ"   # LATIN CAPITAL LETTER M WITH DOT ABOVE
+<dead_abovedot> <p>                     : "ṗ"   # LATIN SMALL LETTER P WITH DOT ABOVE
+<dead_abovedot> <P>                     : "Ṗ"   # LATIN CAPITAL LETTER P WITH DOT ABOVE
+<dead_abovedot> <s>                     : "ṡ"   # LATIN SMALL LETTER S WITH DOT ABOVE
+<dead_abovedot> <S>                     : "Ṡ"   # LATIN CAPITAL LETTER S WITH DOT ABOVE
+<dead_abovedot> <t>                     : "ṫ"   # LATIN SMALL LETTER T WITH DOT ABOVE
+<dead_abovedot> <T>                     : "Ṫ"   # LATIN CAPITAL LETTER T WITH DOT ABOVE
+<dead_abovedot> <z>                     : "ż"   # LATIN SMALL LETTER Z WITH DOT ABOVE
+<dead_abovedot> <Z>                     : "Ż"   # LATIN CAPITAL LETTER Z WITH DOT ABOVE
+
+XCOMM Sequences with COMBINING DOT BELOW / <dead_belowdot>
+XCOMM <dead_belowdot> <space>              : " "   # DOT BELOW
+<dead_belowdot> <a>                     : "ạ"   # LATIN SMALL LETTER A WITH DOT BELOW
+<dead_belowdot> <A>                     : "Ạ"   # LATIN CAPITAL LETTER A WITH DOT BELOW
+<dead_belowdot> <e>                     : "ẹ"   # LATIN SMALL LETTER E WITH DOT BELOW
+<dead_belowdot> <E>                     : "Ẹ"   # LATIN CAPITAL LETTER E WITH DOT BELOW
+<dead_belowdot> <i>                     : "ị"   # LATIN SMALL LETTER I WITH DOT BELOW
+<dead_belowdot> <I>                     : "Ị"   # LATIN CAPITAL LETTER I WITH DOT BELOW
+<dead_belowdot> <o>                     : "ọ"   # LATIN SMALL LETTER O WITH DOT BELOW
+<dead_belowdot> <O>                     : "Ọ"   # LATIN CAPITAL LETTER O WITH DOT BELOW
+<dead_belowdot> <u>                     : "ụ"   # LATIN SMALL LETTER U WITH DOT BELOW
+<dead_belowdot> <U>                     : "Ụ"   # LATIN CAPITAL LETTER U WITH DOT BELOW
+<dead_belowdot> <y>                     : "ỵ"   # LATIN SMALL LETTER Y WITH DOT BELOW
+<dead_belowdot> <Y>                     : "Ỵ"   # LATIN CAPITAL LETTER Y WITH DOT BELOW
+
+XCOMM Sequences with COMBINING DOUBLE ACUTE ACCENT / <dead_doubleacute>
+<dead_doubleacute> <space>              : "˝"   # DOUBLE ACUTE ACCENT
+<dead_doubleacute> <o>                  : "ő"   # LATIN SMALL LETTER O WITH DOUBLE ACUTE
+<dead_doubleacute> <O>                  : "Ő"   # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+<dead_doubleacute> <u>                  : "ű"   # LATIN SMALL LETTER U WITH DOUBLE ACUTE
+<dead_doubleacute> <U>                  : "Ű"   # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+
+XCOMM Sequences with COMBINING GRAVE ACCENT / <dead_grave>
+<dead_grave> <space>                    : "`"   # GRAVE ACCENT
+<dead_grave> <a>                        : "à"   # LATIN SMALL LETTER A WITH GRAVE
+<dead_grave> <A>                        : "À"   # LATIN CAPITAL LETTER A WITH GRAVE
+<dead_grave> <e>                        : "è"   # LATIN SMALL LETTER E WITH GRAVE
+<dead_grave> <E>                        : "È"   # LATIN CAPITAL LETTER E WITH GRAVE
+<dead_grave> <i>                        : "ì"   # LATIN SMALL LETTER I WITH GRAVE
+<dead_grave> <I>                        : "Ì"   # LATIN CAPITAL LETTER I WITH GRAVE
+<dead_grave> <o>                        : "ò"   # LATIN SMALL LETTER O WITH GRAVE
+<dead_grave> <O>                        : "Ò"   # LATIN CAPITAL LETTER O WITH GRAVE
+<dead_grave> <u>                        : "ù"   # LATIN SMALL LETTER U WITH GRAVE
+<dead_grave> <U>                        : "Ù"   # LATIN CAPITAL LETTER U WITH GRAVE
+<dead_grave> <w>                        : "ẁ"   # LATIN SMALL LETTER W WITH GRAVE
+<dead_grave> <W>                        : "Ẁ"   # LATIN CAPITAL LETTER W WITH GRAVE
+<dead_grave> <y>                        : "ỳ"   # LATIN SMALL LETTER Y WITH GRAVE
+<dead_grave> <Y>                        : "Ỳ"   # LATIN CAPITAL LETTER Y WITH GRAVE
+
+XCOMM Sequences with COMBINING MACRON / <dead_macron>
+<dead_macron> <space>                   : "¯"   # MACRON
+<dead_macron> <a>                       : "ā"   # LATIN SMALL LETTER A WITH MACRON
+<dead_macron> <A>                       : "Ā"   # LATIN CAPITAL LETTER A WITH MACRON
+<dead_macron> <e>                       : "ē"   # LATIN SMALL LETTER E WITH MACRON
+<dead_macron> <E>                       : "Ē"   # LATIN CAPITAL LETTER E WITH MACRON
+<dead_macron> <i>                       : "ī"   # LATIN SMALL LETTER I WITH MACRON
+<dead_macron> <I>                       : "Ī"   # LATIN CAPITAL LETTER I WITH MACRON
+<dead_macron> <o>                       : "ō"   # LATIN SMALL LETTER O WITH MACRON
+<dead_macron> <O>                       : "Ō"   # LATIN CAPITAL LETTER O WITH MACRON
+<dead_macron> <u>                       : "ū"   # LATIN SMALL LETTER U WITH MACRON
+<dead_macron> <U>                       : "Ū"   # LATIN CAPITAL LETTER U WITH MACRON
+<dead_macron> <ae>                      : "ǣ"   # LATIN SMALL LETTER AE WITH MACRON
+<dead_macron> <AE>                      : "Ǣ"   # LATIN CAPITAL LETTER AE WITH MACRON
+<dead_macron> <adiaeresis>              : "ǟ"   # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+<dead_macron> <Adiaeresis>              : "Ǟ"   # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+
+XCOMM Sequences with COMBINING OGONEK / <dead_ogonek>
+<dead_ogonek> <space>                   : "˛"   # OGONEK
+<dead_ogonek> <a>                       : "ą"   # LATIN SMALL LETTER A WITH OGONEK
+<dead_ogonek> <A>                       : "Ą"   # LATIN CAPITAL LETTER A WITH OGONEK
+<dead_ogonek> <e>                       : "ę"   # LATIN SMALL LETTER E WITH OGONEK
+<dead_ogonek> <E>                       : "Ę"   # LATIN CAPITAL LETTER E WITH OGONEK
+<dead_ogonek> <i>                       : "į"   # LATIN SMALL LETTER I WITH OGONEK
+<dead_ogonek> <I>                       : "Į"   # LATIN CAPITAL LETTER I WITH OGONEK
+<dead_ogonek> <o>                       : "ǫ"   # LATIN SMALL LETTER O WITH OGONEK
+<dead_ogonek> <O>                       : "Ǫ"   # LATIN CAPITAL LETTER O WITH OGONEK
+<dead_ogonek> <u>                       : "ų"   # LATIN SMALL LETTER U WITH OGONEK
+<dead_ogonek> <U>                       : "Ų"   # LATIN CAPITAL LETTER U WITH OGONEK
+
+XCOMM Sequences with COMBINING RING ABOVE / <dead_abovering>
+<dead_abovering> <space>                : "°"   # RING ABOVE
+<dead_abovering> <a>                    : "å"   # LATIN SMALL LETTER A WITH RING ABOVE
+<dead_abovering> <A>                    : "Å"   # LATIN CAPITAL LETTER A WITH RING ABOVE
+<dead_abovering> <u>                    : "ů"   # LATIN SMALL LETTER U WITH RING ABOVE
+<dead_abovering> <U>                    : "Ů"   # LATIN CAPITAL LETTER U WITH RING ABOVE
+
+XCOMM Sequences with COMBINING TILDE / <dead_tilde>
+<dead_tilde> <space>                    : "~"   # TILDE
+<dead_tilde> <a>                        : "ã"   # LATIN SMALL LETTER A WITH TILDE
+<dead_tilde> <A>                        : "Ã"   # LATIN CAPITAL LETTER A WITH TILDE
+<dead_tilde> <e>                        : "ẽ"   # LATIN SMALL LETTER E WITH TILDE
+<dead_tilde> <E>                        : "Ẽ"   # LATIN CAPITAL LETTER E WITH TILDE
+<dead_tilde> <i>                        : "ĩ"   # LATIN SMALL LETTER I WITH TILDE
+<dead_tilde> <I>                        : "Ĩ"   # LATIN CAPITAL LETTER I WITH TILDE
+<dead_tilde> <n>                        : "ñ"   # LATIN SMALL LETTER N WITH TILDE
+<dead_tilde> <N>                        : "Ñ"   # LATIN CAPITAL LETTER N WITH TILDE
+<dead_tilde> <o>                        : "õ"   # LATIN SMALL LETTER O WITH TILDE
+<dead_tilde> <O>                        : "Õ"   # LATIN CAPITAL LETTER O WITH TILDE
+<dead_tilde> <u>                        : "ũ"   # LATIN SMALL LETTER U WITH TILDE
+<dead_tilde> <U>                        : "Ũ"   # LATIN CAPITAL LETTER U WITH TILDE
+<dead_tilde> <y>                        : "ỹ"   # LATIN SMALL LETTER Y WITH TILDE
+<dead_tilde> <Y>                        : "Ỹ"   # LATIN CAPITAL LETTER Y WITH TILDE
+
+XCOMM Sequences with AUXILIARY STROKE / <dead_stroke>
+<dead_stroke> <d>                       : "đ"   # LATIN SMALL LETTER D WITH STROKE
+<dead_stroke> <D>                       : "Đ"   # LATIN CAPITAL LETTER D WITH STROKE
+<dead_stroke> <g>                       : "ǥ"   # LATIN SMALL LETTER G WITH STROKE
+<dead_stroke> <G>                       : "Ǥ"   # LATIN CAPITAL LETTER G WITH STROKE
+<dead_stroke> <h>                       : "ħ"   # LATIN SMALL LETTER H WITH STROKE
+<dead_stroke> <H>                       : "Ħ"   # LATIN CAPITAL LETTER H WITH STROKE
+<dead_stroke> <l>                       : "ł"   # LATIN SMALL LETTER L WITH STROKE
+<dead_stroke> <L>                       : "Ł"   # LATIN CAPITAL LETTER L WITH STROKE
+<dead_stroke> <o>                       : "ø"   # LATIN SMALL LETTER O WITH STROKE
+<dead_stroke> <O>                       : "Ø"   # LATIN CAPITAL LETTER O WITH STROKE
+<dead_stroke> <t>                       : "ŧ"   # LATIN SMALL LETTER T WITH STROKE
+<dead_stroke> <T>                       : "Ŧ"   # LATIN CAPITAL LETTER T WITH STROKE
+
+XCOMM Sequences from Annex 4
+
+XCOMM Sequences with COMBINING BREVE / <dead_breve>
+<dead_acute>    <dead_breve> <a>        : "ắ"   # LATIN SMALL LETTER A WITH BREVE AND ACUTE
+<dead_belowdot> <dead_breve> <a>        : "ặ"   # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+<dead_grave>    <dead_breve> <a>        : "ằ"   # LATIN SMALL LETTER A WITH BREVE AND GRAVE
+<dead_hook>     <dead_breve> <a>        : "ẳ"   # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+<dead_tilde>    <dead_breve> <a>        : "ẵ"   # LATIN SMALL LETTER A WITH BREVE AND TILDE
+<dead_acute>    <dead_breve> <A>        : "Ắ"   # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+<dead_belowdot> <dead_breve> <A>        : "Ặ"   # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+<dead_grave>    <dead_breve> <A>        : "Ằ"   # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+<dead_hook>     <dead_breve> <A>        : "Ẳ"   # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+<dead_tilde>    <dead_breve> <A>        : "Ẵ"   # LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+
+XCOMM Sequences with COMBINING CIRCUMFLEX ACCENT / <dead_circumflex>
+<dead_acute>    <dead_circumflex> <a>   : "ấ"   # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+<dead_belowdot> <dead_circumflex> <a>   : "ậ"   # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+<dead_grave>    <dead_circumflex> <a>   : "ầ"   # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+<dead_hook>     <dead_circumflex> <a>   : "ẩ"   # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_tilde>    <dead_circumflex> <a>   : "ẫ"   # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+<dead_acute>    <dead_circumflex> <A>   : "Ấ"   # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+<dead_belowdot> <dead_circumflex> <A>   : "Ậ"   # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+<dead_grave>    <dead_circumflex> <A>   : "Ầ"   # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+<dead_hook>     <dead_circumflex> <A>   : "Ẩ"   # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_tilde>    <dead_circumflex> <A>   : "Ẫ"   # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+<dead_acute>    <dead_circumflex> <e>   : "ế"   # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+<dead_belowdot> <dead_circumflex> <e>   : "ệ"   # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+<dead_grave>    <dead_circumflex> <e>   : "ề"   # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+<dead_hook>     <dead_circumflex> <e>   : "ể"   # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_tilde>    <dead_circumflex> <e>   : "ễ"   # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+<dead_acute>    <dead_circumflex> <E>   : "Ệ"   # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+<dead_belowdot> <dead_circumflex> <E>   : "Ệ"   # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+<dead_grave>    <dead_circumflex> <E>   : "Ề"   # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+<dead_hook>     <dead_circumflex> <E>   : "Ể"   # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_tilde>    <dead_circumflex> <E>   : "Ễ"   # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+<dead_acute>    <dead_circumflex> <o>   : "ố"   # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+<dead_belowdot> <dead_circumflex> <o>   : "ộ"   # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+<dead_grave>    <dead_circumflex> <o>   : "ồ"   # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+<dead_hook>     <dead_circumflex> <o>   : "ổ"   # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_tilde>    <dead_circumflex> <o>   : "ỗ"   # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+<dead_acute>    <dead_circumflex> <O>   : "Ố"   # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+<dead_belowdot> <dead_circumflex> <O>   : "Ộ"   # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+<dead_grave>    <dead_circumflex> <O>   : "Ồ"   # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+<dead_hook>     <dead_circumflex> <O>   : "Ổ"   # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_tilde>    <dead_circumflex> <O>   : "Ỗ"   # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+
+XCOMM Sequences with COMBINING DIAERESIS / <dead_diaeresis>
+<dead_macron>   <dead_diaeresis> <a>    : "ǟ"   # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+<dead_macron>   <dead_diaeresis> <A>    : "Ǟ"   # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+
+XCOMM Sequences with COMBINING DOT ABOVE / <dead_abovedot>
+                <dead_abovedot> <a>     : "ȧ"   # LATIN SMALL LETTER A WITH DOT ABOVE
+<dead_macron>   <dead_abovedot> <a>     : "ǡ"   # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+                <dead_abovedot> <A>     : "Ȧ"   # LATIN CAPITAL LETTER A WITH DOT ABOVE
+<dead_macron>   <dead_abovedot> <A>     : "Ǡ"   # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+
+XCOMM Sequences with COMBINING HOOK ABOVE / <dead_hook>
+<dead_hook> <a>                         : "ả"   # LATIN SMALL LETTER A WITH HOOK ABOVE
+<dead_hook> <A>                         : "Ả"   # LATIN CAPITAL LETTER A WITH HOOK ABOVE
+<dead_hook> <e>                         : "ẻ"   # LATIN SMALL LETTER E WITH HOOK ABOVE
+<dead_hook> <E>                         : "Ẻ"   # LATIN CAPITAL LETTER E WITH HOOK ABOVE
+<dead_hook> <i>                         : "ỉ"   # LATIN SMALL LETTER I WITH HOOK ABOVE
+<dead_hook> <I>                         : "Ỉ"   # LATIN CAPITAL LETTER I WITH HOOK ABOVE
+<dead_hook> <o>                         : "ỏ"   # LATIN SMALL LETTER O WITH HOOK ABOVE
+<dead_hook> <O>                         : "Ỏ"   # LATIN CAPITAL LETTER O WITH HOOK ABOVE
+<dead_hook> <u>                         : "ủ"   # LATIN SMALL LETTER U WITH HOOK ABOVE
+<dead_hook> <U>                         : "Ủ"   # LATIN CAPITAL LETTER U WITH HOOK ABOVE
+<dead_hook> <y>                         : "ỷ"   # LATIN SMALL LETTER Y WITH HOOK ABOVE
+<dead_hook> <Y>                         : "Ỷ"   # LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+
+XCOMM Sequences with COMBINING HORN / <dead_horn>
+                <dead_horn> <o>         : "ơ"   # LATIN SMALL LETTER O WITH HORN
+<dead_acute>    <dead_horn> <o>         : "ớ"   # LATIN SMALL LETTER O WITH HORN AND ACUTE
+<dead_belowdot> <dead_horn> <o>         : "ợ"   # LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+<dead_grave>    <dead_horn> <o>         : "ờ"   # LATIN SMALL LETTER O WITH HORN AND GRAVE
+<dead_hook>     <dead_horn> <o>         : "ờ"   # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+<dead_tilde>    <dead_horn> <o>         : "ỡ"   # LATIN SMALL LETTER O WITH HORN AND TILDE
+                <dead_horn> <O>         : "Ơ"   # LATIN CAPITAL LETTER O WITH HORN
+<dead_acute>    <dead_horn> <O>         : "Ớ"   # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+<dead_belowdot> <dead_horn> <O>         : "Ợ"   # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+<dead_grave>    <dead_horn> <O>         : "Ờ"   # LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+<dead_hook>     <dead_horn> <O>         : "Ở"   # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+<dead_tilde>    <dead_horn> <O>         : "Ỡ"   # LATIN CAPITAL LETTER O WITH HORN AND TILDE
+                <dead_horn> <u>         : "ư"   # LATIN SMALL LETTER U WITH HORN
+<dead_acute>    <dead_horn> <u>         : "ứ"   # LATIN SMALL LETTER U WITH HORN AND ACUTE
+<dead_belowdot> <dead_horn> <u>         : "ự"   # LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+<dead_grave>    <dead_horn> <u>         : "ừ"   # LATIN SMALL LETTER U WITH HORN AND GRAVE
+<dead_hook>     <dead_horn> <u>         : "ử"   # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+<dead_tilde>    <dead_horn> <u>         : "ữ"   # LATIN SMALL LETTER U WITH HORN AND TILDE
+                <dead_horn> <U>         : "Ư"   # LATIN CAPITAL LETTER U WITH HORN
+<dead_acute>    <dead_horn> <U>         : "Ứ"   # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+<dead_belowdot> <dead_horn> <U>         : "Ự"   # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+<dead_grave>    <dead_horn> <U>         : "Ừ"   # LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+<dead_hook>     <dead_horn> <U>         : "Ử"   # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+<dead_tilde>    <dead_horn> <U>         : "Ữ"   # LATIN CAPITAL LETTER U WITH HORN AND TILDE
+
+XCOMM Sequences with COMBINING OGONEK / <dead_ogonek>
+<dead_macron>   <dead_ogonek> <o>       : "ǭ"   # LATIN SMALL LETTER O WITH OGONEK AND MACRON
+<dead_macron>   <dead_ogonek> <O>       : "Ǭ"   # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+
+XCOMM Sequences with COMBINING RING ABOVE / <dead_abovering>
+<dead_acute>    <dead_abovering> <a>    : "ǻ"   # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+<dead_acute>    <dead_abovering> <A>    : "Ǻ"   # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+
+XCOMM Additional sequences from Annex 5 for the reportoire of the MES-2
+XCOMM (Multilingual European Subset No. 2 in ISO/IEC 10646, Collection 282)
+<dead_hook> <f>                         : "ƒ"   # LATIN SMALL LETTER F WITH HOOK
+<Multi_key> <f> <i>                     : "fi"   # LATIN SMALL LIGATURE FI
+<Multi_key> <f> <l>                     : "fl"   # LATIN SMALL LIGATURE FL
+<Multi_key> <i> <j>                     : "ij"   # LATIN SMALL LIGATURE IJ
+<Multi_key> <I> <J>                     : "IJ"   # LATIN CAPITAL LIGATURE IJ
+<dead_abovedot> <l>                     : "ŀ"   # LATIN SMALL LETTER L WITH MIDDLE DOT
+<dead_abovedot> <L>                     : "Ŀ"   # LATIN CAPITAL LETTER L WITH MIDDLE DOT
+<Multi_key> <apostrophe> <space> <n>    : "ʼn"   # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+<dead_hook> <r>                         : "ɼ"   # LATIN SMALL LETTER R WITH LONG LEG
+<Multi_key> <f> <s>                     : "ſ"   # LATIN SMALL LETTER LONG S
+<dead_abovedot> <Multi_key> <f> <s>     : "ẛ"   # LATIN SMALL LETTER LONG S WITH DOT ABOVE
+<Multi_key> <dead_abovedot> <f> <s>     : "ẛ"   # LATIN SMALL LETTER LONG S WITH DOT ABOVE
+<dead_belowcomma> <s>                   : "ș"   # LATIN SMALL LETTER S WITH COMMA BELOW
+<dead_belowcomma> <S>                   : "Ș"   # LATIN CAPITAL LETTER S WITH COMMA BELOW
+<dead_belowcomma> <t>                   : "ț"   # LATIN SMALL LETTER T WITH COMMA BELOW
+<dead_belowcomma> <T>                   : "Ț"   # LATIN CAPITAL LETTER T WITH COMMA BELOW
diff --git a/nls/fi_FI.UTF-8/XI18N_OBJS b/nls/fi_FI.UTF-8/XI18N_OBJS
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/nls/fi_FI.UTF-8/XLC_LOCALE.pre b/nls/fi_FI.UTF-8/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/nls/georgian-academy/Compose.pre b/nls/georgian-academy/Compose.pre
new file mode 100644 (file)
index 0000000..1f9b450
--- /dev/null
@@ -0,0 +1,14 @@
+XCOMM
+XCOMM georgian-academy Compose Sequence
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM
+XCOMM This file currently has no entries.  It appears that a compose file (even
+XCOMM just an empty one) is required for the appropriate keysyms to work for
+XCOMM this encoding.
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+
+XCOMM End of Sequence Definition
diff --git a/nls/georgian-academy/XI18N_OBJS b/nls/georgian-academy/XI18N_OBJS
new file mode 100644 (file)
index 0000000..c4f7ffa
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for georgian-academy locale
+#
+XLC    common/xlcDef   _XlcDefaultLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/georgian-academy/XLC_LOCALE.pre b/nls/georgian-academy/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..c51b1ef
--- /dev/null
@@ -0,0 +1,79 @@
+XCOMM  XLocale Database Sample for georgian-academy
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         GEORGIAN-ACADEMY:GL
+               substitute      ISO8859-1:GL
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset         GEORGIAN-ACADEMY:GR
+       font            GEORGIAN-ACADEMY:GR
+}
+END XLC_FONTSET
+
+XCOMM
+XCOMM  XLC_CHARSET_DEFINE category
+XCOMM
+XLC_CHARSET_DEFINE
+csd0   {
+       charset_name    GEORGIAN-ACADEMY
+       side            GR
+       length          1
+       string_encoding False
+       sequence        \x1b%/1
+}
+END XLC_CHARSET_DEFINE
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name           GEORGIAN-ACADEMY
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     GEORGIAN-ACADEMY:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     GEORGIAN-ACADEMY:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/georgian-ps/Compose.pre b/nls/georgian-ps/Compose.pre
new file mode 100644 (file)
index 0000000..672835b
--- /dev/null
@@ -0,0 +1,14 @@
+XCOMM
+XCOMM georgian-ps Compose Sequence
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM
+XCOMM This file currently has no entries.  It appears that a compose file (even
+XCOMM just an empty one) is required for the appropriate keysyms to work for
+XCOMM this encoding.
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+
+XCOMM End of Sequence Definition
diff --git a/nls/georgian-ps/XI18N_OBJS b/nls/georgian-ps/XI18N_OBJS
new file mode 100644 (file)
index 0000000..558452d
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for georgian-ps locale
+#
+XLC    common/xlcDef   _XlcDefaultLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/georgian-ps/XLC_LOCALE.pre b/nls/georgian-ps/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..470dcae
--- /dev/null
@@ -0,0 +1,79 @@
+XCOMM  XLocale Database Sample for georgian-ps
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         GEORGIAN-PS:GL 
+               substitute      ISO8859-1:GL
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset         GEORGIAN-PS:GR
+       font            GEORGIAN-PS:GR
+}
+END XLC_FONTSET
+
+XCOMM
+XCOMM  XLC_CHARSET_DEFINE category
+XCOMM
+XLC_CHARSET_DEFINE
+csd0   {
+       charset_name    GEORGIAN-PS
+       side            GR
+       length          1
+       string_encoding False
+       sequence        \x1b%/1
+}
+END XLC_CHARSET_DEFINE
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name           GEORGIAN-PS
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     GEORGIAN-PS:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     GEORGIAN-PS:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/ibm-cp1133/Compose.pre b/nls/ibm-cp1133/Compose.pre
new file mode 100644 (file)
index 0000000..ef0f59a
--- /dev/null
@@ -0,0 +1,14 @@
+XCOMM
+XCOMM ibm-cp1133 Compose Sequence
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM
+XCOMM This file currently has no entries.  It appears that a compose file (even
+XCOMM just an empty one) is required for the appropriate keysyms to work for
+XCOMM this encoding.
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+
+XCOMM End of Sequence Definition
diff --git a/nls/ibm-cp1133/XI18N_OBJS b/nls/ibm-cp1133/XI18N_OBJS
new file mode 100644 (file)
index 0000000..02ca83b
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for ibm-cp1133 locale
+#
+XLC    common/xlcDef   _XlcDefaultLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/ibm-cp1133/XLC_LOCALE.pre b/nls/ibm-cp1133/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..f3b762c
--- /dev/null
@@ -0,0 +1,79 @@
+XCOMM  XLocale Database Sample for ibm-cp1133.
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         IBM-CP1133:GL
+               substitute      ISO8859-1:GL
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset         IBM-CP1133:GR
+       font            IBM-CP1133:GR
+}
+END XLC_FONTSET
+
+XCOMM
+XCOMM  XLC_CHARSET_DEFINE category
+XCOMM
+XLC_CHARSET_DEFINE
+csd0   {
+       charset_name    IBM-CP1133
+       side            GR
+       length          1
+       string_encoding False
+       sequence        \x1b%/1
+}
+END XLC_CHARSET_DEFINE
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name           IBM-CP1133
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     IBM-CP1133:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     IBM-CP1133:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/iscii-dev/Compose.pre b/nls/iscii-dev/Compose.pre
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/nls/iscii-dev/XI18N_OBJS b/nls/iscii-dev/XI18N_OBJS
new file mode 100644 (file)
index 0000000..0dbaed5
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for iscii-dev locale
+#
+XLC    common/xlcDef   _XlcDefaultLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/iscii-dev/XLC_LOCALE.pre b/nls/iscii-dev/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..1ddb186
--- /dev/null
@@ -0,0 +1,79 @@
+XCOMM  XLocale Database Sample for mulelao-1.
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         ISCII-DEV:GL
+               substitute      ISO8859-1:GL
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset         ISCII-DEV:GR
+       font            ISCII-DEV:GR
+}
+END XLC_FONTSET
+
+XCOMM
+XCOMM  XLC_CHARSET_DEFINE category
+XCOMM
+XLC_CHARSET_DEFINE
+csd0   {
+       charset_name    ISCII-DEV
+       side            GR
+       length          1
+       string_encoding False
+       sequence        \x1b%/1
+}
+END XLC_CHARSET_DEFINE
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name           ISCII-DEV
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     ISCII-DEV:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     ISCII-DEV:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/isiri-3342/Compose.pre b/nls/isiri-3342/Compose.pre
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/nls/isiri-3342/XI18N_OBJS b/nls/isiri-3342/XI18N_OBJS
new file mode 100644 (file)
index 0000000..028d847
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for isiri-3342 locale
+#
+XLC    common/xlcDef   _XlcDefaultLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/isiri-3342/XLC_LOCALE.pre b/nls/isiri-3342/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..59072fc
--- /dev/null
@@ -0,0 +1,79 @@
+XCOMM  XLocale Database Sample for mulelao-1.
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         ISIRI-3342:GL 
+               substitute      ISO8859-1:GL
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset         ISIRI-3342:GR
+       font            ISIRI-3342:GR
+}
+END XLC_FONTSET
+
+XCOMM
+XCOMM  XLC_CHARSET_DEFINE category
+XCOMM
+XLC_CHARSET_DEFINE
+csd0   {
+       charset_name    ISIRI-3342
+       side            GR
+       length          1
+       string_encoding False
+       sequence        \x1b%/1
+}
+END XLC_CHARSET_DEFINE
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name           ISIRI-3342
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     ISIRI-3342:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     ISIRI-3342:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/iso8859-1/Compose.pre b/nls/iso8859-1/Compose.pre
new file mode 100644 (file)
index 0000000..c726ecf
--- /dev/null
@@ -0,0 +1,843 @@
+XCOMM
+XCOMM ISO 8859-1 (Latin1) Compose Sequence
+XCOMM
+XCOMM
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+<Multi_key> <plus> <plus>              : "#"   numbersign
+<Multi_key> <apostrophe> <space>       : "'"   apostrophe
+<Multi_key> <space> <apostrophe>       : "'"   apostrophe
+<Multi_key> <A> <T>                    : "@"   at
+<Multi_key> <parenleft> <parenleft>    : "["   bracketleft
+<Multi_key> <slash> <slash>            : "\\"  backslash
+<Multi_key> <slash> <less>             : "\\"  backslash
+<Multi_key> <less> <slash>             : "\\"  backslash
+<Multi_key> <parenright> <parenright>  : "]"   bracketright
+<Multi_key> <asciicircum> <space>      : "^"   asciicircum
+<Multi_key> <space> <asciicircum>      : "^"   asciicircum
+<Multi_key> <greater> <space>          : "^"   asciicircum
+<Multi_key> <space> <greater>          : "^"   asciicircum
+<Multi_key> <grave> <space>            : "`"   grave
+<Multi_key> <space> <grave>            : "`"   grave
+<Multi_key> <parenleft> <minus>                : "{"   braceleft
+<Multi_key> <minus> <parenleft>                : "{"   braceleft
+<Multi_key> <slash> <asciicircum>      : "|"   bar
+<Multi_key> <asciicircum> <slash>      : "|"   bar
+<Multi_key> <V> <L>                    : "|"   bar
+<Multi_key> <L> <V>                    : "|"   bar
+<Multi_key> <v> <l>                    : "|"   bar
+<Multi_key> <l> <v>                    : "|"   bar
+<Multi_key> <parenright> <minus>       : "}"   braceright
+<Multi_key> <minus> <parenright>       : "}"   braceright
+<Multi_key> <asciitilde> <space>       : "~"   asciitilde
+<Multi_key> <space> <asciitilde>       : "~"   asciitilde
+<Multi_key> <minus> <space>            : "~"   asciitilde
+<Multi_key> <space> <minus>            : "~"   asciitilde
+<Multi_key> <exclam> <exclam>          : "\241"        exclamdown
+<Multi_key> <c> <slash>                        : "\242"        cent
+<Multi_key> <slash> <c>                        : "\242"        cent
+<Multi_key> <C> <slash>                        : "\242"        cent
+<Multi_key> <slash> <C>                        : "\242"        cent
+<Multi_key> <C> <bar>                  : "\242"        cent
+<Multi_key> <bar> <C>                  : "\242"        cent
+<Multi_key> <c> <bar>                  : "\242"        cent
+<Multi_key> <bar> <c>                  : "\242"        cent
+<Multi_key> <l> <minus>                        : "\243"        sterling
+<Multi_key> <minus> <l>                        : "\243"        sterling
+<Multi_key> <L> <minus>                        : "\243"        sterling
+<Multi_key> <minus> <L>                        : "\243"        sterling
+<Multi_key> <l> <equal>                        : "\243"        sterling
+<Multi_key> <equal> <l>                        : "\243"        sterling
+<Multi_key> <L> <equal>                        : "\243"        sterling
+<Multi_key> <equal> <L>                        : "\243"        sterling
+<Multi_key> <y> <minus>                        : "\245"        yen
+<Multi_key> <minus> <y>                        : "\245"        yen
+<Multi_key> <Y> <minus>                        : "\245"        yen
+<Multi_key> <minus> <Y>                        : "\245"        yen
+<Multi_key> <y> <equal>                        : "\245"        yen
+<Multi_key> <equal> <y>                        : "\245"        yen
+<Multi_key> <Y> <equal>                        : "\245"        yen
+<Multi_key> <equal> <Y>                        : "\245"        yen
+<Multi_key> <s> <o>                    : "\247"        section
+<Multi_key> <o> <s>                    : "\247"        section
+<Multi_key> <S> <O>                    : "\247"        section
+<Multi_key> <O> <S>                    : "\247"        section
+<Multi_key> <S> <exclam>               : "\247"        section
+<Multi_key> <exclam> <S>               : "\247"        section
+<Multi_key> <s> <exclam>               : "\247"        section
+<Multi_key> <exclam> <s>               : "\247"        section
+<Multi_key> <S> <0>                    : "\247"        section
+<Multi_key> <0> <S>                    : "\247"        section
+<Multi_key> <s> <0>                    : "\247"        section
+<Multi_key> <0> <s>                    : "\247"        section
+<Multi_key> <x> <o>                    : "\244"        currency
+<Multi_key> <o> <x>                    : "\244"        currency
+<Multi_key> <X> <O>                    : "\244"        currency
+<Multi_key> <O> <X>                    : "\244"        currency
+<Multi_key> <x> <O>                    : "\244"        currency
+<Multi_key> <O> <x>                    : "\244"        currency
+<Multi_key> <X> <o>                    : "\244"        currency
+<Multi_key> <o> <X>                    : "\244"        currency
+<Multi_key> <x> <0>                    : "\244"        currency
+<Multi_key> <0> <x>                    : "\244"        currency
+<Multi_key> <X> <0>                    : "\244"        currency
+<Multi_key> <0> <X>                    : "\244"        currency
+<Multi_key> <c> <o>                    : "\251"        copyright
+<Multi_key> <o> <c>                    : "\251"        copyright
+<Multi_key> <C> <O>                    : "\251"        copyright
+<Multi_key> <O> <C>                    : "\251"        copyright
+<Multi_key> <c> <O>                    : "\251"        copyright
+<Multi_key> <O> <c>                    : "\251"        copyright
+<Multi_key> <C> <o>                    : "\251"        copyright
+<Multi_key> <o> <C>                    : "\251"        copyright
+<Multi_key> <c> <0>                    : "\251"        copyright
+<Multi_key> <0> <c>                    : "\251"        copyright
+<Multi_key> <C> <0>                    : "\251"        copyright
+<Multi_key> <0> <C>                    : "\251"        copyright
+<Multi_key> <parenleft> <c>            : "\251"        copyright
+<Multi_key> <a> <underscore>           : "\252"        ordfeminine
+<Multi_key> <underscore> <a>           : "\252"        ordfeminine
+<Multi_key> <A> <underscore>           : "\252"        ordfeminine
+<Multi_key> <underscore> <A>           : "\252"        ordfeminine
+<Multi_key> <o> <underscore>           : "\272"        masculine
+<Multi_key> <underscore> <o>           : "\272"        masculine
+<Multi_key> <O> <underscore>           : "\272"        masculine
+<Multi_key> <underscore> <O>           : "\272"        masculine
+<Multi_key> <less> <less>              : "\253"        guillemotleft
+<Multi_key> <greater> <greater>                : "\273"        guillemotright
+<Multi_key> <0> <asciicircum>          : "\260"        degree
+<Multi_key> <asciicircum> <0>          : "\260"        degree
+<Multi_key> <0> <asterisk>             : "\260"        degree
+<Multi_key> <asterisk> <0>             : "\260"        degree
+<Multi_key> <plus> <minus>             : "\261"        plusminus
+<Multi_key> <minus> <plus>             : "\261"        plusminus
+<Multi_key> <slash> <u>                        : "\265"        mu
+<Multi_key> <u> <slash>                        : "\265"        mu
+<Multi_key> <slash> <U>                        : "\265"        mu
+<Multi_key> <U> <slash>                        : "\265"        mu
+<Multi_key> <1> <asciicircum>          : "\271"        onesuperior
+<Multi_key> <asciicircum> <1>          : "\271"        onesuperior
+<Multi_key> <S> <1>                    : "\271"        onesuperior
+<Multi_key> <1> <S>                    : "\271"        onesuperior
+<Multi_key> <s> <1>                    : "\271"        onesuperior
+<Multi_key> <1> <s>                    : "\271"        onesuperior
+<Multi_key> <2> <asciicircum>          : "\262"        twosuperior
+<Multi_key> <asciicircum> <2>          : "\262"        twosuperior
+<Multi_key> <S> <2>                    : "\262"        twosuperior
+<Multi_key> <2> <S>                    : "\262"        twosuperior
+<Multi_key> <s> <2>                    : "\262"        twosuperior
+<Multi_key> <2> <s>                    : "\262"        twosuperior
+<Multi_key> <3> <asciicircum>          : "\263"        threesuperior
+<Multi_key> <asciicircum> <3>          : "\263"        threesuperior
+<Multi_key> <S> <3>                    : "\263"        threesuperior
+<Multi_key> <3> <S>                    : "\263"        threesuperior
+<Multi_key> <s> <3>                    : "\263"        threesuperior
+<Multi_key> <3> <s>                    : "\263"        threesuperior
+<Multi_key> <p> <exclam>               : "\266"        paragraph
+<Multi_key> <exclam> <p>               : "\266"        paragraph
+<Multi_key> <P> <exclam>               : "\266"        paragraph
+<Multi_key> <exclam> <P>               : "\266"        paragraph
+<Multi_key> <period> <asciicircum>     : "\267"        periodcentered
+<Multi_key> <asciicircum> <period>     : "\267"        periodcentered
+<Multi_key> <period> <period>          : "\267"        periodcentered
+<Multi_key> <1> <4>                    : "\274"        onequarter
+<Multi_key> <1> <2>                    : "\275"        onehalf
+<Multi_key> <3> <4>                    : "\276"        threequarters
+<Multi_key> <question> <question>      : "\277"        questiondown
+<Multi_key> <space> <space>            : "\240"        nobreakspace
+<Multi_key> <bar> <bar>                        : "\246"        brokenbar
+<Multi_key> <exclam> <asciicircum>     : "\246"        brokenbar
+<Multi_key> <asciicircum> <exclam>     : "\246"        brokenbar
+<Multi_key> <V> <B>                    : "\246"        brokenbar
+<Multi_key> <B> <V>                    : "\246"        brokenbar
+<Multi_key> <v> <b>                    : "\246"        brokenbar
+<Multi_key> <b> <v>                    : "\246"        brokenbar
+<Multi_key> <minus> <comma>            : "\254"        notsign
+<Multi_key> <comma> <minus>            : "\254"        notsign
+<Multi_key> <minus> <minus>            : "\255"        hyphen
+<Multi_key> <R> <O>                    : "\256"        registered
+<Multi_key> <O> <R>                    : "\256"        registered
+<Multi_key> <parenleft> <r>            : "\256"        registered
+<Multi_key> <minus> <asciicircum>      : "\257"        macron
+<Multi_key> <asciicircum> <minus>      : "\257"        macron
+<Multi_key> <underscore> <asciicircum> : "\257"        macron
+<Multi_key> <asciicircum> <underscore> : "\257"        macron
+<Multi_key> <underscore> <underscore>  : "\257"        macron
+<Multi_key> <minus> <colon>            : "\367"        division
+<Multi_key> <colon> <minus>            : "\367"        division
+<Multi_key> <x> <x>                    : "\327"        multiply
+<Multi_key> <apostrophe> <apostrophe>  : "\264"        acute
+<Multi_key> <comma> <comma>            : "\270"        cedilla
+<Multi_key> <quotedbl> <quotedbl>      : "\250"        diaeresis
+XCOMM Accented Alphabet
+<Multi_key> <A> <grave>                        : "\300"        Agrave
+<Multi_key> <grave> <A>                        : "\300"        Agrave
+<Multi_key> <A> <acute>                        : "\301"        Aacute
+<Multi_key> <acute> <A>                        : "\301"        Aacute
+<Multi_key> <A> <apostrophe>           : "\301"        Aacute
+<Multi_key> <apostrophe> <A>           : "\301"        Aacute
+<Multi_key> <A> <asciicircum>          : "\302"        Acircumflex
+<Multi_key> <asciicircum> <A>          : "\302"        Acircumflex
+<Multi_key> <A> <greater>              : "\302"        Acircumflex
+<Multi_key> <greater> <A>              : "\302"        Acircumflex
+<Multi_key> <A> <asciitilde>           : "\303"        Atilde
+<Multi_key> <asciitilde> <A>           : "\303"        Atilde
+<Multi_key> <A> <minus>                        : "\303"        Atilde
+<Multi_key> <minus> <A>                        : "\303"        Atilde
+<Multi_key> <A> <quotedbl>             : "\304"        Adiaeresis
+<Multi_key> <quotedbl> <A>             : "\304"        Adiaeresis
+<Multi_key> <A> <diaeresis>            : "\304"        Adiaeresis
+<Multi_key> <diaeresis> <A>            : "\304"        Adiaeresis
+<Multi_key> <A> <asterisk>             : "\305"        Aring
+<Multi_key> <asterisk> <A>             : "\305"        Aring
+<Multi_key> <A> <A>                    : "\305"        Aring
+<Multi_key> <A> <O>                    : "\305"        Aring
+<Multi_key> <A> <E>                    : "\306"        AE
+<Multi_key> <a> <grave>                        : "\340"        agrave
+<Multi_key> <grave> <a>                        : "\340"        agrave
+<Multi_key> <a> <acute>                        : "\341"        aacute
+<Multi_key> <acute> <a>                        : "\341"        aacute
+<Multi_key> <a> <apostrophe>           : "\341"        aacute
+<Multi_key> <apostrophe> <a>           : "\341"        aacute
+<Multi_key> <a> <asciicircum>          : "\342"        acircumflex
+<Multi_key> <asciicircum> <a>          : "\342"        acircumflex
+<Multi_key> <a> <greater>              : "\342"        acircumflex
+<Multi_key> <greater> <a>              : "\342"        acircumflex
+<Multi_key> <a> <asciitilde>           : "\343"        atilde
+<Multi_key> <asciitilde> <a>           : "\343"        atilde
+<Multi_key> <a> <minus>                        : "\343"        atilde
+<Multi_key> <minus> <a>                        : "\343"        atilde
+<Multi_key> <a> <quotedbl>             : "\344"        adiaeresis
+<Multi_key> <quotedbl> <a>             : "\344"        adiaeresis
+<Multi_key> <a> <diaeresis>            : "\344"        adiaeresis
+<Multi_key> <diaeresis> <a>            : "\344"        adiaeresis
+<Multi_key> <a> <asterisk>             : "\345"        aring
+<Multi_key> <asterisk> <a>             : "\345"        aring
+<Multi_key> <a> <a>                    : "\345"        aring
+<Multi_key> <a> <o>                    : "\345"        aring
+<Multi_key> <a> <e>                    : "\346"        ae
+<Multi_key> <acute> <C>                        : "\307"        Ccedilla
+<Multi_key> <acute> <c>                        : "\347"        ccedilla
+<Multi_key> <C> <comma>                        : "\307"        Ccedilla
+<Multi_key> <C> <cedilla>              : "\307"        Ccedilla
+<Multi_key> <comma> <C>                        : "\307"        Ccedilla
+<Multi_key> <cedilla> <C>              : "\307"        Ccedilla
+<Multi_key> <c> <comma>                        : "\347"        ccedilla
+<Multi_key> <c> <cedilla>              : "\347"        ccedilla
+<Multi_key> <comma> <c>                        : "\347"        ccedilla
+<Multi_key> <cedilla> <c>              : "\347"        ccedilla
+<Multi_key> <minus> <D>                        : "\320"        ETH
+<Multi_key> <D> <minus>                        : "\320"        ETH
+<Multi_key> <minus> <d>                        : "\360"        eth
+<Multi_key> <d> <minus>                        : "\360"        eth
+<Multi_key> <E> <grave>                        : "\310"        Egrave
+<Multi_key> <grave> <E>                        : "\310"        Egrave
+<Multi_key> <E> <acute>                        : "\311"        Eacute
+<Multi_key> <acute> <E>                        : "\311"        Eacute
+<Multi_key> <E> <apostrophe>           : "\311"        Eacute
+<Multi_key> <apostrophe> <E>           : "\311"        Eacute
+<Multi_key> <E> <asciicircum>          : "\312"        Ecircumflex
+<Multi_key> <asciicircum> <E>          : "\312"        Ecircumflex
+<Multi_key> <E> <greater>              : "\312"        Ecircumflex
+<Multi_key> <greater> <E>              : "\312"        Ecircumflex
+<Multi_key> <E> <quotedbl>             : "\313"        Ediaeresis
+<Multi_key> <quotedbl> <E>             : "\313"        Ediaeresis
+<Multi_key> <E> <diaeresis>            : "\313"        Ediaeresis
+<Multi_key> <diaeresis> <E>            : "\313"        Ediaeresis
+<Multi_key> <e> <grave>                        : "\350"        egrave
+<Multi_key> <grave> <e>                        : "\350"        egrave
+<Multi_key> <e> <acute>                        : "\351"        eacute
+<Multi_key> <acute> <e>                        : "\351"        eacute
+<Multi_key> <e> <apostrophe>           : "\351"        eacute
+<Multi_key> <apostrophe> <e>           : "\351"        eacute
+<Multi_key> <e> <asciicircum>          : "\352"        ecircumflex
+<Multi_key> <asciicircum> <e>          : "\352"        ecircumflex
+<Multi_key> <e> <greater>              : "\352"        ecircumflex
+<Multi_key> <greater> <e>              : "\352"        ecircumflex
+<Multi_key> <e> <quotedbl>             : "\353"        ediaeresis
+<Multi_key> <quotedbl> <e>             : "\353"        ediaeresis
+<Multi_key> <e> <diaeresis>            : "\353"        ediaeresis
+<Multi_key> <diaeresis> <e>            : "\353"        ediaeresis
+<Multi_key> <I> <grave>                        : "\314"        Igrave
+<Multi_key> <grave> <I>                        : "\314"        Igrave
+<Multi_key> <I> <acute>                        : "\315"        Iacute
+<Multi_key> <acute> <I>                        : "\315"        Iacute
+<Multi_key> <I> <apostrophe>           : "\315"        Iacute
+<Multi_key> <apostrophe> <I>           : "\315"        Iacute
+<Multi_key> <I> <asciicircum>          : "\316"        Icircumflex
+<Multi_key> <asciicircum> <I>          : "\316"        Icircumflex
+<Multi_key> <I> <greater>              : "\316"        Icircumflex
+<Multi_key> <greater> <I>              : "\316"        Icircumflex
+<Multi_key> <I> <quotedbl>             : "\317"        Idiaeresis
+<Multi_key> <quotedbl> <I>             : "\317"        Idiaeresis
+<Multi_key> <I> <diaeresis>            : "\317"        Idiaeresis
+<Multi_key> <diaeresis> <I>            : "\317"        Idiaeresis
+<Multi_key> <i> <grave>                        : "\354"        igrave
+<Multi_key> <grave> <i>                        : "\354"        igrave
+<Multi_key> <i> <acute>                        : "\355"        iacute
+<Multi_key> <acute> <i>                        : "\355"        iacute
+<Multi_key> <i> <apostrophe>           : "\355"        iacute
+<Multi_key> <apostrophe> <i>           : "\355"        iacute
+<Multi_key> <i> <asciicircum>          : "\356"        icircumflex
+<Multi_key> <asciicircum> <i>          : "\356"        icircumflex
+<Multi_key> <i> <greater>              : "\356"        icircumflex
+<Multi_key> <greater> <i>              : "\356"        icircumflex
+<Multi_key> <i> <quotedbl>             : "\357"        idiaeresis
+<Multi_key> <quotedbl> <i>             : "\357"        idiaeresis
+<Multi_key> <i> <diaeresis>            : "\357"        idiaeresis
+<Multi_key> <diaeresis> <i>            : "\357"        idiaeresis
+<Multi_key> <N> <asciitilde>           : "\321"        Ntilde
+<Multi_key> <asciitilde> <N>           : "\321"        Ntilde
+<Multi_key> <N> <minus>                        : "\321"        Ntilde
+<Multi_key> <minus> <N>                        : "\321"        Ntilde
+<Multi_key> <n> <asciitilde>           : "\361"        ntilde
+<Multi_key> <asciitilde> <n>           : "\361"        ntilde
+<Multi_key> <n> <minus>                        : "\361"        ntilde
+<Multi_key> <minus> <n>                        : "\361"        ntilde
+<Multi_key> <O> <grave>                        : "\322"        Ograve
+<Multi_key> <grave> <O>                        : "\322"        Ograve
+<Multi_key> <O> <acute>                        : "\323"        Oacute
+<Multi_key> <acute> <O>                        : "\323"        Oacute
+<Multi_key> <O> <apostrophe>           : "\323"        Oacute
+<Multi_key> <apostrophe> <O>           : "\323"        Oacute
+<Multi_key> <O> <asciicircum>          : "\324"        Ocircumflex
+<Multi_key> <asciicircum> <O>          : "\324"        Ocircumflex
+<Multi_key> <O> <greater>              : "\324"        Ocircumflex
+<Multi_key> <greater> <O>              : "\324"        Ocircumflex
+<Multi_key> <O> <asciitilde>           : "\325"        Otilde
+<Multi_key> <asciitilde> <O>           : "\325"        Otilde
+<Multi_key> <O> <minus>                        : "\325"        Otilde
+<Multi_key> <minus> <O>                        : "\325"        Otilde
+<Multi_key> <O> <quotedbl>             : "\326"        Odiaeresis
+<Multi_key> <quotedbl> <O>             : "\326"        Odiaeresis
+<Multi_key> <O> <diaeresis>            : "\326"        Odiaeresis
+<Multi_key> <diaeresis> <O>            : "\326"        Odiaeresis
+<Multi_key> <O> <slash>                        : "\330"        Ooblique
+<Multi_key> <slash> <O>                        : "\330"        Ooblique
+<Multi_key> <o> <grave>                        : "\362"        ograve
+<Multi_key> <grave> <o>                        : "\362"        ograve
+<Multi_key> <o> <acute>                        : "\363"        oacute
+<Multi_key> <acute> <o>                        : "\363"        oacute
+<Multi_key> <o> <apostrophe>           : "\363"        oacute
+<Multi_key> <apostrophe> <o>           : "\363"        oacute
+<Multi_key> <o> <asciicircum>          : "\364"        ocircumflex
+<Multi_key> <asciicircum> <o>          : "\364"        ocircumflex
+<Multi_key> <o> <greater>              : "\364"        ocircumflex
+<Multi_key> <greater> <o>              : "\364"        ocircumflex
+<Multi_key> <o> <asciitilde>           : "\365"        otilde
+<Multi_key> <asciitilde> <o>           : "\365"        otilde
+<Multi_key> <o> <minus>                        : "\365"        otilde
+<Multi_key> <minus> <o>                        : "\365"        otilde
+<Multi_key> <o> <quotedbl>             : "\366"        odiaeresis
+<Multi_key> <quotedbl> <o>             : "\366"        odiaeresis
+<Multi_key> <o> <diaeresis>            : "\366"        odiaeresis
+<Multi_key> <diaeresis> <o>            : "\366"        odiaeresis
+<Multi_key> <o> <slash>                        : "\370"        oslash
+<Multi_key> <slash> <o>                        : "\370"        oslash
+<Multi_key> <U> <grave>                        : "\331"        Ugrave
+<Multi_key> <grave> <U>                        : "\331"        Ugrave
+<Multi_key> <U> <acute>                        : "\332"        Uacute
+<Multi_key> <acute> <U>                        : "\332"        Uacute
+<Multi_key> <U> <apostrophe>           : "\332"        Uacute
+<Multi_key> <apostrophe> <U>           : "\332"        Uacute
+<Multi_key> <U> <asciicircum>          : "\333"        Ucircumflex
+<Multi_key> <asciicircum> <U>          : "\333"        Ucircumflex
+<Multi_key> <U> <greater>              : "\333"        Ucircumflex
+<Multi_key> <greater> <U>              : "\333"        Ucircumflex
+<Multi_key> <U> <quotedbl>             : "\334"        Udiaeresis
+<Multi_key> <quotedbl> <U>             : "\334"        Udiaeresis
+<Multi_key> <U> <diaeresis>            : "\334"        Udiaeresis
+<Multi_key> <diaeresis> <U>            : "\334"        Udiaeresis
+<Multi_key> <u> <grave>                        : "\371"        ugrave
+<Multi_key> <grave> <u>                        : "\371"        ugrave
+<Multi_key> <u> <acute>                        : "\372"        uacute
+<Multi_key> <acute> <u>                        : "\372"        uacute
+<Multi_key> <u> <apostrophe>           : "\372"        uacute
+<Multi_key> <apostrophe> <u>           : "\372"        uacute
+<Multi_key> <u> <asciicircum>          : "\373"        ucircumflex
+<Multi_key> <asciicircum> <u>          : "\373"        ucircumflex
+<Multi_key> <u> <greater>              : "\373"        ucircumflex
+<Multi_key> <greater> <u>              : "\373"        ucircumflex
+<Multi_key> <u> <quotedbl>             : "\374"        udiaeresis
+<Multi_key> <quotedbl> <u>             : "\374"        udiaeresis
+<Multi_key> <u> <diaeresis>            : "\374"        udiaeresis
+<Multi_key> <diaeresis> <u>            : "\374"        udiaeresis
+<Multi_key> <s> <s>                    : "\337"        ssharp
+<Multi_key> <T> <H>                    : "\336"        THORN
+<Multi_key> <t> <h>                    : "\376"        thorn
+<Multi_key> <Y> <acute>                        : "\335"        Yacute
+<Multi_key> <acute> <Y>                        : "\335"        Yacute
+<Multi_key> <Y> <apostrophe>           : "\335"        Yacute
+<Multi_key> <apostrophe> <Y>           : "\335"        Yacute
+<Multi_key> <y> <acute>                        : "\375"        yacute
+<Multi_key> <acute> <y>                        : "\375"        yacute
+<Multi_key> <y> <apostrophe>           : "\375"        yacute
+<Multi_key> <apostrophe> <y>           : "\375"        yacute
+<Multi_key> <y> <quotedbl>             : "\377"        ydiaeresis
+<Multi_key> <quotedbl> <y>             : "\377"        ydiaeresis
+<Multi_key> <y> <diaeresis>            : "\377"        ydiaeresis
+<Multi_key> <diaeresis> <y>            : "\377"        ydiaeresis
+XCOMM
+XCOMM
+XCOMM dead key accent keysyms
+XCOMM Special Character
+<dead_circumflex> <slash>              : "|"   bar
+<dead_circumflex> <space>              : "^"   asciicircum
+<dead_circumflex> <dead_circumflex>    : "^"   asciicircum
+<dead_tilde> <space>                   : "~"   asciitilde
+<dead_tilde> <dead_tilde>              : "~"   asciitilde
+<dead_grave> <space>                   : "`"   grave
+<dead_grave> <dead_grave>              : "`"   grave
+XCOMM These are for us_intl, that does not have diaeresis, etc
+<dead_acute> <space>                   : "'"   apostrophe
+<dead_acute> <dead_acute>              : "\264"        acute
+<dead_diaeresis> <space>               : "\""  quotedbl
+<dead_diaeresis> <dead_diaeresis>      : "\250"        diaeresis
+<dead_doubleacute> <space>             : "\""  quotedbl
+<dead_abovering> <space>               : "\260"        degree
+<dead_abovering> <dead_abovering>      : "\260"        degree
+<dead_circumflex> <0>                  : "\260"        degree
+<dead_circumflex> <1>                  : "\271"        onesuperior
+<dead_circumflex> <2>                  : "\262"        twosuperior
+<dead_circumflex> <3>                  : "\263"        threesuperior
+<dead_circumflex> <period>             : "\267"        periodcentered
+<dead_circumflex> <exclam>             : "\246"        brokenbar
+<dead_cedilla> <minus>                 : "\254"        notsign
+<dead_circumflex> <minus>              : "\257"        macron
+<dead_circumflex> <underscore>         : "\257"        macron
+<dead_acute> <apostrophe>              : "\264"        acute
+<dead_cedilla> <comma>                 : "\270"        cedilla
+<dead_diaeresis> <quotedbl>            : "\250"        diaeresis
+XCOMM Accented Alphabet
+<dead_abovering> <A>                   : "\305"        Aring
+<dead_grave> <A>                       : "\300"        Agrave
+<dead_acute> <A>                       : "\301"        Aacute
+<dead_circumflex> <A>                  : "\302"        Acircumflex
+<dead_tilde> <A>                       : "\303"        Atilde
+<dead_diaeresis> <A>                   : "\304"        Adiaeresis
+<dead_abovering> <a>                   : "\345"        aring
+<dead_grave> <a>                       : "\340"        agrave
+<dead_acute> <a>                       : "\341"        aacute
+<dead_circumflex> <a>                  : "\342"        acircumflex
+<dead_tilde> <a>                       : "\343"        atilde
+<dead_diaeresis> <a>                   : "\344"        adiaeresis
+<dead_cedilla> <C>                     : "\307"        Ccedilla
+<dead_cedilla> <c>                     : "\347"        ccedilla
+<dead_grave> <E>                       : "\310"        Egrave
+<dead_acute> <E>                       : "\311"        Eacute
+<dead_circumflex> <E>                  : "\312"        Ecircumflex
+<dead_diaeresis> <E>                   : "\313"        Ediaeresis
+<dead_grave> <e>                       : "\350"        egrave
+<dead_acute> <e>                       : "\351"        eacute
+<dead_circumflex> <e>                  : "\352"        ecircumflex
+<dead_diaeresis> <e>                   : "\353"        ediaeresis
+<dead_grave> <I>                       : "\314"        Igrave
+<dead_acute> <I>                       : "\315"        Iacute
+<dead_circumflex> <I>                  : "\316"        Icircumflex
+<dead_diaeresis> <I>                   : "\317"        Idiaeresis
+<dead_grave> <i>                       : "\354"        igrave
+<dead_acute> <i>                       : "\355"        iacute
+<dead_circumflex> <i>                  : "\356"        icircumflex
+<dead_diaeresis> <i>                   : "\357"        idiaeresis
+<dead_tilde> <N>                       : "\321"        Ntilde
+<dead_tilde> <n>                       : "\361"        ntilde
+<dead_grave> <O>                       : "\322"        Ograve
+<dead_acute> <O>                       : "\323"        Oacute
+<dead_circumflex> <O>                  : "\324"        Ocircumflex
+<dead_tilde> <O>                       : "\325"        Otilde
+<dead_diaeresis> <O>                   : "\326"        Odiaeresis
+<dead_grave> <o>                       : "\362"        ograve
+<dead_acute> <o>                       : "\363"        oacute
+<dead_circumflex> <o>                  : "\364"        ocircumflex
+<dead_tilde> <o>                       : "\365"        otilde
+<dead_diaeresis> <o>                   : "\366"        odiaeresis
+<dead_grave> <U>                       : "\331"        Ugrave
+<dead_acute> <U>                       : "\332"        Uacute
+<dead_circumflex> <U>                  : "\333"        Ucircumflex
+<dead_doubleacute> <U>                 : "\334"        Udiaeresis
+<dead_diaeresis> <U>                   : "\334"        Udiaeresis
+<dead_grave> <u>                       : "\371"        ugrave
+<dead_acute> <u>                       : "\372"        uacute
+<dead_circumflex> <u>                  : "\373"        ucircumflex
+<dead_doubleacute> <u>                 : "\374"        udiaeresis
+<dead_diaeresis> <u>                   : "\374"        udiaeresis
+<dead_acute> <Y>                       : "\335"        Yacute
+<dead_acute> <y>                       : "\375"        yacute
+<dead_diaeresis> <y>                   : "\377"        ydiaeresis
+XCOMM Useful for portuguese language
+<dead_acute> <C>                       : "\307"        Ccedilla
+<dead_acute> <c>                       : "\347"        ccedilla
+XCOMM
+#ifdef USE_CTRL_SHIFT_T_SEQS
+XCOMM Ctrl<T> Means <Compose>
+XCOMM Special Character
+Ctrl<T> <plus> <plus>                  : "#"   numbersign
+Ctrl<T> <apostrophe> <space>           : "'"   apostrophe
+Ctrl<T> <space> <apostrophe>           : "'"   apostrophe
+Ctrl<T> <A> <T>                                : "@"   at
+Ctrl<T> <parenleft> <parenleft>                : "["   bracketleft
+Ctrl<T> <slash> <slash>                        : "\\"  backslash
+Ctrl<T> <slash> <less>                 : "\\"  backslash
+Ctrl<T> <less> <slash>                 : "\\"  backslash
+Ctrl<T> <parenright> <parenright>      : "]"   bracketright
+Ctrl<T> <asciicircum> <space>          : "^"   asciicircum
+Ctrl<T> <space> <asciicircum>          : "^"   asciicircum
+Ctrl<T> <greater> <space>              : "^"   asciicircum
+Ctrl<T> <space> <greater>              : "^"   asciicircum
+Ctrl<T> <grave> <space>                        : "`"   grave
+Ctrl<T> <space> <grave>                        : "`"   grave
+Ctrl<T> <parenleft> <minus>            : "{"   braceleft
+Ctrl<T> <minus> <parenleft>            : "{"   braceleft
+Ctrl<T> <slash> <asciicircum>          : "|"   bar
+Ctrl<T> <asciicircum> <slash>          : "|"   bar
+Ctrl<T> <V> <L>                                : "|"   bar
+Ctrl<T> <L> <V>                                : "|"   bar
+Ctrl<T> <v> <l>                                : "|"   bar
+Ctrl<T> <l> <v>                                : "|"   bar
+Ctrl<T> <parenright> <minus>           : "}"   braceright
+Ctrl<T> <minus> <parenright>           : "}"   braceright
+Ctrl<T> <asciitilde> <space>           : "~"   asciitilde
+Ctrl<T> <space> <asciitilde>           : "~"   asciitilde
+Ctrl<T> <minus> <space>                        : "~"   asciitilde
+Ctrl<T> <space> <minus>                        : "~"   asciitilde
+Ctrl<T> <exclam> <exclam>              : "\241"        exclamdown
+Ctrl<T> <c> <slash>                    : "\242"        cent
+Ctrl<T> <slash> <c>                    : "\242"        cent
+Ctrl<T> <C> <slash>                    : "\242"        cent
+Ctrl<T> <slash> <C>                    : "\242"        cent
+Ctrl<T> <C> <bar>                      : "\242"        cent
+Ctrl<T> <bar> <C>                      : "\242"        cent
+Ctrl<T> <c> <bar>                      : "\242"        cent
+Ctrl<T> <bar> <c>                      : "\242"        cent
+Ctrl<T> <l> <minus>                    : "\243"        sterling
+Ctrl<T> <minus> <l>                    : "\243"        sterling
+Ctrl<T> <L> <minus>                    : "\243"        sterling
+Ctrl<T> <minus> <L>                    : "\243"        sterling
+Ctrl<T> <l> <equal>                    : "\243"        sterling
+Ctrl<T> <equal> <l>                    : "\243"        sterling
+Ctrl<T> <L> <equal>                    : "\243"        sterling
+Ctrl<T> <equal> <L>                    : "\243"        sterling
+Ctrl<T> <y> <minus>                    : "\245"        yen
+Ctrl<T> <minus> <y>                    : "\245"        yen
+Ctrl<T> <Y> <minus>                    : "\245"        yen
+Ctrl<T> <minus> <Y>                    : "\245"        yen
+Ctrl<T> <y> <equal>                    : "\245"        yen
+Ctrl<T> <equal> <y>                    : "\245"        yen
+Ctrl<T> <Y> <equal>                    : "\245"        yen
+Ctrl<T> <equal> <Y>                    : "\245"        yen
+Ctrl<T> <s> <o>                                : "\247"        section
+Ctrl<T> <o> <s>                                : "\247"        section
+Ctrl<T> <S> <O>                                : "\247"        section
+Ctrl<T> <O> <S>                                : "\247"        section
+Ctrl<T> <S> <exclam>                   : "\247"        section
+Ctrl<T> <exclam> <S>                   : "\247"        section
+Ctrl<T> <s> <exclam>                   : "\247"        section
+Ctrl<T> <exclam> <s>                   : "\247"        section
+Ctrl<T> <S> <0>                                : "\247"        section
+Ctrl<T> <0> <S>                                : "\247"        section
+Ctrl<T> <s> <0>                                : "\247"        section
+Ctrl<T> <0> <s>                                : "\247"        section
+Ctrl<T> <x> <o>                                : "\244"        currency
+Ctrl<T> <o> <x>                                : "\244"        currency
+Ctrl<T> <X> <O>                                : "\244"        currency
+Ctrl<T> <O> <X>                                : "\244"        currency
+Ctrl<T> <x> <O>                                : "\244"        currency
+Ctrl<T> <O> <x>                                : "\244"        currency
+Ctrl<T> <X> <o>                                : "\244"        currency
+Ctrl<T> <o> <X>                                : "\244"        currency
+Ctrl<T> <x> <0>                                : "\244"        currency
+Ctrl<T> <0> <x>                                : "\244"        currency
+Ctrl<T> <X> <0>                                : "\244"        currency
+Ctrl<T> <0> <X>                                : "\244"        currency
+Ctrl<T> <c> <o>                                : "\251"        copyright
+Ctrl<T> <o> <c>                                : "\251"        copyright
+Ctrl<T> <C> <O>                                : "\251"        copyright
+Ctrl<T> <O> <C>                                : "\251"        copyright
+Ctrl<T> <c> <O>                                : "\251"        copyright
+Ctrl<T> <O> <c>                                : "\251"        copyright
+Ctrl<T> <C> <o>                                : "\251"        copyright
+Ctrl<T> <o> <C>                                : "\251"        copyright
+Ctrl<T> <c> <0>                                : "\251"        copyright
+Ctrl<T> <0> <c>                                : "\251"        copyright
+Ctrl<T> <C> <0>                                : "\251"        copyright
+Ctrl<T> <0> <C>                                : "\251"        copyright
+Ctrl<T> <a> <underscore>               : "\252"        ordfeminine
+Ctrl<T> <underscore> <a>               : "\252"        ordfeminine
+Ctrl<T> <A> <underscore>               : "\252"        ordfeminine
+Ctrl<T> <underscore> <A>               : "\252"        ordfeminine
+Ctrl<T> <o> <underscore>               : "\272"        masculine
+Ctrl<T> <underscore> <o>               : "\272"        masculine
+Ctrl<T> <O> <underscore>               : "\272"        masculine
+Ctrl<T> <underscore> <O>               : "\272"        masculine
+Ctrl<T> <less> <less>                  : "\253"        guillemotleft
+Ctrl<T> <greater> <greater>            : "\273"        guillemotright
+Ctrl<T> <0> <asciicircum>              : "\260"        degree
+Ctrl<T> <asciicircum> <0>              : "\260"        degree
+Ctrl<T> <0> <asterisk>                 : "\260"        degree
+Ctrl<T> <asterisk> <0>                 : "\260"        degree
+Ctrl<T> <plus> <minus>                 : "\261"        plusminus
+Ctrl<T> <minus> <plus>                 : "\261"        plusminus
+Ctrl<T> <slash> <u>                    : "\265"        mu
+Ctrl<T> <u> <slash>                    : "\265"        mu
+Ctrl<T> <slash> <U>                    : "\265"        mu
+Ctrl<T> <U> <slash>                    : "\265"        mu
+Ctrl<T> <1> <asciicircum>              : "\271"        onesuperior
+Ctrl<T> <asciicircum> <1>              : "\271"        onesuperior
+Ctrl<T> <S> <1>                                : "\271"        onesuperior
+Ctrl<T> <1> <S>                                : "\271"        onesuperior
+Ctrl<T> <s> <1>                                : "\271"        onesuperior
+Ctrl<T> <1> <s>                                : "\271"        onesuperior
+Ctrl<T> <2> <asciicircum>              : "\262"        twosuperior
+Ctrl<T> <asciicircum> <2>              : "\262"        twosuperior
+Ctrl<T> <S> <2>                                : "\262"        twosuperior
+Ctrl<T> <2> <S>                                : "\262"        twosuperior
+Ctrl<T> <s> <2>                                : "\262"        twosuperior
+Ctrl<T> <2> <s>                                : "\262"        twosuperior
+Ctrl<T> <3> <asciicircum>              : "\263"        threesuperior
+Ctrl<T> <asciicircum> <3>              : "\263"        threesuperior
+Ctrl<T> <S> <3>                                : "\263"        threesuperior
+Ctrl<T> <3> <S>                                : "\263"        threesuperior
+Ctrl<T> <s> <3>                                : "\263"        threesuperior
+Ctrl<T> <3> <s>                                : "\263"        threesuperior
+Ctrl<T> <p> <exclam>                   : "\266"        paragraph
+Ctrl<T> <exclam> <p>                   : "\266"        paragraph
+Ctrl<T> <P> <exclam>                   : "\266"        paragraph
+Ctrl<T> <exclam> <P>                   : "\266"        paragraph
+Ctrl<T> <period> <asciicircum>         : "\267"        periodcentered
+Ctrl<T> <asciicircum> <period>         : "\267"        periodcentered
+Ctrl<T> <period> <period>              : "\267"        periodcentered
+Ctrl<T> <1> <4>                                : "\274"        onequarter
+Ctrl<T> <1> <2>                                : "\275"        onehalf
+Ctrl<T> <3> <4>                                : "\276"        threequarters
+Ctrl<T> <question> <question>          : "\277"        questiondown
+Ctrl<T> <space> <space>                        : "\240"        nobreakspace
+Ctrl<T> <bar> <bar>                    : "\246"        brokenbar
+Ctrl<T> <exclam> <asciicircum>         : "\246"        brokenbar
+Ctrl<T> <asciicircum> <exclam>         : "\246"        brokenbar
+Ctrl<T> <V> <B>                                : "\246"        brokenbar
+Ctrl<T> <B> <V>                                : "\246"        brokenbar
+Ctrl<T> <v> <b>                                : "\246"        brokenbar
+Ctrl<T> <b> <v>                                : "\246"        brokenbar
+Ctrl<T> <minus> <comma>                        : "\254"        notsign
+Ctrl<T> <comma> <minus>                        : "\254"        notsign
+Ctrl<T> <minus> <minus>                        : "\255"        hyphen
+Ctrl<T> <R> <O>                                : "\256"        registered
+Ctrl<T> <O> <R>                                : "\256"        registered
+Ctrl<T> <minus> <asciicircum>          : "\257"        macron
+Ctrl<T> <asciicircum> <minus>          : "\257"        macron
+Ctrl<T> <underscore> <asciicircum>     : "\257"        macron
+Ctrl<T> <asciicircum> <underscore>     : "\257"        macron
+Ctrl<T> <underscore> <underscore>      : "\257"        macron
+Ctrl<T> <minus> <colon>                        : "\367"        division
+Ctrl<T> <colon> <minus>                        : "\367"        division
+Ctrl<T> <x> <x>                                : "\327"        multiply
+Ctrl<T> <apostrophe> <apostrophe>      : "\264"        acute
+Ctrl<T> <comma> <comma>                        : "\270"        cedilla
+Ctrl<T> <quotedbl> <quotedbl>          : "\250"        diaeresis
+XCOMM Accented Alphabet
+Ctrl<T> <A> <grave>                    : "\300"        Agrave
+Ctrl<T> <grave> <A>                    : "\300"        Agrave
+Ctrl<T> <A> <acute>                    : "\301"        Aacute
+Ctrl<T> <acute> <A>                    : "\301"        Aacute
+Ctrl<T> <A> <apostrophe>               : "\301"        Aacute
+Ctrl<T> <apostrophe> <A>               : "\301"        Aacute
+Ctrl<T> <A> <asciicircum>              : "\302"        Acircumflex
+Ctrl<T> <asciicircum> <A>              : "\302"        Acircumflex
+Ctrl<T> <A> <greater>                  : "\302"        Acircumflex
+Ctrl<T> <greater> <A>                  : "\302"        Acircumflex
+Ctrl<T> <A> <asciitilde>               : "\303"        Atilde
+Ctrl<T> <asciitilde> <A>               : "\303"        Atilde
+Ctrl<T> <A> <minus>                    : "\303"        Atilde
+Ctrl<T> <minus> <A>                    : "\303"        Atilde
+Ctrl<T> <A> <quotedbl>                 : "\304"        Adiaeresis
+Ctrl<T> <quotedbl> <A>                 : "\304"        Adiaeresis
+Ctrl<T> <A> <diaeresis>                        : "\304"        Adiaeresis
+Ctrl<T> <diaeresis> <A>                        : "\304"        Adiaeresis
+Ctrl<T> <A> <asterisk>                 : "\305"        Aring
+Ctrl<T> <asterisk> <A>                 : "\305"        Aring
+Ctrl<T> <A> <A>                                : "\305"        Aring
+Ctrl<T> <A> <O>                                : "\305"        Aring
+Ctrl<T> <A> <E>                                : "\306"        AE
+Ctrl<T> <a> <grave>                    : "\340"        agrave
+Ctrl<T> <grave> <a>                    : "\340"        agrave
+Ctrl<T> <a> <acute>                    : "\341"        aacute
+Ctrl<T> <acute> <a>                    : "\341"        aacute
+Ctrl<T> <a> <apostrophe>               : "\341"        aacute
+Ctrl<T> <apostrophe> <a>               : "\341"        aacute
+Ctrl<T> <a> <asciicircum>              : "\342"        acircumflex
+Ctrl<T> <asciicircum> <a>              : "\342"        acircumflex
+Ctrl<T> <a> <greater>                  : "\342"        acircumflex
+Ctrl<T> <greater> <a>                  : "\342"        acircumflex
+Ctrl<T> <a> <asciitilde>               : "\343"        atilde
+Ctrl<T> <asciitilde> <a>               : "\343"        atilde
+Ctrl<T> <a> <minus>                    : "\343"        atilde
+Ctrl<T> <minus> <a>                    : "\343"        atilde
+Ctrl<T> <a> <quotedbl>                 : "\344"        adiaeresis
+Ctrl<T> <quotedbl> <a>                 : "\344"        adiaeresis
+Ctrl<T> <a> <diaeresis>                        : "\344"        adiaeresis
+Ctrl<T> <diaeresis> <a>                        : "\344"        adiaeresis
+Ctrl<T> <a> <asterisk>                 : "\345"        aring
+Ctrl<T> <asterisk> <a>                 : "\345"        aring
+Ctrl<T> <a> <a>                                : "\345"        aring
+Ctrl<T> <a> <o>                                : "\345"        aring
+Ctrl<T> <a> <e>                                : "\346"        ae
+Ctrl<T> <C> <comma>                    : "\307"        Ccedilla
+Ctrl<T> <comma> <C>                    : "\307"        Ccedilla
+Ctrl<T> <c> <comma>                    : "\347"        ccedilla
+Ctrl<T> <comma> <c>                    : "\347"        ccedilla
+Ctrl<T> <minus> <D>                    : "\320"        ETH
+Ctrl<T> <D> <minus>                    : "\320"        ETH
+Ctrl<T> <minus> <d>                    : "\360"        eth
+Ctrl<T> <d> <minus>                    : "\360"        eth
+Ctrl<T> <E> <grave>                    : "\310"        Egrave
+Ctrl<T> <grave> <E>                    : "\310"        Egrave
+Ctrl<T> <E> <acute>                    : "\311"        Eacute
+Ctrl<T> <acute> <E>                    : "\311"        Eacute
+Ctrl<T> <E> <apostrophe>               : "\311"        Eacute
+Ctrl<T> <apostrophe> <E>               : "\311"        Eacute
+Ctrl<T> <E> <asciicircum>              : "\312"        Ecircumflex
+Ctrl<T> <asciicircum> <E>              : "\312"        Ecircumflex
+Ctrl<T> <E> <greater>                  : "\312"        Ecircumflex
+Ctrl<T> <greater> <E>                  : "\312"        Ecircumflex
+Ctrl<T> <E> <quotedbl>                 : "\313"        Ediaeresis
+Ctrl<T> <quotedbl> <E>                 : "\313"        Ediaeresis
+Ctrl<T> <E> <diaeresis>                        : "\313"        Ediaeresis
+Ctrl<T> <diaeresis> <E>                        : "\313"        Ediaeresis
+Ctrl<T> <e> <grave>                    : "\350"        egrave
+Ctrl<T> <grave> <e>                    : "\350"        egrave
+Ctrl<T> <e> <acute>                    : "\351"        eacute
+Ctrl<T> <acute> <e>                    : "\351"        eacute
+Ctrl<T> <e> <apostrophe>               : "\351"        eacute
+Ctrl<T> <apostrophe> <e>               : "\351"        eacute
+Ctrl<T> <e> <asciicircum>              : "\352"        ecircumflex
+Ctrl<T> <asciicircum> <e>              : "\352"        ecircumflex
+Ctrl<T> <e> <greater>                  : "\352"        ecircumflex
+Ctrl<T> <greater> <e>                  : "\352"        ecircumflex
+Ctrl<T> <e> <quotedbl>                 : "\353"        ediaeresis
+Ctrl<T> <quotedbl> <e>                 : "\353"        ediaeresis
+Ctrl<T> <e> <diaeresis>                        : "\353"        ediaeresis
+Ctrl<T> <diaeresis> <e>                        : "\353"        ediaeresis
+Ctrl<T> <I> <grave>                    : "\314"        Igrave
+Ctrl<T> <grave> <I>                    : "\314"        Igrave
+Ctrl<T> <I> <acute>                    : "\315"        Iacute
+Ctrl<T> <acute> <I>                    : "\315"        Iacute
+Ctrl<T> <I> <apostrophe>               : "\315"        Iacute
+Ctrl<T> <apostrophe> <I>               : "\315"        Iacute
+Ctrl<T> <I> <asciicircum>              : "\316"        Icircumflex
+Ctrl<T> <asciicircum> <I>              : "\316"        Icircumflex
+Ctrl<T> <I> <greater>                  : "\316"        Icircumflex
+Ctrl<T> <greater> <I>                  : "\316"        Icircumflex
+Ctrl<T> <I> <quotedbl>                 : "\317"        Idiaeresis
+Ctrl<T> <quotedbl> <I>                 : "\317"        Idiaeresis
+Ctrl<T> <I> <diaeresis>                        : "\317"        Idiaeresis
+Ctrl<T> <diaeresis> <I>                        : "\317"        Idiaeresis
+Ctrl<T> <i> <grave>                    : "\354"        igrave
+Ctrl<T> <grave> <i>                    : "\354"        igrave
+Ctrl<T> <i> <acute>                    : "\355"        iacute
+Ctrl<T> <acute> <i>                    : "\355"        iacute
+Ctrl<T> <i> <apostrophe>               : "\355"        iacute
+Ctrl<T> <apostrophe> <i>               : "\355"        iacute
+Ctrl<T> <i> <asciicircum>              : "\356"        icircumflex
+Ctrl<T> <asciicircum> <i>              : "\356"        icircumflex
+Ctrl<T> <i> <greater>                  : "\356"        icircumflex
+Ctrl<T> <greater> <i>                  : "\356"        icircumflex
+Ctrl<T> <i> <quotedbl>                 : "\357"        idiaeresis
+Ctrl<T> <quotedbl> <i>                 : "\357"        idiaeresis
+Ctrl<T> <i> <diaeresis>                        : "\357"        idiaeresis
+Ctrl<T> <diaeresis> <i>                        : "\357"        idiaeresis
+Ctrl<T> <N> <asciitilde>               : "\321"        Ntilde
+Ctrl<T> <asciitilde> <N>               : "\321"        Ntilde
+Ctrl<T> <N> <minus>                    : "\321"        Ntilde
+Ctrl<T> <minus> <N>                    : "\321"        Ntilde
+Ctrl<T> <n> <asciitilde>               : "\361"        ntilde
+Ctrl<T> <asciitilde> <n>               : "\361"        ntilde
+Ctrl<T> <n> <minus>                    : "\361"        ntilde
+Ctrl<T> <minus> <n>                    : "\361"        ntilde
+Ctrl<T> <O> <grave>                    : "\322"        Ograve
+Ctrl<T> <grave> <O>                    : "\322"        Ograve
+Ctrl<T> <O> <acute>                    : "\323"        Oacute
+Ctrl<T> <acute> <O>                    : "\323"        Oacute
+Ctrl<T> <O> <apostrophe>               : "\323"        Oacute
+Ctrl<T> <apostrophe> <O>               : "\323"        Oacute
+Ctrl<T> <O> <asciicircum>              : "\324"        Ocircumflex
+Ctrl<T> <asciicircum> <O>              : "\324"        Ocircumflex
+Ctrl<T> <O> <greater>                  : "\324"        Ocircumflex
+Ctrl<T> <greater> <O>                  : "\324"        Ocircumflex
+Ctrl<T> <O> <asciitilde>               : "\325"        Otilde
+Ctrl<T> <asciitilde> <O>               : "\325"        Otilde
+Ctrl<T> <O> <minus>                    : "\325"        Otilde
+Ctrl<T> <minus> <O>                    : "\325"        Otilde
+Ctrl<T> <O> <quotedbl>                 : "\326"        Odiaeresis
+Ctrl<T> <quotedbl> <O>                 : "\326"        Odiaeresis
+Ctrl<T> <O> <diaeresis>                        : "\326"        Odiaeresis
+Ctrl<T> <diaeresis> <O>                        : "\326"        Odiaeresis
+Ctrl<T> <O> <slash>                    : "\330"        Ooblique
+Ctrl<T> <slash> <O>                    : "\330"        Ooblique
+Ctrl<T> <o> <grave>                    : "\362"        ograve
+Ctrl<T> <grave> <o>                    : "\362"        ograve
+Ctrl<T> <o> <acute>                    : "\363"        oacute
+Ctrl<T> <acute> <o>                    : "\363"        oacute
+Ctrl<T> <o> <apostrophe>               : "\363"        oacute
+Ctrl<T> <apostrophe> <o>               : "\363"        oacute
+Ctrl<T> <o> <asciicircum>              : "\364"        ocircumflex
+Ctrl<T> <asciicircum> <o>              : "\364"        ocircumflex
+Ctrl<T> <o> <greater>                  : "\364"        ocircumflex
+Ctrl<T> <greater> <o>                  : "\364"        ocircumflex
+Ctrl<T> <o> <asciitilde>               : "\365"        otilde
+Ctrl<T> <asciitilde> <o>               : "\365"        otilde
+Ctrl<T> <o> <minus>                    : "\365"        otilde
+Ctrl<T> <minus> <o>                    : "\365"        otilde
+Ctrl<T> <o> <quotedbl>                 : "\366"        odiaeresis
+Ctrl<T> <quotedbl> <o>                 : "\366"        odiaeresis
+Ctrl<T> <o> <diaeresis>                        : "\366"        odiaeresis
+Ctrl<T> <diaeresis> <o>                        : "\366"        odiaeresis
+Ctrl<T> <o> <slash>                    : "\370"        oslash
+Ctrl<T> <slash> <o>                    : "\370"        oslash
+Ctrl<T> <U> <grave>                    : "\331"        Ugrave
+Ctrl<T> <grave> <U>                    : "\331"        Ugrave
+Ctrl<T> <U> <acute>                    : "\332"        Uacute
+Ctrl<T> <acute> <U>                    : "\332"        Uacute
+Ctrl<T> <U> <apostrophe>               : "\332"        Uacute
+Ctrl<T> <apostrophe> <U>               : "\332"        Uacute
+Ctrl<T> <U> <asciicircum>              : "\333"        Ucircumflex
+Ctrl<T> <asciicircum> <U>              : "\333"        Ucircumflex
+Ctrl<T> <U> <greater>                  : "\333"        Ucircumflex
+Ctrl<T> <greater> <U>                  : "\333"        Ucircumflex
+Ctrl<T> <U> <quotedbl>                 : "\334"        Udiaeresis
+Ctrl<T> <quotedbl> <U>                 : "\334"        Udiaeresis
+Ctrl<T> <U> <diaeresis>                        : "\334"        Udiaeresis
+Ctrl<T> <diaeresis> <U>                        : "\334"        Udiaeresis
+Ctrl<T> <u> <grave>                    : "\371"        ugrave
+Ctrl<T> <grave> <u>                    : "\371"        ugrave
+Ctrl<T> <u> <acute>                    : "\372"        uacute
+Ctrl<T> <acute> <u>                    : "\372"        uacute
+Ctrl<T> <u> <apostrophe>               : "\372"        uacute
+Ctrl<T> <apostrophe> <u>               : "\372"        uacute
+Ctrl<T> <u> <asciicircum>              : "\373"        ucircumflex
+Ctrl<T> <asciicircum> <u>              : "\373"        ucircumflex
+Ctrl<T> <u> <greater>                  : "\373"        ucircumflex
+Ctrl<T> <greater> <u>                  : "\373"        ucircumflex
+Ctrl<T> <u> <quotedbl>                 : "\374"        udiaeresis
+Ctrl<T> <quotedbl> <u>                 : "\374"        udiaeresis
+Ctrl<T> <u> <diaeresis>                        : "\374"        udiaeresis
+Ctrl<T> <diaeresis> <u>                        : "\374"        udiaeresis
+Ctrl<T> <s> <s>                                : "\337"        ssharp
+Ctrl<T> <T> <H>                                : "\336"        THORN
+Ctrl<T> <t> <h>                                : "\376"        thorn
+Ctrl<T> <Y> <acute>                    : "\335"        Yacute
+Ctrl<T> <acute> <Y>                    : "\335"        Yacute
+Ctrl<T> <Y> <apostrophe>               : "\335"        Yacute
+Ctrl<T> <apostrophe> <Y>               : "\335"        Yacute
+Ctrl<T> <y> <acute>                    : "\375"        yacute
+Ctrl<T> <acute> <y>                    : "\375"        yacute
+Ctrl<T> <y> <apostrophe>               : "\375"        yacute
+Ctrl<T> <apostrophe> <y>               : "\375"        yacute
+Ctrl<T> <y> <quotedbl>                 : "\377"        ydiaeresis
+Ctrl<T> <quotedbl> <y>                 : "\377"        ydiaeresis
+Ctrl<T> <y> <diaeresis>                        : "\377"        ydiaeresis
+Ctrl<T> <diaeresis> <y>                        : "\377"        ydiaeresis
+#endif /* USE_CTRL_SHIFT_T_SEQS */
+XCOMM End of Sequence Definition
diff --git a/nls/iso8859-1/XI18N_OBJS b/nls/iso8859-1/XI18N_OBJS
new file mode 100644 (file)
index 0000000..32e4f35
--- /dev/null
@@ -0,0 +1,8 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for euro locales
+#
+XLC    common/xlibi18n _XlcGenericLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM      # XIM_open
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
+
diff --git a/nls/iso8859-1/XLC_LOCALE.pre b/nls/iso8859-1/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..af09009
--- /dev/null
@@ -0,0 +1,71 @@
+XCOMM  XLocale Database Sample for iso8859-1.
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class 
+fs0    {
+       charset {
+               name    ISO8859-1:GL
+       }
+       font    {
+               primary         ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset {
+               name    ISO8859-1:GR
+       }
+       font    {
+               primary ISO8859-1:GR
+       }
+}
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          ISO8859-1
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+force_convert_to_mb    True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     ISO8859-1:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/iso8859-10/Compose.pre b/nls/iso8859-10/Compose.pre
new file mode 100644 (file)
index 0000000..12fa7f6
--- /dev/null
@@ -0,0 +1,14 @@
+XCOMM
+XCOMM ISO 8859-10 Compose Sequence
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM
+XCOMM This file currently has no entries.  It appears that a compose file (even
+XCOMM just an empty one) is required for the appropriate keysyms to work for
+XCOMM this encoding.
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+
+XCOMM End of Sequence Definition
diff --git a/nls/iso8859-10/XI18N_OBJS b/nls/iso8859-10/XI18N_OBJS
new file mode 100644 (file)
index 0000000..7e3b854
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for iso8859-10 locale
+#
+XLC    common/xlcDef   _XlcDefaultLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/iso8859-10/XLC_LOCALE.pre b/nls/iso8859-10/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..a075c38
--- /dev/null
@@ -0,0 +1,72 @@
+XCOMM  XLocale Database Sample for iso8859-4.
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class 
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         ISO8859-10:GL
+               substitute      ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset {
+               name            ISO8859-10:GR
+       }
+       font    {
+               primary         ISO8859-10:GR
+       }
+}
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          ISO8859-10
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+force_convert_to_mb    True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     ISO8859-10:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     ISO8859-10:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/iso8859-11/Compose.pre b/nls/iso8859-11/Compose.pre
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/nls/iso8859-11/XI18N_OBJS b/nls/iso8859-11/XI18N_OBJS
new file mode 100644 (file)
index 0000000..168ccc0
--- /dev/null
@@ -0,0 +1,8 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for iso8859-11 locale
+#
+#
+XLC    common/xlcDef   _XlcDefaultLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/iso8859-11/XLC_LOCALE.pre b/nls/iso8859-11/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..4949e65
--- /dev/null
@@ -0,0 +1,72 @@
+XCOMM  XLocale Database Sample for iso8859-11.
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class 
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         ISO8859-11:GL
+               substitute      ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset {
+               name            ISO8859-11:GR
+       }
+       font    {
+               primary         ISO8859-11:GR
+       }
+}
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          ISO8859-11
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+force_convert_to_mb    True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     ISO8859-11:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     ISO8859-11:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/iso8859-13/Compose.pre b/nls/iso8859-13/Compose.pre
new file mode 100644 (file)
index 0000000..3e02ca9
--- /dev/null
@@ -0,0 +1,432 @@
+XCOMM
+XCOMM ISO 8859-13 (Latin7) Compose Sequence
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+XCOMM Right-hand side (Accented Alphabet)
+XCOMM These compose sequences are pure supposition on my part.
+XCOMM It would be nice to know what the real cultural conventions
+XCOMM are for compose sequences.
+<Multi_key> <plus> <plus>               : "#"   numbersign
+<Multi_key> <apostrophe> <space>        : "'"   apostrophe
+<Multi_key> <space> <apostrophe>        : "'"   apostrophe
+<Multi_key> <A> <T>                     : "@"   at
+<Multi_key> <parenleft> <parenleft>     : "["   bracketleft
+<Multi_key> <slash> <slash>             : "\\"  backslash
+<Multi_key> <slash> <less>              : "\\"  backslash
+<Multi_key> <less> <slash>              : "\\"  backslash
+<Multi_key> <parenright> <parenright>   : "]"   bracketright
+<Multi_key> <asciicircum> <space>       : "^"   asciicircum
+<Multi_key> <space> <asciicircum>       : "^"   asciicircum
+<Multi_key> <greater> <space>           : "^"   asciicircum
+<Multi_key> <space> <greater>           : "^"   asciicircum
+<Multi_key> <grave> <space>             : "`"   grave
+<Multi_key> <space> <grave>             : "`"   grave
+<Multi_key> <less> <apostrophe>         : "`"   grave
+<Multi_key> <apostrophe> <less>         : "`"   grave
+<Multi_key> <parenleft> <minus>         : "{"   braceleft
+<Multi_key> <minus> <parenleft>         : "{"   braceleft
+<Multi_key> <slash> <asciicircum>       : "|"   bar
+<Multi_key> <asciicircum> <slash>       : "|"   bar
+<Multi_key> <parenright> <minus>        : "}"   braceright
+<Multi_key> <minus> <parenright>        : "}"   braceright
+<Multi_key> <asciitilde> <space>        : "~"   asciitilde
+<Multi_key> <space> <asciitilde>        : "~"   asciitilde
+<Multi_key> <minus> <space>             : "~"   asciitilde
+<Multi_key> <space> <minus>             : "~"   asciitilde
+<Multi_key> <greater> <quotedbl>       : "\241"        rightdoublequotemark
+<Multi_key> <quotedbl> <greater>       : "\241"        rightdoublequotemark
+<Multi_key> <greater> <comma>          : "\245"        doublelowquotemark
+<Multi_key> <comma> <greater>          : "\245"        doublelowquotemark
+<Multi_key> <less> <quotedbl>          : "\264"        leftdoublequotemark
+<Multi_key> <quotedbl> <less>          : "\264"        leftdoublequotemark
+<Multi_key> <less> <less>               : "\253"        guillemotleft
+<Multi_key> <greater> <greater>         : "\273"        guillemotright
+<Multi_key> <apostrophe> <apostrophe>  : "\377"        rightsinglequotemark
+<Multi_key> <greater> <apostrophe>     : "\377"        rightsinglequotemark
+<Multi_key> <apostrophe> <greater>     : "\377"        rightsinglequotemark
+<Multi_key> <c> <slash>                 : "\242"        cent
+<Multi_key> <slash> <c>                 : "\242"        cent
+<Multi_key> <C> <slash>                 : "\242"        cent
+<Multi_key> <slash> <C>                 : "\242"        cent
+<Multi_key> <C> <bar>                   : "\242"        cent
+<Multi_key> <bar> <C>                   : "\242"        cent
+<Multi_key> <c> <bar>                   : "\242"        cent
+<Multi_key> <bar> <c>                   : "\242"        cent
+<Multi_key> <l> <equal>                 : "\243"        sterling
+<Multi_key> <equal> <l>                 : "\243"        sterling
+<Multi_key> <L> <equal>                 : "\243"        sterling
+<Multi_key> <equal> <L>                 : "\243"        sterling
+<Multi_key> <c> <o>                     : "\251"        copyright
+<Multi_key> <o> <c>                     : "\251"        copyright
+<Multi_key> <C> <O>                     : "\251"        copyright
+<Multi_key> <O> <C>                     : "\251"        copyright
+<Multi_key> <c> <O>                     : "\251"        copyright
+<Multi_key> <O> <c>                     : "\251"        copyright
+<Multi_key> <C> <o>                     : "\251"        copyright
+<Multi_key> <o> <C>                     : "\251"        copyright
+<Multi_key> <c> <0>                     : "\251"        copyright
+<Multi_key> <0> <c>                     : "\251"        copyright
+<Multi_key> <C> <0>                     : "\251"        copyright
+<Multi_key> <0> <C>                     : "\251"        copyright
+<Multi_key> <parenleft> <c>             : "\251"        copyright
+<Multi_key> <s> <o>                     : "\247"        section
+<Multi_key> <o> <s>                     : "\247"        section
+<Multi_key> <S> <O>                     : "\247"        section
+<Multi_key> <O> <S>                     : "\247"        section
+<Multi_key> <S> <exclam>                : "\247"        section
+<Multi_key> <exclam> <S>                : "\247"        section
+<Multi_key> <s> <exclam>                : "\247"        section
+<Multi_key> <exclam> <s>                : "\247"        section
+<Multi_key> <S> <0>                     : "\247"        section
+<Multi_key> <0> <S>                     : "\247"        section
+<Multi_key> <s> <0>                     : "\247"        section
+<Multi_key> <0> <s>                     : "\247"        section
+<Multi_key> <x> <o>                     : "\244"        currency
+<Multi_key> <o> <x>                     : "\244"        currency
+<Multi_key> <X> <O>                     : "\244"        currency
+<Multi_key> <O> <X>                     : "\244"        currency
+<Multi_key> <x> <O>                     : "\244"        currency
+<Multi_key> <O> <x>                     : "\244"        currency
+<Multi_key> <X> <o>                     : "\244"        currency
+<Multi_key> <o> <X>                     : "\244"        currency
+<Multi_key> <x> <0>                     : "\244"        currency
+<Multi_key> <0> <x>                     : "\244"        currency
+<Multi_key> <X> <0>                     : "\244"        currency
+<Multi_key> <0> <X>                     : "\244"        currency
+<Multi_key> <0> <asciicircum>           : "\260"        degree
+<Multi_key> <asciicircum> <0>           : "\260"        degree
+<Multi_key> <0> <asterisk>              : "\260"        degree
+<Multi_key> <asterisk> <0>              : "\260"        degree
+<Multi_key> <plus> <minus>              : "\261"        plusminus
+<Multi_key> <minus> <plus>              : "\261"        plusminus
+<Multi_key> <m> <u>                    : "\265"        mu
+<Multi_key> <slash> <u>                 : "\265"        mu
+<Multi_key> <u> <slash>                 : "\265"        mu
+<Multi_key> <slash> <U>                 : "\265"        mu
+<Multi_key> <U> <slash>                 : "\265"        mu
+<Multi_key> <1> <asciicircum>           : "\271"        onesuperior
+<Multi_key> <asciicircum> <1>           : "\271"        onesuperior
+<Multi_key> <S> <1>                     : "\271"        onesuperior
+<Multi_key> <1> <S>                     : "\271"        onesuperior
+<Multi_key> <s> <1>                     : "\271"        onesuperior
+<Multi_key> <1> <s>                     : "\271"        onesuperior
+<Multi_key> <2> <asciicircum>           : "\262"        twosuperior
+<Multi_key> <asciicircum> <2>           : "\262"        twosuperior
+<Multi_key> <S> <2>                     : "\262"        twosuperior
+<Multi_key> <2> <S>                     : "\262"        twosuperior
+<Multi_key> <s> <2>                     : "\262"        twosuperior
+<Multi_key> <2> <s>                     : "\262"        twosuperior
+<Multi_key> <3> <asciicircum>           : "\263"        threesuperior
+<Multi_key> <asciicircum> <3>           : "\263"        threesuperior
+<Multi_key> <S> <3>                     : "\263"        threesuperior
+<Multi_key> <3> <S>                     : "\263"        threesuperior
+<Multi_key> <s> <3>                     : "\263"        threesuperior
+<Multi_key> <3> <s>                     : "\263"        threesuperior
+<Multi_key> <p> <exclam>                : "\266"        paragraph
+<Multi_key> <exclam> <p>                : "\266"        paragraph
+<Multi_key> <P> <exclam>                : "\266"        paragraph
+<Multi_key> <exclam> <P>                : "\266"        paragraph
+<Multi_key> <period> <asciicircum>      : "\267"        periodcentered
+<Multi_key> <asciicircum> <period>      : "\267"        periodcentered
+<Multi_key> <period> <period>           : "\267"        periodcentered
+<Multi_key> <1> <4>                     : "\274"        onequarter
+<Multi_key> <1> <2>                     : "\275"        onehalf
+<Multi_key> <3> <4>                     : "\276"        threequarters
+<Multi_key> <question> <question>       : "\277"        questiondown
+<Multi_key> <space> <space>             : "\240"        nobreakspace
+<Multi_key> <bar> <bar>                 : "\246"        brokenbar
+<Multi_key> <exclam> <asciicircum>      : "\246"        brokenbar
+<Multi_key> <asciicircum> <exclam>      : "\246"        brokenbar
+<Multi_key> <V> <B>                     : "\246"        brokenbar
+<Multi_key> <B> <V>                     : "\246"        brokenbar
+<Multi_key> <v> <b>                     : "\246"        brokenbar
+<Multi_key> <b> <v>                     : "\246"        brokenbar
+<Multi_key> <minus> <comma>             : "\254"        notsign
+<Multi_key> <comma> <minus>             : "\254"        notsign
+<Multi_key> <minus> <minus>             : "\255"        hyphen
+<Multi_key> <R> <O>                     : "\256"        registered
+<Multi_key> <O> <R>                     : "\256"        registered
+<Multi_key> <parenleft> <r>             : "\256"        registered
+<Multi_key> <minus> <colon>             : "\367"        division
+<Multi_key> <colon> <minus>             : "\367"        division
+<Multi_key> <x> <x>                     : "\327"        multiply
+XCOMM Accented Alphabet
+<Multi_key> <A> <semicolon>            : "\300"        Aogonek
+<Multi_key> <semicolon> <A>            : "\300"        Aogonek
+<Multi_key> <A> <comma>                        : "\300"        Aogonek
+<Multi_key> <comma> <A>                        : "\300"        Aogonek
+<Multi_key> <R> <comma>                        : "\252"        Rcedilla
+<Multi_key> <R> <cedilla>              : "\252"        Rcedilla
+<Multi_key> <comma> <R>                        : "\252"        Rcedilla
+<Multi_key> <cedilla> <R>              : "\252"        Rcedilla
+<Multi_key> <L> <comma>                        : "\317"        Lcedilla
+<Multi_key> <L> <cedilla>              : "\317"        Lcedilla
+<Multi_key> <comma> <L>                        : "\317"        Lcedilla
+<Multi_key> <cedilla> <L>              : "\317"        Lcedilla
+<Multi_key> <S> <less>                 : "\320"        Scaron
+<Multi_key> <less> <S>                 : "\320"        Scaron
+<Multi_key> <E> <minus>                        : "\307"        Emacron
+<Multi_key> <minus> <E>                        : "\307"        Emacron
+<Multi_key> <E> <underscore>           : "\307"        Emacron
+<Multi_key> <underscore> <E>           : "\307"        Emacron
+<Multi_key> <G> <comma>                        : "\314"        Gcedilla
+<Multi_key> <G> <cedilla>              : "\314"        Gcedilla
+<Multi_key> <comma> <G>                        : "\314"        Gcedilla
+<Multi_key> <cedilla> <G>              : "\314"        Gcedilla
+<Multi_key> <Z> <less>                 : "\336"        Zcaron
+<Multi_key> <less> <Z>                 : "\336"        Zcaron
+<Multi_key> <a> <semicolon>            : "\340"        aogonek
+<Multi_key> <semicolon> <a>            : "\340"        aogonek
+<Multi_key> <a> <comma>                        : "\340"        aogonek
+<Multi_key> <comma> <a>                        : "\340"        aogonek
+<Multi_key> <r> <comma>                        : "\272"        rcedilla
+<Multi_key> <r> <cedilla>              : "\272"        rcedilla
+<Multi_key> <comma> <r>                        : "\272"        rcedilla
+<Multi_key> <cedilla> <r>              : "\272"        rcedilla
+<Multi_key> <l> <comma>                        : "\357"        lcedilla
+<Multi_key> <l> <cedilla>              : "\357"        lcedilla
+<Multi_key> <comma> <l>                        : "\357"        lcedilla
+<Multi_key> <cedilla> <l>              : "\357"        lcedilla
+<Multi_key> <s> <less>                 : "\360"        scaron
+<Multi_key> <less> <s>                 : "\360"        scaron
+<Multi_key> <e> <minus>                        : "\347"        emacron
+<Multi_key> <minus> <e>                        : "\347"        emacron
+<Multi_key> <e> <underscore>           : "\347"        emacron
+<Multi_key> <underscore> <e>           : "\347"        emacron
+<Multi_key> <g> <comma>                        : "\354"        gcedilla
+<Multi_key> <g> <cedilla>              : "\354"        gcedilla
+<Multi_key> <comma> <g>                        : "\354"        gcedilla
+<Multi_key> <cedilla> <g>              : "\354"        gcedilla
+<Multi_key> <z> <less>                 : "\376"        zcaron
+<Multi_key> <less> <z>                 : "\376"        zcaron
+<Multi_key> <A> <underscore>           : "\302"        Amacron
+<Multi_key> <underscore> <A>           : "\302"        Amacron
+<Multi_key> <A> <minus>                        : "\302"        Amacron
+<Multi_key> <minus> <A>                        : "\302"        Amacron
+<Multi_key> <A> <quotedbl>             : "\304"        Adiaeresis
+<Multi_key> <quotedbl> <A>             : "\304"        Adiaeresis
+<Multi_key> <A> <asterisk>             : "\305"        Aring
+<Multi_key> <asterisk> <A>             : "\305"        Aring
+<Multi_key> <A> <A>                    : "\305"        Aring
+<Multi_key> <A> <O>                    : "\305"        Aring
+<Multi_key> <A> <E>                    : "\257"        AE
+<Multi_key> <I> <semicolon>            : "\301"        Iogonek
+<Multi_key> <semicolon> <I>            : "\301"        Iogonek
+<Multi_key> <I> <comma>                        : "\301"        Iogonek
+<Multi_key> <comma> <I>                        : "\301"        Iogonek
+<Multi_key> <C> <less>                 : "\310"        Ccaron
+<Multi_key> <less> <C>                 : "\310"        Ccaron
+<Multi_key> <E> <acute>                        : "\311"        Eacute
+<Multi_key> <acute> <E>                        : "\311"        Eacute
+<Multi_key> <E> <apostrophe>           : "\311"        Eacute
+<Multi_key> <apostrophe> <E>           : "\311"        Eacute
+<Multi_key> <E> <semicolon>            : "\306"        Eogonek
+<Multi_key> <semicolon> <E>            : "\306"        Eogonek
+<Multi_key> <E> <comma>                        : "\306"        Eogonek
+<Multi_key> <comma> <E>                        : "\306"        Eogonek
+<Multi_key> <E> <period>               : "\313"        Eabovedot
+<Multi_key> <period> <E>               : "\313"        Eabovedot
+<Multi_key> <I> <minus>                        : "\316"        Imacron
+<Multi_key> <minus> <I>                        : "\316"        Imacron
+<Multi_key> <I> <underscore>           : "\316"        Imacron
+<Multi_key> <underscore> <I>           : "\316"        Imacron
+<Multi_key> <N> <comma>                        : "\322"        Ncedilla
+<Multi_key> <N> <cedilla>              : "\322"        Ncedilla
+<Multi_key> <comma> <N>                        : "\322"        Ncedilla
+<Multi_key> <cedilla> <N>              : "\322"        Ncedilla
+<Multi_key> <O> <underscore>           : "\324"        Omacron
+<Multi_key> <underscore> <O>           : "\324"        Omacron
+<Multi_key> <O> <minus>                        : "\324"        Omacron
+<Multi_key> <minus> <O>                        : "\324"        Omacron
+<Multi_key> <K> <comma>                        : "\315"        Kcedilla
+<Multi_key> <K> <cedilla>              : "\315"        Kcedilla
+<Multi_key> <comma> <K>                        : "\315"        Kcedilla
+<Multi_key> <cedilla> <K>              : "\315"        Kcedilla
+<Multi_key> <O> <asciitilde>           : "\325"        Otilde
+<Multi_key> <asciitilde> <O>           : "\325"        Otilde
+<Multi_key> <O> <quotedbl>             : "\326"        Odiaeresis
+<Multi_key> <quotedbl> <O>             : "\326"        Odiaeresis
+<Multi_key> <O> <slash>                        : "\250"        Ooblique
+<Multi_key> <slash> <O>                        : "\250"        Ooblique
+<Multi_key> <U> <semicolon>            : "\330"        Uogonek
+<Multi_key> <semicolon> <U>            : "\330"        Uogonek
+<Multi_key> <U> <comma>                        : "\330"        Uogonek
+<Multi_key> <comma> <U>                        : "\330"        Uogonek
+<Multi_key> <U> <quotedbl>             : "\334"        Udiaeresis
+<Multi_key> <quotedbl> <U>             : "\334"        Udiaeresis
+<Multi_key> <U> <underscore>           : "\333"        Umacron
+<Multi_key> <underscore> <U>           : "\333"        Umacron
+<Multi_key> <U> <minus>                        : "\333"        Umacron
+<Multi_key> <minus> <U>                        : "\333"        Umacron
+<Multi_key> <s> <s>                    : "\337"        ssharp
+<Multi_key> <a> <underscore>           : "\342"        amacron
+<Multi_key> <underscore> <a>           : "\342"        amacron
+<Multi_key> <a> <minus>                        : "\342"        amacron
+<Multi_key> <minus> <a>                        : "\342"        amacron
+<Multi_key> <a> <quotedbl>             : "\344"        adiaeresis
+<Multi_key> <quotedbl> <a>             : "\344"        adiaeresis
+<Multi_key> <a> <asterisk>             : "\345"        aring
+<Multi_key> <asterisk> <a>             : "\345"        aring
+<Multi_key> <a> <a>                    : "\345"        aring
+<Multi_key> <a> <o>                    : "\345"        aring
+<Multi_key> <a> <e>                    : "\277"        ae
+<Multi_key> <i> <semicolon>            : "\341"        iogonek
+<Multi_key> <semicolon> <i>            : "\341"        iogonek
+<Multi_key> <i> <comma>                        : "\341"        iogonek
+<Multi_key> <comma> <i>                        : "\341"        iogonek
+<Multi_key> <c> <less>                 : "\350"        ccaron
+<Multi_key> <less> <c>                 : "\350"        ccaron
+<Multi_key> <e> <acute>                        : "\351"        eacute
+<Multi_key> <acute> <e>                        : "\351"        eacute
+<Multi_key> <e> <apostrophe>           : "\351"        eacute
+<Multi_key> <apostrophe> <e>           : "\351"        eacute
+<Multi_key> <e> <semicolon>            : "\346"        eogonek
+<Multi_key> <semicolon> <e>            : "\346"        eogonek
+<Multi_key> <e> <comma>                        : "\346"        eogonek
+<Multi_key> <comma> <e>                        : "\346"        eogonek
+<Multi_key> <e> <period>               : "\353"        eabovedot
+<Multi_key> <period> <e>               : "\353"        eabovedot
+<Multi_key> <i> <minus>                        : "\356"        imacron
+<Multi_key> <minus> <i>                        : "\356"        imacron
+<Multi_key> <i> <underscore>           : "\356"        imacron
+<Multi_key> <underscore> <i>           : "\356"        imacron
+<Multi_key> <n> <comma>                        : "\362"        ncedilla
+<Multi_key> <n> <cedilla>              : "\362"        ncedilla
+<Multi_key> <comma> <n>                        : "\362"        ncedilla
+<Multi_key> <cedilla> <n>              : "\362"        ncedilla
+<Multi_key> <o> <underscore>           : "\364"        omacron
+<Multi_key> <underscore> <o>           : "\364"        omacron
+<Multi_key> <o> <minus>                        : "\364"        omacron
+<Multi_key> <minus> <o>                        : "\364"        omacron
+<Multi_key> <k> <comma>                        : "\355"        kcedilla
+<Multi_key> <k> <cedilla>              : "\355"        kcedilla
+<Multi_key> <comma> <k>                        : "\355"        kcedilla
+<Multi_key> <cedilla> <k>              : "\355"        kcedilla
+<Multi_key> <o> <asciitilde>           : "\365"        otilde
+<Multi_key> <asciitilde> <o>           : "\365"        otilde
+<Multi_key> <o> <quotedbl>             : "\366"        odiaeresis
+<Multi_key> <quotedbl> <o>             : "\366"        odiaeresis
+<Multi_key> <o> <slash>                        : "\270"        ooblique
+<Multi_key> <slash> <o>                        : "\270"        ooblique
+<Multi_key> <u> <semicolon>            : "\370"        uogonek
+<Multi_key> <semicolon> <u>            : "\370"        uogonek
+<Multi_key> <u> <comma>                        : "\370"        uogonek
+<Multi_key> <comma> <u>                        : "\370"        uogonek
+<Multi_key> <u> <quotedbl>             : "\374"        udiaeresis
+<Multi_key> <quotedbl> <u>             : "\374"        udiaeresis
+<Multi_key> <u> <underscore>           : "\373"        umacron
+<Multi_key> <underscore> <u>           : "\373"        umacron
+<Multi_key> <u> <minus>                        : "\373"        umacron
+<Multi_key> <minus> <u>                        : "\373"        umacron
+<Multi_key> <C> <apostrophe>           : "\303"        Cacute
+<Multi_key> <apostrophe> <C>           : "\303"        Cacute
+<Multi_key> <c> <apostrophe>           : "\343"        cacute
+<Multi_key> <apostrophe> <c>           : "\343"        cacute
+<Multi_key> <O> <apostrophe>           : "\323"        Oacute
+<Multi_key> <apostrophe> <O>           : "\323"        Oacute
+<Multi_key> <o> <apostrophe>           : "\363"        oacute
+<Multi_key> <apostrophe> <o>           : "\363"        oacute
+<Multi_key> <Z> <apostrophe>           : "\312"        Zacute
+<Multi_key> <apostrophe> <Z>           : "\312"        Zacute
+<Multi_key> <z> <apostrophe>           : "\352"        zacute
+<Multi_key> <apostrophe> <z>           : "\352"        zacute
+<Multi_key> <N> <apostrophe>           : "\321"        Nacute
+<Multi_key> <apostrophe> <N>           : "\321"        Nacute
+<Multi_key> <n> <apostrophe>           : "\361"        nacute
+<Multi_key> <apostrophe> <n>           : "\361"        nacute
+<Multi_key> <L> <minus>                        : "\331"        Lstroke
+<Multi_key> <minus> <L>                        : "\331"        Lstroke
+<Multi_key> <L> <slash>                        : "\331"        Lstroke
+<Multi_key> <slash> <L>                        : "\331"        Lstroke
+<Multi_key> <l> <minus>                        : "\371"        lstroke
+<Multi_key> <minus> <l>                        : "\371"        lstroke
+<Multi_key> <l> <slash>                        : "\371"        lstroke
+<Multi_key> <slash> <l>                        : "\371"        lstroke
+<Multi_key> <S> <apostrophe>           : "\332"        Sacute
+<Multi_key> <apostrophe> <S>           : "\332"        Sacute
+<Multi_key> <s> <apostrophe>           : "\372"        sacute
+<Multi_key> <apostrophe> <s>           : "\372"        sacute
+<Multi_key> <Z> <period>               : "\335"        Zabovedot
+<Multi_key> <period> <Z>               : "\335"        Zabovedot
+<Multi_key> <z> <period>               : "\375"        zabovedot
+<Multi_key> <period> <z>               : "\375"        zabovedot
+
+<dead_abovedot> <A>                    : "\305"        Aring
+<dead_abovedot> <a>                    : "\345"        aring
+<dead_abovedot> <E>                    : "\313"        Eabovedot
+<dead_abovedot> <e>                    : "\353"        eabovedot
+<dead_abovedot> <Z>                    : "\335"        Zabovedot
+<dead_abovedot> <z>                    : "\375"        zabovedot
+<dead_abovedot> <dead_abovedot>                : "\267"        abovedot
+<dead_abovering> <A>                   : "\305"        Aring
+<dead_abovering> <a>                   : "\345"        aring
+<dead_abovering> <E>                   : "\313"        Eabovedot
+<dead_abovering> <e>                   : "\353"        eabovedot
+<dead_abovering> <Z>                   : "\335"        Zabovedot
+<dead_abovering> <z>                   : "\375"        zabovedot
+<dead_abovering> <ring>                        : "\260"        ring
+<dead_abovering> <dead_abovering>      : "\260"        ring
+<dead_acute> <dead_acute>              : "\377"        rightsinglequotemark
+<dead_acute> <C>                       : "\303"        Cacute
+<dead_acute> <E>                       : "\311"        Eacute
+<dead_acute> <Z>                       : "\312"        Zacute
+<dead_acute> <N>                       : "\321"        Nacute
+<dead_acute> <O>                       : "\323"        Oacute
+<dead_acute> <S>                       : "\332"        Sacute
+<dead_acute> <c>                       : "\343"        cacute
+<dead_acute> <e>                       : "\351"        eacute
+<dead_acute> <z>                       : "\352"        zacute
+<dead_acute> <n>                       : "\361"        nacute
+<dead_acute> <o>                       : "\363"        oacute
+<dead_acute> <s>                       : "\372"        sacute
+<dead_caron> <C>                       : "\310"        Ccaron
+<dead_caron> <S>                       : "\320"        Scaron
+<dead_caron> <Z>                       : "\336"        Zcaron
+<dead_caron> <c>                       : "\350"        ccaron
+<dead_caron> <s>                       : "\360"        scaron
+<dead_caron> <z>                       : "\376"        zcaron
+<dead_cedilla> <R>                     : "\252"        Rcedilla
+<dead_cedilla> <G>                     : "\314"        Gcedilla
+<dead_cedilla> <K>                     : "\315"        Kcedilla
+<dead_cedilla> <L>                     : "\317"        Lcedilla
+<dead_cedilla> <N>                     : "\322"        Ncedilla
+<dead_cedilla> <r>                     : "\272"        rcedilla
+<dead_cedilla> <g>                     : "\354"        gcedilla
+<dead_cedilla> <k>                     : "\355"        kcedilla
+<dead_cedilla> <l>                     : "\357"        lcedilla
+<dead_cedilla> <n>                     : "\362"        ncedilla
+<dead_diaeresis> <A>                   : "\304"        Adiaeresis
+<dead_diaeresis> <O>                   : "\326"        Odiaeresis
+<dead_diaeresis> <U>                   : "\334"        Udiaeresis
+<dead_diaeresis> <a>                   : "\344"        adiaeresis
+<dead_diaeresis> <o>                   : "\366"        odiaeresis
+<dead_diaeresis> <u>                   : "\374"        udiaeresis
+<dead_macron> <A>                      : "\302"        Amacron
+<dead_macron> <E>                      : "\307"        Emacron
+<dead_macron> <I>                      : "\316"        Imacron
+<dead_macron> <O>                      : "\324"        Omacron
+<dead_macron> <U>                      : "\333"        Umacron
+<dead_macron> <a>                      : "\342"        amacron
+<dead_macron> <e>                      : "\347"        emacron
+<dead_macron> <i>                      : "\356"        imacron
+<dead_macron> <o>                      : "\364"        omacron
+<dead_macron> <u>                      : "\373"        umacron
+<dead_macron> <macron>                 : "\255"        macron
+<dead_macron> <dead_macron>            : "\255"        macron
+<dead_ogonek> <A>                      : "\300"        Aogonek
+<dead_ogonek> <I>                      : "\301"        Iogonek
+<dead_ogonek> <E>                      : "\306"        Eogonek
+<dead_ogonek> <U>                      : "\330"        Uogonek
+<dead_ogonek> <a>                      : "\340"        aogonek
+<dead_ogonek> <i>                      : "\341"        iogonek
+<dead_ogonek> <e>                      : "\346"        eogonek
+<dead_ogonek> <u>                      : "\370"        uogonek
+<dead_tilde> <O>                       : "\325"        Otilde
+<dead_tilde> <o>                       : "\365"        otilde
+<dead_tilde> <asciitilde>              : "~"           asciitilde
+<dead_tilde> <dead_tilde>              : "~"           asciitilde
+
+XCOMM End of Sequence Definition
diff --git a/nls/iso8859-13/XI18N_OBJS b/nls/iso8859-13/XI18N_OBJS
new file mode 100644 (file)
index 0000000..f20902a
--- /dev/null
@@ -0,0 +1,8 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for euro locales
+#
+XLC    common/xlibi18n _XlcGenericLoader       # XLC_open
+XIM    common/xiiimp   _XimpLocalOpenIM        # XIM_open
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
+
diff --git a/nls/iso8859-13/XLC_LOCALE.pre b/nls/iso8859-13/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..b127500
--- /dev/null
@@ -0,0 +1,72 @@
+XCOMM  XLocale Database Sample for iso8859-13.
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class 
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         ISO8859-13:GL
+               substitute      ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset {
+               name            ISO8859-13:GR
+       }
+       font    {
+               primary         ISO8859-13:GR
+       }
+}
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          ISO8859-13
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+force_convert_to_mb    True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     ISO8859-13:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     ISO8859-13:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/iso8859-14/Compose.pre b/nls/iso8859-14/Compose.pre
new file mode 100644 (file)
index 0000000..911a1eb
--- /dev/null
@@ -0,0 +1,509 @@
+XCOMM ISO 8859-14 (Latin 8) Compose Sequences
+XCOMM
+XCOMM Original version by Alastair McKinstry, <amck@maths.tcd.ie>
+XCOMM Fixed and tidied up by Seamus O Ciardhuain <seoc@cnds.ucd.ie> (Dec 2002)
+XCOMM
+XCOMM
+XCOMM First part is taken from the Latin-1 definitions,
+XCOMM i.e. characters the same in 8859-1 and 8859-14.
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+<Multi_key> <plus> <plus>              : "#"   numbersign
+<Multi_key> <apostrophe> <space>       : "'"   apostrophe
+<Multi_key> <space> <apostrophe>       : "'"   apostrophe
+<Multi_key> <A> <T>                    : "@"   at
+<Multi_key> <parenleft> <parenleft>    : "["   bracketleft
+<Multi_key> <slash> <slash>            : "\\"  backslash
+<Multi_key> <slash> <less>             : "\\"  backslash
+<Multi_key> <less> <slash>             : "\\"  backslash
+<Multi_key> <parenright> <parenright>  : "]"   bracketright
+<Multi_key> <asciicircum> <space>      : "^"   asciicircum
+<Multi_key> <space> <asciicircum>      : "^"   asciicircum
+<Multi_key> <greater> <space>          : "^"   asciicircum
+<Multi_key> <space> <greater>          : "^"   asciicircum
+<Multi_key> <grave> <space>            : "`"   grave
+<Multi_key> <space> <grave>            : "`"   grave
+<Multi_key> <parenleft> <minus>                : "{"   braceleft
+<Multi_key> <minus> <parenleft>                : "{"   braceleft
+<Multi_key> <slash> <asciicircum>      : "|"   bar
+<Multi_key> <asciicircum> <slash>      : "|"   bar
+<Multi_key> <V> <L>                    : "|"   bar
+<Multi_key> <L> <V>                    : "|"   bar
+<Multi_key> <v> <l>                    : "|"   bar
+<Multi_key> <l> <v>                    : "|"   bar
+<Multi_key> <parenright> <minus>       : "}"   braceright
+<Multi_key> <minus> <parenright>       : "}"   braceright
+<Multi_key> <asciitilde> <space>       : "~"   asciitilde
+<Multi_key> <space> <asciitilde>       : "~"   asciitilde
+<Multi_key> <minus> <space>            : "~"   asciitilde
+<Multi_key> <space> <minus>            : "~"   asciitilde
+<Multi_key> <l> <minus>                        : "\243"        sterling
+<Multi_key> <minus> <l>                        : "\243"        sterling
+<Multi_key> <L> <minus>                        : "\243"        sterling
+<Multi_key> <minus> <L>                        : "\243"        sterling
+<Multi_key> <l> <equal>                        : "\243"        sterling
+<Multi_key> <equal> <l>                        : "\243"        sterling
+<Multi_key> <L> <equal>                        : "\243"        sterling
+<Multi_key> <equal> <L>                        : "\243"        sterling
+<Multi_key> <s> <o>                    : "\247"        section
+<Multi_key> <o> <s>                    : "\247"        section
+<Multi_key> <S> <O>                    : "\247"        section
+<Multi_key> <O> <S>                    : "\247"        section
+<Multi_key> <S> <exclam>               : "\247"        section
+<Multi_key> <exclam> <S>               : "\247"        section
+<Multi_key> <s> <exclam>               : "\247"        section
+<Multi_key> <exclam> <s>               : "\247"        section
+<Multi_key> <S> <0>                    : "\247"        section
+<Multi_key> <0> <S>                    : "\247"        section
+<Multi_key> <s> <0>                    : "\247"        section
+<Multi_key> <0> <s>                    : "\247"        section
+<Multi_key> <c> <o>                    : "\251"        copyright
+<Multi_key> <o> <c>                    : "\251"        copyright
+<Multi_key> <C> <O>                    : "\251"        copyright
+<Multi_key> <O> <C>                    : "\251"        copyright
+<Multi_key> <c> <O>                    : "\251"        copyright
+<Multi_key> <O> <c>                    : "\251"        copyright
+<Multi_key> <C> <o>                    : "\251"        copyright
+<Multi_key> <o> <C>                    : "\251"        copyright
+<Multi_key> <c> <0>                    : "\251"        copyright
+<Multi_key> <0> <c>                    : "\251"        copyright
+<Multi_key> <C> <0>                    : "\251"        copyright
+<Multi_key> <0> <C>                    : "\251"        copyright
+<Multi_key> <p> <exclam>               : "\266"        paragraph
+<Multi_key> <exclam> <p>               : "\266"        paragraph
+<Multi_key> <P> <exclam>               : "\266"        paragraph
+<Multi_key> <exclam> <P>               : "\266"        paragraph
+<Multi_key> <space> <space>            : "\240"        nobreakspace
+<Multi_key> <minus> <minus>            : "\255"        hyphen
+<Multi_key> <R> <O>                    : "\256"        registered
+<Multi_key> <O> <R>                    : "\256"        registered
+<Multi_key> <r> <o>                    : "\256"        registered
+<Multi_key> <o> <r>                    : "\256"        registered
+<Multi_key> <R> <0>                    : "\256"        registered
+<Multi_key> <r> <0>                    : "\256"        registered
+<Multi_key> <0> <R>                    : "\256"        registered
+<Multi_key> <0> <r>                    : "\256"        registered
+
+XCOMM Accented Alphabet
+<Multi_key> <A> <grave>                        : "\300"        Agrave
+<Multi_key> <grave> <A>                        : "\300"        Agrave
+<Multi_key> <A> <acute>                        : "\301"        Aacute
+<Multi_key> <acute> <A>                        : "\301"        Aacute
+<Multi_key> <A> <apostrophe>           : "\301"        Aacute
+<Multi_key> <apostrophe> <A>           : "\301"        Aacute
+<Multi_key> <A> <asciicircum>          : "\302"        Acircumflex
+<Multi_key> <asciicircum> <A>          : "\302"        Acircumflex
+<Multi_key> <A> <greater>              : "\302"        Acircumflex
+<Multi_key> <greater> <A>              : "\302"        Acircumflex
+<Multi_key> <A> <asciitilde>           : "\303"        Atilde
+<Multi_key> <asciitilde> <A>           : "\303"        Atilde
+<Multi_key> <A> <minus>                        : "\303"        Atilde
+<Multi_key> <minus> <A>                        : "\303"        Atilde
+<Multi_key> <A> <quotedbl>             : "\304"        Adiaeresis
+<Multi_key> <quotedbl> <A>             : "\304"        Adiaeresis
+<Multi_key> <A> <diaeresis>            : "\304"        Adiaeresis
+<Multi_key> <diaeresis> <A>            : "\304"        Adiaeresis
+<Multi_key> <A> <asterisk>             : "\305"        Aring
+<Multi_key> <asterisk> <A>             : "\305"        Aring
+<Multi_key> <A> <E>                    : "\306"        AE
+<Multi_key> <a> <grave>                        : "\340"        agrave
+<Multi_key> <grave> <a>                        : "\340"        agrave
+<Multi_key> <a> <acute>                        : "\341"        aacute
+<Multi_key> <acute> <a>                        : "\341"        aacute
+<Multi_key> <a> <apostrophe>           : "\341"        aacute
+<Multi_key> <apostrophe> <a>           : "\341"        aacute
+<Multi_key> <a> <asciicircum>          : "\342"        acircumflex
+<Multi_key> <asciicircum> <a>          : "\342"        acircumflex
+<Multi_key> <a> <greater>              : "\342"        acircumflex
+<Multi_key> <greater> <a>              : "\342"        acircumflex
+<Multi_key> <a> <asciitilde>           : "\343"        atilde
+<Multi_key> <asciitilde> <a>           : "\343"        atilde
+<Multi_key> <a> <minus>                        : "\343"        atilde
+<Multi_key> <minus> <a>                        : "\343"        atilde
+<Multi_key> <a> <quotedbl>             : "\344"        adiaeresis
+<Multi_key> <quotedbl> <a>             : "\344"        adiaeresis
+<Multi_key> <a> <diaeresis>            : "\344"        adiaeresis
+<Multi_key> <diaeresis> <a>            : "\344"        adiaeresis
+<Multi_key> <a> <asterisk>             : "\345"        aring
+<Multi_key> <asterisk> <a>             : "\345"        aring
+<Multi_key> <a> <e>                    : "\346"        ae
+<Multi_key> <C> <comma>                        : "\307"        Ccedilla
+<Multi_key> <C> <cedilla>              : "\307"        Ccedilla
+<Multi_key> <comma> <C>                        : "\307"        Ccedilla
+<Multi_key> <cedilla> <C>              : "\307"        Ccedilla
+<Multi_key> <c> <comma>                        : "\347"        ccedilla
+<Multi_key> <c> <cedilla>              : "\347"        ccedilla
+<Multi_key> <comma> <c>                        : "\347"        ccedilla
+<Multi_key> <cedilla> <c>              : "\347"        ccedilla
+<Multi_key> <E> <grave>                        : "\310"        Egrave
+<Multi_key> <grave> <E>                        : "\310"        Egrave
+<Multi_key> <E> <acute>                        : "\311"        Eacute
+<Multi_key> <acute> <E>                        : "\311"        Eacute
+<Multi_key> <E> <apostrophe>           : "\311"        Eacute
+<Multi_key> <apostrophe> <E>           : "\311"        Eacute
+<Multi_key> <E> <asciicircum>          : "\312"        Ecircumflex
+<Multi_key> <asciicircum> <E>          : "\312"        Ecircumflex
+<Multi_key> <E> <greater>              : "\312"        Ecircumflex
+<Multi_key> <greater> <E>              : "\312"        Ecircumflex
+<Multi_key> <E> <quotedbl>             : "\313"        Ediaeresis
+<Multi_key> <quotedbl> <E>             : "\313"        Ediaeresis
+<Multi_key> <E> <diaeresis>            : "\313"        Ediaeresis
+<Multi_key> <diaeresis> <E>            : "\313"        Ediaeresis
+<Multi_key> <e> <grave>                        : "\350"        egrave
+<Multi_key> <grave> <e>                        : "\350"        egrave
+<Multi_key> <e> <acute>                        : "\351"        eacute
+<Multi_key> <acute> <e>                        : "\351"        eacute
+<Multi_key> <e> <apostrophe>           : "\351"        eacute
+<Multi_key> <apostrophe> <e>           : "\351"        eacute
+<Multi_key> <e> <asciicircum>          : "\352"        ecircumflex
+<Multi_key> <asciicircum> <e>          : "\352"        ecircumflex
+<Multi_key> <e> <greater>              : "\352"        ecircumflex
+<Multi_key> <greater> <e>              : "\352"        ecircumflex
+<Multi_key> <e> <quotedbl>             : "\353"        ediaeresis
+<Multi_key> <quotedbl> <e>             : "\353"        ediaeresis
+<Multi_key> <e> <diaeresis>            : "\353"        ediaeresis
+<Multi_key> <diaeresis> <e>            : "\353"        ediaeresis
+<Multi_key> <I> <grave>                        : "\314"        Igrave
+<Multi_key> <grave> <I>                        : "\314"        Igrave
+<Multi_key> <I> <acute>                        : "\315"        Iacute
+<Multi_key> <acute> <I>                        : "\315"        Iacute
+<Multi_key> <I> <apostrophe>           : "\315"        Iacute
+<Multi_key> <apostrophe> <I>           : "\315"        Iacute
+<Multi_key> <I> <asciicircum>          : "\316"        Icircumflex
+<Multi_key> <asciicircum> <I>          : "\316"        Icircumflex
+<Multi_key> <I> <greater>              : "\316"        Icircumflex
+<Multi_key> <greater> <I>              : "\316"        Icircumflex
+<Multi_key> <I> <quotedbl>             : "\317"        Idiaeresis
+<Multi_key> <quotedbl> <I>             : "\317"        Idiaeresis
+<Multi_key> <I> <diaeresis>            : "\317"        Idiaeresis
+<Multi_key> <diaeresis> <I>            : "\317"        Idiaeresis
+<Multi_key> <i> <grave>                        : "\354"        igrave
+<Multi_key> <grave> <i>                        : "\354"        igrave
+<Multi_key> <i> <acute>                        : "\355"        iacute
+<Multi_key> <acute> <i>                        : "\355"        iacute
+<Multi_key> <i> <apostrophe>           : "\355"        iacute
+<Multi_key> <apostrophe> <i>           : "\355"        iacute
+<Multi_key> <i> <asciicircum>          : "\356"        icircumflex
+<Multi_key> <asciicircum> <i>          : "\356"        icircumflex
+<Multi_key> <i> <greater>              : "\356"        icircumflex
+<Multi_key> <greater> <i>              : "\356"        icircumflex
+<Multi_key> <i> <quotedbl>             : "\357"        idiaeresis
+<Multi_key> <quotedbl> <i>             : "\357"        idiaeresis
+<Multi_key> <i> <diaeresis>            : "\357"        idiaeresis
+<Multi_key> <diaeresis> <i>            : "\357"        idiaeresis
+<Multi_key> <N> <asciitilde>           : "\321"        Ntilde
+<Multi_key> <asciitilde> <N>           : "\321"        Ntilde
+<Multi_key> <N> <minus>                        : "\321"        Ntilde
+<Multi_key> <minus> <N>                        : "\321"        Ntilde
+<Multi_key> <n> <asciitilde>           : "\361"        ntilde
+<Multi_key> <asciitilde> <n>           : "\361"        ntilde
+<Multi_key> <n> <minus>                        : "\361"        ntilde
+<Multi_key> <minus> <n>                        : "\361"        ntilde
+<Multi_key> <O> <grave>                        : "\322"        Ograve
+<Multi_key> <grave> <O>                        : "\322"        Ograve
+<Multi_key> <O> <acute>                        : "\323"        Oacute
+<Multi_key> <acute> <O>                        : "\323"        Oacute
+<Multi_key> <O> <apostrophe>           : "\323"        Oacute
+<Multi_key> <apostrophe> <O>           : "\323"        Oacute
+<Multi_key> <O> <asciicircum>          : "\324"        Ocircumflex
+<Multi_key> <asciicircum> <O>          : "\324"        Ocircumflex
+<Multi_key> <O> <greater>              : "\324"        Ocircumflex
+<Multi_key> <greater> <O>              : "\324"        Ocircumflex
+<Multi_key> <O> <asciitilde>           : "\325"        Otilde
+<Multi_key> <asciitilde> <O>           : "\325"        Otilde
+<Multi_key> <O> <minus>                        : "\325"        Otilde
+<Multi_key> <minus> <O>                        : "\325"        Otilde
+<Multi_key> <O> <quotedbl>             : "\326"        Odiaeresis
+<Multi_key> <quotedbl> <O>             : "\326"        Odiaeresis
+<Multi_key> <O> <diaeresis>            : "\326"        Odiaeresis
+<Multi_key> <diaeresis> <O>            : "\326"        Odiaeresis
+<Multi_key> <O> <slash>                        : "\330"        Ooblique
+<Multi_key> <slash> <O>                        : "\330"        Ooblique
+<Multi_key> <o> <grave>                        : "\362"        ograve
+<Multi_key> <grave> <o>                        : "\362"        ograve
+<Multi_key> <o> <acute>                        : "\363"        oacute
+<Multi_key> <acute> <o>                        : "\363"        oacute
+<Multi_key> <o> <apostrophe>           : "\363"        oacute
+<Multi_key> <apostrophe> <o>           : "\363"        oacute
+<Multi_key> <o> <asciicircum>          : "\364"        ocircumflex
+<Multi_key> <asciicircum> <o>          : "\364"        ocircumflex
+<Multi_key> <o> <greater>              : "\364"        ocircumflex
+<Multi_key> <greater> <o>              : "\364"        ocircumflex
+<Multi_key> <o> <asciitilde>           : "\365"        otilde
+<Multi_key> <asciitilde> <o>           : "\365"        otilde
+<Multi_key> <o> <minus>                        : "\365"        otilde
+<Multi_key> <minus> <o>                        : "\365"        otilde
+<Multi_key> <o> <quotedbl>             : "\366"        odiaeresis
+<Multi_key> <quotedbl> <o>             : "\366"        odiaeresis
+<Multi_key> <o> <diaeresis>            : "\366"        odiaeresis
+<Multi_key> <diaeresis> <o>            : "\366"        odiaeresis
+<Multi_key> <o> <slash>                        : "\370"        oslash
+<Multi_key> <slash> <o>                        : "\370"        oslash
+<Multi_key> <U> <grave>                        : "\331"        Ugrave
+<Multi_key> <grave> <U>                        : "\331"        Ugrave
+<Multi_key> <U> <acute>                        : "\332"        Uacute
+<Multi_key> <acute> <U>                        : "\332"        Uacute
+<Multi_key> <U> <apostrophe>           : "\332"        Uacute
+<Multi_key> <apostrophe> <U>           : "\332"        Uacute
+<Multi_key> <U> <asciicircum>          : "\333"        Ucircumflex
+<Multi_key> <asciicircum> <U>          : "\333"        Ucircumflex
+<Multi_key> <U> <greater>              : "\333"        Ucircumflex
+<Multi_key> <greater> <U>              : "\333"        Ucircumflex
+<Multi_key> <U> <quotedbl>             : "\334"        Udiaeresis
+<Multi_key> <quotedbl> <U>             : "\334"        Udiaeresis
+<Multi_key> <U> <diaeresis>            : "\334"        Udiaeresis
+<Multi_key> <diaeresis> <U>            : "\334"        Udiaeresis
+<Multi_key> <u> <grave>                        : "\371"        ugrave
+<Multi_key> <grave> <u>                        : "\371"        ugrave
+<Multi_key> <u> <acute>                        : "\372"        uacute
+<Multi_key> <acute> <u>                        : "\372"        uacute
+<Multi_key> <u> <apostrophe>           : "\372"        uacute
+<Multi_key> <apostrophe> <u>           : "\372"        uacute
+<Multi_key> <u> <asciicircum>          : "\373"        ucircumflex
+<Multi_key> <asciicircum> <u>          : "\373"        ucircumflex
+<Multi_key> <u> <greater>              : "\373"        ucircumflex
+<Multi_key> <greater> <u>              : "\373"        ucircumflex
+<Multi_key> <u> <quotedbl>             : "\374"        udiaeresis
+<Multi_key> <quotedbl> <u>             : "\374"        udiaeresis
+<Multi_key> <u> <diaeresis>            : "\374"        udiaeresis
+<Multi_key> <diaeresis> <u>            : "\374"        udiaeresis
+<Multi_key> <s> <s>                    : "\337"        ssharp
+<Multi_key> <Y> <acute>                        : "\335"        Yacute
+<Multi_key> <acute> <Y>                        : "\335"        Yacute
+<Multi_key> <Y> <apostrophe>           : "\335"        Yacute
+<Multi_key> <apostrophe> <Y>           : "\335"        Yacute
+<Multi_key> <y> <acute>                        : "\375"        yacute
+<Multi_key> <acute> <y>                        : "\375"        yacute
+<Multi_key> <y> <apostrophe>           : "\375"        yacute
+<Multi_key> <apostrophe> <y>           : "\375"        yacute
+<Multi_key> <y> <quotedbl>             : "\377"        ydiaeresis
+<Multi_key> <quotedbl> <y>             : "\377"        ydiaeresis
+<Multi_key> <y> <diaeresis>            : "\377"        ydiaeresis
+<Multi_key> <diaeresis> <y>            : "\377"        ydiaeresis
+
+XCOMM
+XCOMM dead key accent keysyms
+XCOMM Special Character
+<dead_circumflex>  <slash>             : "|"   bar
+<dead_grave> <space>                   : "`"   grave
+<dead_acute> <space>                   : "'"   apostrophe
+<dead_circumflex> <space>              : "^"   asciicircum
+<dead_tilde> <space>                   : "~"   asciitilde
+
+XCOMM Accented Alphabet
+<dead_grave> <A>                       : "\300"        Agrave
+<dead_acute> <A>                       : "\301"        Aacute
+<dead_circumflex> <A>                  : "\302"        Acircumflex
+<dead_tilde> <A>                       : "\303"        Atilde
+<dead_diaeresis> <A>                   : "\304"        Adiaeresis
+<dead_grave> <a>                       : "\340"        agrave
+<dead_acute> <a>                       : "\341"        aacute
+<dead_circumflex> <a>                  : "\342"        acircumflex
+<dead_tilde> <a>                       : "\343"        atilde
+<dead_diaeresis> <a>                   : "\344"        adiaeresis
+<dead_cedilla> <C>                     : "\307"        Ccedilla
+<dead_cedilla> <c>                     : "\347"        ccedilla
+<dead_grave> <E>                       : "\310"        Egrave
+<dead_acute> <E>                       : "\311"        Eacute
+<dead_circumflex> <E>                  : "\312"        Ecircumflex
+<dead_diaeresis> <E>                   : "\313"        Ediaeresis
+<dead_grave> <e>                       : "\350"        egrave
+<dead_acute> <e>                       : "\351"        eacute
+<dead_circumflex> <e>                  : "\352"        ecircumflex
+<dead_diaeresis> <e>                   : "\353"        ediaeresis
+<dead_grave> <I>                       : "\314"        Igrave
+<dead_acute> <I>                       : "\315"        Iacute
+<dead_circumflex> <I>                  : "\316"        Icircumflex
+<dead_diaeresis> <I>                   : "\317"        Idiaeresis
+<dead_grave> <i>                       : "\354"        igrave
+<dead_acute> <i>                       : "\355"        iacute
+<dead_circumflex> <i>                  : "\356"        icircumflex
+<dead_diaeresis> <i>                   : "\357"        idiaeresis
+<dead_tilde> <N>                       : "\321"        Ntilde
+<dead_tilde> <n>                       : "\361"        ntilde
+<dead_grave> <O>                       : "\322"        Ograve
+<dead_acute> <O>                       : "\323"        Oacute
+<dead_circumflex> <O>                  : "\324"        Ocircumflex
+<dead_tilde> <O>                       : "\325"        Otilde
+<dead_diaeresis> <O>                   : "\326"        Odiaeresis
+<dead_grave> <o>                       : "\362"        ograve
+<dead_acute> <o>                       : "\363"        oacute
+<dead_circumflex> <o>                  : "\364"        ocircumflex
+<dead_tilde> <o>                       : "\365"        otilde
+<dead_diaeresis> <o>                   : "\366"        odiaeresis
+<dead_grave> <U>                       : "\331"        Ugrave
+<dead_acute> <U>                       : "\332"        Uacute
+<dead_circumflex> <U>                  : "\333"        Ucircumflex
+<dead_diaeresis> <U>                   : "\334"        Udiaeresis
+<dead_grave> <u>                       : "\371"        ugrave
+<dead_acute> <u>                       : "\372"        uacute
+<dead_circumflex> <u>                  : "\373"        ucircumflex
+<dead_diaeresis> <u>                   : "\374"        udiaeresis
+<dead_acute> <Y>                       : "\335"        Yacute
+<dead_acute> <y>                       : "\375"        yacute
+<dead_diaeresis> <y>                   : "\377"        ydiaeresis
+
+
+XCOMM The following is Celtic character support,
+XCOMM i.e. the characters in 8859-14 which differ from 8859-1.
+
+<Multi_key> <period> <b>               : "\242"        babovedot
+<Multi_key> <period> <B>               : "\241"        Babovedot
+<Multi_key> <period> <c>               : "\245"        cabovedot
+<Multi_key> <period> <C>               : "\245"        Cabovedot
+<Multi_key> <period> <d>               : "\253"        dabovedot
+<Multi_key> <period> <D>               : "\246"        Dabovedot
+<Multi_key> <period> <f>               : "\261"        fabovedot
+<Multi_key> <period> <F>               : "\260"        Fabovedot
+<Multi_key> <period> <g>               : "\263"        gabovedot
+<Multi_key> <period> <G>               : "\262"        Gabovedot
+<Multi_key> <period> <m>               : "\265"        mabovedot
+<Multi_key> <period> <M>               : "\264"        Mabovedot
+<Multi_key> <period> <p>               : "\271"        pabovedot
+<Multi_key> <period> <P>               : "\267"        Pabovedot
+<Multi_key> <period> <s>               : "\277"        sabovedot
+<Multi_key> <period> <S>               : "\273"        Sabovedot
+<Multi_key> <period> <t>               : "\367"        tabovedot
+<Multi_key> <period> <T>               : "\327"        Tabovedot
+
+<Multi_key> <b> <period>               : "\242"        babovedot
+<Multi_key> <B> <period>               : "\241"        Babovedot
+<Multi_key> <c> <period>               : "\245"        cabovedot
+<Multi_key> <C> <period>               : "\245"        Cabovedot
+<Multi_key> <d> <period>               : "\253"        dabovedot
+<Multi_key> <D> <period>               : "\246"        Dabovedot
+<Multi_key> <f> <period>               : "\261"        fabovedot
+<Multi_key> <F> <period>               : "\260"        Fabovedot
+<Multi_key> <g> <period>               : "\263"        gabovedot
+<Multi_key> <G> <period>               : "\262"        Gabovedot
+<Multi_key> <m> <period>               : "\265"        mabovedot
+<Multi_key> <M> <period>               : "\264"        Mabovedot
+<Multi_key> <p> <period>               : "\271"        pabovedot
+<Multi_key> <P> <period>               : "\267"        Pabovedot
+<Multi_key> <s> <period>               : "\277"        sabovedot
+<Multi_key> <S> <period>               : "\273"        Sabovedot
+<Multi_key> <t> <period>               : "\367"        tabovedot
+<Multi_key> <T> <period>               : "\327"        Tabovedot
+
+<Multi_key> <y> <asciicircum>          : "\376"        ycircumflex
+<Multi_key> <asciicircum> <y>          : "\376"        ycircumflex
+<Multi_key> <Y> <asciicircum>          : "\336"        Ycircumflex
+<Multi_key> <asciicircum> <Y>          : "\336"        Ycircumflex
+
+<Multi_key> <w> <asciicircum>          : "\360"        wcircumflex
+<Multi_key> <asciicircum> <w>          : "\360"        wcircumflex
+<Multi_key> <W> <asciicircum>          : "\320"        Wcircumflex
+<Multi_key> <asciicircum> <W>          : "\320"        Wcircumflex
+
+<Multi_key> <Y> <quotedbl>             : "\257"        Ydiaeresis
+<Multi_key> <quotedbl> <Y>             : "\257"        Ydiaeresis
+<Multi_key> <Y> <diaeresis>            : "\257"        Ydiaeresis
+<Multi_key> <diaeresis> <Y>            : "\257"        Ydiaeresis
+
+<Multi_key> <W> <quotedbl>             : "\275"        Wdiaeresis
+<Multi_key> <quotedbl> <W>             : "\275"        Wdiaeresis
+<Multi_key> <W> <diaeresis>            : "\275"        Wdiaeresis
+<Multi_key> <diaeresis> <W>            : "\275"        Wdiaeresis
+<Multi_key> <w> <quotedbl>             : "\276"        wdiaeresis
+<Multi_key> <quotedbl> <w>             : "\276"        wdiaeresis
+<Multi_key> <w> <diaeresis>            : "\276"        wdiaeresis
+<Multi_key> <diaeresis> <w>            : "\276"        wdiaeresis
+
+<Multi_key> <Y> <grave>                        : "\254"        Ygrave
+<Multi_key> <grave> <Y>                        : "\254"        Ygrave
+<Multi_key> <y> <grave>                        : "\274"        ygrave
+<Multi_key> <grave> <y>                        : "\274"        ygrave
+
+<Multi_key> <W> <grave>                        : "\250"        Wgrave
+<Multi_key> <grave> <W>                        : "\250"        Wgrave
+<Multi_key> <w> <grave>                        : "\270"        wgrave
+<Multi_key> <grave> <w>                        : "\270"        wgrave
+
+<Multi_key> <W> <apostrophe>           : "\252"        Wacute
+<Multi_key> <apostrophe> <W>           : "\252"        Wacute
+<Multi_key> <W> <acute>                        : "\252"        Wacute
+<Multi_key> <acute> <W>                        : "\252"        Wacute
+<Multi_key> <w> <apostrophe>           : "\272"        wacute
+<Multi_key> <apostrophe> <w>           : "\272"        wacute
+<Multi_key> <w> <acute>                        : "\272"        wacute
+<Multi_key> <acute> <w>                        : "\272"        wacute
+
+<dead_abovedot> <b>                    : "\242"        babovedot
+<dead_abovedot> <B>                    : "\241"        Babovedot
+<dead_abovedot> <c>                    : "\245"        cabovedot
+<dead_abovedot> <C>                    : "\245"        Cabovedot
+<dead_abovedot> <d>                    : "\253"        dabovedot
+<dead_abovedot> <D>                    : "\246"        Dabovedot
+<dead_abovedot> <f>                    : "\261"        fabovedot
+<dead_abovedot> <F>                    : "\260"        Fabovedot
+<dead_abovedot> <g>                    : "\263"        gabovedot
+<dead_abovedot> <G>                    : "\262"        Gabovedot
+<dead_abovedot> <m>                    : "\265"        mabovedot
+<dead_abovedot> <M>                    : "\264"        Mabovedot
+<dead_abovedot> <p>                    : "\271"        pabovedot
+<dead_abovedot> <P>                    : "\267"        Pabovedot
+<dead_abovedot> <s>                    : "\277"        sabovedot
+<dead_abovedot> <S>                    : "\273"        Sabovedot
+<dead_abovedot> <t>                    : "\367"        tabovedot
+<dead_abovedot> <T>                    : "\327"        Tabovedot
+
+<dead_circumflex>  <b>                 : "\242"        babovedot
+<dead_circumflex>  <B>                 : "\241"        Babovedot
+<dead_circumflex>  <c>                 : "\245"        cabovedot
+<dead_circumflex>  <C>                 : "\245"        Cabovedot
+<dead_circumflex>  <d>                 : "\253"        dabovedot
+<dead_circumflex>  <D>                 : "\246"        Dabovedot
+<dead_circumflex>  <f>                 : "\261"        fabovedot
+<dead_circumflex>  <F>                 : "\260"        Fabovedot
+<dead_circumflex>  <g>                 : "\263"        gabovedot
+<dead_circumflex>  <G>                 : "\262"        Gabovedot
+<dead_circumflex>  <m>                 : "\265"        mabovedot
+<dead_circumflex>  <M>                 : "\264"        Mabovedot
+<dead_circumflex>  <p>                 : "\271"        pabovedot
+<dead_circumflex>  <P>                 : "\267"        Pabovedot
+<dead_circumflex>  <s>                 : "\277"        sabovedot
+<dead_circumflex>  <S>                 : "\273"        Sabovedot
+<dead_circumflex>  <t>                 : "\367"        tabovedot
+<dead_circumflex>  <T>                 : "\327"        Tabovedot
+
+<dead_acute>  <b>                      : "\242"        babovedot
+<dead_acute>  <B>                      : "\241"        Babovedot
+<dead_acute>  <c>                      : "\245"        cabovedot
+<dead_acute>  <C>                      : "\245"        Cabovedot
+<dead_acute>  <d>                      : "\253"        dabovedot
+<dead_acute>  <D>                      : "\246"        Dabovedot
+<dead_acute>  <f>                      : "\261"        fabovedot
+<dead_acute>  <F>                      : "\260"        Fabovedot
+<dead_acute>  <g>                      : "\263"        gabovedot
+<dead_acute>  <G>                      : "\262"        Gabovedot
+<dead_acute>  <m>                      : "\265"        mabovedot
+<dead_acute>  <M>                      : "\264"        Mabovedot
+<dead_acute>  <p>                      : "\271"        pabovedot
+<dead_acute>  <P>                      : "\267"        Pabovedot
+<dead_acute>  <s>                      : "\277"        sabovedot
+<dead_acute>  <S>                      : "\273"        Sabovedot
+<dead_acute>  <t>                      : "\367"        tabovedot
+<dead_acute>  <T>                      : "\327"        Tabovedot
+
+<dead_diaeresis> <Y>                   : "\257"        Ydiaeresis
+
+<dead_grave> <Y>                       : "\254"        Ygrave
+<dead_grave> <y>                       : "\274"        ygrave
+
+<dead_circumflex> <y>                  : "\376"        ycircumflex
+<dead_circumflex> <Y>                  : "\336"        Ycircumflex
+
+<dead_circumflex> <w>                  : "\360"        wcircumflex
+<dead_circumflex> <W>                  : "\320"        Wcircumflex
+
+<dead_diaeresis> <w>                   : "\276"        wdiaeresis
+<dead_diaeresis> <W>                   : "\275"        Wdiaeresis
+
+<dead_acute> <w>                       : "\272"        wacute
+<dead_acute> <W>                       : "\252"        Wacute
+
+<dead_grave> <W>                       : "\250"        Wgrave
+<dead_grave> <w>                       : "\270"        wgrave
+
+XCOMM End of Sequence Definition
diff --git a/nls/iso8859-14/XI18N_OBJS b/nls/iso8859-14/XI18N_OBJS
new file mode 100644 (file)
index 0000000..ebd00a6
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for iso8859-14 locale
+#
+XLC    common/xlcDef   _XlcDefaultLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/iso8859-14/XLC_LOCALE.pre b/nls/iso8859-14/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..287f757
--- /dev/null
@@ -0,0 +1,72 @@
+XCOMM  XLocale Database Sample for iso8859-14.
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class 
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         ISO8859-14:GL
+               substitute      ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset {
+               name            ISO8859-14:GR
+       }
+       font    {
+               primary         ISO8859-14:GR
+       }
+}
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          ISO8859-14
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+force_convert_to_mb    True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     ISO8859-14:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     ISO8859-14:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/iso8859-15/Compose.pre b/nls/iso8859-15/Compose.pre
new file mode 100644 (file)
index 0000000..ec75cfe
--- /dev/null
@@ -0,0 +1,476 @@
+XCOMM
+XCOMM ISO 8859-15 (Latin1) Compose Sequence
+XCOMM
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+<Multi_key> <plus> <plus>              : "#"   numbersign
+<Multi_key> <apostrophe> <space>       : "'"   apostrophe
+<Multi_key> <space> <apostrophe>       : "'"   apostrophe
+<Multi_key> <A> <T>                    : "@"   at
+<Multi_key> <parenleft> <parenleft>    : "["   bracketleft
+<Multi_key> <slash> <slash>            : "\\"  backslash
+<Multi_key> <slash> <less>             : "\\"  backslash
+<Multi_key> <less> <slash>             : "\\"  backslash
+<Multi_key> <parenright> <parenright>  : "]"   bracketright
+<Multi_key> <asciicircum> <space>      : "^"   asciicircum
+<Multi_key> <space> <asciicircum>      : "^"   asciicircum
+<Multi_key> <greater> <space>          : "^"   asciicircum
+<Multi_key> <space> <greater>          : "^"   asciicircum
+<Multi_key> <grave> <space>            : "`"   grave
+<Multi_key> <space> <grave>            : "`"   grave
+<Multi_key> <parenleft> <minus>                : "{"   braceleft
+<Multi_key> <minus> <parenleft>                : "{"   braceleft
+<Multi_key> <slash> <asciicircum>      : "|"   bar
+<Multi_key> <asciicircum> <slash>      : "|"   bar
+<Multi_key> <V> <L>                    : "|"   bar
+<Multi_key> <L> <V>                    : "|"   bar
+<Multi_key> <v> <l>                    : "|"   bar
+<Multi_key> <l> <v>                    : "|"   bar
+<Multi_key> <parenright> <minus>       : "}"   braceright
+<Multi_key> <minus> <parenright>       : "}"   braceright
+<Multi_key> <asciitilde> <space>       : "~"   asciitilde
+<Multi_key> <space> <asciitilde>       : "~"   asciitilde
+<Multi_key> <minus> <space>            : "~"   asciitilde
+<Multi_key> <space> <minus>            : "~"   asciitilde
+<Multi_key> <exclam> <exclam>          : "\241"        exclamdown
+<Multi_key> <c> <slash>                        : "\242"        cent
+<Multi_key> <slash> <c>                        : "\242"        cent
+<Multi_key> <C> <slash>                        : "\242"        cent
+<Multi_key> <slash> <C>                        : "\242"        cent
+<Multi_key> <C> <bar>                  : "\242"        cent
+<Multi_key> <bar> <C>                  : "\242"        cent
+<Multi_key> <c> <bar>                  : "\242"        cent
+<Multi_key> <bar> <c>                  : "\242"        cent
+<Multi_key> <l> <minus>                        : "\243"        sterling
+<Multi_key> <minus> <l>                        : "\243"        sterling
+<Multi_key> <L> <minus>                        : "\243"        sterling
+<Multi_key> <minus> <L>                        : "\243"        sterling
+<Multi_key> <l> <equal>                        : "\243"        sterling
+<Multi_key> <equal> <l>                        : "\243"        sterling
+<Multi_key> <L> <equal>                        : "\243"        sterling
+<Multi_key> <equal> <L>                        : "\243"        sterling
+<Multi_key> <C> <equal>                        : "\244"        EuroSign
+<Multi_key> <equal> <C>                        : "\244"        EuroSign
+<Multi_key> <c> <equal>                        : "\244"        EuroSign
+<Multi_key> <equal> <c>                        : "\244"        EuroSign
+<Multi_key> <E> <equal>                        : "\244"        EuroSign
+<Multi_key> <equal> <E>                        : "\244"        EuroSign
+<Multi_key> <e> <equal>                        : "\244"        EuroSign
+<Multi_key> <equal> <e>                        : "\244"        EuroSign
+<Multi_key> <y> <minus>                        : "\245"        yen
+<Multi_key> <minus> <y>                        : "\245"        yen
+<Multi_key> <Y> <minus>                        : "\245"        yen
+<Multi_key> <minus> <Y>                        : "\245"        yen
+<Multi_key> <y> <equal>                        : "\245"        yen
+<Multi_key> <equal> <y>                        : "\245"        yen
+<Multi_key> <Y> <equal>                        : "\245"        yen
+<Multi_key> <equal> <Y>                        : "\245"        yen
+<Multi_key> <s> <o>                    : "\247"        section
+<Multi_key> <o> <s>                    : "\247"        section
+<Multi_key> <S> <O>                    : "\247"        section
+<Multi_key> <O> <S>                    : "\247"        section
+<Multi_key> <S> <exclam>               : "\247"        section
+<Multi_key> <exclam> <S>               : "\247"        section
+<Multi_key> <s> <exclam>               : "\247"        section
+<Multi_key> <exclam> <s>               : "\247"        section
+<Multi_key> <S> <0>                    : "\247"        section
+<Multi_key> <0> <S>                    : "\247"        section
+<Multi_key> <s> <0>                    : "\247"        section
+<Multi_key> <0> <s>                    : "\247"        section
+<Multi_key> <c> <o>                    : "\251"        copyright
+<Multi_key> <o> <c>                    : "\251"        copyright
+<Multi_key> <C> <O>                    : "\251"        copyright
+<Multi_key> <O> <C>                    : "\251"        copyright
+<Multi_key> <c> <O>                    : "\251"        copyright
+<Multi_key> <O> <c>                    : "\251"        copyright
+<Multi_key> <C> <o>                    : "\251"        copyright
+<Multi_key> <o> <C>                    : "\251"        copyright
+<Multi_key> <c> <0>                    : "\251"        copyright
+<Multi_key> <0> <c>                    : "\251"        copyright
+<Multi_key> <C> <0>                    : "\251"        copyright
+<Multi_key> <0> <C>                    : "\251"        copyright
+<Multi_key> <parenleft> <c>            : "\251"        copyright
+<Multi_key> <parenleft> <C>            : "\251"        copyright
+<Multi_key> <a> <underscore>           : "\252"        ordfeminine
+<Multi_key> <underscore> <a>           : "\252"        ordfeminine
+<Multi_key> <A> <underscore>           : "\252"        ordfeminine
+<Multi_key> <underscore> <A>           : "\252"        ordfeminine
+<Multi_key> <o> <underscore>           : "\272"        masculine
+<Multi_key> <underscore> <o>           : "\272"        masculine
+<Multi_key> <O> <underscore>           : "\272"        masculine
+<Multi_key> <underscore> <O>           : "\272"        masculine
+<Multi_key> <less> <less>              : "\253"        guillemotleft
+<Multi_key> <greater> <greater>                : "\273"        guillemotright
+<Multi_key> <0> <asciicircum>          : "\260"        degree
+<Multi_key> <asciicircum> <0>          : "\260"        degree
+<Multi_key> <0> <asterisk>             : "\260"        degree
+<Multi_key> <asterisk> <0>             : "\260"        degree
+<Multi_key> <plus> <minus>             : "\261"        plusminus
+<Multi_key> <minus> <plus>             : "\261"        plusminus
+<Multi_key> <slash> <u>                        : "\265"        mu
+<Multi_key> <u> <slash>                        : "\265"        mu
+<Multi_key> <slash> <U>                        : "\265"        mu
+<Multi_key> <U> <slash>                        : "\265"        mu
+<Multi_key> <1> <asciicircum>          : "\271"        onesuperior
+<Multi_key> <asciicircum> <1>          : "\271"        onesuperior
+<Multi_key> <S> <1>                    : "\271"        onesuperior
+<Multi_key> <1> <S>                    : "\271"        onesuperior
+<Multi_key> <s> <1>                    : "\271"        onesuperior
+<Multi_key> <1> <s>                    : "\271"        onesuperior
+<Multi_key> <2> <asciicircum>          : "\262"        twosuperior
+<Multi_key> <asciicircum> <2>          : "\262"        twosuperior
+<Multi_key> <S> <2>                    : "\262"        twosuperior
+<Multi_key> <2> <S>                    : "\262"        twosuperior
+<Multi_key> <s> <2>                    : "\262"        twosuperior
+<Multi_key> <2> <s>                    : "\262"        twosuperior
+<Multi_key> <3> <asciicircum>          : "\263"        threesuperior
+<Multi_key> <asciicircum> <3>          : "\263"        threesuperior
+<Multi_key> <S> <3>                    : "\263"        threesuperior
+<Multi_key> <3> <S>                    : "\263"        threesuperior
+<Multi_key> <s> <3>                    : "\263"        threesuperior
+<Multi_key> <3> <s>                    : "\263"        threesuperior
+<Multi_key> <p> <exclam>               : "\266"        paragraph
+<Multi_key> <exclam> <p>               : "\266"        paragraph
+<Multi_key> <P> <exclam>               : "\266"        paragraph
+<Multi_key> <exclam> <P>               : "\266"        paragraph
+<Multi_key> <period> <asciicircum>     : "\267"        periodcentered
+<Multi_key> <asciicircum> <period>     : "\267"        periodcentered
+<Multi_key> <period> <period>          : "\267"        periodcentered
+<Multi_key> <question> <question>      : "\277"        questiondown
+<Multi_key> <space> <space>            : "\240"        nobreakspace
+<Multi_key> <minus> <comma>            : "\254"        notsign
+<Multi_key> <comma> <minus>            : "\254"        notsign
+<Multi_key> <minus> <minus>            : "\255"        hyphen
+<Multi_key> <R> <O>                    : "\256"        registered
+<Multi_key> <O> <R>                    : "\256"        registered
+<Multi_key> <parenleft> <r>            : "\256"        registered
+<Multi_key> <minus> <asciicircum>      : "\257"        macron
+<Multi_key> <asciicircum> <minus>      : "\257"        macron
+<Multi_key> <underscore> <asciicircum> : "\257"        macron
+<Multi_key> <asciicircum> <underscore> : "\257"        macron
+<Multi_key> <underscore> <underscore>  : "\257"        macron
+<Multi_key> <minus> <colon>            : "\367"        division
+<Multi_key> <colon> <minus>            : "\367"        division
+<Multi_key> <x> <x>                    : "\327"        multiply
+<Multi_key> <apostrophe> <apostrophe>  : "\264"        acute
+<Multi_key> <comma> <comma>            : "\270"        cedilla
+<Multi_key> <quotedbl> <quotedbl>      : "\""  quotedbl
+XCOMM Accented Alphabet
+<Multi_key> <A> <grave>                        : "\300"        Agrave
+<Multi_key> <grave> <A>                        : "\300"        Agrave
+<Multi_key> <A> <acute>                        : "\301"        Aacute
+<Multi_key> <acute> <A>                        : "\301"        Aacute
+<Multi_key> <A> <apostrophe>           : "\301"        Aacute
+<Multi_key> <apostrophe> <A>           : "\301"        Aacute
+<Multi_key> <A> <asciicircum>          : "\302"        Acircumflex
+<Multi_key> <asciicircum> <A>          : "\302"        Acircumflex
+<Multi_key> <A> <greater>              : "\302"        Acircumflex
+<Multi_key> <greater> <A>              : "\302"        Acircumflex
+<Multi_key> <A> <asciitilde>           : "\303"        Atilde
+<Multi_key> <asciitilde> <A>           : "\303"        Atilde
+<Multi_key> <A> <minus>                        : "\303"        Atilde
+<Multi_key> <minus> <A>                        : "\303"        Atilde
+<Multi_key> <A> <quotedbl>             : "\304"        Adiaeresis
+<Multi_key> <quotedbl> <A>             : "\304"        Adiaeresis
+<Multi_key> <A> <diaeresis>            : "\304"        Adiaeresis
+<Multi_key> <diaeresis> <A>            : "\304"        Adiaeresis
+<Multi_key> <A> <asterisk>             : "\305"        Aring
+<Multi_key> <asterisk> <A>             : "\305"        Aring
+<Multi_key> <A> <A>                    : "\305"        Aring
+<Multi_key> <A> <O>                    : "\305"        Aring
+<Multi_key> <A> <E>                    : "\306"        AE
+<Multi_key> <a> <grave>                        : "\340"        agrave
+<Multi_key> <grave> <a>                        : "\340"        agrave
+<Multi_key> <a> <acute>                        : "\341"        aacute
+<Multi_key> <acute> <a>                        : "\341"        aacute
+<Multi_key> <a> <apostrophe>           : "\341"        aacute
+<Multi_key> <apostrophe> <a>           : "\341"        aacute
+<Multi_key> <a> <asciicircum>          : "\342"        acircumflex
+<Multi_key> <asciicircum> <a>          : "\342"        acircumflex
+<Multi_key> <a> <greater>              : "\342"        acircumflex
+<Multi_key> <greater> <a>              : "\342"        acircumflex
+<Multi_key> <a> <asciitilde>           : "\343"        atilde
+<Multi_key> <asciitilde> <a>           : "\343"        atilde
+<Multi_key> <a> <minus>                        : "\343"        atilde
+<Multi_key> <minus> <a>                        : "\343"        atilde
+<Multi_key> <a> <quotedbl>             : "\344"        adiaeresis
+<Multi_key> <quotedbl> <a>             : "\344"        adiaeresis
+<Multi_key> <a> <diaeresis>            : "\344"        adiaeresis
+<Multi_key> <diaeresis> <a>            : "\344"        adiaeresis
+<Multi_key> <a> <asterisk>             : "\345"        aring
+<Multi_key> <asterisk> <a>             : "\345"        aring
+<Multi_key> <a> <a>                    : "\345"        aring
+<Multi_key> <a> <o>                    : "\345"        aring
+<Multi_key> <a> <e>                    : "\346"        ae
+<Multi_key> <acute> <C>                        : "\307"        Ccedilla
+<Multi_key> <acute> <c>                        : "\347"        ccedilla
+<Multi_key> <C> <comma>                        : "\307"        Ccedilla
+<Multi_key> <C> <cedilla>              : "\307"        Ccedilla
+<Multi_key> <comma> <C>                        : "\307"        Ccedilla
+<Multi_key> <cedilla> <C>              : "\307"        Ccedilla
+<Multi_key> <c> <comma>                        : "\347"        ccedilla
+<Multi_key> <c> <cedilla>              : "\347"        ccedilla
+<Multi_key> <comma> <c>                        : "\347"        ccedilla
+<Multi_key> <cedilla> <c>              : "\347"        ccedilla
+<Multi_key> <minus> <D>                        : "\320"        ETH
+<Multi_key> <D> <minus>                        : "\320"        ETH
+<Multi_key> <minus> <d>                        : "\360"        eth
+<Multi_key> <d> <minus>                        : "\360"        eth
+<Multi_key> <E> <grave>                        : "\310"        Egrave
+<Multi_key> <grave> <E>                        : "\310"        Egrave
+<Multi_key> <E> <acute>                        : "\311"        Eacute
+<Multi_key> <acute> <E>                        : "\311"        Eacute
+<Multi_key> <E> <apostrophe>           : "\311"        Eacute
+<Multi_key> <apostrophe> <E>           : "\311"        Eacute
+<Multi_key> <E> <asciicircum>          : "\312"        Ecircumflex
+<Multi_key> <asciicircum> <E>          : "\312"        Ecircumflex
+<Multi_key> <E> <greater>              : "\312"        Ecircumflex
+<Multi_key> <greater> <E>              : "\312"        Ecircumflex
+<Multi_key> <E> <quotedbl>             : "\313"        Ediaeresis
+<Multi_key> <quotedbl> <E>             : "\313"        Ediaeresis
+<Multi_key> <E> <diaeresis>            : "\313"        Ediaeresis
+<Multi_key> <diaeresis> <E>            : "\313"        Ediaeresis
+<Multi_key> <e> <grave>                        : "\350"        egrave
+<Multi_key> <grave> <e>                        : "\350"        egrave
+<Multi_key> <e> <acute>                        : "\351"        eacute
+<Multi_key> <acute> <e>                        : "\351"        eacute
+<Multi_key> <e> <apostrophe>           : "\351"        eacute
+<Multi_key> <apostrophe> <e>           : "\351"        eacute
+<Multi_key> <e> <asciicircum>          : "\352"        ecircumflex
+<Multi_key> <asciicircum> <e>          : "\352"        ecircumflex
+<Multi_key> <e> <greater>              : "\352"        ecircumflex
+<Multi_key> <greater> <e>              : "\352"        ecircumflex
+<Multi_key> <e> <quotedbl>             : "\353"        ediaeresis
+<Multi_key> <quotedbl> <e>             : "\353"        ediaeresis
+<Multi_key> <e> <diaeresis>            : "\353"        ediaeresis
+<Multi_key> <diaeresis> <e>            : "\353"        ediaeresis
+<Multi_key> <I> <grave>                        : "\314"        Igrave
+<Multi_key> <grave> <I>                        : "\314"        Igrave
+<Multi_key> <I> <acute>                        : "\315"        Iacute
+<Multi_key> <acute> <I>                        : "\315"        Iacute
+<Multi_key> <I> <apostrophe>           : "\315"        Iacute
+<Multi_key> <apostrophe> <I>           : "\315"        Iacute
+<Multi_key> <I> <asciicircum>          : "\316"        Icircumflex
+<Multi_key> <asciicircum> <I>          : "\316"        Icircumflex
+<Multi_key> <I> <greater>              : "\316"        Icircumflex
+<Multi_key> <greater> <I>              : "\316"        Icircumflex
+<Multi_key> <I> <quotedbl>             : "\317"        Idiaeresis
+<Multi_key> <quotedbl> <I>             : "\317"        Idiaeresis
+<Multi_key> <I> <diaeresis>            : "\317"        Idiaeresis
+<Multi_key> <diaeresis> <I>            : "\317"        Idiaeresis
+<Multi_key> <i> <grave>                        : "\354"        igrave
+<Multi_key> <grave> <i>                        : "\354"        igrave
+<Multi_key> <i> <acute>                        : "\355"        iacute
+<Multi_key> <acute> <i>                        : "\355"        iacute
+<Multi_key> <i> <apostrophe>           : "\355"        iacute
+<Multi_key> <apostrophe> <i>           : "\355"        iacute
+<Multi_key> <i> <asciicircum>          : "\356"        icircumflex
+<Multi_key> <asciicircum> <i>          : "\356"        icircumflex
+<Multi_key> <i> <greater>              : "\356"        icircumflex
+<Multi_key> <greater> <i>              : "\356"        icircumflex
+<Multi_key> <i> <quotedbl>             : "\357"        idiaeresis
+<Multi_key> <quotedbl> <i>             : "\357"        idiaeresis
+<Multi_key> <i> <diaeresis>            : "\357"        idiaeresis
+<Multi_key> <diaeresis> <i>            : "\357"        idiaeresis
+<Multi_key> <N> <asciitilde>           : "\321"        Ntilde
+<Multi_key> <asciitilde> <N>           : "\321"        Ntilde
+<Multi_key> <N> <minus>                        : "\321"        Ntilde
+<Multi_key> <minus> <N>                        : "\321"        Ntilde
+<Multi_key> <n> <asciitilde>           : "\361"        ntilde
+<Multi_key> <asciitilde> <n>           : "\361"        ntilde
+<Multi_key> <n> <minus>                        : "\361"        ntilde
+<Multi_key> <minus> <n>                        : "\361"        ntilde
+<Multi_key> <O> <grave>                        : "\322"        Ograve
+<Multi_key> <grave> <O>                        : "\322"        Ograve
+<Multi_key> <O> <acute>                        : "\323"        Oacute
+<Multi_key> <acute> <O>                        : "\323"        Oacute
+<Multi_key> <O> <apostrophe>           : "\323"        Oacute
+<Multi_key> <apostrophe> <O>           : "\323"        Oacute
+<Multi_key> <O> <asciicircum>          : "\324"        Ocircumflex
+<Multi_key> <asciicircum> <O>          : "\324"        Ocircumflex
+<Multi_key> <O> <greater>              : "\324"        Ocircumflex
+<Multi_key> <greater> <O>              : "\324"        Ocircumflex
+<Multi_key> <O> <asciitilde>           : "\325"        Otilde
+<Multi_key> <asciitilde> <O>           : "\325"        Otilde
+<Multi_key> <O> <minus>                        : "\325"        Otilde
+<Multi_key> <minus> <O>                        : "\325"        Otilde
+<Multi_key> <O> <quotedbl>             : "\326"        Odiaeresis
+<Multi_key> <quotedbl> <O>             : "\326"        Odiaeresis
+<Multi_key> <O> <diaeresis>            : "\326"        Odiaeresis
+<Multi_key> <diaeresis> <O>            : "\326"        Odiaeresis
+<Multi_key> <O> <slash>                        : "\330"        Ooblique
+<Multi_key> <slash> <O>                        : "\330"        Ooblique
+<Multi_key> <O> <E>                    : "\274"        OE
+<Multi_key> <o> <grave>                        : "\362"        ograve
+<Multi_key> <grave> <o>                        : "\362"        ograve
+<Multi_key> <o> <acute>                        : "\363"        oacute
+<Multi_key> <acute> <o>                        : "\363"        oacute
+<Multi_key> <o> <apostrophe>           : "\363"        oacute
+<Multi_key> <apostrophe> <o>           : "\363"        oacute
+<Multi_key> <o> <asciicircum>          : "\364"        ocircumflex
+<Multi_key> <asciicircum> <o>          : "\364"        ocircumflex
+<Multi_key> <o> <greater>              : "\364"        ocircumflex
+<Multi_key> <greater> <o>              : "\364"        ocircumflex
+<Multi_key> <o> <asciitilde>           : "\365"        otilde
+<Multi_key> <asciitilde> <o>           : "\365"        otilde
+<Multi_key> <o> <minus>                        : "\365"        otilde
+<Multi_key> <minus> <o>                        : "\365"        otilde
+<Multi_key> <o> <quotedbl>             : "\366"        odiaeresis
+<Multi_key> <quotedbl> <o>             : "\366"        odiaeresis
+<Multi_key> <o> <diaeresis>            : "\366"        odiaeresis
+<Multi_key> <diaeresis> <o>            : "\366"        odiaeresis
+<Multi_key> <o> <slash>                        : "\370"        oslash
+<Multi_key> <slash> <o>                        : "\370"        oslash
+<Multi_key> <o> <e>                    : "\275"        oe
+<Multi_key> <S> <less>                 : "\246"        Scaron
+<Multi_key> <less> <S>                 : "\246"        Scaron
+<Multi_key> <s> <less>                 : "\250"        scaron
+<Multi_key> <less> <s>                 : "\250"        scaron
+<Multi_key> <U> <grave>                        : "\331"        Ugrave
+<Multi_key> <grave> <U>                        : "\331"        Ugrave
+<Multi_key> <U> <acute>                        : "\332"        Uacute
+<Multi_key> <acute> <U>                        : "\332"        Uacute
+<Multi_key> <U> <apostrophe>           : "\332"        Uacute
+<Multi_key> <apostrophe> <U>           : "\332"        Uacute
+<Multi_key> <U> <asciicircum>          : "\333"        Ucircumflex
+<Multi_key> <asciicircum> <U>          : "\333"        Ucircumflex
+<Multi_key> <U> <greater>              : "\333"        Ucircumflex
+<Multi_key> <greater> <U>              : "\333"        Ucircumflex
+<Multi_key> <U> <quotedbl>             : "\334"        Udiaeresis
+<Multi_key> <quotedbl> <U>             : "\334"        Udiaeresis
+<Multi_key> <U> <diaeresis>            : "\334"        Udiaeresis
+<Multi_key> <diaeresis> <U>            : "\334"        Udiaeresis
+<Multi_key> <u> <grave>                        : "\371"        ugrave
+<Multi_key> <grave> <u>                        : "\371"        ugrave
+<Multi_key> <u> <acute>                        : "\372"        uacute
+<Multi_key> <acute> <u>                        : "\372"        uacute
+<Multi_key> <u> <apostrophe>           : "\372"        uacute
+<Multi_key> <apostrophe> <u>           : "\372"        uacute
+<Multi_key> <u> <asciicircum>          : "\373"        ucircumflex
+<Multi_key> <asciicircum> <u>          : "\373"        ucircumflex
+<Multi_key> <u> <greater>              : "\373"        ucircumflex
+<Multi_key> <greater> <u>              : "\373"        ucircumflex
+<Multi_key> <u> <quotedbl>             : "\374"        udiaeresis
+<Multi_key> <quotedbl> <u>             : "\374"        udiaeresis
+<Multi_key> <u> <diaeresis>            : "\374"        udiaeresis
+<Multi_key> <diaeresis> <u>            : "\374"        udiaeresis
+<Multi_key> <s> <s>                    : "\337"        ssharp
+<Multi_key> <T> <H>                    : "\336"        THORN
+<Multi_key> <t> <h>                    : "\376"        thorn
+<Multi_key> <Y> <acute>                        : "\335"        Yacute
+<Multi_key> <acute> <Y>                        : "\335"        Yacute
+<Multi_key> <Y> <apostrophe>           : "\335"        Yacute
+<Multi_key> <apostrophe> <Y>           : "\335"        Yacute
+<Multi_key> <Y> <quotedbl>             : "\276"        Ydiaeresis
+<Multi_key> <quotedbl> <Y>             : "\276"        Ydiaeresis
+<Multi_key> <Y> <diaeresis>            : "\276"        Ydiaeresis
+<Multi_key> <diaeresis> <Y>            : "\276"        Ydiaeresis
+<Multi_key> <y> <acute>                        : "\375"        yacute
+<Multi_key> <acute> <y>                        : "\375"        yacute
+<Multi_key> <y> <apostrophe>           : "\375"        yacute
+<Multi_key> <apostrophe> <y>           : "\375"        yacute
+<Multi_key> <y> <quotedbl>             : "\377"        ydiaeresis
+<Multi_key> <quotedbl> <y>             : "\377"        ydiaeresis
+<Multi_key> <y> <diaeresis>            : "\377"        ydiaeresis
+<Multi_key> <diaeresis> <y>            : "\377"        ydiaeresis
+<Multi_key> <Z> <less>                 : "\264"        Zcaron
+<Multi_key> <less> <Z>                 : "\264"        Zcaron
+<Multi_key> <z> <less>                 : "\270"        zcaron
+<Multi_key> <less> <z>                 : "\270"        zcaron
+XCOMM
+XCOMM dead key accent keysyms
+XCOMM Special Character
+<dead_circumflex> <slash>              : "|"   bar
+<dead_circumflex> <space>              : "^"   asciicircum
+<dead_circumflex> <dead_circumflex>    : "^"   asciicircum
+<dead_tilde> <space>                   : "~"   asciitilde
+<dead_tilde> <dead_tilde>              : "~"   asciitilde
+<dead_grave> <space>                   : "`"   grave
+<dead_grave> <dead_grave>              : "`"   grave
+XCOMM These are for us_intl, that does not have diaeresis, etc
+<dead_acute> <space>                   : "'"   apostrophe
+<dead_acute> <dead_acute>              : "\264"        acute
+<dead_diaeresis> <space>               : "\""  quotedbl
+<dead_diaeresis> <dead_diaeresis>      : "\""  quotedbl
+<dead_doubleacute> <space>             : "\""  quotedbl
+<dead_circumflex> <0>                  : "\260"        degree
+<dead_circumflex> <1>                  : "\271"        onesuperior
+<dead_circumflex> <2>                  : "\262"        twosuperior
+<dead_circumflex> <3>                  : "\263"        threesuperior
+<dead_circumflex> <period>             : "\267"        periodcentered
+<dead_cedilla> <minus>                 : "\254"        notsign
+<dead_circumflex> <minus>              : "\257"        macron
+<dead_circumflex> <underscore>         : "\257"        macron
+<dead_acute> <apostrophe>              : "\264"        acute
+<dead_cedilla> <comma>                 : "\270"        cedilla
+<dead_diaeresis> <quotedbl>            : "\""  quotedbl
+XCOMM Accented Alphabet
+<dead_abovering> <A>                   : "\305"        Aring
+<dead_grave> <A>                       : "\300"        Agrave
+<dead_acute> <A>                       : "\301"        Aacute
+<dead_circumflex> <A>                  : "\302"        Acircumflex
+<dead_tilde> <A>                       : "\303"        Atilde
+<dead_diaeresis> <A>                   : "\304"        Adiaeresis
+<dead_abovering> <a>                   : "\345"        aring
+<dead_grave> <a>                       : "\340"        agrave
+<dead_acute> <a>                       : "\341"        aacute
+<dead_circumflex> <a>                  : "\342"        acircumflex
+<dead_tilde> <a>                       : "\343"        atilde
+<dead_diaeresis> <a>                   : "\344"        adiaeresis
+<dead_cedilla> <C>                     : "\307"        Ccedilla
+<dead_cedilla> <c>                     : "\347"        ccedilla
+<dead_grave> <E>                       : "\310"        Egrave
+<dead_acute> <E>                       : "\311"        Eacute
+<dead_circumflex> <E>                  : "\312"        Ecircumflex
+<dead_diaeresis> <E>                   : "\313"        Ediaeresis
+<dead_grave> <e>                       : "\350"        egrave
+<dead_acute> <e>                       : "\351"        eacute
+<dead_circumflex> <e>                  : "\352"        ecircumflex
+<dead_diaeresis> <e>                   : "\353"        ediaeresis
+<dead_grave> <I>                       : "\314"        Igrave
+<dead_acute> <I>                       : "\315"        Iacute
+<dead_circumflex> <I>                  : "\316"        Icircumflex
+<dead_diaeresis> <I>                   : "\317"        Idiaeresis
+<dead_grave> <i>                       : "\354"        igrave
+<dead_acute> <i>                       : "\355"        iacute
+<dead_circumflex> <i>                  : "\356"        icircumflex
+<dead_diaeresis> <i>                   : "\357"        idiaeresis
+<dead_tilde> <N>                       : "\321"        Ntilde
+<dead_tilde> <n>                       : "\361"        ntilde
+<dead_grave> <O>                       : "\322"        Ograve
+<dead_acute> <O>                       : "\323"        Oacute
+<dead_circumflex> <O>                  : "\324"        Ocircumflex
+<dead_tilde> <O>                       : "\325"        Otilde
+<dead_diaeresis> <O>                   : "\326"        Odiaeresis
+<dead_grave> <o>                       : "\362"        ograve
+<dead_acute> <o>                       : "\363"        oacute
+<dead_circumflex> <o>                  : "\364"        ocircumflex
+<dead_tilde> <o>                       : "\365"        otilde
+<dead_diaeresis> <o>                   : "\366"        odiaeresis
+<dead_caron> <S>                       : "\246"        Scaron
+<dead_caron> <s>                       : "\250"        scaron
+<dead_circumflex> <S>                  : "\246"        Scaron
+<dead_circumflex> <s>                  : "\250"        scaron
+<dead_grave> <U>                       : "\331"        Ugrave
+<dead_acute> <U>                       : "\332"        Uacute
+<dead_circumflex> <U>                  : "\333"        Ucircumflex
+<dead_diaeresis> <U>                   : "\334"        Udiaeresis
+<dead_grave> <u>                       : "\371"        ugrave
+<dead_acute> <u>                       : "\372"        uacute
+<dead_circumflex> <u>                  : "\373"        ucircumflex
+<dead_diaeresis> <u>                   : "\374"        udiaeresis
+<dead_acute> <Y>                       : "\335"        Yacute
+<dead_diaeresis> <Y>                   : "\276"        Ydiaeresis
+<dead_acute> <y>                       : "\375"        yacute
+<dead_diaeresis> <y>                   : "\377"        ydiaeresis
+<dead_caron> <Z>                       : "\264"        Zcaron
+<dead_caron> <z>                       : "\270"        zcaron
+<dead_circumflex> <Z>                  : "\264"        Zcaron
+<dead_circumflex> <z>                  : "\270"        zcaron
+XCOMM Useful for portuguese language
+<dead_acute> <C>                       : "\307"        Ccedilla
+<dead_acute> <c>                       : "\347"        ccedilla
+XCOMM End of Sequence Definition
diff --git a/nls/iso8859-15/XI18N_OBJS b/nls/iso8859-15/XI18N_OBJS
new file mode 100644 (file)
index 0000000..1e4f6cc
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for iso8859-15 locale
+#
+XLC    common/xlcDef   _XlcDefaultLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/iso8859-15/XLC_LOCALE.pre b/nls/iso8859-15/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..8921874
--- /dev/null
@@ -0,0 +1,78 @@
+XCOMM  XLocale Database Sample for fcd/dis/iso 8859-15.
+XCOMM  When Final Committee Draft (FCD) 8859-15 is formalized
+XCOMM  then this file will be renamed iso8859-15.
+XCOMM  This file is provided as preliminary support for the Latin-9
+XCOMM  (a.k.a. Latin-0) character set so that Europeans who want
+XCOMM  the Euro currency character can do so.
+XCOMM 
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class 
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         ISO8859-15:GL
+               substitute      ISO8859-15:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset {
+               name            ISO8859-15:GR
+       }
+       font    {
+               primary         ISO8859-15:GR
+       }
+}
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          ISO8859-15
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+force_convert_to_mb    True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     ISO8859-15:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     ISO8859-15:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/iso8859-2/Compose.pre b/nls/iso8859-2/Compose.pre
new file mode 100644 (file)
index 0000000..876e82c
--- /dev/null
@@ -0,0 +1,535 @@
+XCOMM
+XCOMM ISO 8859-2 (Latin2) Compose Sequence
+XCOMM
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+<Multi_key> <plus> <plus>              : "#"   numbersign
+<Multi_key> <apostrophe> <space>       : "'"   apostrophe
+<Multi_key> <space> <apostrophe>       : "'"   apostrophe
+<Multi_key> <A> <A>                    : "@"   at
+<Multi_key> <parenleft> <parenleft>    : "["   bracketleft
+<Multi_key> <slash> <slash>            : "\\"  backslash
+<Multi_key> <slash> <less>             : "\\"  backslash
+<Multi_key> <less> <slash>             : "\\"  backslash
+<Multi_key> <parenright> <parenright>  : "]"   bracketright
+<Multi_key> <asciicircum> <space>      : "^"   asciicircum
+<Multi_key> <space> <asciicircum>      : "^"   asciicircum
+<Multi_key> <greater> <space>          : "^"   asciicircum
+<Multi_key> <space> <greater>          : "^"   asciicircum
+<Multi_key> <grave> <space>            : "`"   grave
+<Multi_key> <space> <grave>            : "`"   grave
+<Multi_key> <parenleft> <minus>                : "{"   braceleft
+<Multi_key> <minus> <parenleft>                : "{"   braceleft
+<Multi_key> <slash> <asciicircum>      : "|"   bar
+<Multi_key> <asciicircum> <slash>      : "|"   bar
+<Multi_key> <V> <L>                    : "|"   bar
+<Multi_key> <L> <V>                    : "|"   bar
+<Multi_key> <v> <l>                    : "|"   bar
+<Multi_key> <l> <v>                    : "|"   bar
+<Multi_key> <parenright> <minus>       : "}"   braceright
+<Multi_key> <minus> <parenright>       : "}"   braceright
+<Multi_key> <asciitilde> <space>       : "~"   asciitilde
+<Multi_key> <space> <asciitilde>       : "~"   asciitilde
+<Multi_key> <minus> <space>            : "~"   asciitilde
+<Multi_key> <space> <minus>            : "~"   asciitilde
+<Multi_key> <x> <o>                    : "\244"        currency
+<Multi_key> <o> <x>                    : "\244"        currency
+<Multi_key> <X> <O>                    : "\244"        currency
+<Multi_key> <O> <X>                    : "\244"        currency
+<Multi_key> <x> <O>                    : "\244"        currency
+<Multi_key> <O> <x>                    : "\244"        currency
+<Multi_key> <X> <o>                    : "\244"        currency
+<Multi_key> <o> <X>                    : "\244"        currency
+<Multi_key> <x> <0>                    : "\244"        currency
+<Multi_key> <0> <x>                    : "\244"        currency
+<Multi_key> <X> <0>                    : "\244"        currency
+<Multi_key> <0> <X>                    : "\244"        currency
+<Multi_key> <p> <exclam>               : "\266"        paragraph
+<Multi_key> <exclam> <p>               : "\266"        paragraph
+<Multi_key> <P> <exclam>               : "\266"        paragraph
+<Multi_key> <exclam> <P>               : "\266"        paragraph
+XCOMM Right-hand side (Accented Alphabet)
+XCOMM These compose sequences are pure supposition on my part.
+XCOMM It would be nice to know what the real cultural conventions
+XCOMM are for compose sequences.
+<Multi_key> <A> <comma>                        : "\241"        Aogonek
+<Multi_key> <comma> <A>                        : "\241"        Aogonek
+<Multi_key> <A> <ogonek>               : "\241"        Aogonek
+<Multi_key> <ogonek> <A>               : "\241"        Aogonek
+<Multi_key> <U> <space>                        : "\242"        breve
+<Multi_key> <L> <minus>                        : "\243"        Lstroke
+<Multi_key> <L> <less>                 : "\245"        Lcaron
+<Multi_key> <less> <L>                 : "\245"        Lcaron
+<Multi_key> <L> <caron>                        : "\245"        Lcaron
+<Multi_key> <caron> <L>                        : "\245"        Lcaron
+<Multi_key> <S> <apostrophe>           : "\246"        Sacute
+<Multi_key> <apostrophe> <S>           : "\246"        Sacute
+<Multi_key> <S> <acute>                        : "\246"        Sacute
+<Multi_key> <acute> <S>                        : "\246"        Sacute
+<Multi_key> <s> <o>                    : "\247"        section
+<Multi_key> <o> <s>                    : "\247"        section
+<Multi_key> <S> <O>                    : "\247"        section
+<Multi_key> <O> <S>                    : "\247"        section
+<Multi_key> <S> <exclam>               : "\247"        section
+<Multi_key> <exclam> <S>               : "\247"        section
+<Multi_key> <s> <exclam>               : "\247"        section
+<Multi_key> <exclam> <s>               : "\247"        section
+<Multi_key> <S> <0>                    : "\247"        section
+<Multi_key> <0> <S>                    : "\247"        section
+<Multi_key> <s> <0>                    : "\247"        section
+<Multi_key> <0> <s>                    : "\247"        section
+<Multi_key> <quotedbl> <quotedbl>      : "\250"        diaeresis
+<Multi_key> <S> <less>                 : "\251"        Scaron
+<Multi_key> <less> <S>                 : "\251"        Scaron
+<Multi_key> <S> <caron>                        : "\251"        Scaron
+<Multi_key> <caron> <S>                        : "\251"        Scaron
+<Multi_key> <S> <comma>                        : "\252"        Scedilla
+<Multi_key> <comma> <S>                        : "\252"        Scedilla
+<Multi_key> <S> <cedilla>              : "\252"        Scedilla
+<Multi_key> <cedilla> <S>              : "\252"        Scedilla
+<Multi_key> <T> <less>                 : "\253"        Tcaron
+<Multi_key> <less> <T>                 : "\253"        Tcaron
+<Multi_key> <T> <caron>                        : "\253"        Tcaron
+<Multi_key> <caron> <T>                        : "\253"        Tcaron
+<Multi_key> <Z> <apostrophe>           : "\254"        Zacute
+<Multi_key> <apostrophe> <Z>           : "\254"        Zacute
+<Multi_key> <Z> <acute>                        : "\254"        Zacute
+<Multi_key> <acute> <Z>                        : "\254"        Zacute
+<Multi_key> <minus> <minus>            : "\255"        hyphen
+<Multi_key> <Z> <less>                 : "\256"        Zcaron
+<Multi_key> <less> <Z>                 : "\256"        Zcaron
+<Multi_key> <Z> <caron>                        : "\256"        Zcaron
+<Multi_key> <caron> <Z>                        : "\256"        Zcaron
+<Multi_key> <Z> <period>               : "\257"        Zabovedot
+<Multi_key> <0> <asterisk>             : "\260"        degree
+<Multi_key> <asterisk> <0>             : "\260"        degree
+<Multi_key> <a> <comma>                        : "\261"        aogonek
+<Multi_key> <comma> <a>                        : "\261"        aogonek
+<Multi_key> <a> <ogonek>               : "\261"        aogonek
+<Multi_key> <ogonek> <a>               : "\261"        aogonek
+<Multi_key> <l> <minus>                        : "\263"        lstroke
+<Multi_key> <l> <less>                 : "\265"        lcaron
+<Multi_key> <less> <l>                 : "\265"        lcaron
+<Multi_key> <l> <caron>                        : "\265"        lcaron
+<Multi_key> <caron> <l>                        : "\265"        lcaron
+<Multi_key> <s> <apostrophe>           : "\266"        sacute
+<Multi_key> <apostrophe> <s>           : "\266"        sacute
+<Multi_key> <s> <acute>                        : "\266"        sacute
+<Multi_key> <acute> <s>                        : "\266"        sacute
+<Multi_key> <less> <less>              : "\267"        caron
+<Multi_key> <comma> <comma>            : "\270"        cedilla
+<Multi_key> <s> <less>                 : "\271"        scaron
+<Multi_key> <less> <s>                 : "\271"        scaron
+<Multi_key> <s> <caron>                        : "\271"        scaron
+<Multi_key> <caron> <s>                        : "\271"        scaron
+<Multi_key> <s> <comma>                        : "\272"        scedilla
+<Multi_key> <comma> <s>                        : "\272"        scedilla
+<Multi_key> <s> <cedilla>              : "\272"        scedilla
+<Multi_key> <cedilla> <s>              : "\272"        scedilla
+<Multi_key> <t> <less>                 : "\273"        tcaron
+<Multi_key> <less> <t>                 : "\273"        tcaron
+<Multi_key> <t> <caron>                        : "\273"        tcaron
+<Multi_key> <caron> <t>                        : "\273"        tcaron
+<Multi_key> <z> <apostrophe>           : "\274"        zacute
+<Multi_key> <apostrophe> <z>           : "\274"        zacute
+<Multi_key> <z> <acute>                        : "\274"        zacute
+<Multi_key> <acute> <z>                        : "\274"        zacute
+<Multi_key> <apostrophe> <apostrophe> <space>  : "\275"        doubleacute
+<Multi_key> <acute> <acute> <space>            : "\275"        doubleacute
+<Multi_key> <z> <less>                 : "\276"        zcaron
+<Multi_key> <less> <z>                 : "\276"        zcaron
+<Multi_key> <z> <caron>                        : "\276"        zcaron
+<Multi_key> <caron> <z>                        : "\276"        zcaron
+<Multi_key> <z> <period>               : "\277"        zabovedot
+<Multi_key> <R> <acute>                        : "\300"        Racute
+<Multi_key> <acute> <R>                        : "\300"        Racute
+<Multi_key> <R> <apostrophe>           : "\300"        Racute
+<Multi_key> <apostrophe> <R>           : "\300"        Racute
+<Multi_key> <A> <acute>                        : "\301"        Aacute
+<Multi_key> <acute> <A>                        : "\301"        Aacute
+<Multi_key> <A> <apostrophe>           : "\301"        Aacute
+<Multi_key> <apostrophe> <A>           : "\301"        Aacute
+<Multi_key> <A> <asciicircum>          : "\302"        Acircumflex
+<Multi_key> <asciicircum> <A>          : "\302"        Acircumflex
+<Multi_key> <A> <greater>              : "\302"        Acircumflex
+<Multi_key> <greater> <A>              : "\302"        Acircumflex
+<Multi_key> <A> <U>                    : "\303"        Abreve
+<Multi_key> <A> <breve>                        : "\303"        Abreve
+<Multi_key> <breve> <A>                        : "\303"        Abreve
+<Multi_key> <A> <quotedbl>             : "\304"        Adiaeresis
+<Multi_key> <quotedbl> <A>             : "\304"        Adiaeresis
+<Multi_key> <L> <acute>                        : "\305"        Lacute
+<Multi_key> <acute> <L>                        : "\305"        Lacute
+<Multi_key> <L> <apostrophe>           : "\305"        Lacute
+<Multi_key> <apostrophe> <L>           : "\305"        Lacute
+<Multi_key> <C> <acute>                        : "\306"        Cacute
+<Multi_key> <acute> <C>                        : "\306"        Cacute
+<Multi_key> <C> <apostrophe>           : "\306"        Cacute
+<Multi_key> <apostrophe> <C>           : "\306"        Cacute
+<Multi_key> <C> <comma>                        : "\307"        Ccedilla
+<Multi_key> <comma> <C>                        : "\307"        Ccedilla
+<Multi_key> <C> <cedilla>              : "\307"        Ccedilla
+<Multi_key> <cedilla> <C>              : "\307"        Ccedilla
+<Multi_key> <C> <less>                 : "\310"        Ccaron
+<Multi_key> <less> <C>                 : "\310"        Ccaron
+<Multi_key> <C> <caron>                        : "\310"        Ccaron
+<Multi_key> <caron> <C>                        : "\310"        Ccaron
+<Multi_key> <E> <acute>                        : "\311"        Eacute
+<Multi_key> <acute> <E>                        : "\311"        Eacute
+<Multi_key> <E> <apostrophe>           : "\311"        Eacute
+<Multi_key> <apostrophe> <E>           : "\311"        Eacute
+<Multi_key> <E> <comma>                        : "\312"        Eogonek
+<Multi_key> <comma> <E>                        : "\312"        Eogonek
+<Multi_key> <E> <ogonek>               : "\312"        Eogonek
+<Multi_key> <ogonek> <E>               : "\312"        Eogonek
+<Multi_key> <E> <quotedbl>             : "\313"        Ediaeresis
+<Multi_key> <quotedbl> <E>             : "\313"        Ediaeresis
+<Multi_key> <E> <less>                 : "\314"        Ecaron
+<Multi_key> <less> <E>                 : "\314"        Ecaron
+<Multi_key> <E> <caron>                        : "\314"        Ecaron
+<Multi_key> <caron> <E>                        : "\314"        Ecaron
+<Multi_key> <I> <acute>                        : "\315"        Iacute
+<Multi_key> <acute> <I>                        : "\315"        Iacute
+<Multi_key> <I> <apostrophe>           : "\315"        Iacute
+<Multi_key> <apostrophe> <I>           : "\315"        Iacute
+<Multi_key> <I> <asciicircum>          : "\316"        Icircumflex
+<Multi_key> <asciicircum> <I>          : "\316"        Icircumflex
+<Multi_key> <I> <greater>              : "\316"        Icircumflex
+<Multi_key> <greater> <I>              : "\316"        Icircumflex
+<Multi_key> <D> <less>                 : "\317"        Dcaron
+<Multi_key> <less> <D>                 : "\317"        Dcaron
+<Multi_key> <D> <caron>                        : "\317"        Dcaron
+<Multi_key> <caron> <D>                        : "\317"        Dcaron
+<Multi_key> <D> <minus>                        : "\320"        Dstroke
+<Multi_key> <minus> <D>                        : "\320"        Dstroke
+<Multi_key> <N> <acute>                        : "\321"        Nacute
+<Multi_key> <acute> <N>                        : "\321"        Nacute
+<Multi_key> <N> <apostrophe>           : "\321"        Nacute
+<Multi_key> <apostrophe> <N>           : "\321"        Nacute
+<Multi_key> <N> <less>                 : "\322"        Ncaron
+<Multi_key> <less> <N>                 : "\322"        Ncaron
+<Multi_key> <N> <caron>                        : "\322"        Ncaron
+<Multi_key> <caron> <N>                        : "\322"        Ncaron
+<Multi_key> <O> <acute>                        : "\323"        Oacute
+<Multi_key> <acute> <O>                        : "\323"        Oacute
+<Multi_key> <O> <apostrophe>           : "\323"        Oacute
+<Multi_key> <apostrophe> <O>           : "\323"        Oacute
+<Multi_key> <O> <asciicircum>          : "\324"        Ocircumflex
+<Multi_key> <asciicircum> <O>          : "\324"        Ocircumflex
+<Multi_key> <O> <greater>              : "\324"        Ocircumflex
+<Multi_key> <greater> <O>              : "\324"        Ocircumflex
+<Multi_key> <apostrophe> <apostrophe> <O>      : "\325"        Odoubleacute
+<Multi_key> <acute> <acute> <O>                : "\325"        Odoubleacute
+<Multi_key> <O> <quotedbl>             : "\326"        Odiaeresis
+<Multi_key> <quotedbl> <O>             : "\326"        Odiaeresis
+<Multi_key> <x> <x>                    : "\327"        multiply
+<Multi_key> <R> <less>                 : "\330"        Rcaron
+<Multi_key> <less> <R>                 : "\330"        Rcaron
+<Multi_key> <R> <caron>                        : "\330"        Rcaron
+<Multi_key> <caron> <R>                        : "\330"        Rcaron
+<Multi_key> <U> <asterisk>             : "\331"        Uring
+<Multi_key> <asterisk> <U>             : "\331"        Uring
+<Multi_key> <U> <acute>                        : "\332"        Uacute
+<Multi_key> <acute> <U>                        : "\332"        Uacute
+<Multi_key> <U> <apostrophe>           : "\332"        Uacute
+<Multi_key> <apostrophe> <U>           : "\332"        Uacute
+<Multi_key> <apostrophe> <apostrophe> <U>      : "\333"        Udoubleacute
+<Multi_key> <acute> <acute> <U>                : "\333"        Udoubleacute
+<Multi_key> <U> <quotedbl>             : "\334"        Udiaeresis
+<Multi_key> <quotedbl> <U>             : "\334"        Udiaeresis
+<Multi_key> <Y> <acute>                        : "\335"        Yacute
+<Multi_key> <acute> <Y>                        : "\335"        Yacute
+<Multi_key> <Y> <apostrophe>           : "\335"        Yacute
+<Multi_key> <apostrophe> <Y>           : "\335"        Yacute
+<Multi_key> <T> <comma>                        : "\336"        Tcedilla
+<Multi_key> <comma> <T>                        : "\336"        Tcedilla
+<Multi_key> <T> <cedilla>              : "\336"        Tcedilla
+<Multi_key> <cedilla> <T>              : "\336"        Tcedilla
+<Multi_key> <s> <s>                    : "\337"        ssharp
+<Multi_key> <r> <acute>                        : "\340"        racute
+<Multi_key> <acute> <r>                        : "\340"        racute
+<Multi_key> <r> <apostrophe>           : "\340"        racute
+<Multi_key> <apostrophe> <r>           : "\340"        racute
+<Multi_key> <a> <acute>                        : "\341"        aacute
+<Multi_key> <acute> <a>                        : "\341"        aacute
+<Multi_key> <a> <apostrophe>           : "\341"        aacute
+<Multi_key> <apostrophe> <a>           : "\341"        aacute
+<Multi_key> <a> <asciicircum>          : "\342"        acircumflex
+<Multi_key> <asciicircum> <a>          : "\342"        acircumflex
+<Multi_key> <a> <greater>              : "\342"        acircumflex
+<Multi_key> <greater> <a>              : "\342"        acircumflex
+<Multi_key> <a> <U>                    : "\343"        abreve
+<Multi_key> <a> <breve>                        : "\343"        abreve
+<Multi_key> <breve> <a>                        : "\343"        abreve
+<Multi_key> <a> <quotedbl>             : "\344"        adiaeresis
+<Multi_key> <quotedbl> <a>             : "\344"        adiaeresis
+<Multi_key> <l> <acute>                        : "\345"        lacute
+<Multi_key> <acute> <l>                        : "\345"        lacute
+<Multi_key> <l> <apostrophe>           : "\345"        lacute
+<Multi_key> <apostrophe> <l>           : "\345"        lacute
+<Multi_key> <c> <acute>                        : "\346"        cacute
+<Multi_key> <acute> <c>                        : "\346"        cacute
+<Multi_key> <c> <apostrophe>           : "\346"        cacute
+<Multi_key> <apostrophe> <c>           : "\346"        cacute
+<Multi_key> <c> <comma>                        : "\347"        ccedilla
+<Multi_key> <comma> <c>                        : "\347"        ccedilla
+<Multi_key> <c> <cedilla>              : "\347"        ccedilla
+<Multi_key> <cedilla> <c>              : "\347"        ccedilla
+<Multi_key> <c> <less>                 : "\350"        ccaron
+<Multi_key> <less> <c>                 : "\350"        ccaron
+<Multi_key> <c> <caron>                        : "\350"        ccaron
+<Multi_key> <caron> <c>                        : "\350"        ccaron
+<Multi_key> <e> <acute>                        : "\351"        eacute
+<Multi_key> <acute> <e>                        : "\351"        eacute
+<Multi_key> <e> <apostrophe>           : "\351"        eacute
+<Multi_key> <apostrophe> <e>           : "\351"        eacute
+<Multi_key> <e> <comma>                        : "\352"        eogonek
+<Multi_key> <comma> <e>                        : "\352"        eogonek
+<Multi_key> <e> <ogonek>               : "\352"        eogonek
+<Multi_key> <ogonek> <e>               : "\352"        eogonek
+<Multi_key> <e> <quotedbl>             : "\353"        ediaeresis
+<Multi_key> <quotedbl> <e>             : "\353"        ediaeresis
+<Multi_key> <e> <less>                 : "\354"        ecaron
+<Multi_key> <less> <e>                 : "\354"        ecaron
+<Multi_key> <e> <caron>                        : "\354"        ecaron
+<Multi_key> <caron> <e>                        : "\354"        ecaron
+<Multi_key> <i> <acute>                        : "\355"        iacute
+<Multi_key> <acute> <i>                        : "\355"        iacute
+<Multi_key> <i> <apostrophe>           : "\355"        iacute
+<Multi_key> <apostrophe> <i>           : "\355"        iacute
+<Multi_key> <i> <asciicircum>          : "\356"        icircumflex
+<Multi_key> <asciicircum> <i>          : "\356"        icircumflex
+<Multi_key> <i> <greater>              : "\356"        icircumflex
+<Multi_key> <greater> <i>              : "\356"        icircumflex
+<Multi_key> <d> <less>                 : "\357"        dcaron
+<Multi_key> <less> <d>                 : "\357"        dcaron
+<Multi_key> <d> <caron>                        : "\357"        dcaron
+<Multi_key> <caron> <d>                        : "\357"        dcaron
+<Multi_key> <d> <minus>                        : "\360"        dstroke
+<Multi_key> <minus> <d>                        : "\360"        dstroke
+<Multi_key> <n> <acute>                        : "\361"        nacute
+<Multi_key> <acute> <n>                        : "\361"        nacute
+<Multi_key> <n> <apostrophe>           : "\361"        nacute
+<Multi_key> <apostrophe> <n>           : "\361"        nacute
+<Multi_key> <n> <less>                 : "\362"        ncaron
+<Multi_key> <less> <n>                 : "\362"        ncaron
+<Multi_key> <n> <caron>                        : "\362"        ncaron
+<Multi_key> <caron> <n>                        : "\362"        ncaron
+<Multi_key> <o> <acute>                        : "\363"        oacute
+<Multi_key> <acute> <o>                        : "\363"        oacute
+<Multi_key> <o> <apostrophe>           : "\363"        oacute
+<Multi_key> <apostrophe> <o>           : "\363"        oacute
+<Multi_key> <o> <asciicircum>          : "\364"        ocircumflex
+<Multi_key> <asciicircum> <o>          : "\364"        ocircumflex
+<Multi_key> <o> <greater>              : "\364"        ocircumflex
+<Multi_key> <greater> <o>              : "\364"        ocircumflex
+<Multi_key> <apostrophe> <apostrophe> <o>      : "\365"        odoubleacute
+<Multi_key> <acute> <acute> <o>                : "\365"        odoubleacute
+<Multi_key> <o> <quotedbl>             : "\366"        odiaeresis
+<Multi_key> <quotedbl> <o>             : "\366"        odiaeresis
+<Multi_key> <minus> <colon>            : "\367"        division
+<Multi_key> <colon> <minus>            : "\367"        division
+<Multi_key> <r> <less>                 : "\370"        rcaron
+<Multi_key> <less> <r>                 : "\370"        rcaron
+<Multi_key> <r> <caron>                        : "\370"        rcaron
+<Multi_key> <caron> <r>                        : "\370"        rcaron
+<Multi_key> <u> <asterisk>             : "\371"        uring
+<Multi_key> <asterisk> <u>             : "\371"        uring
+<Multi_key> <u> <acute>                        : "\372"        uacute
+<Multi_key> <acute> <u>                        : "\372"        uacute
+<Multi_key> <u> <apostrophe>           : "\372"        uacute
+<Multi_key> <apostrophe> <u>           : "\372"        uacute
+<Multi_key> <apostrophe> <apostrophe> <u>      : "\373"        udoubleacute
+<Multi_key> <acute> <acute> <u>                : "\373"        udoubleacute
+<Multi_key> <u> <quotedbl>             : "\374"        udiaeresis
+<Multi_key> <quotedbl> <u>             : "\374"        udiaeresis
+<Multi_key> <y> <acute>                        : "\375"        yacute
+<Multi_key> <acute> <y>                        : "\375"        yacute
+<Multi_key> <y> <apostrophe>           : "\375"        yacute
+<Multi_key> <apostrophe> <y>           : "\375"        yacute
+<Multi_key> <t> <comma>                        : "\376"        tcedilla
+<Multi_key> <comma> <t>                        : "\376"        tcedilla
+<Multi_key> <t> <cedilla>              : "\376"        tcedilla
+<Multi_key> <cedilla> <t>              : "\376"        tcedilla
+<Multi_key> <period> <period>          : "\377"        abovedot
+<dead_acute> <A>                       : "\301"        Aacute
+<dead_acute> <C>                       : "\306"        Cacute
+<dead_acute> <E>                       : "\311"        Eacute
+<dead_acute> <I>                       : "\315"        Iacute
+<dead_acute> <L>                       : "\305"        Lacute
+<dead_acute> <N>                       : "\321"        Nacute
+<dead_acute> <O>                       : "\323"        Oacute
+<dead_acute> <R>                       : "\300"        Racute
+<dead_acute> <S>                       : "\246"        Sacute
+<dead_acute> <U>                       : "\332"        Uacute
+<dead_acute> <Y>                       : "\335"        Yacute
+<dead_acute> <Z>                       : "\254"        Zacute
+<dead_acute> <a>                       : "\341"        aacute
+<dead_acute> <c>                       : "\346"        cacute
+<dead_acute> <e>                       : "\351"        eacute
+<dead_acute> <i>                       : "\355"        iacute
+<dead_acute> <l>                       : "\345"        lacute
+<dead_acute> <n>                       : "\361"        nacute
+<dead_acute> <o>                       : "\363"        oacute
+<dead_acute> <r>                       : "\340"        racute
+<dead_acute> <s>                       : "\266"        sacute
+<dead_acute> <u>                       : "\372"        uacute
+<dead_acute> <y>                       : "\375"        yacute
+<dead_acute> <z>                       : "\274"        zacute
+<dead_breve> <A>                       : "\303"        Abreve
+<dead_breve> <a>                       : "\343"        abreve
+<dead_diaeresis> <A>                   : "\304"        Adiaeresis
+<dead_diaeresis> <E>                   : "\313"        Ediaeresis
+<dead_diaeresis> <O>                   : "\326"        Odiaeresis
+<dead_diaeresis> <U>                   : "\334"        Udiaeresis
+<dead_diaeresis> <a>                   : "\344"        adiaeresis
+<dead_diaeresis> <e>                   : "\353"        ediaeresis
+<dead_diaeresis> <o>                   : "\366"        odiaeresis
+<dead_diaeresis> <u>                   : "\374"        udiaeresis
+<dead_abovering> <U>                   : "\331"        Uring
+<dead_abovering> <u>                   : "\371"        uring
+<dead_doubleacute> <O>                 : "\325"        Odoubleacute
+<dead_doubleacute> <U>                 : "\333"        Udoubleacute
+<dead_doubleacute> <o>                 : "\365"        odoubleacute
+<dead_doubleacute> <u>                 : "\373"        udoubleacute
+<dead_caron> <C>                       : "\310"        Ccaron
+<dead_caron> <D>                       : "\317"        Dcaron
+<dead_caron> <E>                       : "\314"        Ecaron
+<dead_caron> <L>                       : "\245"        Lcaron
+<dead_caron> <N>                       : "\322"        Ncaron
+<dead_caron> <R>                       : "\330"        Rcaron
+<dead_caron> <S>                       : "\251"        Scaron
+<dead_caron> <T>                       : "\253"        Tcaron
+<dead_caron> <Z>                       : "\256"        Zcaron
+<dead_caron> <c>                       : "\350"        ccaron
+<dead_caron> <d>                       : "\357"        dcaron
+<dead_caron> <e>                       : "\354"        ecaron
+<dead_caron> <l>                       : "\265"        lcaron
+<dead_caron> <n>                       : "\362"        ncaron
+<dead_caron> <r>                       : "\370"        rcaron
+<dead_caron> <s>                       : "\271"        scaron
+<dead_caron> <t>                       : "\273"        tcaron
+<dead_caron> <z>                       : "\276"        zcaron
+<dead_cedilla> <S>                     : "\252"        Scedilla
+<dead_cedilla> <C>                     : "\307"        Ccedilla
+<dead_cedilla> <T>                     : "\336"        Tcedilla
+<dead_cedilla> <c>                     : "\347"        ccedilla
+<dead_cedilla> <s>                     : "\272"        scedilla
+<dead_cedilla> <t>                     : "\376"        tcedilla
+XCOMM those are for ease of use
+<dead_abovedot> <U>                    : "\331"        Uring
+<dead_abovedot> <u>                    : "\371"        uring
+<dead_caron> <U>                       : "\331"        Uring
+<dead_caron> <u>                       : "\371"        uring
+XCOMM traditional sequences
+<Multi_key> <O> <E>                    : "\274"        OE
+<Multi_key> <o> <e>                    : "\275"        oe
+<dead_abovering> <A>                   : "\305"        Aring
+<dead_abovering> <a>                    : "\345"        aring
+<dead_abovering> <dead_abovering>       : "\260"       degree
+<dead_abovering> <degree>               : "\260"       degree
+<dead_abovering> <space>                : "\260"       degree
+<dead_abovering> <nobreakspace>         : "\260"       degree
+<dead_tilde> <I>                        : "\245"        Itilde
+<dead_tilde> <i>                        : "\265"        itilde
+<dead_tilde> <A>                        : "\303"        Atilde
+<dead_tilde> <O>                        : "\325"        Otilde
+<dead_tilde> <U>                        : "\335"        Utilde
+<dead_tilde> <a>                        : "\343"        atilde
+<dead_tilde> <o>                        : "\365"        otilde
+<dead_tilde> <u>                        : "\375"        utilde
+<dead_tilde> <N>                       : "\321"        Ntilde
+<dead_tilde> <n>                       : "\361"        ntilde
+<dead_tilde> <dead_tilde>               : "~"           asciitilde
+<dead_tilde> <asciitilde>               : "~"           asciitilde
+<dead_tilde> <space>                    : "~"           asciitilde
+<dead_tilde> <nobreakspace>             : "~"           asciitilde
+<dead_caron> <caron>                    : "\267"        caron
+<dead_caron> <dead_caron>               : "\267"        caron
+<dead_caron> <space>                    : "\267"        caron
+<dead_caron> <nobreakspace>             : "\267"        caron
+<dead_circumflex> <A>                   : "\302"        Acircumflex
+<dead_circumflex> <I>                   : "\316"        Icircumflex
+<dead_circumflex> <O>                   : "\324"        Ocircumflex
+<dead_circumflex> <U>                   : "\333"        Ucircumflex
+<dead_circumflex> <a>                   : "\342"        acircumflex
+<dead_circumflex> <i>                   : "\356"        icircumflex
+<dead_circumflex> <o>                   : "\364"        ocircumflex
+<dead_circumflex> <u>                   : "\373"        ucircumflex      
+<dead_circumflex> <dead_circumflex>    : "\136"        asciicircum
+<dead_circumflex> <asciicircum>                : "\136"        asciicircum
+<dead_circumflex> <space>              : "\136"        asciicircum
+<dead_circumflex> <nobreakspace>       : "\136"        asciicircum
+<dead_breve> <G>                        : "\253"        Gbreve
+<dead_breve> <g>                        : "\273"        gbreve
+<dead_breve> <U>                        : "\335"        Ubreve
+<dead_breve> <u>                        : "\375"        ubreve
+<dead_breve> <dead_breve>              : "\242"        breve
+<dead_breve> <breve>                   : "\242"        breve
+<dead_breve> <space>                   : "\242"        breve
+<dead_breve> <nobreakspace>            : "\242"        breve
+<dead_ogonek> <A>                       : "\241"        Aogonek
+<dead_ogonek> <I>                       : "\307"        Iogonek
+<dead_ogonek> <E>                       : "\312"        Eogonek
+<dead_ogonek> <U>                       : "\331"        Uogonek
+<dead_ogonek> <a>                       : "\261"        aogonek
+<dead_ogonek> <i>                       : "\347"        iogonek
+<dead_ogonek> <e>                       : "\352"        eogonek
+<dead_ogonek> <u>                       : "\371"        uogonek          
+<dead_ogonek> <dead_ogonek>            : "\662"        ogonek
+<dead_ogonek> <ogonek>                 : "\662"        ogonek
+<dead_ogonek> <space>                  : "\662"        ogonek
+<dead_ogonek> <nobreakspace>           : "\662"        ogonek
+<dead_grave> <A>                       : "\300"        Agrave
+<dead_grave> <a>                       : "\340"        agrave
+<dead_grave> <E>                       : "\310"        Egrave
+<dead_grave> <e>                       : "\350"        egrave
+<dead_grave> <I>                       : "\314"        Igrave
+<dead_grave> <i>                       : "\354"        igrave
+<dead_grave> <O>                       : "\322"        Ograve
+<dead_grave> <o>                       : "\362"        ograve
+<dead_grave> <U>                       : "\331"        Ugrave
+<dead_grave> <u>                       : "\371"        ugrave
+<dead_grave> <dead_grave>              : "`"           grave
+<dead_grave> <grave>                   : "`"           grave
+<dead_grave> <space>                   : "`"           grave
+<dead_grave> <nobreakspace>            : "`"           grave
+<dead_abovedot> <C>                    : "\305"        Cabovedot
+<dead_abovedot> <c>                    : "\345"        cabovedot
+<dead_abovedot> <I>                    : "\251"        Iabovedot
+<dead_abovedot> <i>                    : "\271"        idotless
+<dead_abovedot> <Z>                    : "\257"        Zabovedot
+<dead_abovedot> <z>                    : "\277"        zabovedot
+<dead_abovedot> <E>                    : "\314"        Eabovedot
+<dead_abovedot> <e>                    : "\354"        eabovedot
+<dead_abovedot> <dead_abovedot>                : "\377"        abovedot
+<dead_abovedot> <abovedot>             : "\377"        abovedot
+<dead_abovedot> <space>                        : "\377"        abovedot
+<dead_abovedot> <nobreakspace>         : "\377"        abovedot
+<dead_acute> <dead_acute>              : "\264"        acute
+<dead_acute> <acute>                   : "\264"        acute
+<dead_acute> <space>                   : "\264"        acute
+<dead_acute> <nobreakspace>            : "\264"        acute
+<dead_doubleacute> <dead_doubleacute>  : "\675"        doubleacute
+<dead_doubleacute> <doubleacute>       : "\675"        doubleacute
+<dead_doubleacute> <space>             : "\675"        doubleacute
+<dead_doubleacute> <nobreakspace>      : "\675"        doubleacute
+<dead_diaeresis> <I>                   : "\317"        Idiaeresis
+<dead_diaeresis> <i>                   : "\357"        idiaeresis
+<dead_diaeresis> <y>                   : "\377"        ydiaeresis
+<dead_diaeresis> <dead_diaeresis>      : "\250"        diaeresis
+<dead_diaeresis> <diaeresis>           : "\250"        diaeresis
+<dead_diaeresis> <space>               : "\250"        diaeresis
+<dead_diaeresis> <nobreakspace>                : "\250"        diaeresis
+<dead_cedilla> <dead_cedilla>          : "\270"        cedilla
+<dead_cedilla> <cedilla>               : "\270"        cedilla
+<dead_cedilla> <space>                 : "\270"        cedilla
+<dead_cedilla> <nobreakspace>          : "\270"        cedilla
+<dead_macron> <dead_macron>            : "\257"        macron
+<dead_macron> <macron>                 : "\257"        macron
+<dead_macron> <space>                  : "\257"        macron
+<dead_macron> <nobreakspace>           : "\257"        macron
+XCOMM End of Sequence Definition
diff --git a/nls/iso8859-2/XI18N_OBJS b/nls/iso8859-2/XI18N_OBJS
new file mode 100644 (file)
index 0000000..f20902a
--- /dev/null
@@ -0,0 +1,8 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for euro locales
+#
+XLC    common/xlibi18n _XlcGenericLoader       # XLC_open
+XIM    common/xiiimp   _XimpLocalOpenIM        # XIM_open
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
+
diff --git a/nls/iso8859-2/XLC_LOCALE.pre b/nls/iso8859-2/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..8c70e8a
--- /dev/null
@@ -0,0 +1,72 @@
+XCOMM  XLocale Database Sample for iso8859-2.
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class 
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         ISO8859-2:GL
+               substitute      ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset {
+               name            ISO8859-2:GR
+       }
+       font    {
+               primary         ISO8859-2:GR
+       }
+}
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          ISO8859-2
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+force_convert_to_mb    True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     ISO8859-2:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     ISO8859-2:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/iso8859-3/Compose.pre b/nls/iso8859-3/Compose.pre
new file mode 100644 (file)
index 0000000..6238d5c
--- /dev/null
@@ -0,0 +1,483 @@
+XCOMM
+XCOMM ISO 8859-3 (Latin3) Compose Sequence
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+<Multi_key> <plus> <plus>              : "#"   numbersign
+<Multi_key> <apostrophe> <space>       : "'"   apostrophe
+<Multi_key> <space> <apostrophe>       : "'"   apostrophe
+<Multi_key> <A> <A>                    : "@"   at
+<Multi_key> <parenleft> <parenleft>    : "["   bracketleft
+<Multi_key> <slash> <slash>            : "\\"  backslash
+<Multi_key> <slash> <less>             : "\\"  backslash
+<Multi_key> <less> <slash>             : "\\"  backslash
+<Multi_key> <parenright> <parenright>  : "]"   bracketright
+<Multi_key> <asciicircum> <space>      : "^"   asciicircum
+<Multi_key> <space> <asciicircum>      : "^"   asciicircum
+<Multi_key> <greater> <space>          : "^"   asciicircum
+<Multi_key> <space> <greater>          : "^"   asciicircum
+<Multi_key> <grave> <space>            : "`"   grave
+<Multi_key> <space> <grave>            : "`"   grave
+<Multi_key> <parenleft> <minus>                : "{"   braceleft
+<Multi_key> <minus> <parenleft>                : "{"   braceleft
+<Multi_key> <slash> <asciicircum>      : "|"   bar
+<Multi_key> <asciicircum> <slash>      : "|"   bar
+<Multi_key> <V> <L>                    : "|"   bar
+<Multi_key> <L> <V>                    : "|"   bar
+<Multi_key> <v> <l>                    : "|"   bar
+<Multi_key> <l> <v>                    : "|"   bar
+<Multi_key> <parenright> <minus>       : "}"   braceright
+<Multi_key> <minus> <parenright>       : "}"   braceright
+<Multi_key> <asciitilde> <space>       : "~"   asciitilde
+<Multi_key> <space> <asciitilde>       : "~"   asciitilde
+<Multi_key> <minus> <space>            : "~"   asciitilde
+<Multi_key> <space> <minus>            : "~"   asciitilde
+<Multi_key> <l> <minus>                        : "\243"        sterling
+<Multi_key> <minus> <l>                        : "\243"        sterling
+<Multi_key> <L> <minus>                        : "\243"        sterling
+<Multi_key> <minus> <L>                        : "\243"        sterling
+<Multi_key> <l> <equal>                        : "\243"        sterling
+<Multi_key> <equal> <l>                        : "\243"        sterling
+<Multi_key> <L> <equal>                        : "\243"        sterling
+<Multi_key> <equal> <L>                        : "\243"        sterling
+<Multi_key> <C> <equal>                        : "\244"        EuroSign
+<Multi_key> <equal> <C>                        : "\244"        EuroSign
+<Multi_key> <c> <equal>                        : "\244"        EuroSign
+<Multi_key> <equal> <c>                        : "\244"        EuroSign
+<Multi_key> <E> <equal>                        : "\244"        EuroSign
+<Multi_key> <equal> <E>                        : "\244"        EuroSign
+<Multi_key> <e> <equal>                 : "\244"        EuroSign
+<Multi_key> <equal> <e>                 : "\244"        EuroSign
+<Multi_key> <y> <minus>                        : "\245"        yen
+<Multi_key> <minus> <y>                        : "\245"        yen
+<Multi_key> <Y> <minus>                        : "\245"        yen
+<Multi_key> <minus> <Y>                        : "\245"        yen
+<Multi_key> <y> <equal>                        : "\245"        yen
+<Multi_key> <equal> <y>                        : "\245"        yen
+<Multi_key> <Y> <equal>                        : "\245"        yen
+<Multi_key> <equal> <Y>                        : "\245"        yen
+<Multi_key> <s> <o>                    : "\247"        section
+<Multi_key> <o> <s>                    : "\247"        section
+<Multi_key> <S> <O>                    : "\247"        section
+<Multi_key> <O> <S>                    : "\247"        section
+<Multi_key> <S> <exclam>               : "\247"        section
+<Multi_key> <exclam> <S>               : "\247"        section
+<Multi_key> <s> <exclam>               : "\247"        section
+<Multi_key> <exclam> <s>               : "\247"        section
+<Multi_key> <S> <0>                    : "\247"        section
+<Multi_key> <0> <S>                    : "\247"        section
+<Multi_key> <s> <0>                    : "\247"        section
+<Multi_key> <0> <s>                    : "\247"        section
+<Multi_key> <0> <asciicircum>          : "\260"        degree
+<Multi_key> <asciicircum> <0>          : "\260"        degree
+<Multi_key> <0> <asterisk>             : "\260"        degree
+<Multi_key> <asterisk> <0>             : "\260"        degree
+<Multi_key> <slash> <u>                        : "\265"        mu
+<Multi_key> <u> <slash>                        : "\265"        mu
+<Multi_key> <slash> <U>                        : "\265"        mu
+<Multi_key> <U> <slash>                        : "\265"        mu
+<Multi_key> <2> <asciicircum>          : "\262"        twosuperior
+<Multi_key> <asciicircum> <2>          : "\262"        twosuperior
+<Multi_key> <S> <2>                    : "\262"        twosuperior
+<Multi_key> <2> <S>                    : "\262"        twosuperior
+<Multi_key> <s> <2>                    : "\262"        twosuperior
+<Multi_key> <2> <s>                    : "\262"        twosuperior
+<Multi_key> <3> <asciicircum>          : "\263"        threesuperior
+<Multi_key> <asciicircum> <3>          : "\263"        threesuperior
+<Multi_key> <S> <3>                    : "\263"        threesuperior
+<Multi_key> <3> <S>                    : "\263"        threesuperior
+<Multi_key> <s> <3>                    : "\263"        threesuperior
+<Multi_key> <3> <s>                    : "\263"        threesuperior
+<Multi_key> <period> <asciicircum>     : "\267"        periodcentered
+<Multi_key> <asciicircum> <period>     : "\267"        periodcentered
+<Multi_key> <period> <period>          : "\267"        periodcentered
+<Multi_key> <space> <space>            : "\240"        nobreakspace
+<Multi_key> <minus> <minus>            : "\255"        hyphen
+<Multi_key> <R> <O>                    : "\256"        registered
+<Multi_key> <O> <R>                    : "\256"        registered
+<Multi_key> <parenleft> <r>             : "\256"        registered
+<Multi_key> <minus> <colon>            : "\367"        division
+<Multi_key> <colon> <minus>            : "\367"        division
+<Multi_key> <x> <x>                    : "\327"        multiply
+<Multi_key> <apostrophe> <apostrophe>  : "\264"        acute
+<Multi_key> <comma> <comma>            : "\270"        cedilla
+<Multi_key> <quotedbl> <quotedbl>      : "\250"        diaeresis
+XCOMM Accented Alphabet
+<Multi_key> <A> <grave>                        : "\300"        Agrave
+<Multi_key> <grave> <A>                        : "\300"        Agrave
+<Multi_key> <A> <acute>                        : "\301"        Aacute
+<Multi_key> <acute> <A>                        : "\301"        Aacute
+<Multi_key> <A> <apostrophe>           : "\301"        Aacute
+<Multi_key> <apostrophe> <A>           : "\301"        Aacute
+<Multi_key> <A> <asciicircum>          : "\302"        Acircumflex
+<Multi_key> <asciicircum> <A>          : "\302"        Acircumflex
+<Multi_key> <A> <greater>              : "\302"        Acircumflex
+<Multi_key> <greater> <A>              : "\302"        Acircumflex
+<Multi_key> <A> <asciitilde>           : "\303"        Atilde
+<Multi_key> <asciitilde> <A>           : "\303"        Atilde
+<Multi_key> <A> <minus>                        : "\303"        Atilde
+<Multi_key> <minus> <A>                        : "\303"        Atilde
+<Multi_key> <A> <quotedbl>             : "\304"        Adiaeresis
+<Multi_key> <quotedbl> <A>             : "\304"        Adiaeresis
+<Multi_key> <A> <diaeresis>            : "\304"        Adiaeresis
+<Multi_key> <diaeresis> <A>            : "\304"        Adiaeresis
+<Multi_key> <a> <grave>                        : "\340"        agrave
+<Multi_key> <grave> <a>                        : "\340"        agrave
+<Multi_key> <a> <acute>                        : "\341"        aacute
+<Multi_key> <acute> <a>                        : "\341"        aacute
+<Multi_key> <a> <apostrophe>           : "\341"        aacute
+<Multi_key> <apostrophe> <a>           : "\341"        aacute
+<Multi_key> <a> <asciicircum>          : "\342"        acircumflex
+<Multi_key> <asciicircum> <a>          : "\342"        acircumflex
+<Multi_key> <a> <greater>              : "\342"        acircumflex
+<Multi_key> <greater> <a>              : "\342"        acircumflex
+<Multi_key> <a> <asciitilde>           : "\343"        atilde
+<Multi_key> <asciitilde> <a>           : "\343"        atilde
+<Multi_key> <a> <minus>                        : "\343"        atilde
+<Multi_key> <minus> <a>                        : "\343"        atilde
+<Multi_key> <a> <quotedbl>             : "\344"        adiaeresis
+<Multi_key> <quotedbl> <a>             : "\344"        adiaeresis
+<Multi_key> <a> <diaeresis>            : "\344"        adiaeresis
+<Multi_key> <diaeresis> <a>            : "\344"        adiaeresis
+<Multi_key> <C> <period>               : "\305"        Cabovedot
+<Multi_key> <period> <C>               : "\305"        Cabovedot
+<Multi_key> <C> <asciicircum>          : "\306"        Ccircumflex
+<Multi_key> <asciicircum> <C>          : "\306"        Ccircumflex
+<Multi_key> <C> <greater>              : "\306"        Ccircumflex
+<Multi_key> <greater> <C>              : "\306"        Ccircumflex
+<Multi_key> <C> <comma>                        : "\307"        Ccedilla
+<Multi_key> <C> <cedilla>                      : "\307"        Ccedilla
+<Multi_key> <comma> <C>                        : "\307"        Ccedilla
+<Multi_key> <cedilla> <C>                      : "\307"        Ccedilla
+<Multi_key> <c> <period>               : "\345"        cabovedot
+<Multi_key> <period> <c>               : "\345"        cabovedot
+<Multi_key> <c> <asciicircum>           : "\346"        ccircumflex
+<Multi_key> <asciicircum> <c>           : "\346"        ccircumflex
+<Multi_key> <c> <greater>               : "\346"        ccircumflex
+<Multi_key> <greater> <c>               : "\346"        ccircumflex
+<Multi_key> <c> <comma>                        : "\347"        ccedilla
+<Multi_key> <c> <cedilla>              : "\347"        ccedilla
+<Multi_key> <comma> <c>                        : "\347"        ccedilla
+<Multi_key> <cedilla> <c>              : "\347"        ccedilla
+<Multi_key> <minus> <D>                        : "\320"        ETH
+<Multi_key> <D> <minus>                        : "\320"        ETH
+<Multi_key> <minus> <d>                        : "\360"        eth
+<Multi_key> <d> <minus>                        : "\360"        eth
+<Multi_key> <E> <grave>                        : "\310"        Egrave
+<Multi_key> <grave> <E>                        : "\310"        Egrave
+<Multi_key> <E> <acute>                        : "\311"        Eacute
+<Multi_key> <acute> <E>                        : "\311"        Eacute
+<Multi_key> <E> <apostrophe>           : "\311"        Eacute
+<Multi_key> <apostrophe> <E>           : "\311"        Eacute
+<Multi_key> <E> <asciicircum>          : "\312"        Ecircumflex
+<Multi_key> <asciicircum> <E>          : "\312"        Ecircumflex
+<Multi_key> <E> <greater>              : "\312"        Ecircumflex
+<Multi_key> <greater> <E>              : "\312"        Ecircumflex
+<Multi_key> <E> <quotedbl>             : "\313"        Ediaeresis
+<Multi_key> <quotedbl> <E>             : "\313"        Ediaeresis
+<Multi_key> <E> <diaeresis>            : "\313"        Ediaeresis
+<Multi_key> <diaeresis> <E>            : "\313"        Ediaeresis
+<Multi_key> <e> <grave>                        : "\350"        egrave
+<Multi_key> <grave> <e>                        : "\350"        egrave
+<Multi_key> <e> <acute>                        : "\351"        eacute
+<Multi_key> <acute> <e>                        : "\351"        eacute
+<Multi_key> <e> <apostrophe>           : "\351"        eacute
+<Multi_key> <apostrophe> <e>           : "\351"        eacute
+<Multi_key> <e> <asciicircum>          : "\352"        ecircumflex
+<Multi_key> <asciicircum> <e>          : "\352"        ecircumflex
+<Multi_key> <e> <greater>              : "\352"        ecircumflex
+<Multi_key> <greater> <e>              : "\352"        ecircumflex
+<Multi_key> <e> <quotedbl>             : "\353"        ediaeresis
+<Multi_key> <quotedbl> <e>             : "\353"        ediaeresis
+<Multi_key> <e> <diaeresis>            : "\353"        ediaeresis
+<Multi_key> <diaeresis> <e>            : "\353"        ediaeresis
+<Multi_key> <G> <U>                     : "\253"        Gbreve
+<Multi_key> <G> <parenleft>             : "\253"        Gbreve
+<Multi_key> <parenleft> <G>             : "\253"        Gbreve
+<Multi_key> <G> <breve>                 : "\253"        Gbreve
+<Multi_key> <breve> <G>                 : "\253"        Gbreve
+<Multi_key> <G> <period>                : "\325"        Gabovedot
+<Multi_key> <period> <G>                : "\325"        Gabovedot
+<Multi_key> <G> <asciicircum>           : "\330"        Gcircumflex
+<Multi_key> <asciicircum> <G>           : "\330"        Gcircumflex
+<Multi_key> <G> <greater>               : "\330"        Gcircumflex
+<Multi_key> <greater> <G>               : "\330"        Gcircumflex
+<Multi_key> <g> <U>                    : "\273"        gbreve
+<Multi_key> <g> <parenleft>             : "\273"        gbreve
+<Multi_key> <parenleft> <g>             : "\273"        gbreve
+<Multi_key> <g> <breve>                        : "\273"        gbreve
+<Multi_key> <breve> <g>                        : "\273"        gbreve
+<Multi_key> <g> <period>                : "\365"        gabovedot
+<Multi_key> <period> <g>                : "\365"        gabovedot
+<Multi_key> <g> <asciicircum>           : "\370"        gcircumflex
+<Multi_key> <asciicircum> <g>           : "\370"        gcircumflex
+<Multi_key> <g> <greater>               : "\370"        gcircumflex
+<Multi_key> <greater> <g>               : "\370"        gcircumflex
+<Multi_key> <H> <minus>                 : "\241"        Hstroke
+<Multi_key> <minus> <H>                 : "\241"        Hstroke
+<Multi_key> <H> <asciicircum>           : "\246"        Hcircumflex
+<Multi_key> <asciicircum> <H>           : "\246"        Hcircumflex
+<Multi_key> <H> <greater>               : "\246"        Hcircumflex
+<Multi_key> <greater> <H>               : "\246"        Hcircumflex
+<Multi_key> <h> <minus>                 : "\261"        hstroke
+<Multi_key> <minus> <h>                 : "\261"        hstroke
+<Multi_key> <h> <asciicircum>           : "\266"        hcircumflex
+<Multi_key> <asciicircum> <h>           : "\266"        hcircumflex
+<Multi_key> <h> <greater>               : "\266"        hcircumflex
+<Multi_key> <greater> <h>               : "\266"        hcircumflex
+<Multi_key> <I> <period>                : "\251"        Iabovedot
+<Multi_key> <period> <I>                : "\251"        Iabovedot
+<Multi_key> <I> <grave>                        : "\314"        Igrave
+<Multi_key> <grave> <I>                        : "\314"        Igrave
+<Multi_key> <I> <acute>                        : "\315"        Iacute
+<Multi_key> <acute> <I>                        : "\315"        Iacute
+<Multi_key> <I> <apostrophe>           : "\315"        Iacute
+<Multi_key> <apostrophe> <I>           : "\315"        Iacute
+<Multi_key> <I> <asciicircum>          : "\316"        Icircumflex
+<Multi_key> <asciicircum> <I>          : "\316"        Icircumflex
+<Multi_key> <I> <greater>              : "\316"        Icircumflex
+<Multi_key> <greater> <I>              : "\316"        Icircumflex
+<Multi_key> <I> <quotedbl>             : "\317"        Idiaeresis
+<Multi_key> <quotedbl> <I>             : "\317"        Idiaeresis
+<Multi_key> <I> <diaeresis>            : "\317"        Idiaeresis
+<Multi_key> <diaeresis> <I>            : "\317"        Idiaeresis
+<Multi_key> <i> <period>                : "\271"        idotless
+<Multi_key> <period> <i>                : "\271"        idotless
+<Multi_key> <i> <grave>                        : "\354"        igrave
+<Multi_key> <grave> <i>                        : "\354"        igrave
+<Multi_key> <i> <acute>                        : "\355"        iacute
+<Multi_key> <acute> <i>                        : "\355"        iacute
+<Multi_key> <i> <apostrophe>           : "\355"        iacute
+<Multi_key> <apostrophe> <i>           : "\355"        iacute
+<Multi_key> <i> <asciicircum>          : "\356"        icircumflex
+<Multi_key> <asciicircum> <i>          : "\356"        icircumflex
+<Multi_key> <i> <greater>              : "\356"        icircumflex
+<Multi_key> <greater> <i>              : "\356"        icircumflex
+<Multi_key> <i> <quotedbl>             : "\357"        idiaeresis
+<Multi_key> <quotedbl> <i>             : "\357"        idiaeresis
+<Multi_key> <i> <diaeresis>            : "\357"        idiaeresis
+<Multi_key> <diaeresis> <i>            : "\357"        idiaeresis
+<Multi_key> <J> <asciicircum>           : "\254"        Jcircumflex
+<Multi_key> <asciicircum> <J>           : "\254"        Jcircumflex
+<Multi_key> <J> <greater>               : "\254"        Jcircumflex
+<Multi_key> <greater> <J>               : "\254"        Jcircumflex
+<Multi_key> <j> <asciicircum>           : "\274"        jcircumflex
+<Multi_key> <asciicircum> <j>           : "\274"        jcircumflex
+<Multi_key> <j> <greater>               : "\274"        jcircumflex
+<Multi_key> <greater> <j>               : "\274"        jcircumflex
+<Multi_key> <O> <grave>                        : "\322"        Ograve
+<Multi_key> <grave> <O>                        : "\322"        Ograve
+<Multi_key> <O> <acute>                        : "\323"        Oacute
+<Multi_key> <acute> <O>                        : "\323"        Oacute
+<Multi_key> <O> <apostrophe>           : "\323"        Oacute
+<Multi_key> <apostrophe> <O>           : "\323"        Oacute
+<Multi_key> <O> <asciicircum>          : "\324"        Ocircumflex
+<Multi_key> <asciicircum> <O>          : "\324"        Ocircumflex
+<Multi_key> <O> <greater>              : "\324"        Ocircumflex
+<Multi_key> <greater> <O>              : "\324"        Ocircumflex
+<Multi_key> <O> <asciitilde>           : "\325"        Otilde
+<Multi_key> <asciitilde> <O>           : "\325"        Otilde
+<Multi_key> <O> <minus>                        : "\325"        Otilde
+<Multi_key> <minus> <O>                        : "\325"        Otilde
+<Multi_key> <O> <quotedbl>             : "\326"        Odiaeresis
+<Multi_key> <quotedbl> <O>             : "\326"        Odiaeresis
+<Multi_key> <O> <diaeresis>            : "\326"        Odiaeresis
+<Multi_key> <diaeresis> <O>            : "\326"        Odiaeresis
+<Multi_key> <o> <grave>                        : "\362"        ograve
+<Multi_key> <grave> <o>                        : "\362"        ograve
+<Multi_key> <o> <acute>                        : "\363"        oacute
+<Multi_key> <acute> <o>                        : "\363"        oacute
+<Multi_key> <o> <apostrophe>           : "\363"        oacute
+<Multi_key> <apostrophe> <o>           : "\363"        oacute
+<Multi_key> <o> <asciicircum>          : "\364"        ocircumflex
+<Multi_key> <asciicircum> <o>          : "\364"        ocircumflex
+<Multi_key> <o> <greater>              : "\364"        ocircumflex
+<Multi_key> <greater> <o>              : "\364"        ocircumflex
+<Multi_key> <o> <asciitilde>           : "\365"        otilde
+<Multi_key> <asciitilde> <o>           : "\365"        otilde
+<Multi_key> <o> <minus>                        : "\365"        otilde
+<Multi_key> <minus> <o>                        : "\365"        otilde
+<Multi_key> <o> <quotedbl>             : "\366"        odiaeresis
+<Multi_key> <quotedbl> <o>             : "\366"        odiaeresis
+<Multi_key> <o> <diaeresis>            : "\366"        odiaeresis
+<Multi_key> <diaeresis> <o>            : "\366"        odiaeresis
+<Multi_key> <S> <cedilla>               : "\252"        Scedilla
+<Multi_key> <S> <comma>                 : "\252"        Scedilla
+<Multi_key> <cedilla> <S>               : "\252"        Scedilla
+<Multi_key> <cedilla> <s>               : "\272"        scedilla
+<Multi_key> <comma> <S>                 : "\252"        Scedilla
+<Multi_key> <comma> <s>                 : "\272"        scedilla
+<Multi_key> <s> <cedilla>               : "\272"        scedilla
+<Multi_key> <s> <comma>                 : "\272"        scedilla
+<Multi_key> <S> <asciicircum>           : "\336"        Scircumflex
+<Multi_key> <asciicircum> <S>           : "\336"        Scircumflex
+<Multi_key> <S> <greater>               : "\336"        Scircumflex
+<Multi_key> <greater> <S>               : "\336"        Scircumflex
+<Multi_key> <s> <asciicircum>           : "\376"        scircumflex
+<Multi_key> <asciicircum> <s>           : "\376"        scircumflex
+<Multi_key> <s> <greater>               : "\376"        scircumflex
+<Multi_key> <greater> <s>               : "\376"        scircumflex
+<Multi_key> <U> <grave>                        : "\331"        Ugrave
+<Multi_key> <grave> <U>                        : "\331"        Ugrave
+<Multi_key> <U> <acute>                        : "\332"        Uacute
+<Multi_key> <acute> <U>                        : "\332"        Uacute
+<Multi_key> <U> <apostrophe>           : "\332"        Uacute
+<Multi_key> <apostrophe> <U>           : "\332"        Uacute
+<Multi_key> <U> <asciicircum>          : "\333"        Ucircumflex
+<Multi_key> <asciicircum> <U>          : "\333"        Ucircumflex
+<Multi_key> <U> <greater>              : "\333"        Ucircumflex
+<Multi_key> <greater> <U>              : "\333"        Ucircumflex
+<Multi_key> <U> <quotedbl>             : "\334"        Udiaeresis
+<Multi_key> <quotedbl> <U>             : "\334"        Udiaeresis
+<Multi_key> <U> <diaeresis>            : "\334"        Udiaeresis
+<Multi_key> <diaeresis> <U>            : "\334"        Udiaeresis
+<Multi_key> <U> <U>                     : "\335"        Ubreve
+<Multi_key> <U> <parenleft>             : "\335"        Ubreve
+<Multi_key> <parenleft> <U>             : "\335"        Ubreve
+<Multi_key> <U> <breve>                 : "\335"        Ubreve
+<Multi_key> <breve> <U>                 : "\335"        Ubreve
+<Multi_key> <u> <grave>                        : "\371"        ugrave
+<Multi_key> <grave> <u>                        : "\371"        ugrave
+<Multi_key> <u> <acute>                        : "\372"        uacute
+<Multi_key> <acute> <u>                        : "\372"        uacute
+<Multi_key> <u> <apostrophe>           : "\372"        uacute
+<Multi_key> <apostrophe> <u>           : "\372"        uacute
+<Multi_key> <u> <asciicircum>          : "\373"        ucircumflex
+<Multi_key> <asciicircum> <u>          : "\373"        ucircumflex
+<Multi_key> <u> <greater>              : "\373"        ucircumflex
+<Multi_key> <greater> <u>              : "\373"        ucircumflex
+<Multi_key> <u> <quotedbl>             : "\374"        udiaeresis
+<Multi_key> <quotedbl> <u>             : "\374"        udiaeresis
+<Multi_key> <u> <diaeresis>            : "\374"        udiaeresis
+<Multi_key> <diaeresis> <u>            : "\374"        udiaeresis
+<Multi_key> <u> <U>                     : "\375"        ubreve
+<Multi_key> <u> <parenleft>             : "\375"        ubreve
+<Multi_key> <parenleft> <u>             : "\375"        ubreve
+<Multi_key> <u> <breve>                 : "\375"        ubreve
+<Multi_key> <breve> <u>                 : "\375"        ubreve
+<Multi_key> <s> <s>                    : "\337"        ssharp
+<Multi_key> <Y> <acute>                        : "\335"        Yacute
+<Multi_key> <acute> <Y>                        : "\335"        Yacute
+<Multi_key> <Y> <apostrophe>           : "\335"        Yacute
+<Multi_key> <apostrophe> <Y>           : "\335"        Yacute
+<Multi_key> <Y> <quotedbl>             : "\276"        Ydiaeresis
+<Multi_key> <quotedbl> <Y>             : "\276"        Ydiaeresis
+<Multi_key> <Y> <diaeresis>            : "\276"        Ydiaeresis
+<Multi_key> <diaeresis> <Y>            : "\276"        Ydiaeresis
+<Multi_key> <y> <acute>                        : "\375"        yacute
+<Multi_key> <acute> <y>                        : "\375"        yacute
+<Multi_key> <y> <apostrophe>           : "\375"        yacute
+<Multi_key> <apostrophe> <y>           : "\375"        yacute
+<Multi_key> <y> <quotedbl>             : "\377"        ydiaeresis
+<Multi_key> <quotedbl> <y>             : "\377"        ydiaeresis
+<Multi_key> <y> <diaeresis>            : "\377"        ydiaeresis
+<Multi_key> <diaeresis> <y>            : "\377"        ydiaeresis
+<Multi_key> <Z> <period>               : "\257"        Zabovedot
+<Multi_key> <period> <Z>               : "\257"        Zabovedot
+<Multi_key> <z> <period>               : "\277"        zabovedot
+<Multi_key> <period> <z>                : "\277"        zabovedot
+XCOMM
+XCOMM dead key accent keysyms
+XCOMM Special Character
+<dead_circumflex>  <slash>             : "|"   bar
+<dead_grave> <space>                   : "`"   grave
+<dead_acute> <space>                   : "'"   apostrophe
+<dead_diaeresis> <space>               : "\250"        diaeresis
+<dead_circumflex> <space>              : "^"   asciicircum
+<dead_tilde> <space>                   : "~"   asciitilde
+<dead_circumflex> <0>                  : "\260"        degree
+<dead_circumflex> <1>                  : "\271"        onesuperior
+<dead_circumflex> <2>                  : "\262"        twosuperior
+<dead_circumflex> <3>                  : "\263"        threesuperior
+<dead_circumflex> <period>             : "\267"        periodcentered
+<dead_cedilla> <minus>                 : "\254"        notsign
+<dead_circumflex> <minus>              : "\257"        macron
+<dead_circumflex> <underscore>         : "\257"        macron
+<dead_acute> <apostrophe>              : "\264"        acute
+<dead_cedilla> <comma>                 : "\270"        cedilla
+<dead_diaeresis> <quotedbl>            : "\250"        diaeresis
+XCOMM Accented Alphabet
+<dead_abovering> <A>                    : "\305"        Aring
+<dead_abovering> <a>                    : "\345"        aring
+<dead_grave> <A>                       : "\300"        Agrave
+<dead_acute> <A>                       : "\301"        Aacute
+<dead_circumflex> <A>                  : "\302"        Acircumflex
+<dead_tilde> <A>                       : "\303"        Atilde
+<dead_diaeresis> <A>                   : "\304"        Adiaeresis
+<dead_grave> <a>                       : "\340"        agrave
+<dead_acute> <a>                       : "\341"        aacute
+<dead_circumflex> <a>                  : "\342"        acircumflex
+<dead_tilde> <a>                       : "\343"        atilde
+<dead_diaeresis> <a>                   : "\344"        adiaeresis
+<dead_cedilla> <C>                     : "\307"        Ccedilla
+<dead_circumflex> <C>                  : "\306"        Ccircumflex
+<dead_abovedot> <C>                    : "\305"        Cabovedot
+<dead_cedilla> <c>                     : "\347"        ccedilla
+<dead_circumflex> <c>                  : "\346"        ccircumflex
+<dead_abovedot> <c>                    : "\345"        cabovedot
+<dead_grave> <E>                       : "\310"        Egrave
+<dead_acute> <E>                       : "\311"        Eacute
+<dead_circumflex> <E>                  : "\312"        Ecircumflex
+<dead_diaeresis> <E>                   : "\313"        Ediaeresis
+<dead_grave> <e>                       : "\350"        egrave
+<dead_acute> <e>                       : "\351"        eacute
+<dead_circumflex> <e>                  : "\352"        ecircumflex
+<dead_diaeresis> <e>                   : "\353"        ediaeresis
+<dead_breve> <G>                       : "\253"        Gbreve
+<dead_circumflex> <G>                  : "\330"        Gcircumflex
+<dead_breve> <g>                        : "\273"        gbreve
+<dead_circumflex> <g>                   : "\370"        gcircumflex
+<dead_circumflex> <H>                   : "\246"        Hcircumflex
+<dead_circumflex> <h>                   : "\266"        hcircumflex
+<dead_grave> <I>                       : "\314"        Igrave
+<dead_acute> <I>                       : "\315"        Iacute
+<dead_circumflex> <I>                  : "\316"        Icircumflex
+<dead_diaeresis> <I>                   : "\317"        Idiaeresis
+<dead_abovedot> <I>                    : "\251"        Iabovedot
+<dead_grave> <i>                       : "\354"        igrave
+<dead_acute> <i>                       : "\355"        iacute
+<dead_circumflex> <i>                  : "\356"        icircumflex
+<dead_diaeresis> <i>                   : "\357"        idiaeresis
+<dead_abovedot> <i>                    : "\271"        idotless
+<dead_circumflex> <J>                  : "\254"        Jcircumflex
+<dead_circumflex> <j>                  : "\274"        jcircumflex
+<dead_tilde> <N>                       : "\321"        Ntilde
+<dead_tilde> <n>                       : "\361"        ntilde
+<dead_grave> <O>                       : "\322"        Ograve
+<dead_acute> <O>                       : "\323"        Oacute
+<dead_circumflex> <O>                  : "\324"        Ocircumflex
+<dead_tilde> <O>                       : "\325"        Otilde
+<dead_diaeresis> <O>                   : "\326"        Odiaeresis
+<dead_grave> <o>                       : "\362"        ograve
+<dead_acute> <o>                       : "\363"        oacute
+<dead_circumflex> <o>                  : "\364"        ocircumflex
+<dead_tilde> <o>                       : "\365"        otilde
+<dead_diaeresis> <o>                   : "\366"        odiaeresis
+<dead_caron> <S>                       : "\246"        Scaron
+<dead_cedilla> <S>                     : "\252"        Scedilla
+<dead_circumflex> <S>                  : "\336"        Scircumflex
+<dead_caron> <s>                       : "\250"        scaron
+<dead_cedilla> <s>                     : "\272"        scedilla
+<dead_circumflex> <s>                  : "\376"        scircumflex
+<dead_breve> <U>                       : "\335"        Ubreve
+<dead_grave> <U>                       : "\331"        Ugrave
+<dead_acute> <U>                       : "\332"        Uacute
+<dead_circumflex> <U>                  : "\333"        Ucircumflex
+<dead_diaeresis> <U>                   : "\334"        Udiaeresis
+<dead_breve> <u>                       : "\375"        ubreve
+<dead_grave> <u>                       : "\371"        ugrave
+<dead_acute> <u>                       : "\372"        uacute
+<dead_circumflex> <u>                  : "\373"        ucircumflex
+<dead_diaeresis> <u>                   : "\374"        udiaeresis
+<dead_acute> <Y>                       : "\335"        Yacute
+<dead_diaeresis> <Y>                   : "\276"        Ydiaeresis
+<dead_acute> <y>                       : "\375"        yacute
+<dead_diaeresis> <y>                   : "\377"        ydiaeresis
+<dead_caron> <Z>                       : "\264"        Zcaron
+<dead_abovedot> <Z>                    : "\257"        Zabovedot
+<dead_caron> <z>                       : "\270"        zcaron
+<dead_abovedot> <z>                    : "\277"        zabovedot
+XCOMM End of Sequence Definition
diff --git a/nls/iso8859-3/XI18N_OBJS b/nls/iso8859-3/XI18N_OBJS
new file mode 100644 (file)
index 0000000..1f39eba
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for iso8859-3 locale
+#
+XLC    common/xlcDef   _XlcDefaultLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/iso8859-3/XLC_LOCALE.pre b/nls/iso8859-3/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..e8f9e77
--- /dev/null
@@ -0,0 +1,72 @@
+XCOMM  XLocale Database Sample for iso8859-3.
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class 
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         ISO8859-3:GL
+               substitute      ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset {
+               name            ISO8859-3:GR
+       }
+       font    {
+               primary         ISO8859-3:GR
+       }
+}
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          ISO8859-3
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+force_convert_to_mb    True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     ISO8859-3:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     ISO8859-3:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/iso8859-4/Compose.pre b/nls/iso8859-4/Compose.pre
new file mode 100644 (file)
index 0000000..7448045
--- /dev/null
@@ -0,0 +1,374 @@
+XCOMM
+XCOMM ISO 8859-4 (Latin4) Compose Sequence
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+XCOMM Right-hand side (Accented Alphabet)
+XCOMM These compose sequences are pure supposition on my part.
+XCOMM It would be nice to know what the real cultural conventions
+XCOMM are for compose sequences.
+<Multi_key> <A> <comma>                        : "\241"        Aogonek
+<Multi_key> <comma> <A>                        : "\241"        Aogonek
+<Multi_key> <k> <k>                    : "\242"        kra
+<Multi_key> <R> <comma>                        : "\243"        Rcedilla
+<Multi_key> <R> <cedilla>              : "\243"        Rcedilla
+<Multi_key> <comma> <R>                        : "\243"        Rcedilla
+<Multi_key> <cedilla> <R>              : "\243"        Rcedilla
+<Multi_key> <x> <o>                    : "\244"        currency
+<Multi_key> <o> <x>                    : "\244"        currency
+<Multi_key> <X> <O>                    : "\244"        currency
+<Multi_key> <O> <X>                    : "\244"        currency
+<Multi_key> <x> <O>                    : "\244"        currency
+<Multi_key> <O> <x>                    : "\244"        currency
+<Multi_key> <X> <o>                    : "\244"        currency
+<Multi_key> <o> <X>                    : "\244"        currency
+<Multi_key> <x> <0>                    : "\244"        currency
+<Multi_key> <0> <x>                    : "\244"        currency
+<Multi_key> <X> <0>                    : "\244"        currency
+<Multi_key> <0> <X>                    : "\244"        currency
+<Multi_key> <I> <asciitilde>           : "\245"        Itilde
+<Multi_key> <asciitilde> <I>           : "\245"        Itilde
+<Multi_key> <L> <comma>                        : "\246"        Lcedilla
+<Multi_key> <L> <cedilla>              : "\246"        Lcedilla
+<Multi_key> <comma> <L>                        : "\246"        Lcedilla
+<Multi_key> <cedilla> <L>              : "\246"        Lcedilla
+<Multi_key> <s> <o>                    : "\247"        section
+<Multi_key> <o> <s>                    : "\247"        section
+<Multi_key> <S> <O>                    : "\247"        section
+<Multi_key> <O> <S>                    : "\247"        section
+<Multi_key> <S> <exclam>               : "\247"        section
+<Multi_key> <exclam> <S>               : "\247"        section
+<Multi_key> <s> <exclam>               : "\247"        section
+<Multi_key> <exclam> <s>               : "\247"        section
+<Multi_key> <S> <0>                    : "\247"        section
+<Multi_key> <0> <S>                    : "\247"        section
+<Multi_key> <s> <0>                    : "\247"        section
+<Multi_key> <0> <s>                    : "\247"        section
+<Multi_key> <quotedbl> <quotedbl>      : "\250"        diaeresis
+<Multi_key> <S> <less>                 : "\251"        Scaron
+<Multi_key> <less> <S>                 : "\251"        Scaron
+<Multi_key> <E> <minus>                        : "\252"        Emacron
+<Multi_key> <minus> <E>                        : "\252"        Emacron
+<Multi_key> <E> <underscore>           : "\252"        Emacron
+<Multi_key> <underscore> <E>           : "\252"        Emacron
+<Multi_key> <G> <comma>                        : "\253"        Gcedilla
+<Multi_key> <G> <cedilla>              : "\253"        Gcedilla
+<Multi_key> <comma> <G>                        : "\253"        Gcedilla
+<Multi_key> <cedilla> <G>              : "\253"        Gcedilla
+<Multi_key> <T> <minus>                        : "\254"        Tstroke
+<Multi_key> <T> <slash>                        : "\254"        Tstroke
+<Multi_key> <slash> <T>                        : "\254"        Tstroke
+<Multi_key> <minus> <minus>            : "\255"        hyphen
+<Multi_key> <Z> <less>                 : "\256"        Zcaron
+<Multi_key> <less> <Z>                 : "\256"        Zcaron
+<Multi_key> <minus> <asciicircum>      : "\257"        macron
+<Multi_key> <asciicircum> <minus>      : "\257"        macron
+<Multi_key> <underscore> <asciicircum> : "\257"        macron
+<Multi_key> <asciicircum> <underscore> : "\257"        macron
+<Multi_key> <underscore> <underscore>  : "\257"        macron
+<Multi_key> <0> <asterisk>             : "\260"        degree
+<Multi_key> <asterisk> <0>             : "\260"        degree
+<Multi_key> <a> <comma>                        : "\261"        aogonek
+<Multi_key> <comma> <a>                        : "\261"        aogonek
+<Multi_key> <r> <comma>                        : "\263"        rcedilla
+<Multi_key> <r> <cedilla>              : "\263"        rcedilla
+<Multi_key> <comma> <r>                        : "\263"        rcedilla
+<Multi_key> <cedilla> <r>              : "\263"        rcedilla
+<Multi_key> <apostrophe> <apostrophe>  : "\264"        acute
+<Multi_key> <i> <asciitilde>           : "\265"        itilde
+<Multi_key> <asciitilde> <i>           : "\265"        itilde
+<Multi_key> <l> <comma>                        : "\266"        lcedilla
+<Multi_key> <l> <cedilla>              : "\266"        lcedilla
+<Multi_key> <comma> <l>                        : "\266"        lcedilla
+<Multi_key> <cedilla> <l>              : "\266"        lcedilla
+<Multi_key> <less> <less>              : "\267"        caron
+<Multi_key> <comma> <comma>            : "\270"        cedilla
+<Multi_key> <s> <less>                 : "\271"        scaron
+<Multi_key> <less> <s>                 : "\271"        scaron
+<Multi_key> <e> <minus>                        : "\272"        emacron
+<Multi_key> <minus> <e>                        : "\272"        emacron
+<Multi_key> <e> <underscore>           : "\272"        emacron
+<Multi_key> <underscore> <e>           : "\272"        emacron
+<Multi_key> <g> <comma>                        : "\273"        gcedilla
+<Multi_key> <g> <cedilla>              : "\273"        gcedilla
+<Multi_key> <comma> <g>                        : "\273"        gcedilla
+<Multi_key> <cedilla> <g>              : "\273"        gcedilla
+<Multi_key> <t> <minus>                        : "\274"        tstroke
+<Multi_key> <t> <slash>                        : "\274"        tstroke
+<Multi_key> <slash> <t>                        : "\274"        tstroke
+<Multi_key> <N> <G>                    : "\275"        ENG
+<Multi_key> <z> <less>                 : "\276"        zcaron
+<Multi_key> <less> <z>                 : "\276"        zcaron
+<Multi_key> <n> <g>                    : "\277"        eng
+<Multi_key> <A> <underscore>           : "\300"        Amacron
+<Multi_key> <underscore> <A>           : "\300"        Amacron
+<Multi_key> <A> <minus>                        : "\300"        Amacron
+<Multi_key> <minus> <A>                        : "\300"        Amacron
+<Multi_key> <A> <acute>                        : "\301"        Aacute
+<Multi_key> <acute> <A>                        : "\301"        Aacute
+<Multi_key> <A> <apostrophe>           : "\301"        Aacute
+<Multi_key> <apostrophe> <A>           : "\301"        Aacute
+<Multi_key> <A> <asciicircum>          : "\302"        Acircumflex
+<Multi_key> <asciicircum> <A>          : "\302"        Acircumflex
+<Multi_key> <A> <greater>              : "\302"        Acircumflex
+<Multi_key> <greater> <A>              : "\302"        Acircumflex
+<Multi_key> <A> <asciitilde>           : "\303"        Atilde
+<Multi_key> <asciitilde> <A>           : "\303"        Atilde
+<Multi_key> <A> <quotedbl>             : "\304"        Adiaeresis
+<Multi_key> <quotedbl> <A>             : "\304"        Adiaeresis
+<Multi_key> <A> <asterisk>             : "\305"        Aring
+<Multi_key> <asterisk> <A>             : "\305"        Aring
+<Multi_key> <A> <E>                    : "\306"        AE
+<Multi_key> <I> <comma>                        : "\307"        Iogonek
+<Multi_key> <comma> <I>                        : "\307"        Iogonek
+<Multi_key> <C> <less>                 : "\310"        Ccaron
+<Multi_key> <less> <C>                 : "\310"        Ccaron
+<Multi_key> <E> <acute>                        : "\311"        Eacute
+<Multi_key> <acute> <E>                        : "\311"        Eacute
+<Multi_key> <E> <apostrophe>           : "\311"        Eacute
+<Multi_key> <apostrophe> <E>           : "\311"        Eacute
+<Multi_key> <E> <comma>                        : "\312"        Eogonek
+<Multi_key> <comma> <E>                        : "\312"        Eogonek
+<Multi_key> <E> <quotedbl>             : "\313"        Ediaeresis
+<Multi_key> <quotedbl> <E>             : "\313"        Ediaeresis
+<Multi_key> <E> <period>               : "\314"        Eabovedot
+<Multi_key> <period> <E>               : "\314"        Eabovedot
+<Multi_key> <I> <acute>                        : "\315"        Iacute
+<Multi_key> <acute> <I>                        : "\315"        Iacute
+<Multi_key> <I> <apostrophe>           : "\315"        Iacute
+<Multi_key> <apostrophe> <I>           : "\315"        Iacute
+<Multi_key> <I> <asciicircum>          : "\316"        Icircumflex
+<Multi_key> <asciicircum> <I>          : "\316"        Icircumflex
+<Multi_key> <I> <greater>              : "\316"        Icircumflex
+<Multi_key> <greater> <I>              : "\316"        Icircumflex
+<Multi_key> <I> <minus>                        : "\317"        Imacron
+<Multi_key> <minus> <I>                        : "\317"        Imacron
+<Multi_key> <I> <underscore>           : "\317"        Imacron
+<Multi_key> <underscore> <I>           : "\317"        Imacron
+<Multi_key> <D> <minus>                        : "\320"        Dstroke
+<Multi_key> <minus> <D>                        : "\320"        Dstroke
+<Multi_key> <N> <comma>                        : "\321"        Ncedilla
+<Multi_key> <N> <cedilla>              : "\321"        Ncedilla
+<Multi_key> <comma> <N>                        : "\321"        Ncedilla
+<Multi_key> <cedilla> <N>              : "\321"        Ncedilla
+<Multi_key> <O> <underscore>           : "\322"        Omacron
+<Multi_key> <underscore> <O>           : "\322"        Omacron
+<Multi_key> <O> <minus>                        : "\322"        Omacron
+<Multi_key> <minus> <O>                        : "\322"        Omacron
+<Multi_key> <K> <comma>                        : "\323"        Kcedilla
+<Multi_key> <K> <cedilla>              : "\323"        Kcedilla
+<Multi_key> <comma> <K>                        : "\323"        Kcedilla
+<Multi_key> <cedilla> <K>              : "\323"        Kcedilla
+<Multi_key> <O> <asciicircum>          : "\324"        Ocircumflex
+<Multi_key> <asciicircum> <O>          : "\324"        Ocircumflex
+<Multi_key> <O> <greater>              : "\324"        Ocircumflex
+<Multi_key> <greater> <O>              : "\324"        Ocircumflex
+<Multi_key> <O> <asciitilde>           : "\325"        Otilde
+<Multi_key> <asciitilde> <O>           : "\325"        Otilde
+<Multi_key> <O> <quotedbl>             : "\326"        Odiaeresis
+<Multi_key> <quotedbl> <O>             : "\326"        Odiaeresis
+<Multi_key> <x> <x>                    : "\327"        multiply
+<Multi_key> <O> <slash>                        : "\330"        Ooblique
+<Multi_key> <slash> <O>                        : "\330"        Ooblique
+<Multi_key> <U> <comma>                        : "\331"        Uogonek
+<Multi_key> <comma> <U>                        : "\331"        Uogonek
+<Multi_key> <U> <acute>                        : "\332"        Uacute
+<Multi_key> <acute> <U>                        : "\332"        Uacute
+<Multi_key> <U> <apostrophe>           : "\332"        Uacute
+<Multi_key> <apostrophe> <U>           : "\332"        Uacute
+<Multi_key> <U> <asciicircum>          : "\333"        Ucircumflex
+<Multi_key> <asciicircum> <U>          : "\333"        Ucircumflex
+<Multi_key> <U> <greater>              : "\333"        Ucircumflex
+<Multi_key> <greater> <U>              : "\333"        Ucircumflex
+<Multi_key> <U> <quotedbl>             : "\334"        Udiaeresis
+<Multi_key> <quotedbl> <U>             : "\334"        Udiaeresis
+<Multi_key> <U> <asciitilde>           : "\335"        Utilde
+<Multi_key> <asciitilde> <U>           : "\335"        Utilde
+<Multi_key> <U> <underscore>           : "\336"        Umacron
+<Multi_key> <underscore> <U>           : "\336"        Umacron
+<Multi_key> <U> <minus>                        : "\336"        Umacron
+<Multi_key> <minus> <U>                        : "\336"        Umacron
+<Multi_key> <s> <s>                    : "\337"        ssharp
+<Multi_key> <a> <underscore>           : "\340"        amacron
+<Multi_key> <underscore> <a>           : "\340"        amacron
+<Multi_key> <a> <minus>                        : "\340"        amacron
+<Multi_key> <minus> <a>                        : "\340"        amacron
+<Multi_key> <a> <acute>                        : "\341"        aacute
+<Multi_key> <acute> <a>                        : "\341"        aacute
+<Multi_key> <a> <apostrophe>           : "\341"        aacute
+<Multi_key> <apostrophe> <a>           : "\341"        aacute
+<Multi_key> <a> <asciicircum>          : "\342"        acircumflex
+<Multi_key> <asciicircum> <a>          : "\342"        acircumflex
+<Multi_key> <a> <greater>              : "\342"        acircumflex
+<Multi_key> <greater> <a>              : "\342"        acircumflex
+<Multi_key> <a> <asciitilde>           : "\343"        atilde
+<Multi_key> <asciitilde> <a>           : "\343"        atilde
+<Multi_key> <a> <quotedbl>             : "\344"        adiaeresis
+<Multi_key> <quotedbl> <a>             : "\344"        adiaeresis
+<Multi_key> <a> <asterisk>             : "\345"        aring
+<Multi_key> <asterisk> <a>             : "\345"        aring
+<Multi_key> <a> <e>                    : "\346"        ae
+<Multi_key> <i> <comma>                        : "\347"        iogonek
+<Multi_key> <comma> <i>                        : "\347"        iogonek
+<Multi_key> <c> <less>                 : "\350"        ccaron
+<Multi_key> <less> <c>                 : "\350"        ccaron
+<Multi_key> <e> <acute>                        : "\351"        eacute
+<Multi_key> <acute> <e>                        : "\351"        eacute
+<Multi_key> <e> <apostrophe>           : "\351"        eacute
+<Multi_key> <apostrophe> <e>           : "\351"        eacute
+<Multi_key> <e> <comma>                        : "\352"        eogonek
+<Multi_key> <comma> <e>                        : "\352"        eogonek
+<Multi_key> <e> <quotedbl>             : "\353"        ediaeresis
+<Multi_key> <quotedbl> <e>             : "\353"        ediaeresis
+<Multi_key> <e> <period>               : "\354"        eabovedot
+<Multi_key> <period> <e>               : "\354"        eabovedot
+<Multi_key> <i> <acute>                        : "\355"        iacute
+<Multi_key> <acute> <i>                        : "\355"        iacute
+<Multi_key> <i> <apostrophe>           : "\355"        iacute
+<Multi_key> <apostrophe> <i>           : "\355"        iacute
+<Multi_key> <i> <asciicircum>          : "\356"        icircumflex
+<Multi_key> <asciicircum> <i>          : "\356"        icircumflex
+<Multi_key> <i> <greater>              : "\356"        icircumflex
+<Multi_key> <greater> <i>              : "\356"        icircumflex
+<Multi_key> <i> <minus>                        : "\357"        imacron
+<Multi_key> <minus> <i>                        : "\357"        imacron
+<Multi_key> <i> <underscore>           : "\357"        imacron
+<Multi_key> <underscore> <i>           : "\357"        imacron
+<Multi_key> <d> <minus>                        : "\360"        dstroke
+<Multi_key> <minus> <d>                        : "\360"        dstroke
+<Multi_key> <n> <comma>                        : "\361"        ncedilla
+<Multi_key> <n> <cedilla>              : "\361"        ncedilla
+<Multi_key> <comma> <n>                        : "\361"        ncedilla
+<Multi_key> <cedilla> <n>              : "\361"        ncedilla
+<Multi_key> <o> <underscore>           : "\362"        omacron
+<Multi_key> <underscore> <o>           : "\362"        omacron
+<Multi_key> <o> <minus>                        : "\362"        omacron
+<Multi_key> <minus> <o>                        : "\362"        omacron
+<Multi_key> <k> <comma>                        : "\363"        kcedilla
+<Multi_key> <k> <cedilla>              : "\363"        kcedilla
+<Multi_key> <comma> <k>                        : "\363"        kcedilla
+<Multi_key> <cedilla> <k>              : "\363"        kcedilla
+<Multi_key> <o> <asciicircum>          : "\364"        ocircumflex
+<Multi_key> <asciicircum> <o>          : "\364"        ocircumflex
+<Multi_key> <o> <greater>              : "\364"        ocircumflex
+<Multi_key> <greater> <o>              : "\364"        ocircumflex
+<Multi_key> <o> <asciitilde>           : "\365"        otilde
+<Multi_key> <asciitilde> <o>           : "\365"        otilde
+<Multi_key> <o> <quotedbl>             : "\366"        odiaeresis
+<Multi_key> <quotedbl> <o>             : "\366"        odiaeresis
+<Multi_key> <minus> <colon>            : "\367"        division
+<Multi_key> <colon> <minus>            : "\367"        division
+
+<Multi_key> <o> <slash>                        : "\370"        ooblique
+<Multi_key> <slash> <o>                        : "\370"        ooblique
+<Multi_key> <u> <comma>                        : "\371"        uogonek
+<Multi_key> <comma> <u>                        : "\371"        uogonek
+<Multi_key> <u> <acute>                        : "\372"        uacute
+<Multi_key> <acute> <u>                        : "\372"        uacute
+<Multi_key> <u> <apostrophe>           : "\372"        uacute
+<Multi_key> <apostrophe> <u>           : "\372"        uacute
+<Multi_key> <u> <asciicircum>          : "\373"        ucircumflex
+<Multi_key> <asciicircum> <u>          : "\373"        ucircumflex
+<Multi_key> <u> <greater>              : "\373"        ucircumflex
+<Multi_key> <greater> <u>              : "\373"        ucircumflex
+<Multi_key> <u> <quotedbl>             : "\374"        udiaeresis
+<Multi_key> <quotedbl> <u>             : "\374"        udiaeresis
+<Multi_key> <u> <asciitilde>           : "\375"        utilde
+<Multi_key> <asciitilde> <u>           : "\375"        utilde
+<Multi_key> <u> <underscore>           : "\376"        umacron
+<Multi_key> <underscore> <u>           : "\376"        umacron
+<Multi_key> <u> <minus>                        : "\376"        umacron
+<Multi_key> <minus> <u>                        : "\376"        umacron
+<Multi_key> <period> <period>          : "\377"        abovedot
+
+<dead_abovedot> <E>                    : "\314"        Eabovedot
+<dead_abovedot> <e>                    : "\354"        eabovedot
+<dead_abovedot> <abovedot>             : "\377"        abovedot
+<dead_abovedot> <dead_abovedot>                : "\377"        abovedot
+<dead_abovering> <A>                   : "\305"        Aring
+<dead_abovering> <a>                   : "\345"        aring
+<dead_acute> <acute>                   : "\264"        acute
+<dead_acute> <dead_acute>              : "\264"        acute
+<dead_acute> <A>                       : "\301"        Aacute
+<dead_acute> <E>                       : "\311"        Eacute
+<dead_acute> <I>                       : "\315"        Iacute
+<dead_acute> <U>                       : "\332"        Uacute
+<dead_acute> <a>                       : "\341"        aacute
+<dead_acute> <e>                       : "\351"        eacute
+<dead_acute> <i>                       : "\355"        iacute
+<dead_acute> <u>                       : "\372"        uacute
+<dead_caron> <S>                       : "\251"        Scaron
+<dead_caron> <Z>                       : "\256"        Zcaron
+<dead_caron> <caron>                   : "\267"        caron
+<dead_caron> <dead_caron>              : "\267"        caron
+<dead_caron> <s>                       : "\271"        scaron
+<dead_caron> <z>                       : "\276"        zcaron
+<dead_caron> <C>                       : "\310"        Ccaron
+<dead_caron> <c>                       : "\350"        ccaron
+<dead_cedilla> <R>                     : "\243"        Rcedilla
+<dead_cedilla> <L>                     : "\246"        Lcedilla
+<dead_cedilla> <G>                     : "\253"        Gcedilla
+<dead_cedilla> <r>                     : "\263"        rcedilla
+<dead_cedilla> <l>                     : "\266"        lcedilla
+<dead_cedilla> <cedilla>               : "\270"        cedilla
+<dead_cedilla> <dead_cedilla>          : "\270"        cedilla
+<dead_cedilla> <g>                     : "\273"        gcedilla
+<dead_cedilla> <N>                     : "\321"        Ncedilla
+<dead_cedilla> <K>                     : "\323"        Kcedilla
+<dead_cedilla> <n>                     : "\361"        ncedilla
+<dead_cedilla> <k>                     : "\363"        kcedilla
+<dead_circumflex> <A>                  : "\302"        Acircumflex
+<dead_circumflex> <I>                  : "\316"        Icircumflex
+<dead_circumflex> <O>                  : "\324"        Ocircumflex
+<dead_circumflex> <U>                  : "\333"        Ucircumflex
+<dead_circumflex> <a>                  : "\342"        acircumflex
+<dead_circumflex> <i>                  : "\356"        icircumflex
+<dead_circumflex> <o>                  : "\364"        ocircumflex
+<dead_circumflex> <u>                  : "\373"        ucircumflex
+<dead_diaeresis> <diaeresis>           : "\250"        diaeresis
+<dead_diaeresis> <dead_diaeresis>      : "\250"        diaeresis
+<dead_diaeresis> <A>                   : "\304"        Adiaeresis
+<dead_diaeresis> <E>                   : "\313"        Ediaeresis
+<dead_diaeresis> <O>                   : "\326"        Odiaeresis
+<dead_diaeresis> <U>                   : "\334"        Udiaeresis
+<dead_diaeresis> <a>                   : "\344"        adiaeresis
+<dead_diaeresis> <e>                   : "\353"        ediaeresis
+<dead_diaeresis> <o>                   : "\366"        odiaeresis
+<dead_diaeresis> <u>                   : "\374"        udiaeresis
+<dead_macron> <E>                      : "\252"        Emacron
+<dead_macron> <macron>                 : "\257"        macron
+<dead_macron> <dead_macron>            : "\257"        macron
+<dead_macron> <e>                      : "\272"        emacron
+<dead_macron> <A>                      : "\300"        Amacron
+<dead_macron> <I>                      : "\317"        Imacron
+<dead_macron> <O>                      : "\322"        Omacron
+<dead_macron> <U>                      : "\336"        Umacron
+<dead_macron> <a>                      : "\340"        amacron
+<dead_macron> <i>                      : "\357"        imacron
+<dead_macron> <o>                      : "\362"        omacron
+<dead_macron> <u>                      : "\376"        umacron
+<dead_ogonek> <A>                      : "\241"        Aogonek
+<dead_ogonek> <a>                      : "\261"        aogonek
+<dead_ogonek> <ogonek>                 : "\262"        ogonek
+<dead_ogonek> <dead_ogonek>            : "\262"        ogonek
+<dead_ogonek> <I>                      : "\307"        Iogonek
+<dead_ogonek> <E>                      : "\312"        Eogonek
+<dead_ogonek> <U>                      : "\331"        Uogonek
+<dead_ogonek> <i>                      : "\347"        iogonek
+<dead_ogonek> <e>                      : "\352"        eogonek
+<dead_ogonek> <u>                      : "\371"        uogonek
+<dead_abovering> <ring>                        : "\260"        ring
+<dead_abovering> <dead_abovering>      : "\260"        ring
+<dead_tilde> <I>                       : "\245"        Itilde
+<dead_tilde> <i>                       : "\265"        itilde
+<dead_tilde> <A>                       : "\303"        Atilde
+<dead_tilde> <O>                       : "\325"        Otilde
+<dead_tilde> <U>                       : "\335"        Utilde
+<dead_tilde> <a>                       : "\343"        atilde
+<dead_tilde> <o>                       : "\365"        otilde
+<dead_tilde> <u>                       : "\375"        utilde
+<dead_tilde> <asciitilde>              : "~"           asciitilde
+<dead_tilde> <dead_tilde>              : "~"           asciitilde
+XCOMM End of Sequence Definition
diff --git a/nls/iso8859-4/XI18N_OBJS b/nls/iso8859-4/XI18N_OBJS
new file mode 100644 (file)
index 0000000..7404dab
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for iso8859-4 locale
+#
+XLC    common/xlcDef   _XlcDefaultLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/iso8859-4/XLC_LOCALE.pre b/nls/iso8859-4/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..9bf101d
--- /dev/null
@@ -0,0 +1,72 @@
+XCOMM  XLocale Database Sample for iso8859-4.
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class 
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         ISO8859-4:GL
+               substitute      ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset {
+               name            ISO8859-4:GR
+       }
+       font    {
+               primary         ISO8859-4:GR
+       }
+}
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          ISO8859-4
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+force_convert_to_mb    True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     ISO8859-4:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     ISO8859-4:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/iso8859-5/Compose.pre b/nls/iso8859-5/Compose.pre
new file mode 100644 (file)
index 0000000..01ee440
--- /dev/null
@@ -0,0 +1,14 @@
+XCOMM
+XCOMM ISO 8859-5 Compose Sequence
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM
+XCOMM This file currently has no entries.  It appears that a compose file (even
+XCOMM just an empty one) is required for the appropriate keysyms to work for
+XCOMM this encoding.
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+
+XCOMM End of Sequence Definition
diff --git a/nls/iso8859-5/XI18N_OBJS b/nls/iso8859-5/XI18N_OBJS
new file mode 100644 (file)
index 0000000..f20902a
--- /dev/null
@@ -0,0 +1,8 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for euro locales
+#
+XLC    common/xlibi18n _XlcGenericLoader       # XLC_open
+XIM    common/xiiimp   _XimpLocalOpenIM        # XIM_open
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
+
diff --git a/nls/iso8859-5/XLC_LOCALE.pre b/nls/iso8859-5/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..5a78709
--- /dev/null
@@ -0,0 +1,72 @@
+XCOMM  XLocale Database Sample for iso8859-5.
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class 
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         ISO8859-5:GL
+               substitute      ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset {
+               name            ISO8859-5:GR
+       }
+       font    {
+               primary         ISO8859-5:GR
+       }
+}
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          ISO8859-5
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+force_convert_to_mb    True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     ISO8859-5:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     ISO8859-5:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/iso8859-6/Compose.pre b/nls/iso8859-6/Compose.pre
new file mode 100644 (file)
index 0000000..cb03315
--- /dev/null
@@ -0,0 +1,14 @@
+XCOMM
+XCOMM ISO 8859-6 Compose Sequence
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM
+XCOMM This file currently has no entries.  It appears that a compose file (even
+XCOMM just an empty one) is required for the appropriate keysyms to work for
+XCOMM this encoding.
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+
+XCOMM End of Sequence Definition
diff --git a/nls/iso8859-6/XI18N_OBJS b/nls/iso8859-6/XI18N_OBJS
new file mode 100644 (file)
index 0000000..ab2d300
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for iso8859-6 locale
+#
+XLC    common/xlcDef   _XlcDefaultLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/iso8859-6/XLC_LOCALE.pre b/nls/iso8859-6/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..5b0d4d4
--- /dev/null
@@ -0,0 +1,72 @@
+XCOMM  XLocale Database Sample for iso8859-6.
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class 
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         ISO8859-6:GL
+               substitute      ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset {
+               name            ISO8859-6:GR
+       }
+       font    {
+               primary         ISO8859-6:GR
+       }
+}
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          ISO8859-6
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+force_convert_to_mb    True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     ISO8859-6:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     ISO8859-6:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/iso8859-7/Compose.pre b/nls/iso8859-7/Compose.pre
new file mode 100644 (file)
index 0000000..c79b277
--- /dev/null
@@ -0,0 +1,222 @@
+XCOMM
+XCOMM ISO 8859-7 (Greek) Compose Sequence
+XCOMM
+XCOMM
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+<Multi_key> <plus> <plus>              : "#"   numbersign
+<Multi_key> <apostrophe> <space>       : "'"   apostrophe
+<Multi_key> <space> <apostrophe>       : "'"   apostrophe
+<Multi_key> <A> <T>                    : "@"   at
+<Multi_key> <parenleft> <parenleft>    : "["   bracketleft
+<Multi_key> <slash> <slash>            : "\\"  backslash
+<Multi_key> <slash> <less>             : "\\"  backslash
+<Multi_key> <less> <slash>             : "\\"  backslash
+<Multi_key> <parenright> <parenright>  : "]"   bracketright
+<Multi_key> <asciicircum> <space>      : "^"   asciicircum
+<Multi_key> <space> <asciicircum>      : "^"   asciicircum
+<Multi_key> <greater> <space>          : "^"   asciicircum
+<Multi_key> <space> <greater>          : "^"   asciicircum
+<Multi_key> <grave> <space>            : "`"   grave
+<Multi_key> <space> <grave>            : "`"   grave
+<Multi_key> <parenleft> <minus>                : "{"   braceleft
+<Multi_key> <minus> <parenleft>                : "{"   braceleft
+<Multi_key> <slash> <asciicircum>      : "|"   bar
+<Multi_key> <asciicircum> <slash>      : "|"   bar
+<Multi_key> <V> <L>                    : "|"   bar
+<Multi_key> <L> <V>                    : "|"   bar
+<Multi_key> <v> <l>                    : "|"   bar
+<Multi_key> <l> <v>                    : "|"   bar
+<Multi_key> <parenright> <minus>       : "}"   braceright
+<Multi_key> <minus> <parenright>       : "}"   braceright
+<Multi_key> <asciitilde> <space>       : "~"   asciitilde
+<Multi_key> <space> <asciitilde>       : "~"   asciitilde
+<Multi_key> <minus> <space>            : "~"   asciitilde
+<Multi_key> <space> <minus>            : "~"   asciitilde
+
+<Multi_key> <l> <minus>                        : "\243"        sterling
+<Multi_key> <minus> <l>                        : "\243"        sterling
+<Multi_key> <L> <minus>                        : "\243"        sterling
+<Multi_key> <minus> <L>                        : "\243"        sterling
+<Multi_key> <l> <equal>                        : "\243"        sterling
+<Multi_key> <equal> <l>                        : "\243"        sterling
+<Multi_key> <L> <equal>                        : "\243"        sterling
+<Multi_key> <equal> <L>                        : "\243"        sterling
+<Multi_key> <s> <o>                    : "\247"        section
+<Multi_key> <o> <s>                    : "\247"        section
+<Multi_key> <S> <O>                    : "\247"        section
+<Multi_key> <O> <S>                    : "\247"        section
+<Multi_key> <S> <exclam>               : "\247"        section
+<Multi_key> <exclam> <S>               : "\247"        section
+<Multi_key> <s> <exclam>               : "\247"        section
+<Multi_key> <exclam> <s>               : "\247"        section
+<Multi_key> <S> <0>                    : "\247"        section
+<Multi_key> <0> <S>                    : "\247"        section
+<Multi_key> <s> <0>                    : "\247"        section
+<Multi_key> <0> <s>                    : "\247"        section
+<Multi_key> <c> <o>                    : "\251"        copyright
+<Multi_key> <o> <c>                    : "\251"        copyright
+<Multi_key> <C> <O>                    : "\251"        copyright
+<Multi_key> <O> <C>                    : "\251"        copyright
+<Multi_key> <c> <O>                    : "\251"        copyright
+<Multi_key> <O> <c>                    : "\251"        copyright
+<Multi_key> <C> <o>                    : "\251"        copyright
+<Multi_key> <o> <C>                    : "\251"        copyright
+<Multi_key> <c> <0>                    : "\251"        copyright
+<Multi_key> <0> <c>                    : "\251"        copyright
+<Multi_key> <C> <0>                    : "\251"        copyright
+<Multi_key> <0> <C>                    : "\251"        copyright
+<Multi_key> <parenleft> <c>            : "\251"        copyright
+<Multi_key> <less> <less>              : "\253"        guillemotleft
+<Multi_key> <greater> <greater>                : "\273"        guillemotright
+<Multi_key> <0> <asciicircum>          : "\260"        degree
+<Multi_key> <asciicircum> <0>          : "\260"        degree
+<Multi_key> <0> <asterisk>             : "\260"        degree
+<Multi_key> <asterisk> <0>             : "\260"        degree
+<Multi_key> <plus> <minus>             : "\261"        plusminus
+<Multi_key> <minus> <plus>             : "\261"        plusminus
+<Multi_key> <2> <asciicircum>          : "\262"        twosuperior
+<Multi_key> <asciicircum> <2>          : "\262"        twosuperior
+<Multi_key> <S> <2>                    : "\262"        twosuperior
+<Multi_key> <2> <S>                    : "\262"        twosuperior
+<Multi_key> <s> <2>                    : "\262"        twosuperior
+<Multi_key> <2> <s>                    : "\262"        twosuperior
+<Multi_key> <3> <asciicircum>          : "\263"        threesuperior
+<Multi_key> <asciicircum> <3>          : "\263"        threesuperior
+<Multi_key> <S> <3>                    : "\263"        threesuperior
+<Multi_key> <3> <S>                    : "\263"        threesuperior
+<Multi_key> <s> <3>                    : "\263"        threesuperior
+<Multi_key> <3> <s>                    : "\263"        threesuperior
+<Multi_key> <period> <asciicircum>     : "\267"        periodcentered
+<Multi_key> <asciicircum> <period>     : "\267"        periodcentered
+<Multi_key> <period> <period>          : "\267"        periodcentered
+<Multi_key> <1> <2>                    : "\275"        onehalf
+<Multi_key> <space> <space>            : "\240"        nobreakspace
+<Multi_key> <bar> <bar>                        : "\246"        brokenbar
+<Multi_key> <exclam> <asciicircum>     : "\246"        brokenbar
+<Multi_key> <asciicircum> <exclam>     : "\246"        brokenbar
+<Multi_key> <V> <B>                    : "\246"        brokenbar
+<Multi_key> <B> <V>                    : "\246"        brokenbar
+<Multi_key> <v> <b>                    : "\246"        brokenbar
+<Multi_key> <b> <v>                    : "\246"        brokenbar
+<Multi_key> <minus> <comma>            : "\254"        notsign
+<Multi_key> <comma> <minus>            : "\254"        notsign
+<Multi_key> <minus> <minus>            : "\255"        hyphen
+XCOMM should be Greek tonos but not defined in X11
+<Multi_key> <apostrophe> <apostrophe>  : "\264"        acute
+XCOMM should be Greek dialytika but not defined in X11
+<Multi_key> <quotedbl> <quotedbl>      : "\250"        diaeresis
+XCOMM special characters that don't exist in Latin-1
+<Multi_key> <less> <apostrophe>                : "\241"        leftsinglequotemark
+<Multi_key> <apostrophe> <less>                : "\241"        leftsinglequotemark
+<Multi_key> <greater> <apostrophe>     : "\242"        rightsinglequotemark
+<Multi_key> <apostrophe> <greater>     : "\242"        rightsinglequotemark
+<Multi_key> <asciitilde> <asciitilde>  : "\257"        Greek_horizbar
+
+XCOMM Accented Alphabet
+<Multi_key> <Greek_ALPHA> <apostrophe> : "\266" Greek_ALPHAaccent
+<Multi_key> <apostrophe> <Greek_ALPHA> : "\266" Greek_ALPHAaccent
+<Multi_key> <Greek_EPSILON> <apostrophe>: "\270" Greek_EPSILONaccent
+<Multi_key> <apostrophe> <Greek_EPSILON>: "\270" Greek_EPSILONaccent
+<Multi_key> <Greek_ETA> <apostrophe>   : "\271" Greek_ETAaccent
+<Multi_key> <apostrophe> <Greek_ETA>   : "\271" Greek_ETAaccent
+<Multi_key> <Greek_IOTA> <apostrophe>  : "\272" Greek_IOTAaccent
+<Multi_key> <apostrophe> <Greek_IOTA>  : "\272" Greek_IOTAaccent
+<Multi_key> <Greek_OMICRON> <apostrophe>: "\274" Greek_OMICRONaccent
+<Multi_key> <apostrophe> <Greek_OMICRON>: "\274" Greek_OMICRONaccent
+<Multi_key> <Greek_UPSILON> <apostrophe>: "\276" Greek_UPSILONaccent
+<Multi_key> <apostrophe> <Greek_UPSILON>: "\276" Greek_UPSILONaccent
+<Multi_key> <Greek_OMEGA> <apostrophe> : "\277" Greek_OMEGAaccent
+<Multi_key> <apostrophe> <Greek_OMEGA> : "\277" Greek_OMEGAaccent
+<Multi_key> <Greek_IOTA> <quotedbl>    : "\332" Greek_IOTAdieresis
+<Multi_key> <quotedbl> <Greek_IOTA>    : "\332" Greek_IOTAdieresis
+<Multi_key> <Greek_UPSILON> <quotedbl> : "\333" Greek_UPSILONdieresis
+<Multi_key> <quotedbl> <Greek_UPSILON> : "\333" Greek_UPSILONdieresis
+
+<Multi_key> <Greek_alpha> <apostrophe> : "\334" Greek_alphaaccent
+<Multi_key> <apostrophe> <Greek_alpha> : "\334" Greek_alphaaccent
+<Multi_key> <Greek_epsilon> <apostrophe>: "\335" Greek_epsilonaccent
+<Multi_key> <apostrophe> <Greek_epsilon>: "\335" Greek_epsilonaccent
+<Multi_key> <Greek_eta> <apostrophe>   : "\336" Greek_etaaccent
+<Multi_key> <apostrophe> <Greek_eta>   : "\336" Greek_etaaccent
+<Multi_key> <Greek_iota> <apostrophe>  : "\337" Greek_iotaaccent
+<Multi_key> <apostrophe> <Greek_iota>  : "\337" Greek_iotaaccent
+<Multi_key> <Greek_omicron> <apostrophe>: "\374" Greek_omicronaccent
+<Multi_key> <apostrophe> <Greek_omicron>: "\374" Greek_omicronaccent
+<Multi_key> <Greek_upsilon> <apostrophe>: "\375" Greek_upsilonaccent
+<Multi_key> <apostrophe> <Greek_upsilon>: "\375" Greek_upsilonaccent
+<Multi_key> <Greek_omega> <apostrophe> : "\376" Greek_omegaaccent
+<Multi_key> <apostrophe> <Greek_omega> : "\376" Greek_omegaaccent
+<Multi_key> <Greek_iota> <quotedbl>    : "\372" Greek_iotadieresis
+<Multi_key> <quotedbl> <Greek_iota>    : "\372" Greek_iotadieresis
+<Multi_key> <Greek_upsilon> <quotedbl> : "\373" Greek_upsilondieresis
+<Multi_key> <quotedbl> <Greek_upsilon> : "\373" Greek_upsilondieresis
+
+<Multi_key> <apostrophe> <quotedbl> <Greek_iota>       : "\300" Greek_iotaaccentdieresis
+<Multi_key> <quotedbl> <apostrophe> <Greek_iota>       : "\300" Greek_iotaaccentdieresis
+<Multi_key> <apostrophe> <quotedbl> <Greek_upsilon>    : "\340" Greek_upsilonaccentdieresis
+<Multi_key> <quotedbl> <apostrophe> <Greek_upsilon>    : "\340" Greek_upsilonaccentdieresis
+<Multi_key> <apostrophe> <quotedbl> <space>            : "\265" Greek_accentdieresis
+<Multi_key> <quotedbl> <apostrophe> <space>            : "\265" Greek_accentdieresis
+
+XCOMM
+XCOMM
+XCOMM dead key accent keysyms
+XCOMM Special Character
+<dead_circumflex> <slash>              : "|"   bar
+<dead_grave> <space>                   : "`"   grave
+<dead_diaeresis> <space>               : "\250"        diaeresis
+<dead_circumflex> <space>              : "^"   asciicircum
+<dead_tilde> <space>                   : "~"   asciitilde
+<dead_doubleacute> <space>             : "\""  quotedbl
+<dead_abovering> <space>               : "\260"        degree
+<dead_abovering> <dead_abovering>      : "\260"        degree
+<dead_circumflex> <0>                  : "\260"        degree
+<dead_circumflex> <2>                  : "\262"        twosuperior
+<dead_circumflex> <3>                  : "\263"        threesuperior
+<dead_circumflex> <period>             : "\267"        periodcentered
+<dead_circumflex> <exclam>             : "\246"        brokenbar
+<dead_cedilla> <minus>                 : "\254"        notsign
+<dead_acute> <apostrophe>              : "\264"        acute
+<dead_diaeresis> <quotedbl>            : "\250"        diaeresis
+
+XCOMM Accented Alphabet (plus some more symbols)
+<dead_acute> <Greek_alpha>             : "\334"        Greek_alphaaccent
+<dead_acute> <Greek_epsilon>           : "\335"        Greek_epsilonaccent
+<dead_acute> <Greek_eta>               : "\336"        Greek_etaaccent
+<dead_acute> <Greek_iota>              : "\337"        Greek_iotaaccent
+<dead_acute> <Greek_omicron>           : "\374"        Greek_omicronaccent
+<dead_acute> <Greek_upsilon>           : "\375"        Greek_upsilonaccent
+<dead_acute> <Greek_omega>             : "\376"        Greek_omegaaccent
+<dead_acute> <Greek_ALPHA>             : "\266"        Greek_ALPHAaccent
+<dead_acute> <Greek_EPSILON>           : "\270"        Greek_EPSILONaccent
+<dead_acute> <Greek_ETA>               : "\271"        Greek_ETAaccent
+<dead_acute> <Greek_IOTA>              : "\272"        Greek_IOTAaccent
+<dead_acute> <Greek_OMICRON>           : "\274"        Greek_OMICRONaccent
+<dead_acute> <Greek_UPSILON>           : "\276"        Greek_UPSILONaccent
+<dead_acute> <Greek_OMEGA>             : "\277"        Greek_OMEGAaccent
+<dead_acute> <space>                   : "\264"        acute
+<dead_acute> <dead_acute>              : "\264"        acute
+<dead_acute> <period>                  : "\267"        periodcentered
+<dead_acute> <less>                    : "\253"        guillemotleft
+<dead_acute> <greater>                 : "\273"        guillemotright
+
+<dead_diaeresis> <Greek_iota>          : "\372"        Greek_iotadieresis
+<dead_diaeresis> <Greek_upsilon>       : "\373"        Greek_upsilondieresis
+<dead_diaeresis> <Greek_IOTA>          : "\332"        Greek_IOTAdieresis
+<dead_diaeresis> <Greek_UPSILON>       : "\333"        Greek_UPSILONdieresis
+<dead_diaeresis> <dead_diaeresis>      : "\250"        diaeresis
+<dead_diaeresis> <period>              : "\267"        periodcentered
+<dead_diaeresis> <less>                        : "\253"        guillemotleft
+<dead_diaeresis> <greater>             : "\273"        guillemotright
+
+<dead_acute> <dead_diaeresis> <Greek_iota>     : "\300"        Greek_iotaaccentdieresis
+<dead_acute> <dead_diaeresis> <Greek_upsilon>  : "\340"        Greek_upsilonaccentdieresis
+<dead_acute> <dead_diaeresis> <space>          : "\265"        Greek_accentdieresis
+
+<dead_diaeresis> <dead_acute> <Greek_iota>     : "\300"        Greek_iotaaccentdieresis
+<dead_diaeresis> <dead_acute> <Greek_upsilon>  : "\340"        Greek_upsilonaccentdieresis
+<dead_diaeresis> <dead_acute> <space>          : "\265"        Greek_accentdieresis
diff --git a/nls/iso8859-7/XI18N_OBJS b/nls/iso8859-7/XI18N_OBJS
new file mode 100644 (file)
index 0000000..f20902a
--- /dev/null
@@ -0,0 +1,8 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for euro locales
+#
+XLC    common/xlibi18n _XlcGenericLoader       # XLC_open
+XIM    common/xiiimp   _XimpLocalOpenIM        # XIM_open
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
+
diff --git a/nls/iso8859-7/XLC_LOCALE.pre b/nls/iso8859-7/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..9910bbe
--- /dev/null
@@ -0,0 +1,72 @@
+XCOMM  XLocale Database Sample for iso8859-7.
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class 
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         ISO8859-7:GL
+               substitute      ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset {
+               name            ISO8859-7:GR
+       }
+       font    {
+               primary         ISO8859-7:GR
+       }
+}
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          ISO8859-7
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+force_convert_to_mb    True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     ISO8859-7:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     ISO8859-7:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/iso8859-8/Compose.pre b/nls/iso8859-8/Compose.pre
new file mode 100644 (file)
index 0000000..1ca90c7
--- /dev/null
@@ -0,0 +1,14 @@
+XCOMM
+XCOMM ISO 8859-8 Compose Sequence
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM
+XCOMM This file currently has no entries.  It appears that a compose file (even
+XCOMM just an empty one) is required for the appropriate keysyms to work for
+XCOMM this encoding.
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+
+XCOMM End of Sequence Definition
diff --git a/nls/iso8859-8/XI18N_OBJS b/nls/iso8859-8/XI18N_OBJS
new file mode 100644 (file)
index 0000000..e85b513
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for iso8859-8 locale
+#
+XLC    common/xlcDef   _XlcDefaultLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/iso8859-8/XLC_LOCALE.pre b/nls/iso8859-8/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..20a9f8f
--- /dev/null
@@ -0,0 +1,72 @@
+XCOMM  XLocale Database Sample for iso8859-8.
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class 
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         ISO8859-8:GL
+               substitute      ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset {
+               name            ISO8859-8:GR
+       }
+       font    {
+               primary         ISO8859-8:GR
+       }
+}
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          ISO8859-8
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+force_convert_to_mb    True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     ISO8859-8:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     ISO8859-8:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/iso8859-9/Compose.pre b/nls/iso8859-9/Compose.pre
new file mode 100644 (file)
index 0000000..83122a2
--- /dev/null
@@ -0,0 +1,481 @@
+XCOMM
+XCOMM ISO 8859-9 (Latin5) Compose Sequence
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+<Multi_key> <plus> <plus>              : "#"   numbersign
+<Multi_key> <apostrophe> <space>       : "'"   apostrophe
+<Multi_key> <space> <apostrophe>       : "'"   apostrophe
+<Multi_key> <parenleft> <parenleft>    : "["   bracketleft
+<Multi_key> <slash> <slash>            : "\\"  backslash
+<Multi_key> <slash> <less>             : "\\"  backslash
+<Multi_key> <less> <slash>             : "\\"  backslash
+<Multi_key> <parenright> <parenright>  : "]"   bracketright
+<Multi_key> <asciicircum> <space>      : "^"   asciicircum
+<Multi_key> <space> <asciicircum>      : "^"   asciicircum
+<Multi_key> <greater> <space>          : "^"   asciicircum
+<Multi_key> <space> <greater>          : "^"   asciicircum
+<Multi_key> <grave> <space>            : "`"   grave
+<Multi_key> <space> <grave>            : "`"   grave
+<Multi_key> <parenleft> <minus>                : "{"   braceleft
+<Multi_key> <minus> <parenleft>                : "{"   braceleft
+<Multi_key> <slash> <asciicircum>      : "|"   bar
+<Multi_key> <asciicircum> <slash>      : "|"   bar
+<Multi_key> <V> <L>                    : "|"   bar
+<Multi_key> <L> <V>                    : "|"   bar
+<Multi_key> <v> <l>                    : "|"   bar
+<Multi_key> <l> <v>                    : "|"   bar
+<Multi_key> <parenright> <minus>       : "}"   braceright
+<Multi_key> <minus> <parenright>       : "}"   braceright
+<Multi_key> <asciitilde> <space>       : "~"   asciitilde
+<Multi_key> <space> <asciitilde>       : "~"   asciitilde
+<Multi_key> <minus> <space>            : "~"   asciitilde
+<Multi_key> <space> <minus>            : "~"   asciitilde
+<Multi_key> <exclam> <exclam>          : "\241"        exclamdown
+<Multi_key> <c> <slash>                        : "\242"        cent
+<Multi_key> <slash> <c>                        : "\242"        cent
+<Multi_key> <C> <slash>                        : "\242"        cent
+<Multi_key> <slash> <C>                        : "\242"        cent
+<Multi_key> <C> <bar>                  : "\242"        cent
+<Multi_key> <bar> <C>                  : "\242"        cent
+<Multi_key> <c> <bar>                  : "\242"        cent
+<Multi_key> <bar> <c>                  : "\242"        cent
+<Multi_key> <l> <minus>                        : "\243"        sterling
+<Multi_key> <minus> <l>                        : "\243"        sterling
+<Multi_key> <L> <minus>                        : "\243"        sterling
+<Multi_key> <minus> <L>                        : "\243"        sterling
+<Multi_key> <l> <equal>                        : "\243"        sterling
+<Multi_key> <equal> <l>                        : "\243"        sterling
+<Multi_key> <L> <equal>                        : "\243"        sterling
+<Multi_key> <equal> <L>                        : "\243"        sterling
+<Multi_key> <C> <equal>                        : "\244"        EuroSign
+<Multi_key> <equal> <C>                        : "\244"        EuroSign
+<Multi_key> <c> <equal>                        : "\244"        EuroSign
+<Multi_key> <equal> <c>                        : "\244"        EuroSign
+<Multi_key> <E> <equal>                 : "\244"        EuroSign
+<Multi_key> <equal> <E>                 : "\244"        EuroSign
+<Multi_key> <e> <equal>                 : "\244"        EuroSign
+<Multi_key> <equal> <e>                 : "\244"        EuroSign
+<Multi_key> <y> <minus>                        : "\245"        yen
+<Multi_key> <minus> <y>                        : "\245"        yen
+<Multi_key> <Y> <minus>                        : "\245"        yen
+<Multi_key> <minus> <Y>                        : "\245"        yen
+<Multi_key> <y> <equal>                        : "\245"        yen
+<Multi_key> <equal> <y>                        : "\245"        yen
+<Multi_key> <Y> <equal>                        : "\245"        yen
+<Multi_key> <equal> <Y>                        : "\245"        yen
+<Multi_key> <s> <o>                    : "\247"        section
+<Multi_key> <o> <s>                    : "\247"        section
+<Multi_key> <S> <O>                    : "\247"        section
+<Multi_key> <O> <S>                    : "\247"        section
+<Multi_key> <S> <exclam>               : "\247"        section
+<Multi_key> <exclam> <S>               : "\247"        section
+<Multi_key> <s> <exclam>               : "\247"        section
+<Multi_key> <exclam> <s>               : "\247"        section
+<Multi_key> <S> <0>                    : "\247"        section
+<Multi_key> <0> <S>                    : "\247"        section
+<Multi_key> <s> <0>                    : "\247"        section
+<Multi_key> <0> <s>                    : "\247"        section
+<Multi_key> <c> <o>                    : "\251"        copyright
+<Multi_key> <o> <c>                    : "\251"        copyright
+<Multi_key> <C> <O>                    : "\251"        copyright
+<Multi_key> <O> <C>                    : "\251"        copyright
+<Multi_key> <c> <O>                    : "\251"        copyright
+<Multi_key> <O> <c>                    : "\251"        copyright
+<Multi_key> <C> <o>                    : "\251"        copyright
+<Multi_key> <o> <C>                    : "\251"        copyright
+<Multi_key> <c> <0>                    : "\251"        copyright
+<Multi_key> <0> <c>                    : "\251"        copyright
+<Multi_key> <C> <0>                    : "\251"        copyright
+<Multi_key> <0> <C>                    : "\251"        copyright
+<Multi_key> <parenleft> <c>             : "\251"        copyright
+<Multi_key> <a> <underscore>           : "\252"        ordfeminine
+<Multi_key> <underscore> <a>           : "\252"        ordfeminine
+<Multi_key> <A> <underscore>           : "\252"        ordfeminine
+<Multi_key> <underscore> <A>           : "\252"        ordfeminine
+<Multi_key> <o> <underscore>           : "\272"        masculine
+<Multi_key> <underscore> <o>           : "\272"        masculine
+<Multi_key> <O> <underscore>           : "\272"        masculine
+<Multi_key> <underscore> <O>           : "\272"        masculine
+<Multi_key> <less> <less>              : "\253"        guillemotleft
+<Multi_key> <greater> <greater>                : "\273"        guillemotright
+<Multi_key> <0> <asciicircum>          : "\260"        degree
+<Multi_key> <asciicircum> <0>          : "\260"        degree
+<Multi_key> <0> <asterisk>             : "\260"        degree
+<Multi_key> <asterisk> <0>             : "\260"        degree
+<Multi_key> <plus> <minus>             : "\261"        plusminus
+<Multi_key> <minus> <plus>             : "\261"        plusminus
+<Multi_key> <slash> <u>                        : "\265"        mu
+<Multi_key> <u> <slash>                        : "\265"        mu
+<Multi_key> <slash> <U>                        : "\265"        mu
+<Multi_key> <U> <slash>                        : "\265"        mu
+<Multi_key> <1> <asciicircum>          : "\271"        onesuperior
+<Multi_key> <asciicircum> <1>          : "\271"        onesuperior
+<Multi_key> <S> <1>                    : "\271"        onesuperior
+<Multi_key> <1> <S>                    : "\271"        onesuperior
+<Multi_key> <s> <1>                    : "\271"        onesuperior
+<Multi_key> <1> <s>                    : "\271"        onesuperior
+<Multi_key> <2> <asciicircum>          : "\262"        twosuperior
+<Multi_key> <asciicircum> <2>          : "\262"        twosuperior
+<Multi_key> <S> <2>                    : "\262"        twosuperior
+<Multi_key> <2> <S>                    : "\262"        twosuperior
+<Multi_key> <s> <2>                    : "\262"        twosuperior
+<Multi_key> <2> <s>                    : "\262"        twosuperior
+<Multi_key> <3> <asciicircum>          : "\263"        threesuperior
+<Multi_key> <asciicircum> <3>          : "\263"        threesuperior
+<Multi_key> <S> <3>                    : "\263"        threesuperior
+<Multi_key> <3> <S>                    : "\263"        threesuperior
+<Multi_key> <s> <3>                    : "\263"        threesuperior
+<Multi_key> <3> <s>                    : "\263"        threesuperior
+<Multi_key> <p> <exclam>               : "\266"        paragraph
+<Multi_key> <exclam> <p>               : "\266"        paragraph
+<Multi_key> <P> <exclam>               : "\266"        paragraph
+<Multi_key> <exclam> <P>               : "\266"        paragraph
+<Multi_key> <period> <asciicircum>     : "\267"        periodcentered
+<Multi_key> <asciicircum> <period>     : "\267"        periodcentered
+<Multi_key> <period> <period>          : "\267"        periodcentered
+<Multi_key> <question> <question>      : "\277"        questiondown
+<Multi_key> <space> <space>            : "\240"        nobreakspace
+<Multi_key> <minus> <comma>            : "\254"        notsign
+<Multi_key> <comma> <minus>            : "\254"        notsign
+<Multi_key> <minus> <minus>            : "\255"        hyphen
+<Multi_key> <R> <O>                    : "\256"        registered
+<Multi_key> <O> <R>                    : "\256"        registered
+<Multi_key> <parenleft> <r>             : "\256"        registered
+<Multi_key> <minus> <asciicircum>      : "\257"        macron
+<Multi_key> <asciicircum> <minus>      : "\257"        macron
+<Multi_key> <underscore> <asciicircum> : "\257"        macron
+<Multi_key> <asciicircum> <underscore> : "\257"        macron
+<Multi_key> <underscore> <underscore>  : "\257"        macron
+<Multi_key> <minus> <colon>            : "\367"        division
+<Multi_key> <colon> <minus>            : "\367"        division
+<Multi_key> <x> <x>                    : "\327"        multiply
+<Multi_key> <apostrophe> <apostrophe>  : "\264"        acute
+<Multi_key> <comma> <comma>            : "\270"        cedilla
+<Multi_key> <quotedbl> <quotedbl>      : "\250"        diaeresis
+XCOMM Accented Alphabet
+<Multi_key> <A> <grave>                        : "\300"        Agrave
+<Multi_key> <grave> <A>                        : "\300"        Agrave
+<Multi_key> <A> <acute>                        : "\301"        Aacute
+<Multi_key> <acute> <A>                        : "\301"        Aacute
+<Multi_key> <A> <apostrophe>           : "\301"        Aacute
+<Multi_key> <apostrophe> <A>           : "\301"        Aacute
+<Multi_key> <A> <asciicircum>          : "\302"        Acircumflex
+<Multi_key> <asciicircum> <A>          : "\302"        Acircumflex
+<Multi_key> <A> <greater>              : "\302"        Acircumflex
+<Multi_key> <greater> <A>              : "\302"        Acircumflex
+<Multi_key> <A> <asciitilde>           : "\303"        Atilde
+<Multi_key> <asciitilde> <A>           : "\303"        Atilde
+<Multi_key> <A> <minus>                        : "\303"        Atilde
+<Multi_key> <minus> <A>                        : "\303"        Atilde
+<Multi_key> <A> <quotedbl>             : "\304"        Adiaeresis
+<Multi_key> <quotedbl> <A>             : "\304"        Adiaeresis
+<Multi_key> <A> <diaeresis>            : "\304"        Adiaeresis
+<Multi_key> <diaeresis> <A>            : "\304"        Adiaeresis
+<Multi_key> <A> <asterisk>             : "\305"        Aring
+<Multi_key> <asterisk> <A>             : "\305"        Aring
+<Multi_key> <A> <A>                    : "\305"        Aring
+<Multi_key> <A> <E>                    : "\306"        AE
+<Multi_key> <a> <grave>                        : "\340"        agrave
+<Multi_key> <grave> <a>                        : "\340"        agrave
+<Multi_key> <a> <acute>                        : "\341"        aacute
+<Multi_key> <acute> <a>                        : "\341"        aacute
+<Multi_key> <a> <apostrophe>           : "\341"        aacute
+<Multi_key> <apostrophe> <a>           : "\341"        aacute
+<Multi_key> <a> <asciicircum>          : "\342"        acircumflex
+<Multi_key> <asciicircum> <a>          : "\342"        acircumflex
+<Multi_key> <a> <greater>              : "\342"        acircumflex
+<Multi_key> <greater> <a>              : "\342"        acircumflex
+<Multi_key> <a> <asciitilde>           : "\343"        atilde
+<Multi_key> <asciitilde> <a>           : "\343"        atilde
+<Multi_key> <a> <minus>                        : "\343"        atilde
+<Multi_key> <minus> <a>                        : "\343"        atilde
+<Multi_key> <a> <quotedbl>             : "\344"        adiaeresis
+<Multi_key> <quotedbl> <a>             : "\344"        adiaeresis
+<Multi_key> <a> <diaeresis>            : "\344"        adiaeresis
+<Multi_key> <diaeresis> <a>            : "\344"        adiaeresis
+<Multi_key> <a> <asterisk>             : "\345"        aring
+<Multi_key> <asterisk> <a>             : "\345"        aring
+<Multi_key> <a> <a>                    : "\345"        aring
+<Multi_key> <a> <e>                    : "\346"        ae
+<Multi_key> <C> <comma>                        : "\307"        Ccedilla
+<Multi_key> <C> <cedilla>              : "\307"        Ccedilla
+<Multi_key> <comma> <C>                        : "\307"        Ccedilla
+<Multi_key> <cedilla> <C>              : "\307"        Ccedilla
+<Multi_key> <c> <comma>                        : "\347"        ccedilla
+<Multi_key> <c> <cedilla>              : "\347"        ccedilla
+<Multi_key> <comma> <c>                        : "\347"        ccedilla
+<Multi_key> <cedilla> <c>              : "\347"        ccedilla
+<Multi_key> <minus> <D>                        : "\320"        ETH
+<Multi_key> <D> <minus>                        : "\320"        ETH
+<Multi_key> <minus> <d>                        : "\360"        eth
+<Multi_key> <d> <minus>                        : "\360"        eth
+<Multi_key> <E> <grave>                        : "\310"        Egrave
+<Multi_key> <grave> <E>                        : "\310"        Egrave
+<Multi_key> <E> <acute>                        : "\311"        Eacute
+<Multi_key> <acute> <E>                        : "\311"        Eacute
+<Multi_key> <E> <apostrophe>           : "\311"        Eacute
+<Multi_key> <apostrophe> <E>           : "\311"        Eacute
+<Multi_key> <E> <asciicircum>          : "\312"        Ecircumflex
+<Multi_key> <asciicircum> <E>          : "\312"        Ecircumflex
+<Multi_key> <E> <greater>              : "\312"        Ecircumflex
+<Multi_key> <greater> <E>              : "\312"        Ecircumflex
+<Multi_key> <E> <quotedbl>             : "\313"        Ediaeresis
+<Multi_key> <quotedbl> <E>             : "\313"        Ediaeresis
+<Multi_key> <E> <diaeresis>            : "\313"        Ediaeresis
+<Multi_key> <diaeresis> <E>            : "\313"        Ediaeresis
+<Multi_key> <e> <grave>                        : "\350"        egrave
+<Multi_key> <grave> <e>                        : "\350"        egrave
+<Multi_key> <e> <acute>                        : "\351"        eacute
+<Multi_key> <acute> <e>                        : "\351"        eacute
+<Multi_key> <e> <apostrophe>           : "\351"        eacute
+<Multi_key> <apostrophe> <e>           : "\351"        eacute
+<Multi_key> <e> <asciicircum>          : "\352"        ecircumflex
+<Multi_key> <asciicircum> <e>          : "\352"        ecircumflex
+<Multi_key> <e> <greater>              : "\352"        ecircumflex
+<Multi_key> <greater> <e>              : "\352"        ecircumflex
+<Multi_key> <e> <quotedbl>             : "\353"        ediaeresis
+<Multi_key> <quotedbl> <e>             : "\353"        ediaeresis
+<Multi_key> <e> <diaeresis>            : "\353"        ediaeresis
+<Multi_key> <diaeresis> <e>            : "\353"        ediaeresis
+<Multi_key> <G> <U>                     : "\320"        Gbreve
+<Multi_key> <G> <parenleft>             : "\320"        Gbreve
+<Multi_key> <parenleft> <G>             : "\320"        Gbreve
+<Multi_key> <G> <breve>                 : "\320"        Gbreve
+<Multi_key> <breve> <G>                 : "\320"        Gbreve
+<Multi_key> <g> <U>                     : "\360"        gbreve
+<Multi_key> <g> <parenleft>             : "\360"        gbreve
+<Multi_key> <parenleft> <g>             : "\360"        gbreve
+<Multi_key> <g> <breve>                 : "\360"        gbreve
+<Multi_key> <breve> <g>                 : "\360"        gbreve
+<Multi_key> <I> <grave>                        : "\314"        Igrave
+<Multi_key> <grave> <I>                        : "\314"        Igrave
+<Multi_key> <I> <acute>                        : "\315"        Iacute
+<Multi_key> <acute> <I>                        : "\315"        Iacute
+<Multi_key> <I> <apostrophe>           : "\315"        Iacute
+<Multi_key> <apostrophe> <I>           : "\315"        Iacute
+<Multi_key> <I> <asciicircum>          : "\316"        Icircumflex
+<Multi_key> <asciicircum> <I>          : "\316"        Icircumflex
+<Multi_key> <I> <greater>              : "\316"        Icircumflex
+<Multi_key> <greater> <I>              : "\316"        Icircumflex
+<Multi_key> <I> <quotedbl>             : "\317"        Idiaeresis
+<Multi_key> <quotedbl> <I>             : "\317"        Idiaeresis
+<Multi_key> <I> <diaeresis>            : "\317"        Idiaeresis
+<Multi_key> <diaeresis> <I>            : "\317"        Idiaeresis
+<Multi_key> <I> <period>                : "\335"        Iabovedot
+<Multi_key> <period> <I>                : "\335"        Iabovedot
+<Multi_key> <i> <grave>                        : "\354"        igrave
+<Multi_key> <grave> <i>                        : "\354"        igrave
+<Multi_key> <i> <acute>                        : "\355"        iacute
+<Multi_key> <acute> <i>                        : "\355"        iacute
+<Multi_key> <i> <apostrophe>           : "\355"        iacute
+<Multi_key> <apostrophe> <i>           : "\355"        iacute
+<Multi_key> <i> <asciicircum>          : "\356"        icircumflex
+<Multi_key> <asciicircum> <i>          : "\356"        icircumflex
+<Multi_key> <i> <greater>              : "\356"        icircumflex
+<Multi_key> <greater> <i>              : "\356"        icircumflex
+<Multi_key> <i> <quotedbl>             : "\357"        idiaeresis
+<Multi_key> <quotedbl> <i>             : "\357"        idiaeresis
+<Multi_key> <i> <diaeresis>            : "\357"        idiaeresis
+<Multi_key> <diaeresis> <i>            : "\357"        idiaeresis
+<Multi_key> <i> <period>                : "\375"        idotless
+<Multi_key> <period> <i>                : "\375"        idotless
+<Multi_key> <N> <asciitilde>           : "\321"        Ntilde
+<Multi_key> <asciitilde> <N>           : "\321"        Ntilde
+<Multi_key> <N> <minus>                        : "\321"        Ntilde
+<Multi_key> <minus> <N>                        : "\321"        Ntilde
+<Multi_key> <n> <asciitilde>           : "\361"        ntilde
+<Multi_key> <asciitilde> <n>           : "\361"        ntilde
+<Multi_key> <n> <minus>                        : "\361"        ntilde
+<Multi_key> <minus> <n>                        : "\361"        ntilde
+<Multi_key> <O> <grave>                        : "\322"        Ograve
+<Multi_key> <grave> <O>                        : "\322"        Ograve
+<Multi_key> <O> <acute>                        : "\323"        Oacute
+<Multi_key> <acute> <O>                        : "\323"        Oacute
+<Multi_key> <O> <apostrophe>           : "\323"        Oacute
+<Multi_key> <apostrophe> <O>           : "\323"        Oacute
+<Multi_key> <O> <asciicircum>          : "\324"        Ocircumflex
+<Multi_key> <asciicircum> <O>          : "\324"        Ocircumflex
+<Multi_key> <O> <greater>              : "\324"        Ocircumflex
+<Multi_key> <greater> <O>              : "\324"        Ocircumflex
+<Multi_key> <O> <asciitilde>           : "\325"        Otilde
+<Multi_key> <asciitilde> <O>           : "\325"        Otilde
+<Multi_key> <O> <minus>                        : "\325"        Otilde
+<Multi_key> <minus> <O>                        : "\325"        Otilde
+<Multi_key> <O> <quotedbl>             : "\326"        Odiaeresis
+<Multi_key> <quotedbl> <O>             : "\326"        Odiaeresis
+<Multi_key> <O> <diaeresis>            : "\326"        Odiaeresis
+<Multi_key> <diaeresis> <O>            : "\326"        Odiaeresis
+<Multi_key> <O> <slash>                        : "\330"        Ooblique
+<Multi_key> <slash> <O>                        : "\330"        Ooblique
+<Multi_key> <O> <E>                    : "\274"        OE
+<Multi_key> <o> <grave>                        : "\362"        ograve
+<Multi_key> <grave> <o>                        : "\362"        ograve
+<Multi_key> <o> <acute>                        : "\363"        oacute
+<Multi_key> <acute> <o>                        : "\363"        oacute
+<Multi_key> <o> <apostrophe>           : "\363"        oacute
+<Multi_key> <apostrophe> <o>           : "\363"        oacute
+<Multi_key> <o> <asciicircum>          : "\364"        ocircumflex
+<Multi_key> <asciicircum> <o>          : "\364"        ocircumflex
+<Multi_key> <o> <greater>              : "\364"        ocircumflex
+<Multi_key> <greater> <o>              : "\364"        ocircumflex
+<Multi_key> <o> <asciitilde>           : "\365"        otilde
+<Multi_key> <asciitilde> <o>           : "\365"        otilde
+<Multi_key> <o> <minus>                        : "\365"        otilde
+<Multi_key> <minus> <o>                        : "\365"        otilde
+<Multi_key> <o> <quotedbl>             : "\366"        odiaeresis
+<Multi_key> <quotedbl> <o>             : "\366"        odiaeresis
+<Multi_key> <o> <diaeresis>            : "\366"        odiaeresis
+<Multi_key> <diaeresis> <o>            : "\366"        odiaeresis
+<Multi_key> <o> <slash>                        : "\370"        oslash
+<Multi_key> <slash> <o>                        : "\370"        oslash
+<Multi_key> <S> <cedilla>               : "\336"        Scedilla
+<Multi_key> <S> <comma>                 : "\336"        Scedilla
+<Multi_key> <cedilla> <S>               : "\336"        Scedilla
+<Multi_key> <cedilla> <s>               : "\376"        scedilla
+<Multi_key> <comma> <S>                 : "\336"        Scedilla
+<Multi_key> <comma> <s>                 : "\376"        scedilla
+<Multi_key> <s> <cedilla>               : "\376"        scedilla
+<Multi_key> <s> <comma>                 : "\376"        scedilla
+<Multi_key> <U> <grave>                        : "\331"        Ugrave
+<Multi_key> <grave> <U>                        : "\331"        Ugrave
+<Multi_key> <U> <acute>                        : "\332"        Uacute
+<Multi_key> <acute> <U>                        : "\332"        Uacute
+<Multi_key> <U> <apostrophe>           : "\332"        Uacute
+<Multi_key> <apostrophe> <U>           : "\332"        Uacute
+<Multi_key> <U> <asciicircum>          : "\333"        Ucircumflex
+<Multi_key> <asciicircum> <U>          : "\333"        Ucircumflex
+<Multi_key> <U> <greater>              : "\333"        Ucircumflex
+<Multi_key> <greater> <U>              : "\333"        Ucircumflex
+<Multi_key> <U> <quotedbl>             : "\334"        Udiaeresis
+<Multi_key> <quotedbl> <U>             : "\334"        Udiaeresis
+<Multi_key> <U> <diaeresis>            : "\334"        Udiaeresis
+<Multi_key> <diaeresis> <U>            : "\334"        Udiaeresis
+<Multi_key> <u> <grave>                        : "\371"        ugrave
+<Multi_key> <grave> <u>                        : "\371"        ugrave
+<Multi_key> <u> <acute>                        : "\372"        uacute
+<Multi_key> <acute> <u>                        : "\372"        uacute
+<Multi_key> <u> <apostrophe>           : "\372"        uacute
+<Multi_key> <apostrophe> <u>           : "\372"        uacute
+<Multi_key> <u> <asciicircum>          : "\373"        ucircumflex
+<Multi_key> <asciicircum> <u>          : "\373"        ucircumflex
+<Multi_key> <u> <greater>              : "\373"        ucircumflex
+<Multi_key> <greater> <u>              : "\373"        ucircumflex
+<Multi_key> <u> <quotedbl>             : "\374"        udiaeresis
+<Multi_key> <quotedbl> <u>             : "\374"        udiaeresis
+<Multi_key> <u> <diaeresis>            : "\374"        udiaeresis
+<Multi_key> <diaeresis> <u>            : "\374"        udiaeresis
+<Multi_key> <s> <s>                    : "\337"        ssharp
+<Multi_key> <T> <H>                    : "\336"        THORN
+<Multi_key> <t> <h>                    : "\376"        thorn
+<Multi_key> <Y> <acute>                        : "\335"        Yacute
+<Multi_key> <acute> <Y>                        : "\335"        Yacute
+<Multi_key> <Y> <apostrophe>           : "\335"        Yacute
+<Multi_key> <apostrophe> <Y>           : "\335"        Yacute
+<Multi_key> <Y> <quotedbl>             : "\276"        Ydiaeresis
+<Multi_key> <quotedbl> <Y>             : "\276"        Ydiaeresis
+<Multi_key> <Y> <diaeresis>            : "\276"        Ydiaeresis
+<Multi_key> <diaeresis> <Y>            : "\276"        Ydiaeresis
+<Multi_key> <y> <acute>                        : "\375"        yacute
+<Multi_key> <acute> <y>                        : "\375"        yacute
+<Multi_key> <y> <apostrophe>           : "\375"        yacute
+<Multi_key> <apostrophe> <y>           : "\375"        yacute
+<Multi_key> <y> <quotedbl>             : "\377"        ydiaeresis
+<Multi_key> <quotedbl> <y>             : "\377"        ydiaeresis
+<Multi_key> <y> <diaeresis>            : "\377"        ydiaeresis
+<Multi_key> <diaeresis> <y>            : "\377"        ydiaeresis
+<Multi_key> <Z> <less>                 : "\264"        Zcaron
+<Multi_key> <less> <Z>                 : "\264"        Zcaron
+<Multi_key> <z> <less>                 : "\270"        zcaron
+<Multi_key> <less> <z>                 : "\270"        zcaron
+<Multi_key> <v> <Z>                     : "\264"        Zcaron
+<Multi_key> <v> <z>                     : "\270"        zcaron
+XCOMM
+XCOMM dead key accent keysyms
+XCOMM Special Character
+<dead_circumflex>  <slash>             : "|"   bar
+<dead_grave> <space>                   : "`"   grave
+<dead_acute> <space>                   : "'"   apostrophe
+<dead_diaeresis> <space>               : "\250"        diaeresis
+<dead_circumflex> <space>              : "^"   asciicircum
+<dead_tilde> <space>                   : "~"   asciitilde
+<dead_circumflex> <0>                  : "\260"        degree
+<dead_circumflex> <1>                  : "\271"        onesuperior
+<dead_circumflex> <2>                  : "\262"        twosuperior
+<dead_circumflex> <3>                  : "\263"        threesuperior
+<dead_circumflex> <period>             : "\267"        periodcentered
+<dead_cedilla> <minus>                 : "\254"        notsign
+<dead_circumflex> <minus>              : "\257"        macron
+<dead_circumflex> <underscore>         : "\257"        macron
+<dead_acute> <apostrophe>              : "\264"        acute
+<dead_cedilla> <comma>                 : "\270"        cedilla
+<dead_diaeresis> <quotedbl>            : "\250"        diaeresis
+XCOMM Accented Alphabet
+<dead_abovering> <A>                    : "\305"        Aring
+<dead_abovering> <a>                    : "\345"        aring
+<dead_grave> <A>                       : "\300"        Agrave
+<dead_acute> <A>                       : "\301"        Aacute
+<dead_circumflex> <A>                  : "\302"        Acircumflex
+<dead_tilde> <A>                       : "\303"        Atilde
+<dead_diaeresis> <A>                   : "\304"        Adiaeresis
+<dead_grave> <a>                       : "\340"        agrave
+<dead_acute> <a>                       : "\341"        aacute
+<dead_circumflex> <a>                  : "\342"        acircumflex
+<dead_tilde> <a>                       : "\343"        atilde
+<dead_diaeresis> <a>                   : "\344"        adiaeresis
+<dead_cedilla> <C>                     : "\307"        Ccedilla
+<dead_cedilla> <c>                     : "\347"        ccedilla
+<dead_grave> <E>                       : "\310"        Egrave
+<dead_acute> <E>                       : "\311"        Eacute
+<dead_circumflex> <E>                  : "\312"        Ecircumflex
+<dead_diaeresis> <E>                   : "\313"        Ediaeresis
+<dead_grave> <e>                       : "\350"        egrave
+<dead_acute> <e>                       : "\351"        eacute
+<dead_circumflex> <e>                  : "\352"        ecircumflex
+<dead_diaeresis> <e>                   : "\353"        ediaeresis
+<dead_breve> <G>                        : "\320"        Gbreve
+<dead_breve> <g>                        : "\360"        gbreve
+<dead_abovedot> <I>                     : "\335"        Iabovedot
+<dead_grave> <I>                       : "\314"        Igrave
+<dead_acute> <I>                       : "\315"        Iacute
+<dead_circumflex> <I>                  : "\316"        Icircumflex
+<dead_diaeresis> <I>                   : "\317"        Idiaeresis
+<dead_abovedot> <i>                     : "\375"        idotless
+<dead_grave> <i>                       : "\354"        igrave
+<dead_acute> <i>                       : "\355"        iacute
+<dead_circumflex> <i>                  : "\356"        icircumflex
+<dead_diaeresis> <i>                   : "\357"        idiaeresis
+<dead_tilde> <N>                       : "\321"        Ntilde
+<dead_tilde> <n>                       : "\361"        ntilde
+<dead_grave> <O>                       : "\322"        Ograve
+<dead_acute> <O>                       : "\323"        Oacute
+<dead_circumflex> <O>                  : "\324"        Ocircumflex
+<dead_tilde> <O>                       : "\325"        Otilde
+<dead_diaeresis> <O>                   : "\326"        Odiaeresis
+<dead_grave> <o>                       : "\362"        ograve
+<dead_acute> <o>                       : "\363"        oacute
+<dead_circumflex> <o>                  : "\364"        ocircumflex
+<dead_tilde> <o>                       : "\365"        otilde
+<dead_diaeresis> <o>                   : "\366"        odiaeresis
+<dead_caron> <S>                       : "\246"        Scaron
+<dead_caron> <s>                       : "\250"        scaron
+<dead_cedilla> <S>                      : "\336"        Scedilla
+<dead_cedilla> <s>                      : "\376"        scedilla
+<dead_grave> <U>                       : "\331"        Ugrave
+<dead_acute> <U>                       : "\332"        Uacute
+<dead_circumflex> <U>                  : "\333"        Ucircumflex
+<dead_diaeresis> <U>                   : "\334"        Udiaeresis
+<dead_grave> <u>                       : "\371"        ugrave
+<dead_acute> <u>                       : "\372"        uacute
+<dead_circumflex> <u>                  : "\373"        ucircumflex
+<dead_diaeresis> <u>                   : "\374"        udiaeresis
+<dead_acute> <Y>                       : "\335"        Yacute
+<dead_diaeresis> <Y>                   : "\276"        Ydiaeresis
+<dead_acute> <y>                       : "\375"        yacute
+<dead_diaeresis> <y>                   : "\377"        ydiaeresis
+<dead_caron> <Z>                       : "\264"        Zcaron
+<dead_caron> <z>                       : "\270"        zcaron
+XCOMM End of Sequence Definition
diff --git a/nls/iso8859-9/XI18N_OBJS b/nls/iso8859-9/XI18N_OBJS
new file mode 100644 (file)
index 0000000..f20902a
--- /dev/null
@@ -0,0 +1,8 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for euro locales
+#
+XLC    common/xlibi18n _XlcGenericLoader       # XLC_open
+XIM    common/xiiimp   _XimpLocalOpenIM        # XIM_open
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
+
diff --git a/nls/iso8859-9/XLC_LOCALE.pre b/nls/iso8859-9/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..4ffbce7
--- /dev/null
@@ -0,0 +1,72 @@
+XCOMM  XLocale Database Sample for iso8859-9.
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class 
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         ISO8859-9:GL
+               substitute      ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset {
+               name            ISO8859-9:GR
+       }
+       font    {
+               primary         ISO8859-9:GR
+       }
+}
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          ISO8859-9
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+force_convert_to_mb    True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     ISO8859-9:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     ISO8859-9:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/iso8859-9e/Compose.pre b/nls/iso8859-9e/Compose.pre
new file mode 100644 (file)
index 0000000..9681531
--- /dev/null
@@ -0,0 +1,493 @@
+XCOMM
+XCOMM ISO 8859-9e (Latin??) Compose Sequence
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+<Multi_key> <plus> <plus>              : "#"   numbersign
+<Multi_key> <apostrophe> <space>       : "'"   apostrophe
+<Multi_key> <space> <apostrophe>       : "'"   apostrophe
+<Multi_key> <parenleft> <parenleft>    : "["   bracketleft
+<Multi_key> <slash> <slash>            : "\\"  backslash
+<Multi_key> <slash> <less>             : "\\"  backslash
+<Multi_key> <less> <slash>             : "\\"  backslash
+<Multi_key> <parenright> <parenright>  : "]"   bracketright
+<Multi_key> <asciicircum> <space>      : "^"   asciicircum
+<Multi_key> <space> <asciicircum>      : "^"   asciicircum
+<Multi_key> <greater> <space>          : "^"   asciicircum
+<Multi_key> <space> <greater>          : "^"   asciicircum
+<Multi_key> <grave> <space>            : "`"   grave
+<Multi_key> <space> <grave>            : "`"   grave
+<Multi_key> <parenleft> <minus>                : "{"   braceleft
+<Multi_key> <minus> <parenleft>                : "{"   braceleft
+<Multi_key> <slash> <asciicircum>      : "|"   bar
+<Multi_key> <asciicircum> <slash>      : "|"   bar
+<Multi_key> <V> <L>                    : "|"   bar
+<Multi_key> <L> <V>                    : "|"   bar
+<Multi_key> <v> <l>                    : "|"   bar
+<Multi_key> <l> <v>                    : "|"   bar
+<Multi_key> <parenright> <minus>       : "}"   braceright
+<Multi_key> <minus> <parenright>       : "}"   braceright
+<Multi_key> <asciitilde> <space>       : "~"   asciitilde
+<Multi_key> <space> <asciitilde>       : "~"   asciitilde
+<Multi_key> <minus> <space>            : "~"   asciitilde
+<Multi_key> <space> <minus>            : "~"   asciitilde
+<Multi_key> <exclam> <exclam>          : "\241"        exclamdown
+<Multi_key> <c> <slash>                        : "\242"        cent
+<Multi_key> <slash> <c>                        : "\242"        cent
+<Multi_key> <C> <slash>                        : "\242"        cent
+<Multi_key> <slash> <C>                        : "\242"        cent
+<Multi_key> <C> <bar>                  : "\242"        cent
+<Multi_key> <bar> <C>                  : "\242"        cent
+<Multi_key> <c> <bar>                  : "\242"        cent
+<Multi_key> <bar> <c>                  : "\242"        cent
+<Multi_key> <l> <minus>                        : "\243"        sterling
+<Multi_key> <minus> <l>                        : "\243"        sterling
+<Multi_key> <L> <minus>                        : "\243"        sterling
+<Multi_key> <minus> <L>                        : "\243"        sterling
+<Multi_key> <l> <equal>                        : "\243"        sterling
+<Multi_key> <equal> <l>                        : "\243"        sterling
+<Multi_key> <L> <equal>                        : "\243"        sterling
+<Multi_key> <equal> <L>                        : "\243"        sterling
+<Multi_key> <C> <equal>                        : "\244"        EuroSign
+<Multi_key> <equal> <C>                        : "\244"        EuroSign
+<Multi_key> <c> <equal>                 : "\244"        EuroSign
+<Multi_key> <equal> <c>                 : "\244"        EuroSign
+<Multi_key> <E> <equal>                        : "\244"        EuroSign
+<Multi_key> <equal> <E>                        : "\244"        EuroSign
+<Multi_key> <e> <equal>                 : "\244"        EuroSign
+<Multi_key> <equal> <e>                 : "\244"        EuroSign
+<Multi_key> <y> <minus>                        : "\245"        yen
+<Multi_key> <minus> <y>                        : "\245"        yen
+<Multi_key> <Y> <minus>                        : "\245"        yen
+<Multi_key> <minus> <Y>                        : "\245"        yen
+<Multi_key> <y> <equal>                        : "\245"        yen
+<Multi_key> <equal> <y>                        : "\245"        yen
+<Multi_key> <Y> <equal>                        : "\245"        yen
+<Multi_key> <equal> <Y>                        : "\245"        yen
+<Multi_key> <s> <o>                    : "\247"        section
+<Multi_key> <o> <s>                    : "\247"        section
+<Multi_key> <S> <O>                    : "\247"        section
+<Multi_key> <O> <S>                    : "\247"        section
+<Multi_key> <S> <exclam>               : "\247"        section
+<Multi_key> <exclam> <S>               : "\247"        section
+<Multi_key> <s> <exclam>               : "\247"        section
+<Multi_key> <exclam> <s>               : "\247"        section
+<Multi_key> <S> <0>                    : "\247"        section
+<Multi_key> <0> <S>                    : "\247"        section
+<Multi_key> <s> <0>                    : "\247"        section
+<Multi_key> <0> <s>                    : "\247"        section
+<Multi_key> <c> <o>                    : "\251"        copyright
+<Multi_key> <o> <c>                    : "\251"        copyright
+<Multi_key> <C> <O>                    : "\251"        copyright
+<Multi_key> <O> <C>                    : "\251"        copyright
+<Multi_key> <c> <O>                    : "\251"        copyright
+<Multi_key> <O> <c>                    : "\251"        copyright
+<Multi_key> <C> <o>                    : "\251"        copyright
+<Multi_key> <o> <C>                    : "\251"        copyright
+<Multi_key> <c> <0>                    : "\251"        copyright
+<Multi_key> <0> <c>                    : "\251"        copyright
+<Multi_key> <C> <0>                    : "\251"        copyright
+<Multi_key> <0> <C>                    : "\251"        copyright
+<Multi_key> <parenleft> <c>             : "\251"        copyright
+<Multi_key> <a> <underscore>           : "\252"        ordfeminine
+<Multi_key> <underscore> <a>           : "\252"        ordfeminine
+<Multi_key> <A> <underscore>           : "\252"        ordfeminine
+<Multi_key> <underscore> <A>           : "\252"        ordfeminine
+<Multi_key> <o> <underscore>           : "\272"        masculine
+<Multi_key> <underscore> <o>           : "\272"        masculine
+<Multi_key> <O> <underscore>           : "\272"        masculine
+<Multi_key> <underscore> <O>           : "\272"        masculine
+<Multi_key> <less> <less>              : "\253"        guillemotleft
+<Multi_key> <greater> <greater>                : "\273"        guillemotright
+<Multi_key> <0> <asciicircum>          : "\260"        degree
+<Multi_key> <asciicircum> <0>          : "\260"        degree
+<Multi_key> <0> <asterisk>             : "\260"        degree
+<Multi_key> <asterisk> <0>             : "\260"        degree
+<Multi_key> <plus> <minus>             : "\261"        plusminus
+<Multi_key> <minus> <plus>             : "\261"        plusminus
+<Multi_key> <slash> <u>                        : "\265"        mu
+<Multi_key> <u> <slash>                        : "\265"        mu
+<Multi_key> <slash> <U>                        : "\265"        mu
+<Multi_key> <U> <slash>                        : "\265"        mu
+<Multi_key> <1> <asciicircum>          : "\271"        onesuperior
+<Multi_key> <asciicircum> <1>          : "\271"        onesuperior
+<Multi_key> <S> <1>                    : "\271"        onesuperior
+<Multi_key> <1> <S>                    : "\271"        onesuperior
+<Multi_key> <s> <1>                    : "\271"        onesuperior
+<Multi_key> <1> <s>                    : "\271"        onesuperior
+<Multi_key> <2> <asciicircum>          : "\262"        twosuperior
+<Multi_key> <asciicircum> <2>          : "\262"        twosuperior
+<Multi_key> <S> <2>                    : "\262"        twosuperior
+<Multi_key> <2> <S>                    : "\262"        twosuperior
+<Multi_key> <s> <2>                    : "\262"        twosuperior
+<Multi_key> <2> <s>                    : "\262"        twosuperior
+<Multi_key> <3> <asciicircum>          : "\263"        threesuperior
+<Multi_key> <asciicircum> <3>          : "\263"        threesuperior
+<Multi_key> <S> <3>                    : "\263"        threesuperior
+<Multi_key> <3> <S>                    : "\263"        threesuperior
+<Multi_key> <s> <3>                    : "\263"        threesuperior
+<Multi_key> <3> <s>                    : "\263"        threesuperior
+<Multi_key> <p> <exclam>               : "\266"        paragraph
+<Multi_key> <exclam> <p>               : "\266"        paragraph
+<Multi_key> <P> <exclam>               : "\266"        paragraph
+<Multi_key> <exclam> <P>               : "\266"        paragraph
+<Multi_key> <period> <asciicircum>     : "\267"        periodcentered
+<Multi_key> <asciicircum> <period>     : "\267"        periodcentered
+<Multi_key> <period> <period>          : "\267"        periodcentered
+<Multi_key> <question> <question>      : "\277"        questiondown
+<Multi_key> <space> <space>            : "\240"        nobreakspace
+<Multi_key> <minus> <comma>            : "\254"        notsign
+<Multi_key> <comma> <minus>            : "\254"        notsign
+<Multi_key> <minus> <minus>            : "\255"        hyphen
+<Multi_key> <R> <O>                    : "\256"        registered
+<Multi_key> <O> <R>                    : "\256"        registered
+<Multi_key> <parenleft> <r>             : "\256"        registered
+<Multi_key> <minus> <asciicircum>      : "\257"        macron
+<Multi_key> <asciicircum> <minus>      : "\257"        macron
+<Multi_key> <underscore> <asciicircum> : "\257"        macron
+<Multi_key> <asciicircum> <underscore> : "\257"        macron
+<Multi_key> <underscore> <underscore>  : "\257"        macron
+<Multi_key> <minus> <colon>            : "\367"        division
+<Multi_key> <colon> <minus>            : "\367"        division
+<Multi_key> <x> <x>                    : "\327"        multiply
+<Multi_key> <apostrophe> <apostrophe>  : "\264"        acute
+<Multi_key> <comma> <comma>            : "\270"        cedilla
+<Multi_key> <quotedbl> <quotedbl>      : "\250"        diaeresis
+XCOMM Accented Alphabet
+<Multi_key> <A> <grave>                        : "\300"        Agrave
+<Multi_key> <grave> <A>                        : "\300"        Agrave
+<Multi_key> <A> <acute>                        : "\301"        Aacute
+<Multi_key> <acute> <A>                        : "\301"        Aacute
+<Multi_key> <A> <apostrophe>           : "\301"        Aacute
+<Multi_key> <apostrophe> <A>           : "\301"        Aacute
+<Multi_key> <A> <asciicircum>          : "\302"        Acircumflex
+<Multi_key> <asciicircum> <A>          : "\302"        Acircumflex
+<Multi_key> <A> <greater>              : "\302"        Acircumflex
+<Multi_key> <greater> <A>              : "\302"        Acircumflex
+<Multi_key> <A> <asciitilde>           : "\303"        Atilde
+<Multi_key> <asciitilde> <A>           : "\303"        Atilde
+<Multi_key> <A> <minus>                        : "\303"        Atilde
+<Multi_key> <minus> <A>                        : "\303"        Atilde
+<Multi_key> <A> <quotedbl>             : "\304"        Adiaeresis
+<Multi_key> <quotedbl> <A>             : "\304"        Adiaeresis
+<Multi_key> <A> <diaeresis>            : "\304"        Adiaeresis
+<Multi_key> <diaeresis> <A>            : "\304"        Adiaeresis
+<Multi_key> <A> <asterisk>             : "\305"        Aring
+<Multi_key> <asterisk> <A>             : "\305"        Aring
+<Multi_key> <A> <A>                    : "\305"        Aring
+<Multi_key> <E> <E>                    : "\306"        SCHWA
+<Multi_key> <a> <grave>                        : "\340"        agrave
+<Multi_key> <grave> <a>                        : "\340"        agrave
+<Multi_key> <a> <acute>                        : "\341"        aacute
+<Multi_key> <acute> <a>                        : "\341"        aacute
+<Multi_key> <a> <apostrophe>           : "\341"        aacute
+<Multi_key> <apostrophe> <a>           : "\341"        aacute
+<Multi_key> <a> <asciicircum>          : "\342"        acircumflex
+<Multi_key> <asciicircum> <a>          : "\342"        acircumflex
+<Multi_key> <a> <greater>              : "\342"        acircumflex
+<Multi_key> <greater> <a>              : "\342"        acircumflex
+<Multi_key> <a> <asciitilde>           : "\343"        atilde
+<Multi_key> <asciitilde> <a>           : "\343"        atilde
+<Multi_key> <a> <minus>                        : "\343"        atilde
+<Multi_key> <minus> <a>                        : "\343"        atilde
+<Multi_key> <a> <quotedbl>             : "\344"        adiaeresis
+<Multi_key> <quotedbl> <a>             : "\344"        adiaeresis
+<Multi_key> <a> <diaeresis>            : "\344"        adiaeresis
+<Multi_key> <diaeresis> <a>            : "\344"        adiaeresis
+<Multi_key> <a> <asterisk>             : "\345"        aring
+<Multi_key> <asterisk> <a>             : "\345"        aring
+<Multi_key> <a> <a>                    : "\345"        aring
+<Multi_key> <e> <e>                    : "\346"        schwa
+<Multi_key> <C> <comma>                        : "\307"        Ccedilla
+<Multi_key> <C> <cedilla>              : "\307"        Ccedilla
+<Multi_key> <comma> <C>                        : "\307"        Ccedilla
+<Multi_key> <cedilla> <C>              : "\307"        Ccedilla
+<Multi_key> <c> <comma>                        : "\347"        ccedilla
+<Multi_key> <c> <cedilla>              : "\347"        ccedilla
+<Multi_key> <comma> <c>                        : "\347"        ccedilla
+<Multi_key> <cedilla> <c>              : "\347"        ccedilla
+<Multi_key> <minus> <D>                        : "\320"        ETH
+<Multi_key> <D> <minus>                        : "\320"        ETH
+<Multi_key> <minus> <d>                        : "\360"        eth
+<Multi_key> <d> <minus>                        : "\360"        eth
+<Multi_key> <E> <grave>                        : "\310"        Egrave
+<Multi_key> <grave> <E>                        : "\310"        Egrave
+<Multi_key> <E> <acute>                        : "\311"        Eacute
+<Multi_key> <acute> <E>                        : "\311"        Eacute
+<Multi_key> <E> <apostrophe>           : "\311"        Eacute
+<Multi_key> <apostrophe> <E>           : "\311"        Eacute
+<Multi_key> <E> <asciicircum>          : "\312"        Ecircumflex
+<Multi_key> <asciicircum> <E>          : "\312"        Ecircumflex
+<Multi_key> <E> <greater>              : "\312"        Ecircumflex
+<Multi_key> <greater> <E>              : "\312"        Ecircumflex
+<Multi_key> <E> <quotedbl>             : "\313"        Ediaeresis
+<Multi_key> <quotedbl> <E>             : "\313"        Ediaeresis
+<Multi_key> <E> <diaeresis>            : "\313"        Ediaeresis
+<Multi_key> <diaeresis> <E>            : "\313"        Ediaeresis
+<Multi_key> <e> <grave>                        : "\350"        egrave
+<Multi_key> <grave> <e>                        : "\350"        egrave
+<Multi_key> <e> <acute>                        : "\351"        eacute
+<Multi_key> <acute> <e>                        : "\351"        eacute
+<Multi_key> <e> <apostrophe>           : "\351"        eacute
+<Multi_key> <apostrophe> <e>           : "\351"        eacute
+<Multi_key> <e> <asciicircum>          : "\352"        ecircumflex
+<Multi_key> <asciicircum> <e>          : "\352"        ecircumflex
+<Multi_key> <e> <greater>              : "\352"        ecircumflex
+<Multi_key> <greater> <e>              : "\352"        ecircumflex
+<Multi_key> <e> <quotedbl>             : "\353"        ediaeresis
+<Multi_key> <quotedbl> <e>             : "\353"        ediaeresis
+<Multi_key> <e> <diaeresis>            : "\353"        ediaeresis
+<Multi_key> <diaeresis> <e>            : "\353"        ediaeresis
+<Multi_key> <G> <U>                     : "\320"        Gbreve
+<Multi_key> <G> <parenleft>             : "\320"        Gbreve
+<Multi_key> <parenleft> <G>             : "\320"        Gbreve
+<Multi_key> <G> <breve>                 : "\320"        Gbreve
+<Multi_key> <breve> <G>                 : "\320"        Gbreve
+<Multi_key> <g> <U>                     : "\360"        gbreve
+<Multi_key> <g> <parenleft>             : "\360"        gbreve
+<Multi_key> <parenleft> <g>             : "\360"        gbreve
+<Multi_key> <g> <breve>                 : "\360"        gbreve
+<Multi_key> <breve> <g>                 : "\360"        gbreve
+<Multi_key> <I> <grave>                        : "\314"        Igrave
+<Multi_key> <grave> <I>                        : "\314"        Igrave
+<Multi_key> <I> <acute>                        : "\315"        Iacute
+<Multi_key> <acute> <I>                        : "\315"        Iacute
+<Multi_key> <I> <apostrophe>           : "\315"        Iacute
+<Multi_key> <apostrophe> <I>           : "\315"        Iacute
+<Multi_key> <I> <asciicircum>          : "\316"        Icircumflex
+<Multi_key> <asciicircum> <I>          : "\316"        Icircumflex
+<Multi_key> <I> <greater>              : "\316"        Icircumflex
+<Multi_key> <greater> <I>              : "\316"        Icircumflex
+<Multi_key> <I> <quotedbl>             : "\317"        Idiaeresis
+<Multi_key> <quotedbl> <I>             : "\317"        Idiaeresis
+<Multi_key> <I> <diaeresis>            : "\317"        Idiaeresis
+<Multi_key> <diaeresis> <I>            : "\317"        Idiaeresis
+<Multi_key> <I> <period>                : "\335"        Iabovedot
+<Multi_key> <period> <I>                : "\335"        Iabovedot
+<Multi_key> <i> <grave>                        : "\354"        igrave
+<Multi_key> <grave> <i>                        : "\354"        igrave
+<Multi_key> <i> <acute>                        : "\355"        iacute
+<Multi_key> <acute> <i>                        : "\355"        iacute
+<Multi_key> <i> <apostrophe>           : "\355"        iacute
+<Multi_key> <apostrophe> <i>           : "\355"        iacute
+<Multi_key> <i> <asciicircum>          : "\356"        icircumflex
+<Multi_key> <asciicircum> <i>          : "\356"        icircumflex
+<Multi_key> <i> <greater>              : "\356"        icircumflex
+<Multi_key> <greater> <i>              : "\356"        icircumflex
+<Multi_key> <i> <quotedbl>             : "\357"        idiaeresis
+<Multi_key> <quotedbl> <i>             : "\357"        idiaeresis
+<Multi_key> <i> <diaeresis>            : "\357"        idiaeresis
+<Multi_key> <diaeresis> <i>            : "\357"        idiaeresis
+<Multi_key> <i> <period>                : "\375"        idotless
+<Multi_key> <period> <i>                : "\375"        idotless
+<Multi_key> <N> <asciitilde>           : "\321"        Ntilde
+<Multi_key> <asciitilde> <N>           : "\321"        Ntilde
+<Multi_key> <N> <minus>                        : "\321"        Ntilde
+<Multi_key> <minus> <N>                        : "\321"        Ntilde
+<Multi_key> <n> <asciitilde>           : "\361"        ntilde
+<Multi_key> <asciitilde> <n>           : "\361"        ntilde
+<Multi_key> <n> <minus>                        : "\361"        ntilde
+<Multi_key> <minus> <n>                        : "\361"        ntilde
+<Multi_key> <O> <grave>                        : "\322"        Ograve
+<Multi_key> <grave> <O>                        : "\322"        Ograve
+<Multi_key> <O> <acute>                        : "\323"        Oacute
+<Multi_key> <acute> <O>                        : "\323"        Oacute
+<Multi_key> <O> <apostrophe>           : "\323"        Oacute
+<Multi_key> <apostrophe> <O>           : "\323"        Oacute
+<Multi_key> <O> <asciicircum>          : "\324"        Ocircumflex
+<Multi_key> <asciicircum> <O>          : "\324"        Ocircumflex
+<Multi_key> <O> <greater>              : "\324"        Ocircumflex
+<Multi_key> <greater> <O>              : "\324"        Ocircumflex
+<Multi_key> <O> <asciitilde>           : "\325"        Otilde
+<Multi_key> <asciitilde> <O>           : "\325"        Otilde
+<Multi_key> <O> <minus>                        : "\325"        Otilde
+<Multi_key> <minus> <O>                        : "\325"        Otilde
+<Multi_key> <O> <quotedbl>             : "\326"        Odiaeresis
+<Multi_key> <quotedbl> <O>             : "\326"        Odiaeresis
+<Multi_key> <O> <diaeresis>            : "\326"        Odiaeresis
+<Multi_key> <diaeresis> <O>            : "\326"        Odiaeresis
+<Multi_key> <O> <slash>                        : "\330"        Ooblique
+<Multi_key> <slash> <O>                        : "\330"        Ooblique
+<Multi_key> <O> <E>                    : "\274"        OE
+<Multi_key> <o> <grave>                        : "\362"        ograve
+<Multi_key> <grave> <o>                        : "\362"        ograve
+<Multi_key> <o> <acute>                        : "\363"        oacute
+<Multi_key> <acute> <o>                        : "\363"        oacute
+<Multi_key> <o> <apostrophe>           : "\363"        oacute
+<Multi_key> <apostrophe> <o>           : "\363"        oacute
+<Multi_key> <o> <asciicircum>          : "\364"        ocircumflex
+<Multi_key> <asciicircum> <o>          : "\364"        ocircumflex
+<Multi_key> <o> <greater>              : "\364"        ocircumflex
+<Multi_key> <greater> <o>              : "\364"        ocircumflex
+<Multi_key> <o> <asciitilde>           : "\365"        otilde
+<Multi_key> <asciitilde> <o>           : "\365"        otilde
+<Multi_key> <o> <minus>                        : "\365"        otilde
+<Multi_key> <minus> <o>                        : "\365"        otilde
+<Multi_key> <o> <quotedbl>             : "\366"        odiaeresis
+<Multi_key> <quotedbl> <o>             : "\366"        odiaeresis
+<Multi_key> <o> <diaeresis>            : "\366"        odiaeresis
+<Multi_key> <diaeresis> <o>            : "\366"        odiaeresis
+<Multi_key> <o> <slash>                        : "\370"        oslash
+<Multi_key> <slash> <o>                        : "\370"        oslash
+<Multi_key> <S> <cedilla>               : "\336"        Scedilla
+<Multi_key> <S> <comma>                 : "\336"        Scedilla
+<Multi_key> <cedilla> <S>               : "\336"        Scedilla
+<Multi_key> <cedilla> <s>               : "\376"        scedilla
+<Multi_key> <comma> <S>                 : "\336"        Scedilla
+<Multi_key> <comma> <s>                 : "\376"        scedilla
+<Multi_key> <s> <cedilla>               : "\376"        scedilla
+<Multi_key> <s> <comma>                 : "\376"        scedilla
+<Multi_key> <U> <grave>                        : "\331"        Ugrave
+<Multi_key> <grave> <U>                        : "\331"        Ugrave
+<Multi_key> <U> <acute>                        : "\332"        Uacute
+<Multi_key> <acute> <U>                        : "\332"        Uacute
+<Multi_key> <U> <apostrophe>           : "\332"        Uacute
+<Multi_key> <apostrophe> <U>           : "\332"        Uacute
+<Multi_key> <U> <asciicircum>          : "\333"        Ucircumflex
+<Multi_key> <asciicircum> <U>          : "\333"        Ucircumflex
+<Multi_key> <U> <greater>              : "\333"        Ucircumflex
+<Multi_key> <greater> <U>              : "\333"        Ucircumflex
+<Multi_key> <U> <quotedbl>             : "\334"        Udiaeresis
+<Multi_key> <quotedbl> <U>             : "\334"        Udiaeresis
+<Multi_key> <U> <diaeresis>            : "\334"        Udiaeresis
+<Multi_key> <diaeresis> <U>            : "\334"        Udiaeresis
+<Multi_key> <u> <grave>                        : "\371"        ugrave
+<Multi_key> <grave> <u>                        : "\371"        ugrave
+<Multi_key> <u> <acute>                        : "\372"        uacute
+<Multi_key> <acute> <u>                        : "\372"        uacute
+<Multi_key> <u> <apostrophe>           : "\372"        uacute
+<Multi_key> <apostrophe> <u>           : "\372"        uacute
+<Multi_key> <u> <asciicircum>          : "\373"        ucircumflex
+<Multi_key> <asciicircum> <u>          : "\373"        ucircumflex
+<Multi_key> <u> <greater>              : "\373"        ucircumflex
+<Multi_key> <greater> <u>              : "\373"        ucircumflex
+<Multi_key> <u> <quotedbl>             : "\374"        udiaeresis
+<Multi_key> <quotedbl> <u>             : "\374"        udiaeresis
+<Multi_key> <u> <diaeresis>            : "\374"        udiaeresis
+<Multi_key> <diaeresis> <u>            : "\374"        udiaeresis
+<Multi_key> <s> <s>                    : "\337"        ssharp
+<Multi_key> <T> <H>                    : "\336"        THORN
+<Multi_key> <t> <h>                    : "\376"        thorn
+<Multi_key> <Y> <acute>                        : "\327"        Yacute
+<Multi_key> <acute> <Y>                        : "\327"        Yacute
+<Multi_key> <Y> <apostrophe>           : "\327"        Yacute
+<Multi_key> <apostrophe> <Y>           : "\327"        Yacute
+<Multi_key> <Y> <quotedbl>             : "\276"        Ydiaeresis
+<Multi_key> <quotedbl> <Y>             : "\276"        Ydiaeresis
+<Multi_key> <Y> <diaeresis>            : "\276"        Ydiaeresis
+<Multi_key> <diaeresis> <Y>            : "\276"        Ydiaeresis
+<Multi_key> <y> <acute>                        : "\367"        yacute
+<Multi_key> <acute> <y>                        : "\367"        yacute
+<Multi_key> <y> <apostrophe>           : "\367"        yacute
+<Multi_key> <apostrophe> <y>           : "\367"        yacute
+<Multi_key> <y> <quotedbl>             : "\377"        ydiaeresis
+<Multi_key> <quotedbl> <y>             : "\377"        ydiaeresis
+<Multi_key> <y> <diaeresis>            : "\377"        ydiaeresis
+<Multi_key> <diaeresis> <y>            : "\377"        ydiaeresis
+<Multi_key> <Z> <less>                 : "\241"        Zcaron
+<Multi_key> <less> <Z>                 : "\241"        Zcaron
+<Multi_key> <z> <less>                 : "\261"        zcaron
+<Multi_key> <less> <z>                 : "\261"        zcaron
+<Multi_key> <v> <Z>                     : "\241"        Zcaron
+<Multi_key> <v> <z>                     : "\261"        zcaron
+<Multi_key> <G> <less>                 : "\252"        Gcaron
+<Multi_key> <less> <G>                 : "\252"        Gcaron
+<Multi_key> <g> <less>                 : "\272"        gcaron
+<Multi_key> <less> <g>                 : "\272"        gcaron
+<Multi_key> <v> <G>                     : "\252"        Gcaron
+<Multi_key> <v> <g>                     : "\272"        gcaron
+<Multi_key> <O> <less>                 : "\264"        Ocaron
+<Multi_key> <less> <O>                 : "\264"        Ocaron
+<Multi_key> <o> <less>                 : "\275"        ocaron
+<Multi_key> <less> <o>                 : "\275"        ocaron
+<Multi_key> <v> <O>                     : "\264"        Ocaron
+<Multi_key> <v> <o>                     : "\275"        ocaron
+XCOMM
+XCOMM dead key accent keysyms
+XCOMM Special Character
+<dead_circumflex>  <slash>             : "|"   bar
+<dead_grave> <space>                   : "`"   grave
+<dead_acute> <space>                   : "'"   apostrophe
+<dead_diaeresis> <space>               : "\250"        diaeresis
+<dead_circumflex> <space>              : "^"   asciicircum
+<dead_tilde> <space>                   : "~"   asciitilde
+<dead_circumflex> <0>                  : "\260"        degree
+<dead_circumflex> <1>                  : "\271"        onesuperior
+<dead_circumflex> <2>                  : "\262"        twosuperior
+<dead_circumflex> <3>                  : "\263"        threesuperior
+<dead_circumflex> <period>             : "\267"        periodcentered
+<dead_cedilla> <minus>                 : "\254"        notsign
+<dead_circumflex> <minus>              : "\257"        macron
+<dead_circumflex> <underscore>         : "\257"        macron
+<dead_acute> <apostrophe>              : "\264"        acute
+<dead_cedilla> <comma>                 : "\270"        cedilla
+<dead_diaeresis> <quotedbl>            : "\250"        diaeresis
+XCOMM Accented Alphabet
+<dead_abovering> <A>                    : "\305"        Aring
+<dead_abovering> <a>                    : "\345"        aring
+<dead_grave> <A>                       : "\300"        Agrave
+<dead_acute> <A>                       : "\301"        Aacute
+<dead_circumflex> <A>                  : "\302"        Acircumflex
+<dead_tilde> <A>                       : "\303"        Atilde
+<dead_diaeresis> <A>                   : "\304"        Adiaeresis
+<dead_grave> <a>                       : "\340"        agrave
+<dead_acute> <a>                       : "\341"        aacute
+<dead_circumflex> <a>                  : "\342"        acircumflex
+<dead_tilde> <a>                       : "\343"        atilde
+<dead_diaeresis> <a>                   : "\344"        adiaeresis
+<dead_cedilla> <C>                     : "\307"        Ccedilla
+<dead_cedilla> <c>                     : "\347"        ccedilla
+<dead_grave> <E>                       : "\310"        Egrave
+<dead_acute> <E>                       : "\311"        Eacute
+<dead_circumflex> <E>                  : "\312"        Ecircumflex
+<dead_diaeresis> <E>                   : "\313"        Ediaeresis
+<dead_grave> <e>                       : "\350"        egrave
+<dead_acute> <e>                       : "\351"        eacute
+<dead_circumflex> <e>                  : "\352"        ecircumflex
+<dead_diaeresis> <e>                   : "\353"        ediaeresis
+<dead_breve> <G>                        : "\320"        Gbreve
+<dead_breve> <g>                        : "\360"        gbreve
+<dead_abovedot> <I>                     : "\335"        Iabovedot
+<dead_grave> <I>                       : "\314"        Igrave
+<dead_acute> <I>                       : "\315"        Iacute
+<dead_circumflex> <I>                  : "\316"        Icircumflex
+<dead_diaeresis> <I>                   : "\317"        Idiaeresis
+<dead_abovedot> <i>                     : "\375"        idotless
+<dead_grave> <i>                       : "\354"        igrave
+<dead_acute> <i>                       : "\355"        iacute
+<dead_circumflex> <i>                  : "\356"        icircumflex
+<dead_diaeresis> <i>                   : "\357"        idiaeresis
+<dead_tilde> <N>                       : "\321"        Ntilde
+<dead_tilde> <n>                       : "\361"        ntilde
+<dead_grave> <O>                       : "\322"        Ograve
+<dead_acute> <O>                       : "\323"        Oacute
+<dead_circumflex> <O>                  : "\324"        Ocircumflex
+<dead_tilde> <O>                       : "\325"        Otilde
+<dead_diaeresis> <O>                   : "\326"        Odiaeresis
+<dead_grave> <o>                       : "\362"        ograve
+<dead_acute> <o>                       : "\363"        oacute
+<dead_circumflex> <o>                  : "\364"        ocircumflex
+<dead_tilde> <o>                       : "\365"        otilde
+<dead_diaeresis> <o>                   : "\366"        odiaeresis
+<dead_cedilla> <S>                      : "\336"        Scedilla
+<dead_cedilla> <s>                      : "\376"        scedilla
+<dead_grave> <U>                       : "\331"        Ugrave
+<dead_acute> <U>                       : "\332"        Uacute
+<dead_circumflex> <U>                  : "\333"        Ucircumflex
+<dead_diaeresis> <U>                   : "\334"        Udiaeresis
+<dead_grave> <u>                       : "\371"        ugrave
+<dead_acute> <u>                       : "\372"        uacute
+<dead_circumflex> <u>                  : "\373"        ucircumflex
+<dead_diaeresis> <u>                   : "\374"        udiaeresis
+<dead_acute> <Y>                       : "\327"        Yacute
+<dead_diaeresis> <Y>                   : "\276"        Ydiaeresis
+<dead_acute> <y>                       : "\367"        yacute
+<dead_diaeresis> <y>                   : "\377"        ydiaeresis
+<dead_caron> <Z>                       : "\241"        Zcaron
+<dead_caron> <z>                       : "\261"        zcaron
+<dead_caron> <G>                       : "\252"        Gcaron
+<dead_caron> <g>                       : "\272"        gcaron
+XCOMM End of Sequence Definition
diff --git a/nls/iso8859-9e/XI18N_OBJS b/nls/iso8859-9e/XI18N_OBJS
new file mode 100644 (file)
index 0000000..a0d710b
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for iso8859-9e locale
+#
+XLC    common/xlcDef   _XlcDefaultLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/iso8859-9e/XLC_LOCALE.pre b/nls/iso8859-9e/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..cc76578
--- /dev/null
@@ -0,0 +1,84 @@
+XCOMM  XLocale Database Sample for iso8859-9e.
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class 
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         ISO8859-9E:GL
+               substitute      ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset {
+               name            ISO8859-9E:GR
+       }
+       font    {
+               primary         ISO8859-9E:GR
+       }
+}
+END XLC_FONTSET
+XCOMM
+XCOMM  XLC_CHARSET_DEFINE category
+XCOMM
+XLC_CHARSET_DEFINE
+csd0   {
+       charset_name    ISO8859-9E
+       side            GR
+       length          1
+       string_encoding False
+       sequence        \x1b%/1
+}
+END XLC_CHARSET_DEFINE
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          ISO8859-9E
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+force_convert_to_mb    True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     ISO8859-9E:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     ISO8859-9E:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/ja.JIS/Compose.pre b/nls/ja.JIS/Compose.pre
new file mode 100644 (file)
index 0000000..b1f8e55
--- /dev/null
@@ -0,0 +1,14 @@
+XCOMM
+XCOMM ja.JIS Compose Sequence
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM
+XCOMM This file currently has no entries.  It appears that a compose file (even
+XCOMM just an empty one) is required for the appropriate keysyms to work for
+XCOMM this encoding.
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+
+XCOMM End of Sequence Definition
diff --git a/nls/ja.JIS/XI18N_OBJS b/nls/ja.JIS/XI18N_OBJS
new file mode 100644 (file)
index 0000000..0cf97ee
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for ja.JIS locale
+#
+XLC    common/xlibi18n _XlcGenericLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/ja.JIS/XLC_LOCALE.pre b/nls/ja.JIS/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..4b771ac
--- /dev/null
@@ -0,0 +1,124 @@
+XCOMM 
+XCOMM  XLocale Database Sample for ja_JP.jis
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         ISO8859-1:GL
+               substitute      JISX0201.1976-0:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class (Kanji)
+fs1    {
+       charset {
+               name            JISX0208.1983-0:GL
+       }
+       font    {
+               primary         JISX0208.1983-0:GL
+               substitute      JISX0208.1990-0:GL
+       }
+}
+XCOMM  fs2 class (Half Kana)
+fs2    {
+       charset {
+               name            JISX0201.1976-0:GR
+       }
+       font    {
+               primary         JISX0201.1976-0:GR
+               substitute      JISX0201.1976-0:GR
+               vertical_rotate all
+       }
+}
+XCOMM  fs3 class (Supplementary Kanji)
+XCOMM fs3      {
+XCOMM  charset {
+XCOMM          name            JISX0212.1990-0:GL
+XCOMM  }
+XCOMM  font    {
+XCOMM          primary         JISX0212.1990-0:GL
+XCOMM  }
+XCOMM }
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          ja.jis
+mb_cur_max             5
+state_depend_encoding  True
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+force_convert_to_mb    True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       mb_encoding     <LSL> \x1b \x28 \x4a;\
+                       <LSL> \x1b \x28 \x42
+       wc_encoding     \x00000000
+       ct_encoding     ISO8859-1:GL; JISX0201.1976-0:GL
+}
+
+XCOMM  cs1 class
+cs1    {
+       side            GL
+       length          2
+       mb_encoding     <LSL> \x1b \x24 \x42;\
+                       <LSL> \x1b \x24 \x40
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     JISX0208.1983-0:GL; JISX0208.1983-0:GR;\
+                       JISX0208.1983-1:GL; JISX0208.1983-1:GR
+}
+
+XCOMM  cs2 class
+cs2    {
+       side            GL
+       length          1
+       mb_encoding     <LSL> \x1b \x28 \x49
+#if WCHAR32
+       wc_encoding     \x10000000
+#else
+       wc_encoding     \x00000080
+#endif
+       ct_encoding     JISX0201.1976-0:GR
+}
+
+XCOMM  cs3 class
+XCOMM cs3      {
+XCOMM  side            GL
+XCOMM  length          2
+XCOMM  mb_encoding     <LSL> \x1b \x24 \x28 \x44
+XCOMM #if WCHAR32
+XCOMM  wc_encoding     \x20000000
+XCOMM #else
+XCOMM  wc_encoding     \x00008000
+XCOMM #endif
+XCOMM  ct_encoding     JISX0212.1990-0:GL; JISX0212.1990-0:GR
+XCOMM }
+
+END XLC_XLOCALE
diff --git a/nls/ja.S90/Compose.pre b/nls/ja.S90/Compose.pre
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/nls/ja.S90/XI18N_OBJS b/nls/ja.S90/XI18N_OBJS
new file mode 100644 (file)
index 0000000..d8f0fdd
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for ja.S90 locale
+#
+XLC    common/xlibi18n _XlcGenericLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/ja.S90/XLC_LOCALE.pre b/nls/ja.S90/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..cb4e49d
--- /dev/null
@@ -0,0 +1,150 @@
+XCOMM Copyright 1995 by FUJITSU LIMITED
+XCOMM This is source code modified by FUJITSU LIMITED under the Joint
+XCOMM Development Agreement for the CDEnext PST.
+XCOMM This is unpublished proprietary source code of FUJITSU LIMITED
+XCOMM
+XCOMM NLS-DB for ja_JP.S90
+
+XCOMM
+XCOMM  XLC_CHARSET_DEFINE category
+XCOMM
+XLC_CHARSET_DEFINE
+csd0   {
+       charset_name    u90x03.1991-0
+       side            GL
+       length          2
+       gc_number       94
+       string_encoding False
+       sequence        \x1b\x25\x28\x32
+       encoding_name   fujitsu.U90X03
+}
+
+csd1   {
+       charset_name    u90x03.1991-0
+       side            GR
+       length          2
+       gc_number       94
+       string_encoding False
+       sequence        \x1b\x25\x2f\x32
+       encoding_name   fujitsu.U90X03
+}
+END XLC_CHARSET_DEFINE
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name    JISX0201.1976-0:GL
+       }
+       font    {
+               primary         JISX0201.1976-0:GL
+               substitute      ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class (Kanji)
+fs1    {
+       charset {
+               name    JISX0208.1983-0:GL
+               udc_area \x7521,\x7e7e
+       }
+       font    {
+               primary         fujitsu.u90x01.1991-0:GL,[\x2121,\x747e];\
+                               fujitsu.u90x03.1991-0:GL,[\x7521,\x7e7e]->\x6521
+                substitute      u90x01.1991-0:GL;\
+                                JISX0208.1983-0:GL; JISX0208.1983-0:GR;\
+                                JISX0208.1983-1:GL; JISX0208.1983-1:GR;\
+                                JISX0208.1990-0:GL; JISX0208.1990-0:GR
+               vertical_map    u90x01.1991-0.2:GL,\
+                       [\x2122,\x2125]->\x7d21,[\x2131,\x2132]->\x7d25,\
+                       [\x213c,\x213e]->\x7d27,[\x2141,\x215b]->\x7d2a,\
+                       [\x2421,\x2421]->\x7d45,[\x2423,\x2423]->\x7d46,\
+                       [\x2425,\x2425]->\x7d47,[\x2427,\x2427]->\x7d48,\
+                       [\x2429,\x2429]->\x7d49,[\x2443,\x2443]->\x7d4a,\
+                       [\x2463,\x2463]->\x7d4b,[\x2465,\x2465]->\x7d4c,\
+                       [\x2467,\x2467]->\x7d4d,[\x246e,\x246e]->\x7d4e,\
+                       [\x2521,\x2521]->\x7d4f,[\x2523,\x2523]->\x7d50,\
+                       [\x2525,\x2525]->\x7d51,[\x2527,\x2527]->\x7d52,\
+                       [\x2529,\x2529]->\x7d53,[\x2543,\x2543]->\x7d54,\
+                       [\x2563,\x2563]->\x7d55,[\x2565,\x2565]->\x7d56,\
+                       [\x2567,\x2567]->\x7d57,[\x256e,\x256e]->\x7d58,\
+                       [\x2575,\x2576]->\x7d59,[\x2475,\x2476]->\x7d5b
+       }
+}
+XCOMM  fs2 class (Half Kana)
+fs2    {
+       charset {
+               name            JISX0201.1976-0:GR
+        }
+       font    {
+               primary         JISX0201.1976-0:GR
+               vertical_rotate all
+       }
+}
+XCOMM  fs3 class (JEF Kanji + User Defined Character)
+fs3    {
+       charset {
+               name    u90x03.1991-0:GR; u90x03.1991-0:GL
+               udc_area        \x6521,\x787e
+       }
+       font    {
+               primary         fujitsu.u90x03.1991-0:GL
+                substitute      u90x03.1991-0:GL;\
+                                JISX0208.1983-0:GL; JISX0208.1983-0:GR;\
+                                JISX0208.1983-1:GL; JISX0208.1983-1:GR;\
+                                JISX0208.1990-0:GL; JISX0208.1990-0:GR
+       }
+}
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+XCOMM encoding_name            ja.euc
+encoding_name ja_JP.S90
+mb_cur_max             3
+state_depend_encoding  False
+
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     JISX0201.1976-0:GL; ISO8859-1:GL
+}
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          2
+       wc_encoding     \x30000000
+       ct_encoding     JISX0208.1983-0:GL; JISX0208.1983-0:GR;\
+                       JISX0208.1983-1:GL; JISX0208.1983-1:GR
+}
+
+XCOMM  cs2 class
+cs2    {
+       side            GR
+       length          1
+       mb_encoding     <SS> \x8e
+       wc_encoding     \x10000000
+       ct_encoding     JISX0201.1976-0:GR
+}
+XCOMM  cs3 class
+cs3    {
+       side            GR
+       length          2
+       mb_encoding     <SS> \x8f
+       wc_encoding     \x20000000
+       ct_encoding     u90x03.1991-0:GR; u90x03.1991-0:GL
+}
+END XLC_XLOCALE
diff --git a/nls/ja.SJIS/Compose.pre b/nls/ja.SJIS/Compose.pre
new file mode 100644 (file)
index 0000000..a6c75ef
--- /dev/null
@@ -0,0 +1,14 @@
+XCOMM
+XCOMM ja.SJIS Compose Sequence
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM
+XCOMM This file currently has no entries.  It appears that a compose file (even
+XCOMM just an empty one) is required for the appropriate keysyms to work for
+XCOMM this encoding.
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+
+XCOMM End of Sequence Definition
diff --git a/nls/ja.SJIS/XI18N_OBJS b/nls/ja.SJIS/XI18N_OBJS
new file mode 100644 (file)
index 0000000..29dffff
--- /dev/null
@@ -0,0 +1,10 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for ja locale
+#
+XLC    ja_JP.PCK/xlibi18n_PCK  _XlcGenericLoader       # XLC_open
+XLC    common/xlibi18n _XlcGenericLoader       # XLC_open
+XIM    common/ximp40   _Ximp_OpenIM            # XIM_open
+XIM    common/ximlocal _XimpLocalOpenIM        # XIM_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_regiser XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM # XOM_open
diff --git a/nls/ja.SJIS/XLC_LOCALE.pre b/nls/ja.SJIS/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..671a985
--- /dev/null
@@ -0,0 +1,384 @@
+XCOMM 
+XCOMM  XLocale Database Sample for ja_JP.sjis
+XCOMM 
+
+#ifndef __uxp__
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         ISO8859-1:GL
+               substitute      JISX0201.1976-0:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class (Kanji)
+fs1    {
+       charset {
+               name            JISX0208.1983-0:GL
+       }
+       font    {
+               primary         JISX0208.1983-0:GL
+               substitute      JISX0208.1990-0:GL
+       }
+}
+XCOMM  fs2 class (Half Kana)
+fs2    {
+       charset {
+               name            JISX0201.1976-0:GR
+       }
+       font    {
+               primary         JISX0201.1976-0:GR
+               substitute      JISX0201.1976-0:GR
+               vertical_rotate all
+       }
+}
+XCOMM  fs3 class (Supplementary Kanji)
+XCOMM fs3      {
+XCOMM  charset {
+XCOMM          name            JISX0212.1990-0:GL
+XCOMM  }
+XCOMM  font    {
+XCOMM          primary         JISX0212.1990-0:GL
+XCOMM  }
+XCOMM }
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          ja.sjis
+mb_cur_max             2
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+force_convert_to_mb    True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     ISO8859-1:GL; JISX0201.1976-0:GL
+}
+
+XCOMM  cs1 class
+cs1    {
+       side            none
+       length          2
+       byte1           \x81,\x9f;\xe0,\xef
+       byte2           \x40,\x7e;\x80,\xfc
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     JISX0208.1983-0:GL; JISX0208.1983-0:GR;\
+                       JISX0208.1983-1:GL; JISX0208.1983-1:GR
+       mb_conversion   \
+    [\x8140,\x817e]->\x2121,[\x8180,\x819e]->\x2160,[\x819f,\x81fc]->\x2221,\
+    [\x8240,\x827e]->\x2321,[\x8280,\x829e]->\x2360,[\x829f,\x82fc]->\x2421,\
+    [\x8340,\x837e]->\x2521,[\x8380,\x839e]->\x2560,[\x839f,\x83fc]->\x2621,\
+    [\x8440,\x847e]->\x2721,[\x8480,\x849e]->\x2760,[\x849f,\x84fc]->\x2821,\
+    [\x8540,\x857e]->\x2921,[\x8580,\x859e]->\x2960,[\x859f,\x85fc]->\x2a21,\
+    [\x8640,\x867e]->\x2b21,[\x8680,\x869e]->\x2b60,[\x869f,\x86fc]->\x2c21,\
+    [\x8740,\x877e]->\x2d21,[\x8780,\x879e]->\x2d60,[\x879f,\x87fc]->\x2e21,\
+    [\x8840,\x887e]->\x2f21,[\x8880,\x889e]->\x2f60,[\x889f,\x88fc]->\x3021,\
+    [\x8940,\x897e]->\x3121,[\x8980,\x899e]->\x3160,[\x899f,\x89fc]->\x3221,\
+    [\x8a40,\x8a7e]->\x3321,[\x8a80,\x8a9e]->\x3360,[\x8a9f,\x8afc]->\x3421,\
+    [\x8b40,\x8b7e]->\x3521,[\x8b80,\x8b9e]->\x3560,[\x8b9f,\x8bfc]->\x3621,\
+    [\x8c40,\x8c7e]->\x3721,[\x8c80,\x8c9e]->\x3760,[\x8c9f,\x8cfc]->\x3821,\
+    [\x8d40,\x8d7e]->\x3921,[\x8d80,\x8d9e]->\x3960,[\x8d9f,\x8dfc]->\x3a21,\
+    [\x8e40,\x8e7e]->\x3b21,[\x8e80,\x8e9e]->\x3b60,[\x8e9f,\x8efc]->\x3c21,\
+    [\x8f40,\x8f7e]->\x3d21,[\x8f80,\x8f9e]->\x3d60,[\x8f9f,\x8ffc]->\x3e21,\
+    [\x9040,\x907e]->\x3f21,[\x9080,\x909e]->\x3f60,[\x909f,\x90fc]->\x4021,\
+    [\x9140,\x917e]->\x4121,[\x9180,\x919e]->\x4160,[\x919f,\x91fc]->\x4221,\
+    [\x9240,\x927e]->\x4321,[\x9280,\x929e]->\x4360,[\x929f,\x92fc]->\x4421,\
+    [\x9340,\x937e]->\x4521,[\x9380,\x939e]->\x4560,[\x939f,\x93fc]->\x4621,\
+    [\x9440,\x947e]->\x4721,[\x9480,\x949e]->\x4760,[\x949f,\x94fc]->\x4821,\
+    [\x9540,\x957e]->\x4921,[\x9580,\x959e]->\x4960,[\x959f,\x95fc]->\x4a21,\
+    [\x9640,\x967e]->\x4b21,[\x9680,\x969e]->\x4b60,[\x969f,\x96fc]->\x4c21,\
+    [\x9740,\x977e]->\x4d21,[\x9780,\x979e]->\x4d60,[\x979f,\x97fc]->\x4e21,\
+    [\x9840,\x987e]->\x4f21,[\x9880,\x989e]->\x4f60,[\x989f,\x98fc]->\x5021,\
+    [\x9940,\x997e]->\x5121,[\x9980,\x999e]->\x5160,[\x999f,\x99fc]->\x5221,\
+    [\x9a40,\x9a7e]->\x5321,[\x9a80,\x9a9e]->\x5360,[\x9a9f,\x9afc]->\x5421,\
+    [\x9b40,\x9b7e]->\x5521,[\x9b80,\x9b9e]->\x5560,[\x9b9f,\x9bfc]->\x5621,\
+    [\x9c40,\x9c7e]->\x5721,[\x9c80,\x9c9e]->\x5760,[\x9c9f,\x9cfc]->\x5821,\
+    [\x9d40,\x9d7e]->\x5921,[\x9d80,\x9d9e]->\x5960,[\x9d9f,\x9dfc]->\x5a21,\
+    [\x9e40,\x9e7e]->\x5b21,[\x9e80,\x9e9e]->\x5b60,[\x9e9f,\x9efc]->\x5c21,\
+    [\x9f40,\x9f7e]->\x5d21,[\x9f80,\x9f9e]->\x5d60,[\x9f9f,\x9ffc]->\x5e21,\
+    [\xe040,\xe07e]->\x5f21,[\xe080,\xe09e]->\x5f60,[\xe09f,\xe0fc]->\x6021,\
+    [\xe140,\xe17e]->\x6121,[\xe180,\xe19e]->\x6160,[\xe19f,\xe1fc]->\x6221,\
+    [\xe240,\xe27e]->\x6321,[\xe280,\xe29e]->\x6360,[\xe29f,\xe2fc]->\x6421,\
+    [\xe340,\xe37e]->\x6521,[\xe380,\xe39e]->\x6560,[\xe39f,\xe3fc]->\x6621,\
+    [\xe440,\xe47e]->\x6721,[\xe480,\xe49e]->\x6760,[\xe49f,\xe4fc]->\x6821,\
+    [\xe540,\xe57e]->\x6921,[\xe580,\xe59e]->\x6960,[\xe59f,\xe5fc]->\x6a21,\
+    [\xe640,\xe67e]->\x6b21,[\xe680,\xe69e]->\x6b60,[\xe69f,\xe6fc]->\x6c21,\
+    [\xe740,\xe77e]->\x6d21,[\xe780,\xe79e]->\x6d60,[\xe79f,\xe7fc]->\x6e21,\
+    [\xe840,\xe87e]->\x6f21,[\xe880,\xe89e]->\x6f60,[\xe89f,\xe8fc]->\x7021,\
+    [\xe940,\xe97e]->\x7121,[\xe980,\xe99e]->\x7160,[\xe99f,\xe9fc]->\x7221,\
+    [\xea40,\xea7e]->\x7321,[\xea80,\xea9e]->\x7360,[\xea9f,\xeafc]->\x7421,\
+    [\xeb40,\xeb7e]->\x7521,[\xeb80,\xeb9e]->\x7560,[\xeb9f,\xebfc]->\x7621,\
+    [\xec40,\xec7e]->\x7721,[\xec80,\xec9e]->\x7760,[\xec9f,\xecfc]->\x7821,\
+    [\xed40,\xed7e]->\x7921,[\xed80,\xed9e]->\x7960,[\xed9f,\xedfc]->\x7a21,\
+    [\xee40,\xee7e]->\x7b21,[\xee80,\xee9e]->\x7b60,[\xee9f,\xeefc]->\x7c21,\
+    [\xef40,\xef7e]->\x7d21,[\xef80,\xef9e]->\x7d60,[\xef9f,\xeffc]->\x7e21
+}
+
+XCOMM  cs2 class
+cs2    {
+       side            GR
+       length          1
+#if WCHAR32
+       wc_encoding     \x10000000
+#else
+       wc_encoding     \x00000080
+#endif
+       ct_encoding     JISX0201.1976-0:GR
+}
+
+XCOMM  cs3 class
+XCOMM cs3      {
+XCOMM  side            GR
+XCOMM  length          2
+XCOMM #if WCHAR32
+XCOMM  wc_encoding     \x20000000
+XCOMM #else
+XCOMM  wc_encoding     \x00008000
+XCOMM #endif
+XCOMM  ct_encoding     JISX0212.1990-0:GL; JISX0212.1990-0:GR
+XCOMM }
+
+END XLC_XLOCALE
+
+#else /* __uxp__ */
+
+XCOMM  For UXP/DS plat form
+XCOMM
+XCOMM       XLC_CHARSET_DEFINE category
+XCOMM
+XLC_CHARSET_DEFINE
+csd0    {
+        charset_name    u90x03.1991-0
+        side            GL
+        length          2
+        gc_number       94
+        string_encoding False
+        sequence        \x1b\x25\x28\x32
+        encoding_name   fujitsu.U90X03
+}
+
+csd1    {
+        charset_name    u90x03.1991-0
+        side            GR
+        length          2
+        gc_number       94
+        string_encoding False
+        sequence        \x1b\x25\x2f\x32
+        encoding_name   fujitsu.U90X03
+}
+END XLC_CHARSET_DEFINE
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name            JISX0201.1976-0:GL
+       }
+       font    {
+               primary         JISX0201.1976-0:GL
+               substitute      ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class (Kanji)
+fs1    {
+       charset {
+               name            JISX0208.1983-0:GL
+       }
+       font    {
+                primary         fujitsu.u90x01.1991-0:GL
+                substitute      u90x01.1991-0:GL;\
+                                JISX0208.1983-0:GL; JISX0208.1983-0:GR;\
+                                JISX0208.1983-1:GL; JISX0208.1983-1:GR;\
+                                JISX0208.1990-0:GL; JISX0208.1990-0:GR
+               vertical_map    u90x01.1991-0.2:GL,\
+                        [\x2122,\x2125]->\x7d21,[\x2131,\x2132]->\x7d25,\
+                        [\x213c,\x213e]->\x7d27,[\x2141,\x215b]->\x7d2a,\
+                        [\x2421,\x2421]->\x7d45,[\x2423,\x2423]->\x7d46,\
+                        [\x2425,\x2425]->\x7d47,[\x2427,\x2427]->\x7d48,\
+                        [\x2429,\x2429]->\x7d49,[\x2443,\x2443]->\x7d4a,\
+                        [\x2463,\x2463]->\x7d4b,[\x2465,\x2465]->\x7d4c,\
+                        [\x2467,\x2467]->\x7d4d,[\x246e,\x246e]->\x7d4e,\
+                        [\x2521,\x2521]->\x7d4f,[\x2523,\x2523]->\x7d50,\
+                        [\x2525,\x2525]->\x7d51,[\x2527,\x2527]->\x7d52,\
+                        [\x2529,\x2529]->\x7d53,[\x2543,\x2543]->\x7d54,\
+                        [\x2563,\x2563]->\x7d55,[\x2565,\x2565]->\x7d56,\
+                        [\x2567,\x2567]->\x7d57,[\x256e,\x256e]->\x7d58,\
+                        [\x2575,\x2576]->\x7d59,[\x2475,\x2476]->\x7d5b
+       }
+}
+XCOMM  fs2 class (Half Kana)
+fs2    {
+       charset {
+               name            JISX0201.1976-0:GR
+       }
+       font    {
+               primary         JISX0201.1976-0:GR
+               vertical_rotate all
+       }
+}
+XCOMM  fs3 class (Supplementary Kanji)
+fs3    {
+       charset {
+               name            u90x03.1991-0:GL; u90x03.1991-0:GR
+               udc_area        \x6521,\x787e
+       }
+       font    {
+                primary         fujitsu.u90x03.1991-0:GL
+                substitute      u90x03.1991-0:GL;\
+                                JISX0208.1983-0:GL; JISX0208.1983-0:GR;\
+                                JISX0208.1983-1:GL; JISX0208.1983-1:GR;\
+                                JISX0208.1990-0:GL; JISX0208.1990-0:GR
+       }
+}
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          ja.sjis
+mb_cur_max             2
+state_depend_encoding  False
+
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     JISX0201.1976-0:GL; ISO8859-1:GL
+}
+
+XCOMM  cs1 class
+cs1    {
+       side            none
+       length          2
+       byte1           \x81,\x9f;\xe0,\xef
+       byte2           \x40,\x7e;\x80,\xfc
+
+       wc_encoding     \x30000000
+
+       ct_encoding     JISX0208.1983-0:GL; JISX0208.1983-0:GR;\
+                       JISX0208.1983-1:GL; JISX0208.1983-1:GR
+       mb_conversion   \
+    [\x8140,\x817e]->\x2121,[\x8180,\x819e]->\x2160,[\x819f,\x81fc]->\x2221,\
+    [\x8240,\x827e]->\x2321,[\x8280,\x829e]->\x2360,[\x829f,\x82fc]->\x2421,\
+    [\x8340,\x837e]->\x2521,[\x8380,\x839e]->\x2560,[\x839f,\x83fc]->\x2621,\
+    [\x8440,\x847e]->\x2721,[\x8480,\x849e]->\x2760,[\x849f,\x84fc]->\x2821,\
+    [\x8540,\x857e]->\x2921,[\x8580,\x859e]->\x2960,[\x859f,\x85fc]->\x2a21,\
+    [\x8640,\x867e]->\x2b21,[\x8680,\x869e]->\x2b60,[\x869f,\x86fc]->\x2c21,\
+    [\x8740,\x877e]->\x2d21,[\x8780,\x879e]->\x2d60,[\x879f,\x87fc]->\x2e21,\
+    [\x8840,\x887e]->\x2f21,[\x8880,\x889e]->\x2f60,[\x889f,\x88fc]->\x3021,\
+    [\x8940,\x897e]->\x3121,[\x8980,\x899e]->\x3160,[\x899f,\x89fc]->\x3221,\
+    [\x8a40,\x8a7e]->\x3321,[\x8a80,\x8a9e]->\x3360,[\x8a9f,\x8afc]->\x3421,\
+    [\x8b40,\x8b7e]->\x3521,[\x8b80,\x8b9e]->\x3560,[\x8b9f,\x8bfc]->\x3621,\
+    [\x8c40,\x8c7e]->\x3721,[\x8c80,\x8c9e]->\x3760,[\x8c9f,\x8cfc]->\x3821,\
+    [\x8d40,\x8d7e]->\x3921,[\x8d80,\x8d9e]->\x3960,[\x8d9f,\x8dfc]->\x3a21,\
+    [\x8e40,\x8e7e]->\x3b21,[\x8e80,\x8e9e]->\x3b60,[\x8e9f,\x8efc]->\x3c21,\
+    [\x8f40,\x8f7e]->\x3d21,[\x8f80,\x8f9e]->\x3d60,[\x8f9f,\x8ffc]->\x3e21,\
+    [\x9040,\x907e]->\x3f21,[\x9080,\x909e]->\x3f60,[\x909f,\x90fc]->\x4021,\
+    [\x9140,\x917e]->\x4121,[\x9180,\x919e]->\x4160,[\x919f,\x91fc]->\x4221,\
+    [\x9240,\x927e]->\x4321,[\x9280,\x929e]->\x4360,[\x929f,\x92fc]->\x4421,\
+    [\x9340,\x937e]->\x4521,[\x9380,\x939e]->\x4560,[\x939f,\x93fc]->\x4621,\
+    [\x9440,\x947e]->\x4721,[\x9480,\x949e]->\x4760,[\x949f,\x94fc]->\x4821,\
+    [\x9540,\x957e]->\x4921,[\x9580,\x959e]->\x4960,[\x959f,\x95fc]->\x4a21,\
+    [\x9640,\x967e]->\x4b21,[\x9680,\x969e]->\x4b60,[\x969f,\x96fc]->\x4c21,\
+    [\x9740,\x977e]->\x4d21,[\x9780,\x979e]->\x4d60,[\x979f,\x97fc]->\x4e21,\
+    [\x9840,\x987e]->\x4f21,[\x9880,\x989e]->\x4f60,[\x989f,\x98fc]->\x5021,\
+    [\x9940,\x997e]->\x5121,[\x9980,\x999e]->\x5160,[\x999f,\x99fc]->\x5221,\
+    [\x9a40,\x9a7e]->\x5321,[\x9a80,\x9a9e]->\x5360,[\x9a9f,\x9afc]->\x5421,\
+    [\x9b40,\x9b7e]->\x5521,[\x9b80,\x9b9e]->\x5560,[\x9b9f,\x9bfc]->\x5621,\
+    [\x9c40,\x9c7e]->\x5721,[\x9c80,\x9c9e]->\x5760,[\x9c9f,\x9cfc]->\x5821,\
+    [\x9d40,\x9d7e]->\x5921,[\x9d80,\x9d9e]->\x5960,[\x9d9f,\x9dfc]->\x5a21,\
+    [\x9e40,\x9e7e]->\x5b21,[\x9e80,\x9e9e]->\x5b60,[\x9e9f,\x9efc]->\x5c21,\
+    [\x9f40,\x9f7e]->\x5d21,[\x9f80,\x9f9e]->\x5d60,[\x9f9f,\x9ffc]->\x5e21,\
+    [\xe040,\xe07e]->\x5f21,[\xe080,\xe09e]->\x5f60,[\xe09f,\xe0fc]->\x6021,\
+    [\xe140,\xe17e]->\x6121,[\xe180,\xe19e]->\x6160,[\xe19f,\xe1fc]->\x6221,\
+    [\xe240,\xe27e]->\x6321,[\xe280,\xe29e]->\x6360,[\xe29f,\xe2fc]->\x6421,\
+    [\xe340,\xe37e]->\x6521,[\xe380,\xe39e]->\x6560,[\xe39f,\xe3fc]->\x6621,\
+    [\xe440,\xe47e]->\x6721,[\xe480,\xe49e]->\x6760,[\xe49f,\xe4fc]->\x6821,\
+    [\xe540,\xe57e]->\x6921,[\xe580,\xe59e]->\x6960,[\xe59f,\xe5fc]->\x6a21,\
+    [\xe640,\xe67e]->\x6b21,[\xe680,\xe69e]->\x6b60,[\xe69f,\xe6fc]->\x6c21,\
+    [\xe740,\xe77e]->\x6d21,[\xe780,\xe79e]->\x6d60,[\xe79f,\xe7fc]->\x6e21,\
+    [\xe840,\xe87e]->\x6f21,[\xe880,\xe89e]->\x6f60,[\xe89f,\xe8fc]->\x7021,\
+    [\xe940,\xe97e]->\x7121,[\xe980,\xe99e]->\x7160,[\xe99f,\xe9fc]->\x7221,\
+    [\xea40,\xea7e]->\x7321,[\xea80,\xea9e]->\x7360,[\xea9f,\xeafc]->\x7421,\
+    [\xeb40,\xeb7e]->\x7521,[\xeb80,\xeb9e]->\x7560,[\xeb9f,\xebfc]->\x7621,\
+    [\xec40,\xec7e]->\x7721,[\xec80,\xec9e]->\x7760,[\xec9f,\xecfc]->\x7821,\
+    [\xed40,\xed7e]->\x7921,[\xed80,\xed9e]->\x7960,[\xed9f,\xedfc]->\x7a21,\
+    [\xee40,\xee7e]->\x7b21,[\xee80,\xee9e]->\x7b60,[\xee9f,\xeefc]->\x7c21,\
+    [\xef40,\xef7e]->\x7d21,[\xef80,\xef9e]->\x7d60,[\xef9f,\xeffc]->\x7e21
+}
+
+XCOMM  cs2 class
+cs2    {
+       side            GR
+       length          1
+       wc_encoding     \x10000000
+       ct_encoding     JISX0201.1976-0:GR
+}
+
+XCOMM  cs3 class
+cs3    {
+       side            none
+       length          2
+       byte1           \xf0,\xfc
+       byte2           \x40,\x7e;\x80,\xfc
+       wc_encoding     \x20000000
+       ct_encoding     u90x03.1991-0:GL; u90x03.1991-0:GR
+       mb_conversion   \
+    [\xf040,\xf07e]->\x6521,[\xf080,\xf09e]->\x6560,[\xf09f,\xf0fc]->\x6621,\
+    [\xf140,\xf17e]->\x6721,[\xf180,\xf19e]->\x6760,[\xf19f,\xf1fc]->\x6821,\
+    [\xf240,\xf27e]->\x6921,[\xf280,\xf29e]->\x6960,[\xf29f,\xf2fc]->\x6a21,\
+    [\xf340,\xf37e]->\x6b21,[\xf380,\xf39e]->\x6b60,[\xf39f,\xf3fc]->\x6c21,\
+    [\xf440,\xf47e]->\x6d21,[\xf480,\xf49e]->\x6d60,[\xf49f,\xf4fc]->\x6e21,\
+    [\xf540,\xf57e]->\x6f21,[\xf580,\xf59e]->\x6f60,[\xf59f,\xf5fc]->\x7021,\
+    [\xf640,\xf67e]->\x7121,[\xf680,\xf69e]->\x7160,[\xf69f,\xf6fc]->\x7221,\
+    [\xf740,\xf77e]->\x7321,[\xf780,\xf79e]->\x7360,[\xf79f,\xf7fc]->\x7421,\
+    [\xf840,\xf87e]->\x7521,[\xf880,\xf89e]->\x7560,[\xf89f,\xf8fc]->\x7621,\
+    [\xf940,\xf97e]->\x7721,[\xf980,\xf99e]->\x7760,[\xf99f,\xf9fc]->\x7821,\
+    [\xfa40,\xfa7e]->\x7921,[\xfa80,\xfa9e]->\x7960,[\xfa9f,\xfafc]->\x7a21,\
+    [\xfb40,\xfb7e]->\x7b21,[\xfb80,\xfb9e]->\x7b60,[\xfb9f,\xfbfc]->\x7c21,\
+    [\xfc40,\xfc7e]->\x7d21,[\xfc80,\xfc9e]->\x7d60,[\xfc9f,\xfcfc]->\x7e21
+}
+
+END XLC_XLOCALE
+
+#endif /* __uxp__ */
diff --git a/nls/ja.U90/Compose.pre b/nls/ja.U90/Compose.pre
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/nls/ja.U90/XI18N_OBJS b/nls/ja.U90/XI18N_OBJS
new file mode 100644 (file)
index 0000000..8c766a9
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for ja.U90 locale
+#
+XLC    common/xlibi18n _XlcGenericLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/ja.U90/XLC_LOCALE.pre b/nls/ja.U90/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..5d8fd3c
--- /dev/null
@@ -0,0 +1,151 @@
+XCOMM Copyright 1995 by FUJITSU LIMITED
+XCOMM This is source code modified by FUJITSU LIMITED under the Joint
+XCOMM Development Agreement for the CDEnext PST.
+XCOMM This is unpublished proprietary source code of FUJITSU LIMITED
+XCOMM
+XCOMM NLS-DB for ja_JP.U90
+
+XCOMM
+XCOMM  XLC_CHARSET_DEFINE category
+XCOMM
+XLC_CHARSET_DEFINE
+csd0   {
+       charset_name    u90x03.1991-0
+       side            GL
+       length          2
+       gc_number       94
+       string_encoding False
+       sequence        \x1b\x25\x28\x32
+       encoding_name   fujitsu.U90X03
+}
+
+csd1   {
+       charset_name    u90x03.1991-0
+       side            GR
+       length          2
+       gc_number       94
+       string_encoding False
+       sequence        \x1b\x25\x2f\x32
+       encoding_name   fujitsu.U90X03
+}
+END XLC_CHARSET_DEFINE
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name    JISX0201.1976-0:GL
+       }
+       font    {
+               primary         JISX0201.1976-0:GL
+               substitute      ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class (Kanji)
+fs1    {
+       charset {
+               name    JISX0208.1983-0:GL
+       }
+       font    {
+                primary         fujitsu.u90x01.1991-0:GL
+XCOMM          primary         JISX0208.1983-0:GL
+                substitute     JISX0208.1983-0:GL; JISX0208.1983-0:GR;\
+                                JISX0208.1983-1:GL; JISX0208.1983-1:GR;\
+                                JISX0208.1990-0:GL; JISX0208.1990-0:GR;\
+                               u90x01.1991-0:GL
+               vertical_map    u90x01.1991-0.2:GL,\
+                       [\x2122,\x2125]->\x7d21,[\x2131,\x2132]->\x7d25,\
+                       [\x213c,\x213e]->\x7d27,[\x2141,\x215b]->\x7d2a,\
+                       [\x2421,\x2421]->\x7d45,[\x2423,\x2423]->\x7d46,\
+                       [\x2425,\x2425]->\x7d47,[\x2427,\x2427]->\x7d48,\
+                       [\x2429,\x2429]->\x7d49,[\x2443,\x2443]->\x7d4a,\
+                       [\x2463,\x2463]->\x7d4b,[\x2465,\x2465]->\x7d4c,\
+                       [\x2467,\x2467]->\x7d4d,[\x246e,\x246e]->\x7d4e,\
+                       [\x2521,\x2521]->\x7d4f,[\x2523,\x2523]->\x7d50,\
+                       [\x2525,\x2525]->\x7d51,[\x2527,\x2527]->\x7d52,\
+                       [\x2529,\x2529]->\x7d53,[\x2543,\x2543]->\x7d54,\
+                       [\x2563,\x2563]->\x7d55,[\x2565,\x2565]->\x7d56,\
+                       [\x2567,\x2567]->\x7d57,[\x256e,\x256e]->\x7d58,\
+                       [\x2575,\x2576]->\x7d59,[\x2475,\x2476]->\x7d5b
+       }
+}
+XCOMM  fs2 class (Half Kana)
+fs2    {
+       charset {
+               name            JISX0201.1976-0:GR
+        }
+       font    {
+               primary         JISX0201.1976-0:GR
+               vertical_rotate all
+       }
+}
+XCOMM  fs3 class (JEF Kanji + User Defined Character)
+fs3    {
+       charset {
+               name    u90x03.1991-0:GR; u90x03.1991-0:GL
+               udc_area        \x6521,\x787e
+       }
+       font    {
+                primary         fujitsu.u90x03.1991-0:GL
+                substitute      u90x03.1991-0:GL;\
+                                JISX0208.1983-0:GL; JISX0208.1983-0:GR;\
+                                JISX0208.1983-1:GL; JISX0208.1983-1:GR;\
+                                JISX0208.1990-0:GL; JISX0208.1990-0:GR
+       }
+}
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+XCOMM encoding_name            ja.euc
+encoding_name ja_JP.U90
+mb_cur_max             3
+state_depend_encoding  False
+
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     JISX0201.1976-0:GL; ISO8859-1:GL
+}
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          2
+       wc_encoding     \x30000000
+       ct_encoding     JISX0208.1983-0:GL; JISX0208.1983-0:GR;\
+                       JISX0208.1983-1:GL; JISX0208.1983-1:GR
+}
+
+XCOMM  cs2 class
+cs2    {
+       side            GR
+       length          1
+       mb_encoding     <SS> \x8e
+       wc_encoding     \x10000000
+       ct_encoding     JISX0201.1976-0:GR
+}
+
+XCOMM  cs3 class
+cs3    {
+       side            GR
+       length          2
+       mb_encoding     <SS> \x8f
+       wc_encoding     \x20000000
+       ct_encoding     u90x03.1991-0:GR; u90x03.1991-0:GL
+}
+
+END XLC_XLOCALE
diff --git a/nls/ja/Compose.pre b/nls/ja/Compose.pre
new file mode 100644 (file)
index 0000000..2604257
--- /dev/null
@@ -0,0 +1,14 @@
+XCOMM
+XCOMM ja Compose Sequence
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM
+XCOMM This file currently has no entries.  It appears that a compose file (even
+XCOMM just an empty one) is required for the appropriate keysyms to work for
+XCOMM this encoding.
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+
+XCOMM End of Sequence Definition
diff --git a/nls/ja/XI18N_OBJS b/nls/ja/XI18N_OBJS
new file mode 100644 (file)
index 0000000..50b51fe
--- /dev/null
@@ -0,0 +1,11 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for ja locale
+#
+XLC    ja/xlibi18n_ja  _XlcGenericLoader       # XLC_open
+XLC    common/xlibi18n _XlcGenericLoader       # XLC_open
+#XIM   common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_regiser XIM_unregister
+XIM    common/ximp40   _Ximp_OpenIM            # XIM_open
+XIM    common/ximlocal _XimpLocalOpenIM        # XIM_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_regiser XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM # XOM_open
diff --git a/nls/ja/XLC_LOCALE.pre b/nls/ja/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..99decf0
--- /dev/null
@@ -0,0 +1,124 @@
+XCOMM
+XCOMM  XLocale Database Sample for ja_JP.euc 
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         ISO8859-1:GL
+               substitute      JISX0201.1976-0:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class (Kanji)
+fs1    {
+       charset {
+               name            JISX0208.1983-0:GL
+               udc_area        \x7521,\x7e7e
+       }
+       font    {
+               primary         JISX0208.1983-0:GL
+                substitute      JISX0208.1990-0:GL
+       }
+}
+XCOMM  fs2 class (Half Kana)
+fs2    {
+       charset {
+               name            JISX0201.1976-0:GR
+       }
+       font    {
+               primary         JISX0201.1976-0:GR
+               substitute      JISX0201.1976-0:GR
+               vertical_rotate all
+       }
+}
+XCOMM  fs3 class (Supplementary Kanji)
+XCOMM fs3      {
+XCOMM  charset {
+XCOMM          name            JISX0212.1990-0:GL
+XCOMM          udc_area        \x7521,\x7e7e
+XCOMM  }
+XCOMM  font    {
+XCOMM          primary         JISX0212.1990-0:GL
+XCOMM  }
+XCOMM }
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          ja.euc
+mb_cur_max             3
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+force_convert_to_mb    True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     ISO8859-1:GL; JISX0201.1976-0:GL
+}
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          2
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     JISX0208.1983-0:GL; JISX0208.1983-0:GR;\
+                       JISX0208.1983-1:GL; JISX0208.1983-1:GR
+}
+
+XCOMM  cs2 class
+cs2    {
+       side            GR
+       length          1
+       mb_encoding     <SS> \x8e
+#if WCHAR32
+       wc_encoding     \x10000000
+#else
+       wc_encoding     \x00000080
+#endif
+       ct_encoding     JISX0201.1976-0:GR
+}
+
+XCOMM  cs3 class
+XCOMM cs3      {
+XCOMM  side            GL
+XCOMM  length          2
+XCOMM  mb_encoding     <SS> \x8f
+XCOMM #if WCHAR32
+XCOMM  wc_encoding     \x20000000
+XCOMM #else
+XCOMM  wc_encoding     \x00008000
+XCOMM #endif
+XCOMM  ct_encoding     JISX0212.1990-0:GL; JISX0212.1990-0:GR
+XCOMM }
+
+
+END XLC_XLOCALE
+
diff --git a/nls/ja_JP.UTF-8/Compose.pre b/nls/ja_JP.UTF-8/Compose.pre
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/nls/ja_JP.UTF-8/XI18N_OBJS b/nls/ja_JP.UTF-8/XI18N_OBJS
new file mode 100644 (file)
index 0000000..9159b67
--- /dev/null
@@ -0,0 +1,8 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for ja_JP.UTF-8 locale
+#
+#
+XLC    common/xlcUTF8Load      _XlcUtf8Loader  # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/ja_JP.UTF-8/XLC_LOCALE.pre b/nls/ja_JP.UTF-8/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..0f5ebe2
--- /dev/null
@@ -0,0 +1,149 @@
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+
+on_demand_loading      True
+
+object_name            generic
+
+XCOMM We leave the legacy encodings in for the moment, because we don't
+XCOMM have that many ISO10646 fonts yet.
+XCOMM   fs0 class (7 bit ASCII)
+fs0 {
+  charset {
+    name  ISO8859-1:GL
+  }
+  font  {
+    primary   ISO8859-1:GL
+    vertical_rotate all
+  }
+}
+XCOMM fs1 class (ISO8859 families)
+fs1 {
+  charset {
+    name  ISO8859-1:GR
+  }
+  font  {
+    primary ISO8859-1:GR
+  }
+}
+
+XCOMM  fs2 class (Kanji)
+fs2    {
+       charset {
+               name    JISX0208.1983-0:GL
+       }
+       font    {
+               primary JISX0208.1983-0:GL
+       }
+}
+
+XCOMM   fs3 class (Korean Character)
+fs3    {
+       charset {
+               name    KSC5601.1987-0:GL
+       }
+       font    {
+               primary KSC5601.1987-0:GL
+       }
+}
+
+XCOMM   fs4 class (Chinese Han Character)
+fs4    {
+       charset {
+               name    GB2312.1980-0:GL
+       }
+       font    {
+               primary GB2312.1980-0:GL
+       }
+}
+XCOMM  fs5 class (Half Kana)
+fs5    {
+       charset {
+               name    JISX0201.1976-0:GR
+       }
+       font    {
+               primary         JISX0201.1976-0:GR
+               vertical_rotate all
+       }
+}
+XCOMM ISO10646-1 is put last to make usually better-looking
+XCOMM other fonts are picked up before iso10646-1 fonts.
+XCOMM Moreover, some iso10646-1 fonts don't have any glyph at all
+XCOMM in ISO8859-X ranges.
+
+XCOMM fs6 class
+fs6 {
+  charset {
+    name  ISO10646-1
+  }
+  font  {
+    primary ISO10646-1
+  }
+}
+
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          UTF-8
+mb_cur_max             6
+state_depend_encoding  False
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       ct_encoding     ISO8859-1:GL
+}
+
+XCOMM  cs1 class
+cs1     {
+        side            GR:Default
+        length          1
+        ct_encoding     ISO8859-1:GR
+}
+
+XCOMM  cs2 class
+cs2    {
+       side            GR
+       length          2
+       ct_encoding     JISX0208.1983-0:GL; JISX0208.1983-0:GR;                 JISX0208.1983-1:GL; JISX0208.1983-1:GR
+
+}
+
+XCOMM  cs3 class
+cs3     {
+        side            GL
+        length          2
+        ct_encoding     KSC5601.1987-0:GL; KSC5601.1987-0:GR;                        KSC5601.1987-1:GL; KSC5601.1987-1:GR
+
+}
+XCOMM  cs4 class
+cs4     {
+        side            GR
+        length          2
+        ct_encoding     GB2312.1980-0:GL; GB2312.1980-0:GR
+}
+XCOMM  cs5 class
+cs5    {
+       side            GR
+       length          1
+       ct_encoding     JISX0201.1976-0:GR
+}
+
+XCOMM  cs6 class
+cs6    {
+       side            none
+       ct_encoding     ISO10646-1
+}
+
+END XLC_XLOCALE
diff --git a/nls/ko/Compose.pre b/nls/ko/Compose.pre
new file mode 100644 (file)
index 0000000..4297871
--- /dev/null
@@ -0,0 +1,14 @@
+XCOMM
+XCOMM ko Compose Sequence
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM
+XCOMM This file currently has no entries.  It appears that a compose file (even
+XCOMM just an empty one) is required for the appropriate keysyms to work for
+XCOMM this encoding.
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+
+XCOMM End of Sequence Definition
diff --git a/nls/ko/XI18N_OBJS b/nls/ko/XI18N_OBJS
new file mode 100644 (file)
index 0000000..5ee5237
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for ko locale
+#
+XLC    common/xlibi18n _XlcGenericLoader       # XLC_open
+XIM    common/ximp40   _Ximp_OpenIM            # XIM_open
+XOM    common/xomGeneric       _XomGenericOpenOM # XOM_open
diff --git a/nls/ko/XLC_LOCALE.pre b/nls/ko/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..bda77b7
--- /dev/null
@@ -0,0 +1,71 @@
+XCOMM  XLocale Database Sample for ko.
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name    ISO8859-1:GL
+       }
+       font    {
+               primary         ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset {
+               name    KSC5601.1987-0:GL
+       }
+       font    {
+               primary         KSC5601.1987-0:GL
+               substitute      KSC5601.1987-0:GL
+       }
+}
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          ko.euc
+mb_cur_max             2
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+force_convert_to_mb    True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     ISO8859-1:GL
+}
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          2
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     KSC5601.1987-0:GL; KSC5601.1987-0:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/ko_KR.UTF-8/Compose.pre b/nls/ko_KR.UTF-8/Compose.pre
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/nls/ko_KR.UTF-8/XI18N_OBJS b/nls/ko_KR.UTF-8/XI18N_OBJS
new file mode 100644 (file)
index 0000000..96e753c
--- /dev/null
@@ -0,0 +1,8 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for ko_KR.UTF-8 locale
+#
+#
+XLC    common/xlcUTF8Load      _XlcUtf8Loader  # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/ko_KR.UTF-8/XLC_LOCALE.pre b/nls/ko_KR.UTF-8/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..b3db89d
--- /dev/null
@@ -0,0 +1,147 @@
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+
+on_demand_loading      True
+
+object_name            generic
+
+XCOMM We leave the legacy encodings in for the moment, because we don't
+XCOMM have that many ISO10646 fonts yet.
+XCOMM   fs0 class (7 bit ASCII)
+fs0 {
+  charset {
+    name  ISO8859-1:GL
+  }
+  font  {
+    primary   ISO8859-1:GL
+    vertical_rotate all
+  }
+}
+XCOMM fs1 class (ISO8859 families)
+fs1 {
+  charset {
+    name  ISO8859-1:GR
+  }
+  font  {
+    primary ISO8859-1:GR
+  }
+}
+
+XCOMM   fs2 class (Korean Character)
+fs2    {
+       charset {
+               name    KSC5601.1987-0:GL
+       }
+       font    {
+               primary KSC5601.1987-0:GL
+       }
+}
+XCOMM  fs3 class (Kanji)
+fs3    {
+       charset {
+               name    JISX0208.1983-0:GL
+       }
+       font    {
+               primary JISX0208.1983-0:GL
+       }
+}
+XCOMM   fs4 class (Chinese Han Character)
+fs4    {
+       charset {
+               name    GB2312.1980-0:GL
+       }
+       font    {
+               primary GB2312.1980-0:GL
+       }
+}
+XCOMM  fs5 class (Half Kana)
+fs5    {
+       charset {
+               name    JISX0201.1976-0:GR
+       }
+       font    {
+               primary         JISX0201.1976-0:GR
+               vertical_rotate all
+       }
+}
+
+XCOMM ISO10646-1 is put last to make usually better-looking
+XCOMM other fonts are picked up before iso10646-1 fonts.
+XCOMM Moreover, some iso10646-1 fonts don't have any glyph at all
+XCOMM in ISO8859-X ranges.
+
+XCOMM fs6 class
+fs6 {
+  charset {
+    name  ISO10646-1
+  }
+  font  {
+    primary ISO10646-1
+  }
+}
+
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          UTF-8
+mb_cur_max             6
+state_depend_encoding  False
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       ct_encoding     ISO8859-1:GL
+}
+
+XCOMM  cs1 class
+cs1     {
+        side            GR:Default
+        length          1
+        ct_encoding     ISO8859-1:GR
+}
+
+XCOMM  cs2 class
+cs2     {
+        side            GL
+        length          2
+        ct_encoding     KSC5601.1987-0:GL; KSC5601.1987-0:GR;                        KSC5601.1987-1:GL; KSC5601.1987-1:GR
+
+}
+XCOMM  cs3 class
+cs3    {
+       side            GR
+       length          2
+       ct_encoding     JISX0208.1983-0:GL; JISX0208.1983-0:GR;                 JISX0208.1983-1:GL; JISX0208.1983-1:GR
+
+}
+XCOMM  cs4 class
+cs4     {
+        side            GR
+        length          2
+        ct_encoding     GB2312.1980-0:GL; GB2312.1980-0:GR
+}
+XCOMM  cs5 class
+cs5    {
+       side            GR
+       length          1
+       ct_encoding     JISX0201.1976-0:GR
+}
+
+XCOMM  cs6 class
+cs6    {
+       side            none
+       ct_encoding     ISO10646-1
+}
+
+END XLC_XLOCALE
diff --git a/nls/koi8-c/Compose.pre b/nls/koi8-c/Compose.pre
new file mode 100644 (file)
index 0000000..c15a3bb
--- /dev/null
@@ -0,0 +1,122 @@
+XCOMM
+XCOMM koi8-c Compose Sequence
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM
+
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+<Multi_key> <plus> <plus>               : "#"   numbersign
+<Multi_key> <apostrophe> <space>        : "'"   apostrophe
+<Multi_key> <space> <apostrophe>        : "'"   apostrophe
+<Multi_key> <A> <T>                     : "@"   at
+<Multi_key> <parenleft> <parenleft>     : "["   bracketleft
+<Multi_key> <slash> <slash>             : "\\"  backslash
+<Multi_key> <slash> <less>              : "\\"  backslash
+<Multi_key> <less> <slash>              : "\\"  backslash
+<Multi_key> <parenright> <parenright>   : "]"   bracketright
+<Multi_key> <asciicircum> <space>       : "^"   asciicircum
+<Multi_key> <space> <asciicircum>       : "^"   asciicircum
+<Multi_key> <greater> <space>           : "^"   asciicircum
+<Multi_key> <space> <greater>           : "^"   asciicircum
+<Multi_key> <grave> <space>             : "`"   grave
+<Multi_key> <space> <grave>             : "`"   grave
+<Multi_key> <parenleft> <minus>         : "{"   braceleft
+<Multi_key> <minus> <parenleft>         : "{"   braceleft
+<Multi_key> <slash> <asciicircum>       : "|"   bar
+<Multi_key> <asciicircum> <slash>       : "|"   bar
+<Multi_key> <V> <L>                     : "|"   bar
+<Multi_key> <L> <V>                     : "|"   bar
+<Multi_key> <v> <l>                     : "|"   bar
+<Multi_key> <l> <v>                     : "|"   bar
+<Multi_key> <parenright> <minus>        : "}"   braceright
+<Multi_key> <minus> <parenright>        : "}"   braceright
+<Multi_key> <asciitilde> <space>        : "~"   asciitilde
+<Multi_key> <space> <asciitilde>        : "~"   asciitilde
+<Multi_key> <minus> <space>             : "~"   asciitilde
+<Multi_key> <space> <minus>             : "~"   asciitilde
+
+<Multi_key> <space> <space>             : "\240"       nobreakspace
+
+<Multi_key> <Cyrillic_ghe> <minus>      : "\200"       Cyrillic_ghe_bar
+<Multi_key> <Cyrillic_GHE> <minus>      : "\220"       Cyrillic_GHE_bar
+<Multi_key> <Cyrillic_zhe> <comma>      : "\201"       Cyrillic_zhe_descender
+<Multi_key> <Cyrillic_ZHE> <comma>      : "\221"       Cyrillic_ZHE_descender
+<Multi_key> <Cyrillic_ka> <comma>       : "\202"       Cyrillic_ka_descender
+<Multi_key> <Cyrillic_KA> <comma>       : "\222"       Cyrillic_KA_descender
+<Multi_key> <Cyrillic_ka> <slash>       : "\203"       Cyrillic_ka_vertstroke
+<Multi_key> <Cyrillic_KA> <slash>       : "\223"       Cyrillic_KA_vertstroke
+<Multi_key> <Cyrillic_ka> <bar>         : "\203"       Cyrillic_ka_vertstroke
+<Multi_key> <Cyrillic_KA> <bar>         : "\223"       Cyrillic_KA_vertstroke
+<Multi_key> <Cyrillic_en> <comma>      : "\204"        Cyrillic_en_descender
+<Multi_key> <Cyrillic_EN> <comma>      : "\224"        Cyrillic_EN_descender
+<Multi_key> <Cyrillic_u> <apostrophe>  : "\205"        Cyrillic_u_straight
+<Multi_key> <Cyrillic_U> <apostrophe>  : "\225"        Cyrillic_U_straight
+<Multi_key> <Cyrillic_u> <bar>         : "\205"        Cyrillic_u_straight
+<Multi_key> <Cyrillic_U> <bar>         : "\225"        Cyrillic_U_straight
+<Multi_key> <Cyrillic_u> <comma>       : "\206"        Cyrillic_u_straight_bar
+<Multi_key> <Cyrillic_U> <comma>       : "\226"        Cyrillic_U_straight_bat
+<Multi_key> <Cyrillic_u> <slash>       : "\206"        Cyrillic_u_straight_bar
+<Multi_key> <Cyrillic_U> <slash>       : "\226"        Cyrillic_U_straight_bat
+<Multi_key> <Cyrillic_ha> <comma>      : "\207"        Cyrillic_ha_descender
+<Multi_key> <Cyrillic_HA> <comma>      : "\227"        Cyrillic_HA_descender
+<Multi_key> <Cyrillic_che> <comma>     : "\210"        Cyrillic_che_descender
+<Multi_key> <Cyrillic_CHE> <comma>     : "\230"        Cyrillic_CHE_descender
+<Multi_key> <Cyrillic_che> <slash>      : "\211"       Cyrillic_che_vertstroke
+<Multi_key> <Cyrillic_CHE> <slash>      : "\231"       Cyrillic_CHE_vertstroke
+<Multi_key> <Cyrillic_che> <bar>        : "\211"       Cyrillic_che_vertstroke
+<Multi_key> <Cyrillic_CHE> <bar>        : "\231"       Cyrillic_CHE_vertstroke
+<Multi_key> <Cyrillic_ha> <apostrophe> : "\212"        Cyrillic_shha
+<Multi_key> <Cyrillic_HA> <apostrophe> : "\232"        Cyrillic_SHHA
+<Multi_key> <h> <apostrophe>           : "\212"        Cyrillic_shha
+<Multi_key> <H> <apostrophe>           : "\232"        Cyrillic_SHHA
+<Multi_key> <h> <h>                    : "\212"        Cyrillic_shha
+<Multi_key> <H> <H>                    : "\232"        Cyrillic_SHHA
+<Multi_key> <Cyrillic_ie> <Cyrillic_ie>        : "\213"        Cyrillic_schwa
+<Multi_key> <Cyrillic_IE> <Cyrillic_IE>        : "\233"        Cyrillic_SCHWA
+<Multi_key> <e> <e>                    : "\213"        Cyrillic_schwa
+<Multi_key> <E> <E>                    : "\233"        Cyrillic_SCHWA
+<Multi_key> <Cyrillic_i> <minus>       : "\214"        Cyrillic_i_macron
+<Multi_key> <Cyrillic_I> <minus>       : "\234"        Cyrillic_I_macron
+<Multi_key> <Cyrillic_o> <minus>       : "\215"        Cyrillic_o_bar
+<Multi_key> <Cyrillic_O> <minus>       : "\235"        Cyrillic_O_bar
+<Multi_key> <Cyrillic_u> <minus>       : "\216"        Cyrillic_u_macron
+<Multi_key> <Cyrillic_U> <minus>       : "\236"        Cyrillic_U_macron
+
+<Multi_key> <Cyrillic_de> <Cyrillic_je>        : "\241"        Serbian_dje
+<Multi_key> <Cyrillic_DE> <Cyrillic_JE>        : "\261"        Serbian_DJE
+<Multi_key> <Cyrillic_ghe> <Cyrillic_je> : "\242"      Macedonia_gje
+<Multi_key> <Cyrillic_GHE> <Cyrillic_JE> : "\262"      Macedonia_GJE
+<Multi_key> <Cyrillic_shorti> <Cyrillic_o> : "\243"    Cyrillic_io
+<Multi_key> <Cyrillic_SHORTI> <Cyrillic_O> : "\263"    Cyrillic_IO
+<Multi_key> <Cyrillic_je> <Cyrillic_o> : "\243"        Cyrillic_io
+<Multi_key> <Cyrillic_JE> <Cyrillic_O> : "\263"        Cyrillic_IO
+<Multi_key> <Cyrillic_ie> <colon>      : "\243"        Cyrillic_io
+<Multi_key> <Cyrillic_IE> <colon>      : "\263"        Cyrillic_IO
+
+<Multi_key> <Cyrillic_el> <Cyrillic_je>        : "\251"        Cyrillic_lje
+<Multi_key> <Cyrillic_EL> <Cyrillic_JE>        : "\271"        Cyrillic_LJE
+<Multi_key> <Cyrillic_en> <Cyrillic_je>        : "\252"        Cyrillic_nje
+<Multi_key> <Cyrillic_EN> <Cyrillic_JE>        : "\272"        Cyrillic_NJE
+
+<Multi_key> <Cyrillic_shorti> <Cyrillic_u> : "\300"    Cyrillic_yu
+<Multi_key> <Cyrillic_SHORTI> <Cyrillic_U> : "\340"    Cyrillic_YU
+<Multi_key> <Cyrillic_je> <Cyrillic_u> : "\300"        Cyrillic_yu
+<Multi_key> <Cyrillic_JE> <Cyrillic_U> : "\340"        Cyrillic_YU
+
+<Multi_key> <Cyrillic_te> <Cyrillic_es>        : "\303"        Cyrillic_tse
+<Multi_key> <Cyrillic_TE> <Cyrillic_ES>        : "\343"        Cyrillic_TSE
+
+<Multi_key> <Cyrillic_shorti> <Cyrillic_a> : "\321"    Cyrillic_ya
+<Multi_key> <Cyrillic_SHORTI> <Cyrillic_A> : "\361"    Cyrillic_YA
+<Multi_key> <Cyrillic_je> <Cyrillic_a> : "\321"        Cyrillic_ya
+<Multi_key> <Cyrillic_JE> <Cyrillic_A> : "\361"        Cyrillic_YA
+
+
+<Multi_key> <Cyrillic_sha> <comma>     : "\335"        Cyrillic_shcha
+<Multi_key> <Cyrillic_SHA> <comma>     : "\375"        Cyrillic_SHCHA
+
+
+
+XCOMM End of Sequence Definition
diff --git a/nls/koi8-c/XI18N_OBJS b/nls/koi8-c/XI18N_OBJS
new file mode 100644 (file)
index 0000000..a6374f3
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for koi8-c locale
+#
+XLC    common/xlcDef   _XlcDefaultLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/koi8-c/XLC_LOCALE.pre b/nls/koi8-c/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..68cd02f
--- /dev/null
@@ -0,0 +1,79 @@
+XCOMM  XLocale Database Sample for koi8-c.
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         KOI8-C:GL
+               substitute      ISO8859-1:GL
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset         KOI8-C:GR
+       font            KOI8-C:GR
+}
+END XLC_FONTSET
+
+XCOMM
+XCOMM  XLC_CHARSET_DEFINE category
+XCOMM
+XLC_CHARSET_DEFINE
+csd0   {
+       charset_name    KOI8-C
+       side            GR
+       length          1
+       string_encoding False
+       sequence        \x1b%/1
+}
+END XLC_CHARSET_DEFINE
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name           KOI8-C
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     KOI8-C:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     KOI8-C:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/koi8-r/Compose.pre b/nls/koi8-r/Compose.pre
new file mode 100644 (file)
index 0000000..d44893e
--- /dev/null
@@ -0,0 +1,14 @@
+XCOMM
+XCOMM koi8-r Compose Sequence
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM
+XCOMM This file currently has no entries.  It appears that a compose file (even
+XCOMM just an empty one) is required for the appropriate keysyms to work for
+XCOMM this encoding.
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+
+XCOMM End of Sequence Definition
diff --git a/nls/koi8-r/XI18N_OBJS b/nls/koi8-r/XI18N_OBJS
new file mode 100644 (file)
index 0000000..b704fec
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for koi8-r locale
+#
+XLC    common/xlcDef   _XlcDefaultLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/koi8-r/XLC_LOCALE.pre b/nls/koi8-r/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..cda283e
--- /dev/null
@@ -0,0 +1,80 @@
+XCOMM  XLocale Database Sample for koi8-r.
+XCOMM 
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         KOI8-R:GL
+               substitute      ISO8859-1:GL
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset         KOI8-R:GR
+       font            KOI8-R:GR
+}
+END XLC_FONTSET
+
+XCOMM
+XCOMM  XLC_CHARSET_DEFINE category
+XCOMM
+XLC_CHARSET_DEFINE
+csd0   {
+       charset_name    KOI8-R
+       side            GR
+       length          1
+       string_encoding False
+       sequence        \x1b%/1
+}
+END XLC_CHARSET_DEFINE
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name           KOI8-R
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     KOI8-R:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     KOI8-R:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/koi8-u/Compose.pre b/nls/koi8-u/Compose.pre
new file mode 100644 (file)
index 0000000..fab51ed
--- /dev/null
@@ -0,0 +1,14 @@
+XCOMM
+XCOMM koi8-u Compose Sequence
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM
+XCOMM This file currently has no entries.  It appears that a compose file (even
+XCOMM just an empty one) is required for the appropriate keysyms to work for
+XCOMM this encoding.
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+
+XCOMM End of Sequence Definition
diff --git a/nls/koi8-u/XI18N_OBJS b/nls/koi8-u/XI18N_OBJS
new file mode 100644 (file)
index 0000000..dd2c992
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for koi8-u locale
+#
+XLC    common/xlcDef   _XlcDefaultLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/koi8-u/XLC_LOCALE.pre b/nls/koi8-u/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..860438a
--- /dev/null
@@ -0,0 +1,79 @@
+XCOMM  XLocale Database Sample for koi8-u.
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         KOI8-U:GL
+               substitute      ISO8859-1:GL
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset         KOI8-U:GR
+       font            KOI8-U:GR
+}
+END XLC_FONTSET
+
+XCOMM
+XCOMM  XLC_CHARSET_DEFINE category
+XCOMM
+XLC_CHARSET_DEFINE
+csd0   {
+       charset_name    KOI8-U
+       side            GR
+       length          1
+       string_encoding False
+       sequence        \x1b%/1
+}
+END XLC_CHARSET_DEFINE
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name           KOI8-U
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     KOI8-U:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     KOI8-U:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/locale.alias.pre b/nls/locale.alias.pre
new file mode 100644 (file)
index 0000000..7b35460
--- /dev/null
@@ -0,0 +1,1366 @@
+XCOMM
+XCOMM  This file contains alias name of locale.
+XCOMM  Each alias name is described within one line.
+XCOMM  The first word is the alias name (simplified locale name)
+XCOMM  the second word is full locale name.
+XCOMM
+XCOMM
+
+POSIX:                                         C
+POSIX-UTF2:                                    C
+C_C.C:                                         C
+C.en:                                          C
+C.ASCII:                                       C
+C.iso88591:                                    en_US.ISO8859-1
+Cextend:                                       en_US.ISO8859-1
+Cextend.en:                                    en_US.ISO8859-1
+English_United-States.437:                     C
+C.UTF-8:                                       en_US.UTF-8
+XCOMM a3 is not an ISO 639 language code, but in Cyrillic, "Z" looks like "3".
+a3:                                            a3_AZ.KOI8-C
+a3_AZ:                                         a3_AZ.KOI8-C
+a3_AZ.koi8c:                                   a3_AZ.KOI8-C
+af:                                            af_ZA.ISO8859-1
+af_ZA:                                         af_ZA.ISO8859-1
+af_ZA.iso88591:                                        af_ZA.ISO8859-1
+af_ZA.ISO-8859-1:                              af_ZA.ISO8859-1
+af_ZA.utf8:                            af_ZA.UTF-8
+am:                                            am_ET.UTF-8
+am_ET:                                         am_ET.UTF-8
+ar:                                            ar_AA.ISO8859-6
+ar_AA:                                         ar_AA.ISO8859-6
+AR_AA:                                         ar_AA.ISO8859-6
+Ar_AA:                                         ar_AA.ISO8859-6
+AR_AA.UTF-8:                                   ar_AA.UTF-8
+ar_AA.iso88596:                                        ar_AA.ISO8859-6
+ar_AA.ISO-8859-6:                              ar_AA.ISO8859-6
+ar_AE:                                         ar_AE.ISO8859-6
+ar_AE.iso88596:                                        ar_AE.ISO8859-6
+ar_AE.ISO-8859-6:                              ar_AE.ISO8859-6
+ar_AE.utf8:                                    ar_AE.UTF-8
+ar_BH:                                         ar_BH.ISO8859-6
+ar_BH.iso88596:                                        ar_BH.ISO8859-6
+ar_BH.ISO-8859-6:                              ar_BH.ISO8859-6
+ar_BH.utf8:                                    ar_BH.UTF-8
+ar_DZ:                                         ar_DZ.ISO8859-6
+ar_DZ.iso88596:                                        ar_DZ.ISO8859-6
+ar_DZ.ISO-8859-6:                              ar_DZ.ISO8859-6
+ar_DZ.utf8:                                    ar_DZ.UTF-8
+ar_EG:                                         ar_EG.ISO8859-6
+ar_EG.iso88596:                                        ar_EG.ISO8859-6
+ar_EG.ISO-8859-6:                              ar_EG.ISO8859-6
+ar_EG.utf8:                                    ar_EG.UTF-8
+ar_IN.utf8:                                    ar_IN.UTF-8
+ar_IQ:                                         ar_IQ.ISO8859-6
+ar_IQ.iso88596:                                        ar_IQ.ISO8859-6
+ar_IQ.ISO-8859-6:                              ar_IQ.ISO8859-6
+ar_IQ.utf8:                                    ar_IQ.UTF-8
+ar_JO:                                         ar_JO.ISO8859-6
+ar_JO.iso88596:                                        ar_JO.ISO8859-6
+ar_JO.ISO-8859-6:                              ar_JO.ISO8859-6
+ar_JO.utf8:                                    ar_JO.UTF-8
+ar_KW:                                         ar_KW.ISO8859-6
+ar_KW.iso88596:                                        ar_KW.ISO8859-6
+ar_KW.ISO-8859-6:                              ar_KW.ISO8859-6
+ar_KW.utf8:                                    ar_KW.UTF-8
+ar_LB:                                         ar_LB.ISO8859-6
+ar_LB.iso88596:                                        ar_LB.ISO8859-6
+ar_LB.ISO-8859-6:                              ar_LB.ISO8859-6
+ar_LB.utf8:                                    ar_LB.UTF-8
+ar_LY:                                         ar_LY.ISO8859-6
+ar_LY.iso88596:                                        ar_LY.ISO8859-6
+ar_LY.ISO-8859-6:                              ar_LY.ISO8859-6
+ar_LY.utf8:                                    ar_LY.UTF-8
+ar_MA:                                         ar_MA.ISO8859-6
+ar_MA.iso88596:                                        ar_MA.ISO8859-6
+ar_MA.ISO-8859-6:                              ar_MA.ISO8859-6
+ar_MA.utf8:                                    ar_MA.UTF-8
+ar_OM:                                         ar_OM.ISO8859-6
+ar_OM.iso88596:                                        ar_OM.ISO8859-6
+ar_OM.ISO-8859-6:                              ar_OM.ISO8859-6
+ar_OM.utf8:                                    ar_OM.UTF-8
+ar_QA:                                         ar_QA.ISO8859-6
+ar_QA.iso88596:                                        ar_QA.ISO8859-6
+ar_QA.ISO-8859-6:                              ar_QA.ISO8859-6
+ar_QA.utf8:                                    ar_QA.UTF-8
+ar_SA:                                         ar_SA.ISO8859-6
+ar_SA.iso88596:                                        ar_SA.ISO8859-6
+ar_SA.ISO-8859-6:                              ar_SA.ISO8859-6
+ar_SA.utf8:                                    ar_SA.UTF-8
+ar_SD:                                         ar_SD.ISO8859-6
+ar_SD.iso88596:                                        ar_SD.ISO8859-6
+ar_SD.ISO-8859-6:                              ar_SD.ISO8859-6
+ar_SD.utf8:                                    ar_SD.UTF-8
+ar_SY:                                         ar_SY.ISO8859-6
+ar_SY.iso88596:                                        ar_SY.ISO8859-6
+ar_SY.ISO-8859-6:                              ar_SY.ISO8859-6
+ar_SY.utf8:                                    ar_SY.UTF-8
+ar_TN:                                         ar_TN.ISO8859-6
+ar_TN.iso88596:                                        ar_TN.ISO8859-6
+ar_TN.ISO-8859-6:                              ar_TN.ISO8859-6
+ar_TN.utf8:                                    ar_TN.UTF-8
+as:                                            as_IN.UTF-8
+as_IN.utf8:                                    as_IN.UTF-8
+ar_YE:                                         ar_YE.ISO8859-6
+ar_YE.iso88596:                                        ar_YE.ISO8859-6
+ar_YE.ISO-8859-6:                              ar_YE.ISO8859-6
+ar_YE.utf8:                                    ar_YE.UTF-8
+az:                                            az_AZ.ISO8859-9E
+az_AZ:                                         az_AZ.ISO8859-9E
+az_AZ.iso88599e:                               az_AZ.ISO8859-9E
+be:                                            be_BY.CP1251
+be@latin:                                      be_BY.UTF-8@latin
+be_BY:                                         be_BY.CP1251
+be_BY@latin:                                   be_BY.UTF-8@latin
+be_BY.cp1251:                                  be_BY.CP1251
+be_BY.microsoftcp1251:                         be_BY.CP1251
+be_BY.microsoft-cp1251:                                be_BY.CP1251
+be_BY.MICROSOFT-CP1251:                                be_BY.CP1251
+be_BY.utf8:                                    be_BY.UTF-8
+be_BY.utf8@latin:                              be_BY.UTF-8@latin
+bg:                                            bg_BG.CP1251
+bg_BG:                                         bg_BG.CP1251
+bg_BG.cp1251:                                  bg_BG.CP1251
+bg_BG.microsoftcp1251:                         bg_BG.CP1251
+bg_BG.microsoft-cp1251:                                bg_BG.CP1251
+bg_BG.MICROSOFT-CP1251:                                bg_BG.CP1251
+bg_BG.iso88595:                                        bg_BG.ISO8859-5
+bg_BG.ISO-8859-5:                              bg_BG.ISO8859-5
+bg_BG.koi8r:                                   bg_BG.KOI8-R
+be_BG.utf8:                                    bg_BG.UTF-8
+bn_IN.utf8:                                    bn_IN.UTF-8
+bo_IN.utf8:                                    bo_IN.UTF-8
+br:                                            br_FR.ISO8859-1
+br_FR:                                         br_FR.ISO8859-1
+br_FR.iso88591:                                        br_FR.ISO8859-1
+br_FR.ISO-8859-1:                              br_FR.ISO8859-1
+br_FR.iso885914:                               br_FR.ISO8859-14
+br_FR.ISO-8859-14:                             br_FR.ISO8859-14
+br_FR.iso885915:                               br_FR.ISO8859-15
+br_FR.ISO-8859-15:                             br_FR.ISO8859-15
+br_FR.ISO-8859-15@euro:                                br_FR.ISO8859-15
+br_FR@euro:                                    br_FR.ISO8859-15
+br_FR.UTF-8@euro:                              br_FR.UTF-8
+bs:                                            bs_BA.ISO8859-2
+bs_BA:                                         bs_BA.ISO8859-2
+bs_BA.iso88592:                                        bs_BA.ISO8859-2
+bs_BA.ISO-8859-2:                              bs_BA.ISO8859-2
+bs_BA.ISO_8859-2:                              bs_BA.ISO8859-2
+ca:                                            ca_ES.ISO8859-1
+ca_AD:                                         ca_AD.ISO8859-1
+ca_AD@euro:                                    ca_AD.ISO8859-15
+ca_AD.iso88591:                                        ca_AD.ISO8859-1
+ca_AD.ISO-8859-1:                              ca_AD.ISO8859-1
+ca_AD.iso885915:                               ca_AD.ISO8859-15
+ca_AD.utf8:                                    ca_AD.UTF-8
+ca_AD.ISO-8859-15:                             ca_AD.ISO8859-15
+ca_AD.ISO-8859-15@euro:                                ca_AD.ISO8859-15
+ca_AD.UTF-8@euro:                              ca_AD.UTF-8
+ca_ES:                                         ca_ES.ISO8859-1
+ca_ES@euro:                                    ca_ES.ISO8859-15
+ca_ES.iso88591:                                        ca_ES.ISO8859-1
+ca_ES.ISO-8859-1:                              ca_ES.ISO8859-1
+ca_ES.iso885915:                               ca_ES.ISO8859-15
+ca_ES.utf8:                                    ca_ES.UTF-8
+ca_ES.ISO-8859-15:                             ca_ES.ISO8859-15
+ca_ES.ISO-8859-15@euro:                                ca_ES.ISO8859-15
+ca_ES.UTF-8@euro:                              ca_ES.UTF-8
+ca_FR:                                         ca_FR.ISO8859-1
+ca_FR@euro:                                    ca_FR.ISO8859-15
+ca_FR.iso88591:                                        ca_FR.ISO8859-1
+ca_FR.ISO-8859-1:                              ca_FR.ISO8859-1
+ca_FR.iso885915:                               ca_FR.ISO8859-15
+ca_FR.utf8:                                    ca_FR.UTF-8
+ca_FR.ISO-8859-15:                             ca_FR.ISO8859-15
+ca_FR.ISO-8859-15@euro:                                ca_FR.ISO8859-15
+ca_FR.UTF-8@euro:                              ca_FR.UTF-8
+ca_IT:                                         ca_IT.ISO8859-1
+ca_IT@euro:                                    ca_IT.ISO8859-15
+ca_IT.iso88591:                                        ca_IT.ISO8859-1
+ca_IT.ISO-8859-1:                              ca_IT.ISO8859-1
+ca_IT.iso885915:                               ca_IT.ISO8859-15
+ca_IT.utf8:                                    ca_IT.UTF-8
+ca_IT.ISO-8859-15:                             ca_IT.ISO8859-15
+ca_IT.ISO-8859-15@euro:                                ca_IT.ISO8859-15
+ca_IT.UTF-8@euro:                              ca_IT.UTF-8
+cs:                                            cs_CZ.ISO8859-2
+cs_CS:                                         cs_CZ.ISO8859-2
+cs_CS.ISO8859-2:                               cs_CZ.ISO8859-2
+cs_CZ:                                         cs_CZ.ISO8859-2
+cs_CZ.iso88592:                                        cs_CZ.ISO8859-2
+cs_CS.iso8859-2:                                cs_CS.ISO8859-2
+cs_CZ.ISO-8859-2:                              cs_CZ.ISO8859-2
+cs_CZ.ISO_8859-2:                              cs_CZ.ISO8859-2
+cs_CZ.utf8:                                    cs_CZ.UTF-8
+XCOMM cz is an old name for Czech (now cs), and should be deleted in the future.
+cz:                                            cs_CZ.ISO8859-2
+cz_CZ:                                         cs_CZ.ISO8859-2
+cz_CZ.utf8:                                    cs_CZ.UTF-8
+cz_CZ.UTF-8:                                   cs_CZ.UTF-8
+cy:                                            cy_GB.ISO8859-1
+cy_GB:                                         cy_GB.ISO8859-1
+cy_GB.iso88591:                                        cy_GB.ISO8859-1
+cy_GB.ISO-8859-1:                              cy_GB.ISO8859-1
+cy_GB.iso885914:                               cy_GB.ISO8859-14
+cy_GB.ISO-8859-14:                             cy_GB.ISO8859-14
+cy_GB.iso885915:                               cy_GB.ISO8859-15
+cy_GB.ISO-8859-15:                             cy_GB.ISO8859-15
+da:                                            da_DK.ISO8859-1
+da.ISO8859-15:                                 da_DK.ISO8859-15
+da_DK:                                         da_DK.ISO8859-1
+DA_DK:                                         da_DK.ISO8859-1
+da_DK.88591:                                   da_DK.ISO8859-1
+da_DK.88591.en:                                        da_DK.ISO8859-1
+da_DK.iso88591:                                        da_DK.ISO8859-1
+da_DK.ISO-8859-1:                              da_DK.ISO8859-1
+da_DK.ISO_8859-1:                              da_DK.ISO8859-1
+da_DK.iso885915:                               da_DK.ISO8859-15
+da_DK.ISO-8859-15:                             da_DK.ISO8859-15
+da_DK.8859-15:                                 da_DK.ISO8859-15
+da_DK.utf8:                                    da_DK.UTF-8
+DA_DK.UTF-8:                                   da_DK.UTF-8
+de:                                            de_DE.ISO8859-1
+de.ISO8859-15:                                 de_DE.ISO8859-15
+de_AT:                                         de_AT.ISO8859-1
+de_AT@euro:                                    de_AT.ISO8859-15
+de_AT.iso88591:                                        de_AT.ISO8859-1
+de_AT.ISO-8859-1:                              de_AT.ISO8859-1
+de_AT.ISO_8859-1:                              de_AT.ISO8859-1
+de_AT.iso885915:                               de_AT.ISO8859-15
+de_AT.ISO-8859-15:                             de_AT.ISO8859-15
+de_AT.ISO-8859-15@euro:                                de_AT.ISO8859-15
+de_AT.UTF-8@euro:                              de_AT.UTF-8
+de_AT.utf8:                                    de_AT.UTF-8
+de_BE:                                         de_BE.ISO8859-1
+de_BE@euro:                                    de_BE.ISO8859-15
+de_BE.iso88591:                                        de_BE.ISO8859-1
+de_BE.ISO_8859-1:                              de_BE.ISO8859-1
+de_BE.ISO-8859-1:                              de_BE.ISO8859-1
+de_BE.iso885915:                               de_BE.ISO8859-15
+de_BE.ISO_8859-15:                             de_BE.ISO8859-15
+de_BE.ISO-8859-15:                             de_BE.ISO8859-15
+de_BE.ISO-8859-15@euro:                                de_BE.ISO8859-15
+de_BE.UTF-8@euro:                              de_BE.UTF-8
+de_CH:                                         de_CH.ISO8859-1
+de_CH.iso88591:                                        de_CH.ISO8859-1
+de_CH.ISO_8859-1:                              de_CH.ISO8859-1
+de_CH.ISO-8859-1:                              de_CH.ISO8859-1
+de_CH.iso885915:                               de_CH.ISO8859-15
+de_CH.ISO_8859-15:                             de_CH.ISO8859-15
+de_CH.ISO-8859-15:                             de_CH.ISO8859-15
+de_CH.utf8:                                    de_CH.UTF-8
+de_DE:                                         de_DE.ISO8859-1
+de_DE@euro:                                    de_DE.ISO8859-15
+de_DE.88591:                                   de_DE.ISO8859-1
+de_DE.88591.en:                                        de_DE.ISO8859-1
+de_DE.iso88591:                                        de_DE.ISO8859-1
+de_DE.ISO-8859-1:                              de_DE.ISO8859-1
+de_DE.ISO_8859-1:                              de_DE.ISO8859-1
+de_DE.iso885915:                               de_DE.ISO8859-15
+de_DE.ISO-8859-15:                             de_DE.ISO8859-15
+de_DE.ISO_8859-15:                             de_DE.ISO8859-15
+de_DE.8859-15:                                 de_DE.ISO8859-15
+de_DE.8859-15@euro:                            de_DE.ISO8859-15
+de_DE.ISO-8859-15@euro:                                de_DE.ISO8859-15
+de_DE.UTF-8@euro:                              de_DE.UTF-8
+de_DE.utf8:                                    de_DE.UTF-8
+de_LU:                                         de_LU.ISO8859-1
+de_LU@euro:                                    de_LU.ISO8859-15
+de_LU.iso88591:                                        de_LU.ISO8859-1
+de_LU.ISO_8859-1:                              de_LU.ISO8859-1
+de_LU.ISO-8859-1:                              de_LU.ISO8859-1
+de_LU.iso885915:                               de_LU.ISO8859-15
+de_LU.ISO_8859-15:                             de_LU.ISO8859-15
+de_LU.ISO-8859-15:                             de_LU.ISO8859-15
+de_LU.ISO-8859-15@euro:                                de_LU.ISO8859-15
+de_LU.UTF-8@euro:                              de_LU.UTF-8
+de_LU.utf8:                                    de_LU.UTF-8
+GER_DE.8859:                                   de_DE.ISO8859-1
+GER_DE.8859.in:                                        de_DE.ISO8859-1
+ee:                                            ee_EE.ISO8859-4
+ee_EE:                                         ee_EE.ISO8859-4
+ee_EE.iso88594:                                        ee_EE.ISO8859-4
+el:                                            el_GR.ISO8859-7
+el_GR:                                         el_GR.ISO8859-7
+el_GR.iso88597:                                        el_GR.ISO8859-7
+el_GR.ISO-8859-7:                              el_GR.ISO8859-7
+el_GR@euro:                                    el_GR.ISO8859-15
+el_GR.utf8:                                    el_GR.UTF-8
+en:                                            en_US.ISO8859-1
+en.ISO-8859-1:                                 en_US.ISO8859-1
+en_AU:                                         en_AU.ISO8859-1
+en_AU.iso88591:                                        en_AU.ISO8859-1
+en_AU.ISO-8859-1:                              en_AU.ISO8859-1
+en_AU.ISO_8859-1:                              en_AU.ISO8859-1
+en_AU.utf8:                                    en_AU.UTF-8
+en_BE:                                         en_BE.ISO8859-1
+en_BE@euro:                                    en_BE.ISO8859-15
+en_BE.utf8:                                    en_BE.UTF-8
+en_BW:                                         en_BW.ISO8859-1
+en_BW.iso88591:                                        en_BW.ISO8859-1
+en_BW.ISO-8859-1:                              en_BW.ISO8859-1
+en_CA:                                         en_CA.ISO8859-1
+en_CA.iso88591:                                        en_CA.ISO8859-1
+en_CA.ISO-8859-1:                              en_CA.ISO8859-1
+en_CA.ISO_8859-1:                              en_CA.ISO8859-1
+en_CA.utf8:                                    en_CA.UTF-8
+en_GB:                                         en_GB.ISO8859-1
+en_GB.88591:                                   en_GB.ISO8859-1
+en_GB.88591.en:                                        en_GB.ISO8859-1
+en_GB.iso88591:                                        en_GB.ISO8859-1
+en_GB.ISO-8859-1:                              en_GB.ISO8859-1
+en_GB.ISO_8859-1:                              en_GB.ISO8859-1
+en_GB.iso885915:                               en_GB.ISO8859-15
+en_GB.ISO-8859-15:                             en_GB.ISO8859-15
+en_GB.utf8:                                    en_GB.UTF-8
+en_UK:                                         en_GB.ISO8859-1
+ENG_GB.8859:                                   en_GB.ISO8859-1
+ENG_GB.8859.in:                                        en_GB.ISO8859-1
+en_HK:                                         en_HK.ISO8859-1
+en_HK.iso88591:                                        en_HK.ISO8859-1
+en_HK.ISO-8859-1:                              en_HK.ISO8859-1
+en_IE:                                         en_IE.ISO8859-1
+en_IE.iso88591:                                        en_IE.ISO8859-1
+en_IE.ISO-8859-1:                              en_IE.ISO8859-1
+en_IE.iso885915:                               en_IE.ISO8859-15
+en_IE.ISO-8859-15:                             en_IE.ISO8859-15
+en_IE.ISO-8859-15@euro:                                en_IE.ISO8859-15
+en_IE@euro:                                    en_IE.ISO8859-15
+en_IE.UTF-8@euro:                              en_IE.UTF-8
+en_IE.utf8:                                    en_IE.UTF-8
+en_IN:                                         en_IN.ISO8859-1
+en_NZ:                                         en_NZ.ISO8859-1
+en_NZ.iso88591:                                        en_NZ.ISO8859-1
+en_NZ.ISO-8859-1:                              en_NZ.ISO8859-1
+en_NZ.utf8:                                    en_NZ.UTF-8
+en_PH:                                         en_PH.ISO8859-1
+en_PH.iso88591:                                        en_PH.ISO8859-1
+en_PH.ISO-8859-1:                              en_PH.ISO8859-1
+en_SG:                                         en_SG.ISO8859-1
+en_SG.iso88591:                                        en_SG.ISO8859-1
+en_SG.ISO-8859-1:                              en_SG.ISO8859-1
+en_US:                                         en_US.ISO8859-1
+EN_US:                                         en_US.ISO8859-1
+en_US.88591:                                   en_US.ISO8859-1
+en_US.88591.en:                                        en_US.ISO8859-1
+en_US.iso88591:                                        en_US.ISO8859-1
+en_US.ISO-8859-1:                              en_US.ISO8859-1
+en_US.ISO_8859-1:                              en_US.ISO8859-1
+en_US.iso885915:                               en_US.ISO8859-15
+en_US.ISO-8859-15:                             en_US.ISO8859-15
+en_US.8859-15:                                 en_US.ISO8859-15
+en_US.ISO8859-15@euro:                         en_US.ISO8859-15
+en_US.utf8:                                    en_US.UTF-8
+EN_US.UTF-8:                                   en_US.UTF-8
+en_ZA:                                         en_ZA.ISO8859-1
+en_ZA.88591:                                   en_ZA.ISO8859-1
+en_ZA.88591.en:                                        en_ZA.ISO8859-1
+en_ZA.iso88591:                                        en_ZA.ISO8859-1
+en_ZA.ISO-8859-1:                              en_ZA.ISO8859-1
+en_ZA.ISO_8859-1:                              en_ZA.ISO8859-1
+en_ZA.iso885915:                               en_ZA.ISO8859-15
+en_ZA.ISO-8859-15:                             en_ZA.ISO8859-15
+en_ZA.utf8:                                    en_ZA.UTF-8
+en_ZW:                                         en_ZW.ISO8859-1
+en_ZW.iso88591:                                        en_ZW.ISO8859-1
+en_ZW.ISO-8859-1:                              en_ZW.ISO8859-1
+eo:                                            eo_XX.ISO8859-3
+eo_EO:                                         eo_EO.ISO8859-3
+eo_EO.ISO8859-3:                               eo_EO.ISO8859-3
+eo_XX:                                         eo_XX.ISO8859-3
+eo_XX.ISO8859-3:                               eo_XX.ISO8859-3
+es:                                            es_ES.ISO8859-1
+es.UTF-8:                                      es_ES.UTF-8
+es_AR:                                         es_AR.ISO8859-1
+es_AR.iso88591:                                        es_AR.ISO8859-1
+es_AR.ISO-8859-1:                              es_AR.ISO8859-1
+es_AR.utf8:                                    es_AR.UTF-8
+es_BO:                                         es_BO.ISO8859-1
+es_BO.iso88591:                                        es_BO.ISO8859-1
+es_BO.ISO-8859-1:                              es_BO.ISO8859-1
+es_BO.utf8:                                    es_BO.UTF-8
+es_CL:                                         es_CL.ISO8859-1
+es_CL.iso88591:                                        es_CL.ISO8859-1
+es_CL.ISO-8859-1:                              es_CL.ISO8859-1
+es_CL.utf8:                                    es_CL.UTF-8
+es_CO:                                         es_CO.ISO8859-1
+es_CO.iso88591:                                        es_CO.ISO8859-1
+es_CO.ISO-8859-1:                              es_CO.ISO8859-1
+es_CO.utf8:                                    es_CO.UTF-8
+es_CR:                                         es_CR.ISO8859-1
+es_CR.iso88591:                                        es_CR.ISO8859-1
+es_CR.ISO-8859-1:                              es_CR.ISO8859-1
+es_CR.utf8:                                    es_CR.UTF-8
+es_DO:                                         es_DO.ISO8859-1
+es_DO.iso88591:                                        es_DO.ISO8859-1
+es_DO.ISO-8859-1:                              es_DO.ISO8859-1
+es_DO.utf8:                                    es_DO.UTF-8
+es_EC:                                         es_EC.ISO8859-1
+es_EC.iso88591:                                        es_EC.ISO8859-1
+es_EC.ISO-8859-1:                              es_EC.ISO8859-1
+es_EC.utf8:                                    es_EC.UTF-8
+es_ES:                                         es_ES.ISO8859-1
+es_ES.88591:                                   es_ES.ISO8859-1
+es_ES.88591.en:                                        es_ES.ISO8859-1
+es_ES.iso88591:                                        es_ES.ISO8859-1
+es_ES.ISO-8859-1:                              es_ES.ISO8859-1
+es_ES.ISO_8859-1:                              es_ES.ISO8859-1
+es_ES.iso885915:                               es_ES.ISO8859-15
+es_ES.ISO-8859-15:                             es_ES.ISO8859-15
+es_ES.ISO-8859-15@euro:                                es_ES.ISO8859-15
+es_ES@euro:                                    es_ES.ISO8859-15
+es_ES.UTF-8@euro:                              es_ES.UTF-8
+es_ES.utf8:                                    es_ES.UTF-8
+es_GT:                                         es_GT.ISO8859-1
+es_GT.iso88591:                                        es_GT.ISO8859-1
+es_GT.ISO-8859-1:                              es_GT.ISO8859-1
+es_GT.utf8:                                    es_GT.UTF-8
+es_HN:                                         es_HN.ISO8859-1
+es_HN.iso88591:                                        es_HN.ISO8859-1
+es_HN.ISO-8859-1:                              es_HN.ISO8859-1
+es_HN.utf8:                                    es_HN.UTF-8
+es_MX:                                         es_MX.ISO8859-1
+es_MX.iso88591:                                        es_MX.ISO8859-1
+es_MX.ISO-8859-1:                              es_MX.ISO8859-1
+es_MX.utf8:                                    es_MX.UTF-8
+es_NI:                                         es_NI.ISO8859-1
+es_NI.iso88591:                                        es_NI.ISO8859-1
+es_NI.ISO-8859-1:                              es_NI.ISO8859-1
+es_NI.utf8:                                    es_NI.UTF-8
+es_PA:                                         es_PA.ISO8859-1
+es_PA.iso88591:                                        es_PA.ISO8859-1
+es_PA.ISO-8859-1:                              es_PA.ISO8859-1
+es_PA.iso885915:                               es_PA.ISO8859-15
+es_PA.utf8:                                    es_PA.UTF-8
+es_PE:                                         es_PE.ISO8859-1
+es_PE.iso88591:                                        es_PE.ISO8859-1
+es_PE.ISO-8859-1:                              es_PE.ISO8859-1
+es_PE.iso885915:                               es_PE.ISO8859-15
+es_PE.utf8:                                    es_PE.UTF-8
+es_PR:                                         es_PR.ISO8859-1
+es_PR.iso88591:                                        es_PR.ISO8859-1
+es_PR.ISO-8859-1:                              es_PR.ISO8859-1
+es_PR.utf8:                                    es_PR.UTF-8
+es_PY:                                         es_PY.ISO8859-1
+es_PY.iso88591:                                        es_PY.ISO8859-1
+es_PY.ISO-8859-1:                              es_PY.ISO8859-1
+es_PY.iso885915:                               es_PY.ISO8859-15
+es_PY.utf8:                                    es_PY.UTF-8
+es_SV:                                         es_SV.ISO8859-1
+es_SV.iso88591:                                        es_SV.ISO8859-1
+es_SV.ISO-8859-1:                              es_SV.ISO8859-1
+es_SV.iso885915:                               es_SV.ISO8859-15
+es_SV.utf8:                                    es_SV.UTF-8
+es_US:                                         es_US.ISO8859-1
+es_US.iso88591:                                        es_US.ISO8859-1
+es_US.ISO-8859-1:                              es_US.ISO8859-1
+es_UY:                                         es_UY.ISO8859-1
+es_UY.iso88591:                                        es_UY.ISO8859-1
+es_UY.ISO-8859-1:                              es_UY.ISO8859-1
+es_UY.iso885915:                               es_UY.ISO8859-15
+es_UY.utf8:                                    es_UY.UTF-8
+es_VE:                                         es_VE.ISO8859-1
+es_VE.iso88591:                                        es_VE.ISO8859-1
+es_VE.ISO-8859-1:                              es_VE.ISO8859-1
+es_VE.iso885915:                               es_VE.ISO8859-15
+es_VE.utf8:                                    es_VE.UTF-8
+#if defined(SVR4) && defined(sun)
+XCOMM Sun Solaris 2.6 has erroneously specified Estonian as a Latin-1
+XCOMM language; however this is clearly incorrect according to ISO8859.
+#endif
+XCOMM According to Estonian local standards, ISO8859-4 is not a recommended
+XCOMM charset. EVS8:2000 specifies ISO8859-15 as the base charset.
+et:                                            et_EE.ISO8859-15
+et_EE:                                         et_EE.ISO8859-15
+et_EE.iso88591:                                        et_EE.ISO8859-1
+et_EE.ISO-8859-1:                              et_EE.ISO8859-1
+et_EE.iso88594:                                        et_EE.ISO8859-4
+et_EE.ISO-8859-4:                              et_EE.ISO8859-4
+et_EE.iso885913:                               et_EE.ISO8859-13
+et_EE.ISO-8859-13:                             et_EE.ISO8859-13
+et_EE.iso885915:                               et_EE.ISO8859-15
+et_EE.ISO-8859-15:                             et_EE.ISO8859-15
+et_EE.utf8:                                    et_EE.UTF-8
+eu:                                            eu_ES.ISO8859-1
+eu_ES:                                         eu_ES.ISO8859-1
+eu_ES.iso88591:                                        eu_ES.ISO8859-1
+eu_ES.ISO-8859-1:                              eu_ES.ISO8859-1
+eu_ES.iso885915:                               eu_ES.ISO8859-15
+eu_ES.ISO-8859-15:                             eu_ES.ISO8859-15
+eu_ES.ISO-8859-15@euro:                                eu_ES.ISO8859-15
+eu_ES@euro:                                    eu_ES.ISO8859-15
+eu_ES.UTF-8@euro:                              eu_ES.UTF-8
+fa:                                            fa_IR.UTF-8
+fa_IR:                                         fa_IR.UTF-8
+fa_IR.isiri3342:                               fa_IR.ISIRI-3342
+fa_IR.utf8:                                    fa_IR.UTF-8
+fi:                                            fi_FI.ISO8859-15
+fi.ISO8859-15:                                 fi_FI.ISO8859-15
+fi_FI:                                         fi_FI.ISO8859-15
+fi_FI.88591:                                   fi_FI.ISO8859-1
+fi_FI.88591.en:                                        fi_FI.ISO8859-1
+fi_FI.iso88591:                                        fi_FI.ISO8859-1
+fi_FI.ISO-8859-1:                              fi_FI.ISO8859-1
+fi_FI.ISO_8859-1:                              fi_FI.ISO8859-1
+fi_FI.iso885915:                               fi_FI.ISO8859-15
+fi_FI.ISO-8859-15:                             fi_FI.ISO8859-15
+fi_FI.ISO-8859-15@euro:                                fi_FI.ISO8859-15
+fi_FI@euro:                                    fi_FI.ISO8859-15
+fi_FI.utf8:                                    fi_FI.UTF-8
+fi_FI.UTF-8@euro:                              fi_FI.UTF-8
+fo:                                            fo_FO.ISO8859-1
+fo_FO:                                         fo_FO.ISO8859-1
+fo_FO.iso88591:                                        fo_FO.ISO8859-1
+fo_FO.ISO-8859-1:                              fo_FO.ISO8859-1
+fo_FO.iso885915:                               fo_FO.ISO8859-15
+fo_FO.ISO-8859-15:                             fo_FO.ISO8859-15
+fo_FO.utf8:                                    fo_FO.UTF-8
+fr:                                            fr_FR.ISO8859-1
+fr.ISO8859-15:                                 fr_FR.ISO8859-15
+fr.UTF-8:                                      fr_FR.UTF-8
+fr_BE:                                         fr_BE.ISO8859-1
+fr_BE.88591:                                   fr_BE.ISO8859-1
+fr_BE.88591.en:                                        fr_BE.ISO8859-1
+fr_BE.ISO-8859-1:                              fr_BE.ISO8859-1
+fr_BE.ISO_8859-1:                              fr_BE.ISO8859-1
+fr_BE.iso885915:                               fr_BE.ISO8859-15
+fr_BE.ISO-8859-15:                             fr_BE.ISO8859-15
+fr_BE.ISO-8859-15@euro:                                fr_BE.ISO8859-15
+fr_BE@euro:                                    fr_BE.ISO8859-15
+fr_BE.utf8:                                    fr_BE.UTF-8
+fr_BE.UTF-8@euro:                              fr_BE.UTF-8
+fr_CA:                                         fr_CA.ISO8859-1
+fr_CA.88591:                                   fr_CA.ISO8859-1
+fr_CA.88591.en:                                        fr_CA.ISO8859-1
+fr_CA.iso88591:                                        fr_CA.ISO8859-1
+fr_CA.ISO-8859-1:                              fr_CA.ISO8859-1
+fr_CA.ISO_8859-1:                              fr_CA.ISO8859-1
+fr_CA.iso885915:                               fr_CA.ISO8859-15
+fr_CA.ISO-8859-15:                             fr_CA.ISO8859-15
+fr_CA.utf8:                                    fr_CA.UTF-8
+fr_CH:                                         fr_CH.ISO8859-1
+fr_CH.88591:                                   fr_CH.ISO8859-1
+fr_CH.88591.en:                                        fr_CH.ISO8859-1
+fr_CH.ISO-8859-1:                              fr_CH.ISO8859-1
+fr_CH.ISO_8859-1:                              fr_CH.ISO8859-1
+fr_CH.iso885915:                               fr_CH.ISO8859-15
+fr_CH.ISO-8859-15:                             fr_CH.ISO8859-15
+fr_CH.utf8:                                    fr_CH.UTF-8
+fr_FR:                                         fr_FR.ISO8859-1
+fr_FR.88591:                                   fr_FR.ISO8859-1
+fr_FR.88591.en:                                        fr_FR.ISO8859-1
+fr_FR.iso88591:                                        fr_FR.ISO8859-1
+fr_FR.ISO-8859-1:                              fr_FR.ISO8859-1
+fr_FR.ISO_8859-1:                              fr_FR.ISO8859-1
+fr_FR.iso885915:                               fr_FR.ISO8859-15
+fr_FR.ISO-8859-15:                             fr_FR.ISO8859-15
+fr_FR.ISO-8859-15@euro:                                fr_FR.ISO8859-15
+fr_FR@euro:                                    fr_FR.ISO8859-15
+fr_FR.UTF-8@euro:                              fr_FR.UTF-8
+fr_FR.utf8:                                    fr_FR.UTF-8
+fr_LU:                                         fr_LU.ISO8859-1
+fr_LU.88591:                                   fr_LU.ISO8859-1
+fr_LU.88591.en:                                        fr_LU.ISO8859-1
+fr_LU.iso88591:                                        fr_LU.ISO8859-1
+fr_LU.ISO-8859-1:                              fr_LU.ISO8859-1
+fr_LU.ISO_8859-1:                              fr_LU.ISO8859-1
+fr_LU.iso885915:                               fr_LU.ISO8859-15
+fr_LU.ISO-8859-15:                             fr_LU.ISO8859-15
+fr_LU.ISO-8859-15@euro:                                fr_LU.ISO8859-15
+fr_LU@euro:                                    fr_LU.ISO8859-15
+fr_LU.UTF-8@euro:                              fr_LU.UTF-8
+fr_LU.utf8:                                    fr_LU.UTF-8
+FRE_FR.8859:                                   fr_FR.ISO8859-1
+FRE_FR.8859.in:                                        fr_FR.ISO8859-1
+ga:                                            ga_IE.ISO8859-1
+ga_IE:                                         ga_IE.ISO8859-1
+ga_IE.iso88591:                                        ga_IE.ISO8859-1
+ga_IE.ISO-8859-1:                              ga_IE.ISO8859-1
+ga_IE.iso885914:                               ga_IE.ISO8859-14
+ga_IE.ISO-8859-14:                             ga_IE.ISO8859-14
+ga_IE.iso885915:                               ga_IE.ISO8859-15
+ga_IE.ISO-8859-15:                             ga_IE.ISO8859-15
+ga_IE.ISO-8859-15@euro:                                ga_IE.ISO8859-15
+ga_IE@euro:                                    ga_IE.ISO8859-15
+ga_IE.UTF-8@euro:                              ga_IE.UTF-8
+ga_IE.utf8:                                    ga_IE.UTF-8
+gd:                                            gd_GB.ISO8859-1
+gd_GB:                                         gd_GB.ISO8859-1
+gd_GB.iso88591:                                        gd_GB.ISO8859-1
+gd_GB.ISO-8859-1:                              gd_GB.ISO8859-1
+gd_GB.iso885914:                               gd_GB.ISO8859-14
+gd_GB.ISO-8859-14:                             gd_GB.ISO8859-14
+gd_GB.iso885915:                               gd_GB.ISO8859-15
+gd_GB.ISO-8859-15:                             gd_GB.ISO8859-15
+gl:                                            gl_ES.ISO8859-1
+gl_ES:                                         gl_ES.ISO8859-1
+gl_ES.iso88591:                                        gl_ES.ISO8859-1
+gl_ES.ISO-8859-1:                              gl_ES.ISO8859-1
+gl_ES.iso885915:                               gl_ES.ISO8859-15
+gl_ES.ISO-8859-15:                             gl_ES.ISO8859-15
+gl_ES.ISO-8859-15@euro:                                gl_ES.ISO8859-15
+gl_ES@euro:                                    gl_ES.ISO8859-15
+gl_ES.UTF-8@euro:                              gl_ES.UTF-8
+gl_ES.utf8:                                    gl_ES.UTF-8
+gu_IN.utf8:                                    gu_IN.UTF-8
+gv:                                            gv_GB.ISO8859-1
+gv_GB:                                         gv_GB.ISO8859-1
+gv_GB.iso88591:                                        gv_GB.ISO8859-1
+gv_GB.ISO-8859-1:                              gv_GB.ISO8859-1
+gv_GB.iso885914:                               gv_GB.ISO8859-14
+gv_GB.ISO-8859-14:                             gv_GB.ISO8859-14
+gv_GB.iso885915:                               gv_GB.ISO8859-15
+gv_GB.ISO-8859-15:                             gv_GB.ISO8859-15
+he:                                            he_IL.ISO8859-8
+he_IL:                                         he_IL.ISO8859-8
+HE_IL:                                         he_IL.ISO8859-8
+he_IL.iso88598:                                        he_IL.ISO8859-8
+he_IL.ISO-8859-8:                              he_IL.ISO8859-8
+he_IL.cp1255:                                  he_IL.CP1255
+he_IL.microsoftcp1255:                         he_IL.CP1255
+he_IL.microsoft-cp1255:                                he_IL.CP1255
+he_IL.MICROSOFT-CP1255:                                he_IL.CP1255
+he_IL.utf8:                                    he_IL.UTF-8
+HE_IL.UTF-8:                                   he_IL.UTF-8
+hi:                                            hi_IN.ISCII-DEV
+hi_IN:                                         hi_IN.ISCII-DEV
+HI_IN:                                         hi_IN.ISCII-DEV
+hi_IN.isciidev:                                        hi_IN.ISCII-DEV
+hi_IN.utf8:                                    hi_IN.UTF-8
+HI_IN.UTF-8:                                   hi_IN.UTF-8
+hne:                                           hne_IN.UTF-8
+hne_IN.utf8:                                   hne_IN.UTF-8
+hr:                                            hr_HR.ISO8859-2
+hr_HR:                                         hr_HR.ISO8859-2
+hr_HR.iso88592:                                        hr_HR.ISO8859-2
+hr_HR.ISO-8859-2:                              hr_HR.ISO8859-2
+hr_HR.ISO_8859-2:                              hr_HR.ISO8859-2
+hr_HR.utf8:                                    hr_HR.UTF-8
+hu:                                            hu_HU.ISO8859-2
+hu_HU:                                         hu_HU.ISO8859-2
+hu_HU.iso88592:                                        hu_HU.ISO8859-2
+hu_HU.ISO-8859-2:                              hu_HU.ISO8859-2
+hu_HU.utf8:                                    hu_HU.UTF-8
+XCOMM in was the old ISO code for Indonesian (now id).  These lines should be
+XCOMM deleted in the future.
+in:                                            id_ID.ISO8859-1
+in_ID:                                         id_ID.ISO8859-1
+is:                                            is_IS.ISO8859-1
+is_IS:                                         is_IS.ISO8859-1
+is_IS.iso88591:                                        is_IS.ISO8859-1
+is_IS.ISO-8859-1:                              is_IS.ISO8859-1
+is_IS.ISO_8859-1:                              is_IS.ISO8859-1
+is_IS.iso885915:                               is_IS.ISO8859-15
+is_IS.ISO-8859-15:                             is_IS.ISO8859-15
+is_IS.utf8:                                    is_IS.UTF-8
+it:                                            it_IT.ISO8859-1
+it.ISO8859-15:                                 it_IT.ISO8859-15
+it.UTF-8:                                      it_IT.UTF-8
+it_CH:                                         it_CH.ISO8859-1
+it_CH.iso88591:                                        it_CH.ISO8859-1
+it_CH.ISO_8859-1:                              it_CH.ISO8859-1
+it_CH.ISO-8859-1:                              it_CH.ISO8859-1
+it_CH.iso885915:                               it_CH.ISO8859-15
+it_CH.utf8:                                    it_CH.UTF-8
+it_IT:                                         it_IT.ISO8859-1
+it_IT.88591:                                   it_IT.ISO8859-1
+it_IT.88591.en:                                        it_IT.ISO8859-1
+it_IT.iso88591:                                        it_IT.ISO8859-1
+it_IT.ISO-8859-1:                              it_IT.ISO8859-1
+it_IT.ISO_8859-1:                              it_IT.ISO8859-1
+it_IT.iso885915:                               it_IT.ISO8859-15
+it_IT.ISO-8859-15:                             it_IT.ISO8859-15
+it_IT.ISO-8859-15@euro:                                it_IT.ISO8859-15
+it_IT@euro:                                    it_IT.ISO8859-15
+it_IT.utf8:                                    it_IT.UTF-8
+it_IT.UTF-8@euro:                              it_IT.UTF-8
+iu:                                            iu_CA.NUNACOM-8
+iu_CA:                                         iu_CA.NUNACOM-8
+iu_CA.nunacom8:                                        iu_CA.NUNACOM-8
+XCOMM iw was the old ISO code for Hebrew (now he).  These lines should be
+XCOMM deleted in the future.
+iw:                                            he_IL.ISO8859-8
+iw_IL:                                         he_IL.ISO8859-8
+Iw_IL:                                         he_IL.ISO8859-8
+iw_IL.iso88598:                                        he_IL.ISO8859-8
+iw_IL.ISO-8859-8:                              he_IL.ISO8859-8
+#ifndef __uxp__
+ja_JP:                                         ja_JP.eucJP
+#else /* __uxp__ */
+ja_JP:                                         ja_JP.U90
+ja_JP.U90:                                     ja_JP.U90
+ja_JP.S90:                                     ja_JP.S90
+#endif /* __uxp__ */
+ja:                                            ja_JP.eucJP
+ja.JIS:                                                ja_JP.JIS7
+ja.SJIS:                                       ja_JP.SJIS
+ja_JP.ujis:                                    ja_JP.eucJP
+Jp_JP:                                         ja_JP.eucJP
+ja_JP.AJEC:                                    ja_JP.eucJP
+ja_JP.EUC:                                     ja_JP.eucJP
+ja_JP.EUC-JP:                                  ja_JP.eucJP
+ja_JP.EUC_JP:                                  ja_JP.eucJP
+ja_JP.eucjp:                                   ja_JP.eucJP
+ja_JP.ISO-2022-JP:                             ja_JP.JIS7
+ja_JP.JIS:                                     ja_JP.JIS7
+ja_JP.jis7:                                    ja_JP.JIS7
+ja_JP.mscode:                                  ja_JP.SJIS
+ja_JP.PCK:                                     ja_JP.SJIS
+ja_JP.SJIS:                                    ja_JP.SJIS
+ja_JP.sjis:                                    ja_JP.SJIS
+ja_JP.utf8:                                    ja_JP.UTF-8
+JA_JP.utf8:                                    ja_JP.UTF-8
+ka:                                            ka_GE.GEORGIAN-ACADEMY
+ka_GE:                                         ka_GE.GEORGIAN-ACADEMY
+ka_GE.georgianacademy:                         ka_GE.GEORGIAN-ACADEMY
+ka_GE.georgianrs:                              ka_GE.GEORGIAN-ACADEMY
+ka_GE.georgianps:                              ka_GE.GEORGIAN-PS
+kl:                                            kl_GL.ISO8859-1
+kl_GL:                                         kl_GL.ISO8859-1
+kl_GL.iso88591:                                        kl_GL.ISO8859-1
+kl_GL.ISO-8859-1:                              kl_GL.ISO8859-1
+kl_GL.iso885915:                               kl_GL.ISO8859-15
+kl_GL.utf8:                                    kl_GL.UTF-8
+kn:                                            kn_IN.UTF-8
+kn_IN.utf8:                                    kn_IN.UTF-8
+ko:                                            ko_KR.eucKR
+ko.UTF-8:                                      ko_KR.UTF-8
+ko_KR:                                         ko_KR.eucKR
+KO_KR:                                         ko_KR.eucKR
+ko_KR.EUC:                                     ko_KR.eucKR
+ko_KR.EUC-KR:                                  ko_KR.eucKR
+ko_KR.euc:                                     ko_KR.eucKR
+ko_KR.euckr:                                   ko_KR.eucKR
+ko_KR.utf8:                                    ko_KR.UTF-8
+KO_KR.UTF-8:                                   ko_KR.UTF-8
+ks:                                            ks_IN.UTF-8
+ks_IN.utf8:                                    ks_IN.UTF-8
+ks_IN@devanagari:                              ks_IN@devanagari.UTF-8
+ks_IN@devanagari.utf8:                         ks_IN@devanagari.UTF-8
+kw:                                            kw_GB.ISO8859-1
+kw_GB:                                         kw_GB.ISO8859-1
+kw_GB.iso88591:                                        kw_GB.ISO8859-1
+kw_GB.ISO-8859-1:                              kw_GB.ISO8859-1
+kw_GB.iso885914:                               kw_GB.ISO8859-14
+kw_GB.ISO-8859-14:                             kw_GB.ISO8859-14
+kw_GB.iso885915:                               kw_GB.ISO8859-15
+kw_GB.ISO-8859-15:                             kw_GB.ISO8859-15
+ky:                                            ky_KG.UTF-8
+ky_KG:                                                 ky_KG.UTF-8
+ky_KG.UTF-8:                                   ky_KG.UTF-8
+lo:                                            lo_LA.MULELAO-1
+lo_LA:                                         lo_LA.MULELAO-1
+lo_LA.cp1133:                                  lo_LA.IBM-CP1133
+lo_LA.ibmcp1133:                               lo_LA.IBM-CP1133
+lo_LA.mulelao1:                                        lo_LA.MULELAO-1
+#if defined(VeryOldFreeBSD)
+XCOMM most locales in FreeBSD 2.1.[56] do not work, allow use of FreeBSD's
+XCOMM generic Latin-1 locale name. N.B. "lt" is a bad code to use for a
+XCOMM generic Latin-1 locale anyway because it is the country code for
+XCOMM Lithuania, which by default uses Latin-7 (ISO-8859-13).
+lt_LN.ISO_8859-1:                              lt_LN.ISO8859-1
+#endif
+lt:                                            lt_LT.ISO8859-13
+lt_LT:                                         lt_LT.ISO8859-13
+lt_LT.iso88594:                                        lt_LT.ISO8859-4
+lt_LT.ISO-8859-4:                              lt_LT.ISO8859-4
+lt_LT.ISO_8859-4:                              lt_LT.ISO8859-4
+lt_LT.iso885913:                               lt_LT.ISO8859-13
+lt_LT.ISO-8859-13:                             lt_LT.ISO8859-13
+lt_LT.ISO_8859-13:                             lt_LT.ISO8859-13
+lt_LT.utf8:                                    lt_LT.UTF-8
+lv:                                            lv_LV.ISO8859-13
+lv_LV:                                         lv_LV.ISO8859-13
+lv_LV.iso88594:                                        lv_LV.ISO8859-4
+lv_LV.ISO-8859-4:                              lv_LV.ISO8859-4
+lv_LV.iso885913:                               lv_LV.ISO8859-13
+lv_LV.ISO-8859-13:                             lv_LV.ISO8859-13
+lv_LV.ISO_8859-13:                             lv_LV.ISO8859-13
+lv_LV.utf8:                                    lv_LV.UTF-8
+mai:                                           mai_IN.UTF-8
+mai_IN.utf8:                                   mai_IN.UTF-8
+mi:                                            mi_NZ.ISO8859-1
+mi_NZ:                                         mi_NZ.ISO8859-1
+mi_NZ.iso88591:                                        mi_NZ.ISO8859-1
+mk:                                            mk_MK.ISO8859-5
+mk_MK:                                         mk_MK.ISO8859-5
+mk_MK.iso88595:                                        mk_MK.ISO8859-5
+mk_MK.ISO-8859-5:                              mk_MK.ISO8859-5
+mk_MK.cp1251:                                  mk_MK.CP1251
+mk_MK.microsoftcp1251:                         mk_MK.CP1251
+mk_MK.microsoft-cp1251:                                mk_MK.CP1251
+mk_MK.MICROSOFT-CP1251:                                mk_MK.CP1251
+mk_MK.utf8:                                    mk_MK.UTF-8
+ml:                                            ml_IN.UTF-8
+ml_IN.utf8:                                    ml_IN.UTF-8
+mr:                                            mr_IN.UTF-8
+mr_IN:                                         mr_IN.UTF-8
+mr_IN.utf8:                                    mr_IN.UTF-8
+ms:                                            ms_MY.ISO8859-1
+ms_MY:                                         ms_MY.ISO8859-1
+ms_MY.iso88591:                                        ms_MY.ISO8859-1
+ms_MY.ISO-8859-1:                              ms_MY.ISO8859-1
+mt:                                            mt_MT.ISO8859-3
+mt_MT:                                         mt_MT.ISO8859-3
+mt_MT.ISO-8859-3:                              mt_MT.ISO8859-3
+nb:                                            nb_NO.ISO8859-1
+nb_NO:                                         nb_NO.ISO8859-1
+nb_NO.88591:                                   nb_NO.ISO8859-1
+nb_NO.iso88591:                                        nb_NO.ISO8859-1
+nb_NO.ISO-8859-1:                              nb_NO.ISO8859-1
+nb_NO.iso885915:                               nb_NO.ISO8859-15
+nb_NO.ISO-8859-15:                             nb_NO.ISO8859-15
+nb_NO.utf8:                                    nb_NO.UTF-8
+ne_NP.utf8:                                    ne_NP.UTF-8
+nl:                                            nl_NL.ISO8859-1
+nl.ISO8859-15:                                 nl_NL.ISO8859-15
+nl_BE:                                         nl_BE.ISO8859-1
+nl_BE.88591:                                   nl_BE.ISO8859-1
+nl_BE.88591.en:                                        nl_BE.ISO8859-1
+nl_BE.iso88591:                                        nl_BE.ISO8859-1
+nl_BE.ISO-8859-1:                              nl_BE.ISO8859-1
+nl_BE.ISO_8859-1:                              nl_BE.ISO8859-1
+nl_BE.iso885915:                               nl_BE.ISO8859-15
+nl_BE.ISO-8859-15:                             nl_BE.ISO8859-15
+nl_BE.ISO-8859-15@euro:                                nl_BE.ISO8859-15
+nl_BE@euro:                                    nl_BE.ISO8859-15
+nl_BE.utf8:                                    nl_BE.UTF-8
+nl_BE.UTF-8@euro:                              nl_BE.UTF-8
+nl_NL:                                         nl_NL.ISO8859-1
+nl_NL.88591:                                   nl_NL.ISO8859-1
+nl_NL.88591.en:                                        nl_NL.ISO8859-1
+nl_NL.iso88591:                                        nl_NL.ISO8859-1
+nl_NL.ISO-8859-1:                              nl_NL.ISO8859-1
+nl_NL.ISO_8859-1:                              nl_NL.ISO8859-1
+nl_NL.iso885915:                               nl_NL.ISO8859-15
+nl_NL.ISO-8859-15:                             nl_NL.ISO8859-15
+nl_NL.ISO-8859-15@euro:                                nl_NL.ISO8859-15
+nl_NL@euro:                                    nl_NL.ISO8859-15
+nl_NL.utf8:                                    nl_NL.UTF-8
+nl_NL.UTF-8@euro:                              nl_NL.UTF-8
+nn:                                            nn_NO.ISO8859-1
+nn_NO:                                         nn_NO.ISO8859-1
+nn_NO.88591:                                   nn_NO.ISO8859-1
+nn_NO.ISO-8859-1:                              nn_NO.ISO8859-1
+nn_NO.ISO_8859-1:                              nn_NO.ISO8859-1
+nn_NO.iso885915:                               nn_NO.ISO8859-15
+nn_NO.ISO-8859-15:                             nn_NO.ISO8859-15
+nn_NO.utf8:                                    nn_NO.UTF-8
+no:                                            no_NO.ISO8859-1
+no_NO:                                         no_NO.ISO8859-1
+no_NO.88591:                                   no_NO.ISO8859-1
+no_NO.88591.en:                                        no_NO.ISO8859-1
+no_NO.iso88591:                                        no_NO.ISO8859-1
+no_NO.ISO-8859-1:                              no_NO.ISO8859-1
+no_NO.ISO8859-1@bokmal:                                no_NO.ISO8859-1
+no_NO.ISO8859-1@nynorsk:                       no_NO.ISO8859-1
+no_NO.iso885915:                               no_NO.ISO8859-15
+no_NO.ISO-8859-15:                             no_NO.ISO8859-15
+no_NO.utf8:                                    no_NO.UTF-8
+nr:                                                    nr_ZA.ISO8859-1
+nr_ZA:                                         nr_ZA.ISO8859-1
+nr_ZA.iso88591:                                nr_ZA.ISO8859-1
+nr_ZA.utf8:                                    nr_ZA.UTF-8
+nso:                                           nso_ZA.ISO8859-15
+nso_ZA:                                                nso_ZA.ISO8859-15
+nso_ZA.iso885915:                      nso_ZA.ISO8859-15
+nso_ZA.utf8:                           nso_ZA.UTF-8
+ny:                                            ny_NO.ISO8859-1
+ny_NO:                                         ny_NO.ISO8859-1
+ny_NO.88591:                                   ny_NO.ISO8859-1
+ny_NO.ISO_8859-1:                              ny_NO.ISO8859-1
+ny_NO.iso885915:                               ny_NO.ISO8859-15
+no@nynorsk:                                    ny_NO.ISO8859-1
+nynorsk:                                       nn_NO.ISO8859-1
+oc:                                            oc_FR.ISO8859-1
+oc_FR:                                         oc_FR.ISO8859-1
+oc_FR.iso88591:                                        oc_FR.ISO8859-1
+oc_FR.ISO-8859-1:                              oc_FR.ISO8859-1
+oc_FR.iso885915:                               oc_FR.ISO8859-15
+oc_FR.ISO-8859-15:                             oc_FR.ISO8859-15
+oc_FR@euro:                                    oc_FR.ISO8859-15
+or:                                            or_IN.UTF-8
+or_IN.utf8:                                    or_IN.UTF-8
+pa:                                            pa_IN.UTF-8
+pa_IN.utf8:                                    pa_IN.UTF-8
+pa_PK.utf8:                                    pa_PK.UTF-8
+pd:                                            pd_US.ISO8859-1
+pd_DE:                                         pd_DE.ISO8859-1
+pd_US:                                         pd_US.ISO8859-1
+pd_DE.iso88591:                                        pd_DE.ISO8859-1
+pd_US.iso88591:                                        pd_US.ISO8859-1
+pd_DE.iso885915:                               pd_DE.ISO8859-15
+pd_US.iso885915:                               pd_US.ISO8859-15
+ph:                                            ph_PH.ISO8859-1
+ph_PH:                                         ph_PH.ISO8859-1
+ph_PH.iso88591:                                        ph_PH.ISO8859-1
+pl:                                            pl_PL.ISO8859-2
+pl.UTF-8:                                      pl_PL.UTF-8
+pl_PL:                                         pl_PL.ISO8859-2
+pl_PL.iso88592:                                        pl_PL.ISO8859-2
+pl_PL.ISO-8859-2:                              pl_PL.ISO8859-2
+pl_PL.utf8:                                    pl_PL.UTF-8
+pp:                                            pp_AN.ISO8859-1
+pp_AN:                                         pp_AN.ISO8859-1
+pp_AN.iso88591:                                        pp_AN.ISO8859-1
+pt:                                            pt_PT.ISO8859-1
+pt.ISO8859-15:                                 pt_PT.ISO8859-15
+pt_BR:                                         pt_BR.ISO8859-1
+pt_BR.88591:                                   pt_BR.ISO8859-1
+pt_BR.88591.en:                                        pt_BR.ISO8859-1
+pt_BR.iso88591:                                        pt_BR.ISO8859-1
+pt_BR.ISO-8859-1:                              pt_BR.ISO8859-1
+pt_BR.ISO_8859-1:                              pt_BR.ISO8859-1
+pt_BR.iso885915:                               pt_BR.ISO8859-15
+pt_BR.utf8:                                    pt_BR.UTF-8
+pt_PT:                                         pt_PT.ISO8859-1
+pt_PT.88591:                                   pt_PT.ISO8859-1
+pt_PT.88591.en:                                        pt_PT.ISO8859-1
+pt_PT.iso88591:                                        pt_PT.ISO8859-1
+pt_PT.ISO-8859-1:                              pt_PT.ISO8859-1
+pt_PT.ISO_8859-1:                              pt_PT.ISO8859-1
+pt_PT.iso885915:                               pt_PT.ISO8859-15
+pt_PT.ISO-8859-15:                             pt_PT.ISO8859-15
+pt_PT.ISO-8859-15@euro:                                pt_PT.ISO8859-15
+pt_PT@euro:                                    pt_PT.ISO8859-15
+pt_PT.utf8:                                    pt_PT.UTF-8
+pt_PT.UTF-8@euro:                              pt_PT.UTF-8
+ro:                                            ro_RO.ISO8859-2
+ro_RO:                                         ro_RO.ISO8859-2
+ro_RO.iso88592:                                        ro_RO.ISO8859-2
+ro_RO.ISO-8859-2:                              ro_RO.ISO8859-2
+ro_RO.utf8:                                    ro_RO.UTF-8
+ru:                                            ru_RU.UTF-8
+ru.koi8-r:                                     ru_RU.KOI8-R
+ru.UTF-8:                                      ru_RU.UTF-8
+ru_RU:                                         ru_RU.UTF-8
+ru_RU.utf8:                                    ru_RU.UTF-8
+ru_RU.iso88595:                                        ru_RU.ISO8859-5
+ru_RU.ISO-8859-5:                              ru_RU.ISO8859-5
+ru_RU.koi8r:                                   ru_RU.KOI8-R
+ru_RU.cp1251:                                  ru_RU.CP1251
+ru_RU.microsoftcp1251:                         ru_RU.CP1251
+ru_RU.microsoft-cp1251:                                ru_RU.CP1251
+ru_RU.MICROSOFT-CP1251:                                ru_RU.CP1251
+#if defined(INCLUDE_ru_SU)
+XCOMM ru_SU is redundant now
+ru_SU:                                         ru_RU.KOI8-R
+ru_SU.ISO8859-5:                               ru_RU.ISO8859-5
+ru_SU.KOI8-R:                                  ru_RU.KOI8-R
+#endif
+ru_UA:                                         ru_UA.KOI8-U
+ru_UA.koi8u:                                   ru_UA.KOI8-U
+ru_UA.cp1251:                                  ru_UA.CP1251
+ru_UA.microsoftcp1251:                         ru_UA.CP1251
+ru_UA.microsoft-cp1251:                                ru_UA.CP1251
+ru_UA.MICROSOFT-CP1251:                                ru_UA.CP1251
+rw:                         rw_RW.ISO8859-1
+rw_RW:                      rw_RW.ISO8859-1
+rw_RW.iso8859-1:            rw_RW.ISO8859-1
+rw_RW.ISO-8859-1:           rw_RW.ISO8859-1
+rw_RW.utf8:                 rw_RW.UTF-8
+sd:                                            sd_IN.UTF-8
+sd_IN.utf8:                                    sd_IN.UTF-8
+sd:                                            sd_IN@devanagari.UTF-8
+sd_IN@devanagari.utf8:                         sd_IN@devanagari.UTF-8
+se_NO:                                         se_NO.UTF-8
+se_NO.utf8:                                    se_NO.UTF-8
+XCOMM sh was the old ISO code for Serbo-Croatian (now individual sr and hr).
+XCOMM YU was the old ISO code for Yugoslavia (later CS for Serbia&Montenegro).
+XCOMM CS was the old ISO code for Serbia&Montenegro (now separate RS and ME).
+XCOMM These lines should be deleted in the future.
+sh:                                            sr_RS.UTF-8@latin
+sh_BA.ISO8859-2@bosnia:                                sr_CS.ISO8859-2
+sh_HR.iso88592:                                        hr_HR.ISO8859-2
+sh_YU:                                         sr_RS.UTF-8@latin
+sh_YU.utf8:                                    sr_RS.UTF-8@latin
+si:                                            si_LK.UTF-8
+si_LK:                                         si_LK.UTF-8
+sk:                                            sk_SK.ISO8859-2
+sk_SK:                                         sk_SK.ISO8859-2
+sk_SK.iso88592:                                        sk_SK.ISO8859-2
+sk_SK.ISO-8859-2:                              sk_SK.ISO8859-2
+sk_SK.utf8:                                    sk_SK.UTF-8
+sl:                                            sl_SI.ISO8859-2
+sl_SI:                                         sl_SI.ISO8859-2
+sl_SI.iso88592:                                        sl_SI.ISO8859-2
+sl_SI.ISO-8859-2:                              sl_SI.ISO8859-2
+sl_SI.utf8:                                    sl_SI.UTF-8
+sq:                                            sq_AL.ISO8859-2
+sq_AL:                                         sq_AL.ISO8859-2
+sq_AL.iso88592:                                        sq_AL.ISO8859-2
+sq_AL.ISO-8859-2:                              sq_AL.ISO8859-2
+sq_AL.utf8:                                    sq_AL.UTF-8
+XCOMM YU was the old ISO code for Yugoslavia (later CS for Serbia&Montenegro).
+XCOMM CS was the old ISO code for Serbia&Montenegro (now separate RS and ME).
+XCOMM Some of these lines should be deleted in the future.
+sr:                                            sr_RS.UTF-8
+sr_YU:                                         sr_RS.UTF-8@latin
+sr@cyrillic:                                   sr_RS.UTF-8
+sr_YU@cyrillic:                                        sr_RS.UTF-8
+sr_YU.utf8:                                    sr_RS.UTF-8
+sr_YU.UTF-8@cyrillic:                          sr_RS.UTF-8
+sr_CS:                                         sr_RS.UTF-8
+sr@Latn:                                       sr_RS.UTF-8@latin
+sr_CS@Latn:                                    sr_RS.UTF-8@latin
+sr_CS.utf8:                                    sr_RS.UTF-8
+sr_CS.UTF-8@Latn:                              sr_RS.UTF-8@latin
+sr_RS:                                         sr_RS.UTF-8
+sr@latin:                                      sr_RS.UTF-8@latin
+sr_RS@latin:                           sr_RS.UTF-8@latin
+sr_RS@Latn:                            sr_RS.UTF-8@latin
+sr_RS.UTF-8@Latn:                              sr_RS.UTF-8@latin
+sr_RS.utf8:                                    sr_RS.UTF-8
+sr_ME:                                         sr_ME.UTF-8
+sr_ME.utf8:                                    sr_ME.UTF-8
+ss:                                                    ss_ZA.ISO8859-1
+ss_ZA:                                         ss_ZA.ISO8859-1
+ss_ZA.iso88591:                                ss_ZA.ISO8859-1
+ss_ZA.utf8:                                    ss_ZA.UTF-8
+st:                                                    st_ZA.ISO8859-1
+st_ZA:                                         st_ZA.ISO8859-1
+st_ZA.iso88591:                                st_ZA.ISO8859-1
+st_ZA.utf8:                                    st_ZA.UTF-8
+sv:                                            sv_SE.ISO8859-1
+sv.ISO8859-15:                                 sv_SE.ISO8859-15
+sv.UTF-8:                                      sv_SE.UTF-8
+sv_FI:                                         sv_FI.ISO8859-1
+sv_FI.iso88591:                                        sv_FI.ISO8859-1
+sv_FI.ISO-8859-1:                              sv_FI.ISO8859-1
+sv_FI.iso885915:                               sv_FI.ISO8859-15
+sv_FI.ISO-8859-15:                             sv_FI.ISO8859-15
+sv_FI.ISO-8859-15@euro:                                sv_FI.ISO8859-15
+sv_FI@euro:                                    sv_FI.ISO8859-15
+sv_FI.UTF-8@euro:                              sv_FI.UTF-8
+sv_FI.utf8:                                    sv_FI.UTF-8
+sv_SE:                                         sv_SE.ISO8859-1
+sv_SE.88591:                                   sv_SE.ISO8859-1
+sv_SE.88591.en:                                        sv_SE.ISO8859-1
+sv_SE.iso88591:                                        sv_SE.ISO8859-1
+sv_SE.ISO-8859-1:                              sv_SE.ISO8859-1
+sv_SE.ISO_8859-1:                              sv_SE.ISO8859-1
+sv_SE.iso885915:                               sv_SE.ISO8859-15
+sv_SE.ISO-8859-15:                             sv_SE.ISO8859-15
+sv_SE@euro:                                    sv_SE.ISO8859-15
+sv_SE.utf8:                                    sv_SE.UTF-8
+ta:                                            ta_IN.TSCII-0
+ta_IN:                                         ta_IN.TSCII-0
+ta_IN.tscii:                                   ta_IN.TSCII-0
+ta_IN.tscii0:                                  ta_IN.TSCII-0
+te:                                            te_IN.UTF-8
+te_IN.utf8:                                    te_IN.UTF-8
+tg:                                            tg_TJ.KOI8-C
+tg_TJ:                                         tg_TJ.KOI8-C
+tg_TJ.koi8c:                                   tg_TJ.KOI8-C
+th:                                            th_TH.ISO8859-11
+th_TH:                                         th_TH.ISO8859-11
+th_TH.ISO-8859-11:                             th_TH.ISO8859-11
+th_TH.tis620:                                  th_TH.TIS620
+th_TH.TIS-620:                                 th_TH.TIS620
+th_TH.TACTIS:                                  th_TH.TIS620
+th_TH.utf8:                                    th_TH.UTF-8
+tl:                                            tl_PH.ISO8859-1
+tl_PH:                                         tl_PH.ISO8859-1
+tl_PH.iso88591:                                        tl_PH.ISO8859-1
+tl_PH.ISO-8859-1:                              tl_PH.ISO8859-1
+tn:                                            tn_ZA.ISO8859-15
+tn_ZA:                                 tn_ZA.ISO8859-15
+tn_ZA.iso8859-15:              tn_ZA.ISO8859-15
+tn_ZA.utf8:                            tn_ZA.UTF-8
+tr:                                            tr_TR.ISO8859-9
+tr_TR:                                         tr_TR.ISO8859-9
+TR_TR:                                         tr_TR.ISO8859-9
+tr_TR.iso88599:                                        tr_TR.ISO8859-9
+tr_TR.ISO-8859-9:                              tr_TR.ISO8859-9
+tr_TR.utf8:                                    tr_TR.UTF-8
+TR_TR.utf8:                                    tr_TR.UTF-8
+ts:                                                    ts_ZA.ISO8859-1
+ts_ZA:                                         ts_ZA.ISO8859-1
+ts_ZA.iso88591:                                ts_ZA.ISO8859-1
+ts_ZA.utf8:                                    ts_ZA.UTF-8
+tt:                                            tt_RU.TATAR-CYR
+tt_RU:                                         tt_RU.TATAR-CYR
+tt_RU.tatarcyr:                                        tt_RU.TATAR-CYR
+tt_RU.koi8c:                                   tt_RU.KOI8-C
+uk:                                            uk_UA.KOI8-U
+uk_UA:                                         uk_UA.KOI8-U
+uk_UA.iso88595:                                        uk_UA.ISO8859-5
+uk_UA.koi8u:                                   uk_UA.KOI8-U
+uk_UA.cp1251:                                  uk_UA.CP1251
+uk_UA.microsoftcp1251:                         uk_UA.CP1251
+uk_UA.microsoft-cp1251:                                uk_UA.CP1251
+uk_UA.MICROSOFT-CP1251:                                uk_UA.CP1251
+uk_UA.utf8:                                    uk_UA.UTF-8
+ur:                                            ur_IN.UTF-8
+ur_IN.utf8:                                    ur_IN.UTF-8
+ur:                                            ur_PK.CP1256
+ur_PK:                                         ur_PK.CP1256
+ur_PK.cp1256:                                  ur_PK.CP1256
+ur_PK.microsoftcp1256:                         ur_PK.CP1256
+ur_PK.microsoft-cp1256:                                ur_PK.CP1256
+ur_PK.MICROSOFT-CP1256:                                ur_PK.CP1256
+uz:                                            uz_UZ.UTF-8
+uz_UZ:                                         uz_UZ.UTF-8
+uz_UZ.ISO-8859-1:                              uz_UZ.ISO8859-1
+uz_UZ@cyrillic:                                        uz_UZ.UTF-8
+uz_UZ.UTF-8@cyrillic:                          uz_UZ.UTF-8
+ve:                                            ve_ZA.UTF-8
+ve_ZA:                                 ve_ZA.UTF-8
+ve_ZA.utf8:                            ve_ZA.UTF-8
+vi:                                            vi_VN.TCVN
+vi_VN:                                         vi_VN.TCVN
+Vi_VN:                                         vi_VN.TCVN
+VI_VN:                                         vi_VN.TCVN
+vi_VN.tcvn:                                    vi_VN.TCVN
+vi_VN.tcvn5712:                                        vi_VN.TCVN
+vi_VN.viscii:                                  vi_VN.VISCII
+vi_VN.viscii111:                               vi_VN.VISCII
+vi_VN.utf8:                                    vi_VN.UTF-8
+VI_VN.UTF-8:                                   vi_VN.UTF-8
+wa:                                            wa_BE.ISO8859-1
+wa_BE:                                         wa_BE.ISO8859-1
+wa_BE.iso88591:                                        wa_BE.ISO8859-1
+wa_BE.ISO-8859-1:                              wa_BE.ISO8859-1
+wa_BE.iso885915:                               wa_BE.ISO8859-15
+wa_BE.ISO-8859-15:                             wa_BE.ISO8859-15
+wa_BE.ISO-8859-15@euro:                                wa_BE.ISO8859-15
+wa_BE@euro:                                    wa_BE.ISO8859-15
+xh:                                                    xh_ZA.ISO8859-1
+xh_ZA:                                         xh_ZA.ISO8859-1
+xh_ZA.iso88591:                                xh_ZA.ISO8859-1
+xh_ZA.utf8:                                    xh_ZA.UTF-8
+yi:                                            yi_US.CP1255
+yi_US:                                         yi_US.CP1255
+yi_US.cp1255:                                  yi_US.CP1255
+yi_US.microsoftcp1255:                         yi_US.CP1255
+yi_US.microsoft-cp1255:                                yi_US.CP1255
+yi_US.MICROSOFT-CP1255:                                yi_US.CP1255
+zh_CN:                                         zh_CN.gb2312
+zh_CN.Big5:                                    zh_TW.big5
+zh_CN.EUC:                                     zh_CN.eucCN
+zh_CN.GB2312:                                  zh_CN.gb2312
+zh_CN.GBK:                                     zh_CN.gbk
+zh_CN.GB18030:                                 zh_CN.gb18030
+zh_CN.big5:                                    zh_TW.big5
+zh_CN.euc:                                     zh_CN.eucCN
+zh_CN.utf8:                                    zh_CN.UTF-8
+ZH_CN.UTF-8:                                   zh_CN.UTF-8
+zh_HK:                                         zh_HK.big5hkscs
+zh_HK.BIG5HK:                                  zh_HK.big5hkscs
+zh_HK.Big5hkscs:                               zh_HK.big5hkscs
+zh_HK.Big5-hkscs:                              zh_HK.big5hkscs
+zh_HK.Big5_hkscs:                              zh_HK.big5hkscs
+zh_HK.Big5HKSCS:                               zh_HK.big5hkscs
+zh_HK.BIG5-HKSCS:                              zh_HK.big5hkscs
+zh_HK.BIG5_HKSCS:                              zh_HK.big5hkscs
+zh_HK.Big5:                                    zh_HK.big5
+zh_HK.utf8:                                    zh_HK.UTF-8
+ZH_HK.UTF-8:                                   zh_HK.UTF-8
+ZH_SG.UTF-8:                                   zh_SG.UTF-8
+zh_TW:                                         zh_TW.big5
+zh_TW.Big5:                                    zh_TW.big5
+zh_TW.BIG5:                                    zh_TW.big5
+Zh_TW.big5:                                    zh_TW.big5
+zh_TW.EUC:                                     zh_TW.eucTW
+zh_TW.EUC-TW:                                  zh_TW.eucTW
+zh_TW.utf8:                                    zh_TW.UTF-8
+ZH_TW.UTF-8:                                   zh_TW.UTF-8
+zu:                                                    zu_ZA.ISO8859-1
+zu_ZA:                                         zu_ZA.ISO8859-1
+zu_ZA.iso88591:                                zu_ZA.ISO8859-1
+zu_ZA.utf8:                                    zu_ZA.UTF-8
+
+XCOMM The following locale names are used in SCO 3.0
+english_uk.8859:                               en_GB.ISO8859-1
+english_us.8859:                               en_US.ISO8859-1
+english_us.ascii:                              en_US.ISO8859-1
+french_france.8859:                            fr_FR.ISO8859-1
+german_germany.8859:                           de_DE.ISO8859-1
+portuguese_brazil.8859:                                pt_BR.ISO8859-1
+spanish_spain.8859:                            es_ES.ISO8859-1
+XCOMM The following locale names are used in HPUX 9.x
+american.iso88591:                             en_US.ISO8859-1
+arabic.iso88596:                               ar_AA.ISO8859-6
+bokmal:                                                nb_NO.ISO8859-1
+bokmål:                                                nb_NO.ISO8859-1
+bulgarian:                                     bg_BG.CP1251
+c-french.iso88591:                             fr_CA.ISO8859-1
+catalan:                                       ca_ES.ISO8859-1
+chinese-s:                                     zh_CN.eucCN
+chinese-t:                                     zh_TW.eucTW
+croatian:                                      hr_HR.ISO8859-2
+czech:                                         cs_CZ.ISO8859-2
+danish:                                                da_DK.ISO8859-1
+dansk:                                         da_DK.ISO8859-1
+danish.iso88591:                               da_DK.ISO8859-1
+deutsch:                                       de_DE.ISO8859-1
+dutch:                                         nl_NL.ISO8859-1
+dutch.iso88591:                                        nl_BE.ISO8859-1
+eesti:                                         et_EE.ISO8859-1
+english.iso88591:                              en_EN.ISO8859-1
+estonian:                                      et_EE.ISO8859-1
+finnish:                                       fi_FI.ISO8859-1
+finnish.iso88591:                              fi_FI.ISO8859-1
+français:                                      fr_FR.ISO8859-1
+french:                                                fr_FR.ISO8859-1
+french.iso88591:                               fr_CH.ISO8859-1
+galego:                                                gl_ES.ISO8859-1
+galician:                                      gl_ES.ISO8859-1
+german:                                                de_DE.ISO8859-1
+german.iso88591:                               de_CH.ISO8859-1
+greek:                                         el_GR.ISO8859-7
+greek.iso88597:                                        el_GR.ISO8859-7
+hebrew:                                                iw_IL.ISO8859-8
+hebrew.iso88598:                               iw_IL.ISO8859-8
+hrvatski:                                      hr_HR.ISO8859-2
+hungarian:                                     hu_HU.ISO8859-2
+icelandic.iso88591:                            is_IS.ISO8859-1
+icelandic:                                     is_IS.ISO8859-1
+italian:                                       it_IT.ISO8859-1
+italian.iso88591:                              it_IT.ISO8859-1
+japanese:                                      ja_JP.eucJP
+japanese.euc:                                  ja_JP.eucJP
+japanese.sjis:                                 ja_JP.SJIS
+korean:                                                ko_KR.eucKR
+korean.euc:                                    ko_KR.eucKR
+lithuanian:                                    lt_LT.ISO8859-13
+norwegian:                                     no_NO.ISO8859-1
+norwegian.iso88591:                            no_NO.ISO8859-1
+polish:                                                pl_PL.ISO8859-2
+portuguese:                                    pt_PT.ISO8859-1
+portuguese.iso88591:                           pt_PT.ISO8859-1
+romanian:                                      ro_RO.ISO8859-2
+rumanian:                                      ro_RO.ISO8859-2
+russian:                                       ru_RU.ISO8859-5
+serbocroatian:                                 sr_RS.UTF-8@latin
+sinhala:                                       si_LK.UTF-8
+slovak:                                                sk_SK.ISO8859-2
+slovene:                                       sl_SI.ISO8859-2
+slovenian:                                     sl_SI.ISO8859-2
+spanish:                                       es_ES.ISO8859-1
+spanish.iso88591:                              es_ES.ISO8859-1
+swedish:                                       sv_SE.ISO8859-1
+swedish.iso88591:                              sv_SE.ISO8859-1
+turkish:                                       tr_TR.ISO8859-9
+turkish.iso88599:                              tr_TR.ISO8859-9
+thai:                                          th_TH.ISO8859-11
+univ.utf8:                                     en_US.UTF-8
+XCOMM Digital Unix utf
+universal.utf8@ucs4:                           en_US.UTF-8
+XCOMM Solaris and SunOS have iso_8859_1 and iso_8859_15 LC_CTYPES 
+XCOMM to augment LANG=C
+iso_8859_1:                                    en_US.ISO8859-1
+iso_8859_15:                                   en_US.ISO8859-15
+#ifdef WIN32
+XCOMM Microsoft Windows/NT 4.0 SP3
+XCOMM parser doesn't grok embedded spaces in locale name
+Afrikaans_South Africa.1252:                   af_ZA.iso8859-1
+Arabic_Bahrain.1256:                           ar_BH.iso8859-6
+Arabic_Algeria.1256:                           ar_DZ.iso8859-6
+Arabic_Egypt.1256:                             ar_EG.iso8859-6
+Arabic_Iraq.1256:                              ar_IQ.iso8859-6
+Arabic_Jordan.1256:                            ar_JO.iso8859-6
+Arabic_Kuwait.1256:                            ar_KW.iso8859-6
+Arabic_Lebanon.1256:                           ar_LB.iso8859-6
+Arabic_Libya.1256:                             ar_LY.iso8859-6
+Arabic_Morocco.1256:                           ar_MA.iso8859-6
+Arabic_Oman.1256:                              ar_OM.iso8859-6
+Arabic_Qatar.1256:                             ar_QA.iso8859-6
+Arabic_Saudi Arabia.1256:                      ar_SA.iso8859-6
+Arabic_Tunisia.1256:                           ar_TN.iso8859-6
+Arabic_Yemen.1256:                             ar_YE.iso8859-6
+Belarusian_Belarus.1251:                       be_BY.iso8859-5
+Bulgarian_Bulgaria.1251:                       bg_BG.iso8859-5
+Catalan_Andorra.1252:                          ca_AD.iso8859-1
+Catalan_Spain.1252:                            ca_ES.iso8859-1
+Catalan_France.1252:                           ca_FR.iso8859-1
+Catalan_Italy.1252:                            ca_IT.iso8859-1
+Czech_Czech Republic.1250:                     cs_CZ.iso8859-2
+Danish_Denmark.1252:                           da_DK.iso8859-1
+German_Austria.1252:                           de_AT.iso8859-1
+German_Switzerland.1252:                       de_CH.iso8859-1
+German_Germany.1252:                           de_DE.iso8859-1
+German_Liechtenstein.1252:                     de_LI.iso8859-1
+German_Luxembourg.1252:                                de_LU.iso8859-1
+Greek_Greece.1253:                             el_GR.iso8859-7
+English_Australia.1252:                                en_AU.iso8859-1
+English_Belize.1252:                           en_BZ.iso8859-1
+English_Canada.1252:                           en_CA.iso8859-1
+English_Ireland.1252:                          en_IE.iso8859-1
+English_Jamaica.1252:                          en_JM.iso8859-1
+English_New Zealand.1252:                      en_NZ.iso8859-1
+English_Trinidad y Tobago.1252:                        en_TT.iso8859-1
+English_United Kingdom.1252:                   en_UK.iso8859-1
+English_United States.1252:                    en_US.iso8859-1
+English_South Africa.1252:                     en_ZA.iso8859-1
+Spanish_Argentina.1252:                                es_AR.iso8859-1
+Spanish_Bolivia.1252:                          es_BO.iso8859-1
+Spanish_Chile.1252:                            es_CL.iso8859-1
+Spanish_Colombia.1252:                         es_CO.iso8859-1
+Spanish_Costa Rica.1252:                       es_CR.iso8859-1
+Spanish_Dominican Republic.1252:               es_DO.iso8859-1
+Spanish_Ecuador.1252:                          es_EC.iso8859-1
+Spanish - Modern Sort_Spain.1252:              es_ES.iso8859-1
+Spanish - Traditional Sort_Spain.1252:         es_ES.iso8859-1
+Spanish_Guatemala.1252:                                es_GT.iso8859-1
+Spanish_Honduras.1252:                         es_HN.iso8859-1
+Spanish_Mexican.1252:                          es_MX.iso8859-1
+Spanish_Nicaragua.1252:                                es_NI.iso8859-1
+Spanish_Panama.1252:                           es_PA.iso8859-1
+Spanish_Paraguay.1252:                         es_PY.iso8859-1
+Spanish_Peru.1252:                             es_PE.iso8859-1
+Spanish_Puerto Rico.1252:                      es_PR.iso8859-1
+Spanish_El Salvador.1252:                      es_SV.iso8859-1
+Spanish_Uruguay.1252:                          es_UY.iso8859-1
+Spanish_Venezuela.1252:                                es_VE.iso8859-1
+Estonian_Estonia.1257:                         et_EE.iso8859-13
+Basque_Spain.1252:                             eu_ES.iso8859-1
+Finnish_Finland.1252:                          fi_FI.iso8859-1
+French_Belgium.1252:                           fr_BE.iso8859-1
+French_Canada.1252:                            fr_CA.iso8859-1
+French_Switzerland.1252:                       fr_CH.iso8859-1
+French_France.1252:                            fr_FR.iso8859-1
+French_Luxembourg.1252:                                fr_LU.iso8859-1
+Faeroese_Faeroe Islands.1252:                  fo_FO.iso8859-1
+Hebrew_Israel.1255:                            he_IL.iso8859-8
+Croatian_Croatia.1250:                         hr_HR.iso8859-2
+Hungarian_Hungary.1250:                                hu_HU.iso8859-2
+Indonesian_Indonesia.1252:                     id_ID.iso8859-1
+Icelandic_Iceland.1252:                                is_IS.iso8859-1
+Italian_Switzerland.1252:                      it_CH.iso8859-1
+Italian_Italy.1252:                            it_IT.iso8859-1
+Japanese_Japan.932:                            ja_JP.SJIS
+Korean_Korea.949:                              ko_KR.EUC
+Lithuanian_Lithuania.1257:                     lt_LT.iso8859-13
+Latvian_Latvia.1257:                           lv_LV.iso8859-13
+Dutch_Belgium.1252:                            nl_BE.iso8859-1
+Dutch_Netherlands.1252:                                nl_NL.iso8859-1
+Norwegian (Nynorsk)_Norway.1252:               no_NO.iso8859-1
+Norwegian (Bokmål)_Norway.1252:                        no_NO.iso8859-1
+Polish_Poland.1250:                            pl_PL.iso8859-2
+Portuguese_Brazil.1252:                                pt_BR.iso8859-1
+Portuguese_Portugal.1252:                      pt_PT.iso8859-1
+Romanian_Romania.1250:                         ro_RO.iso8859-2
+Russian_Russia.1251:                           ru_RU.iso8859-5
+Slovak_Slovakia.1250:                          sk_SK.iso8859-2
+Slovene_Slovenia.1250:                         sl_SI.iso8859-2
+Albanian_Albania.1250:                         sq_AL.iso8859-2
+Serbian (Latin)_Serbia.1250:                   sr_RS.UTF-8@latin
+Swedish_Finland.1252:                          sv_FI.iso8859-1
+Swedish_Sweden.1252:                           sv_SE.iso8859-1
+Turkish_Turkey.1254:                           tr_TR.iso8859-9
+Ukrainian_Ukraine.1251:                                uk_UA.iso8859-5
+Chinese(PRC)_People's Republic of China.936:   zh_CN.EUC
+Chinese(PRC)_Hong Kong.950:                    zh_HK.EUC
+Chinese(Singapore)_Signapore.936:              zh_SG.EUC
+Chinese(Taiwan)_Taiwan.950:                    zh_TW.EUC
+#endif
+XCOMM Other miscellaneous locale names
+ISO8859-1:                                     en_US.ISO8859-1
+ISO-8859-1:                                    en_US.ISO8859-1
+#ifndef __uxp__
+japan:                                         ja_JP.eucJP
+#else
+japan:                                         ja_JP.U90
+#endif
+Japanese-EUC:                                  ja_JP.eucJP
diff --git a/nls/locale.dir.pre b/nls/locale.dir.pre
new file mode 100644 (file)
index 0000000..e0d9ef7
--- /dev/null
@@ -0,0 +1,451 @@
+XCOMM
+XCOMM  This file contains locale database file names
+XCOMM  The first word is the locale database file name and
+XCOMM  the second word is the full locale name.
+XCOMM
+XCOMM
+
+C/XLC_LOCALE:                          C
+iso8859-1/XLC_LOCALE:                  af_ZA.ISO8859-1
+iso8859-6/XLC_LOCALE:                  ar_AA.ISO8859-6
+iso8859-6/XLC_LOCALE:                  ar_BH.ISO8859-6
+iso8859-6/XLC_LOCALE:                  ar_DZ.ISO8859-6
+iso8859-6/XLC_LOCALE:                  ar_EG.ISO8859-6
+iso8859-6/XLC_LOCALE:                  ar_IQ.ISO8859-6
+iso8859-6/XLC_LOCALE:                  ar_JO.ISO8859-6
+iso8859-6/XLC_LOCALE:                  ar_KW.ISO8859-6
+iso8859-6/XLC_LOCALE:                  ar_LB.ISO8859-6
+iso8859-6/XLC_LOCALE:                  ar_LY.ISO8859-6
+iso8859-6/XLC_LOCALE:                  ar_MA.ISO8859-6
+iso8859-6/XLC_LOCALE:                  ar_OM.ISO8859-6
+iso8859-6/XLC_LOCALE:                  ar_QA.ISO8859-6
+iso8859-6/XLC_LOCALE:                  ar_SA.ISO8859-6
+iso8859-6/XLC_LOCALE:                  ar_SD.ISO8859-6
+iso8859-6/XLC_LOCALE:                  ar_SY.ISO8859-6
+iso8859-6/XLC_LOCALE:                  ar_TN.ISO8859-6
+iso8859-6/XLC_LOCALE:                  ar_YE.ISO8859-6
+iso8859-9e/XLC_LOCALE:                 az_AZ.ISO8859-9E
+koi8-c/XLC_LOCALE:                     az_AZ.KOI8-C
+iso8859-5/XLC_LOCALE:                  be_BY.ISO8859-5
+microsoft-cp1251/XLC_LOCALE:           be_BY.CP1251
+iso8859-5/XLC_LOCALE:                  bg_BG.ISO8859-5
+microsoft-cp1251/XLC_LOCALE:           bg_BG.CP1251
+koi8-r/XLC_LOCALE:                     bg_BG.KOI8-R
+iso8859-2/XLC_LOCALE:                  bs_BA.ISO8859-2
+iso8859-1/XLC_LOCALE:                  br_FR.ISO8859-1
+iso8859-14/XLC_LOCALE:                 br_FR.ISO8859-14
+iso8859-15/XLC_LOCALE:                 br_FR.ISO8859-15
+iso8859-1/XLC_LOCALE:                  ca_AD.ISO8859-1
+iso8859-15/XLC_LOCALE:                 ca_AD.ISO8859-15
+iso8859-1/XLC_LOCALE:                  ca_ES.ISO8859-1
+iso8859-15/XLC_LOCALE:                 ca_ES.ISO8859-15
+iso8859-1/XLC_LOCALE:                  ca_FR.ISO8859-1
+iso8859-15/XLC_LOCALE:                 ca_FR.ISO8859-15
+iso8859-1/XLC_LOCALE:                  ca_IT.ISO8859-1
+iso8859-15/XLC_LOCALE:                 ca_IT.ISO8859-15
+iso8859-2/XLC_LOCALE:                  cs_CZ.ISO8859-2
+iso8859-1/XLC_LOCALE:                  cy_GB.ISO8859-1
+iso8859-14/XLC_LOCALE:                 cy_GB.ISO8859-14
+iso8859-15/XLC_LOCALE:                 cy_GB.ISO8859-15
+iso8859-2/XLC_LOCALE:                  cz_CZ.ISO8859-2
+iso8859-1/XLC_LOCALE:                  da_DK.ISO8859-1
+iso8859-15/XLC_LOCALE:                 da_DK.ISO8859-15
+iso8859-1/XLC_LOCALE:                  de_AT.ISO8859-1
+iso8859-15/XLC_LOCALE:                 de_AT.ISO8859-15
+iso8859-1/XLC_LOCALE:                  de_BE.ISO8859-1
+iso8859-15/XLC_LOCALE:                 de_BE.ISO8859-15
+iso8859-1/XLC_LOCALE:                  de_CH.ISO8859-1
+iso8859-15/XLC_LOCALE:                 de_CH.ISO8859-15
+iso8859-1/XLC_LOCALE:                  de_DE.ISO8859-1
+iso8859-15/XLC_LOCALE:                 de_DE.ISO8859-15
+iso8859-1/XLC_LOCALE:                  de_LI.ISO8859-1
+iso8859-1/XLC_LOCALE:                  de_LU.ISO8859-1
+iso8859-15/XLC_LOCALE:                 de_LU.ISO8859-15
+iso8859-7/XLC_LOCALE:                  el_GR.ISO8859-7
+iso8859-15/XLC_LOCALE:                 el_GR.ISO8859-15
+iso8859-1/XLC_LOCALE:                  en_AU.ISO8859-1
+iso8859-1/XLC_LOCALE:                  en_BE.ISO8859-1
+iso8859-1/XLC_LOCALE:                  en_BZ.ISO8859-1
+iso8859-1/XLC_LOCALE:                  en_BW.ISO8859-1
+iso8859-1/XLC_LOCALE:                  en_CA.ISO8859-1
+iso8859-1/XLC_LOCALE:                  en_GB.ISO8859-1
+iso8859-15/XLC_LOCALE:                 en_GB.ISO8859-15
+iso8859-1/XLC_LOCALE:                  en_HK.ISO8859-1
+iso8859-1/XLC_LOCALE:                  en_IE.ISO8859-1
+iso8859-15/XLC_LOCALE:                 en_IE.ISO8859-15
+iso8859-15/XLC_LOCALE:                 en_IN.ISO8859-15
+iso8859-1/XLC_LOCALE:                  en_JM.ISO8859-1
+iso8859-1/XLC_LOCALE:                  en_NZ.ISO8859-1
+iso8859-1/XLC_LOCALE:                  en_PH.ISO8859-1
+iso8859-1/XLC_LOCALE:                  en_SG.ISO8859-1
+iso8859-1/XLC_LOCALE:                  en_TT.ISO8859-1
+iso8859-1/XLC_LOCALE:                  en_UK.ISO8859-1
+iso8859-15/XLC_LOCALE:                 en_UK.ISO8859-15
+iso8859-1/XLC_LOCALE:                  en_US.ISO8859-1
+iso8859-15/XLC_LOCALE:                 en_US.ISO8859-15
+iso8859-1/XLC_LOCALE:                  en_ZA.ISO8859-1
+iso8859-15/XLC_LOCALE:                 en_ZA.ISO8859-15
+iso8859-3/XLC_LOCALE:                  eo_EO.ISO8859-3
+iso8859-3/XLC_LOCALE:                  eo_XX.ISO8859-3
+iso8859-1/XLC_LOCALE:                  es_AR.ISO8859-1
+iso8859-1/XLC_LOCALE:                  es_BO.ISO8859-1
+iso8859-1/XLC_LOCALE:                  es_CL.ISO8859-1
+iso8859-1/XLC_LOCALE:                  es_CO.ISO8859-1
+iso8859-1/XLC_LOCALE:                  es_CR.ISO8859-1
+iso8859-1/XLC_LOCALE:                  es_DO.ISO8859-1
+iso8859-1/XLC_LOCALE:                  es_EC.ISO8859-1
+iso8859-1/XLC_LOCALE:                  es_ES.ISO8859-1
+iso8859-15/XLC_LOCALE:                 es_ES.ISO8859-15
+iso8859-1/XLC_LOCALE:                  es_GT.ISO8859-1
+iso8859-1/XLC_LOCALE:                  es_HN.ISO8859-1
+iso8859-1/XLC_LOCALE:                  es_MX.ISO8859-1
+iso8859-1/XLC_LOCALE:                  es_NI.ISO8859-1
+iso8859-1/XLC_LOCALE:                  es_PA.ISO8859-1
+iso8859-1/XLC_LOCALE:                  es_PE.ISO8859-1
+iso8859-1/XLC_LOCALE:                  es_PR.ISO8859-1
+iso8859-1/XLC_LOCALE:                  es_PY.ISO8859-1
+iso8859-1/XLC_LOCALE:                  es_SV.ISO8859-1
+iso8859-1/XLC_LOCALE:                  es_US.ISO8859-1
+iso8859-1/XLC_LOCALE:                  es_UY.ISO8859-1
+iso8859-1/XLC_LOCALE:                  es_VE.ISO8859-1
+iso8859-1/XLC_LOCALE:                  et_EE.ISO8859-1
+iso8859-4/XLC_LOCALE:                  et_EE.ISO8859-4
+iso8859-13/XLC_LOCALE:                         et_EE.ISO8859-13
+iso8859-15/XLC_LOCALE:                 et_EE.ISO8859-15
+iso8859-1/XLC_LOCALE:                  eu_ES.ISO8859-1
+iso8859-15/XLC_LOCALE:                 eu_ES.ISO8859-15
+isiri-3342/XLC_LOCALE:                 fa_IR.ISIRI-3342
+iso8859-1/XLC_LOCALE:                  fi_FI.ISO8859-1
+iso8859-15/XLC_LOCALE:                 fi_FI.ISO8859-15
+iso8859-1/XLC_LOCALE:                  fo_FO.ISO8859-1
+iso8859-15/XLC_LOCALE:                 fo_FO.ISO8859-15
+iso8859-1/XLC_LOCALE:                  fr_BE.ISO8859-1
+iso8859-15/XLC_LOCALE:                 fr_BE.ISO8859-15
+iso8859-1/XLC_LOCALE:                  fr_CA.ISO8859-1
+iso8859-15/XLC_LOCALE:                 fr_CA.ISO8859-15
+iso8859-1/XLC_LOCALE:                  fr_CH.ISO8859-1
+iso8859-15/XLC_LOCALE:                 fr_CH.ISO8859-15
+iso8859-1/XLC_LOCALE:                  fr_FR.ISO8859-1
+iso8859-15/XLC_LOCALE:                 fr_FR.ISO8859-15
+iso8859-1/XLC_LOCALE:                  fr_LU.ISO8859-1
+iso8859-15/XLC_LOCALE:                 fr_LU.ISO8859-15
+iso8859-1/XLC_LOCALE:                  ga_IE.ISO8859-1
+iso8859-14/XLC_LOCALE:                 ga_IE.ISO8859-14
+iso8859-15/XLC_LOCALE:                 ga_IE.ISO8859-15
+iso8859-1/XLC_LOCALE:                  gd_GB.ISO8859-1
+iso8859-14/XLC_LOCALE:                 gd_GB.ISO8859-14
+iso8859-15/XLC_LOCALE:                 gd_GB.ISO8859-15
+iso8859-1/XLC_LOCALE:                  gl_ES.ISO8859-1
+iso8859-15/XLC_LOCALE:                 gl_ES.ISO8859-15
+iso8859-1/XLC_LOCALE:                  gv_GB.ISO8859-1
+iso8859-14/XLC_LOCALE:                 gv_GB.ISO8859-14
+iso8859-15/XLC_LOCALE:                 gv_GB.ISO8859-15
+iso8859-8/XLC_LOCALE:                  he_IL.ISO8859-8
+microsoft-cp1255/XLC_LOCALE:           he_IL.CP1255
+iscii-dev/XLC_LOCALE:                  hi_IN.ISCII-DEV
+iso8859-2/XLC_LOCALE:                  hr_HR.ISO8859-2
+iso8859-2/XLC_LOCALE:                  hu_HU.ISO8859-2
+armscii-8/XLC_LOCALE:                  hy_AM.ARMSCII-8
+iso8859-1/XLC_LOCALE:                  id_ID.ISO8859-1
+iso8859-1/XLC_LOCALE:                  is_IS.ISO8859-1
+iso8859-15/XLC_LOCALE:                 is_IS.ISO8859-15
+iso8859-1/XLC_LOCALE:                  it_CH.ISO8859-1
+iso8859-1/XLC_LOCALE:                  it_IT.ISO8859-1
+iso8859-15/XLC_LOCALE:                 it_IT.ISO8859-15
+ja/XLC_LOCALE:                         ja_JP.eucJP
+ja.SJIS/XLC_LOCALE:                    ja_JP.SJIS
+ja.JIS/XLC_LOCALE:                     ja_JP.JIS7
+georgian-academy/XLC_LOCALE:           ka_GE.GEORGIAN-ACADEMY
+georgian-ps/XLC_LOCALE:                        ka_GE.GEORGIAN-PS
+iso8859-1/XLC_LOCALE:                  kl_GL.ISO8859-1
+ko/XLC_LOCALE:                         ko_KR.eucKR
+iso8859-1/XLC_LOCALE:                  kw_GB.ISO8859-1
+iso8859-14/XLC_LOCALE:                 kw_GB.ISO8859-14
+iso8859-15/XLC_LOCALE:                 kw_GB.ISO8859-15
+ibm-cp1133/XLC_LOCALE:                 lo_LA.IBM-CP1133
+mulelao-1/XLC_LOCALE:                  lo_LA.MULELAO-1
+iso8859-4/XLC_LOCALE:                  lt_LT.ISO8859-4
+iso8859-13/XLC_LOCALE:                 lt_LT.ISO8859-13
+iso8859-4/XLC_LOCALE:                  lv_LV.ISO8859-4
+iso8859-13/XLC_LOCALE:                 lv_LV.ISO8859-13
+iso8859-13/XLC_LOCALE:                 mi_NZ.ISO8859-13
+iso8859-5/XLC_LOCALE:                  mk_MK.ISO8859-5
+microsoft-cp1251/XLC_LOCALE:           mk_MK.CP1251
+iso8859-1/XLC_LOCALE:                  ms_MY.ISO8859-1
+iso8859-3/XLC_LOCALE:                  mt_MT.ISO8859-3
+iso8859-1/XLC_LOCALE:                  nb_NO.ISO8859-1
+iso8859-1/XLC_LOCALE:                  nb_NO.ISO8859-15
+iso8859-1/XLC_LOCALE:                  nl_BE.ISO8859-1
+iso8859-15/XLC_LOCALE:                 nl_BE.ISO8859-15
+iso8859-1/XLC_LOCALE:                  nl_NL.ISO8859-1
+iso8859-15/XLC_LOCALE:                 nl_NL.ISO8859-15
+iso8859-1/XLC_LOCALE:                  nn_NO.ISO8859-1
+iso8859-1/XLC_LOCALE:                  nn_NO.ISO8859-15
+iso8859-1/XLC_LOCALE:                  no_NO.ISO8859-1
+iso8859-1/XLC_LOCALE:                  no_NO.ISO8859-15
+iso8859-1/XLC_LOCALE:                  nr_ZA.ISO8859-1
+iso8859-15/XLC_LOCALE:                 nso_ZA.ISO8859-15
+iso8859-1/XLC_LOCALE:                  ny_NO.ISO8859-1
+iso8859-1/XLC_LOCALE:                  ny_NO.ISO8859-15
+iso8859-1/XLC_LOCALE:                  oc_FR.ISO8859-1
+iso8859-15/XLC_LOCALE:                 oc_FR.ISO8859-15
+iso8859-1/XLC_LOCALE:                  pd_DE.ISO8859-1
+iso8859-1/XLC_LOCALE:                  ph_PH.ISO8859-1
+iso8859-2/XLC_LOCALE:                  pl_PL.ISO8859-2
+iso8859-1/XLC_LOCALE:                  pp_AN.ISO8859-1
+iso8859-1/XLC_LOCALE:                  pt_BR.ISO8859-1
+iso8859-1/XLC_LOCALE:                  pt_PT.ISO8859-1
+iso8859-15/XLC_LOCALE:                 pt_PT.ISO8859-15
+iso8859-2/XLC_LOCALE:                  ro_RO.ISO8859-2
+iso8859-5/XLC_LOCALE:                  ru_RU.ISO8859-5
+microsoft-cp1251/XLC_LOCALE:           ru_RU.CP1251
+koi8-r/XLC_LOCALE:                     ru_RU.KOI8-R
+koi8-u/XLC_LOCALE:                     ru_UA.KOI8-U
+iso8859-1/XLC_LOCALE:           rw_RW.ISO8859-1
+iso8859-2/XLC_LOCALE:                  sh_YU.ISO8859-2
+iso8859-2/XLC_LOCALE:                  sk_SK.ISO8859-2
+iso8859-2/XLC_LOCALE:                  sl_SI.ISO8859-2
+iso8859-2/XLC_LOCALE:                  sq_AL.ISO8859-2
+iso8859-2/XLC_LOCALE:                  sr_CS.ISO8859-2
+iso8859-5/XLC_LOCALE:                  sr_CS.ISO8859-5
+iso8859-2/XLC_LOCALE:                  sr_YU.ISO8859-2
+iso8859-5/XLC_LOCALE:                  sr_YU.ISO8859-5
+microsoft-cp1251/XLC_LOCALE:           sr_YU.CP1251
+iso8859-1/XLC_LOCALE:                  ss_ZA.ISO8859-1
+iso8859-1/XLC_LOCALE:                  st_ZA.ISO8859-1
+iso8859-1/XLC_LOCALE:                  sv_FI.ISO8859-1
+iso8859-15/XLC_LOCALE:                 sv_FI.ISO8859-15
+iso8859-1/XLC_LOCALE:                  sv_SE.ISO8859-1
+iso8859-15/XLC_LOCALE:                 sv_SE.ISO8859-15
+tscii-0/XLC_LOCALE:                    ta_IN.TSCII-0
+koi8-c/XLC_LOCALE:                     tg_TJ.KOI8-C
+th_TH/XLC_LOCALE:                      th_TH.TIS620
+iso8859-11/XLC_LOCALE:                 th_TH.ISO8859-11
+iso8859-1/XLC_LOCALE:                  tl_PH.ISO8859-1
+iso8859-15/XLC_LOCALE:                 tn_ZA.ISO8859-15
+iso8859-9/XLC_LOCALE:                  tr_TR.ISO8859-9
+iso8859-1/XLC_LOCALE:                  ts_ZA.ISO8859-1
+tatar-cyr/XLC_LOCALE:                  tt_RU.TATAR-CYR
+koi8-c/XLC_LOCALE:                     tt_RU.KOI8-C
+iso8859-5/XLC_LOCALE:                  uk_UA.ISO8859-5
+microsoft-cp1251/XLC_LOCALE:           uk_UA.CP1251
+koi8-u/XLC_LOCALE:                     uk_UA.KOI8-U
+microsoft-cp1256/XLC_LOCALE:           ur_PK.CP1256
+vi_VN.tcvn/XLC_LOCALE:                 vi_VN.TCVN
+vi_VN.viscii/XLC_LOCALE:               vi_VN.VISCII
+iso8859-1/XLC_LOCALE:                  wa_BE.ISO8859-1
+iso8859-15/XLC_LOCALE:                 wa_BE.ISO8859-15
+iso8859-1/XLC_LOCALE:                  xh_ZA.ISO8859-1
+microsoft-cp1255/XLC_LOCALE:           yi_US.CP1255
+zh_CN/XLC_LOCALE:                      zh_CN.eucCN
+zh_CN/XLC_LOCALE:                      zh_CN.gb2312
+zh_CN.gbk/XLC_LOCALE:                  zh_CN.gbk
+zh_CN.gb18030/XLC_LOCALE:              zh_CN.gb18030
+zh_HK.big5/XLC_LOCALE:                 zh_HK.big5
+zh_HK.big5hkscs/XLC_LOCALE:            zh_HK.big5-hkscs
+zh_HK.big5hkscs/XLC_LOCALE:            zh_HK.Big5-HKSCS
+zh_HK.big5hkscs/XLC_LOCALE:            zh_HK.big5hkscs
+zh_HK.big5hkscs/XLC_LOCALE:            zh_HK.Big5HKSCS
+zh_TW.big5/XLC_LOCALE:                 zh_TW.big5
+zh_TW/XLC_LOCALE:                      zh_TW.eucTW
+iso8859-1/XLC_LOCALE:                  zu_ZA.ISO8859-1
+XCOMM Note: The UTF-8 locales don't work correctly yet. Work in progress.
+en_US.UTF-8/XLC_LOCALE:                        af_ZA.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        am_ET.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ar_AA.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ar_AE.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ar_BH.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ar_DZ.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ar_EG.UTF-8
+en_US.UTF-8/XLC_LOCALE:                 ar_IN.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ar_IQ.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ar_JO.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ar_KW.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ar_LB.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ar_LY.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ar_MA.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ar_OM.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        bs_BA.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ar_QA.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ar_SA.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ar_SD.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ar_SY.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ar_TN.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ar_YE.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        as_IN.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        az_AZ.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        a3_AZ.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        be_BY.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        bg_BG.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        bn_BD.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        bn_IN.UTF-8
+en_US.UTF-8/XLC_LOCALE:                 bo_IN.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        br_FR.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ca_AD.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ca_ES.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ca_FR.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ca_IT.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        cs_CZ.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        cy_GB.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        cs_CZ.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        da_DK.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        de_AT.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        de_BE.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        de_CH.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        de_DE.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        de_LI.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        de_LU.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        el_CY.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        el_GR.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        en_AU.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        en_BE.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        en_BZ.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        en_CA.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        en_GB.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        en_IE.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        en_JM.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        en_MT.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        en_NZ.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        en_TT.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        en_UK.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        en_US.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        en_ZA.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        eo_EO.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        eo_XX.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        es_AR.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        es_BO.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        es_CL.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        es_CO.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        es_CR.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        es_DO.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        es_EC.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        es_ES.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        es_GT.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        es_HN.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        es_MX.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        es_NI.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        es_PA.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        es_PE.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        es_PR.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        es_PY.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        es_SV.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        es_US.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        es_UY.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        es_VE.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        et_EE.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        eu_ES.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        fa_IR.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        fi_FI.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        fo_FO.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        fr_BE.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        fr_CA.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        fr_CH.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        fr_FR.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        fr_LU.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ga_IE.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        gd_GB.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        gl_ES.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        gu_IN.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        gv_GB.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        he_IL.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        hi_IN.UTF-8
+en_US.UTF-8/XLC_LOCALE:                 hne_IN.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        hr_HR.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        hu_HU.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        hy_AM.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        id_ID.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        is_IS.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        it_CH.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        it_IT.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        iu_CA.UTF-8
+ja_JP.UTF-8/XLC_LOCALE:                        ja_JP.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ka_GE.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        kl_GL.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        kk_KZ.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        kn_IN.UTF-8
+en_US.UTF-8/XLC_LOCALE:                 ks_IN.UTF-8
+en_US.UTF-8/XLC_LOCALE:                 ks_IN@devanagari.UTF-8
+ko_KR.UTF-8/XLC_LOCALE:                        ko_KR.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        kw_GB.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ky_KG.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        lo_LA.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        lt_LT.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        lv_LV.UTF-8
+en_US.UTF-8/XLC_LOCALE:                 mai_IN.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        mi_NZ.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        mk_MK.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ml_IN.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        mr_IN.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ms_MY.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        mt_MT.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        nl_BE.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        nl_NL.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        nb_NO.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        nn_NO.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        no_NO.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        nr_ZA.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        nso_ZA.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ny_NO.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        oc_FR.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        or_IN.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        pa_IN.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        pa_PK.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        pd_DE.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        pd_US.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ph_PH.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        pl_PL.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        pp_AN.UTF-8
+pt_BR.UTF-8/XLC_LOCALE:                        pt_BR.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        pt_PT.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ro_RO.UTF-8
+ru_RU.UTF-8/XLC_LOCALE:                        ru_RU.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ru_UA.UTF-8
+en_US.UTF-8/XLC_LOCALE:                rw_RW.UTF-8
+en_US.UTF-8/XLC_LOCALE:                 sa_IN.UTF-8
+en_US.UTF-8/XLC_LOCALE:                 sd_IN.UTF-8
+en_US.UTF-8/XLC_LOCALE:                 sd_IN@devanagari.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        se_NO.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        sh_BA.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        sh_YU.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        si_LK.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        sk_SK.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        sl_SI.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        sq_AL.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        sr_CS.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        sr_ME.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        sr_RS.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        sr_YU.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ss_ZA.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        st_ZA.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        sv_FI.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        sv_SE.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ta_IN.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        te_IN.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        tg_TJ.UTF-8
+th_TH.UTF-8/XLC_LOCALE:                        th_TH.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ti_ER.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ti_ET.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        tl_PH.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        tn_ZA.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        tr_TR.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ts_ZA.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        tt_RU.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        uk_UA.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ur_IN.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ur_PK.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        uz_UZ.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        ve_ZA.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        vi_VN.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        wa_BE.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        xh_ZA.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        yi_US.UTF-8
+en_US.UTF-8/XLC_LOCALE:                 ne_NP.UTF-8
+zh_CN.UTF-8/XLC_LOCALE:                        zh_CN.UTF-8
+zh_HK.UTF-8/XLC_LOCALE:                        zh_HK.UTF-8
+zh_CN.UTF-8/XLC_LOCALE:                        zh_SG.UTF-8
+zh_TW.UTF-8/XLC_LOCALE:                        zh_TW.UTF-8
+en_US.UTF-8/XLC_LOCALE:                        zu_ZA.UTF-8
+#ifdef __uxp__
+ja.U90/XLC_LOCALE:                     ja_JP.U90
+ja.S90/XLC_LOCALE:                     ja_JP.S90
+#endif
diff --git a/nls/microsoft-cp1251/Compose.pre b/nls/microsoft-cp1251/Compose.pre
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/nls/microsoft-cp1251/XI18N_OBJS b/nls/microsoft-cp1251/XI18N_OBJS
new file mode 100644 (file)
index 0000000..98c5ef5
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for microsoft-cp1251 locale
+#
+XLC    common/xlcDef   _XlcDefaultLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/microsoft-cp1251/XLC_LOCALE.pre b/nls/microsoft-cp1251/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..77b9cd2
--- /dev/null
@@ -0,0 +1,85 @@
+XCOMM  XLocale Database Sample for microsoft-cp1251.
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class 
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         MICROSOFT-CP1251:GL
+               substitute      ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset {
+               name            MICROSOFT-CP1251:GR
+       }
+       font    {
+               primary         MICROSOFT-CP1251:GR
+       }
+}
+END XLC_FONTSET
+
+XCOMM
+XCOMM  XLC_CHARSET_DEFINE category
+XCOMM
+XLC_CHARSET_DEFINE
+csd0   {
+       charset_name    MICROSOFT-CP1251
+       side            GR
+       length          1
+       string_encoding False
+       sequence        \x1b%/1
+}
+END XLC_CHARSET_DEFINE
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          MICROSOFT-CP1251
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+force_convert_to_mb    True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     MICROSOFT-CP1251:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     MICROSOFT-CP1251:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/microsoft-cp1255/Compose.pre b/nls/microsoft-cp1255/Compose.pre
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/nls/microsoft-cp1255/XI18N_OBJS b/nls/microsoft-cp1255/XI18N_OBJS
new file mode 100644 (file)
index 0000000..3d0d9a5
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for microsoft-cp1255 locale
+#
+XLC    common/xlcDef   _XlcDefaultLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/microsoft-cp1255/XLC_LOCALE.pre b/nls/microsoft-cp1255/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..a9bea9c
--- /dev/null
@@ -0,0 +1,85 @@
+XCOMM  XLocale Database Sample for microsoft-cp1255.
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class 
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         MICROSOFT-CP1255:GL
+               substitute      ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset {
+               name            MICROSOFT-CP1255:GR
+       }
+       font    {
+               primary         MICROSOFT-CP1255:GR
+       }
+}
+END XLC_FONTSET
+
+XCOMM
+XCOMM  XLC_CHARSET_DEFINE category
+XCOMM
+XLC_CHARSET_DEFINE
+csd0   {
+       charset_name    MICROSOFT-CP1255
+       side            GR
+       length          1
+       string_encoding False
+       sequence        \x1b%/1
+}
+END XLC_CHARSET_DEFINE
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          MICROSOFT-CP1255
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+force_convert_to_mb    True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     MICROSOFT-CP1255:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     MICROSOFT-CP1255:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/microsoft-cp1256/Compose.pre b/nls/microsoft-cp1256/Compose.pre
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/nls/microsoft-cp1256/XI18N_OBJS b/nls/microsoft-cp1256/XI18N_OBJS
new file mode 100644 (file)
index 0000000..e58719d
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for microsoft-cp1256 locale
+#
+XLC    common/xlcDef   _XlcDefaultLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/microsoft-cp1256/XLC_LOCALE.pre b/nls/microsoft-cp1256/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..7fdb074
--- /dev/null
@@ -0,0 +1,85 @@
+XCOMM  XLocale Database Sample for microsoft-cp1256.
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class 
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         MICROSOFT-CP1256:GL
+               substitute      ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset {
+               name            MICROSOFT-CP1256:GR
+       }
+       font    {
+               primary         MICROSOFT-CP1256:GR
+       }
+}
+END XLC_FONTSET
+
+XCOMM
+XCOMM  XLC_CHARSET_DEFINE category
+XCOMM
+XLC_CHARSET_DEFINE
+csd0   {
+       charset_name    MICROSOFT-CP1256
+       side            GR
+       length          1
+       string_encoding False
+       sequence        \x1b%/1
+}
+END XLC_CHARSET_DEFINE
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          MICROSOFT-CP1256
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+force_convert_to_mb    True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     MICROSOFT-CP1256:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     MICROSOFT-CP1256:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/mulelao-1/Compose.pre b/nls/mulelao-1/Compose.pre
new file mode 100644 (file)
index 0000000..89302cc
--- /dev/null
@@ -0,0 +1,14 @@
+XCOMM
+XCOMM mulelao-1 Compose Sequence
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM
+XCOMM This file currently has no entries.  It appears that a compose file (even
+XCOMM just an empty one) is required for the appropriate keysyms to work for
+XCOMM this encoding.
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+
+XCOMM End of Sequence Definition
diff --git a/nls/mulelao-1/XI18N_OBJS b/nls/mulelao-1/XI18N_OBJS
new file mode 100644 (file)
index 0000000..10d7248
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for mulelao-1 locale
+#
+XLC    common/xlcDef   _XlcDefaultLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/mulelao-1/XLC_LOCALE.pre b/nls/mulelao-1/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..45a6345
--- /dev/null
@@ -0,0 +1,79 @@
+XCOMM  XLocale Database Sample for mulelao-1.
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         MULELAO-1:GL
+               substitute      ISO8859-1:GL
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset         MULELAO-1:GR
+       font            MULELAO-1:GR
+}
+END XLC_FONTSET
+
+XCOMM
+XCOMM  XLC_CHARSET_DEFINE category
+XCOMM
+XLC_CHARSET_DEFINE
+csd0   {
+       charset_name    MULELAO-1
+       side            GR
+       length          1
+       string_encoding False
+       sequence        \x1b%/1
+}
+END XLC_CHARSET_DEFINE
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name           MULELAO-1
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     MULELAO-1:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     MULELAO-1:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/nokhchi-1/Compose.pre b/nls/nokhchi-1/Compose.pre
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/nls/nokhchi-1/XI18N_OBJS b/nls/nokhchi-1/XI18N_OBJS
new file mode 100644 (file)
index 0000000..58b1d01
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for nokhchi-1 locale
+#
+XLC    common/xlcDef   _XlcDefaultLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/nokhchi-1/XLC_LOCALE.pre b/nls/nokhchi-1/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..3038679
--- /dev/null
@@ -0,0 +1,79 @@
+XCOMM  XLocale Database Sample for mulelao-1.
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         NOKHCHI-1:GL 
+               substitute      ISO8859-1:GL
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset         NOKHCHI-1:GR
+       font            NOKHCHI-1:GR
+}
+END XLC_FONTSET
+
+XCOMM
+XCOMM  XLC_CHARSET_DEFINE category
+XCOMM
+XLC_CHARSET_DEFINE
+csd0   {
+       charset_name    NOKHCHI-1
+       side            GR
+       length          1
+       string_encoding False
+       sequence        \x1b%/1
+}
+END XLC_CHARSET_DEFINE
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name           NOKHCHI-1
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     NOKHCHI-1:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     NOKHCHI-1:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/pt_BR.UTF-8/Compose.pre b/nls/pt_BR.UTF-8/Compose.pre
new file mode 100644 (file)
index 0000000..b6d7c8a
--- /dev/null
@@ -0,0 +1,4275 @@
+XCOMM UTF-8 (Unicode) compose sequence
+XCOMM David.Monniaux@ens.fr
+XCOMM
+XCOMM Modified for Brazilian Portuguese by Gustavo Noronha Silva <kov@debian.org>
+
+XCOMM Part 1 - Manual definitions
+
+XCOMM Spacing versions of dead accents
+<dead_tilde> <space>                   : "~"   asciitilde
+<dead_tilde> <dead_tilde>              : "~"   asciitilde
+<dead_acute> <space>                   : "'"   apostrophe
+<dead_acute> <dead_acute>              : "´"  acute
+<dead_grave> <space>                   : "`"   grave
+<dead_grave> <dead_grave>              : "`"   grave
+<dead_circumflex> <space>              : "^"   asciicircum
+<dead_circumflex> <dead_circumflex>    : "^"   asciicircum
+<dead_abovering> <space>               : "°"  degree
+<dead_abovering> <dead_abovering>      : "°"  degree
+<dead_macron> <space>                  : "¯"  macron
+<dead_macron> <dead_macron>            : "¯"  macron
+<dead_breve> <space>                   : "˘"  breve
+<dead_breve> <dead_breve>              : "˘"  breve
+<dead_abovedot> <space>                        : "˙"  abovedot
+<dead_abovedot> <dead_abovedot>                : "˙"  abovedot
+<dead_diaeresis> <dead_diaeresis>      : "¨"  diaeresis
+<dead_diaeresis> <space>               : "\""  quotedbl
+<dead_doubleacute> <space>             : "˝"  U2dd
+<dead_doubleacute> <dead_doubleacute>  : "˝"  U2dd
+<dead_caron> <space>                   : "ˇ"  caron
+<dead_caron> <dead_caron>              : "ˇ"  caron
+<dead_cedilla> <space>                 : "¸"  cedilla
+<dead_cedilla> <dead_cedilla>          : "¸"  cedilla
+<dead_ogonek> <space>                  : "˛"  ogonek
+<dead_ogonek> <dead_ogonek>            : "˛"  ogonek
+<dead_iota> <space>                    : "ͺ"  U37a
+<dead_iota> <dead_iota>                        : "ͺ"  U37a
+
+XCOMM ASCII characters that may be difficult to access
+XCOMM on some keyboards.
+<Multi_key> <plus> <plus>              : "#"   numbersign
+<Multi_key> <apostrophe> <space>       : "'"   apostrophe
+<Multi_key> <space> <apostrophe>       : "'"   apostrophe
+<Multi_key> <A> <T>                    : "@"   at
+<Multi_key> <parenleft> <parenleft>    : "["   bracketleft
+<Multi_key> <slash> <slash>            : "\\"  backslash
+<Multi_key> <slash> <less>             : "\\"  backslash
+<Multi_key> <less> <slash>             : "\\"  backslash
+<Multi_key> <parenright> <parenright>  : "]"   bracketright
+
+<Multi_key> <asciicircum> <space>      : "^"   asciicircum
+<Multi_key> <space> <asciicircum>      : "^"   asciicircum
+<Multi_key> <greater> <space>          : "^"   asciicircum
+<Multi_key> <space> <greater>          : "^"   asciicircum
+
+<Multi_key> <grave> <space>            : "`"   grave
+<Multi_key> <space> <grave>            : "`"   grave
+
+<Multi_key> <parenleft> <minus>                : "{"   braceleft
+<Multi_key> <minus> <parenleft>                : "{"   braceleft
+
+<Multi_key> <slash> <asciicircum>      : "|"   bar
+<Multi_key> <asciicircum> <slash>      : "|"   bar
+<Multi_key> <V> <L>                    : "|"   bar
+<Multi_key> <L> <V>                    : "|"   bar
+<Multi_key> <v> <l>                    : "|"   bar
+<Multi_key> <l> <v>                    : "|"   bar
+
+<Multi_key> <parenright> <minus>       : "}"   braceright
+<Multi_key> <minus> <parenright>       : "}"   braceright
+
+<Multi_key> <asciitilde> <space>       : "~"   asciitilde
+<Multi_key> <space> <asciitilde>       : "~"   asciitilde
+<Multi_key> <minus> <space>            : "~"   asciitilde
+<Multi_key> <space> <minus>            : "~"   asciitilde
+
+XCOMM Spaces
+<Multi_key> <space> <space> : "\240" nobreakspace # NO-BREAK SPACE
+<Multi_key> <space> <period>: " " U2008 # PUNCTUATION SPACE
+
+<Multi_key> <o> <c> : "©" copyright
+<Multi_key> <o> <C> : "©" copyright
+<Multi_key> <O> <c> : "©" copyright
+<Multi_key> <O> <C> : "©" copyright
+
+<Multi_key> <o> <r> : "®" registered
+<Multi_key> <o> <R> : "®" registered
+<Multi_key> <O> <r> : "®" registered
+<Multi_key> <O> <R> : "®" registered
+
+<Multi_key> <period> <greater> : "›" U203a
+<Multi_key> <period> <less> : "‹" U2039
+<Multi_key> <period> <period> : "…" ellipsis
+<Multi_key> <period> <minus> : "·" periodcentered
+<Multi_key> <period> <equal> : "•" enfilledcircbullet
+<Multi_key> <exclam> <asciicircum> : "¦" brokenbar
+<Multi_key> <exclam> <exclam> : "¡" exclamdown
+<Multi_key> <p> <exclam> : "¶" paragraph
+<Multi_key> <P> <exclam> : "¶" paragraph
+<Multi_key> <plus> <minus> : "±" plusminus
+<Multi_key> <question> <question> : "¿" questiondown
+<Multi_key> <e> <e> : "Ə" U018f
+<Multi_key> <minus> <d> : "đ" dstroke
+<Multi_key> <minus> <D> : "Đ" Dstroke
+<Multi_key> <s> <s> : "ß" ssharp
+
+<Multi_key> <o> <e> : "œ" oe
+<Multi_key> <O> <E> : "Œ" OE
+<Multi_key> <a> <e> : "æ" ae
+<Multi_key> <A> <E> : "Æ" AE
+
+<Multi_key> <o> <o> : "°" degree # ^0 already taken
+
+XCOMM Quotation marks
+<Multi_key> <quotedbl> <backslash>     : "〝" U301d # REVERSED DOUBLE PRIME QUOTATION MARK
+<Multi_key> <quotedbl> <slash>         : "〞" U301e # DOUBLE PRIME QUOTATION MARK
+<Multi_key> <less> <less>              : "«" guillemotleft # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+<Multi_key> <greater> <greater>                : "»" guillemotright # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+<Multi_key> <less> <apostrophe>                : "‘" U2018 # LEFT SINGLE QUOTATION MARK
+<Multi_key> <apostrophe> <less>                : "‘" U2018 # LEFT SINGLE QUOTATION MARK
+<Multi_key> <greater> <apostrophe>     : "’" U2019 # RIGHT SINGLE QUOTATION MARK
+<Multi_key> <apostrophe> <greater>     : "’" U2019 # RIGHT SINGLE QUOTATION MARK
+<Multi_key> <comma> <apostrophe>        : "‚" U201a # SINGLE LOW-9 QUOTATION MARK
+<Multi_key> <apostrophe> <comma>        : "‚" U201a # SINGLE LOW-9 QUOTATION MARK
+<Multi_key> <less> <quotedbl>          : "“" U201c # LEFT DOUBLE QUOTATION MARK
+<Multi_key> <quotedbl> <less>          : "“" U201c # LEFT DOUBLE QUOTATION MARK
+<Multi_key> <greater> <quotedbl>       : "”" U201d # RIGHT DOUBLE QUOTATION MARK
+<Multi_key> <quotedbl> <greater>       : "”" U201d # RIGHT DOUBLE QUOTATION MARK
+<Multi_key> <comma> <quotedbl>          : "„" U201e # DOUBLE LOW-9 QUOTATION MARK
+<Multi_key> <quotedbl> <comma>          : "„" U201e # DOUBLE LOW-9 QUOTATION MARK
+
+XCOMM Per xxx
+<Multi_key> <percent> <o>              : "‰" U2030 # PER MILLE SIGN
+
+XCOMM Currencies
+<Multi_key> <C> <E>                    : "₠" U20a0 # EURO-CURRENCY SIGN
+<Multi_key> <C> <slash>                        : "₡" U20a1 # COLON SIGN
+<Multi_key> <slash> <C>                        : "₡" U20a1 # COLON SIGN
+<Multi_key> <C> <r>                    : "₢" U20a2 # CRUZEIRO SIGN
+<Multi_key> <F> <r>                    : "₣" U20a3 # FRENCH FRANC SIGN
+<Multi_key> <L> <equal>                        : "₤" U20a4 # LIRA SIGN
+<Multi_key> <equal> <L>                        : "₤" U20a4 # LIRA SIGN
+<Multi_key> <m> <slash>                        : "₥" U20a5 # MILL SIGN
+<Multi_key> <slash> <m>                        : "₥" U20a5 # MILL SIGN
+<Multi_key> <N> <equal>                        : "₦" U20a6 # NAIRA SIGN
+<Multi_key> <equal> <N>                        : "₦" U20a6 # NAIRA SIGN
+<Multi_key> <P> <t>                    : "₧" U20a7 # PESETA SIGN
+<Multi_key> <R> <s>                    : "₨" U20a8 # RUPEE SIGN
+<Multi_key> <W> <equal>                        : "₩" U20a9 # WON SIGN
+<Multi_key> <equal> <W>                        : "₩" U20a9 # WON SIGN
+XCOMM "₪" U20aa NEW SHEQEL SIGN
+<Multi_key> <d> <minus>                        : "₫" U20ab # DONG SIGN
+<Multi_key> <C> <equal>                        : "€" EuroSign # EURO SIGN
+<Multi_key> <equal> <C>                        : "€" EuroSign # EURO SIGN
+<Multi_key> <c> <equal>                        : "€" EuroSign # EURO SIGN
+<Multi_key> <equal> <c>                        : "€" EuroSign # EURO SIGN
+<Multi_key> <E> <equal>                        : "€" EuroSign # EURO SIGN
+<Multi_key> <equal> <E>                        : "€" EuroSign # EURO SIGN
+<Multi_key> <e> <equal>                        : "€" EuroSign # EURO SIGN
+<Multi_key> <equal> <e>                        : "€" EuroSign # EURO SIGN
+
+<Multi_key> <L> <minus>                : "£" sterling # POUND SIGN
+<Multi_key> <minus> <L>                : "£" sterling # POUND SIGN
+<Multi_key> <Y> <equal>                        : "¥" yen
+<Multi_key> <equal><Y>                 : "¥" yen
+
+XCOMM Long S
+<Multi_key> <f> <s>    : "ſ" U017f # LONG S
+<Multi_key> <f> <S>    : "ſ" U017f # LONG S
+
+XCOMM Dashes
+<Multi_key> <minus> <minus> <period> : "–" U2013 # EN DASH
+<Multi_key> <minus> <minus> <minus>  : "—" U2014 # EM DASH
+
+XCOMM Musical alterations
+<Multi_key> <numbersign> <b>           : "♭" U266d # MUSIC FLAT SIGN
+<Multi_key> <numbersign> <f>           : "♮" U266e # MUSIC NATURAL SIGN
+<Multi_key> <numbersign> <numbersign>  : "♯" U266f # MUSIC SHARP SIGN
+
+XCOMM Other symbols
+<Multi_key> <s> <o>             : "§" section # SECTION SIGN
+<Multi_key> <o> <s>             : "§" section # SECTION SIGN
+
+<Multi_key> <o> <x>            : "¤" currency
+<Multi_key> <x> <o>            : "¤" currency
+
+<Multi_key> <P> <P>            : "¶" paragraph # PILCROW SIGN (PARAGRAPH SIGN)
+
+<Multi_key> <question> <exclam>         : "‽"   U203D # INTERROBANG
+<Multi_key> <exclam> <question>         : "‽"   U203D # INTERROBANG
+
+XCOMM Part 2
+
+XCOMM Compose map for Korean Hangul(Choseongul) Conjoining Jamos  automatically
+XCOMM generated  from UnicodeData-2.0.14.txt at
+XCOMM    ftp://ftp.unicode.org/Public/2.0-Update/UnicodeData-2.0.14.txt
+XCOMM   by Jungshik Shin <jshin@jshin.net>  2002-10-17
+XCOMM There are some conflicts among sequences, but I left them alone.
+XCOMM
+XCOMM group 1: cluster jamos made of three basic jamos
+
+/* The following block gets overridden by later shorter compositions
+  <Multi_key> <U1107> <U1109> <U1100> : "ᄢ"          U1122    : ᄇᅠ ᄉᅠ ᄀᅠ  = ᄢᅠ
+  <Multi_key> <U1107> <U1109> <U1103> : "ᄣ"          U1123    : ᄇᅠ ᄉᅠ ᄃᅠ  = ᄣᅠ
+  <Multi_key> <U1107> <U1109> <U1107> : "ᄤ"          U1124    : ᄇᅠ ᄉᅠ ᄇᅠ  = ᄤᅠ
+  <Multi_key> <U1107> <U1109> <U1109> : "ᄥ"          U1125    : ᄇᅠ ᄉᅠ ᄉᅠ  = ᄥᅠ
+  <Multi_key> <U1107> <U1109> <U110c> : "ᄦ"          U1126    : ᄇᅠ ᄉᅠ ᄌᅠ  = ᄦᅠ
+  <Multi_key> <U1107> <U1107> <U110b> : "ᄬ"          U112c    : ᄇᅠ ᄇᅠ ᄋᅠ  = ᄬᅠ
+  <Multi_key> <U1109> <U1107> <U1100> : "ᄳ"          U1133    : ᄉᅠ ᄇᅠ ᄀᅠ  = ᄳᅠ
+  <Multi_key> <U1109> <U1109> <U1109> : "ᄴ"          U1134    : ᄉᅠ ᄉᅠ ᄉᅠ  = ᄴᅠ
+  <Multi_key> <U1169> <U1161> <U1175> : "ᅫ"          U116b    : ᅟᅩ ᅟᅡ ᅟᅵ  = ᅟᅫ
+  <Multi_key> <U116e> <U1165> <U1175> : "ᅰ"          U1170    : ᅟᅮ ᅟᅥ ᅟᅵ  = ᅟᅰ
+  <Multi_key> <U116e> <U1165> <U1173> : "ᆋ"          U118b    : ᅟᅮ ᅟᅥ ᅟᅳ  = ᅟᆋ
+  <Multi_key> <U11a8> <U11ba> <U11a8> : "ᇄ"          U11c4    : ᅟᅠᆨ ᅟᅠᆺ ᅟᅠᆨ  = ᅟᅠᇄ
+  <Multi_key> <U11af> <U11a8> <U11ba> : "ᇌ"          U11cc    : ᅟᅠᆯ ᅟᅠᆨ ᅟᅠᆺ  = ᅟᅠᇌ
+  <Multi_key> <U11af> <U11ae> <U11c2> : "ᇏ"          U11cf    : ᅟᅠᆯ ᅟᅠᆮ ᅟᅠᇂ  = ᅟᅠᇏ
+  <Multi_key> <U11af> <U11b7> <U11a8> : "ᇑ"          U11d1    : ᅟᅠᆯ ᅟᅠᆷ ᅟᅠᆨ  = ᅟᅠᇑ
+  <Multi_key> <U11af> <U11b7> <U11ba> : "ᇒ"          U11d2    : ᅟᅠᆯ ᅟᅠᆷ ᅟᅠᆺ  = ᅟᅠᇒ
+  <Multi_key> <U11af> <U11b8> <U11ba> : "ᇓ"          U11d3    : ᅟᅠᆯ ᅟᅠᆸ ᅟᅠᆺ  = ᅟᅠᇓ
+  <Multi_key> <U11af> <U11b8> <U11c2> : "ᇔ"          U11d4    : ᅟᅠᆯ ᅟᅠᆸ ᅟᅠᇂ  = ᅟᅠᇔ
+  <Multi_key> <U11af> <U11b8> <U11bc> : "ᇕ"          U11d5    : ᅟᅠᆯ ᅟᅠᆸ ᅟᅠᆼ  = ᅟᅠᇕ
+  <Multi_key> <U11af> <U11ba> <U11ba> : "ᇖ"          U11d6    : ᅟᅠᆯ ᅟᅠᆺ ᅟᅠᆺ  = ᅟᅠᇖ
+  <Multi_key> <U11b7> <U11ba> <U11ba> : "ᇞ"          U11de    : ᅟᅠᆷ ᅟᅠᆺ ᅟᅠᆺ  = ᅟᅠᇞ
+  <Multi_key> <U11bc> <U11a8> <U11a8> : "ᇭ"          U11ed    : ᅟᅠᆼ ᅟᅠᆨ ᅟᅠᆨ  = ᅟᅠᇭ
+ */
+  <Multi_key> <U1100> <U1100> : "ᄁ"          U1101    : ᄀᅠ ᄀᅠ   = ᄁᅠ
+  <Multi_key> <U1103> <U1103> : "ᄄ"          U1104    : ᄃᅠ ᄃᅠ   = ᄄᅠ
+  <Multi_key> <U1107> <U1107> : "ᄈ"          U1108    : ᄇᅠ ᄇᅠ   = ᄈᅠ
+  <Multi_key> <U1109> <U1109> : "ᄊ"          U110a    : ᄉᅠ ᄉᅠ   = ᄊᅠ
+  <Multi_key> <U110c> <U110c> : "ᄍ"          U110d    : ᄌᅠ ᄌᅠ   = ᄍᅠ
+  <Multi_key> <U1102> <U1100> : "ᄓ"          U1113    : ᄂᅠ ᄀᅠ   = ᄓᅠ
+  <Multi_key> <U1102> <U1102> : "ᄔ"          U1114    : ᄂᅠ ᄂᅠ   = ᄔᅠ
+  <Multi_key> <U1102> <U1103> : "ᄕ"          U1115    : ᄂᅠ ᄃᅠ   = ᄕᅠ
+  <Multi_key> <U1102> <U1107> : "ᄖ"          U1116    : ᄂᅠ ᄇᅠ   = ᄖᅠ
+  <Multi_key> <U1103> <U1100> : "ᄗ"          U1117    : ᄃᅠ ᄀᅠ   = ᄗᅠ
+  <Multi_key> <U1105> <U1102> : "ᄘ"          U1118    : ᄅᅠ ᄂᅠ   = ᄘᅠ
+  <Multi_key> <U1105> <U1105> : "ᄙ"          U1119    : ᄅᅠ ᄅᅠ   = ᄙᅠ
+  <Multi_key> <U1105> <U1112> : "ᄚ"          U111a    : ᄅᅠ ᄒᅠ   = ᄚᅠ
+  <Multi_key> <U1105> <U110b> : "ᄛ"          U111b    : ᄅᅠ ᄋᅠ   = ᄛᅠ
+  <Multi_key> <U1106> <U1107> : "ᄜ"          U111c    : ᄆᅠ ᄇᅠ   = ᄜᅠ
+  <Multi_key> <U1106> <U110b> : "ᄝ"          U111d    : ᄆᅠ ᄋᅠ   = ᄝᅠ
+  <Multi_key> <U1107> <U1100> : "ᄞ"          U111e    : ᄇᅠ ᄀᅠ   = ᄞᅠ
+  <Multi_key> <U1107> <U1102> : "ᄟ"          U111f    : ᄇᅠ ᄂᅠ   = ᄟᅠ
+  <Multi_key> <U1107> <U1103> : "ᄠ"          U1120    : ᄇᅠ ᄃᅠ   = ᄠᅠ
+  <Multi_key> <U1107> <U1109> : "ᄡ"          U1121    : ᄇᅠ ᄉᅠ   = ᄡᅠ
+  <Multi_key> <U1107> <U110c> : "ᄧ"          U1127    : ᄇᅠ ᄌᅠ   = ᄧᅠ
+  <Multi_key> <U1107> <U110e> : "ᄨ"          U1128    : ᄇᅠ ᄎᅠ   = ᄨᅠ
+  <Multi_key> <U1107> <U1110> : "ᄩ"          U1129    : ᄇᅠ ᄐᅠ   = ᄩᅠ
+  <Multi_key> <U1107> <U1111> : "ᄪ"          U112a    : ᄇᅠ ᄑᅠ   = ᄪᅠ
+  <Multi_key> <U1107> <U110b> : "ᄫ"          U112b    : ᄇᅠ ᄋᅠ   = ᄫᅠ
+  <Multi_key> <U1109> <U1100> : "ᄭ"          U112d    : ᄉᅠ ᄀᅠ   = ᄭᅠ
+  <Multi_key> <U1109> <U1102> : "ᄮ"          U112e    : ᄉᅠ ᄂᅠ   = ᄮᅠ
+  <Multi_key> <U1109> <U1103> : "ᄯ"          U112f    : ᄉᅠ ᄃᅠ   = ᄯᅠ
+  <Multi_key> <U1109> <U1105> : "ᄰ"          U1130    : ᄉᅠ ᄅᅠ   = ᄰᅠ
+  <Multi_key> <U1109> <U1106> : "ᄱ"          U1131    : ᄉᅠ ᄆᅠ   = ᄱᅠ
+  <Multi_key> <U1109> <U1107> : "ᄲ"          U1132    : ᄉᅠ ᄇᅠ   = ᄲᅠ
+  <Multi_key> <U1109> <U110b> : "ᄵ"          U1135    : ᄉᅠ ᄋᅠ   = ᄵᅠ
+  <Multi_key> <U1109> <U110c> : "ᄶ"          U1136    : ᄉᅠ ᄌᅠ   = ᄶᅠ
+  <Multi_key> <U1109> <U110e> : "ᄷ"          U1137    : ᄉᅠ ᄎᅠ   = ᄷᅠ
+  <Multi_key> <U1109> <U110f> : "ᄸ"          U1138    : ᄉᅠ ᄏᅠ   = ᄸᅠ
+  <Multi_key> <U1109> <U1110> : "ᄹ"          U1139    : ᄉᅠ ᄐᅠ   = ᄹᅠ
+  <Multi_key> <U1109> <U1111> : "ᄺ"          U113a    : ᄉᅠ ᄑᅠ   = ᄺᅠ
+  <Multi_key> <U1109> <U1112> : "ᄻ"          U113b    : ᄉᅠ ᄒᅠ   = ᄻᅠ
+  <Multi_key> <U113c> <U113c> : "ᄽ"          U113d    : ᄼᅠ ᄼᅠ   = ᄽᅠ
+  <Multi_key> <U113e> <U113e> : "ᄿ"          U113f    : ᄾᅠ ᄾᅠ   = ᄿᅠ
+  <Multi_key> <U110b> <U1100> : "ᅁ"          U1141    : ᄋᅠ ᄀᅠ   = ᅁᅠ
+  <Multi_key> <U110b> <U1103> : "ᅂ"          U1142    : ᄋᅠ ᄃᅠ   = ᅂᅠ
+  <Multi_key> <U110b> <U1106> : "ᅃ"          U1143    : ᄋᅠ ᄆᅠ   = ᅃᅠ
+  <Multi_key> <U110b> <U1107> : "ᅄ"          U1144    : ᄋᅠ ᄇᅠ   = ᅄᅠ
+  <Multi_key> <U110b> <U1109> : "ᅅ"          U1145    : ᄋᅠ ᄉᅠ   = ᅅᅠ
+  <Multi_key> <U110b> <U1140> : "ᅆ"          U1146    : ᄋᅠ ᅀᅠ   = ᅆᅠ
+  <Multi_key> <U110b> <U110b> : "ᅇ"          U1147    : ᄋᅠ ᄋᅠ   = ᅇᅠ
+  <Multi_key> <U110b> <U110c> : "ᅈ"          U1148    : ᄋᅠ ᄌᅠ   = ᅈᅠ
+  <Multi_key> <U110b> <U110e> : "ᅉ"          U1149    : ᄋᅠ ᄎᅠ   = ᅉᅠ
+  <Multi_key> <U110b> <U1110> : "ᅊ"          U114a    : ᄋᅠ ᄐᅠ   = ᅊᅠ
+  <Multi_key> <U110b> <U1111> : "ᅋ"          U114b    : ᄋᅠ ᄑᅠ   = ᅋᅠ
+  <Multi_key> <U110c> <U110b> : "ᅍ"          U114d    : ᄌᅠ ᄋᅠ   = ᅍᅠ
+  <Multi_key> <U114e> <U114e> : "ᅏ"          U114f    : ᅎᅠ ᅎᅠ   = ᅏᅠ
+  <Multi_key> <U1150> <U1150> : "ᅑ"          U1151    : ᅐᅠ ᅐᅠ   = ᅑᅠ
+  <Multi_key> <U110e> <U110f> : "ᅒ"          U1152    : ᄎᅠ ᄏᅠ   = ᅒᅠ
+  <Multi_key> <U110e> <U1112> : "ᅓ"          U1153    : ᄎᅠ ᄒᅠ   = ᅓᅠ
+  <Multi_key> <U1111> <U1107> : "ᅖ"          U1156    : ᄑᅠ ᄇᅠ   = ᅖᅠ
+  <Multi_key> <U1111> <U110b> : "ᅗ"          U1157    : ᄑᅠ ᄋᅠ   = ᅗᅠ
+  <Multi_key> <U1112> <U1112> : "ᅘ"          U1158    : ᄒᅠ ᄒᅠ   = ᅘᅠ
+  <Multi_key> <U1161> <U1175> : "ᅢ"          U1162    : ᅟᅡ ᅟᅵ   = ᅟᅢ
+  <Multi_key> <U1163> <U1175> : "ᅤ"          U1164    : ᅟᅣ ᅟᅵ   = ᅟᅤ
+  <Multi_key> <U1165> <U1175> : "ᅦ"          U1166    : ᅟᅥ ᅟᅵ   = ᅟᅦ
+  <Multi_key> <U1167> <U1175> : "ᅨ"          U1168    : ᅟᅧ ᅟᅵ   = ᅟᅨ
+  <Multi_key> <U1169> <U1161> : "ᅪ"          U116a    : ᅟᅩ ᅟᅡ   = ᅟᅪ
+  <Multi_key> <U1169> <U1175> : "ᅬ"          U116c    : ᅟᅩ ᅟᅵ   = ᅟᅬ
+  <Multi_key> <U116e> <U1165> : "ᅯ"          U116f    : ᅟᅮ ᅟᅥ   = ᅟᅯ
+  <Multi_key> <U116e> <U1175> : "ᅱ"          U1171    : ᅟᅮ ᅟᅵ   = ᅟᅱ
+  <Multi_key> <U1173> <U1175> : "ᅴ"          U1174    : ᅟᅳ ᅟᅵ   = ᅟᅴ
+  <Multi_key> <U1161> <U1169> : "ᅶ"          U1176    : ᅟᅡ ᅟᅩ   = ᅟᅶ
+  <Multi_key> <U1161> <U116e> : "ᅷ"          U1177    : ᅟᅡ ᅟᅮ   = ᅟᅷ
+  <Multi_key> <U1163> <U1169> : "ᅸ"          U1178    : ᅟᅣ ᅟᅩ   = ᅟᅸ
+  <Multi_key> <U1163> <U116d> : "ᅹ"          U1179    : ᅟᅣ ᅟᅭ   = ᅟᅹ
+  <Multi_key> <U1165> <U1169> : "ᅺ"          U117a    : ᅟᅥ ᅟᅩ   = ᅟᅺ
+  <Multi_key> <U1165> <U116e> : "ᅻ"          U117b    : ᅟᅥ ᅟᅮ   = ᅟᅻ
+  <Multi_key> <U1165> <U1173> : "ᅼ"          U117c    : ᅟᅥ ᅟᅳ   = ᅟᅼ
+  <Multi_key> <U1167> <U1169> : "ᅽ"          U117d    : ᅟᅧ ᅟᅩ   = ᅟᅽ
+  <Multi_key> <U1167> <U116e> : "ᅾ"          U117e    : ᅟᅧ ᅟᅮ   = ᅟᅾ
+  <Multi_key> <U1169> <U1165> : "ᅿ"          U117f    : ᅟᅩ ᅟᅥ   = ᅟᅿ
+  <Multi_key> <U1169> <U1166> : "ᆀ"          U1180    : ᅟᅩ ᅟᅦ   = ᅟᆀ
+  <Multi_key> <U1169> <U1168> : "ᆁ"          U1181    : ᅟᅩ ᅟᅨ   = ᅟᆁ
+  <Multi_key> <U1169> <U1169> : "ᆂ"          U1182    : ᅟᅩ ᅟᅩ   = ᅟᆂ
+  <Multi_key> <U1169> <U116e> : "ᆃ"          U1183    : ᅟᅩ ᅟᅮ   = ᅟᆃ
+  <Multi_key> <U116d> <U1163> : "ᆄ"          U1184    : ᅟᅭ ᅟᅣ   = ᅟᆄ
+  <Multi_key> <U116d> <U1164> : "ᆅ"          U1185    : ᅟᅭ ᅟᅤ   = ᅟᆅ
+  <Multi_key> <U116d> <U1167> : "ᆆ"          U1186    : ᅟᅭ ᅟᅧ   = ᅟᆆ
+  <Multi_key> <U116d> <U1169> : "ᆇ"          U1187    : ᅟᅭ ᅟᅩ   = ᅟᆇ
+  <Multi_key> <U116d> <U1175> : "ᆈ"          U1188    : ᅟᅭ ᅟᅵ   = ᅟᆈ
+  <Multi_key> <U116e> <U1161> : "ᆉ"          U1189    : ᅟᅮ ᅟᅡ   = ᅟᆉ
+  <Multi_key> <U116e> <U1162> : "ᆊ"          U118a    : ᅟᅮ ᅟᅢ   = ᅟᆊ
+  <Multi_key> <U116e> <U1168> : "ᆌ"          U118c    : ᅟᅮ ᅟᅨ   = ᅟᆌ
+  <Multi_key> <U116e> <U116e> : "ᆍ"          U118d    : ᅟᅮ ᅟᅮ   = ᅟᆍ
+  <Multi_key> <U1172> <U1161> : "ᆎ"          U118e    : ᅟᅲ ᅟᅡ   = ᅟᆎ
+  <Multi_key> <U1172> <U1165> : "ᆏ"          U118f    : ᅟᅲ ᅟᅥ   = ᅟᆏ
+  <Multi_key> <U1172> <U1166> : "ᆐ"          U1190    : ᅟᅲ ᅟᅦ   = ᅟᆐ
+  <Multi_key> <U1172> <U1167> : "ᆑ"          U1191    : ᅟᅲ ᅟᅧ   = ᅟᆑ
+  <Multi_key> <U1172> <U1168> : "ᆒ"          U1192    : ᅟᅲ ᅟᅨ   = ᅟᆒ
+  <Multi_key> <U1172> <U116e> : "ᆓ"          U1193    : ᅟᅲ ᅟᅮ   = ᅟᆓ
+  <Multi_key> <U1172> <U1175> : "ᆔ"          U1194    : ᅟᅲ ᅟᅵ   = ᅟᆔ
+  <Multi_key> <U1173> <U116e> : "ᆕ"          U1195    : ᅟᅳ ᅟᅮ   = ᅟᆕ
+  <Multi_key> <U1173> <U1173> : "ᆖ"          U1196    : ᅟᅳ ᅟᅳ   = ᅟᆖ
+  <Multi_key> <U1174> <U116e> : "ᆗ"          U1197    : ᅟᅴ ᅟᅮ   = ᅟᆗ
+  <Multi_key> <U1175> <U1161> : "ᆘ"          U1198    : ᅟᅵ ᅟᅡ   = ᅟᆘ
+  <Multi_key> <U1175> <U1163> : "ᆙ"          U1199    : ᅟᅵ ᅟᅣ   = ᅟᆙ
+  <Multi_key> <U1175> <U1169> : "ᆚ"          U119a    : ᅟᅵ ᅟᅩ   = ᅟᆚ
+  <Multi_key> <U1175> <U116e> : "ᆛ"          U119b    : ᅟᅵ ᅟᅮ   = ᅟᆛ
+  <Multi_key> <U1175> <U1173> : "ᆜ"          U119c    : ᅟᅵ ᅟᅳ   = ᅟᆜ
+  <Multi_key> <U1175> <U119e> : "ᆝ"          U119d    : ᅟᅵ ᅟᆞ   = ᅟᆝ
+  <Multi_key> <U119e> <U1165> : "ᆟ"          U119f    : ᅟᆞ ᅟᅥ   = ᅟᆟ
+  <Multi_key> <U119e> <U116e> : "ᆠ"          U11a0    : ᅟᆞ ᅟᅮ   = ᅟᆠ
+  <Multi_key> <U119e> <U1175> : "ᆡ"          U11a1    : ᅟᆞ ᅟᅵ   = ᅟᆡ
+  <Multi_key> <U119e> <U119e> : "ᆢ"          U11a2    : ᅟᆞ ᅟᆞ   = ᅟᆢ
+  <Multi_key> <U11a8> <U11a8> : "ᆩ"          U11a9    : ᅟᅠᆨ ᅟᅠᆨ   = ᅟᅠᆩ
+  <Multi_key> <U11a8> <U11ba> : "ᆪ"          U11aa    : ᅟᅠᆨ ᅟᅠᆺ   = ᅟᅠᆪ
+  <Multi_key> <U11ab> <U11bd> : "ᆬ"          U11ac    : ᅟᅠᆫ ᅟᅠᆽ   = ᅟᅠᆬ
+  <Multi_key> <U11ab> <U11c2> : "ᆭ"          U11ad    : ᅟᅠᆫ ᅟᅠᇂ   = ᅟᅠᆭ
+  <Multi_key> <U11af> <U11a8> : "ᆰ"          U11b0    : ᅟᅠᆯ ᅟᅠᆨ   = ᅟᅠᆰ
+  <Multi_key> <U11af> <U11b7> : "ᆱ"          U11b1    : ᅟᅠᆯ ᅟᅠᆷ   = ᅟᅠᆱ
+  <Multi_key> <U11af> <U11b8> : "ᆲ"          U11b2    : ᅟᅠᆯ ᅟᅠᆸ   = ᅟᅠᆲ
+  <Multi_key> <U11af> <U11ba> : "ᆳ"          U11b3    : ᅟᅠᆯ ᅟᅠᆺ   = ᅟᅠᆳ
+  <Multi_key> <U11af> <U11c0> : "ᆴ"          U11b4    : ᅟᅠᆯ ᅟᅠᇀ   = ᅟᅠᆴ
+  <Multi_key> <U11af> <U11c1> : "ᆵ"          U11b5    : ᅟᅠᆯ ᅟᅠᇁ   = ᅟᅠᆵ
+  <Multi_key> <U11af> <U11c2> : "ᆶ"          U11b6    : ᅟᅠᆯ ᅟᅠᇂ   = ᅟᅠᆶ
+  <Multi_key> <U11b8> <U11ba> : "ᆹ"          U11b9    : ᅟᅠᆸ ᅟᅠᆺ   = ᅟᅠᆹ
+  <Multi_key> <U11ba> <U11ba> : "ᆻ"          U11bb    : ᅟᅠᆺ ᅟᅠᆺ   = ᅟᅠᆻ
+  <Multi_key> <U11a8> <U11af> : "ᇃ"          U11c3    : ᅟᅠᆨ ᅟᅠᆯ   = ᅟᅠᇃ
+  <Multi_key> <U11ab> <U11a8> : "ᇅ"          U11c5    : ᅟᅠᆫ ᅟᅠᆨ   = ᅟᅠᇅ
+  <Multi_key> <U11ab> <U11ae> : "ᇆ"          U11c6    : ᅟᅠᆫ ᅟᅠᆮ   = ᅟᅠᇆ
+  <Multi_key> <U11ab> <U11ba> : "ᇇ"          U11c7    : ᅟᅠᆫ ᅟᅠᆺ   = ᅟᅠᇇ
+  <Multi_key> <U11ab> <U11eb> : "ᇈ"          U11c8    : ᅟᅠᆫ ᅟᅠᇫ   = ᅟᅠᇈ
+  <Multi_key> <U11ab> <U11c0> : "ᇉ"          U11c9    : ᅟᅠᆫ ᅟᅠᇀ   = ᅟᅠᇉ
+  <Multi_key> <U11ae> <U11a8> : "ᇊ"          U11ca    : ᅟᅠᆮ ᅟᅠᆨ   = ᅟᅠᇊ
+  <Multi_key> <U11ae> <U11af> : "ᇋ"          U11cb    : ᅟᅠᆮ ᅟᅠᆯ   = ᅟᅠᇋ
+  <Multi_key> <U11af> <U11ab> : "ᇍ"          U11cd    : ᅟᅠᆯ ᅟᅠᆫ   = ᅟᅠᇍ
+  <Multi_key> <U11af> <U11ae> : "ᇎ"          U11ce    : ᅟᅠᆯ ᅟᅠᆮ   = ᅟᅠᇎ
+  <Multi_key> <U11af> <U11af> : "ᇐ"          U11d0    : ᅟᅠᆯ ᅟᅠᆯ   = ᅟᅠᇐ
+  <Multi_key> <U11af> <U11eb> : "ᇗ"          U11d7    : ᅟᅠᆯ ᅟᅠᇫ   = ᅟᅠᇗ
+  <Multi_key> <U11af> <U11bf> : "ᇘ"          U11d8    : ᅟᅠᆯ ᅟᅠᆿ   = ᅟᅠᇘ
+  <Multi_key> <U11af> <U11f9> : "ᇙ"          U11d9    : ᅟᅠᆯ ᅟᅠᇹ   = ᅟᅠᇙ
+  <Multi_key> <U11b7> <U11a8> : "ᇚ"          U11da    : ᅟᅠᆷ ᅟᅠᆨ   = ᅟᅠᇚ
+  <Multi_key> <U11b7> <U11af> : "ᇛ"          U11db    : ᅟᅠᆷ ᅟᅠᆯ   = ᅟᅠᇛ
+  <Multi_key> <U11b7> <U11b8> : "ᇜ"          U11dc    : ᅟᅠᆷ ᅟᅠᆸ   = ᅟᅠᇜ
+  <Multi_key> <U11b7> <U11ba> : "ᇝ"          U11dd    : ᅟᅠᆷ ᅟᅠᆺ   = ᅟᅠᇝ
+  <Multi_key> <U11b7> <U11eb> : "ᇟ"          U11df    : ᅟᅠᆷ ᅟᅠᇫ   = ᅟᅠᇟ
+  <Multi_key> <U11b7> <U11be> : "ᇠ"          U11e0    : ᅟᅠᆷ ᅟᅠᆾ   = ᅟᅠᇠ
+  <Multi_key> <U11b7> <U11c2> : "ᇡ"          U11e1    : ᅟᅠᆷ ᅟᅠᇂ   = ᅟᅠᇡ
+  <Multi_key> <U11b7> <U11bc> : "ᇢ"          U11e2    : ᅟᅠᆷ ᅟᅠᆼ   = ᅟᅠᇢ
+  <Multi_key> <U11b8> <U11af> : "ᇣ"          U11e3    : ᅟᅠᆸ ᅟᅠᆯ   = ᅟᅠᇣ
+  <Multi_key> <U11b8> <U11c1> : "ᇤ"          U11e4    : ᅟᅠᆸ ᅟᅠᇁ   = ᅟᅠᇤ
+  <Multi_key> <U11b8> <U11c2> : "ᇥ"          U11e5    : ᅟᅠᆸ ᅟᅠᇂ   = ᅟᅠᇥ
+  <Multi_key> <U11b8> <U11bc> : "ᇦ"          U11e6    : ᅟᅠᆸ ᅟᅠᆼ   = ᅟᅠᇦ
+  <Multi_key> <U11ba> <U11a8> : "ᇧ"          U11e7    : ᅟᅠᆺ ᅟᅠᆨ   = ᅟᅠᇧ
+  <Multi_key> <U11ba> <U11ae> : "ᇨ"          U11e8    : ᅟᅠᆺ ᅟᅠᆮ   = ᅟᅠᇨ
+  <Multi_key> <U11ba> <U11af> : "ᇩ"          U11e9    : ᅟᅠᆺ ᅟᅠᆯ   = ᅟᅠᇩ
+  <Multi_key> <U11ba> <U11b8> : "ᇪ"          U11ea    : ᅟᅠᆺ ᅟᅠᆸ   = ᅟᅠᇪ
+  <Multi_key> <U11bc> <U11a8> : "ᇬ"          U11ec    : ᅟᅠᆼ ᅟᅠᆨ   = ᅟᅠᇬ
+  <Multi_key> <U11bc> <U11bc> : "ᇮ"          U11ee    : ᅟᅠᆼ ᅟᅠᆼ   = ᅟᅠᇮ
+  <Multi_key> <U11bc> <U11bf> : "ᇯ"          U11ef    : ᅟᅠᆼ ᅟᅠᆿ   = ᅟᅠᇯ
+  <Multi_key> <U11f0> <U11ba> : "ᇱ"          U11f1    : ᅟᅠᇰ ᅟᅠᆺ   = ᅟᅠᇱ
+  <Multi_key> <U11f0> <U11eb> : "ᇲ"          U11f2    : ᅟᅠᇰ ᅟᅠᇫ   = ᅟᅠᇲ
+  <Multi_key> <U11c1> <U11b8> : "ᇳ"          U11f3    : ᅟᅠᇁ ᅟᅠᆸ   = ᅟᅠᇳ
+  <Multi_key> <U11c1> <U11bc> : "ᇴ"          U11f4    : ᅟᅠᇁ ᅟᅠᆼ   = ᅟᅠᇴ
+  <Multi_key> <U11c2> <U11ab> : "ᇵ"          U11f5    : ᅟᅠᇂ ᅟᅠᆫ   = ᅟᅠᇵ
+  <Multi_key> <U11c2> <U11af> : "ᇶ"          U11f6    : ᅟᅠᇂ ᅟᅠᆯ   = ᅟᅠᇶ
+  <Multi_key> <U11c2> <U11b7> : "ᇷ"          U11f7    : ᅟᅠᇂ ᅟᅠᆷ   = ᅟᅠᇷ
+  <Multi_key> <U11c2> <U11b8> : "ᇸ"          U11f8    : ᅟᅠᇂ ᅟᅠᆸ   = ᅟᅠᇸ
+  <Multi_key> <U1121> <U1100> : "ᄢ"          U1122    : ᄡᅠ ᄀᅠ   = ᄢᅠ
+  <Multi_key> <U1121> <U1103> : "ᄣ"          U1123    : ᄡᅠ ᄃᅠ   = ᄣᅠ
+  <Multi_key> <U1121> <U1107> : "ᄤ"          U1124    : ᄡᅠ ᄇᅠ   = ᄤᅠ
+  <Multi_key> <U1121> <U1109> : "ᄥ"          U1125    : ᄡᅠ ᄉᅠ   = ᄥᅠ
+  <Multi_key> <U1121> <U110c> : "ᄦ"          U1126    : ᄡᅠ ᄌᅠ   = ᄦᅠ
+  <Multi_key> <U1108> <U110b> : "ᄬ"          U112c    : ᄈᅠ ᄋᅠ   = ᄬᅠ
+  <Multi_key> <U1132> <U1100> : "ᄳ"          U1133    : ᄲᅠ ᄀᅠ   = ᄳᅠ
+  <Multi_key> <U110a> <U1109> : "ᄴ"          U1134    : ᄊᅠ ᄉᅠ   = ᄴᅠ
+  <Multi_key> <U116a> <U1175> : "ᅫ"          U116b    : ᅟᅪ ᅟᅵ   = ᅟᅫ
+  <Multi_key> <U116f> <U1175> : "ᅰ"          U1170    : ᅟᅯ ᅟᅵ   = ᅟᅰ
+  <Multi_key> <U116f> <U1173> : "ᆋ"          U118b    : ᅟᅯ ᅟᅳ   = ᅟᆋ
+  <Multi_key> <U11aa> <U11a8> : "ᇄ"          U11c4    : ᅟᅠᆪ ᅟᅠᆨ   = ᅟᅠᇄ
+  <Multi_key> <U11b0> <U11ba> : "ᇌ"          U11cc    : ᅟᅠᆰ ᅟᅠᆺ   = ᅟᅠᇌ
+  <Multi_key> <U11ce> <U11c2> : "ᇏ"          U11cf    : ᅟᅠᇎ ᅟᅠᇂ   = ᅟᅠᇏ
+  <Multi_key> <U11b1> <U11a8> : "ᇑ"          U11d1    : ᅟᅠᆱ ᅟᅠᆨ   = ᅟᅠᇑ
+  <Multi_key> <U11b1> <U11ba> : "ᇒ"          U11d2    : ᅟᅠᆱ ᅟᅠᆺ   = ᅟᅠᇒ
+  <Multi_key> <U11b2> <U11ba> : "ᇓ"          U11d3    : ᅟᅠᆲ ᅟᅠᆺ   = ᅟᅠᇓ
+  <Multi_key> <U11b2> <U11c2> : "ᇔ"          U11d4    : ᅟᅠᆲ ᅟᅠᇂ   = ᅟᅠᇔ
+  <Multi_key> <U11b2> <U11bc> : "ᇕ"          U11d5    : ᅟᅠᆲ ᅟᅠᆼ   = ᅟᅠᇕ
+  <Multi_key> <U11b3> <U11ba> : "ᇖ"          U11d6    : ᅟᅠᆳ ᅟᅠᆺ   = ᅟᅠᇖ
+  <Multi_key> <U11dd> <U11ba> : "ᇞ"          U11de    : ᅟᅠᇝ ᅟᅠᆺ   = ᅟᅠᇞ
+  <Multi_key> <U11ec> <U11a8> : "ᇭ"          U11ed    : ᅟᅠᇬ ᅟᅠᆨ   = ᅟᅠᇭ
+  <Multi_key> <U1107> <U112d> : "ᄢ"          U1122    : ᄇᅠ ᄭᅠ   = ᄢᅠ
+  <Multi_key> <U1107> <U112f> : "ᄣ"          U1123    : ᄇᅠ ᄯᅠ   = ᄣᅠ
+  <Multi_key> <U1107> <U1132> : "ᄤ"          U1124    : ᄇᅠ ᄲᅠ   = ᄤᅠ
+  <Multi_key> <U1107> <U110a> : "ᄥ"          U1125    : ᄇᅠ ᄊᅠ   = ᄥᅠ
+  <Multi_key> <U1107> <U1136> : "ᄦ"          U1126    : ᄇᅠ ᄶᅠ   = ᄦᅠ
+  <Multi_key> <U1107> <U112b> : "ᄬ"          U112c    : ᄇᅠ ᄫᅠ   = ᄬᅠ
+  <Multi_key> <U1109> <U111e> : "ᄳ"          U1133    : ᄉᅠ ᄞᅠ   = ᄳᅠ
+  <Multi_key> <U1109> <U110a> : "ᄴ"          U1134    : ᄉᅠ ᄊᅠ   = ᄴᅠ
+  <Multi_key> <U1169> <U1162> : "ᅫ"          U116b    : ᅟᅩ ᅟᅢ   = ᅟᅫ
+  <Multi_key> <U116e> <U1166> : "ᅰ"          U1170    : ᅟᅮ ᅟᅦ   = ᅟᅰ
+  <Multi_key> <U116e> <U117c> : "ᆋ"          U118b    : ᅟᅮ ᅟᅼ   = ᅟᆋ
+  <Multi_key> <U11a8> <U11e7> : "ᇄ"          U11c4    : ᅟᅠᆨ ᅟᅠᇧ   = ᅟᅠᇄ
+  <Multi_key> <U11af> <U11aa> : "ᇌ"          U11cc    : ᅟᅠᆯ ᅟᅠᆪ   = ᅟᅠᇌ
+  <Multi_key> <U11af> <U11da> : "ᇑ"          U11d1    : ᅟᅠᆯ ᅟᅠᇚ   = ᅟᅠᇑ
+  <Multi_key> <U11af> <U11dd> : "ᇒ"          U11d2    : ᅟᅠᆯ ᅟᅠᇝ   = ᅟᅠᇒ
+  <Multi_key> <U11af> <U11b9> : "ᇓ"          U11d3    : ᅟᅠᆯ ᅟᅠᆹ   = ᅟᅠᇓ
+  <Multi_key> <U11af> <U11e5> : "ᇔ"          U11d4    : ᅟᅠᆯ ᅟᅠᇥ   = ᅟᅠᇔ
+  <Multi_key> <U11af> <U11e6> : "ᇕ"          U11d5    : ᅟᅠᆯ ᅟᅠᇦ   = ᅟᅠᇕ
+  <Multi_key> <U11af> <U11bb> : "ᇖ"          U11d6    : ᅟᅠᆯ ᅟᅠᆻ   = ᅟᅠᇖ
+  <Multi_key> <U11b7> <U11bb> : "ᇞ"          U11de    : ᅟᅠᆷ ᅟᅠᆻ   = ᅟᅠᇞ
+  <Multi_key> <U11bc> <U11a9> : "ᇭ"          U11ed    : ᅟᅠᆼ ᅟᅠᆩ   = ᅟᅠᇭ
+
+<dead_circumflex> <Multi_key> <underscore> <a> : "ª" ordfeminine # FEMININE ORDINAL INDICATOR
+<Multi_key> <asciicircum> <underscore> <a>     : "ª" ordfeminine # FEMININE ORDINAL INDICATOR
+<dead_circumflex> <Multi_key> <underbar> <a>   : "ª" ordfeminine # FEMININE ORDINAL INDICATOR
+<Multi_key> <asciicircum> <underbar> <a>       : "ª" ordfeminine # FEMININE ORDINAL INDICATOR
+<dead_circumflex> <2>  : "²" twosuperior # SUPERSCRIPT TWO
+<Multi_key> <asciicircum> <2>  : "²" twosuperior # SUPERSCRIPT TWO
+<dead_circumflex> <KP_Space>   : "²" twosuperior # SUPERSCRIPT TWO
+<Multi_key> <asciicircum> <KP_Space>   : "²" twosuperior # SUPERSCRIPT TWO
+<dead_circumflex> <KP_2>       : "²" twosuperior # SUPERSCRIPT TWO
+<Multi_key> <asciicircum> <KP_2>       : "²" twosuperior # SUPERSCRIPT TWO
+<dead_circumflex> <3>  : "³" threesuperior # SUPERSCRIPT THREE
+<Multi_key> <asciicircum> <3>  : "³" threesuperior # SUPERSCRIPT THREE
+<dead_circumflex> <KP_3>       : "³" threesuperior # SUPERSCRIPT THREE
+<Multi_key> <asciicircum> <KP_3>       : "³" threesuperior # SUPERSCRIPT THREE
+<dead_circumflex> <1>  : "¹" onesuperior # SUPERSCRIPT ONE
+<Multi_key> <asciicircum> <1>  : "¹" onesuperior # SUPERSCRIPT ONE
+<dead_circumflex> <KP_1>       : "¹" onesuperior # SUPERSCRIPT ONE
+<Multi_key> <asciicircum> <KP_1>       : "¹" onesuperior # SUPERSCRIPT ONE
+<dead_circumflex> <Multi_key> <underscore> <o> : "º" masculine # MASCULINE ORDINAL INDICATOR
+<Multi_key> <asciicircum> <underscore> <o>     : "º" masculine # MASCULINE ORDINAL INDICATOR
+<dead_circumflex> <Multi_key> <underbar> <o>   : "º" masculine # MASCULINE ORDINAL INDICATOR
+<Multi_key> <asciicircum> <underbar> <o>       : "º" masculine # MASCULINE ORDINAL INDICATOR
+<Multi_key> <1> <4>                    : "¼"   onequarter # VULGAR FRACTION ONE QUARTER
+<Multi_key> <1> <2>                    : "½"   onehalf # VULGAR FRACTION ONE HALF
+<Multi_key> <3> <4>                    : "¾"   threequarters # VULGAR FRACTION THREE QUARTERS
+<dead_grave> <A>       : "À" Agrave # LATIN CAPITAL LETTER A WITH GRAVE
+<Multi_key> <grave> <A>        : "À" Agrave # LATIN CAPITAL LETTER A WITH GRAVE
+<dead_acute> <A>       : "Á" Aacute # LATIN CAPITAL LETTER A WITH ACUTE
+<Multi_key> <acute> <A>        : "Á" Aacute # LATIN CAPITAL LETTER A WITH ACUTE
+<Multi_key> <apostrophe> <A>   : "Á" Aacute # LATIN CAPITAL LETTER A WITH ACUTE
+<dead_circumflex> <A>  : "Â" Acircumflex # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <A>  : "Â" Acircumflex # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+<dead_tilde> <A>       : "Ã" Atilde # LATIN CAPITAL LETTER A WITH TILDE
+<Multi_key> <asciitilde> <A>   : "Ã" Atilde # LATIN CAPITAL LETTER A WITH TILDE
+<dead_diaeresis> <A>   : "Ä" Adiaeresis # LATIN CAPITAL LETTER A WITH DIAERESIS
+<Multi_key> <quotedbl> <A>     : "Ä" Adiaeresis # LATIN CAPITAL LETTER A WITH DIAERESIS
+<dead_abovering> <A>   : "Å" Aring # LATIN CAPITAL LETTER A WITH RING ABOVE
+<Multi_key> <o> <A>    : "Å" Aring # LATIN CAPITAL LETTER A WITH RING ABOVE
+<dead_cedilla> <C>     : "Ç" Ccedilla # LATIN CAPITAL LETTER C WITH CEDILLA
+<Multi_key> <comma> <C>        : "Ç" Ccedilla # LATIN CAPITAL LETTER C WITH CEDILLA
+<Multi_key> <cedilla> <C>      : "Ç" Ccedilla # LATIN CAPITAL LETTER C WITH CEDILLA
+<dead_grave> <E>       : "È" Egrave # LATIN CAPITAL LETTER E WITH GRAVE
+<Multi_key> <grave> <E>        : "È" Egrave # LATIN CAPITAL LETTER E WITH GRAVE
+<dead_acute> <E>       : "É" Eacute # LATIN CAPITAL LETTER E WITH ACUTE
+<Multi_key> <acute> <E>        : "É" Eacute # LATIN CAPITAL LETTER E WITH ACUTE
+<Multi_key> <apostrophe> <E>   : "É" Eacute # LATIN CAPITAL LETTER E WITH ACUTE
+<dead_circumflex> <E>  : "Ê" Ecircumflex # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <E>  : "Ê" Ecircumflex # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+<dead_diaeresis> <E>   : "Ë" Ediaeresis # LATIN CAPITAL LETTER E WITH DIAERESIS
+<Multi_key> <quotedbl> <E>     : "Ë" Ediaeresis # LATIN CAPITAL LETTER E WITH DIAERESIS
+<dead_grave> <I>       : "Ì" Igrave # LATIN CAPITAL LETTER I WITH GRAVE
+<Multi_key> <grave> <I>        : "Ì" Igrave # LATIN CAPITAL LETTER I WITH GRAVE
+<dead_acute> <I>       : "Í" Iacute # LATIN CAPITAL LETTER I WITH ACUTE
+<Multi_key> <acute> <I>        : "Í" Iacute # LATIN CAPITAL LETTER I WITH ACUTE
+<Multi_key> <apostrophe> <I>   : "Í" Iacute # LATIN CAPITAL LETTER I WITH ACUTE
+<dead_circumflex> <I>  : "Î" Icircumflex # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <I>  : "Î" Icircumflex # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+<dead_diaeresis> <I>   : "Ï" Idiaeresis # LATIN CAPITAL LETTER I WITH DIAERESIS
+<Multi_key> <quotedbl> <I>     : "Ï" Idiaeresis # LATIN CAPITAL LETTER I WITH DIAERESIS
+<dead_tilde> <N>       : "Ñ" Ntilde # LATIN CAPITAL LETTER N WITH TILDE
+<Multi_key> <asciitilde> <N>   : "Ñ" Ntilde # LATIN CAPITAL LETTER N WITH TILDE
+<dead_grave> <O>       : "Ò" Ograve # LATIN CAPITAL LETTER O WITH GRAVE
+<Multi_key> <grave> <O>        : "Ò" Ograve # LATIN CAPITAL LETTER O WITH GRAVE
+<dead_acute> <O>       : "Ó" Oacute # LATIN CAPITAL LETTER O WITH ACUTE
+<Multi_key> <acute> <O>        : "Ó" Oacute # LATIN CAPITAL LETTER O WITH ACUTE
+<Multi_key> <apostrophe> <O>   : "Ó" Oacute # LATIN CAPITAL LETTER O WITH ACUTE
+<dead_circumflex> <O>  : "Ô" Ocircumflex # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <O>  : "Ô" Ocircumflex # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+<dead_tilde> <O>       : "Õ" Otilde # LATIN CAPITAL LETTER O WITH TILDE
+<Multi_key> <asciitilde> <O>   : "Õ" Otilde # LATIN CAPITAL LETTER O WITH TILDE
+<dead_diaeresis> <O>   : "Ö" Odiaeresis # LATIN CAPITAL LETTER O WITH DIAERESIS
+<Multi_key> <quotedbl> <O>     : "Ö" Odiaeresis # LATIN CAPITAL LETTER O WITH DIAERESIS
+<Multi_key> <slash> <O>        : "Ø" Oslash # LATIN CAPITAL LETTER O WITH STROKE
+<Multi_key> <KP_Divide> <O>    : "Ø" Oslash # LATIN CAPITAL LETTER O WITH STROKE
+<dead_grave> <U>       : "Ù" Ugrave # LATIN CAPITAL LETTER U WITH GRAVE
+<Multi_key> <grave> <U>        : "Ù" Ugrave # LATIN CAPITAL LETTER U WITH GRAVE
+<dead_acute> <U>       : "Ú" Uacute # LATIN CAPITAL LETTER U WITH ACUTE
+<Multi_key> <acute> <U>        : "Ú" Uacute # LATIN CAPITAL LETTER U WITH ACUTE
+<Multi_key> <apostrophe> <U>   : "Ú" Uacute # LATIN CAPITAL LETTER U WITH ACUTE
+<dead_circumflex> <U>  : "Û" Ucircumflex # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <U>  : "Û" Ucircumflex # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+<dead_diaeresis> <U>   : "Ü" Udiaeresis # LATIN CAPITAL LETTER U WITH DIAERESIS
+<Multi_key> <quotedbl> <U>     : "Ü" Udiaeresis # LATIN CAPITAL LETTER U WITH DIAERESIS
+<dead_acute> <Y>       : "Ý" Yacute # LATIN CAPITAL LETTER Y WITH ACUTE
+<Multi_key> <acute> <Y>        : "Ý" Yacute # LATIN CAPITAL LETTER Y WITH ACUTE
+<Multi_key> <apostrophe> <Y>   : "Ý" Yacute # LATIN CAPITAL LETTER Y WITH ACUTE
+<dead_grave> <a>       : "à" agrave # LATIN SMALL LETTER A WITH GRAVE
+<Multi_key> <grave> <a>        : "à" agrave # LATIN SMALL LETTER A WITH GRAVE
+<dead_acute> <a>       : "á" aacute # LATIN SMALL LETTER A WITH ACUTE
+<Multi_key> <acute> <a>        : "á" aacute # LATIN SMALL LETTER A WITH ACUTE
+<Multi_key> <apostrophe> <a>   : "á" aacute # LATIN SMALL LETTER A WITH ACUTE
+<dead_circumflex> <a>  : "â" acircumflex # LATIN SMALL LETTER A WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <a>  : "â" acircumflex # LATIN SMALL LETTER A WITH CIRCUMFLEX
+<dead_tilde> <a>       : "ã" atilde # LATIN SMALL LETTER A WITH TILDE
+<Multi_key> <asciitilde> <a>   : "ã" atilde # LATIN SMALL LETTER A WITH TILDE
+<dead_diaeresis> <a>   : "ä" adiaeresis # LATIN SMALL LETTER A WITH DIAERESIS
+<Multi_key> <quotedbl> <a>     : "ä" adiaeresis # LATIN SMALL LETTER A WITH DIAERESIS
+<dead_abovering> <a>   : "å" aring # LATIN SMALL LETTER A WITH RING ABOVE
+<Multi_key> <o> <a>    : "å" aring # LATIN SMALL LETTER A WITH RING ABOVE
+<dead_cedilla> <c>     : "ç" ccedilla # LATIN SMALL LETTER C WITH CEDILLA
+<Multi_key> <comma> <c>        : "ç" ccedilla # LATIN SMALL LETTER C WITH CEDILLA
+<Multi_key> <cedilla> <c>      : "ç" ccedilla # LATIN SMALL LETTER C WITH CEDILLA
+<dead_grave> <e>       : "è" egrave # LATIN SMALL LETTER E WITH GRAVE
+<Multi_key> <grave> <e>        : "è" egrave # LATIN SMALL LETTER E WITH GRAVE
+<dead_acute> <e>       : "é" eacute # LATIN SMALL LETTER E WITH ACUTE
+<Multi_key> <acute> <e>        : "é" eacute # LATIN SMALL LETTER E WITH ACUTE
+<Multi_key> <apostrophe> <e>   : "é" eacute # LATIN SMALL LETTER E WITH ACUTE
+<dead_circumflex> <e>  : "ê" ecircumflex # LATIN SMALL LETTER E WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <e>  : "ê" ecircumflex # LATIN SMALL LETTER E WITH CIRCUMFLEX
+<dead_diaeresis> <e>   : "ë" ediaeresis # LATIN SMALL LETTER E WITH DIAERESIS
+<Multi_key> <quotedbl> <e>     : "ë" ediaeresis # LATIN SMALL LETTER E WITH DIAERESIS
+<dead_grave> <i>       : "ì" igrave # LATIN SMALL LETTER I WITH GRAVE
+<Multi_key> <grave> <i>        : "ì" igrave # LATIN SMALL LETTER I WITH GRAVE
+<dead_acute> <i>       : "í" iacute # LATIN SMALL LETTER I WITH ACUTE
+<Multi_key> <acute> <i>        : "í" iacute # LATIN SMALL LETTER I WITH ACUTE
+<Multi_key> <apostrophe> <i>   : "í" iacute # LATIN SMALL LETTER I WITH ACUTE
+<dead_circumflex> <i>  : "î" icircumflex # LATIN SMALL LETTER I WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <i>  : "î" icircumflex # LATIN SMALL LETTER I WITH CIRCUMFLEX
+<dead_diaeresis> <i>   : "ï" idiaeresis # LATIN SMALL LETTER I WITH DIAERESIS
+<Multi_key> <quotedbl> <i>     : "ï" idiaeresis # LATIN SMALL LETTER I WITH DIAERESIS
+<dead_tilde> <n>       : "ñ" ntilde # LATIN SMALL LETTER N WITH TILDE
+<Multi_key> <asciitilde> <n>   : "ñ" ntilde # LATIN SMALL LETTER N WITH TILDE
+<dead_grave> <o>       : "ò" ograve # LATIN SMALL LETTER O WITH GRAVE
+<Multi_key> <grave> <o>        : "ò" ograve # LATIN SMALL LETTER O WITH GRAVE
+<dead_acute> <o>       : "ó" oacute # LATIN SMALL LETTER O WITH ACUTE
+<Multi_key> <acute> <o>        : "ó" oacute # LATIN SMALL LETTER O WITH ACUTE
+<Multi_key> <apostrophe> <o>   : "ó" oacute # LATIN SMALL LETTER O WITH ACUTE
+<dead_circumflex> <o>  : "ô" ocircumflex # LATIN SMALL LETTER O WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <o>  : "ô" ocircumflex # LATIN SMALL LETTER O WITH CIRCUMFLEX
+<dead_tilde> <o>       : "õ" otilde # LATIN SMALL LETTER O WITH TILDE
+<Multi_key> <asciitilde> <o>   : "õ" otilde # LATIN SMALL LETTER O WITH TILDE
+<dead_diaeresis> <o>   : "ö" odiaeresis # LATIN SMALL LETTER O WITH DIAERESIS
+<Multi_key> <quotedbl> <o>     : "ö" odiaeresis # LATIN SMALL LETTER O WITH DIAERESIS
+<Multi_key> <slash> <o>        : "ø" oslash # LATIN SMALL LETTER O WITH STROKE
+<Multi_key> <KP_Divide> <o>    : "ø" oslash # LATIN SMALL LETTER O WITH STROKE
+<dead_grave> <u>       : "ù" ugrave # LATIN SMALL LETTER U WITH GRAVE
+<Multi_key> <grave> <u>        : "ù" ugrave # LATIN SMALL LETTER U WITH GRAVE
+<dead_acute> <u>       : "ú" uacute # LATIN SMALL LETTER U WITH ACUTE
+<Multi_key> <acute> <u>        : "ú" uacute # LATIN SMALL LETTER U WITH ACUTE
+<Multi_key> <apostrophe> <u>   : "ú" uacute # LATIN SMALL LETTER U WITH ACUTE
+<dead_circumflex> <u>  : "û" ucircumflex # LATIN SMALL LETTER U WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <u>  : "û" ucircumflex # LATIN SMALL LETTER U WITH CIRCUMFLEX
+<dead_diaeresis> <u>   : "ü" udiaeresis # LATIN SMALL LETTER U WITH DIAERESIS
+<Multi_key> <quotedbl> <u>     : "ü" udiaeresis # LATIN SMALL LETTER U WITH DIAERESIS
+<dead_acute> <y>       : "ý" yacute # LATIN SMALL LETTER Y WITH ACUTE
+<Multi_key> <acute> <y>        : "ý" yacute # LATIN SMALL LETTER Y WITH ACUTE
+<Multi_key> <apostrophe> <y>   : "ý" yacute # LATIN SMALL LETTER Y WITH ACUTE
+<dead_diaeresis> <y>   : "ÿ" ydiaeresis # LATIN SMALL LETTER Y WITH DIAERESIS
+<Multi_key> <quotedbl> <y>     : "ÿ" ydiaeresis # LATIN SMALL LETTER Y WITH DIAERESIS
+<dead_macron> <A>      : "Ā" U0100 # LATIN CAPITAL LETTER A WITH MACRON
+<Multi_key> <macron> <A>       : "Ā" U0100 # LATIN CAPITAL LETTER A WITH MACRON
+<Multi_key> <underscore> <A>   : "Ā" U0100 # LATIN CAPITAL LETTER A WITH MACRON
+<dead_macron> <a>      : "ā" U0101 # LATIN SMALL LETTER A WITH MACRON
+<Multi_key> <macron> <a>       : "ā" U0101 # LATIN SMALL LETTER A WITH MACRON
+<Multi_key> <underscore> <a>   : "ā" U0101 # LATIN SMALL LETTER A WITH MACRON
+<dead_breve> <A>       : "Ă" U0102 # LATIN CAPITAL LETTER A WITH BREVE
+<Multi_key> <U> <A>    : "Ă" U0102 # LATIN CAPITAL LETTER A WITH BREVE
+<Multi_key> <b> <A>    : "Ă" U0102 # LATIN CAPITAL LETTER A WITH BREVE
+<dead_breve> <a>       : "ă" U0103 # LATIN SMALL LETTER A WITH BREVE
+<Multi_key> <U> <a>    : "ă" U0103 # LATIN SMALL LETTER A WITH BREVE
+<Multi_key> <b> <a>    : "ă" U0103 # LATIN SMALL LETTER A WITH BREVE
+<dead_ogonek> <A>      : "Ą" U0104 # LATIN CAPITAL LETTER A WITH OGONEK
+<Multi_key> <semicolon> <A>    : "Ą" U0104 # LATIN CAPITAL LETTER A WITH OGONEK
+<dead_ogonek> <a>      : "ą" U0105 # LATIN SMALL LETTER A WITH OGONEK
+<Multi_key> <semicolon> <a>    : "ą" U0105 # LATIN SMALL LETTER A WITH OGONEK
+<dead_acute> <C>       : "Ç" Ccedilla # LATIN CAPITAL LETTER C WITH CEDILLA
+<Multi_key> <acute> <C>        : "Ć" U0106 # LATIN CAPITAL LETTER C WITH ACUTE
+<Multi_key> <apostrophe> <C>   : "Ć" U0106 # LATIN CAPITAL LETTER C WITH ACUTE
+<dead_acute> <c>       : "ç" ccedilla # LATIN SMALL LETTER C WITH CEDILLA
+<Multi_key> <acute> <c>        : "ć" U0107 # LATIN SMALL LETTER C WITH ACUTE
+<Multi_key> <apostrophe> <c>   : "ć" U0107 # LATIN SMALL LETTER C WITH ACUTE
+<dead_circumflex> <C>  : "Ĉ" U0108 # LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <C>  : "Ĉ" U0108 # LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+<dead_circumflex> <c>  : "ĉ" U0109 # LATIN SMALL LETTER C WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <c>  : "ĉ" U0109 # LATIN SMALL LETTER C WITH CIRCUMFLEX
+<dead_abovedot> <C>    : "Ċ" U010A # LATIN CAPITAL LETTER C WITH DOT ABOVE
+<Multi_key> <period> <C>       : "Ċ" U010A # LATIN CAPITAL LETTER C WITH DOT ABOVE
+<dead_abovedot> <c>    : "ċ" U010B # LATIN SMALL LETTER C WITH DOT ABOVE
+<Multi_key> <period> <c>       : "ċ" U010B # LATIN SMALL LETTER C WITH DOT ABOVE
+<dead_caron> <C>       : "Č" U010C # LATIN CAPITAL LETTER C WITH CARON
+<Multi_key> <c> <C>    : "Č" U010C # LATIN CAPITAL LETTER C WITH CARON
+<dead_caron> <c>       : "č" U010D # LATIN SMALL LETTER C WITH CARON
+<Multi_key> <c> <c>    : "č" U010D # LATIN SMALL LETTER C WITH CARON
+<dead_caron> <D>       : "Ď" U010E # LATIN CAPITAL LETTER D WITH CARON
+<Multi_key> <c> <D>    : "Ď" U010E # LATIN CAPITAL LETTER D WITH CARON
+<dead_caron> <d>       : "ď" U010F # LATIN SMALL LETTER D WITH CARON
+<Multi_key> <c> <d>    : "ď" U010F # LATIN SMALL LETTER D WITH CARON
+<Multi_key> <slash> <D>        : "Đ" U0110 # LATIN CAPITAL LETTER D WITH STROKE
+<Multi_key> <KP_Divide> <D>    : "Đ" U0110 # LATIN CAPITAL LETTER D WITH STROKE
+<Multi_key> <slash> <d>        : "đ" U0111 # LATIN SMALL LETTER D WITH STROKE
+<Multi_key> <KP_Divide> <d>    : "đ" U0111 # LATIN SMALL LETTER D WITH STROKE
+<dead_macron> <E>      : "Ē" U0112 # LATIN CAPITAL LETTER E WITH MACRON
+<Multi_key> <macron> <E>       : "Ē" U0112 # LATIN CAPITAL LETTER E WITH MACRON
+<Multi_key> <underscore> <E>   : "Ē" U0112 # LATIN CAPITAL LETTER E WITH MACRON
+<dead_macron> <e>      : "ē" U0113 # LATIN SMALL LETTER E WITH MACRON
+<Multi_key> <macron> <e>       : "ē" U0113 # LATIN SMALL LETTER E WITH MACRON
+<Multi_key> <underscore> <e>   : "ē" U0113 # LATIN SMALL LETTER E WITH MACRON
+<dead_breve> <E>       : "Ĕ" U0114 # LATIN CAPITAL LETTER E WITH BREVE
+<Multi_key> <U> <E>    : "Ĕ" U0114 # LATIN CAPITAL LETTER E WITH BREVE
+<Multi_key> <b> <E>    : "Ĕ" U0114 # LATIN CAPITAL LETTER E WITH BREVE
+<dead_breve> <e>       : "ĕ" U0115 # LATIN SMALL LETTER E WITH BREVE
+<Multi_key> <U> <e>    : "ĕ" U0115 # LATIN SMALL LETTER E WITH BREVE
+<Multi_key> <b> <e>    : "ĕ" U0115 # LATIN SMALL LETTER E WITH BREVE
+<dead_abovedot> <E>    : "Ė" U0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE
+<Multi_key> <period> <E>       : "Ė" U0116 # LATIN CAPITAL LETTER E WITH DOT ABOVE
+<dead_abovedot> <e>    : "ė" U0117 # LATIN SMALL LETTER E WITH DOT ABOVE
+<Multi_key> <period> <e>       : "ė" U0117 # LATIN SMALL LETTER E WITH DOT ABOVE
+<dead_ogonek> <E>      : "Ę" U0118 # LATIN CAPITAL LETTER E WITH OGONEK
+<Multi_key> <semicolon> <E>    : "Ę" U0118 # LATIN CAPITAL LETTER E WITH OGONEK
+<dead_ogonek> <e>      : "ę" U0119 # LATIN SMALL LETTER E WITH OGONEK
+<Multi_key> <semicolon> <e>    : "ę" U0119 # LATIN SMALL LETTER E WITH OGONEK
+<dead_caron> <E>       : "Ě" U011A # LATIN CAPITAL LETTER E WITH CARON
+<Multi_key> <c> <E>    : "Ě" U011A # LATIN CAPITAL LETTER E WITH CARON
+<dead_caron> <e>       : "ě" U011B # LATIN SMALL LETTER E WITH CARON
+<Multi_key> <c> <e>    : "ě" U011B # LATIN SMALL LETTER E WITH CARON
+<dead_circumflex> <G>  : "Ĝ" U011C # LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <G>  : "Ĝ" U011C # LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+<dead_circumflex> <g>  : "ĝ" U011D # LATIN SMALL LETTER G WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <g>  : "ĝ" U011D # LATIN SMALL LETTER G WITH CIRCUMFLEX
+<dead_breve> <G>       : "Ğ" U011E # LATIN CAPITAL LETTER G WITH BREVE
+<Multi_key> <U> <G>    : "Ğ" U011E # LATIN CAPITAL LETTER G WITH BREVE
+<Multi_key> <b> <G>    : "Ğ" U011E # LATIN CAPITAL LETTER G WITH BREVE
+<dead_breve> <g>       : "ğ" U011F # LATIN SMALL LETTER G WITH BREVE
+<Multi_key> <U> <g>    : "ğ" U011F # LATIN SMALL LETTER G WITH BREVE
+<Multi_key> <b> <g>    : "ğ" U011F # LATIN SMALL LETTER G WITH BREVE
+<dead_abovedot> <G>    : "Ġ" U0120 # LATIN CAPITAL LETTER G WITH DOT ABOVE
+<Multi_key> <period> <G>       : "Ġ" U0120 # LATIN CAPITAL LETTER G WITH DOT ABOVE
+<dead_abovedot> <g>    : "ġ" U0121 # LATIN SMALL LETTER G WITH DOT ABOVE
+<Multi_key> <period> <g>       : "ġ" U0121 # LATIN SMALL LETTER G WITH DOT ABOVE
+<dead_cedilla> <G>     : "Ģ" U0122 # LATIN CAPITAL LETTER G WITH CEDILLA
+<Multi_key> <comma> <G>        : "Ģ" U0122 # LATIN CAPITAL LETTER G WITH CEDILLA
+<Multi_key> <cedilla> <G>      : "Ģ" U0122 # LATIN CAPITAL LETTER G WITH CEDILLA
+<dead_cedilla> <g>     : "ģ" U0123 # LATIN SMALL LETTER G WITH CEDILLA
+<Multi_key> <comma> <g>        : "ģ" U0123 # LATIN SMALL LETTER G WITH CEDILLA
+<Multi_key> <cedilla> <g>      : "ģ" U0123 # LATIN SMALL LETTER G WITH CEDILLA
+<dead_circumflex> <H>  : "Ĥ" U0124 # LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <H>  : "Ĥ" U0124 # LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+<dead_circumflex> <h>  : "ĥ" U0125 # LATIN SMALL LETTER H WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <h>  : "ĥ" U0125 # LATIN SMALL LETTER H WITH CIRCUMFLEX
+<Multi_key> <slash> <H>        : "Ħ" U0126 # LATIN CAPITAL LETTER H WITH STROKE
+<Multi_key> <KP_Divide> <H>    : "Ħ" U0126 # LATIN CAPITAL LETTER H WITH STROKE
+<Multi_key> <slash> <h>        : "ħ" U0127 # LATIN SMALL LETTER H WITH STROKE
+<Multi_key> <KP_Divide> <h>    : "ħ" U0127 # LATIN SMALL LETTER H WITH STROKE
+<dead_tilde> <I>       : "Ĩ" U0128 # LATIN CAPITAL LETTER I WITH TILDE
+<Multi_key> <asciitilde> <I>   : "Ĩ" U0128 # LATIN CAPITAL LETTER I WITH TILDE
+<dead_tilde> <i>       : "ĩ" U0129 # LATIN SMALL LETTER I WITH TILDE
+<Multi_key> <asciitilde> <i>   : "ĩ" U0129 # LATIN SMALL LETTER I WITH TILDE
+<dead_macron> <I>      : "Ī" U012A # LATIN CAPITAL LETTER I WITH MACRON
+<Multi_key> <macron> <I>       : "Ī" U012A # LATIN CAPITAL LETTER I WITH MACRON
+<Multi_key> <underscore> <I>   : "Ī" U012A # LATIN CAPITAL LETTER I WITH MACRON
+<dead_macron> <i>      : "ī" U012B # LATIN SMALL LETTER I WITH MACRON
+<Multi_key> <macron> <i>       : "ī" U012B # LATIN SMALL LETTER I WITH MACRON
+<Multi_key> <underscore> <i>   : "ī" U012B # LATIN SMALL LETTER I WITH MACRON
+<dead_breve> <I>       : "Ĭ" U012C # LATIN CAPITAL LETTER I WITH BREVE
+<Multi_key> <U> <I>    : "Ĭ" U012C # LATIN CAPITAL LETTER I WITH BREVE
+<Multi_key> <b> <I>    : "Ĭ" U012C # LATIN CAPITAL LETTER I WITH BREVE
+<dead_breve> <i>       : "ĭ" U012D # LATIN SMALL LETTER I WITH BREVE
+<Multi_key> <U> <i>    : "ĭ" U012D # LATIN SMALL LETTER I WITH BREVE
+<Multi_key> <b> <i>    : "ĭ" U012D # LATIN SMALL LETTER I WITH BREVE
+<dead_ogonek> <I>      : "Į" U012E # LATIN CAPITAL LETTER I WITH OGONEK
+<Multi_key> <semicolon> <I>    : "Į" U012E # LATIN CAPITAL LETTER I WITH OGONEK
+<dead_ogonek> <i>      : "į" U012F # LATIN SMALL LETTER I WITH OGONEK
+<Multi_key> <semicolon> <i>    : "į" U012F # LATIN SMALL LETTER I WITH OGONEK
+<dead_abovedot> <I>    : "İ" U0130 # LATIN CAPITAL LETTER I WITH DOT ABOVE
+<Multi_key> <period> <I>       : "İ" U0130 # LATIN CAPITAL LETTER I WITH DOT ABOVE
+<dead_circumflex> <J>  : "Ĵ" U0134 # LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <J>  : "Ĵ" U0134 # LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+<dead_circumflex> <j>  : "ĵ" U0135 # LATIN SMALL LETTER J WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <j>  : "ĵ" U0135 # LATIN SMALL LETTER J WITH CIRCUMFLEX
+<dead_cedilla> <K>     : "Ķ" U0136 # LATIN CAPITAL LETTER K WITH CEDILLA
+<Multi_key> <comma> <K>        : "Ķ" U0136 # LATIN CAPITAL LETTER K WITH CEDILLA
+<Multi_key> <cedilla> <K>      : "Ķ" U0136 # LATIN CAPITAL LETTER K WITH CEDILLA
+<dead_cedilla> <k>     : "ķ" U0137 # LATIN SMALL LETTER K WITH CEDILLA
+<Multi_key> <comma> <k>        : "ķ" U0137 # LATIN SMALL LETTER K WITH CEDILLA
+<Multi_key> <cedilla> <k>      : "ķ" U0137 # LATIN SMALL LETTER K WITH CEDILLA
+<dead_acute> <L>       : "Ĺ" U0139 # LATIN CAPITAL LETTER L WITH ACUTE
+<Multi_key> <acute> <L>        : "Ĺ" U0139 # LATIN CAPITAL LETTER L WITH ACUTE
+<Multi_key> <apostrophe> <L>   : "Ĺ" U0139 # LATIN CAPITAL LETTER L WITH ACUTE
+<dead_acute> <l>       : "ĺ" U013A # LATIN SMALL LETTER L WITH ACUTE
+<Multi_key> <acute> <l>        : "ĺ" U013A # LATIN SMALL LETTER L WITH ACUTE
+<Multi_key> <apostrophe> <l>   : "ĺ" U013A # LATIN SMALL LETTER L WITH ACUTE
+<dead_cedilla> <L>     : "Ļ" U013B # LATIN CAPITAL LETTER L WITH CEDILLA
+<Multi_key> <comma> <L>        : "Ļ" U013B # LATIN CAPITAL LETTER L WITH CEDILLA
+<Multi_key> <cedilla> <L>      : "Ļ" U013B # LATIN CAPITAL LETTER L WITH CEDILLA
+<dead_cedilla> <l>     : "ļ" U013C # LATIN SMALL LETTER L WITH CEDILLA
+<Multi_key> <comma> <l>        : "ļ" U013C # LATIN SMALL LETTER L WITH CEDILLA
+<Multi_key> <cedilla> <l>      : "ļ" U013C # LATIN SMALL LETTER L WITH CEDILLA
+<dead_caron> <L>       : "Ľ" U013D # LATIN CAPITAL LETTER L WITH CARON
+<Multi_key> <c> <L>    : "Ľ" U013D # LATIN CAPITAL LETTER L WITH CARON
+<dead_caron> <l>       : "ľ" U013E # LATIN SMALL LETTER L WITH CARON
+<Multi_key> <c> <l>    : "ľ" U013E # LATIN SMALL LETTER L WITH CARON
+<Multi_key> <slash> <L>        : "Ł" U0141 # LATIN CAPITAL LETTER L WITH STROKE
+<Multi_key> <KP_Divide> <L>    : "Ł" U0141 # LATIN CAPITAL LETTER L WITH STROKE
+<Multi_key> <slash> <l>        : "ł" U0142 # LATIN SMALL LETTER L WITH STROKE
+<Multi_key> <KP_Divide> <l>    : "ł" U0142 # LATIN SMALL LETTER L WITH STROKE
+<dead_acute> <N>       : "Ń" U0143 # LATIN CAPITAL LETTER N WITH ACUTE
+<Multi_key> <acute> <N>        : "Ń" U0143 # LATIN CAPITAL LETTER N WITH ACUTE
+<Multi_key> <apostrophe> <N>   : "Ń" U0143 # LATIN CAPITAL LETTER N WITH ACUTE
+<dead_acute> <n>       : "ń" U0144 # LATIN SMALL LETTER N WITH ACUTE
+<Multi_key> <acute> <n>        : "ń" U0144 # LATIN SMALL LETTER N WITH ACUTE
+<Multi_key> <apostrophe> <n>   : "ń" U0144 # LATIN SMALL LETTER N WITH ACUTE
+<dead_cedilla> <N>     : "Ņ" U0145 # LATIN CAPITAL LETTER N WITH CEDILLA
+<Multi_key> <comma> <N>        : "Ņ" U0145 # LATIN CAPITAL LETTER N WITH CEDILLA
+<Multi_key> <cedilla> <N>      : "Ņ" U0145 # LATIN CAPITAL LETTER N WITH CEDILLA
+<dead_cedilla> <n>     : "ņ" U0146 # LATIN SMALL LETTER N WITH CEDILLA
+<Multi_key> <comma> <n>        : "ņ" U0146 # LATIN SMALL LETTER N WITH CEDILLA
+<Multi_key> <cedilla> <n>      : "ņ" U0146 # LATIN SMALL LETTER N WITH CEDILLA
+<dead_caron> <N>       : "Ň" U0147 # LATIN CAPITAL LETTER N WITH CARON
+<Multi_key> <c> <N>    : "Ň" U0147 # LATIN CAPITAL LETTER N WITH CARON
+<dead_caron> <n>       : "ň" U0148 # LATIN SMALL LETTER N WITH CARON
+<Multi_key> <c> <n>    : "ň" U0148 # LATIN SMALL LETTER N WITH CARON
+<dead_macron> <O>      : "Ō" U014C # LATIN CAPITAL LETTER O WITH MACRON
+<Multi_key> <macron> <O>       : "Ō" U014C # LATIN CAPITAL LETTER O WITH MACRON
+<Multi_key> <underscore> <O>   : "Ō" U014C # LATIN CAPITAL LETTER O WITH MACRON
+<dead_macron> <o>      : "ō" U014D # LATIN SMALL LETTER O WITH MACRON
+<Multi_key> <macron> <o>       : "ō" U014D # LATIN SMALL LETTER O WITH MACRON
+<Multi_key> <underscore> <o>   : "ō" U014D # LATIN SMALL LETTER O WITH MACRON
+<dead_breve> <O>       : "Ŏ" U014E # LATIN CAPITAL LETTER O WITH BREVE
+<Multi_key> <U> <O>    : "Ŏ" U014E # LATIN CAPITAL LETTER O WITH BREVE
+<Multi_key> <b> <O>    : "Ŏ" U014E # LATIN CAPITAL LETTER O WITH BREVE
+<dead_breve> <o>       : "ŏ" U014F # LATIN SMALL LETTER O WITH BREVE
+<Multi_key> <U> <o>    : "ŏ" U014F # LATIN SMALL LETTER O WITH BREVE
+<Multi_key> <b> <o>    : "ŏ" U014F # LATIN SMALL LETTER O WITH BREVE
+<dead_doubleacute> <O> : "Ő" U0150 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+<Multi_key> <equal> <O>        : "Ő" U0150 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+<dead_doubleacute> <o> : "ő" U0151 # LATIN SMALL LETTER O WITH DOUBLE ACUTE
+<Multi_key> <equal> <o>        : "ő" U0151 # LATIN SMALL LETTER O WITH DOUBLE ACUTE
+<dead_acute> <R>       : "Ŕ" U0154 # LATIN CAPITAL LETTER R WITH ACUTE
+<Multi_key> <acute> <R>        : "Ŕ" U0154 # LATIN CAPITAL LETTER R WITH ACUTE
+<Multi_key> <apostrophe> <R>   : "Ŕ" U0154 # LATIN CAPITAL LETTER R WITH ACUTE
+<dead_acute> <r>       : "ŕ" U0155 # LATIN SMALL LETTER R WITH ACUTE
+<Multi_key> <acute> <r>        : "ŕ" U0155 # LATIN SMALL LETTER R WITH ACUTE
+<Multi_key> <apostrophe> <r>   : "ŕ" U0155 # LATIN SMALL LETTER R WITH ACUTE
+<dead_cedilla> <R>     : "Ŗ" U0156 # LATIN CAPITAL LETTER R WITH CEDILLA
+<Multi_key> <comma> <R>        : "Ŗ" U0156 # LATIN CAPITAL LETTER R WITH CEDILLA
+<Multi_key> <cedilla> <R>      : "Ŗ" U0156 # LATIN CAPITAL LETTER R WITH CEDILLA
+<dead_cedilla> <r>     : "ŗ" U0157 # LATIN SMALL LETTER R WITH CEDILLA
+<Multi_key> <comma> <r>        : "ŗ" U0157 # LATIN SMALL LETTER R WITH CEDILLA
+<Multi_key> <cedilla> <r>      : "ŗ" U0157 # LATIN SMALL LETTER R WITH CEDILLA
+<dead_caron> <R>       : "Ř" U0158 # LATIN CAPITAL LETTER R WITH CARON
+<Multi_key> <c> <R>    : "Ř" U0158 # LATIN CAPITAL LETTER R WITH CARON
+<dead_caron> <r>       : "ř" U0159 # LATIN SMALL LETTER R WITH CARON
+<Multi_key> <c> <r>    : "ř" U0159 # LATIN SMALL LETTER R WITH CARON
+<dead_acute> <S>       : "Ś" U015A # LATIN CAPITAL LETTER S WITH ACUTE
+<Multi_key> <acute> <S>        : "Ś" U015A # LATIN CAPITAL LETTER S WITH ACUTE
+<Multi_key> <apostrophe> <S>   : "Ś" U015A # LATIN CAPITAL LETTER S WITH ACUTE
+<dead_acute> <s>       : "ś" U015B # LATIN SMALL LETTER S WITH ACUTE
+<Multi_key> <acute> <s>        : "ś" U015B # LATIN SMALL LETTER S WITH ACUTE
+<Multi_key> <apostrophe> <s>   : "ś" U015B # LATIN SMALL LETTER S WITH ACUTE
+<dead_circumflex> <S>  : "Ŝ" U015C # LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <S>  : "Ŝ" U015C # LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+<dead_circumflex> <s>  : "ŝ" U015D # LATIN SMALL LETTER S WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <s>  : "ŝ" U015D # LATIN SMALL LETTER S WITH CIRCUMFLEX
+<dead_cedilla> <S>     : "Ş" U015E # LATIN CAPITAL LETTER S WITH CEDILLA
+<Multi_key> <comma> <S>        : "Ş" U015E # LATIN CAPITAL LETTER S WITH CEDILLA
+<Multi_key> <cedilla> <S>      : "Ş" U015E # LATIN CAPITAL LETTER S WITH CEDILLA
+<dead_cedilla> <s>     : "ş" U015F # LATIN SMALL LETTER S WITH CEDILLA
+<Multi_key> <comma> <s>        : "ş" U015F # LATIN SMALL LETTER S WITH CEDILLA
+<Multi_key> <cedilla> <s>      : "ş" U015F # LATIN SMALL LETTER S WITH CEDILLA
+<dead_caron> <S>       : "Š" U0160 # LATIN CAPITAL LETTER S WITH CARON
+<Multi_key> <c> <S>    : "Š" U0160 # LATIN CAPITAL LETTER S WITH CARON
+<dead_caron> <s>       : "š" U0161 # LATIN SMALL LETTER S WITH CARON
+<Multi_key> <c> <s>    : "š" U0161 # LATIN SMALL LETTER S WITH CARON
+<dead_cedilla> <T>     : "Ţ" U0162 # LATIN CAPITAL LETTER T WITH CEDILLA
+<Multi_key> <comma> <T>        : "Ţ" U0162 # LATIN CAPITAL LETTER T WITH CEDILLA
+<Multi_key> <cedilla> <T>      : "Ţ" U0162 # LATIN CAPITAL LETTER T WITH CEDILLA
+<dead_cedilla> <t>     : "ţ" U0163 # LATIN SMALL LETTER T WITH CEDILLA
+<Multi_key> <comma> <t>        : "ţ" U0163 # LATIN SMALL LETTER T WITH CEDILLA
+<Multi_key> <cedilla> <t>      : "ţ" U0163 # LATIN SMALL LETTER T WITH CEDILLA
+<dead_caron> <T>       : "Ť" U0164 # LATIN CAPITAL LETTER T WITH CARON
+<Multi_key> <c> <T>    : "Ť" U0164 # LATIN CAPITAL LETTER T WITH CARON
+<dead_caron> <t>       : "ť" U0165 # LATIN SMALL LETTER T WITH CARON
+<Multi_key> <c> <t>    : "ť" U0165 # LATIN SMALL LETTER T WITH CARON
+<Multi_key> <slash> <T>        : "Ŧ" U0166 # LATIN CAPITAL LETTER T WITH STROKE
+<Multi_key> <KP_Divide> <T>    : "Ŧ" U0166 # LATIN CAPITAL LETTER T WITH STROKE
+<Multi_key> <slash> <t>        : "ŧ" U0167 # LATIN SMALL LETTER T WITH STROKE
+<Multi_key> <KP_Divide> <t>    : "ŧ" U0167 # LATIN SMALL LETTER T WITH STROKE
+<dead_tilde> <U>       : "Ũ" U0168 # LATIN CAPITAL LETTER U WITH TILDE
+<Multi_key> <asciitilde> <U>   : "Ũ" U0168 # LATIN CAPITAL LETTER U WITH TILDE
+<dead_tilde> <u>       : "ũ" U0169 # LATIN SMALL LETTER U WITH TILDE
+<Multi_key> <asciitilde> <u>   : "ũ" U0169 # LATIN SMALL LETTER U WITH TILDE
+<dead_macron> <U>      : "Ū" U016A # LATIN CAPITAL LETTER U WITH MACRON
+<Multi_key> <macron> <U>       : "Ū" U016A # LATIN CAPITAL LETTER U WITH MACRON
+<Multi_key> <underscore> <U>   : "Ū" U016A # LATIN CAPITAL LETTER U WITH MACRON
+<dead_macron> <u>      : "ū" U016B # LATIN SMALL LETTER U WITH MACRON
+<Multi_key> <macron> <u>       : "ū" U016B # LATIN SMALL LETTER U WITH MACRON
+<Multi_key> <underscore> <u>   : "ū" U016B # LATIN SMALL LETTER U WITH MACRON
+<dead_breve> <U>       : "Ŭ" U016C # LATIN CAPITAL LETTER U WITH BREVE
+<Multi_key> <U> <U>    : "Ŭ" U016C # LATIN CAPITAL LETTER U WITH BREVE
+<Multi_key> <b> <U>    : "Ŭ" U016C # LATIN CAPITAL LETTER U WITH BREVE
+<dead_breve> <u>       : "ŭ" U016D # LATIN SMALL LETTER U WITH BREVE
+<Multi_key> <U> <u>    : "ŭ" U016D # LATIN SMALL LETTER U WITH BREVE
+<Multi_key> <b> <u>    : "ŭ" U016D # LATIN SMALL LETTER U WITH BREVE
+<dead_abovering> <U>   : "Ů" U016E # LATIN CAPITAL LETTER U WITH RING ABOVE
+<Multi_key> <o> <U>    : "Ů" U016E # LATIN CAPITAL LETTER U WITH RING ABOVE
+<dead_abovering> <u>   : "ů" U016F # LATIN SMALL LETTER U WITH RING ABOVE
+<Multi_key> <o> <u>    : "ů" U016F # LATIN SMALL LETTER U WITH RING ABOVE
+<dead_doubleacute> <U> : "Ű" U0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+<Multi_key> <equal> <U>        : "Ű" U0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+<dead_doubleacute> <u> : "ű" U0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE
+<Multi_key> <equal> <u>        : "ű" U0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE
+<dead_ogonek> <U>      : "Ų" U0172 # LATIN CAPITAL LETTER U WITH OGONEK
+<Multi_key> <semicolon> <U>    : "Ų" U0172 # LATIN CAPITAL LETTER U WITH OGONEK
+<dead_ogonek> <u>      : "ų" U0173 # LATIN SMALL LETTER U WITH OGONEK
+<Multi_key> <semicolon> <u>    : "ų" U0173 # LATIN SMALL LETTER U WITH OGONEK
+<dead_circumflex> <W>  : "Ŵ" U0174 # LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <W>  : "Ŵ" U0174 # LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+<dead_circumflex> <w>  : "ŵ" U0175 # LATIN SMALL LETTER W WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <w>  : "ŵ" U0175 # LATIN SMALL LETTER W WITH CIRCUMFLEX
+<dead_circumflex> <Y>  : "Ŷ" U0176 # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <Y>  : "Ŷ" U0176 # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+<dead_circumflex> <y>  : "ŷ" U0177 # LATIN SMALL LETTER Y WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <y>  : "ŷ" U0177 # LATIN SMALL LETTER Y WITH CIRCUMFLEX
+<dead_diaeresis> <Y>   : "Ÿ" U0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS
+<Multi_key> <quotedbl> <Y>     : "Ÿ" U0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS
+<dead_acute> <Z>       : "Ź" U0179 # LATIN CAPITAL LETTER Z WITH ACUTE
+<Multi_key> <acute> <Z>        : "Ź" U0179 # LATIN CAPITAL LETTER Z WITH ACUTE
+<Multi_key> <apostrophe> <Z>   : "Ź" U0179 # LATIN CAPITAL LETTER Z WITH ACUTE
+<dead_acute> <z>       : "ź" U017A # LATIN SMALL LETTER Z WITH ACUTE
+<Multi_key> <acute> <z>        : "ź" U017A # LATIN SMALL LETTER Z WITH ACUTE
+<Multi_key> <apostrophe> <z>   : "ź" U017A # LATIN SMALL LETTER Z WITH ACUTE
+<dead_abovedot> <Z>    : "Ż" U017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE
+<Multi_key> <period> <Z>       : "Ż" U017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE
+<dead_abovedot> <z>    : "ż" U017C # LATIN SMALL LETTER Z WITH DOT ABOVE
+<Multi_key> <period> <z>       : "ż" U017C # LATIN SMALL LETTER Z WITH DOT ABOVE
+<dead_caron> <Z>       : "Ž" U017D # LATIN CAPITAL LETTER Z WITH CARON
+<Multi_key> <c> <Z>    : "Ž" U017D # LATIN CAPITAL LETTER Z WITH CARON
+<dead_caron> <z>       : "ž" U017E # LATIN SMALL LETTER Z WITH CARON
+<Multi_key> <c> <z>    : "ž" U017E # LATIN SMALL LETTER Z WITH CARON
+<Multi_key> <slash> <b>        : "ƀ" U0180 # LATIN SMALL LETTER B WITH STROKE
+<Multi_key> <KP_Divide> <b>    : "ƀ" U0180 # LATIN SMALL LETTER B WITH STROKE
+<Multi_key> <slash> <I>        : "Ɨ" U0197 # LATIN CAPITAL LETTER I WITH STROKE
+<Multi_key> <KP_Divide> <I>    : "Ɨ" U0197 # LATIN CAPITAL LETTER I WITH STROKE
+<dead_horn> <O>        : "Ơ" U01A0 # LATIN CAPITAL LETTER O WITH HORN
+<Multi_key> <plus> <O> : "Ơ" U01A0 # LATIN CAPITAL LETTER O WITH HORN
+<dead_horn> <o>        : "ơ" U01A1 # LATIN SMALL LETTER O WITH HORN
+<Multi_key> <plus> <o> : "ơ" U01A1 # LATIN SMALL LETTER O WITH HORN
+<dead_horn> <U>        : "Ư" U01AF # LATIN CAPITAL LETTER U WITH HORN
+<Multi_key> <plus> <U> : "Ư" U01AF # LATIN CAPITAL LETTER U WITH HORN
+<dead_horn> <u>        : "ư" U01B0 # LATIN SMALL LETTER U WITH HORN
+<Multi_key> <plus> <u> : "ư" U01B0 # LATIN SMALL LETTER U WITH HORN
+<Multi_key> <slash> <Z>        : "Ƶ" U01B5 # LATIN CAPITAL LETTER Z WITH STROKE
+<Multi_key> <KP_Divide> <Z>    : "Ƶ" U01B5 # LATIN CAPITAL LETTER Z WITH STROKE
+<Multi_key> <slash> <z>        : "ƶ" U01B6 # LATIN SMALL LETTER Z WITH STROKE
+<Multi_key> <KP_Divide> <z>    : "ƶ" U01B6 # LATIN SMALL LETTER Z WITH STROKE
+<dead_caron> <A>       : "Ǎ" U01CD # LATIN CAPITAL LETTER A WITH CARON
+<Multi_key> <c> <A>    : "Ǎ" U01CD # LATIN CAPITAL LETTER A WITH CARON
+<dead_caron> <a>       : "ǎ" U01CE # LATIN SMALL LETTER A WITH CARON
+<Multi_key> <c> <a>    : "ǎ" U01CE # LATIN SMALL LETTER A WITH CARON
+<dead_caron> <I>       : "Ǐ" U01CF # LATIN CAPITAL LETTER I WITH CARON
+<Multi_key> <c> <I>    : "Ǐ" U01CF # LATIN CAPITAL LETTER I WITH CARON
+<dead_caron> <i>       : "ǐ" U01D0 # LATIN SMALL LETTER I WITH CARON
+<Multi_key> <c> <i>    : "ǐ" U01D0 # LATIN SMALL LETTER I WITH CARON
+<dead_caron> <O>       : "Ǒ" U01D1 # LATIN CAPITAL LETTER O WITH CARON
+<Multi_key> <c> <O>    : "Ǒ" U01D1 # LATIN CAPITAL LETTER O WITH CARON
+<dead_caron> <o>       : "ǒ" U01D2 # LATIN SMALL LETTER O WITH CARON
+<Multi_key> <c> <o>    : "ǒ" U01D2 # LATIN SMALL LETTER O WITH CARON
+<dead_caron> <U>       : "Ǔ" U01D3 # LATIN CAPITAL LETTER U WITH CARON
+<Multi_key> <c> <U>    : "Ǔ" U01D3 # LATIN CAPITAL LETTER U WITH CARON
+<dead_caron> <u>       : "ǔ" U01D4 # LATIN SMALL LETTER U WITH CARON
+<Multi_key> <c> <u>    : "ǔ" U01D4 # LATIN SMALL LETTER U WITH CARON
+<dead_macron> <Udiaeresis>     : "Ǖ" U01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <Udiaeresis>      : "Ǖ" U01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <Udiaeresis>  : "Ǖ" U01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+<dead_macron> <dead_diaeresis> <U>     : "Ǖ" U01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+<dead_macron> <Multi_key> <quotedbl> <U>       : "Ǖ" U01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <dead_diaeresis> <U>      : "Ǖ" U01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <quotedbl> <U>    : "Ǖ" U01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <dead_diaeresis> <U>  : "Ǖ" U01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <quotedbl> <U>        : "Ǖ" U01D5 # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+<dead_macron> <udiaeresis>     : "ǖ" U01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <udiaeresis>      : "ǖ" U01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <udiaeresis>  : "ǖ" U01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+<dead_macron> <dead_diaeresis> <u>     : "ǖ" U01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+<dead_macron> <Multi_key> <quotedbl> <u>       : "ǖ" U01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <dead_diaeresis> <u>      : "ǖ" U01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <quotedbl> <u>    : "ǖ" U01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <dead_diaeresis> <u>  : "ǖ" U01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <quotedbl> <u>        : "ǖ" U01D6 # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+<dead_acute> <Udiaeresis>      : "Ǘ" U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+<Multi_key> <acute> <Udiaeresis>       : "Ǘ" U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+<Multi_key> <apostrophe> <Udiaeresis>  : "Ǘ" U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+<dead_acute> <dead_diaeresis> <U>      : "Ǘ" U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+<dead_acute> <Multi_key> <quotedbl> <U>        : "Ǘ" U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+<Multi_key> <acute> <dead_diaeresis> <U>       : "Ǘ" U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+<Multi_key> <acute> <quotedbl> <U>     : "Ǘ" U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+<Multi_key> <apostrophe> <dead_diaeresis> <U>  : "Ǘ" U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+<Multi_key> <apostrophe> <quotedbl> <U>        : "Ǘ" U01D7 # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+<dead_acute> <udiaeresis>      : "ǘ" U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+<Multi_key> <acute> <udiaeresis>       : "ǘ" U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+<Multi_key> <apostrophe> <udiaeresis>  : "ǘ" U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+<dead_acute> <dead_diaeresis> <u>      : "ǘ" U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+<dead_acute> <Multi_key> <quotedbl> <u>        : "ǘ" U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+<Multi_key> <acute> <dead_diaeresis> <u>       : "ǘ" U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+<Multi_key> <acute> <quotedbl> <u>     : "ǘ" U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+<Multi_key> <apostrophe> <dead_diaeresis> <u>  : "ǘ" U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+<Multi_key> <apostrophe> <quotedbl> <u>        : "ǘ" U01D8 # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+<dead_caron> <Udiaeresis>      : "Ǚ" U01D9 # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+<Multi_key> <c> <Udiaeresis>   : "Ǚ" U01D9 # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+<dead_caron> <dead_diaeresis> <U>      : "Ǚ" U01D9 # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+<dead_caron> <Multi_key> <quotedbl> <U>        : "Ǚ" U01D9 # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+<Multi_key> <c> <dead_diaeresis> <U>   : "Ǚ" U01D9 # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+<Multi_key> <c> <quotedbl> <U> : "Ǚ" U01D9 # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+<dead_caron> <udiaeresis>      : "ǚ" U01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+<Multi_key> <c> <udiaeresis>   : "ǚ" U01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+<dead_caron> <dead_diaeresis> <u>      : "ǚ" U01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+<dead_caron> <Multi_key> <quotedbl> <u>        : "ǚ" U01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+<Multi_key> <c> <dead_diaeresis> <u>   : "ǚ" U01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+<Multi_key> <c> <quotedbl> <u> : "ǚ" U01DA # LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+<dead_grave> <Udiaeresis>      : "Ǜ" U01DB # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+<Multi_key> <grave> <Udiaeresis>       : "Ǜ" U01DB # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+<dead_grave> <dead_diaeresis> <U>      : "Ǜ" U01DB # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+<dead_grave> <Multi_key> <quotedbl> <U>        : "Ǜ" U01DB # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+<Multi_key> <grave> <dead_diaeresis> <U>       : "Ǜ" U01DB # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+<Multi_key> <grave> <quotedbl> <U>     : "Ǜ" U01DB # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+<dead_grave> <udiaeresis>      : "ǜ" U01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+<Multi_key> <grave> <udiaeresis>       : "ǜ" U01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+<dead_grave> <dead_diaeresis> <u>      : "ǜ" U01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+<dead_grave> <Multi_key> <quotedbl> <u>        : "ǜ" U01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+<Multi_key> <grave> <dead_diaeresis> <u>       : "ǜ" U01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+<Multi_key> <grave> <quotedbl> <u>     : "ǜ" U01DC # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+<dead_macron> <Adiaeresis>     : "Ǟ" U01DE # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <Adiaeresis>      : "Ǟ" U01DE # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <Adiaeresis>  : "Ǟ" U01DE # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+<dead_macron> <dead_diaeresis> <A>     : "Ǟ" U01DE # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+<dead_macron> <Multi_key> <quotedbl> <A>       : "Ǟ" U01DE # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <dead_diaeresis> <A>      : "Ǟ" U01DE # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <quotedbl> <A>    : "Ǟ" U01DE # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <dead_diaeresis> <A>  : "Ǟ" U01DE # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <quotedbl> <A>        : "Ǟ" U01DE # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+<dead_macron> <adiaeresis>     : "ǟ" U01DF # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <adiaeresis>      : "ǟ" U01DF # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <adiaeresis>  : "ǟ" U01DF # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+<dead_macron> <dead_diaeresis> <a>     : "ǟ" U01DF # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+<dead_macron> <Multi_key> <quotedbl> <a>       : "ǟ" U01DF # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <dead_diaeresis> <a>      : "ǟ" U01DF # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <quotedbl> <a>    : "ǟ" U01DF # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <dead_diaeresis> <a>  : "ǟ" U01DF # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <quotedbl> <a>        : "ǟ" U01DF # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+<dead_macron> <U0226>  : "Ǡ" U01E0 # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+<Multi_key> <macron> <U0226>   : "Ǡ" U01E0 # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+<Multi_key> <underscore> <U0226>       : "Ǡ" U01E0 # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+<dead_macron> <dead_abovedot> <A>      : "Ǡ" U01E0 # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+<dead_macron> <Multi_key> <period> <A> : "Ǡ" U01E0 # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+<Multi_key> <macron> <dead_abovedot> <A>       : "Ǡ" U01E0 # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+<Multi_key> <macron> <period> <A>      : "Ǡ" U01E0 # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+<Multi_key> <underscore> <dead_abovedot> <A>   : "Ǡ" U01E0 # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+<Multi_key> <underscore> <period> <A>  : "Ǡ" U01E0 # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+<dead_macron> <U0227>  : "ǡ" U01E1 # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+<Multi_key> <macron> <U0227>   : "ǡ" U01E1 # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+<Multi_key> <underscore> <U0227>       : "ǡ" U01E1 # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+<dead_macron> <dead_abovedot> <a>      : "ǡ" U01E1 # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+<dead_macron> <Multi_key> <period> <a> : "ǡ" U01E1 # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+<Multi_key> <macron> <dead_abovedot> <a>       : "ǡ" U01E1 # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+<Multi_key> <macron> <period> <a>      : "ǡ" U01E1 # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+<Multi_key> <underscore> <dead_abovedot> <a>   : "ǡ" U01E1 # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+<Multi_key> <underscore> <period> <a>  : "ǡ" U01E1 # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+<dead_macron> <AE>     : "Ǣ" U01E2 # LATIN CAPITAL LETTER AE WITH MACRON
+<Multi_key> <macron> <AE>      : "Ǣ" U01E2 # LATIN CAPITAL LETTER AE WITH MACRON
+<Multi_key> <underscore> <AE>  : "Ǣ" U01E2 # LATIN CAPITAL LETTER AE WITH MACRON
+<dead_macron> <ae>     : "ǣ" U01E3 # LATIN SMALL LETTER AE WITH MACRON
+<Multi_key> <macron> <ae>      : "ǣ" U01E3 # LATIN SMALL LETTER AE WITH MACRON
+<Multi_key> <underscore> <ae>  : "ǣ" U01E3 # LATIN SMALL LETTER AE WITH MACRON
+<Multi_key> <slash> <G>        : "Ǥ" U01E4 # LATIN CAPITAL LETTER G WITH STROKE
+<Multi_key> <KP_Divide> <G>    : "Ǥ" U01E4 # LATIN CAPITAL LETTER G WITH STROKE
+<Multi_key> <slash> <g>        : "ǥ" U01E5 # LATIN SMALL LETTER G WITH STROKE
+<Multi_key> <KP_Divide> <g>    : "ǥ" U01E5 # LATIN SMALL LETTER G WITH STROKE
+<dead_caron> <G>       : "Ǧ" U01E6 # LATIN CAPITAL LETTER G WITH CARON
+<Multi_key> <c> <G>    : "Ǧ" U01E6 # LATIN CAPITAL LETTER G WITH CARON
+<dead_caron> <g>       : "ǧ" U01E7 # LATIN SMALL LETTER G WITH CARON
+<Multi_key> <c> <g>    : "ǧ" U01E7 # LATIN SMALL LETTER G WITH CARON
+<dead_caron> <K>       : "Ǩ" U01E8 # LATIN CAPITAL LETTER K WITH CARON
+<Multi_key> <c> <K>    : "Ǩ" U01E8 # LATIN CAPITAL LETTER K WITH CARON
+<dead_caron> <k>       : "ǩ" U01E9 # LATIN SMALL LETTER K WITH CARON
+<Multi_key> <c> <k>    : "ǩ" U01E9 # LATIN SMALL LETTER K WITH CARON
+<dead_ogonek> <O>      : "Ǫ" U01EA # LATIN CAPITAL LETTER O WITH OGONEK
+<Multi_key> <semicolon> <O>    : "Ǫ" U01EA # LATIN CAPITAL LETTER O WITH OGONEK
+<dead_ogonek> <o>      : "ǫ" U01EB # LATIN SMALL LETTER O WITH OGONEK
+<Multi_key> <semicolon> <o>    : "ǫ" U01EB # LATIN SMALL LETTER O WITH OGONEK
+<dead_macron> <U01ea>  : "Ǭ" U01EC # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+<Multi_key> <macron> <U01ea>   : "Ǭ" U01EC # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+<Multi_key> <underscore> <U01ea>       : "Ǭ" U01EC # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+<dead_macron> <dead_ogonek> <O>        : "Ǭ" U01EC # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+<dead_macron> <Multi_key> <semicolon> <O>      : "Ǭ" U01EC # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+<Multi_key> <macron> <dead_ogonek> <O> : "Ǭ" U01EC # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+<Multi_key> <macron> <semicolon> <O>   : "Ǭ" U01EC # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+<Multi_key> <underscore> <dead_ogonek> <O>     : "Ǭ" U01EC # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+<Multi_key> <underscore> <semicolon> <O>       : "Ǭ" U01EC # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+<dead_macron> <U01eb>  : "ǭ" U01ED # LATIN SMALL LETTER O WITH OGONEK AND MACRON
+<Multi_key> <macron> <U01eb>   : "ǭ" U01ED # LATIN SMALL LETTER O WITH OGONEK AND MACRON
+<Multi_key> <underscore> <U01eb>       : "ǭ" U01ED # LATIN SMALL LETTER O WITH OGONEK AND MACRON
+<dead_macron> <dead_ogonek> <o>        : "ǭ" U01ED # LATIN SMALL LETTER O WITH OGONEK AND MACRON
+<dead_macron> <Multi_key> <semicolon> <o>      : "ǭ" U01ED # LATIN SMALL LETTER O WITH OGONEK AND MACRON
+<Multi_key> <macron> <dead_ogonek> <o> : "ǭ" U01ED # LATIN SMALL LETTER O WITH OGONEK AND MACRON
+<Multi_key> <macron> <semicolon> <o>   : "ǭ" U01ED # LATIN SMALL LETTER O WITH OGONEK AND MACRON
+<Multi_key> <underscore> <dead_ogonek> <o>     : "ǭ" U01ED # LATIN SMALL LETTER O WITH OGONEK AND MACRON
+<Multi_key> <underscore> <semicolon> <o>       : "ǭ" U01ED # LATIN SMALL LETTER O WITH OGONEK AND MACRON
+<dead_caron> <EZH>     : "Ǯ" U01EE # LATIN CAPITAL LETTER EZH WITH CARON
+<Multi_key> <c> <EZH>  : "Ǯ" U01EE # LATIN CAPITAL LETTER EZH WITH CARON
+<dead_caron> <ezh>     : "ǯ" U01EF # LATIN SMALL LETTER EZH WITH CARON
+<Multi_key> <c> <ezh>  : "ǯ" U01EF # LATIN SMALL LETTER EZH WITH CARON
+<dead_caron> <j>       : "ǰ" U01F0 # LATIN SMALL LETTER J WITH CARON
+<Multi_key> <c> <j>    : "ǰ" U01F0 # LATIN SMALL LETTER J WITH CARON
+<dead_acute> <G>       : "Ǵ" U01F4 # LATIN CAPITAL LETTER G WITH ACUTE
+<Multi_key> <acute> <G>        : "Ǵ" U01F4 # LATIN CAPITAL LETTER G WITH ACUTE
+<Multi_key> <apostrophe> <G>   : "Ǵ" U01F4 # LATIN CAPITAL LETTER G WITH ACUTE
+<dead_acute> <g>       : "ǵ" U01F5 # LATIN SMALL LETTER G WITH ACUTE
+<Multi_key> <acute> <g>        : "ǵ" U01F5 # LATIN SMALL LETTER G WITH ACUTE
+<Multi_key> <apostrophe> <g>   : "ǵ" U01F5 # LATIN SMALL LETTER G WITH ACUTE
+<dead_grave> <N>       : "Ǹ" U01F8 # LATIN CAPITAL LETTER N WITH GRAVE
+<Multi_key> <grave> <N>        : "Ǹ" U01F8 # LATIN CAPITAL LETTER N WITH GRAVE
+<dead_grave> <n>       : "ǹ" U01F9 # LATIN SMALL LETTER N WITH GRAVE
+<Multi_key> <grave> <n>        : "ǹ" U01F9 # LATIN SMALL LETTER N WITH GRAVE
+<dead_acute> <Aring>   : "Ǻ" U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+<Multi_key> <acute> <Aring>    : "Ǻ" U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+<Multi_key> <apostrophe> <Aring>       : "Ǻ" U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+<dead_acute> <dead_abovering> <A>      : "Ǻ" U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+<dead_acute> <Multi_key> <o> <A>       : "Ǻ" U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+<Multi_key> <acute> <dead_abovering> <A>       : "Ǻ" U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+XCOMM <Multi_key> <acute> <o> <A>      : "Ǻ" U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+<Multi_key> <apostrophe> <dead_abovering> <A>  : "Ǻ" U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+XCOMM <Multi_key> <apostrophe> <o> <A> : "Ǻ" U01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+<dead_acute> <aring>   : "ǻ" U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+<Multi_key> <acute> <aring>    : "ǻ" U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+<Multi_key> <apostrophe> <aring>       : "ǻ" U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+<dead_acute> <dead_abovering> <a>      : "ǻ" U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+<dead_acute> <Multi_key> <o> <a>       : "ǻ" U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+<Multi_key> <acute> <dead_abovering> <a>       : "ǻ" U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+XCOMM <Multi_key> <acute> <o> <a>      : "ǻ" U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+<Multi_key> <apostrophe> <dead_abovering> <a>  : "ǻ" U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+XCOMM <Multi_key> <apostrophe> <o> <a> : "ǻ" U01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+<dead_acute> <AE>      : "Ǽ" U01FC # LATIN CAPITAL LETTER AE WITH ACUTE
+<Multi_key> <acute> <AE>       : "Ǽ" U01FC # LATIN CAPITAL LETTER AE WITH ACUTE
+<Multi_key> <apostrophe> <AE>  : "Ǽ" U01FC # LATIN CAPITAL LETTER AE WITH ACUTE
+<dead_acute> <ae>      : "ǽ" U01FD # LATIN SMALL LETTER AE WITH ACUTE
+<Multi_key> <acute> <ae>       : "ǽ" U01FD # LATIN SMALL LETTER AE WITH ACUTE
+<Multi_key> <apostrophe> <ae>  : "ǽ" U01FD # LATIN SMALL LETTER AE WITH ACUTE
+<dead_acute> <Ooblique>        : "Ǿ" U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+<Multi_key> <acute> <Ooblique> : "Ǿ" U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+<Multi_key> <apostrophe> <Ooblique>    : "Ǿ" U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+<dead_acute> <Multi_key> <slash> <O>   : "Ǿ" U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+<Multi_key> <acute> <slash> <O>        : "Ǿ" U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+<Multi_key> <apostrophe> <slash> <O>   : "Ǿ" U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+<dead_acute> <Multi_key> <KP_Divide> <O>       : "Ǿ" U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+<Multi_key> <acute> <KP_Divide> <O>    : "Ǿ" U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+<Multi_key> <apostrophe> <KP_Divide> <O>       : "Ǿ" U01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+<dead_acute> <oslash>  : "ǿ" U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE
+<Multi_key> <acute> <oslash>   : "ǿ" U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE
+<Multi_key> <apostrophe> <oslash>      : "ǿ" U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE
+<dead_acute> <Multi_key> <slash> <o>   : "ǿ" U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE
+<Multi_key> <acute> <slash> <o>        : "ǿ" U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE
+<Multi_key> <apostrophe> <slash> <o>   : "ǿ" U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE
+<dead_acute> <Multi_key> <KP_Divide> <o>       : "ǿ" U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE
+<Multi_key> <acute> <KP_Divide> <o>    : "ǿ" U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE
+<Multi_key> <apostrophe> <KP_Divide> <o>       : "ǿ" U01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE
+<dead_double_grave> <A>        : "Ȁ" U0200 # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
+<dead_double_grave> <a>        : "ȁ" U0201 # LATIN SMALL LETTER A WITH DOUBLE GRAVE
+<dead_inverted_breve> <A>      : "Ȃ" U0202 # LATIN CAPITAL LETTER A WITH INVERTED BREVE
+<dead_inverted_breve> <a>      : "ȃ" U0203 # LATIN SMALL LETTER A WITH INVERTED BREVE
+<dead_double_grave> <E>        : "Ȅ" U0204 # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
+<dead_double_grave> <e>        : "ȅ" U0205 # LATIN SMALL LETTER E WITH DOUBLE GRAVE
+<dead_inverted_breve> <E>      : "Ȇ" U0206 # LATIN CAPITAL LETTER E WITH INVERTED BREVE
+<dead_inverted_breve> <e>      : "ȇ" U0207 # LATIN SMALL LETTER E WITH INVERTED BREVE
+<dead_double_grave> <I>        : "Ȉ" U0208 # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
+<dead_double_grave> <i>        : "ȉ" U0209 # LATIN SMALL LETTER I WITH DOUBLE GRAVE
+<dead_inverted_breve> <I>      : "Ȋ" U020A # LATIN CAPITAL LETTER I WITH INVERTED BREVE
+<dead_inverted_breve> <i>      : "ȋ" U020B # LATIN SMALL LETTER I WITH INVERTED BREVE
+<dead_double_grave> <O>        : "Ȍ" U020C # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
+<dead_double_grave> <o>        : "ȍ" U020D # LATIN SMALL LETTER O WITH DOUBLE GRAVE
+<dead_inverted_breve> <O>      : "Ȏ" U020E # LATIN CAPITAL LETTER O WITH INVERTED BREVE
+<dead_inverted_breve> <o>      : "ȏ" U020F # LATIN SMALL LETTER O WITH INVERTED BREVE
+<dead_double_grave> <R>        : "Ȑ" U0210 # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
+<dead_double_grave> <r>        : "ȑ" U0211 # LATIN SMALL LETTER R WITH DOUBLE GRAVE
+<dead_inverted_breve> <R>      : "Ȓ" U0212 # LATIN CAPITAL LETTER R WITH INVERTED BREVE
+<dead_inverted_breve> <r>      : "ȓ" U0213 # LATIN SMALL LETTER R WITH INVERTED BREVE
+<dead_double_grave> <U>        : "Ȕ" U0214 # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
+<dead_double_grave> <u>        : "ȕ" U0215 # LATIN SMALL LETTER U WITH DOUBLE GRAVE
+<dead_inverted_breve> <U>      : "Ȗ" U0216 # LATIN CAPITAL LETTER U WITH INVERTED BREVE
+<dead_inverted_breve> <u>      : "ȗ" U0217 # LATIN SMALL LETTER U WITH INVERTED BREVE
+<dead_belowcomma> <S>  : "Ș" U0218 # LATIN CAPITAL LETTER S WITH COMMA BELOW
+<dead_belowcomma> <s>  : "ș" U0219 # LATIN SMALL LETTER S WITH COMMA BELOW
+<dead_belowcomma> <T>  : "Ț" U021A # LATIN CAPITAL LETTER T WITH COMMA BELOW
+<dead_belowcomma> <t>  : "ț" U021B # LATIN SMALL LETTER T WITH COMMA BELOW
+<dead_caron> <H>       : "Ȟ" U021E # LATIN CAPITAL LETTER H WITH CARON
+<Multi_key> <c> <H>    : "Ȟ" U021E # LATIN CAPITAL LETTER H WITH CARON
+<dead_caron> <h>       : "ȟ" U021F # LATIN SMALL LETTER H WITH CARON
+<Multi_key> <c> <h>    : "ȟ" U021F # LATIN SMALL LETTER H WITH CARON
+<dead_abovedot> <A>    : "Ȧ" U0226 # LATIN CAPITAL LETTER A WITH DOT ABOVE
+<Multi_key> <period> <A>       : "Ȧ" U0226 # LATIN CAPITAL LETTER A WITH DOT ABOVE
+<dead_abovedot> <a>    : "ȧ" U0227 # LATIN SMALL LETTER A WITH DOT ABOVE
+<Multi_key> <period> <a>       : "ȧ" U0227 # LATIN SMALL LETTER A WITH DOT ABOVE
+<dead_cedilla> <E>     : "Ȩ" U0228 # LATIN CAPITAL LETTER E WITH CEDILLA
+<Multi_key> <comma> <E>        : "Ȩ" U0228 # LATIN CAPITAL LETTER E WITH CEDILLA
+<Multi_key> <cedilla> <E>      : "Ȩ" U0228 # LATIN CAPITAL LETTER E WITH CEDILLA
+<dead_cedilla> <e>     : "ȩ" U0229 # LATIN SMALL LETTER E WITH CEDILLA
+<Multi_key> <comma> <e>        : "ȩ" U0229 # LATIN SMALL LETTER E WITH CEDILLA
+<Multi_key> <cedilla> <e>      : "ȩ" U0229 # LATIN SMALL LETTER E WITH CEDILLA
+<dead_macron> <Odiaeresis>     : "Ȫ" U022A # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <Odiaeresis>      : "Ȫ" U022A # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <Odiaeresis>  : "Ȫ" U022A # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+<dead_macron> <dead_diaeresis> <O>     : "Ȫ" U022A # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+<dead_macron> <Multi_key> <quotedbl> <O>       : "Ȫ" U022A # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <dead_diaeresis> <O>      : "Ȫ" U022A # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <quotedbl> <O>    : "Ȫ" U022A # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <dead_diaeresis> <O>  : "Ȫ" U022A # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <quotedbl> <O>        : "Ȫ" U022A # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
+<dead_macron> <odiaeresis>     : "ȫ" U022B # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <odiaeresis>      : "ȫ" U022B # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <odiaeresis>  : "ȫ" U022B # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+<dead_macron> <dead_diaeresis> <o>     : "ȫ" U022B # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+<dead_macron> <Multi_key> <quotedbl> <o>       : "ȫ" U022B # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <dead_diaeresis> <o>      : "ȫ" U022B # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+<Multi_key> <macron> <quotedbl> <o>    : "ȫ" U022B # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <dead_diaeresis> <o>  : "ȫ" U022B # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+<Multi_key> <underscore> <quotedbl> <o>        : "ȫ" U022B # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON
+<dead_macron> <Otilde> : "Ȭ" U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+<Multi_key> <macron> <Otilde>  : "Ȭ" U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+<Multi_key> <underscore> <Otilde>      : "Ȭ" U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+<dead_macron> <dead_tilde> <O> : "Ȭ" U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+<dead_macron> <Multi_key> <asciitilde> <O>     : "Ȭ" U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+<Multi_key> <macron> <dead_tilde> <O>  : "Ȭ" U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+<Multi_key> <macron> <asciitilde> <O>  : "Ȭ" U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+<Multi_key> <underscore> <dead_tilde> <O>      : "Ȭ" U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+<Multi_key> <underscore> <asciitilde> <O>      : "Ȭ" U022C # LATIN CAPITAL LETTER O WITH TILDE AND MACRON
+<dead_macron> <otilde> : "ȭ" U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON
+<Multi_key> <macron> <otilde>  : "ȭ" U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON
+<Multi_key> <underscore> <otilde>      : "ȭ" U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON
+<dead_macron> <dead_tilde> <o> : "ȭ" U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON
+<dead_macron> <Multi_key> <asciitilde> <o>     : "ȭ" U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON
+<Multi_key> <macron> <dead_tilde> <o>  : "ȭ" U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON
+<Multi_key> <macron> <asciitilde> <o>  : "ȭ" U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON
+<Multi_key> <underscore> <dead_tilde> <o>      : "ȭ" U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON
+<Multi_key> <underscore> <asciitilde> <o>      : "ȭ" U022D # LATIN SMALL LETTER O WITH TILDE AND MACRON
+<dead_abovedot> <O>    : "Ȯ" U022E # LATIN CAPITAL LETTER O WITH DOT ABOVE
+<Multi_key> <period> <O>       : "Ȯ" U022E # LATIN CAPITAL LETTER O WITH DOT ABOVE
+<dead_abovedot> <o>    : "ȯ" U022F # LATIN SMALL LETTER O WITH DOT ABOVE
+<Multi_key> <period> <o>       : "ȯ" U022F # LATIN SMALL LETTER O WITH DOT ABOVE
+<dead_macron> <U022e>  : "Ȱ" U0230 # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+<Multi_key> <macron> <U022e>   : "Ȱ" U0230 # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+<Multi_key> <underscore> <U022e>       : "Ȱ" U0230 # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+<dead_macron> <dead_abovedot> <O>      : "Ȱ" U0230 # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+<dead_macron> <Multi_key> <period> <O> : "Ȱ" U0230 # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+<Multi_key> <macron> <dead_abovedot> <O>       : "Ȱ" U0230 # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+<Multi_key> <macron> <period> <O>      : "Ȱ" U0230 # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+<Multi_key> <underscore> <dead_abovedot> <O>   : "Ȱ" U0230 # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+<Multi_key> <underscore> <period> <O>  : "Ȱ" U0230 # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
+<dead_macron> <U022f>  : "ȱ" U0231 # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+<Multi_key> <macron> <U022f>   : "ȱ" U0231 # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+<Multi_key> <underscore> <U022f>       : "ȱ" U0231 # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+<dead_macron> <dead_abovedot> <o>      : "ȱ" U0231 # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+<dead_macron> <Multi_key> <period> <o> : "ȱ" U0231 # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+<Multi_key> <macron> <dead_abovedot> <o>       : "ȱ" U0231 # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+<Multi_key> <macron> <period> <o>      : "ȱ" U0231 # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+<Multi_key> <underscore> <dead_abovedot> <o>   : "ȱ" U0231 # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+<Multi_key> <underscore> <period> <o>  : "ȱ" U0231 # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON
+<dead_macron> <Y>      : "Ȳ" U0232 # LATIN CAPITAL LETTER Y WITH MACRON
+<Multi_key> <macron> <Y>       : "Ȳ" U0232 # LATIN CAPITAL LETTER Y WITH MACRON
+<Multi_key> <underscore> <Y>   : "Ȳ" U0232 # LATIN CAPITAL LETTER Y WITH MACRON
+<dead_macron> <y>      : "ȳ" U0233 # LATIN SMALL LETTER Y WITH MACRON
+<Multi_key> <macron> <y>       : "ȳ" U0233 # LATIN SMALL LETTER Y WITH MACRON
+<Multi_key> <underscore> <y>   : "ȳ" U0233 # LATIN SMALL LETTER Y WITH MACRON
+<Multi_key> <slash> <i>        : "ɨ" U0268 # LATIN SMALL LETTER I WITH STROKE
+<Multi_key> <KP_Divide> <i>    : "ɨ" U0268 # LATIN SMALL LETTER I WITH STROKE
+<Multi_key> <slash> <U0294>    : "ʡ" U02A1 # LATIN LETTER GLOTTAL STOP WITH STROKE
+<Multi_key> <KP_Divide> <U0294>        : "ʡ" U02A1 # LATIN LETTER GLOTTAL STOP WITH STROKE
+<dead_circumflex> <Multi_key> <underscore> <h> : "ʰ" U02B0 # MODIFIER LETTER SMALL H
+<Multi_key> <asciicircum> <underscore> <h>     : "ʰ" U02B0 # MODIFIER LETTER SMALL H
+<dead_circumflex> <Multi_key> <underbar> <h>   : "ʰ" U02B0 # MODIFIER LETTER SMALL H
+<Multi_key> <asciicircum> <underbar> <h>       : "ʰ" U02B0 # MODIFIER LETTER SMALL H
+<dead_circumflex> <Multi_key> <underscore> <U0266>     : "ʱ" U02B1 # MODIFIER LETTER SMALL H WITH HOOK
+<Multi_key> <asciicircum> <underscore> <U0266> : "ʱ" U02B1 # MODIFIER LETTER SMALL H WITH HOOK
+<dead_circumflex> <Multi_key> <underbar> <U0266>       : "ʱ" U02B1 # MODIFIER LETTER SMALL H WITH HOOK
+<Multi_key> <asciicircum> <underbar> <U0266>   : "ʱ" U02B1 # MODIFIER LETTER SMALL H WITH HOOK
+<dead_circumflex> <Multi_key> <underscore> <j> : "ʲ" U02B2 # MODIFIER LETTER SMALL J
+<Multi_key> <asciicircum> <underscore> <j>     : "ʲ" U02B2 # MODIFIER LETTER SMALL J
+<dead_circumflex> <Multi_key> <underbar> <j>   : "ʲ" U02B2 # MODIFIER LETTER SMALL J
+<Multi_key> <asciicircum> <underbar> <j>       : "ʲ" U02B2 # MODIFIER LETTER SMALL J
+<dead_circumflex> <Multi_key> <underscore> <r> : "ʳ" U02B3 # MODIFIER LETTER SMALL R
+<Multi_key> <asciicircum> <underscore> <r>     : "ʳ" U02B3 # MODIFIER LETTER SMALL R
+<dead_circumflex> <Multi_key> <underbar> <r>   : "ʳ" U02B3 # MODIFIER LETTER SMALL R
+<Multi_key> <asciicircum> <underbar> <r>       : "ʳ" U02B3 # MODIFIER LETTER SMALL R
+<dead_circumflex> <Multi_key> <underscore> <U0279>     : "ʴ" U02B4 # MODIFIER LETTER SMALL TURNED R
+<Multi_key> <asciicircum> <underscore> <U0279> : "ʴ" U02B4 # MODIFIER LETTER SMALL TURNED R
+<dead_circumflex> <Multi_key> <underbar> <U0279>       : "ʴ" U02B4 # MODIFIER LETTER SMALL TURNED R
+<Multi_key> <asciicircum> <underbar> <U0279>   : "ʴ" U02B4 # MODIFIER LETTER SMALL TURNED R
+<dead_circumflex> <Multi_key> <underscore> <U027b>     : "ʵ" U02B5 # MODIFIER LETTER SMALL TURNED R WITH HOOK
+<Multi_key> <asciicircum> <underscore> <U027b> : "ʵ" U02B5 # MODIFIER LETTER SMALL TURNED R WITH HOOK
+<dead_circumflex> <Multi_key> <underbar> <U027b>       : "ʵ" U02B5 # MODIFIER LETTER SMALL TURNED R WITH HOOK
+<Multi_key> <asciicircum> <underbar> <U027b>   : "ʵ" U02B5 # MODIFIER LETTER SMALL TURNED R WITH HOOK
+<dead_circumflex> <Multi_key> <underscore> <U0281>     : "ʶ" U02B6 # MODIFIER LETTER SMALL CAPITAL INVERTED R
+<Multi_key> <asciicircum> <underscore> <U0281> : "ʶ" U02B6 # MODIFIER LETTER SMALL CAPITAL INVERTED R
+<dead_circumflex> <Multi_key> <underbar> <U0281>       : "ʶ" U02B6 # MODIFIER LETTER SMALL CAPITAL INVERTED R
+<Multi_key> <asciicircum> <underbar> <U0281>   : "ʶ" U02B6 # MODIFIER LETTER SMALL CAPITAL INVERTED R
+<dead_circumflex> <Multi_key> <underscore> <w> : "ʷ" U02B7 # MODIFIER LETTER SMALL W
+<Multi_key> <asciicircum> <underscore> <w>     : "ʷ" U02B7 # MODIFIER LETTER SMALL W
+<dead_circumflex> <Multi_key> <underbar> <w>   : "ʷ" U02B7 # MODIFIER LETTER SMALL W
+<Multi_key> <asciicircum> <underbar> <w>       : "ʷ" U02B7 # MODIFIER LETTER SMALL W
+<dead_circumflex> <Multi_key> <underscore> <y> : "ʸ" U02B8 # MODIFIER LETTER SMALL Y
+<Multi_key> <asciicircum> <underscore> <y>     : "ʸ" U02B8 # MODIFIER LETTER SMALL Y
+<dead_circumflex> <Multi_key> <underbar> <y>   : "ʸ" U02B8 # MODIFIER LETTER SMALL Y
+<Multi_key> <asciicircum> <underbar> <y>       : "ʸ" U02B8 # MODIFIER LETTER SMALL Y
+<dead_circumflex> <Multi_key> <underscore> <U0263>     : "ˠ" U02E0 # MODIFIER LETTER SMALL GAMMA
+<Multi_key> <asciicircum> <underscore> <U0263> : "ˠ" U02E0 # MODIFIER LETTER SMALL GAMMA
+<dead_circumflex> <Multi_key> <underbar> <U0263>       : "ˠ" U02E0 # MODIFIER LETTER SMALL GAMMA
+<Multi_key> <asciicircum> <underbar> <U0263>   : "ˠ" U02E0 # MODIFIER LETTER SMALL GAMMA
+<dead_circumflex> <Multi_key> <underscore> <l> : "ˡ" U02E1 # MODIFIER LETTER SMALL L
+<Multi_key> <asciicircum> <underscore> <l>     : "ˡ" U02E1 # MODIFIER LETTER SMALL L
+<dead_circumflex> <Multi_key> <underbar> <l>   : "ˡ" U02E1 # MODIFIER LETTER SMALL L
+<Multi_key> <asciicircum> <underbar> <l>       : "ˡ" U02E1 # MODIFIER LETTER SMALL L
+<dead_circumflex> <Multi_key> <underscore> <s> : "ˢ" U02E2 # MODIFIER LETTER SMALL S
+<Multi_key> <asciicircum> <underscore> <s>     : "ˢ" U02E2 # MODIFIER LETTER SMALL S
+<dead_circumflex> <Multi_key> <underbar> <s>   : "ˢ" U02E2 # MODIFIER LETTER SMALL S
+<Multi_key> <asciicircum> <underbar> <s>       : "ˢ" U02E2 # MODIFIER LETTER SMALL S
+<dead_circumflex> <Multi_key> <underscore> <x> : "ˣ" U02E3 # MODIFIER LETTER SMALL X
+<Multi_key> <asciicircum> <underscore> <x>     : "ˣ" U02E3 # MODIFIER LETTER SMALL X
+<dead_circumflex> <Multi_key> <underbar> <x>   : "ˣ" U02E3 # MODIFIER LETTER SMALL X
+<Multi_key> <asciicircum> <underbar> <x>       : "ˣ" U02E3 # MODIFIER LETTER SMALL X
+<dead_circumflex> <Multi_key> <underscore> <U0295>     : "ˤ" U02E4 # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+<Multi_key> <asciicircum> <underscore> <U0295> : "ˤ" U02E4 # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+<dead_circumflex> <Multi_key> <underbar> <U0295>       : "ˤ" U02E4 # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+<Multi_key> <asciicircum> <underbar> <U0295>   : "ˤ" U02E4 # MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+<dead_diaeresis> <acute>       : "̈́" U0344 # COMBINING GREEK DIALYTIKA TONOS
+<dead_diaeresis> <apostrophe>  : "̈́" U0344 # COMBINING GREEK DIALYTIKA TONOS
+<Multi_key> <quotedbl> <dead_acute>    : "̈́" U0344 # COMBINING GREEK DIALYTIKA TONOS
+<Multi_key> <quotedbl> <acute> : "̈́" U0344 # COMBINING GREEK DIALYTIKA TONOS
+<Multi_key> <quotedbl> <apostrophe>    : "̈́" U0344 # COMBINING GREEK DIALYTIKA TONOS
+<Multi_key> <diaeresis> <dead_acute>   : "΅" U0385 # GREEK DIALYTIKA TONOS
+<Multi_key> <diaeresis> <acute>        : "΅" U0385 # GREEK DIALYTIKA TONOS
+<Multi_key> <diaeresis> <apostrophe>   : "΅" U0385 # GREEK DIALYTIKA TONOS
+<dead_acute> <Greek_ALPHA>     : "Ά" U0386 # GREEK CAPITAL LETTER ALPHA WITH TONOS
+<Multi_key> <acute> <Greek_ALPHA>      : "Ά" U0386 # GREEK CAPITAL LETTER ALPHA WITH TONOS
+<Multi_key> <apostrophe> <Greek_ALPHA> : "Ά" U0386 # GREEK CAPITAL LETTER ALPHA WITH TONOS
+<dead_acute> <Greek_EPSILON>   : "Έ" U0388 # GREEK CAPITAL LETTER EPSILON WITH TONOS
+<Multi_key> <acute> <Greek_EPSILON>    : "Έ" U0388 # GREEK CAPITAL LETTER EPSILON WITH TONOS
+<Multi_key> <apostrophe> <Greek_EPSILON>       : "Έ" U0388 # GREEK CAPITAL LETTER EPSILON WITH TONOS
+<dead_acute> <Greek_ETA>       : "Ή" U0389 # GREEK CAPITAL LETTER ETA WITH TONOS
+<Multi_key> <acute> <Greek_ETA>        : "Ή" U0389 # GREEK CAPITAL LETTER ETA WITH TONOS
+<Multi_key> <apostrophe> <Greek_ETA>   : "Ή" U0389 # GREEK CAPITAL LETTER ETA WITH TONOS
+<dead_acute> <Greek_IOTA>      : "Ί" U038A # GREEK CAPITAL LETTER IOTA WITH TONOS
+<Multi_key> <acute> <Greek_IOTA>       : "Ί" U038A # GREEK CAPITAL LETTER IOTA WITH TONOS
+<Multi_key> <apostrophe> <Greek_IOTA>  : "Ί" U038A # GREEK CAPITAL LETTER IOTA WITH TONOS
+<dead_acute> <Greek_OMICRON>   : "Ό" U038C # GREEK CAPITAL LETTER OMICRON WITH TONOS
+<Multi_key> <acute> <Greek_OMICRON>    : "Ό" U038C # GREEK CAPITAL LETTER OMICRON WITH TONOS
+<Multi_key> <apostrophe> <Greek_OMICRON>       : "Ό" U038C # GREEK CAPITAL LETTER OMICRON WITH TONOS
+<dead_acute> <Greek_UPSILON>   : "Ύ" U038E # GREEK CAPITAL LETTER UPSILON WITH TONOS
+<Multi_key> <acute> <Greek_UPSILON>    : "Ύ" U038E # GREEK CAPITAL LETTER UPSILON WITH TONOS
+<Multi_key> <apostrophe> <Greek_UPSILON>       : "Ύ" U038E # GREEK CAPITAL LETTER UPSILON WITH TONOS
+<dead_acute> <Greek_OMEGA>     : "Ώ" U038F # GREEK CAPITAL LETTER OMEGA WITH TONOS
+<Multi_key> <acute> <Greek_OMEGA>      : "Ώ" U038F # GREEK CAPITAL LETTER OMEGA WITH TONOS
+<Multi_key> <apostrophe> <Greek_OMEGA> : "Ώ" U038F # GREEK CAPITAL LETTER OMEGA WITH TONOS
+<dead_acute> <Greek_iotadieresis>      : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+<Multi_key> <acute> <Greek_iotadieresis>       : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+<Multi_key> <apostrophe> <Greek_iotadieresis>  : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+<dead_acute> <dead_diaeresis> <Greek_iota>     : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+<dead_acute> <Multi_key> <quotedbl> <Greek_iota>       : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+<Multi_key> <acute> <dead_diaeresis> <Greek_iota>      : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+<Multi_key> <acute> <quotedbl> <Greek_iota>    : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+<Multi_key> <apostrophe> <dead_diaeresis> <Greek_iota> : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+<Multi_key> <apostrophe> <quotedbl> <Greek_iota>       : "ΐ" U0390 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+<dead_diaeresis> <Greek_IOTA>  : "Ϊ" U03AA # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+<Multi_key> <quotedbl> <Greek_IOTA>    : "Ϊ" U03AA # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+<dead_diaeresis> <Greek_UPSILON>       : "Ϋ" U03AB # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+<Multi_key> <quotedbl> <Greek_UPSILON> : "Ϋ" U03AB # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+<dead_acute> <Greek_alpha>     : "ά" U03AC # GREEK SMALL LETTER ALPHA WITH TONOS
+<Multi_key> <acute> <Greek_alpha>      : "ά" U03AC # GREEK SMALL LETTER ALPHA WITH TONOS
+<Multi_key> <apostrophe> <Greek_alpha> : "ά" U03AC # GREEK SMALL LETTER ALPHA WITH TONOS
+<dead_acute> <Greek_epsilon>   : "έ" U03AD # GREEK SMALL LETTER EPSILON WITH TONOS
+<Multi_key> <acute> <Greek_epsilon>    : "έ" U03AD # GREEK SMALL LETTER EPSILON WITH TONOS
+<Multi_key> <apostrophe> <Greek_epsilon>       : "έ" U03AD # GREEK SMALL LETTER EPSILON WITH TONOS
+<dead_acute> <Greek_eta>       : "ή" U03AE # GREEK SMALL LETTER ETA WITH TONOS
+<Multi_key> <acute> <Greek_eta>        : "ή" U03AE # GREEK SMALL LETTER ETA WITH TONOS
+<Multi_key> <apostrophe> <Greek_eta>   : "ή" U03AE # GREEK SMALL LETTER ETA WITH TONOS
+<dead_acute> <Greek_iota>      : "ί" U03AF # GREEK SMALL LETTER IOTA WITH TONOS
+<Multi_key> <acute> <Greek_iota>       : "ί" U03AF # GREEK SMALL LETTER IOTA WITH TONOS
+<Multi_key> <apostrophe> <Greek_iota>  : "ί" U03AF # GREEK SMALL LETTER IOTA WITH TONOS
+<dead_acute> <Greek_upsilondieresis>   : "ΰ" U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+<Multi_key> <acute> <Greek_upsilondieresis>    : "ΰ" U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+<Multi_key> <apostrophe> <Greek_upsilondieresis>       : "ΰ" U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+<dead_acute> <dead_diaeresis> <Greek_upsilon>  : "ΰ" U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+<dead_acute> <Multi_key> <quotedbl> <Greek_upsilon>    : "ΰ" U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+<Multi_key> <acute> <dead_diaeresis> <Greek_upsilon>   : "ΰ" U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+<Multi_key> <acute> <quotedbl> <Greek_upsilon> : "ΰ" U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+<Multi_key> <apostrophe> <dead_diaeresis> <Greek_upsilon>      : "ΰ" U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+<Multi_key> <apostrophe> <quotedbl> <Greek_upsilon>    : "ΰ" U03B0 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+<dead_diaeresis> <Greek_iota>  : "ϊ" U03CA # GREEK SMALL LETTER IOTA WITH DIALYTIKA
+<Multi_key> <quotedbl> <Greek_iota>    : "ϊ" U03CA # GREEK SMALL LETTER IOTA WITH DIALYTIKA
+<dead_diaeresis> <Greek_upsilon>       : "ϋ" U03CB # GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+<Multi_key> <quotedbl> <Greek_upsilon> : "ϋ" U03CB # GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+<dead_acute> <Greek_omicron>   : "ό" U03CC # GREEK SMALL LETTER OMICRON WITH TONOS
+<Multi_key> <acute> <Greek_omicron>    : "ό" U03CC # GREEK SMALL LETTER OMICRON WITH TONOS
+<Multi_key> <apostrophe> <Greek_omicron>       : "ό" U03CC # GREEK SMALL LETTER OMICRON WITH TONOS
+<dead_acute> <Greek_upsilon>   : "ύ" U03CD # GREEK SMALL LETTER UPSILON WITH TONOS
+<Multi_key> <acute> <Greek_upsilon>    : "ύ" U03CD # GREEK SMALL LETTER UPSILON WITH TONOS
+<Multi_key> <apostrophe> <Greek_upsilon>       : "ύ" U03CD # GREEK SMALL LETTER UPSILON WITH TONOS
+<dead_acute> <Greek_omega>     : "ώ" U03CE # GREEK SMALL LETTER OMEGA WITH TONOS
+<Multi_key> <acute> <Greek_omega>      : "ώ" U03CE # GREEK SMALL LETTER OMEGA WITH TONOS
+<Multi_key> <apostrophe> <Greek_omega> : "ώ" U03CE # GREEK SMALL LETTER OMEGA WITH TONOS
+<Multi_key> <acute> <U03d2>    : "ϓ" U03D3 # GREEK UPSILON WITH ACUTE AND HOOK SYMBOL
+<Multi_key> <apostrophe> <U03d2>       : "ϓ" U03D3 # GREEK UPSILON WITH ACUTE AND HOOK SYMBOL
+<Multi_key> <quotedbl> <U03d2> : "ϔ" U03D4 # GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL
+<dead_grave> <Cyrillic_IE>     : "Ѐ" U0400 # CYRILLIC CAPITAL LETTER IE WITH GRAVE
+<Multi_key> <grave> <Cyrillic_IE>      : "Ѐ" U0400 # CYRILLIC CAPITAL LETTER IE WITH GRAVE
+<dead_diaeresis> <Cyrillic_IE> : "Ё" U0401 # CYRILLIC CAPITAL LETTER IO
+<Multi_key> <quotedbl> <Cyrillic_IE>   : "Ё" U0401 # CYRILLIC CAPITAL LETTER IO
+<dead_acute> <Cyrillic_GHE>    : "Ѓ" U0403 # CYRILLIC CAPITAL LETTER GJE
+<Multi_key> <acute> <Cyrillic_GHE>     : "Ѓ" U0403 # CYRILLIC CAPITAL LETTER GJE
+<Multi_key> <apostrophe> <Cyrillic_GHE>        : "Ѓ" U0403 # CYRILLIC CAPITAL LETTER GJE
+<dead_diaeresis> <Ukrainian_I> : "Ї" U0407 # CYRILLIC CAPITAL LETTER YI
+<Multi_key> <quotedbl> <Ukrainian_I>   : "Ї" U0407 # CYRILLIC CAPITAL LETTER YI
+<dead_acute> <Cyrillic_KA>     : "Ќ" U040C # CYRILLIC CAPITAL LETTER KJE
+<Multi_key> <acute> <Cyrillic_KA>      : "Ќ" U040C # CYRILLIC CAPITAL LETTER KJE
+<Multi_key> <apostrophe> <Cyrillic_KA> : "Ќ" U040C # CYRILLIC CAPITAL LETTER KJE
+<dead_grave> <Cyrillic_I>      : "Ѝ" U040D # CYRILLIC CAPITAL LETTER I WITH GRAVE
+<Multi_key> <grave> <Cyrillic_I>       : "Ѝ" U040D # CYRILLIC CAPITAL LETTER I WITH GRAVE
+<dead_breve> <Cyrillic_U>      : "Ў" U040E # CYRILLIC CAPITAL LETTER SHORT U
+<Multi_key> <U> <Cyrillic_U>   : "Ў" U040E # CYRILLIC CAPITAL LETTER SHORT U
+<Multi_key> <b> <Cyrillic_U>   : "Ў" U040E # CYRILLIC CAPITAL LETTER SHORT U
+<dead_breve> <Cyrillic_I>      : "Й" U0419 # CYRILLIC CAPITAL LETTER SHORT I
+<Multi_key> <U> <Cyrillic_I>   : "Й" U0419 # CYRILLIC CAPITAL LETTER SHORT I
+<Multi_key> <b> <Cyrillic_I>   : "Й" U0419 # CYRILLIC CAPITAL LETTER SHORT I
+<dead_breve> <Cyrillic_i>      : "й" U0439 # CYRILLIC SMALL LETTER SHORT I
+<Multi_key> <U> <Cyrillic_i>   : "й" U0439 # CYRILLIC SMALL LETTER SHORT I
+<Multi_key> <b> <Cyrillic_i>   : "й" U0439 # CYRILLIC SMALL LETTER SHORT I
+<dead_grave> <Cyrillic_ie>     : "ѐ" U0450 # CYRILLIC SMALL LETTER IE WITH GRAVE
+<Multi_key> <grave> <Cyrillic_ie>      : "ѐ" U0450 # CYRILLIC SMALL LETTER IE WITH GRAVE
+<dead_diaeresis> <Cyrillic_ie> : "ё" U0451 # CYRILLIC SMALL LETTER IO
+<Multi_key> <quotedbl> <Cyrillic_ie>   : "ё" U0451 # CYRILLIC SMALL LETTER IO
+<dead_acute> <Cyrillic_ghe>    : "ѓ" U0453 # CYRILLIC SMALL LETTER GJE
+<Multi_key> <acute> <Cyrillic_ghe>     : "ѓ" U0453 # CYRILLIC SMALL LETTER GJE
+<Multi_key> <apostrophe> <Cyrillic_ghe>        : "ѓ" U0453 # CYRILLIC SMALL LETTER GJE
+<dead_diaeresis> <Ukrainian_i> : "ї" U0457 # CYRILLIC SMALL LETTER YI
+<Multi_key> <quotedbl> <Ukrainian_i>   : "ї" U0457 # CYRILLIC SMALL LETTER YI
+<dead_acute> <Cyrillic_ka>     : "ќ" U045C # CYRILLIC SMALL LETTER KJE
+<Multi_key> <acute> <Cyrillic_ka>      : "ќ" U045C # CYRILLIC SMALL LETTER KJE
+<Multi_key> <apostrophe> <Cyrillic_ka> : "ќ" U045C # CYRILLIC SMALL LETTER KJE
+<dead_grave> <Cyrillic_i>      : "ѝ" U045D # CYRILLIC SMALL LETTER I WITH GRAVE
+<Multi_key> <grave> <Cyrillic_i>       : "ѝ" U045D # CYRILLIC SMALL LETTER I WITH GRAVE
+<dead_breve> <Cyrillic_u>      : "ў" U045E # CYRILLIC SMALL LETTER SHORT U
+<Multi_key> <U> <Cyrillic_u>   : "ў" U045E # CYRILLIC SMALL LETTER SHORT U
+<Multi_key> <b> <Cyrillic_u>   : "ў" U045E # CYRILLIC SMALL LETTER SHORT U
+<dead_double_grave> <U0474>    : "Ѷ" U0476 # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+<dead_double_grave> <U0475>    : "ѷ" U0477 # CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+<Multi_key> <slash> <Cyrillic_GHE>     : "Ғ" U0492 # CYRILLIC CAPITAL LETTER GHE WITH STROKE
+<Multi_key> <KP_Divide> <Cyrillic_GHE> : "Ғ" U0492 # CYRILLIC CAPITAL LETTER GHE WITH STROKE
+<Multi_key> <slash> <Cyrillic_ghe>     : "ғ" U0493 # CYRILLIC SMALL LETTER GHE WITH STROKE
+<Multi_key> <KP_Divide> <Cyrillic_ghe> : "ғ" U0493 # CYRILLIC SMALL LETTER GHE WITH STROKE
+<Multi_key> <slash> <Cyrillic_KA>      : "Ҟ" U049E # CYRILLIC CAPITAL LETTER KA WITH STROKE
+<Multi_key> <KP_Divide> <Cyrillic_KA>  : "Ҟ" U049E # CYRILLIC CAPITAL LETTER KA WITH STROKE
+<Multi_key> <slash> <Cyrillic_ka>      : "ҟ" U049F # CYRILLIC SMALL LETTER KA WITH STROKE
+<Multi_key> <KP_Divide> <Cyrillic_ka>  : "ҟ" U049F # CYRILLIC SMALL LETTER KA WITH STROKE
+<Multi_key> <slash> <U04ae>    : "Ұ" U04B0 # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+<Multi_key> <KP_Divide> <U04ae>        : "Ұ" U04B0 # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
+<Multi_key> <slash> <U04af>    : "ұ" U04B1 # CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+<Multi_key> <KP_Divide> <U04af>        : "ұ" U04B1 # CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE
+<dead_breve> <Cyrillic_ZHE>    : "Ӂ" U04C1 # CYRILLIC CAPITAL LETTER ZHE WITH BREVE
+<Multi_key> <U> <Cyrillic_ZHE> : "Ӂ" U04C1 # CYRILLIC CAPITAL LETTER ZHE WITH BREVE
+<Multi_key> <b> <Cyrillic_ZHE> : "Ӂ" U04C1 # CYRILLIC CAPITAL LETTER ZHE WITH BREVE
+<dead_breve> <Cyrillic_zhe>    : "ӂ" U04C2 # CYRILLIC SMALL LETTER ZHE WITH BREVE
+<Multi_key> <U> <Cyrillic_zhe> : "ӂ" U04C2 # CYRILLIC SMALL LETTER ZHE WITH BREVE
+<Multi_key> <b> <Cyrillic_zhe> : "ӂ" U04C2 # CYRILLIC SMALL LETTER ZHE WITH BREVE
+<dead_breve> <Cyrillic_A>      : "Ӑ" U04D0 # CYRILLIC CAPITAL LETTER A WITH BREVE
+<Multi_key> <U> <Cyrillic_A>   : "Ӑ" U04D0 # CYRILLIC CAPITAL LETTER A WITH BREVE
+<Multi_key> <b> <Cyrillic_A>   : "Ӑ" U04D0 # CYRILLIC CAPITAL LETTER A WITH BREVE
+<dead_breve> <Cyrillic_a>      : "ӑ" U04D1 # CYRILLIC SMALL LETTER A WITH BREVE
+<Multi_key> <U> <Cyrillic_a>   : "ӑ" U04D1 # CYRILLIC SMALL LETTER A WITH BREVE
+<Multi_key> <b> <Cyrillic_a>   : "ӑ" U04D1 # CYRILLIC SMALL LETTER A WITH BREVE
+<dead_diaeresis> <Cyrillic_A>  : "Ӓ" U04D2 # CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_A>    : "Ӓ" U04D2 # CYRILLIC CAPITAL LETTER A WITH DIAERESIS
+<dead_diaeresis> <Cyrillic_a>  : "ӓ" U04D3 # CYRILLIC SMALL LETTER A WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_a>    : "ӓ" U04D3 # CYRILLIC SMALL LETTER A WITH DIAERESIS
+<dead_breve> <Cyrillic_IE>     : "Ӗ" U04D6 # CYRILLIC CAPITAL LETTER IE WITH BREVE
+<Multi_key> <U> <Cyrillic_IE>  : "Ӗ" U04D6 # CYRILLIC CAPITAL LETTER IE WITH BREVE
+<Multi_key> <b> <Cyrillic_IE>  : "Ӗ" U04D6 # CYRILLIC CAPITAL LETTER IE WITH BREVE
+<dead_breve> <Cyrillic_ie>     : "ӗ" U04D7 # CYRILLIC SMALL LETTER IE WITH BREVE
+<Multi_key> <U> <Cyrillic_ie>  : "ӗ" U04D7 # CYRILLIC SMALL LETTER IE WITH BREVE
+<Multi_key> <b> <Cyrillic_ie>  : "ӗ" U04D7 # CYRILLIC SMALL LETTER IE WITH BREVE
+<dead_diaeresis> <U04d8>       : "Ӛ" U04DA # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+<Multi_key> <quotedbl> <U04d8> : "Ӛ" U04DA # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
+<dead_diaeresis> <U04d9>       : "ӛ" U04DB # CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+<Multi_key> <quotedbl> <U04d9> : "ӛ" U04DB # CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS
+<dead_diaeresis> <Cyrillic_ZHE>        : "Ӝ" U04DC # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_ZHE>  : "Ӝ" U04DC # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
+<dead_diaeresis> <Cyrillic_zhe>        : "ӝ" U04DD # CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_zhe>  : "ӝ" U04DD # CYRILLIC SMALL LETTER ZHE WITH DIAERESIS
+<dead_diaeresis> <Cyrillic_ZE> : "Ӟ" U04DE # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_ZE>   : "Ӟ" U04DE # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
+<dead_diaeresis> <Cyrillic_ze> : "ӟ" U04DF # CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_ze>   : "ӟ" U04DF # CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+<dead_macron> <Cyrillic_I>     : "Ӣ" U04E2 # CYRILLIC CAPITAL LETTER I WITH MACRON
+<Multi_key> <macron> <Cyrillic_I>      : "Ӣ" U04E2 # CYRILLIC CAPITAL LETTER I WITH MACRON
+<Multi_key> <underscore> <Cyrillic_I>  : "Ӣ" U04E2 # CYRILLIC CAPITAL LETTER I WITH MACRON
+<dead_macron> <Cyrillic_i>     : "ӣ" U04E3 # CYRILLIC SMALL LETTER I WITH MACRON
+<Multi_key> <macron> <Cyrillic_i>      : "ӣ" U04E3 # CYRILLIC SMALL LETTER I WITH MACRON
+<Multi_key> <underscore> <Cyrillic_i>  : "ӣ" U04E3 # CYRILLIC SMALL LETTER I WITH MACRON
+<dead_diaeresis> <Cyrillic_I>  : "Ӥ" U04E4 # CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_I>    : "Ӥ" U04E4 # CYRILLIC CAPITAL LETTER I WITH DIAERESIS
+<dead_diaeresis> <Cyrillic_i>  : "ӥ" U04E5 # CYRILLIC SMALL LETTER I WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_i>    : "ӥ" U04E5 # CYRILLIC SMALL LETTER I WITH DIAERESIS
+<dead_diaeresis> <Cyrillic_O>  : "Ӧ" U04E6 # CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_O>    : "Ӧ" U04E6 # CYRILLIC CAPITAL LETTER O WITH DIAERESIS
+<dead_diaeresis> <Cyrillic_o>  : "ӧ" U04E7 # CYRILLIC SMALL LETTER O WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_o>    : "ӧ" U04E7 # CYRILLIC SMALL LETTER O WITH DIAERESIS
+<dead_diaeresis> <U04e8>       : "Ӫ" U04EA # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+<Multi_key> <quotedbl> <U04e8> : "Ӫ" U04EA # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
+<dead_diaeresis> <U04e9>       : "ӫ" U04EB # CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+<Multi_key> <quotedbl> <U04e9> : "ӫ" U04EB # CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS
+<dead_diaeresis> <Cyrillic_E>  : "Ӭ" U04EC # CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_E>    : "Ӭ" U04EC # CYRILLIC CAPITAL LETTER E WITH DIAERESIS
+<dead_diaeresis> <Cyrillic_e>  : "ӭ" U04ED # CYRILLIC SMALL LETTER E WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_e>    : "ӭ" U04ED # CYRILLIC SMALL LETTER E WITH DIAERESIS
+<dead_macron> <Cyrillic_U>     : "Ӯ" U04EE # CYRILLIC CAPITAL LETTER U WITH MACRON
+<Multi_key> <macron> <Cyrillic_U>      : "Ӯ" U04EE # CYRILLIC CAPITAL LETTER U WITH MACRON
+<Multi_key> <underscore> <Cyrillic_U>  : "Ӯ" U04EE # CYRILLIC CAPITAL LETTER U WITH MACRON
+<dead_macron> <Cyrillic_u>     : "ӯ" U04EF # CYRILLIC SMALL LETTER U WITH MACRON
+<Multi_key> <macron> <Cyrillic_u>      : "ӯ" U04EF # CYRILLIC SMALL LETTER U WITH MACRON
+<Multi_key> <underscore> <Cyrillic_u>  : "ӯ" U04EF # CYRILLIC SMALL LETTER U WITH MACRON
+<dead_diaeresis> <Cyrillic_U>  : "Ӱ" U04F0 # CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_U>    : "Ӱ" U04F0 # CYRILLIC CAPITAL LETTER U WITH DIAERESIS
+<dead_diaeresis> <Cyrillic_u>  : "ӱ" U04F1 # CYRILLIC SMALL LETTER U WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_u>    : "ӱ" U04F1 # CYRILLIC SMALL LETTER U WITH DIAERESIS
+<dead_doubleacute> <Cyrillic_U>        : "Ӳ" U04F2 # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+<Multi_key> <equal> <Cyrillic_U>       : "Ӳ" U04F2 # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
+<dead_doubleacute> <Cyrillic_u>        : "ӳ" U04F3 # CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+<Multi_key> <equal> <Cyrillic_u>       : "ӳ" U04F3 # CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE
+<dead_diaeresis> <Cyrillic_CHE>        : "Ӵ" U04F4 # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_CHE>  : "Ӵ" U04F4 # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
+<dead_diaeresis> <Cyrillic_che>        : "ӵ" U04F5 # CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_che>  : "ӵ" U04F5 # CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+<dead_diaeresis> <Cyrillic_YERU>       : "Ӹ" U04F8 # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_YERU> : "Ӹ" U04F8 # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
+<dead_diaeresis> <Cyrillic_yeru>       : "ӹ" U04F9 # CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+<Multi_key> <quotedbl> <Cyrillic_yeru> : "ӹ" U04F9 # CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+<Multi_key> <U0653> <Arabic_alef>      : "آ" U0622 # ARABIC LETTER ALEF WITH MADDA ABOVE
+<Multi_key> <U0654> <Arabic_alef>      : "أ" U0623 # ARABIC LETTER ALEF WITH HAMZA ABOVE
+<Multi_key> <U0654> <Arabic_waw>       : "ؤ" U0624 # ARABIC LETTER WAW WITH HAMZA ABOVE
+<Multi_key> <U0655> <Arabic_alef>      : "إ" U0625 # ARABIC LETTER ALEF WITH HAMZA BELOW
+<Multi_key> <U0654> <Arabic_yeh>       : "ئ" U0626 # ARABIC LETTER YEH WITH HAMZA ABOVE
+<Multi_key> <U0654> <U06d5>    : "ۀ" U06C0 # ARABIC LETTER HEH WITH YEH ABOVE
+<Multi_key> <U0654> <U06c1>    : "ۂ" U06C2 # ARABIC LETTER HEH GOAL WITH HAMZA ABOVE
+<Multi_key> <U0654> <U06d2>    : "ۓ" U06D3 # ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+<Multi_key> <U093c> <U0928>    : "ऩ" U0929 # DEVANAGARI LETTER NNNA
+<Multi_key> <U093c> <U0930>    : "ऱ" U0931 # DEVANAGARI LETTER RRA
+<Multi_key> <U093c> <U0933>    : "ऴ" U0934 # DEVANAGARI LETTER LLLA
+<Multi_key> <U093c> <U0915>    : "क़" U0958 # DEVANAGARI LETTER QA
+<Multi_key> <U093c> <U0916>    : "ख़" U0959 # DEVANAGARI LETTER KHHA
+<Multi_key> <U093c> <U0917>    : "ग़" U095A # DEVANAGARI LETTER GHHA
+<Multi_key> <U093c> <U091c>    : "ज़" U095B # DEVANAGARI LETTER ZA
+<Multi_key> <U093c> <U0921>    : "ड़" U095C # DEVANAGARI LETTER DDDHA
+<Multi_key> <U093c> <U0922>    : "ढ़" U095D # DEVANAGARI LETTER RHA
+<Multi_key> <U093c> <U092b>    : "फ़" U095E # DEVANAGARI LETTER FA
+<Multi_key> <U093c> <U092f>    : "य़" U095F # DEVANAGARI LETTER YYA
+<Multi_key> <U09c7> <U09be>    : "ো" U09CB # BENGALI VOWEL SIGN O
+<Multi_key> <U09c7> <U09d7>    : "ৌ" U09CC # BENGALI VOWEL SIGN AU
+<Multi_key> <U09bc> <U09a1>    : "ড়" U09DC # BENGALI LETTER RRA
+<Multi_key> <U09bc> <U09a2>    : "ঢ়" U09DD # BENGALI LETTER RHA
+<Multi_key> <U09bc> <U09af>    : "য়" U09DF # BENGALI LETTER YYA
+<Multi_key> <U0a3c> <U0a32>    : "ਲ਼" U0A33 # GURMUKHI LETTER LLA
+<Multi_key> <U0a3c> <U0a38>    : "ਸ਼" U0A36 # GURMUKHI LETTER SHA
+<Multi_key> <U0a3c> <U0a16>    : "ਖ਼" U0A59 # GURMUKHI LETTER KHHA
+<Multi_key> <U0a3c> <U0a17>    : "ਗ਼" U0A5A # GURMUKHI LETTER GHHA
+<Multi_key> <U0a3c> <U0a1c>    : "ਜ਼" U0A5B # GURMUKHI LETTER ZA
+<Multi_key> <U0a3c> <U0a2b>    : "ਫ਼" U0A5E # GURMUKHI LETTER FA
+<Multi_key> <U0b47> <U0b56>    : "ୈ" U0B48 # ORIYA VOWEL SIGN AI
+<Multi_key> <U0b47> <U0b3e>    : "ୋ" U0B4B # ORIYA VOWEL SIGN O
+<Multi_key> <U0b47> <U0b57>    : "ୌ" U0B4C # ORIYA VOWEL SIGN AU
+<Multi_key> <U0b3c> <U0b21>    : "ଡ଼" U0B5C # ORIYA LETTER RRA
+<Multi_key> <U0b3c> <U0b22>    : "ଢ଼" U0B5D # ORIYA LETTER RHA
+<Multi_key> <U0bd7> <U0b92>    : "ஔ" U0B94 # TAMIL LETTER AU
+<Multi_key> <U0bc6> <U0bbe>    : "ொ" U0BCA # TAMIL VOWEL SIGN O
+<Multi_key> <U0bc7> <U0bbe>    : "ோ" U0BCB # TAMIL VOWEL SIGN OO
+<Multi_key> <U0bc6> <U0bd7>    : "ௌ" U0BCC # TAMIL VOWEL SIGN AU
+<Multi_key> <U0c46> <U0c56>    : "ై" U0C48 # TELUGU VOWEL SIGN AI
+<Multi_key> <U0cbf> <U0cd5>    : "ೀ" U0CC0 # KANNADA VOWEL SIGN II
+<Multi_key> <U0cc6> <U0cd5>    : "ೇ" U0CC7 # KANNADA VOWEL SIGN EE
+<Multi_key> <U0cc6> <U0cd6>    : "ೈ" U0CC8 # KANNADA VOWEL SIGN AI
+<Multi_key> <U0cc6> <U0cc2>    : "ೊ" U0CCA # KANNADA VOWEL SIGN O
+<Multi_key> <U0cca> <U0cd5>    : "ೋ" U0CCB # KANNADA VOWEL SIGN OO
+<Multi_key> <U0d46> <U0d3e>    : "ൊ" U0D4A # MALAYALAM VOWEL SIGN O
+<Multi_key> <U0d47> <U0d3e>    : "ോ" U0D4B # MALAYALAM VOWEL SIGN OO
+<Multi_key> <U0d46> <U0d57>    : "ൌ" U0D4C # MALAYALAM VOWEL SIGN AU
+<Multi_key> <U0dd9> <U0dca>    : "ේ" U0DDA # SINHALA VOWEL SIGN DIGA KOMBUVA
+<Multi_key> <U0dd9> <U0dcf>    : "ො" U0DDC # SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA
+<Multi_key> <U0ddc> <U0dca>    : "ෝ" U0DDD # SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA
+<Multi_key> <U0dd9> <U0ddf>    : "ෞ" U0DDE # SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
+<Multi_key> <U0fb7> <U0f42>    : "གྷ" U0F43 # TIBETAN LETTER GHA
+<Multi_key> <U0fb7> <U0f4c>    : "ཌྷ" U0F4D # TIBETAN LETTER DDHA
+<Multi_key> <U0fb7> <U0f51>    : "དྷ" U0F52 # TIBETAN LETTER DHA
+<Multi_key> <U0fb7> <U0f56>    : "བྷ" U0F57 # TIBETAN LETTER BHA
+<Multi_key> <U0fb7> <U0f5b>    : "ཛྷ" U0F5C # TIBETAN LETTER DZHA
+<Multi_key> <U0fb5> <U0f40>    : "ཀྵ" U0F69 # TIBETAN LETTER KSSA
+<Multi_key> <U0f71> <U0f72>    : "ཱི" U0F73 # TIBETAN VOWEL SIGN II
+<Multi_key> <U0f71> <U0f74>    : "ཱུ" U0F75 # TIBETAN VOWEL SIGN UU
+<Multi_key> <U0fb2> <U0f80>    : "ྲྀ" U0F76 # TIBETAN VOWEL SIGN VOCALIC R
+<Multi_key> <U0fb3> <U0f80>    : "ླྀ" U0F78 # TIBETAN VOWEL SIGN VOCALIC L
+<Multi_key> <U0f71> <U0f80>    : "ཱྀ" U0F81 # TIBETAN VOWEL SIGN REVERSED II
+<Multi_key> <U0f92> <U0fb7>    : "ྒྷ" U0F93 # TIBETAN SUBJOINED LETTER GHA
+<Multi_key> <U0f9c> <U0fb7>    : "ྜྷ" U0F9D # TIBETAN SUBJOINED LETTER DDHA
+<Multi_key> <U0fa1> <U0fb7>    : "ྡྷ" U0FA2 # TIBETAN SUBJOINED LETTER DHA
+<Multi_key> <U0fa6> <U0fb7>    : "ྦྷ" U0FA7 # TIBETAN SUBJOINED LETTER BHA
+<Multi_key> <U0fab> <U0fb7>    : "ྫྷ" U0FAC # TIBETAN SUBJOINED LETTER DZHA
+<Multi_key> <U0f90> <U0fb5>    : "ྐྵ" U0FB9 # TIBETAN SUBJOINED LETTER KSSA
+<Multi_key> <U102e> <U1025>    : "ဦ" U1026 # MYANMAR LETTER UU
+<dead_belowring> <A>   : "Ḁ" U1E00 # LATIN CAPITAL LETTER A WITH RING BELOW
+<dead_belowring> <a>   : "ḁ" U1E01 # LATIN SMALL LETTER A WITH RING BELOW
+<dead_abovedot> <B>    : "Ḃ" U1E02 # LATIN CAPITAL LETTER B WITH DOT ABOVE
+<Multi_key> <period> <B>       : "Ḃ" U1E02 # LATIN CAPITAL LETTER B WITH DOT ABOVE
+<dead_abovedot> <b>    : "ḃ" U1E03 # LATIN SMALL LETTER B WITH DOT ABOVE
+<Multi_key> <period> <b>       : "ḃ" U1E03 # LATIN SMALL LETTER B WITH DOT ABOVE
+<dead_belowdot> <B>    : "Ḅ" U1E04 # LATIN CAPITAL LETTER B WITH DOT BELOW
+<Multi_key> <exclam> <B>       : "Ḅ" U1E04 # LATIN CAPITAL LETTER B WITH DOT BELOW
+<dead_belowdot> <b>    : "ḅ" U1E05 # LATIN SMALL LETTER B WITH DOT BELOW
+<Multi_key> <exclam> <b>       : "ḅ" U1E05 # LATIN SMALL LETTER B WITH DOT BELOW
+<dead_belowmacron> <B> : "Ḇ" U1E06 # LATIN CAPITAL LETTER B WITH LINE BELOW
+<dead_belowmacron> <b> : "ḇ" U1E07 # LATIN SMALL LETTER B WITH LINE BELOW
+<dead_acute> <Ccedilla>        : "Ḉ" U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+<Multi_key> <acute> <Ccedilla> : "Ḉ" U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+<Multi_key> <apostrophe> <Ccedilla>    : "Ḉ" U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+<dead_acute> <dead_cedilla> <C>        : "Ḉ" U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+<dead_acute> <Multi_key> <comma> <C>   : "Ḉ" U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+<dead_acute> <Multi_key> <cedilla> <C> : "Ḉ" U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+<Multi_key> <acute> <dead_cedilla> <C> : "Ḉ" U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+<Multi_key> <acute> <comma> <C>        : "Ḉ" U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+<Multi_key> <acute> <cedilla> <C>      : "Ḉ" U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+<Multi_key> <apostrophe> <dead_cedilla> <C>    : "Ḉ" U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+XCOMM <Multi_key> <apostrophe> <comma> <C>     : "Ḉ" U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+<Multi_key> <apostrophe> <cedilla> <C> : "Ḉ" U1E08 # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+<dead_acute> <ccedilla>        : "ḉ" U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+<Multi_key> <acute> <ccedilla> : "ḉ" U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+<Multi_key> <apostrophe> <ccedilla>    : "ḉ" U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+<dead_acute> <dead_cedilla> <c>        : "ḉ" U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+<dead_acute> <Multi_key> <comma> <c>   : "ḉ" U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+<dead_acute> <Multi_key> <cedilla> <c> : "ḉ" U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+<Multi_key> <acute> <dead_cedilla> <c> : "ḉ" U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+<Multi_key> <acute> <comma> <c>        : "ḉ" U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+<Multi_key> <acute> <cedilla> <c>      : "ḉ" U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+<Multi_key> <apostrophe> <dead_cedilla> <c>    : "ḉ" U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+XCOMM <Multi_key> <apostrophe> <comma> <c>     : "ḉ" U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+<Multi_key> <apostrophe> <cedilla> <c> : "ḉ" U1E09 # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+<dead_abovedot> <D>    : "Ḋ" U1E0A # LATIN CAPITAL LETTER D WITH DOT ABOVE
+<Multi_key> <period> <D>       : "Ḋ" U1E0A # LATIN CAPITAL LETTER D WITH DOT ABOVE
+<dead_abovedot> <d>    : "ḋ" U1E0B # LATIN SMALL LETTER D WITH DOT ABOVE
+<Multi_key> <period> <d>       : "ḋ" U1E0B # LATIN SMALL LETTER D WITH DOT ABOVE
+<dead_belowdot> <D>    : "Ḍ" U1E0C # LATIN CAPITAL LETTER D WITH DOT BELOW
+<Multi_key> <exclam> <D>       : "Ḍ" U1E0C # LATIN CAPITAL LETTER D WITH DOT BELOW
+<dead_belowdot> <d>    : "ḍ" U1E0D # LATIN SMALL LETTER D WITH DOT BELOW
+<Multi_key> <exclam> <d>       : "ḍ" U1E0D # LATIN SMALL LETTER D WITH DOT BELOW
+<dead_belowmacron> <D> : "Ḏ" U1E0E # LATIN CAPITAL LETTER D WITH LINE BELOW
+<dead_belowmacron> <d> : "ḏ" U1E0F # LATIN SMALL LETTER D WITH LINE BELOW
+<dead_cedilla> <D>     : "Ḑ" U1E10 # LATIN CAPITAL LETTER D WITH CEDILLA
+<Multi_key> <comma> <D>        : "Ḑ" U1E10 # LATIN CAPITAL LETTER D WITH CEDILLA
+<Multi_key> <cedilla> <D>      : "Ḑ" U1E10 # LATIN CAPITAL LETTER D WITH CEDILLA
+<dead_cedilla> <d>     : "ḑ" U1E11 # LATIN SMALL LETTER D WITH CEDILLA
+<Multi_key> <comma> <d>        : "ḑ" U1E11 # LATIN SMALL LETTER D WITH CEDILLA
+<Multi_key> <cedilla> <d>      : "ḑ" U1E11 # LATIN SMALL LETTER D WITH CEDILLA
+<dead_belowcircumflex> <D>     : "Ḓ" U1E12 # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
+<dead_belowcircumflex> <d>     : "ḓ" U1E13 # LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW
+<dead_grave> <Emacron> : "Ḕ" U1E14 # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+<Multi_key> <grave> <Emacron>  : "Ḕ" U1E14 # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+<dead_grave> <dead_macron> <E> : "Ḕ" U1E14 # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+<dead_grave> <Multi_key> <macron> <E>  : "Ḕ" U1E14 # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+<dead_grave> <Multi_key> <underscore> <E>      : "Ḕ" U1E14 # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+<Multi_key> <grave> <dead_macron> <E>  : "Ḕ" U1E14 # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+<Multi_key> <grave> <macron> <E>       : "Ḕ" U1E14 # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+<Multi_key> <grave> <underscore> <E>   : "Ḕ" U1E14 # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+<dead_grave> <emacron> : "ḕ" U1E15 # LATIN SMALL LETTER E WITH MACRON AND GRAVE
+<Multi_key> <grave> <emacron>  : "ḕ" U1E15 # LATIN SMALL LETTER E WITH MACRON AND GRAVE
+<dead_grave> <dead_macron> <e> : "ḕ" U1E15 # LATIN SMALL LETTER E WITH MACRON AND GRAVE
+<dead_grave> <Multi_key> <macron> <e>  : "ḕ" U1E15 # LATIN SMALL LETTER E WITH MACRON AND GRAVE
+<dead_grave> <Multi_key> <underscore> <e>      : "ḕ" U1E15 # LATIN SMALL LETTER E WITH MACRON AND GRAVE
+<Multi_key> <grave> <dead_macron> <e>  : "ḕ" U1E15 # LATIN SMALL LETTER E WITH MACRON AND GRAVE
+<Multi_key> <grave> <macron> <e>       : "ḕ" U1E15 # LATIN SMALL LETTER E WITH MACRON AND GRAVE
+<Multi_key> <grave> <underscore> <e>   : "ḕ" U1E15 # LATIN SMALL LETTER E WITH MACRON AND GRAVE
+<dead_acute> <Emacron> : "Ḗ" U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <acute> <Emacron>  : "Ḗ" U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <Emacron>     : "Ḗ" U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+<dead_acute> <dead_macron> <E> : "Ḗ" U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+<dead_acute> <Multi_key> <macron> <E>  : "Ḗ" U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+<dead_acute> <Multi_key> <underscore> <E>      : "Ḗ" U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <acute> <dead_macron> <E>  : "Ḗ" U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <acute> <macron> <E>       : "Ḗ" U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <acute> <underscore> <E>   : "Ḗ" U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <dead_macron> <E>     : "Ḗ" U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <macron> <E>  : "Ḗ" U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <underscore> <E>      : "Ḗ" U1E16 # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+<dead_acute> <emacron> : "ḗ" U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <acute> <emacron>  : "ḗ" U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <emacron>     : "ḗ" U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE
+<dead_acute> <dead_macron> <e> : "ḗ" U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE
+<dead_acute> <Multi_key> <macron> <e>  : "ḗ" U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE
+<dead_acute> <Multi_key> <underscore> <e>      : "ḗ" U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <acute> <dead_macron> <e>  : "ḗ" U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <acute> <macron> <e>       : "ḗ" U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <acute> <underscore> <e>   : "ḗ" U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <dead_macron> <e>     : "ḗ" U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <macron> <e>  : "ḗ" U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <underscore> <e>      : "ḗ" U1E17 # LATIN SMALL LETTER E WITH MACRON AND ACUTE
+<dead_belowcircumflex> <E>     : "Ḙ" U1E18 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
+<dead_belowcircumflex> <e>     : "ḙ" U1E19 # LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW
+<dead_belowtilde> <E>  : "Ḛ" U1E1A # LATIN CAPITAL LETTER E WITH TILDE BELOW
+<dead_belowtilde> <e>  : "ḛ" U1E1B # LATIN SMALL LETTER E WITH TILDE BELOW
+<dead_breve> <U0228>   : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <U> <U0228>        : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <b> <U0228>        : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+<dead_breve> <dead_cedilla> <E>        : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+<dead_breve> <Multi_key> <comma> <E>   : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+<dead_breve> <Multi_key> <cedilla> <E> : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <U> <dead_cedilla> <E>     : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <U> <comma> <E>    : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <U> <cedilla> <E>  : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <b> <dead_cedilla> <E>     : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <b> <comma> <E>    : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <b> <cedilla> <E>  : "Ḝ" U1E1C # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+<dead_breve> <U0229>   : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <U> <U0229>        : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <b> <U0229>        : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+<dead_breve> <dead_cedilla> <e>        : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+<dead_breve> <Multi_key> <comma> <e>   : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+<dead_breve> <Multi_key> <cedilla> <e> : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <U> <dead_cedilla> <e>     : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <U> <comma> <e>    : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <U> <cedilla> <e>  : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <b> <dead_cedilla> <e>     : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <b> <comma> <e>    : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+<Multi_key> <b> <cedilla> <e>  : "ḝ" U1E1D # LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+<dead_abovedot> <F>    : "Ḟ" U1E1E # LATIN CAPITAL LETTER F WITH DOT ABOVE
+<Multi_key> <period> <F>       : "Ḟ" U1E1E # LATIN CAPITAL LETTER F WITH DOT ABOVE
+<dead_abovedot> <f>    : "ḟ" U1E1F # LATIN SMALL LETTER F WITH DOT ABOVE
+<Multi_key> <period> <f>       : "ḟ" U1E1F # LATIN SMALL LETTER F WITH DOT ABOVE
+<dead_macron> <G>      : "Ḡ" U1E20 # LATIN CAPITAL LETTER G WITH MACRON
+<Multi_key> <macron> <G>       : "Ḡ" U1E20 # LATIN CAPITAL LETTER G WITH MACRON
+<Multi_key> <underscore> <G>   : "Ḡ" U1E20 # LATIN CAPITAL LETTER G WITH MACRON
+<dead_macron> <g>      : "ḡ" U1E21 # LATIN SMALL LETTER G WITH MACRON
+<Multi_key> <macron> <g>       : "ḡ" U1E21 # LATIN SMALL LETTER G WITH MACRON
+<Multi_key> <underscore> <g>   : "ḡ" U1E21 # LATIN SMALL LETTER G WITH MACRON
+<dead_abovedot> <H>    : "Ḣ" U1E22 # LATIN CAPITAL LETTER H WITH DOT ABOVE
+<Multi_key> <period> <H>       : "Ḣ" U1E22 # LATIN CAPITAL LETTER H WITH DOT ABOVE
+<dead_abovedot> <h>    : "ḣ" U1E23 # LATIN SMALL LETTER H WITH DOT ABOVE
+<Multi_key> <period> <h>       : "ḣ" U1E23 # LATIN SMALL LETTER H WITH DOT ABOVE
+<dead_belowdot> <H>    : "Ḥ" U1E24 # LATIN CAPITAL LETTER H WITH DOT BELOW
+<Multi_key> <exclam> <H>       : "Ḥ" U1E24 # LATIN CAPITAL LETTER H WITH DOT BELOW
+<dead_belowdot> <h>    : "ḥ" U1E25 # LATIN SMALL LETTER H WITH DOT BELOW
+<Multi_key> <exclam> <h>       : "ḥ" U1E25 # LATIN SMALL LETTER H WITH DOT BELOW
+<dead_diaeresis> <H>   : "Ḧ" U1E26 # LATIN CAPITAL LETTER H WITH DIAERESIS
+<Multi_key> <quotedbl> <H>     : "Ḧ" U1E26 # LATIN CAPITAL LETTER H WITH DIAERESIS
+<dead_diaeresis> <h>   : "ḧ" U1E27 # LATIN SMALL LETTER H WITH DIAERESIS
+<Multi_key> <quotedbl> <h>     : "ḧ" U1E27 # LATIN SMALL LETTER H WITH DIAERESIS
+<dead_cedilla> <H>     : "Ḩ" U1E28 # LATIN CAPITAL LETTER H WITH CEDILLA
+<Multi_key> <comma> <H>        : "Ḩ" U1E28 # LATIN CAPITAL LETTER H WITH CEDILLA
+<Multi_key> <cedilla> <H>      : "Ḩ" U1E28 # LATIN CAPITAL LETTER H WITH CEDILLA
+<dead_cedilla> <h>     : "ḩ" U1E29 # LATIN SMALL LETTER H WITH CEDILLA
+<Multi_key> <comma> <h>        : "ḩ" U1E29 # LATIN SMALL LETTER H WITH CEDILLA
+<Multi_key> <cedilla> <h>      : "ḩ" U1E29 # LATIN SMALL LETTER H WITH CEDILLA
+<dead_belowbreve> <H>  : "Ḫ" U1E2A # LATIN CAPITAL LETTER H WITH BREVE BELOW
+<dead_belowbreve> <h>  : "ḫ" U1E2B # LATIN SMALL LETTER H WITH BREVE BELOW
+<dead_belowtilde> <I>  : "Ḭ" U1E2C # LATIN CAPITAL LETTER I WITH TILDE BELOW
+<dead_belowtilde> <i>  : "ḭ" U1E2D # LATIN SMALL LETTER I WITH TILDE BELOW
+<dead_acute> <Idiaeresis>      : "Ḯ" U1E2E # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+<Multi_key> <acute> <Idiaeresis>       : "Ḯ" U1E2E # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+<Multi_key> <apostrophe> <Idiaeresis>  : "Ḯ" U1E2E # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+<dead_acute> <dead_diaeresis> <I>      : "Ḯ" U1E2E # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+<dead_acute> <Multi_key> <quotedbl> <I>        : "Ḯ" U1E2E # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+<Multi_key> <acute> <dead_diaeresis> <I>       : "Ḯ" U1E2E # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+<Multi_key> <acute> <quotedbl> <I>     : "Ḯ" U1E2E # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+<Multi_key> <apostrophe> <dead_diaeresis> <I>  : "Ḯ" U1E2E # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+<Multi_key> <apostrophe> <quotedbl> <I>        : "Ḯ" U1E2E # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+<dead_acute> <idiaeresis>      : "ḯ" U1E2F # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+<Multi_key> <acute> <idiaeresis>       : "ḯ" U1E2F # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+<Multi_key> <apostrophe> <idiaeresis>  : "ḯ" U1E2F # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+<dead_acute> <dead_diaeresis> <i>      : "ḯ" U1E2F # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+<dead_acute> <Multi_key> <quotedbl> <i>        : "ḯ" U1E2F # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+<Multi_key> <acute> <dead_diaeresis> <i>       : "ḯ" U1E2F # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+<Multi_key> <acute> <quotedbl> <i>     : "ḯ" U1E2F # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+<Multi_key> <apostrophe> <dead_diaeresis> <i>  : "ḯ" U1E2F # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+<Multi_key> <apostrophe> <quotedbl> <i>        : "ḯ" U1E2F # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+<dead_acute> <K>       : "Ḱ" U1E30 # LATIN CAPITAL LETTER K WITH ACUTE
+<Multi_key> <acute> <K>        : "Ḱ" U1E30 # LATIN CAPITAL LETTER K WITH ACUTE
+<Multi_key> <apostrophe> <K>   : "Ḱ" U1E30 # LATIN CAPITAL LETTER K WITH ACUTE
+<dead_acute> <k>       : "ḱ" U1E31 # LATIN SMALL LETTER K WITH ACUTE
+<Multi_key> <acute> <k>        : "ḱ" U1E31 # LATIN SMALL LETTER K WITH ACUTE
+<Multi_key> <apostrophe> <k>   : "ḱ" U1E31 # LATIN SMALL LETTER K WITH ACUTE
+<dead_belowdot> <K>    : "Ḳ" U1E32 # LATIN CAPITAL LETTER K WITH DOT BELOW
+<Multi_key> <exclam> <K>       : "Ḳ" U1E32 # LATIN CAPITAL LETTER K WITH DOT BELOW
+<dead_belowdot> <k>    : "ḳ" U1E33 # LATIN SMALL LETTER K WITH DOT BELOW
+<Multi_key> <exclam> <k>       : "ḳ" U1E33 # LATIN SMALL LETTER K WITH DOT BELOW
+<dead_belowmacron> <K> : "Ḵ" U1E34 # LATIN CAPITAL LETTER K WITH LINE BELOW
+<dead_belowmacron> <k> : "ḵ" U1E35 # LATIN SMALL LETTER K WITH LINE BELOW
+<dead_belowdot> <L>    : "Ḷ" U1E36 # LATIN CAPITAL LETTER L WITH DOT BELOW
+<Multi_key> <exclam> <L>       : "Ḷ" U1E36 # LATIN CAPITAL LETTER L WITH DOT BELOW
+<dead_belowdot> <l>    : "ḷ" U1E37 # LATIN SMALL LETTER L WITH DOT BELOW
+<Multi_key> <exclam> <l>       : "ḷ" U1E37 # LATIN SMALL LETTER L WITH DOT BELOW
+<dead_macron> <U1e36>  : "Ḹ" U1E38 # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+<Multi_key> <macron> <U1e36>   : "Ḹ" U1E38 # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+<Multi_key> <underscore> <U1e36>       : "Ḹ" U1E38 # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+<dead_macron> <dead_belowdot> <L>      : "Ḹ" U1E38 # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+<dead_macron> <Multi_key> <exclam> <L> : "Ḹ" U1E38 # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+<Multi_key> <macron> <dead_belowdot> <L>       : "Ḹ" U1E38 # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+<Multi_key> <macron> <exclam> <L>      : "Ḹ" U1E38 # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+<Multi_key> <underscore> <dead_belowdot> <L>   : "Ḹ" U1E38 # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+<Multi_key> <underscore> <exclam> <L>  : "Ḹ" U1E38 # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+<dead_macron> <U1e37>  : "ḹ" U1E39 # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+<Multi_key> <macron> <U1e37>   : "ḹ" U1E39 # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+<Multi_key> <underscore> <U1e37>       : "ḹ" U1E39 # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+<dead_macron> <dead_belowdot> <l>      : "ḹ" U1E39 # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+<dead_macron> <Multi_key> <exclam> <l> : "ḹ" U1E39 # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+<Multi_key> <macron> <dead_belowdot> <l>       : "ḹ" U1E39 # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+<Multi_key> <macron> <exclam> <l>      : "ḹ" U1E39 # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+<Multi_key> <underscore> <dead_belowdot> <l>   : "ḹ" U1E39 # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+<Multi_key> <underscore> <exclam> <l>  : "ḹ" U1E39 # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+<dead_belowmacron> <L> : "Ḻ" U1E3A # LATIN CAPITAL LETTER L WITH LINE BELOW
+<dead_belowmacron> <l> : "ḻ" U1E3B # LATIN SMALL LETTER L WITH LINE BELOW
+<dead_belowcircumflex> <L>     : "Ḽ" U1E3C # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
+<dead_belowcircumflex> <l>     : "ḽ" U1E3D # LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW
+<dead_acute> <M>       : "Ḿ" U1E3E # LATIN CAPITAL LETTER M WITH ACUTE
+<Multi_key> <acute> <M>        : "Ḿ" U1E3E # LATIN CAPITAL LETTER M WITH ACUTE
+<Multi_key> <apostrophe> <M>   : "Ḿ" U1E3E # LATIN CAPITAL LETTER M WITH ACUTE
+<dead_acute> <m>       : "ḿ" U1E3F # LATIN SMALL LETTER M WITH ACUTE
+<Multi_key> <acute> <m>        : "ḿ" U1E3F # LATIN SMALL LETTER M WITH ACUTE
+<Multi_key> <apostrophe> <m>   : "ḿ" U1E3F # LATIN SMALL LETTER M WITH ACUTE
+<dead_abovedot> <M>    : "Ṁ" U1E40 # LATIN CAPITAL LETTER M WITH DOT ABOVE
+<Multi_key> <period> <M>       : "Ṁ" U1E40 # LATIN CAPITAL LETTER M WITH DOT ABOVE
+<dead_abovedot> <m>    : "ṁ" U1E41 # LATIN SMALL LETTER M WITH DOT ABOVE
+<Multi_key> <period> <m>       : "ṁ" U1E41 # LATIN SMALL LETTER M WITH DOT ABOVE
+<dead_belowdot> <M>    : "Ṃ" U1E42 # LATIN CAPITAL LETTER M WITH DOT BELOW
+<Multi_key> <exclam> <M>       : "Ṃ" U1E42 # LATIN CAPITAL LETTER M WITH DOT BELOW
+<dead_belowdot> <m>    : "ṃ" U1E43 # LATIN SMALL LETTER M WITH DOT BELOW
+<Multi_key> <exclam> <m>       : "ṃ" U1E43 # LATIN SMALL LETTER M WITH DOT BELOW
+<dead_abovedot> <N>    : "Ṅ" U1E44 # LATIN CAPITAL LETTER N WITH DOT ABOVE
+<Multi_key> <period> <N>       : "Ṅ" U1E44 # LATIN CAPITAL LETTER N WITH DOT ABOVE
+<dead_abovedot> <n>    : "ṅ" U1E45 # LATIN SMALL LETTER N WITH DOT ABOVE
+<Multi_key> <period> <n>       : "ṅ" U1E45 # LATIN SMALL LETTER N WITH DOT ABOVE
+<dead_belowdot> <N>    : "Ṇ" U1E46 # LATIN CAPITAL LETTER N WITH DOT BELOW
+<Multi_key> <exclam> <N>       : "Ṇ" U1E46 # LATIN CAPITAL LETTER N WITH DOT BELOW
+<dead_belowdot> <n>    : "ṇ" U1E47 # LATIN SMALL LETTER N WITH DOT BELOW
+<Multi_key> <exclam> <n>       : "ṇ" U1E47 # LATIN SMALL LETTER N WITH DOT BELOW
+<dead_belowmacron> <N> : "Ṉ" U1E48 # LATIN CAPITAL LETTER N WITH LINE BELOW
+<dead_belowmacron> <n> : "ṉ" U1E49 # LATIN SMALL LETTER N WITH LINE BELOW
+<dead_belowcircumflex> <N>     : "Ṋ" U1E4A # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
+<dead_belowcircumflex> <n>     : "ṋ" U1E4B # LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW
+<dead_acute> <Otilde>  : "Ṍ" U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+<Multi_key> <acute> <Otilde>   : "Ṍ" U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+<Multi_key> <apostrophe> <Otilde>      : "Ṍ" U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+<dead_acute> <dead_tilde> <O>  : "Ṍ" U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+<dead_acute> <Multi_key> <asciitilde> <O>      : "Ṍ" U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+<Multi_key> <acute> <dead_tilde> <O>   : "Ṍ" U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+<Multi_key> <acute> <asciitilde> <O>   : "Ṍ" U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+<Multi_key> <apostrophe> <dead_tilde> <O>      : "Ṍ" U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+<Multi_key> <apostrophe> <asciitilde> <O>      : "Ṍ" U1E4C # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+<dead_acute> <otilde>  : "ṍ" U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE
+<Multi_key> <acute> <otilde>   : "ṍ" U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE
+<Multi_key> <apostrophe> <otilde>      : "ṍ" U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE
+<dead_acute> <dead_tilde> <o>  : "ṍ" U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE
+<dead_acute> <Multi_key> <asciitilde> <o>      : "ṍ" U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE
+<Multi_key> <acute> <dead_tilde> <o>   : "ṍ" U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE
+<Multi_key> <acute> <asciitilde> <o>   : "ṍ" U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE
+<Multi_key> <apostrophe> <dead_tilde> <o>      : "ṍ" U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE
+<Multi_key> <apostrophe> <asciitilde> <o>      : "ṍ" U1E4D # LATIN SMALL LETTER O WITH TILDE AND ACUTE
+<dead_diaeresis> <Otilde>      : "Ṏ" U1E4E # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+<Multi_key> <quotedbl> <Otilde>        : "Ṏ" U1E4E # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+<dead_diaeresis> <dead_tilde> <O>      : "Ṏ" U1E4E # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+<dead_diaeresis> <Multi_key> <asciitilde> <O>  : "Ṏ" U1E4E # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+<Multi_key> <quotedbl> <dead_tilde> <O>        : "Ṏ" U1E4E # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+<Multi_key> <quotedbl> <asciitilde> <O>        : "Ṏ" U1E4E # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+<dead_diaeresis> <otilde>      : "ṏ" U1E4F # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+<Multi_key> <quotedbl> <otilde>        : "ṏ" U1E4F # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+<dead_diaeresis> <dead_tilde> <o>      : "ṏ" U1E4F # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+<dead_diaeresis> <Multi_key> <asciitilde> <o>  : "ṏ" U1E4F # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+<Multi_key> <quotedbl> <dead_tilde> <o>        : "ṏ" U1E4F # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+<Multi_key> <quotedbl> <asciitilde> <o>        : "ṏ" U1E4F # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+<dead_grave> <Omacron> : "Ṑ" U1E50 # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+<Multi_key> <grave> <Omacron>  : "Ṑ" U1E50 # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+<dead_grave> <dead_macron> <O> : "Ṑ" U1E50 # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+<dead_grave> <Multi_key> <macron> <O>  : "Ṑ" U1E50 # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+<dead_grave> <Multi_key> <underscore> <O>      : "Ṑ" U1E50 # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+<Multi_key> <grave> <dead_macron> <O>  : "Ṑ" U1E50 # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+<Multi_key> <grave> <macron> <O>       : "Ṑ" U1E50 # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+<Multi_key> <grave> <underscore> <O>   : "Ṑ" U1E50 # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+<dead_grave> <omacron> : "ṑ" U1E51 # LATIN SMALL LETTER O WITH MACRON AND GRAVE
+<Multi_key> <grave> <omacron>  : "ṑ" U1E51 # LATIN SMALL LETTER O WITH MACRON AND GRAVE
+<dead_grave> <dead_macron> <o> : "ṑ" U1E51 # LATIN SMALL LETTER O WITH MACRON AND GRAVE
+<dead_grave> <Multi_key> <macron> <o>  : "ṑ" U1E51 # LATIN SMALL LETTER O WITH MACRON AND GRAVE
+<dead_grave> <Multi_key> <underscore> <o>      : "ṑ" U1E51 # LATIN SMALL LETTER O WITH MACRON AND GRAVE
+<Multi_key> <grave> <dead_macron> <o>  : "ṑ" U1E51 # LATIN SMALL LETTER O WITH MACRON AND GRAVE
+<Multi_key> <grave> <macron> <o>       : "ṑ" U1E51 # LATIN SMALL LETTER O WITH MACRON AND GRAVE
+<Multi_key> <grave> <underscore> <o>   : "ṑ" U1E51 # LATIN SMALL LETTER O WITH MACRON AND GRAVE
+<dead_acute> <Omacron> : "Ṓ" U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <acute> <Omacron>  : "Ṓ" U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <Omacron>     : "Ṓ" U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+<dead_acute> <dead_macron> <O> : "Ṓ" U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+<dead_acute> <Multi_key> <macron> <O>  : "Ṓ" U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+<dead_acute> <Multi_key> <underscore> <O>      : "Ṓ" U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <acute> <dead_macron> <O>  : "Ṓ" U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <acute> <macron> <O>       : "Ṓ" U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <acute> <underscore> <O>   : "Ṓ" U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <dead_macron> <O>     : "Ṓ" U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <macron> <O>  : "Ṓ" U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <underscore> <O>      : "Ṓ" U1E52 # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+<dead_acute> <omacron> : "ṓ" U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <acute> <omacron>  : "ṓ" U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <omacron>     : "ṓ" U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE
+<dead_acute> <dead_macron> <o> : "ṓ" U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE
+<dead_acute> <Multi_key> <macron> <o>  : "ṓ" U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE
+<dead_acute> <Multi_key> <underscore> <o>      : "ṓ" U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <acute> <dead_macron> <o>  : "ṓ" U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <acute> <macron> <o>       : "ṓ" U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <acute> <underscore> <o>   : "ṓ" U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <dead_macron> <o>     : "ṓ" U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <macron> <o>  : "ṓ" U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE
+<Multi_key> <apostrophe> <underscore> <o>      : "ṓ" U1E53 # LATIN SMALL LETTER O WITH MACRON AND ACUTE
+<dead_acute> <P>       : "Ṕ" U1E54 # LATIN CAPITAL LETTER P WITH ACUTE
+<Multi_key> <acute> <P>        : "Ṕ" U1E54 # LATIN CAPITAL LETTER P WITH ACUTE
+<Multi_key> <apostrophe> <P>   : "Ṕ" U1E54 # LATIN CAPITAL LETTER P WITH ACUTE
+<dead_acute> <p>       : "ṕ" U1E55 # LATIN SMALL LETTER P WITH ACUTE
+<Multi_key> <acute> <p>        : "ṕ" U1E55 # LATIN SMALL LETTER P WITH ACUTE
+<Multi_key> <apostrophe> <p>   : "ṕ" U1E55 # LATIN SMALL LETTER P WITH ACUTE
+<dead_abovedot> <P>    : "Ṗ" U1E56 # LATIN CAPITAL LETTER P WITH DOT ABOVE
+<Multi_key> <period> <P>       : "Ṗ" U1E56 # LATIN CAPITAL LETTER P WITH DOT ABOVE
+<dead_abovedot> <p>    : "ṗ" U1E57 # LATIN SMALL LETTER P WITH DOT ABOVE
+<Multi_key> <period> <p>       : "ṗ" U1E57 # LATIN SMALL LETTER P WITH DOT ABOVE
+<dead_abovedot> <R>    : "Ṙ" U1E58 # LATIN CAPITAL LETTER R WITH DOT ABOVE
+<Multi_key> <period> <R>       : "Ṙ" U1E58 # LATIN CAPITAL LETTER R WITH DOT ABOVE
+<dead_abovedot> <r>    : "ṙ" U1E59 # LATIN SMALL LETTER R WITH DOT ABOVE
+<Multi_key> <period> <r>       : "ṙ" U1E59 # LATIN SMALL LETTER R WITH DOT ABOVE
+<dead_belowdot> <R>    : "Ṛ" U1E5A # LATIN CAPITAL LETTER R WITH DOT BELOW
+<Multi_key> <exclam> <R>       : "Ṛ" U1E5A # LATIN CAPITAL LETTER R WITH DOT BELOW
+<dead_belowdot> <r>    : "ṛ" U1E5B # LATIN SMALL LETTER R WITH DOT BELOW
+<Multi_key> <exclam> <r>       : "ṛ" U1E5B # LATIN SMALL LETTER R WITH DOT BELOW
+<dead_macron> <U1e5a>  : "Ṝ" U1E5C # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+<Multi_key> <macron> <U1e5a>   : "Ṝ" U1E5C # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+<Multi_key> <underscore> <U1e5a>       : "Ṝ" U1E5C # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+<dead_macron> <dead_belowdot> <R>      : "Ṝ" U1E5C # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+<dead_macron> <Multi_key> <exclam> <R> : "Ṝ" U1E5C # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+<Multi_key> <macron> <dead_belowdot> <R>       : "Ṝ" U1E5C # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+<Multi_key> <macron> <exclam> <R>      : "Ṝ" U1E5C # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+<Multi_key> <underscore> <dead_belowdot> <R>   : "Ṝ" U1E5C # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+<Multi_key> <underscore> <exclam> <R>  : "Ṝ" U1E5C # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+<dead_macron> <U1e5b>  : "ṝ" U1E5D # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+<Multi_key> <macron> <U1e5b>   : "ṝ" U1E5D # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+<Multi_key> <underscore> <U1e5b>       : "ṝ" U1E5D # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+<dead_macron> <dead_belowdot> <r>      : "ṝ" U1E5D # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+<dead_macron> <Multi_key> <exclam> <r> : "ṝ" U1E5D # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+<Multi_key> <macron> <dead_belowdot> <r>       : "ṝ" U1E5D # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+<Multi_key> <macron> <exclam> <r>      : "ṝ" U1E5D # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+<Multi_key> <underscore> <dead_belowdot> <r>   : "ṝ" U1E5D # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+<Multi_key> <underscore> <exclam> <r>  : "ṝ" U1E5D # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+<dead_belowmacron> <R> : "Ṟ" U1E5E # LATIN CAPITAL LETTER R WITH LINE BELOW
+<dead_belowmacron> <r> : "ṟ" U1E5F # LATIN SMALL LETTER R WITH LINE BELOW
+<dead_abovedot> <S>    : "Ṡ" U1E60 # LATIN CAPITAL LETTER S WITH DOT ABOVE
+<Multi_key> <period> <S>       : "Ṡ" U1E60 # LATIN CAPITAL LETTER S WITH DOT ABOVE
+<dead_abovedot> <s>    : "ṡ" U1E61 # LATIN SMALL LETTER S WITH DOT ABOVE
+<Multi_key> <period> <s>       : "ṡ" U1E61 # LATIN SMALL LETTER S WITH DOT ABOVE
+<dead_belowdot> <S>    : "Ṣ" U1E62 # LATIN CAPITAL LETTER S WITH DOT BELOW
+<Multi_key> <exclam> <S>       : "Ṣ" U1E62 # LATIN CAPITAL LETTER S WITH DOT BELOW
+<dead_belowdot> <s>    : "ṣ" U1E63 # LATIN SMALL LETTER S WITH DOT BELOW
+<Multi_key> <exclam> <s>       : "ṣ" U1E63 # LATIN SMALL LETTER S WITH DOT BELOW
+<dead_abovedot> <Sacute>       : "Ṥ" U1E64 # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+<Multi_key> <period> <Sacute>  : "Ṥ" U1E64 # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+<dead_abovedot> <dead_acute> <S>       : "Ṥ" U1E64 # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+<dead_abovedot> <Multi_key> <acute> <S>        : "Ṥ" U1E64 # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+<dead_abovedot> <Multi_key> <apostrophe> <S>   : "Ṥ" U1E64 # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+<Multi_key> <period> <dead_acute> <S>  : "Ṥ" U1E64 # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+<Multi_key> <period> <acute> <S>       : "Ṥ" U1E64 # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+<Multi_key> <period> <apostrophe> <S>  : "Ṥ" U1E64 # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+<dead_abovedot> <sacute>       : "ṥ" U1E65 # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+<Multi_key> <period> <sacute>  : "ṥ" U1E65 # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+<dead_abovedot> <dead_acute> <s>       : "ṥ" U1E65 # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+<dead_abovedot> <Multi_key> <acute> <s>        : "ṥ" U1E65 # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+<dead_abovedot> <Multi_key> <apostrophe> <s>   : "ṥ" U1E65 # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+<Multi_key> <period> <dead_acute> <s>  : "ṥ" U1E65 # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+<Multi_key> <period> <acute> <s>       : "ṥ" U1E65 # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+<Multi_key> <period> <apostrophe> <s>  : "ṥ" U1E65 # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+<dead_abovedot> <Scaron>       : "Ṧ" U1E66 # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+<Multi_key> <period> <Scaron>  : "Ṧ" U1E66 # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+<dead_abovedot> <dead_caron> <S>       : "Ṧ" U1E66 # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+<dead_abovedot> <Multi_key> <c> <S>    : "Ṧ" U1E66 # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+<Multi_key> <period> <dead_caron> <S>  : "Ṧ" U1E66 # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+XCOMM <Multi_key> <period> <c> <S>     : "Ṧ" U1E66 # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+<dead_abovedot> <scaron>       : "ṧ" U1E67 # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+<Multi_key> <period> <scaron>  : "ṧ" U1E67 # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+<dead_abovedot> <dead_caron> <s>       : "ṧ" U1E67 # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+XCOMM <dead_abovedot> <Multi_key> <c> <s>      : "ṧ" U1E67 # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+<Multi_key> <period> <dead_caron> <s>  : "ṧ" U1E67 # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+XCOMM <Multi_key> <period> <c> <s>     : "ṧ" U1E67 # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+<dead_abovedot> <U1e62>        : "Ṩ" U1E68 # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+<Multi_key> <period> <U1e62>   : "Ṩ" U1E68 # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+<dead_abovedot> <dead_belowdot> <S>    : "Ṩ" U1E68 # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+<dead_abovedot> <Multi_key> <exclam> <S>       : "Ṩ" U1E68 # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+<Multi_key> <period> <dead_belowdot> <S>       : "Ṩ" U1E68 # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+<Multi_key> <period> <exclam> <S>      : "Ṩ" U1E68 # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+<dead_abovedot> <U1e63>        : "ṩ" U1E69 # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+<Multi_key> <period> <U1e63>   : "ṩ" U1E69 # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+<dead_abovedot> <dead_belowdot> <s>    : "ṩ" U1E69 # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+<dead_abovedot> <Multi_key> <exclam> <s>       : "ṩ" U1E69 # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+<Multi_key> <period> <dead_belowdot> <s>       : "ṩ" U1E69 # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+<Multi_key> <period> <exclam> <s>      : "ṩ" U1E69 # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+<dead_abovedot> <T>    : "Ṫ" U1E6A # LATIN CAPITAL LETTER T WITH DOT ABOVE
+<Multi_key> <period> <T>       : "Ṫ" U1E6A # LATIN CAPITAL LETTER T WITH DOT ABOVE
+<dead_abovedot> <t>    : "ṫ" U1E6B # LATIN SMALL LETTER T WITH DOT ABOVE
+<Multi_key> <period> <t>       : "ṫ" U1E6B # LATIN SMALL LETTER T WITH DOT ABOVE
+<dead_belowdot> <T>    : "Ṭ" U1E6C # LATIN CAPITAL LETTER T WITH DOT BELOW
+<Multi_key> <exclam> <T>       : "Ṭ" U1E6C # LATIN CAPITAL LETTER T WITH DOT BELOW
+<dead_belowdot> <t>    : "ṭ" U1E6D # LATIN SMALL LETTER T WITH DOT BELOW
+<Multi_key> <exclam> <t>       : "ṭ" U1E6D # LATIN SMALL LETTER T WITH DOT BELOW
+<dead_belowmacron> <T> : "Ṯ" U1E6E # LATIN CAPITAL LETTER T WITH LINE BELOW
+<dead_belowmacron> <t> : "ṯ" U1E6F # LATIN SMALL LETTER T WITH LINE BELOW
+<dead_belowcircumflex> <T>     : "Ṱ" U1E70 # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
+<dead_belowcircumflex> <t>     : "ṱ" U1E71 # LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW
+<dead_belowdiaeresis> <U>      : "Ṳ" U1E72 # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
+<dead_belowdiaeresis> <u>      : "ṳ" U1E73 # LATIN SMALL LETTER U WITH DIAERESIS BELOW
+<dead_belowtilde> <U>  : "Ṵ" U1E74 # LATIN CAPITAL LETTER U WITH TILDE BELOW
+<dead_belowtilde> <u>  : "ṵ" U1E75 # LATIN SMALL LETTER U WITH TILDE BELOW
+<dead_belowcircumflex> <U>     : "Ṷ" U1E76 # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
+<dead_belowcircumflex> <u>     : "ṷ" U1E77 # LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW
+<dead_acute> <Utilde>  : "Ṹ" U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+<Multi_key> <acute> <Utilde>   : "Ṹ" U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+<Multi_key> <apostrophe> <Utilde>      : "Ṹ" U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+<dead_acute> <dead_tilde> <U>  : "Ṹ" U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+<dead_acute> <Multi_key> <asciitilde> <U>      : "Ṹ" U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+<Multi_key> <acute> <dead_tilde> <U>   : "Ṹ" U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+<Multi_key> <acute> <asciitilde> <U>   : "Ṹ" U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+<Multi_key> <apostrophe> <dead_tilde> <U>      : "Ṹ" U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+<Multi_key> <apostrophe> <asciitilde> <U>      : "Ṹ" U1E78 # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+<dead_acute> <utilde>  : "ṹ" U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE
+<Multi_key> <acute> <utilde>   : "ṹ" U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE
+<Multi_key> <apostrophe> <utilde>      : "ṹ" U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE
+<dead_acute> <dead_tilde> <u>  : "ṹ" U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE
+<dead_acute> <Multi_key> <asciitilde> <u>      : "ṹ" U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE
+<Multi_key> <acute> <dead_tilde> <u>   : "ṹ" U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE
+<Multi_key> <acute> <asciitilde> <u>   : "ṹ" U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE
+<Multi_key> <apostrophe> <dead_tilde> <u>      : "ṹ" U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE
+<Multi_key> <apostrophe> <asciitilde> <u>      : "ṹ" U1E79 # LATIN SMALL LETTER U WITH TILDE AND ACUTE
+<dead_diaeresis> <Umacron>     : "Ṻ" U1E7A # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+<Multi_key> <quotedbl> <Umacron>       : "Ṻ" U1E7A # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+<dead_diaeresis> <dead_macron> <U>     : "Ṻ" U1E7A # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+<dead_diaeresis> <Multi_key> <macron> <U>      : "Ṻ" U1E7A # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+<dead_diaeresis> <Multi_key> <underscore> <U>  : "Ṻ" U1E7A # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+<Multi_key> <quotedbl> <dead_macron> <U>       : "Ṻ" U1E7A # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+<Multi_key> <quotedbl> <macron> <U>    : "Ṻ" U1E7A # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+<Multi_key> <quotedbl> <underscore> <U>        : "Ṻ" U1E7A # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+<dead_diaeresis> <umacron>     : "ṻ" U1E7B # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+<Multi_key> <quotedbl> <umacron>       : "ṻ" U1E7B # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+<dead_diaeresis> <dead_macron> <u>     : "ṻ" U1E7B # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+<dead_diaeresis> <Multi_key> <macron> <u>      : "ṻ" U1E7B # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+<dead_diaeresis> <Multi_key> <underscore> <u>  : "ṻ" U1E7B # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+<Multi_key> <quotedbl> <dead_macron> <u>       : "ṻ" U1E7B # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+<Multi_key> <quotedbl> <macron> <u>    : "ṻ" U1E7B # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+<Multi_key> <quotedbl> <underscore> <u>        : "ṻ" U1E7B # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+<dead_tilde> <V>       : "Ṽ" U1E7C # LATIN CAPITAL LETTER V WITH TILDE
+<Multi_key> <asciitilde> <V>   : "Ṽ" U1E7C # LATIN CAPITAL LETTER V WITH TILDE
+<dead_tilde> <v>       : "ṽ" U1E7D # LATIN SMALL LETTER V WITH TILDE
+<Multi_key> <asciitilde> <v>   : "ṽ" U1E7D # LATIN SMALL LETTER V WITH TILDE
+<dead_belowdot> <V>    : "Ṿ" U1E7E # LATIN CAPITAL LETTER V WITH DOT BELOW
+<Multi_key> <exclam> <V>       : "Ṿ" U1E7E # LATIN CAPITAL LETTER V WITH DOT BELOW
+<dead_belowdot> <v>    : "ṿ" U1E7F # LATIN SMALL LETTER V WITH DOT BELOW
+<Multi_key> <exclam> <v>       : "ṿ" U1E7F # LATIN SMALL LETTER V WITH DOT BELOW
+<dead_grave> <W>       : "Ẁ" U1E80 # LATIN CAPITAL LETTER W WITH GRAVE
+<Multi_key> <grave> <W>        : "Ẁ" U1E80 # LATIN CAPITAL LETTER W WITH GRAVE
+<dead_grave> <w>       : "ẁ" U1E81 # LATIN SMALL LETTER W WITH GRAVE
+<Multi_key> <grave> <w>        : "ẁ" U1E81 # LATIN SMALL LETTER W WITH GRAVE
+<dead_acute> <W>       : "Ẃ" U1E82 # LATIN CAPITAL LETTER W WITH ACUTE
+<Multi_key> <acute> <W>        : "Ẃ" U1E82 # LATIN CAPITAL LETTER W WITH ACUTE
+<Multi_key> <apostrophe> <W>   : "Ẃ" U1E82 # LATIN CAPITAL LETTER W WITH ACUTE
+<dead_acute> <w>       : "ẃ" U1E83 # LATIN SMALL LETTER W WITH ACUTE
+<Multi_key> <acute> <w>        : "ẃ" U1E83 # LATIN SMALL LETTER W WITH ACUTE
+<Multi_key> <apostrophe> <w>   : "ẃ" U1E83 # LATIN SMALL LETTER W WITH ACUTE
+<dead_diaeresis> <W>   : "Ẅ" U1E84 # LATIN CAPITAL LETTER W WITH DIAERESIS
+<Multi_key> <quotedbl> <W>     : "Ẅ" U1E84 # LATIN CAPITAL LETTER W WITH DIAERESIS
+<dead_diaeresis> <w>   : "ẅ" U1E85 # LATIN SMALL LETTER W WITH DIAERESIS
+<Multi_key> <quotedbl> <w>     : "ẅ" U1E85 # LATIN SMALL LETTER W WITH DIAERESIS
+<dead_abovedot> <W>    : "Ẇ" U1E86 # LATIN CAPITAL LETTER W WITH DOT ABOVE
+<Multi_key> <period> <W>       : "Ẇ" U1E86 # LATIN CAPITAL LETTER W WITH DOT ABOVE
+<dead_abovedot> <w>    : "ẇ" U1E87 # LATIN SMALL LETTER W WITH DOT ABOVE
+<Multi_key> <period> <w>       : "ẇ" U1E87 # LATIN SMALL LETTER W WITH DOT ABOVE
+<dead_belowdot> <W>    : "Ẉ" U1E88 # LATIN CAPITAL LETTER W WITH DOT BELOW
+<Multi_key> <exclam> <W>       : "Ẉ" U1E88 # LATIN CAPITAL LETTER W WITH DOT BELOW
+<dead_belowdot> <w>    : "ẉ" U1E89 # LATIN SMALL LETTER W WITH DOT BELOW
+<Multi_key> <exclam> <w>       : "ẉ" U1E89 # LATIN SMALL LETTER W WITH DOT BELOW
+<dead_abovedot> <X>    : "Ẋ" U1E8A # LATIN CAPITAL LETTER X WITH DOT ABOVE
+<Multi_key> <period> <X>       : "Ẋ" U1E8A # LATIN CAPITAL LETTER X WITH DOT ABOVE
+<dead_abovedot> <x>    : "ẋ" U1E8B # LATIN SMALL LETTER X WITH DOT ABOVE
+<Multi_key> <period> <x>       : "ẋ" U1E8B # LATIN SMALL LETTER X WITH DOT ABOVE
+<dead_diaeresis> <X>   : "Ẍ" U1E8C # LATIN CAPITAL LETTER X WITH DIAERESIS
+<Multi_key> <quotedbl> <X>     : "Ẍ" U1E8C # LATIN CAPITAL LETTER X WITH DIAERESIS
+<dead_diaeresis> <x>   : "ẍ" U1E8D # LATIN SMALL LETTER X WITH DIAERESIS
+<Multi_key> <quotedbl> <x>     : "ẍ" U1E8D # LATIN SMALL LETTER X WITH DIAERESIS
+<dead_abovedot> <Y>    : "Ẏ" U1E8E # LATIN CAPITAL LETTER Y WITH DOT ABOVE
+<Multi_key> <period> <Y>       : "Ẏ" U1E8E # LATIN CAPITAL LETTER Y WITH DOT ABOVE
+<dead_abovedot> <y>    : "ẏ" U1E8F # LATIN SMALL LETTER Y WITH DOT ABOVE
+<Multi_key> <period> <y>       : "ẏ" U1E8F # LATIN SMALL LETTER Y WITH DOT ABOVE
+<dead_circumflex> <Z>  : "Ẑ" U1E90 # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <Z>  : "Ẑ" U1E90 # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+<dead_circumflex> <z>  : "ẑ" U1E91 # LATIN SMALL LETTER Z WITH CIRCUMFLEX
+<Multi_key> <asciicircum> <z>  : "ẑ" U1E91 # LATIN SMALL LETTER Z WITH CIRCUMFLEX
+<dead_belowdot> <Z>    : "Ẓ" U1E92 # LATIN CAPITAL LETTER Z WITH DOT BELOW
+<Multi_key> <exclam> <Z>       : "Ẓ" U1E92 # LATIN CAPITAL LETTER Z WITH DOT BELOW
+<dead_belowdot> <z>    : "ẓ" U1E93 # LATIN SMALL LETTER Z WITH DOT BELOW
+<Multi_key> <exclam> <z>       : "ẓ" U1E93 # LATIN SMALL LETTER Z WITH DOT BELOW
+<dead_belowmacron> <Z> : "Ẕ" U1E94 # LATIN CAPITAL LETTER Z WITH LINE BELOW
+<dead_belowmacron> <z> : "ẕ" U1E95 # LATIN SMALL LETTER Z WITH LINE BELOW
+<dead_belowmacron> <h> : "ẖ" U1E96 # LATIN SMALL LETTER H WITH LINE BELOW
+<dead_diaeresis> <t>   : "ẗ" U1E97 # LATIN SMALL LETTER T WITH DIAERESIS
+<Multi_key> <quotedbl> <t>     : "ẗ" U1E97 # LATIN SMALL LETTER T WITH DIAERESIS
+<dead_abovering> <w>   : "ẘ" U1E98 # LATIN SMALL LETTER W WITH RING ABOVE
+<Multi_key> <o> <w>    : "ẘ" U1E98 # LATIN SMALL LETTER W WITH RING ABOVE
+<dead_abovering> <y>   : "ẙ" U1E99 # LATIN SMALL LETTER Y WITH RING ABOVE
+<Multi_key> <o> <y>    : "ẙ" U1E99 # LATIN SMALL LETTER Y WITH RING ABOVE
+<dead_abovedot> <U017f>        : "ẛ" U1E9B # LATIN SMALL LETTER LONG S WITH DOT ABOVE
+<Multi_key> <period> <U017f>   : "ẛ" U1E9B # LATIN SMALL LETTER LONG S WITH DOT ABOVE
+<dead_belowdot> <A>    : "Ạ" U1EA0 # LATIN CAPITAL LETTER A WITH DOT BELOW
+<Multi_key> <exclam> <A>       : "Ạ" U1EA0 # LATIN CAPITAL LETTER A WITH DOT BELOW
+<dead_belowdot> <a>    : "ạ" U1EA1 # LATIN SMALL LETTER A WITH DOT BELOW
+<Multi_key> <exclam> <a>       : "ạ" U1EA1 # LATIN SMALL LETTER A WITH DOT BELOW
+<dead_hook> <A>        : "Ả" U1EA2 # LATIN CAPITAL LETTER A WITH HOOK ABOVE
+<Multi_key> <question> <A>     : "Ả" U1EA2 # LATIN CAPITAL LETTER A WITH HOOK ABOVE
+<dead_hook> <a>        : "ả" U1EA3 # LATIN SMALL LETTER A WITH HOOK ABOVE
+<Multi_key> <question> <a>     : "ả" U1EA3 # LATIN SMALL LETTER A WITH HOOK ABOVE
+<dead_acute> <Acircumflex>     : "Ấ" U1EA4 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <Acircumflex>      : "Ấ" U1EA4 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <Acircumflex> : "Ấ" U1EA4 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+<dead_acute> <dead_circumflex> <A>     : "Ấ" U1EA4 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+<dead_acute> <Multi_key> <asciicircum> <A>     : "Ấ" U1EA4 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <dead_circumflex> <A>      : "Ấ" U1EA4 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <asciicircum> <A>  : "Ấ" U1EA4 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <dead_circumflex> <A> : "Ấ" U1EA4 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <asciicircum> <A>     : "Ấ" U1EA4 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+<dead_acute> <acircumflex>     : "ấ" U1EA5 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <acircumflex>      : "ấ" U1EA5 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <acircumflex> : "ấ" U1EA5 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+<dead_acute> <dead_circumflex> <a>     : "ấ" U1EA5 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+<dead_acute> <Multi_key> <asciicircum> <a>     : "ấ" U1EA5 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <dead_circumflex> <a>      : "ấ" U1EA5 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <asciicircum> <a>  : "ấ" U1EA5 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <dead_circumflex> <a> : "ấ" U1EA5 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <asciicircum> <a>     : "ấ" U1EA5 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+<dead_grave> <Acircumflex>     : "Ầ" U1EA6 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <Acircumflex>      : "Ầ" U1EA6 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+<dead_grave> <dead_circumflex> <A>     : "Ầ" U1EA6 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+<dead_grave> <Multi_key> <asciicircum> <A>     : "Ầ" U1EA6 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <dead_circumflex> <A>      : "Ầ" U1EA6 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <asciicircum> <A>  : "Ầ" U1EA6 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+<dead_grave> <acircumflex>     : "ầ" U1EA7 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <acircumflex>      : "ầ" U1EA7 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+<dead_grave> <dead_circumflex> <a>     : "ầ" U1EA7 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+<dead_grave> <Multi_key> <asciicircum> <a>     : "ầ" U1EA7 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <dead_circumflex> <a>      : "ầ" U1EA7 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <asciicircum> <a>  : "ầ" U1EA7 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+<dead_hook> <Acircumflex>      : "Ẩ" U1EA8 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <Acircumflex>   : "Ẩ" U1EA8 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_hook> <dead_circumflex> <A>      : "Ẩ" U1EA8 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_hook> <Multi_key> <asciicircum> <A>      : "Ẩ" U1EA8 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <dead_circumflex> <A>   : "Ẩ" U1EA8 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <asciicircum> <A>       : "Ẩ" U1EA8 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_hook> <acircumflex>      : "ẩ" U1EA9 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <acircumflex>   : "ẩ" U1EA9 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_hook> <dead_circumflex> <a>      : "ẩ" U1EA9 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_hook> <Multi_key> <asciicircum> <a>      : "ẩ" U1EA9 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <dead_circumflex> <a>   : "ẩ" U1EA9 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <asciicircum> <a>       : "ẩ" U1EA9 # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_tilde> <Acircumflex>     : "Ẫ" U1EAA # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <Acircumflex> : "Ẫ" U1EAA # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+<dead_tilde> <dead_circumflex> <A>     : "Ẫ" U1EAA # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+<dead_tilde> <Multi_key> <asciicircum> <A>     : "Ẫ" U1EAA # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <dead_circumflex> <A> : "Ẫ" U1EAA # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <asciicircum> <A>     : "Ẫ" U1EAA # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+<dead_tilde> <acircumflex>     : "ẫ" U1EAB # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <acircumflex> : "ẫ" U1EAB # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+<dead_tilde> <dead_circumflex> <a>     : "ẫ" U1EAB # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+<dead_tilde> <Multi_key> <asciicircum> <a>     : "ẫ" U1EAB # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <dead_circumflex> <a> : "ẫ" U1EAB # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <asciicircum> <a>     : "ẫ" U1EAB # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+<dead_circumflex> <U1ea0>      : "Ậ" U1EAC # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <U1ea0>      : "Ậ" U1EAC # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+<dead_circumflex> <dead_belowdot> <A>  : "Ậ" U1EAC # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+<dead_circumflex> <Multi_key> <exclam> <A>     : "Ậ" U1EAC # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <dead_belowdot> <A>  : "Ậ" U1EAC # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <exclam> <A> : "Ậ" U1EAC # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+<dead_circumflex> <U1ea1>      : "ậ" U1EAD # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <U1ea1>      : "ậ" U1EAD # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+<dead_circumflex> <dead_belowdot> <a>  : "ậ" U1EAD # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+<dead_circumflex> <Multi_key> <exclam> <a>     : "ậ" U1EAD # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <dead_belowdot> <a>  : "ậ" U1EAD # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <exclam> <a> : "ậ" U1EAD # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+<dead_acute> <Abreve>  : "Ắ" U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+<Multi_key> <acute> <Abreve>   : "Ắ" U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+<Multi_key> <apostrophe> <Abreve>      : "Ắ" U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+<dead_acute> <dead_breve> <A>  : "Ắ" U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+<dead_acute> <Multi_key> <U> <A>       : "Ắ" U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+<dead_acute> <Multi_key> <b> <A>       : "Ắ" U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+<Multi_key> <acute> <dead_breve> <A>   : "Ắ" U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+XCOMM <Multi_key> <acute> <U> <A>      : "Ắ" U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+<Multi_key> <acute> <b> <A>    : "Ắ" U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+<Multi_key> <apostrophe> <dead_breve> <A>      : "Ắ" U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+XCOMM <Multi_key> <apostrophe> <U> <A> : "Ắ" U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+<Multi_key> <apostrophe> <b> <A>       : "Ắ" U1EAE # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+<dead_acute> <abreve>  : "ắ" U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE
+<Multi_key> <acute> <abreve>   : "ắ" U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE
+<Multi_key> <apostrophe> <abreve>      : "ắ" U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE
+<dead_acute> <dead_breve> <a>  : "ắ" U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE
+<dead_acute> <Multi_key> <U> <a>       : "ắ" U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE
+<dead_acute> <Multi_key> <b> <a>       : "ắ" U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE
+<Multi_key> <acute> <dead_breve> <a>   : "ắ" U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE
+XCOMM <Multi_key> <acute> <U> <a>      : "ắ" U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE
+<Multi_key> <acute> <b> <a>    : "ắ" U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE
+<Multi_key> <apostrophe> <dead_breve> <a>      : "ắ" U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE
+XCOMM <Multi_key> <apostrophe> <U> <a> : "ắ" U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE
+<Multi_key> <apostrophe> <b> <a>       : "ắ" U1EAF # LATIN SMALL LETTER A WITH BREVE AND ACUTE
+<dead_grave> <Abreve>  : "Ằ" U1EB0 # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+<Multi_key> <grave> <Abreve>   : "Ằ" U1EB0 # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+<dead_grave> <dead_breve> <A>  : "Ằ" U1EB0 # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+<dead_grave> <Multi_key> <U> <A>       : "Ằ" U1EB0 # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+<dead_grave> <Multi_key> <b> <A>       : "Ằ" U1EB0 # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+<Multi_key> <grave> <dead_breve> <A>   : "Ằ" U1EB0 # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+XCOMM <Multi_key> <grave> <U> <A>      : "Ằ" U1EB0 # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+<Multi_key> <grave> <b> <A>    : "Ằ" U1EB0 # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+<dead_grave> <abreve>  : "ằ" U1EB1 # LATIN SMALL LETTER A WITH BREVE AND GRAVE
+<Multi_key> <grave> <abreve>   : "ằ" U1EB1 # LATIN SMALL LETTER A WITH BREVE AND GRAVE
+<dead_grave> <dead_breve> <a>  : "ằ" U1EB1 # LATIN SMALL LETTER A WITH BREVE AND GRAVE
+<dead_grave> <Multi_key> <U> <a>       : "ằ" U1EB1 # LATIN SMALL LETTER A WITH BREVE AND GRAVE
+<dead_grave> <Multi_key> <b> <a>       : "ằ" U1EB1 # LATIN SMALL LETTER A WITH BREVE AND GRAVE
+<Multi_key> <grave> <dead_breve> <a>   : "ằ" U1EB1 # LATIN SMALL LETTER A WITH BREVE AND GRAVE
+XCOMM <Multi_key> <grave> <U> <a>      : "ằ" U1EB1 # LATIN SMALL LETTER A WITH BREVE AND GRAVE
+<Multi_key> <grave> <b> <a>    : "ằ" U1EB1 # LATIN SMALL LETTER A WITH BREVE AND GRAVE
+<dead_hook> <Abreve>   : "Ẳ" U1EB2 # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+<Multi_key> <question> <Abreve>        : "Ẳ" U1EB2 # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+<dead_hook> <dead_breve> <A>   : "Ẳ" U1EB2 # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+<dead_hook> <Multi_key> <U> <A>        : "Ẳ" U1EB2 # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+<dead_hook> <Multi_key> <b> <A>        : "Ẳ" U1EB2 # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+<Multi_key> <question> <dead_breve> <A>        : "Ẳ" U1EB2 # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+XCOMM <Multi_key> <question> <U> <A>   : "Ẳ" U1EB2 # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+<Multi_key> <question> <b> <A> : "Ẳ" U1EB2 # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+<dead_hook> <abreve>   : "ẳ" U1EB3 # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+<Multi_key> <question> <abreve>        : "ẳ" U1EB3 # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+<dead_hook> <dead_breve> <a>   : "ẳ" U1EB3 # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+<dead_hook> <Multi_key> <U> <a>        : "ẳ" U1EB3 # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+<dead_hook> <Multi_key> <b> <a>        : "ẳ" U1EB3 # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+<Multi_key> <question> <dead_breve> <a>        : "ẳ" U1EB3 # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+XCOMM <Multi_key> <question> <U> <a>   : "ẳ" U1EB3 # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+<Multi_key> <question> <b> <a> : "ẳ" U1EB3 # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+<dead_tilde> <Abreve>  : "Ẵ" U1EB4 # LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+<Multi_key> <asciitilde> <Abreve>      : "Ẵ" U1EB4 # LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+<dead_tilde> <dead_breve> <A>  : "Ẵ" U1EB4 # LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+<dead_tilde> <Multi_key> <U> <A>       : "Ẵ" U1EB4 # LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+<dead_tilde> <Multi_key> <b> <A>       : "Ẵ" U1EB4 # LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+<Multi_key> <asciitilde> <dead_breve> <A>      : "Ẵ" U1EB4 # LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+XCOMM <Multi_key> <asciitilde> <U> <A> : "Ẵ" U1EB4 # LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+<Multi_key> <asciitilde> <b> <A>       : "Ẵ" U1EB4 # LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+<dead_tilde> <abreve>  : "ẵ" U1EB5 # LATIN SMALL LETTER A WITH BREVE AND TILDE
+<Multi_key> <asciitilde> <abreve>      : "ẵ" U1EB5 # LATIN SMALL LETTER A WITH BREVE AND TILDE
+<dead_tilde> <dead_breve> <a>  : "ẵ" U1EB5 # LATIN SMALL LETTER A WITH BREVE AND TILDE
+<dead_tilde> <Multi_key> <U> <a>       : "ẵ" U1EB5 # LATIN SMALL LETTER A WITH BREVE AND TILDE
+<dead_tilde> <Multi_key> <b> <a>       : "ẵ" U1EB5 # LATIN SMALL LETTER A WITH BREVE AND TILDE
+<Multi_key> <asciitilde> <dead_breve> <a>      : "ẵ" U1EB5 # LATIN SMALL LETTER A WITH BREVE AND TILDE
+XCOMM <Multi_key> <asciitilde> <U> <a> : "ẵ" U1EB5 # LATIN SMALL LETTER A WITH BREVE AND TILDE
+<Multi_key> <asciitilde> <b> <a>       : "ẵ" U1EB5 # LATIN SMALL LETTER A WITH BREVE AND TILDE
+<dead_breve> <U1ea0>   : "Ặ" U1EB6 # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+<Multi_key> <U> <U1ea0>        : "Ặ" U1EB6 # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+<Multi_key> <b> <U1ea0>        : "Ặ" U1EB6 # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+<dead_breve> <dead_belowdot> <A>       : "Ặ" U1EB6 # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+<dead_breve> <Multi_key> <exclam> <A>  : "Ặ" U1EB6 # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+<Multi_key> <U> <dead_belowdot> <A>    : "Ặ" U1EB6 # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+<Multi_key> <U> <exclam> <A>   : "Ặ" U1EB6 # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+<Multi_key> <b> <dead_belowdot> <A>    : "Ặ" U1EB6 # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+<Multi_key> <b> <exclam> <A>   : "Ặ" U1EB6 # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+<dead_breve> <U1ea1>   : "ặ" U1EB7 # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+<Multi_key> <U> <U1ea1>        : "ặ" U1EB7 # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+<Multi_key> <b> <U1ea1>        : "ặ" U1EB7 # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+<dead_breve> <dead_belowdot> <a>       : "ặ" U1EB7 # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+<dead_breve> <Multi_key> <exclam> <a>  : "ặ" U1EB7 # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+<Multi_key> <U> <dead_belowdot> <a>    : "ặ" U1EB7 # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+<Multi_key> <U> <exclam> <a>   : "ặ" U1EB7 # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+<Multi_key> <b> <dead_belowdot> <a>    : "ặ" U1EB7 # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+<Multi_key> <b> <exclam> <a>   : "ặ" U1EB7 # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+<dead_belowdot> <E>    : "Ẹ" U1EB8 # LATIN CAPITAL LETTER E WITH DOT BELOW
+<Multi_key> <exclam> <E>       : "Ẹ" U1EB8 # LATIN CAPITAL LETTER E WITH DOT BELOW
+<dead_belowdot> <e>    : "ẹ" U1EB9 # LATIN SMALL LETTER E WITH DOT BELOW
+<Multi_key> <exclam> <e>       : "ẹ" U1EB9 # LATIN SMALL LETTER E WITH DOT BELOW
+<dead_hook> <E>        : "Ẻ" U1EBA # LATIN CAPITAL LETTER E WITH HOOK ABOVE
+<Multi_key> <question> <E>     : "Ẻ" U1EBA # LATIN CAPITAL LETTER E WITH HOOK ABOVE
+<dead_hook> <e>        : "ẻ" U1EBB # LATIN SMALL LETTER E WITH HOOK ABOVE
+<Multi_key> <question> <e>     : "ẻ" U1EBB # LATIN SMALL LETTER E WITH HOOK ABOVE
+<dead_tilde> <E>       : "Ẽ" U1EBC # LATIN CAPITAL LETTER E WITH TILDE
+<Multi_key> <asciitilde> <E>   : "Ẽ" U1EBC # LATIN CAPITAL LETTER E WITH TILDE
+<dead_tilde> <e>       : "ẽ" U1EBD # LATIN SMALL LETTER E WITH TILDE
+<Multi_key> <asciitilde> <e>   : "ẽ" U1EBD # LATIN SMALL LETTER E WITH TILDE
+<dead_acute> <Ecircumflex>     : "Ế" U1EBE # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <Ecircumflex>      : "Ế" U1EBE # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <Ecircumflex> : "Ế" U1EBE # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+<dead_acute> <dead_circumflex> <E>     : "Ế" U1EBE # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+<dead_acute> <Multi_key> <asciicircum> <E>     : "Ế" U1EBE # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <dead_circumflex> <E>      : "Ế" U1EBE # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <asciicircum> <E>  : "Ế" U1EBE # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <dead_circumflex> <E> : "Ế" U1EBE # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <asciicircum> <E>     : "Ế" U1EBE # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+<dead_acute> <ecircumflex>     : "ế" U1EBF # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <ecircumflex>      : "ế" U1EBF # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <ecircumflex> : "ế" U1EBF # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+<dead_acute> <dead_circumflex> <e>     : "ế" U1EBF # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+<dead_acute> <Multi_key> <asciicircum> <e>     : "ế" U1EBF # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <dead_circumflex> <e>      : "ế" U1EBF # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <asciicircum> <e>  : "ế" U1EBF # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <dead_circumflex> <e> : "ế" U1EBF # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <asciicircum> <e>     : "ế" U1EBF # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+<dead_grave> <Ecircumflex>     : "Ề" U1EC0 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <Ecircumflex>      : "Ề" U1EC0 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+<dead_grave> <dead_circumflex> <E>     : "Ề" U1EC0 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+<dead_grave> <Multi_key> <asciicircum> <E>     : "Ề" U1EC0 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <dead_circumflex> <E>      : "Ề" U1EC0 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <asciicircum> <E>  : "Ề" U1EC0 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+<dead_grave> <ecircumflex>     : "ề" U1EC1 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <ecircumflex>      : "ề" U1EC1 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+<dead_grave> <dead_circumflex> <e>     : "ề" U1EC1 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+<dead_grave> <Multi_key> <asciicircum> <e>     : "ề" U1EC1 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <dead_circumflex> <e>      : "ề" U1EC1 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <asciicircum> <e>  : "ề" U1EC1 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+<dead_hook> <Ecircumflex>      : "Ể" U1EC2 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <Ecircumflex>   : "Ể" U1EC2 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_hook> <dead_circumflex> <E>      : "Ể" U1EC2 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_hook> <Multi_key> <asciicircum> <E>      : "Ể" U1EC2 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <dead_circumflex> <E>   : "Ể" U1EC2 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <asciicircum> <E>       : "Ể" U1EC2 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_hook> <ecircumflex>      : "ể" U1EC3 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <ecircumflex>   : "ể" U1EC3 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_hook> <dead_circumflex> <e>      : "ể" U1EC3 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_hook> <Multi_key> <asciicircum> <e>      : "ể" U1EC3 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <dead_circumflex> <e>   : "ể" U1EC3 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <asciicircum> <e>       : "ể" U1EC3 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_tilde> <Ecircumflex>     : "Ễ" U1EC4 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <Ecircumflex> : "Ễ" U1EC4 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+<dead_tilde> <dead_circumflex> <E>     : "Ễ" U1EC4 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+<dead_tilde> <Multi_key> <asciicircum> <E>     : "Ễ" U1EC4 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <dead_circumflex> <E> : "Ễ" U1EC4 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <asciicircum> <E>     : "Ễ" U1EC4 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+<dead_tilde> <ecircumflex>     : "ễ" U1EC5 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <ecircumflex> : "ễ" U1EC5 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+<dead_tilde> <dead_circumflex> <e>     : "ễ" U1EC5 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+<dead_tilde> <Multi_key> <asciicircum> <e>     : "ễ" U1EC5 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <dead_circumflex> <e> : "ễ" U1EC5 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <asciicircum> <e>     : "ễ" U1EC5 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+<dead_circumflex> <U1eb8>      : "Ệ" U1EC6 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <U1eb8>      : "Ệ" U1EC6 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+<dead_circumflex> <dead_belowdot> <E>  : "Ệ" U1EC6 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+<dead_circumflex> <Multi_key> <exclam> <E>     : "Ệ" U1EC6 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <dead_belowdot> <E>  : "Ệ" U1EC6 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <exclam> <E> : "Ệ" U1EC6 # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+<dead_circumflex> <U1eb9>      : "ệ" U1EC7 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <U1eb9>      : "ệ" U1EC7 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+<dead_circumflex> <dead_belowdot> <e>  : "ệ" U1EC7 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+<dead_circumflex> <Multi_key> <exclam> <e>     : "ệ" U1EC7 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <dead_belowdot> <e>  : "ệ" U1EC7 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <exclam> <e> : "ệ" U1EC7 # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+<dead_hook> <I>        : "Ỉ" U1EC8 # LATIN CAPITAL LETTER I WITH HOOK ABOVE
+<Multi_key> <question> <I>     : "Ỉ" U1EC8 # LATIN CAPITAL LETTER I WITH HOOK ABOVE
+<dead_hook> <i>        : "ỉ" U1EC9 # LATIN SMALL LETTER I WITH HOOK ABOVE
+<Multi_key> <question> <i>     : "ỉ" U1EC9 # LATIN SMALL LETTER I WITH HOOK ABOVE
+<dead_belowdot> <I>    : "Ị" U1ECA # LATIN CAPITAL LETTER I WITH DOT BELOW
+<Multi_key> <exclam> <I>       : "Ị" U1ECA # LATIN CAPITAL LETTER I WITH DOT BELOW
+<dead_belowdot> <i>    : "ị" U1ECB # LATIN SMALL LETTER I WITH DOT BELOW
+<Multi_key> <exclam> <i>       : "ị" U1ECB # LATIN SMALL LETTER I WITH DOT BELOW
+<dead_belowdot> <O>    : "Ọ" U1ECC # LATIN CAPITAL LETTER O WITH DOT BELOW
+<Multi_key> <exclam> <O>       : "Ọ" U1ECC # LATIN CAPITAL LETTER O WITH DOT BELOW
+<dead_belowdot> <o>    : "ọ" U1ECD # LATIN SMALL LETTER O WITH DOT BELOW
+<Multi_key> <exclam> <o>       : "ọ" U1ECD # LATIN SMALL LETTER O WITH DOT BELOW
+<dead_hook> <O>        : "Ỏ" U1ECE # LATIN CAPITAL LETTER O WITH HOOK ABOVE
+<Multi_key> <question> <O>     : "Ỏ" U1ECE # LATIN CAPITAL LETTER O WITH HOOK ABOVE
+<dead_hook> <o>        : "ỏ" U1ECF # LATIN SMALL LETTER O WITH HOOK ABOVE
+<Multi_key> <question> <o>     : "ỏ" U1ECF # LATIN SMALL LETTER O WITH HOOK ABOVE
+<dead_acute> <Ocircumflex>     : "Ố" U1ED0 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <Ocircumflex>      : "Ố" U1ED0 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <Ocircumflex> : "Ố" U1ED0 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+<dead_acute> <dead_circumflex> <O>     : "Ố" U1ED0 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+<dead_acute> <Multi_key> <asciicircum> <O>     : "Ố" U1ED0 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <dead_circumflex> <O>      : "Ố" U1ED0 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <asciicircum> <O>  : "Ố" U1ED0 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <dead_circumflex> <O> : "Ố" U1ED0 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <asciicircum> <O>     : "Ố" U1ED0 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+<dead_acute> <ocircumflex>     : "ố" U1ED1 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <ocircumflex>      : "ố" U1ED1 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <ocircumflex> : "ố" U1ED1 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+<dead_acute> <dead_circumflex> <o>     : "ố" U1ED1 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+<dead_acute> <Multi_key> <asciicircum> <o>     : "ố" U1ED1 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <dead_circumflex> <o>      : "ố" U1ED1 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <acute> <asciicircum> <o>  : "ố" U1ED1 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <dead_circumflex> <o> : "ố" U1ED1 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+<Multi_key> <apostrophe> <asciicircum> <o>     : "ố" U1ED1 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+<dead_grave> <Ocircumflex>     : "Ồ" U1ED2 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <Ocircumflex>      : "Ồ" U1ED2 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+<dead_grave> <dead_circumflex> <O>     : "Ồ" U1ED2 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+<dead_grave> <Multi_key> <asciicircum> <O>     : "Ồ" U1ED2 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <dead_circumflex> <O>      : "Ồ" U1ED2 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <asciicircum> <O>  : "Ồ" U1ED2 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+<dead_grave> <ocircumflex>     : "ồ" U1ED3 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <ocircumflex>      : "ồ" U1ED3 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+<dead_grave> <dead_circumflex> <o>     : "ồ" U1ED3 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+<dead_grave> <Multi_key> <asciicircum> <o>     : "ồ" U1ED3 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <dead_circumflex> <o>      : "ồ" U1ED3 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+<Multi_key> <grave> <asciicircum> <o>  : "ồ" U1ED3 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+<dead_hook> <Ocircumflex>      : "Ổ" U1ED4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <Ocircumflex>   : "Ổ" U1ED4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_hook> <dead_circumflex> <O>      : "Ổ" U1ED4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_hook> <Multi_key> <asciicircum> <O>      : "Ổ" U1ED4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <dead_circumflex> <O>   : "Ổ" U1ED4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <asciicircum> <O>       : "Ổ" U1ED4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_hook> <ocircumflex>      : "ổ" U1ED5 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <ocircumflex>   : "ổ" U1ED5 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_hook> <dead_circumflex> <o>      : "ổ" U1ED5 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_hook> <Multi_key> <asciicircum> <o>      : "ổ" U1ED5 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <dead_circumflex> <o>   : "ổ" U1ED5 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+<Multi_key> <question> <asciicircum> <o>       : "ổ" U1ED5 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+<dead_tilde> <Ocircumflex>     : "Ỗ" U1ED6 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <Ocircumflex> : "Ỗ" U1ED6 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+<dead_tilde> <dead_circumflex> <O>     : "Ỗ" U1ED6 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+<dead_tilde> <Multi_key> <asciicircum> <O>     : "Ỗ" U1ED6 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <dead_circumflex> <O> : "Ỗ" U1ED6 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <asciicircum> <O>     : "Ỗ" U1ED6 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+<dead_tilde> <ocircumflex>     : "ỗ" U1ED7 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <ocircumflex> : "ỗ" U1ED7 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+<dead_tilde> <dead_circumflex> <o>     : "ỗ" U1ED7 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+<dead_tilde> <Multi_key> <asciicircum> <o>     : "ỗ" U1ED7 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <dead_circumflex> <o> : "ỗ" U1ED7 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+<Multi_key> <asciitilde> <asciicircum> <o>     : "ỗ" U1ED7 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+<dead_circumflex> <U1ecc>      : "Ộ" U1ED8 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <U1ecc>      : "Ộ" U1ED8 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+<dead_circumflex> <dead_belowdot> <O>  : "Ộ" U1ED8 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+<dead_circumflex> <Multi_key> <exclam> <O>     : "Ộ" U1ED8 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <dead_belowdot> <O>  : "Ộ" U1ED8 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <exclam> <O> : "Ộ" U1ED8 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+<dead_circumflex> <U1ecd>      : "ộ" U1ED9 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <U1ecd>      : "ộ" U1ED9 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+<dead_circumflex> <dead_belowdot> <o>  : "ộ" U1ED9 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+<dead_circumflex> <Multi_key> <exclam> <o>     : "ộ" U1ED9 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <dead_belowdot> <o>  : "ộ" U1ED9 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+<Multi_key> <asciicircum> <exclam> <o> : "ộ" U1ED9 # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+<dead_acute> <Ohorn>   : "Ớ" U1EDA # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+<Multi_key> <acute> <Ohorn>    : "Ớ" U1EDA # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+<Multi_key> <apostrophe> <Ohorn>       : "Ớ" U1EDA # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+<dead_acute> <dead_horn> <O>   : "Ớ" U1EDA # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+<dead_acute> <Multi_key> <plus> <O>    : "Ớ" U1EDA # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+<Multi_key> <acute> <dead_horn> <O>    : "Ớ" U1EDA # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+<Multi_key> <acute> <plus> <O> : "Ớ" U1EDA # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+<Multi_key> <apostrophe> <dead_horn> <O>       : "Ớ" U1EDA # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+<Multi_key> <apostrophe> <plus> <O>    : "Ớ" U1EDA # LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+<dead_acute> <ohorn>   : "ớ" U1EDB # LATIN SMALL LETTER O WITH HORN AND ACUTE
+<Multi_key> <acute> <ohorn>    : "ớ" U1EDB # LATIN SMALL LETTER O WITH HORN AND ACUTE
+<Multi_key> <apostrophe> <ohorn>       : "ớ" U1EDB # LATIN SMALL LETTER O WITH HORN AND ACUTE
+<dead_acute> <dead_horn> <o>   : "ớ" U1EDB # LATIN SMALL LETTER O WITH HORN AND ACUTE
+<dead_acute> <Multi_key> <plus> <o>    : "ớ" U1EDB # LATIN SMALL LETTER O WITH HORN AND ACUTE
+<Multi_key> <acute> <dead_horn> <o>    : "ớ" U1EDB # LATIN SMALL LETTER O WITH HORN AND ACUTE
+<Multi_key> <acute> <plus> <o> : "ớ" U1EDB # LATIN SMALL LETTER O WITH HORN AND ACUTE
+<Multi_key> <apostrophe> <dead_horn> <o>       : "ớ" U1EDB # LATIN SMALL LETTER O WITH HORN AND ACUTE
+<Multi_key> <apostrophe> <plus> <o>    : "ớ" U1EDB # LATIN SMALL LETTER O WITH HORN AND ACUTE
+<dead_grave> <Ohorn>   : "Ờ" U1EDC # LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+<Multi_key> <grave> <Ohorn>    : "Ờ" U1EDC # LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+<dead_grave> <dead_horn> <O>   : "Ờ" U1EDC # LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+<dead_grave> <Multi_key> <plus> <O>    : "Ờ" U1EDC # LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+<Multi_key> <grave> <dead_horn> <O>    : "Ờ" U1EDC # LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+<Multi_key> <grave> <plus> <O> : "Ờ" U1EDC # LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+<dead_grave> <ohorn>   : "ờ" U1EDD # LATIN SMALL LETTER O WITH HORN AND GRAVE
+<Multi_key> <grave> <ohorn>    : "ờ" U1EDD # LATIN SMALL LETTER O WITH HORN AND GRAVE
+<dead_grave> <dead_horn> <o>   : "ờ" U1EDD # LATIN SMALL LETTER O WITH HORN AND GRAVE
+<dead_grave> <Multi_key> <plus> <o>    : "ờ" U1EDD # LATIN SMALL LETTER O WITH HORN AND GRAVE
+<Multi_key> <grave> <dead_horn> <o>    : "ờ" U1EDD # LATIN SMALL LETTER O WITH HORN AND GRAVE
+<Multi_key> <grave> <plus> <o> : "ờ" U1EDD # LATIN SMALL LETTER O WITH HORN AND GRAVE
+<dead_hook> <Ohorn>    : "Ở" U1EDE # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+<Multi_key> <question> <Ohorn> : "Ở" U1EDE # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+<dead_hook> <dead_horn> <O>    : "Ở" U1EDE # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+<dead_hook> <Multi_key> <plus> <O>     : "Ở" U1EDE # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+<Multi_key> <question> <dead_horn> <O> : "Ở" U1EDE # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+<Multi_key> <question> <plus> <O>      : "Ở" U1EDE # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+<dead_hook> <ohorn>    : "ở" U1EDF # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+<Multi_key> <question> <ohorn> : "ở" U1EDF # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+<dead_hook> <dead_horn> <o>    : "ở" U1EDF # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+<dead_hook> <Multi_key> <plus> <o>     : "ở" U1EDF # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+<Multi_key> <question> <dead_horn> <o> : "ở" U1EDF # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+<Multi_key> <question> <plus> <o>      : "ở" U1EDF # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+<dead_tilde> <Ohorn>   : "Ỡ" U1EE0 # LATIN CAPITAL LETTER O WITH HORN AND TILDE
+<Multi_key> <asciitilde> <Ohorn>       : "Ỡ" U1EE0 # LATIN CAPITAL LETTER O WITH HORN AND TILDE
+<dead_tilde> <dead_horn> <O>   : "Ỡ" U1EE0 # LATIN CAPITAL LETTER O WITH HORN AND TILDE
+<dead_tilde> <Multi_key> <plus> <O>    : "Ỡ" U1EE0 # LATIN CAPITAL LETTER O WITH HORN AND TILDE
+<Multi_key> <asciitilde> <dead_horn> <O>       : "Ỡ" U1EE0 # LATIN CAPITAL LETTER O WITH HORN AND TILDE
+<Multi_key> <asciitilde> <plus> <O>    : "Ỡ" U1EE0 # LATIN CAPITAL LETTER O WITH HORN AND TILDE
+<dead_tilde> <ohorn>   : "ỡ" U1EE1 # LATIN SMALL LETTER O WITH HORN AND TILDE
+<Multi_key> <asciitilde> <ohorn>       : "ỡ" U1EE1 # LATIN SMALL LETTER O WITH HORN AND TILDE
+<dead_tilde> <dead_horn> <o>   : "ỡ" U1EE1 # LATIN SMALL LETTER O WITH HORN AND TILDE
+<dead_tilde> <Multi_key> <plus> <o>    : "ỡ" U1EE1 # LATIN SMALL LETTER O WITH HORN AND TILDE
+<Multi_key> <asciitilde> <dead_horn> <o>       : "ỡ" U1EE1 # LATIN SMALL LETTER O WITH HORN AND TILDE
+<Multi_key> <asciitilde> <plus> <o>    : "ỡ" U1EE1 # LATIN SMALL LETTER O WITH HORN AND TILDE
+<dead_belowdot> <Ohorn>        : "Ợ" U1EE2 # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+<Multi_key> <exclam> <Ohorn>   : "Ợ" U1EE2 # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+<dead_belowdot> <dead_horn> <O>        : "Ợ" U1EE2 # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+<dead_belowdot> <Multi_key> <plus> <O> : "Ợ" U1EE2 # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+<Multi_key> <exclam> <dead_horn> <O>   : "Ợ" U1EE2 # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+<Multi_key> <exclam> <plus> <O>        : "Ợ" U1EE2 # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+<dead_belowdot> <ohorn>        : "ợ" U1EE3 # LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+<Multi_key> <exclam> <ohorn>   : "ợ" U1EE3 # LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+<dead_belowdot> <dead_horn> <o>        : "ợ" U1EE3 # LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+<dead_belowdot> <Multi_key> <plus> <o> : "ợ" U1EE3 # LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+<Multi_key> <exclam> <dead_horn> <o>   : "ợ" U1EE3 # LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+<Multi_key> <exclam> <plus> <o>        : "ợ" U1EE3 # LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+<dead_belowdot> <U>    : "Ụ" U1EE4 # LATIN CAPITAL LETTER U WITH DOT BELOW
+<Multi_key> <exclam> <U>       : "Ụ" U1EE4 # LATIN CAPITAL LETTER U WITH DOT BELOW
+<dead_belowdot> <u>    : "ụ" U1EE5 # LATIN SMALL LETTER U WITH DOT BELOW
+<Multi_key> <exclam> <u>       : "ụ" U1EE5 # LATIN SMALL LETTER U WITH DOT BELOW
+<dead_hook> <U>        : "Ủ" U1EE6 # LATIN CAPITAL LETTER U WITH HOOK ABOVE
+<Multi_key> <question> <U>     : "Ủ" U1EE6 # LATIN CAPITAL LETTER U WITH HOOK ABOVE
+<dead_hook> <u>        : "ủ" U1EE7 # LATIN SMALL LETTER U WITH HOOK ABOVE
+<Multi_key> <question> <u>     : "ủ" U1EE7 # LATIN SMALL LETTER U WITH HOOK ABOVE
+<dead_acute> <Uhorn>   : "Ứ" U1EE8 # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+<Multi_key> <acute> <Uhorn>    : "Ứ" U1EE8 # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+<Multi_key> <apostrophe> <Uhorn>       : "Ứ" U1EE8 # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+<dead_acute> <dead_horn> <U>   : "Ứ" U1EE8 # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+<dead_acute> <Multi_key> <plus> <U>    : "Ứ" U1EE8 # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+<Multi_key> <acute> <dead_horn> <U>    : "Ứ" U1EE8 # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+<Multi_key> <acute> <plus> <U> : "Ứ" U1EE8 # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+<Multi_key> <apostrophe> <dead_horn> <U>       : "Ứ" U1EE8 # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+<Multi_key> <apostrophe> <plus> <U>    : "Ứ" U1EE8 # LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+<dead_acute> <uhorn>   : "ứ" U1EE9 # LATIN SMALL LETTER U WITH HORN AND ACUTE
+<Multi_key> <acute> <uhorn>    : "ứ" U1EE9 # LATIN SMALL LETTER U WITH HORN AND ACUTE
+<Multi_key> <apostrophe> <uhorn>       : "ứ" U1EE9 # LATIN SMALL LETTER U WITH HORN AND ACUTE
+<dead_acute> <dead_horn> <u>   : "ứ" U1EE9 # LATIN SMALL LETTER U WITH HORN AND ACUTE
+<dead_acute> <Multi_key> <plus> <u>    : "ứ" U1EE9 # LATIN SMALL LETTER U WITH HORN AND ACUTE
+<Multi_key> <acute> <dead_horn> <u>    : "ứ" U1EE9 # LATIN SMALL LETTER U WITH HORN AND ACUTE
+<Multi_key> <acute> <plus> <u> : "ứ" U1EE9 # LATIN SMALL LETTER U WITH HORN AND ACUTE
+<Multi_key> <apostrophe> <dead_horn> <u>       : "ứ" U1EE9 # LATIN SMALL LETTER U WITH HORN AND ACUTE
+<Multi_key> <apostrophe> <plus> <u>    : "ứ" U1EE9 # LATIN SMALL LETTER U WITH HORN AND ACUTE
+<dead_grave> <Uhorn>   : "Ừ" U1EEA # LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+<Multi_key> <grave> <Uhorn>    : "Ừ" U1EEA # LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+<dead_grave> <dead_horn> <U>   : "Ừ" U1EEA # LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+<dead_grave> <Multi_key> <plus> <U>    : "Ừ" U1EEA # LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+<Multi_key> <grave> <dead_horn> <U>    : "Ừ" U1EEA # LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+<Multi_key> <grave> <plus> <U> : "Ừ" U1EEA # LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+<dead_grave> <uhorn>   : "ừ" U1EEB # LATIN SMALL LETTER U WITH HORN AND GRAVE
+<Multi_key> <grave> <uhorn>    : "ừ" U1EEB # LATIN SMALL LETTER U WITH HORN AND GRAVE
+<dead_grave> <dead_horn> <u>   : "ừ" U1EEB # LATIN SMALL LETTER U WITH HORN AND GRAVE
+<dead_grave> <Multi_key> <plus> <u>    : "ừ" U1EEB # LATIN SMALL LETTER U WITH HORN AND GRAVE
+<Multi_key> <grave> <dead_horn> <u>    : "ừ" U1EEB # LATIN SMALL LETTER U WITH HORN AND GRAVE
+<Multi_key> <grave> <plus> <u> : "ừ" U1EEB # LATIN SMALL LETTER U WITH HORN AND GRAVE
+<dead_hook> <Uhorn>    : "Ử" U1EEC # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+<Multi_key> <question> <Uhorn> : "Ử" U1EEC # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+<dead_hook> <dead_horn> <U>    : "Ử" U1EEC # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+<dead_hook> <Multi_key> <plus> <U>     : "Ử" U1EEC # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+<Multi_key> <question> <dead_horn> <U> : "Ử" U1EEC # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+<Multi_key> <question> <plus> <U>      : "Ử" U1EEC # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+<dead_hook> <uhorn>    : "ử" U1EED # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+<Multi_key> <question> <uhorn> : "ử" U1EED # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+<dead_hook> <dead_horn> <u>    : "ử" U1EED # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+<dead_hook> <Multi_key> <plus> <u>     : "ử" U1EED # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+<Multi_key> <question> <dead_horn> <u> : "ử" U1EED # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+<Multi_key> <question> <plus> <u>      : "ử" U1EED # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+<dead_tilde> <Uhorn>   : "Ữ" U1EEE # LATIN CAPITAL LETTER U WITH HORN AND TILDE
+<Multi_key> <asciitilde> <Uhorn>       : "Ữ" U1EEE # LATIN CAPITAL LETTER U WITH HORN AND TILDE
+<dead_tilde> <dead_horn> <U>   : "Ữ" U1EEE # LATIN CAPITAL LETTER U WITH HORN AND TILDE
+<dead_tilde> <Multi_key> <plus> <U>    : "Ữ" U1EEE # LATIN CAPITAL LETTER U WITH HORN AND TILDE
+<Multi_key> <asciitilde> <dead_horn> <U>       : "Ữ" U1EEE # LATIN CAPITAL LETTER U WITH HORN AND TILDE
+<Multi_key> <asciitilde> <plus> <U>    : "Ữ" U1EEE # LATIN CAPITAL LETTER U WITH HORN AND TILDE
+<dead_tilde> <uhorn>   : "ữ" U1EEF # LATIN SMALL LETTER U WITH HORN AND TILDE
+<Multi_key> <asciitilde> <uhorn>       : "ữ" U1EEF # LATIN SMALL LETTER U WITH HORN AND TILDE
+<dead_tilde> <dead_horn> <u>   : "ữ" U1EEF # LATIN SMALL LETTER U WITH HORN AND TILDE
+<dead_tilde> <Multi_key> <plus> <u>    : "ữ" U1EEF # LATIN SMALL LETTER U WITH HORN AND TILDE
+<Multi_key> <asciitilde> <dead_horn> <u>       : "ữ" U1EEF # LATIN SMALL LETTER U WITH HORN AND TILDE
+<Multi_key> <asciitilde> <plus> <u>    : "ữ" U1EEF # LATIN SMALL LETTER U WITH HORN AND TILDE
+<dead_belowdot> <Uhorn>        : "Ự" U1EF0 # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+<Multi_key> <exclam> <Uhorn>   : "Ự" U1EF0 # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+<dead_belowdot> <dead_horn> <U>        : "Ự" U1EF0 # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+<dead_belowdot> <Multi_key> <plus> <U> : "Ự" U1EF0 # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+<Multi_key> <exclam> <dead_horn> <U>   : "Ự" U1EF0 # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+<Multi_key> <exclam> <plus> <U>        : "Ự" U1EF0 # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+<dead_belowdot> <uhorn>        : "ự" U1EF1 # LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+<Multi_key> <exclam> <uhorn>   : "ự" U1EF1 # LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+<dead_belowdot> <dead_horn> <u>        : "ự" U1EF1 # LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+<dead_belowdot> <Multi_key> <plus> <u> : "ự" U1EF1 # LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+<Multi_key> <exclam> <dead_horn> <u>   : "ự" U1EF1 # LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+<Multi_key> <exclam> <plus> <u>        : "ự" U1EF1 # LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+<dead_grave> <Y>       : "Ỳ" U1EF2 # LATIN CAPITAL LETTER Y WITH GRAVE
+<Multi_key> <grave> <Y>        : "Ỳ" U1EF2 # LATIN CAPITAL LETTER Y WITH GRAVE
+<dead_grave> <y>       : "ỳ" U1EF3 # LATIN SMALL LETTER Y WITH GRAVE
+<Multi_key> <grave> <y>        : "ỳ" U1EF3 # LATIN SMALL LETTER Y WITH GRAVE
+<dead_belowdot> <Y>    : "Ỵ" U1EF4 # LATIN CAPITAL LETTER Y WITH DOT BELOW
+<Multi_key> <exclam> <Y>       : "Ỵ" U1EF4 # LATIN CAPITAL LETTER Y WITH DOT BELOW
+<dead_belowdot> <y>    : "ỵ" U1EF5 # LATIN SMALL LETTER Y WITH DOT BELOW
+<Multi_key> <exclam> <y>       : "ỵ" U1EF5 # LATIN SMALL LETTER Y WITH DOT BELOW
+<dead_hook> <Y>        : "Ỷ" U1EF6 # LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+<Multi_key> <question> <Y>     : "Ỷ" U1EF6 # LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+<dead_hook> <y>        : "ỷ" U1EF7 # LATIN SMALL LETTER Y WITH HOOK ABOVE
+<Multi_key> <question> <y>     : "ỷ" U1EF7 # LATIN SMALL LETTER Y WITH HOOK ABOVE
+<dead_tilde> <Y>       : "Ỹ" U1EF8 # LATIN CAPITAL LETTER Y WITH TILDE
+<Multi_key> <asciitilde> <Y>   : "Ỹ" U1EF8 # LATIN CAPITAL LETTER Y WITH TILDE
+<dead_tilde> <y>       : "ỹ" U1EF9 # LATIN SMALL LETTER Y WITH TILDE
+<Multi_key> <asciitilde> <y>   : "ỹ" U1EF9 # LATIN SMALL LETTER Y WITH TILDE
+<Multi_key> <parenright> <Greek_alpha> : "ἀ" U1F00 # GREEK SMALL LETTER ALPHA WITH PSILI
+<Multi_key> <parenleft> <Greek_alpha>  : "ἁ" U1F01 # GREEK SMALL LETTER ALPHA WITH DASIA
+<dead_grave> <U1f00>   : "ἂ" U1F02 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
+<Multi_key> <grave> <U1f00>    : "ἂ" U1F02 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
+<dead_grave> <Multi_key> <parenright> <Greek_alpha>    : "ἂ" U1F02 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
+<Multi_key> <grave> <parenright> <Greek_alpha> : "ἂ" U1F02 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
+<dead_grave> <U1f01>   : "ἃ" U1F03 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
+<Multi_key> <grave> <U1f01>    : "ἃ" U1F03 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
+<dead_grave> <Multi_key> <parenleft> <Greek_alpha>     : "ἃ" U1F03 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
+<Multi_key> <grave> <parenleft> <Greek_alpha>  : "ἃ" U1F03 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
+<dead_acute> <U1f00>   : "ἄ" U1F04 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+<Multi_key> <acute> <U1f00>    : "ἄ" U1F04 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <U1f00>       : "ἄ" U1F04 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+<dead_acute> <Multi_key> <parenright> <Greek_alpha>    : "ἄ" U1F04 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+<Multi_key> <acute> <parenright> <Greek_alpha> : "ἄ" U1F04 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <parenright> <Greek_alpha>    : "ἄ" U1F04 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+<dead_acute> <U1f01>   : "ἅ" U1F05 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+<Multi_key> <acute> <U1f01>    : "ἅ" U1F05 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <U1f01>       : "ἅ" U1F05 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+<dead_acute> <Multi_key> <parenleft> <Greek_alpha>     : "ἅ" U1F05 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+<Multi_key> <acute> <parenleft> <Greek_alpha>  : "ἅ" U1F05 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <parenleft> <Greek_alpha>     : "ἅ" U1F05 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+<dead_tilde> <U1f00>   : "ἆ" U1F06 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <U1f00>       : "ἆ" U1F06 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenright> <Greek_alpha>    : "ἆ" U1F06 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <parenright> <Greek_alpha>    : "ἆ" U1F06 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
+<dead_tilde> <U1f01>   : "ἇ" U1F07 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <U1f01>       : "ἇ" U1F07 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenleft> <Greek_alpha>     : "ἇ" U1F07 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <parenleft> <Greek_alpha>     : "ἇ" U1F07 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+<Multi_key> <parenright> <Greek_ALPHA> : "Ἀ" U1F08 # GREEK CAPITAL LETTER ALPHA WITH PSILI
+<Multi_key> <parenleft> <Greek_ALPHA>  : "Ἁ" U1F09 # GREEK CAPITAL LETTER ALPHA WITH DASIA
+<dead_grave> <U1f08>   : "Ἂ" U1F0A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+<Multi_key> <grave> <U1f08>    : "Ἂ" U1F0A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+<dead_grave> <Multi_key> <parenright> <Greek_ALPHA>    : "Ἂ" U1F0A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+<Multi_key> <grave> <parenright> <Greek_ALPHA> : "Ἂ" U1F0A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+<dead_grave> <U1f09>   : "Ἃ" U1F0B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+<Multi_key> <grave> <U1f09>    : "Ἃ" U1F0B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+<dead_grave> <Multi_key> <parenleft> <Greek_ALPHA>     : "Ἃ" U1F0B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+<Multi_key> <grave> <parenleft> <Greek_ALPHA>  : "Ἃ" U1F0B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+<dead_acute> <U1f08>   : "Ἄ" U1F0C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+<Multi_key> <acute> <U1f08>    : "Ἄ" U1F0C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <U1f08>       : "Ἄ" U1F0C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+<dead_acute> <Multi_key> <parenright> <Greek_ALPHA>    : "Ἄ" U1F0C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+<Multi_key> <acute> <parenright> <Greek_ALPHA> : "Ἄ" U1F0C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <parenright> <Greek_ALPHA>    : "Ἄ" U1F0C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+<dead_acute> <U1f09>   : "Ἅ" U1F0D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+<Multi_key> <acute> <U1f09>    : "Ἅ" U1F0D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <U1f09>       : "Ἅ" U1F0D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+<dead_acute> <Multi_key> <parenleft> <Greek_ALPHA>     : "Ἅ" U1F0D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+<Multi_key> <acute> <parenleft> <Greek_ALPHA>  : "Ἅ" U1F0D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <parenleft> <Greek_ALPHA>     : "Ἅ" U1F0D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+<dead_tilde> <U1f08>   : "Ἆ" U1F0E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <U1f08>       : "Ἆ" U1F0E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenright> <Greek_ALPHA>    : "Ἆ" U1F0E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <parenright> <Greek_ALPHA>    : "Ἆ" U1F0E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+<dead_tilde> <U1f09>   : "Ἇ" U1F0F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <U1f09>       : "Ἇ" U1F0F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenleft> <Greek_ALPHA>     : "Ἇ" U1F0F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <parenleft> <Greek_ALPHA>     : "Ἇ" U1F0F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+<Multi_key> <parenright> <Greek_epsilon>       : "ἐ" U1F10 # GREEK SMALL LETTER EPSILON WITH PSILI
+<Multi_key> <parenleft> <Greek_epsilon>        : "ἑ" U1F11 # GREEK SMALL LETTER EPSILON WITH DASIA
+<dead_grave> <U1f10>   : "ἒ" U1F12 # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA
+<Multi_key> <grave> <U1f10>    : "ἒ" U1F12 # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA
+<dead_grave> <Multi_key> <parenright> <Greek_epsilon>  : "ἒ" U1F12 # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA
+<Multi_key> <grave> <parenright> <Greek_epsilon>       : "ἒ" U1F12 # GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA
+<dead_grave> <U1f11>   : "ἓ" U1F13 # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA
+<Multi_key> <grave> <U1f11>    : "ἓ" U1F13 # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA
+<dead_grave> <Multi_key> <parenleft> <Greek_epsilon>   : "ἓ" U1F13 # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA
+<Multi_key> <grave> <parenleft> <Greek_epsilon>        : "ἓ" U1F13 # GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA
+<dead_acute> <U1f10>   : "ἔ" U1F14 # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+<Multi_key> <acute> <U1f10>    : "ἔ" U1F14 # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <U1f10>       : "ἔ" U1F14 # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+<dead_acute> <Multi_key> <parenright> <Greek_epsilon>  : "ἔ" U1F14 # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+<Multi_key> <acute> <parenright> <Greek_epsilon>       : "ἔ" U1F14 # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <parenright> <Greek_epsilon>  : "ἔ" U1F14 # GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+<dead_acute> <U1f11>   : "ἕ" U1F15 # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+<Multi_key> <acute> <U1f11>    : "ἕ" U1F15 # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <U1f11>       : "ἕ" U1F15 # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+<dead_acute> <Multi_key> <parenleft> <Greek_epsilon>   : "ἕ" U1F15 # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+<Multi_key> <acute> <parenleft> <Greek_epsilon>        : "ἕ" U1F15 # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <parenleft> <Greek_epsilon>   : "ἕ" U1F15 # GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+<Multi_key> <parenright> <Greek_EPSILON>       : "Ἐ" U1F18 # GREEK CAPITAL LETTER EPSILON WITH PSILI
+<Multi_key> <parenleft> <Greek_EPSILON>        : "Ἑ" U1F19 # GREEK CAPITAL LETTER EPSILON WITH DASIA
+<dead_grave> <U1f18>   : "Ἒ" U1F1A # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+<Multi_key> <grave> <U1f18>    : "Ἒ" U1F1A # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+<dead_grave> <Multi_key> <parenright> <Greek_EPSILON>  : "Ἒ" U1F1A # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+<Multi_key> <grave> <parenright> <Greek_EPSILON>       : "Ἒ" U1F1A # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+<dead_grave> <U1f19>   : "Ἓ" U1F1B # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+<Multi_key> <grave> <U1f19>    : "Ἓ" U1F1B # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+<dead_grave> <Multi_key> <parenleft> <Greek_EPSILON>   : "Ἓ" U1F1B # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+<Multi_key> <grave> <parenleft> <Greek_EPSILON>        : "Ἓ" U1F1B # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+<dead_acute> <U1f18>   : "Ἔ" U1F1C # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+<Multi_key> <acute> <U1f18>    : "Ἔ" U1F1C # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <U1f18>       : "Ἔ" U1F1C # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+<dead_acute> <Multi_key> <parenright> <Greek_EPSILON>  : "Ἔ" U1F1C # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+<Multi_key> <acute> <parenright> <Greek_EPSILON>       : "Ἔ" U1F1C # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <parenright> <Greek_EPSILON>  : "Ἔ" U1F1C # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+<dead_acute> <U1f19>   : "Ἕ" U1F1D # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+<Multi_key> <acute> <U1f19>    : "Ἕ" U1F1D # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <U1f19>       : "Ἕ" U1F1D # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+<dead_acute> <Multi_key> <parenleft> <Greek_EPSILON>   : "Ἕ" U1F1D # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+<Multi_key> <acute> <parenleft> <Greek_EPSILON>        : "Ἕ" U1F1D # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <parenleft> <Greek_EPSILON>   : "Ἕ" U1F1D # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+<Multi_key> <parenright> <Greek_eta>   : "ἠ" U1F20 # GREEK SMALL LETTER ETA WITH PSILI
+<Multi_key> <parenleft> <Greek_eta>    : "ἡ" U1F21 # GREEK SMALL LETTER ETA WITH DASIA
+<dead_grave> <U1f20>   : "ἢ" U1F22 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA
+<Multi_key> <grave> <U1f20>    : "ἢ" U1F22 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA
+<dead_grave> <Multi_key> <parenright> <Greek_eta>      : "ἢ" U1F22 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA
+<Multi_key> <grave> <parenright> <Greek_eta>   : "ἢ" U1F22 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA
+<dead_grave> <U1f21>   : "ἣ" U1F23 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA
+<Multi_key> <grave> <U1f21>    : "ἣ" U1F23 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA
+<dead_grave> <Multi_key> <parenleft> <Greek_eta>       : "ἣ" U1F23 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA
+<Multi_key> <grave> <parenleft> <Greek_eta>    : "ἣ" U1F23 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA
+<dead_acute> <U1f20>   : "ἤ" U1F24 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+<Multi_key> <acute> <U1f20>    : "ἤ" U1F24 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <U1f20>       : "ἤ" U1F24 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+<dead_acute> <Multi_key> <parenright> <Greek_eta>      : "ἤ" U1F24 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+<Multi_key> <acute> <parenright> <Greek_eta>   : "ἤ" U1F24 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <parenright> <Greek_eta>      : "ἤ" U1F24 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+<dead_acute> <U1f21>   : "ἥ" U1F25 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+<Multi_key> <acute> <U1f21>    : "ἥ" U1F25 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <U1f21>       : "ἥ" U1F25 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+<dead_acute> <Multi_key> <parenleft> <Greek_eta>       : "ἥ" U1F25 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+<Multi_key> <acute> <parenleft> <Greek_eta>    : "ἥ" U1F25 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <parenleft> <Greek_eta>       : "ἥ" U1F25 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+<dead_tilde> <U1f20>   : "ἦ" U1F26 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <U1f20>       : "ἦ" U1F26 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenright> <Greek_eta>      : "ἦ" U1F26 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <parenright> <Greek_eta>      : "ἦ" U1F26 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI
+<dead_tilde> <U1f21>   : "ἧ" U1F27 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <U1f21>       : "ἧ" U1F27 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenleft> <Greek_eta>       : "ἧ" U1F27 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <parenleft> <Greek_eta>       : "ἧ" U1F27 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+<Multi_key> <parenright> <Greek_ETA>   : "Ἠ" U1F28 # GREEK CAPITAL LETTER ETA WITH PSILI
+<Multi_key> <parenleft> <Greek_ETA>    : "Ἡ" U1F29 # GREEK CAPITAL LETTER ETA WITH DASIA
+<dead_grave> <U1f28>   : "Ἢ" U1F2A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+<Multi_key> <grave> <U1f28>    : "Ἢ" U1F2A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+<dead_grave> <Multi_key> <parenright> <Greek_ETA>      : "Ἢ" U1F2A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+<Multi_key> <grave> <parenright> <Greek_ETA>   : "Ἢ" U1F2A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+<dead_grave> <U1f29>   : "Ἣ" U1F2B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+<Multi_key> <grave> <U1f29>    : "Ἣ" U1F2B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+<dead_grave> <Multi_key> <parenleft> <Greek_ETA>       : "Ἣ" U1F2B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+<Multi_key> <grave> <parenleft> <Greek_ETA>    : "Ἣ" U1F2B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+<dead_acute> <U1f28>   : "Ἤ" U1F2C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+<Multi_key> <acute> <U1f28>    : "Ἤ" U1F2C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <U1f28>       : "Ἤ" U1F2C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+<dead_acute> <Multi_key> <parenright> <Greek_ETA>      : "Ἤ" U1F2C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+<Multi_key> <acute> <parenright> <Greek_ETA>   : "Ἤ" U1F2C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <parenright> <Greek_ETA>      : "Ἤ" U1F2C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+<dead_acute> <U1f29>   : "Ἥ" U1F2D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+<Multi_key> <acute> <U1f29>    : "Ἥ" U1F2D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <U1f29>       : "Ἥ" U1F2D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+<dead_acute> <Multi_key> <parenleft> <Greek_ETA>       : "Ἥ" U1F2D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+<Multi_key> <acute> <parenleft> <Greek_ETA>    : "Ἥ" U1F2D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <parenleft> <Greek_ETA>       : "Ἥ" U1F2D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+<dead_tilde> <U1f28>   : "Ἦ" U1F2E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <U1f28>       : "Ἦ" U1F2E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenright> <Greek_ETA>      : "Ἦ" U1F2E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <parenright> <Greek_ETA>      : "Ἦ" U1F2E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+<dead_tilde> <U1f29>   : "Ἧ" U1F2F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <U1f29>       : "Ἧ" U1F2F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenleft> <Greek_ETA>       : "Ἧ" U1F2F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <parenleft> <Greek_ETA>       : "Ἧ" U1F2F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+<Multi_key> <parenright> <Greek_iota>  : "ἰ" U1F30 # GREEK SMALL LETTER IOTA WITH PSILI
+<Multi_key> <parenleft> <Greek_iota>   : "ἱ" U1F31 # GREEK SMALL LETTER IOTA WITH DASIA
+<dead_grave> <U1f30>   : "ἲ" U1F32 # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA
+<Multi_key> <grave> <U1f30>    : "ἲ" U1F32 # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA
+<dead_grave> <Multi_key> <parenright> <Greek_iota>     : "ἲ" U1F32 # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA
+<Multi_key> <grave> <parenright> <Greek_iota>  : "ἲ" U1F32 # GREEK SMALL LETTER IOTA WITH PSILI AND VARIA
+<dead_grave> <U1f31>   : "ἳ" U1F33 # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA
+<Multi_key> <grave> <U1f31>    : "ἳ" U1F33 # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA
+<dead_grave> <Multi_key> <parenleft> <Greek_iota>      : "ἳ" U1F33 # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA
+<Multi_key> <grave> <parenleft> <Greek_iota>   : "ἳ" U1F33 # GREEK SMALL LETTER IOTA WITH DASIA AND VARIA
+<dead_acute> <U1f30>   : "ἴ" U1F34 # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+<Multi_key> <acute> <U1f30>    : "ἴ" U1F34 # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <U1f30>       : "ἴ" U1F34 # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+<dead_acute> <Multi_key> <parenright> <Greek_iota>     : "ἴ" U1F34 # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+<Multi_key> <acute> <parenright> <Greek_iota>  : "ἴ" U1F34 # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <parenright> <Greek_iota>     : "ἴ" U1F34 # GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+<dead_acute> <U1f31>   : "ἵ" U1F35 # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+<Multi_key> <acute> <U1f31>    : "ἵ" U1F35 # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <U1f31>       : "ἵ" U1F35 # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+<dead_acute> <Multi_key> <parenleft> <Greek_iota>      : "ἵ" U1F35 # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+<Multi_key> <acute> <parenleft> <Greek_iota>   : "ἵ" U1F35 # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <parenleft> <Greek_iota>      : "ἵ" U1F35 # GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+<dead_tilde> <U1f30>   : "ἶ" U1F36 # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <U1f30>       : "ἶ" U1F36 # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenright> <Greek_iota>     : "ἶ" U1F36 # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <parenright> <Greek_iota>     : "ἶ" U1F36 # GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI
+<dead_tilde> <U1f31>   : "ἷ" U1F37 # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <U1f31>       : "ἷ" U1F37 # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenleft> <Greek_iota>      : "ἷ" U1F37 # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <parenleft> <Greek_iota>      : "ἷ" U1F37 # GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+<Multi_key> <parenright> <Greek_IOTA>  : "Ἰ" U1F38 # GREEK CAPITAL LETTER IOTA WITH PSILI
+<Multi_key> <parenleft> <Greek_IOTA>   : "Ἱ" U1F39 # GREEK CAPITAL LETTER IOTA WITH DASIA
+<dead_grave> <U1f38>   : "Ἲ" U1F3A # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+<Multi_key> <grave> <U1f38>    : "Ἲ" U1F3A # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+<dead_grave> <Multi_key> <parenright> <Greek_IOTA>     : "Ἲ" U1F3A # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+<Multi_key> <grave> <parenright> <Greek_IOTA>  : "Ἲ" U1F3A # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+<dead_grave> <U1f39>   : "Ἳ" U1F3B # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+<Multi_key> <grave> <U1f39>    : "Ἳ" U1F3B # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+<dead_grave> <Multi_key> <parenleft> <Greek_IOTA>      : "Ἳ" U1F3B # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+<Multi_key> <grave> <parenleft> <Greek_IOTA>   : "Ἳ" U1F3B # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+<dead_acute> <U1f38>   : "Ἴ" U1F3C # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+<Multi_key> <acute> <U1f38>    : "Ἴ" U1F3C # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <U1f38>       : "Ἴ" U1F3C # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+<dead_acute> <Multi_key> <parenright> <Greek_IOTA>     : "Ἴ" U1F3C # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+<Multi_key> <acute> <parenright> <Greek_IOTA>  : "Ἴ" U1F3C # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <parenright> <Greek_IOTA>     : "Ἴ" U1F3C # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+<dead_acute> <U1f39>   : "Ἵ" U1F3D # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+<Multi_key> <acute> <U1f39>    : "Ἵ" U1F3D # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <U1f39>       : "Ἵ" U1F3D # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+<dead_acute> <Multi_key> <parenleft> <Greek_IOTA>      : "Ἵ" U1F3D # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+<Multi_key> <acute> <parenleft> <Greek_IOTA>   : "Ἵ" U1F3D # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <parenleft> <Greek_IOTA>      : "Ἵ" U1F3D # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+<dead_tilde> <U1f38>   : "Ἶ" U1F3E # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <U1f38>       : "Ἶ" U1F3E # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenright> <Greek_IOTA>     : "Ἶ" U1F3E # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <parenright> <Greek_IOTA>     : "Ἶ" U1F3E # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+<dead_tilde> <U1f39>   : "Ἷ" U1F3F # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <U1f39>       : "Ἷ" U1F3F # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenleft> <Greek_IOTA>      : "Ἷ" U1F3F # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <parenleft> <Greek_IOTA>      : "Ἷ" U1F3F # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+<Multi_key> <parenright> <Greek_omicron>       : "ὀ" U1F40 # GREEK SMALL LETTER OMICRON WITH PSILI
+<Multi_key> <parenleft> <Greek_omicron>        : "ὁ" U1F41 # GREEK SMALL LETTER OMICRON WITH DASIA
+<dead_grave> <U1f40>   : "ὂ" U1F42 # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA
+<Multi_key> <grave> <U1f40>    : "ὂ" U1F42 # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA
+<dead_grave> <Multi_key> <parenright> <Greek_omicron>  : "ὂ" U1F42 # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA
+<Multi_key> <grave> <parenright> <Greek_omicron>       : "ὂ" U1F42 # GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA
+<dead_grave> <U1f41>   : "ὃ" U1F43 # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA
+<Multi_key> <grave> <U1f41>    : "ὃ" U1F43 # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA
+<dead_grave> <Multi_key> <parenleft> <Greek_omicron>   : "ὃ" U1F43 # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA
+<Multi_key> <grave> <parenleft> <Greek_omicron>        : "ὃ" U1F43 # GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA
+<dead_acute> <U1f40>   : "ὄ" U1F44 # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+<Multi_key> <acute> <U1f40>    : "ὄ" U1F44 # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <U1f40>       : "ὄ" U1F44 # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+<dead_acute> <Multi_key> <parenright> <Greek_omicron>  : "ὄ" U1F44 # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+<Multi_key> <acute> <parenright> <Greek_omicron>       : "ὄ" U1F44 # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <parenright> <Greek_omicron>  : "ὄ" U1F44 # GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+<dead_acute> <U1f41>   : "ὅ" U1F45 # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+<Multi_key> <acute> <U1f41>    : "ὅ" U1F45 # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <U1f41>       : "ὅ" U1F45 # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+<dead_acute> <Multi_key> <parenleft> <Greek_omicron>   : "ὅ" U1F45 # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+<Multi_key> <acute> <parenleft> <Greek_omicron>        : "ὅ" U1F45 # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <parenleft> <Greek_omicron>   : "ὅ" U1F45 # GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+<Multi_key> <parenright> <Greek_OMICRON>       : "Ὀ" U1F48 # GREEK CAPITAL LETTER OMICRON WITH PSILI
+<Multi_key> <parenleft> <Greek_OMICRON>        : "Ὁ" U1F49 # GREEK CAPITAL LETTER OMICRON WITH DASIA
+<dead_grave> <U1f48>   : "Ὂ" U1F4A # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+<Multi_key> <grave> <U1f48>    : "Ὂ" U1F4A # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+<dead_grave> <Multi_key> <parenright> <Greek_OMICRON>  : "Ὂ" U1F4A # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+<Multi_key> <grave> <parenright> <Greek_OMICRON>       : "Ὂ" U1F4A # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+<dead_grave> <U1f49>   : "Ὃ" U1F4B # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+<Multi_key> <grave> <U1f49>    : "Ὃ" U1F4B # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+<dead_grave> <Multi_key> <parenleft> <Greek_OMICRON>   : "Ὃ" U1F4B # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+<Multi_key> <grave> <parenleft> <Greek_OMICRON>        : "Ὃ" U1F4B # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+<dead_acute> <U1f48>   : "Ὄ" U1F4C # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+<Multi_key> <acute> <U1f48>    : "Ὄ" U1F4C # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <U1f48>       : "Ὄ" U1F4C # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+<dead_acute> <Multi_key> <parenright> <Greek_OMICRON>  : "Ὄ" U1F4C # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+<Multi_key> <acute> <parenright> <Greek_OMICRON>       : "Ὄ" U1F4C # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <parenright> <Greek_OMICRON>  : "Ὄ" U1F4C # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+<dead_acute> <U1f49>   : "Ὅ" U1F4D # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+<Multi_key> <acute> <U1f49>    : "Ὅ" U1F4D # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <U1f49>       : "Ὅ" U1F4D # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+<dead_acute> <Multi_key> <parenleft> <Greek_OMICRON>   : "Ὅ" U1F4D # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+<Multi_key> <acute> <parenleft> <Greek_OMICRON>        : "Ὅ" U1F4D # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <parenleft> <Greek_OMICRON>   : "Ὅ" U1F4D # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+<Multi_key> <parenright> <Greek_upsilon>       : "ὐ" U1F50 # GREEK SMALL LETTER UPSILON WITH PSILI
+<Multi_key> <parenleft> <Greek_upsilon>        : "ὑ" U1F51 # GREEK SMALL LETTER UPSILON WITH DASIA
+<dead_grave> <U1f50>   : "ὒ" U1F52 # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+<Multi_key> <grave> <U1f50>    : "ὒ" U1F52 # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+<dead_grave> <Multi_key> <parenright> <Greek_upsilon>  : "ὒ" U1F52 # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+<Multi_key> <grave> <parenright> <Greek_upsilon>       : "ὒ" U1F52 # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+<dead_grave> <U1f51>   : "ὓ" U1F53 # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA
+<Multi_key> <grave> <U1f51>    : "ὓ" U1F53 # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA
+<dead_grave> <Multi_key> <parenleft> <Greek_upsilon>   : "ὓ" U1F53 # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA
+<Multi_key> <grave> <parenleft> <Greek_upsilon>        : "ὓ" U1F53 # GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA
+<dead_acute> <U1f50>   : "ὔ" U1F54 # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+<Multi_key> <acute> <U1f50>    : "ὔ" U1F54 # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <U1f50>       : "ὔ" U1F54 # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+<dead_acute> <Multi_key> <parenright> <Greek_upsilon>  : "ὔ" U1F54 # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+<Multi_key> <acute> <parenright> <Greek_upsilon>       : "ὔ" U1F54 # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <parenright> <Greek_upsilon>  : "ὔ" U1F54 # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+<dead_acute> <U1f51>   : "ὕ" U1F55 # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+<Multi_key> <acute> <U1f51>    : "ὕ" U1F55 # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <U1f51>       : "ὕ" U1F55 # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+<dead_acute> <Multi_key> <parenleft> <Greek_upsilon>   : "ὕ" U1F55 # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+<Multi_key> <acute> <parenleft> <Greek_upsilon>        : "ὕ" U1F55 # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <parenleft> <Greek_upsilon>   : "ὕ" U1F55 # GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+<dead_tilde> <U1f50>   : "ὖ" U1F56 # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <U1f50>       : "ὖ" U1F56 # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenright> <Greek_upsilon>  : "ὖ" U1F56 # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <parenright> <Greek_upsilon>  : "ὖ" U1F56 # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+<dead_tilde> <U1f51>   : "ὗ" U1F57 # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <U1f51>       : "ὗ" U1F57 # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenleft> <Greek_upsilon>   : "ὗ" U1F57 # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <parenleft> <Greek_upsilon>   : "ὗ" U1F57 # GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+<Multi_key> <parenleft> <Greek_UPSILON>        : "Ὑ" U1F59 # GREEK CAPITAL LETTER UPSILON WITH DASIA
+<dead_grave> <U1f59>   : "Ὓ" U1F5B # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+<Multi_key> <grave> <U1f59>    : "Ὓ" U1F5B # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+<dead_grave> <Multi_key> <parenleft> <Greek_UPSILON>   : "Ὓ" U1F5B # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+<Multi_key> <grave> <parenleft> <Greek_UPSILON>        : "Ὓ" U1F5B # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+<dead_acute> <U1f59>   : "Ὕ" U1F5D # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+<Multi_key> <acute> <U1f59>    : "Ὕ" U1F5D # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <U1f59>       : "Ὕ" U1F5D # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+<dead_acute> <Multi_key> <parenleft> <Greek_UPSILON>   : "Ὕ" U1F5D # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+<Multi_key> <acute> <parenleft> <Greek_UPSILON>        : "Ὕ" U1F5D # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <parenleft> <Greek_UPSILON>   : "Ὕ" U1F5D # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+<dead_tilde> <U1f59>   : "Ὗ" U1F5F # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <U1f59>       : "Ὗ" U1F5F # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenleft> <Greek_UPSILON>   : "Ὗ" U1F5F # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <parenleft> <Greek_UPSILON>   : "Ὗ" U1F5F # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+<Multi_key> <parenright> <Greek_omega> : "ὠ" U1F60 # GREEK SMALL LETTER OMEGA WITH PSILI
+<Multi_key> <parenleft> <Greek_omega>  : "ὡ" U1F61 # GREEK SMALL LETTER OMEGA WITH DASIA
+<dead_grave> <U1f60>   : "ὢ" U1F62 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA
+<Multi_key> <grave> <U1f60>    : "ὢ" U1F62 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA
+<dead_grave> <Multi_key> <parenright> <Greek_omega>    : "ὢ" U1F62 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA
+<Multi_key> <grave> <parenright> <Greek_omega> : "ὢ" U1F62 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA
+<dead_grave> <U1f61>   : "ὣ" U1F63 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA
+<Multi_key> <grave> <U1f61>    : "ὣ" U1F63 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA
+<dead_grave> <Multi_key> <parenleft> <Greek_omega>     : "ὣ" U1F63 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA
+<Multi_key> <grave> <parenleft> <Greek_omega>  : "ὣ" U1F63 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA
+<dead_acute> <U1f60>   : "ὤ" U1F64 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+<Multi_key> <acute> <U1f60>    : "ὤ" U1F64 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <U1f60>       : "ὤ" U1F64 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+<dead_acute> <Multi_key> <parenright> <Greek_omega>    : "ὤ" U1F64 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+<Multi_key> <acute> <parenright> <Greek_omega> : "ὤ" U1F64 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <parenright> <Greek_omega>    : "ὤ" U1F64 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+<dead_acute> <U1f61>   : "ὥ" U1F65 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+<Multi_key> <acute> <U1f61>    : "ὥ" U1F65 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <U1f61>       : "ὥ" U1F65 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+<dead_acute> <Multi_key> <parenleft> <Greek_omega>     : "ὥ" U1F65 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+<Multi_key> <acute> <parenleft> <Greek_omega>  : "ὥ" U1F65 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <parenleft> <Greek_omega>     : "ὥ" U1F65 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+<dead_tilde> <U1f60>   : "ὦ" U1F66 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <U1f60>       : "ὦ" U1F66 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenright> <Greek_omega>    : "ὦ" U1F66 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <parenright> <Greek_omega>    : "ὦ" U1F66 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI
+<dead_tilde> <U1f61>   : "ὧ" U1F67 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <U1f61>       : "ὧ" U1F67 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenleft> <Greek_omega>     : "ὧ" U1F67 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <parenleft> <Greek_omega>     : "ὧ" U1F67 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+<Multi_key> <parenright> <Greek_OMEGA> : "Ὠ" U1F68 # GREEK CAPITAL LETTER OMEGA WITH PSILI
+<Multi_key> <parenleft> <Greek_OMEGA>  : "Ὡ" U1F69 # GREEK CAPITAL LETTER OMEGA WITH DASIA
+<dead_grave> <U1f68>   : "Ὢ" U1F6A # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+<Multi_key> <grave> <U1f68>    : "Ὢ" U1F6A # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+<dead_grave> <Multi_key> <parenright> <Greek_OMEGA>    : "Ὢ" U1F6A # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+<Multi_key> <grave> <parenright> <Greek_OMEGA> : "Ὢ" U1F6A # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+<dead_grave> <U1f69>   : "Ὣ" U1F6B # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+<Multi_key> <grave> <U1f69>    : "Ὣ" U1F6B # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+<dead_grave> <Multi_key> <parenleft> <Greek_OMEGA>     : "Ὣ" U1F6B # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+<Multi_key> <grave> <parenleft> <Greek_OMEGA>  : "Ὣ" U1F6B # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+<dead_acute> <U1f68>   : "Ὤ" U1F6C # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+<Multi_key> <acute> <U1f68>    : "Ὤ" U1F6C # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <U1f68>       : "Ὤ" U1F6C # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+<dead_acute> <Multi_key> <parenright> <Greek_OMEGA>    : "Ὤ" U1F6C # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+<Multi_key> <acute> <parenright> <Greek_OMEGA> : "Ὤ" U1F6C # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+<Multi_key> <apostrophe> <parenright> <Greek_OMEGA>    : "Ὤ" U1F6C # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+<dead_acute> <U1f69>   : "Ὥ" U1F6D # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+<Multi_key> <acute> <U1f69>    : "Ὥ" U1F6D # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <U1f69>       : "Ὥ" U1F6D # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+<dead_acute> <Multi_key> <parenleft> <Greek_OMEGA>     : "Ὥ" U1F6D # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+<Multi_key> <acute> <parenleft> <Greek_OMEGA>  : "Ὥ" U1F6D # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+<Multi_key> <apostrophe> <parenleft> <Greek_OMEGA>     : "Ὥ" U1F6D # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+<dead_tilde> <U1f68>   : "Ὦ" U1F6E # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <U1f68>       : "Ὦ" U1F6E # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenright> <Greek_OMEGA>    : "Ὦ" U1F6E # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+<Multi_key> <asciitilde> <parenright> <Greek_OMEGA>    : "Ὦ" U1F6E # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+<dead_tilde> <U1f69>   : "Ὧ" U1F6F # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <U1f69>       : "Ὧ" U1F6F # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+<dead_tilde> <Multi_key> <parenleft> <Greek_OMEGA>     : "Ὧ" U1F6F # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+<Multi_key> <asciitilde> <parenleft> <Greek_OMEGA>     : "Ὧ" U1F6F # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+<dead_grave> <Greek_alpha>     : "ὰ" U1F70 # GREEK SMALL LETTER ALPHA WITH VARIA
+<Multi_key> <grave> <Greek_alpha>      : "ὰ" U1F70 # GREEK SMALL LETTER ALPHA WITH VARIA
+<dead_grave> <Greek_epsilon>   : "ὲ" U1F72 # GREEK SMALL LETTER EPSILON WITH VARIA
+<Multi_key> <grave> <Greek_epsilon>    : "ὲ" U1F72 # GREEK SMALL LETTER EPSILON WITH VARIA
+<dead_grave> <Greek_eta>       : "ὴ" U1F74 # GREEK SMALL LETTER ETA WITH VARIA
+<Multi_key> <grave> <Greek_eta>        : "ὴ" U1F74 # GREEK SMALL LETTER ETA WITH VARIA
+<dead_grave> <Greek_iota>      : "ὶ" U1F76 # GREEK SMALL LETTER IOTA WITH VARIA
+<Multi_key> <grave> <Greek_iota>       : "ὶ" U1F76 # GREEK SMALL LETTER IOTA WITH VARIA
+<dead_grave> <Greek_omicron>   : "ὸ" U1F78 # GREEK SMALL LETTER OMICRON WITH VARIA
+<Multi_key> <grave> <Greek_omicron>    : "ὸ" U1F78 # GREEK SMALL LETTER OMICRON WITH VARIA
+<dead_grave> <Greek_upsilon>   : "ὺ" U1F7A # GREEK SMALL LETTER UPSILON WITH VARIA
+<Multi_key> <grave> <Greek_upsilon>    : "ὺ" U1F7A # GREEK SMALL LETTER UPSILON WITH VARIA
+<dead_grave> <Greek_omega>     : "ὼ" U1F7C # GREEK SMALL LETTER OMEGA WITH VARIA
+<Multi_key> <grave> <Greek_omega>      : "ὼ" U1F7C # GREEK SMALL LETTER OMEGA WITH VARIA
+<dead_iota> <U1f00>    : "ᾀ" U1F80 # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f00>       : "ᾀ" U1F80 # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <parenright> <Greek_alpha>     : "ᾀ" U1F80 # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <parenright> <Greek_alpha>    : "ᾀ" U1F80 # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+<dead_iota> <U1f01>    : "ᾁ" U1F81 # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f01>       : "ᾁ" U1F81 # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <parenleft> <Greek_alpha>      : "ᾁ" U1F81 # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <parenleft> <Greek_alpha>     : "ᾁ" U1F81 # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+<dead_iota> <U1f02>    : "ᾂ" U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f02>       : "ᾂ" U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <U1f00>       : "ᾂ" U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <U1f00>        : "ᾂ" U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <U1f00>  : "ᾂ" U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <U1f00>       : "ᾂ" U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <Multi_key> <parenright> <Greek_alpha>        : "ᾂ" U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <parenright> <Greek_alpha>     : "ᾂ" U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <parenright> <Greek_alpha>       : "ᾂ" U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <parenright> <Greek_alpha>    : "ᾂ" U1F82 # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <U1f03>    : "ᾃ" U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f03>       : "ᾃ" U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <U1f01>       : "ᾃ" U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <U1f01>        : "ᾃ" U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <U1f01>  : "ᾃ" U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <U1f01>       : "ᾃ" U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <Multi_key> <parenleft> <Greek_alpha> : "ᾃ" U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <parenleft> <Greek_alpha>      : "ᾃ" U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <parenleft> <Greek_alpha>        : "ᾃ" U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <parenleft> <Greek_alpha>     : "ᾃ" U1F83 # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <U1f04>    : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f04>       : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <U1f00>       : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <U1f00>        : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <U1f00>   : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <U1f00>  : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <U1f00>       : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <U1f00>  : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <Multi_key> <parenright> <Greek_alpha>        : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <parenright> <Greek_alpha>     : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <parenright> <Greek_alpha>        : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <parenright> <Greek_alpha>       : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <parenright> <Greek_alpha>    : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <parenright> <Greek_alpha>       : "ᾄ" U1F84 # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <U1f05>    : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f05>       : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <U1f01>       : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <U1f01>        : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <U1f01>   : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <U1f01>  : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <U1f01>       : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <U1f01>  : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <Multi_key> <parenleft> <Greek_alpha> : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <parenleft> <Greek_alpha>      : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <parenleft> <Greek_alpha> : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <parenleft> <Greek_alpha>        : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <parenleft> <Greek_alpha>     : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <parenleft> <Greek_alpha>        : "ᾅ" U1F85 # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <U1f06>    : "ᾆ" U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f06>       : "ᾆ" U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <U1f00>       : "ᾆ" U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <U1f00>   : "ᾆ" U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <U1f00>  : "ᾆ" U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <U1f00>  : "ᾆ" U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <Multi_key> <parenright> <Greek_alpha>        : "ᾆ" U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <parenright> <Greek_alpha>        : "ᾆ" U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <parenright> <Greek_alpha>       : "ᾆ" U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <parenright> <Greek_alpha>       : "ᾆ" U1F86 # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <U1f07>    : "ᾇ" U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f07>       : "ᾇ" U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <U1f01>       : "ᾇ" U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <U1f01>   : "ᾇ" U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <U1f01>  : "ᾇ" U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <U1f01>  : "ᾇ" U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <Multi_key> <parenleft> <Greek_alpha> : "ᾇ" U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <parenleft> <Greek_alpha> : "ᾇ" U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <parenleft> <Greek_alpha>        : "ᾇ" U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <parenleft> <Greek_alpha>        : "ᾇ" U1F87 # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <U1f08>    : "ᾈ" U1F88 # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f08>       : "ᾈ" U1F88 # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <parenright> <Greek_ALPHA>     : "ᾈ" U1F88 # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <parenright> <Greek_ALPHA>    : "ᾈ" U1F88 # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
+<dead_iota> <U1f09>    : "ᾉ" U1F89 # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f09>       : "ᾉ" U1F89 # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <parenleft> <Greek_ALPHA>      : "ᾉ" U1F89 # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <parenleft> <Greek_ALPHA>     : "ᾉ" U1F89 # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
+<dead_iota> <U1f0a>    : "ᾊ" U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f0a>       : "ᾊ" U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <dead_grave> <U1f08>       : "ᾊ" U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <U1f08>        : "ᾊ" U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <U1f08>  : "ᾊ" U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <U1f08>       : "ᾊ" U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <dead_grave> <Multi_key> <parenright> <Greek_ALPHA>        : "ᾊ" U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <parenright> <Greek_ALPHA>     : "ᾊ" U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <parenright> <Greek_ALPHA>       : "ᾊ" U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <parenright> <Greek_ALPHA>    : "ᾊ" U1F8A # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <U1f0b>    : "ᾋ" U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f0b>       : "ᾋ" U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <dead_grave> <U1f09>       : "ᾋ" U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <U1f09>        : "ᾋ" U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <U1f09>  : "ᾋ" U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <U1f09>       : "ᾋ" U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <dead_grave> <Multi_key> <parenleft> <Greek_ALPHA> : "ᾋ" U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <parenleft> <Greek_ALPHA>      : "ᾋ" U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <parenleft> <Greek_ALPHA>        : "ᾋ" U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <parenleft> <Greek_ALPHA>     : "ᾋ" U1F8B # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <U1f0c>    : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f0c>       : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <dead_acute> <U1f08>       : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <U1f08>        : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <U1f08>   : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <U1f08>  : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <U1f08>       : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <U1f08>  : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <dead_acute> <Multi_key> <parenright> <Greek_ALPHA>        : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <parenright> <Greek_ALPHA>     : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <parenright> <Greek_ALPHA>        : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <parenright> <Greek_ALPHA>       : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <parenright> <Greek_ALPHA>    : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <parenright> <Greek_ALPHA>       : "ᾌ" U1F8C # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <U1f0d>    : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f0d>       : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <dead_acute> <U1f09>       : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <U1f09>        : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <U1f09>   : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <U1f09>  : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <U1f09>       : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <U1f09>  : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <dead_acute> <Multi_key> <parenleft> <Greek_ALPHA> : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <parenleft> <Greek_ALPHA>      : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <parenleft> <Greek_ALPHA> : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <parenleft> <Greek_ALPHA>        : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <parenleft> <Greek_ALPHA>     : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <parenleft> <Greek_ALPHA>        : "ᾍ" U1F8D # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <U1f0e>    : "ᾎ" U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f0e>       : "ᾎ" U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <dead_tilde> <U1f08>       : "ᾎ" U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <U1f08>   : "ᾎ" U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <U1f08>  : "ᾎ" U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <U1f08>  : "ᾎ" U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <dead_tilde> <Multi_key> <parenright> <Greek_ALPHA>        : "ᾎ" U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <parenright> <Greek_ALPHA>        : "ᾎ" U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <parenright> <Greek_ALPHA>       : "ᾎ" U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <parenright> <Greek_ALPHA>       : "ᾎ" U1F8E # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <U1f0f>    : "ᾏ" U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f0f>       : "ᾏ" U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <dead_tilde> <U1f09>       : "ᾏ" U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <U1f09>   : "ᾏ" U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <U1f09>  : "ᾏ" U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <U1f09>  : "ᾏ" U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <dead_tilde> <Multi_key> <parenleft> <Greek_ALPHA> : "ᾏ" U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <parenleft> <Greek_ALPHA> : "ᾏ" U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <parenleft> <Greek_ALPHA>        : "ᾏ" U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <parenleft> <Greek_ALPHA>        : "ᾏ" U1F8F # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <U1f20>    : "ᾐ" U1F90 # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f20>       : "ᾐ" U1F90 # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <parenright> <Greek_eta>       : "ᾐ" U1F90 # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <parenright> <Greek_eta>      : "ᾐ" U1F90 # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+<dead_iota> <U1f21>    : "ᾑ" U1F91 # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f21>       : "ᾑ" U1F91 # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <parenleft> <Greek_eta>        : "ᾑ" U1F91 # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <parenleft> <Greek_eta>       : "ᾑ" U1F91 # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+<dead_iota> <U1f22>    : "ᾒ" U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f22>       : "ᾒ" U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <U1f20>       : "ᾒ" U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <U1f20>        : "ᾒ" U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <U1f20>  : "ᾒ" U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <U1f20>       : "ᾒ" U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <Multi_key> <parenright> <Greek_eta>  : "ᾒ" U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <parenright> <Greek_eta>       : "ᾒ" U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <parenright> <Greek_eta> : "ᾒ" U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <parenright> <Greek_eta>      : "ᾒ" U1F92 # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <U1f23>    : "ᾓ" U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f23>       : "ᾓ" U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <U1f21>       : "ᾓ" U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <U1f21>        : "ᾓ" U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <U1f21>  : "ᾓ" U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <U1f21>       : "ᾓ" U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <Multi_key> <parenleft> <Greek_eta>   : "ᾓ" U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <parenleft> <Greek_eta>        : "ᾓ" U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <parenleft> <Greek_eta>  : "ᾓ" U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <parenleft> <Greek_eta>       : "ᾓ" U1F93 # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <U1f24>    : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f24>       : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <U1f20>       : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <U1f20>        : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <U1f20>   : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <U1f20>  : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <U1f20>       : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <U1f20>  : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <Multi_key> <parenright> <Greek_eta>  : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <parenright> <Greek_eta>       : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <parenright> <Greek_eta>  : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <parenright> <Greek_eta> : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <parenright> <Greek_eta>      : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <parenright> <Greek_eta> : "ᾔ" U1F94 # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <U1f25>    : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f25>       : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <U1f21>       : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <U1f21>        : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <U1f21>   : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <U1f21>  : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <U1f21>       : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <U1f21>  : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <Multi_key> <parenleft> <Greek_eta>   : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <parenleft> <Greek_eta>        : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <parenleft> <Greek_eta>   : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <parenleft> <Greek_eta>  : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <parenleft> <Greek_eta>       : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <parenleft> <Greek_eta>  : "ᾕ" U1F95 # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <U1f26>    : "ᾖ" U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f26>       : "ᾖ" U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <U1f20>       : "ᾖ" U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <U1f20>   : "ᾖ" U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <U1f20>  : "ᾖ" U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <U1f20>  : "ᾖ" U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <Multi_key> <parenright> <Greek_eta>  : "ᾖ" U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <parenright> <Greek_eta>  : "ᾖ" U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <parenright> <Greek_eta> : "ᾖ" U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <parenright> <Greek_eta> : "ᾖ" U1F96 # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <U1f27>    : "ᾗ" U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f27>       : "ᾗ" U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <U1f21>       : "ᾗ" U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <U1f21>   : "ᾗ" U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <U1f21>  : "ᾗ" U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <U1f21>  : "ᾗ" U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <Multi_key> <parenleft> <Greek_eta>   : "ᾗ" U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <parenleft> <Greek_eta>   : "ᾗ" U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <parenleft> <Greek_eta>  : "ᾗ" U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <parenleft> <Greek_eta>  : "ᾗ" U1F97 # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <U1f28>    : "ᾘ" U1F98 # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f28>       : "ᾘ" U1F98 # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <parenright> <Greek_ETA>       : "ᾘ" U1F98 # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <parenright> <Greek_ETA>      : "ᾘ" U1F98 # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+<dead_iota> <U1f29>    : "ᾙ" U1F99 # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f29>       : "ᾙ" U1F99 # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <parenleft> <Greek_ETA>        : "ᾙ" U1F99 # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <parenleft> <Greek_ETA>       : "ᾙ" U1F99 # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+<dead_iota> <U1f2a>    : "ᾚ" U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f2a>       : "ᾚ" U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <dead_grave> <U1f28>       : "ᾚ" U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <U1f28>        : "ᾚ" U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <U1f28>  : "ᾚ" U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <U1f28>       : "ᾚ" U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <dead_grave> <Multi_key> <parenright> <Greek_ETA>  : "ᾚ" U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <parenright> <Greek_ETA>       : "ᾚ" U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <parenright> <Greek_ETA> : "ᾚ" U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <parenright> <Greek_ETA>      : "ᾚ" U1F9A # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <U1f2b>    : "ᾛ" U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f2b>       : "ᾛ" U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <dead_grave> <U1f29>       : "ᾛ" U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <U1f29>        : "ᾛ" U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <U1f29>  : "ᾛ" U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <U1f29>       : "ᾛ" U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <dead_grave> <Multi_key> <parenleft> <Greek_ETA>   : "ᾛ" U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <parenleft> <Greek_ETA>        : "ᾛ" U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <parenleft> <Greek_ETA>  : "ᾛ" U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <parenleft> <Greek_ETA>       : "ᾛ" U1F9B # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <U1f2c>    : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f2c>       : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <dead_acute> <U1f28>       : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <U1f28>        : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <U1f28>   : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <U1f28>  : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <U1f28>       : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <U1f28>  : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <dead_acute> <Multi_key> <parenright> <Greek_ETA>  : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <parenright> <Greek_ETA>       : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <parenright> <Greek_ETA>  : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <parenright> <Greek_ETA> : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <parenright> <Greek_ETA>      : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <parenright> <Greek_ETA> : "ᾜ" U1F9C # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <U1f2d>    : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f2d>       : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <dead_acute> <U1f29>       : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <U1f29>        : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <U1f29>   : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <U1f29>  : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <U1f29>       : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <U1f29>  : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <dead_acute> <Multi_key> <parenleft> <Greek_ETA>   : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <parenleft> <Greek_ETA>        : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <parenleft> <Greek_ETA>   : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <parenleft> <Greek_ETA>  : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <parenleft> <Greek_ETA>       : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <parenleft> <Greek_ETA>  : "ᾝ" U1F9D # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <U1f2e>    : "ᾞ" U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f2e>       : "ᾞ" U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <dead_tilde> <U1f28>       : "ᾞ" U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <U1f28>   : "ᾞ" U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <U1f28>  : "ᾞ" U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <U1f28>  : "ᾞ" U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <dead_tilde> <Multi_key> <parenright> <Greek_ETA>  : "ᾞ" U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <parenright> <Greek_ETA>  : "ᾞ" U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <parenright> <Greek_ETA> : "ᾞ" U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <parenright> <Greek_ETA> : "ᾞ" U1F9E # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <U1f2f>    : "ᾟ" U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f2f>       : "ᾟ" U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <dead_tilde> <U1f29>       : "ᾟ" U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <U1f29>   : "ᾟ" U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <U1f29>  : "ᾟ" U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <U1f29>  : "ᾟ" U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <dead_tilde> <Multi_key> <parenleft> <Greek_ETA>   : "ᾟ" U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <parenleft> <Greek_ETA>   : "ᾟ" U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <parenleft> <Greek_ETA>  : "ᾟ" U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <parenleft> <Greek_ETA>  : "ᾟ" U1F9F # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <U1f60>    : "ᾠ" U1FA0 # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f60>       : "ᾠ" U1FA0 # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <parenright> <Greek_omega>     : "ᾠ" U1FA0 # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <parenright> <Greek_omega>    : "ᾠ" U1FA0 # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+<dead_iota> <U1f61>    : "ᾡ" U1FA1 # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f61>       : "ᾡ" U1FA1 # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <parenleft> <Greek_omega>      : "ᾡ" U1FA1 # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <parenleft> <Greek_omega>     : "ᾡ" U1FA1 # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+<dead_iota> <U1f62>    : "ᾢ" U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f62>       : "ᾢ" U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <U1f60>       : "ᾢ" U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <U1f60>        : "ᾢ" U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <U1f60>  : "ᾢ" U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <U1f60>       : "ᾢ" U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <Multi_key> <parenright> <Greek_omega>        : "ᾢ" U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <parenright> <Greek_omega>     : "ᾢ" U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <parenright> <Greek_omega>       : "ᾢ" U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <parenright> <Greek_omega>    : "ᾢ" U1FA2 # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <U1f63>    : "ᾣ" U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f63>       : "ᾣ" U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <U1f61>       : "ᾣ" U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <U1f61>        : "ᾣ" U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <U1f61>  : "ᾣ" U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <U1f61>       : "ᾣ" U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <Multi_key> <parenleft> <Greek_omega> : "ᾣ" U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <parenleft> <Greek_omega>      : "ᾣ" U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <parenleft> <Greek_omega>        : "ᾣ" U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <parenleft> <Greek_omega>     : "ᾣ" U1FA3 # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
+<dead_iota> <U1f64>    : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f64>       : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <U1f60>       : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <U1f60>        : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <U1f60>   : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <U1f60>  : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <U1f60>       : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <U1f60>  : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <Multi_key> <parenright> <Greek_omega>        : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <parenright> <Greek_omega>     : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <parenright> <Greek_omega>        : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <parenright> <Greek_omega>       : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <parenright> <Greek_omega>    : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <parenright> <Greek_omega>       : "ᾤ" U1FA4 # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <U1f65>    : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f65>       : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <U1f61>       : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <U1f61>        : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <U1f61>   : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <U1f61>  : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <U1f61>       : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <U1f61>  : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <Multi_key> <parenleft> <Greek_omega> : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <parenleft> <Greek_omega>      : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <parenleft> <Greek_omega> : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <parenleft> <Greek_omega>        : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <parenleft> <Greek_omega>     : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <parenleft> <Greek_omega>        : "ᾥ" U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
+<dead_iota> <U1f66>    : "ᾦ" U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f66>       : "ᾦ" U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <U1f60>       : "ᾦ" U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <U1f60>   : "ᾦ" U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <U1f60>  : "ᾦ" U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <U1f60>  : "ᾦ" U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <Multi_key> <parenright> <Greek_omega>        : "ᾦ" U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <parenright> <Greek_omega>        : "ᾦ" U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <parenright> <Greek_omega>       : "ᾦ" U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <parenright> <Greek_omega>       : "ᾦ" U1FA6 # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <U1f67>    : "ᾧ" U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f67>       : "ᾧ" U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <U1f61>       : "ᾧ" U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <U1f61>   : "ᾧ" U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <U1f61>  : "ᾧ" U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <U1f61>  : "ᾧ" U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <Multi_key> <parenleft> <Greek_omega> : "ᾧ" U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <parenleft> <Greek_omega> : "ᾧ" U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <parenleft> <Greek_omega>        : "ᾧ" U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <parenleft> <Greek_omega>        : "ᾧ" U1FA7 # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <U1f68>    : "ᾨ" U1FA8 # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f68>       : "ᾨ" U1FA8 # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <parenright> <Greek_OMEGA>     : "ᾨ" U1FA8 # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <parenright> <Greek_OMEGA>    : "ᾨ" U1FA8 # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
+<dead_iota> <U1f69>    : "ᾩ" U1FA9 # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f69>       : "ᾩ" U1FA9 # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <parenleft> <Greek_OMEGA>      : "ᾩ" U1FA9 # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <parenleft> <Greek_OMEGA>     : "ᾩ" U1FA9 # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
+<dead_iota> <U1f6a>    : "ᾪ" U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f6a>       : "ᾪ" U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <dead_grave> <U1f68>       : "ᾪ" U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <U1f68>        : "ᾪ" U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <U1f68>  : "ᾪ" U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <U1f68>       : "ᾪ" U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <dead_grave> <Multi_key> <parenright> <Greek_OMEGA>        : "ᾪ" U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <parenright> <Greek_OMEGA>     : "ᾪ" U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <parenright> <Greek_OMEGA>       : "ᾪ" U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <parenright> <Greek_OMEGA>    : "ᾪ" U1FAA # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <U1f6b>    : "ᾫ" U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f6b>       : "ᾫ" U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <dead_grave> <U1f69>       : "ᾫ" U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <U1f69>        : "ᾫ" U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <U1f69>  : "ᾫ" U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <U1f69>       : "ᾫ" U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <dead_grave> <Multi_key> <parenleft> <Greek_OMEGA> : "ᾫ" U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <parenleft> <Greek_OMEGA>      : "ᾫ" U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <parenleft> <Greek_OMEGA>        : "ᾫ" U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <parenleft> <Greek_OMEGA>     : "ᾫ" U1FAB # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
+<dead_iota> <U1f6c>    : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f6c>       : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <dead_acute> <U1f68>       : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <U1f68>        : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <U1f68>   : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <U1f68>  : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <U1f68>       : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <U1f68>  : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <dead_acute> <Multi_key> <parenright> <Greek_OMEGA>        : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <parenright> <Greek_OMEGA>     : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <parenright> <Greek_OMEGA>        : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <parenright> <Greek_OMEGA>       : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <parenright> <Greek_OMEGA>    : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <parenright> <Greek_OMEGA>       : "ᾬ" U1FAC # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <U1f6d>    : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f6d>       : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <dead_acute> <U1f69>       : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <U1f69>        : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <U1f69>   : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <U1f69>  : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <U1f69>       : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <U1f69>  : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <dead_acute> <Multi_key> <parenleft> <Greek_OMEGA> : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <parenleft> <Greek_OMEGA>      : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <parenleft> <Greek_OMEGA> : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <parenleft> <Greek_OMEGA>        : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <parenleft> <Greek_OMEGA>     : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <parenleft> <Greek_OMEGA>        : "ᾭ" U1FAD # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
+<dead_iota> <U1f6e>    : "ᾮ" U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f6e>       : "ᾮ" U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <dead_tilde> <U1f68>       : "ᾮ" U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <U1f68>   : "ᾮ" U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <U1f68>  : "ᾮ" U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <U1f68>  : "ᾮ" U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <dead_tilde> <Multi_key> <parenright> <Greek_OMEGA>        : "ᾮ" U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <parenright> <Greek_OMEGA>        : "ᾮ" U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <parenright> <Greek_OMEGA>       : "ᾮ" U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <parenright> <Greek_OMEGA>       : "ᾮ" U1FAE # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <U1f6f>    : "ᾯ" U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f6f>       : "ᾯ" U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <dead_tilde> <U1f69>       : "ᾯ" U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <U1f69>   : "ᾯ" U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <U1f69>  : "ᾯ" U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <U1f69>  : "ᾯ" U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <dead_tilde> <Multi_key> <parenleft> <Greek_OMEGA> : "ᾯ" U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <parenleft> <Greek_OMEGA> : "ᾯ" U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <parenleft> <Greek_OMEGA>        : "ᾯ" U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <parenleft> <Greek_OMEGA>        : "ᾯ" U1FAF # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
+<dead_breve> <Greek_alpha>     : "ᾰ" U1FB0 # GREEK SMALL LETTER ALPHA WITH VRACHY
+<Multi_key> <U> <Greek_alpha>  : "ᾰ" U1FB0 # GREEK SMALL LETTER ALPHA WITH VRACHY
+<Multi_key> <b> <Greek_alpha>  : "ᾰ" U1FB0 # GREEK SMALL LETTER ALPHA WITH VRACHY
+<dead_macron> <Greek_alpha>    : "ᾱ" U1FB1 # GREEK SMALL LETTER ALPHA WITH MACRON
+<Multi_key> <macron> <Greek_alpha>     : "ᾱ" U1FB1 # GREEK SMALL LETTER ALPHA WITH MACRON
+<Multi_key> <underscore> <Greek_alpha> : "ᾱ" U1FB1 # GREEK SMALL LETTER ALPHA WITH MACRON
+<dead_iota> <U1f70>    : "ᾲ" U1FB2 # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f70>       : "ᾲ" U1FB2 # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <Greek_alpha> : "ᾲ" U1FB2 # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <Greek_alpha>  : "ᾲ" U1FB2 # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <Greek_alpha>    : "ᾲ" U1FB2 # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <Greek_alpha> : "ᾲ" U1FB2 # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+<dead_iota> <Greek_alpha>      : "ᾳ" U1FB3 # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <Greek_alpha> : "ᾳ" U1FB3 # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+<dead_iota> <Greek_alphaaccent>        : "ᾴ" U1FB4 # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <Greek_alphaaccent>   : "ᾴ" U1FB4 # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <Greek_alpha> : "ᾴ" U1FB4 # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <Greek_alpha>  : "ᾴ" U1FB4 # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <Greek_alpha>     : "ᾴ" U1FB4 # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <Greek_alpha>    : "ᾴ" U1FB4 # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <Greek_alpha> : "ᾴ" U1FB4 # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <Greek_alpha>    : "ᾴ" U1FB4 # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+<dead_tilde> <Greek_alpha>     : "ᾶ" U1FB6 # GREEK SMALL LETTER ALPHA WITH PERISPOMENI
+<Multi_key> <asciitilde> <Greek_alpha> : "ᾶ" U1FB6 # GREEK SMALL LETTER ALPHA WITH PERISPOMENI
+<dead_iota> <U1fb6>    : "ᾷ" U1FB7 # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1fb6>       : "ᾷ" U1FB7 # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <Greek_alpha> : "ᾷ" U1FB7 # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <Greek_alpha>     : "ᾷ" U1FB7 # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <Greek_alpha>    : "ᾷ" U1FB7 # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <Greek_alpha>    : "ᾷ" U1FB7 # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
+<dead_breve> <Greek_ALPHA>     : "Ᾰ" U1FB8 # GREEK CAPITAL LETTER ALPHA WITH VRACHY
+<Multi_key> <U> <Greek_ALPHA>  : "Ᾰ" U1FB8 # GREEK CAPITAL LETTER ALPHA WITH VRACHY
+<Multi_key> <b> <Greek_ALPHA>  : "Ᾰ" U1FB8 # GREEK CAPITAL LETTER ALPHA WITH VRACHY
+<dead_macron> <Greek_ALPHA>    : "Ᾱ" U1FB9 # GREEK CAPITAL LETTER ALPHA WITH MACRON
+<Multi_key> <macron> <Greek_ALPHA>     : "Ᾱ" U1FB9 # GREEK CAPITAL LETTER ALPHA WITH MACRON
+<Multi_key> <underscore> <Greek_ALPHA> : "Ᾱ" U1FB9 # GREEK CAPITAL LETTER ALPHA WITH MACRON
+<dead_grave> <Greek_ALPHA>     : "Ὰ" U1FBA # GREEK CAPITAL LETTER ALPHA WITH VARIA
+<Multi_key> <grave> <Greek_ALPHA>      : "Ὰ" U1FBA # GREEK CAPITAL LETTER ALPHA WITH VARIA
+<dead_iota> <Greek_ALPHA>      : "ᾼ" U1FBC # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <Greek_ALPHA> : "ᾼ" U1FBC # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+<Multi_key> <diaeresis> <dead_tilde>   : "῁" U1FC1 # GREEK DIALYTIKA AND PERISPOMENI
+<Multi_key> <diaeresis> <asciitilde>   : "῁" U1FC1 # GREEK DIALYTIKA AND PERISPOMENI
+<dead_iota> <U1f74>    : "ῂ" U1FC2 # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f74>       : "ῂ" U1FC2 # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <Greek_eta>   : "ῂ" U1FC2 # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <Greek_eta>    : "ῂ" U1FC2 # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <Greek_eta>      : "ῂ" U1FC2 # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <Greek_eta>   : "ῂ" U1FC2 # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+<dead_iota> <Greek_eta>        : "ῃ" U1FC3 # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <Greek_eta>   : "ῃ" U1FC3 # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+<dead_iota> <Greek_etaaccent>  : "ῄ" U1FC4 # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <Greek_etaaccent>     : "ῄ" U1FC4 # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <Greek_eta>   : "ῄ" U1FC4 # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <Greek_eta>    : "ῄ" U1FC4 # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <Greek_eta>       : "ῄ" U1FC4 # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <Greek_eta>      : "ῄ" U1FC4 # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <Greek_eta>   : "ῄ" U1FC4 # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <Greek_eta>      : "ῄ" U1FC4 # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+<dead_tilde> <Greek_eta>       : "ῆ" U1FC6 # GREEK SMALL LETTER ETA WITH PERISPOMENI
+<Multi_key> <asciitilde> <Greek_eta>   : "ῆ" U1FC6 # GREEK SMALL LETTER ETA WITH PERISPOMENI
+<dead_iota> <U1fc6>    : "ῇ" U1FC7 # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1fc6>       : "ῇ" U1FC7 # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <Greek_eta>   : "ῇ" U1FC7 # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <Greek_eta>       : "ῇ" U1FC7 # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <Greek_eta>      : "ῇ" U1FC7 # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <Greek_eta>      : "ῇ" U1FC7 # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
+<dead_grave> <Greek_EPSILON>   : "Ὲ" U1FC8 # GREEK CAPITAL LETTER EPSILON WITH VARIA
+<Multi_key> <grave> <Greek_EPSILON>    : "Ὲ" U1FC8 # GREEK CAPITAL LETTER EPSILON WITH VARIA
+<dead_grave> <Greek_ETA>       : "Ὴ" U1FCA # GREEK CAPITAL LETTER ETA WITH VARIA
+<Multi_key> <grave> <Greek_ETA>        : "Ὴ" U1FCA # GREEK CAPITAL LETTER ETA WITH VARIA
+<dead_iota> <Greek_ETA>        : "ῌ" U1FCC # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <Greek_ETA>   : "ῌ" U1FCC # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+<Multi_key> <U1fbf> <dead_grave>       : "῍" U1FCD # GREEK PSILI AND VARIA
+<Multi_key> <U1fbf> <grave>    : "῍" U1FCD # GREEK PSILI AND VARIA
+<Multi_key> <U1fbf> <dead_acute>       : "῎" U1FCE # GREEK PSILI AND OXIA
+<Multi_key> <U1fbf> <acute>    : "῎" U1FCE # GREEK PSILI AND OXIA
+<Multi_key> <U1fbf> <apostrophe>       : "῎" U1FCE # GREEK PSILI AND OXIA
+<Multi_key> <U1fbf> <dead_tilde>       : "῏" U1FCF # GREEK PSILI AND PERISPOMENI
+<Multi_key> <U1fbf> <asciitilde>       : "῏" U1FCF # GREEK PSILI AND PERISPOMENI
+<dead_breve> <Greek_iota>      : "ῐ" U1FD0 # GREEK SMALL LETTER IOTA WITH VRACHY
+<Multi_key> <U> <Greek_iota>   : "ῐ" U1FD0 # GREEK SMALL LETTER IOTA WITH VRACHY
+<Multi_key> <b> <Greek_iota>   : "ῐ" U1FD0 # GREEK SMALL LETTER IOTA WITH VRACHY
+<dead_macron> <Greek_iota>     : "ῑ" U1FD1 # GREEK SMALL LETTER IOTA WITH MACRON
+<Multi_key> <macron> <Greek_iota>      : "ῑ" U1FD1 # GREEK SMALL LETTER IOTA WITH MACRON
+<Multi_key> <underscore> <Greek_iota>  : "ῑ" U1FD1 # GREEK SMALL LETTER IOTA WITH MACRON
+<dead_grave> <Greek_iotadieresis>      : "ῒ" U1FD2 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+<Multi_key> <grave> <Greek_iotadieresis>       : "ῒ" U1FD2 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+<dead_grave> <dead_diaeresis> <Greek_iota>     : "ῒ" U1FD2 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+<dead_grave> <Multi_key> <quotedbl> <Greek_iota>       : "ῒ" U1FD2 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+<Multi_key> <grave> <dead_diaeresis> <Greek_iota>      : "ῒ" U1FD2 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+<Multi_key> <grave> <quotedbl> <Greek_iota>    : "ῒ" U1FD2 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
+<dead_tilde> <Greek_iota>      : "ῖ" U1FD6 # GREEK SMALL LETTER IOTA WITH PERISPOMENI
+<Multi_key> <asciitilde> <Greek_iota>  : "ῖ" U1FD6 # GREEK SMALL LETTER IOTA WITH PERISPOMENI
+<dead_tilde> <Greek_iotadieresis>      : "ῗ" U1FD7 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+<Multi_key> <asciitilde> <Greek_iotadieresis>  : "ῗ" U1FD7 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+<dead_tilde> <dead_diaeresis> <Greek_iota>     : "ῗ" U1FD7 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+<dead_tilde> <Multi_key> <quotedbl> <Greek_iota>       : "ῗ" U1FD7 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+<Multi_key> <asciitilde> <dead_diaeresis> <Greek_iota> : "ῗ" U1FD7 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+<Multi_key> <asciitilde> <quotedbl> <Greek_iota>       : "ῗ" U1FD7 # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
+<dead_breve> <Greek_IOTA>      : "Ῐ" U1FD8 # GREEK CAPITAL LETTER IOTA WITH VRACHY
+<Multi_key> <U> <Greek_IOTA>   : "Ῐ" U1FD8 # GREEK CAPITAL LETTER IOTA WITH VRACHY
+<Multi_key> <b> <Greek_IOTA>   : "Ῐ" U1FD8 # GREEK CAPITAL LETTER IOTA WITH VRACHY
+<dead_macron> <Greek_IOTA>     : "Ῑ" U1FD9 # GREEK CAPITAL LETTER IOTA WITH MACRON
+<Multi_key> <macron> <Greek_IOTA>      : "Ῑ" U1FD9 # GREEK CAPITAL LETTER IOTA WITH MACRON
+<Multi_key> <underscore> <Greek_IOTA>  : "Ῑ" U1FD9 # GREEK CAPITAL LETTER IOTA WITH MACRON
+<dead_grave> <Greek_IOTA>      : "Ὶ" U1FDA # GREEK CAPITAL LETTER IOTA WITH VARIA
+<Multi_key> <grave> <Greek_IOTA>       : "Ὶ" U1FDA # GREEK CAPITAL LETTER IOTA WITH VARIA
+<Multi_key> <U1ffe> <dead_grave>       : "῝" U1FDD # GREEK DASIA AND VARIA
+<Multi_key> <U1ffe> <grave>    : "῝" U1FDD # GREEK DASIA AND VARIA
+<Multi_key> <U1ffe> <dead_acute>       : "῞" U1FDE # GREEK DASIA AND OXIA
+<Multi_key> <U1ffe> <acute>    : "῞" U1FDE # GREEK DASIA AND OXIA
+<Multi_key> <U1ffe> <apostrophe>       : "῞" U1FDE # GREEK DASIA AND OXIA
+<Multi_key> <U1ffe> <dead_tilde>       : "῟" U1FDF # GREEK DASIA AND PERISPOMENI
+<Multi_key> <U1ffe> <asciitilde>       : "῟" U1FDF # GREEK DASIA AND PERISPOMENI
+<dead_breve> <Greek_upsilon>   : "ῠ" U1FE0 # GREEK SMALL LETTER UPSILON WITH VRACHY
+<Multi_key> <U> <Greek_upsilon>        : "ῠ" U1FE0 # GREEK SMALL LETTER UPSILON WITH VRACHY
+<Multi_key> <b> <Greek_upsilon>        : "ῠ" U1FE0 # GREEK SMALL LETTER UPSILON WITH VRACHY
+<dead_macron> <Greek_upsilon>  : "ῡ" U1FE1 # GREEK SMALL LETTER UPSILON WITH MACRON
+<Multi_key> <macron> <Greek_upsilon>   : "ῡ" U1FE1 # GREEK SMALL LETTER UPSILON WITH MACRON
+<Multi_key> <underscore> <Greek_upsilon>       : "ῡ" U1FE1 # GREEK SMALL LETTER UPSILON WITH MACRON
+<dead_grave> <Greek_upsilondieresis>   : "ῢ" U1FE2 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+<Multi_key> <grave> <Greek_upsilondieresis>    : "ῢ" U1FE2 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+<dead_grave> <dead_diaeresis> <Greek_upsilon>  : "ῢ" U1FE2 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+<dead_grave> <Multi_key> <quotedbl> <Greek_upsilon>    : "ῢ" U1FE2 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+<Multi_key> <grave> <dead_diaeresis> <Greek_upsilon>   : "ῢ" U1FE2 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+<Multi_key> <grave> <quotedbl> <Greek_upsilon> : "ῢ" U1FE2 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
+<Multi_key> <parenright> <Greek_rho>   : "ῤ" U1FE4 # GREEK SMALL LETTER RHO WITH PSILI
+<Multi_key> <parenleft> <Greek_rho>    : "ῥ" U1FE5 # GREEK SMALL LETTER RHO WITH DASIA
+<dead_tilde> <Greek_upsilon>   : "ῦ" U1FE6 # GREEK SMALL LETTER UPSILON WITH PERISPOMENI
+<Multi_key> <asciitilde> <Greek_upsilon>       : "ῦ" U1FE6 # GREEK SMALL LETTER UPSILON WITH PERISPOMENI
+<dead_tilde> <Greek_upsilondieresis>   : "ῧ" U1FE7 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+<Multi_key> <asciitilde> <Greek_upsilondieresis>       : "ῧ" U1FE7 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+<dead_tilde> <dead_diaeresis> <Greek_upsilon>  : "ῧ" U1FE7 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+<dead_tilde> <Multi_key> <quotedbl> <Greek_upsilon>    : "ῧ" U1FE7 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+<Multi_key> <asciitilde> <dead_diaeresis> <Greek_upsilon>      : "ῧ" U1FE7 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+<Multi_key> <asciitilde> <quotedbl> <Greek_upsilon>    : "ῧ" U1FE7 # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
+<dead_breve> <Greek_UPSILON>   : "Ῠ" U1FE8 # GREEK CAPITAL LETTER UPSILON WITH VRACHY
+<Multi_key> <U> <Greek_UPSILON>        : "Ῠ" U1FE8 # GREEK CAPITAL LETTER UPSILON WITH VRACHY
+<Multi_key> <b> <Greek_UPSILON>        : "Ῠ" U1FE8 # GREEK CAPITAL LETTER UPSILON WITH VRACHY
+<dead_macron> <Greek_UPSILON>  : "Ῡ" U1FE9 # GREEK CAPITAL LETTER UPSILON WITH MACRON
+<Multi_key> <macron> <Greek_UPSILON>   : "Ῡ" U1FE9 # GREEK CAPITAL LETTER UPSILON WITH MACRON
+<Multi_key> <underscore> <Greek_UPSILON>       : "Ῡ" U1FE9 # GREEK CAPITAL LETTER UPSILON WITH MACRON
+<dead_grave> <Greek_UPSILON>   : "Ὺ" U1FEA # GREEK CAPITAL LETTER UPSILON WITH VARIA
+<Multi_key> <grave> <Greek_UPSILON>    : "Ὺ" U1FEA # GREEK CAPITAL LETTER UPSILON WITH VARIA
+<Multi_key> <parenleft> <Greek_RHO>    : "Ῥ" U1FEC # GREEK CAPITAL LETTER RHO WITH DASIA
+<Multi_key> <diaeresis> <dead_grave>   : "῭" U1FED # GREEK DIALYTIKA AND VARIA
+<Multi_key> <diaeresis> <grave>        : "῭" U1FED # GREEK DIALYTIKA AND VARIA
+<dead_iota> <U1f7c>    : "ῲ" U1FF2 # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1f7c>       : "ῲ" U1FF2 # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+<dead_iota> <dead_grave> <Greek_omega> : "ῲ" U1FF2 # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <grave> <Greek_omega>  : "ῲ" U1FF2 # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_grave> <Greek_omega>    : "ῲ" U1FF2 # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <grave> <Greek_omega> : "ῲ" U1FF2 # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+<dead_iota> <Greek_omega>      : "ῳ" U1FF3 # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <Greek_omega> : "ῳ" U1FF3 # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+<dead_iota> <Greek_omegaaccent>        : "ῴ" U1FF4 # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <Greek_omegaaccent>   : "ῴ" U1FF4 # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+<dead_iota> <dead_acute> <Greek_omega> : "ῴ" U1FF4 # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <acute> <Greek_omega>  : "ῴ" U1FF4 # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <apostrophe> <Greek_omega>     : "ῴ" U1FF4 # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_acute> <Greek_omega>    : "ῴ" U1FF4 # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <acute> <Greek_omega> : "ῴ" U1FF4 # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <apostrophe> <Greek_omega>    : "ῴ" U1FF4 # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+<dead_tilde> <Greek_omega>     : "ῶ" U1FF6 # GREEK SMALL LETTER OMEGA WITH PERISPOMENI
+<Multi_key> <asciitilde> <Greek_omega> : "ῶ" U1FF6 # GREEK SMALL LETTER OMEGA WITH PERISPOMENI
+<dead_iota> <U1ff6>    : "ῷ" U1FF7 # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <U1ff6>       : "ῷ" U1FF7 # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <dead_tilde> <Greek_omega> : "ῷ" U1FF7 # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+<dead_iota> <Multi_key> <asciitilde> <Greek_omega>     : "ῷ" U1FF7 # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <dead_tilde> <Greek_omega>    : "ῷ" U1FF7 # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+<Multi_key> <Greek_iota> <asciitilde> <Greek_omega>    : "ῷ" U1FF7 # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
+<dead_grave> <Greek_OMICRON>   : "Ὸ" U1FF8 # GREEK CAPITAL LETTER OMICRON WITH VARIA
+<Multi_key> <grave> <Greek_OMICRON>    : "Ὸ" U1FF8 # GREEK CAPITAL LETTER OMICRON WITH VARIA
+<dead_grave> <Greek_OMEGA>     : "Ὼ" U1FFA # GREEK CAPITAL LETTER OMEGA WITH VARIA
+<Multi_key> <grave> <Greek_OMEGA>      : "Ὼ" U1FFA # GREEK CAPITAL LETTER OMEGA WITH VARIA
+<dead_iota> <Greek_OMEGA>      : "ῼ" U1FFC # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+<Multi_key> <Greek_iota> <Greek_OMEGA> : "ῼ" U1FFC # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+<dead_circumflex> <0>  : "⁰" U2070 # SUPERSCRIPT ZERO
+<Multi_key> <asciicircum> <0>  : "⁰" U2070 # SUPERSCRIPT ZERO
+<dead_circumflex> <KP_0>       : "⁰" U2070 # SUPERSCRIPT ZERO
+<Multi_key> <asciicircum> <KP_0>       : "⁰" U2070 # SUPERSCRIPT ZERO
+<dead_circumflex> <Multi_key> <underscore> <i> : "ⁱ" U2071 # SUPERSCRIPT LATIN SMALL LETTER I
+<Multi_key> <asciicircum> <underscore> <i>     : "ⁱ" U2071 # SUPERSCRIPT LATIN SMALL LETTER I
+<dead_circumflex> <Multi_key> <underbar> <i>   : "ⁱ" U2071 # SUPERSCRIPT LATIN SMALL LETTER I
+<Multi_key> <asciicircum> <underbar> <i>       : "ⁱ" U2071 # SUPERSCRIPT LATIN SMALL LETTER I
+<dead_circumflex> <4>  : "⁴" U2074 # SUPERSCRIPT FOUR
+<Multi_key> <asciicircum> <4>  : "⁴" U2074 # SUPERSCRIPT FOUR
+<dead_circumflex> <KP_4>       : "⁴" U2074 # SUPERSCRIPT FOUR
+<Multi_key> <asciicircum> <KP_4>       : "⁴" U2074 # SUPERSCRIPT FOUR
+<dead_circumflex> <5>  : "⁵" U2075 # SUPERSCRIPT FIVE
+<Multi_key> <asciicircum> <5>  : "⁵" U2075 # SUPERSCRIPT FIVE
+<dead_circumflex> <KP_5>       : "⁵" U2075 # SUPERSCRIPT FIVE
+<Multi_key> <asciicircum> <KP_5>       : "⁵" U2075 # SUPERSCRIPT FIVE
+<dead_circumflex> <6>  : "⁶" U2076 # SUPERSCRIPT SIX
+<Multi_key> <asciicircum> <6>  : "⁶" U2076 # SUPERSCRIPT SIX
+<dead_circumflex> <KP_6>       : "⁶" U2076 # SUPERSCRIPT SIX
+<Multi_key> <asciicircum> <KP_6>       : "⁶" U2076 # SUPERSCRIPT SIX
+<dead_circumflex> <7>  : "⁷" U2077 # SUPERSCRIPT SEVEN
+<Multi_key> <asciicircum> <7>  : "⁷" U2077 # SUPERSCRIPT SEVEN
+<dead_circumflex> <KP_7>       : "⁷" U2077 # SUPERSCRIPT SEVEN
+<Multi_key> <asciicircum> <KP_7>       : "⁷" U2077 # SUPERSCRIPT SEVEN
+<dead_circumflex> <8>  : "⁸" U2078 # SUPERSCRIPT EIGHT
+<Multi_key> <asciicircum> <8>  : "⁸" U2078 # SUPERSCRIPT EIGHT
+<dead_circumflex> <KP_8>       : "⁸" U2078 # SUPERSCRIPT EIGHT
+<Multi_key> <asciicircum> <KP_8>       : "⁸" U2078 # SUPERSCRIPT EIGHT
+<dead_circumflex> <9>  : "⁹" U2079 # SUPERSCRIPT NINE
+<Multi_key> <asciicircum> <9>  : "⁹" U2079 # SUPERSCRIPT NINE
+<dead_circumflex> <KP_9>       : "⁹" U2079 # SUPERSCRIPT NINE
+<Multi_key> <asciicircum> <KP_9>       : "⁹" U2079 # SUPERSCRIPT NINE
+<dead_circumflex> <plus>       : "⁺" U207A # SUPERSCRIPT PLUS SIGN
+<Multi_key> <asciicircum> <plus>       : "⁺" U207A # SUPERSCRIPT PLUS SIGN
+<dead_circumflex> <KP_Add>     : "⁺" U207A # SUPERSCRIPT PLUS SIGN
+<Multi_key> <asciicircum> <KP_Add>     : "⁺" U207A # SUPERSCRIPT PLUS SIGN
+<dead_circumflex> <U2212>      : "⁻" U207B # SUPERSCRIPT MINUS
+<Multi_key> <asciicircum> <U2212>      : "⁻" U207B # SUPERSCRIPT MINUS
+<dead_circumflex> <equal>      : "⁼" U207C # SUPERSCRIPT EQUALS SIGN
+<Multi_key> <asciicircum> <equal>      : "⁼" U207C # SUPERSCRIPT EQUALS SIGN
+<dead_circumflex> <KP_Equal>   : "⁼" U207C # SUPERSCRIPT EQUALS SIGN
+<Multi_key> <asciicircum> <KP_Equal>   : "⁼" U207C # SUPERSCRIPT EQUALS SIGN
+<dead_circumflex> <parenleft>  : "⁽" U207D # SUPERSCRIPT LEFT PARENTHESIS
+<Multi_key> <asciicircum> <parenleft>  : "⁽" U207D # SUPERSCRIPT LEFT PARENTHESIS
+<dead_circumflex> <parenright> : "⁾" U207E # SUPERSCRIPT RIGHT PARENTHESIS
+<Multi_key> <asciicircum> <parenright> : "⁾" U207E # SUPERSCRIPT RIGHT PARENTHESIS
+<dead_circumflex> <Multi_key> <underscore> <n> : "ⁿ" U207F # SUPERSCRIPT LATIN SMALL LETTER N
+<Multi_key> <asciicircum> <underscore> <n>     : "ⁿ" U207F # SUPERSCRIPT LATIN SMALL LETTER N
+<dead_circumflex> <Multi_key> <underbar> <n>   : "ⁿ" U207F # SUPERSCRIPT LATIN SMALL LETTER N
+<Multi_key> <asciicircum> <underbar> <n>       : "ⁿ" U207F # SUPERSCRIPT LATIN SMALL LETTER N
+<Multi_key> <underscore> <0>   : "₀" U2080 # SUBSCRIPT ZERO
+<Multi_key> <underscore> <KP_0>        : "₀" U2080 # SUBSCRIPT ZERO
+<Multi_key> <underbar> <0>     : "₀" U2080 # SUBSCRIPT ZERO
+<Multi_key> <underbar> <KP_0>  : "₀" U2080 # SUBSCRIPT ZERO
+<Multi_key> <underscore> <1>   : "₁" U2081 # SUBSCRIPT ONE
+<Multi_key> <underscore> <KP_1>        : "₁" U2081 # SUBSCRIPT ONE
+<Multi_key> <underbar> <1>     : "₁" U2081 # SUBSCRIPT ONE
+<Multi_key> <underbar> <KP_1>  : "₁" U2081 # SUBSCRIPT ONE
+<Multi_key> <underscore> <2>   : "₂" U2082 # SUBSCRIPT TWO
+<Multi_key> <underscore> <KP_Space>    : "₂" U2082 # SUBSCRIPT TWO
+<Multi_key> <underscore> <KP_2>        : "₂" U2082 # SUBSCRIPT TWO
+<Multi_key> <underbar> <2>     : "₂" U2082 # SUBSCRIPT TWO
+<Multi_key> <underbar> <KP_Space>      : "₂" U2082 # SUBSCRIPT TWO
+<Multi_key> <underbar> <KP_2>  : "₂" U2082 # SUBSCRIPT TWO
+<Multi_key> <underscore> <3>   : "₃" U2083 # SUBSCRIPT THREE
+<Multi_key> <underscore> <KP_3>        : "₃" U2083 # SUBSCRIPT THREE
+<Multi_key> <underbar> <3>     : "₃" U2083 # SUBSCRIPT THREE
+<Multi_key> <underbar> <KP_3>  : "₃" U2083 # SUBSCRIPT THREE
+<Multi_key> <underscore> <4>   : "₄" U2084 # SUBSCRIPT FOUR
+<Multi_key> <underscore> <KP_4>        : "₄" U2084 # SUBSCRIPT FOUR
+<Multi_key> <underbar> <4>     : "₄" U2084 # SUBSCRIPT FOUR
+<Multi_key> <underbar> <KP_4>  : "₄" U2084 # SUBSCRIPT FOUR
+<Multi_key> <underscore> <5>   : "₅" U2085 # SUBSCRIPT FIVE
+<Multi_key> <underscore> <KP_5>        : "₅" U2085 # SUBSCRIPT FIVE
+<Multi_key> <underbar> <5>     : "₅" U2085 # SUBSCRIPT FIVE
+<Multi_key> <underbar> <KP_5>  : "₅" U2085 # SUBSCRIPT FIVE
+<Multi_key> <underscore> <6>   : "₆" U2086 # SUBSCRIPT SIX
+<Multi_key> <underscore> <KP_6>        : "₆" U2086 # SUBSCRIPT SIX
+<Multi_key> <underbar> <6>     : "₆" U2086 # SUBSCRIPT SIX
+<Multi_key> <underbar> <KP_6>  : "₆" U2086 # SUBSCRIPT SIX
+<Multi_key> <underscore> <7>   : "₇" U2087 # SUBSCRIPT SEVEN
+<Multi_key> <underscore> <KP_7>        : "₇" U2087 # SUBSCRIPT SEVEN
+<Multi_key> <underbar> <7>     : "₇" U2087 # SUBSCRIPT SEVEN
+<Multi_key> <underbar> <KP_7>  : "₇" U2087 # SUBSCRIPT SEVEN
+<Multi_key> <underscore> <8>   : "₈" U2088 # SUBSCRIPT EIGHT
+<Multi_key> <underscore> <KP_8>        : "₈" U2088 # SUBSCRIPT EIGHT
+<Multi_key> <underbar> <8>     : "₈" U2088 # SUBSCRIPT EIGHT
+<Multi_key> <underbar> <KP_8>  : "₈" U2088 # SUBSCRIPT EIGHT
+<Multi_key> <underscore> <9>   : "₉" U2089 # SUBSCRIPT NINE
+<Multi_key> <underscore> <KP_9>        : "₉" U2089 # SUBSCRIPT NINE
+<Multi_key> <underbar> <9>     : "₉" U2089 # SUBSCRIPT NINE
+<Multi_key> <underbar> <KP_9>  : "₉" U2089 # SUBSCRIPT NINE
+<Multi_key> <underscore> <plus>        : "₊" U208A # SUBSCRIPT PLUS SIGN
+<Multi_key> <underscore> <KP_Add>      : "₊" U208A # SUBSCRIPT PLUS SIGN
+<Multi_key> <underbar> <plus>  : "₊" U208A # SUBSCRIPT PLUS SIGN
+<Multi_key> <underbar> <KP_Add>        : "₊" U208A # SUBSCRIPT PLUS SIGN
+<Multi_key> <underscore> <U2212>       : "₋" U208B # SUBSCRIPT MINUS
+<Multi_key> <underbar> <U2212> : "₋" U208B # SUBSCRIPT MINUS
+<Multi_key> <underscore> <equal>       : "₌" U208C # SUBSCRIPT EQUALS SIGN
+<Multi_key> <underscore> <KP_Equal>    : "₌" U208C # SUBSCRIPT EQUALS SIGN
+<Multi_key> <underbar> <equal> : "₌" U208C # SUBSCRIPT EQUALS SIGN
+<Multi_key> <underbar> <KP_Equal>      : "₌" U208C # SUBSCRIPT EQUALS SIGN
+<Multi_key> <underscore> <parenleft>   : "₍" U208D # SUBSCRIPT LEFT PARENTHESIS
+<Multi_key> <underbar> <parenleft>     : "₍" U208D # SUBSCRIPT LEFT PARENTHESIS
+<Multi_key> <underscore> <parenright>  : "₎" U208E # SUBSCRIPT RIGHT PARENTHESIS
+<Multi_key> <underbar> <parenright>    : "₎" U208E # SUBSCRIPT RIGHT PARENTHESIS
+<dead_circumflex> <Multi_key> <S> <M>  : "℠" U2120 # SERVICE MARK
+<Multi_key> <S> <M>                    : "℠" U2120 # SERVICE MARK
+<dead_circumflex> <Multi_key> <T> <M>  : "™" U2122 # TRADE MARK SIGN
+<Multi_key> <T> <M>                    : "™" U2122 # TRADE MARK SIGN
+<Multi_key> <1> <3>                    : "⅓" U2153 # VULGAR FRACTION ONE THIRD
+<Multi_key> <2> <3>                    : "⅔" U2154 # VULGAR FRACTION TWO THIRDS
+<Multi_key> <1> <5>                    : "⅕" U2155 # VULGAR FRACTION ONE FIFTH
+<Multi_key> <2> <5>                    : "⅖" U2156 # VULGAR FRACTION TWO FIFTHS
+<Multi_key> <3> <5>                    : "⅗" U2157 # VULGAR FRACTION THREE FIFTHS
+<Multi_key> <4> <5>                    : "⅘" U2158 # VULGAR FRACTION FOUR FIFTHS
+<Multi_key> <1> <6>                    : "⅙" U2159 # VULGAR FRACTION ONE SIXTH
+<Multi_key> <5> <6>                    : "⅚" U215A # VULGAR FRACTION FIVE SIXTHS
+<Multi_key> <1> <8>                    : "⅛" U215B # VULGAR FRACTION ONE EIGHTH
+<Multi_key> <3> <8>                    : "⅜" U215C # VULGAR FRACTION THREE EIGHTHS
+<Multi_key> <5> <8>                    : "⅝" U215D # VULGAR FRACTION FIVE EIGHTHS
+<Multi_key> <7> <8>                    : "⅞" U215E # VULGAR FRACTION SEVEN EIGHTHS
+<Multi_key> <slash> <leftarrow>        : "↚" U219A # LEFTWARDS ARROW WITH STROKE
+<Multi_key> <KP_Divide> <leftarrow>    : "↚" U219A # LEFTWARDS ARROW WITH STROKE
+<Multi_key> <slash> <rightarrow>       : "↛" U219B # RIGHTWARDS ARROW WITH STROKE
+<Multi_key> <KP_Divide> <rightarrow>   : "↛" U219B # RIGHTWARDS ARROW WITH STROKE
+<Multi_key> <slash> <U2194>    : "↮" U21AE # LEFT RIGHT ARROW WITH STROKE
+<Multi_key> <KP_Divide> <U2194>        : "↮" U21AE # LEFT RIGHT ARROW WITH STROKE
+<Multi_key> <U2203> <U0338>    : "∄" U2204 # THERE DOES NOT EXIST
+<Multi_key> <U2208> <U0338>    : "∉" U2209 # NOT AN ELEMENT OF
+<Multi_key> <U220b> <U0338>    : "∌" U220C # DOES NOT CONTAIN AS MEMBER
+<Multi_key> <U2223> <U0338>    : "∤" U2224 # DOES NOT DIVIDE
+<Multi_key> <U2225> <U0338>    : "∦" U2226 # NOT PARALLEL TO
+<Multi_key> <U223c> <U0338>    : "≁" U2241 # NOT TILDE
+<Multi_key> <U2243> <U0338>    : "≄" U2244 # NOT ASYMPTOTICALLY EQUAL TO
+<Multi_key> <approximate> <U0338>      : "≇" U2247 # NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+<Multi_key> <U2248> <U0338>    : "≉" U2249 # NOT ALMOST EQUAL TO
+<Multi_key> <equal> <U0338>    : "≠" U2260 # NOT EQUAL TO
+<Multi_key> <KP_Equal> <U0338> : "≠" U2260 # NOT EQUAL TO
+<Multi_key> <identical> <U0338>        : "≢" U2262 # NOT IDENTICAL TO
+<Multi_key> <U224d> <U0338>    : "≭" U226D # NOT EQUIVALENT TO
+<Multi_key> <less> <U0338>     : "≮" U226E # NOT LESS-THAN
+<Multi_key> <leftcaret> <U0338>        : "≮" U226E # NOT LESS-THAN
+<Multi_key> <greater> <U0338>  : "≯" U226F # NOT GREATER-THAN
+<Multi_key> <rightcaret> <U0338>       : "≯" U226F # NOT GREATER-THAN
+<Multi_key> <lessthanequal> <U0338>    : "≰" U2270 # NEITHER LESS-THAN NOR EQUAL TO
+<Multi_key> <greaterthanequal> <U0338> : "≱" U2271 # NEITHER GREATER-THAN NOR EQUAL TO
+<Multi_key> <U2272> <U0338>    : "≴" U2274 # NEITHER LESS-THAN NOR EQUIVALENT TO
+<Multi_key> <U2273> <U0338>    : "≵" U2275 # NEITHER GREATER-THAN NOR EQUIVALENT TO
+<Multi_key> <U2276> <U0338>    : "≸" U2278 # NEITHER LESS-THAN NOR GREATER-THAN
+<Multi_key> <U2277> <U0338>    : "≹" U2279 # NEITHER GREATER-THAN NOR LESS-THAN
+<Multi_key> <U227a> <U0338>    : "⊀" U2280 # DOES NOT PRECEDE
+<Multi_key> <U227b> <U0338>    : "⊁" U2281 # DOES NOT SUCCEED
+<Multi_key> <includedin> <U0338>       : "⊄" U2284 # NOT A SUBSET OF
+<Multi_key> <leftshoe> <U0338> : "⊄" U2284 # NOT A SUBSET OF
+<Multi_key> <includes> <U0338> : "⊅" U2285 # NOT A SUPERSET OF
+<Multi_key> <rightshoe> <U0338>        : "⊅" U2285 # NOT A SUPERSET OF
+<Multi_key> <U2286> <U0338>    : "⊈" U2288 # NEITHER A SUBSET OF NOR EQUAL TO
+<Multi_key> <U2287> <U0338>    : "⊉" U2289 # NEITHER A SUPERSET OF NOR EQUAL TO
+<Multi_key> <righttack> <U0338>        : "⊬" U22AC # DOES NOT PROVE
+<Multi_key> <U22a8> <U0338>    : "⊭" U22AD # NOT TRUE
+<Multi_key> <U22a9> <U0338>    : "⊮" U22AE # DOES NOT FORCE
+<Multi_key> <U22ab> <U0338>    : "⊯" U22AF # NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+<Multi_key> <U227c> <U0338>    : "⋠" U22E0 # DOES NOT PRECEDE OR EQUAL
+<Multi_key> <U227d> <U0338>    : "⋡" U22E1 # DOES NOT SUCCEED OR EQUAL
+<Multi_key> <U2291> <U0338>    : "⋢" U22E2 # NOT SQUARE IMAGE OF OR EQUAL TO
+<Multi_key> <U2292> <U0338>    : "⋣" U22E3 # NOT SQUARE ORIGINAL OF OR EQUAL TO
+<Multi_key> <U22b2> <U0338>    : "⋪" U22EA # NOT NORMAL SUBGROUP OF
+<Multi_key> <U22b3> <U0338>    : "⋫" U22EB # DOES NOT CONTAIN AS NORMAL SUBGROUP
+<Multi_key> <U22b4> <U0338>    : "⋬" U22EC # NOT NORMAL SUBGROUP OF OR EQUAL TO
+<Multi_key> <U22b5> <U0338>    : "⋭" U22ED # DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+<Multi_key> <parenleft> <1> <parenright>       : "①" U2460 # CIRCLED DIGIT ONE
+<Multi_key> <parenleft> <KP_1> <parenright>    : "①" U2460 # CIRCLED DIGIT ONE
+<Multi_key> <parenleft> <2> <parenright>       : "②" U2461 # CIRCLED DIGIT TWO
+<Multi_key> <parenleft> <KP_Space> <parenright>        : "②" U2461 # CIRCLED DIGIT TWO
+<Multi_key> <parenleft> <KP_2> <parenright>    : "②" U2461 # CIRCLED DIGIT TWO
+<Multi_key> <parenleft> <3> <parenright>       : "③" U2462 # CIRCLED DIGIT THREE
+<Multi_key> <parenleft> <KP_3> <parenright>    : "③" U2462 # CIRCLED DIGIT THREE
+<Multi_key> <parenleft> <4> <parenright>       : "④" U2463 # CIRCLED DIGIT FOUR
+<Multi_key> <parenleft> <KP_4> <parenright>    : "④" U2463 # CIRCLED DIGIT FOUR
+<Multi_key> <parenleft> <5> <parenright>       : "⑤" U2464 # CIRCLED DIGIT FIVE
+<Multi_key> <parenleft> <KP_5> <parenright>    : "⑤" U2464 # CIRCLED DIGIT FIVE
+<Multi_key> <parenleft> <6> <parenright>       : "⑥" U2465 # CIRCLED DIGIT SIX
+<Multi_key> <parenleft> <KP_6> <parenright>    : "⑥" U2465 # CIRCLED DIGIT SIX
+<Multi_key> <parenleft> <7> <parenright>       : "⑦" U2466 # CIRCLED DIGIT SEVEN
+<Multi_key> <parenleft> <KP_7> <parenright>    : "⑦" U2466 # CIRCLED DIGIT SEVEN
+<Multi_key> <parenleft> <8> <parenright>       : "⑧" U2467 # CIRCLED DIGIT EIGHT
+<Multi_key> <parenleft> <KP_8> <parenright>    : "⑧" U2467 # CIRCLED DIGIT EIGHT
+<Multi_key> <parenleft> <9> <parenright>       : "⑨" U2468 # CIRCLED DIGIT NINE
+<Multi_key> <parenleft> <KP_9> <parenright>    : "⑨" U2468 # CIRCLED DIGIT NINE
+<Multi_key> <parenleft> <1> <0> <parenright>   : "⑩" U2469 # CIRCLED NUMBER TEN
+<Multi_key> <parenleft> <1> <KP_0> <parenright>        : "⑩" U2469 # CIRCLED NUMBER TEN
+<Multi_key> <parenleft> <KP_1> <0> <parenright>        : "⑩" U2469 # CIRCLED NUMBER TEN
+<Multi_key> <parenleft> <KP_1> <KP_0> <parenright>     : "⑩" U2469 # CIRCLED NUMBER TEN
+<Multi_key> <parenleft> <1> <1> <parenright>   : "⑪" U246A # CIRCLED NUMBER ELEVEN
+<Multi_key> <parenleft> <1> <KP_1> <parenright>        : "⑪" U246A # CIRCLED NUMBER ELEVEN
+<Multi_key> <parenleft> <KP_1> <1> <parenright>        : "⑪" U246A # CIRCLED NUMBER ELEVEN
+<Multi_key> <parenleft> <KP_1> <KP_1> <parenright>     : "⑪" U246A # CIRCLED NUMBER ELEVEN
+<Multi_key> <parenleft> <1> <2> <parenright>   : "⑫" U246B # CIRCLED NUMBER TWELVE
+<Multi_key> <parenleft> <1> <KP_Space> <parenright>    : "⑫" U246B # CIRCLED NUMBER TWELVE
+<Multi_key> <parenleft> <1> <KP_2> <parenright>        : "⑫" U246B # CIRCLED NUMBER TWELVE
+<Multi_key> <parenleft> <KP_1> <2> <parenright>        : "⑫" U246B # CIRCLED NUMBER TWELVE
+<Multi_key> <parenleft> <KP_1> <KP_Space> <parenright> : "⑫" U246B # CIRCLED NUMBER TWELVE
+<Multi_key> <parenleft> <KP_1> <KP_2> <parenright>     : "⑫" U246B # CIRCLED NUMBER TWELVE
+<Multi_key> <parenleft> <1> <3> <parenright>   : "⑬" U246C # CIRCLED NUMBER THIRTEEN
+<Multi_key> <parenleft> <1> <KP_3> <parenright>        : "⑬" U246C # CIRCLED NUMBER THIRTEEN
+<Multi_key> <parenleft> <KP_1> <3> <parenright>        : "⑬" U246C # CIRCLED NUMBER THIRTEEN
+<Multi_key> <parenleft> <KP_1> <KP_3> <parenright>     : "⑬" U246C # CIRCLED NUMBER THIRTEEN
+<Multi_key> <parenleft> <1> <4> <parenright>   : "⑭" U246D # CIRCLED NUMBER FOURTEEN
+<Multi_key> <parenleft> <1> <KP_4> <parenright>        : "⑭" U246D # CIRCLED NUMBER FOURTEEN
+<Multi_key> <parenleft> <KP_1> <4> <parenright>        : "⑭" U246D # CIRCLED NUMBER FOURTEEN
+<Multi_key> <parenleft> <KP_1> <KP_4> <parenright>     : "⑭" U246D # CIRCLED NUMBER FOURTEEN
+<Multi_key> <parenleft> <1> <5> <parenright>   : "⑮" U246E # CIRCLED NUMBER FIFTEEN
+<Multi_key> <parenleft> <1> <KP_5> <parenright>        : "⑮" U246E # CIRCLED NUMBER FIFTEEN
+<Multi_key> <parenleft> <KP_1> <5> <parenright>        : "⑮" U246E # CIRCLED NUMBER FIFTEEN
+<Multi_key> <parenleft> <KP_1> <KP_5> <parenright>     : "⑮" U246E # CIRCLED NUMBER FIFTEEN
+<Multi_key> <parenleft> <1> <6> <parenright>   : "⑯" U246F # CIRCLED NUMBER SIXTEEN
+<Multi_key> <parenleft> <1> <KP_6> <parenright>        : "⑯" U246F # CIRCLED NUMBER SIXTEEN
+<Multi_key> <parenleft> <KP_1> <6> <parenright>        : "⑯" U246F # CIRCLED NUMBER SIXTEEN
+<Multi_key> <parenleft> <KP_1> <KP_6> <parenright>     : "⑯" U246F # CIRCLED NUMBER SIXTEEN
+<Multi_key> <parenleft> <1> <7> <parenright>   : "⑰" U2470 # CIRCLED NUMBER SEVENTEEN
+<Multi_key> <parenleft> <1> <KP_7> <parenright>        : "⑰" U2470 # CIRCLED NUMBER SEVENTEEN
+<Multi_key> <parenleft> <KP_1> <7> <parenright>        : "⑰" U2470 # CIRCLED NUMBER SEVENTEEN
+<Multi_key> <parenleft> <KP_1> <KP_7> <parenright>     : "⑰" U2470 # CIRCLED NUMBER SEVENTEEN
+<Multi_key> <parenleft> <1> <8> <parenright>   : "⑱" U2471 # CIRCLED NUMBER EIGHTEEN
+<Multi_key> <parenleft> <1> <KP_8> <parenright>        : "⑱" U2471 # CIRCLED NUMBER EIGHTEEN
+<Multi_key> <parenleft> <KP_1> <8> <parenright>        : "⑱" U2471 # CIRCLED NUMBER EIGHTEEN
+<Multi_key> <parenleft> <KP_1> <KP_8> <parenright>     : "⑱" U2471 # CIRCLED NUMBER EIGHTEEN
+<Multi_key> <parenleft> <1> <9> <parenright>   : "⑲" U2472 # CIRCLED NUMBER NINETEEN
+<Multi_key> <parenleft> <1> <KP_9> <parenright>        : "⑲" U2472 # CIRCLED NUMBER NINETEEN
+<Multi_key> <parenleft> <KP_1> <9> <parenright>        : "⑲" U2472 # CIRCLED NUMBER NINETEEN
+<Multi_key> <parenleft> <KP_1> <KP_9> <parenright>     : "⑲" U2472 # CIRCLED NUMBER NINETEEN
+<Multi_key> <parenleft> <2> <0> <parenright>   : "⑳" U2473 # CIRCLED NUMBER TWENTY
+<Multi_key> <parenleft> <2> <KP_0> <parenright>        : "⑳" U2473 # CIRCLED NUMBER TWENTY
+<Multi_key> <parenleft> <KP_Space> <0> <parenright>    : "⑳" U2473 # CIRCLED NUMBER TWENTY
+<Multi_key> <parenleft> <KP_Space> <KP_0> <parenright> : "⑳" U2473 # CIRCLED NUMBER TWENTY
+<Multi_key> <parenleft> <KP_2> <0> <parenright>        : "⑳" U2473 # CIRCLED NUMBER TWENTY
+<Multi_key> <parenleft> <KP_2> <KP_0> <parenright>     : "⑳" U2473 # CIRCLED NUMBER TWENTY
+<Multi_key> <parenleft> <A> <parenright>       : "Ⓐ" U24B6 # CIRCLED LATIN CAPITAL LETTER A
+<Multi_key> <parenleft> <B> <parenright>       : "Ⓑ" U24B7 # CIRCLED LATIN CAPITAL LETTER B
+<Multi_key> <parenleft> <C> <parenright>       : "Ⓒ" U24B8 # CIRCLED LATIN CAPITAL LETTER C
+<Multi_key> <parenleft> <D> <parenright>       : "Ⓓ" U24B9 # CIRCLED LATIN CAPITAL LETTER D
+<Multi_key> <parenleft> <E> <parenright>       : "Ⓔ" U24BA # CIRCLED LATIN CAPITAL LETTER E
+<Multi_key> <parenleft> <F> <parenright>       : "Ⓕ" U24BB # CIRCLED LATIN CAPITAL LETTER F
+<Multi_key> <parenleft> <G> <parenright>       : "Ⓖ" U24BC # CIRCLED LATIN CAPITAL LETTER G
+<Multi_key> <parenleft> <H> <parenright>       : "Ⓗ" U24BD # CIRCLED LATIN CAPITAL LETTER H
+<Multi_key> <parenleft> <I> <parenright>       : "Ⓘ" U24BE # CIRCLED LATIN CAPITAL LETTER I
+<Multi_key> <parenleft> <J> <parenright>       : "Ⓙ" U24BF # CIRCLED LATIN CAPITAL LETTER J
+<Multi_key> <parenleft> <K> <parenright>       : "Ⓚ" U24C0 # CIRCLED LATIN CAPITAL LETTER K
+<Multi_key> <parenleft> <L> <parenright>       : "Ⓛ" U24C1 # CIRCLED LATIN CAPITAL LETTER L
+<Multi_key> <parenleft> <M> <parenright>       : "Ⓜ" U24C2 # CIRCLED LATIN CAPITAL LETTER M
+<Multi_key> <parenleft> <N> <parenright>       : "Ⓝ" U24C3 # CIRCLED LATIN CAPITAL LETTER N
+<Multi_key> <parenleft> <O> <parenright>       : "Ⓞ" U24C4 # CIRCLED LATIN CAPITAL LETTER O
+<Multi_key> <parenleft> <P> <parenright>       : "Ⓟ" U24C5 # CIRCLED LATIN CAPITAL LETTER P
+<Multi_key> <parenleft> <Q> <parenright>       : "Ⓠ" U24C6 # CIRCLED LATIN CAPITAL LETTER Q
+<Multi_key> <parenleft> <R> <parenright>       : "Ⓡ" U24C7 # CIRCLED LATIN CAPITAL LETTER R
+<Multi_key> <parenleft> <S> <parenright>       : "Ⓢ" U24C8 # CIRCLED LATIN CAPITAL LETTER S
+<Multi_key> <parenleft> <T> <parenright>       : "Ⓣ" U24C9 # CIRCLED LATIN CAPITAL LETTER T
+<Multi_key> <parenleft> <U> <parenright>       : "Ⓤ" U24CA # CIRCLED LATIN CAPITAL LETTER U
+<Multi_key> <parenleft> <V> <parenright>       : "Ⓥ" U24CB # CIRCLED LATIN CAPITAL LETTER V
+<Multi_key> <parenleft> <W> <parenright>       : "Ⓦ" U24CC # CIRCLED LATIN CAPITAL LETTER W
+<Multi_key> <parenleft> <X> <parenright>       : "Ⓧ" U24CD # CIRCLED LATIN CAPITAL LETTER X
+<Multi_key> <parenleft> <Y> <parenright>       : "Ⓨ" U24CE # CIRCLED LATIN CAPITAL LETTER Y
+<Multi_key> <parenleft> <Z> <parenright>       : "Ⓩ" U24CF # CIRCLED LATIN CAPITAL LETTER Z
+<Multi_key> <parenleft> <a> <parenright>       : "ⓐ" U24D0 # CIRCLED LATIN SMALL LETTER A
+<Multi_key> <parenleft> <b> <parenright>       : "ⓑ" U24D1 # CIRCLED LATIN SMALL LETTER B
+<Multi_key> <parenleft> <c> <parenright>       : "ⓒ" U24D2 # CIRCLED LATIN SMALL LETTER C
+<Multi_key> <parenleft> <d> <parenright>       : "ⓓ" U24D3 # CIRCLED LATIN SMALL LETTER D
+<Multi_key> <parenleft> <e> <parenright>       : "ⓔ" U24D4 # CIRCLED LATIN SMALL LETTER E
+<Multi_key> <parenleft> <f> <parenright>       : "ⓕ" U24D5 # CIRCLED LATIN SMALL LETTER F
+<Multi_key> <parenleft> <g> <parenright>       : "ⓖ" U24D6 # CIRCLED LATIN SMALL LETTER G
+<Multi_key> <parenleft> <h> <parenright>       : "ⓗ" U24D7 # CIRCLED LATIN SMALL LETTER H
+<Multi_key> <parenleft> <i> <parenright>       : "ⓘ" U24D8 # CIRCLED LATIN SMALL LETTER I
+<Multi_key> <parenleft> <j> <parenright>       : "ⓙ" U24D9 # CIRCLED LATIN SMALL LETTER J
+<Multi_key> <parenleft> <k> <parenright>       : "ⓚ" U24DA # CIRCLED LATIN SMALL LETTER K
+<Multi_key> <parenleft> <l> <parenright>       : "ⓛ" U24DB # CIRCLED LATIN SMALL LETTER L
+<Multi_key> <parenleft> <m> <parenright>       : "ⓜ" U24DC # CIRCLED LATIN SMALL LETTER M
+<Multi_key> <parenleft> <n> <parenright>       : "ⓝ" U24DD # CIRCLED LATIN SMALL LETTER N
+<Multi_key> <parenleft> <o> <parenright>       : "ⓞ" U24DE # CIRCLED LATIN SMALL LETTER O
+<Multi_key> <parenleft> <p> <parenright>       : "ⓟ" U24DF # CIRCLED LATIN SMALL LETTER P
+<Multi_key> <parenleft> <q> <parenright>       : "ⓠ" U24E0 # CIRCLED LATIN SMALL LETTER Q
+<Multi_key> <parenleft> <r> <parenright>       : "ⓡ" U24E1 # CIRCLED LATIN SMALL LETTER R
+<Multi_key> <parenleft> <s> <parenright>       : "ⓢ" U24E2 # CIRCLED LATIN SMALL LETTER S
+<Multi_key> <parenleft> <t> <parenright>       : "ⓣ" U24E3 # CIRCLED LATIN SMALL LETTER T
+<Multi_key> <parenleft> <u> <parenright>       : "ⓤ" U24E4 # CIRCLED LATIN SMALL LETTER U
+<Multi_key> <parenleft> <v> <parenright>       : "ⓥ" U24E5 # CIRCLED LATIN SMALL LETTER V
+<Multi_key> <parenleft> <w> <parenright>       : "ⓦ" U24E6 # CIRCLED LATIN SMALL LETTER W
+<Multi_key> <parenleft> <x> <parenright>       : "ⓧ" U24E7 # CIRCLED LATIN SMALL LETTER X
+<Multi_key> <parenleft> <y> <parenright>       : "ⓨ" U24E8 # CIRCLED LATIN SMALL LETTER Y
+<Multi_key> <parenleft> <z> <parenright>       : "ⓩ" U24E9 # CIRCLED LATIN SMALL LETTER Z
+<Multi_key> <parenleft> <0> <parenright>       : "⓪" U24EA # CIRCLED DIGIT ZERO
+<Multi_key> <parenleft> <KP_0> <parenright>    : "⓪" U24EA # CIRCLED DIGIT ZERO
+<Multi_key> <U2add> <U0338>    : "⫝̸" U2ADC # FORKING
+<dead_voiced_sound> <U304b>    : "が" U304C # HIRAGANA LETTER GA
+<dead_voiced_sound> <U304d>    : "ぎ" U304E # HIRAGANA LETTER GI
+<dead_voiced_sound> <U304f>    : "ぐ" U3050 # HIRAGANA LETTER GU
+<dead_voiced_sound> <U3051>    : "げ" U3052 # HIRAGANA LETTER GE
+<dead_voiced_sound> <U3053>    : "ご" U3054 # HIRAGANA LETTER GO
+<dead_voiced_sound> <U3055>    : "ざ" U3056 # HIRAGANA LETTER ZA
+<dead_voiced_sound> <U3057>    : "じ" U3058 # HIRAGANA LETTER ZI
+<dead_voiced_sound> <U3059>    : "ず" U305A # HIRAGANA LETTER ZU
+<dead_voiced_sound> <U305b>    : "ぜ" U305C # HIRAGANA LETTER ZE
+<dead_voiced_sound> <U305d>    : "ぞ" U305E # HIRAGANA LETTER ZO
+<dead_voiced_sound> <U305f>    : "だ" U3060 # HIRAGANA LETTER DA
+<dead_voiced_sound> <U3061>    : "ぢ" U3062 # HIRAGANA LETTER DI
+<dead_voiced_sound> <U3064>    : "づ" U3065 # HIRAGANA LETTER DU
+<dead_voiced_sound> <U3066>    : "で" U3067 # HIRAGANA LETTER DE
+<dead_voiced_sound> <U3068>    : "ど" U3069 # HIRAGANA LETTER DO
+<dead_voiced_sound> <U306f>    : "ば" U3070 # HIRAGANA LETTER BA
+<dead_semivoiced_sound> <U306f>        : "ぱ" U3071 # HIRAGANA LETTER PA
+<dead_voiced_sound> <U3072>    : "び" U3073 # HIRAGANA LETTER BI
+<dead_semivoiced_sound> <U3072>        : "ぴ" U3074 # HIRAGANA LETTER PI
+<dead_voiced_sound> <U3075>    : "ぶ" U3076 # HIRAGANA LETTER BU
+<dead_semivoiced_sound> <U3075>        : "ぷ" U3077 # HIRAGANA LETTER PU
+<dead_voiced_sound> <U3078>    : "べ" U3079 # HIRAGANA LETTER BE
+<dead_semivoiced_sound> <U3078>        : "ぺ" U307A # HIRAGANA LETTER PE
+<dead_voiced_sound> <U307b>    : "ぼ" U307C # HIRAGANA LETTER BO
+<dead_semivoiced_sound> <U307b>        : "ぽ" U307D # HIRAGANA LETTER PO
+<dead_voiced_sound> <U3046>    : "ゔ" U3094 # HIRAGANA LETTER VU
+<dead_voiced_sound> <U309d>    : "ゞ" U309E # HIRAGANA VOICED ITERATION MARK
+<dead_voiced_sound> <kana_KA>  : "ガ" U30AC # KATAKANA LETTER GA
+<dead_voiced_sound> <kana_KI>  : "ギ" U30AE # KATAKANA LETTER GI
+<dead_voiced_sound> <kana_KU>  : "グ" U30B0 # KATAKANA LETTER GU
+<dead_voiced_sound> <kana_KE>  : "ゲ" U30B2 # KATAKANA LETTER GE
+<dead_voiced_sound> <kana_KO>  : "ゴ" U30B4 # KATAKANA LETTER GO
+<dead_voiced_sound> <kana_SA>  : "ザ" U30B6 # KATAKANA LETTER ZA
+<dead_voiced_sound> <kana_SHI> : "ジ" U30B8 # KATAKANA LETTER ZI
+<dead_voiced_sound> <kana_SU>  : "ズ" U30BA # KATAKANA LETTER ZU
+<dead_voiced_sound> <kana_SE>  : "ゼ" U30BC # KATAKANA LETTER ZE
+<dead_voiced_sound> <kana_SO>  : "ゾ" U30BE # KATAKANA LETTER ZO
+<dead_voiced_sound> <kana_TA>  : "ダ" U30C0 # KATAKANA LETTER DA
+<dead_voiced_sound> <kana_CHI> : "ヂ" U30C2 # KATAKANA LETTER DI
+<dead_voiced_sound> <kana_TSU> : "ヅ" U30C5 # KATAKANA LETTER DU
+<dead_voiced_sound> <kana_TE>  : "デ" U30C7 # KATAKANA LETTER DE
+<dead_voiced_sound> <kana_TO>  : "ド" U30C9 # KATAKANA LETTER DO
+<dead_voiced_sound> <kana_HA>  : "バ" U30D0 # KATAKANA LETTER BA
+<dead_semivoiced_sound> <kana_HA>      : "パ" U30D1 # KATAKANA LETTER PA
+<dead_voiced_sound> <kana_HI>  : "ビ" U30D3 # KATAKANA LETTER BI
+<dead_semivoiced_sound> <kana_HI>      : "ピ" U30D4 # KATAKANA LETTER PI
+<dead_voiced_sound> <kana_FU>  : "ブ" U30D6 # KATAKANA LETTER BU
+<dead_semivoiced_sound> <kana_FU>      : "プ" U30D7 # KATAKANA LETTER PU
+<dead_voiced_sound> <kana_HE>  : "ベ" U30D9 # KATAKANA LETTER BE
+<dead_semivoiced_sound> <kana_HE>      : "ペ" U30DA # KATAKANA LETTER PE
+<dead_voiced_sound> <kana_HO>  : "ボ" U30DC # KATAKANA LETTER BO
+<dead_semivoiced_sound> <kana_HO>      : "ポ" U30DD # KATAKANA LETTER PO
+<dead_voiced_sound> <kana_U>   : "ヴ" U30F4 # KATAKANA LETTER VU
+<dead_voiced_sound> <kana_WA>  : "ヷ" U30F7 # KATAKANA LETTER VA
+<dead_voiced_sound> <U30f0>    : "ヸ" U30F8 # KATAKANA LETTER VI
+<dead_voiced_sound> <U30f1>    : "ヹ" U30F9 # KATAKANA LETTER VE
+<dead_voiced_sound> <kana_WO>  : "ヺ" U30FA # KATAKANA LETTER VO
+<dead_voiced_sound> <U30fd>    : "ヾ" U30FE # KATAKANA VOICED ITERATION MARK
+<dead_circumflex> <U4e00>      : "㆒" U3192 # IDEOGRAPHIC ANNOTATION ONE MARK
+<Multi_key> <asciicircum> <U4e00>      : "㆒" U3192 # IDEOGRAPHIC ANNOTATION ONE MARK
+<dead_circumflex> <U4e8c>      : "㆓" U3193 # IDEOGRAPHIC ANNOTATION TWO MARK
+<Multi_key> <asciicircum> <U4e8c>      : "㆓" U3193 # IDEOGRAPHIC ANNOTATION TWO MARK
+<dead_circumflex> <U4e09>      : "㆔" U3194 # IDEOGRAPHIC ANNOTATION THREE MARK
+<Multi_key> <asciicircum> <U4e09>      : "㆔" U3194 # IDEOGRAPHIC ANNOTATION THREE MARK
+<dead_circumflex> <U56db>      : "㆕" U3195 # IDEOGRAPHIC ANNOTATION FOUR MARK
+<Multi_key> <asciicircum> <U56db>      : "㆕" U3195 # IDEOGRAPHIC ANNOTATION FOUR MARK
+<dead_circumflex> <U4e0a>      : "㆖" U3196 # IDEOGRAPHIC ANNOTATION TOP MARK
+<Multi_key> <asciicircum> <U4e0a>      : "㆖" U3196 # IDEOGRAPHIC ANNOTATION TOP MARK
+<dead_circumflex> <U4e2d>      : "㆗" U3197 # IDEOGRAPHIC ANNOTATION MIDDLE MARK
+<Multi_key> <asciicircum> <U4e2d>      : "㆗" U3197 # IDEOGRAPHIC ANNOTATION MIDDLE MARK
+<dead_circumflex> <U4e0b>      : "㆘" U3198 # IDEOGRAPHIC ANNOTATION BOTTOM MARK
+<Multi_key> <asciicircum> <U4e0b>      : "㆘" U3198 # IDEOGRAPHIC ANNOTATION BOTTOM MARK
+<dead_circumflex> <U7532>      : "㆙" U3199 # IDEOGRAPHIC ANNOTATION FIRST MARK
+<Multi_key> <asciicircum> <U7532>      : "㆙" U3199 # IDEOGRAPHIC ANNOTATION FIRST MARK
+<dead_circumflex> <U4e59>      : "㆚" U319A # IDEOGRAPHIC ANNOTATION SECOND MARK
+<Multi_key> <asciicircum> <U4e59>      : "㆚" U319A # IDEOGRAPHIC ANNOTATION SECOND MARK
+<dead_circumflex> <U4e19>      : "㆛" U319B # IDEOGRAPHIC ANNOTATION THIRD MARK
+<Multi_key> <asciicircum> <U4e19>      : "㆛" U319B # IDEOGRAPHIC ANNOTATION THIRD MARK
+<dead_circumflex> <U4e01>      : "㆜" U319C # IDEOGRAPHIC ANNOTATION FOURTH MARK
+<Multi_key> <asciicircum> <U4e01>      : "㆜" U319C # IDEOGRAPHIC ANNOTATION FOURTH MARK
+<dead_circumflex> <U5929>      : "㆝" U319D # IDEOGRAPHIC ANNOTATION HEAVEN MARK
+<Multi_key> <asciicircum> <U5929>      : "㆝" U319D # IDEOGRAPHIC ANNOTATION HEAVEN MARK
+<dead_circumflex> <U5730>      : "㆞" U319E # IDEOGRAPHIC ANNOTATION EARTH MARK
+<Multi_key> <asciicircum> <U5730>      : "㆞" U319E # IDEOGRAPHIC ANNOTATION EARTH MARK
+<dead_circumflex> <U4eba>      : "㆟" U319F # IDEOGRAPHIC ANNOTATION MAN MARK
+<Multi_key> <asciicircum> <U4eba>      : "㆟" U319F # IDEOGRAPHIC ANNOTATION MAN MARK
+<Multi_key> <parenleft> <2> <1> <parenright>   : "㉑" U3251 # CIRCLED NUMBER TWENTY ONE
+<Multi_key> <parenleft> <2> <KP_1> <parenright>        : "㉑" U3251 # CIRCLED NUMBER TWENTY ONE
+<Multi_key> <parenleft> <KP_Space> <1> <parenright>    : "㉑" U3251 # CIRCLED NUMBER TWENTY ONE
+<Multi_key> <parenleft> <KP_Space> <KP_1> <parenright> : "㉑" U3251 # CIRCLED NUMBER TWENTY ONE
+<Multi_key> <parenleft> <KP_2> <1> <parenright>        : "㉑" U3251 # CIRCLED NUMBER TWENTY ONE
+<Multi_key> <parenleft> <KP_2> <KP_1> <parenright>     : "㉑" U3251 # CIRCLED NUMBER TWENTY ONE
+<Multi_key> <parenleft> <2> <2> <parenright>   : "㉒" U3252 # CIRCLED NUMBER TWENTY TWO
+<Multi_key> <parenleft> <2> <KP_Space> <parenright>    : "㉒" U3252 # CIRCLED NUMBER TWENTY TWO
+<Multi_key> <parenleft> <2> <KP_2> <parenright>        : "㉒" U3252 # CIRCLED NUMBER TWENTY TWO
+<Multi_key> <parenleft> <KP_Space> <2> <parenright>    : "㉒" U3252 # CIRCLED NUMBER TWENTY TWO
+<Multi_key> <parenleft> <KP_Space> <KP_Space> <parenright>     : "㉒" U3252 # CIRCLED NUMBER TWENTY TWO
+<Multi_key> <parenleft> <KP_Space> <KP_2> <parenright> : "㉒" U3252 # CIRCLED NUMBER TWENTY TWO
+<Multi_key> <parenleft> <KP_2> <2> <parenright>        : "㉒" U3252 # CIRCLED NUMBER TWENTY TWO
+<Multi_key> <parenleft> <KP_2> <KP_Space> <parenright> : "㉒" U3252 # CIRCLED NUMBER TWENTY TWO
+<Multi_key> <parenleft> <KP_2> <KP_2> <parenright>     : "㉒" U3252 # CIRCLED NUMBER TWENTY TWO
+<Multi_key> <parenleft> <2> <3> <parenright>   : "㉓" U3253 # CIRCLED NUMBER TWENTY THREE
+<Multi_key> <parenleft> <2> <KP_3> <parenright>        : "㉓" U3253 # CIRCLED NUMBER TWENTY THREE
+<Multi_key> <parenleft> <KP_Space> <3> <parenright>    : "㉓" U3253 # CIRCLED NUMBER TWENTY THREE
+<Multi_key> <parenleft> <KP_Space> <KP_3> <parenright> : "㉓" U3253 # CIRCLED NUMBER TWENTY THREE
+<Multi_key> <parenleft> <KP_2> <3> <parenright>        : "㉓" U3253 # CIRCLED NUMBER TWENTY THREE
+<Multi_key> <parenleft> <KP_2> <KP_3> <parenright>     : "㉓" U3253 # CIRCLED NUMBER TWENTY THREE
+<Multi_key> <parenleft> <2> <4> <parenright>   : "㉔" U3254 # CIRCLED NUMBER TWENTY FOUR
+<Multi_key> <parenleft> <2> <KP_4> <parenright>        : "㉔" U3254 # CIRCLED NUMBER TWENTY FOUR
+<Multi_key> <parenleft> <KP_Space> <4> <parenright>    : "㉔" U3254 # CIRCLED NUMBER TWENTY FOUR
+<Multi_key> <parenleft> <KP_Space> <KP_4> <parenright> : "㉔" U3254 # CIRCLED NUMBER TWENTY FOUR
+<Multi_key> <parenleft> <KP_2> <4> <parenright>        : "㉔" U3254 # CIRCLED NUMBER TWENTY FOUR
+<Multi_key> <parenleft> <KP_2> <KP_4> <parenright>     : "㉔" U3254 # CIRCLED NUMBER TWENTY FOUR
+<Multi_key> <parenleft> <2> <5> <parenright>   : "㉕" U3255 # CIRCLED NUMBER TWENTY FIVE
+<Multi_key> <parenleft> <2> <KP_5> <parenright>        : "㉕" U3255 # CIRCLED NUMBER TWENTY FIVE
+<Multi_key> <parenleft> <KP_Space> <5> <parenright>    : "㉕" U3255 # CIRCLED NUMBER TWENTY FIVE
+<Multi_key> <parenleft> <KP_Space> <KP_5> <parenright> : "㉕" U3255 # CIRCLED NUMBER TWENTY FIVE
+<Multi_key> <parenleft> <KP_2> <5> <parenright>        : "㉕" U3255 # CIRCLED NUMBER TWENTY FIVE
+<Multi_key> <parenleft> <KP_2> <KP_5> <parenright>     : "㉕" U3255 # CIRCLED NUMBER TWENTY FIVE
+<Multi_key> <parenleft> <2> <6> <parenright>   : "㉖" U3256 # CIRCLED NUMBER TWENTY SIX
+<Multi_key> <parenleft> <2> <KP_6> <parenright>        : "㉖" U3256 # CIRCLED NUMBER TWENTY SIX
+<Multi_key> <parenleft> <KP_Space> <6> <parenright>    : "㉖" U3256 # CIRCLED NUMBER TWENTY SIX
+<Multi_key> <parenleft> <KP_Space> <KP_6> <parenright> : "㉖" U3256 # CIRCLED NUMBER TWENTY SIX
+<Multi_key> <parenleft> <KP_2> <6> <parenright>        : "㉖" U3256 # CIRCLED NUMBER TWENTY SIX
+<Multi_key> <parenleft> <KP_2> <KP_6> <parenright>     : "㉖" U3256 # CIRCLED NUMBER TWENTY SIX
+<Multi_key> <parenleft> <2> <7> <parenright>   : "㉗" U3257 # CIRCLED NUMBER TWENTY SEVEN
+<Multi_key> <parenleft> <2> <KP_7> <parenright>        : "㉗" U3257 # CIRCLED NUMBER TWENTY SEVEN
+<Multi_key> <parenleft> <KP_Space> <7> <parenright>    : "㉗" U3257 # CIRCLED NUMBER TWENTY SEVEN
+<Multi_key> <parenleft> <KP_Space> <KP_7> <parenright> : "㉗" U3257 # CIRCLED NUMBER TWENTY SEVEN
+<Multi_key> <parenleft> <KP_2> <7> <parenright>        : "㉗" U3257 # CIRCLED NUMBER TWENTY SEVEN
+<Multi_key> <parenleft> <KP_2> <KP_7> <parenright>     : "㉗" U3257 # CIRCLED NUMBER TWENTY SEVEN
+<Multi_key> <parenleft> <2> <8> <parenright>   : "㉘" U3258 # CIRCLED NUMBER TWENTY EIGHT
+<Multi_key> <parenleft> <2> <KP_8> <parenright>        : "㉘" U3258 # CIRCLED NUMBER TWENTY EIGHT
+<Multi_key> <parenleft> <KP_Space> <8> <parenright>    : "㉘" U3258 # CIRCLED NUMBER TWENTY EIGHT
+<Multi_key> <parenleft> <KP_Space> <KP_8> <parenright> : "㉘" U3258 # CIRCLED NUMBER TWENTY EIGHT
+<Multi_key> <parenleft> <KP_2> <8> <parenright>        : "㉘" U3258 # CIRCLED NUMBER TWENTY EIGHT
+<Multi_key> <parenleft> <KP_2> <KP_8> <parenright>     : "㉘" U3258 # CIRCLED NUMBER TWENTY EIGHT
+<Multi_key> <parenleft> <2> <9> <parenright>   : "㉙" U3259 # CIRCLED NUMBER TWENTY NINE
+<Multi_key> <parenleft> <2> <KP_9> <parenright>        : "㉙" U3259 # CIRCLED NUMBER TWENTY NINE
+<Multi_key> <parenleft> <KP_Space> <9> <parenright>    : "㉙" U3259 # CIRCLED NUMBER TWENTY NINE
+<Multi_key> <parenleft> <KP_Space> <KP_9> <parenright> : "㉙" U3259 # CIRCLED NUMBER TWENTY NINE
+<Multi_key> <parenleft> <KP_2> <9> <parenright>        : "㉙" U3259 # CIRCLED NUMBER TWENTY NINE
+<Multi_key> <parenleft> <KP_2> <KP_9> <parenright>     : "㉙" U3259 # CIRCLED NUMBER TWENTY NINE
+<Multi_key> <parenleft> <3> <0> <parenright>   : "㉚" U325A # CIRCLED NUMBER THIRTY
+<Multi_key> <parenleft> <3> <KP_0> <parenright>        : "㉚" U325A # CIRCLED NUMBER THIRTY
+<Multi_key> <parenleft> <KP_3> <0> <parenright>        : "㉚" U325A # CIRCLED NUMBER THIRTY
+<Multi_key> <parenleft> <KP_3> <KP_0> <parenright>     : "㉚" U325A # CIRCLED NUMBER THIRTY
+<Multi_key> <parenleft> <3> <1> <parenright>   : "㉛" U325B # CIRCLED NUMBER THIRTY ONE
+<Multi_key> <parenleft> <3> <KP_1> <parenright>        : "㉛" U325B # CIRCLED NUMBER THIRTY ONE
+<Multi_key> <parenleft> <KP_3> <1> <parenright>        : "㉛" U325B # CIRCLED NUMBER THIRTY ONE
+<Multi_key> <parenleft> <KP_3> <KP_1> <parenright>     : "㉛" U325B # CIRCLED NUMBER THIRTY ONE
+<Multi_key> <parenleft> <3> <2> <parenright>   : "㉜" U325C # CIRCLED NUMBER THIRTY TWO
+<Multi_key> <parenleft> <3> <KP_Space> <parenright>    : "㉜" U325C # CIRCLED NUMBER THIRTY TWO
+<Multi_key> <parenleft> <3> <KP_2> <parenright>        : "㉜" U325C # CIRCLED NUMBER THIRTY TWO
+<Multi_key> <parenleft> <KP_3> <2> <parenright>        : "㉜" U325C # CIRCLED NUMBER THIRTY TWO
+<Multi_key> <parenleft> <KP_3> <KP_Space> <parenright> : "㉜" U325C # CIRCLED NUMBER THIRTY TWO
+<Multi_key> <parenleft> <KP_3> <KP_2> <parenright>     : "㉜" U325C # CIRCLED NUMBER THIRTY TWO
+<Multi_key> <parenleft> <3> <3> <parenright>   : "㉝" U325D # CIRCLED NUMBER THIRTY THREE
+<Multi_key> <parenleft> <3> <KP_3> <parenright>        : "㉝" U325D # CIRCLED NUMBER THIRTY THREE
+<Multi_key> <parenleft> <KP_3> <3> <parenright>        : "㉝" U325D # CIRCLED NUMBER THIRTY THREE
+<Multi_key> <parenleft> <KP_3> <KP_3> <parenright>     : "㉝" U325D # CIRCLED NUMBER THIRTY THREE
+<Multi_key> <parenleft> <3> <4> <parenright>   : "㉞" U325E # CIRCLED NUMBER THIRTY FOUR
+<Multi_key> <parenleft> <3> <KP_4> <parenright>        : "㉞" U325E # CIRCLED NUMBER THIRTY FOUR
+<Multi_key> <parenleft> <KP_3> <4> <parenright>        : "㉞" U325E # CIRCLED NUMBER THIRTY FOUR
+<Multi_key> <parenleft> <KP_3> <KP_4> <parenright>     : "㉞" U325E # CIRCLED NUMBER THIRTY FOUR
+<Multi_key> <parenleft> <3> <5> <parenright>   : "㉟" U325F # CIRCLED NUMBER THIRTY FIVE
+<Multi_key> <parenleft> <3> <KP_5> <parenright>        : "㉟" U325F # CIRCLED NUMBER THIRTY FIVE
+<Multi_key> <parenleft> <KP_3> <5> <parenright>        : "㉟" U325F # CIRCLED NUMBER THIRTY FIVE
+<Multi_key> <parenleft> <KP_3> <KP_5> <parenright>     : "㉟" U325F # CIRCLED NUMBER THIRTY FIVE
+<Multi_key> <parenleft> <U1100> <parenright>   : "㉠" U3260 # CIRCLED HANGUL KIYEOK
+<Multi_key> <parenleft> <U1102> <parenright>   : "㉡" U3261 # CIRCLED HANGUL NIEUN
+<Multi_key> <parenleft> <U1103> <parenright>   : "㉢" U3262 # CIRCLED HANGUL TIKEUT
+<Multi_key> <parenleft> <U1105> <parenright>   : "㉣" U3263 # CIRCLED HANGUL RIEUL
+<Multi_key> <parenleft> <U1106> <parenright>   : "㉤" U3264 # CIRCLED HANGUL MIEUM
+<Multi_key> <parenleft> <U1107> <parenright>   : "㉥" U3265 # CIRCLED HANGUL PIEUP
+<Multi_key> <parenleft> <U1109> <parenright>   : "㉦" U3266 # CIRCLED HANGUL SIOS
+<Multi_key> <parenleft> <U110b> <parenright>   : "㉧" U3267 # CIRCLED HANGUL IEUNG
+<Multi_key> <parenleft> <U110c> <parenright>   : "㉨" U3268 # CIRCLED HANGUL CIEUC
+<Multi_key> <parenleft> <U110e> <parenright>   : "㉩" U3269 # CIRCLED HANGUL CHIEUCH
+<Multi_key> <parenleft> <U110f> <parenright>   : "㉪" U326A # CIRCLED HANGUL KHIEUKH
+<Multi_key> <parenleft> <U1110> <parenright>   : "㉫" U326B # CIRCLED HANGUL THIEUTH
+<Multi_key> <parenleft> <U1111> <parenright>   : "㉬" U326C # CIRCLED HANGUL PHIEUPH
+<Multi_key> <parenleft> <U1112> <parenright>   : "㉭" U326D # CIRCLED HANGUL HIEUH
+<Multi_key> <parenleft> <U1100> <U1161> <parenright>   : "㉮" U326E # CIRCLED HANGUL KIYEOK A
+<Multi_key> <parenleft> <U1102> <U1161> <parenright>   : "㉯" U326F # CIRCLED HANGUL NIEUN A
+<Multi_key> <parenleft> <U1103> <U1161> <parenright>   : "㉰" U3270 # CIRCLED HANGUL TIKEUT A
+<Multi_key> <parenleft> <U1105> <U1161> <parenright>   : "㉱" U3271 # CIRCLED HANGUL RIEUL A
+<Multi_key> <parenleft> <U1106> <U1161> <parenright>   : "㉲" U3272 # CIRCLED HANGUL MIEUM A
+<Multi_key> <parenleft> <U1107> <U1161> <parenright>   : "㉳" U3273 # CIRCLED HANGUL PIEUP A
+<Multi_key> <parenleft> <U1109> <U1161> <parenright>   : "㉴" U3274 # CIRCLED HANGUL SIOS A
+<Multi_key> <parenleft> <U110b> <U1161> <parenright>   : "㉵" U3275 # CIRCLED HANGUL IEUNG A
+<Multi_key> <parenleft> <U110c> <U1161> <parenright>   : "㉶" U3276 # CIRCLED HANGUL CIEUC A
+<Multi_key> <parenleft> <U110e> <U1161> <parenright>   : "㉷" U3277 # CIRCLED HANGUL CHIEUCH A
+<Multi_key> <parenleft> <U110f> <U1161> <parenright>   : "㉸" U3278 # CIRCLED HANGUL KHIEUKH A
+<Multi_key> <parenleft> <U1110> <U1161> <parenright>   : "㉹" U3279 # CIRCLED HANGUL THIEUTH A
+<Multi_key> <parenleft> <U1111> <U1161> <parenright>   : "㉺" U327A # CIRCLED HANGUL PHIEUPH A
+<Multi_key> <parenleft> <U1112> <U1161> <parenright>   : "㉻" U327B # CIRCLED HANGUL HIEUH A
+<Multi_key> <parenleft> <U4e00> <parenright>   : "㊀" U3280 # CIRCLED IDEOGRAPH ONE
+<Multi_key> <parenleft> <U4e8c> <parenright>   : "㊁" U3281 # CIRCLED IDEOGRAPH TWO
+<Multi_key> <parenleft> <U4e09> <parenright>   : "㊂" U3282 # CIRCLED IDEOGRAPH THREE
+<Multi_key> <parenleft> <U56db> <parenright>   : "㊃" U3283 # CIRCLED IDEOGRAPH FOUR
+<Multi_key> <parenleft> <U4e94> <parenright>   : "㊄" U3284 # CIRCLED IDEOGRAPH FIVE
+<Multi_key> <parenleft> <U516d> <parenright>   : "㊅" U3285 # CIRCLED IDEOGRAPH SIX
+<Multi_key> <parenleft> <U4e03> <parenright>   : "㊆" U3286 # CIRCLED IDEOGRAPH SEVEN
+<Multi_key> <parenleft> <U516b> <parenright>   : "㊇" U3287 # CIRCLED IDEOGRAPH EIGHT
+<Multi_key> <parenleft> <U4e5d> <parenright>   : "㊈" U3288 # CIRCLED IDEOGRAPH NINE
+<Multi_key> <parenleft> <U5341> <parenright>   : "㊉" U3289 # CIRCLED IDEOGRAPH TEN
+<Multi_key> <parenleft> <U6708> <parenright>   : "㊊" U328A # CIRCLED IDEOGRAPH MOON
+<Multi_key> <parenleft> <U706b> <parenright>   : "㊋" U328B # CIRCLED IDEOGRAPH FIRE
+<Multi_key> <parenleft> <U6c34> <parenright>   : "㊌" U328C # CIRCLED IDEOGRAPH WATER
+<Multi_key> <parenleft> <U6728> <parenright>   : "㊍" U328D # CIRCLED IDEOGRAPH WOOD
+<Multi_key> <parenleft> <U91d1> <parenright>   : "㊎" U328E # CIRCLED IDEOGRAPH METAL
+<Multi_key> <parenleft> <U571f> <parenright>   : "㊏" U328F # CIRCLED IDEOGRAPH EARTH
+<Multi_key> <parenleft> <U65e5> <parenright>   : "㊐" U3290 # CIRCLED IDEOGRAPH SUN
+<Multi_key> <parenleft> <U682a> <parenright>   : "㊑" U3291 # CIRCLED IDEOGRAPH STOCK
+<Multi_key> <parenleft> <U6709> <parenright>   : "㊒" U3292 # CIRCLED IDEOGRAPH HAVE
+<Multi_key> <parenleft> <U793e> <parenright>   : "㊓" U3293 # CIRCLED IDEOGRAPH SOCIETY
+<Multi_key> <parenleft> <U540d> <parenright>   : "㊔" U3294 # CIRCLED IDEOGRAPH NAME
+<Multi_key> <parenleft> <U7279> <parenright>   : "㊕" U3295 # CIRCLED IDEOGRAPH SPECIAL
+<Multi_key> <parenleft> <U8ca1> <parenright>   : "㊖" U3296 # CIRCLED IDEOGRAPH FINANCIAL
+<Multi_key> <parenleft> <U795d> <parenright>   : "㊗" U3297 # CIRCLED IDEOGRAPH CONGRATULATION
+<Multi_key> <parenleft> <U52b4> <parenright>   : "㊘" U3298 # CIRCLED IDEOGRAPH LABOR
+<Multi_key> <parenleft> <U79d8> <parenright>   : "㊙" U3299 # CIRCLED IDEOGRAPH SECRET
+<Multi_key> <parenleft> <U7537> <parenright>   : "㊚" U329A # CIRCLED IDEOGRAPH MALE
+<Multi_key> <parenleft> <U5973> <parenright>   : "㊛" U329B # CIRCLED IDEOGRAPH FEMALE
+<Multi_key> <parenleft> <U9069> <parenright>   : "㊜" U329C # CIRCLED IDEOGRAPH SUITABLE
+<Multi_key> <parenleft> <U512a> <parenright>   : "㊝" U329D # CIRCLED IDEOGRAPH EXCELLENT
+<Multi_key> <parenleft> <U5370> <parenright>   : "㊞" U329E # CIRCLED IDEOGRAPH PRINT
+<Multi_key> <parenleft> <U6ce8> <parenright>   : "㊟" U329F # CIRCLED IDEOGRAPH ATTENTION
+<Multi_key> <parenleft> <U9805> <parenright>   : "㊠" U32A0 # CIRCLED IDEOGRAPH ITEM
+<Multi_key> <parenleft> <U4f11> <parenright>   : "㊡" U32A1 # CIRCLED IDEOGRAPH REST
+<Multi_key> <parenleft> <U5199> <parenright>   : "㊢" U32A2 # CIRCLED IDEOGRAPH COPY
+<Multi_key> <parenleft> <U6b63> <parenright>   : "㊣" U32A3 # CIRCLED IDEOGRAPH CORRECT
+<Multi_key> <parenleft> <U4e0a> <parenright>   : "㊤" U32A4 # CIRCLED IDEOGRAPH HIGH
+<Multi_key> <parenleft> <U4e2d> <parenright>   : "㊥" U32A5 # CIRCLED IDEOGRAPH CENTRE
+<Multi_key> <parenleft> <U4e0b> <parenright>   : "㊦" U32A6 # CIRCLED IDEOGRAPH LOW
+<Multi_key> <parenleft> <U5de6> <parenright>   : "㊧" U32A7 # CIRCLED IDEOGRAPH LEFT
+<Multi_key> <parenleft> <U53f3> <parenright>   : "㊨" U32A8 # CIRCLED IDEOGRAPH RIGHT
+<Multi_key> <parenleft> <U533b> <parenright>   : "㊩" U32A9 # CIRCLED IDEOGRAPH MEDICINE
+<Multi_key> <parenleft> <U5b97> <parenright>   : "㊪" U32AA # CIRCLED IDEOGRAPH RELIGION
+<Multi_key> <parenleft> <U5b66> <parenright>   : "㊫" U32AB # CIRCLED IDEOGRAPH STUDY
+<Multi_key> <parenleft> <U76e3> <parenright>   : "㊬" U32AC # CIRCLED IDEOGRAPH SUPERVISE
+<Multi_key> <parenleft> <U4f01> <parenright>   : "㊭" U32AD # CIRCLED IDEOGRAPH ENTERPRISE
+<Multi_key> <parenleft> <U8cc7> <parenright>   : "㊮" U32AE # CIRCLED IDEOGRAPH RESOURCE
+<Multi_key> <parenleft> <U5354> <parenright>   : "㊯" U32AF # CIRCLED IDEOGRAPH ALLIANCE
+<Multi_key> <parenleft> <U591c> <parenright>   : "㊰" U32B0 # CIRCLED IDEOGRAPH NIGHT
+<Multi_key> <parenleft> <3> <6> <parenright>   : "㊱" U32B1 # CIRCLED NUMBER THIRTY SIX
+<Multi_key> <parenleft> <3> <KP_6> <parenright>        : "㊱" U32B1 # CIRCLED NUMBER THIRTY SIX
+<Multi_key> <parenleft> <KP_3> <6> <parenright>        : "㊱" U32B1 # CIRCLED NUMBER THIRTY SIX
+<Multi_key> <parenleft> <KP_3> <KP_6> <parenright>     : "㊱" U32B1 # CIRCLED NUMBER THIRTY SIX
+<Multi_key> <parenleft> <3> <7> <parenright>   : "㊲" U32B2 # CIRCLED NUMBER THIRTY SEVEN
+<Multi_key> <parenleft> <3> <KP_7> <parenright>        : "㊲" U32B2 # CIRCLED NUMBER THIRTY SEVEN
+<Multi_key> <parenleft> <KP_3> <7> <parenright>        : "㊲" U32B2 # CIRCLED NUMBER THIRTY SEVEN
+<Multi_key> <parenleft> <KP_3> <KP_7> <parenright>     : "㊲" U32B2 # CIRCLED NUMBER THIRTY SEVEN
+<Multi_key> <parenleft> <3> <8> <parenright>   : "㊳" U32B3 # CIRCLED NUMBER THIRTY EIGHT
+<Multi_key> <parenleft> <3> <KP_8> <parenright>        : "㊳" U32B3 # CIRCLED NUMBER THIRTY EIGHT
+<Multi_key> <parenleft> <KP_3> <8> <parenright>        : "㊳" U32B3 # CIRCLED NUMBER THIRTY EIGHT
+<Multi_key> <parenleft> <KP_3> <KP_8> <parenright>     : "㊳" U32B3 # CIRCLED NUMBER THIRTY EIGHT
+<Multi_key> <parenleft> <3> <9> <parenright>   : "㊴" U32B4 # CIRCLED NUMBER THIRTY NINE
+<Multi_key> <parenleft> <3> <KP_9> <parenright>        : "㊴" U32B4 # CIRCLED NUMBER THIRTY NINE
+<Multi_key> <parenleft> <KP_3> <9> <parenright>        : "㊴" U32B4 # CIRCLED NUMBER THIRTY NINE
+<Multi_key> <parenleft> <KP_3> <KP_9> <parenright>     : "㊴" U32B4 # CIRCLED NUMBER THIRTY NINE
+<Multi_key> <parenleft> <4> <0> <parenright>   : "㊵" U32B5 # CIRCLED NUMBER FORTY
+<Multi_key> <parenleft> <4> <KP_0> <parenright>        : "㊵" U32B5 # CIRCLED NUMBER FORTY
+<Multi_key> <parenleft> <KP_4> <0> <parenright>        : "㊵" U32B5 # CIRCLED NUMBER FORTY
+<Multi_key> <parenleft> <KP_4> <KP_0> <parenright>     : "㊵" U32B5 # CIRCLED NUMBER FORTY
+<Multi_key> <parenleft> <4> <1> <parenright>   : "㊶" U32B6 # CIRCLED NUMBER FORTY ONE
+<Multi_key> <parenleft> <4> <KP_1> <parenright>        : "㊶" U32B6 # CIRCLED NUMBER FORTY ONE
+<Multi_key> <parenleft> <KP_4> <1> <parenright>        : "㊶" U32B6 # CIRCLED NUMBER FORTY ONE
+<Multi_key> <parenleft> <KP_4> <KP_1> <parenright>     : "㊶" U32B6 # CIRCLED NUMBER FORTY ONE
+<Multi_key> <parenleft> <4> <2> <parenright>   : "㊷" U32B7 # CIRCLED NUMBER FORTY TWO
+<Multi_key> <parenleft> <4> <KP_Space> <parenright>    : "㊷" U32B7 # CIRCLED NUMBER FORTY TWO
+<Multi_key> <parenleft> <4> <KP_2> <parenright>        : "㊷" U32B7 # CIRCLED NUMBER FORTY TWO
+<Multi_key> <parenleft> <KP_4> <2> <parenright>        : "㊷" U32B7 # CIRCLED NUMBER FORTY TWO
+<Multi_key> <parenleft> <KP_4> <KP_Space> <parenright> : "㊷" U32B7 # CIRCLED NUMBER FORTY TWO
+<Multi_key> <parenleft> <KP_4> <KP_2> <parenright>     : "㊷" U32B7 # CIRCLED NUMBER FORTY TWO
+<Multi_key> <parenleft> <4> <3> <parenright>   : "㊸" U32B8 # CIRCLED NUMBER FORTY THREE
+<Multi_key> <parenleft> <4> <KP_3> <parenright>        : "㊸" U32B8 # CIRCLED NUMBER FORTY THREE
+<Multi_key> <parenleft> <KP_4> <3> <parenright>        : "㊸" U32B8 # CIRCLED NUMBER FORTY THREE
+<Multi_key> <parenleft> <KP_4> <KP_3> <parenright>     : "㊸" U32B8 # CIRCLED NUMBER FORTY THREE
+<Multi_key> <parenleft> <4> <4> <parenright>   : "㊹" U32B9 # CIRCLED NUMBER FORTY FOUR
+<Multi_key> <parenleft> <4> <KP_4> <parenright>        : "㊹" U32B9 # CIRCLED NUMBER FORTY FOUR
+<Multi_key> <parenleft> <KP_4> <4> <parenright>        : "㊹" U32B9 # CIRCLED NUMBER FORTY FOUR
+<Multi_key> <parenleft> <KP_4> <KP_4> <parenright>     : "㊹" U32B9 # CIRCLED NUMBER FORTY FOUR
+<Multi_key> <parenleft> <4> <5> <parenright>   : "㊺" U32BA # CIRCLED NUMBER FORTY FIVE
+<Multi_key> <parenleft> <4> <KP_5> <parenright>        : "㊺" U32BA # CIRCLED NUMBER FORTY FIVE
+<Multi_key> <parenleft> <KP_4> <5> <parenright>        : "㊺" U32BA # CIRCLED NUMBER FORTY FIVE
+<Multi_key> <parenleft> <KP_4> <KP_5> <parenright>     : "㊺" U32BA # CIRCLED NUMBER FORTY FIVE
+<Multi_key> <parenleft> <4> <6> <parenright>   : "㊻" U32BB # CIRCLED NUMBER FORTY SIX
+<Multi_key> <parenleft> <4> <KP_6> <parenright>        : "㊻" U32BB # CIRCLED NUMBER FORTY SIX
+<Multi_key> <parenleft> <KP_4> <6> <parenright>        : "㊻" U32BB # CIRCLED NUMBER FORTY SIX
+<Multi_key> <parenleft> <KP_4> <KP_6> <parenright>     : "㊻" U32BB # CIRCLED NUMBER FORTY SIX
+<Multi_key> <parenleft> <4> <7> <parenright>   : "㊼" U32BC # CIRCLED NUMBER FORTY SEVEN
+<Multi_key> <parenleft> <4> <KP_7> <parenright>        : "㊼" U32BC # CIRCLED NUMBER FORTY SEVEN
+<Multi_key> <parenleft> <KP_4> <7> <parenright>        : "㊼" U32BC # CIRCLED NUMBER FORTY SEVEN
+<Multi_key> <parenleft> <KP_4> <KP_7> <parenright>     : "㊼" U32BC # CIRCLED NUMBER FORTY SEVEN
+<Multi_key> <parenleft> <4> <8> <parenright>   : "㊽" U32BD # CIRCLED NUMBER FORTY EIGHT
+<Multi_key> <parenleft> <4> <KP_8> <parenright>        : "㊽" U32BD # CIRCLED NUMBER FORTY EIGHT
+<Multi_key> <parenleft> <KP_4> <8> <parenright>        : "㊽" U32BD # CIRCLED NUMBER FORTY EIGHT
+<Multi_key> <parenleft> <KP_4> <KP_8> <parenright>     : "㊽" U32BD # CIRCLED NUMBER FORTY EIGHT
+<Multi_key> <parenleft> <4> <9> <parenright>   : "㊾" U32BE # CIRCLED NUMBER FORTY NINE
+<Multi_key> <parenleft> <4> <KP_9> <parenright>        : "㊾" U32BE # CIRCLED NUMBER FORTY NINE
+<Multi_key> <parenleft> <KP_4> <9> <parenright>        : "㊾" U32BE # CIRCLED NUMBER FORTY NINE
+<Multi_key> <parenleft> <KP_4> <KP_9> <parenright>     : "㊾" U32BE # CIRCLED NUMBER FORTY NINE
+<Multi_key> <parenleft> <5> <0> <parenright>   : "㊿" U32BF # CIRCLED NUMBER FIFTY
+<Multi_key> <parenleft> <5> <KP_0> <parenright>        : "㊿" U32BF # CIRCLED NUMBER FIFTY
+<Multi_key> <parenleft> <KP_5> <0> <parenright>        : "㊿" U32BF # CIRCLED NUMBER FIFTY
+<Multi_key> <parenleft> <KP_5> <KP_0> <parenright>     : "㊿" U32BF # CIRCLED NUMBER FIFTY
+<Multi_key> <parenleft> <kana_A> <parenright>  : "㋐" U32D0 # CIRCLED KATAKANA A
+<Multi_key> <parenleft> <kana_I> <parenright>  : "㋑" U32D1 # CIRCLED KATAKANA I
+<Multi_key> <parenleft> <kana_U> <parenright>  : "㋒" U32D2 # CIRCLED KATAKANA U
+<Multi_key> <parenleft> <kana_E> <parenright>  : "㋓" U32D3 # CIRCLED KATAKANA E
+<Multi_key> <parenleft> <kana_O> <parenright>  : "㋔" U32D4 # CIRCLED KATAKANA O
+<Multi_key> <parenleft> <kana_KA> <parenright> : "㋕" U32D5 # CIRCLED KATAKANA KA
+<Multi_key> <parenleft> <kana_KI> <parenright> : "㋖" U32D6 # CIRCLED KATAKANA KI
+<Multi_key> <parenleft> <kana_KU> <parenright> : "㋗" U32D7 # CIRCLED KATAKANA KU
+<Multi_key> <parenleft> <kana_KE> <parenright> : "㋘" U32D8 # CIRCLED KATAKANA KE
+<Multi_key> <parenleft> <kana_KO> <parenright> : "㋙" U32D9 # CIRCLED KATAKANA KO
+<Multi_key> <parenleft> <kana_SA> <parenright> : "㋚" U32DA # CIRCLED KATAKANA SA
+<Multi_key> <parenleft> <kana_SHI> <parenright>        : "㋛" U32DB # CIRCLED KATAKANA SI
+<Multi_key> <parenleft> <kana_SU> <parenright> : "㋜" U32DC # CIRCLED KATAKANA SU
+<Multi_key> <parenleft> <kana_SE> <parenright> : "㋝" U32DD # CIRCLED KATAKANA SE
+<Multi_key> <parenleft> <kana_SO> <parenright> : "㋞" U32DE # CIRCLED KATAKANA SO
+<Multi_key> <parenleft> <kana_TA> <parenright> : "㋟" U32DF # CIRCLED KATAKANA TA
+<Multi_key> <parenleft> <kana_CHI> <parenright>        : "㋠" U32E0 # CIRCLED KATAKANA TI
+<Multi_key> <parenleft> <kana_TSU> <parenright>        : "㋡" U32E1 # CIRCLED KATAKANA TU
+<Multi_key> <parenleft> <kana_TE> <parenright> : "㋢" U32E2 # CIRCLED KATAKANA TE
+<Multi_key> <parenleft> <kana_TO> <parenright> : "㋣" U32E3 # CIRCLED KATAKANA TO
+<Multi_key> <parenleft> <kana_NA> <parenright> : "㋤" U32E4 # CIRCLED KATAKANA NA
+<Multi_key> <parenleft> <kana_NI> <parenright> : "㋥" U32E5 # CIRCLED KATAKANA NI
+<Multi_key> <parenleft> <kana_NU> <parenright> : "㋦" U32E6 # CIRCLED KATAKANA NU
+<Multi_key> <parenleft> <kana_NE> <parenright> : "㋧" U32E7 # CIRCLED KATAKANA NE
+<Multi_key> <parenleft> <kana_NO> <parenright> : "㋨" U32E8 # CIRCLED KATAKANA NO
+<Multi_key> <parenleft> <kana_HA> <parenright> : "㋩" U32E9 # CIRCLED KATAKANA HA
+<Multi_key> <parenleft> <kana_HI> <parenright> : "㋪" U32EA # CIRCLED KATAKANA HI
+<Multi_key> <parenleft> <kana_FU> <parenright> : "㋫" U32EB # CIRCLED KATAKANA HU
+<Multi_key> <parenleft> <kana_HE> <parenright> : "㋬" U32EC # CIRCLED KATAKANA HE
+<Multi_key> <parenleft> <kana_HO> <parenright> : "㋭" U32ED # CIRCLED KATAKANA HO
+<Multi_key> <parenleft> <kana_MA> <parenright> : "㋮" U32EE # CIRCLED KATAKANA MA
+<Multi_key> <parenleft> <kana_MI> <parenright> : "㋯" U32EF # CIRCLED KATAKANA MI
+<Multi_key> <parenleft> <kana_MU> <parenright> : "㋰" U32F0 # CIRCLED KATAKANA MU
+<Multi_key> <parenleft> <kana_ME> <parenright> : "㋱" U32F1 # CIRCLED KATAKANA ME
+<Multi_key> <parenleft> <kana_MO> <parenright> : "㋲" U32F2 # CIRCLED KATAKANA MO
+<Multi_key> <parenleft> <kana_YA> <parenright> : "㋳" U32F3 # CIRCLED KATAKANA YA
+<Multi_key> <parenleft> <kana_YU> <parenright> : "㋴" U32F4 # CIRCLED KATAKANA YU
+<Multi_key> <parenleft> <kana_YO> <parenright> : "㋵" U32F5 # CIRCLED KATAKANA YO
+<Multi_key> <parenleft> <kana_RA> <parenright> : "㋶" U32F6 # CIRCLED KATAKANA RA
+<Multi_key> <parenleft> <kana_RI> <parenright> : "㋷" U32F7 # CIRCLED KATAKANA RI
+<Multi_key> <parenleft> <kana_RU> <parenright> : "㋸" U32F8 # CIRCLED KATAKANA RU
+<Multi_key> <parenleft> <kana_RE> <parenright> : "㋹" U32F9 # CIRCLED KATAKANA RE
+<Multi_key> <parenleft> <kana_RO> <parenright> : "㋺" U32FA # CIRCLED KATAKANA RO
+<Multi_key> <parenleft> <kana_WA> <parenright> : "㋻" U32FB # CIRCLED KATAKANA WA
+<Multi_key> <parenleft> <U30f0> <parenright>   : "㋼" U32FC # CIRCLED KATAKANA WI
+<Multi_key> <parenleft> <U30f1> <parenright>   : "㋽" U32FD # CIRCLED KATAKANA WE
+<Multi_key> <parenleft> <kana_WO> <parenright> : "㋾" U32FE # CIRCLED KATAKANA WO
+<Multi_key> <U05b4> <hebrew_yod>       : "יִ" UFB1D # HEBREW LETTER YOD WITH HIRIQ
+<Multi_key> <U05b7> <U05f2>    : "ײַ" UFB1F # HEBREW LIGATURE YIDDISH YOD YOD PATAH
+<Multi_key> <U05c1> <hebrew_shin>      : "שׁ" UFB2A # HEBREW LETTER SHIN WITH SHIN DOT
+<Multi_key> <U05c2> <hebrew_shin>      : "שׂ" UFB2B # HEBREW LETTER SHIN WITH SIN DOT
+<Multi_key> <U05c1> <Ufb49>    : "שּׁ" UFB2C # HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT
+<Multi_key> <U05c1> <U05bc> <hebrew_shin>      : "שּׁ" UFB2C # HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT
+<Multi_key> <U05c2> <Ufb49>    : "שּׂ" UFB2D # HEBREW LETTER SHIN WITH DAGESH AND SIN DOT
+<Multi_key> <U05c2> <U05bc> <hebrew_shin>      : "שּׂ" UFB2D # HEBREW LETTER SHIN WITH DAGESH AND SIN DOT
+<Multi_key> <U05b7> <hebrew_aleph>     : "אַ" UFB2E # HEBREW LETTER ALEF WITH PATAH
+<Multi_key> <U05b8> <hebrew_aleph>     : "אָ" UFB2F # HEBREW LETTER ALEF WITH QAMATS
+<Multi_key> <U05bc> <hebrew_aleph>     : "אּ" UFB30 # HEBREW LETTER ALEF WITH MAPIQ
+<Multi_key> <U05bc> <hebrew_bet>       : "בּ" UFB31 # HEBREW LETTER BET WITH DAGESH
+<Multi_key> <U05bc> <hebrew_beth>      : "בּ" UFB31 # HEBREW LETTER BET WITH DAGESH
+<Multi_key> <U05bc> <hebrew_gimel>     : "גּ" UFB32 # HEBREW LETTER GIMEL WITH DAGESH
+<Multi_key> <U05bc> <hebrew_gimmel>    : "גּ" UFB32 # HEBREW LETTER GIMEL WITH DAGESH
+<Multi_key> <U05bc> <hebrew_dalet>     : "דּ" UFB33 # HEBREW LETTER DALET WITH DAGESH
+<Multi_key> <U05bc> <hebrew_daleth>    : "דּ" UFB33 # HEBREW LETTER DALET WITH DAGESH
+<Multi_key> <U05bc> <hebrew_he>        : "הּ" UFB34 # HEBREW LETTER HE WITH MAPIQ
+<Multi_key> <U05bc> <hebrew_waw>       : "וּ" UFB35 # HEBREW LETTER VAV WITH DAGESH
+<Multi_key> <U05bc> <hebrew_zain>      : "זּ" UFB36 # HEBREW LETTER ZAYIN WITH DAGESH
+<Multi_key> <U05bc> <hebrew_zayin>     : "זּ" UFB36 # HEBREW LETTER ZAYIN WITH DAGESH
+<Multi_key> <U05bc> <hebrew_tet>       : "טּ" UFB38 # HEBREW LETTER TET WITH DAGESH
+<Multi_key> <U05bc> <hebrew_teth>      : "טּ" UFB38 # HEBREW LETTER TET WITH DAGESH
+<Multi_key> <U05bc> <hebrew_yod>       : "יּ" UFB39 # HEBREW LETTER YOD WITH DAGESH
+<Multi_key> <U05bc> <hebrew_finalkaph> : "ךּ" UFB3A # HEBREW LETTER FINAL KAF WITH DAGESH
+<Multi_key> <U05bc> <hebrew_kaph>      : "כּ" UFB3B # HEBREW LETTER KAF WITH DAGESH
+<Multi_key> <U05bc> <hebrew_lamed>     : "לּ" UFB3C # HEBREW LETTER LAMED WITH DAGESH
+<Multi_key> <U05bc> <hebrew_mem>       : "מּ" UFB3E # HEBREW LETTER MEM WITH DAGESH
+<Multi_key> <U05bc> <hebrew_nun>       : "נּ" UFB40 # HEBREW LETTER NUN WITH DAGESH
+<Multi_key> <U05bc> <hebrew_samech>    : "סּ" UFB41 # HEBREW LETTER SAMEKH WITH DAGESH
+<Multi_key> <U05bc> <hebrew_samekh>    : "סּ" UFB41 # HEBREW LETTER SAMEKH WITH DAGESH
+<Multi_key> <U05bc> <hebrew_finalpe>   : "ףּ" UFB43 # HEBREW LETTER FINAL PE WITH DAGESH
+<Multi_key> <U05bc> <hebrew_pe>        : "פּ" UFB44 # HEBREW LETTER PE WITH DAGESH
+<Multi_key> <U05bc> <hebrew_zade>      : "צּ" UFB46 # HEBREW LETTER TSADI WITH DAGESH
+<Multi_key> <U05bc> <hebrew_zadi>      : "צּ" UFB46 # HEBREW LETTER TSADI WITH DAGESH
+<Multi_key> <U05bc> <hebrew_kuf>       : "קּ" UFB47 # HEBREW LETTER QOF WITH DAGESH
+<Multi_key> <U05bc> <hebrew_qoph>      : "קּ" UFB47 # HEBREW LETTER QOF WITH DAGESH
+<Multi_key> <U05bc> <hebrew_resh>      : "רּ" UFB48 # HEBREW LETTER RESH WITH DAGESH
+<Multi_key> <U05bc> <hebrew_shin>      : "שּ" UFB49 # HEBREW LETTER SHIN WITH DAGESH
+<Multi_key> <U05bc> <hebrew_taf>       : "תּ" UFB4A # HEBREW LETTER TAV WITH DAGESH
+<Multi_key> <U05bc> <hebrew_taw>       : "תּ" UFB4A # HEBREW LETTER TAV WITH DAGESH
+<Multi_key> <U05b9> <hebrew_waw>       : "וֹ" UFB4B # HEBREW LETTER VAV WITH HOLAM
+<Multi_key> <U05bf> <hebrew_bet>       : "בֿ" UFB4C # HEBREW LETTER BET WITH RAFE
+<Multi_key> <U05bf> <hebrew_beth>      : "בֿ" UFB4C # HEBREW LETTER BET WITH RAFE
+<Multi_key> <U05bf> <hebrew_kaph>      : "כֿ" UFB4D # HEBREW LETTER KAF WITH RAFE
+<Multi_key> <U05bf> <hebrew_pe>        : "פֿ" UFB4E # HEBREW LETTER PE WITH RAFE
+<Multi_key> <U1d157> <U1d165>  : "𝅗𝅥" U1D15E # MUSICAL SYMBOL HALF NOTE
+<Multi_key> <U1d158> <U1d165>  : "𝅘𝅥" U1D15F # MUSICAL SYMBOL QUARTER NOTE
+<Multi_key> <U1d15f> <U1d16e>  : "𝅘𝅥𝅮" U1D160 # MUSICAL SYMBOL EIGHTH NOTE
+XCOMM <Multi_key> <U1d158> <U1d165> <U1d16e>   : "𝅘𝅥𝅮" U1D160 # MUSICAL SYMBOL EIGHTH NOTE
+<Multi_key> <U1d15f> <U1d16f>  : "𝅘𝅥𝅯" U1D161 # MUSICAL SYMBOL SIXTEENTH NOTE
+XCOMM <Multi_key> <U1d158> <U1d165> <U1d16f>   : "𝅘𝅥𝅯" U1D161 # MUSICAL SYMBOL SIXTEENTH NOTE
+<Multi_key> <U1d15f> <U1d170>  : "𝅘𝅥𝅰" U1D162 # MUSICAL SYMBOL THIRTY-SECOND NOTE
+XCOMM <Multi_key> <U1d158> <U1d165> <U1d170>   : "𝅘𝅥𝅰" U1D162 # MUSICAL SYMBOL THIRTY-SECOND NOTE
+<Multi_key> <U1d15f> <U1d171>  : "𝅘𝅥𝅱" U1D163 # MUSICAL SYMBOL SIXTY-FOURTH NOTE
+XCOMM <Multi_key> <U1d158> <U1d165> <U1d171>   : "𝅘𝅥𝅱" U1D163 # MUSICAL SYMBOL SIXTY-FOURTH NOTE
+<Multi_key> <U1d15f> <U1d172>  : "𝅘𝅥𝅲" U1D164 # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE
+XCOMM <Multi_key> <U1d158> <U1d165> <U1d172>   : "𝅘𝅥𝅲" U1D164 # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE
+<Multi_key> <U1d1b9> <U1d165>  : "𝆹𝅥" U1D1BB # MUSICAL SYMBOL MINIMA
+<Multi_key> <U1d1ba> <U1d165>  : "𝆺𝅥" U1D1BC # MUSICAL SYMBOL MINIMA BLACK
+<Multi_key> <U1d1bb> <U1d16e>  : "𝆹𝅥𝅮" U1D1BD # MUSICAL SYMBOL SEMIMINIMA WHITE
+XCOMM <Multi_key> <U1d1b9> <U1d165> <U1d16e>   : "𝆹𝅥𝅮" U1D1BD # MUSICAL SYMBOL SEMIMINIMA WHITE
+<Multi_key> <U1d1bc> <U1d16e>  : "𝆺𝅥𝅮" U1D1BE # MUSICAL SYMBOL SEMIMINIMA BLACK
+XCOMM <Multi_key> <U1d1ba> <U1d165> <U1d16e>   : "𝆺𝅥𝅮" U1D1BE # MUSICAL SYMBOL SEMIMINIMA BLACK
+<Multi_key> <U1d1bb> <U1d16f>  : "𝆹𝅥𝅯" U1D1BF # MUSICAL SYMBOL FUSA WHITE
+XCOMM <Multi_key> <U1d1b9> <U1d165> <U1d16f>   : "𝆹𝅥𝅯" U1D1BF # MUSICAL SYMBOL FUSA WHITE
+<Multi_key> <U1d1bc> <U1d16f>  : "𝆺𝅥𝅯" U1D1C0 # MUSICAL SYMBOL FUSA BLACK
+XCOMM <Multi_key> <U1d1ba> <U1d165> <U1d16f>   : "𝆺𝅥𝅯" U1D1C0 # MUSICAL SYMBOL FUSA BLACK
+
+XCOMM
+XCOMM Khmer digraphs
+XCOMM
+
+<U17ff> :   "ាំ"
+<U17fe> :   "ោះ"
+<U17fd> :   "េះ"
+<U17fc> :   "ុំ"
+<U17fb> :   "ុះ"
+
+XCOMM
+XCOMM Arabic Lam-Alef ligatures
+XCOMM
+
+<UFEFB>        :   "لا" # ARABIC LIGATURE LAM WITH ALEF
+<UFEF7>        :   "لأ" # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE
+<UFEF9>        :   "لإ" # ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW
+<UFEF5>        :   "لآ" # ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE
diff --git a/nls/pt_BR.UTF-8/XI18N_OBJS b/nls/pt_BR.UTF-8/XI18N_OBJS
new file mode 100644 (file)
index 0000000..8eac6d8
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for pt_BR.UTF-8 locale
+#
+XLC    common/xlcUTF8Load      _XlcUtf8Loader  # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/pt_BR.UTF-8/XLC_LOCALE.pre b/nls/pt_BR.UTF-8/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..e53dd50
--- /dev/null
@@ -0,0 +1,142 @@
+XCOMM  XLocale Database Sample for pt_BR.UTF-8
+XCOMM
+XCOMM  Based on XLocale Database Sample for en_US.UTF-8
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+
+on_demand_loading      True
+
+object_name            generic
+
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name    ISO8859-1:GL
+       }
+       font    {
+               primary         ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class (ISO8859 families)
+fs1    {
+       charset {
+               name    ISO8859-1:GR
+       }
+       font    {
+               primary ISO8859-1:GR
+       }
+}
+XCOMM  fs2 class (Kanji)
+fs2    {
+       charset {
+               name    JISX0208.1983-0:GL
+       }
+       font    {
+               primary JISX0208.1983-0:GL
+       }
+}
+XCOMM   fs3 class (Korean Character)
+fs3    {
+       charset {
+               name    KSC5601.1987-0:GL
+       }
+       font    {
+               primary KSC5601.1987-0:GL
+       }
+}
+XCOMM   fs4 class (Chinese Han Character)
+fs4    {
+       charset {
+               name    GB2312.1980-0:GL
+       }
+       font    {
+               primary GB2312.1980-0:GL
+       }
+}
+XCOMM  fs5 class (Half Kana)
+fs5    {
+       charset {
+               name    JISX0201.1976-0:GR
+       }
+       font    {
+               primary         JISX0201.1976-0:GR
+               vertical_rotate all
+       }
+}
+XCOMM ISO10646 is last, per Roland Mainz in
+XCOMM http://bugs.freedesktop.org/show_bug.cgi?id=1896
+fs6    {
+       charset {
+               name    ISO10646-1
+       }
+       font    {
+               primary ISO10646-1
+       }
+}
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          UTF-8
+mb_cur_max             6
+state_depend_encoding  False
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       ct_encoding     ISO8859-1:GL
+}
+
+XCOMM  cs1 class
+cs1     {
+        side            GR:Default
+        length          1
+        ct_encoding     ISO8859-1:GR
+}
+XCOMM  cs2 class
+cs2    {
+       side            GR
+       length          2
+       ct_encoding     JISX0208.1983-0:GL; JISX0208.1983-0:GR;\
+                       JISX0208.1983-1:GL; JISX0208.1983-1:GR
+}
+
+XCOMM  cs3 class
+cs3     {
+        side            GL
+        length          2
+        ct_encoding     KSC5601.1987-0:GL; KSC5601.1987-0:GR;\
+                        KSC5601.1987-1:GL; KSC5601.1987-1:GR
+}
+XCOMM  cs4 class
+cs4     {
+        side            GR
+        length          2
+        ct_encoding     GB2312.1980-0:GL; GB2312.1980-0:GR
+}
+XCOMM  cs5 class
+cs5    {
+       side            GR
+       length          1
+       ct_encoding     JISX0201.1976-0:GR
+}
+
+XCOMM  cs6 class
+cs6    {
+       side            none
+       ct_encoding     ISO10646-1
+}
+
+END XLC_XLOCALE
diff --git a/nls/ru_RU.UTF-8/Compose.pre b/nls/ru_RU.UTF-8/Compose.pre
new file mode 100644 (file)
index 0000000..6c2c411
--- /dev/null
@@ -0,0 +1 @@
+include "X11_LOCALEDATADIR/en_US.UTF-8/Compose"
diff --git a/nls/ru_RU.UTF-8/XI18N_OBJS b/nls/ru_RU.UTF-8/XI18N_OBJS
new file mode 100644 (file)
index 0000000..842fc27
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for ru_RU.UTF-8 locale
+#
+XLC    common/xlcUTF8Load      _XlcUtf8Loader  # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/ru_RU.UTF-8/XLC_LOCALE.pre b/nls/ru_RU.UTF-8/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..d2f397e
--- /dev/null
@@ -0,0 +1,169 @@
+XCOMM
+XCOMM  XLocale Database Sample for ru_RU.UTF-8
+XCOMM  Derived from en_US.UTF-8
+XCOMM
+
+XCOMM
+XCOMM  XLC_FONTSET category
+XCOMM
+XLC_FONTSET
+
+on_demand_loading      True
+
+object_name            generic
+
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name    ISO8859-1:GL
+       }
+       font    {
+               primary ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class (ISO8859 families)
+fs1    {
+       charset {
+               name    ISO8859-1:GR
+       }
+       font    {
+               primary ISO8859-1:GR
+       }
+}
+XCOMM  fs2 class (KOI8-R)
+fs2    {
+       charset {
+               name    KOI8-R:GR
+       }
+       font    {
+               primary KOI8-R:GR
+       }
+}
+XCOMM  fs3 class (MICROSOFT-CP1251)
+fs3    {
+       charset {
+               name    MICROSOFT-CP1251:GR
+       }
+       font    {
+               primary MICROSOFT-CP1251:GR
+       }
+}
+XCOMM  fs4 class (ISO8859-5)
+fs4    {
+       charset {
+               name    ISO8859-5:GR
+       }
+       font    {
+               primary ISO8859-5:GR
+       }
+}
+XCOMM  fs5 class (Kanji)
+fs5    {
+       charset {
+               name    JISX0208.1983-0:GL
+       }
+       font    {
+               primary JISX0208.1983-0:GL
+       }
+}
+XCOMM  fs6 class (Korean Character)
+fs6    {
+       charset {
+               name    KSC5601.1987-0:GL
+       }
+       font    {
+               primary KSC5601.1987-0:GL
+       }
+}
+XCOMM  fs7 class (Chinese Han Character)
+fs7    {
+       charset {
+               name    GB2312.1980-0:GL
+       }
+       font    {
+               primary GB2312.1980-0:GL
+       }
+}
+XCOMM  fs8 class (Half Kana)
+fs8    {
+       charset {
+               name    JISX0201.1976-0:GR
+       }
+       font    {
+               primary         JISX0201.1976-0:GR
+               vertical_rotate all
+       }
+}
+XCOMM  ISO10646 should come last so the fonts above will actually be used
+XCOMM  fs9 class
+fs9    {
+       charset {
+               name    ISO10646-1
+       }
+       font    {
+               primary ISO10646-1
+       }
+}
+END XLC_FONTSET
+
+XCOMM
+XCOMM  XLC_XLOCALE category
+XCOMM
+XLC_XLOCALE
+
+encoding_name          UTF-8
+mb_cur_max             6
+state_depend_encoding  False
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       ct_encoding     ISO8859-1:GL
+}
+
+XCOMM  cs1 class
+cs1     {
+        side            GR:Default
+        length          1
+        ct_encoding     ISO8859-1:GR
+}
+
+XCOMM  cs2 class
+cs2    {
+       side            GR
+       length          2
+       ct_encoding     JISX0208.1983-0:GL; JISX0208.1983-0:GR;                 JISX0208.1983-1:GL; JISX0208.1983-1:GR
+
+}
+
+XCOMM  cs3 class
+cs3     {
+        side            GL
+        length          2
+        ct_encoding     KSC5601.1987-0:GL; KSC5601.1987-0:GR;                        KSC5601.1987-1:GL; KSC5601.1987-1:GR
+
+}
+
+XCOMM  cs4 class
+cs4     {
+        side            GR
+        length          2
+        ct_encoding     GB2312.1980-0:GL; GB2312.1980-0:GR
+}
+
+XCOMM  cs5 class
+cs5    {
+       side            GR
+       length          1
+       ct_encoding     JISX0201.1976-0:GR
+}
+
+XCOMM  cs6 class
+cs6    {
+       side            none
+       ct_encoding     ISO10646-1
+}
+
+END XLC_XLOCALE
diff --git a/nls/tatar-cyr/Compose.pre b/nls/tatar-cyr/Compose.pre
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/nls/tatar-cyr/XI18N_OBJS b/nls/tatar-cyr/XI18N_OBJS
new file mode 100644 (file)
index 0000000..074f2a1
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for tatar-cyr locale
+#
+XLC    common/xlcDef   _XlcDefaultLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/tatar-cyr/XLC_LOCALE.pre b/nls/tatar-cyr/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..aaa9505
--- /dev/null
@@ -0,0 +1,85 @@
+XCOMM  XLocale Database Sample for tatar-cyr.
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class 
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         TATAR-CYR:GL
+               substitute      ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset {
+               name            TATAR-CYR:GR
+       }
+       font    {
+               primary         TATAR-CYR:GR
+       }
+}
+END XLC_FONTSET
+
+XCOMM
+XCOMM  XLC_CHARSET_DEFINE category
+XCOMM
+XLC_CHARSET_DEFINE
+csd0   {
+       charset_name    TATAR-CYR
+       side            GR
+       length          1
+       string_encoding False
+       sequence        \x1b%/1
+}
+END XLC_CHARSET_DEFINE
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          TATAR-CYR
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+force_convert_to_mb    True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     TATAR-CYR:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     TATAR-CYR:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/th_TH.UTF-8/Compose.pre b/nls/th_TH.UTF-8/Compose.pre
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/nls/th_TH.UTF-8/XI18N_OBJS b/nls/th_TH.UTF-8/XI18N_OBJS
new file mode 100644 (file)
index 0000000..dec38b0
--- /dev/null
@@ -0,0 +1,8 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for th_TH.UTF-8 locale
+#
+#
+XLC    common/xlcUTF8Load      _XlcUtf8Loader  # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/th_TH.UTF-8/XLC_LOCALE.pre b/nls/th_TH.UTF-8/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..f79091a
--- /dev/null
@@ -0,0 +1,79 @@
+XCOMM XLocale Database Sample for th_TH
+XCOMM
+XCOMM
+XCOMM Modified from origial th_TH.TACTIS
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class
+fs0    {
+       charset {
+               name    ISO10646-1
+       }
+       font    {
+               primary ISO10646-1
+       }
+}
+XCOMM  We leave the legacy encodings in for the moment, because we don't
+XCOMM  have that many ISO10646 fonts yet.
+XCOMM  fs0 class (7 bit ASCII)
+fs1    {
+       charset         ISO8859-1:GL
+       font            ISO8859-1:GL
+}
+XCOMM  fs1 class (Thai) 
+fs2    {
+       charset         ISO8859-11:GR
+       font            ISO8859-11:GR
+}
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name           UTF-8
+mb_cur_max             3
+state_depend_encoding  False
+
+
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+
+
+
+
+
+
+use_stdc_env            True
+force_convert_to_mb     True
+
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+
+       wc_encoding     \x30000000
+       ct_encoding     ISO8859-11:GR
+}
+
+XCOMM  cs2 class
+cs2    {
+       side            none
+       ct_encoding     ISO10646-1
+}
+
+END XLC_XLOCALE
diff --git a/nls/th_TH/Compose.pre b/nls/th_TH/Compose.pre
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/nls/th_TH/XI18N_OBJS b/nls/th_TH/XI18N_OBJS
new file mode 100644 (file)
index 0000000..d677a00
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for th_TH locale
+#
+XLC    common/xlcDef   _XlcDefaultLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/th_TH/XLC_LOCALE.pre b/nls/th_TH/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..8530f0b
--- /dev/null
@@ -0,0 +1,65 @@
+XCOMM XLocale Database Sample for th_TH
+XCOMM
+XCOMM
+XCOMM Modified from origial th_TH.TACTIS
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset         ISO8859-1:GL
+       font            ISO8859-1:GL
+}
+XCOMM  fs1 class (Thai) 
+fs1    {
+       charset         ISO8859-11:GR
+       font            ISO8859-11:GR
+}
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name           TIS620
+mb_cur_max             1
+state_depend_encoding  False
+
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env            True
+force_convert_to_mb     True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     ISO8859-11:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/tscii-0/Compose.pre b/nls/tscii-0/Compose.pre
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/nls/tscii-0/XI18N_OBJS b/nls/tscii-0/XI18N_OBJS
new file mode 100644 (file)
index 0000000..237a337
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for tscii-0 locale
+#
+XLC    common/xlcDef   _XlcDefaultLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/tscii-0/XLC_LOCALE.pre b/nls/tscii-0/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..617bfdf
--- /dev/null
@@ -0,0 +1,79 @@
+XCOMM  XLocale Database Sample for mulelao-1.
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         TSCII-0:GL
+               substitute      ISO8859-1:GL
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset         TSCII-0:GR
+       font            TSCII-0:GR
+}
+END XLC_FONTSET
+
+XCOMM
+XCOMM  XLC_CHARSET_DEFINE category
+XCOMM
+XLC_CHARSET_DEFINE
+csd0   {
+       charset_name    TSCII-0
+       side            GR
+       length          1
+       string_encoding False
+       sequence        \x1b%/1
+}
+END XLC_CHARSET_DEFINE
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name           TSCII-0
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     TSCII-0:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     TSCII-0:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/vi_VN.tcvn/Compose.pre b/nls/vi_VN.tcvn/Compose.pre
new file mode 100644 (file)
index 0000000..0f2279d
--- /dev/null
@@ -0,0 +1,135 @@
+XCOMM 1998/12/18 Le Hong Boi $
+XCOMM
+XCOMM TCVN 5712-2 Compose Sequences
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM dead key accent keysyms
+XCOMM Special Character
+<dead_grave> <space>                   : "`"   grave
+<dead_hook> <space>                    : " "   space
+<dead_tilde> <space>                   : "~"   asciitilde
+<dead_acute> <space>                   : "'"   apostrophe
+<dead_acute> <apostrophe>              : "\264"        acute
+XCOMM Accented Alphabet
+<dead_grave> <A>                       : "\200"        Agrave
+<dead_grave> <a>                       : "\265"        agrave
+<dead_hook> <A>                                : "\266"        Ahook
+<dead_hook> <a>                                : "\266"        ahook
+<dead_tilde> <A>                       : "\202"        Atilde
+<dead_tilde> <a>                       : "\267"        atilde
+<dead_acute> <A>                       : "\203"        Aacute
+<dead_acute> <a>                       : "\270"        aacute
+<dead_belowdot> <A>                    : "\271"        Abelowdot
+<dead_belowdot> <a>                    : "\271"        abelowdot
+<dead_grave> <Abreve>                  : "\273"        Abrevegrave
+<dead_grave> <abreve>                  : "\273"        abrevegrave
+<dead_hook> <Abreve>                   : "\274"        Abrevehook
+<dead_hook> <abreve>                   : "\274"        abrevehook
+<dead_tilde> <Abreve>                  : "\275"        Abrevetilde
+<dead_tilde> <abreve>                  : "\275"        abrevetilde
+<dead_acute> <Abreve>                  : "\276"        Abreveacute
+<dead_acute> <abreve>                  : "\276"        abreveacute
+<dead_belowdot> <Abreve>               : "\306"        Abrevebelowdot
+<dead_belowdot> <abreve>               : "\306"        abrevebelowdot
+<dead_grave> <Acircumflex>             : "\307"        Acircumflexgrave
+<dead_grave> <acircumflex>             : "\307"        acircumflexgrave
+<dead_hook> <Acircumflex>              : "\310"        Acircumflexhook
+<dead_hook> <acircumflex>              : "\310"        acircumflexhook
+<dead_tilde> <Acircumflex>             : "\311"        Acircumflextilde
+<dead_tilde> <acircumflex>             : "\311"        acircumflextilde
+<dead_acute> <Acircumflex>             : "\312"        Acircumflexacute
+<dead_acute> <acircumflex>             : "\312"        acircumflexacute
+<dead_belowdot> <Acircumflex>          : "\313"        Acircumflexbelowdot
+<dead_belowdot> <acircumflex>          : "\313"        acircumflexbelowdot
+<dead_grave> <E>                       : "\207"        Egrave
+<dead_grave> <e>                       : "\314"        egrave
+<dead_hook> <E>                                : "\316"        Ehook
+<dead_hook> <e>                                : "\316"        ehook
+<dead_tilde> <E>                       : "\317"        Etilde
+<dead_tilde> <e>                       : "\317"        etilde
+<dead_acute> <E>                       : "\212"        Eacute
+<dead_acute> <e>                       : "\320"        eacute
+<dead_belowdot> <E>                    : "\321"        Ebelowdot
+<dead_belowdot> <e>                    : "\321"        ebelowdot
+<dead_grave> <Ecircumflex>             : "\322"        Ecircumflexgrave
+<dead_grave> <ecircumflex>             : "\322"        ecircumflexgrave
+<dead_hook> <Ecircumflex>              : "\323"        Ecircumflexhook
+<dead_hook> <ecircumflex>              : "\323"        ecircumflexhook
+<dead_tilde> <Ecircumflex>             : "\324"        Ecircumflextilde
+<dead_tilde> <ecircumflex>             : "\324"        ecircumflextilde
+<dead_acute> <Ecircumflex>             : "\325"        Ecircumflexacute
+<dead_acute> <ecircumflex>             : "\325"        ecircumflexacute
+<dead_belowdot> <Ecircumflex>          : "\326"        Ecircumflexbelowdot
+<dead_belowdot> <ecircumflex>          : "\326"        ecircumflexbelowdot
+<dead_grave> <I>                       : "\215"        Igrave
+<dead_grave> <i>                       : "\327"        igrave
+<dead_hook> <I>                                : "\330"        Ihook
+<dead_hook> <i>                                : "\330"        ihook
+<dead_tilde> <I>                       : "\217"        Itilde
+<dead_tilde> <i>                       : "\334"        itilde
+<dead_acute> <I>                       : "\220"        Iacute
+<dead_acute> <i>                       : "\335"        iacute
+<dead_belowdot> <I>                    : "\336"        Ibelowdot
+<dead_belowdot> <i>                    : "\336"        ibelowdot
+<dead_grave> <O>                       : "\222"        Ograve
+<dead_grave> <o>                       : "\337"        ograve
+<dead_hook> <O>                                : "\341"        Ohook
+<dead_hook> <o>                                : "\341"        ohook
+<dead_tilde> <O>                       : "\224"        Otilde
+<dead_tilde> <o>                       : "\342"        otilde
+<dead_acute> <O>                       : "\225"        Oacute
+<dead_acute> <o>                       : "\343"        oacute
+<dead_belowdot> <O>                    : "\344"        Obelowdot
+<dead_belowdot> <o>                    : "\344"        obelowdot
+<dead_grave> <Ocircumflex>             : "\345"        Ocircumflexgrave
+<dead_grave> <ocircumflex>             : "\345"        ocircumflexgrave
+<dead_hook> <Ocircumflex>              : "\346"        Ocircumflexhook
+<dead_hook> <ocircumflex>              : "\346"        ocircumflexhook
+<dead_tilde> <Ocircumflex>             : "\347"        Ocircumflextilde
+<dead_tilde> <ocircumflex>             : "\347"        ocircumflextilde
+<dead_acute> <Ocircumflex>             : "\350"        Ocircumflexacute
+<dead_acute> <ocircumflex>             : "\350"        ocircumflexacute
+<dead_belowdot> <Ocircumflex>          : "\351"        Ocircumflexbelowdot
+<dead_belowdot> <ocircumflex>          : "\351"        ocircumflexbelowdot
+<dead_grave> <Ohorn>                   : "\352"        Ohorngrave
+<dead_grave> <ohorn>                   : "\352"        ohorngrave
+<dead_hook> <Ohorn>                    : "\353"        Ohornhook
+<dead_hook> <ohorn>                    : "\353"        ohornhook
+<dead_tilde> <Ohorn>                   : "\354"        Ohorntilde
+<dead_tilde> <ohorn>                   : "\354"        ohorntilde
+<dead_acute> <Ohorn>                   : "\355"        Ohornacute
+<dead_acute> <ohorn>                   : "\355"        ohornacute
+<dead_belowdot> <Ohorn>                        : "\356"        Ohornbelowdot
+<dead_belowdot> <ohorn>                        : "\356"        ohornbelowdot
+<dead_grave> <U>                       : "\235"        Ugrave
+<dead_grave> <u>                       : "\357"        ugrave
+<dead_hook> <U>                                : "\361"        Uhook
+<dead_hook> <u>                                : "\361"        uhook
+<dead_tilde> <U>                       : "\237"        Utilde
+<dead_tilde> <u>                       : "\362"        utilde
+<dead_acute> <U>                       : "\001"        Uacute
+<dead_acute> <u>                       : "\363"        uacute
+<dead_belowdot> <U>                    : "\364"        Ubelowdot
+<dead_belowdot> <u>                    : "\364"        ubelowdot
+<dead_grave> <Uhorn>                   : "\365"        Uhorngrave
+<dead_grave> <uhorn>                   : "\365"        uhorngrave
+<dead_hook> <Uhorn>                    : "\366"        Uhornhook
+<dead_hook> <uhorn>                    : "\366"        uhornhook
+<dead_tilde> <Uhorn>                   : "\367"        Uhorntilde
+<dead_tilde> <uhorn>                   : "\367"        uhorntilde
+<dead_acute> <Uhorn>                   : "\370"        Uhornacute
+<dead_acute> <uhorn>                   : "\370"        uhornacute
+<dead_belowdot> <Uhorn>                        : "\371"        Uhornbelowdot
+<dead_belowdot> <uhorn>                        : "\371"        uhornbelowdot
+<dead_grave> <Y>                       : "\023"        Ygrave
+<dead_grave> <y>                       : "\372"        ygrave
+<dead_hook> <Y>                                : "\373"        Yhook
+<dead_hook> <y>                                : "\373"        yhook
+<dead_tilde> <Y>                       : "\374"        Ytilde
+<dead_tilde> <y>                       : "\374"        ytilde
+<dead_acute> <Y>                       : "\026"        Yacute
+<dead_acute> <y>                       : "\375"        yacute
+<dead_belowdot> <Y>                    : "\376"        Ybelowdot
+<dead_belowdot> <y>                    : "\376"        ybelowdot
+XCOMM End of Sequence Definition
diff --git a/nls/vi_VN.tcvn/XI18N_OBJS b/nls/vi_VN.tcvn/XI18N_OBJS
new file mode 100644 (file)
index 0000000..cff66df
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for vi_VN.tcvn locale
+#
+XLC    common/xlcDef   _XlcDefaultLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/vi_VN.tcvn/XLC_LOCALE.pre b/nls/vi_VN.tcvn/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..d2897d6
--- /dev/null
@@ -0,0 +1,79 @@
+XCOMM  XLocale Database Sample for vi_VN.TCVN
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         TCVN-5712:GL
+               substitute      ISO8859-1:GL
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset         TCVN-5712:GR
+       font            TCVN-5712:GR
+}
+END XLC_FONTSET
+
+XCOMM
+XCOMM  XLC_CHARSET_DEFINE category
+XCOMM
+XLC_CHARSET_DEFINE
+csd0   {
+       charset_name    TCVN-5712
+       side            GR
+       length          1
+       string_encoding False
+       sequence        \x1b%/1
+}
+END XLC_CHARSET_DEFINE
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name           TCVN-5712
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     TCVN-5712:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     TCVN-5712:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/vi_VN.viscii/Compose.pre b/nls/vi_VN.viscii/Compose.pre
new file mode 100644 (file)
index 0000000..59cdb83
--- /dev/null
@@ -0,0 +1,135 @@
+XCOMM 1998/12/18 Le Hong Boi $
+XCOMM
+XCOMM TCVN 5712-2 Compose Sequences
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM dead key accent keysyms
+XCOMM Special Character
+<dead_grave> <space>                   : "`"   grave
+<dead_hook> <space>                    : " "   space
+<dead_tilde> <space>                   : "~"   asciitilde
+<dead_acute> <space>                   : "'"   apostrophe
+<dead_acute> <apostrophe>              : "\264"        acute
+XCOMM Accented Alphabet
+<dead_grave> <A>                       : "\300"        Agrave
+<dead_grave> <a>                       : "\340"        agrave
+<dead_hook> <A>                                : "\304"        Ahook
+<dead_hook> <a>                                : "\344"        ahook
+<dead_tilde> <A>                       : "\303"        Atilde
+<dead_tilde> <a>                       : "\343"        atilde
+<dead_acute> <A>                       : "\301"        Aacute
+<dead_acute> <a>                       : "\341"        aacute
+<dead_belowdot> <A>                    : "\200"        Abelowdot
+<dead_belowdot> <a>                    : "\325"        abelowdot
+<dead_grave> <Abreve>                  : "\202"        Abrevegrave
+<dead_grave> <abreve>                  : "\242"        abrevegrave
+<dead_hook> <Abreve>                   : "\002"        Abrevehook
+<dead_hook> <abreve>                   : "\306"        abrevehook
+<dead_tilde> <Abreve>                  : "\005"        Abrevetilde
+<dead_tilde> <abreve>                  : "\307"        abrevetilde
+<dead_acute> <Abreve>                  : "\201"        Abreveacute
+<dead_acute> <abreve>                  : "\241"        abreveacute
+<dead_belowdot> <Abreve>               : "\203"        Abrevebelowdot
+<dead_belowdot> <abreve>               : "\243"        abrevebelowdot
+<dead_grave> <Acircumflex>             : "\205"        Acircumflexgrave
+<dead_grave> <acircumflex>             : "\245"        acircumflexgrave
+<dead_hook> <Acircumflex>              : "\206"        Acircumflexhook
+<dead_hook> <acircumflex>              : "\246"        acircumflexhook
+<dead_tilde> <Acircumflex>             : "\006"        Acircumflextilde
+<dead_tilde> <acircumflex>             : "\347"        acircumflextilde
+<dead_acute> <Acircumflex>             : "\204"        Acircumflexacute
+<dead_acute> <acircumflex>             : "\244"        acircumflexacute
+<dead_belowdot> <Acircumflex>          : "\207"        Acircumflexbelowdot
+<dead_belowdot> <acircumflex>          : "\247"        acircumflexbelowdot
+<dead_grave> <E>                       : "\310"        Egrave
+<dead_grave> <e>                       : "\350"        egrave
+<dead_hook> <E>                                : "\313"        Ehook
+<dead_hook> <e>                                : "\353"        ehook
+<dead_tilde> <E>                       : "\210"        Etilde
+<dead_tilde> <e>                       : "\250"        etilde
+<dead_acute> <E>                       : "\311"        Eacute
+<dead_acute> <e>                       : "\351"        eacute
+<dead_belowdot> <E>                    : "\211"        Ebelowdot
+<dead_belowdot> <e>                    : "\251"        ebelowdot
+<dead_grave> <Ecircumflex>             : "\213"        Ecircumflexgrave
+<dead_grave> <ecircumflex>             : "\253"        ecircumflexgrave
+<dead_hook> <Ecircumflex>              : "\214"        Ecircumflexhook
+<dead_hook> <ecircumflex>              : "\254"        ecircumflexhook
+<dead_tilde> <Ecircumflex>             : "\215"        Ecircumflextilde
+<dead_tilde> <ecircumflex>             : "\255"        ecircumflextilde
+<dead_acute> <Ecircumflex>             : "\212"        Ecircumflexacute
+<dead_acute> <ecircumflex>             : "\252"        ecircumflexacute
+<dead_belowdot> <Ecircumflex>          : "\216"        Ecircumflexbelowdot
+<dead_belowdot> <ecircumflex>          : "\256"        ecircumflexbelowdot
+<dead_grave> <I>                       : "\314"        Igrave
+<dead_grave> <i>                       : "\354"        igrave
+<dead_hook> <I>                                : "\233"        Ihook
+<dead_hook> <i>                                : "\357"        ihook
+<dead_tilde> <I>                       : "\316"        Itilde
+<dead_tilde> <i>                       : "\356"        itilde
+<dead_acute> <I>                       : "\315"        Iacute
+<dead_acute> <i>                       : "\355"        iacute
+<dead_belowdot> <I>                    : "\230"        Ibelowdot
+<dead_belowdot> <i>                    : "\270"        ibelowdot
+<dead_grave> <O>                       : "\322"        Ograve
+<dead_grave> <o>                       : "\362"        ograve
+<dead_hook> <O>                                : "\231"        Ohook
+<dead_hook> <o>                                : "\366"        ohook
+<dead_tilde> <O>                       : "\240"        Otilde
+<dead_tilde> <o>                       : "\365"        otilde
+<dead_acute> <O>                       : "\323"        Oacute
+<dead_acute> <o>                       : "\363"        oacute
+<dead_belowdot> <O>                    : "\232"        Obelowdot
+<dead_belowdot> <o>                    : "\367"        obelowdot
+<dead_grave> <Ocircumflex>             : "\220"        Ocircumflexgrave
+<dead_grave> <ocircumflex>             : "\260"        ocircumflexgrave
+<dead_hook> <Ocircumflex>              : "\221"        Ocircumflexhook
+<dead_hook> <ocircumflex>              : "\261"        ocircumflexhook
+<dead_tilde> <Ocircumflex>             : "\222"        Ocircumflextilde
+<dead_tilde> <ocircumflex>             : "\262"        ocircumflextilde
+<dead_acute> <Ocircumflex>             : "\217"        Ocircumflexacute
+<dead_acute> <ocircumflex>             : "\257"        ocircumflexacute
+<dead_belowdot> <Ocircumflex>          : "\223"        Ocircumflexbelowdot
+<dead_belowdot> <ocircumflex>          : "\265"        ocircumflexbelowdot
+<dead_grave> <Ohorn>                   : "\226"        Ohorngrave
+<dead_grave> <ohorn>                   : "\266"        ohorngrave
+<dead_hook> <Ohorn>                    : "\227"        Ohornhook
+<dead_hook> <ohorn>                    : "\267"        ohornhook
+<dead_tilde> <Ohorn>                   : "\263"        Ohorntilde
+<dead_tilde> <ohorn>                   : "\336"        ohorntilde
+<dead_acute> <Ohorn>                   : "\225"        Ohornacute
+<dead_acute> <ohorn>                   : "\276"        ohornacute
+<dead_belowdot> <Ohorn>                        : "\224"        Ohornbelowdot
+<dead_belowdot> <ohorn>                        : "\376"        ohornbelowdot
+<dead_grave> <U>                       : "\331"        Ugrave
+<dead_grave> <u>                       : "\371"        ugrave
+<dead_hook> <U>                                : "\234"        Uhook
+<dead_hook> <u>                                : "\374"        uhook
+<dead_tilde> <U>                       : "\235"        Utilde
+<dead_tilde> <u>                       : "\373"        utilde
+<dead_acute> <U>                       : "\332"        Uacute
+<dead_acute> <u>                       : "\372"        uacute
+<dead_belowdot> <U>                    : "\236"        Ubelowdot
+<dead_belowdot> <u>                    : "\370"        ubelowdot
+<dead_grave> <Uhorn>                   : "\273"        Uhorngrave
+<dead_grave> <uhorn>                   : "\327"        uhorngrave
+<dead_hook> <Uhorn>                    : "\274"        Uhornhook
+<dead_hook> <uhorn>                    : "\330"        uhornhook
+<dead_tilde> <Uhorn>                   : "\377"        Uhorntilde
+<dead_tilde> <uhorn>                   : "\346"        uhorntilde
+<dead_acute> <Uhorn>                   : "\272"        Uhornacute
+<dead_acute> <uhorn>                   : "\321"        uhornacute
+<dead_belowdot> <Uhorn>                        : "\271"        Uhornbelowdot
+<dead_belowdot> <uhorn>                        : "\361"        uhornbelowdot
+<dead_grave> <Y>                       : "\237"        Ygrave
+<dead_grave> <y>                       : "\317"        ygrave
+<dead_hook> <Y>                                : "\024"        Yhook
+<dead_hook> <y>                                : "\326"        yhook
+<dead_tilde> <Y>                       : "\031"        Ytilde
+<dead_tilde> <y>                       : "\333"        ytilde
+<dead_acute> <Y>                       : "\335"        Yacute
+<dead_acute> <y>                       : "\375"        yacute
+<dead_belowdot> <Y>                    : "\036"        Ybelowdot
+<dead_belowdot> <y>                    : "\334"        ybelowdot
+XCOMM End of Sequence Definition
diff --git a/nls/vi_VN.viscii/XI18N_OBJS b/nls/vi_VN.viscii/XI18N_OBJS
new file mode 100644 (file)
index 0000000..5f4b3b6
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for vi_VN.viscii locale
+#
+XLC    common/xlcDef   _XlcDefaultLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/vi_VN.viscii/XLC_LOCALE.pre b/nls/vi_VN.viscii/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..9df0300
--- /dev/null
@@ -0,0 +1,79 @@
+XCOMM  XLocale Database Sample for vi_VN.VISCII
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name            ISO8859-1:GL
+       }
+       font    {
+               primary         VISCII1.1-1:GL
+               substitute      ISO8859-1:GL
+       }
+}
+XCOMM  fs1 class 
+fs1    {
+       charset         VISCII1.1-1:GR
+       font            VISCII1.1-1:GR
+}
+END XLC_FONTSET
+
+XCOMM
+XCOMM  XLC_CHARSET_DEFINE category
+XCOMM
+XLC_CHARSET_DEFINE
+csd0   {
+       charset_name    VISCII1.1-1
+       side            GR
+       length          1
+       string_encoding False
+       sequence        \x1b%/1
+}
+END XLC_CHARSET_DEFINE
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name           VISCII1.1-1
+mb_cur_max             1
+state_depend_encoding  False
+#if WCHAR32
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+#else
+wc_encoding_mask       \x00008080
+wc_shift_bits          8
+#endif
+
+#ifndef X_LOCALE
+use_stdc_env           True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     VISCII1.1-1:GL; ISO8859-1:GL
+}
+
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+#if WCHAR32
+       wc_encoding     \x30000000
+#else
+       wc_encoding     \x00008080
+#endif
+       ct_encoding     VISCII1.1-1:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/zh_CN.UTF-8/Compose.pre b/nls/zh_CN.UTF-8/Compose.pre
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/nls/zh_CN.UTF-8/XI18N_OBJS b/nls/zh_CN.UTF-8/XI18N_OBJS
new file mode 100644 (file)
index 0000000..29dd53a
--- /dev/null
@@ -0,0 +1,8 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for zh_CN.UTF-8 locale
+#
+#
+XLC    common/xlcUTF8Load      _XlcUtf8Loader  # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/zh_CN.UTF-8/XLC_LOCALE.pre b/nls/zh_CN.UTF-8/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..6f05d7a
--- /dev/null
@@ -0,0 +1,107 @@
+XCOMM     XFree86 NLS for Chinese locale zh_CN.UTF-8
+XCOMM          Modified from xc/nls/XLC_LOCALE/en_US.UTF-8
+XCOMM          by James Su <suzhe@turbolinux.com.cn>
+XCOMM
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+
+on_demand_loading      True
+
+object_name            generic
+
+XCOMM  We leave the legacy encodings in for the moment, because we don't
+XCOMM  have that many ISO10646 fonts yet.
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name    ISO8859-1:GL
+       }
+       font    {
+               primary         ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+
+XCOMM  fs1 class (ISO8859 families)
+fs1    {
+       charset {
+               name    ISO8859-1:GR
+       }
+       font    {
+               primary ISO8859-1:GR
+       }
+}
+
+XCOMM  fs2 class (Chinese Han Character)
+fs2    {
+       charset {
+               name    GB2312.1980-0:GL
+       }
+       font    {
+               primary GB2312.1980-0:GL
+       }
+}
+
+XCOMM  fs3 class (Chinese Han Character GBK)
+fs3    {
+       charset {
+               name    GBK-0:GLGR
+       }
+       font    {
+               primary GBK-0:GLGR
+               substitute GB13000.1993-1:GLGR
+       }
+}
+
+XCOMM  fs4 class
+fs4    {
+       charset {
+               name    ISO10646-1
+       }
+       font    {
+               primary ISO10646-1
+       }
+}
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          UTF-8
+mb_cur_max             6
+state_depend_encoding  False
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       ct_encoding     ISO8859-1:GL
+}
+
+XCOMM  cs1 class
+cs1     {
+        side            GR:Default
+        length          1
+        ct_encoding     ISO8859-1:GR
+}
+XCOMM  cs2 class
+cs2     {
+        side            GR
+        length          2
+        ct_encoding     GB2312.1980-0:GL; GB2312.1980-0:GR
+}
+
+XCOMM  cs3 class
+cs3    {
+       side            none
+       ct_encoding     ISO10646-1
+}
+
+END XLC_XLOCALE
+
diff --git a/nls/zh_CN.gb18030/Compose.pre b/nls/zh_CN.gb18030/Compose.pre
new file mode 100644 (file)
index 0000000..a9e259f
--- /dev/null
@@ -0,0 +1,14 @@
+XCOMM
+XCOMM zh_CN.GB18030 Compose Sequence
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM
+XCOMM This file currently has no entries.  It appears that a compose file (even
+XCOMM just an empty one) is required for the appropriate keysyms to work for
+XCOMM this encoding.
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+
+XCOMM End of Sequence Definition
diff --git a/nls/zh_CN.gb18030/XI18N_OBJS b/nls/zh_CN.gb18030/XI18N_OBJS
new file mode 100644 (file)
index 0000000..a92b403
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for zh_CN.gb18030 locale
+#
+XLC    common/xlcUTF8Load      _XlcUtf8Loader  # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/zh_CN.gb18030/XLC_LOCALE.pre b/nls/zh_CN.gb18030/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..f9544c7
--- /dev/null
@@ -0,0 +1,106 @@
+XCOMM     XFree86 NLS for Chinese encoding GB18030
+XCOMM          Modified from xc/nls/XLC_LOCALE/en_US.UTF-8
+XCOMM          by James Su <suzhe@turbolinux.com.cn>
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+
+on_demand_loading      True
+
+object_name            generic
+
+XCOMM  We leave the legacy encodings in for the moment, because we don't
+XCOMM  have that many ISO10646 fonts yet.
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name    ISO8859-1:GL
+       }
+       font    {
+               primary ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+
+XCOMM  fs1 class (ISO8859 families)
+fs1    {
+       charset {
+               name    ISO8859-1:GR
+       }
+       font    {
+               primary ISO8859-1:GR
+       }
+}
+
+XCOMM  fs2 class (Chinese Han Character)
+fs2    {
+       charset {
+               name    GB2312.1980-0:GL
+       }
+       font    {
+               primary GB2312.1980-0:GL
+       }
+}
+
+XCOMM  fs3 class (Chinese Han Character GBK)
+fs3    {
+       charset {
+               name    GBK-0:GLGR
+       }
+       font    {
+               primary GBK-0:GLGR
+               substitute GB13000.1993-1:GLGR
+       }
+}
+
+XCOMM  fs4 class
+fs4    {
+       charset {
+               name    ISO10646-1
+       }
+       font    {
+               primary GB18030-0
+               substitute GBK2K-0
+       }
+}
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          GB18030
+mb_cur_max             4
+state_depend_encoding  False
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       ct_encoding     ISO8859-1:GL
+}
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          1
+       ct_encoding     ISO8859-1:GR
+}
+XCOMM  cs2 class
+cs2    {
+       side            GR
+       length          2
+       ct_encoding     GB2312.1980-0:GL; GB2312.1980-0:GR
+}
+
+XCOMM  cs3 class
+cs3    {
+       side            none
+       ct_encoding     ISO10646-1
+}
+
+END XLC_XLOCALE
diff --git a/nls/zh_CN.gbk/Compose.pre b/nls/zh_CN.gbk/Compose.pre
new file mode 100644 (file)
index 0000000..c95d9ac
--- /dev/null
@@ -0,0 +1,14 @@
+XCOMM
+XCOMM zh_CN.GBK Compose Sequence
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM
+XCOMM This file currently has no entries.  It appears that a compose file (even
+XCOMM just an empty one) is required for the appropriate keysyms to work for
+XCOMM this encoding.
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+
+XCOMM End of Sequence Definition
diff --git a/nls/zh_CN.gbk/XI18N_OBJS b/nls/zh_CN.gbk/XI18N_OBJS
new file mode 100644 (file)
index 0000000..197a3e1
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for zh_CN.gbk locale
+#
+XLC    common/xlibi18n _XlcGenericLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/zh_CN.gbk/XLC_LOCALE.pre b/nls/zh_CN.gbk/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..302818b
--- /dev/null
@@ -0,0 +1,70 @@
+XCOMM 
+XCOMM  X11R6 L10N for Chinese GBK Encoding.
+XCOMM     modified from xc/nls/XLC_LOCALE/zh_TW.Big5
+XCOMM     by Sean Chen <seanc@turbolinux.com>
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM        fs0 class (7 bit ASCII)
+fs0     {
+        charset {
+                name    ISO8859-1:GL
+        }
+        font    {
+                primary         ISO8859-1:GL
+                vertical_rotate all
+        }
+}
+XCOMM        fs1 class
+fs1     {
+        charset {
+                name    GBK-0:GLGR
+        }
+        font    {
+                primary GBK-0:GLGR
+                substitute GB13000.1993-1:GLGR
+        }
+}
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          zh_CN.GBK
+mb_cur_max             2
+state_depend_encoding  False
+
+wc_encoding_mask       \x00008000
+wc_shift_bits          8
+
+use_stdc_env           True
+force_convert_to_mb    True
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     ISO8859-1:GL
+}
+
+XCOMM  cs1 class
+cs1    {
+       side            none
+       length          2
+       byte1           \x81,\xfe
+       byte2           \x40,\x7e;\x80,\xfe
+
+       wc_encoding     \x00008000
+       ct_encoding     GBK-0:GLGR:\x1b\x25\x2f\x32
+
+       mb_conversion   [\x8140,\xfefe]->\x0140
+       ct_conversion   [\x0140,\x7efe]->\x8140
+}
+
+END XLC_XLOCALE
diff --git a/nls/zh_CN/Compose.pre b/nls/zh_CN/Compose.pre
new file mode 100644 (file)
index 0000000..2f04b42
--- /dev/null
@@ -0,0 +1,14 @@
+XCOMM
+XCOMM zh Compose Sequence
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM
+XCOMM This file currently has no entries.  It appears that a compose file (even
+XCOMM just an empty one) is required for the appropriate keysyms to work for
+XCOMM this encoding.
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+
+XCOMM End of Sequence Definition
diff --git a/nls/zh_CN/XI18N_OBJS b/nls/zh_CN/XI18N_OBJS
new file mode 100644 (file)
index 0000000..3ad1a62
--- /dev/null
@@ -0,0 +1,9 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for zh locale
+#
+#
+XLC    common/xlocale  _XlcEucLoader   # XLC_open
+XLC    common/xlibi18n _XlcGenericLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/zh_CN/XLC_LOCALE.pre b/nls/zh_CN/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..0065d8d
--- /dev/null
@@ -0,0 +1,62 @@
+XCOMM  XLocale Database Sample for zh (eucCN).
+XCOMM
+
+XCOMM
+XCOMM  XLC_FONTSET category
+XCOMM
+XLC_FONTSET
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name    ISO8859-1:GL
+       }
+       font    {
+               primary         ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class
+fs1    {
+       charset {
+               name    GB2312.1980-0:GL
+       }
+       font    {
+               primary GB2312.1980-0:GL
+               substitute      GB2312.1980-0:GLGR
+       }
+}
+END XLC_FONTSET
+
+XCOMM
+XCOMM  XLC_XLOCALE category
+XCOMM
+XLC_XLOCALE
+
+encoding_name          zh.euc
+mb_cur_max             2
+state_depend_encoding  False
+wc_encoding_mask       \x30000000
+wc_shift_bits          7
+
+#ifndef X_LOCALE
+use_stdc_env           True
+force_convert_to_mb    True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     ISO8859-1:GL
+}
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          2
+       wc_encoding     \x30000000
+       ct_encoding     GB2312.1980-0:GL; GB2312.1980-0:GR
+}
+
+END XLC_XLOCALE
diff --git a/nls/zh_HK.UTF-8/Compose.pre b/nls/zh_HK.UTF-8/Compose.pre
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/nls/zh_HK.UTF-8/XI18N_OBJS b/nls/zh_HK.UTF-8/XI18N_OBJS
new file mode 100644 (file)
index 0000000..e9d5ef8
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for zh_HK.UTF-8 locale
+#
+XLC    common/xlcUTF8Load      _XlcUtf8Loader  # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/zh_HK.UTF-8/XLC_LOCALE.pre b/nls/zh_HK.UTF-8/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..c088032
--- /dev/null
@@ -0,0 +1,96 @@
+XCOMM     XFree86 NLS for Chinese locale zh_HK.UTF-8
+XCOMM          Modified from xc/nls/XLC_LOCALE/en_US.UTF-8
+XCOMM          by James Su <suzhe@turbolinux.com.cn>
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+
+on_demand_loading      True
+
+object_name            generic
+
+XCOMM  We leave the legacy encodings in for the moment, because we don't
+XCOMM  have that many ISO10646 fonts yet.
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name    ISO8859-1:GL
+       }
+       font    {
+               primary ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+
+XCOMM  fs1 class (ISO8859 families)
+fs1    {
+       charset {
+               name    ISO8859-1:GR
+       }
+       font    {
+               primary ISO8859-1:GR
+       }
+}
+
+XCOMM   fs2 class
+fs2    {
+       charset {
+               name    BIG5HKSCS-0:GLGR
+       }
+       font    {
+               primary BIG5HKSCS-0:GLGR
+               substitute BIG5-0:GLGR
+       }
+}
+
+XCOMM  fs3 class
+fs3    {
+       charset {
+               name    ISO10646-1
+       }
+       font    {
+               primary ISO10646-1
+       }
+}
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          UTF-8
+mb_cur_max             6
+state_depend_encoding  False
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       ct_encoding     ISO8859-1:GL
+}
+
+XCOMM  cs1 class
+cs1     {
+        side            GR:Default
+        length          1
+        ct_encoding     ISO8859-1:GR
+}
+XCOMM  cs2 class
+cs2    {
+       side            none
+       length          2
+       ct_encoding     BIG5HKSCS-0:GLGR
+}
+
+XCOMM  cs3 class
+cs3    {
+       side            none
+       ct_encoding     ISO10646-1
+}
+
+END XLC_XLOCALE
+
diff --git a/nls/zh_HK.big5/Compose.pre b/nls/zh_HK.big5/Compose.pre
new file mode 100644 (file)
index 0000000..79dd3a0
--- /dev/null
@@ -0,0 +1,13 @@
+XCOMM
+XCOMM zh_HK.big5 Compose Sequence
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM This file currently has no entries.  It appears that a compose file (even
+XCOMM just an empty one) is required for the appropriate keysyms to work for
+XCOMM this encoding.
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+
+XCOMM End of Sequence Definition
diff --git a/nls/zh_HK.big5/XI18N_OBJS b/nls/zh_HK.big5/XI18N_OBJS
new file mode 100644 (file)
index 0000000..826c798
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for zh_HK.big5 locale
+#
+XLC    common/xlibi18n _XlcGenericLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/zh_HK.big5/XLC_LOCALE.pre b/nls/zh_HK.big5/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..03f9d08
--- /dev/null
@@ -0,0 +1,69 @@
+XCOMM 
+XCOMM  (c) 1996, X11R6 L10N for Taiwan and Big5 Encoding Project
+XCOMM 
+XCOMM  modified for X11R6.3 by Hung-Chi Chu <hcchu@r350.ee.ntu.edu.tw> 1998/01/10
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM
+XCOMM 
+XLC_FONTSET
+XCOMM        fs0 class (7 bit ASCII)
+fs0     {
+       charset {
+               name    ISO8859-1:GL
+       }
+       font    {
+               primary ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+XCOMM        fs1 class
+fs1     {
+       charset {
+               name    BIG5-0:GLGR
+       }
+       font    {
+               primary BIG5-0:GLGR
+               substitute BIG5-0:GLGR
+       }
+}
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          zh_HK.Big5
+mb_cur_max             2
+state_depend_encoding  False
+
+wc_encoding_mask       \x00008000
+wc_shift_bits          8
+
+use_stdc_env           True
+force_convert_to_mb    True
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     ISO8859-1:GL
+}
+
+XCOMM  cs1 class
+cs1    {
+       side            none
+       length          2
+       byte1           \xa1,\xf9
+       byte2           \x40,\x7e;\xa1,\xfe
+
+       wc_encoding     \x00008000
+       ct_encoding     BIG5-0:GLGR:\x1b\x25\x2f\x32\x80\x89\x42\x49\x47\x35\x2d\x30\x02
+
+       mb_conversion   [\xa140,\xf9fe]->\x2140
+       ct_conversion   [\x2140,\x79fe]->\xa140
+}
+
+END XLC_XLOCALE
diff --git a/nls/zh_HK.big5hkscs/Compose.pre b/nls/zh_HK.big5hkscs/Compose.pre
new file mode 100644 (file)
index 0000000..a06611f
--- /dev/null
@@ -0,0 +1,13 @@
+XCOMM
+XCOMM zh_HK.big5hkscs Compose Sequence
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM This file currently has no entries.  It appears that a compose file (even
+XCOMM just an empty one) is required for the appropriate keysyms to work for
+XCOMM this encoding.
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+
+XCOMM End of Sequence Definition
diff --git a/nls/zh_HK.big5hkscs/XI18N_OBJS b/nls/zh_HK.big5hkscs/XI18N_OBJS
new file mode 100644 (file)
index 0000000..29dc216
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for zh_HK.big5hkscs locale
+#
+XLC    common/xlibi18n _XlcGenericLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/zh_HK.big5hkscs/XLC_LOCALE.pre b/nls/zh_HK.big5hkscs/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..dc19438
--- /dev/null
@@ -0,0 +1,71 @@
+XCOMM
+XCOMM (c) 1996, X11R6 L10N for Taiwan and Big5 Encoding Project
+XCOMM
+XCOMM modified for X11R6.3 by Hung-Chi Chu <hcchu@r350.ee.ntu.edu.tw> 1998/01/10
+XCOMM modified for Big5HKSCS by Roger So <roger.so@sw-linux.com> 
+XCOMM
+XCOMM
+XCOMM  XLC_FONTSET category
+XCOMM
+XLC_FONTSET
+XCOMM fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name    ISO8859-1:GL
+       }
+       font    {
+               primary         ISO8859-1:GL
+               vertical_rotate all
+        }
+}
+
+XCOMM fs1 class (HKSCS extensions)
+fs1    {
+       charset {
+               name    BIG5HKSCS-0:GLGR
+       }
+       font    {
+               primary         BIG5HKSCS-0:GLGR
+               substitute      BIG5HKSCS-0:GLGR
+       }
+}
+END XLC_FONTSET
+
+XCOMM
+XCOMM  XLC_XLOCALE category
+XCOMM
+XLC_XLOCALE
+
+encoding_name          zh_HK.big5hkscs
+mb_cur_max             2
+state_depend_encoding  False
+
+wc_encoding_mask       \x00008000
+wc_shift_bits          8
+
+use_stdc_env           True
+force_convert_to_mb    True
+
++XCOMM cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     ISO8859-1:GL
+}
+
+XCOMM  cs1 class
+cs1    {
+       side            none
+       length          2
+       byte1           \x85,\xfe
+       byte2           \x40,\x7e;\xa1,\xfe
+
+       wc_encoding     \x00008000
+       ct_encoding     BIG5HKSCS-0:GLGR:\x1b\x25\x2f\x32
+
+       mb_conversion   [\x8540,\xfefe]->\x0540
+       ct_conversion   [\x0540,\x7efe]->\x8540
+}
+
+END XLC_XLOCALE
diff --git a/nls/zh_TW.UTF-8/Compose.pre b/nls/zh_TW.UTF-8/Compose.pre
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/nls/zh_TW.UTF-8/XI18N_OBJS b/nls/zh_TW.UTF-8/XI18N_OBJS
new file mode 100644 (file)
index 0000000..a3a644b
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for zh_TW.UTF-8 locale
+#
+XLC    common/xlcUTF8Load      _XlcUtf8Loader  # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/zh_TW.UTF-8/XLC_LOCALE.pre b/nls/zh_TW.UTF-8/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..d5b19c0
--- /dev/null
@@ -0,0 +1,91 @@
+XCOMM  XLocale Database Sample for zh_TW.UTF-8
+XCOMM 
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+
+on_demand_loading      True
+
+object_name            generic
+
+XCOMM  We leave the legacy encodings in for the moment, because we don't
+XCOMM  have that many ISO10646 fonts yet.
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name    ISO8859-1:GL
+       }
+       font    {
+               primary         ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class (ISO8859 families)
+fs1    {
+       charset {
+               name    ISO8859-1:GR
+       }
+       font    {
+               primary ISO8859-1:GR
+       }
+}
+XCOMM  fs2 class (Chinese Han Character (Traditional))
+fs2    {
+        charset {
+                name    BIG5-0:GLGR
+        }
+        font    {
+                primary BIG5-0:GLGR
+                               substitute BIG5-0:GLGR
+        }
+}
+XCOMM  fs3 class
+fs3    {
+       charset {
+               name    ISO10646-1
+       }
+       font    {
+               primary ISO10646-1
+       }
+}
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          UTF-8
+mb_cur_max             6
+state_depend_encoding  False
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       ct_encoding     ISO8859-1:GL
+}
+
+XCOMM  cs1 class
+cs1     {
+        side            GR:Default
+        length          1
+        ct_encoding     ISO8859-1:GR
+}
+XCOMM  cs2 class
+cs2    {
+       side            none
+       length          2
+       ct_encoding     BIG5-0:GLGR
+}
+
+XCOMM  cs3 class
+cs3    {
+       side            none
+       ct_encoding     ISO10646-1
+}
+
+END XLC_XLOCALE
diff --git a/nls/zh_TW.big5/Compose.pre b/nls/zh_TW.big5/Compose.pre
new file mode 100644 (file)
index 0000000..3c0dbb7
--- /dev/null
@@ -0,0 +1,14 @@
+XCOMM
+XCOMM zh_TW.big5 Compose Sequence
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM
+XCOMM This file currently has no entries.  It appears that a compose file (even
+XCOMM just an empty one) is required for the appropriate keysyms to work for
+XCOMM this encoding.
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+
+XCOMM End of Sequence Definition
diff --git a/nls/zh_TW.big5/XI18N_OBJS b/nls/zh_TW.big5/XI18N_OBJS
new file mode 100644 (file)
index 0000000..6937f61
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for zh_TW.big5 locale
+#
+XLC    common/xlibi18n _XlcGenericLoader       # XLC_open
+XIM    common/ximcp    _XimOpenIM _XimRegisterIMInstantiateCallback  _XimUnRegisterIMInstantiateCallback # XIM_open    XIM_register XIM_unregister
+XOM    common/xomGeneric       _XomGenericOpenOM       # XOM_open
diff --git a/nls/zh_TW.big5/XLC_LOCALE.pre b/nls/zh_TW.big5/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..b04d023
--- /dev/null
@@ -0,0 +1,93 @@
+XCOMM
+XCOMM (c) 1996, X11R6 L10N for Taiwan and Big5 Encoding Project
+XCOMM
+XCOMM modified for X11R6.3 by Hung-Chi Chu <hcchu@r350.ee.ntu.edu.tw> 1998/01/10
+XCOMM
+XCOMM
+XCOMM  XLC_FONTSET category
+XCOMM
+XLC_FONTSET
+XCOMM       fs0 class (7 bit ASCII)
+fs0     {
+        charset {
+                name    ISO8859-1:GL
+        }
+        font    {
+                primary         ISO8859-1:GL
+                vertical_rotate all
+        }
+}
+XCOMM       fs1 class
+fs1     {
+        charset {
+                name    BIG5-0:GLGR
+        }
+        font    {
+                primary BIG5-0:GLGR
+                               substitute BIG5-0:GLGR
+        }
+}
+END XLC_FONTSET
+
+XCOMM
+XCOMM  XLC_XLOCALE category
+XCOMM
+XLC_XLOCALE
+
+encoding_name          zh_TW.Big5
+mb_cur_max             2
+state_depend_encoding  False
+
+wc_encoding_mask       \x00038000
+wc_shift_bits          8
+
+#ifndef X_LOCALE
+use_stdc_env           True
+force_convert_to_mb    True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     ISO8859-1:GL
+}
+
+XCOMM  cs1 class
+cs1    {
+       side            none
+       length          2
+       byte1           \xa1,\xf9
+       byte2           \x40,\x7e;\xa1,\xfe
+
+       wc_encoding     \x00008000
+       ct_encoding     BIG5-0:GLGR:\x1b\x25\x2f\x32
+
+       mb_conversion   [\xa140,\xf9fe]->\x2140
+       ct_conversion   [\x2140,\x79fe]->\xa140
+}
+
+XCOMM  cs2 class
+cs2    {
+       side            none
+       length          2
+       byte1           \xa1,\xc7
+       byte2           \x40,\x7e;\xa1,\xfe
+       wc_encoding     \x00010000
+       ct_encoding     BIG5-E0:GL;BIG5-E0:GR
+       mb_conversion   [\xa140,\xa17e]->\x2121, [\xa1a1,\xa1bf]->\x2160, [\xa1c0,\xa1fe]->\x2221, [\xa240,\xa25e]->\x2260, [\xa25f,\xa27e]->\x2321, [\xa2a1,\xa2de]->\x2341, [\xa2df,\xa2fe]->\x2421, [\xa340,\xa37d]->\x2441, [\xa37e,\xa37e]->\x2521, [\xa3a1,\xa3fd]->\x2522, [\xa3fe,\xa3fe]->\x2621, [\xa440,\xa47e]->\x2622, [\xa4a1,\xa4be]->\x2661, [\xa4bf,\xa4fe]->\x2721, [\xa540,\xa55d]->\x2761, [\xa55e,\xa57e]->\x2821, [\xa5a1,\xa5dd]->\x2842, [\xa5de,\xa5fe]->\x2921, [\xa640,\xa67c]->\x2942, [\xa67d,\xa67e]->\x2a21, [\xa6a1,\xa6fc]->\x2a23, [\xa6fd,\xa6fe]->\x2b21, [\xa740,\xa77e]->\x2b23, [\xa7a1,\xa7bd]->\x2b62, [\xa7be,\xa7fe]->\x2c21, [\xa840,\xa85c]->\x2c62, [\xa85d,\xa87e]->\x2d21, [\xa8a1,\xa8dc]->\x2d43, [\xa8dd,\xa8fe]->\x2e21, [\xa940,\xa97b]->\x2e43, [\xa97c,\xa97e]->\x2f21, [\xa9a1,\xa9fb]->\x2f24, [\xa9fc,\xa9fe]->\x3021, [\xaa40,\xaa7e]->\x3024, [\xaaa1,\xaabc]->\x3063, [\xaabd,\xaafe]->\x3121, [\xab40,\xab5b]->\x3163, [\xab5c,\xab7e]->\x3221, [\xaba1,\xabdb]->\x3244, [\xabdc,\xabfe]->\x3321, [\xac40,\xac7a]->\x3344, [\xac7b,\xac7e]->\x3421, [\xaca1,\xacfa]->\x3425, [\xacfb,\xacfe]->\x3521, [\xad40,\xad7e]->\x3525, [\xada1,\xadbb]->\x3564, [\xadbc,\xadfe]->\x3621, [\xae40,\xae5a]->\x3664, [\xae5b,\xae7e]->\x3721, [\xaea1,\xaeda]->\x3745, [\xaedb,\xaefe]->\x3821, [\xaf40,\xaf79]->\x3845, [\xaf7a,\xaf7e]->\x3921, [\xafa1,\xaff9]->\x3926, [\xaffa,\xaffe]->\x3a21, [\xb040,\xb07e]->\x3a26, [\xb0a1,\xb0ba]->\x3a65, [\xb0bb,\xb0fe]->\x3b21, [\xb140,\xb159]->\x3b65, [\xb15a,\xb17e]->\x3c21, [\xb1a1,\xb1d9]->\x3c46, [\xb1da,\xb1fe]->\x3d21, [\xb240,\xb278]->\x3d46, [\xb279,\xb27e]->\x3e21, [\xb2a1,\xb2f8]->\x3e27, [\xb2f9,\xb2fe]->\x3f21, [\xb340,\xb37e]->\x3f27, [\xb3a1,\xb3b9]->\x3f66, [\xb3ba,\xb3fe]->\x4021, [\xb440,\xb458]->\x4066, [\xb459,\xb47e]->\x4121, [\xb4a1,\xb4d8]->\x4147, [\xb4d9,\xb4fe]->\x4221, [\xb540,\xb577]->\x4247, [\xb578,\xb57e]->\x4321, [\xb5a1,\xb5f7]->\x4328, [\xb5f8,\xb5fe]->\x4421, [\xb640,\xb67e]->\x4428, [\xb6a1,\xb6b8]->\x4467, [\xb6b9,\xb6fe]->\x4521, [\xb740,\xb757]->\x4567, [\xb758,\xb77e]->\x4621, [\xb7a1,\xb7d7]->\x4648, [\xb7d8,\xb7fe]->\x4721, [\xb840,\xb876]->\x4748, [\xb877,\xb87e]->\x4821, [\xb8a1,\xb8f6]->\x4829, [\xb8f7,\xb8fe]->\x4921, [\xb940,\xb97e]->\x4929, [\xb9a1,\xb9b7]->\x4968, [\xb9b8,\xb9fe]->\x4a21, [\xba40,\xba56]->\x4a68, [\xba57,\xba7e]->\x4b21, [\xbaa1,\xbad6]->\x4b49, [\xbad7,\xbafe]->\x4c21, [\xbb40,\xbb75]->\x4c49, [\xbb76,\xbb7e]->\x4d21, [\xbba1,\xbbf5]->\x4d2a, [\xbbf6,\xbbfe]->\x4e21, [\xbc40,\xbc7e]->\x4e2a, [\xbca1,\xbcb6]->\x4e69, [\xbcb7,\xbcfe]->\x4f21, [\xbd40,\xbd55]->\x4f69, [\xbd56,\xbd7e]->\x5021, [\xbda1,\xbdd5]->\x504a, [\xbdd6,\xbdfe]->\x5121, [\xbe40,\xbe74]->\x514a, [\xbe75,\xbe7e]->\x5221, [\xbea1,\xbef4]->\x522b, [\xbef5,\xbefe]->\x5321, [\xbf40,\xbf7e]->\x532b, [\xbfa1,\xbfb5]->\x536a, [\xbfb6,\xbffe]->\x5421, [\xc040,\xc054]->\x546a, [\xc055,\xc07e]->\x5521, [\xc0a1,\xc0d4]->\x554b, [\xc0d5,\xc0fe]->\x5621, [\xc140,\xc173]->\x564b, [\xc174,\xc17e]->\x5721, [\xc1a1,\xc1f3]->\x572c, [\xc1f4,\xc1fe]->\x5821, [\xc240,\xc27e]->\x582c, [\xc2a1,\xc2b4]->\x586b, [\xc2b5,\xc2fe]->\x5921, [\xc340,\xc353]->\x596b, [\xc354,\xc37e]->\x5a21, [\xc3a1,\xc3d3]->\x5a4c, [\xc3d4,\xc3fe]->\x5b21, [\xc440,\xc472]->\x5b4c, [\xc473,\xc47e]->\x5c21, [\xc4a1,\xc4f2]->\x5c2d, [\xc4f3,\xc4fe]->\x5d21, [\xc540,\xc57e]->\x5d2d, [\xc5a1,\xc5b3]->\x5d6c, [\xc5b4,\xc5fe]->\x5e21, [\xc640,\xc652]->\x5e6c, [\xc653,\xc67e]->\x5f21, [\xc6a1,\xc6d2]->\x5f4d, [\xc6d3,\xc6fe]->\x6021, [\xc740,\xc771]->\x604d, [\xc772,\xc77e]->\x6121, [\xc7a1,\xc7f1]->\x612e, [\xc7f2,\xc7fe]->\x6221
+}
+
+XCOMM  cs3 class
+cs3    {
+       side            none
+       length          2
+       byte1           \xc9,\xf9
+       byte2           \x40,\x7e;\xa1,\xfe
+       wc_encoding     \x00020000
+       ct_encoding     BIG5-E1:GL;BIG5-E1:GR
+       mb_conversion   [\xc940,\xc97e]->\x2121, [\xc9a1,\xc9bf]->\x2160, [\xc9c0,\xc9fe]->\x2221, [\xca40,\xca5e]->\x2260, [\xca5f,\xca7e]->\x2321, [\xcaa1,\xcade]->\x2341, [\xcadf,\xcafe]->\x2421, [\xcb40,\xcb7d]->\x2441, [\xcb7e,\xcb7e]->\x2521, [\xcba1,\xcbfd]->\x2522, [\xcbfe,\xcbfe]->\x2621, [\xcc40,\xcc7e]->\x2622, [\xcca1,\xccbe]->\x2661, [\xccbf,\xccfe]->\x2721, [\xcd40,\xcd5d]->\x2761, [\xcd5e,\xcd7e]->\x2821, [\xcda1,\xcddd]->\x2842, [\xcdde,\xcdfe]->\x2921, [\xce40,\xce7c]->\x2942, [\xce7d,\xce7e]->\x2a21, [\xcea1,\xcefc]->\x2a23, [\xcefd,\xcefe]->\x2b21, [\xcf40,\xcf7e]->\x2b23, [\xcfa1,\xcfbd]->\x2b62, [\xcfbe,\xcffe]->\x2c21, [\xd040,\xd05c]->\x2c62, [\xd05d,\xd07e]->\x2d21, [\xd0a1,\xd0dc]->\x2d43, [\xd0dd,\xd0fe]->\x2e21, [\xd140,\xd17b]->\x2e43, [\xd17c,\xd17e]->\x2f21, [\xd1a1,\xd1fb]->\x2f24, [\xd1fc,\xd1fe]->\x3021, [\xd240,\xd27e]->\x3024, [\xd2a1,\xd2bc]->\x3063, [\xd2bd,\xd2fe]->\x3121, [\xd340,\xd35b]->\x3163, [\xd35c,\xd37e]->\x3221, [\xd3a1,\xd3db]->\x3244, [\xd3dc,\xd3fe]->\x3321, [\xd440,\xd47a]->\x3344, [\xd47b,\xd47e]->\x3421, [\xd4a1,\xd4fa]->\x3425, [\xd4fb,\xd4fe]->\x3521, [\xd540,\xd57e]->\x3525, [\xd5a1,\xd5bb]->\x3564, [\xd5bc,\xd5fe]->\x3621, [\xd640,\xd65a]->\x3664, [\xd65b,\xd67e]->\x3721, [\xd6a1,\xd6da]->\x3745, [\xd6db,\xd6fe]->\x3821, [\xd740,\xd779]->\x3845, [\xd77a,\xd77e]->\x3921, [\xd7a1,\xd7f9]->\x3926, [\xd7fa,\xd7fe]->\x3a21, [\xd840,\xd87e]->\x3a26, [\xd8a1,\xd8ba]->\x3a65, [\xd8bb,\xd8fe]->\x3b21, [\xd940,\xd959]->\x3b65, [\xd95a,\xd97e]->\x3c21, [\xd9a1,\xd9d9]->\x3c46, [\xd9da,\xd9fe]->\x3d21, [\xda40,\xda78]->\x3d46, [\xda79,\xda7e]->\x3e21, [\xdaa1,\xdaf8]->\x3e27, [\xdaf9,\xdafe]->\x3f21, [\xdb40,\xdb7e]->\x3f27, [\xdba1,\xdbb9]->\x3f66, [\xdbba,\xdbfe]->\x4021, [\xdc40,\xdc58]->\x4066, [\xdc59,\xdc7e]->\x4121, [\xdca1,\xdcd8]->\x4147, [\xdcd9,\xdcfe]->\x4221, [\xdd40,\xdd77]->\x4247, [\xdd78,\xdd7e]->\x4321, [\xdda1,\xddf7]->\x4328, [\xddf8,\xddfe]->\x4421, [\xde40,\xde7e]->\x4428, [\xdea1,\xdeb8]->\x4467, [\xdeb9,\xdefe]->\x4521, [\xdf40,\xdf57]->\x4567, [\xdf58,\xdf7e]->\x4621, [\xdfa1,\xdfd7]->\x4648, [\xdfd8,\xdffe]->\x4721, [\xe040,\xe076]->\x4748, [\xe077,\xe07e]->\x4821, [\xe0a1,\xe0f6]->\x4829, [\xe0f7,\xe0fe]->\x4921, [\xe140,\xe17e]->\x4929, [\xe1a1,\xe1b7]->\x4968, [\xe1b8,\xe1fe]->\x4a21, [\xe240,\xe256]->\x4a68, [\xe257,\xe27e]->\x4b21, [\xe2a1,\xe2d6]->\x4b49, [\xe2d7,\xe2fe]->\x4c21, [\xe340,\xe375]->\x4c49, [\xe376,\xe37e]->\x4d21, [\xe3a1,\xe3f5]->\x4d2a, [\xe3f6,\xe3fe]->\x4e21, [\xe440,\xe47e]->\x4e2a, [\xe4a1,\xe4b6]->\x4e69, [\xe4b7,\xe4fe]->\x4f21, [\xe540,\xe555]->\x4f69, [\xe556,\xe57e]->\x5021, [\xe5a1,\xe5d5]->\x504a, [\xe5d6,\xe5fe]->\x5121, [\xe640,\xe674]->\x514a, [\xe675,\xe67e]->\x5221, [\xe6a1,\xe6f4]->\x522b, [\xe6f5,\xe6fe]->\x5321, [\xe740,\xe77e]->\x532b, [\xe7a1,\xe7b5]->\x536a, [\xe7b6,\xe7fe]->\x5421, [\xe840,\xe854]->\x546a, [\xe855,\xe87e]->\x5521, [\xe8a1,\xe8d4]->\x554b, [\xe8d5,\xe8fe]->\x5621, [\xe940,\xe973]->\x564b, [\xe974,\xe97e]->\x5721, [\xe9a1,\xe9f3]->\x572c, [\xe9f4,\xe9fe]->\x5821, [\xea40,\xea7e]->\x582c, [\xeaa1,\xeab4]->\x586b, [\xeab5,\xeafe]->\x5921, [\xeb40,\xeb53]->\x596b, [\xeb54,\xeb7e]->\x5a21, [\xeba1,\xebd3]->\x5a4c, [\xebd4,\xebfe]->\x5b21, [\xec40,\xec72]->\x5b4c, [\xec73,\xec7e]->\x5c21, [\xeca1,\xecf2]->\x5c2d, [\xecf3,\xecfe]->\x5d21, [\xed40,\xed7e]->\x5d2d, [\xeda1,\xedb3]->\x5d6c, [\xedb4,\xedfe]->\x5e21, [\xee40,\xee52]->\x5e6c, [\xee53,\xee7e]->\x5f21, [\xeea1,\xeed2]->\x5f4d, [\xeed3,\xeefe]->\x6021, [\xef40,\xef71]->\x604d, [\xef72,\xef7e]->\x6121, [\xefa1,\xeff1]->\x612e, [\xeff2,\xeffe]->\x6221, [\xf040,\xf07e]->\x622e, [\xf0a1,\xf0b2]->\x626d, [\xf0b3,\xf0fe]->\x6321, [\xf140,\xf151]->\x636d, [\xf152,\xf17e]->\x6421, [\xf1a1,\xf1d1]->\x644e, [\xf1d2,\xf1fe]->\x6521, [\xf240,\xf270]->\x654e, [\xf271,\xf27e]->\x6621, [\xf2a1,\xf2f0]->\x662f, [\xf2f1,\xf2fe]->\x6721, [\xf340,\xf37e]->\x672f, [\xf3a1,\xf3b1]->\x676e, [\xf3b2,\xf3fe]->\x6821, [\xf440,\xf450]->\x686e, [\xf451,\xf47e]->\x6921, [\xf4a1,\xf4d0]->\x694f, [\xf4d1,\xf4fe]->\x6a21, [\xf540,\xf56f]->\x6a4f, [\xf570,\xf57e]->\x6b21, [\xf5a1,\xf5ef]->\x6b30, [\xf5f0,\xf5fe]->\x6c21, [\xf640,\xf67e]->\x6c30, [\xf6a1,\xf6b0]->\x6c6f, [\xf6b1,\xf6fe]->\x6d21, [\xf740,\xf74f]->\x6d6f, [\xf750,\xf77e]->\x6e21, [\xf7a1,\xf7cf]->\x6e50, [\xf7d0,\xf7fe]->\x6f21, [\xf840,\xf86e]->\x6f50, [\xf86f,\xf87e]->\x7021, [\xf8a1,\xf8ee]->\x7031, [\xf8ef,\xf8fe]->\x7121, [\xf940,\xf97e]->\x7131, [\xf9a1,\xf9af]->\x7170, [\xf9b0,\xf9fe]->\x7221
+}
+
+END XLC_XLOCALE
diff --git a/nls/zh_TW/Compose.pre b/nls/zh_TW/Compose.pre
new file mode 100644 (file)
index 0000000..79be290
--- /dev/null
@@ -0,0 +1,14 @@
+XCOMM
+XCOMM zh_TW Compose Sequence
+XCOMM
+XCOMM Sequence Definition
+XCOMM
+XCOMM
+XCOMM This file currently has no entries.  It appears that a compose file (even
+XCOMM just an empty one) is required for the appropriate keysyms to work for
+XCOMM this encoding.
+XCOMM
+XCOMM <Multi_key> Means <Compose>
+XCOMM Special Character
+
+XCOMM End of Sequence Definition
diff --git a/nls/zh_TW/XI18N_OBJS b/nls/zh_TW/XI18N_OBJS
new file mode 100644 (file)
index 0000000..0f471dd
--- /dev/null
@@ -0,0 +1,7 @@
+# CATEGORY(XLC|XIM|OM) SHARED_LIBRARY_NAME     FUNCTION_NAME
+#
+#      XI18N objects table for zh_TW locale
+#
+XLC    common/xlibi18n _XlcGenericLoader       # XLC_open
+XIM    common/ximp40           _Ximp_OpenIM            # XIM_open
+XOM    common/xomGeneric       _XomGenericOpenOM # XOM_open
diff --git a/nls/zh_TW/XLC_LOCALE.pre b/nls/zh_TW/XLC_LOCALE.pre
new file mode 100644 (file)
index 0000000..d75ece8
--- /dev/null
@@ -0,0 +1,142 @@
+XCOMM  XLocale Database Sample for zh_TW
+XCOMM 
+XCOMM Note: In lib/X11/lcCT.c, charset names for CNS11643 coded character
+XCOMM sets are defined as CNS11643.1986-1 and -2.  In the ECMA Registry,
+XCOMM CNS coded character sets 1-7 are registered as CNS 11643-1992.
+XCOMM CJK.INF Version 1.7 (August 15, 1995) written by Ken Lunde says
+XCOMM plane 14 of CNS 11643-1983 now became plane 3 of CNS 11643-1992.
+XCOMM I do not know how Taiwanese EUC is organized currently, so I left the
+XCOMM X11R6 organization of fsN/csN as it is and only changed "CNS11643-*"
+XCOMM to "CNS11643.1986-*".
+XCOMM  1995-10-24      T. Numata (numa@rp.open.cs.fujitsu.co.jp)
+
+XCOMM 
+XCOMM  XLC_FONTSET category
+XCOMM 
+XLC_FONTSET
+XCOMM  fs0 class (7 bit ASCII)
+fs0    {
+       charset {
+               name    ISO8859-1:GL
+       }
+       font    {
+               primary         ISO8859-1:GL
+               vertical_rotate all
+       }
+}
+XCOMM  fs1 class
+fs1    {
+       charset {
+               name    CNS11643.1986-1:GL
+       }
+       font    {
+               primary CNS11643.1986-1:GL
+       }
+}
+XCOMM  fs2 class
+fs2    {
+       charset {
+               name    CNS11643.1986-2:GL
+       }
+       font    {
+               primary CNS11643.1986-2:GL
+       }
+}
+XCOMM  fs3 class 
+fs3    {
+       charset {
+               name    CNS11643.1986-14:GL
+       }
+       font    {
+               primary CNS11643.1986-14:GL
+       }
+}
+XCOMM  fs4 class 
+fs4    {
+       charset {
+               name    CNS11643.1986-15:GL
+       }
+       font    {
+               primary CNS11643.1986-15:GL
+       }
+}
+XCOMM  fs5 class 
+fs5    {
+       charset {
+               name    CNS11643.1986-16:GL
+       }
+       font    {
+               primary CNS11643.1986-16:GL
+       }
+}
+END XLC_FONTSET
+
+XCOMM 
+XCOMM  XLC_XLOCALE category
+XCOMM 
+XLC_XLOCALE
+
+encoding_name          zh_TW.euc
+mb_cur_max             4
+state_depend_encoding  False
+wc_encoding_mask       \x3fffc000
+wc_shift_bits          7
+
+#ifndef X_LOCALE
+use_stdc_env           True
+force_convert_to_mb    True
+#endif
+
+XCOMM  cs0 class
+cs0    {
+       side            GL:Default
+       length          1
+       wc_encoding     \x00000000
+       ct_encoding     ISO8859-1:GL; CNS11643.1986-0:GL
+}
+
+XCOMM  cs1 class
+cs1    {
+       side            GR:Default
+       length          2
+       wc_encoding     \x30000000
+       ct_encoding     CNS11643.1986-1:GR
+}
+
+XCOMM  cs2 class       # plane 2
+cs2    {
+       side            GR
+       length          2
+       mb_encoding     <SS> \x8e\xa2
+       wc_encoding     \x10088000
+       ct_encoding     CNS11643.1986-2:GR
+}
+
+XCOMM  cs3 class       # plane 14
+cs3    {
+       side            GR
+       length          2
+       mb_encoding     <SS> \x8e\xae
+       wc_encoding     \x100b8000
+       ct_encoding     CNS11643.1986-14:GR
+}
+
+XCOMM  cs4 class       # plane 15
+cs4    {
+       side            GR
+       length          2
+       mb_encoding     <SS> \x8e\xaf
+       wc_encoding     \x100bc000
+       ct_encoding     CNS11643.1986-15:GR
+}
+
+XCOMM  cs5 class       # plane 16
+cs5    {
+       side            GR
+       length          2
+       mb_encoding     <SS> \x8e\xb0
+       wc_encoding     \x100c0000
+       ct_encoding     CNS11643.1986-16:GR
+}
+
+END XLC_XLOCALE
diff --git a/packaging/libX11.spec b/packaging/libX11.spec
new file mode 100644 (file)
index 0000000..8bb03d2
--- /dev/null
@@ -0,0 +1,124 @@
+%define tarball libX11
+#define gitdate 20090805
+
+Summary: Core X11 protocol client library
+Name: libX11
+Version: 1.5.0
+Release: 3
+VCS:     framework/uifw/xorg/lib/libx11#REBASE-7-g234d56c50c5d38bc7d55b573fb94ec4d84ed4b3d
+License: MIT
+Group: System Environment/Libraries
+URL: http://www.x.org
+
+Source0: %{name}-%{version}.tar.gz
+
+BuildRequires:  pkgconfig(xcmiscproto)
+BuildRequires:  pkgconfig(bigreqsproto)
+BuildRequires:  pkgconfig(kbproto)
+BuildRequires:  pkgconfig(inputproto)
+BuildRequires:  pkgconfig(xorg-macros)
+BuildRequires:  pkgconfig(xextproto)
+BuildRequires: pkgconfig(xproto) >= 7.0.15
+BuildRequires: xorg-x11-xtrans-devel >= 1.0.3-4
+BuildRequires: libxcb-devel >= 1.2
+
+Requires: %{name}-common = %{version}-%{release}
+Provides: libx11
+
+%description
+Core X11 protocol client library.
+
+%package common
+Summary: Common data for libX11
+Group: System Environment/Libraries
+BuildArch: noarch
+
+%description common
+libX11 common data
+
+%package devel
+Summary: Development files for %{name}
+Group: Development/Libraries
+Requires: %{name} = %{version}-%{release}
+Provides: libx11-devel
+
+%description devel
+X.Org X11 libX11 development package
+
+%prep
+%setup -q
+
+
+%build
+# sodding libtool
+autoreconf -v --install --force
+%reconfigure --disable-static \
+           --enable-specs \
+           --enable-man-pages=3 \
+           --with-xcb=yes \
+           CFLAGS="${CFLAGS} -D_F_REDUCE_SYSCALL " \
+           LDFLAGS="${LDFLAGS} -Wl,--hash-style=both -Wl,--as-needed"
+
+make %{?jobs:-j%jobs}
+
+%install
+rm -rf $RPM_BUILD_ROOT
+mkdir -p %{buildroot}/usr/share/license
+cp -af COPYING %{buildroot}/usr/share/license/%{name}
+cp -af COPYING %{buildroot}/usr/share/license/%{name}-common
+cp -af COPYING %{buildroot}/usr/share/license/%{name}-devel
+make install DESTDIR=$RPM_BUILD_ROOT INSTALL="install -p"
+
+# We intentionally don't ship *.la files
+find $RPM_BUILD_ROOT -type f -name '*.la' -delete
+
+# FIXME: Don't install Xcms.txt - find out why upstream still ships this.
+find $RPM_BUILD_ROOT -name 'Xcms.txt' -delete
+
+# FIXME package these properly
+rm -rf $RPM_BUILD_ROOT%{_docdir}
+
+%remove_docs
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%post -p /sbin/ldconfig
+%postun -p /sbin/ldconfig
+
+%files
+%defattr(-,root,root,-)
+/usr/share/license/%{name}
+%{_libdir}/libX11.so.6
+%{_libdir}/libX11.so.6.3.0
+%{_libdir}/libX11-xcb.so.1
+%{_libdir}/libX11-xcb.so.1.0.0
+
+%files common
+%defattr(-,root,root,-)
+/usr/share/license/%{name}-common
+#%doc AUTHORS COPYING README NEWS
+%{_datadir}/X11/locale/*
+%{_datadir}/X11/XErrorDB
+
+%files devel
+%defattr(-,root,root,-)
+%{_includedir}/X11/ImUtil.h
+%{_includedir}/X11/XKBlib.h
+%{_includedir}/X11/Xcms.h
+%{_includedir}/X11/Xlib.h
+%{_includedir}/X11/XlibConf.h
+%{_includedir}/X11/Xlibint.h
+%{_includedir}/X11/Xlib-xcb.h
+%{_includedir}/X11/Xlocale.h
+%{_includedir}/X11/Xregion.h
+%{_includedir}/X11/Xresource.h
+%{_includedir}/X11/Xutil.h
+%{_includedir}/X11/cursorfont.h
+%{_libdir}/libX11.so
+%{_libdir}/libX11-xcb.so
+%{_libdir}/pkgconfig/x11.pc
+%{_libdir}/pkgconfig/x11-xcb.pc
+#%{_mandir}/man3/*.3*
+#%{_mandir}/man5/*.5*
+/usr/share/license/%{name}-devel
diff --git a/specs/Makefile.am b/specs/Makefile.am
new file mode 100644 (file)
index 0000000..6d49014
--- /dev/null
@@ -0,0 +1,24 @@
+#
+# Copyright (c) 2010, 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.
+#
+
+SUBDIRS=libX11 i18n XIM XKB
diff --git a/specs/XIM/Makefile.am b/specs/XIM/Makefile.am
new file mode 100644 (file)
index 0000000..68b0b3f
--- /dev/null
@@ -0,0 +1,23 @@
+
+if ENABLE_SPECS
+
+# Main DocBook/XML files (DOCTYPE book)
+docbook = xim.xml
+
+# Included chapters, appendix, images
+chapters =                             \
+       dynamicflowsampleseq.svg        \
+       dynamicflow.svg                 \
+       eventflow.svg                   \
+       sampleprotocolflow1.svg         \
+       sampleprotocolflow2.svg         \
+       staticflowsampleseq.svg         \
+       staticflow.svg
+
+# The location where the DocBook/XML files and their generated formats are installed
+shelfdir = $(docdir)/XIM
+
+# Generate DocBook/XML output formats with or without stylesheets
+include $(top_srcdir)/docbook.am
+
+endif ENABLE_SPECS
diff --git a/specs/XIM/dynamicflow.svg b/specs/XIM/dynamicflow.svg
new file mode 100644 (file)
index 0000000..3da606f
--- /dev/null
@@ -0,0 +1,294 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="575.96063"
+   height="277.7157"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.47 r22583"
+   sodipodi:docname="dynamicflow.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path3695"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.7"
+     inkscape:cx="217.60452"
+     inkscape:cy="141.45567"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="pt"
+     inkscape:window-width="675"
+     inkscape:window-height="567"
+     inkscape:window-x="31"
+     inkscape:window-y="48"
+     inkscape:window-maximized="0" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-21.177732,-766.10217)">
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="120"
+       y="775.21936"
+       id="text2816"><tspan
+         sodipodi:role="line"
+         id="tspan2818"
+         x="120"
+         y="775.21936">IM Library</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="362.28571"
+       y="775.79077"
+       id="text2820"><tspan
+         sodipodi:role="line"
+         id="tspan2822"
+         x="362.28571"
+         y="775.79077">IM Server</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="19.999998"
+       y="825.79077"
+       id="text2824"><tspan
+         sodipodi:role="line"
+         id="tspan2826"
+         x="19.999998"
+         y="825.79077">Keys in the on-key-list</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="22.571426"
+       y="871.21936"
+       id="text2828"><tspan
+         sodipodi:role="line"
+         id="tspan2830"
+         x="22.571426"
+         y="871.21936">event mask is changed</tspan><tspan
+         sodipodi:role="line"
+         x="22.571426"
+         y="886.21936"
+         id="tspan2832">to deselect the event</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="31.14286"
+       y="1025.2195"
+       id="text2834"><tspan
+         sodipodi:role="line"
+         id="tspan2836"
+         x="31.14286"
+         y="1025.2195">event mask is changed</tspan><tspan
+         sodipodi:role="line"
+         x="31.14286"
+         y="1040.2195"
+         id="tspan2838">to select the event</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="192.85715"
+       y="863.79077"
+       id="text2844"><tspan
+         sodipodi:role="line"
+         id="tspan2846"
+         x="192.85715"
+         y="863.79077">XIM_EXT_SET_EVENT_MASK</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="206.84494"
+       y="876.07648"
+       id="text2848"><tspan
+         sodipodi:role="line"
+         id="tspan2850"
+         x="206.84494"
+         y="876.07648"
+         style="font-size:10px">intercept-event-mask is set</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="192.85715"
+       y="1026.3622"
+       id="text2852"><tspan
+         sodipodi:role="line"
+         id="tspan2854"
+         x="192.85715"
+         y="1026.3622">XIM_EXT_SET_EVENT_MASK</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="214.70139"
+       y="1039.5051"
+       id="text2856"><tspan
+         sodipodi:role="line"
+         id="tspan2858"
+         x="214.70139"
+         y="1039.5051"
+         style="font-size:10px">select-event-mask is set</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="419.71429"
+       y="875.21936"
+       id="text2860"><tspan
+         sodipodi:role="line"
+         id="tspan2862"
+         x="419.71429"
+         y="875.21936">event mask is changed</tspan><tspan
+         sodipodi:role="line"
+         x="419.71429"
+         y="890.21936"
+         id="tspan2864">to select the event</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="418.85712"
+       y="957.21936"
+       id="text2866"><tspan
+         sodipodi:role="line"
+         id="tspan2868"
+         x="418.85712"
+         y="957.21936">X events directly come</tspan><tspan
+         sodipodi:role="line"
+         x="418.85712"
+         y="972.21936"
+         id="tspan2870">to the IM Server</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="422.85712"
+       y="996.07648"
+       id="text2872"><tspan
+         sodipodi:role="line"
+         id="tspan2874"
+         x="422.85712"
+         y="996.07648">when preediting is turned off</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="423.42859"
+       y="1028.6479"
+       id="text2876"><tspan
+         sodipodi:role="line"
+         id="tspan2878"
+         x="423.42859"
+         y="1028.6479">event mask is changed</tspan><tspan
+         sodipodi:role="line"
+         x="423.42859"
+         y="1043.6479"
+         id="tspan2880">to deselect the event</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 181.42857,780.93364 c 0,239.99996 0,248.57146 0,248.57146"
+       id="path2882" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 367.14286,783.21935 c 0,244.28575 0,242.85715 0,242.85715"
+       id="path2884" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-end:url(#Arrow1Lend)"
+       d="m 92.857143,77.142857 79.999997,0"
+       id="path2886"
+       transform="translate(0,752.36221)"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="m 192.85714,82.857143 162.85715,1.428571"
+       id="path2888"
+       transform="translate(0,752.36221)"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="m 352.85714,94.285714 -160,1.428572"
+       id="path2890"
+       transform="translate(0,752.36221)"
+       inkscape:connector-type="polyline" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="202.60631"
+       y="827.71936"
+       id="text2854"><tspan
+         sodipodi:role="line"
+         id="tspan2856"
+         x="202.60631"
+         y="827.71936">XIM_TRIGGER_NOTIFY</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="186.89201"
+       y="902.86224"
+       id="text2858"><tspan
+         sodipodi:role="line"
+         id="tspan2860"
+         x="186.89201"
+         y="902.86224">XIM_TRIGGER_NOTIFY_REPLY</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="m 322.85714,145.3315 -151.42857,0"
+       id="path2918"
+       transform="translate(21.177732,766.10217)"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="m 327.14286,235.3315 -150,-1.42858"
+       id="path3892"
+       transform="translate(21.177732,766.10217)"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="M 447.14286,166.76007 378.57143,165.3315"
+       id="path3894"
+       transform="translate(21.177732,766.10217)"
+       inkscape:connector-type="polyline" />
+  </g>
+</svg>
diff --git a/specs/XIM/dynamicflowsampleseq.svg b/specs/XIM/dynamicflowsampleseq.svg
new file mode 100644 (file)
index 0000000..305f16c
--- /dev/null
@@ -0,0 +1,436 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="502.63379"
+   height="290.44269"
+   id="svg4341"
+   version="1.1"
+   inkscape:version="0.47 r22583"
+   sodipodi:docname="dynamicflowsampleseq.svg">
+  <defs
+     id="defs4343">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective4349" />
+    <inkscape:perspective
+       id="perspective4272"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path3695"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker4278"
+       style="overflow:visible">
+      <path
+         id="path4280"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker4282"
+       style="overflow:visible">
+      <path
+         id="path4284"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker4286"
+       style="overflow:visible">
+      <path
+         id="path4288"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker4290"
+       style="overflow:visible">
+      <path
+         id="path4292"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker4294"
+       style="overflow:visible">
+      <path
+         id="path4296"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective2877"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-3"
+       style="overflow:visible">
+      <path
+         id="path3695-7"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective2905"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-31"
+       style="overflow:visible">
+      <path
+         id="path3695-4"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective2937"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-8"
+       style="overflow:visible">
+      <path
+         id="path3695-9"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.35"
+     inkscape:cx="362.98032"
+     inkscape:cy="-207.27231"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="677"
+     inkscape:window-height="660"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="0"
+     inkscape:snap-nodes="false" />
+  <metadata
+     id="metadata4346">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-12.019684,-34.647186)">
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="110.84195"
+       y="43.764374"
+       id="text2816"><tspan
+         sodipodi:role="line"
+         id="tspan2818"
+         x="110.84195"
+         y="43.764374">IM Library</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="353.12766"
+       y="44.335777"
+       id="text2820"><tspan
+         sodipodi:role="line"
+         id="tspan2822"
+         x="353.12766"
+         y="44.335777">IM Server</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="10.841949"
+       y="94.335777"
+       id="text2824"><tspan
+         sodipodi:role="line"
+         id="tspan2826"
+         x="10.841949"
+         y="94.335777">Keys in the on-key-list</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="183.6991"
+       y="132.33578"
+       id="text2844"><tspan
+         sodipodi:role="line"
+         id="tspan2846"
+         x="183.6991"
+         y="132.33578">XIM_EXT_SET_EVENT_MASK</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="197.68689"
+       y="144.62149"
+       id="text2848"><tspan
+         sodipodi:role="line"
+         id="tspan2850"
+         x="197.68689"
+         y="144.62149"
+         style="font-size:10px">intercept-event-mask is set</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="183.6991"
+       y="260.90723"
+       id="text2852"><tspan
+         sodipodi:role="line"
+         id="tspan2854"
+         x="183.6991"
+         y="260.90723">XIM_EXT_SET_EVENT_MASK</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="205.54333"
+       y="274.05017"
+       id="text2856"><tspan
+         sodipodi:role="line"
+         id="tspan2858"
+         x="205.54333"
+         y="274.05017"
+         style="font-size:10px">select-event-mask is set</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1.05025411px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 172.27052,49.53018 c 0,264.72805 0,274.18271 0,274.18271"
+       id="path2882" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1.05972767px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 357.98481,51.82588 c 0,274.33848 0,272.73413 0,272.73413"
+       id="path2884" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-end:url(#Arrow1Lend)"
+       d="m 83.6991,98.05008 79.99999,0"
+       id="path2886"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="m 183.69909,103.76437 162.85715,1.42857"
+       id="path2888"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="m 343.69909,115.19294 -160,1.42857"
+       id="path2890"
+       inkscape:connector-type="polyline" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="193.44826"
+       y="96.264374"
+       id="text2854"><tspan
+         sodipodi:role="line"
+         id="tspan2856"
+         x="193.44826"
+         y="96.264374">XIM_TRIGGER_NOTIFY</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="m 339.16254,235.97868 -150,-1.42858"
+       id="path3892"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="m 443.16254,227.40725 -68.57143,-1.42857"
+       id="path3894"
+       inkscape:connector-type="polyline" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="28.571426"
+       y="148.21933"
+       id="text4489"><tspan
+         sodipodi:role="line"
+         id="tspan4491"
+         x="28.571426"
+         y="148.21933">the specified events</tspan><tspan
+         sodipodi:role="line"
+         x="28.571426"
+         y="163.21933"
+         id="tspan4493">are being filtered</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="24.571426"
+       y="221.36218"
+       id="text4495"><tspan
+         sodipodi:role="line"
+         id="tspan4497"
+         x="24.571426"
+         y="221.36218">Keys in the off-key-list</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="19.428574"
+       y="300.79077"
+       id="text4499"><tspan
+         sodipodi:role="line"
+         id="tspan4501"
+         x="19.428574"
+         y="300.79077">the specified events</tspan><tspan
+         sodipodi:role="line"
+         x="19.428574"
+         y="315.79077"
+         id="tspan4503">are being processed</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="382.57144"
+       y="98.647888"
+       id="text4505"><tspan
+         sodipodi:role="line"
+         id="tspan4507"
+         x="382.57144"
+         y="98.647888">Keys in the on-key-list</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="383.42691"
+       y="148.21933"
+       id="text4513"><tspan
+         sodipodi:role="line"
+         id="tspan4515"
+         x="383.42691"
+         y="148.21933">the specified events</tspan><tspan
+         sodipodi:role="line"
+         x="383.42691"
+         y="163.21933"
+         id="tspan4517">are being processed</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="382.57144"
+       y="221.36218"
+       id="text4519"><tspan
+         sodipodi:role="line"
+         id="tspan4521"
+         x="382.57144"
+         y="221.36218">Keys in the off-key-list</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="383.42691"
+       y="300.79077"
+       id="text4523"><tspan
+         sodipodi:role="line"
+         id="tspan4525"
+         x="383.42691"
+         y="300.79077">the specified events</tspan><tspan
+         sodipodi:role="line"
+         x="383.42691"
+         y="315.79077"
+         id="tspan4527">are being discarded</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="m 436.85714,105.78486 -68.57143,-1.42857"
+       id="path3894-2"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-end:url(#Arrow1Lend)"
+       d="m 79.14286,230.6479 79.99999,0"
+       id="path2886-9"
+       inkscape:connector-type="polyline" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="177.14285"
+       y="175.50504"
+       id="text2925"><tspan
+         sodipodi:role="line"
+         id="tspan2927"
+         x="177.14285"
+         y="175.50504">XIM_TRIGGER_NOTIFY_REPLY</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="m 339.28571,189.37172 -150,-1.42858"
+       id="path3892-4"
+       inkscape:connector-type="polyline" />
+  </g>
+</svg>
diff --git a/specs/XIM/eventflow.svg b/specs/XIM/eventflow.svg
new file mode 100644 (file)
index 0000000..e2146b4
--- /dev/null
@@ -0,0 +1,314 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="224.5"
+   height="216.0125"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.47 r22583"
+   sodipodi:docname="eventflow.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path3665"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(0.8,0,0,0.8,10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path3668"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend"
+       style="overflow:visible">
+      <path
+         id="path3686"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend"
+       style="overflow:visible">
+      <path
+         id="path3692"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)" />
+    </marker>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+    <inkscape:perspective
+       id="perspective4496"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-2"
+       style="overflow:visible">
+      <path
+         id="path3668-0"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective4537"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-1"
+       style="overflow:visible">
+      <path
+         id="path3668-6"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective4955"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-14"
+       style="overflow:visible">
+      <path
+         id="path3668-7"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.5570699"
+     inkscape:cx="130.77268"
+     inkscape:cy="93.49857"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="746"
+     inkscape:window-height="745"
+     inkscape:window-x="452"
+     inkscape:window-y="11"
+     inkscape:window-maximized="0"
+     units="pt" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-4.4747047,45.51725)">
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.31376761;stroke-opacity:1"
+       id="rect2818"
+       width="134.02251"
+       height="66.196053"
+       x="52.050224"
+       y="-17.612656"
+       ry="3.8066549" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.32876641;stroke-opacity:1"
+       id="rect2820"
+       width="85.332054"
+       height="22.29335"
+       x="93.551544"
+       y="21.494766"
+       ry="3.8002031" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.21471952;stroke-opacity:1"
+       id="rect2861"
+       width="76.668564"
+       height="28.791061"
+       x="91.898651"
+       y="70.911148"
+       ry="2.6885254" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.20091781;stroke-opacity:1"
+       id="rect2878"
+       width="72.692574"
+       height="24.815073"
+       x="63.165215"
+       y="119.57973"
+       ry="1.8175722" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.16700821px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="m 191.35869,-129.09736 0,-20.41139"
+       id="path2888-8"
+       inkscape:connector-type="polyline" />
+    <g
+       id="g5177"
+       transform="matrix(0.27928539,0,0,0.27928539,11.337125,-81.727333)">
+      <path
+         inkscape:connector-type="polyline"
+         id="path2888"
+         d="m 218.57142,720.35677 0,-251.23328"
+         style="fill:none;stroke:#000000;stroke-width:1.07757151px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)" />
+      <path
+         inkscape:connector-type="polyline"
+         id="path2888-3"
+         d="m 335.37064,546.2675 0,-200.11997"
+         style="fill:none;stroke:#000000;stroke-width:0.96785825px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Lstart);marker-end:none" />
+      <path
+         inkscape:connector-type="polyline"
+         id="path2888-82"
+         d="m 219.2031,466.56824 0,-120.80758"
+         style="fill:none;stroke:#000000;stroke-width:0.76102072px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:none" />
+      <path
+         inkscape:connector-type="polyline"
+         id="path5175"
+         d="m 219.26527,346.32772 116.0432,0.38074"
+         style="fill:none;stroke:#000000;stroke-width:1.12434793px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:3.62546563px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="67.625397"
+       y="136.94441"
+       id="text2865"><tspan
+         sodipodi:role="line"
+         id="tspan2867"
+         x="67.625397"
+         y="136.94441"
+         style="font-size:14.50186253px">X Server</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:3.35142469px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="17.946682"
+       y="107.43233"
+       id="text2869"><tspan
+         sodipodi:role="line"
+         id="tspan2871"
+         x="17.946682"
+         y="107.43233"
+         style="font-size:6.14427853px">Backend Method</tspan><tspan
+         sodipodi:role="line"
+         x="17.946682"
+         y="115.11268"
+         style="font-size:6.14427853px"
+         id="tspan2873">(Core)</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:3.35142469px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="130.79489"
+       y="107.07356"
+       id="text2875"><tspan
+         sodipodi:role="line"
+         id="tspan2877"
+         x="130.79489"
+         y="107.07356"
+         style="font-size:6.14427853px">Frontend Method</tspan><tspan
+         sodipodi:role="line"
+         x="130.79489"
+         y="114.75391"
+         id="tspan2879"
+         style="font-size:6.14427853px">(Extension)</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:3.71718764px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="94.060638"
+       y="91.657791"
+       id="text2881"><tspan
+         sodipodi:role="line"
+         id="tspan2883"
+         x="94.060638"
+         y="91.657791"
+         style="font-size:14.86875057px">IM Server</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:3.35142469px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="118.23929"
+       y="37.838333"
+       id="text2890"><tspan
+         sodipodi:role="line"
+         id="tspan2892"
+         x="118.23929"
+         y="37.838333"
+         style="font-size:13.40569878px">Library</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:3.35142469px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="58.689751"
+       y="1.2476349"
+       id="text2899"><tspan
+         sodipodi:role="line"
+         id="tspan2901"
+         x="58.689751"
+         y="1.2476349"
+         style="font-size:13.40569878px">Application</tspan></text>
+  </g>
+</svg>
diff --git a/specs/XIM/sampleprotocolflow1.svg b/specs/XIM/sampleprotocolflow1.svg
new file mode 100644 (file)
index 0000000..6378a1d
--- /dev/null
@@ -0,0 +1,939 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="382.78897"
+   height="202.96555"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.47 r22583"
+   sodipodi:docname="sampleprotocolflow1.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow2Mstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mstart"
+       style="overflow:visible">
+      <path
+         id="path4867"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(0.6,0.6)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend"
+       style="overflow:visible">
+      <path
+         id="path4870"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Send"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Send"
+       style="overflow:visible">
+      <path
+         id="path4858"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path3946"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(0.8,0,0,0.8,10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path3949"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+    <inkscape:perspective
+       id="perspective4399"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-6"
+       style="overflow:visible">
+      <path
+         id="path3949-6"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective4427"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-1"
+       style="overflow:visible">
+      <path
+         id="path3949-1"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective4455"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-9"
+       style="overflow:visible">
+      <path
+         id="path3949-69"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective4483"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-5"
+       style="overflow:visible">
+      <path
+         id="path3949-4"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective4483-6"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-52"
+       style="overflow:visible">
+      <path
+         id="path3949-44"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective4524"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-0"
+       style="overflow:visible">
+      <path
+         id="path3949-7"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective4946"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective4985"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective5010"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective5254"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-0-8"
+       style="overflow:visible">
+      <path
+         id="path3949-7-3"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective5282"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-0-9"
+       style="overflow:visible">
+      <path
+         id="path3949-7-9"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective5512"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-0-9-9"
+       style="overflow:visible">
+      <path
+         id="path3949-7-9-5"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective5540"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-0-9-1"
+       style="overflow:visible">
+      <path
+         id="path3949-7-9-1"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective5568"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-0-5"
+       style="overflow:visible">
+      <path
+         id="path3949-7-5"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective5598"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-0-6"
+       style="overflow:visible">
+      <path
+         id="path3949-7-7"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective5632"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-0-0"
+       style="overflow:visible">
+      <path
+         id="path3949-7-39"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective6084"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-0-9-3"
+       style="overflow:visible">
+      <path
+         id="path3949-7-9-6"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective6112"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-50"
+       style="overflow:visible">
+      <path
+         id="path3949-64"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective6140"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-4"
+       style="overflow:visible">
+      <path
+         id="path3949-3"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective6828"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-4-0"
+       style="overflow:visible">
+      <path
+         id="path3949-3-4"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective4760"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-14"
+       style="overflow:visible">
+      <path
+         id="path3949-447"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective4818"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-0-2"
+       style="overflow:visible">
+      <path
+         id="path3949-7-58"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective3436"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.28"
+     inkscape:cx="191.3945"
+     inkscape:cy="47.71932"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1000"
+     inkscape:window-height="704"
+     inkscape:window-x="11"
+     inkscape:window-y="25"
+     inkscape:window-maximized="0"
+     units="pt"
+     borderlayer="true" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-47.418246,-76.438428)">
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="46.783585"
+       y="95.48922"
+       id="text2816"><tspan
+         sodipodi:role="line"
+         id="tspan2818"
+         x="46.783585"
+         y="95.48922">Key event</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="46.783585"
+       y="127.36035"
+       id="text2820"><tspan
+         sodipodi:role="line"
+         id="tspan2822"
+         x="46.783585"
+         y="127.36035">Key event</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="145.80858"
+       y="81.978302"
+       id="text2830"><tspan
+         sodipodi:role="line"
+         id="tspan2832"
+         x="145.80858"
+         y="81.978302">Xib API</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="235.207"
+       y="81.351532"
+       id="text2834"><tspan
+         sodipodi:role="line"
+         id="tspan2836"
+         x="235.207"
+         y="81.351532">IM library</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="133.49124"
+       y="93.73336"
+       id="text2838"><tspan
+         sodipodi:role="line"
+         id="tspan2840"
+         x="133.49124"
+         y="93.73336">XNextEvent</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="133.49124"
+       y="101.95583"
+       id="text2842"><tspan
+         sodipodi:role="line"
+         id="tspan2844"
+         x="133.49124"
+         y="101.95583">XFilterEvent</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="133.49124"
+       y="127.98712"
+       id="text2846"><tspan
+         sodipodi:role="line"
+         id="tspan2848"
+         x="133.49124"
+         y="127.98712">XNextEvent</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="133.49124"
+       y="135.05867"
+       id="text2850"><tspan
+         sodipodi:role="line"
+         id="tspan2852"
+         x="133.49124"
+         y="135.05867">XFilterEvent</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="133.49124"
+       y="162.35158"
+       id="text2854"><tspan
+         sodipodi:role="line"
+         id="tspan2856"
+         x="133.49124"
+         y="162.35158">XNextEvent</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="133.49124"
+       y="170.35785"
+       id="text2858"><tspan
+         sodipodi:role="line"
+         id="tspan2860"
+         x="133.49124"
+         y="170.35785">XFilterEvent(returns False)</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="133.49124"
+       y="179.28792"
+       id="text2862"><tspan
+         sodipodi:role="line"
+         id="tspan2864"
+         x="133.49124"
+         y="179.28792">XmbLookupString</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="272.31775"
+       y="101.96278"
+       id="text2899"><tspan
+         sodipodi:role="line"
+         id="tspan2901"
+         x="272.31775"
+         y="101.96278">XIM_FORWARD_EVENT</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="272.31775"
+       y="123.1926"
+       id="text2903"><tspan
+         sodipodi:role="line"
+         id="tspan2905"
+         x="272.31775"
+         y="123.1926">XIM_FORWARD_EVENT</tspan><tspan
+         sodipodi:role="line"
+         x="272.31775"
+         y="131.27585"
+         id="tspan2907">or XIM_COMMIT</tspan><tspan
+         sodipodi:role="line"
+         x="272.31775"
+         y="139.35912"
+         id="tspan2909">(synchronous)</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="272.31775"
+       y="160.72026"
+       id="text2911"><tspan
+         sodipodi:role="line"
+         id="tspan2913"
+         x="272.31775"
+         y="160.72026">XIM_FORWARD_EVENT</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="292.59851"
+       y="199.99501"
+       id="text2915"><tspan
+         sodipodi:role="line"
+         id="tspan2917"
+         x="292.59851"
+         y="199.99501">XIM_SYNC</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="281.20618"
+       y="211.76923"
+       id="text2919"><tspan
+         sodipodi:role="line"
+         id="tspan2921"
+         x="281.20618"
+         y="211.76923">XIM_SYNC_REPLY</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="277.69659"
+       y="228.37003"
+       id="text2933"><tspan
+         sodipodi:role="line"
+         id="tspan2935"
+         x="277.69659"
+         y="228.37003">XIM_SET_IC_FOCUS</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="272.31775"
+       y="244.28534"
+       id="text2937"><tspan
+         sodipodi:role="line"
+         id="tspan2939"
+         x="272.31775"
+         y="244.28534">XIM_SYNC_REPLY as</tspan><tspan
+         sodipodi:role="line"
+         x="272.31775"
+         y="252.36859"
+         id="tspan2941">a reply of the </tspan><tspan
+         sodipodi:role="line"
+         x="272.31775"
+         y="260.45184"
+         id="tspan2943">XIM_FORWARD_EVENT</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="347.37851"
+       y="81.921471"
+       id="text2953"><tspan
+         sodipodi:role="line"
+         id="tspan2955"
+         x="347.37851"
+         y="81.921471">IM Server</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="358.27658"
+       y="119.92648"
+       id="text2957"><tspan
+         sodipodi:role="line"
+         id="tspan2959"
+         x="358.27658"
+         y="119.92648">synchronous</tspan><tspan
+         sodipodi:role="line"
+         x="358.27658"
+         y="128.00974"
+         id="tspan2961">request</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="358.07132"
+       y="210.28015"
+       id="text2967"><tspan
+         sodipodi:role="line"
+         id="tspan2969"
+         x="358.07132"
+         y="210.28015">processed</tspan><tspan
+         sodipodi:role="line"
+         x="358.07132"
+         y="218.3634"
+         id="tspan2971">(The focused</tspan><tspan
+         sodipodi:role="line"
+         x="358.07132"
+         y="226.44667"
+         id="tspan2973">IC is changed)</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="358.03976"
+       y="238.10788"
+       id="text2975"><tspan
+         sodipodi:role="line"
+         id="tspan2977"
+         x="358.03976"
+         y="238.10788">processed</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="358.03976"
+       y="268.33426"
+       id="text2979"><tspan
+         sodipodi:role="line"
+         id="tspan2981"
+         x="358.03976"
+         y="268.33426">processed</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.53888369px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);display:inline"
+       d="m 264.36299,105.03516 79.29289,9.23801"
+       id="path2987"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.53888369px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);display:inline"
+       d="m 268.13518,142.12302 79.29289,9.23801"
+       id="path2987-1"
+       inkscape:connector-type="polyline" />
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="133.49124"
+       y="204.28122"
+       id="text2866-5"><tspan
+         sodipodi:role="line"
+         id="tspan2868-5"
+         x="133.49124"
+         y="204.28122">XSetICFocus</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="133.49124"
+       y="245.50015"
+       id="text2846-4"><tspan
+         sodipodi:role="line"
+         id="tspan2848-7"
+         x="133.49124"
+         y="245.50015">XNextEvent</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.53888369px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-0);display:inline"
+       d="M 81.199995,92.94869 124.20402,92.404331"
+       id="path5048"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.53888369px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-0);display:inline"
+       d="m 83.759014,126.12468 43.004026,-0.54436"
+       id="path5048-6"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.53888369px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-0-9);display:inline"
+       d="m 174.28465,99.364052 87.64112,4.899188"
+       id="path5302"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.53888369px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-0-9)"
+       d="m 173.9906,134.66938 87.64111,6.53226"
+       id="path5302-2"
+       inkscape:connector-type="polyline" />
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="48.236271"
+       y="192.34102"
+       id="text5618"><tspan
+         sodipodi:role="line"
+         id="tspan5620"
+         x="48.236271"
+         y="192.34102">Application moves</tspan><tspan
+         sodipodi:role="line"
+         x="48.236271"
+         y="200.42427"
+         id="tspan5622">the focus</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.58549535px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-4)"
+       d="m 402.38807,157.92589 c 61.85166,62.00083 0.1653,103.10771 0,103.2156 l -3.85389,2.11508"
+       id="path6164-3"
+       sodipodi:nodetypes="ccc" />
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="360.99832"
+       y="155.02936"
+       id="text6848"><tspan
+         sodipodi:role="line"
+         id="tspan6850"
+         x="360.99832"
+         y="155.02936">Pending</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend);display:inline"
+       d="m 295.71429,348.34463 -72.85715,25"
+       id="path4838"
+       transform="translate(47.418246,-223.55662)"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend);display:inline"
+       d="m 212.14286,376.91606 -80.71429,5"
+       id="path6508"
+       transform="translate(47.418246,-223.55662)"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
+       d="M 218.57143,426.20177 300,424.7732"
+       id="path6746"
+       transform="translate(47.418246,-223.55662)"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-end:url(#Arrow2Mend)"
+       d="M 299.28571,439.05892 220,438.34463"
+       id="path6748"
+       transform="translate(47.418246,-223.55662)"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
+       d="m 220,451.91606 77.85714,9.28571"
+       id="path6750"
+       transform="translate(47.418246,-223.55662)"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
+       d="m 220,485.48749 80.71429,7.14285"
+       id="path6752"
+       transform="translate(47.418246,-223.55662)"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
+       d="m 140.71429,426.20177 71.42857,-2.14285"
+       id="path6754"
+       transform="translate(47.418246,-223.55662)"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
+       d="m 78.571429,400.48749 -41.428572,1.42857"
+       id="path6758"
+       transform="translate(47.418246,-223.55662)"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
+       d="m 136.42857,466.20177 75.71429,16.42857"
+       id="path8600"
+       transform="translate(47.418246,-223.55662)"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 216.73325,9.5118041 c 0.67941,192.9537359 0.67941,192.9537359 0.67941,192.9537359 l 0,0 0,0"
+       id="path3426"
+       transform="translate(47.418246,76.438428)" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 350.47303,85.950232 c 0.67941,192.953738 0.67941,192.953738 0.67941,192.953738 l 0,0 0,0"
+       id="path3426-4" />
+  </g>
+</svg>
diff --git a/specs/XIM/sampleprotocolflow2.svg b/specs/XIM/sampleprotocolflow2.svg
new file mode 100644 (file)
index 0000000..69217b1
--- /dev/null
@@ -0,0 +1,997 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="380.64612"
+   height="310.49246"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.47 r22583"
+   sodipodi:docname="sampleprotocolflow2.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path3946"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(0.8,0,0,0.8,10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path3949"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+    <inkscape:perspective
+       id="perspective4399"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-6"
+       style="overflow:visible">
+      <path
+         id="path3949-6"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective4427"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-1"
+       style="overflow:visible">
+      <path
+         id="path3949-1"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective4455"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-9"
+       style="overflow:visible">
+      <path
+         id="path3949-69"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective4483"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-5"
+       style="overflow:visible">
+      <path
+         id="path3949-4"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective4483-6"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-52"
+       style="overflow:visible">
+      <path
+         id="path3949-44"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective4524"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-0"
+       style="overflow:visible">
+      <path
+         id="path3949-7"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective4946"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective4985"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective5010"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective5254"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-0-8"
+       style="overflow:visible">
+      <path
+         id="path3949-7-3"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective5282"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-0-9"
+       style="overflow:visible">
+      <path
+         id="path3949-7-9"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective5512"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-0-9-9"
+       style="overflow:visible">
+      <path
+         id="path3949-7-9-5"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective5540"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-0-9-1"
+       style="overflow:visible">
+      <path
+         id="path3949-7-9-1"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective5568"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-0-5"
+       style="overflow:visible">
+      <path
+         id="path3949-7-5"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective5598"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-0-6"
+       style="overflow:visible">
+      <path
+         id="path3949-7-7"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective5632"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-0-0"
+       style="overflow:visible">
+      <path
+         id="path3949-7-39"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective6084"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-0-9-3"
+       style="overflow:visible">
+      <path
+         id="path3949-7-9-6"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective6112"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-50"
+       style="overflow:visible">
+      <path
+         id="path3949-64"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective6140"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-4"
+       style="overflow:visible">
+      <path
+         id="path3949-3"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective6828"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-4-0"
+       style="overflow:visible">
+      <path
+         id="path3949-3-4"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.7"
+     inkscape:cx="190.40212"
+     inkscape:cy="129.5884"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1000"
+     inkscape:window-height="704"
+     inkscape:window-x="11"
+     inkscape:window-y="25"
+     inkscape:window-maximized="0" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-47.418246,-76.438428)">
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="46.783585"
+       y="95.48922"
+       id="text2816"><tspan
+         sodipodi:role="line"
+         id="tspan2818"
+         x="46.783585"
+         y="95.48922">Key event</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="46.783585"
+       y="127.36035"
+       id="text2820"><tspan
+         sodipodi:role="line"
+         id="tspan2822"
+         x="46.783585"
+         y="127.36035">Key event</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="145.80858"
+       y="81.978302"
+       id="text2830"><tspan
+         sodipodi:role="line"
+         id="tspan2832"
+         x="145.80858"
+         y="81.978302">Xib API</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="235.207"
+       y="81.351532"
+       id="text2834"><tspan
+         sodipodi:role="line"
+         id="tspan2836"
+         x="235.207"
+         y="81.351532">IM library</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="133.49124"
+       y="93.73336"
+       id="text2838"><tspan
+         sodipodi:role="line"
+         id="tspan2840"
+         x="133.49124"
+         y="93.73336">XNextEvent</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="133.49124"
+       y="101.95583"
+       id="text2842"><tspan
+         sodipodi:role="line"
+         id="tspan2844"
+         x="133.49124"
+         y="101.95583">XFilterEvent</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="133.49124"
+       y="127.98712"
+       id="text2846"><tspan
+         sodipodi:role="line"
+         id="tspan2848"
+         x="133.49124"
+         y="127.98712">XNextEvent</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="133.49124"
+       y="135.05867"
+       id="text2850"><tspan
+         sodipodi:role="line"
+         id="tspan2852"
+         x="133.49124"
+         y="135.05867">XFilterEvent</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="133.49124"
+       y="214.35158"
+       id="text2854"><tspan
+         sodipodi:role="line"
+         id="tspan2856"
+         x="133.49124"
+         y="214.35158">XNextEvent</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="133.49124"
+       y="222.35785"
+       id="text2858"><tspan
+         sodipodi:role="line"
+         id="tspan2860"
+         x="133.49124"
+         y="222.35785">XFilterEvent(returns False)</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="133.49124"
+       y="231.28792"
+       id="text2862"><tspan
+         sodipodi:role="line"
+         id="tspan2864"
+         x="133.49124"
+         y="231.28792">XmbLookupString</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="131.33569"
+       y="156.61403"
+       id="text2866"><tspan
+         sodipodi:role="line"
+         id="tspan2868"
+         x="131.33569"
+         y="156.61403">XSetICFocus</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.63770252px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 265.78566,87.858954 266.2312,384.03836"
+       id="path2895"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.68468785px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 350.18414,88.4268 1.48726,298.16174"
+       id="path2897"
+       inkscape:connector-type="polyline" />
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="272.31775"
+       y="101.96278"
+       id="text2899"><tspan
+         sodipodi:role="line"
+         id="tspan2901"
+         x="272.31775"
+         y="101.96278">XIM_FORWARD_EVENT</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="272.31775"
+       y="123.1926"
+       id="text2903"><tspan
+         sodipodi:role="line"
+         id="tspan2905"
+         x="272.31775"
+         y="123.1926">XIM_FORWARD_EVENT</tspan><tspan
+         sodipodi:role="line"
+         x="272.31775"
+         y="131.27585"
+         id="tspan2907">or XIM_COMMIT</tspan><tspan
+         sodipodi:role="line"
+         x="272.31775"
+         y="139.35912"
+         id="tspan2909">(synchronous)</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="272.31775"
+       y="160.72026"
+       id="text2911"><tspan
+         sodipodi:role="line"
+         id="tspan2913"
+         x="272.31775"
+         y="160.72026">XIM_FORWARD_EVENT</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="292.59851"
+       y="175.99501"
+       id="text2915"><tspan
+         sodipodi:role="line"
+         id="tspan2917"
+         x="292.59851"
+         y="175.99501">XIM_SYNC</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="281.20618"
+       y="197.76923"
+       id="text2919"><tspan
+         sodipodi:role="line"
+         id="tspan2921"
+         x="281.20618"
+         y="197.76923">XIM_SYNC_REPLY</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="272.31302"
+       y="218.45467"
+       id="text2923"><tspan
+         sodipodi:role="line"
+         id="tspan2925"
+         x="272.31302"
+         y="218.45467">XIM_SET_IC_FOCUS is</tspan><tspan
+         sodipodi:role="line"
+         x="272.31302"
+         y="226.53792"
+         id="tspan2927">pend because another </tspan><tspan
+         sodipodi:role="line"
+         x="272.31302"
+         y="234.62119"
+         id="tspan2929">sync cycle is started</tspan><tspan
+         sodipodi:role="line"
+         x="272.31302"
+         y="242.70444"
+         id="tspan2931">by XIM_COMMIT</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="277.69659"
+       y="260.37003"
+       id="text2933"><tspan
+         sodipodi:role="line"
+         id="tspan2935"
+         x="277.69659"
+         y="260.37003">XIM_SET_IC_FOCUS</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="272.31775"
+       y="302.28534"
+       id="text2937"><tspan
+         sodipodi:role="line"
+         id="tspan2939"
+         x="272.31775"
+         y="302.28534">XIM_SYNC_REPLY as</tspan><tspan
+         sodipodi:role="line"
+         x="272.31775"
+         y="310.36859"
+         id="tspan2941">a reply of the </tspan><tspan
+         sodipodi:role="line"
+         x="272.31775"
+         y="318.45184"
+         id="tspan2943">XIM_FORWARD_EVENT</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="277.69659"
+       y="346.37805"
+       id="text2945"><tspan
+         sodipodi:role="line"
+         id="tspan2947"
+         x="277.69659"
+         y="346.37805">XIM_SET_IC_FOCUS</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="272.31775"
+       y="376.79626"
+       id="text2949"><tspan
+         sodipodi:role="line"
+         id="tspan2951"
+         x="272.31775"
+         y="376.79626">XIM_FORWARD_EVENT</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="347.37851"
+       y="81.921471"
+       id="text2953"><tspan
+         sodipodi:role="line"
+         id="tspan2955"
+         x="347.37851"
+         y="81.921471">IM Server</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="358.27658"
+       y="119.92648"
+       id="text2957"><tspan
+         sodipodi:role="line"
+         id="tspan2959"
+         x="358.27658"
+         y="119.92648">synchronous</tspan><tspan
+         sodipodi:role="line"
+         x="358.27658"
+         y="128.00974"
+         id="tspan2961">request</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="357.9924"
+       y="153.67647"
+       id="text2963"><tspan
+         sodipodi:role="line"
+         id="tspan2965"
+         x="357.9924"
+         y="153.67647">Pending</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="358.07132"
+       y="272.28015"
+       id="text2967"><tspan
+         sodipodi:role="line"
+         id="tspan2969"
+         x="358.07132"
+         y="272.28015">processed</tspan><tspan
+         sodipodi:role="line"
+         x="358.07132"
+         y="280.3634"
+         id="tspan2971">(The focused</tspan><tspan
+         sodipodi:role="line"
+         x="358.07132"
+         y="288.44666"
+         id="tspan2973">IC is changed)</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="358.03976"
+       y="300.10788"
+       id="text2975"><tspan
+         sodipodi:role="line"
+         id="tspan2977"
+         x="358.03976"
+         y="300.10788">processed</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="358.03976"
+       y="332.33426"
+       id="text2979"><tspan
+         sodipodi:role="line"
+         id="tspan2981"
+         x="358.03976"
+         y="332.33426">processed</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="358.03976"
+       y="356.72079"
+       id="text2983"><tspan
+         sodipodi:role="line"
+         id="tspan2985"
+         x="358.03976"
+         y="356.72079">processed</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.53888369px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);display:inline"
+       d="m 264.36299,105.03516 79.29289,9.23801"
+       id="path2987"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.53888369px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);display:inline"
+       d="m 268.13518,142.12302 79.29289,9.23801"
+       id="path2987-1"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.53888369px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);display:inline"
+       d="m 269.52088,163.9863 79.29289,9.23801"
+       id="path2987-1-9"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.53888369px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);display:inline"
+       d="m 269.05898,262.06314 79.29289,9.238"
+       id="path2987-1-9-7"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.53888369px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);display:inline"
+       d="m 270.13675,321.80224 79.29289,9.23801"
+       id="path2987-1-9-7-2"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.53888369px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);display:inline"
+       d="m 270.13675,348.74643 79.29289,9.23801"
+       id="path2987-1-9-7-1"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.53888369px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);display:inline"
+       d="m 269.82882,357.06063 79.29289,9.23801"
+       id="path2987-1-9-7-1-2"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.53888369px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-0)"
+       d="m 341.34638,128.13018 -71.59455,48.49953"
+       id="path4544"
+       inkscape:connector-type="polyline" />
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="133.49124"
+       y="264.28122"
+       id="text2866-5"><tspan
+         sodipodi:role="line"
+         id="tspan2868-5"
+         x="133.49124"
+         y="264.28122">XSetICFocus</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="214.78569"
+       y="171.39485"
+       id="text4963"><tspan
+         sodipodi:role="line"
+         id="tspan4965"
+         x="214.78569"
+         y="171.39485">Pending until</tspan><tspan
+         sodipodi:role="line"
+         x="214.78569"
+         y="179.4781"
+         id="tspan4967">sync cycle is </tspan><tspan
+         sodipodi:role="line"
+         x="214.78569"
+         y="187.56137"
+         id="tspan4969">done</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="47.269844"
+       y="147.68396"
+       id="text4971"><tspan
+         sodipodi:role="line"
+         id="tspan4973"
+         x="47.269844"
+         y="147.68396">Button press causes</tspan><tspan
+         sodipodi:role="line"
+         x="47.269844"
+         y="155.76721"
+         id="tspan4975">focus change</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="58.639027"
+       y="305.18289"
+       id="text2820-7"><tspan
+         sodipodi:role="line"
+         id="tspan2822-8"
+         x="58.639027"
+         y="305.18289">Key event</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="141.03561"
+       y="303.50015"
+       id="text2846-4"><tspan
+         sodipodi:role="line"
+         id="tspan2848-7"
+         x="141.03561"
+         y="303.50015">XNextEvent</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="141.03561"
+       y="312.12228"
+       id="text2850-0"><tspan
+         sodipodi:role="line"
+         id="tspan2852-5"
+         x="141.03561"
+         y="312.12228">XFilterEvent</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.53888369px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-0);display:inline"
+       d="M 81.199995,92.94869 124.20402,92.404331"
+       id="path5048"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.53888369px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-0);display:inline"
+       d="m 83.759014,126.12468 43.004026,-0.54436"
+       id="path5048-6"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.47733891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-0);display:inline"
+       d="m 93.961564,154.29857 33.267186,-0.55213"
+       id="path5048-6-8"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.53888369px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-0-9);display:inline"
+       d="m 174.28465,99.364052 87.64112,4.899188"
+       id="path5302"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.53888369px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-0-9)"
+       d="m 173.9906,134.66938 87.64111,6.53226"
+       id="path5302-2"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.53888369px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-0-9)"
+       d="m 173.30399,155.50805 87.64112,6.53226"
+       id="path5302-2-7"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.53888369px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-0);display:inline"
+       d="m 349.43674,176.36427 -78.8013,16.6288"
+       id="path4544-3"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.53888369px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-0);display:inline"
+       d="m 264.3103,194.20137 -78.8013,16.6288"
+       id="path4544-3-2"
+       inkscape:connector-type="polyline" />
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="56.236271"
+       y="254.34102"
+       id="text5618"><tspan
+         sodipodi:role="line"
+         id="tspan5620"
+         x="56.236271"
+         y="254.34102">Application moves</tspan><tspan
+         sodipodi:role="line"
+         x="56.236271"
+         y="262.42429"
+         id="tspan5622">the focus</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.47733891px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Lstart);marker-end:none;display:inline"
+       d="m 97.227685,228.25112 33.267185,-0.55213"
+       id="path5048-6-8-8"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.53888369px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-0-9);display:inline"
+       d="m 180.54474,262.43681 84.64716,-0.31069"
+       id="path5302-2-7-2"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.53888369px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);display:inline"
+       d="m 182.81773,303.5919 78.56369,15.14712"
+       id="path2987-1-9-7-1-0"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.53888369px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);display:inline"
+       d="m 182.83763,311.31095 79.08814,42.81112"
+       id="path2987-1-9-7-1-0-3"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.5115177px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-4)"
+       d="m 258.76887,219.70748 c -40.77117,71.79102 -0.10897,119.38886 0,119.51377 l 2.18035,2.44906"
+       id="path6164"
+       sodipodi:nodetypes="ccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.6913743px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-4)"
+       d="m 400.28515,175.83598 c 61.64296,86.74506 0.16474,144.25751 0,144.40845 l -3.84089,2.9592"
+       id="path6164-3"
+       sodipodi:nodetypes="ccc" />
+    <text
+       xml:space="preserve"
+       style="font-size:6.46660471px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="360.99832"
+       y="175.02936"
+       id="text6848"><tspan
+         sodipodi:role="line"
+         id="tspan6850"
+         x="360.99832"
+         y="175.02936">Pending</tspan></text>
+  </g>
+</svg>
diff --git a/specs/XIM/staticflow.svg b/specs/XIM/staticflow.svg
new file mode 100644 (file)
index 0000000..3a50dde
--- /dev/null
@@ -0,0 +1,278 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="575.96063"
+   height="263.90292"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.47 r22583"
+   sodipodi:docname="staticflow.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path3695"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.7"
+     inkscape:cx="217.60452"
+     inkscape:cy="127.64289"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="pt"
+     inkscape:window-width="551"
+     inkscape:window-height="483"
+     inkscape:window-x="0"
+     inkscape:window-y="262"
+     inkscape:window-maximized="0" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-21.177732,-766.10217)">
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="120"
+       y="775.21936"
+       id="text2816"><tspan
+         sodipodi:role="line"
+         id="tspan2818"
+         x="120"
+         y="775.21936">IM Library</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="362.28571"
+       y="775.79077"
+       id="text2820"><tspan
+         sodipodi:role="line"
+         id="tspan2822"
+         x="362.28571"
+         y="775.79077">IM Server</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="19.999998"
+       y="825.79077"
+       id="text2824"><tspan
+         sodipodi:role="line"
+         id="tspan2826"
+         x="19.999998"
+         y="825.79077">Keys in the on-key-list</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="22.571426"
+       y="871.21936"
+       id="text2828"><tspan
+         sodipodi:role="line"
+         id="tspan2830"
+         x="22.571426"
+         y="871.21936">event mask is changed</tspan><tspan
+         sodipodi:role="line"
+         x="22.571426"
+         y="886.21936"
+         id="tspan2832">to deselect the event</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="31.14286"
+       y="993.21936"
+       id="text2834"><tspan
+         sodipodi:role="line"
+         id="tspan2836"
+         x="31.14286"
+         y="993.21936">event mask is changed</tspan><tspan
+         sodipodi:role="line"
+         x="31.14286"
+         y="1008.2194"
+         id="tspan2838">to select the event</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="208.14133"
+       y="832.36218"
+       id="text2840"><tspan
+         sodipodi:role="line"
+         id="tspan2842"
+         x="208.14133"
+         y="832.36218">XIM_FORWARD_EVENT</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="192.85715"
+       y="863.79077"
+       id="text2844"><tspan
+         sodipodi:role="line"
+         id="tspan2846"
+         x="192.85715"
+         y="863.79077">XIM_EXT_SET_EVENT_MASK</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="206.84494"
+       y="876.07648"
+       id="text2848"><tspan
+         sodipodi:role="line"
+         id="tspan2850"
+         x="206.84494"
+         y="876.07648"
+         style="font-size:10px">intercept-event-mask is set</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="192.85715"
+       y="994.36218"
+       id="text2852"><tspan
+         sodipodi:role="line"
+         id="tspan2854"
+         x="192.85715"
+         y="994.36218">XIM_EXT_SET_EVENT_MASK</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="214.70139"
+       y="1007.5051"
+       id="text2856"><tspan
+         sodipodi:role="line"
+         id="tspan2858"
+         x="214.70139"
+         y="1007.5051"
+         style="font-size:10px">select-event-mask is set</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="419.71429"
+       y="875.21936"
+       id="text2860"><tspan
+         sodipodi:role="line"
+         id="tspan2862"
+         x="419.71429"
+         y="875.21936">event mask is changed</tspan><tspan
+         sodipodi:role="line"
+         x="419.71429"
+         y="890.21936"
+         id="tspan2864">to select the event</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="418.85712"
+       y="925.21936"
+       id="text2866"><tspan
+         sodipodi:role="line"
+         id="tspan2868"
+         x="418.85712"
+         y="925.21936">X events directly come</tspan><tspan
+         sodipodi:role="line"
+         x="418.85712"
+         y="940.21936"
+         id="tspan2870">to the IM Server</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="422.85712"
+       y="964.07648"
+       id="text2872"><tspan
+         sodipodi:role="line"
+         id="tspan2874"
+         x="422.85712"
+         y="964.07648">when preediting is turned off</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="423.42859"
+       y="996.64789"
+       id="text2876"><tspan
+         sodipodi:role="line"
+         id="tspan2878"
+         x="423.42859"
+         y="996.64789">event mask is changed</tspan><tspan
+         sodipodi:role="line"
+         x="423.42859"
+         y="1011.6479"
+         id="tspan2880">to deselect the event</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 181.42857,780.93364 c 0,239.99996 0,248.57146 0,248.57146"
+       id="path2882" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 367.14286,783.21935 c 0,244.28575 0,242.85715 0,242.85715"
+       id="path2884" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-end:url(#Arrow1Lend)"
+       d="m 92.857143,77.142857 79.999997,0"
+       id="path2886"
+       transform="translate(0,752.36221)"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="m 192.85714,82.857143 162.85715,1.428571"
+       id="path2888"
+       transform="translate(0,752.36221)"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="m 352.85714,94.285714 -160,1.428572"
+       id="path2890"
+       transform="translate(0,752.36221)"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend);display:inline"
+       d="m 335.71429,220 -138.57143,0"
+       id="path2892"
+       transform="translate(0,752.36221)"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="m 472.85714,154.28571 -58.57143,-1.42857"
+       id="path2915"
+       transform="translate(0,752.36221)"
+       inkscape:connector-type="polyline" />
+  </g>
+</svg>
diff --git a/specs/XIM/staticflowsampleseq.svg b/specs/XIM/staticflowsampleseq.svg
new file mode 100644 (file)
index 0000000..a0e8629
--- /dev/null
@@ -0,0 +1,400 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="502.63379"
+   height="290.44269"
+   id="svg4341"
+   version="1.1"
+   inkscape:version="0.47 r22583"
+   sodipodi:docname="staticflowsampleseq.svg">
+  <defs
+     id="defs4343">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective4349" />
+    <inkscape:perspective
+       id="perspective4272"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path3695"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker4278"
+       style="overflow:visible">
+      <path
+         id="path4280"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker4282"
+       style="overflow:visible">
+      <path
+         id="path4284"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker4286"
+       style="overflow:visible">
+      <path
+         id="path4288"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker4290"
+       style="overflow:visible">
+      <path
+         id="path4292"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="marker4294"
+       style="overflow:visible">
+      <path
+         id="path4296"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective2877"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-3"
+       style="overflow:visible">
+      <path
+         id="path3695-7"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective2905"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-31"
+       style="overflow:visible">
+      <path
+         id="path3695-4"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.7"
+     inkscape:cx="310.98032"
+     inkscape:cy="88.727691"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="677"
+     inkscape:window-height="660"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     inkscape:window-maximized="0" />
+  <metadata
+     id="metadata4346">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-64.019684,-330.64719)">
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="162.84195"
+       y="339.76437"
+       id="text2816"><tspan
+         sodipodi:role="line"
+         id="tspan2818"
+         x="162.84195"
+         y="339.76437">IM Library</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="405.12766"
+       y="340.33578"
+       id="text2820"><tspan
+         sodipodi:role="line"
+         id="tspan2822"
+         x="405.12766"
+         y="340.33578">IM Server</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="62.841949"
+       y="390.33578"
+       id="text2824"><tspan
+         sodipodi:role="line"
+         id="tspan2826"
+         x="62.841949"
+         y="390.33578">Keys in the on-key-list</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="235.6991"
+       y="428.33578"
+       id="text2844"><tspan
+         sodipodi:role="line"
+         id="tspan2846"
+         x="235.6991"
+         y="428.33578">XIM_EXT_SET_EVENT_MASK</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="249.68689"
+       y="440.62149"
+       id="text2848"><tspan
+         sodipodi:role="line"
+         id="tspan2850"
+         x="249.68689"
+         y="440.62149"
+         style="font-size:10px">intercept-event-mask is set</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="235.6991"
+       y="556.90723"
+       id="text2852"><tspan
+         sodipodi:role="line"
+         id="tspan2854"
+         x="235.6991"
+         y="556.90723">XIM_EXT_SET_EVENT_MASK</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="257.54333"
+       y="570.05017"
+       id="text2856"><tspan
+         sodipodi:role="line"
+         id="tspan2858"
+         x="257.54333"
+         y="570.05017"
+         style="font-size:10px">select-event-mask is set</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1.05025411px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 224.27052,345.53018 c 0,264.72805 0,274.18271 0,274.18271"
+       id="path2882" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1.05972767px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 409.98481,347.82588 c 0,274.33848 0,272.73413 0,272.73413"
+       id="path2884" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-end:url(#Arrow1Lend)"
+       d="m 135.6991,394.05008 79.99999,0"
+       id="path2886"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="m 235.69909,399.76437 162.85715,1.42857"
+       id="path2888"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="m 395.69909,411.19294 -160,1.42857"
+       id="path2890"
+       inkscape:connector-type="polyline" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="245.44826"
+       y="392.26437"
+       id="text2854"><tspan
+         sodipodi:role="line"
+         id="tspan2856"
+         x="245.44826"
+         y="392.26437">XIM_FORWARD_EVENT</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="m 391.16254,531.97868 -150,-1.42858"
+       id="path3892"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="m 495.16254,523.40725 -68.57143,-1.42857"
+       id="path3894"
+       inkscape:connector-type="polyline" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="80.571426"
+       y="444.21933"
+       id="text4489"><tspan
+         sodipodi:role="line"
+         id="tspan4491"
+         x="80.571426"
+         y="444.21933">the specified events</tspan><tspan
+         sodipodi:role="line"
+         x="80.571426"
+         y="459.21933"
+         id="tspan4493">are being filtered</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="76.571426"
+       y="517.36218"
+       id="text4495"><tspan
+         sodipodi:role="line"
+         id="tspan4497"
+         x="76.571426"
+         y="517.36218">Keys in the off-key-list</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="71.428574"
+       y="596.79077"
+       id="text4499"><tspan
+         sodipodi:role="line"
+         id="tspan4501"
+         x="71.428574"
+         y="596.79077">the specified events</tspan><tspan
+         sodipodi:role="line"
+         x="71.428574"
+         y="611.79077"
+         id="tspan4503">are being processed</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="434.57144"
+       y="394.64789"
+       id="text4505"><tspan
+         sodipodi:role="line"
+         id="tspan4507"
+         x="434.57144"
+         y="394.64789">Keys in the on-key-list</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="435.42691"
+       y="444.21933"
+       id="text4513"><tspan
+         sodipodi:role="line"
+         id="tspan4515"
+         x="435.42691"
+         y="444.21933">the specified events</tspan><tspan
+         sodipodi:role="line"
+         x="435.42691"
+         y="459.21933"
+         id="tspan4517">are being processed</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="434.57144"
+       y="517.36218"
+       id="text4519"><tspan
+         sodipodi:role="line"
+         id="tspan4521"
+         x="434.57144"
+         y="517.36218">Keys in the off-key-list</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="435.42691"
+       y="596.79077"
+       id="text4523"><tspan
+         sodipodi:role="line"
+         id="tspan4525"
+         x="435.42691"
+         y="596.79077">the specified events</tspan><tspan
+         sodipodi:role="line"
+         x="435.42691"
+         y="611.79077"
+         id="tspan4527">are being discarded</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
+       d="m 488.85714,401.78486 -68.57143,-1.42857"
+       id="path3894-2"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-end:url(#Arrow1Lend)"
+       d="m 131.14286,526.6479 79.99999,0"
+       id="path2886-9"
+       inkscape:connector-type="polyline" />
+  </g>
+</svg>
diff --git a/specs/XIM/xim.xml b/specs/XIM/xim.xml
new file mode 100644 (file)
index 0000000..1317197
--- /dev/null
@@ -0,0 +1,3940 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE article 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;
+]>
+
+
+<!-- lifted from troff+ms+XMan by doclifter -->
+<article class="specification" id="xim">
+
+<articleinfo>
+   <title>The Input Method Protocol</title>
+   <subtitle>X Consortium Standard</subtitle>
+   <releaseinfo>X Version 11, Release &fullrelvers;</releaseinfo>
+   <releaseinfo>Version 1.0</releaseinfo>
+   <authorgroup>
+      <author>
+         <firstname>Masahiko</firstname><surname>Narita</surname>
+         <affiliation><orgname>FUJITSU Limited.</orgname></affiliation>
+      </author>
+      <author>
+         <firstname>Hideki</firstname><surname>Hiura</surname>
+         <affiliation><orgname>SunSoft, Inc.</orgname></affiliation>
+      </author>
+   </authorgroup>
+   <copyright><year>1993</year><year>1994</year>
+      <holder>FUJITSU LIMITED</holder>
+      <holder>Oracle and/or its affiliates</holder>
+   </copyright>
+
+<abstract>
+<para>
+This specifies a protocol between IM library and IM (Input Method) Server for internationalized text input, which is indepedent from any specific language, any specific input method and the transport layer used in communication between the IM library and the IM Server, and uses a client-server model.  This protocol allows user to use his/her favorite method for all applications within the stand-along distrubuted environment.
+</para>
+</abstract>
+
+<legalnotice>
+<para>Permission to use,copy and distribute this documetation for any purpose
+and without fee is hereby granted, provided that the above copyright notice
+and this permission notice appear in all copies.  Fujitsu and Sun Microsystems
+make no representation about the suitability for any purpose of the information in this document.
+This documentation is provided as is without express implied warranty.
+</para>
+</legalnotice>
+
+<legalnotice>
+<para role="multiLicensing">Copyright © 1993, 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 &ldquo;AS IS&rdquo;, WITHOUT WARRANTY OF ANY KIND, 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>
+<para>X Window System is a trademark of The Open Group.</para>
+</legalnotice>
+
+</articleinfo>
+
+<sect1 id="Introduction">
+<title>Introduction</title>
+<sect2 id="Scope">
+<title>Scope</title>
+<!-- .XS -->
+<!-- (SN Scope -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The internationalization in the
+X Window System
+Version 11, Release 5 (X11R5) provides a common API which application
+developers can use to create portable internationalized programs and to
+adapt them to the requirements of different native languages, local customs,
+and character string encodings (this is called "localization").
+As one of its internationalization mechanisms X11R5 has defined a functional
+interface for internationalized text input, called XIM (X Input Method).
+</para>
+<para>
+<!-- .LP -->
+When a client-server model is used with an IM (Input Method) implementation,
+a protocol must be established between the client and the server.
+However, the protocol used to interface Input Method Servers (IM Servers)
+with the Input Method libraries (IM libraries) to which applications are
+linked was not addressed in X11R5.
+This led application developers to depend on vendor-specific input methods,
+decreased the user's choice of available input methods, and made it more
+difficult for developers to create portable applications. This paper describes
+the Input Method Protocol developed for X11R6 to resolve the above problems
+and to address the requirements of existing and future input methods.
+</para>
+<para>
+<!-- .LP -->
+The Input Method Protocol is independent from the transport layer used in
+communication between the IM library and the IM Server.
+Thus, the input method protocol can be built on any inter-process
+communication mechanism, such as TCP/IP or the X protocol.
+</para>
+<para>
+In addition, the protocol provides for future extensions such as differing
+input model types.
+</para>
+</sect2>
+
+<sect2 id="Background">
+<title>Background</title>
+<!-- .XS -->
+<!-- (SN Background -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Text input is much more simple for some languages than
+others.  English, for instance, uses an alphabet of a manageable size,
+and input consists of pressing the corresponding key on a keyboard,
+perhaps in combination with a shift key for capital letters or special
+characters.
+</para>
+<para>
+<!-- .LP -->
+Some languages have larger alphabets, or modifiers such as accents,
+which require the addition of special key combinations in order to enter
+text.  These input methods may require "dead-keys" or "compose-keys"
+which, when followed by different combinations of key strokes,
+generate different characters.
+</para>
+<para>
+<!-- .LP -->
+Text input for ideographic languages is much less simple.  In these
+languages, characters represent actual objects rather than phonetic
+sounds used in pronouncing a word, and the number of characters
+in these languages may continue to grow.  In Japanese, for instance, most
+text input methods involve entering characters in a phonetic alphabet,
+after which the input method searches a dictionary for possible
+ideographic equivalents (of which there may be many).  The input method then
+presents the candidate characters for the user to choose from.
+</para>
+<para>
+<!-- .LP -->
+In Japanese, either Kana (phonetic symbols) or Roman letters are
+typed and then a region is selected for conversion to Kanji. Several
+Kanji characters may have the same phonetic representation. If that
+is the case with the string entered, a menu of characters is presented
+and the user must choose the appropriate one. If no choice is necessary
+or a preference has been established, the input method does the
+substitution directly.
+</para>
+<para>
+<!-- .LP -->
+These complicated input methods must present state information (Status Area),
+text entry and edit space (Preedit Area), and menu/choice presentations
+(Auxiliary Area).  Much of the protocol between the IM library and the IM
+Server involves managing these IM areas.
+Because of the size and complexity of these input methods, and because
+of how widely they vary from one language or locale to another, they are
+usually implemented as separate processes which can serve many client
+processes on the same computer or network.
+</para>
+<para>
+<!-- .LP -->
+</para>
+</sect2>
+<sect2 id="Input_Method_Styles">
+<title>Input Method Styles</title>
+<!-- .XS -->
+<!-- (SN Input Method Styles -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+X11 internationalization support includes the following four types of
+input method:
+<!-- .RS -->
+</para>
+
+<variablelist>
+  <varlistentry>
+    <term>- on-the-spot:</term>
+    <listitem>
+      <para>
+The client application is directed by the IM Server to display all
+pre-edit data at the site of text insertion.  The client registers
+callbacks invoked by the input method during pre-editing.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>- off-the-spot:</term>
+    <listitem>
+      <para>
+The client application provides display windows for the pre-edit data
+to the input method which displays into them directly.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>- over-the-spot:</term>
+    <listitem>
+      <para>
+The input method displays pre-edit data in a window which it brings up
+directly over the text insertion position.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>- root-window:</term>
+    <listitem>
+      <para>
+The input method displays all pre-edit data in a separate area of the
+screen in a window specific to the input method.
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+Client applications must choose from the available input methods
+supported by the IM Server and provide the display areas and callbacks
+required by the input method.
+</para>
+</sect2>
+
+</sect1>
+<sect1 id="Architecture">
+<title>Architecture</title>
+<!-- .XS -->
+<!-- (SN Architecture -->
+<!-- .XE -->
+<sect2 id="Implementation_Model">
+<title>Implementation Model</title>
+<!-- .XS -->
+<!-- (SN Implementation Model -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Within the X Window System environment, the following two typical
+architectural models can be used as an input method's implementation
+model.
+</para>
+
+<variablelist>
+  <varlistentry>
+    <term>- Client/Server model:</term>
+    <listitem>
+      <para>
+A separate process, the IM Server, processes input and handles preediting,
+converting, and committing.  The IM library within the application, acting
+as client to the IM Server, simply receives the committed string from the
+IM Server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>- Library model:</term>
+    <listitem>
+      <para>
+All input is handled by the IM library within the application.  The
+event process is closed within the IM library and a separate IM Server
+process may not be required.
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+Most languages which need complex preediting, such as Asian languages,
+are implemented using the Client/Server IM model.  Other languages
+which need only dead key or compose key processing, such as European
+languages, are implemented using the Library model.
+</para>
+<para>
+<!-- .LP -->
+In this paper, we discuss mainly the Client/Server IM model and the
+protocol used in communication between the IM library (client) and the IM
+Server.
+</para>
+</sect2>
+
+<sect2 id="Structure_of_IM">
+<title>Structure of IM</title>
+<!-- .XS -->
+<!-- (SN Structure of IM -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+When the client connects or disconnects to the IM Server, an open or close
+operation occurs between the client and the IM Server.
+</para>
+<para>
+<!-- .LP -->
+The IM can be specified at the time of XOpenIM() by setting the locale
+of the client and a locale modifier. Since the IM remembers
+the locale at the time of creation XOpenIM() can be called
+multiple times (with the
+setting for the locale and the locale modifier changed) to support
+multiple languages.
+</para>
+<para>
+<!-- .LP -->
+In addition, the supported IM type can be obtained using XGetIMValues().
+</para>
+<para>
+<!-- .LP -->
+The client usually holds multiple input (text) fields. Xlib provides a
+value type called the "Input Context" (IC) to manage each individual
+input field.  An IC can be created by specifying XIM using XCreateIC(),
+and it can be destroyed using XDestroyIC().
+</para>
+<para>
+<!-- .LP -->
+The IC can specify the type of IM which is supported by XIM for each
+input field, so each input field can handle a different type of IM.
+</para>
+<para>
+<!-- .LP -->
+Most importantly information such as the committed string sent from
+the IM Server to the client, is exchanged based on each IC.
+</para>
+<para>
+<!-- .LP -->
+Since each IC corresponds to an input field, the focused input field
+should be announced to the IM Server using XSetICFocus(). (XUnsetICFocus()
+can also be used to change the focus.)
+</para>
+<para>
+<!-- .LP -->
+</para>
+</sect2>
+<sect2 id="Event_Handling_Model">
+<title>Event Handling Model</title>
+<!-- .XS -->
+<!-- (SN Event Handling Model -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Existing input methods support either the FrontEnd method, the BackEnd method,
+or both.  This protocol specifically supports the BackEnd method as
+the default method, but also supports the FrontEnd method as an optional
+IM Server extension.
+</para>
+<para>
+<!-- .LP -->
+The difference between the FrontEnd and BackEnd methods is in how
+events are delivered to the IM Server.  (Fig. 1) <!-- xref -->
+</para>
+
+<sect3 id="BackEnd_Method">
+<title>BackEnd Method</title>
+<!-- .XS -->
+<!-- (SN BackEnd Method -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+In the BackEnd method, client window input events are always delivered
+to the IM library, which then passes them to the IM Server.  Events are
+handled serially in the order delivered, and therefore there is no
+synchronization problem between the IM library and the IM Server.
+</para>
+<para>
+<!-- .LP -->
+Using this method, the IM library forwards all KeyPress and KeyRelease
+events to the IM Server (as required by the Event Flow Control model
+described in
+<xref linkend='Event_Flow_Control' xrefstyle='select: title'/>)
+and synchronizes with the IM Server (as described in
+<xref linkend='Filtering_Events' xrefstyle='select: title'/>).
+
+</para>
+</sect3>
+
+<sect3 id="FrontEnd_Method">
+<title>FrontEnd Method</title>
+<!-- .XS -->
+<!-- (SN FrontEnd Method -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+In the FrontEnd method, client window input events are delivered by the
+X server directly to both the IM Server and the IM library.  Therefore this
+method provides much better interactive performance while preediting
+(particularly in cases such as when the IM Server is running locally on
+the user's workstation and the client application is running on another
+workstation over a relatively slow network).
+</para>
+<para>
+<!-- .LP -->
+However, the FrontEnd model may have synchronization problems between
+the key events handled in the IM Server and other events handled in the
+client, and these problems could possibly cause the loss or duplication
+of key events.  For this reason, the BackEnd method is the core method
+supported, and the FrontEnd method is made available as an extension for
+performance purposes. (Refer to
+<xref linkend="common_extensions" xrefstyle='select: title'/>
+for more information.)
+</para>
+
+<mediaobject  id="flow_of_events">
+  <imageobject>
+    <imagedata  format="SVG"  fileref="eventflow.svg"/>
+  </imageobject>
+  <caption>The flow of events</caption>
+</mediaobject>
+
+<!--
+<para>
+Fig.1 The Flow of Events
+</para>
+-->
+
+</sect3>
+</sect2>
+
+<sect2 id='Event_Flow_Control'>
+<title>Event Flow Control</title>
+<!-- .XS -->
+<!-- (SN Event Flow Control -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+This protocol supports two event flow models for communication between the
+IM library and the IM Server (Static and Dynamic).
+</para>
+<para>
+<!-- .LP -->
+Static Event Flow requires that input events always be sent to the IM
+Server from the client.
+</para>
+<para>
+<!-- .LP -->
+Dynamic Event Flow, however, requires only that those input events which
+need to be processed (converted) be sent to the IM Server from the client.
+</para>
+<para>
+<!-- .LP -->
+For instance, in the case of inputing a combination of ASCII characters
+and Chinese characters, ASCII characters do not need to be processed in
+the IM Server, so their key events do not have to be sent to the IM
+Server.  On the other hand, key events necessary for composing Chinese
+characters must be sent to the IM Server.
+</para>
+<para>
+<!-- .LP -->
+Thus, by adopting the Dynamic Event Flow, the number of requests among the
+X Server, the client, and the IM Server is significantly reduced, and the
+number of context switches is also reduced, resulting in improved performance.
+The IM Server can send
+<function>XIM_REGISTER_TRIGGERKEYS </function>
+message in order to switch the event flow in the Dynamic Event Flow.
+</para>
+<para>
+<!-- .LP -->
+The protocol for this process is described in
+<xref linkend='Event_Flow_Control_2' xrefstyle='select: title'/>.
+</para>
+</sect2>
+</sect1>
+
+<sect1 id="Default_Preconnection_Convention">
+<title>Default Preconnection Convention</title>
+<!-- .XS -->
+<!-- (SN Default Preconnection Convention  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+IM Servers are strongly encouraged to register their symbolic
+names as the ATOM names into the IM Server directory property,
+<function>XIM_SERVERS,</function>
+on the root window of the screen_number 0.
+This property can contain a list of ATOMs, and the each ATOM represents
+each possible IM Server.
+IM Server names are restricted to POSIX Portable Filename Character Set.
+To discover if the IM Server is active, see if there is an owner for
+the selection with that atom name.  To learn the address of that IM Server,
+convert the selection target
+<function>TRANSPORT,</function>
+which will return a string form of the transport address(es).
+To learn the supported locales of that IM Server, convert the selection target
+<function>LOCALES,</function>
+which will return a set of names of the supported locales in the syntax
+X/Open defines.
+</para>
+<para>
+<!-- .LP -->
+The basic semantics to determine the IM Server if there are
+multiple ATOMs are found in
+<function>XIM_SERVERS</function>
+property, is first fit if the IM Server name is not given as
+a X modifier's category
+<function>im.</function>
+</para>
+<para>
+<!-- .LP -->
+The address information retrievable from the
+<function>TRANSPORT</function>
+target is a transport-specific name.
+The preregistered formats for transport-specific names are listed in
+<xref linkend="transport_list" xrefstyle='select: title'/>.
+Additional transport-specific names may be registered with X Consortium.
+</para>
+
+<para>
+For environments that lack X connections, or for IM Servers which
+do not use the X Window System, the preconnection convention with IM Server
+may be given outside the X Window system (e.g. using a Name Service).
+</para>
+</sect1>
+
+<sect1 id="Protocol">
+<title>Protocol</title>
+<!-- .XS -->
+<!-- (SN Protocol -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The protocol described below uses the bi-directional
+synchronous/asynchronous request/reply/error model and is specified
+using the same conventions outlined in Section 2 of the core X Window
+System protocol [1]:
+</para>
+
+<sect2 id="Basic_Requests_Packet_Format">
+<title>Basic Requests Packet Format</title>
+<!-- .XS -->
+<!-- (SN Basic Requests Packet Format -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+This section describes the requests that may be exchanged between the client
+and the IM Server.
+</para>
+<para>
+<!-- .LP -->
+The basic request packet header format is as follows.
+</para>
+<literallayout class="monospaced">
+          major-opcode:               CARD8
+          minor-opcode:               CARD8
+          length:                     CARD16
+</literallayout>
+
+<para>
+The MAJOR-OPCODE specifies which core request or extension package this
+packet represents.  If the MAJOR-OPCODE corresponds to a core request,
+the MINOR-OPCODE contains 8 bits of request-specific data.
+(If the MINOR-OPCODE is not used, it is 0.)
+Otherwise, the MAJOR-OPCODE and the MINOR-OPCODE are specified by
+<function>XIM_QUERY_EXTENSION</function>
+message.  (Refer to 4.7. Query the supported extension protocol list.)
+The LENGTH field specifies the number of 4 bytes elements following the
+header.  If no additional data is followed by the header, the LENGTH field
+will be 0.
+</para>
+</sect2>
+
+<sect2 id="Data_Types">
+<title>Data Types</title>
+<!-- .XS -->
+<!-- (SN Data Types -->
+<!-- .XE -->
+<para>
+The following data types are used in the core X IM Server protocol:
+</para>
+
+<literallayout class="monospaced">
+BITMASK16
+     CARD16
+BITMASK32
+     CARD32
+PADDING FORMAT
+     Where N is some expression, and Pad(N) is the number of bytes needed to round N up to a
+
+          Pad(N) = (4 - (N mod 4)) mod 4
+
+LPCE
+  1          A character from the4 X Portable Character Set in Latin Portable
+             Character Encoding
+
+STRING
+     2     n              length of string in bytes
+     n     LISTofLPCE     string
+     p                    unused, p=Pad(2+n)
+
+STR
+     1     n              length of name in bytes
+     n     STRING8        name
+
+XIMATTR
+     2     CARD16         attribute ID (*1)
+     2     CARD16         type of the value (*2)
+     2     n              length of im-attribute
+     n     STRING8        im-attribute
+     p                    unused, p = Pad(2+n)
+
+The im-attribute argument specifies XIM values such as XNQueryInputStyle.
+
+XICATTR
+     2     CARD16         attribute ID (*1)
+     2     CARD16         type of the value (*2)
+     2     n              length of ic-attribute
+     n     STRING8        ic-attribute
+     p                    unused, p = Pad(2+n)
+
+(*1) XIMATTR and XICATTR are used during the setup stage and XIMATTRIBUTE and
+     XICATTRIBUTE are used after each attribute ID has been recognized by
+     the IM Server and the IM library.
+
+(*2) The value types are defined as follows:
+</literallayout>
+<informaltable id="valuetypes" frame="topbot">
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols="5" align='left' colsep='0' rowsep='0'>
+  <colspec colname="col1" colwidth="0.9*"/>
+  <colspec colname="col2" colwidth="3.0*"/>
+  <colspec colname="col3" colwidth="3.2*"/>
+  <colspec colname="col4" colwidth="2.9*"/>
+  <colspec colname="col5" colwidth="2.9*"/>
+  <spanspec namest="col3" nameend="col5" spanname="span-horiz" align="center"/>
+  <thead>
+    <row rowsep='1'>
+      <entry>values</entry>
+      <entry>data</entry>
+      <entry>format</entry>
+      <!-- <entry spanname="span-horiz">format</entry> -->
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>#0</entry>
+      <entry>Separator of NestedList</entry>
+      <entry>-----(*3)</entry>
+    </row>
+    <row>
+      <entry>#1</entry>
+      <entry>byte data</entry>
+      <entry>CARD8</entry>
+    </row>
+    <row>
+      <entry>#2</entry>
+      <entry>word data</entry>
+      <entry>CARD16</entry>
+    </row>
+    <row>
+      <entry>#3</entry>
+      <entry>long data</entry>
+      <entry>CARD32</entry>
+    </row>
+    <row>
+      <entry>#4</entry>
+      <entry>char data</entry>
+      <entry>STRING8</entry>
+    </row>
+    <row>
+      <entry>#5</entry>
+      <entry>Window</entry>
+      <entry>CARD32</entry>
+    </row>
+    <row>
+      <entry>#10</entry>
+      <entry>XIMStyles</entry>
+      <entry>2</entry>
+      <entry>n</entry>
+      <entry>number of XIMStyle list</entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry></entry>
+      <entry>2</entry>
+      <entry></entry>
+      <entry>unused</entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry></entry>
+      <entry>n</entry>
+      <entry>CARD32</entry>
+      <entry>XIMStyle list</entry>
+    </row>
+    <row>
+      <entry>#11</entry>
+      <entry>XRectangle</entry>
+      <entry>2</entry>
+      <entry>INT16</entry>
+      <entry>X</entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry></entry>
+      <entry>2</entry>
+      <entry>INT16</entry>
+      <entry>Y</entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry></entry>
+      <entry>2</entry>
+      <entry>CARD16</entry>
+      <entry>width</entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry></entry>
+      <entry>2</entry>
+      <entry>CARD16</entry>
+      <entry>height</entry>
+    </row>
+    <row>
+      <entry>#12</entry>
+      <entry>XPoint</entry>
+      <entry>2</entry>
+      <entry>INT16</entry>
+      <entry>X</entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry></entry>
+      <entry>2</entry>
+      <entry>INT16</entry>
+      <entry>Y</entry>
+    </row>
+    <row>
+      <entry>#13</entry>
+      <entry>XFontSet</entry>
+      <entry>2</entry>
+      <entry>n</entry>
+      <entry>length of Base font name</entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry></entry>
+      <entry>n</entry>
+      <entry>STRING8</entry>
+      <entry>Base font name list</entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry></entry>
+      <entry>p</entry>
+      <entry></entry>
+      <entry>unused, p = Pad(2+n)</entry>
+    </row>
+    <row>
+      <entry>#15</entry>
+      <entry>XIMHotKeyTriggers</entry>
+      <entry>4</entry>
+      <entry>n</entry>
+      <entry>number of XIMTRIGGERKEY list (*4)</entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry></entry>
+      <entry>n</entry>
+      <entry>XIMTRIGGERKEY</entry>
+      <entry>XIMHotkeyTrigger list</entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry></entry>
+      <entry>n</entry>
+      <entry>XIMHOTKEYSTATE</entry>
+      <entry>HotKey processing state</entry>
+    </row>
+    <row>
+      <entry>#17</entry>
+      <entry>XIMStringConversion</entry>
+      <entry>XIMSTRCONVTEXT</entry>
+      <entry></entry>
+      <entry></entry>
+    </row>
+    <row>
+      <entry>#18</entry>
+      <entry>XIMPreeditState</entry>
+      <entry>XIMPREEDITSTATE</entry>
+    </row>
+    <row>
+      <entry>#19</entry>
+      <entry>XIMResetState</entry>
+      <entry>XIMRESETSTATE</entry>
+    </row>
+    <row>
+      <entry>#x7fff</entry>
+      <entry>NestedList</entry>
+      <entry>-----</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<literallayout class="monospaced">
+(*3)  The IC value for the separator of NestedList is defined as follows,
+            #define   XNSeparatorofNestedList   "separatorofNestedList"
+      , which is registered in X Consortium and cannot be used for any other purpose.
+
+(*4) LISTofFOO
+            A Type name of the form LISTof FOO means a counted list of elements of type FOO.
+            The size of the length field may vary (it is not necessarily the same
+            size as a FOO), and in some cases, it may be implicit.
+XIMTRIGGERKEY
+     4     CARD32       keysym
+     4     CARD32       modifier
+     4     CARD32       modifier mask
+
+ENCODINGINFO
+     2     n            length of encoding info
+     n     STRING8      encoding info
+     p                  unused, p=Pad(2+n)
+
+
+     1     CARD8        extension major-opcode
+     1     CARD8        extension minor-opcode
+     2     n            length of extension name
+     n     STRING8      extension name
+     p                  unused, p = Pad(n)
+
+XIMATTRIBUTE
+     2     CARD16       attribute ID
+     2     n            value length
+     n                  value
+     p                  unused, p = Pad(n)
+
+XICATTRIBUTE
+     2     CARD16       attribute ID
+     2     n            value length
+     n                  value
+     p                  unused, p = Pad(n)
+
+
+
+XIMSTRCONVTEXT
+     2    CARD16                      XIMStringConversionFeedback
+          #x0000001                   XIMStringConversionLeftEdge
+          #x0000002                   XIMStringConversionRightEdge
+          #x0000004                   XIMStringConversionTopEdge
+          #x0000008                   XIMStringConversionBottomEdge
+          #x0000010                   XIMStringConversionConvealed
+          #x0000020                   XIMStringConversionWrapped
+     2     n                          byte length of the retrieved string
+     n     STRING8                    retrieved string
+     p                                unused, p = Pad(n)
+     2     m                          byte length of feedback array
+     2                                unused
+     m     LISTofXIMSTRCONVFEEDBACK   feedback array(*1)
+
+(*1)   This field is reserved for future use.
+
+XIMFEEDBACK
+     4    CARD32       XIMFeedback
+          #x000001     XIMReverse
+          #x000002     XIMUnderline
+          #x000004     XIMHighlight
+          #x000008     XIMPrimary
+          #x000010     XIMSecondary
+          #x000020     XIMTertiary
+          #x000040     XIMVisibleToForward
+          #x000080     XIMVisibleToBackward
+          #x000100     XIMVisibleCenter
+
+XIMHOTKEYSTATE
+     4    CARD32       XIMHotKeyState
+          #x0000001    XIMHotKeyStateON
+          #x0000002    XIMHotKeyStateOFF
+
+XIMPREEDITSTATE
+     4    CARD32       XIMPreeditState
+          #x0000001    XIMPreeditEnable
+          #x0000002    XIMPreeditDisable
+
+XIMRESETSTATE
+     4    CARD32       XIMResetState
+          #x0000001    XIMInitialState
+          #x0000002    XIMPreserveState
+</literallayout>
+</sect2>
+
+<sect2 id="Error_Notification">
+<title>Error Notification</title>
+<!-- .XS -->
+<!-- (SN Error Notification -->
+<!-- .XE -->
+<para>
+Both the IM Server and the IM library return
+<function>XIM_ERROR</function>
+messages instead of the corresponding reply messages if any errors occur
+during data processing.
+</para>
+
+<para>
+At most one error is generated per request. If more than one error condition
+is encountered in processing a request, the choice of which error is returned
+is implementation-dependent.
+</para>
+
+<literallayout class="monospaced">
+XIM_ERROR (IM Server &lt;--&gt; IM library)
+<!-- .sp 6p -->
+          2     CARD16          input-method-ID
+          2     CARD16          input-context-ID
+          2     BITMASK16       flag (*1)
+                #0000           Both Input-Method-ID and Input-Context-ID are invalid
+                #0001           Input-Method-ID is valid
+                #0002           Input-Context-ID is valid
+          2     CARD16          Error Code
+                #1              BadAlloc
+                #2              BadStyle
+                #3              BadClientWindow
+                #4              BadFocusWindow
+                #5              BadArea
+                #6              BadSpotLocation
+                #7              BadColormap
+                #8              BadAtom
+                #9              BadPixel
+                #10             BadPixmap
+                #11             BadName
+                #12             BadCursor
+                #13             BadProtocol
+                #14             BadForeground
+                #15             BadBackground
+                #16             LocaleNotSupported
+                #999            BadSomething (*2)
+          2     n               byte length of error detail.
+          2     CARD16          type of error detail (*3)
+          n     STRING8         error detail (*4)
+          p                     unused, p = Pad(n)
+
+(*1)  Before an IM is created, both Input-Method-ID and
+      Input-Context-ID are invalid.
+      Before an IC is created, only Input-Method-ID is valid.
+      After that, both of Input-Method-ID and Input-Context-ID are valid.
+
+(*2) Unspecific error, for example "language engine died"
+
+(*3) This field is reserved for future use.
+
+(*4) Vendor defined detail error message
+</literallayout>
+</sect2>
+
+<sect2 id="Connection_Establishment">
+<title>Connection Establishment</title>
+<!-- .XS -->
+<!-- (SN Connection Establishment -->
+<!-- .XE -->
+<para>
+<function>XIM_CONNECT</function>
+message requests to establish a connection over a mutually-understood virtual
+stream.
+</para>
+
+<literallayout class="monospaced">
+XIM_CONNECT (IM library -&gt; IM Server)
+     1                      byte order
+           #x42             MSB first
+           #x6c             LSB first
+     1                      unused
+     2     CARD16           client-major-protocol-version (*1)
+     2     CARD16           client-minor-protocol-version (*1)
+     2     CARD16           number of client-auth-protocol-names
+     n     LISTofSTRING     client-auth-protocol-names
+
+(*1) Specify the version of IM Protocol that the client supports.
+</literallayout>
+
+<para>
+A client must send
+<function>XIM_CONNECT</function>
+message as the first message on the connection.
+The list specifies the names of authentication protocols the sending
+IM Server is willing to perform.
+(If the client need not authenticate, the list may be omited.)
+</para>
+
+<para>
+<function>XIM_AUTH_REQUIRED </function>
+message is used to send the authentication protocol name and protocol-specific
+data.
+</para>
+
+<literallayout class="monospaced">
+XIM_AUTH_REQUIRED (IM library &lt;--&gt; IM Server)
+
+     1     CARD8              auth-protocol-index
+     3                        unused
+     2     n                  length of authentication data
+     2                        unused
+     n     &lt;varies&gt;     data
+     p                        unused, p = Pad(n)
+</literallayout>
+
+<para>
+The auth-protocol is specified by an index into the list of names
+given in the
+<function>XIM_CONNECT</function>
+or
+<function>XIM_AUTH_SETUP</function>
+message. Any protocol-specific data that might be required is also sent.
+</para>
+
+<para>
+The IM library sends
+<function>XIM_AUTH_REPLY</function>
+message as the reply to
+<function>XIM_AUTH_REQUIRED</function>
+message, if the IM Server is authenticated.
+</para>
+
+<literallayout class="monospaced">
+XIM_AUTH_REPLY (IM library -&gt; IM Server)
+     2     n                 length of authentication data
+     2                       unused
+     2     n                 length of authentication data
+     2                       unused
+     n     &lt;varies&gt;      data
+     p                       unused, p = Pad(n)
+</literallayout>
+
+<para>
+The auth data is specific to the authentication protocol in use.
+</para>
+<para>
+<!-- .LP -->
+<function>XIM_AUTH_NEXT </function>
+message requests to send more auth data.
+</para>
+
+<literallayout class="monospaced">
+XIM_AUTH_NEXT (IM library &lt;--&gt; IM Server)
+     2     n                 length of authentication data
+     2                       unused
+     n     &lt;varies&gt;      data
+     p                       unused, p = Pad(n)
+</literallayout>
+<para>
+The auth data is specific to the authentication protocol in use.
+</para>
+
+<para>
+<!-- .LP -->
+The IM Server sends
+<function>XIM_AUTH_SETUP</function>
+message to authenticate the client.
+</para>
+
+<literallayout class="monospaced">
+XIM_AUTH_SETUP (IM Server -&gt; IM library)
+     2     CARD16           number of client-auth-protocol-names
+     2                      unused
+     n     LISTofSTRING     server-auth-protocol-names
+</literallayout>
+
+<para>
+The list specifies the names of authentication protocols the
+client is willing to perform.
+</para>
+
+<para>
+<function>XIM_AUTH_NG</function>
+message requests to give up the connection.
+</para>
+
+<para>
+XIM_AUTH_NG (IM library &lt;--&gt; IM Server)
+</para>
+
+<para>
+The IM Server sends
+<function>XIM_CONNECT_REPLY</function>
+message as the reply to
+<function>XIM_CONNECT</function>
+or
+<function>XIM_AUTH_REQUIRED</function>
+message.
+</para>
+
+<literallayout class="monospaced">
+XIM_CONNECT_REPLY (IM Server -&gt; IM library)
+     2     CARD16     server-major-protocol-version (*1)
+     2     CARD16     server-minor-protocol-version (*1)
+
+(*1) Specify the version of IM Protocol that the IM Server supports.
+This document specifies major version one, minor version zero.
+</literallayout>
+
+<para>
+Here are the state diagrams for the client and the IM Server.
+</para>
+
+<para>
+State transitions for the client
+</para>
+
+<variablelist>
+  <varlistentry>
+    <term><emphasis remap='I'>init_status</emphasis>:</term>
+    <listitem>
+      <para>
+Use authorization function -&gt; <emphasis remap='I'>client_ask</emphasis>
+      </para>
+      <para>
+Not use authorization function -&gt; <emphasis remap='I'>client_no_check</emphasis>
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term><emphasis remap='I'>start</emphasis>:</term>
+    <listitem>
+      <para>
+Send <function>XIM_CONNECT</function>
+      </para>
+      <para>
+If <emphasis remap='I'>client_ask</emphasis> -&gt; <emphasis remap='I'>client_wait1</emphasis>
+      </para>
+      <para>
+If <emphasis remap='I'>client_no_check</emphasis>,
+client-auth-protocol-names may be omited -&gt; <emphasis remap='I'>client_wait2</emphasis>
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term><emphasis remap='I'>client_wait1</emphasis>:</term>
+    <listitem>
+      <para>
+Receive <function>XIM_AUTH_REQUIRED</function>
+-&gt; <emphasis remap='I'>client_check</emphasis>
+      </para>
+      <para>
+Receive &lt;other&gt; -&gt; <emphasis remap='I'>client_NG</emphasis>
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term><emphasis remap='I'>client_check</emphasis>:</term>
+    <listitem>
+      <para>
+If no more auth needed, send <function>XIM_AUTH_REPLY</function>
+-&gt; <emphasis remap='I'>client_wait2</emphasis>
+      </para>
+      <para>
+If good auth data, send <function>XIM_AUTH_NEXT</function>
+-&gt; <emphasis remap='I'>client_wait1</emphasis>
+      </para>
+      <para>
+If bad auth data, send <function>XIM_AUTH_NG</function>
+-&gt; give up on this protocol
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term><emphasis remap='I'>client_wait2</emphasis>:</term>
+    <listitem>
+      <para>
+Receive <function>XIM_CONNECT_REPLY</function>
+-&gt; connect Receive
+<function>XIM_AUTH_SETUP </function>
+-&gt; <emphasis remap='I'>client_more</emphasis>
+      </para>
+      <para>
+Receive <function>XIM_AUTH_NEXT</function>
+-&gt; <emphasis remap='I'>client_more</emphasis>
+      </para>
+      <para>
+Receive <function>XIM_AUTH_NG</function>
+-&gt; give up on this protocol
+      </para>
+      <para>
+Receive &lt;other&gt; -&gt; <emphasis remap='I'>client_NG</emphasis>
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term><emphasis remap='I'>client_more</emphasis>:</term>
+    <listitem>
+      <para>
+Send <function>XIM_AUTH_REQUIRED</function>
+-&gt; <emphasis remap='I'>client_wait2</emphasis>
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term><emphasis remap='I'>client_NG</emphasis>:</term>
+    <listitem>
+      <para>
+Send <function>XIM_AUTH_NG</function>
+-&gt; give up on this protocol
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+State transitions for the IM Server
+</para>
+
+<variablelist>
+  <varlistentry>
+    <term><emphasis remap='I'>init_status</emphasis>:</term>
+    <listitem>
+      <para>
+Use authorization function -&gt; <emphasis remap='I'>server_ask</emphasis>
+      </para>
+      <para>
+Not use authorization function -&gt; <emphasis remap='I'>server_no_check</emphasis>
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term><emphasis remap='I'>start</emphasis>:</term>
+    <listitem>
+      <para>
+Receive <function>XIM_CONNECT</function>
+      </para>
+      <para>
+-&gt; <emphasis remap='I'>start2</emphasis>
+Receive &lt;other&gt; -&gt; <emphasis remap='I'>server_NG</emphasis>
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term><emphasis remap='I'>start2</emphasis>:</term>
+    <listitem>
+      <para>
+If <emphasis remap='I'>client_ask</emphasis>, send
+<function>XIM_AUTH_REQUIRED</function>
+-&gt; <emphasis remap='I'>server_wait1</emphasis>
+      </para>
+      <para>
+If <emphasis remap='I'>client_no_check</emphasis> and
+<emphasis remap='I'>server_ask</emphasis>, send
+<function>XIM_AUTH_SETUP</function>
+-&gt; <emphasis remap='I'>server_wait2</emphasis>
+      </para>
+      <para>
+If <emphasis remap='I'>client_no_check</emphasis> and
+<emphasis remap='I'>server_no_check</emphasis>, send
+<function>XIM_CONNECT_REPLY</function>
+-&gt; connect
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term><emphasis remap='I'>server_wait1</emphasis>:</term>
+    <listitem>
+      <para>
+Receive
+<function>XIM_AUTH_REPLY</function>
+-&gt; <emphasis remap='I'>server2</emphasis>
+      </para>
+      <para>
+Receive
+<function>XIM_AUTH_NEXT</function>
+-&gt; <emphasis remap='I'>server_more</emphasis>
+      </para>
+      <para>
+Receive &lt;other&gt; -&gt; <emphasis remap='I'>server_NG</emphasis>
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term><emphasis remap='I'>server_more</emphasis></term>
+    <listitem>
+      <para>
+Send
+<function>XIM_AUTH_REQUIRED</function>
+-&gt; <emphasis remap='I'>server_wait1</emphasis>
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term><emphasis remap='I'>server2</emphasis></term>
+    <listitem>
+      <para>
+If <emphasis remap='I'>server_ask</emphasis>, send
+<function>XIM_AUTH_SETUP</function>
+-&gt; <emphasis remap='I'>server_wait2</emphasis>
+      </para>
+      <para>
+If <emphasis remap='I'>server_no_check</emphasis>, send
+<function>XIM_CONNECT_REPLY </function>
+-&gt; connect
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term><emphasis remap='I'>server_wait2</emphasis></term>
+    <listitem>
+      <para>
+Receive
+<function>XIM_AUTH_REQUIRED</function>
+-&gt; <emphasis remap='I'>server_check</emphasis>
+      </para>
+      <para>
+Receive &lt;other&gt; -&gt; <emphasis remap='I'>server_NG</emphasis>
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term><emphasis remap='I'>server_check</emphasis></term>
+    <listitem>
+      <para>
+If no more auth data, send
+<function>XIM_CONNECT_REPLY</function>
+-&gt; connect
+      </para>
+      <para>
+If bad auth data, send
+<function>XIM_AUTH_NG</function>
+-&gt; give up on this protocol
+      </para>
+      <para>
+If good auth data, send
+<function>XIM_AUTH_NEXT</function>
+-&gt; <emphasis remap='I'>server_wait2</emphasis>
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term><emphasis remap='I'>server_NG</emphasis></term>
+    <listitem>
+      <para>
+Send
+<function>XIM_AUTH_NG</function>
+-&gt; give up on this protocol
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<function>XIM_DISCONNECT </function>
+message requests to shutdown the connection over a mutually-understood
+virtual stream.
+</para>
+
+<para>
+XIM_DISCONNECT (IM library -&gt; IM Server)
+</para>
+
+<para>
+<function>XIM_DISCONNECT</function>
+is a synchronous request.  The IM library should wait until it receives
+either an
+<function>XIM_DISCONNECT_REPLY</function>
+packet or an <function>XIM_ERROR</function> packet.
+</para>
+
+<para>
+XIM_DISCONNECT_REPLY (IM Server -&gt; IM library)
+</para>
+
+<para>
+<function>XIM_OPEN</function>
+requests to establish a logical connection between the IM library and the IM
+Server.
+</para>
+
+<literallayout class="monospaced">
+XIM_OPEN (IM library -&gt; IM Server)
+     n     STR     locale name
+     p             unused, p = Pad(n)
+</literallayout>
+
+<para>
+<function>XIM_OPEN</function>
+is a synchronous request.  The IM library should wait until receiving
+either an <function>XIM_OPEN_REPLY</function>
+packet or an <function>XIM_ERROR </function> packet.
+</para>
+
+<literallayout class="monospaced">
+XIM_OPEN_REPLY (IM Server -&gt; IM library)
+     2     CARD16             input-method-ID
+     2     n                  byte length of IM attributes supported
+     n     LISTofXIMATTR      IM attributes supported
+     2     m                  byte length of IC attributes supported
+     2     CARD16             unused
+     m     LISTofXICATTR      IC attributes supported
+</literallayout>
+
+<para>
+<function>XIM_OPEN_REPLY</function>
+message returns all supported IM and IC attributes in LISTofXIMATTR and
+LISTofXICATTR.  These IM and IC attribute IDs are used to reduce the amount
+of data which must be transferred via the network. In addition, this
+indicates to the IM library what kinds of IM/IC attributes can be used
+in this session, and what types of data will be exchanged. This allows
+the IM Server provider and application writer to support IM system
+enhancements with new IM/IC attributes, without modifying Xlib.
+The IC value for the separator of NestedList must be included in the
+LISTofXICATTR.
+</para>
+
+<para>
+<function>XIM_CLOSE </function>
+message requests to shutdown the logical connection between the IM library
+and the IM Server.
+</para>
+
+<literallayout class="monospaced">
+XIM_CLOSE (IM library -&gt; IM Server)
+     2     CARD16     input-method-ID
+     2                unused
+</literallayout>
+
+<para>
+<function>XIM_CLOSE</function>
+is a synchronous request.  The IM library should wait until receiving
+either an <function>XIM_CLOSE_REPLY</function>
+packet or an <function>XIM_ERROR</function> packet.
+</para>
+
+<literallayout class="monospaced">
+XIM_CLOSE_REPLY (IM Server -&gt; IM library)
+     2     CARD16     input-method-ID
+     2                unused
+</literallayout>
+
+</sect2>
+
+<sect2 id='Event_Flow_Control_2'>
+<title>Event Flow Control</title>
+<!-- .XS -->
+<!-- (SN Event Flow Control -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+An IM Server must send
+<function>XIM_SET_EVENT_MASK </function>
+message to the IM library in order for events to be forwarded to the IM
+Server, since the IM library initially doesn't forward any events to the
+IM Server. In the protocol, the IM Server will specify masks of X events
+to be forwarded and which need to be synchronized by the IM library.
+</para>
+
+<literallayout class="monospaced">
+XIM_SET_EVENT_MASK (IM Server -&gt; IM library)
+     2     CARD16        input-method-ID
+     2     CARD16        input-context-ID
+     4     EVENTMASK     forward-event-mask (*1)
+     4     EVENTMASK     synchronous-event-mask (*2)
+
+(*1)  Specify all the events to be forwarded to the IM Server by the IM library.
+(*2)  Specify the events to be forwarded with synchronous flag on by the IM library.
+</literallayout>
+
+<para>
+<function>XIM_SET_EVENT_MASK </function>
+is an asynchronous request.  The event masks are valid immediately after
+they are set until changed by another
+<function>XIM_SET_EVENT_MASK</function>
+message.  If input-context-ID is set to zero, the default value of the
+input-method-ID will be changed to the event masks specified in the request.
+That value will be used for the IC's which have no individual values.
+</para>
+
+<para>
+Using the Dynamic Event Flow model, an IM Server sends
+<function>XIM_REGISTER_TRIGGERKEYS </function>
+message to the IM library before sending
+<function>XIM_OPEN_REPLY</function>
+message.
+Or the IM library may suppose that the IM Server uses the Static Event Flow
+model.
+</para>
+
+<literallayout class="monospaced">
+XIM_REGISTER_TRIGGERKEYS (IM Server -&gt; IM library)
+<!-- .sp 6p -->
+     2     CARD16                  input-method-ID
+     2                             unused
+     4     n                       byte length of on-keys
+     n     LISTofXIMTRIGGERKEY     on-keys list
+     4     m                       byte length of off-keys
+     m     LISTofXIMTRIGGERKEY     off-keys list
+</literallayout>
+
+<para>
+<function>XIM_REGISTER_TRIGGERKEYS</function>
+is an asynchronous request.
+The IM Server notifys the IM library of on-keys and off-keys lists with
+this message.
+</para>
+
+<para>
+The IM library notifys the IM Server with
+<function>XIM_TRIGGER_NOTIFY </function>
+message that a key event matching either on-keys or off-keys has been occurred.
+</para>
+
+<literallayout class="monospaced">
+XIM_TRIGGER_NOTIFY (IM library -&gt; IM Server)
+     2     CARD16           input-method-ID
+     2     CARD16           input-context-ID
+     4     CARD32           flag
+           #0               on-keys list
+           #1               off-keys list
+     4     CARD32           index of keys list
+     4     EVENTMASK        client-select-event-mask (*1)
+
+(*1)  Specify the events currently selected by the IM library with XSelectInput.
+
+</literallayout>
+
+<para>
+<function>XIM_TRIGGER_NOTIFY </function>
+is a synchronous request.  The IM library should wait until receiving
+either an <function>XIM_TRIGGER_NOTIFY_REPLY</function>
+packet or an <function>XIM_ERROR</function> packet.
+</para>
+
+<literallayout class="monospaced">
+XIM_TRIGGER_NOTIFY_REPLY (IM Server -&gt; IM library)
+     2     CARD16     input-method-ID
+     2     CARD16     input-context-ID
+</literallayout>
+
+</sect2>
+
+<sect2 id="Encoding_Negotiation">
+<title>Encoding Negotiation</title>
+<para>
+<function>XIM_ENCODING_NEGOTIATION</function>
+message requests to decide which encoding to be sent across the wire.
+When the negotiation fails, the fallback default encoding is Portable
+Character Encoding.
+</para>
+
+<literallayout class="monospaced">
+XIM_ENCODING_NEGOTIATION (IM library -&gt; IM Server).sp 6p
+     2     CARD16                 input-method-ID
+     2     n                      byte length of encodings listed by name
+     n     LISTofSTR              list of encodings supported in the IM library.
+     p                            unused, p = Pad(n)
+     2     m                      byte length of encodings listed by detailed data
+     2                            unused
+     m     LISTofENCODINGINFO     list of encordings supported in the IM library
+</literallayout>
+
+<para>
+The IM Server must choose one encoding from the list sent by the IM library.
+If index of the encording determined is -1 to indicate that the negotiation
+is failed, the fallback default encoding is used.
+The message must be issued after sending
+<function>XIM_OPEN</function> message via XOpenIM().
+The name of encoding may be registered with X Consortium.
+</para>
+
+<para>
+<function>XIM_ENCODING_NEGOTIATION</function>
+is a synchronous request.  The IM library should wait until receiving
+either an <function>XIM_ENCODING_NEGOTIATION_REPLY</function>
+packet or an <function>XIM_ERROR</function> packet.
+</para>
+
+
+<literallayout class="monospaced">
+XIM_ENCODING_NEGOTIATION_REPLY (IM Server -&gt; IM library)
+     2     CARD16     input-method-ID
+     2     CARD16     category of the encoding determined.
+           #0         name
+           #1         detailed data
+     2     INT16      index of the encoding determinated.
+     2                unused
+</literallayout>
+
+</sect2>
+
+<sect2 id="Query_the_supported_extension_protocol_list">
+<title>Query the supported extension protocol list</title>
+<para>
+<function>XIM_QUERY_EXTENSION</function>
+message requests to query the IM extensions supported by the IM Server to
+which the client is being connected.
+</para>
+
+<literallayout class="monospaced">
+XIM_QUERY_EXTENSION (IM library -&gt; IM Server)
+     2     CARD16        input-method-ID
+     2     n             byte length of extensions supported by the IM library
+     n     LISTofSTR     extensions supported by the IM library
+     p                   unused, p = Pad(n)
+</literallayout>
+
+<para>
+An example of a supported extension is FrontEnd.
+The message must be issued after sending
+<function>XIM_OPEN </function> message via XOpenIM().
+</para>
+
+<para>
+If n is 0, the IM library queries the IM Server for all extensions.
+</para>
+
+<para>
+If n is not 0, the IM library queries whether the IM Server supports the
+contents specified in the list.
+</para>
+
+<para>
+If a client uses an extension request without previously having issued a
+<function>XIM_QUERY_EXTENSION</function>
+message for that extension, the IM Server responds with a
+<function>BadProtocol</function>
+error.  If the IM Server encounters a request with an unknown MAJOR-OPCODE
+or MINOR-OPCODE, it responds with a
+<function>BadProtocol</function> error.
+</para>
+
+<para>
+<function>XIM_QUERY_EXTENSION</function>
+is a synchronous request.  The IM library should wait until receiving
+either an <function>XIM_QUERY_EXTENSION_REPLY</function>
+packet or an <function>XIM_ERROR</function> packet.
+</para>
+
+<literallayout class="monospaced">
+XIM_QUERY_EXTENSION_REPLY (IM Server -&gt; IM library)
+     2     CARD16      input-method-ID
+     2     n           byte length of extensions supported by both the IM library and the IM Server
+     n     LISTofEXT   list of extensions supported by both the IM library and the IM Server
+
+</literallayout>
+
+<para>
+<function>XIM_QUERY_EXTENSION_REPLY</function>
+message returns the list of extensions supported by both the IM library and
+the IM Server. If the list passed in
+<function>XIM_QUERY_EXTENSION</function>
+message is NULL, the IM Server returns the full list of extensions supported
+by the IM Server.  If the list is not NULL, the IM Server returns the
+extensions in the list that are supported by the IM Server.
+</para>
+
+<para>
+<!-- .LP -->
+A zero-length string is not a valid extension name.  The IM library should
+disregard any zero-length strings that are returned in the extension list.
+The IM library does not use the requests which are not supported by the IM
+Server.
+</para>
+
+</sect2>
+
+<sect2 id="Setting_IM_Values">
+<title>Setting IM Values</title>
+<para>
+<function>XIM_SET_IM_VALUES </function>
+requests to set attributes to the IM.
+</para>
+
+<literallayout class="monospaced">
+XIM_SET_IM_VALUES (IM library -&gt; IM Server)
+     2     CARD16                 input-method-ID
+     2     n                      byte length of im-attribute
+     n     LISTofXIMATTRIBUTE     im-attributes
+</literallayout>
+
+<para>
+The im-attributes in
+<function>XIM_SET_IM_VALUES</function>
+message are specified as a LISTofXIMATTRIBUTE, specifying the attributes
+to be set. Attributes other than the ones returned by
+<function>XIM_OPEN_REPLY</function>
+message should not be specified.
+</para>
+
+<para>
+<function>XIM_SET_IM_VALUES </function>
+is a synchronous request. The IM library should wait until receiving
+either an
+<function>XIM_SET_IM_VALUES_REPLY</function>
+packet or an
+<function>XIM_ERROR</function>
+packet, because it must receive the error attribute if
+<function>XIM_ERROR</function> message is returned.
+</para>
+
+<literallayout class="monospaced">
+XIM_SET_IM_VALUES_REPLY (IM Server -&gt; IM library)
+     2     CARD16     input-method-ID
+     2                unused
+</literallayout>
+
+<para>
+<function>XIM_SET_IM_VALUES_REPLY</function>
+message returns the input-method-ID to distinguish replies from multiple IMs.
+</para>
+
+</sect2>
+<sect2 id="Getting_IM_Values">
+<title>Getting IM Values</title>
+<para>
+<function>XIM_GET_IM_VALUES </function>
+requests to query IM values supported by the IM Server currently being
+connected.
+</para>
+
+<literallayout class="monospaced">
+XIM_GET_IM_VALUES (IM library -&gt; IM Server)
+     2     CARD16           input-method-ID
+     2     n                byte length of im-attribute-id
+     n     LISTofCARD16     im-attribute-id
+     p                      unused, p=Pad(n)
+</literallayout>
+
+<para>
+<function>XIM_GET_IM_VALUES</function>
+is a synchronous request.  The IM library should wait until it receives
+either an
+<function>XIM_GET_IM_VALUES_REPLY</function>
+packet or an <function>XIM_ERROR</function> packet.
+</para>
+
+<literallayout class="monospaced">
+XIM_GET_IM_VALUES_REPLY (IM Server -&gt; IM library)
+     2     CARD16                 input-method-ID
+     2     n                      byte length of im-attributes returned
+     n     LISTofXIMATTRIBUTE     im-attributes returned
+</literallayout>
+
+<para>
+The IM Server returns IM values with
+<function>XIM_GET_IM_VALUES_REPLY</function>
+message.  The order of the returned im-attribute values corresponds directly
+to that of the list passed with the
+<function>XIM_GET_IM_VALUES</function> message.
+</para>
+
+</sect2>
+<sect2 id="Creating_an_IC">
+<title>Creating an IC</title>
+<para>
+<function>XIM_CREATE_IC</function> message requests to create an IC.
+</para>
+
+<literallayout class="monospaced">
+XIM_CREATE_IC (IM library -&gt; IM Server)
+     2     CARD16                 input-method-ID
+     2     n                      byte length of ic-attributes
+     n     LISTofXICATTRIBUTE     ic-attributes
+</literallayout>
+
+<para>
+The input-context-id is specified by the IM Server to identify the client
+(IC).  (It is not specified by the client in
+<function>XIM_CREATE_IC</function>
+message.), and it should not be set to zero.
+</para>
+
+<para>
+<function>XIM_CREATE_IC</function>
+is a synchronous request which returns the input-context-ID.
+The IM library should wait until it receives either an
+<function>XIM_CREATE_IC_REPLY</function>
+packet or an
+<function>XIM_ERROR</function>
+packet.
+</para>
+
+<literallayout class="monospaced">
+XIM_CREATE_IC_REPLY (IM Server -&gt; IM library)
+     2     CARD16     input-method-ID
+     2     CARD16     input-context-ID
+</literallayout>
+
+</sect2>
+<sect2 id="Destroying_the_IC">
+<title>Destroying the IC</title>
+<para>
+<function>XIM_DESTROY_IC</function>
+message requests to destroy the IC.
+</para>
+
+<literallayout class="monospaced">
+XIM_DESTROY_IC (IM library -&gt; IM Server)
+     2     CARD16     input-method-ID
+     2     CARD16     input-context-ID
+</literallayout>
+
+<para>
+<function>XIM_DESTROY_IC </function>
+is a synchronous request. The IM library should not free its resources
+until it receives an
+<function>XIM_DESTROY_IC_REPLY</function>
+message because <function>XIM_DESTROY_IC</function>
+message may result in Callback packets such as
+<function>XIM_PREEDIT_DRAW</function>
+and <function>XIM_PREEDIT_DONE.</function>
+</para>
+
+<literallayout class="monospaced">
+XIM_DESTROY_IC_REPLY (IM Server -&gt; IM library)
+     2     CARD16     input-method-ID
+     2     CARD16     input-context-ID
+</literallayout>
+
+</sect2>
+
+<sect2 id="Setting_IC_Values">
+<title>Setting IC Values</title>
+<para>
+<function>XIM_SET_IC_VALUES</function>
+messages requests to set attributes to the IC.
+</para>
+
+
+<literallayout class="monospaced">
+XIM_SET_IC_VALUES (IM library -&gt; IM Server)
+     2     CARD16                 input-method-ID
+     2     CARD16                 input-context-ID
+     2     n                      byte length of ic-attributes
+     2                            unused
+     n     LISTofXICATTRIBUTE     ic-attributes
+</literallayout>
+
+<para>
+The ic-attributes in
+<function>XIM_SET_IC_VALUES</function>
+message are specified as a LISTofXICATTRIBUTE, specifying the attributes
+to be set. Attributes other than the ones returned by
+<function>XIM_OPEN_REPLY</function> message should not be specified.
+</para>
+
+<para>
+<function>XIM_SET_IC_VALUES </function>
+is a synchronous request. The IM library should wait until receiving
+either an <function>XIM_SET_IC_VALUES_REPLY </function>
+packet or an <function>XIM_ERROR</function>
+packet, because it must receive the error attribute if
+<function>XIM_ERROR</function> message is returned.
+</para>
+
+
+<literallayout class="monospaced">
+XIM_SET_IC_VALUES_REPLY (IM Server -&gt; IM library)
+<!-- .sp 6p -->
+     2     CARD16     input-method-ID
+     2     CARD16     input-context-ID
+</literallayout>
+
+</sect2>
+<sect2 id="Getting_IC_Values">
+<title>Getting IC Values</title>
+<para>
+<function>XIM_GET_IC_VALUES</function>
+message requests to query IC values supported by the IM Server currently
+being connected.
+</para>
+
+
+<literallayout class="monospaced">
+XIM_GET_IC_VALUES (IM library -&gt; IM Server)
+<!-- .sp 6p -->
+     2     CARD16           input-method-ID
+     2     CARD16           input-context-ID
+     2     n                byte length of ic-attribute-id
+     n     LISTofCARD16     ic-attribute-id
+     p                      unused, p=Pad(2+n)
+</literallayout>
+
+<para>
+In LISTofCARD16, the appearance of the ic-attribute-id for the separator
+of NestedList shows the end of the heading nested list.
+</para>
+
+<para>
+<function>XIM_GET_IC_VALUES</function>
+is a synchronous request and returns each attribute with its values to
+show the correspondence.  The IM library should wait until receiving
+either an <function>XIM_GET_IC_VALUES_REPLY</function>
+packet or an <function>XIM_ERROR</function> packet.
+</para>
+
+<literallayout class="monospaced">
+XIM_GET_IC_VALUES_REPLY (IM Server -&gt; IM library)
+     2     CARD16                 input-method-ID
+     2     CARD16                 input-context-ID
+     2     n                      byte length of ic-attribute
+     2                            unused
+     n     LISTofXICATTRIBUTE     ic-attribute
+</literallayout>
+
+</sect2>
+<sect2 id="Setting_IC_Focus">
+<title>Setting IC Focus</title>
+<para>
+<function>XIM_SET_IC_FOCUS</function>
+message requests to set the focus to the IC.
+</para>
+
+<literallayout class="monospaced">
+XIM_SET_IC_FOCUS (IM library -&gt; IM Server)
+     2     CARD16     input-method-ID
+     2     CARD16     input-context-ID
+</literallayout>
+
+<para>
+<function>XIM_SET_IC_FOCUS</function> is an asynchronous request.
+</para>
+
+</sect2>
+<sect2 id="Unsetting_IC_Focus">
+<title>Unsetting IC Focus</title>
+<para>
+<function>XIM_UNSET_IC_FOCUS</function>
+message requests to unset the focus to the focused IC.
+</para>
+
+<literallayout class="monospaced">
+XIM_UNSET_IC_FOCUS (IM library -&gt; IM Server)
+     2     CARD16     input-method-ID
+     2     CARD16     input-context-ID
+</literallayout>
+
+<para>
+<function>XIM_UNSET_IC_FOCUS</function>
+is an asynchronous request.
+</para>
+
+</sect2>
+
+<sect2 id='Filtering_Events'>
+<title>Filtering Events</title>
+<para>
+Event filtering is mainly provided for BackEnd method to allow input method
+to capture X events transparently to clients.
+</para>
+
+<para>
+X Events are forwarded by
+<function>XIM_FORWARD_EVENT</function> message.
+This message can be operated both synchronously and asynchronously.
+If the requester sets the synchronous flag, the receiver must send
+<function>XIM_SYNC_REPLY</function>
+message back to the requester when all the data processing is done.
+</para>
+<para>
+Protocol flow of BackEnd model
+</para>
+
+<para>
+With BackEnd method, the protocol flow can be classified into two
+methods in terms of synchronization, depending on the synchronous-eventmask
+of <function>XIM_SET_EVENT_MASK</function>
+message.  One can be called on-demand-synchronous method and another
+can be called as full-synchronous method.
+</para>
+
+<para>
+In on-demand-synchronous method, the IM library always receives
+<function>XIM_FORWARD_EVENT</function>
+or
+<function>XIM_COMMIT</function>
+message as a synchronous request. Also, the IM Server needs to synchronously
+process the correspondent reply from the IM library and the following
+<function>XIM_FORWARD_EVENT</function>
+message sent from the IM library when any of the event causes the IM Server
+to send
+<function>XIM_FORWARD_EVENT</function>
+or
+<function>XIM_COMMIT</function>
+message to the IM library, so that the input service is consistent.  If the
+IM library gets the control back from the application after receiving the
+synchronous request, the IM library replies for the synchronous request before
+processing any of the events. In this time, the IM Server blocks
+<function>XIM_FORWARD_EVENT</function>
+message which is sent by the IM library, and handles it after receiving the
+reply. However, the IM Server handles the other protocols at any time.
+</para>
+
+<para>
+In full-synchronous method, the IM library always sends
+<function>XIM_FORWARD_EVENT</function>
+message to the IM Server as a synchronous request. Therefore, the reply to it
+from the IM Server will be put between the
+<function>XIM_FORWARD_EVENT</function> message and its
+<function>XIM_SYNC_REPLY</function> message.  In case of sending
+<function>XIM_FORWARD_EVENT</function> or
+<function>XIM_COMMIT</function>
+message, the IM Server should set the synchronous flag off. Because the
+synchronization can be done by the following
+<function>XIM_SYNC_REPLY</function> message.
+</para>
+
+<para>
+Following chart shows one of the simplest protocol flow which only
+deals with keyevents for preediting operation.
+</para>
+
+<mediaobject  id="sampleprotocolflow">
+  <imageobject>
+    <imagedata  format="SVG"  fileref="sampleprotocolflow1.svg"/>
+  </imageobject>
+  <caption>Sample Protocol Flow</caption>
+</mediaobject>
+
+
+<para>
+Following chart shows one of the complex protocol flow, which deals
+with multiple focus windows and button press event as well as keyevent,
+and the focus is moved by the application triggered by both of keyevent
+and button press event.
+</para>
+<mediaobject  id="sampleprotocolflow2">
+  <imageobject>
+    <imagedata  format="SVG"  fileref="sampleprotocolflow2.svg"/>
+  </imageobject>
+  <caption>Sample Protocol Flow 2</caption>
+</mediaobject>
+
+<literallayout class="monospaced">
+XIM_FORWARD_EVENT (IM library &lt;--&gt; IM Server)
+     2     CARD16         input-method-ID
+     2     CARD16         input-context-ID
+     2     BITMASK16      flag
+           #0001          synchronous
+           #0002          request filtering (*1)
+           #0004          request lookupstring (*2)
+     2     CARD16         serial number
+           XEVENT         X event
+
+(*1)  Indicate the receiver should filter events and possible preedit may be invoked.
+
+(*2)  Indicate the receiver should only do lookup string. The IM Server is expected
+to just do a conversion of the key event to the best candidate. This bit may
+affect the state of the preedit state (e.g. compose of dead key sequences).
+</literallayout>
+
+<para>
+XEVENT format is same as the X Protocol event format(xEvent).
+As the value of xEvent's sequenceNumber is the bottom of 16 bit of XEvent's
+xany.serial, the top of 16 bit is sent by serial number(INT16).
+</para>
+
+<para>
+<function>XIM_FORWARD_EVENT</function>
+message is used for forwarding the events from the IM library to the IM Server
+in order for IM to be able to filter the event. On the other hand, this
+message is also used for forwarding the events from the IM Server to the IM
+library if the event forwarded from the IM library is not filtered.
+The IM Server, which receives
+<function>XIM_FORWARD_EVENT</function>
+message without synchronous bit, should set synchronous bit.
+If both "request event filtering" and "request lookupstring" flag are
+set, then both filtering and lookup should be done for the same event.
+</para>
+
+</sect2>
+
+<sect2 id="Synchronizing_with_the_IM_Server">
+<title>Synchronizing with the IM Server</title>
+
+<para>
+<function>XIM_SYNC</function>
+message requests to synchronize the IM library and the IM Server.
+</para>
+
+<literallayout class="monospaced">
+XIM_SYNC (IM library &lt;--&gt; IM Server)
+     2     CARD16     input-method-ID
+     2     CARD16     input-context-ID
+</literallayout>
+
+<para>
+This synchronization can be started either on the IM library side or on the
+IM Server side.  The side which receives
+<function>XIM_SYNC</function>
+message should process all XIM requests before replying. The input-context-ID
+is necessary to distinguish the IC with which the IM library and the IM
+Server are synchronized.
+</para>
+
+<literallayout class="monospaced">
+XIM_SYNC_REPLY (IM Server &lt;--&gt; IM library)
+     2     CARD16     input-method-ID
+     2     CARD16     input-context-ID
+</literallayout>
+
+
+
+<para>
+The side which receives
+<function>XIM_FORWARD_EVENT, </function>
+<function>XIM_COMMIT</function>
+or any other message with synchronous bit, should process all XIM request
+before replying, and send
+<function>XIM_SYNC_REPLY</function>
+message as the reply to the previous message.
+</para>
+
+</sect2>
+
+<sect2 id="Sending_a_committed_string">
+<title>Sending a committed string</title>
+<para>
+When the IM Server commits a string, the IM Server sends either the committed
+string or list of KeySym, or both, by
+<function>XIM_COMMIT</function>
+message.
+</para>
+
+<literallayout class="monospaced">
+XIM_COMMIT (IM Server -&gt; IM library)
+
+     2     CARD16          input-method-ID
+     2     CARD16          input-context-ID
+     2     BITMASK16       flag
+           #0001           synchronous
+           #0002           XLookupChars
+           #0004           XLookupKeySym
+           #0006           XLookupBoth = XLookupChars | XLookupKeySym
+</literallayout>
+
+<para>
+If flag is XLookupKeySym, the arguments continue as follows:
+</para>
+
+<literallayout class="monospaced">
+     2                unused
+     4     KEYSYM     KeySym
+</literallayout>
+
+<para>
+If flag is XLookupChars, the arguments continue as follows
+</para>
+
+<literallayout class="monospaced">
+     2     m              byte length of committed string
+     m     LISTofBYTE     committed string
+     p                    unused, p = Pad(m)
+</literallayout>
+
+<para>
+If flag is XLookupBoth, the arguments continue as follows
+</para>
+
+<literallayout class="monospaced">
+     2                    unused
+     4     KEYSYM         KeySym
+     2     n              byte length of committed string
+     n     LISTofBYTE     committed string
+     p                    unused, p = Pad(2+n)
+</literallayout>
+
+<para>
+The IM Server which receives
+<function>XIM_COMMIT</function>
+message without synchronous bit should set synchronous bit.
+</para>
+
+</sect2>
+
+<sect2 id="Reset_IC">
+<title>Reset IC</title>
+<para>
+<function>XIM_RESET_IC</function>
+message requests to reset the status of IC in the IM Server.
+</para>
+
+<literallayout class="monospaced">
+XIM_RESET_IC (IM library -&gt; IM Server)
+     2     CARD16     input-method-ID
+     2     CARD16     input-context-ID
+</literallayout>
+
+
+<para>
+<function>XIM_RESET_IC</function>
+is a synchronous request. The IM library should wait until receiving either an
+<function>XIM_RESET_IC_REPLY</function> packet or an
+<function>XIM_ERROR</function> packet.
+</para>
+
+<literallayout class="monospaced">
+XIM_RESET_IC_REPLY (IM Server -&gt; IM library)
+
+     2     CARD16         input-method-ID
+     2     CARD16         input-context-ID
+     2     n              byte length of preedit string
+     n     LISTofBYTE     preedit string
+     p                    unused, p = Pad(2+n)
+</literallayout>
+
+<para>
+<function>XIM_RESET_IC_REPLY </function>
+message returns the input-context-ID to distinguish replies from multiple ICs.
+</para>
+
+</sect2>
+<sect2 id="Callbacks">
+<title>Callbacks</title>
+<para>
+If XIMStyle has XIMPreeditArea or XIMStatusArea set, XIMGeometryCallback
+may be used, and if XIMPreeditCallback and/or XIMStatusCallback are set,
+corresponding callbacks may be used.
+</para>
+
+<para>
+Any callback request may be sent from an IM Server to an IM client
+asynchronously in response to any request previously sent by the IM client
+to the IM Server.
+</para>
+
+<para>
+When an IM Server needs to send a callback request synchronously with
+the request previously sent by an IM client, the IM Server sends it
+before replying to the previous request.
+</para>
+
+<sect3 id="Negotiating_geometry">
+<title>Negotiating geometry</title>
+<para>
+The IM Server sends
+<function>XIM_GEOMETRY </function>
+message to start geometry negotiation, if XIMStyle has XIMPreeditArea or
+XIMStatusArea set.
+</para>
+
+
+<literallayout class="monospaced">
+XIM_GEOMETRY (IM Server -&gt; IM library)
+
+     2     CARD16     input-method-ID
+     2     CARD16     input-context-ID
+</literallayout>
+
+<para>
+There is always a single Focus Window, even if some input fields have only
+one IC.
+</para>
+
+</sect3>
+
+<sect3 id="Converting_a_string">
+<title>Converting a string</title>
+
+<literallayout class="monospaced">
+XIM_STR_CONVERSION (IM Server -&gt; IM library)
+
+     2     CARD16     input-method-ID
+     2     CARD16     input-context-ID
+     2     CARD16     XIMStringConversionPosition
+     2                unused
+     4     CARD32     XIMCaretDirection
+           #0         XIMForwardChar
+           #1         XIMBackwardChar
+           #2         XIMForwardWord
+           #3         XIMBackwardWord
+           #4         XIMCaretUp
+           #5         XIMCaretDown
+           #6         XIMNextLine
+           #7         XIMCPreviousLine
+           #8         XIMLineStart
+           #9         XIMLineEnd
+           #10        XIMAbsolutePosition
+           #11        XIMDontChange
+     2     CARD16     factor
+     2     CARD16     XIMStringConversionOperation
+           #0001      XIMStringConversionSubstitution
+           #0002      XIMStringConversionRetrieval
+     2     INT16      byte length to multiply the XIMStringConversionType
+</literallayout>
+
+<para>
+<function>XIM_STR_CONVERSION </function>
+message may be used to start the string conversion from the IM Server.
+</para>
+
+<literallayout class="monospaced">
+XIM_STR_CONVERSION_REPLY (IM library -&gt; IM Server)
+
+     2     CARD16             input-method-ID
+     2     CARD16             input-context-ID
+     4     CARD32             XIMStringConversionFeedback
+           XIMSTRCONVTEXT     XIMStringConversionText
+</literallayout>
+
+<para>
+<function>XIM_STR_CONVERSION_REPLY </function>
+message returns the string to be converted and the feedback information array.
+</para>
+</sect3>
+
+<sect3 id="Preedit_Callbacks">
+<title>Preedit Callbacks</title>
+
+<para>
+The IM Server sends
+<function>XIM_PREEDIT_START </function>
+message to call the XIMPreeditStartCallback function.
+</para>
+
+<literallayout class="monospaced">
+XIM_PREEDIT_START (IM Server -&gt; IM library)
+
+     2     CARD16     input-method-ID
+     2     CARD16     input-context-ID
+</literallayout>
+
+<para>
+The reply to this message must be sent synchronously. The reply forwards
+the return value from the callback function to the IM Server.
+</para>
+
+<literallayout class="monospaced">
+XIM_PREEDIT_START_REPLY (IM library -&gt; IM Server)
+
+     2     CARD16     input-method-ID
+     2     CARD16     input-context-ID
+     4     INT32     return value
+</literallayout>
+
+<para>
+<function>XIM_PREEDIT_START_REPLY</function>
+message returns the input-context-ID to distinguish replies from multiple
+IC's.  The return value contains the return value of the function
+XIMPreeditStartCallback.
+</para>
+
+<para>
+The IM Server sends
+<function>XIM_PREEDIT_DRAW </function>
+message to call the XIMPreeditDrawCallback function.
+</para>
+
+<literallayout class="monospaced">
+XIM_PREEDIT_DRAW (IM Server -&gt; IM library)
+
+     2     CARD16                input-method-ID
+     2     CARD16                input-context-ID
+     4     INT32                 caret
+     4     INT32                 chg_first
+     4     INT32                 chg_length
+     4     BITMASK32             status
+           #x0000001             no string
+           #x0000002             no feedback
+     2     n                     length of preedit string
+     n     STRING8               preedit string
+     p                           unused, p = Pad(2+n)
+     2     m                     byte length of feedback array
+     2                           unused
+     m     LISTofXIMFEEDBACK     feedback array
+</literallayout>
+
+<para>
+The fields "caret", "chg_first" and "chg_length" correspond to the
+fields of XIMPreeditDrawCallbackStruct.
+When the "no string" bit of the status field is set, the text field of
+XIMPreeditDrawCallbackStruct is NULL.
+When the "no feedback" bit of the status field is set, the text feedback
+field of XIMPreeditDrawCallbackStruct is NULL.
+When the above bits are not set, "preedit string" contains the preedit
+string to be displayed, and the feedback array contains feedback information.
+</para>
+
+<para>
+The IM Server sends
+<function>XIM_PREEDIT_CARET</function>
+message to call the PreeditCaretCallback function.
+</para>
+
+<literallayout class="monospaced">
+XIM_PREEDIT_CARET (IM Server -&gt; IM library)
+
+     2     CARD16     input-method-ID
+     2     CARD16     input-context-ID
+     4     INT32      position
+     4     CARD32     direction
+           #0         XIMForwardChar
+           #1         XIMBackwardChar
+           #2         XIMForwardWord
+           #3         XIMBackwardWord
+           #4         XIMCaretUp
+           #5         XIMCaretDown
+           #6         XIMNextLine
+           #7         XIMCPreviousLine
+           #8         XIMLineStart
+           #9         XIMLineEnd
+           #10        XIMAbsolutePosition
+           #11        XIMDontChange
+     4     CARD32     style
+           #0         XIMInvisible
+           #1         XIMCPrimary
+           #2         XIMSecondary
+</literallayout>
+
+<para>
+Each entry corresponds to a field of XIMPreeditCaretCallbackStruct.
+Since this callback sets the caret position, its reply must be sent
+synchronously.
+</para>
+
+<literallayout class="monospaced">
+XIM_PREEDIT_CARET_REPLY (IM library -&gt; IM Server)
+
+     2     CARD16     input-method-ID
+     2     CARD16     input-context-ID
+     4     CARD32     position
+</literallayout>
+
+<para>
+The position is the value returned by the callback function after it
+has been called.
+</para>
+
+<para>
+The IM Server sends
+<function>XIM_PREEDIT_DONE </function>
+message to call the XIMPreeditDoneCallback function.
+</para>
+
+<literallayout class="monospaced">
+XIM_PREEDIT_DONE (IM Server -&gt; IM library)
+
+     2     CARD16     input-method-ID
+     2     CARD16     input-context-ID
+</literallayout>
+
+</sect3>
+
+<sect3 id="Preedit_state_notify">
+<title>Preedit state notify</title>
+
+<literallayout class="monospaced">
+XIM_PREEDITSTATE (IM Server -&gt; IM Library)
+     2     CARD16        input-method-ID
+     2     CARD16        input-context-ID
+     4     BITMASK32     XIMPreeditState
+           #x0000000     XIMPreeditUnknown
+           #x0000001     XIMPreeditEnable
+           #x0000002     XIMPreeditDisable
+</literallayout>
+
+<para>
+<function>XIM_PREEDITSTATE</function>
+message is used to call the XIMPreeditStateNotifyCallback function.
+</para>
+
+</sect3>
+
+<sect3 id="Status_Callbacks">
+<title>Status Callbacks</title>
+
+<para>
+The IM Server sends
+<function>XIM_STATUS_START </function>
+message to call the XIMStatusStartCallback function.
+</para>
+
+<literallayout class="monospaced">
+XIM_STATUS_START (IM Server -&gt; IM library)
+
+     2     CARD16     input-method-ID
+     2     CARD16     input-context-ID
+</literallayout>
+
+<para>
+The IM Server sends
+<function>XIM_STATUS_DRAW </function>
+message to call the XIMStatusDrawCallback function.
+</para>
+
+<literallayout class="monospaced">
+XIM_STATUS_DRAW (IM Server -&gt; IM library)
+
+     2     CARD16     input-method-ID
+     2     CARD16     input-context-ID
+     4     CARD32     type
+           #0         XIMTextType
+           #1         XIMBitmapType
+</literallayout>
+
+<para>
+If type is XIMTextType, the arguments continue as follows.
+</para>
+
+<literallayout class="monospaced">
+     4     BITMASK32            status
+           #x0000001            no string
+           #x0000002            no feedback
+     2     n                    length of status string
+     n     STRING8              status string
+     p                          unused, p = Pad(2+n)
+     2     m                    byte length of feedback array
+     2                          unused
+     m     LISTofXIMFEEDBACK    feedback array
+</literallayout>
+
+<para>
+If type is XIMBitmapType, the arguments continue as follows.
+</para>
+
+<literallayout class="monospaced">
+     4     PIXMAP     pixmap data
+</literallayout>
+
+<para>
+The field "type" corresponds to the field in XIMStatusDrawCallbackStruct.
+</para>
+
+<para>
+The IM Server sends
+<function>XIM_STATUS_DONE </function>
+message to call the XIMStatusDoneCallback function.
+</para>
+
+<literallayout class="monospaced">
+XIM_STATUS_DONE (IM Server -&gt; IM library)
+
+     2     CARD16     input-method-ID
+     2     CARD16     input-context-ID
+</literallayout>
+
+</sect3>
+</sect2>
+</sect1>
+
+<sect1 id="Acknowledgements">
+<title>Acknowledgements</title>
+<para>
+This document represents the culmination of several years of debate and
+experiments done under the auspices of the MIT X Consortium i18n working
+group.  Although this was a group effort, the author remains responsible
+for any errors or omissions.
+</para>
+
+<para>
+We would like to thank to all members of this group.
+And we would like to make special thanks to the following people
+(in alphabetical order) for their participation in the IM Protocol
+design,
+Hector Chan, Takashi Fujiwara, Yoshio Horiuchi, Makoto Inada,
+Hiromu Inukai, Mickael Kung, Seiji Kuwari, Franky Ling, Hiroyuki Machida,
+Hiroyuki Miyamoto, Frank Rojas, Bob Scheifler, Makiko Shimamura,
+Shoji Sugiyama, Hidetoshi Tajima, Masaki Takeuchi, Makoto Wakamatsu,
+Masaki Wakao, Nobuyuki Tanaka, Shigeru Yamada, Katsuhisa Yano, Jinsoo Yoon.
+</para>
+
+</sect1>
+
+<bibliography>
+<title>References</title>
+<biblioentry>
+  <title>X Window System Protocol Version 11</title>
+  <author><firstname>Robert W.</firstname><surname>Scheifler</surname></author>
+</biblioentry>
+
+<biblioentry>
+  <title>Xlib - C Language X Interface"</title>
+  <author><firstname>Robert W.</firstname><surname>Scheifler</surname></author>
+</biblioentry>
+</bibliography>
+
+<appendix id="common_extensions">
+<title>Common Extensions</title>
+<para>
+Extension opcodes and packet names (e.g.
+<function>XIM_EXT_SET_EVENT_MASK</function>
+) for additional extensions may be registered with X Consortium.
+The following is a commonly well-known extended packet.
+</para>
+
+<para>
+(1) Extension to manipulate the event handling\fP
+</para>
+
+<para>
+<!-- .LP -->
+<function>XIM_EXT_SET_EVENT_MASK </function>
+message specifies the set of event masks that the IM library should manipulate.
+</para>
+
+<literallayout class="monospaced">
+XIM_EXT_SET_EVENT_MASK (IM Server -&gt; IM library)
+
+     2     CARD16        input-method-ID
+     2     CARD16        input-context-ID
+     4     EVENTMASK     filter-event-mask (*1)
+     4     EVENTMASK     intercept-event-mask (*2)
+     4     EVENTMASK     select-event-mask (*3)
+     4     EVENTMASK     forward-event-mask (*4)
+     4     EVENTMASK     synchronous-event-mask (*5)
+
+     (*1) Specify the events to be neglected by the IM library via XFilterEvent.
+     (*2) Specify the events to be deselected by the IM library with XSelectInput.
+     (*3) Specify the events to be selected by the IM library with XSelectInput.
+     (*4) Specify all the events to be forwarded to the IM Server by the IM library.
+     (*5) Specify the events to be forwarded with synchronous flag on by the IM library.
+</literallayout>
+
+<para>
+<!-- .LP -->
+The IM library must reply
+<function>XIM_SYNC_REPLY</function>
+message to the IM Server. This request is valid after the ic is created.
+</para>
+
+<para>
+(2) Extension for improvement of performance.
+</para>
+<para>
+The following requests may be used for improvement of performance.
+</para>
+
+<para>
+<function>XIM_EXT_FORWARD_KEYEVENT</function>
+message may be used instead of
+<function>XIM_FORWARD_EVENT</function>
+message.
+</para>
+
+<literallayout class="monospaced">
+XIM_EXT_FORWARD_KEYEVENT (IM Server &lt;--&gt; IM library)
+     2     CARD16     input-method-ID
+     2     CARD16     input-context-ID
+     2     BITMASK16     flag
+          #0001     synchronous
+     2     CARD16     sequence number
+     1     BYTE     xEvent.u.u.type
+     1     BYTE     keycode
+     2     CARD16     state
+     4     CARD32     time
+     4     CARD32     window
+</literallayout>
+
+<para>
+<function>XIM_EXT_MOVE</function>
+message may be used to change the spot location instead of
+<function></function>
+XIM_SET_IC_VALUES
+message.
+It is effective only if the client specified XIMPreeditPosition.
+</para>
+
+
+<literallayout class="monospaced">
+XIM_EXT_MOVE (IM library -&gt; IM Server)
+
+     2     CARD16     input-method-ID
+     2     CARD16     input-context-ID
+     2     INT16     X
+     2     INT16     Y
+</literallayout>
+
+<para>
+<function>XIM_EXT_MOVE</function>
+message is a asynchronous request.
+</para>
+
+</appendix>
+<appendix id="transport_list">
+<title>Transport List</title>
+
+<para>
+The list of transport specific IM Server address format registered
+</para>
+
+<para>
+The following format represents the ATOM contained in
+<function>XIM_SERVERS</function>
+property and the string returned from the request converting
+selection target LOCALES and TRANSPORT.
+</para>
+<literallayout class="monospaced">
+     "{<emphasis remap='I'>category</emphasis>=[<emphasis remap='I'>value</emphasis>,...]}..."
+</literallayout>
+<para>
+The following categories are currently registered.
+</para>
+
+<literallayout class="monospaced">
+<function>server</function>;: IM Server name (used for XIM_SERVERS)
+<function>locale</function>;: XPG4 locale name (LOCALES)
+<function>transport</function>;: transport-specific name (TRANSPORT)
+</literallayout>
+
+<para>
+The preregistered formats for transport-specific names are as follows:
+</para>
+
+<para>
+<function>TCP/IP Names</function>
+</para>
+
+<para>
+The following syntax should be used for system internal domain names:
+</para>
+<literallayout class="monospaced">
+&lt;<emphasis remap='I'>local name</emphasis>&gt;  ::= "local/"&lt;<emphasis remap='I'>hostname</emphasis>&gt;":"&lt;<emphasis remap='I'>pathname</emphasis>&gt;
+</literallayout>
+<para>
+Where &lt;<emphasis remap='I'>pathname</emphasis>&gt; is a path name of socket address.
+</para>
+
+<para>
+IM Server's name should be set to &lt;<emphasis remap='I'>pathname</emphasis>&gt; to run multiple IM Server
+at the same time
+</para>
+
+<para>
+The following syntax should be used for Internet domain names:
+</para>
+<literallayout class="monospaced">
+&lt;<emphasis remap='I'>TCP name</emphasis>&gt;  ::=  "tcp/"&lt;<emphasis remap='I'>hostname</emphasis>&gt;":"&lt;<emphasis remap='I'>ipportnumber</emphasis>&gt;
+</literallayout>
+<para>
+where &lt;<emphasis remap='I'>hostname</emphasis>&gt; is either symbolic (such as expo.lcs.mit.edu) or
+numeric decimal (such as 18.30.0.212).  The &lt;<emphasis remap='I'>ipportnumber</emphasis>&gt; is the
+port on which the IM Server is listening for connections.
+For example:
+</para>
+<literallayout class="monospaced">
+tcp/expo.lcs.mit.edu:8012
+tcp/18.30.0.212:7890
+</literallayout>
+
+<para>
+<function>DECnet Names</function>
+</para>
+
+<para>
+The following syntax should be used for DECnet names:
+</para>
+<literallayout class="monospaced">
+&lt;<emphasis remap='I'>DECnet name</emphasis>&gt;  ::=  "decnet/"&lt;<emphasis remap='I'>nodename</emphasis>&gt;"::IMSERVER$"&lt;<emphasis remap='I'>objname</emphasis>&gt;
+</literallayout>
+<para>
+where &lt;<emphasis remap='I'>nodename</emphasis>&gt; is either
+symbolic (such as SRVNOD) or the numeric
+decimal form of the DECnet address (such as 44.70).
+The &lt;<emphasis remap='I'>objname</emphasis>&gt;
+is normal, case-insensitive DECnet object name. For example:
+</para>
+
+<literallayout class="monospaced">
+DECNET/SRVNOD::IMSERVER$DEFAULT
+decnet/44.70::IMSERVER$other
+</literallayout>
+
+<para>
+<function>X Names</function>
+</para>
+
+<para>
+The following syntax should be used for X names:
+</para>
+<literallayout class="monospaced">
+&lt;<emphasis remap='I'>X name</emphasis>&gt;  ::=  "X/"
+</literallayout>
+
+<para>
+If a given category has multiple values, the value is evaluated in order of
+setting.
+</para>
+
+</appendix>
+<appendix id="protocol_number">
+<title>Protocol Number</title>
+
+<para>
+<function>Major Protocol number</function>
+</para>
+
+<literallayout class="monospaced">
+XIM_CONNECT                                  #001
+XIM_CONNECT_REPLY                            #002
+XIM_DISCONNECT                               #003
+XIM_DISCONNECT_REPLY                         #004
+
+XIM_AUTH_REQUIRED                            #010
+XIM_AUTH_REPLY                               #011
+XIM_AUTH_NEXT                                #012
+XIM_AUTH_SETUP                               #013
+XIM_AUTH_NG                                  #014
+
+XIM_ERROR                                    #020
+
+XIM_OPEN                                     #030
+XIM_OPEN_REPLY                               #031
+XIM_CLOSE                                    #032
+XIM_CLOSE_REPLY                              #033
+XIM_REGISTER_TRIGGERKEYS                     #034
+XIM_TRIGGER_NOTIFY                           #035
+XIM_TRIGGER_NOTIFY_REPLY                     #036
+XIM_SET_EVENT_MASK                           #037
+XIM_ENCODING_NEGOTIATION                     #038
+XIM_ENCODING_NEGOTIATION_REPLY               #039
+XIM_QUERY_EXTENSION                          #040
+XIM_QUERY_EXTENSION_REPLY                    #041
+XIM_SET_IM_VALUES                            #042
+XIM_SET_IM_VALUES_REPLY                      #043
+XIM_GET_IM_VALUES                            #044
+XIM_GET_IM_VALUES_REPLY                      #045
+
+XIM_CREATE_IC                                #050
+XIM_CREATE_IC_REPLY                          #051
+XIM_DESTROY_IC                               #052
+XIM_DESTROY_IC_REPLY                         #053
+XIM_SET_IC_VALUES                            #054
+XIM_SET_IC_VALUES_REPLY                      #055
+XIM_GET_IC_VALUES                            #056
+XIM_GET_IC_VALUES_REPLY                      #057
+XIM_SET_IC_FOCUS                             #058
+XIM_UNSET_IC_FOCUS                           #059
+XIM_FORWARD_EVENT                            #060
+XIM_SYNC                                     #061
+XIM_SYNC_REPLY                               #062
+XIM_COMMIT                                   #063
+XIM_RESET_IC                                 #064
+XIM_RESET_IC_REPLY                           #065
+
+XIM_GEOMETRY                                 #070
+XIM_STR_CONVERSION                           #071
+XIM_STR_CONVERSION_REPLY                     #072
+XIM_PREEDIT_START                            #073
+XIM_PREEDIT_START_REPLY                      #074
+XIM_PREEDIT_DRAW                             #075
+XIM_PREEDIT_CARET                            #076
+XIM_PREEDIT_CARET_REPLY                      #077
+XIM_PREEDIT_DONE                             #078
+XIM_STATUS_START                             #079
+XIM_STATUS_DRAW                              #080
+XIM_STATUS_DONE                              #081
+XIM_PREEDITSTATE                             #082
+
+(*) The IM Server's extension protocol number should be more than #128.
+</literallayout>
+</appendix>
+
+<appendix id="implementation_tips">
+
+<title>Implementation Tips</title>
+<para>
+(1) FrontEnd Method
+</para>
+
+<para>
+FrontEnd method is recognized as a performance acceleration by the
+trade off of the variety of the reliability.
+</para>
+
+<para>
+In order to use the FrontEnd method, the IM library must query the IM
+Server to see if the FrontEnd extension is available.  The query is
+made by using the
+<function>XIM_QUERY_EXTENSION</function>
+message. The IM Server may send
+<function>XIM_EXT_SET_EVENT_MASK</function>
+message with intercept-event-mask, forward-event-mask, and
+synchronous-event-mask values set after replying
+<function>XIM_QUERY_EXTENSION_REPLY</function>
+message.
+</para>
+
+<para>
+FrontEnd method can be implemented in a couple of ways depending on
+how the IM Server utilize
+<function>XIM_EXT_SET_EVENT_MASK</function>
+message.
+</para>
+
+<para>
+One approach is to update both of the input mask and the filter-event-mask
+depending on the preeidting state. The sample protocol sequence using the
+static event flow is as follows:
+</para>
+
+<mediaobject  id="staticflow">
+  <imageobject>
+    <imagedata  scale="75" format="SVG"  fileref="staticflow.svg"/>
+  </imageobject>
+  <caption>The flow of events</caption>
+</mediaobject>
+
+<para>
+To pursuit a maximum performance regardless of the preediting mode,
+the IM Server may use the dynamic event flow with the following
+sample protocol sequence.
+</para>
+
+<mediaobject  id="dynamicflow">
+  <imageobject>
+    <imagedata  scale="75" format="SVG"  fileref="dynamicflow.svg"/>
+  </imageobject>
+  <caption>The flow of events</caption>
+</mediaobject>
+
+<para>
+This method can reduce the XIM protocol traffic dramatically
+by updating intercept-event-mask and select-event-mask accordingly.
+The tradeoff of this performance improvement is that the key
+events may be lost or disordered in some particular situation, such as
+when the user types the keyboard in following sequence really fast:
+</para>
+
+<para>
+&lt;preediting on key&gt;"some strings"&lt;preediting off
+key&gt;"another string"
+</para>
+
+<para>
+Since this method requires the input mask updates to the both the IM Server
+and Xlib when turning on and off the preediting, and there is a time lag
+till the requests take effect when two client issues the input mask updates
+simultaneously.
+</para>
+
+<para>
+Another approach of the FrontEnd method is to update the filter-event-mask
+depending on the preediting state and not to update the input mask.
+The IM Server must register both of the preediting on key list and off key
+list by
+<function>XIM_REGISTER_TRIGGERKEYS</function>
+message.
+In this method, Both the IM Server and the IM client select the same
+events on the same client's window, so that the events are delivered
+to both of the IM Server and the client. The preediting on and off
+states are expressed by whether the key events are filtered or not.
+The sample protocol sequence are as follows:
+</para>
+
+<para>
+&lt;&lt;Using static event flow&gt;&gt;
+</para>
+
+<mediaobject  id="staticflowsampleseq">
+  <imageobject>
+    <imagedata  scale="75" format="SVG"  fileref="staticflowsampleseq.svg"/>
+  </imageobject>
+  <caption>The flow of events</caption>
+</mediaobject>
+
+<para>
+&lt;&lt;Using the dynamic event flow&gt;&gt;
+</para>
+
+<mediaobject  id="dynamicflowsampleseq">
+  <imageobject>
+    <imagedata  scale="75" format="SVG"  fileref="dynamicflowsampleseq.svg"/>
+  </imageobject>
+  <caption>The flow of events</caption>
+</mediaobject>
+
+<para>
+This method does not have the problem of the time lag when going across
+the preediting on and off mode, however, the amount of the performance
+acceleration is not as good as the method described above.
+</para>
+
+<para>
+In general, the FrontEnd method requires some synchronization to some
+of the X protocols, such as the ChangeWindowAttribute protocol for the
+event mask change or the GrabKey protocol, since it relies on the X's
+principal event dispatching mechanism. Any X protocol bindings do not
+consider the synchronization might cause some mis-synchronization
+between the IM clients and the IM Server.
+</para>
+
+<para>
+(2) Transport Layer
+</para>
+
+<para>
+The Xlib XIM implementation is layered into three functions, a protocol
+layer, an interface layer and a transport layer. The purpose of this
+layering is to make the protocol independent of transport implementation.
+Each function of these layers are:
+</para>
+
+<variablelist>
+  <varlistentry>
+    <term>The protocol layer</term>
+    <listitem>
+      <para>
+implements overall function of XIM and calls the interface layer
+functions when it needs to communicate to IM Server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>The interface layer</term>
+    <listitem>
+      <para>
+separates the implementation of the transport layer from the protocol
+layer, in other words, it provides implementation independent hook for
+the transport layer functions.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>The transport layer</term>
+    <listitem>
+      <para>
+handles actual data communication with IM Server. It is done by a set
+of several functions named transporters.
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The interface layer and the transport layer make various communication
+channels usable such as X Protocol, TCP/IP, DECnet or STREAM.
+The following is a sample implementation for the transporter using
+the X connection.
+Refer to "xtrans" for the transporter using Socket Transport. <!-- xref ?-->
+</para>
+
+<para>
+At the beginning of the X Transport connection for the XIM transport
+mechanism, two different windows must be created either in an Xlib XIM
+or in an IM Server, with which the Xlib and the IM Server exchange the
+XIM transports by using the ClientMessage events and Window Properties.
+In the following, the window created by the Xlib is referred as the
+"client communication window", and on the other hand, the window created
+by the IM Server is referred as the "IMS communication window".
+</para>
+
+<para>
+Connection
+</para>
+
+<para>
+In order to establish a connection, a communication window is created.
+A ClientMessage in the following event's format is sent to the owner
+window of XIM_SERVER selection, which the IM Server has created.
+</para>
+
+<para>
+Refer to "The Input Method Protocol" for the XIM_SERVER atom. <!-- xref -->
+</para>
+
+<table frame="topbot" id="clientmessage_sent_to_the_ims_window">
+  <?dbfo keep-together="always" ?>
+  <title>The ClientMessage sent to the IMS window.</title>
+  <tgroup cols="3" align='left' colsep='0' rowsep='0'>
+  <colspec colname="col1" colwidth="1.0*"/>
+  <colspec colname="col2" colwidth="1.0*" colsep="1"/>
+  <colspec colname="col3" colwidth="3.5*"/>
+  <spanspec namest="col1" nameend="col2" spanname="span-horiz" align="center"/>
+  <thead>
+    <row rowsep='1'>
+      <entry spanname="span-horiz" colsep='1'>Structure Member</entry>
+      <entry>Contents</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>int</entry>
+      <entry>type</entry>
+      <entry>ClientMessage</entry>
+    </row>
+    <row>
+      <entry>u_long</entry>
+      <entry>serial</entry>
+      <entry>Set by the X Window System</entry>
+    </row>
+    <row>
+      <entry>Bool</entry>
+      <entry>send_event</entry>
+      <entry>Set by the X Window System</entry>
+    </row>
+    <row>
+      <entry>Display</entry>
+      <entry>*display</entry>
+      <entry>The display to which connects</entry>
+    </row>
+    <row>
+      <entry>Window</entry>
+      <entry>window</entry>
+      <entry>IMS Window ID</entry>
+    </row>
+    <row>
+      <entry>Atom</entry>
+      <entry>message_type</entry>
+      <entry>XInternAtom(display, "_XIM_XCONNECT", False)</entry>
+    </row>
+    <row>
+      <entry>int</entry>
+      <entry>format</entry>
+      <entry>32</entry>
+    </row>
+    <row>
+      <entry>long</entry>
+      <entry>data.l[0]</entry>
+      <entry>client communication window ID</entry>
+    </row>
+    <row>
+      <entry>long</entry>
+      <entry>data.l[1]</entry>
+      <entry>client-major-transport-version (*1)</entry>
+    </row>
+    <row>
+      <entry>long</entry>
+      <entry>data.l[2]</entry>
+      <entry>client-major-transport-version (*1)</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</table>
+
+<para>
+In order to establish the connection (to notify the IM Server communication
+window), the IM Server sends a ClientMessage in the following event's
+format to the client communication window.
+</para>
+
+<table frame="topbot" id="clientmessage_sent_by_the_im_server">
+  <?dbfo keep-together="always" ?>
+  <title>The ClientMessage sent by the IM Server.</title>
+  <tgroup cols="3" align='left' colsep='0' rowsep='0'>
+  <colspec colname="col1" colwidth="1.0*"/>
+  <colspec colname="col2" colwidth="1.0*" colsep="1"/>
+  <colspec colname="col3" colwidth="3.5*"/>
+  <spanspec namest="col1" nameend="col2" spanname="span-horiz" align="center"/>
+  <thead>
+    <row rowsep='1'>
+      <entry spanname="span-horiz" colsep='1'>Structure Member</entry>
+      <entry>Contents</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>int</entry>
+      <entry>type</entry>
+      <entry>ClientMessage</entry>
+    </row>
+    <row>
+      <entry>u_long</entry>
+      <entry>serial</entry>
+      <entry>Set by the X Window System</entry>
+    </row>
+    <row>
+      <entry>Bool</entry>
+      <entry>send_event</entry>
+      <entry>Set by the X Window System</entry>
+    </row>
+    <row>
+      <entry>Display</entry>
+      <entry>*display</entry>
+      <entry>The display to which connects</entry>
+    </row>
+    <row>
+      <entry>Window</entry>
+      <entry>window</entry>
+      <entry>client communication window ID</entry>
+    </row>
+    <row>
+      <entry>Atom</entry>
+      <entry>message_type</entry>
+      <entry>XInternAtom(display, "_XIM_XCONNECT", False)</entry>
+    </row>
+    <row>
+      <entry>int</entry>
+      <entry>format</entry>
+      <entry>32</entry>
+    </row>
+    <row>
+      <entry>long</entry>
+      <entry>data.l[0]</entry>
+      <entry>IMS communication window ID</entry>
+    </row>
+    <row>
+      <entry>long</entry>
+      <entry>data.l[1]</entry>
+      <entry>server-major-transport-version (*1)</entry>
+    </row>
+    <row>
+      <entry>long</entry>
+      <entry>data.l[2]</entry>
+      <entry>server-minor-transport-version (*1)</entry>
+    </row>
+    <row>
+      <entry>long</entry>
+      <entry>data.l[3]</entry>
+      <entry>dividing size between ClientMessage and Property (*2)</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</table>
+
+<para>
+(*1) major/minor-transport-version
+</para>
+<para>
+The read/write method is decided by the combination of
+major/minor-transport-version, as follows:
+</para>
+
+
+<table frame="all" id="readwrite_method_and_the_majorminor_transport_version">
+  <?dbfo keep-together="always" ?>
+  <title>The read/write method and the major/minor-transport-version</title>
+  <tgroup cols="3" align='left' colsep='1' rowsep='1'>
+  <colspec colname="col1" colwidth="1.0*"/>
+  <colspec colname="col2" colwidth="1.0*"/>
+  <colspec colname="col3" colwidth="3.0*"/>
+  <spanspec namest="col1" nameend="col2" spanname="span-horiz" align="center"/>
+  <thead>
+    <row>
+      <entry spanname="span-horiz" colsep='1'>Transport-version</entry>
+      <entry>read/write</entry>
+    </row>
+    <row>
+      <entry>major</entry>
+      <entry>minor</entry>
+      <entry></entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry morerows="2">0</entry>
+      <entry>0</entry>
+      <entry>only-CM &amp; Property-with-CM</entry>
+    </row>
+    <row>
+      <entry>1</entry>
+      <entry>only-CM &amp; multi-CM</entry>
+    </row>
+    <row rowsep="1">
+      <entry>2</entry>
+      <entry>only-CM &amp; multi-CM &amp; Property-with-CM</entry>
+    </row>
+    <row rowsep="1">
+      <entry>1</entry>
+      <entry>0</entry>
+      <entry>PropertyNotify</entry>
+    </row>
+    <row>
+      <entry morerows="1">2</entry>
+      <entry>0</entry>
+      <entry>only-CM &amp; PropertyNotify</entry>
+    </row>
+    <row>
+      <entry>1</entry>
+      <entry>only-CM &amp; multi-CM &amp; PropertyNotify</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</table>
+
+<literallayout class="monospaced">
+only-CM            :    data is sent via a ClientMessage
+multi-CM           :    data is sent via multiple ClientMessages
+Property-with-CM   :    data is written in Property, and its Atom
+                        is send via ClientMessage
+PropertyNotify     :    data is written in Property, and its Atom
+                        is send via PropertyNotify
+
+</literallayout>
+
+<para>
+The method to decide major/minor-transport-version is as follows:
+</para>
+
+<itemizedlist>
+  <listitem>
+    <para>
+The client sends 0 as major/minor-transport-version to the IM Server.
+The client must support all methods in Table D-3.
+The client may send another number as major/minor-transport-version to
+use other method than the above in the future.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The IM Server sends its major/minor-transport-version number to
+the client. The client sends data using the method specified by the
+IM Server.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If major/minor-transport-version number is not available, it is regarded
+as 0.
+<!-- .RE -->
+    </para>
+  </listitem>
+</itemizedlist>
+
+<para>
+(*2) dividing size between ClientMessage and Property
+</para>
+
+<para>
+If data is sent via both of multi-CM and Property, specify the dividing
+size between ClientMessage and Property. The data, which is smaller than
+this size, is sent via multi-CM (or only-CM), and the data, which is
+lager than this size, is sent via Property.
+</para>
+
+<para>
+<emphasis role="bold">read/write</emphasis>
+</para>
+
+<para>
+The data is transferred via either ClientMessage or Window Property in
+the X Window System.
+</para>
+
+<para>
+Format for the data from the Client to the IM Server
+</para>
+
+<para>
+ClientMessage
+</para>
+
+<para>
+If data is sent via ClientMessage event, the format is as follows:
+</para>
+
+
+<table frame="topbot" id="clientmessage_events_format_first_or_middle">
+  <?dbfo keep-together="always" ?>
+<title>The ClientMessage event's format (first or middle)</title>
+  <tgroup cols="3" align='left' colsep='0' rowsep='0'>
+  <colspec colname="col1" colwidth="1.0*"/>
+  <colspec colname="col2" colwidth="1.0*" colsep="1"/>
+  <colspec colname="col3" colwidth="3.5*"/>
+  <spanspec namest="col1" nameend="col2" spanname="span-horiz" align="center"/>
+  <thead>
+    <row rowsep='1'>
+      <entry spanname="span-horiz" colsep='1'>Structure Member</entry>
+      <entry>Contents</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>int</entry>
+      <entry>type</entry>
+      <entry>ClientMessage</entry>
+    </row>
+    <row>
+      <entry>u_long</entry>
+      <entry>serial</entry>
+      <entry>Set by the X Window System</entry>
+    </row>
+    <row>
+      <entry>Bool</entry>
+      <entry>send_event</entry>
+      <entry>Set by the X Window System</entry>
+    </row>
+    <row>
+      <entry>Display</entry>
+      <entry>*display</entry>
+      <entry>The display to which connects</entry>
+    </row>
+    <row>
+      <entry>Window</entry>
+      <entry>window</entry>
+      <entry>IMS communication window ID</entry>
+    </row>
+    <row>
+      <entry>Atom</entry>
+      <entry>message_type</entry>
+      <entry>XInternAtom(display, "_XIM_MOREDATA", False)</entry>
+    </row>
+    <row>
+      <entry>int</entry>
+      <entry>format</entry>
+      <entry>8</entry>
+    </row>
+    <row>
+      <entry>char</entry>
+      <entry>data.b[20]</entry>
+      <entry>(read/write DATA : 20 byte)</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</table>
+
+<table frame="topbot" id="clientmessage_events_format_only_or_last">
+  <?dbfo keep-together="always" ?>
+<title>The ClientMessage event's format (only or last)</title>
+  <tgroup cols="3" align='left' colsep='0' rowsep='0'>
+  <colspec colname="col1" colwidth="1.0*"/>
+  <colspec colname="col2" colwidth="1.0*" colsep="1"/>
+  <colspec colname="col3" colwidth="3.5*"/>
+  <spanspec namest="col1" nameend="col2" spanname="span-horiz" align="center"/>
+  <thead>
+    <row rowsep='1'>
+      <entry spanname="span-horiz" colsep='1'>Structure Member</entry>
+      <entry>Contents</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>int</entry>
+      <entry>type</entry>
+      <entry>ClientMessage</entry>
+    </row>
+    <row>
+      <entry>u_long</entry>
+      <entry>serial</entry>
+      <entry>Set by the X Window System</entry>
+    </row>
+    <row>
+      <entry>Bool</entry>
+      <entry>send_event</entry>
+      <entry>Set by the X Window System</entry>
+    </row>
+    <row>
+      <entry>Display</entry>
+      <entry>*display</entry>
+      <entry>The display to which connects</entry>
+    </row>
+    <row>
+      <entry>Window</entry>
+      <entry>window</entry>
+      <entry>IMS communication window ID</entry>
+    </row>
+    <row>
+      <entry>Atom</entry>
+      <entry>message_type</entry>
+      <entry>XInternAtom(display, "_XIM_PROTOCOL", False)</entry>
+    </row>
+    <row>
+      <entry>int</entry>
+      <entry>format</entry>
+      <entry>8</entry>
+    </row>
+    <row>
+      <entry>char</entry>
+      <entry>data.b[20]</entry>
+      <entry>(read/write DATA : MAX 20 byte)  (*1)</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</table>
+
+<para>
+(*1) If the data is smaller than 20 byte, all data other than available data
+must be 0.
+</para>
+
+<para>
+Property
+</para>
+
+<para>
+In the case of large data, data will be sent via the Window Property
+for the efficiency.  There are the following two methods to notify
+Property, and transport-version is decided which method is used.
+</para>
+
+<itemizedlist>
+  <listitem>
+    <para>
+The XChangeProperty function is used to store data in the client
+communication window, and Atom of the stored data is notified to the
+IM Server via ClientMessage event.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The XChangeProperty function is used to store data in the client
+communication window, and Atom of the stored data is notified to the
+IM Server via PropertyNotify event.
+    </para>
+  </listitem>
+</itemizedlist>
+
+<para>
+The arguments of the XChangeProperty are as follows:
+</para>
+
+<table frame="topbot" id="xchangeproperty_events_format">
+  <?dbfo keep-together="always" ?>
+<title>The XChangeProperty event's format</title>
+  <tgroup cols="3" align='left' colsep='0' rowsep='0'>
+  <colspec colname="col1" colwidth="1.0*"/>
+  <colspec colname="col2" colwidth="1.0*" colsep="1"/>
+  <colspec colname="col3" colwidth="3.5*"/>
+  <spanspec namest="col1" nameend="col2" spanname="span-horiz" align="center"/>
+  <thead>
+    <row rowsep='1'>
+      <entry spanname="span-horiz" colsep='1'>Argument</entry>
+      <entry>Contents</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>Display</entry>
+      <entry>*display</entry>
+      <entry>The display to which connects</entry>
+    </row>
+    <row>
+      <entry>Window</entry>
+      <entry>window</entry>
+      <entry>IMS communication window ID</entry>
+    </row>
+    <row>
+      <entry>Atom</entry>
+      <entry>property</entry>
+      <entry>read/write property Atom (*1)</entry>
+    </row>
+    <row>
+      <entry>Atom</entry>
+      <entry>type</entry>
+      <entry>XA_STRING  </entry>
+    </row>
+    <row>
+      <entry>int</entry>
+      <entry>format</entry>
+      <entry>8</entry>
+    </row>
+    <row>
+      <entry>int</entry>
+      <entry>mode</entry>
+      <entry>PropModeAppend</entry>
+    </row>
+    <row>
+      <entry>u_char</entry>
+      <entry>*data</entry>
+      <entry>read/write DATA</entry>
+    </row>
+    <row>
+      <entry>int</entry>
+      <entry>nelements</entry>
+      <entry>length of DATA</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</table>
+
+<para>
+The read/write property ATOM allocates the following strings by
+<olink targetdoc='libX11' targetptr='XInternAtom'><function>XInternAtom</function></olink>.
+</para>
+
+<para>
+"_clientXXX"
+</para>
+
+<para>
+The client changes the property with the mode of PropModeAppend and
+the IM Server will read it with the delete mode i.e. (delete = True).
+</para>
+
+<para>
+If Atom is notified via ClientMessage event, the format of the ClientMessage
+is as follows:
+</para>
+
+<table frame="topbot" id="clientmessage_events_format_to_send_atom_of_property">
+  <?dbfo keep-together="always" ?>
+<title>The ClientMessage event's format to send Atom of property</title>
+  <tgroup cols="3" align='left' colsep='0' rowsep='0'>
+  <colspec colname="col1" colwidth="1.0*"/>
+  <colspec colname="col2" colwidth="1.0*" colsep="1"/>
+  <colspec colname="col3" colwidth="3.5*"/>
+  <spanspec namest="col1" nameend="col2" spanname="span-horiz" align="center"/>
+  <thead>
+    <row rowsep='1'>
+      <entry spanname="span-horiz" colsep='1'>Structure Members</entry>
+      <entry>Contents</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>int</entry>
+      <entry>type</entry>
+      <entry>ClientMessage</entry>
+    </row>
+    <row>
+      <entry>u_long</entry>
+      <entry>serial</entry>
+      <entry>Set by the X Window System</entry>
+    </row>
+    <row>
+      <entry>Bool</entry>
+      <entry>send_event</entry>
+      <entry>Set by the X Window System</entry>
+    </row>
+    <row>
+      <entry>Display</entry>
+      <entry>*display</entry>
+      <entry>The display to which connects</entry>
+    </row>
+    <row>
+      <entry>Window</entry>
+      <entry>window</entry>
+      <entry>IMS communication window ID</entry>
+    </row>
+    <row>
+      <entry>Atom</entry>
+      <entry>message_type</entry>
+      <entry>XInternAtom(display, "_XIM_PROTOCOL", False)</entry>
+    </row>
+    <row>
+      <entry>int</entry>
+      <entry>format</entry>
+      <entry>32</entry>
+    </row>
+    <row>
+      <entry>long</entry>
+      <entry>data.l[0]</entry>
+      <entry>length of read/write property Atom</entry>
+    </row>
+    <row>
+      <entry>long</entry>
+      <entry>data.l[1]</entry>
+      <entry>read/write property Atom</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</table>
+
+<para>
+Format for the data from the IM Server to the Client
+</para>
+
+<para>
+<!-- .LP -->
+<!-- .RS -->
+<!-- .B -->
+ClientMessage
+</para>
+<para>
+<!-- .LP -->
+The format of the ClientMessage is as follows:
+</para>
+
+
+
+<table frame="topbot" id="clientmessage_events_format_for_first_or_middle">
+  <?dbfo keep-together="always" ?>
+<title>The ClientMessage event's format (first or middle)</title>
+  <tgroup cols="3" align='left' colsep='0' rowsep='0'>
+  <colspec colname="col1" colwidth="1.0*"/>
+  <colspec colname="col2" colwidth="1.0*" colsep="1"/>
+  <colspec colname="col3" colwidth="3.5*"/>
+  <spanspec namest="col1" nameend="col2" spanname="span-horiz" align="center"/>
+  <thead>
+    <row rowsep='1'>
+      <entry spanname="span-horiz" colsep='1'>Structure Members</entry>
+      <entry>Contents</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>int</entry>
+      <entry>type</entry>
+      <entry>ClientMessage</entry>
+    </row>
+    <row>
+      <entry>u_long</entry>
+      <entry>serial</entry>
+      <entry>Set by the X Window System</entry>
+    </row>
+    <row>
+      <entry>Bool</entry>
+      <entry>send_event </entry>
+      <entry>Set by the X Window System</entry>
+    </row>
+    <row>
+      <entry>Display</entry>
+      <entry>*display</entry>
+      <entry>The display to which connects</entry>
+    </row>
+    <row>
+      <entry>Window</entry>
+      <entry>window</entry>
+      <entry>client communication window ID</entry>
+    </row>
+    <row>
+      <entry>Atom</entry>
+      <entry>message_type</entry>
+      <entry>XInternAtom(display, "_XIM_MOREDATA", False)</entry>
+    </row>
+    <row>
+      <entry>int</entry>
+      <entry>format</entry>
+      <entry>8</entry>
+    </row>
+    <row>
+      <entry>char</entry>
+      <entry>data.b[20]</entry>
+      <entry>(read/write DATA : 20 byte)</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</table>
+
+
+<table frame="topbot" id="clientmessage_events_format_for_only_or_last">
+  <?dbfo keep-together="always" ?>
+<title>The ClientMessage event's format (only or last)</title>
+  <tgroup cols="3" align='left' colsep='0' rowsep='0'>
+  <colspec colname="col1" colwidth="1.0*"/>
+  <colspec colname="col2" colwidth="1.0*" colsep="1"/>
+  <colspec colname="col3" colwidth="3.5*"/>
+  <spanspec namest="col1" nameend="col2" spanname="span-horiz" align="center"/>
+  <thead>
+    <row rowsep='1'>
+      <entry spanname="span-horiz" colsep='1'>Structure Members</entry>
+      <entry>Contents</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>int</entry>
+      <entry>type</entry>
+      <entry>ClientMessage</entry>
+    </row>
+    <row>
+      <entry>u_long</entry>
+      <entry>serial</entry>
+      <entry>Set by the X Window System</entry>
+    </row>
+    <row>
+      <entry>Bool</entry>
+      <entry>send_event </entry>
+      <entry>Set by the X Window System</entry>
+    </row>
+    <row>
+      <entry>Display</entry>
+      <entry>*display</entry>
+      <entry>The display to which connects</entry>
+    </row>
+    <row>
+      <entry>Window</entry>
+      <entry>window</entry>
+      <entry>client communication window ID</entry>
+    </row>
+    <row>
+      <entry>Atom</entry>
+      <entry>message_type</entry>
+      <entry>XInternAtom(display, "_XIM_PROTOCOL", False)</entry>
+    </row>
+    <row>
+      <entry>int</entry>
+      <entry>format</entry>
+      <entry>8</entry>
+    </row>
+    <row>
+      <entry>char</entry>
+      <entry>data.b[20]</entry>
+      <entry>(read/write DATA : MAX 20 byte) (*1)</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</table>
+
+<para>
+(*1) If the data size is smaller than 20 bytes, all data other than available
+data must be 0.
+</para>
+
+<para>
+Property
+</para>
+
+<para>
+In the case of large data, data will be sent via the Window Property
+for the efficiency. There are the following two methods to notify
+Property, and transport-version is decided which method is used.
+</para>
+
+<itemizedlist>
+  <listitem>
+    <para>
+The XChangeProperty function is used to store data in the IMS
+communication window, and Atom of the property is sent via the
+ClientMessage event.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The XChangeProperty function is used to store data in the IMS
+communication window, and Atom of the property is sent via
+PropertyNotify event.
+    </para>
+  </listitem>
+</itemizedlist>
+
+<para>
+The arguments of the XChangeProperty are as follows:
+</para>
+
+<table frame="topbot" id="xchangeproperty_events_format_2">
+  <?dbfo keep-together="always" ?>
+<title>The XChangeProperty event's format</title>
+  <tgroup cols="3" align='left' colsep='0' rowsep='0'>
+  <colspec colname="col1" colwidth="1.0*"/>
+  <colspec colname="col2" colwidth="1.0*" colsep="1"/>
+  <colspec colname="col3" colwidth="3.5*"/>
+  <spanspec namest="col1" nameend="col2" spanname="span-horiz" align="center"/>
+  <thead>
+    <row rowsep='1'>
+      <entry spanname="span-horiz" colsep='1'>Argument</entry>
+      <entry>Contents</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>Display</entry>
+      <entry>*display</entry>
+      <entry>The display which to connects</entry>
+    </row>
+    <row>
+      <entry>Window</entry>
+      <entry>window</entry>
+      <entry>client communication window ID</entry>
+    </row>
+    <row>
+      <entry>Atom</entry>
+      <entry>property</entry>
+      <entry>read/write property Atom (*1)</entry>
+    </row>
+    <row>
+      <entry>Atom</entry>
+      <entry>type</entry>
+      <entry>XA_STRING</entry>
+    </row>
+    <row>
+      <entry>int</entry>
+      <entry>format</entry>
+      <entry>8</entry>
+    </row>
+    <row>
+      <entry>int</entry>
+      <entry>mode</entry>
+      <entry>PropModeAppend</entry>
+    </row>
+    <row>
+      <entry>u_char</entry>
+      <entry>*data</entry>
+      <entry>read/write DATA</entry>
+    </row>
+    <row>
+      <entry>int</entry>
+      <entry>nelements</entry>
+      <entry>length of DATA</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</table>
+
+<para>
+(*1)  The read/write property ATOM allocates some strings, which are not
+allocated by the client, by <olink targetdoc='libX11' targetptr='XInternAtom'><function>XInternAtom</function></olink>.
+</para>
+
+<para>
+The IM Server changes the property with the mode of PropModeAppend and
+the client reads it with the delete mode, i.e. (delete = True).
+</para>
+
+<para>
+If Atom is notified via ClientMessage event, the format of the ClientMessage
+is as follows:
+</para>
+
+
+<table frame="topbot" id="clientmessage_events_format_to_send_atom_of_property_2">
+  <?dbfo keep-together="always" ?>
+<title>The ClientMessage event's format to send Atom of property</title>
+  <tgroup cols="3" align='left' colsep='0' rowsep='0'>
+  <colspec colname="col1" colwidth="1.0*"/>
+  <colspec colname="col2" colwidth="1.0*" colsep='1'/>
+  <colspec colname="col3" colwidth="3.5*"/>
+  <spanspec namest="col1" nameend="col2" spanname="span-horiz" align="center"/>
+  <thead>
+    <row rowsep='1'>
+      <entry spanname="span-horiz" colsep='1'>Structure Member</entry>
+      <entry>Contents</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>int</entry>
+      <entry>type</entry>
+      <entry>ClientMessage  </entry>
+    </row>
+    <row>
+      <entry>u_long</entry>
+      <entry>serial</entry>
+      <entry>Set by the X Window System  </entry>
+    </row>
+    <row>
+      <entry>Bool</entry>
+      <entry>send_event</entry>
+      <entry>Set by the X Window System  </entry>
+    </row>
+    <row>
+      <entry>Display</entry>
+      <entry>*display</entry>
+      <entry>The display to which connects  </entry>
+    </row>
+    <row>
+      <entry>Window</entry>
+      <entry>window</entry>
+      <entry>client communication window ID  </entry>
+    </row>
+    <row>
+      <entry>Atom</entry>
+      <entry>message_type</entry>
+      <entry>XInternAtom(display, "_XIM_PROTOCOL", False)</entry>
+    </row>
+    <row>
+      <entry>int</entry>
+      <entry>format</entry>
+      <entry>32  </entry>
+    </row>
+    <row>
+      <entry>long</entry>
+      <entry>data.l[0]</entry>
+      <entry>length of read/write property ATOM  </entry>
+    </row>
+    <row>
+      <entry>long</entry>
+      <entry>data.l[1]</entry>
+      <entry>read/write property ATOM  </entry>
+    </row>
+  </tbody>
+  </tgroup>
+</table>
+
+<para>
+Closing Connection
+</para>
+
+<para>
+If the client disconnect with the IM Server, shutdown function should
+free the communication window properties and etc..
+</para>
+</appendix>
+</article>
diff --git a/specs/XKB/Makefile.am b/specs/XKB/Makefile.am
new file mode 100644 (file)
index 0000000..90771cc
--- /dev/null
@@ -0,0 +1,61 @@
+
+if ENABLE_SPECS
+
+# Main DocBook/XML files (DOCTYPE book)
+docbook = xkblib.xml
+
+# Included chapters, appendix, images
+chapters =                     \
+       acknowledgement.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                \
+       ch14.xml                \
+       ch15.xml                \
+       ch16.xml                \
+       ch17.xml                \
+       ch18.xml                \
+       ch19.xml                \
+       ch20.xml                \
+       ch21.xml                \
+       ch22.xml                \
+       glossary.xml            \
+       XKBlib-1.svg            \
+       XKBlib-2.svg            \
+       XKBlib-3.svg            \
+       XKBlib-4.svg            \
+       XKBlib-5.svg            \
+       XKBlib-6.svg            \
+       XKBlib-7.svg            \
+       XKBlib-8.svg            \
+       XKBlib-9.svg            \
+       XKBlib-10.svg           \
+       XKBlib-11.svg           \
+       XKBlib-12.svg           \
+       XKBlib-13.svg           \
+       XKBlib-14.svg           \
+       XKBlib-15.svg           \
+       XKBlib-16.svg           \
+       XKBlib-17.svg           \
+       XKBlib-18.svg           \
+       XKBlib-19.svg           \
+       XKBlib-20.svg           \
+       XKBlib-21.svg
+
+# The location where the DocBook/XML files and their generated formats are installed
+shelfdir = $(docdir)/XKB
+
+# Generate DocBook/XML output formats with or without stylesheets
+include $(top_srcdir)/docbook.am
+
+endif ENABLE_SPECS
diff --git a/specs/XKB/XKBlib-1.svg b/specs/XKB/XKBlib-1.svg
new file mode 100644 (file)
index 0000000..4b89e8b
--- /dev/null
@@ -0,0 +1,767 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="620"
+   height="420"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   style="enable-background:new"
+   sodipodi:docname="XKBlib-1.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend"
+       style="overflow:visible">
+      <path
+         id="path4572"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lstart"
+       style="overflow:visible">
+      <path
+         id="path4569"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(1.1,0,0,1.1,1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mstart"
+       style="overflow:visible">
+      <path
+         id="path4575"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(0.6,0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lstart-8"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4569-4"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(1.1,0,0,1.1,1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-6"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4572-9"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lstart-9"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4569-0"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(1.1,0,0,1.1,1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-3"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4572-0"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lstart-3"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4569-7"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(1.1,0,0,1.1,1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-9"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4572-4"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lstart-91"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4569-9"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(1.1,0,0,1.1,1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-4"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4572-2"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lstart-6"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4569-5"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(1.1,0,0,1.1,1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-95"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4572-6"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lstart-1"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4569-43"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(1.1,0,0,1.1,1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-7"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4572-27"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lstart-39"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4569-2"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(1.1,0,0,1.1,1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-44"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4572-49"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lstart-38"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4569-3"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(1.1,0,0,1.1,1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-2"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4572-95"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.91250447"
+     inkscape:cx="310"
+     inkscape:cy="210"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer2"
+     showgrid="false"
+     inkscape:window-width="1016"
+     inkscape:window-height="718"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Vetorial"
+     transform="translate(0,-632.36218)">
+    <g
+       id="g3260">
+      <rect
+         y="680.99249"
+         x="19.174116"
+         height="60.714287"
+         width="82.85714"
+         id="rect3507"
+         style="fill:#ffffff;stroke:#000000;stroke-opacity:1" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3057"
+         y="699.66016"
+         x="61.07143"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="699.66016"
+           x="61.07143"
+           id="tspan3061"
+           sodipodi:role="line">Xkb-aware</tspan><tspan
+           y="714.66016"
+           x="61.07143"
+           id="tspan3063"
+           sodipodi:role="line">User</tspan><tspan
+           y="729.66016"
+           x="61.07143"
+           id="tspan3065"
+           sodipodi:role="line">Application</tspan></text>
+    </g>
+    <g
+       id="g3267">
+      <rect
+         y="680.99249"
+         x="111.55135"
+         height="60.714287"
+         width="82.85714"
+         id="rect3507-0"
+         style="fill:#ffffff;stroke:#000000;stroke-opacity:1" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3057-5"
+         y="699.66016"
+         x="153.12054"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="699.66016"
+           x="153.12054"
+           id="tspan3094"
+           sodipodi:role="line">Xkb-capable</tspan><tspan
+           y="714.66016"
+           x="153.12054"
+           id="tspan3096"
+           sodipodi:role="line">User</tspan><tspan
+           y="729.66016"
+           x="153.12054"
+           id="tspan3098"
+           sodipodi:role="line">Application</tspan></text>
+    </g>
+    <g
+       id="g3274">
+      <rect
+         y="680.99249"
+         x="203.92857"
+         height="60.714287"
+         width="82.85714"
+         id="rect3507-0-1"
+         style="fill:#ffffff;stroke:#000000;stroke-opacity:1" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3057-5-8"
+         y="699.66016"
+         x="245.49776"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="699.66016"
+           x="245.49776"
+           id="tspan3127"
+           sodipodi:role="line">Xkb-unaware</tspan><tspan
+           y="714.66016"
+           x="245.49776"
+           id="tspan3129"
+           sodipodi:role="line">User</tspan><tspan
+           y="729.66016"
+           x="245.49776"
+           id="tspan3131"
+           sodipodi:role="line">Application</tspan></text>
+    </g>
+    <g
+       id="g3281">
+      <rect
+         y="697.30304"
+         x="411.78571"
+         height="37.857143"
+         width="123.57143"
+         id="rect4334"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3057-5-8-4"
+         y="719.54211"
+         x="473.52747"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="719.54211"
+           x="473.52747"
+           id="tspan3160"
+           sodipodi:role="line">Keyboard</tspan></text>
+    </g>
+    <g
+       id="g3321">
+      <rect
+         y="787.92566"
+         x="206.3934"
+         height="45.714287"
+         width="76.428574"
+         id="rect4341"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3057-5-8-4-8"
+         y="815.25641"
+         x="244.59891"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="815.25641"
+           x="244.59891"
+           id="tspan3183"
+           sodipodi:role="line">Core Xlib</tspan></text>
+    </g>
+    <g
+       id="g3315">
+      <rect
+         y="981.43201"
+         x="386.42856"
+         height="62.142857"
+         width="174.28572"
+         id="rect4348"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3057-5-8-4-8-0-38"
+         y="1008.314"
+         x="473.27844"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="1008.314"
+           x="473.27844"
+           id="tspan3413"
+           sodipodi:role="line">Server Database of</tspan><tspan
+           y="1023.314"
+           x="473.27844"
+           id="tspan3415"
+           sodipodi:role="line">Keyboard Components</tspan></text>
+    </g>
+    <g
+       id="g3286">
+      <rect
+         y="788.23157"
+         x="336.78571"
+         height="144.28572"
+         width="274.28571"
+         id="rect4356"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3057-5-8-4-8-0"
+         y="814.84808"
+         x="473.75571"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="814.84808"
+           x="473.75571"
+           id="tspan3206"
+           sodipodi:role="line">X Server</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3057-5-8-4-8-0-9"
+         y="851.45685"
+         x="474.26547"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="851.45685"
+           x="474.26547"
+           id="tspan3229"
+           sodipodi:role="line">Xkb Server Extension</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3057-5-8-4-8-0-0"
+         y="883.685"
+         x="371.61285"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="883.685"
+           x="371.61285"
+           id="tspan3252"
+           sodipodi:role="line">Client Map</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3057-5-8-4-8-0-0-4"
+         y="883.57953"
+         x="448.63406"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="883.57953"
+           x="448.63406"
+           id="tspan3275"
+           sodipodi:role="line">Server Map</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3057-5-8-4-8-0-0-4-0"
+         y="883.685"
+         x="550.14691"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="883.685"
+           x="550.14691"
+           id="tspan3298"
+           sodipodi:role="line">Compatibility Map</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3057-5-8-4-8-0-2"
+         y="918.8595"
+         x="366.32715"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="918.8595"
+           x="366.32715"
+           id="tspan3321"
+           sodipodi:role="line">Controls</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3057-5-8-4-8-0-0-0"
+         y="917.69641"
+         x="443.49121"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="917.69641"
+           x="443.49121"
+           id="tspan3344"
+           sodipodi:role="line">Indicator Map</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3057-5-8-4-8-0-3"
+         y="918.67493"
+         x="517.61279"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="918.67493"
+           x="517.61279"
+           id="tspan3367"
+           sodipodi:role="line">Names</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3057-5-8-4-8-0-3-0"
+         y="917.59094"
+         x="575.20703"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="917.59094"
+           x="575.20703"
+           id="tspan3390"
+           sodipodi:role="line">Geometry</tspan></text>
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4356-7"
+         d="m 611.07143,830.37443 -274.2857,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4356-7-9"
+         d="m 610.35713,863.51729 -274.2857,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4356-7-9-1"
+         d="m 610.35713,897.51729 -274.2857,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4413"
+         d="m 397.07142,930.54013 0,-32.30857"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4413-0"
+         d="m 490.64285,930.54013 0,-32.30857"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4413-3"
+         d="m 542.64286,930.54013 0,-32.30857"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4413-5"
+         d="m 407.5,896.52872 0,-32.30857"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4413-5-9"
+         d="m 488.64285,896.52872 0,-32.30857"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0" />
+    </g>
+    <g
+       id="g3326">
+      <rect
+         y="846.80304"
+         x="8.9285755"
+         height="89.285713"
+         width="194.28572"
+         id="rect4506"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3057-5-8-4-8-0-38-3"
+         y="900.4707"
+         x="141.49275"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="900.4707"
+           x="141.49275"
+           id="tspan3441"
+           sodipodi:role="line">Xkb Modifications</tspan><tspan
+           y="915.4707"
+           x="141.49275"
+           id="tspan3443"
+           sodipodi:role="line">to Core Xlib</tspan><tspan
+           y="930.4707"
+           x="141.49275"
+           id="tspan3445"
+           sodipodi:role="line">functions</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3057-5-8-4-8-0-38-3-0"
+         y="865.21344"
+         x="46.18861"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="865.21344"
+           x="46.18861"
+           id="tspan3474"
+           sodipodi:role="line">Xkb</tspan><tspan
+           y="880.21344"
+           x="46.18861"
+           id="tspan3476"
+           sodipodi:role="line">Additions</tspan><tspan
+           y="895.21344"
+           x="46.18861"
+           id="tspan3478"
+           sodipodi:role="line">to Xlib</tspan><tspan
+           y="910.21344"
+           x="46.18861"
+           id="tspan3480"
+           sodipodi:role="line">(Xkb*</tspan><tspan
+           y="925.21344"
+           x="46.18861"
+           id="tspan3482"
+           sodipodi:role="line">functions)</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3057-5-8-4-8-0-1"
+         y="871.1712"
+         x="141.36678"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="871.1712"
+           x="141.36678"
+           id="tspan3505"
+           sodipodi:role="line">Core Xlib</tspan></text>
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4508"
+         d="m 81.428565,935.71524 0,-89.26936"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4508-4"
+         d="m 202.66106,883.94586 -120.518205,0"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2.99999982, 2.99999982;stroke-dashoffset:0" />
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow2Lstart);marker-end:url(#Arrow2Lend)"
+       d="m 51.785715,743.94009 0.71429,100.03368"
+       id="path4546"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow2Lstart);marker-end:url(#Arrow2Lend)"
+       d="m 153.57142,743.92902 0.71429,100.03368"
+       id="path4546-2"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow2Lstart);marker-end:url(#Arrow2Lend)"
+       d="m 473.21428,738.01121 0.71429,48.38656"
+       id="path4546-3"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow2Lstart);marker-end:url(#Arrow2Lend)"
+       d="m 334.35827,805.73157 -49.73226,0.71429"
+       id="path4546-9"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow2Lstart);marker-end:url(#Arrow2Lend)"
+       d="m 246.42858,786.08138 -0.71429,-42.00166"
+       id="path4546-9-0"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow2Lstart);marker-end:url(#Arrow2Lend)"
+       d="M 334.71531,820.81601 206.49673,871.36143"
+       id="path4546-9-1"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow2Lstart);marker-end:url(#Arrow2Lend)"
+       d="M 108.32334,843.06647 75.971115,744.00572"
+       id="path4546-9-3"
+       inkscape:connector-curvature="0"
+       inkscape:transform-center-x="-16.307885"
+       inkscape:transform-center-y="52.415789" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-end:url(#Arrow2Lend-2)"
+       d="m 474.14314,982.08954 -0.71429,-47.66418"
+       id="path4546-9-0-4"
+       inkscape:connector-curvature="0" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="315.02905"
+       y="649.76666"
+       id="text3057-5-8-4-3"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan7448"
+         x="315.02905"
+         y="649.76666">Xkb Extension</tspan></text>
+  </g>
+</svg>
diff --git a/specs/XKB/XKBlib-10.svg b/specs/XKB/XKBlib-10.svg
new file mode 100644 (file)
index 0000000..13bb7a2
--- /dev/null
@@ -0,0 +1,1441 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="500"
+   height="600"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="XKBlib-10.svg"
+   inkscape:export-filename="/home/fcarrijo/Desktop/XKBlib-10.png"
+   inkscape:export-xdpi="156.71965"
+   inkscape:export-ydpi="156.71965"
+   style="display:inline">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend"
+       style="overflow:visible">
+      <path
+         id="path4466"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend"
+       style="overflow:visible">
+      <path
+         id="path4460"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-6"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4460-1"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-5"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4460-4"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-65"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4460-6"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-65-3"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4460-6-7"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-52"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4460-5"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-7"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4460-44"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-65-0"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4460-6-78"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-8"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4460-8"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-3"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4460-14"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-2"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4460-0"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-89"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4460-2"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-65-6"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4460-6-4"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-50"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4460-48"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.012534"
+     inkscape:cx="138.55871"
+     inkscape:cy="259.33367"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer2"
+     showgrid="false"
+     inkscape:window-width="1016"
+     inkscape:window-height="718"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Vetorial">
+    <g
+       id="g6721">
+      <rect
+         y="18.687113"
+         x="33.045399"
+         height="185.07834"
+         width="82.191376"
+         id="rect3260"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051"
+         y="50.78091"
+         x="73.581512"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="50.78091"
+           x="73.581512"
+           id="tspan3053"
+           sodipodi:role="line">label_color</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7"
+         y="67.231613"
+         x="73.60202"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="67.231613"
+           x="73.60202"
+           id="tspan3076"
+           sodipodi:role="line">base_color</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5"
+         y="107.93592"
+         x="73.892059"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="107.93592"
+           x="73.892059"
+           id="tspan3099"
+           sodipodi:role="line">properties</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1"
+         y="126.88952"
+         x="74.105927"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="126.88952"
+           x="74.105927"
+           id="tspan3122"
+           sodipodi:role="line">colors</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3"
+         y="143.7081"
+         x="74.111786"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="143.7081"
+           x="74.111786"
+           id="tspan3145"
+           sodipodi:role="line">shapes</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0"
+         y="162.89717"
+         x="74.111786"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="162.89717"
+           x="74.111786"
+           id="tspan3168"
+           sodipodi:role="line">sections</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5"
+         y="181.28131"
+         x="74.105927"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="181.28131"
+           x="74.105927"
+           id="tspan3191"
+           sodipodi:role="line">doodads</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2"
+         y="197.71959"
+         x="73.892059"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="197.71959"
+           x="73.892059"
+           id="tspan3214"
+           sodipodi:role="line">key_aliases</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-9"
+         y="86.801003"
+         x="74.149872"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="86.801003"
+           x="74.149872"
+           id="tspan3237"
+           sodipodi:role="line">. . .</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-9-9"
+         y="31.955656"
+         x="74.149872"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="31.955656"
+           x="74.149872"
+           id="tspan3237-4"
+           sodipodi:role="line">. . .</tspan></text>
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3260-9"
+         d="m 33.045395,37.473711 82.191385,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3260-9-8"
+         d="m 33.045396,55.488687 82.191384,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3260-9-8-1"
+         d="m 33.045398,73.645882 82.191382,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3260-9-8-6"
+         d="m 33.045397,95.644022 82.191383,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3260-9-8-3"
+         d="m 33.045399,113.45204 82.191371,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3260-9-8-9"
+         d="m 33.045393,131.60923 82.191387,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3260-9-8-33"
+         d="m 33.045398,149.59184 82.191382,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3260-9-8-4"
+         d="m 33.045397,167.39986 82.191383,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3260-9-8-61"
+         d="m 33.045392,185.55706 82.191388,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2"
+         y="220.6503"
+         x="75.038658"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="220.6503"
+           x="75.038658"
+           id="tspan4286"
+           sodipodi:role="line">XkbGeometryRec</tspan></text>
+    </g>
+    <g
+       id="g6788">
+      <rect
+         y="249.631"
+         x="45.392994"
+         height="16.760489"
+         width="80.310669"
+         id="rect4161"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="253.58833"
+         x="41.784836"
+         height="16.760489"
+         width="80.310669"
+         id="rect4161-6"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="257.54568"
+         x="38.17667"
+         height="16.760489"
+         width="80.310669"
+         id="rect4161-6-1"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="261.50302"
+         x="34.568512"
+         height="16.760489"
+         width="80.310669"
+         id="rect4161-6-1-7"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9"
+         y="293.44604"
+         x="76.285805"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="293.44604"
+           x="76.285805"
+           id="tspan4409"
+           sodipodi:role="line">XkbKeyAliasRec(s)</tspan><tspan
+           y="304.69604"
+           x="76.285805"
+           id="tspan4411"
+           sodipodi:role="line">(array)</tspan></text>
+    </g>
+    <g
+       id="g6759">
+      <rect
+         y="74.598343"
+         x="158.09758"
+         height="16.760489"
+         width="80.310669"
+         id="rect4161-86"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="78.555679"
+         x="154.48943"
+         height="16.760489"
+         width="80.310669"
+         id="rect4161-6-3"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="82.513031"
+         x="150.88126"
+         height="16.760489"
+         width="80.310669"
+         id="rect4161-6-1-77"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="86.470367"
+         x="147.2731"
+         height="16.760489"
+         width="80.310669"
+         id="rect4161-6-1-7-2"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-3"
+         y="114.84941"
+         x="189.09557"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="114.84941"
+           x="189.09557"
+           id="tspan4963"
+           sodipodi:role="line">XkbColorRec(s)</tspan><tspan
+           y="126.09941"
+           x="189.09557"
+           id="tspan4965"
+           sodipodi:role="line">(array)</tspan></text>
+    </g>
+    <g
+       id="g6772">
+      <rect
+         y="12.539931"
+         x="161.24017"
+         height="16.760489"
+         width="80.310669"
+         id="rect4161-8"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="16.497267"
+         x="157.63202"
+         height="16.760489"
+         width="80.310669"
+         id="rect4161-6-12"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="20.454618"
+         x="154.02385"
+         height="16.760489"
+         width="80.310669"
+         id="rect4161-6-1-4"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="24.411955"
+         x="150.4157"
+         height="16.760489"
+         width="80.310669"
+         id="rect4161-6-1-7-7"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-3-5"
+         y="52.092648"
+         x="192.93651"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="52.092648"
+           x="192.93651"
+           id="tspan4991"
+           sodipodi:role="line">XkbPropertyRec(s)</tspan><tspan
+           y="63.342648"
+           x="192.93651"
+           id="tspan4993"
+           sodipodi:role="line">(array)</tspan></text>
+    </g>
+    <g
+       id="g6843">
+      <rect
+         y="462.62888"
+         x="43.297932"
+         height="69.835365"
+         width="81.009026"
+         id="rect5320"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="468.21573"
+         x="38.060284"
+         height="69.835365"
+         width="81.009026"
+         id="rect5320-1"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="473.80255"
+         x="32.822628"
+         height="69.835365"
+         width="81.009026"
+         id="rect5320-2"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5320-2-0"
+         d="m 32.822614,490.56304 81.009036,0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5320-2-0-0"
+         d="m 32.822613,509.51363 81.009037,0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5320-2-0-0-3"
+         d="m 32.822612,527.67083 81.009038,0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-9"
+         y="501.388"
+         x="72.883667"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="501.388"
+           x="72.883667"
+           id="tspan5433"
+           sodipodi:role="line">(See Figure 13.6)</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-9-3"
+         y="557.29443"
+         x="72.630981"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           id="tspan5596"
+           sodipodi:role="line"
+           x="72.630981"
+           y="557.29443">overlays(s)</tspan><tspan
+           id="tspan5598"
+           sodipodi:role="line"
+           x="72.630981"
+           y="568.54443">(array)</tspan></text>
+    </g>
+    <g
+       id="g6011"
+       transform="translate(-0.28926354,0.20454307)">
+      <rect
+         y="333.22891"
+         x="45.043816"
+         height="87.992561"
+         width="80.310669"
+         id="rect4161-6-1-7-6"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="338.46655"
+         x="39.456993"
+         height="87.992561"
+         width="80.310669"
+         id="rect4161-6-1-7-6-8"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="344.40256"
+         x="33.870163"
+         height="87.992561"
+         width="80.310669"
+         id="rect4161-6-1-7-6-8-1"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-36"
+         y="354.52917"
+         x="74.032089"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="354.52917"
+           x="74.032089"
+           id="tspan5149"
+           sodipodi:role="line">. . .</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-36-3"
+         y="373.98206"
+         x="73.83873"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="373.98206"
+           x="73.83873"
+           id="tspan5172"
+           sodipodi:role="line">rows</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-36-3-8"
+         y="392.43518"
+         x="73.99913"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="392.43518"
+           x="73.99913"
+           id="tspan5195"
+           sodipodi:role="line">doodads</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-36-3-8-0"
+         y="409.98962"
+         x="73.83873"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="409.98962"
+           x="73.83873"
+           id="tspan5218"
+           sodipodi:role="line">bounds</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-36-3-8-0-9"
+         y="426.67175"
+         x="73.99913"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="426.67175"
+           x="73.99913"
+           id="tspan5241"
+           sodipodi:role="line">overlays</tspan></text>
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4161-6-1-7-6-8-0-2"
+         d="m 114.18084,362.74829 -80.31068,0"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4161-6-1-7-6-8-0-4"
+         d="m 114.18084,380.30274 -80.31068,0"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4161-6-1-7-6-8-0-9"
+         d="m 114.18084,397.85717 -80.31068,0"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4161-6-1-7-6-8-0-0"
+         d="m 114.18084,415.41162 -80.31068,0"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-9-3-7"
+         y="443.91846"
+         x="74.166107"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="443.91846"
+           x="74.166107"
+           id="tspan5498"
+           sodipodi:role="line">XkbSectionRec(s)</tspan><tspan
+           y="455.16846"
+           x="74.166107"
+           id="tspan5500"
+           sodipodi:role="line">(array)</tspan></text>
+    </g>
+    <g
+       id="g6902">
+      <rect
+         y="434.34552"
+         x="165.16064"
+         height="69.835365"
+         width="81.009026"
+         id="rect5320-0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="439.93237"
+         x="159.923"
+         height="69.835365"
+         width="81.009026"
+         id="rect5320-1-5"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="445.5192"
+         x="154.68535"
+         height="69.835365"
+         width="81.009026"
+         id="rect5320-2-03"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5320-2-0-1"
+         d="m 154.68533,462.27972 81.00904,0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5320-2-0-0-8"
+         d="m 154.68533,481.23031 81.00904,0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5320-2-0-0-3-0"
+         d="m 154.68533,499.38751 81.00904,0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-9-1"
+         y="473.10464"
+         x="194.74638"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           id="tspan5552"
+           sodipodi:role="line"
+           x="194.74638"
+           y="473.10464">(See Figure 13.5)</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-9-3-9"
+         y="528.97302"
+         x="194.98129"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="528.97302"
+           x="194.98129"
+           id="tspan5592"
+           sodipodi:role="line">doodads(s)</tspan><tspan
+           y="540.22302"
+           x="194.98129"
+           id="tspan5594"
+           sodipodi:role="line">(array)</tspan></text>
+    </g>
+    <g
+       id="g5975"
+       transform="translate(0.34918083,0.20454306)">
+      <rect
+         y="556.00372"
+         x="154.33617"
+         height="17.458841"
+         width="81.707375"
+         id="rect5600"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-9-3-9-5"
+         y="587.08093"
+         x="196.37801"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="587.08093"
+           x="196.37801"
+           id="tspan5644"
+           sodipodi:role="line">XkbBoundsRec</tspan></text>
+    </g>
+    <g
+       id="g6919">
+      <rect
+         y="466.46982"
+         x="277.59558"
+         height="17.458841"
+         width="81.707375"
+         id="rect5600-3"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-9-3-9-5-4"
+         y="497.20932"
+         x="319.63742"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="497.20932"
+           x="319.63742"
+           id="tspan5644-6"
+           sodipodi:role="line">XkbBoundsRec</tspan></text>
+    </g>
+    <g
+       id="g5939"
+       transform="translate(2.4442418,1.6012504)">
+      <rect
+         y="333.22891"
+         x="164.11311"
+         height="58.661709"
+         width="81.009026"
+         id="rect5670"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="338.11737"
+         x="159.22464"
+         height="58.661709"
+         width="81.009026"
+         id="rect5670-9"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="343.00586"
+         x="153.6378"
+         height="58.661709"
+         width="81.009026"
+         id="rect5670-2"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4161-6-1-7-6-8-0-90"
+         d="m 234.29765,362.55975 -80.31067,0"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4161-6-1-7-6-8-0-3"
+         d="m 234.29765,381.4153 -80.31067,0"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-9-3-9-0"
+         y="354.52921"
+         x="194.14891"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="354.52921"
+           x="194.14891"
+           id="tspan5746"
+           sodipodi:role="line">. . .</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-9-3-9-0-7"
+         y="373.59317"
+         x="193.95555"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="373.59317"
+           x="193.95555"
+           id="tspan5769"
+           sodipodi:role="line">keys</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-9-3-9-0-7-4"
+         y="395.77023"
+         x="193.95555"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="395.77023"
+           x="193.95555"
+           id="tspan5792"
+           sodipodi:role="line">bounds</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-9-3-9-0-7-4-9"
+         y="413.40305"
+         x="198.84402"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="413.40305"
+           x="198.84402"
+           id="tspan5839"
+           sodipodi:role="line">XkbRowRec(s)</tspan><tspan
+           y="424.65305"
+           x="198.84402"
+           id="tspan5841"
+           sodipodi:role="line">(array)</tspan></text>
+    </g>
+    <g
+       id="g5923"
+       transform="translate(-1.3967033,-0.49381059)">
+      <rect
+         y="347.89435"
+         x="289.46759"
+         height="58.661709"
+         width="81.009026"
+         id="rect5670-94"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="352.78281"
+         x="284.57913"
+         height="58.661709"
+         width="81.009026"
+         id="rect5670-9-2"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="357.6713"
+         x="278.99228"
+         height="58.661709"
+         width="81.009026"
+         id="rect5670-2-0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4161-6-1-7-6-8-0-90-6"
+         d="m 359.65213,377.22517 -80.31067,0"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4161-6-1-7-6-8-0-3-5"
+         d="m 359.65213,396.08072 -80.31067,0"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-9-3-9-0-9"
+         y="369.19464"
+         x="319.50339"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="369.19464"
+           x="319.50339"
+           id="tspan5746-5"
+           sodipodi:role="line">. . .</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-9-3-9-0-7-6"
+         y="388.25861"
+         x="319.31003"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="388.25861"
+           x="319.31003"
+           id="tspan5891"
+           sodipodi:role="line">shape_ndx</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-9-3-9-0-7-4-1"
+         y="410.43567"
+         x="319.31003"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="410.43567"
+           x="319.31003"
+           id="tspan5893"
+           sodipodi:role="line">color_ndx</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-9-3-9-0-7-4-9-3"
+         y="429.25302"
+         x="319.40253"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="429.25302"
+           x="319.40253"
+           id="tspan5919"
+           sodipodi:role="line">XkbKeyRec(s)</tspan><tspan
+           y="440.50302"
+           x="319.40253"
+           id="tspan5921"
+           sodipodi:role="line">(array)</tspan></text>
+    </g>
+    <g
+       id="g6944">
+      <rect
+         y="280.7402"
+         x="396.90216"
+         height="69.835365"
+         width="81.009026"
+         id="rect5320-0-3"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="286.32706"
+         x="391.66452"
+         height="69.835365"
+         width="81.009026"
+         id="rect5320-1-5-9"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="291.91388"
+         x="386.42685"
+         height="69.835365"
+         width="81.009026"
+         id="rect5320-2-03-2"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5320-2-0-1-4"
+         d="m 386.42684,308.67438 81.00904,0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5320-2-0-0-8-4"
+         d="m 386.42684,327.62497 81.00904,0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5320-2-0-0-3-0-4"
+         d="m 386.42684,345.78217 81.00904,0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-9-1-9"
+         y="319.49933"
+         x="426.48788"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           id="tspan5552-9"
+           sodipodi:role="line"
+           x="426.48788"
+           y="319.49933">(See Figure 13.5)</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-9-3-9-3"
+         y="375.36771"
+         x="426.72281"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="375.36771"
+           x="426.72281"
+           id="tspan5592-8"
+           sodipodi:role="line">doodads(s)</tspan><tspan
+           y="386.61771"
+           x="426.72281"
+           id="tspan5594-3"
+           sodipodi:role="line">(array)</tspan></text>
+    </g>
+    <g
+       id="g6474"
+       transform="translate(-1.3967033,-0.49381059)">
+      <rect
+         y="221.14313"
+         x="392.12558"
+         height="17.458841"
+         width="81.707375"
+         id="rect5600-3-9"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="220.80542"
+         x="392.12558"
+         height="17.458841"
+         width="81.707375"
+         id="rect5600-8-5"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-9-3-9-5-4-4"
+         y="251.88263"
+         x="434.16742"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="251.88263"
+           x="434.16742"
+           id="tspan5644-6-3"
+           sodipodi:role="line">XkbBoundsRec</tspan></text>
+    </g>
+    <g
+       id="g6176"
+       transform="translate(-1.3967033,-0.49381059)">
+      <rect
+         y="154.16595"
+         x="401.0296"
+         height="16.760489"
+         width="80.310669"
+         id="rect4161-4"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="158.12329"
+         x="397.42145"
+         height="16.760489"
+         width="80.310669"
+         id="rect4161-6-9"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="162.08064"
+         x="393.81326"
+         height="16.760489"
+         width="80.310669"
+         id="rect4161-6-1-5"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="166.03798"
+         x="390.20511"
+         height="16.760489"
+         width="80.310669"
+         id="rect4161-6-1-7-5"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-7"
+         y="195.18759"
+         x="431.92242"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="195.18759"
+           x="431.92242"
+           id="tspan6172"
+           sodipodi:role="line">XkbOutlineRec(s)</tspan><tspan
+           y="206.43759"
+           x="431.92242"
+           id="tspan6174"
+           sodipodi:role="line">(array)</tspan></text>
+    </g>
+    <g
+       id="g6993">
+      <rect
+         y="119.73722"
+         x="280.03983"
+         height="89.389267"
+         width="81.009026"
+         id="rect6185-1"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="124.62569"
+         x="275.15134"
+         height="89.389267"
+         width="81.009026"
+         id="rect6185-1-5"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="129.51418"
+         x="269.56451"
+         height="89.389267"
+         width="81.009026"
+         id="rect6185"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-9-3-9-5-4-4-0"
+         y="159.23502"
+         x="310.04266"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="159.23502"
+           x="310.04266"
+           id="tspan6245"
+           sodipodi:role="line">outlines</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-9-3-9-5-4-4-2"
+         y="175.44571"
+         x="309.94598"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="175.44571"
+           x="309.94598"
+           id="tspan6247"
+           sodipodi:role="line">approx</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-9-3-9-5-4-4-9"
+         y="194.3261"
+         x="309.79437"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="194.3261"
+           x="309.79437"
+           id="tspan6249"
+           sodipodi:role="line">primary</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-9-3-9-5-4-4-5"
+         y="213.18007"
+         x="309.88226"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="213.18007"
+           x="309.88226"
+           id="tspan6251"
+           sodipodi:role="line">bounds</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-9-3-9-5-4-4-0-1"
+         y="138.45622"
+         x="310.07562"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="138.45622"
+           x="310.07562"
+           id="tspan6274"
+           sodipodi:role="line">. . .</tspan></text>
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect6185-9"
+         d="m 269.56451,146.88894 81.00903,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect6185-9-3"
+         d="m 269.56451,164.87065 81.00903,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect6185-9-6"
+         d="m 269.56451,182.85233 81.00903,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect6185-9-2"
+         d="m 269.56451,200.83401 81.00903,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-0-5-2-2-9-9-3-9-5-4-4-3"
+         y="234.13068"
+         x="310.21848"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="234.13068"
+           x="310.21848"
+           id="tspan6480"
+           sodipodi:role="line">XkbShapeRec(s)</tspan><tspan
+           y="245.38068"
+           x="310.21848"
+           id="tspan6482"
+           sodipodi:role="line">(array)</tspan></text>
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 113.38742,424.37848 16.27725,10e-6 0.22911,57.80429 -13.54036,0"
+       id="path6544"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="M 116.62506,102.7722 149.0985,42.364609"
+       id="path3375"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-end:url(#Arrow2Lend)"
+       d="m 115.92671,47.253085 13.61789,-0.349177 0,40.155335 16.1572,0"
+       id="path4341"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 116.42258,124.94888 28.98168,-23.39485"
+       id="path3375-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 116.17235,141.33425 151.89193,-0.34918"
+       id="path3375-7-9"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-65)"
+       d="m 116.27589,196.70077 23.0146,0.34917 0.34918,71.93043 -15.01461,0"
+       id="path4599"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-65)"
+       d="m 116.37068,158.55727 27.6033,-0.0585 0.44442,196.49648 -29.10951,0"
+       id="path4599-4"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 114.29059,370.58387 36.76113,-0.34918"
+       id="path3375-7-9-4"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 236.89802,370.51687 39.04305,-0.34918"
+       id="path3375-7-9-4-3"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-65-0)"
+       d="m 114.53,388.39884 26.53744,0 13.26872,55.16994"
+       id="path4887"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-65-0)"
+       d="m 113.83165,407.95275 21.64896,0 -0.69836,157.12957 18.85555,0.69835"
+       id="path5087"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-65-0)"
+       d="M 237.44024,391.89062 277.2464,464.5194"
+       id="path5287"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-65-0)"
+       d="m 115.92671,176.09933 73.32713,0 0,122.91025 196.33244,0"
+       id="path5487"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 351.61868,210.71052 37.18768,20.48161"
+       id="path3375-7-9-4-3-4"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 351.82439,157.04065 35.90045,9.42777"
+       id="path3375-7-9-4-3-4-9"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4, 2;stroke-dashoffset:0;marker-end:url(#Arrow2Lend)"
+       d="m 351.82439,193.76132 35.90046,-10.82448"
+       id="path3375-7-9-4-3-4-6"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4, 2;stroke-dashoffset:0;marker-end:url(#Arrow2Lend)"
+       d="m 351.794,174.16074 35.90046,-0.34918"
+       id="path3375-7-9-4-3-4-6-6"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-end:url(#Arrow2Lend-89)"
+       d="m 276.64311,404.46098 -23.93415,0 0.69835,-306.577255 -18.95061,0"
+       id="path5783"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-end:url(#Arrow2Lend-65)"
+       d="m 277.00697,388.06251 -19.96656,0.24124 -0.2857,-238.03065 12.28468,0"
+       id="path4599-9"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-end:url(#Arrow2Lend)"
+       d="m 116.29058,66.952039 7.61789,-0.349177 0,30.155338 21.20473,0"
+       id="path4341-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+  </g>
+</svg>
diff --git a/specs/XKB/XKBlib-11.svg b/specs/XKB/XKBlib-11.svg
new file mode 100644 (file)
index 0000000..31dfaea
--- /dev/null
@@ -0,0 +1,920 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="480"
+   height="650"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="XKBlib-11.svg"
+   inkscape:export-filename="/home/fcarrijo/Desktop/XKBlib-11.png"
+   inkscape:export-xdpi="156.71965"
+   inkscape:export-ydpi="156.71965">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend"
+       style="overflow:visible">
+      <path
+         id="path4729"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-4"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4729-6"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-4-3"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4729-6-2"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-4-5"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4729-6-4"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-4-9"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4729-6-49"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-4-57"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4729-6-3"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-4-7"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4729-6-27"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-4-90"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4729-6-5"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-4-4"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4729-6-1"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.83384615"
+     inkscape:cx="188.36275"
+     inkscape:cy="337.04736"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer2"
+     showgrid="false"
+     inkscape:window-width="1016"
+     inkscape:window-height="718"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Vetorial">
+    <text
+       xml:space="preserve"
+       style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="293.21954"
+       y="49.769375"
+       id="text3051"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3055"
+         x="293.21954"
+         y="49.769375">XkbGeometryRec,</tspan><tspan
+         sodipodi:role="line"
+         id="tspan3057"
+         x="293.21954"
+         y="61.019375">XkbColorRec, and</tspan><tspan
+         sodipodi:role="line"
+         id="tspan3059"
+         x="293.21954"
+         y="72.269379">XkbShapeRec</tspan><tspan
+         sodipodi:role="line"
+         id="tspan3061"
+         x="293.21954"
+         y="83.519379">repeated from</tspan><tspan
+         sodipodi:role="line"
+         id="tspan3063"
+         x="293.21954"
+         y="94.769379">Figure 16.4</tspan></text>
+    <g
+       id="g6009">
+      <rect
+         y="14.419287"
+         x="98.197311"
+         height="183.16936"
+         width="81.4086"
+         id="rect3065"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3065-4"
+         d="m 98.368732,34.325261 81.408598,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3065-4-6"
+         d="m 98.368734,52.535068 81.408596,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3065-4-1"
+         d="m 98.368732,70.744831 81.408598,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3065-4-5"
+         d="m 98.368734,88.95465 81.408596,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3065-4-61"
+         d="m 98.368734,107.16448 81.408596,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3065-4-7"
+         d="m 98.368734,125.37425 81.408596,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3065-4-2"
+         d="m 98.368734,143.58406 81.408596,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3065-4-29"
+         d="m 98.368732,161.79387 81.408598,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3065-4-28"
+         d="m 98.368724,180.00367 81.408616,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-1"
+         y="25.778435"
+         x="131.74512"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="25.778435"
+           x="131.74512"
+           id="tspan3954"
+           sodipodi:role="line">. . .</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-1-3"
+         y="45.787781"
+         x="114.26807"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="45.787781"
+           x="114.26807"
+           id="tspan3954-7"
+           sodipodi:role="line">label_color</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-1-3-7"
+         y="63.997597"
+         x="114.43286"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="63.997597"
+           x="114.43286"
+           id="tspan3954-7-2"
+           sodipodi:role="line">base_color</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-1-3-3"
+         y="100.5425"
+         x="115.74023"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="100.5425"
+           x="115.74023"
+           id="tspan3954-7-7"
+           sodipodi:role="line">properties</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-1-3-2"
+         y="119.62462"
+         x="125.44556"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="119.62462"
+           x="125.44556"
+           id="tspan3954-7-5"
+           sodipodi:role="line">colors</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-1-3-37"
+         y="136.9621"
+         x="122.94507"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="136.9621"
+           x="122.94507"
+           id="tspan3954-7-6"
+           sodipodi:role="line">shapes</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-1-3-8"
+         y="156.04422"
+         x="120.31713"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="156.04422"
+           x="120.31713"
+           id="tspan3954-7-1"
+           sodipodi:role="line">sections</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-1-3-36"
+         y="174.25398"
+         x="119.6975"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="174.25398"
+           x="119.6975"
+           id="tspan3954-7-4"
+           sodipodi:role="line">doodads</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-1-3-0"
+         y="191.46625"
+         x="113.10352"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="191.46625"
+           x="113.10352"
+           id="tspan3954-7-3"
+           sodipodi:role="line">key_aliases</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-1-3-0-5"
+         y="213.93842"
+         x="99.878174"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="213.93842"
+           x="99.878174"
+           id="tspan3954-7-3-8"
+           sodipodi:role="line">XkbGeometryRec</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-1-5"
+         y="80.407837"
+         x="131.74512"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="80.407837"
+           x="131.74512"
+           id="tspan3954-0"
+           sodipodi:role="line">. . .</tspan></text>
+    </g>
+    <g
+       id="g6043">
+      <rect
+         y="243.80499"
+         x="98.792732"
+         height="54.272404"
+         width="81.4086"
+         id="rect4194"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4194-9"
+         d="m 98.792734,262.53876 81.408596,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4194-9-9"
+         d="m 98.792736,280.29513 81.408594,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-8"
+         y="273.7746"
+         x="117.68697"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="273.7746"
+           x="117.68697"
+           id="tspan3063-0"
+           sodipodi:role="line">color_ndx</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-8-1"
+         y="291.53098"
+         x="115.18649"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="291.53098"
+           x="115.18649"
+           id="tspan3063-0-2"
+           sodipodi:role="line">shape_ndx</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-8-1-0"
+         y="254.2187"
+         x="132.34055"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="254.2187"
+           x="132.34055"
+           id="tspan3063-0-2-0"
+           sodipodi:role="line">. . .</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-8-1-6"
+         y="313.15515"
+         x="85.628868"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="313.15515"
+           x="85.628868"
+           id="tspan3063-0-2-3"
+           sodipodi:role="line">XkbShapeDoodadRec(s)</tspan></text>
+    </g>
+    <g
+       id="g6056">
+      <rect
+         y="342.17371"
+         x="99.216736"
+         height="36.888275"
+         width="81.4086"
+         id="rect4367"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4194-9-90"
+         d="m 99.216739,361.25386 81.408591,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-8-1-0-8"
+         y="353.33191"
+         x="132.76454"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="353.33191"
+           x="132.76454"
+           id="tspan3063-0-2-0-3"
+           sodipodi:role="line">. . .</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-8-8"
+         y="372.51556"
+         x="118.11098"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="372.51556"
+           x="118.11098"
+           id="tspan3063-0-7"
+           sodipodi:role="line">color_ndx</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-8-1-6-3"
+         y="394.26498"
+         x="91.045059"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="394.26498"
+           x="91.045059"
+           id="tspan3063-0-2-3-1"
+           sodipodi:role="line">XkbTextDoodadRec(s)</tspan></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="21.180391"
+       y="424.79321"
+       id="text3051-8-1-6-0"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan4481"
+         x="21.180391"
+         y="424.79321">doodads array</tspan><tspan
+         sodipodi:role="line"
+         id="tspan4483"
+         x="21.180391"
+         y="436.04321">may contain</tspan><tspan
+         sodipodi:role="line"
+         id="tspan4485"
+         x="21.180391"
+         y="447.29321">any of these</tspan><tspan
+         sodipodi:role="line"
+         id="tspan4487"
+         x="21.180391"
+         y="458.54321">doodad types</tspan></text>
+    <g
+       id="g6066">
+      <rect
+         y="425.49033"
+         x="98.792725"
+         height="73.352547"
+         width="81.4086"
+         id="rect4367-9"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4194-9-90-1"
+         d="m 98.792733,444.14645 81.408587,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4194-9-90-1-0"
+         d="m 98.792735,462.3786 81.408575,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4194-9-90-1-3"
+         d="m 98.792733,480.61073 81.408587,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-8-1-5"
+         y="455.62021"
+         x="115.18648"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="455.62021"
+           x="115.18648"
+           id="tspan3063-0-2-03"
+           sodipodi:role="line">shape_ndx</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-8-18"
+         y="473.85233"
+         x="109.82954"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="473.85233"
+           x="109.82954"
+           id="tspan3063-0-0"
+           sodipodi:role="line">on_color_ndx</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-8-18-1"
+         y="492.08447"
+         x="109.58345"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="492.08447"
+           x="109.58345"
+           id="tspan3063-0-0-7"
+           sodipodi:role="line">off_color_ndx</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-8-1-0-8-5"
+         y="435.5885"
+         x="132.34053"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="435.5885"
+           x="132.34053"
+           id="tspan3063-0-2-0-3-9"
+           sodipodi:role="line">. . .</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-8-1-6-3-4"
+         y="511.20865"
+         x="79.828079"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="511.20865"
+           x="79.828079"
+           id="tspan3063-0-2-3-1-8"
+           sodipodi:role="line">XkbIndicatorDoodadRec(s)</tspan></text>
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 44.096327,469.37466 -0.02345,162.03678 38.976015,0"
+       id="path4699"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 46.171587,410.44742 0,-170.29521 39.575646,0"
+       id="path4701"
+       inkscape:connector-curvature="0" />
+    <g
+       id="g6082">
+      <g
+         id="g5369">
+        <rect
+           style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;fill-opacity:1"
+           id="rect4194-90"
+           width="81.4086"
+           height="54.272404"
+           x="99.609352"
+           y="549.87872" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0"
+           d="m 99.609355,568.61251 81.408595,0"
+           id="rect4194-9-3"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0"
+           d="m 99.609357,586.36888 81.408593,0"
+           id="rect4194-9-9-0"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <text
+           xml:space="preserve"
+           style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+           x="118.50359"
+           y="579.84833"
+           id="text3051-8-3"
+           sodipodi:linespacing="125%"><tspan
+             sodipodi:role="line"
+             id="tspan3063-0-3"
+             x="118.50359"
+             y="579.84833">color_ndx</tspan></text>
+        <text
+           xml:space="preserve"
+           style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+           x="116.00311"
+           y="597.60474"
+           id="text3051-8-1-7"
+           sodipodi:linespacing="125%"><tspan
+             sodipodi:role="line"
+             id="tspan3063-0-2-9"
+             x="116.00311"
+             y="597.60474">shape_ndx</tspan></text>
+        <text
+           xml:space="preserve"
+           style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+           x="133.15717"
+           y="560.29248"
+           id="text3051-8-1-0-4"
+           sodipodi:linespacing="125%"><tspan
+             sodipodi:role="line"
+             id="tspan3063-0-2-0-9"
+             x="133.15717"
+             y="560.29248">. . .</tspan></text>
+        <text
+           xml:space="preserve"
+           style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+           x="89.758965"
+           y="619.22888"
+           id="text3051-8-1-6-9"
+           sodipodi:linespacing="125%"><tspan
+             sodipodi:role="line"
+             id="tspan3063-0-2-3-19"
+             x="89.758965"
+             y="619.22888">XkbLogoDoodadRec(s)</tspan></text>
+      </g>
+    </g>
+    <g
+       id="g5507">
+      <rect
+         y="418.24261"
+         x="343.58856"
+         height="89.345016"
+         width="80.350555"
+         id="rect5248-3-9"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="423.03967"
+         x="338.19189"
+         height="89.345016"
+         width="80.350555"
+         id="rect5248-3"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="427.5369"
+         x="333.39484"
+         height="89.345016"
+         width="80.350555"
+         id="rect5248"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5248-4"
+         d="m 333.39482,445.09097 80.35056,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5248-4-2"
+         d="m 333.39482,462.61227 80.35056,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5248-4-0"
+         d="m 333.39482,480.13358 80.35056,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5248-4-6"
+         d="m 333.39482,497.65487 80.35056,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-8-1-6-9-5"
+         y="457.20685"
+         x="355.70193"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="457.20685"
+           x="355.70193"
+           id="tspan3063-0-2-3-19-9"
+           sodipodi:role="line">outlines</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-8-1-6-9-56"
+         y="472.95715"
+         x="357.94315"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="472.95715"
+           x="357.94315"
+           id="tspan3063-0-2-3-19-1"
+           sodipodi:role="line">approx</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-8-1-6-9-1"
+         y="491.37714"
+         x="355.67337"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="491.37714"
+           x="355.67337"
+           id="tspan3063-0-2-3-19-4"
+           sodipodi:role="line">primary</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-8-1-6-9-3"
+         y="509.77075"
+         x="356.85989"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="509.77075"
+           x="356.85989"
+           id="tspan3063-0-2-3-19-7"
+           sodipodi:role="line">bounds</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-8-1-6-9-2"
+         y="532.5567"
+         x="373.82498"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="532.5567"
+           x="373.82498"
+           id="tspan3063-0-2-3-19-73"
+           sodipodi:role="line">XkbShapeRec(s)</tspan><tspan
+           id="tspan5382"
+           y="543.8067"
+           x="373.82498"
+           sodipodi:role="line">(array)</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-8-1-6-9-5-2"
+         y="436.88843"
+         x="366.4136"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="436.88843"
+           x="366.4136"
+           id="tspan3063-0-2-3-19-9-4"
+           sodipodi:role="line">. . .</tspan></text>
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 179.29278,136.54219 270.44257,0 0,296.22976 -33.92025,-0.14844"
+       id="path4703-9"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <g
+       id="g5563">
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-8-1-6-9-2-4"
+         y="332.24759"
+         x="374.22568"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="332.24759"
+           x="374.22568"
+           id="tspan3063-0-2-3-19-73-4"
+           sodipodi:role="line">XkbColorRec(s)</tspan><tspan
+           id="tspan5382-9"
+           y="343.49759"
+           x="374.22568"
+           sodipodi:role="line">(array)</tspan></text>
+      <rect
+         y="289.59732"
+         x="344.71457"
+         height="19.928148"
+         width="80.984604"
+         id="rect5529"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="293.48401"
+         x="341.11053"
+         height="19.928148"
+         width="80.984604"
+         id="rect5529-9"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="297.37073"
+         x="337.50653"
+         height="19.928148"
+         width="80.984604"
+         id="rect5529-3"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="301.25742"
+         x="333.9025"
+         height="19.928148"
+         width="80.984604"
+         id="rect5529-8"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 179.77733,116.60405 188.2574,0 0,178.08132"
+       id="path4703"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4, 2;stroke-dashoffset:0;marker-end:url(#Arrow2Lend-4)"
+       d="M 181.37488,593.18358 329.02644,444.78248"
+       id="path5572"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4, 2;stroke-dashoffset:0;marker-end:url(#Arrow2Lend-4)"
+       d="M 180.83605,576.02521 335.13058,332.50192"
+       id="path5572-9"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4, 2;stroke-dashoffset:0;marker-end:url(#Arrow2Lend-4)"
+       d="M 180.83604,453.06429 330.08515,437.80018"
+       id="path5572-3"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4, 2;stroke-dashoffset:0;marker-end:url(#Arrow2Lend-4)"
+       d="M 180.63968,287.83051 330.31279,430.93157"
+       id="path5572-3-5"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4, 2;stroke-dashoffset:0;marker-end:url(#Arrow2Lend-4)"
+       d="M 180.83605,490.37657 331.2418,325.36659"
+       id="path5572-90"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4, 2;stroke-dashoffset:0;marker-end:url(#Arrow2Lend-4)"
+       d="M 180.86945,471.32681 328.02867,316.24454"
+       id="path5572-90-2"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4, 2;stroke-dashoffset:0;marker-end:url(#Arrow2Lend-4)"
+       d="M 181.06854,370.40281 328.43976,307.47472"
+       id="path5572-90-2-0"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4, 2;stroke-dashoffset:0;marker-end:url(#Arrow2Lend-4)"
+       d="m 180.69326,271.38659 149.95161,29.32896"
+       id="path5572-90-2-0-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+  </g>
+</svg>
diff --git a/specs/XKB/XKBlib-12.svg b/specs/XKB/XKBlib-12.svg
new file mode 100644 (file)
index 0000000..5bffae5
--- /dev/null
@@ -0,0 +1,687 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="640"
+   height="540"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="New document 1">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend"
+       style="overflow:visible">
+      <path
+         id="path4984"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-8"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4984-0"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-7"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4984-9"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-0"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4984-3"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-0-9"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4984-3-4"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-0-4"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4984-3-6"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.0037037"
+     inkscape:cx="198.77003"
+     inkscape:cy="262.24458"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer2"
+     showgrid="false"
+     inkscape:window-width="1016"
+     inkscape:window-height="718"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Vetorial">
+    <g
+       id="g5803"
+       transform="translate(-1.9926199,-0.99630996)">
+      <rect
+         y="36.038216"
+         x="49.153389"
+         height="124.53874"
+         width="112.58302"
+         id="rect3162-9-9"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="42.780323"
+         x="41.737083"
+         height="124.53874"
+         width="112.58302"
+         id="rect3162-9"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-0"
+         y="190.21021"
+         x="91.096054"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="190.21021"
+           x="91.096054"
+           id="tspan3053-0-1-0-4"
+           sodipodi:role="line">XkbSelectionRec(s)</tspan><tspan
+           id="tspan3160"
+           y="205.21021"
+           x="91.096054"
+           sodipodi:role="line">(array)</tspan></text>
+      <rect
+         y="49.408875"
+         x="34.464703"
+         height="124.53874"
+         width="112.58302"
+         id="rect3162"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051"
+         y="88.833115"
+         x="76.456406"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="88.833115"
+           x="76.456406"
+           id="tspan3053"
+           sodipodi:role="line">rows</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7"
+         y="114.5687"
+         x="65.150742"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="114.5687"
+           x="65.150742"
+           id="tspan3053-0"
+           sodipodi:role="line">doodads</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5"
+         y="139.10606"
+         x="68.475937"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="139.10606"
+           x="68.475937"
+           id="tspan3053-0-1"
+           sodipodi:role="line">bounds</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1"
+         y="162.4803"
+         x="65.314804"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="162.4803"
+           x="65.314804"
+           id="tspan3053-0-1-0"
+           sodipodi:role="line">overlays</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3"
+         y="63.764496"
+         x="79.784004"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="63.764496"
+           x="79.784004"
+           id="tspan3053-0-1-0-0"
+           sodipodi:role="line">. . .</tspan></text>
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3162-5"
+         d="m 147.04772,73.289015 -112.58302,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3162-5-4"
+         d="m 147.04772,97.82637 -112.58302,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3162-5-2"
+         d="m 147.04773,122.36373 -112.583033,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3162-5-49"
+         d="m 147.04773,146.9011 -112.583033,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+    </g>
+    <g
+       id="g4121"
+       transform="translate(-0.40614801,0.58968744)">
+      <rect
+         y="215.03053"
+         x="267.66156"
+         height="25.619999"
+         width="111.91895"
+         id="rect4073"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-0-4"
+         y="258.34854"
+         x="323.82025"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="258.34854"
+           x="323.82025"
+           id="tspan4119"
+           sodipodi:role="line">XkbBoundsRec</tspan></text>
+    </g>
+    <g
+       id="g4427"
+       transform="translate(-0.40614801,0.58968744)">
+      <rect
+         y="262.71423"
+         x="48.139145"
+         height="101.40266"
+         width="112.58302"
+         id="rect3162-9-9-3"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="268.15759"
+         x="40.794804"
+         height="101.40266"
+         width="112.58302"
+         id="rect3162-9-4"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="273.60098"
+         x="33.450462"
+         height="101.40266"
+         width="112.58302"
+         id="rect3162-6"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-1"
+         y="288.58939"
+         x="80.199982"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="288.58939"
+           x="80.199982"
+           id="tspan3053-0-1-0-0-5"
+           sodipodi:role="line">. . .</tspan></text>
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3162-5-6"
+         d="m 146.03348,300.34318 -112.583008,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3162-5-1"
+         d="m 146.03348,325.33904 -112.583018,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3162-5-7"
+         d="m 146.03348,350.33489 -112.583018,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-2"
+         y="341.11234"
+         x="75.442169"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="341.11234"
+           x="75.442169"
+           id="tspan3053-2"
+           sodipodi:role="line">rows</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-9"
+         y="367.30643"
+         x="67.4617"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="367.30643"
+           x="67.4617"
+           id="tspan3053-28"
+           sodipodi:role="line">bounds</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-2-1"
+         y="315.98465"
+         x="47.2117"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="315.98465"
+           x="47.2117"
+           id="tspan3053-2-2"
+           sodipodi:role="line">section_under</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-0-3"
+         y="394.22635"
+         x="90.009842"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="394.22635"
+           x="90.009842"
+           id="tspan3053-0-1-0-4-7"
+           sodipodi:role="line">XkbOverlayRec(s)</tspan><tspan
+           id="tspan3160-7"
+           y="409.22635"
+           x="90.009842"
+           sodipodi:role="line">(array)</tspan></text>
+    </g>
+    <g
+       transform="translate(-0.79825864,249.71697)"
+       id="g4121-2">
+      <rect
+         y="215.03053"
+         x="267.66156"
+         height="25.619999"
+         width="111.91895"
+         id="rect4073-3"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-0-4-7"
+         y="258.34854"
+         x="323.82025"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="258.34854"
+           x="323.82025"
+           id="tspan4119-2"
+           sodipodi:role="line">XkbBoundsRec</tspan></text>
+    </g>
+    <g
+       id="g4510"
+       transform="translate(-0.40614801,0.58968744)">
+      <rect
+         y="360.0163"
+         x="490.64758"
+         height="25.619999"
+         width="111.91895"
+         id="rect4073-3-3"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-0-4-7-7"
+         y="418.0802"
+         x="530.71991"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="418.0802"
+           x="530.71991"
+           id="tspan4119-2-6"
+           sodipodi:role="line">XkbOverlayKeyRec(s)</tspan><tspan
+           id="tspan4476"
+           y="433.0802"
+           x="530.71991"
+           sodipodi:role="line">(array)</tspan></text>
+      <rect
+         y="365.4707"
+         x="484.94928"
+         height="25.619999"
+         width="111.91895"
+         id="rect4073-3-3-8"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="370.92514"
+         x="479.25107"
+         height="25.619999"
+         width="111.91895"
+         id="rect4073-3-3-1"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="376.37955"
+         x="473.5528"
+         height="25.619999"
+         width="111.91895"
+         id="rect4073-3-3-3"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    </g>
+    <g
+       id="g4665"
+       transform="translate(-0.40614801,0.58968744)">
+      <rect
+         y="314.26517"
+         x="278.14392"
+         height="71.910835"
+         width="112.58302"
+         id="rect3162-9-9-3-4"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="319.70853"
+         x="270.79956"
+         height="74.591911"
+         width="112.58302"
+         id="rect3162-9-4-0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="325.15192"
+         x="263.45526"
+         height="75.932442"
+         width="112.58302"
+         id="rect3162-6-3"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-1-5"
+         y="340.14032"
+         x="310.20477"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="340.14032"
+           x="310.20477"
+           id="tspan3053-0-1-0-0-5-8"
+           sodipodi:role="line">. . .</tspan></text>
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3162-5-6-5"
+         d="m 376.03828,351.89412 -112.58301,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3162-5-1-0"
+         d="m 376.03828,376.88998 -112.58302,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-2-9"
+         y="392.66327"
+         x="305.44696"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="392.66327"
+           x="305.44696"
+           id="tspan3053-2-8"
+           sodipodi:role="line">keys</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-2-1-4"
+         y="367.53558"
+         x="287.69598"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="367.53558"
+           x="287.69598"
+           id="tspan3053-2-2-9"
+           sodipodi:role="line">row_under</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-0-3-0"
+         y="423.00977"
+         x="321.35516"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="423.00977"
+           x="321.35516"
+           id="tspan3053-0-1-0-4-7-1"
+           sodipodi:role="line">XkbOverlayRowRec(s)</tspan><tspan
+           id="tspan3160-7-2"
+           y="438.00977"
+           x="321.35516"
+           sodipodi:role="line">(array)</tspan></text>
+    </g>
+    <g
+       id="g4843"
+       transform="translate(3.5790918,-1.4029325)">
+      <rect
+         y="61.563065"
+         x="277.7085"
+         height="71.910835"
+         width="112.58302"
+         id="rect3162-9-9-3-4-0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="67.006432"
+         x="270.36414"
+         height="74.591911"
+         width="112.58302"
+         id="rect3162-9-4-0-6"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="72.449821"
+         x="263.01984"
+         height="75.932442"
+         width="112.58302"
+         id="rect3162-6-3-3"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-3-1-5-9"
+         y="87.438217"
+         x="309.76935"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="87.438217"
+           x="309.76935"
+           id="tspan3053-0-1-0-0-5-8-0"
+           sodipodi:role="line">. . .</tspan></text>
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3162-5-6-5-8"
+         d="m 375.60286,99.192017 -112.58301,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3162-5-1-0-3"
+         d="m 375.60286,124.18788 -112.58302,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-2-9-8"
+         y="139.96117"
+         x="297.03107"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="139.96117"
+           x="297.03107"
+           id="tspan4757"
+           sodipodi:role="line">bounds</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-2-1-4-3"
+         y="114.83348"
+         x="305.42169"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="114.83348"
+           x="305.42169"
+           id="tspan4755"
+           sodipodi:role="line">keys</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-0-3-0-0"
+         y="166.30766"
+         x="320.91974"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="166.30766"
+           x="320.91974"
+           id="tspan3053-0-1-0-4-7-1-0"
+           sodipodi:role="line">XkbRowRec(s)</tspan><tspan
+           id="tspan3160-7-2-5"
+           y="181.30766"
+           x="320.91974"
+           sodipodi:role="line">(array)</tspan></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="493.92169"
+       y="100.05532"
+       id="text3051-7-5-1-0-3-0-0-0"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan4859"
+         x="493.92169"
+         y="100.05532">XkbSectionRec and</tspan><tspan
+         sodipodi:role="line"
+         id="tspan4861"
+         x="493.92169"
+         y="115.05532">XkbRowRec</tspan><tspan
+         sodipodi:role="line"
+         id="tspan4863"
+         x="493.92169"
+         y="130.05533">repeated from</tspan><tspan
+         sodipodi:role="line"
+         id="tspan4865"
+         x="493.92169"
+         y="145.05533">Figure 16.4</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 145.46125,362.65683 119.5572,113.57933"
+       id="path4958"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 145.60912,338.53209 115.94557,-10e-6"
+       id="path4958-1"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="M 145.5454,87.692901 264.67217,87.340642"
+       id="path4958-1-1"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 375.45797,390.57851 96.04348,-10e-6"
+       id="path4958-1-1-5"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-0)"
+       d="m 145.83487,315.83026 48.44557,0 -0.99631,-255.040592 -46.88701,0"
+       id="path5476"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-0)"
+       d="m 375.34503,362.86422 67.01661,-0.24908 -1.2869,-281.955712 -61.19742,0"
+       id="path5476-8"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-0)"
+       d="m 378.59041,134.56566 26.90775,0 -0.51891,94.05478 -23.86993,0"
+       id="path5476-9"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+  </g>
+</svg>
diff --git a/specs/XKB/XKBlib-13.svg b/specs/XKB/XKBlib-13.svg
new file mode 100644 (file)
index 0000000..673071c
--- /dev/null
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="600"
+   height="170"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="XKBlib-13.svg"
+   inkscape:export-filename="/home/fcarrijo/Desktop/XKBlib-13.png"
+   inkscape:export-xdpi="156.71965"
+   inkscape:export-ydpi="156.71965">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.69768357"
+     inkscape:cx="459.30887"
+     inkscape:cy="62.403188"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer2"
+     showgrid="false"
+     inkscape:window-width="1016"
+     inkscape:window-height="718"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Vetorial"
+     style="display:inline">
+    <rect
+       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3070"
+       width="82.804947"
+       height="50.751419"
+       x="150.47351"
+       y="23.978369" />
+    <rect
+       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3070-6"
+       width="82.804947"
+       height="50.751419"
+       x="478.577"
+       y="23.978369" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       d="m 290.69704,24.854788 0,20.9375 -31.15625,0 0,28.9375 82.8125,0 0,-49.875 -51.65625,0 z"
+       id="rect3070-1"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       d="m 67.675844,41.992274 c 0,4.439414 -4.421479,6.925014 -9.354161,6.925014 -21.438677,0.373651 -23.427512,-1.630571 -23.15625,16.9375 0,4.93268 3.973568,8.875 8.90625,8.875 l 64.093757,0 c 4.93268,0 8.90625,-3.94232 8.90625,-8.875 l 0,-29.40625 c 0,-4.932682 -3.97357,-8.90625 -8.90625,-8.90625 -35.468805,-0.598929 -41.158603,-1.77138 -40.489596,14.449986 z"
+       id="rect3116"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccsssscc" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="75.926125"
+       y="97.879562"
+       id="text3141"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3145"
+         x="75.926125"
+         y="97.879562">actual key</tspan><tspan
+         sodipodi:role="line"
+         id="tspan3147"
+         x="75.926125"
+         y="112.87956">surface</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="191.83496"
+       y="97.879562"
+       id="text3141-1"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3147-3"
+         x="191.83496"
+         y="97.879562">approximate</tspan><tspan
+         sodipodi:role="line"
+         x="191.83496"
+         y="112.87956"
+         id="tspan3175">outline</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="300.58084"
+       y="97.879562"
+       id="text3141-1-0"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         x="300.58084"
+         y="97.879562"
+         id="tspan3175-4">primary</tspan><tspan
+         sodipodi:role="line"
+         x="300.58084"
+         y="112.87956"
+         id="tspan3203">outline</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="410.9874"
+       y="97.879562"
+       id="text3141-1-0-5"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         x="410.9874"
+         y="97.879562"
+         id="tspan3203-2">detailed</tspan><tspan
+         sodipodi:role="line"
+         x="410.9874"
+         y="112.87956"
+         id="tspan3231">outline</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="519.97949"
+       y="97.879562"
+       id="text3141-1-0-5-4"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         x="519.97949"
+         y="97.879562"
+         id="tspan3231-9">bounding</tspan><tspan
+         sodipodi:role="line"
+         x="519.97949"
+         y="112.87956"
+         id="tspan3259">box</tspan></text>
+    <path
+       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       d="m 402.3416,41.992274 c 0,4.439414 -4.42148,6.925014 -9.35416,6.925014 -21.43868,0.373651 -23.42751,-1.630571 -23.15625,16.9375 0,4.93268 3.97357,8.875 8.90625,8.875 l 64.09376,0 c 4.93268,0 8.90625,-3.94232 8.90625,-8.875 l 0,-29.40625 c 0,-4.932682 -3.97357,-8.90625 -8.90625,-8.90625 -35.46881,-0.598929 -41.15861,-1.77138 -40.4896,14.449986 z"
+       id="rect3116-9"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccsssscc" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="296.95737"
+       y="145.26933"
+       id="text3141-1-0-5-4-4"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         x="296.95737"
+         y="145.26933"
+         id="tspan3259-8">outline array</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 141.53981,130.22552 0,11.46652 102.48199,0"
+       id="path3307"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 451.85241,130.22552 0,11.46652 -102.48199,0"
+       id="path3307-1"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/specs/XKB/XKBlib-14.svg b/specs/XKB/XKBlib-14.svg
new file mode 100644 (file)
index 0000000..0ac948c
--- /dev/null
@@ -0,0 +1,557 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="550"
+   height="150"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="XKBlib-14.svg"
+   style="display:inline"
+   inkscape:export-filename="/home/fcarrijo/Desktop/XKBlib-14.png"
+   inkscape:export-xdpi="156.71965"
+   inkscape:export-ydpi="156.71965">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend"
+       style="overflow:visible">
+      <path
+         id="path4715"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend-7"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4715-3"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.7327273"
+     inkscape:cx="288.60377"
+     inkscape:cy="28.83001"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer2"
+     showgrid="false"
+     inkscape:window-width="1016"
+     inkscape:window-height="718"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Vetorial">
+    <g
+       id="g3161">
+      <rect
+         ry="0"
+         rx="8.6568727"
+         y="48.426022"
+         x="281.63693"
+         height="24.81637"
+         width="100.41972"
+         id="rect4240"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3086-4-1"
+         y="120.41444"
+         x="287.22552"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
+         xml:space="preserve"><tspan
+           y="120.41444"
+           x="287.22552"
+           id="tspan3134"
+           sodipodi:role="line">Core Symbols</tspan></text>
+      <g
+         transform="matrix(1.163736,0,0,1.163736,55.863634,-154.12909)"
+         id="text3086-4-1-7-4"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold">
+        <path
+           inkscape:connector-curvature="0"
+           id="path3234-7"
+           d="m 268.03934,181.84424 -1.5,3.57422 2.20898,0 0,-3.57422 -0.70898,0 m -1.5586,-1.5 8.34961,0 0,1.70508 -3.82617,0 0,1.6289 3.59766,0 0,1.70508 -3.59766,0 0,2.00391 3.96094,0 0,1.70508 -6.2168,0 0,-2.05079 -2.89453,0 -0.86133,2.05079 -2.17383,0 3.66211,-8.74805" />
+      </g>
+      <g
+         transform="translate(199.4078,-128.3859)"
+         id="text3086-4-1-7-2-3"
+         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold">
+        <path
+           inkscape:connector-curvature="0"
+           id="path3267-7"
+           d="m 148.543,188.37929 c -1e-5,-0.46484 -0.13673,-0.83854 -0.41016,-1.1211 -0.26889,-0.2871 -0.62208,-0.43065 -1.05957,-0.43066 -0.46941,1e-5 -0.84994,0.13445 -1.1416,0.40332 -0.29167,0.26433 -0.47397,0.64714 -0.54687,1.14844 l 3.1582,0 m -6.87012,1.21679 c -0.51042,1e-5 -0.89551,0.0866 -1.15527,0.25977 -0.25521,0.17318 -0.38282,0.42839 -0.38281,0.76563 -1e-5,0.30989 0.10253,0.55371 0.30761,0.73144 0.20964,0.17318 0.49902,0.25977 0.86817,0.25977 0.46028,0 0.84765,-0.16406 1.16211,-0.49219 0.31444,-0.33268 0.47167,-0.74739 0.47168,-1.24414 l 0,-0.28028 -1.27149,0 m -3.33594,-4.00585 c 0.54232,-0.1276 1.06641,-0.2233 1.57227,-0.28711 0.51041,-0.0684 0.98665,-0.10254 1.42871,-0.10254 0.68359,0 1.27148,0.0889 1.76367,0.2666 0.49674,0.17318 0.9069,0.43978 1.23047,0.7998 0.35091,-0.3509 0.75878,-0.61522 1.22363,-0.79297 0.46484,-0.18228 0.97526,-0.27343 1.53125,-0.27343 1.20768,0 2.17154,0.36231 2.89161,1.08691 0.72459,0.72462 1.0869,1.69304 1.08691,2.90527 l 0,0.69727 -5.72852,0 c 0.0638,0.57422 0.27115,1.00488 0.62207,1.29199 0.35546,0.28711 0.85449,0.43067 1.49708,0.43067 0.51496,0 1.04132,-0.0752 1.5791,-0.22559 0.5423,-0.15495 1.09829,-0.38737 1.66797,-0.69727 l 0,1.88672 c -0.57879,0.21875 -1.15985,0.38282 -1.74317,0.49219 -0.57879,0.11393 -1.15528,0.1709 -1.72949,0.1709 -0.81577,0 -1.5267,-0.12077 -2.13281,-0.36231 -0.60157,-0.24609 -1.06642,-0.597 -1.39453,-1.05273 -0.4603,0.48763 -0.94565,0.84538 -1.45606,1.07324 -0.50586,0.22787 -1.07552,0.3418 -1.70898,0.3418 -0.88412,0 -1.58366,-0.22331 -2.09864,-0.66992 -0.51497,-0.45117 -0.77246,-1.05957 -0.77246,-1.8252 0,-0.89778 0.30762,-1.55631 0.92285,-1.97558 0.61979,-0.41927 1.5905,-0.62891 2.91211,-0.62891 l 1.44239,0 0,-0.19141 c -1e-5,-0.38736 -0.15268,-0.66991 -0.45801,-0.84765 -0.30535,-0.18229 -0.78158,-0.27343 -1.42871,-0.27344 -0.52409,1e-5 -1.01172,0.0524 -1.46289,0.15723 -0.45118,0.10482 -0.87045,0.26205 -1.25782,0.47168 l 0,-1.86621" />
+      </g>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3353-9-87"
+         y="65.937233"
+         x="313.34781"
+         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
+         xml:space="preserve"><tspan
+           y="65.937233"
+           x="313.34781"
+           id="tspan3378-31"
+           sodipodi:role="line">A</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3353-3"
+         y="64.655495"
+         x="289.28244"
+         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
+         xml:space="preserve"><tspan
+           y="64.655495"
+           x="289.28244"
+           id="tspan3355-1"
+           sodipodi:role="line">a</tspan></text>
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4240-7"
+         d="m 306.26094,73.242392 0,-24.81637"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4240-7-9"
+         d="m 331.26965,73.242392 0,-24.81637"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4240-7-1"
+         d="m 356.2784,73.242392 0,-24.81637"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text4325"
+         y="44.38615"
+         x="286.25394"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="44.38615"
+           x="286.25394"
+           id="tspan4327"
+           sodipodi:role="line">L1</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text4325-5"
+         y="44.465252"
+         x="312.53479"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="44.465252"
+           x="312.53479"
+           id="tspan4350"
+           sodipodi:role="line">L2</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text4325-9"
+         y="44.38615"
+         x="336.77405"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="44.38615"
+           x="336.77405"
+           id="tspan4327-1"
+           sodipodi:role="line">L1</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text4325-5-8"
+         y="44.465252"
+         x="361.06015"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           id="tspan4350-8"
+           sodipodi:role="line"
+           x="361.06015"
+           y="44.465252">L2</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text4325-79"
+         y="86.273293"
+         x="298.10666"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="86.273293"
+           x="298.10666"
+           id="tspan4457"
+           sodipodi:role="line">G1</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text4325-79-6"
+         y="86.273293"
+         x="347.8331"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="86.273293"
+           x="347.8331"
+           id="tspan4480"
+           sodipodi:role="line">G2</tspan></text>
+    </g>
+    <g
+       id="g3138">
+      <rect
+         rx="0"
+         y="44.38615"
+         x="459.39139"
+         height="48.478489"
+         width="48.478489"
+         id="rect4286"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3086-4-1-6"
+         y="120.41443"
+         x="431.91623"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
+         xml:space="preserve"><tspan
+           y="120.41443"
+           x="431.91623"
+           id="tspan3157"
+           sodipodi:role="line">Xkb Symbols</tspan></text>
+      <g
+         transform="matrix(1.163736,0,0,1.163736,182.83109,-133.64116)"
+         id="text3086-4-1-7-8"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold">
+        <path
+           inkscape:connector-curvature="0"
+           id="path3234-6"
+           d="m 268.03934,181.84424 -1.5,3.57422 2.20898,0 0,-3.57422 -0.70898,0 m -1.5586,-1.5 8.34961,0 0,1.70508 -3.82617,0 0,1.6289 3.59766,0 0,1.70508 -3.59766,0 0,2.00391 3.96094,0 0,1.70508 -6.2168,0 0,-2.05079 -2.89453,0 -0.86133,2.05079 -2.17383,0 3.66211,-8.74805" />
+      </g>
+      <g
+         transform="translate(327.14478,-106.82729)"
+         id="text3086-4-1-7-2-3-7"
+         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold">
+        <path
+           inkscape:connector-curvature="0"
+           id="path3267-7-2"
+           d="m 148.543,188.37929 c -1e-5,-0.46484 -0.13673,-0.83854 -0.41016,-1.1211 -0.26889,-0.2871 -0.62208,-0.43065 -1.05957,-0.43066 -0.46941,1e-5 -0.84994,0.13445 -1.1416,0.40332 -0.29167,0.26433 -0.47397,0.64714 -0.54687,1.14844 l 3.1582,0 m -6.87012,1.21679 c -0.51042,1e-5 -0.89551,0.0866 -1.15527,0.25977 -0.25521,0.17318 -0.38282,0.42839 -0.38281,0.76563 -1e-5,0.30989 0.10253,0.55371 0.30761,0.73144 0.20964,0.17318 0.49902,0.25977 0.86817,0.25977 0.46028,0 0.84765,-0.16406 1.16211,-0.49219 0.31444,-0.33268 0.47167,-0.74739 0.47168,-1.24414 l 0,-0.28028 -1.27149,0 m -3.33594,-4.00585 c 0.54232,-0.1276 1.06641,-0.2233 1.57227,-0.28711 0.51041,-0.0684 0.98665,-0.10254 1.42871,-0.10254 0.68359,0 1.27148,0.0889 1.76367,0.2666 0.49674,0.17318 0.9069,0.43978 1.23047,0.7998 0.35091,-0.3509 0.75878,-0.61522 1.22363,-0.79297 0.46484,-0.18228 0.97526,-0.27343 1.53125,-0.27343 1.20768,0 2.17154,0.36231 2.89161,1.08691 0.72459,0.72462 1.0869,1.69304 1.08691,2.90527 l 0,0.69727 -5.72852,0 c 0.0638,0.57422 0.27115,1.00488 0.62207,1.29199 0.35546,0.28711 0.85449,0.43067 1.49708,0.43067 0.51496,0 1.04132,-0.0752 1.5791,-0.22559 0.5423,-0.15495 1.09829,-0.38737 1.66797,-0.69727 l 0,1.88672 c -0.57879,0.21875 -1.15985,0.38282 -1.74317,0.49219 -0.57879,0.11393 -1.15528,0.1709 -1.72949,0.1709 -0.81577,0 -1.5267,-0.12077 -2.13281,-0.36231 -0.60157,-0.24609 -1.06642,-0.597 -1.39453,-1.05273 -0.4603,0.48763 -0.94565,0.84538 -1.45606,1.07324 -0.50586,0.22787 -1.07552,0.3418 -1.70898,0.3418 -0.88412,0 -1.58366,-0.22331 -2.09864,-0.66992 -0.51497,-0.45117 -0.77246,-1.05957 -0.77246,-1.8252 0,-0.89778 0.30762,-1.55631 0.92285,-1.97558 0.61979,-0.41927 1.5905,-0.62891 2.91211,-0.62891 l 1.44239,0 0,-0.19141 c -1e-5,-0.38736 -0.15268,-0.66991 -0.45801,-0.84765 -0.30535,-0.18229 -0.78158,-0.27343 -1.42871,-0.27344 -0.52409,1e-5 -1.01172,0.0524 -1.46289,0.15723 -0.45118,0.10482 -0.87045,0.26205 -1.25782,0.47168 l 0,-1.86621" />
+      </g>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3353-9-0"
+         y="61.608799"
+         x="490.33276"
+         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
+         xml:space="preserve"><tspan
+           y="61.608799"
+           x="490.33276"
+           id="tspan3378-0"
+           sodipodi:role="line">A</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3353-8"
+         y="61.410557"
+         x="464.72839"
+         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
+         xml:space="preserve"><tspan
+           y="61.410557"
+           x="464.72839"
+           id="tspan3355-01"
+           sodipodi:role="line">a</tspan></text>
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4286-0"
+         d="m 508.447,68.625395 -48.47849,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4286-0-3"
+         d="m 483.63063,92.287513 0,-48.47849"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text4325-7"
+         y="40.103302"
+         x="463.74152"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="40.103302"
+           x="463.74152"
+           id="tspan4327-0"
+           sodipodi:role="line">L1</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text4325-5-5"
+         y="39.605278"
+         x="487.4505"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           id="tspan4350-2"
+           sodipodi:role="line"
+           x="487.4505"
+           y="39.605278">L2</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text4325-79-68"
+         y="61.957432"
+         x="439.01883"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="61.957432"
+           x="439.01883"
+           id="tspan4457-4"
+           sodipodi:role="line">G1</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text4325-79-6-6"
+         y="86.760986"
+         x="439.0657"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="86.760986"
+           x="439.0657"
+           id="tspan4480-6"
+           sodipodi:role="line">G2</tspan></text>
+    </g>
+    <g
+       id="g4663">
+      <text
+         sodipodi:linespacing="125%"
+         id="text3086-4"
+         y="120.99155"
+         x="176.48442"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
+         xml:space="preserve"><tspan
+           y="120.99155"
+           x="176.48442"
+           id="tspan3111"
+           sodipodi:role="line">Symbols</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3353-5"
+         y="39.859066"
+         x="221.81828"
+         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
+         xml:space="preserve"><tspan
+           y="39.859066"
+           x="221.81828"
+           id="tspan3355-0"
+           sodipodi:role="line">a</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text4325-79-7"
+         y="40.405941"
+         x="173.5414"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="40.405941"
+           x="173.5414"
+           id="tspan4457-2"
+           sodipodi:role="line">G1L1 =</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3353-9-8"
+         y="58.23595"
+         x="222.35149"
+         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
+         xml:space="preserve"><tspan
+           y="58.23595"
+           x="222.35149"
+           id="tspan3378-3"
+           sodipodi:role="line">A</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text4325-79-74"
+         y="57.501087"
+         x="173.5414"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="57.501087"
+           x="173.5414"
+           id="tspan4457-1"
+           sodipodi:role="line">G1L2 =</tspan></text>
+      <g
+         transform="translate(84.752833,-118.99205)"
+         id="text3086-4-1-7-2"
+         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold">
+        <path
+           inkscape:connector-curvature="0"
+           id="path3267"
+           d="m 148.543,188.37929 c -1e-5,-0.46484 -0.13673,-0.83854 -0.41016,-1.1211 -0.26889,-0.2871 -0.62208,-0.43065 -1.05957,-0.43066 -0.46941,1e-5 -0.84994,0.13445 -1.1416,0.40332 -0.29167,0.26433 -0.47397,0.64714 -0.54687,1.14844 l 3.1582,0 m -6.87012,1.21679 c -0.51042,1e-5 -0.89551,0.0866 -1.15527,0.25977 -0.25521,0.17318 -0.38282,0.42839 -0.38281,0.76563 -1e-5,0.30989 0.10253,0.55371 0.30761,0.73144 0.20964,0.17318 0.49902,0.25977 0.86817,0.25977 0.46028,0 0.84765,-0.16406 1.16211,-0.49219 0.31444,-0.33268 0.47167,-0.74739 0.47168,-1.24414 l 0,-0.28028 -1.27149,0 m -3.33594,-4.00585 c 0.54232,-0.1276 1.06641,-0.2233 1.57227,-0.28711 0.51041,-0.0684 0.98665,-0.10254 1.42871,-0.10254 0.68359,0 1.27148,0.0889 1.76367,0.2666 0.49674,0.17318 0.9069,0.43978 1.23047,0.7998 0.35091,-0.3509 0.75878,-0.61522 1.22363,-0.79297 0.46484,-0.18228 0.97526,-0.27343 1.53125,-0.27343 1.20768,0 2.17154,0.36231 2.89161,1.08691 0.72459,0.72462 1.0869,1.69304 1.08691,2.90527 l 0,0.69727 -5.72852,0 c 0.0638,0.57422 0.27115,1.00488 0.62207,1.29199 0.35546,0.28711 0.85449,0.43067 1.49708,0.43067 0.51496,0 1.04132,-0.0752 1.5791,-0.22559 0.5423,-0.15495 1.09829,-0.38737 1.66797,-0.69727 l 0,1.88672 c -0.57879,0.21875 -1.15985,0.38282 -1.74317,0.49219 -0.57879,0.11393 -1.15528,0.1709 -1.72949,0.1709 -0.81577,0 -1.5267,-0.12077 -2.13281,-0.36231 -0.60157,-0.24609 -1.06642,-0.597 -1.39453,-1.05273 -0.4603,0.48763 -0.94565,0.84538 -1.45606,1.07324 -0.50586,0.22787 -1.07552,0.3418 -1.70898,0.3418 -0.88412,0 -1.58366,-0.22331 -2.09864,-0.66992 -0.51497,-0.45117 -0.77246,-1.05957 -0.77246,-1.8252 0,-0.89778 0.30762,-1.55631 0.92285,-1.97558 0.61979,-0.41927 1.5905,-0.62891 2.91211,-0.62891 l 1.44239,0 0,-0.19141 c -1e-5,-0.38736 -0.15268,-0.66991 -0.45801,-0.84765 -0.30535,-0.18229 -0.78158,-0.27343 -1.42871,-0.27344 -0.52409,1e-5 -1.01172,0.0524 -1.46289,0.15723 -0.45118,0.10482 -0.87045,0.26205 -1.25782,0.47168 l 0,-1.86621" />
+      </g>
+      <text
+         sodipodi:linespacing="125%"
+         id="text4325-79-0"
+         y="74.59623"
+         x="173.5414"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="74.59623"
+           x="173.5414"
+           id="tspan4457-0"
+           sodipodi:role="line">G2L1 =</tspan></text>
+      <g
+         transform="matrix(1.163736,0,0,1.163736,-83.431648,-127.64009)"
+         id="text3086-4-1-7"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold">
+        <path
+           inkscape:connector-curvature="0"
+           id="path3234"
+           d="m 268.03934,181.84424 -1.5,3.57422 2.20898,0 0,-3.57422 -0.70898,0 m -1.5586,-1.5 8.34961,0 0,1.70508 -3.82617,0 0,1.6289 3.59766,0 0,1.70508 -3.59766,0 0,2.00391 3.96094,0 0,1.70508 -6.2168,0 0,-2.05079 -2.89453,0 -0.86133,2.05079 -2.17383,0 3.66211,-8.74805" />
+      </g>
+      <text
+         sodipodi:linespacing="125%"
+         id="text4325-79-64"
+         y="91.691368"
+         x="173.5414"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="91.691368"
+           x="173.5414"
+           id="tspan4457-43"
+           sodipodi:role="line">G2L2 =</tspan></text>
+    </g>
+    <g
+       id="g3189">
+      <rect
+         rx="8.6568727"
+         ry="8.6568727"
+         y="19.569786"
+         x="57.712486"
+         height="73.871986"
+         width="63.483734"
+         id="rect3458"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="8.6568727"
+         rx="8.6568727"
+         y="24.186779"
+         x="64.06086"
+         height="50.786987"
+         width="50.786987"
+         id="rect3460"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3086"
+         y="119.98951"
+         x="40.975864"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
+         xml:space="preserve"><tspan
+           y="119.98951"
+           x="40.975864"
+           id="tspan3088"
+           sodipodi:role="line">Physical Key</tspan></text>
+      <text
+         transform="matrix(0,-1,1,0,0,0)"
+         sodipodi:linespacing="125%"
+         id="text3086-2"
+         y="53.643921"
+         x="-92.862938"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="53.643921"
+           x="-92.862938"
+           id="tspan3210"
+           sodipodi:role="line">Shift Level</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3086-2-1"
+         y="105.41803"
+         x="62.852604"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="105.41803"
+           x="62.852604"
+           id="tspan3210-2"
+           sodipodi:role="line">Group</tspan></text>
+      <g
+         transform="translate(-45.888592,-129.55559)"
+         id="text3086-4-1-7-2-3-3"
+         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#999999;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold">
+        <path
+           style="fill:#999999"
+           inkscape:connector-curvature="0"
+           id="path3267-7-7"
+           d="m 148.543,188.37929 c -1e-5,-0.46484 -0.13673,-0.83854 -0.41016,-1.1211 -0.26889,-0.2871 -0.62208,-0.43065 -1.05957,-0.43066 -0.46941,1e-5 -0.84994,0.13445 -1.1416,0.40332 -0.29167,0.26433 -0.47397,0.64714 -0.54687,1.14844 l 3.1582,0 m -6.87012,1.21679 c -0.51042,1e-5 -0.89551,0.0866 -1.15527,0.25977 -0.25521,0.17318 -0.38282,0.42839 -0.38281,0.76563 -1e-5,0.30989 0.10253,0.55371 0.30761,0.73144 0.20964,0.17318 0.49902,0.25977 0.86817,0.25977 0.46028,0 0.84765,-0.16406 1.16211,-0.49219 0.31444,-0.33268 0.47167,-0.74739 0.47168,-1.24414 l 0,-0.28028 -1.27149,0 m -3.33594,-4.00585 c 0.54232,-0.1276 1.06641,-0.2233 1.57227,-0.28711 0.51041,-0.0684 0.98665,-0.10254 1.42871,-0.10254 0.68359,0 1.27148,0.0889 1.76367,0.2666 0.49674,0.17318 0.9069,0.43978 1.23047,0.7998 0.35091,-0.3509 0.75878,-0.61522 1.22363,-0.79297 0.46484,-0.18228 0.97526,-0.27343 1.53125,-0.27343 1.20768,0 2.17154,0.36231 2.89161,1.08691 0.72459,0.72462 1.0869,1.69304 1.08691,2.90527 l 0,0.69727 -5.72852,0 c 0.0638,0.57422 0.27115,1.00488 0.62207,1.29199 0.35546,0.28711 0.85449,0.43067 1.49708,0.43067 0.51496,0 1.04132,-0.0752 1.5791,-0.22559 0.5423,-0.15495 1.09829,-0.38737 1.66797,-0.69727 l 0,1.88672 c -0.57879,0.21875 -1.15985,0.38282 -1.74317,0.49219 -0.57879,0.11393 -1.15528,0.1709 -1.72949,0.1709 -0.81577,0 -1.5267,-0.12077 -2.13281,-0.36231 -0.60157,-0.24609 -1.06642,-0.597 -1.39453,-1.05273 -0.4603,0.48763 -0.94565,0.84538 -1.45606,1.07324 -0.50586,0.22787 -1.07552,0.3418 -1.70898,0.3418 -0.88412,0 -1.58366,-0.22331 -2.09864,-0.66992 -0.51497,-0.45117 -0.77246,-1.05957 -0.77246,-1.8252 0,-0.89778 0.30762,-1.55631 0.92285,-1.97558 0.61979,-0.41927 1.5905,-0.62891 2.91211,-0.62891 l 1.44239,0 0,-0.19141 c -1e-5,-0.38736 -0.15268,-0.66991 -0.45801,-0.84765 -0.30535,-0.18229 -0.78158,-0.27343 -1.42871,-0.27344 -0.52409,1e-5 -1.01172,0.0524 -1.46289,0.15723 -0.45118,0.10482 -0.87045,0.26205 -1.25782,0.47168 l 0,-1.86621" />
+      </g>
+      <g
+         transform="matrix(1.163736,0,0,1.163736,-214.44151,-178.38377)"
+         id="text3086-4-1-7-25"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold">
+        <path
+           inkscape:connector-curvature="0"
+           id="path3234-3"
+           d="m 268.03934,181.84424 -1.5,3.57422 2.20898,0 0,-3.57422 -0.70898,0 m -1.5586,-1.5 8.34961,0 0,1.70508 -3.82617,0 0,1.6289 3.59766,0 0,1.70508 -3.59766,0 0,2.00391 3.96094,0 0,1.70508 -6.2168,0 0,-2.05079 -2.89453,0 -0.86133,2.05079 -2.17383,0 3.66211,-8.74805" />
+      </g>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3353"
+         y="63.485809"
+         x="74.238411"
+         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#999999;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
+         xml:space="preserve"><tspan
+           y="63.485809"
+           x="74.238411"
+           id="tspan3355"
+           sodipodi:role="line">a</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3353-9"
+         y="41.682552"
+         x="73.295052"
+         style="font-size:14px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
+         xml:space="preserve"><tspan
+           y="41.682552"
+           x="73.295052"
+           id="tspan3378"
+           sodipodi:role="line">A</tspan></text>
+      <path
+         inkscape:connector-curvature="0"
+         id="path4683"
+         d="m 105.03673,101.52151 11.54249,0"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4683-4"
+         d="m 51.950847,27.215961 0,-11.54249"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Mend)" />
+    </g>
+  </g>
+</svg>
diff --git a/specs/XKB/XKBlib-15.svg b/specs/XKB/XKBlib-15.svg
new file mode 100644 (file)
index 0000000..43d3e71
--- /dev/null
@@ -0,0 +1,885 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="500"
+   height="520"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="XKBlib-15.svg"
+   style="display:inline"
+   inkscape:export-filename="/home/fcarrijo/Desktop/XKBlib-15.png"
+   inkscape:export-xdpi="156.71965"
+   inkscape:export-ydpi="156.71965">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend"
+       style="overflow:visible">
+      <path
+         id="path4736"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-6"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4736-5"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-5"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4736-6"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-1"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4736-4"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-7"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4736-2"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-3"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4736-3"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-4"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4736-44"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.4740457"
+     inkscape:cx="211.44949"
+     inkscape:cy="268.6145"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer2"
+     showgrid="false"
+     inkscape:window-width="1016"
+     inkscape:window-height="718"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Vetorial"
+     style="display:inline">
+    <g
+       id="g5523">
+      <rect
+         rx="0"
+         y="14.391144"
+         x="29.261993"
+         height="149.18819"
+         width="82.509224"
+         id="rect3070"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3840"
+         y="181.32841"
+         x="31.405277"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="181.32841"
+           x="31.405277"
+           id="tspan3842"
+           sodipodi:role="line">XkbClientMapRec</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3840-7"
+         y="27.427563"
+         x="47.115726"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="27.427563"
+           x="47.115726"
+           id="tspan3842-0"
+           sodipodi:role="line">size_types</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3840-5"
+         y="45.751293"
+         x="45.579838"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="45.751293"
+           x="45.579838"
+           id="tspan3842-1"
+           sodipodi:role="line">num_types</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3840-1"
+         y="64.459572"
+         x="58.216312"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="64.459572"
+           x="58.216312"
+           id="tspan3842-03"
+           sodipodi:role="line">types</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3840-0"
+         y="83.176636"
+         x="47.774906"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="83.176636"
+           x="47.774906"
+           id="tspan3842-04"
+           sodipodi:role="line">size_syms</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3840-54"
+         y="100.86098"
+         x="46.239017"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="100.86098"
+           x="46.239017"
+           id="tspan3842-2"
+           sodipodi:role="line">num_syms</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3840-4"
+         y="119.56923"
+         x="58.752445"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="119.56923"
+           x="58.752445"
+           id="tspan3842-9"
+           sodipodi:role="line">syms</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3840-9"
+         y="138.9257"
+         x="38.572758"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="138.9257"
+           x="38.572758"
+           id="tspan3842-94"
+           sodipodi:role="line">key_sym_map</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3840-98"
+         y="157.50873"
+         x="48.108891"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="157.50873"
+           x="48.108891"
+           id="tspan3842-16"
+           sodipodi:role="line">mod_map</tspan></text>
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3070-3"
+         d="m 28.782286,34.361408 82.509224,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3070-3-9"
+         d="m 28.94096,52.704586 82.50923,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3070-3-3"
+         d="m 29.741698,71.527456 82.509222,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3070-3-34"
+         d="m 29.741698,90.110465 82.509222,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3070-3-6"
+         d="m 29.261993,108.69349 82.509227,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3070-3-1"
+         d="m 29.741698,127.27653 82.509232,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3070-3-5"
+         d="m 29.741698,145.85954 82.509232,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+    </g>
+    <g
+       id="g4147">
+      <g
+         id="g4034">
+        <rect
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="rect4000"
+           width="80.730202"
+           height="18.99534"
+           x="166.88763"
+           y="452.83789" />
+        <rect
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="rect4000-6"
+           width="80.730202"
+           height="18.99534"
+           x="162.70413"
+           y="456.90833" />
+        <rect
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="rect4000-7"
+           width="80.730202"
+           height="18.99534"
+           x="158.52063"
+           y="460.97876" />
+        <rect
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="rect4000-1"
+           width="80.730202"
+           height="18.99534"
+           x="154.33713"
+           y="465.04919" />
+      </g>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3840-2"
+         y="497.38193"
+         x="197.65204"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="497.38193"
+           x="197.65204"
+           id="tspan3842-5"
+           sodipodi:role="line">unsigned char</tspan><tspan
+           id="tspan4121"
+           y="508.63193"
+           x="197.65204"
+           sodipodi:role="line">(array)</tspan></text>
+    </g>
+    <g
+       id="g4199">
+      <g
+         id="g4034-2"
+         transform="translate(175.5373,-228.62249)">
+        <rect
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="rect4000-2"
+           width="80.730202"
+           height="18.99534"
+           x="166.88763"
+           y="452.83789" />
+        <rect
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="rect4000-6-9"
+           width="80.730202"
+           height="18.99534"
+           x="162.70413"
+           y="456.90833" />
+        <rect
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="rect4000-7-2"
+           width="80.730202"
+           height="18.99534"
+           x="158.52063"
+           y="460.97876" />
+        <rect
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="rect4000-1-8"
+           width="80.730202"
+           height="18.99534"
+           x="154.33713"
+           y="465.04919" />
+      </g>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3840-2-3"
+         y="269.91846"
+         x="370.70963"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="269.91846"
+           x="370.70963"
+           id="tspan3842-5-7"
+           sodipodi:role="line">KeySym(s)</tspan><tspan
+           id="tspan4121-6"
+           y="281.16846"
+           x="370.70963"
+           sodipodi:role="line">(array)</tspan></text>
+    </g>
+    <g
+       id="g4251">
+      <g
+         id="g4034-1"
+         transform="translate(175.5373,-306.63907)">
+        <rect
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="rect4000-24"
+           width="80.730202"
+           height="18.99534"
+           x="166.88763"
+           y="452.83789" />
+        <rect
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="rect4000-6-7"
+           width="80.730202"
+           height="18.99534"
+           x="162.70413"
+           y="456.90833" />
+        <rect
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="rect4000-7-8"
+           width="80.730202"
+           height="18.99534"
+           x="158.52063"
+           y="460.97876" />
+        <rect
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="rect4000-1-6"
+           width="80.730202"
+           height="18.99534"
+           x="154.33713"
+           y="465.04919" />
+      </g>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3840-2-3-8"
+         y="191.2191"
+         x="371.03482"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="191.2191"
+           x="371.03482"
+           id="tspan3842-5-7-1"
+           sodipodi:role="line">Atom(s)</tspan><tspan
+           id="tspan4121-6-3"
+           y="202.4691"
+           x="371.03482"
+           sodipodi:role="line">(array)</tspan></text>
+    </g>
+    <g
+       id="g4261">
+      <g
+         id="g4034-3"
+         transform="translate(175.5373,-385.33405)">
+        <rect
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="rect4000-77"
+           width="80.730202"
+           height="18.99534"
+           x="166.88763"
+           y="452.83789" />
+        <rect
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="rect4000-6-2"
+           width="80.730202"
+           height="18.99534"
+           x="162.70413"
+           y="456.90833" />
+        <rect
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="rect4000-7-3"
+           width="80.730202"
+           height="18.99534"
+           x="158.52063"
+           y="460.97876" />
+        <rect
+           style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="rect4000-1-7"
+           width="80.730202"
+           height="18.99534"
+           x="154.33713"
+           y="465.04919" />
+      </g>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3840-2-3-8-6"
+         y="112.52413"
+         x="376.19012"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="112.52413"
+           x="376.19012"
+           id="tspan3842-5-7-1-4"
+           sodipodi:role="line">XkbKTMapEntryRec(s)</tspan><tspan
+           id="tspan4121-6-3-0"
+           y="123.77413"
+           x="376.19012"
+           sodipodi:role="line">(array)</tspan></text>
+    </g>
+    <g
+       id="g4476">
+      <rect
+         y="259.76013"
+         x="161.90036"
+         height="127.12177"
+         width="81.070114"
+         id="rect4350-0-1"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="263.59778"
+         x="157.10332"
+         height="127.12177"
+         width="81.070114"
+         id="rect4350-0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="267.19556"
+         x="152.54613"
+         height="127.12177"
+         width="81.070114"
+         id="rect4350"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3840-3"
+         y="279.27258"
+         x="167.74013"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           id="tspan4346"
+           y="279.27258"
+           x="167.74013"
+           sodipodi:role="line">kt_index[0]</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3840-50"
+         y="297.34863"
+         x="167.74013"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="297.34863"
+           x="167.74013"
+           id="tspan3842-99"
+           sodipodi:role="line">kt_index[1]</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3840-8"
+         y="315.42468"
+         x="167.74013"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="315.42468"
+           x="167.74013"
+           id="tspan3842-02"
+           sodipodi:role="line">kt_index[2]</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3840-49"
+         y="333.50073"
+         x="167.74013"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="333.50073"
+           x="167.74013"
+           id="tspan3842-01"
+           sodipodi:role="line">kt_index[3]</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3840-20"
+         y="351.57678"
+         x="169.31117"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="351.57678"
+           x="169.31117"
+           id="tspan3842-06"
+           sodipodi:role="line">group_info</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3840-39"
+         y="370.65039"
+         x="180.86879"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="370.65039"
+           x="180.86879"
+           id="tspan3842-08"
+           sodipodi:role="line">width</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3840-38"
+         y="388.72644"
+         x="180.20741"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="388.72644"
+           x="180.20741"
+           id="tspan3842-7"
+           sodipodi:role="line">offset</tspan></text>
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4350-3"
+         d="m 233.61625,285.95295 -81.07012,0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4350-3-1"
+         d="m 233.61625,304.02899 -81.07012,0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4350-3-0"
+         d="m 233.61625,322.10505 -81.07012,0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4350-3-05"
+         d="m 233.61625,340.1811 -81.07012,0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4350-3-03"
+         d="m 233.61625,358.25715 -81.07012,0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4350-3-18"
+         d="m 233.61625,376.33319 -81.07012,0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3840-38-7"
+         y="413.50281"
+         x="193.39928"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="413.50281"
+           x="193.39928"
+           id="tspan3842-7-9"
+           sodipodi:role="line">XkbSymMapRec(s)</tspan><tspan
+           id="tspan4474"
+           y="424.75281"
+           x="193.39928"
+           sodipodi:role="line">(array)</tspan></text>
+    </g>
+    <g
+       id="g4680">
+      <rect
+         y="41.061157"
+         x="204.18091"
+         height="127.12177"
+         width="81.070114"
+         id="rect4350-0-1-0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="44.898811"
+         x="199.38387"
+         height="127.12177"
+         width="81.070114"
+         id="rect4350-0-3"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="48.496574"
+         x="194.82668"
+         height="127.12177"
+         width="81.070114"
+         id="rect4350-5"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3840-3-9"
+         y="60.573608"
+         x="222.83511"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           id="tspan4346-4"
+           y="60.573608"
+           x="222.83511"
+           sodipodi:role="line">mods</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3840-50-8"
+         y="78.649658"
+         x="209.78336"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="78.649658"
+           x="209.78336"
+           id="tspan3842-99-4"
+           sodipodi:role="line">num_levels</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3840-8-6"
+         y="96.725708"
+         x="210.10196"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="96.725708"
+           x="210.10196"
+           id="tspan3842-02-9"
+           sodipodi:role="line">map_count</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3840-49-2"
+         y="114.80177"
+         x="225.19717"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="114.80177"
+           x="225.19717"
+           id="tspan3842-01-9"
+           sodipodi:role="line">map</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3840-20-0"
+         y="132.87781"
+         x="215.40836"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="132.87781"
+           x="215.40836"
+           id="tspan3842-06-3"
+           sodipodi:role="line">preserve</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3840-39-0"
+         y="151.95142"
+         x="222.42203"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="151.95142"
+           x="222.42203"
+           id="tspan3842-08-3"
+           sodipodi:role="line">name</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3840-38-3"
+         y="170.02747"
+         x="207.0961"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="170.02747"
+           x="207.0961"
+           id="tspan3842-7-7"
+           sodipodi:role="line">level_names</tspan></text>
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4350-3-9"
+         d="m 275.89681,67.25398 -81.07012,0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4350-3-1-4"
+         d="m 275.89681,85.33002 -81.07012,0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4350-3-0-9"
+         d="m 275.89681,103.40608 -81.07012,0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4350-3-05-9"
+         d="m 275.89681,121.48213 -81.07012,0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4350-3-03-1"
+         d="m 275.89681,139.55818 -81.07012,0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4350-3-18-9"
+         d="m 275.89681,157.63422 -81.07012,0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3840-38-7-4"
+         y="190.80383"
+         x="235.61661"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="190.80383"
+           x="235.61661"
+           id="tspan3842-7-9-2"
+           sodipodi:role="line">XkbKeyTypeRec(s)</tspan><tspan
+           id="tspan4474-0"
+           y="202.05383"
+           x="235.61661"
+           sodipodi:role="line">(array)</tspan></text>
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 275.76001,113.66094 24.29534,0.0291 0,-25.66421 28.78229,0"
+       id="path4708"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 275.25121,164.89 53.82628,0.12845"
+       id="path4710"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 112.07676,118.31742 40.46494,0.4797 0,127.66421 174.78229,0"
+       id="path4708-9"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 111.41912,59.398358 82.50469,-0.04116"
+       id="path4710-1"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 111.90702,136.53246 20.37057,-0.23986 -0.23985,138.26384 18.13168,0"
+       id="path4708-9-3"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 112.01383,154.91808 12.6529,0.0289 0,317.12774 28.14401,0"
+       id="path4708-9-3-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 1;stroke-dashoffset:0;marker-end:url(#Arrow2Lend)"
+       d="m 233.67487,382.63489 42.39451,-0.1405 0,-147.66421 50.78229,0"
+       id="path4708-92"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 1;stroke-dashoffset:0;marker-end:url(#Arrow2Lend)"
+       d="m 233.47105,277.65703 34.55934,-0.1405 0,-59.8321 -96,0.16789 -0.46529,-176 22.24319,0.232472"
+       id="path4708-92-9"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 1;stroke-dashoffset:0;marker-end:url(#Arrow2Lend-4)"
+       d="m 95.461255,261.91882 55.003685,0"
+       id="path5300"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 1;stroke-dashoffset:0;marker-end:url(#Arrow2Lend-4)"
+       d="m 108.89299,261.91882 -0.47971,198.59779 44.05166,0"
+       id="path5302"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccc" />
+    <text
+       xml:space="preserve"
+       style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="49.759731"
+       y="264.01059"
+       id="text3840-93"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         x="49.759731"
+         y="264.01059"
+         id="tspan5519">Key Code</tspan></text>
+  </g>
+</svg>
diff --git a/specs/XKB/XKBlib-16.svg b/specs/XKB/XKBlib-16.svg
new file mode 100644 (file)
index 0000000..231c572
--- /dev/null
@@ -0,0 +1,643 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="500"
+   height="380"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="XKBlib-16.svg"
+   inkscape:export-filename="/home/fcarrijo/Desktop/XKBlib-16.png"
+   inkscape:export-xdpi="156.71965"
+   inkscape:export-ydpi="156.71965">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend"
+       style="overflow:visible">
+      <path
+         id="path4426"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-0"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4426-6"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-0-9"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4426-6-0"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-0-3"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4426-6-8"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-0-31"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4426-6-00"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-0-31-8"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4426-6-00-0"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-7"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4426-9"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-03"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4426-5"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.0085576"
+     inkscape:cx="334.50885"
+     inkscape:cy="182.60923"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer2"
+     showgrid="false"
+     inkscape:window-width="1016"
+     inkscape:window-height="718"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Vetorial"
+     style="display:inline">
+    <g
+       id="g5627">
+      <g
+         id="g4129">
+        <g
+           transform="translate(2.103321,82.9059)"
+           id="g3912-44">
+          <rect
+             y="151.43912"
+             x="199.81549"
+             height="18.92989"
+             width="80.627304"
+             id="rect3070-3"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+          <rect
+             y="155.29521"
+             x="195.25829"
+             height="18.92989"
+             width="80.627304"
+             id="rect3070-1-0"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+          <rect
+             y="159.15129"
+             x="190.7011"
+             height="18.92989"
+             width="80.627304"
+             id="rect3070-1-5-7"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+          <rect
+             y="163.00739"
+             x="186.14391"
+             height="18.92989"
+             width="80.627304"
+             id="rect3070-1-5-5-8"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+        </g>
+        <text
+           xml:space="preserve"
+           style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+           x="235.40326"
+           y="280.44281"
+           id="text3993"
+           sodipodi:linespacing="125%"><tspan
+             sodipodi:role="line"
+             id="tspan3995"
+             x="235.40326"
+             y="280.44281">unsigned char(s)</tspan><tspan
+             sodipodi:role="line"
+             x="235.40326"
+             y="291.69281"
+             id="tspan3997">(array)</tspan></text>
+      </g>
+      <g
+         id="g4119">
+        <g
+           id="g3912"
+           transform="translate(2.103321,0)">
+          <rect
+             y="151.43912"
+             x="199.81549"
+             height="18.92989"
+             width="80.627304"
+             id="rect3070"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+          <rect
+             y="155.29521"
+             x="195.25829"
+             height="18.92989"
+             width="80.627304"
+             id="rect3070-1"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+          <rect
+             y="159.15129"
+             x="190.7011"
+             height="18.92989"
+             width="80.627304"
+             id="rect3070-1-5"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+          <rect
+             y="163.00739"
+             x="186.14391"
+             height="18.92989"
+             width="80.627304"
+             id="rect3070-1-5-5"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+        </g>
+        <text
+           xml:space="preserve"
+           style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+           x="235.40326"
+           y="195.97231"
+           id="text3993-1"
+           sodipodi:linespacing="125%"><tspan
+             sodipodi:role="line"
+             id="tspan3995-5"
+             x="235.40326"
+             y="195.97231">unsigned short(s)</tspan><tspan
+             sodipodi:role="line"
+             x="235.40326"
+             y="207.22231"
+             id="tspan3997-6">(array)</tspan></text>
+      </g>
+      <g
+         id="g4181">
+        <g
+           transform="translate(2.103321,162.13099)"
+           id="g3912-6">
+          <rect
+             y="151.43912"
+             x="199.81549"
+             height="18.92989"
+             width="80.627304"
+             id="rect3070-8"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+          <rect
+             y="155.29521"
+             x="195.25829"
+             height="18.92989"
+             width="80.627304"
+             id="rect3070-1-8"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+          <rect
+             y="159.15129"
+             x="190.7011"
+             height="18.92989"
+             width="80.627304"
+             id="rect3070-1-5-4"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+          <rect
+             y="163.00739"
+             x="186.14391"
+             height="18.92989"
+             width="80.627304"
+             id="rect3070-1-5-5-3"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+        </g>
+        <text
+           xml:space="preserve"
+           style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+           x="235.40326"
+           y="357.22693"
+           id="text3993-1-1"
+           sodipodi:linespacing="125%"><tspan
+             sodipodi:role="line"
+             id="tspan3995-5-7"
+             x="235.40326"
+             y="357.22693">unsigned short(s)</tspan><tspan
+             sodipodi:role="line"
+             x="235.40326"
+             y="368.47693"
+             id="tspan3997-6-2">(array)</tspan></text>
+      </g>
+      <g
+         id="g4109">
+        <g
+           transform="translate(2.103321,-71.337643)"
+           id="g3912-4">
+          <rect
+             y="151.43912"
+             x="199.81549"
+             height="18.92989"
+             width="80.627304"
+             id="rect3070-7"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+          <rect
+             y="155.29521"
+             x="195.25829"
+             height="18.92989"
+             width="80.627304"
+             id="rect3070-1-6"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+          <rect
+             y="159.15129"
+             x="190.7011"
+             height="18.92989"
+             width="80.627304"
+             id="rect3070-1-5-56"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+          <rect
+             y="163.00739"
+             x="186.14391"
+             height="18.92989"
+             width="80.627304"
+             id="rect3070-1-5-5-9"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+        </g>
+        <text
+           xml:space="preserve"
+           style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+           x="235.65155"
+           y="123.90276"
+           id="text3993-1-2"
+           sodipodi:linespacing="125%"><tspan
+             sodipodi:role="line"
+             x="235.65155"
+             y="123.90276"
+             id="tspan3997-6-28">XkbBehaviors(s)</tspan><tspan
+             sodipodi:role="line"
+             x="235.65155"
+             y="135.15277"
+             id="tspan4073">(array)</tspan></text>
+      </g>
+      <g
+         id="g4099">
+        <g
+           transform="translate(168.44097,-95.876388)"
+           id="g3912-3">
+          <rect
+             y="151.43912"
+             x="199.81549"
+             height="18.92989"
+             width="80.627304"
+             id="rect3070-74"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+          <rect
+             y="155.29521"
+             x="195.25829"
+             height="18.92989"
+             width="80.627304"
+             id="rect3070-1-52"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+          <rect
+             y="159.15129"
+             x="190.7011"
+             height="18.92989"
+             width="80.627304"
+             id="rect3070-1-5-54"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+          <rect
+             y="163.00739"
+             x="186.14391"
+             height="18.92989"
+             width="80.627304"
+             id="rect3070-1-5-5-7"
+             style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+        </g>
+        <text
+           xml:space="preserve"
+           style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+           x="401.9892"
+           y="99.219536"
+           id="text3993-1-2-1"
+           sodipodi:linespacing="125%"><tspan
+             sodipodi:role="line"
+             x="401.9892"
+             y="99.219536"
+             id="tspan3997-6-28-2">XkbActions(s)</tspan><tspan
+             sodipodi:role="line"
+             x="401.9892"
+             y="110.46954"
+             id="tspan4073-4">(array)</tspan></text>
+      </g>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3993-1-1-7"
+         y="275.8985"
+         x="63.106224"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           id="tspan3997-6-2-6"
+           y="275.8985"
+           x="63.106224"
+           sodipodi:role="line">KeyCode</tspan></text>
+      <g
+         id="g5599">
+        <text
+           xml:space="preserve"
+           style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+           x="70.609657"
+           y="189.7818"
+           id="text3993-1-1-7-3"
+           sodipodi:linespacing="125%"><tspan
+             sodipodi:role="line"
+             x="70.609657"
+             y="189.7818"
+             id="tspan3997-6-2-6-7">XkbServerMapRec</tspan></text>
+        <rect
+           style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="rect4214"
+           width="80.627304"
+           height="144.42804"
+           x="30.147602"
+           y="29.446495" />
+        <text
+           xml:space="preserve"
+           style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+           x="70.27449"
+           y="41.147118"
+           id="text3993-1-1-7-7"
+           sodipodi:linespacing="125%"><tspan
+             sodipodi:role="line"
+             x="70.27449"
+             y="41.147118"
+             id="tspan3997-6-2-6-2">num_acts</tspan></text>
+        <text
+           xml:space="preserve"
+           style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+           x="70.439285"
+           y="59.450569"
+           id="text3993-1-1-7-37"
+           sodipodi:linespacing="125%"><tspan
+             sodipodi:role="line"
+             x="70.439285"
+             y="59.450569"
+             id="tspan3997-6-2-6-25">size_acts</tspan></text>
+        <text
+           xml:space="preserve"
+           style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+           x="70.412918"
+           y="78.233025"
+           id="text3993-1-1-7-376"
+           sodipodi:linespacing="125%"><tspan
+             sodipodi:role="line"
+             x="70.412918"
+             y="78.233025"
+             id="tspan3997-6-2-6-8">acts</tspan></text>
+        <text
+           xml:space="preserve"
+           style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+           x="70.27449"
+           y="96.536484"
+           id="text3993-1-1-7-1"
+           sodipodi:linespacing="125%"><tspan
+             sodipodi:role="line"
+             x="70.27449"
+             y="96.536484"
+             id="tspan3997-6-2-6-3">behaviors</tspan></text>
+        <text
+           xml:space="preserve"
+           style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+           x="70.27449"
+           y="113.58308"
+           id="text3993-1-1-7-6"
+           sodipodi:linespacing="125%"><tspan
+             sodipodi:role="line"
+             x="70.27449"
+             y="113.58308"
+             id="tspan3997-6-2-6-4">key_acts</tspan></text>
+        <text
+           xml:space="preserve"
+           style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+           x="70.32283"
+           y="131.7525"
+           id="text3993-1-1-7-0"
+           sodipodi:linespacing="125%"><tspan
+             sodipodi:role="line"
+             x="70.32283"
+             y="131.7525"
+             id="tspan3997-6-2-6-35">explicit</tspan></text>
+        <text
+           xml:space="preserve"
+           style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+           x="70.716141"
+           y="150.13945"
+           id="text3993-1-1-7-8"
+           sodipodi:linespacing="125%"><tspan
+             sodipodi:role="line"
+             x="70.716141"
+             y="150.13945"
+             id="tspan3997-6-2-6-5">vmods[16]</tspan></text>
+        <text
+           xml:space="preserve"
+           style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+           x="70.573318"
+           y="167.84085"
+           id="text3993-1-1-7-09"
+           sodipodi:linespacing="125%"><tspan
+             sodipodi:role="line"
+             x="70.573318"
+             y="167.84085"
+             id="tspan3997-6-2-6-9">vmodmap</tspan></text>
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0"
+           d="m 30.147601,48.070809 80.627309,0"
+           id="rect4214-8"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0"
+           d="m 30.147602,66.114999 80.627308,0"
+           id="rect4214-8-0"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0"
+           d="m 30.147602,84.15916 80.627308,0"
+           id="rect4214-8-2"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0"
+           d="m 30.147603,102.20332 80.627307,0"
+           id="rect4214-8-4"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0"
+           d="m 30.147603,120.2475 80.627307,0"
+           id="rect4214-8-9"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0"
+           d="m 30.147603,138.29169 80.627307,0"
+           id="rect4214-8-01"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0"
+           d="m 30.147602,156.33585 80.627308,0"
+           id="rect4214-8-20"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+      </g>
+      <path
+         inkscape:connector-curvature="0"
+         id="path4400"
+         d="m 110.77491,72.915129 242.58302,0"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4400-3"
+         d="m 111.76312,93.264848 74.19101,0"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+      <path
+         sodipodi:nodetypes="cccc"
+         inkscape:connector-curvature="0"
+         id="path4870"
+         d="m 110.0738,110.77491 54.33579,0 -0.35055,58.19188 22.43542,0"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-0)" />
+      <path
+         sodipodi:nodetypes="cccc"
+         inkscape:connector-curvature="0"
+         id="path4870-8"
+         d="m 111.41256,128.80552 42.50018,0 -0.27419,125.86808 33.54846,0"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-0)" />
+      <path
+         sodipodi:nodetypes="cccc"
+         inkscape:connector-curvature="0"
+         id="path4870-8-7"
+         d="m 111.73566,163.67589 29.27471,0 -0.18887,168.70974 45.10864,0"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-0)" />
+      <path
+         sodipodi:nodetypes="cccc"
+         inkscape:connector-curvature="0"
+         id="path4870-8-5"
+         d="m 283.50688,164.44217 35.10948,0 -0.22651,-102.576846 35.71444,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 1;stroke-dashoffset:0;marker-end:url(#Arrow2Lend-0)" />
+      <path
+         sodipodi:nodetypes="cccc"
+         inkscape:connector-curvature="0"
+         id="path5128"
+         d="m 91.143911,271.32841 35.055349,10e-6 0,49.07748 58.89299,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 1;stroke-dashoffset:0;marker-end:url(#Arrow2Lend-0-31)" />
+      <path
+         sodipodi:nodetypes="ccc"
+         inkscape:connector-curvature="0"
+         id="path5128-1"
+         d="m 126.31108,271.35131 0.17527,-189.514763 58.89299,0.04059"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 1;stroke-dashoffset:0;marker-end:url(#Arrow2Lend-0-31)" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4400-3-1"
+         d="m 126.54953,157.7667 60.31481,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3.00000003, 1.00000001;stroke-dashoffset:0;marker-end:url(#Arrow2Lend)" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path4400-3-1-9"
+         d="m 127.85888,244.00286 57.55016,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 1;stroke-dashoffset:0;marker-end:url(#Arrow2Lend)" />
+    </g>
+  </g>
+</svg>
diff --git a/specs/XKB/XKBlib-17.svg b/specs/XKB/XKBlib-17.svg
new file mode 100644 (file)
index 0000000..20dfef2
--- /dev/null
@@ -0,0 +1,626 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="470"
+   height="370"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="XKBlib-17.svg"
+   inkscape:export-filename="/home/fcarrijo/Desktop/XKBlib-17.png"
+   inkscape:export-xdpi="156.71965"
+   inkscape:export-ydpi="156.71965">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend"
+       style="overflow:visible">
+      <path
+         id="path4534"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-8"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4534-0"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-8-7"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4534-0-9"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.2977842"
+     inkscape:cx="286.92862"
+     inkscape:cy="201.7286"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer2"
+     showgrid="false"
+     inkscape:window-width="1016"
+     inkscape:window-height="718"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Vetorial"
+     style="display:inline">
+    <text
+       xml:space="preserve"
+       style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="59.887028"
+       y="98.028496"
+       id="text3051-7-2-3"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3053-0-5-7"
+         x="59.887028"
+         y="98.028496">Define real</tspan><tspan
+         sodipodi:role="line"
+         x="59.887028"
+         y="109.2785"
+         id="tspan3367">modifiers bound</tspan><tspan
+         sodipodi:role="line"
+         x="59.887028"
+         y="120.5285"
+         id="tspan3369">to virtual</tspan><tspan
+         sodipodi:role="line"
+         x="59.887028"
+         y="131.7785"
+         id="tspan3371">modifier</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="300.95572"
+       y="150.90459"
+       id="text3051-7-2-3-6"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         x="300.95572"
+         y="150.90459"
+         id="tspan3371-6">Define virtual modifiers</tspan><tspan
+         sodipodi:role="line"
+         x="300.95572"
+         y="162.15459"
+         id="tspan3410">for each key</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="239.39282"
+       y="24.846851"
+       id="text3051-7-2-3-6-4"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         x="239.39282"
+         y="24.846851"
+         id="tspan3410-3">KeyCode</tspan></text>
+    <g
+       id="g5711">
+      <g
+         id="g4366">
+        <rect
+           style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           id="rect3438"
+           width="81.918816"
+           height="92.158669"
+           x="11.455757"
+           y="156.32841" />
+        <text
+           xml:space="preserve"
+           style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+           x="52.564579"
+           y="261.45755"
+           id="text3051"
+           sodipodi:linespacing="125%"><tspan
+             sodipodi:role="line"
+             id="tspan3053"
+             x="52.564579"
+             y="261.45755">XkbDescRec</tspan></text>
+        <text
+           xml:space="preserve"
+           style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+           x="52.421757"
+           y="168.49168"
+           id="text3051-7-5-3-42-9-6"
+           sodipodi:linespacing="125%"><tspan
+             sodipodi:role="line"
+             id="tspan3053-0-1-00-4-9-3"
+             x="52.421757"
+             y="168.49168">. . .</tspan></text>
+        <text
+           xml:space="preserve"
+           style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+           x="52.421757"
+           y="204.33118"
+           id="text3051-7-5-3-42-9-93"
+           sodipodi:linespacing="125%"><tspan
+             sodipodi:role="line"
+             id="tspan3053-0-1-00-4-9-34"
+             x="52.421757"
+             y="204.33118">. . .</tspan></text>
+        <text
+           xml:space="preserve"
+           style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+           x="52.421757"
+           y="240.17065"
+           id="text3051-7-5-3-42-9-61"
+           sodipodi:linespacing="125%"><tspan
+             sodipodi:role="line"
+             id="tspan3053-0-1-00-4-9-5"
+             x="52.421757"
+             y="240.17065">. . .</tspan></text>
+        <text
+           xml:space="preserve"
+           style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+           x="52.175663"
+           y="188.30986"
+           id="text3051-7-3"
+           sodipodi:linespacing="125%"><tspan
+             sodipodi:role="line"
+             id="tspan3053-0-7"
+             x="52.175663"
+             y="188.30986">server</tspan></text>
+        <text
+           xml:space="preserve"
+           style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+           x="52.228397"
+           y="224.14935"
+           id="text3051-7-2"
+           sodipodi:linespacing="125%"><tspan
+             sodipodi:role="line"
+             id="tspan3053-0-5"
+             x="52.228397"
+             y="224.14935">names</tspan></text>
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           d="m 11.455757,176.89345 81.918815,0"
+           id="rect3438-5"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           d="m 11.455757,194.81319 81.918815,0"
+           id="rect3438-5-8"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           d="m 11.455757,212.73293 81.918815,0"
+           id="rect3438-5-5"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+           d="m 11.455757,230.65268 81.918816,0"
+           id="rect3438-5-0"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+      </g>
+    </g>
+    <g
+       id="g5661">
+      <rect
+         y="210.94096"
+         x="380.73615"
+         height="129.7048"
+         width="82.601479"
+         id="rect4343"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-3-42-9-617"
+         y="221.73892"
+         x="422.04349"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="221.73892"
+           x="422.04349"
+           id="tspan3053-0-1-00-4-9-2"
+           sodipodi:role="line">. . .</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-3-42-9-2"
+         y="295.46585"
+         x="422.04349"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="295.46585"
+           x="422.04349"
+           id="tspan3053-0-1-00-4-9-9"
+           sodipodi:role="line">. . .</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-3-42-9-28"
+         y="332.32932"
+         x="422.04349"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="332.32932"
+           x="422.04349"
+           id="tspan3053-0-1-00-4-9-12"
+           sodipodi:role="line">. . .</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-4"
+         y="242.43823"
+         x="422.29178"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="242.43823"
+           x="422.29178"
+           id="tspan3053-0-1-7"
+           sodipodi:role="line">vmods[0]</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1-8"
+         y="260.86996"
+         x="422.29178"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="260.86996"
+           x="422.29178"
+           id="tspan3053-0-1-0-6"
+           sodipodi:role="line">vmods[1]</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-3-3"
+         y="279.3017"
+         x="422.29178"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="279.3017"
+           x="422.29178"
+           id="tspan3053-0-1-00-7"
+           sodipodi:role="line">vmods[2]</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-3-4-7"
+         y="316.16516"
+         x="422.29178"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="316.16516"
+           x="422.29178"
+           id="tspan3053-0-1-00-5-2"
+           sodipodi:role="line">vmods[15]</tspan></text>
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3438-5-2"
+         d="m 381.07749,230.39668 81.91881,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3438-5-00"
+         d="m 381.07749,248.82842 81.91881,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3438-5-6"
+         d="m 381.07749,267.26015 81.91881,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3438-5-3"
+         d="m 381.07749,285.69188 81.91882,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3438-5-908"
+         d="m 381.07749,304.12361 81.91881,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3438-5-38"
+         d="m 381.07749,322.55534 81.91882,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-7"
+         y="354.05115"
+         x="422.18631"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="354.05115"
+           x="422.18631"
+           id="tspan3053-0-3"
+           sodipodi:role="line">XkbNamesRec</tspan></text>
+    </g>
+    <g
+       id="g5686">
+      <rect
+         y="51.199261"
+         x="144.08856"
+         height="130.38745"
+         width="83.284134"
+         id="rect4385"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7"
+         y="195.18179"
+         x="185.88004"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="195.18179"
+           x="185.88004"
+           id="tspan3053-0"
+           sodipodi:role="line">XkbServerMapRec</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5"
+         y="82.785614"
+         x="185.9855"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="82.785614"
+           x="185.9855"
+           id="tspan3053-0-1"
+           sodipodi:role="line">vmods[0]</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-1"
+         y="101.25849"
+         x="185.9855"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="101.25849"
+           x="185.9855"
+           id="tspan3053-0-1-0"
+           sodipodi:role="line">vmods[1]</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-3"
+         y="119.73138"
+         x="185.9855"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="119.73138"
+           x="185.9855"
+           id="tspan3053-0-1-00"
+           sodipodi:role="line">vmods[2]</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-3-4"
+         y="156.67712"
+         x="185.9855"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="156.67712"
+           x="185.9855"
+           id="tspan3053-0-1-00-5"
+           sodipodi:role="line">vmods[15]</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-3-42"
+         y="174.80724"
+         x="185.84268"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="174.80724"
+           x="185.84268"
+           id="tspan3053-0-1-00-4"
+           sodipodi:role="line">vmodmap</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-3-42-9-9"
+         y="62.045181"
+         x="185.73721"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="62.045181"
+           x="185.73721"
+           id="tspan3053-0-1-00-4-9-4"
+           sodipodi:role="line">. . .</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-5-3-42-9-98"
+         y="135.93668"
+         x="185.73721"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="135.93668"
+           x="185.73721"
+           id="tspan3053-0-1-00-4-9-1"
+           sodipodi:role="line">. . .</tspan></text>
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3438-5-9"
+         d="m 144.77121,163.08788 81.91882,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3438-5-98"
+         d="m 144.77122,144.61501 81.91881,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3438-5-02"
+         d="m 144.77122,126.14213 81.91881,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3438-5-4"
+         d="m 144.77122,107.66925 81.91881,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3438-5-90"
+         d="m 144.77122,89.196369 81.91881,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3438-5-1"
+         d="m 144.77121,70.723491 81.91882,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    </g>
+    <g
+       id="g3091">
+      <rect
+         y="79.87085"
+         x="270.33209"
+         height="17.749077"
+         width="80.553505"
+         id="rect4437"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="83.739235"
+         x="266.00861"
+         height="17.749077"
+         width="80.553505"
+         id="rect4437-1"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="87.607635"
+         x="261.68512"
+         height="17.749077"
+         width="80.553505"
+         id="rect4437-0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="91.476013"
+         x="257.36163"
+         height="17.749077"
+         width="80.553505"
+         id="rect4437-05"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3051-7-2-3-6-0"
+         y="120.4188"
+         x="298.78397"
+         style="font-size:9px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           id="tspan3410-1"
+           y="120.4188"
+           x="298.78397"
+           sodipodi:role="line">unsigned short</tspan><tspan
+           id="tspan4497"
+           y="131.66879"
+           x="298.78397"
+           sodipodi:role="line">(one per key)</tspan></text>
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 93.523985,184.26937 20.575645,0 0.68266,-122.734315 27.89299,0"
+       id="path4508"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 228.27602,169.5608 10.4914,0 0.34699,-70.50743 18.14441,0"
+       id="path4508-1"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4, 2;stroke-dashoffset:0;marker-end:url(#Arrow2Lend-8)"
+       d="m 237.56458,31.402214 0.68265,55.97786 17.74908,0"
+       id="path4978"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4, 2;stroke-dashoffset:0;marker-end:url(#Arrow2Lend-8)"
+       d="m 352.17824,88.109945 9.21586,0 0.34133,167.983395 17.74908,0"
+       id="path4978-1"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-8-7)"
+       d="m 93.523985,220.49816 285.350555,0"
+       id="path5188"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:4, 2;stroke-dashoffset:0;marker-end:url(#Arrow2Lend-8-7)"
+       d="m 361.80812,204.11439 -238.2952,0.68266 0.68265,-106.494467 19.16236,0"
+       id="path5376"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <g
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       id="text5564" />
+    <g
+       id="g5610">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5571"
+         d="m 104.794,161.57984 0,-90.563275"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5571-0"
+         d="m 101.28881,70.717253 7.01038,0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5571-0-3"
+         d="m 101.28881,161.87945 7.01038,0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+    </g>
+  </g>
+</svg>
diff --git a/specs/XKB/XKBlib-18.svg b/specs/XKB/XKBlib-18.svg
new file mode 100644 (file)
index 0000000..7da870b
--- /dev/null
@@ -0,0 +1,907 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="660"
+   height="420"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="XKBlib-18.svg"
+   style="display:inline"
+   inkscape:export-filename="/home/fcarrijo/Desktop/XKBlib-18.png"
+   inkscape:export-xdpi="156.71965"
+   inkscape:export-ydpi="156.71965">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend"
+       style="overflow:visible">
+      <path
+         id="path4554"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-9"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4554-0"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-3"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4554-8"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-31"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4554-00"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-0"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4554-3"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-0-8"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4554-3-0"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-0-7"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4554-3-9"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-0-0"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4554-3-3"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-0-9"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4554-3-4"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-4"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4554-6"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-0-2"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4554-3-90"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-0-03"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4554-3-37"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-0-4"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4554-3-99"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-0-94"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4554-3-2"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-0-6"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4554-3-5"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-0-5"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4554-3-6"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-0-1"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4554-3-43"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.6452381"
+     inkscape:cx="328.96405"
+     inkscape:cy="167.7834"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer2"
+     showgrid="false"
+     inkscape:window-width="1016"
+     inkscape:window-height="718"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Vetorial"
+     style="display:inline">
+    <g
+       id="g5558">
+      <rect
+         y="315.38745"
+         x="254.94466"
+         height="74.391144"
+         width="148.00739"
+         id="rect3680"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-7"
+         y="333.39355"
+         x="329.09778"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="333.39355"
+           x="329.09778"
+           id="tspan3074-0"
+           sodipodi:role="line">Xkb-capable</tspan><tspan
+           y="348.39355"
+           x="329.09778"
+           id="tspan3076-5"
+           sodipodi:role="line">Client</tspan><tspan
+           y="363.39355"
+           x="329.09778"
+           id="tspan3078-1"
+           sodipodi:role="line">Xkb-aware Xlib</tspan><tspan
+           y="378.39355"
+           x="329.09778"
+           id="tspan3080-1"
+           sodipodi:role="line">Xkb-unaware App</tspan></text>
+    </g>
+    <rect
+       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3499"
+       width="27.896679"
+       height="26.346863"
+       x="286.71588"
+       y="239.44649" />
+    <g
+       id="g5566">
+      <rect
+         y="313.83765"
+         x="22.472324"
+         height="74.391144"
+         width="149.55719"
+         id="rect3678"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070"
+         y="331.84375"
+         x="97.40033"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="331.84375"
+           x="97.40033"
+           id="tspan3074"
+           sodipodi:role="line">Xkb-unaware</tspan><tspan
+           y="346.84375"
+           x="97.40033"
+           id="tspan3076"
+           sodipodi:role="line">Client</tspan><tspan
+           y="361.84375"
+           x="97.40033"
+           id="tspan3078"
+           sodipodi:role="line">Core kb Xlib</tspan><tspan
+           y="376.84375"
+           x="97.40033"
+           id="tspan3080"
+           sodipodi:role="line">Xkb-unaware App</tspan></text>
+    </g>
+    <g
+       id="g5550">
+      <rect
+         y="316.16235"
+         x="488.57935"
+         height="74.391144"
+         width="148.00739"
+         id="rect3680-1"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-7-0"
+         y="334.16846"
+         x="562.73242"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="334.16846"
+           x="562.73242"
+           id="tspan3074-0-3"
+           sodipodi:role="line">Xkb-aware</tspan><tspan
+           y="349.16846"
+           x="562.73242"
+           id="tspan3076-5-0"
+           sodipodi:role="line">Client</tspan><tspan
+           y="364.16846"
+           x="562.73242"
+           id="tspan3078-1-0"
+           sodipodi:role="line">Xkb-aware Xlib</tspan><tspan
+           y="379.16846"
+           x="562.73242"
+           id="tspan3080-1-4"
+           sodipodi:role="line">Xkb-aware App</tspan></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="278.96094"
+       y="279.99509"
+       id="text3070-5-9"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3080-9-9"
+         x="278.96094"
+         y="279.99509">state</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="572.65094"
+       y="264.49692"
+       id="text3070-5-9-4-8"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3080-9-9-9-1"
+         x="572.65094"
+         y="264.49692">config</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="266.56824"
+       y="193.41203"
+       id="text3070-5-9-4-8-9-4-1-6-2"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3080-9-9-9-1-33-6-5-1-2"
+         x="266.56824"
+         y="193.41203">kb</tspan><tspan
+         sodipodi:role="line"
+         x="266.56824"
+         y="208.41203"
+         id="tspan3316-7-9">mapping</tspan></text>
+    <g
+       id="g5644">
+      <rect
+         y="32.546127"
+         x="206.12546"
+         height="79.040588"
+         width="245.64575"
+         id="rect3575"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-2"
+         y="52.876968"
+         x="328.93661"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="52.876968"
+           x="328.93661"
+           id="tspan3074-8"
+           sodipodi:role="line">Xkb-aware</tspan><tspan
+           y="67.876968"
+           x="328.93661"
+           id="tspan3080-4"
+           sodipodi:role="line">Server</tspan><tspan
+           id="tspan3403"
+           y="82.876968"
+           x="328.93661"
+           sodipodi:role="line">Maintains Xkb State and Mapping,</tspan><tspan
+           id="tspan3407"
+           y="97.876968"
+           x="328.93661"
+           sodipodi:role="line">core kb mapping, but not core kb state</tspan></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="300.81363"
+       y="257.09357"
+       id="text3070-5-7-6"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3080-9-8-3"
+         x="300.81363"
+         y="257.09357">Xkb</tspan></text>
+    <g
+       id="g5594">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path5070-5-3-9"
+         d="m 417.4437,206.30568 30.99631,30.2214"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-0)" />
+      <rect
+         y="184.42804"
+         x="395.20297"
+         height="26.346863"
+         width="27.896679"
+         id="rect3499-8"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-5-9-4-8-9-4-1-6"
+         y="223.63342"
+         x="408.3764"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="223.63342"
+           x="408.3764"
+           id="tspan3080-9-9-9-1-33-6-5-1"
+           sodipodi:role="line">kb</tspan><tspan
+           id="tspan3316-7"
+           y="238.63342"
+           x="408.3764"
+           sodipodi:role="line">mapping</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-5-7-6-7"
+         y="202.0751"
+         x="409.30072"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="202.0751"
+           x="409.30072"
+           id="tspan3080-9-8-3-7"
+           sodipodi:role="line">Xkb</tspan></text>
+    </g>
+    <g
+       id="g5586">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path5070-5-3"
+         d="m 479.44862,277.58458 30.99631,30.2214"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-0)" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-5-9-4"
+         y="300.1427"
+         x="467.26352"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="300.1427"
+           x="467.26352"
+           id="tspan3080-9-9-9"
+           sodipodi:role="line">state</tspan></text>
+      <rect
+         y="254.16974"
+         x="454.87085"
+         height="26.346863"
+         width="27.896679"
+         id="rect3499-1-0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-5-7-6-72"
+         y="272.59171"
+         x="468.9686"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="272.59171"
+           x="468.9686"
+           id="tspan3080-9-8-3-5"
+           sodipodi:role="line">Xkb</tspan></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="155.71251"
+       y="66.852989"
+       id="text3070-5-6-0"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3080-9-4-3"
+         x="155.71251"
+         y="66.852989">Keycode</tspan></text>
+    <path
+       sodipodi:type="arc"
+       style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.07095349;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="path3577-8"
+       sodipodi:cx="160.01845"
+       sodipodi:cy="217.74908"
+       sodipodi:rx="8.9114389"
+       sodipodi:ry="9.298893"
+       d="m 168.92989,217.74908 a 8.9114389,9.298893 0 1 1 -17.82288,0 8.9114389,9.298893 0 1 1 17.82288,0 z"
+       transform="matrix(0.95383025,0,0,0.91408731,112.38801,-30.111786)" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.07095349;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="path3577-0"
+       sodipodi:cx="160.01845"
+       sodipodi:cy="217.74908"
+       sodipodi:rx="8.9114389"
+       sodipodi:ry="9.298893"
+       d="m 168.92989,217.74908 a 8.9114389,9.298893 0 1 1 -17.82288,0 8.9114389,9.298893 0 1 1 17.82288,0 z"
+       transform="matrix(0.95383025,0,0,0.91408731,416.15185,86.899284)" />
+    <g
+       id="g5616"
+       transform="translate(14,-32)">
+      <rect
+         y="117.01107"
+         x="496.71588"
+         height="26.346863"
+         width="27.896679"
+         id="rect3499-3"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-5-7-6-3"
+         y="134.65814"
+         x="510.81363"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="134.65814"
+           x="510.81363"
+           id="tspan3080-9-8-3-76"
+           sodipodi:role="line">Xkb</tspan></text>
+      <path
+         transform="matrix(0.95383025,0,0,0.91408731,363.48212,-101.4033)"
+         d="m 168.92989,217.74908 a 8.9114389,9.298893 0 1 1 -17.82288,0 8.9114389,9.298893 0 1 1 17.82288,0 z"
+         sodipodi:ry="9.298893"
+         sodipodi:rx="8.9114389"
+         sodipodi:cy="217.74908"
+         sodipodi:cx="160.01845"
+         id="path3577-98"
+         style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.07095349;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         sodipodi:type="arc" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-5-9-0"
+         y="100.94892"
+         x="572.651"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="100.94892"
+           x="572.651"
+           id="tspan3080-9-9-0"
+           sodipodi:role="line">Core protocol</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-5-9-0-6"
+         y="133.49506"
+         x="571.32965"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="133.49506"
+           x="571.32965"
+           id="tspan3080-9-9-0-3"
+           sodipodi:role="line">Xkb protocol</tspan></text>
+    </g>
+    <g
+       id="g5638">
+      <rect
+         y="68.191879"
+         x="39.132847"
+         height="20.922508"
+         width="80.590401"
+         id="rect3678-2"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-5-6"
+         y="81.963684"
+         x="79.384102"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="81.963684"
+           x="79.384102"
+           id="tspan3080-9-4"
+           sodipodi:role="line">Keyboard</tspan></text>
+      <path
+         inkscape:connector-curvature="0"
+         id="path3760"
+         d="m 120.1107,76.715867 84.46495,0"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 322.34401,110.78525 0,202.6734"
+       id="path3760-8"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 333.96762,316.01593 0,-201.90494"
+       id="path3760-8-7"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 301.4215,266.71471 0,30.84761"
+       id="path3760-8-5"
+       inkscape:connector-curvature="0" />
+    <g
+       id="g5610">
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-5-9-4-8-6"
+         y="270.65372"
+         x="375.2692"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="270.65372"
+           x="375.2692"
+           id="tspan3080-9-9-9-1-3"
+           sodipodi:role="line">config</tspan></text>
+      <path
+         transform="matrix(0.95383025,0,0,0.91408731,195.30314,86.899285)"
+         d="m 168.92989,217.74908 a 8.9114389,9.298893 0 1 1 -17.82288,0 8.9114389,9.298893 0 1 1 17.82288,0 z"
+         sodipodi:ry="9.298893"
+         sodipodi:rx="8.9114389"
+         sodipodi:cy="217.74908"
+         sodipodi:cx="160.01845"
+         id="path3577-2"
+         style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.07095349;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         sodipodi:type="arc" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3760-8-5-1"
+         d="m 348.69087,279.30644 0,-37.10951"
+         style="fill:none;stroke:#000000;stroke-width:0.99999988px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+    </g>
+    <g
+       id="g5580">
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-5-9-4-8-9"
+         y="200.13712"
+         x="156.74524"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="200.13712"
+           x="156.74524"
+           id="tspan3080-9-9-9-1-33"
+           sodipodi:role="line">config</tspan></text>
+      <path
+         transform="matrix(0.95383025,0,0,0.91408731,9.3012966,19.506304)"
+         d="m 168.92989,217.74908 a 8.9114389,9.298893 0 1 1 -17.82288,0 8.9114389,9.298893 0 1 1 17.82288,0 z"
+         sodipodi:ry="9.298893"
+         sodipodi:rx="8.9114389"
+         sodipodi:cy="217.74908"
+         sodipodi:cx="160.01845"
+         id="path3577"
+         style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.07095349;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path5070"
+         d="m 168.15498,212.32472 30.99631,-30.2214"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-0)" />
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-0)"
+       d="M 88.120201,312.89513 288.0464,112.19402"
+       id="path5070-1"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-0)"
+       d="M 302.81384,112.15982 102.88764,312.86093"
+       id="path5070-1-1"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <g
+       id="g5574">
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-5"
+         y="280.69983"
+         x="186.90219"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="280.69983"
+           x="186.90219"
+           id="tspan3080-9"
+           sodipodi:role="line">state</tspan></text>
+      <path
+         transform="matrix(0.95383025,0,0,0.91408731,34.897239,54.353159)"
+         d="m 168.92989,217.74908 a 8.9114389,9.298893 0 1 1 -17.82288,0 8.9114389,9.298893 0 1 1 17.82288,0 z"
+         sodipodi:ry="9.298893"
+         sodipodi:rx="8.9114389"
+         sodipodi:cy="217.74908"
+         sodipodi:cx="160.01845"
+         id="path3577-5"
+         style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.07095349;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path5070-5"
+         d="m 180.77278,259.01201 -30.99631,30.2214"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-0)" />
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-0)"
+       d="m 259.03847,175.29676 -30.99631,30.2214"
+       id="path5070-5-8"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <g
+       id="g5634">
+      <path
+         transform="matrix(0.95383025,0,0,0.91408731,150.35849,-28.56197)"
+         d="m 168.92989,217.74908 a 8.9114389,9.298893 0 1 1 -17.82288,0 8.9114389,9.298893 0 1 1 17.82288,0 z"
+         sodipodi:ry="9.298893"
+         sodipodi:rx="8.9114389"
+         sodipodi:cy="217.74908"
+         sodipodi:cx="160.01845"
+         id="path3577-50"
+         style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.07095349;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         sodipodi:type="arc" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3760-8-5-9"
+         d="m 302.97132,175.5644 0,30.84761"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)" />
+    </g>
+    <g
+       id="g5603">
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-5-9-4-8-9-4-1"
+         y="167.59099"
+         x="363.64563"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="167.59099"
+           x="363.64563"
+           id="tspan3080-9-9-9-1-33-6-5"
+           sodipodi:role="line">kb</tspan><tspan
+           id="tspan3316"
+           y="182.59099"
+           x="363.64563"
+           sodipodi:role="line">mapping</tspan></text>
+      <path
+         transform="matrix(0.95383025,0,0,0.91408731,210.8013,-58.008465)"
+         d="m 168.92989,217.74908 a 8.9114389,9.298893 0 1 1 -17.82288,0 8.9114389,9.298893 0 1 1 17.82288,0 z"
+         sodipodi:ry="9.298893"
+         sodipodi:rx="8.9114389"
+         sodipodi:cy="217.74908"
+         sodipodi:cx="160.01845"
+         id="path3577-9"
+         style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.07095349;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path5070-5-3-9-1"
+         d="m 361.65034,139.66361 30.99631,30.2214"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-0)" />
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-0)"
+       d="m 354.69537,113.29733 199.9262,200.70112"
+       id="path5070-1-1-0"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-0)"
+       d="M 568.21975,314.45174 368.29356,113.75063"
+       id="path5070-1-9"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <g
+       id="g5626">
+      <rect
+         y="188.30258"
+         x="488.19189"
+         height="26.346863"
+         width="27.896679"
+         id="rect3499-1"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-5-9-4-8-9-4"
+         y="169.91573"
+         x="497.70465"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="169.91573"
+           x="497.70465"
+           id="tspan3080-9-9-9-1-33-6"
+           sodipodi:role="line">config</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-5-7-6-2"
+         y="205.94965"
+         x="502.28964"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="205.94965"
+           x="502.28964"
+           id="tspan3080-9-8-3-3"
+           sodipodi:role="line">Xkb</tspan></text>
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path5070-5-3-9-1-1"
+         d="m 487.62396,188.12237 -30.99631,-30.2214"
+         style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-0)" />
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-0)"
+       d="m 565.13933,282.66111 -30.99631,-30.2214"
+       id="path5070-5-3-9-1-1-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+  </g>
+</svg>
diff --git a/specs/XKB/XKBlib-19.svg b/specs/XKB/XKBlib-19.svg
new file mode 100644 (file)
index 0000000..8db8f93
--- /dev/null
@@ -0,0 +1,582 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="680"
+   height="350"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="XKBlib-19.svg"
+   inkscape:export-filename="/home/fcarrijo/Desktop/XKBlib-19.png"
+   inkscape:export-xdpi="156.71965"
+   inkscape:export-ydpi="156.71965">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM"
+       style="overflow:visible">
+      <path
+         id="path4045"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend"
+       style="overflow:visible">
+      <path
+         id="path4001"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-9"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4001-3"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-4"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4001-6"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-5"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4001-61"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-0"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4001-2"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-90"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4001-1"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.86464091"
+     inkscape:cx="488.14518"
+     inkscape:cy="169.64249"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer2"
+     showgrid="false"
+     inkscape:window-width="1016"
+     inkscape:window-height="718"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Vetorial"
+     style="display:inline">
+    <rect
+       style="fill:#ffffff;stroke:#000000;stroke-width:0.99999994000000003;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3202"
+       width="640.38818"
+       height="199.79013"
+       x="22.119621"
+       y="18.919203" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="313.95593"
+       y="40.325287"
+       id="text3070"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3072"
+         x="313.95593"
+         y="40.325287">Xkb State</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="37.754189"
+       y="61.350868"
+       id="text3070-7"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3072-0"
+         x="37.754189"
+         y="61.350868">Base Modifiers and Group</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="31.390907"
+       y="76.329384"
+       id="text3070-7-5"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3072-0-1"
+         x="31.390907"
+         y="76.329384">Locked Modifiers and Group</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="28.379189"
+       y="91.307884"
+       id="text3070-7-1"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3072-0-0"
+         x="28.379189"
+         y="91.307884">Latched Modifiers and Group</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="38.618446"
+       y="107.4495"
+       id="text3070-7-3"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3072-0-00"
+         x="38.618446"
+         y="107.4495">Core Pointer Button State</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="45.005165"
+       y="130.56387"
+       id="text3070-7-4"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3072-0-5"
+         x="45.005165"
+         y="130.56387">ServerInternalModifiers</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="51.737587"
+       y="144.8963"
+       id="text3070-7-42"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3072-0-4"
+         x="51.737587"
+         y="144.8963">IgnoreLocksModifiers</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="63.711224"
+       y="160.3918"
+       id="text3070-7-9"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3072-0-9"
+         x="63.711224"
+         y="160.3918">IgnoreGroupLock</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999988;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0"
+       d="m 203.35783,129.51732 12.13011,0 0,27.82791 m 0,0 -12.13011,0"
+       id="rect3972-1"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0"
+       d="m 323.35791,79.764955 8.43652,0 0,45.827905 m 0,0 -128.43652,0"
+       id="rect3972-1-6"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0"
+       d="m 322.69115,75.207772 14.81148,0 0,67.947528 m 0,0 -134.14481,0"
+       id="rect3972-1-6-3"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 322.81789,70.311424 164.61179,0"
+       id="path3975-3"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#DotM);marker-end:url(#Arrow2Lend)"
+       d="m 331.79831,108.92523 30.13474,0"
+       id="path3975-1"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#DotM);marker-end:url(#Arrow2Lend)"
+       d="m 337.5929,126.72036 25.27356,0"
+       id="path3975-1-7"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999988;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0"
+       d="m 203.35783,56.023084 12.13011,0 0,37.103876 m 0,0 -12.13011,0"
+       id="rect3972"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 204.07135,73.147954 42.81218,0"
+       id="path3975"
+       inkscape:connector-curvature="0" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#000000;stroke:#000000;stroke-width:0.9747206;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="path4739-2"
+       sodipodi:cx="337.39114"
+       sodipodi:cy="127.91186"
+       sodipodi:rx="1.7169465"
+       sodipodi:ry="1.6946485"
+       d="m 339.10809,127.91186 a 1.7169465,1.6946485 0 1 1 -3.43389,0 1.7169465,1.6946485 0 1 1 3.43389,0 z"
+       transform="matrix(1.0192513,0,0,1.0326625,-128.39843,-58.763441)" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#000000;stroke:#000000;stroke-width:0.9747206;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="path4739-29"
+       sodipodi:cx="337.39114"
+       sodipodi:cy="127.91186"
+       sodipodi:rx="1.7169465"
+       sodipodi:ry="1.6946485"
+       d="m 339.10809,127.91186 a 1.7169465,1.6946485 0 1 1 -3.43389,0 1.7169465,1.6946485 0 1 1 3.43389,0 z"
+       transform="matrix(1.0192513,0,0,1.0326625,108.18711,-61.103875)" />
+    <g
+       id="g5352">
+      <rect
+         y="229.41238"
+         x="27.114376"
+         height="37.817417"
+         width="245.45645"
+         id="rect4921"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-7-94"
+         y="244.18338"
+         x="98.737946"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="244.18338"
+           x="98.737946"
+           id="tspan3072-0-98"
+           sodipodi:role="line">Compatibility Map</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-7-94-2"
+         y="259.61893"
+         x="73.434669"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="259.61893"
+           x="73.434669"
+           id="tspan3072-0-98-8"
+           sodipodi:role="line">Explicit Override Controls</tspan></text>
+    </g>
+    <g
+       id="g5359">
+      <rect
+         y="286.13849"
+         x="132.71773"
+         height="37.817417"
+         width="141.9937"
+         id="rect4921-3"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-7-94-1"
+         y="309.06448"
+         x="148.10753"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="309.06448"
+           x="148.10753"
+           id="tspan3072-0-98-2"
+           sodipodi:role="line">Xkb Keyboard Map</tspan></text>
+    </g>
+    <g
+       id="g5364">
+      <rect
+         y="285.42499"
+         x="399.93707"
+         height="37.817417"
+         width="122.72822"
+         id="rect4921-3-6"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-7-94-4"
+         y="309.06445"
+         x="402.39886"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="309.06445"
+           x="402.39886"
+           id="tspan3072-0-98-7"
+           sodipodi:role="line">Core Keyboard Map</tspan></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="518.42633"
+       y="73.964088"
+       id="text3070-7-94-8"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3072-0-98-6"
+         x="518.42633"
+         y="73.964088">Compatibility State</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="495.03571"
+       y="89.586823"
+       id="text3070-7-94-3"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3072-0-98-77"
+         x="495.03571"
+         y="89.586823">Compatibility Lookup State</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="501.90289"
+       y="105.20957"
+       id="text3070-7-94-23"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3072-0-98-72"
+         x="501.90289"
+         y="105.20957">Compatibility Grab State</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="367.08063"
+       y="113.30049"
+       id="text3070-7-94-5"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3072-0-98-3"
+         x="367.08063"
+         y="113.30049">LookupState</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="372.12604"
+       y="131.46417"
+       id="text3070-7-94-5-7"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3072-0-98-3-6"
+         x="372.12604"
+         y="131.46417">Grab State</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="282.40521"
+       y="64.864059"
+       id="text3070-7-94-5-7-8"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3072-0-98-3-6-1"
+         x="282.40521"
+         y="64.864059">Effective</tspan><tspan
+         sodipodi:role="line"
+         x="282.40521"
+         y="79.864059"
+         id="tspan4917">Modifiers</tspan><tspan
+         sodipodi:role="line"
+         x="282.40521"
+         y="94.864059"
+         id="tspan4919">and Group</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0"
+       d="m 451.66839,70.89192 0,161.50987 -178.95697,0"
+       id="rect4959"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0"
+       d="m 455.52257,121.447 0,114.08816 -183.23819,0"
+       id="rect4959-4"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccc" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#000000;stroke:#000000;stroke-width:0.9747206;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="path4739-0"
+       sodipodi:cx="337.39114"
+       sodipodi:cy="127.91186"
+       sodipodi:rx="1.7169465"
+       sodipodi:ry="1.6946485"
+       d="m 339.10809,127.91186 a 1.7169465,1.6946485 0 1 1 -3.43389,0 1.7169465,1.6946485 0 1 1 3.43389,0 z"
+       transform="matrix(1.0192513,0,0,1.0326625,111.68486,-9.8141784)" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0"
+       d="m 459.80379,109.27491 0,130.08816 -186.80588,0"
+       id="rect4959-4-3"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccc" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#000000;stroke:#000000;stroke-width:0.9747206;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="path4739-5"
+       sodipodi:cx="337.39114"
+       sodipodi:cy="127.91186"
+       sodipodi:rx="1.7169465"
+       sodipodi:ry="1.6946485"
+       d="m 339.10809,127.91186 a 1.7169465,1.6946485 0 1 1 -3.43389,0 1.7169465,1.6946485 0 1 1 3.43389,0 z"
+       transform="matrix(1.0192513,0,0,1.0326625,115.94629,-22.992956)" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-5)"
+       d="m 447.3872,122.38195 18.55194,0 -0.35677,-21.40608 21.04932,0"
+       id="path5034"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-5)"
+       d="m 447.32214,109.18152 12.55194,0 -0.35677,-23.406071 27.04932,0"
+       id="path5034-8"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#000000;stroke:#000000;stroke-width:0.9747206;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="path4739-50"
+       sodipodi:cx="337.39114"
+       sodipodi:cy="127.91186"
+       sodipodi:rx="1.7169465"
+       sodipodi:ry="1.6946485"
+       d="m 339.10809,127.91186 a 1.7169465,1.6946485 0 1 1 -3.43389,0 1.7169465,1.6946485 0 1 1 3.43389,0 z"
+       transform="matrix(1.0192513,0,0,1.0326625,-25.292448,174.91967)" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#000000;stroke:#000000;stroke-width:0.9747206;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="path4739-9"
+       sodipodi:cx="337.39114"
+       sodipodi:cy="127.91186"
+       sodipodi:rx="1.7169465"
+       sodipodi:ry="1.6946485"
+       d="m 339.10809,127.91186 a 1.7169465,1.6946485 0 1 1 -3.43389,0 1.7169465,1.6946485 0 1 1 3.43389,0 z"
+       transform="matrix(1.0192513,0,0,1.0326625,3.7841522,167.96268)" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#000000;stroke:#000000;stroke-width:0.9747206;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="path4739-98"
+       sodipodi:cx="337.39114"
+       sodipodi:cy="127.91186"
+       sodipodi:rx="1.7169465"
+       sodipodi:ry="1.6946485"
+       d="m 339.10809,127.91186 a 1.7169465,1.6946485 0 1 1 -3.43389,0 1.7169465,1.6946485 0 1 1 3.43389,0 z"
+       transform="matrix(1.0192513,0,0,1.0326625,-25.292448,127.29113)" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 275.36774,300.07008 123.31192,0"
+       id="path3975-4"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 398.74561,306.4919 -121.91192,0"
+       id="path3975-2"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 272.9276,259.3809 45.66631,0"
+       id="path5314"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0"
+       d="m 347.84172,298.27848 0,-55.27363 -74.6607,0"
+       id="rect4959-4-3-0"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999988;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0"
+       d="m 318.66101,307.37642 0,-60.76724 -45.74696,0"
+       id="rect4959-4-3-0-0"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccc" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#000000;stroke:#000000;stroke-width:0.9747206;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
+       id="path4739-2-6"
+       sodipodi:cx="337.39114"
+       sodipodi:cy="127.91186"
+       sodipodi:rx="1.7169465"
+       sodipodi:ry="1.6946485"
+       d="m 339.10809,127.91186 a 1.7169465,1.6946485 0 1 1 -3.43389,0 1.7169465,1.6946485 0 1 1 3.43389,0 z"
+       transform="matrix(1.0192513,0,0,1.0326625,-128.33445,11.032432)" />
+  </g>
+</svg>
diff --git a/specs/XKB/XKBlib-2.svg b/specs/XKB/XKBlib-2.svg
new file mode 100644 (file)
index 0000000..5adc805
--- /dev/null
@@ -0,0 +1,761 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="670"
+   height="520"
+   id="svg7561"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="XKBlib-2.svg"
+   inkscape:export-filename="/home/fcarrijo/Desktop/XKBlib-2.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs7563">
+    <marker
+       inkscape:stockid="DotL"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotL"
+       style="overflow:visible">
+      <path
+         id="path4613"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+         transform="matrix(0.8,0,0,0.8,5.92,0.8)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM"
+       style="overflow:visible">
+      <path
+         id="path4616"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend"
+       style="overflow:visible">
+      <path
+         id="path4572"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-8"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4572-2"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-6"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4572-4"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-3"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4616-6"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-0"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4616-4"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-0-5"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4616-4-1"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-6-2"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4572-4-9"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-0-0"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4616-4-9"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-6-23"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4572-4-1"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-0-7"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4616-4-4"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-6-1"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4572-4-6"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-8"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4616-5"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-01"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4616-2"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+    </marker>
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM-4"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4616-8"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.73702284"
+     inkscape:cx="197.10787"
+     inkscape:cy="273.02994"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer3"
+     showgrid="false"
+     inkscape:window-width="1016"
+     inkscape:window-height="718"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7566">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Vetorial">
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="335.14062"
+       y="33.25592"
+       id="text8147-3-1-6-7"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan8527"
+         x="335.14062"
+         y="33.25592">Xkb State</tspan></text>
+    <g
+       id="g3253">
+      <rect
+         y="35.498142"
+         x="9.1180973"
+         height="37.416973"
+         width="159.26201"
+         id="rect7637"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text8147"
+         y="58.680264"
+         x="88.456139"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="58.680264"
+           x="88.456139"
+           id="tspan8149"
+           sodipodi:role="line">Base Modifiers</tspan></text>
+    </g>
+    <g
+       id="g3258">
+      <rect
+         y="82.349304"
+         x="9.1180973"
+         height="37.416973"
+         width="159.26201"
+         id="rect7637-7"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text8147-3"
+         y="104.26287"
+         x="88.488365"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="104.26287"
+           x="88.488365"
+           id="tspan8172"
+           sodipodi:role="line">Base Group</tspan></text>
+    </g>
+    <g
+       id="g3263">
+      <rect
+         y="129.20047"
+         x="9.1180973"
+         height="37.416973"
+         width="159.26201"
+         id="rect7637-9"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text8147-3-1"
+         y="152.38258"
+         x="88.456139"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="152.38258"
+           x="88.456139"
+           id="tspan8195"
+           sodipodi:role="line">Locked Modifiers</tspan></text>
+    </g>
+    <g
+       id="g3268">
+      <rect
+         y="176.05164"
+         x="9.1180973"
+         height="37.416973"
+         width="159.26201"
+         id="rect7637-5"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text8147-3-8"
+         y="198.07066"
+         x="88.488365"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="198.07066"
+           x="88.488365"
+           id="tspan8206"
+           sodipodi:role="line">Locked Group</tspan></text>
+    </g>
+    <g
+       id="g3273">
+      <rect
+         y="222.90282"
+         x="9.1180973"
+         height="37.416973"
+         width="159.26201"
+         id="rect7637-6"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text8147-3-8-0"
+         y="246.08493"
+         x="88.456139"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="246.08493"
+           x="88.456139"
+           id="tspan8229"
+           sodipodi:role="line">Latched Modifiers</tspan></text>
+    </g>
+    <g
+       id="g3278">
+      <rect
+         y="269.754"
+         x="9.1180973"
+         height="37.416973"
+         width="159.26201"
+         id="rect7637-8"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text8147-3-8-0-2"
+         y="291.77304"
+         x="88.488365"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="291.77304"
+           x="88.488365"
+           id="tspan8252"
+           sodipodi:role="line">Latched Group</tspan></text>
+    </g>
+    <g
+       id="g3283">
+      <rect
+         y="316.60516"
+         x="9.1180973"
+         height="37.416973"
+         width="159.26201"
+         id="rect7637-95"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text8147-3-8-0-2-9"
+         y="339.78729"
+         x="88.708092"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="339.78729"
+           x="88.708092"
+           id="tspan8275"
+           sodipodi:role="line">Core Pointer Buttons</tspan></text>
+    </g>
+    <g
+       id="g3288">
+      <rect
+         y="363.45633"
+         x="9.1180973"
+         height="37.416973"
+         width="159.26201"
+         id="rect7637-52"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text8147-3-8-0-2-9-9"
+         y="386.63846"
+         x="88.649498"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="386.63846"
+           x="88.649498"
+           id="tspan8298"
+           sodipodi:role="line">Server Internal Modifiers</tspan></text>
+    </g>
+    <g
+       id="g3293">
+      <rect
+         y="410.3075"
+         x="9.1180973"
+         height="37.416973"
+         width="159.26201"
+         id="rect7637-1"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text8147-3-8-0-2-9-9-3"
+         y="432.32654"
+         x="88.456139"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="432.32654"
+           x="88.456139"
+           id="tspan8321"
+           sodipodi:role="line">IgnoreLock Modifiers</tspan></text>
+    </g>
+    <g
+       id="g3298">
+      <rect
+         y="457.15866"
+         x="9.1180973"
+         height="37.416973"
+         width="159.26201"
+         id="rect7637-59"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text8147-3-8-0-2-9-9-3-8"
+         y="479.1777"
+         x="88.183678"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="479.1777"
+           x="88.183678"
+           id="tspan8344"
+           sodipodi:role="line">IgnoreGroupLock</tspan></text>
+    </g>
+    <g
+       id="g3303">
+      <rect
+         y="450.44281"
+         x="198.12178"
+         height="37.416973"
+         width="244.64946"
+         id="rect7637-91"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text8147-3-7-0-3"
+         y="472.46185"
+         x="320.43774"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="472.46185"
+           x="320.43774"
+           id="tspan8504"
+           sodipodi:role="line">Compatibility Map</tspan></text>
+    </g>
+    <g
+       id="g3318">
+      <rect
+         y="168.37637"
+         x="212.03322"
+         height="37.416973"
+         width="116.08858"
+         id="rect7637-62"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text8147-3-7"
+         y="190.3954"
+         x="269.81677"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="190.3954"
+           x="269.81677"
+           id="tspan8390"
+           sodipodi:role="line">Effective Group</tspan></text>
+    </g>
+    <g
+       id="g3323">
+      <rect
+         y="122.32473"
+         x="211.07381"
+         height="37.416973"
+         width="118.00739"
+         id="rect7637-10"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text8147-3-1-6"
+         y="145.50685"
+         x="269.78455"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="145.50685"
+           x="269.78455"
+           id="tspan8367"
+           sodipodi:role="line">Effective Modifiers</tspan></text>
+    </g>
+    <g
+       id="g3338">
+      <rect
+         y="61.881924"
+         x="490.10699"
+         height="37.416973"
+         width="170.77492"
+         id="rect7637-53"
+         style="fill:#ffffff;stroke:#000000;stroke-width:0.99999994000000003;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text8147-3-7-7"
+         y="83.900955"
+         x="575.47687"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="83.900955"
+           x="575.47687"
+           id="tspan8431"
+           sodipodi:role="line">Compatibility State</tspan></text>
+    </g>
+    <g
+       id="g3333">
+      <rect
+         y="108.89301"
+         x="490.10699"
+         height="37.416973"
+         width="170.77492"
+         id="rect7637-53-2"
+         style="fill:#ffffff;stroke:#000000;stroke-width:0.99999994000000003;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text8147-3-7-1"
+         y="130.91203"
+         x="575.47687"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="130.91203"
+           x="575.47687"
+           id="tspan8433"
+           sodipodi:role="line">Compatibility Lookup State</tspan></text>
+    </g>
+    <g
+       id="g3328">
+      <rect
+         y="155.90405"
+         x="490.10699"
+         height="37.416973"
+         width="170.77492"
+         id="rect7637-53-1"
+         style="fill:#ffffff;stroke:#000000;stroke-width:0.99999994000000003;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text8147-3-7-0"
+         y="177.92308"
+         x="575.47687"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="177.92308"
+           x="575.47687"
+           id="tspan8435"
+           sodipodi:role="line">Compatibility Grab State</tspan></text>
+    </g>
+    <g
+       id="g3313">
+      <rect
+         y="244.16975"
+         x="356.03424"
+         height="37.416973"
+         width="87.306282"
+         id="rect7637-53-9"
+         style="fill:#ffffff;stroke:#000000;stroke-width:0.99999994000000003;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text8147-3-7-1-4"
+         y="266.18878"
+         x="399.41785"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="266.18878"
+           x="399.41785"
+           id="tspan8458"
+           sodipodi:role="line">Lookup State</tspan></text>
+    </g>
+    <g
+       id="g3308">
+      <rect
+         y="291.18082"
+         x="355.55453"
+         height="37.416973"
+         width="88.265694"
+         id="rect7637-53-7"
+         style="fill:#ffffff;stroke:#000000;stroke-width:0.99999994000000003;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text8147-3-7-1-4-3"
+         y="314.36295"
+         x="399.6698"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="314.36295"
+           x="399.6698"
+           id="tspan8481"
+           sodipodi:role="line">Grab State</tspan></text>
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 185.64946,427.89668 149.6679,-0.95941 0,-282.06642 -6.02113,0"
+       id="path8799"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 168.38009,381.84502 17.26937,0 0,94.02214 -18.22878,0"
+       id="path8801"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 442.77123,480.66421 28.96581,0 -1.15863,-305.09225 18.53812,0"
+       id="path8803"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 442.60077,472.07926 21.09747,0 -1.12543,-345.82442 27.04511,0"
+       id="path8803-0"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 442.60076,463.2001 12.40003,0 -0.99261,-378.9797 34.29711,0"
+       id="path8803-0-3"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#DotM)"
+       d="m 330.52031,133.35793 123.75066,0"
+       id="path9037"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#DotM)"
+       d="m 443.32127,265.75646 19.58768,0"
+       id="path9037-9"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#DotM)"
+       d="m 443.97231,310.84871 26.83692,0"
+       id="path9037-9-8"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#DotM-0);marker-end:url(#Arrow2Lend-6)"
+       d="m 335.46528,261.91882 19.26786,0"
+       id="path9659"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#DotM-0);marker-end:url(#Arrow2Lend-6)"
+       d="m 335.46656,309.90691 19.59605,0"
+       id="path9659-7"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 170.00386,100.73801 20.59313,0 0,188.04428 -21.7372,0"
+       id="path8801-3"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 170.5868,53.72694 9.22388,0 0,188.04428 -11.99149,0"
+       id="path8801-3-8"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#DotM-0);marker-end:url(#Arrow2Lend-6)"
+       d="m 180.03866,141.05082 30.28757,0"
+       id="path9659-8"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#DotM-0);marker-end:url(#Arrow2Lend-6)"
+       d="m 190.69638,187.10249 19.46647,0"
+       id="path9659-8-3"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#DotM)"
+       d="m 168.45721,198.59779 22.01747,0"
+       id="path9037-9-5"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#DotM)"
+       d="m 168.24737,152.54612 11.49327,0"
+       id="path9037-9-5-6"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#DotM)"
+       d="m 168.48723,427.89668 17.30607,0"
+       id="path9037-9-5-5"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/specs/XKB/XKBlib-20.svg b/specs/XKB/XKBlib-20.svg
new file mode 100644 (file)
index 0000000..40747dc
--- /dev/null
@@ -0,0 +1,379 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="560"
+   height="310"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="XKBlib-20.svg"
+   inkscape:export-filename="/home/fcarrijo/Desktop/XKBlib-20.png"
+   inkscape:export-xdpi="156.71965"
+   inkscape:export-ydpi="156.71965">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend"
+       style="overflow:visible">
+      <path
+         id="path4369"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-8"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4369-0"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.86479129"
+     inkscape:cx="287.7858"
+     inkscape:cy="104.53005"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer2"
+     showgrid="false"
+     inkscape:window-width="1016"
+     inkscape:window-height="718"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Vetorial"
+     style="display:inline">
+    <g
+       id="g4861">
+      <rect
+         y="25.453703"
+         x="27.800501"
+         height="125.91991"
+         width="112.83733"
+         id="rect3248"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070"
+         y="170.17986"
+         x="84.418381"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="170.17986"
+           x="84.418381"
+           id="tspan3072"
+           sodipodi:role="line">XkbDescRec</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-4-1-6"
+         y="56.627865"
+         x="84.034592"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="56.627865"
+           x="84.034592"
+           id="tspan3072-6-5-1"
+           sodipodi:role="line">compat</tspan></text>
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3248-2"
+         d="m 27.8005,40.171618 112.83734,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3248-2-3"
+         d="m 27.800501,67.154453 112.837329,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+    </g>
+    <g
+       id="g4829">
+      <rect
+         y="74.513405"
+         x="175.79729"
+         height="172.52664"
+         width="111.202"
+         id="rect4080"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-4"
+         y="263.77859"
+         x="231.5975"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="263.77859"
+           x="231.5975"
+           id="tspan3072-6"
+           sodipodi:role="line">XkbCompMapRec</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-4-1-6-7"
+         y="88.925514"
+         x="231.21957"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="88.925514"
+           x="231.21957"
+           id="tspan3072-6-5-1-2"
+           sodipodi:role="line">sym_interpret</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-4-1-6-7-2"
+         y="114.14958"
+         x="231.58578"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="114.14958"
+           x="231.58578"
+           id="tspan3072-6-5-1-2-9"
+           sodipodi:role="line">groups[0]</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-4-1-6-7-2-2"
+         y="139.20667"
+         x="231.58578"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="139.20667"
+           x="231.58578"
+           id="tspan3072-6-5-1-2-9-8"
+           sodipodi:role="line">groups[1]</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-4-1-6-7-2-1"
+         y="164.26375"
+         x="231.58578"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="164.26375"
+           x="231.58578"
+           id="tspan3072-6-5-1-2-9-2"
+           sodipodi:role="line">groups[2]</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-4-1-6-7-2-4"
+         y="189.32083"
+         x="231.58578"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="189.32083"
+           x="231.58578"
+           id="tspan3072-6-5-1-2-9-7"
+           sodipodi:role="line">groups[3]</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-4-1-6-7-2-8"
+         y="214.21092"
+         x="231.41293"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="214.21092"
+           x="231.41293"
+           id="tspan3072-6-5-1-2-9-6"
+           sodipodi:role="line">num_si</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-4-1-6-7-2-3"
+         y="239.26801"
+         x="231.63266"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="239.26801"
+           x="231.63266"
+           id="tspan3072-6-5-1-2-9-77"
+           sodipodi:role="line">size_si</tspan></text>
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4080-7"
+         d="m 175.79729,98.310491 111.202,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4080-7-2"
+         d="m 175.79729,123.36758 111.202,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4080-7-5"
+         d="m 175.79729,148.42466 111.202,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4080-7-3"
+         d="m 175.79729,173.48174 111.202,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4080-7-7"
+         d="m 175.79729,198.53883 111.202,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4080-7-6"
+         d="m 175.79729,223.59591 111.202,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+    </g>
+    <g
+       id="g4813">
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-4-1"
+         y="279.78644"
+         x="467.63354"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="279.78644"
+           x="467.63354"
+           id="tspan3072-6-5"
+           sodipodi:role="line">XkbSymInterpretRec(s)</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-4-1-6-7-2-8-8"
+         y="211.75349"
+         x="372.86844"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="211.75349"
+           x="372.86844"
+           id="tspan3072-6-5-1-2-9-6-1"
+           sodipodi:role="line">num_si - 1</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-4-1-6-7-2-3-3"
+         y="258.3602"
+         x="374.69656"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="258.3602"
+           x="374.69656"
+           id="tspan3072-6-5-1-2-9-77-6"
+           sodipodi:role="line">size_si - 1</tspan></text>
+      <rect
+         y="112.94351"
+         x="411.28387"
+         height="147.99678"
+         width="112.01966"
+         id="rect4237"
+         style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4237-4"
+         d="m 411.28387,137.06454 112.01967,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4237-4-0"
+         d="m 411.28387,162.10543 112.01967,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4237-4-3"
+         d="m 411.28387,187.14632 112.01967,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4237-4-5"
+         d="m 411.28387,212.18721 112.01967,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect4237-4-8"
+         d="m 411.28387,237.2281 112.01967,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-4-1-6-7-2-8-8-5"
+         y="137.34628"
+         x="399.84833"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="137.34628"
+           x="399.84833"
+           id="tspan3072-6-5-1-2-9-6-1-0"
+           sodipodi:role="line">0</tspan></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="338.51785"
+       y="122.21764"
+       id="text3070-4-1-6-7-2-8-8-5-9"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3072-6-5-1-2-9-6-1-0-9"
+         x="338.51785"
+         y="122.21764">Group</tspan><tspan
+         sodipodi:role="line"
+         x="338.51785"
+         y="137.21765"
+         id="tspan4339">compatibility</tspan><tspan
+         sodipodi:role="line"
+         x="338.51785"
+         y="152.21765"
+         id="tspan4341">maps</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 140.63783,49.165893 85.85448,0 0,23.712192"
+       id="path4343"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 287.89255,86.773157 173.41715,0 0,23.712193"
+       id="path4343-2"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/specs/XKB/XKBlib-21.svg b/specs/XKB/XKBlib-21.svg
new file mode 100644 (file)
index 0000000..e7a3196
--- /dev/null
@@ -0,0 +1,976 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="600"
+   height="650"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="XKBlib-21.svg"
+   inkscape:export-filename="/home/fcarrijo/Desktop/XKBlib-21.png"
+   inkscape:export-xdpi="156.71965"
+   inkscape:export-ydpi="156.71965">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="DotM"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="DotM"
+       style="overflow:visible">
+      <path
+         id="path4666"
+         d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+         transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lstart"
+       style="overflow:visible">
+      <path
+         id="path4619"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(1.1,0,0,1.1,1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend"
+       style="overflow:visible">
+      <path
+         id="path4622"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-9"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4622-4"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-0"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4622-6"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-95"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4622-61"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-4"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4622-3"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-2"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4622-7"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-3"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4622-9"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-44"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4622-49"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-38"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4622-32"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-5"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4622-43"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lstart-4"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4619-9"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(1.1,0,0,1.1,1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-55"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4622-73"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lstart-0"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4619-7"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(1.1,0,0,1.1,1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-27"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4622-2"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-05"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4622-0"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-1"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4622-79"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-1-6"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4622-79-2"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-1-6-2"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4622-79-2-5"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-1-6-9"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4622-79-2-1"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-1-6-8"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4622-79-2-7"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-1-6-5"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4622-79-2-2"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.58961827"
+     inkscape:cx="294.74298"
+     inkscape:cy="309.49556"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer2"
+     showgrid="false"
+     inkscape:window-width="1016"
+     inkscape:window-height="718"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Vetorial"
+     style="display:inline">
+    <g
+       id="g4480"
+       transform="translate(-2.1200027,0)">
+      <rect
+         y="13.571282"
+         x="220.05763"
+         height="79.712593"
+         width="146.70508"
+         id="rect3623-8"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070"
+         y="26.553555"
+         x="293.30469"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="26.553555"
+           x="293.30469"
+           id="tspan3072"
+           sodipodi:role="line">Augment names to</tspan><tspan
+           id="tspan3074"
+           y="41.553555"
+           x="293.30469"
+           sodipodi:role="line">supply component</tspan><tspan
+           id="tspan3076"
+           y="56.553555"
+           x="293.30469"
+           sodipodi:role="line">names required by</tspan><tspan
+           id="tspan3078"
+           y="71.553558"
+           x="293.30469"
+           sodipodi:role="line">want and need but not</tspan><tspan
+           id="tspan3080"
+           y="86.553558"
+           x="293.30469"
+           sodipodi:role="line">supplied in request</tspan></text>
+    </g>
+    <g
+       id="g4491"
+       transform="translate(7.6293945e-6,0)">
+      <rect
+         y="187.83658"
+         x="216.24161"
+         height="71.232536"
+         width="150.09711"
+         id="rect4489"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.99999988;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-4"
+         y="204.07883"
+         x="291.04114"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="204.07883"
+           x="291.04114"
+           id="tspan3072-6"
+           sodipodi:role="line">Augment names to</tspan><tspan
+           id="tspan3080-1"
+           y="219.07883"
+           x="291.04114"
+           sodipodi:role="line">supply required com-</tspan><tspan
+           id="tspan3128"
+           y="234.07883"
+           x="291.04114"
+           sodipodi:role="line">ponent names not sup-</tspan><tspan
+           id="tspan3126"
+           y="249.07883"
+           x="291.04114"
+           sodipodi:role="line">plied in request</tspan></text>
+    </g>
+    <g
+       id="g4501">
+      <rect
+         y="197.16464"
+         x="463.01144"
+         height="58.512432"
+         width="79.712593"
+         id="rect4499"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-4-7"
+         y="215.89449"
+         x="502.67731"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           id="tspan3126-2"
+           y="215.89449"
+           x="502.67731"
+           sodipodi:role="line">Keyboard</tspan><tspan
+           id="tspan3171"
+           y="230.89449"
+           x="502.67731"
+           sodipodi:role="line">Component</tspan><tspan
+           id="tspan3173"
+           y="245.89449"
+           x="502.67731"
+           sodipodi:role="line">Database</tspan></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="351.73218"
+       y="128.97385"
+       id="text3070-4-7-8"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         x="351.73218"
+         y="128.97385"
+         id="tspan3173-4">False</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="310.94876"
+       y="172.80606"
+       id="text3070-4-7-8-7"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         x="310.94876"
+         y="172.80606"
+         id="tspan3173-4-8">True</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="311.55521"
+       y="440.59149"
+       id="text3070-4-7-8-7-6"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         x="311.55521"
+         y="440.59149"
+         id="tspan3173-4-8-3">True</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="231.23619"
+       y="392.4397"
+       id="text3070-4-7-8-77"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         x="231.23619"
+         y="392.4397"
+         id="tspan3173-4-2">False</tspan></text>
+    <g
+       id="g4519"
+       transform="translate(0.84801102,0)">
+      <rect
+         y="290.44534"
+         x="229.80971"
+         height="67.8405"
+         width="121.2649"
+         id="rect4517"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-4-7-8-7-6-3"
+         y="306.33923"
+         x="290.62381"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           id="tspan3173-4-8-3-7"
+           y="306.33923"
+           x="290.62381"
+           sodipodi:role="line">Build keyboard</tspan><tspan
+           id="tspan3303"
+           y="321.33923"
+           x="290.62381"
+           sodipodi:role="line">description from</tspan><tspan
+           id="tspan3305"
+           y="336.33923"
+           x="290.62381"
+           sodipodi:role="line">expressions in</tspan><tspan
+           id="tspan3307"
+           y="351.33923"
+           x="290.62381"
+           sodipodi:role="line">names</tspan></text>
+    </g>
+    <g
+       id="g4510">
+      <rect
+         y="294.68536"
+         x="454.53137"
+         height="56.816422"
+         width="97.520721"
+         id="rect4508"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-4-7-8-7-6-3-2"
+         y="311.40411"
+         x="503.2478"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           id="tspan3307-6"
+           y="311.40411"
+           x="503.2478"
+           sodipodi:role="line">New Keyboard</tspan><tspan
+           id="tspan3348"
+           y="326.40411"
+           x="503.2478"
+           sodipodi:role="line">Description</tspan><tspan
+           id="tspan3350"
+           y="341.40411"
+           x="503.2478"
+           sodipodi:role="line">(Temporary)</tspan></text>
+    </g>
+    <g
+       id="g4586"
+       transform="translate(-1.1798446,0)">
+      <rect
+         transform="matrix(0.86355474,-0.5042551,0.86355474,0.5042551,0,0)"
+         y="286.01212"
+         x="12.546584"
+         height="40.122799"
+         width="40.122799"
+         id="rect4566"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.07155609;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-4-7-8-8"
+         y="142.37003"
+         x="292.44949"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           id="tspan3173-4-1"
+           y="142.37003"
+           x="292.44949"
+           sodipodi:role="line">load</tspan></text>
+    </g>
+    <g
+       id="g4591"
+       transform="translate(-1.2719908,0)">
+      <rect
+         transform="matrix(0.86355474,-0.5042551,0.86355474,0.5042551,0,0)"
+         y="551.6828"
+         x="-253.0174"
+         height="40.122799"
+         width="40.122799"
+         id="rect4566-1"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.07155609;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-4-7-8-8-3"
+         y="410.2478"
+         x="292.54166"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           id="tspan3173-4-1-6"
+           y="410.2478"
+           x="292.54166"
+           sodipodi:role="line">load</tspan></text>
+    </g>
+    <g
+       id="g4529">
+      <rect
+         y="456.65457"
+         x="437.57126"
+         height="42.400314"
+         width="136.52901"
+         id="rect4527"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-4-7-8-8-3-4"
+         y="473.49829"
+         x="505.76251"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           id="tspan3173-4-1-6-0"
+           y="473.49829"
+           x="505.76251"
+           sodipodi:role="line">Keyboard Description</tspan><tspan
+           id="tspan3415"
+           y="488.49829"
+           x="505.76251"
+           sodipodi:role="line">for device_spec</tspan></text>
+    </g>
+    <g
+       id="g4537">
+      <rect
+         y="555.02332"
+         x="468.09946"
+         height="71.232529"
+         width="79.712593"
+         id="rect4535"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-4-7-8-8-3-4-3"
+         y="572.61322"
+         x="507.87958"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           id="tspan3173-4-1-6-0-5"
+           y="572.61322"
+           x="507.87958"
+           sodipodi:role="line">Keyboard</tspan><tspan
+           id="tspan3441"
+           y="587.61322"
+           x="507.87958"
+           sodipodi:role="line">Description</tspan><tspan
+           id="tspan3415-8"
+           y="602.61322"
+           x="507.87958"
+           sodipodi:role="line">returned to</tspan><tspan
+           id="tspan3443"
+           y="617.61322"
+           x="507.87958"
+           sodipodi:role="line">Client</tspan></text>
+    </g>
+    <g
+       id="g4547"
+       transform="translate(0,6)">
+      <rect
+         y="546.54321"
+         x="217.08961"
+         height="80.5606"
+         width="148.40111"
+         id="rect4545"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-4-7-8-8-3-4-3-5"
+         y="561.29712"
+         x="291.27551"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           id="tspan3443-8"
+           y="561.29712"
+           x="291.27551"
+           sodipodi:role="line">Build keyboard</tspan><tspan
+           id="tspan3484"
+           y="576.29712"
+           x="291.27551"
+           sodipodi:role="line">description for client</tspan><tspan
+           id="tspan3486"
+           y="591.29712"
+           x="291.27551"
+           sodipodi:role="line">by extracting struc-</tspan><tspan
+           id="tspan3488"
+           y="606.29712"
+           x="291.27551"
+           sodipodi:role="line">tures specified in want</tspan><tspan
+           id="tspan3490"
+           y="621.29712"
+           x="291.27551"
+           sodipodi:role="line">and need</tspan></text>
+    </g>
+    <g
+       id="g4558"
+       transform="translate(0.84801483,0)">
+      <rect
+         y="453.26254"
+         x="215.3936"
+         height="69.536514"
+         width="150.09711"
+         id="rect4556"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-4-7-8-8-3-4-3-5-0"
+         y="468.84134"
+         x="290.28979"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           id="tspan3490-1"
+           y="468.84134"
+           x="290.28979"
+           sodipodi:role="line">Replace device_spec</tspan><tspan
+           id="tspan3539"
+           y="483.84134"
+           x="290.28979"
+           sodipodi:role="line">active keyboard</tspan><tspan
+           id="tspan3541"
+           y="498.84134"
+           x="290.28979"
+           sodipodi:role="line">description with newly</tspan><tspan
+           id="tspan3543"
+           y="513.84131"
+           x="290.28979"
+           sodipodi:role="line">built description</tspan></text>
+    </g>
+    <g
+       id="g5219">
+      <rect
+         y="173.42047"
+         x="22.048164"
+         height="97.520721"
+         width="97.520721"
+         id="rect3623"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-4-7-8-2"
+         y="188.07018"
+         x="70.925713"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           id="tspan3173-4-0"
+           y="188.07018"
+           x="70.925713"
+           sodipodi:role="line">Initial Request:</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-4-7-8-2-0"
+         y="203.38049"
+         x="70.8554"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           id="tspan3173-4-0-6"
+           y="203.38049"
+           x="70.8554"
+           sodipodi:role="line">device_spec</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-4-7-8-2-3"
+         y="218.98961"
+         x="70.559502"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           id="tspan3173-4-0-9"
+           y="218.98961"
+           x="70.559502"
+           sodipodi:role="line">names</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-4-7-8-2-08"
+         y="235.3194"
+         x="70.703056"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           id="tspan3173-4-0-3"
+           y="235.3194"
+           x="70.703056"
+           sodipodi:role="line">want</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-4-7-8-2-8"
+         y="251.14238"
+         x="70.808525"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           id="tspan3173-4-0-7"
+           y="251.14238"
+           x="70.808525"
+           sodipodi:role="line">need</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         id="text3070-4-7-8-2-31"
+         y="266.61966"
+         x="70.788017"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           id="tspan3173-4-0-0"
+           y="266.61966"
+           x="70.788017"
+           sodipodi:role="line">load</tspan></text>
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3623-0"
+         d="m 22.048165,192.49828 97.520725,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3623-0-5"
+         d="m 22.048163,207.97556 97.520727,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3623-0-5-0"
+         d="m 22.048163,223.45283 97.520727,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3623-0-5-3"
+         d="m 22.048165,238.9301 97.520725,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect3623-0-5-1"
+         d="m 22.048164,254.4074 97.520726,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 291.26298,93.8148 0,23.09757"
+       id="path4596"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 291.25314,158.03258 0,27.7286"
+       id="path4596-2"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 290.00054,259.8264 0,28.82818"
+       id="path4596-5"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 291.69655,357.34714 0,27.33761"
+       id="path4596-1"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 291.27254,426.03561 0,26.3722"
+       id="path4596-7"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 366.67199,321.83919 79.19142,0"
+       id="path4596-1-3"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 372.96935,478.72034 56.53217,0"
+       id="path4596-1-3-2"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 373.27487,571.15303 84.94818,0"
+       id="path4596-1-3-2-9"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 291.69655,523.61506 0,26.3722"
+       id="path4596-7-9"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow2Lstart);marker-end:url(#Arrow2Lend)"
+       d="m 121.18964,215.11041 90.94563,0"
+       id="path4596-1-3-9"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow2Lstart);marker-end:url(#Arrow2Lend)"
+       d="M 120.73642,210.73275 214.22607,97.947914"
+       id="path4596-1-3-9-9"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 119.41547,218.80642 106.32762,70.80852"
+       id="path4596-1-3-4"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker-end:url(#Arrow2Lend-1)"
+       d="m 255.4428,405.01124 -70.75645,0 0,126.89959 104.75645,0"
+       id="rect5774"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0;marker-end:url(#Arrow2Lend-1)"
+       d="m 327.42324,137.27454 70.75645,0 0,130.89959 -104.75645,0"
+       id="rect5774-1"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-1-6)"
+       d="M 459.69356,256.35107 356.79809,290.5477"
+       id="path6017"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-1-6)"
+       d="m 449.84239,354.00854 -76.838,95.35899"
+       id="path6017-3"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-1-6)"
+       d="M 456.8343,359.38127 370.07592,546.46615"
+       id="path6017-3-8"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-1-6);display:inline"
+       d="M 100.49427,230.62118 214.64454,548.15782"
+       id="path6017-3-0"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-1-6);display:inline"
+       d="M 95.536492,246.63398 209.68676,569.25866"
+       id="path6017-3-0-7"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+  </g>
+</svg>
diff --git a/specs/XKB/XKBlib-3.svg b/specs/XKB/XKBlib-3.svg
new file mode 100644 (file)
index 0000000..757c682
--- /dev/null
@@ -0,0 +1,1133 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="400"
+   height="40"
+   viewBox="0 0 320 32"
+   version="1.1"
+   id="svg2"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="XKBlib-3.svg">
+  <metadata
+     id="metadata380">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1016"
+     inkscape:window-height="718"
+     id="namedview378"
+     showgrid="false"
+     inkscape:zoom="1.7633957"
+     inkscape:cx="203.08637"
+     inkscape:cy="-25.169771"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg2" />
+  <defs
+     id="defs4">
+    <g
+       id="g6">
+      <symbol
+         overflow="visible"
+         id="glyph0-0"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 5.140625,-6.8125 c 0,0 0,-0.109375 -0.125,-0.109375 -0.15625,0 -1.09375,0.09375 -1.265625,0.109375 -0.078125,0.015625 -0.140625,0.0625 -0.140625,0.1875 0,0.125 0.09375,0.125 0.234375,0.125 0.484375,0 0.5,0.0625 0.5,0.171875 L 4.3125,-6.125 3.71875,-3.765625 C 3.53125,-4.140625 3.25,-4.40625 2.796875,-4.40625 c -1.15625,0 -2.390625,1.46875 -2.390625,2.921875 0,0.9375 0.546875,1.59375 1.3125,1.59375 0.203125,0 0.703125,-0.046875 1.296875,-0.75 0.078125,0.421875 0.4375,0.75 0.90625,0.75 0.359375,0 0.578125,-0.234375 0.75,-0.546875 0.15625,-0.359375 0.296875,-0.96875 0.296875,-0.984375 0,-0.109375 -0.09375,-0.109375 -0.125,-0.109375 -0.09375,0 -0.109375,0.046875 -0.140625,0.1875 -0.171875,0.640625 -0.34375,1.234375 -0.75,1.234375 -0.28125,0 -0.296875,-0.265625 -0.296875,-0.453125 0,-0.25 0.015625,-0.3125 0.046875,-0.484375 z m -2.0625,5.625 C 3.015625,-1 3.015625,-0.984375 2.875,-0.8125 2.4375,-0.265625 2.03125,-0.109375 1.75,-0.109375 c -0.5,0 -0.640625,-0.546875 -0.640625,-0.9375 0,-0.5 0.3125,-1.71875 0.546875,-2.1875 0.3125,-0.578125 0.75,-0.953125 1.15625,-0.953125 0.640625,0 0.78125,0.8125 0.78125,0.875 0,0.0625 -0.015625,0.125 -0.03125,0.171875 z m 0,0"
+           id="path9"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph0-1"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="M 3.890625,-3.734375 C 3.625,-3.71875 3.421875,-3.5 3.421875,-3.28125 c 0,0.140625 0.09375,0.296875 0.3125,0.296875 0.21875,0 0.453125,-0.171875 0.453125,-0.5625 C 4.1875,-4 3.765625,-4.40625 3,-4.40625 c -1.3125,0 -1.6875,1.015625 -1.6875,1.453125 0,0.78125 0.734375,0.921875 1.03125,0.984375 0.515625,0.109375 1.03125,0.21875 1.03125,0.765625 0,0.25 -0.21875,1.09375 -1.421875,1.09375 -0.140625,0 -0.90625,0 -1.140625,-0.53125 0.390625,0.046875 0.640625,-0.25 0.640625,-0.53125 0,-0.21875 -0.171875,-0.34375 -0.375,-0.34375 -0.265625,0 -0.5625,0.203125 -0.5625,0.65625 0,0.5625 0.578125,0.96875 1.421875,0.96875 1.625,0 2.015625,-1.203125 2.015625,-1.65625 0,-0.359375 -0.1875,-0.609375 -0.3125,-0.71875 -0.265625,-0.28125 -0.5625,-0.34375 -1,-0.421875 -0.359375,-0.078125 -0.75,-0.15625 -0.75,-0.609375 C 1.890625,-3.578125 2.125,-4.1875 3,-4.1875 c 0.25,0 0.75,0.078125 0.890625,0.453125 z m 0,0"
+           id="path12"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph0-2"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 2.046875,-3.984375 0.9375,0 c 0.203125,0 0.3125,0 0.3125,-0.203125 0,-0.109375 -0.109375,-0.109375 -0.28125,-0.109375 l -0.875,0 C 2.5,-5.71875 2.546875,-5.90625 2.546875,-5.96875 c 0,-0.171875 -0.125,-0.265625 -0.296875,-0.265625 -0.03125,0 -0.3125,0 -0.390625,0.359375 l -0.390625,1.578125 -0.9375,0 c -0.203125,0 -0.296875,0 -0.296875,0.1875 0,0.125 0.078125,0.125 0.28125,0.125 l 0.875,0 C 0.671875,-1.15625 0.625,-0.984375 0.625,-0.8125 0.625,-0.265625 1,0.109375 1.546875,0.109375 2.5625,0.109375 3.125,-1.34375 3.125,-1.421875 3.125,-1.53125 3.046875,-1.53125 3.015625,-1.53125 2.921875,-1.53125 2.90625,-1.5 2.859375,-1.390625 2.4375,-0.34375 1.90625,-0.109375 1.5625,-0.109375 c -0.203125,0 -0.3125,-0.125 -0.3125,-0.453125 0,-0.25 0.03125,-0.3125 0.0625,-0.484375 z m 0,0"
+           id="path15"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph0-3"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 1.859375,-2.296875 c 0.296875,0 1.03125,-0.03125 1.53125,-0.234375 0.703125,-0.296875 0.75,-0.890625 0.75,-1.03125 0,-0.4375 -0.375,-0.84375 -1.0625,-0.84375 -1.109375,0 -2.625,0.96875 -2.625,2.71875 0,1.015625 0.59375,1.796875 1.578125,1.796875 1.421875,0 2.25,-1.0625 2.25,-1.171875 0,-0.0625 -0.046875,-0.140625 -0.109375,-0.140625 -0.0625,0 -0.078125,0.03125 -0.140625,0.109375 -0.78125,0.984375 -1.875,0.984375 -1.984375,0.984375 -0.78125,0 -0.875,-0.84375 -0.875,-1.15625 0,-0.125 0.015625,-0.421875 0.15625,-1.03125 z m -0.46875,-0.21875 C 1.78125,-4.03125 2.8125,-4.1875 3.078125,-4.1875 c 0.453125,0 0.734375,0.296875 0.734375,0.625 0,1.046875 -1.59375,1.046875 -2.015625,1.046875 z m 0,0"
+           id="path18"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph0-4"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="M 0.453125,1.21875 C 0.375,1.5625 0.34375,1.625 -0.09375,1.625 c -0.109375,0 -0.21875,0 -0.21875,0.1875 0,0.078125 0.046875,0.125 0.125,0.125 0.265625,0 0.5625,-0.03125 0.828125,-0.03125 0.34375,0 0.671875,0.03125 1,0.03125 0.046875,0 0.171875,0 0.171875,-0.203125 C 1.8125,1.625 1.71875,1.625 1.578125,1.625 c -0.5,0 -0.5,-0.0625 -0.5,-0.15625 0,-0.125 0.421875,-1.75 0.484375,-2 0.125,0.296875 0.40625,0.640625 0.921875,0.640625 1.15625,0 2.40625,-1.453125 2.40625,-2.921875 0,-0.9375 -0.578125,-1.59375 -1.328125,-1.59375 -0.5,0 -0.984375,0.359375 -1.3125,0.75 -0.09375,-0.546875 -0.53125,-0.75 -0.890625,-0.75 -0.46875,0 -0.65625,0.390625 -0.734375,0.5625 C 0.4375,-3.5 0.3125,-2.90625 0.3125,-2.875 c 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.015625 0.171875,-0.234375 0.171875,-0.703125 0.375,-1.1875 0.734375,-1.1875 0.171875,0 0.3125,0.078125 0.3125,0.453125 0,0.234375 -0.03125,0.34375 -0.078125,0.515625 z m 1.75,-4.328125 C 2.265625,-3.375 2.546875,-3.65625 2.71875,-3.8125 c 0.359375,-0.296875 0.640625,-0.375 0.8125,-0.375 0.390625,0 0.640625,0.34375 0.640625,0.9375 0,0.59375 -0.328125,1.734375 -0.515625,2.109375 -0.34375,0.703125 -0.8125,1.03125 -1.1875,1.03125 C 1.8125,-0.109375 1.6875,-0.9375 1.6875,-1 c 0,-0.015625 0,-0.03125 0.03125,-0.15625 z m 0,0"
+           id="path21"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph0-5"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="M 3.71875,-3.765625 C 3.53125,-4.140625 3.25,-4.40625 2.796875,-4.40625 c -1.15625,0 -2.390625,1.46875 -2.390625,2.921875 0,0.9375 0.546875,1.59375 1.3125,1.59375 0.203125,0 0.703125,-0.046875 1.296875,-0.75 0.078125,0.421875 0.4375,0.75 0.90625,0.75 0.359375,0 0.578125,-0.234375 0.75,-0.546875 0.15625,-0.359375 0.296875,-0.96875 0.296875,-0.984375 0,-0.109375 -0.09375,-0.109375 -0.125,-0.109375 -0.09375,0 -0.109375,0.046875 -0.140625,0.1875 -0.171875,0.640625 -0.34375,1.234375 -0.75,1.234375 -0.28125,0 -0.296875,-0.265625 -0.296875,-0.453125 0,-0.21875 0.015625,-0.3125 0.125,-0.75 C 3.890625,-1.71875 3.90625,-1.828125 4,-2.203125 L 4.359375,-3.59375 c 0.0625,-0.28125 0.0625,-0.296875 0.0625,-0.34375 0,-0.171875 -0.109375,-0.265625 -0.28125,-0.265625 -0.25,0 -0.390625,0.21875 -0.421875,0.4375 z M 3.078125,-1.1875 C 3.015625,-1 3.015625,-0.984375 2.875,-0.8125 2.4375,-0.265625 2.03125,-0.109375 1.75,-0.109375 c -0.5,0 -0.640625,-0.546875 -0.640625,-0.9375 0,-0.5 0.3125,-1.71875 0.546875,-2.1875 0.3125,-0.578125 0.75,-0.953125 1.15625,-0.953125 0.640625,0 0.78125,0.8125 0.78125,0.875 0,0.0625 -0.015625,0.125 -0.03125,0.171875 z m 0,0"
+           id="path24"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph0-6"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 3.953125,-3.78125 c -0.171875,0 -0.296875,0 -0.4375,0.125 -0.171875,0.15625 -0.1875,0.328125 -0.1875,0.390625 0,0.25 0.1875,0.359375 0.375,0.359375 0.28125,0 0.546875,-0.25 0.546875,-0.640625 0,-0.484375 -0.46875,-0.859375 -1.171875,-0.859375 -1.34375,0 -2.671875,1.421875 -2.671875,2.828125 0,0.90625 0.578125,1.6875 1.625,1.6875 1.421875,0 2.25,-1.0625 2.25,-1.171875 0,-0.0625 -0.046875,-0.140625 -0.109375,-0.140625 -0.0625,0 -0.078125,0.03125 -0.140625,0.109375 -0.78125,0.984375 -1.875,0.984375 -1.984375,0.984375 -0.625,0 -0.90625,-0.484375 -0.90625,-1.09375 0,-0.40625 0.203125,-1.375 0.546875,-1.984375 0.3125,-0.578125 0.859375,-1 1.40625,-1 0.328125,0 0.71875,0.125 0.859375,0.40625 z m 0,0"
+           id="path27"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph0-7"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 2.828125,-6.234375 c 0,-0.203125 -0.140625,-0.359375 -0.359375,-0.359375 -0.28125,0 -0.546875,0.265625 -0.546875,0.53125 0,0.1875 0.140625,0.359375 0.375,0.359375 0.234375,0 0.53125,-0.234375 0.53125,-0.53125 z m -0.75,3.75 c 0.109375,-0.28125 0.109375,-0.3125 0.21875,-0.578125 0.078125,-0.203125 0.125,-0.34375 0.125,-0.53125 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.28125,-0.9375 0.671875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.21875 -0.078125,0.421875 -0.109375,0.53125 -0.078125,0.25 -0.53125,1.40625 -0.6875,1.84375 -0.109375,0.25 -0.234375,0.578125 -0.234375,0.796875 0,0.46875 0.34375,0.8125 0.8125,0.8125 0.9375,0 1.3125,-1.4375 1.3125,-1.53125 0,-0.109375 -0.09375,-0.109375 -0.125,-0.109375 -0.09375,0 -0.09375,0.03125 -0.140625,0.1875 -0.1875,0.625 -0.515625,1.234375 -1.015625,1.234375 -0.171875,0 -0.25,-0.09375 -0.25,-0.328125 0,-0.25 0.0625,-0.390625 0.296875,-1 z m 0,0"
+           id="path30"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph0-8"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 4.671875,-2.71875 c 0,-1.046875 -0.6875,-1.6875 -1.59375,-1.6875 -1.328125,0 -2.671875,1.421875 -2.671875,2.828125 0,0.984375 0.671875,1.6875 1.59375,1.6875 1.328125,0 2.671875,-1.375 2.671875,-2.828125 z m -2.65625,2.609375 c -0.4375,0 -0.875,-0.3125 -0.875,-1.09375 0,-0.484375 0.265625,-1.5625 0.578125,-2.0625 0.5,-0.765625 1.078125,-0.921875 1.359375,-0.921875 0.578125,0 0.875,0.484375 0.875,1.078125 0,0.390625 -0.203125,1.4375 -0.578125,2.078125 -0.359375,0.578125 -0.90625,0.921875 -1.359375,0.921875 z m 0,0"
+           id="path33"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph0-9"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 0.875,-0.59375 c -0.03125,0.15625 -0.09375,0.390625 -0.09375,0.4375 0,0.171875 0.140625,0.265625 0.296875,0.265625 0.125,0 0.296875,-0.078125 0.375,-0.28125 0,-0.015625 0.125,-0.484375 0.1875,-0.734375 l 0.21875,-0.890625 C 1.90625,-2.03125 1.96875,-2.25 2.03125,-2.46875 c 0.03125,-0.171875 0.109375,-0.46875 0.125,-0.5 0.140625,-0.3125 0.671875,-1.21875 1.625,-1.21875 0.453125,0 0.53125,0.375 0.53125,0.703125 0,0.609375 -0.484375,1.890625 -0.640625,2.3125 C 3.578125,-0.9375 3.5625,-0.8125 3.5625,-0.703125 c 0,0.46875 0.359375,0.8125 0.828125,0.8125 0.9375,0 1.296875,-1.453125 1.296875,-1.53125 0,-0.109375 -0.078125,-0.109375 -0.109375,-0.109375 -0.109375,0 -0.109375,0.03125 -0.15625,0.1875 -0.203125,0.671875 -0.53125,1.234375 -1.015625,1.234375 -0.171875,0 -0.234375,-0.09375 -0.234375,-0.328125 0,-0.25 0.078125,-0.484375 0.171875,-0.703125 0.1875,-0.53125 0.609375,-1.625 0.609375,-2.203125 0,-0.65625 -0.421875,-1.0625 -1.140625,-1.0625 -0.90625,0 -1.390625,0.640625 -1.5625,0.875 -0.046875,-0.5625 -0.453125,-0.875 -0.921875,-0.875 -0.453125,0 -0.640625,0.390625 -0.734375,0.5625 C 0.421875,-3.5 0.296875,-2.90625 0.296875,-2.875 c 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.015625 0.171875,-0.234375 0.171875,-0.703125 0.375,-1.1875 0.734375,-1.1875 0.1875,0 0.296875,0.125 0.296875,0.453125 0,0.21875 -0.03125,0.328125 -0.15625,0.84375 z m 0,0"
+           id="path36"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph0-10"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 2.578125,-6.8125 c 0,0 0,-0.109375 -0.140625,-0.109375 -0.21875,0 -0.953125,0.078125 -1.21875,0.109375 -0.078125,0 -0.1875,0.015625 -0.1875,0.203125 0,0.109375 0.109375,0.109375 0.25,0.109375 0.484375,0 0.5,0.09375 0.5,0.171875 L 1.75,-6.125 0.484375,-1.140625 C 0.453125,-1.03125 0.4375,-0.96875 0.4375,-0.8125 c 0,0.578125 0.4375,0.921875 0.90625,0.921875 0.328125,0 0.578125,-0.203125 0.75,-0.5625 0.171875,-0.375 0.296875,-0.953125 0.296875,-0.96875 0,-0.109375 -0.09375,-0.109375 -0.125,-0.109375 -0.09375,0 -0.109375,0.046875 -0.125,0.1875 C 1.96875,-0.703125 1.78125,-0.109375 1.375,-0.109375 c -0.296875,0 -0.296875,-0.3125 -0.296875,-0.453125 0,-0.25 0.015625,-0.296875 0.0625,-0.484375 z m 0,0"
+           id="path39"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph0-11"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 0.875,-0.59375 c -0.03125,0.15625 -0.09375,0.390625 -0.09375,0.4375 0,0.171875 0.140625,0.265625 0.296875,0.265625 0.125,0 0.296875,-0.078125 0.375,-0.28125 0,-0.015625 0.125,-0.484375 0.1875,-0.734375 l 0.21875,-0.890625 C 1.90625,-2.03125 1.96875,-2.25 2.03125,-2.46875 c 0.03125,-0.171875 0.109375,-0.46875 0.125,-0.5 0.140625,-0.3125 0.671875,-1.21875 1.625,-1.21875 0.453125,0 0.53125,0.375 0.53125,0.703125 0,0.25 -0.0625,0.53125 -0.140625,0.828125 L 3.890625,-1.5 3.6875,-0.75 c -0.03125,0.203125 -0.125,0.546875 -0.125,0.59375 0,0.171875 0.140625,0.265625 0.28125,0.265625 0.3125,0 0.375,-0.25 0.453125,-0.5625 0.140625,-0.5625 0.515625,-2.015625 0.59375,-2.40625 0.03125,-0.125 0.5625,-1.328125 1.65625,-1.328125 0.421875,0 0.53125,0.34375 0.53125,0.703125 0,0.5625 -0.421875,1.703125 -0.625,2.234375 -0.078125,0.234375 -0.125,0.34375 -0.125,0.546875 0,0.46875 0.34375,0.8125 0.8125,0.8125 0.9375,0 1.3125,-1.453125 1.3125,-1.53125 0,-0.109375 -0.09375,-0.109375 -0.125,-0.109375 -0.09375,0 -0.09375,0.03125 -0.140625,0.1875 -0.15625,0.53125 -0.46875,1.234375 -1.015625,1.234375 -0.171875,0 -0.25,-0.09375 -0.25,-0.328125 0,-0.25 0.09375,-0.484375 0.1875,-0.703125 0.1875,-0.53125 0.609375,-1.625 0.609375,-2.203125 0,-0.640625 -0.40625,-1.0625 -1.15625,-1.0625 -0.734375,0 -1.25,0.4375 -1.625,0.96875 0,-0.125 -0.03125,-0.46875 -0.3125,-0.703125 -0.25,-0.21875 -0.5625,-0.265625 -0.8125,-0.265625 -0.90625,0 -1.390625,0.640625 -1.5625,0.875 -0.046875,-0.578125 -0.46875,-0.875 -0.921875,-0.875 -0.453125,0 -0.640625,0.390625 -0.734375,0.5625 -0.171875,0.359375 -0.296875,0.9375 -0.296875,0.96875 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.015625 0.171875,-0.234375 0.171875,-0.703125 0.375,-1.1875 0.734375,-1.1875 0.15625,0 0.296875,0.078125 0.296875,0.453125 0,0.21875 -0.03125,0.328125 -0.15625,0.84375 z m 0,0"
+           id="path42"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph0-12"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="M 3.328125,-3.015625 C 3.390625,-3.265625 3.625,-4.1875 4.3125,-4.1875 c 0.046875,0 0.296875,0 0.5,0.125 C 4.53125,-4 4.34375,-3.765625 4.34375,-3.515625 c 0,0.15625 0.109375,0.34375 0.375,0.34375 0.21875,0 0.53125,-0.171875 0.53125,-0.578125 0,-0.515625 -0.578125,-0.65625 -0.921875,-0.65625 -0.578125,0 -0.921875,0.53125 -1.046875,0.75 -0.25,-0.65625 -0.78125,-0.75 -1.078125,-0.75 -1.03125,0 -1.609375,1.28125 -1.609375,1.53125 0,0.109375 0.109375,0.109375 0.125,0.109375 0.078125,0 0.109375,-0.03125 0.125,-0.109375 0.34375,-1.0625 1,-1.3125 1.34375,-1.3125 0.1875,0 0.53125,0.09375 0.53125,0.671875 0,0.3125 -0.171875,0.96875 -0.53125,2.375 -0.15625,0.609375 -0.515625,1.03125 -0.953125,1.03125 -0.0625,0 -0.28125,0 -0.5,-0.125 0.25,-0.0625 0.46875,-0.265625 0.46875,-0.546875 0,-0.265625 -0.21875,-0.34375 -0.359375,-0.34375 -0.3125,0 -0.546875,0.25 -0.546875,0.578125 0,0.453125 0.484375,0.65625 0.921875,0.65625 0.671875,0 1.03125,-0.703125 1.046875,-0.75 0.125,0.359375 0.484375,0.75 1.078125,0.75 1.03125,0 1.59375,-1.28125 1.59375,-1.53125 0,-0.109375 -0.078125,-0.109375 -0.109375,-0.109375 -0.09375,0 -0.109375,0.046875 -0.140625,0.109375 -0.328125,1.078125 -1,1.3125 -1.3125,1.3125 -0.390625,0 -0.546875,-0.3125 -0.546875,-0.65625 0,-0.21875 0.046875,-0.4375 0.15625,-0.875 z m 0,0"
+           id="path45"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph1-0"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 3.296875,2.390625 c 0,-0.03125 0,-0.046875 -0.171875,-0.21875 C 1.890625,0.921875 1.5625,-0.96875 1.5625,-2.5 c 0,-1.734375 0.375,-3.46875 1.609375,-4.703125 0.125,-0.125 0.125,-0.140625 0.125,-0.171875 0,-0.078125 -0.03125,-0.109375 -0.09375,-0.109375 -0.109375,0 -1,0.6875 -1.59375,1.953125 -0.5,1.09375 -0.625,2.203125 -0.625,3.03125 0,0.78125 0.109375,1.984375 0.65625,3.125 C 2.25,1.84375 3.09375,2.5 3.203125,2.5 c 0.0625,0 0.09375,-0.03125 0.09375,-0.109375 z m 0,0"
+           id="path48"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph1-1"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 2.875,-2.5 c 0,-0.765625 -0.109375,-1.96875 -0.65625,-3.109375 -0.59375,-1.21875 -1.453125,-1.875 -1.546875,-1.875 -0.0625,0 -0.109375,0.046875 -0.109375,0.109375 0,0.03125 0,0.046875 0.1875,0.234375 0.984375,0.984375 1.546875,2.5625 1.546875,4.640625 0,1.71875 -0.359375,3.46875 -1.59375,4.71875 C 0.5625,2.34375 0.5625,2.359375 0.5625,2.390625 0.5625,2.453125 0.609375,2.5 0.671875,2.5 0.765625,2.5 1.671875,1.8125 2.25,0.546875 2.765625,-0.546875 2.875,-1.65625 2.875,-2.5 z m 0,0"
+           id="path51"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph1-2"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 6.84375,-3.265625 c 0.15625,0 0.34375,0 0.34375,-0.1875 C 7.1875,-3.65625 7,-3.65625 6.859375,-3.65625 l -5.96875,0 c -0.140625,0 -0.328125,0 -0.328125,0.203125 0,0.1875 0.1875,0.1875 0.328125,0.1875 z m 0.015625,1.9375 c 0.140625,0 0.328125,0 0.328125,-0.203125 0,-0.1875 -0.1875,-0.1875 -0.34375,-0.1875 l -5.953125,0 c -0.140625,0 -0.328125,0 -0.328125,0.1875 0,0.203125 0.1875,0.203125 0.328125,0.203125 z m 0,0"
+           id="path54"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph1-3"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 2.9375,-6.375 c 0,-0.25 0,-0.265625 -0.234375,-0.265625 C 2.078125,-6 1.203125,-6 0.890625,-6 l 0,0.3125 c 0.203125,0 0.78125,0 1.296875,-0.265625 l 0,5.171875 c 0,0.359375 -0.03125,0.46875 -0.921875,0.46875 l -0.3125,0 0,0.3125 c 0.34375,-0.03125 1.203125,-0.03125 1.609375,-0.03125 0.390625,0 1.265625,0 1.609375,0.03125 l 0,-0.3125 -0.3125,0 c -0.90625,0 -0.921875,-0.109375 -0.921875,-0.46875 z m 0,0"
+           id="path57"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph2-0"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="M 3.875,-2.765625 1.890625,-4.75 C 1.765625,-4.875 1.75,-4.890625 1.671875,-4.890625 1.5625,-4.890625 1.46875,-4.8125 1.46875,-4.6875 c 0,0.0625 0.015625,0.078125 0.125,0.1875 l 2,2 -2,2.015625 c -0.109375,0.109375 -0.125,0.125 -0.125,0.1875 0,0.125 0.09375,0.203125 0.203125,0.203125 0.078125,0 0.09375,-0.015625 0.21875,-0.140625 L 3.875,-2.21875 l 2.0625,2.0625 c 0.015625,0.015625 0.078125,0.0625 0.140625,0.0625 0.125,0 0.203125,-0.078125 0.203125,-0.203125 0,-0.015625 0,-0.046875 -0.03125,-0.109375 C 6.234375,-0.421875 4.65625,-1.984375 4.15625,-2.5 l 1.828125,-1.8125 c 0.046875,-0.0625 0.203125,-0.1875 0.25,-0.25 0,-0.015625 0.046875,-0.0625 0.046875,-0.125 0,-0.125 -0.078125,-0.203125 -0.203125,-0.203125 C 6,-4.890625 5.96875,-4.859375 5.859375,-4.75 z m 0,0"
+           id="path60"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph3-0"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 6.984375,23.421875 c 0,-0.04687 -0.03125,-0.0625 -0.046875,-0.09375 -0.375,-0.375 -1.03125,-1.03125 -1.703125,-2.109375 C 3.625,18.640625 2.90625,15.40625 2.90625,11.5625 c 0,-2.6875 0.359375,-6.140625 2,-9.109375 C 5.6875,1.03125 6.515625,0.21875 6.953125,-0.21875 c 0.03125,-0.03125 0.03125,-0.046875 0.03125,-0.078125 0,-0.109375 -0.078125,-0.109375 -0.21875,-0.109375 -0.140625,0 -0.15625,0 -0.3125,0.15625 -3.328125,3.046875 -4.375,7.609375 -4.375,11.796875 0,3.921875 0.890625,7.875 3.421875,10.859375 0.203125,0.21875 0.578125,0.625 0.984375,0.984375 0.125,0.125 0.140625,0.125 0.28125,0.125 0.140625,0 0.21875,0 0.21875,-0.09375 z m 0,0"
+           id="path63"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph3-1"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="M 5.25,11.5625 C 5.25,7.640625 4.359375,3.703125 1.828125,0.71875 1.625,0.484375 1.25,0.078125 0.84375,-0.28125 c -0.125,-0.125 -0.140625,-0.125 -0.28125,-0.125 -0.125,0 -0.21875,0 -0.21875,0.109375 0,0.03125 0.046875,0.078125 0.0625,0.09375 0.34375,0.359375 1.015625,1.03125 1.6875,2.109375 1.609375,2.5625 2.328125,5.8125 2.328125,9.640625 0,2.6875 -0.359375,6.140625 -2,9.125 -0.78125,1.40625 -1.609375,2.234375 -2.03125,2.65625 -0.015625,0.03125 -0.046875,0.0625 -0.046875,0.09375 0,0.09375 0.09375,0.09375 0.21875,0.09375 0.140625,0 0.15625,0 0.3125,-0.15625 C 4.203125,20.328125 5.25,15.765625 5.25,11.5625 z m 0,0"
+           id="path66"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph4-0"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 3.046875,-2.671875 c -0.25,0.046875 -0.34375,0.234375 -0.34375,0.390625 0,0.1875 0.140625,0.265625 0.265625,0.265625 0.15625,0 0.390625,-0.109375 0.390625,-0.453125 0,-0.46875 -0.53125,-0.609375 -0.90625,-0.609375 -1.046875,0 -2.015625,0.96875 -2.015625,1.9375 0,0.59375 0.40625,1.203125 1.28125,1.203125 1.1875,0 1.734375,-0.6875 1.734375,-0.78125 0,-0.046875 -0.0625,-0.125 -0.125,-0.125 -0.03125,0 -0.046875,0.015625 -0.109375,0.078125 C 2.671875,-0.125 1.859375,-0.125 1.734375,-0.125 c -0.5,0 -0.71875,-0.34375 -0.71875,-0.78125 0,-0.1875 0.09375,-0.953125 0.453125,-1.4375 0.265625,-0.34375 0.625,-0.53125 0.984375,-0.53125 0.09375,0 0.421875,0.015625 0.59375,0.203125 z m 0,0"
+           id="path69"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph4-1"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="M 2.953125,-1.125 C 2.90625,-0.984375 2.84375,-0.71875 2.84375,-0.71875 2.703125,-0.5 2.421875,-0.125 2,-0.125 c -0.484375,0 -0.484375,-0.453125 -0.484375,-0.578125 0,-0.40625 0.1875,-0.90625 0.390625,-1.421875 C 1.953125,-2.265625 2,-2.359375 2,-2.46875 2,-2.84375 1.6875,-3.078125 1.34375,-3.078125 0.640625,-3.078125 0.328125,-2.125 0.328125,-2 c 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.03125 0.125,-0.109375 0.15625,-0.5625 0.46875,-0.84375 0.734375,-0.84375 0.125,0 0.171875,0.078125 0.171875,0.234375 0,0.171875 -0.046875,0.3125 -0.125,0.46875 -0.375,0.96875 -0.375,1.171875 -0.375,1.359375 0,0.109375 0,0.4375 0.265625,0.65625 0.203125,0.171875 0.46875,0.21875 0.71875,0.21875 0.4375,0 0.671875,-0.234375 0.90625,-0.453125 C 3.03125,0.0625 3.484375,0.0625 3.578125,0.0625 3.8125,0.0625 4,-0.0625 4.125,-0.296875 4.28125,-0.578125 4.375,-0.96875 4.375,-1 c 0,-0.09375 -0.09375,-0.09375 -0.109375,-0.09375 -0.109375,0 -0.109375,0.03125 -0.15625,0.21875 -0.09375,0.328125 -0.21875,0.75 -0.515625,0.75 -0.171875,0 -0.234375,-0.15625 -0.234375,-0.34375 0,-0.109375 0.0625,-0.375 0.109375,-0.546875 0.046875,-0.1875 0.125,-0.46875 0.15625,-0.625 l 0.15625,-0.625 C 3.828125,-2.4375 3.90625,-2.75 3.90625,-2.78125 3.90625,-2.921875 3.796875,-3 3.671875,-3 c -0.25,0 -0.3125,0.203125 -0.359375,0.421875 z m 0,0"
+           id="path72"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph4-2"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 1.640625,-1.40625 c 0,-0.046875 0.171875,-0.671875 0.171875,-0.703125 0.015625,-0.0625 0.21875,-0.40625 0.453125,-0.578125 0.0625,-0.046875 0.25,-0.1875 0.5625,-0.1875 0.0625,0 0.234375,0 0.375,0.09375 -0.21875,0.0625 -0.296875,0.265625 -0.296875,0.390625 0,0.140625 0.109375,0.25 0.265625,0.25 0.171875,0 0.390625,-0.125 0.390625,-0.421875 0,-0.359375 -0.375,-0.515625 -0.734375,-0.515625 -0.359375,0 -0.671875,0.15625 -0.984375,0.5 -0.125,-0.421875 -0.546875,-0.5 -0.71875,-0.5 -0.25,0 -0.421875,0.171875 -0.546875,0.359375 -0.15625,0.265625 -0.25,0.671875 -0.25,0.71875 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.421875 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.125 -0.0625,0.390625 -0.125,0.578125 -0.046875,0.1875 -0.109375,0.46875 -0.140625,0.625 L 0.84375,-0.4375 C 0.828125,-0.34375 0.78125,-0.171875 0.78125,-0.15625 0.78125,0 0.90625,0.0625 1.015625,0.0625 1.125,0.0625 1.265625,0 1.3125,-0.125 1.328125,-0.171875 1.40625,-0.484375 1.453125,-0.65625 z m 0,0"
+           id="path75"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph4-3"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 3.71875,-2.53125 c 0,-0.546875 -0.328125,-0.546875 -0.34375,-0.546875 -0.1875,0 -0.375,0.1875 -0.375,0.375 0,0.109375 0.0625,0.171875 0.109375,0.203125 0.125,0.109375 0.265625,0.28125 0.265625,0.5625 0,0.3125 -0.46875,1.8125 -1.296875,1.8125 -0.5625,0 -0.5625,-0.5 -0.5625,-0.625 0,-0.3125 0.125,-0.703125 0.390625,-1.359375 C 1.953125,-2.25 2,-2.359375 2,-2.46875 2,-2.84375 1.6875,-3.078125 1.34375,-3.078125 0.640625,-3.078125 0.328125,-2.125 0.328125,-2 c 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.03125 0.125,-0.109375 C 0.734375,-2.59375 1.03125,-2.875 1.3125,-2.875 c 0.125,0 0.171875,0.078125 0.171875,0.234375 0,0.171875 -0.046875,0.3125 -0.125,0.46875 -0.296875,0.78125 -0.375,1.078125 -0.375,1.328125 0,0.6875 0.546875,0.90625 1.078125,0.90625 1.171875,0 1.65625,-2.015625 1.65625,-2.59375 z m 0,0"
+           id="path78"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph4-4"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 1.5625,-1.59375 c 0.1875,0 0.75,-0.015625 1.125,-0.140625 0.515625,-0.1875 0.609375,-0.515625 0.609375,-0.71875 0,-0.390625 -0.390625,-0.625 -0.859375,-0.625 -0.84375,0 -1.96875,0.640625 -1.96875,1.84375 0,0.703125 0.4375,1.296875 1.25,1.296875 1.1875,0 1.734375,-0.6875 1.734375,-0.78125 0,-0.046875 -0.0625,-0.125 -0.125,-0.125 -0.03125,0 -0.046875,0.015625 -0.109375,0.078125 C 2.671875,-0.125 1.859375,-0.125 1.734375,-0.125 1.3125,-0.125 1.03125,-0.40625 1.03125,-0.96875 c 0,-0.09375 0,-0.234375 0.09375,-0.625 z M 1.171875,-1.78125 C 1.46875,-2.796875 2.234375,-2.875 2.4375,-2.875 2.734375,-2.875 3,-2.71875 3,-2.453125 3,-1.78125 1.8125,-1.78125 1.515625,-1.78125 z m 0,0"
+           id="path81"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph4-5"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 2.390625,-2.25 0.734375,0 c 0.53125,0 0.625,0.09375 0.625,0.3125 0,0.109375 0,0.125 -0.046875,0.328125 -0.015625,0.03125 -0.03125,0.0625 -0.03125,0.078125 0,0.0625 0.0625,0.109375 0.125,0.109375 0.09375,0 0.09375,-0.046875 0.140625,-0.171875 l 0.375,-1.46875 c 0,-0.03125 0.015625,-0.125 0.015625,-0.140625 0,-0.078125 -0.046875,-0.109375 -0.109375,-0.109375 -0.09375,0 -0.109375,0.046875 -0.140625,0.171875 C 3.9375,-2.59375 3.734375,-2.5 3.140625,-2.5 l -0.6875,0 0.4375,-1.75 c 0.046875,-0.203125 0.0625,-0.234375 0.34375,-0.234375 l 1.078125,0 c 0.921875,0 1.09375,0.21875 1.09375,0.8125 0,0.21875 -0.03125,0.375 -0.03125,0.421875 0,0.0625 0.03125,0.125 0.125,0.125 0.109375,0 0.109375,-0.0625 0.125,-0.1875 L 5.75,-4.515625 c 0.015625,-0.21875 -0.03125,-0.21875 -0.203125,-0.21875 l -3.71875,0 c -0.140625,0 -0.21875,0 -0.21875,0.15625 0,0.09375 0.078125,0.09375 0.21875,0.09375 0,0 0.140625,0 0.265625,0.015625 C 2.234375,-4.453125 2.25,-4.4375 2.25,-4.375 c 0,0.046875 -0.015625,0.125 -0.03125,0.15625 L 1.3125,-0.578125 C 1.234375,-0.296875 1.234375,-0.25 0.6875,-0.25 c -0.109375,0 -0.203125,0 -0.203125,0.140625 C 0.484375,-0.03125 0.53125,0 0.59375,0 0.796875,0 1.3125,-0.03125 1.515625,-0.03125 l 0.53125,0.015625 C 2.234375,-0.015625 2.421875,0 2.59375,0 2.640625,0 2.75,0 2.75,-0.15625 2.75,-0.25 2.671875,-0.25 2.515625,-0.25 c -0.015625,0 -0.1875,0 -0.375,-0.015625 C 2,-0.28125 1.9375,-0.28125 1.9375,-0.390625 c 0,-0.015625 0,-0.046875 0.015625,-0.125 z m 0,0"
+           id="path84"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph4-6"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 2.9375,-2.65625 c -0.140625,-0.234375 -0.375,-0.421875 -0.71875,-0.421875 -0.890625,0 -1.796875,0.984375 -1.796875,1.984375 0,0.6875 0.453125,1.15625 1.0625,1.15625 0.375,0 0.703125,-0.203125 0.984375,-0.484375 C 2.59375,0 3,0.0625 3.1875,0.0625 c 0.25,0 0.421875,-0.140625 0.546875,-0.359375 0.15625,-0.28125 0.25,-0.671875 0.25,-0.703125 0,-0.09375 -0.09375,-0.09375 -0.109375,-0.09375 -0.109375,0 -0.109375,0.03125 -0.15625,0.21875 C 3.625,-0.53125 3.5,-0.125 3.203125,-0.125 3.03125,-0.125 2.96875,-0.28125 2.96875,-0.46875 c 0,-0.109375 0.0625,-0.375 0.109375,-0.546875 0.046875,-0.1875 0.125,-0.46875 0.15625,-0.625 L 3.375,-2.171875 C 3.421875,-2.359375 3.5,-2.6875 3.5,-2.71875 3.5,-2.875 3.375,-2.9375 3.265625,-2.9375 c -0.125,0 -0.28125,0.078125 -0.328125,0.28125 z M 2.5,-0.875 C 2.453125,-0.671875 2.296875,-0.53125 2.140625,-0.40625 2.078125,-0.34375 1.796875,-0.125 1.5,-0.125 c -0.265625,0 -0.515625,-0.1875 -0.515625,-0.671875 0,-0.375 0.203125,-1.140625 0.375,-1.421875 0.3125,-0.5625 0.671875,-0.65625 0.859375,-0.65625 0.484375,0 0.625,0.53125 0.625,0.609375 0,0.015625 -0.015625,0.078125 -0.015625,0.09375 z m 0,0"
+           id="path87"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph4-7"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 1.71875,-2.75 0.703125,0 c 0.140625,0 0.21875,0 0.21875,-0.15625 C 2.640625,-3 2.5625,-3 2.4375,-3 l -0.65625,0 0.25,-1.03125 C 2.046875,-4.0625 2.0625,-4.109375 2.0625,-4.125 c 0,-0.140625 -0.109375,-0.234375 -0.25,-0.234375 -0.171875,0 -0.265625,0.125 -0.328125,0.296875 C 1.4375,-3.875 1.53125,-4.21875 1.21875,-3 l -0.703125,0 c -0.125,0 -0.21875,0 -0.21875,0.15625 C 0.296875,-2.75 0.375,-2.75 0.5,-2.75 l 0.65625,0 L 0.75,-1.109375 C 0.703125,-0.9375 0.640625,-0.6875 0.640625,-0.59375 c 0,0.40625 0.359375,0.65625 0.75,0.65625 0.78125,0 1.21875,-0.96875 1.21875,-1.0625 0,-0.09375 -0.09375,-0.09375 -0.109375,-0.09375 -0.09375,0 -0.09375,0.015625 -0.15625,0.140625 -0.1875,0.4375 -0.546875,0.828125 -0.921875,0.828125 -0.15625,0 -0.25,-0.09375 -0.25,-0.34375 0,-0.0625 0.03125,-0.21875 0.046875,-0.28125 z m 0,0"
+           id="path90"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph4-8"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 3.703125,-1.859375 c 0,-0.765625 -0.578125,-1.21875 -1.265625,-1.21875 -1.03125,0 -2,0.96875 -2,1.921875 0,0.703125 0.5,1.21875 1.265625,1.21875 1,0 2,-0.90625 2,-1.921875 z m -2,1.734375 c -0.34375,0 -0.6875,-0.21875 -0.6875,-0.78125 0,-0.28125 0.125,-0.96875 0.40625,-1.359375 C 1.71875,-2.703125 2.125,-2.875 2.4375,-2.875 c 0.375,0 0.6875,0.25 0.6875,0.765625 C 3.125,-1.9375 3.046875,-1.25 2.734375,-0.765625 2.46875,-0.34375 2.0625,-0.125 1.703125,-0.125 z m 0,0"
+           id="path93"
+           inkscape:connector-curvature="0" />
+      </symbol>
+    </g>
+  </defs>
+  <g
+     id="g3498"
+     transform="translate(-146.26423,-141.81494)">
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g96">
+      <use
+         xlink:href="#glyph0-0"
+         x="153"
+         y="160.3"
+         id="use98"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g100">
+      <use
+         xlink:href="#glyph1-0"
+         x="158.16016"
+         y="160.3"
+         id="use102"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g104">
+      <use
+         xlink:href="#glyph0-1"
+         x="162"
+         y="160.3"
+         id="use106"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g108">
+      <use
+         xlink:href="#glyph0-2"
+         x="166.68001"
+         y="160.3"
+         id="use110"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g112">
+      <use
+         xlink:href="#glyph0-3"
+         x="170.28001"
+         y="160.3"
+         id="use114"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g116">
+      <use
+         xlink:href="#glyph0-4"
+         x="174.96001"
+         y="160.3"
+         id="use118"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g120">
+      <use
+         xlink:href="#glyph1-1"
+         x="180"
+         y="160.3"
+         id="use122"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g124">
+      <use
+         xlink:href="#glyph1-2"
+         x="186.60001"
+         y="160.3"
+         id="use126"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g128">
+      <use
+         xlink:href="#glyph0-5"
+         x="197.03979"
+         y="160.3"
+         id="use130"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g132">
+      <use
+         xlink:href="#glyph0-6"
+         x="202.31979"
+         y="160.3"
+         id="use134"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g136">
+      <use
+         xlink:href="#glyph0-2"
+         x="206.6398"
+         y="160.3"
+         id="use138"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g140">
+      <use
+         xlink:href="#glyph0-7"
+         x="210.23981"
+         y="160.3"
+         id="use142"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g144">
+      <use
+         xlink:href="#glyph0-8"
+         x="213.7198"
+         y="160.3"
+         id="use146"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g148">
+      <use
+         xlink:href="#glyph0-9"
+         x="218.51981"
+         y="160.3"
+         id="use150"
+         width="595"
+         height="842" />
+    </g>
+    <path
+       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 225.10937,159.83203 3,0 0,0.48047 -3,0 z m 0,0"
+       id="path152"
+       inkscape:connector-curvature="0" />
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g154">
+      <use
+         xlink:href="#glyph0-0"
+         x="228.12"
+         y="160.3"
+         id="use156"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g158">
+      <use
+         xlink:href="#glyph0-3"
+         x="233.28001"
+         y="160.3"
+         id="use160"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g162">
+      <use
+         xlink:href="#glyph0-10"
+         x="237.96001"
+         y="160.3"
+         id="use164"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g166">
+      <use
+         xlink:href="#glyph0-2"
+         x="241.20009"
+         y="160.3"
+         id="use168"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g170">
+      <use
+         xlink:href="#glyph0-5"
+         x="244.80009"
+         y="160.3"
+         id="use172"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g174">
+      <use
+         xlink:href="#glyph2-0"
+         x="252.12"
+         y="160.3"
+         id="use176"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g178">
+      <use
+         xlink:href="#glyph3-0"
+         x="262.08017"
+         y="146.26019"
+         id="use180"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g182">
+      <use
+         xlink:href="#glyph0-11"
+         x="299.88016"
+         y="153.58012"
+         id="use184"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g186">
+      <use
+         xlink:href="#glyph0-5"
+         x="308.64017"
+         y="153.58012"
+         id="use188"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g190">
+      <use
+         xlink:href="#glyph0-12"
+         x="313.92017"
+         y="153.58012"
+         id="use192"
+         width="595"
+         height="842" />
+    </g>
+    <path
+       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 320.14844,153.11328 3,0 0,0.48047 -3,0 z m 0,0"
+       id="path194"
+       inkscape:connector-curvature="0" />
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g196">
+      <use
+         xlink:href="#glyph0-5"
+         x="323.16"
+         y="153.58"
+         id="use198"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g200">
+      <use
+         xlink:href="#glyph0-6"
+         x="328.44"
+         y="153.58"
+         id="use202"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g204">
+      <use
+         xlink:href="#glyph0-6"
+         x="332.76001"
+         y="153.58"
+         id="use206"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g208">
+      <use
+         xlink:href="#glyph0-3"
+         x="337.07999"
+         y="153.58"
+         id="use210"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g212">
+      <use
+         xlink:href="#glyph0-10"
+         x="341.76001"
+         y="153.58"
+         id="use214"
+         width="595"
+         height="842" />
+    </g>
+    <path
+       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 270.58984,157.55078 103.5586,0 0,0.48047 -103.5586,0 z m 0,0"
+       id="path216"
+       inkscape:connector-curvature="0" />
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g218">
+      <use
+         xlink:href="#glyph0-1"
+         x="270.60001"
+         y="167.14"
+         id="use220"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g222">
+      <use
+         xlink:href="#glyph0-2"
+         x="275.28"
+         y="167.14"
+         id="use224"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g226">
+      <use
+         xlink:href="#glyph0-3"
+         x="278.88"
+         y="167.14"
+         id="use228"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g230">
+      <use
+         xlink:href="#glyph0-4"
+         x="283.56003"
+         y="167.14"
+         id="use232"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g234">
+      <use
+         xlink:href="#glyph0-1"
+         x="288.60001"
+         y="167.14"
+         id="use236"
+         width="595"
+         height="842" />
+    </g>
+    <path
+       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 293.86719,166.67187 3,0 0,0.48047 -3,0 z m 0,0"
+       id="path238"
+       inkscape:connector-curvature="0" />
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g240">
+      <use
+         xlink:href="#glyph0-2"
+         x="296.88"
+         y="167.14"
+         id="use242"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g244">
+      <use
+         xlink:href="#glyph0-8"
+         x="300.48001"
+         y="167.14"
+         id="use246"
+         width="595"
+         height="842" />
+    </g>
+    <path
+       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 305.86719,166.67187 3,0 0,0.48047 -3,0 z m 0,0"
+       id="path248"
+       inkscape:connector-curvature="0" />
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g250">
+      <use
+         xlink:href="#glyph0-11"
+         x="308.88"
+         y="167.14"
+         id="use252"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g254">
+      <use
+         xlink:href="#glyph0-5"
+         x="317.64001"
+         y="167.14"
+         id="use256"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g258">
+      <use
+         xlink:href="#glyph0-12"
+         x="322.91998"
+         y="167.14"
+         id="use260"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(1.6,0)"
+       style="fill:#000000;fill-opacity:1"
+       id="g262">
+      <use
+         xlink:href="#glyph4-0"
+         x="328.56009"
+         y="164.26031"
+         id="use264"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(1.6,0)"
+       style="fill:#000000;fill-opacity:1"
+       id="g266">
+      <use
+         xlink:href="#glyph4-1"
+         x="332.1601"
+         y="164.26031"
+         id="use268"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(1.6,0)"
+       style="fill:#000000;fill-opacity:1"
+       id="g270">
+      <use
+         xlink:href="#glyph4-2"
+         x="336.84009"
+         y="164.26031"
+         id="use272"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(1.6,0)"
+       style="fill:#000000;fill-opacity:1"
+       id="g274">
+      <use
+         xlink:href="#glyph4-3"
+         x="340.79993"
+         y="164.26031"
+         id="use276"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(1.6,0)"
+       style="fill:#000000;fill-opacity:1"
+       id="g278">
+      <use
+         xlink:href="#glyph4-4"
+         x="344.99994"
+         y="164.26031"
+         id="use280"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(1.6,0)"
+       style="fill:#000000;fill-opacity:1"
+       id="g282">
+      <use
+         xlink:href="#glyph4-5"
+         x="348.71994"
+         y="164.26031"
+         id="use284"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(1.6,0)"
+       style="fill:#000000;fill-opacity:1"
+       id="g286">
+      <use
+         xlink:href="#glyph4-6"
+         x="354.83978"
+         y="164.26031"
+         id="use288"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(1.6,0)"
+       style="fill:#000000;fill-opacity:1"
+       id="g290">
+      <use
+         xlink:href="#glyph4-0"
+         x="359.15979"
+         y="164.26031"
+         id="use292"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(1.6,0)"
+       style="fill:#000000;fill-opacity:1"
+       id="g294">
+      <use
+         xlink:href="#glyph4-7"
+         x="362.75977"
+         y="164.26031"
+         id="use296"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(1.6,0)"
+       style="fill:#000000;fill-opacity:1"
+       id="g298">
+      <use
+         xlink:href="#glyph4-8"
+         x="365.75977"
+         y="164.26031"
+         id="use300"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(1.6,0)"
+       style="fill:#000000;fill-opacity:1"
+       id="g302">
+      <use
+         xlink:href="#glyph4-2"
+         x="369.71979"
+         y="164.26031"
+         id="use304"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g306">
+      <use
+         xlink:href="#glyph3-1"
+         x="375.36011"
+         y="146.26031"
+         id="use308"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g310">
+      <use
+         xlink:href="#glyph2-0"
+         x="384.83978"
+         y="160.30011"
+         id="use312"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g314">
+      <use
+         xlink:href="#glyph0-1"
+         x="394.79996"
+         y="160.30011"
+         id="use316"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g318">
+      <use
+         xlink:href="#glyph0-2"
+         x="399.47995"
+         y="160.30011"
+         id="use320"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g322">
+      <use
+         xlink:href="#glyph0-3"
+         x="403.07996"
+         y="160.30011"
+         id="use324"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       style="fill:#000000;fill-opacity:1"
+       id="g326">
+      <use
+         xlink:href="#glyph0-4"
+         x="407.75998"
+         y="160.30011"
+         id="use328"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(1.6,0)"
+       style="fill:#000000;fill-opacity:1"
+       id="g330">
+      <use
+         xlink:href="#glyph4-0"
+         x="412.79996"
+         y="156.10011"
+         id="use332"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(1.6,0)"
+       style="fill:#000000;fill-opacity:1"
+       id="g334">
+      <use
+         xlink:href="#glyph4-1"
+         x="416.39996"
+         y="156.10011"
+         id="use336"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(1.6,0)"
+       style="fill:#000000;fill-opacity:1"
+       id="g338">
+      <use
+         xlink:href="#glyph4-2"
+         x="421.07999"
+         y="156.10011"
+         id="use340"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(1.6,0)"
+       style="fill:#000000;fill-opacity:1"
+       id="g342">
+      <use
+         xlink:href="#glyph4-3"
+         x="425.03983"
+         y="156.10011"
+         id="use344"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(1.6,0)"
+       style="fill:#000000;fill-opacity:1"
+       id="g346">
+      <use
+         xlink:href="#glyph4-4"
+         x="429.23984"
+         y="156.10011"
+         id="use348"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(1.6,0)"
+       style="fill:#000000;fill-opacity:1"
+       id="g350">
+      <use
+         xlink:href="#glyph4-5"
+         x="432.95984"
+         y="156.10011"
+         id="use352"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(1.6,0)"
+       style="fill:#000000;fill-opacity:1"
+       id="g354">
+      <use
+         xlink:href="#glyph4-6"
+         x="439.07965"
+         y="156.10011"
+         id="use356"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(1.6,0)"
+       style="fill:#000000;fill-opacity:1"
+       id="g358">
+      <use
+         xlink:href="#glyph4-0"
+         x="443.39969"
+         y="156.10011"
+         id="use360"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(1.6,0)"
+       style="fill:#000000;fill-opacity:1"
+       id="g362">
+      <use
+         xlink:href="#glyph4-7"
+         x="446.99973"
+         y="156.10011"
+         id="use364"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(1.6,0)"
+       style="fill:#000000;fill-opacity:1"
+       id="g366">
+      <use
+         xlink:href="#glyph4-8"
+         x="449.99973"
+         y="156.10011"
+         id="use368"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(1.6,0)"
+       style="fill:#000000;fill-opacity:1"
+       id="g370">
+      <use
+         xlink:href="#glyph4-2"
+         x="453.95972"
+         y="156.10011"
+         id="use372"
+         width="595"
+         height="842" />
+    </g>
+  </g>
+</svg>
diff --git a/specs/XKB/XKBlib-4.svg b/specs/XKB/XKBlib-4.svg
new file mode 100644 (file)
index 0000000..fbe85e7
--- /dev/null
@@ -0,0 +1,574 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="220"
+   height="30"
+   viewBox="0 0 176 24"
+   version="1.1"
+   id="svg2"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="XKBlib-4.svg">
+  <metadata
+     id="metadata182">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1016"
+     inkscape:window-height="718"
+     id="namedview180"
+     showgrid="false"
+     inkscape:zoom="3.2545455"
+     inkscape:cx="146.41061"
+     inkscape:cy="15"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg2" />
+  <defs
+     id="defs4">
+    <g
+       id="g6">
+      <symbol
+         overflow="visible"
+         id="glyph0-0"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 3.953125,-3.78125 c -0.171875,0 -0.296875,0 -0.4375,0.125 -0.171875,0.15625 -0.1875,0.328125 -0.1875,0.390625 0,0.25 0.1875,0.359375 0.375,0.359375 0.28125,0 0.546875,-0.25 0.546875,-0.640625 0,-0.484375 -0.46875,-0.859375 -1.171875,-0.859375 -1.34375,0 -2.671875,1.421875 -2.671875,2.828125 0,0.90625 0.578125,1.6875 1.625,1.6875 1.421875,0 2.25,-1.0625 2.25,-1.171875 0,-0.0625 -0.046875,-0.140625 -0.109375,-0.140625 -0.0625,0 -0.078125,0.03125 -0.140625,0.109375 -0.78125,0.984375 -1.875,0.984375 -1.984375,0.984375 -0.625,0 -0.90625,-0.484375 -0.90625,-1.09375 0,-0.40625 0.203125,-1.375 0.546875,-1.984375 0.3125,-0.578125 0.859375,-1 1.40625,-1 0.328125,0 0.71875,0.125 0.859375,0.40625 z m 0,0"
+           id="path9"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph0-1"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="M 3.484375,-0.5625 C 3.59375,-0.15625 3.953125,0.109375 4.375,0.109375 4.71875,0.109375 4.953125,-0.125 5.109375,-0.4375 5.28125,-0.796875 5.40625,-1.40625 5.40625,-1.421875 c 0,-0.109375 -0.078125,-0.109375 -0.109375,-0.109375 -0.109375,0 -0.109375,0.046875 -0.140625,0.1875 -0.140625,0.5625 -0.328125,1.234375 -0.75,1.234375 -0.203125,0 -0.3125,-0.125 -0.3125,-0.453125 0,-0.21875 0.125,-0.6875 0.203125,-1.046875 L 4.578125,-2.6875 C 4.609375,-2.828125 4.703125,-3.203125 4.75,-3.359375 4.796875,-3.59375 4.890625,-3.96875 4.890625,-4.03125 c 0,-0.171875 -0.140625,-0.265625 -0.28125,-0.265625 -0.046875,0 -0.3125,0.015625 -0.390625,0.34375 -0.1875,0.734375 -0.625,2.484375 -0.75,3 -0.015625,0.046875 -0.40625,0.84375 -1.140625,0.84375 -0.515625,0 -0.609375,-0.453125 -0.609375,-0.8125 0,-0.5625 0.28125,-1.34375 0.53125,-2.03125 0.125,-0.3125 0.171875,-0.453125 0.171875,-0.640625 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.953125,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.25,-0.859375 0.640625,-1.234375 1.015625,-1.234375 0.09375,0 0.25,0.015625 0.25,0.328125 0,0.234375 -0.109375,0.53125 -0.171875,0.671875 -0.375,1 -0.578125,1.609375 -0.578125,2.09375 0,0.953125 0.6875,1.203125 1.21875,1.203125 0.65625,0 1.015625,-0.453125 1.1875,-0.671875 z m 0,0"
+           id="path12"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph0-2"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 0.875,-0.59375 c -0.03125,0.15625 -0.09375,0.390625 -0.09375,0.4375 0,0.171875 0.140625,0.265625 0.296875,0.265625 0.125,0 0.296875,-0.078125 0.375,-0.28125 C 1.46875,-0.203125 1.796875,-1.5625 1.84375,-1.75 c 0.078125,-0.328125 0.265625,-1.015625 0.3125,-1.296875 0.046875,-0.125 0.328125,-0.59375 0.5625,-0.8125 0.078125,-0.0625 0.375,-0.328125 0.796875,-0.328125 0.265625,0 0.40625,0.125 0.421875,0.125 -0.296875,0.046875 -0.515625,0.28125 -0.515625,0.546875 0,0.15625 0.109375,0.34375 0.375,0.34375 0.265625,0 0.546875,-0.234375 0.546875,-0.59375 0,-0.34375 -0.3125,-0.640625 -0.828125,-0.640625 C 2.875,-4.40625 2.4375,-3.921875 2.25,-3.640625 2.15625,-4.09375 1.796875,-4.40625 1.328125,-4.40625 0.875,-4.40625 0.6875,-4.015625 0.59375,-3.84375 0.421875,-3.5 0.296875,-2.90625 0.296875,-2.875 c 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.015625 0.171875,-0.234375 0.171875,-0.703125 0.375,-1.1875 0.734375,-1.1875 0.15625,0 0.296875,0.078125 0.296875,0.453125 0,0.21875 -0.03125,0.328125 -0.15625,0.84375 z m 0,0"
+           id="path15"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph0-3"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0"
+           id="path18"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph0-4"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 1.859375,-2.296875 c 0.296875,0 1.03125,-0.03125 1.53125,-0.234375 0.703125,-0.296875 0.75,-0.890625 0.75,-1.03125 0,-0.4375 -0.375,-0.84375 -1.0625,-0.84375 -1.109375,0 -2.625,0.96875 -2.625,2.71875 0,1.015625 0.59375,1.796875 1.578125,1.796875 1.421875,0 2.25,-1.0625 2.25,-1.171875 0,-0.0625 -0.046875,-0.140625 -0.109375,-0.140625 -0.0625,0 -0.078125,0.03125 -0.140625,0.109375 -0.78125,0.984375 -1.875,0.984375 -1.984375,0.984375 -0.78125,0 -0.875,-0.84375 -0.875,-1.15625 0,-0.125 0.015625,-0.421875 0.15625,-1.03125 z m -0.46875,-0.21875 C 1.78125,-4.03125 2.8125,-4.1875 3.078125,-4.1875 c 0.453125,0 0.734375,0.296875 0.734375,0.625 0,1.046875 -1.59375,1.046875 -2.015625,1.046875 z m 0,0"
+           id="path21"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph0-5"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 3.015625,-3.234375 0.96875,0 c 0.75,0 0.828125,0.15625 0.828125,0.4375 0,0.078125 0,0.1875 -0.0625,0.5 C 4.71875,-2.25 4.71875,-2.21875 4.71875,-2.1875 c 0,0.078125 0.0625,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.203125 L 5.53125,-4.453125 C 5.5625,-4.5625 5.5625,-4.578125 5.5625,-4.609375 5.5625,-4.625 5.546875,-4.71875 5.4375,-4.71875 5.34375,-4.71875 5.328125,-4.671875 5.296875,-4.5 5.078125,-3.734375 4.859375,-3.546875 4,-3.546875 l -0.90625,0 0.640625,-2.53125 C 3.828125,-6.4375 3.84375,-6.46875 4.28125,-6.46875 l 1.3125,0 c 1.21875,0 1.453125,0.328125 1.453125,1.09375 0,0.234375 0,0.265625 -0.03125,0.546875 C 7,-4.703125 7,-4.6875 7,-4.65625 c 0,0.046875 0.03125,0.125 0.125,0.125 0.109375,0 0.109375,-0.0625 0.125,-0.25 L 7.453125,-6.515625 C 7.484375,-6.78125 7.4375,-6.78125 7.1875,-6.78125 l -4.890625,0 c -0.1875,0 -0.296875,0 -0.296875,0.203125 0,0.109375 0.09375,0.109375 0.28125,0.109375 0.375,0 0.65625,0 0.65625,0.171875 0,0.046875 0,0.0625 -0.0625,0.25 L 1.5625,-0.78125 c -0.09375,0.390625 -0.109375,0.46875 -0.90625,0.46875 -0.171875,0 -0.28125,0 -0.28125,0.1875 C 0.375,0 0.5,0 0.53125,0 0.8125,0 1.5625,-0.03125 1.84375,-0.03125 2.171875,-0.03125 3,0 3.328125,0 3.421875,0 3.53125,0 3.53125,-0.1875 3.53125,-0.265625 3.484375,-0.296875 3.484375,-0.296875 3.453125,-0.3125 3.421875,-0.3125 3.203125,-0.3125 c -0.21875,0 -0.265625,0 -0.515625,-0.015625 -0.296875,-0.03125 -0.328125,-0.078125 -0.328125,-0.203125 0,-0.015625 0,-0.078125 0.046875,-0.21875 z m 0,0"
+           id="path24"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph0-6"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="M 3.71875,-3.765625 C 3.53125,-4.140625 3.25,-4.40625 2.796875,-4.40625 c -1.15625,0 -2.390625,1.46875 -2.390625,2.921875 0,0.9375 0.546875,1.59375 1.3125,1.59375 0.203125,0 0.703125,-0.046875 1.296875,-0.75 0.078125,0.421875 0.4375,0.75 0.90625,0.75 0.359375,0 0.578125,-0.234375 0.75,-0.546875 0.15625,-0.359375 0.296875,-0.96875 0.296875,-0.984375 0,-0.109375 -0.09375,-0.109375 -0.125,-0.109375 -0.09375,0 -0.109375,0.046875 -0.140625,0.1875 -0.171875,0.640625 -0.34375,1.234375 -0.75,1.234375 -0.28125,0 -0.296875,-0.265625 -0.296875,-0.453125 0,-0.21875 0.015625,-0.3125 0.125,-0.75 C 3.890625,-1.71875 3.90625,-1.828125 4,-2.203125 L 4.359375,-3.59375 c 0.0625,-0.28125 0.0625,-0.296875 0.0625,-0.34375 0,-0.171875 -0.109375,-0.265625 -0.28125,-0.265625 -0.25,0 -0.390625,0.21875 -0.421875,0.4375 z M 3.078125,-1.1875 C 3.015625,-1 3.015625,-0.984375 2.875,-0.8125 2.4375,-0.265625 2.03125,-0.109375 1.75,-0.109375 c -0.5,0 -0.640625,-0.546875 -0.640625,-0.9375 0,-0.5 0.3125,-1.71875 0.546875,-2.1875 0.3125,-0.578125 0.75,-0.953125 1.15625,-0.953125 0.640625,0 0.78125,0.8125 0.78125,0.875 0,0.0625 -0.015625,0.125 -0.03125,0.171875 z m 0,0"
+           id="path27"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph0-7"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 2.046875,-3.984375 0.9375,0 c 0.203125,0 0.3125,0 0.3125,-0.203125 0,-0.109375 -0.109375,-0.109375 -0.28125,-0.109375 l -0.875,0 C 2.5,-5.71875 2.546875,-5.90625 2.546875,-5.96875 c 0,-0.171875 -0.125,-0.265625 -0.296875,-0.265625 -0.03125,0 -0.3125,0 -0.390625,0.359375 l -0.390625,1.578125 -0.9375,0 c -0.203125,0 -0.296875,0 -0.296875,0.1875 0,0.125 0.078125,0.125 0.28125,0.125 l 0.875,0 C 0.671875,-1.15625 0.625,-0.984375 0.625,-0.8125 0.625,-0.265625 1,0.109375 1.546875,0.109375 2.5625,0.109375 3.125,-1.34375 3.125,-1.421875 3.125,-1.53125 3.046875,-1.53125 3.015625,-1.53125 2.921875,-1.53125 2.90625,-1.5 2.859375,-1.390625 2.4375,-0.34375 1.90625,-0.109375 1.5625,-0.109375 c -0.203125,0 -0.3125,-0.125 -0.3125,-0.453125 0,-0.25 0.03125,-0.3125 0.0625,-0.484375 z m 0,0"
+           id="path30"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph0-8"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 4.671875,-2.71875 c 0,-1.046875 -0.6875,-1.6875 -1.59375,-1.6875 -1.328125,0 -2.671875,1.421875 -2.671875,2.828125 0,0.984375 0.671875,1.6875 1.59375,1.6875 1.328125,0 2.671875,-1.375 2.671875,-2.828125 z m -2.65625,2.609375 c -0.4375,0 -0.875,-0.3125 -0.875,-1.09375 0,-0.484375 0.265625,-1.5625 0.578125,-2.0625 0.5,-0.765625 1.078125,-0.921875 1.359375,-0.921875 0.578125,0 0.875,0.484375 0.875,1.078125 0,0.390625 -0.203125,1.4375 -0.578125,2.078125 -0.359375,0.578125 -0.90625,0.921875 -1.359375,0.921875 z m 0,0"
+           id="path33"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph1-0"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 3.296875,2.390625 c 0,-0.03125 0,-0.046875 -0.171875,-0.21875 C 1.890625,0.921875 1.5625,-0.96875 1.5625,-2.5 c 0,-1.734375 0.375,-3.46875 1.609375,-4.703125 0.125,-0.125 0.125,-0.140625 0.125,-0.171875 0,-0.078125 -0.03125,-0.109375 -0.09375,-0.109375 -0.109375,0 -1,0.6875 -1.59375,1.953125 -0.5,1.09375 -0.625,2.203125 -0.625,3.03125 0,0.78125 0.109375,1.984375 0.65625,3.125 C 2.25,1.84375 3.09375,2.5 3.203125,2.5 c 0.0625,0 0.09375,-0.03125 0.09375,-0.109375 z m 0,0"
+           id="path36"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph1-1"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 2.875,-2.5 c 0,-0.765625 -0.109375,-1.96875 -0.65625,-3.109375 -0.59375,-1.21875 -1.453125,-1.875 -1.546875,-1.875 -0.0625,0 -0.109375,0.046875 -0.109375,0.109375 0,0.03125 0,0.046875 0.1875,0.234375 0.984375,0.984375 1.546875,2.5625 1.546875,4.640625 0,1.71875 -0.359375,3.46875 -1.59375,4.71875 C 0.5625,2.34375 0.5625,2.359375 0.5625,2.390625 0.5625,2.453125 0.609375,2.5 0.671875,2.5 0.765625,2.5 1.671875,1.8125 2.25,0.546875 2.765625,-0.546875 2.875,-1.65625 2.875,-2.5 z m 0,0"
+           id="path39"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph1-2"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 6.84375,-3.265625 c 0.15625,0 0.34375,0 0.34375,-0.1875 C 7.1875,-3.65625 7,-3.65625 6.859375,-3.65625 l -5.96875,0 c -0.140625,0 -0.328125,0 -0.328125,0.203125 0,0.1875 0.1875,0.1875 0.328125,0.1875 z m 0.015625,1.9375 c 0.140625,0 0.328125,0 0.328125,-0.203125 0,-0.1875 -0.1875,-0.1875 -0.34375,-0.1875 l -5.953125,0 c -0.140625,0 -0.328125,0 -0.328125,0.1875 0,0.203125 0.1875,0.203125 0.328125,0.203125 z m 0,0"
+           id="path42"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph1-3"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 2.9375,-6.375 c 0,-0.25 0,-0.265625 -0.234375,-0.265625 C 2.078125,-6 1.203125,-6 0.890625,-6 l 0,0.3125 c 0.203125,0 0.78125,0 1.296875,-0.265625 l 0,5.171875 c 0,0.359375 -0.03125,0.46875 -0.921875,0.46875 l -0.3125,0 0,0.3125 c 0.34375,-0.03125 1.203125,-0.03125 1.609375,-0.03125 0.390625,0 1.265625,0 1.609375,0.03125 l 0,-0.3125 -0.3125,0 c -0.90625,0 -0.921875,-0.109375 -0.921875,-0.46875 z m 0,0"
+           id="path45"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph1-4"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 4.078125,-2.296875 2.78125,0 C 7,-2.296875 7.1875,-2.296875 7.1875,-2.5 7.1875,-2.6875 7,-2.6875 6.859375,-2.6875 l -2.78125,0 0,-2.796875 c 0,-0.140625 0,-0.328125 -0.203125,-0.328125 -0.203125,0 -0.203125,0.1875 -0.203125,0.328125 l 0,2.796875 -2.78125,0 c -0.140625,0 -0.328125,0 -0.328125,0.1875 0,0.203125 0.1875,0.203125 0.328125,0.203125 l 2.78125,0 0,2.796875 c 0,0.140625 0,0.328125 0.203125,0.328125 0.203125,0 0.203125,-0.1875 0.203125,-0.328125 z m 0,0"
+           id="path48"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph1-5"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 4.578125,-3.1875 c 0,-0.796875 -0.046875,-1.59375 -0.390625,-2.328125 -0.453125,-0.96875 -1.28125,-1.125 -1.6875,-1.125 -0.609375,0 -1.328125,0.265625 -1.75,1.1875 -0.3125,0.6875 -0.359375,1.46875 -0.359375,2.265625 0,0.75 0.03125,1.640625 0.453125,2.40625 0.421875,0.796875 1.15625,1 1.640625,1 0.53125,0 1.296875,-0.203125 1.734375,-1.15625 0.3125,-0.6875 0.359375,-1.46875 0.359375,-2.25 z M 2.484375,0 C 2.09375,0 1.5,-0.25 1.328125,-1.203125 1.21875,-1.796875 1.21875,-2.71875 1.21875,-3.3125 c 0,-0.640625 0,-1.296875 0.078125,-1.828125 0.1875,-1.1875 0.9375,-1.28125 1.1875,-1.28125 0.328125,0 0.984375,0.1875 1.171875,1.171875 0.109375,0.5625 0.109375,1.3125 0.109375,1.9375 0,0.75 0,1.421875 -0.109375,2.0625 C 3.5,-0.296875 2.9375,0 2.484375,0 z m 0,0"
+           id="path51"
+           inkscape:connector-curvature="0" />
+      </symbol>
+    </g>
+  </defs>
+  <g
+     id="g3346"
+     transform="translate(-0.79999683,3.8305664e-6)">
+    <g
+       transform="translate(-215.6968,-132.76614)"
+       style="fill:#000000;fill-opacity:1"
+       id="g54">
+      <use
+         xlink:href="#glyph0-0"
+         x="233.16"
+         y="146.86"
+         id="use56"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(-215.6968,-132.76614)"
+       style="fill:#000000;fill-opacity:1"
+       id="g58">
+      <use
+         xlink:href="#glyph0-1"
+         x="237.48"
+         y="146.86"
+         id="use60"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(-215.6968,-132.76614)"
+       style="fill:#000000;fill-opacity:1"
+       id="g62">
+      <use
+         xlink:href="#glyph0-2"
+         x="243.24001"
+         y="146.86"
+         id="use64"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(-215.6968,-132.76614)"
+       style="fill:#000000;fill-opacity:1"
+       id="g66">
+      <use
+         xlink:href="#glyph0-3"
+         x="247.92017"
+         y="146.86"
+         id="use68"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(-215.6968,-132.76614)"
+       style="fill:#000000;fill-opacity:1"
+       id="g70">
+      <use
+         xlink:href="#glyph0-4"
+         x="253.08032"
+         y="146.86"
+         id="use72"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(-215.6968,-132.76614)"
+       style="fill:#000000;fill-opacity:1"
+       id="g74">
+      <use
+         xlink:href="#glyph0-5"
+         x="257.76035"
+         y="146.86"
+         id="use76"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(-217.2968,-132.76614)"
+       style="fill:#000000;fill-opacity:1"
+       id="g78">
+      <use
+         xlink:href="#glyph0-6"
+         x="265.56039"
+         y="146.86"
+         id="use80"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(-217.2968,-132.76614)"
+       style="fill:#000000;fill-opacity:1"
+       id="g82">
+      <use
+         xlink:href="#glyph0-0"
+         x="270.84039"
+         y="146.86"
+         id="use84"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(-217.2968,-132.76614)"
+       style="fill:#000000;fill-opacity:1"
+       id="g86">
+      <use
+         xlink:href="#glyph0-7"
+         x="275.1604"
+         y="146.86"
+         id="use88"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(-217.2968,-132.76614)"
+       style="fill:#000000;fill-opacity:1"
+       id="g90">
+      <use
+         xlink:href="#glyph0-8"
+         x="278.76041"
+         y="146.86"
+         id="use92"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(-217.2968,-132.76614)"
+       style="fill:#000000;fill-opacity:1"
+       id="g94">
+      <use
+         xlink:href="#glyph0-2"
+         x="283.56039"
+         y="146.86"
+         id="use96"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(-217.2968,-132.76614)"
+       style="fill:#000000;fill-opacity:1"
+       id="g98">
+      <use
+         xlink:href="#glyph1-0"
+         x="288.24051"
+         y="146.86"
+         id="use100"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(-217.2968,-132.76614)"
+       style="fill:#000000;fill-opacity:1"
+       id="g102">
+      <use
+         xlink:href="#glyph0-0"
+         x="292.08035"
+         y="146.86"
+         id="use104"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(-217.2968,-132.76614)"
+       style="fill:#000000;fill-opacity:1"
+       id="g106">
+      <use
+         xlink:href="#glyph0-1"
+         x="296.40033"
+         y="146.86"
+         id="use108"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(-217.2968,-132.76614)"
+       style="fill:#000000;fill-opacity:1"
+       id="g110">
+      <use
+         xlink:href="#glyph0-2"
+         x="302.16034"
+         y="146.86"
+         id="use112"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(-217.2968,-132.76614)"
+       style="fill:#000000;fill-opacity:1"
+       id="g114">
+      <use
+         xlink:href="#glyph0-3"
+         x="306.84052"
+         y="146.86"
+         id="use116"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(-217.2968,-132.76614)"
+       style="fill:#000000;fill-opacity:1"
+       id="g118">
+      <use
+         xlink:href="#glyph0-4"
+         x="312.00067"
+         y="146.86"
+         id="use120"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(-217.2968,-132.76614)"
+       style="fill:#000000;fill-opacity:1"
+       id="g122">
+      <use
+         xlink:href="#glyph1-1"
+         x="316.68073"
+         y="146.86"
+         id="use124"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(-217.2968,-132.76614)"
+       style="fill:#000000;fill-opacity:1"
+       id="g126">
+      <use
+         xlink:href="#glyph1-2"
+         x="323.40067"
+         y="146.86"
+         id="use128"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(-217.2968,-132.76614)"
+       style="fill:#000000;fill-opacity:1"
+       id="g130">
+      <use
+         xlink:href="#glyph1-3"
+         x="333.96082"
+         y="146.86"
+         id="use132"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(-217.2968,-132.76614)"
+       style="fill:#000000;fill-opacity:1"
+       id="g134">
+      <use
+         xlink:href="#glyph1-4"
+         x="341.16083"
+         y="146.86"
+         id="use136"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(-217.2968,-132.76614)"
+       style="fill:#000000;fill-opacity:1"
+       id="g138">
+      <use
+         xlink:href="#glyph0-0"
+         x="352.31985"
+         y="140.01978"
+         id="use140"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(-217.2968,-132.76614)"
+       style="fill:#000000;fill-opacity:1"
+       id="g142">
+      <use
+         xlink:href="#glyph0-1"
+         x="356.63983"
+         y="140.01978"
+         id="use144"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(-217.2968,-132.76614)"
+       style="fill:#000000;fill-opacity:1"
+       id="g146">
+      <use
+         xlink:href="#glyph0-2"
+         x="362.39984"
+         y="140.01978"
+         id="use148"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(-217.2968,-132.76614)"
+       style="fill:#000000;fill-opacity:1"
+       id="g150">
+      <use
+         xlink:href="#glyph0-3"
+         x="367.08002"
+         y="140.01978"
+         id="use152"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(-217.2968,-132.76614)"
+       style="fill:#000000;fill-opacity:1"
+       id="g154">
+      <use
+         xlink:href="#glyph0-4"
+         x="372.24014"
+         y="140.01978"
+         id="use156"
+         width="595"
+         height="842" />
+    </g>
+    <path
+       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 135.01179,11.34714 24.71875,0 0,0.48047 -24.71875,0 z m 0,0"
+       id="path158"
+       inkscape:connector-curvature="0" />
+    <g
+       transform="translate(-217.2968,-132.76614)"
+       style="fill:#000000;fill-opacity:1"
+       id="g160">
+      <use
+         xlink:href="#glyph1-3"
+         x="354.60001"
+         y="153.7"
+         id="use162"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(-217.2968,-132.76614)"
+       style="fill:#000000;fill-opacity:1"
+       id="g164">
+      <use
+         xlink:href="#glyph1-5"
+         x="359.63998"
+         y="153.7"
+         id="use166"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(-217.2968,-132.76614)"
+       style="fill:#000000;fill-opacity:1"
+       id="g168">
+      <use
+         xlink:href="#glyph1-5"
+         x="364.67999"
+         y="153.7"
+         id="use170"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(-217.2968,-132.76614)"
+       style="fill:#000000;fill-opacity:1"
+       id="g172">
+      <use
+         xlink:href="#glyph1-5"
+         x="369.71997"
+         y="153.7"
+         id="use174"
+         width="595"
+         height="842" />
+    </g>
+  </g>
+</svg>
diff --git a/specs/XKB/XKBlib-5.svg b/specs/XKB/XKBlib-5.svg
new file mode 100644 (file)
index 0000000..b8dd1c9
--- /dev/null
@@ -0,0 +1,542 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="200"
+   height="25"
+   viewBox="0 0 160 20"
+   version="1.1"
+   id="svg2"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="XKBlib-5.svg">
+  <metadata
+     id="metadata171">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1016"
+     inkscape:window-height="718"
+     id="namedview169"
+     showgrid="false"
+     inkscape:zoom="3.58"
+     inkscape:cx="133.10056"
+     inkscape:cy="12.5"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg2" />
+  <defs
+     id="defs4">
+    <g
+       id="g6">
+      <symbol
+         overflow="visible"
+         id="glyph0-0"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 3.296875,2.390625 c 0,-0.03125 0,-0.046875 -0.171875,-0.21875 C 1.890625,0.921875 1.5625,-0.96875 1.5625,-2.5 c 0,-1.734375 0.375,-3.46875 1.609375,-4.703125 0.125,-0.125 0.125,-0.140625 0.125,-0.171875 0,-0.078125 -0.03125,-0.109375 -0.09375,-0.109375 -0.109375,0 -1,0.6875 -1.59375,1.953125 -0.5,1.09375 -0.625,2.203125 -0.625,3.03125 0,0.78125 0.109375,1.984375 0.65625,3.125 C 2.25,1.84375 3.09375,2.5 3.203125,2.5 c 0.0625,0 0.09375,-0.03125 0.09375,-0.109375 z m 0,0"
+           id="path9"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph0-1"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 2.875,-2.5 c 0,-0.765625 -0.109375,-1.96875 -0.65625,-3.109375 -0.59375,-1.21875 -1.453125,-1.875 -1.546875,-1.875 -0.0625,0 -0.109375,0.046875 -0.109375,0.109375 0,0.03125 0,0.046875 0.1875,0.234375 0.984375,0.984375 1.546875,2.5625 1.546875,4.640625 0,1.71875 -0.359375,3.46875 -1.59375,4.71875 C 0.5625,2.34375 0.5625,2.359375 0.5625,2.390625 0.5625,2.453125 0.609375,2.5 0.671875,2.5 0.765625,2.5 1.671875,1.8125 2.25,0.546875 2.765625,-0.546875 2.875,-1.65625 2.875,-2.5 z m 0,0"
+           id="path12"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph0-2"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 2.9375,-6.375 c 0,-0.25 0,-0.265625 -0.234375,-0.265625 C 2.078125,-6 1.203125,-6 0.890625,-6 l 0,0.3125 c 0.203125,0 0.78125,0 1.296875,-0.265625 l 0,5.171875 c 0,0.359375 -0.03125,0.46875 -0.921875,0.46875 l -0.3125,0 0,0.3125 c 0.34375,-0.03125 1.203125,-0.03125 1.609375,-0.03125 0.390625,0 1.265625,0 1.609375,0.03125 l 0,-0.3125 -0.3125,0 c -0.90625,0 -0.921875,-0.109375 -0.921875,-0.46875 z m 0,0"
+           id="path15"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph1-0"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 0.875,-0.59375 c -0.03125,0.15625 -0.09375,0.390625 -0.09375,0.4375 0,0.171875 0.140625,0.265625 0.296875,0.265625 0.125,0 0.296875,-0.078125 0.375,-0.28125 0,-0.015625 0.125,-0.484375 0.1875,-0.734375 l 0.21875,-0.890625 C 1.90625,-2.03125 1.96875,-2.25 2.03125,-2.46875 c 0.03125,-0.171875 0.109375,-0.46875 0.125,-0.5 0.140625,-0.3125 0.671875,-1.21875 1.625,-1.21875 0.453125,0 0.53125,0.375 0.53125,0.703125 0,0.25 -0.0625,0.53125 -0.140625,0.828125 L 3.890625,-1.5 3.6875,-0.75 c -0.03125,0.203125 -0.125,0.546875 -0.125,0.59375 0,0.171875 0.140625,0.265625 0.28125,0.265625 0.3125,0 0.375,-0.25 0.453125,-0.5625 0.140625,-0.5625 0.515625,-2.015625 0.59375,-2.40625 0.03125,-0.125 0.5625,-1.328125 1.65625,-1.328125 0.421875,0 0.53125,0.34375 0.53125,0.703125 0,0.5625 -0.421875,1.703125 -0.625,2.234375 -0.078125,0.234375 -0.125,0.34375 -0.125,0.546875 0,0.46875 0.34375,0.8125 0.8125,0.8125 0.9375,0 1.3125,-1.453125 1.3125,-1.53125 0,-0.109375 -0.09375,-0.109375 -0.125,-0.109375 -0.09375,0 -0.09375,0.03125 -0.140625,0.1875 -0.15625,0.53125 -0.46875,1.234375 -1.015625,1.234375 -0.171875,0 -0.25,-0.09375 -0.25,-0.328125 0,-0.25 0.09375,-0.484375 0.1875,-0.703125 0.1875,-0.53125 0.609375,-1.625 0.609375,-2.203125 0,-0.640625 -0.40625,-1.0625 -1.15625,-1.0625 -0.734375,0 -1.25,0.4375 -1.625,0.96875 0,-0.125 -0.03125,-0.46875 -0.3125,-0.703125 -0.25,-0.21875 -0.5625,-0.265625 -0.8125,-0.265625 -0.90625,0 -1.390625,0.640625 -1.5625,0.875 -0.046875,-0.578125 -0.46875,-0.875 -0.921875,-0.875 -0.453125,0 -0.640625,0.390625 -0.734375,0.5625 -0.171875,0.359375 -0.296875,0.9375 -0.296875,0.96875 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.015625 0.171875,-0.234375 0.171875,-0.703125 0.375,-1.1875 0.734375,-1.1875 0.15625,0 0.296875,0.078125 0.296875,0.453125 0,0.21875 -0.03125,0.328125 -0.15625,0.84375 z m 0,0"
+           id="path18"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph1-1"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 2.859375,-6.8125 c 0,0 0,-0.109375 -0.125,-0.109375 -0.234375,0 -0.953125,0.078125 -1.21875,0.109375 -0.078125,0 -0.1875,0.015625 -0.1875,0.1875 0,0.125 0.09375,0.125 0.234375,0.125 0.484375,0 0.5,0.0625 0.5,0.171875 L 2.03125,-6.125 0.59375,-0.390625 c -0.046875,0.140625 -0.046875,0.15625 -0.046875,0.21875 0,0.234375 0.203125,0.28125 0.296875,0.28125 0.125,0 0.265625,-0.09375 0.328125,-0.203125 0.046875,-0.09375 0.5,-1.9375 0.5625,-2.1875 0.34375,0.03125 1.15625,0.1875 1.15625,0.84375 0,0.078125 0,0.109375 -0.03125,0.21875 -0.015625,0.109375 -0.03125,0.234375 -0.03125,0.34375 0,0.578125 0.390625,0.984375 0.90625,0.984375 0.296875,0 0.578125,-0.15625 0.796875,-0.53125 0.25,-0.4375 0.359375,-0.984375 0.359375,-1 0,-0.109375 -0.09375,-0.109375 -0.125,-0.109375 -0.09375,0 -0.109375,0.046875 -0.140625,0.1875 -0.203125,0.71875 -0.421875,1.234375 -0.859375,1.234375 -0.203125,0 -0.328125,-0.109375 -0.328125,-0.46875 0,-0.171875 0.046875,-0.40625 0.078125,-0.5625 C 3.5625,-1.3125 3.5625,-1.34375 3.5625,-1.453125 3.5625,-2.09375 2.9375,-2.375 2.078125,-2.5 2.390625,-2.671875 2.71875,-2.984375 2.9375,-3.234375 3.421875,-3.765625 3.875,-4.1875 4.359375,-4.1875 c 0.0625,0 0.078125,0 0.09375,0.015625 0.125,0.015625 0.125,0.015625 0.21875,0.078125 0.015625,0 0.015625,0.015625 0.03125,0.03125 -0.46875,0.03125 -0.5625,0.421875 -0.5625,0.546875 0,0.15625 0.109375,0.34375 0.375,0.34375 0.265625,0 0.546875,-0.21875 0.546875,-0.609375 0,-0.296875 -0.234375,-0.625 -0.671875,-0.625 -0.28125,0 -0.734375,0.078125 -1.453125,0.875 -0.34375,0.375 -0.734375,0.78125 -1.109375,0.921875 z m 0,0"
+           id="path21"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph1-2"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="M 3.71875,-3.765625 C 3.53125,-4.140625 3.25,-4.40625 2.796875,-4.40625 c -1.15625,0 -2.390625,1.46875 -2.390625,2.921875 0,0.9375 0.546875,1.59375 1.3125,1.59375 0.203125,0 0.703125,-0.046875 1.296875,-0.75 0.078125,0.421875 0.4375,0.75 0.90625,0.75 0.359375,0 0.578125,-0.234375 0.75,-0.546875 0.15625,-0.359375 0.296875,-0.96875 0.296875,-0.984375 0,-0.109375 -0.09375,-0.109375 -0.125,-0.109375 -0.09375,0 -0.109375,0.046875 -0.140625,0.1875 -0.171875,0.640625 -0.34375,1.234375 -0.75,1.234375 -0.28125,0 -0.296875,-0.265625 -0.296875,-0.453125 0,-0.21875 0.015625,-0.3125 0.125,-0.75 C 3.890625,-1.71875 3.90625,-1.828125 4,-2.203125 L 4.359375,-3.59375 c 0.0625,-0.28125 0.0625,-0.296875 0.0625,-0.34375 0,-0.171875 -0.109375,-0.265625 -0.28125,-0.265625 -0.25,0 -0.390625,0.21875 -0.421875,0.4375 z M 3.078125,-1.1875 C 3.015625,-1 3.015625,-0.984375 2.875,-0.8125 2.4375,-0.265625 2.03125,-0.109375 1.75,-0.109375 c -0.5,0 -0.640625,-0.546875 -0.640625,-0.9375 0,-0.5 0.3125,-1.71875 0.546875,-2.1875 0.3125,-0.578125 0.75,-0.953125 1.15625,-0.953125 0.640625,0 0.78125,0.8125 0.78125,0.875 0,0.0625 -0.015625,0.125 -0.03125,0.171875 z m 0,0"
+           id="path24"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph1-3"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="M 3.328125,-3.015625 C 3.390625,-3.265625 3.625,-4.1875 4.3125,-4.1875 c 0.046875,0 0.296875,0 0.5,0.125 C 4.53125,-4 4.34375,-3.765625 4.34375,-3.515625 c 0,0.15625 0.109375,0.34375 0.375,0.34375 0.21875,0 0.53125,-0.171875 0.53125,-0.578125 0,-0.515625 -0.578125,-0.65625 -0.921875,-0.65625 -0.578125,0 -0.921875,0.53125 -1.046875,0.75 -0.25,-0.65625 -0.78125,-0.75 -1.078125,-0.75 -1.03125,0 -1.609375,1.28125 -1.609375,1.53125 0,0.109375 0.109375,0.109375 0.125,0.109375 0.078125,0 0.109375,-0.03125 0.125,-0.109375 0.34375,-1.0625 1,-1.3125 1.34375,-1.3125 0.1875,0 0.53125,0.09375 0.53125,0.671875 0,0.3125 -0.171875,0.96875 -0.53125,2.375 -0.15625,0.609375 -0.515625,1.03125 -0.953125,1.03125 -0.0625,0 -0.28125,0 -0.5,-0.125 0.25,-0.0625 0.46875,-0.265625 0.46875,-0.546875 0,-0.265625 -0.21875,-0.34375 -0.359375,-0.34375 -0.3125,0 -0.546875,0.25 -0.546875,0.578125 0,0.453125 0.484375,0.65625 0.921875,0.65625 0.671875,0 1.03125,-0.703125 1.046875,-0.75 0.125,0.359375 0.484375,0.75 1.078125,0.75 1.03125,0 1.59375,-1.28125 1.59375,-1.53125 0,-0.109375 -0.078125,-0.109375 -0.109375,-0.109375 -0.09375,0 -0.109375,0.046875 -0.140625,0.109375 -0.328125,1.078125 -1,1.3125 -1.3125,1.3125 -0.390625,0 -0.546875,-0.3125 -0.546875,-0.65625 0,-0.21875 0.046875,-0.4375 0.15625,-0.875 z m 0,0"
+           id="path27"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph1-4"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="M 3.890625,-3.734375 C 3.625,-3.71875 3.421875,-3.5 3.421875,-3.28125 c 0,0.140625 0.09375,0.296875 0.3125,0.296875 0.21875,0 0.453125,-0.171875 0.453125,-0.5625 C 4.1875,-4 3.765625,-4.40625 3,-4.40625 c -1.3125,0 -1.6875,1.015625 -1.6875,1.453125 0,0.78125 0.734375,0.921875 1.03125,0.984375 0.515625,0.109375 1.03125,0.21875 1.03125,0.765625 0,0.25 -0.21875,1.09375 -1.421875,1.09375 -0.140625,0 -0.90625,0 -1.140625,-0.53125 0.390625,0.046875 0.640625,-0.25 0.640625,-0.53125 0,-0.21875 -0.171875,-0.34375 -0.375,-0.34375 -0.265625,0 -0.5625,0.203125 -0.5625,0.65625 0,0.5625 0.578125,0.96875 1.421875,0.96875 1.625,0 2.015625,-1.203125 2.015625,-1.65625 0,-0.359375 -0.1875,-0.609375 -0.3125,-0.71875 -0.265625,-0.28125 -0.5625,-0.34375 -1,-0.421875 -0.359375,-0.078125 -0.75,-0.15625 -0.75,-0.609375 C 1.890625,-3.578125 2.125,-4.1875 3,-4.1875 c 0.25,0 0.75,0.078125 0.890625,0.453125 z m 0,0"
+           id="path30"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph1-5"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="M 0.453125,1.21875 C 0.375,1.5625 0.34375,1.625 -0.09375,1.625 c -0.109375,0 -0.21875,0 -0.21875,0.1875 0,0.078125 0.046875,0.125 0.125,0.125 0.265625,0 0.5625,-0.03125 0.828125,-0.03125 0.34375,0 0.671875,0.03125 1,0.03125 0.046875,0 0.171875,0 0.171875,-0.203125 C 1.8125,1.625 1.71875,1.625 1.578125,1.625 c -0.5,0 -0.5,-0.0625 -0.5,-0.15625 0,-0.125 0.421875,-1.75 0.484375,-2 0.125,0.296875 0.40625,0.640625 0.921875,0.640625 1.15625,0 2.40625,-1.453125 2.40625,-2.921875 0,-0.9375 -0.578125,-1.59375 -1.328125,-1.59375 -0.5,0 -0.984375,0.359375 -1.3125,0.75 -0.09375,-0.546875 -0.53125,-0.75 -0.890625,-0.75 -0.46875,0 -0.65625,0.390625 -0.734375,0.5625 C 0.4375,-3.5 0.3125,-2.90625 0.3125,-2.875 c 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.015625 0.171875,-0.234375 0.171875,-0.703125 0.375,-1.1875 0.734375,-1.1875 0.171875,0 0.3125,0.078125 0.3125,0.453125 0,0.234375 -0.03125,0.34375 -0.078125,0.515625 z m 1.75,-4.328125 C 2.265625,-3.375 2.546875,-3.65625 2.71875,-3.8125 c 0.359375,-0.296875 0.640625,-0.375 0.8125,-0.375 0.390625,0 0.640625,0.34375 0.640625,0.9375 0,0.59375 -0.328125,1.734375 -0.515625,2.109375 -0.34375,0.703125 -0.8125,1.03125 -1.1875,1.03125 C 1.8125,-0.109375 1.6875,-0.9375 1.6875,-1 c 0,-0.015625 0,-0.03125 0.03125,-0.15625 z m 0,0"
+           id="path33"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph1-6"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 1.859375,-2.296875 c 0.296875,0 1.03125,-0.03125 1.53125,-0.234375 0.703125,-0.296875 0.75,-0.890625 0.75,-1.03125 0,-0.4375 -0.375,-0.84375 -1.0625,-0.84375 -1.109375,0 -2.625,0.96875 -2.625,2.71875 0,1.015625 0.59375,1.796875 1.578125,1.796875 1.421875,0 2.25,-1.0625 2.25,-1.171875 0,-0.0625 -0.046875,-0.140625 -0.109375,-0.140625 -0.0625,0 -0.078125,0.03125 -0.140625,0.109375 -0.78125,0.984375 -1.875,0.984375 -1.984375,0.984375 -0.78125,0 -0.875,-0.84375 -0.875,-1.15625 0,-0.125 0.015625,-0.421875 0.15625,-1.03125 z m -0.46875,-0.21875 C 1.78125,-4.03125 2.8125,-4.1875 3.078125,-4.1875 c 0.453125,0 0.734375,0.296875 0.734375,0.625 0,1.046875 -1.59375,1.046875 -2.015625,1.046875 z m 0,0"
+           id="path36"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph1-7"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 5.140625,-6.8125 c 0,0 0,-0.109375 -0.125,-0.109375 -0.15625,0 -1.09375,0.09375 -1.265625,0.109375 -0.078125,0.015625 -0.140625,0.0625 -0.140625,0.1875 0,0.125 0.09375,0.125 0.234375,0.125 0.484375,0 0.5,0.0625 0.5,0.171875 L 4.3125,-6.125 3.71875,-3.765625 C 3.53125,-4.140625 3.25,-4.40625 2.796875,-4.40625 c -1.15625,0 -2.390625,1.46875 -2.390625,2.921875 0,0.9375 0.546875,1.59375 1.3125,1.59375 0.203125,0 0.703125,-0.046875 1.296875,-0.75 0.078125,0.421875 0.4375,0.75 0.90625,0.75 0.359375,0 0.578125,-0.234375 0.75,-0.546875 0.15625,-0.359375 0.296875,-0.96875 0.296875,-0.984375 0,-0.109375 -0.09375,-0.109375 -0.125,-0.109375 -0.09375,0 -0.109375,0.046875 -0.140625,0.1875 -0.171875,0.640625 -0.34375,1.234375 -0.75,1.234375 -0.28125,0 -0.296875,-0.265625 -0.296875,-0.453125 0,-0.25 0.015625,-0.3125 0.046875,-0.484375 z m -2.0625,5.625 C 3.015625,-1 3.015625,-0.984375 2.875,-0.8125 2.4375,-0.265625 2.03125,-0.109375 1.75,-0.109375 c -0.5,0 -0.640625,-0.546875 -0.640625,-0.9375 0,-0.5 0.3125,-1.71875 0.546875,-2.1875 0.3125,-0.578125 0.75,-0.953125 1.15625,-0.953125 0.640625,0 0.78125,0.8125 0.78125,0.875 0,0.0625 -0.015625,0.125 -0.03125,0.171875 z m 0,0"
+           id="path39"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph1-8"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 3.953125,-3.78125 c -0.171875,0 -0.296875,0 -0.4375,0.125 -0.171875,0.15625 -0.1875,0.328125 -0.1875,0.390625 0,0.25 0.1875,0.359375 0.375,0.359375 0.28125,0 0.546875,-0.25 0.546875,-0.640625 0,-0.484375 -0.46875,-0.859375 -1.171875,-0.859375 -1.34375,0 -2.671875,1.421875 -2.671875,2.828125 0,0.90625 0.578125,1.6875 1.625,1.6875 1.421875,0 2.25,-1.0625 2.25,-1.171875 0,-0.0625 -0.046875,-0.140625 -0.109375,-0.140625 -0.0625,0 -0.078125,0.03125 -0.140625,0.109375 -0.78125,0.984375 -1.875,0.984375 -1.984375,0.984375 -0.625,0 -0.90625,-0.484375 -0.90625,-1.09375 0,-0.40625 0.203125,-1.375 0.546875,-1.984375 0.3125,-0.578125 0.859375,-1 1.40625,-1 0.328125,0 0.71875,0.125 0.859375,0.40625 z m 0,0"
+           id="path42"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph1-9"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 2.046875,-3.984375 0.9375,0 c 0.203125,0 0.3125,0 0.3125,-0.203125 0,-0.109375 -0.109375,-0.109375 -0.28125,-0.109375 l -0.875,0 C 2.5,-5.71875 2.546875,-5.90625 2.546875,-5.96875 c 0,-0.171875 -0.125,-0.265625 -0.296875,-0.265625 -0.03125,0 -0.3125,0 -0.390625,0.359375 l -0.390625,1.578125 -0.9375,0 c -0.203125,0 -0.296875,0 -0.296875,0.1875 0,0.125 0.078125,0.125 0.28125,0.125 l 0.875,0 C 0.671875,-1.15625 0.625,-0.984375 0.625,-0.8125 0.625,-0.265625 1,0.109375 1.546875,0.109375 2.5625,0.109375 3.125,-1.34375 3.125,-1.421875 3.125,-1.53125 3.046875,-1.53125 3.015625,-1.53125 2.921875,-1.53125 2.90625,-1.5 2.859375,-1.390625 2.4375,-0.34375 1.90625,-0.109375 1.5625,-0.109375 c -0.203125,0 -0.3125,-0.125 -0.3125,-0.453125 0,-0.25 0.03125,-0.3125 0.0625,-0.484375 z m 0,0"
+           id="path45"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph1-10"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 2.828125,-6.234375 c 0,-0.203125 -0.140625,-0.359375 -0.359375,-0.359375 -0.28125,0 -0.546875,0.265625 -0.546875,0.53125 0,0.1875 0.140625,0.359375 0.375,0.359375 0.234375,0 0.53125,-0.234375 0.53125,-0.53125 z m -0.75,3.75 c 0.109375,-0.28125 0.109375,-0.3125 0.21875,-0.578125 0.078125,-0.203125 0.125,-0.34375 0.125,-0.53125 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.28125,-0.9375 0.671875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.21875 -0.078125,0.421875 -0.109375,0.53125 -0.078125,0.25 -0.53125,1.40625 -0.6875,1.84375 -0.109375,0.25 -0.234375,0.578125 -0.234375,0.796875 0,0.46875 0.34375,0.8125 0.8125,0.8125 0.9375,0 1.3125,-1.4375 1.3125,-1.53125 0,-0.109375 -0.09375,-0.109375 -0.125,-0.109375 -0.09375,0 -0.09375,0.03125 -0.140625,0.1875 -0.1875,0.625 -0.515625,1.234375 -1.015625,1.234375 -0.171875,0 -0.25,-0.09375 -0.25,-0.328125 0,-0.25 0.0625,-0.390625 0.296875,-1 z m 0,0"
+           id="path48"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph1-11"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 4.671875,-2.71875 c 0,-1.046875 -0.6875,-1.6875 -1.59375,-1.6875 -1.328125,0 -2.671875,1.421875 -2.671875,2.828125 0,0.984375 0.671875,1.6875 1.59375,1.6875 1.328125,0 2.671875,-1.375 2.671875,-2.828125 z m -2.65625,2.609375 c -0.4375,0 -0.875,-0.3125 -0.875,-1.09375 0,-0.484375 0.265625,-1.5625 0.578125,-2.0625 0.5,-0.765625 1.078125,-0.921875 1.359375,-0.921875 0.578125,0 0.875,0.484375 0.875,1.078125 0,0.390625 -0.203125,1.4375 -0.578125,2.078125 -0.359375,0.578125 -0.90625,0.921875 -1.359375,0.921875 z m 0,0"
+           id="path51"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph1-12"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 0.875,-0.59375 c -0.03125,0.15625 -0.09375,0.390625 -0.09375,0.4375 0,0.171875 0.140625,0.265625 0.296875,0.265625 0.125,0 0.296875,-0.078125 0.375,-0.28125 0,-0.015625 0.125,-0.484375 0.1875,-0.734375 l 0.21875,-0.890625 C 1.90625,-2.03125 1.96875,-2.25 2.03125,-2.46875 c 0.03125,-0.171875 0.109375,-0.46875 0.125,-0.5 0.140625,-0.3125 0.671875,-1.21875 1.625,-1.21875 0.453125,0 0.53125,0.375 0.53125,0.703125 0,0.609375 -0.484375,1.890625 -0.640625,2.3125 C 3.578125,-0.9375 3.5625,-0.8125 3.5625,-0.703125 c 0,0.46875 0.359375,0.8125 0.828125,0.8125 0.9375,0 1.296875,-1.453125 1.296875,-1.53125 0,-0.109375 -0.078125,-0.109375 -0.109375,-0.109375 -0.109375,0 -0.109375,0.03125 -0.15625,0.1875 -0.203125,0.671875 -0.53125,1.234375 -1.015625,1.234375 -0.171875,0 -0.234375,-0.09375 -0.234375,-0.328125 0,-0.25 0.078125,-0.484375 0.171875,-0.703125 0.1875,-0.53125 0.609375,-1.625 0.609375,-2.203125 0,-0.65625 -0.421875,-1.0625 -1.140625,-1.0625 -0.90625,0 -1.390625,0.640625 -1.5625,0.875 -0.046875,-0.5625 -0.453125,-0.875 -0.921875,-0.875 -0.453125,0 -0.640625,0.390625 -0.734375,0.5625 C 0.421875,-3.5 0.296875,-2.90625 0.296875,-2.875 c 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.015625 0.171875,-0.234375 0.171875,-0.703125 0.375,-1.1875 0.734375,-1.1875 0.1875,0 0.296875,0.125 0.296875,0.453125 0,0.21875 -0.03125,0.328125 -0.15625,0.84375 z m 0,0"
+           id="path54"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph1-13"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="m 2.578125,-6.8125 c 0,0 0,-0.109375 -0.140625,-0.109375 -0.21875,0 -0.953125,0.078125 -1.21875,0.109375 -0.078125,0 -0.1875,0.015625 -0.1875,0.203125 0,0.109375 0.109375,0.109375 0.25,0.109375 0.484375,0 0.5,0.09375 0.5,0.171875 L 1.75,-6.125 0.484375,-1.140625 C 0.453125,-1.03125 0.4375,-0.96875 0.4375,-0.8125 c 0,0.578125 0.4375,0.921875 0.90625,0.921875 0.328125,0 0.578125,-0.203125 0.75,-0.5625 0.171875,-0.375 0.296875,-0.953125 0.296875,-0.96875 0,-0.109375 -0.09375,-0.109375 -0.125,-0.109375 -0.09375,0 -0.109375,0.046875 -0.125,0.1875 C 1.96875,-0.703125 1.78125,-0.109375 1.375,-0.109375 c -0.296875,0 -0.296875,-0.3125 -0.296875,-0.453125 0,-0.25 0.015625,-0.296875 0.0625,-0.484375 z m 0,0"
+           id="path57"
+           inkscape:connector-curvature="0" />
+      </symbol>
+      <symbol
+         overflow="visible"
+         id="glyph2-0"
+         style="overflow:visible">
+        <path
+           style="stroke:none"
+           d="M 3.875,-2.765625 1.890625,-4.75 C 1.765625,-4.875 1.75,-4.890625 1.671875,-4.890625 1.5625,-4.890625 1.46875,-4.8125 1.46875,-4.6875 c 0,0.0625 0.015625,0.078125 0.125,0.1875 l 2,2 -2,2.015625 c -0.109375,0.109375 -0.125,0.125 -0.125,0.1875 0,0.125 0.09375,0.203125 0.203125,0.203125 0.078125,0 0.09375,-0.015625 0.21875,-0.140625 L 3.875,-2.21875 l 2.0625,2.0625 c 0.015625,0.015625 0.078125,0.0625 0.140625,0.0625 0.125,0 0.203125,-0.078125 0.203125,-0.203125 0,-0.015625 0,-0.046875 -0.03125,-0.109375 C 6.234375,-0.421875 4.65625,-1.984375 4.15625,-2.5 l 1.828125,-1.8125 c 0.046875,-0.0625 0.203125,-0.1875 0.25,-0.25 0,-0.015625 0.046875,-0.0625 0.046875,-0.125 0,-0.125 -0.078125,-0.203125 -0.203125,-0.203125 C 6,-4.890625 5.96875,-4.859375 5.859375,-4.75 z m 0,0"
+           id="path60"
+           inkscape:connector-curvature="0" />
+      </symbol>
+    </g>
+  </defs>
+  <g
+     id="g3201"
+     transform="translate(-225.70979,687.63219)">
+    <g
+       transform="translate(0,-822)"
+       style="fill:#000000;fill-opacity:1"
+       id="g63">
+      <use
+         xlink:href="#glyph0-0"
+         x="236.64"
+         y="146.86"
+         id="use65"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(0,-822)"
+       style="fill:#000000;fill-opacity:1"
+       id="g67">
+      <use
+         xlink:href="#glyph1-0"
+         x="240.47984"
+         y="146.86"
+         id="use69"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(0,-822)"
+       style="fill:#000000;fill-opacity:1"
+       id="g71">
+      <use
+         xlink:href="#glyph1-1"
+         x="249.23985"
+         y="146.86"
+         id="use73"
+         width="595"
+         height="842" />
+    </g>
+    <path
+       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 255.34766,-675.60938 3,0 0,0.48047 -3,0 z m 0,0"
+       id="path75"
+       inkscape:connector-curvature="0" />
+    <g
+       transform="translate(0,-822)"
+       style="fill:#000000;fill-opacity:1"
+       id="g77">
+      <use
+         xlink:href="#glyph1-0"
+         x="258.35999"
+         y="146.86"
+         id="use79"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(0,-822)"
+       style="fill:#000000;fill-opacity:1"
+       id="g81">
+      <use
+         xlink:href="#glyph1-2"
+         x="267.12003"
+         y="146.86"
+         id="use83"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(0,-822)"
+       style="fill:#000000;fill-opacity:1"
+       id="g85">
+      <use
+         xlink:href="#glyph1-3"
+         x="272.39999"
+         y="146.86"
+         id="use87"
+         width="595"
+         height="842" />
+    </g>
+    <path
+       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 278.62891,-675.60938 3,0 0,0.48047 -3,0 z m 0,0"
+       id="path89"
+       inkscape:connector-curvature="0" />
+    <g
+       transform="translate(0,-822)"
+       style="fill:#000000;fill-opacity:1"
+       id="g91">
+      <use
+         xlink:href="#glyph1-4"
+         x="281.64001"
+         y="146.86"
+         id="use93"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(0,-822)"
+       style="fill:#000000;fill-opacity:1"
+       id="g95">
+      <use
+         xlink:href="#glyph1-5"
+         x="286.32001"
+         y="146.86"
+         id="use97"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(0,-822)"
+       style="fill:#000000;fill-opacity:1"
+       id="g99">
+      <use
+         xlink:href="#glyph1-6"
+         x="291.35999"
+         y="146.86"
+         id="use101"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(0,-822)"
+       style="fill:#000000;fill-opacity:1"
+       id="g103">
+      <use
+         xlink:href="#glyph1-6"
+         x="296.04001"
+         y="146.86"
+         id="use105"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(0,-822)"
+       style="fill:#000000;fill-opacity:1"
+       id="g107">
+      <use
+         xlink:href="#glyph1-7"
+         x="300.72003"
+         y="146.86"
+         id="use109"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(0,-822)"
+       style="fill:#000000;fill-opacity:1"
+       id="g111">
+      <use
+         xlink:href="#glyph2-0"
+         x="307.9201"
+         y="146.86"
+         id="use113"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(0,-822)"
+       style="fill:#000000;fill-opacity:1"
+       id="g115">
+      <use
+         xlink:href="#glyph1-2"
+         x="317.88025"
+         y="146.86"
+         id="use117"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(0,-822)"
+       style="fill:#000000;fill-opacity:1"
+       id="g119">
+      <use
+         xlink:href="#glyph1-8"
+         x="323.16025"
+         y="146.86"
+         id="use121"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(0,-822)"
+       style="fill:#000000;fill-opacity:1"
+       id="g123">
+      <use
+         xlink:href="#glyph1-9"
+         x="327.48026"
+         y="146.86"
+         id="use125"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(0,-822)"
+       style="fill:#000000;fill-opacity:1"
+       id="g127">
+      <use
+         xlink:href="#glyph1-10"
+         x="331.08026"
+         y="146.86"
+         id="use129"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(0,-822)"
+       style="fill:#000000;fill-opacity:1"
+       id="g131">
+      <use
+         xlink:href="#glyph1-11"
+         x="334.56027"
+         y="146.86"
+         id="use133"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(0,-822)"
+       style="fill:#000000;fill-opacity:1"
+       id="g135">
+      <use
+         xlink:href="#glyph1-12"
+         x="339.36026"
+         y="146.86"
+         id="use137"
+         width="595"
+         height="842" />
+    </g>
+    <path
+       style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       d="m 345.94922,-675.60938 3,0 0,0.48047 -3,0 z m 0,0"
+       id="path139"
+       inkscape:connector-curvature="0" />
+    <g
+       transform="translate(0,-822)"
+       style="fill:#000000;fill-opacity:1"
+       id="g141">
+      <use
+         xlink:href="#glyph1-7"
+         x="348.95999"
+         y="146.86"
+         id="use143"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(0,-822)"
+       style="fill:#000000;fill-opacity:1"
+       id="g145">
+      <use
+         xlink:href="#glyph1-6"
+         x="354.12003"
+         y="146.86"
+         id="use147"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(0,-822)"
+       style="fill:#000000;fill-opacity:1"
+       id="g149">
+      <use
+         xlink:href="#glyph1-13"
+         x="358.80002"
+         y="146.86"
+         id="use151"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(0,-822)"
+       style="fill:#000000;fill-opacity:1"
+       id="g153">
+      <use
+         xlink:href="#glyph1-9"
+         x="362.0401"
+         y="146.86"
+         id="use155"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(0,-822)"
+       style="fill:#000000;fill-opacity:1"
+       id="g157">
+      <use
+         xlink:href="#glyph1-2"
+         x="365.64011"
+         y="146.86"
+         id="use159"
+         width="595"
+         height="842" />
+    </g>
+    <g
+       transform="translate(0,-822)"
+       style="fill:#000000;fill-opacity:1"
+       id="g161">
+      <use
+         xlink:href="#glyph0-1"
+         x="370.9202"
+         y="146.86"
+         id="use163"
+         width="595"
+         height="842" />
+    </g>
+  </g>
+</svg>
diff --git a/specs/XKB/XKBlib-6.svg b/specs/XKB/XKBlib-6.svg
new file mode 100644 (file)
index 0000000..e2b3ce2
--- /dev/null
@@ -0,0 +1,551 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="620"
+   height="500"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="XKBlib-6.svg"
+   inkscape:export-filename="/home/fcarrijo/Desktop/XKBlib-6.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs4">
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#Strips1_1"
+       id="pattern5283"
+       patternTransform="matrix(4.2694661,1.6585694,-0.04730474,4.1989521,235.77322,-493.33209)" />
+    <linearGradient
+       id="linearGradient5257"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5259" />
+    </linearGradient>
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#Strips1_1"
+       id="pattern5216"
+       patternTransform="matrix(4.3336724,0.9160461,-0.01361022,4.3170979,-342.26379,-264.52219)" />
+    <pattern
+       inkscape:stockid="Stripes 1:1"
+       id="Strips1_1"
+       patternTransform="matrix(4.3538899,0.81455497,0.0872474,4.3162378,-405.75021,-33.331093)"
+       height="1"
+       width="2"
+       patternUnits="userSpaceOnUse"
+       inkscape:collect="always">
+      <rect
+         id="rect4473"
+         height="2"
+         width="1"
+         y="-0.5"
+         x="0"
+         style="fill:black;stroke:none" />
+    </pattern>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath5190">
+      <rect
+         style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.00031233;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         id="rect5192"
+         width="168.27927"
+         height="227.56186"
+         x="131.25783"
+         y="85.852882"
+         transform="matrix(-0.77646499,0.6301604,-0.6572021,-0.7537144,0,0)" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath5220">
+      <rect
+         style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         id="rect5222"
+         width="185.42435"
+         height="203.87454"
+         x="146.67897"
+         y="74.723244"
+         transform="matrix(0.70264554,-0.71154006,0.71154006,0.70264554,0,0)" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath5287">
+      <rect
+         style="fill:#ececec;fill-opacity:1;stroke:none"
+         id="rect5289"
+         width="170.46823"
+         height="217.43936"
+         x="136.7207"
+         y="82.408524"
+         transform="matrix(0.73371932,-0.67945269,0.6862034,0.72740971,0,0)" />
+    </clipPath>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.168"
+     inkscape:cx="250.79265"
+     inkscape:cy="200.44473"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer2"
+     showgrid="false"
+     inkscape:window-width="1016"
+     inkscape:window-height="718"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Vetorial">
+    <rect
+       style="fill:#c8c8c8;fill-opacity:1;stroke:none"
+       id="rect5778"
+       width="180.81181"
+       height="204.79704"
+       x="146.67897"
+       y="72.878227" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:7;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 89.483395,325.64575 0.922509,-50.738 55.350556,0 184.50184,-200.184503 113.46864,-0.92251"
+       id="path5291"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:7;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="M 145.75646,273.06273 C 152.82903,140.2214 244.77245,73.800739 328.41328,74.723247"
+       id="path5293"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 90.405904,44.280443 0,281.365317 357.933576,0"
+       id="path5304"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:7;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 320.80258,425.50738 55.81181,0"
+       id="path5306"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:7;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 320.80258,443.18431 55.81181,0"
+       id="path5306-4"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#c8c8c8;stroke-width:7;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 320.80258,460.86124 55.81181,0"
+       id="path5306-4-6"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="383.55975"
+       y="428.65094"
+       id="text5344"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan5346"
+         x="383.55975"
+         y="428.65094">mk_curve = 0</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="383.55975"
+       y="446.32785"
+       id="text5344-6"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan5378"
+         x="383.55975"
+         y="446.32785">mk_curve &lt; 0</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="383.55975"
+       y="464.00479"
+       id="text5344-1"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan5380"
+         x="383.55975"
+         y="464.00479">mk_curve &gt; 0</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="370.94604"
+       y="204.84198"
+       id="text5344-64"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan5434"
+         x="370.94604"
+         y="204.84198">mk_max_speed * Action delta</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:tb-rl;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="62.077717"
+       y="135.23929"
+       id="text5344-64-3"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan5457"
+         x="135.23929"
+         y="62.077717">distance</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="120.78584"
+       y="306.17062"
+       id="text5344-64-8"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan5480"
+         x="120.78584"
+         y="306.17062">Action delta</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="117.53692"
+       y="384.06982"
+       id="text5344-64-8-0"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan5503"
+         x="117.53692"
+         y="384.06982">mk_delay</tspan><tspan
+         sodipodi:role="line"
+         id="tspan5505"
+         x="117.53692"
+         y="399.06982">(msec)</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="238.41812"
+       y="384.06982"
+       id="text5344-64-8-0-9"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan5531"
+         x="238.41812"
+         y="384.06982">mk_time_to_max</tspan><tspan
+         sodipodi:role="line"
+         id="tspan5533"
+         x="238.41812"
+         y="399.06982">(count)</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="370.16321"
+       y="384.06982"
+       id="text5344-64-8-0-2"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan5559"
+         x="370.16321"
+         y="384.06982">mk_interval</tspan><tspan
+         sodipodi:role="line"
+         id="tspan5561"
+         x="370.16321"
+         y="399.06982">(msec)</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 90.019129,276.90912 -11.741626,0"
+       id="path5563"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 90.01913,227.65952 -11.741626,0"
+       id="path5563-0"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 90.019129,178.73608 -11.741626,0"
+       id="path5563-1"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 89.692973,128.83417 -11.741626,0"
+       id="path5563-2"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 90.019129,79.584575 -11.741626,0"
+       id="path5563-00"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 160.79504,337.90033 0,-11.74162"
+       id="path5563-6"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 172.2105,337.90033 0,-11.74162"
+       id="path5563-3"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 182.8106,337.90033 0,-11.74162"
+       id="path5563-6-9"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 194.22606,337.90033 0,-11.74162"
+       id="path5563-3-0"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 205.3969,337.90033 0,-11.74162"
+       id="path5563-6-8"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 216.81236,337.90033 0,-11.74162"
+       id="path5563-3-3"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 227.41246,337.90033 0,-11.74162"
+       id="path5563-6-9-8"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 238.82792,337.90033 0,-11.74162"
+       id="path5563-3-0-7"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 249.72895,337.90033 0,-11.74162"
+       id="path5563-6-5"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 261.14441,337.90033 0,-11.74162"
+       id="path5563-3-03"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 271.74451,337.90033 0,-11.74162"
+       id="path5563-6-9-1"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 283.15997,337.90033 0,-11.74162"
+       id="path5563-3-0-8"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 294.33081,337.90033 0,-11.74162"
+       id="path5563-6-8-0"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 305.74627,337.90033 0,-11.74162"
+       id="path5563-3-3-1"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 316.34637,337.90033 0,-11.74162"
+       id="path5563-6-9-8-7"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 327.76183,341.12911 0,-14.9704"
+       id="path5563-3-0-7-9"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 341.51862,337.90033 0,-11.74162"
+       id="path5563-6-1"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 352.93408,337.90033 0,-11.74162"
+       id="path5563-3-035"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 363.53418,337.90033 0,-11.74162"
+       id="path5563-6-9-9"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 374.94964,337.90033 0,-11.74162"
+       id="path5563-3-0-4"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 386.12048,337.90033 0,-11.74162"
+       id="path5563-6-8-8"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 397.53594,337.90033 0,-11.74162"
+       id="path5563-3-3-4"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 408.13604,337.90033 0,-11.74162"
+       id="path5563-6-9-8-6"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 419.5515,337.90033 0,-11.74162"
+       id="path5563-3-0-7-92"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 429.8716,337.90033 0,-11.74162"
+       id="path5563-6-9-8-6-9"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 441.74831,337.90033 0,-11.74162"
+       id="path5563-3-0-7-92-0"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 149.90774,341.12911 0,-14.9704"
+       id="path5563-6-3"
+       inkscape:connector-curvature="0" />
+    <g
+       id="g6013"
+       transform="matrix(0.52011301,0,0,2.4705278,492.60784,-679.42599)">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5938-4-2"
+         d="m -297.45452,308.54628 21.26036,0"
+         style="fill:none;stroke:#000000;stroke-width:0.88217813;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5938-4-0"
+         d="m -286.82434,309.22012 0,95.23763"
+         style="fill:none;stroke:#000000;stroke-width:0.88217813;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5938-4-2-6"
+         d="m -297.45452,404.76236 21.26036,0"
+         style="fill:none;stroke:#000000;stroke-width:0.88217813;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+    </g>
+    <g
+       id="g3848">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5938-4-2-9"
+         d="m 375.22095,345.65772 0,11.05779"
+         style="fill:none;stroke:#000000;stroke-width:1.00000012;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5938-4-0-2"
+         d="m 375.1499,351.18662 -10.04159,0"
+         style="fill:none;stroke:#000000;stroke-width:1.00000012;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5938-4-2-6-4"
+         d="m 365.07619,345.65772 0,11.05779"
+         style="fill:none;stroke:#000000;stroke-width:1.00000012;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+    </g>
+    <g
+       id="g3853">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5938-4-2-9-4"
+         d="m 324.67319,345.65772 0,11.05779"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5938-4-0-2-9"
+         d="m 323.46992,351.18662 -170.06566,0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5938-4-2-6-4-9"
+         d="m 152.86032,345.65772 0,11.05779"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+    </g>
+    <g
+       id="g6013-3-4-3"
+       transform="matrix(0,0.52011301,-0.59595607,0,330.45344,500.36769)">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5938-4-2-9-4-8"
+         d="m -297.45452,308.54628 21.26036,0"
+         style="fill:none;stroke:#000000;stroke-width:1.79615593;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5938-4-0-2-9-3"
+         d="m -286.82434,309.22012 0,95.23763"
+         style="fill:none;stroke:#000000;stroke-width:1.79615593;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5938-4-2-6-4-9-2"
+         d="m -297.45452,404.76236 21.26036,0"
+         style="fill:none;stroke:#000000;stroke-width:1.79615593;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+    </g>
+    <g
+       id="g6013-3-4-3-9"
+       transform="matrix(-0.52011301,0,0,-0.41065669,-44.015024,448.41191)">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5938-4-2-9-4-8-5"
+         d="m -297.45452,308.54628 21.26036,0"
+         style="fill:none;stroke:#000000;stroke-width:2.16377306;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5938-4-0-2-9-3-4"
+         d="m -286.82434,309.22012 0,95.23763"
+         style="fill:none;stroke:#000000;stroke-width:2.16377306;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="rect5938-4-2-6-4-9-2-3"
+         d="m -297.45452,404.76236 21.26036,0"
+         style="fill:none;stroke:#000000;stroke-width:2.16377306;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" />
+    </g>
+  </g>
+</svg>
diff --git a/specs/XKB/XKBlib-7.svg b/specs/XKB/XKBlib-7.svg
new file mode 100644 (file)
index 0000000..b09f43c
--- /dev/null
@@ -0,0 +1,352 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="350"
+   height="220"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="XKBlib-7.svg"
+   inkscape:export-filename="/home/fcarrijo/Desktop/XKBlib-7.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend"
+       style="overflow:visible">
+      <path
+         id="path4077"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-3"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4077-9"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.2318182"
+     inkscape:cx="175"
+     inkscape:cy="110"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer2"
+     showgrid="false"
+     inkscape:window-width="1016"
+     inkscape:window-height="718"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Vetorial">
+    <rect
+       style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect3277"
+       width="296.30997"
+       height="125.01845"
+       x="27.601477"
+       y="29.225092" />
+    <g
+       id="g3257">
+      <rect
+         y="40.504219"
+         x="133.75017"
+         height="15"
+         width="17"
+         id="rect3070"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="40.504219"
+         x="154.26093"
+         height="15"
+         width="17"
+         id="rect3070-6"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="40.504219"
+         x="174.77168"
+         height="15"
+         width="17"
+         id="rect3070-1"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="40.504219"
+         x="195.28244"
+         height="15"
+         width="17"
+         id="rect3070-5"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="60.332516"
+         x="133.75017"
+         height="15"
+         width="17"
+         id="rect3070-69"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="60.380718"
+         x="154.26093"
+         height="15"
+         width="17"
+         id="rect3070-6-3"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="60.380718"
+         x="174.77168"
+         height="15"
+         width="17"
+         id="rect3070-1-7"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="80.16082"
+         x="133.75017"
+         height="15"
+         width="17"
+         id="rect3070-4"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="79.897911"
+         x="154.26093"
+         height="15"
+         width="17"
+         id="rect3070-6-5"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="79.897911"
+         x="174.77168"
+         height="15"
+         width="17"
+         id="rect3070-1-2"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="99.989136"
+         x="133.75017"
+         height="15"
+         width="17"
+         id="rect3070-54"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="99.989136"
+         x="154.26093"
+         height="15"
+         width="17"
+         id="rect3070-6-7"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="99.989136"
+         x="174.77168"
+         height="15"
+         width="17"
+         id="rect3070-1-4"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="119.50632"
+         x="174.77168"
+         height="15"
+         width="17"
+         id="rect3070-1-4-4"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="119.50633"
+         x="133.86069"
+         height="15"
+         width="36.517193"
+         id="rect3070-1-4-4-3"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         transform="matrix(0,1,-1,0,0,0)"
+         y="-211.28244"
+         x="61.102837"
+         height="15"
+         width="34.221054"
+         id="rect3070-1-4-4-3-0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         transform="matrix(0,1,-1,0,0,0)"
+         y="-211.28244"
+         x="99.563164"
+         height="15"
+         width="34.221054"
+         id="rect3070-1-4-4-3-0-7"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="35.734756"
+         x="128.58385"
+         height="104.47437"
+         width="88.40139"
+         id="rect3255"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="123.39483"
+       y="186.71587"
+       id="text3279"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3281"
+         x="123.39483"
+         y="186.71587">Rotated Sections</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 232.17712,166.35116 19.4834,-33.28413"
+       id="path3283"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="M 115.35461,166.34226 95.871207,133.05813"
+       id="path3283-3"
+       inkscape:connector-curvature="0" />
+    <g
+       transform="matrix(0.59836807,0.80122135,-0.80122135,0.59836807,444.08473,35.424173)"
+       id="g4606-2">
+      <rect
+         y="136.86716"
+         x="-83.616234"
+         height="19"
+         width="19"
+         id="rect4521-2"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="160.75369"
+         x="-83.616234"
+         height="19"
+         width="19"
+         id="rect4521-3-4-9"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="184.64023"
+         x="-83.616234"
+         height="19"
+         width="19"
+         id="rect4521-3-6-2"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="136.86716"
+         x="-60.643909"
+         height="19"
+         width="19"
+         id="rect4521-6-8"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="160.75369"
+         x="-60.643909"
+         height="19"
+         width="19"
+         id="rect4521-3-4-1-1"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="184.64023"
+         x="-60.643909"
+         height="19"
+         width="19"
+         id="rect4521-3-6-7-2"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="133.13654"
+         x="-86.863472"
+         height="74.686348"
+         width="49.520294"
+         id="rect4604-4"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    </g>
+    <g
+       transform="matrix(-0.59836807,0.80122135,0.80122135,0.59836807,-98.254471,35.424172)"
+       id="g4606-2-7">
+      <rect
+         y="136.86716"
+         x="-83.616234"
+         height="19"
+         width="19"
+         id="rect4521-2-8"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="160.75369"
+         x="-83.616234"
+         height="19"
+         width="19"
+         id="rect4521-3-4-9-6"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="184.64023"
+         x="-83.616234"
+         height="19"
+         width="19"
+         id="rect4521-3-6-2-3"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="136.86716"
+         x="-60.643909"
+         height="19"
+         width="19"
+         id="rect4521-6-8-7"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="160.75369"
+         x="-60.643909"
+         height="19"
+         width="19"
+         id="rect4521-3-4-1-1-7"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="184.64023"
+         x="-60.643909"
+         height="19"
+         width="19"
+         id="rect4521-3-6-7-2-2"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="133.13654"
+         x="-86.863472"
+         height="74.686348"
+         width="49.520294"
+         id="rect4604-4-3"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    </g>
+  </g>
+</svg>
diff --git a/specs/XKB/XKBlib-8.svg b/specs/XKB/XKBlib-8.svg
new file mode 100644 (file)
index 0000000..040a710
--- /dev/null
@@ -0,0 +1,1143 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="650"
+   height="260"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="XKBlib-8.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend"
+       style="overflow:visible">
+      <path
+         id="path3907"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-0"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3907-0"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-5"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3907-4"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend-4"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3907-9"
+         style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.73307692"
+     inkscape:cx="167.44491"
+     inkscape:cy="102.71773"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer2"
+     showgrid="false"
+     inkscape:window-width="1016"
+     inkscape:window-height="718"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Vetorial"
+     style="display:inline">
+    <rect
+       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect5422"
+       width="88.667366"
+       height="105.71878"
+       x="532.68628"
+       y="100.39874" />
+    <rect
+       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect5269"
+       width="70.251839"
+       height="148.0063"
+       x="458.34207"
+       y="58.793285" />
+    <rect
+       style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect5267"
+       width="316.4743"
+       height="109.12907"
+       x="137.09338"
+       y="97.670517" />
+    <text
+       xml:space="preserve"
+       style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="23.189924"
+       y="75.162643"
+       id="text3070"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3072"
+         x="23.189924"
+         y="75.162643">Editing</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="22.620016"
+       y="113.80984"
+       id="text3070-7"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3072-0"
+         x="22.620016"
+         y="113.80984">Function</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="24.666185"
+       y="157.46146"
+       id="text3070-5"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3072-1"
+         x="24.666185"
+         y="157.46146">Alpha</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="23.984129"
+       y="197.02075"
+       id="text3070-1"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3072-03"
+         x="23.984129"
+         y="197.02075">Keypad</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 53.541448,207.48164 0,23.87198 524.160542,0 0,-22.50787"
+       id="path3113"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 53.807196,53.677857 0,-23.87198 445.631804,0 0,22.50787"
+       id="path3113-4"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 69.4945,153.25814 58.40936,0"
+       id="path3113-2"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cc" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend)"
+       d="m 87.012997,108.26001 18.817483,0 0,-33.761803 23.4072,0"
+       id="path3113-2-9"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccc" />
+    <rect
+       style="fill:#ffffff;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399"
+       width="315.79224"
+       height="23.871983"
+       x="137.77544"
+       y="59.475342"
+       rx="0"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9"
+       width="17.733475"
+       height="16.36936"
+       x="142.20882"
+       y="63.226654"
+       rx="0"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9-4"
+       width="17.733475"
+       height="16.36936"
+       x="184.88353"
+       y="63.226654"
+       rx="0"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9-9"
+       width="17.733475"
+       height="16.36936"
+       x="206.23926"
+       y="63.226654"
+       rx="0"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9-8"
+       width="17.733475"
+       height="16.36936"
+       x="227.59499"
+       y="63.226654"
+       rx="0"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9-1"
+       width="17.733475"
+       height="16.36936"
+       x="248.95071"
+       y="63.226654"
+       rx="0"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9-4-2"
+       width="17.733475"
+       height="16.36936"
+       x="278.98425"
+       y="63.226654"
+       rx="0"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9-9-9"
+       width="17.733475"
+       height="16.36936"
+       x="300.33997"
+       y="63.226654"
+       rx="0"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9-8-2"
+       width="17.733475"
+       height="16.36936"
+       x="321.69571"
+       y="63.226654"
+       rx="0"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9-1-8"
+       width="17.733475"
+       height="16.36936"
+       x="343.05142"
+       y="63.226654"
+       rx="0"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9-4-1"
+       width="17.733475"
+       height="16.36936"
+       x="368.33368"
+       y="63.226654"
+       rx="0"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9-9-2"
+       width="17.733475"
+       height="16.36936"
+       x="389.68939"
+       y="63.226654"
+       rx="0"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9-8-4"
+       width="17.733475"
+       height="16.36936"
+       x="411.04514"
+       y="63.226654"
+       rx="0"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9-1-7"
+       width="17.733475"
+       height="16.36936"
+       x="432.40085"
+       y="63.226654"
+       rx="0"
+       ry="0" />
+    <g
+       id="g5207"
+       transform="translate(1.7051201,1.7051363)">
+      <rect
+         ry="0"
+         rx="0"
+         y="102.44492"
+         x="162.85414"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="102.44492"
+         x="183.8405"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-7"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="102.44492"
+         x="204.82686"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-72"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="102.44492"
+         x="225.81322"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-37"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="102.44492"
+         x="246.79958"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-2"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="102.44492"
+         x="267.78595"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-5"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="102.44492"
+         x="288.77231"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-376"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="102.44492"
+         x="309.75867"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-81"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="102.44492"
+         x="330.74503"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-36"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="102.44492"
+         x="351.73138"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-40"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="102.44492"
+         x="372.71774"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-35"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="102.44492"
+         x="393.7041"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-85"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="102.44492"
+         x="414.69046"
+         height="16.36936"
+         width="30.692553"
+         id="rect4399-9-0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="102.44492"
+         x="141.86778"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="122.22455"
+         x="141.86778"
+         height="16.36936"
+         width="25.918154"
+         id="rect4399-9-3-9-9"
+         style="fill:none;stroke:#000000;stroke-width:0.99999988;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="122.22455"
+         x="170.72403"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-8"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="122.22455"
+         x="191.3956"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="122.22455"
+         x="212.06717"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-2"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="122.22455"
+         x="232.73874"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-4"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="122.22455"
+         x="253.41031"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-90"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="122.22455"
+         x="274.08185"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-1"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="122.22455"
+         x="294.75342"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-20"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="122.22455"
+         x="315.42499"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-06"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="122.22455"
+         x="336.09656"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-3"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="122.22455"
+         x="356.76813"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-908"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="122.22455"
+         x="377.4397"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-38"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="122.22455"
+         x="398.11127"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-7"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="122.22455"
+         x="418.78284"
+         height="16.36936"
+         width="26.600212"
+         id="rect4399-9-3-9-31"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="142.0042"
+         x="141.86778"
+         height="16.36936"
+         width="27.964327"
+         id="rect4399-9-0-0"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="142.0042"
+         x="173.64026"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-0"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="142.0042"
+         x="195.18188"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-5"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="142.0042"
+         x="216.72351"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-03"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="142.0042"
+         x="238.26514"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-1"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="142.0042"
+         x="259.80673"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-8"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="142.0042"
+         x="281.34836"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-01"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="142.0042"
+         x="302.88998"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-7"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="142.0042"
+         x="324.43161"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-9"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="142.0042"
+         x="345.97324"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-10"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="142.0042"
+         x="367.51486"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-3"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="142.0042"
+         x="389.05649"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-59"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="142.0042"
+         x="410.59811"
+         height="16.36936"
+         width="34.784893"
+         id="rect4399-9-3-9-0-4"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="161.78384"
+         x="141.86778"
+         height="16.36936"
+         width="34.102837"
+         id="rect4399-9-0-0-8"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="161.78384"
+         x="179.38089"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-5-4"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="161.78384"
+         x="200.52464"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-5-4-6"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="161.78384"
+         x="221.6684"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-5-4-9"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="161.78384"
+         x="242.81215"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-5-4-2"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="161.78384"
+         x="263.9559"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-5-4-90"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="161.78384"
+         x="285.09967"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-5-4-3"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="161.78384"
+         x="306.24344"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-5-4-0"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="161.78384"
+         x="327.38721"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-5-4-33"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="161.78384"
+         x="348.53098"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-5-4-7"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="161.78384"
+         x="369.67474"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-5-4-94"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="161.78384"
+         x="390.81851"
+         height="16.36936"
+         width="54.564533"
+         id="rect4399-9-3-9-0-5-4-99"
+         style="fill:none;stroke:#000000;stroke-width:0.99999988;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="182.24554"
+         x="141.86778"
+         height="16.36936"
+         width="25.918154"
+         id="rect4399-9-3-9-9-1"
+         style="fill:none;stroke:#000000;stroke-width:0.99999988;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="182.24554"
+         x="191.65791"
+         height="16.36936"
+         width="25.918154"
+         id="rect4399-9-3-9-9-1-9"
+         style="fill:none;stroke:#000000;stroke-width:0.99999988;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="182.24554"
+         x="221.32738"
+         height="16.36936"
+         width="150.73453"
+         id="rect4399-9-3-9-9-1-9-4"
+         style="fill:none;stroke:#000000;stroke-width:0.99999988;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="182.24554"
+         x="375.81323"
+         height="16.36936"
+         width="25.918154"
+         id="rect4399-9-3-9-9-1-9-2"
+         style="fill:none;stroke:#000000;stroke-width:0.99999988;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="182.24554"
+         x="419.46487"
+         height="16.36936"
+         width="25.918154"
+         id="rect4399-9-3-9-9-1-9-0"
+         style="fill:none;stroke:#000000;stroke-width:0.99999988;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    </g>
+    <g
+       id="g5149"
+       transform="translate(-0.34100723,0)">
+      <rect
+         ry="0"
+         rx="0"
+         y="63.567684"
+         x="463.79852"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-59-6"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="63.567684"
+         x="484.94226"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-59-5"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="63.567684"
+         x="506.086"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-59-9"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    </g>
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9-3-9-0-59-56"
+       width="17.733475"
+       height="16.36936"
+       x="484.60126"
+       y="164.14764"
+       rx="0"
+       ry="0" />
+    <g
+       transform="translate(-0.34100723,39.559283)"
+       id="g5149-1">
+      <rect
+         ry="0"
+         rx="0"
+         y="63.567684"
+         x="463.79852"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-59-6-1"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="63.567684"
+         x="484.94226"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-59-5-4"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="63.567684"
+         x="506.086"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-59-9-3"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    </g>
+    <g
+       transform="translate(-0.34100723,60.020983)"
+       id="g5149-7">
+      <rect
+         ry="0"
+         rx="0"
+         y="63.567684"
+         x="463.79852"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-59-6-2"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="63.567684"
+         x="484.94226"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-59-5-7"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="63.567684"
+         x="506.086"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-59-9-33"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    </g>
+    <g
+       transform="translate(-0.34100723,120.383)"
+       id="g5149-9">
+      <rect
+         ry="0"
+         rx="0"
+         y="63.567684"
+         x="463.79852"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-59-6-24"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="63.567684"
+         x="484.94226"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-59-5-44"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         ry="0"
+         rx="0"
+         y="63.567684"
+         x="506.086"
+         height="16.36936"
+         width="17.733475"
+         id="rect4399-9-3-9-0-59-9-9"
+         style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    </g>
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9-3-9-0-59-6-1-3"
+       width="17.733475"
+       height="16.36936"
+       x="536.77863"
+       y="104.44491"
+       rx="0"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9-3-9-0-59-5-4-8"
+       width="17.733475"
+       height="16.36936"
+       x="557.92236"
+       y="104.44491"
+       rx="0"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9-3-9-0-59-9-3-3"
+       width="17.733475"
+       height="16.36936"
+       x="579.0661"
+       y="104.4449"
+       rx="0"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9-3-9-0-59-6-2-9"
+       width="17.733475"
+       height="16.36936"
+       x="536.77863"
+       y="124.4519"
+       rx="0"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9-3-9-0-59-5-7-5"
+       width="17.733475"
+       height="16.36936"
+       x="557.92236"
+       y="124.4519"
+       rx="0"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9-3-9-0-59-9-33-4"
+       width="17.733475"
+       height="16.36936"
+       x="579.0661"
+       y="124.22455"
+       rx="0"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9-3-9-0-59-6-1-9"
+       width="17.733475"
+       height="16.36936"
+       x="536.77863"
+       y="144.45891"
+       rx="0"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9-3-9-0-59-5-4-4"
+       width="17.733475"
+       height="16.36936"
+       x="557.92236"
+       y="144.45889"
+       rx="0"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9-3-9-0-59-9-3-9"
+       width="17.733475"
+       height="16.36936"
+       x="579.0661"
+       y="144.0042"
+       rx="0"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9-3-9-0-59-6-2-5"
+       width="17.733475"
+       height="16.36936"
+       x="536.77863"
+       y="164.4659"
+       rx="0"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9-3-9-0-59-5-7-7"
+       width="17.733475"
+       height="16.36936"
+       x="557.92236"
+       y="164.4659"
+       rx="0"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9-3-9-0-59-9-33-3"
+       width="17.733475"
+       height="16.36936"
+       x="579.0661"
+       y="163.78384"
+       rx="0"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999982;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9-3-9-0-59-56-9"
+       width="38.195171"
+       height="16.36936"
+       x="537.46069"
+       y="183.56349"
+       rx="0"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999982;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9-3-9-0-59-56-9-0"
+       width="17.733471"
+       height="16.36936"
+       x="579.0661"
+       y="183.56349"
+       rx="0"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999982;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9-3-9-0-59-56-9-7"
+       width="35.466946"
+       height="16.36936"
+       x="164.46588"
+       y="-617.26129"
+       rx="0"
+       ry="0"
+       transform="matrix(0,1,-1,0,0,0)" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999982;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9-3-9-0-59-56-9-7-2"
+       width="35.466946"
+       height="16.36936"
+       x="124.73609"
+       y="-617.26129"
+       rx="0"
+       ry="0"
+       transform="matrix(0,1,-1,0,0,0)" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:0.99999976;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect4399-9-3-9-0-59-56-9-7-7"
+       width="15.687304"
+       height="16.36936"
+       x="104.78593"
+       y="-616.57916"
+       rx="0"
+       ry="0"
+       transform="matrix(0,1,-1,0,0,0)" />
+  </g>
+</svg>
diff --git a/specs/XKB/XKBlib-9.svg b/specs/XKB/XKBlib-9.svg
new file mode 100644 (file)
index 0000000..155fa33
--- /dev/null
@@ -0,0 +1,2075 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="610"
+   height="200"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   inkscape:export-filename="/home/fcarrijo/Desktop/teste.png"
+   inkscape:export-xdpi="156.71965"
+   inkscape:export-ydpi="156.71965"
+   style="display:inline"
+   sodipodi:docname="New document 1">
+  <defs
+     id="defs4">
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6833"
+       id="pattern7008"
+       patternTransform="matrix(2.2179022,0,0,2.4345375,229.96544,-129.83887)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern5492"
+       id="pattern7005"
+       patternTransform="matrix(2.2179023,0,0,2.4345375,229.96545,-129.83887)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern5521-4"
+       id="pattern7002"
+       patternTransform="matrix(2.2179023,0,0,2.4345375,229.96545,-129.83887)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern5521-7"
+       id="pattern6999"
+       patternTransform="matrix(2.2179023,0,0,2.4345375,229.96545,-129.83887)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern5521-3"
+       id="pattern6996"
+       patternTransform="matrix(2.2179023,0,0,2.4345375,229.96545,-129.83887)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern5521-40"
+       id="pattern6993"
+       patternTransform="matrix(2.2179023,0,0,2.4345375,229.96545,-129.83887)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern5521-9"
+       id="pattern6990"
+       patternTransform="matrix(2.2179023,0,0,2.4345375,229.96545,-129.83887)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern5521-90"
+       id="pattern6987"
+       patternTransform="matrix(2.2179023,0,0,2.4345375,229.96545,-129.83887)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern5521-908"
+       id="pattern6984"
+       patternTransform="matrix(2.2179023,0,0,2.4345375,229.96545,-129.83887)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern5521-0"
+       id="pattern6981"
+       patternTransform="matrix(2.2179023,0,0,2.4345375,229.96545,-129.83886)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern5703"
+       id="pattern6978"
+       patternTransform="matrix(2.2179025,0,0,2.4345374,229.96546,-129.83887)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern5827"
+       id="pattern6975"
+       patternTransform="matrix(2.2179023,0,0,2.4345375,229.96545,-129.83887)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern5827-4"
+       id="pattern6972"
+       patternTransform="matrix(2.2179023,0,0,2.4345375,229.96545,-129.83887)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6835"
+       id="pattern6967"
+       patternTransform="translate(197.1723,91.062098)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6837"
+       id="pattern6964"
+       patternTransform="translate(197.1723,91.062098)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6839"
+       id="pattern6961"
+       patternTransform="translate(197.1723,91.062099)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6841"
+       id="pattern6958"
+       patternTransform="translate(197.1723,91.062098)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6843"
+       id="pattern6955"
+       patternTransform="translate(197.1723,91.062098)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6845"
+       id="pattern6952"
+       patternTransform="translate(197.1723,91.062098)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6847"
+       id="pattern6949"
+       patternTransform="translate(197.1723,91.062098)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6849"
+       id="pattern6946"
+       patternTransform="translate(197.1723,91.062098)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6851"
+       id="pattern6943"
+       patternTransform="translate(197.1723,91.062098)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6853"
+       id="pattern6940"
+       patternTransform="translate(197.1723,91.062098)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6855"
+       id="pattern6937"
+       patternTransform="translate(197.1723,91.062098)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6857"
+       id="pattern6934"
+       patternTransform="translate(197.1723,91.062098)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6859"
+       id="pattern6931"
+       patternTransform="translate(197.1723,91.062098)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6861"
+       id="pattern6928"
+       patternTransform="translate(197.17229,91.062098)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6188"
+       id="pattern6906"
+       patternTransform="matrix(1.5682937,1.5682937,-1.721478,1.721478,589.69467,-269.03293)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6204"
+       id="pattern6903"
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6236"
+       id="pattern6900"
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6236-7"
+       id="pattern6897"
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6236-6"
+       id="pattern6894"
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6236-4"
+       id="pattern6891"
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6236-3"
+       id="pattern6888"
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6236-79"
+       id="pattern6885"
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6236-9"
+       id="pattern6882"
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6236-32"
+       id="pattern6879"
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6236-64"
+       id="pattern6876"
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6236-2"
+       id="pattern6873"
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6236-74"
+       id="pattern6870"
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6236-48"
+       id="pattern6867"
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6236-31"
+       id="pattern6864"
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03292)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6607-28"
+       id="pattern6861"
+       patternTransform="translate(197.17229,91.542504)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6607-2"
+       id="pattern6859"
+       patternTransform="translate(197.1723,91.542504)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6607-38"
+       id="pattern6857"
+       patternTransform="translate(197.1723,91.542504)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6607-9"
+       id="pattern6855"
+       patternTransform="translate(197.1723,91.542504)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6607-74"
+       id="pattern6853"
+       patternTransform="translate(197.1723,91.542504)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6607-6"
+       id="pattern6851"
+       patternTransform="translate(197.1723,91.542504)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6607-3"
+       id="pattern6849"
+       patternTransform="translate(197.1723,91.542504)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6607-0"
+       id="pattern6847"
+       patternTransform="translate(197.1723,91.542504)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6607-4"
+       id="pattern6845"
+       patternTransform="translate(197.1723,91.542504)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6607-7"
+       id="pattern6843"
+       patternTransform="translate(197.1723,91.542504)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6607"
+       id="pattern6841"
+       patternTransform="translate(197.1723,91.542504)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6575"
+       id="pattern6839"
+       patternTransform="translate(197.1723,91.542505)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6544"
+       id="pattern6837"
+       patternTransform="translate(197.1723,91.542504)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6521"
+       id="pattern6835"
+       patternTransform="translate(197.1723,91.542504)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#Strips1_1"
+       id="pattern6833"
+       patternTransform="matrix(2.2179022,0,0,2.4345375,231.13681,-129.83887)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6510"
+       id="pattern6521"
+       patternTransform="translate(197.1723,91.062098)" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#Strips1_1"
+       id="pattern6188"
+       patternTransform="matrix(1.5682937,1.5682937,-1.721478,1.721478,589.69467,-269.03293)" />
+    <pattern
+       inkscape:stockid="Stripes 1:1"
+       id="Strips1_1"
+       patternTransform="matrix(2.2179022,0,0,2.4345375,229.96544,-129.83887)"
+       height="1"
+       width="2"
+       patternUnits="userSpaceOnUse"
+       inkscape:collect="always">
+      <rect
+         id="rect4756"
+         height="2"
+         width="1"
+         y="-0.5"
+         x="0"
+         style="fill:black;stroke:none" />
+    </pattern>
+    <pattern
+       patternTransform="matrix(2.2179023,0,0,2.4345375,231.13682,-129.83887)"
+       id="pattern5492"
+       xlink:href="#Strips1_1-3"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:stockid="Stripes 1:1"
+       id="Strips1_1-3"
+       patternTransform="matrix(2.2179022,0,0,2.4345375,229.96544,-129.83887)"
+       height="1"
+       width="2"
+       patternUnits="userSpaceOnUse"
+       inkscape:collect="always">
+      <rect
+         id="rect4756-9"
+         height="2"
+         width="1"
+         y="-0.5"
+         x="0"
+         style="fill:black;stroke:none" />
+    </pattern>
+    <pattern
+       patternTransform="matrix(2.2179023,0,0,2.4345375,231.13682,-129.83887)"
+       id="pattern5521-4"
+       xlink:href="#pattern5492-7"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="matrix(2.2179023,0,0,2.4345375,229.96545,-129.83887)"
+       id="pattern5492-7"
+       xlink:href="#Strips1_1-3-8"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:stockid="Stripes 1:1"
+       id="Strips1_1-3-8"
+       patternTransform="matrix(2.2179022,0,0,2.4345375,229.96544,-129.83887)"
+       height="1"
+       width="2"
+       patternUnits="userSpaceOnUse"
+       inkscape:collect="always">
+      <rect
+         id="rect4756-9-63"
+         height="2"
+         width="1"
+         y="-0.5"
+         x="0"
+         style="fill:black;stroke:none" />
+    </pattern>
+    <pattern
+       patternTransform="matrix(2.2179023,0,0,2.4345375,231.13682,-129.83887)"
+       id="pattern5521-7"
+       xlink:href="#pattern5492-2"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="matrix(2.2179023,0,0,2.4345375,229.96545,-129.83887)"
+       id="pattern5492-2"
+       xlink:href="#Strips1_1-3-3"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:stockid="Stripes 1:1"
+       id="Strips1_1-3-3"
+       patternTransform="matrix(2.2179022,0,0,2.4345375,229.96544,-129.83887)"
+       height="1"
+       width="2"
+       patternUnits="userSpaceOnUse"
+       inkscape:collect="always">
+      <rect
+         id="rect4756-9-72"
+         height="2"
+         width="1"
+         y="-0.5"
+         x="0"
+         style="fill:black;stroke:none" />
+    </pattern>
+    <pattern
+       patternTransform="matrix(2.2179023,0,0,2.4345375,231.13682,-129.83887)"
+       id="pattern5521-3"
+       xlink:href="#pattern5492-76"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="matrix(2.2179023,0,0,2.4345375,229.96545,-129.83887)"
+       id="pattern5492-76"
+       xlink:href="#Strips1_1-3-81"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:stockid="Stripes 1:1"
+       id="Strips1_1-3-81"
+       patternTransform="matrix(2.2179022,0,0,2.4345375,229.96544,-129.83887)"
+       height="1"
+       width="2"
+       patternUnits="userSpaceOnUse"
+       inkscape:collect="always">
+      <rect
+         id="rect4756-9-3"
+         height="2"
+         width="1"
+         y="-0.5"
+         x="0"
+         style="fill:black;stroke:none" />
+    </pattern>
+    <pattern
+       patternTransform="matrix(2.2179023,0,0,2.4345375,231.13682,-129.83887)"
+       id="pattern5521-40"
+       xlink:href="#pattern5492-35"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="matrix(2.2179023,0,0,2.4345375,229.96545,-129.83887)"
+       id="pattern5492-35"
+       xlink:href="#Strips1_1-3-85"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:stockid="Stripes 1:1"
+       id="Strips1_1-3-85"
+       patternTransform="matrix(2.2179022,0,0,2.4345375,229.96544,-129.83887)"
+       height="1"
+       width="2"
+       patternUnits="userSpaceOnUse"
+       inkscape:collect="always">
+      <rect
+         id="rect4756-9-0"
+         height="2"
+         width="1"
+         y="-0.5"
+         x="0"
+         style="fill:black;stroke:none" />
+    </pattern>
+    <pattern
+       patternTransform="matrix(2.2179023,0,0,2.4345375,231.13682,-129.83887)"
+       id="pattern5521-9"
+       xlink:href="#pattern5492-8"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="matrix(2.2179023,0,0,2.4345375,229.96545,-129.83887)"
+       id="pattern5492-8"
+       xlink:href="#Strips1_1-3-0"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:stockid="Stripes 1:1"
+       id="Strips1_1-3-0"
+       patternTransform="matrix(2.2179022,0,0,2.4345375,229.96544,-129.83887)"
+       height="1"
+       width="2"
+       patternUnits="userSpaceOnUse"
+       inkscape:collect="always">
+      <rect
+         id="rect4756-9-2"
+         height="2"
+         width="1"
+         y="-0.5"
+         x="0"
+         style="fill:black;stroke:none" />
+    </pattern>
+    <pattern
+       patternTransform="matrix(2.2179023,0,0,2.4345375,231.13682,-129.83887)"
+       id="pattern5521-90"
+       xlink:href="#pattern5492-1"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="matrix(2.2179023,0,0,2.4345375,229.96545,-129.83887)"
+       id="pattern5492-1"
+       xlink:href="#Strips1_1-3-20"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:stockid="Stripes 1:1"
+       id="Strips1_1-3-20"
+       patternTransform="matrix(2.2179022,0,0,2.4345375,229.96544,-129.83887)"
+       height="1"
+       width="2"
+       patternUnits="userSpaceOnUse"
+       inkscape:collect="always">
+      <rect
+         id="rect4756-9-06"
+         height="2"
+         width="1"
+         y="-0.5"
+         x="0"
+         style="fill:black;stroke:none" />
+    </pattern>
+    <pattern
+       patternTransform="matrix(2.2179023,0,0,2.4345375,231.13682,-129.83887)"
+       id="pattern5521-908"
+       xlink:href="#pattern5492-38"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="matrix(2.2179023,0,0,2.4345375,229.96545,-129.83887)"
+       id="pattern5492-38"
+       xlink:href="#Strips1_1-3-7"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:stockid="Stripes 1:1"
+       id="Strips1_1-3-7"
+       patternTransform="matrix(2.2179022,0,0,2.4345375,229.96544,-129.83887)"
+       height="1"
+       width="2"
+       patternUnits="userSpaceOnUse"
+       inkscape:collect="always">
+      <rect
+         id="rect4756-9-31"
+         height="2"
+         width="1"
+         y="-0.5"
+         x="0"
+         style="fill:black;stroke:none" />
+    </pattern>
+    <pattern
+       patternTransform="matrix(2.2179023,0,0,2.4345375,231.13682,-129.83886)"
+       id="pattern5521-0"
+       xlink:href="#pattern5492-5"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="matrix(2.2179023,0,0,2.4345375,229.96545,-129.83887)"
+       id="pattern5492-5"
+       xlink:href="#Strips1_1-3-03"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:stockid="Stripes 1:1"
+       id="Strips1_1-3-03"
+       patternTransform="matrix(2.2179022,0,0,2.4345375,229.96544,-129.83887)"
+       height="1"
+       width="2"
+       patternUnits="userSpaceOnUse"
+       inkscape:collect="always">
+      <rect
+         id="rect4756-9-1"
+         height="2"
+         width="1"
+         y="-0.5"
+         x="0"
+         style="fill:black;stroke:none" />
+    </pattern>
+    <pattern
+       patternTransform="matrix(2.2179025,0,0,2.4345374,231.13683,-129.83887)"
+       id="pattern5703"
+       xlink:href="#pattern5521-4-0"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="matrix(2.2179023,0,0,2.4345375,229.96545,-129.83887)"
+       id="pattern5521-4-0"
+       xlink:href="#pattern5492-7-1"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="matrix(2.2179023,0,0,2.4345375,229.96545,-129.83887)"
+       id="pattern5492-7-1"
+       xlink:href="#Strips1_1-3-8-7"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:stockid="Stripes 1:1"
+       id="Strips1_1-3-8-7"
+       patternTransform="matrix(2.2179022,0,0,2.4345375,229.96544,-129.83887)"
+       height="1"
+       width="2"
+       patternUnits="userSpaceOnUse"
+       inkscape:collect="always">
+      <rect
+         id="rect4756-9-63-9"
+         height="2"
+         width="1"
+         y="-0.5"
+         x="0"
+         style="fill:black;stroke:none" />
+    </pattern>
+    <pattern
+       patternTransform="matrix(2.2179023,0,0,2.4345375,231.13682,-129.83887)"
+       id="pattern5827"
+       xlink:href="#pattern5521-4-5"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="matrix(2.2179023,0,0,2.4345375,229.96545,-129.83887)"
+       id="pattern5521-4-5"
+       xlink:href="#pattern5492-7-9"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="matrix(2.2179023,0,0,2.4345375,229.96545,-129.83887)"
+       id="pattern5492-7-9"
+       xlink:href="#Strips1_1-3-8-5"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:stockid="Stripes 1:1"
+       id="Strips1_1-3-8-5"
+       patternTransform="matrix(2.2179022,0,0,2.4345375,229.96544,-129.83887)"
+       height="1"
+       width="2"
+       patternUnits="userSpaceOnUse"
+       inkscape:collect="always">
+      <rect
+         id="rect4756-9-63-6"
+         height="2"
+         width="1"
+         y="-0.5"
+         x="0"
+         style="fill:black;stroke:none" />
+    </pattern>
+    <pattern
+       patternTransform="matrix(2.2179023,0,0,2.4345375,231.13682,-129.83887)"
+       id="pattern5827-4"
+       xlink:href="#pattern5521-4-3"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="matrix(2.2179023,0,0,2.4345375,229.96545,-129.83887)"
+       id="pattern5521-4-3"
+       xlink:href="#pattern5492-7-7"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="matrix(2.2179023,0,0,2.4345375,229.96545,-129.83887)"
+       id="pattern5492-7-7"
+       xlink:href="#Strips1_1-3-8-2"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:stockid="Stripes 1:1"
+       id="Strips1_1-3-8-2"
+       patternTransform="matrix(2.2179022,0,0,2.4345375,229.96544,-129.83887)"
+       height="1"
+       width="2"
+       patternUnits="userSpaceOnUse"
+       inkscape:collect="always">
+      <rect
+         id="rect4756-9-63-7"
+         height="2"
+         width="1"
+         y="-0.5"
+         x="0"
+         style="fill:black;stroke:none" />
+    </pattern>
+    <pattern
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)"
+       id="pattern6204"
+       xlink:href="#pattern6188-5"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#Strips1_1-39"
+       id="pattern6188-5"
+       patternTransform="matrix(1.5682937,1.5682937,-1.721478,1.721478,589.69467,-269.03293)" />
+    <pattern
+       inkscape:stockid="Stripes 1:1"
+       id="Strips1_1-39"
+       patternTransform="matrix(2.2179022,0,0,2.4345375,229.96544,-129.83887)"
+       height="1"
+       width="2"
+       patternUnits="userSpaceOnUse"
+       inkscape:collect="always">
+      <rect
+         id="rect4756-1"
+         height="2"
+         width="1"
+         y="-0.5"
+         x="0"
+         style="fill:black;stroke:none" />
+    </pattern>
+    <pattern
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)"
+       id="pattern6236"
+       xlink:href="#pattern6204-8"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)"
+       id="pattern6204-8"
+       xlink:href="#pattern6188-5-7"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#Strips1_1-39-0"
+       id="pattern6188-5-7"
+       patternTransform="matrix(1.5682937,1.5682937,-1.721478,1.721478,589.69467,-269.03293)" />
+    <pattern
+       inkscape:stockid="Stripes 1:1"
+       id="Strips1_1-39-0"
+       patternTransform="matrix(2.2179022,0,0,2.4345375,229.96544,-129.83887)"
+       height="1"
+       width="2"
+       patternUnits="userSpaceOnUse"
+       inkscape:collect="always">
+      <rect
+         id="rect4756-1-5"
+         height="2"
+         width="1"
+         y="-0.5"
+         x="0"
+         style="fill:black;stroke:none" />
+    </pattern>
+    <pattern
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)"
+       id="pattern6236-7"
+       xlink:href="#pattern6204-9"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)"
+       id="pattern6204-9"
+       xlink:href="#pattern6188-5-1"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#Strips1_1-39-9"
+       id="pattern6188-5-1"
+       patternTransform="matrix(1.5682937,1.5682937,-1.721478,1.721478,589.69467,-269.03293)" />
+    <pattern
+       inkscape:stockid="Stripes 1:1"
+       id="Strips1_1-39-9"
+       patternTransform="matrix(2.2179022,0,0,2.4345375,229.96544,-129.83887)"
+       height="1"
+       width="2"
+       patternUnits="userSpaceOnUse"
+       inkscape:collect="always">
+      <rect
+         id="rect4756-1-6"
+         height="2"
+         width="1"
+         y="-0.5"
+         x="0"
+         style="fill:black;stroke:none" />
+    </pattern>
+    <pattern
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)"
+       id="pattern6236-6"
+       xlink:href="#pattern6204-84"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)"
+       id="pattern6204-84"
+       xlink:href="#pattern6188-5-6"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#Strips1_1-39-6"
+       id="pattern6188-5-6"
+       patternTransform="matrix(1.5682937,1.5682937,-1.721478,1.721478,589.69467,-269.03293)" />
+    <pattern
+       inkscape:stockid="Stripes 1:1"
+       id="Strips1_1-39-6"
+       patternTransform="matrix(2.2179022,0,0,2.4345375,229.96544,-129.83887)"
+       height="1"
+       width="2"
+       patternUnits="userSpaceOnUse"
+       inkscape:collect="always">
+      <rect
+         id="rect4756-1-7"
+         height="2"
+         width="1"
+         y="-0.5"
+         x="0"
+         style="fill:black;stroke:none" />
+    </pattern>
+    <pattern
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)"
+       id="pattern6236-4"
+       xlink:href="#pattern6204-1"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)"
+       id="pattern6204-1"
+       xlink:href="#pattern6188-5-0"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#Strips1_1-39-06"
+       id="pattern6188-5-0"
+       patternTransform="matrix(1.5682937,1.5682937,-1.721478,1.721478,589.69467,-269.03293)" />
+    <pattern
+       inkscape:stockid="Stripes 1:1"
+       id="Strips1_1-39-06"
+       patternTransform="matrix(2.2179022,0,0,2.4345375,229.96544,-129.83887)"
+       height="1"
+       width="2"
+       patternUnits="userSpaceOnUse"
+       inkscape:collect="always">
+      <rect
+         id="rect4756-1-4"
+         height="2"
+         width="1"
+         y="-0.5"
+         x="0"
+         style="fill:black;stroke:none" />
+    </pattern>
+    <pattern
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)"
+       id="pattern6236-3"
+       xlink:href="#pattern6204-7"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)"
+       id="pattern6204-7"
+       xlink:href="#pattern6188-5-3"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#Strips1_1-39-4"
+       id="pattern6188-5-3"
+       patternTransform="matrix(1.5682937,1.5682937,-1.721478,1.721478,589.69467,-269.03293)" />
+    <pattern
+       inkscape:stockid="Stripes 1:1"
+       id="Strips1_1-39-4"
+       patternTransform="matrix(2.2179022,0,0,2.4345375,229.96544,-129.83887)"
+       height="1"
+       width="2"
+       patternUnits="userSpaceOnUse"
+       inkscape:collect="always">
+      <rect
+         id="rect4756-1-72"
+         height="2"
+         width="1"
+         y="-0.5"
+         x="0"
+         style="fill:black;stroke:none" />
+    </pattern>
+    <pattern
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)"
+       id="pattern6236-79"
+       xlink:href="#pattern6204-5"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)"
+       id="pattern6204-5"
+       xlink:href="#pattern6188-5-68"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#Strips1_1-39-95"
+       id="pattern6188-5-68"
+       patternTransform="matrix(1.5682937,1.5682937,-1.721478,1.721478,589.69467,-269.03293)" />
+    <pattern
+       inkscape:stockid="Stripes 1:1"
+       id="Strips1_1-39-95"
+       patternTransform="matrix(2.2179022,0,0,2.4345375,229.96544,-129.83887)"
+       height="1"
+       width="2"
+       patternUnits="userSpaceOnUse"
+       inkscape:collect="always">
+      <rect
+         id="rect4756-1-52"
+         height="2"
+         width="1"
+         y="-0.5"
+         x="0"
+         style="fill:black;stroke:none" />
+    </pattern>
+    <pattern
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)"
+       id="pattern6236-9"
+       xlink:href="#pattern6204-91"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)"
+       id="pattern6204-91"
+       xlink:href="#pattern6188-5-62"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#Strips1_1-39-1"
+       id="pattern6188-5-62"
+       patternTransform="matrix(1.5682937,1.5682937,-1.721478,1.721478,589.69467,-269.03293)" />
+    <pattern
+       inkscape:stockid="Stripes 1:1"
+       id="Strips1_1-39-1"
+       patternTransform="matrix(2.2179022,0,0,2.4345375,229.96544,-129.83887)"
+       height="1"
+       width="2"
+       patternUnits="userSpaceOnUse"
+       inkscape:collect="always">
+      <rect
+         id="rect4756-1-0"
+         height="2"
+         width="1"
+         y="-0.5"
+         x="0"
+         style="fill:black;stroke:none" />
+    </pattern>
+    <pattern
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)"
+       id="pattern6236-32"
+       xlink:href="#pattern6204-19"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)"
+       id="pattern6204-19"
+       xlink:href="#pattern6188-5-76"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#Strips1_1-39-8"
+       id="pattern6188-5-76"
+       patternTransform="matrix(1.5682937,1.5682937,-1.721478,1.721478,589.69467,-269.03293)" />
+    <pattern
+       inkscape:stockid="Stripes 1:1"
+       id="Strips1_1-39-8"
+       patternTransform="matrix(2.2179022,0,0,2.4345375,229.96544,-129.83887)"
+       height="1"
+       width="2"
+       patternUnits="userSpaceOnUse"
+       inkscape:collect="always">
+      <rect
+         id="rect4756-1-2"
+         height="2"
+         width="1"
+         y="-0.5"
+         x="0"
+         style="fill:black;stroke:none" />
+    </pattern>
+    <pattern
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)"
+       id="pattern6236-64"
+       xlink:href="#pattern6204-3"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)"
+       id="pattern6204-3"
+       xlink:href="#pattern6188-5-36"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#Strips1_1-39-90"
+       id="pattern6188-5-36"
+       patternTransform="matrix(1.5682937,1.5682937,-1.721478,1.721478,589.69467,-269.03293)" />
+    <pattern
+       inkscape:stockid="Stripes 1:1"
+       id="Strips1_1-39-90"
+       patternTransform="matrix(2.2179022,0,0,2.4345375,229.96544,-129.83887)"
+       height="1"
+       width="2"
+       patternUnits="userSpaceOnUse"
+       inkscape:collect="always">
+      <rect
+         id="rect4756-1-48"
+         height="2"
+         width="1"
+         y="-0.5"
+         x="0"
+         style="fill:black;stroke:none" />
+    </pattern>
+    <pattern
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)"
+       id="pattern6236-2"
+       xlink:href="#pattern6204-97"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)"
+       id="pattern6204-97"
+       xlink:href="#pattern6188-5-38"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#Strips1_1-39-09"
+       id="pattern6188-5-38"
+       patternTransform="matrix(1.5682937,1.5682937,-1.721478,1.721478,589.69467,-269.03293)" />
+    <pattern
+       inkscape:stockid="Stripes 1:1"
+       id="Strips1_1-39-09"
+       patternTransform="matrix(2.2179022,0,0,2.4345375,229.96544,-129.83887)"
+       height="1"
+       width="2"
+       patternUnits="userSpaceOnUse"
+       inkscape:collect="always">
+      <rect
+         id="rect4756-1-23"
+         height="2"
+         width="1"
+         y="-0.5"
+         x="0"
+         style="fill:black;stroke:none" />
+    </pattern>
+    <pattern
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)"
+       id="pattern6236-74"
+       xlink:href="#pattern6204-16"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)"
+       id="pattern6204-16"
+       xlink:href="#pattern6188-5-385"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#Strips1_1-39-5"
+       id="pattern6188-5-385"
+       patternTransform="matrix(1.5682937,1.5682937,-1.721478,1.721478,589.69467,-269.03293)" />
+    <pattern
+       inkscape:stockid="Stripes 1:1"
+       id="Strips1_1-39-5"
+       patternTransform="matrix(2.2179022,0,0,2.4345375,229.96544,-129.83887)"
+       height="1"
+       width="2"
+       patternUnits="userSpaceOnUse"
+       inkscape:collect="always">
+      <rect
+         id="rect4756-1-01"
+         height="2"
+         width="1"
+         y="-0.5"
+         x="0"
+         style="fill:black;stroke:none" />
+    </pattern>
+    <pattern
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)"
+       id="pattern6236-48"
+       xlink:href="#pattern6204-56"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)"
+       id="pattern6204-56"
+       xlink:href="#pattern6188-5-2"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#Strips1_1-39-52"
+       id="pattern6188-5-2"
+       patternTransform="matrix(1.5682937,1.5682937,-1.721478,1.721478,589.69467,-269.03293)" />
+    <pattern
+       inkscape:stockid="Stripes 1:1"
+       id="Strips1_1-39-52"
+       patternTransform="matrix(2.2179022,0,0,2.4345375,229.96544,-129.83887)"
+       height="1"
+       width="2"
+       patternUnits="userSpaceOnUse"
+       inkscape:collect="always">
+      <rect
+         id="rect4756-1-69"
+         height="2"
+         width="1"
+         y="-0.5"
+         x="0"
+         style="fill:black;stroke:none" />
+    </pattern>
+    <pattern
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03292)"
+       id="pattern6236-31"
+       xlink:href="#pattern6204-52"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="matrix(1.5682937,1.5682937,-1.7214781,1.721478,589.69469,-269.03293)"
+       id="pattern6204-52"
+       xlink:href="#pattern6188-5-69"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#Strips1_1-39-44"
+       id="pattern6188-5-69"
+       patternTransform="matrix(1.5682937,1.5682937,-1.721478,1.721478,589.69467,-269.03293)" />
+    <pattern
+       inkscape:stockid="Stripes 1:1"
+       id="Strips1_1-39-44"
+       patternTransform="matrix(2.2179022,0,0,2.4345375,229.96544,-129.83887)"
+       height="1"
+       width="2"
+       patternUnits="userSpaceOnUse"
+       inkscape:collect="always">
+      <rect
+         id="rect4756-1-60"
+         height="2"
+         width="1"
+         y="-0.5"
+         x="0"
+         style="fill:black;stroke:none" />
+    </pattern>
+    <pattern
+       patternUnits="userSpaceOnUse"
+       width="9.8994949"
+       height="9.8994949"
+       patternTransform="translate(197.17231,91.062095)"
+       id="pattern6510">
+      <rect
+         transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)"
+         y="3.9870605"
+         x="-3.0051956"
+         height="6"
+         width="6"
+         id="rect6508"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    </pattern>
+    <pattern
+       patternTransform="translate(197.1723,91.062098)"
+       id="pattern6544"
+       xlink:href="#pattern6521-7"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6510-9"
+       id="pattern6521-7"
+       patternTransform="translate(197.1723,91.062098)" />
+    <pattern
+       patternUnits="userSpaceOnUse"
+       width="9.8994949"
+       height="9.8994949"
+       patternTransform="translate(197.17231,91.062095)"
+       id="pattern6510-9">
+      <rect
+         transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)"
+         y="3.9870605"
+         x="-3.0051956"
+         height="6"
+         width="6"
+         id="rect6508-0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    </pattern>
+    <pattern
+       patternTransform="translate(197.1723,91.062099)"
+       id="pattern6575"
+       xlink:href="#pattern6521-2"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6510-2"
+       id="pattern6521-2"
+       patternTransform="translate(197.1723,91.062098)" />
+    <pattern
+       patternUnits="userSpaceOnUse"
+       width="9.8994949"
+       height="9.8994949"
+       patternTransform="translate(197.17231,91.062095)"
+       id="pattern6510-2">
+      <rect
+         transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)"
+         y="3.9870605"
+         x="-3.0051956"
+         height="6"
+         width="6"
+         id="rect6508-6"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    </pattern>
+    <pattern
+       patternTransform="translate(197.1723,91.062098)"
+       id="pattern6607"
+       xlink:href="#pattern6575-0"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="translate(197.1723,91.062099)"
+       id="pattern6575-0"
+       xlink:href="#pattern6521-2-3"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6510-2-5"
+       id="pattern6521-2-3"
+       patternTransform="translate(197.1723,91.062098)" />
+    <pattern
+       patternUnits="userSpaceOnUse"
+       width="9.8994949"
+       height="9.8994949"
+       patternTransform="translate(197.17231,91.062095)"
+       id="pattern6510-2-5">
+      <rect
+         transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)"
+         y="3.9870605"
+         x="-3.0051956"
+         height="6"
+         width="6"
+         id="rect6508-6-5"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    </pattern>
+    <pattern
+       patternTransform="translate(197.1723,91.062098)"
+       id="pattern6607-7"
+       xlink:href="#pattern6575-1"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="translate(197.1723,91.062099)"
+       id="pattern6575-1"
+       xlink:href="#pattern6521-2-7"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6510-2-0"
+       id="pattern6521-2-7"
+       patternTransform="translate(197.1723,91.062098)" />
+    <pattern
+       patternUnits="userSpaceOnUse"
+       width="9.8994949"
+       height="9.8994949"
+       patternTransform="translate(197.17231,91.062095)"
+       id="pattern6510-2-0">
+      <rect
+         transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)"
+         y="3.9870605"
+         x="-3.0051956"
+         height="6"
+         width="6"
+         id="rect6508-6-6"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    </pattern>
+    <pattern
+       patternTransform="translate(197.1723,91.062098)"
+       id="pattern6607-4"
+       xlink:href="#pattern6575-13"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="translate(197.1723,91.062099)"
+       id="pattern6575-13"
+       xlink:href="#pattern6521-2-0"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6510-2-2"
+       id="pattern6521-2-0"
+       patternTransform="translate(197.1723,91.062098)" />
+    <pattern
+       patternUnits="userSpaceOnUse"
+       width="9.8994949"
+       height="9.8994949"
+       patternTransform="translate(197.17231,91.062095)"
+       id="pattern6510-2-2">
+      <rect
+         transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)"
+         y="3.9870605"
+         x="-3.0051956"
+         height="6"
+         width="6"
+         id="rect6508-6-9"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    </pattern>
+    <pattern
+       patternTransform="translate(197.1723,91.062098)"
+       id="pattern6607-0"
+       xlink:href="#pattern6575-9"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="translate(197.1723,91.062099)"
+       id="pattern6575-9"
+       xlink:href="#pattern6521-2-35"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6510-2-4"
+       id="pattern6521-2-35"
+       patternTransform="translate(197.1723,91.062098)" />
+    <pattern
+       patternUnits="userSpaceOnUse"
+       width="9.8994949"
+       height="9.8994949"
+       patternTransform="translate(197.17231,91.062095)"
+       id="pattern6510-2-4">
+      <rect
+         transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)"
+         y="3.9870605"
+         x="-3.0051956"
+         height="6"
+         width="6"
+         id="rect6508-6-3"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    </pattern>
+    <pattern
+       patternTransform="translate(197.1723,91.062098)"
+       id="pattern6607-3"
+       xlink:href="#pattern6575-19"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="translate(197.1723,91.062099)"
+       id="pattern6575-19"
+       xlink:href="#pattern6521-2-1"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6510-2-09"
+       id="pattern6521-2-1"
+       patternTransform="translate(197.1723,91.062098)" />
+    <pattern
+       patternUnits="userSpaceOnUse"
+       width="9.8994949"
+       height="9.8994949"
+       patternTransform="translate(197.17231,91.062095)"
+       id="pattern6510-2-09">
+      <rect
+         transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)"
+         y="3.9870605"
+         x="-3.0051956"
+         height="6"
+         width="6"
+         id="rect6508-6-4"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    </pattern>
+    <pattern
+       patternTransform="translate(197.1723,91.062098)"
+       id="pattern6607-6"
+       xlink:href="#pattern6575-2"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="translate(197.1723,91.062099)"
+       id="pattern6575-2"
+       xlink:href="#pattern6521-2-5"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6510-2-9"
+       id="pattern6521-2-5"
+       patternTransform="translate(197.1723,91.062098)" />
+    <pattern
+       patternUnits="userSpaceOnUse"
+       width="9.8994949"
+       height="9.8994949"
+       patternTransform="translate(197.17231,91.062095)"
+       id="pattern6510-2-9">
+      <rect
+         transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)"
+         y="3.9870605"
+         x="-3.0051956"
+         height="6"
+         width="6"
+         id="rect6508-6-1"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    </pattern>
+    <pattern
+       patternTransform="translate(197.1723,91.062098)"
+       id="pattern6607-74"
+       xlink:href="#pattern6575-11"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="translate(197.1723,91.062099)"
+       id="pattern6575-11"
+       xlink:href="#pattern6521-2-9"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6510-2-1"
+       id="pattern6521-2-9"
+       patternTransform="translate(197.1723,91.062098)" />
+    <pattern
+       patternUnits="userSpaceOnUse"
+       width="9.8994949"
+       height="9.8994949"
+       patternTransform="translate(197.17231,91.062095)"
+       id="pattern6510-2-1">
+      <rect
+         transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)"
+         y="3.9870605"
+         x="-3.0051956"
+         height="6"
+         width="6"
+         id="rect6508-6-38"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    </pattern>
+    <pattern
+       patternTransform="translate(197.1723,91.062098)"
+       id="pattern6607-9"
+       xlink:href="#pattern6575-3"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="translate(197.1723,91.062099)"
+       id="pattern6575-3"
+       xlink:href="#pattern6521-2-13"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6510-2-8"
+       id="pattern6521-2-13"
+       patternTransform="translate(197.1723,91.062098)" />
+    <pattern
+       patternUnits="userSpaceOnUse"
+       width="9.8994949"
+       height="9.8994949"
+       patternTransform="translate(197.17231,91.062095)"
+       id="pattern6510-2-8">
+      <rect
+         transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)"
+         y="3.9870605"
+         x="-3.0051956"
+         height="6"
+         width="6"
+         id="rect6508-6-7"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    </pattern>
+    <pattern
+       patternTransform="translate(197.1723,91.062098)"
+       id="pattern6607-38"
+       xlink:href="#pattern6575-8"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="translate(197.1723,91.062099)"
+       id="pattern6575-8"
+       xlink:href="#pattern6521-2-4"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6510-2-00"
+       id="pattern6521-2-4"
+       patternTransform="translate(197.1723,91.062098)" />
+    <pattern
+       patternUnits="userSpaceOnUse"
+       width="9.8994949"
+       height="9.8994949"
+       patternTransform="translate(197.17231,91.062095)"
+       id="pattern6510-2-00">
+      <rect
+         transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)"
+         y="3.9870605"
+         x="-3.0051956"
+         height="6"
+         width="6"
+         id="rect6508-6-8"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    </pattern>
+    <pattern
+       patternTransform="translate(197.1723,91.062098)"
+       id="pattern6607-2"
+       xlink:href="#pattern6575-38"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="translate(197.1723,91.062099)"
+       id="pattern6575-38"
+       xlink:href="#pattern6521-2-50"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6510-2-59"
+       id="pattern6521-2-50"
+       patternTransform="translate(197.1723,91.062098)" />
+    <pattern
+       patternUnits="userSpaceOnUse"
+       width="9.8994949"
+       height="9.8994949"
+       patternTransform="translate(197.17231,91.062095)"
+       id="pattern6510-2-59">
+      <rect
+         transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)"
+         y="3.9870605"
+         x="-3.0051956"
+         height="6"
+         width="6"
+         id="rect6508-6-2"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    </pattern>
+    <pattern
+       patternTransform="translate(197.17229,91.062098)"
+       id="pattern6607-28"
+       xlink:href="#pattern6575-36"
+       inkscape:collect="always" />
+    <pattern
+       patternTransform="translate(197.1723,91.062099)"
+       id="pattern6575-36"
+       xlink:href="#pattern6521-2-78"
+       inkscape:collect="always" />
+    <pattern
+       inkscape:collect="always"
+       xlink:href="#pattern6510-2-7"
+       id="pattern6521-2-78"
+       patternTransform="translate(197.1723,91.062098)" />
+    <pattern
+       patternUnits="userSpaceOnUse"
+       width="9.8994949"
+       height="9.8994949"
+       patternTransform="translate(197.17231,91.062095)"
+       id="pattern6510-2-7">
+      <rect
+         transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)"
+         y="3.9870605"
+         x="-3.0051956"
+         height="6"
+         width="6"
+         id="rect6508-6-26"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    </pattern>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.1047094"
+     inkscape:cx="215.00586"
+     inkscape:cy="94.431542"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer2"
+     showgrid="false"
+     inkscape:window-width="1016"
+     inkscape:window-height="718"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Vetorial">
+    <g
+       id="g7020">
+      <text
+         sodipodi:linespacing="125%"
+         id="text3050-1-0"
+         y="159.69649"
+         x="72.986145"
+         style="font-size:24px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="159.69649"
+           x="72.986145"
+           id="tspan3160"
+           sodipodi:role="line">Row 5</tspan></text>
+      <rect
+         y="143.61836"
+         x="35.192387"
+         height="15"
+         width="17"
+         id="rect3162"
+         style="fill:#cccccc;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="141.80794"
+         x="183.40567"
+         height="18.620861"
+         width="29.673016"
+         id="rect3162-4"
+         style="fill:#cccccc;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="141.80794"
+         x="244.96031"
+         height="18.620861"
+         width="29.673016"
+         id="rect3162-4-9"
+         style="fill:#cccccc;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="141.80794"
+         x="282.07419"
+         height="18.620861"
+         width="183.55963"
+         id="rect3162-4-4"
+         style="fill:#cccccc;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="141.80794"
+         x="473.07458"
+         height="18.620861"
+         width="29.673016"
+         id="rect3162-4-98"
+         style="fill:#cccccc;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="141.80794"
+         x="533.724"
+         height="18.620861"
+         width="29.673016"
+         id="rect3162-4-1"
+         style="fill:#cccccc;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3050-1"
+         y="133.72653"
+         x="72.611145"
+         style="font-size:24px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="133.72653"
+           x="72.611145"
+           id="tspan3097"
+           sodipodi:role="line">Row 4</tspan></text>
+      <rect
+         transform="matrix(0,1,-1,0,0,0)"
+         y="-52.192387"
+         x="117.64841"
+         height="17"
+         width="15"
+         id="rect3162-6"
+         style="fill:url(#pattern7008);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         transform="matrix(0,1,-1,0,0,0)"
+         y="-227.33467"
+         x="115.38536"
+         height="44.834232"
+         width="19.526077"
+         id="rect3162-6-3"
+         style="fill:url(#pattern7005);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         transform="matrix(0,1,-1,0,0,0)"
+         y="-331.94257"
+         x="115.38536"
+         height="22.431293"
+         width="19.526077"
+         id="rect3162-6-3-7"
+         style="fill:url(#pattern7002);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         transform="matrix(0,1,-1,0,0,0)"
+         y="-358.49057"
+         x="115.38536"
+         height="22.431293"
+         width="19.526077"
+         id="rect3162-6-3-5"
+         style="fill:url(#pattern6999);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         transform="matrix(0,1,-1,0,0,0)"
+         y="-385.03857"
+         x="115.38536"
+         height="22.431293"
+         width="19.526077"
+         id="rect3162-6-3-6"
+         style="fill:url(#pattern6996);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         transform="matrix(0,1,-1,0,0,0)"
+         y="-411.58658"
+         x="115.38536"
+         height="22.431293"
+         width="19.526077"
+         id="rect3162-6-3-9"
+         style="fill:url(#pattern6993);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         transform="matrix(0,1,-1,0,0,0)"
+         y="-438.13458"
+         x="115.38536"
+         height="22.431293"
+         width="19.526077"
+         id="rect3162-6-3-4"
+         style="fill:url(#pattern6990);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         transform="matrix(0,1,-1,0,0,0)"
+         y="-464.68259"
+         x="115.38536"
+         height="22.431293"
+         width="19.526077"
+         id="rect3162-6-3-3"
+         style="fill:url(#pattern6987);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         transform="matrix(0,1,-1,0,0,0)"
+         y="-491.23059"
+         x="115.38536"
+         height="22.431293"
+         width="19.526077"
+         id="rect3162-6-3-0"
+         style="fill:url(#pattern6984);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         transform="matrix(0,1,-1,0,0,0)"
+         y="-562.58673"
+         x="115.38536"
+         height="67.239456"
+         width="19.526077"
+         id="rect3162-6-3-8"
+         style="fill:url(#pattern6981);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         transform="matrix(0,1,-1,0,0,0)"
+         y="-252.29855"
+         x="115.27222"
+         height="20.847166"
+         width="19.752378"
+         id="rect3162-6-3-7-1"
+         style="fill:url(#pattern6978);fill-opacity:1;stroke:#000000;stroke-width:0.99999988;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         transform="matrix(0,1,-1,0,0,0)"
+         y="-278.84656"
+         x="115.38536"
+         height="22.431293"
+         width="19.526077"
+         id="rect3162-6-3-7-11"
+         style="fill:url(#pattern6975);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         transform="matrix(0,1,-1,0,0,0)"
+         y="-305.39456"
+         x="115.38536"
+         height="22.431293"
+         width="19.526077"
+         id="rect3162-6-3-7-3"
+         style="fill:url(#pattern6972);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3050-7"
+         y="82.969315"
+         x="73.138489"
+         style="font-size:24px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="82.969315"
+           x="73.138489"
+           id="tspan3093"
+           sodipodi:role="line">Row 2</tspan></text>
+      <rect
+         y="66.732986"
+         x="35.192387"
+         height="15"
+         width="17"
+         id="rect3162-3"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="65.827774"
+         x="184.31088"
+         height="16.810431"
+         width="30.578232"
+         id="rect3162-3-9"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="65.827774"
+         x="221.77287"
+         height="16.810431"
+         width="18.810432"
+         id="rect3162-3-9-0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="65.827774"
+         x="245.46707"
+         height="16.810431"
+         width="18.810432"
+         id="rect3162-3-9-0-7"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="65.827774"
+         x="269.16125"
+         height="16.810431"
+         width="18.810432"
+         id="rect3162-3-9-0-2"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="65.827774"
+         x="298.85544"
+         height="16.810431"
+         width="18.810432"
+         id="rect3162-3-9-0-72"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="65.827774"
+         x="326.54962"
+         height="16.810431"
+         width="18.810432"
+         id="rect3162-3-9-0-9"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="65.827774"
+         x="351.2438"
+         height="16.810431"
+         width="18.810432"
+         id="rect3162-3-9-0-0"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="65.827774"
+         x="375.93799"
+         height="16.810431"
+         width="18.810432"
+         id="rect3162-3-9-0-5"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="65.827774"
+         x="403.63217"
+         height="16.810431"
+         width="18.810432"
+         id="rect3162-3-9-0-04"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="65.827774"
+         x="433.32635"
+         height="16.810431"
+         width="18.810432"
+         id="rect3162-3-9-0-1"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="65.827774"
+         x="457.52054"
+         height="16.810431"
+         width="18.810432"
+         id="rect3162-3-9-0-79"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="65.827774"
+         x="481.71475"
+         height="16.810431"
+         width="18.810432"
+         id="rect3162-3-9-0-3"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="65.827774"
+         x="505.90897"
+         height="16.810431"
+         width="18.810432"
+         id="rect3162-3-9-0-6"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="65.827774"
+         x="530.10321"
+         height="16.810431"
+         width="32.388664"
+         id="rect3162-3-9-0-21"
+         style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3050"
+         y="58.028015"
+         x="73.044739"
+         style="font-size:24px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="58.028015"
+           x="73.044739"
+           id="tspan3052"
+           sodipodi:role="line">Row 1</tspan></text>
+      <rect
+         inkscape:export-ydpi="3240"
+         inkscape:export-xdpi="3240"
+         transform="matrix(0,1,-1,0,0,0)"
+         y="-52.192387"
+         x="41.94989"
+         height="17"
+         width="15"
+         id="rect3162-3-2"
+         style="fill:url(#pattern6906);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         inkscape:export-ydpi="3240"
+         inkscape:export-xdpi="3240"
+         transform="matrix(0,1,-1,0,0,0)"
+         y="-204.02654"
+         x="40.026306"
+         height="20.620861"
+         width="18.847166"
+         id="rect3162-3-2-8"
+         style="fill:url(#pattern6903);fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         inkscape:export-ydpi="3240"
+         inkscape:export-xdpi="3240"
+         transform="matrix(0,1,-1,0,0,0)"
+         y="-228.91995"
+         x="40.026306"
+         height="20.620861"
+         width="18.847166"
+         id="rect3162-3-2-8-2"
+         style="fill:url(#pattern6900);fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         inkscape:export-ydpi="3240"
+         inkscape:export-xdpi="3240"
+         transform="matrix(0,1,-1,0,0,0)"
+         y="-253.81337"
+         x="40.026306"
+         height="20.620861"
+         width="18.847166"
+         id="rect3162-3-2-8-3"
+         style="fill:url(#pattern6897);fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         inkscape:export-ydpi="3240"
+         inkscape:export-xdpi="3240"
+         transform="matrix(0,1,-1,0,0,0)"
+         y="-278.70679"
+         x="40.026306"
+         height="20.620861"
+         width="18.847166"
+         id="rect3162-3-2-8-27"
+         style="fill:url(#pattern6894);fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         inkscape:export-ydpi="3240"
+         inkscape:export-xdpi="3240"
+         transform="matrix(0,1,-1,0,0,0)"
+         y="-306.31586"
+         x="40.026306"
+         height="20.620861"
+         width="18.847166"
+         id="rect3162-3-2-8-4"
+         style="fill:url(#pattern6891);fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         inkscape:export-ydpi="3240"
+         inkscape:export-xdpi="3240"
+         transform="matrix(0,1,-1,0,0,0)"
+         y="-335.50906"
+         x="40.026306"
+         height="20.620861"
+         width="18.847166"
+         id="rect3162-3-2-8-1"
+         style="fill:url(#pattern6888);fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         inkscape:export-ydpi="3240"
+         inkscape:export-xdpi="3240"
+         transform="matrix(0,1,-1,0,0,0)"
+         y="-360.06302"
+         x="40.026306"
+         height="20.620861"
+         width="18.847166"
+         id="rect3162-3-2-8-15"
+         style="fill:url(#pattern6885);fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         inkscape:export-ydpi="3240"
+         inkscape:export-xdpi="3240"
+         transform="matrix(0,1,-1,0,0,0)"
+         y="-384.61697"
+         x="40.026306"
+         height="20.620861"
+         width="18.847166"
+         id="rect3162-3-2-8-5"
+         style="fill:url(#pattern6882);fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         inkscape:export-ydpi="3240"
+         inkscape:export-xdpi="3240"
+         transform="matrix(0,1,-1,0,0,0)"
+         y="-412.22607"
+         x="40.026306"
+         height="20.620861"
+         width="18.847166"
+         id="rect3162-3-2-8-0"
+         style="fill:url(#pattern6879);fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         inkscape:export-ydpi="3240"
+         inkscape:export-xdpi="3240"
+         transform="matrix(0,1,-1,0,0,0)"
+         y="-438.16376"
+         x="40.026306"
+         height="20.620861"
+         width="18.847166"
+         id="rect3162-3-2-8-51"
+         style="fill:url(#pattern6876);fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         inkscape:export-ydpi="3240"
+         inkscape:export-xdpi="3240"
+         transform="matrix(0,1,-1,0,0,0)"
+         y="-464.10144"
+         x="40.026306"
+         height="20.620861"
+         width="18.847166"
+         id="rect3162-3-2-8-18"
+         style="fill:url(#pattern6873);fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         inkscape:export-ydpi="3240"
+         inkscape:export-xdpi="3240"
+         transform="matrix(0,1,-1,0,0,0)"
+         y="-490.03912"
+         x="40.026306"
+         height="20.620861"
+         width="18.847166"
+         id="rect3162-3-2-8-26"
+         style="fill:url(#pattern6870);fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         inkscape:export-ydpi="3240"
+         inkscape:export-xdpi="3240"
+         transform="matrix(0,1,-1,0,0,0)"
+         y="-515.97681"
+         x="40.026306"
+         height="20.620861"
+         width="18.847166"
+         id="rect3162-3-2-8-13"
+         style="fill:url(#pattern6867);fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         inkscape:export-ydpi="3240"
+         inkscape:export-xdpi="3240"
+         transform="matrix(0,1,-1,0,0,0)"
+         y="-562.77502"
+         x="40.026306"
+         height="40.535599"
+         width="18.847166"
+         id="rect3162-3-2-8-7"
+         style="fill:url(#pattern6864);fill-opacity:1;stroke:#000000;stroke-width:0.99999988;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text3050-5"
+         y="107.77702"
+         x="72.898254"
+         style="font-size:24px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+         xml:space="preserve"><tspan
+           y="107.77702"
+           x="72.898254"
+           id="tspan3095"
+           sodipodi:role="line">Row 3</tspan></text>
+      <rect
+         y="89.592499"
+         x="182.74036"
+         height="18.896372"
+         width="35.86916"
+         id="rect6515"
+         style="fill:url(#pattern6967);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="91.540688"
+         x="35.192387"
+         height="15"
+         width="17"
+         id="rect6515-0"
+         style="fill:url(#pattern6964);fill-opacity:1;stroke:#000000;stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="89.592499"
+         x="223.49092"
+         height="18.896372"
+         width="21.787313"
+         id="rect6515-9"
+         style="fill:url(#pattern6961);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="89.592499"
+         x="250.15965"
+         height="18.896372"
+         width="21.787313"
+         id="rect6515-9-8"
+         style="fill:url(#pattern6958);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="89.592499"
+         x="276.82837"
+         height="18.896372"
+         width="21.787313"
+         id="rect6515-9-0"
+         style="fill:url(#pattern6955);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="89.592499"
+         x="303.4971"
+         height="18.896372"
+         width="21.787313"
+         id="rect6515-9-6"
+         style="fill:url(#pattern6952);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="89.592499"
+         x="330.16583"
+         height="18.896372"
+         width="21.787313"
+         id="rect6515-9-64"
+         style="fill:url(#pattern6949);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="89.592499"
+         x="356.83456"
+         height="18.896372"
+         width="21.787313"
+         id="rect6515-9-5"
+         style="fill:url(#pattern6946);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="89.592499"
+         x="383.5033"
+         height="18.896372"
+         width="21.787313"
+         id="rect6515-9-7"
+         style="fill:url(#pattern6943);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="89.592499"
+         x="410.17203"
+         height="18.896372"
+         width="21.787313"
+         id="rect6515-9-74"
+         style="fill:url(#pattern6940);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="89.592499"
+         x="436.84076"
+         height="18.896372"
+         width="21.787313"
+         id="rect6515-9-9"
+         style="fill:url(#pattern6937);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="89.592499"
+         x="463.50949"
+         height="18.896372"
+         width="21.787313"
+         id="rect6515-9-68"
+         style="fill:url(#pattern6934);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="89.592499"
+         x="490.17822"
+         height="18.896372"
+         width="21.787313"
+         id="rect6515-9-685"
+         style="fill:url(#pattern6931);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+      <rect
+         y="89.592499"
+         x="516.84692"
+         height="18.896372"
+         width="46.22813"
+         id="rect6515-9-62"
+         style="fill:url(#pattern6928);fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+    </g>
+  </g>
+</svg>
diff --git a/specs/XKB/acknowledgement.xml b/specs/XKB/acknowledgement.xml
new file mode 100644 (file)
index 0000000..4ecb798
--- /dev/null
@@ -0,0 +1,43 @@
+<preface id='acknowledgement'>
+<title>Acknowledgement</title>
+<para>
+This document is the result of a great deal of hard work by a great
+many people. Without Erik Fortune’s work as Architect of the X
+Keyboard Extension and the longtime support of Silicon Graphics
+Inc. there would not be a keyboard extension.
+</para>
+<para>
+We gratefully thank Will Walker and George Sachs for their help and
+expertise in providing some of the content for this document, and
+Digital Equipment Corporation and Hewlett-Packard for allowing them
+to participate in this project, and we are deeply indebted to IBM for
+providing the funding to complete this library specification.
+</para>
+<para>
+Most of all, we thank Gary Aitken and Amber J. Benson for their long
+hours and late nights as ultimate authors of this specification, and
+for serving as authors, document editors, and XKB protocol and
+implementation reviewers. Their commitment to accuracy and completeness,
+their attention to detail, their keen insight, and their good natures
+when working under tremendous pressure are in some measure responsible
+not only for the quality of this document, but for the quality of the
+Keyboard extension itself.
+</para>
+<para>
+<literallayout>
+Matt Landau
+Manager, X Window System
+X Consortium Inc.
+</literallayout>
+</para>
+<simplesect>
+<title>X Version 11, Release 7 addendum</title>
+<para>
+This document is made available to you in modern formats such as HTML and PDF
+thanks to the efforts of Matt Dew, who converted the original troff sources to
+DocBook/XML and edited them into shape; Fernando Carrijo, who converted the
+images to SVG format; and Gaetan Nadon, who set up the formatting machinery in
+the libX11 builds and performed further editing of the DocBook markup.
+</para>
+</simplesect>
+</preface>
diff --git a/specs/XKB/ch01.xml b/specs/XKB/ch01.xml
new file mode 100644 (file)
index 0000000..15cc97d
--- /dev/null
@@ -0,0 +1,405 @@
+<chapter id='Overview'>
+<title>Overview</title>
+
+<para>
+The X Keyboard Extension provides capabilities that are lacking or are
+cumbersome in the core X protocol.
+</para>
+
+<sect1 id='Core_X_Protocol_Support_for_Keyboards'>
+<title>Core X Protocol Support for Keyboards</title>
+
+<para>
+The core X protocol specifies the ways that the
+<emphasis>Shift</emphasis>,
+<emphasis>Control</emphasis>, and
+<emphasis>Lock</emphasis>
+modifiers and the modifiers bound to the
+<emphasis>Mode_switch</emphasis> or
+<emphasis>Num_Lock</emphasis>
+keysyms interact to generate keysyms and characters. The core protocol also
+allows users to specify that a key affects one or more modifiers. This behavior
+is simple and fairly flexible, but it has a number of limitations that make it
+difficult or impossible to properly support many common varieties of keyboard
+behavior. The limitations of core protocol support for keyboards include:
+</para>
+
+<itemizedlist>
+  <listitem>
+    <para>
+Use of a single, uniform, four-symbol mapping for all keyboard keys makes it
+difficult to properly support keyboard overlays, PC-style break keys, or
+keyboards that comply with ISO9995, or a host of other national and
+international standards.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A second keyboard group may be specified using a modifier, but this has side
+effects that wreak havoc with client grabs and X toolkit translations.
+Furthermore, this approach limits the number of keyboard groups to two.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Poorly specified locking key behavior requires X servers to look for a few
+"magic" keysyms to determine that keys should lock when pressed. This leads to
+incompatibilities between X servers with no way for clients to detect
+implementation differences.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Poorly specified capitalization and control behavior requires modifications to
+X library source code to support new character sets or locales and can lead to
+incompatibilities between system wide and X library capitalization behavior.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Limited interactions between modifiers specified by the core protocol make many
+common keyboard behaviors difficult or impossible to implement. For example,
+there is no reliable way to indicate whether or not the shift modifier should
+"cancel" the lock modifier.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The lack of any explicit descriptions for indicators, most modifiers, and other
+aspects of the keyboard appearance requires clients that wish to clearly
+describe the keyboard to a user to resort to a mish-mash of prior knowledge and
+heuristics.
+    </para>
+  </listitem>
+</itemizedlist>
+
+</sect1>
+<sect1 id='Xkb_Keyboard_Extension_Support_for_Keyboards'>
+<title>Xkb Keyboard Extension Support for Keyboards</title>
+
+<para>
+The X Keyboard Extension makes it possible to clearly and explicitly specify
+most aspects of keyboard behavior on a per-key basis. It adds the notion of a
+keyboard group to the global keyboard state and provides mechanisms to more
+closely track the logical and physical state of the keyboard. For
+keyboard-control clients, Xkb provides descriptions and symbolic names for many
+aspects of keyboard appearance and behavior.
+</para>
+
+<para>
+In addition, the X Keyboard Extension includes additional keyboard controls
+designed to make keyboards more accessible to people with movement impairments.
+</para>
+
+</sect1>
+
+<sect1 id='Xkb_Extension_Components'>
+<title>Xkb Extension Components</title>
+
+<para>
+The Xkb extension is composed of two parts: a server extension, and a
+client-side X library extension. These consist of a loadable module that may be
+activated when an X server is started and a modified version of Xlib. Both
+server and Xlib versions must be at least X11 R6.
+</para>
+
+
+<para>
+Figure 1.1 shows the overall structure of the Xkb extension:
+</para>
+
+<mediaobject>
+  <imageobject>
+    <imagedata format="SVG" fileref="XKBlib-1.svg"/>
+  </imageobject>
+  <caption>Overall Xkb Structure</caption>
+</mediaobject>
+
+
+<para>
+The server portion of the Xkb extension encompasses a database of named
+keyboard components, in unspecified format, that may be used to configure a
+keyboard. Internally, the server maintains a <emphasis>
+keyboard description</emphasis>
+ that includes the keyboard state and configuration (mapping). By "keyboard" we
+mean the logical keyboard device, which includes not only the physical keys,
+but also potentially a set of up to 32 indicators (usually LEDs) and bells.
+</para>
+
+
+<para>
+The keyboard description is a composite of several different data structures,
+each of which may be manipulated separately. When manipulating the server
+components, the design allows partial components to be transmitted between the
+server and a client. The individual components are shown in Figure 1.1.
+</para>
+
+<variablelist>
+  <varlistentry>
+    <term>Client Map</term>
+    <listitem>
+      <para>
+The key mapping information needed to convert arbitrary keycodes to symbols.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>Server Map</term>
+    <listitem>
+      <para>
+The key mapping information categorizing keys by functionality (which keys are
+modifiers, how keys behave, and so on).
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>Controls</term>
+    <listitem>
+      <para>
+Client configurable quantities effecting how the keyboard behaves, such as
+repeat behavior and modifications for people with movement impairments.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>Indicators</term>
+    <listitem>
+      <para>
+The mapping of behavior to indicators.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>Geometry</term>
+    <listitem>
+      <para>
+A complete description of the physical keyboard layout, sufficient to draw a
+representation of the keyboard.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>Names</term>
+    <listitem>
+      <para>
+A mapping of names to various aspects of the keyboard such as individual
+virtual modifiers, indicators, and bells.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>Compatibility Map</term>
+    <listitem>
+      <para>
+The definition of how to map core protocol keyboard state to Xkb keyboard state.
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+A client application interrogates and manipulates the keyboard by reading and
+writing portions of the server description for the keyboard. In a typical
+sequence a client would fetch the current information it is interested in,
+modify it, and write it back. If a client wishes to track some portion of the
+keyboard state, it typically maintains a local copy of the portion of the
+server keyboard description dealing with the items of interest and updates this
+local copy from events describing state transitions that are sent by the server.
+</para>
+
+<para>
+A client may request the server to reconfigure the keyboard either by sending
+explicit reconfiguration instructions to it, or by telling it to load a new
+configuration from its database of named components. Partial reconfiguration
+and incremental reconfiguration are both supported.
+</para>
+
+<sect2 id='Groups_and_Shift_Levels'>
+<title>Groups and Shift Levels</title>
+
+<para>
+The graphic characters or control functions that may be accessed by one key are
+logically arranged in groups and levels. See section 14.1for a complete
+description of groups and levels.
+</para>
+
+
+</sect2>
+<sect2 id='Radio_Groups'>
+<title>Radio Groups</title>
+
+<para>
+A radio group is a set of keys whose behavior simulates a set of radio buttons.
+Once a key in a radio group is pressed, it stays logically depressed until
+another key in the group is pressed, at which point the previously depressed
+key is logically released. Consequently, at most one key in a radio group can
+be logically depressed at one time. A radio group is defined by a radio group
+index, an optional name, and by assigning each key in the radio group <emphasis>
+XkbKB_RadioGroup</emphasis>
+ behavior and the radio group index.
+</para>
+
+</sect2>
+</sect1>
+
+<sect1 id='Client_Types'>
+<title>Client Types</title>
+
+<para>
+This specification differentiates between three different classes of client
+applications:
+</para>
+
+<itemizedlist>
+  <listitem>
+    <para>
+Xkb-aware applications
+    </para>
+    <para>
+These applications make specific use of Xkb functionality and APIs not present
+in the core protocol.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Xkb-capable applications
+    </para>
+    <para>
+These applications make no use of Xkb extended functionality and Application
+Programming Interfaces (APIs) directly. However, they are linked with a version
+of Xlib that includes Xkb and indirectly benefit from some of Xkb’s
+features.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Xkb-unaware applications
+    </para>
+    <para>
+These applications make no use of Xkb extended functionality or APIs and
+require Xkb’s functionality to be mapped to core Xlib functionality to
+operate properly.
+    </para>
+  </listitem>
+</itemizedlist>
+
+</sect1>
+
+<sect1 id='Compatibility_With_the_Core_Protocol'>
+<title>Compatibility With the Core Protocol</title>
+
+<para>
+Because the Xkb extension allows a keyboard to be configured in ways not
+foreseen by the core protocol, and because Xkb-unaware clients are allowed to
+connect to a server using the Xkb extension, there must be a means of
+converting between the Xkb domain and the core protocol. The Xkb server
+extension maintains a compatibility map as part of its keyboard description;
+this map controls the conversion of Xkb generated events to core protocol
+events and the results of core protocol requests to appropriate Xkb state and
+configuration.
+</para>
+
+
+</sect1>
+<sect1 id='Additional_Protocol_Errors'>
+<title>Additional Protocol Errors</title>
+
+<para>
+The Xkb extension adds a single protocol error, <emphasis>
+BadKeyboard</emphasis>
+, to the core protocol error set. See section 2.6 for a discussion of the  <!-- xref -->
+<emphasis>
+BadKeyboard</emphasis>
+ protocol error.
+</para>
+
+
+</sect1>
+<sect1 id='Extension_Library_Functions'>
+<title>Extension Library Functions</title>
+
+<para>
+The X Keyboard Extension replaces the core protocol definition of a keyboard
+with a more comprehensive one. The X Keyboard Extension library interfaces are
+included in Xlib.<footnote><para>
+X11R6.1 is the first release by the X Consortium, Inc.,that includes the X
+Keyboard Extension in Xlib. X11R6 included work in progress on this extension
+as nonstandard additions to the library.
+</para>
+</footnote>
+</para>
+
+<para>
+Xlib detects the presence of the X Keyboard server extension and uses Xkb
+protocol to replace some standard X library functions related to the keyboard.
+If an application uses only standard X library functions to examine the
+keyboard or process key events, it should not need to be modified when linked
+with an X library containing the X keyboard extension. All of the
+keyboard-related X library functions have been modified to automatically use
+Xkb protocol when the server extension is present.
+</para>
+
+<para>
+The Xkb extension adds library interfaces to allow a client application to
+directly manipulate the new capabilities.
+</para>
+
+
+<sect2 id='Error_Indications'>
+<title>Error Indications</title>
+
+<para>
+Xkb functions that communicate with the X server check to be sure the Xkb
+extension has been properly initialized prior to doing any other operations. If
+the extension has not been properly initialized or the application, library,
+and server versions are incompatible, these functions return an error
+indication as shown in Table 1.1. Because of this test, <emphasis>
+BadAccess</emphasis>
+ and <emphasis>
+BadMatch</emphasis>
+ (due to incompatible versions) protocol errors should normally not be
+generated.
+</para>
+
+<table frame='topbot'>
+<!-- <caption>Function Error Returns Due to Extension Problems</caption> -->
+<title>Function Error Returns Due to Extension Problems</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='1.0*'/>
+<thead>
+  <row rowsep='1'>
+    <entry>Functions return type</entry>
+    <entry>Return value</entry>
+  </row>
+</thead>
+<tbody>
+  <row>
+    <entry>pointer to a structure</entry>
+    <entry>NULL</entry>
+  </row>
+  <row>
+    <entry>Bool</entry>
+    <entry>False</entry>
+  </row>
+  <row>
+    <entry>Status</entry>
+    <entry>BadAccess</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+Many Xkb functions do not actually communicate with the X server; they only
+require processing in the client-side portion of the library. Furthermore, some
+applications may never actually need to communicate with the server; they
+simply use the Xkb library capabilities. The functions that do not communicate
+with the server return either a pointer to a structure, a Bool, or a Status.
+These functions check that the application has queried the Xkb library version
+and return the values shown in Table 1.1 if it has not.
+</para>
+</sect2>
+</sect1>
+</chapter>
diff --git a/specs/XKB/ch02.xml b/specs/XKB/ch02.xml
new file mode 100644 (file)
index 0000000..b626a43
--- /dev/null
@@ -0,0 +1,824 @@
+<chapter id='Initialization_and_General_Programming_Information'>
+<title>Initialization and General Programming Information</title>
+<sect1 id='Extension_Header_Files'>
+<title>Extension Header Files</title>
+<para>
+The following include files are part of the Xkb standard:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+<emphasis>&lt;X11/XKBlib.h&gt;</emphasis>
+    </para>
+    <para><emphasis>XKBlib.h</emphasis>
+is the main header file for Xkb; it declares constants, types, and
+functions.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<emphasis>&lt;X11/extensions/XKBstr.h&gt;</emphasis>
+    </para>
+    <para>
+<emphasis>XKBstr.h</emphasis> declares types and
+constants for Xkb. It is included automatically from
+<emphasis>&lt;X11/XKBlib.h&gt;</emphasis>
+; you should never need to reference it directly in your application code.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<emphasis>&lt;X11/extensions/XKB.h&gt;</emphasis>
+    </para>
+    <para>
+<emphasis>XKB.h</emphasis>
+defines constants for Xkb. It is included automatically from <emphasis>
+&lt;X11/XKBstr.h&gt;</emphasis>
+; you should never need to reference it directly in your application code.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<emphasis>&lt;X11/extensions/XKBgeom.h&gt;</emphasis>
+   </para>
+   <para><emphasis>XKBgeom.h</emphasis>
+declares types, symbolic constants, and functions for manipulating
+keyboard geometry descriptions.
+    </para>
+  </listitem>
+</itemizedlist>
+</sect1>
+<sect1 id='Extension_Name'>
+<title>Extension Name</title>
+<para>
+The name of the Xkb extension is given in <emphasis>
+&lt;X11/extensions/Xkb.h&gt;:</emphasis>
+</para>
+
+<para>
+<emphasis>
+#define XkbName "XKEYBOARD"</emphasis>
+</para>
+
+<para>
+Most extensions to the X protocol are initialized by calling <emphasis>
+XInitExtension</emphasis>
+ and passing the extension name. However, as explained in section 2.4, Xkb
+requires a more complex initialization sequence, and a client program should
+not call <emphasis>
+XInitExtension</emphasis>
+ directly.
+</para>
+</sect1>
+<sect1 id='Determining_Library_Compatibility'>
+<title>Determining Library Compatibility</title>
+<para>
+If an application is dynamically linked, both the X server and the client-side
+X library must contain the Xkb extension in order for the client to use the Xkb
+extension capabilities. Therefore a dynamically linked application must check
+both the library and the server for compatibility before using Xkb function
+calls. A properly written program must check for compatibility between the
+version of the Xkb library that is dynamically loaded and the one used when the
+application was built. It must then check the server version for compatibility
+with the version of Xkb in the library.
+</para>
+<para>
+If your application is statically linked, you must still check for server
+compatibility and may check library compatibility. (It is possible to compile
+against one set of header files and link against a different, incompatible,
+version of the library, although this should not normally occur.)
+</para>
+<para>
+To determine the compatibility of a library at runtime, call <emphasis>
+XkbLibraryVersion</emphasis>.
+</para>
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbLibraryVersion</emphasis>
+(<emphasis>
+lib_major_in_out</emphasis>
+, <emphasis>
+lib_minor_in_out</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int *      <emphasis>
+lib_major_in_out;</emphasis>
+                  /* specifies and returns the major Xkb library version. */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int *      <emphasis>
+lib_minor_in_out;</emphasis>
+                  /* specifies and returns the minor Xkb library version. */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+Pass the symbolic value <emphasis>
+XkbMajorVersion</emphasis>
+ in <emphasis>
+lib_major_in_out</emphasis>
+ and <emphasis>
+XkbMinorVersion</emphasis>
+ in <emphasis>
+lib_minor_in_out</emphasis>
+. These arguments represent the version of the library used at compile time.
+The <emphasis>
+XkbLibraryVersion </emphasis>
+function backfills the major and minor version numbers of the library used at
+run time in <emphasis>
+lib_major_in_out</emphasis>
+ and <emphasis>
+lib_minor_in_out</emphasis>
+. If the versions of the compile time and run time libraries are compatible,
+<emphasis>
+XkbLibraryVersion </emphasis>
+returns <emphasis>
+True</emphasis>
+, otherwise, it returns <emphasis>
+False.</emphasis>
+</para>
+
+<para>
+In addition, in order to use the Xkb extension, you must ensure that the
+extension is present in the server and that the server supports the version of
+the extension expected by the client. Use <emphasis>
+XkbQueryExtension</emphasis>
+ to do this, as described in the next section.
+</para>
+
+</sect1>
+<sect1 id='Initializing_the_Keyboard_Extension'>
+<title>Initializing the Keyboard Extension</title>
+<para>
+Call <emphasis>
+XkbQueryExtension</emphasis>
+ to check for the presence and compatibility of the extension in the server and
+to initialize the extension. Because of potential version mismatches, you
+cannot use the generic extension mechanism functions (<emphasis>
+XQueryExtension </emphasis>
+and<emphasis>
+ XInitExtension</emphasis>
+) for checking for the presence of, and initializing the Xkb extension.
+</para>
+
+<para>
+You must call <emphasis>
+XkbQueryExtension</emphasis>
+ or <emphasis>
+XkbOpenDisplay</emphasis>
+ before using any other Xkb library interfaces, unless such usage is explicitly
+allowed in the interface description in this document. The exceptions are:
+<emphasis>
+XkbIgnoreExtension</emphasis>
+, <emphasis>
+XkbLibraryVersion</emphasis>
+, and a handful of audible-bell functions. You should not use any other Xkb
+functions if the extension is not present or is uninitialized. In general,
+calls to Xkb library functions made prior to initializing the Xkb extension
+cause <emphasis>
+BadAccess</emphasis>
+ protocol errors.
+</para>
+
+<para>
+<emphasis>
+XkbQueryExtension</emphasis>
+ both determines whether a compatible Xkb extension is present in the X server
+and initializes the extension when it is present.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbQueryExtension</emphasis>
+(<emphasis>
+dpy, opcode_rtrn, event_rtrn, error_rtrn, major_in_out, minor_in_out</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *      <emphasis>
+dpy;      </emphasis>
+      /* connection to the X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int *      <emphasis>
+opcode_rtrn</emphasis>
+;            /* backfilled with the major extension opcode */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int *      <emphasis>
+event_rtrn</emphasis>
+;            /* backfilled with the extension base event code */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int *      <emphasis>
+error_rtrn</emphasis>
+;            /* backfilled with the extension base error code */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int *      <emphasis>
+major_in_out</emphasis>
+;            /* compile time lib major version in, server major version out */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int *      <emphasis>
+minor_in_out;      </emphasis>
+      /* compile time lib min version in, server minor version out */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+The <emphasis>
+XkbQueryExtension</emphasis>
+ function determines whether a compatible version of the X Keyboard Extension
+is present in the server. If a compatible extension is present, <emphasis>
+XkbQueryExtension</emphasis>
+ returns <emphasis>
+True</emphasis>
+; otherwise, it returns <emphasis>
+False</emphasis>
+.
+</para>
+
+<para>
+If a compatible version of Xkb is present, <emphasis>
+XkbQueryExtension</emphasis>
+ initializes the extension. It backfills the major opcode for the keyboard
+extension in <emphasis>
+opcode_rtrn</emphasis>
+, the base event code in <emphasis>
+event_rtrn</emphasis>
+<emphasis>
+, the base error code</emphasis>
+ in <emphasis>
+error_rtrn</emphasis>
+, and the major and minor version numbers of the extension in <emphasis>
+major_in_out</emphasis>
+ and <emphasis>
+minor_in_out</emphasis>
+. The major opcode is reported in the <emphasis>
+req_major</emphasis>
+ fields of some Xkb events. For a discussion of the base event code, see
+section 4.1. <!-- xref -->
+</para>
+
+<para>
+As a convenience, you can use the function <emphasis>
+XkbOpenDisplay</emphasis>
+ to perform these three tasks at once: open a connection to an X server, check
+for a compatible version of the Xkb extension in both the library and the
+server, and initialize the extension for use.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Display *<emphasis>
+XkbOpenDisplay</emphasis>
+(<emphasis>
+display_name, event_rtrn, error_rtrn, major_in_out, minor_in_out,
+reason_rtrn)</emphasis>
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+char *      <emphasis>
+display_name</emphasis>
+;      /* hardware display name, which determines the display and
+communications domain to be used */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int *      <emphasis>
+event_rtrn</emphasis>
+;      /* backfilled with the extension base event code */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int *      <emphasis>
+error_rtrn</emphasis>
+;      /* backfilled with the extension base error code */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int *      <emphasis>
+major_in_out</emphasis>
+;      /* compile time lib major version in, server major version out */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int *      <emphasis>
+minor_in_out</emphasis>
+;      /* compile time lib minor version in, server minor version out */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int *      <emphasis>
+reason_rtrn</emphasis>
+;      /* backfilled with a status code */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbOpenDisplay </emphasis>
+is a convenience function that opens an X display connection and initializes
+the X keyboard extension. In all cases, upon return <emphasis>
+reason_rtrn</emphasis>
+ contains a status value indicating success or the type of failure. If
+<emphasis>
+major_in_out</emphasis>
+ and <emphasis>
+minor_in_out</emphasis>
+ are not <emphasis>
+NULL</emphasis>
+, <emphasis>
+XkbOpenDisplay</emphasis>
+ first calls <emphasis>
+XkbLibraryVersion</emphasis>
+ to determine whether the client library is compatible, passing it the values
+pointed to by <emphasis>
+major_in_out</emphasis>
+ and <emphasis>
+minor_in_out</emphasis>
+. If the library is incompatible, <emphasis>
+XkbOpenDisplay</emphasis>
+ backfills <emphasis>
+major_in_out</emphasis>
+ and <emphasis>
+minor_in_out</emphasis>
+ with the major and minor extension versions of the library being used and
+returns <emphasis>
+NULL</emphasis>
+. If the library is compatible,<emphasis>
+ XkbOpenDisplay </emphasis>
+next calls <emphasis>
+XOpenDisplay</emphasis>
+ with the <emphasis>
+display_name</emphasis>
+. If this fails, the function returns <emphasis>
+NULL</emphasis>
+. If successful, <emphasis>
+XkbOpenDisplay </emphasis>
+calls <emphasis>
+XkbQueryExtension</emphasis>
+ and<emphasis>
+ </emphasis>
+backfills the major and minor Xkb server extension version numbers in <emphasis>
+major_in_out</emphasis>
+ and <emphasis>
+minor_in_out</emphasis>
+.<emphasis>
+ </emphasis>
+If the server extension version is not compatible with the library extension
+version or if the server extension is not present, <emphasis>
+XkbOpenDisplay </emphasis>
+closes the display and returns <emphasis>
+NULL</emphasis>
+. When successful, the function returns the display connection<emphasis>
+.</emphasis>
+</para>
+
+<para>
+The possible values for <emphasis>
+reason_rtrn</emphasis> are:
+</para>
+
+<itemizedlist>
+<listitem>
+  <para>
+<emphasis>
+XkbOD_BadLibraryVersion</emphasis>
+ indicates <emphasis>
+XkbLibraryVersion </emphasis>
+returned <emphasis>
+False</emphasis>.
+  </para>
+</listitem>
+<listitem>
+  <para>
+<emphasis>
+XkbOD_ConnectionRefused</emphasis>
+ indicates the display could not be opened.
+  </para>
+</listitem>
+<listitem>
+  <para>
+<emphasis>
+XkbOD_BadServerVersion</emphasis>
+ indicates the library and the server have incompatible extension versions.
+  </para>
+</listitem>
+<listitem>
+  <para>
+<emphasis>
+XkbOD_NonXkbServer</emphasis>
+ indicates the extension is not present in the X server.
+  </para>
+</listitem>
+<listitem>
+  <para>
+<emphasis>
+XkbOD_Success</emphasis>
+ indicates that the function succeeded.
+  </para>
+</listitem>
+</itemizedlist>
+</sect1>
+
+<sect1 id='Disabling_the_Keyboard_Extension'>
+<title>Disabling the Keyboard Extension</title>
+<para>
+If a server supports the Xkb extension, the X library normally implements
+preXkb keyboard functions using the Xkb keyboard description and state. The
+server Xkb keyboard state may differ from the preXkb keyboard state. This
+difference does not affect most clients, but there are exceptions. To allow
+these clients to work properly, you may instruct the extension not to use Xkb
+functionality.
+</para>
+
+<para>
+Call <emphasis>
+XkbIgnoreExtension</emphasis>
+ to prevent core X library keyboard functions from using the X Keyboard
+Extension. You must call <emphasis>
+XkbIgnoreExtension</emphasis>
+ before you open a server connection; Xkb does not provide a way to enable or
+disable use of the extension once a connection is established.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool<emphasis>
+ XkbIgnoreExtension</emphasis>
+(<emphasis>
+ignore</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool      <emphasis>
+ignore</emphasis>
+;      /* <emphasis>
+True</emphasis>
+ means ignore the extension */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbIgnoreExtension</emphasis>
+ tells the X library whether to use the X Keyboard Extension on any
+subsequently opened X display connections. If ignore is <emphasis>
+True</emphasis>
+, the library does not initialize the Xkb extension when it opens a new
+display. This forces the X server to use compatibility mode and communicate
+with the client using only core protocol requests and events. If ignore is
+<emphasis>
+False</emphasis>
+, the library treats subsequent calls to <emphasis>
+XOpenDisplay</emphasis>
+ normally and uses Xkb extension requests, events, and state. Do not explicitly
+use Xkb on a connection for which it is disabled.<emphasis>
+ XkbIgnoreExtension</emphasis>
+ returns <emphasis>
+False</emphasis>
+ if it was unable to apply the ignore request.
+</para>
+
+</sect1>
+<sect1 id='Protocol_Errors'>
+<title>Protocol Errors</title>
+<para>
+Many of the Xkb extension library functions described in this document can
+cause the X server to report an error, referred to in this document as a
+<emphasis>
+BadXxx</emphasis>
+ protocol error, where <emphasis>
+Xxx</emphasis>
+ is some name. These errors are fielded in the normal manner, by the default
+Xlib error handler or one replacing it. Note that X protocol errors are not
+necessarily reported immediately because of the buffering of X protocol
+requests in Xlib and the server.
+</para>
+
+<para>
+Table 2.1 lists the protocol errors that can be generated, and their causes. <!-- xref -->
+</para>
+
+<table frame='topbot'>
+<title>Xkb Protocol Errors</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='3.0*'/>
+<thead>
+  <row rowsep='1'>
+    <entry>Error</entry>
+    <entry>Cause</entry>
+  </row>
+</thead>
+<tbody>
+  <row>
+    <entry>BadAccess</entry>
+    <entry>
+<para>
+The Xkb extension has not been properly initialized
+</para>
+    </entry>
+  </row>
+  <row>
+    <entry>BadKeyboard</entry>
+    <entry>
+<para>
+The device specified was not a valid core or input extension device
+</para>
+    </entry>
+  </row>
+  <row>
+    <entry>BadImplementation</entry>
+    <entry>
+<para>
+Invalid reply from server
+</para>
+    </entry>
+  </row>
+  <row>
+    <entry>BadAlloc</entry>
+    <entry>
+<para>
+Unable to allocate storage
+</para>
+    </entry>
+  </row>
+  <row>
+    <entry>BadMatch</entry>
+    <entry>
+<para>
+A compatible version of Xkb was not available in the server or an argument has
+correct type and range, but is otherwise invalid
+</para>
+    </entry>
+  </row>
+  <row>
+    <entry>BadValue</entry>
+    <entry>
+<para>
+An argument is out of range
+</para>
+    </entry>
+  </row>
+  <row>
+    <entry>BadAtom</entry>
+    <entry>
+<para>
+A name is neither a valid Atom or <emphasis>
+None</emphasis>
+</para>
+    </entry>
+  </row>
+  <row>
+    <entry>BadDevice</entry>
+    <entry>
+<para>
+Device, Feedback Class, or Feedback ID invalid
+</para>
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+The Xkb extension adds a single protocol error, <emphasis>
+BadKeyboard</emphasis>
+, to the core protocol error set. This error code will be reported as the
+<emphasis>
+error_rtrn</emphasis>
+ when <emphasis>
+XkbQueryExtension</emphasis>
+ is called. When a <emphasis>
+BadKeyboard</emphasis>
+ error is reported in an <emphasis>
+XErrorEvent</emphasis>
+, additional information is reported in the <emphasis>
+resource_id</emphasis>
+ field. The most significant byte of the <emphasis>
+resource_id</emphasis>
+ is a further refinement of the error cause, as defined in Table 2.2. The least
+significant byte will contain the device, class, or feedback ID as indicated in
+the table.
+</para>
+
+<table frame='topbot'>
+<title>BadKeyboard Protocol Error resource_id Values</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='4' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='2.0*'/>
+<colspec colname='c2' colwidth='1.0*'/>
+<colspec colname='c3' colwidth='3.0*'/>
+<colspec colname='c4' colwidth='2.0*'/>
+<thead>
+  <row rowsep='1'>
+    <entry>high-order byte</entry>
+    <entry>value</entry>
+    <entry>meaning</entry>
+    <entry>low-order byte</entry>
+  </row>
+</thead>
+<tbody>
+  <row>
+    <entry>XkbErr_BadDevice</entry>
+    <entry>0xff</entry>
+    <entry>
+<para>
+device not found
+</para>
+    </entry>
+    <entry>device ID</entry>
+  </row>
+  <row>
+    <entry>XkbErr_BadClass</entry>
+    <entry>0xfe</entry>
+    <entry>
+<para>
+device found, but it is of the wrong class
+</para>
+    </entry>
+    <entry>class ID</entry>
+  </row>
+  <row>
+    <entry>XkbErr_BadId</entry>
+    <entry>0xfd</entry>
+    <entry>
+<para>
+device found, class ok, but device does not contain a feedback with the
+indicated ID
+</para>
+    </entry>
+    <entry>feedback ID</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+</sect1>
+
+<sect1 id='Display_and_Device_Specifications_in_Function_Calls'>
+<title>Display and Device Specifications in Function Calls</title>
+<para>
+Where a connection to the server is passed as an argument (Display*) and an
+<emphasis>
+XkbDescPtr</emphasis>
+ is also passed as an argument, the Display* argument must match the <emphasis>
+dpy</emphasis>
+ field of the <emphasis>
+XkbDescRec</emphasis>
+ pointed to by the <emphasis>
+XkbDescPtr</emphasis>
+ argument, or else the <emphasis>
+dpy</emphasis>
+ field of the <emphasis>
+XkbDescRec</emphasis>
+ must be <emphasis>
+NULL</emphasis>
+. If they don’t match or the <emphasis>
+dpy</emphasis>
+ field is not <emphasis>
+NULL</emphasis>
+, a <emphasis>
+BadMatch</emphasis>
+ error is returned (either in the return value or a backfilled <emphasis>
+Status</emphasis>
+ variable). Upon successful return, the <emphasis>
+dpy</emphasis>
+ field of the <emphasis>
+XkbDescRec</emphasis>
+ always contains the Display* value passed in.
+</para>
+
+<para>
+The Xkb extension can communicate with the X input extension if it is present.
+Consequently, there can potentially be more than one input device connected to
+the server. Most Xkb library calls that require communicating with the server
+involve both a server connection (Display * <emphasis>
+dpy</emphasis>
+) and a device identifier (unsigned int <emphasis>
+device_spec</emphasis>
+). In some cases, the device identifier is implicit and is taken as the
+<emphasis>
+device_spec</emphasis>
+ field of an <emphasis>
+XkbDescRec</emphasis>
+ structure passed as an argument.
+</para>
+
+<para>
+The device identifier can specify any X input extension device with a <emphasis>
+KeyClass</emphasis>
+ component, or it can specify the constant, <emphasis>
+XkbUseCoreKbd</emphasis>
+. The use of <emphasis>
+XkbUseCoreKbd</emphasis>
+ allows applications to indicate the core keyboard without having to determine
+its device identifier.
+</para>
+
+<para>
+Where an Xkb device identifier is passed as an argument and an <emphasis>
+XkbDescPtr</emphasis>
+ is also passed as an argument, if either the argument or the <emphasis>
+XkbDescRec</emphasis>
+ <emphasis>
+device_spec</emphasis>
+ field is <emphasis>
+XkbUseCoreKbd</emphasis>
+, and if the function returns successfully, the <emphasis>
+XkbDescPtr</emphasis>
+ <emphasis>
+device_spec</emphasis>
+ field will have been converted from <emphasis>
+XkbUseCoreKbd</emphasis>
+ to a real Xkb device ID. If the function does not complete successfully, the
+<emphasis>
+device_spec</emphasis>
+ field remains unchanged. Subsequently, the device id argument must match the
+<emphasis>
+device_spec</emphasis>
+ field of the <emphasis>
+XkbDescPtr</emphasis>
+ argument. If they don’t match, a <emphasis>
+BadMatch</emphasis>
+ error is returned (either in the return value or a backfilled <emphasis>
+Status</emphasis>
+ variable).
+</para>
+
+<para>
+When the Xkb extension in the server hands an application a device identifier
+to use for the keyboard, that ID is the input extension identifier for the
+device if the server supports the X Input Extension. If the server does not
+support the input extension, the meaning of the identifier is undefined — the
+only guarantee is that when you use <emphasis>
+XkbUseCoreKbd</emphasis>
+, <emphasis>
+XkbUseCoreKbd</emphasis>
+ will work and the identifier returned by the server will refer to the core
+keyboard device.
+</para>
+</sect1>
+</chapter>
diff --git a/specs/XKB/ch03.xml b/specs/XKB/ch03.xml
new file mode 100644 (file)
index 0000000..06d6d93
--- /dev/null
@@ -0,0 +1,247 @@
+<chapter id='Data_Structures'>
+<title>Data Structures</title>
+
+<para>
+An Xkb keyboard description consists of a variety of data structures, each of
+which describes some aspect of the keyboard. Although each data structure has
+its own peculiarities, there are a number of features common to nearly all Xkb
+structures. This chapter describes these common features and techniques for
+manipulating them.
+</para>
+
+
+<para>
+Many Xkb data structures are interdependent; changing a field in one might
+require changes to others. As an additional complication, some Xkb library
+functions allocate related components as a group to reduce fragmentation and
+allocator overhead. In these cases, simply allocating and freeing fields of Xkb
+structures might corrupt program memory. Creating and destroying such
+structures or keeping them properly synchronized during editing is complicated
+and error prone.
+</para>
+
+
+<para>
+Xkb provides functions and macros to allocate and free all major data
+structures. You should use them instead of allocating and freeing the
+structures yourself.
+</para>
+
+<sect1 id='Allocating_Xkb_Data_Structures'>
+<title>Allocating Xkb Data Structures</title>
+
+<para>
+Xkb provides functions, known as allocators, to create and initialize Xkb data
+structures. In most situations, the Xkb functions that read a keyboard
+description from the server call these allocators automatically. As a result,
+you will seldom have to directly allocate or initialize Xkb data structures.
+</para>
+
+
+<para>
+However, if you need to enlarge an existing structure or construct a keyboard
+definition from scratch, you may need to allocate and initialize Xkb data
+structures directly. Each major Xkb data structure has its own unique
+allocator. The allocator functions share common features: allocator functions
+for structures with optional components take as an input argument a mask of
+subcomponents to be allocated. Allocators for data structures containing
+variable-length data take an argument specifying the initial length of the data.
+</para>
+
+
+<para>
+You may call an allocator to change the size of the space allocated for
+variable-length data. When you call an allocator with an existing data
+structure as a parameter, the allocator does not change the data in any of the
+fields, with one exception: variable-length data might be moved. The allocator
+resizes the allocated memory if the current size is too small. This normally
+involves allocating new memory, copying existing data to the newly allocated
+memory, and freeing the original memory. This possible reallocation is
+important to note because local variables pointing into Xkb data structures
+might be invalidated by calls to allocator functions.
+</para>
+
+</sect1>
+<sect1 id='Adding_Data_and_Editing_Data_Structures'>
+<title>Adding Data and Editing Data Structures</title>
+
+<para>
+You should edit most data structures via the Xkb-supplied helper functions and
+macros, although a few data structures can be edited directly. The helper
+functions and macros make sure everything is initialized and interdependent
+values are properly updated for those Xkb structures that have
+interdependencies. As a general rule, if there is a helper function or macro to
+edit the data structure, use it. For example, increasing the width of a type
+requires you to resize every key that uses that type. This is complicated and
+ugly, which is why there’s an <emphasis>
+XkbResizeKeyType</emphasis>
+ function.
+</para>
+
+
+<para>
+Many Xkb data structures have arrays whose size is reported by two fields. The
+first field, whose name is usually prefixed by <emphasis>
+sz_</emphasis>
+, represents the total number of elements that can be stored in the array. The
+second field, whose name is usually prefixed by <emphasis>
+num_</emphasis>
+, specifies the number of elements currently stored there. These arrays
+typically represent data whose total size cannot always be determined when the
+array is created. In these instances, the usual way to allocate space and add
+data is as follows:
+</para>
+
+<itemizedlist>
+  <listitem>
+    <para>
+Call the allocator function with some arbitrary size, as a hint.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+For those arrays that have an <emphasis>
+Xkb...Add...</emphasis>
+ function, call it each time you want to add new data to the array. The
+function expands the array if necessary.
+    </para>
+  </listitem>
+</itemizedlist>
+
+<para>
+For example, call:
+</para>
+
+<para>
+XkbAllocGeomShapes(geom,4)
+</para>
+
+<para>
+to say "I’ll need space for four new shapes in this geometry." This makes
+sure that <emphasis>
+sz_shapes</emphasis>
+ - <emphasis>
+num_shapes</emphasis>
+ &gt;= 4, and resizes the shapes array if it isn’t. If this function
+succeeds, you are guaranteed to have space for the number of shapes you need.
+</para>
+
+
+<para>
+When you call an editing function for a structure, you do not need to check for
+space, because the function automatically checks the <emphasis>
+sz_</emphasis>
+ and <emphasis>
+num_</emphasis>
+ fields of the array, resizes the array if necessary, adds the entry to the
+array, and then updates the <emphasis>
+num_</emphasis>
+ field.
+</para>
+
+
+</sect1>
+<sect1 id='Making_Changes_to_the_Servers_Keyboard_Description'>
+<title>Making Changes to the Server’s Keyboard Description</title>
+
+<para>
+In Xkb, as in the core protocol, the client and server have independent copies
+of the data structures that describe the keyboard. The recommended way to
+change some aspect of the keyboard mapping in the X server is to edit a local
+copy of the Xkb keyboard description and then send only the changes to the X
+server. This method helps eliminate the need to transfer the entire keyboard
+description or even an entire data structure for only minor changes.
+</para>
+
+
+<para>
+To help you keep track of the changes you make to a local copy of the keyboard
+description, Xkb provides separate special <emphasis>
+changes</emphasis>
+ data structures for each major Xkb data structure. These data structures do
+not contain the actual changed values: they only indicate the changes that have
+been made to the structures that actually describe the keyboard.
+</para>
+
+
+<para>
+When you wish to change the keyboard description in the server, you first
+modify a local copy of the keyboard description and then flag the modifications
+in an appropriate changes data structure. When you finish editing the local
+copy of the keyboard description, you pass your modified version of the
+keyboard description and the modified changes data structure to an Xkb
+function. This function uses the modified keyboard description and changes
+structure to pass only the changed information to the server. Note that
+modifying the keyboard description but not setting the appropriate flags in the
+changes data structure causes indeterminate behavior.
+</para>
+
+
+</sect1>
+<sect1 id='Tracking_Keyboard_Changes_in_the_Server'>
+<title>Tracking Keyboard Changes in the Server</title>
+
+<para>
+The server reports all changes in its keyboard description to any interested
+clients via special Xkb events. Just as clients use special changes data
+structures to change the keyboard description in the server, the server uses
+special changes data structures to tell a client what changed in the server’s
+keyboard description.
+</para>
+
+
+<para>
+Unlike clients, however, the server does not always pass the new values when it
+reports changes to its copy of the keyboard description. Instead, the server
+only passes a changes data structure when it reports changes to its keyboard
+description. This is done for efficiency reasons — some clients do not always
+need to update their copy of the keyboard description with every report from
+the server.
+</para>
+
+
+<para>
+When your client application receives a report from the server indicating the
+keyboard description has changed, you can determine the set of changes by
+passing the event to an Xkb function that "notes" event information in the
+corresponding changes data structure. These "note changes" functions are
+defined for all major Xkb components, and their names have the form <emphasis>
+XkbNote{Component}Changes</emphasis>
+, where <emphasis>
+Component</emphasis>
+ is the name of a major Xkb component such as <emphasis>
+Map</emphasis>
+ or <emphasis>
+Names</emphasis>
+. When you want to copy these changes from the server into a local copy of the
+keyboard description, use the corresponding <emphasis>
+XkbGet{Component}Changes</emphasis>
+ function<emphasis>
+, </emphasis>
+passing it the changes structure. The function then retrieves only the changed
+structures from the server and copies the modified pieces into the local
+keyboard description.
+</para>
+
+</sect1>
+<sect1 id='Freeing_Data_Structures'>
+<title>Freeing Data Structures</title>
+
+<para>
+For the same reasons you should not directly use <emphasis>
+malloc</emphasis>
+ to allocate Xkb data structures, you should not free Xkb data structures or
+components directly using <emphasis>
+free</emphasis>
+ or <emphasis>
+Xfree</emphasis>
+. Xkb provides functions to free the various data structures and their
+components. Always use the free functions supplied by Xkb. There is no
+guarantee that any particular field can be safely freed by <emphasis>
+free</emphasis>
+ or <emphasis>
+Xfree</emphasis>
+.
+</para>
+</sect1>
+</chapter>
diff --git a/specs/XKB/ch04.xml b/specs/XKB/ch04.xml
new file mode 100644 (file)
index 0000000..223b444
--- /dev/null
@@ -0,0 +1,829 @@
+<chapter id='Xkb_Events'>
+<title>Xkb Events</title>
+
+<para>
+The primary way the X server communicates with clients is by sending X events
+to them. Some events are sent to all clients, while others are sent only to
+clients that have requested them. Some of the events that can be requested are
+associated with a particular window and are only sent to those clients who have
+both requested the event and specified the window in which the event occurred.
+</para>
+
+
+<para>
+The Xkb extension uses events to communicate the keyboard status to interested
+clients. These events are not associated with a particular window. Instead, all
+Xkb keyboard status events are reported to all interested clients, regardless
+of which window currently has the keyboard focus and regardless of the grab
+state of the keyboard.<footnote><para>The one exception to this rule is the
+XkbExtensionDeviceNotify event report that is sent when a client attempts to
+use an unsupported feature of an X Input Extension device (see section 21.4).
+</para></footnote> <!-- xref -->
+</para>
+
+
+<para>
+The X server reports the events defined by the Xkb extension to your client
+application only if you have requested them. You may request Xkb events by
+calling either <emphasis>
+XkbSelectEvents</emphasis>
+ or <emphasis>
+XkbSelectEventDetails</emphasis>
+. <emphasis>
+XkbSelectEvents</emphasis>
+ requests Xkb events by their event type and causes them to be reported to your
+client application under all circumstances. You can specify a finer granularity
+for event reporting by using <emphasis>
+XkbSelectEventDetails</emphasis>
+; in this case events are reported only when the specific detail conditions you
+specify have been met.
+</para>
+
+<sect1 id='Xkb_Event_Types'>
+<title>Xkb Event Types</title>
+
+<para>
+The Xkb Extension adds new event types to the X protocol definition. An Xkb
+event type is defined by two fields in the X event data structure. One is the
+<emphasis>
+type</emphasis>
+ field, containing the <emphasis>
+base event code.</emphasis>
+ This base event code is a value the X server assigns to each X extension at
+runtime and thatidentifies the extension that generated the event; thus, the
+event code in the <emphasis>
+type</emphasis>
+ field identifies the event as an Xkb extension event, rather than an event
+from another extension or a core X protocol event. You can obtain the base
+event code via a call to <emphasis>
+XkbQueryExtension</emphasis>
+ or <emphasis>
+XkbOpenDisplay</emphasis>
+. The second field is the Xkb event type, which contains a value uniquely
+identifying each different Xkb event type. Possible values are defined by
+constants declared in the header file &lt;X11/extensions/Xkb.h&gt;.
+</para>
+
+
+<para>
+Table 4.1 lists the categories of events defined by Xkb and their associated
+event types, as defined in <emphasis>
+Xkb.h</emphasis>
+. Each event is described in more detail in the section referenced for that
+event.
+</para>
+
+<table frame='topbot'>
+<title>Xkb Event Types</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='4' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='3.0*'/>
+<colspec colname='c2' colwidth='4.0*'/>
+<colspec colname='c3' colwidth='1.0*'/>
+<colspec colname='c4' colwidth='1.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Event Type</entry>
+  <entry>Conditions Generating Event</entry>
+  <entry>Section</entry>
+  <entry>Page</entry>
+</row>
+</thead>
+<tbody>
+<row>
+  <entry>
+    <para><emphasis>XkbNewKeyboardNotify</emphasis></para>
+  </entry>
+  <entry>
+    <para>Keyboard geometry; keycode range change</para>
+  </entry>
+  <entry>
+    <para>19</para>
+  </entry>
+  <entry>
+    <para>187</para>
+  </entry>
+</row>
+<row>
+  <entry>
+    <para>
+    <emphasis>XkbMapNotify</emphasis>
+    </para>
+  </entry>
+  <entry>
+    <para>Keyboard mapping change</para>
+  </entry>
+  <entry>
+    <para>14.4</para>
+  </entry>
+  <entry>
+    <para>122</para>
+  </entry>
+</row>
+<row>
+  <entry>
+    <para><emphasis>XkbStateNotify</emphasis></para>
+  </entry>
+  <entry>
+    <para>Keyboard state change</para>
+  </entry>
+  <entry>
+    <para>5.4</para>
+  </entry>
+  <entry>
+    <para>25</para>
+  </entry>
+</row>
+<row>
+  <entry>
+    <para><emphasis>XkbControlsNotify</emphasis></para>
+  </entry>
+  <entry>
+    <para>Keyboard controls state change</para>
+  </entry>
+  <entry>
+    <para>10.11</para>
+  </entry>
+  <entry>
+    <para>79</para>
+  </entry>
+</row>
+<row>
+  <entry>
+    <para><emphasis>XkbIndicatorStateNotify</emphasis></para>
+  </entry>
+  <entry>
+    <para>Keyboard indicators state change</para>
+  </entry>
+  <entry>
+    <para>8.5</para>
+  </entry>
+  <entry>
+    <para>45</para>
+  </entry>
+</row>
+<row>
+  <entry>
+    <para><emphasis>XkbIndicatorMapNotify</emphasis></para>
+  </entry>
+  <entry>
+    <para>Keyboard indicators map change</para>
+  </entry>
+  <entry>
+    <para>8.5</para>
+  </entry>
+  <entry>
+    <para>45</para>
+  </entry>
+</row>
+<row>
+  <entry>
+    <para><emphasis>XkbNamesNotify</emphasis></para>
+  </entry>
+  <entry>
+    <para>Keyboard name change</para>
+  </entry>
+  <entry>
+    <para>18.5</para>
+  </entry>
+  <entry>
+    <para>185</para>
+  </entry>
+</row>
+<row>
+  <entry>
+    <para><emphasis>XkbCompatMapNotify</emphasis></para>
+  </entry>
+  <entry>
+    <para>Keyboard compatibility map change</para>
+  </entry>
+  <entry>
+    <para>17.5</para>
+  </entry>
+  <entry>
+    <para>178</para>
+  </entry>
+</row>
+<row>
+  <entry>
+    <para><emphasis>XkbBellNotify</emphasis></para>
+  </entry>
+  <entry>
+    <para>Keyboard bell generated</para>
+  </entry>
+  <entry>
+    <para>9.4</para>
+  </entry>
+  <entry>
+    <para>52</para>
+  </entry>
+</row>
+<row>
+  <entry>
+    <para><emphasis>XkbActionMessage</emphasis></para>
+  </entry>
+  <entry>
+    <para>Keyboard action message</para>
+  </entry>
+  <entry>
+    <para>16.1.11</para>
+  </entry>
+  <entry>
+    <para>155</para>
+  </entry>
+</row>
+<row>
+  <entry>
+    <para><emphasis>XkbAccessXNotify</emphasis></para>
+  </entry>
+  <entry>
+    <para>AccessX state change</para>
+  </entry>
+  <entry>
+    <para>10.6.4</para>
+  </entry>
+  <entry>
+    <para>65</para>
+  </entry>
+</row>
+<row>
+  <entry>
+    <para><emphasis>XkbExtensionDeviceNotify</emphasis></para>
+  </entry>
+  <entry>
+    <para>Extension device change</para>
+  </entry>
+  <entry>
+    <para>21.6</para>
+  </entry>
+  <entry>
+    <para>207</para>
+  </entry>
+</row>
+</tbody>
+</tgroup>
+</table>
+
+</sect1>
+<sect1 id='Xkb_Event_Data_Structures'>
+<title>Xkb Event Data Structures</title>
+
+<para>
+Xkb reports each event it generates in a unique structure holding the data
+values needed to describe the conditions the event is reporting. However, all
+Xkb events have certain things in common. These common features are contained
+in the same fields at the beginning of all Xkb event structures and are
+described in the <emphasis>
+XkbAnyEvent</emphasis>
+ structure:
+</para>
+
+<para><programlisting>
+typedef struct {
+      int                type;        /* Xkb extension base event code */
+      unsigned long      serial;      /* X server serial number for event */
+      Bool               send_event;  /* <emphasis> True</emphasis> =&gt; synthetically generated */
+      Display *          display;     /* server connection where event
+generated */
+      Time               time;        /* server time when event generated */
+      int                xkb_type;    /* Xkb minor event code */
+      unsigned int       device;      /* Xkb device ID, will not be
+                                         <emphasis>XkbUseCoreKbd</emphasis> */
+} <emphasis>XkbAnyEvent</emphasis>
+;
+</programlisting></para>
+
+<para>
+For any Xkb event, the <emphasis>
+type</emphasis>
+ field is set to the base event code for the Xkb extension, assigned by the
+server to all Xkb extension events. The <emphasis>
+serial</emphasis>
+, <emphasis>
+send_event</emphasis>
+, and <emphasis>
+display</emphasis>
+ fields are as described for all X11 events. The <emphasis>
+time</emphasis>
+ field is set to the time when the event was generated and is expressed in
+milliseconds. The <emphasis>
+xkb_type</emphasis>
+ field contains the minor extension event code, which is the extension event
+type, and is one of the values listed in Table 4.1. The <emphasis>
+device</emphasis>
+ field contains the keyboard device identifier associated with the event. This
+is never <emphasis>
+XkbUseCoreKbd</emphasis>
+, even if the request that generated the event specified a device of <emphasis>
+XkbUseCoreKbd</emphasis>
+. If the request that generated the event specified <emphasis>
+XkbUseCoreKbd</emphasis>
+, <emphasis>
+device</emphasis>
+ contains a value assigned by the server to specify the core keyboard. If the
+request that generated the event specified an X input extension device,
+<emphasis>
+device</emphasis>
+ contains that same identifier.
+</para>
+
+
+<para>
+Other data fields specific to individual Xkb events are described in subsequent
+chapters where the events are described.
+</para>
+
+
+</sect1>
+<sect1 id='Selecting_Xkb_Events'>
+<title>Selecting Xkb Events</title>
+
+<para>
+Xkb events are selected using an event mask, much the same as normal core X
+events are selected. However, unlike selecting core X events, where you must
+specify the selection status (on or off) for all possible event types whenever
+you wish to change the selection criteria for any one event, Xkb allows you to
+restrict the specification to only the event types you wish to change. This
+means that you do not need to remember the event selection values for all
+possible types each time you want to change one of them.
+</para>
+
+
+<para>
+Many Xkb event types are generated under several different circumstances. When
+selecting to receive an Xkb event, you may specify either that you want it
+delivered under all circumstances, or that you want it delivered only for a
+subset of the possible circumstances.
+</para>
+
+<para>
+You can also deselect an event type that was previously selected for, using the
+same granularity.
+</para>
+
+<para>
+Xkb provides two functions to select and deselect delivery of Xkb events.
+<emphasis>
+XkbSelectEvents</emphasis>
+ allows you to select or deselect delivery of more than one Xkb event type at
+once. Events selected using <emphasis>
+XkbSelectEvents</emphasis>
+ are delivered to your program under all circumstances that generate the
+events. To restrict delivery of an event to a subset of the conditions under
+which it occurs, use <emphasis>
+XkbSelectEventDetails</emphasis>
+. <emphasis>
+XkbSelectEventDetails</emphasis>
+ only allows you to change the selection conditions for a single event at a
+time, but it provides a means of fine-tuning the conditions under which the
+event is delivered.
+</para>
+
+
+<para>
+To select and / or deselect for delivery of one or more Xkb events and have
+them delivered under all conditions, use <emphasis>
+XkbSelectEvents</emphasis>
+.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbSelectEvents</emphasis>
+(<emphasis>
+display, device_spec, bits_to_change, values_for_bits</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *      <emphasis>
+display</emphasis>
+;      /* connection to the X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+device_spec</emphasis>
+;      /* device ID, or <emphasis>
+XkbUseCoreKbd</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned long int      <emphasis>
+bits_to_change;      </emphasis>
+/* determines events to be selected / deselected */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned long int      <emphasis>
+values_for_bits</emphasis>
+;      /* 1=&gt;select, 0-&gt;deselect; for events in <emphasis>
+bits_to_change</emphasis>
+ */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+This request changes the Xkb event selection mask for the keyboard specified by
+<emphasis>
+device_spec</emphasis>
+.
+</para>
+
+
+<para>
+Each Xkb event that can be selected is represented by a bit in the <emphasis>
+bits_to_change</emphasis>
+ and <emphasis>
+values_for_bits</emphasis>
+ masks. Only the event selection bits specified by the <emphasis>
+bits_to_change</emphasis>
+ parameter are affected; any unspecified bits are left unchanged. To turn on
+event selection for an event, set the bit for the event in the <emphasis>
+bits_to_change</emphasis>
+ parameter and set the corresponding bit in the <emphasis>
+values_for_bits</emphasis>
+ parameter. To turn off event selection for an event, set the bit for the event
+in the <emphasis>
+bits_to_change</emphasis>
+ parameter and do not set the corresponding bit in the <emphasis>
+values_for_bits</emphasis>
+ parameter. The valid values for both of these parameters are an inclusive
+bitwise OR of the masks shown in Table 4.2. There is no interface to return
+your client’s current event selection mask. Clients cannot set other
+clients’ event selection masks.
+</para>
+
+
+<para>
+If a bit is not set in the <emphasis>
+bits_to_change</emphasis>
+ parameter, but the corresponding bit is set in the <emphasis>
+values_for_bits</emphasis>
+ parameter, a <emphasis>
+BadMatch</emphasis>
+ protocol error results. If an undefined bit is set in either the <emphasis>
+bits_to_change</emphasis>
+ or the <emphasis>
+values_for_bits</emphasis>
+ parameter, a <emphasis>
+BadValue</emphasis>
+ protocol error results.
+</para>
+
+
+<para>
+All event selection bits are initially zero for clients using the Xkb
+extension. Once you set some bits, they remain set for your client until you
+clear them via another call to <emphasis>
+XkbSelectEvents</emphasis>
+.
+</para>
+
+
+<para>
+<emphasis>
+XkbSelectEvents</emphasis>
+ returns <emphasis>
+False</emphasis>
+ if the Xkb extension has not been initilialized and <emphasis>
+True</emphasis>
+ otherwise.
+</para>
+
+
+<para>
+To select or deselect for a specific Xkb event and optionally place conditions
+on when events of that type are reported to your client, use <emphasis>
+XkbSelectEventDetails</emphasis>
+. This allows you to exercise a finer granularity of control over delivery of
+Xkb events with <emphasis>
+XkbSelectEvents</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbSelectEventDetails</emphasis>
+(<emphasis>
+display, device_spec, event_type, bits_to_change</emphasis>
+, <emphasis>
+values_for_bits</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *      <emphasis>
+display</emphasis>
+;      /* connection to the X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+device_spec</emphasis>
+;      /* device ID, or <emphasis>
+XkbUseCoreKbd</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+event_type</emphasis>
+;      /* Xkb event type of interest */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned long int      <emphasis>
+bits_to_change</emphasis>
+;      /* event selection details */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned long int      <emphasis>
+values_for_bits</emphasis>
+;      /* values for bits selected by <emphasis>
+bits_to_change</emphasis>
+ */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+While <emphasis>
+XkbSelectEvents</emphasis>
+ allows multiple events to be selected, <emphasis>
+XkbSelectEventDetails</emphasis>
+ changes the selection criteria for a single type of Xkb event. The
+interpretation of the <emphasis>
+bits_to_change</emphasis>
+ and <emphasis>
+values_for_bits</emphasis>
+ masks depends on the event type in question.
+</para>
+
+
+<para>
+<emphasis>
+XkbSelectEventDetails</emphasis>
+ changes the Xkb event selection mask for the keyboard specified by <emphasis>
+device_spec</emphasis>
+ and the Xkb event specified by <emphasis>
+event_type</emphasis>
+. To turn on event selection for an event detail, set the bit for the detail in
+the <emphasis>
+bits_to_change</emphasis>
+ parameter and set the corresponding bit in the <emphasis>
+values_for_bits</emphasis>
+ parameter. To turn off event detail selection for a detail, set the bit for
+the detail in the <emphasis>
+bits_to_change</emphasis>
+ parameter and do not set the corresponding bit in the <emphasis>
+values_for_bits</emphasis>
+ parameter.
+</para>
+
+
+<para>
+If an invalid event type is specified, a <emphasis>
+BadValue</emphasis>
+ protocol error results. If a bit is not set in the <emphasis>
+bits_to_change</emphasis>
+ parameter, but the corresponding bit is set in the <emphasis>
+values_for_bits</emphasis>
+ parameter, a <emphasis>
+BadMatch</emphasis>
+ protocol error results. If an undefined bit is set in either the <emphasis>
+bits_to_change</emphasis>
+ or the <emphasis>
+values_for_bits</emphasis>
+ parameter, a <emphasis>
+BadValue</emphasis>
+ protocol error results.
+</para>
+
+
+<para>
+For each type of Xkb event, the legal event details that you can specify in the
+<emphasis>
+XkbSelectEventDetails</emphasis>
+ request are listed in the chapters that describe each event in detail.
+</para>
+
+
+<sect2 id='Event_Masks'>
+<title>Event Masks</title>
+
+<para>
+The X server reports the events defined by Xkb to your client application only
+if you have requested them via a call to <emphasis>
+XkbSelectEvents</emphasis>
+ or <emphasis>
+XkbSelectEventDetails</emphasis>
+. Specify the event types in which you are interested in a mask, as described
+in section 4.3.
+</para>
+
+
+<para>
+Table 4.2 lists the event mask constants that can be specified with the  <!-- xref -->
+<emphasis>
+XkbSelectEvents</emphasis>
+ request and the circumstances in which the mask should be specified.
+</para>
+
+<table frame='topbot'>
+<title>XkbSelectEvents Mask Constants</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='3' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='2.0*'/>
+<colspec colname='c2' colwidth='1.0*'/>
+<colspec colname='c3' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Event Mask</entry>
+  <entry>Value</entry>
+  <entry>Notification Wanted</entry>
+</row>
+</thead>
+<tbody>
+  <row>
+    <entry>
+<emphasis>XkbNewKeyboardNotifyMask</emphasis>
+    </entry>
+    <entry>(1L&lt;&lt;0)</entry>
+    <entry>Keyboard geometry change</entry>
+  </row>
+  <row>
+    <entry>
+      <emphasis>XkbMapNotifyMask</emphasis>
+    </entry>
+    <entry>(1L&lt;&lt;1)</entry>
+    <entry>Keyboard mapping change</entry>
+  </row>
+  <row>
+    <entry>
+<para><emphasis>XkbStateNotifyMask</emphasis></para>
+    </entry>
+    <entry>(1L&lt;&lt;2)</entry>
+    <entry><para>Keyboard state change</para></entry>
+  </row>
+  <row>
+    <entry>
+<para><emphasis>XkbControlsNotifyMask</emphasis></para>
+    </entry>
+    <entry>(1L&lt;&lt;3)</entry>
+    <entry>Keyboard control change</entry>
+  </row>
+  <row>
+    <entry>
+<emphasis>XkbIndicatorStateNotifyMask</emphasis>
+    </entry>
+    <entry>(1L&lt;&lt;4)</entry>
+    <entry>Keyboard indicator state change</entry>
+  </row>
+  <row>
+    <entry>
+<emphasis>XkbIndicatorMapNotifyMask</emphasis>
+    </entry>
+    <entry>(1L&lt;&lt;5)</entry>
+    <entry>Keyboard indicator map change</entry>
+  </row>
+  <row>
+    <entry>
+<emphasis>XkbNamesNotifyMask</emphasis>
+    </entry>
+    <entry>(1L&lt;&lt;6)</entry>
+    <entry>Keyboard name change</entry>
+  </row>
+  <row>
+    <entry>
+<emphasis>XkbCompatMapNotifyMask</emphasis>
+    </entry>
+    <entry>(1L&lt;&lt;7)</entry>
+    <entry>Keyboard compat map change</entry>
+  </row>
+  <row>
+    <entry>
+<emphasis>XkbBellNotifyMask</emphasis>
+    </entry>
+    <entry>(1L&lt;&lt;8)</entry>
+    <entry>Bell</entry>
+  </row>
+  <row>
+    <entry>
+<emphasis>XkbActionMessageMask</emphasis>
+    </entry>
+    <entry>(1L&lt;&lt;9)</entry>
+    <entry>Action message</entry>
+  </row>
+  <row>
+    <entry>
+<emphasis>XkbAccessXNotifyMask</emphasis>
+    </entry>
+    <entry>(1L&lt;&lt;10)</entry>
+    <entry>AccessX features</entry>
+  </row>
+  <row>
+    <entry>
+<emphasis>XkbExtensionDeviceNotifyMask</emphasis>
+    </entry>
+    <entry>(1L&lt;&lt;11)</entry>
+    <entry>Extension device</entry>
+  </row>
+  <row>
+    <entry>
+<emphasis>XkbAllEventsMask</emphasis>
+    </entry>
+    <entry>(0xFFF)</entry>
+    <entry>All Xkb events</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+</sect2>
+</sect1>
+<sect1 id='Unified_Xkb_Event_Type'>
+<title>Unified Xkb Event Type</title>
+
+<para>
+The <emphasis>
+XkbEvent</emphasis>
+ structure is a union of the individual structures declared for each Xkb event
+type and for the core protocol <emphasis>
+XEvent</emphasis>
+ type. Given an <emphasis>
+XkbEvent</emphasis>
+ structure, you may use the <emphasis>
+type</emphasis>
+ field to determine if the event is an Xkb event (<emphasis>
+type</emphasis>
+ equals the Xkb base event code; see section 2.4). If the event is an Xkb
+event, you may then use the <emphasis>
+any.xkb_type</emphasis>
+ field to determine the type of Xkb event and thereafter access the
+event-dependent components using the union member corresponding to the
+particular Xkb event type.
+</para>
+
+<para><programlisting>
+typedef union _XkbEvent {
+      int                            type;
+      XkbAnyEvent                    any;
+      XkbStateNotifyEvent            state;
+      XkbMapNotifyEvent              map;
+      XkbControlsNotifyEvent         ctrls;
+      XkbIndicatorNotifyEvent        indicators;
+      XkbBellNotifyEvent             bell;
+      XkbAccessXNotifyEvent          accessx;
+      XkbNamesNotifyEvent            names;
+      XkbCompatMapNotifyEvent        compat;
+      XkbActionMessageEvent          message;
+      XkbExtensionDeviceNotifyEvent  device;
+      XkbNewKeyboardNotifyEvent      new_kbd;
+      XEvent                         core;
+} <emphasis>XkbEvent</emphasis>;
+</programlisting></para>
+
+<para>
+This unified Xkb event type includes a normal <emphasis>
+XEvent</emphasis>
+ as used by the core protocol, so it is straightforward for applications that
+use Xkb events to call the X library event functions without having to cast
+every reference. For example, to get the next event, you can simply declare a
+variable of type <emphasis>
+XkbEvent</emphasis>
+ and call:
+</para>
+
+<para>XNextEvent(dpy,&amp;xkbev.core);</para>
+</sect1>
+</chapter>
diff --git a/specs/XKB/ch05.xml b/specs/XKB/ch05.xml
new file mode 100644 (file)
index 0000000..3a507aa
--- /dev/null
@@ -0,0 +1,987 @@
+<chapter id='Keyboard_State'>
+<title>Keyboard State</title>
+
+<para>
+Keyboard state encompasses all of the transitory information necessary to map a physical key press or release to an appropriate event. The Xkb keyboard state consists of primitive components and additional derived components that are maintained for efficiency reasons. Figure 5.1 shows the components of Xkb keyboard state and their relationships.
+</para>
+
+<mediaobject>
+<!-- <title>Keyboard State Description</title> -->
+ <imageobject> <imagedata format="SVG" fileref="XKBlib-2.svg"/>
+ </imageobject>
+<caption>Xkb State</caption>
+</mediaobject>
+
+
+<sect1 id='Keyboard_State_Description'>
+<title>Keyboard State Description</title>
+<para>
+The Xkb keyboard state is comprised of the state of all keyboard modifiers, the keyboard group, and the state of the pointer buttons. These are grouped into the following components:
+</para>
+
+<itemizedlist>
+<listitem>
+  <para>
+The locked group and locked modifiers
+  </para>
+</listitem>
+<listitem>
+  <para>
+The latched group and latched modifiers
+  </para>
+</listitem>
+<listitem>
+  <para>
+The base group and base modifiers
+  </para>
+</listitem>
+<listitem>
+  <para>
+The effective group and effective modifiers
+  </para>
+</listitem>
+<listitem>
+  <para>
+The state of the core pointer buttons
+  </para>
+</listitem>
+</itemizedlist>
+
+<para>
+The <emphasis>
+modifiers</emphasis>
+ are <emphasis>
+Shift</emphasis>
+, <emphasis>
+Lock</emphasis>
+, <emphasis>
+Control</emphasis>
+, and <emphasis>
+Mod1</emphasis>
+-<emphasis>
+Mod5</emphasis>
+, as defined by the core protocol. A modifier can be thought of as a toggle that is either set or unset. All modifiers are initially unset. When a modifier is locked, it is set and remains set for all future key events, until it is explicitly unset. A latched modifier is set, but automatically unsets after the next key event that does not change the keyboard state. Locked and latched modifier state can be changed by keyboard activity or via Xkb extension library functions.
+</para>
+
+
+<para>
+The Xkb extension provides support for <emphasis>
+keysym</emphasis>
+ <emphasis>
+groups</emphasis>
+, as defined by ISO9995:
+</para>
+
+
+<variablelist>
+  <varlistentry>
+    <term>Group</term>
+    <listitem>
+      <para>
+A logical state of a keyboard providing access to a collection of characters.
+A group usually contains a set of characters that logically belong together
+and that may be arranged on several shift levels within that group.
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+
+
+
+<para>
+The Xkb extension supports up to four keysym groups. Groups are named beginning with one and indexed beginning with zero. All group states are indicated using the group index. At any point in time, there is zero or one locked group, zero or one latched group, and one base group. When a group is locked, it supersedes any previous locked group and remains the locked group for all future key events, until a new group is locked. A latched group applies only to the next key event that does not change the keyboard state. The locked and latched group can be changed by keyboard activity or via Xkb extension library functions.
+</para>
+
+
+<para>
+Changing to a different group changes the keyboard state to produce characters from a different group. Groups are typically used to switch between keysyms of different languages and locales.
+</para>
+
+
+<para>
+The <emphasis>
+pointer buttons</emphasis>
+ are <emphasis>
+Button1</emphasis>
+ - <emphasis>
+Button5</emphasis>
+, as defined by the core protocol.
+</para>
+
+
+<para>
+The <emphasis>
+base group</emphasis>
+ and <emphasis>
+base modifiers</emphasis>
+ represent keys that are physically or logically down. These
+and the pointer buttons can be changed by keyboard activity and
+not by Xkb requests. It is possible for a key to be logically
+down, but not physically down, and neither latched nor locked.
+<footnote><para>
+Keys may be logically down when they are physically up because
+of their electrical properties or because of the keyboard extension
+in the X server having filtered the key release, for esoteric reasons.
+</para></footnote>
+
+</para>
+
+
+<para>
+The <emphasis>
+effective modifiers</emphasis>
+ are the bitwise union of the locked, latched, and the base modifiers.
+</para>
+
+
+<para>
+The <emphasis>
+effective group</emphasis>
+ is the arithmetic sum of the group indices of the latched group, locked group, and base group, which is then normalized by some function. The result is a meaningful group index.
+</para>
+
+<simplelist type='vert' columns='1'>
+<member>
+n = number of keyboard groups, 1&lt;= n &lt;= 4
+</member>
+
+<member>
+0 &lt;= any of locked, latched, or base group &lt; n
+</member>
+
+<member>
+effective group = f(locked group + latched group + base group)
+</member>
+</simplelist>
+
+<para>
+The function f ensures that the effective group is within range. The precise function is specified for the keyboard and can be retrieved through the keyboard description. It may wrap around, clamp down, or default. Few applications will actually examine the effective group, and far fewer still will examine the locked, latched, and base groups.
+</para>
+
+
+<para>
+There are two circumstances under which groups are normalized:
+</para>
+
+<orderedlist>
+  <listitem><para>
+The global locked or effective group changes. In this case, the changed group is normalized into range according to the settings of the <emphasis>
+groups_wrap</emphasis>
+ field of the <emphasis>
+XkbControlsRec</emphasis>
+ structure for the keyboard (see section 10.7.1). <!-- xref -->
+  </para></listitem>
+  <listitem><para>
+
+The Xkb library is interpreting an event with an effective group that is legal for the keyboard as a whole, but not for the key in question. In this case, the group to use for this event only is determined using the <emphasis>
+group_info</emphasis>
+ field of the key symbol mapping (<emphasis>
+XkbSymMapRec</emphasis>
+) for the event key.
+  </para></listitem>
+</orderedlist>
+
+<para>
+Each nonmodifier key on a keyboard has zero or more symbols, or keysyms, associated with it. These are the logical symbols that the key can generate when it is pressed. The set of all possible keysyms for a keyboard is divided into groups. Each key is associated with zero or more groups; each group contains one or more symbols. When a key is pressed, the determination of which symbol for the key is selected is based on the effective group and the shift level, which is determined by which modifiers are set.
+</para>
+
+
+<para>
+A client that does not explicitly call Xkb functions, but that otherwise makes use of an X library containing the Xkb extension, will have keyboard state represented in bits 0 - 14 of the state field of events that report modifier and button state. Such a client is said to be <emphasis>
+Xkb-capable</emphasis>
+. A client that does explicitly call Xkb functions is an <emphasis>
+Xkb-aware</emphasis>
+ client. The Xkb keyboard state includes information derived from the effective state and from two server parameters that can be set through the keyboard extension. The following components of keyboard state pertain to Xkb-capable and Xkb-aware clients:
+</para>
+
+<itemizedlist>
+<listitem>
+  <para>
+lookup state: lookup group and lookup modifiers
+  </para>
+</listitem>
+<listitem>
+  <para>
+grab state: grab group and grab modifiers
+  </para>
+</listitem>
+</itemizedlist>
+
+<para>
+The <emphasis>
+lookup modifiers</emphasis>
+ and <emphasis>
+lookup group</emphasis>
+ are represented in the state field of core X events. The modifier state and keycode of a key event are used to determine the symbols associated with the event. For <emphasis>
+KeyPress</emphasis>
+ and <emphasis>
+KeyRelease</emphasis>
+ events, the lookup modifiers are computed as:
+</para>
+
+<literallayout>
+   ((base | latched | locked) &amp; ~<emphasis> server_internal_modifiers</emphasis>)
+</literallayout>
+
+<para>
+Otherwise the lookup modifiers are computed as:
+</para>
+
+<literallayout>
+(((base | latched | (locked &amp; ~<emphasis> ignore_locks</emphasis>)) &amp; ~<emphasis> server_internal_modifiers</emphasis>)
+</literallayout>
+
+<para>
+The lookup group is the same as the effective group.
+</para>
+
+
+<para>
+When an Xkb-capable or Xkb-aware client wishes to map a keycode to a keysym, it should use the <emphasis>
+lookup state</emphasis>
+ — the lookup group and the lookup modifiers.
+</para>
+
+
+<para>
+The <emphasis>
+grab state</emphasis>
+ is the state used when matching events to passive grabs. If the event activates a grab, the <emphasis>
+grab modifiers</emphasis>
+ and <emphasis>
+grab group</emphasis>
+ are represented in the state field of core X events; otherwise, the lookup state is used. The grab modifiers are computed as:
+</para>
+
+<literallayout>
+(((base | latched | (locked &amp; ~ignore_locks)) &amp; ~server_internal_modifiers)
+</literallayout>
+
+<para>
+If the server’s <emphasis>
+IgnoreGroupLock</emphasis>
+ control (see section 10.7.3) is not set, the grab group is the same as the effective group. Otherwise, the grab group is computed from the base group and latched group, ignoring the locked group.
+</para>
+
+
+<para>
+The final three components of Xkb state are applicable to clients that are not linked with an Xlib containing the X keyboard extension library and therefore are not aware of the keyboard extension (<emphasis>
+Xkb-unaware </emphasis>
+clients):
+</para>
+
+<itemizedlist>
+<listitem>
+  <para>
+The compatibility modifier state
+  </para>
+</listitem>
+<listitem>
+  <para>
+The compatibility lookup modifier state
+  </para>
+</listitem>
+<listitem>
+  <para>
+The compatibility grab modifier state
+  </para>
+</listitem>
+</itemizedlist>
+
+<para>
+The X11 protocol interpretation of modifiers does not include direct support for multiple groups. When an Xkb-extended X server connects to an Xkb-unaware client, the compatibility states remap the keyboard group into a core modifier whenever possible. The compatibility state corresponds to the effective modifier and effective group state, with the group remapped to a modifier. The compatibility lookup and grab states correspond to the lookup and grab states, respectively, with the group remapped to a modifier. The compatibility lookup state is reported in events that do not trigger passive grabs; otherwise, the compatibility grab state is reported.
+</para>
+
+
+</sect1>
+<sect1 id='Changing_the_Keyboard_State'>
+<title>Changing the Keyboard State</title>
+
+<sect2 id='Changing_Modifiers'>
+<title>Changing Modifiers</title>
+
+<para>
+The functions in this section that change the use of modifiers use a mask in the parameter <emphasis>
+affect</emphasis>
+. It is a bitwise inclusive OR of the legal modifier masks:
+</para>
+
+<table frame='none'>
+<title>Real Modifier Masks</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry>Mask</entry>
+  </row>
+  <row>
+    <entry>ShiftMask</entry>
+  </row>
+  <row>
+    <entry>LockMask</entry>
+  </row>
+  <row>
+    <entry>ControlMask</entry>
+  </row>
+  <row>
+    <entry>Mod1Mask</entry>
+  </row>
+  <row>
+    <entry>Mod2Mask</entry>
+  </row>
+  <row>
+    <entry>Mod3Mask</entry>
+  </row>
+  <row>
+    <entry>Mod4Mask</entry>
+  </row>
+  <row>
+    <entry>Mod5Mask</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+To lock and unlock any of the eight real keyboard modifiers, use <emphasis>
+XkbLockModifiers:</emphasis>
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis> XkbLockModifiers</emphasis>
+(<emphasis>
+display, device_spec, affect, values</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *      <emphasis>
+display</emphasis>
+;            /* connection to the X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+device_spec</emphasis>
+;            /* device ID, or <emphasis>
+XkbUseCoreKbd</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+      affect</emphasis>
+;            /* mask of real modifiers whose lock state is to change */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+values</emphasis>
+;            /* 1 =&gt; lock, 0 =&gt; unlock; only for modifiers selected by <emphasis>
+affect</emphasis>
+ */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbLockModifiers</emphasis>
+ sends a request to the server to lock the real modifiers selected by both <emphasis>
+affect</emphasis>
+ and <emphasis>
+values</emphasis>
+ and to unlock the real modifiers selected by <emphasis>
+affect</emphasis>
+ but not selected by <emphasis>
+values</emphasis>
+. <emphasis>
+XkbLockModifiers</emphasis>
+ does not wait for a reply from the server. It returns <emphasis>
+True</emphasis>
+ if the request was sent, and <emphasis>
+False</emphasis>
+ otherwise.
+</para>
+
+
+<para>
+To latch and unlatch any of the eight real keyboard modifiers, use <emphasis>
+XkbLatchModifiers:</emphasis>
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbLatchModifiers</emphasis>
+(d<emphasis>
+isplay, device_spec, affect, values</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *      <emphasis>
+display</emphasis>
+;            /* connection to the X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+device_spec</emphasis>
+;            /* device ID, or <emphasis>
+XkbUseCoreKbd</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+      affect</emphasis>
+;            /* mask of modifiers whose latch state is to change */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int <emphasis>values</emphasis>;
+/* 1 =&gt; latch, 0 =&gt; unlatch; only for mods selected by <emphasis>
+affect</emphasis>
+ */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbLatchModifiers</emphasis>
+ sends a request to the server to latch the real modifiers selected by both <emphasis>
+affect</emphasis>
+ and <emphasis>
+values</emphasis>
+ and to unlatch the real modifiers selected by <emphasis>
+affect</emphasis>
+ but not selected by <emphasis>
+values</emphasis>
+. <emphasis>
+XkbLatchModifiers</emphasis>
+ does not wait for a reply from the server. It returns <emphasis>
+True</emphasis>
+ if the request was sent, and <emphasis>
+False</emphasis>
+ otherwise.
+</para>
+
+
+</sect2>
+<sect2 id='Changing_Groups'>
+<title>Changing Groups</title>
+
+<para>
+Reference the keysym group indices with these symbolic constants:
+</para>
+
+<table frame='topbot'>
+<title>Symbolic Group Names</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='2.0*'/>
+<tbody>
+  <row rowsep='1'>
+    <entry>Symbolic Name</entry>
+    <entry>Value</entry>
+  </row>
+  <row>
+    <entry>XkbGroup1Index</entry>
+    <entry>0</entry>
+  </row>
+  <row>
+    <entry>XkbGroup2Index</entry>
+    <entry>1</entry>
+  </row>
+  <row>
+    <entry>XkbGroup3Index</entry>
+    <entry>2</entry>
+  </row>
+  <row>
+    <entry>XkbGroup4Index</entry>
+    <entry>3</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+To lock the keysym group, use <emphasis>
+XkbLockGroup. </emphasis>
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbLockGroup</emphasis>
+(<emphasis>
+display, device_spec, group</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *      <emphasis>
+display</emphasis>
+;            /* connection to the X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+device_spec</emphasis>
+;            /* device ID, or <emphasis>
+XkbUseCoreKbd</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+group</emphasis>
+;            /* index of the keysym group to lock */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbLockGroup</emphasis>
+ sends a request to the server to lock the specified <emphasis>
+group </emphasis>
+and does not wait for a reply. It returns <emphasis>
+True</emphasis>
+ if the request was sent and <emphasis>
+False</emphasis>
+ otherwise.
+</para>
+
+
+<para>
+To latch the keysym group, use <emphasis>
+XkbLatchGroup.</emphasis>
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbLatchGroup</emphasis>
+(<emphasis>
+display, device_spec, group</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *      <emphasis>
+display</emphasis>
+;            /* connection to the X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+      device_spec</emphasis>
+;            /* device ID, or <emphasis>
+XkbUseCoreKbd</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+      group</emphasis>
+;            /* index of the keysym group to latch */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbLatchGroup</emphasis>
+ sends a request to the server to latch the specified group and does not wait for a reply. It returns <emphasis>
+True</emphasis>
+ if the request was sent and <emphasis>
+False</emphasis>
+ otherwise.
+</para>
+
+
+</sect2>
+</sect1>
+<sect1 id='Determining_Keyboard_State'>
+<title>Determining Keyboard State</title>
+
+<para>
+Xkb keyboard state may be represented in an <emphasis>
+XkbStateRec</emphasis>
+ structure:
+</para>
+
+<para><programlisting>
+typedef struct {
+      unsigned char            group;                /* effective group index */
+      unsigned char            base_group;           /* base group index */
+      unsigned char            latched_group;        /* latched group index */
+      unsigned char            locked_group;         /* locked group index */
+      unsigned char            mods;                 /* effective modifiers */
+      unsigned char            base_mods;            /* base modifiers */
+      unsigned char            latched_mods;         /* latched modifiers */
+      unsigned char            locked_mods;          /* locked modifiers */
+      unsigned char            compat_state;         /* effective group =&gt; modifiers */
+      unsigned char            grab_mods;            /* modifiers used for grabs */
+      unsigned char            compat_grab_mods;     /* mods used for compatibility mode grabs */
+      unsigned char            lookup_mods;          /* modifiers used to lookup symbols */
+      unsigned char            compat_lookup_mods;   /* mods used for compatibility lookup */
+      unsigned short            ptr_buttons;         /* 1 bit =&gt; corresponding pointer btn is down */
+} <emphasis>
+XkbStateRec</emphasis>
+,*XkbStatePtr;
+</programlisting></para>
+
+<para>
+To obtain the keyboard state, use <emphasis>
+XkbGetState.</emphasis>
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbGetState</emphasis>
+(<emphasis>
+display</emphasis>
+, <emphasis>
+device_spec</emphasis>
+, <emphasis>
+state_return</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *            <emphasis>
+display</emphasis>
+;            /* connection to the X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+device_spec</emphasis>
+;            /* device ID, or <emphasis>
+XkbUseCoreKbd</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbStatePtr            <emphasis>
+state_return</emphasis>
+;            /* backfilled with Xkb state */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+The <emphasis>
+XkbGetState </emphasis>
+function queries the server for the current keyboard state, waits for a reply, and then backfills <emphasis>
+state_return</emphasis>
+ with the results.
+</para>
+
+
+<para>
+All group values are expressed as group indices in the range [0..3]. Modifiers and the compatibility modifier state values are expressed as the bitwise union of the core X11 modifier masks. The pointer button state is reported as in the core X11 protocol.
+</para>
+
+
+</sect1>
+<sect1 id='Tracking_Keyboard_State'>
+<title>Tracking Keyboard State</title>
+
+<para>
+The Xkb extension reports <emphasis>
+XkbStateNotify </emphasis>
+events to clients wanting notification whenever the Xkb state changes. The changes reported include changes to any aspect of the keyboard state: when a modifier is set or unset, when the current group changes, or when a pointer button is pressed or released. As with all Xkb events, <emphasis>
+XkbStateNotify</emphasis>
+ events are reported to all interested clients without regard to the current keyboard input focus or grab state.
+</para>
+
+
+<para>
+There are many different types of Xkb state changes. Xkb defines an event detail mask corresponding to each type of change. The event detail masks are listed in Table 5.3.
+</para>
+
+<table frame='topbot'>
+<title>XkbStateNotify Event Detail Masks</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='1.0*'/>
+<thead>
+  <row rowsep='1'>
+    <entry>Mask</entry>
+    <entry>Value</entry>
+  </row>
+</thead>
+<tbody>
+  <row>
+    <entry>XkbModifierStateMask</entry>
+    <entry>(1L &lt;&lt; 0)</entry>
+  </row>
+  <row>
+    <entry>XkbModifierBaseMask</entry>
+    <entry>(1L &lt;&lt; 1)</entry>
+  </row>
+  <row>
+    <entry>XkbModifierLatchMask</entry>
+    <entry>(1L &lt;&lt; 2)</entry>
+  </row>
+  <row>
+    <entry>XkbModifierLockMask</entry>
+    <entry>(1L &lt;&lt; 3)</entry>
+  </row>
+  <row>
+    <entry>XkbGroupStateMask</entry>
+    <entry>(1L &lt;&lt; 4)</entry>
+  </row>
+  <row>
+    <entry>XkbGroupBaseMask</entry>
+    <entry>(1L &lt;&lt; 5)</entry>
+  </row>
+  <row>
+    <entry>XkbGroupLatchMask</entry>
+    <entry>(1L &lt;&lt; 6)</entry>
+  </row>
+  <row>
+    <entry>XkbGroupLockMask</entry>
+    <entry>(1L &lt;&lt; 7)</entry>
+  </row>
+  <row>
+    <entry>XkbCompatStateMask</entry>
+    <entry>(1L &lt;&lt; 8)</entry>
+  </row>
+  <row>
+    <entry>XkbGrabModsMask</entry>
+    <entry>(1L &lt;&lt; 9)</entry>
+  </row>
+  <row>
+    <entry>XkbCompatGrabModsMask</entry>
+    <entry>(1L &lt;&lt; 10)</entry>
+  </row>
+  <row>
+    <entry>XkbLookupModsMask</entry>
+    <entry>(1L &lt;&lt; 11)</entry>
+  </row>
+  <row>
+    <entry>XkbCompatLookupModsMask</entry>
+    <entry>(1L &lt;&lt; 12)</entry>
+  </row>
+  <row>
+    <entry>XkbPointerButtonMask</entry>
+    <entry>(1L &lt;&lt; 13)</entry>
+  </row>
+  <row>
+    <entry>XkbAllStateComponentsMask</entry>
+    <entry>(0x3fff)</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+To track changes in the keyboard state for a particular device, select to receive <emphasis>
+XkbStateNotify</emphasis>
+ events by calling either <emphasis>
+XkbSelectEvents</emphasis>
+ or <emphasis>
+XkbSelectEventDetails</emphasis>
+ (see section 4.3). <!-- xref -->
+</para>
+
+
+<para>
+To receive <emphasis>
+XkbStateNotify</emphasis>
+ events under all possible conditions, use <emphasis>
+XkbSelectEvents</emphasis>
+ and pass <emphasis>
+XkbStateNotifyMask</emphasis>
+ in both <emphasis>
+bits_to_change</emphasis>
+ and <emphasis>
+values_for_bits</emphasis>
+.
+</para>
+
+
+<para>
+To receive <emphasis>
+XkbStateNotify</emphasis>
+ events only under certain conditions, use <emphasis>
+XkbSelectEventDetails</emphasis>
+ using <emphasis>
+XkbStateNotify</emphasis>
+ as the <emphasis>
+event_type</emphasis>
+ and specifying the desired state changes in <emphasis>
+bits_to_change</emphasis>
+ and <emphasis>
+values_for_bits</emphasis>
+ using mask bits from Table 5.3. <!-- xref -->
+</para>
+
+
+<para>
+The structure for <emphasis>
+XkbStateNotify</emphasis>
+ events is:
+</para>
+
+<para><programlisting>
+typedef struct {
+      int            type;            /* Xkb extension base event code */
+      unsigned long  serial;          /* X server serial number for event */
+      Bool           send_event;      /* <emphasis> True</emphasis> =&gt; synthetically generated */
+      Display *      display;         /* server connection where event generated */
+      Time           time;            /* server time when event generated */
+      int            xkb_type;        /* <emphasis> XkbStateNotify</emphasis> */
+      int            device;          /* Xkb device ID, will not be <emphasis> XkbUseCoreKbd</emphasis> */
+      unsigned int   changed;         /* bits indicating what has changed */
+      int            group;           /* group index of effective group */
+      int            base_group;      /* group index of base group */
+      int            latched_group;   /* group index of latched group */
+      int            locked_group;    /* group index of locked group */
+      unsigned int   mods;            /* effective modifiers */
+      unsigned int   base_mods;       /* base modifiers */
+      unsigned int   latched_mods;    /* latched modifiers */
+      unsigned int   locked_mods;     /* locked modifiers */
+      int            compat_state;    /* computed compatibility state */
+      unsigned char  grab_mods;       /* modifiers used for grabs */
+      unsigned char  compat_grab_mods;  /* modifiers used for compatibility grabs */
+      unsigned char  lookup_mods;     /* modifiers used to lookup symbols */
+      unsigned char  compat_lookup_mods;                  /* mods used for compatibility look up */
+      int            ptr_buttons;     /* core pointer buttons */
+      KeyCode        keycode;         /* keycode causing event, 0 if programmatic */
+      char           event_type;      /* core event if <emphasis> req_major</emphasis> or
+                                         <emphasis> req_minor</emphasis> non zero */
+      char           req_major;       /* major request code if program trigger, else 0 */
+      char           req_minor;       /* minor request code if program trigger, else 0 */
+} <emphasis>XkbStateNotifyEvent</emphasis>
+;
+</programlisting></para>
+
+<para>
+When you receive an <emphasis>
+XkbStateNotify</emphasis>
+ event, the <emphasis>
+changed</emphasis>
+ field indicates which elements of keyboard state have changed.
+This will be the bitwise inclusive OR of one or more of the <emphasis>
+XkbStateNotify</emphasis>
+ event detail masks shown in Table 5.3. All fields reported in  <!-- xref -->
+the event are valid, but only those indicated in <emphasis>
+changed</emphasis>
+ have changed values.
+</para>
+
+
+<para>
+The <emphasis>
+group</emphasis>
+ field is the group index of the effective keysym group. The <emphasis>
+base_group</emphasis>
+, <emphasis>
+latched_group</emphasis>
+, and <emphasis>
+locked_group</emphasis>
+ fields are set to a group index value representing the base group,
+the latched group, and the locked group, respectively. The X
+server can set the modifier and compatibility state fields to
+a union of the core modifier mask bits; this union represents the
+corresponding modifier states. The <emphasis>ptr_button</emphasis>
+ field gives the state of the core pointer buttons as a
+mask composed of an inclusive OR of zero or more of the
+core pointer button masks.
+</para>
+
+
+<para>
+Xkb state changes can occur either in response to keyboard
+activity or under application control. If a key event
+caused the state change, the <emphasis>
+keycode</emphasis>
+ field gives the keycode of the key event, and the <emphasis>
+event_type</emphasis>
+ field is set to either <emphasis>KeyPress</emphasis>
+ or <emphasis>
+KeyRelease</emphasis>
+. If a pointer button event caused the state change, the <emphasis>
+keycode</emphasis>
+ field is zero, and the <emphasis>event_type</emphasis>
+ field is set to either <emphasis>ButtonPress</emphasis>
+ or <emphasis>ButtonRelease</emphasis>
+. Otherwise, the major and minor codes of the request that caused the
+state change are given in the <emphasis>
+req_major</emphasis>
+ and <emphasis>
+req_minor</emphasis>
+ fields, and the <emphasis>
+keycode</emphasis>
+ field is zero. The <emphasis>
+req_major</emphasis>
+ value is the same as the major extension opcode.
+</para>
+</sect1>
+</chapter>
diff --git a/specs/XKB/ch06.xml b/specs/XKB/ch06.xml
new file mode 100644 (file)
index 0000000..422e6d2
--- /dev/null
@@ -0,0 +1,418 @@
+<chapter id='Complete_Keyboard_Description'>
+<title>Complete Keyboard Description</title>
+
+<para>
+The complete Xkb description for a keyboard device is accessed using a single
+structure containing pointers to major Xkb components. This chapter describes
+this single structure and provides references to other sections of this
+document that discuss the major Xkb components in detail.
+</para>
+
+<sect1 id='The_XkbDescRec_Structure'>
+<title>The XkbDescRec Structure</title>
+
+<para>
+The complete description of an Xkb keyboard is given by an <emphasis>
+XkbDescRec</emphasis>
+. The component structures in the <emphasis>
+XkbDescRec</emphasis>
+ represent the major Xkb components outlined in Figure 1.1. <!-- xref -->
+</para>
+
+<para><programlisting>
+typedef struct {
+      struct _XDisplay *                  display;            /* connection to
+X server */
+      unsigned short                  flags;            /* private to Xkb, do
+not modify */
+      unsigned short                  device_spec;            /* device of
+interest */
+      KeyCode                  min_key_code;            /* minimum keycode for
+device */
+      KeyCode                  max_key_code;            /* maximum keycode for
+device */
+      XkbControlsPtr                  ctrls;            /* controls */
+      XkbServerMapPtr                  server;            /* server keymap */
+      XkbClientMapPtr                  map;            /* client keymap */
+      XkbIndicatorPtr                  indicators;            /* indicator map
+*/
+      XkbNamesPtr                  names;            /* names for all
+components */
+      XkbCompatMapPtr                  compat;            /* compatibility map
+*/
+      XkbGeometryPtr                  geom;            /* physical geometry of
+keyboard */
+} <emphasis>
+XkbDescRec</emphasis>
+, *XkbDescPtr;
+</programlisting></para>
+
+<para>
+The <emphasis>
+display</emphasis>
+ field points to an X display structure. The <emphasis>
+flags</emphasis>
+ field is private to the library: modifying <emphasis>
+flags</emphasis>
+ may yield unpredictable results. The <emphasis>
+device_spec</emphasis>
+ field specifies the device identifier of the keyboard input device, or
+<emphasis>
+XkbUseCoreKeyboard</emphasis>
+, which specifies the core keyboard device. The <emphasis>
+min_key_code</emphasis>
+ and <emphasis>
+max_key_code</emphasis>
+ fields specify the least and greatest keycode that can be returned by the
+keyboard.
+</para>
+
+
+<para>
+The other fields specify structure components of the keyboard description and
+are described in detail in other sections of this document. Table 6.1
+identifies the subsequent sections of this document that discuss the individual
+components of the <emphasis>
+XkbDescRec</emphasis>
+.
+</para>
+
+<table frame='topbot'>
+<title>XkbDescRec Component References</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>XkbDescRec Field</entry>
+  <entry>For more info</entry>
+</row>
+</thead>
+<tbody>
+<row>
+    <entry>ctrls</entry>
+    <entry>Chapter 10</entry>
+</row>
+<row>
+    <entry>server</entry>
+    <entry>Chapter 16</entry>
+</row>
+<row>
+    <entry>map</entry>
+    <entry>Chapter 15</entry>
+</row>
+<row>
+    <entry>indicators</entry>
+    <entry>Chapter 8</entry>
+</row>
+<row>
+    <entry>names</entry>
+    <entry>Chapter 18</entry>
+</row>
+<row>
+    <entry>compat</entry>
+    <entry>Chapter 17</entry>
+</row>
+<row>
+    <entry>geom</entry>
+    <entry>Chapter 13</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+Each structure component has a corresponding mask bit that is used in function
+calls to indicate that the structure should be manipulated in some manner, such
+as allocating it or freeing it. These masks and their relationships to the
+fields in the <emphasis>
+XkbDescRec</emphasis>
+ are shown in Table 6.2. <!-- xref -->
+</para>
+
+<table frame='topbot'>
+<title>Mask Bits for XkbDescRec</title>
+<?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>Mask Bit</entry>
+  <entry>XkbDescRec Field</entry>
+  <entry>Value</entry>
+</row>
+</thead>
+<tbody>
+<row>
+    <entry>XkbControlsMask</entry>
+    <entry>ctrls</entry>
+    <entry>(1L&lt;&lt;0)</entry>
+</row>
+<row>
+    <entry>XkbServerMapMask</entry>
+    <entry>server</entry>
+    <entry>(1L&lt;&lt;1)</entry>
+</row>
+<row>
+    <entry>XkbIClientMapMask</entry>
+    <entry>map</entry>
+    <entry>(1L&lt;&lt;2)</entry>
+</row>
+<row>
+    <entry>XkbIndicatorMapMask</entry>
+    <entry>indicators</entry>
+    <entry>(1L&lt;&lt;3)</entry>
+</row>
+<row>
+    <entry>XkbNamesMask</entry>
+    <entry>names</entry>
+    <entry>(1L&lt;&lt;4)</entry>
+</row>
+<row>
+    <entry>XkbCompatMapMask</entry>
+    <entry>compat</entry>
+    <entry>(1L&lt;&lt;5)</entry>
+</row>
+<row>
+    <entry>XkbGeometryMask</entry>
+    <entry>geom</entry>
+    <entry>(1L&lt;&lt;6)</entry>
+</row>
+<row>
+    <entry>XkbAllComponentsMask</entry>
+    <entry>All Fields</entry>
+    <entry>(0x7f)</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+</sect1>
+<sect1 id='Obtaining_a_Keyboard_Description_from_the_Server'>
+<title>Obtaining a Keyboard Description from the Server</title>
+
+<para>
+To retrieve one or more components of a keyboard device description, use
+<emphasis>
+XkbGetKeyboard</emphasis>
+ (see also <emphasis>
+XkbGetKeyboardbyName</emphasis>
+).
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+XkbDescPtr <emphasis>
+XkbGetKeyboard</emphasis>
+(<emphasis>
+display, which, device_spec</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display * <emphasis>
+      display</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+which</emphasis>
+;            /* mask indicating components to return */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+      device_spec</emphasis>
+;            /* device for which to fetch description, or <emphasis>
+XkbUseCoreKbd</emphasis>
+ */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetKeyboard </emphasis>
+allocates and returns a pointer to a keyboard description. It queries the
+server for those components specified in the <emphasis>
+which</emphasis>
+ parameter for device <emphasis>
+device_spec</emphasis>
+ and copies the results to the <emphasis>
+XkbDescRec</emphasis>
+ it allocated. The remaining fields in the keyboard description are set to
+<emphasis>
+NULL</emphasis>
+. The valid masks for <emphasis>
+which</emphasis>
+ are those listed in Table 6.2. <!-- xref -->
+</para>
+
+
+<para>
+<emphasis>
+XkbGetKeyboard</emphasis>
+ can generate <emphasis>
+BadAlloc</emphasis>
+ protocol errors.
+</para>
+
+
+<para>
+To free the returned keyboard description, use <emphasis>
+XkbFreeKeyboard</emphasis>
+ (see section 6.4). <!-- xref -->
+</para>
+
+
+</sect1>
+<sect1 id='Tracking_Changes_to_the_Keyboard_Description_in_the_Server'>
+<title>Tracking Changes to the Keyboard Description in the Server</title>
+
+<para>
+The server can generate events whenever its copy of the keyboard description
+for a device changes. Refer to section 14.4 for detailed information on  <!-- xref -->
+tracking changes to the keyboard description.
+</para>
+
+
+</sect1>
+<sect1 id='Allocating_and_Freeing_a_Keyboard_Description'>
+<title>Allocating and Freeing a Keyboard Description</title>
+
+<para>
+Applications seldom need to directly allocate a keyboard description; calling
+<emphasis>
+XkbGetKeyboard</emphasis>
+ usually suffices. In the event you need to create a keyboard description from
+scratch, however, use <emphasis>
+XkbAllocKeyboard</emphasis>
+ rather than directly calling <emphasis>
+malloc </emphasis>
+or <emphasis>
+Xmalloc</emphasis>
+.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+XkbDescRec * <emphasis>
+XkbAllocKeyboard</emphasis>
+(void)
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+If <emphasis>
+XkbAllocKeyboard</emphasis>
+ fails to allocate the keyboard description, it returns <emphasis>
+NULL</emphasis>
+. Otherwise, it returns a pointer to an empty keyboard description structure.
+The <emphasis>
+device_spec</emphasis>
+ field will have been initialized to <emphasis>
+XkbUseCoreKbd</emphasis>
+. You may then either fill in the structure components or use Xkb functions to
+obtain values for the structure components from a keyboard device.
+</para>
+
+
+<para>
+To destroy either an entire an <emphasis>
+XkbDescRec</emphasis>
+ or just some of its members, use <emphasis>
+XkbFreeKeyboard.</emphasis>
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbFreeKeyboard</emphasis>
+<emphasis>
+(xkb, which, free_all</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr <emphasis>
+            xkb</emphasis>
+;            /* keyboard description with components to free */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+      which</emphasis>
+;            /* mask selecting components to free */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool <emphasis>
+            free_all</emphasis>
+;            /* <emphasis>
+True</emphasis>
+ =&gt; free all components and <emphasis>
+xkb</emphasis>
+ */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbFreeKeyboard</emphasis>
+ frees the components of <emphasis>
+xkb</emphasis>
+ specified by <emphasis>
+which</emphasis>
+ and sets the corresponding values to <emphasis>
+NULL</emphasis>
+. If <emphasis>
+free_all</emphasis>
+ is <emphasis>
+True</emphasis>
+, <emphasis>
+XkbFreeKeyboard</emphasis>
+ frees every non-<emphasis>
+NULL</emphasis>
+ component of <emphasis>
+xkb</emphasis>
+ and then frees the <emphasis>
+xkb</emphasis>
+ structure itself.
+</para>
+
+</sect1>
+</chapter>
diff --git a/specs/XKB/ch07.xml b/specs/XKB/ch07.xml
new file mode 100644 (file)
index 0000000..35b4590
--- /dev/null
@@ -0,0 +1,447 @@
+<chapter id='Virtual_Modifiers'>
+<title>Virtual Modifiers</title>
+
+<para>
+The core protocol specifies that certain keysyms, when bound to modifiers,
+affect the rules of keycode to keysym interpretation for all keys; for example,
+when the <emphasis>
+Num_Lock</emphasis>
+ keysym is bound to some modifier, that modifier is used to select between
+shifted and unshifted state for the numeric keypad keys. The core protocol does
+not provide a convenient way to determine the mapping of modifier bits (in
+particular <emphasis>
+Mod1</emphasis>
+ through <emphasis>
+Mod5</emphasis>
+) to keysyms such as <emphasis>
+Num_Lock</emphasis>
+ and <emphasis>
+Mode_switch</emphasis>
+. Using the core protocol only, a client application must retrieve and search
+the modifier map to determine the keycodes bound to each modifier, and then
+retrieve and search the keyboard mapping to determine the keysyms bound to the
+keycodes. It must repeat this process for all modifiers whenever any part of
+the modifier mapping is changed.
+</para>
+
+
+<para>
+Xkb alleviates these problems by defining virtual modifiers. In addition to the
+eight core modifiers, referred to as the <emphasis>
+real modifiers</emphasis>
+, Xkb provides a set of sixteen named <emphasis>
+virtual modifiers</emphasis>
+. Each virtual modifier can be bound to any set of the real modifiers
+(<emphasis>
+Shift</emphasis>
+, <emphasis>
+Lock</emphasis>
+, <emphasis>
+Control,</emphasis>
+ and <emphasis>
+Mod1</emphasis>
+-<emphasis>
+Mod5</emphasis>
+).
+</para>
+
+
+<para>
+The separation of function from physical modifier bindings makes it easier to
+specify more clearly the intent of a binding. X servers do not all assign
+modifiers the same way — for example, <emphasis>
+Num_Lock</emphasis>
+ might be bound to <emphasis>
+Mod2</emphasis>
+ for one vendor and to <emphasis>
+Mod4</emphasis>
+ for another. This makes it cumbersome to automatically remap the keyboard to a
+desired configuration without some kind of prior knowledge about the keyboard
+layout and bindings. With XKB, applications can use virtual modifiers to
+specify the desired behavior, without regard for the actual physical bindings
+in effect.
+</para>
+
+<sect1 id='Virtual_Modifier_Names_and_Masks'>
+<title>Virtual Modifier Names and Masks</title>
+
+<para>
+Virtual modifiers are named by converting their string name to an X <emphasis>
+Atom</emphasis>
+ and storing the Atom in the <emphasis>
+names.vmods</emphasis>
+ array in an <emphasis>
+XkbDescRec</emphasis>
+ structure (see section 6.1). The position of a name Atom in the <emphasis>
+names.vmods</emphasis>
+ array defines the bit position used to represent the virtual modifier and also
+the index used when accessing virtual modifier information in arrays: the name
+in the i-th (0 relative) entry of <emphasis>
+names.vmods</emphasis>
+ is the i-th virtual modifier, represented by the mask (1&lt;&lt;i). Throughout
+Xkb, various functions have a parameter that is a mask representing virtual
+modifier choices. In each case, the i-th bit (0 relative) of the mask
+represents the i-th virtual modifier.
+</para>
+
+
+<para>
+To set the name of a virtual modifier, use <emphasis>
+XkbSetNames</emphasis>
+, using <emphasis>
+XkbVirtualModNamesMask</emphasis>
+ in <emphasis>
+which</emphasis>
+ and the name in the <emphasis>
+xkb</emphasis>
+ argument; to retrieve indicator names, use <emphasis>
+XkbGetNames</emphasis>
+. These functions are discussed in Chapter 18.
+</para>
+
+
+</sect1>
+<sect1 id='Modifier_Definitions'>
+<title>Modifier Definitions</title>
+
+<para>
+An Xkb<emphasis>
+ modifier definition</emphasis>
+ enumerates a collection of real and virtual modifiers but does not in itself
+bind those modifiers to any particular key or to each other. Modifier
+definitions are included in a number of structures in the keyboard description
+to define the collection of modifiers that affect or are affected by some other
+entity. A modifier definition is relevant only in the context of some other
+entity such as an indicator map, a control, or a key type. (See sections 8.2.2,
+10.8, and 15.2.) <!-- xref -->
+</para>
+
+<para><programlisting>
+typedef struct _XkbMods {
+      unsigned char            mask;            /* real_mods | vmods mapped to
+real modifiers */
+      unsigned char            real_mods;            /* real modifier bits */
+      unsigned short             vmods;            /* virtual modifier bits */
+} <emphasis>
+XkbModsRec</emphasis>
+,*XkbModsPtr;
+</programlisting></para>
+
+<para>
+An Xkb modifier definition consists of a set of bit masks corresponding to the
+eight real modifiers (<emphasis>
+real_mods</emphasis>
+); a similar set of bitmasks corresponding to the 16 named virtual modifiers
+(<emphasis>
+vmods</emphasis>
+); and an effective mask (<emphasis>
+mask</emphasis>
+). The effective mask represents the set of all real modifiers that can
+logically be set either by setting any of the real modifiers or by setting any
+of the virtual modifiers in the definition. <emphasis>
+mask</emphasis>
+ is derived from the real and virtual modifiers and should never be explicitly
+changed — it contains all of the real modifiers specified in the definition
+(<emphasis>
+real_mods</emphasis>
+)<emphasis>
+ plus</emphasis>
+ any real modifiers that are bound to the virtual modifiers specified in the
+definition (<emphasis>
+vmods</emphasis>
+). The binding of the virtual modifiers to real modifiers is exterior to the
+modifier definition. Xkb automatically recomputes the mask field of modifier
+definitions as necessary. Whenever you access a modifier definition that has
+been retrieved using an Xkb library function, the mask field will be correct
+for the keyboard mapping of interest.
+</para>
+
+
+</sect1>
+<sect1 id='Binding_Virtual_Modifiers_to_Real_Modifiers'>
+<title>Binding Virtual Modifiers to Real Modifiers</title>
+
+<para>
+The binding of virtual modifiers to real modifiers is defined by the <emphasis>
+server.vmods</emphasis>
+ array in an <emphasis>
+XkbDescRec</emphasis>
+ structure. Each entry contains the real modifier bits that are bound to the
+virtual modifier corresponding to the entry. The overall relationship of fields
+dealing with virtual modifiers in the server keyboard description are shown in
+Figure 16.2. <!-- xref -->
+</para>
+
+
+</sect1>
+<sect1 id='Virtual_Modifier_Key_Mapping'>
+<title>Virtual Modifier Key Mapping</title>
+
+<para>
+Xkb maintains a <emphasis>
+virtual modifier mapping</emphasis>
+, which lists the virtual modifiers associated with, or bound to, each key. The
+real modifiers bound to a virtual modifier always include all of the modifiers
+bound to any of the keys that specify that virtual modifier in their virtual
+modifier mapping. The <emphasis>
+server.vmodmap</emphasis>
+ array indicates which virtual modifiers are bound to each key; each entry is a
+bitmask for the virtual modifier bits. The <emphasis>
+server.vmodmap</emphasis>
+ array is indexed by keycode.
+</para>
+
+
+<para>
+The <emphasis>
+vmodmap</emphasis>
+ and <emphasis>
+vmods</emphasis>
+ members of the server map are the "master" virtual modifier definitions. Xkb
+automatically propagates any changes to these fields to all other fields that
+use virtual modifier mappings (see section 16.4).
+</para>
+
+
+<para>
+For example, if <emphasis>
+Mod3</emphasis>
+ is bound to the <emphasis>
+Num_Lock</emphasis>
+ key by the core protocol modifier mapping, and the <emphasis>
+NumLock</emphasis>
+ virtual modifier is bound to they <emphasis>
+Num_Lock</emphasis>
+ key by the virtual modifier mapping, <emphasis>
+Mod3</emphasis>
+ is added to the set of modifiers associated with <emphasis>
+NumLock</emphasis>
+.
+</para>
+
+
+<para>
+The virtual modifier mapping is normally updated whenever actions are
+automatically applied to symbols (see section 16.4 for details), and few
+applications should need to change the virtual modifier mapping explicitly.
+</para>
+
+
+<para>
+Use <emphasis>
+XkbGetMap </emphasis>
+(see section 14.2) to get the virtual modifiers from the server or use  <!-- xref -->
+<emphasis>
+XkbGetVirtualMods</emphasis>
+ (see section 16.4.1) to update a local copy of the virtual modifiers bindings  <!-- xref -->
+from the server. To set the binding of a virtual modifier to a real modifier,
+use <emphasis>
+XkbSetMap</emphasis>
+ (see<emphasis>
+ </emphasis>
+section 14.3<emphasis> <!-- xref -->
+).</emphasis>
+</para>
+
+
+<para>
+To determine the mapping of virtual modifiers to core X protocol modifiers, use
+<emphasis>
+XkbVirtualModsToReal</emphasis>
+.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbVirtualModsToReal</emphasis>
+(<emphasis>
+xkb, virtual_mask, mask_rtrn</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr <emphasis>
+            xkb</emphasis>
+;            /* keyboard description for input device */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+            virtual_mask</emphasis>
+;            /* virtual modifier mask to translate */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int *             <emphasis>
+mask_rtrn</emphasis>
+;            /* backfilled with real modifiers */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+If the keyboard description defined by <emphasis>
+xkb</emphasis>
+ includes bindings for virtual modifiers, <emphasis>
+XkbVirtualModsToReal</emphasis>
+ uses those bindings to determine the set of real modifiers that correspond to
+the set of virtual modifiers specified in <emphasis>
+virtual_mask</emphasis>
+. The <emphasis>
+virtual_mask</emphasis>
+ parameter is a mask specifying the virtual modifiers to translate; the i-th
+bit (0 relative) of the mask represents the i-th virtual modifier. If <emphasis>
+mask_rtrn</emphasis>
+ is non-<emphasis>
+NULL</emphasis>
+, <emphasis>
+XkbVirtualModsToReal</emphasis>
+ backfills it with the resulting real modifier mask. If the keyboard
+description in <emphasis>
+xkb</emphasis>
+ does not include virtual modifier bindings, <emphasis>
+XkbVirtualModsToReal</emphasis>
+ returns <emphasis>
+False</emphasis>
+; otherwise, it returns <emphasis>
+True</emphasis>
+.
+</para>
+
+<note><para>It is possible for a local (client-side) keyboard description (the
+<emphasis>
+xkb</emphasis>
+ parameter) to not contain any virtual modifier information (simply because the
+client has not requested it) while the server’s corresponding definition may
+contain virtual modifier information. </para></note>
+
+
+<sect2 id='Inactive_Modifier_Sets'>
+<title>Inactive Modifier Sets</title>
+
+<para>
+An unbound virtual modifier is one that is not bound to any real modifier
+(<emphasis>
+server</emphasis>
+-&gt;<emphasis>
+vmods</emphasis>
+[virtual_modifier_index] is zero).
+</para>
+
+
+<para>
+Some Xkb operations ignore modifier definitions in which the virtual modifiers
+are unbound. Consider this example:
+</para>
+
+<literallayout>
+if (state matches {Shift}) Do OneThing;
+if (state matches {Shift+NumLock}) Do Another;
+</literallayout>
+
+<para>
+If the <emphasis>
+NumLock</emphasis>
+ virtual modifier is not bound to any real modifiers, the effective masks for
+these two cases are identical (that is, contain only <emphasis>
+Shift</emphasis>
+). When it is essential to distinguish between <emphasis>
+OneThing</emphasis>
+ and Another, Xkb considers only those modifier definitions for which all
+virtual modifiers are bound.
+</para>
+
+
+</sect2>
+</sect1>
+<sect1 id='Conventions'>
+<title>Conventions</title>
+
+<para>
+The Xkb extension does not require any specific virtual modifier names.
+However, everyone benefits if the same names are used for common modifiers. The
+following names are suggested:
+</para>
+
+<literallayout class='monospaced'>
+     <emphasis>
+     NumLock
+     ScrollLock
+     Alt
+     Meta
+     AltGr
+     LevelThree</emphasis>
+</literallayout>
+
+</sect1>
+<sect1 id='Example'>
+<title>Example</title>
+
+<para>
+If the second (0-relative) entry in <emphasis>
+names.vmods</emphasis>
+ contains the Atom for "NumLock", then 0x4 (1&lt;&lt;2) is the virtual modifier
+bit for the <emphasis>
+NumLock</emphasis>
+ virtual modifier. If <emphasis>
+server.vmods</emphasis>
+[2] contains <emphasis>
+Mod3Mask</emphasis>
+, then the <emphasis>
+NumLock</emphasis>
+ virtual modifier is bound to the <emphasis>
+Mod3</emphasis>
+ real modifier.
+</para>
+
+
+<para>
+A virtual modifier definition for this example would have:
+</para>
+
+<literallayout class='monospaced'>
+     real_mods = 0
+     vmods = 0x4 (NumLock named virtual modifier)
+     mask = 0x20 (Mod3Mask)
+</literallayout>
+
+<para>
+Continuing the example, if the keyboard has a <emphasis>
+Num_Lock</emphasis>
+ keysym bound to the key with keycode 14, and the <emphasis>
+NumLock</emphasis>
+ virtual modifier is bound to this key, <emphasis>
+server.vmodmap</emphasis>
+[14] contains 0x4.
+</para>
+
+
+<para>
+Finally, if the keyboard also used the real <emphasis>
+Mod1</emphasis>
+ modifier for numeric lock operations, the modifier definition below would
+represent the situation where either the key bound to <emphasis>
+Mod1</emphasis>
+ or the <emphasis>
+NumLock</emphasis>
+ virtual modifier could be used for this purpose:
+</para>
+
+<literallayout class='monospaced'>
+     real_mods = 0x8 (Mod1Mask)
+     vmods = 0x4 (NumLock named virtual modifier)
+     mask = 0x28 (Mod1Mask | Mod3Mask)
+</literallayout>
+</sect1>
+</chapter>
diff --git a/specs/XKB/ch08.xml b/specs/XKB/ch08.xml
new file mode 100644 (file)
index 0000000..2b91f00
--- /dev/null
@@ -0,0 +1,2106 @@
+<chapter id='Indicators'>
+<title>Indicators</title>
+
+<para>
+Although the core X implementation supports up to 32 LEDs on an input device,
+it does not provide any linkage between the state of the LEDs and the logical
+state of the input device. For example, most keyboards have a <emphasis>
+CapsLock</emphasis>
+ LED, but X does not provide a mechanism to make the LED automatically follow
+the logical state of the <emphasis>
+CapsLock</emphasis>
+ key.
+</para>
+
+
+<para>
+Furthermore, the core X implementation does not provide clients with the
+ability to determine what bits in the <emphasis>
+led_mask</emphasis>
+ field of the <emphasis>
+XKeyboardState</emphasis>
+ map to the particular LEDs on the keyboard. For example, X does not provide a
+method for a client to determine what bit to set in the <emphasis>
+led_mask</emphasis>
+ field to turn on the <emphasis>
+Scroll Lock </emphasis>
+LED or whether the keyboard even has a <emphasis>
+Scroll Lock</emphasis>
+ LED.
+</para>
+
+
+<para>
+Xkb provides indicator names and programmable indicators to help solve these
+problems. Using Xkb, clients can determine the names of the various indicators,
+determine and control the way that the individual indicators should be updated
+to reflect keyboard changes, and determine which of the 32 keyboard indicators
+reported by the protocol are actually present on the keyboard. Clients may also
+request immediate notification of changes to the state of any subset of the
+keyboard indicators, which makes it straightforward to provide an on-screen
+"virtual" LED panel. This chapter describes Xkb indicators and the functions
+used for manipulating them.
+</para>
+
+<sect1 id='Indicator_Names'>
+<title>Indicator Names</title>
+
+<para>
+Xkb provides the capability of symbolically naming indicators. Xkb itself
+doesn’t use these symbolic names for anything; they are there only to help
+make the keyboard description comprehensible to humans. To set the names of
+specific indicators, use <emphasis>
+XkbSetNames</emphasis>
+ as discussed in Chapter 18. Then set the map using <emphasis> <!-- xref -->
+XkbSetMap</emphasis>
+ (see section 14.3) or <emphasis> <!-- xref -->
+XkbSetNamedIndicator</emphasis>
+ (below). To retrieve indicator names, use <emphasis>
+XkbGetNames</emphasis>
+ (Chapter 18). <!-- xref -->
+</para>
+
+
+</sect1>
+<sect1 id='Indicator_Data_Structures'>
+<title>Indicator Data Structures</title>
+
+<para>
+Use the indicator description record, <emphasis>
+XkbIndicatorRec</emphasis>
+, and its indicator map, <emphasis>
+XkbIndicatorMapRec</emphasis>
+, to inquire about and control most indicator properties and behaviors.
+</para>
+
+
+<sect2 id='XkbIndicatorRec'>
+<title>XkbIndicatorRec</title>
+
+<para>
+The description for all the Xkb indicators is held in the <emphasis>
+indicators</emphasis>
+ field of the complete keyboard description (see Chapter 6), which is defined  <!-- xref -->
+as follows:
+</para>
+
+<para><programlisting>
+#define      XkbNumIndicators      32
+</programlisting></para>
+<para><programlisting>
+typedef struct {
+      unsigned long                   phys_indicators;        /* LEDs existence */
+      XkbIndicatorMapRec              maps[XkbNumIndicators]; /* indicator maps */
+} <emphasis>XkbIndicatorRec</emphasis>,*XkbIndicatorPtr;
+</programlisting></para>
+
+<para>
+This structure contains the <emphasis>
+phys_indicators</emphasis>
+ field, which relates some information about the correspondence between
+indicators and physical LEDs on the keyboard, and an array of indicator
+<emphasis>
+maps</emphasis>
+, one map per indicator.
+</para>
+
+<para>
+The <emphasis>
+phys_indicators</emphasis>
+ field indicates which indicators are bound to physical LEDs on the keyboard;
+if a bit is set in <emphasis>
+phys_indicators</emphasis>
+, then the associated indicator has a physical LED associated with it. This
+field is necessary because some indicators may not have corresponding physical
+LEDs on the keyboard. For example, most keyboards have an LED for indicating
+the state of <emphasis>
+CapsLock</emphasis>
+, but most keyboards do not have an LED that indicates the current group.
+Because <emphasis>
+phys_indicators</emphasis>
+ describes a physical characteristic of the keyboard, you cannot directly
+change it under program control. However, if a client program loads a
+completely new keyboard description via <emphasis>
+XkbGetKeyboardByName</emphasis>
+, or if a new keyboard is attached and the X implementation notices, <emphasis>
+phys_indicators</emphasis>
+ changes if the indicators for the new keyboard are different.
+</para>
+
+
+</sect2>
+<sect2 id='XkbIndicatorMapRec'>
+<title>XkbIndicatorMapRec</title>
+
+<para>
+Each indicator has its own set of attributes that specify whether clients can
+explicitly set its state and whether it tracks the keyboard state. The
+attributes of each indicator are held in the <emphasis>
+maps</emphasis>
+ array, which is an array of <emphasis>
+XkbIndicatorRec</emphasis>
+ structures:
+</para>
+
+<para><programlisting>
+typedef struct {
+      unsigned char    flags;         /* how the indicator can be changed */
+      unsigned char    which_groups;  /* match criteria for groups */
+      unsigned char    groups;        /* which keyboard groups the indicator watches */
+      unsigned char    which_mods;    /* match criteria for modifiers */
+      XkbModsRec       mods;          /* which modifiers the indicator watches */
+      unsigned int     ctrls;         /* which controls the indicator watches */
+} <emphasis>XkbIndicatorMapRec</emphasis>, *XkbIndicatorMapPtr;
+</programlisting></para>
+
+<para>
+This indicator map specifies for each indicator:
+</para>
+
+<itemizedlist>
+<listitem>
+  <para>
+The conditions under which the keyboard modifier state affects the indicator
+  </para>
+</listitem>
+<listitem>
+  <para>
+The conditions under which the keyboard group state affects the indicator
+  </para>
+</listitem>
+<listitem>
+  <para>
+The conditions under which the state of the boolean controls affects the
+indicator
+  </para>
+</listitem>
+<listitem>
+  <para>
+The effect (if any) of attempts to explicitly change the state of the indicator
+using the functions <emphasis>
+XkbSetControls</emphasis>
+ or <emphasis>
+XChangeKeyboardControl</emphasis>
+
+  </para>
+</listitem>
+</itemizedlist>
+
+<para>
+For more information on the effects of explicit changes to indicators and the
+relationship to the indicator map, see section 8.4.1. <!-- xref -->
+</para>
+
+<sect3 id='XkbIndicatorMapRec_flags_field'>
+<title>XkbIndicatorMapRec flags field</title>
+
+<para>
+The <emphasis>
+flags</emphasis>
+ field specifies the conditions under which the indicator can be changed and
+the effects of changing the indicator. The valid values for <emphasis>
+flags</emphasis>
+ and their effects are shown in Table 8.1. <!-- xref -->
+</para>
+
+<table frame='topbot'>
+<title>XkbIndicatorMapRec flags Field</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='3' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='2.0*'/>
+<colspec colname='c2' colwidth='1.0*'/>
+<colspec colname='c3' colwidth='3.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Value</entry>
+  <entry></entry>
+  <entry>Effect</entry>
+  </row>
+</thead>
+<tbody>
+  <row>
+    <entry>XkbIM_NoExplicit</entry>
+    <entry>(1L&lt;&lt;7)</entry>
+    <entry>Client applications cannot change the state of the indicator.</entry>
+  </row>
+  <row>
+    <entry>XkbIM_NoAutomatic</entry>
+    <entry>(1L&lt;&lt;6)</entry>
+    <entry>Xkb does not automatically change the value of the indicator based
+upon a change in the keyboard state, regardless of the values for the other
+fields of the indicator map.</entry>
+  </row>
+  <row>
+    <entry>XkbIM_LEDDrivesKB</entry>
+    <entry>(1L&lt;&lt;5)</entry>
+    <entry>A client application changing the state of the indicator causes the
+state of the keyboard to change.</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+Note that if <emphasis>
+XkbIM_NoAutomatic</emphasis>
+ is not set, by default the indicator follows the keyboard state.
+</para>
+
+
+<para>
+If <emphasis>
+XkbIM_LEDDrivesKB</emphasis>
+ is set and <emphasis>
+XkbIM_NoExplicit</emphasis>
+ is not, and if you call a function which updates the server’s image of the
+indicator map (such as <emphasis>
+XkbSetIndicatorMap</emphasis>
+ or <emphasis>
+XkbSetNamedIndicator</emphasis>
+), Xkb changes the keyboard state and controls to reflect the other fields of
+the indicator map, as described in the remainder of this section. If you
+attempt to explicitly change the value of an indicator for which <emphasis>
+XkbIM_LEDDrivesKB</emphasis>
+ is absent or for which <emphasis>
+XkbIM_NoExplicit</emphasis>
+ is present, keyboard state or controls are unaffected.
+</para>
+
+
+<para>
+For example, a keyboard designer may want to make the <emphasis>
+CapsLock</emphasis>
+ LED controllable only by the server, but allow the <emphasis>
+Scroll Lock</emphasis>
+ LED to be controlled by client applications. To do so, the keyboard designer
+could set the <emphasis>
+XkbIM_NoExplicit</emphasis>
+ flag for the <emphasis>
+CapsLock</emphasis>
+<emphasis>
+ </emphasis>
+LED, but not set it for the <emphasis>
+Scroll Lock</emphasis>
+ LED. Or the keyboard designer may wish to allow the <emphasis>
+CapsLock</emphasis>
+ LED to be controlled by both the server and client applications and also have
+the server to automatically change the <emphasis>
+CapsLock</emphasis>
+<emphasis>
+ </emphasis>
+modifier state whenever a client application changes the <emphasis>
+CapsLock</emphasis>
+ LED. To do so, the keyboard designer would not set the <emphasis>
+XkbIM_NoExplicit</emphasis>
+ flag, but would instead set the <emphasis>
+XkbIM_LEDDrivesKB</emphasis>
+ flag.
+</para>
+
+<para>
+The remaining fields in the indicator map specify the conditions under which
+Xkb automatically turns an indicator on or off (only if <emphasis>
+XkbIM_NoAutomatic</emphasis>
+ is not set). If these conditions match the keyboard state, Xkb turns the
+indicator on. If the conditions do not match, Xkb turns the indicator off.
+</para>
+
+</sect3>
+
+<sect3 id='XkbIndicatorMapRec_which_groups_and_groups_fields'>
+<title>XkbIndicatorMapRec which_groups and groups fields</title>
+
+<para>
+The <emphasis>
+which_groups</emphasis>
+ and the <emphasis>
+groups</emphasis>
+ fields of an indicator map determine how the keyboard group state affects the
+corresponding indicator. The <emphasis>
+which_groups</emphasis>
+ field controls the interpretation of <emphasis>
+groups</emphasis>
+ and may contain any one of the following values:
+</para>
+
+<para><programlisting>
+#define XkbIM_UseNone             0
+#define XkbIM_UseBase             (1L &lt;&lt; 0)
+#define XkbIM_UseLatched          (1L &lt;&lt; 1)
+#define XkbIM_UseLocked           (1L &lt;&lt; 2)
+#define XkbIM_UseEffective        (1L &lt;&lt; 3)
+#define XkbIM_UseAnyGroup         XkbIM_UseLatched | XkbIM_UseLocked |
+                                  XkbIM_UseEffective
+</programlisting></para>
+
+<para>
+The <emphasis>
+groups </emphasis>
+field specifies what keyboard groups an indicator watches and is the bitwise
+inclusive OR of the following valid values:
+</para>
+
+<para><programlisting>
+#define XkbGroup1Mask            (1&lt;&lt;0)
+#define XkbGroup2Mask            (1&lt;&lt;1)
+#define XkbGroup3Mask            (1&lt;&lt;2)
+#define XkbGroup4Mask            (1&lt;&lt;3)
+#define XkbAnyGroupMask          (1&lt;&lt;7)
+#define XkbAllGroupsMask         (0xf)
+</programlisting></para>
+
+<para>
+If <emphasis>
+XkbIM_NoAutomatic</emphasis>
+ is not set (the keyboard drives the indicator), the effect of <emphasis>
+which_groups</emphasis>
+ and <emphasis>
+groups</emphasis>
+ is shown in Table 8.2. <!-- xref -->
+</para>
+
+<table frame='topbot'>
+<title>XkbIndicatorMapRec which_groups and groups, Keyboard Drives
+Indicator</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>which_groups</entry>
+  <entry>Effect</entry>
+  </row>
+</thead>
+<tbody>
+  <row>
+    <entry>XkbIM_UseNone</entry>
+    <entry>
+The <emphasis>
+groups</emphasis>
+ field and the current keyboard group state are ignored.
+    </entry>
+  </row>
+  <row>
+    <entry>XkbIM_UseBase</entry>
+    <entry>
+If <emphasis>
+groups</emphasis>
+ is nonzero, the indicator is lit whenever the base keyboard group is nonzero.
+If <emphasis>
+groups</emphasis>
+ is zero, the indicator is lit whenever the base keyboard group is zero.
+    </entry>
+  </row>
+  <row>
+    <entry>XkbIM_UseLatched</entry>
+    <entry>
+If <emphasis>
+groups</emphasis>
+ is nonzero, the indicator is lit whenever the latched keyboard group is
+nonzero. If <emphasis>
+groups</emphasis>
+ is zero, the indicator is lit whenever the latched keyboard group is zero.
+    </entry>
+  </row>
+  <row>
+    <entry>XkbIM_UseLocked</entry>
+    <entry>
+The <emphasis>
+groups</emphasis>
+ field is interpreted as a mask. The indicator is lit when the current locked
+keyboard group matches one of the bits that are set in <emphasis>
+groups</emphasis>.
+    </entry>
+  </row>
+  <row>
+    <entry>XkbIM_UseEffective</entry>
+    <entry>
+The <emphasis>
+groups</emphasis>
+ field is interpreted as a mask. The indicator is lit when the current
+effective keyboard group matches one of the bits that are set in <emphasis>
+groups</emphasis>
+.
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+The effect of <emphasis>
+which_groups</emphasis>
+ and <emphasis>
+groups</emphasis>
+ when you change an indicator for which <emphasis>
+XkbIM_LEDDrivesKB</emphasis>
+ is set (the indicator drives the keyboard) is shown in Table 8.3. The "New
+State" column refers to the new state to which you set the indicator.
+</para>
+
+<table frame='topbot'>
+<title>XkbIndicatorMapRec which_groups and groups, Indicator Drives
+Keyboard</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='3' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='2.0*'/>
+<colspec colname='c2' colwidth='1.0*'/>
+<colspec colname='c3' colwidth='3.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>which_groups</entry>
+  <entry>New State</entry>
+  <entry>Effect on Keyboard Group State</entry>
+  </row>
+</thead>
+<tbody>
+  <row>
+    <entry>XkbIM_UseNone </entry>
+    <entry>On or Off</entry>
+    <entry>No effect</entry>
+  </row>
+  <row>
+    <entry>XkbIM_UseBase</entry>
+    <entry>On or Off</entry>
+    <entry>No effect</entry>
+  </row>
+  <row>
+    <entry>XkbIM_UseLatched</entry>
+    <entry>On</entry>
+    <entry>
+The <emphasis>
+groups</emphasis>
+ field is treated as a group mask. The keyboard group latch is changed to the
+lowest numbered group specified in <emphasis>
+groups</emphasis>
+; if <emphasis>
+groups</emphasis>
+ is empty, the keyboard group latch is changed to zero.
+    </entry>
+  </row>
+  <row>
+    <entry>XkbIM_UseLatched</entry>
+    <entry>Off</entry>
+    <entry>
+The <emphasis>
+groups</emphasis>
+ field is treated as a group mask. If the indicator is explicitly extinguished,
+keyboard group latch is changed to the lowest numbered group not specified in
+<emphasis>
+groups</emphasis>
+; if <emphasis>
+groups</emphasis>
+ is zero, the keyboard group latch is set to the index of the highest legal
+keyboard group.
+    </entry>
+  </row>
+  <row>
+    <entry>XkbIM_UseLocked or XkbIM_UseEffective</entry>
+    <entry>On</entry>
+    <entry>
+If the <emphasis>
+groups</emphasis>
+ mask is empty, group is not changed; otherwise, the locked keyboard group is
+changed to the lowest numbered group specified in <emphasis>
+groups</emphasis>.
+    </entry>
+  </row>
+  <row>
+    <entry>XkbIM_UseLocked or XkbIM_UseEffective</entry>
+    <entry>Off</entry>
+    <entry>
+Locked keyboard group is changed to the lowest numbered group that is not
+specified in the <emphasis>
+groups</emphasis>
+ mask, or to <emphasis>
+Group1</emphasis>
+ if the <emphasis>
+groups</emphasis>
+ mask contains all keyboard groups.
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+</sect3>
+<sect3 id='XkbIndicatorMapRec_which_mods_and_mods_fields'>
+<title>XkbIndicatorMapRec which_mods and mods fields</title>
+
+<para>
+The <emphasis>
+mods </emphasis>
+field specifies what modifiers an indicator watches. The <emphasis>
+mods</emphasis>
+ field is an Xkb modifier definition, <emphasis>
+XkbModsRec</emphasis>
+, as described in section 7.2, which can specify both real and virtual  <!-- xref -->
+modifiers. The <emphasis>
+mods</emphasis>
+ field takes effect even if some or all of the virtual indicators specified in
+<emphasis>
+mods</emphasis>
+ are unbound. To specify the mods field, in general, assign the modifiers of
+interest to <emphasis>
+mods.real_mods</emphasis>
+ and the virtual modifiers of interest to <emphasis>
+mods.vmods</emphasis>
+. You can disregard the <emphasis>
+mods.mask</emphasis>
+ field unless your application needs to interpret the indicator map directly
+(that is, to simulate automatic indicator behavior on its own). Relatively few
+applications need to do so, but if you find it necessary, you can either read
+the indicator map back from the server after you update it (the server
+automatically updates the mask field whenever any of the real or virtual
+modifiers are changed in the modifier definition) or you can use <emphasis>
+XkbVirtualModsToReal</emphasis>
+ to determine the proper contents for the mask field, assuming that the
+<emphasis>
+XkbDescRec</emphasis>
+ contains the virtual modifier definitions.
+</para>
+
+<para>
+<emphasis>
+which_mods</emphasis>
+ specifies what criteria Xkb uses to determine a match with the corresponding
+<emphasis>
+mods</emphasis>
+ field by specifying one or more components of the Xkb keyboard state. If
+<emphasis>
+XkbIM_NoAutomatic</emphasis>
+ is not set (the keyboard drives the indicator), the indicator is lit whenever
+any of the modifiers specified in the <emphasis>
+mask</emphasis>
+ field of the<emphasis>
+ mods</emphasis>
+ modifier definition are also set in any of the current keyboard state
+components specified by <emphasis>
+which_mods</emphasis>
+. Remember that the <emphasis>
+mask</emphasis>
+ field is comprised of all of the real modifiers specified in the definition
+plus any real modifiers that are bound to the virtual modifiers specified in
+the definition. (See Chapter 5 for more information on the keyboard state and  <!-- xref -->
+Chapter 7 for more information on virtual modifiers.) Use a bitwise inclusive
+OR of the following values to compose a value for <emphasis>
+which_mods</emphasis>:
+</para>
+
+<para><programlisting>
+#define XkbIM_UseNone             0
+#define XkbIM_UseBase             (1L &lt;&lt; 0)
+#define XkbIM_UseLatched          (1L &lt;&lt; 1)
+#define XkbIM_UseLocked           (1L &lt;&lt; 2)
+#define XkbIM_UseEffective        (1L &lt;&lt; 3)
+#define XkbIM_UseCompat           (1L &lt;&lt; 4)
+#define XkbIM_UseAnyMods          XkbIM_UseBase | XkbIM_UseLatched |
+                                  XkbIM_UseLocked | XkbIM_UseEffective |
+                                  XkbIM_UseCompat
+</programlisting></para>
+
+<para>
+If <emphasis>
+XkbIM_NoAutomatic</emphasis>
+ is not set (the keyboard drives the indicator), the effect of <emphasis>
+which_mods</emphasis>
+ and <emphasis>
+mods</emphasis>
+ is shown in Table 8.4 <!-- xref -->
+</para>
+
+<table frame='topbot'>
+<title>XkbIndicatorMapRec which_mods and mods, Keyboard Drives Indicator</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>which_mods</entry>
+  <entry>Effect on Keyboard Modifiers</entry>
+  </row>
+</thead>
+<tbody>
+  <row>
+    <entry>XkbIM_UseNone</entry>
+    <entry>The mods field and the current keyboard modifier state are
+ignored.</entry>
+  </row>
+  <row>
+    <entry>XkbIM_UseBase</entry>
+    <entry>
+The indicator is lit when any of the modifiers specified in the <emphasis>
+mask</emphasis>
+ field of <emphasis>
+mods</emphasis>
+ are on in the keyboard base state. If both <emphasis>
+mods.real_mods</emphasis>
+ and <emphasis>
+mods.vmods</emphasis>
+ are zero, the indicator is lit when the base keyboard state contains no
+modifiers.
+    </entry>
+  </row>
+  <row>
+    <entry>XkbIM_UseLatched</entry>
+    <entry>
+The indicator is lit when any of the modifiers specified in the <emphasis>
+mask</emphasis>
+ field of <emphasis>
+mods</emphasis>
+ are latched. If both <emphasis>
+mods.real_mods</emphasis>
+ and <emphasis>
+mods.vmods</emphasis>
+ are zero, the indicator is lit when none of the modifier keys are latched.
+    </entry>
+  </row>
+  <row>
+    <entry>XkbIM_UseLocked</entry>
+    <entry>
+The indicator is lit when any of the modifiers specified in the <emphasis>
+mask</emphasis>
+ field of <emphasis>
+mods</emphasis>
+ are locked. If both <emphasis>
+mods.real_mods</emphasis>
+ and <emphasis>
+mods.vmods</emphasis>
+ are zero, the indicator is lit when none of the modifier keys are locked.
+    </entry>
+  </row>
+  <row>
+    <entry>XkbIM_UseEffective</entry>
+    <entry>
+The indicator is lit when any of the modifiers specified in the <emphasis>
+mask</emphasis>
+ field of <emphasis>
+mods</emphasis>
+ are in the effective keyboard state. If both <emphasis>
+mods.real_mods</emphasis>
+ and <emphasis>
+mods.vmods</emphasis>
+ are zero, the indicator is lit when the effective keyboard state contains no
+modifiers.
+    </entry>
+  </row>
+  <row>
+    <entry>XkbIM_UseCompat</entry>
+    <entry>
+The indicator is lit when any of the modifiers specified in the <emphasis>
+mask</emphasis>
+ field of <emphasis>
+mods</emphasis>
+ are in the keyboard compatibility state. If both <emphasis>
+mods.real_mods</emphasis>
+ and <emphasis>
+mods.vmods</emphasis>
+ are zero, the indicator is lit when the keyboard compatibility state contains
+no modifiers.
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+The effect on the keyboard modifiers of <emphasis>
+which_mods</emphasis>
+ and <emphasis>
+mods</emphasis>
+ when you change an indicator for which <emphasis>
+XkbIM_LEDDrivesKB</emphasis>
+ is set (the indicator drives the keyboard) is shown in Table 8.5. The "New
+State" column refers to the new state to which you set the indicator.
+</para> <!-- xref -->
+
+<table frame='topbot'>
+<title>XkbIndicatorMapRec which_mods and mods, Indicator Drives Keyboard</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='3' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='2.0*'/>
+<colspec colname='c2' colwidth='1.0*'/>
+<colspec colname='c3' colwidth='3.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>which_mods</entry>
+  <entry>New State</entry>
+  <entry>Effect on Keyboard Modifiers</entry>
+  </row>
+</thead>
+<tbody>
+  <row>
+    <entry>XkbIM_UseNone or XkbIM_UseBase</entry>
+    <entry>On or Off</entry>
+    <entry>No Effect</entry>
+  </row>
+  <row>
+    <entry>XkbIM_UseLatched</entry>
+    <entry>On</entry>
+    <entry>
+Any modifiers specified in the <emphasis>
+mask</emphasis>
+ field of <emphasis>
+mods</emphasis>
+ are added to the latched modifiers.
+    </entry>
+  </row>
+  <row>
+    <entry>XkbIM_UseLatched</entry>
+    <entry>Off</entry>
+    <entry>
+Any modifiers specified in the <emphasis>
+mask</emphasis>
+ field of <emphasis>
+mods</emphasis>
+ are removed from the latched modifiers.
+    </entry>
+  </row>
+  <row>
+    <entry>XkbIM_UseLocked, XkbIM_UseCompat, or XkbIM_UseEffective</entry>
+    <entry>On</entry>
+    <entry>
+Any modifiers specified in the <emphasis>
+mask</emphasis>
+ field of <emphasis>
+mods</emphasis>
+ are added to the locked modifiers.
+    </entry>
+  </row>
+  <row>
+    <entry>XkbIM_UseLocked</entry>
+    <entry>Off</entry>
+    <entry>
+Any modifiers specified in the <emphasis>
+mask</emphasis>
+ field of <emphasis>
+mods</emphasis>
+ are removed from the locked modifiers.
+    </entry>
+  </row>
+  <row>
+    <entry>XkbIM_UseCompat or XkbIM_UseEffective</entry>
+    <entry>Off</entry>
+    <entry>
+Any modifiers specified in the <emphasis>
+mask</emphasis>
+ field of <emphasis>
+mods</emphasis>
+ are removed from both the locked and latched modifiers.
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+</sect3>
+<sect3 id='XkbIndicatorMapRec_ctrls_field'>
+<title>XkbIndicatorMapRec ctrls field</title>
+
+<para>
+The <emphasis>
+ctrls</emphasis>
+ field specifies what controls (see Chapter 10) the indicator watches and is
+composed using the bitwise inclusive OR of the following values:
+</para> <!-- xref -->
+
+<para><programlisting>
+#define XkbRepeatKeysMask           (1L &lt;&lt; 0)
+#define XkbSlowKeysMask             (1L &lt;&lt; 1)
+#define XkbBounceKeysMask           (1L &lt;&lt; 2)
+#define XkbStickyKeysMask           (1L &lt;&lt; 3)
+#define XkbMouseKeysMask            (1L &lt;&lt; 4)
+#define XkbMouseKeysAccelMask       (1L &lt;&lt; 5)
+#define XkbAccessXKeysMask          (1L &lt;&lt; 6)
+#define XkbAccessXTimeoutMask       (1L &lt;&lt; 7)
+#define XkbAccessXFeedbackMask      (1L &lt;&lt; 8)
+#define XkbAudibleBellMask          (1L &lt;&lt; 9)
+#define XkbOverlay1Mask             (1L &lt;&lt; 10)
+#define XkbOverlay2Mask             (1L &lt;&lt; 11)
+#define XkbAllBooleanCtrlsMask      (0x00001FFF)
+</programlisting></para>
+
+<para>
+Xkb lights the indicator whenever any of the boolean controls specified in
+<emphasis>
+ctrls</emphasis>
+ is enabled.
+</para>
+
+
+</sect3>
+</sect2>
+</sect1>
+<sect1 id='Getting_Information_About_Indicators'>
+<title>Getting Information About Indicators</title>
+
+<para>
+Xkb allows applications to obtain information about indicators using two
+different methods. The first method, which is similar to the core X
+implementation, uses a mask to specify the indicators. The second method, which
+is more suitable for applications concerned with interoperability, uses
+indicator names. The correspondence between the indicator name and the bit
+position in masks is as follows: one of the parameters returned from <emphasis>
+XkbGetNamedIndicators</emphasis>
+ is an index that is the bit position to use in any function call that requires
+a mask of indicator bits, as well as the indicator’s index into the <emphasis>
+XkbIndicatorRec</emphasis>
+ array of indicator maps.
+</para>
+
+
+<sect2 id='Getting_Indicator_State'>
+<title>Getting Indicator State</title>
+
+<para>
+Because the state of the indicators is relatively volatile, the keyboard
+description does not hold the current state of the indicators. To obtain the
+current state of the keyboard indicators, use <emphasis>
+XkbGetIndicatorState</emphasis>.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbGetIndicatorState</emphasis>
+(<emphasis>
+display</emphasis>
+, <emphasis>
+device_spec</emphasis>
+, <emphasis>
+state_return</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *      <emphasis>
+display</emphasis>
+;            /* connection to the X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+device_spec</emphasis>
+;            /* device ID, or <emphasis>
+XkbUseCoreKbd</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int *      <emphasis>
+state_return</emphasis>
+;            /* backfilled with a mask of the indicator state */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetIndicatorState</emphasis>
+ queries the <emphasis>
+display</emphasis>
+ for the state of the indicators on the device specified by the <emphasis>
+device_spec</emphasis>
+. For each indicator that is "turned on" on the device, the associated bit is
+set in <emphasis>
+state_return</emphasis>
+. If a compatible version of the Xkb extension is not available in the server,
+<emphasis>
+XkbGetIndicatorState</emphasis>
+ returns a <emphasis>
+BadMatch</emphasis>
+ error. Otherwise, it sends the request to the X server, places the state of
+the indicators into <emphasis>
+state_return,</emphasis>
+ and returns <emphasis>
+Success</emphasis>
+. Thus the value reported by <emphasis>
+XkbGetIndicatorState</emphasis>
+ is identical to the value reported by the core protocol.
+</para>
+
+
+</sect2>
+<sect2 id='Getting_Indicator_Information_by_Index'>
+<title>Getting Indicator Information by Index</title>
+
+<para>
+To get the map for one or more indicators, using a mask to specify the
+indicators, use <emphasis>
+XkbGetIndicatorMap</emphasis>.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbGetIndicatorMap</emphasis>
+(<emphasis>
+dpy</emphasis>
+,<emphasis>
+ which</emphasis>
+,<emphasis>
+ desc</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *      <emphasis>
+dpy</emphasis>
+;      /* connection to the X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+which</emphasis>
+;      /* mask of indicators for which maps should be returned */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr      <emphasis>
+desc</emphasis>
+;      /* keyboard description to be updated */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetIndicatorMap</emphasis>
+ obtains the maps from the server for only those indicators specified by the
+<emphasis>
+which</emphasis>
+ mask and copies the values into the keyboard description specified by
+<emphasis>
+desc</emphasis>
+. If the <emphasis>
+indicators</emphasis>
+ field of the <emphasis>
+desc</emphasis>
+ parameter is <emphasis>
+NULL</emphasis>
+, <emphasis>
+XkbGetIndicatorMap</emphasis>
+ allocates and initializes it.
+</para>
+
+
+<para>
+<emphasis>
+XkbGetIndicatorMap</emphasis>
+ can generate <emphasis>
+BadAlloc</emphasis>
+, <emphasis>
+BadLength</emphasis>
+, <emphasis>
+BadMatch</emphasis>
+, and <emphasis>
+BadImplementation</emphasis>
+ errors.
+</para>
+
+
+<para>
+To free the indicator maps, use <emphasis>
+XkbFreeIndicatorMaps</emphasis>
+ (see section 8.6).
+</para>
+
+
+</sect2>
+<sect2 id='Getting_Indicator_Information_by_Name'>
+<title>Getting Indicator Information by Name</title>
+
+<para>
+Xkb also allows applications to refer to indicators by name. Use <emphasis>
+XkbGetNames</emphasis>
+ to get the indicator names (see Chapter 18). Using names eliminates the need
+for hard-coding bitmask values for particular keyboards. For example, instead
+of using vendor-specific constants such as <emphasis>
+WSKBLed_ScrollLock</emphasis>
+ mask on Digital workstations or <emphasis>
+XLED_SCROLL_LOCK</emphasis>
+ on Sun workstations, you can instead use <emphasis>
+XkbGetNamedIndicator</emphasis>
+ to look up information on the indicator named "Scroll Lock."
+</para>
+
+<para>
+Use <emphasis>
+XkbGetNamedIndicator</emphasis>
+ to look up the indicator map and other information for an indicator by name.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbGetNamedIndicator</emphasis>
+(<emphasis>
+dpy</emphasis>
+,<emphasis>
+ dev_spec</emphasis>
+,<emphasis>
+ name</emphasis>
+,<emphasis>
+ ndx_rtrn</emphasis>
+,<emphasis>
+ state_rtrn</emphasis>
+,<emphasis>
+ map_rtrn</emphasis>
+, <emphasis>
+real_rtrn</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *            <emphasis>
+dpy</emphasis>
+;            /* connection to the X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+      device_spec</emphasis>
+;            /* keyboard device ID, or <emphasis>
+XkbUseCoreKbd</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Atom      <emphasis>
+      name</emphasis>
+;            /* name of the indicator to be retrieved */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int *            <emphasis>
+ndx_rtrn</emphasis>
+;            /* backfilled with the index of the retrieved indicator */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool *            <emphasis>
+state_rtrn</emphasis>
+;            /* backfilled with the current state of the retrieved indicator */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbIndicatorMapPtr      <emphasis>
+      map_rtrn</emphasis>
+;            /* backfilled with the mapping for the retrieved indicator */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool *            <emphasis>
+real_rtrn</emphasis>
+;            /* backfilled with <emphasis>
+True</emphasis>
+ if the named indicator is real (physical) */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+If the device specified by <emphasis>
+device_spec</emphasis>
+ has an indicator named <emphasis>
+name</emphasis>
+,<emphasis>
+ XkbGetNamedIndicator</emphasis>
+ returns <emphasis>
+True</emphasis>
+ and populates the rest of the parameters with information about the indicator.
+Otherwise, <emphasis>
+XkbGetNamedIndicator</emphasis>
+ returns <emphasis>
+False</emphasis>
+.
+</para>
+
+
+<para>
+The <emphasis>
+ndx_rtrn</emphasis>
+ field returns the zero-based index of the named indicator. This index is the
+bit position to use in any function call that requires a mask of indicator
+bits, as well as the indicator’s index into the <emphasis>
+XkbIndicatorRec</emphasis>
+ array of indicator maps. <emphasis>
+state_rtrn</emphasis>
+ returns the current state of the named indicator (<emphasis>
+True</emphasis>
+ = on, <emphasis>
+False</emphasis>
+ = off). <emphasis>
+map_rtrn</emphasis>
+ returns the indicator map for the named indicator. In addition, if the
+indicator is mapped to a physical LED, the <emphasis>
+real_rtrn</emphasis>
+ parameter is set to <emphasis>
+True</emphasis>
+.
+</para>
+
+
+<para>
+Each of the "<emphasis>
+_rtrn</emphasis>
+" arguments is optional; you can pass <emphasis>
+NULL</emphasis>
+ for any unneeded "<emphasis>
+_rtrn</emphasis>
+" arguments.
+</para>
+
+
+<para>
+<emphasis>
+XkbGetNamedIndicator</emphasis>
+ can generate <emphasis>
+BadAtom</emphasis>
+ and <emphasis>
+BadImplementation</emphasis>
+ errors.
+</para>
+
+
+</sect2>
+</sect1>
+<sect1 id='Changing_Indicator_Maps_and_State'>
+<title>Changing Indicator Maps and State</title>
+
+<para>
+Just as you can get the indicator map using a mask or using an indicator name,
+so you can change it using a mask or a name.
+</para>
+
+<note><para>You cannot change the <emphasis>
+phys_indicators</emphasis>
+ field of the indicators structure. The only way to change the <emphasis>
+phys_indicators</emphasis>
+ field is to change the keyboard map.</para></note>
+
+<para>
+There are two ways to make changes to indicator maps and state: either change a
+local copy of the indicator maps and use <emphasis>
+XkbSetIndicatorMap</emphasis>
+ or <emphasis>
+XkbSetNamedIndicator</emphasis>
+, or, to reduce network traffic, use an<emphasis>
+ XkbIndicatorChangesRec</emphasis>
+ structure and use <emphasis>
+XkbChangeIndicators</emphasis>.
+</para>
+
+
+<sect2 id='Effects_of_Explicit_Changes_on_Indicators'>
+<title>Effects of Explicit Changes on Indicators</title>
+
+<para>
+This section discusses the effects of explicitly changing indicators depending
+upon different settings in the indicator map. See Tables 8.3 and Table 8.5 for
+information on the effects of the indicator map fields when explicit changes
+are made.
+</para>
+
+
+<para>
+If <emphasis>
+XkbIM_LEDDrivesKB</emphasis>
+ is set and <emphasis>
+XkbIM_NoExplicit</emphasis>
+ is not, and if you call a function that updates the server’s image of the
+indicator map (such as <emphasis>
+XkbSetIndicatorMap</emphasis>
+ or <emphasis>
+XkbSetNamedIndicator</emphasis>
+), Xkb changes the keyboard state and controls to reflect the other fields of
+the indicator map. If you attempt to explicitly change the value of an
+indicator for which <emphasis>
+XkbIM_LEDDrivesKB</emphasis>
+ is absent or for which <emphasis>
+XkbIM_NoExplicit</emphasis>
+ is present, keyboard state or controls are unaffected.
+</para>
+
+
+<para>
+If neither <emphasis>
+XkbIM_NoAutomatic</emphasis>
+ nor <emphasis>
+XkbIM_NoExplicit</emphasis>
+ is set in an indicator map, Xkb honors any request to change the state of the
+indicator, but the new state might be immediately superseded by automatic
+changes to the indicator state if the keyboard state or controls change.
+</para>
+
+
+<para>
+The effects of changing an indicator that drives the keyboard are cumulative;
+it is possible for a single change to affect keyboard group, modifiers, and
+controls simultaneously.
+</para>
+
+
+<para>
+If you change an indicator for which both the <emphasis>
+XkbIM_LEDDrivesKB</emphasis>
+ and <emphasis>
+XkbIM_NoAutomatic</emphasis>
+ flags are specified, Xkb applies the keyboard changes specified in the other
+indicator map fields and changes the indicator to reflect the state that was
+explicitly requested. The indicator remains in the new state until it is
+explicitly changed again.
+</para>
+
+
+<para>
+If the <emphasis>
+XkbIM_NoAutomatic</emphasis>
+ flag is not set and <emphasis>
+XkbIM_LEDDrivesKB</emphasis>
+ is set, Xkb applies the changes specified in the other indicator map fields
+and sets the state of the indicator to the values specified by the indicator
+map. Note that it is possible in this case for the indicator to end up in a
+different state than the one that was explicitly requested. For example, Xkb
+does not extinguish an indicator with <emphasis>
+which_mods</emphasis>
+ of <emphasis>
+XkbIM_UseBase</emphasis>
+ and <emphasis>
+mods</emphasis>
+ of <emphasis>
+Shift</emphasis>
+ if, at the time Xkb processes the request to extinguish the indicator, one of
+the <emphasis>
+Shift</emphasis>
+ keys is physically depressed.
+</para>
+
+
+<para>
+If you explicitly light an indicator for which <emphasis>
+XkbIM_LEDDrivesKB</emphasis>
+ is set, Xkb enables all of the boolean controls specified in the <emphasis>
+ctrls</emphasis>
+ field of its indicator map. Explicitly extinguishing such an indicator causes
+Xkb to disable all of the boolean controls specified in <emphasis>
+ctrls</emphasis>
+.
+</para>
+
+
+</sect2>
+<sect2 id='Changing_Indicator_Maps_by_Index'>
+<title>Changing Indicator Maps by Index</title>
+
+<para>
+To update the maps for one or more indicators, first modify a local copy of the
+keyboard description, then use <emphasis>
+XkbSetIndicatorMap</emphasis>
+ to download the changes to the server:
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool<emphasis>
+ XkbSetIndicatorMap</emphasis>
+(<emphasis>
+dpy</emphasis>
+,<emphasis>
+ which</emphasis>
+,<emphasis>
+ desc</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *      <emphasis>
+dpy</emphasis>
+;      /* connection to the X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+which</emphasis>
+;      /* mask of indicators to change */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr      <emphasis>
+desc</emphasis>
+;      /* keyboard description from which the maps are taken */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+For each<emphasis>
+ </emphasis>
+bit set in the <emphasis>
+which </emphasis>
+parameter,<emphasis>
+ XkbSetIndicatorMap</emphasis>
+ sends the corresponding indicator map from the <emphasis>
+desc</emphasis>
+ parameter to the server.
+</para>
+
+
+</sect2>
+<sect2 id='Changing_Indicator_Maps_by_Name'>
+<title>Changing Indicator Maps by Name</title>
+
+<para>
+<emphasis>
+XkbSetNamedIndicator</emphasis>
+ can do several related things:
+</para>
+
+<itemizedlist>
+<listitem>
+  <para>
+Name an indicator if it is not already named
+  </para>
+</listitem>
+<listitem>
+  <para>
+Toggle the state of the indicator
+  </para>
+</listitem>
+<listitem>
+  <para>
+Set the indicator to a specified state
+  </para>
+</listitem>
+<listitem>
+  <para>
+Set the indicator map for the indicator
+  </para>
+</listitem>
+</itemizedlist>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool<emphasis>
+ XkbSetNamedIndicator</emphasis>
+(<emphasis>
+dpy</emphasis>
+,<emphasis>
+ device_spec</emphasis>
+,<emphasis>
+ name</emphasis>
+,<emphasis>
+ change_state, state</emphasis>
+,<emphasis>
+ create_new</emphasis>
+,<emphasis>
+ map</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *      <emphasis>
+      dpy</emphasis>
+;            /* connection to the X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+      device_spec</emphasis>
+;            /* device ID, or <emphasis>
+XkbUseCoreKbd</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Atom      <emphasis>
+      name</emphasis>
+;            /* name of the indicator to change */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool      <emphasis>
+      change_state</emphasis>
+;            /* whether to change the indicator state or not */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool      <emphasis>
+      state</emphasis>
+;            /* desired new state for the indicator */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool            <emphasis>
+create_new</emphasis>
+;            /* whether a new indicator with the specified name should be
+created when necessary */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbIndicatorMapPtr            <emphasis>
+map</emphasis>
+;            /* new map for the indicator */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+If a compatible version of the Xkb extension is not available in the server,
+<emphasis>
+XkbSetNamedIndicator</emphasis>
+ returns <emphasis>
+False</emphasis>
+. Otherwise, it sends a request to the X server to change the indicator
+specified by <emphasis>
+name</emphasis>
+ and returns <emphasis>
+True</emphasis>.
+</para>
+
+
+<para>
+If <emphasis>
+change_state</emphasis>
+ is <emphasis>
+True</emphasis>
+, and the optional parameter, <emphasis>
+state</emphasis>
+, is not <emphasis>
+NULL</emphasis>
+, <emphasis>
+XkbSetNamedIndicator</emphasis>
+ tells the server to change the state of the named indicator to the value
+specified by <emphasis>
+state</emphasis>.
+</para>
+
+
+<para>
+If an indicator with the name specified by <emphasis>
+name</emphasis>
+ does not already exist, the <emphasis>
+create_new</emphasis>
+ parameter tells the server whether it should create a new named indicator. If
+<emphasis>
+create_new</emphasis>
+ is <emphasis>
+True</emphasis>
+, the server finds the first indicator that doesn’t have a name and gives it
+the name specified by <emphasis>
+name</emphasis>.
+</para>
+
+
+<para>
+If the optional parameter, <emphasis>
+map</emphasis>
+, is not <emphasis>
+NULL</emphasis>
+, <emphasis>
+XkbSetNamedIndicator</emphasis>
+ tells the server to change the indicator’s map to the values specified
+in <emphasis>map</emphasis>.
+</para>
+
+<para>
+<emphasis>
+XkbSetNamedIndicator</emphasis>
+ can generate <emphasis>
+BadAtom</emphasis>
+ and <emphasis>
+BadImplementation</emphasis>
+ errors. In addition, it can also generate <emphasis>
+XkbIndicatorStateNotify</emphasis>
+ (see section 8.5), <emphasis> <!-- xref -->
+XkbIndicatorMapNotify</emphasis>
+, and <emphasis>
+XkbNamesNotify</emphasis>
+ events (see section 18.5). <!-- xref -->
+</para>
+
+
+</sect2>
+<sect2 id='The_XkbIndicatorChangesRec_Structure'>
+<title>The XkbIndicatorChangesRec Structure</title>
+
+<para>
+The <emphasis>
+XkbIndicatorChangesRec</emphasis>
+ identifies small modifications to the indicator map. Use it with the function
+<emphasis>
+XkbChangeIndicators</emphasis>
+ to reduce the amount of traffic sent to the server.
+</para>
+
+<para><programlisting>
+typedef struct _XkbIndicatorChanges {
+      unsigned int             state_changes;
+      unsigned int             map_changes;
+}<emphasis>
+XkbIndicatorChangesRec</emphasis>,*XkbIndicatorChangesPtr;
+</programlisting></para>
+
+<para>
+The <emphasis>
+state_changes</emphasis>
+ field is a mask that specifies the indicators that have changed state, and
+<emphasis>
+map_changes</emphasis>
+ is a mask that specifies the indicators whose maps have changed.
+</para>
+
+
+<para>
+To change indicator maps or state without passing the entire keyboard
+description, use <emphasis>
+XkbChangeIndicators</emphasis>
+.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbChangeIndicators</emphasis>
+(<emphasis>
+dpy, xkb, changes, state</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *                  <emphasis>
+dpy</emphasis>
+;      /* connection to the X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr                  <emphasis>
+xkb</emphasis>
+;      /* keyboard description from which names are to be
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+                        taken. */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbIndicatorChangesPtr                  <emphasis>
+changes</emphasis>
+;      /* indicators to be updated on the server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int                  <emphasis>
+state</emphasis>
+;      /* new state of indicators listed in
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+<emphasis>
+                        changes</emphasis>
+-&gt;<emphasis>
+state_changes</emphasis>
+ */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbChangeIndicators</emphasis>
+ copies any maps specified by <emphasis>
+changes</emphasis>
+ from the keyboard description, <emphasis>
+xkb</emphasis>
+, to the server specified by <emphasis>
+dpy</emphasis>
+. If any bits are set in the <emphasis>
+state_changes</emphasis>
+ field of <emphasis>
+changes</emphasis>
+, <emphasis>
+XkbChangeIndicators</emphasis>
+ also sets the state of those indicators to the values specified in the
+<emphasis>
+state</emphasis>
+ mask. A 1 bit in <emphasis>
+state</emphasis>
+ turns the corresponding indicator on, a 0 bit turns it off.
+</para>
+
+
+<para>
+<emphasis>
+XkbChangeIndicator</emphasis>
+s can generate <emphasis>
+BadAtom</emphasis>
+ and <emphasis>
+BadImplementation</emphasis>
+ errors. In addition, it can also generate <emphasis>
+XkbIndicatorStateNotify</emphasis>
+ and <emphasis>
+XkbIndicatorMapNotify</emphasis>
+ events (see section 8.5). <!-- xref -->
+</para>
+
+
+</sect2>
+</sect1>
+<sect1 id='Tracking_Changes_to_Indicator_State_or_Map'>
+<title>Tracking Changes to Indicator State or Map</title>
+
+<para>
+Whenever an indicator changes state, the server sends <emphasis>
+XkbIndicatorStateNotify</emphasis>
+ events to all interested clients. Similarly, whenever an indicator’s map
+changes, the server sends <emphasis>
+XkbIndicatorMapNotify</emphasis>
+ events to all interested clients.
+</para>
+
+
+<para>
+To receive <emphasis>
+XkbIndicatorStateNotify</emphasis>
+ events, use <emphasis>
+XkbSelectEvents</emphasis>
+ (see section 4.3) with both the <emphasis> <!-- xref -->
+bits_to_change </emphasis>
+and<emphasis>
+ values_for_bits</emphasis>
+ parameters containing <emphasis>
+XkbIndicatorStateNotifyMask</emphasis>
+. To receive <emphasis>
+XkbIndicatorMapNotify</emphasis>
+ events, use <emphasis>
+XkbSelectEvents</emphasis>
+ with <emphasis>
+XkbIndicatorMapNotifyMask</emphasis>
+.
+</para>
+
+
+<para>
+To receive events for only specific indicators, use <emphasis>
+XkbSelectEventDetails</emphasis>
+. Set the <emphasis>
+event_type</emphasis>
+ parameter<emphasis>
+ to XkbIndicatorStateNotify</emphasis>
+ or <emphasis>
+XkbIndicatorMapNotify</emphasis>
+, and set both the <emphasis>
+bits_to_change </emphasis>
+and<emphasis>
+ values_for_bits</emphasis>
+ detail parameters to a mask where each bit specifies one indicator, turning on
+those bits that specify the indicators for which you want to receive events.
+</para>
+
+
+<para>
+Both types of indicator events use the same structure:
+</para>
+
+<para><programlisting>
+typedef struct _XkbIndicatorNotify {
+      int            type;        /* Xkb extension base event code */
+      unsigned long  serial;      /* X server serial number for event */
+      Bool           send_event;  /* <emphasis> True</emphasis> =&gt; synthetically generated */
+      Display *      display;     /* server connection where event generated */
+      Time           time;        /* server time when event generated */
+      int            xkb_type;    /* specifies state or map notify */
+      int            device;      /* Xkb device ID, will not be <emphasis> XkbUseCoreKbd</emphasis> */
+      unsigned int   changed;     /* mask of indicators with new state or map */
+      unsigned int   state;       /* current state of all indicators */
+} <emphasis>XkbIndicatorNotifyEvent</emphasis>;
+</programlisting></para>
+
+<para>
+<emphasis>
+xkb_type</emphasis>
+ is either <emphasis>
+XkbIndicatorStateNotify</emphasis>
+ or <emphasis>
+XkbIndicatorMapNotify</emphasis>
+, depending on whether the event is a <emphasis>
+kbIndicatorStateNotify</emphasis>
+ event or <emphasis>
+kbIndicatorMapNotify</emphasis>
+ event.
+</para>
+
+<para>
+The <emphasis>
+changed</emphasis>
+ parameter is a mask that is the bitwise inclusive OR of the indicators that
+have changed. If the event is of type <emphasis>
+XkbIndicatorMapNotify</emphasis>
+, <emphasis>
+changed</emphasis>
+ reports the maps that changed. If the event is of type <emphasis>
+XkbIndicatorStateNotify</emphasis>
+, <emphasis>
+changed</emphasis>
+ reports the indicators that have changed state. <emphasis>
+state</emphasis>
+ is a mask that specifies the current state of all indicators, whether they
+have changed or not, for both <emphasis>
+XkbIndicatorStateNotify</emphasis>
+ and <emphasis>IndicatorMapNotify</emphasis> events.
+</para>
+
+<para>
+When your client application receives either a <emphasis>
+XkbIndicatorStateNotify</emphasis>
+ event or <emphasis>
+XkbIndicatorMapNotify</emphasis>
+ event, you can note the changes in a changes structure by calling <emphasis>
+XkbNoteIndicatorChanges</emphasis>.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbNoteIndicatorChanges</emphasis>
+(<emphasis>
+old</emphasis>
+,<emphasis>
+ new</emphasis>
+,<emphasis>
+ wanted</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbIndicatorChangesPtr            <emphasis>
+      old</emphasis>
+;      /* XkbIndicatorChanges structure to be updated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbIndicatorNotifyEvent *                  <emphasis>
+new</emphasis>
+;      /* event from which changes are to be copied */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+      wanted</emphasis>
+;      /* which changes are to be noted */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+The <emphasis>
+wanted</emphasis>
+ parameter is the bitwise inclusive OR of <emphasis>
+XkbIndicatorMapMask</emphasis>
+ and <emphasis>
+XkbIndicatorStateMask</emphasis>
+. <emphasis>
+XkbNoteIndicatorChanges</emphasis>
+ copies any changes reported in <emphasis>
+new</emphasis>
+ and specified in <emphasis>
+wanted</emphasis>
+ into the changes record specified by <emphasis>
+old</emphasis>.
+</para>
+
+
+<para>
+To update a local copy of the keyboard description with the actual values, pass
+the results of one or more calls to <emphasis>
+XkbNoteIndicatorChanges</emphasis>
+ to <emphasis>
+XkbGetIndicatorChanges</emphasis>:
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbGetIndicatorChanges</emphasis>
+(<emphasis>
+dpy</emphasis>
+,<emphasis>
+ xkb</emphasis>
+,<emphasis>
+ changes</emphasis>
+,<emphasis>
+ state</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *            <emphasis>
+dpy</emphasis>
+;            /* connection to the X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr            <emphasis>
+xkb</emphasis>
+;            /* keyboard description to hold the new values */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbIndicatorChangesPtr            <emphasis>
+changes</emphasis>
+;            /* indicator maps/state to be obtained from the server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int *            <emphasis>
+state</emphasis>
+;            /* backfilled with the state of the indicators */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetIndicatorChanges</emphasis>
+ examines the <emphasis>
+changes</emphasis>
+ parameter, pulls over the necessary information from the server, and copies
+the results into the <emphasis>
+xkb</emphasis>
+ keyboard description. If any bits are set in the <emphasis>
+state_changes</emphasis>
+ field of <emphasis>
+changes</emphasis>
+, <emphasis>
+XkbGetIndicatorChanges</emphasis>
+ also places the state of those indicators in <emphasis>
+state</emphasis>
+. If the <emphasis>
+indicators</emphasis>
+ field of <emphasis>
+xkb</emphasis>
+ is <emphasis>
+NULL</emphasis>
+, <emphasis>
+XkbGetIndicatorChanges</emphasis>
+ allocates and initializes it. To free the <emphasis>
+indicators</emphasis>
+ field, use <emphasis>
+XkbFreeIndicators</emphasis>
+ (see section 8.6). <!-- xref -->
+</para>
+
+
+<para>
+<emphasis>
+XkbGetIndicatorChanges</emphasis>
+ can generate <emphasis>
+BadAlloc</emphasis>
+, <emphasis>
+BadImplementation,</emphasis>
+ and <emphasis>
+BadMatch</emphasis>
+ errors.
+</para>
+
+
+</sect1>
+<sect1 id='Allocating_and_Freeing_Indicator_Maps'>
+<title>Allocating and Freeing Indicator Maps</title>
+
+<para>
+Most applications do not need to directly allocate the <emphasis>
+indicators</emphasis>
+ member of the keyboard description record (the keyboard description record is
+described in Chapter 6). If the need arises, however, use <emphasis>
+XkbAllocIndicatorMaps.</emphasis>
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbAllocIndicatorMaps</emphasis>
+(<emphasis>
+xkb</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr      <emphasis>
+xkb</emphasis>
+;      /* keyboard description structure */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+The <emphasis>
+xkb</emphasis>
+ parameter must point to a valid keyboard description. If it doesn’t,
+<emphasis>
+XkbAllocIndicatorMaps</emphasis>
+ returns a <emphasis>
+BadMatch</emphasis>
+ error. Otherwise, <emphasis>
+XkbAllocIndicatorMaps</emphasis>
+ allocates and initializes the <emphasis>
+indicators</emphasis>
+ member of the keyboard description record and returns <emphasis>
+Success</emphasis>
+. If <emphasis>
+XkbAllocIndicatorMaps</emphasis>
+ was unable to allocate the indicators record, it reports a Bad<emphasis>
+Alloc</emphasis>
+ error.
+</para>
+
+<para>
+To free memory used by the <emphasis>
+indicators</emphasis>
+ member of an <emphasis>
+XkbDescRec</emphasis>
+ structure, use <emphasis>
+XkbFreeIndicatorMaps.</emphasis>
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbFreeIndicatorMaps</emphasis>
+(<emphasis>
+xkb</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr      <emphasis>
+xkb</emphasis>
+;      /* keyboard description structure */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+If the <emphasis>indicators</emphasis>
+ member of the keyboard description record
+pointed to by <emphasis>xkb</emphasis>
+is not <emphasis>NULL</emphasis>
+, <emphasis>XkbFreeIndicatorMaps</emphasis>
+frees the memory associated with
+the <emphasis>indicators</emphasis>
+member of <emphasis>xkb</emphasis>.
+</para>
+
+</sect1>
+</chapter>
diff --git a/specs/XKB/ch09.xml b/specs/XKB/ch09.xml
new file mode 100644 (file)
index 0000000..3f14eed
--- /dev/null
@@ -0,0 +1,1068 @@
+<chapter id='Bells'>
+<title>Bells</title>
+
+<para>
+The core X protocol allows only applications to explicitly sound the system
+bell with a given duration, pitch, and volume. Xkb extends this capability by
+allowing clients to attach symbolic names to bells, disable audible bells, and
+receive an event whenever the keyboard bell is rung. For the purposes of this
+document, the <emphasis>
+audible</emphasis>
+ bell is defined to be the system bell, or the default keyboard bell, as
+opposed to any other audible sound generated elsewhere in the system.
+</para>
+
+
+<para>
+You can ask to receive <emphasis>
+XkbBellNotify</emphasis>
+ events (see section 9.4) when any client rings any one of the following: <!-- xref -->
+</para>
+
+<itemizedlist>
+<listitem>
+  <para>
+The default bell
+  </para>
+</listitem>
+<listitem>
+  <para>
+Any bell on an input device that can be specified by a <emphasis>
+bell_class</emphasis>
+ and <emphasis>
+bell_id</emphasis>
+ pair
+  </para>
+</listitem>
+<listitem>
+  <para>
+Any bell specified only by an arbitrary name. (This is, from the server’s
+point of view, merely a name, and not connected with any physical
+sound-generating device. Some client application must generate the sound, or
+visual feedback, if any, that is associated with the name.)
+  </para>
+</listitem>
+</itemizedlist>
+
+<para>
+You can also ask to receive <emphasis>
+XkbBellNotify</emphasis>
+ events when the server rings the default bell or if any client has requested
+events only (without the bell sounding) for any of the bell types previously
+listed.
+</para>
+
+<para>
+You can disable audible bells on a global basis (to set the <emphasis>
+AudibleBell</emphasis>
+ control, see Chapter 10). For example, a client that replaces the keyboard
+bell with some other audible cue might want to turn off the <emphasis>
+AudibleBell</emphasis>
+ control to prevent the server from also generating a sound and avoid
+cacophony. If you disable audible bells and request to receive <emphasis>
+XkbBellNotify</emphasis>
+ events, you can generate feedback different from the default bell.
+</para>
+
+
+<para>
+You can, however, override the <emphasis>
+AudibleBell</emphasis>
+ control by calling one of the functions that force the ringing of a bell in
+spite of the setting of the <emphasis>
+AudibleBell</emphasis>
+ control — <emphasis>
+XkbForceDeviceBell</emphasis>
+ or <emphasis>
+XkbForceBell</emphasis>
+ (see section 9.3.3). In this case the server does not generate a bell event. <!-- xref -->
+</para>
+
+
+<para>
+Just as some keyboards can produce keyclicks to indicate when a key is pressed
+or repeating, Xkb can provide feedback for the controls by using special beep
+codes. The <emphasis>
+AccessXFeedback</emphasis>
+ control is used to configure the specific types of operations that generate
+feedback. See section 10.6.3 for a discussion on <emphasis> <!-- xref -->
+AccessXFeedback</emphasis>
+ control.
+</para>
+
+<para>
+This chapter describes bell names, the functions used to generate named bells,
+and the events the server generates for bells.
+</para>
+
+<sect1 id='Bell_Names'>
+<title>Bell Names</title>
+
+<para>
+You can associate a name to an act of ringing a bell by converting the name to
+an Atom and then using this name when you call the functions listed in this
+chapter. If an event is generated as a result, the name is then passed to all
+other clients interested in receiving <emphasis>
+XkbBellNotify</emphasis>
+ events. Note that these are arbitrary names and that there is no binding to
+any sounds. Any sounds or other effects (such as visual bells on the screen)
+must be generated by a client application upon receipt of the bell event
+containing the name. There is no default name for the default keyboard bell.
+The server does generate some predefined bells for the AccessX controls (see
+section 10.6.3). These named bells are shown in Table 9.1; the name is included
+in any bell event sent to clients that have requested to receive <emphasis>
+XkbBellNotify</emphasis>
+ events.
+</para>
+
+<table frame='topbot'>
+<title>Predefined Bells</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='1.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Action</entry>
+  <entry>Named Bell</entry>
+</row>
+</thead>
+<tbody>
+<row>
+    <entry>Indicator turned on</entry>
+    <entry>AX_IndicatorOn</entry>
+</row>
+<row>
+    <entry>Indicator turned off</entry>
+    <entry>AX_IndicatorOff</entry>
+</row>
+<row>
+    <entry>More than one indicator changed state</entry>
+    <entry>AX_IndicatorChange</entry>
+</row>
+<row>
+    <entry>Control turned on</entry>
+    <entry>AX_FeatureOn</entry>
+</row>
+<row>
+    <entry>Control turned off</entry>
+    <entry>AX_FeatureOff</entry>
+</row>
+<row>
+    <entry>More than one control changed state</entry>
+    <entry>AX_FeatureChange</entry>
+</row>
+<row>
+    <entry>SlowKeys and BounceKeys about to be turned on or off</entry>
+    <entry>AX_SlowKeysWarning</entry>
+</row>
+<row>
+    <entry>SlowKeys key pressed</entry>
+    <entry>AX_SlowKeyPress</entry>
+</row>
+<row>
+    <entry>SlowKeys key accepted</entry>
+    <entry>AX_SlowKeyAccept</entry>
+</row>
+<row>
+    <entry>SlowKeys key rejected</entry>
+    <entry>AX_SlowKeyReject</entry>
+</row>
+<row>
+    <entry>Accepted SlowKeys key released</entry>
+    <entry>AX_SlowKeyRelease</entry>
+</row>
+<row>
+    <entry>BounceKeys key rejected</entry>
+    <entry>AX_BounceKeyReject</entry>
+</row>
+<row>
+    <entry>StickyKeys key latched</entry>
+    <entry>AX_StickyLatch</entry>
+</row>
+<row>
+    <entry>StickyKeys key locked</entry>
+    <entry>AX_StickyLock</entry>
+</row>
+<row>
+    <entry>StickyKeys key unlocked</entry>
+    <entry>AX_StickyUnlock</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+</sect1>
+<sect1 id='Audible_Bells'>
+<title>Audible Bells</title>
+
+<para>
+Using Xkb you can generate bell events that do not necessarily ring the system
+bell. This is useful if you need to use an audio server instead of the system
+beep. For example, when an audio client starts, it could disable the audible
+bell (the system bell) and then listen for <emphasis>
+XkbBellNotify</emphasis>
+ events (see section 9.4). When it receives a <emphasis> <!-- xref -->
+XkbBellNotify</emphasis>
+ event, the audio client could then send a request to an audio server to play a
+sound.
+</para>
+
+
+<para>
+You can control the audible bells feature by passing the <emphasis>
+XkbAudibleBellMask</emphasis>
+ to <emphasis>
+XkbChangeEnabledControls</emphasis>
+ (see section 10.1.1). If you set <emphasis> <!-- xref -->
+XkbAudibleBellMask</emphasis>
+ on, the server rings the system bell when a bell event occurs. This is the
+default. If you set <emphasis>
+XkbAudibleBellMask</emphasis>
+ off and a bell event occurs, the server does not ring the system bell unless
+you call <emphasis>
+XkbForceDeviceBell</emphasis>
+ or <emphasis>
+XkbForceBell</emphasis>
+ (see section 9.3.3). <!-- xref -->
+</para>
+
+<para>
+Audible bells are also part of the per-client auto-reset controls. For more
+information on auto-reset controls, see section 10.1.2. <!-- xref -->
+</para>
+
+</sect1>
+<sect1 id='Bell_Functions'>
+<title>Bell Functions</title>
+
+<para>
+Use the functions described in this section to ring bells and to generate bell
+events.
+</para>
+
+<para>
+The input extension has two types of feedbacks that can generate bells — bell
+feedback and keyboard feedback. Some of the functions in this section have
+<emphasis>
+bell_class</emphasis>
+ and <emphasis>
+bell_id</emphasis>
+ parameters; set them as follows: Set <emphasis>
+bell_class</emphasis>
+ to <emphasis>
+BellFeedbackClass</emphasis>
+ or <emphasis>
+KbdFeedbackClass</emphasis>
+. A device can have more than one feedback of each type; set <emphasis>
+bell_id</emphasis>
+ to the particular bell feedback of <emphasis>
+bell_class</emphasis>
+ type.
+</para>
+
+<para>
+Table 9.2 shows the conditions that cause a bell to sound or an <emphasis> <!-- xref -->
+XkbBellNotifyEvent</emphasis>
+ to be generated when a bell function is called.
+</para>
+
+<table frame='topbot'>
+<title>Bell Sounding and Bell Event Generating</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='4' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='1.0*'/>
+<colspec colname='c3' colwidth='1.0*'/>
+<colspec colname='c4' colwidth='1.0*'/>
+<thead>
+  <row rowsep='1'>
+    <entry>Function called</entry>
+    <entry>AudibleBell</entry>
+    <entry>Server sounds a bell</entry>
+    <entry>Server sends an XkbBellNotifyEvent</entry>
+  </row>
+</thead>
+<tbody>
+<row>
+    <entry>XkbDeviceBell</entry>
+    <entry>On</entry>
+    <entry>Yes</entry>
+    <entry>Yes</entry>
+</row>
+<row>
+    <entry>XkbDeviceBell</entry>
+    <entry>Off</entry>
+    <entry>No</entry>
+    <entry>Yes</entry>
+</row>
+<row>
+    <entry>XkbBell</entry>
+    <entry>On</entry>
+    <entry>Yes</entry>
+    <entry>Yes</entry>
+</row>
+<row>
+    <entry>XkbBell</entry>
+    <entry>Off</entry>
+    <entry>No</entry>
+    <entry>Yes</entry>
+</row>
+<row>
+    <entry>XkbDeviceBellEvent</entry>
+    <entry>On or Off</entry>
+    <entry>No</entry>
+    <entry>Yes</entry>
+</row>
+<row>
+    <entry>XkbBellEvent</entry>
+    <entry>On or Off</entry>
+    <entry>No</entry>
+    <entry>Yes</entry>
+</row>
+<row>
+    <entry>XkbDeviceForceBell</entry>
+    <entry>On or Off</entry>
+    <entry>Yes</entry>
+    <entry>No</entry>
+</row>
+<row>
+    <entry>XkbForceBell</entry>
+    <entry>On or Off</entry>
+    <entry>Yes</entry>
+    <entry>No</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<sect2 id='Generating_Named_Bells'>
+<title>Generating Named Bells</title>
+
+<para>
+To ring the bell on an X input extension device or the default keyboard, use
+<emphasis>
+XkbDeviceBell.</emphasis>
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbDeviceBell</emphasis>
+(<emphasis>
+display, window, device_id, bell_class, bell_id, percent, name</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *<emphasis>
+      display</emphasis>
+;            /* connection to the X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Window<emphasis>
+      window</emphasis>
+;            /* window for which the bell is generated, or None */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+device_spec</emphasis>
+;            /* device ID, or <emphasis>
+XkbUseCoreKbd</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+bell_class</emphasis>
+;            /* X input extension bell class of the bell to be rung */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+bell_id</emphasis>
+;            /* X input extension bell ID of the bell to be rung */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+percent</emphasis>
+;            /* bell volume, from -100 to 100 inclusive */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Atom      <emphasis>
+name</emphasis>
+;            /* a name for the bell, or <emphasis>
+NULL</emphasis>
+ */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+Set <emphasis>
+percent</emphasis>
+ to be the volume relative to the base volume for the keyboard as described for
+<emphasis>
+XBell</emphasis>.
+</para>
+
+<para>
+Note that <emphasis>
+bell_class</emphasis>
+ and <emphasis>
+bell_id</emphasis>
+ indicate the bell to physically ring. <emphasis>
+name</emphasis>
+ is simply an arbitrary moniker for the client application’s use.
+</para>
+
+<para>
+To determine the current feedback settings of an extension input device, use
+<emphasis>
+XGetFeedbackControl</emphasis>
+. See the X input extension documentation for more information on <emphasis>
+XGetFeedbackControl</emphasis>
+ and related data structures.
+</para>
+
+<para>
+If a compatible keyboard extension is not present in the X server, <emphasis>
+XkbDeviceBell</emphasis>
+ immediately returns <emphasis>
+False</emphasis>
+. Otherwise, <emphasis>
+XkbDeviceBell </emphasis>
+rings the bell as specified for the display and keyboard device and returns
+<emphasis>
+True</emphasis>
+. If you have disabled the audible bell, the server does not ring the system
+bell, although it does generate a <emphasis>
+XkbBellNotify</emphasis>
+ event.
+</para>
+
+<para>
+You can call <emphasis>
+XkbDeviceBell</emphasis>
+ without first initializing the keyboard extension.
+</para>
+
+<para>
+As a convenience function, Xkb provides a function to ring the bell on the
+default keyboard: <emphasis>
+XkbBell.</emphasis>
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbBell</emphasis>
+(<emphasis>
+display, window, percent, name</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *      <emphasis>
+display</emphasis>
+;            /* connection to the X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Window<emphasis>
+      window</emphasis>
+;            /* event window, or None*/
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int<emphasis>
+      percent</emphasis>
+;            /* relative volume, which can range from -100 to 100 inclusive */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Atom<emphasis>
+      name</emphasis>
+;            /* a bell name, or <emphasis>
+NULL</emphasis>
+ */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+If a compatible keyboard extension isn’t present in the X server, <emphasis>
+XkbBell</emphasis>
+ calls <emphasis>
+XBell </emphasis>
+with the specified <emphasis>
+display</emphasis>
+ and <emphasis>
+percent</emphasis>
+, and returns <emphasis>
+False</emphasis>
+. Otherwise, <emphasis>
+XkbBell </emphasis>
+calls <emphasis>
+XkbDeviceBell</emphasis>
+ with the specified <emphasis>
+display, window, percent, </emphasis>
+and <emphasis>
+name</emphasis>
+, a <emphasis>
+device_spec</emphasis>
+ of <emphasis>
+XkbUseCoreKbd</emphasis>
+, a <emphasis>
+bell_class </emphasis>
+of <emphasis>
+XkbDfltXIClass</emphasis>
+, and a <emphasis>
+bell_id </emphasis>
+of <emphasis>
+XkbDfltXIId,</emphasis>
+ and returns <emphasis>
+True</emphasis>.
+</para>
+
+<para>
+If you have disabled the audible bell, the server does not ring the system
+bell, although it does generate a <emphasis>
+XkbBellNotify</emphasis>
+ event.
+</para>
+
+<para>
+You can call <emphasis>
+XkbBell</emphasis>
+ without first initializing the keyboard extension.
+</para>
+
+</sect2>
+<sect2 id='Generating_Named_Bell_Events'>
+<title>Generating Named Bell Events</title>
+
+<para>
+Using Xkb, you can also generate a named bell event that does not ring any
+bell. This allows you to do things such as generate events when your
+application starts.
+</para>
+
+<para>
+For example, if an audio client listens for these types of bells, it can
+produce a "whoosh" sound when it receives a named bell event to indicate a
+client just started. In this manner, applications can generate start-up
+feedback and not worry about producing annoying beeps if an audio server is not
+running.
+</para>
+
+
+<para>
+To cause a bell event for an X input extension device or for the keyboard,
+without ringing the corresponding bell, use <emphasis>
+XkbDeviceBellEvent.</emphasis>
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbDeviceBellEvent</emphasis>
+(<emphasis>
+display, window, device_spec, bell_class, bell_id, percent, name</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *      <emphasis>
+display</emphasis>
+;      /* connection to the X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Window      <emphasis>
+window</emphasis>
+;      /* event window, or None*/
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+device_spec</emphasis>
+;      /* device ID, or <emphasis>
+XkbUseCoreKbd</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+bell_class;</emphasis>
+      /* input extension bell class for the event */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+bell_id</emphasis>
+;      /* input extension bell ID for the event */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+percent</emphasis>
+;      /* volume for the bell, which can range from -100 to 100 inclusive */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Atom      <emphasis>
+name</emphasis>
+;      /* a bell name, or <emphasis>
+NULL</emphasis>
+ */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+If a compatible keyboard extension isn’t present in the X server, <emphasis>
+XkbDeviceBellEvent</emphasis>
+ immediately returns <emphasis>
+False</emphasis>
+. Otherwise, <emphasis>
+XkbDeviceBellEvent</emphasis>
+ causes an <emphasis>
+XkbBellNotify</emphasis>
+ event to be sent to all interested clients and returns <emphasis>
+True</emphasis>
+. Set <emphasis>
+percent</emphasis>
+ to be the volume relative to the base volume for the keyboard as described for
+<emphasis>XBell</emphasis>.
+</para>
+
+
+<para>
+In addition, <emphasis>
+XkbDeviceBellEvent</emphasis>
+ may generate <emphasis>
+Atom</emphasis>
+ protocol errors as well as <emphasis>
+XkbBellNotify</emphasis>
+ events. You can call <emphasis>
+XkbBell</emphasis>
+ without first initializing the keyboard extension.
+</para>
+
+
+<para>
+As a convenience function, Xkb provides a function to cause a bell event for
+the keyboard without ringing the bell: <emphasis>
+XkbBellEvent.</emphasis>
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbBellEvent</emphasis>
+(<emphasis>
+display, window, percent, name</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *      <emphasis>
+display</emphasis>
+;            /* connection to the X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Window      <emphasis>
+window</emphasis>
+;            /* the event window, or None */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+percent</emphasis>
+;            /* relative volume, which can range from -100 to 100 inclusive */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Atom      <emphasis>
+name</emphasis>
+;            /* a bell name, or <emphasis>
+NULL</emphasis>
+ */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+If a compatible keyboard extension isn’t present in the X server, <emphasis>
+XkbBellEvent</emphasis>
+ immediately returns <emphasis>
+False</emphasis>
+. Otherwise, <emphasis>
+XkbBellEvent </emphasis>
+calls<emphasis>
+ XkbDeviceBellEvent</emphasis>
+ with the specified <emphasis>
+display, window, percent, </emphasis>
+and <emphasis>
+name</emphasis>
+, a <emphasis>
+device_spec</emphasis>
+ of <emphasis>
+XkbUseCoreKbd</emphasis>
+, a <emphasis>
+bell_class </emphasis>
+of <emphasis>
+XkbDfltXIClass</emphasis>
+, and a <emphasis>
+bell_id </emphasis>
+of <emphasis>
+XkbDfltXIId,</emphasis>
+ and returns what <emphasis>
+XkbDeviceBellEvent</emphasis>
+ returns.
+</para>
+
+<para>
+<emphasis>XkbBellEvent</emphasis>
+generates a <emphasis>XkbBellNotify</emphasis>
+event.
+</para>
+
+
+<para>
+You can call <emphasis>
+XkbBellEvent</emphasis>
+without first initializing the keyboard extension.
+</para>
+
+</sect2>
+<sect2 id='Forcing_a_Server_Generated_Bell'>
+<title>Forcing a Server-Generated Bell</title>
+
+<para>
+To ring the bell on any keyboard, overriding user preference settings for
+audible bells, use <emphasis>XkbForceDeviceBell</emphasis>.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbForceDeviceBell</emphasis>
+(<emphasis>
+display, window, device_spec, bell_class, bell_id, percent</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *      <emphasis>
+display</emphasis>
+;            /* connection to the X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Window      <emphasis>
+window</emphasis>
+;            /* event window, or None */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+device_spec</emphasis>
+;            /* device ID, or <emphasis>
+XkbUseCoreKbd</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+bell_class</emphasis>
+;            /* input extension class of the bell to be rung */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+bell_id</emphasis>
+;            /* input extension ID of the bell to be rung */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+percent</emphasis>
+;            /* relative volume, which can range from -100 to 100 inclusive */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+If a compatible keyboard extension isn’t present in the X server, <emphasis>
+XkbForceDeviceBell</emphasis>
+ immediately returns <emphasis>
+False</emphasis>
+. Otherwise, <emphasis>
+XkbForceDeviceBell </emphasis>
+rings the bell as specified for the display and keyboard device and returns
+<emphasis>
+True</emphasis>
+. Set <emphasis>
+percent</emphasis>
+ to be the volume relative to the base volume for the keyboard as described for
+<emphasis>
+XBell</emphasis>
+. There is no <emphasis>
+name</emphasis>
+ parameter because <emphasis>
+XkbForceDeviceBell </emphasis>
+does not cause an <emphasis>
+XkbBellNotify</emphasis>
+ event.
+</para>
+
+<para>
+You can call <emphasis>
+XkbBell</emphasis>
+ without first initializing the keyboard extension.
+</para>
+
+<para>
+To ring the bell on the default keyboard, overriding user preference settings
+for audible bells, use <emphasis>
+XkbForceBell</emphasis>.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbForceBell</emphasis>
+(<emphasis>
+display, percent)</emphasis>
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *      <emphasis>
+display</emphasis>
+;      /* connection to the X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+percent</emphasis>
+;      /* volume for the bell, which can range from -100 to 100 inclusive */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+If a compatible keyboard extension isn’t present in the X server, <emphasis>
+XkbForceBell</emphasis>
+ calls <emphasis>
+XBell </emphasis>
+with the specified <emphasis>
+display</emphasis>
+ and <emphasis>
+percent</emphasis>
+ and returns <emphasis>
+False</emphasis>
+. Otherwise, <emphasis>
+XkbForceBell </emphasis>
+calls <emphasis>
+XkbForceDeviceBell</emphasis>
+ with the specified <emphasis>
+display </emphasis>
+and<emphasis>
+ percent</emphasis>
+, <emphasis>
+device_spec</emphasis>
+ =<emphasis>
+XkbUseCoreKbd</emphasis>
+, <emphasis>
+bell_class </emphasis>
+= <emphasis>
+XkbDfltXIClass</emphasis>
+, <emphasis>
+bell_id </emphasis>
+= <emphasis>
+XkbDfltXIId,</emphasis>
+ <emphasis>
+window</emphasis>
+ = None, and <emphasis>
+name</emphasis>
+ = <emphasis>
+NULL</emphasis>
+, and returns what<emphasis>
+ XkbForceDeviceBell</emphasis>
+ returns.
+</para>
+
+<para>
+<emphasis>
+XkbForceBell </emphasis>
+does not cause an <emphasis>
+XkbBellNotify</emphasis>
+ event.
+</para>
+
+<para>
+You can call <emphasis>
+XkbBell</emphasis>
+ without first initializing the keyboard extension.
+</para>
+
+</sect2>
+</sect1>
+<sect1 id='Detecting_Bells'>
+<title>Detecting Bells</title>
+
+<para>
+Xkb generates <emphasis>
+XkbBellNotify</emphasis>
+ events for all bells except for those resulting from calls to <emphasis>
+XkbForceDeviceBell</emphasis>
+ and <emphasis>
+XkbForceBell</emphasis>
+. To receive <emphasis>
+XkbBellNotify</emphasis>
+ events under all possible conditions, pass <emphasis>
+XkbBellNotifyMask</emphasis>
+ in both the <emphasis>
+bits_to_change </emphasis>
+and<emphasis>
+ values_for_bits</emphasis>
+ parameters to <emphasis>
+XkbSelectEvents</emphasis>
+ (see section 4.3). <!-- xref -->
+</para>
+
+<para>
+The <emphasis>
+XkbBellNotify</emphasis>
+ event has no event details. It is either selected or it is not. However, you
+can call <emphasis>
+XkbSelectEventDetails</emphasis>
+ using <emphasis>
+XkbBellNotify</emphasis>
+ as the <emphasis>
+event_type</emphasis>
+ and specifying <emphasis>
+XkbAllBellNotifyMask</emphasis>
+ in <emphasis>
+bits_to_change</emphasis>
+ and <emphasis>
+values_for_bits.</emphasis>
+ This has the same effect as a call to <emphasis>
+XkbSelectEvents</emphasis>.
+</para>
+
+<para>
+The structure for the <emphasis>
+XkbBellNotify</emphasis>
+ event type contains:
+</para>
+
+<para><programlisting>
+typedef struct _XkbBellNotify {
+      int             type;        /* Xkb extension base event code */
+      unsigned long   serial;      /* X server serial number for event */
+      Bool            send_event;  /* <emphasis> True</emphasis> =&gt; synthetically generated */
+      Display *       display;     /* server connection where event generated */
+      Time            time;        /* server time when event generated */
+      int             xkb_type;    /* <emphasis> XkbBellNotify</emphasis> */
+      unsigned int    device;      /* Xkb device ID, will not be <emphasis> XkbUseCoreKbd</emphasis> */
+      int             percent;     /* requested volume as % of max */
+      int             pitch;       /* requested pitch in Hz */
+      int             duration;    /* requested duration in microseconds */
+      unsigned int    bell_class;  /* X input extension feedback class */
+      unsigned int    bell_id;     /* X input extension feedback ID */
+      Atom            name;        /* "name" of requested bell */
+      Window          window;      /* window associated with event */
+      Bool            event_only;  /* <emphasis> False</emphasis> -&gt; the server did not produce a beep */
+} <emphasis>XkbBellNotifyEvent</emphasis>;
+</programlisting></para>
+
+<para>
+If your application needs to generate visual bell feedback on the screen when
+it receives a bell event, use the window ID in the <emphasis>
+XkbBellNotifyEvent</emphasis>
+, if present.
+</para>
+
+</sect1>
+</chapter>
diff --git a/specs/XKB/ch10.xml b/specs/XKB/ch10.xml
new file mode 100644 (file)
index 0000000..b7f3069
--- /dev/null
@@ -0,0 +1,5386 @@
+<chapter id='Keyboard_Controls'>
+<title>Keyboard Controls</title>
+
+<para>
+The Xkb extension is composed of two parts: a server extension, and a
+client-side X library extension. This chapter discusses functions used to
+modify controls effecting the behavior of the server portion of the Xkb
+extension. Chapter 11 discusses functions used to modify controls that affect
+only the behavior of the client portion of the extension; those controls are
+known as Library Controls.
+</para>
+
+
+<para>
+Xkb contains control features that affect the entire keyboard, known as global
+keyboard controls. Some of the controls may be selectively enabled and
+disabled; these controls are known as the <emphasis>
+Boolean Controls</emphasis>
+. Boolean Controls can be turned on or off under program control and can also
+be automatically set to an on or off condition when a client program exits. The
+remaining controls, known as the <emphasis>
+Non-Boolean Controls</emphasis>
+, are always active. The<emphasis>
+ XkbControlsRec</emphasis>
+ structure describes the current state of most of the global controls and the
+attributes effecting the behavior of each of these Xkb features. This chapter
+describes the Xkb controls and how to manipulate them.
+</para>
+
+
+<para>
+There are two possible components for each of the Boolean Controls: attributes
+describing how the control should work, and a state describing whether the
+behavior as a whole is enabled or disabled. The attributes and state for most
+of these controls are held in the <emphasis>
+XkbControlsRec</emphasis>
+ structure (see section 10.8).
+</para>
+
+
+<para>
+You can manipulate the Xkb controls individually, via convenience functions, or
+as a whole. To treat them as a group, modify an <emphasis>
+XkbControlsRec</emphasis>
+ structure to describe all of the changes to be made, and then pass that
+structure and appropriate flags to an Xkb library function, or use a <emphasis>
+XkbControlsChangesRec</emphasis>
+ (see section 10.10.1) to reduce network traffic. When using a convenience
+function to manipulate one control individually, you do not use an <emphasis>
+XkbControlsRec</emphasis>
+ structure directly.
+</para>
+
+
+<para>
+The Xkb controls are grouped as shown in Table 10.1. <!-- xref -->
+</para>
+
+<table frame='topbot'>
+<title>Xkb Keyboard Controls</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='3' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.5*'/>
+<colspec colname='c2' colwidth='1.5*'/>
+<colspec colname='c3' colwidth='1.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Type of Control</entry>
+  <entry>Control Name</entry>
+  <entry>Boolean Control?</entry>
+  </row>
+</thead>
+<tbody>
+  <row>
+    <entry>Controls for enabling and disabling other controls</entry>
+    <entry>EnabledControls</entry>
+    <entry>No</entry>
+  </row>
+  <row>
+    <entry></entry>
+    <entry>AutoReset</entry>
+    <entry>No</entry>
+  </row>
+  <row>
+    <entry>Control for bell behavior</entry>
+    <entry>AudibleBell</entry>
+    <entry>Boolean</entry>
+  </row>
+  <row>
+    <entry>Controls for repeat key behavior</entry>
+    <entry>PerKeyRepeat</entry>
+    <entry>No</entry>
+  </row>
+  <row>
+    <entry></entry>
+    <entry>RepeatKeys</entry>
+    <entry>Boolean</entry>
+  </row>
+  <row>
+    <entry></entry>
+    <entry>DetectableAutorepeat</entry>
+    <entry>Boolean</entry>
+  </row>
+  <row>
+    <entry>Controls for keyboard overlays</entry>
+    <entry>Overlay1</entry>
+    <entry>Boolean</entry>
+  </row>
+  <row>
+    <entry></entry>
+    <entry>Overlay2</entry>
+    <entry>Boolean</entry>
+  </row>
+  <row>
+    <entry>Controls for using the mouse from the keyboard</entry>
+    <entry>MouseKeys</entry>
+    <entry>Boolean</entry>
+  </row>
+  <row>
+    <entry></entry>
+    <entry>MouseKeysAccel</entry>
+    <entry>Boolean</entry>
+  </row>
+  <row>
+    <entry>Controls for better keyboard access by </entry>
+    <entry>AccessXFeedback</entry>
+    <entry>Boolean</entry>
+  </row>
+  <row>
+    <entry>physically impaired persons</entry>
+    <entry>AccessXKeys</entry>
+    <entry>Boolean</entry>
+  </row>
+  <row>
+    <entry></entry>
+    <entry>AccessXTimeout</entry>
+    <entry>Boolean</entry>
+  </row>
+  <row>
+    <entry></entry>
+    <entry>BounceKeys</entry>
+    <entry>Boolean</entry>
+  </row>
+  <row>
+    <entry></entry>
+    <entry>SlowKeys</entry>
+    <entry>Boolean</entry>
+  </row>
+  <row>
+    <entry></entry>
+    <entry>StickyKeys</entry>
+    <entry>Boolean</entry>
+  </row>
+  <row>
+    <entry>Controls for general keyboard mapping</entry>
+    <entry>GroupsWrap</entry>
+    <entry>No</entry>
+  </row>
+  <row>
+    <entry></entry>
+    <entry>IgnoreGroupLock</entry>
+    <entry>Boolean</entry>
+  </row>
+  <row>
+    <entry></entry>
+    <entry>IgnoreLockMods</entry>
+    <entry>No</entry>
+  </row>
+  <row>
+    <entry></entry>
+    <entry>InternalMods</entry>
+    <entry>No</entry>
+  </row>
+  <row>
+    <entry>Miscellaneous per-client controls</entry>
+    <entry>GrabsUseXKBState</entry>
+    <entry>Boolean</entry>
+  </row>
+  <row>
+    <entry></entry>
+    <entry>LookupStateWhenGrabbed</entry>
+    <entry>Boolean</entry>
+  </row>
+  <row>
+    <entry></entry>
+    <entry>SendEventUsesXKBState</entry>
+    <entry>Boolean</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+The individual categories and controls are described first, together with
+functions for manipulating them. A description of the <emphasis>
+XkbControlsRec</emphasis>
+ structure and the general functions for dealing with all of the controls at
+once follow at the end of the chapter.
+</para>
+
+<sect1 id='Controls_that_Enable_and_Disable_Other_Controls'>
+<title>Controls that Enable and Disable Other Controls</title>
+
+<para>
+Enable and disable the boolean controls under program control by using the
+<emphasis>
+EnabledControls</emphasis>
+ control; enable and disable them upon program exit by configuring the
+<emphasis>
+AutoReset</emphasis>
+ control.
+</para>
+
+
+<sect2 id='The_EnabledControls_Control'>
+<title>The EnabledControls Control</title>
+
+<para>
+The <emphasis>
+EnabledControls</emphasis>
+ control is a bit mask where each bit that is turned on means the corresponding
+control is enabled, and when turned off, disabled. It corresponds to the
+<emphasis>
+enabled_ctrls</emphasis>
+ field of an <emphasis>
+XkbControlsRec</emphasis>
+ structure (see section 10.8). The bits describing which controls are turned on
+or off are defined in Table 10.7. <!-- xref -->
+</para>
+
+
+<para>
+Use <emphasis>
+XkbChangeEnabledControls</emphasis>
+ to manipulate the <emphasis>
+EnabledControls</emphasis>
+ control.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbChangeEnabledControls</emphasis>
+(<emphasis>
+dpy</emphasis>
+, <emphasis>
+device_spec</emphasis>
+, <emphasis>
+mask</emphasis>
+,<emphasis>
+ values</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *<emphasis>
+            dpy</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+device_spec</emphasis>
+;            /* keyboard device to modify */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+mask</emphasis>
+;            /* 1 bit -&gt; controls to enable / disable */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+values</emphasis>
+;            /* 1 bit =&gt; enable, 0 bit =&gt; disable */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+The <emphasis>
+mask</emphasis>
+ parameter specifies the boolean controls to be enabled or disabled, and the
+<emphasis>
+values</emphasis>
+ mask specifies the new state for those controls. Valid values for both of
+these masks are composed of a bitwise inclusive OR of bits taken from the set
+of mask bits in Table 10.7, using only those masks with "ok" in the <emphasis>
+enabled_ctrls</emphasis>
+ column.
+</para>
+
+
+<para>
+If the X server does not support a compatible version of Xkb or the Xkb
+extension has not been properly initialized, <emphasis>
+XkbChangeEnabledControls</emphasis>
+ returns <emphasis>
+False</emphasis>
+; otherwise, it sends the request to the X server and returns <emphasis>
+True</emphasis>
+.
+</para>
+
+
+<para>
+Note that the <emphasis>
+EnabledControls</emphasis>
+ control only enables and disables controls; it does not configure them. Some
+controls, such as the <emphasis>
+AudibleBell</emphasis>
+ control, have no configuration attributes and are therefore manipulated solely
+by enabling and disabling them. Others, however, have additional attributes to
+configure their behavior. For example, the <emphasis>
+RepeatControl</emphasis>
+ control uses <emphasis>
+repeat_delay</emphasis>
+ and <emphasis>
+repeat_interval</emphasis>
+ fields to describe the timing behavior of keys that repeat. The <emphasis>
+RepeatControl</emphasis>
+ behavior is turned on or off depending on the value of the <emphasis>
+XkbRepeatKeysMask</emphasis>
+ bit, but you must use other means, as described in this chapter, to configure
+its behavior in detail.
+</para>
+
+
+</sect2>
+<sect2 id='The_AutoReset_Control'>
+<title>The AutoReset Control</title>
+
+<para>
+You can configure the boolean controls to automatically be enabled or disabled
+when a program exits. This capability is controlled via two masks maintained in
+the X server on a per-client basis. There is no client-side Xkb data structure
+corresponding to these masks. Whenever the client exits for any reason, any
+boolean controls specified in the <emphasis>
+auto-reset mask</emphasis>
+ are set to the corresponding value from the <emphasis>
+auto-reset values</emphasis>
+ mask. This makes it possible for clients to "clean up after themselves"
+automatically, even if abnormally terminated. The bits used in the masks
+correspond to the <emphasis>
+EnabledControls</emphasis>
+ control bits.
+</para>
+
+
+<para>
+For example, a client that replaces the keyboard bell with some other audible
+cue might want to turn off the <emphasis>
+AudibleBell</emphasis>
+ control to prevent the server from also generating a sound and avoid
+cacophony. If the client were to exit without resetting the <emphasis>
+AudibleBell </emphasis>
+control, the user would be left without any feedback at all. Setting <emphasis>
+AudibleBell</emphasis>
+ in both the auto-reset mask and auto-reset values guarantees that the audible
+bell will be turned back on when the client exits.
+</para>
+
+
+<para>
+To get the current values of the auto-reset controls, use <emphasis>
+XkbGetAutoResetControls</emphasis>
+.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbGetAutoResetControls</emphasis>
+(<emphasis>
+dpy</emphasis>
+, <emphasis>
+auto_ctrls</emphasis>
+, <emphasis>
+auto_values</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *            <emphasis>
+dpy</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int *            <emphasis>
+auto_ctrls</emphasis>
+;            /* specifies which bits in <emphasis>
+auto_values</emphasis>
+ are relevant */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int *            <emphasis>
+auto_values</emphasis>
+;            /* 1 bit =&gt; corresponding control has auto-reset on */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetAutoResetControls</emphasis>
+ backfills <emphasis>
+auto_ctrls</emphasis>
+ and <emphasis>
+auto_values</emphasis>
+ with the <emphasis>
+AutoReset</emphasis>
+ control attributes for this particular client. It returns <emphasis>
+True</emphasis>
+ if successful, and <emphasis>
+False</emphasis>
+ otherwise.
+</para>
+
+
+<para>
+To change the current values of the <emphasis>
+AutoReset</emphasis>
+ control attributes, use <emphasis>
+XkbSetAutoResetControls.</emphasis>
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbSetAutoResetControls</emphasis>
+(<emphasis>
+dpy</emphasis>
+, <emphasis>
+changes</emphasis>
+,<emphasis>
+ auto_ctrls</emphasis>
+, <emphasis>
+auto_values</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *            <emphasis>
+dpy</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+changes</emphasis>
+;            /* controls for which to change auto-reset values */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int *            <emphasis>
+auto_ctrls</emphasis>
+;            /* controls from changes that should auto reset */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int *            <emphasis>
+auto_values</emphasis>
+;            /* 1 bit =&gt; auto-reset on */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbSetAutoResetControls changes the auto-reset status and associated auto-reset
+values for the controls selected by </emphasis>
+<emphasis>
+changes</emphasis>
+<emphasis>
+. For any control selected by </emphasis>
+<emphasis>
+changes</emphasis>
+<emphasis>
+, if the corresponding bit is set in </emphasis>
+<emphasis>
+auto_ctrls</emphasis>
+<emphasis>
+, the control is configured to auto-reset when the client exits. If the
+corresponding bit in </emphasis>
+<emphasis>
+auto_values</emphasis>
+<emphasis>
+ is on, the control is turned on when the client exits; if zero, the control is
+turned off when the client exits.</emphasis>
+ For any control selected by <emphasis>
+changes</emphasis>
+, if the corresponding bit is not set in <emphasis>
+auto_ctrls</emphasis>
+, the control is configured to not reset when the client exits. For example:
+</para>
+
+
+<para>
+<emphasis>
+To leave the auto-reset controls for </emphasis>
+<emphasis>
+StickyKeys</emphasis>
+<emphasis>
+ the way they are:</emphasis>
+</para>
+
+<para><programlisting>
+ok = XkbSetAutoResetControls(dpy, 0, 0, 0);
+</programlisting></para>
+
+<para>
+<emphasis>
+To change the auto-reset controls so that </emphasis>
+<emphasis>
+StickyKeys</emphasis>
+<emphasis>
+ are unaffected when the client exits:</emphasis>
+</para>
+
+<para><programlisting>
+ok = XkbSetAutoResetControls(dpy, XkbStickyKeysMask, 0, 0);
+</programlisting></para>
+
+<para>
+<emphasis>
+To change the auto-reset controls so that </emphasis>
+<emphasis>
+StickyKeys</emphasis>
+<emphasis>
+ are turned off when the client exits:</emphasis>
+</para>
+
+<para><programlisting>
+ok = XkbSetAutoResetControls(dpy, XkbStickyKeysMask, XkbStickyKeysMask, 0);
+</programlisting></para>
+
+<para>
+<emphasis>
+To change the auto-reset controls so that </emphasis>
+<emphasis>
+StickyKeys</emphasis>
+<emphasis>
+ are turned on when the client exits:</emphasis>
+</para>
+
+<para><programlisting>
+ok = XkbSetAutoResetControls(dpy, XkbStickyKeysMask, XkbStickyKeysMask,
+XkbStickyKeysMask);
+</programlisting></para>
+
+<para>
+<emphasis>
+XkbSetAutoResetControls</emphasis>
+ backfills <emphasis>
+auto_ctrls</emphasis>
+ and <emphasis>
+auto_values</emphasis>
+ with the auto-reset controls for this particular client. Note that all of the
+bits are valid in the returned values, not just the ones selected in the
+<emphasis>
+changes</emphasis>
+ mask.
+</para>
+
+
+</sect2>
+</sect1>
+<sect1 id='Control_for_Bell_Behavior'>
+<title>Control for Bell Behavior</title>
+
+<para>
+The X server’s generation of sounds is controlled by the <emphasis>
+AudibleBell</emphasis>
+ control. Configuration of different bell sounds is discussed in Chapter 9.
+</para>
+
+
+<sect2 id='The_AudibleBell_Control'>
+<title>The AudibleBell Control</title>
+
+<para>
+The <emphasis>
+AudibleBell</emphasis>
+ control is a boolean control that has no attributes. As such, you may enable
+and disable it using either the <emphasis>
+EnabledControls</emphasis>
+ control or the <emphasis>
+AutoReset</emphasis>
+ control discussed in section 10.1.1. When enabled, protocol requests to  <!-- xref -->
+generate a sound result in the X server actually producing a real sound; when
+disabled, requests to the server to generate a sound are ignored unless the
+sound is forced. See section 9.2. <!-- xref -->
+</para>
+
+
+</sect2>
+</sect1>
+<sect1 id='Controls_for_Repeat_Key_Behavior'>
+<title>Controls for Repeat Key Behavior</title>
+
+<para>
+The repeating behavior of keyboard keys is governed by three controls, the
+<emphasis>
+PerKeyRepeat</emphasis>
+ control, which is always active, and the <emphasis>
+RepeatKeys</emphasis>
+ and <emphasis>
+DetectableAutorepeat</emphasis>
+ controls, which are boolean controls that may be enabled and disabled.
+<emphasis>
+PerKeyRepeat</emphasis>
+ determines which keys are allowed to repeat. <emphasis>
+RepeatKeys</emphasis>
+ governs the behavior of an individual key when it is repeating. <emphasis>
+DetectableAutorepeat</emphasis>
+ allows a client to detect when a key is repeating as a result of being held
+down.
+</para>
+
+
+<sect2 id='The_PerKeyRepeat_Control'>
+<title>The PerKeyRepeat Control</title>
+
+<para>
+The <emphasis>
+PerKeyRepeat</emphasis>
+ control is a bitmask long enough to contain a bit for each key on the device;
+it determines which individual keys are allowed to repeat. The Xkb <emphasis>
+PerKeyRepeat</emphasis>
+ control provides no functionality different from that available via the core X
+protocol. There are no convenience functions in Xkb for manipulating this
+control. The <emphasis>
+PerKeyRepeat</emphasis>
+ control settings are carried in the <emphasis>
+per_key_repeat</emphasis>
+ field of an <emphasis>
+XkbControlsRec</emphasis>
+ structure, discussed in section 10.8. <!-- xref -->
+</para>
+
+
+</sect2>
+<sect2 id='The_RepeatKeys_Control'>
+<title>The RepeatKeys Control</title>
+
+<para>
+The core protocol allows only control over whether or not the entire keyboard
+or individual keys should auto-repeat when held down. <emphasis>
+RepeatKeys</emphasis>
+ is a boolean control that extends this capability by adding control over the
+delay until a key begins to repeat and the rate at which it repeats. <emphasis>
+RepeatKeys</emphasis>
+ is coupled with the core auto-repeat control: when <emphasis>
+RepeatKeys</emphasis>
+ is enabled or disabled, the core auto-repeat is enabled or disabled and vice
+versa.
+</para>
+
+
+<para>
+Auto-repeating keys are controlled by two attributes. The first, <emphasis>
+timeout</emphasis>
+, is the delay after the initial press of an auto-repeating key and the first
+generated repeat event. The second, <emphasis>
+interval</emphasis>
+, is the delay between all subsequent generated repeat events. As with all
+boolean controls, configuring the attributes that determine how the control
+operates does not automatically enable the control as a whole; see section 10.1.
+</para>
+
+
+<para>
+To get the current attributes of the <emphasis>
+RepeatKeys</emphasis>
+ control for a keyboard device, use <emphasis>
+XkbGetAutoRepeatRate</emphasis>
+.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbGetAutoRepeatRate</emphasis>
+(<emphasis>
+display, device_spec, timeout_rtrn, interval_rtrn</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *<emphasis>
+            display</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+      device_spec</emphasis>
+;            /* desired device ID, or <emphasis>
+XkbUseCoreKbd</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int <emphasis>
+*            timeout_rtrn</emphasis>
+;            /* backfilled with initial repeat delay, ms */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int <emphasis>
+*            interval_rtrn</emphasis>
+;            /* backfilled with subsequent repeat delay, ms */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetAutoRepeatRate</emphasis>
+ queries the server for the current values of the <emphasis>
+RepeatControls</emphasis>
+ control attributes, backfills <emphasis>
+timeout_rtrn</emphasis>
+ and <emphasis>
+interval_rtrn</emphasis>
+ with them, and returns <emphasis>
+True</emphasis>
+. If a compatible version of the Xkb extension is not available in the server
+<emphasis>
+XkbGetAutoRepeatRate</emphasis>
+ returns <emphasis>
+False</emphasis>
+.
+</para>
+
+
+<para>
+To set the attributes of the RepeatKeys control for a keyboard device, use
+<emphasis>
+XkbSetAutoRepeatRate</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbSetAutoRepeatRate</emphasis>
+(<emphasis>
+display, device_spec, timeout, interval</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *<emphasis>
+            display</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+device_spec</emphasis>
+;            /* device to configure, or <emphasis>
+XkbUseCoreKbd</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+            timeout</emphasis>
+;            /* initial delay, ms */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+      interval</emphasis>
+;            /* delay between repeats, ms */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbSetAutoRepeatRate</emphasis>
+ sends a request to the X server to configure the <emphasis>
+AutoRepeat</emphasis>
+ control attributes to the values specified in <emphasis>
+timeout</emphasis>
+ and <emphasis>
+interval</emphasis>
+.
+</para>
+
+
+<para>
+<emphasis>
+XkbSetAutoRepeatRate</emphasis>
+ does not wait for a reply; it normally returns <emphasis>
+True</emphasis>
+. Specifying a zero value for either <emphasis>
+timeout</emphasis>
+ or <emphasis>
+interval</emphasis>
+ causes the server to generate a <emphasis>
+BadValue</emphasis>
+ protocol error. If a compatible version of the Xkb extension is not available
+in the server, <emphasis>
+XkbSetAutoRepeatRate</emphasis>
+ returns <emphasis>
+False</emphasis>
+.
+</para>
+
+
+</sect2>
+<sect2 id='The_DetectableAutorepeat_Control'>
+<title>The DetectableAutorepeat Control</title>
+
+<para>
+Auto-repeat is the generation of multiple key events by a keyboard when the
+user presses a key and holds it down. Keyboard hardware and device-dependent X
+server software often implement auto-repeat by generating multiple <emphasis>
+KeyPress</emphasis>
+ events with no intervening <emphasis>
+KeyRelease</emphasis>
+ event. The standard behavior of the X server is to generate a <emphasis>
+KeyRelease</emphasis>
+ event for every <emphasis>
+KeyPress</emphasis>
+ event. If the keyboard hardware and device-dependent software of the X server
+implement auto-repeat by generating multiple <emphasis>
+KeyPress</emphasis>
+ events, the device-independent part of the X server by default synthetically
+generates a <emphasis>
+KeyRelease</emphasis>
+ event after each <emphasis>
+KeyPress</emphasis>
+ event. This provides predictable behavior for X clients, but does not allow
+those clients to detect the fact that a key is auto-repeating.
+</para>
+
+
+<para>
+Xkb allows clients to request <emphasis>
+detectable auto-repeat</emphasis>
+. If a client requests and the server supports <emphasis>
+DetectableAutorepeat</emphasis>
+, Xkb generates <emphasis>
+KeyRelease</emphasis>
+ events only when the key is physically released. If <emphasis>
+DetectableAutorepeat</emphasis>
+ is not supported or has not been requested, the server synthesizes a <emphasis>
+KeyRelease</emphasis>
+ event for each repeating <emphasis>
+KeyPress</emphasis>
+ event it generates.
+</para>
+
+
+<para>
+<emphasis>
+DetectableAutorepeat</emphasis>
+, unlike the other controls in this chapter, is not contained in the <emphasis>
+XkbControlsRec</emphasis>
+ structure, nor can it be enabled or disabled via the <emphasis>
+EnabledControls</emphasis>
+ control. Instead, query and set <emphasis>
+DetectableAutorepeat</emphasis>
+ using <emphasis>
+XkbGetDetectableAutorepeat</emphasis>
+ and <emphasis>
+XkbSetDetectableAutorepeat</emphasis>
+.
+</para>
+
+
+<para>
+<emphasis>
+DetectableAutorepeat</emphasis>
+ is a condition that applies to all keyboard devices for a client’s
+connection to a given X server; it cannot be selectively set for some devices
+and not for others. For this reason, none of the Xkb library functions
+involving <emphasis>
+DetectableAutorepeat</emphasis>
+ involve a device specifier.
+</para>
+
+
+<para>
+To determine whether or not the server supports <emphasis>
+DetectableAutorepeat</emphasis>
+, use <emphasis>
+XkbGetDetectableAutorepeat</emphasis>
+.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbGetDetectableAutorepeat</emphasis>
+(<emphasis>
+display, supported_rtrn</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *<emphasis>
+      display</emphasis>
+;                  /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool *<emphasis>
+      supported_rtrn</emphasis>
+;                   /* backfilled <emphasis>
+True</emphasis>
+ if <emphasis>
+DetectableAutorepeat</emphasis>
+ supported */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetDetectableAutorepeat</emphasis>
+ queries the server for the current state of <emphasis>
+DetectableAutorepeat</emphasis>
+ and waits for a reply. If <emphasis>
+supported_rtrn</emphasis>
+ is not <emphasis>
+NULL</emphasis>
+, it backfills supported_rtrn with <emphasis>
+True</emphasis>
+ if the server supports <emphasis>
+DetectableAutorepeat</emphasis>
+, and <emphasis>
+False</emphasis>
+ otherwise. <emphasis>
+XkbGetDetectableAutorepeat</emphasis>
+ returns the current state of <emphasis>
+DetectableAutorepeat</emphasis>
+ for the requesting client: <emphasis>
+True</emphasis>
+ if <emphasis>
+DetectableAutorepeat</emphasis>
+ is set, and <emphasis>
+False</emphasis>
+ otherwise.
+</para>
+
+
+<para>
+To set <emphasis>
+DetectableAutorepeat</emphasis>
+, use <emphasis>
+XkbSetDetectableAutorepeat</emphasis>
+. This request affects all keyboard activity for the requesting client only;
+other clients still see the expected nondetectable auto-repeat behavior, unless
+they have requested otherwise.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbSetDetectableAutorepeat</emphasis>
+(<emphasis>
+display, detectable, supported_rtrn</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *<emphasis>
+      display</emphasis>
+;                  /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool<emphasis>
+      detectable</emphasis>
+;                  /* <emphasis>
+True</emphasis>
+ =&gt; set <emphasis>
+DetectableAutorepeat</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool *<emphasis>
+      supported_rtrn</emphasis>
+;                   /* backfilled <emphasis>
+True</emphasis>
+ if <emphasis>
+DetectableAutorepeat</emphasis>
+ supported */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbSetDetectableAutorepeat</emphasis>
+ sends a request to the server to set <emphasis>
+DetectableAutorepeat</emphasis>
+ on for the current client if <emphasis>
+detectable</emphasis>
+ is <emphasis>
+True</emphasis>
+, and off it <emphasis>
+detectable</emphasis>
+ is <emphasis>
+False</emphasis>
+; it then waits for a reply. If <emphasis>
+supported_rtrn</emphasis>
+ is not <emphasis>
+NULL</emphasis>
+, <emphasis>
+XkbSetDetectableAutorepeat</emphasis>
+ backfills <emphasis>
+supported_rtrn</emphasis>
+ with <emphasis>
+True</emphasis>
+ if the server supports <emphasis>
+DetectableAutorepeat</emphasis>
+, and <emphasis>
+False</emphasis>
+ if it does not. <emphasis>
+XkbSetDetectableAutorepeat</emphasis>
+ returns the current state of <emphasis>
+DetectableAutorepeat</emphasis>
+ for the requesting client: <emphasis>
+True</emphasis>
+ if <emphasis>
+DetectableAutorepeat</emphasis>
+ is set, and <emphasis>
+False</emphasis>
+ otherwise.
+</para>
+
+
+</sect2>
+</sect1>
+<sect1 id='Controls_for_Keyboard_Overlays_Overlay1_and_Overlay2_Controls'>
+<title>Controls for Keyboard Overlays (Overlay1 and Overlay2 Controls)</title>
+
+<para>
+A keyboard overlay allows some subset of the keyboard to report alternate
+keycodes when the overlay is enabled. For example, a keyboard overlay can be
+used to simulate a numeric or editing keypad on a keyboard that does not
+actually have one by reusing some portion of the keyboard as an overlay. This
+technique is very common on portable computers and embedded systems with small
+keyboards.
+</para>
+
+
+<para>
+Xkb includes direct support for two keyboard overlays, using the <emphasis>
+Overlay1</emphasis>
+ and <emphasis>
+Overlay2</emphasis>
+ controls. When <emphasis>
+Overlay1</emphasis>
+ is enabled, all of the keys that are members of the first keyboard overlay
+generate an alternate keycode. When <emphasis>
+Overlay2</emphasis>
+ is enabled, all of the keys that are members of the second keyboard overlay
+generate an alternate keycode. The two overlays are mutually exclusive; any
+particular key may be in at most one overlay. <emphasis>
+Overlay1</emphasis>
+ and <emphasis>
+Overlay2</emphasis>
+ are boolean controls. As such, you may enable and disable them using either
+the <emphasis>
+EnabledControls</emphasis>
+ control or the <emphasis>
+AutoReset</emphasis>
+ control discussed in section 10.1.1.  <!-- xref -->
+</para>
+
+
+<para>
+To specify the overlay to which a key belongs and the alternate keycode it
+should generate when that overlay is enabled, assign it either the <emphasis>
+XkbKB_Overlay1</emphasis>
+ or <emphasis>
+XkbKB_Overlay2</emphasis>
+ key behaviors, as described in section 16.2. <!-- xref -->
+</para>
+
+
+</sect1>
+<sect1 id='Controls_for_Using_the_Mouse_from_the_Keyboard'>
+<title>Controls for Using the Mouse from the Keyboard</title>
+
+<para>
+Using Xkb, it is possible to configure the keyboard to allow simulation of the
+X pointer device. This simulation includes both movement of the pointer itself
+and press and release events associated with the buttons on the pointer. Two
+controls affect this behavior: the <emphasis>
+MouseKeys</emphasis>
+ control determines whether or not simulation of the pointer device is active,
+as well as configuring the default button; the <emphasis>
+MouseKeysAccel</emphasis>
+ control determines the movement characteristics of the pointer when simulated
+via the keyboard. Both of them are boolean controls; as such, you may enable
+and disable them using either the <emphasis>
+EnabledControls</emphasis>
+ control or the <emphasis>
+AutoReset</emphasis>
+ control discussed in section 10.1.1. The individual keys that simulate  <!-- xref -->
+different aspects of the pointer device are determined by the keyboard mapping,
+discussed in Chapter 16. <!-- xref -->
+</para>
+
+
+<sect2 id='The_MouseKeys_Control'>
+<title>The MouseKeys Control</title>
+
+<para>
+The <emphasis>
+MouseKeys</emphasis>
+ control allows a user to control all the mouse functions from the keyboard.
+When <emphasis>
+MouseKeys</emphasis>
+ are enabled, all keys with <emphasis>
+MouseKeys</emphasis>
+ actions bound to them generate core pointer events instead of normal <emphasis>
+KeyPress</emphasis>
+ and <emphasis>
+KeyRelease</emphasis>
+ events.
+</para>
+
+
+<para>
+The <emphasis>
+MouseKeys</emphasis>
+ control has a single attribute, <emphasis>
+mk_dflt_btn</emphasis>
+ that specifies the core button number to be used by mouse keys actions that do
+not explicitly specify a button. There is no convenience function for getting
+or setting the attribute; instead use <emphasis>
+XkbGetControls</emphasis>
+ and <emphasis>
+XkbSetControls</emphasis>
+ (see sections 10.9 and 10.10). <!-- xref -->
+</para>
+
+<note><para><emphasis>
+MouseKeys</emphasis>
+ can also be turned on and off by pressing the key combination necessary to
+produce an <emphasis>
+XK_Pointer_EnableKeys</emphasis>
+ keysym. The de facto default standard for this is <emphasis>
+Shift+Alt+NumLock</emphasis>
+, but this may vary depending on the keymap.</para></note>
+
+</sect2>
+<sect2 id='The_MouseKeysAccel_Control'>
+<title>The MouseKeysAccel Control</title>
+
+<para>
+When the <emphasis>
+MouseKeysAccel</emphasis>
+ control is enabled, the effect of a key-activated pointer motion action
+changes as a key is held down. If the control is disabled, pressing a
+mouse-pointer key yields one mouse event. When <emphasis>
+MouseKeysAccel</emphasis>
+ is enabled, mouse movement is defined by an initial distance specified in the
+<emphasis>
+XkbSA_MovePtr</emphasis>
+ action and the following fields in the <emphasis>
+XkbControlsRec</emphasis>
+ structure (see section 10.8). <!-- xref -->
+</para>
+
+<table frame='topbot'>
+<title>MouseKeysAccel Fields</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Field</entry>
+  <entry>Function</entry>
+</row>
+</thead>
+<tbody>
+<row>
+    <entry>mk_delay</entry>
+    <entry>Time (ms) between the initial key press and the first repeated
+motion event</entry>
+</row>
+<row>
+    <entry>mk_interval</entry>
+    <entry>Time (ms) between repeated motion events</entry>
+</row>
+<row>
+    <entry>mk_time_to_max</entry>
+    <entry>Number of events (count) before the pointer reaches maximum
+speed</entry>
+</row>
+<row>
+    <entry>mk_max_speed</entry>
+    <entry>The maximum speed (in pixels per event) the pointer reaches</entry>
+</row>
+<row>
+    <entry>mk_curve</entry>
+    <entry>The ramp used to reach maximum pointer speed</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+There are no convenience functions to query or change the attributes of the
+<emphasis>
+MouseKeysAccel</emphasis>
+ control; instead use <emphasis>
+XkbGetControls</emphasis>
+ and <emphasis>
+XkbSetControls</emphasis>
+ (see sections 10.9 and 10.10). <!-- xref -->
+</para>
+
+
+<para>
+The effects of the attributes of the <emphasis>
+MouseKeysAccel</emphasis>
+ control depend on whether the <emphasis>
+XkbSA_MovePtr</emphasis>
+ action (see section 16.1) specifies relative or absolute pointer motion. <!-- xref -->
+</para>
+
+<sect3 id='Absolute_Pointer_Motion'>
+<title>Absolute Pointer Motion</title>
+
+<para>
+If an <emphasis>
+XkbSA_MovePtr</emphasis>
+ action specifies an absolute position for one of the coordinates but still
+allows acceleration, all repeated events contain any absolute coordinates
+specified in the action. For example, if the <emphasis>
+XkbSA_MovePtr</emphasis>
+ action specifies an absolute position for the X direction, but a relative
+motion for the Y direction, the pointer accelerates in the Y direction, but
+stays at the same X position.
+</para>
+
+
+</sect3>
+<sect3 id='Relative_Pointer_Motion'>
+<title>Relative Pointer Motion</title>
+
+<para>
+If the <emphasis>
+XkbSA_MovePtr</emphasis>
+ action specifies relative motion, the initial event always moves the cursor
+the distance specified in the action. After <emphasis>
+mk_delay</emphasis>
+ milliseconds, a second motion event is generated, and another occurs every
+<emphasis>
+mk_interval</emphasis>
+ milliseconds until the user releases the key.
+</para>
+
+
+<para>
+Between the time of the second motion event and <emphasis>
+mk_time_to_max</emphasis>
+ intervals, the change in pointer distance per interval increases with each
+interval. After <emphasis>
+mk_time_to_max</emphasis>
+ intervals have elapsed, the change in pointer distance per interval remains
+the same and is calculated by multiplying the original distance specified in
+the action by <emphasis>
+mk_max_speed</emphasis>
+.
+</para>
+
+
+<para>
+For example, if the <emphasis>
+XkbSA_MovePtr</emphasis>
+ action specifies a relative motion in the X direction of 5, <emphasis>
+mk_delay</emphasis>
+=160, <emphasis>
+mk_interval</emphasis>
+=40, <emphasis>
+mk_time_to_max</emphasis>
+=30, and <emphasis>
+mk_max_speed</emphasis>
+=30, the following happens when the user presses the key:
+</para>
+
+<itemizedlist>
+<listitem>
+  <para>
+The pointer immediately moves 5 pixels in the X direction when the key is
+pressed.
+  </para>
+</listitem>
+<listitem>
+  <para>
+After 160 milliseconds (<emphasis>
+mk_delay</emphasis>
+), and every 40 milliseconds thereafter (<emphasis>
+mk_interval</emphasis>
+), the pointer moves in the X direction.
+  </para>
+</listitem>
+<listitem>
+  <para>
+The distance in the X direction increases with each interval until 30 intervals
+(<emphasis>
+mk_time_to_max</emphasis>
+) have elapsed.
+  </para>
+</listitem>
+<listitem>
+  <para>
+After 30 intervals, the pointer stops accelerating, and moves 150 pixels
+(<emphasis>
+mk_max_speed</emphasis>
+ * the original distance) every interval thereafter, until the key is released.
+  </para>
+</listitem>
+</itemizedlist>
+
+<para>
+The increase in pointer difference for each interval is a function of<emphasis>
+ mk_curve.</emphasis>
+ Events after the first but before maximum acceleration has been achieved are
+accelerated according to the formula:
+</para>
+
+<mediaobject>
+ <imageobject> <imagedata format="SVG" fileref="XKBlib-3.svg"/>
+ </imageobject>
+ </mediaobject>
+
+
+<para>
+Where <emphasis>
+action_delta</emphasis>
+ is the relative motion specified by the <emphasis>
+XkbSA_MovePtr</emphasis>
+ action, <emphasis>
+mk_max_speed </emphasis>
+and <emphasis>
+mk_time_to_max</emphasis>
+ are parameters to the <emphasis>
+MouseKeysAccel</emphasis>
+ control, and the curveFactor is computed using the <emphasis>
+MouseKeysAccel</emphasis>
+ <emphasis>
+mk_curve</emphasis>
+ parameter as follows:
+</para>
+
+<mediaobject>
+ <imageobject> <imagedata format="SVG" fileref="XKBlib-4.svg"/>
+ </imageobject>
+ </mediaobject>
+
+
+<para>
+With the result that a <emphasis>
+mk_curve</emphasis>
+ of zero causes the distance moved to increase linearly from <emphasis>
+action_delta</emphasis>
+ to <mediaobject>
+ <imageobject> <imagedata format="SVG" fileref="XKBlib-5.svg"/>
+ </imageobject>
+ </mediaobject>
+
+. A negative <emphasis>
+mk_curve</emphasis>
+ causes an initial sharp increase in acceleration that tapers off, and a
+positive curve yields a slower initial increase in acceleration followed by a
+sharp increase as the number of pointer events generated by the action
+approaches <emphasis>
+mk_time_to_max</emphasis>
+. The legal values for <emphasis>
+mk_curve</emphasis>
+ are between -1000 and 1000.
+</para>
+
+
+<para>
+A distance vs. time graph of the pointer motion is shown in Figure 10.1. <!-- xref -->
+</para>
+
+<mediaobject>
+ <imageobject> <imagedata format="SVG" fileref="XKBlib-6.svg"/>
+ </imageobject>
+<caption>MouseKeys Acceleration</caption>
+ </mediaobject>
+
+<!--
+<H5 CLASS="Figure">
+MouseKeys Acceleration</H5>
+-->
+</sect3>
+</sect2>
+</sect1>
+<sect1 id='Controls_for_Better_Keyboard_Access_by_Physically_ImpairedPersons'>
+<title>Controls for Better Keyboard Access by Physically Impaired
+Persons</title>
+
+<para>
+The Xkb extension includes several controls specifically aimed at making
+keyboard use more effective for physically impaired people. All of these
+controls are boolean controls and may be individually enabled and disabled, as
+well as configured to tune their specific behavior. The behavior of these
+controls is based on the AccessDOS package
+<footnote><para>
+AccessDOS provides access to the DOS operating system for people with physical
+impairments and was developed by the Trace R&amp;D Center at the University of
+Wisconsin. For more information on AccessDOS, contact the Trace R&amp;D Center,
+Waisman Center and Department of Industrial Engineering, University of
+Wisconsin-Madison WI 53705-2280. Phone: 608-262-6966. e-mail: info@trace.wisc.edu.
+</para></footnote>.
+</para>
+
+<sect2 id='The_AccessXKeys_Control'>
+<title>The AccessXKeys Control</title>
+
+<para>
+Enabling or disabling the keyboard controls through a graphical user interface
+may be impossible for people who need to use the controls. For example, a user
+who needs <emphasis>
+SlowKeys</emphasis>
+ (see section 10.6.6) may not even be able to start the graphical application,  <!-- xref -->
+let alone use it, if <emphasis>
+SlowKeys</emphasis>
+ is not enabled. To allow easier access to some of the controls, the <emphasis>
+AccessXKeys</emphasis>
+ control provides a set of special key sequences similar to those available in
+AccessDOS.
+</para>
+
+
+<para>
+When the <emphasis>
+AccessXKeys</emphasis>
+ control is enabled, the user can turn controls on or off from the keyboard by
+entering the following standard key sequences:
+</para>
+
+<itemizedlist>
+<listitem>
+  <para>
+Holding down a shift key by itself for eight seconds toggles the <emphasis>
+SlowKeys</emphasis>
+ control.
+  </para>
+</listitem>
+<listitem>
+  <para>
+Pressing and releasing the left or right <emphasis>
+Shift</emphasis>
+ key five times in a row, without any intervening key events and with less than
+30 seconds delay between consecutive presses, toggles the state of the
+<emphasis>
+StickyKeys</emphasis>
+ control.
+  </para>
+</listitem>
+<listitem>
+  <para>
+Simultaneously operating two or more modifier keys deactivates the <emphasis>
+StickyKeys</emphasis>
+ control.
+  </para>
+</listitem>
+</itemizedlist>
+
+<para>
+When the <emphasis>
+AccessXKeys</emphasis>
+ control is disabled, Xkb does not look for the above special key sequences.
+</para>
+
+
+<para>
+Some of these key sequences optionally generate audible feedback of the change
+in state, as described in section 10.6.3, or  <!-- xref -->
+<emphasis>XkbControlsNotify</emphasis>
+ events, described in section 10.11. <!-- xref -->
+</para>
+
+</sect2>
+<sect2 id='The_AccessXTimeout_Control'>
+<title>The AccessXTimeout Control</title>
+
+<para>
+In environments where computers are shared, features such as <emphasis>
+SlowKeys</emphasis>
+ present a problem: if <emphasis>
+SlowKeys</emphasis>
+ is on, the keyboard can appear to be unresponsive because keys are not
+accepted until they are held for a certain period of time. To help solve this
+problem, Xkb provides an <emphasis>
+AccessXTimeout</emphasis>
+ control to automatically change the enabled/disabled state of any boolean
+controls and to change the value of the <emphasis>
+AccessXKeys</emphasis>
+ and <emphasis>
+AccessXFeedback</emphasis>
+ control attributes if the keyboard is idle for a specified period of time.
+</para>
+
+
+<para>
+When a timeout as specified by <emphasis>
+AccessXTimeout</emphasis>
+ occurs and a control is consequently modified, Xkb generates an <emphasis>
+XkbControlsNotify</emphasis>
+ event. For more information on <emphasis>
+XkbControlsNotify</emphasis>
+ events, refer to section 10.11. <!-- xref -->
+</para>
+
+
+<para>
+Use <emphasis>
+XkbGetAccessXTimeout</emphasis>
+ to query the current <emphasis>
+AccessXTimeout</emphasis>
+ options for a keyboard device.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbGetAccessXTimeout</emphasis>
+(<emphasis>
+display</emphasis>
+,<emphasis>
+ device_spec</emphasis>
+,<emphasis>
+ timeout_rtrn</emphasis>
+,<emphasis>
+ ctrls_mask_rtrn</emphasis>
+,<emphasis>
+ ctrls_values_rtrn</emphasis>
+,<emphasis>
+ options_mask_rtrn, options_values_rtrn</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *<emphasis>
+      display</emphasis>
+;                  /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+device_spec</emphasis>
+;                  /* device to query, or <emphasis>
+XkbUseCoreKbd</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned short *      <emphasis>
+timeout_rtrn</emphasis>
+;                  /* delay until AccessXTimeout, seconds */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int *<emphasis>
+      ctrls_mask_rtrn</emphasis>
+;                  /* backfilled with controls to modify */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int *      <emphasis>
+ctrls_values_rtrn</emphasis>
+;                  /* backfilled with on/off status for controls */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned short *      <emphasis>
+opts_mask_rtrn</emphasis>
+;                  /* backfilled with <emphasis>
+ax_options</emphasis>
+ to modify */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned short *      <emphasis>
+opts_values_rtrn</emphasis>
+;                  /* backfilled with values for <emphasis>
+ax_options</emphasis>
+ */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetAccessXTimeout</emphasis>
+ sends a request to the X server to obtain the current values for the <emphasis>
+AccessXTimeout</emphasis>
+ attributes, waits for a reply, and backfills the values into the appropriate
+arguments.<emphasis>
+ </emphasis>
+The parameters <emphasis>
+opts_mask_rtrn</emphasis>
+ and <emphasis>
+opts_values_rtrn</emphasis>
+ are backfilled with the options to modify and the values for <emphasis>
+ax_options</emphasis>
+, which is a field in the
+<emphasis>XkbControlsRec</emphasis>
+ structure (see section 10.8).  <!-- xref -->
+<emphasis>
+XkbGetAccessXTimeout </emphasis>
+returns<emphasis>
+ </emphasis>
+<emphasis>
+True</emphasis>
+ if successful; if a compatible version of the Xkb extension is not available
+in the server, <emphasis>
+XkbGetAccessXTimeout</emphasis>
+ returns <emphasis>
+False</emphasis>
+.
+</para>
+
+
+<para>
+To configure the <emphasis>
+AccessXTimeout</emphasis>
+ options for a keyboard device, use <emphasis>
+XkbSetAccessXTimeout</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbSetAccessXTimeout</emphasis>
+(<emphasis>
+display</emphasis>
+,<emphasis>
+ device_spec, timeout, ctrls_mask, ctrls_values, opts_mask,
+opts_values</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *<emphasis>
+      display</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+      device_spec</emphasis>
+;            /* device to configure, or <emphasis>
+XkbUseCoreKbd</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned short      <emphasis>
+timeout</emphasis>
+;            /* seconds idle until AccessXTimeout occurs */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+      ctrls_mask</emphasis>
+;            /* boolean controls to modify */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+      ctrls_values</emphasis>
+;            /* new bits for controls selected by <emphasis>
+ctrls_mask</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned short      <emphasis>
+opts_mask</emphasis>
+;            /* <emphasis>
+ax_options</emphasis>
+ to change */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned short      <emphasis>
+opts_values</emphasis>
+;            /* new bits for <emphasis>
+ax_options</emphasis>
+ selected by <emphasis>
+opts_mask</emphasis>
+ */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+timeout</emphasis>
+ specifies the number of seconds the keyboard must be idle before the controls
+are modified. <emphasis>
+ctrls_mask</emphasis>
+ specifies what controls are to be enabled or disabled, and <emphasis>
+ctrls_values</emphasis>
+ specifies whether those controls are to be enabled or disabled. The bit values
+correspond to those for enabling and disabling boolean controls (see section
+10.1.1). The <emphasis>
+opts_mask</emphasis>
+ field specifies which attributes of the <emphasis>
+AccessXKeys</emphasis>
+ and <emphasis>
+AccessXFeedback</emphasis>
+ controls are to be changed, and <emphasis>
+opts_values</emphasis>
+ specifies the new values for those options. The bit values correspond to those
+for the <emphasis>
+ax_options</emphasis>
+ field of an <emphasis>
+XkbDescRec</emphasis>
+ (see section 10.8). <!-- xref -->
+</para>
+
+
+<para>
+<emphasis>
+XkbSetAccessXTimeout</emphasis>
+ sends a request to configure the <emphasis>
+AccessXTimeout</emphasis>
+ control to the server.<emphasis>
+ </emphasis>
+It does not wait for a reply, and normally returns <emphasis>
+True</emphasis>
+. If a compatible version of the Xkb extension is not available in the server,
+<emphasis>
+XkbSetAccessXTimeout</emphasis>
+ returns <emphasis>
+False</emphasis>
+.
+</para>
+
+
+</sect2>
+<sect2 id='The_AccessXFeedback_Control'>
+<title>The AccessXFeedback Control</title>
+
+<para>
+Just as some keyboards can produce keyclicks to indicate when a key is pressed
+or repeating, Xkb can provide feedback for the controls by using special beep
+codes. Use the <emphasis>
+AccessXFeedback</emphasis>
+ control to configure the specific types of operations that generate feedback.
+</para>
+
+
+<para>
+There is no convenience function for modifying the <emphasis>
+AccessXFeedback</emphasis>
+ control, although the feedback as a whole can be enabled or disabled just as
+other boolean controls are (see section 10.1). Individual beep codes are turned
+on or off by modifying the following bits in the <emphasis>
+ax_options</emphasis>
+ field of an <emphasis>
+XkbControlsRec</emphasis>
+ structure and using <emphasis>
+XkbSetControls</emphasis>
+ (see section 10.10): <!-- xref -->
+</para>
+
+<table frame='topbot'>
+<title>AccessXFeedback Masks</title>
+<?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>Action</entry>
+  <entry>Beep Code</entry>
+  <entry>ax_options bit</entry>
+  </row>
+</thead>
+<tbody>
+<row>
+    <entry>LED turned on</entry>
+    <entry>High-pitched beep</entry>
+    <entry>XkbAX_IndicatorFBMask</entry>
+</row>
+<row>
+    <entry>LED turned off</entry>
+    <entry>Low-pitched beep</entry>
+    <entry>XkbAX_IndicatorFBMask</entry>
+</row>
+<row>
+    <entry>More than one LED changed state</entry>
+    <entry>Two high-pitched beeps</entry>
+    <entry>XkbAX_IndicatorFBMask</entry>
+</row>
+<row>
+    <entry>Control turned on</entry>
+    <entry>Rising tone</entry>
+    <entry>XkbAX_FeatureFBMask</entry>
+</row>
+<row>
+    <entry>Control turned off</entry>
+    <entry>Falling tone</entry>
+    <entry>XkbAX_FeatureFBMask</entry>
+</row>
+<row>
+    <entry>More than one control changed state</entry>
+    <entry>Two high-pitched beeps</entry>
+    <entry>XkbAX_FeatureFBMask</entry>
+</row>
+<row>
+    <entry>SlowKeys and BounceKeys about to be turned on or off</entry>
+    <entry>Three high-pitched beeps</entry>
+    <entry>XkbAX_SlowWarnFBMask</entry>
+</row>
+<row>
+    <entry>SlowKeys key pressed</entry>
+    <entry>Medium-pitched beep</entry>
+    <entry>XkbAX_SKPressFBMask</entry>
+</row>
+<row>
+    <entry>SlowKeys key accepted</entry>
+    <entry>Medium-pitched beep</entry>
+    <entry>XkbAX_SKAcceptFBMask</entry>
+</row>
+<row>
+    <entry>SlowKeys key rejected</entry>
+    <entry>Low-pitched beep</entry>
+    <entry>XkbAX_SKRejectFBMask</entry>
+</row>
+<row>
+    <entry>Accepted SlowKeys key released</entry>
+    <entry>Medium-pitched beep</entry>
+    <entry>XkbAX_SKReleaseFBMask</entry>
+</row>
+<row>
+    <entry>BounceKeys key rejected</entry>
+    <entry>Low-pitched beep</entry>
+    <entry>XkbAX_BKRejectFBMask</entry>
+</row>
+<row>
+    <entry>StickyKeys key latched</entry>
+    <entry>Low-pitched beep followed by high-pitched beep</entry>
+    <entry>XkbAX_StickyKeysFBMask</entry>
+</row>
+<row>
+    <entry>StickyKeys key locked</entry>
+    <entry>High-pitched beep</entry>
+    <entry>XkbAX_StickyKeysFBMask</entry>
+</row>
+<row>
+    <entry>StickyKeys key unlocked</entry>
+    <entry>Low-pitched beep</entry>
+    <entry>XkbAX_StickyKeysFBMask</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+Implementations that cannot generate continuous tones may generate multiple
+beeps instead of falling and rising tones; for example, they can generate a
+high-pitched beep followed by a low-pitched beep instead of a continuous
+falling tone. Other implementations can only ring the bell with one fixed
+pitch. In these cases, use the <emphasis>
+XkbAX_DumbBellFBMask</emphasis>
+ bit of <emphasis>
+ax_options</emphasis>
+ to indicate that the bell can only ring with a fixed pitch.
+</para>
+
+
+<para>
+When any of the above feedbacks occur, Xkb may generate a <emphasis>
+XkbBellNotify</emphasis>
+ event (see section 9.4). <!-- xref -->
+</para>
+
+
+</sect2>
+<sect2 id='AccessXNotify_Events'>
+<title>AccessXNotify Events</title>
+
+<para>
+The server can generate <emphasis>
+XkbAccessXNotify</emphasis>
+ events for some of the global keyboard controls. The structure for the
+<emphasis>
+XkbAccessXNotify</emphasis>
+ event type is as follows:
+</para>
+
+<para><programlisting>
+typedef struct {
+      int             type;            /* Xkb extension base event code */
+      unsigned long   serial;          /* X server serial number for event */
+      Bool            send_event;      /* <emphasis> True</emphasis> =&gt; synthetically generated */
+      Display *       display;         /* server connection where event generated */
+      Time            time;            /* server time when event generated */
+      int             xkb_type;        /* <emphasis> XkbAccessXNotify</emphasis> */
+      int             device;          /* Xkb device ID, will not be <emphasis> XkbUseCoreKbd</emphasis> */
+      int             detail;          /* XkbAXN_* */
+      KeyCode         keycode;         /* key of event */
+      int             slowKeysDelay;   /* current SlowKeys delay */
+      int             debounceDelay;   /* current debounce delay */
+} <emphasis>XkbAccessXNotifyEvent</emphasis>;
+</programlisting></para>
+
+<para>
+The <emphasis>
+detail</emphasis>
+ field describes what AccessX event just occurred and can be any of the values
+in Table 10.4. <!-- xref -->
+</para>
+
+<table frame='topbot'>
+<title>AccessXNotify Events</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>detail</entry>
+  <entry>Reason</entry>
+</row>
+</thead>
+<tbody>
+<row>
+    <entry>XkbAXN_SKPress</entry>
+    <entry>A key was pressed when SlowKeys was enabled.</entry>
+</row>
+<row>
+    <entry>XkbAXN_SKAccept</entry>
+    <entry>A key was accepted (held longer than the SlowKeys delay).</entry>
+</row>
+<row>
+    <entry>XkbAXN_SKRelease</entry>
+    <entry>An accepted SlowKeys key was released.</entry>
+</row>
+<row>
+    <entry>XkbAXN_SKReject</entry>
+    <entry>A key was rejected (released before the SlowKeys delay
+expired).</entry>
+</row>
+<row>
+    <entry>XkbAXN_BKAccept</entry>
+    <entry>A key was accepted by BounceKeys.</entry>
+</row>
+<row>
+    <entry>XkbAXN_BKReject</entry>
+    <entry>A key was rejected (pressed before the BounceKeys delay
+expired).</entry>
+</row>
+<row>
+    <entry>XkbAXN_AXKWarning</entry>
+    <entry>AccessXKeys is about to turn on/off StickyKeys or BounceKeys.</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+The <emphasis>
+keycode</emphasis>
+ field reports the keycode of the key for which the event occurred. If the
+action is related to <emphasis>
+SlowKeys</emphasis>
+, the <emphasis>
+slowKeysDelay</emphasis>
+ field contains the current <emphasis>
+SlowKeys</emphasis>
+ acceptance delay. If the action is related to <emphasis>
+BounceKeys</emphasis>
+, the <emphasis>
+debounceDelay</emphasis>
+ field contains the current <emphasis>
+BounceKeys</emphasis>
+ debounce delay.
+</para>
+
+<sect3 id='Selecting_for_AccessX_Events'>
+<title>Selecting for AccessX Events</title>
+
+<para>
+To receive <emphasis>
+XkbAccessXNotify</emphasis>
+ events under all possible conditions, use <emphasis>
+XkbSelectEvents</emphasis>
+ (see section 4.3) and pass <emphasis> <!-- xref -->
+XkbAccesXNotifyMask</emphasis>
+ in both <emphasis>
+bits_to_change</emphasis>
+ and <emphasis>
+values_for_bits</emphasis>
+.
+</para>
+
+
+<para>
+To receive <emphasis>
+XkbStateNotify</emphasis>
+ events only under certain conditions, use <emphasis>
+XkbSelectEventDetails</emphasis>
+ using <emphasis>
+XkbAccessXNotify</emphasis>
+ as the <emphasis>
+event_type</emphasis>
+ and specifying the desired state changes in <emphasis>
+bits_to_change</emphasis>
+ and <emphasis>
+values_for_bits</emphasis>
+ using mask bits from Table 10.5. <!-- xref -->
+</para>
+
+<table frame='topbot'>
+<title>AccessXNotify Event Details</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='3' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.5*'/>
+<colspec colname='c2' colwidth='1.0*'/>
+<colspec colname='c3' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>XkbAccessXNotify Event Details</entry>
+  <entry>Value</entry>
+  <entry>Circumstances</entry>
+  </row>
+</thead>
+<tbody>
+  <row>
+    <entry>XkbAXN_SKPressMask</entry>
+    <entry>(1&lt;&lt;0)</entry>
+    <entry>Slow key press notification wanted</entry>
+  </row>
+  <row>
+    <entry>XkbAXN_SKAcceptMask</entry>
+    <entry>(1&lt;&lt;1)</entry>
+    <entry>Slow key accept notification wanted</entry>
+  </row>
+  <row>
+    <entry>XkbAXN_SKRejectMask</entry>
+    <entry>(1&lt;&lt;2)</entry>
+    <entry>Slow key reject notification wanted</entry>
+  </row>
+  <row>
+    <entry>XkbAXN_SKReleaseMask</entry>
+    <entry>(1&lt;&lt;3)</entry>
+    <entry>Slow key release notification wanted</entry>
+  </row>
+  <row>
+    <entry>XkbAXN_BKAcceptMask</entry>
+    <entry>(1&lt;&lt;4)</entry>
+    <entry>Bounce key accept notification wanted</entry>
+  </row>
+  <row>
+    <entry>XkbAXN_BKRejectMask</entry>
+    <entry>(1&lt;&lt;5)</entry>
+    <entry>Bounce key reject notification wanted</entry>
+  </row>
+  <row>
+    <entry>XkbAXN_AXKWarningMask</entry>
+    <entry>(1&lt;&lt;6)</entry>
+    <entry>AccessX warning notification wanted</entry>
+  </row>
+  <row>
+    <entry>XkbAXN_AllEventsMask</entry>
+    <entry>(0x7f)</entry>
+    <entry>All AccessX features notifications wanted</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+</sect3>
+</sect2>
+<sect2 id='StickyKeys_RepeatKeys_and_MouseKeys_Events'>
+<title>StickyKeys, RepeatKeys, and MouseKeys Events</title>
+
+<para>
+The <emphasis>
+StickyKeys</emphasis>
+, <emphasis>
+RepeatKeys</emphasis>
+, and <emphasis>
+MouseKeys</emphasis>
+ controls do not generate specific events. Instead, the latching, unlatching,
+locking, or unlocking of modifiers using <emphasis>
+StickyKeys</emphasis>
+ generates <emphasis>
+XkbStateNotify</emphasis>
+ events as described in section 5.4. Repeating keys generate normal <emphasis> <!-- xref -->
+KeyPress</emphasis>
+ and <emphasis>
+KeyRelease</emphasis>
+ events, though the auto-repeat can be detected using <emphasis>
+DetectableAutorepeat</emphasis>
+ (see section 10.3.3). Finally, <emphasis> <!-- xref -->
+MouseKeys</emphasis>
+ generates pointer events identical to those of the core pointer device.
+</para>
+
+
+</sect2>
+<sect2 id='The_SlowKeys_Control'>
+<title>The SlowKeys Control</title>
+
+<para>
+Some users may accidentally bump keys while moving a hand or typing stick
+toward the key they want. Usually, the keys that are accidentally bumped are
+just hit for a very short period of time. The <emphasis>
+SlowKeys</emphasis>
+ control helps filter these accidental bumps by telling the server to wait a
+specified period, called the <emphasis>
+SlowKeys acceptance delay</emphasis>
+, before delivering key events. If the key is released before this period
+elapses, no key events are generated. Users can then bump any number of keys on
+their way to the one they want without accidentally getting those characters.
+Once they have reached the key they want, they can then hold the desired key
+long enough for the computer to accept it. <emphasis>
+SlowKeys</emphasis>
+ is a boolean control with one configurable attribute.
+</para>
+
+<para>
+When the <emphasis>
+SlowKeys</emphasis>
+ control is active, the server reports the initial key press, subsequent
+acceptance or rejection, and release of any key to interested clients by
+sending an appropriate <emphasis>
+AccessXNotify</emphasis>
+ event (see section 10.6.4). <!-- xref -->
+</para>
+
+<para>
+To get the <emphasis>
+SlowKeys</emphasis>
+ acceptance delay for a keyboard device, use <emphasis>
+XkbGetSlowKeysDelay</emphasis>
+.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbGetSlowKeysDelay</emphasis>
+(<emphasis>
+display</emphasis>
+,<emphasis>
+ device_spec</emphasis>
+,<emphasis>
+ delay_rtrn</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *<emphasis>
+            display</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+device_spec</emphasis>
+;            /* device ID, or <emphasis>
+XkbUseCoreKbd</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int *      <emphasis>
+delay_rtrn</emphasis>
+;            /* backfilled with <emphasis>
+SlowKeys</emphasis>
+ delay, ms */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetSlowKeysDelay </emphasis>
+requests the attributes of the <emphasis>
+SlowKeys</emphasis>
+ control from the server, waits for a reply and backfills <emphasis>
+delay_rtrn </emphasis>
+with the <emphasis>
+SlowKeys</emphasis>
+ delay attribute. <emphasis>
+XkbGetSlowKeysDelay </emphasis>
+returns <emphasis>
+True</emphasis>
+ if successful; if a compatible version of the Xkb extension is not available
+in the server, <emphasis>
+XkbGetSlowKeysDelay</emphasis>
+ returns <emphasis>
+False</emphasis>
+.
+</para>
+
+
+<para>
+To set the <emphasis>
+SlowKeys</emphasis>
+ acceptance delay for a keyboard device, use <emphasis>
+XkbSetSlowKeysDelay</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbSetSlowKeysDelay</emphasis>
+(<emphasis>
+display</emphasis>
+,<emphasis>
+ device_spec</emphasis>
+,<emphasis>
+ delay</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *<emphasis>
+      display</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+device_spec</emphasis>
+;            /* device to configure, or <emphasis>
+XkbUseCoreKbd</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+delay</emphasis>
+;            /* <emphasis>
+SlowKeys</emphasis>
+ delay, ms */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbSetSlowKeysDelay</emphasis>
+ sends a request to configure the <emphasis>
+SlowKeys</emphasis>
+ control to the server.<emphasis>
+ </emphasis>
+It does not wait for a reply, and normally returns <emphasis>
+True</emphasis>
+. Specifying a value of <emphasis>
+0</emphasis>
+ for the <emphasis>
+delay </emphasis>
+parameter causes <emphasis>
+XkbSetSlowKeys</emphasis>
+ to generate a <emphasis>
+BadValue</emphasis>
+ protocol error. If a compatible version of the Xkb extension is not available
+in the server <emphasis>
+XkbSetSlowKeysDelay</emphasis>
+ returns <emphasis>
+False</emphasis>
+.
+</para>
+
+
+</sect2>
+<sect2 id='The_BounceKeys_Control'>
+<title>The BounceKeys Control</title>
+
+<para>
+Some users may accidentally "bounce" on a key when they release it. They press
+it once, then accidentally press it again after they release it. The <emphasis>
+BounceKeys</emphasis>
+ control temporarily disables a key after it has been pressed, effectively
+"debouncing" the keyboard. The period of time the key is disabled after it is
+released is known as the <emphasis>
+BounceKeys delay</emphasis>
+. <emphasis>
+BounceKeys</emphasis>
+ is a boolean control.
+</para>
+
+
+<para>
+When the <emphasis>
+BounceKeys</emphasis>
+ control is active, the server reports acceptance or rejection of any key to
+interested clients by sending an appropriate <emphasis>
+AccessXNotify</emphasis>
+ event (see section 10.6.4). <!-- xref -->
+</para>
+
+
+<para>
+Use <emphasis>
+XkbGetBounceKeysDelay</emphasis>
+ to query the current <emphasis>
+BounceKeys</emphasis>
+ delay for a keyboard device.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbGetBounceKeysDelay</emphasis>
+(<emphasis>
+display</emphasis>
+,<emphasis>
+ device_spec</emphasis>
+,<emphasis>
+ delay_rtrn</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *<emphasis>
+      display</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+device_spec</emphasis>
+;            /* device ID, or <emphasis>
+XkbUseCoreKbd</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int *      <emphasis>
+delay_rtrn</emphasis>
+;            /* backfilled with bounce keys delay, ms */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetBounceKeysDelay </emphasis>
+requests the attributes of the <emphasis>
+BounceKeys</emphasis>
+ control from the server, waits for a reply, and backfills <emphasis>
+delay_rtrn </emphasis>
+with the <emphasis>
+BounceKeys</emphasis>
+ delay attribute. <emphasis>
+XkbGetBounceKeysDelay </emphasis>
+returns<emphasis>
+ </emphasis>
+<emphasis>
+True</emphasis>
+ if successful; if a compatible version of the Xkb extension is not available
+in the server <emphasis>
+XkbGetSlowKeysDelay</emphasis>
+ returns <emphasis>
+False</emphasis>
+.
+</para>
+
+
+<para>
+To set the <emphasis>
+BounceKeys</emphasis>
+ delay for a keyboard device, use <emphasis>
+XkbSetBounceKeysDelay</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbSetBounceKeysDelay</emphasis>
+(<emphasis>
+display</emphasis>
+,<emphasis>
+ device_spec</emphasis>
+,<emphasis>
+ delay</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *<emphasis>
+      display</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+      device_spec</emphasis>
+;            /* device to configure, or <emphasis>
+XkbUseCoreKbd</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+delay</emphasis>
+;            /* bounce keys delay, ms */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbSetBounceKeysDelay</emphasis>
+ sends a request to configure the <emphasis>
+BounceKeys</emphasis>
+ control to the server.<emphasis>
+ </emphasis>
+It does not wait for a reply and normally returns <emphasis>
+True</emphasis>
+. Specifying a value of <emphasis>
+zero </emphasis>
+for the <emphasis>
+delay </emphasis>
+parameter causes <emphasis>
+XkbSetBounceKeysDelay</emphasis>
+ to generate a <emphasis>
+BadValue</emphasis>
+ protocol error. If a compatible version of the Xkb extension is not available
+in the server, <emphasis>
+XkbSetBounceKeysDelay</emphasis>
+ returns <emphasis>
+False</emphasis>
+.
+</para>
+
+</sect2>
+<sect2 id='The_StickyKeys_Control'>
+<title>The StickyKeys Control</title>
+
+<para>
+Some people find it difficult or even impossible to press two keys at once. For
+example, a one-fingered typist or someone using a mouth stick cannot press the
+<emphasis>
+Shift</emphasis>
+ and <emphasis>
+1</emphasis>
+ keys at the same time. The <emphasis>
+StickyKeys</emphasis>
+ control solves this problem by changing the behavior of the modifier keys.
+With <emphasis>
+StickyKeys</emphasis>
+, the user can first press a modifier, release it, then press another key. For
+example, to get an exclamation point on a PC-style keyboard, the user can press
+the <emphasis>
+Shift</emphasis>
+ key, release it, and then press the <emphasis>
+1</emphasis>
+ key.
+</para>
+
+
+<para>
+<emphasis>
+StickyKeys</emphasis>
+ also allows users to lock modifier keys without requiring special locking
+keys. When <emphasis>
+StickyKeys</emphasis>
+ is enabled, a modifier is latched when the user presses it just once. The user
+can press a modifier twice in a row to lock it, and then unlock it by pressing
+it one more time.
+</para>
+
+
+<para>
+When a modifier is latched, it becomes unlatched when the user presses a
+nonmodifier key or a pointer button. For instance, to enter the sequence
+<emphasis>
+Shift</emphasis>
++<emphasis>
+Control</emphasis>
++<emphasis>
+Z</emphasis>
+ the user could press and release the <emphasis>
+Shift</emphasis>
+ key to latch it, then press and release the <emphasis>
+Control</emphasis>
+ key to latch it, and finally press and release the Z key. Because the
+<emphasis>
+Control</emphasis>
+ key is a modifier key, pressing it does not unlatch the <emphasis>
+Shift</emphasis>
+ key. Thus, after the user presses the <emphasis>
+Control</emphasis>
+ key, both the <emphasis>
+Shift</emphasis>
+ and <emphasis>
+Control</emphasis>
+ modifiers are latched. When the user presses the <emphasis>
+Z</emphasis>
+ key, the effect is as though the user had pressed <emphasis>
+Shift</emphasis>
++<emphasis>
+Control</emphasis>
++<emphasis>
+Z</emphasis>
+. In addition, because the <emphasis>
+Z</emphasis>
+ key is not a modifier key, the <emphasis>
+Shift</emphasis>
+ and <emphasis>
+Control</emphasis>
+ modifiers are unlatched.
+</para>
+
+
+<para>
+Locking a modifier key means that the modifier affects any key or pointer
+button the user presses until the user unlocks it or it is unlocked
+programmatically. For example, to enter the sequence ("XKB") on a keyboard
+where ‘(’ is a shifted ‘9’, ‘)’ is a shifted ‘0’, and ‘"’
+is a shifted single quote, the user could press and release the <emphasis>
+Shift</emphasis>
+ key twice to lock the <emphasis>
+Shift</emphasis>
+ modifier. Then, when the user presses the <emphasis>
+9</emphasis>
+, <emphasis>
+‘</emphasis>
+, <emphasis>
+x</emphasis>
+, <emphasis>
+k</emphasis>
+, <emphasis>
+b</emphasis>
+, <emphasis>
+‘</emphasis>
+, and <emphasis>
+0</emphasis>
+ keys in sequence, it generates ("XKB"). To unlock the <emphasis>
+Shift</emphasis>
+ modifier, the user can press and release the <emphasis>
+Shift</emphasis>
+ key.
+</para>
+
+
+<para>
+<emphasis>StickyKeys</emphasis>
+ is a boolean control with two separate attributes that may be individually
+configured: one to automatically disable it, and one to control the latching
+behavior of modifier keys.
+</para>
+
+<sect3 id='StickyKeys_Options'>
+<title>StickyKeys Options</title>
+
+<para>
+The <emphasis>
+StickyKeys</emphasis>
+ control has two options that can be accessed via the <emphasis>
+ax_options</emphasis>
+ of an <emphasis>
+XkbControlsRec</emphasis>
+ structure (see section 10.8). The first option, <emphasis>
+TwoKeys</emphasis>
+, specifies whether <emphasis>
+StickyKeys</emphasis>
+ should automatically turn off when two keys are pressed at the same time. This
+feature is useful for shared computers so people who do not want them do not
+need to turn <emphasis>
+StickyKeys</emphasis>
+ off if a previous user left <emphasis>
+StickyKeys</emphasis>
+ on. The second option, <emphasis>
+LatchToLock</emphasis>
+, specifies whether or not <emphasis>
+StickyKeys</emphasis>
+ locks a modifier when pressed twice in a row.
+</para>
+
+
+<para>
+Use <emphasis>
+XkbGetStickyKeysOptions</emphasis>
+ to query the current <emphasis>
+StickyKeys</emphasis>
+ attributes for a keyboard device.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbGetStickyKeysOptions</emphasis>
+(<emphasis>
+display</emphasis>
+,<emphasis>
+ device_spec</emphasis>
+,<emphasis>
+ options_rtrn</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *<emphasis>
+      display</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+device_spec</emphasis>
+;            /* device ID, or <emphasis>
+XkbUseCoreKbd</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int *      <emphasis>
+options_rtrn</emphasis>
+;            /* backfilled with StickyKeys option mask */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetStickyKeysOptions </emphasis>
+requests the attributes of the <emphasis>
+StickyKeys</emphasis>
+ control from the server, waits for a reply, and backfills <emphasis>
+options_rtrn </emphasis>
+with a mask indicating whether the individual <emphasis>
+StickyKeys</emphasis>
+ options are on or off. Valid bits in <emphasis>
+options_rtrn</emphasis>
+ are:
+</para>
+
+<para>
+<programlisting>
+     <emphasis>XkbAX_TwoKeysMask</emphasis>
+     <emphasis>XkbAX_LatchToLockMask</emphasis>
+</programlisting>
+</para>
+
+<para>
+<emphasis>
+XkbGetStickyKeysOptions </emphasis>
+returns <emphasis>
+True</emphasis>
+ if successful; if a compatible version of the Xkb extension is not available
+in the server <emphasis>
+XkbGetStickyKeysOptions</emphasis>
+ returns <emphasis>
+False</emphasis>
+.
+</para>
+
+
+<para>
+To set the <emphasis>
+StickyKeys</emphasis>
+ attributes for a keyboard device, use <emphasis>
+XkbSetStickyKeysOptions</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbSetStickyKeysOptions</emphasis>
+(<emphasis>
+display</emphasis>
+,<emphasis>
+ device_spec, mask, values</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *<emphasis>
+      display</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+device_spec</emphasis>
+;            /* device to configure, or XkbUseCoreKbd */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+mask</emphasis>
+;            /* selects StickyKeys attributes to modify */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+values;</emphasis>
+            /* values for selected attributes */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbSetStickyKeysOptions</emphasis>
+ sends a request to configure the <emphasis>
+StickyKeys</emphasis>
+ control to the server.<emphasis>
+ </emphasis>
+It does not wait for a reply and normally returns <emphasis>
+True</emphasis>
+. The valid bits to use for both the <emphasis>
+mask</emphasis>
+ and <emphasis>
+values</emphasis>
+ parameters are:
+</para>
+
+<para>
+<programlisting>
+     <emphasis>XkbAX_TwoKeysMask</emphasis>
+     <emphasis>XkbAX_LatchToLockMask</emphasis>
+</programlisting>
+</para>
+
+<para>
+ If a compatible version of the Xkb extension is not available in the server,
+<emphasis>
+XkbSetStickyKeysOptions</emphasis>
+ returns <emphasis>
+False</emphasis>
+.
+</para>
+
+</sect3>
+</sect2>
+</sect1>
+<sect1 id='Controls_for_General_Keyboard_Mapping'>
+<title>Controls for General Keyboard Mapping</title>
+
+<para>
+There are several controls that apply to the keyboard mapping in general. They
+control handling of out-of-range group indices and how modifiers are processed
+and consumed in the server. These are:
+</para>
+
+<para>
+<programlisting>
+     <emphasis>GroupsWrap</emphasis>
+     <emphasis>IgnoreGroupLock</emphasis>
+     <emphasis>IgnoreLockMods</emphasis>
+     <emphasis>InternalMods </emphasis>
+</programlisting>
+</para>
+
+<para>
+<emphasis>
+IgnoreGroupLock</emphasis>
+ is a boolean control; the rest are always active.
+</para>
+
+
+<para>
+Without the modifier processing options provided by Xkb, passive grabs set via
+translations in a client (for example, <emphasis>
+Alt&lt;KeyPress&gt;space</emphasis>
+) do not trigger if any modifiers other than those specified by the translation
+are set. This results in problems in the user interface when either <emphasis>
+NumLock</emphasis>
+ or a secondary keyboard group is active. The <emphasis>
+IgnoreLockMods</emphasis>
+ and <emphasis>
+IgnoreGroupLock</emphasis>
+ controls make it possible to avoid this behavior without exhaustively
+specifying a grab for every possible modifier combination.
+</para>
+
+<sect2 id='The_GroupsWrap_Control'>
+<title>The GroupsWrap Control</title>
+
+<para>
+The <emphasis>
+GroupsWrap</emphasis>
+ control determines how illegal groups are handled on a global basis. There are
+a number of valid keyboard sequences that can cause the effective group number
+to go out of range. When this happens, the group must be normalized back to a
+valid number. The <emphasis>
+GroupsWrap</emphasis>
+ control specifies how this is done.
+</para>
+
+
+<para>
+When dealing with group numbers, all computations are done using the group
+index, which is the group number minus one. There are three different
+algorithms; the <emphasis>
+GroupsWrap</emphasis>
+ control specifies which one is used:
+</para>
+
+<itemizedlist>
+<listitem>
+  <para>XkbRedirectIntoRange</para>
+  <para>
+All invalid group numbers are converted to a valid group number by taking the
+last four bits of the <emphasis>
+GroupsWrap</emphasis>
+ control and using them as the group index. If the result is still out of
+range, Group one is used.
+  </para>
+</listitem>
+<listitem>
+  <para>
+XkbClampIntoRange
+  </para>
+  <para>
+All invalid group numbers are converted to the nearest valid group number.
+Group numbers larger than the highest supported group number are mapped to the
+highest supported group; those less than one are mapped to group one.
+  </para>
+</listitem>
+<listitem>
+  <para>XkbWrapIntoRange</para>
+  <para>
+All invalid group numbers are converted to a valid group number using integer
+modulus applied to the group index.
+  </para>
+</listitem>
+</itemizedlist>
+
+<para>
+There are no convenience functions for manipulating the <emphasis>
+GroupsWrap</emphasis>
+ control. Manipulate the <emphasis>
+GroupsWrap</emphasis>
+ control via the <emphasis>
+groups_wrap</emphasis>
+ field in the <emphasis>
+XkbControlsRec</emphasis>
+ structure, then use <emphasis>
+XkbSetControls</emphasis>
+ and <emphasis>
+XkbGetControls</emphasis>
+ (see section 10.9 and section 10.10) to query and change this control. <!-- xref -->
+</para>
+
+<note><para>See also section 15.3.2 or a discussion of the related field,  <!-- xref -->
+<emphasis>
+group_info</emphasis>
+, which also normalizes a group under certain circumstances.</para></note>
+
+</sect2>
+<sect2 id='The_IgnoreLockMods_Control'>
+<title>The IgnoreLockMods Control</title>
+
+<para>
+The core protocol does not provide a way to exclude specific modifiers from
+grab calculations, with the result that locking modifiers sometimes have
+unanticipated side effects.
+</para>
+
+
+<para>
+The <emphasis>
+IgnoreLockMods</emphasis>
+ control specifies modifiers that should be excluded from grab calculations.
+These modifiers are also not reported in any core events except <emphasis>
+KeyPress</emphasis>
+ and <emphasis>
+KeyRelease</emphasis>
+ events that do not activate a passive grab and that do not occur while a grab
+is active.
+</para>
+
+
+<para>
+Manipulate the <emphasis>
+IgnoreLockMods</emphasis>
+ control via the <emphasis>
+ignore_lock</emphasis>
+ field in the <emphasis>
+XkbControlsRec</emphasis>
+ structure, then use <emphasis>
+XkbSetControls</emphasis>
+ and <emphasis>
+XkbGetControls</emphasis>
+ (see sections 10.9 and 10.10) to query and change this control. Alternatively,  <!-- xref -->
+use <emphasis>
+XkbSetIgnoreLockMods</emphasis>
+.
+</para>
+
+
+<para>
+To set the modifiers that, if locked, are not to be reported in matching events
+to passive grabs, use <emphasis>
+XkbSetIgnoreLockMods.</emphasis>
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbSetIgnoreLockMods</emphasis>
+(<emphasis>
+display, device_spec, affect_real, real_values, affect_virtual,
+virtual_values</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *      <emphasis>
+display</emphasis>
+;            /* connection to the X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+device_spec</emphasis>
+;            /* device ID, or <emphasis>
+XkbUseCoreKbd</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+      affect_real</emphasis>
+;            /* mask of real modifiers affected by this call */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+      real_values</emphasis>
+;            /* values for affected real modifiers (1=&gt;set, 0=&gt;unset) */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+      affect_virtual</emphasis>
+;            /* mask of virtual modifiers affected by this call */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+      virtual_values</emphasis>
+;            /* values for affected virtual modifiers (1=&gt;set, 0=&gt;unset)
+*/
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbSetIgnoreLockMods</emphasis>
+ sends a request to the server to change the server’s <emphasis>
+IgnoreLockMods</emphasis>
+ control. <emphasis>
+affect_real</emphasis>
+ and <emphasis>
+real_values</emphasis>
+ are masks of real modifier bits indicating which real modifiers are to be
+added and removed from the server’s <emphasis>
+IgnoreLockMods</emphasis>
+ control. Modifiers selected by both <emphasis>
+affect_real</emphasis>
+ and <emphasis>
+real_values</emphasis>
+ are added to the server’s <emphasis>
+IgnoreLockMods</emphasis>
+ control; those selected by <emphasis>
+affect_real</emphasis>
+ but not by <emphasis>
+real_values</emphasis>
+ are removed from the server’s <emphasis>
+IgnoreLockMods</emphasis>
+ control. Valid values for <emphasis>
+affect_real</emphasis>
+ and <emphasis>
+real_values</emphasis>
+ consist of any combination of the eight core modifier bits: <emphasis>
+ShiftMask</emphasis>
+, <emphasis>
+LockMask</emphasis>
+, <emphasis>
+ControlMask</emphasis>
+, <emphasis>
+Mod1Mask</emphasis>
+ - <emphasis>
+Mod5Mask</emphasis>
+. <emphasis>
+affect_virtual</emphasis>
+ and <emphasis>
+virtual_values</emphasis>
+ are masks of virtual modifier bits indicating which virtual modifiers are to
+be added and removed from the server’s <emphasis>
+IgnoreLockMods</emphasis>
+ control. Modifiers selected by both <emphasis>
+affect_virtual</emphasis>
+ and <emphasis>
+virtual_values</emphasis>
+ are added to the server’s <emphasis>
+IgnoreLockMods</emphasis>
+ control; those selected by <emphasis>
+affect_virtual</emphasis>
+ but not by <emphasis>
+virtual_values</emphasis>
+ are removed from the server’s <emphasis>
+IgnoreLockMods</emphasis>
+ control.<emphasis>
+ </emphasis>
+See section 7.1 for a discussion of virtual modifier masks to use in <emphasis> <!-- xref -->
+affect_virtual</emphasis>
+ and <emphasis>
+virtual_values</emphasis>
+. <emphasis>
+XkbSetIgnoreLockMods</emphasis>
+ does not wait for a reply from the server. It returns <emphasis>
+True</emphasis>
+ if the request was sent, and <emphasis>
+False</emphasis>
+ otherwise.
+</para>
+
+</sect2>
+<sect2 id='The_IgnoreGroupLock_Control'>
+<title>The IgnoreGroupLock Control</title>
+
+<para>
+The <emphasis>
+IgnoreGroupLock</emphasis>
+ control is a boolean control with no attributes. If enabled, it specifies that
+the locked state of the keyboard group should not be considered when activating
+passive grabs.
+</para>
+
+<para>
+Because <emphasis>
+IgnoreGroupLock</emphasis>
+ is a boolean control with no attributes, use the general boolean controls
+functions (see section 10.1) to change its state. <!-- xref -->
+</para>
+
+
+</sect2>
+<sect2 id='The_InternalMods_Control'>
+<title>The InternalMods Control</title>
+
+<para>
+The core protocol does not provide any means to prevent a modifier from being
+reported in events sent to clients; Xkb, however makes this possible via the
+<emphasis>
+InternalMods</emphasis>
+ control. It specifies modifiers that should be consumed by the server and not
+reported to clients. When a key is pressed and a modifier that has its bit set
+in the <emphasis>
+InternalMods</emphasis>
+ control is reported to the server, the server uses the modifier when
+determining the actions to apply for the key. The server then clears the bit,
+so it is not actually reported to the client. In addition, modifiers specified
+in the <emphasis>
+InternalMods</emphasis>
+ control are not used to determine grabs and are not used to calculate core
+protocol compatibility state.
+</para>
+
+
+<para>
+Manipulate the <emphasis>
+InternalMods</emphasis>
+ control via the <emphasis>
+internal</emphasis>
+ field in the <emphasis>
+XkbControlsRec</emphasis>
+ structure, using <emphasis>
+XkbSetControls</emphasis>
+ and <emphasis>
+XkbGetControls</emphasis>
+ (see sections10.9 and 10.10). Alternatively, use <emphasis> <!-- xref -->
+XkbSetServerInternalMods</emphasis>
+.
+</para>
+
+
+<para>
+To set the modifiers that are consumed by the server before events are
+delivered to the client, use <emphasis>
+XkbSetServerInternalMods.</emphasis>
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbSetServerInternalMods</emphasis>
+(<emphasis>
+display, device_spec, affect_real, real_values, affect_virtual,
+virtual_values</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *      <emphasis>
+display</emphasis>
+;            /* connection to the X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+device_spec</emphasis>
+;‘            /* device ID, or <emphasis>
+XkbUseCoreKbd</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+      affect_real</emphasis>
+;            /* mask of real modifiers affected by this call */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+      real_values</emphasis>
+;            /* values for affected real modifiers (1=&gt;set, 0=&gt;unset) */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+      affect_virtual</emphasis>
+;            /* mask of virtual modifiers affected by this call */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+      virtual_values</emphasis>
+;            /* values for affected virtual modifiers (1=&gt;set, 0=&gt;unset)
+*/
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbSetServerInternalMods</emphasis>
+ sends a request to the server to change the internal modifiers consumed by the
+server. <emphasis>
+affect_real</emphasis>
+ and <emphasis>
+real_values</emphasis>
+ are masks of real modifier bits indicating which real modifiers are to be
+added and removed from the server’s internal modifiers control. Modifiers
+selected by both <emphasis>
+affect_real</emphasis>
+ and <emphasis>
+real_values</emphasis>
+ are added to the server’s internal modifiers control; those selected by
+<emphasis>
+affect_real</emphasis>
+ but not by <emphasis>
+real_values</emphasis>
+ are removed from the server’s internal modifiers mask. Valid values for
+<emphasis>
+affect_real</emphasis>
+ and <emphasis>
+real_values</emphasis>
+ consist of any combination of the eight core modifier bits: <emphasis>
+ShiftMask</emphasis>
+, <emphasis>
+LockMask</emphasis>
+, <emphasis>
+ControlMask</emphasis>
+, <emphasis>
+Mod1Mask</emphasis>
+ - <emphasis>
+Mod5Mask</emphasis>
+.<emphasis>
+ affect_virtual</emphasis>
+ and <emphasis>
+virtual_values</emphasis>
+ are masks of virtual modifier bits indicating which virtual modifiers are to
+be added and removed from the server’s internal modifiers control. Modifiers
+selected by both <emphasis>
+affect_virtual</emphasis>
+ and <emphasis>
+virtual_values</emphasis>
+ are added to the server’s internal modifiers control; those selected by
+<emphasis>
+affect_virtual</emphasis>
+ but not by <emphasis>
+virtual_values</emphasis>
+ are removed from the server’s internal modifiers control.<emphasis>
+ </emphasis>
+See section 7.1 for a discussion of virtual modifier masks to use in <emphasis> <!-- xref -->
+affect_virtual</emphasis>
+ and <emphasis>
+virtual_values</emphasis>
+.<emphasis>
+ XkbSetServerInternalMods</emphasis>
+ does not wait for a reply from the server. It returns <emphasis>
+True</emphasis>
+ if the request was sent and <emphasis>
+False</emphasis>
+ otherwise.
+</para>
+
+
+</sect2>
+</sect1>
+<sect1 id='The_XkbControlsRec_Structure'>
+<title>The XkbControlsRec Structure</title>
+
+<para>
+Many of the individual controls described in sections 10.1 through 10.7 may be
+manipulated via convenience functions discussed in those sections. Some of
+them, however, have no convenience functions. The <emphasis>
+XkbControlsRec</emphasis>
+ structure allows the manipulation of one or more of the controls in a single
+operation and to track changes to any of them in conjunction with the <emphasis>
+XkbGetControls</emphasis>
+ and <emphasis>
+XkbSetControls</emphasis>
+ functions. This is the only way to manipulate those controls that have no
+convenience functions.
+</para>
+
+
+<para>
+The <emphasis>
+XkbControlsRec</emphasis>
+ structure is defined as follows:
+</para>
+
+<para>
+<programlisting>
+#define      XkbMaxLegalKeyCode       255
+#define      XkbPerKeyBitArraySize    ((XkbMaxLegalKeyCode+1)/8)
+</programlisting>
+</para>
+<para>
+<programlisting>
+typedef struct {
+      unsigned char        mk_dflt_btn;       /* default button for keyboard driven mouse */
+      unsigned char        num_groups;        /* number of keyboard groups */
+      unsigned char        groups_wrap;       /* how to wrap out-of-bounds groups */
+      XkbModsRec           internal;          /* defines server internal modifiers */
+      XkbModsRec           ignore_lock;       /* modifiers to ignore when checking for grab */
+      unsigned int         enabled_ctrls;     /* 1 bit =&gt; corresponding boolean control enabled */
+      unsigned short       repeat_delay;      /* ms delay until first repeat */
+      unsigned short       repeat_interval;   /* ms delay between repeats */
+      unsigned short       slow_keys_delay;   /* ms minimum time key must be down to be ok */
+      unsigned short       debounce_delay;    /* ms delay before key reactivated */
+      unsigned short       mk_delay;          /* ms delay to second mouse motion event */
+      unsigned short       mk_interval;       /* ms delay between repeat mouse events */
+      unsigned short       mk_time_to_max;    /* # intervals until constant mouse move */
+      unsigned short       mk_max_speed;      /* multiplier for maximum mouse speed */
+      short                mk_curve;          /* determines mouse move curve type */
+      unsigned short       ax_options;        /* 1 bit =&gt; Access X option enabled */
+      unsigned short       ax_timeout;        /* seconds until Access X disabled */
+      unsigned short       axt_opts_mask;     /* 1 bit =&gt; options to reset on Access X timeout */
+      unsigned short       axt_opts_values;   /* 1 bit =&gt; turn option on, 0=&gt; off */
+      unsigned int         axt_ctrls_mask;    /* which bits in <emphasis> enabled_ctrls</emphasis> to modify */
+      unsigned int         axt_ctrls_values;  /* values for new bits in <emphasis> enabled_ctrls</emphasis> */
+      unsigned char        per_key_repeat[XkbPerKeyBitArraySize];           /* per key auto repeat */
+} <emphasis>XkbControlsRec</emphasis>, *XkbControlsPtr;
+</programlisting>
+</para>
+
+<para>
+The general-purpose functions that work with the <emphasis>
+XkbControlsRec</emphasis>
+ structure use a mask to specify which controls are to be manipulated. Table
+10.6 lists these controls, the masks used to select them in the general
+function calls (<emphasis>
+which</emphasis>
+ parameter), and the data fields in the <emphasis>
+XkbControlsRec</emphasis>
+ structure that comprise each of the individual controls. Also listed are the
+bit used to turn boolean controls on and off and the section where each control
+is described in more detail.
+</para>
+
+<table frame='topbot'>
+<title>Xkb Controls</title>
+<?dbfo keep-together="auto" ?>
+<tgroup cols='5' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='2.0*'/>
+<colspec colname='c2' colwidth='3.1*'/>
+<colspec colname='c3' colwidth='2.2*'/>
+<colspec colname='c4' colwidth='2.6*'/>
+<colspec colname='c5' colwidth='1.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Control</entry>
+  <entry>Control Selection Mask (which parameter)</entry>
+  <entry>Relevant XkbControlsRec Data Fields</entry>
+  <entry>Boolean Control enabled_ctrls bit</entry>
+  <entry>Section</entry>
+  </row>
+</thead>
+<tbody>
+  <row>
+    <entry>AccessXFeedback</entry>
+    <entry>XkbAccessXFeedbackMask</entry>
+    <entry>ax_options:      XkbAX_*FBMask</entry>
+    <entry>XkbAccessXFeedback&#xAD;Mask</entry>
+    <entry>10.6.3</entry> <!-- xref -->
+  </row>
+  <row>
+    <entry>AccessXKeys</entry>
+    <entry></entry>
+    <entry></entry>
+    <entry>XkbAccessXKeys&#xAD;Mask</entry>
+    <entry>10.6.1</entry> <!-- xref -->
+  </row>
+  <row>
+    <entry>AccessXTimeout</entry>
+    <entry>XkbAccessXTimeoutMask</entry>
+    <entry>
+      <para>ax_timeout</para>
+      <para>axt_opts_mask</para>
+      <para>axt_opts_values</para>
+      <para>axt_ctrls_mask</para>
+      <para>axt_ctrls_values</para>
+    </entry>
+    <entry>XkbAccessXTimeout&#xAD;Mask</entry>
+    <entry>10.6.2</entry>
+  </row>
+  <row>
+    <entry>AudibleBell</entry>
+    <entry></entry>
+    <entry></entry>
+    <entry>XkbAudibleBellMask</entry>
+    <entry>9.2</entry>
+  </row>
+  <row>
+    <entry>AutoReset</entry>
+    <entry></entry>
+    <entry></entry>
+    <entry></entry>
+    <entry>10.1.2</entry>
+  </row>
+  <row>
+    <entry>BounceKeys</entry>
+    <entry>XkbBounceKeysMask</entry>
+    <entry>debounce_delay</entry>
+    <entry>XkbBounceKeysMask</entry>
+    <entry>10.6.7</entry>
+  </row>
+  <row>
+    <entry>Detectable-Autorepeat</entry>
+    <entry></entry>
+    <entry></entry>
+    <entry></entry>
+    <entry>10.3.3</entry>
+  </row>
+  <row>
+    <entry>EnabledControls</entry>
+    <entry>XkbControlsEnabledMask</entry>
+    <entry>enabled_ctrls</entry>
+    <entry><emphasis>Non-Boolean Control</emphasis></entry>
+    <entry>10.1.1</entry>
+  </row>
+  <row>
+    <entry>GroupsWrap</entry>
+    <entry>XkbGroupsWrapMask</entry>
+    <entry>groups_wrap</entry>
+    <entry><emphasis>Non-Boolean Control</emphasis></entry>
+    <entry>10.7.1</entry>
+  </row>
+  <row>
+    <entry>IgnoreGroupLock</entry>
+    <entry></entry>
+    <entry></entry>
+    <entry>XkbIgnoreGroupLock&#xAD;Mask</entry>
+    <entry>10.7.3</entry>
+  </row>
+  <row>
+    <entry>IgnoreLockMods</entry>
+    <entry>XkbIgnoreLockModsMask</entry>
+    <entry>ignore_lock</entry>
+    <entry><emphasis>Non-Boolean Control</emphasis></entry>
+    <entry>5.1</entry>
+  </row>
+  <row>
+    <entry>InternalMods</entry>
+    <entry>XkbInternalModsMask</entry>
+    <entry>internal</entry>
+    <entry><emphasis>Non-Boolean Control</emphasis></entry>
+    <entry>5.1</entry>
+  </row>
+  <row>
+    <entry>MouseKeys</entry>
+    <entry>XkbMouseKeysMask</entry>
+    <entry>mk_dflt_btn</entry>
+    <entry>XkbMouseKeysMask</entry>
+    <entry>10.5.1</entry>
+  </row>
+  <row>
+    <entry>MouseKeysAccel</entry>
+    <entry>XkbMouseKeysAccelMask</entry>
+    <entry>
+      <para>mk_delay</para>
+      <para>mk_interval</para>
+      <para>mk_time_to_max</para>
+      <para>mk_max_speed</para>
+      <para>mk_curve</para>
+    </entry>
+    <entry>XkbMouseKeysAccel&#xAD;Mask</entry>
+    <entry>10.5.2</entry>
+  </row>
+  <row>
+    <entry>Overlay1</entry>
+    <entry></entry>
+    <entry></entry>
+    <entry>XkbOverlay1Mask</entry>
+    <entry>10.4</entry>
+  </row>
+  <row>
+    <entry>Overlay2</entry>
+    <entry></entry>
+    <entry></entry>
+    <entry>XkbOverlay2Mask</entry>
+    <entry>10.4</entry>
+  </row>
+  <row>
+    <entry>PerKeyRepeat</entry>
+    <entry>XkbPerKeyRepeatMask</entry>
+    <entry>per_key_repeat</entry>
+    <entry><emphasis>Non-Boolean Control</emphasis></entry>
+    <entry>10.3.1</entry>
+  </row>
+  <row>
+    <entry>RepeatKeys</entry>
+    <entry>XkbRepeatKeysMask</entry>
+    <entry>
+      <para>repeat_delay</para>
+      <para>repeat_interval</para>
+    </entry>
+    <entry>XkbRepeatKeysMask</entry>
+    <entry>10.3</entry>
+  </row>
+  <row>
+    <entry>SlowKeys</entry>
+    <entry>XkbSlowKeysMask</entry>
+    <entry>slow_keys_delay</entry>
+    <entry>XkbSlowKeysMask</entry>
+    <entry>10.6.6</entry>
+  </row>
+  <row>
+    <entry>StickyKeys</entry>
+    <entry>XkbStickyKeysMask</entry>
+    <entry>
+      <para>ax_options:</para>
+      <para>XkbAX_Two&#xAD;KeysMask</para>
+      <para>XkbAX_Latch&#xAD;ToLockMask</para>
+    </entry>
+    <entry>XkbStickyKeysMask</entry>
+    <entry>10.6.8</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+Table 10.7 shows the actual values for the individual mask bits used to select  <!-- xref -->
+controls for modification and to enable and disable the control. Note that the
+same mask bit is used to specify general modifications to the parameters used
+to configure the control (<emphasis>
+which</emphasis>
+), and to enable and disable the control (<emphasis>
+enabled_ctrls</emphasis>
+). The anomalies in the table (no "ok" in column) are for controls that have no
+configurable attributes; and for controls that are not boolean controls and
+therefore cannot be enabled or disabled.
+</para>
+
+<table frame='topbot'>
+<title>Controls Mask Bits</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='4' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='2.6*'/>
+<colspec colname='c2' colwidth='2.0*'/>
+<colspec colname='c3' colwidth='1.3*'/>
+<colspec colname='c4' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Mask Bit</entry>
+  <entry>which or changed_ctrls</entry>
+  <entry>enabled_ctrls</entry>
+  <entry>Value</entry>
+</row>
+</thead>
+<tbody>
+<row>
+    <entry>XkbRepeatKeysMask</entry>
+    <entry>ok</entry>
+    <entry>ok</entry>
+    <entry>(1L&lt;&lt;0)</entry>
+  </row>
+  <row>
+    <entry>XkbSlowKeysMask</entry>
+    <entry>ok</entry>
+    <entry>ok</entry>
+    <entry>(1L&lt;&lt;1)</entry>
+  </row>
+  <row>
+    <entry>XkbBounceKeysMask</entry>
+    <entry>ok</entry>
+    <entry>ok</entry>
+    <entry>(1L&lt;&lt;2)</entry>
+  </row>
+  <row>
+    <entry>XkbStickyKeysMask</entry>
+    <entry>ok</entry>
+    <entry>ok</entry>
+    <entry>(1L&lt;&lt;3)</entry>
+  </row>
+  <row>
+    <entry>XkbMouseKeysMask</entry>
+    <entry>ok</entry>
+    <entry>ok</entry>
+    <entry>(1L&lt;&lt;4)</entry>
+  </row>
+  <row>
+    <entry>XkbMouseKeysAccelMask</entry>
+    <entry>ok</entry>
+    <entry>ok</entry>
+    <entry>(1L&lt;&lt;5)</entry>
+  </row>
+  <row>
+    <entry>XkbAccessXKeysMask</entry>
+    <entry>ok</entry>
+    <entry>ok</entry>
+    <entry>(1L&lt;&lt;6)</entry>
+  </row>
+  <row>
+    <entry>XkbAccessXTimeoutMask</entry>
+    <entry>ok</entry>
+    <entry>ok</entry>
+    <entry>(1L&lt;&lt;7)</entry>
+  </row>
+  <row>
+    <entry>XkbAccessXFeedbackMask</entry>
+    <entry>ok</entry>
+    <entry>ok</entry>
+    <entry>(1L&lt;&lt;8)</entry>
+  </row>
+  <row>
+    <entry>XkbAudibleBellMask</entry>
+    <entry></entry>
+    <entry>ok</entry>
+    <entry>(1L&lt;&lt;9)</entry>
+  </row>
+  <row>
+    <entry>XkbOverlay1Mask</entry>
+    <entry></entry>
+    <entry>ok</entry>
+    <entry>(1L&lt;&lt;10)</entry>
+  </row>
+  <row>
+    <entry>XkbOverlay2Mask</entry>
+    <entry></entry>
+    <entry>ok</entry>
+    <entry>(1L&lt;&lt;11)</entry>
+  </row>
+  <row>
+    <entry>XkbIgnoreGroupLockMask</entry>
+    <entry></entry>
+    <entry>ok</entry>
+    <entry>(1L&lt;&lt;12)</entry>
+</row>
+<row>
+    <entry>XkbGroupsWrapMask</entry>
+    <entry>ok</entry>
+    <entry></entry>
+    <entry>(1L&lt;&lt;27)</entry>
+</row>
+<row>
+    <entry>XkbInternalModsMask</entry>
+    <entry>ok</entry>
+    <entry></entry>
+    <entry>(1L&lt;&lt;28)</entry>
+</row>
+<row>
+    <entry>XkbIgnoreLockModsMask</entry>
+    <entry>ok</entry>
+    <entry></entry>
+    <entry>(1L&lt;&lt;29)</entry>
+</row>
+<row>
+    <entry>XkbPerKeyRepeatMask</entry>
+    <entry>ok</entry>
+    <entry></entry>
+    <entry>(1L&lt;&lt;30)</entry>
+</row>
+<row>
+    <entry>XkbControlsEnabledMask</entry>
+    <entry>ok</entry>
+    <entry></entry>
+    <entry>(1L&lt;&lt;31)</entry>
+</row>
+<row>
+    <entry>XkbAccessXOptionsMask</entry>
+    <entry>ok</entry>
+    <entry>ok</entry>
+    <entry>(XkbStickyKeysMask | XkbAccessXFeedbackMask)</entry>
+  </row>
+  <row>
+    <entry>XkbAllBooleanCtrlsMask</entry>
+    <entry></entry>
+    <entry>ok</entry>
+    <entry>(0x00001FFF) </entry>
+  </row>
+  <row>
+    <entry>XkbAllControlsMask</entry>
+    <entry>ok</entry>
+    <entry></entry>
+    <entry>(0xF8001FFF)</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+The individual fields of the <emphasis>
+XkbControlsRec</emphasis>
+ structure are defined as follows.
+</para>
+
+<sect2>
+<title/>
+<sect3 id='mk_dflt_btn'>
+<title>mk_dflt_btn</title>
+
+<para>
+<emphasis>
+mk_dflt_btn is an attribute of the </emphasis>
+<emphasis>
+MouseKeys</emphasis>
+<emphasis>
+ control</emphasis>
+ (see section 10.5<emphasis> <!-- xref -->
+). It</emphasis>
+ specifies the mouse button number to use for keyboard simulated mouse button
+operations. Its value should be one of the core symbols <emphasis>
+Button1</emphasis>
+ - <emphasis>
+Button5</emphasis>
+.
+</para>
+
+
+</sect3>
+<sect3 id='num_groups'>
+<title>num_groups</title>
+
+<para>
+<emphasis>
+num_groups</emphasis>
+ is not a part of any control, but is reported in the <emphasis>
+XkbControlsRec</emphasis>
+ structure whenever any of its components are fetched from the server. It
+reports the number of groups the particular keyboard configuration uses and is
+computed automatically by the server whenever the keyboard mapping changes.
+</para>
+
+
+</sect3>
+<sect3 id='groups_wrap'>
+<title>groups_wrap</title>
+
+<para>
+<emphasis>
+groups_wrap</emphasis>
+ is an attribute of the <emphasis>
+GroupsWrap</emphasis>
+ control (see section 10.7.1). It specifies the handling of illegal groups on a  <!-- xref -->
+global basis. Valid values for <emphasis>
+groups_wrap</emphasis>
+ are shown in Table 10.8.
+</para>
+
+<table frame='topbot'>
+<title>GroupsWrap options (groups_wrap field)</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='1.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>groups_wrap symbolic name</entry>
+  <entry>value</entry>
+  </row>
+</thead>
+<tbody>
+  <row>
+    <entry>XkbWrapIntoRange</entry>
+    <entry>(0x00)</entry>
+  </row>
+  <row>
+    <entry>XkbClampIntoRange</entry>
+    <entry>(0x40)</entry>
+  </row>
+  <row>
+    <entry>XkbRedirectIntoRange</entry>
+    <entry>(0x80)</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+When <emphasis>
+groups_wrap</emphasis>
+ is set to <emphasis>
+XkbRedirectIntoRange</emphasis>
+, its four low-order bits specify the index of the group to use.
+</para>
+
+
+</sect3>
+<sect3 id='internal'>
+<title>internal</title>
+
+<para>
+<emphasis>
+internal</emphasis>
+ is an attribute of the <emphasis>
+InternalMods</emphasis>
+ control (see section 10.7.4). It specifies modifiers to be consumed in the  <!-- xref -->
+server and not passed on to clients when events are reported. Valid values
+consist of any combination of the eight core modifier bits: <emphasis>
+ShiftMask</emphasis>
+, <emphasis>
+LockMask</emphasis>
+, <emphasis>
+ControlMask</emphasis>
+, <emphasis>
+Mod1Mask</emphasis>
+ - <emphasis>
+Mod5Mask</emphasis>
+.
+</para>
+
+
+</sect3>
+<sect3 id='ignore_lock'>
+<title>ignore_lock</title>
+
+<para>
+<emphasis>
+ignore_lock</emphasis>
+ is an attribute of the <emphasis>
+IgnoreLockMods</emphasis>
+ control (see section 10.7.2). It specifies modifiers to be ignored in grab  <!-- xref -->
+calculations. Valid values consist of any combination of the eight core
+modifier bits: <emphasis>
+ShiftMask</emphasis>
+, <emphasis>
+LockMask</emphasis>
+, <emphasis>
+ControlMask</emphasis>
+, <emphasis>
+Mod1Mask</emphasis>
+ - <emphasis>
+Mod5Mask</emphasis>
+.
+</para>
+
+
+</sect3>
+<sect3 id='enabled_ctrls'>
+<title>enabled_ctrls</title>
+
+<para>
+<emphasis>
+enabled_ctrls</emphasis>
+ is an attribute of the <emphasis>
+EnabledControls</emphasis>
+ control (see section 10.1.1). It contains one bit per boolean control. Each  <!-- xref -->
+bit determines whether the corresponding control is enabled or disabled; a one
+bit means the control is enabled. The mask bits used to enable these controls
+are listed in Table 10.7, using only those masks with "ok" in the <emphasis>
+enabled_ctrls</emphasis>
+ column.
+</para>
+
+
+</sect3>
+<sect3 id='repeat_delay_and_repeat_interval'>
+<title>repeat_delay and repeat_interval</title>
+
+<para>
+<emphasis>
+repeat_delay</emphasis>
+ and <emphasis>
+repeat_interval</emphasis>
+ are attributes of the <emphasis>
+RepeatKeys</emphasis>
+ control (see section 10.3.2). <emphasis> <!-- xref -->
+repeat_delay</emphasis>
+ is the initial delay before a key begins repeating, in milliseconds; <emphasis>
+repeat_interval</emphasis>
+ is the delay between subsequent key events, in milliseconds.
+</para>
+
+
+</sect3>
+<sect3 id='slow_keys_delay'>
+<title>slow_keys_delay</title>
+
+<para>
+<emphasis>
+slow_keys_delay</emphasis>
+ is an attribute of the <emphasis>
+SlowKeys</emphasis>
+ control (see section 10.6.6). Its value specifies the <emphasis> <!-- xref -->
+SlowKeys</emphasis>
+ acceptance delay period in milliseconds before a key press is accepted by the
+server.
+</para>
+
+
+</sect3>
+<sect3 id='debounce_delay'>
+<title>debounce_delay</title>
+
+<para>
+<emphasis>
+debounce_delay</emphasis>
+ is an attribute of the <emphasis>
+BounceKeys</emphasis>
+ control (see section 10.6.7). Its value specifies the <emphasis> <!-- xref -->
+BounceKeys</emphasis>
+ delay period in milliseconds for which the key is disabled after having been
+pressed before another press of the same key is accepted by the server.
+</para>
+
+
+</sect3>
+<sect3 id='mk_delay_mk_interval_mk_time_to_max_mk_max_speed_and_mk_curve'>
+<title>mk_delay, mk_interval, mk_time_to_max, mk_max_speed, and mk_curve</title>
+
+<para>
+<emphasis>
+mk_delay</emphasis>
+, <emphasis>
+mk_interval</emphasis>
+, <emphasis>
+mk_time_to_max</emphasis>
+, <emphasis>
+mk_max_speed</emphasis>
+, and <emphasis>
+mk_curve</emphasis>
+ are attributes of the <emphasis>
+MouseKeysAccel</emphasis>
+ control. Refer to section 10.5.2 for a description of these fields and the  <!-- xref -->
+units involved.
+</para>
+
+
+</sect3>
+<sect3 id='ax_options'>
+<title>ax_options</title>
+
+<para>
+The <emphasis>
+ax_options</emphasis>
+ field contains attributes used to configure two different controls, the
+<emphasis>
+StickyKeys</emphasis>
+ control (see section 10.6.8) and the <emphasis> <!-- xref -->
+AccessXFeedback</emphasis>
+ control (see section 10.6.3). The <emphasis> <!-- xref -->
+ax_options</emphasis>
+ field is a bitmask and may include any combination of the bits defined in
+Table 10.9.  <!-- xref -->
+</para>
+
+<table frame='topbot'>
+<title>Access X Enable/Disable Bits (ax_options field)</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='3' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='1.3*'/>
+<colspec colname='c3' colwidth='0.7*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Access X Control</entry>
+  <entry>ax_options bit</entry>
+  <entry>value</entry>
+  </row>
+</thead>
+<tbody>
+  <row>
+    <entry>AccessXFeedback</entry>
+    <entry>XkbAX_SKPressFBMask</entry>
+    <entry>(1L&lt;&lt;0)</entry>
+  </row>
+  <row>
+    <entry></entry>
+    <entry>XkbAX_SKAcceptFBMask</entry>
+    <entry>(1L &lt;&lt; 1)</entry>
+  </row>
+  <row>
+    <entry></entry>
+    <entry>XkbAX_FeatureFBMask</entry>
+    <entry>(1L &lt;&lt; 2)</entry>
+  </row>
+  <row>
+    <entry></entry>
+    <entry>XkbAX_SlowWarnFBMask</entry>
+    <entry>(1L &lt;&lt; 3)</entry>
+  </row>
+  <row>
+    <entry></entry>
+    <entry>XkbAX_IndicatorFBMask</entry>
+    <entry>(1L &lt;&lt; 4)</entry>
+  </row>
+  <row>
+    <entry></entry>
+    <entry>XkbAX_StickyKeysFBMask</entry>
+    <entry>(1L &lt;&lt; 5)</entry>
+  </row>
+  <row>
+    <entry></entry>
+    <entry>XkbAX_SKReleaseFBMask</entry>
+    <entry>(1L &lt;&lt; 8)</entry>
+  </row>
+  <row>
+    <entry></entry>
+    <entry>XkbAX_SKRejectFBMask</entry>
+    <entry>(1L &lt;&lt; 9)</entry>
+  </row>
+  <row>
+    <entry></entry>
+    <entry>XkbAX_BKRejectFBMask</entry>
+    <entry>(1L &lt;&lt; 10)</entry>
+  </row>
+  <row>
+    <entry></entry>
+    <entry>XkbAX_DumbBellFBMask</entry>
+    <entry>(1L &lt;&lt; 11)</entry>
+  </row>
+  <row>
+    <entry>StickyKeys</entry>
+    <entry>XkbAX_TwoKeysMask</entry>
+    <entry>(1L &lt;&lt; 6)</entry>
+  </row>
+  <row>
+    <entry></entry>
+    <entry>XkbAX_LatchToLockMask</entry>
+    <entry>(1L &lt;&lt; 7)</entry>
+  </row>
+  <row>
+    <entry></entry>
+    <entry>XkbAX_AllOptionsMask</entry>
+    <entry>(0xFFF)</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+The fields pertaining to each control are relevant only when the control is
+enabled (<emphasis>
+XkbAccessXFeedbackMask</emphasis>
+ or <emphasis>
+XkbStickyKeysMask</emphasis>
+ bit is turned on in the <emphasis>
+enabled_cntrls</emphasis>
+ field).
+</para>
+
+
+<para>
+Xkb provides a set of convenience macros for working with the <emphasis>
+ax_options</emphasis>
+ field of an <emphasis>
+XkbControlsRec</emphasis>
+ structure:
+</para>
+
+<para><programlisting>
+#define      <emphasis>XkbAX_NeedOption</emphasis>
+(c,w)      ((c)-&gt;ax_options&amp;(w))
+</programlisting></para>
+
+<para>
+The <emphasis>
+XkbAX_NeedOption</emphasis>
+ macro is useful for determining whether a particular AccessX option is enabled
+or not. It accepts a pointer to an <emphasis>
+XkbControlsRec</emphasis>
+ structure and a valid mask bit from Table 10.9. If the specified mask bit in
+the <emphasis>
+ax_options</emphasis>
+ field of the controls structure is set, the macro returns the mask bit.
+Otherwise, it returns zero. Thus,
+</para>
+
+
+<para>
+XkbAX_NeedOption(ctlrec, XkbAX_LatchToLockMask)
+</para>
+
+
+<para>
+is nonzero if the latch to lock transition for latching keys is enabled, and
+zero if it is disabled. Note that <emphasis>
+XkbAX_NeedOption</emphasis>
+ only determines whether or not the particular capability is configured to
+operate; the <emphasis>
+XkbAccessXFeedbackMask</emphasis>
+ bit must also be turned on in <emphasis>
+enabled_ctrls</emphasis>
+ for the capability to actually be functioning.
+</para>
+
+<para><programlisting>
+#define      <emphasis>XkbAX_AnyFeedback</emphasis>
+(c)      ((c)-&gt;enabled_ctrls&amp;XkbAccessXFeedbackMask)
+</programlisting></para>
+
+<para>
+The <emphasis>
+XkbAX_AnyFeeback</emphasis>
+ macro accepts a pointer to an <emphasis>
+XkbControlsRec</emphasis>
+ structure and tells whether the <emphasis>
+AccessXFeedback</emphasis>
+ control is enabled or not. If the <emphasis>
+AccessXFeedback</emphasis>
+ control is enabled, the macro returns <emphasis>
+XkbAccessXFeedbackMask</emphasis>
+. Otherwise, it returns zero.
+</para>
+
+<para><programlisting>
+#define      <emphasis>XkbAX_NeedFeedback</emphasis>
+(c,w)      (XkbAX_AnyFeedback(c)&amp;&amp;XkbAX_NeedOption(c,w))
+</programlisting></para>
+
+<para>
+The <emphasis>
+XkbAX_NeedFeedback</emphasis>
+ macro is useful for determining if both the <emphasis>
+AccessXFeedback</emphasis>
+ control and a particular AccessX feedback option are enabled. The macro
+accepts a pointer to an <emphasis>
+XkbControlsRec</emphasis>
+ structure and a feedback option from the table above. If both the <emphasis>
+AccessXFeedback</emphasis>
+ control and the specified feedback option are enabled, the macro returns
+<emphasis>
+True</emphasis>
+. Otherwise it returns <emphasis>
+False</emphasis>
+.
+</para>
+
+
+</sect3>
+<sect3
+id='ax_timeout_axt_opts_mask_axt_opts_values_axt_ctrls_mask_and_axt_ctrls_values'>
+<title>ax_timeout, axt_opts_mask, axt_opts_values, axt_ctrls_mask, and axt_ctrls_values</title>
+
+<para>
+<emphasis>
+ax_timeout</emphasis>
+, <emphasis>
+act_opts_mask</emphasis>
+, <emphasis>
+axt_opts_values</emphasis>
+, <emphasis>
+axt_ctrls_mask</emphasis>
+, and <emphasis>
+axt_ctrls_values</emphasis>
+ are attributes of the <emphasis>
+AccessXTimeout</emphasis>
+ control. Refer to section 10.6.2 for a description of these fields and the  <!-- xref -->
+units involved.
+</para>
+
+
+</sect3>
+<sect3 id='per_key_repeat'>
+<title>per_key_repeat</title>
+
+<para>
+The <emphasis>
+per_key_repeat</emphasis>
+ field mirrors the <emphasis>
+auto_repeats</emphasis>
+ field of the core protocol <emphasis>
+XKeyboardState</emphasis>
+ structure: changing the <emphasis>
+auto_repeats</emphasis>
+ field automatically changes <emphasis>
+per_key_repeat</emphasis>
+ and vice versa. It is provided for convenience and to reduce protocol traffic.
+For example, to obtain the individual repeat key behavior as well as the repeat
+delay and rate, use <emphasis>
+XkbGetControls</emphasis>
+. If the <emphasis>
+per_key_repeat</emphasis>
+ were not in this structure, you would have to call both <emphasis>
+XGetKeyboardControl</emphasis>
+ and <emphasis>
+XkbGetControls</emphasis>
+ to get this information. The bits correspond to keycodes. The first seven keys
+(keycodes 1-7) are indicated in <emphasis>
+per_key_repeat</emphasis>
+[0], with bit position 0 (low order) corresponding to the fictitious keycode 0.
+Following array elements correspond to 8 keycodes per element. A 1 bit
+indicates that the key is a repeating key.
+</para>
+
+
+</sect3>
+</sect2>
+</sect1>
+<sect1 id='Querying_Controls'>
+<title>Querying Controls</title>
+
+<para>
+Use <emphasis>
+XkbGetControls</emphasis>
+ to find the current state of Xkb server controls.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbGetControls</emphasis>
+(<emphasis>
+display, which, xkb)</emphasis>
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *<emphasis>
+            display</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned long<emphasis>
+            which</emphasis>
+;            /* mask of controls requested */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr<emphasis>
+            xkb</emphasis>
+;            /* keyboard description for controls information*/
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetControls</emphasis>
+ queries the server for the requested control information, waits for a reply,
+and then copies the server’s values for the requested information into the
+<emphasis>
+ctrls</emphasis>
+ structure of the <emphasis>
+xkb</emphasis>
+ argument. Only those components specified by the <emphasis>
+which</emphasis>
+ parameter are copied. Valid values for <emphasis>
+which</emphasis>
+ are any combination of the masks listed in Table 10.7 that have "ok" in the
+<emphasis>
+which</emphasis>
+ column.
+</para>
+
+
+<para>
+If <emphasis>
+xkb</emphasis>
+-&gt;<emphasis>
+ctrls </emphasis>
+is <emphasis>
+NULL</emphasis>
+, <emphasis>
+XkbGetControls</emphasis>
+ allocates and initializes it before obtaining the values specified by
+<emphasis>
+which</emphasis>
+. If <emphasis>
+xkb</emphasis>
+-&gt;<emphasis>
+ctrls</emphasis>
+ is not <emphasis>
+NULL</emphasis>
+, <emphasis>
+XkbGetControls</emphasis>
+ modifies only those portions of <emphasis>
+xkb</emphasis>
+-&gt;<emphasis>
+ctrls</emphasis>
+ corresponding to the values specified by <emphasis>
+which</emphasis>
+.
+</para>
+
+
+<para>
+<emphasis>
+XkbGetControls</emphasis>
+ returns <emphasis>
+Success</emphasis>
+ if successful; otherwise, it returns <emphasis>
+BadAlloc</emphasis>
+ if it cannot obtain sufficient storage, <emphasis>
+BadMatch</emphasis>
+ if <emphasis>
+xkb</emphasis>
+ is <emphasis>
+NULL</emphasis>
+ or <emphasis>
+which</emphasis>
+ is empty, or <emphasis>
+BadImplementation</emphasis>
+.
+</para>
+
+
+<para>
+To free the <emphasis>
+ctrls</emphasis>
+ member of a keyboard description, use <emphasis>
+XkbFreeControls</emphasis>
+ (see section 10.12)
+</para>
+
+
+<para>
+The <emphasis>
+num_groups</emphasis>
+ field in the <emphasis>
+ctrls</emphasis>
+ structure is always filled in by <emphasis>
+XkbGetControls</emphasis>
+, regardless of which bits are selected by <emphasis>
+which</emphasis>
+.
+</para>
+
+
+</sect1>
+<sect1 id='Changing_Controls'>
+<title>Changing Controls</title>
+
+<para>
+There are two ways to make changes to controls: either change a local copy
+keyboard description and call <emphasis>
+XkbSetControls</emphasis>
+, or, to reduce network traffic, use an<emphasis>
+ XkbControlsChangesRec</emphasis>
+ structure and call <emphasis>
+XkbChangeControls</emphasis>
+.
+</para>
+
+
+<para>
+To change the state of one or more controls, first modify the <emphasis>
+ctrls</emphasis>
+ structure in a local copy of the keyboard description and then use <emphasis>
+XkbSetControls</emphasis>
+ to copy those changes to the X server.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbSetControls</emphasis>
+(<emphasis>
+display, which, xkb)</emphasis>
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *<emphasis>
+            display</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned long      <emphasis>
+      which      </emphasis>
+;      /* mask of controls to change */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr            <emphasis>
+xkb</emphasis>
+;            /* <emphasis>
+ctrls</emphasis>
+ field contains new values to be set */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+For each bit that is set in the <emphasis>
+which</emphasis>
+ parameter, <emphasis>
+XkbSetControls</emphasis>
+ sends the corresponding values from the <emphasis>
+xkb</emphasis>
+-&gt;<emphasis>
+ctrls</emphasis>
+ field to the server. Valid values for <emphasis>
+which</emphasis>
+ are any combination of the masks listed in Table 10.7 that have "ok" in the
+<emphasis>
+which</emphasis>
+ column.
+</para>
+
+
+<para>
+If <emphasis>
+xkb</emphasis>
+-&gt;<emphasis>
+ctrls</emphasis>
+ is <emphasis>
+NULL</emphasis>
+, the server does not support a compatible version of Xkb, or the Xkb extension
+has not been properly initialized, <emphasis>
+XkbSetControls</emphasis>
+ returns <emphasis>
+False</emphasis>
+. Otherwise, it sends the request to the X server and returns <emphasis>
+True</emphasis>
+.
+</para>
+
+
+<para>
+Note that changes to attributes of controls in the <emphasis>
+XkbControlsRec</emphasis>
+ structure are apparent only when the associated control is enabled, although
+the corresponding values are still updated in the X server. For example, the
+<emphasis>
+repeat_delay</emphasis>
+ and <emphasis>
+repeat_interval</emphasis>
+ fields are ignored unless the <emphasis>
+RepeatKeys</emphasis>
+ control is enabled (that is, the X server’s equivalent of <emphasis>
+xkb-&gt;ctrls</emphasis>
+ has <emphasis>
+XkbRepeatKeyMask</emphasis>
+ set in <emphasis>
+enabled_ctrls</emphasis>
+). It is permissible to modify the attributes of a control in one call to
+XkbSetControls and enable the control in a subsequent call. See section 10.1.1  <!-- xref -->
+for more information on enabling and disabling controls.
+</para>
+
+
+<para>
+Note that the <emphasis>
+enabled_ctrls</emphasis>
+ field is itself a control — the <emphasis>
+EnabledControls</emphasis>
+ control. As such, to set a specific configuration of enabled and disabled
+boolean controls, you must set <emphasis>
+enabled_ctrls</emphasis>
+ to the appropriate bits to enable only the controls you want and disable all
+others, then specify the <emphasis>
+XkbControlsEnabledMask</emphasis>
+ in a call to <emphasis>
+XkbSetControls</emphasis>
+. Because this is somewhat awkward if all you want to do is enable and disable
+controls, and not modify any of their attributes, a convenience function is
+also provided for this purpose (<emphasis>
+XkbChangeEnabledControls</emphasis>
+, section 10.1.1). <!-- xref -->
+</para>
+
+
+<sect2 id='The_XkbControlsChangesRec_Structure'>
+<title>The XkbControlsChangesRec Structure</title>
+
+<para>
+The <emphasis>
+XkbControlsChangesRec</emphasis>
+ structure allows applications to track modifications to an <emphasis>
+XkbControlsRec</emphasis>
+ structure and thereby reduce the amount of traffic sent to the server. The
+same <emphasis>
+XkbControlsChangesRec</emphasis>
+ structure may be used in several successive modifications to the same
+<emphasis>
+XkbControlsRec</emphasis>
+ structure, then subsequently used to cause all of the changes, and only the
+changes, to be propagated to the server. The <emphasis>
+XkbControlsChangesRec</emphasis>
+ structure is defined as follows:
+</para>
+
+<para><programlisting>
+typedef struct _XkbControlsChanges {
+      unsigned int changed_ctrls;          /* bits indicating changed control data */
+      unsigned int enabled_ctrls_changes;  /* bits indicating enabled/disabled controls */
+      Bool         num_groups_changed;     /* <emphasis> True</emphasis> if
+                                              number of keyboard groups changed */
+} <emphasis>XkbControlsChangesRec</emphasis>,*XkbControlsChangesPtr;
+</programlisting></para>
+
+<para>
+The <emphasis>
+changed_ctrls</emphasis>
+ field is a mask specifying which logical sets of data in the controls
+structure have been modified. In this context, modified means <emphasis>
+set</emphasis>
+, that is, if a value is set to the same value it previously contained, it has
+still been modified, and is noted as changed. Valid values for <emphasis>
+changed_ctrls</emphasis>
+ are any combination of the masks listed in Table 10.7 that have "ok" in the
+<emphasis>
+changed_ctrls</emphasis>
+ column. Setting a bit implies the corresponding data fields from the "Relevant
+XkbControlsRec Data Fields" column in Table 10.6 have been modified. The
+<emphasis>
+enabled_ctrls_changes</emphasis>
+ field specifies which bits in the <emphasis>
+enabled_ctrls</emphasis>
+ field have changed. If the number of keyboard groups has changed, the
+<emphasis>num_groups_changed</emphasis>
+ field is set to <emphasis>True</emphasis>.
+</para>
+
+
+<para>
+If you have an Xkb description with controls that have been modified and an
+<emphasis>
+XkbControlsChangesRec</emphasis>
+ that describes the changes that have been made, the <emphasis>
+XkbChangeControls</emphasis>
+ function provides a flexible method for updating the controls in a server to
+match those in the changed keyboard description.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbChangeControls</emphasis>
+(<emphasis>
+dpy, xkb, changes</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *                  <emphasis>
+dpy</emphasis>
+;      /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr                  <emphasis>
+xkb</emphasis>
+;      /* keyboard description with changed <emphasis>
+xkb-&gt;ctrls</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbControlsChangesPtr                  <emphasis>
+changes</emphasis>
+;      /* which parts of <emphasis>
+xkb-&gt;ctrls</emphasis>
+ have changed */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbChangeControls</emphasis>
+ copies any controls fields specified by <emphasis>
+changes</emphasis>
+ from the keyboard description controls structure, <emphasis>
+xkb</emphasis>
+-&gt;<emphasis>
+ctrls</emphasis>
+, to the server specified by <emphasis>
+dpy</emphasis>
+.
+</para>
+
+
+</sect2>
+</sect1>
+<sect1 id='Tracking_Changes_to_Keyboard_Controls'>
+<title>Tracking Changes to Keyboard Controls</title>
+
+<para>
+Whenever a field in the controls structure changes in the server’s keyboard
+description, the server sends an <emphasis>
+XkbControlsNotify</emphasis>
+ event to all interested clients.To receive <emphasis>
+XkbControlsNotify</emphasis>
+ events under all possible conditions, use <emphasis>
+XkbSelectEvents</emphasis>
+ (see section 4.3) and pass <emphasis>
+XkbControlsNotifyMask</emphasis>
+ in both <emphasis>
+bits_to_change</emphasis>
+ and <emphasis>
+values_for_bits</emphasis>
+.
+</para>
+
+
+<para>
+To receive <emphasis>
+XkbControlsNotify</emphasis>
+ events only under certain conditions, use <emphasis>
+XkbSelectEventDetails</emphasis>
+ using <emphasis>
+XkbControlsNotify</emphasis>
+ as the <emphasis>
+event_type</emphasis>
+ and specifying the desired state changes in <emphasis>
+bits_to_change</emphasis>
+ and <emphasis>
+values_for_bits</emphasis>
+ using mask bits from Table 10.7. <!-- xref -->
+</para>
+
+
+<para>
+The structure for the <emphasis>
+XkbControlsNotify</emphasis>
+ event is defined as follows:
+</para>
+
+<para><programlisting>
+typedef struct {
+      int            type;            /* Xkb extension base event code */
+      unsigned long  serial;          /* X server serial number for event */
+      Bool           send_event;      /* <emphasis> True</emphasis> =&gt; synthetically generated */
+      Display *      display;         /* server connection where event generated */
+      Time           time;            /* server time when event generated */
+      int            xkb_type;        /* <emphasis> XkbCompatMapNotify</emphasis> */
+      int            device;          /* Xkb device ID, will not be <emphasis> XkbUseCoreKbd</emphasis> */
+      unsigned int   changed_ctrls;   /* bits indicating which controls data have changed*/
+      unsigned int   enabled_ctrls;   /* controls currently enabled in server */
+      unsigned int   enabled_ctrl_changes;  /* bits indicating enabled/disabled controls */
+      int            num_groups;      /* current number of keyboard groups */
+      KeyCode        keycode;         /* != 0 =&gt; keycode of key causing change */
+      char           event_type;      /* Type of event causing change */
+      char           req_major;       /* major event code of event causing change */
+      char           req_minor;       /* minor event code of event causing change */
+} <emphasis>XkbControlsNotifyEvent</emphasis>;
+</programlisting></para>
+
+<para>
+The <emphasis>
+changed_ctrls</emphasis>
+ field specifies the controls components that have changed and consists of bits
+taken from the masks defined in Table 10.7 with "ok" in the <emphasis>
+changed_ctrls</emphasis>
+ column.
+</para>
+
+
+<para>
+The controls currently enabled in the server are reported in the <emphasis>
+enabled_ctrls</emphasis>
+ field. If any controls were just enabled or disabled (that is, the contents of
+the <emphasis>
+enabled_ctrls</emphasis>
+ field changed), they are flagged in the <emphasis>
+enabled_ctrl_changes</emphasis>
+ field. The valid bits for these fields are the masks listed in Table 10.7 with
+"ok" in the <emphasis>
+enabled_ctrls</emphasis>
+ column. The <emphasis>
+num_groups</emphasis>
+ field reports the number of groups bound to the key belonging to the most
+number of groups and is automatically updated when the keyboard mapping changes.
+</para>
+
+
+<para>
+If the change was caused by a request from a client, the <emphasis>
+keycode</emphasis>
+ and <emphasis>
+event_type</emphasis>
+ fields are set to <emphasis>
+zero </emphasis>
+and the <emphasis>
+req_major</emphasis>
+ and <emphasis>
+req_minor</emphasis>
+ fields identify the request. The <emphasis>
+req_major</emphasis>
+ value is the same as the major extension opcode. Otherwise, <emphasis>
+event_type</emphasis>
+ is set to the type of event that caused the change (one of <emphasis>
+KeyPress</emphasis>
+, <emphasis>
+KeyRelease</emphasis>
+, <emphasis>
+DeviceKeyPress</emphasis>
+, <emphasis>
+DeviceKeyRelease</emphasis>
+, <emphasis>
+ButtonPress</emphasis>
+ or <emphasis>
+ButtonRelease</emphasis>
+), and <emphasis>
+req_major</emphasis>
+ and <emphasis>
+req_minor</emphasis>
+ are undefined. If <emphasis>
+event_type</emphasis>
+ is <emphasis>
+KeyPress</emphasis>
+, <emphasis>
+KeyRelease</emphasis>
+, <emphasis>
+DeviceKeyPress</emphasis>
+, or <emphasis>
+DeviceKeyRelease</emphasis>
+, the <emphasis>
+keycode</emphasis>
+ field is set to the key that caused the change. If <emphasis>
+event_type</emphasis>
+ is <emphasis>
+ButtonPress</emphasis>
+ or <emphasis>
+ButtonRelease</emphasis>
+, <emphasis>
+keycode</emphasis>
+ contains the button number.
+</para>
+
+
+<para>
+When a client receives an <emphasis>
+XkbControlsNotify</emphasis>
+ event, it can note the changes in a changes structure using <emphasis>
+XkbNoteControlsChanges</emphasis>
+.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbNoteControlsChanges</emphasis>
+(<emphasis>
+changes</emphasis>
+,<emphasis>
+ new</emphasis>
+,<emphasis>
+ wanted</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbControlsChangesPtr            <emphasis>
+      changes</emphasis>
+;      /* records changes indicated by new */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbControlsNotifyEvent *            <emphasis>
+      new</emphasis>
+;      /* tells which things have changed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+      wanted</emphasis>
+;      /* tells which parts of new to record in changes */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+The <emphasis>
+wanted</emphasis>
+ parameter is a bitwise inclusive OR of bits taken from the set of masks
+specified in Table 10.7 with "ok" in the <emphasis>
+changed_ctrls</emphasis>
+ column. <emphasis>
+XkbNoteControlsChanges</emphasis>
+ copies any changes reported in <emphasis>
+new</emphasis>
+ and specified in <emphasis>
+wanted</emphasis>
+ into the changes record specified by <emphasis>
+old</emphasis>
+.
+</para>
+
+
+<para>
+Use <emphasis>
+XkbGetControlsChanges</emphasis>
+ to update a local copy of a keyboard description with the changes previously
+noted by one or more calls to <emphasis>
+XkbNoteControlsChanges.</emphasis>
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbGetControlsChanges</emphasis>
+(<emphasis>
+dpy</emphasis>
+,<emphasis>
+ xkb</emphasis>
+,<emphasis>
+ changes</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *            <emphasis>
+dpy</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr            <emphasis>
+xkb</emphasis>
+;            /* <emphasis>
+xkb-&gt;ctrls</emphasis>
+ will be updated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbNameChangesPtr            <emphasis>
+changes</emphasis>
+;            /* indicates which parts of <emphasis>
+xkb-&gt;ctrls</emphasis>
+ to update */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetControlsChanges</emphasis>
+ examines the <emphasis>
+changes</emphasis>
+ parameter, queries the server for the necessary information, and copies the
+results into the <emphasis>
+xkb</emphasis>
+-&gt;<emphasis>
+ctrls</emphasis>
+ keyboard description. If the <emphasis>
+ctrls</emphasis>
+ field of <emphasis>
+xkb</emphasis>
+ is <emphasis>
+NULL</emphasis>
+, <emphasis>
+XkbGetControlsChanges</emphasis>
+ allocates and initializes it. To free the <emphasis>
+ctrls</emphasis>
+ field, use <emphasis>
+XkbFreeControls</emphasis>
+ (see section 10.12). <!-- xref -->
+</para>
+
+
+<para>
+<emphasis>
+XkbGetControlsChanges</emphasis>
+ returns <emphasis>
+Success</emphasis>
+ if successful and can generate <emphasis>
+BadAlloc</emphasis>
+, <emphasis>
+BadImplementation,</emphasis>
+ and <emphasis>
+BadMatch</emphasis>
+ errors.
+</para>
+
+
+</sect1>
+<sect1 id='Allocating_and_Freeing_an_XkbControlsRec'>
+<title>Allocating and Freeing an XkbControlsRec</title>
+
+<para>
+The need to allocate an <emphasis>
+XkbControlsRec</emphasis>
+ structure seldom arises; Xkb creates one when an application calls <emphasis>
+XkbGetControls</emphasis>
+ or a related function. For those situations where there is not an <emphasis>
+XkbControlsRec</emphasis>
+ structure allocated in the <emphasis>
+XkbDescRec</emphasis>
+, allocate one by calling <emphasis>
+XkbAllocControls</emphasis>
+.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbAllocControls</emphasis>
+(<emphasis>
+xkb, which</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr <emphasis>
+            xkb</emphasis>
+;            /* Xkb description in which to allocate ctrls rec */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+            which</emphasis>
+;            /* mask of components of <emphasis>
+ctrls</emphasis>
+ to allocate */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbAllocControls</emphasis>
+ allocates the <emphasis>
+ctrls</emphasis>
+ field of the <emphasis>
+xkb</emphasis>
+ parameter, initializes all fields to zero, and returns <emphasis>
+Success</emphasis>
+. If the <emphasis>
+ctrls</emphasis>
+ field is not <emphasis>
+NULL</emphasis>
+, <emphasis>
+XkbAllocControls</emphasis>
+ simply returns <emphasis>
+Success</emphasis>
+. If <emphasis>
+xkb</emphasis>
+ is <emphasis>
+NULL</emphasis>
+, <emphasis>
+XkbAllocControls</emphasis>
+ reports a <emphasis>
+BadMatch</emphasis>
+ error. If the <emphasis>
+ctrls</emphasis>
+ field could not be allocated, it reports a <emphasis>
+BadAlloc</emphasis>
+ error.
+</para>
+
+
+<para>
+The <emphasis>
+which</emphasis>
+ mask specifies the individual fields of the <emphasis>
+ctrls</emphasis>
+ structure to be allocated and can contain any of the valid masks defined in
+Table 10.7. Because none of the currently existing controls have any structures
+associated with them, which is currently of little practical value in this call.
+</para>
+
+
+<para>
+To free memory used by the <emphasis>
+ctrls</emphasis>
+ member of an <emphasis>
+XkbDescRec </emphasis>
+structure, use <emphasis>
+XkbFreeControls:</emphasis>
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbFreeControls</emphasis>
+(<emphasis>
+xkb, which, free_all</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr<emphasis>
+      xkb</emphasis>
+;            /* Xkb description in which to free controls components */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+which</emphasis>
+;            /* mask of components of <emphasis>
+ctrls</emphasis>
+ to free */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool      <emphasis>
+free_all</emphasis>
+;            /* <emphasis>
+True</emphasis>
+ =&gt; free everything + ctrls itself */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbFreeControls</emphasis>
+ frees the specified components of the <emphasis>
+ctrls</emphasis>
+ field in the <emphasis>
+xkb</emphasis>
+ keyboard description and sets the corresponding structure component values to
+<emphasis>
+NULL</emphasis>
+ or <emphasis>
+zero</emphasis>
+. The <emphasis>
+which</emphasis>
+ mask specifies the fields of <emphasis>
+ctrls</emphasis>
+ to be freed and can contain any of the controls components specified in Table
+10.7.
+</para>
+
+
+<para>
+If <emphasis>
+free_all</emphasis>
+ is <emphasis>
+True</emphasis>
+, <emphasis>
+XkbFreeControls</emphasis>
+ frees every non-<emphasis>
+NULL</emphasis>
+ structure component in the controls, frees the <emphasis>
+XkbControlsRec</emphasis>
+ structure referenced by the <emphasis>
+ctrls</emphasis>
+ member of <emphasis>
+xkb</emphasis>
+, and sets <emphasis>
+ctrls</emphasis>
+ to <emphasis>
+NULL.</emphasis>
+</para>
+
+</sect1>
+<sect1 id='The_Miscellaneous_Per_client_Controls'>
+<title>The Miscellaneous Per-client Controls</title>
+
+<para>
+You can configure the boolean per-client controls which affect the state
+reported in button and key events. See section 12.1.1, 12.3, 12.5, and 16.3.11  <!-- xref -->
+of the XKB Protocol specification for more details.
+</para>
+
+
+<para>
+To get the current values of the <emphasis>
+per-client</emphasis>
+ controls, use <emphasis>
+XkbGetPerClientControls</emphasis>
+.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbGetPerClientControls</emphasis>
+(<emphasis>
+dpy</emphasis>
+, <emphasis>
+ctrls</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *            <emphasis>
+dpy</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int *            <emphasis>
+ctrls</emphasis>
+;            /* 1 bit =&gt; corresponding control is on */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetPerClientControls</emphasis>
+ backfills <emphasis>
+ctrls</emphasis>
+ with the <emphasis>
+per-client </emphasis>
+control attributes for this particular client. It returns <emphasis>
+True</emphasis>
+ if successful, and <emphasis>
+False</emphasis>
+ otherwise.
+</para>
+
+
+<para>
+To change the current values of the <emphasis>
+per-client</emphasis>
+ control attributes, use <emphasis>
+XkbSetPerClientControls.</emphasis>
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbSetPerClientControls</emphasis>
+(<emphasis>
+dpy</emphasis>
+, <emphasis>
+ctrls</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *            <emphasis>
+dpy</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+change</emphasis>
+;            /* 1 bit =&gt; change control */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int *            <emphasis>
+value</emphasis>
+;            /* 1 bit =&gt; control on */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbSetPerClientControls changes the per-client values for the controls selected
+by </emphasis>
+<emphasis>
+change to the corresponding value in value. Legal values for change and value
+are: XkbPCF_GrabsUseXKBStateMask, XkbPCF_LookupStateWhenGrabbed, and
+XkbPCF_SendEventUsesXKBState. More than one control may be changed at one time
+by OR-ing the values together. XkbSetPerClientControls backfills value with the
+</emphasis>
+<emphasis>
+per-client </emphasis>
+<emphasis>
+control attributes for this particular client. </emphasis>
+It returns <emphasis>
+True</emphasis>
+ if successful, and <emphasis>
+False</emphasis>
+ otherwise.
+</para>
+
+</sect1>
+</chapter>
diff --git a/specs/XKB/ch11.xml b/specs/XKB/ch11.xml
new file mode 100644 (file)
index 0000000..52f0897
--- /dev/null
@@ -0,0 +1,576 @@
+<chapter id='X_Library_Controls'>
+<title>X Library Controls</title>
+
+<para>
+The Xkb extension is composed of two parts: a server extension, and a
+client-side X library extension. Chapter 10 discusses functions used to modify
+controls affecting the behavior of the server portion of the Xkb extension.
+This chapter discusses functions used to modify controls that affect only the
+behavior of the client portion of the extension; these controls are known as
+Library Controls.
+</para>
+
+
+<para>
+All of the Library Controls are boolean flags that may be enabled and disabled.
+The controls can be divided into several categories:
+</para>
+
+<itemizedlist>
+<listitem>
+  <para>
+Controls affecting general string lookups
+  </para>
+</listitem>
+<listitem>
+  <para>
+Controls affecting compose processing
+  </para>
+</listitem>
+<listitem>
+  <para>
+Controls affecting event delivery
+  </para>
+</listitem>
+</itemizedlist>
+
+<para>
+There are two types of string lookups performed by <emphasis>
+XLookupString</emphasis>
+. The first type involves translating a single keycode into a string; the
+controls in the first category affect this type of lookup. The second type
+involves translating a series of keysyms into a string; the controls in the
+second category affect this type of lookup.
+</para>
+
+
+<para>
+An Xkb implementation is required to support the programming interface for all
+of the controls. However, an implementation may choose not to support the
+semantics associated with the controls that deal with compose processing. In
+this case, a program that accesses these controls should still function
+normally; however, the feedback that would normally occur with the controls
+enabled may be missing.
+</para>
+
+<sect1 id='Controls_Affecting_Keycode_to_String_Translation'>
+<title>Controls Affecting Keycode-to-String Translation</title>
+
+<para>
+The first type of string lookups, which are here called <emphasis>
+simple string lookups</emphasis>
+, involves translating a single keycode into a string. Because these simple
+lookups involve only a single keycode, all of the information needed to do the
+translation is contained in the keyboard state in a single event. The controls
+affecting simple string lookups are:
+</para>
+
+<para><programlisting>
+     <emphasis>ForceLatin1Lookup</emphasis>
+     <emphasis>ConsumeLookupMods</emphasis>
+     <emphasis>LevelOneUsesShiftAndLock</emphasis>
+</programlisting></para>
+
+<sect2 id='ForceLatin1Lookup'>
+<title>ForceLatin1Lookup</title>
+
+<para>
+If the <emphasis>
+ForceLatin1Lookup</emphasis>
+ control is enabled, <emphasis>
+XLookupString</emphasis>
+ only returns strings using the Latin1 character set. If <emphasis>
+ForceLatin1Lookup</emphasis>
+ is not enabled, <emphasis>
+XLookupString</emphasis>
+ can return characters that are not in the Latin1 set. By default, this control
+is disabled, allowing characters outside of the Latin1 set to be returned.
+</para>
+
+
+</sect2>
+<sect2 id='ConsumeLookupMods'>
+<title>ConsumeLookupMods</title>
+
+<para>
+Simple string lookups in <emphasis>
+XLookupString</emphasis>
+ involve two different translation phases. The first phase translates raw
+device keycodes to individual keysyms. The second phase attempts to map the
+resulting keysym into a string of one or more characters. In the first phase,
+some of the modifiers are normally used to determine the appropriate shift
+level for a key.
+</para>
+
+
+<para>
+The <emphasis>
+ConsumeLookupMods</emphasis>
+ control determines whether or not <emphasis>
+XLookupString</emphasis>
+ <emphasis>
+consumes</emphasis>
+ the modifiers it uses during the first phase of processing (mapping a keycode
+to a keysym). When a modifier is consumed, it is effectively removed from the
+working copy of the keyboard state information <emphasis>
+XLookupString</emphasis>
+ is using and appears to be unset for the remainder of the processing.
+</para>
+
+
+<para>
+If the <emphasis>
+ConsumeLookupMods</emphasis>
+ control is enabled, <emphasis>
+XLookupString</emphasis>
+ does not use the modifiers used to translate the keycode of the event to a
+keysym when it is determining the string associated with a keysym. For example,
+assume the keymap for the ‘A’ key only contains the shift modifier and the
+<emphasis>
+ConsumeLookupMods</emphasis>
+ control is enabled. If a user presses the <emphasis>
+Shift</emphasis>
+ key and the <emphasis>
+A</emphasis>
+ key while the <emphasis>
+Num_Lock</emphasis>
+ key is locked, <emphasis>
+XLookupString</emphasis>
+ uses the <emphasis>
+Shift</emphasis>
+ modifier when mapping the keycode for the ‘a’ key to the keysym for
+‘A’; subsequently, it only uses the <emphasis>
+NumLock</emphasis>
+ modifier when determining the string associated with the keysym ‘A’.
+</para>
+
+
+<para>
+If the <emphasis>
+ConsumeLookupMods</emphasis>
+ control is not enabled, <emphasis>
+XLookupString</emphasis>
+ uses all of the event modifiers to determine the string associated with a
+keysym. This behavior mirrors the behavior of <emphasis>
+XLookupString</emphasis>
+ in the core implementation.
+</para>
+
+
+<para>
+The <emphasis>
+ConsumeLookupMods</emphasis>
+ control is unset by default. For more information on modifier consumption,
+refer to Chapter 12.
+</para>
+
+
+</sect2>
+<sect2 id='AlwaysConsumeShiftAndLock'>
+<title>AlwaysConsumeShiftAndLock</title>
+
+<para>
+The <emphasis>
+AlwaysConsumeShiftAndLock</emphasis>
+ control, if enabled, forces <emphasis>
+XLookupString</emphasis>
+ to consume the <emphasis>
+Shift</emphasis>
+ and <emphasis>
+Lock</emphasis>
+ modifiers when processing all keys, even if the definition for the key type
+does not specify these modifiers. The <emphasis>
+AlwaysConsumeShiftAndLock</emphasis>
+ control is unset by default. See section 15.2 for a discussion of key types.
+</para>
+
+
+</sect2>
+</sect1>
+<sect1 id='Controls_Affecting_Compose_Processing'>
+<title>Controls Affecting Compose Processing</title>
+
+<para>
+The second type of string lookup performed by <emphasis>
+XLookupString</emphasis>
+ involves translating a series of keysyms into a string. Because these lookups
+can involve more than one key event, they require <emphasis>
+XLookupString</emphasis>
+ to retain some state information between successive calls. The process of
+mapping a series of keysyms to a string is known as <emphasis>
+compose processing</emphasis>
+. The controls affecting compose processing are:
+</para>
+
+<para><programlisting>
+<emphasis>ConsumeKeysOnComposeFail</emphasis>
+<emphasis>ComposeLED</emphasis>
+<emphasis>BeepOnComposeFail</emphasis>
+</programlisting></para>
+
+<para>
+Because different vendors have historically used different algorithms to
+implement compose processing, and these algorithms may be incompatible with the
+semantics required by the Xkb compose processing controls, implementation of
+the compose processing controls is optional in an Xkb implementation.
+</para>
+
+
+<sect2 id='ConsumeKeysOnComposeFail'>
+<title>ConsumeKeysOnComposeFail</title>
+
+<para>
+Some compose processing algorithms signal the start of a compose sequence by a
+key event meaning "start compose".
+<footnote><para>
+Another possibility is to have the compose processing simply be the result of a finite state acceptor; a compose sequence would never fail for a properly written finite state acceptor.
+</para></footnote>
+The subsequent key events should normally result in a valid composition yielding a
+valid translation to a string. If the subsequent key events do not have a valid
+translation, some decision must be made about what to do with the key events
+that were processed while attempting the compose. The <emphasis>
+ConsumeKeysOnComposeFail</emphasis>
+ control allows a client to specify what happens with the key events <emphasis>
+XLookupString</emphasis>
+ has been considering when it reaches a dead end in a compose sequence.
+</para>
+
+
+<para>
+If the <emphasis>
+ConsumeKeysOnComposeFail</emphasis>
+ control is set, all keys associated with a failed compose sequence should be
+consumed (discarded). If the <emphasis>
+ConsumeKeysOnComposeFail</emphasis>
+ control is not set, the key events associated with a failed compose sequence
+should be processed as a normal sequence of key events.
+</para>
+
+
+<para>
+The <emphasis>
+ConsumeKeysOnComposeFail</emphasis>
+ control is disabled by default.
+</para>
+
+
+</sect2>
+<sect2 id='ComposeLED'>
+<title>ComposeLED</title>
+
+<para>
+The <emphasis>
+ComposeLED</emphasis>
+ control allows a client to specify whether or not an indicator should be set
+and cleared to provide feedback when compose processing is in progress. The
+control does not specify which indicator should be used; the mapping for this
+is up to the individual implementation. If the <emphasis>
+ComposeLED</emphasis>
+ control is enabled, it specifies that an indicator should be set when a
+compose sequence is in progress and cleared when one is not in progress. The
+<emphasis>
+ComposeLED</emphasis>
+ control is disabled by default.
+</para>
+
+
+<para>
+While the Xkb extension does not specify the type of type of indicator to be
+used when the <emphasis>
+ComposeLED</emphasis>
+ control is implemented, a consistent convention between implementations is to
+everyone’s benefit. If a named indicator is used for this purpose, the
+recommended name is "<emphasis>
+Compose</emphasis>
+". Note that some implementations may use an unnamed, custom hardware LED for
+this purpose.
+</para>
+
+
+</sect2>
+<sect2 id='BeepOnComposeFail'>
+<title>BeepOnComposeFail</title>
+
+<para>
+The <emphasis>
+BeepOnComposeFail</emphasis>
+ control allows a client to specify whether or not a bell should be activated
+to provide feedback when a compose sequence fails. The control does not specify
+the type of bell that should be used; the mapping for this is up to the
+individual implementation. If the <emphasis>
+BeepOnComposeFail</emphasis>
+ control is enabled, it specifies that a bell should be activated when a
+compose sequence fails. The <emphasis>
+BeepOnComposeFail</emphasis>
+ control is disabled by default. If implemented, the bell should be activated
+using <emphasis>
+XkbBell</emphasis>
+ or <emphasis>
+XkbDeviceBell</emphasis>
+.
+</para>
+
+
+<para>
+While the Xkb extension does not specify the type of bell to be used when the
+<emphasis>
+BeepOnComposeFail</emphasis>
+ control is implemented, a consistent convention between implementations is to
+everyone’s benefit. If a named bell is used for this purpose, the recommended
+name is "<emphasis>
+ComposeFail</emphasis>
+".
+</para>
+
+
+</sect2>
+</sect1>
+<sect1 id='Controls_Effecting_Event_Delivery'>
+<title>Controls Effecting Event Delivery</title>
+
+<sect2 id='IgnoreNewKeyboards'>
+<title>IgnoreNewKeyboards</title>
+
+<para>
+When Xkb is initialized, it implicitly forces requests for <emphasis>
+NewKeyboardNotify</emphasis>
+ events. These events may be used by the Xkb library extension internally; they
+are normally translated into core protocol <emphasis>
+MappingNotify</emphasis>
+ events before being passed to the client. While delivering the event to the
+client is appropriate in most cases, it is not appropriate for some clients
+that maintain per-key data structures. This is because once the server has sent
+a <emphasis>
+NewKeyboardNotify</emphasis>
+ event, it is free to send the client events for all keys in the new range and
+that range may be outside of the per-key data structures the client is
+maintaining.
+</para>
+
+
+<para>
+The <emphasis>
+IgnoreNewKeyboards</emphasis>
+ control, if enabled, prevents Xkb from mapping <emphasis>
+NewKeyboardNotify</emphasis>
+ events to core <emphasis>
+MappingNotify</emphasis>
+ events and passing them to the client. The control is initially disabled.
+</para>
+
+
+</sect2>
+</sect1>
+<sect1 id='Manipulating_the_Library_Controls'>
+<title>Manipulating the Library Controls</title>
+
+<para>
+The Library Controls are manipulated using functions that deal with bitmasks to
+indicate which controls to manipulate. The controls are identified by the masks
+defined in Table 11.1. <!-- xref -->
+</para>
+
+<table frame='topbot'>
+<title>Library Control Masks</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='1.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Library Control Mask</entry>
+  <entry>Value</entry>
+  </row>
+</thead>
+<tbody>
+  <row>
+    <entry>XkbLC_ForceLatin1Lookup</entry>
+    <entry>(1 &lt;&lt; 0)</entry>
+  </row>
+  <row>
+    <entry>XkbLC_ConsumeLookupMods</entry>
+    <entry>(1 &lt;&lt; 1)</entry>
+  </row>
+  <row>
+    <entry>XkbLC_AlwaysConsumeShiftAndLock</entry>
+    <entry>(1 &lt;&lt; 2)</entry>
+  </row>
+  <row>
+    <entry>XkbLC_IgnoreNewKeyboards</entry>
+    <entry>(1 &lt;&lt; 3)</entry>
+  </row>
+  <row>
+    <entry>XkbLC_ConsumeKeysOnComposeFail</entry>
+    <entry>(1 &lt;&lt; 29)</entry>
+  </row>
+  <row>
+    <entry>XkbLC_ComposeLED</entry>
+    <entry>(1 &lt;&lt; 30)</entry>
+  </row>
+  <row>
+    <entry>XkbLC_BeepOnComposeFail</entry>
+    <entry>(1 &lt;&lt; 31)</entry>
+  </row>
+  <row>
+    <entry>XkbLC_AllControls</entry>
+    <entry>(0xc0000007)</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<sect2 id='Determining_Which_Library_Controls_are_Implemented'>
+<title>Determining Which Library Controls are Implemented</title>
+
+<para>
+To determine which Library Controls are actually
+implemented, use <emphasis>XkbXlibControlsImplemented</emphasis>.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+unsigned int <emphasis>
+XkbXlibControlsImplemented</emphasis>
+(<emphasis>
+display</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *<emphasis>
+            display</emphasis>
+;                  /* connection to X server */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbXlibControlsImplemented</emphasis>
+ returns a bitmask indicating the controls actually implemented in the Xkb
+library and is composed of an inclusive OR of bits from Table 11.1.
+</para>
+
+
+</sect2>
+<sect2 id='Determining_the_State_of_the_Library_Controls'>
+<title>Determining the State of the Library Controls</title>
+
+<para>
+To determine the current state of the Library Controls, use <emphasis>
+XkbGetXlibControls</emphasis>
+.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+unsigned int <emphasis>
+XkbGetXlibControls</emphasis>
+(<emphasis>
+display</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *<emphasis>
+            display</emphasis>
+;                  /* connection to X server */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetXlibControls</emphasis>
+ returns the current state of the Library Controls as a bit mask that is an
+inclusive OR of the control masks from Table 11.1 for the controls that are
+enabled. For the optional compose processing controls, the fact that a control
+is enabled does not imply that it is actually implemented.
+</para>
+
+</sect2>
+<sect2 id='Changing_the_State_of_the_Library_Controls'>
+<title>Changing the State of the Library Controls</title>
+
+<para>
+To change the state of the Library Controls, use
+<emphasis>XkbSetXlibControls</emphasis>.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbSetXlibControls</emphasis>
+(<emphasis>
+display, bits_to_change, values_for_bits</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *<emphasis>
+            display</emphasis>
+;                  /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned long            <emphasis>
+bits_to_change</emphasis>
+;                  /* selects controls to be modified */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned long            <emphasis>
+values_for_bits</emphasis>
+;                  /* turns selected controls on (1) or off (0) */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbSetXlibControls</emphasis>
+ modifies the state of the controls selected by <emphasis>
+bits_to_change</emphasis>
+; only the controls selected by <emphasis>
+bits_to_change</emphasis>
+ are modified. If the bit corresponding to a control is on in <emphasis>
+bits_to_change</emphasis>
+ and also on in values_for_bits, the control is enabled. If the bit
+corresponding to a control is on in <emphasis>
+bits_to_change</emphasis>
+ but off in <emphasis>
+values_for_bits</emphasis>
+, the control is disabled. <emphasis>
+bits_to_change</emphasis>
+ should be an inclusive OR of bits from Table 11.1.
+</para>
+
+</sect2>
+</sect1>
+</chapter>
diff --git a/specs/XKB/ch12.xml b/specs/XKB/ch12.xml
new file mode 100644 (file)
index 0000000..1a06201
--- /dev/null
@@ -0,0 +1,848 @@
+<chapter id='Interpreting_Key_Events'>
+<title>Interpreting Key Events</title>
+
+<para>
+Xkb provides functions to help developers interpret key events without having
+to directly interpret Xkb data structures. Xkb also modifies the behavior of
+several core X library functions.
+</para>
+
+<sect1 id='Effects_of_Xkb_on_the_Core_X_Library'>
+<title>Effects of Xkb on the Core X Library</title>
+
+<para>
+When support for Xkb is built into the X library, the <emphasis>
+XOpenDisplay</emphasis>
+ function looks for a compatible version of Xkb on the server. If it finds a
+compatible version, it initializes the extension and enables <emphasis>
+implicit support</emphasis>
+ for Xkb in a number of X library functions. This makes it possible for clients
+to take advantage of nearly all Xkb features without having to be rewritten or
+even recompiled, if they are built with shared libraries. This implicit support
+is invisible to most clients, but it can have side effects, so the extension
+includes ways to control or disable it.
+</para>
+
+
+<sect2 id='Effects_of_Xkb_on_Event_State'>
+<title>Effects of Xkb on Event State</title>
+
+<para>
+Because <emphasis>
+XOpenDisplay</emphasis>
+ initializes Xkb, some events contain an Xkb description of the keyboard state
+instead of that normally used by the core protocol. See section 17.1.1 for more
+information about the differences between Xkb keyboard state and that reported
+by the core protocol.
+</para>
+
+
+</sect2>
+<sect2 id='Effects_of_Xkb_on_MappingNotify_Events'>
+<title>Effects of Xkb on MappingNotify Events</title>
+
+<para>
+When Xkb is missing or disabled, the X library tracks changes to the keyboard
+mapping using <emphasis>
+MappingNotify</emphasis>
+ events. Whenever the keyboard mapping is changed, the server sends all clients
+a <emphasis>
+MappingNotify</emphasis>
+ event to report the change. When a client receives a <emphasis>
+MappingNotify</emphasis>
+ event, it is supposed to call <emphasis>
+XRefreshKeyboardMapping</emphasis>
+ to update the keyboard description used internally by the X library.
+</para>
+
+
+<para>
+The X Keyboard Extension uses <emphasis>
+XkbMapNotify</emphasis>
+ and <emphasis>
+XkbNewKeyboardNotify</emphasis>
+ events to track changes to the keyboard mapping. When an Xkb-aware client
+receives either event, it should call <emphasis>
+XkbRefreshKeyboardMapping</emphasis>
+ to update the keyboard description used internally by the X library. To avoid
+duplicate events, the X server does not send core protocol <emphasis>
+MappingNotify</emphasis>
+ events to a client that has selected for <emphasis>
+XkbMapNotify</emphasis>
+ events.
+</para>
+
+
+<para>
+The implicit support for Xkb selects for <emphasis>
+XkbMapNotify</emphasis>
+ events. This means that clients that do not explicitly use Xkb but that are
+using a version of the X library that has implicit support for Xkb do not
+receive <emphasis>
+MappingNotify</emphasis>
+ events over the wire. Clients that were not written with Xkb in mind do not
+recognize or properly handle the new Xkb events, so the implicit support
+converts them to <emphasis>
+MappingNotify</emphasis>
+ events that report approximately the same information, unless the client has
+explicitly selected for the Xkb version of the event.
+</para>
+
+
+<para>
+An Xkb-capable X server does not send events from keys that fall outside the
+legal range of keycodes expected by that client. Once the server sends a client
+an <emphasis>
+XkbNewKeyboardNotify</emphasis>
+ event, it reports events from all keys because it assumes that any client that
+has receieved an <emphasis>
+XkbNewKeyboardNotify</emphasis>
+ event expects key events from the new range of keycodes. The implicit support
+for Xkb asks for <emphasis>
+XkbNewKeyboardNotify</emphasis>
+ events, so the range of keycodes reported to the client might vary without the
+client’s knowledge. Most clients don’t really care about the range of legal
+keycodes, but some clients maintain information about each key and might have
+problems with events that come from unexpected keys. Such clients can set the
+<emphasis>
+XkbLC_IgnoreNewKeyboards</emphasis>
+ library control (see section 11.3.1) to prevent the implicit support from
+requesting notification of changes to the legal range of keycodes.
+</para>
+
+
+</sect2>
+<sect2 id='X_Library_Functions_Affected_by_Xkb'>
+<title>X Library Functions Affected by Xkb</title>
+
+<para>
+The following X library functions are modified by Xkb:
+</para>
+
+<para><programlisting>
+     <emphasis>XKeycodeToKeysym</emphasis>
+     <emphasis>XKeysymToKeycode</emphasis>
+     <emphasis>XLookupKeysym</emphasis>
+     <emphasis>XLookupString</emphasis>
+     <emphasis>XRefreshKeyboardMapping</emphasis>
+     <emphasis>XRebindKeysym</emphasis>
+</programlisting></para>
+
+<para>
+The implicit support for Xkb replaces a number of X library functions with
+versions that understand and use the X Keyboard Extension. In most cases, the
+semantics of the new versions are identical to those of the old, but there are
+occasional visible differences. This section lists all of the functions that
+are affected and the differences in behavior, if any, that are visible to
+clients.
+</para>
+
+
+<para>
+The <emphasis>
+XKeycodeToKeysym</emphasis>
+ function reports the keysym associated with a particular index for a single
+key. The index specifies a column of symbols in the core keyboard mapping (that
+is, as reported by the core protocol <emphasis>
+GetKeyboardMapping</emphasis>
+ request). The order of the symbols in the core mapping does not necessarily
+correspond to the order of the symbols used by Xkb; section 17.1.3 describes
+the differences.
+</para>
+
+
+<para>
+The <emphasis>
+XKeysymToKeycode</emphasis>
+ function reports a keycode to which a particular keysym is bound. When Xkb is
+missing or disabled, this function looks in each column of the core keyboard
+mapping in turn and returns the lowest numbered key that matches in the lowest
+numbered group. When Xkb is present, this function uses the Xkb ordering for
+symbols instead.
+</para>
+
+
+<para>
+The <emphasis>
+XLookupKeysym</emphasis>
+ function reports the symbol in a specific column of the key associated with an
+event. Whether or not Xkb is present, the column specifies an index into the
+core symbol mapping.
+</para>
+
+
+<para>
+The <emphasis>
+XLookupString</emphasis>
+ function reports the symbol and string associated with a key event, taking
+into account the keycode and keyboard state as reported in the event. When Xkb
+is disabled or missing, <emphasis>
+XLookupString</emphasis>
+ uses the rules specified by the core protocol and reports only ISO Latin-1
+characters. When Xkb is present, <emphasis>
+XLookupString</emphasis>
+ uses the explicit keyboard group, key types, and rules specified by Xkb. When
+Xkb is present, <emphasis>
+XLookupString</emphasis>
+ is allowed, but not required, to return strings in character sets other than
+ISO Latin-1, depending on the current locale. If any key bindings are defined,
+<emphasis>
+XLookupString</emphasis>
+ does not use any consumed modifiers (see sections 11.1.2 and 15.2) to
+determine matching bindings.
+</para>
+
+
+<para>
+The <emphasis>
+XRefreshKeyboardMapping</emphasis>
+ function updates the X library’s internal representation of the keyboard to
+reflect changes reported via <emphasis>
+MappingNotify</emphasis>
+ events. When Xkb is missing or disabled, this function reloads the entire
+modifier map or keyboard mapping. When Xkb is present, the implicit Xkb support
+keeps track of the changed components reported by each <emphasis>
+XkbMapNotify</emphasis>
+ event and updates only those pieces of the keyboard description that have
+changed. If the implicit support has not noted any keyboard mapping changes,
+<emphasis>
+XRefreshKeyboardMapping</emphasis>
+ updates the entire keyboard description.
+</para>
+
+
+<para>
+The <emphasis>
+XRebindKeysym</emphasis>
+ function associates a string with a keysym and a set of modifiers. Xkb does
+not directly change this function, but it does affect the way that the state
+reported in the event is compared to the state specified to <emphasis>
+XRebindKeysym</emphasis>
+. When Xkb is missing or disabled, <emphasis>
+XLookupString</emphasis>
+ returns the specified string if the modifiers in the event exactly match the
+modifiers from this call. When Xkb is present, any modifiers used to determine
+the keysym are consumed and are not used to look up the string.
+</para>
+
+
+</sect2>
+</sect1>
+<sect1 id='Xkb_Event_and_Keymap_Functions'>
+<title>Xkb Event and Keymap Functions</title>
+
+<para>
+To find the keysym bound to a particular key at a specified group and shift
+level, use <emphasis>XkbKeycodeToKeysym</emphasis>.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+KeySym <emphasis>
+XkbKeycodeToKeysym</emphasis>
+(<emphasis>
+dpy, kc, group, level</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *            dpy;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+KeyCode            kc;            /* key of interest */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            group;            /* group of interest */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            level;            /* shift level of interest */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbKeycodeToKeysym</emphasis>
+ returns the keysym bound to a particular group and shift level for a
+particular key on the core keyboard. If <emphasis>
+kc</emphasis>
+ is not a legal keycode for the core keyboard, or if <emphasis>
+group</emphasis>
+ or <emphasis>
+level</emphasis>
+ are out of range for the specified key, <emphasis>
+XkbKeycodeToKeysym</emphasis>
+ returns <emphasis>
+NoSymbol</emphasis>
+.
+</para>
+
+
+<para>
+To find the set of modifiers bound to a particular keysym on the core keyboard,
+use <emphasis>
+XkbKeysymToModifiers</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+unsigned<emphasis>
+ </emphasis>
+int <emphasis>
+XkbKeysymToModifiers</emphasis>
+(<emphasis>
+dpy</emphasis>
+,<emphasis>
+ ks</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *<emphasis>
+            dpy</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+KeySym <emphasis>
+            ks</emphasis>
+;            /* keysym of interest */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbKeysymToModifiers</emphasis>
+ finds the set of modifiers currently bound to the keysym <emphasis>
+ks</emphasis>
+ on the core keyboard. The value returned is the mask of modifiers bound to the
+keysym <emphasis>
+ks</emphasis>
+. If no modifiers are bound to the keysym, <emphasis>
+XkbKeysymToModifiers</emphasis>
+ returns zero; otherwise, it returns the inclusive OR of zero or more of the
+following: <emphasis>
+ShiftMask</emphasis>
+, <emphasis>
+ControlMask</emphasis>
+, <emphasis>
+LockMask</emphasis>
+, <emphasis>
+Mod1Mask</emphasis>
+, <emphasis>
+Mod2Mask</emphasis>
+, <emphasis>
+Mod3Mask</emphasis>
+, <emphasis>
+Mod4Mask,</emphasis>
+ and <emphasis>
+Mod5Mask</emphasis>
+.
+</para>
+
+
+<para>
+Use <emphasis>
+XkbLookupKeySym</emphasis>
+ to find the symbol associated with a key for a particular state.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbLookupKeySym</emphasis>
+(<emphasis>
+dpy</emphasis>
+,<emphasis>
+ key</emphasis>
+,<emphasis>
+ state</emphasis>
+,<emphasis>
+ mods_rtrn</emphasis>
+,<emphasis>
+ sym_rtrn</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display * <emphasis>
+            dpy</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+KeyCode <emphasis>
+            key</emphasis>
+;            /* key for which symbols are to be found */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int <emphasis>
+            state</emphasis>
+;            /* state for which symbol should be found */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int * <emphasis>
+            mods_rtrn</emphasis>
+;            /* backfilled with unconsumed modifiers */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+KeySym *<emphasis>
+            sym_rtrn</emphasis>
+;            /* backfilled with symbol associated with key + state */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbLookupKeySym</emphasis>
+ is the equivalent of the core <emphasis>
+XLookupKeySym</emphasis>
+ function. For the core keyboard, given a keycode <emphasis>
+key</emphasis>
+ and an Xkb state <emphasis>
+state</emphasis>
+, <emphasis>
+XkbLookupKeySym</emphasis>
+ returns the symbol associated with the key  in <emphasis>
+sym_rtrn</emphasis>
+ and the list of modifiers that should still be applied in <emphasis>
+mods_rtrn</emphasis>
+. The <emphasis>
+state</emphasis>
+ parameter is the state from a <emphasis>
+KeyPress</emphasis>
+ or <emphasis>
+KeyRelease</emphasis>
+ event. <emphasis>
+XkbLookupKeySym</emphasis>
+ returns <emphasis>
+True</emphasis>
+ if it succeeds.
+</para>
+
+
+<para>
+Use <emphasis>
+XkbLookupKeyBinding</emphasis>
+ to find the string bound to a key by <emphasis>
+XRebindKeySym</emphasis>
+. <emphasis>
+XkbLookupKeyBinding</emphasis>
+ is the equivalent of the core <emphasis>
+XLookupString</emphasis>
+ function.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+int <emphasis>
+XkbLookupKeyBinding</emphasis>
+(<emphasis>
+dpy</emphasis>
+,<emphasis>
+ sym</emphasis>
+,<emphasis>
+ state</emphasis>
+,<emphasis>
+ buf</emphasis>
+,<emphasis>
+ nbytes</emphasis>
+,<emphasis>
+ extra_rtrn</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display * <emphasis>
+            dpy</emphasis>
+;            /* connection to server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+KeySym<emphasis>
+            sym</emphasis>
+;            /* symbol to be looked up */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+state</emphasis>
+;            /* state for which string is to be looked up */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+char * <emphasis>
+            buf</emphasis>
+;            /* buffer into which returned string is written */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int <emphasis>
+            nbytes</emphasis>
+;            /* size of buffer in bytes */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int * <emphasis>
+            extra_rtrn</emphasis>
+;            /* backfilled with number bytes overflow */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XRebindKeysym</emphasis>
+ binds an ASCII string to a specified keysym, so that the string and keysym are
+returned when the key is pressed and a specified list of modifiers are also
+being held down. <emphasis>
+XkbLookupKeyBinding</emphasis>
+ returns in <emphasis>
+buf</emphasis>
+ the string associated with the keysym <emphasis>
+sym</emphasis>
+ and modifier state <emphasis>
+state</emphasis>
+. <emphasis>
+buf</emphasis>
+ is <emphasis>
+NULL</emphasis>
+ terminated unless there’s an overflow. If the string returned is larger than
+<emphasis>
+nbytes</emphasis>
+, a count of bytes that does not fit into the buffer is returned in extra_rtrn.
+<emphasis>
+XkbTranslateKeySym</emphasis>
+ returns the number of bytes that it placed into <emphasis>
+buf</emphasis>
+.
+</para>
+
+
+<para>
+To find the string and symbol associated with a keysym for a given keyboard
+state, use <emphasis>
+XkbTranslateKeySym</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+int <emphasis>
+XkbTranslateKeySym</emphasis>
+(<emphasis>
+dpy</emphasis>
+,<emphasis>
+ sym_inout</emphasis>
+,<emphasis>
+ mods</emphasis>
+,<emphasis>
+ buf</emphasis>
+,<emphasis>
+ nbytes</emphasis>
+, <emphasis>
+extra_rtrn</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display * <emphasis>
+            dpy</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+KeySym * <emphasis>
+            sym_inout</emphasis>
+;            /* symbol to be translated; result of translation */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int <emphasis>
+            mods</emphasis>
+;            /* modifiers to apply to <emphasis>
+sym_inout</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+char * <emphasis>
+            buf</emphasis>
+;            /* buffer into which returned string is written */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int <emphasis>
+            nbytes</emphasis>
+;            /* size of buffer in bytes */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int *<emphasis>
+            extra_rtrn</emphasis>
+;            /* number of bytes overflow*/
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbTranslateKeySym</emphasis>
+ applies the transformations specified in <emphasis>
+mods</emphasis>
+ to the symbol specified by <emphasis>
+sym_inout</emphasis>
+. It returns in <emphasis>
+buf</emphasis>
+ the string, if any, associated with the keysym for the current locale. If the
+transformations in <emphasis>
+mods</emphasis>
+ changes the keysym, <emphasis>
+sym_inout</emphasis>
+ is updated accordingly. If the string returned is larger than <emphasis>
+nbytes</emphasis>
+, a count of bytes that does not fit into the buffer is returned in extra_rtrn.
+<emphasis>
+XkbTranslateKeySym</emphasis>
+ returns the number of bytes it placed into <emphasis>
+buf</emphasis>
+.
+</para>
+
+
+<para>
+To update the keyboard description that is internal to the X library, use
+<emphasis>
+XkbRefreshKeyboardMapping</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbRefreshKeyboardMapping</emphasis>
+(<emphasis>
+event)</emphasis>
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbMapNotifyEvent * <emphasis>
+            event</emphasis>
+;            /* event initiating remapping */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbRefreshKeyboardMapping</emphasis>
+ is the Xkb equivalent of the core <emphasis>
+XRefreshKeyboardMapping</emphasis>
+ function. It requests that the X server send the current key mapping
+information to this client. A client usually invokes <emphasis>
+XkbRefreshKeyboardMapping</emphasis>
+ after receiving an <emphasis>
+XkbMapNotify</emphasis>
+ event. <emphasis>
+XkbRefreshKeyboardMapping</emphasis>
+ returns <emphasis>
+Success</emphasis>
+ if it succeeds and <emphasis>
+BadMatch</emphasis>
+ if the event is not an Xkb event.
+</para>
+
+
+<para>
+The <emphasis>
+XkbMapNotify</emphasis>
+ event can be generated when some client calls <emphasis>
+XkbSetMap</emphasis>
+, <emphasis>
+XkbChangeMap</emphasis>
+, <emphasis>
+XkbGetKeyboardByName</emphasis>
+, or any of the standard X library functions that change the keyboard mapping
+or modifier mapping.
+</para>
+
+
+<para>
+To translate a keycode to a key symbol and modifiers, use <emphasis>
+XkbTranslateKeyCode</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Booll <emphasis>
+XkbTranslateKeyCode</emphasis>
+(<emphasis>
+xkb, key, mods, mods_rtrn, keysym_rtrn)</emphasis>
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr            <emphasis>
+xkb</emphasis>
+;            /* keyboard description to use for translation */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+KeyCode            <emphasis>
+key</emphasis>
+;            /* keycode to translate */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+mods</emphasis>
+;            /* modifiers to apply when translating <emphasis>
+key</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int *            <emphasis>
+mods_rtrn</emphasis>
+;            /* backfilled with unconsumed modifiers */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+KeySym *            <emphasis>
+keysym_rtrn</emphasis>
+;            /* keysym resulting from translation */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+mods_rtrn</emphasis>
+ is backfilled with the modifiers consumed by the translation process.
+<emphasis>
+mods</emphasis>
+ is a bitwise inclusive OR of the legal modifier masks: <emphasis>
+ShiftMask</emphasis>
+, <emphasis>
+LockMask</emphasis>
+, <emphasis>
+ControlMask</emphasis>
+, <emphasis>
+Mod1Mask</emphasis>
+, <emphasis>
+Mod2Mask</emphasis>
+, <emphasis>
+Mod3Mask</emphasis>
+, <emphasis>
+Mod4Mask</emphasis>
+, <emphasis>
+Mod5Mask</emphasis>
+.The <emphasis>
+AlwaysConsumeShiftAndLock</emphasis>
+ library control (see section 11.1.3), if enabled, causes <emphasis>
+XkbTranslateKeyCode</emphasis>
+ to consume shift and lock.<emphasis>
+ XkbTranslateKeyCode</emphasis>
+ returns <emphasis>
+True</emphasis>
+ if the translation resulted in a keysym, and <emphasis>
+False</emphasis>
+ if it resulted in <emphasis>
+NoSymbol</emphasis>
+.
+</para>
+</sect1>
+</chapter>
diff --git a/specs/XKB/ch13.xml b/specs/XKB/ch13.xml
new file mode 100644 (file)
index 0000000..ed6066d
--- /dev/null
@@ -0,0 +1,4197 @@
+<chapter id='Keyboard_Geometry'>
+<title>Keyboard Geometry</title>
+
+<para>
+The Xkb description of a keyboard includes an optional keyboard geometry that
+describes the physical appearance of the keyboard. Keyboard geometry describes
+the shape, location, and color of all keyboard keys or other visible keyboard
+components such as indicators. The information contained in a keyboard geometry
+is sufficient to allow a client program to draw an accurate two-dimensional
+image of the keyboard.
+</para>
+
+
+<para>
+You can retrieve a keyboard geometry from an X server that supports Xkb, or you
+can allocate it from scratch and initialize it in a client program. The
+keyboard geometry need not have any correspondence with the physical keyboard
+that is connected to the X server.
+</para>
+
+
+<para>
+Geometry measurements are specified in mm/10 units. The origin (0,0) is in the
+top left corner of the keyboard image. A component’s own origin is also its
+upper left corner. In some cases a component needs to be drawn rotated. For
+example, a special keyboard may have a section of keys arranged in rows in a
+rectangular area, but the entire rectangle may not be in alignment with the
+rest of the keyboard, and instead, it is rotated from horizontal by 30<emphasis>
+o</emphasis>
+. Rotation for a geometry object is specified in 1/10 o increments about its
+origin. An example of a keyboard with rotated sections is shown in Figure 13.1.
+</para>
+
+<mediaobject>
+ <imageobject> <imagedata format="SVG" fileref="XKBlib-7.svg"/>
+ </imageobject>
+<caption>Rotated Keyboard Sections</caption>
+</mediaobject>
+
+
+<!-- <H5 CLASS="Figure">
+Rotated Keyboard Sections</H5>
+-->
+
+<para>
+Some geometry components include a <emphasis>
+priority</emphasis>
+, which indicates the order in which overlapping objects should be drawn.
+Objects should be drawn in order from highest priority (0) to lowest (255).
+</para>
+
+
+<para>
+The keyboard geometry’s top-level description is stored in a <emphasis>
+XkbGeometryRec</emphasis>
+ structure. This structure contains three types of information:
+</para>
+
+<orderedlist>
+  <listitem>
+    <para>
+Lists of items, not used to draw the basic keyboard, but indexed by the
+geometry descriptions that comprise the entire keyboard geometry (colors,
+geometry properties, key aliases, shapes)
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A number of singleton items that describe the keyboard as a whole (keyboard
+name, width and height, a color for the keyboard as a whole, and a color for
+keyboard key labels)
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A list of the keyboard’s sections and nonkey doodads
+    </para>
+  </listitem>
+</orderedlist>
+
+<para>
+The top-level geometry is described in more detail in the following.
+</para>
+
+
+<para>
+The lists of items used by components of the keyboard geometry description is
+as follows:
+</para>
+
+<itemizedlist>
+<listitem>
+  <para>
+The top-level keyboard geometry description includes a list of up to <emphasis>
+MaxColors</emphasis>
+ (32) <emphasis>
+color names</emphasis>
+. A color name is a string whose interpretation is not specified by Xkb. The
+<emphasis>
+XkbColorRec</emphasis>
+ structure provides a field for this name as well as a pixel field. The pixel
+field is a convenient place for an application to store a pixel value or color
+definition, if it needs to. All other geometry data structures refer to colors
+using their indices in this global list.
+  </para>
+</listitem>
+<listitem>
+  <para>
+The top-level keyboard geometry description includes a list of <emphasis>
+geometry properties</emphasis>
+. A geometry property associates an arbitrary string with an equally arbitrary
+name. Geometry properties can be used to provide hints to programs that display
+images of keyboards, but they are not interpreted by Xkb. No other geometry
+structures refer to geometry properties. As an example of a possible use of
+<emphasis>
+properties</emphasis>
+, consider the pause/break key on most PC keyboards: the "break" symbol is
+usually on the front of the key and is often a different color. A program might
+set a property to:
+  </para>
+  <para>
+LBL_PAUS = "{Pause/top/black,Break/front/red}"
+  </para>
+  <para>
+and use the property information to draw the key with a front label as well as
+a top label.
+  </para>
+</listitem>
+<listitem>
+  <para>
+The top-level keyboard geometry description includes a list of <emphasis>
+key aliases</emphasis>
+ (see Chapter 18). Key aliases allow the keyboard layout designer to assign
+multiple key names to a single key.
+  </para>
+<note><para>Key aliases defined in the geometry component of a keyboard mapping
+override those defined in the keycodes component of the server database, which
+are stored in the <emphasis>
+XkbNamesRec</emphasis>
+ (<emphasis>
+xkb-&gt;names</emphasis>
+). Therefore, consider the key aliases defined by the geometry before
+considering key aliases supplied by the keycodes.</para></note>
+</listitem>
+<listitem>
+  <para>
+The top-level keyboard geometry description includes a list of <emphasis>
+shapes</emphasis>
+; other keyboard components refer to shapes by their index in this list. A
+shape consists of an arbitrary name of type Atom and one or more closed-polygon
+<emphasis>
+outlines</emphasis>
+. All points in an outline are specified relative to the origin of its
+enclosing shape, that is, whichever shape that contains this outline in its
+list of outlines. One outline is the primary outline. The primary outline is by
+default the first outline, or it can be optionally specified by the <emphasis>
+primary</emphasis>
+ field in the <emphasis>
+XkbShapeRec</emphasis>
+ structure. A keyboard display application can generate a simpler but still
+accurate keyboard image by displaying only the primary outlines for each shape.
+Nonrectangular keys must include a rectangular <emphasis>
+approximation</emphasis>
+ as one of the outlines associated with the shape. The approximation is not
+normally displayed but can be used by very simple keyboard display applications
+to generate a recognizable but degraded image of the keyboard.
+  </para>
+</listitem>
+</itemizedlist>
+
+<para>
+The <emphasis>
+XkbGeometryRec</emphasis>
+ top-level geometry description contains the following information that
+pertains to the keyboard as a whole:
+</para>
+
+<itemizedlist>
+<listitem>
+  <para>
+A <emphasis>
+keyboard symbolic name</emphasis>
+ of type Atom to help users identify the keyboard.
+  </para>
+</listitem>
+<listitem>
+  <para>
+The <emphasis>
+width</emphasis>
+ and <emphasis>
+height</emphasis>
+ of the keyboard, in mm/10. For nonrectangular keyboards, the width and height
+describe the smallest bounding box that encloses the outline of the keyboard.
+  </para>
+</listitem>
+<listitem>
+  <para>
+The<emphasis>
+ base color</emphasis>
+ of the keyboard is the predominant color on the keyboard and is used as the
+default color for any components whose color is not explicitly specified.
+  </para>
+</listitem>
+<listitem>
+  <para>
+The <emphasis>
+label color</emphasis>
+ is the color used to draw the labels on most of the keyboard keys.
+  </para>
+</listitem>
+<listitem>
+  <para>
+The <emphasis>
+label font</emphasis>
+ is a string that describes the font used to draw labels on most keys; label
+fonts are arbitrary strings, because Xkb does not specify the format or name
+space for font names.
+  </para>
+</listitem>
+</itemizedlist>
+
+<para>
+The keyboard is subdivided into named <emphasis>
+sections</emphasis>
+ of related keys and doodads. The sections and doodads on the keyboard are
+listed in the <emphasis>
+XkbGeometryRec</emphasis>
+ top-level keyboard geometry description. A section is composed of keys that
+are physically together and logically related. Figure 13.2 shows a keyboard
+that is divided into four sections. A <emphasis>
+doodad</emphasis>
+ describes some visible aspect of the keyboard that is not a key and is not a
+section.
+</para>
+
+<mediaobject>
+ <imageobject> <imagedata format="SVG" fileref="XKBlib-8.svg"/>
+ </imageobject>
+<caption>Keyboard with Four Sections</caption>
+</mediaobject>
+
+<!--
+<H5 CLASS="Figure">
+Keyboard with Four Sections</H5>
+-->
+
+<sect1 id='Shapes_and_Outlines'>
+<title>Shapes and Outlines</title>
+
+<para>
+A <emphasis>
+shape</emphasis>
+, used to draw keyboard components and stored in a <emphasis>
+XkbShapeRec</emphasis>
+ structure, has:
+</para>
+
+<itemizedlist>
+<listitem>
+  <para>
+An arbitrary name of type Atom.
+  </para>
+</listitem>
+<listitem>
+  <para>
+Bounds (two x and y coordinates) that describe the corners of a rectangle
+containing the shape’s top surface outline.
+  </para>
+</listitem>
+<listitem>
+  <para>
+A list of one or more outlines (described below).
+  </para>
+</listitem>
+<listitem>
+  <para>
+Optional pointers to a primary and an approximation outline (described below).
+If either of these pointers is <emphasis>
+NULL</emphasis>
+, the default primary/approximation outline is the first one in the list of
+outlines for the shape.
+  </para>
+</listitem>
+</itemizedlist>
+
+<para>
+An <emphasis>
+outline</emphasis>
+, stored in a <emphasis>
+XkbOutlineRec</emphasis>
+ structure, is a list of one or more points that describes a single
+closed-polygon, as follows:
+</para>
+
+<itemizedlist>
+<listitem>
+  <para>
+A list with a single point describes a rectangle with one corner at the origin
+of the shape (0,0) and the opposite corner at the specified point.
+  </para>
+</listitem>
+<listitem>
+  <para>
+A list of two points describes a rectangle with one corner at the position
+specified by the first point and the opposite corner at the position specified
+by the second point.
+  </para>
+</listitem>
+<listitem>
+  <para>
+A list of three or more points describes an arbitrary polygon. If necessary,
+the polygon is automatically closed by connecting the last point in the list
+with the first.
+  </para>
+</listitem>
+<listitem>
+  <para>
+A nonzero value for the <emphasis>
+corner_radius</emphasis>
+ field specifies that the corners of the polygon should be drawn as circles
+with the specified radius.
+  </para>
+</listitem>
+</itemizedlist>
+
+<para>
+All points in an outline are specified relative to the origin of the enclosing
+shape. Points in an outline may have negative values for the X and Y coordinate.
+</para>
+
+
+<para>
+One outline is the primary outline; a keyboard display application can generate
+a simple but still accurate keyboard image by displaying only the primary
+outlines for each shape. The default primary outline is the first in a
+shape’s list of outlines. If the <emphasis>
+primary</emphasis>
+ field of the <emphasis>
+XkbShapeRec</emphasis>
+ structure is not <emphasis>
+NULL</emphasis>
+, it points to the primary outline. A rectangular <emphasis>
+approximation</emphasis>
+ must be included for nonrectangular keys as one of the outlines associated
+with the shape; the approximation is not normally displayed but can be used by
+very simple keyboard display applications to generate a recognizable but
+degraded image of the keyboard.
+</para>
+
+</sect1>
+<sect1 id='Sections'>
+<title>Sections</title>
+
+<para>
+As previously noted, a keyboard is subdivided into <emphasis>
+sections</emphasis>
+ of related keys. Each section has its own coordinate system — if a section
+is rotated, the coordinates of any components within the section are
+interpreted relative to the edges that were on the top and left before
+rotation. The components that make up a section, stored in a <emphasis>
+XkbSectionRec</emphasis>
+, include:
+</para>
+
+<itemizedlist>
+<listitem>
+  <para>
+An arbitrary name of type Atom.
+  </para>
+</listitem>
+<listitem>
+  <para>
+A priority, to indicate drawing order. 0 is the highest priority, 255 the
+lowest.
+  </para>
+</listitem>
+<listitem>
+  <para>
+Origin of the section, relative to the origin of the keyboard.
+  </para>
+</listitem>
+<listitem>
+  <para>
+The width and height and the angle of rotation.
+  </para>
+</listitem>
+<listitem>
+  <para>
+A list of <emphasis>
+rows</emphasis>
+. A row is a list of horizontally or vertically adjacent keys. Horizontal rows
+parallel the (prerotation) top of the section, and vertical rows parallel the
+(prerotation) left of the section. All keys in a horizontal row share a common
+top coordinate; all keys in a vertical row share a left coordinate. Figure 13.3
+shows the alpha section from the keyboard shown in Figure 13.2, divided into
+rows. Rows and keys are defined below.
+  </para>
+</listitem>
+</itemizedlist>
+
+<mediaobject>
+  <imageobject> <imagedata format="SVG" fileref="XKBlib-9.svg"/>
+  </imageobject>
+  <caption>Rows in a Section</caption>
+</mediaobject>
+
+
+
+<!--
+<H5 CLASS="Figure">
+Rows in a Section</H5>
+-->
+<itemizedlist>
+<listitem>
+  <para>
+An optional list of <emphasis>
+doodads</emphasis>
+; any type of doodad can be enclosed within a section. Position and angle of
+rotation are relative to the origin and angle of rotation of the sections that
+contain them. Priority for doodads in a section is relative to the other
+components of the section, not to the keyboard as a whole.
+  </para>
+</listitem>
+<listitem>
+  <para>
+An optional <emphasis>
+overlay</emphasis>
+ with a name of type Atom and a list of overlay rows (described below).
+  </para>
+</listitem>
+<listitem>
+  <para>
+Bounds (two x and y coordinates) that describe the corners of a rectangle
+containing the entire section.
+  </para>
+</listitem>
+</itemizedlist>
+</sect1>
+<sect1 id='Rows_and_Keys'>
+<title>Rows and Keys</title>
+
+<para>
+A row description (<emphasis>
+XkbRowRec</emphasis>
+) consists of the coordinates of its origin relative to its enclosing section,
+a flag indicating whether the row is horizontal or vertical, and a list of keys
+in the row.
+</para>
+
+
+<para>
+A key description (<emphasis>
+XkbKeyRec</emphasis>
+) consists of a key name, a shape, a key color, and a gap. The key name should
+correspond to one of the keys named in the keyboard names description, the
+shape specifies the appearance of the key, and the key color specifies the
+color of the key (not the label on the key; the label color is stored in the
+<emphasis>
+XkbGeometryRec</emphasis>
+). Keys are normally drawn immediately adjacent to one another from left to
+right (or top to bottom) within a row. The gap field specifies the distance
+between a key and its predecessor.
+</para>
+
+
+</sect1>
+<sect1 id='Doodads'>
+<title>Doodads</title>
+
+<para>
+Doodads can be global to the keyboard or part of a section. Doodads have
+symbolic names of arbitrary length. The only doodad name whose interpretation
+is specified by Xkb is "Edges", which, if present, describes the outline of the
+entire keyboard.
+</para>
+
+
+<para>
+Each doodad’s origin is stored in fields named <emphasis>
+left</emphasis>
+ and <emphasis>
+top</emphasis>
+, which are the coordinates of the doodad’s origin relative to its enclosing
+object, whether it be a section or the top-level keyboard. The priority for
+doodads that are listed in the top-level geometry is relative to the other
+doodads listed in the top-level geometry and the sections listed in the
+top-level geometry. The priority for doodads listed in a section are relative
+to the other components of the section. Each doodad is stored in a structure
+with a <emphasis>
+type</emphasis>
+ field, which specifies the type of doodad.
+</para>
+
+<para>
+Xkb supports five types of doodads:
+</para>
+
+<itemizedlist>
+<listitem>
+  <para>
+An <emphasis>
+indicator doodad</emphasis>
+ describes one of the physical keyboard indicators. Indicator doodads specify
+the shape of the indicator, the indicator color when it is lit (<emphasis>
+on_color</emphasis>
+) and the indicator color when it is dark (<emphasis>
+off_color</emphasis>
+).
+  </para>
+</listitem>
+<listitem>
+  <para>
+An <emphasis>
+outline doodad</emphasis>
+ describes some aspect of the keyboard to be drawn as one or more hollow,
+closed polygons. Outline doodads specify the shape, color, and angle of
+rotation about the doodad origin at which they should be drawn.
+  </para>
+</listitem>
+<listitem>
+  <para>
+A <emphasis>
+solid doodad</emphasis>
+ describes some aspect of the keyboard to be drawn as one or more filled
+polygons. Solid doodads specify the shape, color, and angle of rotation about
+the doodad origin at which they should be drawn.
+  </para>
+</listitem>
+<listitem>
+  <para>
+A <emphasis>
+text doodad</emphasis>
+ describes a text label somewhere on the keyboard. Text doodads specify the
+label string, the font and color to use when drawing the label, and the angle
+of rotation of the doodad about its origin.
+  </para>
+</listitem>
+<listitem>
+  <para>
+A <emphasis>
+logo doodad </emphasis>
+is a catch-all, which describes some other visible element of the keyboard. A
+logo doodad is essentially an outline doodad with an additional symbolic name
+that describes the element to be drawn. If a keyboard display program
+recognizes the symbolic name, it can draw something appropriate within the
+bounding region of the shape specified in the doodad. If the symbolic name does
+not describe a recognizable image, it should draw an outline using the
+specified shape, outline, and angle of rotation. The Xkb extension does not
+specify the interpretation of logo names.
+  </para>
+</listitem>
+</itemizedlist>
+
+<para>
+The structures these doodads are stored in and the values of the <emphasis>
+type</emphasis>
+ fields are shown in Table 13.1.
+</para>
+
+<table frame='topbot'>
+<title>Doodad Types</title>
+<?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>Doodad</entry>
+  <entry>Structure</entry>
+  <entry>Type</entry>
+  </row>
+</thead>
+<tbody>
+  <row>
+    <entry><emphasis>
+indicator doodad</emphasis>
+</entry>
+    <entry><emphasis>
+XkbIndicatorDoodadRec</emphasis>
+</entry>
+    <entry><emphasis>
+XkbIndicatorDoodad</emphasis>
+</entry>
+  </row>
+  <row>
+    <entry><emphasis>
+outline doodad</emphasis>
+</entry>
+    <entry><emphasis>
+XkbShapeDoodadRec</emphasis>
+</entry>
+    <entry><emphasis>
+XkbOutlineDoodad</emphasis>
+</entry>
+  </row>
+  <row>
+    <entry><emphasis>
+solid doodad</emphasis>
+</entry>
+    <entry><emphasis>
+XkbShapeDoodadRec</emphasis>
+</entry>
+    <entry><emphasis>
+XkbSolidDoodad</emphasis>
+</entry>
+  </row>
+  <row>
+    <entry><emphasis>
+text doodad</emphasis>
+</entry>
+    <entry><emphasis>
+XkbTextDoodadRec</emphasis>
+</entry>
+    <entry><emphasis>
+XkbTextDoodad</emphasis>
+</entry>
+  </row>
+  <row>
+    <entry><emphasis>
+logo doodad</emphasis>
+</entry>
+    <entry><emphasis>
+XkbLogoDoodadRec</emphasis>
+</entry>
+    <entry><emphasis>
+XkbLogoDoodad</emphasis>
+</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+</sect1>
+<sect1 id='Overlay_Rows_and_Overlay_Keys'>
+<title>Overlay Rows and Overlay Keys</title>
+
+<para>
+An <emphasis>
+overlay row</emphasis>
+ (<emphasis>
+XkbOverlayRowRec</emphasis>
+) contains a pointer to the row it overlays and a list of <emphasis>
+overlay keys</emphasis>
+.
+</para>
+
+
+<para>
+Each overlay key definition (<emphasis>
+XkbOverlayKeyRec</emphasis>
+) indicates a key that can yield multiple keycodes and consists of a field
+named <emphasis>
+under</emphasis>
+, which specifies the primary name of the key and a field named <emphasis>
+over</emphasis>
+, which specifies the name for the key when the overlay keycode is selected.
+The key specified in <emphasis>
+under</emphasis>
+ must be a member of the section that contains the overlay key definition,
+while the key specified in over must not be.
+</para>
+
+
+</sect1>
+<sect1 id='Drawing_a_Keyboard_Representation'>
+<title>Drawing a Keyboard Representation</title>
+
+<para>
+To draw a representation of the keyboard, draw in the following order:
+</para>
+
+<para><programlisting>
+     Draw the top-level keyboard as a rectangle, using its width and height.
+     For each component (section or doodad) of the top-level geometry, in priority order:
+        If component is a section
+           For each row, in the order it appears in the section
+              Draw keys in the order they appear in the row
+           Draw doodads within the section in priority order.
+        Else draw doodad
+</programlisting></para>
+
+</sect1>
+<sect1 id='Geometry_Data_Structures'>
+<title>Geometry Data Structures</title>
+
+<para>
+In the following figures, a solid arrow denotes a pointer to an array of
+structures or a singleton structure. A dotted arrow denotes an index or a
+pointer into the array.
+</para>
+
+<!--
+<MAP NAME="XKBlib-10">
+</MAP>
+-->
+<mediaobject>
+ <imageobject> <imagedata format="SVG" fileref="XKBlib-10.svg"/>
+ </imageobject>
+<caption>Xkb Geometry Data Structures</caption>
+</mediaobject>
+
+<!--
+<H5 CLASS="Figure">
+Xkb Geometry Data Structures</H5>
+<P CLASS="SmallBody">
+&nbsp;</P>
+<MAP NAME="XKBlib-11">
+</MAP>
+-->
+<mediaobject>
+ <imageobject> <imagedata format="SVG" fileref="XKBlib-11.svg"/>
+ </imageobject>
+<caption>Xkb Geometry Data Structures (Doodads)</caption>
+</mediaobject>
+
+<!--
+<H5 CLASS="Figure">
+Xkb Geometry Data Structures (Doodads)</H5>
+-->
+
+<!--
+<MAP NAME="XKBlib-12">
+</MAP>
+-->
+<mediaobject>
+ <imageobject> <imagedata format="SVG" fileref="XKBlib-12.svg"/>
+ </imageobject>
+<caption>Xkb Geometry Data Structures (Overlays)</caption>
+</mediaobject>
+
+<!--
+<H5 CLASS="Figure">
+Xkb Geometry Data Structures (Overlays)</H5>
+-->
+<para><programlisting>
+typedef struct _XkbGeometry {              /* top-level keyboard geometry structure */
+      Atom                name;            /* keyboard name */
+      unsigned short      width_mm;        /* keyboard width in <emphasis> mm</emphasis> /<emphasis> 10</emphasis> */
+      unsigned short      height_mm;       /* keyboard height in <emphasis> mm</emphasis> /<emphasis> 10</emphasis> */
+      char *              label_font;      /* font for key labels */
+      XkbColorPtr         label_color;     /* color for key labels - pointer into colors array */
+      XkbColorPtr         base_color;      /* color for basic keyboard - pointer into colors array */
+      unsigned short      sz_properties;   /* size of properties array */
+      unsigned short      sz_colors;       /* size of colors array */
+      unsigned short      sz_shapes;       /* size of shapes array */
+      unsigned short      sz_sections;     /* size of sections array */
+      unsigned short      sz_doodads;      /* size of doodads array */
+      unsigned short      sz_key_aliases;  /* size of key aliases array */
+      unsigned short      num_properties;  /* number of properties in the properties array */
+      unsigned short      num_colors;      /* number of colors in the colors array */
+      unsigned short      num_shapes;      /* number of shapes in the shapes array */
+      unsigned short      num_sections;    /* number of sections in the sections array */
+      unsigned short      num_doodads;     /* number of doodads in the doodads array */
+      unsigned short      num_key_aliases; /* number of key aliases in the key */
+      XkbPropertyPtr      properties;      /* properties array */
+      XkbColorPtr         colors;          /* colors array */
+      XkbShapePtr         shapes;          /* shapes array */
+      XkbSectionPtr       sections;        /* sections array */
+      XkbDoodadPtr        doodads;         /* doodads array */
+      XkbKeyAliasPtr      key_aliases;     /* key aliases array */
+} <emphasis>XkbGeometryRec</emphasis>*XkbGeometryPtr;
+</programlisting></para>
+
+<para>
+The <emphasis>
+doodads</emphasis>
+ array is only for doodads not contained in any of the <emphasis>
+sections</emphasis>
+ that has its own <emphasis>
+doodads</emphasis>
+. The key aliases contained in the <emphasis>
+key_aliases</emphasis>
+ array take precedence over any defined in the keycodes component of the
+keyboard description.
+</para>
+
+<para><programlisting>
+typedef struct _XkbProperty {
+      char *      name;            /* property name */
+      char *      value;           /* property value */
+} <emphasis>XkbPropertyRec</emphasis>,*XkbPropertyPtr;
+</programlisting></para>
+
+<para><programlisting>
+typedef struct _XkbColor {
+      unsigned int      pixel;     /* color */
+      char *            spec;      /* color name */
+} <emphasis>XkbColorRec</emphasis>,*XkbColorPtr;
+</programlisting></para>
+
+<para><programlisting>
+typedef struct _XkbKeyAliasRec {
+      char      real[XkbKeyNameLength];   /* real name of the key */
+      char      alias[XkbKeyNameLength];  /* alias for the key */
+} <emphasis>XkbKeyAliasRec</emphasis>,*XkbKeyAliasPtr;
+</programlisting></para>
+
+<para><programlisting>
+typedef struct _XkbPoint {                /* x,y coordinates */
+      short      x;
+      short      y;
+} <emphasis>XkbPointRec</emphasis>, *XkbPointPtr;
+</programlisting></para>
+
+<para><programlisting>
+typedef struct _XkbOutline {
+      unsigned short      num_points;     /* number of points in the outline */
+      unsigned short      sz_points;      /* size of the points array */
+      unsigned short      corner_radius;  /* draw corners as circles with this radius */
+      XkbPointPtr         points;         /* array of points defining the outline */
+} <emphasis>XkbOutlineRec</emphasis>, *XkbOutlinePtr;
+</programlisting></para>
+
+<para><programlisting>
+typedef struct _XkbBounds {
+      short      x1,y1;            /* upper left corner of the bounds,
+                                      in <emphasis>mm</emphasis>/<emphasis>10</emphasis> */
+       short      x2,y2;            /* lower right corner of the bounds, in
+                                      <emphasis>mm</emphasis>/<emphasis>10</emphasis> */
+} <emphasis>XkbBoundsRec</emphasis>, *XkbBoundsPtr;
+</programlisting></para>
+
+<para><programlisting>
+typedef struct _XkbShape {
+      Atom              name;           /* shape’s name */
+      unsigned short    num_outlines;   /* number of outlines for the shape */
+      unsigned short    sz_outlines;    /* size of the outlines array */
+      XkbOutlinePtr     outlines;       /* array of outlines for the shape */
+      XkbOutlinePtr     approx;         /* pointer into the array to the approximating outline */
+      XkbOutlinePtr     primary;        /* pointer into the array to the primary outline */
+      XkbBoundsRec      bounds;         /* bounding box for the shape; encompasses all outlines */
+} <emphasis>XkbShapeRec</emphasis>, *XkbShapePtr;
+</programlisting></para>
+
+<para>
+If <emphasis>
+approx</emphasis>
+ and/or <emphasis>
+primary</emphasis>
+ is <emphasis>
+NULL</emphasis>
+, the default value is used. The default primary outline is the first element
+in the outlines array, as is the default approximating outline.
+</para>
+
+<para><programlisting>
+typedef struct _XkbKey {         /* key in a row */
+      XkbKeyNameRec    name;     /* key name */
+      short            gap;      /* gap in <emphasis>mm</emphasis>/<emphasis>10</emphasis> from previous key in row */
+      unsigned char    shape_ndx;      /* index of shape for key */
+      unsigned char    color_ndx;      /* index of color for key body */
+} <emphasis>XkbKeyRec</emphasis>, *XkbKeyPtr;
+</programlisting></para>
+
+<para><programlisting>
+typedef struct _XkbRow {             /* row in a section */
+      short               top;       /* top coordinate of row origin, relative to section’s origin */
+      short               left;      /* left coordinate of row origin, relative to section’s origin */
+      unsigned short      num_keys;  /* number of keys in the keys array */
+      unsigned short      sz_keys;   /* size of the keys array */
+      int                 vertical;  /* <emphasis>True</emphasis> =&gt;vertical row,
+                                        <emphasis> False</emphasis> =&gt;horizontal row */
+      XkbKeyPtr           keys;      /* array of keys in the row*/
+      XkbBoundsRec        bounds;    /* bounding box for the row */
+} <emphasis>XkbRowRec</emphasis>, *XkbRowPtr;
+</programlisting></para>
+
+<para>
+<emphasis>
+top</emphasis>
+ and <emphasis>
+left</emphasis>
+ are in <emphasis>
+mm</emphasis>
+/<emphasis>
+10</emphasis>
+.
+</para>
+
+<para><programlisting>
+typedef struct _XkbOverlayRec {
+      Atom              name;           /* overlay name */
+      XkbSectionPtr     section_under;  /* the section under this overlay */
+      unsigned short    num_rows;       /* number of rows in the rows array */
+      unsigned short    sz_rows;        /* size of the rows array */
+      XkbOverlayRowPtr  rows;           /* array of rows in the overlay */
+      XkbBoundsPtr      bounds;         /* bounding box for the overlay */
+} <emphasis>XkbOverlayRec</emphasis>,*XkbOverlayPtr;
+</programlisting></para>
+
+<para><programlisting>
+typedef struct _XkbOverlayRow {
+      unsigned short      row_under;     /* index into the row under this overlay row */
+      unsigned short      num_keys;      /* number of keys in the keys array */
+      unsigned short      sz_keys;       /* size of the keys array */
+      XkbOverlayKeyPtr    keys;          /* array of keys in the overlay row */
+} <emphasis>XkbOverlayRowRec</emphasis>,*XkbOverlayRowPtr;
+</programlisting></para>
+
+<para>
+<emphasis>
+row_under</emphasis>
+ is an index into the array of <emphasis>
+rows</emphasis>
+ in the section under this overlay. The section under this overlay row is the
+one pointed to by <emphasis>
+section_under</emphasis>
+ in this overlay row’s <emphasis>
+XkbOverlayRec</emphasis>
+.
+</para>
+
+<para><programlisting>
+typedef struct _XkbOverlayKey {
+      XkbKeyNameRec      over;      /* name of this overlay key */
+      XkbKeyNameRec      under;     /* name of the key under this overlay key */
+} <emphasis>XkbOverlayKeyRec</emphasis>,*XkbOverlayKeyPtr;
+</programlisting></para>
+
+<para><programlisting>
+typedef struct _XkbSection {
+      Atom            name;          /* section name */
+      unsigned char   priority;      /* drawing priority, 0=&gt;highest, 255=&gt;lowest */
+      short           top;           /* top coordinate of section origin */
+      short           left;          /* left coordinate of row origin */
+      unsigned short  width;         /* section width, in <emphasis>mm</emphasis>/<emphasis>10</emphasis> */
+      unsigned short  height;        /* section height, in <emphasis>mm</emphasis>/<emphasis>10</emphasis> */
+      short           angle;         /* angle of section rotation, counterclockwise */
+      unsigned short  num_rows;      /* number of rows in the rows array */
+      unsigned short  num_doodads;   /* number of doodads in the doodads array */
+      unsigned short  num_overlays;  /* number of overlays in the overlays array */
+      unsigned short  sz_rows;       /* size of the rows array */
+      unsigned short  sz_doodads;    /* size of the doodads array */
+      unsigned short  sz_overlays;   /* size of the overlays array */
+      XkbRowPtr       rows;          /* section rows array */
+      XkbDoodadPtr    doodads;       /* section doodads array */
+      XkbBoundsRec    bounds;        /* bounding box for the section, before rotation*/
+      XkbOverlayPtr   overlays;      /* section overlays array */
+} <emphasis>XkbSectionRec</emphasis>, *XkbSectionPtr;
+</programlisting></para>
+
+<para>
+<emphasis>
+top</emphasis>
+ and <emphasis>
+left</emphasis>
+ are the origin of the section, relative to the origin of the keyboard, in
+<emphasis>
+mm</emphasis>
+/<emphasis>
+10</emphasis>
+. <emphasis>
+angle</emphasis>
+ is in <emphasis>
+1</emphasis>
+/<emphasis>
+10</emphasis>
+ degrees.
+</para>
+
+<sect2 id='DoodadRec_Structures'>
+<title>DoodadRec Structures</title>
+
+<para>
+The doodad arrays in the <emphasis>
+XkbGeometryRec</emphasis>
+ and the <emphasis>
+XkbSectionRec</emphasis>
+ may contain any of the doodad structures and types shown in Table 13.1.
+</para>
+
+
+<para>
+The doodad structures form a union:
+</para>
+
+<para><programlisting>
+typedef union _XkbDoodad {
+        XkbAnyDoodadRec        any;
+        XkbShapeDoodadRec      shape;
+        XkbTextDoodadRec       text;
+        XkbIndicatorDoodadRec  indicator;
+        XkbLogoDoodadRec       logo;
+} <emphasis>XkbDoodadRec</emphasis>, *XkbDoodadPtr;
+</programlisting></para>
+
+<para>
+The <emphasis>
+top</emphasis>
+ and <emphasis>
+left</emphasis>
+ coordinates of each doodad are the coordinates of the origin of the doodad
+relative to the keyboard’s origin if the doodad is in the <emphasis>
+XkbGeometryRec</emphasis>
+ doodad array, and with respect to the section’s origin if the doodad is in a
+<emphasis>
+XkbSectionRec</emphasis>
+ doodad array. The <emphasis>
+color_ndx</emphasis>
+ or <emphasis>
+on_color_ndx</emphasis>
+ and <emphasis>
+off_color_ndx</emphasis>
+ fields are color indices into the <emphasis>
+XkbGeometryRec</emphasis>
+’s color array and are the colors to draw the doodads with. Similarly, the
+<emphasis>
+shape_ndx</emphasis>
+ fields are indices into the <emphasis>
+XkbGeometryRec</emphasis>
+’s shape array.
+</para>
+
+<para><programlisting>
+typedef struct _XkbShapeDoodad {
+      Atom       name;                /* doodad name */
+      unsigned char      type;        /* <emphasis>XkbOutlineDoodad</emphasis>
+                                         or <emphasis>XkbSolidDoodad</emphasis> */
+      unsigned char      priority;    /* drawing priority,
+                                         0=&gt;highest, 255=&gt;lowest */
+      short      top;                 /* top coordinate, in <emphasis>mm</emphasis>/<emphasis>10</emphasis> */
+      short      left;                /* left coordinate, in <emphasis>mm</emphasis>/<emphasis>10</emphasis> */
+      short      angle;               /* angle of rotation, clockwise, in <emphasis>1</emphasis>/<emphasis>10</emphasis> degrees */
+      unsigned short      color_ndx;  /* doodad color */
+      unsigned short      shape_ndx;  /* doodad shape */
+} <emphasis>XkbShapeDoodadRec</emphasis>, *XkbShapeDoodadPtr;
+</programlisting></para>
+
+<para><programlisting>
+typedef struct _XkbTextDoodad {
+      Atom            name;         /* doodad name */
+      unsigned char   type;         /* <emphasis> XkbTextDoodad</emphasis> */
+      unsigned char   priority;     /* drawing priority,
+                                       0=&gt;highest, 255=&gt;lowest */
+      short           top;          /* top coordinate, in <emphasis>mm</emphasis>/<emphasis>10</emphasis> */
+      short           left;         /* left coordinate, in <emphasis>mm</emphasis>/<emphasis>10</emphasis> */
+      short           angle;        /* angle of rotation, clockwise, in <emphasis>1</emphasis>/<emphasis>10</emphasis> degrees */
+      short           width;        /* width in <emphasis>mm</emphasis>/<emphasis>10</emphasis> */
+      short           height;       /* height in <emphasis>mm</emphasis>/<emphasis>10</emphasis> */
+      unsigned short  color_ndx;    /* doodad color */
+      char *           text;        /* doodad text */
+      char *           font;        /* arbitrary font name for doodad text */
+} <emphasis>XkbTextDoodadRec</emphasis>, *XkbTextDoodadPtr;
+</programlisting></para>
+
+<para><programlisting>
+typedef struct _XkbIndicatorDoodad {
+      Atom           name;          /* doodad name */
+      unsigned char  type;          /* <emphasis>XkbIndicatorDoodad</emphasis> */
+      unsigned char  priority;      /* drawing priority, 0=&gt;highest, 255=&gt;lowest */
+      short          top;           /* top coordinate, in <emphasis>mm</emphasis>/<emphasis>10</emphasis> */
+      short          left;          /* left coordinate, in <emphasis>mm</emphasis>/<emphasis>10</emphasis> */
+      short          angle;         /* angle of rotation, clockwise, in <emphasis>1</emphasis>/<emphasis>10</emphasis> degrees */
+      unsigned short shape_ndx;     /* doodad shape */
+      unsigned short on_color_ndx;  /* color for doodad if indicator is on */
+      unsigned short off_color_ndx; /* color for doodad if indicator is off */
+} <emphasis>XkbIndicatorDoodadRec</emphasis>, *XkbIndicatorDoodadPtr;
+</programlisting></para>
+
+<para><programlisting>
+typedef struct _XkbLogoDoodad {
+      Atom               name;        /* doodad name */
+      unsigned char      type;        /* <emphasis> XkbLogoDoodad</emphasis> */
+      unsigned char      priority;    /* drawing priority, 0=&gt;highest, 255=&gt;lowest */
+      short              top;         /* top coordinate, in <emphasis>mm</emphasis>/<emphasis>10</emphasis> */
+      short              left;        /* left coordinate, in <emphasis>mm</emphasis>/<emphasis>10</emphasis> */
+      short              angle;       /* angle of rotation, clockwise, in <emphasis>1</emphasis>/<emphasis>10</emphasis> degrees */
+      unsigned short      color_ndx;  /* doodad color */
+      unsigned short      shape_ndx;  /* doodad shape */
+      char *      logo_name;          /* text for logo */
+} <emphasis>XkbLogoDoodadRec</emphasis>, *XkbLogoDoodadPtr
+</programlisting></para>
+
+</sect2>
+</sect1>
+<sect1 id='Getting_Keyboard_Geometry_From_the_Server'>
+<title>Getting Keyboard Geometry From the Server</title>
+
+<para>
+You can load a keyboard geometry as part of the keyboard description returned
+by <emphasis>
+XkbGetKeyboard</emphasis>
+. However, if a keyboard description has been previously loaded, you can
+instead obtain the geometry by calling the <emphasis>
+XkbGetGeometry</emphasis>
+. In this case, the geometry returned is the one associated with the keyboard
+whose device ID is contained in the keyboard description.
+</para>
+
+<para>
+To load a keyboard geometry if you already have the keyboard description, use
+<emphasis>XkbGetGeometry</emphasis>.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbGetGeometry</emphasis>
+(<emphasis>
+dpy</emphasis>
+,<emphasis>
+ xkb</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *            <emphasis>
+dpy</emphasis>
+;      /* connection to the X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr      <emphasis>
+      xkb</emphasis>
+;      /* keyboard description that contains the ID for the keyboard and into
+which the geometry should be loaded */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetGeometry</emphasis>
+ can return <emphasis>
+BadValue</emphasis>
+, <emphasis>
+BadImplementation</emphasis>
+, <emphasis>
+BadName</emphasis>
+, <emphasis>
+BadAlloc,</emphasis>
+ or <emphasis>
+BadLength</emphasis>
+ errors or <emphasis>
+Success</emphasis>
+ if it succeeds.
+</para>
+
+<para>
+It is also possible to load a keyboard geometry by name. The X server maintains
+a database of keyboard components (see Chapter 20). To load a keyboard geometry
+description from this database by name, use <emphasis>
+XkbGetNamedGeometry</emphasis>.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbGetNamedGeometry</emphasis>
+(<emphasis>
+dpy</emphasis>
+,<emphasis>
+ xkb</emphasis>
+,<emphasis>
+ name</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *      <emphasis>
+dpy</emphasis>
+;      /* connection to the X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr      <emphasis>
+xkb</emphasis>
+;      /* keyboard description into which the geometry should be loaded */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Atom      <emphasis>
+name</emphasis>
+;      /* name of the geometry to be loaded */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetNamedGeometry</emphasis>
+ can return <emphasis>
+BadName</emphasis>
+ if the <emphasis>
+name</emphasis>
+ cannot be found.
+</para>
+
+</sect1>
+<sect1 id='Using_Keyboard_Geometry'>
+<title>Using Keyboard Geometry</title>
+
+<para>
+Xkb provides a number of convenience functions to help use a keyboard geometry.
+These include functions to return the bounding box of a shape’s top surface
+and to update the bounding box of a shape row or section.
+</para>
+
+<para>
+A shape is made up of a number of outlines. Each outline is a polygon made up
+of a number of points. The bounding box of a shape is a rectangle that contains
+all the outlines of that shape.
+</para>
+
+<mediaobject>
+ <imageobject> <imagedata format="SVG" fileref="XKBlib-13.svg"/>
+ </imageobject>
+<caption>Key Surface, Shape Outlines, and Bounding Box</caption>
+ </mediaobject>
+
+
+<!--
+<H5 CLASS="Figure">
+Key Surface, Shape Outlines, and Bounding Box</H5>
+-->
+
+<para>
+To determine the bounding box of the top surface of a shape, use <emphasis>
+XkbComputeShapeTop</emphasis>.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbComputeShapeTop</emphasis>
+(<emphasis>
+shape</emphasis>
+,<emphasis>
+ bounds_rtrn</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbShapePtr      <emphasis>
+      shape</emphasis>
+;      /* shape to be examined */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbBoundsPtr      <emphasis>
+      bounds_rtrn</emphasis>
+      /* backfilled with the bounding box for the shape */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbComputeShapeTop</emphasis>
+ returns a <emphasis>
+BoundsRec</emphasis>
+ that contains two x and y coordinates. These coordinates describe the corners
+of a rectangle that contains the outline that describes the top surface of the
+shape. The top surface is defined to be the approximating outline if the
+<emphasis>
+approx</emphasis>
+ field of <emphasis>
+shape</emphasis>
+ is not <emphasis>
+NULL</emphasis>
+. If <emphasis>
+approx</emphasis>
+ is <emphasis>
+NULL</emphasis>
+, the top surface is defined as the last outline in the <emphasis>
+shape</emphasis>
+’s array of outlines. <emphasis>
+XkbComputeShapeTop</emphasis>
+ returns <emphasis>
+False</emphasis>
+ if <emphasis>
+shape</emphasis>
+ is <emphasis>
+NULL</emphasis>
+ or if there are no outlines for the shape; otherwise, it returns
+<emphasis>True</emphasis>.
+</para>
+
+
+<para>
+A <emphasis>
+ShapeRec</emphasis>
+ contains a <emphasis>
+BoundsRec</emphasis>
+ that describes the bounds of the shape. If you add or delete an outline to or
+from a shape, the bounding box must be updated. To update the bounding box of a
+shape, use <emphasis>XkbComputeShapeBounds</emphasis>.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbComputeShapeBounds</emphasis>
+(<emphasis>
+shape</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbShapePtr      <emphasis>
+      shape</emphasis>
+;            /* shape to be examined */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbComputeShapeBounds</emphasis>
+ updates the <emphasis>
+BoundsRec</emphasis>
+ contained in the <emphasis>
+shape</emphasis>
+ by examining all the outlines of the shape and setting the <emphasis>
+BoundsRec</emphasis>
+ to the minimum x and minimum y, and maximum x and maximum y values found in
+those outlines. <emphasis>
+XkbComputeShapeBounds</emphasis>
+ returns <emphasis>
+False</emphasis>
+ if <emphasis>
+shape</emphasis>
+ is <emphasis>
+NULL</emphasis>
+ or if there are no outlines for the shape; otherwise, it returns <emphasis>
+True</emphasis>
+.
+</para>
+
+<para>
+ If you add or delete a key to or from a row, or if you update the shape of one
+of the keys in that row, you may need to update the bounding box of that row.
+To update the bounding box of a row, use <emphasis>XkbComputeRowBounds</emphasis>.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbComputeRowBounds</emphasis>
+(<emphasis>
+geom</emphasis>
+,<emphasis>
+ section</emphasis>
+,<emphasis>
+ row</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbGeometryPtr      <emphasis>
+      geom</emphasis>
+;      /* geometry that contains the <emphasis>
+section</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbSectionPtr      <emphasis>
+      section</emphasis>
+;      /* section that contains the row */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbRowPtr            <emphasis>
+row</emphasis>
+;      /* row to be examined and updated */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbComputeRowBounds</emphasis>
+ checks the bounds of all keys in the <emphasis>
+row </emphasis>
+and updates the bounding box of the row if necessary. <emphasis>
+XkbComputeRowBounds</emphasis>
+ returns <emphasis>
+False</emphasis>
+ if any of the arguments is <emphasis>
+NULL</emphasis>
+; otherwise, it returns <emphasis>
+True</emphasis>
+.
+</para>
+
+<para>
+ If you add or delete a row to or from a section, or if you change the geometry
+of any of the rows in that section, you may need to update the bounding box for
+that section. To update the bounding box of a section, use
+<emphasis>XkbComputeSectionBounds</emphasis>.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbComputeSectionBounds</emphasis>
+(<emphasis>
+geom</emphasis>
+,<emphasis>
+ section</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbGeometryPtr      <emphasis>
+      geom</emphasis>
+;      /* geometry that contains the <emphasis>
+section</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbSectionPtr      <emphasis>
+      section</emphasis>
+;      /* section to be examined and updated */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbComputeSectionBounds</emphasis>
+ examines all the rows of the <emphasis>
+section</emphasis>
+ and updates the bounding box of that section so that it contains all rows.
+<emphasis>
+XkbComputeSectionBounds</emphasis>
+ returns <emphasis>
+False</emphasis>
+ if any of the arguments is <emphasis>
+NULL</emphasis>
+; otherwise, it returns <emphasis>
+True</emphasis>
+.
+</para>
+
+<para>
+Keys that can generate multiple keycodes may be associated with multiple names.
+Such keys have a primary name and an alternate name. To find the alternate name
+by using the primary name for a key that is part of an overlay, use <emphasis>
+XkbFindOverlayForKey</emphasis>.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+char * <emphasis>
+XkbFindOverlayForKey</emphasis>
+(<emphasis>
+geom</emphasis>
+,<emphasis>
+ section</emphasis>
+,<emphasis>
+ under</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbGeometryPtr      <emphasis>
+      geom</emphasis>
+;      /* geometry that contains the <emphasis>
+section</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbSectionPtr      <emphasis>
+      section</emphasis>
+;      /* section to be searched for matching keys */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+char *      <emphasis>
+      under</emphasis>
+.      /* primary name of the key to be considered */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbFindOverlayForKey</emphasis>
+ uses the primary name of the key, <emphasis>
+under</emphasis>
+, to look up the alternate name, which it returns.
+</para>
+
+
+</sect1>
+<sect1 id='Adding_Elements_to_a_Keyboard_Geometry'>
+<title>Adding Elements to a Keyboard Geometry</title>
+
+<para>
+Xkb provides functions to add a single new element to the top-level keyboard
+geometry. In each case the <emphasis>
+num_ </emphasis>
+<emphasis>
+*</emphasis>
+ fields of the corresponding structure is incremented by 1. These functions do
+not change <emphasis>
+sz_</emphasis>
+<emphasis>
+*</emphasis>
+ unless there is no more room in the array. Some of these functions fill in the
+values of the element’s structure from the arguments. For other functions,
+you must explicitly write code to fill the structure’s elements.
+</para>
+
+
+<para>
+The top-level geometry description includes a list of <emphasis>
+geometry properties</emphasis>
+. A geometry property associates an arbitrary string with an equally arbitrary
+name. Programs that display images of keyboards can use geometry properties as
+hints, but they are not interpreted by Xkb. No other geometry structures refer
+to geometry properties.
+</para>
+
+
+<para>
+To add one property to an existing keyboard geometry description, use <emphasis>
+XkbAddGeomProperty</emphasis>
+.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+XkbPropertyPtr <emphasis>
+XkbAddGeomProperty</emphasis>
+(<emphasis>
+geom</emphasis>
+,<emphasis>
+ name</emphasis>
+,<emphasis>
+ value</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbGeometryPtr      <emphasis>
+      geom</emphasis>
+;      /* geometry to be updated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+char *      <emphasis>
+      name</emphasis>
+;      /* name of the new property */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+char *      <emphasis>
+      value</emphasis>
+;      /* value for the new property */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbAddGeomProperty</emphasis>
+ adds one property with the specified <emphasis>
+name</emphasis>
+ and <emphasis>
+value</emphasis>
+ to the keyboard geometry specified by geom.<emphasis>
+ </emphasis>
+<emphasis>
+XkbAddGeomProperty</emphasis>
+ returns <emphasis>
+NULL</emphasis>
+ if any of the parameters is empty or if it was not able to allocate space for
+the property. To allocate space for an arbitrary number of properties, use the
+XkbAllocGeomProps function.
+</para>
+
+
+<para>
+To add one key alias to an existing keyboard geometry description, use
+<emphasis>
+XkbAddGeomKeyAlias</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+XkbKeyAliasPtr <emphasis>
+XkbAddGeomKeyAlias</emphasis>
+(<emphasis>
+geom</emphasis>
+,<emphasis>
+ alias, real</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbGeometryPtr      <emphasis>
+      geom</emphasis>
+;      /* geometry to be updated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+char *      <emphasis>
+      alias</emphasis>
+;      /* alias to be added */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+char *      <emphasis>
+      real</emphasis>
+;      /* real name to be bound to the new alias */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbAddGeomKeyAlias</emphasis>
+ adds one key alias with the value alias to the geometry geom, and associates
+it with the key whose real name is real. <emphasis>
+XkbAddGeomKeyAlias</emphasis>
+ returns <emphasis>
+NULL</emphasis>
+ if any of the parameters is empty or if it was not able to allocate space for
+the alias. To allocate space for an arbitrary number of aliases, use the
+XkbAllocGeomKeyAliases function.
+</para>
+
+
+<para>
+To add one color name to an existing keyboard geometry description, use
+<emphasis>
+XkbAddGeomColor</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+XkbColorPtr <emphasis>
+XkbAddGeomColor</emphasis>
+(<emphasis>
+geom</emphasis>
+,<emphasis>
+ spec</emphasis>
+,<emphasis>
+ pixel</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbGeometryPtr      <emphasis>
+      geom</emphasis>
+;      /* geometry to be updated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+char *      <emphasis>
+      spec</emphasis>
+;      /* color to be added */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+      pixel</emphasis>
+;      /* color to be added */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbAddGeomColor</emphasis>
+ adds the specified color <emphasis>
+name</emphasis>
+ and <emphasis>
+pixel</emphasis>
+ to the specified geometry <emphasis>
+geom</emphasis>
+. The top-level geometry description includes a list of up to <emphasis>
+MaxColors</emphasis>
+ (32) <emphasis>
+color names</emphasis>
+. A color <emphasis>
+name</emphasis>
+ is a string whose interpretation is not specified by Xkb and neither is the
+<emphasis>
+pixel</emphasis>
+ value’s interpretation. All other geometry data structures refer to colors
+using their indices in this global list or pointers to colors in this list.
+<emphasis>
+XkbAddGeomColor</emphasis>
+ returns <emphasis>
+NULL</emphasis>
+ if any of the parameters is empty or if it was not able to allocate space for
+the color. To allocate space for an arbitrary number of colors to a geometry,
+use the <emphasis>
+XkbAllocGeomColors</emphasis>
+ function.
+</para>
+
+<para>
+To add one outline to an existing shape, use <emphasis>
+XkbAddGeomOutline</emphasis>.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+XkbOutlinePtr <emphasis>
+XkbAddGeomOutline</emphasis>
+(<emphasis>
+shape</emphasis>
+,<emphasis>
+ sz_points</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbShapePtr      <emphasis>
+      shape</emphasis>
+;      /* shape to be updated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      sz_points</emphasis>
+;      /* number of points to be reserved */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+An outline consists of an arbitrary number of points. <emphasis>
+XkbAddGeomOutline</emphasis>
+ adds an outline to the specified <emphasis>
+shape</emphasis>
+ by reserving <emphasis>
+sz_points</emphasis>
+ points for it. The new outline is allocated and zeroed. <emphasis>
+XkbAddGeomOutline</emphasis>
+ returns <emphasis>
+NULL</emphasis>
+ if any of the parameters is empty or if it was not able to allocate space. To
+allocate space for an arbitrary number of outlines to a shape, use
+XkbAllocGeomOutlines.
+</para>
+
+
+<para>
+To add a shape to a keyboard geometry, use <emphasis>
+XkbAddGeomShape</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+XkbShapePtr <emphasis>
+XkbAddGeomShape</emphasis>
+(<emphasis>
+geom</emphasis>
+,<emphasis>
+ name</emphasis>
+,<emphasis>
+ sz_outlines</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbGeometryPtr      <emphasis>
+      geom</emphasis>
+;      /* geometry to be updated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Atom      <emphasis>
+      name</emphasis>
+;      /* name of the new shape */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      sz_outlines</emphasis>
+;      /* number of outlines to be reserved */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+A geometry contains an arbitrary number of shapes, each of which is made up of
+an arbitrary number of outlines. <emphasis>
+XkbAddGeomShape</emphasis>
+ adds a shape to a geometry <emphasis>
+geom</emphasis>
+ by allocating space for <emphasis>
+sz_outlines</emphasis>
+ outlines for it and giving it the name specified by name. If a shape with name
+<emphasis>
+name</emphasis>
+ already exists in the geometry, a pointer to the existing shape is returned.
+<emphasis>
+XkbAddGeomShape</emphasis>
+ returns <emphasis>
+NULL</emphasis>
+ if any of the parameters is empty or if it was not able to allocate space. To
+allocate space for an arbitrary number of geometry shapes, use <emphasis>
+XkbAllocGeomShapes</emphasis>
+.
+</para>
+
+
+<para>
+To add one key at the end of an existing row of keys, use <emphasis>
+XkbAddGeomKey</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+XkbKeyPtr <emphasis>
+XkbAddGeomKey</emphasis>
+(<emphasis>
+row</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbRowPtr      <emphasis>
+      row</emphasis>
+;      /* row to be updated */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+Keys are grouped into rows. <emphasis>
+XkbAddGeomKey</emphasis>
+ adds one key to the end of the specified <emphasis>
+row</emphasis>
+. The key is allocated and zeroed. <emphasis>
+XkbAddGeomKey</emphasis>
+ returns <emphasis>
+NULL</emphasis>
+ if <emphasis>
+row</emphasis>
+ is empty or if it was not able to allocate space for the key. To allocate
+space for an arbitrary number of keys to a row, use XkbAllocGeomKeys.
+</para>
+
+
+<para>
+To add one section to an existing keyboard geometry, use <emphasis>
+XkbAddGeomSection</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+XkbSectionPtr <emphasis>
+XkbAddGeomSection</emphasis>
+(<emphasis>
+geom</emphasis>
+,<emphasis>
+ name</emphasis>
+,<emphasis>
+ sz_rows</emphasis>
+,<emphasis>
+ sz_doodads</emphasis>
+,<emphasis>
+ sz_overlays</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbGeometryPtr      <emphasis>
+      geom</emphasis>
+;      /* geometry to be updated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Atom      <emphasis>
+      name</emphasis>
+;      /* name of the new section */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      sz_rows</emphasis>
+;      /* number of rows to reserve in the section */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      sz_doodads</emphasis>
+;      /* number of doodads to reserve in the section */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      sz_overlays</emphasis>
+;      /* number of overlays to reserve in the section */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+A keyboard geometry contains an arbitrary number of sections. <emphasis>
+XkbAddGeomSection</emphasis>
+ adds one section to an existing keyboard geometry <emphasis>
+geom</emphasis>
+. The new section contains space for the number of rows, doodads, and overlays
+specified by <emphasis>
+sz_rows</emphasis>
+, <emphasis>
+sz_doodads</emphasis>
+, and <emphasis>
+sz_overlays</emphasis>
+. The new section is allocated and zeroed and given the name specified by
+<emphasis>
+name</emphasis>
+. If a section with name <emphasis>
+name</emphasis>
+ already exists in the geometry, a pointer to the existing section is
+returned.<emphasis>
+ XkbAddGeomSection</emphasis>
+ returns <emphasis>
+NULL</emphasis>
+ if any of the parameters is empty or if it was not able to allocate space for
+the section. To allocate space for an arbitrary number of sections to a
+geometry, use XkbAllocGeomSections.
+</para>
+
+
+<para>
+To add a row to a section, use <emphasis>
+XkbAddGeomRow</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+XkbRowPtr <emphasis>
+XkbAddGeomRow</emphasis>
+(<emphasis>
+section</emphasis>
+,<emphasis>
+ sz_keys</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbSectionPtr      <emphasis>
+      section</emphasis>
+;      /* section to be updated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int            <emphasis>
+sz_keys</emphasis>
+;      /* number of keys to be reserved */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+One of the components of a keyboard geometry section is one or more rows of
+keys. <emphasis>
+XkbAddGeomRow</emphasis>
+ adds one row to the specified <emphasis>
+section</emphasis>
+. The newly created row contains space for the number of keys specified in
+<emphasis>
+sz_keys</emphasis>
+. They are allocated and zeroed, but otherwise uninitialized. <emphasis>
+XkbAddGeomRow</emphasis>
+ returns <emphasis>
+NULL</emphasis>
+ if any of the parameters is empty or if it was not able to allocate space for
+the row. To allocate space for an arbitrary number of rows to a section, use
+the XkbAllocGeomRows function.
+</para>
+
+
+<para>
+To add one doodad to a section of a keyboard geometry or to the top-level
+geometry, use <emphasis>
+XkbAddGeomDoodad</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+XkbDoodadPtr <emphasis>
+XkbAddGeomDoodad</emphasis>
+(<emphasis>
+geom</emphasis>
+,<emphasis>
+ section</emphasis>
+,<emphasis>
+ name</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbGeometryPtr      <emphasis>
+      geom</emphasis>
+;      /* geometry to which the doodad is added */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbSectionPtr      <emphasis>
+      section</emphasis>
+;      /* section, if any, to which the doodad is added */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Atom      <emphasis>
+      name</emphasis>
+;      /* name of the new doodad */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+A <emphasis>
+doodad</emphasis>
+ describes some visible aspect of the keyboard that is not a key and is not a
+section. <emphasis>
+XkbAddGeomDoodad</emphasis>
+ adds a doodad with name specified by name to the geometry <emphasis>
+geom</emphasis>
+ if section is <emphasis>
+NULL</emphasis>
+ or to the section of the geometry specified by section if <emphasis>
+section</emphasis>
+ is not <emphasis>
+NULL</emphasis>
+. <emphasis>
+XkbAddGeomDoodad</emphasis>
+ returns <emphasis>
+NULL</emphasis>
+ if any of the parameters is empty or if it was not able to allocate space for
+the doodad. If there is already a doodad with the name <emphasis>
+name</emphasis>
+ in the doodad array for the geometry (if <emphasis>
+section</emphasis>
+ is <emphasis>
+NULL</emphasis>
+) or the section (if <emphasis>
+section</emphasis>
+ is non-<emphasis>
+NULL</emphasis>
+), a pointer to that doodad is returned. To allocate space for an arbitrary
+number of doodads to a section, use the XkbAllocGeomSectionDoodads function. To
+allocate space for an arbitrary number of doodads to a keyboard geometry, use
+the XkbAllocGeomDoodads function.
+</para>
+
+
+<para>
+To add one overlay to a section, use <emphasis>
+XkbAddGeomOverlay</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+XkbOverlayPtr <emphasis>
+XkbAddGeomOverlay</emphasis>
+(<emphasis>
+section</emphasis>
+,<emphasis>
+ name</emphasis>
+,<emphasis>
+ sz_rows</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbSectionPtr      <emphasis>
+      section</emphasis>
+;      /* section to which an overlay will be added */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Atom      <emphasis>
+      name</emphasis>
+;      /* name of the overlay */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      sz_rows</emphasis>
+;      /* number of rows to reserve in the overlay */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbAddGeomOverlay</emphasis>
+ adds an overlay with the specified name to the specified <emphasis>
+section</emphasis>
+. The new overlay is created with space allocated for sz_rows rows. If an
+overlay with name <emphasis>
+name</emphasis>
+ already exists in the section, a pointer to the existing overlay is
+returned.<emphasis>
+ XkbAddGeomOverlay</emphasis>
+ returns <emphasis>
+NULL</emphasis>
+ if any of the parameters is empty or if it was not able to allocate space for
+the overlay. To allocate space for an arbitrary number of overlays to a
+section, use the XkbAllocGeomOverlay function.
+</para>
+
+
+<para>
+To add a row to an existing overlay, use <emphasis>
+XkbAddGeomOverlayRow</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+XkbOverlayRowPtr <emphasis>
+XkbAddGeomOverlayRow</emphasis>
+(<emphasis>
+overlay</emphasis>
+,<emphasis>
+ row_under, sz_keys</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbOverlayPtr      <emphasis>
+      overlay</emphasis>
+;      /* overlay to be updated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbRowPtr      <emphasis>
+      row_under</emphasis>
+;      /* row to be overlayed in the section <emphasis>
+overlay</emphasis>
+ overlays */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      sz_keys</emphasis>
+;      /* number of keys to reserve in the row */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbAddGeomOverlayRow</emphasis>
+ adds one row to the <emphasis>
+overlay</emphasis>
+. The new row contains space for <emphasis>
+sz_keys</emphasis>
+ keys. If <emphasis>
+row_under</emphasis>
+ specifies a row that doesn’t exist on the underlying section, <emphasis>
+XkbAddGeomOverlayRow</emphasis>
+ returns <emphasis>
+NULL</emphasis>
+ and doesn’t change the overlay.<emphasis>
+ XkbAddGeomOverlayRow</emphasis>
+ returns <emphasis>
+NULL</emphasis>
+ if any of the parameters is empty or if it was not able to allocate space for
+the overlay.
+</para>
+
+
+<para>
+To add a key to an existing overlay row, use <emphasis>
+XkbAddGeomOverlayKey</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+XkbOverlayKeyPtr <emphasis>
+XkbAddGeomOverlayKey</emphasis>
+(<emphasis>
+overlay</emphasis>
+,<emphasis>
+ row, under</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbOverlayPtr      <emphasis>
+      overlay</emphasis>
+;      /* overlay to be updated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbRowPtr      <emphasis>
+      row</emphasis>
+;      /* row in overlay to be updated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+char *      <emphasis>
+      under</emphasis>
+;      /* primary name of the key to be considered */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbAddGeomOverlayKey</emphasis>
+ adds one key to the <emphasis>
+row</emphasis>
+ in the <emphasis>
+overlay</emphasis>
+. If there is no key named <emphasis>
+under</emphasis>
+ in the row of the underlying section, <emphasis>
+XkbAddGeomOverlayKey</emphasis>
+ returns <emphasis>
+NULL</emphasis>
+.
+</para>
+
+
+</sect1>
+<sect1 id='Allocating_and_Freeing_Geometry_Components'>
+<title>Allocating and Freeing Geometry Components</title>
+
+<para>
+Xkb provides a number of functions to allocate and free subcomponents of a
+keyboard geometry. Use these functions to create or modify keyboard geometries.
+Note that these functions merely allocate space for the new element(s), and it
+is up to you to fill in the values explicitly in your code. These allocation
+functions increase <emphasis>
+sz_</emphasis>
+<emphasis>
+*</emphasis>
+ but never touch <emphasis>
+num_</emphasis>
+<emphasis>
+*</emphasis>
+ (unless there is an allocation failure, in which case they reset both
+<emphasis>
+sz_</emphasis>
+<emphasis>
+*</emphasis>
+ and <emphasis>
+num_</emphasis>
+<emphasis>
+*</emphasis>
+ to zero). These functions return <emphasis>
+Success</emphasis>
+ if they succeed, <emphasis>
+BadAlloc</emphasis>
+ if they are not able to allocate space, or <emphasis>
+BadValue</emphasis>
+ if a parameter is not as expected.
+</para>
+
+
+<para>
+To allocate space for an arbitrary number of outlines to a shape, use
+XkbAllocGeomOutlines.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbAllocGeomOutlines</emphasis>
+(<emphasis>
+shape</emphasis>
+,<emphasis>
+ num_needed</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbShapePtr            <emphasis>
+shape</emphasis>
+;      /* shape for which outlines should be allocated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      num_needed</emphasis>
+;      /* number of new outlines required */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbAllocGeomOutlines</emphasis>
+ allocates space for <emphasis>
+num_needed</emphasis>
+ outlines in the specified <emphasis>
+shape</emphasis>
+. The outlines are not initialized.
+</para>
+
+
+<para>
+To free geometry outlines, use <emphasis>
+XkbFreeGeomOutlines</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbFreeGeomOutlines</emphasis>
+(<emphasis>
+shape</emphasis>
+,<emphasis>
+ first</emphasis>
+,<emphasis>
+ count</emphasis>
+,<emphasis>
+ free_all</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbShapePtr      <emphasis>
+      shape</emphasis>
+;      /* shape in which outlines should be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      first</emphasis>
+;      /* first outline to be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      count</emphasis>
+;      /* number of outlines to be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool      <emphasis>
+      free_all;</emphasis>
+      /* <emphasis>
+True</emphasis>
+ =&gt; all outlines are freed */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+If free_all is <emphasis>
+True</emphasis>
+, all outlines are freed regardless of the value of first or count. Otherwise,
+count outlines are freed beginning with the one specified by first.
+</para>
+
+
+<para>
+To allocate space for an arbitrary number of keys to a row, use
+XkbAllocGeomKeys.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbAllocGeomKeys</emphasis>
+(<emphasis>
+row</emphasis>
+,<emphasis>
+ num_needed</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbRowPtr      <emphasis>
+      row</emphasis>
+;      /* row to which keys should be allocated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      num_needed</emphasis>
+;      /* number of new keys required */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbAllocGeomKeys</emphasis>
+ allocates num_needed keys and adds them to the row. No initialization of the
+keys is done.
+</para>
+
+
+<para>
+To free geometry keys, use <emphasis>
+XkbFreeGeomKeys</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbFreeGeomKeys</emphasis>
+(<emphasis>
+row</emphasis>
+,<emphasis>
+ first</emphasis>
+,<emphasis>
+ count</emphasis>
+,<emphasis>
+ free_all</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbRowPtr      <emphasis>
+      row</emphasis>
+;      /* row in which keys should be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      first</emphasis>
+;      /* first key to be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      count</emphasis>
+;      /* number of keys to be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool      <emphasis>
+      free_all;</emphasis>
+      /* <emphasis>
+True</emphasis>
+ =&gt; all keys are freed */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+If free_all is <emphasis>
+True</emphasis>
+, all keys are freed regardless of the value of first or count. Otherwise,
+count keys are freed beginning with the one specified by first.
+</para>
+
+
+<para>
+To allocate geometry properties, use <emphasis>
+XkbAllocGeomProps</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbAllocGeomProps</emphasis>
+(<emphasis>
+geom</emphasis>
+,<emphasis>
+ num_needed</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbGeometryPtr      <emphasis>
+      geom</emphasis>
+;      /* geometry for which properties should be allocated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      num_needed</emphasis>
+;      /* number of new properties required */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbAllocGeomProps</emphasis>
+ allocates space for num_needed properties and adds them to the specified
+geometry <emphasis>
+geom</emphasis>
+. No initialization of the properties is done. A geometry property associates
+an arbitrary string with an equally arbitrary name. Geometry properties can be
+used to provide hints to programs that display images of keyboards, but they
+are not interpreted by Xkb. No other geometry structures refer to geometry
+properties.
+</para>
+
+
+<para>
+To free geometry properties, use <emphasis>
+XkbFreeGeomProperties</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbFreeGeomProperties</emphasis>
+(<emphasis>
+geom</emphasis>
+,<emphasis>
+ first</emphasis>
+,<emphasis>
+ count</emphasis>
+,<emphasis>
+ free_all</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbGeometryPtr      <emphasis>
+      geom</emphasis>
+;      /* geometry in which properties should be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      first</emphasis>
+;      /* first property to be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      count</emphasis>
+;      /* number of properties to be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool      <emphasis>
+      free_all;</emphasis>
+      /* <emphasis>
+True</emphasis>
+ =&gt; all properties are freed */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+If free_all is <emphasis>
+True</emphasis>
+, all properties are freed regardless of the value of first or count.
+Otherwise, count properties are freed beginning with the one specified by first.
+</para>
+
+
+<para>
+To allocate geometry key aliases, use <emphasis>
+XkbAllocGeomKeyAliases</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbAllocGeomKeyAliases</emphasis>
+(<emphasis>
+geom</emphasis>
+,<emphasis>
+ num_needed</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbGeometryPtr      <emphasis>
+      geom</emphasis>
+;      /* geometry for which key aliases should be allocated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      num_needed</emphasis>
+;      /* number of new key aliases required */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbAllocGeomKeyAliases</emphasis>
+ allocates space for num_needed key aliases and adds them to the specified
+geometry <emphasis>
+geom</emphasis>
+. A key alias is a pair of strings that associates an alternate name for a key
+with the real name for that key.
+</para>
+
+
+<para>
+To free geometry key aliases, use <emphasis>
+XkbFreeGeomKeyAliases</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbFreeGeomKeyAliases</emphasis>
+(<emphasis>
+geom</emphasis>
+,<emphasis>
+ first</emphasis>
+, <emphasis>
+count</emphasis>
+, <emphasis>
+free_all</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbGeometryPtr      <emphasis>
+      geom</emphasis>
+;      /* geometry in which key aliases should be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      first</emphasis>
+;      /* first key alias to be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      count</emphasis>
+;      /* number of key aliases to be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool      <emphasis>
+      free_all;</emphasis>
+      /* <emphasis>
+True</emphasis>
+ =&gt; all key aliases are freed */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+If free_all is <emphasis>
+True</emphasis>
+, all aliases in the top level of the specified geometry <emphasis>
+geom</emphasis>
+ are freed regardless of the value of first or count. Otherwise, count aliases
+in <emphasis>
+geom</emphasis>
+ are freed beginning with the one specified by first.
+</para>
+
+
+<para>
+To allocate geometry colors, use <emphasis>
+XkbAllocGeomColors</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbAllocGeomColors</emphasis>
+(<emphasis>
+geom</emphasis>
+,<emphasis>
+ num_needed</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbGeometryPtr      <emphasis>
+      geom</emphasis>
+;      /* geometry for which colors should be allocated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      num_needed</emphasis>
+;      /* number of new colors required. */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbAllocGeomColors</emphasis>
+ allocates space for num_needed colors and adds them to the specified geometry
+<emphasis>
+geom</emphasis>
+. A color name is a string whose interpretation is not specified by Xkb. All
+other geometry data structures refer to colors using their indices in this
+global list or pointers to colors in this list.
+</para>
+
+
+<para>
+To free geometry colors, use <emphasis>
+XkbFreeGeomColors</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbFreeGeomColors</emphasis>
+(<emphasis>
+geom</emphasis>
+,<emphasis>
+ first</emphasis>
+,<emphasis>
+ count</emphasis>
+,<emphasis>
+ free_all</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbGeometryPtr      <emphasis>
+      geom</emphasis>
+;      /* geometry in which colors should be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      first</emphasis>
+;      /* first color to be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      count</emphasis>
+;      /* number of colors to be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool      <emphasis>
+      free_all;</emphasis>
+      /* <emphasis>
+True</emphasis>
+ =&gt; all colors are freed */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+If free_all is <emphasis>
+True</emphasis>
+, all colors are freed regardless of the value of first or count. Otherwise,
+count colors are freed beginning with the one specified by first.
+</para>
+
+
+<para>
+To allocate points in an outline, use <emphasis>
+XkbAllocGeomPoints</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbAllocGeomPoints</emphasis>
+(<emphasis>
+outline</emphasis>
+,<emphasis>
+ num_needed</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbOutlinePtr      <emphasis>
+      outline</emphasis>
+;      /* outline for which points should be allocated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      num_needed</emphasis>
+;      /* number of new points required */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbAllocGeomPoints</emphasis>
+ allocates space for <emphasis>
+num_needed</emphasis>
+ points in the specified <emphasis>
+outline</emphasis>
+. The points are not initialized.
+</para>
+
+
+<para>
+To free points in a outline, use <emphasis>
+XkbFreeGeomPoints</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbFreeGeomPoints</emphasis>
+(<emphasis>
+outline</emphasis>
+,<emphasis>
+ first</emphasis>
+,<emphasis>
+ count</emphasis>
+,<emphasis>
+ free_all</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbOutlinePtr      <emphasis>
+      outline</emphasis>
+;      /* outline in which points should be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      first</emphasis>
+;      /* first point to be freed. */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      count</emphasis>
+;      /* number of points to be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool      <emphasis>
+      free_all;</emphasis>
+      /* <emphasis>
+True</emphasis>
+ =&gt; all points are freed */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+If free_all is <emphasis>
+True</emphasis>
+, all points are freed regardless of the value of first and count. Otherwise,
+the number of points specified by count are freed, beginning with the point
+specified by first in the specified outline.
+</para>
+
+
+<para>
+To allocate space for an arbitrary number of geometry shapes, use <emphasis>
+XkbAllocGeomShapes</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbAllocGeomShapes</emphasis>
+(<emphasis>
+geom</emphasis>
+,<emphasis>
+ num_needed</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbGeometryPtr      <emphasis>
+      geom</emphasis>
+;      /* geometry for which shapes should be allocated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      num_needed</emphasis>
+;      /* number of new shapes required */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbAllocGeomShapes</emphasis>
+ allocates space for <emphasis>
+num_needed</emphasis>
+ shapes in the specified geometry <emphasis>
+geom</emphasis>
+. The shapes are not initialized.
+</para>
+
+
+<para>
+To free geometry shapes, use <emphasis>
+XkbFreeGeomShapes</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbFreeGeomShapes</emphasis>
+(<emphasis>
+geom</emphasis>
+,<emphasis>
+ first</emphasis>
+,<emphasis>
+ count</emphasis>
+,<emphasis>
+ f ree_all</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbGeometryPtr      <emphasis>
+      geom</emphasis>
+;      /* geometry in which shapes should be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      first</emphasis>
+;      /* first shape to be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      count</emphasis>
+;      /* number of shapes to be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool      <emphasis>
+      free_all;</emphasis>
+      /* <emphasis>
+True</emphasis>
+ =&gt; all shapes are freed */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+If free_all is <emphasis>
+True</emphasis>
+, all shapes in the geometry are freed regardless of the values of first and
+count. Otherwise, count shapes are freed, beginning with the shape specified by
+first.
+</para>
+
+
+<para>
+To allocate geometry sections, use <emphasis>
+XkbAllocGeomSections</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbAllocGeomSections</emphasis>
+(<emphasis>
+geom</emphasis>
+,<emphasis>
+ num_needed</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbGeometryPtr      <emphasis>
+      geom</emphasis>
+;      /*geometry for which sections should be allocated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      num_needed</emphasis>
+;      /* number of new sections required */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbAllocGeomSections</emphasis>
+ allocates num_needed sections and adds them to the geometry geom. No
+initialization of the sections is done.
+</para>
+
+
+<para>
+To free geometry sections, use <emphasis>
+XkbFreeGeomSections</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbFreeGeomSections</emphasis>
+(<emphasis>
+geom</emphasis>
+,<emphasis>
+ first</emphasis>
+,<emphasis>
+ count</emphasis>
+,<emphasis>
+ free_all</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbGeometryPtr      <emphasis>
+      geom</emphasis>
+;      /* geometry in which sections should be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      first</emphasis>
+;      /* first section to be freed. */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      count</emphasis>
+;      /* number of sections to be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool      <emphasis>
+      free_all;</emphasis>
+      /* <emphasis>
+True</emphasis>
+ =&gt; all sections are freed */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+If free_all is <emphasis>
+True</emphasis>
+, all sections are freed regardless of the value of first and count. Otherwise,
+the number of sections specified by count are freed, beginning with the section
+specified by first in the specified geometry.
+</para>
+
+
+<para>
+To allocate rows in a section, use <emphasis>
+XkbAllocGeomRows</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbAllocGeomRows</emphasis>
+(<emphasis>
+section</emphasis>
+,<emphasis>
+ num_needed</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbSectionPtr            <emphasis>
+section</emphasis>
+;      /* section for which rows should be allocated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      num_needed</emphasis>
+;      /* number of new rows required */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbAllocGeomRows</emphasis>
+ allocates num_needed rows and adds them to the section. No initialization of
+the rows is done.
+</para>
+
+
+<para>
+To free rows in a section, use <emphasis>
+XkbFreeGeomRows</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbFreeGeomRows</emphasis>
+(<emphasis>
+section</emphasis>
+,<emphasis>
+ first</emphasis>
+,<emphasis>
+ count</emphasis>
+,<emphasis>
+ free_all</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbSectionPtr      <emphasis>
+      section</emphasis>
+;      /* section in which rows should be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      first</emphasis>
+;      /* first row to be freed. */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      count</emphasis>
+;      /* number of rows to be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool      <emphasis>
+      free_all;</emphasis>
+      /* <emphasis>
+True</emphasis>
+ =&gt; all rows are freed */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+If free_all is <emphasis>
+True</emphasis>
+, all rows are freed regardless of the value of first and count. Otherwise, the
+number of rows specified by count are freed, beginning with the row specified
+by first in the specified section.
+</para>
+
+
+<para>
+To allocate overlays in a section, use <emphasis>
+XkbAllocGeomOverlays</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbAllocGeomOverlays</emphasis>
+(<emphasis>
+section</emphasis>
+,<emphasis>
+ num_needed</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbSectionPtr            <emphasis>
+section</emphasis>
+;      /* section for which overlays should be allocated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      num_needed</emphasis>
+;      /* number of new overlays required */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbAllocGeomRows</emphasis>
+ allocates num_needed overlays and adds them to the section. No initialization
+of the overlays is done.
+</para>
+
+
+<para>
+To free rows in an section, use <emphasis>
+XkbFreeGeomOverlays</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbFreeGeomOverlays</emphasis>
+(<emphasis>
+section</emphasis>
+,<emphasis>
+ first</emphasis>
+,<emphasis>
+ count</emphasis>
+,<emphasis>
+ free_all</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbSectionPtr      <emphasis>
+      section</emphasis>
+;      /* section in which overlays should be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      first</emphasis>
+;      /* first overlay to be freed. */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      count</emphasis>
+;      /* number of overlays to be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool      <emphasis>
+      free_all;</emphasis>
+      /* <emphasis>
+True</emphasis>
+ =&gt; all overlays are freed */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+If free_all is <emphasis>
+True</emphasis>
+, all overlays are freed regardless of the value of first and count. Otherwise,
+the number of overlays specified by count are freed, beginning with the overlay
+specified by first in the specified section.
+</para>
+
+
+<para>
+To allocate rows in a overlay, use <emphasis>
+XkbAllocGeomOverlayRows</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbAllocGeomOverlayRows</emphasis>
+(<emphasis>
+overlay</emphasis>
+,<emphasis>
+ num_needed</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbSectionPtr            <emphasis>
+overlay</emphasis>
+;      /* section for which rows should be allocated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      num_needed</emphasis>
+;      /* number of new rows required */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbAllocGeomOverlayRows</emphasis>
+ allocates num_needed rows and adds them to the overlay. No initialization of
+the rows is done.
+</para>
+
+
+<para>
+To free rows in an overlay, use <emphasis>
+XkbFreeGeomOverlayRows</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbFreeGeomOverlayRows</emphasis>
+(<emphasis>
+overlay</emphasis>
+,<emphasis>
+ first</emphasis>
+,<emphasis>
+ count</emphasis>
+,<emphasis>
+ free_all</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbSectionPtr      <emphasis>
+      overlay</emphasis>
+;      /* section in which rows should be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      first</emphasis>
+;      /* first row to be freed. */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      count</emphasis>
+;      /* number of rows to be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool      <emphasis>
+      free_all;</emphasis>
+      /* <emphasis>
+True</emphasis>
+ =&gt; all rows are freed */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+If free_all is <emphasis>
+True</emphasis>
+, all rows are freed regardless of the value of first and count. Otherwise, the
+number of rows specified by count are freed, beginning with the row specified
+by first in the specified overlay.
+</para>
+
+
+<para>
+To allocate keys in an overlay row, use <emphasis>
+XkbAllocGeomOverlayKeys</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbAllocGeomOverlayKeys</emphasis>
+(<emphasis>
+row</emphasis>
+,<emphasis>
+ num_needed</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbRowPtr            <emphasis>
+row</emphasis>
+;      /* section for which rows should be allocated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      num_needed</emphasis>
+;      /* number of new rows required */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbAllocGeomOverlayKeys</emphasis>
+ allocates num_needed keys and adds them to the row. No initialization of the
+keys is done.
+</para>
+
+
+<para>
+To free keys in an overlay row, use <emphasis>
+XkbFreeGeomOverlayKeys</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbFreeGeomOverlayKeys</emphasis>
+(<emphasis>
+row</emphasis>
+,<emphasis>
+ first</emphasis>
+,<emphasis>
+ count</emphasis>
+,<emphasis>
+ free_all</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbRowPtr      <emphasis>
+      row</emphasis>
+;      /* row in which keys should be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      first</emphasis>
+;      /* first key to be freed. */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      count</emphasis>
+;      /* number of keys to be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool      <emphasis>
+      free_all;</emphasis>
+      /* <emphasis>
+True</emphasis>
+ =&gt; all keys are freed */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+If free_all is <emphasis>
+True</emphasis>
+, all keys are freed regardless of the value of first and count. Otherwise, the
+number of keys specified by count are freed, beginning with the key specified
+by first in the specified row.
+</para>
+
+
+<para>
+To allocate doodads that are global to a keyboard geometry, use <emphasis>
+XkbAllocGeomDoodads</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbAllocGeomDoodads</emphasis>
+(<emphasis>
+geom</emphasis>
+,<emphasis>
+ num_needed</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbGeometryPtr      <emphasis>
+      geom</emphasis>
+;      /* geometry for which doodads should be allocated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      num_needed</emphasis>
+;      /* number of new doodads required */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbAllocGeomDoodads</emphasis>
+ allocates num_needed doodads and adds them to the specified geometry <emphasis>
+geom</emphasis>
+. No initialization of the doodads is done.
+</para>
+
+
+<para>
+To allocate doodads that are specific to a section, use <emphasis>
+XkbAllocGeomSectionDoodads</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbAllocGeomSectionDoodads</emphasis>
+(<emphasis>
+section</emphasis>
+,<emphasis>
+ num_needed</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbSectionPtr      <emphasis>
+      section</emphasis>
+;      /* section for which doodads should be allocated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      num_needed</emphasis>
+;      /* number of new doodads required */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbAllocGeomSectionDoodads</emphasis>
+ allocates num_needed doodads and adds them to the specified <emphasis>
+section</emphasis>
+. No initialization of the doodads is done.
+</para>
+
+
+<para>
+To free geometry doodads, use <emphasis>
+XkbFreeGeomDoodads</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbFreeGeomDoodads</emphasis>
+(<emphasis>
+doodads</emphasis>
+,<emphasis>
+ count</emphasis>
+,<emphasis>
+ free_all</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDoodadPtr      <emphasis>
+      doodads</emphasis>
+;      /* doodads to be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+      count</emphasis>
+;      /* number of doodads to be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool      <emphasis>
+      free_all;</emphasis>
+      /* <emphasis>
+True</emphasis>
+ =&gt; all doodads are freed */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+If <emphasis>
+free_all</emphasis>
+ is <emphasis>
+True</emphasis>
+, all doodads in the array are freed, regardless of the value of count.
+Otherwise, count doodads are freed.
+</para>
+
+
+<para>
+To allocate an entire geometry, use <emphasis>
+XkbAllocGeometry</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbAllocGeometry</emphasis>
+(<emphasis>
+xkb</emphasis>
+,<emphasis>
+ sizes</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr      <emphasis>
+      xkb</emphasis>
+;      /* keyboard description for which geometry is to be allocated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbGeometrySizesPtr<emphasis>
+            sizes</emphasis>
+;      /* initial sizes for all geometry components */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbAllocGeometry</emphasis>
+ allocates a keyboard geometry and adds it to the keyboard description
+specified by xkb. The keyboard description should be obtained via the
+XkbGetKeyboard or XkbAllockeyboard functions. The sizes parameter specifies the
+number of elements to be reserved for the subcomponents of the keyboard
+geometry and can be zero or more. These subcomponents include the properties,
+colors, shapes, sections, and doodads.
+</para>
+
+
+<para>
+To free an entire geometry, use <emphasis>
+XkbFreeGeometry</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbFreeGeometry</emphasis>
+(<emphasis>
+geom</emphasis>
+,<emphasis>
+ which</emphasis>
+,<emphasis>
+ free_all</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbGeometryPtr      <emphasis>
+      geom</emphasis>
+;      /* geometry to be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+      which</emphasis>
+;      /* mask of geometry components to be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool      <emphasis>
+      free_all;</emphasis>
+      /* <emphasis>
+True</emphasis>
+ =&gt; the entire geometry is freed. */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+The values of which and free_all determine how much of the specified geometry
+is freed. The valid values for which are:
+</para>
+
+<para><programlisting>
+#define      XkbGeomPropertiesMask  (1&lt;&lt;0)
+#define      XkbGeomColorsMask      (1&lt;&lt;1)
+#define      XkbGeomShapesMask      (1&lt;&lt;2)
+#define      XkbGeomSectionsMask    (1&lt;&lt;3)
+#define      XkbGeomDoodadsMask     (1&lt;&lt;4)
+#define      XkbGeomAllMask         (0x1f)
+</programlisting></para>
+
+<para>
+If free_all is <emphasis>
+True</emphasis>
+, the entire geometry is freed regardless of the value of which. Otherwise, the
+portions of the geometry specified by which are freed.
+</para>
+
+</sect1>
+</chapter>
diff --git a/specs/XKB/ch14.xml b/specs/XKB/ch14.xml
new file mode 100644 (file)
index 0000000..1fcc768
--- /dev/null
@@ -0,0 +1,1658 @@
+<chapter id='Xkb_Keyboard_Mapping'>
+<title>Xkb Keyboard Mapping</title>
+
+<para>
+The Xkb keyboard mapping contains all the information the server and clients
+need to interpret key events. This chapter provides an overview of the
+terminology used to describe an Xkb keyboard mapping and introduces common
+utilities for manipulating the keyboard mapping.
+</para>
+
+
+<para>
+The mapping consists of two components, a server map and a client map. The
+<emphasis>
+client</emphasis>
+ map is the collection of information a client needs to interpret key events
+from the keyboard. It contains a global list of key types and an array of key
+symbol maps, each of which describes the symbols bound to a key and the rules
+to be used to interpret those symbols. The <emphasis>
+server</emphasis>
+ map contains the information the server needs to interpret key events. This
+includes actions and behaviors for each key, explicit components for a key, and
+the virtual modifiers and the per-key virtual modifier mapping.
+</para>
+
+
+<para>
+For detailed information on particular components of the keyboard map, refer to
+Chapter 15, "Xkb Client Keyboard Mapping" and Chapter 16, "Xkb Server Keyboard
+Mapping."
+</para>
+
+<sect1 id='Notation_and_Terminology'>
+<title>Notation and Terminology</title>
+
+<para>
+The graphic characters or control functions that may be accessed by one key are
+logically arranged in groups and levels, where <emphasis>
+group</emphasis>
+ and <emphasis>
+level</emphasis>
+ are defined as in the ISO9995 standard:
+</para>
+
+<variablelist>
+  <varlistentry>
+    <term>Group:</term>
+    <listitem>
+      <para>
+A logical state of a keyboard providing access to a collection of
+graphic characters. Usually these graphic characters logically belong together
+and may be arranged on several levels within a group.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>Level:</term>
+    <listitem>
+      <para>
+One of several states (normally 2 or 3) governing which graphic
+character is produced when a graphic key is actuated. In certain cases the
+level may also affect function keys.
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+These definitions, taken from the ISO standard, refer to graphic keys and
+characters. In the context of Xkb, Group and Level are not constrained to
+graphic keys and characters; they may be used with any key to access any
+character the key is capable of generating.
+</para>
+
+
+<para>
+Level is often referred to as "Shift Level". Levels are numbered sequentially
+starting at one.
+</para>
+
+<note><para>Shift level is derived from the modifier state, but not necessarily
+in the same way for all keys. For example, the <emphasis>
+Shift</emphasis>
+ modifier selects shift level 2 on most keys, but for keypad keys the modifier
+bound to <emphasis>
+Num_Lock</emphasis>
+ (that is, the <emphasis>
+NumLock</emphasis>
+ virtual modifier) also selects shift level 2.</para></note>
+
+<para>
+For example, consider the following key (the gray characters indicate symbols
+that are implied or expected but are not actually engraved on the key):
+</para>
+
+<mediaobject>
+ <imageobject> <imagedata format="SVG" fileref="XKBlib-14.svg"/>
+ </imageobject>
+<caption>Shift Levels and Groups</caption>
+ </mediaobject>
+
+
+<!--
+<H5 CLASS="Figure">
+Shift Levels and Groups</H5>
+-->
+
+<para>
+This key has two groups, indicated by the columns, and each group has two shift
+levels. For the first group (Group1), the symbol shift level one is <emphasis>
+a</emphasis>
+, and the symbol for shift level two is <emphasis>
+A</emphasis>
+. For the second group, the symbol for shift level one is <emphasis>
+æ</emphasis>
+, and the symbol for shift level two is <emphasis>
+Æ</emphasis>
+.
+</para>
+
+<sect2 id='Core_Implementation'>
+<title>Core Implementation</title>
+
+<para>
+The standard interpretation rules for the core X keymap only allow clients to
+access keys such as the one shown in Figure 14.1. That is, clients using the
+standard interpretation rules can only access one of four keysyms for any given
+<emphasis>
+KeyPress</emphasis>
+ event — two different symbols in two different groups.
+</para>
+
+
+<para>
+In general, the <emphasis>
+Shift</emphasis>
+ modifier, the <emphasis>
+Lock</emphasis>
+ modifier, and the modifier bound to the <emphasis>
+Num_Lock</emphasis>
+ key are used to change between shift level 1 and shift level 2. To switch
+between groups, the core implementation uses the modifier bound to the
+<emphasis>
+Mode_switch</emphasis>
+ key. When the <emphasis>
+Mode_switch</emphasis>
+ modifier is set, the keyboard is logically in Group 2. When the <emphasis>
+Mode_switch</emphasis>
+ modifier is not set, the keyboard is logically in Group 1.
+</para>
+
+
+<para>
+The core implementation does not clearly specify the behavior of keys. For
+example, the locking behavior of the <emphasis>
+CapsLock</emphasis>
+ and <emphasis>
+Num_Lock</emphasis>
+ keys depends on the vendor.
+</para>
+
+
+</sect2>
+<sect2 id='Xkb_Implementation'>
+<title>Xkb Implementation</title>
+
+<para>
+Xkb extends the core implementation by providing access to up to four keyboard
+groups with up to 63 shift levels per key
+<footnote><para>
+The core implementation restricts the number of symbols per key to 255.
+With four groups, this allows for up to 63 symbols (or shift levels) per
+group. Most keys will only have a few shift levels.
+</para></footnote>. In
+addition, Xkb provides precise specifications regarding the behavior of keys.
+In Xkb, modifier state and the current group are independent (with the
+exception of compatibility mapping, discussed in Chapter 17).
+</para>
+
+
+<para>
+Xkb handles switching between groups via key actions, independent of any
+modifier state information. Key actions are in the server map component and are
+described in detail in section 16.1.4.
+</para>
+
+
+<para>
+Xkb handles shift levels by associating a key type with each group on each key.
+Each key type defines the shift levels available for the groups on keys of its
+type and specifies the modifier combinations necessary to access each level.
+</para>
+
+
+<para>
+For example, Xkb allows key types where the <emphasis>
+Control</emphasis>
+ modifier can be used to access the shift level two of a key. Key types are in
+the client map component and are described in detail in section 15.2. <!-- xref -->
+</para>
+
+
+<para>
+Xkb provides precise specification of the behavior of a key using key
+behaviors. Key behaviors are in the server map component and are described in
+detail in section 16.2. <!-- xref -->
+</para>
+
+
+</sect2>
+</sect1>
+<sect1 id='Getting_Map_Components_from_the_Server'>
+<title>Getting Map Components from the Server</title>
+
+<para>
+Xkb provides two functions to obtain the keyboard mapping components from the
+server. The first function, <emphasis>
+XkbGetMap</emphasis>
+, allocates an <emphasis>
+XkbDescRec</emphasis>
+ structure, retrieves mapping components from the server, and stores them in
+the <emphasis>
+XkbDescRec</emphasis>
+ structure it just allocated. The second function, <emphasis>
+XkbGetUpdatedMap</emphasis>
+, retrieves mapping components from the server and stores them in an <emphasis>
+XkbDescRec</emphasis>
+ structure that has previously been allocated.
+</para>
+
+
+<para>
+To allocate an <emphasis>
+XkbDescRec</emphasis>
+ structure and populate it with the server’s keyboard client map and server
+map, use <emphasis>
+XkbGetMap. XkbGetMap </emphasis>
+is similar to <emphasis>
+XkbGetKeyboard</emphasis>
+ (see section 6.2), but is used only for obtaining the address of an <emphasis>
+XkbDescRec</emphasis>
+ structure that is populated with keyboard mapping components. It allows finer
+control over which substructures of the keyboard mapping components are to be
+populated. <emphasis>
+XkbGetKeyboard</emphasis>
+ always returns fully populated components, while <emphasis>
+XkbGetMap</emphasis>
+ can be instructed to return a partially populated component.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+XkbDescPtr <emphasis>
+XkbGetMap</emphasis>
+(<emphasis>
+display, which, device_spec</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *       <emphasis>
+      display</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+      which</emphasis>
+;            /* mask selecting subcomponents to populate */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+      device_spec</emphasis>
+;            /* device_id, or <emphasis>
+XkbUseCoreKbd</emphasis>
+ */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+The <emphasis>
+which</emphasis>
+ mask is a bitwise inclusive OR of the masks defined in Table 14.1. Only those
+portions of the keyboard server map and the keyboard client maps that are
+specified in <emphasis>
+which</emphasis>
+ are allocated and populated.
+</para>
+
+
+<para>
+In addition to allocating and obtaining the server map and the client map,
+<emphasis>
+XkbGetMap</emphasis>
+ also sets the <emphasis>
+device_spec</emphasis>
+, the <emphasis>
+min_key_code</emphasis>
+<emphasis>
+, </emphasis>
+and <emphasis>
+max_key_code</emphasis>
+ fields of the keyboard description.
+</para>
+
+
+<para>
+<emphasis>
+XkbGetMap</emphasis>
+ is synchronous; it queries the server for the desired information, waits for a
+reply, and then returns. If successful<emphasis>
+, XkbGetMap</emphasis>
+ returns a pointer to the <emphasis>
+XkbDescRec</emphasis>
+ structure it allocated. If unsuccessful, <emphasis>
+XkbGetMap</emphasis>
+ returns <emphasis>
+NULL</emphasis>
+. When unsuccessful, one of the following protocol errors is also generated:
+<emphasis>
+BadAlloc</emphasis>
+ (unable to allocate the <emphasis>
+XkbDescRec</emphasis>
+ structure), <emphasis>
+BadValue</emphasis>
+ (some mask bits in <emphasis>
+which</emphasis>
+ are undefined)<emphasis>
+,</emphasis>
+ or <emphasis>
+BadImplementation</emphasis>
+ (a compatible version of the Xkb extension is not available in the server). To
+free the returned data, use <emphasis>
+XkbFreeClientMap</emphasis>
+.
+</para>
+
+
+<para>
+Xkb also provides convenience functions to get partial component definitions
+from the server. These functions are specified in the "convenience functions"
+column in Table 14.1. Refer to the sections listed in the table for more
+information on these functions.
+</para>
+
+<table frame='topbot'>
+<title>Xkb Mapping Component Masks and Convenience Functions</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='6' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='3.0*'/>
+<colspec colname='c2' colwidth='0.9*'/>
+<colspec colname='c3' colwidth='0.9*'/>
+<colspec colname='c4' colwidth='1.6*'/>
+<colspec colname='c5' colwidth='2.1*'/>
+<colspec colname='c6' colwidth='0.9*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Mask</entry>
+  <entry>Value</entry>
+  <entry>Map</entry>
+  <entry>Fields</entry>
+  <entry>Convenience Functions</entry>
+  <entry>Section</entry>
+</row>
+</thead>
+<tbody>
+  <row>
+    <entry><emphasis>XkbKeyTypesMask</emphasis></entry>
+    <entry>(1&lt;&lt;0)</entry>
+    <entry>client</entry>
+    <entry>
+      <para><emphasis>types</emphasis></para>
+      <para><emphasis>size_types</emphasis></para>
+      <para><emphasis>num_types</emphasis></para>
+    </entry>
+    <entry>
+      <para><emphasis>XkbGetKeyTypes</emphasis></para>
+      <para><emphasis>XkbResizeKeyType</emphasis></para>
+      <para><emphasis>XkbCopyKeyType</emphasis></para>
+      <para><emphasis>XkbCopyKeyTypes</emphasis></para>
+    </entry>
+    <entry>15.2</entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbKeySymsMask</emphasis></entry>
+    <entry>(1&lt;&lt;1)</entry>
+    <entry>client</entry>
+    <entry>
+      <para><emphasis>syms</emphasis></para>
+      <para><emphasis>size_syms</emphasis></para>
+      <para><emphasis>num_syms</emphasis></para>
+      <para><emphasis>key_sym_map</emphasis></para>
+    </entry>
+    <entry>
+      <para><emphasis>XkbGetKeySyms</emphasis></para>
+      <para><emphasis>XkbResizeKeySyms</emphasis></para>
+      <para><emphasis>XkbChangeTypes&#xAD;OfKey</emphasis></para>
+    </entry>
+    <entry>15.3</entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbModifierMapMask</emphasis></entry>
+    <entry>(1&lt;&lt;2)</entry>
+    <entry>client</entry>
+    <entry><emphasis>modmap</emphasis></entry>
+    <entry><emphasis>XkbGetKeyModifier&#xAD;Map</emphasis></entry>
+    <entry>15.4</entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbExplicitComponentsMask</emphasis></entry>
+    <entry>(1&lt;&lt;3)</entry>
+    <entry>server</entry>
+    <entry><emphasis>explicit</emphasis></entry>
+    <entry><emphasis>XkbGetKeyExplicit&#xAD;Components</emphasis></entry>
+    <entry>16.3</entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbKeyActionsMask</emphasis></entry>
+    <entry>(1&lt;&lt;4)</entry>
+    <entry>server</entry>
+    <entry>
+      <para><emphasis>key_acts</emphasis></para>
+      <para><emphasis>acts</emphasis></para>
+      <para><emphasis>num_acts</emphasis></para>
+      <para><emphasis>size_acts</emphasis></para>
+    </entry>
+    <entry>
+      <para><emphasis>XkbGetKeyActions</emphasis></para>
+      <para><emphasis>XkbResizeKey&#xAD;Actions</emphasis></para>
+    </entry>
+    <entry>16.1</entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbKeyBehaviorsMask</emphasis></entry>
+    <entry>(1&lt;&lt;5)</entry>
+    <entry>server</entry>
+    <entry><emphasis>behaviors</emphasis></entry>
+    <entry><emphasis>XkbGetKey&#xAD;Behaviors</emphasis></entry>
+    <entry>16.2</entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbVirtualModsMask</emphasis></entry>
+    <entry>(1&lt;&lt;6)</entry>
+    <entry>server</entry>
+    <entry><emphasis>vmods</emphasis></entry>
+    <entry><emphasis>XkbGetVirtualMods</emphasis></entry>
+    <entry>16.4</entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbVirtualModMapMask</emphasis></entry>
+    <entry>(1&lt;&lt;7)</entry>
+    <entry>server</entry>
+    <entry><emphasis>vmodmap</emphasis></entry>
+    <entry><emphasis>XkbGetVirtualMod&#xAD;Map</emphasis></entry>
+    <entry>16.4</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+Xkb defines combinations of these masks for convenience:
+</para>
+
+<para><programlisting>
+#define  XkbResizableInfoMask      (XkbKeyTypesMask)
+#define  XkbAllClientInfoMask      (XkbKeyTypesMask | XkbKeySymsMask |
+                                    XkbModifierMapMask)
+#define  XkbAllServerInfoMask      (XkbExplicitComponentsMask |
+                                    XkbKeyActionsMask| XkbKeyBehaviorsMask |
+                                    XkbVirtualModsMask | XkbVirtualModMapMask)
+#define  XkbAllMapComponentsMask   (XkbAllClientInfoMask|XkbAllServerInfoMask)
+</programlisting></para>
+
+<para>
+Key types, symbol maps, and actions are all interrelated: changes in one
+require changes in the others. The convenience functions make it easier to edit
+these components and handle the interdependencies.
+</para>
+
+
+<para>
+To update the client or server map information in an existing keyboard
+description, use <emphasis>XkbGetUpdatedMap</emphasis>.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbGetUpdatedMap</emphasis>
+(<emphasis>
+display, which, xkb</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display * <emphasis>
+            display</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+            which</emphasis>
+;            /* mask selecting subcomponents to populate */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr            <emphasis>
+xkb</emphasis>
+;            /* keyboard description to be updated */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+The <emphasis>
+which</emphasis>
+ parameter is a bitwise inclusive OR of the masks in Table 14.1. If the needed
+components of the <emphasis>
+xkb</emphasis>
+ structure are not already allocated, <emphasis>
+XkbGetUpdatedMap</emphasis>
+ allocates them. <emphasis>
+XkbGetUpdatedMap</emphasis>
+ fetches the requested information for the device specified in the <emphasis>
+XkbDescRec</emphasis>
+ passed in the <emphasis>
+xkb</emphasis>
+ parameter.
+</para>
+
+
+<para>
+<emphasis>
+XkbGetUpdatedMap</emphasis>
+ is synchronous; it queries the server for the desired information, waits for a
+reply, and then returns. If successful<emphasis>
+, XkbGetUpdatedMap</emphasis>
+ returns <emphasis>
+Success</emphasis>
+. If unsuccessful, <emphasis>
+XkbGetUpdatedMap</emphasis>
+ returns one of the following: <emphasis>
+BadAlloc</emphasis>
+ (unable to allocate a component in the <emphasis>
+XkbDescRec</emphasis>
+ structure), <emphasis>
+BadValue</emphasis>
+ (some mask bits in <emphasis>
+which</emphasis>
+ are undefined), <emphasis>
+BadImplementation</emphasis>
+ (a compatible version of the Xkb extension is not available in the server or
+the reply from the server was invalid).
+</para>
+
+</sect1>
+<sect1 id='Changing_Map_Components_in_the_Server'>
+<title>Changing Map Components in the Server</title>
+
+<para>
+There are two ways to make changes to map components: either change a local
+copy of the keyboard map and call <emphasis>
+XkbSetMap</emphasis>
+ to send the modified map to the server, or, to reduce network traffic, use
+an<emphasis>
+ XkbMapChangesRec</emphasis>
+ structure and call <emphasis>XkbChangeMap</emphasis>.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbSetMap</emphasis>
+(<emphasis>
+dpy</emphasis>
+,<emphasis>
+ which</emphasis>
+,<emphasis>
+ xkb</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *<emphasis>
+            dpy</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+            which</emphasis>
+;            /* mask selecting subcomponents to update */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr <emphasis>
+            xkb</emphasis>
+;            /* description from which new values are taken */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+Use <emphasis>
+XkbSetMap</emphasis>
+ to send a complete new set of values for entire components (for example, all
+symbols, all actions, and so on) to the server. The <emphasis>
+which</emphasis>
+ parameter specifies the components to be sent to the server, and is a bitwise
+inclusive OR of the masks listed in Table 14.1. The <emphasis>
+xkb</emphasis>
+ parameter is a pointer to an <emphasis>
+XkbDescRec</emphasis>
+ structure and contains the information to be copied to the server. For each
+bit set in the <emphasis>
+which</emphasis>
+ parameter, <emphasis>
+XkbSetMap</emphasis>
+ takes the corresponding structure values from the <emphasis>
+xkb</emphasis>
+ parameter and sends it to the server specified by <emphasis>
+dpy</emphasis>.
+</para>
+
+<para>
+If any components specified by <emphasis>
+which</emphasis>
+ are not present in the <emphasis>
+xkb</emphasis>
+ parameter, <emphasis>
+XkbSetMap</emphasis>
+ returns <emphasis>
+False</emphasis>
+. Otherwise, it sends the update request to the server and returns <emphasis>
+True</emphasis>
+. <emphasis>
+XkbSetMap</emphasis>
+ can generate <emphasis>
+BadAlloc</emphasis>
+, <emphasis>
+BadLength</emphasis>
+, and <emphasis>
+BadValue</emphasis>
+ protocol errors.
+</para>
+
+
+<para>
+Key types, symbol maps, and actions are all interrelated; changes in one
+require changes in the others. Xkb provides functions to make it easier to edit
+these components and handle the interdependencies. Table 14.1 lists these
+helper functions and provides a pointer to where they are defined.
+</para>
+
+
+<sect2 id='The_XkbMapChangesRec_Structure'>
+<title>The XkbMapChangesRec Structure</title>
+
+<para>
+Use the <emphasis>
+XkbMapChangesRec</emphasis>
+ structure to identify and track partial modifications to the mapping
+components and to reduce the amount of traffic between the server and clients.
+</para>
+
+<para><programlisting>
+typedef struct _XkbMapChanges {
+      unsigned short    changed;              /* identifies valid components
+                                                 in structure */
+      KeyCode           min_key_code;         /* lowest numbered keycode for
+                                                 device */
+      KeyCode           max_key_code;         /* highest numbered keycode for
+                                                 device */
+      unsigned char     first_type;           /* index of first key <emphasis>type</emphasis>
+                                                 modified */
+      unsigned char     num_types;            /* # types modified */
+      KeyCode           first_key_sym;        /* first key whose <emphasis>key_sym_map</emphasis>
+                                                 changed */
+      unsigned char     num_key_syms;         /* # <emphasis>key_sym_map</emphasis>
+                                                 entries changed */
+      KeyCode           first_key_act;        /* first key whose <emphasis>key_acts</emphasis>
+                                                 entry changed */
+      unsigned char     num_key_acts;         /* # <emphasis>key_acts</emphasis>
+                                                 entries changed */
+      KeyCode           first_key_behavior;   /* first key whose <emphasis>behaviors</emphasis>
+                                                 changed */
+      unsigned char     num_key_behaviors;    /* # <emphasis>behaviors</emphasis>
+                                                 entries changed */
+      KeyCode           first_key_explicit;   /* first key whose <emphasis>explicit</emphasis>
+                                                 entry changed */
+      unsigned char     num_key_explicit;     /* # <emphasis> explicit</emphasis>
+                                                 entries changed */
+      KeyCode           first_modmap_key;     /* first key whose <emphasis>modmap</emphasis>
+                                                 entry changed */
+      unsigned char     num_modmap_keys;      /* # <emphasis>modmap</emphasis>
+                                                 entries changed */
+      KeyCode           first_vmodmap_key;    /* first key whose <emphasis>vmodmap</emphasis>
+                                                 changed */
+      unsigned char     num_vmodmap_keys;     /* # <emphasis> vmodmap</emphasis>
+                                                 entries changed */
+      unsigned char     pad1;                 /* reserved */
+      unsigned short    vmods;                /* mask indicating which <emphasis>vmods</emphasis>
+                                                 changed */
+} <emphasis>XkbMapChangesRec</emphasis>,*XkbMapChangesPtr;
+</programlisting></para>
+
+<para>
+The <emphasis>
+changed</emphasis>
+ field identifies the map components that have changed in an <emphasis>
+XkbDescRec</emphasis>
+ structure and may contain any of the bits in Table 14.1, which are also shown
+in Table 14.2. Every 1 bit in <emphasis>
+changed</emphasis>
+ also identifies which other fields in the <emphasis>
+XkbMapChangesRec</emphasis>
+ structure contain valid values, as indicated in Table 14.2. The <emphasis>
+min_key_code</emphasis>
+ and <emphasis>
+max_key_code</emphasis>
+ fields are for reference only; they are ignored on any requests sent to the
+server and are always updated by the server whenever it returns the data for an
+<emphasis>
+XkbMapChangesRec</emphasis>
+.
+</para>
+
+<table frame='topbot'>
+<title>XkbMapChangesRec Masks</title>
+<?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>Mask</entry>
+  <entry>Valid XkbMapChangesRec Fields</entry>
+  <entry>XkbDescRec Field Containing Changed Data</entry>
+</row>
+</thead>
+<tbody>
+  <row>
+    <entry><emphasis>XkbKeyTypesMask</emphasis></entry>
+    <entry>
+<para>first_type</para>,
+<para>num_types</para>
+    </entry>
+    <entry>
+<para>map-&gt;type[first_type] ..</para>
+<para>map-&gt;type[first_type + num_types - 1]</para>
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbKeySymsMask</emphasis></entry>
+    <entry>
+<para>first_key_sym</para>,
+<para>num_key_syms</para>
+    </entry>
+    <entry>
+<para>map-&gt;key_sym_map[first_key_sym] ..</para>
+<para>map-&gt;key_sym_map[first_key_sym + num_key_syms - 1]</para>
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbModifierMapMask</emphasis></entry>
+    <entry>
+<para>first_modmap_key</para>,
+<para>num_modmap_keys</para>
+    </entry>
+    <entry>
+<para>map-&gt;modmap[first_modmap_key] ..</para>
+<para>map-&gt;modmap[first_modmap_key + num_modmap_keys-1]</para>
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbExplicitComponentsMask</emphasis></entry>
+    <entry>
+<para>first_key_explicit</para>,
+<para>num_key_explicit</para>
+    </entry>
+    <entry>
+<para>server-&gt;explicit[first_key_explicit] ..</para>
+<para>server-&gt;explicit[first_key_explicit + num_key_explicit - 1]</para>
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbKeyActionsMask</emphasis></entry>
+    <entry>
+<para>first_key_act,</para>
+<para>num_key_acts</para>
+    </entry>
+    <entry>
+<para>server-&gt;key_acts[first_key_act] ..</para>
+<para>server-&gt;key_acts[first_key_act + num_key_acts - 1]</para>
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbKeyBehaviorsMask</emphasis></entry>
+    <entry>
+<para>first_key_behavior,</para>
+<para>num_key_behaviors</para>
+    </entry>
+    <entry>
+<para>server-&gt;behaviors[first_key_behavior] ..</para>
+<para>server-&gt;behaviors[first_key_behavior + num_key_behaviors - 1]</para>
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbVirtuawModsMask</emphasis></entry>
+    <entry>vmods</entry>
+    <entry>server-&gt;vmods[*]</entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbVirtualModMapMask</emphasis></entry>
+    <entry>
+<para>first_vmodmap_key,</para>
+<para>num_vmodmap_keys</para>
+    </entry>
+    <entry>
+<para>server-&gt;vmodmap[first_vmodmap_key] ..</para>
+<para>server-&gt;vmodmap[first_vmodmap_key + num_vmodmap_keys - 1]</para>
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+To update only partial components of a keyboard description, modify the
+appropriate fields in the server and map components of a local copy of the
+keyboard description, then call <emphasis>
+XkbChangeMap</emphasis>
+ with an <emphasis>
+XkbMapChangesRec</emphasis>
+ structure indicating which components have changed.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbChangeMap</emphasis>
+(<emphasis>
+dpy</emphasis>
+,<emphasis>
+ xkb</emphasis>
+,<emphasis>
+ changes</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *<emphasis>
+            dpy</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr <emphasis>
+            xkb</emphasis>
+;            /* description from which new values are taken */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbMapChangesPtr <emphasis>
+            changes</emphasis>
+;            /*identifies component parts to update */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbChangeMap</emphasis>
+ copies any components specified by the <emphasis>
+changes</emphasis>
+ structure from the keyboard description, <emphasis>
+xkb</emphasis>
+, to the X server specified by <emphasis>
+dpy</emphasis>
+.
+</para>
+
+
+<para>
+If any components specified by <emphasis>
+changes</emphasis>
+ are not present in the <emphasis>
+xkb</emphasis>
+ parameter, <emphasis>
+XkbChangeMap</emphasis>
+ returns <emphasis>
+False</emphasis>
+. Otherwise, it sends a request to the server and returns <emphasis>
+True</emphasis>
+.
+</para>
+
+
+<para>
+<emphasis>
+XkbChangeMap</emphasis>
+ can generate <emphasis>
+BadAlloc</emphasis>
+, <emphasis>
+BadLength</emphasis>
+, and <emphasis>
+BadValue</emphasis>
+ protocol errors.
+</para>
+
+
+</sect2>
+</sect1>
+<sect1 id='Tracking_Changes_to_Map_Components'>
+<title>Tracking Changes to Map Components</title>
+
+<para>
+The Xkb extension reports <emphasis>
+XkbMapNotify</emphasis>
+ events to clients wanting notification whenever a map component of the Xkb
+description for a device changes. There are many different types of Xkb
+keyboard map changes. Xkb uses an event detail mask to identify each type of
+change. The event detail masks are identical to the masks listed in Table 14.1.
+</para>
+
+
+<para>
+To receive <emphasis>
+XkbMapNotify</emphasis>
+ events under all possible conditions, use <emphasis>
+XkbSelectEvents</emphasis>
+ (see section 4.3) and pass <emphasis>
+XkbMapNotifyMask</emphasis>
+ in both <emphasis>
+bits_to_change</emphasis>
+ and <emphasis>
+values_for_bits</emphasis>
+.
+</para>
+
+
+<para>
+To receive <emphasis>
+XkbMapNotify</emphasis>
+ events only under certain conditions, use <emphasis>
+XkbSelectEventDetails</emphasis>
+ using <emphasis>
+XkbMapNotify</emphasis>
+ as the <emphasis>
+event_type</emphasis>
+ and specifying the desired map changes in <emphasis>
+bits_to_change</emphasis>
+ and <emphasis>
+values_for_bits</emphasis>
+ using mask bits from Table 14.1.
+</para>
+
+
+<para>
+The structure for <emphasis>
+XkbMapNotify</emphasis>
+ events is:
+</para>
+
+<para><programlisting>
+typedef struct {
+      int            type;         /* Xkb extension base event code */
+      unsigned long  serial;       /* X server serial number for event */
+      Bool           send_event;   /* <emphasis>True</emphasis> =&gt; synthetically generated */
+      Display *      display;      /* server connection where event generated */
+      Time           time;         /* server time when event generated */
+      int            xkb_type;     /* <emphasis> XkbMapNotify</emphasis> */
+      int            device;       /* Xkb device ID, will not be <emphasis>XkbUseCoreKbd</emphasis> */
+      unsigned int   changed;      /* identifies valid fields in rest of event */
+      unsigned int   resized;      /* reserved */
+      int            first_type;   /* index of first key <emphasis> type</emphasis> modified */
+      int            num_types     /* # types modified */
+      KeyCode        min_key_code; /* minimum keycode for device */
+      KeyCode        max_key_code; /* maximum keycode for device */
+      KeyCode        first_key_sym; /* first key whose <emphasis>key_sym_map</emphasis> changed */
+      KeyCode        first_key_act; /* first key whose <emphasis> key_acts</emphasis> entry changed */
+      KeyCode        first_key_behavior; /* first key whose <emphasis> behaviors</emphasis> changed */
+      KeyCode        first_key_explicit; /* first key whose <emphasis> explicit </emphasis> entry changed */
+      KeyCode        first_modmap_key;   /* first key whose <emphasis> modmap</emphasis> entry changed */
+      KeyCode        first_vmodmap_key;  /* # <emphasis> modmap</emphasis> entries changed */
+      int            num_key_syms;       /* # <emphasis>key_sym_map</emphasis> entries changed */
+      int            num_key_acts;       /* # <emphasis> key_acts</emphasis> entries changed */
+      int            num_key_behaviors;  /* # <emphasis> behaviors</emphasis> entries changed */
+      int            num_key_explicit;   /* # <emphasis> explicit</emphasis> entries changed */
+      int            num_modmap_keys;    /* # <emphasis> modmap</emphasis> entries changed */
+      int            num_vmodmap_keys;   /* # <emphasis> vmodmap</emphasis> entries changed */
+      unsigned in      t      vmods;     /* mask indicating which <emphasis> vmods</emphasis> changed */
+} <emphasis>XkbMapNotifyEvent</emphasis>;
+</programlisting></para>
+
+<para>
+The <emphasis>
+changed</emphasis>
+ field specifies the map components that have changed and is the bitwise
+inclusive OR of the mask bits defined in Table 14.1. The other fields in this
+event are interpreted as the like-named fields in an <emphasis>
+XkbMapChangesRec</emphasis>
+ (see section 14.3.1). The <emphasis>
+XkbMapNotifyEvent</emphasis>
+ structure also has an additional <emphasis>
+resized</emphasis>
+ field that is reserved for future use.
+</para>
+
+
+</sect1>
+<sect1 id='Allocating_and_Freeing_Client_and_Server_Maps'>
+<title>Allocating and Freeing Client and Server Maps</title>
+
+<para>
+Calling <emphasis>
+XkbGetMap</emphasis>
+ (see section 14.2) should be sufficient for most applications to get client
+and server maps. As a result, most applications do not need to directly
+allocate client and server maps.
+</para>
+
+
+<para>
+If you change the number of key types or construct map components without
+loading the necessary components from the X server, do not allocate any map
+components directly using <emphasis>
+malloc</emphasis>
+ or <emphasis>
+Xmalloc</emphasis>
+. Instead, use the Xkb allocators, <emphasis>
+XkbAllocClientMap,</emphasis>
+ and <emphasis>
+XkbAllocServerMap</emphasis>
+.
+</para>
+
+
+<para>
+Similarly, use the Xkb destructors, <emphasis>
+XkbFreeClientMap,</emphasis>
+ and <emphasis>
+XkbFreeServerMap</emphasis>
+ instead of <emphasis>
+free</emphasis>
+ or <emphasis>
+Xfree</emphasis>
+.
+</para>
+
+
+<sect2 id='Allocating_an_Empty_Client_Map'>
+<title>Allocating an Empty Client Map</title>
+
+<para>
+To allocate and initialize an empty client map description record, use
+<emphasis>
+XkbAllocClientMap.</emphasis>
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbAllocClientMap</emphasis>
+(<emphasis>
+xkb, which, type_count</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr <emphasis>
+            xkb</emphasis>
+;            /* keyboard description in which to allocate client map */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+            which</emphasis>
+;            /* mask selecting map components to allocate */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+            type_count</emphasis>
+;            /* value of <emphasis>
+num_types</emphasis>
+ field in map to be allocated */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbAllocClientMap</emphasis>
+ allocates and initializes an empty client map in the <emphasis>
+map</emphasis>
+ field of the keyboard description specified by <emphasis>
+xkb</emphasis>
+. The <emphasis>
+which</emphasis>
+ parameter specifies the particular components of the client map structure to
+allocate and is a mask composed by a bitwise inclusive OR of one or more of the
+masks shown in Table 14.3.
+</para>
+
+<table frame='topbot'>
+<title>XkbAllocClientMap Masks</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Mask</entry>
+  <entry>Effect</entry>
+  </row>
+</thead>
+<tbody>
+  <row>
+    <entry>XkbKeyTypesMask</entry>
+    <entry>
+The <emphasis>
+type_count </emphasis>
+field specifies the number of entries to preallocate for the <emphasis>
+types</emphasis>
+ field of the client map. If the <emphasis>
+type_count </emphasis>
+field is less than <emphasis>
+XkbNumRequiredTypes</emphasis>
+ (see section 15.2.1), returns <emphasis>
+BadValue</emphasis>.
+</entry>
+  </row>
+  <row>
+    <entry>XkbKeySymsMask</entry>
+<entry>
+The <emphasis>
+min_key_code</emphasis>
+ and <emphasis>
+max_key_code</emphasis>
+ fields of the <emphasis>
+xkb</emphasis>
+ parameter are used to allocate the <emphasis>
+syms</emphasis>
+ and <emphasis>
+key_sym_map</emphasis>
+ fields of the client map. The fields are allocated to contain the maximum
+number of entries necessary for <emphasis>
+max_key_code</emphasis>
+ - <emphasis>
+min_key_code</emphasis>
+ + 1 keys.
+</entry>
+  </row>
+  <row>
+    <entry>XkbModifierMapMask</entry>
+<entry>
+The <emphasis>
+min_key_code</emphasis>
+ and <emphasis>
+max_key_code</emphasis>
+ fields of the <emphasis>
+xkb</emphasis>
+ parameter are used to allocate the <emphasis>
+modmap</emphasis>
+ field of the client map. The field is allocated to contain the maximum number
+of entries necessary for <emphasis>
+max_key_code</emphasis>
+ - <emphasis>
+min_key_code</emphasis>
+ + 1 keys.
+</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<note><para>The <emphasis>
+min_key_code</emphasis>
+ and <emphasis>
+max_key_code</emphasis>
+ fields of the <emphasis>
+xkb</emphasis>
+ parameter must be legal values if the <emphasis>
+XkbKeySymsMask</emphasis>
+ or <emphasis>
+XkbModifierMapMask</emphasis>
+ masks are set in the <emphasis>
+which</emphasis>
+ parameter. If they are not valid, <emphasis>
+XkbAllocClientMap</emphasis>
+ returns <emphasis>
+BadValue</emphasis>
+. </para></note>
+
+<para>
+If the client map of the keyboard description is not <emphasis>
+NULL</emphasis>
+, and any fields are already allocated in the client map, <emphasis>
+XkbAllocClientMap</emphasis>
+ does not overwrite the existing values; it simply ignores that part of the
+request. The only exception is the <emphasis>
+types</emphasis>
+ array. If <emphasis>
+type_count</emphasis>
+ is greater than the current <emphasis>
+num_types</emphasis>
+ field of the client map, <emphasis>
+XkbAllocClientMap</emphasis>
+ resizes the <emphasis>
+types</emphasis>
+ array and resets the <emphasis>
+num_types</emphasis>
+ field accordingly.
+</para>
+
+
+<para>
+If <emphasis>
+XkbAllocClientMap</emphasis>
+ is successful, it returns <emphasis>
+Success</emphasis>
+. Otherwise, it can return either <emphasis>
+BadMatch</emphasis>
+, <emphasis>
+BadAlloc</emphasis>
+, or <emphasis>
+BadValue</emphasis>
+ errors.
+</para>
+
+
+</sect2>
+<sect2 id='Freeing_a_Client_Map'>
+<title>Freeing a Client Map</title>
+
+<para>
+To free memory used by the client map member of an <emphasis>
+XkbDescRec</emphasis>
+ structure, use <emphasis>
+XkbFreeClientMap.</emphasis>
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbFreeClientMap</emphasis>
+(<emphasis>
+xkb, which, free_all</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr <emphasis>
+      xkb</emphasis>
+;            /* keyboard description containing client map to free */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+      which</emphasis>
+;            /* mask identifying components of map to free */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool <emphasis>
+      free_all</emphasis>
+;            /* <emphasis>
+True</emphasis>
+ =&gt; free all client components and map itself */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbFreeClientMap</emphasis>
+ frees the components of client map specified by <emphasis>
+which</emphasis>
+ in the <emphasis>
+XkbDescRec</emphasis>
+ structure specified by the <emphasis>
+xkb</emphasis>
+ parameter and sets the corresponding structure component values to <emphasis>
+NULL</emphasis>
+. The <emphasis>
+which</emphasis>
+ parameter specifies a combination of the client map masks shown in Table 14.3.
+</para>
+
+
+<para>
+If <emphasis>
+free_all</emphasis>
+ is <emphasis>
+True</emphasis>
+, <emphasis>
+which</emphasis>
+ is ignored; <emphasis>
+XkbFreeClientMap</emphasis>
+ frees every non-<emphasis>
+NULL</emphasis>
+ structure component in the client map, frees the <emphasis>
+XkbClientMapRec</emphasis>
+ structure referenced by the <emphasis>
+map</emphasis>
+ member of the <emphasis>
+xkb</emphasis>
+ parameter, and sets the <emphasis>
+map</emphasis>
+ member to <emphasis>
+NULL.</emphasis>
+</para>
+
+
+</sect2>
+<sect2 id='Allocating_an_Empty_Server_Map'>
+<title>Allocating an Empty Server Map</title>
+
+<para>
+To allocate and initialize an empty server map description record, use
+<emphasis>
+XkbAllocServerMap.</emphasis>
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbAllocServerMap</emphasis>
+(<emphasis>
+xkb, which, count_acts</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr <emphasis>
+            xkb</emphasis>
+;            /* keyboard description in which to allocate server map */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+            which</emphasis>
+;            /* mask selecting map components to allocate */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+            count_acts</emphasis>
+;            /* value of <emphasis>
+num_acts</emphasis>
+ field in map to be allocated */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbAllocServerMap</emphasis>
+ allocates and initializes an empty server map in the <emphasis>
+server</emphasis>
+ field of the keyboard description specified by <emphasis>
+xkb</emphasis>
+. The <emphasis>
+which</emphasis>
+ parameter specifies the particular components of the server map structure to
+allocate, as specified in Table 14.4.
+</para>
+
+<table frame='topbot'>
+<title>XkbAllocServerMap Masks</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Mask</entry>
+  <entry>Effect</entry>
+  </row>
+</thead>
+<tbody>
+  <row>
+    <entry>XkbExplicitComponentsMask</entry>
+    <entry>
+The <emphasis>
+min_key_code</emphasis>
+ and <emphasis>
+max_key_code</emphasis>
+ fields of the <emphasis>
+xkb</emphasis>
+ parameter are used to allocate the <emphasis>
+explicit </emphasis>
+field of the server map.
+    </entry>
+  </row>
+  <row>
+    <entry>XkbKeyActionsMask</entry>
+    <entry>
+The <emphasis>
+min_key_code</emphasis>
+ and <emphasis>
+max_key_code</emphasis>
+ fields of the <emphasis>
+xkb</emphasis>
+ parameter are used to allocate the <emphasis>
+key_acts </emphasis>
+field of the server map. The <emphasis>
+count_acts</emphasis>
+ parameter is used to allocate the <emphasis>
+acts</emphasis>
+ field of the server map.
+    </entry>
+  </row>
+  <row>
+    <entry>XkbKeyBehaviorsMask</entry>
+    <entry>
+The <emphasis>
+min_key_code</emphasis>
+ and <emphasis>
+max_key_code</emphasis>
+ fields of the <emphasis>
+xkb</emphasis>
+ parameter are used to allocate the <emphasis>
+behaviors </emphasis>
+field of the server map.
+    </entry>
+  </row>
+  <row>
+    <entry>XkbVirtualModMapMask</entry>
+    <entry>
+The <emphasis>
+min_key_code</emphasis>
+ and <emphasis>
+max_key_code</emphasis>
+ fields of the <emphasis>
+xkb </emphasis>
+parameter are used to allocate the <emphasis>
+vmodmap </emphasis>
+field of the server map.
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<note><para>The <emphasis>
+min_key_code</emphasis>
+ and <emphasis>
+max_key_code</emphasis>
+ fields of the <emphasis>
+xkb</emphasis>
+ parameter must be legal values. If they are not valid, <emphasis>
+XkbAllocServerMap</emphasis>
+ returns <emphasis>
+BadValue</emphasis>
+. </para></note>
+
+<para>
+If the server map of the keyboard description is not <emphasis>
+NULL</emphasis>
+ and any fields are already allocated in the server map, <emphasis>
+XkbAllocServerMap</emphasis>
+ does not overwrite the existing values. The only exception is with the
+<emphasis>
+acts </emphasis>
+array. If the <emphasis>
+count_acts </emphasis>
+parameter is greater than the current <emphasis>
+num_acts </emphasis>
+field of the server map, <emphasis>
+XkbAllocServerMap</emphasis>
+ resizes the <emphasis>
+acts </emphasis>
+array and resets the <emphasis>
+num_acts </emphasis>
+field accordingly.
+</para>
+
+
+<para>
+If <emphasis>
+XkbAllocServerMap</emphasis>
+ is successful, it returns <emphasis>
+Success</emphasis>
+. Otherwise, it can return either <emphasis>
+BadMatch</emphasis>
+ or <emphasis>
+BadAlloc</emphasis>
+ errors.
+</para>
+
+
+</sect2>
+<sect2 id='Freeing_a_Server_Map'>
+<title>Freeing a Server Map</title>
+
+<para>
+To free memory used by the server member of an <emphasis>
+XkbDescRec</emphasis>
+ structure, use <emphasis>
+XkbFreeServerMap.</emphasis>
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbFreeServerMap</emphasis>
+(<emphasis>
+xkb, which, free_all</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr <emphasis>
+      xkb</emphasis>
+;            /* keyboard description containing server map to free */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+      which</emphasis>
+;            /* mask identifying components of map to free */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool <emphasis>
+      free_all</emphasis>
+;            /* <emphasis>
+True</emphasis>
+ =&gt; free all server map components and server itself */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+The <emphasis>
+XkbFreeServerMap</emphasis>
+ function frees the specified components of server map in the <emphasis>
+XkbDescRec</emphasis>
+ structure specified by the <emphasis>
+xkb</emphasis>
+ parameter and sets the corresponding structure component values to <emphasis>
+NULL</emphasis>
+. The <emphasis>
+which</emphasis>
+ parameter specifies a combination of the server map masks and is a bitwise
+inclusive OR of the masks listed in Table 14.4. If <emphasis>
+free_all</emphasis>
+ is <emphasis>
+True</emphasis>
+, <emphasis>
+which</emphasis>
+ is ignored and <emphasis>
+XkbFreeServerMap</emphasis>
+ frees every non-<emphasis>
+NULL</emphasis>
+ structure component in the server map, frees the <emphasis>
+XkbServerMapRec</emphasis>
+ structure referenced by the <emphasis>
+server</emphasis>
+ member of the <emphasis>
+xkb</emphasis>
+ parameter, and sets the <emphasis>
+server</emphasis>
+ member to <emphasis>
+NULL.</emphasis>
+</para>
+
+</sect2>
+</sect1>
+</chapter>
diff --git a/specs/XKB/ch15.xml b/specs/XKB/ch15.xml
new file mode 100644 (file)
index 0000000..b12bc8c
--- /dev/null
@@ -0,0 +1,2624 @@
+<chapter id='Xkb_Client_Keyboard_Mapping'>
+<title>Xkb Client Keyboard Mapping</title>
+
+<para>
+The Xkb client map for a keyboard is the collection of information a client
+needs to interpret key events from the keyboard. It contains a global list of
+key types and an array of key symbol maps, each of which describes the symbols
+bound to a key and the rules to be used to interpret those symbols.
+</para>
+
+
+<para>
+Figure 15.1 shows the relationships between elements in the client map:
+</para>
+
+<mediaobject>
+ <imageobject> <imagedata format="SVG" fileref="XKBlib-15.svg"/>
+ </imageobject>
+<caption>Xkb Client Map</caption>
+ </mediaobject>
+
+
+<!--
+<H5 CLASS="Figure">
+Xkb Client Map</H5>
+-->
+
+<sect1 id='The_XkbClientMapRec_Structure'>
+<title>The XkbClientMapRec Structure</title>
+
+<para>
+The <emphasis>
+map </emphasis>
+field of the complete Xkb keyboard description (see section 6.1) is a pointer
+to the Xkb client map, which is of type <emphasis>
+XkbClientMapRec</emphasis>
+:
+</para>
+
+<para><programlisting>
+typedef struct {                        /* Client Map */
+      unsigned char      size_types;    /* # occupied entries in <emphasis> types</emphasis> */
+      unsigned char      num_types;     /* # entries in <emphasis>types</emphasis> */
+      XkbKeyTypePtr      types;         /* vector of key types used by this keymap */
+      unsigned short     size_syms;     /* length of the <emphasis>syms</emphasis> array */
+      unsigned short     num_syms;      /* # entries in <emphasis>syms</emphasis> */
+      KeySym *           syms;          /* linear 2d tables of keysyms, 1 per key */
+      XkbSymMapPtr       key_sym_map;   /* 1 per keycode, maps keycode to <emphasis>syms</emphasis> */
+      unsigned char *    modmap;        /* 1 per keycode, real mods bound to key */
+} <emphasis>XkbClientMapRec</emphasis>, *XkbClientMapPtr;
+</programlisting></para>
+
+<para>
+The following sections describe each of the elements of the <emphasis>
+XkbClientMapRec</emphasis>
+ structure in more detail.
+</para>
+
+
+</sect1>
+<sect1 id='Key_Types'>
+<title>Key Types</title>
+
+<para>
+Key types are used to determine the shift level of a key given the current
+state of the keyboard. The set of all possible key types for the Xkb keyboard
+description are held in the <emphasis>
+types</emphasis>
+ field of the client map, whose total size is stored in <emphasis>
+size_types</emphasis>
+, and whose total number of valid entries is stored in <emphasis>
+num_types</emphasis>
+. Key types are defined using the following structures:
+</para>
+
+<para><programlisting>
+typedef struct {                       /* Key Type */
+      XkbModsRec        mods;          /* modifiers used to compute shift
+                                          level */
+      unsigned char     num_levels;    /* total # shift levels, do not
+                                          modify directly */
+      unsigned char     map_count;     /* # entries in <emphasis>map</emphasis>,
+                                          <emphasis> preserve</emphasis>
+                                          (if non-<emphasis> NULL</emphasis>) */
+      XkbKTMapEntryPtr  map;           /* vector of modifiers for each
+                                          shift level */
+      XkbModsPtr        preserve;      /* mods to preserve for corresponding
+                                          <emphasis>map</emphasis> entry */
+      Atom              name;          /* name of key type */
+      Atom *            level_names;   /* array of names of each shift level */
+} <emphasis>XkbKeyTypeRec</emphasis>, *XkbKeyTypePtr;
+</programlisting></para>
+
+<para><programlisting>
+typedef struct {                   /* Modifiers for a key type */
+      Bool            active;      /* <emphasis> True</emphasis> =&gt; entry
+                                      active when determining shift level */
+      unsigned char   level;       /* shift level if modifiers match <emphasis> mods</emphasis> */
+      XkbModsRec      mods;        /* mods needed for this level to be
+                                      selected */
+} <emphasis>XkbKTMapEntryRec</emphasis>,*XkbKTMapEntryPtr;
+</programlisting></para>
+
+<para>
+The <emphasis>
+mods</emphasis>
+ field of a key type is an <emphasis>
+XkbModsRec</emphasis>
+ (see section 7.2) specifying the modifiers the key type uses when calculating
+the shift level, and can be composed of both the core modifiers and virtual
+modifiers. To set the modifiers associated with a key type, modify the
+<emphasis>
+real_mods</emphasis>
+ and <emphasis>
+vmods</emphasis>
+ fields of the <emphasis>
+mods</emphasis>
+ <emphasis>
+XkbModsRec</emphasis>
+ accordingly. The <emphasis>
+mask</emphasis>
+ field of the <emphasis>
+XkbModsRec</emphasis>
+ is reserved for use by Xkb and is calculated from the <emphasis>
+real_mods</emphasis>
+ and <emphasis>
+vmods</emphasis>
+ fields.
+</para>
+
+
+<para>
+The <emphasis>
+num_levels</emphasis>
+ field holds the total number of shift levels for the key type. Xkb uses
+<emphasis>
+num_levels</emphasis>
+ to ensure the array of symbols bound to a key is large enough. Do not modify
+<emphasis>
+num_levels</emphasis>
+ directly to change the number if shift levels for a key type. Instead, use
+<emphasis>
+XkbResizeKeyType</emphasis>
+ (see section 15.2.3).
+</para>
+
+
+<para>
+The <emphasis>
+map</emphasis>
+ field is a vector of <emphasis>
+XkbKTMapEntryRec</emphasis>
+ structures, with <emphasis>
+map_count</emphasis>
+ entries, that specify the modifier combinations for each possible shift level.
+Each map entry contains an <emphasis>
+active</emphasis>
+ field, a <emphasis>
+mods</emphasis>
+ field, and a <emphasis>
+level</emphasis>
+ field. The <emphasis>
+active</emphasis>
+ field determines whether the modifier combination listed in the <emphasis>
+mods</emphasis>
+ field should be considered when determining shift level. If <emphasis>
+active</emphasis>
+ is <emphasis>
+False</emphasis>
+, this <emphasis>
+map</emphasis>
+ entry is ignored. If <emphasis>
+active</emphasis>
+ is <emphasis>
+True</emphasis>
+, the <emphasis>
+level</emphasis>
+ field of the <emphasis>
+map </emphasis>
+entry specifies the shift level to use when the current modifier combination
+matches the combination specified in the <emphasis>
+mods</emphasis>
+ field of the <emphasis>
+map</emphasis>
+ entry.
+</para>
+
+
+<para>
+Any combination of modifiers not explicitly listed somewhere in the <emphasis>
+map</emphasis>
+ yields shift level one. In addition, <emphasis>
+map</emphasis>
+ entries specifying unbound virtual modifiers are not considered.
+</para>
+
+
+<para>
+Any modifiers specified in <emphasis>
+mods</emphasis>
+ are normally <emphasis>
+consumed</emphasis>
+ by <emphasis>
+XkbTranslateKeyCode</emphasis>
+ (see section 12.1.3). For those rare occasions a modifier <emphasis>
+should</emphasis>
+ be considered despite having been used to look up a symbol, key types include
+an optional <emphasis>
+preserve</emphasis>
+ field. If a <emphasis>
+preserve</emphasis>
+ member of a key type is not <emphasis>
+NULL</emphasis>
+, it represents a list of modifiers where each entry corresponds directly to
+one of the key type’s <emphasis>
+map</emphasis>
+. Each entry lists the modifiers that should <emphasis>
+not</emphasis>
+ be consumed if the matching map entry is used to determine shift level.
+</para>
+
+
+<para>
+Each shift level has a name and these names are held in the <emphasis>
+level_names</emphasis>
+ array, whose length is <emphasis>
+num_levels</emphasis>
+. The type itself also has a name, which is held in the <emphasis>
+name</emphasis>
+ field.
+</para>
+
+
+<para>
+For example, consider how the server handles the following possible symbolic
+description of a possible key type (note that the format used to specify
+keyboard mappings in the server database is not specified by the Xkb extension,
+although this format is one possible example):
+</para>
+
+<table frame='topbot'>
+<title>Example Key Type</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='1.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Symbolic Description</entry>
+  <entry>Key Type Data Structure</entry>
+</row>
+</thead>
+<tbody>
+  <row>
+    <entry>type "ALPHATHREE" {</entry>
+    <entry>Xkb-&gt;map-&gt;types[i].name</entry>
+  </row>
+  <row>
+    <entry>modifiers = Shift+Lock+LevelThree;</entry>
+    <entry>Xkb-&gt;map-&gt;types[i].mods</entry>
+  </row>
+  <row>
+    <entry><emphasis>map[None]= Level1;</emphasis></entry>
+    <entry>Xkb-&gt;map-&gt;types[i].map[0]</entry>
+  </row>
+  <row>
+    <entry><emphasis>map[Lock]= Level1;</emphasis></entry>
+    <entry>Xkb-&gt;map-&gt;types[i].map[1]</entry>
+  </row>
+  <row>
+    <entry>map[Shift]= Level2;</entry>
+    <entry>Xkb-&gt;map-&gt;types[i].map[2]</entry>
+  </row>
+  <row>
+    <entry>map[LevelThree]= Level3;</entry>
+    <entry>Xkb-&gt;map-&gt;types[i].map[3]</entry>
+  </row>
+  <row>
+    <entry>map[Shift+LevelThree]= Level3;</entry>
+    <entry>Xkb-&gt;map-&gt;types[i].map[4]</entry>
+  </row>
+  <row>
+    <entry><emphasis>preserve[None]= None;</emphasis></entry>
+    <entry>Xkb-&gt;map-&gt;types[i].perserve[0]</entry>
+  </row>
+  <row>
+    <entry>preserve[Lock]= Lock;</entry>
+    <entry>Xkb-&gt;map-&gt;types[i].preserve[1]</entry>
+  </row>
+  <row>
+    <entry><emphasis>preserve[Shift]= None;</emphasis></entry>
+    <entry>Xkb-&gt;map-&gt;types[i].preserve[2]</entry>
+  </row>
+  <row>
+    <entry><emphasis>preserve[LevelThree]= None;</emphasis></entry>
+    <entry>Xkb-&gt;map-&gt;types[i].preserve[3]</entry>
+  </row>
+  <row>
+    <entry><emphasis>preserve[Shift+Level3]= None;</emphasis> </entry>
+    <entry>Xkb-&gt;map-&gt;types[i].preserve[4]</entry>
+  </row>
+  <row>
+    <entry>level_name[Level1]= "Base";</entry>
+    <entry>Xkb-&gt;map-&gt;types[i].level_names[0]</entry>
+  </row>
+  <row>
+    <entry>level_name[Level2]= "Caps";</entry>
+    <entry>Xkb-&gt;map-&gt;types[i].level_names[1]</entry>
+  </row>
+  <row>
+    <entry>level_name[Level3]= "Level3";</entry>
+    <entry>Xkb-&gt;map-&gt;types[i].level_names[2]</entry>
+  </row>
+  <row>
+    <entry>};</entry>
+    <entry></entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+The <emphasis>
+name</emphasis>
+ of the example key type is "ALPHATHREE," and the modifiers it pays attention
+to are <emphasis>
+Shift</emphasis>
+, <emphasis>
+Lock</emphasis>
+, and the virtual modifier <emphasis>
+LevelThree</emphasis>
+. There are three shift levels. The name of shift level one is "Base," the name
+of shift level two is "Caps," and the name of shift level three is "Level3."
+</para>
+
+
+<para>
+Given the combination of the <emphasis>
+map</emphasis>
+ and <emphasis>
+preserve</emphasis>
+ specifications, there are five <emphasis>
+map</emphasis>
+ entries. The first map entry specifies that shift level one is to be used if
+no modifiers are set. The second entry specifies the <emphasis>
+Lock</emphasis>
+ modifier alone also yields shift level one. The third entry specifies the
+<emphasis>
+Shift</emphasis>
+ modifier alone yields shift level two. The fourth and fifth entries specify
+that the virtual <emphasis>
+LevelThree</emphasis>
+ modifier alone, or in combination with the <emphasis>
+Shift</emphasis>
+ modifier, yields shift level three.
+</para>
+
+<note><para>Shift level three can be reached only if the virtual modifier
+<emphasis>
+LevelThree</emphasis>
+ is bound to a real modifier (see section 16.4). If <emphasis>
+LevelThree</emphasis>
+ is not bound to a real modifier, the <emphasis>
+map</emphasis>
+ entries associated with it are ignored.</para></note>
+
+<para>
+Because the <emphasis>
+Lock</emphasis>
+ modifier is to be preserved for further event processing, the <emphasis>
+preserve</emphasis>
+ list is not <emphasis>
+NULL</emphasis>
+ and parallels the <emphasis>
+map</emphasis>
+ list. All <emphasis>
+preserve</emphasis>
+ entries, except for the one corresponding to the <emphasis>
+map</emphasis>
+ entry that specifies the <emphasis>
+Lock </emphasis>
+modifier, do not list any modifiers. For the <emphasis>
+map</emphasis>
+ entry that specifies the <emphasis>
+Lock</emphasis>
+ modifier, the corresponding <emphasis>
+preserve</emphasis>
+ list entry lists the <emphasis>
+Lock</emphasis>
+ modifier, meaning do not consume the <emphasis>
+Lock</emphasis>
+ modifier. In this particular case, the preserved modifier is passed to Xlib
+translation functions and causes them to notice that the <emphasis>
+Lock</emphasis>
+ modifier is set; consequently, the Xlib functions apply the appropriate
+capitalization rules to the symbol. Because this preserve entry is set only for
+a modifier that yields shift level one, the capitalization occurs only for
+level-one symbols.
+</para>
+
+
+<sect2 id='The_Canonical_Key_Types'>
+<title>The Canonical Key Types</title>
+
+<para>
+Xkb allows up to <emphasis>
+XkbMaxKeyTypes</emphasis>
+ (255) key types to be defined, but requires at least <emphasis>
+XkbNumRequiredTypes</emphasis>
+ (4) predefined types to be in a key map. These predefined key types are
+referred to as the canonical key types and describe the types of keys available
+on most keyboards. The definitions for the canonical key types are held in the
+first <emphasis>
+XkbNumRequiredTypes</emphasis>
+ entries of the <emphasis>
+types</emphasis>
+ field of the client map and are indexed using the following constants:
+</para>
+
+<para><programlisting>
+     <emphasis>XkbOneLevelIndex</emphasis>
+     <emphasis>XkbTwoLevelIndex</emphasis>
+     <emphasis>XkbAlphabeticIndex</emphasis>
+     <emphasis>XkbKeypadIndex</emphasis>
+</programlisting></para>
+
+<sect3 id='ONE_LEVEL'>
+<title>ONE_LEVEL</title>
+
+<para>
+The ONE_LEVEL key type describes groups that have only one symbol. The default
+ONE_LEVEL key type has no map entries and does not pay attention to any
+modifiers. A symbolic representation of this key type could look like the
+following:
+</para>
+
+<literallayout>
+type "ONE_LEVEL" {
+      modifiers = None;
+      map[None]= Level1;
+      level_name[Level1]= "Any";
+};
+</literallayout>
+
+<para>
+The description of the ONE_LEVEL key type is stored in the <emphasis>
+types</emphasis>
+[<emphasis>
+XkbOneLevelIndex</emphasis>
+] entry of the client key map.
+</para>
+
+
+</sect3>
+<sect3 id='TWO_LEVEL'>
+<title>TWO_LEVEL</title>
+
+<para>
+The TWO_LEVEL key type describes groups that consist of two symbols but are
+neither alphabetic nor numeric keypad keys. The default TWO_LEVEL type uses
+only the <emphasis>
+Shift</emphasis>
+ modifier. It returns shift level two if <emphasis>
+Shift</emphasis>
+ is set, and level one if it is not. A symbolic representation of this key type
+could look like the following:
+</para>
+
+<literallayout>
+type "TWO_LEVEL" {
+      modifiers = Shift;
+      map[Shift]= Level2;
+      level_name[Level1]= "Base";
+      level_name[Level2]= "Shift";
+};
+</literallayout>
+
+<para>
+The description of the TWO_LEVEL key type is stored in the <emphasis>
+types</emphasis>
+[<emphasis>
+XkbTwoLevelIndex</emphasis>
+] entry of the client key map.
+</para>
+
+
+</sect3>
+<sect3 id='ALPHABETIC'>
+<title>ALPHABETIC</title>
+
+<para>
+The ALPHABETIC key type describes groups consisting of two symbols: the
+lowercase form of a symbol followed by the uppercase form of the same symbol.
+The default ALPHABETIC type implements locale-sensitive "Shift cancels
+CapsLock" behavior using both the <emphasis>
+Shift</emphasis>
+ and <emphasis>
+Lock</emphasis>
+ modifiers as follows:
+</para>
+
+<itemizedlist>
+<listitem>
+  <para>
+If <emphasis>
+Shift</emphasis>
+ and <emphasis>
+Lock</emphasis>
+ are both set, the default ALPHABETIC type yields level one.
+  </para>
+</listitem>
+<listitem>
+  <para>
+If <emphasis>
+Shift</emphasis>
+ alone is set, it yields level two.
+  </para>
+</listitem>
+<listitem>
+  <para>
+If <emphasis>
+Lock</emphasis>
+ alone is set, it yields level one, but preserves the <emphasis>
+Lock</emphasis>
+ modifier so Xlib notices and applies the appropriate capitalization rules. The
+Xlib functions are locale-sensitive and apply different capitalization rules
+for different locales.
+  </para>
+</listitem>
+<listitem>
+  <para>
+If neither <emphasis>
+Shift</emphasis>
+ nor <emphasis>
+Lock</emphasis>
+ is set, it yields level one.
+  </para>
+</listitem>
+</itemizedlist>
+
+<para>
+A symbolic representation of this key type could look like the following:
+</para>
+
+<literallayout>
+type "ALPHABETIC" {
+      modifiers = Shift+Lock;
+      map[Shift]= Level2;
+      preserve[Lock]= Lock;
+      level_name[Level1]= "Base";
+      level_name[Level2]= "Caps";
+};
+</literallayout>
+
+<para>
+The description of the ALPHABETIC key type is stored in the <emphasis>
+types</emphasis>
+[<emphasis>
+XkbAlphabeticIndex</emphasis>
+] entry of the client key map.
+</para>
+
+
+</sect3>
+<sect3 id='KEYPAD'>
+<title>KEYPAD</title>
+
+<para>
+The KEYPAD key type describes groups that consist of two symbols, at least one
+of which is a numeric keypad symbol. The numeric keypad symbol is assumed to
+reside at level two. The default KEYPAD key type implements "Shift cancels
+NumLock" behavior using the Shift modifier and the real modifier bound to the
+virtual modifier named "NumLock," known as the <emphasis>
+NumLock</emphasis>
+ modifier, as follows:
+</para>
+
+<itemizedlist>
+<listitem>
+  <para>
+If <emphasis>
+Shift</emphasis>
+ and <emphasis>
+NumLock</emphasis>
+ are both set, the default KEYPAD type yields level one.
+  </para>
+</listitem>
+<listitem>
+  <para>
+If <emphasis>
+Shift</emphasis>
+ alone is set, it yields level two.
+  </para>
+</listitem>
+<listitem>
+  <para>
+If <emphasis>
+NumLock</emphasis>
+ alone is set, it yields level two.
+  </para>
+</listitem>
+<listitem>
+  <para>
+If neither <emphasis>
+Shift</emphasis>
+ nor <emphasis>
+NumLock</emphasis>
+ is set, it yields level one.
+  </para>
+</listitem>
+</itemizedlist>
+
+<para>
+A symbolic representation of this key type could look like the following:
+</para>
+
+<literallayout>
+type "KEYPAD" {
+      modifiers = Shift+NumLock;
+      map[None]= Level1;
+      map[Shift]= Level2;
+      map[NumLock]= Level2;
+      map[Shift+NumLock]= Level1;
+      level_name[Level1]= "Base";
+      level_name[Level2]= "Caps";
+};
+</literallayout>
+
+<para>
+The description of the KEYPAD key type is stored in the <emphasis>
+types</emphasis>
+[<emphasis>
+XkbKeypadIndex</emphasis>
+] entry of the client key map.
+</para>
+
+
+</sect3>
+<sect3 id='Initializing_the_Canonical_Key_Types_in_a_New_Client_Map'>
+<title>Initializing the Canonical Key Types in a New Client Map</title>
+
+<para>
+To set the definitions of the canonical key types in a client map to their
+default values, use <emphasis>
+XkbInitCanonicalKeyTypes.</emphasis>
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbInitCanonicalKeyTypes</emphasis>
+(<emphasis>
+xkb, which, keypadVMod</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr            <emphasis>
+xkb</emphasis>
+;            /* keyboard description containing client map to initialize */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+which</emphasis>
+;            /* mask of types to initialize */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int            <emphasis>
+keypadVMod</emphasis>
+;            /* index of NumLock virtual modifier */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbInitCanonicalKeyTypes</emphasis>
+ initializes the first <emphasis>
+XkbNumRequiredTypes</emphasis>
+ key types of the keyboard specified by the <emphasis>
+xkb</emphasis>
+ parameter to their default values. The <emphasis>
+which</emphasis>
+ parameter specifies what canonical key types to initialize and is a bitwise
+inclusive OR of the following masks: <emphasis>
+XkbOneLevelMask</emphasis>
+, <emphasis>
+XkbTwoLevelMask</emphasis>
+, <emphasis>
+XkbAlphabeticMask</emphasis>
+, and <emphasis>
+XkbKeypadMask</emphasis>
+. Only those canonical types specified by the <emphasis>
+which</emphasis>
+ mask are initialized.
+</para>
+
+
+<para>
+If <emphasis>
+XkbKeypadMask</emphasis>
+ is set in the <emphasis>
+which</emphasis>
+ parameter, <emphasis>
+XkbInitCanonicalKeyTypes</emphasis>
+ looks up the <emphasis>
+NumLock</emphasis>
+ named virtual modifier to determine which virtual modifier to use when
+initializing the KEYPAD key type. If the <emphasis>
+NumLock</emphasis>
+ virtual modifier does not exist, <emphasis>
+XkbInitCanonicalKeyTypes</emphasis>
+ creates it.
+</para>
+
+
+<para>
+<emphasis>
+XkbInitCanonicalKeyTypes</emphasis>
+ normally returns Success. It returns <emphasis>
+BadAccess</emphasis>
+ if the Xkb extension has not been properly initialized, and <emphasis>
+BadAccess</emphasis>
+ if the <emphasis>
+xkb</emphasis>
+ parameter is not valid.
+</para>
+
+
+
+</sect3>
+</sect2>
+<sect2 id='Getting_Key_Types_from_the_Server'>
+<title>Getting Key Types from the Server</title>
+
+<para>
+To obtain the list of available key types in the server’s keyboard mapping,
+use <emphasis>
+XkbGetKeyTypes</emphasis>
+.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbGetKeyTypes</emphasis>
+(<emphasis>
+dpy</emphasis>
+,<emphasis>
+ first</emphasis>
+,<emphasis>
+ num</emphasis>
+,<emphasis>
+ xkb</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *<emphasis>
+            dpy</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+            first</emphasis>
+;            /* index to first type to get, 0 =&gt; 1st type */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+num</emphasis>
+;            /* number of key types to be returned */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr             <emphasis>
+xkb</emphasis>
+;            /* keyboard description containing client map to update */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+<note><para><emphasis>
+XkbGetKeyTypes</emphasis>
+ is used to obtain descriptions of the key types themselves, not the key types
+bound to individual keys. To obtain the key types bound to an individual key,
+refer to the <emphasis>
+key_sym_map</emphasis>
+ field of the client map (see section 15.3.1).</para></note>
+
+<para>
+<emphasis>
+XkbGetKeyTypes</emphasis>
+ queries the server for the desired types, waits for a reply, and returns the
+desired types in the <emphasis>
+xkb-&gt;map-&gt;types</emphasis>
+. If successful, it returns Success.
+</para>
+
+
+<para>
+<emphasis>
+XkbGetKeyTypes</emphasis>
+ returns <emphasis>
+BadAccess</emphasis>
+ if the Xkb extension has not been properly initialized and <emphasis>
+BadValue</emphasis>
+ if the combination of <emphasis>
+first</emphasis>
+ and <emphasis>
+num</emphasis>
+ results in numbers out of valid range.
+</para>
+
+
+</sect2>
+<sect2 id='Changing_the_Number_of_Levels_in_a_Key_Type'>
+<title>Changing the Number of Levels in a Key Type</title>
+
+<para>
+To change the number of levels in a key type, use <emphasis>
+XkbResizeKeyType</emphasis>
+.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbResizeKeyType</emphasis>
+(<emphasis>
+xkb</emphasis>
+,<emphasis>
+ type_ndx</emphasis>
+,<emphasis>
+ map_count</emphasis>
+,<emphasis>
+ want_preserve</emphasis>
+,<emphasis>
+ new_num_lvls</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr<emphasis>
+            xkb</emphasis>
+;            /* keyboard description containing client map to update */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int <emphasis>
+            type_ndx</emphasis>
+;            /* index in xkb-&gt;map-&gt;types of type to change */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int             <emphasis>
+map_count</emphasis>
+;            /* total # of map entries needed for the type */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool             <emphasis>
+want_preserve</emphasis>
+;            /* <emphasis>
+True</emphasis>
+ =&gt; list of preserved modifiers is necessary */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int <emphasis>
+            new_num_lvls</emphasis>
+;            /* new max # of levels for type */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbResizeKeyType</emphasis>
+ changes the type specified by <emphasis>
+xkb</emphasis>
+-&gt;<emphasis>
+map-&gt;types</emphasis>
+[<emphasis>
+type_ndx</emphasis>
+], and reallocates the symbols and actions bound to all keys that use the type,
+if necessary. <emphasis>
+XkbResizeKeyType</emphasis>
+ updates only the local copy of the types in <emphasis>
+xkb</emphasis>
+; to update the server’s copy for the physical device, use <emphasis>
+XkbSetMap</emphasis>
+ or <emphasis>
+XkbChangeMap</emphasis>
+ after calling <emphasis>
+XkbResizeKeyType</emphasis>
+.
+</para>
+
+
+<para>
+The <emphasis>
+map_count</emphasis>
+ parameter specifies the total number of map entries needed for the type, and
+can be zero or greater. If <emphasis>
+map_count</emphasis>
+ is zero, <emphasis>
+XkbResizeKeyType</emphasis>
+ frees the existing <emphasis>
+map</emphasis>
+ and <emphasis>
+preserve</emphasis>
+ entries for the type if they exist and sets them to <emphasis>
+NULL</emphasis>
+.
+</para>
+
+
+<para>
+The <emphasis>
+want_preserve</emphasis>
+ parameter specifies whether a <emphasis>
+preserve</emphasis>
+ list for the key should be created. If <emphasis>
+want_preserve</emphasis>
+ is <emphasis>
+True</emphasis>
+, the <emphasis>
+preserve</emphasis>
+ list with <emphasis>
+map_count</emphasis>
+ entries is allocated or reallocated if it already exists. Otherwise, if
+<emphasis>
+want_preserve</emphasis>
+ is <emphasis>
+False</emphasis>
+, the <emphasis>
+preserve</emphasis>
+ field is freed if necessary and set to <emphasis>
+NULL</emphasis>
+.
+</para>
+
+
+<para>
+The <emphasis>
+new_num_lvls</emphasis>
+ parameter specifies the new maximum number of shift levels for the type and is
+used to calculate and resize the symbols and actions bound to all keys that use
+the type.
+</para>
+
+
+<para>
+If <emphasis>
+type_ndx</emphasis>
+ does not specify a legal type, <emphasis>
+new_num_lvls</emphasis>
+ is less than 1, or the <emphasis>
+map_count</emphasis>
+ is less than zero, <emphasis>
+XkbResizeKeyType</emphasis>
+ returns <emphasis>
+BadValue</emphasis>
+. If <emphasis>
+XkbResizeKeyType</emphasis>
+ encounters any problems with allocation, it returns <emphasis>
+BadAlloc</emphasis>
+. Otherwise, it returns <emphasis>
+Success</emphasis>
+.
+</para>
+
+
+</sect2>
+<sect2 id='Copying_Key_Types'>
+<title>Copying Key Types</title>
+
+<para>
+Use <emphasis>
+XkbCopyKeyType</emphasis>
+ and <emphasis>
+XkbCopyKeyTypes</emphasis>
+ to copy one or more <emphasis>
+XkbKeyTypeRec</emphasis>
+ structures.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbCopyKeyType</emphasis>
+(<emphasis>
+from</emphasis>
+,<emphasis>
+ into</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbKeyTypePtr <emphasis>
+            from</emphasis>
+;            /* pointer to XkbKeyTypeRec to be copied */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbKeyTypePtr <emphasis>
+            into</emphasis>
+;            /* pointer to XkbKeyTypeRec to be changed */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbCopyKeyType</emphasis>
+ copies the key type specified by <emphasis>
+from</emphasis>
+ to the key type specified by <emphasis>
+into</emphasis>
+. Both must point to legal <emphasis>
+XkbKeyTypeRec</emphasis>
+ structures. Xkb assumes <emphasis>
+from</emphasis>
+ and <emphasis>
+into</emphasis>
+ point to different places. As a result, overlaps can be fatal. <emphasis>
+XkbCopyKeyType</emphasis>
+ frees any existing <emphasis>
+map</emphasis>
+, <emphasis>
+preserve</emphasis>
+, and <emphasis>
+level_names</emphasis>
+ in <emphasis>
+into</emphasis>
+ prior to copying. If any allocation errors occur while copying <emphasis>
+from</emphasis>
+ to <emphasis>
+into</emphasis>
+, <emphasis>
+XkbCopyKeyType</emphasis>
+ returns <emphasis>
+BadAlloc</emphasis>
+. Otherwise, <emphasis>
+XkbCopyKeyType</emphasis>
+ copies <emphasis>
+from</emphasis>
+ to <emphasis>
+into</emphasis>
+ and returns <emphasis>
+Success</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbCopyKeyTypes</emphasis>
+(<emphasis>
+from</emphasis>
+,<emphasis>
+ into</emphasis>
+, <emphasis>
+num_types</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbKeyTypePtr <emphasis>
+            from</emphasis>
+;            /* pointer to array of XkbKeyTypeRecs to copy */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbKeyTypePtr <emphasis>
+            into</emphasis>
+;            /* pointer to array of XkbKeyTypeRecs to change */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int <emphasis>
+            num_types</emphasis>
+;            /* number of types to copy */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbCopyKeyTypes</emphasis>
+ copies <emphasis>
+num_types</emphasis>
+ <emphasis>
+XkbKeyTypeRec</emphasis>
+ structures from the array specified by <emphasis>
+from</emphasis>
+ into the array specified by <emphasis>
+into</emphasis>
+. It is intended for copying between, rather than within, keyboard
+descriptions, so it doesn’t check for overlaps. The same rules that apply to
+the <emphasis>
+from</emphasis>
+ and <emphasis>
+into</emphasis>
+ parameters in <emphasis>
+XkbCopyKeyType</emphasis>
+ apply to each entry of the <emphasis>
+from</emphasis>
+ and <emphasis>
+into</emphasis>
+ arrays of <emphasis>
+XkbCopyKeyTypes</emphasis>
+. If any allocation errors occur while copying <emphasis>
+from</emphasis>
+ to <emphasis>
+into</emphasis>
+, <emphasis>
+XkbCopyKeyTypes</emphasis>
+ returns <emphasis>
+BadAlloc</emphasis>
+. Otherwise, <emphasis>
+XkbCopyKeyTypes</emphasis>
+ copies <emphasis>
+from</emphasis>
+ to <emphasis>
+into</emphasis>
+ and returns <emphasis>
+Success</emphasis>
+.
+</para>
+
+
+</sect2>
+</sect1>
+<sect1 id='Key_Symbol_Map'>
+<title>Key Symbol Map</title>
+
+<para>
+The entire list of key symbols for the keyboard mapping is held in the
+<emphasis>
+syms</emphasis>
+ field of the client map. Whereas the core keyboard mapping is a
+two-dimensional array of <emphasis>
+KeySyms</emphasis>
+ whose rows are indexed by keycode, the <emphasis>
+syms</emphasis>
+ field of Xkb is a linear list of <emphasis>
+KeySyms</emphasis>
+ that needs to be indexed uniquely for each key. This section describes the key
+symbol map and the methods for determining the symbols bound to a key.
+</para>
+
+
+<para>
+The reason the <emphasis>
+syms</emphasis>
+ field is a linear list of <emphasis>
+KeySyms</emphasis>
+ is to reduce the memory consumption associated with a keymap; because Xkb
+allows individual keys to have multiple shift levels and a different number of
+groups per key, a single two-dimensional array of <emphasis>
+KeySyms</emphasis>
+ would potentially be very large and sparse. Instead, Xkb provides a small
+two-dimensional array of <emphasis>
+KeySyms</emphasis>
+ for each key. To store all of these individual arrays, Xkb concatenates each
+array together in the <emphasis>
+syms</emphasis>
+ field of the client map.
+</para>
+
+
+<para>
+In order to determine which <emphasis>
+KeySyms</emphasis>
+ in the <emphasis>
+syms</emphasis>
+ field are associated with each keycode, the client map contains an array of
+key symbol mappings, held in the <emphasis>
+key_sym_map</emphasis>
+ field. The <emphasis>
+key_sym_map</emphasis>
+ field is an array of <emphasis>
+XkbSymMapRec</emphasis>
+ structures indexed by keycode. The <emphasis>
+key_sym_map</emphasis>
+ array has <emphasis>
+min_key_code</emphasis>
+ unused entries at the start to allow direct indexing using a keycode. All
+keycodes falling between the minimum and maximum legal keycodes, inclusive,
+have <emphasis>
+key_sym_map</emphasis>
+ arrays, whether or not any key actually yields that code. The <emphasis>
+KeySymMapRec</emphasis>
+ structure is defined as follows:
+</para>
+
+<para><programlisting>
+#define XkbNumKbdGroups            4
+#define XkbMaxKbdGroup            (XkbNumKbdGroups-1)
+</programlisting></para>
+
+<para><programlisting>
+typedef struct {                                   /* map to keysyms for a single keycode */
+      unsigned char     kt_index[XkbNumKbdGroups]; /* key type index for each group */
+      unsigned char     group_info;                /* # of groups and out of range group handling */
+      unsigned char     width;                     /* max # of shift levels for key */
+      unsigned short    offset;                    /* index to keysym table in <emphasis> syms</emphasis> array */
+} <emphasis>XkbSymMapRec</emphasis>, *XkbSymMapPtr;
+</programlisting></para>
+
+<para>
+These fields are described in detail in the following sections.
+</para>
+
+
+<sect2 id='Per_Key_Key_Type_Indices'>
+<title>Per-Key Key Type Indices</title>
+
+<para>
+The <emphasis>
+kt_index</emphasis>
+ array of the <emphasis>
+XkbSymMapRec</emphasis>
+ structure contains the indices of the key types (see section 15.2) for each
+possible group of symbols associated with the key. To obtain the index of a key
+type or the pointer to a key type, Xkb provides the following macros, to access
+the key types:
+</para>
+
+<note><para>The array of key types is of fixed width and is large enough to
+hold key types for the maximum legal number of groups (<emphasis>
+XkbNumKbdGroups</emphasis>
+, currently four); if a key has fewer than <emphasis>
+XkbNumKbdGroups</emphasis>
+ groups, the extra key types are reported but ignored.</para></note>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+int <emphasis>
+XkbKeyTypeIndex</emphasis>
+(<emphasis>
+xkb, keycode, group</emphasis>
+)                              /* macro*/
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr            <emphasis>
+xkb</emphasis>
+;                  /* Xkb description of interest */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+KeyCode            <emphasis>
+keycode</emphasis>
+;                  /* keycode of interest */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int            <emphasis>
+group</emphasis>
+;                  /* group index */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbKeyTypeIndex</emphasis>
+ computes an index into the <emphasis>
+types</emphasis>
+ vector of the client map in <emphasis>
+xkb</emphasis>
+ from the given <emphasis>
+keycode</emphasis>
+ and <emphasis>
+group</emphasis>
+ index.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+XkbKeyTypePtr <emphasis>
+XkbKeyType</emphasis>
+(<emphasis>
+xkb, keycode, group</emphasis>
+)                              /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr            <emphasis>
+xkb</emphasis>
+;                  /* Xkb description of interest */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+KeyCode            <emphasis>
+keycode</emphasis>
+;                  /* keycode of interest */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int            <emphasis>
+group</emphasis>
+;                  /* group index */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbKeyType</emphasis>
+ returns a pointer to the key type in the <emphasis>
+types</emphasis>
+ vector of the client map in <emphasis>
+xkb</emphasis>
+ corresponding to the given <emphasis>
+keycode</emphasis>
+ and <emphasis>
+group</emphasis>
+ index.
+</para>
+
+
+</sect2>
+<sect2 id='Per_Key_Group_Information'>
+<title>Per-Key Group Information</title>
+
+<para>
+The <emphasis>
+group_info</emphasis>
+ field of an <emphasis>
+XkbSymMapRec</emphasis>
+ is an encoded value containing the number of groups of symbols bound to the
+key as well as the specification of the treatment of out-of-range groups. It is
+legal for a key to have zero groups, in which case it also has zero symbols and
+all events from that key yield <emphasis>
+NoSymbol</emphasis>
+. To obtain the number of groups of symbols bound to the key, use <emphasis>
+XkbKeyNumGroups</emphasis>
+. To change the number of groups bound to a key, use <emphasis>
+XkbChangeTypesOfKey</emphasis>
+ (see section 15.3.6). To obtain a mask that determines the treatment of
+out-of-range groups, use <emphasis>
+XkbKeyGroupInfo</emphasis>
+ and <emphasis>
+XkbOutOfRangeGroupInfo</emphasis>
+.
+</para>
+
+
+<para>
+The keyboard controls (see Chapter 10) contain a <emphasis>
+groups_wrap</emphasis>
+ field specifying the handling of illegal groups on a global basis. That is,
+when the user performs an action causing the effective group to go out of the
+legal range, the <emphasis>
+groups_wrap</emphasis>
+ field specifies how to normalize the effective keyboard group to a group that
+is legal for the keyboard as a whole, but there is no guarantee that the
+normalized group will be within the range of legal groups for any individual
+key. The per-key <emphasis>
+group_info</emphasis>
+ field specifies how a key treats a legal effective group if the key does not
+have a type specified for the group of concern. For example, the <emphasis>
+Enter</emphasis>
+ key usually has just one group defined. If the user performs an action causing
+the global keyboard group to change to <emphasis>
+Group2</emphasis>
+, the <emphasis>
+group_info</emphasis>
+ field for the <emphasis>
+Enter</emphasis>
+ key describes how to handle this situation.
+</para>
+
+
+<para>
+Out-of-range groups for individual keys are mapped to a legal group using the
+same options as are used for the overall keyboard group. The particular type of
+mapping used is controlled by the bits set in the <emphasis>
+group_info</emphasis>
+ flag, as shown in Table 15.2. See section 10.7.1 for more details on the
+normalization methods in this table.
+</para>
+
+<table frame='topbot'>
+<title>group_info Range Normalization</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='1.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Bits set in group_info</entry>
+  <entry>Normalization method</entry>
+  </row>
+</thead>
+<tbody>
+  <row>
+    <entry>XkbRedirectIntoRange</entry>
+    <entry>XkbRedirectIntoRange</entry>
+  </row>
+  <row>
+    <entry>XkbClampIntoRange</entry>
+    <entry>XkbClampIntoRange</entry>
+  </row>
+  <row>
+    <entry>none of the above</entry>
+    <entry>XkbWrapIntoRange</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+Xkb provides the following macros to access group information:
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+int <emphasis>
+XkbKeyNumGroups</emphasis>
+(<emphasis>
+xkb, keycode</emphasis>
+)                              /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr            <emphasis>
+xkb</emphasis>
+;                  /* Xkb description of interest */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+KeyCode            <emphasis>
+keycode</emphasis>
+;                  /* keycode of interest */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbKeyNumGroups</emphasis>
+ returns the number of groups of symbols bound to the key corresponding to
+<emphasis>
+keycode</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+unsigned char <emphasis>
+XkbKeyGroupInfo</emphasis>
+(<emphasis>
+xkb, keycode</emphasis>
+)                              /*macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr            <emphasis>
+xkb</emphasis>
+;                  /* Xkb description of interest */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+KeyCode            <emphasis>
+keycode</emphasis>
+;                  /* keycode of interest */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbKeyGroupInfo</emphasis>
+ returns the <emphasis>
+group_info</emphasis>
+ field from the <emphasis>
+XkbSymMapRec</emphasis>
+ structure associated with the key corresponding to <emphasis>
+keycode</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+unsigned char <emphasis>
+XkbOutOfRangeGroupInfo</emphasis>
+(<emphasis>
+grp_inf</emphasis>
+)                              /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned char            <emphasis>
+grp_inf</emphasis>
+;                  /* group_info field of <emphasis>
+XkbSymMapRec</emphasis>
+ */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbOutOfRangeGroupInfo</emphasis>
+ returns only the out-of-range processing information from the <emphasis>
+group_info</emphasis>
+ field of an <emphasis>
+XkbSymMapRec</emphasis>
+ structure.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+unsigned char <emphasis>
+XkbOutOfRangeGroupNumber</emphasis>
+(<emphasis>
+grp_inf</emphasis>
+)                              /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned char            <emphasis>
+grp_inf</emphasis>
+;                  /* group_info field of <emphasis>
+XkbSymMapRec</emphasis>
+ */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbOutOfRangeGroupNumber</emphasis>
+ returns the out-of-range group number, represented as a group index, from the
+<emphasis>
+group_info</emphasis>
+ field of an <emphasis>
+XkbSymMapRec</emphasis>
+ structure.
+</para>
+
+
+</sect2>
+<sect2 id='Key_Width'>
+<title>Key Width</title>
+
+<para>
+The maximum number of shift levels for a type is also referred to as the width
+of a key type. The <emphasis>
+width</emphasis>
+ field of the <emphasis>
+key_sym_map</emphasis>
+ entry for a key contains the width of the widest type associated with the key.
+The <emphasis>
+width </emphasis>
+field cannot be explicitly changed; it is updated automatically whenever the
+symbols or set of types bound to a key are changed.
+</para>
+
+
+</sect2>
+<sect2 id='Offset_in_to_the_Symbol_Map'>
+<title>Offset in to the Symbol Map</title>
+
+<para>
+The key width and number of groups associated with a key are used to form a
+small two-dimensional array of <emphasis>
+KeySyms</emphasis>
+ for a key. This array may be different sizes for different keys. The array for
+a single key is stored as a linear list, in row-major order. The arrays for all
+of the keys are stored in the <emphasis>
+syms</emphasis>
+ field of the client map. There is one row for each group associated with a key
+and one column for each level. The index corresponding to a given group and
+shift level is computed as:
+</para>
+
+<literallayout>
+     idx = group_index * key_width + shift_level
+</literallayout>
+
+<para>
+The <emphasis>
+offset</emphasis>
+ field of the <emphasis>
+key_sym_map</emphasis>
+ entry for a key is used to access the beginning of the array.
+</para>
+
+
+<para>
+Xkb provides the following macros for accessing the <emphasis>
+width</emphasis>
+ and <emphasis>
+offset</emphasis>
+ for individual keys, as well as macros for accessing the two-dimensional array
+of symbols bound to the key:
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+int <emphasis>
+XkbKeyGroupsWidth</emphasis>
+(<emphasis>
+xkb, keycode</emphasis>
+)                              /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr            <emphasis>
+xkb</emphasis>
+;                  /* Xkb description of interest */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+KeyCode            <emphasis>
+keycode</emphasis>
+;                  /* keycode of interest */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbKeyGroupsWidth</emphasis>
+ computes the maximum width associated with the key corresponding to <emphasis>
+keycode</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+int <emphasis>
+XkbKeyGroupWidth</emphasis>
+(<emphasis>
+xkb, keycode, grp</emphasis>
+)                              /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr            <emphasis>
+xkb</emphasis>
+;                  /* Xkb description of interest */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+KeyCode            <emphasis>
+keycode</emphasis>
+;                  /* keycode of interest */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int            <emphasis>
+grp</emphasis>
+;                  /* group of interest */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbKeyGroupWidth</emphasis>
+ computes the width of the type associated with the group <emphasis>
+grp</emphasis>
+ for the key corresponding to <emphasis>
+keycode</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+int <emphasis>
+XkbKeySymsOffset</emphasis>
+(<emphasis>
+xkb, keycode</emphasis>
+)                              /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr            <emphasis>
+xkb</emphasis>
+;                  /* Xkb description of interest */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+KeyCode            <emphasis>
+keycode</emphasis>
+;                  /* keycode of interest */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbKeySymsOffset</emphasis>
+ returns the offset of the two-dimensional array of keysyms for the key
+corresponding to <emphasis>
+keycode</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+int <emphasis>
+XkbKeyNumSyms</emphasis>
+(<emphasis>
+xkb, keycode</emphasis>
+)                              /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr            <emphasis>
+xkb</emphasis>
+;                  /* Xkb description of interest */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+KeyCode            <emphasis>
+keycode</emphasis>
+;                  /* keycode of interest */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbKeyNumSyms</emphasis>
+ returns the total number of keysyms for the key corresponding to <emphasis>
+keycode</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+KeySym * <emphasis>
+XkbKeySymsPtr</emphasis>
+(<emphasis>
+xkb, keycode</emphasis>
+)                              /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr            <emphasis>
+xkb</emphasis>
+;                  /* Xkb description of interest */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+KeyCode            <emphasis>
+keycode</emphasis>
+;                  /* keycode of interest */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbKeySymsPtr</emphasis>
+ returns the pointer to the two-dimensional array of keysyms for the key
+corresponding to <emphasis>
+keycode</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+KeySym <emphasis>
+XkbKeySymEntry</emphasis>
+(<emphasis>
+xkb, keycode, shift, grp</emphasis>
+)                              /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr            <emphasis>
+xkb</emphasis>
+;                  /* Xkb description of interest */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+KeyCode            <emphasis>
+keycode</emphasis>
+;                  /* keycode of interest */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int            <emphasis>
+shift</emphasis>
+;                  /* shift level of interest */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int            <emphasis>
+grp</emphasis>
+;                  /* group of interest */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbKeySymEntry</emphasis>
+ returns the <emphasis>
+keysym</emphasis>
+ corresponding to shift level <emphasis>
+shift</emphasis>
+ and group <emphasis>
+grp</emphasis>
+ from the two-dimensional array of keysyms for the key corresponding to
+<emphasis>
+keycode</emphasis>
+</para>
+
+
+</sect2>
+<sect2 id='Getting_the_Symbol_Map_for_Keys_from_the_Server'>
+<title>Getting the Symbol Map for Keys from the Server</title>
+
+<para>
+To obtain the symbols for a subset of the keys in a keyboard description, use
+<emphasis>
+XkbGetKeySyms</emphasis>
+:
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbGetKeySyms</emphasis>
+(<emphasis>
+dpy</emphasis>
+,<emphasis>
+ first</emphasis>
+, <emphasis>
+num</emphasis>
+,<emphasis>
+ xkb</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *<emphasis>
+            dpy</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+            first</emphasis>
+;            /* keycode of first key to get */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+      num</emphasis>
+;            /* number of keycodes for which syms desired */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr             <emphasis>
+xkb</emphasis>
+;            /* Xkb description to be updated */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetKeySyms</emphasis>
+ sends a request to the server to obtain the set of keysyms bound to <emphasis>
+num</emphasis>
+ keys starting with the key whose keycode is <emphasis>
+first</emphasis>
+. It waits for a reply and returns the keysyms in the <emphasis>
+map.syms</emphasis>
+ field of <emphasis>
+xkb</emphasis>
+. If successful, <emphasis>
+XkbGetKeySyms</emphasis>
+ returns <emphasis>
+Success</emphasis>
+. The <emphasis>
+xkb</emphasis>
+ parameter must be a pointer to a valid Xkb keyboard description.
+</para>
+
+
+<para>
+If the client <emphasis>
+map</emphasis>
+ in the <emphasis>
+xkb</emphasis>
+ parameter has not been allocated, <emphasis>
+XkbGetKeySyms</emphasis>
+ allocates and initializes it before obtaining the symbols.
+</para>
+
+
+<para>
+If a compatible version of Xkb is not available in the server or the Xkb
+extension has not been properly initialized, <emphasis>
+XkbGetKeySyms</emphasis>
+ returns <emphasis>
+BadAccess</emphasis>
+. If <emphasis>
+num</emphasis>
+ is less than 1 or greater than <emphasis>
+XkbMaxKeyCount</emphasis>
+, <emphasis>
+XkbGetKeySyms</emphasis>
+ returns <emphasis>
+BadValue</emphasis>
+. If any allocation errors occur, <emphasis>
+XkbGetKeySyms</emphasis>
+ returns <emphasis>
+BadAlloc</emphasis>
+.
+</para>
+
+
+</sect2>
+<sect2 id='Changing_the_Number_of_Groups_and_Types_Bound_to_a_Key'>
+<title>Changing the Number of Groups and Types Bound to a Key</title>
+
+<para>
+To change the number of groups and the types bound to a key, use <emphasis>
+XkbChangeTypesOfKey</emphasis>
+.
+</para>
+
+
+<para>
+Status <emphasis>
+XkbChangeTypesOfKey</emphasis>
+(<emphasis>
+xkb</emphasis>
+,<emphasis>
+ key</emphasis>
+,<emphasis>
+ n_groups</emphasis>
+,<emphasis>
+ groups</emphasis>
+,<emphasis>
+ new_types_in</emphasis>
+,<emphasis>
+ p_changes</emphasis>
+)
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr <emphasis>
+            xkb</emphasis>
+;            /* keyboard description to be changed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int <emphasis>
+            key</emphasis>
+;            /* keycode for key of interest */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int <emphasis>
+            n_groups</emphasis>
+;            /* new number of groups for key */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+groups</emphasis>
+;            /* mask indicating groups to change */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int *            <emphasis>
+new_types_in</emphasis>
+;            /* indices for new groups specified in <emphasis>
+groups</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbMapChangesPtr            <emphasis>
+p_changes</emphasis>
+;            /* notes changes made to <emphasis>
+xkb</emphasis>
+ */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbChangeTypesOfKey</emphasis>
+ reallocates the symbols and actions bound to the key, if necessary, and
+initializes any new symbols or actions to <emphasis>
+NoSymbol</emphasis>
+ or <emphasis>
+NoAction</emphasis>
+, as appropriate. If the <emphasis>
+p_changes</emphasis>
+ parameter is not <emphasis>
+NULL</emphasis>
+, <emphasis>
+XkbChangeTypesOfKey</emphasis>
+ adds the <emphasis>
+XkbKeySymsMask</emphasis>
+ to the <emphasis>
+changes</emphasis>
+ field of <emphasis>
+p_changes</emphasis>
+ and modifies the <emphasis>
+first_key_sym</emphasis>
+ and <emphasis>
+num_key_syms</emphasis>
+ fields of <emphasis>
+p_changes</emphasis>
+ to include the <emphasis>
+key</emphasis>
+ that was changed. See section 14.3.1 for more information on the <emphasis>
+XkbMapChangesPtr</emphasis>
+ structure. If successful, <emphasis>
+XkbChangeTypesOfKey</emphasis>
+ returns <emphasis>
+Success</emphasis>
+.
+</para>
+
+
+<para>
+The <emphasis>
+n_groups</emphasis>
+ parameter specifies the new number of groups for the key. The <emphasis>
+groups</emphasis>
+ parameter is a mask specifying the groups for which new types are supplied and
+is a bitwise inclusive OR of the following masks: <emphasis>
+XkbGroup1Mask</emphasis>
+, <emphasis>
+XkbGroup2Mask</emphasis>
+, <emphasis>
+XkbGroup3Mask</emphasis>
+, and <emphasis>
+XkbGroup4Mask</emphasis>
+.
+</para>
+
+
+<para>
+The <emphasis>
+new_types_in</emphasis>
+ parameter is an integer array of length <emphasis>
+n_groups</emphasis>
+. Each entry represents the type to use for the associated group and is an
+index into <emphasis>
+xkb</emphasis>
+-&gt;<emphasis>
+map-&gt;types</emphasis>
+. The <emphasis>
+new_types_in</emphasis>
+ array is indexed by group index; if <emphasis>
+n_groups</emphasis>
+ is four and <emphasis>
+groups</emphasis>
+ only has <emphasis>
+Group1Mask</emphasis>
+ and <emphasis>
+Group3Mask</emphasis>
+ set, <emphasis>
+new_types_in</emphasis>
+ looks like this:
+</para>
+
+<literallayout>
+     new_types_in[0] = type for Group1
+     new_types_in[1] = ignored
+     new_types_in[2] = type for Group3
+     new_types_in[3] = ignored
+</literallayout>
+
+<para>
+For convenience, Xkb provides the following constants to use as indices to the
+groups:
+</para>
+
+<table frame='topbot'>
+<title>Group Index Constants</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='1.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Constant Name</entry>
+  <entry>Value</entry>
+  </row>
+</thead>
+<tbody>
+  <row>
+    <entry>XkbGroup1Index</entry>
+    <entry>0</entry>
+  </row>
+  <row>
+    <entry>XkbGroup2Index</entry>
+    <entry>1</entry>
+  </row>
+  <row>
+    <entry>XkbGroup3Index</entry>
+    <entry>2</entry>
+  </row>
+  <row>
+    <entry>XkbGroup4Index</entry>
+    <entry>3</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+If the Xkb extension has not been properly initialized, <emphasis>
+XkbChangeTypesOfKey</emphasis>
+ returns <emphasis>
+BadAccess</emphasis>
+. If the <emphasis>
+xkb</emphasis>
+ parameter it not valid (that is, it is <emphasis>
+NULL</emphasis>
+ or it does not contain a valid client map), <emphasis>
+XkbChangeTypesOfKey</emphasis>
+ returns <emphasis>
+Bad</emphasis>
+Match. If the <emphasis>
+key</emphasis>
+ is not a valid keycode, <emphasis>
+n_groups</emphasis>
+ is greater than <emphasis>
+XkbNumKbdGroups</emphasis>
+, or the <emphasis>
+groups</emphasis>
+ mask does not contain any of the valid group mask bits, <emphasis>
+XkbChangeTypesOfKey</emphasis>
+ returns <emphasis>
+BadValue</emphasis>
+. If it is necessary to resize the key symbols or key actions arrays and any
+allocation errors occur, <emphasis>
+XkbChangeTypesOfKey</emphasis>
+ returns <emphasis>
+BadAlloc</emphasis>
+.
+</para>
+
+
+</sect2>
+<sect2 id='Changing_the_Number_of_Symbols_Bound_to_a_Key'>
+<title>Changing the Number of Symbols Bound to a Key</title>
+
+<para>
+To change the number of symbols bound to a key, use <emphasis>
+XkbResizeKeySyms</emphasis>
+.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+KeySym *<emphasis>
+XkbResizeKeySyms</emphasis>
+(<emphasis>
+xkb</emphasis>
+,<emphasis>
+ key</emphasis>
+,<emphasis>
+ needed</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescRec *<emphasis>
+            xkb</emphasis>
+;            /* keyboard description to be changed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int <emphasis>
+            key</emphasis>
+;            /* keycode for key to modify */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int <emphasis>
+            needed</emphasis>
+;            /* new number of keysyms required for key */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbResizeKeySyms</emphasis>
+ reserves the space needed for <emphasis>
+needed</emphasis>
+ keysyms and returns a pointer to the beginning of the new array that holds the
+keysyms. It adjusts the <emphasis>
+offset</emphasis>
+ field of the <emphasis>
+key_sym_map</emphasis>
+ entry for the key if necessary and can also change the <emphasis>
+syms</emphasis>
+, <emphasis>
+num_syms</emphasis>
+, and <emphasis>
+size_syms</emphasis>
+ fields of <emphasis>
+xkb</emphasis>
+-<emphasis>
+&gt;map</emphasis>
+ if it is necessary to reallocate the <emphasis>
+syms</emphasis>
+ array. <emphasis>
+XkbResizeKeySyms</emphasis>
+ does not modify either the width or number of groups associated with the key.
+</para>
+
+
+<para>
+If <emphasis>
+needed</emphasis>
+ is greater than the current number of keysyms for the key, <emphasis>
+XkbResizeKeySyms</emphasis>
+ initializes all new keysyms in the array to <emphasis>
+NoSymbol</emphasis>
+.
+</para>
+
+
+<para>
+Because the number of symbols needed by a key is normally computed as width *
+number of groups, and <emphasis>
+XkbResizeKeySyms</emphasis>
+ does not modify either the width or number of groups for the key, a
+discrepancy exists upon return from <emphasis>
+XkbResizeKeySyms</emphasis>
+ between the space allocated for the keysyms and the number required. The
+unused entries in the list of symbols returned by <emphasis>
+XkbResizeKeySyms</emphasis>
+ are not preserved across future calls to any of the map editing functions, so
+you must update the key symbol mapping (which updates the width and number of
+groups for the key) before calling another allocator function. A call to
+<emphasis>
+XkbChangeTypesOfKey</emphasis>
+ will update the mapping.
+</para>
+
+
+<para>
+If any allocation errors occur while resizing the number of symbols bound to
+the key, <emphasis>
+XkbResizeKeySyms</emphasis>
+ returns <emphasis>
+NULL</emphasis>
+.
+</para>
+
+<note><para>A change to the number of symbols bound to a key should be
+accompanied by a change in the number of actions bound to a key. Refer to
+section 16.1.16 for more information on changing the number of actions bound to
+a key.</para></note>
+
+
+</sect2>
+</sect1>
+<sect1 id='The_Per_Key_Modifier_Map'>
+<title>The Per-Key Modifier Map</title>
+
+<para>
+The <emphasis>
+modmap</emphasis>
+ entry of the client map is an array, indexed by keycode, specifying the real
+modifiers bound to a key. Each entry is a mask composed of a bitwise inclusive
+OR of the legal real modifiers: <emphasis>
+ShiftMask</emphasis>
+, <emphasis>
+LockMask</emphasis>
+, <emphasis>
+ControlMask</emphasis>
+, <emphasis>
+Mod1Mask</emphasis>
+, <emphasis>
+Mod2Mask</emphasis>
+, <emphasis>
+Mod3Mask</emphasis>
+, <emphasis>
+Mod4Mask</emphasis>
+, and <emphasis>
+Mod5Mask</emphasis>
+. If a bit is set in a <emphasis>
+modmap</emphasis>
+ entry, the corresponding key is bound to that modifier.
+</para>
+
+
+<para>
+Pressing or releasing the key bound to a modifier changes the modifier set and
+unset state. The particular manner in which the modifier set and unset state
+changes is determined by the behavior and actions assigned to the key (see
+Chapter 16).
+</para>
+
+
+<sect2 id='Getting_the_Per_Key_Modifier_Map_from_the_Server'>
+<title>Getting the Per-Key Modifier Map from the Server</title>
+
+<para>
+To update the modifier map for one or more of the keys in a keyboard
+description, use <emphasis>
+XkbGetKeyModifierMap</emphasis>
+.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbGetKeyModifierMap</emphasis>
+(<emphasis>
+dpy</emphasis>
+,<emphasis>
+ first</emphasis>
+,<emphasis>
+ num</emphasis>
+,<emphasis>
+ xkb</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *<emphasis>
+            dpy</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+first</emphasis>
+;            /* keycode of first key to get */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+num</emphasis>
+;            /* number of keys for which information is desired */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr             <emphasis>
+xkb</emphasis>
+;            /* keyboard description to update */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetKeyModifierMap</emphasis>
+ sends a request to the server for the modifier mappings for <emphasis>
+num</emphasis>
+ keys starting with the key whose keycode is <emphasis>
+first</emphasis>
+. It waits for a reply and places the results in the <emphasis>
+xkb</emphasis>
+-&gt;map-&gt;modmap array. If successful, <emphasis>
+XkbGetKeyModifier</emphasis>
+ returns <emphasis>
+Success</emphasis>
+.
+</para>
+
+
+<para>
+If the map component of the <emphasis>
+xkb</emphasis>
+ parameter has not been allocated, <emphasis>
+XkbGetKeyModifierMap</emphasis>
+ allocates and initializes it.
+</para>
+
+
+<para>
+If a compatible version of Xkb is not available in the server or the Xkb
+extension has not been properly initialized, <emphasis>
+XkbGetKeySyms</emphasis>
+ returns <emphasis>
+BadAccess</emphasis>
+. If any allocation errors occur while obtaining the modifier map, <emphasis>
+XkbGetKeyModifierMap</emphasis>
+ returns <emphasis>
+BadAlloc</emphasis>
+.
+</para>
+</sect2>
+</sect1>
+</chapter>
diff --git a/specs/XKB/ch16.xml b/specs/XKB/ch16.xml
new file mode 100644 (file)
index 0000000..2640ea2
--- /dev/null
@@ -0,0 +1,4845 @@
+<chapter id='Xkb_Server_Keyboard_Mapping'>
+<title>Xkb Server Keyboard Mapping</title>
+
+<para>
+The <emphasis>
+server</emphasis>
+ field of the complete Xkb keyboard description (see section 6.1) is a pointer
+to the Xkb server map.
+</para>
+
+
+<para>
+Figure 16.1 shows the relationships between elements in the server map:
+</para>
+
+<mediaobject>
+ <imageobject> <imagedata format="SVG" fileref="XKBlib-16.svg"/>
+ </imageobject>
+<caption>Server Map Relationships</caption>
+ </mediaobject>
+
+
+<!--
+<H5 CLASS="Figure">
+Server Map Relationships</H5>
+-->
+
+<para>
+The Xkb server map contains the information the server needs to interpret key
+events and is of type <emphasis>
+XkbServerMapRec</emphasis>
+:
+</para>
+
+<para><programlisting>
+#define XkbNumVirtualMods            16
+</programlisting></para>
+
+<para><programlisting>
+typedef struct {                         /* Server Map */
+      unsigned short     num_acts;       /* # of occupied entries in <emphasis> acts</emphasis> */
+      unsigned short     size_acts;      /* # of entries in <emphasis> acts</emphasis> */
+      XkbAction *        acts;           /* linear 2d tables of key actions, 1 per keycode */
+      XkbBehavior *      behaviors;      /* key behaviors,1 per keycode */
+      unsigned short *   key_acts;       /* index into <emphasis> acts</emphasis> , 1 per keycode */
+      unsigned char *    explicit;       /* explicit overrides of core remapping, 1 per key */
+      unsigned char      vmods[XkbNumVirtualMods];  /* real mods bound to virtual mods */
+      unsigned short *   vmodmap;        /* virtual mods bound to key, 1 per keycode*/
+} <emphasis>XkbServerMapRec</emphasis>, *XkbServerMapPtr;
+</programlisting></para>
+
+<para>
+The <emphasis>
+num_acts</emphasis>
+, <emphasis>
+size_acts</emphasis>
+, <emphasis>
+acts</emphasis>
+, and <emphasis>
+key_acts</emphasis>
+ fields specify the key actions, defined in section 16.1. The <emphasis>
+behaviors</emphasis>
+ field describes the behavior for each key and is defined in section 16.2. The
+<emphasis>
+explicit</emphasis>
+ field describes the explicit components for a key and is defined in section
+16.3. The <emphasis>
+vmods</emphasis>
+ and the <emphasis>
+vmodmap</emphasis>
+ fields describe the virtual modifiers and the per-key virtual modifier mapping
+and are defined in section 16.4.
+</para>
+
+<sect1 id='Key_Actions'>
+<title>Key Actions</title>
+
+<para>
+A key action defines the effect key presses and releases have on the internal
+state of the server. For example, the expected key action associated with
+pressing the <emphasis>
+Shift</emphasis>
+ key is to set the <emphasis>
+Shift</emphasis>
+ modifier. There is zero or one key action associated with each keysym bound to
+each key.
+</para>
+
+
+<para>
+Just as the entire list of key symbols for the keyboard mapping is held in the
+<emphasis>
+syms</emphasis>
+ field of the client map, the entire list of key actions for the keyboard
+mapping is held in the <emphasis>
+acts</emphasis>
+ array of the server map. The total size of <emphasis>
+acts</emphasis>
+ is specified by <emphasis>
+size_acts</emphasis>
+, and the number of entries is specified by <emphasis>
+num_acts</emphasis>.
+</para>
+
+
+<para>
+The <emphasis>
+key_acts</emphasis>
+ array, indexed by keycode, describes the actions associated with a key. The
+<emphasis>
+key_acts</emphasis>
+ array has <emphasis>
+min_key_code</emphasis>
+ unused entries at the start to allow direct indexing using a keycode. If a
+<emphasis>
+key_acts</emphasis>
+ entry is <emphasis>
+zero</emphasis>
+, it means the key does not have any actions associated with it. If an entry is
+not <emphasis>
+zero</emphasis>
+, the entry represents an index into the <emphasis>
+acts</emphasis>
+ field of the server map, much as the <emphasis>
+offset</emphasis>
+ field of a <emphasis>
+KeySymMapRec</emphasis>
+ structure is an index into the <emphasis>
+syms</emphasis>
+ field of the client map.
+</para>
+
+<para>
+The reason the <emphasis>
+acts</emphasis>
+ field is a linear list of <emphasis>
+XkbAction</emphasis>
+s is to reduce the memory consumption associated with a keymap. Because Xkb
+allows individual keys to have multiple shift levels and a different number of
+groups per key, a single two-dimensional array of <emphasis>
+KeySyms</emphasis>
+ would potentially be very large and sparse. Instead, Xkb provides a small
+two-dimensional array of <emphasis>
+XkbAction</emphasis>
+s for each key. To store all of these individual arrays, Xkb concatenates each
+array together in the <emphasis>
+acts</emphasis>
+ field of the server map.
+</para>
+
+
+<para>
+The key action structures consist only of fields of type char or unsigned char.
+This is done to optimize data transfer when the server sends bytes over the
+wire. If the fields are anything but bytes, the server has to sift through all
+of the actions and swap any nonbyte fields. Because they consist of nothing but
+bytes, it can just copy them out.
+</para>
+
+
+<para>
+Xkb provides the following macros, to simplify accessing information pertaining
+to key actions:
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbKeyHasActions</emphasis>
+(<emphasis>
+xkb, keycode</emphasis>
+)                              /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr            <emphasis>
+xkb</emphasis>
+;                  /* Xkb description of interest */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+KeyCode            <emphasis>
+keycode</emphasis>
+;                  /* keycode of interest */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbKeyHasActions</emphasis>
+ returns <emphasis>
+True</emphasis>
+ if the key corresponding to <emphasis>
+keycode</emphasis>
+ has any actions associated with it; otherwise, it returns <emphasis>
+False</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+int <emphasis>
+XkbKeyNumActions</emphasis>
+(<emphasis>
+xkb, keycode</emphasis>
+)                              /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr            <emphasis>
+xkb</emphasis>
+;                  /* Xkb description of interest */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+KeyCode            <emphasis>
+keycode</emphasis>
+;                  /* keycode of interest */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbKeyNumActions</emphasis>
+ computes the number of actions associated with the key corresponding to
+<emphasis>
+keycode</emphasis>
+. This should be the same value as the result of <emphasis>
+XkbKeyNumSyms</emphasis>
+ (see section 15.3.3).
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+XkbKeyActionPtr <emphasis>
+XkbKeyActionsPtr</emphasis>
+(<emphasis>
+xkb, keycode</emphasis>
+)                              /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr            <emphasis>
+xkb</emphasis>
+;                  /* Xkb description of interest */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+KeyCode            <emphasis>
+keycode</emphasis>
+;                  /* keycode of interest */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbKeyActionsPtr</emphasis>
+ returns a pointer to the two-dimensional array of key actions associated with
+the key corresponding to <emphasis>
+keycode</emphasis>
+. Use<emphasis>
+ XkbKeyActionsPtr</emphasis>
+ only if the key actually has some actions associated with it, that is,
+<emphasis>
+XkbKeyNumActions</emphasis>
+(xkb, keycode) returns something greater than zero.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+XkbAction <emphasis>
+XkbKeyAction</emphasis>
+(<emphasis>
+xkb, keycode, idx</emphasis>
+)                              /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr            <emphasis>
+xkb</emphasis>
+;                  /* Xkb description of interest */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+KeyCode            <emphasis>
+keycode</emphasis>
+;                  /* keycode of interest */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int            <emphasis>
+idx</emphasis>
+;                  /* index for group and shift level */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbKeyAction</emphasis>
+ returns the key action indexed by <emphasis>
+idx</emphasis>
+ in the two-dimensional array of key actions associated with the key
+corresponding to <emphasis>
+keycode</emphasis>
+. <emphasis>
+idx</emphasis>
+ may be computed from the group and shift level of interest as follows:
+</para>
+
+<literallayout>
+     idx = group_index * key_width + shift_level
+</literallayout>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+XkbAction <emphasis>
+XkbKeyActionEntry</emphasis>
+(<emphasis>
+xkb, keycode, shift, grp</emphasis>
+)                              /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr            <emphasis>
+xkb</emphasis>
+;                  /* Xkb description of interest */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+KeyCode            <emphasis>
+keycode</emphasis>
+;                  /* keycode of interest */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int            <emphasis>
+shift</emphasis>
+;                  /* shift level within group */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int            <emphasis>
+grp</emphasis>
+;                  /* group index for group of interest */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbKeyActionEntry</emphasis>
+ returns the key action corresponding to group <emphasis>
+grp</emphasis>
+ and shift level <emphasis>
+lvl</emphasis>
+ from the two-dimensional table of key actions associated with the key
+corresponding to <emphasis>
+keycode</emphasis>
+.
+</para>
+
+
+<sect2 id='The_XkbAction_Structure'>
+<title>The XkbAction Structure</title>
+
+<para>
+The description for an action is held in an <emphasis>
+XkbAction</emphasis>
+ structure, which is a union of all possible Xkb action types:
+</para>
+
+<para><programlisting>
+typedef union _XkbAction {
+      XkbAnyAction              any;
+      XkbModAction              mods;
+      XkbGroupAction            group;
+      XkbISOAction              iso;
+      XkbPtrAction              ptr;
+      XkbPtrBtnAction           btn;
+      XkbPtrDfltAction          dflt;
+      XkbSwitchScreenAction     screen;
+      XkbCtrlsAction            ctrls;
+      XkbMessageAction          msg;
+      XkbRedirectKeyAction      redirect;
+      XkbDeviceBtnAction        devbtn;
+      XkbDeviceValuatorAction   devval;
+      unsigned char             type;
+} <emphasis>XkbAction</emphasis>;
+</programlisting></para>
+
+<para>
+The <emphasis>
+type</emphasis>
+ field is provided for convenience and is the same as the type field in the
+individual structures. The following sections describe the individual
+structures for each action in detail.
+</para>
+
+
+</sect2>
+<sect2 id='The_XkbAnyAction_Structure'>
+<title>The XkbAnyAction Structure</title>
+
+<para>
+The <emphasis>
+XkbAnyAction</emphasis>
+ structure is a convenience structure that refers to any of the actions:
+</para>
+
+<para><programlisting>
+#define      XkbAnyActionDataSize       7
+</programlisting></para>
+
+<para><programlisting>
+typedef struct _XkbAnyAction {
+   unsigned char    type;            /* type of action; determines interpretation for data */
+   unsigned char    data[XkbAnyActionDataSize];
+} <emphasis>XkbAnyAction</emphasis>;
+</programlisting></para>
+
+<para>
+The <emphasis>
+data</emphasis>
+ field represents a structure for an action, and its interpretation depends on
+the <emphasis>
+type</emphasis>
+ field. The valid values for the <emphasis>
+type</emphasis>
+ field, and the data structures associated with them are shown in Table 16.1:
+</para>
+
+<table frame='topbot'>
+<title>Action Types</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='4' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.8*'/>
+<colspec colname='c2' colwidth='2.0*'/>
+<colspec colname='c3' colwidth='1.5*'/>
+<colspec colname='c4' colwidth='1.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Type</entry>
+  <entry>Structure for Data</entry>
+  <entry>XkbAction Union Member</entry>
+  <entry>Section</entry>
+</row>
+</thead>
+<tbody>
+  <row>
+    <entry><emphasis>XkbSA_NoAction</emphasis></entry>
+    <entry>
+<emphasis>XkbSA_NoAction</emphasis>
+ means the server does not perform an action for the key; this action does not
+have an associated data structure.
+    </entry>
+    <entry>any</entry>
+    <entry></entry>
+  </row>
+  <row>
+    <entry>
+<para><emphasis>XkbSA_SetMods</emphasis></para>
+<para><emphasis>XkbSA_LatchMods</emphasis></para>
+<para><emphasis>XkbSA_LockMods</emphasis></para>
+    </entry>
+    <entry><para><emphasis>XkbModAction</emphasis></para></entry>
+    <entry>mods</entry>
+    <entry>16.1.3</entry>
+  </row>
+  <row>
+    <entry>
+<para><emphasis>XkbSA_SetGroup</emphasis></para>
+<para><emphasis>XkbSA_LatchGroup</emphasis></para>
+<para><emphasis>XkbSA_LockGroup</emphasis></para>
+    </entry>
+    <entry><emphasis>XkbGroupAction</emphasis></entry>
+    <entry>group</entry>
+    <entry>16.1.4</entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_MovePtr</emphasis></entry>
+    <entry><emphasis>XkbPtrAction</emphasis></entry>
+    <entry>ptr</entry>
+    <entry>16.1.5</entry>
+  </row>
+  <row>
+    <entry>
+<para><emphasis>XKbSA_PtrBtn</emphasis></para>
+<para><emphasis>XkbSA_LockPtrBtn</emphasis></para>
+    </entry>
+    <entry><emphasis>XkbPtrBtnAction</emphasis></entry><entry>btn</entry>
+    <entry>16.1.6</entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_SetPtrDflt</emphasis></entry>
+    <entry><emphasis>XkbPtrDfltAction</emphasis></entry>
+    <entry>dflt</entry>
+    <entry>16.1.7</entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_ISOLock</emphasis></entry>
+    <entry><emphasis>XkbISOAction</emphasis></entry>
+    <entry>iso</entry>
+    <entry>16.1.8</entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_SwitchScreen</emphasis></entry>
+    <entry><emphasis>XkbSwitchScreenAction</emphasis></entry>
+    <entry>screen</entry>
+    <entry>16.1.9</entry>
+  </row>
+  <row>
+    <entry>
+<para><emphasis>XkbSA_SetControls</emphasis></para>
+<para><emphasis>XkbSA_LockControls</emphasis></para>
+    </entry>
+    <entry><emphasis>XkbCtrlsAction</emphasis></entry>
+    <entry>ctrls</entry>
+    <entry>16.1.10</entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_ActionMessage</emphasis></entry>
+    <entry><emphasis>XkbMessgeAction</emphasis></entry>
+    <entry>msg</entry>
+    <entry>16.1.11</entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_RedirectKey</emphasis></entry>
+    <entry><emphasis>XkbRedirectKeyAction</emphasis></entry>
+    <entry>redirect</entry>
+    <entry>16.1.12</entry>
+  </row>
+  <row>
+    <entry>
+<para><emphasis>XkbSA_DeviceBtn</emphasis></para>
+<para><emphasis>XKbSA_LockDeviceBtn</emphasis></para>
+    </entry>
+    <entry><emphasis>XkbDeviceBtnAction</emphasis></entry>
+    <entry>devbtn</entry>
+    <entry>16.1.13</entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_DeviceValuator</emphasis></entry>
+    <entry><emphasis>XkbDeviceValuatorAction</emphasis></entry>
+    <entry>devval</entry>
+    <entry>16.1.14</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+</sect2>
+<sect2 id='Actions_for_Changing_Modifiers_State'>
+<title>Actions for Changing Modifiers’ State</title>
+
+<para>
+Actions associated with the <emphasis>
+XkbModAction</emphasis>
+ structure change the state of the modifiers when keys are pressed and released
+(see Chapter 7 for a discussion of modifiers):
+</para>
+
+<para><programlisting>
+typedef struct _XkbModAction {
+      unsigned char     type;         /* <emphasis> XkbSA_{Set|Latch|Lock}Mods</emphasis> */
+      unsigned char     flags;        /* with <emphasis> type</emphasis> , controls the effect on modifiers */
+      unsigned char     mask;         /* same as <emphasis> mask</emphasis> field of a modifier description */
+      unsigned char     real_mods;    /* same as <emphasis> real_mods</emphasis> field of a modifier description */
+      unsigned char     vmods1;       /* derived from <emphasis> vmods</emphasis> field of a modifier description */
+      unsigned char     vmods2;       /* derived from <emphasis> vmods</emphasis> field of a modifier description */
+} <emphasis>XkbModAction</emphasis>;
+</programlisting></para>
+
+<para>
+In the following description, the term <emphasis>
+action modifiers</emphasis>
+ means the real modifier bits associated with this action. Depending on the
+value of <emphasis>
+flags</emphasis>
+ (see Table 16.3), these are designated either in the <emphasis>
+mask</emphasis>
+ field of the <emphasis>
+XkbModAction</emphasis>
+ structure itself or the real modifiers bound to the key for which the action
+is being used. In the latter case, this is the client <emphasis>
+map</emphasis>
+-&gt;<emphasis>
+modmap</emphasis>
+[<emphasis>
+keycode</emphasis>
+] field.
+</para>
+
+
+<para>
+The <emphasis>
+type</emphasis>
+ field can have any of the values shown in Table 16.2.
+</para>
+
+<table frame='topbot'>
+<title>Modifier Action Types</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Type</entry>
+  <entry>Effect</entry>
+</row>
+</thead>
+<tbody>
+  <row>
+    <entry><emphasis>XkbSA_SetMods</emphasis></entry>
+    <entry>
+<itemizedlist>
+  <listitem>
+    <para>
+A key press adds any action modifiers to the keyboard’s base modifiers.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A key release clears any action modifiers in the keyboard’s base modifiers,
+provided no other key affecting the same modifiers is logically down.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If no other keys are physically depressed when this key is released, and
+<emphasis>
+XkbSA_ClearLocks</emphasis>
+ is set in the <emphasis>
+flags</emphasis>
+ field, the key release unlocks any action modifiers.
+    </para>
+  </listitem>
+</itemizedlist>
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_LatchMods</emphasis></entry>
+    <entry>
+<itemizedlist>
+  <listitem>
+    <para>
+Key press and key release events have the same effect as for <emphasis>
+XkbSA_SetMods</emphasis>
+; if no keys are physically depressed when this key is released, key release
+events have the following additional effects:
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Modifiers unlocked due to <emphasis>
+XkbSA_ClearLocks</emphasis>
+ have no further effect.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If <emphasis>
+XkbSA_LatchToLock</emphasis>
+ is set in the <emphasis>
+flags</emphasis>
+ field, a key release locks and then unlatches any remaining action modifiers
+that are already latched.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A key release latches any action modifiers not used by the <emphasis>
+XkbSA_ClearLocks</emphasis>
+ and <emphasis>
+XkbSA_LatchToLock</emphasis>
+ flags.
+    </para>
+  </listitem>
+  </itemizedlist>
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_LockMods</emphasis></entry>
+    <entry>
+<itemizedlist>
+  <listitem>
+    <para>
+A key press sets the base state of any action modifiers. If <emphasis>
+XkbSA_LockNoLock</emphasis>
+ is set in the <emphasis>
+flags</emphasis>
+ field, a key press also sets the locked state of any action modifiers.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A key release clears any action modifiers in the keyboard’s base modifiers,
+provided no other key that affects the same modifiers is down. If <emphasis>
+XkbSA_LockNoUnlock</emphasis>
+ is not set in the <emphasis>
+flags</emphasis>
+ field, and any of the action modifiers were locked before the corresponding
+key press occurred, a key release unlocks them.
+    </para>
+  </listitem>
+</itemizedlist>
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+The <emphasis>
+flags</emphasis>
+ field is composed of the bitwise inclusive OR of the masks shown in Table
+16.3. A general meaning is given in the table, but the exact meaning depends on
+the action <emphasis>type</emphasis>.
+</para>
+
+<table frame='topbot'>
+<title>Modifier Action Flags</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Flag</entry>
+  <entry>Meaning</entry>
+</row>
+</thead>
+<tbody>
+  <row>
+    <entry><emphasis>XkbSA_UseModMapMods</emphasis></entry>
+    <entry>
+If set, the action modifiers are determined by the modifiers bound by the
+modifier mapping of the key. Otherwise, the action modifiers are set to the
+modifiers specified by the <emphasis>
+mask</emphasis>
+, <emphasis>
+real_mods</emphasis>
+, <emphasis>
+vmod1</emphasis>
+, and <emphasis>
+vmod2</emphasis>
+ fields.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_ClearLocks</emphasis></entry>
+    <entry>
+If set and no keys are physically depressed when this key transition
+occurs, the server unlocks any action modifiers.
+   </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_LatchToLock</emphasis></entry>
+    <entry>
+If set, and the action type is <emphasis>
+XkbSA_LatchMods</emphasis>
+, the server locks the action modifiers if they are already latched.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_LockNoLock</emphasis></entry>
+    <entry>
+If set, and the action type is <emphasis>
+XkbSA_LockMods</emphasis>
+, the server only unlocks the action modifiers.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_LockNoUnlock</emphasis></entry>
+    <entry>
+If set, and the action is <emphasis>
+XkbSA_LockMods</emphasis>
+, the server only locks the action modifiers.
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+If <emphasis>
+XkbSA_UseModMapMods</emphasis>
+ is not set in the <emphasis>
+flags</emphasis>
+ field, the <emphasis>
+mask</emphasis>
+, <emphasis>
+real_mods</emphasis>
+, <emphasis>
+vmods1</emphasis>
+, and <emphasis>
+vmods2 </emphasis>
+fields are used to determine the action modifiers. Otherwise they are ignored
+and the modifiers bound to the key (client <emphasis>
+map</emphasis>
+-&gt;<emphasis>
+modmap</emphasis>
+[<emphasis>
+keycode</emphasis>
+]) are used instead.
+</para>
+
+
+<para>
+The <emphasis>
+mask</emphasis>
+, <emphasis>
+real_mods</emphasis>
+, <emphasis>
+vmods1</emphasis>
+, and <emphasis>
+vmods2</emphasis>
+ fields represent the components of an Xkb modifier description (see section
+7.2). While the <emphasis>
+mask</emphasis>
+ and <emphasis>
+real_mods</emphasis>
+ fields correspond directly to the <emphasis>
+mask</emphasis>
+ and <emphasis>
+real_mods</emphasis>
+ fields of an Xkb modifier description, the <emphasis>
+vmods1</emphasis>
+ and <emphasis>
+vmods2</emphasis>
+ fields are combined to correspond to the <emphasis>
+vmods</emphasis>
+ field of an Xkb modifier description. Xkb provides the following macros, to
+convert between the two formats:
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+unsigned short <emphasis>
+XkbModActionVMods</emphasis>
+(<emphasis>
+act</emphasis>
+)                              /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbAction            <emphasis>
+act</emphasis>
+;                  /* action from which to extract virtual mods */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbModActionVMods</emphasis>
+ returns the <emphasis>
+vmods1</emphasis>
+ and <emphasis>
+vmods2</emphasis>
+ fields of <emphasis>
+act</emphasis>
+ converted to the <emphasis>
+vmods</emphasis>
+ format of an Xkb modifier description.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbSetModActionVMods</emphasis>
+(<emphasis>
+act, vmods</emphasis>
+)                              /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbAction            <emphasis>
+act</emphasis>
+;                  /* action in which to set vmods */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned short            <emphasis>
+vmods</emphasis>
+;                  /* virtual mods to set */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbSetModActionVMods</emphasis>
+ sets the <emphasis>
+vmods1</emphasis>
+ and <emphasis>
+vmods2</emphasis>
+ fields of <emphasis>
+act</emphasis>
+ using the <emphasis>
+vmods</emphasis>
+ format of an Xkb modifier description.
+</para>
+
+<note><para>Despite the fact that the first parameter of these two macros is of
+type XkbAction, these macros may be used only with Actions of type <emphasis>
+XkbModAction</emphasis>
+ and <emphasis>
+XkbISOAction</emphasis>
+.</para></note>
+
+
+</sect2>
+<sect2 id='Actions_for_Changing_Group_State'>
+<title>Actions for Changing Group State</title>
+
+<para>
+Actions associated with the <emphasis>
+XkbGroupAction</emphasis>
+ structure change the current group state when keys are pressed and released
+(see Chapter 5 for a description of groups and keyboard state):
+</para>
+
+<para><programlisting>
+typedef struct _XkbGroupAction {
+      unsigned char   type;       /* <emphasis> XkbSA_{Set|Latch|Lock}Group</emphasis> */
+      unsigned char   flags;      /* with <emphasis> type</emphasis> , controls the effect on groups */
+      char            group_XXX;  /* represents a group index or delta */
+} <emphasis>XkbGroupAction</emphasis>;
+</programlisting></para>
+
+<para>
+The <emphasis>
+type</emphasis>
+ field can have any of the following values:
+</para>
+
+<table frame='topbot'>
+<title>Group Action Types</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Type</entry>
+  <entry>Effect</entry>
+</row>
+</thead>
+<tbody>
+  <row>
+    <entry><emphasis>XkbSA_SetGroup</emphasis></entry>
+    <entry>
+<itemizedlist>
+  <listitem>
+    <para>
+If the <emphasis>
+XkbSA_GroupAbsolute</emphasis>
+ bit is set in the <emphasis>
+flags</emphasis>
+ field, key press events change the base keyboard group to the group specified
+by the <emphasis>
+group_XXX</emphasis>
+ field. Otherwise, key press events change the base keyboard group by adding
+the <emphasis>
+group_XXX</emphasis>
+ field to the base keyboard group. In either case, the resulting effective
+keyboard group is brought back into range depending on the value of the
+<emphasis>
+groups_wrap</emphasis>
+ field of the controls structure (see section 10.7.1).
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If a key with an <emphasis>
+XkbSA_ISOLock</emphasis>
+ action (see section 16.1.8) is pressed while this key is down, the key release
+of this key has no effect. Otherwise, the key release cancels the effects of
+the key press.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If the <emphasis>
+XkbSA_ClearLocks</emphasis>
+ bit is set in the flags field, and no keys are physically depressed when this
+key is released, the key release also sets the locked keyboard group to
+<emphasis>
+Group1</emphasis>
+.
+    </para>
+  </listitem>
+</itemizedlist>
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_LatchGroup</emphasis></entry>
+    <entry>
+<itemizedlist>
+  <listitem>
+    <para>
+Key press and key release events have the same effect as for <emphasis>
+XkbSA_SetGroup</emphasis>
+; if no keys are physically depressed when this key is released, key release
+events have the following additional effects.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If the <emphasis>
+XkbSA_LatchToLock</emphasis>
+ bit is set in the <emphasis>
+flags</emphasis>
+ field and the latched keyboard group index is nonzero, the key release adds
+the delta applied by the corresponding key press to the locked keyboard group
+and subtracts it from the latched keyboard group. The locked and effective
+keyboard group are brought back into range according to the value of the
+<emphasis>
+groups_wrap</emphasis>
+ field of the controls structure.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Otherwise, the key press adds the key press delta to the latched keyboard group.
+    </para>
+  </listitem>
+</itemizedlist>
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_LockGroup</emphasis></entry>
+    <entry>
+<itemizedlist>
+  <listitem>
+    <para>
+If the <emphasis>
+XkbSA_GroupAbsolute</emphasis>
+ is set in the <emphasis>
+flags</emphasis>
+ field, key press events set the locked keyboard group to the group specified
+by the <emphasis>
+group_XXX</emphasis>
+ field. Otherwise, key press events add the group specified by the <emphasis>
+group_XXX</emphasis>
+ field to the locked keyboard group. In either case, the resulting locked and
+effective keyboard groups are brought back into range depending on the value of
+the <emphasis>
+groups_wrap</emphasis>
+ field of the controls structure.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A key release has no effect.
+    </para>
+  </listitem>
+</itemizedlist>
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+The <emphasis>
+flags</emphasis>
+ field is composed of the bitwise inclusive OR of the masks shown in Table
+16.5. A general meaning is given in the table, but the exact meaning depends on
+the action <emphasis>
+type</emphasis>
+.
+</para>
+
+<table frame='topbot'>
+<title>Group Action Flags</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Flag</entry>
+  <entry>Meaning</entry>
+</row>
+</thead>
+<tbody>
+  <row>
+    <entry><emphasis>XkbSA_ClearLocks</emphasis></entry>
+    <entry>
+If set and no keys are physically depressed when this key transition occurs,
+the server sets the locked keyboard group to <emphasis>
+Group1</emphasis>
+ on a key release.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_LatchToLock</emphasis></entry>
+    <entry>
+If set, and the action type is <emphasis>
+SA_LatchGroup</emphasis>
+, the server locks the action group if it is already latched.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_GroupAbsolute</emphasis></entry>
+    <entry>
+If set, the <emphasis>
+group_XXX</emphasis>
+ field represents an absolute group number. Otherwise, it represents a group
+delta to be added to the current group to determine the new group number.
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+The <emphasis>
+group_XXX</emphasis>
+ field represents a signed character. Xkb provides the following macros to
+convert between a signed integer value and a signed character:
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+int <emphasis>
+XkbSAGroup</emphasis>
+(<emphasis>
+act</emphasis>
+)                              /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbAction            <emphasis>
+act</emphasis>
+;                  /* action from which to extract group */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbSAGroup</emphasis>
+ returns the <emphasis>
+group_XXX</emphasis>
+ field of <emphasis>
+act</emphasis>
+ converted to a signed int.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbSASetGroup</emphasis>
+(<emphasis>
+act, grp</emphasis>
+)                              /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbAction            <emphasis>
+act</emphasis>
+;                  /* action from which to set group */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int            <emphasis>
+grp</emphasis>
+;                  /* group index to set in <emphasis>
+group_XXX</emphasis>
+ */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbSASetGroup</emphasis>
+ sets the <emphasis>
+group_XXX</emphasis>
+ field of <emphasis>
+act</emphasis>
+ from the group index <emphasis>
+grp</emphasis>
+.
+</para>
+
+<note><para>Despite the fact that the first parameter of these two macros is of
+type XkbAction, these macros may only be used with Actions of type <emphasis>
+XkbGroupAction</emphasis>
+ and <emphasis>
+XkbISOAction</emphasis>
+.</para></note>
+
+
+</sect2>
+<sect2 id='Actions_for_Moving_the_Pointer'>
+<title>Actions for Moving the Pointer</title>
+
+<para>
+Actions associated with the <emphasis>
+XkbPtrAction</emphasis>
+ structure move the pointer when keys are pressed and released:
+</para>
+
+<para><programlisting>
+typedef struct _XkbPtrAction {
+      unsigned char      type;      /* <emphasis> XkbSA_MovePtr</emphasis> */
+      unsigned char      flags;     /* determines type of pointer motion */
+      unsigned char      high_XXX;  /* x coordinate, high bits*/
+      unsigned char      low_XXX;   /* y coordinate, low bits */
+      unsigned char      high_YYY;  /* x coordinate, high bits */
+      unsigned char      low_YYY;   /* y coordinate, low bits */
+} <emphasis>XkbPtrAction</emphasis>;
+</programlisting></para>
+
+<para>
+If the <emphasis>
+MouseKeys</emphasis>
+ control is not enabled (see section 10.5.1), <emphasis>
+KeyPress</emphasis>
+ and <emphasis>
+KeyRelease</emphasis>
+ events are treated as though the action is <emphasis>
+XkbSA_NoAction</emphasis>.
+</para>
+
+<para>
+If the <emphasis>
+MouseKeys</emphasis>
+ control is enabled, a server action of type <emphasis>
+XkbSA_MovePtr</emphasis>
+ instructs the server to generate core pointer <emphasis>
+MotionNotify</emphasis>
+ events rather than the usual <emphasis>
+KeyPress</emphasis>
+ event, and the corresponding <emphasis>
+KeyRelease</emphasis>
+ event disables any mouse keys timers that were created as a result of handling
+the <emphasis>
+XkbSA_MovePtr</emphasis>
+ action.
+</para>
+
+
+<para>
+The <emphasis>
+type</emphasis>
+ field of the <emphasis>
+XkbPtrAction</emphasis>
+ structure is always <emphasis>
+XkbSA_MovePtr</emphasis>
+.
+</para>
+
+
+<para>
+The <emphasis>
+flags</emphasis>
+ field is a bitwise inclusive OR of the masks shown in Table 16.6.
+</para>
+
+<table frame='topbot'>
+<title>Pointer Action Types</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Action Type</entry>
+  <entry>Meaning</entry>
+</row>
+</thead>
+<tbody>
+  <row>
+    <entry><emphasis>XkbSA_NoAcceleration</emphasis></entry>
+    <entry>
+If not set, and the <emphasis>
+MouseKeysAccel</emphasis>
+ control is enabled (see section 10.5.2), the <emphasis>
+KeyPress</emphasis>
+ initiates a mouse keys timer for this key; every time the timer expires, the
+cursor moves.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_MoveAbsoluteX</emphasis></entry>
+    <entry>If set, the X portion of the structure specifies the new pointer X
+coordinate. Otherwise, the X portion is added to the current pointer X
+coordinate to determine the new pointer X coordinate.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_MoveAbsoluteY</emphasis></entry>
+    <entry>
+If set, the Y portion of the structure specifies the new
+pointer Y coordinate. Otherwise, the Y portion is added
+to the current pointer Y coordinate to determine the new pointer Y coordinate.
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+Each of the X and Y coordinantes of the <emphasis>
+XkbPtrAction</emphasis>
+ structure is composed of two signed 16-bit values, that is, the X coordinate
+is composed of <emphasis>
+high_XXX</emphasis>
+ and <emphasis>
+low_XXX</emphasis>
+, and similarly for the Y coordinate. Xkb provides the following macros, to
+convert between a signed integer and two signed 16-bit values in <emphasis>
+XkbPtrAction</emphasis>
+ structures:
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+int <emphasis>
+XkbPtrActionX</emphasis>
+(<emphasis>
+act</emphasis>
+)                              /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbPtrAction            <emphasis>
+act</emphasis>
+;                  /* action from which to extract X */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbPtrActionX</emphasis>
+ returns the <emphasis>
+high_XXX</emphasis>
+ and <emphasis>
+low_XXX</emphasis>
+ fields of <emphasis>
+act</emphasis>
+ converted to a signed int.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+int <emphasis>
+XkbPtrActionY</emphasis>
+(<emphasis>
+act</emphasis>
+)                              /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbPtrAction            <emphasis>
+act</emphasis>
+;                  /* action from which to extract Y */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbPtrActionY</emphasis>
+ returns the <emphasis>
+high_YYY</emphasis>
+ and <emphasis>
+low_YYY</emphasis>
+ fields of <emphasis>
+act</emphasis>
+ converted to a signed int.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbSetPtrActionX</emphasis>
+(<emphasis>
+act</emphasis>
+, <emphasis>
+x</emphasis>
+)                              /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbPtrAction            <emphasis>
+act</emphasis>
+;                  /* action in which to set X */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int            <emphasis>
+x;      </emphasis>
+            /* new value to set */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbSetPtrActionX</emphasis>
+ sets the <emphasis>
+high_XXX</emphasis>
+ and <emphasis>
+low_XXX</emphasis>
+ fields of <emphasis>
+act</emphasis>
+ from the signed integer value <emphasis>
+x</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbSetPtrActionY</emphasis>
+(<emphasis>
+act, y</emphasis>
+)                              /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbPtrAction            <emphasis>
+act</emphasis>
+;                  /* action in which to set Y */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int            <emphasis>
+y</emphasis>
+;                  /* new value to set */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbSetPtrActionX</emphasis>
+ sets the <emphasis>
+high_YYY</emphasis>
+ and <emphasis>
+low_YYY</emphasis>
+ fields of <emphasis>
+act</emphasis>
+ from the signed integer value <emphasis>
+y</emphasis>
+.
+</para>
+
+
+</sect2>
+<sect2 id='Actions_for_Simulating_Pointer_Button_Press_and_Release'>
+<title>Actions for Simulating Pointer Button Press and Release</title>
+
+<para>
+Actions associated with the <emphasis>
+XkbPtrBtnAction</emphasis>
+ structure simulate the press and release of pointer buttons when keys are
+pressed and released:
+</para>
+
+<para><programlisting>
+typedef struct _XkbPtrBtnAction {
+      unsigned char   type;     /*<emphasis> XkbSA_PtrBtn, XkbSA_LockPtrBtn</emphasis> */
+      unsigned char   flags;    /* with <emphasis> type</emphasis> , controls the effect on pointer buttons*/
+      unsigned char   count;    /* controls number of ButtonPress and ButtonRelease events */
+      unsigned char   button;   /* pointer button to simulate */
+} <emphasis>XkbPtrBtnAction</emphasis>;
+</programlisting></para>
+
+<para>
+If the <emphasis>
+MouseKeys</emphasis>
+ (see section 10.5.1) control is not enabled, <emphasis>
+KeyPress</emphasis>
+ and <emphasis>
+KeyRelease</emphasis>
+ events are treated as though the action is <emphasis>
+XkbSA_NoAction</emphasis>
+.
+</para>
+
+
+<para>
+The <emphasis>
+type</emphasis>
+ field can have any one of the values shown in Table 16.7.
+</para>
+
+<table frame='topbot'>
+<title>Pointer Button Action Types</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Type</entry>
+  <entry>Effect</entry>
+</row>
+</thead>
+<tbody>
+  <row>
+    <entry><emphasis>XkbSA_PtrBtn</emphasis></entry>
+    <entry>
+<itemizedlist>
+  <listitem>
+    <para>
+If<emphasis>
+ XkbSA_UseDfltButton</emphasis>
+ is set in the <emphasis>
+flags</emphasis>
+ field, the event is generated for the pointer button specified by the
+<emphasis>
+mk_dflt_btn</emphasis>
+ attribute of the <emphasis>
+MouseKeys</emphasis>
+ control (see section 10.5.1). Otherwise, the event is generated for the button
+specified by the <emphasis>
+button</emphasis>
+ field.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If the mouse button specified for this action is logically down, the key press
+and corresponding key release are ignored and have no effect. Otherwise, a key
+press causes one or more core pointer button events instead of the usual
+<emphasis>
+KeyPress</emphasis>
+ event. If <emphasis>
+count</emphasis>
+ is <emphasis>
+zero</emphasis>
+, a key press generates a single <emphasis>
+ButtonPress</emphasis>
+ event; if <emphasis>
+count</emphasis>
+ is greater than <emphasis>
+zero</emphasis>
+, a key press generates <emphasis>
+count</emphasis>
+ pairs of <emphasis>
+ButtonPress</emphasis>
+ and <emphasis>
+ButtonRelease</emphasis>
+ events.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If <emphasis>
+count</emphasis>
+ is <emphasis>
+zero</emphasis>
+, a key release generates a core pointer <emphasis>
+ButtonRelease</emphasis>
+ that matches the event generated by the corresponding <emphasis>
+KeyPress</emphasis>
+; if <emphasis>
+count</emphasis>
+ is nonzero, a key release does not cause a <emphasis>
+ButtonRelease</emphasis>
+ event. A key release never generates a key <emphasis>
+KeyRelease</emphasis>
+ event.
+    </para>
+  </listitem>
+</itemizedlist>
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_LockPtrBtn</emphasis></entry>
+    <entry>
+<itemizedlist>
+  <listitem>
+    <para>
+If the button specified by the <emphasis>
+MouseKeys</emphasis>
+ default button<emphasis>
+ </emphasis>
+or <emphasis>
+button</emphasis>
+ is not locked, a key press causes a <emphasis>
+ButtonPress</emphasis>
+ event instead of a <emphasis>
+KeyPress</emphasis>
+ event and locks the button. If the button is already locked or if <emphasis>
+XkbSA_LockNoUnlock</emphasis>
+ is set in the <emphasis>
+flags</emphasis>
+ field, a key press is ignored and has no effect.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If the corresponding key press was ignored, and if <emphasis>
+XkbSA_LockNoLock</emphasis>
+ is not set in the <emphasis>
+flags</emphasis>
+ field, a key release generates a <emphasis>
+ButtonRelease</emphasis>
+ event instead of a <emphasis>
+KeyRelease</emphasis>
+ event and unlocks the specified button. If the corresponding key press locked
+a button, the key release is ignored and has no effect.
+    </para>
+  </listitem>
+</itemizedlist>
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+The <emphasis>
+flags</emphasis>
+ field is composed of the bitwise inclusive OR of the masks shown in Table
+16.8. A general meaning is given in the table, but the exact meaning depends on
+the action <emphasis>
+type.</emphasis>
+:
+</para>
+
+<table frame='topbot'>
+<title>Pointer Button Action Flags</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Flag</entry>
+  <entry>Meaning</entry>
+</row>
+</thead>
+<tbody>
+  <row>
+    <entry><emphasis>XkbSA_UseDfltButton</emphasis></entry>
+    <entry>
+If set, the action uses the pointer button specified by the <emphasis>
+mk_dflt_btn</emphasis>
+ attribute of the <emphasis>
+MouseKeys</emphasis>
+ control (see section 10.5.1). Otherwise, the action uses the pointer button
+specified by the<emphasis>
+ button </emphasis>
+field.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_LockNoLock</emphasis></entry>
+    <entry>
+If set, and the action type is <emphasis>
+XkbSA_LockPtrBtn</emphasis>
+, the server only unlocks the pointer button.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_LockNoUnlock</emphasis></entry>
+    <entry>
+If set, and the action type is <emphasis>
+XkbSA_LockPtrBtn</emphasis>
+, the server only locks the pointer button.
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+</sect2>
+<sect2 id='Actions_for_Changing_the_Pointer_Button_Simulated'>
+<title>Actions for Changing the Pointer Button Simulated</title>
+
+<para>
+Actions associated with the <emphasis>
+XkbPtrDfltAction</emphasis>
+ structure change the <emphasis>
+mk_dflt_btn</emphasis>
+ attribute of the <emphasis>
+MouseKeys</emphasis>
+ control (see section 10.5.1):
+</para>
+
+<para><programlisting>
+typedef struct _XkbPtrDfltAction {
+      unsigned char   type;      /* <emphasis> XkbSA_SetPtrDflt</emphasis> */
+      unsigned char   flags;     /* controls the pointer button number */
+      unsigned char   affect;    /* <emphasis> XkbSA_AffectDfltBtn</emphasis> */
+      char            valueXXX;  /* new default button member */
+} <emphasis>XkbPtrDfltAction</emphasis>;
+</programlisting></para>
+
+<para>
+If the <emphasis>
+MouseKeys</emphasis>
+ control is not enabled, <emphasis>
+KeyPress</emphasis>
+ and <emphasis>
+KeyRelease</emphasis>
+ events are treated as though the action is <emphasis>
+XkbSA_NoAction</emphasis>
+. Otherwise, this action changes the <emphasis>
+mk_dflt_btn</emphasis>
+ attribute of the <emphasis>
+MouseKeys</emphasis>
+ control.
+</para>
+
+
+<para>
+The <emphasis>
+type</emphasis>
+ field of the <emphasis>
+XkbPtrDfltAction</emphasis>
+ structure should always be <emphasis>
+XkbSA_SetPtrDflt</emphasis>
+.
+</para>
+
+
+<para>
+The <emphasis>
+flags</emphasis>
+ field is composed of the bitwise inclusive OR of the values shown in Table
+16.9 (currently there is only one value defined).
+</para>
+
+<table frame='topbot'>
+<title>Pointer Default Flags</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Flag</entry>
+  <entry>Meaning</entry>
+</row>
+</thead>
+<tbody>
+  <row>
+    <entry><emphasis>XkbSA_DfltBtnAbsolute</emphasis></entry>
+    <entry>
+If set, the <emphasis>
+value</emphasis>
+ field represents an absolute pointer button. Otherwise, the <emphasis>
+value</emphasis>
+ field represents the amount to be added to the current default button.
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+The <emphasis>
+affect</emphasis>
+ field specifies what changes as a result of this action. The only valid value
+for the <emphasis>
+affect</emphasis>
+ field is <emphasis>XkbSA_AffectDfltBtn</emphasis>.
+</para>
+
+<para>
+The <emphasis>
+valueXXX</emphasis>
+ field is a signed character that represents the new button value for the
+<emphasis>
+mk_dflt_btn</emphasis>
+ attribute of the <emphasis>
+MouseKeys</emphasis>
+ control (see section 10.5.1). If <emphasis>
+XkbSA_DfltBtnAbsolute</emphasis>
+ is set in <emphasis>
+flags</emphasis>
+, <emphasis>
+valueXXX</emphasis>
+ specifies the button to be used; otherwise, <emphasis>
+valueXXX</emphasis>
+ specifies the amount to be added to the current default button. In either
+case, illegal button choices are wrapped back around into range. Xkb provides
+the following macros, to convert between the integer and signed character
+values in <emphasis>
+XkbPtrDfltAction</emphasis>
+ structures:
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+int <emphasis>
+XkbSAPtrDfltValue</emphasis>
+(<emphasis>
+act</emphasis>
+)                              /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbAction            <emphasis>
+act</emphasis>
+;                  /* action from which to extract group */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbSAPtrDfltValue</emphasis>
+ returns the <emphasis>
+valueXXX</emphasis>
+ field of <emphasis>
+act</emphasis>
+ converted to a signed int.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbSASetPtrDfltValue</emphasis>
+(<emphasis>
+act, val</emphasis>
+)                              /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbPtrDfltAction            <emphasis>
+act</emphasis>
+;                  /* action in which to set <emphasis>
+valueXXX</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int            <emphasis>
+val</emphasis>
+;                  /* value to set in <emphasis>
+valueXXX</emphasis>
+ */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbSASetPtrDfltValue</emphasis>
+ sets the <emphasis>
+valueXXX</emphasis>
+ field of <emphasis>
+act</emphasis>
+ from <emphasis>
+val</emphasis>
+.
+</para>
+
+
+</sect2>
+<sect2 id='Actions_for_Locking_Modifiers_and_Group'>
+<title>Actions for Locking Modifiers and Group</title>
+
+<para>
+Actions associated with the <emphasis>
+XkbISOAction</emphasis>
+ structure lock modifiers and the group according to the ISO9995 specification.
+</para>
+
+
+<para>
+Operated by itself, the <emphasis>
+XkbISOAction</emphasis>
+ is just a caps lock. Operated simultaneously with another modifier key, it
+transforms the other key into a locking key. For example, press <emphasis>
+ISO_Lock</emphasis>
+, press and release <emphasis>
+Control_L</emphasis>
+, release <emphasis>
+ISO_Lock</emphasis>
+ ends up locking the <emphasis>
+Control</emphasis>
+ modifier.
+</para>
+
+
+<para>
+The default behavior is to convert:
+</para>
+
+<literallayout>
+     {Set,Latch}Mods to: LockMods
+     {Set,Latch}Group to: LockGroup
+     SetPtrBtn to: LockPtrBtn
+     SetControls to: LockControls
+</literallayout>
+
+<para>
+The <emphasis>
+affects</emphasis>
+ field allows you to turn those effects on or off individually. Set <emphasis>
+XkbSA_ISONoAffectMods</emphasis>
+ to disable the first, <emphasis>
+XkbSA_ISONoAffectGroup</emphasis>
+ to disable the second, and so forth.
+</para>
+
+<para><programlisting>
+typedef struct _XkbISOAction {
+      unsigned char   type;        /* <emphasis>XkbSA_ISOLock</emphasis> */
+      unsigned char   flags;       /* controls changes to group or modifier state */
+      unsigned char   mask;        /* same as <emphasis>mask</emphasis> field of a modifier description */
+      unsigned char   real_mods;   /* same as <emphasis>real_mods</emphasis> field of a modifier description */
+      char            group_XXX;   /* group index or delta group */
+      unsigned char   affect;      /* specifies whether to affect mods, group, ptrbtn, or controls*/
+      unsigned char   vmods1;      /* derived from <emphasis>vmods</emphasis> field of a modifier description */
+      unsigned char   vmods2;      /* derived from <emphasis>vmods</emphasis> field of a modifier description */
+} <emphasis>XkbISOAction</emphasis>;
+</programlisting></para>
+
+<para>
+The <emphasis>
+type</emphasis>
+ field of the <emphasis>
+XkbISOAction</emphasis>
+ structure should always be <emphasis>
+XkbSA_ISOLock</emphasis>
+.
+</para>
+
+
+<para>
+The interpretation of the <emphasis>
+flags</emphasis>
+ field depends on whether the <emphasis>
+XkbSA_ISODfltIsGroup</emphasis>
+ is set in the <emphasis>
+flags</emphasis>
+ field or not.
+</para>
+
+
+<para>
+If the <emphasis>
+XkbSA_ISODfltIsGroup</emphasis>
+ is set in the <emphasis>
+flags</emphasis>
+ field, the action is used to change the group state. The remaining valid bits
+of the <emphasis>
+flags</emphasis>
+ field are composed of a bitwise inclusive OR using the masks shown in Table
+16.10.
+</para>
+
+<table frame='topbot'>
+<title>ISO Action Flags when XkbSA_ISODfltIsGroup is Set</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Flag</entry>
+  <entry>Meaning</entry>
+</row>
+</thead>
+<tbody>
+  <row>
+    <entry><emphasis>XkbSA_ISODfltIsGroup</emphasis></entry>
+    <entry>
+      <para>
+If set, the action is used to change the base group state. Must be set for the
+remaining bits in this table to carry their interpretations.
+      </para>
+      <para>
+A key press sets the base group as specified by the <emphasis>
+group_XXX</emphasis>
+ field and the <emphasis>
+XkbSA_GroupAbsolute</emphasis>
+ bit of the <emphasis>
+flags</emphasis>
+ field (see section Note). If no other actions are transformed by the <emphasis>
+XkbISO_Lock</emphasis>
+ action, a key release locks the group. Otherwise, a key release clears group
+set by the key press.
+      </para>
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_GroupAbsolute</emphasis></entry>
+    <entry>
+If set, the <emphasis>
+group_XXX</emphasis>
+ field represents an absolute group number. Otherwise, it represents a group
+delta to be added to the current group to determine the new group number.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_ISONoAffectMods</emphasis></entry>
+    <entry>
+If not set, any <emphasis>
+XkbSA_SetMods</emphasis>
+ or <emphasis>
+XkbSA_LatchMods</emphasis>
+ actions that occur simultaneously with the <emphasis>
+XkbSA_ISOLock</emphasis>
+ action are treated as <emphasis>
+XkbSA_LockMod</emphasis>
+ actions instead.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_ISONoAffectGroup</emphasis></entry>
+    <entry>
+If not set, any <emphasis>
+XkbSA_SetGroup</emphasis>
+ or <emphasis>
+XkbSA_LatchGroup</emphasis>
+ actions that occur simultaneously with the <emphasis>
+XkbSA_ISOLock</emphasis>
+ action are treated as <emphasis>
+XkbSA_LockGroup</emphasis>
+ actions instead.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_ISONoAffectPtr</emphasis></entry>
+    <entry>
+If not set, any <emphasis>
+XkbSA_PtrBtn</emphasis>
+ actions that occur simultaneously with the <emphasis>
+XkbSA_ISOLock</emphasis>
+ action are treated as <emphasis>
+XkbSA_LockPtrBtn</emphasis>
+ actions instead.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_ISONoAffectCtrls</emphasis></entry>
+    <entry>
+If not set, any <emphasis>
+XkbSA_SetControls</emphasis>
+ actions that occur simultaneously with the <emphasis>
+XkbSA_ISOLock</emphasis>
+ action are treated as <emphasis>
+XkbSA_LockControls</emphasis>
+ actions instead.
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+If the <emphasis>
+XkbSA_ISODfltIsGroup</emphasis>
+ is not set in the <emphasis>
+flags</emphasis>
+ field, the action is used to change the modifier state and the remaining valid
+bits of the <emphasis>
+flags</emphasis>
+ field are composed of a bitwise inclusive OR using the masks shown in Table
+16.11.
+</para>
+
+<table frame='topbot'>
+<title>ISO Action Flags when XkbSA_ISODfltIsGroup is Not Set</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Flag</entry>
+  <entry>Meaning</entry>
+</row>
+</thead>
+<tbody>
+  <row>
+    <entry><emphasis>XkbSA_ISODfltIsGroup</emphasis> </entry>
+    <entry>
+      <para>
+If not set, action is used to change the base modifier state. Must not be set
+for the remaining bits in this table to carry their interpretations.
+      </para>
+      <para>
+A key press sets the action modifiers in the keyboard’s base modifiers using
+the <emphasis>
+mask</emphasis>
+, <emphasis>
+real_mods</emphasis>
+, <emphasis>
+vmods1</emphasis>
+, and <emphasis>
+vmods2 </emphasis>
+fields (see section 16.1.3). If no other actions are transformed by the
+<emphasis>
+XkbISO_Lock</emphasis>
+ action, a key release locks the action modifiers. Otherwise, a key release
+clears the base modifiers set by the key press.
+      </para>
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_UseModMapMods</emphasis></entry>
+    <entry>
+If set, the action modifiers are determined by the modifiers bound by the
+modifier mapping of the key. Otherwise, the action modifiers are set to the
+modifiers specified by the <emphasis>
+mask</emphasis>
+, <emphasis>
+real_mods</emphasis>
+, <emphasis>
+vmod1</emphasis>
+, and <emphasis>
+vmod2</emphasis>
+ fields.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_LockNoLock</emphasis></entry>
+    <entry>If set, the server only unlocks the action modifiers.</entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_LockNoUnlock</emphasis></entry>
+    <entry>If set, the server only locks the action modifiers. </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_ISONoAffectMods</emphasis></entry>
+    <entry>
+If not set, any <emphasis>
+XkbSA_SetMods</emphasis>
+ or <emphasis>
+XkbSA_LatchMods</emphasis>
+ actions that occur simultaneously with the <emphasis>
+XkbSA_ISOLock</emphasis>
+ action are treated as <emphasis>
+XkbSA_LockMod</emphasis>
+ actions instead.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_ISONoAffectGroup</emphasis></entry>
+    <entry>
+If not set, any <emphasis>
+XkbSA_SetGroup</emphasis>
+ or <emphasis>
+XkbSA_LatchGroup</emphasis>
+ actions that occur simultaneously with the <emphasis>
+XkbSA_ISOLock</emphasis>
+ action are treated as <emphasis>
+XkbSA_LockGroup</emphasis>
+ actions instead.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_ISONoAffectPtr</emphasis></entry>
+    <entry>
+If not set, any <emphasis>
+XkbSA_PtrBtn</emphasis>
+ actions that occur simultaneously with the <emphasis>
+XkbSA_ISOLock</emphasis>
+ action are treated as <emphasis>
+XkbSA_LockPtrBtn</emphasis>
+ actions instead.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_ISONoAffectCtrls</emphasis></entry>
+    <entry>
+If not set, any <emphasis>
+XkbSA_SetControls</emphasis>
+ actions that occur simultaneously with the <emphasis>
+XkbSA_ISOLock</emphasis>
+ action are treated as <emphasis>
+XkbSA_LockControls</emphasis>
+ actions instead.
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+The <emphasis>
+group_XXX</emphasis>
+ field represents a signed character. Xkb provides macros to convert between a
+signed integer value and a signed character as shown in section Note.
+</para>
+
+
+<para>
+The <emphasis>
+mask</emphasis>
+, <emphasis>
+real_mods</emphasis>
+, <emphasis>
+vmods1</emphasis>
+, and <emphasis>
+vmods2</emphasis>
+ fields represent the components of an Xkb modifier description (see section
+7.2). While the <emphasis>
+mask</emphasis>
+ and <emphasis>
+real_mods</emphasis>
+ fields correspond directly to the <emphasis>
+mask</emphasis>
+ and <emphasis>
+real_mods</emphasis>
+ fields of an Xkb modifier description, the <emphasis>
+vmods1</emphasis>
+ and <emphasis>
+vmods2</emphasis>
+ fields are combined to correspond to the <emphasis>
+vmods</emphasis>
+ field of an Xkb modifier description. Xkb provides macros to convert between
+the two formats as shown in section 16.1.3.
+</para>
+
+
+<para>
+The <emphasis>
+affect</emphasis>
+ field is composed of a bitwise inclusive OR using the masks shown in Table
+16.11.
+</para>
+
+<table frame='topbot'>
+<title>ISO Action Affect Field Values</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Affect</entry>
+  <entry>Meaning</entry>
+</row>
+</thead>
+<tbody>
+  <row>
+    <entry><emphasis>XkbSA_ISODNoAffectMods</emphasis></entry>
+    <entry>
+If <emphasis>
+XkbSA_ISONoAffectMods</emphasis>
+ is not set, any <emphasis>
+SA_SetMods</emphasis>
+ or <emphasis>
+SA_LatchMods</emphasis>
+ actions occurring simultaneously with the <emphasis>
+XkbISOAction</emphasis>
+ are treated as <emphasis>
+SA_LockMods</emphasis>
+ instead.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_ISONoAffectGroup</emphasis></entry>
+    <entry>
+If <emphasis>
+XkbSA_ISONoAffectGroup</emphasis>
+ is not set, any <emphasis>
+SA_SetGroup</emphasis>
+ or <emphasis>
+SA_LatchGroup</emphasis>
+ actions occurring simultaneously with the <emphasis>
+XkbISOAction</emphasis>
+ are treated as <emphasis>
+SA_LockGroup</emphasis>
+ instead.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_ISONoAffectPtr</emphasis></entry>
+    <entry>
+If <emphasis>
+XkbSA_ISONoAffectPtr</emphasis>
+ is not set, any <emphasis>
+SA_PtrBtn</emphasis>
+ actions occurring simultaneously with the <emphasis>
+XkbISOAction</emphasis>
+ are treated as <emphasis>
+SA_LockPtrBtn</emphasis>
+ instead.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_ISONoAffectCtrls</emphasis></entry>
+    <entry>
+If <emphasis>
+XkbSA_ISONoAffectCtrls</emphasis>
+ is not set, any <emphasis>
+SA_SetControls</emphasis>
+ actions occurring simultaneously with the <emphasis>
+XkbISOAction</emphasis>
+ are treated as <emphasis>
+SA_LockControls</emphasis>
+ instead.
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+</sect2>
+<sect2 id='Actions_for_Changing_the_Active_Screen'>
+<title>Actions for Changing the Active Screen</title>
+
+<para>
+Actions associated with the <emphasis>
+XkbSwitchScreen</emphasis>
+ action structure change the active screen on a multiscreen display:
+</para>
+
+<note><para>This action is optional. Servers are free to ignore the action or
+any of its flags if they do not support the requested behavior. If the action
+is ignored, it behaves like <emphasis>
+XkbSA_NoAction</emphasis>
+. Otherwise, key press and key release events do not generate an event.
+</para></note>
+
+<para><programlisting>
+typedef struct _XkbSwitchScreenAction {
+      unsigned char   type;        /* <emphasis> XkbSA_SwitchScreen</emphasis> */
+      unsigned char   flags;       /* controls screen switching */
+      char            screenXXX;   /* screen number or delta */
+} <emphasis>XkbSwitchScreenAction</emphasis>;
+</programlisting></para>
+
+<para>
+The <emphasis>
+type</emphasis>
+ field of the <emphasis>
+XkbSwitchScreenAction</emphasis>
+ structure should always be <emphasis>
+XkbSA_SwitchScreen</emphasis>.
+</para>
+
+
+<para>
+The <emphasis>
+flags</emphasis>
+ field is composed of the bitwise inclusive OR of the masks shown in Table
+16.13.
+</para>
+
+<table frame='topbot'>
+<title>Switch Screen Action Flags</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Flag</entry>
+  <entry>Meaning</entry>
+</row>
+</thead>
+<tbody>
+  <row>
+    <entry><emphasis>XkbSA_SwitchAbsolute</emphasis></entry>
+    <entry>
+If set, the <emphasis>
+screenXXX</emphasis>
+ field represents the index of the new screen. Otherwise, it represents an
+offset from the current screen to the new screen.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_SwitchApplication</emphasis></entry>
+    <entry>
+If not set, the action should switch to another screen on the same
+server. Otherwise, it should switch to another X server or application that
+shares the same physical display.
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+The <emphasis>
+screenXXX</emphasis>
+ field is a signed character value that represents either the relative or
+absolute screen index, depending on the state of the <emphasis>
+XkbSA_SwitchAbsolute</emphasis>
+ bit in the <emphasis>
+flags</emphasis>
+ field. Xkb provides the following macros to convert between the integer and
+signed character value for screen numbers in <emphasis>
+XkbSwitchScreenAction</emphasis>
+ structures:
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+int <emphasis>
+XkbSAScreen</emphasis>
+(<emphasis>
+act</emphasis>
+)                        /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbSwitchScreenAction                  <emphasis>
+act</emphasis>
+;      /* action from which to extract screen */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbSAScreen</emphasis>
+ returns the <emphasis>
+screenXXX</emphasis>
+ field of <emphasis>
+act</emphasis>
+ converted to a signed int.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbSASetScreen</emphasis>
+(<emphasis>
+act, s</emphasis>
+)                        /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbSwitchScreenAction                  <emphasis>
+act</emphasis>
+;      /* action in which to set <emphasis>
+screenXXX</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int                  <emphasis>
+s</emphasis>
+;      /* value to set in <emphasis>
+screenXXX</emphasis>
+ */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbSASetScreen</emphasis>
+ sets the <emphasis>
+screenXXX</emphasis>
+ field of <emphasis>
+act</emphasis>
+ from <emphasis>
+s</emphasis>
+.
+</para>
+
+
+</sect2>
+<sect2 id='Actions_for_Changing_Boolean_Controls_State'>
+<title>Actions for Changing Boolean Controls State</title>
+
+<para>
+Actions associated with the <emphasis>
+XkbCtrlsAction</emphasis>
+ structure change the state of the boolean controls (see section 10.1):
+</para>
+
+<para><programlisting>
+typedef struct _XkbCtrlsAction {
+      unsigned char     type;        /* <emphasis> XkbSA_SetControls,
+                                        XkbSA_LockControls</emphasis> */
+      unsigned char     flags;       /* with <emphasis> type</emphasis>,
+                                        controls enabling and disabling of controls */
+      unsigned char     ctrls3;      /* <emphasis>ctrls0</emphasis> through
+                                        <emphasis> ctrls3</emphasis> represent the boolean controls */
+      unsigned char     ctrls2;      /* <emphasis>ctrls0</emphasis> through
+                                        <emphasis> ctrls3</emphasis> represent the boolean controls */
+      unsigned char     ctrls1;      /* <emphasis>ctrls0</emphasis> through
+                                        <emphasis> ctrls3</emphasis> represent the boolean controls */
+      unsigned char     ctrls0;      /* <emphasis>ctrls0</emphasis> through
+                                        <emphasis> ctrls3</emphasis> represent the boolean controls */
+} <emphasis>XkbCtrlsAction</emphasis>;
+</programlisting></para>
+
+<para>
+The <emphasis>
+type</emphasis>
+ field can have any one of the values shown in Table 16.14.
+</para>
+
+<table frame='topbot'>
+<title>Controls Action Types</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Type</entry>
+  <entry>Effect</entry>
+</row>
+</thead>
+<tbody>
+  <row>
+    <entry><emphasis>XkbSA_SetControls</emphasis></entry>
+    <entry>
+<itemizedlist>
+  <listitem>
+    <para>
+A key press enables any boolean controls specified in the <emphasis>
+ctrls</emphasis>
+ fields that were not already enabled at the time of the key press.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A key release disables any controls enabled by the key press.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+This action can cause <emphasis>
+XkbControlsNotify</emphasis>
+ events (see section 10.1).
+    </para>
+  </listitem>
+</itemizedlist>
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_LockControls</emphasis></entry>
+    <entry>
+<itemizedlist>
+  <listitem>
+    <para>
+If the <emphasis>
+XkbSA_LockNoLock</emphasis>
+ bit is not set in the <emphasis>
+flags</emphasis>
+ field, a key press enables any controls specified in the <emphasis>
+ctrls</emphasis>
+ fields that were not already enabled at the time of the key press.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If the <emphasis>
+XkbSA_LockNoUnlock</emphasis>
+ bit is not set in the <emphasis>
+flags</emphasis>
+ field, a key release disables any controls specified in the <emphasis>
+ctrls</emphasis>
+ fields that were not already disabled at the time of the key press.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+This action can cause <emphasis>
+XkbControlsNotify</emphasis>
+ events (see section 10.1).
+    </para>
+  </listitem>
+</itemizedlist>
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+The <emphasis>
+flags</emphasis>
+ field is composed of the bitwise inclusive OR of the masks shown in Table
+16.15.
+</para>
+
+<table frame='topbot'>
+<title>Control Action Flags</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Flag</entry>
+  <entry>Meaning</entry>
+</row>
+</thead>
+<tbody>
+  <row>
+    <entry><emphasis>XkbSA_LockNoLock</emphasis></entry>
+    <entry>
+If set, and the action type is <emphasis>
+XkbSA_LockControls</emphasis>
+, the server only disables controls.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_LockNoUnlock</emphasis></entry>
+    <entry>
+If set, and the action type is <emphasis>
+XkbSA_LockControls</emphasis>
+, the server only enables controls.
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+The <emphasis>
+XkbSA_SetControls</emphasis>
+ action implements a key that enables a boolean control when pressed and
+disables it when released. The <emphasis>
+XkbSA_LockControls</emphasis>
+ action is used to implement a key that toggles the state of a boolean control
+each time it is pressed and released. The <emphasis>
+XkbSA_LockNoLock</emphasis>
+ and <emphasis>
+XkbSA_LockNoUnlock</emphasis>
+ flags allow modifying the toggling behavior to only unlock or only lock the
+boolean control.
+</para>
+
+
+<para>
+The <emphasis>
+ctrls0</emphasis>
+, <emphasis>
+ctrls1</emphasis>
+, <emphasis>
+ctrls2</emphasis>
+, and <emphasis>
+ctrls3</emphasis>
+ fields represent the boolean controls in the <emphasis>
+enabled_ctrls</emphasis>
+ field of the controls structure (see section 10.1). Xkb provides the following
+macros, to convert between the two formats:
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+unsigned int <emphasis>
+XkbActionCtrls</emphasis>
+(<emphasis>
+act</emphasis>
+)                        /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbCtrlsAction            <emphasis>
+act</emphasis>
+;            /* action from which to extract controls */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbActionCtrls</emphasis>
+ returns the <emphasis>
+ctrls</emphasis>
+ fields of <emphasis>
+act</emphasis>
+ converted to an unsigned int.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbSAActionSetCtrls</emphasis>
+(<emphasis>
+act, ctrls</emphasis>
+)                        /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbCtrlsAction                  <emphasis>
+act</emphasis>
+;      /* action in which to set ctrls0-ctrls3 */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int                  <emphasis>
+ctrls</emphasis>
+;      /* value to set in ctrls0-ctrls3 */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbSAActionSetCtrls</emphasis>
+ sets the <emphasis>
+ctrls0</emphasis>
+ through <emphasis>
+ctrls3</emphasis>
+ fields of <emphasis>
+act</emphasis>
+ from <emphasis>
+ctrls</emphasis>
+.
+</para>
+
+
+</sect2>
+<sect2 id='Actions_for_Generating_Messages'>
+<title>Actions for Generating Messages</title>
+
+<para>
+Actions associated with the <emphasis>
+XkbMessageAction</emphasis>
+ structure generate <emphasis>
+XkbActionMessage</emphasis>
+ events:
+</para>
+
+<para><programlisting>
+#define            XkbActionMessageLength                  6
+</programlisting></para>
+<para><programlisting>
+typedef struct _XkbMessageAction {
+      unsigned char   type;             /* <emphasis> XkbSA_ActionMessage</emphasis> */
+      unsigned char   flags;            /* controls event generation via key presses and releases */
+      unsigned char   message[XkbActionMessageLength];    /* message */
+} <emphasis>XkbMessageAction</emphasis>;
+</programlisting></para>
+
+<para>
+The <emphasis>
+type</emphasis>
+ field of the <emphasis>
+XkbMessageAction</emphasis>
+ structure should always be <emphasis>
+XkbSA_ActionMessage</emphasis>
+.
+</para>
+
+
+<para>
+The <emphasis>
+flags</emphasis>
+ field is composed of the bitwise inclusive OR of the masks shown in Table
+16.16.
+</para>
+
+<table frame='topbot'>
+<title>Message Action Flags</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Flag</entry>
+  <entry>Meaning</entry>
+</row>
+</thead>
+<tbody>
+  <row>
+    <entry><emphasis>XkbSA_MessageOnPress</emphasis></entry>
+    <entry>
+If set, key press events generate an <emphasis>
+XkbActionMessage</emphasis>
+ event that reports the keycode, event type, and contents of the <emphasis>
+message</emphasis>
+ field.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_MessageOnRelease</emphasis></entry>
+    <entry>
+If set, key release events generate an <emphasis>
+XkbActionMessage</emphasis>
+ event that reports the keycode, event type, and contents of the <emphasis>
+message</emphasis>
+ field.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_MessageGenKeyEvent</emphasis></entry>
+    <entry>
+If set, key press and key release events generate <emphasis>
+KeyPress</emphasis>
+ and <emphasis>
+KeyRelease</emphasis>
+ events, regardless of whether they generate <emphasis>
+XkbActionMessage</emphasis>
+ events.
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+The <emphasis>
+message</emphasis>
+ field is an array of <emphasis>
+XkbActionMessageLength</emphasis>
+ unsigned characters and may be set to anything the keymap designer wishes.
+</para>
+
+<sect3 id='Detecting_Key_Action_Messages'>
+<title>Detecting Key Action Messages</title>
+
+<para>
+To receive <emphasis>
+XkbActionMessage</emphasis>
+ events by calling either <emphasis>
+XkbSelectEvents</emphasis>
+ or <emphasis>
+XkbSelectEventDetails</emphasis>
+ (see section 4.3).
+</para>
+
+
+<para>
+To receive <emphasis>
+XkbActionMessage</emphasis>
+ events under all possible conditions, use <emphasis>
+XkbSelectEvents</emphasis>
+ and pass <emphasis>
+XkbActionMessageMask</emphasis>
+ in both <emphasis>
+bits_to_change</emphasis>
+ and <emphasis>
+values_for_bits</emphasis>
+.
+</para>
+
+
+<para>
+The <emphasis>
+XkbActionMessage</emphasis>
+ event has no event details. However, you can call <emphasis>
+XkbSelectEventDetails</emphasis>
+ using <emphasis>
+XkbActionMessage</emphasis>
+ as the <emphasis>
+event_type</emphasis>
+ and specifying <emphasis>
+XkbAllActionMessageMask</emphasis>
+ in <emphasis>
+bits_to_change</emphasis>
+ and <emphasis>
+values_for_bits.</emphasis>
+ This has the same effect as a call to <emphasis>
+XkbSelectEvents</emphasis>.
+</para>
+
+
+<para>
+The structure for the <emphasis>
+XkbActionMessage</emphasis>
+ event is defined as follows:
+</para>
+
+<para><programlisting>
+typedef struct _XkbActionMessage {
+      int            type;            /* Xkb extension base event code */
+      unsigned long  serial;          /* X server serial number for event */
+      Bool           send_event;      /* <emphasis>True</emphasis> =&gt; synthetically generated */
+      Display *      display;         /* server connection where event generated */
+      Time           time;            /* server time when event generated */
+      int            xkb_type;        /* <emphasis>XkbActionMessage</emphasis> */
+      int            device;          /* Xkb device ID, will not be <emphasis> XkbUseCoreKbd</emphasis> */
+      KeyCode        keycode;         /* keycode of key triggering event */
+      Bool           press;           /* <emphasis>True</emphasis> =&gt; key press,
+                                         <emphasis>False</emphasis> =&gt; release */
+      Bool           key_event_follows; /* <emphasis>True</emphasis> =&gt; KeyPress/KeyRelease follows */
+      char           message[XkbActionMessageLength+1];                       /* message text */
+} <emphasis>XkbActionMessageEvent</emphasis>;
+</programlisting></para>
+
+<para>
+The <emphasis>
+keycode</emphasis>
+ is the keycode of the key that was pressed or released. The <emphasis>
+press</emphasis>
+ field specifies whether the event was the result of a key press or key
+release.
+</para>
+
+
+<para>
+The <emphasis>
+key_event_follows</emphasis>
+ specifies whether a <emphasis>
+KeyPress</emphasis>
+ (if <emphasis>
+press</emphasis>
+ is <emphasis>
+True</emphasis>
+) or <emphasis>
+KeyRelease</emphasis>
+ (if <emphasis>
+press</emphasis>
+ is <emphasis>
+False</emphasis>
+) event is also sent to the client. As with all other Xkb events, <emphasis>
+XkbActionMessageEvent</emphasis>
+s are delivered to all clients requesting them, regardless of the current
+keyboard focus. However, the <emphasis>
+KeyPress</emphasis>
+ or <emphasis>
+KeyRelease</emphasis>
+ event that conditionally follows an <emphasis>
+XkbActionMessageEvent</emphasis>
+ is sent only to the client selected by the current keyboard focus. <emphasis>
+key_event_follows</emphasis>
+ is <emphasis>
+True</emphasis>
+ only for the client that is actually sent the following <emphasis>
+KeyPress</emphasis>
+ or <emphasis>
+KeyRelease</emphasis>
+ event.
+</para>
+
+
+<para>
+The <emphasis>
+message</emphasis>
+ field is set to the message specified in the action and is guaranteed to be
+<emphasis>
+NULL</emphasis>
+-terminated; the Xkb extension forces a <emphasis>
+NULL</emphasis>
+ into <emphasis>
+message</emphasis>
+[<emphasis>
+XkbActionMessageLength</emphasis>
+].
+</para>
+
+
+</sect3>
+</sect2>
+<sect2 id='Actions_for_Generating_a_Different_Keycode'>
+<title>Actions for Generating a Different Keycode</title>
+
+<para>
+Actions associated with the <emphasis>
+XkbRedirectKeyAction</emphasis>
+ structure generate <emphasis>
+KeyPress</emphasis>
+ and <emphasis>
+KeyRelease</emphasis>
+ events containing a keycode different from the key that was pressed or
+released:
+</para>
+
+<para><programlisting>
+typedef struct      _XkbRedirectKeyAction {
+      unsigned char      type;          /* <emphasis> XkbSA_RedirectKey</emphasis> */
+      unsigned char      new_key;       /* keycode to be put in event */
+      unsigned char      mods_mask;     /* mask of real mods to be reset */
+      unsigned char      mods;          /* mask of real mods to take values from */
+      unsigned char      vmods_mask0;   /* first half of mask of virtual mods to be reset */
+      unsigned char      vmods_mask1;   /* other half of mask of virtual mods to be reset */
+      unsigned char      vmods0;        /* first half of mask of virtual mods to take values from */
+      unsigned char      vmods1;        /* other half of mask of virtual mods to take values from */
+} <emphasis>XkbRedirectKeyAction</emphasis>;
+</programlisting></para>
+
+<para>
+The <emphasis>
+type</emphasis>
+ field for the <emphasis>
+XkbRedirectKeyAction</emphasis>
+ structure should always be <emphasis>
+XkbSA_RedirectKey</emphasis>
+.
+</para>
+
+
+<para>
+Key presses cause a <emphasis>
+KeyPress</emphasis>
+ event for the key specified by the <emphasis>
+new_key</emphasis>
+ field instead of the actual key. The state reported in this event reports the
+current effective modifiers changed as follows: any real modifiers selected by
+the <emphasis>
+mods_mask</emphasis>
+ field are set to corresponding values from the <emphasis>
+mods</emphasis>
+ field. Any real modifiers bound to the virtual modifiers specified by the
+<emphasis>
+vmods_mask0</emphasis>
+ and <emphasis>
+vmods_mask1</emphasis>
+ fields are either set or cleared, depending on the corresponding values in the
+<emphasis>
+vmods0</emphasis>
+ and <emphasis>
+vmods1</emphasis>
+ fields. If the real and virtual modifier definitions specify conflicting
+values for a single modifier, the real modifier definition has priority.
+</para>
+
+
+<para>
+Key releases cause a <emphasis>
+KeyRelease</emphasis>
+ event for the key specified by the <emphasis>
+new_key</emphasis>
+ field instead of the actual key. The state for this event consists of the
+effective keyboard modifiers at the time of the release, changed as described
+previously.
+</para>
+
+
+<para>
+The <emphasis>
+XkbSA_RedirectKey</emphasis>
+ action normally redirects to another key on the same device as the key that
+caused the event, unless that device does not belong to the input extension
+<emphasis>
+KeyClass</emphasis>
+, in which case this action causes an event on the core keyboard device. (The
+input extension categorizes devices by breaking them into classes. Keyboards,
+and other input devices with keys, are classified as KeyClass devices by the
+input extension.)
+</para>
+
+
+<para>
+The <emphasis>
+vmods_mask0</emphasis>
+ and <emphasis>
+vmods_mask1</emphasis>
+ fields actually represent one <emphasis>
+vmods_mask</emphasis>
+ value, as described in Chapter 7. Xkb provides the following macros, to
+convert between the two formats:
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+unsigned int <emphasis>
+XkbSARedirectVModsMask</emphasis>
+(<emphasis>
+act</emphasis>
+)                              /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbRedirectKeyAction                  <emphasis>
+act</emphasis>
+;            /* action from which to extract vmods */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbSARedirectVModsMask</emphasis>
+ returns the <emphasis>
+vmods_mask0</emphasis>
+ and <emphasis>
+vmods_mask1</emphasis>
+ fields of <emphasis>
+act</emphasis>
+ converted to an unsigned int.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbSARedirectSetVModsMask</emphasis>
+(<emphasis>
+act, vm</emphasis>
+)                              /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbRedirectKeyAction                  <emphasis>
+act</emphasis>
+;            /* action in which to set vmods */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int                  <emphasis>
+vm</emphasis>
+;            /* new value for virtual modifier mask */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbSARedirectSetVModsMask</emphasis>
+ sets the <emphasis>
+vmods_mask0</emphasis>
+ and <emphasis>
+vmods_mask1</emphasis>
+ fields of <emphasis>
+act</emphasis>
+ from <emphasis>
+vm</emphasis>
+.
+</para>
+
+
+<para>
+Similarly, the <emphasis>
+vmods0</emphasis>
+ and <emphasis>
+vmods1</emphasis>
+ fields actually represent one <emphasis>
+vmods </emphasis>
+value, as described in Chapter 7. To convert between the two formats, Xkb
+provides the following convenience macros:
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+unsigned int <emphasis>
+XkbSARedirectVMods</emphasis>
+(<emphasis>
+act</emphasis>
+)                              /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbRedirectKeyAction                  <emphasis>
+act</emphasis>
+;            /* action from which to extract vmods */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<literallayout>
+     <emphasis>XkbSARedirectVModsMask</emphasis> returns the <emphasis>vmods0</emphasis>
+     and <emphasis>vmods1</emphasis> fields of <emphasis>act</emphasis>
+     converted to an unsigned int.
+</literallayout>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbSARedirectSetVMods</emphasis>
+(<emphasis>
+act, vm</emphasis>
+)                              /* macro */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbRedirectKeyAction                  <emphasis>
+act</emphasis>
+;            /* action in which to set vmods */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int                  <emphasis>
+v</emphasis>
+;            /* new value for virtual modifiers */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+<literallayout>
+     <emphasis> XkbSARedirectSetVModsMask</emphasis> sets the <emphasis>vmods0</emphasis>
+     and <emphasis>vmods1</emphasis> of <emphasis>act</emphasis> from <emphasis>v</emphasis>.
+</literallayout>
+
+</sect2>
+<sect2 id='Actions_for_Generating_DeviceButtonPress_and_DeviceButtonRelease'>
+<title>Actions for Generating DeviceButtonPress and DeviceButtonRelease</title>
+
+<para>
+Actions associated with <emphasis>
+XkbDeviceBtnAction</emphasis>
+ structures generate <emphasis>
+DeviceButtonPress</emphasis>
+ and <emphasis>
+DeviceButtonRelease</emphasis>
+ events instead of normal <emphasis>
+KeyPress</emphasis>
+ and <emphasis>
+KeyRelease</emphasis>
+ events:
+</para>
+
+<para><programlisting>
+typedef struct _XkbDeviceBtnAction {
+      unsigned char    type;      /* <emphasis> XkbSA_DeviceBtn, XkbSA_LockDeviceBtn</emphasis> */
+      unsigned char    flags;     /* with <emphasis> type</emphasis> , specifies locking or unlocking */
+      unsigned char    count;     /* controls number of DeviceButtonPress and Release events */
+      unsigned char    button;    /* index of button on <emphasis> device</emphasis> */
+      unsigned char    device;    /* device ID of an X input extension device */
+} <emphasis>XkbDeviceBtnAction</emphasis>;
+</programlisting></para>
+
+<para>
+The <emphasis>
+type</emphasis>
+ field can have any one of the values shown in Table 16.17.
+</para>
+
+<table frame='topbot'>
+<title>Device Button Action Types</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Type</entry>
+  <entry>Effect</entry>
+</row>
+</thead>
+<tbody>
+  <row>
+    <entry><emphasis>XkbSA_DeviceBtn</emphasis></entry>
+    <entry>
+<itemizedlist>
+  <listitem>
+    <para>
+If the button specified by this action is logically down, the key press and
+corresponding release are ignored and have no effect. If the device or button
+specified by this action are illegal, this action behaves like <emphasis>
+XkbSA_NoAction</emphasis>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Otherwise, key presses cause one or more input extension device events instead
+of the usual key press event. If the <emphasis>
+count</emphasis>
+ field is zero, a key press generates a single <emphasis>
+DeviceButtonPress</emphasis>
+ event. If count is greater than zero, a key press event generates <emphasis>
+count</emphasis>
+ pairs of <emphasis>
+DeviceButtonPress</emphasis>
+ and <emphasis>
+DeviceButtonRelease</emphasis>
+ events.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If <emphasis>
+count</emphasis>
+ is zero, a key release generates an input extension <emphasis>
+DeviceButtonRelease</emphasis>
+ event that matches the event generated by the corresponding key press. If
+<emphasis>
+count</emphasis>
+ is nonzero, a key release does not cause a <emphasis>
+DeviceButtonRelease</emphasis>
+ event. Key releases never cause <emphasis>
+KeyRelease</emphasis>
+ events.
+    </para>
+  </listitem>
+</itemizedlist>
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_LockDeviceBtn</emphasis></entry>
+    <entry>
+<itemizedlist>
+  <listitem>
+    <para>
+If the device or button specified by this action are illegal, this action
+behaves like <emphasis>XkbSA_NoAction</emphasis>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Otherwise, if the specified button is not locked and the <emphasis>
+XkbSA_LockNoLock</emphasis>
+ bit is not set in the <emphasis>
+flags</emphasis>
+ field, a key press generates an input extension <emphasis>
+DeviceButtonPress</emphasis>
+ event instead of a <emphasis>
+KeyPress</emphasis>
+ event and locks the button. If the button is already locked or if <emphasis>
+XkbSA_LockNoLock</emphasis>
+ bit is set in the <emphasis>
+flags</emphasis>
+ field, the key press is ignored and has no effect.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If the corresponding key press was ignored, and if the <emphasis>
+XkbSA_LockNoUnlock</emphasis>
+ bit is not set in the <emphasis>
+flags</emphasis>
+ field, a key release generates an input extension <emphasis>
+DeviceButtonRelease</emphasis>
+ event instead of a <emphasis>
+KeyRelease</emphasis>
+ event and unlocks the button. If the corresponding key press locked a button,
+the key release is ignored and has no effect.
+    </para>
+  </listitem>
+</itemizedlist>
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+The <emphasis>
+flags</emphasis>
+ field is composed of the bitwise inclusive OR of the masks shown in Table
+16.18.
+</para>
+
+<table frame='topbot'>
+<title>Device Button Action Flags</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Flag</entry>
+  <entry>Meaning</entry>
+</row>
+</thead>
+<tbody>
+  <row>
+    <entry><emphasis>XkbSA_LockNoLock</emphasis></entry>
+    <entry>
+If set, and the action type is <emphasis>
+XkbSA_LockDeviceBtn</emphasis>
+, the server only unlocks the button.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_LockNoUnlock</emphasis></entry>
+    <entry>
+If set, and the action type is <emphasis>
+XkbSA_LockDeviceBtn</emphasis>
+, the server only locks the button.
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+</sect2>
+<sect2 id='Actions_for_Simulating_Events_from_Device_Valuators'>
+<title>Actions for Simulating Events from Device Valuators</title>
+
+<para>
+A <emphasis>
+valuator</emphasis>
+ manipulates a range of values for some entity, like a mouse axis, a slider or
+a dial. Actions associated with <emphasis>
+XkbDeviceValuatorAction</emphasis>
+ structures are used to simulate events from one or two input extension device
+valuators.
+</para>
+
+<para><programlisting>
+typedef struct _XkbDeviceValuatorAction {
+      unsigned char    type;        /*<emphasis> XkbSA_DeviceValuator</emphasis> */
+      unsigned char    device;      /* device ID */
+      unsigned char    v1_what;     /* determines how valuator is to behave for valuator 1 */
+      unsigned char    v1_ndx;      /* specifies a real valuator */
+      unsigned char    v1_value;    /* the value for valuator 1 */
+      unsigned char    v2_what;     /* determines how valuator is to behave for valuator 2 */
+      unsigned char    v2_ndx;      /* specifies a real valuator */
+      unsigned char    v2_value;    /* the value for valuator 1 */
+} <emphasis>XkbDeviceValuatorAction</emphasis>;
+</programlisting></para>
+
+<para>
+If <emphasis>
+device</emphasis>
+ is illegal or if neither <emphasis>
+v1_ndx</emphasis>
+ nor <emphasis>
+v2_ndx</emphasis>
+ specifies a legal valuator, this action behaves like <emphasis>
+XkbSA_NoAction</emphasis>.
+</para>
+
+
+<para>
+The low four bits of <emphasis>
+v1_what</emphasis>
+ and <emphasis>
+v2_what</emphasis>
+ specify the corresponding scale value (denoted <emphasis>
+val&lt;n&gt;Scale</emphasis>
+ in Table 16.17), if needed. The high four bits of <emphasis>
+v1_what</emphasis>
+ and <emphasis>
+v2_what</emphasis>
+ specify the operation to perform to set the values. The high four bits of
+<emphasis>
+v1_what</emphasis>
+ and <emphasis>
+v2_what</emphasis>
+ can have the values shown in Table 16.17; the use of <emphasis>
+val&lt;n&gt;Scale</emphasis>
+ is shown in that table also.
+</para>
+
+<table frame='topbot'>
+<title>Device Valuator v&lt;n&gt;_what High Bits Values</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Value of high bits</entry>
+  <entry>Effect</entry>
+</row>
+</thead>
+<tbody>
+  <row>
+    <entry><emphasis>XkbSA_IgnoreVal</emphasis></entry>
+    <entry>No action</entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_SetValMin</emphasis></entry>
+    <entry>
+<emphasis>v&lt;n&gt;_value</emphasis> is set to its minimum legal value.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_SetValCenter</emphasis></entry>
+    <entry>
+<emphasis>v&lt;n&gt;_value</emphasis>is centered (to (max-min)/2).
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_SetValMax</emphasis></entry>
+    <entry>
+<emphasis>v&lt;n&gt;_value</emphasis> is set to its maximum legal value.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_SetValRelative</emphasis></entry>
+    <entry>
+<emphasis>v&lt;n&gt;_value</emphasis> * (2
+<emphasis>val&lt;n&gt;Scale</emphasis>) is added to
+<emphasis>v&lt;n&gt;_value</emphasis>.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSA_SetValAbsolute</emphasis></entry>
+    <entry>
+<emphasis>v&lt;n&gt;_value</emphasis>
+ is set to (2 <emphasis>val&lt;n&gt;Scale</emphasis>).
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+Illegal values for <emphasis>
+XkbSA_SetValRelative</emphasis>
+ or <emphasis>
+XkbSA_SetValAbsolute</emphasis>
+ are clamped into range. Note that all of these possibilities are legal for
+absolute valuators. For relative valuators, only <emphasis>
+XkbSA_SetValRelative</emphasis>
+ is permitted. Part of the input extension description of a device is the range
+of legal values for all absolute valuators, whence the maximum and minimum
+legal values shown in Table 16.17.
+</para>
+
+
+<para>
+The following two masks are provided as a convenience to select either portion
+of <emphasis>
+v1_what</emphasis>
+ or <emphasis>
+v2_what</emphasis>
+:
+</para>
+
+<literallayout>
+      #define XkbSA_ValOpMask      (0x70)
+      #define XkbSA_ValScaleMask      (0x07)
+</literallayout>
+
+<para>
+<emphasis>
+v1_ndx</emphasis>
+ and <emphasis>
+v2_ndx</emphasis>
+ specify valuators that actually exists. For example, most mice have two
+valuators (x and y axes) so the only legal values for a mouse would be 0 and 1.
+For a dial box with eight dials, any value in the range 0..7 would be correct.
+</para>
+
+
+</sect2>
+<sect2 id='Obtaining_Key_Actions_for_Keys_from_the_Server'>
+<title>Obtaining Key Actions for Keys from the Server</title>
+
+<para>
+To update the actions (the <emphasis>
+key_acts</emphasis>
+ array) for a subset of the keys in a keyboard description, use <emphasis>
+XkbGetKeyActions</emphasis>
+.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbGetKeyActions</emphasis>
+(<emphasis>
+dpy</emphasis>
+,<emphasis>
+ first</emphasis>
+, <emphasis>
+num</emphasis>
+,<emphasis>
+ xkb</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *<emphasis>
+            dpy</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+first</emphasis>
+;            /* keycode of first key of interest */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+num</emphasis>
+;            /* number of keys desired */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr             <emphasis>
+xkb</emphasis>
+;            /* pointer to keyboard description where result is stored */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetKeyActions</emphasis>
+ sends a request to the server to obtain the actions for <emphasis>
+num</emphasis>
+ keys on the keyboard starting with key <emphasis>
+first</emphasis>
+. It waits for a reply and returns the actions in the <emphasis>
+server</emphasis>
+-&gt;<emphasis>
+key_acts</emphasis>
+ field of <emphasis>
+xkb</emphasis>
+. If successful, <emphasis>
+XkbGetKeyActions</emphasis>
+ returns <emphasis>
+Success</emphasis>
+. The <emphasis>
+xkb</emphasis>
+ parameter must be a pointer to a valid Xkb keyboard description.
+</para>
+
+
+<para>
+If the <emphasis>
+server</emphasis>
+ map in the <emphasis>
+xkb</emphasis>
+ parameter has not been allocated, <emphasis>
+XkbGetKeyActions</emphasis>
+ allocates and initializes it before obtaining the actions.
+</para>
+
+
+<para>
+If the server does not have a compatible version of Xkb, or the Xkb extension
+has not been properly initialized, <emphasis>
+XkbGetKeyActions</emphasis>
+ returns <emphasis>
+BadAccess</emphasis>
+. If <emphasis>
+num</emphasis>
+ is less than 1 or greater than <emphasis>
+XkbMaxKeyCount</emphasis>
+, <emphasis>
+XkbGetKeyActions</emphasis>
+ returns <emphasis>
+BadValue</emphasis>
+. If any allocation errors occur, <emphasis>
+XkbGetKeyActions</emphasis>
+ returns <emphasis>
+BadAlloc</emphasis>
+.
+</para>
+
+
+</sect2>
+<sect2 id='Changing_the_Number_of_Actions_Bound_to_a_Key'>
+<title>Changing the Number of Actions Bound to a Key</title>
+
+<para>
+To change the number of actions bound to a key, use <emphasis>
+XkbResizeKeyAction</emphasis>
+.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+XkbAction *<emphasis>
+XkbResizeKeyActions</emphasis>
+(<emphasis>
+xkb</emphasis>
+,<emphasis>
+ key</emphasis>
+,<emphasis>
+ needed</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescRec *<emphasis>
+            xkb</emphasis>
+;            /* keyboard description to change */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int <emphasis>
+            key</emphasis>
+;            /* keycode of key to change */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int <emphasis>
+            needed</emphasis>
+;            /* new number of actions required */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+The <emphasis>
+xkb</emphasis>
+ parameter points to the keyboard description containing the <emphasis>
+key</emphasis>
+ whose number of actions is to be changed. The <emphasis>
+key</emphasis>
+ parameter is the keycode of the key to change, and <emphasis>
+needed</emphasis>
+ specifies the new number of actions required for the key.
+</para>
+
+
+<para>
+<emphasis>
+XkbResizeKeyActions</emphasis>
+ reserves the space needed for the actions and returns a pointer to the
+beginning of the new array that holds the actions. It can change the <emphasis>
+acts</emphasis>
+, <emphasis>
+num_acts</emphasis>
+, and <emphasis>
+size_acts</emphasis>
+ fields of <emphasis>
+xkb</emphasis>
+-&gt;<emphasis>
+server</emphasis>
+ if it is necessary to reallocate the <emphasis>
+acts </emphasis>
+array.
+</para>
+
+
+<para>
+If <emphasis>
+needed</emphasis>
+ is greater than the current number of keysyms for the key, <emphasis>
+XkbResizeKeyActions</emphasis>
+ initializes all new actions in the array to <emphasis>
+NoAction</emphasis>
+.
+</para>
+
+
+<para>
+Because the number of actions needed by a key is normally computed as width *
+number of groups, and <emphasis>
+XkbResizeKeyActions</emphasis>
+ does not modify either the width or number of groups for the key, a
+discrepancy exists on return from <emphasis>
+XkbResizeKeyActions</emphasis>
+ between the space allocated for the actions and the number required. The
+unused entries in the list of actions returned by <emphasis>
+XkbResizeKeyActions</emphasis>
+ are not preserved across future calls to any of the map editing functions, so
+you must update the key actions (which updates the width and number of groups
+for the key) before calling another allocator function. A call to <emphasis>
+XkbChangeTypesOfKey</emphasis>
+ updates these.
+</para>
+
+
+<para>
+If any allocation errors occur while resizing the number of actions bound to
+the key, <emphasis>
+XkbResizeKeyActions</emphasis>
+ returns <emphasis>
+NULL</emphasis>
+.
+</para>
+
+<note><para>A change to the number of actions bound to a key should be
+accompanied by a change in the number of symbols bound to a key. Refer to
+section 15.3.7 for more information on changing the number of symbols bound to
+a key.</para></note>
+
+
+</sect2>
+</sect1>
+<sect1 id='Key_Behavior'>
+<title>Key Behavior</title>
+
+<para>
+Key behavior refers to the demeanor of a key. For example, the expected
+behavior of the <emphasis>
+CapsLock</emphasis>
+ key is that it logically locks when pressed, and then logically unlocks when
+pressed again.
+</para>
+
+
+<sect2 id='Radio_Groups_2'>
+<title>Radio Groups</title>
+
+<para>
+Keys that belong to the same radio group have the <emphasis>
+XkbKB_RadioGroup</emphasis>
+ type in the <emphasis>
+type</emphasis>
+ field and the radio group index specified in the <emphasis>
+data</emphasis>
+ field in the <emphasis>
+XkbBehavior</emphasis>
+ structure. If the radio group has a name in the <emphasis>
+XkbNamesRec</emphasis>
+ structure, the radio group index is the index into the <emphasis>
+radio_group</emphasis>
+ array in the <emphasis>
+XkbNamesRec</emphasis>
+ structure. A radio group key when pressed stays logically down until another
+key in the radio group is pressed, when the first key becomes logically up and
+the new key becomes logically down. Setting the <emphasis>
+XkbKB_RGAllowNone</emphasis>
+ bit in the behavior for all of the keys of the radio group means that pressing
+the logically down member of the radio group causes it to logically release, in
+which case none of the keys of the radio group would be logically down. If
+<emphasis>
+XkbKB_RGAllowNone</emphasis>
+ is not set, there is no way to release the logically down member of the group.
+</para>
+
+
+<para>
+The low five bits of the <emphasis>
+data</emphasis>
+ field of the <emphasis>
+XkbBehavior</emphasis>
+ structure are the group number, the high three bits are flags. The only flag
+currently defined is:
+</para>
+
+<para><programlisting>
+#define      XkbRG_AllowNone      0x80
+</programlisting></para>
+
+</sect2>
+<sect2 id='The_XkbBehavior_Structure'>
+<title>The XkbBehavior Structure</title>
+
+<para>
+The <emphasis>
+behaviors</emphasis>
+ field of the server map is an array of <emphasis>
+XkbBehavior</emphasis>
+ structures, indexed by keycode, and contains the behavior for each key. The
+<emphasis>
+XkbBehavior</emphasis>
+ structure is defined as follows:
+</para>
+
+<para><programlisting>
+typedef struct _XkbBehavior {
+      unsigned char  type;                  /* behavior type + optional
+                                               <emphasis> XkbKB_Permanent</emphasis> bit */
+      unsigned char  data;
+} <emphasis>XkbBehavior</emphasis>;
+</programlisting></para>
+
+<para>
+The <emphasis>
+type</emphasis>
+ field specifies the Xkb behavior, and the value of the <emphasis>
+data</emphasis>
+ field depends on the <emphasis>
+type</emphasis>
+. Xkb supports the key behaviors shown in Table 16.20.
+</para>
+
+<table frame='topbot'>
+<title>Key Behaviors</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c2' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Type</entry>
+  <entry>Effect</entry>
+</row>
+</thead>
+<tbody>
+  <row>
+    <entry><emphasis>XkbKB_Default</emphasis></entry>
+    <entry>
+Press and release events are processed normally. The <emphasis>
+data</emphasis>
+ field is unused.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbKB_Lock</emphasis></entry>
+    <entry>
+If a key is logically up (that is, the corresponding bit of the core key map is
+cleared) when it is pressed, the key press is processed normally and the
+corresponding release is ignored. If the key is logically down when pressed,
+the key press is ignored but the corresponding release is processed normally.
+The <emphasis>
+data</emphasis>
+ field is unused.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbKB_RadioGroup</emphasis></entry>
+    <entry>
+      <para>
+If another member of the radio group is logically down (all members of the
+radio group have the same index, specified in <emphasis>
+data</emphasis>
+) when a key is pressed, the server synthesizes a key release for the member
+that is logically down and then processes the new key press event normally.
+      </para>
+      <para>
+If the key itself is logically down when pressed, the key press event is
+ignored, but the processing of the corresponding key release depends on the
+value of the <emphasis>
+Xkb_RGAllowNone</emphasis>
+ bit in <emphasis>
+flags</emphasis>
+. If it is set, the key release is processed normally; otherwise, the key
+release is also ignored.
+      </para>
+      <para>
+All other key release events are ignored.
+      </para>
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbKB_Overlay1</emphasis></entry>
+    <entry>
+If the <emphasis>
+Overlay1</emphasis>
+ control is enabled (see section 10.4), <emphasis>
+data</emphasis>
+ is interpreted as a keycode, and events from this key are reported as if they
+came from <emphasis>
+data</emphasis>
+’s keycode. Otherwise, press and release events are processed normally.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbKB_Overlay2</emphasis></entry>
+    <entry>
+If the <emphasis>
+Overlay2</emphasis>
+ control is enabled (see section 10.4), <emphasis>
+data</emphasis>
+ is interpreted as a keycode, and events from this key are reported as if they
+came from <emphasis>
+data</emphasis>
+’s keycode. Otherwise, press and release events are processed normally.
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+Xkb also provides the mask, <emphasis>
+XkbKB_Permanent</emphasis>
+ to specify whether the key behavior type should be simulated by Xkb or whether
+the key behavior describes an unalterable physical, electrical, or software
+aspect of the keyboard. If the <emphasis>
+XkbKB_Permanent</emphasis>
+ bit is not set in the <emphasis>
+type</emphasis>
+ field, Xkb simulates the behavior in software. Otherwise, Xkb relies upon the
+keyboard to implement the behavior.
+</para>
+
+
+</sect2>
+<sect2 id='Obtaining_Key_Behaviors_for_Keys_from_the_Server'>
+<title>Obtaining Key Behaviors for Keys from the Server</title>
+
+<para>
+To obtain the behaviors (the <emphasis>
+behaviors</emphasis>
+ array) for a subset of the keys in a keyboard description from the server, use
+<emphasis>
+XkbGetKeyBehaviors</emphasis>
+:
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbGetKeyBehaviors</emphasis>
+(<emphasis>
+dpy</emphasis>
+,<emphasis>
+ first</emphasis>
+,<emphasis>
+ num</emphasis>
+,<emphasis>
+ xkb</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *<emphasis>
+            dpy</emphasis>
+;            /* connection to server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+first</emphasis>
+;            /* keycode of first key to get */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+num</emphasis>
+;            /* number of keys for which behaviors are desired */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr             <emphasis>
+xkb</emphasis>
+;            /* Xkb description to contain the result */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetKeyBehaviors</emphasis>
+ sends a request to the server to obtain the behaviors for <emphasis>
+num</emphasis>
+ keys on the keyboard starting with the key whose keycode is <emphasis>
+first</emphasis>
+. It waits for a reply and returns the behaviors in the <emphasis>
+server</emphasis>
+-&gt;<emphasis>
+behaviors</emphasis>
+ field of <emphasis>
+xkb</emphasis>
+. If successful, <emphasis>
+XkbGetKeyBehaviors</emphasis>
+ returns <emphasis>
+Success</emphasis>
+.
+</para>
+
+
+<para>
+If the <emphasis>
+server</emphasis>
+ map in the <emphasis>
+xkb</emphasis>
+ parameter has not been allocated, <emphasis>
+XkbGetKeyBehaviors</emphasis>
+ allocates and initializes it before obtaining the actions.
+</para>
+
+
+<para>
+If the server does not have a compatible version of Xkb, or the Xkb extension
+has not been properly initialized, <emphasis>
+XkbGetKeyBehaviors</emphasis>
+ returns <emphasis>
+BadAccess</emphasis>
+. If <emphasis>
+num</emphasis>
+ is less than 1 or greater than <emphasis>
+XkbMaxKeyCount</emphasis>
+, <emphasis>
+XkbGetKeyBehaviors</emphasis>
+ returns <emphasis>
+BadValue</emphasis>
+. If any allocation errors occur, <emphasis>
+XkbGetKeyBehaviors</emphasis>
+ returns <emphasis>
+BadAlloc</emphasis>
+.
+</para>
+
+
+</sect2>
+</sect1>
+<sect1 id='Explicit_ComponentsAvoiding_Automatic_Remapping_by_the_Server'>
+<title>Explicit Components—Avoiding Automatic Remapping by the Server</title>
+
+<para>
+Whenever a client remaps the keyboard using core protocol requests, Xkb
+examines the map to determine likely default values for the components that
+cannot be specified using the core protocol (see section 17.1.2 for more
+information on how Xkb chooses the default values).
+</para>
+
+
+<para>
+This automatic remapping might replace definitions explicitly requested by an
+application, so the Xkb keyboard description defines an explicit components
+mask for each key. Any aspects of the automatic remapping listed in the
+explicit components mask for a key are not changed by the automatic keyboard
+mapping.
+</para>
+
+
+<para>
+The explicit components masks are held in the <emphasis>
+explicit</emphasis>
+ field of the server map, which is an array indexed by keycode. Each entry in
+this array is a mask that is a bitwise inclusive OR of the values shown in
+Table 16.21.
+</para>
+
+<table frame='topbot'>
+<title>Explicit Component Masks</title>
+<?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='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Bit in Explicit Mask</entry>
+  <entry>Value</entry>
+  <entry>Protects Against</entry>
+</row>
+</thead>
+<tbody>
+  <row>
+    <entry><emphasis>ExplicitKeyType1</emphasis></entry>
+    <entry>(1&lt;&lt;0)</entry>
+    <entry>
+Automatic determination of the key type associated with <emphasis>
+Group1.</emphasis>
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>ExplicitKeyType2</emphasis></entry>
+    <entry>(1&lt;&lt;1)</entry>
+    <entry>
+Automatic determination of the key type associated with <emphasis>
+Group2.</emphasis>
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>ExplicitKeyType3</emphasis></entry>
+    <entry>(1&lt;&lt;2)</entry>
+    <entry>
+Automatic determination of the key type associated with <emphasis>
+Group3.</emphasis>
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>ExplicitKeyType4</emphasis></entry>
+    <entry>(1&lt;&lt;3)</entry>
+    <entry>
+Automatic determination of the key type associated with <emphasis>
+Group4.</emphasis>
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>ExplicitInterpret</emphasis></entry>
+    <entry>(1&lt;&lt;4)</entry>
+    <entry>
+Application of any of the fields of a symbol interpretation to the
+key in question.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>ExplicitAutoRepeat</emphasis></entry>
+    <entry>(1&lt;&lt;5)</entry>
+    <entry>Automatic determination of auto-repeat status for the key, as
+specified in a symbol interpretation.</entry>
+  </row>
+  <row>
+    <entry><emphasis>ExplicitBehavior</emphasis></entry>
+    <entry>(1&lt;&lt;6)</entry>
+    <entry>
+Automatic assignment of the <emphasis>
+XkbKB_Lock</emphasis>
+ behavior to the key, if the <emphasis>
+XkbSI_LockingKey</emphasis>
+ flag is set in a symbol interpretation.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>ExplicitVModMap</emphasis></entry>
+    <entry>(1&lt;&lt;7)</entry>
+    <entry>
+Automatic determination of the virtual modifier map for the key
+based on the actions assigned to the key and the symbol interpretations that
+match the key.
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<sect2 id='Obtaining_Explicit_Components_for_Keys_from_the_Server'>
+<title>Obtaining Explicit Components for Keys from the Server</title>
+
+<para>
+To obtain the explicit components (the <emphasis>
+explicit</emphasis>
+ array) for a subset of the keys in a keyboard description, use <emphasis>
+XkbGetKeyExplicitComponents</emphasis>.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbGetKeyExplicitComponents</emphasis>
+(<emphasis>
+dpy</emphasis>
+,<emphasis>
+ first</emphasis>
+,<emphasis>
+ num</emphasis>
+,<emphasis>
+ xkb</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *<emphasis>
+            dpy</emphasis>
+;            /* connection to server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+first</emphasis>
+;            /* keycode of first key to fetch */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+num</emphasis>
+;            /* number of keys for which to get explicit info */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr             <emphasis>
+xkb</emphasis>
+;            /* Xkb description in which to put results */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetKeyExplicitComponents</emphasis>
+ sends a request to the server to obtain the explicit components for <emphasis>
+num</emphasis>
+ keys on the keyboard starting with key <emphasis>
+first</emphasis>
+. It waits for a reply and returns the explicit components in the <emphasis>
+server</emphasis>
+-&gt;<emphasis>
+explicit</emphasis>
+ array of <emphasis>
+xkb</emphasis>
+. If successful, <emphasis>
+XkbGetKeyExplicitComponents</emphasis>
+ returns <emphasis>
+Success</emphasis>
+. The <emphasis>
+xkb</emphasis>
+ parameter must be a pointer to a valid Xkb keyboard description.
+</para>
+
+
+<para>
+If the <emphasis>
+server</emphasis>
+ map in the <emphasis>
+xkb</emphasis>
+ parameter has not been allocated, <emphasis>
+XkbGetKeyExplicitComponents</emphasis>
+ allocates and initializes it before obtaining the actions.
+</para>
+
+
+<para>
+If the server does not have a compatible version of Xkb, or the Xkb extension
+has not been properly initialized, <emphasis>
+XkbGetKeyExplicitComponents</emphasis>
+ returns <emphasis>
+BadMatch</emphasis>
+. If <emphasis>
+num</emphasis>
+ is less than 1 or greater than <emphasis>
+XkbMaxKeyCount</emphasis>
+, <emphasis>
+XkbGetKeyExplicitComponents</emphasis>
+ returns <emphasis>
+BadValue</emphasis>
+. If any allocation errors occur, <emphasis>
+XkbGetKeyExplicitComponents</emphasis>
+ returns <emphasis>
+BadAlloc</emphasis>
+.
+</para>
+
+
+</sect2>
+</sect1>
+<sect1 id='Virtual_Modifier_Mapping'>
+<title>Virtual Modifier Mapping</title>
+
+<para>
+The <emphasis>
+vmods</emphasis>
+ member of the server map is a fixed-length array containing <emphasis>
+XkbNumVirtualMods</emphasis>
+ entries. Each entry corresponds to a virtual modifier and provides the binding
+of the virtual modifier to the real modifier bits. Each entry in the <emphasis>
+vmods</emphasis>
+ array is a bitwise inclusive OR of the legal modifier masks:
+</para>
+
+<literallayout>
+     <emphasis>ShiftMask</emphasis>
+     <emphasis>LockMask</emphasis>
+     <emphasis>ControlMask</emphasis>
+     <emphasis>Mod1Mask</emphasis>
+     <emphasis>Mod2Mask</emphasis>
+     <emphasis>Mod3Mask</emphasis>
+     <emphasis>Mod4Mask</emphasis>
+     <emphasis>Mod5Mask</emphasis>
+</literallayout>
+
+<para>
+The <emphasis>
+vmodmap</emphasis>
+ member of the server map is similar to the <emphasis>
+modmap</emphasis>
+ array of the client map (see section 15.4), but is used to define the virtual
+modifier mapping for each key. Like the <emphasis>
+modmap</emphasis>
+ member, it is indexed by keycode, and each entry is a mask representing the
+virtual modifiers bound to the corresponding key:
+</para>
+
+<itemizedlist>
+  <listitem>
+    <para>
+Each of the bits in a <emphasis>
+vmodmap</emphasis>
+ entry represents an index into the <emphasis>
+vmods</emphasis>
+ member. That is, bit 0 of a <emphasis>
+vmodmap</emphasis>
+ entry refers to index 0 of the <emphasis>
+vmods</emphasis>
+ array, bit 1 refers to index 1, and so on.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If a bit is set in the <emphasis>
+vmodmap</emphasis>
+ entry for a key, that key is bound to the corresponding virtual modifier in
+the <emphasis>
+vmods</emphasis>
+ array.
+    </para>
+  </listitem>
+</itemizedlist>
+
+<para>
+The <emphasis>
+vmodmap</emphasis>
+ and <emphasis>
+vmods</emphasis>
+ members of the server map are the "master" virtual modifier definitions. Xkb
+automatically propagates any changes to these fields to all other fields that
+use virtual modifier mappings.
+</para>
+
+
+<para>
+The overall relationship of fields dealing with virtual modifiers in an Xkb
+keyboard description are shown in Figure 16.2.
+</para>
+
+<mediaobject>
+ <imageobject> <imagedata format="SVG" fileref="XKBlib-17.svg"/>
+ </imageobject>
+<caption>Virtual Modifier Relationships</caption>
+</mediaobject>
+
+
+
+<!--
+<H5 CLASS="Figure">
+Virtual Modifier Relationships</H5>
+-->
+
+<sect2 id='Obtaining_Virtual_Modifier_Bindings_from_the_Server'>
+<title>Obtaining Virtual Modifier Bindings from the Server</title>
+
+<para>
+To obtain a subset of the virtual modifier bindings (the <emphasis>
+vmods</emphasis>
+ array) in a keyboard description, use <emphasis>
+XkbGetVirtualMods</emphasis>
+:
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbGetVirtualMods</emphasis>
+(<emphasis>
+dpy</emphasis>
+,<emphasis>
+ which</emphasis>
+,<emphasis>
+ xkb</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *<emphasis>
+            dpy</emphasis>
+;            /* connection to server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+which</emphasis>
+;            /* mask indicating virtual modifier bindings to get */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr            <emphasis>
+xkb</emphasis>
+;            /* Xkb description where results will be placed */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetVirtualMods</emphasis>
+ sends a request to the server to obtain the <emphasis>
+vmods</emphasis>
+ entries for the virtual modifiers specified in the mask, <emphasis>
+which</emphasis>
+, and waits for a reply. See section 7.1 for a description of how to determine
+the virtual modifier mask. For each bit set in <emphasis>
+which</emphasis>
+, <emphasis>
+XkbGetVirtualMods</emphasis>
+ updates the corresponding virtual modifier definition in the <emphasis>
+server-&gt;vmods</emphasis>
+ array of <emphasis>
+xkb</emphasis>
+. The <emphasis>
+xkb</emphasis>
+ parameter must be a pointer to a valid Xkb keyboard description. If
+successful, <emphasis>
+XkbGetVirtualMods</emphasis>
+ returns <emphasis>
+Success</emphasis>
+.
+</para>
+
+
+<para>
+If the <emphasis>
+server</emphasis>
+ map has not been allocated in the <emphasis>
+xkb</emphasis>
+ parameter, <emphasis>
+XkbGetVirtualMods</emphasis>
+ allocates and initializes it before obtaining the virtual modifier bindings.
+</para>
+
+
+<para>
+If the server does not have a compatible version of Xkb, or the Xkb extension
+has not been properly initialized, <emphasis>
+XkbGetVirtualMods</emphasis>
+ returns <emphasis>
+BadMatch</emphasis>
+. Any errors in allocation cause <emphasis>
+XkbGetVirtualMods </emphasis>
+to return <emphasis>
+BadAlloc</emphasis>.
+</para>
+
+
+</sect2>
+<sect2 id='Obtaining_Per_Key_Virtual_Modifier_Mappings_from_the_Server'>
+<title>Obtaining Per-Key Virtual Modifier Mappings from the Server</title>
+
+<para>
+To obtain the virtual modifier map (the <emphasis>
+vmodmap</emphasis>
+ array) for a subset of the keys in a keyboard description, use <emphasis>
+XkbGetKeyVirtualModMap</emphasis>
+:
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbGetKeyVirtualModMap</emphasis>
+(<emphasis>
+dpy</emphasis>
+,<emphasis>
+ first</emphasis>
+,<emphasis>
+ num</emphasis>
+,<emphasis>
+ xkb</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *<emphasis>
+            dpy</emphasis>
+;            /* connection to server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+first</emphasis>
+;            /* keycode of first key to fetch */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+num</emphasis>
+;            /* # keys for which virtual mod maps are desired */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr             <emphasis>
+xkb</emphasis>
+;            /* Xkb description where results will be placed */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetKeyVirutalModmap </emphasis>
+sends a request to the server to obtain the virtual modifier mappings for
+<emphasis>
+num</emphasis>
+ keys on the keyboard starting with key <emphasis>
+first</emphasis>
+. It waits for a reply and returns the virtual modifier mappings in the
+<emphasis>
+server</emphasis>
+-&gt;<emphasis>
+vmodmap</emphasis>
+ array of <emphasis>
+xkb</emphasis>
+. If successful, <emphasis>
+XkbGetKeyVirtualModMap</emphasis>
+ returns <emphasis>
+Success</emphasis>
+. The <emphasis>
+xkb</emphasis>
+ parameter must be a pointer to a valid Xkb keyboard description
+</para>
+
+
+<para>
+If the <emphasis>
+server</emphasis>
+ map in the <emphasis>
+xkb</emphasis>
+ parameter has not been allocated, <emphasis>
+XkbGetKeyVirtualModMap</emphasis>
+ allocates and initializes it before obtaining the virtual modifier mappings.
+</para>
+
+
+<para>
+If the server does not have a compatible version of Xkb, or the Xkb extension
+has not been properly initialized, <emphasis>
+XkbGetKeyVirtualModMap</emphasis>
+ returns <emphasis>
+BadMatch</emphasis>
+. If <emphasis>
+num</emphasis>
+ is less than 1 or greater than <emphasis>
+XkbMaxKeyCount</emphasis>
+, <emphasis>
+XkbGetKeyVirtualModMap</emphasis>
+ returns <emphasis>
+BadValue</emphasis>
+. If any allocation errors occur, <emphasis>
+XkbGetKeyVirtualModMap</emphasis>
+ returns <emphasis>
+BadAlloc</emphasis>
+.
+</para>
+
+</sect2>
+</sect1>
+</chapter>
diff --git a/specs/XKB/ch17.xml b/specs/XKB/ch17.xml
new file mode 100644 (file)
index 0000000..32a1c8c
--- /dev/null
@@ -0,0 +1,1805 @@
+<chapter id='The_Xkb_Compatibility_Map'>
+<title>The Xkb Compatibility Map</title>
+
+<para>
+As shown in Figure 17.1, the X server is normally dealing with more than one
+client, each of which may be receiving events from the keyboard, and each of
+which may issue requests to modify the keyboard in some manner. Each client may
+be either Xkb-unaware, Xkb-capable, or Xkb-aware. The server itself may be
+either Xkb-aware or Xkb-unaware. If the server is Xkb-unaware, Xkb state and
+keyboard mappings are not involved in any manner, and Xkb-aware clients may not
+issue Xkb requests to the server. If the server is Xkb-aware, the server must
+be able to deliver events and accept requests in which the keyboard state and
+mapping are compatible with the mode in which the client is operating.
+Consequently, for some situations, conversions must be made between Xkb state /
+keyboard mappings and core protocol state / keyboard mappings, and vice versa.
+</para>
+
+<mediaobject>
+ <imageobject> <imagedata format="SVG" fileref="XKBlib-18.svg"/>
+ </imageobject>
+ <caption>Server Interaction with Types of Clients</caption>
+</mediaobject>
+
+
+
+<para>
+In addition to these situations involving a single server, there are cases
+where a client that deals with multiple servers may need to configure keyboards
+on different servers to be similar and the different servers may not all be
+Xkb-aware. Finally, a client may be dealing with descriptions of keyboards
+(files, and so on) that are based on core protocol and therefore may need to be
+able to map these descriptions to Xkb descriptions.
+</para>
+
+
+<para>
+An Xkb-aware server maintains keyboard state and mapping as an Xkb keyboard
+state and an Xkb keyboard mapping plus a compatibility map used to convert from
+Xkb components to core components and vice versa. In addition, the server also
+maintains a core keyboard mapping that approximates the Xkb keyboard mapping.
+The core keyboard mapping may be updated piecemeal, on a per-key basis. When
+the server receives a core protocol <emphasis>
+ChangeKeyboardMapping</emphasis>
+ or <emphasis>
+SetModifierMapping</emphasis>
+ request, it updates its core keyboard mapping, then uses the compatibility map
+to update its Xkb keyboard mapping. When the server receives an <emphasis>
+XkbSetMap</emphasis>
+ request, it updates those portions of its Xkb keyboard mapping specified by
+the request, then uses its compatibility map to update the corresponding parts
+of its core keyboard map. Consequently, the server’s Xkb keyboard map and
+also its core keyboard map may contain components that were set directly and
+others that were computed. Figure 17.2 illustrates these relationships.
+</para>
+
+<note><para>The core keyboard map is contained only in the server, not in any
+client-side data structures.</para></note>
+
+<mediaobject>
+ <imageobject> <imagedata format="SVG" fileref="XKBlib-19.svg"/>
+ </imageobject>
+ <caption>Server Derivation of State and Keyboard Mapping Components</caption>
+</mediaobject>
+
+
+
+<para>
+There are three kinds of compatibility transformations made by the server:
+</para>
+
+<orderedlist>
+  <listitem>
+    <para><emphasis role='bold'>Xkb State to Core State</emphasis></para>
+    <para>
+Keyboard state information reported to a client in the state field of various
+core events may be translated from the Xkb keyboard state maintained by the
+server, which includes a group number, to core protocol state, which does
+not.
+    </para>
+    <para>
+In addition, whenever the Xkb state is retrieved, the <emphasis>
+compat_state</emphasis>
+, <emphasis>
+compat_grab_mods</emphasis>
+, and <emphasis>
+compat_lookup_mods</emphasis>
+ fields of the <emphasis>
+XkbStateRec</emphasis>
+ returned indicate the result of applying the compatibility map to the current
+Xkb state in the server.
+    </para>
+  </listitem>
+  <listitem>
+    <para><emphasis role='bold'>Core Keyboard Mapping to Xkb Keyboard Mapping</emphasis></para>
+    <para>
+After core protocol requests received by the server to change the keyboard
+mapping (<emphasis>
+ChangeKeyboardMapping</emphasis>
+ and <emphasis>
+SetModifierMapping</emphasis>
+) have been applied to the server’s core keyboard map, the results must be
+transformed to achieve an equivalent change of the Xkb keyboard mapping
+maintained by the server.
+    </para>
+  </listitem>
+  <listitem>
+    <para><emphasis role='bold'>Xkb Keyboard Mapping to Core Keyboard Mapping</emphasis></para>
+    <para>
+After Xkb protocol requests received by the server to change the keyboard
+mapping (<emphasis>
+XkbSetMap</emphasis>
+) have been applied to the server’s Xkb keyboard map, the results are
+transformed to achieve an approximately equivalent change to the core keyboard
+mapping maintained by the server.
+    </para>
+  </listitem>
+</orderedlist>
+
+<para>
+This chapter discusses how a client may modify the compatibility map so that
+subsequent transformations have a particular result.
+</para>
+
+
+<sect1 id='The_XkbCompatMap_Structure'>
+<title>The XkbCompatMap Structure</title>
+
+<para>
+All configurable aspects of mapping Xkb state and configuration to and from
+core protocol state and configuration are defined by a compatibility map,
+contained in an <emphasis>
+XkbCompatMap</emphasis>
+ structure; plus a set of explicit override controls used to prevent particular
+components of type 2 (core-to-Xkb keyboard mapping) transformations from
+automatically occurring. These explicit override controls are maintained in a
+separate data structure discussed in section 16.3. <!-- xref -->
+</para>
+
+
+<para>
+The <emphasis>
+compat</emphasis>
+ member of an Xkb keyboard description (<emphasis>
+XkbDescRec</emphasis>
+) points to the<emphasis>
+ XkbCompatMap</emphasis>
+ structure:
+</para>
+
+<para><programlisting>
+typedef struct _XkbCompatMapRec {
+      XkbSymInterpretPtr   sym_interpret;            /* symbol based key semantics*/
+      XkbModsRec           groups[XkbNumKbdGroups];  /* group =&gt; modifier map */
+      unsigned short       num_si;                   /* # structures used in
+                                                        <emphasis>sym_interpret</emphasis> */
+      unsigned short       size_si;                  /* # structures allocated in
+                                                        <emphasis>sym_interpret</emphasis> */
+} <emphasis>XkbCompatMapRec</emphasis>, *XkbCompatMapPtr;
+</programlisting></para>
+
+<mediaobject>
+ <imageobject> <imagedata format="SVG" fileref="XKBlib-20.svg"/>
+ </imageobject>
+ <caption>Xkb Compatibility Data Structures</caption>
+</mediaobject>
+
+
+<para>
+The subsections that follow discuss how the compatibility map and explicit
+override controls are used in each of the three cases where compatibility
+transformations are made.
+</para>
+
+<sect2 id='Xkb_State_to_Core_Protocol_State_Transformation'>
+<title>Xkb State to Core Protocol State Transformation</title>
+
+<para>
+As shown in Figure 17.3, there are four <emphasis>
+group compatibility maps</emphasis>
+ (contained in <emphasis>
+groups</emphasis>
+ [0..3]) in the <emphasis>
+XkbCompatMapRec</emphasis>
+ structure, one per possible Xkb group. Each group compatibility map is a
+modifier definition (see section 7.2 for a description of modifier
+definitions). The <emphasis>
+mask</emphasis>
+ component of the definition specifies which real modifiers should be set in
+the core protocol state field when the corresponding group is active. Because
+only one group is active at any one time, only one of the four possible
+transformations is ever applied at any one point in time. If the device
+described by the <emphasis>
+XkbDescRec</emphasis>
+ does not support four groups, the extra groups fields are present, but
+undefined.
+</para>
+
+<para>
+Normally, the Xkb-aware server reports keyboard state in the <emphasis>
+state</emphasis>
+ member of events such as a <emphasis>
+KeyPress</emphasis>
+ event and <emphasis>
+ButtonPress</emphasis>
+ event, encoded as follows:
+</para>
+
+<informaltable frame='topbot'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c1' colwidth='2.0*'/>
+<thead>
+  <row rowsep='1'>
+    <entry>bits</entry>
+    <entry>meaning</entry>
+  </row>
+</thead>
+<tbody>
+  <row>
+    <entry>15</entry>
+    <entry>0</entry>
+  </row>
+  <row>
+    <entry>13-14</entry>
+    <entry>Group index</entry>
+  </row>
+  <row>
+    <entry>8-12</entry>
+    <entry>Pointer Buttons</entry>
+  </row>
+  <row>
+    <entry>0-7</entry>
+    <entry>Modifiers</entry>
+  </row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+For Xkb-unaware clients, only core protocol keyboard information may be
+reported. Because core protocol does not define the group index, the group
+index is mapped to modifier bits as specified by the <emphasis>
+groups</emphasis>
+[group index] field of the compatibility map (the bits set in the compatibility
+map are ORed into bits 0-7 of the state), and bits 13-14 are reported in the
+event as zero.
+</para>
+
+</sect2>
+<sect2 id='Core_Keyboard_Mapping_to_Xkb_Keyboard_Mapping_Transformation'>
+<title>Core Keyboard Mapping to Xkb Keyboard Mapping Transformation</title>
+
+<para>
+When a core protocol keyboard mapping request is received by the server, the
+server’s core keyboard map is updated, and then the Xkb map maintained by the
+server is updated. Because a client may have explicitly configured some of the
+Xkb keyboard mapping in the server, this automatic regeneration of the Xkb
+keyboard mapping from the core protocol keyboard mapping should not modify any
+components of the Xkb keyboard mapping that were explicitly set by a client.
+The client must set explicit override controls to prevent this from happening
+(see section 16.3). The core-to-Xkb mapping is done as follows:
+</para>
+
+<orderedlist>
+  <listitem>
+    <para>
+Map the symbols from the keys in the core keyboard map to groups and symbols on
+keys in the Xkb keyboard map. The core keyboard mapping is of fixed width, so
+each key in the core mapping has the same number of symbols associated with it.
+The Xkb mapping allows a different number of symbols to be associated with each
+key; those symbols may be divided into a different number of groups (1-4) for
+each key. For each key, this process therefore involves partitioning the fixed
+number of symbols from the core mapping into a set of variable-length groups
+with a variable number of symbols in each group. For example, if the core
+protocol map is of width five, the partition for one key might result in one
+group with two symbols and another with three symbols. A different key might
+result in two groups with two symbols plus a third group with one symbol. The
+core protocol map requires at least two symbols in each of the first two
+groups.
+    </para>
+    <orderedlist>
+      <listitem>
+        <para>
+For each changed key, determine the number of groups represented in the new
+core keyboard map. This results in a tentative group count for each key in the
+Xkb map.
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+For each changed key, determine the number of symbols in each of the groups
+found in step 1a. There is one explicit override control associated with each
+of the four possible groups for each Xkb key, <emphasis>
+ExplicitKeyType1</emphasis>
+ through <emphasis>
+ExplicitKeyType4</emphasis>
+. If no explicit override control is set for a group, the number of symbols
+used for that group from the core map is two.  If the explicit override control
+is set for a group on the key, the number of symbols used for that Xkb group
+from the core map is the width of the Xkb group with one exception: because of
+the core protocol requirement for at least two symbols in each of groups one
+and two, the number of symbols used for groups one and two is the maximum of 2
+or the width of the Xkb group.
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+For each changed key, assign the symbols in the core map to the appropriate
+group on the key. If the total number of symbols required by the Xkb map for a
+particular key needs more symbols than the core protocol map contains, the
+additional symbols are taken to be <emphasis>
+NoSymbol</emphasis>
+ keysyms appended to the end of the core set. If the core map contains more
+symbols than are needed by the Xkb map, trailing symbols in the core map are
+discarded. In the absence of an explicit override for group one or two, symbols
+are assigned in order by group; the first symbols in the core map are assigned
+to group one, in order, followed by group two, and so on. For example, if the
+core map contained eight symbols per key, and a particular Xkb map contained 2
+symbols for G1 and G2 and three for G3, the symbols would be assigned as (G is
+group, L is shift level):
+        </para>
+<literallayout>
+          G1L1 G1L2 G2L1 G2L2 G3L1 G3L2 G3L3
+</literallayout>
+        <para>
+If an explicit override control is set for group one or two, the symbols are
+taken from the core set in a somewhat different order. The first four symbols
+from the core set are assigned to G1L1, G1L2, G2L1, G2L2, respectively. If
+group one requires more symbols, they are taken next, and then any additional
+symbols needed by group two. Group three and four symbols are taken in complete
+sequence after group two. For example, a key with four groups and three symbols
+in each group would take symbols from the core set in the following order:
+        </para>
+<literallayout>
+G1L1 G1L2 G2L1 G2L2 G1L3 G2L3 G3L1 G3L2 G3L3 G4L1 G4L2 G4L3
+</literallayout>
+        <para>
+As previously noted, the core protocol map requires at lease two symbols in
+groups one and two. Because of this, if an explicit override control for an Xkb
+key is set and group one and / or group two is of width one, it is not possible
+to generate the symbols taken from the core protocol set and assigned to
+position G1L2 and / or G2L2.
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+For each group on each changed key, assign a key type appropriate for the
+symbols in the group.
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+For each changed key, remove any empty or redundant groups.
+        </para>
+      </listitem>
+    </orderedlist>
+  </listitem>
+  <listitem>
+    <para>
+At this point, the groups and their associated symbols have been assigned to
+the corresponding key definitions in the Xkb map.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Apply symbol interpretations to modify key operation. This phase is completely
+skipped if the  <emphasis>
+ExplicitInterpret</emphasis>
+ override control bit is set in the explicit controls mask for the Xkb key (see
+section 16.3).
+    </para>
+    <orderedlist>
+      <listitem>
+        <para>
+For each symbol on each changed key, attempt to match the symbol and modifiers
+from the Xkb map to a symbol interpretation describing how to generate the
+symbol.
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+When a match is found in step 2a, apply the symbol interpretation to change the
+semantics associated with the symbol in the Xkb key map. If no match is found,
+apply a default interpretation.
+        </para>
+      </listitem>
+    </orderedlist>
+  </listitem>
+</orderedlist>
+
+<para>
+The symbol interpretations used in step 2 are configurable and may be specified
+using <emphasis>
+XkbSymInterpretRec</emphasis>
+ structures referenced by the <emphasis>
+sym_interpret</emphasis>
+ field of an <emphasis>
+XkbCompatMapRec</emphasis>
+ (see Figure 17.3).
+</para>
+
+<sect3 id='Symbol_Interpretations__the_XkbSymInterpretRec_Structure'>
+<title>Symbol Interpretations — the XkbSymInterpretRec Structure</title>
+
+<para>
+Symbol interpretations are used to guide the X server when it modifies the Xkb
+keymap in step 2. An initial set of symbol interpretations is loaded by the
+server when it starts. A client may add new ones using <emphasis>
+XkbSetCompatMap</emphasis>
+ (see section 17.4).
+</para>
+
+
+<para>
+Symbol interpretations result in key semantics being set. When a symbol
+interpretation is applied, the following components of server key event
+processing may be modified for the particular key involved:
+</para>
+
+<literallayout>
+      Virtual modifier map
+      Auto repeat
+      Key behavior (may be set to <emphasis>XkbKB_Lock</emphasis>)
+      Key action (see section 16.1)
+</literallayout>
+
+<para>
+The <emphasis>XkbSymInterpretRec</emphasis>
+structure specifies a symbol interpretation:
+</para>
+
+<para><programlisting>
+typedef struct {
+      KeySym          sym;          /* keysym of interest or <emphasis>NULL</emphasis> */
+      unsigned char   flags;        /* <emphasis>XkbSI_AutoRepeat, XkbSI_LockingKey</emphasis> */
+      unsigned char   match;        /* specifies how mods is interpreted */
+      unsigned char   mods;         /* modifier bits, correspond to eight real modifiers */
+      unsigned char   virtual_mod;  /* 1 modifier to add to key virtual mod map */
+      XkbAnyAction    act;          /* action to bind to symbol position on key */
+} <emphasis>XkbSymInterpretRec</emphasis>,*XkbSymInterpretPtr;
+</programlisting></para>
+
+<para>
+If <emphasis>
+sym</emphasis>
+ is not <emphasis>
+NULL</emphasis>
+, it limits the symbol interpretation to keys on which that particular keysym
+is selected by the modifiers matching the criteria specified by <emphasis>
+mods</emphasis>
+ and <emphasis>
+match</emphasis>
+. If <emphasis>
+sym</emphasis>
+ is <emphasis>
+NULL</emphasis>
+, the interpretation may be applied to any symbol selected on a key when the
+modifiers match the criteria specified by <emphasis>
+mods</emphasis>
+ and <emphasis>
+match</emphasis>
+.
+</para>
+
+
+<para>
+<emphasis>match</emphasis>
+must be one of the values shown in Table 17.1 and specifies how the real
+modifiers specified in <emphasis>mods</emphasis>
+are to be interpreted.
+</para>
+
+<table frame='topbot'>
+<title>Symbol Interpretation Match Criteria</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='3' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='2.0*'/>
+<colspec colname='c2' colwidth='1.0*'/>
+<colspec colname='c3' colwidth='3.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Match Criteria</entry>
+  <entry>Value</entry>
+  <entry>Effect</entry>
+  </row>
+</thead>
+<tbody>
+  <row>
+    <entry><emphasis>XkbSI_NoneOf</emphasis></entry>
+    <entry>(0)</entry>
+    <entry>
+None of the bits that are on in <emphasis>mods</emphasis>
+ can be set, but other bits can be.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSI_AnyOfOrNone</emphasis></entry>
+    <entry>(1)</entry>
+    <entry>
+Zero or more of the bits that are on in <emphasis>
+mods</emphasis>
+ can be set, as well as others.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSI_AnyOf</emphasis></entry>
+    <entry>(2)</entry>
+    <entry>
+One or more of the bits that are on in <emphasis>
+mods</emphasis>
+ can be set, as well as any others.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSI_AllOf</emphasis></entry>
+    <entry>(3)</entry>
+    <entry>
+All of the bits that are on in <emphasis>
+mods</emphasis>
+ must be set, but others may be set as well.
+    </entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbSI_Exactly</emphasis></entry>
+    <entry>(4)</entry>
+    <entry>
+All of the bits that are on in <emphasis>
+mods</emphasis>
+ must be set, and no other bits may be set.
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+In addition to the above bits, <emphasis>
+match</emphasis>
+ may contain the <emphasis>
+XkbSI_LevelOneOnly</emphasis>
+ bit, in which case the modifier match criteria specified by <emphasis>
+mods</emphasis>
+ and <emphasis>
+match</emphasis>
+ applies only if <emphasis>
+sym</emphasis>
+ is in level one of its group; otherwise, <emphasis>
+mods</emphasis>
+ and <emphasis>
+match</emphasis>
+ are ignored and the symbol matches a condition where no modifiers are set.
+</para>
+
+<para><programlisting>
+#define XkbSI_LevelOneOnly  (0x80)
+/* use mods + match only if sym is level 1 */
+</programlisting></para>
+
+<para>
+If no matching symbol interpretation is found, the server uses a default
+interpretation where:
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='2' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<colspec colname='c1' colwidth='3.0*'/>
+<tbody>
+  <row>
+    <entry><emphasis>sym</emphasis> =</entry>
+    <entry>0</entry>
+  </row>
+  <row>
+    <entry><emphasis>flags</emphasis> =</entry>
+    <entry><emphasis>XkbSI_AutoRepeat</emphasis></entry>
+  </row>
+  <row>
+    <entry><emphasis>match</emphasis> =</entry>
+    <entry><emphasis>XkbSI_AnyOfOrNone</emphasis></entry>
+  </row>
+  <row>
+    <entry><emphasis>mods</emphasis> =</entry>
+    <entry>0</entry>
+  </row>
+  <row>
+    <entry><emphasis>virtual_mod</emphasis> =</entry>
+    <entry><emphasis>XkbNoModifier</emphasis></entry>
+  </row>
+  <row>
+
+   <entry><emphasis>act</emphasis> =</entry>
+    <entry><emphasis>SA_NoAction</emphasis></entry>
+  </row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+When a matching symbol interpretation is found in step 2a, the interpretation
+is applied to modify the Xkb map as follows.
+</para>
+
+<para>
+The <emphasis>
+act</emphasis>
+ field specifies a single action to be bound to the symbol position; any key
+event that selects the symbol causes the action to be taken. Valid actions are
+defined in section 16.1.
+</para>
+
+
+<para>
+If the Xkb keyboard map for the key does not have its <emphasis>
+ExplicitVModMap</emphasis>
+ control set, the <emphasis>
+XkbSI_LevelOneOnly</emphasis>
+ bit and symbol position are examined. If the <emphasis>
+XkbSI_LevelOneOnly</emphasis>
+ bit is not set in <emphasis>
+match</emphasis>
+ or the symbol is in position G1L1, the <emphasis>
+virtual_mod</emphasis>
+ field is examined. If <emphasis>
+virtual_mod</emphasis>
+ is not <emphasis>
+XkbNoModifier</emphasis>
+, <emphasis>
+virtual_mod</emphasis>
+ specifies a single virtual modifier to be added to the virtual modifier map
+for the key.<emphasis>
+ virtual_mod</emphasis>
+ is specified as an index in the range [0..15].
+</para>
+
+
+<para>
+If the matching symbol is in position G1L1 of the key, two bits in the flags
+field potentially specify additional behavior modifications:
+</para>
+
+<para><programlisting>
+#define      XkbSI_AutoRepeat    (1&lt;&lt;0)
+                                 /* key repeats if sym is in position G1L1 */
+#define      XkbSI_LockingKey    (1&lt;&lt;1)
+                                 /* set <emphasis> KB_Lock</emphasis>
+                                    behavior if sym is in psn G1L1 */
+</programlisting></para>
+
+<para>
+If the Xkb keyboard map for the key does not have its <emphasis>
+ExplicitAutoRepeat</emphasis>
+ control set, its auto repeat behavior is set based on the value of the
+<emphasis>
+XkbSI_AutoRepeat</emphasis>
+ bit. If the <emphasis>
+XkbSI_AutoRepeat</emphasis>
+ bit is set, the auto-repeat behavior of the key is turned on; otherwise, it is
+turned off.
+</para>
+
+
+<para>
+If the Xkb keyboard map for the key does not have its <emphasis>
+ExplicitBehavior</emphasis>
+ control set, its locking behavior is set based on the value of the <emphasis>
+XkbSI_LockingKey</emphasis>
+ bit. If <emphasis>
+XkbSI_LockingKey</emphasis>
+ is set, the key behavior is set to <emphasis>
+KB_Lock</emphasis>
+; otherwise, it is turned off (see section 16.3).
+</para>
+
+
+</sect3>
+</sect2>
+<sect2 id='Xkb_Keyboard_Mapping_to_Core_Keyboard_Mapping_Transformations'>
+<title>Xkb Keyboard Mapping to Core Keyboard Mapping Transformations</title>
+
+<para>
+Whenever the server processes Xkb requests to change the keyboard mapping, it
+discards the affected portion of its core keyboard mapping and regenerates it
+based on the new Xkb mapping.
+</para>
+
+
+<para>
+When the Xkb mapping for a key is transformed to a core protocol mapping, the
+symbols for the core map are taken in the following order from the Xkb map:
+</para>
+
+
+<para>
+G1L1 G1L2 G2L1 G2L2 G1L3-n G2L3-n G3L1-n G4L1-n
+</para>
+
+
+<para>
+If group one is of width one in the Xkb map, G1L2 is taken to be NoSymbol;
+similarly, if group two is of width one in the Xkb map, G2L2 is taken to be
+NoSymbol.
+</para>
+
+
+<para>
+If the Xkb key map for a particular key has fewer groups than the core
+keyboard, the symbols for group one are repeated to fill in the missing core
+components. For example, an Xkb key with a single width-three group would be
+mapped to a core mapping counting three groups as:
+</para>
+
+
+<para>
+G1L1 G1L2 G1L1 G1L2 G1L3 G1L3 G1L1 G1L2 G1L3
+</para>
+
+
+<para>
+When a core keyboard map entry is generated from an Xkb keyboard map entry, a
+modifier mapping is generated as well. The modifier mapping contains all of the
+modifiers affected by any of the actions associated with the key combined with
+all of the real modifiers associated with any of the virtual modifiers bound to
+the key. In addition, if any of the actions associated with the key affect any
+component of the keyboard group, all of the modifiers in the <emphasis>
+mask</emphasis>
+ field of all of the group compatibility maps are added to the modifier mapping
+as well. While an <emphasis>
+XkbSA_ISOLock</emphasis>
+ action can theoretically affect any modifier, if the Xkb mapping for a key
+specifies an <emphasis>
+XkbSA_ISOLock</emphasis>
+ action, only the modifiers or group that are set by default are added to the
+modifier mapping.
+</para>
+
+
+</sect2>
+</sect1>
+<sect1 id='Getting_Compatibility_Map_Components_From_the_Server'>
+<title>Getting Compatibility Map Components From the Server</title>
+
+<para>
+Use <emphasis>
+XkbGetCompatMap</emphasis>
+ to fetch any combination of the current compatibility map components from the
+server. When another client modifies the compatibility map, you are notified if
+you have selected for <emphasis>
+XkbCompatMapNotify</emphasis>
+ events (see section 17.5). <emphasis>
+XkbGetCompatMap</emphasis>
+ is particularly useful when you receive an event of this type, as it allows
+you to update your program’s version of the compatibility map to match the
+modified version now in the server. If your program is dealing with multiple
+servers and needs to configure them all in a similar manner, the updated
+compatibility map may be used to reconfigure other servers.
+</para>
+
+<note><para>To make a complete matching configuration you must also update the
+explicit override components of the server state.</para></note>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbGetCompatMap</emphasis>
+(<emphasis>
+display, which, xkb</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display * <emphasis>
+            display</emphasis>
+;            /* connection to server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+            which</emphasis>
+;            /* mask of compatibility map components to fetch */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescRec * <emphasis>
+            xkb</emphasis>
+;            /* keyboard description where results placed */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetCompatMap</emphasis>
+ fetches the components of the compatibility map specified in <emphasis>
+which</emphasis>
+ from the server specified by <emphasis>
+display</emphasis>
+ and places them in the <emphasis>
+compat</emphasis>
+ structure of the keyboard description <emphasis>
+xkb</emphasis>
+. Valid values for <emphasis>
+which</emphasis>
+ are an inclusive OR of the values shown in Table 17.2.
+</para>
+
+<table frame='topbot'>
+<title>Compatibility Map Component Masks</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='3' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.5*'/>
+<colspec colname='c2' colwidth='1.0*'/>
+<colspec colname='c3' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Mask</entry>
+  <entry>Value</entry>
+  <entry>Affecting</entry>
+  </row>
+</thead>
+<tbody>
+  <row>
+    <entry><emphasis>XkbSymInterpMask</emphasis></entry>
+    <entry>(1&lt;&lt;0)</entry>
+    <entry>Symbol interpretations</entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbGroupCompatMask</emphasis></entry>
+    <entry>(1&lt;&lt;1)</entry>
+    <entry>Group maps</entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbAllCompatMask</emphasis></entry>
+    <entry>(0x3)</entry>
+    <entry>All compatibility map components</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+If no compatibility map structure is allocated in <emphasis>
+xkb</emphasis>
+ upon entry, <emphasis>
+XkbGetCompatMap</emphasis>
+ allocates one. If one already exists, its contents are overwritten with the
+returned results.
+</para>
+
+
+<para>
+<emphasis>
+XkbGetCompatMap</emphasis>
+ fetches compatibility map information for the device specified by the
+<emphasis>
+device_spec</emphasis>
+ field of <emphasis>
+xkb</emphasis>
+. Unless you have specifically modified this field, it is the default keyboard
+device. <emphasis>
+XkbGetCompatMap</emphasis>
+ returns <emphasis>
+Success</emphasis>
+ if successful, <emphasis>
+BadAlloc</emphasis>
+ if it is unable to obtain necessary storage for either the return values or
+work space, <emphasis>
+BadMatch</emphasis>
+ if the <emphasis>
+dpy</emphasis>
+ field of the <emphasis>
+xkb</emphasis>
+ argument is non-<emphasis>
+NULL</emphasis>
+ and does not match the <emphasis>
+display</emphasis>
+ argument, and <emphasis>
+BadLength</emphasis>
+ under certain conditions caused by server or Xkb implementation errors.
+</para>
+
+
+</sect1>
+<sect1 id='Using_the_Compatibility_Map'>
+<title>Using the Compatibility Map</title>
+
+<para>
+Xkb provides several functions that make it easier to apply the compatibility
+map to configure a client-side Xkb keyboard mapping, given a core protocol
+representation of part or all of a keyboard mapping. Obtain a core protocol
+representation of a keyboard mapping from an actual server (by using <emphasis>
+XGetKeyboardMapping</emphasis>
+, for example), a data file, or some other source.
+</para>
+
+<para>
+To update a local Xkb keyboard map to reflect the mapping expressed by a core
+format mapping by calling the function <emphasis>
+XkbUpdateMapFromCore</emphasis>
+.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbUpdateMapFromCore</emphasis>
+(<emphasis>
+xkb</emphasis>
+,<emphasis>
+ first_key</emphasis>
+,<emphasis>
+ num_keys</emphasis>
+,<emphasis>
+ map_width</emphasis>
+,<emphasis>
+ core_keysyms</emphasis>
+,<emphasis>
+ changes</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr <emphasis>
+            xkb</emphasis>
+;            /* keyboard description to update */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+KeyCode <emphasis>
+            first_key</emphasis>
+;            /* keycode of first key description to update */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int <emphasis>
+            num_keys</emphasis>
+;            /* number of key descriptions to update */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int <emphasis>
+            map_width</emphasis>
+;            /* width of core protocol keymap */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+KeySym *<emphasis>
+            core_keysyms</emphasis>
+;            /* symbols in core protocol keymap */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbChangesPtr       <emphasis>
+      changes</emphasis>
+;            /* backfilled with changes made to Xkb */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbUpdateMapFromCore</emphasis>
+ interprets input argument information representing a keyboard map in core
+format to update the Xkb keyboard description passed in <emphasis>
+xkb</emphasis>
+. Only a portion of the Xkb map is updated — the portion corresponding to
+keys with keycodes in the range <emphasis>
+first_key</emphasis>
+ through <emphasis>
+first_key</emphasis>
+ + <emphasis>
+num_keys</emphasis>
+ - 1. If <emphasis>
+XkbUpdateMapFromCore</emphasis>
+ is being called in response to a<emphasis>
+ </emphasis>
+<emphasis>
+MappingNotify</emphasis>
+<emphasis>
+ </emphasis>
+event<emphasis>
+, first_key</emphasis>
+ and <emphasis>
+num_keys</emphasis>
+ are reported in the <emphasis>
+MappingNotify</emphasis>
+ event. <emphasis>
+core_keysyms</emphasis>
+ contains the keysyms corresponding to the keycode range being updated, in core
+keyboard description order. <emphasis>
+map_width</emphasis>
+ is the number of keysyms per key in <emphasis>
+core_keysyms</emphasis>
+. Thus, the first <emphasis>
+map_width</emphasis>
+ entries in <emphasis>
+core_keysyms</emphasis>
+ are for the key with keycode <emphasis>
+first_key</emphasis>
+, the next <emphasis>
+map_width</emphasis>
+ entries are for key <emphasis>
+first_key</emphasis>
+ + 1, and so on.
+</para>
+
+
+<para>
+In addition to modifying the Xkb keyboard mapping in <emphasis>
+xkb</emphasis>
+, <emphasis>
+XkbUpdateMapFromCore</emphasis>
+ backfills the changes structure whose address is passed in <emphasis>
+changes</emphasis>
+ to indicate the modifications that were made. You may then use <emphasis>
+changes</emphasis>
+ in subsequent calls such as <emphasis>
+XkbSetMap</emphasis>
+, to propagate the local modifications to a server.
+</para>
+
+
+<para>
+When dealing with core keyboard mappings or descriptions, it is sometimes
+necessary to determine the Xkb key types appropriate for the symbols bound to a
+key in a core keyboard mapping. Use <emphasis>
+XkbKeyTypesForCoreSymbols</emphasis>
+ for this purpose:
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+int <emphasis>
+XkbKeyTypesForCoreSymbols</emphasis>
+(<emphasis>
+map_width</emphasis>
+,<emphasis>
+ core_syms</emphasis>
+,<emphasis>
+ protected, types_inout, xkb_syms_rtrn</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr<emphasis>
+      xkb</emphasis>
+;            /* keyboard description in which to place symbols*/
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int<emphasis>
+      map_width</emphasis>
+;            /* width of core protocol keymap in <emphasis>
+xkb_syms_rtrn</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+KeySym *<emphasis>
+      core_syms</emphasis>
+;            /* core protocol format array of KeySyms */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int       <emphasis>
+protected</emphasis>
+;            /* explicit key types */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int *<emphasis>
+      types_inout;</emphasis>
+            /* backfilled with the canonical types bound to groups one and two
+for the key */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+KeySym *      <emphasis>
+xkb_syms_rtrn</emphasis>
+      ;      /* backfilled with symbols bound to the key in the Xkb mapping */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbKeyTypesForCoreSymbols</emphasis>
+ expands the symbols in <emphasis>
+core_syms</emphasis>
+ and types in <emphasis>
+types_inout</emphasis>
+ according to the rules specified in section 12 of the core protocol, then
+chooses canonical key types (canonical key types are defined in section 15.2.1)
+for groups 1 and 2 using the rules specified by the Xkb protocol and places
+them in <emphasis>
+xkb_syms_rtrn</emphasis>
+, which will be non-<emphasis>
+NULL</emphasis>
+.
+</para>
+
+
+<para>
+A core keymap is a two-dimensional array of keysyms. It has <emphasis>
+map_width</emphasis>
+ columns and <emphasis>
+max_key_code</emphasis>
+ rows. <emphasis>
+XkbKeyTypesForCoreSymbols</emphasis>
+ takes a single row from a core keymap, determines the number of groups
+associated with it, the type of each group, and the symbols bound to each
+group. The return value is the number of groups, <emphasis>
+types_inout</emphasis>
+ has the types for each group, and <emphasis>
+xkb_syms_rtrn</emphasis>
+ has the symbols in Xkb order (that is, groups are contiguous, regardless of
+size).
+</para>
+
+
+<para>
+<emphasis>
+protected</emphasis>
+ contains the explicitly protected key types. There is one  explicit override
+control associated with each of the four possible groups for each Xkb key,
+<emphasis>
+ExplicitKeyType1</emphasis>
+ through <emphasis>
+ExplicitKeyType4</emphasis>
+<emphasis>
+; protected </emphasis>
+is an inclusive OR of these controls. <emphasis>
+map_width</emphasis>
+ is the width of the core keymap and is not dependent on any Xkb definitions.
+<emphasis>
+types_inout</emphasis>
+ is an array of four type indices. On input, <emphasis>
+types_inout</emphasis>
+ contains the indices of any types already assigned to the key, in case they
+are explicitly protected from change.
+</para>
+
+
+<para>
+Upon return, <emphasis>
+types_inout</emphasis>
+ contains any automatically selected (that is, canonical) types plus any
+protected types. Canonical types are assigned to all four groups if there are
+enough symbols to do so. The four entries in <emphasis>
+types_inout</emphasis>
+ correspond to the four groups for the key in question.
+</para>
+
+
+<para>
+If the groups mapping does not change, but the symbols assigned to an Xkb
+keyboard compatibility map do change, the semantics of the key may be modified.
+To apply the new compatibility mapping to an individual key to get its
+semantics updated, use <emphasis>
+XkbApplyCompatMapToKey</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbApplyCompatMapToKey</emphasis>
+(<emphasis>
+xkb</emphasis>
+,<emphasis>
+ key</emphasis>
+,<emphasis>
+ changes</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+  XkbDescPtr<emphasis>
+            xkb;            </emphasis>
+/* keyboard description to be updated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+  KeyCode<emphasis>
+            key</emphasis>
+;            /* key to be updated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+  XkbChangesPtr<emphasis>
+            changes</emphasis>
+;            /* notes changes to the Xkb keyboard description */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbApplyCompatMapToKey</emphasis>
+ essentially performs the operation described in section 17.1.2 to a specific
+key. This updates the behavior, actions, repeat status, and virtual modifier
+bindings of the key.
+</para>
+
+
+</sect1>
+<sect1 id='Changing_the_Servers_Compatibility_Map'>
+<title>Changing the Server’s Compatibility Map</title>
+
+<para>
+To modify the server’s compatibility map, first modify a local copy of the
+Xkb compatibility map, then call <emphasis>
+XkbSetCompatMap</emphasis>
+. You may allocate a new compatibility map for this purpose using <emphasis>
+XkbAllocCompatMap</emphasis>
+ (see section 17.6). You may also use a compatibility map from another server,
+although you need to adjust the <emphasis>
+device_spec</emphasis>
+ field in the <emphasis>
+XkbDescRec</emphasis>
+ accordingly. Note that symbol interpretations in a compatibility map
+(<emphasis>
+sym_interpret</emphasis>
+, the vector of <emphasis>
+XkbSymInterpretRec</emphasis>
+ structures) are also allocated using this same function.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbSetCompatMap</emphasis>
+(<emphasis>
+display, which, xkb, update_actions</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display * <emphasis>
+            display</emphasis>
+;            /* connection to server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+            which</emphasis>
+;            /* mask of compat map components to set */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr <emphasis>
+            xkb</emphasis>
+;            /* source for compat map components */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool <emphasis>
+            update_actions</emphasis>
+;            /* <emphasis>
+True</emphasis>
+ =&gt; apply to server’s keyboard map */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbSetCompatMap</emphasis>
+ copies compatibility map information from the keyboard description in
+<emphasis>
+xkb</emphasis>
+ to the server specified in <emphasis>
+display</emphasis>
+’s compatibility map for the device specified by the <emphasis>
+device_spec</emphasis>
+ field of <emphasis>
+xkb</emphasis>
+. Unless you have specifically modified this field, it is the default keyboard
+device.<emphasis>
+ which</emphasis>
+ specifies the compatibility map components to be set, and is an inclusive OR
+of the bits shown in Table 17.2.
+</para>
+
+
+<para>
+After updating its compatibility map for the specified device, if <emphasis>
+update_actions</emphasis>
+ is <emphasis>
+True,</emphasis>
+ the server applies the new compatibility map to its entire keyboard for the
+device to generate a new set of key semantics, compatibility state, and a new
+core keyboard map. If <emphasis>
+update_actions</emphasis>
+ is <emphasis>
+False</emphasis>
+, the new compatibility map is not used to generate any modifications to the
+current device semantics, state, or core keyboard map. One reason for not
+applying the compatibility map immediately would be if one server was being
+configured to match another on a piecemeal basis; the map should not be applied
+until everything is updated. To force an update at a later time, use <emphasis>
+XkbSetCompatMap</emphasis>
+ specifying <emphasis>
+which</emphasis>
+ as zero and <emphasis>
+update_actions</emphasis>
+ as <emphasis>
+True</emphasis>
+.
+</para>
+
+
+<para>
+<emphasis>
+XkbSetCompatMap</emphasis>
+ returns <emphasis>
+True</emphasis>
+ if successful and <emphasis>
+False</emphasis>
+ if unsuccessful. The server may report problems it encounters when processing
+the request subsequently via protocol errors.
+</para>
+
+
+<para>
+To add a symbol interpretation to the list of symbol interpretations in an
+<emphasis>
+XkbCompatRec</emphasis>
+, use <emphasis>
+XkbAddSymInterpret</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+XkbSymInterpretPtr <emphasis>
+XkbAddSymInterpret</emphasis>
+(<emphasis>
+xkb, si, updateMap, changes</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr<emphasis>
+            xkb</emphasis>
+;            /* keyboard description to be updated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbSymInterpretPtr<emphasis>
+            si</emphasis>
+;            /* symbol interpretation to be added */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool<emphasis>
+            updateMap</emphasis>
+;            /* <emphasis>
+True</emphasis>
+=&gt;apply compatibility map to keys */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbChangesPtr<emphasis>
+            changes</emphasis>
+;            /* changes are put here */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbAddSymInterpret</emphasis>
+ adds <emphasis>
+si</emphasis>
+ to the list of symbol interpretations in <emphasis>
+xkb</emphasis>
+. If <emphasis>
+updateMap</emphasis>
+ is <emphasis>
+True</emphasis>
+, it (re)applies the compatibility map to all of the keys on the keyboard. If
+<emphasis>
+changes</emphasis>
+ is non-<emphasis>
+NULL</emphasis>
+, it reports the parts of the keyboard that were affected (unless <emphasis>
+updateMap</emphasis>
+ is <emphasis>
+True</emphasis>
+, not much changes). <emphasis>
+XkbAddSymInterpret</emphasis>
+ returns a pointer to the actual new symbol interpretation in the list or
+<emphasis>
+NULL</emphasis>
+ if it failed.
+</para>
+
+
+</sect1>
+<sect1 id='Tracking_Changes_to_the_Compatibility_Map'>
+<title>Tracking Changes to the Compatibility Map</title>
+
+<para>
+The server automatically generates <emphasis>
+MappingNotify</emphasis>
+ events when the keyboard mapping changes. If you wish to be notified of
+changes to the compatibility map, you should select for <emphasis>
+XkbCompatMapNotify</emphasis>
+ events. If you select for <emphasis>
+XkbMapNotify</emphasis>
+ events, you no longer receive the automatically generated <emphasis>
+MappingNotify</emphasis>
+ events. If you subsequently deselect <emphasis>
+XkbMapNotifyEvent</emphasis>
+ delivery, you again receive <emphasis>
+MappingNotify</emphasis>
+ events.
+</para>
+
+
+<para>
+To receive <emphasis>
+XkbCompatMapNotify</emphasis>
+ events under all possible conditions, use <emphasis>
+XkbSelectEvents</emphasis>
+ (see section 4.3) and pass <emphasis>
+XkbCompatMapNotifyMask</emphasis>
+ in both <emphasis>
+bits_to_change</emphasis>
+ and <emphasis>
+values_for_bits</emphasis>
+.
+</para>
+
+
+<para>
+To receive <emphasis>
+XkbCompatMapNotify</emphasis>
+ events only under certain conditions, use <emphasis>
+XkbSelectEventDetails</emphasis>
+ using <emphasis>
+XkbCompatMapNotify</emphasis>
+ as the <emphasis>
+event_type</emphasis>
+ and specifying the desired map changes in <emphasis>
+bits_to_change</emphasis>
+ and <emphasis>
+values_for_bits</emphasis>
+ using mask bits from Table 17.2.
+</para>
+
+
+<para>
+Note that you are notified of changes you make yourself, as well as changes
+made by other clients.
+</para>
+
+
+<para>
+The structure for the <emphasis>
+XkbCompatMapNotifyEvent</emphasis>
+ is:
+</para>
+
+<para><programlisting>
+typedef struct {
+      int            type;          /* Xkb extension base event code */
+      unsigned long  serial;        /* X server serial number for event */
+      Bool           send_event;    /* <emphasis>True</emphasis> =&gt;
+                                       synthetically generated */
+      Display *      display;       /* server connection where event generated */
+      Time           time;          /* server time when event generated */
+      int            xkb_type;      /* <emphasis>XkbCompatMapNotify</emphasis> */
+      int            device;        /* Xkb device ID, will not be
+                                       <emphasis>XkbUseCoreKbd</emphasis> */
+      unsigned int   changed_groups;/* number of group maps changed */
+      int            first_si;      /* index to 1st changed symbol
+                                       interpretation */
+      int            num_si;        /* number of changed symbol
+                                       interpretations */
+      int            num_total_si;  /* total number of valid symbol
+                                       interpretations */
+} <emphasis>XkbCompatMapNotifyEvent</emphasis>;
+</programlisting></para>
+
+<para>
+<emphasis>
+changed_groups</emphasis>
+ is the number of group compatibility maps that have changed. If you are
+maintaining a corresponding copy of the compatibility map, or get a fresh copy
+from the server using <emphasis>
+XkbGetCompatMap</emphasis>
+, <emphasis>
+changed_groups</emphasis>
+ references <emphasis>
+groups</emphasis>
+[0..<emphasis>
+changed_groups</emphasis>
+-1] in the <emphasis>
+XkbCompatMapRec</emphasis>
+ structure.
+</para>
+
+
+<para>
+<emphasis>
+first_si</emphasis>
+ is the index of the first changed symbol interpretation, <emphasis>
+num_si</emphasis>
+ is the number of changed symbol interpretations, and <emphasis>
+num_total_si</emphasis>
+ is the total number of valid symbol interpretations. If you are maintaining a
+corresponding copy of the compatibility map, or get a fresh copy from the
+server using <emphasis>
+XkbGetCompatMap</emphasis>
+, <emphasis>
+first_si</emphasis>
+, <emphasis>
+num_si</emphasis>
+, and <emphasis>
+num_total_si</emphasis>
+ are appropriate for use with the <emphasis>
+compat.sym_interpret</emphasis>
+ vector in this structure.
+</para>
+
+
+</sect1>
+<sect1 id='Allocating_and_Freeing_the_Compatibility_Map'>
+<title>Allocating and Freeing the Compatibility Map</title>
+
+<para>
+If you are modifying the compatibility map, you need to allocate a new
+compatibility map if you do not already have one available. To do so, use
+<emphasis>
+XkbAllocCompatMap</emphasis>
+.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbAllocCompatMap</emphasis>
+(<emphasis>
+xkb, which, num_si</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr <emphasis>
+      xkb</emphasis>
+;            /* keyboard description in which to allocate compat map */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+      which</emphasis>
+;            /* mask of compatibility map components to allocate */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+      num_si</emphasis>
+;            /* number of symbol interpretations to allocate */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+xkb</emphasis>
+ specifies the keyboard description for which compatibility maps are to be
+allocated. The compatibility map is the <emphasis>
+compat</emphasis>
+ field in this structure.
+</para>
+
+
+<para>
+<emphasis>
+which</emphasis>
+ specifies the compatibility map components to be allocated (see <emphasis>
+XkbGetCompatMap</emphasis>
+, in section 17.2). <emphasis>
+which</emphasis>
+ is an inclusive OR of the bits shown in Table 17.2.
+</para>
+
+
+<para>
+<emphasis>
+num_si</emphasis>
+ specifies the total number of entries to allocate in the symbol interpretation
+vector (<emphasis>
+xkb.compat.sym_interpret</emphasis>
+).
+</para>
+
+
+<para>
+Note that symbol interpretations in a compatibility map (the <emphasis>
+sym_interpret</emphasis>
+ vector of <emphasis>
+XkbSymInterpretRec</emphasis>
+ structures) are also allocated using this same function. To ensure that there
+is sufficient space in the symbol interpretation vector for entries to be
+added, use <emphasis>
+XkbAllocCompatMap</emphasis>
+ specifying <emphasis>
+which</emphasis>
+ as <emphasis>
+XkbSymInterpretMask</emphasis>
+ and the number of free symbol interpretations needed in <emphasis>
+num_si</emphasis>
+.
+</para>
+
+
+<para>
+<emphasis>
+XkbAllocCompatMap</emphasis>
+ returns <emphasis>
+Success</emphasis>
+ if successful, <emphasis>
+BadMatch</emphasis>
+ if <emphasis>
+xkb</emphasis>
+ is <emphasis>
+NULL</emphasis>
+, or <emphasis>
+BadAlloc</emphasis>
+ if errors are encountered when attempting to allocate storage.
+</para>
+
+
+<para>
+To free an entire compatibility map or selected portions of one, use <emphasis>
+XkbFreeCompatMap</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbFreeCompatMap</emphasis>
+(<emphasis>
+xkb, which, free_map</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr <emphasis>
+      xkb</emphasis>
+;            /* Xkb description in which to free compatibility map */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+      which</emphasis>
+;            /* mask of compatibility map components to free */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool <emphasis>
+      free_map</emphasis>
+;            /* <emphasis>
+True</emphasis>
+ =&gt; free <emphasis>
+XkbCompatMap</emphasis>
+ structure itself */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+which</emphasis>
+ specifies the compatibility map components to be freed (see <emphasis>
+XkbGetCompatMap</emphasis>
+, in section 17.2). <emphasis>
+which</emphasis>
+ is an inclusive OR of the bits shown in Table 17.2
+</para>
+
+
+<para>
+<emphasis>
+free_map</emphasis>
+ indicates whether the <emphasis>
+XkbCompatMap</emphasis>
+ structure itself should be freed. If <emphasis>
+free_map</emphasis>
+ is <emphasis>
+True</emphasis>
+, <emphasis>
+which</emphasis>
+ is ignored, all non-<emphasis>
+NULL</emphasis>
+ compatibility map components are freed, and the <emphasis>
+compat</emphasis>
+ field in the <emphasis>
+XkbDescRec</emphasis>
+ referenced by <emphasis>
+xkb</emphasis>
+ is set to <emphasis>
+NULL</emphasis>
+.
+</para>
+
+</sect1>
+</chapter>
diff --git a/specs/XKB/ch18.xml b/specs/XKB/ch18.xml
new file mode 100644 (file)
index 0000000..806b09a
--- /dev/null
@@ -0,0 +1,1191 @@
+<chapter id='Symbolic_Names'>
+<title>Symbolic Names</title>
+
+<para>
+The core protocol does not provide any information to clients other than that
+actually used to interpret events. This makes it difficult to write an
+application that presents the keyboard to a user in an easy-to-understand way.
+Such applications have to examine the vendor string and keycodes to determine
+the type of keyboard connected to the server and then examine keysyms and
+modifier mappings to determine the effects of most modifiers (the <emphasis>
+Shift</emphasis>
+, <emphasis>
+Lock</emphasis>
+ and <emphasis>
+Control</emphasis>
+ modifiers are defined by the core protocol but no semantics are implied for
+any other modifiers).
+</para>
+
+
+<para>
+To make it easier for applications to present a keyboard to the user, Xkb
+supports symbolic names for most components of the keyboard extension. Most of
+these symbolic names are grouped into the <emphasis>
+names</emphasis>
+ component of the keyboard description.
+</para>
+
+<sect1 id='The_XkbNamesRec_Structure'>
+<title>The XkbNamesRec Structure</title>
+
+<para>
+The names component of the keyboard description is defined as follows:
+</para>
+
+<para><programlisting>
+#define      XkbKeyNameLength      4
+#define      XkbKeyNumVirtualMods  16
+#define      XkbKeyNumIndicators   32
+#define      XkbKeyNumKbdGroups    4
+#define      XkbMaxRadioGroups     32
+</programlisting></para>
+
+<para><programlisting>
+typedef struct {
+      char      name[XkbKeyNameLength];      /* symbolic key names */
+} <emphasis>XkbKeyNameRec</emphasis>,*XkbKeyNamePtr;
+</programlisting></para>
+
+<para><programlisting>
+typedef struct {
+      char      real[XkbKeyNameLength];
+                /* this key name must be in the keys array */
+      char      alias[XkbKeyNameLength];
+                /* symbolic key name as alias for the key */
+} <emphasis>XkbKeyAliasRec</emphasis>,*XkbKeyAliasPtr;
+</programlisting></para>
+
+<para><programlisting>
+typedef struct _XkbNamesRec {
+      Atom      keycodes;      /* identifies range and meaning of keycodes */
+      Atom      geometry;      /* identifies physical location, size, and shape of keys */
+      Atom      symbols;       /* identifies the symbols logically bound to the keys */
+      Atom      types;         /* identifies the set of key types */
+      Atom      compat;        /* identifies actions for keys using core protocol */
+      Atom      vmods[XkbNumVirtualMods]; /* symbolic names for virtual modifiers */
+      Atom      indicators[XkbNumIndicators];   /* symbolic names for indicators */
+      Atom      groups[XkbNumKbdGroups]; /* symbolic names for keyboard groups */
+      XkbKeyNamePtr      keys;         /* symbolic key name array */
+      XkbKeyAliasPtr     key_aliases;  /* real/alias symbolic name pairs array */
+      Atom *    radio_groups;      /* radio group name array */
+      Atom      phys_symbols;      /* identifies the symbols engraved on the keyboard */
+      unsigned char      num_keys; /* number of keys in the <emphasis> keys</emphasis> array */
+      unsigned char      num_key_aliases;  /* number of keys in the
+                                              <emphasis> key_aliases</emphasis> array */
+      unsigned short     num_rg;      /* number of radio groups */
+} <emphasis>XkbNamesRec</emphasis>,*XkbNamesPtr;      /*
+</programlisting></para>
+
+<para>
+The <emphasis>
+keycodes</emphasis>
+ name identifies the range and meaning of the keycodes returned by the keyboard
+in question. The <emphasis>
+geometry</emphasis>
+ name, on the other hand, identifies the physical location, size and shape of
+the various keys on the keyboard. As an example to distinguish between these
+two names, consider function keys on PC-compatible keyboards. Function keys are
+sometimes above the main keyboard and sometimes to the left of the main
+keyboard, but the same keycode is used for the key that is logically F1
+regardless of physical position. Thus, all PC-compatible keyboards share a
+similar keycodes name but may have different geometry names.
+</para>
+
+<note><para>The keycodes name is intended to be a very general description of
+the keycodes returned by a keyboard; a single keycodes name might cover
+keyboards with differing numbers of keys provided all keys have the same
+semantics when present. For example, 101 and 102 key PC keyboards might use the
+same name. In these cases, applications can use the keyboard <emphasis>
+geometry</emphasis>
+ name to determine which subset of the named keycodes is in use.</para></note>
+
+<para>
+The <emphasis>
+symbols</emphasis>
+ name identifies the symbols logically bound to the keys. The symbols name is a
+human or application-readable description of the intended locale or usage of
+the keyboard with these symbols. The <emphasis>
+phys_symbols</emphasis>
+ name, on the other hand, identifies the symbols actually engraved on the
+keyboard. Given this, the <emphasis>
+symbols</emphasis>
+ name and <emphasis>
+phys_symbols</emphasis>
+ names might be different. For example, the description for a keyboard that has
+English US engravings, but that is using Swiss German symbols might have a
+<emphasis>
+phys_symbols</emphasis>
+ name of "en_US" and a <emphasis>
+symbols</emphasis>
+ name of "de_CH."
+</para>
+
+
+<para>
+The <emphasis>
+types</emphasis>
+ name provides some information about the set of key types (see section 15.2)
+that can be associated with the keyboard. In addition, each key type can have a
+name, and each shift level of a type can have a name. Although these names are
+stored in the map description with each of the types, they are accessed using
+the same methods as the other symbolic names.
+</para>
+
+
+<para>
+The <emphasis>
+compat</emphasis>
+ name provides some information about the rules used to bind actions to keys
+that are changed using core protocol requests.
+</para>
+
+
+<para>
+Xkb provides symbolic names for each of the 4 keyboard groups, 16 virtual
+modifiers, 32 keyboard indicators, and 4 keyboard groups. These names are held
+in the <emphasis>
+vmods</emphasis>
+, <emphasis>
+indicators</emphasis>
+, and <emphasis>
+groups</emphasis>
+ fixed-length arrays.
+</para>
+
+
+<para>
+Each key has a four-byte symbolic name. All of the symbolic key names are held
+in the <emphasis>
+keys</emphasis>
+ array, and <emphasis>
+num_keys</emphasis>
+ reports the number of entries that are in the keys array. For each key, the
+key name links keys with similar functions or in similar positions on keyboards
+that report different keycodes. For example, the <emphasis>
+F1</emphasis>
+ key may emit keycode 23 on one keyboard and keycode 86 on another. By naming
+this key "FK01" on both keyboards, the keyboard layout designer can reuse parts
+of keyboard descriptions for different keyboards.
+</para>
+
+
+<para>
+Key aliases allow the keyboard layout designer to assign multiple key names to
+a single key. This allows the keyboard layout designer to refer to keys using
+either their position or their "function." For example, a keyboard layout
+designer may wish to refer to the left arrow key on a PC keyboard using the
+ISO9995-5 positional specification of A31 or using the functional specification
+of LEFT. The <emphasis>
+key_aliases</emphasis>
+ field holds a variable-length array of real and alias key name pairs, and the
+total number of entries in the <emphasis>
+key_aliases</emphasis>
+ array is held in <emphasis>
+num_key_aliases</emphasis>
+. For each real and alias key name pair, the <emphasis>
+real</emphasis>
+ field refers to the a name in the keys array, and the <emphasis>
+alias</emphasis>
+ field refers to the alias for that key. Using the previous example, the
+keyboard designer may use the name A31 in the keys array, but also define the
+name LEFT as an alias for A31 in the <emphasis>
+key_aliases</emphasis>
+ array.
+</para>
+
+<note><para>Key aliases defined in the geometry component of a keyboard mapping
+(see Chapter 13) override those defined in the keycodes component of the server
+database, which are stored in the <emphasis>
+XkbNamesRec</emphasis>
+ (<emphasis>
+xkb-&gt;names</emphasis>
+). Therefore, consider the key aliases defined by the geometry before
+considering key aliases supplied by the <emphasis>
+XkbNamesRec</emphasis>
+.</para></note>
+
+<para>
+A radio group is a set of keys whose behavior simulates a set of radio buttons.
+Once a key in a radio group is pressed, it stays logically depressed until
+another key in the group is pressed, at which point the previously depressed
+key is logically released. Consequently, at most one key in a radio group can
+be logically depressed at one time.
+</para>
+
+
+<para>
+Each radio group in the keyboard description can have a name. These names are
+held in the variable-length array <emphasis>
+radio_groups</emphasis>
+, and <emphasis>
+num_rg</emphasis>
+ tells how many elements are in the <emphasis>
+radio_groups</emphasis>
+ array.
+</para>
+
+
+</sect1>
+<sect1 id='Symbolic_Names_Masks'>
+<title>Symbolic Names Masks</title>
+
+<para>
+Xkb provides several functions that work with symbolic names. Each of these
+functions uses a mask to specify individual fields of the structures described
+above. These masks and their relationships to the fields in a keyboard
+description are shown in Table 18.1.
+</para>
+
+<table frame='topbot'>
+<title>Symbolic Names Masks</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='4' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='3.0*'/>
+<colspec colname='c2' colwidth='1.0*'/>
+<colspec colname='c3' colwidth='1.5*'/>
+<colspec colname='c4' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Mask Bit</entry>
+  <entry>Value</entry>
+  <entry>Keyboard Component</entry>
+  <entry>Field</entry>
+</row>
+</thead>
+<tbody>
+<row>
+    <entry>XkbKeycodesNameMask</entry>
+    <entry>(1&lt;&lt;0)</entry>
+    <entry>Xkb-&gt;names</entry>
+    <entry>keycodes</entry>
+</row>
+<row>
+    <entry>XkbGeometryNameMask</entry>
+    <entry>(1&lt;&lt;1)</entry>
+    <entry>Xkb-&gt;names</entry>
+    <entry>geometry</entry>
+</row>
+<row>
+    <entry>XkbSymbolsNameMask</entry>
+    <entry>(1&lt;&lt;2)</entry>
+    <entry>Xkb-&gt;names</entry>
+    <entry>symbols</entry>
+</row>
+<row>
+    <entry>XkbPhysSymbolsNameMask</entry>
+    <entry>(1&lt;&lt;3)</entry>
+    <entry>Xkb-&gt;names</entry>
+    <entry>phys_symbols</entry>
+</row>
+<row>
+    <entry>XkbTypesNameMask</entry>
+    <entry>(1&lt;&lt;4)</entry>
+    <entry>Xkb-&gt;names</entry>
+    <entry>type</entry>
+</row>
+<row>
+    <entry>XkbCompatNameMask</entry>
+    <entry>(1&lt;&lt;5)</entry>
+    <entry>Xkb-&gt;names</entry>
+    <entry>compat</entry>
+</row>
+<row>
+    <entry>XkbKeyTypeNamesMask</entry>
+    <entry>(1&lt;&lt;6)</entry>
+    <entry>Xkb-&gt;map</entry>
+    <entry>type[*].name</entry>
+</row>
+<row>
+    <entry>XkbKTLevelNamesMask</entry>
+    <entry>(1&lt;&lt;7)</entry>
+    <entry>Xkb-&gt;map</entry>
+    <entry>type[*].lvl_names[*]</entry>
+</row>
+<row>
+    <entry>XkbIndicatorNamesMask</entry>
+    <entry>(1&lt;&lt;8)</entry>
+    <entry>Xkb-&gt;names</entry>
+    <entry>indicators[*]</entry>
+</row>
+<row>
+    <entry>XkbKeyNamesMask</entry>
+    <entry>(1&lt;&lt;9)</entry>
+    <entry>Xkb-&gt;names</entry>
+    <entry>keys[*], num_keys</entry>
+</row>
+<row>
+    <entry>XkbKeyAliasesMask</entry>
+    <entry>(1&lt;&lt;10)</entry>
+    <entry>Xkb-&gt;names</entry>
+    <entry>key_aliases[*], num_key_aliases</entry>
+</row>
+<row>
+    <entry>XkbVirtualModNamesMask</entry>
+    <entry>(1&lt;&lt;11)</entry>
+    <entry>Xkb-&gt;names</entry>
+    <entry>vmods[*]</entry>
+</row>
+<row>
+    <entry>XkbGroupNamesMask</entry>
+    <entry>(1&lt;&lt;12)</entry>
+    <entry>Xkb-&gt;names</entry>
+    <entry>groups[*]</entry>
+</row>
+<row>
+    <entry>XkbRGNamesMask</entry>
+    <entry>(1&lt;&lt;13)</entry>
+    <entry>Xkb-&gt;names</entry>
+    <entry>radio_groups[*], num_rg</entry>
+</row>
+<row>
+    <entry>XkbComponentNamesMask</entry>
+    <entry>(0x3f)</entry>
+    <entry>Xkb-&gt;names</entry>
+    <entry>
+<para>keycodes,</para>
+<para>geometry,</para>
+<para>symbols,</para>
+<para>physical symbols,</para>
+<para>types, and</para>
+<para>compatibility map</para>
+    </entry>
+</row>
+<row>
+    <entry>XkbAllNamesMask</entry>
+    <entry>(0x3fff)</entry>
+    <entry>Xkb-&gt;names</entry>
+    <entry>all name components</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+</sect1>
+<sect1 id='Getting_Symbolic_Names_From_the_Server'>
+<title>Getting Symbolic Names From the Server</title>
+
+<para>
+To obtain symbolic names from the server, use <emphasis>
+XkbGetNames</emphasis>
+.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbGetNames</emphasis>
+(<emphasis>
+dpy, which, Xkb</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *      <emphasis>
+dpy</emphasis>
+;      /* connection to the X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+which</emphasis>
+;      /* mask of names or map components to be updated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr      <emphasis>
+xkb</emphasis>
+      /* keyboard description to be updated */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetNames</emphasis>
+ retrieves symbolic names for the components of the keyboard extension from the
+X server. The <emphasis>
+which</emphasis>
+ parameter specifies the name components to be updated in the <emphasis>
+xkb</emphasis>
+ parameter, and is the bitwise inclusive OR of the valid names mask bits
+defined in Table 18.1.
+</para>
+
+
+<para>
+If the <emphasis>
+names</emphasis>
+ field of the keyboard description <emphasis>
+xkb</emphasis>
+ is <emphasis>
+NULL</emphasis>
+, <emphasis>
+XkbGetNames</emphasis>
+ allocates and initializes the <emphasis>
+names</emphasis>
+ component of the keyboard description before obtaining the values specified by
+<emphasis>
+which</emphasis>
+. If the <emphasis>
+names</emphasis>
+ field of <emphasis>
+xkb</emphasis>
+ is not <emphasis>
+NULL</emphasis>
+, <emphasis>
+XkbGetNames</emphasis>
+ obtains the values specified by <emphasis>
+which</emphasis>
+ and copies them into the keyboard description <emphasis>
+Xkb</emphasis>
+.
+</para>
+
+
+<para>
+If the <emphasis>
+map</emphasis>
+ component of the <emphasis>
+xkb</emphasis>
+ parameter is <emphasis>
+NULL</emphasis>
+, <emphasis>
+XkbGetNames</emphasis>
+ does not retrieve type or shift level names, even if <emphasis>
+XkbKeyTypeNamesMask</emphasis>
+ or <emphasis>
+XkbKTLevelNamesMask</emphasis>
+ are set in <emphasis>
+which</emphasis>
+.
+</para>
+
+
+<para>
+<emphasis>
+XkbGetNames</emphasis>
+ can return <emphasis>
+Success</emphasis>
+, or <emphasis>
+BadAlloc</emphasis>
+, <emphasis>
+BadLength</emphasis>
+, <emphasis>
+BadMatch</emphasis>
+, and <emphasis>
+BadImplementation</emphasis>
+ errors.
+</para>
+
+
+<para>
+To free symbolic names, use <emphasis>
+XkbFreeNames</emphasis>
+ (see section 18.6)
+</para>
+
+
+</sect1>
+<sect1 id='Changing_Symbolic_Names_on_the_Server'>
+<title>Changing Symbolic Names on the Server</title>
+
+<para>
+To change the symbolic names in the server, first modify a local copy of the
+keyboard description and then use either <emphasis>
+XkbSetNames,</emphasis>
+ or, to save network traffic, use a <emphasis>
+XkbNameChangesRec</emphasis>
+structure and call <emphasis>
+XkbChangeNames</emphasis>
+ to download the changes to the server. <emphasis>
+XkbSetNames</emphasis>
+ and <emphasis>
+XkbChangeNames</emphasis>
+ can generate <emphasis>
+BadAlloc</emphasis>
+, <emphasis>
+BadAtom</emphasis>
+, <emphasis>
+BadLength</emphasis>
+, <emphasis>
+BadMatch,</emphasis>
+ and <emphasis>
+BadImplementation</emphasis>
+ errors.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbSetNames</emphasis>
+(<emphasis>
+dpy, which, first_type, num_types, xkb</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *      <emphasis>
+dpy</emphasis>
+;            /* connection to the X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+which</emphasis>
+;            /* mask of names or map components to be changed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+first_type</emphasis>
+      ;      /* first type whose name is to be changed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+num_types</emphasis>
+;            /* number of types for which names are to be changed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr      <emphasis>
+xkb</emphasis>
+;            /* keyboard description from which names are to be taken */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+Use<emphasis>
+ XkbSetNames</emphasis>
+ to change many names at the same time. For each bit set in <emphasis>
+which</emphasis>
+, <emphasis>
+XkbSetNames</emphasis>
+ takes the corresponding value (or values in the case of arrays) from the
+keyboard description <emphasis>
+xkb</emphasis>
+ and sends it to the server.
+</para>
+
+
+<para>
+The <emphasis>
+first_type</emphasis>
+ and <emphasis>
+num_types</emphasis>
+ arguments are used only if <emphasis>
+XkbKeyTypeNamesMask</emphasis>
+ or <emphasis>
+XkbKTLevelNamesMask</emphasis>
+ is set in <emphasis>
+which</emphasis>
+ and specify a subset of the types for which the corresponding names are to be
+changed. If either or both of these mask bits are set but the specified types
+are illegal, <emphasis>
+XkbSetNames</emphasis>
+ returns <emphasis>
+False</emphasis>
+ and does not update any of the names specified in <emphasis>
+which</emphasis>
+. The specified types are illegal if <emphasis>
+xkb</emphasis>
+ does not include a map component or if <emphasis>
+first_type</emphasis>
+ and <emphasis>
+num_types</emphasis>
+ specify types that are not defined in the keyboard description.
+</para>
+
+
+<sect2>
+<title/>
+
+<sect3 id='The_XkbNameChangesRec_Structure'>
+<title>The XkbNameChangesRec Structure</title>
+
+<para>
+The <emphasis>
+XkbNameChangesRec</emphasis>
+ allows applications to identify small modifications to the symbolic names and
+effectively reduces the amount of traffic sent to the server:
+</para>
+
+<para><programlisting>
+typedef struct _XkbNameChanges {
+      unsigned int      changed;            /* name components that have
+                                               changed */
+      unsigned char      first_type;        /* first key type with a new
+                                               name */
+      unsigned char      num_types;         /* number of types with new
+                                               names */
+      unsigned char      first_lvl;         /* first key type with new level
+                                               names */
+      unsigned char      num_lvls;          /* number of key types with new
+                                               level names */
+      unsigned char      num_aliases;       /* if key aliases changed,
+                                               total number of key aliases */
+      unsigned char      num_rg;            /* if radio groups changed, total
+                                               number of radio groups */
+      unsigned char      first_key;         /* first key with a new name */
+      unsigned char      num_keys;          /* number of keys with new names
+                                               */
+      unsigned short      changed_vmods;    /* mask of virtual
+                                               modifiers for which names have changed */
+      unsigned long      changed_indicators;  /* mask of indicators
+                                                 for which names were changed */
+      unsigned char       changed_groups;   /* mask of groups for
+                                               which names were changed */
+} <emphasis>XkbNameChangesRec</emphasis>, *XkbNameChangesPtr
+</programlisting></para>
+
+<para>
+The <emphasis>
+changed</emphasis>
+ field specifies the name components that have changed and is the bitwise
+inclusive OR of the valid names mask bits defined in Table 18.1. The rest of
+the fields in the structure specify the ranges that have changed for the
+various kinds of symbolic names, as shown in Table 18.2.
+</para>
+
+<table frame='topbot'>
+<title>XkbNameChanges Fields</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='4' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='2.0*'/>
+<colspec colname='c2' colwidth='1.0*'/>
+<colspec colname='c3' colwidth='1.0*'/>
+<colspec colname='c4' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Mask</entry>
+  <entry>Fields</entry>
+  <entry>Component</entry>
+  <entry>Field</entry>
+</row>
+</thead>
+<tbody>
+<row>
+    <entry>XkbKeyTypeNamesMask</entry>
+    <entry>
+<para>first_type,</para>
+<para>num_types</para>
+    </entry>
+    <entry>Xkb-&gt;map</entry>
+    <entry>type[*].name</entry>
+</row>
+<row>
+    <entry>XkbKTLevelNamesMask</entry>
+    <entry>
+<para>first_lvl,</para>
+<para>num_lvls</para>
+    </entry>
+    <entry>Xkb-&gt;map</entry>
+    <entry>type[*].lvl_names[*]</entry>
+</row>
+<row>
+    <entry>XkbKeyAliasesMask</entry>
+    <entry>num_aliases</entry>
+    <entry>Xkb-&gt;names</entry>
+    <entry>key_aliases[*]</entry>
+</row>
+<row>
+    <entry>XkbRGNamesMask</entry>
+    <entry>num_rg</entry>
+    <entry>Xkb-&gt;names</entry>
+    <entry>radio_groups[*]</entry>
+</row>
+<row>
+    <entry>XkbKeyNamesMask</entry>
+    <entry>
+<para>first_key,</para>
+<para>num_keys</para>
+    </entry>
+    <entry>Xkb-&gt;names</entry>
+    <entry>keys[*]</entry>
+</row>
+<row>
+    <entry>XkbVirtualModNamesMask</entry>
+    <entry>changed_vmods</entry>
+    <entry>Xkb-&gt;names</entry>
+    <entry>vmods[*]</entry>
+</row>
+<row>
+    <entry>XkbIndicatorNamesMask</entry>
+    <entry>changed_indicators</entry>
+    <entry>Xkb-&gt;names</entry>
+    <entry>indicators[*]</entry>
+</row>
+<row>
+    <entry>XkbGroupNamesMask</entry>
+    <entry>changed_groups</entry>
+    <entry>Xkb-&gt;names</entry>
+    <entry>groups[*]</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+<emphasis>
+XkbChangeNames</emphasis>
+ provides a more flexible method for changing symbolic names than <emphasis>
+XkbSetNames</emphasis>
+ and requires the use of an <emphasis>
+XkbNameChangesRec</emphasis>
+ structure.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbChangeNames</emphasis>
+(<emphasis>
+dpy, xkb, changes</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *            <emphasis>
+dpy</emphasis>
+;            /* connection to the X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr      <emphasis>
+      xkb</emphasis>
+;            /* keyboard description from which names are to be taken */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbNameChangesPtr      <emphasis>
+      changes</emphasis>
+;            /* names map components to be updated on the server */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbChangeNames</emphasis>
+ copies any names specified by <emphasis>
+changes</emphasis>
+ from the keyboard description, <emphasis>
+xkb</emphasis>
+, to the X server specified by <emphasis>
+dpy</emphasis>
+.<emphasis>
+ XkbChangeNames</emphasis>
+ aborts and returns <emphasis>
+False</emphasis>
+ if any illegal type names or type shift level names are specified by <emphasis>
+changes</emphasis>
+.
+</para>
+
+</sect3>
+</sect2>
+</sect1>
+<sect1 id='Tracking_Name_Changes'>
+<title>Tracking Name Changes</title>
+
+<para>
+Whenever a symbolic name changes in the server’s keyboard description, the
+server sends a <emphasis>
+XkbNamesNotify</emphasis>
+ event to all interested clients. To receive name notify events, use <emphasis>
+XkbSelectEvents</emphasis>
+ (see section 4.3) with <emphasis>
+XkbNamesNotifyMask</emphasis>
+ in both the <emphasis>
+bits_to_change</emphasis>
+ and <emphasis>
+values_for_bits</emphasis>
+ parameters.
+</para>
+
+
+<para>
+To receive events for only specific names, use <emphasis>
+XkbSelectEventDetails</emphasis>
+. Set the <emphasis>
+event_type</emphasis>
+ parameter to <emphasis>
+XkbNamesNotify</emphasis>
+, and set both the <emphasis>
+bits_to_change </emphasis>
+and<emphasis>
+ values_for_bits</emphasis>
+ detail parameter to a mask composed of a bitwise OR of masks in Table 18.1.
+</para>
+
+
+<para>
+The structure for the <emphasis>
+XkbNamesNotify</emphasis>
+ event is defined as follows:
+</para>
+
+<para><programlisting>
+typedef struct {
+      int      type;                  /* Xkb extension base event code */
+      unsigned long      serial;      /* X server serial number for
+                                         event */
+      Bool      send_event;           /* <emphasis>True</emphasis>
+                                         =&gt; synthetically generated */
+      Display *      display;         /* server connection where event
+                                         generated */
+      Time      time;                 /* server time when event generated */
+      int      xkb_type;              /* <emphasis>XkbNamesNotify</emphasis> */
+      int      device;                /* Xkb device ID, will not be
+                                         <emphasis>XkbUseCoreKbd</emphasis> */
+      unsigned int      changed;      /* mask of name components
+that have changed */
+      int      first_type;            /* first key type with a new name */
+      int      num_types;             /* number of types with new names */
+      int      first_lvl;             /* first key type with new level names */
+      int      num_lvls;              /* number of key types with new level names */
+      int      num_aliases;           /* if key aliases changed, total number
+                                         of key aliases */
+      int      num_radio_groups;      /* if radio groups changed,
+                                         total number of radio groups */
+      unsigned int      changed_vmods;  /* mask of virtual modifiers for
+                                           which names have changed */
+      unsigned int      changed_groups; /* mask of groups for
+                                           which names were changed */
+      unsigned int      changed_indicators;  /* mask of indicators for which
+                                                names were changed */
+      int      first_key;             /* first key with a new name */
+      int      num_keys;              /* number of keys with new names */
+} <emphasis>XkbNamesNotifyEvent</emphasis>;
+</programlisting></para>
+
+<para>
+The <emphasis>
+changed</emphasis>
+ field specifies the name components that have changed and is the bitwise
+inclusive OR of the valid names mask bits defined in Table 18.1. The other
+fields in this event are interpreted as the like-named fields in an <emphasis>
+XkbNameChangesRec</emphasis> , as previously defined.
+</para>
+
+
+<para>
+When your application receives a X<emphasis>
+kbNamesNotify</emphasis>
+ event, you can note the changed names in a changes structure using <emphasis>
+XkbNoteNameChanges</emphasis>
+.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbNoteNameChanges</emphasis>
+(<emphasis>
+old</emphasis>
+,<emphasis>
+ new</emphasis>
+,<emphasis>
+ wanted</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbNameChangesPtr            <emphasis>
+old</emphasis>
+;            /* <emphasis>
+XkbNameChanges</emphasis>
+ structure to be updated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbNamesNotifyEvent *            <emphasis>
+new</emphasis>
+;            /* event from which changes are to be copied */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+wanted</emphasis>
+;            /* types of names for which changes are to be noted */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+The <emphasis>
+wanted</emphasis>
+ parameter is the bitwise inclusive OR of the valid names mask bits shown in
+Table 18.1. <emphasis>
+XkbNoteNameChanges</emphasis>
+ copies any changes that are reported in <emphasis>
+new</emphasis>
+ and specified in <emphasis>
+wanted</emphasis>
+ into the changes record specified by <emphasis>
+old</emphasis>
+.
+</para>
+
+
+<para>
+To update the local copy of the keyboard description with the actual values,
+pass to <emphasis>
+XkbGetNameChanges</emphasis>
+ the results of one or more calls to <emphasis>
+XkbNoteNameChanges</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbGetNameChanges</emphasis>
+(<emphasis>
+dpy</emphasis>
+,<emphasis>
+ xkb</emphasis>
+,<emphasis>
+ changes</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *            <emphasis>
+dpy</emphasis>
+;            /* connection to the X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr            <emphasis>
+xkb</emphasis>
+;            /* keyboard description to which names are copied */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbNameChangesPtr            <emphasis>
+changes</emphasis>
+;            /* names components to be obtained from the server */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetNameChanges</emphasis>
+ examines the <emphasis>
+changes</emphasis>
+ parameter, retrieves the necessary information from the server, and places the
+results into the <emphasis>
+xkb</emphasis>
+ keyboard description.
+</para>
+
+
+<para>
+<emphasis>
+XkbGetNamesChanges</emphasis>
+ can generate <emphasis>
+BadAlloc</emphasis>
+, <emphasis>
+BadImplementation,</emphasis>
+ and <emphasis>
+BadMatch</emphasis>
+ errors.
+</para>
+
+
+</sect1>
+<sect1 id='Allocating_and_Freeing_Symbolic_Names'>
+<title>Allocating and Freeing Symbolic Names</title>
+
+<para>
+Most applications do not need to directly allocate symbolic names structures.
+Do not allocate a names structure directly using <emphasis>
+malloc</emphasis>
+ or <emphasis>
+Xmalloc</emphasis>
+ if your application changes the number of key aliases or radio groups or
+constructs a symbolic names structure without loading the necessary components
+from the X server. Instead use <emphasis>
+XkbAllocNames</emphasis>
+.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbAllocNames</emphasis>
+(<emphasis>
+xkb, which, num_rg, num_key_aliases)</emphasis>
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr      <emphasis>
+xkb;</emphasis>
+      /* keyboard description for which names are to be allocated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+which;</emphasis>
+      /* mask of names to be allocated */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+num_rg;</emphasis>
+      /* total number of radio group names needed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int      <emphasis>
+num_key_aliases;</emphasis>
+      /* total number of key aliases needed */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbAllocNames</emphasis>
+ can return <emphasis>
+BadAlloc</emphasis>
+, <emphasis>
+BadMatch,</emphasis>
+ and <emphasis>
+BadValue</emphasis>
+ errors.<emphasis>
+ </emphasis>
+The <emphasis>
+which</emphasis>
+ parameter is the bitwise inclusive OR of the valid names mask bits defined in
+Table 18.1.
+</para>
+
+
+<para>
+Do not free symbolic names structures directly using <emphasis>
+free</emphasis>
+ or <emphasis>
+XFree</emphasis>
+. Use <emphasis>
+XkbFreeNames</emphasis>
+ instead.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbFreeNames</emphasis>
+(<emphasis>
+xkb, which, free_map)</emphasis>
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDescPtr      <emphasis>
+xkb</emphasis>
+;      /* keyboard description for which names are to be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+which</emphasis>
+;      /* mask of names components to be freed */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool      <emphasis>
+free_map</emphasis>
+;      /* <emphasis>
+True</emphasis>
+ =&gt; XkbNamesRec structure itself should be freed */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+The <emphasis>
+which</emphasis>
+ parameter is the bitwise inclusive OR of the valid names mask bits defined in
+Table 18.1.
+</para>
+</sect1>
+</chapter>
diff --git a/specs/XKB/ch19.xml b/specs/XKB/ch19.xml
new file mode 100644 (file)
index 0000000..4b4b0a0
--- /dev/null
@@ -0,0 +1,329 @@
+<chapter id='Replacing_a_Keyboard_On_the_Fly'>
+<title>Replacing a Keyboard "On the Fly"</title>
+
+<para>
+Some operating system and X server implementations allow "hot plugging" of
+input devices. When using these implementations, input devices can be unplugged
+and new ones plugged in without restarting the software that is using those
+devices. There is no provision in the standard X server for notification of
+client programs if input devices are unplugged and/or new ones plugged in. In
+the case of the X keyboard, this could result in the X server having a keymap
+that does not match the new keyboard.
+</para>
+
+
+<para>
+If the X server implementation supports the X input device extension, a client
+program may also change the X keyboard programmatically. The
+XChangeKeyboardDevice input extension request allows a client to designate an
+input extension keyboard device as the X keyboard, in which case the old X
+keyboard device becomes inaccessible except via the input device extension. In
+this case, core protocol <emphasis>
+XMappingNotify</emphasis>
+ and input extension <emphasis>
+XChangeDeviceNotify</emphasis>
+ events are generated to notify all clients that a new keyboard with a new
+keymap has been designated.
+</para>
+
+
+<para>
+When a client opens a connection to the X server, the server reports the
+minimum and maximum keycodes. The server keeps track of the minimum and maximum
+keycodes last reported to each client. When delivering events to a particular
+client, the server filters out any events that fall outside of the valid range
+for the client.
+</para>
+
+
+<para>
+Xkb provides an <emphasis>
+XkbNewKeyboardNotify</emphasis>
+ event that reports a change in keyboard geometry and/or the range of supported
+keycodes. The server can generate an <emphasis>
+XkbNewKeyboardNotify</emphasis>
+ event when it detects a new keyboard or in response to an <emphasis>
+XkbGetKeyboardByName</emphasis>
+ request that loads a new keyboard description. Selecting for <emphasis>
+XkbNewKeyboardNotify</emphasis>
+ events allows Xkb-aware clients to be notified whenever a keyboard change
+occurs that may affect the keymap.
+</para>
+
+
+<para>
+When a client requests <emphasis>
+XkbNewKeyboardNotify</emphasis>
+ events, the server compares the range of keycodes for the current keyboard to
+the range of keycodes that are valid for the client. If they are not the same,
+the server immediately sends the client an <emphasis>
+XkbNewKeyboardNotify</emphasis>
+ event. Even if the "new" keyboard is not new to the server, it is new to this
+particular client.
+</para>
+
+
+<para>
+When the server sends an <emphasis>
+XkbNewKeyboardNotify</emphasis>
+ event to a client to inform it of a new keycode range, it resets the stored
+range of legal keycodes for the client to the keycode range reported in the
+event; it does not reset this range for the client if it does not sent an
+<emphasis>
+XkbNewKeyboardNotify</emphasis>
+ event to a client. Because Xkb-unaware clients and Xkb-aware clients that do
+not request <emphasis>
+XkbNewKeyboardNotify</emphasis>
+ events are never sent these events, the server’s notion of the legal keycode
+range never changes, and these clients never receive events from keys that fall
+outside of their notion of the legal keycode range.
+</para>
+
+
+<para>
+Clients that have not selected to receive <emphasis>
+XkbNewKeyboardNotify</emphasis>
+ events do, however, receive the <emphasis>
+XkbNewKeyboardNotify</emphasis>
+ event when a keyboard change occurs. Clients that have not selected to receive
+this event also receive numerous other events detailing the individual changes
+that occur when a keyboard change occurs.
+</para>
+
+
+<para>
+Clients wishing to track changes in <emphasis>
+min_key_code</emphasis>
+ and <emphasis>
+max_key_code</emphasis>
+ must watch for both <emphasis>
+XkbNewKeyboardNotify</emphasis>
+ and <emphasis>
+XkbMapNotify</emphasis>
+ events, because a simple mapping change causes an <emphasis>
+XkbMapNotify</emphasis>
+ event and may change the range of valid keycodes, but does not cause an
+<emphasis>
+XkbNewKeyboardNotify</emphasis>
+ event. If a client does not select for <emphasis>
+XkbNewKeyboardNotify</emphasis>
+ events, the server restricts the range of keycodes reported to the client.
+</para>
+
+
+<para>
+In addition to filtering out-of-range key events, Xkb:
+</para>
+
+<itemizedlist>
+<listitem>
+  <para>
+Adjusts core protocol <emphasis>
+MappingNotify</emphasis>
+ events to refer only to keys that match the stored legal range.
+  </para>
+</listitem>
+<listitem>
+  <para>
+Reports keyboard mappings for keys that match the stored legal range to clients
+that issue a core protocol <emphasis>
+GetKeyboardMapping</emphasis>
+ request.
+  </para>
+</listitem>
+<listitem>
+  <para>
+Reports modifier mappings only for keys that match the stored legal range to
+clients that issue a core protocol <emphasis>
+GetModifierMapping</emphasis>
+ request.
+  </para>
+</listitem>
+<listitem>
+  <para>
+Restricts the core protocol <emphasis>
+ChangeKeyboardMapping</emphasis>
+ and <emphasis>
+SetModifierMapping</emphasis>
+ requests to keys that fall inside the stored legal range.
+  </para>
+</listitem>
+</itemizedlist>
+
+<para>
+In short, Xkb does everything possible to hide from Xkb-unaware clients the
+fact that the range of legal keycodes has changed, because such clients cannot
+be expected to deal with them. Xkb events and requests are not modified in this
+manner; all Xkb events report the full range of legal keycodes. No requested
+Xkb events are discarded, and no Xkb requests have their keycode range clamped.
+</para>
+
+
+<para>
+The structure for the <emphasis>
+XkbNewKeyboardNotify</emphasis>
+ event is defined as follows:
+</para>
+
+<para><programlisting>
+typedef struct _XkbNewKeyboardNotify {
+      int            type;         /* Xkb extension base event code */
+      unsigned long  serial;       /* X server serial number for event*/
+      Bool           send_event;   /* <emphasis>True</emphasis>
+                                      =&gt; synthetically generated */
+      Display *      display;      /* server connection where event generated */
+      Time           time;         /* server time when event generated */
+      int            xkb_type;  /* <emphasis>XkbNewKeyboardNotify</emphasis> */
+      int            device;       /* device ID of new keyboard */
+      int            old_device;   /* device ID of old keyboard */
+      int            min_key_code; /* min keycode of new keyboard */
+      int            max_key_code; /* max keycode of new keyboard */
+      int            old_min_key_code; /* min keycode of old keyboard */
+      int            old_max_key_code; /* max keycode of old keyboard */
+      unsigned int            changed; /* changed aspects - see masks below */
+      char            req_major;   /* major request that caused change */
+      char            req_minor;   /* minor request that caused change */
+} <emphasis>XkbNewKeyboardNotifyEvent</emphasis>;
+</programlisting></para>
+
+<para>
+To receive name notify events, use <emphasis>
+XkbSelectEvents</emphasis>
+ (see section 4.3) with <emphasis>
+XkbNewKeyboardNotifyMask</emphasis>
+ in both the <emphasis>
+bits_to_change</emphasis>
+ and <emphasis>
+values_for_bits</emphasis>
+ parameters. To receive events for only specific names, use <emphasis>
+XkbSelectEventDetails</emphasis>
+. Set the <emphasis>
+event_type</emphasis>
+ parameter to <emphasis>
+XkbNewKeyboardNotify</emphasis>
+, and set both the <emphasis>
+bits_to_change </emphasis>
+and<emphasis>
+ values_for_bits</emphasis>
+ detail parameter to a mask composed of a bitwise OR of masks in Table 19.1.
+</para>
+
+<table frame='topbot'>
+<title>XkbNewKeyboardNotifyEvent Details</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='3' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='2.0*'/>
+<colspec colname='c2' colwidth='1.0*'/>
+<colspec colname='c3' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>XkbNewKeyboardNotify Event Details</entry>
+  <entry>Value</entry>
+  <entry>Circumstances</entry>
+  </row>
+</thead>
+<tbody>
+  <row>
+    <entry><emphasis>XkbNKN_KeycodesMask</emphasis></entry>
+    <entry>(1L&lt;&lt;0)</entry>
+    <entry>Notification of keycode range changes wanted</entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbNKN_GeometryMask</emphasis></entry>
+    <entry>(1L&lt;&lt;1)</entry>
+    <entry>Notification of geometry changes wanted</entry>
+  </row>
+  <row>
+    <entry>XkbNKN_DeviceIDMask</entry>
+    <entry>(1L&lt;&lt;2)</entry>
+    <entry>Notification of device ID changes wanted</entry>
+  </row>
+  <row>
+    <entry><emphasis>XkbNKN_AllChangesMask</emphasis></entry>
+    <entry>(0x7)</entry>
+    <entry>Includes all of the above masks</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+The <emphasis>
+req_major</emphasis>
+ and <emphasis>
+req_minor</emphasis>
+ fields indicate what type of keyboard change has occurred.
+</para>
+
+
+<para>
+If <emphasis>
+req_major</emphasis>
+ and <emphasis>
+req_minor</emphasis>
+ are zero, the device change was not caused by a software request to the server
+— a spontaneous change has occurred, such as hot-plugging a new device. In
+this case, <emphasis>
+device</emphasis>
+ is the device identifier for the new, current X keyboard device, but no
+implementation-independent guarantee can be made about <emphasis>
+old_device</emphasis>
+. <emphasis>
+old_device</emphasis>
+ may be identical to <emphasis>
+device</emphasis>
+ (an implementor is permitted to reuse the device specifier when the device
+changes); or it may be different. Note that <emphasis>
+req_major</emphasis>
+ and <emphasis>
+req_minor</emphasis>
+ being zero do not necessarily mean that the physical keyboard device has
+changed; rather, they only imply a spontaneous change outside of software
+control (some systems have keyboards that can change personality at the press
+of a key).
+</para>
+
+
+<para>
+If the keyboard change is the result of an X Input Extension <emphasis>
+ChangeKeyboardDevice</emphasis>
+ request, <emphasis>
+req_major</emphasis>
+ contains the input extension major opcode, and <emphasis>
+req_minor</emphasis>
+ contains the input extension request number for <emphasis>
+X_ChangeKeyboardDevice</emphasis>
+. In this case, <emphasis>
+device</emphasis>
+ and <emphasis>
+old_device</emphasis>
+ are different, with <emphasis>
+device</emphasis>
+ being the identifier for the new, current X keyboard device, and <emphasis>
+old_device</emphasis>
+ being the identifier for the former device.
+</para>
+
+
+<para>
+If the keyboard change is the result of an <emphasis>
+XkbGetKeyboardByName</emphasis>
+ function call, which generates an <emphasis>
+X_kbGetKbdByName</emphasis>
+ request, <emphasis>
+req_major</emphasis>
+ contains the Xkb extension base event code (see section 2.4), and <emphasis>
+req_minor</emphasis>
+ contains the event code for the Xkb extension request <emphasis>
+X_kbGetKbdByName</emphasis>
+. <emphasis>
+device</emphasis>
+ contains the device identifier for the new device, but nothing definitive can
+be said for <emphasis>
+old_device</emphasis>
+; it may be identical to <emphasis>
+device</emphasis>
+, or it may be different, depending on the implementation.
+</para>
+
+</chapter>
diff --git a/specs/XKB/ch20.xml b/specs/XKB/ch20.xml
new file mode 100644 (file)
index 0000000..6067b5b
--- /dev/null
@@ -0,0 +1,1196 @@
+<chapter id='Server_Database_of_Keyboard_Components'>
+<title>Server Database of Keyboard Components</title>
+
+<para>
+The X server maintains a database of keyboard components, identified by
+component type. The database contains all the information necessary to build a
+complete keyboard description for a particular device, as well as to assemble
+partial descriptions. Table 20.1 identifies the component types and the type of
+information they contain.
+</para>
+
+<table frame='topbot'>
+<title>Server Database Keyboard Components</title>
+<?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.5*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Component Type</entry>
+  <entry>Component Primary Contents</entry>
+  <entry>May also contain</entry>
+  </row>
+</thead>
+<tbody>
+  <row>
+    <entry>Keymap</entry>
+    <entry>
+<para>Complete keyboard description</para>
+<para>Normally assembled using a complete component from each of the other types</para>
+    </entry>
+    <entry></entry>
+  </row>
+  <row>
+    <entry>Keycodes</entry>
+    <entry>
+<para>Symbolic name for each key</para>
+<para>Minimum and maximum legal keycodes</para>
+    </entry>
+    <entry>
+<para>Aliases for some keys</para>
+<para>Symbolic names for indicators</para>
+<para>Description of indicators physically present</para>
+    </entry>
+  </row>
+  <row>
+    <entry>Types</entry>
+    <entry>Key types</entry>
+    <entry>
+Real modifier bindings and symbolic names for some virtual modifiers
+    </entry>
+  </row>
+  <row>
+    <entry>Compatibility</entry>
+    <entry>Rules used to assign actions to keysyms</entry>
+    <entry>
+<para>Maps for some indicators</para>
+<para>Real modifier bindings and symbolic names for some virtual modifiers</para>
+    </entry>
+  </row>
+  <row>
+    <entry>Symbols</entry>
+    <entry>
+<para>Symbol mapping for keyboard keys</para>
+<para>Modifier mapping</para>
+<para>Symbolic names for groups</para>
+    </entry>
+    <entry>
+<para>Explicit actions and behaviors for some keys</para>
+<para>Real modifier bindings and symbolic names for some virtual modifiers</para>
+    </entry>
+  </row>
+  <row>
+    <entry>Geometry</entry>
+    <entry>Layout of the keyboard</entry>
+    <entry>
+<para>Aliases for some keys; overrides keycodes component aliases</para>
+<para>Symbolic names for some indicators</para>
+<para>Description of indicators physically present</para>
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+While a keymap is a database entry for a complete keyboard description, and
+therefore logically different from the individual component database entries,
+the rules for processing keymap entries are identical to those for the
+individual components. In the discussion that follows, the term component is
+used to refer to either individual components or a keymap.
+</para>
+
+<para>
+There may be multiple entries for each of the component types. An entry may be
+either <emphasis>
+complete</emphasis>
+ or <emphasis>
+partial</emphasis>
+. Partial entries describe only a piece of the corresponding keyboard component
+and are designed to be combined with other entries of the same type to form a
+complete entry.
+</para>
+
+<para>
+For example, a partial symbols map might describe the differences between a
+common ASCII keyboard and some national layout. Such a partial map is not
+useful on its own because it does not include those symbols that are the same
+on both the ASCII and national layouts (such as function keys). On the other
+hand, this partial map can be used to configure <emphasis>
+any</emphasis>
+ ASCII keyboard to use a national layout.
+</para>
+
+<para>
+When a keyboard description is built, the components are processed in the order
+in which they appear in Table 20.1; later definitions override earlier ones.
+</para>
+
+<sect1 id='Component_Names'>
+<title>Component Names</title>
+
+<para>
+Component names have the form "<emphasis>
+class(member)</emphasis>
+" where <emphasis>
+class</emphasis>
+ describes a subset of the available components for a particular type and the
+optional <emphasis>
+member</emphasis>
+ identifies a specific component from that subset. For example, the name
+"atlantis(acme)" for a symbols component might specify the symbols used for the
+atlantis national keyboard layout by the vendor "acme." Each class has an
+optional <emphasis>
+default</emphasis>
+ member — references that specify a class but not a member refer to the
+default member of the class, if one exists. Xkb places no constraints on the
+interpretation of the class and member names used in component names.
+</para>
+
+<para>
+The <emphasis>
+class</emphasis>
+ and <emphasis>
+member</emphasis>
+ names are both specified using characters from the Latin-1 character set. Xkb
+implementations must accept all alphanumeric characters, minus (‘-’) and
+underscore (‘_’) in class or member names, and must not accept parentheses,
+plus, vertical bar, percent sign, asterisk, question mark, or white space. The
+use of other characters is implementation-dependent.
+</para>
+
+</sect1>
+<sect1 id='Listing_the_Known_Keyboard_Components'>
+<title>Listing the Known Keyboard Components</title>
+
+<para>
+You may ask the server for a list of components for one or more component
+types. The request takes the form of a set of patterns, one pattern for each of
+the component types, including a pattern for the complete keyboard description.
+To obtain this list, use <emphasis>
+XkbListComponents</emphasis>
+.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+XkbComponentListPtr<emphasis>
+ XkbListComponents</emphasis>
+(<emphasis>
+dpy</emphasis>
+, <emphasis>
+device_spec</emphasis>
+, <emphasis>
+ptrns</emphasis>
+, <emphasis>
+max_inout</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *      <emphasis>
+            dpy</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int                  <emphasis>
+device_spec</emphasis>
+;            /* device ID, or <emphasis>
+XkbUseCoreKbd</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbComponentNamesPtr                  <emphasis>
+ptrns</emphasis>
+;            /* namelist for components of interest */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int *                  <emphasis>
+max_inout</emphasis>
+;            /* max # returned names, # left over */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbListComponents</emphasis>
+ queries the server for a list of component names matching the patterns
+specified in <emphasis>
+ptrns</emphasis>
+. It waits for a reply and returns the matching component names in an <emphasis>
+XkbComponentListRec</emphasis>
+ structure. When you are done using the structure, you should free it using
+<emphasis>
+XkbFreeComponentList</emphasis>
+. <emphasis>
+device_spec</emphasis>
+ indicates a particular device in which the caller is interested. A server is
+allowed (but not required) to restrict its reply to portions of the database
+that are relevant for that particular device.
+</para>
+
+
+<para>
+<emphasis>
+ptrns</emphasis>
+ is a pointer to an <emphasis>
+XkbComponentNamesRec</emphasis>
+, described below. Each of the fields in <emphasis>
+ptrns</emphasis>
+ contains a pattern naming the components of interest. Each of the patterns is
+composed of characters from the ISO <emphasis>
+Latin1</emphasis>
+ encoding, but can contain only parentheses, the wildcard characters
+‘<emphasis>
+?</emphasis>
+’ and ‘<emphasis>
+*</emphasis>
+’, and characters permitted in a component class or member name (see section
+20.1). A pattern may be <emphasis>
+NULL</emphasis>
+, in which case no components for that type is returned. Pattern matches with
+component names are case sensitive. The ‘<emphasis>
+?</emphasis>
+’ wildcard matches any single character, except a left or right parenthesis;
+the ‘<emphasis>
+*</emphasis>
+’ wildcard matches any number of characters, except a left or right
+parenthesis. If an implementation allows additional characters in a component
+class or member name other than those required by the Xkb extension (see
+section 20.1), the result of comparing one of the additional characters to
+either of the wildcard characters is implementation-dependent.
+</para>
+
+
+<para>
+If a pattern contains illegal characters, the illegal characters are ignored.
+The matching process is carried out as if the illegal characters were omitted
+from the pattern.
+</para>
+
+
+<para>
+<emphasis>
+max_inout</emphasis>
+ is used to throttle the amount of data passed to and from the server. On
+input, it specifies the maximum number of names to be returned (the total
+number of names in all component categories). Upon return from <emphasis>
+XkbListComponents</emphasis>
+, <emphasis>
+max_inout</emphasis>
+ contains the number of names that matched the request but were not returned
+because of the limit.
+</para>
+
+
+<para>
+The component name patterns used to describe the request are passed to
+<emphasis>
+XkbListComponents</emphasis>
+ using an <emphasis>
+XkbComponentNamesRec</emphasis>
+ structure. This structure has no special allocation constraints or
+interrelationships with other structures; allocate and free this structure
+using standard <emphasis>
+malloc</emphasis>
+ and <emphasis>
+free</emphasis>
+ calls or their equivalent:
+</para>
+
+<para><programlisting>
+typedef struct _XkbComponentNames {
+      char *       keymap;    /* keymap names */
+      char *       keycodes;  /* keycode names */
+      char *       types;     /* type names */
+      char *       compat;    /* compatibility map names */
+      char *       symbols;   /* symbol names */
+      char *       geometry;  /* geometry names */
+} <emphasis>XkbComponentNamesRec</emphasis>, *XkbComponentNamesPtr;
+</programlisting></para>
+
+<para>
+<emphasis>
+XkbListComponents</emphasis>
+ returns a pointer to an <emphasis>
+XkbComponentListRec</emphasis>
+:
+</para>
+
+<para><programlisting>
+typedef struct _XkbComponentList {
+      int                  num_keymaps;     /* number of entries in keymap */
+      int                  num_keycodes;    /* number of entries in keycodes */
+      int                  num_types;       /* number of entries in types */
+      int                  num_compat;      /* number of entries in compat */
+      int                  num_symbols;     /* number of entries in symbols */
+      int                  num_geometry;    /* number of entries in geometry;
+      XkbComponentNamePtr  keymap;          /* keymap names */
+      XkbComponentNamePtr  keycodes;        /* keycode names */
+      XkbComponentNamePtr  types;           /* type names */
+      XkbComponentNamePtr  compat;          /* compatibility map names */
+      XkbComponentNamePtr  symbols;         /* symbol names */
+      XkbComponentNamePtr  geometry;        /* geometry names */
+} <emphasis>XkbComponentListRec</emphasis>, *XkbComponentListPtr;
+</programlisting></para>
+
+<para><programlisting>
+typedef struct _XkbComponentName {
+      unsigned short         flags;     /* hints regarding component name */
+      char *                 name;      /* name of component */
+} <emphasis>XkbComponentNameRec</emphasis>, *XkbComponentNamePtr;
+</programlisting></para>
+
+<para>
+Note that the structure used to specify patterns on input is an <emphasis>
+XkbComponentNamesRec</emphasis>
+, and that used to hold the individual component names upon return is an
+<emphasis>
+XkbComponentNameRec</emphasis>
+ (no trailing ‘s’ in Name).
+</para>
+
+
+<para>
+When you are done using the structure returned by <emphasis>
+XkbListComponents</emphasis>
+, free it using <emphasis>
+XkbFreeComponentList</emphasis>
+.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbFreeComponentList</emphasis>
+(list)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbComponentListPtr                   list;      /* pointer to <emphasis>
+XkbComponentListRec</emphasis>
+ to free */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+
+</sect1>
+<sect1 id='Component_Hints'>
+<title>Component Hints</title>
+
+<para>
+A set of flags is associated with each component; these flags provide
+additional hints about the component’s use. These hints are designated by bit
+masks in the flags field of the <emphasis>
+XkbComponentNameRec</emphasis>
+ structures contained in the <emphasis>
+XkbComponentListRec</emphasis>
+ returned from <emphasis>
+XkbListComponents</emphasis>
+. The least significant byte of the flags field has the same meaning for all
+types of keyboard components; the interpretation of the most significant byte
+is dependent on the type of component. The flags bits are defined in Table
+20.2. The symbols hints in Table 20.2 apply only to partial symbols components
+(those with <emphasis>
+XkbLC_Partial</emphasis>
+ also set); full symbols components are assumed to specify all of the pieces.
+</para>
+
+
+<para>
+The alphanumeric, modifier, keypad or function keys symbols hints should
+describe the primary intent of the component designer and should not be simply
+an exhaustive list of the kinds of keys that are affected. For example,
+national keyboard layouts affect primarily alphanumeric keys, but many affect a
+few modifier keys as well; such mappings should set only the <emphasis>
+XkbLC_AlphanumericKeys</emphasis>
+ hint. In general, symbols components should set only one of the four flags
+(<emphasis>
+XkbLC_AlternateGroup</emphasis>
+ may be combined with any of the other flags).
+</para>
+
+<table frame='topbot'>
+<title>XkbComponentNameRec Flags Bits</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='4' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.5*'/>
+<colspec colname='c2' colwidth='3.0*'/>
+<colspec colname='c3' colwidth='2.0*'/>
+<colspec colname='c4' colwidth='1.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Component Type</entry>
+  <entry>Component Hints (flags)</entry>
+  <entry>Meaning</entry>
+  <entry>Value</entry>
+</row>
+</thead>
+<tbody>
+<row>
+    <entry>All Components</entry>
+    <entry><para><emphasis>XkbLC_Hidden</emphasis></para></entry>
+    <entry>Do not present to user</entry>
+    <entry>(1L&lt;&lt;0)</entry>
+</row>
+<row>
+    <entry></entry>
+    <entry><emphasis>XkbLC_Default</emphasis></entry>
+    <entry>Default member of class</entry>
+    <entry>(1L&lt;&lt;1)</entry>
+</row>
+<row>
+    <entry></entry>
+    <entry><emphasis>XkbLC_Partial</emphasis></entry>
+    <entry>Partial component</entry>
+    <entry>(1L&lt;&lt;2)</entry>
+</row>
+<row>
+    <entry>Keymap</entry>
+    <entry>none</entry>
+    <entry></entry>
+    <entry></entry>
+</row>
+<row>
+    <entry>Keycodes</entry>
+    <entry>none</entry>
+    <entry></entry>
+    <entry></entry>
+</row>
+<row>
+    <entry>Types</entry>
+    <entry>none</entry>
+    <entry></entry>
+    <entry></entry>
+</row>
+<row>
+    <entry>Compatibility</entry>
+    <entry>none</entry>
+    <entry></entry>
+    <entry></entry>
+</row>
+<row>
+    <entry>Symbols</entry>
+    <entry><emphasis>XkbLC_AlphanumericKeys</emphasis></entry>
+    <entry>Bindings primarily for alphanumeric keyboard section</entry>
+    <entry>(1L&lt;&lt;8)</entry>
+</row>
+<row>
+    <entry></entry>
+    <entry><emphasis>XkbLC_ModifierKeys</emphasis></entry>
+    <entry>Bindings primarily for modifier keys</entry>
+    <entry>(1L&lt;&lt;9)</entry>
+</row>
+<row>
+    <entry></entry>
+    <entry><emphasis>XkbLC_KeypadKeys</emphasis></entry>
+    <entry>Bindings primarily for numeric keypad keys</entry>
+    <entry>(1L&lt;&lt;10)</entry>
+</row>
+<row>
+    <entry></entry>
+    <entry><emphasis>XkbLC_FunctionKeys</emphasis></entry>
+    <entry>Bindings primarily for function keys</entry>
+    <entry>(1L&lt;&lt;11)</entry>
+</row>
+<row>
+    <entry></entry>
+    <entry><emphasis>XkbLC_AlternateGroup</emphasis></entry>
+    <entry>Bindings for an alternate group</entry>
+    <entry>(1L&lt;&lt;12)</entry>
+</row>
+<row>
+    <entry>Geometry</entry>
+    <entry>none</entry>
+    <entry></entry>
+    <entry></entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+</sect1>
+<sect1 id='Building_a_Keyboard_Description_Using_the_Server_Database'>
+<title>Building a Keyboard Description Using the Server Database</title>
+
+<para>
+A client may request that the server fetch one or more components from its
+database and use those components to build a new server keyboard description.
+The new keyboard description may be built from scratch, or it may be built
+starting with the current keyboard description for a particular device. Once
+the keyboard description is built, all or part of it may be returned to the
+client. The parts returned to the client need not include all of the parts used
+to build the description. At the time it requests the server to build a new
+keyboard description, a client may also request that the server use the new
+description internally to replace the current keyboard description for a
+specific device, in which case the behavior of the device changes accordingly.
+</para>
+
+
+<para>
+To build a new keyboard description from a set of named components, and to
+optionally have the server use the resulting description to replace an active
+one, use <emphasis>
+XkbGetKeyboardByName</emphasis>
+.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+XkbDescPtr <emphasis>
+XkbGetKeyboardByName</emphasis>
+(<emphasis>
+dpy</emphasis>
+, <emphasis>
+device_spec</emphasis>
+, <emphasis>
+names</emphasis>
+, <emphasis>
+want</emphasis>
+, <emphasis>
+need</emphasis>
+, <emphasis>
+load</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *      <emphasis>
+            dpy</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int                  <emphasis>
+device_spec</emphasis>
+;            /* device ID, or <emphasis>
+XkbUseCoreKbd</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbComponentNamesPtr                  <emphasis>
+names</emphasis>
+;            /* names of components to fetch */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int                  <emphasis>
+want</emphasis>
+;            /* desired structures in returned record */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int                  <emphasis>
+need</emphasis>
+;            /* mandatory structures in returned record */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool                  <emphasis>
+load</emphasis>
+;            /* <emphasis>
+True</emphasis>
+ =&gt; load into <emphasis>
+device_spec</emphasis>
+ */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+names</emphasis>
+ contains a set of expressions describing the keyboard components the server
+should use to build the new keyboard description. <emphasis>
+want</emphasis>
+ and <emphasis>
+need</emphasis>
+ are bit fields describing the parts of the resulting keyboard description that
+should be present in the returned <emphasis>
+XkbDescRec</emphasis>
+.
+</para>
+
+
+<para>
+The individual fields in <emphasis>
+names</emphasis>
+ are <emphasis>
+component expressions</emphasis>
+ composed of keyboard component names (no wildcarding as may be used in
+<emphasis>
+XkbListComponents</emphasis>
+), the special component name symbol ‘%’, and the special operator
+characters ‘<emphasis>
++</emphasis>
+’ and ‘<emphasis>
+|</emphasis>
+’. A component expression is parsed left to right, as follows:
+</para>
+
+<itemizedlist>
+<listitem>
+  <para>
+The special component name "<emphasis>
+computed</emphasis>
+" may be used in <emphasis>
+keycodes</emphasis>
+ component expressions and refers to a component consisting of a set of
+keycodes computed automatically by the server as needed.
+  </para>
+</listitem>
+<listitem>
+  <para>
+The special component name "<emphasis>
+canonical</emphasis>
+" may be used in <emphasis>
+types</emphasis>
+ component expressions and refers to a partial component defining the four
+standard key types: <emphasis>
+ALPHABETIC</emphasis>
+, <emphasis>
+ONE_LEVEL</emphasis>
+, <emphasis>
+TWO_LEVEL</emphasis>
+, and <emphasis>
+KEYPAD</emphasis>
+.
+  </para>
+</listitem>
+<listitem>
+  <para>
+The special component name ‘<emphasis>
+%</emphasis>
+’ refers to the keyboard description for the device specified in <emphasis>
+device_spec</emphasis>
+ or the keymap names component. If a keymap names component is specified that
+does not begin with ‘+’ or ‘|’ and does not contain ‘<emphasis>
+%</emphasis>
+’, then ‘<emphasis>
+%</emphasis>
+’ refers to the description generated by the keymap names component.
+Otherwise, it refers to the keyboard description for <emphasis>
+device_spec</emphasis>
+.
+  </para>
+</listitem>
+<listitem>
+  <para>
+The ‘<emphasis>
++</emphasis>
+’ operator specifies that the following component should <emphasis>
+override</emphasis>
+ the currently assembled description; any definitions that are present in both
+components are taken from the second.
+  </para>
+</listitem>
+<listitem>
+  <para>
+The ‘<emphasis>
+|</emphasis>
+’ operator specifies that the next specified component should <emphasis>
+augment</emphasis>
+ the currently assembled description; any definitions that are present in both
+components are taken from the first.
+  </para>
+</listitem>
+<listitem>
+  <para>
+If the component expression begins with an operator, a leading ‘<emphasis>
+%</emphasis>
+’ is implied.
+  </para>
+</listitem>
+<listitem>
+  <para>
+If any unknown or illegal characters appear anywhere in the expression, the
+entire expression is invalid and is ignored.
+  </para>
+</listitem>
+</itemizedlist>
+
+<para>
+For example, if <emphasis>
+names-&gt;symbols</emphasis>
+ contained the expression "+de", it specifies that the default member of the
+"de" class of symbols should be applied to the current keyboard mapping,
+overriding any existing definitions (it could also be written "+de(default)").
+</para>
+
+
+<para>
+Here is a slightly more involved example: the expression
+"acme(ascii)+de(basic)|iso9995-3" constructs a German (de) mapping for the
+ASCII keyboard supplied by the "acme" vendor. The new definition begins with
+the symbols for the ASCII keyboard for Acme (<emphasis>
+acme(ascii)</emphasis>
+), overrides them with definitions for the basic German keyboard (<emphasis>
+de(basic)</emphasis>
+), and then applies the definitions from the default iso9995-3 keyboard
+(<emphasis>
+iso9995-3</emphasis>
+) to any undefined keys or groups of keys (part three of the iso9995 standard
+defines a common set of bindings for the secondary group, but allows national
+layouts to override those definitions where necessary).
+</para>
+
+<note><para>The interpretation of the above expression components (acme, ascii,
+de, basic, iso9995-3) is not defined by Xkb; only the operations and their
+ordering are.</para></note>
+
+<para>
+Note that the presence of a keymap <emphasis>
+names</emphasis>
+ component that does not contain ‘<emphasis>
+%</emphasis>
+’ (either explicit or implied by virtue of an expression starting with an
+operator) indicates a description that is independent of the keyboard
+description for the device specified in <emphasis>
+device_spec</emphasis>
+. The same is true of requests in which the keymap names component is empty and
+all five other names components contain expressions void of references to
+‘<emphasis>
+%</emphasis>
+’. Requests of this form allow you to deal with keyboard definitions
+independent of any actual device.
+</para>
+
+
+<para>
+The server parses all non-<emphasis>
+NULL</emphasis>
+ fields in <emphasis>
+names</emphasis>
+ and uses them to build a keyboard description. However, before parsing the
+expressions in <emphasis>
+names</emphasis>
+, the server ORs the bits in <emphasis>
+want</emphasis>
+ and <emphasis>
+need</emphasis>
+ together and examines the result in relationship to the expressions in
+<emphasis>
+names</emphasis>
+. Table 20.3 identifies the components that are required for each of the
+possible bits in <emphasis>
+want</emphasis>
+ or <emphasis>
+need</emphasis>
+. If a required component has not been specified in the <emphasis>
+names</emphasis>
+ structure (the corresponding field is <emphasis>
+NULL</emphasis>
+), the server substitutes the expression "<emphasis>
+%</emphasis>
+", resulting in the component values being taken from <emphasis>
+device_spec</emphasis>
+. In addition, if <emphasis>
+load</emphasis>
+ is <emphasis>
+True</emphasis>
+, the server modifies <emphasis>
+names</emphasis>
+ if necessary (again using a "<emphasis>
+%</emphasis>
+" entry) to ensure all of the following fields are non-<emphasis>
+NULL</emphasis>
+: <emphasis>
+types</emphasis>
+, <emphasis>
+keycodes</emphasis>
+, <emphasis>
+symbols</emphasis>
+, and <emphasis>
+compat</emphasis>
+.<emphasis>
+</emphasis>
+</para>
+
+<table frame='topbot'>
+<title>Want and Need Mask Bits and Required Names Components</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='3' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='2.4*'/>
+<colspec colname='c2' colwidth='2.6*'/>
+<colspec colname='c3' colwidth='1.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>want or need mask bit</entry>
+  <entry>Required names Components</entry>
+  <entry>value</entry>
+  </row>
+</thead>
+<tbody>
+  <row>
+    <entry>XkbGBN_TypesMask</entry>
+    <entry>Types</entry>
+    <entry>(1L&lt;&lt;0)</entry>
+  </row>
+  <row>
+    <entry>XkbGBN_CompatMapMask</entry>
+    <entry>Compat</entry>
+    <entry>(1L&lt;&lt;1)</entry>
+  </row>
+  <row>
+    <entry>XkbGBN_ClientSymbolsMask</entry>
+    <entry>Types + Symbols + Keycodes</entry>
+    <entry>(1L&lt;&lt;2)</entry>
+  </row>
+  <row>
+    <entry>XkbGBN_ServerSymbolsMask</entry>
+    <entry>Types + Symbols + Keycodes</entry>
+    <entry>(1L&lt;&lt;3)</entry>
+  </row>
+  <row>
+    <entry>XkbGBN_SymbolsMask</entry>
+    <entry>Symbols</entry>
+    <entry>(1L&lt;&lt;1)</entry>
+  </row>
+  <row>
+    <entry>XkbGBN_IndicatorMapMask</entry>
+    <entry>Compat</entry>
+    <entry>(1L&lt;&lt;4)</entry>
+  </row>
+  <row>
+    <entry>XkbGBN_KeyNamesMask</entry>
+    <entry>Keycodes</entry>
+    <entry>(1L&lt;&lt;5)</entry>
+  </row>
+  <row>
+    <entry>XkbGBN_GeometryMask</entry>
+    <entry>Geometry</entry>
+    <entry>(1L&lt;&lt;6)</entry>
+  </row>
+  <row>
+    <entry>XkbGBN_OtherNamesMask</entry>
+    <entry>Types + Symbols + Keycodes + Compat + Geometry</entry>
+    <entry>(1L&lt;&lt;7)</entry>
+  </row>
+  <row>
+    <entry>XkbGBN_AllComponentsMask</entry>
+    <entry></entry>
+    <entry>(0xff)</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+<emphasis>
+need</emphasis>
+ specifies a set of keyboard components that the server must be able to resolve
+in order for <emphasis>
+XkbGetKeyboardByName</emphasis>
+ to succeed; if any of the components specified in <emphasis>
+need</emphasis>
+ cannot be successfully resolved, <emphasis>
+XkbGetKeyboardByName</emphasis>
+ fails.
+</para>
+
+
+<para>
+<emphasis>
+want</emphasis>
+ specifies a set of keyboard components that the server should attempt to
+resolve, but that are not mandatory. If the server is unable to resolve any of
+these components, <emphasis>
+XkbGetKeyboardByName</emphasis>
+ still succeeds. Bits specified in <emphasis>
+want</emphasis>
+ that are also specified in <emphasis>
+need</emphasis>
+ have no effect in the context of <emphasis>
+want</emphasis>
+.
+</para>
+
+
+<para>
+If <emphasis>
+load</emphasis>
+ is <emphasis>
+True</emphasis>
+, the server updates its keyboard description for <emphasis>
+device_spec</emphasis>
+ to match the result of the keyboard description just built. If load is
+<emphasis>
+False</emphasis>
+, the server’s description for device <emphasis>
+device_spec</emphasis>
+ is not updated. In all cases, the parts specified by <emphasis>
+want</emphasis>
+ and <emphasis>
+need</emphasis>
+ from the just-built keyboard description are returned.
+</para>
+
+
+<para>
+The <emphasis>
+names</emphasis>
+ structure in an <emphasis>
+XkbDescRec</emphasis>
+ keyboard description record (see Chapter 18) contains one field for each of
+the five component types used to build a keyboard description. When a keyboard
+description is built from a set of database components, the corresponding
+fields in this <emphasis>
+names</emphasis>
+ structure are set to match the expressions used to build the component.
+</para>
+
+
+<para>
+The entire process of building a new keyboard description from the server
+database of components and returning all or part of it is diagrammed in Figure
+20.1:
+</para>
+
+<mediaobject>
+ <imageobject> <imagedata format="SVG" fileref="XKBlib-21.svg"/>
+ </imageobject>
+ <caption>Building a New Keyboard Description from the Server Database</caption>
+</mediaobject>
+
+<para>
+The information returned to the client in the <emphasis>
+XkbDescRec</emphasis>
+ is essentially the result of a series of calls to extract information from a
+fictitious device whose description matches the one just built. The calls
+corresponding to each of the mask bits are summarized in Table 20.4, together
+with the <emphasis>
+XkbDescRec</emphasis>
+ components that are filled in.
+</para>
+
+<table frame='topbot'>
+<title>XkbDescRec Components Returned for Values of Want &amp; Needs</title>
+<?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>Request (want+need)</entry>
+  <entry>Fills in Xkb components</entry>
+  <entry>Equivalent Function Call</entry>
+  </row>
+</thead>
+<tbody>
+  <row>
+    <entry>XkbGBN_TypesMask</entry>
+    <entry>map.types</entry>
+    <entry>XkbGetUpdatedMap(dpy, XkbTypesMask, Xkb)</entry>
+  </row>
+  <row>
+    <entry>XkbGBN_ServerSymbolsMask</entry>
+    <entry>server</entry>
+    <entry>XkbGetUpdatedMap(dpy, XkbAllClientInfoMask, Xkb)</entry>
+  </row>
+  <row>
+    <entry>XkbGBN_ClientSymbolsMask</entry>
+    <entry>map, including map.types</entry>
+    <entry>XkbGetUpdatedMap(dpy, XkbAllServerInfoMask, Xkb)</entry>
+  </row>
+  <row>
+    <entry>XkbGBN_IndicatorMaps</entry>
+    <entry>indicators</entry>
+    <entry>XkbGetIndicatorMap(dpy, XkbAllIndicators, Xkb)</entry>
+  </row>
+  <row>
+    <entry>XkbGBN_CompatMapMask</entry>
+    <entry>compat</entry>
+    <entry>XkbGetCompatMap(dpy, XkbAllCompatMask, Xkb)</entry>
+  </row>
+  <row>
+    <entry>XkbGBN_GeometryMask</entry>
+    <entry>geom</entry>
+    <entry>XkbGetGeometry(dpy, Xkb)</entry>
+  </row>
+  <row>
+    <entry>XkbGBN_KeyNamesMask</entry>
+    <entry>
+<para>names.keys</para>
+<para>names.key_aliases</para>
+    </entry>
+    <entry>
+XkbGetNames(dpy, XkbKeyNamesMask | XkbKeyAliasesMask, Xkb)
+    </entry>
+  </row>
+  <row>
+    <entry>XkbGBN_OtherNamesMask</entry>
+    <entry>
+<para>names.keycodes</para>
+<para>names.geometry</para>
+<para>names.symbols</para>
+<para>names.types</para>
+<para>map.types[*].lvl_names[*]</para>
+<para>names.compat</para>
+<para>names.vmods</para>
+<para>names.indicators</para>
+<para>names.groups</para>
+<para>names.radio_groups</para>
+<para>names.phys_symbols</para>
+    </entry>
+    <entry>
+<para>XkbGetNames(dpy, XkbAllNamesMask &amp;</para>
+<para>~(XkbKeyNamesMask | XkbKeyAliasesMask),</para>
+<para>Xkb)</para>
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+There is no way to determine which components specified in <emphasis>
+want</emphasis>
+ (but not in <emphasis>
+need</emphasis>
+) were actually fetched, other than breaking the call into successive calls to
+<emphasis>
+XkbGetKeyboardByName</emphasis>
+ and specifying individual components.
+</para>
+
+
+<para>
+<emphasis>
+XkbGetKeyboardByName</emphasis>
+ always sets <emphasis>
+min_key_code</emphasis>
+ and <emphasis>
+max_key_code</emphasis>
+ in the returned <emphasis>
+XkbDescRec</emphasis>
+ structure.
+</para>
+
+
+<para>
+<emphasis>XkbGetKeyboardByName</emphasis>
+is synchronous; it sends the request to the server to build a new keyboard
+description and waits for the reply. If successful, the return value is
+non-<emphasis>NULL</emphasis>.
+<emphasis>XkbGetKeyboardByName</emphasis>
+generates a <emphasis>BadMatch</emphasis>
+protocol error if errors are encountered when building the keyboard
+description.
+</para>
+
+
+<para>
+If you simply want to obtain information about the current keyboard device,
+rather than generating a new keyboard description from elements in the server
+database, use <emphasis>
+XkbGetKeyboard</emphasis>
+ (see section 6.2).
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+XkbDescPtr <emphasis>
+XkbGetKeyboard</emphasis>
+(<emphasis>
+dpy</emphasis>
+, <emphasis>
+which</emphasis>
+, <emphasis>
+device_spec</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *      <emphasis>
+      dpy</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int<emphasis>
+            which</emphasis>
+;            /* mask of components of <emphasis>
+XkbDescRec</emphasis>
+ of interest */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int      <emphasis>
+      device_spec</emphasis>
+;            /* device ID */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetKeyboard</emphasis>
+ is used to read the current description for one or more components of a
+keyboard device. It calls <emphasis>
+XkbGetKeyboardByName</emphasis>
+ as follows:
+</para>
+
+
+<para>
+<emphasis>
+XkbGetKeyboardByName</emphasis>
+(<emphasis>
+dpy</emphasis>
+, <emphasis>
+device_spec</emphasis>
+, <emphasis>
+NULL</emphasis>
+, <emphasis>
+which</emphasis>
+, <emphasis>
+which</emphasis>
+, <emphasis>
+False</emphasis>
+).
+</para>
+
+</sect1>
+</chapter>
diff --git a/specs/XKB/ch21.xml b/specs/XKB/ch21.xml
new file mode 100644 (file)
index 0000000..7b2c653
--- /dev/null
@@ -0,0 +1,2056 @@
+<chapter id='Attaching_Xkb_Actions_to_X_Input_Extension_Devices'>
+<title>Attaching Xkb Actions to X Input Extension Devices</title>
+
+<para>
+The X input extension allows an X server to support multiple keyboards, as well
+as other input devices, in addition to the core X keyboard and pointer. The
+input extension categorizes devices by grouping them into classes. Keyboards
+and other input devices with keys are classified as KeyClass devices by the
+input extension. Other types of devices supported by the input extension
+include, but are not limited to: mice, tablets, touchscreens, barcode readers,
+button boxes, trackballs, identifier devices, data gloves, and eye trackers.
+Xkb provides additional control over all X input extension devices, whether
+they are <emphasis>KeyClass</emphasis>
+ devices or not, as well as the core keyboard and pointer.
+</para>
+
+
+<para>
+If an X server implements support for both the input extension and Xkb, the
+server implementor determines whether interaction between Xkb and the input
+extension is allowed. Implementors are free to restrict the effects of Xkb to
+only the core X keyboard device or allow interaction between Xkb and the input
+extension.
+</para>
+
+
+<para>
+Several types of interaction between Xkb and the input extension are defined by
+Xkb. Some or all may be allowed by the X server implementation.
+</para>
+
+
+<para>
+Regardless of whether the server allows interaction between Xkb and the input
+extension, the following access is provided:
+</para>
+
+<itemizedlist>
+<listitem>
+  <para>
+Xkb functionality for the core X keyboard device and its mapping is accessed
+via the functions described in the other chapters of this specification.
+  </para>
+</listitem>
+<listitem>
+  <para>
+Xkb functionality for the core X pointer device is accessed via the
+XkbGetDeviceInfo and XkbSetDeviceInfo functions described in this chapter.
+  </para>
+</listitem>
+</itemizedlist>
+
+<para>
+If all types of interaction are allowed between Xkb and the input extension,
+the following additional access is provided:
+</para>
+
+<itemizedlist>
+<listitem>
+  <para>
+If allowed, Xkb functionality for additional <emphasis>
+KeyClass</emphasis>
+ devices supported by the input extension is accessed via those same functions.
+  </para>
+</listitem>
+<listitem>
+  <para>
+If allowed, Xkb functionality for non-<emphasis>
+KeyClass</emphasis>
+ devices supported by the input extension is also accessed via the
+XkbGetDeviceInfo and XkbSetDeviceInfo functions described in this chapter.
+  </para>
+</listitem>
+</itemizedlist>
+
+<para>
+Each device has an X Input Extension device ID. Each device may have several
+classes of feedback. For example, there are two types of feedbacks that can
+generate bells: bell feedback and keyboard feedback (<emphasis>
+BellFeedbackClass</emphasis>
+ and <emphasis>
+KbdFeedbackClass</emphasis>
+). A device can have more than one feedback of each type; the feedback ID
+identifies the particular feedback within its class.
+</para>
+
+
+<para>
+A keyboard feedback has:
+</para>
+
+<itemizedlist>
+<listitem>
+  <para>
+Auto-repeat status (global and per key)
+  </para>
+</listitem>
+<listitem>
+  <para>
+32 LEDs
+  </para>
+</listitem>
+<listitem>
+  <para>
+A bell
+  </para>
+</listitem>
+</itemizedlist>
+
+<para>
+An indicator feedback has:
+</para>
+
+<itemizedlist>
+<listitem>
+  <para>
+Up to 32 LEDs
+  </para>
+</listitem>
+</itemizedlist>
+
+<para>
+If the input extension is present and the server allows interaction between the
+input extension and Xkb, then the core keyboard, the core keyboard indicators,
+and the core keyboard bells may each be addressed using an appropriate device
+spec, class, and ID. The constant <emphasis>
+XkbXIDfltID</emphasis>
+ may be used as the device ID to specify the core keyboard indicators for the
+core indicator feedback. The particular device ID corresponding to the core
+keyboard feedback and the core indicator feedback may be obtained by calling
+<emphasis>
+XkbGetDeviceInfo</emphasis>
+ and specifying <emphasis>
+XkbUseCoreKbd</emphasis>
+ as the <emphasis>
+device_spec</emphasis>
+; the values will be returned in <emphasis>
+dflt_kbd_id</emphasis>
+ and <emphasis>
+dflt_led_id</emphasis>
+.
+</para>
+
+
+<para>
+If the server does not allow Xkb access to input extension <emphasis>
+KeyClass</emphasis>
+ devices, attempts to use Xkb requests with those devices fail with a
+Bad<emphasis>
+Keyboard</emphasis>
+ error. Attempts to access non-<emphasis>
+KeyClass</emphasis>
+ input extension devices via XkbGetDeviceInfo and XkbSetDeviceInfo fail
+silently if Xkb access to those devices is not supported by the X server.
+</para>
+
+<sect1 id='XkbDeviceInfoRec'>
+<title>XkbDeviceInfoRec</title>
+
+<para>
+Information about X Input Extension devices is transferred between a client
+program and the Xkb extension in an <emphasis>
+XkbDeviceInfoRec</emphasis>
+ structure:
+</para>
+
+<para><programlisting>
+typedef struct {
+      char *          name;          /* name for device */
+      Atom            type;          /* name for class of devices */
+      unsigned short  device_spec;   /* device of interest */
+      Bool            has_own_state; /* <emphasis> True</emphasis> =&gt;this
+                                        device has its own state */
+      unsigned short  supported;     /* bits indicating supported capabilities */
+      unsigned short  unsupported;   /* bits indicating unsupported capabilities */
+      unsigned short  num_btns;      /* number of entries in <emphasis> btn_acts</emphasis> */
+      XkbAction *     btn_acts;      /* button actions */
+      unsigned short  sz_leds;       /* total number of entries in LEDs vector */
+      unsigned short  num_leds;      /* number of valid entries in LEDs vector */
+      unsigned short  dflt_kbd_fb;   /* input extension ID of default (core kbd) indicator */
+      unsigned short  dflt_led_fb;   /* input extension ID of default indicator feedback */
+      XkbDeviceLedInfoPtr  leds;     /* LED descriptions */
+} <emphasis>XkbDeviceInfoRec</emphasis>, *XkbDeviceInfoPtr;
+</programlisting></para>
+
+<para><programlisting>
+typedef struct {
+      unsigned short   led_class;         /* class for this LED device*/
+      unsigned short   led_id;            /* ID for this LED device */
+      unsigned int     phys_indicators;   /* bits for which LEDs physically
+                                             present */
+      unsigned int     maps_present;      /* bits for which LEDs have maps in
+                                             <emphasis>maps</emphasis> */
+      unsigned int     names_present;     /* bits for which LEDs are in
+                                             <emphasis> names</emphasis> */
+      unsigned int     state;            /* 1 bit =&gt; corresponding LED is on */
+      Atom             names[XkbNumIndicators];  /* names for LEDs */
+      XkbIndicatorMapRec  maps;          /* indicator maps for each LED */
+} <emphasis>XkbDeviceLedInfoRec</emphasis>, *XkbDeviceLedInfoPtr;
+</programlisting></para>
+
+<para>
+The <emphasis>
+type</emphasis>
+ field is a registered symbolic name for a class of devices (for example,
+"TABLET"). If a device is a keyboard (that is, is a member of <emphasis>
+KeyClass</emphasis>
+), it has its own state, and <emphasis>
+has_own_state</emphasis>
+ is <emphasis>
+True</emphasis>
+. If <emphasis>
+has_own_state</emphasis>
+ is <emphasis>
+False</emphasis>
+, the state of the core keyboard is used. The <emphasis>
+supported</emphasis>
+ and <emphasis>
+unsupported</emphasis>
+ fields are masks where each bit indicates a capability. The meaning of the
+mask bits is listed in Table 21.1, together with the fields in the <emphasis>
+XkbDeviceInfoRec</emphasis>
+ structure that are associated with the capability represented by each bit. The
+same bits are used to indicate the specific information desired in many of the
+functions described subsequently in this section.
+</para>
+
+<table frame='topbot'>
+<title>XkbDeviceInfoRec Mask Bits</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='4' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='2.9*'/>
+<colspec colname='c2' colwidth='2.0*'/>
+<colspec colname='c3' colwidth='0.9*'/>
+<colspec colname='c4' colwidth='2.0*'/>
+<thead>
+  <row rowsep='1'>
+    <entry>Name</entry>
+    <entry>XkbDeviceInfoRec Fields Effected</entry>
+    <entry>Value</entry>
+    <entry>Capability If Set</entry>
+  </row>
+</thead>
+<tbody>
+  <row>
+    <entry>XkbXI_KeyboardsMask</entry>
+    <entry></entry>
+    <entry>(1L &lt;&lt; 0)</entry>
+    <entry>
+Clients can use all Xkb requests and events with
+<emphasis>KeyClass</emphasis>
+devices supported by the input device extension.
+    </entry>
+  </row>
+  <row>
+    <entry>XkbXI_ButtonActionsMask</entry>
+    <entry>
+<para>num_btns</para>
+<para>btn_acts</para>
+    </entry>
+    <entry>(1L &lt;&lt;1)</entry>
+    <entry>
+Clients can assign key actions to buttons on non-<emphasis>
+KeyClass</emphasis>
+input extension devices.
+    </entry>
+  </row>
+  <row>
+    <entry>XkbXI_IndicatorNamesMask</entry>
+    <entry>leds-&gt;names</entry>
+    <entry>(1L &lt;&lt;2)</entry>
+    <entry>
+Clients can assign names to indicators on non-<emphasis>
+KeyClass</emphasis>
+ input extension devices.
+    </entry>
+  </row>
+  <row>
+    <entry>XkbXI_IndicatorMapsMask</entry>
+    <entry>leds-&gt;maps</entry>
+    <entry>(1L &lt;&lt;3)</entry>
+    <entry>
+Clients can assign indicator maps to indicators on non-<emphasis>
+KeyClass</emphasis>
+ input extension devices.
+    </entry>
+  </row>
+  <row>
+    <entry>XkbXI_IndicatorStateMask</entry>
+    <entry>leds-&gt;state</entry>
+    <entry>(1L &lt;&lt;4)</entry>
+    <entry>
+Clients can request the status of indicators on non-<emphasis>
+KeyClass</emphasis>
+ input extension devices.
+    </entry>
+  </row>
+  <row>
+    <entry>XkbXI_IndicatorsMask</entry>
+    <entry>
+<para>sz_leds</para>
+<para>num_leds</para>
+<para>leds-&gt;*</para>
+    </entry>
+    <entry>(0x1c)</entry>
+    <entry>
+<para>XkbXI_IndicatorNames&#xAD;Mask |</para>
+<para>XkbXI_IndicatorMaps&#xAD;Mask |</para>
+<para>XkbXI_IndicatorState&#xAD;Mask</para>
+    </entry>
+  </row>
+  <row>
+    <entry>XkbXI_UnsupportedFeaturesMask</entry>
+    <entry>unsupported</entry>
+    <entry>(1L &lt;&lt;15)</entry>
+    <entry></entry>
+  </row>
+  <row>
+    <entry>XkbXI_AllDeviceFeaturesMask</entry>
+    <entry>Those selected by Value column masks</entry>
+    <entry>(0x1e)</entry>
+    <entry>
+<para>XkbXI_Indicators&#xAD;Mask | </para>
+<para>XkbSI_ButtonActions&#xAD;Mask</para>
+    </entry>
+  </row>
+  <row>
+    <entry>XkbXI_AllFeaturesMask</entry>
+    <entry>Those selected by Value column masks</entry>
+    <entry>(0x1f)</entry>
+    <entry>
+<para>XkbSI_AllDevice&#xAD;FeaturesMask |</para>
+<para>XkbSI_Keyboards&#xAD;Mask</para>
+    </entry>
+  </row>
+  <row>
+    <entry>XkbXI_AllDetailsMask</entry>
+    <entry>Those selected by Value column masks</entry>
+    <entry>(0x801f)</entry>
+    <entry>
+<para>XkbXI_AllFeatures&#xAD;Mask | </para>
+<para>XkbXI_Unsupported&#xAD;FeaturesMask</para>
+    </entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+The <emphasis>
+name</emphasis>
+, <emphasis>
+type</emphasis>
+, <emphasis>
+has_own_state</emphasis>
+, <emphasis>
+supported</emphasis>
+, and <emphasis>
+unsupported</emphasis>
+ fields are always filled in when a valid reply is returned from the server
+involving an <emphasis>
+XkbDeviceInfoRec</emphasis>
+. All of the other fields are modified only if the particular function asks for
+them.
+</para>
+
+</sect1>
+<sect1 id='Querying_Xkb_Features_for_Non_KeyClass_Input_Extension_Devices'>
+<title>Querying Xkb Features for Non-KeyClass Input Extension Devices</title>
+
+<para>
+To determine whether the X server allows Xkb access to particular capabilities
+of input devices other than the core X keyboard, or to determine the status of
+indicator maps, indicator names or button actions on a non-<emphasis>
+KeyClass</emphasis>
+ extension device, use XkbGetDeviceInfo.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+XkbDeviceInfoPtr <emphasis>
+XkbGetDeviceInfo</emphasis>
+(<emphasis>
+dpy</emphasis>
+, which, device_spec, ind_class, ind_id)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *            <emphasis>
+dpy</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            which;            /* mask indicating information to
+return */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+device_spec</emphasis>
+;            /* device ID, or <emphasis>
+XkbUseCoreKbd</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+ind_class</emphasis>
+;            /* feedback class for indicator requests */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+ind_id</emphasis>
+;            /* feedback ID for indicator requests */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetDeviceInfo</emphasis>
+ returns information about the input device specified by <emphasis>
+device_spec</emphasis>
+. Unlike the <emphasis>
+device_spec</emphasis>
+ parameter of most Xkb functions, <emphasis>
+device_spec</emphasis>
+ does not need to be a keyboard device. It must, however, indicate either the
+core keyboard or a valid X Input Extension device.
+</para>
+
+
+<para>
+The <emphasis>
+which </emphasis>
+parameter<emphasis>
+ </emphasis>
+is a mask specifying optional information to be returned. It is an inclusive OR
+of one or more of the values from Table 21.1 and causes the returned <emphasis>
+XkbDeviceInfoRec</emphasis>
+ to contain values for the corresponding fields specified in the table.
+</para>
+
+
+<para>
+The <emphasis>
+XkbDeviceInfoRec</emphasis>
+ returned by <emphasis>
+XkbGetDeviceInfo</emphasis>
+ always has values for <emphasis>
+name</emphasis>
+ (may be a null string, ""), <emphasis>
+type</emphasis>
+, <emphasis>
+supported</emphasis>
+, <emphasis>
+unsupported</emphasis>
+, <emphasis>
+has_own_state</emphasis>
+, <emphasis>
+dflt_kbd_fd</emphasis>
+, and <emphasis>
+dflt_kbd_fb</emphasis>
+. Other fields are filled in as specified by <emphasis>
+which</emphasis>
+.
+</para>
+
+
+<para>
+Upon return, the <emphasis>
+supported</emphasis>
+ field will be set to the inclusive OR of zero or more bits from Table 21.1;
+each bit set indicates an optional Xkb extension device feature supported by
+the server implementation, and a client may modify the associated behavior.
+</para>
+
+
+<para>
+If the <emphasis>
+XkbButtonActionsMask</emphasis>
+ bit is set in <emphasis>
+which</emphasis>
+, the <emphasis>
+XkbDeviceInfoRec</emphasis>
+ returned will have the button actions (<emphasis>
+btn_acts</emphasis>
+ field) filled in for all buttons.
+</para>
+
+
+<para>
+If <emphasis>
+which</emphasis>
+ includes one of the bits in XkbXI_IndicatorsMask, the feedback class of the
+indicators must be specified in ind_class, and the feedback ID of the
+indicators must be specified in ind_id. If the request does not include any of
+the bits in XkbXI_IndicatorsMask, the ind_class and ind_id parameters are
+ignored. The class and ID can be obtained via the input device extension
+XListInputDevices request.
+</para>
+
+
+<para>
+If any of the <emphasis>
+XkbXI_IndicatorsMask</emphasis>
+ bits are set in <emphasis>
+which</emphasis>
+, the <emphasis>
+XkbDeviceInfoRec</emphasis>
+ returned will have filled in the portions of the <emphasis>
+leds</emphasis>
+ structure corresponding to the indicator feedback identified by <emphasis>
+ind_class</emphasis>
+ and <emphasis>
+ind_id</emphasis>
+. The <emphasis>
+leds</emphasis>
+ vector of the <emphasis>
+XkbDeviceInfoRec</emphasis>
+ is allocated if necessary and <emphasis>
+sz_leds</emphasis>
+ and <emphasis>
+num_leds</emphasis>
+ filled in. The <emphasis>
+led_class</emphasis>
+, <emphasis>
+led_id</emphasis>
+ and <emphasis>
+phys_indicators</emphasis>
+ fields of the <emphasis>
+leds</emphasis>
+ entry corresponding to <emphasis>
+ind_class</emphasis>
+ and <emphasis>
+ind_id</emphasis>
+ are always filled in. If <emphasis>
+which</emphasis>
+ contains <emphasis>
+XkbXI_IndicatorNamesMask</emphasis>
+, the <emphasis>
+names_present</emphasis>
+ and <emphasis>
+names</emphasis>
+ fields of the <emphasis>
+leds</emphasis>
+ structure corresponding to <emphasis>
+ind_class</emphasis>
+ and <emphasis>
+ind_id</emphasis>
+ are returned.<emphasis>
+ </emphasis>
+If <emphasis>
+which</emphasis>
+ contains <emphasis>
+XkbXI_IndicatorStateMask</emphasis>
+<emphasis>
+,</emphasis>
+ the corresponding <emphasis>
+state</emphasis>
+ field is updated. If <emphasis>
+which</emphasis>
+ contains <emphasis>
+XkbXI_IndicatorMapsMask</emphasis>
+, the <emphasis>
+maps_present</emphasis>
+ and <emphasis>
+maps</emphasis>
+ fields are updated.
+</para>
+
+
+<para>
+Xkb provides convenience functions to request subsets of the information
+available via <emphasis>
+XkbGetDeviceInfo</emphasis>
+. These convenience functions mirror some of the mask bits. The functions all
+take an <emphasis>
+XkbDeviceInfoPtr</emphasis>
+ as an input argument and operate on the X Input Extension device specified by
+the <emphasis>
+device_spec</emphasis>
+ field of the structure. Only the parts of the structure indicated in the
+function description are updated. The <emphasis>
+XkbDeviceInfo</emphasis>
+Rec structure used in the function call can be obtained by calling
+XkbGetDeviceInfo or can be allocated by calling XkbAllocDeviceInfo (see section
+21.3).
+</para>
+
+
+<para>
+These convenience functions are described as follows.
+</para>
+
+
+<para>
+To query the button actions associated with an X Input Extension device, use
+XkbGetDeviceButtonActions.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbGetDeviceButtonActions</emphasis>
+(<emphasis>
+dpy, device_info, all_buttons, first_button, num_buttons</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *            <emphasis>
+dpy</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDeviceInfoPtr            device_info;            /* structure to update with
+results */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool            <emphasis>
+all_buttons</emphasis>
+;            /* <emphasis>
+True</emphasis>
+ =&gt; get information for all buttons */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            first_button;            /* number of first button for
+which info is desired */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            num_buttons;            /* number of buttons for which
+info is desired */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetDeviceButtonActions</emphasis>
+ queries the server for the desired button information for the device indicated
+by the <emphasis>
+device_spec</emphasis>
+ field of <emphasis>
+device_info</emphasis>
+ and waits for a reply. If successful,<emphasis>
+ XkbGetDeviceButtonActions</emphasis>
+ backfills the button actions (<emphasis>
+btn_acts</emphasis>
+ field of <emphasis>
+device_info</emphasis>
+) for only the requested buttons, updates the <emphasis>
+name</emphasis>
+, <emphasis>
+type</emphasis>
+, <emphasis>
+supported</emphasis>
+, and <emphasis>
+unsupported</emphasis>
+ fields, and returns <emphasis>
+Success</emphasis>
+.
+</para>
+
+
+<para>
+<emphasis>
+all_buttons</emphasis>
+, <emphasis>
+first_button</emphasis>
+ and <emphasis>
+num_buttons</emphasis>
+ specify the device buttons for which actions should be returned. Setting
+<emphasis>
+all_buttons</emphasis>
+ to <emphasis>
+True</emphasis>
+ requests actions for all device buttons; if <emphasis>
+all_buttons</emphasis>
+ is <emphasis>
+False</emphasis>
+, <emphasis>
+first_button</emphasis>
+ and <emphasis>
+num_buttons</emphasis>
+ specify a range of buttons for which actions are requested.
+</para>
+
+
+<para>
+If a compatible version of Xkb is not available in the server or the Xkb
+extension has not been properly initialized, XkbGetDeviceButtonActions returns
+<emphasis>
+BadAccess</emphasis>
+. If allocation errors occur, a <emphasis>
+BadAlloc</emphasis>
+ status is returned. If the specified device (<emphasis>
+device_info</emphasis>
+-&gt;<emphasis>
+device_spec</emphasis>
+) is invalid, a BadKeyboard status is returned. If the device has no buttons, a
+Bad<emphasis>
+Match</emphasis>
+ status is returned. If <emphasis>
+first_button</emphasis>
+ and <emphasis>
+num_buttons</emphasis>
+ specify illegal buttons, a Bad<emphasis>
+Value</emphasis>
+ status is returned.
+</para>
+
+
+<para>
+To query the indicator names, maps, and state associated with an LED feedback
+of an input extension device, use XkbGetDeviceLedInfo.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbGetDeviceLedInfo</emphasis>
+(<emphasis>
+dpy, device_i</emphasis>
+nfo, led_class, led_id, which)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *            <emphasis>
+dpy</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDeviceInfoPtr            device_info;            /* structure to update with
+results */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+led_class</emphasis>
+;            /* LED feedback class assigned by input extension */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            led_id;            /* LED feedback ID assigned by input
+extension */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            which;            /* mask indicating desired
+information */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbGetDeviceLedInfo</emphasis>
+ queries the server for the desired LED information for the feedback specified
+by <emphasis>
+led_class</emphasis>
+ and <emphasis>
+led_id</emphasis>
+ for the X input extension device indicated by <emphasis>
+device_spec</emphasis>
+-&gt;<emphasis>
+device_info</emphasis>
+ and waits for a reply. If successful, <emphasis>
+XkbGetDeviceLedInfo</emphasis>
+ backfills the relevant fields of <emphasis>
+device_info</emphasis>
+ as determined by <emphasis>
+which</emphasis>
+ with the results and returns <emphasis>
+Success</emphasis>
+. Valid values for <emphasis>
+which</emphasis>
+ are the inclusive OR of any of <emphasis>
+XkbXI_IndicatorNamesMask</emphasis>
+, <emphasis>
+XkbXI_IndicatorMapsMask</emphasis>
+, and <emphasis>
+XkbXI_IndicatorStateMask</emphasis>
+.
+</para>
+
+
+<para>
+The fields of <emphasis>
+device_info</emphasis>
+ that are filled in when this request succeeds are <emphasis>
+name, type, supported</emphasis>
+, and <emphasis>
+unsupported</emphasis>
+, and portions of the <emphasis>
+leds</emphasis>
+ structure corresponding to <emphasis>
+led_class</emphasis>
+ and <emphasis>
+led_id</emphasis>
+ as indicated by the bits set in <emphasis>
+which</emphasis>
+. The <emphasis>
+device_info-&gt;leds</emphasis>
+ vector is allocated if necessary and <emphasis>
+sz_leds</emphasis>
+ and <emphasis>
+num_leds</emphasis>
+ filled in. The <emphasis>
+led_class</emphasis>
+, <emphasis>
+led_id</emphasis>
+ and <emphasis>
+phys_indicators</emphasis>
+ fields of the <emphasis>
+device_info</emphasis>
+-&gt;<emphasis>
+leds</emphasis>
+ entry corresponding to <emphasis>
+led_class</emphasis>
+ and <emphasis>
+led_id</emphasis>
+ are always filled in.
+</para>
+
+
+<para>
+If <emphasis>
+which</emphasis>
+ contains <emphasis>
+XkbXI_IndicatorNamesMask</emphasis>
+, the <emphasis>
+names_present</emphasis>
+ and <emphasis>
+names</emphasis>
+ fields of the <emphasis>
+device_info</emphasis>
+-&gt;<emphasis>
+leds</emphasis>
+ structure corresponding to <emphasis>
+led_class</emphasis>
+ and <emphasis>
+led_id</emphasis>
+ are updated, if <emphasis>
+which</emphasis>
+ contains <emphasis>
+XkbXI_IndicatorStateMask</emphasis>
+<emphasis>
+,</emphasis>
+ the corresponding <emphasis>
+state</emphasis>
+ field is updated, and if <emphasis>
+which</emphasis>
+ contains <emphasis>
+XkbXI_IndicatorMapsMask</emphasis>
+, the <emphasis>
+maps_present</emphasis>
+ and <emphasis>
+maps</emphasis>
+ fields are updated.
+</para>
+
+
+<para>
+If a compatible version of Xkb is not available in the server or the Xkb
+extension has not been properly initialized, <emphasis>
+XkbGetDeviceLedInfo</emphasis>
+ returns <emphasis>
+BadAccess</emphasis>
+. If allocation errors occur, a BadAlloc status is returned. If the device has
+no indicators, a BadMatch error is returned. If <emphasis>
+ledClass</emphasis>
+ or <emphasis>
+ledID</emphasis>
+ have illegal values, a Bad<emphasis>
+Value</emphasis>
+ error is returned. If they have legal values but do not specify a feedback
+that contains LEDs and is associated with the specified device, a Bad<emphasis>
+Match</emphasis>
+ error is returned.
+</para>
+
+
+</sect1>
+<sect1 id='Allocating_Initializing_and_Freeing_the_XkbDeviceInfoRecStructure'>
+<title>Allocating, Initializing, and Freeing the XkbDeviceInfoRec
+Structure</title>
+
+<para>
+To obtain an <emphasis>
+XkbDeviceInfoRec</emphasis>
+ structure, use XkbGetDeviceInfo or XkbAllocDeviceInfo.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+XkbDeviceInfoPtr <emphasis>
+XkbAllocDeviceInfo</emphasis>
+(device_spec, n_buttons, sz_leds)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            device_spec;            /* device ID with which
+structure will be used */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+n_buttons</emphasis>
+;            /* number of button actions to allocate space for*/
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+sz_leds</emphasis>
+;            /* number of LED feedbacks to allocate space for */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbAllocDeviceInfo</emphasis>
+ allocates space for an <emphasis>
+XkbDeviceInfoRec</emphasis>
+ structure and initializes that structure’s <emphasis>
+device_spec</emphasis>
+ field with the device ID specified by device_spec. If <emphasis>
+n_buttons</emphasis>
+ is nonzero, <emphasis>
+n_buttons</emphasis>
+ <emphasis>
+XkbActions</emphasis>
+ are linked into the <emphasis>
+XkbDeviceInfoRec</emphasis>
+ structure and initialized to zero. If sz_leds is nonzero, <emphasis>
+sz_leds</emphasis>
+ <emphasis>
+XkbDeviceLedInfoRec</emphasis>
+ structures are also allocated and linked into the <emphasis>
+XkbDeviceInfoRec</emphasis>
+ structure. If you request <emphasis>
+XkbDeviceLedInfoRec</emphasis>
+ structures be allocated using this request, you must initialize them
+explicitly.
+</para>
+
+
+<para>
+To obtain an <emphasis>
+XkbDeviceLedInfoRec</emphasis>
+ structure, use XkbAllocDeviceLedInfo.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbAllocDeviceLedInfo</emphasis>
+(devi, num_needed)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDeviceInfoPtr            <emphasis>
+device_info</emphasis>
+;            /* structure in which to allocate LED space */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+int            <emphasis>
+num_needed</emphasis>
+;            /* number of indicators to allocate space for */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbAllocDeviceLedInfo</emphasis>
+ allocates space for an <emphasis>
+XkbDeviceLedInfoRec</emphasis>
+ and places it in <emphasis>
+device_info</emphasis>
+. If num_needed is nonzero, <emphasis>
+num_needed</emphasis>
+ <emphasis>
+XkbIndicatorMapRec</emphasis>
+ structures are also allocated and linked into the <emphasis>
+XkbDeviceLedInfoRec</emphasis>
+ structure. If you request <emphasis>
+XkbIndicatorMapRec</emphasis>
+ structures be allocated using this request, you must initialize them
+explicitly. All other fields are initialized to zero.
+</para>
+
+
+<para>
+To initialize an <emphasis>
+XkbDeviceLedInfoRec</emphasis>
+ structure, use XkbAddDeviceLedInfo.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+XkbDeviceLedInfoPtr <emphasis>
+XkbAddDeviceLedInfo</emphasis>
+(device_info, led_class, led_id)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDeviceInfoPtr            device_info;            /* structure in which to
+add LED info */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+led_class</emphasis>
+;            /* input extension class for LED device of interest */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+led_id</emphasis>
+;            /* input extension ID for LED device of interest */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbAddDeviceLedInfo</emphasis>
+ first checks to see whether an entry matching <emphasis>
+led_class</emphasis>
+ and <emphasis>
+led_id</emphasis>
+ already exists in the <emphasis>
+device_info-&gt;leds</emphasis>
+ array. If it finds a matching entry, it returns a pointer to that entry.
+Otherwise, it checks to be sure there is at least one empty entry in <emphasis>
+device_info</emphasis>
+-&gt;<emphasis>
+leds</emphasis>
+ and extends it if there is not enough room. It then increments <emphasis>
+device_info</emphasis>
+-&gt;<emphasis>
+num_leds</emphasis>
+ and fills in the next available entry in <emphasis>
+device_info</emphasis>
+-&gt;<emphasis>
+leds</emphasis>
+ with <emphasis>
+led_class</emphasis>
+ and <emphasis>
+led_id</emphasis>
+.
+</para>
+
+
+<para>
+If successful, <emphasis>
+XkbAddDeviceLedInfo</emphasis>
+ returns a pointer to the <emphasis>
+XkbDeviceLedInfoRec</emphasis>
+ structure that was initialized. If unable to allocate sufficient storage, or
+if <emphasis>
+device_info</emphasis>
+ points to an invalid <emphasis>
+XkbDeviceInfoRec</emphasis>
+ structure, or if <emphasis>
+led_class</emphasis>
+ or <emphasis>
+led_id</emphasis>
+ are inappropriate, <emphasis>
+XkbAddDeviceLedInfo</emphasis>
+ returns <emphasis>
+NULL</emphasis>
+.
+</para>
+
+
+<para>
+To allocate additional space for button actions in an <emphasis>
+XkbDeviceInfoRec</emphasis>
+ structure, use XkbResizeDeviceButtonActions.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbResizeDeviceButtonActions</emphasis>
+(device_info, new_total)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDeviceInfoPtr            device_info;            /* structure in which to
+allocate button actions */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+new_total</emphasis>
+;            /* new total number of button actions needed */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbResizeDeviceButton</emphasis>
+ reallocates space, if necessary, to make sure there is room for a total of
+<emphasis>
+new_total</emphasis>
+ button actions in the <emphasis>
+device_info</emphasis>
+ structure. Any new entries allocated are zeroed. If successful, <emphasis>
+XkbResizeDeviceButton</emphasis>
+ returns Success. If new_total is zero, all button actions are deleted,
+<emphasis>
+device_info</emphasis>
+-&gt;<emphasis>
+num_btns</emphasis>
+ is set to zero, and <emphasis>
+device_info</emphasis>
+-&gt;<emphasis>
+btn_acts</emphasis>
+ is set to <emphasis>
+NULL</emphasis>
+. If device_info is invalid or new_total is greater than 255, BadValue is
+returned. If a memory allocation failure occurs, a <emphasis>
+BadAlloc</emphasis>
+ is returned.
+</para>
+
+
+<para>
+To free an <emphasis>
+XkbDeviceInfoRec</emphasis>
+ structure, use XkbFreeDeviceInfo.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbFreeDeviceInfo</emphasis>
+(device_info, which, free_all)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDeviceInfoPtr            device_info;            /* pointer to <emphasis>
+XkbDeviceInfoRec</emphasis>
+ in which to free items */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+which</emphasis>
+;            /* mask of components of <emphasis>
+device_info</emphasis>
+ to free */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Bool            <emphasis>
+free_all</emphasis>
+;            /* <emphasis>
+True</emphasis>
+ =&gt; free everything, including device_info */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+If free_all is <emphasis>
+True</emphasis>
+, the <emphasis>
+XkbFreeDeviceInfo</emphasis>
+ frees all components of <emphasis>
+device_info</emphasis>
+ and the <emphasis>
+XkbDeviceInfoRec</emphasis>
+ structure pointed to by <emphasis>
+device_info</emphasis>
+ itself. If free_all is <emphasis>
+False</emphasis>
+, the value of which determines which subcomponents are freed. <emphasis>
+which </emphasis>
+is an inclusive OR of one or more of the values from Table 21.1. If which
+contains XkbXI_ButtonActionsMask, all button actions associated with <emphasis>
+device_info</emphasis>
+ are freed, <emphasis>
+device_info</emphasis>
+-&gt;<emphasis>
+btn_acts</emphasis>
+ is set to <emphasis>
+NULL</emphasis>
+, and <emphasis>
+device_info</emphasis>
+-&gt;<emphasis>
+num_btns</emphasis>
+ is set to zero. If which contains all bits in XkbXI_IndicatorsMask, all
+<emphasis>
+XkbDeviceLedInfoRec</emphasis>
+ structures associated with <emphasis>
+device_info</emphasis>
+ are freed, <emphasis>
+device_info</emphasis>
+-&gt;<emphasis>
+leds</emphasis>
+ is set to <emphasis>
+NULL</emphasis>
+, and <emphasis>
+device_info</emphasis>
+-&gt;<emphasis>
+sz_leds</emphasis>
+ and <emphasis>
+device_info</emphasis>
+-&gt;<emphasis>
+num_leds</emphasis>
+ are set to zero. If which contains XkbXI_IndicatorMapsMask, all indicator maps
+associated with <emphasis>
+device_info</emphasis>
+ are cleared, but the number of LEDs and the leds structures themselves are
+preserved. If which contains XkbXI_IndicatorNamesMask, all indicator names
+associated with device_info are cleared, but the number of LEDs and the leds
+structures themselves are preserved. If which contains
+XkbXI_IndicatorStateMask, the indicator state associated with the <emphasis>
+device_info</emphasis>
+ leds are set to zeros but the number of LEDs and the leds structures
+themselves are preserved.
+</para>
+
+
+</sect1>
+<sect1 id='Setting_Xkb_Features_for_Non_KeyClass_Input_Extension_Devices'>
+<title>Setting Xkb Features for Non-KeyClass Input Extension Devices</title>
+
+<para>
+The Xkb extension allows clients to assign any key action to either core
+pointer or input extension device buttons. This makes it possible to control
+the keyboard or generate keyboard key events from extension devices or from the
+core pointer.
+</para>
+
+
+<para>
+Key actions assigned to core X pointer buttons or input extension device
+buttons cause key events to be generated as if they had originated from the
+core X keyboard.
+</para>
+
+
+<para>
+Xkb implementations are required to support key actions for the buttons of the
+core pointer device, but support for actions on extension devices is optional.
+Implementations that do not support button actions for extension devices must
+not set the <emphasis>
+XkbXI_ButtonActionsMask</emphasis>
+ bit in the <emphasis>
+supported</emphasis>
+ field of an <emphasis>
+XkbDeviceInfoRec</emphasis>
+ structure.
+</para>
+
+
+<para>
+If a client attempts to modify valid characteristics of a device using an
+implementation that does not support modification of those characteristics, no
+protocol error is generated. Instead, the server reports a failure for the
+request; it also sends an <emphasis>
+XkbExtensionDeviceNotify</emphasis>
+ event to the client that issued the request if the client has selected to
+receive these events.
+</para>
+
+
+<para>
+To change characteristics of an X Input Extension device in the server, first
+modify a local copy of the device structure and then use either <emphasis>
+XkbSetDeviceInfo,</emphasis>
+ or, to save network traffic, use an <emphasis>
+XkbDeviceChangesRec</emphasis>
+ structure (see section 21.6) and call <emphasis>
+XkbChangeDeviceInfo</emphasis>
+ to download the changes to the server.
+</para>
+
+
+<para>
+To modify some or all of the characteristics of an X Input Extension device,
+use XkbSetDeviceInfo.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbSetDeviceInfo</emphasis>
+(<emphasis>
+dpy</emphasis>
+, which, device_info)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *            <emphasis>
+dpy</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+which</emphasis>
+;            /* mask indicating characteristics to modify */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDeviceInfoPtr            device_info;            /* structure defining the
+device and modifications */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbSetDeviceInfo</emphasis>
+ sends a request to the server to modify the characteristics of the device
+specified in the <emphasis>
+device_info</emphasis>
+ structure. The particular characteristics modified are identified by the bits
+set in <emphasis>
+which</emphasis>
+ and take their values from the relevant fields in <emphasis>
+device_info</emphasis>
+ (see Table 21.1). <emphasis>
+XkbSetDeviceInfo</emphasis>
+ returns <emphasis>
+True</emphasis>
+ if the request was successfully sent to the server. If the X server
+implementation does not allow interaction between the X input extension and the
+Xkb Extension, the function does nothing and returns <emphasis>
+False</emphasis>
+.
+</para>
+
+
+<para>
+The <emphasis>
+which</emphasis>
+ parameter specifies which aspects of the device should be changed and is a
+bitmask composed of an inclusive OR or one or more of the following bits:
+<emphasis>
+XkbXI_ButtonActionsMask</emphasis>
+, <emphasis>
+XkbXI_IndicatorNamesMask</emphasis>
+, <emphasis>
+XkbXI_IndicatorMapsMask</emphasis>
+. If the features requested to be manipulated in <emphasis>
+which</emphasis>
+ are valid for the device, but the server does not support assignment of one or
+more of them, that particular portion of the request is ignored.
+</para>
+
+
+<para>
+If the device specified in <emphasis>
+device_info</emphasis>
+-&gt;<emphasis>
+device_spec</emphasis>
+ does not contain buttons and a request affecting buttons is made, or the
+device does not contain indicators and a request affecting indicators is made,
+a <emphasis>
+BadMatch</emphasis>
+ protocol error results.
+</para>
+
+
+<para>
+If the <emphasis>
+XkbXI_ButtonActionsMask</emphasis>
+ bit is set in the supported mask returned by XkbGetDeviceInfo, the Xkb
+extension allows applications to assign key actions to buttons on input
+extension devices other than the core keyboard device. If the <emphasis>
+XkbXI_ButtonActionsMask</emphasis>
+ is set in <emphasis>
+which</emphasis>
+, the actions for all buttons specified in device_info are set to the <emphasis>
+XkbAction</emphasis>
+s specified in <emphasis>
+device_info</emphasis>
+-&gt;<emphasis>
+btn_acts</emphasis>
+. If the number of buttons requested to be updated is not valid for the device,
+<emphasis>
+XkbSetDeviceInfo</emphasis>
+ returns <emphasis>
+False</emphasis>
+ and a <emphasis>
+BadValue</emphasis>
+ protocol error results.
+</para>
+
+
+<para>
+If the <emphasis>
+XkbXI_IndicatorMaps</emphasis>
+ and / or <emphasis>
+XkbXI_IndicatorNamesMask</emphasis>
+ bit is set in the supported mask returned by XkbGetDeviceInfo, the Xkb
+extension allows applications to assign maps and / or names to the indicators
+of nonkeyboard extension devices. If supported, maps and / or names can be
+assigned to all extension device indicators, whether they are part of a
+keyboard feedback or part of an indicator feedback.
+</para>
+
+
+<para>
+If the <emphasis>
+XkbXI_IndicatorMapsMask</emphasis>
+ and / or <emphasis>
+XkbXI_IndicatorNamesMask</emphasis>
+ flag is set in <emphasis>
+which</emphasis>
+, the indicator maps and / or names for all <emphasis>
+device_info</emphasis>
+-&gt;<emphasis>
+num_leds</emphasis>
+ indicator devices specified in <emphasis>
+device_info</emphasis>
+-&gt;<emphasis>
+leds</emphasis>
+ are set to the maps and / or names specified in <emphasis>
+device_info</emphasis>
+-&gt;<emphasis>
+leds</emphasis>
+. <emphasis>
+device_info</emphasis>
+-&gt;<emphasis>
+leds</emphasis>
+-&gt;<emphasis>
+led_class</emphasis>
+ and <emphasis>
+led_id</emphasis>
+ specify the input extension class and device ID for each indicator device to
+modify; if they have invalid values, a <emphasis>
+BadValue</emphasis>
+ protocol error results and <emphasis>
+XkbSetDeviceInfo</emphasis>
+ returns <emphasis>
+False</emphasis>
+. If they have legal values but do not specify a keyboard or indicator class
+feedback for the device in question, a <emphasis>
+BadMatch</emphasis>
+ error results. If any of the values in <emphasis>
+device_info</emphasis>
+-&gt;<emphasis>
+leds</emphasis>
+<emphasis>
+-&gt;</emphasis>
+<emphasis>
+names</emphasis>
+ are not a valid Atom or <emphasis>
+None</emphasis>
+, a <emphasis>
+BadAtom</emphasis>
+ protocol error results.
+</para>
+
+
+<para>
+Xkb provides convenience functions to modify subsets of the information
+accessible via <emphasis>
+XkbSetDeviceInfo</emphasis>
+. Only the parts of the structure indicated in the function description are
+modified. These convenience functions are described as follows.
+</para>
+
+
+<para>
+To change only the button actions for an input extension device, use
+XkbSetDeviceButtonActions.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbSetDeviceButtonActions</emphasis>
+(<emphasis>
+dpy</emphasis>
+, device, first_button, num_buttons, actions)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *            <emphasis>
+dpy</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDeviceInfoPtr            device_info;            /* structure defining the
+device and modifications */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            first_button;            /* number of first button to
+update, 0 relative */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            num_buttons;            /* number of buttons to update
+*/
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbSetDeviceButtonActions</emphasis>
+ assigns actions to the buttons of the device specified in
+device_info-&gt;<emphasis>
+device_spec</emphasis>
+. Actions are assigned to <emphasis>
+num_buttons</emphasis>
+ buttons beginning with <emphasis>
+first_button</emphasis>
+ and are taken from the actions specified in <emphasis>
+device_info</emphasis>
+-&gt;<emphasis>
+btn_acts</emphasis>
+.
+</para>
+
+
+<para>
+If the server does not support assignment of Xkb actions to extension device
+buttons, <emphasis>
+XkbSetDeviceButtonActions</emphasis>
+ has no effect and returns <emphasis>
+False</emphasis>
+. If the device has no buttons or if <emphasis>
+first_button</emphasis>
+ or <emphasis>
+num_buttons</emphasis>
+ specify buttons outside of the valid range as determined by <emphasis>
+device_info</emphasis>
+-&gt;<emphasis>
+num_btns</emphasis>
+, the function has no effect and returns <emphasis>
+False</emphasis>
+. Otherwise, <emphasis>
+XkbSetDeviceButtonActions</emphasis>
+ sends a request to the server to change the actions for the specified buttons
+and returns <emphasis>
+True</emphasis>
+.
+</para>
+
+
+<para>
+If the actual request sent to the server involved illegal button numbers, a
+<emphasis>
+BadValue</emphasis>
+ protocol error is generated. If an invalid device identifier is specified in
+device_info-&gt;<emphasis>
+device_spec</emphasis>
+, a BadKeyboard protocol error results. If the actual device specified in
+<emphasis>
+device_info</emphasis>
+-&gt;<emphasis>
+device_spec</emphasis>
+ does not contain buttons and a request affecting buttons is made, a <emphasis>
+BadMatch</emphasis>
+ protocol error is generated.
+</para>
+
+
+</sect1>
+<sect1 id='XkbExtensionDeviceNotify_Event'>
+<title>XkbExtensionDeviceNotify Event</title>
+
+<para>
+The Xkb extension generates <emphasis>
+XkbExtensionDeviceNotify</emphasis>
+ events when the status of an input extension device changes or when an attempt
+is made to use an Xkb feature that is not supported by a particular device.
+</para>
+
+<note><para>Events indicating an attempt to use an unsupported feature are
+delivered only to the client requesting the event.</para></note>
+
+<para>
+To track changes to the status of input extension devices or attempts to use
+unsupported features of a device, select to receive <emphasis>
+XkbExtensionDeviceNotify</emphasis>
+ events by calling either <emphasis>
+XkbSelectEvents</emphasis>
+ or <emphasis>
+XkbSelectEventDetails</emphasis>
+ (see section 4.3).
+</para>
+
+
+<para>
+To receive <emphasis>
+XkbExtensionDeviceNotify</emphasis>
+ events under all possible conditions, call <emphasis>
+XkbSelectEvents</emphasis>
+ and pass <emphasis>
+XkbExtensionDeviceNotifyMask</emphasis>
+ in both <emphasis>
+bits_to_change</emphasis>
+ and <emphasis>
+values_for_bits</emphasis>
+.
+</para>
+
+
+<para>
+The <emphasis>
+XkbExtensionDeviceNotify</emphasis>
+ event has no event details. However, you can call <emphasis>
+XkbSelectEventDetails</emphasis>
+ using <emphasis>
+XkbExtensionDeviceNotify</emphasis>
+ as the <emphasis>
+event_type</emphasis>
+ and specifying <emphasis>
+XkbAllExtensionDeviceMask</emphasis>
+ in <emphasis>
+bits_to_change</emphasis>
+ and <emphasis>
+values_for_bits.</emphasis>
+ This has the same effect as a call to <emphasis>
+XkbSelectEvents</emphasis>
+.
+</para>
+
+
+<para>
+The structure for <emphasis>
+XkbExtensionDeviceNotify</emphasis>
+ events is:
+</para>
+
+<para><programlisting>
+typedef struct {
+      int      type;           /* Xkb extension base event code */
+      unsigned long  serial;   /* X server serial number for event */
+      Bool     send_event;     /* <emphasis>True</emphasis>
+                                  =&gt; synthetically generated*/
+      Display *      display;  /* server connection where event generated */
+      Time     time;           /* server time when event generated */
+      int      xkb_type;  /* <emphasis>XkbExtensionDeviceNotifyEvent</emphasis> */
+      int      device;         /* Xkb device ID, will not be
+                                  <emphasis>XkbUseCoreKbd</emphasis> */
+      unsigned int   reason;   /* reason for the event */
+      unsigned int   supported;  /* mask of supported features */
+      unsigned int   unsupported;  /* unsupported features this client
+                                      attempted to use */
+      int      first_btn;      /* first button that changed */
+      int      num_btns;       /* number of buttons that changed */
+      unsigned int   leds_defined;  /* indicators with names or maps */
+      unsigned int       led_state; /* current state of the indicators */
+      int       led_class;          /* feedback class for LED changes */
+      int       led_id;             /* feedback ID for LED changes */
+} <emphasis>XkbExtensionDeviceNotifyEvent</emphasis>;
+</programlisting></para>
+
+<para>
+The <emphasis>
+XkbExtensionDeviceNotify</emphasis>
+ event has fields enabling it to report changes in the state (on/off) of all of
+the buttons for a device, but only for one LED feedback associated with a
+device. You will get multiple events when more than one LED feedback changes
+state or configuration.
+</para>
+
+
+</sect1>
+<sect1 id='Tracking_Changes_to_Extension_Devices'>
+<title>Tracking Changes to Extension Devices</title>
+
+<para>
+Changes to an Xkb extension device may be tracked by listening to <emphasis>
+XkbDeviceExtensionNotify</emphasis>
+ events and accumulating the changes in an <emphasis>
+XkbDeviceChangesRec</emphasis>
+ structure. The changes noted in the structure may then be used in subsequent
+operations to update either a server configuration or a local copy of an Xkb
+extension device configuration. The changes structure is defined as follows:
+</para>
+
+<para><programlisting>
+typedef struct _XkbDeviceChanges {
+      unsigned int    changed;   /* bits indicating what has changed */
+      unsigned short  first_btn; /* number of first button which changed,
+                                    if any */
+      unsigned short  num_btns;  /* number of buttons that have changed */
+      XkbDeviceLedChangesRec leds;
+} <emphasis>XkbDeviceChangesRec</emphasis>,*XkbDeviceChangesPtr;
+</programlisting></para>
+
+<para><programlisting>
+typedef struct _XkbDeviceLedChanges {
+      unsigned short  led_class; /* class of this indicator feedback bundle */
+      unsigned short  led_id;    /* ID of this indicator feedback bundle */
+      unsigned int    names;     /* bits indicating which names have changed */
+      unsigned int    maps;      /* bits indicating which maps have changed */
+      struct _XkbDeviceLedChanges *next; /* link to indicator change record
+                                            for next set */
+} <emphasis>XkbDeviceLedChangesRec</emphasis>,*XkbDeviceLedChangesPtr;
+</programlisting></para>
+
+<para>
+A local description of the configuration and state of a device may be kept in
+an <emphasis>
+XkbDeviceInfoRec</emphasis>
+ structure. The actual state or configuration of the device may change because
+of XkbSetDeviceInfo and XkbSetButtonActions requests made by clients or by user
+interaction with the device. The X server sends an XkbExtensionDeviceNotify
+event to all interested clients when the state of any buttons or indicators or
+the configuration of the buttons or indicators on the core keyboard or any
+input extension device changes. The event reports the state of indicators for a
+single indicator feedback, and the state of up to 128 buttons. If more than 128
+buttons or more than one indicator feedback are changed, the additional buttons
+and indicator feedbacks are reported in subsequent events. Xkb provides
+functions with which you can track changes to input extension devices by noting
+the changes that were made and then requesting the changed information from the
+server.
+</para>
+
+
+<para>
+To note device changes reported in an <emphasis>
+XkbExtensionDeviceNotify</emphasis>
+ event, use XkbNoteDeviceChanges.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+void <emphasis>
+XkbNoteDeviceChanges</emphasis>
+ (<emphasis>
+old, new, wanted</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDeviceChangesPtr                        <emphasis>
+old</emphasis>
+;            /* structure tracking state changes */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbExtensionDeviceNotifyEvent             *            <emphasis>
+new</emphasis>
+;            /* event indicating state changes */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int                        <emphasis>
+wanted</emphasis>
+;            /* mask indicating changes to note */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+The wanted field specifies the changes that should be noted in <emphasis>
+old</emphasis>
+, and is composed of the bitwise inclusive OR of one or more of the masks from
+Table 21.1<emphasis>
+.</emphasis>
+ The <emphasis>
+reason</emphasis>
+ field of the event in <emphasis>
+new</emphasis>
+ indicates the types of changes the event is reporting. <emphasis>
+XkbNoteDeviceChanges</emphasis>
+ updates the <emphasis>
+XkbDeviceChangesRec</emphasis>
+ specified by <emphasis>
+old</emphasis>
+ with the changes that are both specified in <emphasis>
+wanted</emphasis>
+ and contained in <emphasis>
+new</emphasis>
+-&gt;<emphasis>
+reason</emphasis>
+.
+</para>
+
+
+<para>
+To update a local copy of the state and configuration of an X input extension
+device with the changes previously noted in an <emphasis>
+XkbDeviceChangesRec</emphasis>
+ structure, use XkbGetDeviceInfoChanges.
+</para>
+
+
+<para>
+To query the changes that have occurred in the button actions or indicator
+names and indicator maps associated with an input extension device, use
+XkbGetDeviceInfoChanges.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Status <emphasis>
+XkbGetDeviceInfoChanges</emphasis>
+(<emphasis>
+dpy</emphasis>
+, <emphasis>
+device_info</emphasis>
+, changes)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *            <emphasis>
+dpy</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDeviceInfoPtr            device_info;            /* structure to update with
+results */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDeviceChangesPtr            <emphasis>
+changes</emphasis>
+;            /* contains notes of changes that have occurred */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+The changes-&gt;changed field indicates which attributes of the device
+specified in <emphasis>
+changes</emphasis>
+-&gt;<emphasis>
+device</emphasis>
+ have changed. The parameters describing the changes are contained in the other
+fields of <emphasis>
+changes</emphasis>
+. <emphasis>
+XkbGetDeviceInfoChanges</emphasis>
+ uses that information to call XkbGetDeviceInfo to obtain the current status of
+those attributes that have changed. It then updates the local description of
+the device in <emphasis>
+device_info</emphasis>
+ with the new information.
+</para>
+
+
+<para>
+To update the server’s description of a device with the changes noted in an
+XkbDeviceChangesRec, use XkbChangeDeviceInfo.
+</para>
+
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbChangeDeviceInfo</emphasis>
+ (<emphasis>
+dpy, device_info, changes</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display *            <emphasis>
+dpy</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDeviceInfoPtr            <emphasis>
+device_info</emphasis>
+;            /* local copy of device state and configuration */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+XkbDeviceChangesPtr            <emphasis>
+changes</emphasis>
+;            /* note specifying changes in <emphasis>
+device_info</emphasis>
+ */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbChangeDeviceInfo</emphasis>
+ updates the server’s description of the device specified in <emphasis>
+device_info</emphasis>
+-&gt;<emphasis>
+device_spec</emphasis>
+ with the changes specified in <emphasis>
+changes</emphasis>
+ and contained in <emphasis>
+device_info</emphasis>
+. The update is made by an XkbSetDeviceInfo request.
+</para>
+
+</sect1>
+</chapter>
diff --git a/specs/XKB/ch22.xml b/specs/XKB/ch22.xml
new file mode 100644 (file)
index 0000000..4dea733
--- /dev/null
@@ -0,0 +1,218 @@
+<chapter id='Debugging_Aids'>
+<title>Debugging Aids</title>
+
+<para>
+The debugging aids are intended for use primarily by Xkb implementors and are
+optional in any implementation.
+</para>
+
+
+<para>
+There are two bitmasks that may be used to control debugging. One bitmask
+controls the output of debugging information, and the other controls behavior.
+Both bitmasks are initially all zeros.
+</para>
+
+
+<para>
+To change the values of any of the debug controls, use <emphasis>
+XkbSetDebuggingFlags</emphasis>
+.
+</para>
+
+<informaltable frame='none'>
+<?dbfo keep-together="always" ?>
+<tgroup cols='1' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.0*'/>
+<tbody>
+  <row>
+    <entry role='functiondecl'>
+Bool <emphasis>
+XkbSetDebuggingFlags</emphasis>
+(<emphasis>
+display, mask, flags, msg, ctrls_mask, ctrls, ret_flags, ret_ctrls</emphasis>
+)
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+Display * <emphasis>
+            display</emphasis>
+;            /* connection to X server */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int <emphasis>
+            mask</emphasis>
+;            /* mask selecting debug output flags to change */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int <emphasis>
+            flags</emphasis>
+;            /* values for debug output flags selected by <emphasis>
+mask</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+char * <emphasis>
+            msg</emphasis>
+;            /* message to print right now */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+ctrls_mask</emphasis>
+;            /* mask selecting debug controls to change */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int            <emphasis>
+ctrls</emphasis>
+;            /* values for debug controls selected by <emphasis>
+ctrls_mask</emphasis>
+ */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int * <emphasis>
+            ret_flags</emphasis>
+;            /* resulting state of all debug output flags */
+    </entry>
+  </row>
+  <row>
+    <entry role='functionargdecl'>
+unsigned int *            <emphasis>
+ret_ctrls</emphasis>
+;            /* resulting state of all debug controls */
+    </entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+<para>
+<emphasis>
+XkbSetDebuggingFlags</emphasis>
+ modifies the debug output flags as specified by <emphasis>
+mask</emphasis>
+ and <emphasis>
+flags</emphasis>
+, modifies the debug controls flags as specified by <emphasis>
+ctrls_mask</emphasis>
+ and <emphasis>
+ctrls</emphasis>
+, prints the message <emphasis>
+msg</emphasis>
+, and backfills <emphasis>
+ret_flags</emphasis>
+ and <emphasis>
+ret_ctrls</emphasis>
+ with the resulting debug output and debug controls flags.
+</para>
+
+
+<para>
+When bits are set in the debug output masks, <emphasis>
+mask</emphasis>
+ and <emphasis>
+flags</emphasis>
+, Xkb prints debug information corresponding to each bit at appropriate points
+during its processing. The device to which the output is written is
+implementation-dependent, but is normally the same device to which X server
+error messages are directed; thus the bits that can be set in <emphasis>
+mask</emphasis>
+ and <emphasis>
+flags</emphasis>
+ is implementation-specific. To turn on a debug output selection, set the bit
+for the output in the <emphasis>
+mask</emphasis>
+ parameter and set the corresponding bit in the <emphasis>
+flags</emphasis>
+ parameter. To turn off event selection for an event, set the bit for the
+output in the <emphasis>
+mask</emphasis>
+ parameter and do not set the corresponding bit in the <emphasis>
+flags</emphasis>
+ parameter.
+</para>
+
+
+<para>
+When bits are set in the debug controls masks, <emphasis>
+ctrls_mask</emphasis>
+ and <emphasis>
+ctrls</emphasis>
+, Xkb modifies its behavior according to each controls bit. <emphasis>
+ctrls_mask</emphasis>
+ and <emphasis>
+ctrls</emphasis>
+ are related in the same way that <emphasis>
+mask</emphasis>
+ and <emphasis>
+flags</emphasis>
+ are. The valid controls bits are defined in Table 22.1.
+</para>
+
+<table frame='topbot'>
+<title>Debug Control Masks</title>
+<?dbfo keep-together="always" ?>
+<tgroup cols='3' align='left' colsep='0' rowsep='0'>
+<colspec colname='c1' colwidth='1.5*'/>
+<colspec colname='c2' colwidth='1.0*'/>
+<colspec colname='c3' colwidth='2.0*'/>
+<thead>
+<row rowsep='1'>
+  <entry>Debug Control Mask</entry>
+  <entry>Value</entry>
+  <entry>Meaning</entry>
+</row>
+</thead>
+<tbody>
+<row>
+    <entry>XkbDF_DisableLocks</entry>
+    <entry>(1 &lt;&lt; 0)</entry>
+    <entry>Disable actions that lock modifiers</entry>
+  </row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+<emphasis>
+XkbSetDebuggingFlags</emphasis>
+ returns <emphasis>
+True</emphasis>
+ if successful and <emphasis>
+False</emphasis>
+ otherwise. The only protocol error it may generate is <emphasis>
+BadAlloc</emphasis>
+, if for some reason it is unable to allocate storage.
+</para>
+
+
+<para>
+<emphasis>
+XkbSetDebuggingFlags</emphasis>
+ is intended for developer use and may be disabled in production X servers. If
+it is disabled, <emphasis>
+XkbSetDebuggingFlags</emphasis>
+ has no effect and does not generate any protocol errors.
+</para>
+
+
+<para>
+The message in <emphasis>
+msg</emphasis>
+ is written immediately. The device to which it is written is implementation
+dependent but is normally the same device where X server error messages are
+directed.
+</para>
+</chapter>
diff --git a/specs/XKB/glossary.xml b/specs/XKB/glossary.xml
new file mode 100644 (file)
index 0000000..0cccf0f
--- /dev/null
@@ -0,0 +1,1016 @@
+<glossary id='glossary'>
+<title>Glossary</title>
+<glossentry>
+  <glossterm>Allocator</glossterm>
+  <glossdef>
+    <para>
+Xkb provides functions, known as allocators, to create and initialize Xkb data
+structures.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Audible Bell</glossterm>
+  <glossdef>
+    <para>
+An audible bell is the sound generated by whatever bell is associated with the
+keyboard or input extension device, as opposed to any other audible sound
+generated elsewhere in the system.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Autoreset Controls</glossterm>
+  <glossdef>
+    <para>
+The autoreset controls configure the boolean controls to automatically be
+enabled or disabled at the time a program exits.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Base Group</glossterm>
+  <glossdef>
+    <para>
+The group in effect as a result of all actions other than a previous lock or
+latch request; the base group is transient. For example, the user pressing and
+holding a group shift key that shifts to Group2 would result in the base group
+being group 2 at that point in time. Initially, base group is always Group1.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Base Modifiers</glossterm>
+  <glossdef>
+    <para>
+Modifiers that are turned on as a result of some actions other than previous
+lock or latch requests; base modifiers are transient. For example, the user
+pressing and holding a key bound to the Shift modifier would result in Shift
+being a base modifier at that point in time.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Base Event Code</glossterm>
+  <glossdef>
+    <para>
+A number assigned by the X server at run time that is assigned to the extension
+to identify events from that extension.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Base State</glossterm>
+  <glossdef>
+    <para>
+The base group and base modifiers represent keys that are physically or
+logically down; these constitute the base state.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Boolean Controls</glossterm>
+  <glossdef>
+    <para>
+Global keyboard controls that may be selectively enabled and disabled under
+program control and that may be automatically set to an on or off condition
+upon client program exit.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Canonical Key Types</glossterm>
+  <glossdef>
+    <para>
+The canonical key types are predefined key types that describe the types of
+keys available on most keyboards. The definitions for the canonical key types
+are held in the first <emphasis>
+XkbNumRequiredTypes</emphasis>
+ entries of the <emphasis>
+types</emphasis>
+ field of the client map and are indexed using the following constants:
+    </para>
+    <itemizedlist>
+      <listitem>
+        <para>
+<emphasis>XkbOneLevelIndex</emphasis>
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+<emphasis>XkbTwoLevelIndex</emphasis>
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+<emphasis>XkbAlphabeticIndex</emphasis>
+        </para>
+      </listitem>
+      <listitem>
+        <para>
+<emphasis>XkbKeypadIndex</emphasis>
+        </para>
+      </listitem>
+  </itemizedlist>
+  </glossdef>
+</glossentry>
+
+<glossentry>
+  <glossterm>Client Map</glossterm>
+  <glossdef>
+    <para>
+The key mapping information needed to convert arbitrary keycodes to symbols.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Compat Name</glossterm>
+  <glossdef>
+    <para>
+The <emphasis>
+compat</emphasis>
+ name is a string that provides some information about the rules used to bind
+actions to keys that are changed using core protocol requests.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Compatibility State</glossterm>
+  <glossdef>
+    <para>
+When an Xkb-extended X server connects to an Xkb-unaware client, the
+compatibility state remaps the keyboard group into a core modifier whenever
+possible.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Compatibility Grab State</glossterm>
+  <glossdef>
+    <para>
+The grab state that results from applying the compatibility map to the Xkb grab
+state.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Compatibility Map</glossterm>
+  <glossdef>
+    <para>
+The definition of how to map core protocol keyboard state to Xkb keyboard state.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Component Expression</glossterm>
+  <glossdef>
+    <para>
+An expression used to describe server keyboard database components to be
+loaded. It describes the order in which the components should be loaded and the
+rules by which duplicate attributes should be resolved.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Compose Processing</glossterm>
+  <glossdef>
+    <para>
+The process of mapping a series of keysyms to a string is known as compose
+processing.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Consumed Modifier</glossterm>
+  <glossdef>
+    <para>
+Xkb normally consumes modifiers in determining the appropriate symbol for an
+event, that is, the modifiers are not considered during any of the later stages
+of event processing. For those rare occasions when a modifier <emphasis>
+should</emphasis>
+ be considered despite having been used to look up a symbol, key types include
+an optional <emphasis>
+preserve</emphasis>
+ field.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Core Event</glossterm>
+  <glossdef>
+    <para>
+An event created from the core X server.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Detectable Auto-Repeat</glossterm>
+  <glossdef>
+    <para>
+Detectable auto-repeat allows a client to detect an auto-repeating key. If a
+client requests and the server supports detectable auto-repeat, Xkb generates
+<emphasis>
+KeyRelease</emphasis>
+ events only when the key is physically released. Thus the client receives a
+number of <emphasis>
+KeyPress</emphasis>
+ events for that key without intervening <emphasis>
+KeyRelease</emphasis>
+ events until the key is finally released, when a <emphasis>
+KeyRelease</emphasis>
+ event is received.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Effective Group</glossterm>
+  <glossdef>
+    <para>
+The effective group is the arithmetic sum of the locked, latched, and base
+groups. The effective keyboard group is always brought back into range
+depending on the value of the <emphasis>
+GroupsWrap</emphasis>
+ control for the keyboard. If an event occurs with an effective group that is
+legal for the keyboard as a whole, but not for the key in question, the group
+<emphasis>
+for that event only</emphasis>
+ is normalized using the algorithm specified by the <emphasis>
+group_info</emphasis>
+ member of the key symbol map (<emphasis>
+XkbSymMapRec</emphasis>
+).
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Effective Mask</glossterm>
+  <glossdef>
+    <para>
+An Xkb modifier definition consists of a set of bit masks corresponding to the
+eight real modifiers; a similar set of bitmasks corresponding to the 16 named
+virtual modifiers; and an effective mask. The effective mask represents the set
+of all real modifiers that can logically be set either by setting any of the
+real modifiers or by setting any of the virtual modifiers in the definition.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Effective Modifier</glossterm>
+  <glossdef>
+    <para>
+The effective modifiers are the bitwise union of the base, latched and locked
+modifiers.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Extension Device</glossterm>
+  <glossdef>
+    <para>
+Any keyboard or other input device recognized by the X input extension.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Global Keyboard Controls</glossterm>
+  <glossdef>
+    <para>
+Controls that affect the way Xkb generates key events. The controls affect all
+keys, as opposed to per-key controls that are for a single key. Global controls
+include
+    </para>
+    <itemizedlist>
+    <listitem>
+      <para>RepeatKeys Control</para>
+    </listitem>
+    <listitem>
+      <para>DetectableAuto-repeat</para>
+    </listitem>
+    <listitem>
+      <para>SlowKeys</para>
+    </listitem>
+    <listitem>
+      <para>BounceKeys</para>
+    </listitem>
+    <listitem>
+      <para>StickyKeys</para>
+    </listitem>
+    <listitem>
+      <para>MouseKeys</para>
+    </listitem>
+    <listitem>
+      <para>MouseKeysAccel</para>
+    </listitem>
+    <listitem>
+      <para>AccessXKeys</para>
+    </listitem>
+    <listitem>
+      <para>AccessXTimeout</para>
+    </listitem>
+    <listitem>
+      <para>AccessXFeedback</para>
+    </listitem>
+    <listitem>
+      <para>Overlay1</para>
+    </listitem>
+    <listitem>
+      <para>Overlay2</para>
+    </listitem>
+    <listitem>
+      <para>EnabledControls</para>
+    </listitem>
+    </itemizedlist>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Grab State</glossterm>
+  <glossdef>
+    <para>
+The grab state is the state used when matching events to passive grabs. It
+consists of the grab group and the grab modifiers.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Group</glossterm>
+  <glossdef>
+    <para>See Keysym Group</para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Group Index</glossterm>
+  <glossdef>
+    <para>
+A number used as the internal representation for a group number. Group1 through
+Group 4 have indices of 0 through 3.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Groups Wrap Control</glossterm>
+  <glossdef>
+    <para>
+If a group index exceeds the maximum number of groups permitted for the
+specified keyboard, it is wrapped or truncated back into range as specified by
+the global <emphasis>GroupsWrap</emphasis> control. <emphasis>
+GroupsWrap</emphasis> can have the following values:
+    </para>
+    <literallayout>
+          <emphasis>WrapIntoRange</emphasis>
+          <emphasis>ClampIntoRange</emphasis>
+          <emphasis>RedirectIntoRange</emphasis>
+    </literallayout>
+  </glossdef>
+</glossentry>
+
+<glossentry>
+  <glossterm>Key Type</glossterm>
+  <glossdef>
+    <para>
+An attribute of a key that identifies which modifiers affect the shift level of
+a key and the number of groups on the key.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Key Width</glossterm>
+  <glossdef>
+    <para>
+The maximum number of shift levels in any group for the key type associated
+with a key.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Keysym Group</glossterm>
+  <glossdef>
+    <para>
+A keysym group is a logical state of the keyboard providing access to a
+collection of characters. A group usually contains a set of characters that
+logically belong together and that may be arranged on several shift levels
+within that group. For example, Group1 could be the English alphabet, and
+Group2 could be Greek. Xkb supports up to four different groups for an input
+device or keyboard. Groups are in the range 1-4 (Group1 - Group4), and are
+often referred to as G1 - G4 and indexed as 0 - 3.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Indicator</glossterm>
+  <glossdef>
+    <para>
+An indicator is a feedback mechanism such as an LED on an input device. Using
+Xkb, a client application can determine the names of the various indicators,
+determine and control the way that the individual indicators should be updated
+to reflect keyboard changes, and determine which of the 32 keyboard indicators
+reported by the protocol are actually present on the keyboard.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Indicator Feedback</glossterm>
+  <glossdef>
+    <para>
+An indicator feedback describes the state of a bank of up to 32 lights. It has
+a mask where each bit corresponds to a light and an associated value mask that
+specifies which lights are on or off.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Indicator Map</glossterm>
+  <glossdef>
+    <para>
+An indicator has its own set of attributes that specify whether clients can
+explicitly set its state and whether it tracks the keyboard state. The
+indicator map is the collection of these attributes for each indicator and is
+held in the <emphasis>
+maps</emphasis>
+ array, which is an array of <emphasis>
+XkbIndicatorRec</emphasis>
+ structures.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Input Extension</glossterm>
+  <glossdef>
+    <para>
+An extension to the core X protocol that allows an X server to support multiple
+keyboards, as well as other input devices, in addition to the core X keyboard
+and pointer. Other types of devices supported by the input extension include,
+but are not limited to: mice, tablets, touchscreens, barcode readers, button
+boxes, trackballs, identifier devices, data gloves, and eye trackers.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Key Action</glossterm>
+  <glossdef>
+    <para>
+A key action consists of an operator and some optional data. Once the server
+has applied the global controls and per-key behavior and has decided to process
+a key event, it applies key actions to determine the effects of the key on the
+internal state of the server. Xkb supports actions that do the following:
+    </para>
+    <itemizedlist>
+    <listitem>
+      <para>
+Change base, latched, or locked modifiers or group
+      </para>
+    </listitem>
+    <listitem>
+      <para>
+Move the core pointer or simulate core pointer button events
+      </para>
+    </listitem>
+    <listitem>
+      <para>
+Change most aspects of keyboard behavior
+      </para>
+    </listitem>
+    <listitem>
+      <para>
+Terminate or suspend the server
+      </para>
+    </listitem>
+    <listitem>
+      <para>
+Send a message to interested clients
+      </para>
+    </listitem>
+    <listitem>
+      <para>
+Simulate events on other keys
+      </para>
+    </listitem>
+    </itemizedlist>
+  </glossdef>
+</glossentry>
+
+<glossentry>
+  <glossterm>Key Alias</glossterm>
+  <glossdef>
+    <para>
+A key alias is a symbolic name for a specific physical key. Key aliases allow
+the keyboard layout designer to assign multiple key names to a single key. This
+allows the keyboard layout designer to refer to keys using either their
+position or their "function." Key aliases can be specified both in the symbolic
+names component and in the keyboard geometry. Both sets of aliases are always
+valid, but key alias definitions in the keyboard geometry have priority; if
+both symbolic names and geometry include aliases, you should consider the
+definitions from the geometry before considering the definitions from the
+symbolic names section.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Key Behavior</glossterm>
+  <glossdef>
+    <para>
+The <emphasis>
+behaviors</emphasis>
+ field of the server map is an array of <emphasis>
+XkbBehavior</emphasis>
+, indexed by keycode, and contains the behavior for each key. The X server uses
+key behavior to determine whether to process or filter out any given key event;
+key behavior is independent of keyboard modifier or group state. Each key has
+exactly one behavior.
+    </para>
+    <para>Key behaviors include:</para>
+    <itemizedlist>
+    <listitem>
+      <para>XkbKB_Default</para>
+    </listitem>
+    <listitem>
+      <para>XkbKB_Lock</para>
+    </listitem>
+    <listitem>
+      <para>XkbKB_RadioGroup</para>
+    </listitem>
+    <listitem>
+      <para>XkbKB_Overlay1</para>
+    </listitem>
+    <listitem>
+      <para>XkbKB_Overlay2</para>
+    </listitem>
+    </itemizedlist>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Key Symbol Map</glossterm>
+  <glossdef>
+    <para>
+A key symbol map describes the symbols bound to a key and the rules to be used
+to interpret those symbols. It is an array of <emphasis>
+XkbSymMapRec</emphasis>
+ structures indexed by keycode.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Key Type</glossterm>
+  <glossdef>
+    <para>
+Key types are used to determine the shift level of a key given the current
+state of the keyboard. There is one key type for each group for a key. Key
+types are defined using the <emphasis>
+XkbKeyTypeRec</emphasis>
+ and <emphasis>
+XkbKTMapEntryRec</emphasis>
+ structures. Xkb allows up to <emphasis>
+XkbMaxKeyTypes</emphasis>
+ (255) key types to be defined, but requires at least <emphasis>
+XkbNumRequiredTypes</emphasis>
+ (4) predefined types to be in a key map.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Keyboard Bells</glossterm>
+  <glossdef>
+    <para>
+The sound the default bell makes when rung is the system bell or the default
+keyboard bell. Some input devices may have more than one bell, identified by
+<emphasis>bell_class</emphasis> and <emphasis>bell_id</emphasis>.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Keyboard Components</glossterm>
+  <glossdef>
+    <para>
+There are five types of components stored in the X server database of keyboard
+components. They correspond to the <emphasis>
+symbols, geometry, keycodes, compat, </emphasis>
+and<emphasis>
+ types</emphasis>
+ symbolic names associated with a keyboard.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Keyboard Feedback</glossterm>
+  <glossdef>
+    <para>
+A keyboard feedback includes the following:
+    </para>
+<literallayout>
+      Keyclick volume
+      Bell volume
+      Bell pitch
+      Bell duration
+      Global auto-repeat
+      Per key auto-repeat
+      32 LEDs
+</literallayout>
+  </glossdef>
+</glossentry>
+
+<glossentry>
+  <glossterm>Key Width, Key Type Width</glossterm>
+  <glossdef>
+    <para>
+The maximum number of shift levels for a type is referred to as the width of a
+key type.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Keyboard Geometry</glossterm>
+  <glossdef>
+    <para>
+Keyboard geometry describes the physical appearance of the keyboard, including
+the shape, location, and color of all keyboard keys or other visible keyboard
+components such as indicators and is stored in a <emphasis>
+XkbGeometryRec</emphasis>
+ structure. The information contained in a keyboard geometry is sufficient to
+allow a client program to draw an accurate two-dimensional image of the
+keyboard.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Keyboard Geometry Name</glossterm>
+  <glossdef>
+    <para>
+The keyboard geometry name describes the physical location, size, and shape of
+the various keys on the keyboard and is part of the <emphasis>
+XkbNamesRec</emphasis>
+ structure.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Keyboard State</glossterm>
+  <glossdef>
+    <para>
+Keyboard state encompasses all of the transitory information necessary to map a
+physical key press or release to an appropriate event.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Keycode</glossterm>
+  <glossdef>
+    <para>
+A numeric value returned to the X server when a key on a keyboard is pressed or
+released, indicating which key is being modulated. Keycode numbers are in the
+range 1 &lt;= keycode &lt;= max, where max is the number of physical keys on
+the device.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Keycode Name</glossterm>
+  <glossdef>
+    <para>
+The keycode name describes the range and meaning of the keycodes returned by
+the keyboard and is part of the <emphasis>
+XkbNamesRec</emphasis>
+ structure.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Latched Group</glossterm>
+  <glossdef>
+    <para>
+A latched group is a group index that is combined with the base and locked
+group to form the effective group. It applies only to the next key event that
+does not change the keyboard state. The latched group can be changed by
+keyboard activity or via Xkb extension library functions.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Latched Modifier</glossterm>
+  <glossdef>
+    <para>
+Latched modifiers are the set of modifiers that are combined with the base
+modifiers and the locked modifiers to form the effective modifiers. It applies
+only to the next key event that does not change the keyboard state.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>LED</glossterm>
+  <glossdef>
+    <para>
+A light emitting diode. However, for the purposes of the X keyboard extension
+specification, a LED is any form of visual two-state indicator that is either
+on or off.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Locked Group</glossterm>
+  <glossdef>
+    <para>
+A locked group is a group index that is combined with the base and latched
+group to form the effective group. When a group is locked, it supersedes any
+previous locked group and remains the locked group for all future key events,
+until a new group is locked. The locked group can be changed by keyboard
+activity or via Xkb extension library functions.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Locked Modifiers</glossterm>
+  <glossdef>
+    <para>
+Locked modifiers are the set of modifiers that are combined with the base
+modifiers and the latched modifiers to form the effective modifiers. A locked
+modifier applies to all future key events until it is explicitly unlocked.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Lookup State      </glossterm>
+  <glossdef>
+    <para>
+The lookup state is composed of the lookup group and the lookup modifiers, and
+it is the state an Xkb-capable or Xkb-aware client should use to map a keycode
+to a keysym.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Modifier</glossterm>
+  <glossdef>
+    <para>
+A modifier is a logical condition that is either set or unset. The modifiers
+control the Shift Level selected when a key event occurs. Xkb supports the core
+protocol eight modifiers (<emphasis>
+Shift</emphasis>
+, <emphasis>
+Lock</emphasis>
+, <emphasis>
+Control</emphasis>
+, and <emphasis>
+Mod1</emphasis>
+ through <emphasis>
+Mod5</emphasis>
+), called the <emphasis>
+real</emphasis>
+ modifiers. In addition, Xkb extends modifier flexibility by providing a set of
+sixteen named virtual modifiers, each of which can be bound to any set of the
+eight real modifiers.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Modifier Key</glossterm>
+  <glossdef>
+    <para>
+A modifier key is a key whose operation has no immediate effect, but that, for
+as long as it is held down, modifies the effect of other keys. A modifier key
+may be, for example, a shift key or a control key.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Modifier Definition</glossterm>
+  <glossdef>
+    <para>
+An Xkb modifier definition, held in an <emphasis>
+XkbModsRec</emphasis>
+, consists of a set of real modifiers, a set of virtual modifiers, and an
+effective mask. The mask is the union of the real modifiers and the set of real
+modifiers to which the virtual modifiers map; the mask cannot be explicitly
+changed.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Nonkeyboard Extension Device      </glossterm>
+  <glossdef>
+    <para>
+An input extension device that is not a keyboard. Other types of devices
+supported by the input extension include, but are not limited to: mice,
+tablets, touchscreens, barcode readers, button boxes, trackballs, identifier
+devices, data gloves, and eye trackers.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Outlines</glossterm>
+  <glossdef>
+    <para>
+An outline is a list of one or more points that describes a single closed
+polygon, used in the geometry specification for a keyboard.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Physical Indicator Mask</glossterm>
+  <glossdef>
+    <para>
+The physical indicator mask is a field in the <emphasis>
+XkbIndicatorRec</emphasis>
+ that indicates which indicators are bound to physical LEDs on the keyboard; if
+a bit is set in <emphasis>
+phys_indicators</emphasis>
+, then the associated indicator has a physical LED associated with it. This
+field is necessary because some indicators may not have corresponding physical
+LEDs on the keyboard.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Physical Symbol Keyboard Name</glossterm>
+  <glossdef>
+    <para>
+The <emphasis>
+symbols</emphasis>
+ keyboard name identifies the symbols logically bound to the keys. The symbols
+name is a human or application-readable description of the intended locale or
+usage of the keyboard with these symbols. The <emphasis>
+phys_symbols</emphasis>
+ keyboard name, on the other hand, identifies the symbols actually engraved on
+the keyboard.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Preserved Modifier</glossterm>
+  <glossdef>
+    <para>
+Xkb normally consumes modifiers in determining the appropriate symbol for an
+event, that is, the modifiers are not considered during any of the later stages
+of event processing. For those rare occasions when a modifier <emphasis>
+should</emphasis>
+ be considered despite having been used to look up a symbol, key types include
+an optional <emphasis>
+preserve</emphasis>
+ field. If a modifier is present in the <emphasis>
+preserve</emphasis>
+ list, it is a preserved modifier.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Radio Group</glossterm>
+  <glossdef>
+    <para>
+A radio group is a set of keys whose behavior simulates a set of radio buttons.
+Once a key in a radio group is pressed, it stays logically depressed until
+another key in the group is pressed, at which point the previously depressed
+key is logically released. Consequently, at most one key in a radio group can
+be logically depressed at one time.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Real Modifier</glossterm>
+  <glossdef>
+    <para>
+Xkb supports the eight core protocol modifiers (<emphasis>
+Shift</emphasis>
+, <emphasis>
+Lock</emphasis>
+, <emphasis>
+Control</emphasis>
+, and <emphasis>
+Mod1</emphasis>
+ through <emphasis>
+Mod5</emphasis>
+); these are called the <emphasis>
+real</emphasis>
+ modifiers, as opposed to the set of sixteen named virtual modifiers that can
+be bound to any set of the eight real modifiers.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Server Internal Modifiers</glossterm>
+  <glossdef>
+    <para>
+Modifiers that the server uses to determine the appropriate symbol for an
+event; internal modifiers are normally consumed by the server.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Shift Level</glossterm>
+  <glossdef>
+    <para>
+One of several states (normally 2 or 3) governing which graphic character is
+produced when a key is actuated.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Symbol Keyboard Name</glossterm>
+  <glossdef>
+    <para>
+The <emphasis>
+symbols</emphasis>
+ keyboard name identifies the symbols logically bound to the keys. The symbols
+name is a human or application-readable description of the intended locale or
+usage of the keyboard with these symbols. The <emphasis>
+phys_symbols</emphasis>
+ keyboard name, on the other hand, identifies the symbols actually engraved on
+the keyboard.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Symbolic Name</glossterm>
+  <glossdef>
+    <para>
+Xkb supports symbolic names for most components of the keyboard extension. Most
+of these symbolic names are grouped into the <emphasis>
+names</emphasis>
+ component of the keyboard description.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>State Field</glossterm>
+  <glossdef>
+    <para>
+The portion of a client-side core protocol event that holds the modifier,
+group, and button state information pertaining to the event.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Types Name</glossterm>
+  <glossdef>
+    <para>
+The <emphasis>
+types</emphasis>
+ name provides some information about the set of key types that can be
+associated with the keyboard. In addition, each key type can have a name, and
+each shift level of a type can have a name.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Valuator</glossterm>
+  <glossdef>
+    <para>
+A valuator reports a range of values for some entity, like a mouse axis, a
+slider, or a dial.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Virtual Modifier</glossterm>
+  <glossdef>
+    <para>
+Xkb provides a set of sixteen named virtual modifiers that can be bound to any
+set of the eight real modifiers. Each virtual modifier can be bound to any set
+of the real modifiers (<emphasis>
+Shift</emphasis>
+, <emphasis>
+Lock</emphasis>
+, <emphasis>
+Control,</emphasis>
+ and <emphasis>
+Mod1</emphasis>
+-<emphasis>
+Mod5</emphasis>
+).
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Virtual Modifier Mapping</glossterm>
+  <glossdef>
+    <para>
+Xkb maintains a virtual modifier mapping, which lists the virtual modifiers
+associated with each key.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Xkb-aware Client</glossterm>
+  <glossdef>
+    <para>
+A client application that initializes Xkb extension and is consequently bound
+to an Xlib that includes the Xkb extension.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Xkb-capable Client</glossterm>
+  <glossdef>
+    <para>
+A client application that makes no Xkb extension Xlib calls but is bound to an
+Xlib that includes the Xkb extension.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry>
+  <glossterm>Xkb-unaware Client</glossterm>
+  <glossdef>
+    <para>
+A client application that makes no Xkb extension Xlib calls and is bound to an
+Xlib that does not include the Xkb extension.
+    </para>
+  </glossdef>
+</glossentry>
+
+</glossary>
diff --git a/specs/XKB/xkblib.xml b/specs/XKB/xkblib.xml
new file mode 100644 (file)
index 0000000..e4aa587
--- /dev/null
@@ -0,0 +1,108 @@
+<?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="xkblib">
+
+<bookinfo>
+   <title>The X Keyboard Extension:</title>
+   <subtitle>Library Specification</subtitle>
+   <releaseinfo>X Version 11, Release &fullrelvers;</releaseinfo>
+   <authorgroup>
+     <author>
+       <firstname>Amber</firstname>
+       <othername>J.</othername>
+       <surname>Benson</surname>
+     </author>
+     <author>
+       <firstname>Gary</firstname>
+       <surname>Aitken</surname>
+     </author>
+     <author>
+       <firstname>Erik</firstname>
+       <surname>Fortune</surname>
+       <affiliation><orgname>Silicon Graphics, Inc</orgname></affiliation>
+     </author>
+     <author>
+       <firstname>Donna</firstname>
+       <surname>Converse</surname>
+       <affiliation><orgname>X Consortium, Inc</orgname></affiliation>
+     </author>
+     <author>
+       <firstname>George</firstname>
+       <surname>Sachs</surname>
+       <affiliation><orgname>Hewlett-Packard Company</orgname></affiliation>
+     </author>
+     <author>
+       <firstname>Will</firstname>
+       <surname>Walker</surname>
+       <affiliation><orgname>Digital Equipment Corporation</orgname></affiliation>
+     </author>
+   </authorgroup>
+   <copyright><year>1995</year><year>1996</year>
+      <holder>X Consortium Inc.</holder>
+      <holder>Silicon Graphics Inc.</holder>
+      <holder>Hewlett-Packard Company</holder>
+      <holder>Digital Equipment Corporation</holder>
+   </copyright>
+
+<legalnotice>
+<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 &ldquo;AS IS&rdquo;, WITHOUT WARRANTY OF ANY KIND, 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 names of the X Consortium, Silicon
+Graphics Inc., Hewlett-Packard Company, and Digital Equipment Corporation
+shall not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization.
+</para>
+</legalnotice>
+
+</bookinfo>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="acknowledgement.xml"/>
+<!-- Document font conventions pg goes here -->
+<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="ch14.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="ch15.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="ch16.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="ch17.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="ch18.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="ch19.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="ch20.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="ch21.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="ch22.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="glossary.xml"/>
+</book>
diff --git a/specs/i18n/Makefile.am b/specs/i18n/Makefile.am
new file mode 100644 (file)
index 0000000..a69a51e
--- /dev/null
@@ -0,0 +1,24 @@
+#
+# Copyright (c) 2010, 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.
+#
+
+SUBDIRS=compose framework localedb trans
diff --git a/specs/i18n/compose/Makefile.am b/specs/i18n/compose/Makefile.am
new file mode 100644 (file)
index 0000000..9e3a26d
--- /dev/null
@@ -0,0 +1,20 @@
+if ENABLE_SPECS
+if HAVE_PERL
+
+# Main DocBook/XML files (DOCTYPE book)
+docbook = libX11-keys.xml
+
+# Included chapters, appendix, images
+chapters = $(locales:%=%.xml)
+
+# The location where the DocBook/XML generated formats are installed
+shelfdir = $(docdir)/i18n/compose
+
+# Generate DocBook/XML output formats with or without stylesheets
+# The XML source is generated and cleaned but not distributed
+include docbook-nl.am
+
+endif HAVE_PERL
+endif ENABLE_SPECS
+
+EXTRA_DIST =  compose-chart.pl
diff --git a/specs/i18n/compose/compose-chart.pl b/specs/i18n/compose/compose-chart.pl
new file mode 100755 (executable)
index 0000000..e2ac850
--- /dev/null
@@ -0,0 +1,388 @@
+#! /usr/bin/perl
+#
+# Copyright 2009, 2010, 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.
+#
+
+#
+# Make a DocBook chart showing compose combinations for a locale
+#
+# See perldoc at end (or run with --help or --man options) for details
+# of command-line options.
+#
+
+# Compose file grammar is defined in modules/im/ximcp/imLcPrs.c
+
+use strict;
+use warnings;
+use Getopt::Long;
+use Pod::Usage;
+
+my $error_count = 0;
+
+my $charset;
+my $locale_name;
+my $output_filename = '-';
+my $man = 0;
+my $help = 0;
+my $make_index = 0;
+
+GetOptions ('charset:s' => \$charset,
+           'locale=s' => \$locale_name,
+           'output=s' => \$output_filename,
+           'index' => \$make_index,
+           'help|?' => \$help,
+           'man' => \$man)
+    or pod2usage(2);
+pod2usage(1) if $help;
+pod2usage(-exitstatus => 0, -verbose => 2) if $man;
+
+if (!defined($charset) || ($charset eq "")) {
+  if (defined($locale_name)) {
+    my $guessed_charset = $locale_name;
+    $guessed_charset =~ s{^.*\.}{};
+    if ($guessed_charset =~ m{^(utf-8|gbk|gb18030)$}i) {
+      $charset = $1;
+    } elsif ($guessed_charset =~ m{iso8859-(\d+)}i) {
+      $charset = "iso-8859-$1";
+    } elsif ($guessed_charset =~ m{^microsoft-cp(125\d)$}) {
+      $charset = "windows-$1";
+    }
+  }
+  if (!defined($charset) || ($charset eq "")) {
+    $charset = "utf-8";
+  }
+}
+
+if ($make_index) {
+  # Print Docbook output
+  open my $OUTPUT, '>', $output_filename
+      or die "Could not create $output_filename: $!";
+
+  print $OUTPUT
+      join ("\n",
+           qq(<?xml version="1.0" encoding="$charset" ?>),
+           q(<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"),
+           q( "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">),
+           q(<article id="libX11-keys">),
+           q(  <articleinfo>),
+           q(    <title>Xlib Compose Key Charts</title>),
+           q(  </articleinfo>),
+           ( map { qq(  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="$_.xml">\
+    <xi:fallback><section><title>$_</title><para></para></section></xi:fallback>\
+  </xi:include>) }
+             @ARGV ),
+           q(</article>),
+           "\n"
+      );
+
+  close $OUTPUT or die "Couldn't write $output_filename: $!";
+
+  exit(0);
+}
+
+foreach my $a (@ARGV) {
+  $error_count += make_compose_chart($a);
+}
+
+exit($error_count);
+
+sub make_compose_chart {
+  my ($filename) = @_;
+  my $errors = 0;
+
+  my @compose_table = ();
+  my @included_files = ();
+
+  my $line = 0;
+  my $pre_file = ($filename =~ m{\.pre$}) ? 1 : 0;
+  my $in_c_comment = 0;
+  my $in_comment = 0;
+  my $keyseq_count = 0;
+
+  open my $COMPOSE, '<', $filename or die "Could not open $filename: $!";
+
+ COMPOSE_LINE:
+  while (my $cl = <$COMPOSE>) {
+    $line++;
+    chomp($cl);
+    my $original_line = $cl;
+
+    # Special handling for changes cpp makes to .pre files
+    if ($pre_file == 1) {
+      if ($in_c_comment) {             # Look for end of multi-line C comment
+       if ($cl =~ m{\*/(.*)$}) {
+         $cl = $1;
+         $in_c_comment = 0;
+       } else {
+         next;
+       }
+      }
+      $cl =~ s{/\*.\**/}{};            # Remove single line C comments
+      if ($cl =~ m{^(.*)/\*}) {                # Start of a multi-line C comment
+       $cl = $1;
+       $in_c_comment = 1;
+      }
+      $cl =~ s{^\s*XCOMM}{#};          # Translate pre-processing comments
+    }
+
+    chomp($cl);
+
+    if ($cl =~ m{^\s*#\s*(.*)$}) {     # Comment only lines
+      # Combine commment blocks
+      my $comment = $1;
+
+      if ($in_comment) {
+       my $prev_comment = pop @compose_table;
+       $comment = join(' ', $prev_comment->{-comment}, $comment);
+      } else {
+       $in_comment = 1;
+      }
+
+      push @compose_table, { -type => 'comment', -comment => $comment };
+      next COMPOSE_LINE;
+    }
+
+    $in_comment = 0;
+
+    if ($cl =~ m{^\s*$}) {             # Skip blank lines
+      next COMPOSE_LINE;
+    }
+    elsif ($cl =~ m{^(STATE\s+|END_STATE)}) {
+      # Sun extension to compose file syntax
+      next COMPOSE_LINE;
+    }
+    elsif ($cl =~ m{^([^:]+)\s*:\s*(.+)$}) {
+      my ($seq, $action) = ($1, $2);
+      $seq =~ s{\s+$}{};
+
+      my @keys = grep { $_ !~ m/^\s*$/ } split /[\s\<\>]+/, $seq;
+
+      push @compose_table, {
+       -type => 'keyseq',
+       -keys => [ @keys ],
+       -action => $action
+      };
+      $keyseq_count++;
+      next COMPOSE_LINE;
+    } elsif ($cl =~ m{^(STATE_TYPE:|\@StartDeadKeyMap|\@EndDeadKeyMap)}) {
+      # ignore
+      next COMPOSE_LINE;
+    } elsif ($cl =~ m{^include "(.*)"}) {
+      my $incpath = $1;
+      $incpath =~ s{^X11_LOCALEDATADIR/(.*)/Compose}{the $1 compose table};
+
+      push @included_files, $incpath;
+      next COMPOSE_LINE;
+    } else {
+      print STDERR ('Unrecognized pattern in ', $filename,
+                   ' on line #', $line, ":\n  ", $cl, "\n");
+    }
+  }
+  close $COMPOSE;
+
+  if ($errors > 0) {
+    return $errors;
+  }
+
+  # Print Docbook output
+  open my $OUTPUT, '>', $output_filename
+      or die "Could not create $output_filename: $!";
+
+  print $OUTPUT
+      join ("\n",
+           qq(<?xml version="1.0" encoding="$charset" ?>),
+           q(<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"),
+           q( "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">),
+           qq(<section id="$locale_name">),
+           qq(<title>Xlib Compose Keys for $locale_name</title>),
+           q(<para>Applications using Xlib input handling should recognize),
+           q( these compose key sequences in locales using the),
+           qq( $locale_name compose table.</para>),
+           "\n"
+      );
+
+  if (@included_files) {
+    print $OUTPUT
+       q(<para>This compose table includes the non-conflicting),
+       q( entries from: ),
+       join(',', @included_files),
+       q(.  Those entries are not shown here - see those charts for the),
+       q( included key sequences.</para>),
+       "\n";
+  }
+
+  my @pretable_comments = ();
+
+  if ($keyseq_count == 0) {
+    @pretable_comments = @compose_table;
+  } elsif ($compose_table[0]->{-type} eq 'comment') {
+    push @pretable_comments, shift @compose_table;
+  }
+
+  foreach my $comment_ref (@pretable_comments) {
+    print $OUTPUT
+       qq(<para>), xml_escape($comment_ref->{-comment}), qq(</para>\n);
+  }
+
+  if ($keyseq_count > 0) {
+    start_table($OUTPUT);
+    my $row_count = 0;
+
+    foreach my $cr (@compose_table) {
+
+      if ($row_count++ > 750) {
+       # Break tables every 750 rows to avoid overflowing
+       # xmlto/xsltproc limits on the largest tables
+       end_table($OUTPUT);
+       start_table($OUTPUT);
+       $row_count = 0;
+      }
+
+      if ($cr->{-type} eq 'comment') {
+       print $OUTPUT
+           qq(<row><entry namest='seq' nameend='action'>),
+           xml_escape($cr->{-comment}), qq(</entry></row>\n);
+      } elsif ($cr->{-type} eq 'keyseq') {
+       my $action = join(" ", xml_escape($cr->{-action}));
+       if ($action =~ m{^\s*"\\([0-7]+)"}) {
+         my $char = oct($1);
+         if ($char >= 32) {
+           $action =~ s{^\s*"\\[0-7]+"}{"&#$char;"};
+         }
+       }
+       $action =~ s{^\s*"(.+)"}{"$1"};
+
+       print $OUTPUT
+           qq(<row><entry>),
+           qq(<keycombo action='seq'>),
+           (map { qq(<keysym>$_</keysym>) } xml_escape(@{$cr->{-keys}})),
+           qq(</keycombo>),
+           qq(</entry><entry>),
+           $action,
+           qq(</entry></row>\n);
+      }
+    }
+
+    end_table($OUTPUT);
+  } else {
+    print $OUTPUT
+       qq(<para><emphasis>),
+       qq(This compose table defines no sequences of its own.),
+       qq(</emphasis></para>\n);
+  }
+  print $OUTPUT "</section>\n";
+
+  close $OUTPUT or die "Couldn't write $output_filename: $!";
+
+  return $errors;
+}
+
+sub xml_escape {
+  my @output;
+
+  foreach my $l (@_) {
+      $l =~ s{\&}{&amp;}g;
+      $l =~ s{\<}{&lt;}g;
+      $l =~ s{\>}{&gt;}g;
+      push @output, $l;
+  }
+  return @output;
+}
+
+sub start_table {
+  my ($OUTPUT) = @_;
+
+  print $OUTPUT
+      join("\n",
+          qq(<table><title>Compose Key Sequences for $locale_name</title>),
+          qq(<tgroup cols='2'>),
+          qq( <colspec colname='seq' /><colspec colname='action' />),
+          qq( <thead><row>),
+          qq(  <entry>Key Sequence</entry><entry>Action</entry>),
+          qq( </row></thead>),
+          qq( <tbody>\n),
+      );
+}
+
+sub end_table {
+  my ($OUTPUT) = @_;
+
+  print $OUTPUT "</tbody>\n</tgroup>\n</table>\n";
+}
+
+__END__
+
+=head1 NAME
+
+compose-chart - Make DocBook/XML charts of compose table entries
+
+=head1 SYNOPSIS
+
+compose-chart [options] [file ...]
+
+ Options:
+    --charset[=<cset>] character set to specify in XML doctype
+    --locale=<locale>  name of locale to display in chart
+    --output=<file>    filename to output chart to
+    --index            make index of charts instead of individual chart
+    --help             brief help message
+    --man              full documentation
+
+=head1 OPTIONS
+
+=over 8
+
+=item B<--charset>[=I<cset>]
+
+Specify a character set to list in the doctype declaration in the XML output.
+If not specified, attempts to guess from the locale name, else default to
+"utf-8".
+
+=item B<--locale>=I<locale>
+
+Specify the locale name to use in the chart titles and introductory text.
+
+=item B<--output>=I<file>
+
+Specify the output file to write the DocBook output to.
+
+=item B<--index>
+
+Generate an index of the listed locale charts instead of a chart for a
+specific locale.
+
+=item B<--help>
+
+Print a brief help message and exit.
+
+=item B<--man>
+
+Print the manual page and exit.
+
+=back
+
+=head1 DESCRIPTION
+
+This program will read the given compose table file(s) and generate
+DocBook/XML charts listing the available characters for end-user reference.
+
+=cut
diff --git a/specs/i18n/compose/docbook-nl.am b/specs/i18n/compose/docbook-nl.am
new file mode 100644 (file)
index 0000000..95860c2
--- /dev/null
@@ -0,0 +1,128 @@
+#
+# Generate output formats for a single DocBook/XML with/without chapters
+#
+# This version of docbook.am handles cases where XML source is generated
+# and the html to be produced must be in chunks, one per chapter.
+# The generated source must be cleaned, installed but not distributed
+#
+# 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 = $(chapters) $(docbook)
+
+# Generated DocBook/XML source files using a perl script
+%.xml: $(top_builddir)/nls/%/Compose
+       $(AM_V_GEN)$(PERL) $(srcdir)/compose-chart.pl           \
+        --locale="$(@:.xml=)" --output="$@" $<
+
+libX11-keys.xml: $(locales:%=%.xml)
+       $(AM_V_GEN)$(PERL) $(srcdir)/compose-chart.pl           \
+        --index --output="$@" $(locales)
+
+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-chunk.xsl
+XMLTO_TXT_STYLESHEET_FLAGS = -x $(STYLESHEET_SRCDIR)/xorg-xhtml.xsl
+XMLTO_HTML_CHUNKING_FLAGS =                            \
+       --stringparam root.filename="$(<:.xml=)"
+XMLTO_HTML_FLAGS =                                     \
+       $(XMLTO_SEARCHPATH_FLAGS)                       \
+       $(XMLTO_HTML_STYLESHEET_FLAGS)                  \
+       $(XMLTO_HTML_CHUNKING_FLAGS)                    \
+       $(XMLTO_HTML_OLINK_FLAGS)
+XMLTO_TXT_FLAGS =                                      \
+       $(XMLTO_SEARCHPATH_FLAGS)                       \
+       $(XMLTO_TXT_STYLESHEET_FLAGS)                   \
+       $(XMLTO_HTML_OLINK_FLAGS)
+
+shelf_DATA += $(docbook:.xml=.html) $(chapters:.xml=.html)
+%.html: %.xml  $(chapters)
+       $(AM_V_GEN)$(XMLTO) $(XMLTO_HTML_FLAGS) xhtml $<
+
+if HAVE_XMLTO_TEXT
+
+shelf_DATA += $(docbook:.xml=.txt)
+%.txt: %.xml $(chapters)
+       $(AM_V_GEN)$(XMLTO) $(XMLTO_TXT_FLAGS) txt $<
+endif HAVE_XMLTO_TEXT
+
+if HAVE_FOP
+XMLTO_FO_IMAGEPATH_FLAGS = --stringparam img.src.path=$(abs_builddir)/
+XMLTO_FO_STYLESHEET_FLAGS = -x $(STYLESHEET_SRCDIR)/xorg-fo.xsl
+XMLTO_PDF_OLINK_FLAGS = \
+       --stringparam target.database.document=$(XORG_SGML_PATH)/X11/dbs/masterdb.pdf.xml \
+       --stringparam current.docid="$(<:.xml=)"
+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"
+XSLT_FO_OLINK_FLAGS =                                  \
+       --stringparam olink.base.uri "$(@:.db=)"
+XSLT_HTML_CHUNKING_FLAGS =                             \
+       --stringparam root.filename "$(<:.xml=)"
+
+XSLT_HTML_FLAGS =                                      \
+       $(XSLT_SEARCHPATH_FLAGS)                        \
+       $(XSLT_HTML_CHUNKING_FLAGS)                     \
+       $(XSLT_OLINK_FLAGS)                             \
+       --nonet --xinclude                              \
+       $(STYLESHEET_SRCDIR)/xorg-chunk.xsl
+
+XSLT_PDF_FLAGS =                                       \
+       $(XSLT_SEARCHPATH_FLAGS)                        \
+       $(XSLT_OLINK_FLAGS)                             \
+       $(XSLT_FO_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/specs/i18n/framework/Makefile.am b/specs/i18n/framework/Makefile.am
new file mode 100644 (file)
index 0000000..af7ae1d
--- /dev/null
@@ -0,0 +1,16 @@
+
+if ENABLE_SPECS
+
+# Main DocBook/XML files (DOCTYPE book)
+docbook = framework.xml
+
+# Included chapters, appendix, images
+chapters = framework.svg
+
+# The location where the DocBook/XML files and their generated formats are installed
+shelfdir = $(docdir)/i18n/framework
+
+# Generate DocBook/XML output formats with or without stylesheets
+include $(top_srcdir)/docbook.am
+
+endif ENABLE_SPECS
diff --git a/specs/i18n/framework/framework.svg b/specs/i18n/framework/framework.svg
new file mode 100644 (file)
index 0000000..e097415
--- /dev/null
@@ -0,0 +1,703 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="540.32245"
+   height="530.98114"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.47 r22583"
+   sodipodi:docname="framework.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path3656"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective10" />
+    <inkscape:perspective
+       id="perspective2824"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2844"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2874"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2874-0"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2915"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective4106"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-8"
+       style="overflow:visible">
+      <path
+         id="path3656-9"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective4134"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-6"
+       style="overflow:visible">
+      <path
+         id="path3656-3"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective4162"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-2"
+       style="overflow:visible">
+      <path
+         id="path3656-1"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective4190"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-4"
+       style="overflow:visible">
+      <path
+         id="path3656-91"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective4218"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-3"
+       style="overflow:visible">
+      <path
+         id="path3656-30"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective4246"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-83"
+       style="overflow:visible">
+      <path
+         id="path3656-2"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective4274"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-35"
+       style="overflow:visible">
+      <path
+         id="path3656-5"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective4302"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-20"
+       style="overflow:visible">
+      <path
+         id="path3656-0"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <inkscape:perspective
+       id="perspective4332"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.5911958"
+     inkscape:cx="236.83428"
+     inkscape:cy="268.26412"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1280"
+     inkscape:window-height="752"
+     inkscape:window-x="-3"
+     inkscape:window-y="-3"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-78.35714,-45.862183)">
+    <rect
+       style="fill:none;stroke:#000000;stroke-opacity:1"
+       id="rect2830"
+       width="451.42856"
+       height="38.57143"
+       x="128.85715"
+       y="46.362183"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-opacity:1"
+       id="rect2832"
+       width="125.71429"
+       height="67.14286"
+       x="98.571426"
+       y="186.07646"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-opacity:1"
+       id="rect2834"
+       width="65.714287"
+       height="45.714287"
+       x="274.85715"
+       y="188.55154"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:1.02407026;stroke-opacity:1"
+       id="rect2858"
+       width="133.40337"
+       height="48.547359"
+       x="274.86917"
+       y="235.23137"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-opacity:1"
+       id="rect2860"
+       width="157.14285"
+       height="62.857143"
+       x="443.71429"
+       y="188.93361"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-opacity:1"
+       id="rect2862"
+       width="167.14285"
+       height="130"
+       x="78.85714"
+       y="387.79074"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-opacity:1"
+       id="rect2862-6"
+       width="167.14285"
+       height="130"
+       x="261.57141"
+       y="388.50504"
+       ry="0" />
+    <rect
+       style="fill:none;stroke:#000000;stroke-opacity:1"
+       id="rect2862-9"
+       width="167.14285"
+       height="130"
+       x="443.57141"
+       y="388.50504"
+       ry="0" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="303.85651"
+       y="72.885086"
+       id="text2897"><tspan
+         sodipodi:role="line"
+         id="tspan2899"
+         x="303.85651"
+         y="72.885086"
+         style="font-size:20px">Application</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="170.05533"
+       y="154.5576"
+       id="text2901"><tspan
+         sodipodi:role="line"
+         id="tspan2903"
+         x="170.05533"
+         y="154.5576"
+         style="font-size:16px;text-align:center;text-anchor:middle">&lt;&lt;ANSI/MSE API&gt;&gt;</tspan><tspan
+         sodipodi:role="line"
+         x="170.05533"
+         y="174.5576"
+         id="tspan2905"
+         style="font-size:16px;text-align:center;text-anchor:middle">(X Contrib)</tspan></text>
+    <rect
+       style="fill:none;stroke:#000000;stroke-opacity:1"
+       id="rect2834-6"
+       width="65.714287"
+       height="45.714287"
+       x="341.6012"
+       y="188.55154"
+       ry="0" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="344.00778"
+       y="155.16107"
+       id="text2929"><tspan
+         sodipodi:role="line"
+         id="tspan2931"
+         x="344.00778"
+         y="155.16107"
+         style="font-size:16px;text-align:center;text-anchor:middle">&lt;&lt;XLib API&gt;&gt;</tspan><tspan
+         sodipodi:role="line"
+         x="344.00778"
+         y="175.16107"
+         id="tspan2933"
+         style="font-size:16px;text-align:center;text-anchor:middle">(X Core)</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="524.94836"
+       y="155.33501"
+       id="text2935"><tspan
+         sodipodi:role="line"
+         id="tspan2937"
+         x="524.94836"
+         y="155.33501"
+         style="font-size:16px;text-align:center;text-anchor:middle">&lt;&lt;ANSI/MSE API&gt;&gt;</tspan><tspan
+         sodipodi:role="line"
+         x="524.94836"
+         y="175.33501"
+         id="tspan2939"
+         style="font-size:16px;text-align:center;text-anchor:middle">(X Contrib)</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="278.00778"
+       y="205.31915"
+       id="text2941"><tspan
+         sodipodi:role="line"
+         id="tspan2943"
+         x="278.00778"
+         y="205.31915"
+         style="font-size:16px">Input</tspan><tspan
+         sodipodi:role="line"
+         x="278.00778"
+         y="225.31915"
+         id="tspan2945"
+         style="font-size:16px">Method</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="343.88126"
+       y="205.31915"
+       id="text2947"><tspan
+         sodipodi:role="line"
+         id="tspan2949"
+         x="343.88126"
+         y="205.31915"
+         style="font-size:16px">Output</tspan><tspan
+         sodipodi:role="line"
+         x="343.88126"
+         y="225.31915"
+         id="tspan2951"
+         style="font-size:16px">Method</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="280.57693"
+       y="253.82504"
+       id="text2953"><tspan
+         sodipodi:role="line"
+         id="tspan2955"
+         x="280.57693"
+         y="253.82504"
+         style="font-size:14px">&lt;Locl. Serv. API&gt;</tspan><tspan
+         sodipodi:role="line"
+         x="280.57693"
+         y="271.32504"
+         id="tspan2957"
+         style="font-size:14px">X Locale Object</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="450.71121"
+       y="207.0899"
+       id="text2959"><tspan
+         sodipodi:role="line"
+         id="tspan2961"
+         x="450.71121"
+         y="207.0899"
+         style="font-size:16px">C Library</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="517.04321"
+       y="241.71439"
+       id="text2963"><tspan
+         sodipodi:role="line"
+         id="tspan2965"
+         x="517.04321"
+         y="241.71439"
+         style="font-size:16px">ANSI impl</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="104.89322"
+       y="419.56409"
+       id="text2967"><tspan
+         sodipodi:role="line"
+         id="tspan2969"
+         x="104.89322"
+         y="419.56409"
+         style="font-size:16px">XLC_XLOCALE</tspan><tspan
+         sodipodi:role="line"
+         x="104.89322"
+         y="439.56409"
+         id="tspan2971"
+         style="font-size:16px">- MB_CUR_MAX</tspan><tspan
+         sodipodi:role="line"
+         x="104.89322"
+         y="459.56409"
+         id="tspan2973"
+         style="font-size:16px">codeset info</tspan><tspan
+         sodipodi:role="line"
+         x="104.89322"
+         y="479.56409"
+         id="tspan2975"
+         style="font-size:16px">o char/charset</tspan><tspan
+         sodipodi:role="line"
+         x="104.89322"
+         y="499.56409"
+         id="tspan2977"
+         style="font-size:16px">o conv/charset</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="290.68759"
+       y="414.07794"
+       id="text2979"><tspan
+         sodipodi:role="line"
+         id="tspan2981"
+         x="290.68759"
+         y="414.07794"
+         style="font-size:16px">XLC_FONTSET</tspan><tspan
+         sodipodi:role="line"
+         x="290.68759"
+         y="434.07794"
+         id="tspan2983"
+         style="font-size:16px">- fontset info</tspan><tspan
+         sodipodi:role="line"
+         x="290.68759"
+         y="454.07794"
+         id="tspan2985"
+         style="font-size:16px">- charset info</tspan><tspan
+         sodipodi:role="line"
+         x="290.68759"
+         y="474.07794"
+         id="tspan2987"
+         style="font-size:16px">- font/charset</tspan><tspan
+         sodipodi:role="line"
+         x="290.68759"
+         y="494.07794"
+         id="tspan2989"
+         style="font-size:16px">- XLFD,GL/GR</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="469.39896"
+       y="416.07794"
+       id="text2991"><tspan
+         sodipodi:role="line"
+         id="tspan2993"
+         x="469.39896"
+         y="416.07794"
+         style="font-size:16px">localedef DB</tspan><tspan
+         sodipodi:role="line"
+         x="469.39896"
+         y="436.07794"
+         id="tspan2995"
+         style="font-size:16px">- MB_CUR_MAX</tspan><tspan
+         sodipodi:role="line"
+         x="469.39896"
+         y="456.07794"
+         id="tspan2997"
+         style="font-size:16px">- codset info</tspan><tspan
+         sodipodi:role="line"
+         x="469.39896"
+         y="476.07794"
+         id="tspan2999"
+         style="font-size:16px">o char/charset</tspan><tspan
+         sodipodi:role="line"
+         x="469.39896"
+         y="496.07794"
+         id="tspan3001"
+         style="font-size:16px">o conv/charset</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="106.83789"
+       y="204.34682"
+       id="text3026"><tspan
+         sodipodi:role="line"
+         id="tspan3028"
+         x="106.83789"
+         y="204.34682"
+         style="font-size:16px">Locale Library</tspan><tspan
+         sodipodi:role="line"
+         x="106.83789"
+         y="224.34682"
+         id="tspan3030"
+         style="font-size:16px" /></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="105.69164"
+       y="229.71439"
+       id="text3032"><tspan
+         sodipodi:role="line"
+         id="tspan3034"
+         x="105.69164"
+         y="229.71439"
+         style="font-size:16px">non-ANSI impl.</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 204.87737,342.20444 c 101.81022,0 101.81022,0 101.81022,0"
+       id="path4322" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 378.16996,341.36655 c 101.81022,0 101.81022,0 101.81022,0"
+       id="path4322-3" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 306.17376,342.94753 c 34.5652,-34.5652 33.93674,-33.93675 33.93674,-33.93675"
+       id="path4346" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 379.58874,342.20444 C 343.13816,305.75387 342.50971,305.12541 342.50971,305.12541"
+       id="path4348" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 81.699563,531.99881 c 16.339913,16.33991 16.339913,16.33991 16.339913,16.33991 312.972174,0 312.972174,0 312.972174,0"
+       id="path4350" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 411.01165,547.08181 426.7231,531.37035"
+       id="path4352" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 442.43456,533.25573 c 10.13348,17.55171 10.67774,18.49439 10.67774,18.49439 l 142.66605,0 0,-2.15448 13.82608,-13.82608"
+       id="path4354" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="170.25287"
+       y="574.73395"
+       id="text4356"><tspan
+         sodipodi:role="line"
+         id="tspan4358"
+         x="170.25287"
+         y="574.73395"
+         style="font-size:16px">XLocale Source (X Core)</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       x="443.34363"
+       y="572.22015"
+       id="text4360"><tspan
+         sodipodi:role="line"
+         id="tspan4362"
+         x="443.34363"
+         y="572.22015"
+         style="font-size:16px">System Locale Source</tspan></text>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-20)"
+       d="m 46.505905,206.69672 1.256917,131.97622"
+       id="path3948"
+       transform="translate(78.35714,45.862183)"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-20)"
+       d="m 482.65588,204.18289 0,135.74696"
+       id="path3950"
+       transform="translate(78.35714,45.862183)"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-end:url(#Arrow1Lend-20)"
+       d="m 110.60864,39.526842 0,43.992073"
+       id="path3952"
+       transform="translate(78.35714,45.862183)"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-end:url(#Arrow1Lend-20)"
+       d="m 218.70345,38.269926 0,43.992073"
+       id="path3954"
+       transform="translate(78.35714,45.862183)"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-end:url(#Arrow1Lend-20)"
+       d="m 290.34768,38.269926 0,43.992073"
+       id="path3956"
+       transform="translate(78.35714,45.862183)"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-20)"
+       d="m 400.95632,34.499177 0,46.505905"
+       id="path3958"
+       transform="translate(78.35714,45.862183)"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-20)"
+       d="m 124.43472,293.42395 -1.25692,45.24899"
+       id="path4960"
+       transform="translate(78.35714,45.862183)"
+       inkscape:connector-type="polyline" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-20)"
+       d="m 395.92865,292.16703 0,49.01974"
+       id="path4962"
+       inkscape:connector-type="polyline"
+       transform="translate(78.35714,45.862183)" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Lend-20);opacity:1"
+       d="m 258.92477,238.11963 1.25692,99.29639"
+       id="path4964"
+       inkscape:connector-type="polyline"
+       transform="translate(78.35714,45.862183)" />
+  </g>
+</svg>
diff --git a/specs/i18n/framework/framework.xml b/specs/i18n/framework/framework.xml
new file mode 100644 (file)
index 0000000..6324301
--- /dev/null
@@ -0,0 +1,1631 @@
+<?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="framework">
+
+<bookinfo>
+   <title>X11R6 Sample Implementation Frame Work</title>
+   <releaseinfo>X Version 11, Release &fullrelvers;</releaseinfo>
+   <authorgroup>
+      <othercredit>
+         <firstname>Katsuhisa</firstname><surname>Yano</surname>
+         <affiliation><orgname>TOSHIBA Corporation</orgname></affiliation>
+      </othercredit>
+      <othercredit>
+         <firstname>Yoshio</firstname><surname>Horiuchi</surname>
+         <affiliation><orgname>IBM Japan</orgname></affiliation>
+      </othercredit>
+   </authorgroup>
+   <copyright><year>1994</year>
+     <holder>TOSHIBA Corporation</holder>
+     <holder>IBM Corporation</holder>
+   </copyright>
+
+<legalnotice>
+
+<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 and this permission notice appear in all copies. TOSHIBA Corporation and
+IBM Corporation make no representations about the suitability for any purpose of the information in this document.
+This documentation is provided as is without express or implied warranty.
+</para>
+
+<para role="multiLicensing">Copyright © 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 &ldquo;AS IS&rdquo;, WITHOUT WARRANTY OF ANY KIND,
+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 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 X Consortium.
+</para>
+
+<para>X Window System is a trademark of The Open Group.</para>
+
+</legalnotice>
+</bookinfo>
+
+<chapter id='Framework'>
+<title>Framework</title>
+<sect1 id='Preface'>
+<title>Preface</title>
+<para>
+This document proposes to define the structures, methods and their
+signatures that are expected to be common to all locale dependent
+functions within the Xlib sample implementation.  The following
+illustration (Fig.1) <!-- xref --> is proposed to outline the separating of
+the components within the sample implementation.
+</para>
+
+<para>
+Preface drawing.
+</para>
+
+<mediaobject  id="framework_locale_service_api_proposal">
+  <imageobject>
+    <imagedata   width="540px" depth="530px" contentwidth="560px" contentdepth="550px" format="SVG"  fileref="framework.svg"/>
+  </imageobject>
+  <caption>Frame work of Locale Service API Proposal</caption>
+</mediaobject>
+
+<para>
+Generally speaking, the internationalized portion of Xlib (Locale
+Dependent X, LDX) consists of three objects;
+locale (LC) , input method (IM) and output method (OM).
+The LC provides a set of information that depends on user's language
+environment.  The IM manages text inputing, and the OM manages text
+drawing.  Both IM and OM highly depend on LC data.
+</para>
+
+<para>
+In X11R5, there are two sample implementations, Ximp and Xsi, for
+Xlib internationalization.  But in both implementations, IM and OM
+actually refer the private extension of LC.  It breaks coexistence
+of these two sample implementations.  For example, if a user creates
+a new OM for special purpose as a part of Ximp, it will not work with
+Xsi.
+</para>
+
+<para>
+As a solution of this problem, we propose to define the standard
+APIs between these three objects, and define the structure that are
+common to these objects.
+</para>
+</sect1>
+
+<sect1 id="Objective">
+<title>Objective</title>
+
+<itemizedlist>
+  <listitem>
+    <para>
+Explain the current X11R6 sample implementation
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Document the common set of locale dependent interfaces
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Provide more flexible pluggable layer
+    </para>
+  </listitem>
+</itemizedlist>
+</sect1>
+
+<sect1 id="Locale_Object_Binding_Functions">
+<title>Locale Object Binding Functions</title>
+<!-- .XS (SN Locale Object Binding Functions -->
+<!-- .XE  -->
+<para>
+This chapter describes functions related locale object binding for
+implementing the pluggable layer.
+</para>
+
+<para>
+A locale loader is an entry point for locale object, which
+instantiates XLCd object and binds locale methods with specified
+locale name. The behavior of loader is implementation dependent.
+And, what kind of loaders are available is also implementation
+dependent.
+</para>
+
+<para>
+<!-- .LP -->
+The loader is called in
+<function>_XOpenLC, </function>
+but caller of
+<xref linkend='_XOpenLC' xrefstyle='select: title'/>
+does not need to care about its inside.  For example, if the loader is
+implemented with dynamic load functions, and the dynamic module is
+expected to be unloaded when the corresponding XLCd is freed,
+close methods of XLCdMethods should handle unloading.
+</para>
+
+<para>
+<emphasis role="bold">Initializing a locale loader list</emphasis>
+</para>
+
+<para>void _XlcInitLoader</para>
+
+
+<para>
+The
+<function>_XlcInitLoader</function>
+function initializes the locale loader list with vendor specific
+manner.  Each loader is registered with calling
+<function>_XlcAddLoader.</function>
+The number of loaders and their order in the loader list is
+implementation dependent.
+</para>
+
+<para>
+<emphasis role="bold">Add a loader</emphasis>
+</para>
+
+<literallayout>
+typedef XLCd (*XLCdLoadProc)(<emphasis remap='I'>name</emphasis>);
+      char <emphasis remap='I'>*name</emphasis>;
+
+typedef int XlcPosition;
+
+#define   XlcHead
+#define   XlcTail
+</literallayout>
+
+<funcsynopsis id='_XlcAddLoader'>
+<funcprototype>
+  <funcdef>Bool <function> _XlcAddLoader</function></funcdef>
+  <paramdef>XLCdLoadProc<parameter> proc</parameter></paramdef>
+  <paramdef>XlcPosition<parameter> position</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+The
+<xref linkend='_XlcAddLoader' xrefstyle='select: title'/>
+function registers the specified locale loader "<emphasis remap='I'>proc</emphasis>" to the
+internal loader list.  The position specifies that the loader
+"<emphasis remap='I'>proc</emphasis>" should be placed in the top of the loader list(XlcHead)
+or last(XlcTail).
+</para>
+
+<para>
+The object loader is called from the top of the loader list in order,
+when calling time.
+</para>
+
+<para>
+<function>Remove a loader</function>
+</para>
+
+<funcsynopsis id='_XlcRemoveLoader'>
+<funcprototype>
+  <funcdef>void <function> _XlcRemoveLoader</function></funcdef>
+  <paramdef>XLCdLoadProc<parameter> proc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+The
+<xref linkend='_XlcRemoveLoader' xrefstyle='select: title'/>
+function removes the locale loader specified by "<emphasis remap='I'>proc</emphasis>" from the
+loader list.
+</para>
+
+<para>
+Current implementation provides following locale loaders;
+</para>
+
+<literallayout>
+<function>_XlcDefaultLoader</function>
+<function>_XlcGenericLoader</function>
+<function>_XlcEucLoader</function>
+<function>_XlcSjisLoader</function>
+<function>_XlcUtfLoader</function>
+<function>_XaixOsDynamicLoad</function>
+</literallayout>
+
+</sect1>
+
+<sect1 id="Locale_Method_Interface">
+<title>Locale Method Interface</title>
+
+<para>
+This chapter describes the locale method API, which is a set of
+accessible functions from both IM and OM parts.
+The locale method API provides the functionalities;  obtaining locale
+dependent information, handling charset, converting text, etc.
+</para>
+
+<para>
+As a result of using these APIs instead of accessing vender private
+extension of the locale object, we can keep locale, IM and OM
+independently each other.
+</para>
+
+</sect1>
+
+<sect1 id="Locale_Method_Functions">
+<title>Locale Method Functions</title>
+<para>
+<function>Open a Locale Method</function>
+</para>
+
+<funcsynopsis id='_XOpenLC'>
+<funcprototype>
+  <funcdef>XLCd <function> _XOpenLC</function></funcdef>
+  <paramdef>char<parameter> *name</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+The
+<xref linkend='_XOpenLC' xrefstyle='select: title'/>
+function opens a locale method which corresponds to the
+specified locale name.
+<xref linkend='_XOpenLC' xrefstyle='select: title'/>
+calls a locale object loader, which is registered via
+<function>_XlcAddLoader into the internal loader list.  If the called loader </function>
+is valid and successfully opens a locale,
+<xref linkend='_XOpenLC' xrefstyle='select: title'/>
+returns the XLCd.  If the loader is invalid or failed to open a locale,
+<xref linkend='_XOpenLC' xrefstyle='select: title'/>
+calls the next loader.  If all registered loaders cannot open a locale,
+<xref linkend='_XOpenLC' xrefstyle='select: title'/>
+returns NULL.
+</para>
+
+<para>XLCd _XlcCurrentLC</para>
+
+<para>
+The
+<function>_XlcCurrentLC</function>
+function returns an XLCd that are bound to current locale.
+</para>
+
+<para>
+<emphasis role="bold">Close a Locale Method</emphasis>
+</para>
+
+<funcsynopsis id='_XCloseLC'>
+<funcprototype>
+  <funcdef>void <function> _XCloseLC</function></funcdef>
+  <paramdef>XLCd<parameter> lcd</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+<!-- .LP -->
+The
+<xref linkend='_XCloseLC' xrefstyle='select: title'/>
+function close a locale method the specified lcd.
+</para>
+
+<para>
+<emphasis role="bold">Obtain Locale Method values</emphasis>
+</para>
+
+<funcsynopsis id='_XGetLCValues'>
+<funcprototype>
+  <funcdef>char *<function>_XGetLCValues</function></funcdef>
+  <paramdef>XLCd<parameter> lcd</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+The
+<xref linkend='_XGetLCValues' xrefstyle='select: title'/>
+function returns NULL if no error occurred; otherwise, it returns the
+name of the first argument that could not be obtained.
+The following values are defined as standard arguments. Other values
+are implementation dependent.
+</para>
+
+<informaltable frame="topbot">
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth="3.0*"/>
+  <colspec colname='c2' colwidth="1.0*"/>
+  <colspec colname='c3' colwidth="3.0*"/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Name</entry>
+      <entry>Type</entry>
+      <entry>Description</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>XlcNCodeset</entry>
+      <entry>char*</entry>
+      <entry>codeset part of locale name</entry>
+    </row>
+    <row>
+      <entry>XlcNDefaultString</entry>
+      <entry>char*</entry>
+      <entry>XDefaultString()</entry>
+    </row>
+    <row>
+      <entry>XlcNEncodingName</entry>
+      <entry>char*</entry>
+      <entry>encoding name</entry>
+    </row>
+    <row>
+      <entry>XlcNLanguage</entry>
+      <entry>char*</entry>
+      <entry>language part of locale name</entry>
+    </row>
+    <row>
+      <entry>XlcNMbCurMax</entry>
+      <entry>int</entry>
+      <entry>ANSI C MB_CUR_MAX</entry>
+    </row>
+    <row>
+      <entry>XlcNStateDependentEncoding</entry>
+      <entry>Bool</entry>
+      <entry>is state-dependent encoding or not</entry>
+    </row>
+    <row>
+      <entry>XlcNTerritory</entry>
+      <entry>char*</entry>
+      <entry>territory part of locale name</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+</sect1>
+
+<sect1 id="Charset_functions">
+<title>Charset functions</title>
+<para>
+The XlcCharSet is an identifier which represents a subset of characters
+(character set) in the locale object.
+</para>
+
+<literallayout class="monospaced">
+typedef enum {
+      XlcUnknown, XlcC0, XlcGL, XlcC1, XlcGR, XlcGLGR, XlcOther
+} XlcSide;
+
+typedef struct _XlcCharSetRec *XlcCharSet;
+
+typedef struct {
+      char *name;
+      XPointer value;
+} XlcArg, *XlcArgList;
+
+typedef char* (*XlcGetCSValuesProc)(<emphasis remap='I'>charset</emphasis>, <emphasis remap='I'>args</emphasis>, <emphasis remap='I'>num_args</emphasis>);
+      XlcCharSet <emphasis remap='I'>charset</emphasis>;
+      XlcArgList <emphasis remap='I'>args</emphasis>;
+      int <emphasis remap='I'>num_args</emphasis>;
+
+typedef struct _XlcCharSetRec {
+      char *name;
+      XrmQuark xrm_name;
+      char *encoding_name;
+      XrmQuark xrm_encoding_name;
+      XlcSide side;
+      int char_size;
+      int set_size;
+      char *ct_sequence;
+      XlcGetCSValuesProc get_values;
+} XlcCharSetRec;
+</literallayout>
+
+<para>
+<emphasis role="bold">Get an XlcCharSet</emphasis>
+</para>
+
+<funcsynopsis id='_XlcGetCharSet'>
+<funcprototype>
+  <funcdef>XlcCharSet <function> _XlcGetCharSet</function></funcdef>
+  <paramdef>char<parameter> *name</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+The
+<xref linkend='_XlcGetCharSet' xrefstyle='select: title'/>
+function gets an XlcCharSet which corresponds to the charset name
+specified by "<emphasis remap='I'>name</emphasis>".
+<xref linkend='_XlcGetCharSet' xrefstyle='select: title'/>
+returns NULL, if no XlcCharSet bound to specified "<emphasis remap='I'>name</emphasis>".
+</para>
+
+<para>
+The following character sets are pre-registered.
+</para>
+
+<informaltable frame="topbot">
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth="1.0*"/>
+  <colspec colname='c2' colwidth="2.0*"/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Name</entry>
+      <entry>Description</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>ISO8859-1:GL</entry>
+      <entry>7-bit ASCII graphics (ANSI X3.4-1968),</entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry>Left half of ISO 8859 sets</entry>
+    </row>
+    <row>
+      <entry>JISX0201.1976-0:GL</entry>
+      <entry>Left half of JIS X0201-1976 (reaffirmed 1984),</entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry>8-Bit Alphanumeric-Katakana Code</entry>
+    </row>
+    <row>
+      <entry>ISO8859-1:GR</entry>
+      <entry>Right half of ISO 8859-1, Latin alphabet No. 1</entry>
+    </row>
+    <row>
+      <entry>ISO8859-2:GR</entry>
+      <entry>Right half of ISO 8859-2, Latin alphabet No. 2</entry>
+    </row>
+    <row>
+      <entry>ISO8859-3:GR</entry>
+      <entry>Right half of ISO 8859-3, Latin alphabet No. 3</entry>
+    </row>
+    <row>
+      <entry>ISO8859-4:GR</entry>
+      <entry>Right half of ISO 8859-4, Latin alphabet No. 4</entry>
+    </row>
+    <row>
+      <entry>ISO8859-7:GR</entry>
+      <entry>Right half of ISO 8859-7, Latin/Greek alphabet</entry>
+    </row>
+    <row>
+      <entry>ISO8859-6:GR</entry>
+      <entry>Right half of ISO 8859-6, Latin/Arabic alphabet</entry>
+    </row>
+    <row>
+      <entry>ISO8859-8:GR</entry>
+      <entry>Right half of ISO 8859-8, Latin/Hebrew alphabet</entry>
+    </row>
+    <row>
+      <entry>ISO8859-5:GR</entry>
+      <entry>Right half of ISO 8859-5, Latin/Cyrillic alphabet</entry>
+    </row>
+    <row>
+      <entry>ISO8859-9:GR</entry>
+      <entry>Right half of ISO 8859-9, Latin alphabet No. 5</entry>
+    </row>
+    <row>
+      <entry>JISX0201.1976-0:GR</entry>
+      <entry>Right half of JIS X0201-1976 (reaffirmed 1984),</entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry>8-Bit Alphanumeric-Katakana Code</entry>
+    </row>
+    <row>
+      <entry>GB2312.1980-0:GL</entry>
+      <entry>GB2312-1980, China (PRC) Hanzi defined as GL</entry>
+    </row>
+    <row>
+      <entry>GB2312.1980-0:GR</entry>
+      <entry>GB2312-1980, China (PRC) Hanzi defined as GR</entry>
+    </row>
+    <row>
+      <entry>JISX0208.1983-0:GL</entry>
+      <entry>JIS X0208-1983, Japanese Graphic Character Set</entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry>defined as GL</entry>
+    </row>
+    <row>
+      <entry>JISX0208.1983-0:GR</entry>
+      <entry>JIS X0208-1983, Japanese Graphic Character Set</entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry>defined as GR</entry>
+    </row>
+    <row>
+      <entry>KSC5601.1987-0:GL</entry>
+      <entry>KS C5601-1987, Korean Graphic Character Set</entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry>defined as GL</entry>
+    </row>
+    <row>
+      <entry>KSC5601.1987-0:GR</entry>
+      <entry>KS C5601-1987, Korean Graphic Character Set</entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry>defined as GR</entry>
+    </row>
+    <row>
+      <entry>JISX0212.1990-0:GL</entry>
+      <entry>JIS X0212-1990, Japanese Graphic Character Set</entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry>defined as GL</entry>
+    </row>
+    <row>
+      <entry>JISX0212.1990-0:GR</entry>
+      <entry>JIS X0212-1990, Japanese Graphic Character Set</entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry>defined as GR</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+<emphasis role="bold">Add an XlcCharSet</emphasis>
+</para>
+
+<funcsynopsis id='_XlcAddCharSet'>
+<funcprototype>
+  <funcdef>Bool <function> _XlcAddCharSet</function></funcdef>
+  <paramdef>XlcCharSet<parameter> charset</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+The
+<xref linkend='_XlcAddCharSet' xrefstyle='select: title'/>
+function registers XlcCharSet specified by "<emphasis remap='I'>charset</emphasis>".
+</para>
+
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<function>Obtain Character Set values</function>
+</para>
+
+<funcsynopsis id='_XlcGetCSValues'>
+<funcprototype>
+  <funcdef>char * <function> _XlcGetCSValues</function></funcdef>
+  <paramdef>XlcCharSet<parameter> charset</parameter></paramdef>
+  <paramdef><parameter> ...</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+The
+<xref linkend='_XlcGetCSValues' xrefstyle='select: title'/>
+function returns NULL if no error occurred;
+otherwise, it returns the name of the first argument that could not
+be obtained.  The following values are defined as standard arguments.
+Other values are implementation dependent.
+</para>
+
+<informaltable frame="topbot">
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth="2.0*"/>
+  <colspec colname='c2' colwidth="1.0*"/>
+  <colspec colname='c3' colwidth="3.0*"/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Name</entry>
+      <entry>Type</entry>
+      <entry>Description</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>XlcNName</entry>
+      <entry>char*</entry>
+      <entry>charset name</entry>
+    </row>
+    <row>
+      <entry>XlcNEncodingName</entry>
+      <entry>char*</entry>
+      <entry>XLFD CharSet Registry and Encoding</entry>
+    </row>
+    <row>
+      <entry>XlcNSide</entry>
+      <entry>XlcSide</entry>
+      <entry>charset side (GL, GR, ...)</entry>
+    </row>
+    <row>
+      <entry>XlcNCharSize</entry>
+      <entry>int</entry>
+      <entry>number of octets per character</entry>
+    </row>
+    <row>
+      <entry>XlcNSetSize</entry>
+      <entry>int</entry>
+      <entry>number of character sets</entry>
+    </row>
+    <row>
+      <entry>XlcNControlSequence</entry>
+      <entry>char*</entry>
+      <entry>control sequence of Compound Text</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+</sect1>
+
+<sect1 id="Converter_Functions">
+<title>Converter Functions</title>
+<para>
+We provide a set of the common converter APIs, that are independent
+from both of source and destination text type.
+</para>
+
+<literallayout class="monospaced">
+typedef struct _XlcConvRec *XlcConv;
+
+typedef void (*XlcCloseConverterProc)(<emphasis remap='I'>conv</emphasis>);
+      XlcConv <emphasis remap='I'>conv</emphasis>;
+
+typedef int (*XlcConvertProc)(<emphasis remap='I'>conv</emphasis>, <emphasis remap='I'>from</emphasis>, <emphasis remap='I'>from_left</emphasis>, <emphasis remap='I'>to</emphasis>, <emphasis remap='I'>to_left</emphasis>, <emphasis remap='I'>args</emphasis>, <emphasis remap='I'>num_args</emphasis>);
+      XlcConv <emphasis remap='I'>conv</emphasis>;
+      XPointer <emphasis remap='I'>*from</emphasis>;
+      int <emphasis remap='I'>*from_left</emphasis>;
+      XPointer <emphasis remap='I'>*to</emphasis>;
+      int <emphasis remap='I'>*to_left</emphasis>;
+      XPointer <emphasis remap='I'>*args</emphasis>;
+      int <emphasis remap='I'>num_args</emphasis>;
+
+typedef void (*XlcResetConverterProc)(<emphasis remap='I'>conv</emphasis>);
+      XlcConv <emphasis remap='I'>conv</emphasis>;
+
+typedef struct _XlcConvMethodsRec {
+      XlcCloseConverterProc close;
+      XlcConvertProc convert;
+      XlcResetConverterProc reset;
+} XlcConvMethodsRec, *XlcConvMethods;
+
+typedef struct _XlcConvRec {
+    XlcConvMethods methods;
+    XPointer state;
+} XlcConvRec;
+</literallayout>
+
+<para>
+<function>Open a converter</function>
+</para>
+
+<funcsynopsis id='_XlcOpenConverter'>
+<funcprototype>
+  <funcdef>XlcConv <function> _XlcOpenConverter</function></funcdef>
+  <paramdef>XLCd<parameter> from_lcd</parameter></paramdef>
+  <paramdef>char<parameter> *from_type</parameter></paramdef>
+  <paramdef>XLCd<parameter> to_lcd</parameter></paramdef>
+  <paramdef>char<parameter> *to_type</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+<xref linkend='_XlcOpenConverter' xrefstyle='select: title'/>
+function opens the converter which converts a text from specified
+"<emphasis remap='I'>from_type</emphasis>" to specified "<emphasis remap='I'>to_type</emphasis>" encoding.  If the
+function cannot find proper converter or cannot open a corresponding
+converter, it returns NULL.  Otherwise, it returns the conversion
+descriptor.
+</para>
+
+<para>
+The following types are pre-defined. Other types are implementation
+dependent.
+</para>
+
+<informaltable frame="topbot">
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='4' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth="2.0*"/>
+  <colspec colname='c2' colwidth="1.0*"/>
+  <colspec colname='c3' colwidth="2.0*"/>
+  <colspec colname='c4' colwidth="3.0*"/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Name</entry>
+      <entry>Type</entry>
+      <entry>Description</entry>
+      <entry>Arguments</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>XlcNMultiByte</entry>
+      <entry>char *</entry>
+      <entry>multibyte</entry>
+      <entry>-</entry>
+    </row>
+    <row>
+      <entry>XlcNWideChar</entry>
+      <entry>wchar_t *</entry>
+      <entry>wide character</entry>
+      <entry>-</entry>
+    </row>
+    <row>
+      <entry>XlcNCompoundText</entry>
+      <entry>char *</entry>
+      <entry>COMPOUND_TEXT</entry>
+      <entry>-</entry>
+    </row>
+    <row>
+      <entry>XlcNString</entry>
+      <entry>char *</entry>
+      <entry>STRING</entry>
+      <entry>-</entry>
+    </row>
+    <row>
+      <entry>XlcNCharSet</entry>
+      <entry>char *</entry>
+      <entry>per charset</entry>
+      <entry>XlcCharSet</entry>
+    </row>
+    <row>
+      <entry>XlcNChar</entry>
+      <entry>char *</entry>
+      <entry>per character</entry>
+      <entry>XlcCharSet</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+<emphasis role="bold">Close a converter</emphasis>
+</para>
+
+<funcsynopsis id='_XlcCloseConverter'>
+<funcprototype>
+  <funcdef>void <function> _XlcCloseConverter</function></funcdef>
+  <paramdef>XlcConv<parameter> conv</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+The
+<xref linkend='_XlcCloseConverter' xrefstyle='select: title'/>
+function closes the specified converter "<emphasis remap='I'>conv</emphasis>".
+</para>
+
+<para>
+<emphasis role="bold">Code conversion</emphasis>
+</para>
+
+<funcsynopsis id='_XlcConvert'>
+<funcprototype>
+  <funcdef>int <function> _XlcConvert</function></funcdef>
+  <paramdef>XlcConv<parameter> conv</parameter></paramdef>
+  <paramdef>XPointer<parameter> *from</parameter></paramdef>
+  <paramdef>int<parameter> *from_left</parameter></paramdef>
+  <paramdef>XPointer<parameter> *to</parameter></paramdef>
+  <paramdef>int<parameter> *to_left</parameter></paramdef>
+  <paramdef>XPointer<parameter> *args</parameter></paramdef>
+  <paramdef>int<parameter> num_args</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+The
+<xref linkend='_XlcConvert' xrefstyle='select: title'/>
+function converts a sequence of characters from one type, in the array
+specified by "<emphasis remap='I'>from</emphasis>", into a sequence of corresponding characters
+in another type, in the array specified by "<emphasis remap='I'>to</emphasis>".  The types are
+those specified in the
+<function>_XlcOpenConverter() </function>
+call that returned the conversion descriptor, "<emphasis remap='I'>conv</emphasis>".
+The arguments "<emphasis remap='I'>from</emphasis>", "<emphasis remap='I'>from_left</emphasis>", "<emphasis remap='I'>to</emphasis>" and
+"<emphasis remap='I'>to_left</emphasis>" have the same specification of XPG4 iconv function.
+</para>
+
+<para>
+For state-dependent encodings, the conversion descriptor "<emphasis remap='I'>conv</emphasis>"
+is placed into its initial shift state by a call for which "<emphasis remap='I'>from</emphasis>"
+is a NULL pointer, or for which "<emphasis remap='I'>from</emphasis>" points to a null pointer.
+</para>
+
+<para>
+The following 2 converters prepared by locale returns appropriate
+charset (XlcCharSet) in an area pointed by args[0].
+</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="2.0*"/>
+  <thead>
+    <row rowsep='1'>
+      <entry>From</entry>
+      <entry>To</entry>
+      <entry>Description</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>XlcNMultiByte</entry>
+      <entry>XlcNCharSet</entry>
+      <entry>Segmentation (Decomposing)</entry>
+    </row>
+    <row>
+      <entry>XlcNWideChar</entry>
+      <entry>XlcNCharSet</entry>
+      <entry>Segmentation (Decomposing)</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+The conversion, from XlcNMultiByte/XlcNWideChar to XlcNCharSet,
+extracts a segment which has same charset encoding characters.
+More than one segment cannot be converted in a call.
+</para>
+
+<para>
+<emphasis role="bold">Reset a converter</emphasis>
+</para>
+
+<funcsynopsis id='_XlcResetConverter'>
+<funcprototype>
+  <funcdef>void <function> _XlcResetConverter</function></funcdef>
+  <paramdef>XlcConv<parameter> conv</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+The
+<xref linkend='_XlcResetConverter' xrefstyle='select: title'/>
+function reset the specified converter "<emphasis remap='I'>conv</emphasis>".
+</para>
+
+<para>
+<emphasis role="bold">Register a converter</emphasis>
+</para>
+
+<literallayout class="monospaced">
+typedef XlcConv (*XlcOpenConverterProc)(<emphasis remap='I'>from_lcd</emphasis>, <emphasis remap='I'>from_type</emphasis>, <emphasis remap='I'>to_lcd</emphasis>, <emphasis remap='I'>to_type</emphasis>);
+      XLCd <emphasis remap='I'>from_lcd</emphasis>;
+      char <emphasis remap='I'>*from_type</emphasis>;
+      XLCd <emphasis remap='I'>to_lcd</emphasis>;
+      char <emphasis remap='I'>*to_type</emphasis>;
+</literallayout>
+
+<funcsynopsis id='_XlcSetConverter'>
+<funcprototype>
+  <funcdef>Bool <function> _XlcSetConverter</function></funcdef>
+  <paramdef>XLCd<parameter> from_lcd</parameter></paramdef>
+  <paramdef>char<parameter> *from</parameter></paramdef>
+  <paramdef>XLCd<parameter> to_lcd</parameter></paramdef>
+  <paramdef>char<parameter> *to</parameter></paramdef>
+  <paramdef>XlcOpenConverterProc<parameter> converter</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+The <function>XlcSetConverter</function> function registers a converter which convert
+from "<emphasis remap='I'>from_type</emphasis>" to "<emphasis remap='I'>to_type</emphasis>" into the converter list
+(in the specified XLCd).
+</para>
+</sect1>
+
+<sect1 id="X_Locale_Database_functions">
+<title>X Locale Database functions</title>
+<para>
+X Locale Database contains the subset of user's environment that
+depends on language.  The following APIs are provided for accessing
+X Locale Database and other locale relative files.
+</para>
+
+<para>
+For more detail about  X Locale Database, please refer
+X Locale Database Definition document.
+</para>
+
+<para>
+<emphasis role="bold">Get a resource from database</emphasis>
+</para>
+
+<funcsynopsis id='_XlcGetResource'>
+<funcprototype>
+  <funcdef>void <function> _XlcGetResource</function></funcdef>
+  <paramdef>XLCd<parameter> lcd</parameter></paramdef>
+  <paramdef>char<parameter> *category</parameter></paramdef>
+  <paramdef>char<parameter> *class</parameter></paramdef>
+  <paramdef>char<parameter> ***value</parameter></paramdef>
+  <paramdef>int<parameter> *count</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+The
+<xref linkend='_XlcGetResource' xrefstyle='select: title'/>
+function obtains a locale dependent data which is associated with the
+locale of specified "<emphasis remap='I'>lcd</emphasis>".
+The locale data is provided by system locale or by X Locale Database
+file, and what kind of data is available is implementation dependent.
+</para>
+
+<para>
+The specified "<emphasis remap='I'>category</emphasis>" and "<emphasis remap='I'>class</emphasis>" are used for
+finding out the objective locale data.
+</para>
+
+<para>
+The returned  value is returned in value argument in string list form,
+and the returned count shows the number of strings in the value.
+</para>
+
+<para>
+The returned value is owned by locale method, and should not be modified
+or freed by caller.
+</para>
+
+<para>
+<emphasis role="bold">Get a locale relative file name</emphasis>
+</para>
+
+<funcsynopsis id='_XlcFileName'>
+<funcprototype>
+  <funcdef>char *<function>_XlcFileName</function></funcdef>
+  <paramdef>XLCd<parameter> lcd</parameter></paramdef>
+  <paramdef>char<parameter> *category</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+The
+<xref linkend='_XlcFileName' xrefstyle='select: title'/>
+functions returns a file name which is bound to the specified "<emphasis remap='I'>lcd</emphasis>"
+and "<emphasis remap='I'>category</emphasis>", as a null-terminated string.  If no file name can
+be found, or there is no readable file for the found file name,
+<xref linkend='_XlcFileName' xrefstyle='select: title'/>
+returns NULL.  The returned file name should be freed by caller.
+</para>
+
+<para>
+The rule for searching a file name is implementation dependent.
+In current implementation,
+<xref linkend='_XlcFileName' xrefstyle='select: title'/>
+uses "{category}.dir" file as mapping table, which has pairs of
+strings, a full locale name and a corresponding file name.
+</para>
+
+</sect1>
+
+<sect1 id="Utility_Functions">
+<title>Utility Functions</title>
+
+<para>
+<emphasis role="bold">Compare Latin-1 strings</emphasis>
+</para>
+
+<funcsynopsis id='_XlcCompareISOLatin1'>
+<funcprototype>
+  <funcdef>int <function> _XlcCompareISOLatin1</function></funcdef>
+  <paramdef>char*str1,<parameter> *str2</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<funcsynopsis id='_XlcNCompareISOLatin1'>
+<funcprototype>
+  <funcdef>int <function> _XlcNCompareISOLatin1</function></funcdef>
+  <paramdef>char*str1,<parameter> *str2</parameter></paramdef>
+  <paramdef>int<parameter> len</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+The
+<function>_XlcCompareIsoLatin1 </function>
+function to compares two ISO-8859-1 strings.  Bytes representing ASCII lower
+case letters are converted to upper case before making the comparison.
+The value returned is an integer less than, equal to, or greater than
+zero, depending on whether "<emphasis remap='I'>str1</emphasis>" is lexicographicly less than,
+equal to, or greater than "<emphasis remap='I'>str2</emphasis>".
+</para>
+
+<para>
+The
+<function>_XlcNCompareIsoLatin1</function>
+function is identical to
+<function>_XlcCompareISOLatin1,</function>
+except that at most "<emphasis remap='I'>len</emphasis>" bytes are compared.
+</para>
+
+<para>
+<emphasis role="bold">Resource Utility</emphasis>
+</para>
+
+<funcsynopsis id='XlcNumber'>
+<funcprototype>
+  <funcdef>int <function> XlcNumber</function></funcdef>
+  <paramdef>ArrayType<parameter> array</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+Similar to XtNumber.
+</para>
+
+<funcsynopsis id='_XlcCopyFromArg'>
+<funcprototype>
+  <funcdef>void <function> _XlcCopyFromArg</function></funcdef>
+  <paramdef>char<parameter> *src</parameter></paramdef>
+  <paramdef>char<parameter> *dst</parameter></paramdef>
+  <paramdef>int<parameter> size</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<funcsynopsis id='_XlcCopyToArg'>
+<funcprototype>
+  <funcdef>void <function> _XlcCopyToArg</function></funcdef>
+  <paramdef>char<parameter> *src</parameter></paramdef>
+  <paramdef>char<parameter> **dst</parameter></paramdef>
+  <paramdef>int<parameter> size</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+Similar to
+<function>_XtCopyFromArg </function>
+and
+<function>_XtCopyToArg.</function>
+</para>
+
+<funcsynopsis id='_XlcCountVaList'>
+<funcprototype>
+  <funcdef>void <function> _XlcCountVaList</function></funcdef>
+  <paramdef>va_list<parameter> var</parameter></paramdef>
+  <paramdef>int<parameter> *count_ret</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+Similar to
+<function>_XtCountVaList.</function>
+</para>
+
+<funcsynopsis id='_XlcVaToArgList'>
+<funcprototype>
+  <funcdef>void <function> _XlcVaToArgList</function></funcdef>
+  <paramdef>va_list<parameter> var</parameter></paramdef>
+  <paramdef>int<parameter> count</parameter></paramdef>
+  <paramdef>XlcArgList<parameter> *args_ret</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+Similar to
+<function>_XtVaToArgList.</function>
+</para>
+
+<literallayout class="monospaced">
+typedef struct _XlcResource {
+      char *name;
+      XrmQuark xrm_name;
+      int size;
+      int offset;
+      unsigned long mask;
+} XlcResource, *XlcResourceList;
+</literallayout>
+
+<literallayout class="monospaced">
+#define    XlcCreateMask   (1L&lt;&lt;0)
+#define    XlcDefaultMask  (1L&lt;&lt;1)
+#define    XlcGetMask      (1L&lt;&lt;2)
+#define    XlcSetMask      (1L&lt;&lt;3)
+#define    XlcIgnoreMask   (1L&lt;&lt;4)
+</literallayout>
+
+<funcsynopsis id='_XlcCompileResourceList'>
+<funcprototype>
+  <funcdef>void <function> _XlcCompileResourceList</function></funcdef>
+  <paramdef>XlcResourceList<parameter> resources</parameter></paramdef>
+  <paramdef>int<parameter> num_resources</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+Similar to
+<function>_XtCompileResourceList.</function>
+</para>
+
+<funcsynopsis id='_XlcGetValues'>
+<funcprototype>
+  <funcdef>char * <function> _XlcGetValues</function></funcdef>
+  <paramdef>XPointer<parameter> base</parameter></paramdef>
+  <paramdef>XlcResourceList<parameter> resources</parameter></paramdef>
+  <paramdef>int<parameter> num_resources</parameter></paramdef>
+  <paramdef>XlcArgList<parameter> args</parameter></paramdef>
+  <paramdef>int<parameter> num_args</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> mask</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+Similar to XtGetSubvalues.
+</para>
+
+<funcsynopsis id='_XlcSetValues'>
+<funcprototype>
+  <funcdef>char * <function> _XlcSetValues</function></funcdef>
+  <paramdef>XPointer<parameter> base</parameter></paramdef>
+  <paramdef>XlcResourceList<parameter> resources</parameter></paramdef>
+  <paramdef>int<parameter> num_resources</parameter></paramdef>
+  <paramdef>XlcArgList<parameter> args</parameter></paramdef>
+  <paramdef>int<parameter> num_args</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> mask</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+Similar to XtSetSubvalues.
+</para>
+
+<para>
+<emphasis role="bold">ANSI C Compatible Functions</emphasis>
+</para>
+
+<para>
+The following are ANSI C/MSE Compatible Functions for non-ANSI C environment.
+</para>
+
+<funcsynopsis id='_Xmblen'>
+<funcprototype>
+  <funcdef>int <function> _Xmblen</function></funcdef>
+  <paramdef>char<parameter> *str</parameter></paramdef>
+  <paramdef>int<parameter> len</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+The
+<xref linkend='_Xmblen' xrefstyle='select: title'/>
+function returns the number of characters pointed to by "<emphasis remap='I'>str</emphasis>".
+Only "<emphasis remap='I'>len</emphasis>" bytes in "<emphasis remap='I'>str</emphasis>" are used in determining the
+character count returned.  "<emphasis remap='I'>Str</emphasis>" may point at characters from
+any valid codeset in the current locale.
+</para>
+
+<para>
+The call
+<xref linkend='_Xmblen' xrefstyle='select: title'/>
+is equivalent to
+_Xmbtowc(_Xmbtowc((<emphasis remap='I'>wchar_t*</emphasis>)NULL, <emphasis remap='I'>str</emphasis>, <emphasis remap='I'>len</emphasis>))
+</para>
+
+<funcsynopsis id='_Xmbtowc'>
+<funcprototype>
+  <funcdef>int <function> _Xmbtowc</function></funcdef>
+  <paramdef>wchar_t<parameter> *wstr</parameter></paramdef>
+  <paramdef>char<parameter> *str</parameter></paramdef>
+  <paramdef>int<parameter> len</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+The
+<xref linkend='_Xmbtowc' xrefstyle='select: title'/>
+function converts the character(s) pointed to by "<emphasis remap='I'>str</emphasis>"
+to their wide character representation(s) pointed to by "<emphasis remap='I'>wstr</emphasis>".
+"<emphasis remap='I'>Len</emphasis>" is the number of bytes in "<emphasis remap='I'>str</emphasis>" to be converted.
+The return value is the number of characters converted.
+</para>
+
+<para>
+The call
+<xref linkend='_Xmbtowc' xrefstyle='select: title'/>
+is equivalent to
+_Xlcmbtowc((XLCd)NULL, <emphasis remap='I'>wstr</emphasis>, <emphasis remap='I'>str</emphasis>, <emphasis remap='I'>len</emphasis>)
+</para>
+
+<funcsynopsis id='_Xlcmbtowc'>
+<funcprototype>
+  <funcdef>int <function> _Xlcmbtowc</function></funcdef>
+  <paramdef>XLCd<parameter> lcd</parameter></paramdef>
+  <paramdef>wchar_t<parameter> *wstr</parameter></paramdef>
+  <paramdef>char<parameter> *str</parameter></paramdef>
+  <paramdef>int<parameter> len</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+The
+<xref linkend='_Xlcmbtowc' xrefstyle='select: title'/>
+function is identical to
+<function>_Xmbtowc, </function>
+except that it requires the "<emphasis remap='I'>lcd</emphasis>" argument.  If "<emphasis remap='I'>lcd</emphasis>"
+is (XLCd) NULL,
+<function>_Xlcmbtowc, </function>
+calls
+<function>_XlcCurrentLC </function>
+to determine the current locale.
+</para>
+
+<funcsynopsis id='_Xwctomb'>
+<funcprototype>
+  <funcdef>int <function> _Xwctomb</function></funcdef>
+  <paramdef>char<parameter> *str</parameter></paramdef>
+  <paramdef>wchar_t<parameter> wc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+The
+<xref linkend='_Xwctomb' xrefstyle='select: title'/>
+function converts a single wide character pointed to by "<emphasis remap='I'>wc</emphasis>" to
+its multibyte representation pointed to by "<emphasis remap='I'>str</emphasis>".
+On success, the return value is 1.
+</para>
+
+<para>
+The call
+<xref linkend='_Xwctomb' xrefstyle='select: title'/>
+is equivalent to
+_Xlcwctomb((XLCd)NULL, <emphasis remap='I'>str</emphasis>, <emphasis remap='I'>wstr</emphasis>)
+</para>
+
+<funcsynopsis id='_Xlcwctomb'>
+<funcprototype>
+  <funcdef>int <function> _Xlcwctomb</function></funcdef>
+  <paramdef>XLCd<parameter> lcd</parameter></paramdef>
+  <paramdef>char<parameter> *str</parameter></paramdef>
+  <paramdef>wchar_t<parameter> wc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+The
+<xref linkend='_Xlcwctomb' xrefstyle='select: title'/>
+function is identical to _Xwctomb, except that it requires the
+"<emphasis remap='I'>lcd</emphasis>" argument.  If "<emphasis remap='I'>lcd</emphasis>" is (XLCd) NULL,
+<function>_Xlcwctomb, </function>
+calls
+<function>_XlcCurrentLC </function>
+to determine the current locale.
+</para>
+
+<funcsynopsis id='_Xmbstowcs'>
+<funcprototype>
+  <funcdef>int <function> _Xmbstowcs</function></funcdef>
+  <paramdef>wchar_t<parameter> *wstr</parameter></paramdef>
+  <paramdef>char<parameter> *str</parameter></paramdef>
+  <paramdef>int<parameter> len</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+The
+<xref linkend='_Xmbstowcs' xrefstyle='select: title'/>
+function converts the NULL-terminated string pointed to by "<emphasis remap='I'>str</emphasis>"
+to its wide character string representation pointed to by "<emphasis remap='I'>wstr</emphasis>".
+"<emphasis remap='I'>Len</emphasis>" is the number of characters in "<emphasis remap='I'>str</emphasis>" to be converted.
+</para>
+
+<para>
+The call
+<xref linkend='_Xmbstowcs' xrefstyle='select: title'/>
+is equivalent to
+_Xlcmbstowcs((XLCd)NULL, <emphasis remap='I'>wstr</emphasis>, <emphasis remap='I'>str</emphasis>, <emphasis remap='I'>len</emphasis>)
+</para>
+
+<funcsynopsis id='_Xlcmbstowcs'>
+<funcprototype>
+  <funcdef>int <function> _Xlcmbstowcs</function></funcdef>
+  <paramdef>XLCd<parameter> lcd</parameter></paramdef>
+  <paramdef>wchar_t<parameter> *wstr</parameter></paramdef>
+  <paramdef>char<parameter> *str</parameter></paramdef>
+  <paramdef>int<parameter> len</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+The
+<xref linkend='_Xlcmbstowcs' xrefstyle='select: title'/>
+function is identical to _Xmbstowcs, except that it requires the
+"<emphasis remap='I'>lcd</emphasis>" argument.  If "<emphasis remap='I'>lcd</emphasis>" is (XLCd) NULL,
+<function>_Xlcmbstowcs, </function>
+calls
+<function>_XlcCurrentLC</function>
+to determine the current locale.
+</para>
+
+<funcsynopsis id='_Xwcstombs'>
+<funcprototype>
+  <funcdef>int <function> _Xwcstombs</function></funcdef>
+  <paramdef>char<parameter> *str</parameter></paramdef>
+  <paramdef>wchar_t<parameter> *wstr</parameter></paramdef>
+  <paramdef>int<parameter> len</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+The
+<xref linkend='_Xwcstombs' xrefstyle='select: title'/>
+function converts the (wchar_t) NULL terminated wide character string
+pointed to by "<emphasis remap='I'>wstr</emphasis>" to the NULL terminated multibyte string
+pointed to by "<emphasis remap='I'>str</emphasis>".
+</para>
+
+<para>
+The call
+<xref linkend='_Xwcstombs' xrefstyle='select: title'/>
+is equivalent to
+_Xlcwcstombs((XLCd)NULL, <emphasis remap='I'>str</emphasis>, <emphasis remap='I'>wstr</emphasis>, <emphasis remap='I'>len</emphasis>)
+</para>
+
+<funcsynopsis id='_Xlcwcstombs'>
+<funcprototype>
+  <funcdef>int <function> _Xlcwcstombs</function></funcdef>
+  <paramdef>XLCd<parameter> lcd</parameter></paramdef>
+  <paramdef>char<parameter> *str</parameter></paramdef>
+  <paramdef>wchar_t<parameter> *wstr</parameter></paramdef>
+  <paramdef>int<parameter> len</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+The
+<xref linkend='_Xlcwcstombs' xrefstyle='select: title'/>
+function is identical to _Xwcstombs, except that it requires the
+"<emphasis remap='I'>lcd</emphasis>" argument.  If "<emphasis remap='I'>lcd</emphasis>" is (XLCd) NULL,
+<function>_Xlcwcstombs, </function>
+calls
+<function>_XlcCurrentLC </function>
+to determine the current locale.
+</para>
+
+<funcsynopsis id='_Xwcslen'>
+<funcprototype>
+  <funcdef>int <function> _Xwcslen</function></funcdef>
+  <paramdef>wchar_t<parameter> *wstr</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+The
+<xref linkend='_Xwcslen' xrefstyle='select: title'/>
+function returns the count of wide characters in the (wchar_t) NULL
+terminated wide character string pointed to by "<emphasis remap='I'>wstr</emphasis>".
+</para>
+
+<funcsynopsis id='_Xwcscpy'>
+<funcprototype>
+  <funcdef>wchar_t *<function> _Xwcscpy</function></funcdef>
+  <paramdef>wchar_t<parameter> *wstr1</parameter></paramdef>
+  <paramdef>wchar_t<parameter> *wstr2</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<funcsynopsis id='_Xwcsncpy'>
+<funcprototype>
+  <funcdef>wchar_t * <function> _Xwcsncpy</function></funcdef>
+  <paramdef>wchar_t<parameter> *wstr1</parameter></paramdef>
+  <paramdef>wchar_t<parameter> *wstr2</parameter></paramdef>
+  <paramdef>int<parameter> len</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+The
+<xref linkend='_Xwcscpy' xrefstyle='select: title'/>
+function copies the (wchar_t) NULL terminated wide character string
+pointed to by "<emphasis remap='I'>wstr2</emphasis>" to the object pointed at by "<emphasis remap='I'>wstr1</emphasis>".
+"<emphasis remap='I'>Wstr1</emphasis>" is (wchar_t) NULL terminated.  The return value is a
+pointer to "<emphasis remap='I'>wstr1</emphasis>".
+</para>
+
+<para>
+The
+<xref linkend='_Xwcsncpy' xrefstyle='select: title'/>
+function is identical to
+<function>_Xwcscpy, </function>
+except that it copies "<emphasis remap='I'>len</emphasis>" wide characters from the object
+pointed to by "<emphasis remap='I'>wstr2</emphasis>" to the object pointed to "<emphasis remap='I'>wstr1</emphasis>".
+</para>
+
+<funcsynopsis id='_Xwcscmp'>
+<funcprototype>
+  <funcdef>int <function> _Xwcscmp</function></funcdef>
+  <paramdef>wchar_t*wstr1,<parameter> *wstr2</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<funcsynopsis id='_Xwcsncmp'>
+<funcprototype>
+  <funcdef>int <function> _Xwcsncmp</function></funcdef>
+  <paramdef>wchar_t*wstr1,<parameter> *wstr2</parameter></paramdef>
+  <paramdef>int<parameter> len</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<para>
+The
+<xref linkend='_Xwcscmp' xrefstyle='select: title'/>
+function  compares two (wchar_t) NULL terminated wide character strings.
+The value returned is an integer less than, equal to, or greater than zero,
+depending on whether "<emphasis remap='I'>wstr1</emphasis>" is lexicographicly less then, equal to,
+or greater than "<emphasis remap='I'>str2</emphasis>".
+</para>
+
+<para>
+The
+<xref linkend='_Xwcsncmp' xrefstyle='select: title'/>
+function is identical to
+<function>_XlcCompareISOLatin1, </function>
+except that at most "<emphasis remap='I'>len</emphasis>" wide characters are compared.
+</para>
+
+
+<!-- .sp -->
+<!-- .\" .LP -->
+<!-- .\" <function>Locale Method Internal Functions</function> -->
+<!-- .\" .LP -->
+<!-- .\" .FD 0 -->
+<!-- .\" XlcCharSet _XlcCreateDefaultCharSet(<emphasis remap='I'>name</emphasis>, <emphasis remap='I'>ct_sequence</emphasis>) -->
+<!-- .\" .br -->
+<!-- .\"       char <emphasis remap='I'>*name</emphasis>; -->
+<!-- .\" .br -->
+<!-- .\"       char <emphasis remap='I'>*ct_sequence</emphasis>; -->
+<!-- .\" .FN -->
+<!-- .\" .FD 0 -->
+<!-- .\" Bool _XlcParseCharSet(<emphasis remap='I'>charset</emphasis>) -->
+<!-- .\" .br -->
+<!-- .\"       XlcCharSet <emphasis remap='I'>charset</emphasis>; -->
+<!-- .\" .FN -->
+<!-- .\" .FD 0 -->
+<!-- .\" void _XlcGetLocaleDataBase(<emphasis remap='I'>lcd</emphasis>, <emphasis remap='I'>category</emphasis>, <emphasis remap='I'>name</emphasis>, <emphasis remap='I'>value</emphasis>, <emphasis remap='I'>count</emphasis>) -->
+<!-- .\" .br -->
+<!-- .\"       XLCd <emphasis remap='I'>lcd</emphasis>; -->
+<!-- .\" .br -->
+<!-- .\"       char <emphasis remap='I'>*category</emphasis>; -->
+<!-- .\" .br -->
+<!-- .\"       char <emphasis remap='I'>*name</emphasis>; -->
+<!-- .\" .br -->
+<!-- .\"       char <emphasis remap='I'>***value</emphasis>; -->
+<!-- .\" .br -->
+<!-- .\"       int <emphasis remap='I'>*count</emphasis>; -->
+<!-- .\" .FN -->
+<!-- .\" .FD 0 -->
+<!-- .\" void _XlcDestroyLocaleDataBase(<emphasis remap='I'>lcd</emphasis>) -->
+<!-- .\" .br -->
+<!-- .\"       XLCd <emphasis remap='I'>lcd</emphasis>; -->
+<!-- .\" .FN -->
+<!-- .\" .FD 0 -->
+<!-- .\" XPointer _XlcCreateLocaleDataBase(<emphasis remap='I'>lcd</emphasis>) -->
+<!-- .\" .br -->
+<!-- .\"       XLCd <emphasis remap='I'>lcd</emphasis>; -->
+<!-- .\" .FN -->
+<!-- .\" .LP -->
+<!-- .\" .sp -->
+<!-- .\" <function>Obtain an locale database path</function> -->
+<!-- .\" .LP -->
+<!-- .\" .FD 0 -->
+<!-- .\" int _XlcResolveI18NPath(<emphasis remap='I'>dir</emphasis>) -->
+<!-- .\" .br -->
+<!-- .\"       char <emphasis remap='I'>*dir</emphasis>; -->
+<!-- .\" .FN -->
+<!-- .\" .LP -->
+<!-- .\" The  -->
+<!-- .\" .PN _XlcResolveI18NPath  -->
+<!-- .\" function returns path name list that is related to X Locale Database. -->
+<!-- .\" The obtained path is stored into the array which is pointed by -->
+<!-- .\" specified "<emphasis remap='I'>dir</emphasis>".  The path consists of directory paths which  -->
+<!-- .\" are separated with colon. -->
+<!-- .\" If the environment variable XLOCALEDIR is specified, the path -->
+<!-- .\" contains its contents. -->
+<!-- .\" .LP -->
+<!-- .\" The default path of X Locale Database is implementation dependent. -->
+<!-- .\" In current implementation, it's determined in build time. -->
+<!-- .\" .LP -->
+<!-- .\" .PN _XlcResolveI18NPath  -->
+<!-- .\" does not check overflow of the array to which the "<emphasis remap='I'>dir</emphasis>"  -->
+<!-- .\" parameter points.  Caller should provide enough buffer to store this  -->
+<!-- .\" string. -->
+<!-- .\" .LP -->
+<!-- .\" .sp -->
+<!-- .\" <function>Obtain a full locale name</function> -->
+<!-- .\" .LP -->
+<!-- .\" .FD 0 -->
+<!-- .\" int _XlcResolveLocaleName(<emphasis remap='I'>lc_name</emphasis>, <emphasis remap='I'>full_name</emphasis>, <emphasis remap='I'>language</emphasis>, <emphasis remap='I'>territory</emphasis>, <emphasis remap='I'>codeset</emphasis>) -->
+<!-- .\" .br -->
+<!-- .\"       char <emphasis remap='I'>*lc_name</emphasis>; -->
+<!-- .\" .br -->
+<!-- .\"       char <emphasis remap='I'>*full_name</emphasis>; -->
+<!-- .\" .br -->
+<!-- .\"       char <emphasis remap='I'>*language</emphasis>; -->
+<!-- .\" .br -->
+<!-- .\"       char <emphasis remap='I'>*territory</emphasis>; -->
+<!-- .\" .br -->
+<!-- .\"       char <emphasis remap='I'>*codeset</emphasis>; -->
+<!-- .\" .FN -->
+<!-- .\" .LP -->
+<!-- .\" The  -->
+<!-- .\" .PN _XlcResolveLocaleName  -->
+<!-- .\" function returns a full locale name. -->
+<!-- .\" The obtained full locale name is stored into the array which is -->
+<!-- .\" pointed by specified "<emphasis remap='I'>full_name</emphasis>". -->
+<!-- .\" The language, territory and codeset part of the full locale name -->
+<!-- .\" are copied to the return arguments, "<emphasis remap='I'>language</emphasis>",  -->
+<!-- .\" "<emphasis remap='I'>territory</emphasis>" and "<emphasis remap='I'>codeset</emphasis>", respectively. -->
+<!-- .\" NULL can be specified for these arguments. -->
+<!-- .\" .LP -->
+<!-- .\" The rule for mapping from locale name to full locale name is -->
+<!-- .\" implementation dependent. -->
+<!-- .\" .LP -->
+<!-- .\" .PN _XlcResolveLocaleName  -->
+<!-- .\" does not check overflow of the array to which -->
+<!-- .\" "<emphasis remap='I'>full_name</emphasis>", "<emphasis remap='I'>language</emphasis>", "<emphasis remap='I'>territory</emphasis>" and  -->
+<!-- .\" "<emphasis remap='I'>codeset</emphasis>" parameter point. -->
+<!-- .\" Caller should provide enough buffer to store those string. -->
+<!-- .\" .LP -->
+<!-- .\" In current implementation,  -->
+<!-- .\" .PN _XlcResolveLocaleName  -->
+<!-- .\" uses locale.alias file as mapping table, which has pairs of strings,  -->
+<!-- .\" a locale name and a full locale name. -->
+<!-- .\" .LP -->
+<!-- .\" .FD 0 -->
+<!-- .\" int _XlcResolveDBName(<emphasis remap='I'>lc_name</emphasis>, <emphasis remap='I'>file_name</emphasis>) -->
+<!-- .\" .br -->
+<!-- .\"       char <emphasis remap='I'>*lc_name</emphasis>; -->
+<!-- .\" .br -->
+<!-- .\"       char <emphasis remap='I'>*file_name</emphasis>; -->
+<!-- .\" .FN -->
+<!-- .\" .FD 0  -->
+<!-- .\" XLCd _XlcCreateLC(<emphasis remap='I'>name</emphasis>, <emphasis remap='I'>methods</emphasis>) -->
+<!-- .\" .br -->
+<!-- .\"       char <emphasis remap='I'>*name</emphasis>; -->
+<!-- .\" .br -->
+<!-- .\"       XLCdMethods <emphasis remap='I'>methods</emphasis>; -->
+<!-- .\" .FN -->
+<!-- .\" .FD 0 -->
+<!-- .\" void _XlcDestroyLC(<emphasis remap='I'>lcd</emphasis>) -->
+<!-- .\" .br -->
+<!-- .\"       XLCd <emphasis remap='I'>lcd</emphasis>; -->
+<!-- .\" .FN -->
+<!-- .\" .LP -->
+<!-- .\"  -->
+
+</sect1>
+</chapter>
+</book>
diff --git a/specs/i18n/localedb/Makefile.am b/specs/i18n/localedb/Makefile.am
new file mode 100644 (file)
index 0000000..68a917c
--- /dev/null
@@ -0,0 +1,13 @@
+
+if ENABLE_SPECS
+
+# Main DocBook/XML files (DOCTYPE book)
+docbook = localedb.xml
+
+# The location where the DocBook/XML files and their generated formats are installed
+shelfdir = $(docdir)/i18n/localedb
+
+# Generate DocBook/XML output formats with or without stylesheets
+include $(top_srcdir)/docbook.am
+
+endif ENABLE_SPECS
diff --git a/specs/i18n/localedb/localedb.xml b/specs/i18n/localedb/localedb.xml
new file mode 100644 (file)
index 0000000..ed90007
--- /dev/null
@@ -0,0 +1,786 @@
+<?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="localedb">
+
+<bookinfo>
+   <title>X Locale Database Specification</title>
+   <releaseinfo>X Version 11, Release &fullrelvers;</releaseinfo>
+   <authorgroup>
+      <author>
+         <firstname>Yoshio</firstname><surname>Horiuchi</surname>
+         <affiliation><orgname>IBM Japan</orgname></affiliation>
+      </author>
+   </authorgroup>
+   <copyright><year>1994</year><holder>IBM Corporation</holder></copyright>
+
+<legalnotice>
+<para>
+License 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 IBM not be used in advertising
+or publicity pertaining to distribution of the software without specific, written
+prior permission.
+</para>
+<para>
+IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS, AND NONINFRINGEMENT OF THIRD PARTY RIGHTS,
+IN NO EVENT SHALL IBM 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.
+</para>
+</legalnotice>
+
+<legalnotice>
+<para role="multiLicensing">Copyright © 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 &ldquo;Software&rdquo;), 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 &ldquo;AS IS&rdquo;, WITHOUT WARRANTY OF ANY KIND,
+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>
+
+<para>X Window System is a trademark of The Open Group.</para>
+
+</legalnotice>
+</bookinfo>
+
+<chapter id='LocaleDB'>
+<title>LocaleDB</title>
+
+<sect1 id="General">
+<title>General</title>
+<para>
+An X Locale Database contains the subset of a user's environment that
+depends on language, in X Window System.  It is made up from one or more
+categories.  Each category consists of some classes and sub-classes.
+</para>
+
+<para>
+It is provided as a plain ASCII text file, so a user can change its
+contents easily.  It allows a user to customize the behavior of
+internationalized portion of Xlib without changing Xlib itself.
+</para>
+
+<para>
+This document describes;
+</para>
+
+<itemizedlist>
+  <listitem>
+    <para>
+Database Format Definition
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Contents of Database in sample implementation
+<!-- .RE -->
+    </para>
+  </listitem>
+</itemizedlist>
+
+<para>
+Since it is hard to define the set of required information for all
+platforms, only the flexible database format is defined.
+The available entries in database are implementation dependent.
+</para>
+
+</sect1>
+<sect1 id="Database_Format_Definition">
+<title>Database Format Definition</title>
+<para>
+The X Locale Database contains one or more category definitions.
+This section describes the format of each category definition.
+</para>
+
+<para>
+The category definition consists of one or more class definitions.
+Each class definition has a pair of class name and class value, or
+has several subclasses which are enclosed by the left brace ({) and
+the right brace (}).
+</para>
+
+<para>
+Comments can be placed by using the number sign character (#).
+Putting the number sign character on the top of the line indicates
+that the entire line is comment.  Also, putting any whitespace character
+followed by the number sign character indicates that a part of the line
+(from the number sign to the end of the line) is comment.
+A line can be continued by placing backslash (\) character as the
+last character on the line;  this continuation character will be
+discarded from the input.  Comment lines cannot be continued on
+a subsequent line using an escaped new line character.
+</para>
+
+<para>
+X Locale Database only accepts XPCS, the X Portable Character Set.
+The reserved symbols are;  the quotation mark("), the number sign (#),
+the semicolon(;), the backslash(\), the left brace({) and
+the right brace(}).
+</para>
+
+<para>
+The format of category definition is;
+</para>
+
+<informaltable frame="none">
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='3.0*'/>
+  <colspec colname='c2' colwidth='1.0*'/>
+  <colspec colname='c3' colwidth='6.0*'/>
+  <tbody>
+    <row>
+      <entry>CategoryDefinition</entry>
+      <entry>::=</entry>
+      <entry>CategoryHeader CategorySpec CategoryTrailer</entry>
+    </row>
+    <row>
+      <entry>CategoryHeader</entry>
+      <entry>::=</entry>
+      <entry>CategoryName NL</entry>
+    </row>
+    <row>
+      <entry>CategorySpec</entry>
+      <entry>::=</entry>
+      <entry>{ ClassSpec }</entry>
+    </row>
+    <row>
+      <entry>CategoryTrailer</entry>
+      <entry>::=</entry>
+      <entry>"END" Delimiter CategoryName NL</entry>
+    </row>
+    <row>
+      <entry>CategoryName</entry>
+      <entry>::=</entry>
+      <entry>String</entry>
+    </row>
+    <row>
+      <entry>ClassSpec</entry>
+      <entry>::=</entry>
+      <entry>ClassName Delimiter ClassValue NL</entry>
+    </row>
+    <row>
+      <entry>ClassName</entry>
+      <entry>::=</entry>
+      <entry>String</entry>
+    </row>
+    <row>
+      <entry>ClassValue</entry>
+      <entry>::=</entry>
+      <entry>ValueList | "{" NL { ClassSpec } "}"</entry>
+    </row>
+    <row>
+      <entry>ValueList</entry>
+      <entry>::=</entry>
+      <entry>Value | Value ";" ValueList</entry>
+    </row>
+    <row>
+      <entry>Value</entry>
+      <entry>::=</entry>
+      <entry>ValuePiece | ValuePiece Value</entry>
+    </row>
+    <row>
+      <entry>ValuePiece</entry>
+      <entry>::=</entry>
+      <entry>String | QuotedString | NumericString</entry>
+    </row>
+    <row>
+      <entry>String</entry>
+      <entry>::=</entry>
+      <entry>Char { Char }</entry>
+    </row>
+    <row>
+      <entry>QuotedString</entry>
+      <entry>::=</entry>
+      <entry>""" QuotedChar { QuotedChar } """</entry>
+    </row>
+    <row>
+      <entry>NumericString</entry>
+      <entry>::=</entry>
+      <entry>"\\o" OctDigit { OctDigit }</entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry>|</entry>
+      <entry>"\\d" DecDigit { DecDigit }</entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry>|</entry>
+      <entry>"\\x" HexDigit { HexDigit }</entry>
+    </row>
+    <row>
+      <entry>Char</entry>
+      <entry>::=</entry>
+      <entry>&lt;XPCS except NL, Space or unescaped reserved symbols&gt;</entry>
+    </row>
+    <row>
+      <entry>QuotedChar</entry>
+      <entry>::=</entry>
+      <entry>&lt;XPCS except unescaped """&gt;</entry>
+    </row>
+    <row>
+      <entry>OctDigit</entry>
+      <entry>::=</entry>
+      <entry>&lt;character in the range of "0" - "7"&gt;</entry>
+    </row>
+    <row>
+      <entry>DecDigit</entry>
+      <entry>::=</entry>
+      <entry>&lt;character in the range of "0" - "9"&gt;</entry>
+    </row>
+    <row>
+      <entry>HexDigit</entry>
+      <entry>::=</entry>
+      <entry>&lt;character in the range of "0" - "9", "a" - "f", "A" - "F"&gt;</entry>
+    </row>
+    <row>
+      <entry>Delimiter</entry>
+      <entry>::=</entry>
+      <entry>Space { Space }</entry>
+    </row>
+    <row>
+      <entry>Space</entry>
+      <entry>::=</entry>
+      <entry>&lt;space&gt; | &lt;horizontal tab&gt;</entry>
+    </row>
+    <row>
+      <entry>NL</entry>
+      <entry>::=</entry>
+      <entry>&lt;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>
+The backslash, which is not the top character of the NumericString, is
+recognized as an escape character, so that the next one character is
+treated as a literal character.  For example, the two-character
+sequence, ""\"""(the backslash followed by the quotation mark) is
+recognized and replaced with a quotation mark character.
+Any whitespace character, that is not the Delimiter, unquoted and
+unescaped, is ignored.
+</para>
+
+</sect1>
+<sect1 id='Contents_of_Database'>
+<title>Contents of Database</title>
+<para>
+The available categories and classes depend on implementation, because
+different platform will require different information set.
+For example, some platform have system locale but some platform don't.
+Furthermore, there might be a difference in functionality even if the
+platform has system locale.
+</para>
+
+<para>
+In current sample implementation, categories listed below are available.
+</para>
+
+<informaltable frame="none">
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='1' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <tbody>
+    <row>
+      <entry>XLC_FONTSET:XFontSet relative information</entry>
+    </row>
+    <row>
+      <entry>XLC_XLOCALE:Character classification and conversion information</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+</sect1>
+<sect1 id="XLC_FONTSET_Category">
+<title>XLC_FONTSET Category</title>
+<para>
+The XLC_FONTSET category defines the XFontSet relative information.
+It contains the CHARSET_REGISTRY-CHARSET_ENCODING name and character
+mapping side (GL, GR, etc), and is used in Output Method (OM).
+</para>
+
+<informaltable frame="topbot">
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+  <thead>
+  <colspec colname='c1' colwidth='3.0*'/>
+  <colspec colname='c2' colwidth='1.0*'/>
+  <colspec colname='c3' colwidth='3.0*'/>
+    <row rowsep='1'>
+      <entry>class</entry>
+      <entry>super class</entry>
+      <entry>description</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>fsN</entry>
+      <entry></entry>
+      <entry>Nth fontset (N=0,1,2, ...)</entry>
+    </row>
+    <row>
+      <entry>charset</entry>
+      <entry>fsN</entry>
+      <entry>list of encoding name</entry>
+    </row>
+    <row>
+      <entry>font</entry>
+      <entry>fsN</entry>
+      <entry>list of font encoding name</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<variablelist>
+  <varlistentry>
+    <term>fsN</term>
+    <listitem>
+      <para>
+Includes an encoding information for Nth charset, where N is
+the index number (0,1,2,...).  If there are 4 charsets available
+in current locale, 4 fontsets, fs0, fs1, fs2 and fs3, should be
+defined.
+This class has two subclasses, 'charset' and 'font'.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>charset</term>
+    <listitem>
+      <para>
+Specifies an encoding information to be used internally in Xlib
+for this fontset.  The format of value is;
+      </para>
+<informaltable frame="none">
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='3.0*'/>
+  <colspec colname='c2' colwidth='1.0*'/>
+  <colspec colname='c3' colwidth='4.0*'/>
+  <tbody>
+    <row>
+      <entry>EncodingInfo</entry>
+      <entry>::=</entry>
+      <entry>EncodingName [ ":" EncodingSide ]</entry>
+    </row>
+    <row>
+      <entry>EncodingName</entry>
+      <entry>::=</entry>
+      <entry>CHARSET_REGISTRY-CHARSET_ENCODING</entry>
+    </row>
+    <row>
+      <entry>EncodingSide</entry>
+      <entry>::=</entry>
+      <entry>"GL" | "GR"</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+For detail definition of CHARSET_REGISTRY-CHARSET_ENCODING, refer
+to the <olink targetdoc='xlfd' targetptr='xlfd'><citetitle>X Logical Font Description Conventions</citetitle></olink> document.
+</para>
+<literallayout>
+example:
+     ISO8859-1:GL
+</literallayout>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>font</term>
+    <listitem>
+      <para>
+Specifies a list of encoding information which is used for searching
+appropriate font for this fontset.  The left most entry has highest
+priority.
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+
+</sect1>
+<sect1 id="XLC_XLOCALE_Category">
+<title>XLC_XLOCALE Category</title>
+<para>
+The XLC_XLOCALE category defines character classification, conversion
+and other character attributes.
+</para>
+
+<informaltable frame="topbot">
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='3.0*'/>
+  <colspec colname='c2' colwidth='1.0*'/>
+  <colspec colname='c3' colwidth='3.0*'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>class</entry>
+      <entry>super class</entry>
+      <entry>description</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>encoding_name</entry>
+      <entry></entry>
+      <entry>codeset name</entry>
+    </row>
+    <row>
+      <entry>mb_cur_max</entry>
+      <entry></entry>
+      <entry>MB_CUR_MAX</entry>
+    </row>
+    <row>
+      <entry>state_depend_encoding</entry>
+      <entry></entry>
+      <entry>state dependent or not</entry>
+    </row>
+    <row>
+      <entry>wc_encoding_mask</entry>
+      <entry></entry>
+      <entry>for parsing wc string</entry>
+    </row>
+    <row>
+      <entry>wc_shift_bits</entry>
+      <entry></entry>
+      <entry>for conversion between wc and mb</entry>
+    </row>
+    <row>
+      <entry>csN</entry>
+      <entry></entry>
+      <entry>Nth charset (N=0,1,2,...)</entry>
+    </row>
+    <row>
+      <entry>side</entry>
+      <entry>csN</entry>
+      <entry>mapping side (GL, etc)</entry>
+    </row>
+    <row>
+      <entry>length</entry>
+      <entry>csN</entry>
+      <entry>length of a character</entry>
+    </row>
+    <row>
+      <entry>mb_encoding</entry>
+      <entry>csN</entry>
+      <entry>for parsing mb string</entry>
+    </row>
+    <row>
+      <entry>wc_encoding</entry>
+      <entry>csN</entry>
+      <entry>for parsing wc string</entry>
+    </row>
+    <row>
+      <entry>ct_encoding</entry>
+      <entry>csN</entry>
+      <entry>list of encoding name for ct</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<variablelist>
+  <varlistentry>
+    <term>encoding_name</term>
+    <listitem>
+      <para>
+Specifies a codeset name of current locale.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>mb_cur_max</term>
+    <listitem>
+      <para>
+Specifies a maximum allowable number of bytes in a multi-byte character.
+It is corresponding to MB_CUR_MAX of "ISO/IEC 9899:1990 C Language Standard".
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>state_depend_encoding</term>
+    <listitem>
+      <para>
+Indicates a current locale is state dependent. The value should be
+specified "True" or "False".
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>wc_encoding_mask</term>
+    <listitem>
+      <para>
+Specifies a bit-mask for parsing wide-char string.  Each wide character is
+applied bit-and operation with this bit-mask, then is classified into
+the unique charset, by using 'wc_encoding'.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>wc_shift_bits</term>
+    <listitem>
+      <para>
+Specifies a number of bit to be shifted for converting from a multi-byte
+character to a wide character, and vice-versa.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>csN</term>
+    <listitem>
+      <para>
+<!-- .br -->
+Includes a character set information for Nth charset, where N is the
+index number (0,1,2,...).  If there are 4 charsets available in current
+locale, cs0, cs1, cs2 and cs3 should be defined. This class has five
+subclasses, 'side', 'length', 'mb_encoding' 'wc_encoding' and 'ct_encoding'.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>side</term>
+    <listitem>
+      <para>
+Specifies a mapping side of this charset. The format of this value is;
+      </para>
+      <literallayout>
+   Side    ::=  EncodingSide[":Default"]
+      </literallayout>
+      <para>
+The suffix ":Default" can be specified.  It indicates that a character
+belongs to the specified side is mapped to this charset in initial state.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>length</term>
+    <listitem>
+      <para>
+<!-- .br -->
+Specifies a number of bytes of a multi-byte character of this charset.
+It should not contain the length of any single-shift sequence.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>mb_encoding</term>
+    <listitem>
+      <para>
+Specifies a list of shift sequence for parsing multi-byte string.
+The format of this value is;
+      </para>
+<informaltable frame="none">
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='3.0*'/>
+  <colspec colname='c2' colwidth='1.0*'/>
+  <colspec colname='c3' colwidth='5.0*'/>
+  <tbody>
+    <row>
+      <entry>MBEncoding</entry>
+      <entry>::=</entry>
+      <entry>ShiftType ShiftSequence</entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry>|</entry>
+      <entry>ShiftType ShiftSequence ";" MBEncoding</entry>
+    </row>
+    <row>
+      <entry>ShiftType</entry>
+      <entry>::=</entry>
+      <entry>"&lt;SS&gt;"|"&lt;LSL&gt;"|"&lt;LSR&gt;"</entry>
+    </row>
+    <row>
+      <entry>ShiftSequence</entry>
+      <entry>::=</entry>
+      <entry>SequenceValue|SequenceValue ShiftSequence</entry>
+    </row>
+    <row>
+      <entry>SequenceValue</entry>
+      <entry>::=</entry>
+      <entry>NumericString</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+      <literallayout>
+example:
+     &lt;LSL&gt; \x1b \x28 \x4a; &lt;LSL&gt; \x1b \x28 \x42
+      </literallayout>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>wc_encoding</term>
+    <listitem>
+      <para>
+Specifies an integer value for parsing wide-char string.
+It is used to determine the charset for each wide character, after
+applying bit-and operation using 'wc_encoding_mask'.
+This value should be unique in all csN classes.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>ct_encoding</term>
+    <listitem>
+      <para>
+Specifies a list of encoding information that can be used for Compound
+Text.
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+</sect1>
+
+<sect1 id="Sample_of_X_Locale_Database">
+<title>Sample of X Locale Database</title>
+<para>
+The following is sample X Locale Database file.
+</para>
+
+<literallayout class="monospaced">
+#  XLocale Database Sample for ja_JP.euc
+#
+
+#
+#      XLC_FONTSET category
+#
+XLC_FONTSET
+#      fs0 class (7 bit ASCII)
+fs0     {
+        charset              ISO8859-1:GL
+        font                 ISO8859-1:GL; JISX0201.1976-0:GL
+}
+#      fs1 class (Kanji)
+fs1     {
+        charset              JISX0208.1983-0:GL
+        font                 JISX0208.1983-0:GL
+}
+#      fs2 class (Half Kana)
+fs2     {
+        charset              JISX0201.1976-0:GR
+        font                 JISX0201.1976-0:GR
+}
+#      fs3 class (User Defined Character)
+# fs3     {
+#        charset             JISX0212.1990-0:GL
+#        font                JISX0212.1990-0:GL
+# }
+END XLC_FONTSET
+
+#
+#      XLC_XLOCALE category
+#
+XLC_XLOCALE
+
+encoding_name             ja.euc
+mb_cur_max                3
+state_depend_encoding     False
+
+wc_encoding_mask          \x00008080
+wc_shift_bits             8
+
+#      cs0 class
+cs0     {
+        side                 GL:Default
+        length               1
+        wc_encoding          \x00000000
+        ct_encoding          ISO8859-1:GL; JISX0201.1976-0:GL
+}
+#      cs1 class
+cs1     {
+        side                 GR:Default
+        length               2
+
+        wc_encoding          \x00008080
+
+        ct_encoding          JISX0208.1983-0:GL; JISX0208.1983-0:GR;\
+                             JISX0208.1983-1:GL; JISX0208.1983-1:GR
+}
+
+#      cs2 class
+cs2     {
+        side                 GR
+        length               1
+        mb_encoding          &lt;SS&gt; \x8e
+
+        wc_encoding          \x00000080
+
+        ct_encoding          JISX0201.1976-0:GR
+}
+
+#      cs3 class
+# cs3     {
+#         side               GL
+#         length             2
+#         mb_encoding        &lt;SS&gt; \x8f
+# #if HasWChar32
+#         wc_encoding        \x20000000
+# #else
+#         wc_encoding        \x00008000
+# #endif
+#         ct_encoding        JISX0212.1990-0:GL; JISX0212.1990-0:GR
+# }
+
+END XLC_XLOCALE
+</literallayout>
+</sect1>
+
+<sect1 id="Reference">
+<title>Reference</title>
+<para>
+[1] <emphasis remap='I'>ISO/IEC 9899:1990 C Language Standard</emphasis>
+</para>
+<para>
+[2] <olink targetdoc='xlfd' targetptr='xlfd'><citetitle>X Logical Font Description Conventions</citetitle></olink>
+</para>
+
+</sect1>
+</chapter>
+</book>
diff --git a/specs/i18n/trans/Makefile.am b/specs/i18n/trans/Makefile.am
new file mode 100644 (file)
index 0000000..40a135a
--- /dev/null
@@ -0,0 +1,13 @@
+
+if ENABLE_SPECS
+
+# Main DocBook/XML files (DOCTYPE book)
+docbook = trans.xml
+
+# The location where the DocBook/XML files and their generated formats are installed
+shelfdir = $(docdir)/i18n/trans
+
+# Generate DocBook/XML output formats with or without stylesheets
+include $(top_srcdir)/docbook.am
+
+endif ENABLE_SPECS
diff --git a/specs/i18n/trans/trans.xml b/specs/i18n/trans/trans.xml
new file mode 100644 (file)
index 0000000..68611ea
--- /dev/null
@@ -0,0 +1,2002 @@
+<?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="trans">
+
+<bookinfo>
+   <title>The XIM Transport Specification</title>
+   <subtitle>Revision 0.1</subtitle>
+   <releaseinfo>X Version 11, Release &fullrelvers;</releaseinfo>
+   <authorgroup>
+      <author>
+         <firstname>Takashi</firstname><surname>Fujiwara</surname>
+         <affiliation><orgname>FUJITSU LIMITED</orgname></affiliation>
+      </author>
+   </authorgroup>
+   <copyright><year>1994</year><holder>FUJITSU LIMITED</holder></copyright>
+
+<abstract>
+<title>Abstract</title>
+<para>
+This specification describes the transport layer interfaces between Xlib and IM Server,
+which makes various channels usable such as X protocol or TCP/IP, DECnet and etc.
+</para>
+</abstract>
+
+<legalnotice>
+
+<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 and
+this permission notice appear in all copies.
+Fujitsu makes no representations about the suitability for any purpose of the
+information in this document. This documentation is provided as is
+without express or implied warranty.
+</para>
+
+<para role="multiLicensing">Copyright © 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 &ldquo;Software&rdquo;), 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 &ldquo;AS IS&rdquo;, WITHOUT WARRANTY OF ANY KIND,
+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>
+
+<para>X Window System is a trademark of The Open Group.</para>
+
+</legalnotice>
+</bookinfo>
+
+<chapter id='X_Transport_Specification'>
+<title>X Transport Specification</title>
+
+<sect1 id="Introduction">
+<title>Introduction</title>
+<!-- .XS -->
+<!-- (SN Introduction -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The Xlib XIM implementation is layered into three functions, a protocol
+layer, an interface layer and a transport layer. The purpose of this
+layering is to make the protocol independent of transport implementation.
+Each function of these layers are:
+<!-- .RS 3 -->
+</para>
+<variablelist>
+  <varlistentry>
+    <term><emphasis>The protocol layer</emphasis></term>
+    <listitem>
+      <para>
+implements overall function of XIM and calls the interface layer
+functions when it needs to communicate to IM Server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term><emphasis>The interface layer</emphasis></term>
+    <listitem>
+      <para>
+separates the implementation of the transport layer from the protocol
+layer, in other words, it provides implementation independent hook for
+the transport layer functions.
+      </para>
+    </listitem>
+  </varlistentry>
+
+  <varlistentry>
+    <term><emphasis>The transport layer</emphasis></term>
+    <listitem>
+      <para>
+handles actual data communication with IM Server. It is done by a set
+of several functions named transporters.
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+This specification describes the interface layer and the transport
+layer, which makes various communication channels usable such as
+X protocol or, TCP/IP, DECnet, STREAM, etc., and provides
+the information needed for adding another new transport layer.
+In addition, sample implementations for the transporter using the
+X connection is described in section 4. <!-- xref -->
+</para>
+</sect1>
+
+<sect1 id="Initialization">
+<title>Initialization</title>
+
+<sect2 id="Registering_structure_to_initialize">
+<title>Registering structure to initialize</title>
+
+<para>
+The structure typed as TransportSW contains the list of the transport
+layer the specific implementations supports.
+</para>
+
+<literallayout class="monospaced">
+typedef struct {
+      char *transport_name;
+      Bool (*config);
+} TransportSW;
+</literallayout>
+
+<informaltable frame="none">
+  <?dbfo keep-together="always" ?>
+  <tgroup cols="2" align='left' colsep='0' rowsep='0'>
+  <colspec colname="col1" colwidth='1.0*'/>
+  <colspec colname="col2" colwidth='1.0*'/>
+  <tbody>
+    <row>
+      <entry><emphasis>transport_name</emphasis></entry>
+      <entry>name of transport<footnote><para>Refer to "The Input Method Protocol: Appendix B</para></footnote></entry>
+    </row>
+    <row>
+      <entry><emphasis>config</emphasis></entry>
+      <entry>initial configuration function</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+A sample entry for the Xlib supporting transporters is shown below:
+</para>
+
+<literallayout class="monospaced">
+TransportSW _XimTransportRec[] = {
+/*     char <emphasis remap='I'>*</emphasis>:
+ *     transport_name,     Bool <emphasis remap='I'>(*config)()</emphasis>
+ */
+      "X",             _XimXConf,
+      "tcp",           _XimTransConf,
+      "local",         _XimTransConf,
+      "decnet",        _XimTransConf,
+      "streams",       _XimTransConf,
+      (char *)NULL,    (Bool (*)())NULL,
+};
+</literallayout>
+
+</sect2>
+<sect2 id="Initialization_function">
+<title>Initialization function</title>
+<!-- .XS -->
+<!-- (SN Initialization function -->
+<!-- .XE -->
+<para>
+The following function will be called once when Xlib configures the
+transporter functions.
+</para>
+
+<funcsynopsis>
+<funcprototype>
+  <funcdef>Bool <function>(*config)</function></funcdef>
+  <paramdef>XIM<parameter> im</parameter></paramdef>
+  <paramdef>char<parameter> *transport_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>im</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies XIM structure address.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>transport_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the data specific to the transporter, in IM Server address.<footnote><para>Refer to "The Input Method Protocol: Appendix B</para></footnote>
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+This function must setup the transporter function pointers.
+</para>
+
+<para>
+<!-- .LP -->
+The actual <emphasis remap='I'>config</emphasis> function will be chosen by IM Server at the
+pre-connection time, matching by the <emphasis remap='I'>transport_name</emphasis> specified
+in the <function>_XimTransportRec</function> array; The specific members of XimProto
+structure listed below must be initialized so that point they
+appropriate transporter functions.
+</para>
+
+<para>
+If the specified transporter has been configured successfully, this
+function returns True. There is no Alternative Entry for config
+function itself.
+</para>
+
+<para>
+The structure XimProto contains the following function pointers:
+</para>
+
+<literallayout class="monospaced">
+Bool (*connect)();               /* Open connection */
+Bool (*shutdown)();              /* Close connection */
+Bool (*write)();                 /* Write data */
+Bool (*read)();                  /* Read data */
+Bool (*flush)();                 /* Flush data buffer */
+Bool (*register_dispatcher)();   /* Register asynchronous data handler */
+Bool (*call_dispatcher)();       /* Call dispatcher */
+</literallayout>
+
+<para>
+These functions are called when Xlib needs to communicate the
+IM Server. These functions must process the appropriate procedure
+described below.
+</para>
+
+</sect2>
+</sect1>
+<sect1 id='The_interfacetransport_layer_functions'>
+<title>The interface/transport layer functions</title>
+<para>
+Following functions are used for the transport interface.
+</para>
+
+<table frame="all" id="transport_layer_functions_2">
+  <?dbfo keep-together="always" ?>
+  <title>The Transport Layer Functions</title>
+  <tgroup cols="3" align='left' colsep='1' rowsep='1'>
+  <colspec colname="col1" colwidth="3.0*"/>
+  <colspec colname="col2" colwidth="3.0*"/>
+  <colspec colname="col3" colwidth='1.0*'/>
+  <thead>
+    <row>
+      <entry align='center'>Alternate Entry (Interface Layer)</entry>
+      <entry align='center'>XimProto member (Transport Layer)</entry>
+      <entry align='center'>Section</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>_XimConnect</entry>
+      <entry>connect</entry>
+      <entry>3.1</entry>
+    </row>
+    <row>
+      <entry>_XimShutdown</entry>
+      <entry>shutdown</entry>
+      <entry>3.2</entry>
+    </row>
+    <row>
+      <entry>_XimWrite</entry>
+      <entry>write</entry>
+      <entry>3.3</entry>
+    </row>
+    <row>
+      <entry>_XimRead</entry>
+      <entry>read</entry>
+      <entry>3.4</entry>
+    </row>
+    <row>
+      <entry>_XimFlush</entry>
+      <entry>flush</entry>
+      <entry>3.5</entry>
+    </row>
+    <row>
+      <entry>_XimRegisterDispatcher</entry>
+      <entry>register_dispatcher</entry>
+      <entry>3.6</entry>
+    </row>
+    <row>
+      <entry>_XimCallDispatcher</entry>
+      <entry>call_dispatcher</entry>
+      <entry>3.7</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</table>
+
+<para>
+The Protocol layer calls the above functions using the Alternative
+Entry in the left column. The transport implementation defines
+XimProto member function in the right column. The Alternative Entry is
+provided so as to make easier to implement the Protocol Layer.
+</para>
+
+<sect2 id="Opening_connection">
+<title>Opening connection</title>
+<para>
+<!-- .LP -->
+When <olink targetdoc='libX11' targetptr='XOpenIM'><function>XOpenIM</function></olink> is called, the following function is called to connect
+with the IM Server.
+</para>
+
+<funcsynopsis>
+<funcprototype>
+  <funcdef>Bool <function>(*connect)</function></funcdef>
+  <paramdef>XIM<parameter> im</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>im</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies XIM structure address.
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+This function must establishes the connection to the IM Server. If the
+connection is established successfully, this function returns True.
+The Alternative Entry for this function is:
+</para>
+
+<funcsynopsis id='_XimConnect'>
+<funcprototype>
+  <funcdef>Bool <function> _XimConnect</function></funcdef>
+  <paramdef>XIM<parameter> im</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>im</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies XIM structure address.
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+</sect2>
+
+<sect2 id="Closing_connection">
+<title>Closing connection</title>
+<!-- .XS -->
+<!-- (SN Closing connection -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+When <olink targetdoc='libX11' targetptr='XCloseIM'><function>XCloseIM</function></olink> is called, the following function is called to
+disconnect the connection with the IM Server. The Alternative Entry
+for this function is:
+</para>
+
+<funcsynopsis>
+<funcprototype>
+  <funcdef>Bool <function> (*shutdown)</function></funcdef>
+  <paramdef>XIM<parameter> im</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>im</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies XIM structure address.
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+This function must close connection with the IM Server. If the
+connection is closed successfully, this function returns True. The
+Alternative Entry for this function is:
+</para>
+
+<funcsynopsis id='_XimShutdown'>
+<funcprototype>
+  <funcdef>Bool <function>_XimShutdown</function></funcdef>
+  <paramdef>XIM<parameter> im</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>im</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies XIM structure address.
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+
+</sect2>
+
+<sect2 id="Writing_data">
+<title>Writing data</title>
+<para>
+The following function is called, when Xlib needs to write data to the
+IM Server.
+</para>
+
+<funcsynopsis id='_XimWrite'>
+<funcprototype>
+  <funcdef>Bool <function> _XimWrite</function></funcdef>
+  <paramdef>XIM<parameter> im</parameter></paramdef>
+  <paramdef>INT16<parameter> len</parameter></paramdef>
+  <paramdef>XPointer<parameter> data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>im</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies XIM structure address.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>len</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the length of writing data.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the writing data.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+This function writes the <emphasis remap='I'>data</emphasis> to the IM Server, regardless
+of the contents.  The number of bytes is passed to <emphasis remap='I'>len</emphasis>. The
+writing data is passed to <emphasis remap='I'>data</emphasis>. If data is sent successfully,
+the function returns True. Refer to "The Input Method Protocol" for
+the contents of the writing data. The Alternative Entry for this
+function is:
+</para>
+
+<funcsynopsis>
+<funcprototype>
+  <funcdef>Bool <function>_XimWrite</function></funcdef>
+  <paramdef>XIM<parameter> im</parameter></paramdef>
+  <paramdef>INT16<parameter> len</parameter></paramdef>
+  <paramdef>XPointer<parameter> data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>im</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies XIM structure address.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>len</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the length of writing data.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the writing data.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+</sect2>
+<sect2 id="Reading_data">
+<title>Reading data</title>
+<para>
+The following function is called when Xlib waits for response from IM
+server synchronously.
+</para>
+
+<funcsynopsis id='_XimRead'>
+<funcprototype>
+  <funcdef>Bool <function> _XimRead</function></funcdef>
+  <paramdef>XIM<parameter> im</parameter></paramdef>
+  <paramdef>XPointer<parameter> read_buf</parameter></paramdef>
+  <paramdef>int<parameter> buf_len</parameter></paramdef>
+  <paramdef>int<parameter> *ret_len</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>im</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies XIM structure address.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>read_buf</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the buffer to store data.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>buf_len</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the size of the <emphasis remap='I'>buffer</emphasis>
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ret_len</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the length of stored data.
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+This function stores the read data in <emphasis remap='I'>read_buf</emphasis>, which size is
+specified as <emphasis remap='I'>buf_len</emphasis>. The size of data is set to <emphasis remap='I'>ret_len</emphasis>.
+This function return True, if the data is read normally or reading
+data is completed.
+</para>
+<para>
+The Alternative Entry for this function is:
+</para>
+
+<funcsynopsis>
+<funcprototype>
+  <funcdef>Bool <function> _XimRead</function></funcdef>
+  <paramdef>XIM<parameter> im</parameter></paramdef>
+  <paramdef>INT16<parameter> *ret_len</parameter></paramdef>
+  <paramdef>XPointer<parameter> buf</parameter></paramdef>
+  <paramdef>int<parameter> buf_len</parameter></paramdef>
+  <paramdef>Bool<parameter> (*predicate)()</parameter></paramdef>
+  <paramdef>XPointer<parameter> predicate_arg</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>im</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies XIM structure address.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ret_len</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the size of the <emphasis remap='I'>data</emphasis> buffer.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>buf</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the buffer to store data.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>buf_len</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the length of <emphasis remap='I'>buffer</emphasis>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>predicate</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the predicate for the XIM data.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>predicate_arg</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the predicate specific data.
+<!-- .sp 6p -->
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The predicate procedure indicates whether the <emphasis remap='I'>data</emphasis> is for the
+XIM or not. <emphasis remap='I'>len</emphasis>
+This function stores the read data in <emphasis remap='I'>buf</emphasis>, which size
+is specified as <emphasis remap='I'>buf_len</emphasis>. The size of data is set to
+<emphasis remap='I'>ret_len</emphasis>.  If <emphasis remap='I'>preedicate()</emphasis>
+returns True, this function returns True.  If not, it calls the registered callback function.
+</para>
+
+<para>
+The procedure and its arguments are:
+</para>
+
+
+<funcsynopsis>
+<funcprototype>
+  <funcdef>void <function>(*predicate)</function></funcdef>
+  <paramdef>XIM<parameter> im</parameter></paramdef>
+  <paramdef>INT16<parameter> len</parameter></paramdef>
+  <paramdef>XPointer<parameter> data</parameter></paramdef>
+  <paramdef>XPointer<parameter> predicate_arg</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>im</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies XIM structure address.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>len</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the size of the <emphasis remap='I'>data</emphasis> buffer.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the buffer to store data.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>predicate_arg</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the predicate specific data.
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+
+</sect2>
+<sect2 id="Flushing_buffer">
+<title>Flushing buffer</title>
+<para>
+The following function is called when Xlib needs to flush the data.
+</para>
+
+<funcsynopsis>
+<funcprototype>
+  <funcdef>void <function>(*flush)</function></funcdef>
+  <paramdef>XIM<parameter> im</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>im</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies XIM structure address.
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+This function must flush the data stored in internal buffer on the
+transport layer. If data transfer is completed, the function returns
+True.  The Alternative Entry for this function is:
+</para>
+
+<funcsynopsis id='_XimFlush'>
+<funcprototype>
+  <funcdef>void <function> _XimFlush</function></funcdef>
+  <paramdef>XIM<parameter> im</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>im</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies XIM structure address.
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+
+</sect2>
+<sect2 id="Registering_asynchronous_data_handler">
+<title>Registering asynchronous data handler</title>
+<para>
+Xlib needs to handle asynchronous response from IM Server. This is
+because some of the XIM data occur asynchronously to X events.
+</para>
+
+<para>
+Those data will be handled in the <emphasis remap='I'>Filter</emphasis>,
+and the <emphasis remap='I'>Filter</emphasis>
+will call asynchronous data handler in the protocol layer. Then it
+calls dispatchers in the transport layer. The dispatchers are
+implemented by the protocol layer. This function must store the
+information and prepare for later call of the dispatchers using
+<xref linkend='_XimCallDispatcher' xrefstyle='select: title'/>.
+</para>
+
+<para>
+When multiple dispatchers are registered, they will be called
+sequentially in order of registration, on arrival of asynchronous
+data. The register_dispatcher is declared as following:
+</para>
+
+<funcsynopsis>
+<funcprototype>
+  <funcdef>Bool <function>(*register_dispatcher)</function></funcdef>
+  <paramdef>XIM<parameter> im</parameter></paramdef>
+  <paramdef>Bool<parameter> (*dispatcher)()</parameter></paramdef>
+  <paramdef>XPointer<parameter> call_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>im</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies XIM structure address.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dispatcher</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the dispatcher function to register.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>call_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a parameter for the <emphasis remap='I'>dispatcher</emphasis>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The dispatcher is a function of the following type:
+</para>
+
+<funcsynopsis>
+<funcprototype>
+  <funcdef>Bool <function>(*dispatcher)</function></funcdef>
+  <paramdef>XIM<parameter> im</parameter></paramdef>
+  <paramdef>INT16<parameter> len</parameter></paramdef>
+  <paramdef>XPointer<parameter> data</parameter></paramdef>
+  <paramdef>XPointer<parameter> call_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>im</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies XIM structure address.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>len</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the size of the <emphasis remap='I'>data</emphasis> buffer.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the buffer to store data.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>call_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a parameter passed to the register_dispatcher.
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The dispatcher is provided by the protocol layer. They are called once
+for every asynchronous data, in order of registration. If the data is
+used, it must return True. otherwise, it must return False.
+</para>
+
+<para>
+If the dispatcher function returns True, the Transport Layer assume
+that the data has been processed by the upper layer.  The Alternative
+Entry for this function is:
+</para>
+
+<funcsynopsis id='_XimRegisterDispatcher'>
+<funcprototype>
+  <funcdef>Bool <function> _XimRegisterDispatcher</function></funcdef>
+  <paramdef>XIM<parameter> im</parameter></paramdef>
+  <paramdef>Bool<parameter> (*dispatcher)()</parameter></paramdef>
+  <paramdef>XPointer<parameter> call_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>im</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies XIM structure address.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dispatcher</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the dispatcher function to register.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>call_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a parameter for the <emphasis remap='I'>dispatcher</emphasis>.
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+
+</sect2>
+<sect2 id="Calling_dispatcher">
+<title>Calling dispatcher</title>
+<para>
+The following function is used to call the registered dispatcher
+function, when the asynchronous response from IM Server has arrived.
+</para>
+
+<funcsynopsis>
+<funcprototype>
+  <funcdef>Bool <function>(*call_dispatcher)</function></funcdef>
+  <paramdef>XIM<parameter> im</parameter></paramdef>
+  <paramdef>INT16<parameter> len</parameter></paramdef>
+  <paramdef>XPointer<parameter> data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>im</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies XIM structure address.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>len</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the size of <emphasis remap='I'>data</emphasis> buffer.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the buffer to store data.
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The call_dispatcher must call the dispatcher function, in order of
+their registration. <emphasis remap='I'>len</emphasis> and <emphasis remap='I'>data</emphasis> are the data passed to
+register_dispatcher.
+</para>
+
+<para>
+The return values are checked at each invocation, and if it finds
+True, it immediately return with true for its return value.
+</para>
+
+<para>
+It is depend on the upper layer whether the read data is XIM
+Protocol packet unit or not.
+The Alternative Entry for this function is:
+</para>
+
+<funcsynopsis id='_XimCallDispatcher'>
+<funcprototype>
+  <funcdef>Bool <function> _XimCallDispatcher</function></funcdef>
+  <paramdef>XIM<parameter> im</parameter></paramdef>
+  <paramdef>INT16<parameter> len</parameter></paramdef>
+  <paramdef>XPointer<parameter> call_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+</sect2>
+</sect1>
+<sect1 id="Sample_implementations_for_the_Transport_Layer">
+<title>Sample implementations for the Transport Layer</title>
+<para>
+Sample implementations for the transporter using the X connection is
+described here.
+</para>
+
+<sect2 id="X_Transport">
+<title>X Transport</title>
+<para>
+At the beginning of the X Transport connection for the XIM transport
+mechanism, two different windows must be created either in an Xlib XIM
+or in an IM Server, with which the Xlib and the IM Server exchange the
+XIM transports by using the ClientMessage events and Window Properties.
+In the following, the window created by the Xlib is referred as the
+"client communication window", and on the other hand, the window created
+by the IM Server is referred as the "IMS communication window".
+</para>
+
+<sect3 id="Connection">
+<title>Connection</title>
+<para>
+In order to establish a connection, a communication window is created.
+A ClientMessage in the following event's format is sent to the owner
+window of XIM_SERVER selection, which the IM Server has created.
+</para>
+
+<para>
+<!-- .LP -->
+Refer to "The Input Method Protocol" for the XIM_SERVER atom.
+</para>
+
+<table frame="topbot" id="transport_layer_functions">
+  <?dbfo keep-together="always" ?>
+  <title>The ClientMessage sent to the IMS window.</title>
+  <tgroup cols="3" align='left' colsep='0' rowsep='0'>
+  <colspec colname="col1" colwidth='1.0*'/>
+  <colspec colname="col2" colwidth='1.0*' colsep='1'/>
+  <colspec colname="col3" colwidth="3.5*"/>
+  <spanspec namest="col1" nameend="col2" spanname="span-horiz"/>
+  <thead>
+    <row rowsep='1'>
+      <entry spanname="span-horiz" colsep='1'>Structure Member</entry>
+      <entry>Contents</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>int</entry>
+      <entry>type</entry>
+      <entry>ClientMessage</entry>
+    </row>
+    <row>
+      <entry>u_long</entry>
+      <entry>serial</entry>
+      <entry>Set by the X Window System</entry>
+    </row>
+    <row>
+      <entry>Bool</entry>
+      <entry>send_event</entry>
+      <entry>Set by the X Window System</entry>
+    </row>
+    <row>
+      <entry>Display</entry>
+      <entry>*display</entry>
+      <entry>The display to which connects</entry>
+    </row>
+    <row>
+      <entry>Window</entry>
+      <entry>window</entry>
+      <entry>IMS Window ID</entry>
+    </row>
+    <row>
+      <entry>Atom</entry>
+      <entry>message_type</entry>
+      <entry>XInternAtom(display, "_XIM_CONNECT", false)</entry>
+    </row>
+    <row>
+      <entry>int</entry>
+      <entry>format</entry>
+      <entry>32</entry>
+    </row>
+    <row>
+      <entry>long</entry>
+      <entry>data.1[0]</entry>
+      <entry>client communication window ID</entry>
+    </row>
+    <row>
+      <entry>long</entry>
+      <entry>data.1[1]</entry>
+      <entry>client-major-transport-version(*1)</entry>
+    </row>
+    <row>
+      <entry>long</entry>
+      <entry>data.1[2]</entry>
+      <entry>client-major-transport-version(*1)</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</table>
+
+<para>
+In order to establish the connection (to notify the IM Server communication
+window), the IM Server sends a ClientMessage in the following event's
+format to the client communication window.
+</para>
+
+<table frame="topbot" id="clientmessage_sent_by_im_server">
+  <?dbfo keep-together="always" ?>
+  <title>The ClientMessage sent by IM Server.</title>
+  <tgroup cols="3" colsep='0' rowsep='0'>
+  <colspec colname="col1" colwidth='1.0*'/>
+  <colspec colname="col2" colwidth='1.0*' colsep="1"/>
+  <colspec colname="col3" colwidth="3.5*"/>
+  <spanspec namest="col1" nameend="col2" spanname="span-horiz"/>
+  <thead>
+    <row rowsep='1'>
+      <entry spanname="span-horiz" colsep='1'>Structure Member</entry>
+      <entry>Contents</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>int</entry>
+      <entry>type</entry>
+      <entry>ClientMessage</entry>
+    </row>
+    <row>
+      <entry>u_long</entry>
+      <entry>serial</entry>
+      <entry>Set by the X Window System</entry>
+    </row>
+    <row>
+      <entry>Bool</entry>
+      <entry>send_event</entry>
+      <entry>Set by the X Window System</entry>
+    </row>
+    <row>
+      <entry>Display</entry>
+      <entry>*display</entry>
+      <entry>The display to which connects</entry>
+    </row>
+    <row>
+      <entry>Window</entry>
+      <entry>window</entry>
+      <entry>IMS Window ID</entry>
+    </row>
+    <row>
+      <entry>Atom</entry>
+      <entry>message_type</entry>
+      <entry>XInternAtom(display, "_XIM_CONNECT", false)</entry>
+    </row>
+    <row>
+      <entry>int</entry>
+      <entry>format</entry>
+      <entry>32</entry>
+    </row>
+    <row>
+      <entry>long</entry>
+      <entry>data.1[0]</entry>
+      <entry>client communication window ID</entry>
+    </row>
+    <row>
+      <entry>long</entry>
+      <entry>data.1[1]</entry>
+      <entry>client-major-transport-version(*1)</entry>
+    </row>
+    <row>
+      <entry>long</entry>
+      <entry>data.1[2]</entry>
+      <entry>client-major-transport-version(*1)</entry>
+    </row>
+    <row>
+      <entry>long</entry>
+      <entry>data.1[3]</entry>
+      <entry>dividing size between ClientMessage and Property(*2)</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</table>
+
+<para>
+(*1) major/minor-transport-version
+</para>
+
+<para>
+The read/write method is decided by the combination of
+major/minor-transport-version, as follows:
+</para>
+
+<table frame="all" id="readwrite_method_and_the_majorminor_transport_version">
+  <?dbfo keep-together="always" ?>
+  <title>The read/write method and the major/minor-transport-version</title>
+  <tgroup cols="3" colsep='1' rowsep='1'>
+  <colspec colname="col1" colwidth='1.0*'/>
+  <colspec colname="col2" colwidth='1.0*'/>
+  <colspec colname="col3" colwidth="3.0*"/>
+  <spanspec namest="col1" nameend="col2" spanname="span-horiz" align="center"/>
+  <thead>
+    <row>
+      <entry spanname="span-horiz">Transport-version</entry>
+      <entry>read/write</entry>
+    </row>
+    <row>
+      <entry>major</entry>
+      <entry>minor</entry>
+      <entry></entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry morerows="2">0</entry>
+      <entry>0</entry>
+      <entry>only-CM &amp; Property-with-CM</entry>
+    </row>
+    <row>
+      <entry>1</entry>
+      <entry>only-CM &amp; multi-CM</entry>
+    </row>
+    <row>
+      <entry>2</entry>
+      <entry>only-CM &amp; multi-CM &amp; Property-with-CM</entry>
+    </row>
+    <row>
+      <entry>1</entry>
+      <entry>0</entry>
+      <entry>PropertyNotify</entry>
+    </row>
+    <row>
+      <entry morerows="1">2</entry>
+      <entry>0</entry>
+      <entry>only-CM &amp; PropertyNotify</entry>
+    </row>
+    <row>
+      <entry>1</entry>
+      <entry>only-CM &amp; multi-CM &amp; PropertyNotify</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</table>
+
+<literallayout class="monospaced">
+only-CM            :    data is sent via a ClientMessage
+multi-CM           :    data is sent via multiple ClientMessages
+Property-with-CM   :    data is written in Property, and its Atom
+                        is send via ClientMessage
+PropertyNotify     :    data is written in Property, and its Atom
+                        is send via PropertyNotify
+
+</literallayout>
+
+
+<para>
+The method to decide major/minor-transport-version is as follows:
+</para>
+
+<itemizedlist>
+  <listitem>
+    <para>
+The client sends 0 as major/minor-transport-version to the IM Server.
+The client must support all methods in Table 4-3. <!-- xref -->
+The client may send another number as major/minor-transport-version to
+use other method than the above in the future.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The IM Server sends its major/minor-transport-version number to
+the client. The client sends data using the method specified by the
+IM Server.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If major/minor-transport-version number is not available, it is regarded
+as 0.
+    </para>
+  </listitem>
+</itemizedlist>
+
+<para>
+(*2) dividing size between ClientMessage and Property
+</para>
+
+<para>
+If data is sent via both of multi-CM and Property, specify the dividing
+size between ClientMessage and Property. The data, which is smaller than
+this size, is sent via multi-CM (or only-CM), and the data, which is
+lager than this size, is sent via Property.
+</para>
+
+</sect3>
+
+<sect3 id='readwrite'>
+<title>read/write</title>
+<para>
+The data is transferred via either ClientMessage or Window Property in
+the X Window System.
+</para>
+
+<sect4 id="Format_for_the_data_from_the_Client_to_the_IM_Server">
+<title>Format for the data from the Client to the IM Server</title>
+<para>
+<emphasis role="bold">ClientMessage</emphasis>
+</para>
+
+<para>
+If data is sent via ClientMessage event, the format is as follows:
+</para>
+
+<table frame="topbot" id="clientmessage_events_format_first_or_middle">
+  <?dbfo keep-together="always" ?>
+  <title>The ClientMessage event's format (first or middle)</title>
+  <tgroup cols="3" align='left' colsep='0' rowsep='0'>
+  <colspec colname="col1" colwidth='1.0*'/>
+  <colspec colname="col2" colwidth='1.0*' colsep="1"/>
+  <colspec colname="col3" colwidth="3.5*"/>
+  <spanspec namest="col1" nameend="col2" spanname="span-horiz"/>
+  <thead>
+    <row rowsep='1'>
+      <entry spanname="span-horiz" colsep='1'>Structure Member</entry>
+      <entry>Contents</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>int</entry>
+      <entry>type</entry>
+      <entry>ClientMessage</entry>
+    </row>
+    <row>
+      <entry>u_long</entry>
+      <entry>serial</entry>
+      <entry>Set by the X Window System</entry>
+    </row>
+    <row>
+      <entry>Bool</entry>
+      <entry>send_event</entry>
+      <entry>Set by the X Window System</entry>
+    </row>
+    <row>
+      <entry>Display</entry>
+      <entry>*display</entry>
+      <entry>The display to which connects</entry>
+    </row>
+    <row>
+      <entry>Window</entry>
+      <entry>window</entry>
+      <entry>IMS Window ID</entry>
+    </row>
+    <row>
+      <entry>Atom</entry>
+      <entry>message_type</entry>
+      <entry>XInternAtom(display, "_XIM_MOREDATA", False)</entry>
+    </row>
+    <row>
+      <entry>int</entry>
+      <entry>format</entry>
+      <entry>8</entry>
+    </row>
+    <row>
+      <entry>char</entry>
+      <entry>data.b[20]</entry>
+      <entry>(read/write DATA : 20 byte)</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</table>
+
+
+
+<table frame="topbot" id="clientmessage_events_format_only_or_last">
+  <?dbfo keep-together="always" ?>
+  <title>The ClientMessage event's format (only or last)</title>
+  <tgroup cols="3" align='left' colsep='0' rowsep='0'>
+  <colspec colname="col1" colwidth='1.0*'/>
+  <colspec colname="col2" colwidth='1.0*' colsep="1"/>
+  <colspec colname="col3" colwidth="3.5*"/>
+  <spanspec namest="col1" nameend="col2" spanname="span-horiz"/>
+  <thead>
+    <row rowsep='1'>
+      <entry spanname="span-horiz" colsep='1'>Structure Member</entry>
+      <entry>Contents</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>int</entry>
+      <entry>type</entry>
+      <entry>ClientMessage</entry>
+    </row>
+    <row>
+      <entry>u_long</entry>
+      <entry>serial</entry>
+      <entry>Set by the X Window System</entry>
+    </row>
+    <row>
+      <entry>Bool</entry>
+      <entry>send_event</entry>
+      <entry>Set by the X Window System</entry>
+    </row>
+    <row>
+      <entry>Display</entry>
+      <entry>*display</entry>
+      <entry>The display to which connects</entry>
+    </row>
+    <row>
+      <entry>Window</entry>
+      <entry>window</entry>
+      <entry>IMS Window ID</entry>
+    </row>
+    <row>
+      <entry>Atom</entry>
+      <entry>message_type</entry>
+      <entry>XInternAtom(display, "_XIM_PROTOCOL", False)</entry>
+    </row>
+    <row>
+      <entry>int</entry>
+      <entry>format</entry>
+      <entry>8</entry>
+    </row>
+    <row>
+      <entry>char</entry>
+      <entry>data.b[20]</entry>
+      <entry>(read/write DATA : MAX 20 byte)
+<footnote><para>If the data is smaller
+than 20 bytes, all data other than available data must be 0.
+</para></footnote>
+      </entry>
+    </row>
+  </tbody>
+  </tgroup>
+</table>
+
+<para>
+<emphasis role="bold">Property</emphasis>
+</para>
+
+<para>
+In the case of large data, data will be sent via the Window Property
+for the efficiency.  There are the following two methods to notify
+Property, and transport-version is decided which method is used.
+</para>
+
+<itemizedlist>
+  <listitem>
+    <para>
+The XChangeProperty function is used to store data in the client
+communication window, and Atom of the stored data is notified to the
+IM Server via ClientMessage event.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The XChangeProperty function is used to store data in the client
+communication window, and Atom of the stored data is notified to the
+IM Server via PropertyNotify event.
+    </para>
+  </listitem>
+</itemizedlist>
+
+<para>
+The arguments of the XChangeProperty are as follows:
+</para>
+
+
+<table frame="topbot" id="xchangeproperty_events_format">
+  <?dbfo keep-together="always" ?>
+  <title>The XChangeProperty event's format</title>
+  <tgroup cols="3" align='left' colsep='0' rowsep='0'>
+  <colspec colname="col1" colwidth='1.0*'/>
+  <colspec colname="col2" colwidth='1.0*' colsep="1"/>
+  <colspec colname="col3" colwidth="3.5*"/>
+  <spanspec namest="col1" nameend="col2" spanname="span-horiz" align="left"/>
+  <thead>
+    <row rowsep='1'>
+      <entry spanname="span-horiz" colsep='1'>Argument</entry>
+      <entry>Contents</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>Display</entry>
+      <entry>*display</entry>
+      <entry>The display to which connects</entry>
+    </row>
+    <row>
+      <entry>Window</entry>
+      <entry>window</entry>
+      <entry>IMS communication window ID</entry>
+    </row>
+    <row>
+      <entry>Atom</entry>
+      <entry>property</entry>
+      <entry>read/write property Atom (*1)</entry>
+    </row>
+    <row>
+      <entry>int</entry>
+      <entry>format</entry>
+      <entry>8</entry>
+    </row>
+    <row>
+      <entry>int</entry>
+      <entry>mode</entry>
+      <entry>PropModeAppend</entry>
+    </row>
+    <row>
+      <entry>u_char</entry>
+      <entry>*data</entry>
+      <entry>read/write DATA</entry>
+    </row>
+    <row>
+      <entry>int</entry>
+      <entry>nelements</entry>
+      <entry>length of DATA</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</table>
+
+<para>
+(*1) The read/write property ATOM allocates the following strings by
+<olink targetdoc='libX11' targetptr='XInternAtom'><function>XInternAtom</function></olink>.
+"_clientXXX"
+</para>
+
+<para>
+The client changes the property with the mode of PropModeAppend and
+the IM Server will read it with the delete mode i.e. (delete = True).
+</para>
+
+<para>
+If Atom is notified via ClientMessage event, the format of the ClientMessage
+is as follows:
+</para>
+
+<table frame="topbot" id="clientmessage_events_format_to_send_atom_of_property">
+  <?dbfo keep-together="always" ?>
+  <title>The ClientMessage event's format to send Atom of property</title>
+  <tgroup cols="3" align='left' colsep='0' rowsep='0'>
+  <colspec colname="col1" colwidth='1.0*'/>
+  <colspec colname="col2" colwidth='1.0*' colsep="1"/>
+  <colspec colname="col3" colwidth="3.5*"/>
+  <spanspec namest="col1" nameend="col2" spanname="span-horiz"/>
+  <thead>
+    <row rowsep='1'>
+      <entry spanname="span-horiz" colsep='1'>Structure Member</entry>
+      <entry>Contents</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>int</entry>
+      <entry>type</entry>
+      <entry>ClientMessage</entry>
+    </row>
+    <row>
+      <entry>u_long</entry>
+      <entry>serial</entry>
+      <entry>Set by the X Window System</entry>
+    </row>
+    <row>
+      <entry>Bool</entry>
+      <entry>send_event</entry>
+      <entry>Set by the X Window System</entry>
+    </row>
+    <row>
+      <entry>Display</entry>
+      <entry>*display</entry>
+      <entry>The display to which connects</entry>
+    </row>
+    <row>
+      <entry>Window</entry>
+      <entry>window</entry>
+      <entry>IMS Window ID</entry>
+    </row>
+    <row>
+      <entry>Atom</entry>
+      <entry>message_type</entry>
+      <entry>XInternAtom(display, "_XIM_PROTOCOL", False)</entry>
+    </row>
+    <row>
+      <entry>int</entry>
+      <entry>format</entry>
+      <entry>8</entry>
+    </row>
+    <row>
+      <entry>long</entry>
+      <entry>data.1[0]</entry>
+      <entry>length of read/write property Atom</entry>
+    </row>
+    <row>
+      <entry>long</entry>
+      <entry>data.1[1]</entry>
+      <entry>read/write property Atom</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</table>
+</sect4>
+
+<sect4 id="Format_for_the_data_from_the_IM_Server_to_the_Client">
+<title>Format for the data from the IM Server to the Client</title>
+<para>
+<emphasis role="bold">ClientMessage</emphasis>
+</para>
+
+<para>
+The format of the ClientMessage is as follows:
+</para>
+
+<table frame="topbot" id="clientmessage_events_format_first_or_middle_2">
+  <?dbfo keep-together="always" ?>
+  <title>The ClientMessage event's format (first or middle)</title>
+  <tgroup cols="3" align='left' colsep='0' rowsep='0'>
+  <colspec colname="col1" colwidth='1.0*'/>
+  <colspec colname="col2" colwidth='1.0*' colsep="1"/>
+  <colspec colname="col3" colwidth="3.5*"/>
+  <spanspec namest="col1" nameend="col2" spanname="span-horiz"/>
+  <thead>
+    <row rowsep='1'>
+      <entry spanname="span-horiz" colsep='1'>Structure Member</entry>
+      <entry>Contents</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>int</entry>
+      <entry>type</entry>
+      <entry>ClientMessage</entry>
+    </row>
+    <row>
+      <entry>u_long</entry>
+      <entry>serial</entry>
+      <entry>Set by the X Window System</entry>
+    </row>
+    <row>
+      <entry>Bool</entry>
+      <entry>send_event</entry>
+      <entry>Set by the X Window System</entry>
+    </row>
+    <row>
+      <entry>Display</entry>
+      <entry>*display</entry>
+      <entry>The display to which connects</entry>
+    </row>
+    <row>
+      <entry>Window</entry>
+      <entry>window</entry>
+      <entry>IMS Window ID</entry>
+    </row>
+    <row>
+      <entry>Atom</entry>
+      <entry>message_type</entry>
+      <entry>XInternAtom(display, "_XIM_MOREDATA", False)</entry>
+    </row>
+    <row>
+      <entry>int</entry>
+      <entry>format</entry>
+      <entry>8</entry>
+    </row>
+    <row>
+      <entry>char</entry>
+      <entry>data.b[20]</entry>
+      <entry>(read/write DATA : 20 byte)</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</table>
+
+
+
+
+
+<table frame="topbot" id="clientmessage_events_format_only_or_last_2">
+  <?dbfo keep-together="always" ?>
+  <title>The ClientMessage event's format (only or last)</title>
+  <tgroup cols="3" align='left' colsep='0' rowsep='0'>
+  <colspec colname="col1" colwidth='1.0*'/>
+  <colspec colname="col2" colwidth='1.0*' colsep="1"/>
+  <colspec colname="col3" colwidth="3.5*"/>
+  <spanspec namest="col1" nameend="col2" spanname="span-horiz"/>
+  <thead>
+    <row rowsep='1'>
+      <entry spanname="span-horiz" colsep='1'>Structure Member</entry>
+      <entry>Contents</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>int</entry>
+      <entry>type</entry>
+      <entry>ClientMessage</entry>
+    </row>
+    <row>
+      <entry>u_long</entry>
+      <entry>serial</entry>
+      <entry>Set by the X Window System</entry>
+    </row>
+    <row>
+      <entry>Bool</entry>
+      <entry>send_event</entry>
+      <entry>Set by the X Window System</entry>
+    </row>
+    <row>
+      <entry>Display</entry>
+      <entry>*display</entry>
+      <entry>The display to which connects</entry>
+    </row>
+    <row>
+      <entry>Window</entry>
+      <entry>window</entry>
+      <entry>IMS Window ID</entry>
+    </row>
+    <row>
+      <entry>Atom</entry>
+      <entry>message_type</entry>
+      <entry>XInternAtom(display, "_XIM_PROTOCOL", False)</entry>
+    </row>
+    <row>
+      <entry>int</entry>
+      <entry>format</entry>
+      <entry>8</entry>
+    </row>
+    <row>
+      <entry>char</entry>
+      <entry>data.b[20]</entry>
+      <entry>(read/write DATA : MAX 20 byte) (*1)</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</table>
+
+<para>
+(*1) If the data size is smaller than 20 bytes, all data other than available
+data must be 0.
+</para>
+
+<para>
+<emphasis role="bold">Property</emphasis>
+</para>
+
+<para>
+In the case of large data, data will be sent via the Window Property
+for the efficiency. There are the following two methods to notify
+Property, and transport-version is decided which method is used.
+</para>
+
+<itemizedlist>
+  <listitem>
+    <para>
+The XChangeProperty function is used to store data in the IMS
+communication window, and Atom of the property is sent via the
+ClientMessage event.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The XChangeProperty function is used to store data in the IMS
+communication window, and Atom of the property is sent via
+PropertyNotify event.
+    </para>
+  </listitem>
+</itemizedlist>
+
+<para>
+The arguments of the XChangeProperty are as follows:
+</para>
+
+<table frame="topbot" id="xchangeproperty_events_format_b">
+  <?dbfo keep-together="always" ?>
+  <title>The XChangeProperty event's format</title>
+  <tgroup cols="3" align='left' colsep='0' rowsep='0'>
+  <colspec colname="col1" colwidth='1.0*'/>
+  <colspec colname="col2" colwidth='1.0*' colsep="1"/>
+  <colspec colname="col3" colwidth="3.5*"/>
+  <spanspec namest="col1" nameend="col2" spanname="span-horiz" align="left"/>
+  <thead>
+    <row rowsep='1'>
+      <entry spanname="span-horiz" colsep='1'>Argument</entry>
+      <entry>Contents</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>Display</entry>
+      <entry>*display</entry>
+      <entry>The display to which connects</entry>
+    </row>
+    <row>
+      <entry>Window</entry>
+      <entry>window</entry>
+      <entry>IMS communication window ID</entry>
+    </row>
+    <row>
+      <entry>Atom</entry>
+      <entry>property</entry>
+      <entry>read/write property Atom (*1)</entry>
+    </row>
+    <row>
+      <entry>int</entry>
+      <entry>format</entry>
+      <entry>8</entry>
+    </row>
+    <row>
+      <entry>int</entry>
+      <entry>mode</entry>
+      <entry>PropModeAppend</entry>
+    </row>
+    <row>
+      <entry>u_char</entry>
+      <entry>*data</entry>
+      <entry>read/write DATA</entry>
+    </row>
+    <row>
+      <entry>int</entry>
+      <entry>nelements</entry>
+      <entry>length of DATA</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</table>
+
+<para>
+(*1) The read/write property ATOM allocates some strings, which are not
+allocated by the client, by <olink targetdoc='libX11' targetptr='XInternAtom'><function>XInternAtom</function></olink>.
+</para>
+
+<para>
+The IM Server changes the property with the mode of PropModeAppend and
+the client reads it with the delete mode, i.e. (delete = True).
+</para>
+
+<para>
+If Atom is notified via ClientMessage event, the format of the ClientMessage
+is as follows:
+</para>
+
+<table frame="topbot" id="clientmessage_events_format_to_send_atom_of_property_2">
+  <?dbfo keep-together="always" ?>
+  <title>The ClientMessage event's format to send Atom of property</title>
+  <tgroup cols="3" align='left' colsep='0' rowsep='0'>
+  <colspec colname="col1" colwidth='1.0*'/>
+  <colspec colname="col2" colwidth='1.0*' colsep="1"/>
+  <colspec colname="col3" colwidth="3.5*"/>
+  <spanspec namest="col1" nameend="col2" spanname="span-horiz"/>
+  <thead>
+    <row rowsep='1'>
+      <entry spanname="span-horiz" colsep='1'>Structure Member</entry>
+      <entry>Contents</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>int</entry>
+      <entry>type</entry>
+      <entry>ClientMessage</entry>
+    </row>
+    <row>
+      <entry>u_long</entry>
+      <entry>serial</entry>
+      <entry>Set by the X Window System</entry>
+    </row>
+    <row>
+      <entry>Bool</entry>
+      <entry>send_event</entry>
+      <entry>Set by the X Window System</entry>
+    </row>
+    <row>
+      <entry>Display</entry>
+      <entry>*display</entry>
+      <entry>The display to which connects</entry>
+    </row>
+    <row>
+      <entry>Window</entry>
+      <entry>window</entry>
+      <entry>IMS Window ID</entry>
+    </row>
+    <row>
+      <entry>Atom</entry>
+      <entry>message_type</entry>
+      <entry>XInternAtom(display, "_XIM_PROTOCOL", False)</entry>
+    </row>
+    <row>
+      <entry>int</entry>
+      <entry>format</entry>
+      <entry>8</entry>
+    </row>
+    <row>
+      <entry>long</entry>
+      <entry>data.1[0]</entry>
+      <entry>length of read/write property Atom</entry>
+    </row>
+    <row>
+      <entry>long</entry>
+      <entry>data.1[1]</entry>
+      <entry>read/write property Atom</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</table>
+
+</sect4>
+</sect3>
+<sect3 id="Closing_Connection">
+<title>Closing Connection</title>
+
+<para>
+If the client disconnect with the IM Server, shutdown function should
+free the communication window properties and etc..
+</para>
+
+</sect3>
+</sect2>
+</sect1>
+
+<sect1 id="References">
+<title>References</title>
+<para>
+[1] Masahiko Narita and Hideki Hiura, <emphasis remap='I'>"The Input Method Protocol"</emphasis>
+</para>
+</sect1>
+
+</chapter>
+</book>
diff --git a/specs/libX11/AppA.xml b/specs/libX11/AppA.xml
new file mode 100644 (file)
index 0000000..3ac6e86
--- /dev/null
@@ -0,0 +1,2111 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+         "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
+<appendix id="xlib_functions_and_protocol_requests">
+<title>Xlib Functions and Protocol Requests</title>
+<para>
+This appendix provides two tables that relate to Xlib functions
+and the X protocol.
+The following table lists each Xlib function (in alphabetical order)
+and the corresponding protocol request that it generates.
+</para>
+<table frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <title>Protocol requests made by each Xlib function</title>
+  <tgroup cols="2" align='left' colsep='0' rowsep='0'>
+  <colspec colname="col1" colwidth="1.0*"/>
+  <colspec colname="col2" colwidth="1.0*"/>
+    <thead>
+      <row rowsep='1'>
+       <entry>Xlib Function</entry>
+       <entry>Protocol Request</entry>
+      </row>
+    </thead>
+    <tbody>
+      <row>
+       <entry><xref linkend='XActivateScreenSaver' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ForceScreenSaver</systemitem></entry></row>
+      <row>
+       <entry><xref linkend='XAddHost' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeHosts</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XAddHosts' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeHosts</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XAddToSaveSet' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeSaveSet</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XAllocColor' xrefstyle='select: title'/></entry>
+       <entry><systemitem>AllocColor</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XAllocColorCells' xrefstyle='select: title'/></entry>
+       <entry><systemitem>AllocColorCells</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XAllocColorPlanes' xrefstyle='select: title'/></entry>
+       <entry><systemitem>AllocColorPlanes</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XAllocNamedColor' xrefstyle='select: title'/></entry>
+       <entry><systemitem>AllocNamedColor</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XAllowEvents' xrefstyle='select: title'/></entry>
+       <entry><systemitem>AllowEvents</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XAutoRepeatOff' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeKeyboardControl</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XAutoRepeatOn' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeKeyboardControl</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XBell' xrefstyle='select: title'/></entry>
+       <entry><systemitem>Bell</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XChangeActivePointerGrab' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeActivePointerGrab</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XChangeGC' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeGC</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XChangeKeyboardControl' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeKeyboardControl</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XChangeKeyboardMapping' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeKeyboardMapping</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XChangePointerControl' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangePointerControl</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XChangeProperty' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XChangeSaveSet' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeSaveSet</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XChangeWindowAttributes' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeWindowAttributes</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XCirculateSubwindows' xrefstyle='select: title'/></entry>
+       <entry><systemitem>CirculateWindow</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XCirculateSubwindowsDown' xrefstyle='select: title'/></entry>
+       <entry><systemitem>CirculateWindow</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XCirculateSubwindowsUp' xrefstyle='select: title'/></entry>
+       <entry><systemitem>CirculateWindow</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XClearArea' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ClearArea</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XClearWindow' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ClearArea</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XConfigureWindow' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ConfigureWindow</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XConvertSelection' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ConvertSelection</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XCopyArea' xrefstyle='select: title'/></entry>
+       <entry><systemitem>CopyArea</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XCopyColormapAndFree' xrefstyle='select: title'/></entry>
+       <entry><systemitem>CopyColormapAndFree</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XCopyGC' xrefstyle='select: title'/></entry>
+       <entry><systemitem>CopyGC</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XCopyPlane' xrefstyle='select: title'/></entry>
+       <entry><systemitem>CopyPlane</systemitem></entry>
+      </row>
+      <row>
+       <entry morerows="3"><xref linkend='XCreateBitmapFromData' xrefstyle='select: title'/></entry>
+       <entry><systemitem>CreateGC</systemitem></entry>
+      </row>
+      <row>
+
+       <entry><systemitem>CreatePixmap</systemitem></entry>
+      </row>
+      <row>
+
+       <entry><systemitem>FreeGC</systemitem></entry>
+      </row>
+      <row>
+
+       <entry><systemitem>PutImage</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XCreateColormap' xrefstyle='select: title'/></entry>
+       <entry><systemitem>CreateColormap</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XCreateFontCursor' xrefstyle='select: title'/></entry>
+       <entry><systemitem>CreateGlyphCursor</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XCreateGC' xrefstyle='select: title'/></entry>
+       <entry><systemitem>CreateGC</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XCreateGlyphCursor' xrefstyle='select: title'/></entry>
+       <entry><systemitem>CreateGlyphCursor</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XCreatePixmap' xrefstyle='select: title'/></entry>
+       <entry><systemitem>CreatePixmap</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XCreatePixmapCursor' xrefstyle='select: title'/></entry>
+       <entry><systemitem>CreateCursor</systemitem></entry>
+      </row>
+      <row>
+       <entry morerows="3"><function>XCreatePixmapFromData</function></entry>
+       <entry><systemitem>CreateGC</systemitem></entry>
+      </row>
+      <row>
+
+       <entry><systemitem>CreatePixmap</systemitem></entry>
+      </row>
+      <row>
+
+       <entry><systemitem>FreeGC</systemitem></entry>
+      </row>
+      <row>
+
+       <entry><systemitem>PutImage</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XCreateSimpleWindow' xrefstyle='select: title'/></entry>
+       <entry><systemitem>CreateWindow</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XCreateWindow' xrefstyle='select: title'/></entry>
+       <entry><systemitem>CreateWindow</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XDefineCursor' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeWindowAttributes</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XDeleteProperty' xrefstyle='select: title'/></entry>
+       <entry><systemitem>DeleteProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XDestroySubwindows' xrefstyle='select: title'/></entry>
+       <entry><systemitem>DestroySubwindows</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XDestroyWindow' xrefstyle='select: title'/></entry>
+       <entry><systemitem>DestroyWindow</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XDisableAccessControl' xrefstyle='select: title'/></entry>
+       <entry><systemitem>SetAccessControl</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XDrawArc' xrefstyle='select: title'/></entry>
+       <entry><systemitem>PolyArc</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XDrawArcs' xrefstyle='select: title'/></entry>
+       <entry><systemitem>PolyArc</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XDrawImageString' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ImageText8</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XDrawImageString16' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ImageText16</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XDrawLine' xrefstyle='select: title'/></entry>
+       <entry><systemitem>PolySegment</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XDrawLines' xrefstyle='select: title'/></entry>
+       <entry><systemitem>PolyLine</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XDrawPoint' xrefstyle='select: title'/></entry>
+       <entry><systemitem>PolyPoint</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XDrawPoints' xrefstyle='select: title'/></entry>
+       <entry><systemitem>PolyPoint</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XDrawRectangle' xrefstyle='select: title'/></entry>
+       <entry><systemitem>PolyRectangle</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XDrawRectangles' xrefstyle='select: title'/></entry>
+       <entry><systemitem>PolyRectangle</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XDrawSegments' xrefstyle='select: title'/></entry>
+       <entry><systemitem>PolySegment</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XDrawString' xrefstyle='select: title'/></entry>
+       <entry><systemitem>PolyText8</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XDrawString16' xrefstyle='select: title'/></entry>
+       <entry><systemitem>PolyText16</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XDrawText' xrefstyle='select: title'/></entry>
+       <entry><systemitem>PolyText8</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XDrawText16' xrefstyle='select: title'/></entry>
+       <entry><systemitem>PolyText16</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XEnableAccessControl' xrefstyle='select: title'/></entry>
+       <entry><systemitem>SetAccessControl</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XFetchBytes' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XFetchName' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XFillArc' xrefstyle='select: title'/></entry>
+       <entry><systemitem>PolyFillArc</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XFillArcs' xrefstyle='select: title'/></entry>
+       <entry><systemitem>PolyFillArc</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XFillPolygon' xrefstyle='select: title'/></entry>
+       <entry><systemitem>FillPoly</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XFillRectangle' xrefstyle='select: title'/></entry>
+       <entry><systemitem>PolyFillRectangle</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XFillRectangles' xrefstyle='select: title'/></entry>
+       <entry><systemitem>PolyFillRectangle</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XForceScreenSaver' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ForceScreenSaver</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XFreeColormap' xrefstyle='select: title'/></entry>
+       <entry><systemitem>FreeColormap</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XFreeColors' xrefstyle='select: title'/></entry>
+       <entry><systemitem>FreeColors</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XFreeCursor' xrefstyle='select: title'/></entry>
+       <entry><systemitem>FreeCursor</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XFreeFont' xrefstyle='select: title'/></entry>
+       <entry><systemitem>CloseFont</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XFreeGC' xrefstyle='select: title'/></entry>
+       <entry><systemitem>FreeGC</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XFreePixmap' xrefstyle='select: title'/></entry>
+       <entry><systemitem>FreePixmap</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGetAtomName' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetAtomName</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGetClassHint' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGetFontPath' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetFontPath</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGetGeometry' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetGeometry</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGetIconName' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGetIconSizes' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGetImage' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetImage</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGetInputFocus' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetInputFocus</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGetKeyboardControl' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetKeyboardControl</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGetKeyboardMapping' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetKeyboardMapping</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGetModifierMapping' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetModifierMapping</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGetMotionEvents' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetMotionEvents</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGetNormalHints' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGetPointerControl' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetPointerControl</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGetPointerMapping' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetPointerMapping</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGetRGBColormaps' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGetScreenSaver' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetScreenSaver</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGetSelectionOwner' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetSelectionOwner</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGetSizeHints' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGetTextProperty' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGetTransientForHint' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGetWMClientMachine' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry morerows="1"><xref linkend='XGetWMColormapWindows' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetProperty</systemitem></entry>
+      </row>
+      <row>
+
+       <entry><systemitem>InternAtom</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGetWMHints' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGetWMIconName' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGetWMName' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGetWMNormalHints' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry morerows="1"><xref linkend='XGetWMProtocols' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetProperty</systemitem></entry>
+      </row>
+      <row>
+
+       <entry><systemitem>InternAtom</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGetWMSizeHints' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry morerows="1"><xref linkend='XGetWindowAttributes' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetWindowAttributes</systemitem></entry>
+      </row>
+      <row>
+
+       <entry><systemitem>GetGeometry</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGetWindowProperty' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGetZoomHints' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGrabButton' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GrabButton</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGrabKey' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GrabKey</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGrabKeyboard' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GrabKeyboard</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGrabPointer' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GrabPointer</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XGrabServer' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GrabServer</systemitem></entry>
+      </row>
+      <row>
+       <entry morerows="1"><xref linkend='XIconifyWindow' xrefstyle='select: title'/></entry>
+       <entry><systemitem>InternAtom</systemitem></entry>
+      </row>
+      <row>
+
+       <entry><systemitem>SendEvent</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XInitExtension' xrefstyle='select: title'/></entry>
+       <entry><systemitem>QueryExtension</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XInstallColormap' xrefstyle='select: title'/></entry>
+       <entry><systemitem>InstallColormap</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XInternAtom' xrefstyle='select: title'/></entry>
+       <entry><systemitem>InternAtom</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XKillClient' xrefstyle='select: title'/></entry>
+       <entry><systemitem>KillClient</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XListExtensions' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ListExtensions</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XListFonts' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ListFonts</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XListFontsWithInfo' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ListFontsWithInfo</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XListHosts' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ListHosts</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XListInstalledColormaps' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ListInstalledColormaps</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XListProperties' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ListProperties</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XLoadFont' xrefstyle='select: title'/></entry>
+       <entry><systemitem>OpenFont</systemitem></entry>
+      </row>
+      <row>
+       <entry morerows="1"><xref linkend='XLoadQueryFont' xrefstyle='select: title'/></entry>
+       <entry><systemitem>OpenFont</systemitem></entry>
+      </row>
+      <row>
+
+       <entry><systemitem>QueryFont</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XLookupColor' xrefstyle='select: title'/></entry>
+       <entry><systemitem>LookupColor</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XLowerWindow' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ConfigureWindow</systemitem></entry>
+      </row>
+      <row>
+       <entry morerows="1"><xref linkend='XMapRaised' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ConfigureWindow</systemitem></entry>
+      </row>
+      <row>
+
+       <entry><systemitem>MapWindow</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XMapSubwindows' xrefstyle='select: title'/></entry>
+       <entry><systemitem>MapSubwindows</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XMapWindow' xrefstyle='select: title'/></entry>
+       <entry><systemitem>MapWindow</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XMoveResizeWindow' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ConfigureWindow</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XMoveWindow' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ConfigureWindow</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XNoOp' xrefstyle='select: title'/></entry>
+       <entry><systemitem>NoOperation</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XOpenDisplay' xrefstyle='select: title'/></entry>
+       <entry><systemitem>CreateGC</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XParseColor' xrefstyle='select: title'/></entry>
+       <entry><systemitem>LookupColor</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XPutImage' xrefstyle='select: title'/></entry>
+       <entry><systemitem>PutImage</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XQueryBestCursor' xrefstyle='select: title'/></entry>
+       <entry><systemitem>QueryBestSize</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XQueryBestSize' xrefstyle='select: title'/></entry>
+       <entry><systemitem>QueryBestSize</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XQueryBestStipple' xrefstyle='select: title'/></entry>
+       <entry><systemitem>QueryBestSize</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XQueryBestTile' xrefstyle='select: title'/></entry>
+       <entry><systemitem>QueryBestSize</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XQueryColor' xrefstyle='select: title'/></entry>
+       <entry><systemitem>QueryColors</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XQueryColors' xrefstyle='select: title'/></entry>
+       <entry><systemitem>QueryColors</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XQueryExtension' xrefstyle='select: title'/></entry>
+       <entry><systemitem>QueryExtension</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XQueryFont' xrefstyle='select: title'/></entry>
+       <entry><systemitem>QueryFont</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XQueryKeymap' xrefstyle='select: title'/></entry>
+       <entry><systemitem>QueryKeymap</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XQueryPointer' xrefstyle='select: title'/></entry>
+       <entry><systemitem>QueryPointer</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XQueryTextExtents' xrefstyle='select: title'/></entry>
+       <entry><systemitem>QueryTextExtents</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XQueryTextExtents16' xrefstyle='select: title'/></entry>
+       <entry><systemitem>QueryTextExtents</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XQueryTree' xrefstyle='select: title'/></entry>
+       <entry><systemitem>QueryTree</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XRaiseWindow' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ConfigureWindow</systemitem></entry>
+      </row>
+      <row>
+       <entry morerows="3"><xref linkend='XReadBitmapFile' xrefstyle='select: title'/></entry>
+       <entry><systemitem>CreateGC</systemitem></entry>
+      </row>
+      <row>
+
+       <entry><systemitem>CreatePixmap</systemitem></entry>
+      </row>
+      <row>
+
+       <entry><systemitem>FreeGC</systemitem></entry>
+      </row>
+      <row>
+
+       <entry><systemitem>PutImage</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XRecolorCursor' xrefstyle='select: title'/></entry>
+       <entry><systemitem>RecolorCursor</systemitem></entry>
+      </row>
+      <row>
+       <entry morerows="1"><xref linkend='XReconfigureWMWindow' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ConfigureWindow</systemitem></entry>
+      </row>
+      <row>
+
+       <entry><systemitem>SendEvent</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XRemoveFromSaveSet' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeSaveSet</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XRemoveHost' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeHosts</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XRemoveHosts' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeHosts</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XReparentWindow' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ReparentWindow</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XResetScreenSaver' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ForceScreenSaver</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XResizeWindow' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ConfigureWindow</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XRestackWindows' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ConfigureWindow</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XRotateBuffers' xrefstyle='select: title'/></entry>
+       <entry><systemitem>RotateProperties</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XRotateWindowProperties' xrefstyle='select: title'/></entry>
+       <entry><systemitem>RotateProperties</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSelectInput' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeWindowAttributes</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSendEvent' xrefstyle='select: title'/></entry>
+       <entry><systemitem>SendEvent</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetAccessControl' xrefstyle='select: title'/></entry>
+       <entry><systemitem>SetAccessControl</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetArcMode' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeGC</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetBackground' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeGC</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetClassHint' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetClipMask' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeGC</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetClipOrigin' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeGC</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetClipRectangles' xrefstyle='select: title'/></entry>
+       <entry><systemitem>SetClipRectangles</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetCloseDownMode' xrefstyle='select: title'/></entry>
+       <entry><systemitem>SetCloseDownMode</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetCommand' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetDashes' xrefstyle='select: title'/></entry>
+       <entry><systemitem>SetDashes</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetFillRule' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeGC</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetFillStyle' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeGC</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetFont' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeGC</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetFontPath' xrefstyle='select: title'/></entry>
+       <entry><systemitem>SetFontPath</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetForeground' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeGC</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetFunction' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeGC</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetGraphicsExposures' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeGC</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetIconName' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetIconSizes' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetInputFocus' xrefstyle='select: title'/></entry>
+       <entry><systemitem>SetInputFocus</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetLineAttributes' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeGC</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetModifierMapping' xrefstyle='select: title'/></entry>
+       <entry><systemitem>SetModifierMapping</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetNormalHints' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetPlaneMask' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeGC</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetPointerMapping' xrefstyle='select: title'/></entry>
+       <entry><systemitem>SetPointerMapping</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetRGBColormaps' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetScreenSaver' xrefstyle='select: title'/></entry>
+       <entry><systemitem>SetScreenSaver</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetSelectionOwner' xrefstyle='select: title'/></entry>
+       <entry><systemitem>SetSelectionOwner</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetSizeHints' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetStandardProperties' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetState' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeGC</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetStipple' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeGC</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetSubwindowMode' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeGC</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetTextProperty' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetTile' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeGC</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetTransientForHint' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetTSOrigin' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeGC</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetWMClientMachine' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry morerows="1"><xref linkend='XSetWMColormapWindows' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeProperty</systemitem></entry>
+      </row>
+      <row>
+
+       <entry><systemitem>InternAtom</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetWMHints' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetWMIconName' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetWMName' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetWMNormalHints' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetWMProperties' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry morerows="1"><xref linkend='XSetWMProtocols' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeProperty</systemitem></entry>
+      </row>
+      <row>
+
+       <entry><systemitem>InternAtom</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetWMSizeHints' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetWindowBackground' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeWindowAttributes</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetWindowBackgroundPixmap' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeWindowAttributes</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetWindowBorder' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeWindowAttributes</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetWindowBorderPixmap' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeWindowAttributes</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetWindowBorderWidth' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ConfigureWindow</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetWindowColormap' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeWindowAttributes</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSetZoomHints' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XStoreBuffer' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XStoreBytes' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XStoreColor' xrefstyle='select: title'/></entry>
+       <entry><systemitem>StoreColors</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XStoreColors' xrefstyle='select: title'/></entry>
+       <entry><systemitem>StoreColors</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XStoreName' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeProperty</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XStoreNamedColor' xrefstyle='select: title'/></entry>
+       <entry><systemitem>StoreNamedColor</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XSync' xrefstyle='select: title'/></entry>
+       <entry><systemitem>GetInputFocus</systemitem></entry>
+      </row>
+      <row>
+       <entry><function>XSynchronize</function></entry>
+       <entry><systemitem>GetInputFocus</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XTranslateCoordinates' xrefstyle='select: title'/></entry>
+       <entry><systemitem>TranslateCoordinates</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XUndefineCursor' xrefstyle='select: title'/></entry>
+       <entry><systemitem>ChangeWindowAttributes</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XUngrabButton' xrefstyle='select: title'/></entry>
+       <entry><systemitem>UngrabButton</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XUngrabKey' xrefstyle='select: title'/></entry>
+       <entry><systemitem>UngrabKey</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XUngrabKeyboard' xrefstyle='select: title'/></entry>
+       <entry><systemitem>UngrabKeyboard</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XUngrabPointer' xrefstyle='select: title'/></entry>
+       <entry><systemitem>UngrabPointer</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XUngrabServer' xrefstyle='select: title'/></entry>
+       <entry><systemitem>UngrabServer</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XUninstallColormap' xrefstyle='select: title'/></entry>
+       <entry><systemitem>UninstallColormap</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XUnloadFont' xrefstyle='select: title'/></entry>
+       <entry><systemitem>CloseFont</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XUnmapSubwindows' xrefstyle='select: title'/></entry>
+       <entry><systemitem>UnmapSubwindows</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XUnmapWindow' xrefstyle='select: title'/></entry>
+       <entry><systemitem>UnmapWindow</systemitem></entry>
+      </row>
+      <row>
+       <entry><xref linkend='XWarpPointer' xrefstyle='select: title'/></entry>
+       <entry><systemitem>WarpPointer</systemitem></entry>
+      </row>
+      <row>
+       <entry morerows="1"><xref linkend='XWithdrawWindow' xrefstyle='select: title'/></entry>
+       <entry><systemitem>SendEvent</systemitem></entry>
+      </row>
+      <row>
+
+       <entry><systemitem>UnmapWindow</systemitem></entry>
+      </row>
+    </tbody>
+  </tgroup>
+</table>
+<para>
+The following table lists each X protocol request (in alphabetical
+order) and the Xlib functions that reference it.
+</para>
+<table frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <title>Xlib functions which use each Protocol Request</title>
+  <tgroup cols="2" align='left' colsep='0' rowsep='0'>
+  <colspec colname="col1" colwidth="1.0*"/>
+  <colspec colname="col2" colwidth="1.0*"/>
+    <thead>
+      <row rowsep='1'>
+       <entry>Protocol Request</entry>
+       <entry>Xlib Function</entry>
+      </row>
+    </thead>
+    <tbody>
+      <row>
+       <entry><systemitem>AllocColor</systemitem></entry>
+       <entry><xref linkend='XAllocColor' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>AllocColorCells</systemitem></entry>
+       <entry><xref linkend='XAllocColorCells' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>AllocColorPlanes</systemitem></entry>
+       <entry><xref linkend='XAllocColorPlanes' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>AllocNamedColor</systemitem></entry>
+       <entry><xref linkend='XAllocNamedColor' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>AllowEvents</systemitem></entry>
+       <entry><xref linkend='XAllowEvents' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>Bell</systemitem></entry>
+       <entry><xref linkend='XBell' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>ChangeActivePointerGrab</systemitem></entry>
+       <entry><xref linkend='XChangeActivePointerGrab' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="17"><systemitem>ChangeGC</systemitem></entry>
+       <entry><xref linkend='XChangeGC' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetArcMode' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetBackground' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetClipMask' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetClipOrigin' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetFillRule' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetFillStyle' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetFont' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetForeground' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetFunction' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetGraphicsExposures' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetLineAttributes' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetPlaneMask' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetState' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetStipple' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetSubwindowMode' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetTile' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetTSOrigin' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="3"><systemitem>ChangeHosts</systemitem></entry>
+       <entry><xref linkend='XAddHost' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XAddHosts' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XRemoveHost' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XRemoveHosts' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="2"><systemitem>ChangeKeyboardControl</systemitem></entry>
+       <entry><xref linkend='XAutoRepeatOff' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XAutoRepeatOn' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XChangeKeyboardControl' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>ChangeKeyboardMapping</systemitem></entry>
+       <entry><xref linkend='XChangeKeyboardMapping' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>ChangePointerControl</systemitem></entry>
+       <entry><xref linkend='XChangePointerControl' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="23"><systemitem>ChangeProperty</systemitem></entry>
+       <entry><xref linkend='XChangeProperty' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetClassHint' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetCommand' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetIconName' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetIconSizes' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetNormalHints' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetRGBColormaps' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetSizeHints' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetStandardProperties' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetTextProperty' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetTransientForHint' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetWMClientMachine' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetWMColormapWindows' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetWMHints' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetWMIconName' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetWMName' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetWMNormalHints' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetWMProperties' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetWMProtocols' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetWMSizeHints' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetZoomHints' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XStoreBuffer' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XStoreBytes' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XStoreName' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="2"><systemitem>ChangeSaveSet</systemitem></entry>
+       <entry><xref linkend='XAddToSaveSet' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XChangeSaveSet' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XRemoveFromSaveSet' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="8"><systemitem>ChangeWindowAttributes</systemitem></entry>
+       <entry><xref linkend='XChangeWindowAttributes' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XDefineCursor' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSelectInput' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetWindowBackground' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetWindowBackgroundPixmap' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetWindowBorder' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetWindowBorderPixmap' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetWindowColormap' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XUndefineCursor' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="2"><systemitem>CirculateWindow</systemitem></entry>
+       <entry><xref linkend='XCirculateSubwindowsDown' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XCirculateSubwindowsUp' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XCirculateSubwindows' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="1"><systemitem>ClearArea</systemitem></entry>
+       <entry><xref linkend='XClearArea' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XClearWindow' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="1"><systemitem>CloseFont</systemitem></entry>
+       <entry><xref linkend='XFreeFont' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XUnloadFont' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="9"><systemitem>ConfigureWindow</systemitem></entry>
+       <entry><xref linkend='XConfigureWindow' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XLowerWindow' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XMapRaised' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XMoveResizeWindow' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XMoveWindow' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XRaiseWindow' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XReconfigureWMWindow' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XResizeWindow' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XRestackWindows' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetWindowBorderWidth' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>ConvertSelection</systemitem></entry>
+       <entry><xref linkend='XConvertSelection' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>CopyArea</systemitem></entry>
+       <entry><xref linkend='XCopyArea' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>CopyColormapAndFree</systemitem></entry>
+       <entry><xref linkend='XCopyColormapAndFree' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>CopyGC</systemitem></entry>
+       <entry><xref linkend='XCopyGC' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>CopyPlane</systemitem></entry>
+       <entry><xref linkend='XCopyPlane' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>CreateColormap</systemitem></entry>
+       <entry><xref linkend='XCreateColormap' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>CreateCursor</systemitem></entry>
+       <entry><xref linkend='XCreatePixmapCursor' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="4"><systemitem>CreateGC</systemitem></entry>
+       <entry><xref linkend='XCreateGC' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XCreateBitmapFromData' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><function>XCreatePixmapFromData</function></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XOpenDisplay' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XReadBitmapFile' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="1"><systemitem>CreateGlyphCursor</systemitem></entry>
+       <entry><xref linkend='XCreateFontCursor' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XCreateGlyphCursor' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="3"><systemitem>CreatePixmap</systemitem></entry>
+       <entry><xref linkend='XCreatePixmap' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XCreateBitmapFromData' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><function>XCreatePixmapFromData</function></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XReadBitmapFile' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="1"><systemitem>CreateWindow</systemitem></entry>
+       <entry><xref linkend='XCreateSimpleWindow' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XCreateWindow' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>DeleteProperty</systemitem></entry>
+       <entry><xref linkend='XDeleteProperty' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>DestroySubwindows</systemitem></entry>
+       <entry><xref linkend='XDestroySubwindows' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>DestroyWindow</systemitem></entry>
+       <entry><xref linkend='XDestroyWindow' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>FillPoly</systemitem></entry>
+       <entry><xref linkend='XFillPolygon' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="2"><systemitem>ForceScreenSaver</systemitem></entry>
+       <entry><xref linkend='XActivateScreenSaver' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XForceScreenSaver' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XResetScreenSaver' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>FreeColormap</systemitem></entry>
+       <entry><xref linkend='XFreeColormap' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>FreeColors</systemitem></entry>
+       <entry><xref linkend='XFreeColors' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>FreeCursor</systemitem></entry>
+       <entry><xref linkend='XFreeCursor' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="3"><systemitem>FreeGC</systemitem></entry>
+       <entry><xref linkend='XFreeGC' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XCreateBitmapFromData' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><function>XCreatePixmapFromData</function></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XReadBitmapFile' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>FreePixmap</systemitem></entry>
+       <entry><xref linkend='XFreePixmap' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>GetAtomName</systemitem></entry>
+       <entry><xref linkend='XGetAtomName' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>GetFontPath</systemitem></entry>
+       <entry><xref linkend='XGetFontPath' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="1"><systemitem>GetGeometry</systemitem></entry>
+       <entry><xref linkend='XGetGeometry' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XGetWindowAttributes' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>GetImage</systemitem></entry>
+       <entry><xref linkend='XGetImage' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="2"><systemitem>GetInputFocus</systemitem></entry>
+       <entry><xref linkend='XGetInputFocus' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSync' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><function>XSynchronize</function></entry>
+      </row>
+      <row>
+       <entry><systemitem>GetKeyboardControl</systemitem></entry>
+       <entry><xref linkend='XGetKeyboardControl' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>GetKeyboardMapping</systemitem></entry>
+       <entry><xref linkend='XGetKeyboardMapping' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>GetModifierMapping</systemitem></entry>
+       <entry><xref linkend='XGetModifierMapping' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>GetMotionEvents</systemitem></entry>
+       <entry><xref linkend='XGetMotionEvents' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>GetPointerControl</systemitem></entry>
+       <entry><xref linkend='XGetPointerControl' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>GetPointerMapping</systemitem></entry>
+       <entry><xref linkend='XGetPointerMapping' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="19"><systemitem>GetProperty</systemitem></entry>
+       <entry><xref linkend='XFetchBytes' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XFetchName' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XGetClassHint' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XGetIconName' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XGetIconSizes' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XGetNormalHints' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XGetRGBColormaps' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XGetSizeHints' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XGetTextProperty' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XGetTransientForHint' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XGetWMClientMachine' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XGetWMColormapWindows' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XGetWMHints' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XGetWMIconName' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XGetWMName' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XGetWMNormalHints' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XGetWMProtocols' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XGetWMSizeHints' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XGetWindowProperty' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XGetZoomHints' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>GetSelectionOwner</systemitem></entry>
+       <entry><xref linkend='XGetSelectionOwner' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>GetWindowAttributes</systemitem></entry>
+       <entry><xref linkend='XGetWindowAttributes' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>GrabButton</systemitem></entry>
+       <entry><xref linkend='XGrabButton' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>GrabKey</systemitem></entry>
+       <entry><xref linkend='XGrabKey' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>GrabKeyboard</systemitem></entry>
+       <entry><xref linkend='XGrabKeyboard' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>GrabPointer</systemitem></entry>
+       <entry><xref linkend='XGrabPointer' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>GrabServer</systemitem></entry>
+       <entry><xref linkend='XGrabServer' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>ImageText8</systemitem></entry>
+       <entry><xref linkend='XDrawImageString' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>ImageText16</systemitem></entry>
+       <entry><xref linkend='XDrawImageString16' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>InstallColormap</systemitem></entry>
+       <entry><xref linkend='XInstallColormap' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="5"><systemitem>InternAtom</systemitem></entry>
+       <entry><xref linkend='XGetWMColormapWindows' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XGetWMProtocols' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XIconifyWindow' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XInternAtom' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetWMColormapWindows' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetWMProtocols' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>KillClient</systemitem></entry>
+       <entry><xref linkend='XKillClient' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>ListExtensions</systemitem></entry>
+       <entry><xref linkend='XListExtensions' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>ListFonts</systemitem></entry>
+       <entry><xref linkend='XListFonts' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>ListFontsWithInfo</systemitem></entry>
+       <entry><xref linkend='XListFontsWithInfo' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>ListHosts</systemitem></entry>
+       <entry><xref linkend='XListHosts' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>ListInstalledColormaps</systemitem></entry>
+       <entry><xref linkend='XListInstalledColormaps' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>ListProperties</systemitem></entry>
+       <entry><xref linkend='XListProperties' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="1"><systemitem>LookupColor</systemitem></entry>
+       <entry><xref linkend='XLookupColor' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XParseColor' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>MapSubwindows</systemitem></entry>
+       <entry><xref linkend='XMapSubwindows' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="1"><systemitem>MapWindow</systemitem></entry>
+       <entry><xref linkend='XMapRaised' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XMapWindow' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>NoOperation</systemitem></entry>
+       <entry><xref linkend='XNoOp' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="1"><systemitem>OpenFont</systemitem></entry>
+       <entry><xref linkend='XLoadFont' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XLoadQueryFont' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="1"><systemitem>PolyArc</systemitem></entry>
+       <entry><xref linkend='XDrawArc' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XDrawArcs' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="1"><systemitem>PolyFillArc</systemitem></entry>
+       <entry><xref linkend='XFillArc' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XFillArcs' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="1"><systemitem>PolyFillRectangle</systemitem></entry>
+       <entry><xref linkend='XFillRectangle' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XFillRectangles' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>PolyLine</systemitem></entry>
+       <entry><xref linkend='XDrawLines' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="1"><systemitem>PolyPoint</systemitem></entry>
+       <entry><xref linkend='XDrawPoint' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XDrawPoints' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="1"><systemitem>PolyRectangle</systemitem></entry>
+       <entry><xref linkend='XDrawRectangle' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XDrawRectangles' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="1"><systemitem>PolySegment</systemitem></entry>
+       <entry><xref linkend='XDrawLine' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XDrawSegments' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="1"><systemitem>PolyText8</systemitem></entry>
+       <entry><xref linkend='XDrawString' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XDrawText' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="1"><systemitem>PolyText16</systemitem></entry>
+       <entry><xref linkend='XDrawString16' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XDrawText16' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="3"><systemitem>PutImage</systemitem></entry>
+       <entry><xref linkend='XPutImage' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XCreateBitmapFromData' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><function>XCreatePixmapFromData</function></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XReadBitmapFile' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="3"><systemitem>QueryBestSize</systemitem></entry>
+       <entry><xref linkend='XQueryBestCursor' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XQueryBestSize' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XQueryBestStipple' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XQueryBestTile' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="1"><systemitem>QueryColors</systemitem></entry>
+       <entry><xref linkend='XQueryColor' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XQueryColors' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="1"><systemitem>QueryExtension</systemitem></entry>
+       <entry><xref linkend='XInitExtension' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XQueryExtension' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="1"><systemitem>QueryFont</systemitem></entry>
+       <entry><xref linkend='XLoadQueryFont' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XQueryFont' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>QueryKeymap</systemitem></entry>
+       <entry><xref linkend='XQueryKeymap' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>QueryPointer</systemitem></entry>
+       <entry><xref linkend='XQueryPointer' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="1"><systemitem>QueryTextExtents</systemitem></entry>
+       <entry><xref linkend='XQueryTextExtents' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XQueryTextExtents16' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>QueryTree</systemitem></entry>
+       <entry><xref linkend='XQueryTree' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>RecolorCursor</systemitem></entry>
+       <entry><xref linkend='XRecolorCursor' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>ReparentWindow</systemitem></entry>
+       <entry><xref linkend='XReparentWindow' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="1"><systemitem>RotateProperties</systemitem></entry>
+       <entry><xref linkend='XRotateBuffers' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XRotateWindowProperties' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="3"><systemitem>SendEvent</systemitem></entry>
+       <entry><xref linkend='XIconifyWindow' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XReconfigureWMWindow' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSendEvent' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XWithdrawWindow' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="2"><systemitem>SetAccessControl</systemitem></entry>
+       <entry><xref linkend='XDisableAccessControl' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XEnableAccessControl' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetAccessControl' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>SetClipRectangles</systemitem></entry>
+       <entry><xref linkend='XSetClipRectangles' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>SetCloseDownMode</systemitem></entry>
+       <entry><xref linkend='XSetCloseDownMode' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>SetDashes</systemitem></entry>
+       <entry><xref linkend='XSetDashes' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>SetFontPath</systemitem></entry>
+       <entry><xref linkend='XSetFontPath' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>SetInputFocus</systemitem></entry>
+       <entry><xref linkend='XSetInputFocus' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>SetModifierMapping</systemitem></entry>
+       <entry><xref linkend='XSetModifierMapping' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>SetPointerMapping</systemitem></entry>
+       <entry><xref linkend='XSetPointerMapping' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="1"><systemitem>SetScreenSaver</systemitem></entry>
+       <entry><xref linkend='XGetScreenSaver' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XSetScreenSaver' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>SetSelectionOwner</systemitem></entry>
+       <entry><xref linkend='XSetSelectionOwner' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry morerows="1"><systemitem>StoreColors</systemitem></entry>
+       <entry><xref linkend='XStoreColor' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XStoreColors' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>StoreNamedColor</systemitem></entry>
+       <entry><xref linkend='XStoreNamedColor' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>TranslateCoordinates</systemitem></entry>
+       <entry><xref linkend='XTranslateCoordinates' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>UngrabButton</systemitem></entry>
+       <entry><xref linkend='XUngrabButton' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>UngrabKey</systemitem></entry>
+       <entry><xref linkend='XUngrabKey' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>UngrabKeyboard</systemitem></entry>
+       <entry><xref linkend='XUngrabKeyboard' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>UngrabPointer</systemitem></entry>
+       <entry><xref linkend='XUngrabPointer' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>UngrabServer</systemitem></entry>
+       <entry><xref linkend='XUngrabServer' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>UninstallColormap</systemitem></entry>
+       <entry><xref linkend='XUninstallColormap' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>UnmapSubwindows</systemitem></entry>
+       <entry><function>XUnmapSubWindows</function></entry>
+      </row>
+      <row>
+       <entry morerows="1"><systemitem>UnmapWindow</systemitem></entry>
+       <entry><xref linkend='XUnmapWindow' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+
+       <entry><xref linkend='XWithdrawWindow' xrefstyle='select: title'/></entry>
+      </row>
+      <row>
+       <entry><systemitem>WarpPointer</systemitem></entry>
+       <entry><xref linkend='XWarpPointer' xrefstyle='select: title'/></entry>
+      </row>
+    </tbody>
+  </tgroup>
+</table>
+</appendix>
diff --git a/specs/libX11/AppB.xml b/specs/libX11/AppB.xml
new file mode 100644 (file)
index 0000000..8c424bd
--- /dev/null
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+         "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
+<appendix id="x_font_cursors">
+<title>X Font Cursors</title>
+<para>
+The following are the available cursors that can be used with
+<xref linkend='XCreateFontCursor' xrefstyle='select: title'/>.
+</para>
+<literallayout class="monospaced">
+#define XC_X_cursor 0                     #define XC_ll_angle 76
+#define XC_arrow 2                        #define XC_lr_angle 78
+#define XC_based_arrow_down 4             #define XC_man 80
+#define XC_based_arrow_up 6               #define XC_middlebutton 82
+#define XC_boat 8                         #define XC_mouse 84
+#define XC_bogosity 10                    #define XC_pencil 86
+#define XC_bottom_left_corner 12          #define XC_pirate 88
+#define XC_bottom_right_corner 14         #define XC_plus 90
+#define XC_bottom_side 16                 #define XC_question_arrow 92
+#define XC_bottom_tee 18                  #define XC_right_ptr 94
+#define XC_box_spiral 20                  #define XC_right_side 96
+#define XC_center_ptr 22                  #define XC_right_tee 98
+#define XC_circle 24                      #define XC_rightbutton 100
+#define XC_clock 26                       #define XC_rtl_logo 102
+#define XC_coffee_mug 28                  #define XC_sailboat 104
+#define XC_cross 30                       #define XC_sb_down_arrow 106
+#define XC_cross_reverse 32               #define XC_sb_h_double_arrow 108
+#define XC_crosshair 34                   #define XC_sb_left_arrow 110
+#define XC_diamond_cross 36               #define XC_sb_right_arrow 112
+#define XC_dot 38                         #define XC_sb_up_arrow 114
+#define XC_dot_box_mask 40                #define XC_sb_v_double_arrow 116
+#define XC_double_arrow 42                #define XC_shuttle 118
+#define XC_draft_large 44                 #define XC_sizing 120
+#define XC_draft_small 46                 #define XC_spider 122
+#define XC_draped_box 48                  #define XC_spraycan 124
+#define XC_exchange 50                    #define XC_star 126
+#define XC_fleur 52                       #define XC_target 128
+#define XC_gobbler 54                     #define XC_tcross 130
+#define XC_gumby 56                       #define XC_top_left_arrow 132
+#define XC_hand1 58                       #define XC_top_left_corner 134
+#define XC_hand2 60                       #define XC_top_right_corner 136
+#define XC_heart 62                       #define XC_top_side 138
+#define XC_icon 64                        #define XC_top_tee 140
+#define XC_iron_cross 66                  #define XC_trek 142
+#define XC_left_ptr 68                    #define XC_ul_angle 144
+#define XC_left_side 70                   #define XC_umbrella 146
+#define XC_left_tee 72                    #define XC_ur_angle 148
+#define XC_leftbutton 74                  #define XC_watch 150
+                                          #define XC_xterm 152
+</literallayout>
+</appendix>
+
diff --git a/specs/libX11/AppC.xml b/specs/libX11/AppC.xml
new file mode 100644 (file)
index 0000000..df25027
--- /dev/null
@@ -0,0 +1,3328 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+         "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
+<appendix id="extensions">
+<title>Extensions</title>
+<para>
+<!-- .XE -->
+Because X can evolve by extensions to the core protocol, 
+it is important that extensions not be perceived as second-class citizens.
+At some point, 
+your favorite extensions may be adopted as additional parts of the 
+X Standard.
+</para>
+<para>
+<!-- .LP -->
+Therefore, there should be little to distinguish the use of an extension from 
+that of the core protocol.
+To avoid having to initialize extensions explicitly in application programs, 
+it is also important that extensions perform lazy evaluations,
+automatically initializing themselves when called for the first time.  
+</para>
+<para>
+<!-- .LP -->
+This appendix describes techniques for writing extensions to Xlib that will
+run at essentially the same performance as the core protocol requests.
+</para>
+<!-- .NT -->
+<note><para>
+It is expected that a given extension to X consists of multiple
+requests.
+Defining 10 new features as 10 separate extensions is a bad practice.
+Rather, they should be packaged into a single extension
+and should use minor opcodes to distinguish the requests.
+</para></note>
+<!-- .NE -->
+<para>
+<!-- .LP -->
+The symbols and macros used for writing stubs to Xlib are listed in
+<filename class="headerfile">&lt;X11/Xlibint.h&gt;</filename>.
+</para>
+<sect1 id="Basic_Protocol_Support_Routines">
+<title>Basic Protocol Support Routines</title>
+<para>
+The basic protocol requests for extensions are 
+<xref linkend='XQueryExtension' xrefstyle='select: title'/>
+and
+<xref linkend='XListExtensions' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XQueryExtension</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XQueryExtension'>
+<funcprototype>
+  <funcdef>Bool <function>XQueryExtension</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>char<parameter> *name</parameter></paramdef>
+  <paramdef>int<parameter> *major_opcode_return</parameter></paramdef>
+  <paramdef>int<parameter> *first_event_return</parameter></paramdef>
+  <paramdef>int<parameter> *first_error_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>display</term>
+    <listitem>
+      <para>Specifies the connection to the X server.</para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>name</term>
+    <listitem>
+      <para>Specifies the extension name.</para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>major_opcode_return</term>
+    <listitem>
+      <para>Returns the major opcode.</para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>first_event_return</term>
+    <listitem>
+      <para>Returns the first event code, if any.</para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>first_error_return</term>
+    <listitem>
+      <para>Returns the first error code, if any.</para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XQueryExtension' xrefstyle='select: title'/>
+function determines if the named extension is present.  
+If the extension is not present,
+<xref linkend='XQueryExtension' xrefstyle='select: title'/>
+returns
+<symbol>False</symbol>;
+otherwise, it returns
+<symbol>True</symbol>.
+If the extension is present,
+<xref linkend='XQueryExtension' xrefstyle='select: title'/>
+returns the major opcode for the extension to major_opcode_return;
+otherwise,
+it returns zero.
+Any minor opcode and the request formats are specific to the
+extension.  
+If the extension involves additional event types, 
+<xref linkend='XQueryExtension' xrefstyle='select: title'/>
+returns the base event type code to first_event_return;
+otherwise, 
+it returns zero.  
+The format of the events is specific to the extension.  
+If the extension involves additional error codes, 
+<xref linkend='XQueryExtension' xrefstyle='select: title'/>
+returns the base error code to first_error_return;
+otherwise, 
+it returns zero.  
+The format of additional data in the errors is specific to the extension.
+</para>
+<para>
+<!-- .LP -->
+If the extension name is not in the Host Portable Character Encoding
+the result is implementation-dependent.
+Uppercase and lowercase matter;
+the strings ``thing'', ``Thing'', and ``thinG'' 
+are all considered different names.
+</para>
+<indexterm significance="preferred"><primary>XListExtensions</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XListExtensions'>
+<funcprototype>
+  <funcdef>char **<function>XListExtensions</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> *nextensions_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nextensions_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the number of extensions listed.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XListExtensions' xrefstyle='select: title'/>
+function returns a list of all extensions supported by the server.
+If the data returned by the server is in the Latin Portable Character Encoding,
+then the returned strings are in the Host Portable Character Encoding.
+Otherwise, the result is implementation-dependent.
+</para>
+<indexterm significance="preferred"><primary>XFreeExtensionList</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XFreeExtensionList'>
+<funcprototype>
+  <funcdef><function>XFreeExtensionList</function></funcdef>
+  <paramdef>char<parameter> **list</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>list</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the list of extension names.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XFreeExtensionList' xrefstyle='select: title'/>
+function frees the memory allocated by 
+<xref linkend='XListExtensions' xrefstyle='select: title'/>.
+</para>
+</sect1>
+<sect1 id="Hooking_into_Xlib">
+<title>Hooking into Xlib</title>
+<para>
+<!-- .LP -->
+These functions allow you to hook into the library.  
+They are not normally used by application programmers but are used 
+by people who need to extend the core X protocol and
+the X library interface.
+The functions, which generate protocol requests for X, are typically
+called stubs.
+</para>
+<para>
+<!-- .LP -->
+In extensions, stubs first should check to see if they have initialized 
+themselves on a connection.
+If they have not, they then should call 
+<xref linkend='XInitExtension' xrefstyle='select: title'/>
+to attempt to initialize themselves on the connection.
+</para>
+<para>
+<!-- .LP -->
+If the extension needs to be informed of GC/font allocation or
+deallocation or if the extension defines new event types, 
+the functions described here allow the extension to be 
+called when these events occur.
+</para>
+<para>
+<!-- .LP -->
+The
+<structname>XExtCodes</structname>
+structure returns the information from 
+<xref linkend='XInitExtension' xrefstyle='select: title'/>
+and is defined in
+<filename class="headerfile">&lt;X11/Xlib.h&gt;</filename>:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XExtCodes</primary></indexterm>
+<!-- .sM -->
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+<synopsis>
+typedef struct _XExtCodes {    /* public to extension, cannot be changed */
+       int extension;          /* extension number */
+       int major_opcode;       /* major op-code assigned by server */
+       int first_event;        /* first event number for the extension */
+       int first_error;        /* first error number for the extension */
+} XExtCodes;
+</synopsis>
+</para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>XInitExtension</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XInitExtension'>
+<funcprototype>
+  <funcdef>XExtCodes *<function>XInitExtension</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>char<parameter> *name</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>name</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the extension name.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XInitExtension' xrefstyle='select: title'/>
+function determines if the named extension exists. 
+Then, it allocates storage for maintaining the 
+information about the extension on the connection, 
+chains this onto the extension list for the connection,
+and returns the information the stub implementor will need to access
+the extension.
+If the extension does not exist,
+<xref linkend='XInitExtension' xrefstyle='select: title'/>
+returns NULL.
+</para>
+<para>
+<!-- .LP -->
+If the extension name is not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+Uppercase and lowercase matter;
+the strings ``thing'', ``Thing'', and ``thinG'' 
+are all considered different names.
+</para>
+<para>
+<!-- .LP -->
+The extension number in the 
+<structname>XExtCodes</structname>
+structure is
+needed in the other calls that follow.  
+This extension number is unique only to a single connection.
+</para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XAddExtension</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XAddExtension'>
+<funcprototype>
+  <funcdef>XExtCodes *<function>XAddExtension</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+For local Xlib extensions, the
+<xref linkend='XAddExtension' xrefstyle='select: title'/>
+function allocates the
+<structname>XExtCodes</structname>
+structure, bumps the extension number count,
+and chains the extension onto the extension list.
+(This permits extensions to Xlib without requiring server extensions.)
+</para>
+<sect2 id="Hooks_into_the_Library">
+<title>Hooks into the Library</title>
+<para>
+<!-- .LP -->
+These functions allow you to define procedures that are to be
+called when various circumstances occur.
+The procedures include the creation of a new GC for a connection,
+the copying of a GC, the freeing of a GC, the creating and freeing of fonts,
+the conversion of events defined by extensions to and from wire
+format, and the handling of errors.
+</para>
+<para>
+<!-- .LP -->
+All of these functions return the previous procedure defined for this
+extension.
+</para>
+<indexterm significance="preferred"><primary>XESetCloseDisplay</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XESetCloseDisplay'>
+<funcprototype>
+  <funcdef>int <function>XESetCloseDisplay</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> extension</parameter></paramdef>
+  <paramdef>int<parameter> (*proc)()</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>extension</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the extension number.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>proc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the procedure to call when the display is closed.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XESetCloseDisplay' xrefstyle='select: title'/>
+function defines a procedure to be called whenever
+<function>XCloseDisplay</function>
+is called.  
+It returns any previously defined procedure, usually NULL.
+</para>
+<para>
+<!-- .LP -->
+When 
+<function>XCloseDisplay</function>
+is called, 
+your procedure is called 
+with these arguments:
+<funcsynopsis>
+<funcprototype>
+  <funcdef>int <function>(*<replaceable>proc</replaceable>)</function></funcdef>
+  <paramdef>Display *<parameter>display</parameter></paramdef>
+  <paramdef>XExtCodes *<parameter>codes</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+</para>
+<indexterm significance="preferred"><primary>XESetCreateGC</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XESetCreateGC'>
+<funcprototype>
+  <funcdef>int *<function>XESetCreateGC</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> extension</parameter></paramdef>
+  <paramdef>int<parameter> (*proc)()</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>extension</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the extension number.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>proc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the procedure to call when a GC is closed.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XESetCreateGC' xrefstyle='select: title'/>
+function defines a procedure to be called whenever
+a new GC is created.  
+It returns any previously defined procedure, usually NULL.
+</para>
+<para>
+<!-- .LP -->
+When a GC is created, 
+your procedure is called with these arguments:
+<!-- .LP -->
+<!-- .sM -->
+<funcsynopsis>
+<funcprototype>
+  <funcdef>int <function>(*<replaceable>proc</replaceable>)</function></funcdef>
+  <paramdef>Display *<parameter>display</parameter></paramdef>
+  <paramdef>GC <parameter>gc</parameter></paramdef>
+  <paramdef>XExtCodes *<parameter>codes</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+</para>
+<indexterm significance="preferred"><primary>XESetCopyGC</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XESetCopyGC'>
+<funcprototype>
+  <funcdef>int *<function>XESetCopyGC</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> extension</parameter></paramdef>
+  <paramdef>int<parameter> (*proc)()</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>extension</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the extension number.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>proc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the procedure to call when GC components are copied.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XESetCopyGC' xrefstyle='select: title'/>
+function defines a procedure to be called whenever
+a GC is copied.  
+It returns any previously defined procedure, usually NULL.
+</para>
+<para>
+<!-- .LP -->
+When a GC is copied, 
+your procedure is called with these arguments:
+<funcsynopsis>
+<funcprototype>
+  <funcdef>int <function>(*<replaceable>proc</replaceable>)</function></funcdef>
+  <paramdef>Display *<parameter>display</parameter></paramdef>
+  <paramdef>GC <parameter>gc</parameter></paramdef>
+  <paramdef>XExtCodes *<parameter>codes</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+</para>
+<funcsynopsis id='XESetFreeGC'>
+<funcprototype>
+  <funcdef>int *<function>XESetFreeGC</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> extension</parameter></paramdef>
+  <paramdef>int<parameter> (*proc)()</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>extension</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the extension number.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>proc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the procedure to call when a GC is freed.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The
+<xref linkend='XESetFreeGC' xrefstyle='select: title'/>
+function defines a procedure to be called whenever
+a GC is freed.  
+It returns any previously defined procedure, usually NULL.
+</para>
+<para>
+<!-- .LP -->
+When a GC is freed, 
+your procedure is called with these arguments:
+<!-- .LP -->
+<!-- .sM -->
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+<!-- .R -->
+<funcsynopsis>
+<funcprototype>
+  <funcdef>int <function>(*<replaceable>proc</replaceable>)</function></funcdef>
+  <paramdef>Display *<parameter>display</parameter></paramdef>
+  <paramdef>GC <parameter>gc</parameter></paramdef>
+  <paramdef>XExtCodes *<parameter>codes</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+</para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>XESetCreateFont</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XESetCreateFont'>
+<funcprototype>
+  <funcdef>int *<function>XESetCreateFont</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> extension</parameter></paramdef>
+  <paramdef>int<parameter> (*proc)()</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>extension</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the extension number.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>proc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the procedure to call when a font is created.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XESetCreateFont' xrefstyle='select: title'/>
+function defines a procedure to be called whenever
+<xref linkend='XLoadQueryFont' xrefstyle='select: title'/>
+and
+<xref linkend='XQueryFont' xrefstyle='select: title'/>
+are called.  
+It returns any previously defined procedure, usually NULL.
+</para>
+<para>
+<!-- .LP -->
+When 
+<xref linkend='XLoadQueryFont' xrefstyle='select: title'/>
+or
+<xref linkend='XQueryFont' xrefstyle='select: title'/>
+is called, 
+your procedure is called with these arguments:
+<!-- .LP -->
+<!-- .sM -->
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+<!-- .R -->
+<funcsynopsis>
+<funcprototype>
+  <funcdef>int <function>(*<replaceable>proc</replaceable>)</function></funcdef>
+  <paramdef>Display *<parameter>display</parameter></paramdef>
+  <paramdef>XFontStruct *<parameter>fs</parameter></paramdef>
+  <paramdef>XExtCodes *<parameter>codes</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+</para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>XESetFreeFont</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XESetFreeFont'>
+<funcprototype>
+  <funcdef>int *<function>XESetFreeFont</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> extension</parameter></paramdef>
+  <paramdef>int<parameter> (*proc)()</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>extension</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the extension number.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>proc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the procedure to call when a font is freed.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XESetFreeFont' xrefstyle='select: title'/>
+function defines a procedure to be called whenever
+<xref linkend='XFreeFont' xrefstyle='select: title'/>
+is called.  
+It returns any previously defined procedure, usually NULL.
+</para>
+<para>
+<!-- .LP -->
+When 
+<xref linkend='XFreeFont' xrefstyle='select: title'/>
+is called, your procedure is called with these arguments:
+<!-- .LP -->
+<!-- .sM -->
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+<!-- .R -->
+<funcsynopsis>
+<funcprototype>
+  <funcdef>int <function>(*<replaceable>proc</replaceable>)</function></funcdef>
+  <paramdef>Display *<parameter>display</parameter></paramdef>
+  <paramdef>XFontStruct *<parameter>fs</parameter></paramdef>
+  <paramdef>XExtCodes *<parameter>codes</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The 
+<xref linkend='XESetWireToEvent' xrefstyle='select: title'/>
+and
+<xref linkend='XESetEventToWire' xrefstyle='select: title'/>
+functions allow you to define new events to the library.
+An 
+<structname>XEvent</structname>
+structure always has a type code (type
+<type>int</type>)
+as the first component.
+This uniquely identifies what kind of event it is.
+The second component is always the serial number (type
+<type>unsigned</type>
+<type>long</type>)
+of the last request processed by the server.
+The third component is always a Boolean (type
+<type>Bool</type>)
+indicating whether the event came from a
+<systemitem>SendEvent</systemitem>
+protocol request.
+The fourth component is always a pointer to the display
+the event was read from.
+The fifth component is always a resource ID of one kind or another,
+usually a window, carefully selected to be useful to toolkit dispatchers.
+The fifth component should always exist, even if
+the event does not have a natural destination;
+if there is no value
+from the protocol to put in this component, initialize it to zero.
+<!-- .NT -->
+There is an implementation limit such that your host event
+structure size cannot be bigger than the size of the
+<structname>XEvent</structname>
+union of structures.
+There also is no way to guarantee that more than 24 elements or 96 characters
+in the structure will be fully portable between machines.
+</para>
+<!-- .NE -->
+<indexterm significance="preferred"><primary>XESetWireToEvent</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XESetWireToEvent'>
+<funcprototype>
+  <funcdef>int *<function>XESetWireToEvent</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> event_number</parameter></paramdef>
+  <paramdef>Status<parameter> (*proc)()</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event_number</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the event code.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>proc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the procedure to call when converting an event.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XESetWireToEvent' xrefstyle='select: title'/>
+function defines a procedure to be called when an event
+needs to be converted from wire format 
+(<structname>xEvent</structname>)
+to host format 
+(<structname>XEvent</structname>).
+The event number defines which protocol event number to install a
+conversion procedure for.
+<xref linkend='XESetWireToEvent' xrefstyle='select: title'/>
+returns any previously defined procedure.
+<!-- .NT -->
+You can replace a core event conversion function with one
+of your own, although this is not encouraged.
+It would, however, allow you to intercept a core event 
+and modify it before being placed in the queue or otherwise examined.
+<!-- .NE -->
+When Xlib needs to convert an event from wire format to host
+format, your procedure is called with these arguments:
+<!-- .LP -->
+<!-- .sM -->
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+<!-- .R -->
+<funcsynopsis>
+<funcprototype>
+  <funcdef>int <function>(*<replaceable>proc</replaceable>)</function></funcdef>
+  <paramdef>Display *<parameter>display</parameter></paramdef>
+  <paramdef>XEvent *<parameter>re</parameter></paramdef>
+  <paramdef>xEvent *<parameter>event</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .LP -->
+<!-- .eM -->
+Your procedure must return status to indicate if the conversion succeeded.
+The re argument is a pointer to where the host format event should be stored,
+and the event argument is the 32-byte wire event structure.
+In the 
+<structname>XEvent</structname>
+structure you are creating, 
+you must fill in the five required members of the event structure.
+You should fill in the type member with the type specified for the 
+<structname>xEvent</structname>
+structure.
+You should copy all other members from the 
+<structname>xEvent</structname>
+structure (wire format) to the
+<structname>XEvent</structname>
+structure (host format).
+Your conversion procedure should return 
+<symbol>True</symbol>
+if the event should be placed in the queue or
+<symbol>False</symbol>
+if it should not be placed in the queue.
+</para>
+<para>
+<!-- .LP -->
+To initialize the serial number component of the event, call
+<xref linkend='_XSetLastRequestRead' xrefstyle='select: title'/>
+with the event and use the return value.
+</para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>_XSetLastRequestRead</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='_XSetLastRequestRead'>
+<funcprototype>
+  <funcdef>unsigned long<function>_XSetLastRequestRead</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>xGenericReply<parameter> *rep</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>rep</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the wire event structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='_XSetLastRequestRead' xrefstyle='select: title'/>
+function computes and returns a complete serial number from the partial
+serial number in the event.
+<!-- .sp -->
+</para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XESetEventToWire</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XESetEventToWire'>
+<funcprototype>
+  <funcdef>Status *<function>XESetEventToWire</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> event_number</parameter></paramdef>
+  <paramdef>int<parameter> (*proc)()</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event_number</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the event code.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>proc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the procedure to call when converting an event.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XESetEventToWire' xrefstyle='select: title'/>
+function defines a procedure to be called when an event
+needs to be converted from host format
+(<structname>XEvent</structname>)
+to wire format
+(<structname>xEvent</structname>)
+form.  
+The event number defines which protocol event number to install a
+conversion procedure for.
+<xref linkend='XESetEventToWire' xrefstyle='select: title'/>
+returns any previously defined procedure.
+It returns zero if the conversion fails or nonzero otherwise.
+<!-- .NT -->
+You can replace a core event conversion function with one
+of your own, although this is not encouraged.  
+It would, however, allow you to intercept a core event 
+and modify it before being sent to another client.
+<!-- .NE -->
+When Xlib needs to convert an event from host format to wire format, 
+your procedure is called with these arguments:
+<!-- .LP -->
+<!-- .sM -->
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+<!-- .R -->
+<funcsynopsis>
+<funcprototype>
+  <funcdef>int <function>(*<replaceable>proc</replaceable>)</function></funcdef>
+  <paramdef>Display *<parameter>display</parameter></paramdef>
+  <paramdef>XEvent *<parameter>re</parameter></paramdef>
+  <paramdef>xEvent *<parameter>event</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .LP -->
+<!-- .eM -->
+The re argument is a pointer to the host format event,
+and the event argument is a pointer to where the 32-byte wire event 
+structure should be stored.
+You should fill in the type with the type from the 
+<structname>XEvent</structname>
+structure.
+All other members then should be copied from the host format to the 
+<structname>xEvent</structname>
+structure.
+</para>
+<indexterm significance="preferred"><primary>XESetWireToError</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XESetWireToError'>
+<funcprototype>
+  <funcdef>Bool *<function>XESetWireToError</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> error_number</parameter></paramdef>
+  <paramdef>Bool<parameter> (*proc)()</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>error_number</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the error code.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>proc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the procedure to call when an error is received.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XESetWireToError' xrefstyle='select: title'/>
+function defines a procedure to be called when an extension
+error needs to be converted from wire format to host format.
+The error number defines which protocol error code to install
+the conversion procedure for.
+<xref linkend='XESetWireToError' xrefstyle='select: title'/>
+returns any previously defined procedure.
+</para>
+<para>
+<!-- .LP -->
+Use this function for extension errors that contain additional error values
+beyond those in a core X error, when multiple wire errors must be combined
+into a single Xlib error, or when it is necessary to intercept an
+X error before it is otherwise examined.
+</para>
+<para>
+<!-- .LP -->
+When Xlib needs to convert an error from wire format to host format,
+the procedure is called with these arguments:
+<!-- .LP -->
+<!-- .sM -->
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+<!-- .R -->
+<funcsynopsis>
+<funcprototype>
+  <funcdef>int <function>(*<replaceable>proc</replaceable>)</function></funcdef>
+  <paramdef>Display *<parameter>display</parameter></paramdef>
+  <paramdef>XErrorEvent *<parameter>he</parameter></paramdef>
+  <paramdef>xError *<parameter>we</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .LP -->
+<!-- .eM -->
+The he argument is a pointer to where the host format error should be stored.
+The structure pointed at by he is guaranteed to be as large as an
+<structname>XEvent</structname>
+structure and so can be cast to a type larger than an
+<structname>XErrorEvent</structname>
+to store additional values.
+If the error is to be completely ignored by Xlib
+(for example, several protocol error structures will be combined into
+one Xlib error),
+then the function should return
+<symbol>False</symbol>;
+otherwise, it should return
+<symbol>True</symbol>.
+</para>
+<indexterm significance="preferred"><primary>XESetError</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XESetError'>
+<funcprototype>
+  <funcdef>int *<function>XESetError</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> extension</parameter></paramdef>
+  <paramdef>int<parameter> (*proc)()</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>extension</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the extension number.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>proc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the procedure to call when an error is received.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+Inside Xlib, there are times that you may want to suppress the
+calling of the external error handling when an error occurs.
+This allows status to be returned on a call at the cost of the call
+being synchronous (though most such functions are query operations, in any
+case, and are typically programmed to be synchronous).
+</para>
+<para>
+<!-- .LP -->
+When Xlib detects a protocol error in 
+<xref linkend='_XReply' xrefstyle='select: title'/>,
+it calls your procedure with these arguments:
+<!-- .LP -->
+<!-- .sM -->
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+<!-- .R -->
+<funcsynopsis>
+<funcprototype>
+  <funcdef>int <function>(*<replaceable>proc</replaceable>)</function></funcdef>
+  <paramdef>Display *<parameter>display</parameter></paramdef>
+  <paramdef>xError *<parameter>err</parameter></paramdef>
+  <paramdef>XExtCodes *<parameter>codes</parameter></paramdef>
+  <paramdef>int *<parameter>ret_code</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .LP -->
+<!-- .eM -->
+The err argument is a pointer to the 32-byte wire format error.
+The codes argument is a pointer to the extension codes structure.
+The ret_code argument is the return code you may want 
+<xref linkend='_XReply' xrefstyle='select: title'/>
+returned to.
+</para>
+<para>
+<!-- .LP -->
+If your procedure returns a zero value, 
+the error is not suppressed, and 
+the client's error handler is called.
+(For further information,
+see <link linkend="Using_the_Default_Error_Handlers">section 11.8.2</link>.)
+If your procedure returns nonzero, 
+the error is suppressed, and 
+<xref linkend='_XReply' xrefstyle='select: title'/>
+returns the value of ret_code.
+</para>
+<indexterm significance="preferred"><primary>XESetErrorString</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XESetErrorString'>
+<funcprototype>
+  <funcdef>char *<function>XESetErrorString</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> extension</parameter></paramdef>
+  <paramdef>char<parameter> *(*proc)()</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>extension</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the extension number.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>proc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the procedure to call to obtain an error string.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The 
+<xref linkend='XGetErrorText' xrefstyle='select: title'/>
+function returns a string to the user for an error.
+<xref linkend='XESetErrorString' xrefstyle='select: title'/>
+allows you to define a procedure to be called that
+should return a pointer to the error message.
+The following is an example.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sM -->
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+<!-- .R -->
+<funcsynopsis>
+<funcprototype>
+  <funcdef>int <function>(*<replaceable>proc</replaceable>)</function></funcdef>
+  <paramdef>Display *<parameter>display</parameter></paramdef>
+  <paramdef>int <parameter>code</parameter></paramdef>
+  <paramdef>XExtCodes *<parameter>codes</parameter></paramdef>
+  <paramdef>char *<parameter>buffer</parameter></paramdef>
+  <paramdef>int <parameter>nbytes</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .LP -->
+<!-- .eM -->
+Your procedure is called with the error code for every error detected.
+You should copy nbytes of a null-terminated string containing the
+error message into buffer.
+</para>
+<indexterm significance="preferred"><primary>XESetPrintErrorValues</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XESetPrintErrorValues'>
+<funcprototype>
+  <funcdef>void *<function>XESetPrintErrorValues</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> extension</parameter></paramdef>
+  <paramdef>void<parameter> (*proc)()</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>extension</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the extension number.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>proc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the procedure to call when an error is printed.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XESetPrintErrorValues' xrefstyle='select: title'/>
+function defines a procedure to be called when an extension
+error is printed, to print the error values.
+Use this function for extension errors that contain additional error values
+beyond those in a core X error.
+It returns any previously defined procedure.
+</para>
+<para>
+<!-- .LP -->
+When Xlib needs to print an error,
+the procedure is called with these arguments:
+<!-- .LP -->
+<!-- .sM -->
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+<!-- .R -->
+<funcsynopsis>
+<funcprototype>
+  <funcdef>void <function>(*<replaceable>proc</replaceable>)</function></funcdef>
+  <paramdef>Display *<parameter>display</parameter></paramdef>
+  <paramdef>XErrorEvent *<parameter>ev</parameter></paramdef>
+  <paramdef>void *<parameter>fp</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .LP -->
+<!-- .eM -->
+The structure pointed at by ev is guaranteed to be as large as an
+<structname>XEvent</structname>
+structure and so can be cast to a type larger than an
+<structname>XErrorEvent</structname>
+to obtain additional values set by using
+<xref linkend='XESetWireToError' xrefstyle='select: title'/>.
+The underlying type of the fp argument is system dependent;
+on a <acronym>POSIX</acronym>-compliant system, fp should be cast to type FILE*.
+</para>
+<indexterm significance="preferred"><primary>XESetFlushGC</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XESetFlushGC'>
+<funcprototype>
+  <funcdef>int *<function>XESetFlushGC</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> extension</parameter></paramdef>
+  <paramdef>int<parameter> *(*proc)()</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>extension</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the extension number.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>proc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the procedure to call when a GC is flushed.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The procedure set by the
+<xref linkend='XESetFlushGC' xrefstyle='select: title'/>
+function has the same interface as the procedure set by the
+<xref linkend='XESetCopyGC' xrefstyle='select: title'/>
+function, but is called when a GC cache needs to be updated in the server.
+</para>
+<indexterm significance="preferred"><primary>XESetBeforeFlush</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis>
+<funcprototype>
+  <funcdef>int *<function>XESetCopyGC</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> extension</parameter></paramdef>
+  <paramdef>int<parameter> *(*proc)()</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>extension</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the extension number.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>proc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the procedure to call when a buffer is flushed.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<function>XESetBeforeFlush</function>
+function defines a procedure to be called when data is about to be
+sent to the server.  When data is about to be sent, your procedure is  
+called one or more times with these arguments:
+<!-- .LP -->
+<!-- .sM -->
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+<!-- .R -->
+<funcsynopsis>
+<funcprototype>
+  <funcdef>void <function>(*<replaceable>proc</replaceable>)</function></funcdef>
+  <paramdef>Display *<parameter>display</parameter></paramdef>
+  <paramdef>XExtCodes *<parameter>codes</parameter></paramdef>
+  <paramdef>char *<parameter>data</parameter></paramdef>
+  <paramdef>long <parameter>len</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .LP -->
+<!-- .eM -->
+The data argument specifies a portion of the outgoing data buffer,
+and its length in bytes is specified by the len argument.
+Your procedure must not alter the contents of the data and must not
+do additional protocol requests to the same display.
+</para>
+</sect2>
+<sect2 id="Hooks_onto_Xlib_Data_Structures">
+<title>Hooks onto Xlib Data Structures</title>
+<para>
+<!-- .LP -->
+Various Xlib data structures have provisions for extension procedures
+to chain extension supplied data onto a list.
+These structures are
+<structname>GC</structname>,
+<structname>Visual</structname>,
+<type>Screen</type>,
+<structname>ScreenFormat</structname>,
+<type>Display</type>,
+and 
+<structname>XFontStruct</structname>.
+Because the list pointer is always the first member in the structure, 
+a single set of procedures can be used to manipulate the data
+on these lists.
+</para>
+<para>
+<!-- .LP -->
+The following structure is used in the functions in this section
+and is defined in 
+<filename class="headerfile">&lt;X11/Xlib.h&gt;</filename>
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XExtData</primary></indexterm>
+<!-- .sM -->
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+<synopsis>
+typedef struct _XExtData {
+       int number;     /* number returned by XInitExtension */
+       struct _XExtData *next; /* next item on list of data for structure */
+       int (*free_private)();  /* if defined,  called to free private */
+       XPointer private_data;  /* data private to this extension. */
+} XExtData;
+</synopsis>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+When any of the data structures listed above are freed, 
+the list is walked, and the structure's free procedure (if any) is called. 
+If free is NULL, 
+then the library frees both the data pointed to by the private_data member
+and the structure itself. 
+</para>
+<para>
+<!-- .LP -->
+<!-- .sM -->
+<!-- .TA .5i -->
+<!-- .ta .5i -->
+<synopsis>
+union {        Display *display;
+       GC gc;
+       Visual *visual;
+       Screen *screen;
+       ScreenFormat *pixmap_format;
+       XFontStruct *font } XEDataObject;
+</synopsis>
+</para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>XEHeadOfExtensionList</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XEHeadOfExtensionList'>
+<funcprototype>
+  <funcdef>XExtData **<function>XEHeadOfExtensionList</function></funcdef>
+  <paramdef>XEDataObject<parameter> object</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>object</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the object.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XEHeadOfExtensionList' xrefstyle='select: title'/>
+function returns a pointer to the list of extension structures attached
+to the specified object.
+In concert with 
+<xref linkend='XAddToExtensionList' xrefstyle='select: title'/>,
+<xref linkend='XEHeadOfExtensionList' xrefstyle='select: title'/>
+allows an extension to attach arbitrary data to any of the structures
+of types contained in
+<structname>XEDataObject</structname>.
+</para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XAddToExtensionList</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XAddToExtensionList'>
+<funcprototype>
+  <funcdef><function>XAddToExtensionList</function></funcdef>
+  <paramdef>XExtData<parameter> **structure</parameter></paramdef>
+  <paramdef>XExtData<parameter> *ext_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>structure</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the extension list.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ext_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the extension data structure to add.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The structure argument is a pointer to one of the data structures
+enumerated above.
+You must initialize ext_data-&gt;number with the extension number
+before calling this function.
+</para>
+<indexterm significance="preferred"><primary>XFindOnExtensionList</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XFindOnExtensionList'>
+<funcprototype>
+  <funcdef>XExtData *<function>XFindOnExtensionList</function></funcdef>
+  <paramdef>struct_XExtData<parameter> **structure</parameter></paramdef>
+  <paramdef>int<parameter> number</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>structure</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the extension list.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>number</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the extension number from
+<xref linkend='XInitExtension' xrefstyle='select: title'/>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XFindOnExtensionList' xrefstyle='select: title'/>
+function returns the first extension data structure
+for the extension numbered number.
+It is expected that an extension will add at most one extension
+data structure to any single data structure's extension data list.
+There is no way to find additional structures.
+</para>
+<para>
+<!-- .LP -->
+The 
+<xref linkend='XAllocID' xrefstyle='select: title'/>
+macro, which allocates and returns a resource ID, is defined in 
+<filename class="headerfile">&lt;X11/Xlib.h&gt;</filename>.
+</para>
+<indexterm significance="preferred"><primary>XAllocID</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XAllocID'>
+<funcprototype>
+  <funcdef><function>XAllocID</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+This macro is a call through the 
+<type>Display</type>
+structure to an internal resource ID allocator.
+It returns a resource ID that you can use when creating new resources.
+</para>
+<para>
+<!-- .LP -->
+The 
+<xref linkend='XAllocIDs' xrefstyle='select: title'/>
+macro allocates and returns an array of resource ID.
+</para>
+<indexterm significance="preferred"><primary>XAllocIDs</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XAllocIDs'>
+<funcprototype>
+  <funcdef><function>XAllocIDs</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XID<parameter> *ids_return</parameter></paramdef>
+  <paramdef>int<parameter> count</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ids_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the resource IDs.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>rep</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of resource IDs requested.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+This macro is a call through the 
+<type>Display</type>
+structure to an internal resource ID allocator.
+It returns resource IDs to the array supplied by the caller.
+To correctly handle automatic reuse of resource IDs, you must call
+<xref linkend='XAllocIDs' xrefstyle='select: title'/>
+when requesting multiple resource IDs.  This call might generate
+protocol requests.
+</para>
+</sect2>
+</sect1>
+<sect1 id="GC_Caching">
+<title>GC Caching</title>
+<para>
+<!-- .LP -->
+GCs are cached by the library to allow merging of independent change
+requests to the same GC into single protocol requests.
+This is typically called a write-back cache.
+Any extension procedure whose behavior depends on the contents of a GC
+must flush the GC cache to make sure the server has up-to-date contents
+in its GC.
+</para>
+<para>
+<!-- .LP -->
+The 
+<xref linkend='FlushGC' xrefstyle='select: title'/>
+macro checks the dirty bits in the library's GC structure and calls
+<xref linkend='_XFlushGCCache' xrefstyle='select: title'/>
+if any elements have changed.
+The
+<xref linkend='FlushGC' xrefstyle='select: title'/>
+macro is defined as follows:
+</para>
+<indexterm significance="preferred"><primary>FlushGC</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='FlushGC'>
+<funcprototype>
+  <funcdef><function>FlushGC</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+Note that if you extend the GC to add additional resource ID components,
+you should ensure that the library stub sends the change request immediately.
+This is because a client can free a resource immediately after
+using it, so if you only stored the value in the cache without
+forcing a protocol request, the resource might be destroyed before being
+set into the GC.
+You can use the
+<xref linkend='_XFlushGCCache' xrefstyle='select: title'/>
+procedure 
+to force the cache to be flushed.
+The
+<xref linkend='_XFlushGCCache' xrefstyle='select: title'/>
+procedure
+is defined as follows:
+</para>
+<indexterm significance="preferred"><primary>_XFlushGCCache</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='_XFlushGCCache'>
+<funcprototype>
+  <funcdef><function>_XFlushGCCache</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<!-- .LP -->
+<!-- .eM -->
+</sect1>
+<sect1 id="Graphics_Batching">
+<title>Graphics Batching</title>
+<para>
+<!-- .LP -->
+If you extend X to add more poly graphics primitives, you may be able to
+take advantage of facilities in the library to allow back-to-back 
+single calls to be transformed into poly requests.
+This may dramatically improve performance of programs that are not
+written using poly requests. 
+A pointer to an 
+<structname>xReq</structname>,
+called last_req in the display structure, is the last request being processed.  
+By checking that the last request
+type, drawable, gc, and other options are the same as the new one
+and that there is enough space left in the buffer, you may be able
+to just extend the previous graphics request by extending the length
+field of the request and appending the data to the buffer.  
+This can improve performance by five times or more in naive programs.  
+For example, here is the source for the 
+<xref linkend='XDrawPoint' xrefstyle='select: title'/>
+stub.
+(Writing extension stubs is discussed in the next section.)
+</para>
+<!-- .sM -->
+<!-- .nf -->
+<programlisting>
+#include &lt;X11/Xlibint.h&gt;
+
+/* precompute the maximum size of batching request allowed */
+
+static int size = sizeof(xPolyPointReq) + EPERBATCH * sizeof(xPoint);
+
+XDrawPoint(dpy, d, gc, x, y)
+    register Display *dpy;
+    Drawable d;
+    GC gc;
+    int x, y; /* INT16 */
+{
+    xPoint *point;
+    LockDisplay(dpy);
+    FlushGC(dpy, gc);
+    {
+    register xPolyPointReq *req = (xPolyPointReq *) dpy-&gt;last_req;
+    /* if same as previous request, with same drawable, batch requests */
+    if (
+          (req-&gt;reqType == X_PolyPoint)
+       &amp;&amp; (req-&gt;drawable == d)
+       &amp;&amp; (req-&gt;gc == gc-&gt;gid)
+       &amp;&amp; (req-&gt;coordMode == CoordModeOrigin)
+       &amp;&amp; ((dpy-&gt;bufptr + sizeof (xPoint)) &lt;= dpy-&gt;bufmax)
+       &amp;&amp; (((char *)dpy-&gt;bufptr - (char *)req) &lt; size) ) {
+         point = (xPoint *) dpy-&gt;bufptr;
+         req-&gt;length += sizeof (xPoint) &gt;&gt; 2;
+         dpy-&gt;bufptr += sizeof (xPoint);
+         }
+
+    else {
+        GetReqExtra(PolyPoint, 4, req); /* 1 point = 4 bytes */
+        req-&gt;drawable = d;
+        req-&gt;gc = gc-&gt;gid;
+        req-&gt;coordMode = CoordModeOrigin;
+        point = (xPoint *) (req + 1);
+        }
+    point-&gt;x = x;
+    point-&gt;y = y;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+}
+</programlisting>
+<!-- .fi -->
+<para>
+<!-- .LP -->
+<!-- .eM -->
+To keep clients from generating very long requests that may monopolize the 
+server,
+there is a symbol defined in
+<filename class="headerfile">&lt;X11/Xlibint.h&gt;</filename>
+of EPERBATCH on the number of requests batched.
+Most of the performance benefit occurs in the first few merged requests.
+Note that 
+<xref linkend='FlushGC' xrefstyle='select: title'/>
+is called <emphasis remap='I'>before</emphasis> picking up the value of last_req,
+because it may modify this field.
+</para>
+</sect1>
+<sect1 id="Writing_Extension_Stubs">
+<title>Writing Extension Stubs</title>
+<para>
+<!-- .LP -->
+All X requests always contain the length of the request,
+expressed as a 16-bit quantity of 32 bits.
+This means that a single request can be no more than 256K bytes in
+length.
+Some servers may not support single requests of such a length.
+The value of dpy-&gt;max_request_size contains the maximum length as
+defined by the server implementation.
+For further information,
+see <olink targetdoc='x11protocol' targetptr='Maximum-request-length'
+><citetitle>X Window System Protocol</citetitle></olink>.
+</para>
+<sect2 id="Requests_Replies_and_Xproto.h">
+<title>Requests, Replies, and Xproto.h</title>
+<para>
+<!-- .LP -->
+The 
+<filename class="headerfile">&lt;X11/Xproto.h&gt;</filename>
+file contains three sets of definitions that
+are of interest to the stub implementor:  
+request names, request structures, and reply structures.
+</para>
+<para>
+<!-- .LP -->
+You need to generate a file equivalent to 
+<filename class="headerfile">&lt;X11/Xproto.h&gt;</filename>
+for your extension and need to include it in your stub procedure.
+Each stub procedure also must include 
+<filename class="headerfile">&lt;X11/Xlibint.h&gt;</filename>.
+</para>
+<para>
+<!-- .LP -->
+The identifiers are deliberately chosen in such a way that, if the
+request is called X_DoSomething, then its request structure is
+xDoSomethingReq, and its reply is xDoSomethingReply.  
+The GetReq family of macros, defined in 
+<filename class="headerfile">&lt;X11/Xlibint.h&gt;</filename>,
+takes advantage of this naming scheme.
+</para>
+<para>
+<!-- .LP -->
+For each X request, 
+there is a definition in 
+<filename class="headerfile">&lt;X11/Xproto.h&gt;</filename>
+that looks similar to this:
+</para>
+<para>
+<!-- .LP -->
+<!-- .R -->
+<programlisting>
+#define X_DoSomething   42
+</programlisting>
+In your extension header file, 
+this will be a minor opcode, 
+instead of a major opcode.
+</para>
+</sect2>
+<sect2 id="Request_Format">
+<title>Request Format</title>
+<para>
+<!-- .LP -->
+Every request contains an 8-bit major opcode and a 16-bit length field
+expressed in units of 4 bytes.  
+Every request consists of 4 bytes of header
+(containing the major opcode, the length field, and a data byte) followed by
+zero or more additional bytes of data. 
+The length field defines the total length of the request, including the header.
+The length field in a request must equal the minimum length required to contain 
+the request. 
+If the specified length is smaller or larger than the required length, 
+the server should generate a 
+<errorname>BadLength</errorname>
+error.
+Unused bytes in a request are not required to be zero.  
+Extensions should be designed in such a way that long protocol requests
+can be split up into smaller requests,
+if it is possible to exceed the maximum request size of the server.
+The protocol guarantees the maximum request size to be no smaller than
+4096 units (16384 bytes).
+</para>
+<para>
+<!-- .LP -->
+Major opcodes 128 through 255 are reserved for extensions.
+Extensions are intended to contain multiple requests, 
+so extension requests typically have an additional minor opcode encoded 
+in the second data byte in the request header, 
+but the placement and interpretation of this minor opcode as well as all
+other fields in extension requests are not defined by the core protocol.
+Every request is implicitly assigned a sequence number (starting with one)
+used in replies, errors, and events.
+</para>
+<para>
+<!-- .LP -->
+To help but not cure portability problems to certain machines, the
+<symbol>B16</symbol>
+and
+<symbol>B32</symbol>
+macros have been defined so that they can become bitfield specifications 
+on some machines.
+For example, on a Cray,
+these should be used for all 16-bit and 32-bit quantities, as discussed below.
+</para>
+<para>
+<!-- .LP -->
+Most protocol requests have a corresponding structure typedef in
+<filename class="headerfile">&lt;X11/Xproto.h&gt;</filename>,
+which looks like:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>xDoSomethingReq</primary></indexterm>
+<!-- .sM -->
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+<synopsis>
+typedef struct _DoSomethingReq {
+       CARD8 reqType;          /* X_DoSomething */
+       CARD8 someDatum;        /* used differently in different requests */
+       CARD16 length B16;      /* total # of bytes in request, divided by 4 */
+       ...
+       /* request-specific data */
+       ...
+} xDoSomethingReq;
+</synopsis>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+If a core protocol request has a single 32-bit argument, 
+you need not declare a request structure in your extension header file.
+Instead, such requests use the
+<structname>xResourceReq</structname>
+structure in
+<filename class="headerfile">&lt;X11/Xproto.h&gt;</filename>.
+This structure is used for any request whose single argument is a 
+<type>Window</type>,
+<type>Pixmap</type>,
+<type>Drawable</type>,
+<type>GContext</type>,
+<type>Font</type>,
+<type>Cursor</type>,
+<type>Colormap</type>,
+<type>Atom</type>,
+or
+<type>VisualID</type>.
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>xResourceReq</primary></indexterm>
+<!-- .sM -->
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+<synopsis>
+typedef struct _ResourceReq {
+       CARD8 reqType;  /* the request type, e.g. X_DoSomething */
+       BYTE pad;       /* not used */
+       CARD16 length B16;      /* 2 (= total # of bytes in request, divided by 4) */
+       CARD32 id B32;  /* the Window, Drawable, Font, GContext, etc. */
+} xResourceReq;
+</synopsis>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+If convenient,
+you can do something similar in your extension header file. 
+</para>
+<para>
+<!-- .LP -->
+In both of these structures, 
+the reqType field identifies the type of the request (for example, 
+X_MapWindow or X_CreatePixmap).  
+The length field tells how long the request is
+in units of 4-byte longwords. 
+This length includes both the request structure itself and any
+variable-length data, such as strings or lists, that follow the
+request structure.  
+Request structures come in different sizes, 
+but all requests are padded to be multiples of four bytes long.
+</para>
+<para>
+<!-- .LP -->
+A few protocol requests take no arguments at all. 
+Instead, they use the
+<structname>xReq</structname>
+structure in
+<filename class="headerfile">&lt;X11/Xproto.h&gt;</filename>,
+which contains only a reqType and a length (and a pad byte).
+</para>
+<para>
+<!-- .LP  -->
+If the protocol request requires a reply, 
+then
+<filename class="headerfile">&lt;X11/Xproto.h&gt;</filename>
+also contains a reply structure typedef:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>xDoSomethingReply</primary></indexterm>
+<!-- .sM -->
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+<synopsis>
+typedef struct _DoSomethingReply {
+       BYTE type;      /* always X_Reply */
+       BYTE someDatum; /* used differently in different requests */
+       CARD16 sequenceNumber B16;      /* # of requests sent so far */
+       CARD32 length B32;      /* # of additional bytes, divided by 4 */
+       ...
+       /* request-specific data */
+       ...
+} xDoSomethingReply;
+</synopsis>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+Most of these reply structures are 32 bytes long. 
+If there are not that many reply values, 
+then they contain a sufficient number of pad fields
+to bring them up to 32 bytes.  
+The length field is the total number of bytes in the request minus 32, 
+divided by 4.  
+This length will be nonzero only if:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+The reply structure is followed by variable-length data,
+such as a list or string.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The reply structure is longer than 32 bytes.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+Only 
+<systemitem>GetWindowAttributesl</systemitem>,
+<systemitem>QueryFont</systemitem>,
+<systemitem>QueryKeymap</systemitem>,
+and
+<systemitem>GetKeyboardControl</systemitem>
+have reply structures longer than 32 bytes in the core protocol.
+</para>
+<para>
+<!-- .LP -->
+A few protocol requests return replies that contain no data.  
+<filename class="headerfile">&lt;X11/Xproto.h&gt;</filename>
+does not define reply structures for these.
+Instead, they use the 
+<structname>xGenericReply</structname>
+structure, which contains only a type, length,
+and sequence number (and sufficient padding to make it 32 bytes long).
+</para>
+</sect2>
+<sect2 id="Starting_to_Write_a_Stub_Procedure">
+<title>Starting to Write a Stub Procedure</title>
+<para>
+<!-- .LP -->
+An Xlib stub procedure should start like this:
+</para>
+<para>
+<!-- .LP -->
+<!-- .R -->
+<programlisting>
+#include "&lt;X11/Xlibint.h&gt;
+
+XDoSomething (arguments, ... )
+/* argument declarations */
+{
+
+register XDoSomethingReq *req;
+...
+</programlisting>
+If the protocol request has a reply, 
+then the variable declarations should include the reply structure for the request.
+The following is an example:
+</para>
+<para>
+<!-- .LP -->
+<!-- .R -->
+<programlisting>
+xDoSomethingReply rep;
+</programlisting>
+</para>
+</sect2>
+<sect2 id="Locking_Data_Structures">
+<title>Locking Data Structures</title>
+<para>
+<!-- .LP -->
+To lock the display structure for systems that
+want to support multithreaded access to a single display connection,
+each stub will need to lock its critical section.
+Generally, this section is the point from just before the appropriate GetReq
+call until all arguments to the call have been stored into the buffer.
+The precise instructions needed for this locking depend upon the machine
+architecture. 
+Two calls, which are generally implemented as macros, have been provided.
+<indexterm significance="preferred"><primary>LockDisplay</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='LockDisplay'>
+<funcprototype>
+  <funcdef><function>LockDisplay</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+</para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>UnlockDisplay</primary></indexterm>
+<funcsynopsis id='UnlockDisplay'>
+<funcprototype>
+  <funcdef><function>UnlockDisplay</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<!-- .LP -->
+<!-- .eM -->
+</sect2>
+<sect2 id="Sending_the_Protocol_Request_and_Arguments">
+<title>Sending the Protocol Request and Arguments</title>
+<para>
+<!-- .LP -->
+After the variable declarations, 
+a stub procedure should call one of four macros defined in 
+<filename class="headerfile">&lt;X11/Xlibint.h&gt;</filename>:
+<function>GetReq</function>,
+<function>GetReqExtra</function>,
+<function>GetResReq</function>,
+or 
+<function>GetEmptyReq</function>.
+All of these macros take, as their first argument,
+the name of the protocol request as declared in 
+<filename class="headerfile">&lt;X11/Xproto.h&gt;</filename>
+except with X_ removed.   
+Each one declares a 
+<type>Display</type>
+structure pointer,
+called dpy, and a pointer to a request structure, called req,
+which is of the appropriate type.
+The macro then appends the request structure to the output buffer, 
+fills in its type and length field, and sets req to point to it.
+</para>
+<para>
+<!-- .LP -->
+If the protocol request has no arguments (for instance, X_GrabServer),
+then use 
+<function>GetEmptyReq</function>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .R  -->
+<programlisting>
+GetEmptyReq (DoSomething, req);
+</programlisting>
+If the protocol request has a single 32-bit argument (such as a
+<type>Pixmap</type>,
+<type>Window</type>,
+<type>Drawable</type>,
+<type>Atom</type>,
+and so on),
+then use 
+<function>GetResReq</function>.
+The second argument to the macro is the 32-bit object.  
+<symbol>X_MapWindow</symbol>
+is a good example.
+</para>
+<para>
+<!-- .LP -->
+<!-- .R -->
+<programlisting>
+GetResReq (DoSomething, rid, req);
+</programlisting>
+The rid argument is the 
+<type>Pixmap</type>,
+<type>Window</type>,
+or other resource ID.
+</para>
+<para>
+<!-- .LP -->
+If the protocol request takes any other argument list, 
+then call 
+<function>GetReq</function>.
+After the 
+<function>GetReq</function>,
+you need to set all the other fields in the request structure,
+usually from arguments to the stub procedure.
+</para>
+<para>
+<!-- .LP -->
+<!-- .R -->
+<programlisting>
+GetReq (DoSomething, req);
+/* fill in arguments here */
+req-&gt;arg1 = arg1;
+req-&gt;arg2 = arg2;
+...
+</programlisting>
+A few stub procedures (such as 
+<xref linkend='XCreateGC' xrefstyle='select: title'/>
+and 
+<xref linkend='XCreatePixmap' xrefstyle='select: title'/>)
+return a resource ID to the caller but pass a resource ID as an argument
+to the protocol request.   
+Such procedures use the macro 
+<xref linkend='XAllocID' xrefstyle='select: title'/>
+to allocate a resource ID from the range of IDs 
+that were assigned to this client when it opened the connection.
+</para>
+<para>
+<!-- .LP -->
+<!-- .R -->
+<programlisting>
+rid = req-&gt;rid = XAllocID();
+...
+return (rid);
+</programlisting>
+Finally, some stub procedures transmit a fixed amount of variable-length
+data after the request.  
+Typically, these procedures (such as
+<xref linkend='XMoveWindow' xrefstyle='select: title'/>
+and 
+<xref linkend='XSetBackground' xrefstyle='select: title'/>)
+are special cases of more general functions like 
+<xref linkend='XMoveResizeWindow' xrefstyle='select: title'/>
+and 
+<xref linkend='XChangeGC' xrefstyle='select: title'/>.
+These procedures use 
+<function>GetReqExtra</function>,
+which is the same as 
+<function>GetReq</function>
+except that it takes an additional argument (the number of
+extra bytes to allocate in the output buffer after the request structure).  
+This number should always be a multiple of four.
+</para>
+</sect2>
+<sect2 id="Variable_Length_Arguments">
+<title>Variable Length Arguments</title>
+<para>
+<!-- .LP -->
+Some protocol requests take additional variable-length data that
+follow the 
+<type>xDoSomethingReq</type>
+structure.    
+The format of this data varies from request to request. 
+Some requests require a sequence of 8-bit bytes, 
+others a sequence of 16-bit or 32-bit entities, 
+and still others a sequence of structures.
+</para>
+<para>
+<!-- .LP -->
+It is necessary to add the length of any variable-length data to the
+length field of the request structure.  
+That length field is in units of 32-bit longwords.  
+If the data is a string or other sequence of 8-bit bytes, 
+then you must round the length up and shift it before adding:
+</para>
+<para>
+<!-- .LP -->
+<!-- .R -->
+<programlisting>
+req-&gt;length += (nbytes+3)&gt;&gt;2;
+</programlisting>
+To transmit variable-length data, use the 
+<xref linkend='Data' xrefstyle='select: title'/>
+macros.
+If the data fits into the output buffer, 
+then this macro copies it to the buffer.  
+If it does not fit, however,
+the 
+<xref linkend='Data' xrefstyle='select: title'/>
+macro calls 
+<function>_XSend</function>,
+which transmits first the contents of the buffer and then your data.
+The 
+<xref linkend='Data' xrefstyle='select: title'/>
+macros take three arguments:  
+the display, a pointer to the beginning of the data, 
+and the number of bytes to be sent.
+<!-- .sM -->
+<funcsynopsis id='Data'>
+<funcprototype>
+  <funcdef><function>Data</function></funcdef>
+  <paramdef><parameter> display</parameter></paramdef>
+  <paramdef>(char<parameter> *</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<xref linkend='Data' xrefstyle='select: title'/>,
+<function>Data16</function>,
+and
+<function>Data32</function>
+are macros that may use their last argument
+more than once, so that argument should be a variable rather than
+an expression such as ``nitems*sizeof(item)''.  
+You should do that kind of computation in a separate statement before calling 
+them.
+Use the appropriate macro when sending byte, short, or long data.
+</para>
+<para>
+<!-- .LP -->
+If the protocol request requires a reply, 
+then call the procedure 
+<function>_XSend</function>
+instead of the 
+<xref linkend='Data' xrefstyle='select: title'/>
+macro.  
+<function>_XSend</function>
+takes the same arguments, but because it sends your data immediately instead of 
+copying it into the output buffer (which would later be flushed
+anyway by the following call on 
+<xref linkend='_XReply' xrefstyle='select: title'/>),
+it is faster.
+</para>
+</sect2>
+<sect2 id="Replies">
+<title>Replies</title>
+<para>
+<!-- .LP -->
+If the protocol request has a reply, 
+then call 
+<xref linkend='_XReply' xrefstyle='select: title'/>
+after you have finished dealing with 
+all the fixed-length and variable-length arguments.  
+<xref linkend='_XReply' xrefstyle='select: title'/>
+flushes the output buffer and waits for an 
+<structname>xReply</structname>
+packet to arrive.  
+If any events arrive in the meantime,
+<xref linkend='_XReply' xrefstyle='select: title'/>
+places them in the queue for later use.
+</para>
+<indexterm significance="preferred"><primary>_XReply</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='_XReply'>
+<funcprototype>
+  <funcdef>Status <function>_XReply</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>xReply<parameter> *rep</parameter></paramdef>
+  <paramdef>int<parameter> extra</parameter></paramdef>
+  <paramdef>Bool<parameter> discard</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>rep</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the reply structure.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>extra</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of 32-bit words expected after the replay.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>discard</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies if any data beyond that specified in the extra argument
+should be discarded.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='_XReply' xrefstyle='select: title'/>
+function waits for a reply packet and copies its contents into the
+specified rep.  
+<xref linkend='_XReply' xrefstyle='select: title'/>
+handles error and event packets that occur before the reply is received.
+<xref linkend='_XReply' xrefstyle='select: title'/>
+takes four arguments:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+A 
+<type>Display</type>
+* structure
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A pointer to a reply structure (which must be cast to an 
+<structname>xReply</structname>
+*)
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The number of additional 32-bit words (beyond 
+<function>sizeof( xReply</function>)
+= 32 bytes)
+in the reply structure
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A Boolean that indicates whether
+<xref linkend='_XReply' xrefstyle='select: title'/>
+is to discard any additional bytes
+beyond those it was told to read
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+Because most reply structures are 32 bytes long, 
+the third argument is usually 0.  
+The only core protocol exceptions are the replies to 
+<systemitem>GetWindowAttributesl</systemitem>,
+<systemitem>QueryFont</systemitem>,
+<systemitem>QueryKeymap</systemitem>,
+and 
+<systemitem>GetKeyboardControl</systemitem>,
+which have longer replies.
+</para>
+<para>
+<!-- .LP -->
+The last argument should be 
+<symbol>False</symbol>
+if the reply structure is followed
+by additional variable-length data (such as a list or string).  
+It should be 
+<symbol>True</symbol>
+if there is not any variable-length data.
+<!-- .NT -->
+This last argument is provided for upward-compatibility reasons
+to allow a client to communicate properly with a hypothetical later
+version of the server that sends more data than the client expected.
+For example, some later version of 
+<systemitem>GetWindowAttributesl</systemitem>
+might use a
+larger, but compatible, 
+<structname>xGetWindowAttributesReply</structname>
+that contains additional attribute data at the end.
+<!-- .NE -->
+<xref linkend='_XReply' xrefstyle='select: title'/>
+returns 
+<symbol>True</symbol>
+if it received a reply successfully or 
+<symbol>False</symbol>
+if it received any sort of error. 
+</para>
+<para>
+<!-- .LP -->
+For a request with a reply that is not followed by variable-length
+data, you write something like:
+</para>
+<para>
+<!-- .LP -->
+<!-- .R -->
+<programlisting>
+_XReply(display, (xReply *)&amp;rep, 0, True);
+*ret1 = rep.ret1;
+*ret2 = rep.ret2;
+*ret3 = rep.ret3;
+...
+UnlockDisplay(dpy);
+SyncHandle();
+return (rep.ret4);
+}
+</programlisting>
+If there is variable-length data after the reply, 
+change the 
+<symbol>True</symbol>
+to 
+<symbol>False</symbol>,
+and use the appropriate
+<xref linkend='_XRead' xrefstyle='select: title'/>
+function to read the variable-length data.
+</para>
+<!-- .LP -->
+<!-- .sM -->
+<funcsynopsis id='_XRead'>
+<funcprototype>
+  <funcdef><function>_XRead</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>char<parameter> *data_return</parameter></paramdef>
+  <paramdef>long<parameter> nbytes</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>data_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the buffer.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nbytes</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of bytes required.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='_XRead' xrefstyle='select: title'/>
+function reads the specified number of bytes into data_return.
+</para>
+<!-- .LP -->
+<!-- .sM -->
+<funcsynopsis id='_XRead16'>
+<funcprototype>
+  <funcdef><function>_XRead16</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>short<parameter> *data_return</parameter></paramdef>
+  <paramdef>long<parameter> nbytes</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>data_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the buffer.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nbytes</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of bytes required.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='_XRead16' xrefstyle='select: title'/>
+function reads the specified number of bytes,
+unpacking them as 16-bit quantities,
+into the specified array as shorts.
+</para>
+<!-- .LP -->
+<!-- .sM -->
+<funcsynopsis id='_XRead32'>
+<funcprototype>
+  <funcdef><function>_XRead32</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>long<parameter> *data_return</parameter></paramdef>
+  <paramdef>long<parameter> nbytes</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>data_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the buffer.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nbytes</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of bytes required.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='_XRead32' xrefstyle='select: title'/>
+function reads the specified number of bytes,
+unpacking them as 32-bit quantities,
+into the specified array as longs.
+</para>
+<!-- .LP -->
+<!-- .sM -->
+<funcsynopsis id='_XRead16Pad'>
+<funcprototype>
+  <funcdef><function>_XRead16Pad</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>short<parameter> *data_return</parameter></paramdef>
+  <paramdef>long<parameter> nbytes</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>data_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the buffer.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nbytes</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of bytes required.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='_XRead16Pad' xrefstyle='select: title'/>
+function reads the specified number of bytes,
+unpacking them as 16-bit quantities,
+into the specified array as shorts.
+If the number of bytes is not a multiple of four,
+<xref linkend='_XRead16Pad' xrefstyle='select: title'/>
+reads and discards up to two additional pad bytes.
+</para>
+<!-- .LP -->
+<!-- .sM -->
+<funcsynopsis id='_XReadPad'>
+<funcprototype>
+  <funcdef><function>_XReadPad</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>char<parameter> *data_return</parameter></paramdef>
+  <paramdef>long<parameter> nbytes</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>data_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the buffer.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nbytes</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of bytes required.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='_XReadPad' xrefstyle='select: title'/>
+function reads the specified number of bytes into data_return.
+If the number of bytes is not a multiple of four,
+<xref linkend='_XReadPad' xrefstyle='select: title'/>
+reads and discards up to three additional pad bytes.
+</para>
+<para>
+<!-- .LP -->
+Each protocol request is a little different. 
+For further information,
+see the Xlib sources for examples.
+</para>
+</sect2>
+<sect2 id="Synchronous_Calling">
+<title>Synchronous Calling</title>
+<para>
+<!-- .LP -->
+Each procedure should have a call, just before returning to the user, 
+to a macro called
+<systemitem>SyncHandle</systemitem>.
+If synchronous mode is enabled (see 
+<function>XSynchronize</function>),
+the request is sent immediately.
+The library, however, waits until any error the procedure could generate
+at the server has been handled.
+</para>
+</sect2>
+<sect2 id="Allocating_and_Deallocating_Memory">
+<title>Allocating and Deallocating Memory</title>
+<para>
+<!-- .LP -->
+To support the possible reentry of these procedures, 
+you must observe several conventions when allocating and deallocating memory,
+most often done when returning data to the user from the window
+system of a size the caller could not know in advance
+(for example, a list of fonts or a list of extensions).
+The standard C library functions on many systems
+are not protected against signals or other multithreaded uses.
+The following analogies to standard I/O library functions
+have been defined:
+</para>
+<para>
+<!-- .LP -->
+These should be used in place of any calls you would make to the normal
+C library functions.
+</para>
+<para>
+<!-- .LP -->
+If you need a single scratch buffer inside a critical section 
+(for example, to pack and unpack data to and from the wire protocol),
+the general memory allocators may be too expensive to use
+(particularly in output functions, which are performance critical).  
+The following function returns a scratch buffer for use within a
+critical section:
+</para>
+<indexterm significance="preferred"><primary>_XAllocScratch</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='_XAllocScratch'>
+<funcprototype>
+  <funcdef>char *<function>_XAllocScratch</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> nbytes</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nbytes</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of bytes required.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+This storage must only be used inside of a critical section of your
+stub.  The returned pointer cannot be assumed valid after any call
+that might permit another thread to execute inside Xlib.  For example,
+the pointer cannot be assumed valid after any use of the
+<function>GetReq</function>
+or
+<xref linkend='Data' xrefstyle='select: title'/>
+families of macros,
+after any use of
+<xref linkend='_XReply' xrefstyle='select: title'/>,
+or after any use of the
+<function>_XSend</function>
+or
+<xref linkend='_XRead' xrefstyle='select: title'/>
+families of functions.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+The following function returns a scratch buffer for use across
+critical sections:
+</para>
+<indexterm significance="preferred"><primary>_XAllocTemp</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='_XAllocTemp'>
+<funcprototype>
+  <funcdef>char *<function>_XAllocTemp</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> nbytes</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nbytes</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of bytes required.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+This storage can be used across calls that might permit another thread to
+execute inside Xlib.  The storage must be explicitly returned to Xlib.
+The following function returns the storage:
+</para>
+<indexterm significance="preferred"><primary>_XFreeTemp</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='_XFreeTemp'>
+<funcprototype>
+  <funcdef>void <function>_XFreeTemp</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>char<parameter> *buf</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> nbytes</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>buf</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the buffer to return.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nbytes</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the size of the buffer.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+You must pass back the same pointer and size that were returned by
+<xref linkend='_XAllocTemp' xrefstyle='select: title'/>.
+</para>
+</sect2>
+<sect2 id="Portability_Considerations">
+<title>Portability Considerations</title>
+<para>
+<!-- .LP -->
+Many machine architectures, 
+including many of the more recent <acronym>RISC</acronym> architectures,
+do not correctly access data at unaligned locations; 
+their compilers pad out structures to preserve this characteristic.
+Many other machines capable of unaligned references pad inside of structures
+as well to preserve alignment, because accessing aligned data is
+usually much faster.
+Because the library and the server use structures to access data at
+arbitrary points in a byte stream,
+all data in request and reply packets <emphasis remap='I'>must</emphasis> be naturally aligned;
+that is, 16-bit data starts on 16-bit boundaries in the request
+and 32-bit data on 32-bit boundaries.
+All requests <emphasis remap='I'>must</emphasis> be a multiple of 32 bits in length to preserve
+the natural alignment in the data stream.
+You must pad structures out to 32-bit boundaries.
+Pad information does not have to be zeroed unless you want to
+preserve such fields for future use in your protocol requests.
+Floating point varies radically between machines and should be
+avoided completely if at all possible.
+</para>
+<para>
+<!-- .LP -->
+This code may run on machines with 16-bit ints.  
+So, if any integer argument, variable, or return value either can take 
+only nonnegative values or is declared as a
+<type>CARD16</type>
+in the protocol, be sure to declare it as
+<type>unsigned</type>
+<type>int</type>
+and not as
+<type>int</type>.
+(This, of course, does not apply to Booleans or enumerations.)
+</para>
+<para>
+<!-- .LP -->
+Similarly, 
+if any integer argument or return value is declared
+<type>CARD32</type>
+in the protocol, 
+declare it as an
+<type>unsigned</type>
+<type>long</type>
+and not as
+<type>int</type>
+or
+<type>long</type>.
+This also goes for any internal variables that may
+take on values larger than the maximum 16-bit
+<type>unsigned</type>
+<type>int</type>.
+</para>
+<para>
+<!-- .LP -->
+The library currently assumes that a
+<type>char</type>
+is 8 bits, a
+<type>short</type>
+is 16 bits, an
+<type>int</type>
+is 16 or 32 bits, and a
+<type>long</type>
+is 32 bits.  
+The 
+<function>PackData</function>
+macro is a half-hearted attempt to deal with the possibility of 32 bit shorts. 
+However, much more work is needed to make this work properly.
+</para>
+</sect2>
+<sect2 id="Deriving_the_Correct_Extension_Opcode">
+<title>Deriving the Correct Extension Opcode</title>
+<para>
+<!-- .LP -->
+The remaining problem a writer of an extension stub procedure faces that
+the core protocol does not face is to map from the call to the proper
+major and minor opcodes.  
+While there are a number of strategies, 
+the simplest and fastest is outlined below.
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+Declare an array of pointers, _NFILE long (this is normally found
+in 
+<filename class="headerfile">&lt;stdio.h&gt;</filename>
+and is the number of file descriptors supported on the system)
+of type 
+<structname>XExtCodes</structname>.
+Make sure these are all initialized to NULL.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+When your stub is entered, your initialization test is just to use
+the display pointer passed in to access the file descriptor and an index
+into the array.  
+If the entry is NULL, then this is the first time you
+are entering the procedure for this display.  
+Call your initialization procedure and pass to it the display pointer.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Once in your initialization procedure, call 
+<xref linkend='XInitExtension' xrefstyle='select: title'/>;
+if it succeeds, store the pointer returned into this array.  
+Make sure to establish a close display handler to allow you to zero the entry.
+Do whatever other initialization your extension requires.
+(For example, install event handlers and so on.)
+Your initialization procedure would normally return a pointer to the
+<structname>XExtCodes</structname>
+structure for this extension, which is what would normally
+be found in your array of pointers.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+After returning from your initialization procedure, 
+the stub can now continue normally, because it has its major opcode safely 
+in its hand in the 
+<structname>XExtCodes</structname>
+structure.
+<!-- .bp -->
+    </para>
+  </listitem>
+</itemizedlist>
+</sect2>
+</sect1>
+</appendix>
diff --git a/specs/libX11/AppD.xml b/specs/libX11/AppD.xml
new file mode 100644 (file)
index 0000000..fdea468
--- /dev/null
@@ -0,0 +1,1888 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+         "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
+<appendix id="compatibility_functions">
+<title>Compatibility Functions</title>
+<para>
+The X Version 11 and X Version 10 functions discussed in this appendix 
+are obsolete, have been superseded by newer X Version 11 functions,
+and are maintained for compatibility reasons only.
+</para>
+<sect1 id="X_Version_11_Compatibility_Functions">
+<title>X Version 11 Compatibility Functions</title>
+<para>
+You can use the X Version 11 compatibility functions to:
+<itemizedlist>
+  <listitem>
+    <para>
+Set standard properties 
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Set and get window sizing hints 
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Set and get an
+<structname>XStandardColormap</structname>
+structure 
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Parse window geometry
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Get X environment defaults
+    </para>
+  </listitem>
+</itemizedlist>
+</para>
+<sect2 id="Setting_Standard_Properties">
+<title>Setting Standard Properties</title>
+<para>
+To specify a minimum set of properties describing the simplest application,
+use
+<xref linkend='XSetStandardProperties' xrefstyle='select: title'/>.
+This function has been superseded by
+<xref linkend='XSetWMProperties' xrefstyle='select: title'/>
+and sets all or portions of the 
+<property>WM_NAME</property>, <property>WM_ICON_NAME</property>, <property>WM_HINTS</property>, <property>WM_COMMAND</property>, 
+and <property>WM_NORMAL_HINTS</property> properties.
+</para>
+<indexterm significance="preferred"><primary>XSetStandardProperties</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetStandardProperties'>
+<funcprototype>
+  <funcdef><function>XSetStandardProperties</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>char<parameter> *window_name</parameter></paramdef>
+  <paramdef>char<parameter> *icon_name</parameter></paramdef>
+  <paramdef>Pixmap<parameter> icon_pixmap</parameter></paramdef>
+  <paramdef>char<parameter> **argv</parameter></paramdef>
+  <paramdef>int<parameter> argc</parameter></paramdef>
+  <paramdef>XSizeHints<parameter> *hints</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>window_name</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window name,
+which should be a null-terminated string.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>icon_name</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the icon name,
+which should be a null-terminated string.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>icon_pixmap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the bitmap that is to be used for the icon or
+<symbol>None</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>argv</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the application's argument list.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>argc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of arguments.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>hints</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a pointer to the size hints for the window in its normal state.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetStandardProperties' xrefstyle='select: title'/>
+function provides a means by which simple applications set the
+most essential properties with a single call.
+<xref linkend='XSetStandardProperties' xrefstyle='select: title'/>
+should be used to give a window manager some information about 
+your program's preferences. 
+It should not be used by applications that need
+to communicate more information than is possible with
+<xref linkend='XSetStandardProperties' xrefstyle='select: title'/>.
+(Typically, argv is the argv array of your main program.)
+If the strings are not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetStandardProperties' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+</sect2>
+<sect2 id="Setting_and_Getting_Window_Sizing_Hints">
+<title>Setting and Getting Window Sizing Hints</title>
+<para>
+Xlib provides functions that you can use to set or get window sizing hints.
+The functions discussed in this section use the flags and the
+<structname>XSizeHints</structname>
+structure, as defined in the
+<filename class="headerfile">&lt;X11/Xutil.h&gt;</filename>
+<indexterm type="file"><primary><filename class="headerfile">X11/Xutil.h</filename></primary></indexterm>
+<indexterm><primary>Files</primary><secondary><filename class="headerfile">&lt;X11/Xutil.h&gt;</filename></secondary></indexterm>
+<indexterm><primary>Headers</primary><secondary><filename class="headerfile">&lt;X11/Xutil.h&gt;</filename></secondary></indexterm>
+header file and use the <property>WM_NORMAL_HINTS</property> property.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set the size hints for a given window in its normal state, use
+<xref linkend='XSetNormalHints' xrefstyle='select: title'/>.
+This function has been superseded by
+<xref linkend='XSetWMNormalHints' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetNormalHints</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetNormalHints'>
+<funcprototype>
+  <funcdef><function>XSetNormalHints</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>XSizeHints<parameter> *hints</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>hints</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a pointer to the size hints for the window in its normal state.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetNormalHints' xrefstyle='select: title'/>
+function sets the size hints structure for the specified window.
+Applications use
+<xref linkend='XSetNormalHints' xrefstyle='select: title'/>
+to inform the window manager of the size
+or position desirable for that window.
+In addition, 
+an application that wants to move or resize itself should call
+<xref linkend='XSetNormalHints' xrefstyle='select: title'/>
+and specify its new desired location and size
+as well as making direct Xlib calls to move or resize.  
+This is because window managers may ignore redirected
+configure requests, but they pay attention to property changes.
+</para>
+<para>
+<!-- .LP -->
+To set size hints, 
+an application not only must assign values to the appropriate members
+in the hints structure but also must set the flags member of the structure 
+to indicate which information is present and where it came from.  
+A call to
+<xref linkend='XSetNormalHints' xrefstyle='select: title'/>
+is meaningless, unless the flags member is set to indicate which members of
+the structure have been assigned values.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetNormalHints' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To return the size hints for a window in its normal state, use
+<xref linkend='XGetNormalHints' xrefstyle='select: title'/>.
+This function has been superseded by
+<xref linkend='XGetWMNormalHints' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetNormalHints</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetNormalHints'>
+<funcprototype>
+  <funcdef>Status <function>XGetNormalHints</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>XSizeHints<parameter> *hints_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>hints_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the size hints for the window in its normal state.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetNormalHints' xrefstyle='select: title'/>
+function returns the size hints for a window in its normal state.
+It returns a nonzero status if it succeeds or zero if
+the application specified no normal size hints for this window.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGetNormalHints' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+The next two functions set and read the <property>WM_ZOOM_HINTS</property> property.
+</para>
+<para>
+<!-- .LP -->
+To set the zoom hints for a window, use
+<xref linkend='XSetZoomHints' xrefstyle='select: title'/>.
+This function is no longer supported by the
+<citetitle>Inter-Client Communication Conventions Manual</citetitle>.
+</para>
+<indexterm significance="preferred"><primary>XSetZoomHints</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetZoomHints'>
+<funcprototype>
+  <funcdef><function>XSetZoomHints</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>XSizeHints<parameter> *zhints</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>zhints</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a pointer to the zoom hints.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+Many window managers think of windows in one of three states:
+iconic, normal, or zoomed.
+The
+<xref linkend='XSetZoomHints' xrefstyle='select: title'/>
+function provides the window manager with information for the window in the
+zoomed state.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetZoomHints' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To read the zoom hints for a window, use
+<xref linkend='XGetZoomHints' xrefstyle='select: title'/>.
+This function is no longer supported by the
+<citetitle>Inter-Client Communication Conventions Manual</citetitle>.
+</para>
+<indexterm significance="preferred"><primary>XGetZoomHints</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetZoomHints'>
+<funcprototype>
+  <funcdef>Status <function>XGetZoomHints</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>XSizeHints<parameter> *zhints_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>zhints_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the zoom hints.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetZoomHints' xrefstyle='select: title'/>
+function returns the size hints for a window in its zoomed state.
+It returns a nonzero status if it succeeds or zero if
+the application specified no zoom size hints for this window.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGetZoomHints' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set the value of any property of type <property>WM_SIZE_HINTS</property>, use
+<xref linkend='XSetSizeHints' xrefstyle='select: title'/>.
+This function has been superseded by
+<xref linkend='XSetWMSizeHints' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetSizeHints</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetSizeHints'>
+<funcprototype>
+  <funcdef><function>XSetSizeHints</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>XSizeHints<parameter> *hints</parameter></paramdef>
+  <paramdef>Atom<parameter> property</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>hints</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a pointer to the size hints.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>property</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the property name.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetSizeHints' xrefstyle='select: title'/>
+function sets the
+<structname>XSizeHints</structname>
+structure for the named property and the specified window.
+This is used by
+<xref linkend='XSetNormalHints' xrefstyle='select: title'/>
+and
+<xref linkend='XSetZoomHints' xrefstyle='select: title'/>
+and can be used to set the value of any property of type <property>WM_SIZE_HINTS</property>.
+Thus, it may be useful if other properties of that type get defined.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetSizeHints' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>,
+<errorname>BadAtom</errorname>,
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To read the value of any property of type <property>WM_SIZE_HINTS</property>, use
+<xref linkend='XGetSizeHints' xrefstyle='select: title'/>.
+This function has been superseded by
+<xref linkend='XGetWMSizeHints' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetSizeHints</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetSizeHints'>
+<funcprototype>
+  <funcdef>Status <function>XGetSizeHints</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>XSizeHints<parameter> *hints_return</parameter></paramdef>
+  <paramdef>Atom<parameter> property</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>hints_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the size hints.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>property</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the property name.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetSizeHints' xrefstyle='select: title'/>
+function returns the
+<structname>XSizeHints</structname>
+structure for the named property and the specified window.
+This is used by
+<xref linkend='XGetNormalHints' xrefstyle='select: title'/>
+and
+<xref linkend='XGetZoomHints' xrefstyle='select: title'/>.
+It also can be used to retrieve the value of any property of type
+<property>WM_SIZE_HINTS</property>.
+Thus, it may be useful if other properties of that type get defined.
+<xref linkend='XGetSizeHints' xrefstyle='select: title'/>
+returns a nonzero status if a size hint was defined
+or zero otherwise.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGetSizeHints' xrefstyle='select: title'/>
+can generate
+<errorname>BadAtom</errorname>
+and 
+<errorname>BadWindow</errorname>
+errors.
+</para>
+</sect2>
+<sect2 id="Getting_and_Setting_an_XStandardColormap_Structure">
+<title>Getting and Setting an XStandardColormap Structure</title>
+<para>
+To get the 
+<structname>XStandardColormap</structname>
+structure associated with one of the described atoms, use
+<xref linkend='XGetStandardColormap' xrefstyle='select: title'/>.
+This function has been superseded by
+<xref linkend='XGetRGBColormaps' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetStandardColormap</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetStandardColormap'>
+<funcprototype>
+  <funcdef>Status <function>XGetStandardColormap</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>XStandardColormap<parameter> *colormap_return</parameter></paramdef>
+  <paramdef>Atom<parameter> property</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colormap_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the colormap associated with the specified atom.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>property</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the property name.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetStandardColormap' xrefstyle='select: title'/>
+function returns the colormap definition associated with the atom supplied
+as the property argument.
+<xref linkend='XGetStandardColormap' xrefstyle='select: title'/>
+returns a nonzero status if successful and zero otherwise.
+For example,
+to fetch the standard
+<symbol>GrayScale</symbol>
+colormap for a display,
+you use
+<xref linkend='XGetStandardColormap' xrefstyle='select: title'/>
+with the following syntax:
+<programlisting>
+XGetStandardColormap(dpy, DefaultRootWindow(dpy), &amp;cmap, XA_RGB_GRAY_MAP);
+</programlisting>
+See <link linkend="Standard_Colormaps">section 14.3</link> for the
+semantics of standard colormaps.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGetStandardColormap' xrefstyle='select: title'/>
+can generate
+<errorname>BadAtom</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set a standard colormap, use
+<xref linkend='XSetStandardColormap' xrefstyle='select: title'/>.
+This function has been superseded by
+<xref linkend='XSetRGBColormaps' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetStandardColormap</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetStandardColormap'>
+<funcprototype>
+  <funcdef><function>XSetStandardColormap</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>XStandardColormap<parameter> *colormap</parameter></paramdef>
+  <paramdef>Atom<parameter> property</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colormap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the colormap.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>property</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the property name.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetStandardColormap' xrefstyle='select: title'/>
+function usually is only used by window or session managers.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetStandardColormap' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>,
+<errorname>BadAtom</errorname>,
+<errorname>BadDrawable</errorname>,
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+</sect2>
+<sect2 id="Parsing_Window_Geometry">
+<title>Parsing Window Geometry</title>
+<para>
+To parse window geometry given a user-specified position 
+and a default position, use
+<xref linkend='XGeometry' xrefstyle='select: title'/>.
+This function has been superseded by
+<xref linkend='XWMGeometry' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Window</primary><secondary>determining location</secondary></indexterm>
+<indexterm significance="preferred"><primary>XGeometry</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGeometry'>
+<funcprototype>
+  <funcdef>int <function>XGeometry</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> screen</parameter></paramdef>
+  <paramdef>char*position,<parameter> *default_position</parameter></paramdef>
+  <paramdef>unsignedint<parameter> bwidth</parameter></paramdef>
+  <paramdef>unsignedintfwidth,<parameter> fheight</parameter></paramdef>
+  <paramdef>intxadder,<parameter> yadder</parameter></paramdef>
+  <paramdef>int*x_return,<parameter> *y_return</parameter></paramdef>
+  <paramdef>int*width_return,<parameter> *height_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the screen.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>position</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>default_position</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the geometry specifications.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>bwidth</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the border width.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>fheight</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>fwidth</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the font height and width in pixels (increment size).
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>xadder</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>yadder</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify additional interior padding needed in the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Return the x and y offsets.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Return the width and height determined.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+You pass in the border width (bwidth),
+size of the increments fwidth and fheight
+(typically font width and height),
+and any additional interior space (xadder and yadder)
+to make it easy to compute the resulting size.
+The
+<xref linkend='XGeometry' xrefstyle='select: title'/>
+function returns the position the window should be placed given a position and
+a default position.
+<xref linkend='XGeometry' xrefstyle='select: title'/>
+determines the placement of
+a window using a geometry specification as specified by
+<xref linkend='XParseGeometry' xrefstyle='select: title'/>
+and the additional information about the window.
+Given a fully qualified default geometry specification and
+an incomplete geometry specification, 
+<xref linkend='XParseGeometry' xrefstyle='select: title'/>
+returns a bitmask value as defined above in the 
+<xref linkend='XParseGeometry' xrefstyle='select: title'/>
+call,
+by using the position argument.
+</para>
+<para>
+<!-- .LP -->
+The returned width and height will be the width and height specified
+by default_position as overridden by any user-specified position.
+They are not affected by fwidth, fheight, xadder, or yadder.
+The x and y coordinates are computed by using the border width,
+the screen width and height, padding as specified by xadder and yadder,
+and the fheight and fwidth times the width and height from the
+geometry specifications.
+</para>
+</sect2>
+<sect2 id="Getting_the_X_Environment_Defaults">
+<title>Getting the X Environment Defaults</title>
+<para>
+The
+<xref linkend='XGetDefault' xrefstyle='select: title'/>
+function provides a primitive interface to the resource manager facilities 
+discussed in <link linkend='Resource_Manager_Functions'>chapter 15</link>.
+It is only useful in very simple applications.
+</para>
+<!-- .LP -->
+<!-- .sp -->
+<indexterm significance="preferred"><primary>XGetDefault</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetDefault'>
+<funcprototype>
+  <funcdef>char *<function>XGetDefault</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>char<parameter> *program</parameter></paramdef>
+  <paramdef>char<parameter> *option</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>program</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the program name for the Xlib defaults (usually argv[0] 
+of the main program).
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>option</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the option name.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetDefault' xrefstyle='select: title'/>
+function returns the value of the resource <emphasis remap='I'>prog</emphasis>.<emphasis remap='I'>option</emphasis>,
+where <emphasis remap='I'>prog</emphasis> is the program argument with the directory prefix removed
+and <emphasis remap='I'>option</emphasis> must be a single component.
+Note that multilevel resources cannot be used with
+<xref linkend='XGetDefault' xrefstyle='select: title'/>.
+The class "Program.Name" is always used for the resource lookup.
+If the specified option name does not exist for this program,
+<xref linkend='XGetDefault' xrefstyle='select: title'/>
+returns NULL.
+The strings returned by
+<xref linkend='XGetDefault' xrefstyle='select: title'/>
+are owned by Xlib and should not be modified or freed by the client.
+</para>
+<para>
+<!-- .LP -->
+If a database has been set with 
+<xref linkend='XrmSetDatabase' xrefstyle='select: title'/>,
+that database is used for the lookup.
+Otherwise, a database is created
+and is set in the display (as if by calling 
+<xref linkend='XrmSetDatabase' xrefstyle='select: title'/>).
+The database is created in the current locale.
+To create a database,
+<xref linkend='XGetDefault' xrefstyle='select: title'/>
+uses resources from the RESOURCE_MANAGER property on the root
+window of screen zero.
+If no such property exists,
+a resource file in the user's home directory is used.
+On a <acronym>POSIX</acronym>-conformant system,
+this file is
+<function>"$HOME/.Xdefaults"</function>.
+<indexterm><primary>Files</primary><secondary><filename>$HOME/.Xdefaults</filename></secondary></indexterm>
+After loading these defaults,
+<xref linkend='XGetDefault' xrefstyle='select: title'/>
+merges additional defaults specified by the XENVIRONMENT
+environment variable.
+If XENVIRONMENT is defined,
+it contains a full path name for the additional resource file.
+If XENVIRONMENT is not defined,
+<xref linkend='XGetDefault' xrefstyle='select: title'/>
+looks for
+"<filename>$HOME/.Xdefaults-<replaceable>name</replaceable></filename>" ,
+where <replaceable>name</replaceable> specifies the name of the machine on which the application
+is running.
+</para>
+</sect2>
+</sect1>
+<sect1 id="X_Version_10_Compatibility_Functions">
+<title>X Version 10 Compatibility Functions</title>
+<para>
+You can use the X Version 10 compatibility functions to:
+<itemizedlist>
+  <listitem>
+    <para>
+Draw and fill polygons and curves
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Associate user data with a value
+    </para>
+  </listitem>
+</itemizedlist>
+</para>
+<sect2 id="Drawing_and_Filling_Polygons_and_Curves">
+<title>Drawing and Filling Polygons and Curves</title>
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to draw or fill
+arbitrary polygons or curves.  
+These functions are provided mainly for compatibility with X Version 10 
+and have no server support.  
+That is, they call other Xlib functions, not the server directly.  
+Thus, if you just have straight lines to draw, using 
+<xref linkend='XDrawLines' xrefstyle='select: title'/>
+<indexterm><primary>XDrawLines</primary></indexterm>
+or
+<xref linkend='XDrawSegments' xrefstyle='select: title'/>
+<indexterm><primary>XDrawSegments</primary></indexterm>
+is much faster.
+</para>
+<para>
+<!-- .LP -->
+The functions discussed here provide all the functionality of the 
+X Version 10 functions 
+<xref linkend='XDraw' xrefstyle='select: title'/>,
+<indexterm ><primary>X10 compatibility</primary><secondary>XDraw</secondary></indexterm>
+<xref linkend='XDrawFilled' xrefstyle='select: title'/>,
+<indexterm><primary>X10 compatibility</primary><secondary>XDrawFilled</secondary></indexterm>
+<function>XDrawPatterned</function>,
+<indexterm ><primary>X10 compatibility</primary><secondary>XDrawPatterned</secondary></indexterm>
+<function>XDrawDashed</function>,
+<indexterm><primary>X10 compatibility</primary><secondary>XDrawDashed</secondary></indexterm>
+and
+<function>XDrawTiled</function>.
+<indexterm><primary>X10 compatibility</primary><secondary>XDrawTiled</secondary></indexterm>
+They are as compatible as possible given X Version 11's new line-drawing 
+functions.  
+One thing to note, however, is that
+<function>VertexDrawLastPoint</function>
+is no longer supported. 
+Also, the error status returned is the opposite of what it was under 
+X Version 10 (this is the X Version 11 standard error status).  
+<function>XAppendVertex</function>
+and 
+<function>XClearVertexFlag</function>
+from X Version 10 also are not supported.
+</para>
+<para>
+<!-- .LP -->
+Just how the graphics context you use is set up actually
+determines whether you get dashes or not, and so on.  
+Lines are properly joined if they connect and include
+the closing of a closed figure  (see 
+<xref linkend='XDrawLines' xrefstyle='select: title'/>).
+The functions discussed here fail (return zero) only if they run out of memory
+or are passed a 
+<structname>Vertex</structname>
+list that has a 
+<structname>Vertex</structname>
+with 
+<symbol>VertexStartClosed</symbol>
+set that is not followed by a 
+<structname>Vertex</structname>
+with 
+<symbol>VertexEndClosed</symbol>
+set.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To achieve the effects of the X Version 10
+<xref linkend='XDraw' xrefstyle='select: title'/>,
+<indexterm ><primary>X10 compatibility</primary><secondary>XDraw</secondary></indexterm>
+<function>XDrawDashed</function>,
+<indexterm><primary>X10 compatibility</primary><secondary>XDrawDashed</secondary></indexterm>
+and 
+<function>XDrawPatterned</function>,
+<indexterm ><primary>X10 compatibility</primary><secondary>XDrawPatterned</secondary></indexterm>
+use
+<xref linkend='XDraw' xrefstyle='select: title'/>.
+</para>
+
+<para>
+#include &lt;X11/X10.h&gt;
+</para>
+
+<funcsynopsis id='XDraw'>
+<funcprototype>
+  <funcdef>Status <function>XDraw</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>Vertex<parameter> *vlist</parameter></paramdef>
+  <paramdef>int<parameter> vcount</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>vlist</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a pointer to the list of vertices that indicate what to draw.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>vcount</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies how many vertices are in vlist.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XDraw' xrefstyle='select: title'/>
+function draws an arbitrary polygon or curve.  
+The figure drawn is defined by the specified list of vertices (vlist).
+The points are connected by lines as specified in the flags in the
+vertex structure.
+</para>
+<para>
+<!-- .LP -->
+Each Vertex, as defined in
+<filename class="headerfile">&lt;X11/X10.h&gt;</filename>,
+<indexterm type="file"><primary><filename class="headerfile">X11/X10.h</filename></primary></indexterm>
+<indexterm><primary>Files</primary><secondary><filename class="headerfile">&lt;X11/X10.h&gt;</filename></secondary></indexterm>
+<indexterm><primary>Headers</primary><secondary><filename class="headerfile">&lt;X11/X10.h&gt;</filename></secondary></indexterm>
+is a structure with the following members:
+<indexterm significance="preferred"><primary>Vertex</primary></indexterm>
+<synopsis>
+typedef struct _Vertex {
+       short x,y;
+       unsigned short flags;
+} Vertex;
+</synopsis>
+The x and y members are the coordinates of the vertex 
+that are relative to either the upper left inside corner of the drawable 
+(if 
+<symbol>VertexRelative</symbol>
+is zero) or the previous vertex (if 
+<symbol>VertexRelative</symbol>
+is one).
+</para>
+<para>
+<!-- .LP -->
+The flags, as defined in 
+<filename class="headerfile">&lt;X11/X10.h&gt;</filename>,
+<indexterm type="file"><primary><filename class="headerfile">X11/X10.h</filename></primary></indexterm>
+<indexterm><primary>Files</primary><secondary><filename class="headerfile">&lt;X11/X10.h&gt;</filename></secondary></indexterm>
+<indexterm><primary>Headers</primary><secondary><filename class="headerfile">&lt;X11/X10.h&gt;</filename></secondary></indexterm>
+are as follows:
+<indexterm significance="preferred"><primary>VertexRelative</primary></indexterm>
+<indexterm significance="preferred"><primary>VertexDontDraw</primary></indexterm>
+<indexterm significance="preferred"><primary>VertexCurved</primary></indexterm>
+<indexterm significance="preferred"><primary>VertexStartClosed</primary></indexterm>
+<indexterm significance="preferred"><primary>VertexEndClosed</primary></indexterm>
+<!-- .sM -->
+
+<synopsis>
+VertexRelative     0x0001     /* else absolute */
+VertexDontDraw     0x0002     /* else draw */
+VertexCurved       0x0004     /* else straight */
+VertexStartClosed  0x0008     /* else not */
+VertexEndClosed    0x0010     /* else not */
+</synopsis>
+
+<itemizedlist>
+  <listitem>
+    <para>
+If 
+<symbol>VertexRelative</symbol>
+is not set,  
+the coordinates are absolute (that is, relative to the drawable's origin).  
+The first vertex must be an absolute vertex.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If
+<symbol>VertexDontDraw</symbol>
+is one, 
+no line or curve is drawn from the previous vertex to this one.  
+This is analogous to picking up the pen and moving to another place 
+before drawing another line.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If 
+<symbol>VertexCurved</symbol>
+is one, 
+a spline algorithm is used to draw a smooth curve from the previous vertex
+through this one to the next vertex.  
+Otherwise, a straight line is drawn from the previous vertex to this one.  
+It makes sense to set 
+<symbol>VertexCurved</symbol>
+to one only if a previous and next vertex are both defined
+(either explicitly in the array or through the definition of a closed 
+curve).
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It is permissible for 
+<symbol>VertexDontDraw</symbol>
+bits and 
+<symbol>VertexCurved</symbol>
+bits both to be one. 
+This is useful if you want to define the previous point for the smooth curve
+but do not want an actual curve drawing to start until this point.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If 
+<symbol>VertexStartClosed</symbol>
+is one, 
+then this point marks the beginning of a closed curve.  
+This vertex must be followed later in the array by another vertex 
+whose effective coordinates are identical
+and that has a
+<symbol>VertexEndClosed</symbol>
+bit of one.
+The points in between form a cycle to determine predecessor 
+and successor vertices for the spline algorithm.
+    </para>
+  </listitem>
+</itemizedlist>
+</para>
+<para>
+<!-- .LP -->
+This function uses these GC components:
+function, plane-mask, line-width, line-style, cap-style, join-style,
+fill-style, subwindow-mode, clip-x-origin, clip-y-origin, and
+clip-mask.
+It also uses these GC mode-dependent components: 
+foreground, background, tile, stipple,
+tile-stipple-x-origin, tile-stipple-y-origin, dash-offset, and dash-list.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To achieve the effects of the X Version 10
+<function>XDrawTiled</function>
+<indexterm><primary>X10 compatibility</primary><secondary>XDrawTiled</secondary></indexterm>
+and 
+<xref linkend='XDrawFilled' xrefstyle='select: title'/>,
+<indexterm><primary>X10 compatibility</primary><secondary>XDrawFilled</secondary></indexterm>
+use
+<xref linkend='XDrawFilled' xrefstyle='select: title'/>.
+</para>
+
+<para>#include &lt;X11/X10.h&gt;</para>
+
+<funcsynopsis id='XDrawFilled'>
+<funcprototype>
+  <funcdef>Status <function>XDrawFilled</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>Vertex<parameter> *vlist</parameter></paramdef>
+  <paramdef>int<parameter> vcount</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>vlist</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a pointer to the list of vertices that indicate what to draw.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>vcount</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies how many vertices are in vlist.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XDrawFilled' xrefstyle='select: title'/>
+function draws arbitrary polygons or curves and then fills them.
+</para>
+<para>
+<!-- .LP -->
+This function uses these GC components:
+function, plane-mask, line-width, line-style, cap-style, join-style,
+fill-style, subwindow-mode, clip-x-origin, clip-y-origin, and
+clip-mask.
+It also uses these GC mode-dependent components: 
+foreground, background, tile, stipple,
+tile-stipple-x-origin, tile-stipple-y-origin, 
+dash-offset, dash-list, fill-style, and fill-rule.
+</para>
+</sect2>
+<sect2 id="Associating_User_Data_with_a_Value">
+<title>Associating User Data with a Value</title>
+<para>
+<!-- .LP -->
+These functions have been superseded by the context management functions
+(see <link linkend="Using_the_Context_Manager">section 16.10</link>).
+It is often necessary to associate arbitrary information with resource IDs.
+Xlib provides the 
+<function>XAssocTable</function>
+functions that you can use to make such an association.
+<indexterm><primary>Hash Lookup</primary></indexterm>
+<indexterm><primary>Window</primary><secondary>IDs</secondary></indexterm>
+<indexterm><primary>Resource IDs</primary></indexterm>
+Application programs often need to be able to easily refer to
+their own data structures when an event arrives.
+The 
+<function>XAssocTable</function>
+system provides users of the X library with a method
+for associating their own data structures with X resources
+(<type>Pixmap</type>s,
+<type>Font</type>s,
+<type>Window</type>s,
+and so on).
+</para>
+<para>
+<!-- .LP -->
+An 
+<function>XAssocTable</function>
+can be used to type X resources.  
+For example, the user
+may want to have three or four types of windows,
+each with different properties. 
+This can be accomplished by associating each X window ID
+with a pointer to a window property data structure  defined  by  the
+user.
+A generic type has been defined in the X library for resource IDs.
+It is called an XID.
+</para>
+<para>
+<!-- .LP -->
+There are a few  guidelines  that  should be observed when using an
+<function>XAssocTable</function> :
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+All  XIDs  are  relative  to  the  specified display.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Because  of  the  hashing  scheme  used  by  the  association mechanism,
+the following rules for determining the size of a
+<function>XAssocTable</function>
+should be followed.  
+Associations will be  made  and  looked  up  more
+efficiently  if  the  table  size  (number  of  buckets in the hashing
+system) is a power of two and if there are not more than 8 XIDs  per
+bucket.
+    </para>
+  </listitem>
+</itemizedlist>
+
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To return a pointer to a new
+<function>XAssocTable</function>,
+use 
+<xref linkend='XCreateAssocTable' xrefstyle='select: title'/>.
+<indexterm significance="preferred"><primary>XCreateAssocTable</primary></indexterm>
+<!-- .sM -->
+</para>
+<funcsynopsis id='XCreateAssocTable'>
+<funcprototype>
+  <funcdef>XAssocTable *<function>XCreateAssocTable</function></funcdef>
+  <paramdef>int<parameter> size</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>size</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of buckets in the hash system of
+<function>XAssocTable</function>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The size argument specifies the number of buckets in the 
+hash system of
+<function>XAssocTable</function>.
+For  reasons  of  efficiency  the number of buckets
+should be a power of two.
+Some size  suggestions  might  be:  use  32 buckets  per  100  objects,
+and a reasonable maximum number of objects per buckets is 8.
+If  an  error  allocating  memory  for  the
+<function>XAssocTable</function>
+occurs, 
+a NULL pointer is returned. 
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To create an entry in a given 
+<function>XAssocTable</function>,
+use 
+<xref linkend='XMakeAssoc' xrefstyle='select: title'/>.
+<indexterm significance="preferred"><primary>XMakeAssoc</primary></indexterm>
+<!-- .sM -->
+</para>
+<funcsynopsis id='XMakeAssoc'>
+<funcprototype>
+  <funcdef><function>XMakeAssoc</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XAssocTable<parameter> *table</parameter></paramdef>
+  <paramdef>XID<parameter> x_id</parameter></paramdef>
+  <paramdef>char<parameter> *data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>table</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the assoc table. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x_id</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the X resource ID.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the data to be associated with the X resource ID.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XMakeAssoc' xrefstyle='select: title'/>
+function inserts data into an 
+<function>XAssocTable</function>
+keyed on an XID.
+Data is inserted into the table only once.
+Redundant inserts are ignored.
+The queue in each association bucket is sorted from the lowest XID to 
+the highest XID.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain data from a given 
+<function>XAssocTable</function>,
+use 
+<xref linkend='XLookUpAssoc' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XLookUpAssoc</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XLookUpAssoc'>
+<funcprototype>
+  <funcdef>char *<function>XLookUpAssoc</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XAssocTable<parameter> *table</parameter></paramdef>
+  <paramdef>XID<parameter> x_id</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>table</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the assoc table. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x_id</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the X resource ID.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XLookUpAssoc' xrefstyle='select: title'/>
+function retrieves the data stored in an 
+<function>XAssocTable</function>
+by its XID.  
+If  an appropriately  matching XID can be found in the table,
+<xref linkend='XLookUpAssoc' xrefstyle='select: title'/>
+returns the data associated with it.
+If the x_id cannot be found in the table,
+it returns NULL.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To delete an entry from a given 
+<function>XAssocTable</function>,
+use 
+<xref linkend='XDeleteAssoc' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDeleteAssoc</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDeleteAssoc'>
+<funcprototype>
+  <funcdef><function>XDeleteAssoc</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XAssocTable<parameter> *table</parameter></paramdef>
+  <paramdef>XID<parameter> x_id</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>table</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the assoc table. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x_id</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the X resource ID.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XDeleteAssoc' xrefstyle='select: title'/>
+function deletes an association in an 
+<function>XAssocTable</function>
+keyed on its XID.
+Redundant deletes (and deletes of nonexistent XIDs) are ignored.
+Deleting associations in no way impairs the performance of an
+<function>XAssocTable</function>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To free the memory associated with a given 
+<function>XAssocTable</function>,
+use 
+<xref linkend='XDestroyAssocTable' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDestroyAssocTable</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDestroyAssocTable'>
+<funcprototype>
+  <funcdef><function>XDestroyAssocTable</function></funcdef>
+  <paramdef>XAssocTable<parameter> *table</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>table</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the assoc table. 
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+</sect2>
+</sect1>
+</appendix>
diff --git a/specs/libX11/CH01.xml b/specs/libX11/CH01.xml
new file mode 100644 (file)
index 0000000..67744cf
--- /dev/null
@@ -0,0 +1,847 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+         "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
+<chapter id="Introduction_to_Xlib"><title>Introduction to Xlib</title>
+
+  <para>
+The X Window System is a network-transparent window system that was
+designed at MIT. X display servers run on computers with either
+monochrome or color bitmap display hardware. The server distributes
+user input to and accepts output requests from various client programs
+located either on the same machine or elsewhere in the network. Xlib
+is a C subroutine library that application programs (clients) use to
+interface with the window system by means of a stream connection.
+Although a client usually runs on the same machine as the X server
+it is talking to, this need not be the case.
+  </para>
+  <para>
+<citetitle>Xlib − C Language X Interface</citetitle> is a reference
+guide to the low-level C language interface to the X Window System
+protocol. It is neither a tutorial nor a user’s guide to programming
+the X Window System. Rather, it provides a detailed description of
+each function in the library as well as a discussion of the related
+background information. <citetitle>Xlib − C Language X Interface</citetitle>
+assumes a basic understanding of a graphics window system and of the C
+programming language. Other higher-level abstractions (for example,
+those provided by the toolkits for X) are built on top of the Xlib
+library. For further information about these higher-level libraries,
+see the appropriate toolkit documentation.
+The <olink targetdoc='x11protocol' targetptr='x11protocol'
+><citetitle>X Window System Protocol</citetitle></olink> provides the
+definitive word on the behavior of X.
+Although additional information appears here, the protocol document is
+the ruling document.
+  </para>
+  <para>
+To provide an introduction to X programming, this chapter discusses:
+
+    <itemizedlist>
+      <listitem><para><link linkend="Overview_of_the_X_Window_System">Overview of the X Window System</link></para></listitem>
+      <listitem><para><link linkend="Errors">Errors</link></para></listitem>
+      <listitem><para><link linkend="Standard_Header_Files">Standard header files</link></para></listitem>
+      <listitem><para><link linkend="Generic_Values_and_Types">Generic values and types</link></para></listitem>
+      <listitem><para><link linkend="Naming_and_Argument_Conventions_within_Xlib">Naming and argument conventions within Xlib</link></para></listitem>
+      <listitem><para><link linkend="Programming_Considerations">Programming considerations</link></para></listitem>
+      <listitem><para><link linkend="Character_Sets_and_Encodings">Character sets and encodings</link></para></listitem>
+      <listitem><para><link linkend="Formatting_Conventions">Formatting conventions</link></para></listitem>
+    </itemizedlist>
+  </para>
+
+  <sect1 id="Overview_of_the_X_Window_System">
+    <title>Overview of the X Window System</title>
+    <para>
+Some of the terms used in this book are unique to X,
+and other terms that are common to other window systems
+have different meanings in X. You may find it helpful to refer to
+<link linkend="glossary">the glossary</link>,
+which is located at the end of the book.
+    </para>
+    <para>
+The X Window System supports one or more screens containing
+overlapping windows or subwindows.
+<indexterm><primary>Screen</primary></indexterm>
+A <firstterm>screen</firstterm> is a physical monitor and hardware
+that can be color, grayscale, or monochrome.
+There can be multiple screens for each display or workstation.
+A single X server can provide display services for any number of screens.
+A set of screens for a single user with one keyboard and one pointer
+(usually a mouse) is called a <firstterm>display</firstterm>.
+    </para>
+    <para>
+All the windows in an X server are arranged in strict hierarchies.
+At the top of each hierarchy is a <firstterm>root window</firstterm>,
+which covers each of the display screens.
+Each root window is partially or completely covered by child windows.
+All windows, except for root windows, have parents.
+There is usually at least one window for each application program.
+<indexterm><primary>Child window</primary></indexterm>
+<indexterm><primary>Parent Window</primary></indexterm>
+Child windows may in turn have their own children.
+In this way,
+an application program can create an arbitrarily deep tree
+on each screen.
+X provides graphics, text, and raster operations for windows.
+    </para>
+    <para>
+A child window can be larger than its parent.
+That is, part or all of
+the child window can extend beyond the boundaries of the parent,
+but all output to a window is clipped by its parent.
+<indexterm><primary>Stacking order</primary></indexterm>
+If several children of a window have overlapping locations,
+one of the children is considered to be on top of or raised over the
+others, thus obscuring them.
+Output to areas covered by other windows is suppressed by the window
+system unless the window has backing store.
+If a window is obscured by a second window,
+the second window obscures only those ancestors of the second window
+that are also ancestors of the first window.
+    </para>
+    <para>
+<indexterm significance="preferred"><primary>Window</primary></indexterm>
+A window has a border zero or more pixels in width, which can
+be any pattern (pixmap) or solid color you like.
+A window usually but not always has a background pattern,
+which will be repainted by the window system when uncovered.
+Child windows obscure their parents,
+and graphic operations in the parent window usually
+are clipped by the children.
+    </para>
+    <para>
+Each window and pixmap has its own coordinate system.
+The coordinate system has the X axis horizontal and the Y axis vertical
+with the origin [0, 0] at the upper-left corner.
+Coordinates are integral,
+in terms of pixels,
+and coincide with pixel centers.
+For a window,
+the origin is inside the border at the inside, upper-left corner.
+    </para>
+    <para>
+X does not guarantee to preserve the contents of windows.
+When part or all of a window is hidden and then brought back onto the screen,
+its contents may be lost.
+The server then sends the client program an
+<systemitem class="event">Expose</systemitem>
+event to notify it that part or all of the window needs to be repainted.
+Programs must be prepared to regenerate the contents of windows on demand.
+    </para>
+    <para>
+<indexterm><primary>Pixmap</primary></indexterm>
+<indexterm><primary>Drawable</primary></indexterm>
+<indexterm><primary>Tile</primary></indexterm>
+<indexterm><primary>Bitmap</primary></indexterm>
+X also provides off-screen storage of graphics objects,
+called <firstterm linkend="glossary:Pixmap">pixmaps</firstterm>.
+Single plane (depth 1) pixmaps are sometimes referred to as
+<firstterm>bitmaps</firstterm>.
+Pixmaps can be used in most graphics functions interchangeably with
+windows and are used in various graphics operations to define patterns or tiles.
+Windows and pixmaps together are referred to as drawables.
+    </para>
+    <para>
+Most of the functions in Xlib just add requests to an output buffer.
+These requests later execute asynchronously on the X server.
+Functions that return values of information stored in
+the server do not return (that is, they block)
+until an explicit reply is received or an error occurs.
+You can provide an error handler,
+which will be called when the error is reported.
+    </para>
+    <para>
+<indexterm><primary>XSync</primary></indexterm>
+If a client does not want a request to execute asynchronously,
+it can follow the request with a call to
+<xref linkend='XSync' xrefstyle='select: title'/>,
+which blocks until all previously buffered
+asynchronous events have been sent and acted on.
+As an important side effect,
+the output buffer in Xlib is always flushed by a call to any function
+that returns a value from the server or waits for input.
+    </para>
+    <para>
+<indexterm><primary>Resource IDs</primary></indexterm>
+<indexterm><primary>Resource IDs</primary><secondary>Window</secondary></indexterm>
+<indexterm><primary>Resource IDs</primary><secondary>Font</secondary></indexterm>
+<indexterm><primary>Resource IDs</primary><secondary>Pixmap</secondary></indexterm>
+<indexterm><primary>Resource IDs</primary><secondary>Colormap</secondary></indexterm>
+<indexterm><primary>Resource IDs</primary><secondary>Cursor</secondary></indexterm>
+<indexterm><primary>Resource IDs</primary><secondary>GContext</secondary></indexterm>
+Many Xlib functions will return an integer resource ID,
+which allows you to refer to objects stored on the X server.
+These can be of type
+<type>Window</type>,
+<type>Font</type>,
+<type>Pixmap</type>,
+<type>Colormap</type>,
+<type>Cursor</type>,
+and
+<type>GContext</type>,
+as defined in the file
+<filename class="headerfile">&lt;X11/X.h&gt;</filename>.
+<indexterm type="file"><primary><filename class="headerfile">X11/X.h</filename></primary></indexterm>
+<indexterm><primary>Files</primary><secondary><filename class="headerfile">&lt;X11/X.h&gt;</filename></secondary></indexterm>
+<indexterm><primary>Headers</primary><secondary><filename class="headerfile">&lt;X11/X.h&gt;</filename></secondary></indexterm>
+These resources are created by requests and are destroyed
+(or freed) by requests or when connections are closed.
+Most of these resources are potentially sharable between
+applications, and in fact, windows are manipulated explicitly by
+window manager programs.
+Fonts and cursors are shared automatically across multiple screens.
+Fonts are loaded and unloaded as needed and are shared by multiple clients.
+Fonts are often cached in the server.
+Xlib provides no support for sharing graphics contexts between applications.
+    </para>
+    <para>
+<indexterm><primary>Event</primary></indexterm>
+Client programs are informed of events.
+Events may either be side effects of a request (for example, restacking windows
+generates
+<systemitem class="event">Expose</systemitem>
+events) or completely asynchronous (for example, from the keyboard).
+A client program asks to be informed of events.
+Because other applications can send events to your application,
+programs must be prepared to handle (or ignore) events of all types.
+    </para>
+    <para>
+Input events (for example, a key pressed or the pointer moved)
+arrive asynchronously from the server and are queued until they are
+requested by an explicit call (for example,
+<xref linkend='XNextEvent' xrefstyle='select: title'/>
+or
+<xref linkend='XWindowEvent' xrefstyle='select: title'/>).
+In addition, some library
+functions (for example,
+<xref linkend='XRaiseWindow' xrefstyle='select: title'/>)
+generate
+<symbol>Expose</symbol>
+and
+<symbol>ConfigureRequest</symbol>
+events.
+These events also arrive asynchronously, but the client may
+<indexterm><primary>XSync</primary></indexterm>
+wish to explicitly wait for them by calling
+<xref linkend='XSync' xrefstyle='select: title'/>
+after calling a function that can cause the server to generate events.
+    </para>
+  </sect1>
+
+  <sect1 id="Errors">
+    <title>Errors</title>
+
+    <para>
+Some functions return
+<type>Status</type>,
+an integer error indication.
+If the function fails, it returns a zero.
+If the function returns a status of zero,
+it has not updated the return arguments.
+<indexterm><primary>Status</primary></indexterm>
+Because C does not provide multiple return values,
+many functions must return their results by writing into client-passed storage.
+<indexterm><primary>Error</primary><secondary>handling</secondary></indexterm>
+By default, errors are handled either by a standard library function
+or by one that you provide.
+Functions that return pointers to strings return NULL pointers if
+the string does not exist.
+    </para>
+    <para>
+The X server reports protocol errors at the time that it detects them.
+If more than one error could be generated for a given request,
+the server can report any of them.
+    </para>
+    <para>
+Because Xlib usually does not transmit requests to the server immediately
+(that is, it buffers them), errors can be reported much later than they
+actually occur.
+For debugging purposes, however,
+Xlib provides a mechanism for forcing synchronous behavior
+(see <link linkend="Enabling_or_Disabling_Synchronization">section 11.8.1</link>).
+When synchronization is enabled,
+errors are reported as they are generated.
+    </para>
+    <para>
+When Xlib detects an error,
+it calls an error handler,
+which your program can provide.
+If you do not provide an error handler,
+the error is printed, and your program terminates.
+    </para>
+  </sect1>
+
+  <sect1 id="Standard_Header_Files">
+    <title>Standard Header Files</title>
+
+    <para>
+The following include files are part of the Xlib standard:
+<indexterm><primary>Headers</primary></indexterm>
+
+<variablelist>
+  <varlistentry id="Standard_Header_Files:Xlib.h">
+    <term><filename class="headerfile">&lt;X11/Xlib.h&gt;</filename></term>
+    <listitem>
+      <indexterm type="file"><primary><filename class="headerfile">X11/Xlib.h</filename></primary></indexterm>
+      <indexterm><primary>Files</primary><secondary>&lt;X11/Xlib.h&gt;</secondary></indexterm>
+      <indexterm><primary>Headers</primary><secondary>&lt;X11/Xlib.h&gt;</secondary></indexterm>
+      <para>
+This is the main header file for Xlib.
+The majority of all Xlib symbols are declared by including this file.
+This file also contains the preprocessor symbol
+<symbol>XlibSpecificationRelease</symbol>.
+<indexterm significance="preferred"><primary>XlibSpecificationRelease</primary></indexterm>
+This symbol is defined to have the 6 in this release of the standard.
+(Release 5 of Xlib was the first release to have this symbol.)
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry id="Standard_Header_Files:X.h">
+    <term><filename class="headerfile">&lt;X11/X.h&gt;</filename></term>
+    <listitem>
+      <indexterm type="file"><primary><filename class="headerfile">X11/X.h</filename></primary></indexterm>
+      <indexterm><primary>Files</primary><secondary>&lt;X11/X.h&gt;</secondary></indexterm>
+      <indexterm><primary>Headers</primary><secondary>&lt;X11/X.h&gt;</secondary></indexterm>
+      <para>
+This file declares types and constants for the X protocol that are
+to be used by applications.  It is included automatically from
+<filename class="headerfile">&lt;X11/Xlib.h&gt;</filename>
+so application code should never need to
+reference this file directly.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry id="Standard_Header_Files:Xcms.h">
+    <term><filename class="headerfile">&lt;X11/Xcms.h&gt;</filename></term>
+    <listitem>
+      <indexterm type="file"><primary><filename class="headerfile">X11/Xcms.h</filename></primary></indexterm>
+      <indexterm><primary>Files</primary><secondary>&lt;X11/Xcms.h&gt;</secondary></indexterm>
+      <indexterm><primary>Headers</primary><secondary>&lt;X11/Xcms.h&gt;</secondary></indexterm>
+      <para>
+This file contains symbols for much of the color management facilities
+described in <link linkend='Color_Management_Functions'>chapter 6</link>.
+All functions, types, and symbols with the prefix "Xcms",
+plus the Color Conversion Contexts macros, are declared in this file.
+<filename class="headerfile">&lt;X11/Xlib.h&gt;</filename>
+must be included before including this file.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry id="Standard_Header_Files:Xutil.h">
+    <term><filename class="headerfile">&lt;X11/Xutil.h&gt;</filename></term>
+    <listitem>
+      <indexterm type="file"><primary><filename class="headerfile">X11/Xutil.h</filename></primary></indexterm>
+      <indexterm><primary>Files</primary><secondary>&lt;X11/Xutil.h&gt;</secondary></indexterm>
+      <indexterm><primary>Headers</primary><secondary>&lt;X11/Xutil.h&gt;</secondary></indexterm>
+      <para>
+This file declares various functions, types, and symbols used for
+inter-client communication and application utility functions,
+which are described in chapters
+<link linkend='Inter_Client_Communication_Functions'>14</link> and
+<link linkend='Application_Utility_Functions'>16</link>.
+<filename class="headerfile">&lt;X11/Xlib.h&gt;</filename> must be included before including this file.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry id="Standard_Header_Files:Xresource.h">
+    <term><filename class="headerfile">&lt;X11/Xresource.h&gt;</filename></term>
+    <listitem>
+      <indexterm type="file"><primary><filename class="headerfile">X11/Xresource.h</filename></primary></indexterm>
+      <indexterm><primary>Files</primary><secondary>&lt;X11/Xresource.h&gt;</secondary></indexterm>
+      <indexterm><primary>Headers</primary><secondary>&lt;X11/Xresource.h&gt;</secondary></indexterm>
+      <para>
+This file declares all functions, types, and symbols for the
+resource manager facilities, which are described in
+<link linkend='Resource_Manager_Functions'>chapter 15</link>.
+<filename class="headerfile">&lt;X11/Xlib.h&gt;</filename> <!-- xref -->
+must be included before including this file.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry id="Standard_Header_Files:Xatom.h">
+    <term><filename class="headerfile">&lt;X11/Xatom.h&gt;</filename></term>
+    <listitem>
+      <indexterm type="file"><primary><filename class="headerfile">X11/Xatom.h</filename></primary></indexterm>
+      <indexterm><primary>Files</primary><secondary>&lt;X11/Xatom.h&gt;</secondary></indexterm>
+      <indexterm><primary>Headers</primary><secondary>&lt;X11/Xatom.h&gt;</secondary></indexterm>
+      <para>
+This file declares all predefined atoms,
+which are symbols with the prefix "XA_".
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry id="Standard_Header_Files:cursorfont.h">
+    <term><filename class="headerfile">&lt;X11/cursorfont.h&gt;</filename></term>
+    <listitem>
+      <indexterm type="file"><primary><filename class="headerfile">X11/cursorfont.h</filename></primary></indexterm>
+      <indexterm><primary>Files</primary><secondary>&lt;X11/cursorfont.h&gt;</secondary></indexterm>
+      <indexterm><primary>Headers</primary><secondary>&lt;X11/cursorfont.h&gt;</secondary></indexterm>
+      <para>
+This file declares the cursor symbols for the standard cursor font,
+which are listed in <link linkend="x_font_cursors">Appendix B</link>.
+All cursor symbols have the prefix "XC_".
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry id="Standard_Header_Files:keysymdef.h">
+    <term><filename class="headerfile">&lt;X11/keysymdef.h&gt;</filename></term>
+    <listitem>
+      <indexterm type="file"><primary><filename class="headerfile">X11/keysymdef.h</filename></primary></indexterm>
+      <indexterm><primary>Files</primary><secondary>&lt;X11/keysymdef.h&gt;</secondary></indexterm>
+      <indexterm><primary>Headers</primary><secondary>&lt;X11/keysymdef.h&gt;</secondary></indexterm>
+      <para>
+This file declares all standard KeySym values,
+which are symbols with the prefix "XK_".
+The KeySyms are arranged in groups, and a preprocessor symbol controls
+inclusion of each group.  The preprocessor symbol must be defined
+prior to inclusion of the file to obtain the associated values.
+The preprocessor symbols are
+<symbol>XK_MISCELLANY</symbol>,
+<symbol>XK_XKB_KEYS</symbol>,
+<symbol>XK_3270</symbol>,
+<symbol>XK_LATIN1</symbol>,
+<symbol>XK_LATIN2</symbol>,
+<symbol>XK_LATIN3</symbol>,
+<symbol>XK_LATIN4</symbol>,
+<symbol>XK_KATAKANA</symbol>,
+<symbol>XK_ARABIC</symbol>,
+<symbol>XK_CYRILLIC</symbol>,
+<symbol>XK_GREEK</symbol>,
+<symbol>XK_TECHNICAL</symbol>,
+<symbol>XK_SPECIAL</symbol>,
+<symbol>XK_PUBLISHING</symbol>,
+<symbol>XK_APL</symbol>,
+<symbol>XK_HEBREW</symbol>,
+<symbol>XK_THAI</symbol>, and
+<symbol>XK_KOREAN</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry id="Standard_Header_Files:keysym.h">
+    <term><filename class="headerfile">&lt;X11/keysym.h&gt;</filename></term>
+    <listitem>
+      <indexterm type="file"><primary><filename class="headerfile">X11/keysym.h</filename></primary></indexterm>
+      <indexterm><primary>Files</primary><secondary>&lt;X11/keysym.h&gt;</secondary></indexterm>
+      <indexterm><primary>Headers</primary><secondary>&lt;X11/keysym.h&gt;</secondary></indexterm>
+      <para>
+This file defines the preprocessor symbols
+<symbol>XK_MISCELLANY</symbol>,
+<symbol>XK_XKB_KEYS</symbol>,
+<symbol>XK_LATIN1</symbol>,
+<symbol>XK_LATIN2</symbol>,
+<symbol>XK_LATIN3</symbol>,
+<symbol>XK_LATIN4</symbol>, and
+<symbol>XK_GREEK</symbol>
+and then includes <filename class="headerfile">&lt;X11/keysymdef.h&gt;</filename>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry id="Standard_Header_Files:Xlibint.h">
+    <term><filename class="headerfile">&lt;X11/Xlibint.h&gt;</filename></term>
+    <listitem>
+      <indexterm type="file"><primary><filename class="headerfile">X11/Xlibint.h</filename></primary></indexterm>
+      <indexterm><primary>Files</primary><secondary>&lt;X11/Xlibint.h&gt;</secondary></indexterm>
+      <indexterm><primary>Headers</primary><secondary>&lt;X11/Xlibint.h&gt;</secondary></indexterm>
+      <para>
+This file declares all the functions, types, and symbols used for
+extensions, which are described in <link linkend="extensions">Appendix C</link>.
+This file automatically includes
+<filename class="headerfile">&lt;X11/Xlib.h&gt;</filename>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry id="Standard_Header_Files:Xproto.h">
+    <term><filename class="headerfile">&lt;X11/Xproto.h&gt;</filename></term>
+    <listitem>
+      <indexterm type="file"><primary><filename class="headerfile">X11/Xproto.h</filename></primary></indexterm>
+      <indexterm><primary>Files</primary><secondary>&lt;X11/Xproto.h&gt;</secondary></indexterm>
+      <indexterm><primary>Headers</primary><secondary>&lt;X11/Xproto.h&gt;</secondary></indexterm>
+      <para>
+This file declares types and symbols for the basic X protocol,
+for use in implementing extensions.
+It is included automatically from
+<filename class="headerfile">&lt;X11/Xlibint.h&gt;</filename>,
+so application and extension code should never need to
+reference this file directly.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry id="Standard_Header_Files:Xprotostr.h">
+    <term><filename class="headerfile">&lt;X11/Xprotostr.h&gt;</filename></term>
+    <listitem>
+      <indexterm type="file"><primary><filename class="headerfile">X11/Xprotostr.h</filename></primary></indexterm>
+      <indexterm><primary>Files</primary><secondary>&lt;X11/Xprotostr.h&gt;</secondary></indexterm>
+      <indexterm><primary>Headers</primary><secondary>&lt;X11/Xprotostr.h&gt;</secondary></indexterm>
+      <para>
+This file declares types and symbols for the basic X protocol,
+for use in implementing extensions.
+It is included automatically from
+<filename class="headerfile">&lt;X11/Xproto.h&gt;</filename>,
+so application and extension code should never need to
+reference this file directly.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry id="Standard_Header_Files:X10.h">
+    <term><filename class="headerfile">&lt;X11/X10.h&gt;</filename></term>
+    <listitem>
+      <indexterm type="file"><primary><filename class="headerfile">X11/X10.h</filename></primary></indexterm>
+      <indexterm><primary>Files</primary><secondary>&lt;X11/X10.h&gt;</secondary></indexterm>
+      <indexterm><primary>Headers</primary><secondary>&lt;X11/X10.h&gt;</secondary></indexterm>
+      <para>
+This file declares all the functions, types, and symbols used for the
+X10 compatibility functions, which are described in
+<link linkend="X_Version_10_Compatibility_Functions">Appendix D</link>.
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+    </para>
+  </sect1>
+
+  <sect1 id="Generic_Values_and_Types">
+    <title>Generic Values and Types</title>
+
+    <para>
+The following symbols are defined by Xlib and used throughout the manual:
+<itemizedlist>
+  <listitem>
+    <para>
+<indexterm significance="preferred"><primary>Bool</primary></indexterm>
+<indexterm significance="preferred"><primary>True</primary></indexterm>
+<indexterm significance="preferred"><primary>False</primary></indexterm>
+Xlib defines the type
+<type>Bool</type>
+and the Boolean values
+<symbol>True</symbol>
+and
+<symbol>False</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<indexterm significance="preferred"><primary>None</primary></indexterm>
+<symbol>None</symbol>
+is the universal null resource ID or atom.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<indexterm significance="preferred"><primary>XID</primary></indexterm>
+The type
+<type>XID</type>
+is used for generic resource IDs.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<indexterm significance="preferred"><primary>XPointer</primary></indexterm>
+The type <type>XPointer</type> is defined to be <type>char&hairsp;*</type>
+and is used as a generic opaque pointer to data.
+    </para>
+  </listitem>
+</itemizedlist>
+    </para>
+  </sect1>
+
+  <sect1 id="Naming_and_Argument_Conventions_within_Xlib">
+    <title>Naming and Argument Conventions within Xlib</title>
+
+    <para>
+Xlib follows a number of conventions for the naming and syntax of the functions.
+Given that you remember what information the function requires,
+these conventions are intended to make the syntax of the functions more
+predictable.
+    </para>
+    <para>
+The major naming conventions are:
+<itemizedlist>
+  <listitem>
+    <para>
+To differentiate the X symbols from the other symbols,
+the library uses mixed case for external symbols.
+It leaves lowercase for variables and all uppercase for user macros,
+as per existing convention.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+All Xlib functions begin with a capital X.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The beginnings of all function names and symbols are capitalized.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+All user-visible data structures begin with a capital X.
+More generally,
+anything that a user might dereference begins with a capital X.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Macros and other symbols do not begin with a capital X.
+To distinguish them from all user symbols,
+each word in the macro is capitalized.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+All elements  of or variables in a data structure are in lowercase.
+Compound words, where needed, are constructed with underscores (_).
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The display argument, where used, is always first in the argument list.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+All resource objects, where used, occur at the beginning of the argument list
+immediately after the display argument.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+When a  graphics context is present together with
+another type of resource (most commonly, a drawable), the
+graphics context occurs in the argument list after the other
+resource.
+Drawables outrank all other resources.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Source arguments always precede the destination arguments in the argument list.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The x argument always precedes the y argument in the argument list.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The width argument always precedes the height argument in the argument list.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Where the x, y, width, and height arguments are used together,
+the x and y arguments always precede the width and height arguments.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Where a mask is accompanied with a structure,
+the mask always precedes the pointer to the structure in the argument list.
+    </para>
+  </listitem>
+</itemizedlist>
+    </para>
+  </sect1>
+
+  <sect1 id="Programming_Considerations">
+    <title>Programming Considerations</title>
+
+    <para>
+The major programming considerations are:
+<itemizedlist>
+  <listitem>
+    <para>
+Coordinates and sizes in X are actually 16-bit quantities.
+This decision was made to minimize the bandwidth required for a
+given level of performance.
+Coordinates usually are declared as an
+<type>int</type>
+in the interface.
+Values larger than 16 bits are truncated silently.
+Sizes (width and height) are declared as unsigned quantities.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Keyboards are the greatest variable between different
+manufacturers' workstations.
+If you want your program to be portable,
+you should be particularly conservative here.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Many display systems have limited amounts of off-screen memory.
+If you can, you should minimize use of pixmaps and backing
+store.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The user should have control of his screen real estate.
+Therefore, you should write your applications to react to window management
+rather than presume control of the entire screen.
+What you do inside of your top-level window, however,
+is up to your application.
+For further information,
+see <link linkend='Inter_Client_Communication_Functions'>chapter 14</link>
+and the <olink targetdoc='icccm' targetptr='icccm'><citetitle>Inter-Client Communication Conventions Manual</citetitle></olink>.
+    </para>
+  </listitem>
+</itemizedlist>
+    </para>
+  </sect1>
+
+  <sect1 id="Character_Sets_and_Encodings">
+    <title>Character Sets and Encodings</title>
+
+    <para>
+Some of the Xlib functions make reference to specific character sets
+and character encodings.
+The following are the most common:
+
+<variablelist>
+  <varlistentry>
+    <term><firstterm>X Portable Character Set</firstterm></term>
+    <listitem><para>
+A basic set of 97 characters,
+which are assumed to exist in all locales supported by Xlib.
+This set contains the following characters:
+<literallayout>
+a..z A..Z 0..9 !"#$%&amp;'()*+,-./:;&lt;=&gt;?@[\\]^_`{|}~ &lt;space&gt;, &lt;tab&gt;, and &lt;newline&gt;
+</literallayout>
+      </para>
+      <para>
+This set is the left/lower half
+of the graphic character set of ISO8859-1 plus space, tab, and newline.
+It is also the set of graphic characters in 7-bit ASCII plus the same
+three control characters.
+The actual encoding of these characters on the host is system dependent.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term><firstterm>Host Portable Character Encoding</firstterm></term>
+    <listitem>
+      <para>
+The encoding of the X Portable Character Set on the host.
+The encoding itself is not defined by this standard,
+but the encoding must be the same in all locales supported by Xlib on the host.
+If a string is said to be in the Host Portable Character Encoding,
+then it only contains characters from the X Portable Character Set,
+in the host encoding.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term><firstterm>Latin-1</firstterm></term>
+    <listitem>
+      <para>
+The coded character set defined by the ISO8859-1 standard.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term><firstterm>Latin Portable Character Encoding</firstterm></term>
+    <listitem>
+      <para>
+The encoding of the X Portable Character Set using the Latin-1 codepoints
+plus ASCII control characters.
+If a string is said to be in the Latin Portable Character Encoding,
+then it only contains characters from the X Portable Character Set,
+not all of Latin-1.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term><firstterm>STRING Encoding</firstterm></term>
+    <listitem>
+      <para>
+Latin-1, plus tab and newline.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term><firstterm><acronym>POSIX</acronym> Portable Filename Character Set</firstterm></term>
+    <listitem>
+      <para>
+The set of 65 characters,
+which can be used in naming files on a <acronym>POSIX</acronym>-compliant host,
+that are correctly processed in all locales.
+The set is:
+<literallayout>
+a..z A..Z 0..9 ._-
+</literallayout>
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+    </para>
+  </sect1>
+
+  <sect1 id="Formatting_Conventions">
+    <title>Formatting Conventions</title>
+
+    <para>
+      <citetitle>Xlib − C Language X Interface</citetitle> uses the
+      following conventions:
+
+      <itemizedlist>
+       <listitem>
+         <para>
+Global symbols are printed in
+<function>this</function>
+<function>special</function>
+<function>font</function>.
+These can be either function names,
+symbols defined in include files, or structure names.
+When declared and defined,
+function arguments are printed in <emphasis remap='I'>italics</emphasis>.
+In the explanatory text that follows,
+they usually are printed in regular type.
+         </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.
+Although ANSI C function prototype syntax is not used,
+Xlib header files normally declare functions using function prototypes
+in ANSI C environments.
+General discussion of the function, if any is required,
+follows the arguments.
+Where applicable,
+the last paragraph of the explanation lists the possible
+Xlib error codes that the function can generate.
+For a complete discussion of the Xlib error codes,
+see <link linkend="Using_the_Default_Error_Handlers">section 11.8.2</link>.
+         </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
+<emphasis remap='I'>specifies</emphasis> or, in the case of multiple arguments, the word <emphasis remap='I'>specify</emphasis>.
+The explanations for all arguments that are returned to you start with the
+word <emphasis remap='I'>returns</emphasis> or, in the case of multiple arguments, the word <emphasis remap='I'>return</emphasis>.
+The explanations for all arguments that you can pass and are returned start
+with the words <emphasis remap='I'>specifies and returns</emphasis>.
+         </para>
+       </listitem>
+       <listitem>
+         <para>
+Any pointer to a structure that is used to return a value is designated as
+such by the <emphasis remap='I'>_return</emphasis> suffix as part of its name.
+All other pointers passed to these functions are
+used for reading only.
+A few arguments use pointers to structures that are used for
+both input and output and are indicated by using the <emphasis remap='I'>_in_out</emphasis> suffix.
+         </para>
+       </listitem>
+      </itemizedlist>
+    </para>
+  </sect1>
+</chapter>
diff --git a/specs/libX11/CH02.xml b/specs/libX11/CH02.xml
new file mode 100644 (file)
index 0000000..12df68e
--- /dev/null
@@ -0,0 +1,3498 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+         "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
+<chapter id='Display_Functions'>
+<title>Display Functions</title>
+<para>
+Before your program can use a display, you must establish a connection
+to the X server.
+Once you have established a connection,
+you then can use the Xlib macros and functions discussed in this chapter
+to return information about the display.
+This chapter discusses how to:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+Open (connect to) the display
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Obtain information about the display, image formats, or screens
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Generate a
+<systemitem>NoOperation</systemitem>
+protocol request
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Free client-created data
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Close (disconnect from) a display
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Use X Server connection close operations
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Use Xlib with threads
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Use internal connections
+    </para>
+  </listitem>
+</itemizedlist>
+<sect1 id="Opening_the_Display">
+<title>Opening the Display</title>
+<!-- .XS -->
+<!-- (SN Opening the Display -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To open a connection to the X server that controls a display, use
+<xref linkend='XOpenDisplay' xrefstyle='select: title'/>.
+<indexterm significance="preferred"><primary>XOpenDisplay</primary></indexterm>
+</para>
+<funcsynopsis id='XOpenDisplay'>
+<funcprototype>
+  <funcdef>Display *<function>XOpenDisplay</function></funcdef>
+  <paramdef>char *<parameter>display_name</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display_name</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the hardware display name, which determines the display
+and communications domain to be used.
+On a <acronym>POSIX</acronym>-conformant system, if the display_name is NULL, 
+it defaults to the value of the DISPLAY environment variable. 
+<indexterm><primary>Environment</primary><secondary>DISPLAY</secondary></indexterm>
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The encoding and interpretation of the display name are
+implementation-dependent.
+Strings in the Host Portable Character Encoding are supported;
+support for other characters is implementation-dependent.
+On <acronym>POSIX</acronym>-conformant systems,
+the display name or DISPLAY environment variable can be a string in the format:
+</para>
+<!-- .LP -->
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA 1i -->
+<!-- .ta 1i -->
+       <emphasis remap='I'>protocol</emphasis>/<emphasis remap='I'>hostname</emphasis>:<emphasis remap='I'>number</emphasis>.<emphasis remap='I'>screen_number</emphasis>
+</literallayout>
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>protocol</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a protocol family or an alias for a protocol family.  Supported 
+protocol families are implementation dependent.  The protocol entry is 
+optional.  If protocol is not specified, the / separating protocol and 
+hostname must also not be specified.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>hostname</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the name of the host machine on which the display is physically
+attached.
+You follow the hostname with either a single colon (:) or a double colon (::).
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>number</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of the display server on that host machine.
+You may optionally follow this display number with a period (.).
+A single <acronym>CPU</acronym> can have more than one display.
+Multiple displays are usually numbered starting with zero.
+<indexterm><primary>Screen</primary></indexterm>
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen_number</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the screen to be used on that server.
+Multiple screens can be controlled by a single X server.
+The screen_number sets an internal variable that can be accessed by
+using the 
+<function>DefaultScreen</function>
+macro or the 
+<xref linkend='XDefaultScreen' xrefstyle='select: title'/>
+function if you are using languages other than C
+(see <link linkend='Display_Macros'>section 2.2.1</link>).
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+For example, the following would specify screen 1 of display 0 on the 
+machine named ``dual-headed'':
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+dual-headed:0.1
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+The
+<xref linkend='XOpenDisplay' xrefstyle='select: title'/>
+function returns a 
+<type>Display</type>
+structure that serves as the
+connection to the X server and that contains all the information
+about that X server.
+<xref linkend='XOpenDisplay' xrefstyle='select: title'/>
+connects your application to the X server through <acronym>TCP</acronym>
+or DECnet communications protocols,
+or through some local inter-process communication protocol.
+<indexterm><primary>Protocol</primary><secondary><acronym>TCP</acronym></secondary></indexterm>
+<indexterm><primary>Protocol</primary><secondary>DECnet</secondary></indexterm>
+If the protocol is specified as "tcp", "inet", or "inet6", or
+if no protocol is specified and the hostname is a host machine name and a single colon (:)
+separates the hostname and display number,
+<xref linkend='XOpenDisplay' xrefstyle='select: title'/>
+connects using <acronym>TCP</acronym> streams.  (If the protocol is specified as "inet", <acronym>TCP</acronym> over
+IPv4 is used.  If the protocol is specified as "inet6", <acronym>TCP</acronym> over IPv6 is used.
+Otherwise, the implementation determines which <acronym>IP</acronym> version is used.)
+If the hostname and protocol are both not specified,
+Xlib uses whatever it believes is the fastest transport.
+If the hostname is a host machine name and a double colon (::)
+separates the hostname and display number,
+<xref linkend='XOpenDisplay' xrefstyle='select: title'/>
+connects using DECnet.
+A single X server can support any or all of these transport mechanisms
+simultaneously.
+A particular Xlib implementation can support many more of these transport
+mechanisms.
+</para>
+<para>
+<!-- .LP -->
+<indexterm><primary>Display</primary></indexterm>
+If successful, 
+<xref linkend='XOpenDisplay' xrefstyle='select: title'/>
+returns a pointer to a 
+<type>Display</type>
+structure,
+which is defined in 
+<filename class="headerfile">&lt;X11/Xlib.h&gt;</filename>.
+<indexterm type="file"><primary><filename class="headerfile">X11/Xlib.h</filename></primary></indexterm>
+<indexterm><primary>Files</primary><secondary><filename class="headerfile">&lt;X11/Xlib.h&gt;</filename></secondary></indexterm>
+<indexterm><primary>Headers</primary><secondary><filename class="headerfile">&lt;X11/Xlib.h&gt;</filename></secondary></indexterm>
+If 
+<xref linkend='XOpenDisplay' xrefstyle='select: title'/>
+does not succeed, it returns NULL.
+After a successful call to
+<xref linkend='XOpenDisplay' xrefstyle='select: title'/>,
+all of the screens in the display can be used by the client.
+The screen number specified in the display_name argument is returned 
+by the 
+<function>DefaultScreen</function>
+macro (or the
+<xref linkend='XDefaultScreen' xrefstyle='select: title'/>
+function).
+You can access elements of the
+<type>Display</type>
+and
+<type>Screen</type>
+structures only by using the information macros or functions.
+For information about using macros and functions to obtain information from 
+the
+<type>Display</type>
+structure,
+see <link linkend='Display_Macros'>section 2.2.1</link>.
+</para>
+<para>
+<!-- .LP -->
+X servers may implement various types of access control mechanisms
+(see <link linkend="Controlling_Host_Access">section 9.8</link>).
+</para>
+</sect1>
+<sect1 id="Obtaining_Information_about_the_Display_Image_Formats_or_Screens">
+<title>Obtaining Information about the Display, Image Formats, or Screens</title>
+<!-- .XS -->
+<!-- (SN Obtaining Information about the Display, Image Formats, or Screens -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The Xlib library provides a number of useful macros 
+and corresponding functions that return data from the 
+<type>Display</type>
+structure.
+The macros are used for C programming, 
+and their corresponding function equivalents are for other language bindings.
+This section discusses the:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+Display macros
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Image format functions and macros
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Screen information macros
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+<indexterm ><primary>Display</primary><secondary>data structure</secondary></indexterm>
+All other members of the 
+<type>Display</type>
+structure (that is, those for which no macros are defined) are private to Xlib 
+and must not be used.
+Applications must never directly modify or inspect these private members of the 
+<type>Display</type>
+structure.
+<!-- .NT Note -->
+The
+<xref linkend='XDisplayWidth' xrefstyle='select: title'/>,
+<xref linkend='XDisplayHeight' xrefstyle='select: title'/>,
+<xref linkend='XDisplayCells' xrefstyle='select: title'/>,
+<xref linkend='XDisplayPlanes' xrefstyle='select: title'/>,
+<xref linkend='XDisplayWidthMM' xrefstyle='select: title'/>,
+and
+<xref linkend='XDisplayHeightMM' xrefstyle='select: title'/>
+functions in the next sections are misnamed.
+These functions really should be named Screen<emphasis remap='I'>whatever</emphasis> 
+and XScreen<emphasis remap='I'>whatever</emphasis>, not Display<emphasis remap='I'>whatever</emphasis> or XDisplay<emphasis remap='I'>whatever</emphasis>.
+Our apologies for the resulting confusion.
+<!-- .NE -->
+</para>
+<sect2 id='Display_Macros'>
+<title>Display Macros</title>
+<!-- .XS -->
+<!-- (SN Display Macros -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Applications should not directly modify any part of the
+<type>Display</type>
+and
+<type>Screen</type>
+structures.
+The members should be considered read-only,
+although they may change as the result of other operations on the display.
+</para>
+<para>
+<!-- .LP  -->
+The following lists the C language macros,
+their corresponding function equivalents that are for other language bindings,
+and what data both can return.
+</para>
+<para>AllPlanes()</para>
+<para>XAllPlanes()</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>AllPlanes</primary></indexterm>
+<indexterm significance="preferred"><primary>XAllPlanes</primary></indexterm>
+Both return a value with all bits set to 1 suitable for use in a plane argument to
+a procedure.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+Both 
+<function>BlackPixel</function>
+and 
+<function>WhitePixel</function>
+can be used in implementing a monochrome application.
+These pixel values are for permanently allocated entries in the default
+colormap.
+The actual <acronym>RGB</acronym> (red, green, and blue) values are settable on some screens 
+and, in any case, may not actually be black or white.
+The names are intended to convey the expected relative intensity of the colors.
+<!-- .sM -->
+</para>
+<para>
+BlackPixel(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>screen_number</emphasis>)
+</para>
+<funcsynopsis id='XBlackPixel'>
+<funcprototype>
+  <funcdef>unsigned long <function>XBlackPixel</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> screen_number</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen_number</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate screen number on the host server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>BlackPixel</primary></indexterm>
+<indexterm significance="preferred"><primary>XBlackPixel</primary></indexterm>
+Both return the black pixel value for the specified screen.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+WhitePixel(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>screen_number</emphasis>)
+</para>
+<funcsynopsis id='XWhitePixel'>
+<funcprototype>
+  <funcdef>unsigned long <function>XWhitePixel</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> screen_number</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen_number</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate screen number on the host server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>WhitePixel</primary></indexterm>
+<indexterm significance="preferred"><primary>XWhitePixel</primary></indexterm>
+Both return the white pixel value for the specified screen. 
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+ConnectionNumber(<emphasis remap='I'>display</emphasis>)
+</para>
+<funcsynopsis id='XConnectionNumber'>
+<funcprototype>
+  <funcdef>int <function>XConnectionNumber</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>ConnectionNumber</primary></indexterm>
+<indexterm significance="preferred"><primary>XConnectionNumber</primary></indexterm>
+Both return a connection number for the specified display.
+On a <acronym>POSIX</acronym>-conformant system,
+this is the file descriptor of the connection.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+DefaultColormap(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>screen_number</emphasis>)
+</para>
+<funcsynopsis id='XDefaultColormap'>
+<funcprototype>
+  <funcdef>Colormap <function>XDefaultColormap</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> screen_number</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen_number</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate screen number on the host server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>DefaultColormap</primary></indexterm>
+<indexterm significance="preferred"><primary>XDefaultColormap</primary></indexterm>
+Both return the default colormap ID for allocation on the specified screen.
+Most routine allocations of color should be made out of this colormap.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+DefaultDepth(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>screen_number</emphasis>)
+</para>
+<funcsynopsis id='XDefaultDepth'>
+<funcprototype>
+  <funcdef>int <function>XDefaultDepth</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> screen_number</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen_number</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate screen number on the host server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>DefaultDepth</primary></indexterm>
+<indexterm significance="preferred"><primary>XDefaultDepth</primary></indexterm>
+Both return the depth (number of planes) of the default root window for the
+specified screen.
+Other depths may also be supported on this screen (see
+<xref linkend='XMatchVisualInfo' xrefstyle='select: title'/>).
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<indexterm significance="preferred"><primary>XListDepths</primary></indexterm>
+To determine the number of depths that are available on a given screen, use
+<function>XListDepths</function>.
+<!-- .sM -->
+</para>
+<para>
+DefaultGC(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>screen_number</emphasis>)
+</para>
+<funcsynopsis id='XDefaultGC'>
+<funcprototype>
+  <funcdef>GC <function>XDefaultGC</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> screen_number</parameter></paramdef>
+  <paramdef>int<parameter> *count_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen_number</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate screen number on the host server.
+<!-- .ds Cn depths -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>count_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the number of (Cn.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<function>XListDepths</function>
+function returns the array of depths 
+that are available on the specified screen.
+If the specified screen_number is valid and sufficient memory for the array
+can be allocated,
+<function>XListDepths</function>
+sets count_return to the number of available depths.
+Otherwise, it does not set count_return and returns NULL.
+To release the memory allocated for the array of depths, use
+<xref linkend='XFree' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+DefaultGC(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>screen_number</emphasis>)
+</para>
+<funcsynopsis>
+<funcprototype>
+  <funcdef>GC <function>XDefaultGC</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> screen_number</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen_number</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate screen number on the host server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>DefaultGC</primary></indexterm>
+<indexterm significance="preferred"><primary>XDefaultGC</primary></indexterm>
+Both return the default graphics context for the root window of the 
+specified screen.
+This GC is created for the convenience of simple applications
+and contains the default GC components with the foreground and
+background pixel values initialized to the black and white
+pixels for the screen, respectively.
+You can modify its contents freely because it is not used in any Xlib
+function.
+This GC should never be freed.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+DefaultRootWindow(<emphasis remap='I'>display</emphasis>)
+</para>
+<funcsynopsis id='XDefaultRootWindow'>
+<funcprototype>
+  <funcdef>Window <function>XDefaultRootWindow</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>DefaultRootWindow</primary></indexterm>
+<indexterm significance="preferred"><primary>XDefaultRootWindow</primary></indexterm>
+Both return the root window for the default screen.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+DefaultScreenOfDisplay(<emphasis remap='I'>display</emphasis>)
+</para>
+<funcsynopsis id='XDefaultScreenOfDisplay'>
+<funcprototype>
+  <funcdef>Screen *<function>XDefaultScreenOfDisplay</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>DefaultScreenOfDisplay</primary></indexterm>
+<indexterm significance="preferred"><primary>XDefaultScreenOfDisplay</primary></indexterm>
+Both return a pointer to the default screen.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+ScreenOfDisplay(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>screen_number</emphasis>)
+</para>
+<funcsynopsis id='XScreenOfDisplay'>
+<funcprototype>
+  <funcdef>Screen *<function>XScreenOfDisplay</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> screen_number</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen_number</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate screen number on the host server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>ScreenOfDisplay</primary></indexterm>
+<indexterm significance="preferred"><primary>XScreenOfDisplay</primary></indexterm>
+Both return a pointer to the indicated screen.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+DefaultScreen(<emphasis remap='I'>display</emphasis>)
+</para>
+<funcsynopsis id='XDefaultScreen'>
+<funcprototype>
+  <funcdef>int <function>XDefaultScreen</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>DefaultScreen</primary></indexterm>
+<indexterm significance="preferred"><primary>XDefaultScreen</primary></indexterm>
+Both return the default screen number referenced by the 
+<xref linkend='XOpenDisplay' xrefstyle='select: title'/>
+function. 
+This macro or function should be used to retrieve the screen number 
+in applications that will use only a single screen.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+DefaultVisual(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>screen_number</emphasis>)
+</para>
+<funcsynopsis id='XDefaultVisual'>
+<funcprototype>
+  <funcdef>Visual *<function>XDefaultVisual</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> screen_number</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen_number</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate screen number on the host server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>DefaultVisual</primary></indexterm>
+<indexterm significance="preferred"><primary>XDefaultVisual</primary></indexterm>
+Both return the default visual type for the specified screen.
+For further information about visual types,
+see <link linkend="Visual_Types">section 3.1</link>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+DisplayCells(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>screen_number</emphasis>)
+</para>
+<funcsynopsis id='XDisplayCells'>
+<funcprototype>
+  <funcdef>int <function>XDisplayCells</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> screen_number</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen_number</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate screen number on the host server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>DisplayCells</primary></indexterm>
+<indexterm significance="preferred"><primary>XDisplayCells</primary></indexterm>
+Both return the number of entries in the default colormap.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+DisplayPlanes(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>screen_number</emphasis>)
+</para>
+<funcsynopsis id='XDisplayPlanes'>
+<funcprototype>
+  <funcdef>int <function>XDisplayPlanes</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> screen_number</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen_number</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate screen number on the host server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>DisplayPlanes</primary></indexterm>
+<indexterm significance="preferred"><primary>XDisplayPlanes</primary></indexterm>
+Both return the depth of the root window of the specified screen.
+For an explanation of depth,
+see the glossary.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+DisplayString(<emphasis remap='I'>display</emphasis>)
+</para>
+<funcsynopsis id='XDisplayString'>
+<funcprototype>
+  <funcdef>char *<function>XDisplayString</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>DisplayString</primary></indexterm>
+<indexterm significance="preferred"><primary>XDisplayString</primary></indexterm>
+Both return the string that was passed to 
+<xref linkend='XOpenDisplay' xrefstyle='select: title'/>
+when the current display was opened. 
+On <acronym>POSIX</acronym>-conformant systems,
+if the passed string was NULL, these return the value of
+the DISPLAY environment variable when the current display was opened.
+<indexterm><primary><acronym>POSIX</acronym> System Call</primary><secondary>fork</secondary></indexterm>
+These are useful to applications that invoke the 
+<function>fork</function>
+system call and want to open a new connection to the same display from the 
+child process as well as for printing error messages.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+LastKnownRequestProcessed(<emphasis remap='I'>display</emphasis>)
+</para>
+<funcsynopsis id='XLastKnownRequestProcessed'>
+<funcprototype>
+  <funcdef>unsigned long <function>XLastKnownRequestProcessed</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>XExtendedMaxRequestSize</primary></indexterm>
+The
+<olink targetdoc='bigreq' targetptr='XExtendedMaxRequestSize'><function>XExtendedMaxRequestSize</function></olink>
+function returns zero if the specified display does not support an
+extended-length protocol encoding; otherwise,
+it returns the maximum request size (in 4-byte units) supported
+by the server using the extended-length encoding.
+The Xlib functions
+<xref linkend='XDrawLines' xrefstyle='select: title'/>,
+<xref linkend='XDrawArcs' xrefstyle='select: title'/>,
+<xref linkend='XFillPolygon' xrefstyle='select: title'/>,
+<xref linkend='XChangeProperty' xrefstyle='select: title'/>,
+<xref linkend='XSetClipRectangles' xrefstyle='select: title'/>,
+and
+<xref linkend='XSetRegion' xrefstyle='select: title'/>
+will use the extended-length encoding as necessary, if supported
+by the server.  Use of the extended-length encoding in other Xlib
+functions (for example,
+<xref linkend='XDrawPoints' xrefstyle='select: title'/>,
+<xref linkend='XDrawRectangles' xrefstyle='select: title'/>,
+<xref linkend='XDrawSegments' xrefstyle='select: title'/>,
+<xref linkend='XFillArcs' xrefstyle='select: title'/>,
+<xref linkend='XFillRectangles' xrefstyle='select: title'/>,
+<xref linkend='XPutImage' xrefstyle='select: title'/>)
+is permitted but not required; an Xlib implementation may choose to
+split the data across multiple smaller requests instead.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+LastKnownRequestProcessed(<emphasis remap='I'>display</emphasis>)
+</para>
+<funcsynopsis>
+<funcprototype>
+  <funcdef>unsigned long <function>XLastKnownRequestProcessed</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>XMaxRequestSize</primary></indexterm>
+The
+<function>XMaxRequestSize</function>
+function returns the maximum request size (in 4-byte units) supported
+by the server without using an extended-length protocol encoding.
+Single protocol requests to the server can be no larger than this size
+unless an extended-length protocol encoding is supported by the server.
+The protocol guarantees the size to be no smaller than 4096 units
+(16384 bytes).
+Xlib automatically breaks data up into multiple protocol requests
+as necessary for the following functions:
+<xref linkend='XDrawPoints' xrefstyle='select: title'/>,
+<xref linkend='XDrawRectangles' xrefstyle='select: title'/>,
+<xref linkend='XDrawSegments' xrefstyle='select: title'/>,
+<xref linkend='XFillArcs' xrefstyle='select: title'/>,
+<xref linkend='XFillRectangles' xrefstyle='select: title'/>,
+and 
+<xref linkend='XPutImage' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+LastKnownRequestProcessed(<emphasis remap='I'>display</emphasis>)
+</para>
+<funcsynopsis>
+<funcprototype>
+  <funcdef>unsigned long <function>XLastKnownRequestProcessed</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>LastKnownRequestProcessed</primary></indexterm>
+<indexterm significance="preferred"><primary>XLastKnownRequestProcessed</primary></indexterm>
+Both extract the full serial number of the last request known by Xlib
+to have been processed by the X server.
+Xlib automatically sets this number when replies, events, and errors
+are received.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+NextRequest(<emphasis remap='I'>display</emphasis>)
+</para>
+<funcsynopsis id='XNextRequest'>
+<funcprototype>
+  <funcdef>unsigned long <function>XNextRequest</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>NextRequest</primary></indexterm>
+<indexterm significance="preferred"><primary>XNextRequest</primary></indexterm>
+Both extract the full serial number that is to be used for the next
+request.
+Serial numbers are maintained separately for each display connection.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+ProtocolVersion(<emphasis remap='I'>display</emphasis>)
+</para>
+<funcsynopsis id='XProtocolVersion'>
+<funcprototype>
+  <funcdef>int <function>XProtocolVersion</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>ProtocolVersion</primary></indexterm>
+<indexterm significance="preferred"><primary>XProtocolVersion</primary></indexterm>
+Both return the major version number (11) of the X protocol associated with 
+the connected display.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+ProtocolRevision(<emphasis remap='I'>display</emphasis>)
+</para>
+<funcsynopsis id='XProtocolRevision'>
+<funcprototype>
+  <funcdef>int <function>XProtocolRevision</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>ProtocolRevision</primary></indexterm>
+<indexterm significance="preferred"><primary>XProtocolRevision</primary></indexterm>
+Both return the minor protocol revision number of the X server.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+QLength(<emphasis remap='I'>display</emphasis>)
+</para>
+<funcsynopsis id='XQLength'>
+<funcprototype>
+  <funcdef>int <function>XQLength</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>QLength</primary></indexterm>
+<indexterm significance="preferred"><primary>XQLength</primary></indexterm>
+Both return the length of the event queue for the connected display.
+Note that there may be more events that have not been read into
+the queue yet (see
+<xref linkend='XEventsQueued' xrefstyle='select: title'/>).
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+RootWindow(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>screen_number</emphasis>)
+</para>
+<funcsynopsis id='XRootWindow'>
+<funcprototype>
+  <funcdef>Window <function>XRootWindow</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> screen_number</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen_number</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate screen number on the host server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm><primary>Window</primary><secondary>RootWindow</secondary></indexterm>
+<indexterm significance="preferred"><primary>RootWindow</primary></indexterm>
+<indexterm><primary>Window</primary><secondary>XRootWindow</secondary></indexterm>
+<indexterm significance="preferred"><primary>XRootWindow</primary></indexterm>
+Both return the root window.
+These are useful with functions that need a drawable of a particular screen
+and for creating top-level windows.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+ScreenCount(<emphasis remap='I'>display</emphasis>)
+</para>
+<funcsynopsis id='XScreenCount'>
+<funcprototype>
+  <funcdef>int <function>XScreenCount</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>ScreenCount</primary></indexterm>
+<indexterm significance="preferred"><primary>XScreenCount</primary></indexterm>
+Both return the number of available screens.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+ServerVendor(<emphasis remap='I'>display</emphasis>)
+</para>
+<funcsynopsis id='XServerVendor'>
+<funcprototype>
+  <funcdef>char *<function>XServerVendor</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>ServerVendor</primary></indexterm>
+<indexterm significance="preferred"><primary>XServerVendor</primary></indexterm>
+Both return a pointer to a null-terminated string that provides
+some identification of the owner of the X server implementation.
+If the data returned by the server is in the Latin Portable Character Encoding,
+then the string is in the Host Portable Character Encoding.
+Otherwise, the contents of the string are implementation-dependent.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+VendorRelease(<emphasis remap='I'>display</emphasis>)
+</para>
+<funcsynopsis id='XVendorRelease'>
+<funcprototype>
+  <funcdef>int <function>XVendorRelease</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>VendorRelease</primary></indexterm>
+<indexterm significance="preferred"><primary>XVendorRelease</primary></indexterm>
+Both return a number related to a vendor's release of the X server.
+</para>
+</sect2>
+<sect2 id="Image_Format_Functions_and_Macros">
+<title>Image Format Functions and Macros</title>
+<!-- .XS -->
+<!-- (SN Image Format Functions and Macros -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Applications are required to present data to the X server
+in a format that the server demands.
+To help simplify applications,
+most of the work required to convert the data is provided by Xlib
+(see sections
+<link linkend="Transferring_Images_between_Client_and_Server">8.7</link> and
+<link linkend="Manipulating_Images">16.8</link>).
+</para>
+<para>
+<!-- .LP -->
+The
+<structname>XPixmapFormatValues</structname>
+structure provides an interface to the pixmap format information
+that is returned at the time of a connection setup.
+It contains:
+</para>
+<para>
+<!-- .LP -->
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+       int depth;
+       int bits_per_pixel;
+       int scanline_pad;
+} XPixmapFormatValues;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<!-- .sp -->
+To obtain the pixmap format information for a given display, use
+<function>XListPixmapFormats</function>.
+<indexterm significance="preferred"><primary>XListPixmapFormats</primary></indexterm>
+<!-- .sM -->
+</para>
+<para>
+ImageByteOrder(<emphasis remap='I'>display</emphasis>)
+</para>
+<funcsynopsis id='XImageByteOrder'>
+<funcprototype>
+  <funcdef>int <function>XImageByteOrder</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> *count_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Cn pixmap formats that are supported by the display -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>count_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the number of (Cn.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<function>XListPixmapFormats</function>
+function returns an array of
+<structname>XPixmapFormatValues</structname>
+structures that describe the types of Z format images supported
+by the specified display.
+If insufficient memory is available,
+<function>XListPixmapFormats</function>
+returns NULL.
+To free the allocated storage for the
+<structname>XPixmapFormatValues</structname>
+structures, use
+<xref linkend='XFree' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP  -->
+The following lists the C language macros,
+their corresponding function equivalents that are for other language bindings,
+and what data they both return for the specified server and screen.
+These are often used by toolkits as well as by simple applications.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+ImageByteOrder(<emphasis remap='I'>display</emphasis>)
+</para>
+<funcsynopsis>
+<funcprototype>
+  <funcdef>int <function>XImageByteOrder</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>ImageByteOrder</primary></indexterm>
+<indexterm significance="preferred"><primary>XImageByteOrder</primary></indexterm>
+Both specify the required byte order for images for each scanline unit in 
+XY format (bitmap) or for each pixel value in 
+Z format.
+The macro or function can return either
+<symbol>LSBFirst</symbol>
+or 
+<symbol>MSBFirst</symbol>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+BitmapUnit(<emphasis remap='I'>display</emphasis>)
+</para>
+<funcsynopsis id='XBitmapUnit'>
+<funcprototype>
+  <funcdef>int <function>XBitmapUnit</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>BitmapUnit</primary></indexterm>
+<indexterm significance="preferred"><primary>XBitmapUnit</primary></indexterm>
+Both return the size of a bitmap's scanline unit in bits.
+The scanline is calculated in multiples of this value.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+BitmapBitOrder(<emphasis remap='I'>display</emphasis>)
+</para>
+<funcsynopsis id='XBitmapBitOrder'>
+<funcprototype>
+  <funcdef>int <function>XBitmapBitOrder</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>BitmapBitOrder</primary></indexterm>
+<indexterm significance="preferred"><primary>XBitmapBitOrder</primary></indexterm>
+Within each bitmap unit, the left-most bit in the bitmap as displayed
+on the screen is either the least significant or most significant bit in the
+unit.
+This macro or function can return 
+<symbol>LSBFirst</symbol>
+or 
+<symbol>MSBFirst</symbol>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+BitmapPad(<emphasis remap='I'>display</emphasis>)
+</para>
+<funcsynopsis id='XBitmapPad'>
+<funcprototype>
+  <funcdef>int <function>XBitmapPad</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>BitmapPad</primary></indexterm>
+<indexterm significance="preferred"><primary>XBitmapPad</primary></indexterm>
+Each scanline must be padded to a multiple of bits returned
+by this macro or function.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+DisplayHeight(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>screen_number</emphasis>)
+</para>
+<funcsynopsis id='XDisplayHeight'>
+<funcprototype>
+  <funcdef>int <function>XDisplayHeight</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> screen_number</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen_number</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate screen number on the host server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>DisplayHeight</primary></indexterm>
+<indexterm significance="preferred"><primary>XDisplayHeight</primary></indexterm>
+Both return an integer that describes the height of the screen
+in pixels.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+DisplayHeightMM(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>screen_number</emphasis>)
+</para>
+<funcsynopsis id='XDisplayHeightMM'>
+<funcprototype>
+  <funcdef>int <function>XDisplayHeightMM</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> screen_number</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen_number</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate screen number on the host server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>DisplayHeightMM</primary></indexterm>
+<indexterm significance="preferred"><primary>XDisplayHeightMM</primary></indexterm>
+Both return the height of the specified screen in millimeters.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+DisplayWidth(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>screen_number</emphasis>)
+</para>
+<funcsynopsis id='XDisplayWidth'>
+<funcprototype>
+  <funcdef>int <function>XDisplayWidth</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> screen_number</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen_number</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate screen number on the host server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>DisplayWidth</primary></indexterm>
+<indexterm significance="preferred"><primary>XDisplayWidth</primary></indexterm>
+Both return the width of the screen in pixels.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+DisplayWidthMM(<emphasis remap='I'>display</emphasis>, <emphasis remap='I'>screen_number</emphasis>)
+</para>
+<funcsynopsis id='XDisplayWidthMM'>
+<funcprototype>
+  <funcdef>int <function>XDisplayWidthMM</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> screen_number</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen_number</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate screen number on the host server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>DisplayWidthMM</primary></indexterm>
+<indexterm significance="preferred"><primary>XDisplayWidthMM</primary></indexterm>
+Both return the width of the specified screen in millimeters.
+</para>
+</sect2>
+<sect2 id="Screen_Information_Macros">
+<title>Screen Information Macros</title>
+<!-- .XS -->
+<!-- (SN Screen Information Macros -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The following lists the C language macros,
+their corresponding function equivalents that are for other language bindings,
+and what data they both can return.
+These macros or functions all take a pointer to the appropriate screen
+structure.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+BlackPixelOfScreen(<emphasis remap='I'>screen</emphasis>)
+</para>
+<funcsynopsis id='XBlackPixelOfScreen'>
+<funcprototype>
+  <funcdef>unsigned long <function>XBlackPixelOfScreen</function></funcdef>
+  <paramdef>Screen<parameter> *screen</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate 
+<type>Screen</type>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>BlackPixelOfScreen</primary></indexterm>
+<indexterm significance="preferred"><primary>XBlackPixelOfScreen</primary></indexterm>
+Both return the black pixel value of the specified screen.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+WhitePixelOfScreen(<emphasis remap='I'>screen</emphasis>)
+</para>
+<funcsynopsis id='XWhitePixelOfScreen'>
+<funcprototype>
+  <funcdef>unsigned long <function>XWhitePixelOfScreen</function></funcdef>
+  <paramdef>Screen<parameter> *screen</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate 
+<type>Screen</type>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>WhitePixelOfScreen</primary></indexterm>
+<indexterm significance="preferred"><primary>XWhitePixelOfScreen</primary></indexterm>
+Both return the white pixel value of the specified screen.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+CellsOfScreen(<emphasis remap='I'>screen</emphasis>)
+</para>
+<funcsynopsis id='XCellsOfScreen'>
+<funcprototype>
+  <funcdef>int <function>XCellsOfScreen</function></funcdef>
+  <paramdef>Screen<parameter> *screen</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate 
+<type>Screen</type>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>CellsOfScreen</primary></indexterm>
+<indexterm significance="preferred"><primary>XCellsOfScreen</primary></indexterm>
+Both return the number of colormap cells in the default colormap 
+of the specified screen.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+DefaultColormapOfScreen(<emphasis remap='I'>screen</emphasis>)
+</para>
+<funcsynopsis id='XDefaultColormapOfScreen'>
+<funcprototype>
+  <funcdef>Colormap <function>XDefaultColormapOfScreen</function></funcdef>
+  <paramdef>Screen<parameter> *screen</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate 
+<type>Screen</type>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>DefaultColormapOfScreen</primary></indexterm>
+<indexterm significance="preferred"><primary>XDefaultColormapOfScreen</primary></indexterm>
+Both return the default colormap of the specified screen.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+DefaultDepthOfScreen(<emphasis remap='I'>screen</emphasis>)
+</para>
+<funcsynopsis id='XDefaultDepthOfScreen'>
+<funcprototype>
+  <funcdef>int <function>XDefaultDepthOfScreen</function></funcdef>
+  <paramdef>Screen<parameter> *screen</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate 
+<type>Screen</type>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>DefaultDepthOfScreen</primary></indexterm>
+<indexterm significance="preferred"><primary>XDefaultDepthOfScreen</primary></indexterm>
+Both return the depth of the root window.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+DefaultGCOfScreen(<emphasis remap='I'>screen</emphasis>)
+</para>
+<funcsynopsis id='XDefaultGCOfScreen'>
+<funcprototype>
+  <funcdef>GC <function>XDefaultGCOfScreen</function></funcdef>
+  <paramdef>Screen<parameter> *screen</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate 
+<type>Screen</type>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>DefaultGCOfScreen</primary></indexterm>
+<indexterm significance="preferred"><primary>XDefaultGCOfScreen</primary></indexterm>
+Both return a default graphics context (GC) of the specified screen,
+which has the same depth as the root window of the screen.
+The GC must never be freed.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+DefaultVisualOfScreen(<emphasis remap='I'>screen</emphasis>)
+</para>
+<funcsynopsis id='XDefaultVisualOfScreen'>
+<funcprototype>
+  <funcdef>Visual *<function>XDefaultVisualOfScreen</function></funcdef>
+  <paramdef>Screen<parameter> *screen</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate 
+<type>Screen</type>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>DefaultVisualOfScreen</primary></indexterm>
+<indexterm significance="preferred"><primary>XDefaultVisualOfScreen</primary></indexterm>
+Both return the default visual of the specified screen.
+For information on visual types,
+see <link linkend="Visual_Types">section 3.1</link>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+DoesBackingStore(<emphasis remap='I'>screen</emphasis>)
+</para>
+<funcsynopsis id='XDoesBackingStore'>
+<funcprototype>
+  <funcdef>int <function>XDoesBackingStore</function></funcdef>
+  <paramdef>Screen<parameter> *screen</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate 
+<type>Screen</type>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>DoesBackingStore</primary></indexterm>
+<indexterm significance="preferred"><primary>XDoesBackingStore</primary></indexterm>
+Both return a value indicating whether the screen supports backing
+stores.
+The value returned can be one of 
+<symbol>WhenMapped</symbol>,
+<symbol>NotUseful</symbol>,
+or
+<symbol>Always</symbol>
+(see <link linkend="Backing_Store_Attribute">section 3.2.4</link>).
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+DoesSaveUnders(<emphasis remap='I'>screen</emphasis>)
+</para>
+<funcsynopsis id='XDoesSaveUnders'>
+<funcprototype>
+  <funcdef>Bool <function>XDoesSaveUnders</function></funcdef>
+  <paramdef>Screen<parameter> *screen</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate 
+<type>Screen</type>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>DoesSaveUnders</primary></indexterm>
+<indexterm significance="preferred"><primary>XDoesSaveUnders</primary></indexterm>
+Both return a Boolean value indicating whether the
+screen supports save unders.
+If
+<symbol>True</symbol>,
+the screen supports save unders.
+If
+<symbol>False</symbol>,
+the screen does not support save unders
+(see <link linkend="Save_Under_Flag">section 3.2.5</link>).
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+DisplayOfScreen(<emphasis remap='I'>screen</emphasis>)
+</para>
+<funcsynopsis id='XDisplayOfScreen'>
+<funcprototype>
+  <funcdef>Display *<function>XDisplayOfScreen</function></funcdef>
+  <paramdef>Screen<parameter> *screen</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate 
+<type>Screen</type>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>DisplayOfScreen</primary></indexterm>
+<indexterm significance="preferred"><primary>XDisplayOfScreen</primary></indexterm>
+Both return the display of the specified screen.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+<indexterm significance="preferred"><primary>XScreenNumberOfScreen</primary></indexterm>
+</para>
+<para>
+EventMaskOfScreen(<emphasis remap='I'>screen</emphasis>)
+</para>
+<funcsynopsis id='XEventMaskOfScreen'>
+<funcprototype>
+  <funcdef>long <function>XEventMaskOfScreen</function></funcdef>
+  <paramdef>Screen<parameter> *screen</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate 
+<type>Screen</type>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<function>XScreenNumberOfScreen</function>
+function returns the screen index number of the specified screen.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+EventMaskOfScreen(<emphasis remap='I'>screen</emphasis>)
+</para>
+<funcsynopsis>
+<funcprototype>
+  <funcdef>long <function>XEventMaskOfScreen</function></funcdef>
+  <paramdef>Screen<parameter> *screen</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate 
+<type>Screen</type>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>EventMaskOfScreen</primary></indexterm>
+<indexterm significance="preferred"><primary>XEventMaskOfScreen</primary></indexterm>
+Both return the event mask of the root window for the specified screen
+at connection setup time.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+WidthOfScreen(<emphasis remap='I'>screen</emphasis>)
+</para>
+<funcsynopsis id='XWidthOfScreen'>
+<funcprototype>
+  <funcdef>int <function>XWidthOfScreen</function></funcdef>
+  <paramdef>Screen<parameter> *screen</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate 
+<type>Screen</type>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>WidthOfScreen</primary></indexterm>
+<indexterm significance="preferred"><primary>XWidthOfScreen</primary></indexterm>
+Both return the width of the specified screen in pixels.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+HeightOfScreen(<emphasis remap='I'>screen</emphasis>)
+</para>
+<funcsynopsis id='XHeightOfScreen'>
+<funcprototype>
+  <funcdef>int <function>XHeightOfScreen</function></funcdef>
+  <paramdef>Screen<parameter> *screen</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate 
+<type>Screen</type>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>HeightOfScreen</primary></indexterm>
+<indexterm significance="preferred"><primary>XHeightOfScreen</primary></indexterm>
+Both return the height of the specified screen in pixels.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+WidthMMOfScreen(<emphasis remap='I'>screen</emphasis>)
+</para>
+<funcsynopsis id='XWidthMMOfScreen'>
+<funcprototype>
+  <funcdef>int <function>XWidthMMOfScreen</function></funcdef>
+  <paramdef>Screen<parameter> *screen</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate 
+<type>Screen</type>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>WidthMMOfScreen</primary></indexterm>
+<indexterm significance="preferred"><primary>XWidthMMOfScreen</primary></indexterm>
+Both return the width of the specified screen in millimeters.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+HeightMMOfScreen(<emphasis remap='I'>screen</emphasis>)
+</para>
+<funcsynopsis id='XHeightMMOfScreen'>
+<funcprototype>
+  <funcdef>int <function>XHeightMMOfScreen</function></funcdef>
+  <paramdef>Screen<parameter> *screen</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate 
+<type>Screen</type>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>HeightMMOfScreen</primary></indexterm>
+<indexterm significance="preferred"><primary>XHeightMMOfScreen</primary></indexterm>
+Both return the height of the specified screen in millimeters.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+MaxCmapsOfScreen(<emphasis remap='I'>screen</emphasis>)
+</para>
+<funcsynopsis id='XMaxCmapsOfScreen'>
+<funcprototype>
+  <funcdef>int <function>XMaxCmapsOfScreen</function></funcdef>
+  <paramdef>Screen<parameter> *screen</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate 
+<type>Screen</type>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>MaxCmapsOfScreen</primary></indexterm>
+<indexterm significance="preferred"><primary>XMaxCmapsOfScreen</primary></indexterm>
+Both return the maximum number of installed colormaps supported 
+by the specified screen
+(see <link linkend="Managing_Installed_Colormaps">section 9.3</link>).
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+MinCmapsOfScreen(<emphasis remap='I'>screen</emphasis>)
+</para>
+<funcsynopsis id='XMinCmapsOfScreen'>
+<funcprototype>
+  <funcdef>int <function>XMinCmapsOfScreen</function></funcdef>
+  <paramdef>Screen<parameter> *screen</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate 
+<type>Screen</type>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>MinCmapsOfScreen</primary></indexterm>
+<indexterm significance="preferred"><primary>XMinCmapsOfScreen</primary></indexterm>
+Both return the minimum number of installed colormaps supported 
+by the specified screen
+(see <link linkend="Managing_Installed_Colormaps">section 9.3</link>).
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+PlanesOfScreen(<emphasis remap='I'>screen</emphasis>)
+</para>
+<funcsynopsis id='XPlanesOfScreen'>
+<funcprototype>
+  <funcdef>int <function>XPlanesOfScreen</function></funcdef>
+  <paramdef>Screen<parameter> *screen</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate 
+<type>Screen</type>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>PlanesOfScreen</primary></indexterm>
+<indexterm significance="preferred"><primary>XPlanesOfScreen</primary></indexterm>
+Both return the depth of the root window.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+</para>
+<para>
+RootWindowOfScreen(<emphasis remap='I'>screen</emphasis>)
+</para>
+<funcsynopsis id='XRootWindowOfScreen'>
+<funcprototype>
+  <funcdef>Window <function>XRootWindowOfScreen</function></funcdef>
+  <paramdef>Screen<parameter> *screen</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate 
+<type>Screen</type>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>RootWindowOfScreen</primary></indexterm>
+<indexterm significance="preferred"><primary>XRootWindowOfScreen</primary></indexterm>
+Both return the root window of the specified screen.
+</para>
+</sect2>
+</sect1>
+<sect1 id="Generating_a_NoOperation_Protocol_Request">
+<title>Generating a NoOperation Protocol Request</title>
+<!-- .XS -->
+<!-- (SN Generating a NoOperation Protocol Request -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To execute a 
+<systemitem>NoOperation</systemitem>
+protocol request, use
+<xref linkend='XNoOp' xrefstyle='select: title'/>.
+<indexterm significance="preferred"><primary>XNoOp</primary></indexterm>
+<!-- .sM -->
+</para>
+<funcsynopsis id='XNoOp'>
+<funcprototype>
+  <funcdef><function>XNoOp</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term><emphasis remap='I'>display</emphasis></term>
+    <listitem>
+      <para>Specifies the connection to the X server.</para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XNoOp' xrefstyle='select: title'/>
+function sends a 
+<systemitem>NoOperation</systemitem>
+protocol request to the X server,
+thereby exercising the connection.
+</para>
+</sect1>
+<sect1 id="Freeing_Client_Created_Data">
+<title>Freeing Client-Created Data</title>
+<!-- .XS -->
+<!-- (SN Freeing Client-Created Data -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To free in-memory data that was created by an Xlib function, use
+<xref linkend='XFree' xrefstyle='select: title'/>.
+<indexterm significance="preferred"><primary>XFree</primary></indexterm>
+<!-- .sM -->
+</para>
+<funcsynopsis id='XFree'>
+<funcprototype>
+  <funcdef>XFree</funcdef>
+  <paramdef>void<parameter> *data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the data that is to be freed.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XFree' xrefstyle='select: title'/>
+function is a general-purpose Xlib routine that frees the specified data.
+You must use it to free any objects that were allocated by Xlib,
+unless an alternate function is explicitly specified for the object.
+A NULL pointer cannot be passed to this function.
+</para>
+</sect1>
+<sect1 id="Closing_the_Display">
+<title>Closing the Display</title>
+<!-- .XS -->
+<!-- (SN Closing the Display -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To close a display or disconnect from the X server, use
+<function>XCloseDisplay</function>.
+<indexterm significance="preferred"><primary>XCloseDisplay</primary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+<!-- .sM -->
+</para>
+<funcsynopsis id='xclosedisplay'>
+<funcprototype>
+  <funcdef>XCloseDisplay</funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<function>XCloseDisplay</function>
+function closes the connection to the X server for the display specified in the
+<type>Display</type>
+structure and destroys all windows, resource IDs
+(<type>Window</type>,
+<type>Font</type>,
+<type>Pixmap</type>,
+<type>Colormap</type>,
+<type>Cursor</type>,
+and
+<type>GContext</type>),
+or other resources that the client has created
+on this display, unless the close-down mode of the resource has been changed
+(see
+<xref linkend='XSetCloseDownMode' xrefstyle='select: title'/>).
+Therefore, these windows, resource IDs, and other resources should never be 
+referenced again or an error will be generated.
+Before exiting, you should call
+<function>XCloseDisplay</function>
+explicitly so that any pending errors are reported as
+<function>XCloseDisplay</function>
+performs a final
+<xref linkend='XSync' xrefstyle='select: title'/>
+operation.
+<indexterm><primary>Resource IDs</primary></indexterm>
+<indexterm><primary>XCloseDisplay</primary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+<function>XCloseDisplay</function>
+can generate a
+<errorname>BadGC</errorname>
+error.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+Xlib provides a function to permit the resources owned by a client
+to survive after the client's connection is closed.
+To change a client's close-down mode, use
+<xref linkend='XSetCloseDownMode' xrefstyle='select: title'/>.
+<indexterm significance="preferred"><primary>XSetCloseDownMode</primary></indexterm>
+<!-- .sM -->
+</para>
+<funcsynopsis id='XSetCloseDownMode'>
+<funcprototype>
+  <funcdef>XSetCloseDownMode</funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> close_mode</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>close_mode</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the client close-down mode.
+You can pass 
+<symbol>DestroyAll</symbol>,
+<symbol>RetainPermanent</symbol>,
+or
+<symbol>RetainTemporary</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetCloseDownMode' xrefstyle='select: title'/>
+defines what will happen to the client's resources at connection close.
+A connection starts in
+<symbol>DestroyAll</symbol>
+mode.
+For information on what happens to the client's resources when the
+close_mode argument is
+<symbol>RetainPermanent</symbol>
+or
+<symbol>RetainTemporary</symbol>,
+see <link linkend='Using_X_Server_Connection_Close_Operations'>section 2.6</link>.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetCloseDownMode' xrefstyle='select: title'/>
+can generate a
+<errorname>BadValue</errorname>
+error.
+</para>
+</sect1>
+<sect1 id='Using_X_Server_Connection_Close_Operations'>
+<title>Using X Server Connection Close Operations</title>
+<!-- .XS -->
+<!-- (SN Using X Server Connection Close Operations -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+When the X server's connection to a client is closed
+either by an explicit call to
+<function>XCloseDisplay</function>
+or by a process that exits, the X server performs the following
+automatic operations:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+It disowns all selections owned by the client
+(see 
+<xref linkend='XSetSelectionOwner' xrefstyle='select: title'/>).
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It performs an
+<xref linkend='XUngrabPointer' xrefstyle='select: title'/>
+and
+<xref linkend='XUngrabKeyboard' xrefstyle='select: title'/>
+if the client has actively grabbed the pointer 
+or the keyboard.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It performs an
+<xref linkend='XUngrabServer' xrefstyle='select: title'/>
+if the client has grabbed the server.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It releases all passive grabs made by the client.  
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It marks all resources (including colormap entries) allocated 
+by the client either as permanent or temporary, 
+depending on whether the close-down mode is 
+<symbol>RetainPermanent</symbol>
+or
+<symbol>RetainTemporary</symbol>.
+However, this does not prevent other client applications from explicitly
+destroying the resources (see 
+<xref linkend='XSetCloseDownMode' xrefstyle='select: title'/>).
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+When the close-down mode is
+<symbol>DestroyAll</symbol>,
+the X server destroys all of a client's resources as follows:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+It examines each window in the client's save-set to determine if it is an inferior
+(subwindow) of a window created by the client.
+(The save-set is a list of other clients' windows
+that are referred to as save-set windows.)
+If so, the X server reparents the save-set window to the closest ancestor so
+that the save-set window is not an inferior of a window created by the client.
+The reparenting leaves unchanged the absolute coordinates (with respect to
+the root window) of the upper-left outer corner of the save-set
+window.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It performs a
+<systemitem>MapWindow</systemitem>
+request on the save-set window if the save-set window is unmapped.
+The X server does this even if the save-set window was not an inferior of 
+a window created by the client.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It destroys all windows created by the client.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It performs the appropriate free request on each nonwindow resource created by
+the client in the server (for example, 
+<type>Font</type>,
+<type>Pixmap</type>,
+<type>Cursor</type>,
+<type>Colormap</type>,
+and 
+<type>GContext</type>).
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It frees all colors and colormap entries allocated by a client application.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+Additional processing occurs when the last connection to the X server closes.
+An X server goes through a cycle of having no connections and having some
+connections.
+When the last connection to the X server closes as a result of a connection
+closing with the close_mode of
+<symbol>DestroyAll</symbol>,
+the X server does the following: 
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+It resets its state as if it had just been
+started.  
+The X server begins by destroying all lingering resources from
+clients that have terminated in 
+<symbol>RetainPermanent</symbol>
+or
+<symbol>RetainTemporary</symbol>
+mode.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It deletes all but the predefined atom identifiers.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It deletes all properties on all root windows
+(see <link linkend="Properties_and_Atoms">section 4.3</link>).
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It resets all device maps and attributes 
+(for example, key click, bell volume, and acceleration) 
+as well as the access control list.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It restores the standard root tiles and cursors.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It restores the default font path.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It restores the input focus to state
+<symbol>PointerRoot</symbol>.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+However, the X server does not reset if you close a connection with a close-down
+mode set to
+<symbol>RetainPermanent</symbol>
+or
+<symbol>RetainTemporary</symbol>.
+</para>
+</sect1>
+<sect1 id="Using_Xlib_with_Threads">
+<title>Using Xlib with Threads</title>
+<!-- .XS -->
+<!-- (SN Using Xlib with Threads -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+On systems that have threads, support may be provided to permit
+multiple threads to use Xlib concurrently.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To initialize support for concurrent threads, use
+<function>XInitThreads</function>.
+<indexterm significance="preferred"><primary>XInitThreads</primary></indexterm>
+<!-- .sM -->
+</para>
+<para>Status XInitThreads();</para>
+<!-- .FN -->
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<function>XInitThreads</function>
+function initializes Xlib support for concurrent threads.
+This function must be the first Xlib function a
+multi-threaded program calls, and it must complete
+before any other Xlib call is made.
+This function returns a nonzero status if initialization was
+successful; otherwise, it returns zero.
+On systems that do not support threads, this function always returns zero.
+</para>
+<para>
+<!-- .LP -->
+It is only necessary to call this function if multiple threads
+might use Xlib concurrently.  If all calls to Xlib functions
+are protected by some other access mechanism (for example,
+a mutual exclusion lock in a toolkit or through explicit client
+programming), Xlib thread initialization is not required.
+It is recommended that single-threaded programs not call this function.
+
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To lock a display across several Xlib calls, use
+<function>XLockDisplay</function>.
+<indexterm significance="preferred"><primary>XLockDisplay</primary></indexterm>
+<!-- .sM -->
+</para>
+<funcsynopsis id='xlockdisplay'>
+<funcprototype>
+  <funcdef>XLockDisplay</funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<function>XLockDisplay</function>
+function locks out all other threads from using the specified display.
+Other threads attempting to use the display will block until
+the display is unlocked by this thread.
+Nested calls to
+<function>XLockDisplay</function>
+work correctly; the display will not actually be unlocked until
+<xref linkend='XUnlockDisplay' xrefstyle='select: title'/>
+has been called the same number of times as
+<function>XLockDisplay</function>.
+This function has no effect unless Xlib was successfully initialized
+for threads using
+<function>XInitThreads</function>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To unlock a display, use
+<xref linkend='XUnlockDisplay' xrefstyle='select: title'/>.
+<indexterm significance="preferred"><primary>XUnlockDisplay</primary></indexterm>
+<!-- .sM -->
+</para>
+<funcsynopsis id='XUnlockDisplay'>
+<funcprototype>
+  <funcdef>XUnlockDisplay</funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XUnlockDisplay' xrefstyle='select: title'/>
+function allows other threads to use the specified display again.
+Any threads that have blocked on the display are allowed to continue.
+Nested locking works correctly; if
+<function>XLockDisplay</function>
+has been called multiple times by a thread, then
+<xref linkend='XUnlockDisplay' xrefstyle='select: title'/>
+must be called an equal number of times before the display is
+actually unlocked.
+This function has no effect unless Xlib was successfully initialized
+for threads using
+<function>XInitThreads</function>.
+</para>
+</sect1>
+<sect1 id="Using_Internal_Connections">
+<title>Using Internal Connections</title>
+<!-- .XS -->
+<!-- (SN Using Internal Connections -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+In addition to the connection to the X server, an Xlib implementation
+may require connections to other kinds of servers (for example, to
+input method servers as described in
+<link linkend='Locales_and_Internationalized_Text_Functions'>chapter 13</link>).
+Toolkits and clients
+that use multiple displays, or that use displays in combination with
+other inputs, need to obtain these additional connections to correctly
+block until input is available and need to process that input
+when it is available.  Simple clients that use a single display and
+block for input in an Xlib event function do not need to use these
+facilities.
+</para>
+<para>
+<!-- .LP -->
+To track internal connections for a display, use
+<xref linkend='XAddConnectionWatch' xrefstyle='select: title'/>.
+</para>
+<funcsynopsis id='xconnectionwatch'>
+<funcprototype>
+  <funcdef>type void XConnectionWatchProc</funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XPointer<parameter> client_data</parameter></paramdef>
+  <paramdef>int<parameter> fd</parameter></paramdef>
+  <paramdef>Bool<parameter> opening</parameter></paramdef>
+  <paramdef>XPointer<parameter> *watch_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<funcsynopsis id='XAddConnectionWatch'>
+<funcprototype>
+  <funcdef>Status XAddConnectionWatch</funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XWatchProc<parameter> procedure</parameter></paramdef>
+  <paramdef>XPointer<parameter> client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>procedure</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 the additional client data.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XAddConnectionWatch' xrefstyle='select: title'/>
+function registers a procedure to be called each time Xlib opens or closes an
+internal connection for the specified display.  The procedure is passed the
+display, the specified client_data, the file descriptor for the connection,
+a Boolean indicating whether the connection is being opened or closed, and a
+pointer to a location for private watch data.  If opening is
+<symbol>True</symbol>,
+the procedure can store a pointer to private data in the location pointed
+to by watch_data;
+when the procedure is later called for this same connection and opening is
+<symbol>False</symbol>,
+the location pointed to by watch_data will hold this same private data pointer.
+</para>
+<para>
+<!-- .LP -->
+This function can be called at any time after a display is opened.
+If internal connections already exist, the registered procedure will
+immediately be called for each of them, before
+<xref linkend='XAddConnectionWatch' xrefstyle='select: title'/>
+returns.
+<xref linkend='XAddConnectionWatch' xrefstyle='select: title'/>
+returns a nonzero status if the procedure is successfully registered;
+otherwise, it returns zero.
+</para>
+<para>
+<!-- .LP -->
+The registered procedure should not call any Xlib functions.
+If the procedure directly or indirectly causes the state of internal
+connections or watch procedures to change, the result is not defined.
+If Xlib has been initialized for threads, the procedure is called with
+the display locked and the result of a call by the procedure to any
+Xlib function that locks the display is not defined unless the executing
+thread has externally locked the display using
+<function>XLockDisplay</function>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To stop tracking internal connections for a display, use
+<function>XRemoveConnectionWatch</function>.
+<indexterm significance="preferred"><primary>XRemoveConnectionWatch</primary></indexterm>
+<!-- .sM -->
+</para>
+<para>
+()
+</para>
+<funcsynopsis id='xremoveconnectionwatch'>
+<funcprototype>
+  <funcdef>Status <function>XRemoveConnectionWatch</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XWatchProc<parameter> procedure</parameter></paramdef>
+  <paramdef>XPointer<parameter> client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>procedure</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 the additional client data.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<function>XRemoveConnectionWatch</function>
+function removes a previously registered connection watch procedure.
+The client_data must match the client_data used when the procedure
+was initially registered.
+
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To process input on an internal connection, use
+<xref linkend='XProcessInternalConnection' xrefstyle='select: title'/>.
+<indexterm significance="preferred"><primary>XProcessInternalConnection</primary></indexterm>
+<!-- .sM -->
+</para>
+<para>
+()
+</para>
+<funcsynopsis id='XProcessInternalConnection'>
+<funcprototype>
+  <funcdef>void <function>XProcessInternalConnection</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> fd</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>fd</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the file descriptor.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XProcessInternalConnection' xrefstyle='select: title'/>
+function processes input available on an internal connection.
+This function should be called for an internal connection only
+after an operating system facility (for example,
+<function>select</function>
+or
+<function>poll</function>)
+has indicated that input is available; otherwise,
+the effect is not defined.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain all of the current internal connections for a display, use
+<xref linkend='XInternalConnectionNumbers' xrefstyle='select: title'/>.
+<indexterm significance="preferred"><primary>XInternalConnectionNumbers</primary></indexterm>
+<!-- .sM -->
+</para>
+<para>
+()
+</para>
+<funcsynopsis id='XInternalConnectionNumbers'>
+<funcprototype>
+  <funcdef>Status <function>XInternalConnectionNumbers</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int **<parameter> fd</parameter></paramdef>
+  <paramdef>int *<parameter> count_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>fd_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the file descriptors.
+<!-- .ds Cn file descriptors -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>count_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the number of (Cn.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XInternalConnectionNumbers' xrefstyle='select: title'/>
+function returns a list of the file descriptors for all internal
+connections currently open for the specified display.
+When the allocated list is no longer needed,
+free it by using
+<xref linkend='XFree' xrefstyle='select: title'/>.
+This functions returns a nonzero status if the list is successfully allocated;
+otherwise, it returns zero.
+</para>
+</sect1>
+</chapter>
diff --git a/specs/libX11/CH03.xml b/specs/libX11/CH03.xml
new file mode 100644 (file)
index 0000000..7d2b20e
--- /dev/null
@@ -0,0 +1,4178 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+         "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
+<chapter id='Window_Functions'><title>Window Functions</title>
+<sect1 id="Visual_Types">
+<title>Visual Types</title>
+<!-- .XS -->
+<!-- (SN Visual Types -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>Visual Type</primary></indexterm>
+On some display hardware, 
+it may be possible to deal with color resources in more than one way.
+For example, you may be able to deal with a screen of either 12-bit depth
+with arbitrary mapping of pixel to color (pseudo-color) or 24-bit depth
+with 8 bits of the pixel dedicated to each of red, green, and blue.
+These different ways of dealing with the visual aspects of the screen
+are called visuals.
+For each screen of the display, there may be a list of valid visual types
+supported at different depths of the screen.
+Because default windows and visual types are defined for each screen,
+most simple applications need not deal with this complexity.
+Xlib provides macros and functions that return the default root window, 
+the default depth of the default root window, and the default visual type
+(see sections <link linkend='Display_Macros'>2.2.1</link>
+and <link linkend="Determining_the_Appropriate_Visual_Type">16.7</link>).
+</para>
+<para>
+<!-- .LP -->
+Xlib uses an opaque 
+<structname>Visual</structname>
+<indexterm significance="preferred"><primary>Visual</primary></indexterm>
+structure that contains information about the possible color mapping.
+The visual utility functions
+(see <link linkend="Determining_the_Appropriate_Visual_Type">section 16.7</link>)
+use an
+<structname>XVisualInfo</structname>
+structure to return this information to an application.
+The members of this structure pertinent to this discussion are class, red_mask,
+green_mask, blue_mask, bits_per_rgb, and colormap_size.
+The class member specifies one of the possible visual classes of the screen
+and can be 
+<indexterm><primary>Visual Classes</primary><secondary>StaticGray</secondary></indexterm>
+<indexterm><primary>Visual Classes</primary><secondary>StaticColor</secondary></indexterm>
+<indexterm><primary>Visual Classes</primary><secondary>TrueColor</secondary></indexterm>
+<indexterm><primary>Visual Classes</primary><secondary>StaticColor</secondary></indexterm>
+<indexterm><primary>Visual Classes</primary><secondary>GrayScale</secondary></indexterm>
+<indexterm><primary>Visual Classes</primary><secondary>PseudoColor</secondary></indexterm>
+<symbol>StaticGray</symbol>,
+<symbol>StaticColor</symbol>,
+<symbol>TrueColor</symbol>,
+<symbol>GrayScale</symbol>,
+<symbol>PseudoColor</symbol>,
+or
+<symbol>DirectColor</symbol>.
+</para>
+<para>
+<!-- .LP -->
+The following concepts may serve to make the explanation of
+visual types clearer. 
+The screen can be color or grayscale,
+can have a colormap that is writable or read-only,
+and can also have a colormap whose indices are decomposed into separate 
+<acronym>RGB</acronym> pieces, provided one is not on a grayscale screen.
+This leads to the following diagram:
+</para>
+
+<literallayout class="monospaced">
+                      Color        Gray-Scale
+                   R/O    R/W      R/O   R/W
+----------------------------------------------
+ Undecomposed    Static  Pseudo   Static  Gray
+   Colormap      Color   Color    Gray    Scale
+
+ Decomposed       True   Direct
+   Colormap       Color  Color
+----------------------------------------------
+</literallayout>
+
+<para>
+<!-- .LP -->
+Conceptually, 
+as each pixel is read out of video memory for display on the screen,
+it goes through a look-up stage by indexing into a colormap.
+Colormaps can be manipulated arbitrarily on some hardware, 
+in limited ways on other hardware, and not at all on other hardware.  
+The visual types affect the colormap and 
+the <acronym>RGB</acronym> values in the following ways:
+</para>
+<para>
+<!-- .LP -->
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+For 
+<symbol>PseudoColor</symbol>,
+a pixel value indexes a colormap to produce
+independent <acronym>RGB</acronym> values, and the <acronym>RGB</acronym> values can be changed dynamically.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<symbol>GrayScale</symbol>
+is treated the same way as 
+<symbol>PseudoColor</symbol>
+except that the primary that drives the screen is undefined. 
+Thus, the client should always store the
+same value for red, green, and blue in the colormaps.  
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+For 
+<symbol>DirectColor</symbol>,
+a pixel value is decomposed into separate <acronym>RGB</acronym> subfields, and each
+subfield separately indexes the colormap for the corresponding value.
+The <acronym>RGB</acronym> values can be changed dynamically.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<symbol>TrueColor</symbol>
+is treated the same way as 
+<symbol>DirectColor</symbol>
+except that the colormap has predefined, read-only <acronym>RGB</acronym> values.
+These <acronym>RGB</acronym> values are server dependent but provide linear or near-linear
+ramps in each primary.  
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<symbol>StaticColor</symbol>
+is treated the same way as 
+<symbol>PseudoColor</symbol>
+except that the colormap has predefined, 
+read-only, server-dependent <acronym>RGB</acronym> values.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<symbol>StaticGray</symbol>
+is treated the same way as 
+<symbol>StaticColor</symbol>
+except that the <acronym>RGB</acronym> values are equal for any single pixel
+value, thus resulting in shades of gray.  
+<symbol>StaticGray</symbol>
+with a two-entry
+colormap can be thought of as monochrome.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+The red_mask, green_mask, and blue_mask members are only defined for
+<symbol>DirectColor</symbol>
+and 
+<symbol>TrueColor</symbol>.
+Each has one contiguous set of bits with no
+intersections.
+The bits_per_rgb member specifies the log base 2 of the
+number of distinct color values (individually) of red, green, and blue.
+Actual <acronym>RGB</acronym> values are unsigned 16-bit numbers.
+The colormap_size member defines the number of available colormap entries
+in a newly created colormap.  
+For 
+<symbol>DirectColor</symbol>
+and 
+<symbol>TrueColor</symbol>,
+this is the size of an individual pixel subfield.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To obtain the visual ID from a 
+<structname>Visual</structname>,
+use
+<xref linkend='XVisualIDFromVisual' xrefstyle='select: title'/>.
+<indexterm significance="preferred"><primary>XVisualIDFromVisual</primary></indexterm>
+</para>
+<!-- .sM -->
+<funcsynopsis id='XVisualIDFromVisual'>
+<funcprototype>
+  <funcdef>VisualID <function>XVisualIDFromVisual</function></funcdef>
+  <paramdef>Visual *<parameter>visual</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>visual</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the visual type.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XVisualIDFromVisual' xrefstyle='select: title'/>
+function returns the visual ID for the specified visual type.
+</para>
+</sect1>
+<sect1 id="Window_Attributes">
+<title>Window Attributes</title>
+<!-- .XS -->
+<!-- (SN Window Attributes -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Window</primary></indexterm>
+<indexterm><primary>Window</primary><secondary>attributes</secondary></indexterm>
+All 
+<symbol>InputOutput</symbol>
+windows have a border width of zero or more pixels, an optional background, 
+an event suppression mask (which suppresses propagation of events from 
+children), and a property list
+(see <link linkend="Properties_and_Atoms">section 4.3</link>).
+The window border and background can be a solid color or a pattern, called
+a tile.
+All windows except the root have a parent and are clipped by their parent.
+If a window is stacked on top of another window, it obscures that other
+window for the purpose of input.
+If a window has a background (almost all do), it obscures the other
+window for purposes of output.
+Attempts to output to the obscured area do nothing, 
+and no input events (for example, pointer motion) are generated for the 
+obscured area.
+</para>
+<para>
+<!-- .LP -->
+Windows also have associated property lists
+(see <link linkend="Properties_and_Atoms">section 4.3</link>).
+</para>
+<para>
+<!-- .LP -->
+Both
+<symbol>InputOutput</symbol>
+and
+<symbol>InputOnly</symbol>
+windows have the following common attributes,
+which are the only attributes of an
+<symbol>InputOnly</symbol>
+window:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+win-gravity
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+event-mask
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+do-not-propagate-mask
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+override-redirect
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+cursor
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+If you specify any other attributes for an
+<symbol>InputOnly</symbol>
+window,
+a
+<errorname>BadMatch</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+<symbol>InputOnly</symbol>
+windows are used for controlling input events in situations where
+<symbol>InputOutput</symbol>
+windows are unnecessary.
+<symbol>InputOnly</symbol>
+windows are invisible; can only be used to control such things as
+cursors, input event generation, and grabbing;
+and cannot be used in any graphics requests.
+Note that
+<symbol>InputOnly</symbol>
+windows cannot have
+<symbol>InputOutput</symbol>
+windows as inferiors.
+</para>
+<para>
+<!-- .LP -->
+Windows have borders of a programmable width and pattern
+as well as a background pattern or tile.
+<indexterm><primary>Tile</primary><secondary>pixmaps</secondary></indexterm>
+Pixel values can be used for solid colors.
+<indexterm><primary>Resource IDs</primary><secondary>freeing</secondary></indexterm>
+<indexterm><primary>Freeing</primary><secondary>resources</secondary></indexterm>
+The background and border pixmaps can be destroyed immediately after
+creating the window if no further explicit references to them
+are to be made.
+<indexterm ><primary>Tile</primary><secondary>mode</secondary></indexterm>
+The pattern can either be relative to the parent 
+or absolute.
+If
+<symbol>ParentRelative</symbol>,
+the parent's background is used.
+</para>
+<para>
+<!-- .LP -->
+When windows are first created, 
+they are not visible (not mapped) on the screen.
+Any output to a window that is not visible on the screen 
+and that does not have backing store will be discarded.
+<indexterm><primary>Window</primary><secondary>mapping</secondary></indexterm>
+An application may wish to create a window long before it is
+mapped to the screen.
+When a window is eventually mapped to the screen 
+(using
+<xref linkend='XMapWindow' xrefstyle='select: title'/>),
+<indexterm><primary>XMapWindow</primary></indexterm>
+the X server generates an 
+<symbol>Expose</symbol>
+event for the window if backing store has not been maintained.
+</para>
+<para>
+<!-- .LP -->
+A window manager can override your choice of size, 
+border width, and position for a top-level window.
+Your program must be prepared to use the actual size and position
+of the top window.
+It is not acceptable for a client application to resize itself
+unless in direct response to a human command to do so.
+Instead, either your program should use the space given to it,
+or if the space is too small for any useful work, your program
+might ask the user to resize the window.
+The border of your top-level window is considered fair game 
+for window managers.
+</para>
+<para>
+<!-- .LP -->
+To set an attribute of a window,
+set the appropriate member of the
+<structname>XSetWindowAttributes</structname>
+structure and OR in the corresponding value bitmask in your subsequent calls to
+<xref linkend='XCreateWindow' xrefstyle='select: title'/>
+and
+<xref linkend='XChangeWindowAttributes' xrefstyle='select: title'/>,
+or use one of the other convenience functions that set the appropriate 
+attribute.
+The symbols for the value mask bits and the
+<structname>XSetWindowAttributes</structname>
+structure are:
+<!-- .sM -->
+</para>
+<para>
+<!-- .LP -->
+/* Window attribute value mask bits */
+
+
+<literallayout class="monospaced">
+/* Window attribute value mask bits */
+#define    CWBackPixmap                    (1L&lt;&lt;0)
+#define    CWBackPixel                     (1L&lt;&lt;1)
+#define    CWBorderPixmap                  (1L&lt;&lt;2)
+#define    CWBorderPixel                   (1L&lt;&lt;3)
+#define    CWBitGravity                    (1L&lt;&lt;4)
+#define    CWWinGravity                    (1L&lt;&lt;5)
+#define    CWBackingStore                  (1L&lt;&lt;6)
+#define    CWBackingPlanes                 (1L&lt;&lt;7)
+#define    CWBackingPixel                  (1L&lt;&lt;8)
+#define    CWOverrideRedirect              (1L&lt;&lt;9)
+#define    CWSaveUnder                     (1L&lt;&lt;10)
+#define    CWEventMask                     (1L&lt;&lt;11)
+#define    CWDontPropagate                 (1L&lt;&lt;12)
+#define    CWColormap                      (1L&lt;&lt;13)
+#define    CWCursor                        (1L&lt;&lt;14)
+</literallayout>
+
+<indexterm significance="preferred"><primary>XSetWindowAttributes</primary></indexterm>
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+/* Values */
+
+typedef struct {
+     Pixmap background_pixmap;     /* background, None, or ParentRelative */
+     unsigned long background_pixel;     /* background pixel */
+     Pixmap border_pixmap;          /* border of the window or CopyFromParent */
+     unsigned long border_pixel;     /* border pixel value */
+     int bit_gravity;     /* one of bit gravity values */
+     int win_gravity;     /* one of the window gravity values */
+     int backing_store;     /* NotUseful, WhenMapped, Always */
+     unsigned long backing_planes;     /* planes to be preserved if possible */
+     unsigned long backing_pixel;     /* value to use in restoring planes */
+     Bool save_under;     /* should bits under be saved? (popups) */
+     long event_mask;     /* set of events that should be saved */
+     long do_not_propagate_mask;     /* set of events that should not propagate */
+     Bool override_redirect;     /* boolean value for override_redirect */
+     Colormap colormap;     /* color map to be associated with window */
+     Cursor cursor;          /* cursor to be displayed (or None) */
+} XSetWindowAttributes;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The following lists the defaults for each window attribute and indicates
+whether the attribute is applicable to
+<symbol>InputOutput</symbol>
+and
+<symbol>InputOnly</symbol>
+windows:
+</para>
+<informaltable frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='4' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='1.0*'/>
+  <colspec colname='c3' colwidth='1.0*'/>
+  <colspec colname='c4' colwidth='1.0*'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Attribute</entry>
+      <entry>Default</entry>
+      <entry>InputOutput</entry>
+      <entry>InputOnly</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>background-pixmap</entry>
+      <entry><symbol>None</symbol></entry>
+      <entry>Yes</entry>
+      <entry>No</entry>
+    </row>
+    <row>
+      <entry>background-pixel</entry>
+      <entry>Undefined</entry>
+      <entry>Yes</entry>
+      <entry>No</entry>
+    </row>
+    <row>
+      <entry>border-pixmap</entry>
+      <entry><symbol>CopyFromParent</symbol></entry>
+      <entry>Yes</entry>
+      <entry>No</entry>
+    </row>
+    <row>
+      <entry>border-pixel</entry>
+      <entry>Undefined</entry>
+      <entry>Yes</entry>
+      <entry>No</entry>
+    </row>
+    <row>
+      <entry>bit-gravity</entry>
+      <entry><symbol>ForgetGravity</symbol></entry>
+      <entry>Yes</entry>
+      <entry>No</entry>
+    </row>
+    <row>
+      <entry>win-gravity</entry>
+      <entry><symbol>NorthWestGravity</symbol></entry>
+      <entry>Yes</entry>
+      <entry>Yes</entry>
+    </row>
+    <row>
+      <entry>backing-store</entry>
+      <entry><symbol>NotUseful</symbol></entry>
+      <entry>Yes</entry>
+      <entry>No</entry>
+    </row>
+    <row>
+      <entry>backing-planes</entry>
+      <entry>All ones</entry>
+      <entry>Yes</entry>
+      <entry>No</entry>
+    </row>
+    <row>
+      <entry>backing-pixel</entry>
+      <entry>zero</entry>
+      <entry>Yes</entry>
+      <entry>No</entry>
+    </row>
+    <row>
+      <entry>save-under</entry>
+      <entry><symbol>False</symbol></entry>
+      <entry>Yes</entry>
+      <entry>No</entry>
+    </row>
+    <row>
+      <entry>event-mask</entry>
+      <entry>empty set</entry>
+      <entry>Yes</entry>
+      <entry>Yes</entry>
+    </row>
+    <row>
+      <entry>do-not-propagate-mask</entry>
+      <entry>empty set</entry>
+      <entry>Yes</entry>
+      <entry>Yes</entry>
+    </row>
+    <row>
+      <entry>override-redirect</entry>
+      <entry><symbol>False</symbol></entry>
+      <entry>Yes</entry>
+      <entry>Yes</entry>
+    </row>
+    <row>
+      <entry>colormap</entry>
+      <entry><symbol>CopyFromParent</symbol></entry>
+      <entry>Yes</entry>
+      <entry>No</entry>
+    </row>
+    <row>
+      <entry>cursor</entry>
+      <entry><symbol>None</symbol></entry>
+      <entry>Yes</entry>
+      <entry>Yes</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<sect2 id="Background_Attribute">
+<title>Background Attribute</title>
+<!-- .XS -->
+<!-- (SN Background Attribute -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Only
+<symbol>InputOutput</symbol>
+windows can have a background.
+You can set the background of an
+<symbol>InputOutput</symbol>
+window by using a pixel or a pixmap.
+</para>
+<para>
+<!-- .LP -->
+The background-pixmap attribute of a window specifies the pixmap to be used for 
+a window's background.
+This pixmap can be of any size, although some sizes may be faster than others.
+The background-pixel attribute of a window specifies a pixel value used to paint
+a window's background in a single color.
+</para>
+<para>
+<!-- .LP -->
+You can set the background-pixmap to a pixmap,  
+<symbol>None</symbol>
+(default), or 
+<symbol>ParentRelative</symbol>.
+You can set the background-pixel of a window to any pixel value (no default).
+If you specify a background-pixel, 
+it overrides either the default background-pixmap
+or any value you may have set in the background-pixmap.
+A pixmap of an undefined size that is filled with the background-pixel is used 
+for the background.
+Range checking is not performed on the background pixel;
+it simply is truncated to the appropriate number of bits.
+</para>
+<para>
+<!-- .LP -->
+If you set the background-pixmap,
+it overrides the default.
+The background-pixmap and the window must have the same depth,
+or a
+<errorname>BadMatch</errorname>
+error results.
+If you set background-pixmap to
+<symbol>None</symbol>,
+the window has no defined background.  
+If you set the background-pixmap to
+<symbol>ParentRelative</symbol>:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+The parent window's background-pixmap is used. 
+The child window, however, must have the same depth as 
+its parent,
+or a
+<errorname>BadMatch</errorname>
+error results.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If the parent window has a background-pixmap of
+<symbol>None</symbol>,
+the window also has a background-pixmap of
+<symbol>None</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A copy of the parent window's background-pixmap is not made.
+The parent's background-pixmap is examined each time the child window's 
+background-pixmap is required.  
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The background tile origin always aligns with the parent window's
+background tile origin. 
+If the background-pixmap is not
+<symbol>ParentRelative</symbol>,
+the background tile origin is the child window's origin.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+Setting a new background, whether by setting background-pixmap or
+background-pixel, overrides any previous background.
+The background-pixmap can be freed immediately if no further explicit reference
+is made to it (the X server will keep a copy to use when needed).
+If you later draw into the pixmap used for the background,
+what happens is undefined because the
+X implementation is free to make a copy of the pixmap or
+to use the same pixmap.
+</para>
+<para>
+<!-- .LP -->
+When no valid contents are available for regions of a window
+and either the regions are visible or the server is maintaining backing store,
+the server automatically tiles the regions with the window's background
+unless the window has a background of
+<symbol>None</symbol>.
+If the background is
+<symbol>None</symbol>,
+the previous screen contents from other windows of the same depth as the window
+are simply left in place as long as the contents come from the parent of the
+window or an inferior of the parent.
+Otherwise, the initial contents of the exposed regions are undefined.
+<symbol>Expose</symbol>
+events are then generated for the regions, even if the background-pixmap
+is
+<symbol>None</symbol>
+(see <link linkend="Exposure_Events">section 10.9</link>).
+</para>
+</sect2>
+<sect2 id="Border_Attribute">
+<title>Border Attribute</title>
+<!-- .XS -->
+<!-- (SN Border Attribute -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Only
+<symbol>InputOutput</symbol>
+windows can have a border.
+You can set the border of an
+<symbol>InputOutput</symbol>
+window by using a pixel or a pixmap.
+</para>
+<para>
+<!-- .LP -->
+The border-pixmap attribute of a window specifies the pixmap to be used 
+for a window's border.
+The border-pixel attribute of a window specifies a pixmap of undefined size 
+filled with that pixel be used for a window's border. 
+Range checking is not performed on the background pixel;
+it simply is truncated to the appropriate number of bits.
+The border tile origin is always the same as the background tile origin.
+</para>
+<para>
+<!-- .LP -->
+You can also set the border-pixmap to a pixmap of any size (some may be faster
+than others) or to
+<symbol>CopyFromParent</symbol>
+(default).
+You can set the border-pixel to any pixel value (no default).
+</para>
+<para>
+<!-- .LP -->
+If you set a border-pixmap, 
+it overrides the default.
+The border-pixmap and the window must have the same depth,
+or a
+<errorname>BadMatch</errorname>
+error results.
+If you set the border-pixmap to 
+<symbol>CopyFromParent</symbol>,
+the parent window's border-pixmap is copied.
+Subsequent changes to the parent window's border attribute do not affect 
+the child window.
+However, the child window must have the same depth as the parent window,
+or a
+<errorname>BadMatch</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+The border-pixmap can be freed immediately if no further explicit reference
+is made to it.
+If you later draw into the pixmap used for the border,
+what happens is undefined because the
+X implementation is free either to make a copy of the pixmap or
+to use the same pixmap.
+If you specify a border-pixel, 
+it overrides either the default border-pixmap
+or any value you may have set in the border-pixmap.
+All pixels in the window's border will be set to the border-pixel.
+Setting a new border, whether by setting border-pixel or by setting
+border-pixmap, overrides any previous border.
+</para>
+<para>
+<!-- .LP -->
+Output to a window is always clipped to the inside of the window. 
+Therefore, graphics operations never affect the window border.
+</para>
+</sect2>
+<sect2 id="Gravity_Attributes">
+<title>Gravity Attributes</title>
+<!-- .XS -->
+<!-- (SN Gravity Attributes -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The bit gravity of a window defines which region of the window should be 
+retained when an
+<symbol>InputOutput</symbol>
+window is resized. 
+The default value for the bit-gravity attribute is 
+<symbol>ForgetGravity</symbol>.
+The window gravity of a window allows you to define how the 
+<symbol>InputOutput</symbol>
+or
+<symbol>InputOnly</symbol>
+window should be repositioned if its parent is resized.  
+The default value for the win-gravity attribute is 
+<symbol>NorthWestGravity</symbol>.
+</para>
+<para>
+<!-- .LP -->
+If the inside width or height of a window is not changed 
+and if the window is moved or its border is changed, 
+then the contents of the window are not lost but move with the window.
+Changing the inside width or height of the window causes its contents to be
+moved or lost (depending on the bit-gravity of the window) and causes
+children to be reconfigured (depending on their win-gravity).
+For a
+change of width and height, the (x, y) pairs are defined:
+</para>
+<para>
+<!-- .LP -->
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='2.0*'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Gravity Direction</entry>
+      <entry>Coordinates</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry><symbol>NorthWestGravity</symbol></entry>
+      <entry>(0, 0)</entry>
+    </row>
+    <row>
+      <entry><symbol>NorthGravity</symbol></entry>
+      <entry>(Width/2, 0)</entry>
+    </row>
+    <row>
+      <entry><symbol>NorthEastGravity</symbol></entry>
+      <entry>(Width, 0)</entry>
+    </row>
+    <row>
+      <entry><symbol>WestGravity</symbol></entry>
+      <entry>(0, Height/2)</entry>
+    </row>
+    <row>
+      <entry><symbol>CenterGravity</symbol></entry>
+      <entry>(Width/2, Height/2)</entry>
+    </row>
+    <row>
+      <entry><symbol>EastGravity</symbol></entry>
+      <entry>(Width, Height/2)</entry>
+    </row>
+    <row>
+      <entry><symbol>SouthWestGravity</symbol></entry>
+      <entry>(0, Height)</entry>
+    </row>
+    <row>
+      <entry><symbol>SouthGravity</symbol></entry>
+      <entry>(Width/2, Height)</entry>
+    </row>
+    <row>
+      <entry><symbol>SouthEastGravity</symbol></entry>
+      <entry>(Width, Height)</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+</para>
+<para>
+<!-- .LP -->
+When a window with one of these bit-gravity values is resized, 
+the corresponding pair
+defines the change in position of each pixel in the window.
+When a window with one of these win-gravities has its parent window resized,
+the corresponding pair defines the change in position of the window 
+within the parent.
+When a window is so repositioned, a
+<symbol>GravityNotify</symbol>
+event is generated
+(see <link linkend="GravityNotify_Events">section 10.10.5</link>).
+</para>
+<para>
+<!-- .LP -->
+A bit-gravity of
+<symbol>StaticGravity</symbol>
+indicates that the contents or origin should not move relative to the 
+origin of the root window.
+If the change in size of the window is coupled with a change in position (x, y),
+then for bit-gravity the change in position of each pixel is (&minus;x, &minus;y), and for
+win-gravity the change in position of a child when its parent is so resized is
+(&minus;x, &minus;y).
+Note that
+<symbol>StaticGravity</symbol>
+still only takes effect when the width or height of the window is changed, 
+not when the window is moved.
+</para>
+<para>
+<!-- .LP -->
+A bit-gravity of 
+<symbol>ForgetGravity</symbol>
+indicates that the window's contents are always discarded after a size change, 
+even if a backing store or save under has been requested.
+The window is tiled with its background
+and zero or more 
+<symbol>Expose</symbol>
+events are generated. 
+If no background is defined, the existing screen contents are not
+altered.
+Some X servers may also ignore the specified bit-gravity and 
+always generate 
+<symbol>Expose</symbol>
+events.
+</para>
+<para>
+<!-- .LP -->
+The contents and borders of inferiors are not affected by their parent's
+bit-gravity.
+A server is permitted to ignore the specified bit-gravity and use
+<symbol>Forget</symbol>
+instead.
+</para>
+<para>
+<!-- .LP -->
+A win-gravity of 
+<symbol>UnmapGravity</symbol>
+is like 
+<symbol>NorthWestGravity</symbol>
+(the window is not moved),
+except the child is also
+unmapped when the parent is resized,
+and an 
+<symbol>UnmapNotify</symbol>
+event is
+generated.
+</para>
+</sect2>
+<sect2 id="Backing_Store_Attribute">
+<title>Backing Store Attribute</title>
+<!-- .XS -->
+<!-- (SN Backing Store Attribute -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Some implementations of the X server may choose to maintain the contents of 
+<symbol>InputOutput</symbol>
+windows.
+If the X server maintains the contents of a window, 
+the off-screen saved pixels
+are known as backing store.
+The backing store advises the X server on what to do 
+with the contents of a window.
+The backing-store attribute can be set to
+<symbol>NotUseful</symbol>
+(default),
+<symbol>WhenMapped</symbol>,
+or
+<symbol>Always</symbol>.
+</para>
+<para>
+<!-- .LP -->
+A backing-store attribute of 
+<symbol>NotUseful</symbol>
+advises the X server that 
+maintaining contents is unnecessary, 
+although some X implementations may
+still choose to maintain contents and, therefore, not generate 
+<symbol>Expose</symbol>
+events.
+A backing-store attribute of 
+<symbol>WhenMapped</symbol>
+advises the X server that maintaining contents of 
+obscured regions when the window is mapped would be beneficial.
+In this case,
+the server may generate an 
+<symbol>Expose</symbol>
+event when the window is created.
+A backing-store attribute of 
+<symbol>Always</symbol>
+advises the X server that maintaining contents even when 
+the window is unmapped would be beneficial.  
+Even if the window is larger than its parent, 
+this is a request to the X server to maintain complete contents, 
+not just the region within the parent window boundaries.  
+While the X server maintains the window's contents, 
+<symbol>Expose</symbol>
+events normally are not generated, 
+but the X server may stop maintaining 
+contents at any time.  
+</para>
+<para>
+<!-- .LP -->
+When the contents of obscured regions of a window are being maintained,
+regions obscured by noninferior windows are included in the destination
+of graphics requests (and source, when the window is the source).
+However, regions obscured by inferior windows are not included.
+</para>
+</sect2>
+<sect2 id="Save_Under_Flag">
+<title>Save Under Flag</title>
+<!-- .XS -->
+<!-- (SN Save Under Flag -->
+<!-- .XE -->
+<indexterm><primary>Save Unders</primary></indexterm>
+<para>
+<!-- .LP -->
+Some server implementations may preserve contents of 
+<symbol>InputOutput</symbol>
+windows under other 
+<symbol>InputOutput</symbol>
+windows.
+This is not the same as preserving the contents of a window for you.
+You may get better visual
+appeal if transient windows (for example, pop-up menus) request that the system
+preserve the screen contents under them, 
+so the temporarily obscured applications do not have to repaint.
+</para>
+<para>
+<!-- .LP -->
+You can set the save-under flag to
+<symbol>True</symbol>
+or
+<symbol>False</symbol>
+(default).
+If save-under is 
+<symbol>True</symbol>,
+the X server is advised that, when this window is mapped, 
+saving the contents of windows it obscures would be beneficial.
+</para>
+</sect2>
+<sect2 id="Backing_Planes_and_Backing_Pixel_Attributes">
+<title>Backing Planes and Backing Pixel Attributes</title>
+<!-- .XS -->
+<!-- (SN Backing Planes and Backing Pixel Attributes -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+You can set backing planes to indicate (with bits set to 1) 
+which bit planes of an
+<symbol>InputOutput</symbol>
+window hold dynamic data that must be preserved in backing store 
+and during save unders.
+The default value for the backing-planes attribute is all bits set to 1.
+You can set backing pixel to specify what bits to use in planes not 
+covered by backing planes.
+The default value for the backing-pixel attribute is all bits set to 0.
+The X server is free to save only the specified bit planes in the backing store
+or the save under and is free to regenerate the remaining planes with 
+the specified pixel value.
+Any extraneous bits in these values (that is, those bits beyond 
+the specified depth of the window) may be simply ignored.
+If you request backing store or save unders,
+you should use these members to minimize the amount of off-screen memory 
+required to store your window.
+</para>
+</sect2>
+<sect2 id="Event_Mask_and_Do_Not_Propagate_Mask_Attributes">
+<title>Event Mask and Do Not Propagate Mask Attributes</title>
+<!-- .XS -->
+<!-- (SN Event Mask and Do Not Propagate Mask Attributes -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The event mask defines which events the client is interested in for this 
+<symbol>InputOutput</symbol>
+or
+<symbol>InputOnly</symbol>
+window (or, for some event types, inferiors of this window).
+The event mask is the bitwise inclusive OR of zero or more of the 
+valid event mask bits.
+You can specify that no maskable events are reported by setting 
+<symbol>NoEventMask</symbol>
+(default).
+</para>
+<para>
+<!-- .LP -->
+The do-not-propagate-mask attribute
+defines which events should not be propagated to 
+ancestor windows when no client has the event type selected in this 
+<symbol>InputOutput</symbol>
+or
+<symbol>InputOnly</symbol>
+window.
+The do-not-propagate-mask is the bitwise inclusive OR of zero or more
+of the following masks:
+<symbol>KeyPress</symbol>,
+<symbol>KeyRelease</symbol>,
+<symbol>ButtonPress</symbol>,
+<symbol>ButtonRelease</symbol>,
+<symbol>PointerMotion</symbol>,
+<symbol>Button1Motion</symbol>,
+<symbol>Button2Motion</symbol>,
+<symbol>Button3Motion</symbol>,
+<symbol>Button4Motion</symbol>,
+<symbol>Button5Motion</symbol>,
+and
+<symbol>ButtonMotion</symbol>.
+You can specify that all events are propagated by setting 
+<symbol>NoEventMask</symbol>
+(default).
+</para>
+</sect2>
+<sect2 id="Override_Redirect_Flag">
+<title>Override Redirect Flag</title>
+<!-- .XS -->
+<!-- (SN Override Redirect Flag -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To control window placement or to add decoration,
+a window manager often needs to intercept (redirect) any map or configure
+request.
+Pop-up windows, however, often need to be mapped without a window manager
+getting in the way.
+To control whether an
+<symbol>InputOutput</symbol>
+or
+<symbol>InputOnly</symbol>
+window is to ignore these structure control facilities,
+use the override-redirect flag.
+</para>
+<para>
+<!-- .LP -->
+The override-redirect flag specifies whether map and configure requests 
+on this window should override a 
+<symbol>SubstructureRedirectMask</symbol>
+on the parent.
+You can set the override-redirect flag to
+<symbol>True</symbol>
+or
+<symbol>False</symbol>
+(default).
+Window managers use this information to avoid tampering with pop-up windows
+(see also <link linkend='Inter_Client_Communication_Functions'>chapter 14</link>).
+</para>
+</sect2>
+<sect2 id="Colormap_Attribute">
+<title>Colormap Attribute</title>
+<!-- .XS -->
+<!-- (SN Colormap Attribute -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The colormap attribute specifies which colormap best reflects the true
+colors of the 
+<symbol>InputOutput</symbol>
+window.  
+The colormap must have the same visual type as the window,
+or a 
+<errorname>BadMatch</errorname>
+error results.  
+X servers capable of supporting multiple 
+hardware colormaps can use this information, 
+and window managers can use it for calls to
+<xref linkend='XInstallColormap' xrefstyle='select: title'/>.
+You can set the colormap attribute to a colormap or to
+<symbol>CopyFromParent</symbol>
+(default).
+</para>
+<para>
+<!-- .LP -->
+If you set the colormap to
+<symbol>CopyFromParent</symbol>,
+the parent window's colormap is copied and used by its child.
+However, the child window must have the same visual type as the parent, 
+or a 
+<errorname>BadMatch</errorname>
+error results. 
+The parent window must not have a colormap of 
+<symbol>None</symbol>,
+or a 
+<errorname>BadMatch</errorname>
+error results.
+The colormap is copied by sharing the colormap object between the child 
+and parent, not by making a complete copy of the colormap contents.
+Subsequent changes to the parent window's colormap attribute do
+not affect the child window.
+</para>
+</sect2>
+<sect2 id="Cursor_Attribute">
+<title>Cursor Attribute</title>
+<!-- .XS -->
+<!-- (SN Cursor Attribute -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The cursor attribute specifies which cursor is to be used when the pointer is
+in the 
+<symbol>InputOutput</symbol>
+or
+<symbol>InputOnly</symbol>
+window.
+You can set the cursor to a cursor or
+<symbol>None</symbol>
+(default).
+</para>
+<para>
+<!-- .LP -->
+If you set the cursor to
+<symbol>None</symbol>,
+the parent's cursor is used when the 
+pointer is in the 
+<symbol>InputOutput</symbol>
+or
+<symbol>InputOnly</symbol>
+window, and any change in the parent's cursor will cause an
+immediate change in the displayed cursor.
+By calling
+<xref linkend='XFreeCursor' xrefstyle='select: title'/>,
+the cursor can be freed immediately as long as no further explicit reference 
+to it is made.
+</para>
+</sect2>
+</sect1>
+<sect1 id="Creating_Windows">
+<title>Creating Windows</title>
+<!-- .XS -->
+<!-- (SN Creating Windows -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides basic ways for creating windows,
+and toolkits often supply higher-level functions specifically for
+creating and placing top-level windows,
+which are discussed in the appropriate toolkit documentation.
+If you do not use a toolkit, however,
+you must provide some standard information or hints for the window
+manager by using the Xlib inter-client communication functions
+(see <link linkend='Inter_Client_Communication_Functions'>chapter 14</link>).
+</para>
+<para>
+<!-- .LP -->
+If you use Xlib to create your own top-level windows
+(direct children of the root window),
+you must observe the following rules so that all applications interact
+reasonably across the different styles of window management:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+You must never fight with the window manager for the size or
+placement of your top-level window.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+You must be able to deal with whatever size window you get, 
+even if this means that your application just prints a message 
+like ``Please make me bigger'' in its window.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+You should only attempt to resize or move top-level windows in
+direct response to a user request.
+If a request to change the size of a top-level window fails,
+you must be prepared to live with what you get.
+You are free to resize or move the children of top-level
+windows as necessary.
+(Toolkits often have facilities for automatic relayout.)
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If you do not use a toolkit that automatically sets standard window properties,
+you should set these properties for top-level windows before mapping them.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+For further information,
+see <link linkend='Inter_Client_Communication_Functions'>chapter 14</link> and
+the <olink targetdoc='icccm' targetptr='icccm'><citetitle>Inter-Client Communication Conventions Manual</citetitle></olink>.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XCreateWindow' xrefstyle='select: title'/>
+is the more general function that allows you to set specific window attributes 
+when you create a window.
+<xref linkend='XCreateSimpleWindow' xrefstyle='select: title'/>
+creates a window that inherits its attributes from its parent window.
+</para>
+<para>
+<!-- .LP -->
+<indexterm><primary>Window</primary><secondary>InputOnly</secondary></indexterm>
+The X server acts as if 
+<symbol>InputOnly</symbol>
+windows do not exist for
+the purposes of graphics requests, exposure processing, and
+<symbol>VisibilityNotify</symbol>
+events.
+An 
+<symbol>InputOnly</symbol>
+window cannot be used as a
+drawable (that is, as a source or destination for graphics requests).
+<symbol>InputOnly</symbol>
+and 
+<symbol>InputOutput</symbol>
+windows act identically in other respects (properties,
+grabs, input control, and so on).
+Extension packages can define other classes of windows.
+</para>
+<para>
+<!-- .LP -->
+To create an unmapped window and set its window attributes, use
+<xref linkend='XCreateWindow' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XCreateWindow</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XCreateWindow'>
+<funcprototype>
+  <funcdef>Window <function>XCreateWindow</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> parent</parameter></paramdef>
+  <paramdef>intx,<parameter> y</parameter></paramdef>
+  <paramdef>unsignedintwidth,<parameter> height</parameter></paramdef>
+  <paramdef>unsignedint<parameter> border_width</parameter></paramdef>
+  <paramdef>int<parameter> depth</parameter></paramdef>
+  <paramdef>unsignedint<parameter> class</parameter></paramdef>
+  <paramdef>Visual<parameter> *visual</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> valuemask</parameter></paramdef>
+  <paramdef>XSetWindowAttributes<parameter> *attributes</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>parent</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the parent window.
+<!-- .ds Xy , which are the top-left outside corner of the created window's \ -->
+borders and are relative to the inside of the parent window's borders
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates(Xy.
+<!-- .ds Wh , which are the created window's inside dimensions \ -->
+and do not include the created window's borders
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the width and height(Wh.
+The dimensions must be nonzero,
+or a
+<errorname>BadValue</errorname>
+error results.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>border_width</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the width of the created window's border in pixels.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>depth</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window's depth.
+A depth of 
+<symbol>CopyFromParent</symbol>
+means the depth is taken from the parent.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>class</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the created window's class.
+You can pass
+<symbol>InputOutput</symbol>,
+<symbol>InputOnly</symbol>,
+or 
+<symbol>CopyFromParent</symbol>.
+A class of 
+<symbol>CopyFromParent</symbol>
+means the class
+is taken from the parent.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>visual</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the visual type.
+A visual of 
+<symbol>CopyFromParent</symbol>
+means the visual type is taken from the 
+parent.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>valuemask</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies which window attributes are defined in the attributes
+argument.
+This mask is the bitwise inclusive OR of the valid attribute mask bits.
+If valuemask is zero,
+the attributes are ignored and are not referenced.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>attributes</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the structure from which the values (as specified by the value mask)
+are to be taken.
+The value mask should have the appropriate bits
+set to indicate which attributes have been set in the structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XCreateWindow' xrefstyle='select: title'/>
+function creates an unmapped subwindow for a specified parent window, 
+returns the window ID of the created window, 
+and causes the X server to generate a
+<symbol>CreateNotify</symbol>
+event.
+The created window is placed on top in the stacking order 
+with respect to siblings.
+</para>
+<para>
+<!-- .LP -->
+The coordinate system has the X axis horizontal and the Y axis vertical
+with the origin [0, 0] at the upper-left corner.
+Coordinates are integral,
+in terms of pixels,
+and coincide with pixel centers.
+Each window and pixmap has its own coordinate system.
+For a window, 
+the origin is inside the border at the inside, upper-left corner.
+</para>
+<para>
+<!-- .LP -->
+The border_width for an
+<symbol>InputOnly</symbol>
+window must be zero, or a
+<errorname>BadMatch</errorname>
+error results.
+For class
+<symbol>InputOutput</symbol>,
+the visual type and depth must be a combination supported for the screen,
+or a
+<errorname>BadMatch</errorname>
+error results.
+The depth need not be the same as the parent,
+but the parent must not be a window of class 
+<symbol>InputOnly</symbol>,
+or a
+<errorname>BadMatch</errorname>
+error results.
+For an
+<symbol>InputOnly</symbol>
+window,
+the depth must be zero, and the visual must be one supported by the screen.
+If either condition is not met,
+a
+<errorname>BadMatch</errorname>
+error results.
+The parent window, however, may have any depth and class.
+If you specify any invalid window attribute for a window, a
+<errorname>BadMatch</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+The created window is not yet displayed (mapped) on the user's display.
+To display the window, call
+<xref linkend='XMapWindow' xrefstyle='select: title'/>.
+The new window initially uses the same cursor as
+its parent. 
+A new cursor can be defined for the new window by calling
+<xref linkend='XDefineCursor' xrefstyle='select: title'/>.
+<indexterm><primary>Cursor</primary><secondary>Initial State</secondary></indexterm>
+<indexterm><primary>XDefineCursor</primary></indexterm>
+The window will not be visible on the screen unless it and all of its
+ancestors are mapped and it is not obscured by any of its ancestors.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XCreateWindow' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>,
+<errorname>BadColor</errorname>,
+<errorname>BadCursor</errorname>,
+<errorname>BadMatch</errorname>,
+<errorname>BadPixmap</errorname>,
+<errorname>BadValue</errorname>,
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To create an unmapped 
+<symbol>InputOutput</symbol>
+subwindow of a given parent window, use
+<xref linkend='XCreateSimpleWindow' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XCreateSimpleWindow</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XCreateSimpleWindow'>
+<funcprototype>
+  <funcdef>Window <function>XCreateSimpleWindow</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> parent</parameter></paramdef>
+  <paramdef>intx,<parameter> y</parameter></paramdef>
+  <paramdef>unsignedintwidth,<parameter> height</parameter></paramdef>
+  <paramdef>unsignedint<parameter> border_width</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> border</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> background</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>parent</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the parent window.
+<!-- .ds Xy , which are the top-left outside corner of the new window's borders \ -->
+and are relative to the inside of the parent window's borders
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates(Xy.
+<!-- .ds Wh , which are the created window's inside dimensions \ -->
+and do not include the created window's borders
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the width and height(Wh.
+The dimensions must be nonzero,
+or a
+<errorname>BadValue</errorname>
+error results.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>border_width</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the width of the created window's border in pixels.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>border</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the border pixel value of the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>background</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the background pixel value of the window.
+
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XCreateSimpleWindow' xrefstyle='select: title'/>
+function creates an unmapped
+<symbol>InputOutput</symbol>
+subwindow for a specified parent window, returns the
+window ID of the created window, and causes the X server to generate a
+<symbol>CreateNotify</symbol>
+event.
+The created window is placed on top in the stacking order with respect to 
+siblings.
+Any part of the window that extends outside its parent window is clipped.
+The border_width for an
+<symbol>InputOnly</symbol>
+window must be zero, or a
+<errorname>BadMatch</errorname>
+error results.
+<xref linkend='XCreateSimpleWindow' xrefstyle='select: title'/>
+inherits its depth, class, and visual from its parent.
+All other window attributes, except background and border, 
+have their default values.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XCreateSimpleWindow' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>,
+<errorname>BadMatch</errorname>,
+<errorname>BadValue</errorname>,
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+</sect1>
+<sect1 id="Destroying_Windows">
+<title>Destroying Windows</title>
+<!-- .XS -->
+<!-- (SN Destroying Windows  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to destroy a window or destroy all
+subwindows of a window.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To destroy a window and all of its subwindows, use
+<xref linkend='XDestroyWindow' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDestroyWindow</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDestroyWindow'>
+<funcprototype>
+  <funcdef><function>XDestroyWindow</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XDestroyWindow' xrefstyle='select: title'/>
+function destroys the specified window as well as all of its subwindows and causes
+the X server to generate a
+<symbol>DestroyNotify</symbol>
+event for each window.
+The window should never be referenced again.
+If the window specified by the w argument is mapped,
+it is unmapped automatically.
+The ordering of the
+<symbol>DestroyNotify</symbol>
+events is such that for any given window being destroyed,
+<symbol>DestroyNotify</symbol>
+is generated on any inferiors of the window before being generated on
+the window itself.
+The ordering among siblings and across subhierarchies is not otherwise
+constrained.
+If the window you specified is a root window, no windows are destroyed.
+Destroying a mapped window will generate 
+<symbol>Expose</symbol>
+events on other windows that were obscured by the window being destroyed.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XDestroyWindow' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To destroy all subwindows of a specified window, use 
+<xref linkend='XDestroySubwindows' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDestroySubwindows</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDestroySubwindows'>
+<funcprototype>
+  <funcdef><function>XDestroySubwindows</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XDestroySubwindows' xrefstyle='select: title'/>
+function destroys all inferior windows of the specified window, 
+in bottom-to-top stacking order.
+It causes the X server to generate a
+<symbol>DestroyNotify</symbol>
+event for each window.
+If any mapped
+subwindows were actually destroyed,
+<xref linkend='XDestroySubwindows' xrefstyle='select: title'/>
+causes the X server to generate 
+<symbol>Expose</symbol>
+events on the specified window.
+This is much more efficient than deleting many windows
+one at a time because much of the work need be performed only once for all
+of the windows, rather than for each window.
+The subwindows should never be referenced again.  
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XDestroySubwindows' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+</sect1>
+<sect1 id='Mapping_Windows'>
+<title>Mapping Windows</title>
+<!-- .XS -->
+<!-- (SN Mapping Windows  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+A window is considered mapped if an 
+<xref linkend='XMapWindow' xrefstyle='select: title'/>
+call has been made on it.
+It may not be visible on the screen for one of the following reasons:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+It is obscured by another opaque window.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+One of its ancestors is not mapped.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It is entirely clipped by an ancestor.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+<symbol>Expose</symbol>
+events are generated for the window when part or all of
+it becomes visible on the screen. 
+A client receives the
+<symbol>Expose</symbol>
+events only if it has asked for them.
+Windows retain their position in the stacking order when they are unmapped.
+</para>
+<para>
+<!-- .LP -->
+A window manager may want to control the placement of subwindows.
+If 
+<symbol>SubstructureRedirectMask</symbol>
+has been selected by a window manager
+on a parent window (usually a root window),
+a map request initiated by other clients on a child window is not performed,
+and the window manager is sent a 
+<symbol>MapRequest</symbol>
+event.
+However, if the override-redirect flag on the child had been set to
+<symbol>True</symbol>
+(usually only on pop-up menus),
+the map request is performed.
+</para>
+<para>
+<!-- .LP -->
+A tiling window manager might decide to reposition and resize other clients' 
+windows and then decide to map the window to its final location.
+A window manager that wants to provide decoration might
+reparent the child into a frame first.
+For further information,
+see <link linkend="Override_Redirect_Flag">sections 3.2.8</link>
+and <link linkend='Window_State_Change_Events'>10.10</link>.
+Only a single client at a time can select for 
+<symbol>SubstructureRedirectMask</symbol>.
+</para>
+<para>
+<!-- .LP -->
+Similarly, a single client can select for 
+<symbol>ResizeRedirectMask</symbol>
+on a parent window.
+Then, any attempt to resize the window by another client is suppressed, and
+the client receives a 
+<symbol>ResizeRequest</symbol>
+event.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To map a given window, use 
+<xref linkend='XMapWindow' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XMapWindow</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XMapWindow'>
+<funcprototype>
+  <funcdef><function>XMapWindow</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XMapWindow' xrefstyle='select: title'/>
+function
+maps the window and all of its
+subwindows that have had map requests.
+Mapping a window that has an unmapped ancestor does not display the
+window but marks it as eligible for display when the ancestor becomes
+mapped.
+Such a window is called unviewable.
+When all its ancestors are mapped,
+the window becomes viewable
+and will be visible on the screen if it is not obscured by another window.
+This function has no effect if the window is already mapped.
+</para>
+<para>
+<!-- .LP -->
+If the override-redirect of the window is
+<symbol>False</symbol>
+and if some other client has selected
+<symbol>SubstructureRedirectMask</symbol>
+on the parent window, then the X server generates a
+<symbol>MapRequest</symbol>
+event, and the
+<xref linkend='XMapWindow' xrefstyle='select: title'/>
+function does not map the window.
+Otherwise, the window is mapped, and the X server generates a
+<symbol>MapNotify</symbol>
+event.
+</para>
+<para>
+<!-- .LP -->
+If the window becomes viewable and no earlier contents for it are remembered,
+the X server tiles the window with its background.
+If the window's background is undefined,
+the existing screen contents are not
+altered, and the X server generates zero or more 
+<symbol>Expose</symbol>
+events.
+If backing-store was maintained while the window was unmapped, no 
+<symbol>Expose</symbol>
+events
+are generated.
+If backing-store will now be maintained, 
+a full-window exposure is always generated.
+Otherwise, only visible regions may be reported.
+Similar tiling and exposure take place for any newly viewable inferiors.
+</para>
+<para>
+<!-- .LP -->
+<indexterm><primary>XMapWindow</primary></indexterm>
+If the window is an
+<symbol>InputOutput</symbol>
+window,
+<xref linkend='XMapWindow' xrefstyle='select: title'/>
+generates 
+<symbol>Expose</symbol>
+events on each 
+<symbol>InputOutput</symbol>
+window that it causes to be displayed.
+If the client maps and paints the window 
+and if the client begins processing events, 
+the window is painted twice.
+To avoid this,
+first ask for 
+<symbol>Expose</symbol>
+events and then map the window,
+so the client processes input events as usual.
+The event list will include 
+<symbol>Expose</symbol>
+for each
+window that has appeared on the screen. 
+The client's normal response to
+an 
+<symbol>Expose</symbol>
+event should be to repaint the window.
+This method usually leads to simpler programs and to proper interaction
+with window managers.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XMapWindow' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To map and raise a window, use
+<xref linkend='XMapRaised' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XMapRaised</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XMapRaised'>
+<funcprototype>
+  <funcdef><function>XMapRaised</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XMapRaised' xrefstyle='select: title'/>
+function
+essentially is similar to
+<xref linkend='XMapWindow' xrefstyle='select: title'/>
+in that it maps the window and all of its
+subwindows that have had map requests.
+However, it also raises the specified window to the top of the stack.
+For additional information,
+see 
+<xref linkend='XMapWindow' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XMapRaised' xrefstyle='select: title'/>
+can generate multiple
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To map all subwindows for a specified window, use 
+<xref linkend='XMapSubwindows' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XMapSubwindows</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XMapSubwindows'>
+<funcprototype>
+  <funcdef><function>XMapSubwindows</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XMapSubwindows' xrefstyle='select: title'/>
+<indexterm><primary>XMapSubwindows</primary></indexterm>
+function maps all subwindows for a specified window in top-to-bottom stacking 
+order.
+The X server generates
+<symbol>Expose</symbol>
+events on each newly displayed window.
+This may be much more efficient than mapping many windows
+one at a time because the server needs to perform much of the work
+only once, for all of the windows, rather than for each window.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XMapSubwindows' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+</sect1>
+<sect1 id="Unmapping_Windows">
+<title>Unmapping Windows</title>
+<!-- .XS -->
+<!-- (SN Unmapping Windows  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to unmap a window or all subwindows.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To unmap a window, use 
+<xref linkend='XUnmapWindow' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XUnmapWindow</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XUnmapWindow'>
+<funcprototype>
+  <funcdef><function>XUnmapWindow</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XUnmapWindow' xrefstyle='select: title'/>
+function unmaps the specified window and causes the X server to generate an
+<symbol>UnmapNotify</symbol>
+<indexterm><primary>UnmapNotify Event</primary></indexterm>
+<indexterm><primary>XUnmapWindow</primary></indexterm>
+event.
+If the specified window is already unmapped, 
+<xref linkend='XUnmapWindow' xrefstyle='select: title'/>
+has no effect.
+Normal exposure processing on formerly obscured windows is performed.
+Any child window will no longer be visible until another map call is
+made on the parent.
+In other words, the subwindows are still mapped but are not visible
+until the parent is mapped.
+Unmapping a window will generate 
+<symbol>Expose</symbol>
+events on windows that were formerly obscured by it.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XUnmapWindow' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To unmap all subwindows for a specified window, use 
+<xref linkend='XUnmapSubwindows' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XUnmapSubwindows</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XUnmapSubwindows'>
+<funcprototype>
+  <funcdef><function>XUnmapSubwindows</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XUnmapSubwindows' xrefstyle='select: title'/>
+function unmaps all subwindows for the specified window in bottom-to-top
+stacking order.
+It causes the X server to generate an
+<symbol>UnmapNotify</symbol>
+event on each subwindow and 
+<symbol>Expose</symbol>
+events on formerly obscured windows.
+<indexterm><primary>UnmapNotify Event</primary></indexterm>
+Using this function is much more efficient than unmapping multiple windows
+one at a time because the server needs to perform much of the work
+only once, for all of the windows, rather than for each window.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XUnmapSubwindows' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+</sect1>
+<sect1 id="Configuring_Windows">
+<title>Configuring Windows</title>
+<!-- .XS -->
+<!-- (SN Configuring Windows  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+</para>
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to
+move a window, resize a window, move and resize a window, or
+change a window's border width.
+To change one of these parameters,
+set the appropriate member of the
+<structname>XWindowChanges</structname>
+structure and OR in the corresponding value mask in subsequent calls to
+<xref linkend='XConfigureWindow' xrefstyle='select: title'/>.
+The symbols for the value mask bits and the
+<structname>XWindowChanges</structname>
+structure are:
+<!-- .sM -->
+</para>
+<para>
+<!-- .LP -->
+
+<literallayout class="monospaced">
+/* Configure window value mask bits */
+#define      CWX              (1&lt;&lt;0)
+#define      CWY              (1&lt;&lt;1)
+#define      CWWidth          (1&lt;&lt;2)
+#define      CWHeight         (1&lt;&lt;3)
+#define      CWBorderWidth    (1&lt;&lt;4)
+#define      CWSibling        (1&lt;&lt;5)
+#define      CWStackMode      (1&lt;&lt;6)
+</literallayout>
+
+<indexterm significance="preferred"><primary>XWindowChanges</primary></indexterm>
+<literallayout class="monospaced">
+/* Values */
+
+typedef struct {
+     int x, y;
+     int width, height;
+     int border_width;
+     Window sibling;
+     int stack_mode;
+} XWindowChanges;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The x and y members are used to set the window's x and y coordinates,
+which are relative to the parent's origin
+and indicate the position of the upper-left outer corner of the window.
+The width and height members are used to set the inside size of the window,
+not including the border, and must be nonzero, or a
+<errorname>BadValue</errorname>
+error results.
+Attempts to configure a root window have no effect.
+</para>
+<para>
+<!-- .LP -->
+The border_width member is used to set the width of the border in pixels.
+Note that setting just the border width leaves the outer-left corner of the window
+in a fixed position but moves the absolute position of the window's origin.
+If you attempt to set the border-width attribute of an
+<symbol>InputOnly</symbol>
+window nonzero, a
+<errorname>BadMatch</errorname>
+error results. 
+</para>
+<para>
+<!-- .LP -->
+The sibling member is used to set the sibling window for stacking operations.
+The stack_mode member is used to set how the window is to be restacked 
+and can be set to
+<symbol>Above</symbol>,
+<symbol>Below</symbol>,
+<symbol>TopIf</symbol>,
+<symbol>BottomIf</symbol>,
+or 
+<symbol>Opposite</symbol>.
+</para>
+<para>
+<!-- .LP -->
+If the override-redirect flag of the window is
+<symbol>False</symbol>
+and if some other client has selected
+<symbol>SubstructureRedirectMask</symbol>
+on the parent, the X server generates a
+<symbol>ConfigureRequest</symbol>
+event, and no further processing is performed.
+Otherwise, 
+if some other client has selected 
+<symbol>ResizeRedirectMask</symbol>
+on the window and the inside
+width or height of the window is being changed,
+a 
+<symbol>ResizeRequest</symbol>
+event is generated, and the current inside width and height are
+used instead.
+Note that the override-redirect flag of the window has no effect
+on
+<symbol>ResizeRedirectMask</symbol>
+and that
+<symbol>SubstructureRedirectMask</symbol>
+on the parent has precedence over
+<symbol>ResizeRedirectMask</symbol>
+on the window.
+</para>
+<para>
+<!-- .LP -->
+When the geometry of the window is changed as specified, 
+the window is restacked among siblings, and a
+<symbol>ConfigureNotify</symbol>
+event is generated if the state of the window actually changes.
+<symbol>GravityNotify</symbol>
+events are generated after 
+<symbol>ConfigureNotify</symbol>
+events.
+If the inside width or height of the window has actually changed, 
+children of the window are affected as specified.
+</para>
+<para>
+<!-- .LP -->
+If a window's size actually changes,
+the window's subwindows move according to their window gravity.
+Depending on the window's bit gravity,
+the contents of the window also may be moved
+(see <link linkend="Gravity_Attributes">section 3.2.3</link>).
+</para>
+<para>
+<!-- .LP -->
+If regions of the window were obscured but now are not,
+exposure processing is performed on these formerly obscured windows, 
+including the window itself and its inferiors. 
+As a result of increasing the width or height,
+exposure processing is also performed on any new regions of the window 
+and any regions where window contents are lost.
+</para>
+<para>
+<!-- .LP -->
+The restack check (specifically, the computation for 
+<symbol>BottomIf</symbol>,
+<symbol>TopIf</symbol>,
+and 
+<symbol>Opposite</symbol>)
+is performed with respect to the window's final size and position (as
+controlled by the other arguments of the request), not its initial position.
+If a sibling is specified without a stack_mode,
+a
+<errorname>BadMatch</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+If a sibling and a stack_mode are specified, 
+the window is restacked as follows:
+</para>
+<informaltable  frame="none">
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='3.0*'/>
+  <tbody>
+    <row>
+      <entry><symbol>Above</symbol></entry>
+      <entry>The window is placed just above the sibling.</entry>
+    </row>
+    <row>
+      <entry><symbol>Below</symbol></entry>
+      <entry>The window is placed just below the sibling.</entry>
+    </row>
+    <row>
+      <entry><symbol>TopIf</symbol></entry>
+      <entry>If the sibling occludes the window, the window is placed at the top of the stack.</entry>
+    </row>
+    <row>
+      <entry><symbol>BottomIf</symbol></entry>
+      <entry>If the window occludes the sibling, the window is placed at the bottom of the stack.</entry>
+    </row>
+    <row>
+      <entry><symbol>Opposite</symbol></entry>
+      <entry>
+If the sibling occludes the window, the window is placed at the top of the stack.
+If the window occludes the sibling,
+the window is placed at the bottom of the stack.
+      </entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+<!-- .LP -->
+If a stack_mode is specified but no sibling is specified,
+the window is restacked as follows:
+</para>
+
+<informaltable  frame="none">
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='3.0*'/>
+  <tbody>
+    <row>
+      <entry><symbol>Above</symbol></entry>
+      <entry>The window is placed at the top of the stack.</entry>
+    </row>
+    <row>
+      <entry><symbol>Below</symbol></entry>
+      <entry>The window is placed at the bottom of the stack.</entry>
+    </row>
+    <row>
+      <entry><symbol>TopIf</symbol></entry>
+      <entry>
+If any sibling occludes the window, the window is placed at
+the top of the stack.
+      </entry>
+    </row>
+    <row>
+      <entry><symbol>BottomIf</symbol></entry>
+      <entry>
+If the window occludes any sibling, the window is placed at
+the bottom of the stack.
+      </entry>
+    </row>
+    <row>
+      <entry><symbol>Opposite</symbol></entry>
+      <entry>
+If any sibling occludes the window, the window
+is placed at the top of the stack.
+If the window occludes any sibling,
+the window is placed at the bottom of the stack.
+      </entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+<!-- .LP -->
+Attempts to configure a root window have no effect.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To configure a window's size, location, stacking, or border, use
+<xref linkend='XConfigureWindow' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XConfigureWindow</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XConfigureWindow'>
+<funcprototype>
+  <funcdef><function>XConfigureWindow</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>unsignedint<parameter> value_mask</parameter></paramdef>
+  <paramdef>XWindowChanges<parameter> *values</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Wi to be reconfigured -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window (Wi.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>value_mask</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies which values are to be set using information in
+the values structure.
+This mask is the bitwise inclusive OR of the valid configure window values bits.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>values</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the 
+<structname>XWindowChanges</structname>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XConfigureWindow' xrefstyle='select: title'/>
+function uses the values specified in the
+<structname>XWindowChanges</structname>
+structure to reconfigure a window's size, position, border, and stacking order.
+Values not specified are taken from the existing geometry of the window.
+</para>
+<para>
+<!-- .LP -->
+If a sibling is specified without a stack_mode or if the window
+is not actually a sibling,
+a
+<errorname>BadMatch</errorname>
+error results. 
+Note that the computations for
+<symbol>BottomIf</symbol>,
+<symbol>TopIf</symbol>,
+and
+<symbol>Opposite</symbol>
+are performed with respect to the window's final geometry (as controlled by the
+other arguments passed to
+<xref linkend='XConfigureWindow' xrefstyle='select: title'/>),
+not its initial geometry.
+Any backing store contents of the window, its
+inferiors, and other newly visible windows are either discarded or
+changed to reflect the current screen contents 
+(depending on the implementation).
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XConfigureWindow' xrefstyle='select: title'/>
+can generate
+<errorname>BadMatch</errorname>,
+<errorname>BadValue</errorname>,
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To move a window without changing its size, use 
+<xref linkend='XMoveWindow' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XMoveWindow</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XMoveWindow'>
+<funcprototype>
+  <funcdef><function>XMoveWindow</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>intx,<parameter> y</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN      -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Wi to be moved -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window (Wi.
+<!-- .ds Xy , which define the new location of the top-left pixel \ -->
+of the window's border or the window itself if it has no border
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates(Xy.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XMoveWindow' xrefstyle='select: title'/>
+function moves the specified window to the specified x and y coordinates,
+but it does not change the window's size, raise the window, or
+change the mapping state of the window.
+Moving a mapped window may or may not lose the window's contents 
+depending on if the window is obscured by nonchildren 
+and if no backing store exists.
+If the contents of the window are lost, 
+the X server generates
+<symbol>Expose</symbol>
+events.
+Moving a mapped window generates
+<symbol>Expose</symbol>
+events on any formerly obscured windows. 
+</para>
+<para>
+<!-- .LP -->
+If the override-redirect flag of the window is 
+<symbol>False</symbol>
+and some
+other client has selected 
+<symbol>SubstructureRedirectMask</symbol>
+on the parent, the X server generates a
+<symbol>ConfigureRequest</symbol>
+event, and no further processing is
+performed.  
+Otherwise, the window is moved.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XMoveWindow' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To change a window's size without changing the upper-left coordinate, use 
+<xref linkend='XResizeWindow' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XResizeWindow</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XResizeWindow'>
+<funcprototype>
+  <funcdef><function>XResizeWindow</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>unsignedintwidth,<parameter> height</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+<!-- .ds Wh , which are the interior dimensions of the window \ -->
+after the call completes
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the width and height(Wh.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XResizeWindow' xrefstyle='select: title'/>
+function changes the inside dimensions of the specified window, not including
+its borders.
+This function does not change the window's upper-left coordinate or
+the origin and does not restack the window.
+Changing the size of a mapped window may lose its contents and generate
+<symbol>Expose</symbol>
+events.
+If a mapped window is made smaller, 
+changing its size generates
+<symbol>Expose</symbol>
+events on windows that the mapped window formerly obscured.
+</para>
+<para>
+<!-- .LP -->
+If the override-redirect flag of the window is 
+<symbol>False</symbol>
+and some
+other client has selected 
+<symbol>SubstructureRedirectMask</symbol>
+on the parent, the X server generates a
+<symbol>ConfigureRequest</symbol>
+event, and no further processing is performed.  
+If either width or height is zero,
+a
+<errorname>BadValue</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XResizeWindow' xrefstyle='select: title'/>
+can generate
+<errorname>BadValue</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To change the size and location of a window, use 
+<xref linkend='XMoveResizeWindow' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XMoveResizeWindow</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XMoveResizeWindow'>
+<funcprototype>
+  <funcdef><function>XMoveResizeWindow</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>intx,<parameter> y</parameter></paramdef>
+  <paramdef>unsignedintwidth,<parameter> height</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Wi to be reconfigured -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window (Wi.
+<!-- .ds Xy , which define the new position of the window relative to its parent -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates(Xy.
+<!-- .ds Wh , which define the interior size of the window -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the width and height(Wh.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XMoveResizeWindow' xrefstyle='select: title'/>
+function changes the size and location of the specified window 
+without raising it.
+Moving and resizing a mapped window may generate an
+<symbol>Expose</symbol>
+event on the window.
+Depending on the new size and location parameters,
+moving and resizing a window may generate 
+<symbol>Expose</symbol>
+events on windows that the window formerly obscured. 
+</para>
+<para>
+<!-- .LP -->
+If the override-redirect flag of the window is 
+<symbol>False</symbol>
+and some
+other client has selected 
+<symbol>SubstructureRedirectMask</symbol>
+on the parent, the X server generates a
+<symbol>ConfigureRequest</symbol>
+event, and no further processing is performed.  
+Otherwise, the window size and location are changed.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XMoveResizeWindow' xrefstyle='select: title'/>
+can generate
+<errorname>BadValue</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To change the border width of a given window, use
+<xref linkend='XSetWindowBorderWidth' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetWindowBorderWidth</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetWindowBorderWidth'>
+<funcprototype>
+  <funcdef><function>XSetWindowBorderWidth</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>unsignedint<parameter> width</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the width of the window border.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetWindowBorderWidth' xrefstyle='select: title'/>
+function sets the specified window's border width to the specified width.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetWindowBorderWidth' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+</sect1>
+<sect1 id="Changing_Window_Stacking_Order">
+<title>Changing Window Stacking Order</title>
+<!-- .XS -->
+<!-- (SN Changing Window Stacking Order  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+</para>
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to raise, lower, circulate,
+or restack windows.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To raise a window so that no sibling window obscures it, use 
+<xref linkend='XRaiseWindow' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XRaiseWindow</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XRaiseWindow'>
+<funcprototype>
+  <funcdef><function>XRaiseWindow</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XRaiseWindow' xrefstyle='select: title'/>
+function
+raises the specified window to the top of the stack so that no sibling window
+obscures it.
+If the windows are regarded as overlapping sheets of paper stacked 
+on a desk,
+then raising a window is analogous to moving the sheet to the top of
+the stack but leaving its x and y location on the desk constant.
+Raising a mapped window may generate 
+<symbol>Expose</symbol>
+events for the window and any mapped subwindows that were formerly obscured.  
+</para>
+<para>
+<!-- .LP -->
+If the override-redirect attribute of the window is 
+<symbol>False</symbol>
+and some
+other client has selected 
+<symbol>SubstructureRedirectMask</symbol>
+on the parent, the X server generates a
+<symbol>ConfigureRequest</symbol>
+event, and no processing is performed.
+Otherwise, the window is raised.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XRaiseWindow' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To lower a window so that it does not obscure any sibling windows, use 
+<xref linkend='XLowerWindow' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XLowerWindow</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XLowerWindow'>
+<funcprototype>
+  <funcdef><function>XLowerWindow</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XLowerWindow' xrefstyle='select: title'/>
+function lowers the specified window to the bottom of the stack
+so that it does not obscure any sibling
+windows.
+If the windows are regarded as overlapping sheets of paper
+stacked on a desk, then lowering a window is analogous to moving the
+sheet to the bottom of the stack but leaving its x and y location on
+the desk constant.
+Lowering a mapped window will generate 
+<symbol>Expose</symbol>
+events on any windows it formerly obscured.
+</para>
+<para>
+<!-- .LP -->
+If the override-redirect attribute of the window is 
+<symbol>False</symbol>
+and some
+other client has selected 
+<symbol>SubstructureRedirectMask</symbol>
+on the parent, the X server generates a
+<symbol>ConfigureRequest</symbol>
+event, and no processing is performed.  
+Otherwise, the window is lowered to the bottom of the
+stack.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XLowerWindow' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To circulate a subwindow up or down, use
+<xref linkend='XCirculateSubwindows' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XCirculateSubwindows</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XCirculateSubwindows'>
+<funcprototype>
+  <funcdef><function>XCirculateSubwindows</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>int<parameter> direction</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>direction</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the direction (up or down) that you want to circulate
+the window. 
+You can pass 
+<symbol>RaiseLowest</symbol>
+or
+<symbol>LowerHighest</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XCirculateSubwindows' xrefstyle='select: title'/>
+function circulates children of the specified window in the specified 
+direction.
+If you specify
+<symbol>RaiseLowest</symbol>,
+<xref linkend='XCirculateSubwindows' xrefstyle='select: title'/>
+raises the lowest mapped child (if any) that is occluded 
+by another child to the top of the stack.
+If you specify
+<symbol>LowerHighest</symbol>,
+<xref linkend='XCirculateSubwindows' xrefstyle='select: title'/>
+lowers the highest mapped child (if any) that occludes another child
+to the bottom of the stack.
+Exposure processing is then performed on formerly obscured windows.
+If some other client has selected 
+<symbol>SubstructureRedirectMask</symbol>
+on the window, the X server generates a 
+<symbol>CirculateRequest</symbol>
+event, and no further processing is performed.
+If a child is actually restacked,
+the X server generates a
+<symbol>CirculateNotify</symbol>
+event. 
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XCirculateSubwindows' xrefstyle='select: title'/>
+can generate
+<errorname>BadValue</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To raise the lowest mapped child of a window that is partially or completely
+occluded by another child, use
+<xref linkend='XCirculateSubwindowsUp' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XCirculateSubwindowsUp</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XCirculateSubwindowsUp'>
+<funcprototype>
+  <funcdef><function>XCirculateSubwindowsUp</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XCirculateSubwindowsUp' xrefstyle='select: title'/>
+function raises the lowest mapped child of the specified window that
+is partially
+or completely
+occluded by another child.
+Completely unobscured children are not affected.
+This is a convenience function equivalent to
+<xref linkend='XCirculateSubwindows' xrefstyle='select: title'/>
+with
+<symbol>RaiseLowest</symbol>
+specified.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XCirculateSubwindowsUp' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To lower the highest mapped child of a window that partially or 
+completely occludes another child, use 
+<xref linkend='XCirculateSubwindowsDown' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XCirculateSubwindowsDown</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XCirculateSubwindowsDown'>
+<funcprototype>
+  <funcdef><function>XCirculateSubwindowsDown</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XCirculateSubwindowsDown' xrefstyle='select: title'/>
+function lowers the highest mapped child of the specified window that partially
+or completely occludes another child.
+Completely unobscured children are not affected.
+This is a convenience function equivalent to
+<xref linkend='XCirculateSubwindows' xrefstyle='select: title'/>
+with
+<symbol>LowerHighest</symbol>
+specified.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XCirculateSubwindowsDown' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To restack a set of windows from top to bottom, use 
+<xref linkend='XRestackWindows' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XRestackWindows</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XRestackWindows'>
+<funcprototype>
+  <funcdef><function>XRestackWindows</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> windows[]</parameter></paramdef>
+  <paramdef>int<parameter> nwindows</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>windows</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies an array containing the windows to be restacked.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nwindows</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of windows to be restacked.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XRestackWindows' xrefstyle='select: title'/>
+function restacks the windows in the order specified,
+from top to bottom.
+The stacking order of the first window in the windows array is unaffected,
+but the other windows in the array are stacked underneath the first window,
+in the order of the array.
+The stacking order of the other windows is not affected.
+For each window in the window array that is not a child of the specified window,
+a
+<errorname>BadMatch</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+If the override-redirect attribute of a window is 
+<symbol>False</symbol>
+and some
+other client has selected 
+<symbol>SubstructureRedirectMask</symbol>
+on the parent, the X server generates 
+<symbol>ConfigureRequest</symbol>
+events for each window whose override-redirect flag is not set, 
+and no further processing is performed.
+Otherwise, the windows will be restacked in top-to-bottom order.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XRestackWindows' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+</sect1>
+<sect1 id="Changing_Window_Attributes">
+<title>Changing Window Attributes</title>
+<!-- .XS -->
+<!-- (SN Changing Window Attributes  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+</para>
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to set window attributes.
+<xref linkend='XChangeWindowAttributes' xrefstyle='select: title'/>
+is the more general function that allows you to set one or more window
+attributes provided by the
+<structname>XSetWindowAttributes</structname>
+structure.
+The other functions described in this section allow you to set one specific
+window attribute, such as a window's background.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To change one or more attributes for a given window, use
+<xref linkend='XChangeWindowAttributes' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XChangeWindowAttributes</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XChangeWindowAttributes'>
+<funcprototype>
+  <funcdef><function>XChangeWindowAttributes</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> valuemask</parameter></paramdef>
+  <paramdef>XSetWindowAttributes<parameter> *attributes</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>valuemask</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies which window attributes are defined in the attributes
+argument.
+This mask is the bitwise inclusive OR of the valid attribute mask bits.
+If valuemask is zero,
+the attributes are ignored and are not referenced.
+The values and restrictions are
+the same as for
+<xref linkend='XCreateWindow' xrefstyle='select: title'/>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      
+    </term>
+    <listitem>
+      <para>
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>attributes</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the structure from which the values (as specified by the value mask)
+are to be taken.
+The value mask should have the appropriate bits
+set to indicate which attributes have been set in the structure 
+(see <link linkend="Window_Attributes">section 3.2</link>).
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+Depending on the valuemask,
+the
+<xref linkend='XChangeWindowAttributes' xrefstyle='select: title'/>
+function uses the window attributes in the
+<structname>XSetWindowAttributes</structname>
+structure to change the specified window attributes.
+Changing the background does not cause the window contents to be
+changed.
+To repaint the window and its background, use 
+<xref linkend='XClearWindow' xrefstyle='select: title'/>.
+Setting the border or changing the background such that the
+border tile origin changes causes the border to be repainted.
+Changing the background of a root window to 
+<symbol>None</symbol>
+or 
+<symbol>ParentRelative</symbol>
+restores the default background pixmap.
+Changing the border of a root window to
+<symbol>CopyFromParent</symbol>
+restores the default border pixmap.
+Changing the win-gravity does not affect the current position of the
+window.
+Changing the backing-store of an obscured window to 
+<symbol>WhenMapped</symbol>
+or
+<symbol>Always</symbol>,
+or changing the backing-planes, backing-pixel, or
+save-under of a mapped window may have no immediate effect.
+Changing the colormap of a window (that is, defining a new map, not
+changing the contents of the existing map) generates a 
+<symbol>ColormapNotify</symbol>
+event.
+Changing the colormap of a visible window may have no
+immediate effect on the screen because the map may not be installed
+(see
+<xref linkend='XInstallColormap' xrefstyle='select: title'/>).
+Changing the cursor of a root window to 
+<symbol>None</symbol>
+restores the default
+cursor.
+Whenever possible, you are encouraged to share colormaps.
+</para>
+<para>
+<!-- .LP -->
+Multiple clients can select input on the same window. 
+Their event masks are maintained separately.
+When an event is generated, 
+it is reported to all interested clients. 
+However, only one client at a time can select for 
+<symbol>SubstructureRedirectMask</symbol>,
+<symbol>ResizeRedirectMask</symbol>,
+and
+<symbol>ButtonPressMask</symbol>.
+If a client attempts to select any of these event masks 
+and some other client has already selected one, 
+a
+<errorname>BadAccess</errorname>
+error results.
+There is only one do-not-propagate-mask for a window, 
+not one per client.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XChangeWindowAttributes' xrefstyle='select: title'/>
+can generate
+<errorname>BadAccess</errorname>,
+<errorname>BadColor</errorname>,
+<errorname>BadCursor</errorname>,
+<errorname>BadMatch</errorname>,
+<errorname>BadPixmap</errorname>,
+<errorname>BadValue</errorname>,
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set the background of a window to a given pixel, use 
+<xref linkend='XSetWindowBackground' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetWindowBackground</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetWindowBackground'>
+<funcprototype>
+  <funcdef><function>XSetWindowBackground</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> background_pixel</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>background_pixel</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the pixel that is to be used for the background.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetWindowBackground' xrefstyle='select: title'/>
+function sets the background of the window to the specified pixel value.
+Changing the background does not cause the window contents to be changed.
+<xref linkend='XSetWindowBackground' xrefstyle='select: title'/>
+uses a pixmap of undefined size filled with the pixel value you passed.
+If you try to change the background of an 
+<symbol>InputOnly</symbol>
+window, a
+<errorname>BadMatch</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetWindowBackground' xrefstyle='select: title'/>
+can generate
+<errorname>BadMatch</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To set the background of a window to a given pixmap, use 
+<xref linkend='XSetWindowBackgroundPixmap' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Window</primary><secondary>background</secondary></indexterm>
+<indexterm significance="preferred"><primary>XSetWindowBackgroundPixmap</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetWindowBackgroundPixmap'>
+<funcprototype>
+  <funcdef><function>XSetWindowBackgroundPixmap</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>Pixmap<parameter> background_pixmap</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>background_pixmap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the background pixmap,
+<symbol>ParentRelative</symbol>,
+or
+<symbol>None</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm><primary>Resource IDs</primary><secondary>freeing</secondary></indexterm>
+<indexterm><primary>Freeing</primary><secondary>resources</secondary></indexterm>
+The
+<xref linkend='XSetWindowBackgroundPixmap' xrefstyle='select: title'/>
+function sets the background pixmap of the window to the specified pixmap.
+The background pixmap can immediately be freed if no further explicit
+references to it are to be made.
+If 
+<symbol>ParentRelative</symbol>
+is specified, 
+the background pixmap of the window's parent is used,
+or on the root window, the default background is restored.
+If you try to change the background of an 
+<symbol>InputOnly</symbol>
+window, a
+<errorname>BadMatch</errorname>
+error results.
+If the background is set to
+<symbol>None</symbol>,
+the window has no defined background.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetWindowBackgroundPixmap' xrefstyle='select: title'/>
+can generate
+<errorname>BadMatch</errorname>,
+<errorname>BadPixmap</errorname>,
+and 
+<errorname>BadWindow</errorname>
+errors.
+<!-- .NT Note -->
+<xref linkend='XSetWindowBackground' xrefstyle='select: title'/>
+and
+<xref linkend='XSetWindowBackgroundPixmap' xrefstyle='select: title'/>
+do not change the current contents of the window.
+<!-- .NE -->
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To change and repaint a window's border to a given pixel, use 
+<xref linkend='XSetWindowBorder' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetWindowBorder</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetWindowBorder'>
+<funcprototype>
+  <funcdef><function>XSetWindowBorder</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> border_pixel</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>border_pixel</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the entry in the colormap. 
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetWindowBorder' xrefstyle='select: title'/>
+function sets the border of the window to the pixel value you specify.
+If you attempt to perform this on an
+<symbol>InputOnly</symbol>
+window, a
+<errorname>BadMatch</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetWindowBorder' xrefstyle='select: title'/>
+can generate
+<errorname>BadMatch</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To change and repaint the border tile of a given window, use 
+<xref linkend='XSetWindowBorderPixmap' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetWindowBorderPixmap</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetWindowBorderPixmap'>
+<funcprototype>
+  <funcdef><function>XSetWindowBorderPixmap</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>Pixmap<parameter> border_pixmap</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>border_pixmap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the border pixmap or
+<symbol>CopyFromParent</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetWindowBorderPixmap' xrefstyle='select: title'/>
+function sets the border pixmap of the window to the pixmap you specify.
+The border pixmap can be freed immediately if no further explicit
+references to it are to be made.
+If you specify
+<symbol>CopyFromParent</symbol>,
+a copy of the parent window's border pixmap is used.
+If you attempt to perform this on an
+<symbol>InputOnly</symbol>
+window, a
+<errorname>BadMatch</errorname>
+error results.
+<indexterm><primary>Resource IDs</primary><secondary>freeing</secondary></indexterm>
+<indexterm><primary>Freeing</primary><secondary>resources</secondary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetWindowBorderPixmap' xrefstyle='select: title'/>
+can generate
+<errorname>BadMatch</errorname>,
+<errorname>BadPixmap</errorname>,
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set the colormap of a given window, use
+<xref linkend='XSetWindowColormap' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetWindowColormap</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetWindowColormap'>
+<funcprototype>
+  <funcdef><function>XSetWindowColormap</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>Colormap<parameter> colormap</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colormap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the colormap.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetWindowColormap' xrefstyle='select: title'/>
+function sets the specified colormap of the specified window.
+The colormap must have the same visual type as the window,
+or a
+<errorname>BadMatch</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetWindowColormap' xrefstyle='select: title'/>
+can generate
+<errorname>BadColor</errorname>,
+<errorname>BadMatch</errorname>,
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To define which cursor will be used in a window, use
+<xref linkend='XDefineCursor' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Window</primary><secondary>defining the cursor</secondary></indexterm>
+<indexterm significance="preferred"><primary>XDefineCursor</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDefineCursor'>
+<funcprototype>
+  <funcdef><function>XDefineCursor</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>Cursor<parameter> cursor</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>cursor</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the cursor that is to be displayed or
+<symbol>None</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+If a cursor is set, it will be used when the pointer is in the window.
+If the cursor is
+<symbol>None</symbol>,
+it is equivalent to
+<xref linkend='XUndefineCursor' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XDefineCursor' xrefstyle='select: title'/>
+can generate
+<errorname>BadCursor</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To undefine the cursor in a given window, use
+<xref linkend='XUndefineCursor' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Window</primary><secondary>undefining the cursor</secondary></indexterm>
+<indexterm significance="preferred"><primary>XUndefineCursor</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XUndefineCursor'>
+<funcprototype>
+  <funcdef><function>XUndefineCursor</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XUndefineCursor' xrefstyle='select: title'/>
+function undoes the effect of a previous
+<xref linkend='XDefineCursor' xrefstyle='select: title'/>
+for this window.
+When the pointer is in the window,
+the parent's cursor will now be used.
+On the root window,
+the default cursor is restored.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XUndefineCursor' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+<!-- .bp -->
+
+</para>
+</sect1>
+</chapter>
diff --git a/specs/libX11/CH04.xml b/specs/libX11/CH04.xml
new file mode 100644 (file)
index 0000000..9cdfd1a
--- /dev/null
@@ -0,0 +1,2508 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+         "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
+<chapter id='Window_Information_Functions'>
+<title>Window Information Functions</title>
+
+<para>
+After you connect the display to the X server and create a window, you can use the Xlib window
+information functions to:
+</para>
+<itemizedlist>
+  <listitem><para>Obtain information about a window</para></listitem>
+  <listitem><para>Translate screen coordinates</para></listitem>
+  <listitem><para>Manipulate property lists</para></listitem>
+  <listitem><para>Obtain and change window properties</para></listitem>
+  <listitem><para>Manipulate selections</para></listitem>
+</itemizedlist>
+
+<sect1 id="Obtaining_Window_Information">
+<title>Obtaining Window Information</title>
+<!-- .XS -->
+<!-- (SN Obtaining Window Information  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to obtain information about 
+the window tree, the window's current attributes, 
+the window's current geometry, or the current pointer coordinates.
+Because they are most frequently used by window managers,
+these functions all return a status to indicate whether the window still
+exists.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain the parent, a list of children, and number of children for 
+a given window, use 
+<xref linkend='XQueryTree' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Child Window</primary></indexterm>
+<indexterm><primary>Parent Window</primary></indexterm>
+<indexterm significance="preferred"><primary>XQueryTree</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XQueryTree'>
+<funcprototype>
+  <funcdef>Status <function>XQueryTree</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>Window<parameter> *root_return</parameter></paramdef>
+  <paramdef>Window<parameter> *parent_return</parameter></paramdef>
+  <paramdef>Window<parameter> **children_return</parameter></paramdef>
+  <paramdef>unsignedint<parameter> *nchildren_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Wi whose list of children, root, parent, and number of children \ -->
+you want to obtain
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window (Wi.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>root_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the root window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>parent_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the parent window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>children_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the list of children.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nchildren_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the number of children.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XQueryTree' xrefstyle='select: title'/>
+function returns the root ID, the parent window ID, 
+a pointer to the list of children windows
+(NULL when there are no children), 
+and the number of children in the list for the specified window.
+The children are listed in current stacking order, from bottom-most 
+(first) to top-most (last).
+<xref linkend='XQueryTree' xrefstyle='select: title'/>
+returns zero if it fails and nonzero if it succeeds.
+To free a non-NULL children list when it is no longer needed, use 
+<xref linkend='XFree' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XQueryTree' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain the current attributes of a given window, use 
+<xref linkend='XGetWindowAttributes' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetWindowAttributes</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetWindowAttributes'>
+<funcprototype>
+  <funcdef>Status <function>XGetWindowAttributes</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>XWindowAttributes<parameter> *window_attributes_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Wi whose current attributes you want to obtain -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window (Wi.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>window_attributes_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the specified window's attributes in the
+<structname>XWindowAttributes</structname>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetWindowAttributes' xrefstyle='select: title'/>
+function returns the current attributes for the specified window to an
+<structname>XWindowAttributes</structname>
+structure.
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XWindowAttributes</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     int x, y;                     /* location of window */
+     int width, height;            /* width and height of window */
+     int border_width;             /* border width of window */
+     int depth;                    /* depth of window */
+     Visual *visual;               /* the associated visual structure */
+     Window root;                  /* root of screen containing window */
+     int class;                    /* InputOutput, InputOnly*/
+     int bit_gravity;              /* one of the bit gravity values */
+     int win_gravity;              /* one of the window gravity values */
+     int backing_store;            /* NotUseful, WhenMapped, Always */
+     unsigned long backing_planes; /* planes to be preserved if possible */
+     unsigned long backing_pixel;  /* value to be used when restoring planes */
+     Bool save_under;              /* boolean, should bits under be saved? */
+     Colormap colormap;            /* color map to be associated with window */
+     Bool map_installed;           /* boolean, is color map currently installed*/
+     int map_state;                /* IsUnmapped, IsUnviewable, IsViewable */
+     long all_event_masks;         /* set of events all people have interest in*/
+     long your_event_mask;         /* my event mask */
+     long do_not_propagate_mask;   /* set of events that should not propagate */
+     Bool override_redirect;       /* boolean value for override-redirect */
+     Screen *screen;               /* back pointer to correct screen */
+} XWindowAttributes;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The x and y members are set to the upper-left outer
+corner relative to the parent window's origin.
+The width and height members are set to the inside size of the window, 
+not including the border.
+The border_width member is set to the window's border width in pixels.
+The depth member is set to the depth of the window 
+(that is, bits per pixel for the object).
+The visual member is a pointer to the screen's associated
+<structname>Visual</structname>
+structure.
+The root member is set to the root window of the screen containing the window.
+The class member is set to the window's class and can be either
+<symbol>InputOutput</symbol>
+or
+<symbol>InputOnly</symbol>.
+</para>
+<para>
+<!-- .LP -->
+The bit_gravity member is set to the window's bit gravity
+and can be one of the following:
+  <simplelist type="vert" columns="2">
+    <member><symbol>ForgetGravity</symbol></member>
+    <member><symbol>NorthWestGravity</symbol></member>
+    <member><symbol>NorthGravity</symbol></member>
+    <member><symbol>NorthEastGravity</symbol></member>
+    <member><symbol>WestGravity</symbol></member>
+
+    <member><symbol>EastGravity</symbol></member>
+    <member><symbol>SouthWestGravity</symbol></member>
+    <member><symbol>SouthGravity</symbol></member>
+    <member><symbol>SouthEastGravity</symbol></member>
+    <member><symbol>StaticGravity</symbol></member>
+  </simplelist>
+</para>
+<para>
+The win_gravity member is set to the window's window gravity
+and can be one of the following:
+  <simplelist type="vert" columns="2">
+    <member><symbol>UnmapGravity</symbol></member>
+    <member><symbol>NorthWestGravity</symbol></member>
+    <member><symbol>NorthGravity</symbol></member>
+    <member><symbol>NorthEastGravity</symbol></member>
+    <member><symbol>WestGravity</symbol></member>
+
+    <member><symbol>EastGravity</symbol></member>
+    <member><symbol>SouthWestGravity</symbol></member>
+    <member><symbol>SouthGravity</symbol></member>
+    <member><symbol>SouthEastGravity</symbol></member>
+    <member><symbol>StaticGravity</symbol></member>
+    <member><symbol>CenterGravity</symbol></member>
+  </simplelist>
+</para>
+<para>
+<!-- .LP -->
+For additional information on gravity,
+see <link linkend="Gravity_Attributes">section 3.2.3</link>.
+</para>
+<para>
+<!-- .LP -->
+The backing_store member is set to indicate how the X server should maintain
+the contents of a window 
+and can be 
+<symbol>WhenMapped</symbol>,
+<symbol>Always</symbol>,
+or
+<symbol>NotUseful</symbol>.
+The backing_planes member is set to indicate (with bits set to 1) which bit 
+planes of the window hold dynamic data that must be preserved in backing_stores 
+and during save_unders.
+The backing_pixel member is set to indicate what values to use 
+for planes not set in backing_planes.
+</para>
+<para>
+<!-- .LP -->
+The save_under member is set to 
+<symbol>True</symbol>
+or
+<symbol>False</symbol>.
+The colormap member is set to the colormap for the specified window and can be
+a colormap ID or 
+<symbol>None</symbol>.
+The map_installed member is set to indicate whether the colormap is 
+currently installed and can be 
+<symbol>True</symbol>
+or
+<symbol>False</symbol>.
+The map_state member is set to indicate the state of the window and can be
+<symbol>IsUnmapped</symbol>,
+<symbol>IsUnviewable</symbol>,
+or
+<symbol>IsViewable</symbol>.
+<symbol>IsUnviewable</symbol>
+is used if the window is mapped but some ancestor is unmapped.
+</para>
+<para>
+<!-- .LP -->
+The all_event_masks member is set to the bitwise inclusive OR of all event 
+masks selected on the window by all clients.
+The your_event_mask member is set to the bitwise inclusive OR of all event 
+masks selected by the querying client.
+The do_not_propagate_mask member is set to the bitwise inclusive OR of the 
+set of events that should not propagate.
+</para>
+<para>
+<!-- .LP -->
+The override_redirect member is set to indicate whether this window overrides
+structure control facilities and can be 
+<symbol>True</symbol>
+or
+<symbol>False</symbol>.
+Window manager clients should ignore the window if this member is
+<symbol>True</symbol>.
+</para>
+<para>
+<!-- .LP -->
+The screen member is set to a screen pointer that gives you a back pointer 
+to the correct screen.
+This makes it easier to obtain the screen information without
+having to loop over the root window fields to see which field matches.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGetWindowAttributes' xrefstyle='select: title'/>
+can generate
+<errorname>BadDrawable</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain the current geometry of a given drawable, use 
+<xref linkend='XGetGeometry' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetGeometry</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetGeometry'>
+<funcprototype>
+  <funcdef>Status <function>XGetGeometry</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>Window<parameter> *root_return</parameter></paramdef>
+  <paramdef>int*x_return,<parameter> *y_return</parameter></paramdef>
+  <paramdef>unsignedint*width_return,<parameter> *height_return</parameter></paramdef>
+  <paramdef>unsignedint<parameter> *border_width_return</parameter></paramdef>
+  <paramdef>unsignedint<parameter> *depth_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Dr , which can be a window or a pixmap -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable(Dr. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>root_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the root window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Return the x and y coordinates that define the location of the drawable.
+For a window, 
+these coordinates specify the upper-left outer corner relative to
+its parent's origin.
+For pixmaps, these coordinates are always zero.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Return the drawable's dimensions (width and height).
+For a window, 
+these dimensions specify the inside size, not including the border.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>border_width_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the border width in pixels. 
+If the drawable is a pixmap, it returns zero.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>depth_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the depth of the drawable (bits per pixel for the object).
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetGeometry' xrefstyle='select: title'/>
+function returns the root window and the current geometry of the drawable.
+The geometry of the drawable includes the x and y coordinates, width and height,
+border width, and depth.
+These are described in the argument list.
+It is legal to pass to this function a window whose class is
+<symbol>InputOnly</symbol>.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGetGeometry' xrefstyle='select: title'/>
+can generate a
+<errorname>BadDrawable</errorname>
+error.
+</para>
+</sect1>
+<sect1 id="Translating_Screen_Coordinates">
+<title>Translating Screen Coordinates</title>
+<!-- .XS -->
+<!-- (SN Translating Screen Coordinates  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Applications sometimes
+need to perform a coordinate transformation from the coordinate
+space of one window to another window or need to determine which
+window the pointing device is in.
+<xref linkend='XTranslateCoordinates' xrefstyle='select: title'/>
+and
+<xref linkend='XQueryPointer' xrefstyle='select: title'/>
+fulfill these needs (and avoid any race conditions) by
+asking the X server to perform these operations.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To translate a coordinate in one window to the coordinate
+space of another window, use
+<xref linkend='XTranslateCoordinates' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XTranslateCoordinates</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XTranslateCoordinates'>
+<funcprototype>
+  <funcdef>Bool <function>XTranslateCoordinates</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Windowsrc_w,<parameter> dest_w</parameter></paramdef>
+  <paramdef>intsrc_x,<parameter> src_y</parameter></paramdef>
+  <paramdef>int*dest_x_return,<parameter> *dest_y_return</parameter></paramdef>
+  <paramdef>Window<parameter> *child_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>src_w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the source window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dest_w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the destination window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>src_x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>src_y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates within the source window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dest_x_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dest_y_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Return the x and y coordinates within the destination window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>child_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the child if the coordinates are contained in a mapped child of the
+destination window.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+If
+<xref linkend='XTranslateCoordinates' xrefstyle='select: title'/>
+returns
+<symbol>True</symbol>,
+it takes the src_x and src_y coordinates relative
+to the source window's origin and returns these coordinates to 
+dest_x_return and dest_y_return
+relative to the destination window's origin.
+If
+<xref linkend='XTranslateCoordinates' xrefstyle='select: title'/>
+returns 
+<symbol>False</symbol>,
+src_w and dest_w are on different screens,
+and dest_x_return and dest_y_return are zero.
+If the coordinates are contained in a mapped child of dest_w,
+that child is returned to child_return.
+Otherwise, child_return is set to
+<symbol>None</symbol>.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XTranslateCoordinates' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain the screen coordinates of the pointer
+or to determine the pointer coordinates relative to a specified window, use 
+<xref linkend='XQueryPointer' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XQueryPointer</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XQueryPointer'>
+<funcprototype>
+  <funcdef>Bool <function>XQueryPointer</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>Window*root_return,<parameter> *child_return</parameter></paramdef>
+  <paramdef>int*root_x_return,<parameter> *root_y_return</parameter></paramdef>
+  <paramdef>int*win_x_return,<parameter> *win_y_return</parameter></paramdef>
+  <paramdef>unsignedint<parameter> *mask_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+<!-- .ds Ro that the pointer is in -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>root_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the root window (Ro.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>child_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the child window that the pointer is located in, if any.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>root_x_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>root_y_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Return the pointer coordinates relative to the root window's origin.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>win_x_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>win_y_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Return the pointer coordinates relative to the specified window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>mask_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the current state of the modifier keys and pointer buttons.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XQueryPointer' xrefstyle='select: title'/>
+function returns the root window the pointer is logically on and the pointer
+coordinates relative to the root window's origin.
+If
+<xref linkend='XQueryPointer' xrefstyle='select: title'/>
+returns 
+<symbol>False</symbol>,
+the pointer is not on the same screen as the specified window, and
+<xref linkend='XQueryPointer' xrefstyle='select: title'/>
+returns 
+<symbol>None</symbol>
+to child_return and zero to win_x_return and win_y_return.
+If 
+<xref linkend='XQueryPointer' xrefstyle='select: title'/>
+returns 
+<symbol>True</symbol>,
+the pointer coordinates returned to win_x_return and win_y_return
+are relative to the origin of the specified window.
+In this case, 
+<xref linkend='XQueryPointer' xrefstyle='select: title'/>
+returns the child that contains the pointer, if any,
+or else
+<symbol>None</symbol>
+to child_return.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XQueryPointer' xrefstyle='select: title'/>
+returns the current logical state of the keyboard buttons 
+and the modifier keys in mask_return.
+It sets mask_return to the bitwise inclusive OR of one or more
+of the button or modifier key bitmasks to match 
+the current state of the mouse buttons and the modifier keys.
+</para>
+<para>
+<!-- .LP -->
+Note that the logical state of a device (as seen through Xlib)
+may lag the physical state if device event processing is frozen
+(see <link linkend='Pointer_Grabbing'>section 12.1</link>).
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XQueryPointer' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+</sect1>
+<sect1 id="Properties_and_Atoms">
+<title>Properties and Atoms</title>
+<!-- .XS -->
+<!-- (SN Properties and Atoms  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+A property is a collection of named, typed data.
+The window system has a set of predefined properties
+<indexterm><primary>Atom</primary><secondary>predefined</secondary></indexterm>
+(for example, the name of a window, size hints, and so on), and users can
+define any other arbitrary information and associate it with windows.
+Each property has a name,
+which is an ISO Latin-1 string.
+For each named property,
+a unique identifier (atom) is associated with it. 
+A property also has a type, for example, string or integer.
+These types are also indicated using atoms, so arbitrary new
+types can be defined.
+Data of only one type may be associated with a single
+property name.
+Clients can store and retrieve properties associated with windows.
+For efficiency reasons,
+an atom is used rather than a character string.
+<xref linkend='XInternAtom' xrefstyle='select: title'/>
+can be used to obtain the atom for property names.
+<indexterm><primary>Atom</primary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+A property is also stored in one of several possible formats.
+The X server can store the information as 8-bit quantities, 16-bit
+quantities, or 32-bit quantities.
+This permits the X server to present the data in the byte order that the
+client expects.
+<!-- .NT Note -->
+If you define further properties of complex type, 
+you must encode and decode them yourself.
+These functions must be carefully written if they are to be portable.
+For further information about how to write a library extension,
+see <link linkend="extensions">appendix C</link>.
+<!-- .NE -->
+The type of a property is defined by an atom, which allows for
+arbitrary extension in this type scheme.
+<indexterm><primary>Atom</primary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+Certain property names are
+predefined in the server for commonly used functions.
+The atoms for these properties are defined in 
+<filename class="headerfile">&lt;X11/Xatom.h&gt;</filename>.
+<indexterm type="file"><primary><filename class="headerfile">X11/Xatom.h</filename></primary></indexterm>
+<indexterm><primary>Files</primary><secondary><filename class="headerfile">&lt;X11/Xatom.h&gt;</filename></secondary></indexterm>
+<indexterm><primary>Headers</primary><secondary><filename class="headerfile">&lt;X11/Xatom.h&gt;</filename></secondary></indexterm>
+To avoid name clashes with user symbols, the 
+<code>#define</code>
+name for each atom has the XA_ prefix.
+For an explanation of the functions that let you get and set
+much of the information stored in these predefined properties,
+see <link linkend='Inter_Client_Communication_Functions'>chapter 14</link>.
+</para>
+<para>
+<!-- .LP -->
+The core protocol imposes no semantics on these property names,
+but semantics are specified in other X Consortium standards,
+such as the <olink targetdoc='icccm' targetptr='icccm'><citetitle>Inter-Client Communication Conventions Manual</citetitle></olink>
+and the <olink targetdoc='xlfd' targetptr='xlfd'><citetitle>X Logical Font Description Conventions</citetitle></olink>.
+</para>
+<para>
+<!-- .LP -->
+You can use properties to communicate other information between
+applications.
+The functions described in this section let you define new properties 
+and get the unique atom IDs in your applications.
+</para>
+<para>
+<!-- .LP -->
+Although any particular atom can have some client interpretation 
+within each of the name spaces, 
+atoms occur in five distinct name spaces within the protocol: 
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+Selections
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Property names
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Property types
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Font properties 
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Type of a 
+<symbol>ClientMessage</symbol>
+event (none are built into the X server)
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+</para>
+<para>
+<!-- .LP -->
+The built-in selection property names are:
+<simplelist type="vert" columns="2">
+  <member><property>PRIMARY</property></member>
+  <member><property>SECONDARY</property></member>
+</simplelist>
+</para>
+<para>
+<!-- .LP -->
+The built-in property names are: 
+  <simplelist type="vert" columns="2">
+    <member><property>CUT_BUFFER0</property></member>
+    <member><property>CUT_BUFFER1</property></member>
+    <member><property>CUT_BUFFER2</property></member>
+    <member><property>CUT_BUFFER3</property></member>
+    <member><property>CUT_BUFFER4</property></member>
+    <member><property>CUT_BUFFER5</property></member>
+    <member><property>CUT_BUFFER6</property></member>
+    <member><property>CUT_BUFFER7</property></member>
+    <member><property>RGB_BEST_MAP</property></member>
+    <member><property>RGB_BLUE_MAP</property></member>
+    <member><property>RGB_DEFAULT_MAP</property></member>
+    <member><property>RGB_GRAY_MAP</property></member>
+    <member><property>RGB_GREEN_MAP</property></member>
+    <member><property>RGB_RED_MAP</property></member>
+
+    <member><property>RESOURCE_MANAGER</property></member>
+    <member><property>WM_CLASS</property></member>
+    <member><property>WM_CLIENT_MACHINE</property></member>
+    <member><property>WM_COLORMAP_WINDOWS</property></member>
+    <member><property>WM_COMMAND</property></member>
+    <member><property>WM_HINTS</property></member>
+    <member><property>WM_ICON_NAME</property></member>
+    <member><property>WM_ICON_SIZE</property></member>
+    <member><property>WM_NAME</property></member>
+    <member><property>WM_NORMAL_HINTS</property></member>
+    <member><property>WM_PROTOCOLS</property></member>
+    <member><property>WM_STATE</property></member>
+    <member><property>WM_TRANSIENT_FOR</property></member>
+    <member><property>WM_ZOOM_HINTS</property></member>
+  </simplelist>
+</para>
+<para>
+The built-in property types are: 
+  <simplelist type="vert" columns="2">
+    <member><property>ARC</property></member>
+    <member><property>ATOM</property></member>
+    <member><property>BITMAP</property></member>
+    <member><property>CARDINAL</property></member>
+    <member><property>COLORMAP</property></member>
+    <member><property>CURSOR</property></member>
+    <member><property>DRAWABLE</property></member>
+    <member><property>FONT</property></member>
+    <member><property>INTEGER</property></member>
+    <member><property>PIXMAP</property></member>
+    <member><property>POINT</property></member>
+    <member><property>RGB_COLOR_MAP</property></member>
+    <member><property>RECTANGLE</property></member>
+    <member><property>STRING</property></member>
+    <member><property>VISUALID</property></member>
+    <member><property>WINDOW</property></member>
+    <member><property>WM_HINTS</property></member>
+    <member><property>WM_SIZE_HINTS</property></member>
+  </simplelist>
+</para>
+<para>
+The built-in font property names are: 
+  <simplelist type="vert" columns="2">
+    <member><property>MIN_SPACE</property></member>
+    <member><property>NORM_SPACE</property></member>
+    <member><property>MAX_SPACE</property></member>
+    <member><property>END_SPACE</property></member>
+    <member><property>SUPERSCRIPT_X</property></member>
+    <member><property>SUPERSCRIPT_Y</property></member>
+    <member><property>SUBSCRIPT_X</property></member>
+    <member><property>SUBSCRIPT_Y</property></member>
+    <member><property>UNDERLINE_POSITION</property></member>
+    <member><property>UNDERLINE_THICKNESS</property></member>
+    <member><property>FONT_NAME</property></member>
+    <member><property>FULL_NAME</property></member>
+
+    <member><property>STRIKEOUT_DESCENT</property></member>
+    <member><property>STRIKEOUT_ASCENT</property></member>
+    <member><property>ITALIC_ANGLE</property></member>
+    <member><property>X_HEIGHT</property></member>
+    <member><property>QUAD_WIDTH</property></member>
+    <member><property>WEIGHT</property></member>
+    <member><property>POINT_SIZE</property></member>
+    <member><property>RESOLUTION</property></member>
+    <member><property>COPYRIGHT</property></member>
+    <member><property>NOTICE</property></member>
+    <member><property>FAMILY_NAME</property></member>
+    <member><property>CAP_HEIGHT</property></member>
+  </simplelist>
+</para>
+<para>
+<!-- .LP -->
+For further information about font properties,
+see <link linkend="Font_Metrics">section 8.5</link>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To return an atom for a given name, use 
+<xref linkend='XInternAtom' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Atom</primary><secondary>interning</secondary></indexterm>
+<indexterm significance="preferred"><primary>XInternAtom</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XInternAtom'>
+<funcprototype>
+  <funcdef>Atom <function>XInternAtom</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>char<parameter> *atom_name</parameter></paramdef>
+  <paramdef>Bool<parameter> only_if_exists</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>atom_name</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the name associated with the atom you want returned.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>only_if_exists</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a Boolean value that indicates whether the atom must be created.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XInternAtom' xrefstyle='select: title'/>
+function returns the atom identifier associated with the specified atom_name
+string.
+If only_if_exists is 
+<symbol>False</symbol>,
+the atom is created if it does not exist.
+Therefore,
+<xref linkend='XInternAtom' xrefstyle='select: title'/>
+can return
+<symbol>None</symbol>.
+If the atom name is not in the Host Portable Character Encoding, 
+the result is implementation-dependent.
+Uppercase and lowercase matter;
+the strings ``thing'', ``Thing'', and ``thinG'' 
+all designate different atoms.  
+The atom will remain defined even after the client's connection closes.
+It will become undefined only when the last connection to
+the X server closes.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XInternAtom' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To return atoms for an array of names, use 
+<xref linkend='XInternAtoms' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Atom</primary><secondary>interning</secondary></indexterm>
+<indexterm significance="preferred"><primary>XInternAtoms</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XInternAtoms'>
+<funcprototype>
+  <funcdef>Status <function>XInternAtoms</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>char<parameter> **names</parameter></paramdef>
+  <paramdef>int<parameter> count</parameter></paramdef>
+  <paramdef>Bool<parameter> only_if_exists</parameter></paramdef>
+  <paramdef>Atom<parameter> *atoms_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>names</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the array of atom names.
+<!-- .ds Cn atom names in the array -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>count</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of (Cn.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>only_if_exists</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a Boolean value that indicates whether the atom must be created.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>atoms_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the atoms.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XInternAtoms' xrefstyle='select: title'/>
+function returns the atom identifiers associated with the specified names.
+The atoms are stored in the atoms_return array supplied by the caller.
+Calling this function is equivalent to calling
+<xref linkend='XInternAtom' xrefstyle='select: title'/>
+for each of the names in turn with the specified value of only_if_exists,
+but this function minimizes the number of round-trip protocol exchanges
+between the client and the X server.
+</para>
+<para>
+<!-- .LP -->
+This function returns a nonzero status if atoms are returned for
+all of the names;
+otherwise, it returns zero.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XInternAtoms' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To return a name for a given atom identifier, use 
+<xref linkend='XGetAtomName' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Atom</primary><secondary>getting name</secondary></indexterm>
+<indexterm significance="preferred"><primary>XGetAtomName</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetAtomName'>
+<funcprototype>
+  <funcdef>char *<function>XGetAtomName</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Atom<parameter> atom</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>atom</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the atom for the property name you want returned.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetAtomName' xrefstyle='select: title'/>
+function returns the name associated with the specified atom.
+If the data returned by the server is in the Latin Portable Character Encoding,
+then the returned string is in the Host Portable Character Encoding.
+Otherwise, the result is implementation-dependent.
+To free the resulting string,
+call
+<xref linkend='XFree' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGetAtomName' xrefstyle='select: title'/>
+can generate a
+<errorname>BadAtom</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To return the names for an array of atom identifiers, use 
+<xref linkend='XGetAtomNames' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Atom</primary><secondary>getting name</secondary></indexterm>
+<indexterm significance="preferred"><primary>XGetAtomNames</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetAtomNames'>
+<funcprototype>
+  <funcdef>Status <function>XGetAtomNames</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Atom<parameter> *atoms</parameter></paramdef>
+  <paramdef>int<parameter> count</parameter></paramdef>
+  <paramdef>char<parameter> **names_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>atoms</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the array of atoms.
+<!-- .ds Cn atoms in the array -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>count</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of (Cn.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>names_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the atom names.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetAtomNames' xrefstyle='select: title'/>
+function returns the names associated with the specified atoms.
+The names are stored in the names_return array supplied by the caller.
+Calling this function is equivalent to calling
+<xref linkend='XGetAtomName' xrefstyle='select: title'/>
+for each of the atoms in turn,
+but this function minimizes the number of round-trip protocol exchanges
+between the client and the X server.
+</para>
+<para>
+<!-- .LP -->
+This function returns a nonzero status if names are returned for
+all of the atoms;
+otherwise, it returns zero.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGetAtomNames' xrefstyle='select: title'/>
+can generate a
+<errorname>BadAtom</errorname>
+error.
+</para>
+</sect1>
+<sect1 id="Obtaining_and_Changing_Window_Properties">
+<title>Obtaining and Changing Window Properties</title>
+<!-- .XS -->
+<!-- (SN Obtaining and Changing Window Properties  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+You can attach a property list to every window.
+Each property has a name, a type, and a value
+(see <link linkend="Properties_and_Atoms">section 4.3</link>).
+The value is an array of 8-bit, 16-bit, or 32-bit quantities,
+whose interpretation is left to the clients.  The type
+<type>char</type>
+is used to represent 8-bit quantities, the type
+<type>short</type>
+is used to represent 16-bit quantities, and the type
+<type>long</type>
+is used to represent 32-bit quantities.
+</para>
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to obtain, 
+change, update, or interchange window properties.
+In addition, Xlib provides other utility functions for inter-client
+communication
+(see <link linkend='Inter_Client_Communication_Functions'>chapter 14</link>).
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain the type, format, and value of a property of a given window, use 
+<xref linkend='XGetWindowProperty' xrefstyle='select: title'/>.
+<indexterm><primary>Property</primary><secondary>getting</secondary></indexterm>
+</para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XGetWindowProperty</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetWindowProperty'>
+<funcprototype>
+  <funcdef>int <function>XGetWindowProperty</function></funcdef>
+  <paramdef><parameter> display</parameter></paramdef>
+  <paramdef><parameter> w</parameter></paramdef>
+  <paramdef><parameter> property</parameter></paramdef>
+  <paramdef><parameter> long_offset</parameter></paramdef>
+  <paramdef><parameter> long_length</parameter></paramdef>
+  <paramdef><parameter> delete</parameter></paramdef>
+  <paramdef><parameter> req_type</parameter></paramdef>
+  <paramdef><parameter> actual_type_return</parameter></paramdef>
+  <paramdef><parameter> actual_format_return</parameter></paramdef>
+  <paramdef><parameter> nitems_return</parameter></paramdef>
+  <paramdef><parameter> bytes_after_return</parameter></paramdef>
+  <paramdef><parameter> prop_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Wi whose property you want to obtain -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window (Wi.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>property</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the property name.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>long_offset</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the offset in the specified property (in 32-bit quantities) 
+where the data is to be retrieved.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>long_length</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the length in 32-bit multiples of the data to be retrieved.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>delete</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a Boolean value that determines whether the property is deleted.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>req_type</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the atom identifier associated with the property type or
+<symbol>AnyPropertyType</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>actual_type_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the atom identifier  that defines the actual type of the property.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>actual_format_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the actual format of the property.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nitems_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the actual number of 8-bit, 16-bit, or 32-bit items 
+stored in the prop_return data.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>bytes_after_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the number of bytes remaining to be read in the property if 
+a partial read was performed.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>prop_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the data in the specified format.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetWindowProperty' xrefstyle='select: title'/>
+function returns the actual type of the property; the actual format of the property;
+the number of 8-bit, 16-bit, or 32-bit items transferred; the number of bytes remaining
+to be read in the property; and a pointer to the data actually returned.
+<xref linkend='XGetWindowProperty' xrefstyle='select: title'/>
+sets the return arguments as follows:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+If the specified property does not exist for the specified window,
+<xref linkend='XGetWindowProperty' xrefstyle='select: title'/>
+returns 
+<symbol>None</symbol>
+to actual_type_return and the value zero to 
+actual_format_return and bytes_after_return.
+The nitems_return argument is empty.
+In this case, the delete argument is ignored.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If the specified property exists 
+but its type does not match the specified type,
+<xref linkend='XGetWindowProperty' xrefstyle='select: title'/>
+returns the actual property type to actual_type_return, 
+the actual property format (never zero) to actual_format_return, 
+and the property length in bytes
+(even if the actual_format_return is 16 or 32) 
+to bytes_after_return.
+It also ignores the delete argument.
+The nitems_return argument is empty.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If the specified property exists and either you assign 
+<symbol>AnyPropertyType</symbol>
+to the req_type argument or the specified type matches the actual property type,
+<xref linkend='XGetWindowProperty' xrefstyle='select: title'/>
+returns the actual property type to actual_type_return and the actual
+property format (never zero) to actual_format_return. 
+It also returns a value to bytes_after_return and nitems_return, by 
+defining the following
+values:
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<!-- .nf -->
+     N = actual length of the stored property in bytes
+          (even if the format is 16 or 32)
+     I = 4 * long_offset
+     T = N - I
+     L = MINIMUM(T, 4 * long_length)
+     A = N - (I + L)
+<!-- .fi -->
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The returned value starts at byte index I in the property (indexing
+from zero), and its length in bytes is L.
+If the value for long_offset causes L to be negative,
+a
+<errorname>BadValue</errorname>
+error results. 
+The value of bytes_after_return is A, 
+giving the number of trailing unread bytes in the stored property.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+If the returned format is 8, the returned data is represented as a
+<type>char</type>
+array.
+If the returned format is 16, the returned data is represented as a
+<type>short</type>
+array and should be cast to that type to obtain the elements.
+If the returned format is 32, the returned data is represented as a
+<type>long</type>
+array and should be cast to that type to obtain the elements.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGetWindowProperty' xrefstyle='select: title'/>
+always allocates one extra byte in prop_return 
+(even if the property is zero length) 
+and sets it to zero so that simple properties consisting of characters
+do not have to be copied into yet another string before use.
+</para>
+<para>
+<!-- .LP -->
+If delete is 
+<symbol>True</symbol>
+and bytes_after_return is zero, 
+<xref linkend='XGetWindowProperty' xrefstyle='select: title'/>
+deletes the property 
+from the window and generates a 
+<symbol>PropertyNotify</symbol>
+event on the window.
+</para>
+<para>
+<!-- .LP -->
+The function returns
+<symbol>Success</symbol>
+if it executes successfully.
+To free the resulting data,
+use
+<xref linkend='XFree' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGetWindowProperty' xrefstyle='select: title'/>
+can generate
+<errorname>BadAtom</errorname>,
+<errorname>BadValue</errorname>,
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain a given window's property list, use 
+<xref linkend='XListProperties' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Property</primary><secondary>listing</secondary></indexterm>
+<indexterm significance="preferred"><primary>XListProperties</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XListProperties'>
+<funcprototype>
+  <funcdef>Atom *<function>XListProperties</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>int<parameter> *num_prop_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Wi whose property list you want to obtain -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window (Wi.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>num_prop_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the length of the properties array.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XListProperties' xrefstyle='select: title'/>
+function returns a pointer to an array of atom properties that are defined for 
+the specified window or returns NULL if no properties were found.
+To free the memory allocated by this function, use
+<xref linkend='XFree' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XListProperties' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To change a property of a given window, use
+<xref linkend='XChangeProperty' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Property</primary><secondary>changing</secondary></indexterm>
+<indexterm><primary>Property</primary><secondary>appending</secondary></indexterm>
+<indexterm><primary>Property</primary><secondary>prepending</secondary></indexterm>
+<indexterm><primary>Property</primary><secondary>replacing</secondary></indexterm>
+<indexterm><primary>Property</primary><secondary>format</secondary></indexterm>
+<indexterm><primary>Property</primary><secondary>type</secondary></indexterm>
+<indexterm significance="preferred"><primary>XChangeProperty</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XChangeProperty'>
+<funcprototype>
+  <funcdef><function>XChangeProperty</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>Atomproperty,<parameter> type</parameter></paramdef>
+  <paramdef>int<parameter> format</parameter></paramdef>
+  <paramdef>int<parameter> mode</parameter></paramdef>
+  <paramdef>unsignedchar<parameter> *data</parameter></paramdef>
+  <paramdef>int<parameter> nelements</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Wi whose property you want to change -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window (Wi.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>property</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the property name.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>type</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the type of the property.
+The X server does not interpret the type but simply
+passes it back to an application that later calls 
+<xref linkend='XGetWindowProperty' xrefstyle='select: title'/>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>format</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies whether the data should be viewed as a list
+of 8-bit, 16-bit, or 32-bit quantities.
+Possible values are 8, 16, and 32.
+This information allows the X server to correctly perform
+byte-swap operations as necessary.
+If the format is 16-bit or 32-bit,
+you must explicitly cast your data pointer to an (unsigned char *) in the call
+to 
+<xref linkend='XChangeProperty' xrefstyle='select: title'/>.
+<!-- .\" Changed name of this file to prop_mode.a on 1/13/87 -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>mode</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the mode of the operation.
+You can pass
+<symbol>PropModeReplace</symbol>,
+<symbol>PropModePrepend</symbol>,
+or
+<symbol>PropModeAppend</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the property data.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nelements</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of elements of the specified data format.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XChangeProperty' xrefstyle='select: title'/>
+function alters the property for the specified window and
+causes the X server to generate a
+<symbol>PropertyNotify</symbol>
+event on that window.
+<xref linkend='XChangeProperty' xrefstyle='select: title'/>
+performs the following:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+If mode is
+<symbol>PropModeReplace</symbol>,
+<xref linkend='XChangeProperty' xrefstyle='select: title'/>
+discards the previous property value and stores the new data.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If mode is
+<symbol>PropModePrepend</symbol>
+or
+<symbol>PropModeAppend</symbol>,
+<xref linkend='XChangeProperty' xrefstyle='select: title'/>
+inserts the specified data before the beginning of the existing data
+or onto the end of the existing data, respectively.
+The type and format must match the existing property value,
+or a
+<errorname>BadMatch</errorname>
+error results.
+If the property is undefined, 
+it is treated as defined with the correct type and
+format with zero-length data.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+If the specified format is 8, the property data must be a
+<type>char</type>
+array.
+If the specified format is 16, the property data must be a
+<type>short</type>
+array.
+If the specified format is 32, the property data must be a
+<type>long</type>
+array.
+</para>
+<para>
+<!-- .LP -->
+The lifetime of a property is not tied to the storing client.
+Properties remain until explicitly deleted, until the window is destroyed,
+or until the server resets.
+For a discussion of what happens when the connection to the X server is closed,
+see <link linkend='Using_X_Server_Connection_Close_Operations'>section 2.6</link>.
+The maximum size of a property is server dependent and can vary dynamically
+depending on the amount of memory the server has available.
+(If there is insufficient space, a
+<errorname>BadAlloc</errorname>
+error results.)
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XChangeProperty' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>,
+<errorname>BadAtom</errorname>,
+<errorname>BadMatch</errorname>,
+<errorname>BadValue</errorname>,
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To rotate a window's property list, use
+<xref linkend='XRotateWindowProperties' xrefstyle='select: title'/>.
+</para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XRotateWindowProperties</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XRotateWindowProperties'>
+<funcprototype>
+  <funcdef><function>XRotateWindowProperties</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>Atom<parameter> properties[]</parameter></paramdef>
+  <paramdef>int<parameter> num_prop</parameter></paramdef>
+  <paramdef>int<parameter> npositions</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>properties</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the array of properties that are to be rotated.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>num_prop</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the length of the properties array.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>npositions</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the rotation amount.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XRotateWindowProperties' xrefstyle='select: title'/>
+function allows you to rotate properties on a window and causes
+the X server to generate
+<symbol>PropertyNotify</symbol>
+events.
+If the property names in the properties array are viewed as being numbered 
+starting from zero and if there are num_prop property names in the list,
+then the value associated with property name I becomes the value associated 
+with property name (I + npositions) mod N for all I from zero to N &minus; 1.
+The effect is to rotate the states by npositions places around the virtual ring
+of property names (right for positive npositions, 
+left for negative npositions).
+If npositions mod N is nonzero,
+the X server generates a
+<symbol>PropertyNotify</symbol>
+event for each property in the order that they are listed in the array.
+If an atom occurs more than once in the list or no property with that 
+name is defined for the window,
+a 
+<errorname>BadMatch</errorname>
+error results.
+If a 
+<errorname>BadAtom</errorname>
+or 
+<errorname>BadMatch</errorname>
+error results,
+no properties are changed.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XRotateWindowProperties' xrefstyle='select: title'/>
+can generate
+<errorname>BadAtom</errorname>,
+<errorname>BadMatch</errorname>,
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To delete a property on a given window, use 
+<xref linkend='XDeleteProperty' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Property</primary><secondary>deleting</secondary></indexterm>
+<indexterm significance="preferred"><primary>XDeleteProperty</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDeleteProperty'>
+<funcprototype>
+  <funcdef><function>XDeleteProperty</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>Atom<parameter> property</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Wi whose property you want to delete -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window (Wi.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>property</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the property name.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XDeleteProperty' xrefstyle='select: title'/>
+function deletes the specified property only if the
+property was defined on the specified window
+and causes the X server to generate a
+<symbol>PropertyNotify</symbol>
+event on the window unless the property does not exist.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XDeleteProperty' xrefstyle='select: title'/>
+can generate
+<errorname>BadAtom</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+</sect1>
+<sect1 id="Selections">
+<title>Selections</title>
+<!-- .XS -->
+<!-- (SN Selections -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Selection</primary></indexterm>
+Selections are one method used by applications to exchange data.
+By using the property mechanism,
+applications can exchange data of arbitrary types and can negotiate
+the type of the data.
+A selection can be thought of as an indirect property with a dynamic type.
+That is, rather than having the property stored in the X server,
+the property is maintained by some client (the owner).
+A selection is global in nature (considered to belong to the user 
+but be maintained by clients) rather than being private to a particular 
+window subhierarchy or a particular set of clients.
+</para>
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to set, get, or request conversion
+of selections.
+This allows applications to implement the notion of current selection,
+which requires that notification be sent to applications when they no 
+longer own the selection.
+Applications that support selection often highlight the current selection
+and so must be informed when another application has
+acquired the selection so that they can unhighlight the selection.
+</para>
+<para>
+<!-- .LP -->
+When a client asks for the contents of
+a selection, it specifies a selection target type.
+This target type
+can be used to control the transmitted representation of the contents.
+For example, if the selection is ``the last thing the user clicked on''
+and that is currently an image, then the target type might specify
+whether the contents of the image should be sent in XY format or Z format.
+</para>
+<para>
+<!-- .LP -->
+The target type can also be used to control the class of
+contents transmitted, for example, 
+asking for the ``looks'' (fonts, line
+spacing, indentation, and so forth) of a paragraph selection, not the
+text of the paragraph.
+The target type can also be used for other
+purposes.
+The protocol does not constrain the semantics.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set the selection owner, use 
+<xref linkend='XSetSelectionOwner' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Selection</primary><secondary>setting the owner</secondary></indexterm>
+<indexterm significance="preferred"><primary>XSetSelectionOwner</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetSelectionOwner'>
+<funcprototype>
+  <funcdef><function>XSetSelectionOwner</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Atom<parameter> selection</parameter></paramdef>
+  <paramdef>Window<parameter> owner</parameter></paramdef>
+  <paramdef>Time<parameter> time</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>selection</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the selection atom.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>owner</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the owner of the specified selection atom.
+You can pass a window or
+<symbol>None</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>time</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the time.
+You can pass either a timestamp or
+<symbol>CurrentTime</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetSelectionOwner' xrefstyle='select: title'/>
+function changes the owner and last-change time for the specified selection
+and has no effect if the specified time is earlier than the current
+last-change time of the specified selection 
+or is later than the current X server time.
+Otherwise, the last-change time is set to the specified time,
+with
+<symbol>CurrentTime</symbol>
+replaced by the current server time.
+If the owner window is specified as
+<symbol>None</symbol>,
+then the owner of the selection becomes 
+<symbol>None</symbol>
+(that is, no owner).
+Otherwise, the owner of the selection becomes the client executing
+the request.
+</para>
+<para>
+<!-- .LP  -->
+If the new owner (whether a client or
+<symbol>None</symbol>)
+is not
+the same as the current owner of the selection and the current
+owner is not
+<symbol>None</symbol>,
+the current owner is sent a 
+<symbol>SelectionClear</symbol>
+event.
+If the client that is the owner of a selection is later
+terminated (that is, its connection is closed)
+or if the owner window it has specified in the request is later
+destroyed,
+the owner of the selection automatically
+reverts to
+<symbol>None</symbol>,
+but the last-change time is not affected.
+The selection atom is uninterpreted by the X server.
+<xref linkend='XGetSelectionOwner' xrefstyle='select: title'/>
+returns the owner window, which is reported in 
+<symbol>SelectionRequest</symbol>
+and
+<symbol>SelectionClear</symbol>
+events.
+Selections are global to the X server.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetSelectionOwner' xrefstyle='select: title'/>
+can generate
+<errorname>BadAtom</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To return the selection owner, use 
+<xref linkend='XGetSelectionOwner' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Selection</primary><secondary>getting the owner</secondary></indexterm>
+<indexterm significance="preferred"><primary>XGetSelectionOwner</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetSelectionOwner'>
+<funcprototype>
+  <funcdef>Window <function>XGetSelectionOwner</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Atom<parameter> selection</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Se whose owner you want returned -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>selection</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the selection atom (Se.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetSelectionOwner' xrefstyle='select: title'/>
+function
+returns the window ID associated with the window that currently owns the
+specified selection.
+If no selection was specified, the function returns the constant
+<symbol>None</symbol>.
+If
+<symbol>None</symbol>
+is returned,
+there is no owner for the selection.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGetSelectionOwner' xrefstyle='select: title'/>
+can generate a
+<errorname>BadAtom</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To request conversion of a selection, use 
+<xref linkend='XConvertSelection' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Selection</primary><secondary>converting</secondary></indexterm>
+<indexterm significance="preferred"><primary>XConvertSelection</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XConvertSelection'>
+<funcprototype>
+  <funcdef><function>XConvertSelection</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Atomselection,<parameter> target</parameter></paramdef>
+  <paramdef>Atom<parameter> property</parameter></paramdef>
+  <paramdef>Window<parameter> requestor</parameter></paramdef>
+  <paramdef>Time<parameter> time</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>selection</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the selection atom.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>target</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the target atom.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>property</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the property name.
+You also can pass 
+<symbol>None</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>requestor</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the requestor.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>time</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the time.
+You can pass either a timestamp or
+<symbol>CurrentTime</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<xref linkend='XConvertSelection' xrefstyle='select: title'/>
+requests that the specified selection be converted to the specified target
+type:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+If the specified selection has an owner, the X server sends a
+<symbol>SelectionRequest</symbol>
+event to that owner.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If no owner for the specified
+selection exists, the X server generates a
+<symbol>SelectionNotify</symbol>
+event to the
+requestor with property
+<symbol>None</symbol>.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+The arguments are passed on unchanged in either of the events.
+There are two predefined selection atoms: PRIMARY and SECONDARY.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XConvertSelection' xrefstyle='select: title'/>
+can generate
+<errorname>BadAtom</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+<!-- .bp -->
+
+
+</para>
+</sect1>
+</chapter>
diff --git a/specs/libX11/CH05.xml b/specs/libX11/CH05.xml
new file mode 100644 (file)
index 0000000..501ead0
--- /dev/null
@@ -0,0 +1,818 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+         "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
+<chapter id='Pixmap_and_Cursor_Functions'>
+<title>Pixmap and Cursor Functions</title>
+<sect1 id="Creating_and_Freeing_Pixmaps">
+<title>Creating and Freeing Pixmaps</title>
+<!-- .XS -->
+<!-- (SN Creating and Freeing Pixmaps -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Pixmaps can only be used on the screen on which they were created.
+Pixmaps are off-screen resources that are used for various operations,
+such as defining cursors as tiling patterns 
+or as the source for certain raster operations.
+Most graphics requests can operate either on a window or on a pixmap.
+A bitmap is a single bit-plane pixmap.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To create a pixmap of a given size, use
+<xref linkend='XCreatePixmap' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XCreatePixmap</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XCreatePixmap'>
+<funcprototype>
+  <funcdef>Pixmap <function>XCreatePixmap</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>unsignedintwidth,<parameter> height</parameter></paramdef>
+  <paramdef>unsignedint<parameter> depth</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies which screen the pixmap is created on. 
+<!-- .ds Wh , which define the dimensions of the pixmap -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the width and height(Wh.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>depth</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the depth of the pixmap.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XCreatePixmap' xrefstyle='select: title'/>
+function creates a pixmap of the width, height, and depth you specified
+and returns a pixmap ID that identifies it.
+It is valid to pass an 
+<symbol>InputOnly</symbol>
+window to the drawable argument.
+The width and height arguments must be nonzero,
+or a 
+<errorname>BadValue</errorname>
+error results.
+The depth argument must be one of the depths supported by the screen
+of the specified drawable,
+or a
+<errorname>BadValue</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+The server uses the specified drawable to determine on which screen
+to create the pixmap.
+The pixmap can be used only on this screen
+and only with other drawables of the same depth (see
+<xref linkend='XCopyPlane' xrefstyle='select: title'/>
+for an exception to this rule).
+The initial contents of the pixmap are undefined.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XCreatePixmap' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>,
+<errorname>BadDrawable</errorname>,
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To free all storage associated with a specified pixmap, use
+<xref linkend='XFreePixmap' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XFreePixmap</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XFreePixmap'>
+<funcprototype>
+  <funcdef><function>XFreePixmap</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Pixmap<parameter> pixmap</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN        -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>pixmap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the pixmap.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XFreePixmap' xrefstyle='select: title'/>
+function first deletes the association between the pixmap ID and the pixmap.
+Then, the X server frees the pixmap storage when there are no references to it.
+The pixmap should never be referenced again.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XFreePixmap' xrefstyle='select: title'/>
+can generate a
+<errorname>BadPixmap</errorname>
+error.
+</para>
+</sect1>
+<sect1 id="Creating_Recoloring_and_Freeing_Cursors">
+<title>Creating, Recoloring, and Freeing Cursors</title>
+<!-- .XS -->
+<!-- (SN Creating, Recoloring, and Freeing Cursors  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Each window can have a different cursor defined for it.
+Whenever the pointer is in a visible window, 
+it is set to the cursor defined for that window.
+If no cursor was defined for that window, 
+the cursor is the one defined for the parent window.
+</para>
+<para>
+<!-- .LP -->
+From X's perspective, 
+a cursor consists of a cursor source, mask, colors, and a hotspot. 
+The mask pixmap determines the shape of the cursor and must be a depth
+of one.
+The source pixmap must have a depth of one,
+and the colors determine the colors of the source.
+The hotspot defines the point on the cursor that is reported
+when a pointer event occurs.
+There may be limitations imposed by the hardware on
+cursors as to size and whether a mask is implemented. 
+<indexterm><primary>XQueryBestCursor</primary></indexterm>
+<xref linkend='XQueryBestCursor' xrefstyle='select: title'/>
+can be used to find out what sizes are possible.
+There is a standard font for creating cursors, but
+Xlib provides functions that you can use to create cursors
+from an arbitrary font or from bitmaps.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To create a cursor from the standard cursor font, use
+<xref linkend='XCreateFontCursor' xrefstyle='select: title'/>.
+</para>
+<para>
+#include &lt;X11/cursorfont.h&gt;
+</para>
+
+<indexterm significance="preferred"><primary>XCreateFontCursor</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XCreateFontCursor'>
+<funcprototype>
+  <funcdef>Cursor <function>XCreateFontCursor</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>unsignedint<parameter> shape</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>shape</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the shape of the cursor.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+X provides a set of standard cursor shapes in a special font named
+cursor.
+Applications are encouraged to use this interface for their cursors
+because the font can be customized for the individual display type.
+The shape argument specifies which glyph of the standard fonts
+to use.
+</para>
+<para>
+<!-- .LP -->
+The hotspot comes from the information stored in the cursor font.
+The initial colors of a cursor are a black foreground and a white
+background (see
+<xref linkend='XRecolorCursor' xrefstyle='select: title'/>).
+For further information about cursor shapes,
+see <link linkend="x_font_cursors">appendix B</link>.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XCreateFontCursor' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To create a cursor from font glyphs, use
+<xref linkend='XCreateGlyphCursor' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XCreateGlyphCursor</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XCreateGlyphCursor'>
+<funcprototype>
+  <funcdef>Cursor <function>XCreateGlyphCursor</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Fontsource_font,<parameter> mask_font</parameter></paramdef>
+  <paramdef>unsignedintsource_char,<parameter> mask_char</parameter></paramdef>
+  <paramdef>XColor<parameter> *foreground_color</parameter></paramdef>
+  <paramdef>XColor<parameter> *background_color</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>source_font</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the font for the source glyph.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>mask_font</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the font for the mask glyph or
+<symbol>None</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>source_char</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the character glyph for the source.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>mask_char</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the glyph character for the mask. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>foreground_color</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the <acronym>RGB</acronym> values for the foreground of the source. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>background_color</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the <acronym>RGB</acronym> values for the background of the source.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XCreateGlyphCursor' xrefstyle='select: title'/>
+function is similar to
+<xref linkend='XCreatePixmapCursor' xrefstyle='select: title'/>
+except that the source and mask bitmaps are obtained from the specified 
+font glyphs.
+The source_char must be a defined glyph in source_font, 
+or a
+<errorname>BadValue</errorname>
+error results.
+If mask_font is given, 
+mask_char must be a defined glyph in mask_font,
+or a
+<errorname>BadValue</errorname>
+error results.
+The mask_font and character are optional.
+The origins of the source_char and mask_char (if defined) glyphs are
+positioned coincidently and define the hotspot. 
+The source_char and mask_char need not have the same bounding box metrics, 
+and there is no restriction on the placement of the hotspot relative to the bounding
+boxes. 
+If no mask_char is given, all pixels of the source are displayed.
+You can free the fonts immediately by calling
+<xref linkend='XFreeFont' xrefstyle='select: title'/>
+if no further explicit references to them are to be made. 
+</para>
+<para>
+<!-- .LP -->
+For 2-byte matrix fonts, 
+the 16-bit value should be formed with the byte1
+member in the most significant byte and the byte2 member in the 
+least significant byte.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XCreateGlyphCursor' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>,
+<errorname>BadFont</errorname>,
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To create a cursor from two bitmaps,
+use
+<xref linkend='XCreatePixmapCursor' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XCreatePixmapCursor</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XCreatePixmapCursor'>
+<funcprototype>
+  <funcdef>Cursor <function>XCreatePixmapCursor</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Pixmap<parameter> source</parameter></paramdef>
+  <paramdef>Pixmap<parameter> mask</parameter></paramdef>
+  <paramdef>XColor<parameter> *foreground_color</parameter></paramdef>
+  <paramdef>XColor<parameter> *background_color</parameter></paramdef>
+  <paramdef>unsignedintx,<parameter> y</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>source</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the shape of the source cursor.
+<!-- .\" *** JIM: NEED TO CHECK THIS. *** -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>mask</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the cursor's source bits to be displayed or
+<symbol>None</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>foreground_color</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the <acronym>RGB</acronym> values for the foreground of the source. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>background_color</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the <acronym>RGB</acronym> values for the background of the source.
+<!-- .ds Xy , which indicate the hotspot relative to the source's origin -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates(Xy.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XCreatePixmapCursor' xrefstyle='select: title'/>
+function creates a cursor and returns the cursor ID associated with it.
+The foreground and background <acronym>RGB</acronym> values must be specified using
+foreground_color and background_color,
+even if the X server only has a
+<symbol>StaticGray</symbol>
+or
+<symbol>GrayScale</symbol>
+screen.
+The foreground color is used for the pixels set to 1 in the
+source, and the background color is used for the pixels set to 0.
+Both source and mask, if specified, must have depth one (or a 
+<errorname>BadMatch</errorname>
+error results) but can have any root.
+The mask argument defines the shape of the cursor.
+The pixels set to 1 in the mask define which source pixels are displayed,
+and the pixels set to 0 define which pixels are ignored.
+If no mask is given, 
+all pixels of the source are displayed.
+The mask, if present, must be the same size as the pixmap defined by the 
+source argument, or a
+<errorname>BadMatch</errorname>
+error results.
+The hotspot must be a point within the source,
+or a
+<errorname>BadMatch</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+The components of the cursor can be transformed arbitrarily to meet
+display limitations.
+The pixmaps can be freed immediately if no further explicit references
+to them are to be made.
+Subsequent drawing in the source or mask pixmap has an undefined effect on the
+cursor.
+The X server might or might not make a copy of the pixmap.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XCreatePixmapCursor' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>
+and
+<errorname>BadPixmap</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To determine useful cursor sizes, use
+<xref linkend='XQueryBestCursor' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XQueryBestCursor</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XQueryBestCursor'>
+<funcprototype>
+  <funcdef>Status <function>XQueryBestCursor</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>unsignedintwidth,<parameter> height</parameter></paramdef>
+  <paramdef>unsignedint*width_return,<parameter> *height_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Dr , which indicates the screen -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable(Dr. 
+<!-- .ds Wh \ of the cursor that you want the size information for -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the width and height(Wh.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Return the best width and height that is closest to the specified width 
+and height.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+Some displays allow larger cursors than other displays.
+The
+<xref linkend='XQueryBestCursor' xrefstyle='select: title'/>
+function provides a way to find out what size cursors are actually
+possible on the display.
+<indexterm ><primary>Cursor</primary><secondary>limitations</secondary></indexterm>
+It returns the largest size that can be displayed.
+Applications should be prepared to use smaller cursors on displays that
+cannot support large ones.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XQueryBestCursor' xrefstyle='select: title'/>
+can generate a
+<errorname>BadDrawable</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To change the color of a given cursor, use
+<xref linkend='XRecolorCursor' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XRecolorCursor</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XRecolorCursor'>
+<funcprototype>
+  <funcdef><function>XRecolorCursor</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Cursor<parameter> cursor</parameter></paramdef>
+  <paramdef>XColor*foreground_color,<parameter> *background_color</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>cursor</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the cursor. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>foreground_color</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the <acronym>RGB</acronym> values for the foreground of the source. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>background_color</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the <acronym>RGB</acronym> values for the background of the source.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XRecolorCursor' xrefstyle='select: title'/>
+function changes the color of the specified cursor, and
+if the cursor is being displayed on a screen,
+the change is visible immediately.
+The pixel members of the
+<structname>XColor</structname>
+structures are ignored; only the <acronym>RGB</acronym> values are used.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XRecolorCursor' xrefstyle='select: title'/>
+can generate a
+<errorname>BadCursor</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To free (destroy) a given cursor, use
+<xref linkend='XFreeCursor' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XFreeCursor</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XFreeCursor'>
+<funcprototype>
+  <funcdef><function>XFreeCursor</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Cursor<parameter> cursor</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>cursor</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the cursor. 
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XFreeCursor' xrefstyle='select: title'/>
+function deletes the association between the cursor resource ID 
+and the specified cursor.
+The cursor storage is freed when no other resource references it.
+The specified cursor ID should not be referred to again.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XFreeCursor' xrefstyle='select: title'/>
+can generate a
+<errorname>BadCursor</errorname>
+error.
+<!-- .bp -->
+
+</para>
+</sect1>
+</chapter>
diff --git a/specs/libX11/CH06.xml b/specs/libX11/CH06.xml
new file mode 100644 (file)
index 0000000..b84ce95
--- /dev/null
@@ -0,0 +1,7450 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+                   "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
+<chapter id='Color_Management_Functions'>
+<title>Color Management Functions</title>
+<!-- .sp 2 -->
+<!-- .nr H1 6 -->
+<!-- .nr H2 0 -->
+<!-- .nr H3 0 -->
+<!-- .nr H4 0 -->
+<!-- .nr H5 0 -->
+<!-- .na -->
+<para>
+<!-- .LP -->
+<!-- .XS -->
+<!-- Chapter 6: Color Management Functions  -->
+<!-- .XE -->
+Each X window always has an associated colormap that
+provides a level of indirection between pixel values and colors displayed
+on the screen.
+Xlib provides functions that you can use to manipulate a colormap.
+The X protocol defines colors using values in the <acronym>RGB</acronym> color space.
+The <acronym>RGB</acronym> color space is device dependent;
+rendering an <acronym>RGB</acronym> value on differing output devices typically results
+in different colors.
+Xlib also provides a means for clients to specify color using
+device-independent color spaces for consistent results across devices.
+Xlib supports device-independent color spaces derivable from the <acronym>CIE</acronym> XYZ
+color space.
+This includes the <acronym>CIE</acronym> XYZ, xyY, L*u*v*, and L*a*b* color spaces as well as
+the TekHVC color space.
+</para>
+<para>
+<!-- .LP -->
+This chapter discusses how to:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+Create, copy, and destroy a colormap
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Specify colors by name or value
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Allocate, modify, and free color cells
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Read entries in a colormap
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Convert between color spaces
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Control aspects of color conversion
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Query the color gamut of a screen
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Add new color spaces
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+All functions, types, and symbols in this chapter with the prefix ``Xcms''
+are defined in
+<filename class="headerfile">&lt;X11/Xcms.h&gt;</filename>.
+<indexterm type="file"><primary><filename class="headerfile">X11/Xcms.h</filename></primary></indexterm>
+<indexterm><primary>Files</primary><secondary><filename class="headerfile">&lt;X11/Xcms.h&gt;</filename></secondary></indexterm>
+<indexterm><primary>Headers</primary><secondary><filename class="headerfile">&lt;X11/Xcms.h&gt;</filename></secondary></indexterm>
+The remaining functions and types are defined in
+<filename class="headerfile">&lt;X11/Xlib.h&gt;</filename>.
+<indexterm type="file"><primary><filename class="headerfile">X11/Xlib.h</filename></primary></indexterm>
+<indexterm><primary>Files</primary><secondary><filename class="headerfile">&lt;X11/Xlib.h&gt;</filename></secondary></indexterm>
+<indexterm><primary>Headers</primary><secondary><filename class="headerfile">&lt;X11/Xlib.h&gt;</filename></secondary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+Functions in this chapter manipulate the representation of color on the
+screen.
+For each possible value that a pixel can take in a window,
+there is a color cell in the colormap.
+For example, 
+if a window is 4 bits deep, pixel values 0 through 15 are defined. 
+A colormap is a collection of color cells.
+A color cell consists of a triple of red, green, and blue (<acronym>RGB</acronym>) values.
+The hardware imposes limits on the number of significant
+bits in these values.
+As each pixel is read out of display memory, the pixel
+is looked up in a colormap.
+The <acronym>RGB</acronym> value of the cell determines what color is displayed on the screen.
+On a grayscale display with a black-and-white monitor, 
+the values are combined to determine the brightness on the screen.
+</para>
+<para>
+<!-- .LP -->
+Typically, an application allocates color cells or sets of color cells
+to obtain the desired colors.
+The client can allocate read-only cells.
+In which case, 
+the pixel values for these colors can be shared among multiple applications, 
+and the <acronym>RGB</acronym> value of the cell cannot be changed.
+If the client allocates read/write cells,
+they are exclusively owned by the client,
+and the color associated with the pixel value can be changed at will.
+Cells must be allocated (and, if read/write, initialized with an <acronym>RGB</acronym> value)
+by a client to obtain desired colors.
+The use of pixel value for an
+unallocated cell results in an undefined color.
+</para>
+<para>
+<!-- .LP -->
+Because colormaps are associated with windows, X supports displays
+with multiple colormaps and, indeed, different types of colormaps.
+If there are insufficient colormap resources in the display,
+some windows will display in their true colors, and others
+will display with incorrect colors.
+A window manager usually controls which windows are displayed
+in their true colors if more than one colormap is required for
+the color resources the applications are using.
+At any time, there is a set of installed colormaps for a screen.
+Windows using one of the installed colormaps display with true colors, and
+windows using other colormaps generally display with incorrect colors.
+You can control the set of installed colormaps by using
+<xref linkend='XInstallColormap' xrefstyle='select: title'/>
+and
+<xref linkend='XUninstallColormap' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+Colormaps are local to a particular screen.
+Screens always have a default colormap,
+and programs typically allocate cells out of this colormap.
+Generally, you should not write applications that monopolize 
+color resources.
+Although some hardware supports multiple colormaps installed at one time,
+many of the hardware displays
+built today support only a single installed colormap, so the primitives
+are written to encourage sharing of colormap entries between applications.
+</para>
+<para>
+<!-- .LP -->
+The 
+<function>DefaultColormap</function>
+macro returns the default colormap.
+The 
+<function>DefaultVisual</function>
+macro
+returns the default visual type for the specified screen.
+<indexterm><primary>Color map</primary></indexterm>
+Possible visual types are 
+<symbol>StaticGray</symbol>,
+<symbol>GrayScale</symbol>,
+<symbol>StaticColor</symbol>,
+<symbol>PseudoColor</symbol>,
+<symbol>TrueColor</symbol>,
+or 
+<symbol>DirectColor</symbol>
+(see <link linkend="Visual_Types">section 3.1</link>).
+</para>
+<sect1 id="Color_Structures">
+<title>Color Structures</title>
+<!-- .XS -->
+<!-- (SN Color Structures -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Functions that operate only on <acronym>RGB</acronym> color space values use an
+<structname>XColor</structname>
+structure, which contains:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XColor</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef struct {
+       unsigned long pixel;    /* pixel value */
+       unsigned short red, green, blue;        /* rgb values */
+       char flags;     /* DoRed, DoGreen, DoBlue */    
+       char pad;
+} XColor;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The red, green, and blue values are always in the range 0 to 65535
+inclusive, independent of the number of bits actually used in the
+display hardware.
+The server scales these values down to the range used by the hardware.
+Black is represented by (0,0,0), 
+and white is represented by (65535,65535,65535).
+<indexterm><primary>Color</primary></indexterm>
+In some functions,
+the flags member controls which of the red, green, and blue members is used 
+and can be the inclusive OR of zero or more of
+<symbol>DoRed</symbol>,
+<symbol>DoGreen</symbol>,
+and 
+<symbol>DoBlue</symbol>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+Functions that operate on all color space values use an
+<structname>XcmsColor</structname>
+structure.
+This structure contains a union of substructures,
+each supporting color specification encoding for a particular color space.
+Like the
+<structname>XColor</structname>
+structure, the
+<structname>XcmsColor</structname>
+structure contains pixel
+and color specification information (the spec member in the 
+<structname>XcmsColor</structname>
+structure).
+<indexterm significance="preferred"><primary>XcmsColor</primary></indexterm>
+<!-- .sM -->
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .5i 1i 2.5i -->
+<!-- .ta .5i 1i 2.5i -->
+typedef unsigned long XcmsColorFormat;                 /* Color Specification Format */
+
+typedef struct {
+       union {
+               XcmsRGB RGB;
+               XcmsRGBi RGBi;
+               XcmsCIEXYZ CIEXYZ;
+               XcmsCIEuvY CIEuvY;
+               XcmsCIExyY CIExyY;
+               XcmsCIELab CIELab;
+               XcmsCIELuv CIELuv;
+               XcmsTekHVC TekHVC;
+               XcmsPad Pad;
+       } spec;
+       unsigned long pixel;
+       XcmsColorFormat format;
+} XcmsColor;                   /* Xcms Color Structure */
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+Because the color specification can be encoded for the various color spaces, 
+encoding for the spec member is identified by the format member,
+which is of type
+<type>XcmsColorFormat</type>.
+The following macros define standard formats.
+<!-- .sM -->
+</para>
+
+<literallayout class="monospaced">
+#define          XcmsUndefinedFormat   0x00000000
+#define          XcmsCIEXYZFormat      0x00000001  /* CIE XYZ */
+#define          XcmsCIEuvYFormat      0x00000002  /* CIE u'v'Y */
+#define          XcmsCIExyYFormat      0x00000003  /* CIE xyY */
+#define          XcmsCIELabFormat      0x00000004  /* CIE L*a*b* */
+#define          XcmsCIELuvFormat      0x00000005  /* CIE L*u*v* */
+#define          XcmsTekHVCFormat      0x00000006  /* TekHVC */
+#define          XcmsRGBFormat         0x80000000  /* RGB Device */
+#define          XcmsRGBiFormat        0x80000001  /* RGB Intensity */
+</literallayout>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+Formats for device-independent color spaces are
+distinguishable from those for device-dependent spaces by the 32nd bit.
+If this bit is set,
+it indicates that the color specification is in a device-dependent form;
+otherwise, it is in a device-independent form.
+If the 31st bit is set,
+this indicates that the color space has been added to Xlib at run time
+(see <link linkend="Creating_Additional_Color_Spaces">section 6.12.4</link>).
+The format value for a color space added at run time may be different each
+time the program is executed.
+If references to such a color space must be made outside the client
+(for example, storing a color specification in a file),
+then reference should be made by color space string prefix
+(see 
+<xref linkend='XcmsFormatOfPrefix' xrefstyle='select: title'/>
+and
+<xref linkend='XcmsPrefixOfFormat' xrefstyle='select: title'/>).
+</para>
+<para>
+<!-- .LP -->
+Data types that describe the color specification encoding for the various
+color spaces are defined as follows:
+<!-- .sM -->
+<indexterm significance="preferred"><primary>XcmsRGB</primary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef double XcmsFloat;
+
+typedef struct {
+       unsigned short red;     /* 0x0000 to 0xffff */
+       unsigned short green;   /* 0x0000 to 0xffff */
+       unsigned short blue;    /* 0x0000 to 0xffff */
+} XcmsRGB;             /* RGB Device */
+</literallayout>
+<indexterm significance="preferred"><primary>XcmsRGBi</primary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef struct {
+       XcmsFloat red;  /* 0.0 to 1.0 */
+       XcmsFloat green;        /* 0.0 to 1.0 */
+       XcmsFloat blue; /* 0.0 to 1.0 */
+} XcmsRGBi;            /* RGB Intensity */
+</literallayout>
+<indexterm significance="preferred"><primary>XcmsCIEXYZ</primary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef struct {
+       XcmsFloat X;
+       XcmsFloat Y;    /* 0.0 to 1.0 */
+       XcmsFloat Z;
+} XcmsCIEXYZ;          /* CIE XYZ */
+</literallayout>
+<indexterm significance="preferred"><primary>XcmsCIEuvY</primary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef struct {
+       XcmsFloat u_prime;      /* 0.0 to ~0.6 */
+       XcmsFloat v_prime;      /* 0.0 to ~0.6 */
+       XcmsFloat Y;    /* 0.0 to 1.0 */
+} XcmsCIEuvY;          /* CIE u'v'Y */
+</literallayout>
+<indexterm significance="preferred"><primary>XcmsCIExyY</primary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef struct {
+       XcmsFloat x;    /* 0.0 to ~.75 */
+       XcmsFloat y;    /* 0.0 to ~.85 */
+       XcmsFloat Y;    /* 0.0 to 1.0 */
+} XcmsCIExyY;          /* CIE xyY */
+</literallayout>
+<indexterm significance="preferred"><primary>XcmsCIELab</primary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef struct {
+       XcmsFloat L_star;       /* 0.0 to 100.0 */
+       XcmsFloat a_star;
+       XcmsFloat b_star;
+} XcmsCIELab;          /* CIE L*a*b* */
+</literallayout>
+<indexterm significance="preferred"><primary>XcmsCIELuv</primary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef struct {
+       XcmsFloat L_star;       /* 0.0 to 100.0 */
+       XcmsFloat u_star;
+       XcmsFloat v_star;
+} XcmsCIELuv;          /* CIE L*u*v* */
+</literallayout>
+<indexterm significance="preferred"><primary>XcmsTekHVC</primary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef struct {
+       XcmsFloat H;    /* 0.0 to 360.0 */
+       XcmsFloat V;    /* 0.0 to 100.0 */
+       XcmsFloat C;    /* 0.0 to 100.0 */
+} XcmsTekHVC;          /* TekHVC */
+</literallayout>
+<indexterm significance="preferred"><primary>XcmsPad</primary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef struct {
+       XcmsFloat pad0;
+       XcmsFloat pad1;
+       XcmsFloat pad2;
+       XcmsFloat pad3;
+} XcmsPad;             /* four doubles */
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The device-dependent formats provided allow color specification in:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+<acronym>RGB</acronym> Intensity
+(<structname>XcmsRGBi</structname>)
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Red, green, and blue linear intensity values,
+floating-point values from 0.0 to 1.0,
+where 1.0 indicates full intensity, 0.5 half intensity, and so on.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<acronym>RGB</acronym> Device
+(<structname>XcmsRGB</structname>)
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Red, green, and blue values appropriate for the specified output device.
+<structname>XcmsRGB</structname>
+values are of type unsigned short,
+scaled from 0 to 65535 inclusive,
+and are interchangeable with the red, green, and blue values in an 
+<structname>XColor</structname>
+structure. 
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+It is important to note that <acronym>RGB</acronym> Intensity values are not gamma corrected
+values.
+In contrast,
+<acronym>RGB</acronym> Device values generated as a result of converting color specifications 
+are always gamma corrected, and
+<acronym>RGB</acronym> Device values acquired as a result of querying a colormap
+or passed in by the client are assumed by Xlib to be gamma corrected.
+The term <emphasis remap='I'><acronym>RGB</acronym> value</emphasis> in this manual always refers to an <acronym>RGB</acronym> Device value.
+</para>
+</sect1>
+<sect1 id="Color_Strings">
+<title>Color Strings</title>
+<!-- .XS -->
+<!-- (SN Color Strings -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides a mechanism for using string names for colors.
+A color string may either contain an abstract color name
+or a numerical color specification.
+Color strings are case-insensitive.
+</para>
+<para>
+<!-- .LP -->
+Color strings are used in the following functions:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+<xref linkend='XAllocNamedColor' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XcmsAllocNamedColor' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XLookupColor' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XcmsLookupColor' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XParseColor' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XStoreNamedColor' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+Xlib supports the use of abstract color names, for example, red or blue.
+A value for this abstract name is obtained by searching one or more color
+name databases.
+Xlib first searches zero or more client-side databases;
+the number, location, and content of these databases is
+implementation-dependent and might depend on the current locale.
+If the name is not found, Xlib then looks for the color in the
+X server's database.
+If the color name is not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+</para>
+<para>
+<!-- .LP -->
+A numerical color specification
+consists of a color space name and a set of values in the following syntax:
+</para>
+<para>
+<!-- .LP -->
+<!-- .sM -->
+<literallayout class="monospaced">
+<emphasis remap='I'>&lt;color_space_name&gt;</emphasis>:<emphasis remap='I'>&lt;value&gt;/.../&lt;value&gt;</emphasis>
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The following are examples of valid color strings.
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+"CIEXYZ:0.3227/0.28133/0.2493"
+"RGBi:1.0/0.0/0.0"
+"rgb:00/ff/00"
+"CIELuv:50.0/0.0/0.0"
+</literallayout>
+The syntax and semantics of numerical specifications are given
+for each standard color space in the following sections.
+</para>
+<sect2 id="RGB_Device_String_Specification">
+<title><acronym>RGB</acronym> Device String Specification</title>
+<!-- .XS -->
+<!-- (SN <acronym>RGB</acronym> Device String Specification -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+An <acronym>RGB</acronym> Device specification is identified by
+the prefix ``rgb:'' and conforms to the following syntax:
+</para>
+<para>
+<!-- .LP -->
+<!-- .\" Start marker code here -->
+<literallayout class="monospaced">
+rgb:<emphasis remap='I'>&lt;red&gt;/&lt;green&gt;/&lt;blue&gt;</emphasis>
+
+    <emphasis remap='I'>&lt;red&gt;</emphasis>, <emphasis remap='I'>&lt;green&gt;</emphasis>, <emphasis remap='I'>&lt;blue&gt;</emphasis> := <emphasis remap='I'>h</emphasis> | <emphasis remap='I'>hh</emphasis> | <emphasis remap='I'>hhh</emphasis> | <emphasis remap='I'>hhhh</emphasis>
+    <emphasis remap='I'>h</emphasis> := single hexadecimal digits (case insignificant)
+</literallayout>
+<!-- .\" End marker code here -->
+</para>
+<para>
+<!-- .LP -->
+Note that <emphasis remap='I'>h</emphasis> indicates the value scaled in 4 bits, 
+<emphasis remap='I'>hh</emphasis> the value scaled in 8 bits,
+<emphasis remap='I'>hhh</emphasis> the value scaled in 12 bits,
+and <emphasis remap='I'>hhhh</emphasis> the value scaled in 16 bits, respectively.
+</para>
+<para>
+<!-- .LP -->
+Typical examples are the strings ``rgb:ea/75/52'' and ``rgb:ccc/320/320'',
+but mixed numbers of hexadecimal digit strings 
+(``rgb:ff/a5/0'' and ``rgb:ccc/32/0'')
+are also allowed.
+</para>
+<para>
+<!-- .LP -->
+For backward compatibility, an older syntax for <acronym>RGB</acronym> Device is
+supported, but its continued use is not encouraged.
+The syntax is an initial sharp sign character followed by
+a numeric specification, in one of the following formats:
+</para>
+<para>
+<!-- .LP -->
+<!-- .\" Start marker code here -->
+<literallayout class="monospaced">
+<!-- .TA 2i -->
+<!-- .ta 2i -->
+#RGB   (4 bits each)
+#RRGGBB        (8 bits each)
+#RRRGGGBBB     (12 bits each)
+#RRRRGGGGBBBB  (16 bits each)
+</literallayout>
+<!-- .\" End marker code here -->
+</para>
+<para>
+<!-- .LP -->
+The R, G, and B represent single hexadecimal digits.
+When fewer than 16 bits each are specified, 
+they represent the most significant bits of the value
+(unlike the ``rgb:'' syntax, in which values are scaled).
+For example, the string ``#3a7'' is the same as ``#3000a0007000''.
+</para>
+</sect2>
+<sect2 id="RGB_Intensity_String_Specification">
+<title><acronym>RGB</acronym> Intensity String Specification</title>
+<!-- .XS -->
+<!-- (SN RGB Intensity String Specification -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+An <acronym>RGB</acronym> intensity specification is identified
+by the prefix ``rgbi:'' and conforms to the following syntax:
+</para>
+<para>
+<!-- .LP -->
+<!-- .\" Start marker code here -->
+<literallayout class="monospaced">
+rgbi:<emphasis remap='I'>&lt;red&gt;/&lt;green&gt;/&lt;blue&gt;</emphasis>
+</literallayout>
+<!-- .\" End marker code here -->
+</para>
+<para>
+<!-- .LP -->
+Note that red, green, and blue are floating-point values
+between 0.0 and 1.0, inclusive.
+The input format for these values is an optional sign,
+a string of numbers possibly containing a decimal point,
+and an optional exponent field containing an E or e 
+followed by a possibly signed integer string.
+</para>
+</sect2>
+<sect2 id="Device_Independent_String_Specifications">
+<title>Device-Independent String Specifications</title>
+<!-- .XS -->
+<!-- (SN Device-Independent String Specifications -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The standard device-independent string specifications have
+the following syntax:
+</para>
+<para>
+<!-- .LP -->
+<!-- .\" Start marker code here -->
+<literallayout class="monospaced">
+CIEXYZ:<emphasis remap='I'>&lt;X&gt;/&lt;Y&gt;/&lt;Z&gt;</emphasis>
+CIEuvY:<emphasis remap='I'>&lt;u&gt;/&lt;v&gt;/&lt;Y&gt;</emphasis>
+CIExyY:<emphasis remap='I'>&lt;x&gt;/&lt;y&gt;/&lt;Y&gt;</emphasis>
+CIELab:<emphasis remap='I'>&lt;L&gt;/&lt;a&gt;/&lt;b&gt;</emphasis>
+CIELuv:<emphasis remap='I'>&lt;L&gt;/&lt;u&gt;/&lt;v&gt;</emphasis>
+TekHVC:<emphasis remap='I'>&lt;H&gt;/&lt;V&gt;/&lt;C&gt;</emphasis>
+</literallayout>
+<!-- .\" End marker code here -->
+</para>
+<para>
+<!-- .LP -->
+All of the values (C, H, V, X, Y, Z, a, b, u, v, y, x) are
+floating-point values.
+The syntax for these values is an optional plus or minus sign,
+a string of digits possibly containing a decimal point,
+and an optional exponent field consisting of an ``E'' or ``e''
+followed by an optional plus or minus followed by a string of digits.
+</para>
+</sect2>
+</sect1>
+<sect1 id="Color_Conversion_Contexts_and_Gamut_Mapping">
+<title>Color Conversion Contexts and Gamut Mapping</title>
+<!-- .XS -->
+<!-- (SN Color Conversion Contexts and Gamut Mapping -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+When Xlib converts device-independent color specifications
+into device-dependent specifications and vice versa,
+it uses knowledge about the color limitations of the screen hardware.
+This information, typically called the device profile,
+<indexterm><primary>Device profile</primary></indexterm>
+is available in a Color Conversion Context (CCC).
+<indexterm><primary>Color Conversion Context</primary></indexterm>
+<indexterm><primary>CCC</primary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+Because a specified color may be outside the color gamut of the target screen
+and the white point associated with the color specification may differ
+from the white point inherent to the screen,
+Xlib applies gamut mapping when it encounters certain conditions:
+<indexterm><primary>White point</primary></indexterm>
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+Gamut compression occurs when conversion of device-independent
+color specifications to device-dependent color specifications
+results in a color out of the target screen's gamut.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+White adjustment occurs when the inherent white point of the screen
+differs from the white point assumed by the client.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+Gamut handling methods are stored as callbacks in the CCC,
+which in turn are used by the color space conversion routines.
+Client data is also stored in the CCC for each callback.
+The CCC also contains the white point the client assumes to be
+associated with color specifications (that is, the Client White Point).
+<indexterm><primary>Client White Point</primary></indexterm>
+<indexterm><primary>Gamut compression</primary></indexterm>
+<indexterm><primary>Gamut handling</primary></indexterm>
+<indexterm><primary>White point adjustment</primary></indexterm>
+The client can specify the gamut handling callbacks and client data
+as well as the Client White Point.
+Xlib does not preclude the X client from performing other
+forms of gamut handling (for example, gamut expansion); 
+however, Xlib does not provide direct support for gamut handling
+other than white adjustment and gamut compression.
+</para>
+<para>
+<!-- .LP -->
+Associated with each colormap is an initial CCC transparently generated by
+Xlib.
+<indexterm><primary>Color Conversion Context</primary><secondary>creation</secondary></indexterm>
+Therefore,
+when you specify a colormap as an argument to an Xlib function,
+you are indirectly specifying a CCC.
+<indexterm><primary>CCC</primary><secondary>of colormap</secondary></indexterm>
+<indexterm><primary>Color Conversion Context</primary><secondary>of colormap</secondary></indexterm>
+There is a default CCC associated with each screen.
+Newly created CCCs inherit attributes from the default CCC,
+so the default CCC attributes can be modified to affect new CCCs.
+<indexterm><primary>CCC</primary><secondary>default</secondary></indexterm>
+<indexterm><primary>Color Conversion Context</primary><secondary>default</secondary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+Xcms functions in which gamut mapping can occur return
+<type>Status</type>
+and have specific status values defined for them, 
+as follows:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+<symbol>XcmsFailure</symbol>
+indicates that the function failed.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<symbol>XcmsSuccess</symbol>
+indicates that the function succeeded.
+In addition,
+if the function performed any color conversion,
+the colors did not need to be compressed.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<symbol>XcmsSuccessWithCompression</symbol>
+indicates the function performed color conversion
+and at least one of the colors needed to be compressed.
+The gamut compression method is determined by the gamut compression
+procedure in the CCC that is specified directly as a function argument
+or in the CCC indirectly specified by means of the colormap argument.
+    </para>
+  </listitem>
+</itemizedlist>
+</sect1>
+<sect1 id="Creating_Copying_and_Destroying_Colormaps">
+<title>Creating, Copying, and Destroying Colormaps</title>
+<!-- .XS -->
+<!-- (SN Creating, Copying, and Destroying Colormaps -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To create a colormap for a screen, use
+<xref linkend='XCreateColormap' xrefstyle='select: title'/>.</para>
+<indexterm significance="preferred"><primary>XCreateColormap</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XCreateColormap'>
+<funcprototype>
+  <funcdef>Colormap <function>XCreateColormap</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>Visual<parameter> *visual</parameter></paramdef>
+  <paramdef>int<parameter> alloc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Wi on whose screen you want to create a colormap -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window (Wi.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>visual</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a visual type supported on the screen.
+If the visual type is not one supported by the screen, 
+a
+<errorname>BadMatch</errorname>
+error results.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>alloc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the colormap entries to be allocated.
+You can pass 
+<symbol>AllocNone</symbol>
+or 
+<symbol>AllocAll</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XCreateColormap' xrefstyle='select: title'/>
+function creates a colormap of the specified visual type for the screen 
+on which the specified window resides and returns the colormap ID 
+associated with it.
+Note that the specified window is only used to determine the screen.
+</para>
+<para>
+<!-- .LP -->
+The initial values of the colormap entries are undefined for the 
+visual classes
+<symbol>GrayScale</symbol>,
+<symbol>PseudoColor</symbol>,
+and
+<symbol>DirectColor</symbol>.
+For
+<symbol>StaticGray</symbol>,
+<symbol>StaticColor</symbol>,
+and
+<symbol>TrueColor</symbol>,
+the entries have defined values,
+but those values are specific to the visual and are not defined by X.
+For
+<symbol>StaticGray</symbol>,
+<symbol>StaticColor</symbol>,
+and
+<symbol>TrueColor</symbol>,
+alloc must be
+<symbol>AllocNone</symbol>,
+or a
+<errorname>BadMatch</errorname>
+error results.
+For the other visual classes,
+if alloc is
+<symbol>AllocNone</symbol>,
+the colormap initially has no allocated entries,
+and clients can allocate them.
+For information about the visual types,
+see <link linkend="Visual_Types">section 3.1</link>.
+</para>
+<para>
+<!-- .LP -->
+If alloc is
+<symbol>AllocAll</symbol>,
+the entire colormap is allocated writable.
+The initial values of all allocated entries are undefined.
+For
+<symbol>GrayScale</symbol>
+and
+<symbol>PseudoColor</symbol>,
+the effect is as if an
+<xref linkend='XAllocColorCells' xrefstyle='select: title'/>
+call returned all pixel values from zero to N - 1,
+where N is the colormap entries value in the specified visual.
+For
+<symbol>DirectColor</symbol>,
+the effect is as if an
+<xref linkend='XAllocColorPlanes' xrefstyle='select: title'/>
+call returned a pixel value of zero and red_mask, green_mask, 
+and blue_mask values containing the same bits as the corresponding
+masks in the specified visual.
+However, in all cases,
+none of these entries can be freed by using
+<xref linkend='XFreeColors' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XCreateColormap' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>,
+<errorname>BadMatch</errorname>,
+<errorname>BadValue</errorname>,
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To create a new colormap when the allocation out of a previously
+shared colormap has failed because of resource exhaustion, use
+<xref linkend='XCopyColormapAndFree' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XCopyColormapAndFree</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XCopyColormapAndFree'>
+<funcprototype>
+  <funcdef>Colormap <function>XCopyColormapAndFree</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Colormap<parameter> colormap</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colormap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the colormap.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XCopyColormapAndFree' xrefstyle='select: title'/>
+function creates a colormap of the same visual type and for the same screen
+as the specified colormap and returns the new colormap ID.
+It also moves all of the client's existing allocation from the specified
+colormap to the new colormap with their color values intact 
+and their read-only or writable characteristics intact and frees those entries 
+in the specified colormap.
+Color values in other entries in the new colormap are undefined.
+If the specified colormap was created by the client with alloc set to
+<symbol>AllocAll</symbol>,
+the new colormap is also created with 
+<symbol>AllocAll</symbol>,
+all color values for all entries are copied from the specified colormap,
+and then all entries in the specified colormap are freed.
+If the specified colormap was not created by the client with
+<symbol>AllocAll</symbol>,
+the allocations to be moved are all those pixels and planes
+that have been allocated by the client using
+<xref linkend='XAllocColor' xrefstyle='select: title'/>,
+<xref linkend='XAllocNamedColor' xrefstyle='select: title'/>,
+<xref linkend='XAllocColorCells' xrefstyle='select: title'/>,
+or
+<xref linkend='XAllocColorPlanes' xrefstyle='select: title'/>
+and that have not been freed since they were allocated.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XCopyColormapAndFree' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>
+and
+<errorname>BadColor</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To destroy a colormap, use 
+<xref linkend='XFreeColormap' xrefstyle='select: title'/>.
+<indexterm significance="preferred"><primary>XFreeColormap</primary></indexterm>
+</para>
+<!-- .sM -->
+<funcsynopsis id='XFreeColormap'>
+<funcprototype>
+  <funcdef><function>XFreeColormap</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Colormap<parameter> colormap</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Cm that you want to destroy -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colormap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the colormap (Cm.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XFreeColormap' xrefstyle='select: title'/>
+function deletes the association between the colormap resource ID 
+and the colormap and frees the colormap storage.
+However, this function has no effect on the default colormap for a screen.
+If the specified colormap is an installed map for a screen,
+it is uninstalled (see
+<xref linkend='XUninstallColormap' xrefstyle='select: title'/>).
+If the specified colormap is defined as the colormap for a window (by
+<xref linkend='XCreateWindow' xrefstyle='select: title'/>,
+<xref linkend='XSetWindowColormap' xrefstyle='select: title'/>,
+or
+<xref linkend='XChangeWindowAttributes' xrefstyle='select: title'/>),
+<xref linkend='XFreeColormap' xrefstyle='select: title'/>
+changes the colormap associated with the window to
+<symbol>None</symbol>
+and generates a
+<symbol>ColormapNotify</symbol>
+event.
+X does not define the colors displayed for a window with a colormap of
+<symbol>None</symbol>.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XFreeColormap' xrefstyle='select: title'/>
+can generate a
+<errorname>BadColor</errorname>
+error.
+</para>
+</sect1>
+<sect1 id="Mapping_Color_Names_to_Values">
+<title>Mapping Color Names to Values</title>
+<!-- .XS -->
+<!-- (SN Mapping Color Names to Values -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To map a color name to an <acronym>RGB</acronym> value, use
+<xref linkend='XLookupColor' xrefstyle='select: title'/>.
+<indexterm><primary>Color</primary><secondary>naming</secondary></indexterm>
+<indexterm significance="preferred"><primary>XLookupColor</primary></indexterm>
+<!-- .sM -->
+</para>
+<funcsynopsis id='XLookupColor'>
+<funcprototype>
+  <funcdef>Status <function>XLookupColor</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Colormap<parameter> colormap</parameter></paramdef>
+  <paramdef>char<parameter> *color_name</parameter></paramdef>
+  <paramdef>XColor*exact_def_return,<parameter> *screen_def_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colormap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the colormap.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color_name</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the color name string (for example, red) whose color 
+definition structure you want returned.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>exact_def_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the exact <acronym>RGB</acronym> values.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen_def_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the closest <acronym>RGB</acronym> values provided by the hardware.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XLookupColor' xrefstyle='select: title'/>
+function looks up the string name of a color with respect to the screen
+associated with the specified colormap.
+It returns both the exact color values and
+the closest values provided by the screen 
+with respect to the visual type of the specified colormap.
+If the color name is not in the Host Portable Character Encoding, 
+the result is implementation-dependent.
+Use of uppercase or lowercase does not matter.
+<xref linkend='XLookupColor' xrefstyle='select: title'/>
+returns nonzero if the name is resolved;
+otherwise, it returns zero.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XLookupColor' xrefstyle='select: title'/>
+can generate a
+<errorname>BadColor</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To map a color name to the exact <acronym>RGB</acronym> value, use
+<xref linkend='XParseColor' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Color</primary><secondary>naming</secondary></indexterm>
+<indexterm significance="preferred"><primary>XParseColor</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XParseColor'>
+<funcprototype>
+  <funcdef>Status <function>XParseColor</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Colormap<parameter> colormap</parameter></paramdef>
+  <paramdef>char<parameter> *spec</parameter></paramdef>
+  <paramdef>XColor<parameter> *exact_def_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colormap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the colormap.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>spec</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the color name string;
+case is ignored.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>exact_def_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the exact color value for later use and sets the
+<symbol>DoRed</symbol>,
+<symbol>DoGreen</symbol>,
+and
+<symbol>DoBlue</symbol>
+flags.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XParseColor' xrefstyle='select: title'/>
+function looks up the string name of a color with respect to the screen
+associated with the specified colormap.
+It returns the exact color value.
+If the color name is not in the Host Portable Character Encoding, 
+the result is implementation-dependent.
+Use of uppercase or lowercase does not matter.
+<xref linkend='XParseColor' xrefstyle='select: title'/>
+returns nonzero if the name is resolved;
+otherwise, it returns zero.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XParseColor' xrefstyle='select: title'/>
+can generate a
+<errorname>BadColor</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To map a color name to a value in an arbitrary color space, use
+<xref linkend='XcmsLookupColor' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Color</primary><secondary>naming</secondary></indexterm>
+<indexterm significance="preferred"><primary>XcmsLookupColor</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsLookupColor'>
+<funcprototype>
+  <funcdef>Status <function>XcmsLookupColor</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Colormap<parameter> colormap</parameter></paramdef>
+  <paramdef>char<parameter> *color_string</parameter></paramdef>
+  <paramdef>XcmsColor*color_exact_return,<parameter> *color_screen_return</parameter></paramdef>
+  <paramdef>XcmsColorFormat<parameter> result_format</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colormap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the colormap.
+<!-- .ds St -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color_string</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the color string(St.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color_exact_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the color specification parsed from the color string
+or parsed from the corresponding string found in a color-name database.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color_screen_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the color that can be reproduced on the screen.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>result_format</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the color format for the returned color
+specifications (color_screen_return and color_exact_return arguments).
+If the format is
+<symbol>XcmsUndefinedFormat</symbol>
+and the color string contains a
+numerical color specification,
+the specification is returned in the format used in that numerical
+color specification.
+If the format is
+<symbol>XcmsUndefinedFormat</symbol>
+and the color string contains a color name,
+the specification is returned in the format used 
+to store the color in the database.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XcmsLookupColor' xrefstyle='select: title'/>
+function looks up the string name of a color with respect to the screen
+associated with the specified colormap.
+It returns both the exact color values and
+the closest values provided by the screen 
+with respect to the visual type of the specified colormap.
+The values are returned in the format specified by result_format.
+If the color name is not in the Host Portable Character Encoding, 
+the result is implementation-dependent.
+Use of uppercase or lowercase does not matter.
+<xref linkend='XcmsLookupColor' xrefstyle='select: title'/>
+returns
+<symbol>XcmsSuccess</symbol>
+or
+<symbol>XcmsSuccessWithCompression</symbol>
+if the name is resolved; otherwise, it returns
+<symbol>XcmsFailure</symbol>.
+If
+<symbol>XcmsSuccessWithCompression</symbol>
+is returned, the color specification returned in 
+color_screen_return is the result of gamut compression.
+</para>
+</sect1>
+
+<sect1 id="Allocating_and_Freeing_Color_Cells">
+<title>Allocating and Freeing Color Cells</title>
+<!-- .XS -->
+<!-- (SN Allocating and Freeing Color Cells -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+There are two ways of allocating color cells: 
+explicitly as read-only entries, one pixel value at a time,
+or read/write,
+where you can allocate a number of color cells and planes simultaneously.
+<indexterm><primary>Read-only colormap cells</primary></indexterm>
+A read-only cell has its <acronym>RGB</acronym> value set by the server.
+<indexterm><primary>Read/write colormap cells</primary></indexterm>
+Read/write cells do not have defined colors initially;
+functions described in the next section must be used to store values into them.
+Although it is possible for any client to store values into a read/write
+cell allocated by another client,
+read/write cells normally should be considered private to the client
+that allocated them.
+</para>
+<para>
+<!-- .LP -->
+Read-only colormap cells are shared among clients.
+The server counts each allocation and freeing of the cell by clients.
+When the last client frees a shared cell, the cell is finally deallocated.
+If a single client allocates the same read-only cell multiple
+times, the server counts each such allocation, not just the first one.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To allocate a read-only color cell with an <acronym>RGB</acronym> value, use
+<xref linkend='XAllocColor' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Allocation</primary><secondary>read-only colormap cells</secondary></indexterm>
+<indexterm><primary>Read-only colormap cells</primary><secondary>allocating</secondary></indexterm>
+<indexterm><primary>Color</primary><secondary>allocation</secondary></indexterm>
+<indexterm significance="preferred"><primary>XAllocColor</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XAllocColor'>
+<funcprototype>
+  <funcdef>Status <function>XAllocColor</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Colormap<parameter> colormap</parameter></paramdef>
+  <paramdef>XColor<parameter> *screen_in_out</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colormap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the colormap.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen_in_out</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies and returns the values actually used in the colormap.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XAllocColor' xrefstyle='select: title'/>
+function allocates a read-only colormap entry corresponding to the closest
+<acronym>RGB</acronym> value supported by the hardware.
+<xref linkend='XAllocColor' xrefstyle='select: title'/>
+returns the pixel value of the color closest to the specified
+<acronym>RGB</acronym> elements supported by the hardware
+and returns the <acronym>RGB</acronym> value actually used.
+The corresponding colormap cell is read-only.
+In addition,
+<xref linkend='XAllocColor' xrefstyle='select: title'/>
+returns nonzero if it succeeded or zero if it failed.
+<indexterm><primary>Color map</primary></indexterm>
+<indexterm><primary>Color</primary><secondary>allocation</secondary></indexterm>
+<indexterm><primary>Allocation</primary><secondary>colormap</secondary></indexterm>
+<indexterm><primary>read-only colormap cells</primary></indexterm>
+Multiple clients that request the same effective <acronym>RGB</acronym> value can be assigned
+the same read-only entry, thus allowing entries to be shared.
+When the last client deallocates a shared cell, it is deallocated.
+<xref linkend='XAllocColor' xrefstyle='select: title'/>
+does not use or affect the flags in the
+<structname>XColor</structname>
+structure.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XAllocColor' xrefstyle='select: title'/>
+can generate a
+<errorname>BadColor</errorname>
+error.
+<!-- .EQ -->
+delim %%
+<!-- .EN -->
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To allocate a read-only color cell with a color in arbitrary format, use
+<xref linkend='XcmsAllocColor' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Allocation</primary><secondary>read-only colormap cells</secondary></indexterm>
+<indexterm><primary>Read-only colormap cells</primary><secondary>allocating</secondary></indexterm>
+<indexterm><primary>Color</primary><secondary>allocation</secondary></indexterm>
+<indexterm significance="preferred"><primary>XcmsAllocColor</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsAllocColor'>
+<funcprototype>
+  <funcdef>Status <function>XcmsAllocColor</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Colormap<parameter> colormap</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> *color_in_out</parameter></paramdef>
+  <paramdef>XcmsColorFormat<parameter> result_format</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colormap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the colormap.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color_in_out</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the color to allocate and returns the pixel and color 
+that is actually used in the colormap.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>result_format</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the color format for the returned color specification.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XcmsAllocColor' xrefstyle='select: title'/>
+function is similar to
+<xref linkend='XAllocColor' xrefstyle='select: title'/>
+except the color can be specified in any format.
+The
+<xref linkend='XcmsAllocColor' xrefstyle='select: title'/>
+function ultimately calls 
+<xref linkend='XAllocColor' xrefstyle='select: title'/>
+to allocate a read-only color cell (colormap entry) with the specified color.
+<xref linkend='XcmsAllocColor' xrefstyle='select: title'/>
+first converts the color specified
+to an <acronym>RGB</acronym> value and then passes this to
+<xref linkend='XAllocColor' xrefstyle='select: title'/>.
+<xref linkend='XcmsAllocColor' xrefstyle='select: title'/>
+returns the pixel value of the color cell and the color specification
+actually allocated.
+This returned color specification is the result of converting the <acronym>RGB</acronym> value
+returned by 
+<xref linkend='XAllocColor' xrefstyle='select: title'/>
+into the format specified with the result_format argument.
+If there is no interest in a returned color specification, 
+unnecessary computation can be bypassed if result_format is set to
+<symbol>XcmsRGBFormat</symbol>.
+The corresponding colormap cell is read-only.
+If this routine returns 
+<symbol>XcmsFailure</symbol>,
+the color_in_out color specification is left unchanged.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XcmsAllocColor' xrefstyle='select: title'/>
+can generate a
+<errorname>BadColor</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To allocate a read-only color cell using a color name and return the closest
+color supported by the hardware in <acronym>RGB</acronym> format, use
+<xref linkend='XAllocNamedColor' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Allocation</primary><secondary>read-only colormap cells</secondary></indexterm>
+<indexterm><primary>Read-only colormap cells</primary><secondary>allocating</secondary></indexterm>
+<indexterm><primary>Color</primary><secondary>naming</secondary></indexterm>
+<indexterm><primary>Color</primary><secondary>allocation</secondary></indexterm>
+<indexterm significance="preferred"><primary>XAllocNamedColor</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XAllocNamedColor'>
+<funcprototype>
+  <funcdef>Status <function>XAllocNamedColor</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Colormap<parameter> colormap</parameter></paramdef>
+  <paramdef>char<parameter> *color_name</parameter></paramdef>
+  <paramdef>XColor*screen_def_return,<parameter> *exact_def_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colormap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the colormap.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color_name</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the color name string (for example, red) whose color 
+definition structure you want returned.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen_def_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the closest <acronym>RGB</acronym> values provided by the hardware.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>exact_def_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the exact <acronym>RGB</acronym> values.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XAllocNamedColor' xrefstyle='select: title'/>
+function looks up the named color with respect to the screen that is
+associated with the specified colormap.
+It returns both the exact database definition and
+the closest color supported by the screen.
+The allocated color cell is read-only.
+The pixel value is returned in screen_def_return.
+If the color name is not in the Host Portable Character Encoding, 
+the result is implementation-dependent.
+Use of uppercase or lowercase does not matter.
+If screen_def_return and exact_def_return
+point to the same structure, the pixel field will be set correctly,
+but the color values are undefined.
+<xref linkend='XAllocNamedColor' xrefstyle='select: title'/>
+returns nonzero if a cell is allocated;
+otherwise, it returns zero.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XAllocNamedColor' xrefstyle='select: title'/>
+can generate a
+<errorname>BadColor</errorname>
+error. 
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To allocate a read-only color cell using a color name and return the closest
+color supported by the hardware in an arbitrary format, use
+<xref linkend='XcmsAllocNamedColor' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Allocation</primary><secondary>read-only colormap cells</secondary></indexterm>
+<indexterm><primary>Read-only colormap cells</primary><secondary>allocating</secondary></indexterm>
+<indexterm><primary>Color</primary><secondary>naming</secondary></indexterm>
+<indexterm><primary>Color</primary><secondary>allocation</secondary></indexterm>
+<indexterm significance="preferred"><primary>XcmsAllocNamedColor</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsAllocNamedColor'>
+<funcprototype>
+  <funcdef>Status <function>XcmsAllocNamedColor</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Colormap<parameter> colormap</parameter></paramdef>
+  <paramdef>char<parameter> *color_string</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> *color_screen_return</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> *color_exact_return</parameter></paramdef>
+  <paramdef>XcmsColorFormat<parameter> result_format</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colormap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the colormap.
+<!-- .ds St \ whose color definition structure is to be returned -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color_string</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the color string(St.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color_screen_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the pixel value of the color cell and color specification 
+that actually is stored for that cell.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color_exact_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the color specification parsed from the color string
+or parsed from the corresponding string found in a color-name database.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>result_format</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the color format for the returned color
+specifications (color_screen_return and color_exact_return arguments).
+If the format is
+<symbol>XcmsUndefinedFormat</symbol>
+and the color string contains a
+numerical color specification,
+the specification is returned in the format used in that numerical
+color specification.
+If the format is
+<symbol>XcmsUndefinedFormat</symbol>
+and the color string contains a color name,
+the specification is returned in the format used 
+to store the color in the database.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XcmsAllocNamedColor' xrefstyle='select: title'/>
+function is similar to
+<xref linkend='XAllocNamedColor' xrefstyle='select: title'/>
+except that the color returned can be in any format specified.
+This function
+ultimately calls
+<xref linkend='XAllocColor' xrefstyle='select: title'/>
+to allocate a read-only color cell with
+the color specified by a color string.
+The color string is parsed into an
+<structname>XcmsColor</structname>
+structure (see
+<xref linkend='XcmsLookupColor' xrefstyle='select: title'/>),
+converted
+to an <acronym>RGB</acronym> value, and finally passed to
+<xref linkend='XAllocColor' xrefstyle='select: title'/>.
+If the color name is not in the Host Portable Character Encoding, 
+the result is implementation-dependent.
+Use of uppercase or lowercase does not matter.
+</para>
+<para>
+<!-- .LP -->
+This function returns both the color specification as a result
+of parsing (exact specification) and the actual color specification
+stored (screen specification).
+This screen specification is the result of converting the <acronym>RGB</acronym> value
+returned by
+<xref linkend='XAllocColor' xrefstyle='select: title'/>
+into the format specified in result_format.
+If there is no interest in a returned color specification,
+unnecessary computation can be bypassed if result_format is set to
+<symbol>XcmsRGBFormat</symbol>.
+If color_screen_return and color_exact_return
+point to the same structure, the pixel field will be set correctly,
+but the color values are undefined.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XcmsAllocNamedColor' xrefstyle='select: title'/>
+can generate a
+<errorname>BadColor</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To allocate read/write color cell and color plane combinations for a
+<symbol>PseudoColor</symbol>
+model, use
+<xref linkend='XAllocColorCells' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Read/write colormap cells</primary><secondary>allocating</secondary></indexterm>
+<indexterm><primary>Allocation</primary><secondary>read/write colormap cells</secondary></indexterm>
+<indexterm><primary>Color</primary><secondary>allocation</secondary></indexterm>
+<indexterm significance="preferred"><primary>XAllocColorCells</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XAllocColorCells'>
+<funcprototype>
+  <funcdef>Status <function>XAllocColorCells</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Colormap<parameter> colormap</parameter></paramdef>
+  <paramdef>Bool<parameter> contig</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> plane_masks_return[]</parameter></paramdef>
+  <paramdef>unsignedint<parameter> nplanes</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> pixels_return[]</parameter></paramdef>
+  <paramdef>unsignedint<parameter> npixels</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colormap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the colormap.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>contig</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a Boolean value that indicates whether the planes must be contiguous.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>plane_mask_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns an array of plane masks.
+<!-- .\" *** JIM: NEED MORE INFO FOR THIS. *** -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nplanes</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of plane masks that are to be returned in the plane masks 
+array. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>pixels_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns an array of pixel values. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>npixels</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of pixel values that are to be returned in the 
+pixels_return array. 
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XAllocColorCells' xrefstyle='select: title'/>
+function allocates read/write color cells.
+The number of colors must be positive and the number of planes nonnegative,
+or a
+<errorname>BadValue</errorname>
+error results.
+If ncolors and nplanes are requested, 
+then ncolors pixels
+and nplane plane masks are returned.
+No mask will have any bits set to 1 in common with
+any other mask or with any of the pixels.
+By ORing together each pixel with zero or more masks,
+ncolors &times; 2<superscript><emphasis>nplanes</emphasis></superscript>
+distinct pixels can be produced.
+All of these are
+allocated writable by the request.
+For 
+<symbol>GrayScale</symbol>
+or 
+<symbol>PseudoColor</symbol>,
+each mask has exactly one bit set to 1. 
+For 
+<symbol>DirectColor</symbol>,
+each has exactly three bits set to 1.
+If contig is 
+<symbol>True</symbol>
+and if all masks are ORed
+together, a single contiguous set of bits set to 1 will be formed for 
+<symbol>GrayScale</symbol>
+or 
+<symbol>PseudoColor</symbol>
+and three contiguous sets of bits set to 1 (one within each
+pixel subfield) for 
+<symbol>DirectColor</symbol>.
+The <acronym>RGB</acronym> values of the allocated
+entries are undefined.
+<xref linkend='XAllocColorCells' xrefstyle='select: title'/>
+returns nonzero if it succeeded or zero if it failed.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XAllocColorCells' xrefstyle='select: title'/>
+can generate
+<errorname>BadColor</errorname>
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To allocate read/write color resources for a
+<symbol>DirectColor</symbol>
+model, use
+<xref linkend='XAllocColorPlanes' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Read/write colormap planes</primary><secondary>allocating</secondary></indexterm>
+<indexterm><primary>Allocation</primary><secondary>read/write colormap planes</secondary></indexterm>
+<indexterm><primary>Color</primary><secondary>allocation</secondary></indexterm>
+<indexterm significance="preferred"><primary>XAllocColorPlanes</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XAllocColorPlanes'>
+<funcprototype>
+  <funcdef>Status <function>XAllocColorPlanes</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Colormap<parameter> colormap</parameter></paramdef>
+  <paramdef>Bool<parameter> contig</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> pixels_return[]</parameter></paramdef>
+  <paramdef>int<parameter> ncolors</parameter></paramdef>
+  <paramdef>intnreds,ngreens,<parameter> nblues</parameter></paramdef>
+  <paramdef>unsignedlong*rmask_return,*gmask_return,<parameter> *bmask_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colormap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the colormap.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>contig</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a Boolean value that indicates whether the planes must be contiguous.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>pixels_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns an array of pixel values. 
+<xref linkend='XAllocColorPlanes' xrefstyle='select: title'/>
+returns the pixel values in this array.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ncolors</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of pixel values that are to be returned in the 
+pixels_return array. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nreds</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ngreens</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nblues</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+Specify the number of red, green, and blue planes.
+The value you pass must be nonnegative. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>rmask_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gmask_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>bmask_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Return bit masks for the red, green, and blue planes.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The specified ncolors must be positive; 
+and nreds, ngreens, and nblues must be nonnegative,
+or a
+<errorname>BadValue</errorname>
+error results.
+If ncolors colors, nreds reds, ngreens greens, and nblues blues are requested, 
+ncolors pixels are returned; and the masks have nreds, ngreens, and 
+nblues bits set to 1, respectively.
+If contig is 
+<symbol>True</symbol>,
+each mask will have
+a contiguous set of bits set to 1.
+No mask will have any bits set to 1 in common with
+any other mask or with any of the pixels.
+For 
+<symbol>DirectColor</symbol>,
+each mask
+will lie within the corresponding pixel subfield.
+By ORing together
+subsets of masks with each pixel value, 
+ncolors &times; 2<superscript><emphasis>(nreds+ngreens+nblues)</emphasis></superscript>
+distinct pixel values can be produced.
+All of these are allocated by the request.
+However, in the
+colormap, there are only
+ncolors &times; 2<superscript><emphasis>nreds</emphasis></superscript>
+independent red entries,
+ncolors &times; 2<superscript><emphasis>ngreens</emphasis></superscript>
+independent green entries, and
+ncolors &times; 2<superscript><emphasis>nblues</emphasis></superscript>
+independent blue entries.
+This is true even for 
+<symbol>PseudoColor</symbol>.
+When the colormap entry of a pixel
+value is changed (using 
+<xref linkend='XStoreColors' xrefstyle='select: title'/>,
+<xref linkend='XStoreColor' xrefstyle='select: title'/>,
+or 
+<xref linkend='XStoreNamedColor' xrefstyle='select: title'/>),
+the pixel is decomposed according to the masks, 
+and the corresponding independent entries are updated.
+<xref linkend='XAllocColorPlanes' xrefstyle='select: title'/>
+returns nonzero if it succeeded or zero if it failed.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XAllocColorPlanes' xrefstyle='select: title'/>
+can generate
+<errorname>BadColor</errorname>
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+<indexterm><primary>Freeing</primary><secondary>colors</secondary></indexterm>
+To free colormap cells, use
+<xref linkend='XFreeColors' xrefstyle='select: title'/>.
+<indexterm significance="preferred"><primary>XFreeColors</primary></indexterm>
+<indexterm><primary>Color</primary><secondary>deallocation</secondary></indexterm>
+<!-- .sM -->
+</para>
+<funcsynopsis id='XFreeColors'>
+<funcprototype>
+  <funcdef><function>XFreeColors</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Colormap<parameter> colormap</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> pixels[]</parameter></paramdef>
+  <paramdef>int<parameter> npixels</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> planes</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colormap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the colormap.
+<!-- .ds Pi that map to the cells in the specified colormap -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>pixels</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies an array of pixel values (Pi. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>npixels</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of pixels. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>planes</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the planes you want to free.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XFreeColors' xrefstyle='select: title'/>
+function frees the cells represented by pixels whose values are in the
+pixels array.
+The planes argument should not have any bits set to 1 in common with any of the
+pixels. 
+The set of all pixels is produced by ORing together subsets of
+the planes argument with the pixels.
+The request frees all of these pixels that
+were allocated by the client (using 
+<indexterm><primary>XAllocColor</primary></indexterm>
+<indexterm><primary>XAllocNamedColor</primary></indexterm>
+<indexterm><primary>XAllocColorCells</primary></indexterm>
+<indexterm><primary>XAllocColorPlanes</primary></indexterm>
+<xref linkend='XAllocColor' xrefstyle='select: title'/>,
+<xref linkend='XAllocNamedColor' xrefstyle='select: title'/>,
+<xref linkend='XAllocColorCells' xrefstyle='select: title'/>,
+and 
+<xref linkend='XAllocColorPlanes' xrefstyle='select: title'/>).
+Note that freeing an
+individual pixel obtained from 
+<xref linkend='XAllocColorPlanes' xrefstyle='select: title'/>
+may not actually allow
+it to be reused until all of its related pixels are also freed.
+Similarly,
+a read-only entry is not actually freed until it has been freed by all clients,
+and if a client allocates the same read-only entry multiple times,
+it must free the entry that many times before the entry is actually freed.
+</para>
+<para>
+<!-- .LP -->
+All specified pixels that are allocated by the client in the colormap are
+freed, even if one or more pixels produce an error. 
+If a specified pixel is not a valid index into the colormap, a 
+<errorname>BadValue</errorname>
+error results.
+If a specified pixel is not allocated by the
+client (that is, is unallocated or is only allocated by another client)
+or if the colormap was created with all entries writable (by passing
+<symbol>AllocAll</symbol>
+to
+<xref linkend='XCreateColormap' xrefstyle='select: title'/>),
+a
+<errorname>BadAccess</errorname>
+error results. 
+If more than one pixel is in error, 
+the one that gets reported is arbitrary.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XFreeColors' xrefstyle='select: title'/>
+can generate
+<errorname>BadAccess</errorname>,
+<errorname>BadColor</errorname>,
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+</sect1>
+<sect1 id="Modifying_and_Querying_Colormap_Cells">
+<title>Modifying and Querying Colormap Cells</title>
+<!-- .XS -->
+<!-- (SN Modifying and Querying Colormap Cells  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To store an <acronym>RGB</acronym> value in a single colormap cell, use
+<xref linkend='XStoreColor' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Color</primary><secondary>storing</secondary></indexterm>
+<indexterm significance="preferred"><primary>XStoreColor</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XStoreColor'>
+<funcprototype>
+  <funcdef><function>XStoreColor</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Colormap<parameter> colormap</parameter></paramdef>
+  <paramdef>XColor<parameter> *color</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colormap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the colormap.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the pixel and <acronym>RGB</acronym> values.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XStoreColor' xrefstyle='select: title'/>
+function changes the colormap entry of the pixel value specified in the
+pixel member of the
+<structname>XColor</structname>
+structure.
+You specified this value in the
+pixel member of the
+<structname>XColor</structname>
+structure.
+This pixel value must be a read/write cell and a valid index into the colormap.
+If a specified pixel is not a valid index into the colormap,
+a
+<errorname>BadValue</errorname>
+error results.
+<xref linkend='XStoreColor' xrefstyle='select: title'/>
+also changes the red, green, and/or blue color components.
+You specify which color components are to be changed by setting
+<symbol>DoRed</symbol>,
+<symbol>DoGreen</symbol>,
+and/or
+<symbol>DoBlue</symbol>
+in the flags member of the
+<structname>XColor</structname>
+structure.
+If the colormap is an installed map for its screen, 
+the changes are visible immediately.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XStoreColor' xrefstyle='select: title'/>
+can generate
+<errorname>BadAccess</errorname>,
+<errorname>BadColor</errorname>,
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To store multiple <acronym>RGB</acronym> values in multiple colormap cells, use
+<xref linkend='XStoreColors' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Color</primary><secondary>storing</secondary></indexterm>
+<indexterm significance="preferred"><primary>XStoreColors</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XStoreColors'>
+<funcprototype>
+  <funcdef><function>XStoreColors</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Colormap<parameter> colormap</parameter></paramdef>
+  <paramdef>XColor<parameter> color[]</parameter></paramdef>
+  <paramdef>int<parameter> ncolors</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colormap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the colormap.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies an array of color definition structures to be stored.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ncolors</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .\"Specifies the number of color definition structures.  -->
+Specifies the number of 
+<structname>XColor</structname>
+structures in the color definition array.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XStoreColors' xrefstyle='select: title'/>
+function changes the colormap entries of the pixel values
+specified in the pixel members of the
+<structname>XColor</structname>
+structures.
+You specify which color components are to be changed by setting 
+<symbol>DoRed</symbol>,
+<symbol>DoGreen</symbol>,
+and/or
+<symbol>DoBlue</symbol>
+in the flags member of the
+<structname>XColor</structname>
+structures.
+If the colormap is an installed map for its screen, the
+changes are visible immediately.
+<xref linkend='XStoreColors' xrefstyle='select: title'/>
+changes the specified pixels if they are allocated writable in the colormap 
+by any client, even if one or more pixels generates an error.
+If a specified pixel is not a valid index into the colormap, a
+<errorname>BadValue</errorname>
+error results.
+If a specified pixel either is unallocated or is allocated read-only, a
+<errorname>BadAccess</errorname>
+error results.
+If more than one pixel is in error, 
+the one that gets reported is arbitrary.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XStoreColors' xrefstyle='select: title'/>
+can generate
+<errorname>BadAccess</errorname>,
+<errorname>BadColor</errorname>,
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To store a color of arbitrary format in a single colormap cell, use
+<xref linkend='XcmsStoreColor' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Color</primary><secondary>storing</secondary></indexterm>
+<indexterm significance="preferred"><primary>XcmsStoreColor</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsStoreColor'>
+<funcprototype>
+  <funcdef>Status <function>XcmsStoreColor</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Colormap<parameter> colormap</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> *color</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colormap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the colormap.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the color cell and the color to store.
+Values specified in this
+<structname>XcmsColor</structname>
+structure remain unchanged on return.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XcmsStoreColor' xrefstyle='select: title'/>
+function converts the color specified in the
+<structname>XcmsColor</structname>
+structure into <acronym>RGB</acronym> values.
+It then uses this <acronym>RGB</acronym> specification in an
+<structname>XColor</structname>
+structure, whose three flags 
+(<symbol>DoRed</symbol>,
+<symbol>DoGreen</symbol>,
+and
+<symbol>DoBlue</symbol>)
+are set, in a call to
+<xref linkend='XStoreColor' xrefstyle='select: title'/>
+to change the color cell specified by the pixel member of the
+<structname>XcmsColor</structname>
+structure.
+This pixel value must be a valid index for the specified colormap,
+and the color cell specified by the pixel value must be a read/write cell.
+If the pixel value is not a valid index, a
+<errorname>BadValue</errorname>
+error results.
+If the color cell is unallocated or is allocated read-only, a
+<errorname>BadAccess</errorname>
+error results.
+If the colormap is an installed map for its screen, 
+the changes are visible immediately.
+</para>
+<para>
+<!-- .LP -->
+Note that 
+<xref linkend='XStoreColor' xrefstyle='select: title'/>
+has no return value; therefore, an
+<symbol>XcmsSuccess</symbol>
+return value from this function indicates that the conversion 
+to <acronym>RGB</acronym> succeeded and the call to
+<xref linkend='XStoreColor' xrefstyle='select: title'/>
+was made.
+To obtain the actual color stored, use
+<xref linkend='XcmsQueryColor' xrefstyle='select: title'/>.
+Because of the screen's hardware limitations or gamut compression,
+the color stored in the colormap may not be identical
+to the color specified.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XcmsStoreColor' xrefstyle='select: title'/>
+can generate
+<errorname>BadAccess</errorname>,
+<errorname>BadColor</errorname>,
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To store multiple colors of arbitrary format in multiple colormap cells, use
+<xref linkend='XcmsStoreColors' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Color</primary><secondary>storing</secondary></indexterm>
+<indexterm significance="preferred"><primary>XcmsStoreColors</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsStoreColors'>
+<funcprototype>
+  <funcdef>Status <function>XcmsStoreColors</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Colormap<parameter> colormap</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> colors[]</parameter></paramdef>
+  <paramdef>int<parameter> ncolors</parameter></paramdef>
+  <paramdef>Bool<parameter> compression_flags_return[]</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colormap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the colormap.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colors</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the color specification array of
+<structname>XcmsColor</structname>
+structures, each specifying a color cell and the color to store in that
+cell.
+Values specified in the array remain unchanged upon return.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ncolors</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of 
+<structname>XcmsColor</structname>
+structures in the color-specification array.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>compression_flags_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns an array of Boolean values indicating compression status.
+If a non-NULL pointer is supplied,
+each element of the array is set to
+<symbol>True</symbol>
+if the corresponding color was compressed and
+<symbol>False</symbol>
+otherwise.
+Pass NULL if the compression status is not useful.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XcmsStoreColors' xrefstyle='select: title'/>
+function converts the colors specified in the array of
+<structname>XcmsColor</structname>
+structures into <acronym>RGB</acronym> values and then uses these <acronym>RGB</acronym> specifications in
+<structname>XColor</structname>
+structures, whose three flags 
+(<symbol>DoRed</symbol>,
+<symbol>DoGreen</symbol>,
+and
+<symbol>DoBlue</symbol>)
+are set, in a call to
+<xref linkend='XStoreColors' xrefstyle='select: title'/>
+to change the color cells specified by the pixel member of the corresponding
+<structname>XcmsColor</structname>
+structure.
+Each pixel value must be a valid index for the specified colormap,
+and the color cell specified by each pixel value must be a read/write cell.
+If a pixel value is not a valid index, a
+<errorname>BadValue</errorname>
+error results.
+If a color cell is unallocated or is allocated read-only, a
+<errorname>BadAccess</errorname>
+error results.
+If more than one pixel is in error,
+the one that gets reported is arbitrary.
+If the colormap is an installed map for its screen, 
+the changes are visible immediately.
+</para>
+<para>
+<!-- .LP -->
+Note that 
+<xref linkend='XStoreColors' xrefstyle='select: title'/>
+has no return value; therefore, an
+<symbol>XcmsSuccess</symbol>
+return value from this function indicates that conversions 
+to <acronym>RGB</acronym> succeeded and the call to
+<xref linkend='XStoreColors' xrefstyle='select: title'/>
+was made.
+To obtain the actual colors stored, use
+<xref linkend='XcmsQueryColors' xrefstyle='select: title'/>.
+Because of the screen's hardware limitations or gamut compression,
+the colors stored in the colormap may not be identical
+to the colors specified.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XcmsStoreColors' xrefstyle='select: title'/>
+can generate
+<errorname>BadAccess</errorname>,
+<errorname>BadColor</errorname>,
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To store a color specified by name in a single colormap cell, use
+<xref linkend='XStoreNamedColor' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Color</primary><secondary>storing</secondary></indexterm>
+<indexterm><primary>Color</primary><secondary>naming</secondary></indexterm>
+<indexterm significance="preferred"><primary>XStoreNamedColor</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XStoreNamedColor'>
+<funcprototype>
+  <funcdef><function>XStoreNamedColor</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Colormap<parameter> colormap</parameter></paramdef>
+  <paramdef>char<parameter> *color</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> pixel</parameter></paramdef>
+  <paramdef>int<parameter> flags</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colormap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the colormap.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the color name string (for example, red). 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>pixel</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the entry in the colormap. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>flags</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies which red, green, and blue components are set.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XStoreNamedColor' xrefstyle='select: title'/>
+function looks up the named color with respect to the screen associated with
+the colormap and stores the result in the specified colormap.
+The pixel argument determines the entry in the colormap.
+The flags argument determines which of the red, green, and blue components 
+are set. 
+You can set this member to the
+bitwise inclusive OR of the bits 
+<symbol>DoRed</symbol>,
+<symbol>DoGreen</symbol>,
+and 
+<symbol>DoBlue</symbol>.
+If the color name is not in the Host Portable Character Encoding, 
+the result is implementation-dependent.
+Use of uppercase or lowercase does not matter.
+If the specified pixel is not a valid index into the colormap, a
+<errorname>BadValue</errorname>
+error results.
+If the specified pixel either is unallocated or is allocated read-only, a
+<errorname>BadAccess</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XStoreNamedColor' xrefstyle='select: title'/>
+can generate
+<errorname>BadAccess</errorname>,
+<errorname>BadColor</errorname>,
+<errorname>BadName</errorname>,
+and 
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+The
+<xref linkend='XQueryColor' xrefstyle='select: title'/>
+and
+<xref linkend='XQueryColors' xrefstyle='select: title'/>
+functions take pixel values in the pixel member of
+<structname>XColor</structname>
+structures and store in the structures the <acronym>RGB</acronym> values for those
+pixels from the specified colormap.
+The values returned for an unallocated entry are undefined.
+These functions also set the flags member in the
+<structname>XColor</structname>
+structure to all three colors.
+If a pixel is not a valid index into the specified colormap, a
+<errorname>BadValue</errorname>
+error results.
+If more than one pixel is in error,
+the one that gets reported is arbitrary.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To query the <acronym>RGB</acronym> value of a single colormap cell, use
+<xref linkend='XQueryColor' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Color</primary><secondary>querying</secondary></indexterm>
+<indexterm significance="preferred"><primary>XQueryColor</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XQueryColor'>
+<funcprototype>
+  <funcdef><function>XQueryColor</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Colormap<parameter> colormap</parameter></paramdef>
+  <paramdef>XColor<parameter> *def_in_out</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colormap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the colormap.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>def_in_out</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies and returns the <acronym>RGB</acronym> values for the pixel specified in the structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XQueryColor' xrefstyle='select: title'/>
+function returns the current <acronym>RGB</acronym> value for the pixel in the
+<structname>XColor</structname>
+structure and sets the
+<symbol>DoRed</symbol>,
+<symbol>DoGreen</symbol>,
+and
+<symbol>DoBlue</symbol>
+flags.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XQueryColor' xrefstyle='select: title'/>
+can generate
+<errorname>BadColor</errorname>
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To query the <acronym>RGB</acronym> values of multiple colormap cells, use
+<xref linkend='XQueryColors' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Color</primary><secondary>querying</secondary></indexterm>
+<indexterm significance="preferred"><primary>XQueryColors</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XQueryColors'>
+<funcprototype>
+  <funcdef><function>XQueryColors</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Colormap<parameter> colormap</parameter></paramdef>
+  <paramdef>XColor<parameter> defs_in_out[]</parameter></paramdef>
+  <paramdef>int<parameter> ncolors</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colormap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the colormap.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>defs_in_out</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies and returns an array of color definition structures for the pixel
+specified in the structure.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ncolors</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .\"Specifies the number of color definition structures.  -->
+Specifies the number of 
+<structname>XColor</structname>
+structures in the color definition array.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XQueryColors' xrefstyle='select: title'/>
+function returns the <acronym>RGB</acronym> value for each pixel in each
+<structname>XColor</structname>
+structure and sets the
+<symbol>DoRed</symbol>,
+<symbol>DoGreen</symbol>,
+and
+<symbol>DoBlue</symbol>
+flags in each structure.
+
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XQueryColors' xrefstyle='select: title'/>
+can generate
+<errorname>BadColor</errorname>
+and
+<errorname>BadValue</errorname>
+errors.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To query the color of a single colormap cell in an arbitrary format, use
+<xref linkend='XcmsQueryColor' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Color</primary><secondary>querying</secondary></indexterm>
+<indexterm significance="preferred"><primary>XcmsQueryColor</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsQueryColor'>
+<funcprototype>
+  <funcdef>Status <function>XcmsQueryColor</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Colormap<parameter> colormap</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> *color_in_out</parameter></paramdef>
+  <paramdef>XcmsColorFormat<parameter> result_format</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colormap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the colormap.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color_in_out</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the pixel member that indicates the color cell to query.
+The color specification stored for the color cell is returned in this
+<structname>XcmsColor</structname>
+structure.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>result_format</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the color format for the returned color specification.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XcmsQueryColor' xrefstyle='select: title'/>
+function obtains the <acronym>RGB</acronym> value
+for the pixel value in the pixel member of the specified
+<structname>XcmsColor</structname>
+structure and then
+converts the value to the target format as
+specified by the result_format argument.
+If the pixel is not a valid index in the specified colormap, a
+<errorname>BadValue</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XcmsQueryColor' xrefstyle='select: title'/>
+can generate
+<errorname>BadColor</errorname>
+and
+<errorname>BadValue</errorname>
+errors.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To query the color of multiple colormap cells in an arbitrary format, use
+<xref linkend='XcmsQueryColors' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Color</primary><secondary>querying</secondary></indexterm>
+<indexterm significance="preferred"><primary>XcmsQueryColors</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsQueryColors'>
+<funcprototype>
+  <funcdef>Status <function>XcmsQueryColors</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Colormap<parameter> colormap</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> colors_in_out[]</parameter></paramdef>
+  <paramdef>unsignedint<parameter> ncolors</parameter></paramdef>
+  <paramdef>XcmsColorFormat<parameter> result_format</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colormap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the colormap.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colors_in_out</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies an array of
+<structname>XcmsColor</structname>
+structures, each pixel member indicating the color cell to query.
+The color specifications for the color cells are returned in these structures.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ncolors</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of 
+<structname>XcmsColor</structname>
+structures in the color-specification array.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>result_format</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the color format for the returned color specification.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XcmsQueryColors' xrefstyle='select: title'/>
+function obtains the <acronym>RGB</acronym> values
+for pixel values in the pixel members of
+<structname>XcmsColor</structname>
+structures and then
+converts the values to the target format as
+specified by the result_format argument.
+If a pixel is not a valid index into the specified colormap, a
+<errorname>BadValue</errorname>
+error results.
+If more than one pixel is in error,
+the one that gets reported is arbitrary.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XcmsQueryColors' xrefstyle='select: title'/>
+can generate
+<errorname>BadColor</errorname>
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+</sect1>
+<sect1 id="Color_Conversion_Context_Functions">
+<title>Color Conversion Context Functions</title>
+<!-- .XS -->
+<!-- (SN Color Conversion Context Functions -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+This section describes functions to create, modify,
+and query Color Conversion Contexts (CCCs).
+</para>
+<para>
+<!-- .LP -->
+Associated with each colormap is an initial CCC transparently generated by
+Xlib.
+<indexterm><primary>Color Conversion Context</primary><secondary>creation</secondary></indexterm>
+Therefore, when you specify a colormap as an argument to a function,
+you are indirectly specifying a CCC.
+<indexterm><primary>CCC</primary><secondary>of colormap</secondary></indexterm>
+<indexterm><primary>Color Conversion Context</primary><secondary>of colormap</secondary></indexterm>
+The CCC attributes that can be modified by the X client are:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+Client White Point
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Gamut compression procedure and client data
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+White point adjustment procedure and client data
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+The initial values for these attributes are implementation specific.
+The CCC attributes for subsequently created CCCs can be defined
+by changing the CCC attributes of the default CCC.
+<indexterm><primary>CCC</primary><secondary>default</secondary></indexterm>
+<indexterm><primary>Color Conversion Context</primary><secondary>default</secondary></indexterm>
+There is a default CCC associated with each screen.
+</para>
+<sect2 id="Getting_and_Setting_the_Color_Conversion_Context_of_a_Colormap">
+<title>Getting and Setting the Color Conversion Context of a Colormap</title>
+<!-- .XS -->
+<!-- (SN Getting and Setting the Color Conversion Context of a Colormap -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain the CCC associated with a colormap, use
+<xref linkend='XcmsCCCOfColormap' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XcmsCCCOfColormap</primary></indexterm>
+<indexterm><primary>Colormap</primary><secondary>CCC of</secondary></indexterm>
+<indexterm><primary>CCC</primary><secondary>of colormap</secondary></indexterm>
+<indexterm><primary>Color Conversion Context</primary><secondary>of colormap</secondary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsCCCOfColormap'>
+<funcprototype>
+  <funcdef>XcmsCCC <function>XcmsCCCOfColormap</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Colormap<parameter> colormap</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colormap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the colormap.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XcmsCCCOfColormap' xrefstyle='select: title'/>
+function returns the CCC associated with the specified colormap.
+Once obtained, 
+the CCC attributes can be queried or modified.
+Unless the CCC associated with the specified colormap is changed with
+<xref linkend='XcmsSetCCCOfColormap' xrefstyle='select: title'/>,
+this CCC is used when the specified colormap is used as an argument 
+to color functions.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To change the CCC associated with a colormap, use
+<xref linkend='XcmsSetCCCOfColormap' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XcmsSetCCCOfColormap</primary></indexterm>
+<indexterm><primary>Colormap</primary><secondary>CCC of</secondary></indexterm>
+<indexterm><primary>CCC</primary><secondary>of colormap</secondary></indexterm>
+<indexterm><primary>Color Conversion Context</primary><secondary>of colormap</secondary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsSetCCCOfColormap'>
+<funcprototype>
+  <funcdef>XcmsCCC <function>XcmsSetCCCOfColormap</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Colormap<parameter> colormap</parameter></paramdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colormap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the colormap.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XcmsSetCCCOfColormap' xrefstyle='select: title'/>
+function changes the CCC associated with the specified colormap.
+It returns the CCC previously associated with the colormap.
+If they are not used again in the application,
+CCCs should be freed by calling
+<xref linkend='XcmsFreeCCC' xrefstyle='select: title'/>.
+Several colormaps may share the same CCC without restriction; this
+includes the CCCs generated by Xlib with each colormap.  Xlib, however,
+creates a new CCC with each new colormap.
+</para>
+</sect2>
+<sect2 id="Obtaining_the_Default_Color_Conversion_Context">
+<title>Obtaining the Default Color Conversion Context</title>
+<!-- .XS -->
+<!-- (SN Obtaining the Default Color Conversion Context -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+You can change the default CCC attributes for subsequently created CCCs
+by changing the CCC attributes of the default CCC.
+<indexterm><primary>CCC</primary><secondary>default</secondary></indexterm>
+<indexterm><primary>Color Conversion Context</primary><secondary>default</secondary></indexterm>
+A default CCC is associated with each screen.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To obtain the default CCC for a screen, use
+<xref linkend='XcmsDefaultCCC' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XcmsDefaultCCC</primary></indexterm>
+<indexterm><primary>Color Conversion Context</primary><secondary>default</secondary></indexterm>
+<indexterm><primary>CCC</primary><secondary>default</secondary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsDefaultCCC'>
+<funcprototype>
+  <funcdef>XcmsCCC <function>XcmsDefaultCCC</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> screen_number</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen_number</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate screen number on the host server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XcmsDefaultCCC' xrefstyle='select: title'/>
+function returns the default CCC for the specified screen.
+Its visual is the default visual of the screen.
+Its initial gamut compression and white point
+adjustment procedures as well as the associated client data are implementation
+specific.
+</para>
+</sect2>
+<sect2 id="Color_Conversion_Context_Macros">
+<title>Color Conversion Context Macros</title>
+<!-- .XS -->
+<!-- (SN Color Conversion Context Macros -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Applications should not directly modify any part of the
+<structname>XcmsCCC</structname>.
+The following lists the C language macros, their corresponding function
+equivalents for other language bindings, and what data they both
+can return.
+<!-- .sp -->
+</para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>DisplayOfCCC</primary></indexterm>
+<indexterm significance="preferred"><primary>XcmsDisplayOfCCC</primary></indexterm>
+<!-- .sM -->
+
+<funcsynopsis id='DisplayOfCCC'>
+<funcprototype>
+  <funcdef><function>DisplayOfCCC</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<funcsynopsis id='XcmsDisplayOfCCC'>
+<funcprototype>
+  <funcdef>Display *<function>XcmsDisplayOfCCC</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+Both return the display associated with the specified CCC.
+</para>
+<!-- .LP -->
+<!-- .sp -->
+<indexterm significance="preferred"><primary>VisualOfCCC</primary></indexterm>
+<indexterm significance="preferred"><primary>XcmsVisualOfCCC</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='VisualOfCCC'>
+<funcprototype>
+  <funcdef><function>VisualOfCCC</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<funcsynopsis id='XcmsVisualOfCCC'>
+<funcprototype>
+  <funcdef>Visual *<function>XcmsVisualOfCCC</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+Both return the visual associated with the specified CCC.
+<!-- .sp -->
+</para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>ScreenNumberOfCCC</primary></indexterm>
+<indexterm significance="preferred"><primary>XcmsScreenNumberOfCCC</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='ScreenNumberOfCCC'>
+<funcprototype>
+  <funcdef><function>ScreenNumberOfCCC</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<funcsynopsis id='XcmsScreenNumberOfCCC'>
+<funcprototype>
+  <funcdef>int <function>XcmsScreenNumberOfCCC</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+Both return the number of the screen associated with the specified CCC.
+<!-- .sp -->
+</para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>ScreenWhitePointOfCCC</primary></indexterm>
+<indexterm significance="preferred"><primary>XcmsScreenWhitePointOfCCC</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='ScreenWhitePointOfCCC'>
+<funcprototype>
+  <funcdef><function>ScreenWhitePointOfCCC</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<funcsynopsis id='XcmsScreenWhitePointOfCCC'>
+<funcprototype>
+  <funcdef>XcmsColor <function>XcmsScreenWhitePointOfCCC</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+Both return the white point of the screen associated with the specified CCC.
+<!-- .sp -->
+</para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>ClientWhitePointOfCCC</primary></indexterm>
+<indexterm significance="preferred"><primary>XcmsClientWhitePointOfCCC</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='ClientWhitePointOfCCC'>
+<funcprototype>
+  <funcdef> <function>ClientWhitePointOfCCC</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<funcsynopsis id='XcmsClientWhitePointOfCCC'>
+<funcprototype>
+  <funcdef>XcmsColor *<function>XcmsClientWhitePointOfCCC</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+Both return the Client White Point of the specified CCC.
+</para>
+</sect2>
+
+<sect2 id="Modifying_Attributes_of_a_Color_Conversion_Context">
+<title>Modifying Attributes of a Color Conversion Context</title>
+<!-- .XS -->
+<!-- (SN Modifying Attributes of a Color Conversion Context -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To set the Client White Point in the CCC, use
+<xref linkend='XcmsSetWhitePoint' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XcmsSetWhitePoint</primary></indexterm>
+<indexterm><primary>Client White Point</primary><secondary>of Color Conversion Context</secondary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsSetWhitePoint'>
+<funcprototype>
+  <funcdef>Status <function>XcmsSetWhitePoint</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> *color</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+<!-- .ds Co new Client White Point -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the new Client White Point.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XcmsSetWhitePoint' xrefstyle='select: title'/>
+function changes the Client White Point in the specified CCC.
+Note that the pixel member is ignored 
+and that the color specification is left unchanged upon return.
+The format for the new white point must be
+<symbol>XcmsCIEXYZFormat</symbol>,
+<symbol>XcmsCIEuvYFormat</symbol>,
+<symbol>XcmsCIExyYFormat</symbol>,
+or
+<symbol>XcmsUndefinedFormat</symbol>.
+If the color argument is NULL, this function sets the format component of the
+Client White Point specification to
+<symbol>XcmsUndefinedFormat</symbol>,
+indicating that the Client White Point is assumed to be the same as the
+Screen White Point.
+</para>
+<para>
+<!-- .LP -->
+This function returns nonzero status
+if the format for the new white point is valid;
+otherwise, it returns zero.
+
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To set the gamut compression procedure and corresponding client data
+in a specified CCC, use
+<xref linkend='XcmsSetCompressionProc' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XcmsSetCompressionProc</primary></indexterm>
+<indexterm><primary>Gamut compression</primary><secondary>setting in Color Conversion Context</secondary></indexterm>
+<indexterm><primary>Gamut compression</primary><secondary>procedure</secondary></indexterm>
+<indexterm><primary>Gamut compression</primary><secondary>client data</secondary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsSetCompressionProc'>
+<funcprototype>
+  <funcdef>XcmsCompressionProc <function>XcmsSetCompressionProc</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+  <paramdef>XcmsCompressionProc<parameter> compression_proc</parameter></paramdef>
+  <paramdef>XPointer<parameter> client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>compression_proc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the gamut compression procedure that is to be applied 
+when a color lies outside the screen's color gamut.
+If NULL is specified and a function using this CCC must convert
+a color specification to a device-dependent format and encounters a color
+that lies outside the screen's color gamut, 
+that function will return
+<symbol>XcmsFailure</symbol>.
+<!-- .ds Cd the gamut compression procedure -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>client_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies client data for gamut compression procedure or NULL.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XcmsSetCompressionProc' xrefstyle='select: title'/>
+function first sets the gamut compression procedure and client data 
+in the specified CCC with the newly specified procedure and client data
+and then returns the old procedure.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To set the white point adjustment procedure and corresponding client data
+in a specified CCC, use
+<xref linkend='XcmsSetWhiteAdjustProc' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XcmsSetWhiteAdjustProc</primary></indexterm>
+<indexterm><primary>White point adjustment</primary><secondary>setting in Color Conversion Context</secondary></indexterm>
+<indexterm><primary>White point adjustment</primary><secondary>procedure</secondary></indexterm>
+<indexterm><primary>White point adjustment</primary><secondary>client data</secondary></indexterm>
+<funcsynopsis id='XcmsSetWhiteAdjustProc'>
+<funcprototype>
+  <funcdef>XcmsWhiteAdjustProc <function>XcmsSetWhiteAdjustProc</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+  <paramdef>XcmsWhiteAdjustProc<parameter> white_adjust_proc</parameter></paramdef>
+  <paramdef>XPointer<parameter> client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>white_adjust_proc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the white point adjustment procedure.
+<!-- .ds Cd the white point adjustment procedure -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>client_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies client data for white point adjustment procedure or NULL.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XcmsSetWhiteAdjustProc' xrefstyle='select: title'/>
+function first sets the white point adjustment procedure and client data 
+in the specified CCC with the newly specified procedure and client data
+and then returns the old procedure.
+</para>
+</sect2>
+<sect2 id="Creating_and_Freeing_a_Color_Conversion_Context">
+<title>Creating and Freeing a Color Conversion Context</title>
+<!-- .XS -->
+<!-- (SN Creating and Freeing a Color Conversion Context -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+You can explicitly create a CCC within your application by calling
+<xref linkend='XcmsCreateCCC' xrefstyle='select: title'/>.
+These created CCCs can then be used by those functions that explicitly
+call for a CCC argument.
+Old CCCs that will not be used by the application should be freed using
+<xref linkend='XcmsFreeCCC' xrefstyle='select: title'/>.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To create a CCC, use
+<xref linkend='XcmsCreateCCC' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XcmsCreateCCC</primary></indexterm>
+<indexterm><primary>Color Conversion Context</primary><secondary>creation</secondary></indexterm>
+<indexterm><primary>CCC</primary><secondary>creation</secondary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsCreateCCC'>
+<funcprototype>
+  <funcdef>XcmsCCC <function>XcmsCreateCCC</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> screen_number</parameter></paramdef>
+  <paramdef>Visual<parameter> *visual</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> *client_white_point</parameter></paramdef>
+  <paramdef>XcmsCompressionProc<parameter> compression_proc</parameter></paramdef>
+  <paramdef>XPointer<parameter> compression_client_data</parameter></paramdef>
+  <paramdef>XcmsWhiteAdjustProc<parameter> white_adjust_proc</parameter></paramdef>
+  <paramdef>XPointer<parameter> white_adjust_client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen_number</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate screen number on the host server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>visual</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the visual type.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>client_white_point</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the Client White Point.
+If NULL is specified, 
+the Client White Point is to be assumed to be the same as the
+Screen White Point.
+Note that the pixel member is ignored.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>compression_proc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the gamut compression procedure that is to be applied 
+when a color lies outside the screen's color gamut.
+If NULL is specified and a function using this CCC must convert
+a color specification to a device-dependent format and encounters a color
+that lies outside the screen's color gamut, 
+that function will return
+<symbol>XcmsFailure</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>compression_client_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies client data for use by the gamut compression procedure or NULL.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>white_adjust_proc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the white adjustment procedure that is to be applied
+when the Client White Point differs from the Screen White Point.
+NULL indicates that no white point adjustment is desired.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>white_adjust_client_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies client data for use with the white point adjustment procedure or NULL.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XcmsCreateCCC' xrefstyle='select: title'/>
+function creates a CCC for the specified display, screen, and visual.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To free a CCC, use
+<xref linkend='XcmsFreeCCC' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XcmsFreeCCC</primary></indexterm>
+<indexterm><primary>Color Conversion Context</primary><secondary>freeing</secondary></indexterm>
+<indexterm><primary>CCC</primary><secondary>freeing</secondary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsFreeCCC'>
+<funcprototype>
+  <funcdef>void <function>XcmsFreeCCC</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XcmsFreeCCC' xrefstyle='select: title'/>
+function frees the memory used for the specified CCC.
+Note that default CCCs and those currently associated with colormaps
+are ignored.
+</para>
+</sect2>
+</sect1>
+<sect1 id="Converting_between_Color_Spaces">
+<title>Converting between Color Spaces</title>
+<!-- .XS -->
+<!-- (SN Converting between Color Spaces -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To convert an array of color specifications in arbitrary color formats
+to a single destination format, use
+<xref linkend='XcmsConvertColors' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Color conversion</primary></indexterm>
+<indexterm><primary>Color</primary><secondary>conversion</secondary></indexterm>
+<indexterm significance="preferred"><primary>XcmsConvertColors</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsConvertColors'>
+<funcprototype>
+  <funcdef>Status <function>XcmsConvertColors</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> colors_in_out[]</parameter></paramdef>
+  <paramdef>unsignedint<parameter> ncolors</parameter></paramdef>
+  <paramdef>XcmsColorFormat<parameter> target_format</parameter></paramdef>
+  <paramdef>Bool<parameter> compression_flags_return[]</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+If conversion is between device-independent color spaces only
+(for example, TekHVC to CIELuv),
+the CCC is necessary only to specify the Client White Point.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colors_in_out</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies an array of color specifications.
+Pixel members are ignored and remain unchanged upon return.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ncolors</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of 
+<structname>XcmsColor</structname>
+structures in the color-specification array.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>target_format</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the target color specification format.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>compression_flags_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns an array of Boolean values indicating compression status.
+If a non-NULL pointer is supplied,
+each element of the array is set to
+<symbol>True</symbol>
+if the corresponding color was compressed and
+<symbol>False</symbol>
+otherwise.
+Pass NULL if the compression status is not useful.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XcmsConvertColors' xrefstyle='select: title'/>
+function converts the color specifications in the specified array of
+<structname>XcmsColor</structname>
+structures from their current format to a single target format,
+using the specified CCC.
+When the return value is
+<symbol>XcmsFailure</symbol>,
+the contents of the color specification array are left unchanged.
+</para>
+<para>
+<!-- .LP -->
+The array may contain a mixture of color specification formats
+(for example, 3 <acronym>CIE</acronym> XYZ, 2 <acronym>CIE</acronym> Luv, and so on).
+When the array contains both device-independent and
+device-dependent color specifications and the target_format argument specifies
+a device-dependent format (for example,
+<symbol>XcmsRGBiFormat</symbol>,
+<symbol>XcmsRGBFormat</symbol>),
+all specifications are converted to <acronym>CIE</acronym> XYZ format and then to the target
+device-dependent format.
+</para>
+</sect1>
+<sect1 id="Callback_Functions">
+<title>Callback Functions</title>
+<!-- .XS -->
+<!-- (SN Callback Functions -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+This section describes the gamut compression and white point
+adjustment callbacks.
+</para>
+<para>
+<!-- .LP -->
+The gamut compression procedure specified in the CCC
+is called when an attempt to convert a color specification from
+<structname>XcmsCIEXYZ</structname>
+to a device-dependent format (typically
+<structname>XcmsRGBi</structname>)
+results in a color that lies outside the screen's color gamut.
+If the gamut compression procedure requires client data, this data is passed
+via the gamut compression client data in the CCC.
+</para>
+<para>
+<!-- .LP -->
+During color specification conversion between device-independent
+and device-dependent color spaces,
+if a white point adjustment procedure is specified in the CCC,
+it is triggered when the Client White Point and Screen White Point differ.
+If required, the client data is obtained from the CCC.
+</para>
+<sect2 id="Prototype_Gamut_Compression_Procedure">
+<title>Prototype Gamut Compression Procedure</title>
+<!-- .XS -->
+<!-- (SN Prototype Gamut Compression Procedure -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The gamut compression callback interface must adhere to the
+following:
+</para>
+<indexterm significance="preferred"><primary>XcmsCompressionProc</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsCompressionProc'>
+<funcprototype>
+  <funcdef>typedef Status<function>(*XcmsCompressionProc</function>)</funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> colors_in_out[]</parameter></paramdef>
+  <paramdef>unsignedint<parameter> ncolors</parameter></paramdef>
+  <paramdef>unsignedint<parameter> index</parameter></paramdef>
+  <paramdef>Bool<parameter> compression_flags_return[]</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colors_in_out</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies an array of color specifications.
+Pixel members should be ignored and must remain unchanged upon return.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ncolors</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of 
+<structname>XcmsColor</structname>
+structures in the color-specification array.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>index</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the index into the array of
+<structname>XcmsColor</structname>
+structures for the encountered color specification that lies outside the 
+screen's color gamut.
+Valid values are 0 (for the first element) to ncolors - 1.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>compression_flags_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns an array of Boolean values for indicating compression status.
+If a non-NULL pointer is supplied
+and a color at a given index is compressed, then
+<symbol>True</symbol>
+should be stored at the corresponding index in this array;
+otherwise, the array should not be modified.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+When implementing a gamut compression procedure, consider the following
+rules and assumptions:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+The gamut compression procedure can attempt to compress one or multiple
+specifications at a time.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+When called, elements 0 to index - 1 in the color specification
+array can be assumed to fall within the screen's color gamut.
+In addition, these color specifications are already in some device-dependent
+format (typically
+<structname>XcmsRGBi</structname>).
+If any modifications are made to these color specifications,
+they must be in their initial device-dependent format upon return.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+When called, the element in the color specification array specified
+by the index argument contains the color specification outside the 
+screen's color gamut encountered by the calling routine.
+In addition, this color specification can be assumed to be in
+<structname>XcmsCIEXYZ</structname>.
+Upon return, this color specification must be in
+<structname>XcmsCIEXYZ</structname>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+When called, elements from index to ncolors - 1 
+in the color specification array may or may not fall within the
+screen's color gamut.
+In addition, these color specifications can be assumed to be in
+<structname>XcmsCIEXYZ</structname>.
+If any modifications are made to these color specifications, 
+they must be in
+<structname>XcmsCIEXYZ</structname>
+upon return.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The color specifications passed to the gamut compression procedure
+have already been adjusted to the Screen White Point.
+This means that at this point the color specification's white point
+is the Screen White Point.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If the gamut compression procedure uses a device-independent color space not
+initially accessible for use in the color management system, use 
+<xref linkend='XcmsAddColorSpace' xrefstyle='select: title'/>
+to ensure that it is added.
+    </para>
+  </listitem>
+</itemizedlist>
+</sect2>
+<sect2 id="Supplied_Gamut_Compression_Procedures">
+<title>Supplied Gamut Compression Procedures</title>
+<!-- .XS -->
+<!-- (SN Supplied Gamut Compression Procedures -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The following equations are useful in describing gamut compression
+functions:
+<!-- .EQ -->
+delim %%
+<!-- .EN -->
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+%CIELab~Psychometric~Chroma ~=~ sqrt(a_star sup 2 ~+~ b_star sup 2 )%
+
+%CIELab~Psychometric~Hue ~=~ tan sup -1 left [ b_star over a_star right ]%
+
+%CIELuv~Psychometric~Chroma ~=~ sqrt(u_star sup 2 ~+~ v_star sup 2 )%
+
+%CIELuv~Psychometric~Hue ~=~ tan sup -1 left [ v_star over u_star right ]%
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+The gamut compression callback procedures provided by Xlib are as follows:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+<function>XcmsCIELabClipL</function>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+This brings the encountered out-of-gamut color specification into the 
+screen's color gamut by reducing or increasing <acronym>CIE</acronym> metric lightness (L*) 
+in the <acronym>CIE</acronym> L*a*b* color space until the color is within the gamut.
+If the Psychometric Chroma of the color specification 
+is beyond maximum for the Psychometric Hue Angle,
+then while maintaining the same Psychometric Hue Angle,
+the color will be clipped to the <acronym>CIE</acronym> L*a*b* coordinates of maximum
+Psychometric Chroma.
+See
+<xref linkend='XcmsCIELabQueryMaxC' xrefstyle='select: title'/>.
+No client data is necessary.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<function>XcmsCIELabClipab</function>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+This brings the encountered out-of-gamut color specification into the 
+screen's color gamut by reducing Psychometric Chroma,
+while maintaining Psychometric Hue Angle,
+until the color is within the gamut.
+No client data is necessary.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<function>XcmsCIELabClipLab</function>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+This brings the encountered out-of-gamut color specification into the
+screen's color gamut by replacing it with <acronym>CIE</acronym> L*a*b* coordinates
+that fall within the color gamut while maintaining the original
+Psychometric Hue
+Angle and whose vector to the original coordinates is the shortest attainable.
+No client data is necessary.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<function>XcmsCIELuvClipL</function>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+This brings the encountered out-of-gamut color specification into the 
+screen's color gamut by reducing or increasing <acronym>CIE</acronym> metric lightness (L*)
+in the <acronym>CIE</acronym> L*u*v* color space until the color is within the gamut.
+If the Psychometric Chroma of the color specification
+is beyond maximum for the Psychometric Hue Angle,
+then, while maintaining the same Psychometric Hue Angle,
+the color will be clipped to the <acronym>CIE</acronym> L*u*v* coordinates of maximum
+Psychometric Chroma.
+See
+<xref linkend='XcmsCIELuvQueryMaxC' xrefstyle='select: title'/>.
+No client data is necessary.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<function>XcmsCIELuvClipuv</function>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+This brings the encountered out-of-gamut color specification into the
+screen's color gamut by reducing
+Psychometric Chroma, while maintaining Psychometric Hue Angle,
+until the color is within the gamut.
+No client data is necessary.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<function>XcmsCIELuvClipLuv</function>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+This brings the encountered out-of-gamut color specification into the
+screen's color gamut by replacing it with <acronym>CIE</acronym> L*u*v* coordinates
+that fall within the color gamut while maintaining the original
+Psychometric Hue
+Angle and whose vector to the original coordinates is the shortest attainable.
+No client data is necessary.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<function>XcmsTekHVCClipV</function>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+This brings the encountered out-of-gamut color specification into the
+screen's color gamut by reducing or increasing the Value dimension
+in the TekHVC color space until the color is within the gamut.
+If Chroma of the color specification is beyond maximum for the particular Hue,
+then, while maintaining the same Hue,
+the color will be clipped to the Value and Chroma coordinates
+that represent maximum Chroma for that particular Hue.
+No client data is necessary.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<function>XcmsTekHVCClipC</function>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+This brings the encountered out-of-gamut color specification into the
+screen's color gamut by reducing the Chroma dimension
+in the TekHVC color space until the color is within the gamut.
+No client data is necessary.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<function>XcmsTekHVCClipVC</function>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+This brings the encountered out-of-gamut color specification into the
+screen's color gamut by replacing it with TekHVC coordinates
+that fall within the color gamut while maintaining the original Hue
+and whose vector to the original coordinates is the shortest attainable.
+No client data is necessary.
+    </para>
+  </listitem>
+</itemizedlist>
+</sect2>
+<sect2 id="Prototype_White_Point_Adjustment_Procedure">
+<title>Prototype White Point Adjustment Procedure</title>
+<!-- .XS -->
+<!-- (SN Prototype White Point Adjustment Procedure -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The white point adjustment procedure interface must adhere to the following:
+</para>
+<indexterm significance="preferred"><primary>XcmsWhiteAdjustProc</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsWhiteAdjustProc'>
+<funcprototype>
+  <funcdef>typedef Status <function>(*XcmsWhiteAdjustProc</function>)</funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> *initial_white_point</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> *target_white_point</parameter></paramdef>
+  <paramdef>XcmsColorFormat<parameter> target_format</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> colors_in_out[]</parameter></paramdef>
+  <paramdef>unsignedint<parameter> ncolors</parameter></paramdef>
+  <paramdef>Bool<parameter> compression_flags_return[]</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>initial_white_point</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the initial white point.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>target_white_point</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the target white point.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>target_format</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the target color specification format.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colors_in_out</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies an array of color specifications.
+Pixel members should be ignored and must remain unchanged upon return.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ncolors</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of 
+<structname>XcmsColor</structname>
+structures in the color-specification array.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>compression_flags_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns an array of Boolean values for indicating compression status.
+If a non-NULL pointer is supplied
+and a color at a given index is compressed, then
+<symbol>True</symbol>
+should be stored at the corresponding index in this array;
+otherwise, the array should not be modified.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+</para>
+</sect2>
+<sect2 id="Supplied_White_Point_Adjustment_Procedures">
+<title>Supplied White Point Adjustment Procedures</title>
+<!-- .XS -->
+<!-- (SN Supplied White Point Adjustment Procedures -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+White point adjustment procedures provided by Xlib are as follows:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+<function>XcmsCIELabWhiteShiftColors</function>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+This uses the <acronym>CIE</acronym> L*a*b* color space for adjusting the chromatic character
+of colors to compensate for the chromatic differences between the source
+and destination white points.
+This procedure simply converts the color specifications to 
+<structname>XcmsCIELab</structname>
+using the source white point and then converts to the target specification
+format using the destination's white point.
+No client data is necessary.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<function>XcmsCIELuvWhiteShiftColors</function>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+This uses the <acronym>CIE</acronym> L*u*v* color space for adjusting the chromatic character
+of colors to compensate for the chromatic differences between the source
+and destination white points.
+This procedure simply converts the color specifications to 
+<structname>XcmsCIELuv</structname>
+using the source white point and then converts to the target specification
+format using the destination's white point.
+No client data is necessary.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<function>XcmsTekHVCWhiteShiftColors</function>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+This uses the TekHVC color space for adjusting the chromatic character
+of colors to compensate for the chromatic differences between the source
+and destination white points.
+This procedure simply converts the color specifications to
+<structname>XcmsTekHVC</structname>
+using the source white point and then converts to the target specification
+format using the destination's white point.
+An advantage of this procedure over those previously described
+is an attempt to minimize hue shift.
+No client data is necessary.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+From an implementation point of view,
+these white point adjustment procedures convert the color specifications
+to a device-independent but white-point-dependent color space 
+(for example, <acronym>CIE</acronym> L*u*v*, <acronym>CIE</acronym> L*a*b*, TekHVC) using one white point
+and then converting those specifications to the target color space 
+using another white point.
+In other words,
+the specification goes in the color space with one white point 
+but comes out with another white point, 
+resulting in a chromatic shift based on the chromatic displacement
+between the initial white point and target white point.
+The <acronym>CIE</acronym> color spaces that are assumed to be white-point-independent
+are <acronym>CIE</acronym> u'v'Y, <acronym>CIE</acronym> XYZ, and <acronym>CIE</acronym> xyY.
+When developing a custom white point adjustment procedure that uses a
+device-independent color space not initially accessible for use in the
+color management system, use
+<xref linkend='XcmsAddColorSpace' xrefstyle='select: title'/>
+to ensure that it is added.
+</para>
+<para>
+<!-- .LP -->
+As an example, 
+if the CCC specifies a white point adjustment procedure
+and if the Client White Point and Screen White Point differ, the
+<xref linkend='XcmsAllocColor' xrefstyle='select: title'/>
+function will use the white point adjustment
+procedure twice: 
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+Once to convert to
+<structname>XcmsRGB</structname>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A second time to convert from
+<structname>XcmsRGB</structname>
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+For example, assume the specification is in
+<structname>XcmsCIEuvY</structname>
+and the adjustment procedure is
+<function>XcmsCIELuvWhiteShiftColors</function>.
+During conversion to
+<structname>XcmsRGB</structname>,
+the call to 
+<xref linkend='XcmsAllocColor' xrefstyle='select: title'/>
+results in the following series of color specification conversions:
+<!-- .\" Do these need to be font coded? -->
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+From 
+<structname>XcmsCIEuvY</structname>
+to
+<structname>XcmsCIELuv</structname>
+using the Client White Point
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+From 
+<structname>XcmsCIELuv</structname>
+to
+<structname>XcmsCIEuvY</structname>
+using the Screen White Point
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+From
+<structname>XcmsCIEuvY</structname>
+to
+<structname>XcmsCIEXYZ</structname>
+(<acronym>CIE</acronym> u'v'Y and XYZ are white-point-independent color spaces)
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+From 
+<structname>XcmsCIEXYZ</structname>
+to 
+<structname>XcmsRGBi</structname>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+From 
+<structname>XcmsRGBi</structname>
+to
+<structname>XcmsRGB</structname>
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+The resulting <acronym>RGB</acronym> specification is passed to
+<xref linkend='XAllocColor' xrefstyle='select: title'/>,
+and the <acronym>RGB</acronym>
+specification returned by
+<xref linkend='XAllocColor' xrefstyle='select: title'/>
+is converted back to 
+<structname>XcmsCIEuvY</structname>
+by reversing the color conversion sequence.
+</para>
+</sect2>
+</sect1>
+<sect1 id="Gamut_Querying_Functions">
+<title>Gamut Querying Functions</title>
+<!-- .XS -->
+<!-- (SN Gamut Querying Functions -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+This section describes the gamut querying functions that Xlib provides.
+These functions allow the client to query the boundary 
+of the screen's color gamut in terms of the <acronym>CIE</acronym> L*a*b*, <acronym>CIE</acronym> L*u*v*, 
+and TekHVC color spaces.
+<indexterm><primary>Gamut querying</primary></indexterm>
+Functions are also provided that allow you to query 
+the color specification of:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+White (full-intensity red, green, and blue)
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Red (full-intensity red while green and blue are zero)
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Green (full-intensity green while red and blue are zero)
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Blue (full-intensity blue while red and green are zero)
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Black (zero-intensity red, green, and blue)
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+The white point associated with color specifications passed to 
+and returned from these gamut querying
+functions is assumed to be the Screen White Point.
+<indexterm><primary>Screen White Point</primary></indexterm>
+This is a reasonable assumption,
+because the client is trying to query the screen's color gamut.
+</para>
+<para>
+<!-- .LP -->
+The following naming convention is used for the Max and Min functions:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+Xcms<emphasis remap='I'>&lt;color_space&gt;</emphasis>QueryMax<emphasis remap='I'>&lt;dimensions&gt;</emphasis>
+
+Xcms<emphasis remap='I'>&lt;color_space&gt;</emphasis>QueryMin<emphasis remap='I'>&lt;dimensions&gt;</emphasis>
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+The &lt;dimensions&gt; consists of a letter or letters 
+that identify the dimensions of the color space 
+that are not fixed.
+For example, 
+<xref linkend='XcmsTekHVCQueryMaxC' xrefstyle='select: title'/>
+is given a fixed Hue and Value for which maximum Chroma is found.
+</para>
+<sect2 id="Red_Green_and_Blue_Queries">
+<title>Red, Green, and Blue Queries</title>
+<!-- .XS -->
+<!-- (SN Red, Green, and Blue Queries -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To obtain the color specification for black 
+(zero-intensity red, green, and blue), use
+<xref linkend='XcmsQueryBlack' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XcmsQueryBlack</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsQueryBlack'>
+<funcprototype>
+  <funcdef>Status <function>XcmsQueryBlack</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+  <paramdef>XcmsColorFormat<parameter> target_format</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> *color_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+The CCC's Client White Point and white point adjustment procedures
+are ignored.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>target_format</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the target color specification format.
+<!-- .ds Cs zero-intensity red, green, and blue -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the color specification in the specified target format
+for (Cs.
+The white point associated with the returned
+color specification is the Screen White Point.
+The value returned in the pixel member is undefined.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XcmsQueryBlack' xrefstyle='select: title'/>
+function returns the color specification in the specified target format
+for zero-intensity red, green, and blue.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To obtain the color specification for blue 
+(full-intensity blue while red and green are zero), use
+<xref linkend='XcmsQueryBlue' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XcmsQueryBlue</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsQueryBlue'>
+<funcprototype>
+  <funcdef>Status <function>XcmsQueryBlue</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+  <paramdef>XcmsColorFormat<parameter> target_format</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> *color_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+The CCC's Client White Point and white point adjustment procedures
+are ignored.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>target_format</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the target color specification format.
+<!-- .ds Cs full-intensity blue while red and green are zero -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the color specification in the specified target format
+for (Cs.
+The white point associated with the returned
+color specification is the Screen White Point.
+The value returned in the pixel member is undefined.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XcmsQueryBlue' xrefstyle='select: title'/>
+function returns the color specification in the specified target format
+for full-intensity blue while red and green are zero.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To obtain the color specification for green
+(full-intensity green while red and blue are zero), use
+<xref linkend='XcmsQueryGreen' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XcmsQueryGreen</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsQueryGreen'>
+<funcprototype>
+  <funcdef>Status <function>XcmsQueryGreen</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+  <paramdef>XcmsColorFormat<parameter> target_format</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> *color_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+The CCC's Client White Point and white point adjustment procedures
+are ignored.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>target_format</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the target color specification format.
+<!-- .ds Cs full-intensity green while red and blue are zero -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the color specification in the specified target format
+for (Cs.
+The white point associated with the returned
+color specification is the Screen White Point.
+The value returned in the pixel member is undefined.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XcmsQueryGreen' xrefstyle='select: title'/>
+function returns the color specification in the specified target format
+for full-intensity green while red and blue are zero.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To obtain the color specification for red
+(full-intensity red while green and blue are zero), use
+<xref linkend='XcmsQueryRed' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XcmsQueryRed</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsQueryRed'>
+<funcprototype>
+  <funcdef>Status <function>XcmsQueryRed</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+  <paramdef>XcmsColorFormat<parameter> target_format</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> *color_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+The CCC's Client White Point and white point adjustment procedures
+are ignored.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>target_format</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the target color specification format.
+<!-- .ds Cs full-intensity red while green and blue are zero -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the color specification in the specified target format
+for (Cs.
+The white point associated with the returned
+color specification is the Screen White Point.
+The value returned in the pixel member is undefined.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XcmsQueryRed' xrefstyle='select: title'/>
+function returns the color specification in the specified target format
+for full-intensity red while green and blue are zero.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain the color specification for white
+(full-intensity red, green, and blue), use
+<xref linkend='XcmsQueryWhite' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XcmsQueryWhite</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsQueryWhite'>
+<funcprototype>
+  <funcdef>Status <function>XcmsQueryWhite</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+  <paramdef>XcmsColorFormat<parameter> target_format</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> *color_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+The CCC's Client White Point and white point adjustment procedures
+are ignored.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>target_format</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the target color specification format.
+<!-- .ds Cs full-intensity red, green, and blue -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the color specification in the specified target format
+for (Cs.
+The white point associated with the returned
+color specification is the Screen White Point.
+The value returned in the pixel member is undefined.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XcmsQueryWhite' xrefstyle='select: title'/>
+function returns the color specification in the specified target format
+for full-intensity red, green, and blue.
+</para>
+</sect2>
+<sect2 id="CIELab_Queries">
+<title>CIELab Queries</title>
+<!-- .XS -->
+<!-- (SN CIELab Queries -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The following equations are useful in describing the CIELab query functions:
+<!-- .EQ -->
+delim %%
+<!-- .EN -->
+</para>
+<para>
+<!-- .LP -->
+<indexterm><primary>Psychometric Hue Angle</primary></indexterm>
+<indexterm><primary><acronym>CIE</acronym> metric lightness</primary></indexterm>
+<indexterm><primary>Psychometric Chroma</primary></indexterm>
+<indexterm><primary>Psychometric Chroma</primary><secondary>maximum</secondary></indexterm>
+<literallayout class="monospaced">
+%CIELab~Psychometric~Chroma ~=~ sqrt(a_star sup 2 ~+~ b_star sup 2 )%
+
+%CIELab~Psychometric~Hue ~=~ tan sup -1 left [ b_star over a_star right ]%
+</literallayout>
+<!-- .sp -->
+To obtain the <acronym>CIE</acronym> L*a*b* coordinates of maximum Psychometric Chroma
+for a given Psychometric Hue Angle and <acronym>CIE</acronym> metric lightness (L*), use
+<xref linkend='XcmsCIELabQueryMaxC' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XcmsCIELabQueryMaxC</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsCIELabQueryMaxC'>
+<funcprototype>
+  <funcdef>Status <function>XcmsCIELabQueryMaxC</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+  <paramdef>XcmsFloat<parameter> hue_angle</parameter></paramdef>
+  <paramdef>XcmsFloat<parameter> L_star</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> *color_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+The CCC's Client White Point and white point adjustment procedures
+are ignored.
+<!-- .ds Ha maximum chroma -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>hue_angle</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the hue angle (in degrees) at which to find (Ha.
+<!-- .ds Ls maximum chroma -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>L_star</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the lightness (L*) at which to find (Ls.
+<!-- .ds Lc maximum chroma -->
+<!-- .ds lC hue angle and lightness -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the <acronym>CIE</acronym> L*a*b* coordinates of (Lc
+displayable by the screen for the given (lC.
+The white point associated with the returned
+color specification is the Screen White Point.
+The value returned in the pixel member is undefined.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XcmsCIELabQueryMaxC' xrefstyle='select: title'/>
+function, given a hue angle and lightness,
+finds the point of maximum chroma displayable by the screen.
+It returns this point in <acronym>CIE</acronym> L*a*b* coordinates.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain the <acronym>CIE</acronym> L*a*b* coordinates of maximum <acronym>CIE</acronym> metric lightness (L*)
+for a given Psychometric Hue Angle and Psychometric Chroma, use
+<xref linkend='XcmsCIELabQueryMaxL' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Psychometric Hue Angle</primary></indexterm>
+<indexterm><primary><acronym>CIE</acronym> metric lightness</primary></indexterm>
+<indexterm><primary><acronym>CIE</acronym> metric lightness</primary><secondary>maximum</secondary></indexterm>
+<indexterm significance="preferred"><primary>XcmsCIELabQueryMaxL</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsCIELabQueryMaxL'>
+<funcprototype>
+  <funcdef>Status <function>XcmsCIELabQueryMaxL</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+  <paramdef>XcmsFloat<parameter> hue_angle</parameter></paramdef>
+  <paramdef>XcmsFloat<parameter> chroma</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> *color_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+The CCC's Client White Point and white point adjustment procedures
+are ignored.
+<!-- .ds Ha maximum lightness -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>hue_angle</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the hue angle (in degrees) at which to find (Ha.
+<!-- .ds Ch maximum lightness -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>chroma</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the chroma at which to find (Ch.
+<!-- .ds Lc maximum lightness -->
+<!-- .ds lC hue angle and chroma -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the <acronym>CIE</acronym> L*a*b* coordinates of (Lc
+displayable by the screen for the given (lC.
+The white point associated with the returned
+color specification is the Screen White Point.
+The value returned in the pixel member is undefined.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XcmsCIELabQueryMaxL' xrefstyle='select: title'/>
+function, given a hue angle and chroma,
+finds the point in <acronym>CIE</acronym> L*a*b* color space of maximum 
+lightness (L*) displayable by the screen.
+It returns this point in <acronym>CIE</acronym> L*a*b* coordinates.
+An 
+<symbol>XcmsFailure</symbol>
+return value usually indicates that the given chroma
+is beyond maximum for the given hue angle.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To obtain the <acronym>CIE</acronym> L*a*b* coordinates of maximum Psychometric Chroma
+for a given Psychometric Hue Angle, use
+<xref linkend='XcmsCIELabQueryMaxLC' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Psychometric Hue Angle</primary></indexterm>
+<indexterm><primary>Psychometric Chroma</primary></indexterm>
+<indexterm><primary><acronym>CIE</acronym> metric lightness</primary></indexterm>
+<indexterm><primary>Psychometric Chroma</primary><secondary>maximum</secondary></indexterm>
+<indexterm><primary><acronym>CIE</acronym> metric lightness</primary><secondary>maximum</secondary></indexterm>
+<indexterm significance="preferred"><primary>XcmsCIELabQueryMaxLC</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsCIELabQueryMaxLC'>
+<funcprototype>
+  <funcdef>Status <function>XcmsCIELabQueryMaxLC</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+  <paramdef>XcmsFloat<parameter> hue_angle</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> *color_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+The CCC's Client White Point and white point adjustment procedures
+are ignored.
+<!-- .ds Ha maximum chroma -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>hue_angle</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the hue angle (in degrees) at which to find (Ha.
+<!-- .ds Lc maximum chroma -->
+<!-- .ds lC hue angle -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the <acronym>CIE</acronym> L*a*b* coordinates of (Lc
+displayable by the screen for the given (lC.
+The white point associated with the returned
+color specification is the Screen White Point.
+The value returned in the pixel member is undefined.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XcmsCIELabQueryMaxLC' xrefstyle='select: title'/>
+function, given a hue angle,
+finds the point of maximum chroma displayable by the screen.
+It returns this point in <acronym>CIE</acronym> L*a*b* coordinates.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To obtain the <acronym>CIE</acronym> L*a*b* coordinates of minimum <acronym>CIE</acronym> metric lightness (L*)
+for a given Psychometric Hue Angle and Psychometric Chroma, use
+<xref linkend='XcmsCIELabQueryMinL' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Psychometric Hue Angle</primary></indexterm>
+<indexterm><primary><acronym>CIE</acronym> metric lightness</primary></indexterm>
+<indexterm><primary><acronym>CIE</acronym> metric lightness</primary><secondary>minimum</secondary></indexterm>
+<indexterm significance="preferred"><primary>XcmsCIELabQueryMinL</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsCIELabQueryMinL'>
+<funcprototype>
+  <funcdef>Status <function>XcmsCIELabQueryMinL</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+  <paramdef>XcmsFloat<parameter> hue_angle</parameter></paramdef>
+  <paramdef>XcmsFloat<parameter> chroma</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> *color_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+The CCC's Client White Point and white point adjustment procedures
+are ignored.
+<!-- .ds Ha minimum lightness -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>hue_angle</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the hue angle (in degrees) at which to find (Ha.
+<!-- .ds Ch minimum lightness -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>chroma</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the chroma at which to find (Ch.
+<!-- .ds Lc minimum lightness -->
+<!-- .ds lC hue angle and chroma -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the <acronym>CIE</acronym> L*a*b* coordinates of (Lc
+displayable by the screen for the given (lC.
+The white point associated with the returned
+color specification is the Screen White Point.
+The value returned in the pixel member is undefined.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XcmsCIELabQueryMinL' xrefstyle='select: title'/>
+function, given a hue angle and chroma,
+finds the point of minimum lightness (L*) displayable by the screen.
+It returns this point in <acronym>CIE</acronym> L*a*b* coordinates.
+An 
+<symbol>XcmsFailure</symbol>
+return value usually indicates that the given chroma
+is beyond maximum for the given hue angle.
+</para>
+</sect2>
+<sect2 id="CIELuv_Queries">
+<title>CIELuv Queries</title>
+<!-- .XS -->
+<!-- (SN CIELuv Queries -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The following equations are useful in describing the CIELuv query functions:
+<!-- .EQ -->
+delim %%
+<!-- .EN -->
+</para>
+<para>
+<!-- .LP -->
+<indexterm><primary>Psychometric Hue Angle</primary></indexterm>
+<indexterm><primary><acronym>CIE</acronym> metric lightness</primary></indexterm>
+<indexterm><primary>Psychometric Chroma</primary></indexterm>
+<indexterm><primary>Psychometric Chroma</primary><secondary>maximum</secondary></indexterm>
+<literallayout class="monospaced">
+%CIELuv~Psychometric~Chroma ~=~ sqrt(u_star sup 2 ~+~ v_star sup 2 )%
+
+%CIELuv~Psychometric~Hue ~=~ tan sup -1 left [ v_star over u_star right ]%
+</literallayout>
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To obtain the <acronym>CIE</acronym> L*u*v* coordinates of maximum Psychometric Chroma
+for a given Psychometric Hue Angle and <acronym>CIE</acronym> metric lightness (L*), use
+<xref linkend='XcmsCIELuvQueryMaxC' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XcmsCIELuvQueryMaxC</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsCIELuvQueryMaxC'>
+<funcprototype>
+  <funcdef>Status <function>XcmsCIELuvQueryMaxC</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+  <paramdef>XcmsFloat<parameter> hue_angle</parameter></paramdef>
+  <paramdef>XcmsFloat<parameter> L_star</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> *color_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+The CCC's Client White Point and white point adjustment procedures
+are ignored.
+<!-- .ds Ha maximum chroma -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>hue_angle</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the hue angle (in degrees) at which to find (Ha.
+<!-- .ds Ls maximum chroma -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>L_star</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the lightness (L*) at which to find (Ls.
+<!-- .ds Lc maximum chroma -->
+<!-- .ds lC hue angle and lightness -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the <acronym>CIE</acronym> L*u*v* coordinates of (Lc
+displayable by the screen for the given (lC.
+The white point associated with the returned
+color specification is the Screen White Point.
+The value returned in the pixel member is undefined.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XcmsCIELuvQueryMaxC' xrefstyle='select: title'/>
+function, given a hue angle and lightness,
+finds the point of maximum chroma displayable by the screen.
+It returns this point in <acronym>CIE</acronym> L*u*v* coordinates.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To obtain the <acronym>CIE</acronym> L*u*v* coordinates of maximum <acronym>CIE</acronym> metric lightness (L*)
+for a given Psychometric Hue Angle and Psychometric Chroma, use
+<xref linkend='XcmsCIELuvQueryMaxL' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Psychometric Hue Angle</primary></indexterm>
+<indexterm><primary><acronym>CIE</acronym> metric lightness</primary></indexterm>
+<indexterm><primary><acronym>CIE</acronym> metric lightness</primary><secondary>maximum</secondary></indexterm>
+<indexterm significance="preferred"><primary>XcmsCIELuvQueryMaxL</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsCIELuvQueryMaxL'>
+<funcprototype>
+  <funcdef>Status <function>XcmsCIELuvQueryMaxL</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+  <paramdef>XcmsFloat<parameter> hue_angle</parameter></paramdef>
+  <paramdef>XcmsFloat<parameter> chroma</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> *color_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+The CCC's Client White Point and white point adjustment procedures
+are ignored.
+<!-- .ds Ha maximum lightness -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>hue_angle</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the hue angle (in degrees) at which to find (Ha.
+<!-- .ds Ls maximum lightness -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>L_star</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the lightness (L*) at which to find (Ls.
+<!-- .ds Lc maximum lightness -->
+<!-- .ds lC hue angle and chroma -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the <acronym>CIE</acronym> L*u*v* coordinates of (Lc
+displayable by the screen for the given (lC.
+The white point associated with the returned
+color specification is the Screen White Point.
+The value returned in the pixel member is undefined.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XcmsCIELuvQueryMaxL' xrefstyle='select: title'/>
+function, given a hue angle and chroma,
+finds the point in <acronym>CIE</acronym> L*u*v* color space of maximum 
+lightness (L*) displayable by the screen.
+It returns this point in <acronym>CIE</acronym> L*u*v* coordinates.
+An 
+<symbol>XcmsFailure</symbol>
+return value usually indicates that the given chroma
+is beyond maximum for the given hue angle.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To obtain the <acronym>CIE</acronym> L*u*v* coordinates of maximum Psychometric Chroma
+for a given Psychometric Hue Angle, use
+<xref linkend='XcmsCIELuvQueryMaxLC' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Psychometric Hue Angle</primary></indexterm>
+<indexterm><primary>Psychometric Chroma</primary></indexterm>
+<indexterm><primary><acronym>CIE</acronym> metric lightness</primary></indexterm>
+<indexterm><primary>Psychometric Chroma</primary><secondary>maximum</secondary></indexterm>
+<indexterm><primary><acronym>CIE</acronym> metric lightness</primary><secondary>maximum</secondary></indexterm>
+<indexterm significance="preferred"><primary>XcmsCIELuvQueryMaxLC</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsCIELuvQueryMaxLC'>
+<funcprototype>
+  <funcdef>Status <function>XcmsCIELuvQueryMaxLC</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+  <paramdef>XcmsFloat<parameter> hue_angle</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> *color_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+The CCC's Client White Point and white point adjustment procedures
+are ignored.
+<!-- .ds Ha maximum chroma -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>hue_angle</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the hue angle (in degrees) at which to find (Ha.
+<!-- .ds Lc maximum chroma -->
+<!-- .ds lC hue angle -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the <acronym>CIE</acronym> L*u*v* coordinates of (Lc
+displayable by the screen for the given (lC.
+The white point associated with the returned
+color specification is the Screen White Point.
+The value returned in the pixel member is undefined.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XcmsCIELuvQueryMaxLC' xrefstyle='select: title'/>
+function, given a hue angle,
+finds the point of maximum chroma displayable by the screen.
+It returns this point in <acronym>CIE</acronym> L*u*v* coordinates.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To obtain the <acronym>CIE</acronym> L*u*v* coordinates of minimum <acronym>CIE</acronym> metric lightness (L*)
+for a given Psychometric Hue Angle and Psychometric Chroma, use
+<xref linkend='XcmsCIELuvQueryMinL' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Psychometric Hue Angle</primary></indexterm>
+<indexterm><primary><acronym>CIE</acronym> metric lightness</primary></indexterm>
+<indexterm><primary><acronym>CIE</acronym> metric lightness</primary><secondary>minimum</secondary></indexterm>
+<indexterm significance="preferred"><primary>XcmsCIELuvQueryMinL</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsCIELuvQueryMinL'>
+<funcprototype>
+  <funcdef>Status <function>XcmsCIELuvQueryMinL</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+  <paramdef>XcmsFloat<parameter> hue_angle</parameter></paramdef>
+  <paramdef>XcmsFloat<parameter> chroma</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> *color_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+The CCC's Client White Point and white point adjustment procedures
+are ignored.
+<!-- .ds Ha minimum lightness -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>hue_angle</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the hue angle (in degrees) at which to find (Ha.
+<!-- .ds Ch minimum lightness -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>chroma</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the chroma at which to find (Ch.
+<!-- .ds Lc minimum lightness -->
+<!-- .ds lC hue angle and chroma -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the <acronym>CIE</acronym> L*u*v* coordinates of (Lc
+displayable by the screen for the given (lC.
+The white point associated with the returned
+color specification is the Screen White Point.
+The value returned in the pixel member is undefined.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XcmsCIELuvQueryMinL' xrefstyle='select: title'/>
+function, given a hue angle and chroma,
+finds the point of minimum lightness (L*) displayable by the screen.
+It returns this point in <acronym>CIE</acronym> L*u*v* coordinates.
+An 
+<symbol>XcmsFailure</symbol>
+return value usually indicates that the given chroma
+is beyond maximum for the given hue angle.
+</para>
+</sect2>
+<sect2 id="TekHVC_Queries">
+<title>TekHVC Queries</title>
+<!-- .XS -->
+<!-- (SN TekHVC Queries -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To obtain the maximum Chroma for a given Hue and Value, use
+<xref linkend='XcmsTekHVCQueryMaxC' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Chroma</primary></indexterm>
+<indexterm><primary>Chroma</primary><secondary>maximum</secondary></indexterm>
+<indexterm significance="preferred"><primary>XcmsTekHVCQueryMaxC</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsTekHVCQueryMaxC'>
+<funcprototype>
+  <funcdef>Status <function>XcmsTekHVCQueryMaxC</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+  <paramdef>XcmsFloat<parameter> hue</parameter></paramdef>
+  <paramdef>XcmsFloat<parameter> value</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> *color_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+The CCC's Client White Point and white point adjustment procedures
+are ignored.
+<!-- .ds Hu in which to find the maximum Chroma -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>hue</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the Hue (Hu.
+<!-- .ds Va maximum Chroma -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>value</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the Value in which to find the (Va.
+<!-- .ds Lc maximum Chroma along with the actual Hue and Value  -->
+<!-- .ds lC maximum Chroma -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the (Lc at which the (lC was found.
+The white point associated with the returned
+color specification is the Screen White Point.
+The value returned in the pixel member is undefined.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XcmsTekHVCQueryMaxC' xrefstyle='select: title'/>
+function, given a Hue and Value,
+determines the maximum Chroma in TekHVC color space
+displayable by the screen.
+It returns the maximum Chroma along with the actual Hue
+and Value at which the maximum Chroma was found.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To obtain the maximum Value for a given Hue and Chroma, use
+<xref linkend='XcmsTekHVCQueryMaxV' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Value</primary></indexterm>
+<indexterm><primary>Value</primary><secondary>maximum</secondary></indexterm>
+<indexterm significance="preferred"><primary>XcmsTekHVCQueryMaxV</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsTekHVCQueryMaxV'>
+<funcprototype>
+  <funcdef>Status <function>XcmsTekHVCQueryMaxV</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+  <paramdef>XcmsFloat<parameter> hue</parameter></paramdef>
+  <paramdef>XcmsFloat<parameter> chroma</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> *color_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+The CCC's Client White Point and white point adjustment procedures
+are ignored.
+<!-- .ds Hu in which to find the maximum Value -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>hue</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the Hue (Hu.
+<!-- .ds Ch maximum Value -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>chroma</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the chroma at which to find (Ch.
+<!-- .ds Lc maximum Value along with the Hue and Chroma -->
+<!-- .ds lC maximum Value -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the (Lc at which the (lC was found.
+The white point associated with the returned
+color specification is the Screen White Point.
+The value returned in the pixel member is undefined.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XcmsTekHVCQueryMaxV' xrefstyle='select: title'/>
+function, given a Hue and Chroma,
+determines the maximum Value in TekHVC color space
+displayable by the screen.
+It returns the maximum Value and the actual Hue and Chroma
+at which the maximum Value was found.
+<!-- .sp -->
+</para>
+
+<para>
+<!-- .LP -->
+To obtain the maximum Chroma and Value at which it is reached
+for a specified Hue, use
+<xref linkend='XcmsTekHVCQueryMaxVC' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Chroma</primary></indexterm>
+<indexterm><primary>Value</primary></indexterm>
+<indexterm><primary>Chroma</primary><secondary>maximum</secondary></indexterm>
+<indexterm><primary>Value</primary><secondary>maximum</secondary></indexterm>
+<indexterm significance="preferred"><primary>XcmsTekHVCQueryMaxVC</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsTekHVCQueryMaxVC'>
+<funcprototype>
+  <funcdef>Status <function>XcmsTekHVCQueryMaxVC</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+  <paramdef>XcmsFloat<parameter> hue</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> *color_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+The CCC's Client White Point and white point adjustment procedures
+are ignored.
+<!-- .ds Hu in which to find the maximum Chroma -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>hue</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the Hue (Hu.
+<!-- .ds Lc color specification in \ -->
+XcmsTekHVC for the maximum Chroma, the Value at which \
+that maximum Chroma is reached, and the actual Hue
+<!-- .ds lC maximum Chroma -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the (Lc at which the (lC was found.
+The white point associated with the returned
+color specification is the Screen White Point.
+The value returned in the pixel member is undefined.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XcmsTekHVCQueryMaxVC' xrefstyle='select: title'/>
+function, given a Hue,
+determines the maximum Chroma in TekHVC color space displayable by the screen
+and the Value at which that maximum Chroma is reached.
+It returns the maximum Chroma,
+the Value at which that maximum Chroma is reached,
+and the actual Hue for which the maximum Chroma was found.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To obtain a specified number of TekHVC specifications such that they
+contain maximum Values for a specified Hue and the
+Chroma at which the maximum Values are reached, use
+<xref linkend='XcmsTekHVCQueryMaxVSamples' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Chroma</primary></indexterm>
+<indexterm><primary>Value</primary></indexterm>
+<indexterm><primary>Chroma</primary><secondary>maximum</secondary></indexterm>
+<indexterm><primary>Value</primary><secondary>maximum</secondary></indexterm>
+<indexterm significance="preferred"><primary>XcmsTekHVCQueryMaxVSamples</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsTekHVCQueryMaxVSamples'>
+<funcprototype>
+  <funcdef>Status <function>XcmsTekHVCQueryMaxVSamples</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+  <paramdef>XcmsFloat<parameter> hue</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> colors_return[]</parameter></paramdef>
+  <paramdef>unsignedint<parameter> nsamples</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+The CCC's Client White Point and white point adjustment procedures
+are ignored.
+<!-- .ds Hu for maximum Chroma/Value samples -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>hue</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the Hue (Hu.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nsamples</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of samples.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colors_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns nsamples of color specifications in XcmsTekHVC
+such that the Chroma is the maximum attainable for the Value and Hue.
+The white point associated with the returned
+color specification is the Screen White Point.
+The value returned in the pixel member is undefined.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XcmsTekHVCQueryMaxVSamples' xrefstyle='select: title'/>
+returns nsamples of maximum Value, the Chroma at which that maximum Value
+is reached, and the actual Hue for which the maximum Chroma was found.
+These sample points may then be used to plot the maximum Value/Chroma
+boundary of the screen's color gamut for the specified Hue in TekHVC color
+space.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To obtain the minimum Value for a given Hue and Chroma, use
+<xref linkend='XcmsTekHVCQueryMinV' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Value</primary></indexterm>
+<indexterm><primary>Value</primary><secondary>minimum</secondary></indexterm>
+<indexterm significance="preferred"><primary>XcmsTekHVCQueryMinV</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsTekHVCQueryMinV'>
+<funcprototype>
+  <funcdef>Status <function>XcmsTekHVCQueryMinV</function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+  <paramdef>XcmsFloat<parameter> hue</parameter></paramdef>
+  <paramdef>XcmsFloat<parameter> chroma</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> *color_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+The CCC's Client White Point and white point adjustment procedures
+are ignored.
+<!-- .ds Hu in which to find the minimum Value -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>hue</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the Hue (Hu.
+<!-- .ds Va minimum Value -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>value</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the Value in which to find the (Va.
+<!-- .ds Lc minimum Value and the actual Hue and Chroma -->
+<!-- .ds lC minimum Value -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the (Lc at which the (lC was found.
+The white point associated with the returned
+color specification is the Screen White Point.
+The value returned in the pixel member is undefined.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XcmsTekHVCQueryMinV' xrefstyle='select: title'/>
+function, given a Hue and Chroma,
+determines the minimum Value in TekHVC color space displayable by the screen.
+It returns the minimum Value and the actual Hue and Chroma at which
+the minimum Value was found.
+</para>
+
+</sect2>
+</sect1>
+<sect1 id="Color_Management_Extensions">
+<title>Color Management Extensions</title>
+<!-- .XS -->
+<!-- (SN Color Management Extensions -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The Xlib color management facilities can be extended in two ways:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+Device-Independent Color Spaces
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Device-independent color spaces that are derivable to <acronym>CIE</acronym> XYZ
+space can be added using the
+<xref linkend='XcmsAddColorSpace' xrefstyle='select: title'/>
+function.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Color Characterization Function Set
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A Color Characterization Function Set consists of
+device-dependent color spaces and their functions that
+convert between these color spaces and the <acronym>CIE</acronym> XYZ
+color space, bundled together for a specific class of output devices.
+A function set can be added using the
+<xref linkend='XcmsAddFunctionSet' xrefstyle='select: title'/>
+function.
+    </para>
+  </listitem>
+</itemizedlist>
+<sect2 id="Color_Spaces">
+<title>Color Spaces</title>
+<!-- .XS -->
+<!-- (SN Color Spaces -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The <acronym>CIE</acronym> XYZ color space serves as the hub for all
+conversions between device-independent and device-dependent color spaces.
+Therefore, the knowledge to convert an 
+<structname>XcmsColor</structname>
+structure to and from <acronym>CIE</acronym> XYZ format is associated with each color space.
+For example, conversion from <acronym>CIE</acronym> L*u*v* to <acronym>RGB</acronym> requires the knowledge
+to convert from <acronym>CIE</acronym> L*u*v* to <acronym>CIE</acronym> XYZ and from <acronym>CIE</acronym> XYZ to <acronym>RGB</acronym>.
+This knowledge is stored as an array of functions that,
+when applied in series, will convert the 
+<structname>XcmsColor</structname>
+structure to or from <acronym>CIE</acronym> XYZ format.
+This color specification conversion mechanism facilitates
+the addition of color spaces.
+</para>
+<para>
+<!-- .LP -->
+Of course, when converting between only device-independent color spaces
+or only device-dependent color spaces,
+shortcuts are taken whenever possible.
+For example, conversion from TekHVC to <acronym>CIE</acronym> L*u*v* is performed 
+by intermediate conversion to <acronym>CIE</acronym> u*v*Y and then to <acronym>CIE</acronym> L*u*v*, 
+thus bypassing conversion between <acronym>CIE</acronym> u*v*Y and <acronym>CIE</acronym> XYZ.
+</para>
+</sect2>
+<sect2 id="Adding_Device_Independent_Color_Spaces">
+<title>Adding Device-Independent Color Spaces</title>
+<!-- .XS -->
+<!-- (SN Adding Device-Independent Color Spaces -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To add a device-independent color space, use
+<xref linkend='XcmsAddColorSpace' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XcmsAddColorSpace</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsAddColorSpace'>
+<funcprototype>
+  <funcdef>Status <function>XcmsAddColorSpace</function></funcdef>
+  <paramdef>XcmsColorSpace<parameter> *color_space</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color_space</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the device-independent color space to add.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XcmsAddColorSpace' xrefstyle='select: title'/>
+function makes a device-independent color space (actually an
+<structname>XcmsColorSpace</structname>
+structure) accessible by the color management system.
+Because format values for unregistered color spaces are assigned at run time,
+they should be treated as private to the client.
+If references to an unregistered color space must be made
+outside the client (for example, storing color specifications 
+in a file using the unregistered color space), 
+then reference should be made by color space prefix
+(see
+<xref linkend='XcmsFormatOfPrefix' xrefstyle='select: title'/>
+and
+<xref linkend='XcmsPrefixOfFormat' xrefstyle='select: title'/>).
+</para>
+<para>
+<!-- .LP -->
+If the 
+<structname>XcmsColorSpace</structname>
+structure is already accessible in the color management system, 
+<xref linkend='XcmsAddColorSpace' xrefstyle='select: title'/>
+returns 
+<symbol>XcmsSuccess</symbol>.
+</para>
+<para>
+<!-- .LP -->
+Note that added 
+<structname>XcmsColorSpace</structname>s
+must be retained for reference by Xlib.
+</para>
+</sect2>
+<sect2 id="Querying_Color_Space_Format_and_Prefix">
+<title>Querying Color Space Format and Prefix</title>
+<!-- .XS -->
+<!-- (SN Querying Color Space Format and Prefix -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To obtain the format associated with the color space
+associated with a specified color string prefix, use
+<xref linkend='XcmsFormatOfPrefix' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XcmsFormatOfPrefix</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsFormatOfPrefix'>
+<funcprototype>
+  <funcdef>XcmsColorFormat <function>XcmsFormatOfPrefix</function></funcdef>
+  <paramdef>char<parameter> *prefix</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>prefix</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the string that contains the color space prefix.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XcmsFormatOfPrefix' xrefstyle='select: title'/>
+function returns the format for the specified color space prefix
+(for example, the string ``CIEXYZ'').
+The prefix is case-insensitive.
+If the color space is not accessible in the color management system,
+<xref linkend='XcmsFormatOfPrefix' xrefstyle='select: title'/>
+returns 
+<symbol>XcmsUndefinedFormat</symbol>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain the color string prefix associated with the color space
+specified by a color format, use
+<xref linkend='XcmsPrefixOfFormat' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XcmsPrefixOfFormat</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsPrefixOfFormat'>
+<funcprototype>
+  <funcdef>char *<function>XcmsPrefixOfFormat</function></funcdef>
+  <paramdef>XcmsColorFormat<parameter> format</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>format</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the color specification format.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XcmsPrefixOfFormat' xrefstyle='select: title'/>
+function returns the string prefix associated with the color specification
+encoding specified by the format argument.
+Otherwise, if no encoding is found, it returns NULL.
+The returned string must be treated as read-only.
+</para>
+</sect2>
+<sect2 id="Creating_Additional_Color_Spaces">
+<title>Creating Additional Color Spaces</title>
+<!-- .XS -->
+<!-- (SN Creating Additional Color Spaces -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Color space specific information necessary 
+for color space conversion and color string parsing is stored in an
+<structname>XcmsColorSpace</structname>
+structure.
+Therefore, a new structure containing this information is required
+for each additional color space.
+In the case of device-independent color spaces,
+a handle to this new structure (that is, by means of a global variable)
+is usually made accessible to the client program for use with the
+<xref linkend='XcmsAddColorSpace' xrefstyle='select: title'/>
+function.
+</para>
+<para>
+<!-- .LP -->
+If a new 
+<structname>XcmsColorSpace</structname>
+structure specifies a color space not registered with the X Consortium,
+they should be treated as private to the client
+because format values for unregistered color spaces are assigned at run time.
+If references to an unregistered color space must be made outside the
+client (for example, storing color specifications in a file using the
+unregistered color space), then reference should be made by color space prefix
+(see
+<xref linkend='XcmsFormatOfPrefix' xrefstyle='select: title'/>
+and
+<xref linkend='XcmsPrefixOfFormat' xrefstyle='select: title'/>).
+<!-- .sM -->
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef (*XcmsConversionProc)();
+typedef XcmsConversionProc *XcmsFuncListPtr;
+               /* A NULL terminated list of function pointers*/
+
+typedef struct _XcmsColorSpace {
+       char *prefix;
+       XcmsColorFormat format;
+       XcmsParseStringProc parseString;
+       XcmsFuncListPtr to_CIEXYZ;
+       XcmsFuncListPtr from_CIEXYZ;
+       int inverse_flag;
+} XcmsColorSpace;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The prefix member specifies the prefix that indicates a color string 
+is in this color space's string format.
+For example, the strings ``ciexyz'' or ``CIEXYZ'' for <acronym>CIE</acronym> XYZ,
+and ``rgb'' or ``<acronym>RGB</acronym>'' for <acronym>RGB</acronym>.
+The prefix is case insensitive.
+The format member specifies the color specification format.
+Formats for unregistered color spaces are assigned at run time.
+The parseString member contains a pointer to the function 
+that can parse a color string into an 
+<structname>XcmsColor</structname>
+structure.
+This function returns an integer (int): nonzero if it succeeded
+and zero otherwise.
+The to_CIEXYZ and from_CIEXYZ members contain pointers,
+each to a NULL terminated list of function pointers.
+When the list of functions is executed in series,
+it will convert the color specified in an 
+<structname>XcmsColor</structname>
+structure from/to the current color space format to/from the <acronym>CIE</acronym> XYZ format.
+Each function returns an integer (int): nonzero if it succeeded
+and zero otherwise.
+The white point to be associated with the colors is specified
+explicitly, even though white points can be found in the CCC.
+The inverse_flag member, if nonzero, specifies that for each function listed 
+in to_CIEXYZ,
+its inverse function can be found in from_CIEXYZ such that:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+Given:  n = number of functions in each list
+
+for each i, such that 0 &lt;= i &lt; n
+    from_CIEXYZ[n - i - 1] is the inverse of to_CIEXYZ[i].
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+This allows Xlib to use the shortest conversion path,
+thus bypassing <acronym>CIE</acronym> XYZ if possible (for example, TekHVC to <acronym>CIE</acronym> L*u*v*).
+</para>
+</sect2>
+<sect2 id="Parse_String_Callback">
+<title>Parse String Callback</title>
+<!-- .XS -->
+<!-- (SN Parse String Callback -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The callback in the
+<structname>XcmsColorSpace</structname>
+structure for parsing a color string for the particular color space must
+adhere to the following software interface specification:
+</para>
+<indexterm significance="preferred"><primary>XcmsParseStringProc</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsParseStringProc'>
+<funcprototype>
+  <funcdef>Status <function>XcmsParseStringProc</function></funcdef>
+  <paramdef>char<parameter> *color_string</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> *color_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color_string</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the color string to parse.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>color_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the color specification in the color space's format.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+</para>
+</sect2>
+<sect2 id="Color_Specification_Conversion_Callback">
+<title>Color Specification Conversion Callback</title>
+<!-- .XS -->
+<!-- (SN Color Specification Conversion Callback -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Callback functions in the
+<structname>XcmsColorSpace</structname>
+structure for converting a color specification between device-independent
+spaces must adhere to the
+following software interface specification:
+</para>
+<!-- .sM -->
+<funcsynopsis id='ConversionProc'>
+<funcprototype>
+  <funcdef>Status <function><replaceable>ConversionProc</replaceable></function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> *white_point</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> *colors_in_out</parameter></paramdef>
+  <paramdef>unsignedint<parameter> ncolors</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>white_point</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the white point associated with color specifications.
+The pixel member should be ignored,
+and the entire structure remain unchanged upon return.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colors_in_out</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies an array of color specifications.
+Pixel members should be ignored and must remain unchanged upon return.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ncolors</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of 
+<structname>XcmsColor</structname>
+structures in the color-specification array.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<!-- .sp -->
+Callback functions in the
+<structname>XcmsColorSpace</structname>
+structure for converting a color specification to or from a device-dependent
+space must adhere to the
+following software interface specification:
+</para>
+<!-- .sM -->
+<funcsynopsis>
+<funcprototype>
+  <funcdef>Status <function><replaceable>ConversionProc</replaceable></function></funcdef>
+  <paramdef>XcmsCCC<parameter> ccc</parameter></paramdef>
+  <paramdef>XcmsColor<parameter> *colors_in_out</parameter></paramdef>
+  <paramdef>unsignedint<parameter> ncolors</parameter></paramdef>
+  <paramdef>Bool<parameter> compression_flags_return[]</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ccc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the CCC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colors_in_out</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies an array of color specifications.
+Pixel members should be ignored and must remain unchanged upon return.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ncolors</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of 
+<structname>XcmsColor</structname>
+structures in the color-specification array.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>compression_flags_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns an array of Boolean values for indicating compression status.
+If a non-NULL pointer is supplied
+and a color at a given index is compressed, then
+<symbol>True</symbol>
+should be stored at the corresponding index in this array;
+otherwise, the array should not be modified.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+Conversion functions are available globally for use by other color
+spaces.
+The conversion functions provided by Xlib are:
+</para>
+<informaltable frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <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>Function</entry>
+      <entry>Converts from</entry>
+      <entry>Converts to</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry><function>XcmsCIELabToCIEXYZ</function></entry>
+      <entry><symbol>XcmsCIELabFormat</symbol></entry>
+      <entry><symbol>XcmsCIEXYZFormat</symbol></entry>
+    </row>
+    <row>
+      <entry><function>XcmsCIELuvToCIEuvY</function></entry>
+      <entry><symbol>XcmsCIELuvFormat</symbol></entry>
+      <entry><symbol>XcmsCIEuvYFormat</symbol></entry>
+    </row>
+    <row>
+      <entry><function>XcmsCIEXYZToCIELab</function></entry>
+      <entry><symbol>XcmsCIEXYZFormat</symbol></entry>
+      <entry><symbol>XcmsCIELabFormat</symbol></entry>
+    </row>
+    <row>
+      <entry><function>XcmsCIEXYZToCIEuvY</function></entry>
+      <entry><symbol>XcmsCIEXYZFormat</symbol></entry>
+      <entry><symbol>XcmsCIEuvYFormat</symbol></entry>
+    </row>
+    <row>
+      <entry><function>XcmsCIEXYZToCIExyY</function></entry>
+      <entry><symbol>XcmsCIEXYZFormat</symbol></entry>
+      <entry><symbol>XcmsCIExyYFormat</symbol></entry>
+    </row>
+    <row>
+      <entry><function>XcmsCIEXYZToRGBi</function></entry>
+      <entry><symbol>XcmsCIEXYZFormat</symbol></entry>
+      <entry><symbol>XcmsRGBiFormat</symbol></entry>
+    </row>
+    <row>
+      <entry><function>XcmsCIEuvYToCIELuv</function></entry>
+      <entry><symbol>XcmsCIEuvYFormat</symbol></entry>
+      <entry><symbol>XcmsCIELabFormat</symbol></entry>
+    </row>
+    <row>
+      <entry><function>XcmsCIEuvYToCIEXYZ</function></entry>
+      <entry><symbol>XcmsCIEuvYFormat</symbol></entry>
+      <entry><symbol>XcmsCIEXYZFormat</symbol></entry>
+    </row>
+    <row>
+      <entry><function>XcmsCIEuvYToTekHVC</function></entry>
+      <entry><symbol>XcmsCIEuvYFormat</symbol></entry>
+      <entry><symbol>XcmsTekHVCFormat</symbol></entry>
+    </row>
+    <row>
+      <entry><function>XcmsCIExyYToCIEXYZ</function></entry>
+      <entry><symbol>XcmsCIExyYFormat</symbol></entry>
+      <entry><symbol>XcmsCIEXYZFormat</symbol></entry>
+    </row>
+    <row>
+      <entry><function>XcmsRGBToRGBi</function></entry>
+      <entry><symbol>XcmsRGBFormat</symbol></entry>
+      <entry><symbol>XcmsRGBiFormat</symbol></entry>
+    </row>
+    <row>
+      <entry><function>XcmsRGBiToCIEXYZ</function></entry>
+      <entry><symbol>XcmsRGBiFormat</symbol></entry>
+      <entry><symbol>XcmsCIEXYZFormat</symbol></entry>
+    </row>
+    <row>
+      <entry><function>XcmsRGBiToRGB</function></entry>
+      <entry><symbol>XcmsRGBiFormat</symbol></entry>
+      <entry><symbol>XcmsRGBFormat</symbol></entry>
+    </row>
+    <row>
+      <entry><function>XcmsTekHVCToCIEuvY</function></entry>
+      <entry><symbol>XcmsTekHVCFormat</symbol></entry>
+      <entry><symbol>XcmsCIEuvYFormat</symbol></entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+</sect2>
+<sect2 id="Function_Sets">
+<title>Function Sets</title>
+<!-- .XS -->
+<!-- (SN Function Sets -->
+<!-- .XE -->
+<indexterm><primary>Function set</primary></indexterm>
+<indexterm><primary>Function set</primary><secondary>LINEAR_RGB</secondary></indexterm>
+<para>
+<!-- .LP -->
+Functions to convert between device-dependent color spaces
+and <acronym>CIE</acronym> XYZ may differ for different classes of output devices
+(for example, color versus gray monitors).
+Therefore, the notion of a Color Characterization Function Set
+has been developed.
+A function set consists of device-dependent color spaces
+and the functions that convert color specifications 
+between these device-dependent color spaces and the <acronym>CIE</acronym> XYZ color space
+appropriate for a particular class of output devices.
+The function set also contains a function that reads
+color characterization data off root window properties.
+It is this characterization data that will differ between devices within
+a class of output devices.
+<indexterm><primary>Device Color Characterization</primary></indexterm>
+For details about how color characterization data is
+stored in root window properties,
+see <olink targetdoc='icccm' targetptr='Device_Color_Characterization'>the
+section on Device Color Characterization in the
+<citetitle>Inter-Client Communication Conventions Manual</citetitle></olink>.
+The LINEAR_RGB function set is provided by Xlib
+and will support most color monitors.
+Function sets may require data that differs
+from those needed for the LINEAR_RGB function set.
+In that case, 
+its corresponding data may be stored on different root window properties.
+</para>
+</sect2>
+<sect2 id="Adding_Function_Sets">
+<title>Adding Function Sets</title>
+<!-- .XS -->
+<!-- (SN Adding Function Sets -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To add a function set, use
+<xref linkend='XcmsAddFunctionSet' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XcmsAddFunctionSet</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XcmsAddFunctionSet'>
+<funcprototype>
+  <funcdef>Status <function>XcmsAddFunctionSet</function></funcdef>
+  <paramdef>XcmsFunctionSet<parameter> *function_set</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>function_set</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the function set to add.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XcmsAddFunctionSet' xrefstyle='select: title'/>
+function adds a function set to the color management system.
+If the function set uses device-dependent 
+<structname>XcmsColorSpace</structname>
+structures not accessible in the color management system,
+<xref linkend='XcmsAddFunctionSet' xrefstyle='select: title'/>
+adds them.
+If an added
+<structname>XcmsColorSpace</structname>
+structure is for a device-dependent color space not registered
+with the X Consortium,
+they should be treated as private to the client
+because format values for unregistered color spaces are assigned at run time.
+If references to an unregistered color space must be made outside the
+client (for example, storing color specifications in a file
+using the unregistered color space),
+then reference should be made by color space prefix
+(see 
+<xref linkend='XcmsFormatOfPrefix' xrefstyle='select: title'/>
+and
+<xref linkend='XcmsPrefixOfFormat' xrefstyle='select: title'/>).
+</para>
+<para>
+<!-- .LP -->
+Additional function sets should be added before any calls to other
+Xlib routines are made.
+If not, the 
+<structname>XcmsPerScrnInfo</structname>
+member of a previously created 
+<structname>XcmsCCC</structname>
+does not have the opportunity to initialize
+with the added function set.
+</para>
+</sect2>
+<sect2 id="Creating_Additional_Function_Sets">
+<title>Creating Additional Function Sets</title>
+<!-- .XS -->
+<!-- (SN Creating Additional Function Sets -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The creation of additional function sets should be
+required only when an output device does not conform to existing 
+function sets or when additional device-dependent color spaces are necessary.
+A function set consists primarily of a collection of device-dependent
+<structname>XcmsColorSpace</structname>
+structures and a means to read and store a 
+screen's color characterization data.
+This data is stored in an
+<structname>XcmsFunctionSet</structname>
+structure.
+A handle to this structure (that is, by means of global variable)
+is usually made accessible to the client program for use with
+<xref linkend='XcmsAddFunctionSet' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+If a function set uses new device-dependent 
+<structname>XcmsColorSpace</structname>
+structures,
+they will be transparently processed into the color management system.
+Function sets can share an 
+<structname>XcmsColorSpace</structname>
+structure for a device-dependent color space.
+In addition, multiple 
+<structname>XcmsColorSpace</structname>
+structures are allowed for a device-dependent color space;
+however, a function set can reference only one of them.
+These 
+<structname>XcmsColorSpace</structname>
+structures will differ in the functions to convert to and from <acronym>CIE</acronym> XYZ,
+thus tailored for the specific function set.
+<!-- .sM -->
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef struct _XcmsFunctionSet {
+       XcmsColorSpace **DDColorSpaces;
+       XcmsScreenInitProc screenInitProc;
+       XcmsScreenFreeProc screenFreeProc;
+} XcmsFunctionSet;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The DDColorSpaces member is a pointer to a NULL terminated list
+of pointers to 
+<structname>XcmsColorSpace</structname>
+structures for the device-dependent color spaces that are supported
+by the function set.
+The screenInitProc member is set to the callback procedure (see the following
+interface specification) that initializes the 
+<structname>XcmsPerScrnInfo</structname>
+structure for a particular screen.
+</para>
+<para>
+<!-- .LP -->
+The screen initialization callback must adhere to the following software
+interface specification:
+<indexterm significance="preferred"><primary>XcmsScreenInitProc</primary></indexterm>
+<!-- .sM -->
+</para>
+<funcsynopsis>
+<funcprototype>
+  <funcdef>typedef Status <function>(*XcmsScreenInitProc</function>)</funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> screen_number</parameter></paramdef>
+  <paramdef>ScmsPerScrnInfo<parameter> *screen_info</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen_number</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate screen number on the host server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen_info</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the 
+<structname>XcmsPerScrnInfo</structname>
+structure, which contains the per screen information.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The screen initialization callback in the
+<structname>XcmsFunctionSet</structname>
+structure fetches the color characterization data (device profile) for
+the specified screen,
+typically off properties on the 
+screen's root window.
+It then initializes the specified
+<structname>XcmsPerScrnInfo</structname>
+structure.
+<indexterm><primary>Device profile</primary></indexterm>
+<indexterm><primary>Color Characterization Data</primary></indexterm>
+If successful, the procedure fills in the 
+<structname>XcmsPerScrnInfo</structname>
+structure as follows:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+It sets the screenData member to the address 
+of the created device profile data structure 
+(contents known only by the function set).
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It next sets the screenWhitePoint member.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It next sets the functionSet member to the address of the
+<structname>XcmsFunctionSet</structname>
+structure.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It then sets the state member to 
+<symbol>XcmsInitSuccess</symbol>
+and finally returns
+<symbol>XcmsSuccess</symbol>.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+If unsuccessful, the procedure sets the state member to 
+<symbol>XcmsInitFailure</symbol>
+and returns
+<symbol>XcmsFailure</symbol>.
+</para>
+<para>
+<!-- .LP -->
+The
+<structname>XcmsPerScrnInfo</structname>
+structure contains:
+<!-- .sM -->
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef struct _XcmsPerScrnInfo {
+       XcmsColor screenWhitePoint;
+       XPointer functionSet;
+       XPointer screenData;
+       unsigned char state;
+       char pad[3];
+} XcmsPerScrnInfo;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The screenWhitePoint member specifies the white point inherent to
+the screen.
+The functionSet member specifies the appropriate function set.
+The screenData member specifies the device profile.
+The state member is set to one of the following:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+<symbol>XcmsInitNone</symbol>
+indicates initialization has not been previously attempted.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<symbol>XcmsInitFailure</symbol>
+indicates initialization has been previously attempted but failed.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<symbol>XcmsInitSuccess</symbol>
+indicates initialization has been previously attempted and succeeded.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+The screen free callback must adhere to the following software
+interface specification:
+</para>
+<funcsynopsis>
+<funcprototype>
+  <funcdef>typedef void (*XcmsScreenFreeProc)</funcdef>
+  <paramdef>XPointer<parameter> screenData</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screenData</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the data to be freed.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+This function is called to free the screenData stored in an
+<structname>XcmsPerScrnInfo</structname>
+structure.
+<!-- .bp -->
+
+</para>
+</sect2>
+</sect1>
+</chapter>
diff --git a/specs/libX11/CH07.xml b/specs/libX11/CH07.xml
new file mode 100644 (file)
index 0000000..b50dc83
--- /dev/null
@@ -0,0 +1,3407 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+         "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
+<chapter id='Graphics_Context_Functions'>
+<title>Graphics Context Functions</title>
+
+<para>
+A number of resources are used when performing graphics operations in X. Most information
+about performing graphics (for example, foreground color, background color, line style, and so
+on) is stored in resources called graphics contexts (GCs). Most graphics operations (see chapter
+8) take a GC as an argument. Although in theory the X protocol permits sharing of GCs between
+applications, it is expected that applications will use their own GCs when performing operations.
+Sharing of GCs is highly discouraged because the library may cache GC state.
+</para>
+<para>
+Graphics operations can be performed to either windows or pixmaps, which collectively are
+called drawables. Each drawable exists on a single screen. A GC is created for a specific screen
+and drawable depth and can only be used with drawables of matching screen and depth.
+</para>
+<para>
+This chapter discusses how to:
+</para>
+<itemizedlist>
+  <listitem><para>Manipulate graphics context/state</para></listitem>
+  <listitem><para>Use graphics context convenience functions</para></listitem>
+</itemizedlist>
+
+<sect1 id='Manipulating_Graphics_ContextState'>
+<title>Manipulating Graphics Context/State</title>
+<!-- .XS -->
+<!-- (SN Manipulating Graphics Context/State  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Most attributes of graphics operations are stored in GCs.
+These include line width, line style, plane mask, foreground, background,
+tile, stipple, clipping region, end style, join style, and so on.
+Graphics operations (for example, drawing lines) use these values
+to determine the actual drawing operation.
+Extensions to X may add additional components to GCs.
+The contents of a GC are private to Xlib.
+</para>
+<para>
+<!-- .LP -->
+Xlib implements a write-back cache for all elements of a GC that are not
+resource IDs to allow Xlib to implement the transparent coalescing of changes 
+to GCs.
+For example,
+a call to
+<xref linkend='XSetForeground' xrefstyle='select: title'/>
+of a GC followed by a call to
+<xref linkend='XSetLineAttributes' xrefstyle='select: title'/>
+results in only a single-change GC protocol request to the server.
+GCs are neither expected nor encouraged to be shared between client 
+applications, so this write-back caching should present no problems.
+Applications cannot share GCs without external synchronization.
+Therefore,
+sharing GCs between applications is highly discouraged. 
+</para>
+<para>
+<!-- .LP -->
+To set an attribute of a GC,
+set the appropriate member of the
+<structname>XGCValues</structname>
+structure and OR in the corresponding value bitmask in your subsequent calls to
+<xref linkend='XCreateGC' xrefstyle='select: title'/>.
+The symbols for the value mask bits and the
+<structname>XGCValues</structname>
+structure are:
+<!-- .sM -->
+</para>
+
+
+<literallayout class="monospaced">
+/* GC attribute value mask bits */
+
+#define     GCFunction              (1L&lt;&lt;0)
+#define     GCPlaneMask             (1L&lt;&lt;1)
+#define     GCForeground            (1L&lt;&lt;2)
+#define     GCBackground            (1L&lt;&lt;3)
+#define     GCLineWidth             (1L&lt;&lt;4)
+#define     GCLineStyle             (1L&lt;&lt;5)
+#define     GCCapStyle              (1L&lt;&lt;6)
+#define     GCJoinStyle             (1L&lt;&lt;7)
+#define     GCFillStyle             (1L&lt;&lt;8)
+#define     GCFillRule              (1L&lt;&lt;9)
+#define     GCTile                  (1L&lt;&lt;10)
+#define     GCStipple               (1L&lt;&lt;11)
+#define     GCTileStipXOrigin       (1L&lt;&lt;12)
+#define     GCTileStipYOrigin       (1L&lt;&lt;13)
+#define     GCFont                  (1L&lt;&lt;14)
+#define     GCSubwindowMode         (1L&lt;&lt;15)
+#define     GCGraphicsExposures     (1L&lt;&lt;16)
+#define     GCClipXOrigin           (1L&lt;&lt;17)
+#define     GCClipYOrigin           (1L&lt;&lt;18)
+#define     GCClipMask              (1L&lt;&lt;19)
+#define     GCDashOffset            (1L&lt;&lt;20)
+#define     GCDashList              (1L&lt;&lt;21)
+#define     GCArcMode               (1L&lt;&lt;22)
+</literallayout>
+
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+/* Values */
+
+typedef struct {
+     int function;                 /* logical operation */
+     unsigned long plane_mask;     /* plane mask */
+     unsigned long foreground;     /* foreground pixel */
+     unsigned long background;     /* background pixel */
+     int line_width;               /* line width (in pixels) */
+     int line_style;               /* LineSolid, LineOnOffDash, LineDoubleDash */
+     int cap_style;                /* CapNotLast, CapButt, CapRound, CapProjecting */
+     int join_style;               /* JoinMiter, JoinRound, JoinBevel */
+     int fill_style;               /* FillSolid, FillTiled, FillStippled FillOpaqueStippled*/
+     int fill_rule;                /* EvenOddRule, WindingRule */
+     int arc_mode;                 /* ArcChord, ArcPieSlice */
+     Pixmap tile;                  /* tile pixmap for tiling operations */
+     Pixmap stipple;               /* stipple 1 plane pixmap for stippling */
+     int ts_x_origin;              /* offset for tile or stipple operations */
+     int ts_y_origin
+     Font font;                    /* default text font for text operations */
+     int subwindow_mode;           /* ClipByChildren, IncludeInferiors */
+     Bool graphics_exposures;      /* boolean, should exposures be generated */
+     int clip_x_origin;            /* origin for clipping */
+     int clip_y_origin;
+     Pixmap clip_mask;             /* bitmap clipping; other calls for rects */
+     int dash_offset;              /* patterned/dashed line information */
+     char dashes;
+} XGCValues;
+</literallayout>
+
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The default GC values are:
+</para>
+<informaltable frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='1.0*'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Component</entry>
+      <entry>Default</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>function</entry>
+      <entry><symbol>GXcopy</symbol></entry>
+    </row>
+    <row>
+      <entry>plane_mask</entry>
+      <entry>All ones</entry>
+    </row>
+    <row>
+      <entry>foreground</entry>
+      <entry>0</entry>
+    </row>
+    <row>
+      <entry>background</entry>
+      <entry>1</entry>
+    </row>
+    <row>
+      <entry>line_width</entry>
+      <entry>0</entry>
+    </row>
+    <row>
+      <entry>line_style</entry>
+      <entry><symbol>LineSolid</symbol></entry>
+    </row>
+    <row>
+      <entry>cap_style</entry>
+      <entry><symbol>CapButt</symbol></entry>
+    </row>
+    <row>
+      <entry>join_style</entry>
+      <entry><symbol>JoinMiter</symbol></entry>
+    </row>
+    <row>
+      <entry>fill_style</entry>
+      <entry><symbol>FillSolid</symbol></entry>
+    </row>
+    <row>
+      <entry>fill_rule</entry>
+      <entry><symbol>EvenOddRule</symbol></entry>
+    </row>
+    <row>
+      <entry>arc_mode</entry>
+      <entry><symbol>ArcPieSlice</symbol></entry>
+    </row>
+    <row>
+      <entry>tile</entry>
+      <entry>
+      <para>Pixmap of unspecified size filled with foreground pixel</para>
+      <para>(that is, client specified pixel if any, else 0)</para>
+      <para>(subsequent changes to foreground do not affect this pixmap)</para>
+      </entry>
+    </row>
+    <row>
+      <entry>stipple</entry>
+      <entry>Pixmap of unspecified size filled with ones</entry>
+    </row>
+    <row>
+      <entry>ts_x_origin</entry>
+      <entry>0</entry>
+    </row>
+    <row>
+      <entry>ts_y_origin</entry>
+      <entry>0</entry>
+    </row>
+    <row>
+      <entry>font</entry>
+      <entry>&lt;implementation dependent&gt;</entry>
+    </row>
+    <row>
+      <entry>subwindow_mode</entry>
+      <entry><symbol>ClipByChildren</symbol></entry>
+    </row>
+    <row>
+      <entry>graphics_exposures</entry>
+      <entry><symbol>True</symbol></entry>
+    </row>
+    <row>
+      <entry>clip_x_origin</entry>
+      <entry>0</entry>
+    </row>
+    <row>
+      <entry>clip_y_origin</entry>
+      <entry>0</entry>
+    </row>
+    <row>
+      <entry>clip_mask</entry>
+      <entry><symbol>None</symbol></entry>
+    </row>
+    <row>
+      <entry>dash_offset</entry>
+      <entry>0</entry>
+    </row>
+    <row>
+      <entry>dashes</entry>
+      <entry>4 (that is, the list [4, 4])</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+<!-- .LP -->
+Note that foreground and background are not set to any values likely
+to be useful in a window.
+</para>
+
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>Display Functions</primary></indexterm>
+<indexterm significance="preferred"><primary>Source</primary></indexterm>
+<indexterm significance="preferred"><primary>Destination</primary></indexterm>
+The function attributes of a GC are used when you update a section of
+a drawable (the destination) with bits from somewhere else (the source).  
+The function in a GC defines how the new destination bits are to be
+computed from the source bits and the old destination bits.
+<symbol>GXcopy</symbol>
+is typically the most useful because it will work on a color display,
+but special applications may use other functions,
+particularly in concert with particular planes of a color display.
+The 16 GC functions, defined in 
+<filename class="headerfile">&lt;X11/X.h&gt;</filename>,
+<indexterm type="file"><primary><filename class="headerfile">X11/X.h</filename></primary></indexterm>
+<indexterm><primary>Files</primary><secondary><filename class="headerfile">&lt;X11/X.h&gt;</filename></secondary></indexterm>
+<indexterm><primary>Headers</primary><secondary><filename class="headerfile">&lt;X11/X.h&gt;</filename></secondary></indexterm>
+are:
+</para>
+<!-- .\" are listed in Table 5-1 along with the  -->
+<!-- .\"the associated hexadecimal code -->
+<!-- .\" and operation. -->
+<!-- .\".CP T 1 -->
+<!-- .\"Display Functions -->
+<informaltable frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <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>Function Name</entry>
+      <entry>Value</entry>
+      <entry>Operation</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry><symbol>GXclear</symbol></entry>
+      <entry>0x0</entry>
+      <entry>0</entry>
+    </row>
+    <row>
+      <entry><symbol>GXand</symbol></entry>
+      <entry>0x1</entry>
+      <entry>src AND dst</entry>
+    </row>
+    <row>
+      <entry><symbol>GXandReverse</symbol></entry>
+      <entry>0x2</entry>
+      <entry>src AND NOT dst</entry>
+    </row>
+    <row>
+      <entry><symbol>GXcopy</symbol></entry>
+      <entry>0x3</entry>
+      <entry>src</entry>
+    </row>
+    <row>
+      <entry><symbol>GXandInverted</symbol></entry>
+      <entry>0x4</entry>
+      <entry>(NOT src) AND dst</entry>
+    </row>
+    <row>
+      <entry><symbol>GXnoop</symbol></entry>
+      <entry>0x5</entry>
+      <entry>dst</entry>
+    </row>
+    <row>
+      <entry><symbol>GXxor</symbol></entry>
+      <entry>0x6</entry>
+      <entry>src XOR dst</entry>
+    </row>
+    <row>
+      <entry><symbol>GXor</symbol></entry>
+      <entry>0x7</entry>
+      <entry>src OR dst</entry>
+    </row>
+    <row>
+      <entry><symbol>GXnor</symbol></entry>
+      <entry>0x8</entry>
+      <entry>(NOT src) AND (NOT dst)</entry>
+    </row>
+    <row>
+      <entry><symbol>GXequiv</symbol></entry>
+      <entry>0x9</entry>
+      <entry>(NOT src) XOR dst</entry>
+    </row>
+    <row>
+      <entry><symbol>GXinvert</symbol></entry>
+      <entry>0xa</entry>
+      <entry>NOT dst</entry>
+    </row>
+    <row>
+      <entry><symbol>GXorReverse</symbol></entry>
+      <entry>0xb</entry>
+      <entry>src OR (NOT dst)</entry>
+    </row>
+    <row>
+      <entry><symbol>GXcopyInverted</symbol></entry>
+      <entry>0xc</entry>
+      <entry>NOT src</entry>
+    </row>
+    <row>
+      <entry><symbol>GXorInverted</symbol></entry>
+      <entry>0xd</entry>
+      <entry>(NOT src) OR dst</entry>
+    </row>
+    <row>
+      <entry><symbol>GXnand</symbol></entry>
+      <entry>0xe</entry>
+      <entry>(NOT src) OR (NOT dst)</entry>
+    </row>
+    <row>
+      <entry><symbol>GXset</symbol></entry>
+      <entry>0xf</entry>
+      <entry>1</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+<!-- .LP -->
+Many graphics operations depend on either pixel values or planes in a GC.
+<indexterm><primary>Pixel value</primary></indexterm>
+The planes attribute is of type long, and it specifies which planes of the
+destination are to be modified, one bit per plane.
+<indexterm><primary>Plane</primary><secondary>mask</secondary></indexterm>
+A monochrome display has only one plane and
+will be the least significant bit of the word.
+As planes are added to the display hardware, they will occupy more
+significant bits in the plane mask.
+</para>
+<para>
+<!-- .LP -->
+In graphics operations, given a source and destination pixel, 
+the result is computed bitwise on corresponding bits of the pixels.
+That is, a Boolean operation is performed in each bit plane.  
+The plane_mask restricts the operation to a subset of planes.
+A macro constant
+<symbol>AllPlanes</symbol>
+can be used to refer to all planes of the screen simultaneously.
+The result is computed by the following:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+((src FUNC dst) AND plane-mask) OR (dst AND (NOT plane-mask))
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+Range checking is not performed on the values for foreground,
+background, or plane_mask.
+They are simply truncated to the appropriate
+number of bits.
+The line-width is measured in pixels and either can be greater than or equal to
+one (wide line) or can be the special value zero (thin line).
+</para>
+<para>
+<!-- .LP -->
+Wide lines are drawn centered on the path described by the graphics request.
+Unless otherwise specified by the join-style or cap-style,
+the bounding box of a wide line with endpoints [x1, y1], [x2, y2] and
+width w is a rectangle with vertices at the following real coordinates:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+[x1-(w*sn/2), y1+(w*cs/2)], [x1+(w*sn/2), y1-(w*cs/2)],
+[x2-(w*sn/2), y2+(w*cs/2)], [x2+(w*sn/2), y2-(w*cs/2)]
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+Here sn is the sine of the angle of the line,
+and cs is the cosine of the angle of the line.
+A pixel is part of the line and so is drawn
+if the center of the pixel is fully inside the bounding box
+(which is viewed as having infinitely thin edges).
+If the center of the pixel is exactly on the bounding box,
+it is part of the line if and only if the interior is immediately to its right
+(x increasing direction).
+Pixels with centers on a horizontal edge are a special case and are part of
+the line if and only if the interior or the boundary is immediately below 
+(y increasing direction) and the interior or the boundary is immediately
+to the right (x increasing direction).
+</para>
+<para>
+<!-- .LP -->
+Thin lines (zero line-width) are one-pixel-wide lines drawn using an
+unspecified, device-dependent algorithm.
+There are only two constraints on this algorithm. 
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+If a line is drawn unclipped from [x1,y1] to [x2,y2] and
+if another line is drawn unclipped from [x1+dx,y1+dy] to [x2+dx,y2+dy],
+a point [x,y] is touched by drawing the first line 
+if and only if the point [x+dx,y+dy] is touched by drawing the second line.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The effective set of points comprising a line cannot be affected by clipping.
+That is, a point is touched in a clipped line if and only if the point 
+lies inside the clipping region and the point would be touched
+by the line when drawn unclipped.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+A wide line drawn from [x1,y1] to [x2,y2] always draws the same pixels 
+as a wide line drawn from [x2,y2] to [x1,y1], not counting cap-style 
+and join-style.
+It is recommended that this property be true for thin lines, 
+but this is not required.
+A line-width of zero may differ from a line-width of one in which pixels are
+drawn.
+This permits the use of many manufacturers' line drawing hardware,
+which may run many times faster than the more precisely specified
+wide lines.
+</para>
+<para>
+<!-- .LP -->
+In general, 
+drawing a thin line will be faster than drawing a wide line of width one.
+However, because of their different drawing algorithms,
+thin lines may not mix well aesthetically with wide lines.
+If it is desirable to obtain precise and uniform results across all displays,
+a client should always use a line-width of one rather than a line-width of zero.
+</para>
+<para>
+<!-- .LP -->
+The line-style defines which sections of a line are drawn:
+</para>
+
+<variablelist>
+  <varlistentry>
+    <term><symbol>LineSolid</symbol></term>
+    <listitem>
+      <para>The full path of the line is drawn.</para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term><symbol>LineDoubleDash</symbol></term>
+    <listitem>
+      <para>
+The full path of the line is drawn,
+but the even dashes are filled differently
+from the odd dashes (see fill-style) with <!-- xref -->
+<symbol>CapButt</symbol>
+style used where even and odd dashes meet.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term><symbol>LineOnOffDash</symbol></term>
+    <listitem>
+      <para>
+Only the even dashes are drawn,
+and cap-style applies to 
+all internal ends of the individual dashes,
+except
+<symbol>CapNotLast</symbol>
+is treated as
+<symbol>CapButt</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+The cap-style defines how the endpoints of a path are drawn:
+</para>
+
+<variablelist>
+  <varlistentry>
+    <term><symbol>CapNotLast</symbol></term>
+    <listitem>
+      <para>
+This is equivalent to
+<symbol>CapButt</symbol>
+except that for a line-width of zero the final endpoint is not drawn.
+     </para>
+    </listitem>
+  </varlistentry>
+
+  <varlistentry>
+    <term><symbol>CapButt</symbol></term>
+    <listitem>
+      <para>
+The line is square at the endpoint (perpendicular to the slope of the line)
+with no projection beyond.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term><symbol>CapRound</symbol></term>
+    <listitem>
+      <para>
+The line has a circular arc with the diameter equal to the line-width,
+centered on the endpoint.
+(This is equivalent to 
+<symbol>CapButt</symbol>
+for line-width of zero).
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term><symbol>CapProjecting</symbol></term>
+    <listitem>
+      <para>
+The line is square at the end, but the path continues beyond the endpoint
+for a distance equal to half the line-width.
+(This is equivalent to
+<symbol>CapButt</symbol>
+for line-width of zero).
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+The join-style defines how corners are drawn for wide lines:
+</para>
+
+<variablelist>
+  <varlistentry>
+    <term><symbol>JoinMiter</symbol></term>
+    <listitem>
+      <para>
+The outer edges of two lines extend to meet at an angle.
+However, if the angle is less than 11 degrees,
+then a
+<symbol>JoinBevel</symbol>
+join-style is used instead.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term><symbol>JoinRound</symbol></term>
+    <listitem>
+      <para>
+The corner is a circular arc with the diameter equal to the line-width,
+centered on the joinpoint.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term><symbol>JoinBevel</symbol></term>
+    <listitem>
+      <para>
+The corner has
+<symbol>CapButt</symbol>
+endpoint styles with the triangular notch filled.
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+
+
+<para>
+<!-- .LP -->
+For a line with coincident endpoints (x1=x2, y1=y2), 
+when the cap-style is applied to both endpoints, 
+the semantics depends on the line-width and the cap-style:
+</para>
+
+<informaltable frame='none'>
+  <?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='3.0*'/>
+  <tbody>
+    <row>
+      <entry><symbol>CapNotLast</symbol></entry>
+      <entry>thin</entry>
+      <entry>The results are device dependent,
+      but the desired effect is that nothing is drawn.</entry>
+    </row>
+    <row>
+      <entry><symbol>CapButt</symbol></entry>
+      <entry>thin</entry>
+      <entry>The results are device dependent,
+      but the desired effect is that a single pixel is drawn.</entry>
+    </row>
+    <row>
+      <entry><symbol>CapRound</symbol></entry>
+      <entry>thin</entry>
+      <entry>The results are the same as for
+      <symbol>CapButt</symbol> /thin.</entry>
+    </row>
+    <row>
+      <entry><symbol>CapProjecting</symbol></entry>
+      <entry>thin</entry>
+      <entry>The results are the same as for
+      <symbol>CapButt</symbol> /thin.</entry>
+    </row>
+    <row>
+      <entry><symbol>CapButt</symbol></entry>
+      <entry>wide</entry>
+      <entry>Nothing is drawn.</entry>
+    </row>
+    <row>
+      <entry><symbol>CapRound</symbol></entry>
+      <entry>wide</entry>
+      <entry>The closed path is a circle, centered at the endpoint, and
+      with the diameter equal to the line-width.</entry>
+    </row>
+    <row>
+      <entry><symbol>CapProjecting</symbol></entry>
+      <entry>wide</entry>
+      <entry>The closed path is a square, aligned with the coordinate axes, centered at the
+      endpoint, and with the sides equal to the line-width.</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+<!-- .LP -->
+For a line with coincident endpoints (x1=x2, y1=y2), 
+when the join-style is applied at one or both endpoints, 
+the effect is as if the line was removed from the overall path.
+However, if the total path consists of or is reduced to a single point joined
+with itself, the effect is the same as when the cap-style is applied at both
+endpoints.
+</para>
+<para>
+<!-- .LP -->
+The tile/stipple represents an infinite two-dimensional plane,
+with the tile/stipple replicated in all dimensions.
+When that plane is superimposed on the drawable
+for use in a graphics operation, the upper-left corner
+of some instance of the tile/stipple is at the coordinates within
+the drawable specified by the tile/stipple origin.
+The tile/stipple and clip origins are interpreted relative to the
+origin of whatever destination drawable is specified in a graphics
+request.
+The tile pixmap must have the same root and depth as the GC,
+or a
+<errorname>BadMatch</errorname>
+error results.
+The stipple pixmap must have depth one and must have the same root as the
+GC, or a 
+<errorname>BadMatch</errorname>
+error results.  
+For stipple operations where the fill-style is
+<symbol>FillStippled</symbol>
+but not 
+<symbol>FillOpaqueStippled</symbol>,
+the stipple pattern is tiled in a
+single plane and acts as an additional clip mask to be ANDed with the clip-mask.
+Although some sizes may be faster to use than others,
+any size pixmap can be used for tiling or stippling.
+</para>
+
+<para>
+<!-- .LP -->
+The fill-style defines the contents of the source for line, text, and
+fill requests.  
+For all text and fill requests (for example,
+<xref linkend='XDrawText' xrefstyle='select: title'/>,
+<xref linkend='XDrawText16' xrefstyle='select: title'/>,
+<xref linkend='XFillRectangle' xrefstyle='select: title'/>,
+<xref linkend='XFillPolygon' xrefstyle='select: title'/>,
+and
+<xref linkend='XFillArc' xrefstyle='select: title'/>);
+for line requests 
+with line-style 
+<symbol>LineSolid</symbol>
+(for example,
+<xref linkend='XDrawLine' xrefstyle='select: title'/>,
+<xref linkend='XDrawSegments' xrefstyle='select: title'/>,
+<xref linkend='XDrawRectangle' xrefstyle='select: title'/>,
+<xref linkend='XDrawArc' xrefstyle='select: title'/>);
+and for the even dashes for line requests with line-style 
+<symbol>LineOnOffDash</symbol>
+or 
+<symbol>LineDoubleDash</symbol>,
+the following apply:
+</para>
+
+<informaltable frame='none'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='2.0*'/>
+  <tbody>
+    <row>
+      <entry><symbol>FillSolid</symbol></entry>
+      <entry>Foreground</entry>
+    </row>
+    <row>
+      <entry><symbol>FillTiled</symbol></entry>
+      <entry>Tile</entry>
+    </row>
+    <row>
+      <entry><symbol>FillOpaqueStippled</symbol></entry>
+      <entry>A tile with the same width and height as stipple,
+      but with background everywhere stipple has a zero
+      and with foreground everywhere stipple has a one</entry>
+    </row>
+    <row>
+      <entry><symbol>FillStippled</symbol></entry>
+      <entry>Foreground masked by stipple</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+<!-- .LP -->
+When drawing lines with line-style
+<symbol>LineDoubleDash</symbol>,
+the odd dashes are controlled by the fill-style in the following manner:
+</para>
+
+<informaltable frame='none'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='2.0*'/>
+  <tbody>
+    <row>
+      <entry><symbol>FillSolid</symbol></entry>
+      <entry>Background</entry>
+    </row>
+    <row>
+      <entry><symbol>FillTiled</symbol></entry>
+      <entry>Same as for even dashes</entry>
+    </row>
+    <row>
+      <entry><symbol>FillOpaqueStippled</symbol></entry>
+      <entry>Same as for even dashes</entry>
+    </row>
+    <row>
+      <entry><symbol>FillStippled</symbol></entry>
+      <entry>Background masked by stipple</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+<!-- .LP -->
+Storing a pixmap in a GC might or might not result in a copy
+being made.
+If the pixmap is later used as the destination for a graphics request,
+the change might or might not be reflected in the GC.
+If the pixmap is used simultaneously in a graphics request both as
+a destination and as a tile or stipple,
+the results are undefined.
+</para>
+<para>
+<!-- .LP -->
+For optimum performance,
+you should draw as much as possible with the same GC 
+(without changing its components).
+The costs of changing GC components relative to using different GCs
+depend on the display hardware and the server implementation.
+It is quite likely that some amount of GC information will be
+cached in display hardware and that such hardware can only cache a small number
+of GCs.
+</para>
+<para>
+<!-- .LP -->
+The dashes value is actually a simplified form of the
+more general patterns that can be set with 
+<xref linkend='XSetDashes' xrefstyle='select: title'/>.
+Specifying a
+value of N is equivalent to specifying the two-element list [N, N] in 
+<xref linkend='XSetDashes' xrefstyle='select: title'/>.
+The value must be nonzero,
+or a
+<errorname>BadValue</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+The clip-mask restricts writes to the destination drawable.  
+If the clip-mask is set to a pixmap,
+it must have depth one and have the same root as the GC,
+or a
+<errorname>BadMatch</errorname>
+error results.
+If clip-mask is set to
+<symbol>None</symbol>,
+the pixels are always drawn regardless of the clip origin.
+The clip-mask also can be set by calling the
+<xref linkend='XSetClipRectangles' xrefstyle='select: title'/>
+or
+<xref linkend='XSetRegion' xrefstyle='select: title'/>
+functions.
+Only pixels where the clip-mask has a bit set to 1 are drawn.  
+Pixels are not drawn outside the area covered by the clip-mask 
+or where the clip-mask has a bit set to 0.
+The clip-mask affects all graphics requests.
+The clip-mask does not clip sources.
+The clip-mask origin is interpreted relative to the origin of whatever
+destination drawable is specified in a graphics request.
+</para>
+<para>
+<!-- .LP -->
+You can set the subwindow-mode to
+<symbol>ClipByChildren</symbol>
+or
+<symbol>IncludeInferiors</symbol>.
+For 
+<symbol>ClipByChildren</symbol>,
+both source and destination windows are
+additionally clipped by all viewable 
+<symbol>InputOutput</symbol>
+children.  
+For 
+<symbol>IncludeInferiors</symbol>,
+neither source nor destination window is clipped by inferiors. 
+This will result in including subwindow contents in the source
+and drawing through subwindow boundaries of the destination.
+The use of 
+<symbol>IncludeInferiors</symbol>
+on a window of one depth with mapped
+inferiors of differing depth is not illegal, but the semantics are
+undefined by the core protocol.
+</para>
+<para>
+<!-- .LP -->
+The fill-rule defines what pixels are inside (drawn) for
+paths given in 
+<xref linkend='XFillPolygon' xrefstyle='select: title'/>
+requests and can be set to 
+<symbol>EvenOddRule</symbol>
+or
+<symbol>WindingRule</symbol>.
+For
+<symbol>EvenOddRule</symbol>,
+a point is inside if
+an infinite ray with the point as origin crosses the path an odd number
+of times.  
+For 
+<symbol>WindingRule</symbol>,
+a point is inside if an infinite ray with the
+point as origin crosses an unequal number of clockwise and
+counterclockwise directed path segments.
+A clockwise directed path segment is one that crosses the ray from left to
+right as observed from the point.
+A counterclockwise segment is one that crosses the ray from right to left
+as observed from the point.
+The case where a directed line segment is coincident with the ray is
+uninteresting because you can simply choose a different ray that is not
+coincident with a segment.
+</para>
+<para>
+<!-- .LP -->
+For both 
+<symbol>EvenOddRule</symbol>
+and
+<symbol>WindingRule</symbol>,
+a point is infinitely small, 
+and the path is an infinitely thin line.  
+A pixel is inside if the center point of the pixel is inside
+and the center point is not on the boundary.  
+If the center point is on the boundary,
+the pixel is inside if and only if the polygon interior is immediately to
+its right (x increasing direction).  
+Pixels with centers on a horizontal edge are a special case 
+and are inside if and only if the polygon interior is immediately below 
+(y increasing direction).
+</para>
+<para>
+<!-- .LP -->
+The arc-mode controls filling in the 
+<xref linkend='XFillArcs' xrefstyle='select: title'/>
+function and can be set to
+<symbol>ArcPieSlice</symbol>
+or
+<symbol>ArcChord</symbol>.
+For
+<symbol>ArcPieSlice</symbol>,
+the arcs are pie-slice filled.
+For
+<symbol>ArcChord</symbol>,
+the arcs are chord filled.
+</para>
+<para>
+<!-- .LP -->
+The graphics-exposure flag controls 
+<symbol>GraphicsExpose</symbol>
+event generation
+for 
+<xref linkend='XCopyArea' xrefstyle='select: title'/>
+and 
+<xref linkend='XCopyPlane' xrefstyle='select: title'/>
+requests (and any similar requests defined by extensions).
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To create a new GC that is usable on a given screen with a 
+depth of drawable, use
+<xref linkend='XCreateGC' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Graphics context</primary><secondary>initializing</secondary></indexterm>
+<indexterm significance="preferred"><primary>XCreateGC</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XCreateGC'>
+<funcprototype>
+  <funcdef>GC <function>XCreateGC</function></funcdef>
+  <paramdef>Display <parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> valuemask</parameter></paramdef>
+  <paramdef>XGCValues *<parameter>values</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable. 
+<!-- .ds Vm set using the information in the specified values structure -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>valuemask</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies which components in the GC are to be (Vm. 
+This argument is the bitwise inclusive OR of zero or more of the valid
+GC component mask bits.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>values</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies any values as specified by the valuemask.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XCreateGC' xrefstyle='select: title'/>
+function creates a graphics context and returns a GC.
+The GC can be used with any destination drawable having the same root
+and depth as the specified drawable.
+Use with other drawables results in a
+<errorname>BadMatch</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XCreateGC' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>,
+<errorname>BadDrawable</errorname>,
+<errorname>BadFont</errorname>,
+<errorname>BadMatch</errorname>,
+<errorname>BadPixmap</errorname>,
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To copy components from a source GC to a destination GC, use
+<xref linkend='XCopyGC' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XCopyGC</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XCopyGC'>
+<funcprototype>
+  <funcdef><function>XCopyGC</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>GCsrc,<parameter> dest</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> valuemask</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>src</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the components of the source GC.
+<!-- .ds Vm copied to the destination GC -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>valuemask</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies which components in the GC are to be (Vm. 
+This argument is the bitwise inclusive OR of zero or more of the valid
+GC component mask bits.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dest</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the destination GC.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XCopyGC' xrefstyle='select: title'/>
+function copies the specified components from the source GC
+to the destination GC.
+The source and destination GCs must have the same root and depth,
+or a
+<errorname>BadMatch</errorname>
+error results.
+The valuemask specifies which component to copy, as for
+<xref linkend='XCreateGC' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XCopyGC' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>,
+<errorname>BadGC</errorname>,
+and
+<errorname>BadMatch</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To change the components in a given GC, use
+<xref linkend='XChangeGC' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XChangeGC</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XChangeGC'>
+<funcprototype>
+  <funcdef><function>XChangeGC</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> valuemask</parameter></paramdef>
+  <paramdef>XGCValues<parameter> *values</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+<!-- .ds Vm changed using information in the specified values structure -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>valuemask</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies which components in the GC are to be (Vm. 
+This argument is the bitwise inclusive OR of zero or more of the valid
+GC component mask bits.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>values</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies any values as specified by the valuemask.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XChangeGC' xrefstyle='select: title'/>
+function changes the components specified by valuemask for
+the specified GC.
+The values argument contains the values to be set.
+The values and restrictions are the same as for 
+<xref linkend='XCreateGC' xrefstyle='select: title'/>.
+Changing the clip-mask overrides any previous 
+<xref linkend='XSetClipRectangles' xrefstyle='select: title'/>
+request on the context. 
+Changing the dash-offset or dash-list
+overrides any previous 
+<xref linkend='XSetDashes' xrefstyle='select: title'/>
+request on the context.
+The order in which components are verified and altered is server dependent.
+If an error is generated, a subset of the components may have been altered.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XChangeGC' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>,
+<errorname>BadFont</errorname>,
+<errorname>BadGC</errorname>,
+<errorname>BadMatch</errorname>,
+<errorname>BadPixmap</errorname>,
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain components of a given GC, use
+<xref linkend='XGetGCValues' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetGCValues</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetGCValues'>
+<funcprototype>
+  <funcdef>Status <function>XGetGCValues</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> valuemask</parameter></paramdef>
+  <paramdef>XGCValues<parameter> *values_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+<!-- .ds Vm returned in the values_return argument -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>valuemask</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies which components in the GC are to be (Vm. 
+This argument is the bitwise inclusive OR of zero or more of the valid
+GC component mask bits.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>values_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the GC values in the specified
+<structname>XGCValues</structname>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetGCValues' xrefstyle='select: title'/>
+function returns the components specified by valuemask for the specified GC.
+If the valuemask contains a valid set of GC mask bits
+(<symbol>GCFunction</symbol>,
+<symbol>GCPlaneMask</symbol>,
+<symbol>GCForeground</symbol>,
+<symbol>GCBackground</symbol>,
+<symbol>GCLineWidth</symbol>,
+<symbol>GCLineStyle</symbol>,
+<symbol>GCCapStyle</symbol>,
+<symbol>GCJoinStyle</symbol>,
+<symbol>GCFillStyle</symbol>,
+<symbol>GCFillRule</symbol>,
+<symbol>GCTile</symbol>,
+<symbol>GCStipple</symbol>,
+<symbol>GCTileStipXOrigin</symbol>,
+<symbol>GCTileStipYOrigin</symbol>,
+<symbol>GCFont</symbol>,
+<symbol>GCSubwindowMode</symbol>,
+<symbol>GCGraphicsExposures</symbol>,
+<symbol>GCClipXOrigin</symbol>,
+<symbol>GCClipYOrigin</symbol>,
+<symbol>GCDashOffset</symbol>,
+or
+<symbol>GCArcMode</symbol>)
+and no error occurs,
+<xref linkend='XGetGCValues' xrefstyle='select: title'/>
+sets the requested components in values_return and returns a nonzero status.
+Otherwise, it returns a zero status.
+Note that the clip-mask and dash-list (represented by the
+<symbol>GCClipMask</symbol>
+and 
+<symbol>GCDashList</symbol>
+bits, respectively, in the valuemask)
+cannot be requested.
+Also note that an invalid resource ID (with one or more of the three
+most significant bits set to 1) will be returned for
+<symbol>GCFont</symbol>,
+<symbol>GCTile</symbol>,
+and
+<symbol>GCStipple</symbol>
+if the component has never been explicitly set by the client.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To free a given GC, use
+<xref linkend='XFreeGC' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XFreeGC</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XFreeGC'>
+<funcprototype>
+  <funcdef><function>XFreeGC</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XFreeGC' xrefstyle='select: title'/>
+function destroys the specified GC as well as all the associated storage.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XFreeGC' xrefstyle='select: title'/>
+can generate a
+<errorname>BadGC</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain the 
+<type>GContext</type>
+resource ID for a given GC, use 
+<xref linkend='XGContextFromGC' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGContextFromGC</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGContextFromGC'>
+<funcprototype>
+  <funcdef>GContext <function>XGContextFromGC</function></funcdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<!-- .ds Gc for which you want the resource ID -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC (Gc.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<!-- .sp -->
+Xlib usually defers sending changes to the components of a GC to the server
+until a graphics function is actually called with that GC.
+This permits batching of component changes into a single server request.
+In some circumstances, however, it may be necessary for the client
+to explicitly force sending the changes to the server.
+An example might be when a protocol extension uses the GC indirectly,
+in such a way that the extension interface cannot know what GC will be used.
+To force sending GC component changes, use
+<xref linkend='XFlushGC' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XFlushGC</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XFlushGC'>
+<funcprototype>
+  <funcdef>void <function>XFlushGC</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+</para>
+</sect1>
+<sect1 id="Using_Graphics_Context_Convenience_Routines">
+<title>Using Graphics Context Convenience Routines</title>
+<!-- .XS -->
+<!-- (SN Using Graphics Context Convenience Routines  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+This section discusses how to set the:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+Foreground, background, plane mask, or function components
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Line attributes and dashes components
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Fill style and fill rule components
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Fill tile and stipple components
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Font component
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Clip region component
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Arc mode, subwindow mode, and graphics exposure components
+    </para>
+  </listitem>
+</itemizedlist>
+<sect2 id="Setting_the_Foreground_Background_Function_or_Plane_Mask">
+<title>Setting the Foreground, Background, Function, or Plane Mask</title>
+<!-- .XS -->
+<!-- (SN Setting the Foreground, Background, Function, or Plane Mask -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To set the foreground, background, plane mask, and function components
+for a given GC, use
+<xref linkend='XSetState' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetState</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetState'>
+<funcprototype>
+  <funcdef><function>XSetState</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>unsignedlongforeground,<parameter> background</parameter></paramdef>
+  <paramdef>int<parameter> function</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> plane_mask</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>foreground</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the foreground you want to set for the specified GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>background</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the background you want to set for the specified GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>function</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the function you want to set for the specified GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>plane_mask</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the plane mask.
+<!-- .\" *** JIM: NEED MORE INFO FOR THIS. *** -->
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<xref linkend='XSetState' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>,
+<errorname>BadGC</errorname>,
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set the foreground of a given GC, use
+<xref linkend='XSetForeground' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetForeground</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetForeground'>
+<funcprototype>
+  <funcdef><function>XSetForeground</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> foreground</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>foreground</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the foreground you want to set for the specified GC.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<xref linkend='XSetForeground' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>
+and
+<errorname>BadGC</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set the background of a given GC, use
+<xref linkend='XSetBackground' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetBackground</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetBackground'>
+<funcprototype>
+  <funcdef><function>XSetBackground</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> background</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>background</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the background you want to set for the specified GC.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<xref linkend='XSetBackground' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>
+and
+<errorname>BadGC</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set the display function in a given GC, use
+<xref linkend='XSetFunction' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetFunction</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetFunction'>
+<funcprototype>
+  <funcdef><function>XSetFunction</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>int<parameter> function</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>function</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the function you want to set for the specified GC.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<xref linkend='XSetFunction' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>,
+<errorname>BadGC</errorname>,
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set the plane mask of a given GC, use
+<xref linkend='XSetPlaneMask' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetPlaneMask</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetPlaneMask'>
+<funcprototype>
+  <funcdef><function>XSetPlaneMask</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> plane_mask</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>plane_mask</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the plane mask.
+<!-- .\" *** JIM: NEED MORE INFO FOR THIS. *** -->
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<xref linkend='XSetPlaneMask' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>
+and
+<errorname>BadGC</errorname>
+errors.
+</para>
+</sect2>
+<sect2 id="Setting_the_Line_Attributes_and_Dashes">
+<title>Setting the Line Attributes and Dashes</title>
+<!-- .XS -->
+<!-- (SN Setting the Line Attributes and Dashes  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To set the line drawing components of a given GC, use
+<xref linkend='XSetLineAttributes' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetLineAttributes</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetLineAttributes'>
+<funcprototype>
+  <funcdef><function>XSetLineAttributes</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>unsignedint<parameter> line_width</parameter></paramdef>
+  <paramdef>int<parameter> line_style</parameter></paramdef>
+  <paramdef>int<parameter> cap_style</parameter></paramdef>
+  <paramdef>int<parameter> join_style</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>line_width</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the line-width you want to set for the specified GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>line_style</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the line-style you want to set for the specified GC.
+You can pass
+<symbol>LineSolid</symbol>,
+<symbol>LineOnOffDash</symbol>,
+or
+<symbol>LineDoubleDash</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>cap_style</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the line-style and cap-style you want to set for the specified GC.
+You can pass
+<symbol>CapNotLast</symbol>,
+<symbol>CapButt</symbol>,
+<symbol>CapRound</symbol>,
+or
+<symbol>CapProjecting</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>join_style</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the line join-style you want to set for the specified GC.
+You can pass
+<symbol>JoinMiter</symbol>,
+<symbol>JoinRound</symbol>,
+or
+<symbol>JoinBevel</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<xref linkend='XSetLineAttributes' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>,
+<errorname>BadGC</errorname>,
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set the dash-offset and dash-list for dashed line styles of a given GC, use
+<xref linkend='XSetDashes' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetDashes</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetDashes'>
+<funcprototype>
+  <funcdef><function>XSetDashes</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>int<parameter> dash_offset</parameter></paramdef>
+  <paramdef>char<parameter> dash_list[]</parameter></paramdef>
+  <paramdef>int<parameter> n</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dash_offset</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the phase of the pattern for the dashed line-style you want to set
+for the specified GC. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dash_list</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the dash-list for the dashed line-style
+you want to set for the specified GC. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>n</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of elements in dash_list. 
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XSetDashes' xrefstyle='select: title'/>
+function sets the dash-offset and dash-list attributes for dashed line styles
+in the specified GC.
+There must be at least one element in the specified dash_list,
+or a
+<errorname>BadValue</errorname>
+error results. 
+The initial and alternating elements (second, fourth, and so on) 
+of the dash_list are the even dashes, and
+the others are the odd dashes.
+Each element specifies a dash length in pixels.
+All of the elements must be nonzero,
+or a
+<errorname>BadValue</errorname>
+error results.
+Specifying an odd-length list is equivalent to specifying the same list
+concatenated with itself to produce an even-length list.
+</para>
+<para>
+<!-- .LP -->
+The dash-offset defines the phase of the pattern,
+specifying how many pixels into the dash-list the pattern
+should actually begin in any single graphics request.
+Dashing is continuous through path elements combined with a join-style
+but is reset to the dash-offset between each sequence of joined lines.
+</para>
+<para>
+<!-- .LP -->
+The unit of measure for dashes is the same for the ordinary coordinate system.
+Ideally, a dash length is measured along the slope of the line, but implementations
+are only required to match this ideal for horizontal and vertical lines.
+Failing the ideal semantics, it is suggested that the length be measured along the
+major axis of the line.
+The major axis is defined as the x axis for lines drawn at an angle of between
+&minus;45 and +45 degrees or between 135 and 225 degrees from the x axis.
+For all other lines, the major axis is the y axis.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetDashes' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>,
+<errorname>BadGC</errorname>,
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+</sect2>
+<sect2 id='Setting_the_Fill_Style_and_Fill_Rule'>
+<title>Setting the Fill Style and Fill Rule</title>
+<!-- .XS -->
+<!-- (SN Setting the Fill Style and Fill Rule  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To set the fill-style of a given GC, use
+<xref linkend='XSetFillStyle' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetFillStyle</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetFillStyle'>
+<funcprototype>
+  <funcdef><function>XSetFillStyle</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>int<parameter> fill_style</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>fill_style</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the fill-style you want to set for the specified GC.
+You can pass
+<symbol>FillSolid</symbol>,
+<symbol>FillTiled</symbol>,
+<symbol>FillStippled</symbol>,
+or
+<symbol>FillOpaqueStippled</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<xref linkend='XSetFillStyle' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>,
+<errorname>BadGC</errorname>,
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set the fill-rule of a given GC, use
+<xref linkend='XSetFillRule' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetFillRule</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetFillRule'>
+<funcprototype>
+  <funcdef><function>XSetFillRule</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>int<parameter> fill_rule</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>fill_rule</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the fill-rule you want to set for the specified GC.
+You can pass 
+<symbol>EvenOddRule</symbol>
+or
+<symbol>WindingRule</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<xref linkend='XSetFillRule' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>,
+<errorname>BadGC</errorname>,
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+</sect2>
+<sect2 id='Setting_the_Fill_Tile_and_Stipple'>
+<title>Setting the Fill Tile and Stipple</title>
+<!-- .XS -->
+<!-- (SN Setting the Fill Tile and Stipple  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Some displays have hardware support for tiling or
+stippling with patterns of specific sizes.
+Tiling and stippling operations that restrict themselves to those specific
+sizes run much faster than such operations with arbitrary size patterns.
+Xlib provides functions that you can use to determine the best size, 
+tile, or stipple for the display
+as well as to set the tile or stipple shape and the tile or stipple origin.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain the best size of a tile, stipple, or cursor, use
+<xref linkend='XQueryBestSize' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XQueryBestSize</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XQueryBestSize'>
+<funcprototype>
+  <funcdef>Status <function>XQueryBestSize</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> class</parameter></paramdef>
+  <paramdef>Drawable<parameter> which_screen</parameter></paramdef>
+  <paramdef>unsignedintwidth,<parameter> height</parameter></paramdef>
+  <paramdef>unsignedint*width_return,<parameter> *height_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>class</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the class that you are interested in.
+You can pass 
+<symbol>TileShape</symbol>,
+<symbol>CursorShape</symbol>,
+or 
+<symbol>StippleShape</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>which_screen</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies any drawable on the screen.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the width and height.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Return the width and height of the object best supported 
+by the display hardware.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XQueryBestSize' xrefstyle='select: title'/>
+function returns the best or closest size to the specified size.
+For 
+<symbol>CursorShape</symbol>,
+this is the largest size that can be fully displayed on the screen specified by
+which_screen.
+For 
+<symbol>TileShape</symbol>,
+this is the size that can be tiled fastest.
+For 
+<symbol>StippleShape</symbol>,
+this is the size that can be stippled fastest.
+For 
+<symbol>CursorShape</symbol>,
+the drawable indicates the desired screen.
+For 
+<symbol>TileShape</symbol>
+and 
+<symbol>StippleShape</symbol>,
+the drawable indicates the screen and possibly the window class and depth.
+An 
+<symbol>InputOnly</symbol>
+window cannot be used as the drawable for 
+<symbol>TileShape</symbol>
+or 
+<symbol>StippleShape</symbol>,
+or a
+<errorname>BadMatch</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XQueryBestSize' xrefstyle='select: title'/>
+can generate
+<errorname>BadDrawable</errorname>,
+<errorname>BadMatch</errorname>,
+and 
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain the best fill tile shape, use
+<xref linkend='XQueryBestTile' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XQueryBestTile</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XQueryBestTile'>
+<funcprototype>
+  <funcdef>Status <function>XQueryBestTile</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> which_screen</parameter></paramdef>
+  <paramdef>unsignedintwidth,<parameter> height</parameter></paramdef>
+  <paramdef>unsignedint*width_return,<parameter> *height_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>which_screen</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies any drawable on the screen.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the width and height.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Return the width and height of the object best supported 
+by the display hardware.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XQueryBestTile' xrefstyle='select: title'/>
+function returns the best or closest size, that is, the size that can be
+tiled fastest on the screen specified by which_screen.
+The drawable indicates the screen and possibly the window class and depth.
+If an 
+<symbol>InputOnly</symbol>
+window is used as the drawable, a 
+<errorname>BadMatch</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XQueryBestTile' xrefstyle='select: title'/>
+can generate
+<errorname>BadDrawable</errorname>
+and
+<errorname>BadMatch</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain the best stipple shape, use
+<xref linkend='XQueryBestStipple' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XQueryBestStipple</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XQueryBestStipple'>
+<funcprototype>
+  <funcdef>Status <function>XQueryBestStipple</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> which_screen</parameter></paramdef>
+  <paramdef>unsignedintwidth,<parameter> height</parameter></paramdef>
+  <paramdef>unsignedint*width_return,<parameter> *height_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>which_screen</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies any drawable on the screen.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the width and height.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Return the width and height of the object best supported 
+by the display hardware.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XQueryBestStipple' xrefstyle='select: title'/>
+function returns the best or closest size, that is, the size that can be
+stippled fastest on the screen specified by which_screen.
+The drawable indicates the screen and possibly the window class and depth.
+If an
+<symbol>InputOnly</symbol>
+window is used as the drawable, a
+<errorname>BadMatch</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XQueryBestStipple' xrefstyle='select: title'/>
+can generate
+<errorname>BadDrawable</errorname>
+and
+<errorname>BadMatch</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set the fill tile of a given GC, use
+<xref linkend='XSetTile' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetTile</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetTile'>
+<funcprototype>
+  <funcdef><function>XSetTile</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>Pixmap<parameter> tile</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>tile</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the fill tile you want to set for the specified GC. 
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The tile and GC must have the same depth,
+or a
+<errorname>BadMatch</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetTile' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>,
+<errorname>BadGC</errorname>,
+<errorname>BadMatch</errorname>,
+and
+<errorname>BadPixmap</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set the stipple of a given GC, use
+<xref linkend='XSetStipple' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetStipple</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetStipple'>
+<funcprototype>
+  <funcdef><function>XSetStipple</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>Pixmap<parameter> stipple</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>stipple</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the stipple you want to set for the specified GC.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The stipple must have a depth of one,
+or a
+<errorname>BadMatch</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetStipple' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>,
+<errorname>BadGC</errorname>,
+<errorname>BadMatch</errorname>,
+and
+<errorname>BadPixmap</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set the tile or stipple origin of a given GC, use
+<xref linkend='XSetTSOrigin' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetTSOrigin</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetTSOrigin'>
+<funcprototype>
+  <funcdef><function>XSetTSOrigin</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>intts_x_origin,<parameter> ts_y_origin</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ts_x_origin</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ts_y_origin</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates of the tile and stipple origin.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+When graphics requests call for tiling or stippling,
+the parent's origin will be interpreted relative to whatever destination 
+drawable is specified in the graphics request.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetTSOrigin' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>
+and
+<errorname>BadGC</errorname>
+errors.
+</para>
+</sect2>
+<sect2 id='Setting_the_Current_Font'>
+<title>Setting the Current Font</title>
+<!-- .XS -->
+<!-- (SN Setting the Current Font  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To set the current font of a given GC, use
+<xref linkend='XSetFont' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetFont</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetFont'>
+<funcprototype>
+  <funcdef><function>XSetFont</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>Font<parameter> font</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the font.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<xref linkend='XSetFont' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>,
+<errorname>BadFont</errorname>,
+and 
+<errorname>BadGC</errorname>
+errors.
+</para>
+</sect2>
+<sect2 id="Setting_the_Clip_Region">
+<title>Setting the Clip Region</title>
+<!-- .XS -->
+<!-- (SN Setting the Clip Region  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to set the clip-origin 
+and the clip-mask or set the clip-mask to a list of rectangles.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set the clip-origin of a given GC, use
+<xref linkend='XSetClipOrigin' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetClipOrigin</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetClipOrigin'>
+<funcprototype>
+  <funcdef><function>XSetClipOrigin</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>intclip_x_origin,<parameter> clip_y_origin</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>clip_x_origin</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>clip_y_origin</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates of the clip-mask origin.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The clip-mask origin is interpreted relative to the origin of whatever 
+destination drawable is specified in the graphics request.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetClipOrigin' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>
+and
+<errorname>BadGC</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set the clip-mask of a given GC to the specified pixmap, use
+<xref linkend='XSetClipMask' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetClipMask</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetClipMask'>
+<funcprototype>
+  <funcdef><function>XSetClipMask</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>Pixmap<parameter> pixmap</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>pixmap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the pixmap or
+<symbol>None</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+If the clip-mask is set to
+<symbol>None</symbol>,
+the pixels are always drawn (regardless of the clip-origin).
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetClipMask' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>,
+<errorname>BadGC</errorname>,
+<errorname>BadMatch</errorname>,
+and
+<errorname>BadPixmap</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set the clip-mask of a given GC to the specified list of rectangles, use
+<xref linkend='XSetClipRectangles' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetClipRectangles</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetClipRectangles'>
+<funcprototype>
+  <funcdef><function>XSetClipRectangles</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>intclip_x_origin,<parameter> clip_y_origin</parameter></paramdef>
+  <paramdef>XRectangle<parameter> rectangles[]</parameter></paramdef>
+  <paramdef>int<parameter> n</parameter></paramdef>
+  <paramdef>int<parameter> ordering</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>clip_x_origin</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>clip_y_origin</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates of the clip-mask origin.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>rectangles</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies an array of rectangles that define the clip-mask.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>n</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of rectangles. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ordering</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the ordering relations on the rectangles.
+You can pass
+<symbol>Unsorted</symbol>,
+<symbol>YSorted</symbol>,
+<symbol>YXSorted</symbol>,
+or
+<symbol>YXBanded</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetClipRectangles' xrefstyle='select: title'/>
+function changes the clip-mask in the specified GC 
+to the specified list of rectangles and sets the clip origin.
+The output is clipped to remain contained within the
+rectangles.
+The clip-origin is interpreted relative to the origin of
+whatever destination drawable is specified in a graphics request.  
+The rectangle coordinates are interpreted relative to the clip-origin.  
+The rectangles should be nonintersecting, or the graphics results will be
+undefined.
+Note that the list of rectangles can be empty, 
+which effectively disables output.
+This is the opposite of passing
+<symbol>None</symbol>
+as the clip-mask in
+<xref linkend='XCreateGC' xrefstyle='select: title'/>,
+<xref linkend='XChangeGC' xrefstyle='select: title'/>,
+and
+<xref linkend='XSetClipMask' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+If known by the client, ordering relations on the rectangles can be
+specified with the ordering argument. 
+This may provide faster operation
+by the server. 
+If an incorrect ordering is specified, the X server may generate a
+<errorname>BadMatch</errorname>
+error, but it is not required to do so.
+If no error is generated, the graphics
+results are undefined.
+<symbol>Unsorted</symbol>
+means the rectangles are in arbitrary order.
+<symbol>YSorted</symbol>
+means that the rectangles are nondecreasing in their Y origin.
+<symbol>YXSorted</symbol>
+additionally constrains 
+<symbol>YSorted</symbol>
+order in that all
+rectangles with an equal Y origin are nondecreasing in their X
+origin.  
+<symbol>YXBanded</symbol>
+additionally constrains 
+<symbol>YXSorted</symbol>
+by requiring that,
+for every possible Y scanline, all rectangles that include that
+scanline have an identical Y origins and Y extents.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetClipRectangles' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>,
+<errorname>BadGC</errorname>,
+<errorname>BadMatch</errorname>,
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+Xlib provides a set of basic functions for performing
+region arithmetic.
+For information about these functions,
+see <link linkend="Manipulating_Regions">section 16.5</link>.
+</para>
+</sect2>
+<sect2 id='Setting_the_Arc_Mode_Subwindow_Mode_and_Graphics_Exposure'>
+<title>Setting the Arc Mode, Subwindow Mode, and Graphics Exposure</title>
+<!-- .XS -->
+<!-- (SN Setting the Arc Mode, Subwindow Mode, and Graphics Exposure  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To set the arc mode of a given GC, use
+<xref linkend='XSetArcMode' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetArcMode</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetArcMode'>
+<funcprototype>
+  <funcdef><function>XSetArcMode</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>int<parameter> arc_mode</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>arc_mode</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the arc mode.
+You can pass
+<symbol>ArcChord</symbol>
+or
+<symbol>ArcPieSlice</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<xref linkend='XSetArcMode' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>,
+<errorname>BadGC</errorname>,
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set the subwindow mode of a given GC, use
+<xref linkend='XSetSubwindowMode' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetSubwindowMode</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetSubwindowMode'>
+<funcprototype>
+  <funcdef><function>XSetSubwindowMode</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>int<parameter> subwindow_mode</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>subwindow_mode</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the subwindow mode.
+You can pass
+<symbol>ClipByChildren</symbol>
+or
+<symbol>IncludeInferiors</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<xref linkend='XSetSubwindowMode' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>,
+<errorname>BadGC</errorname>,
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set the graphics-exposures flag of a given GC, use
+<xref linkend='XSetGraphicsExposures' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetGraphicsExposures</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetGraphicsExposures'>
+<funcprototype>
+  <funcdef><function>XSetGraphicsExposures</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>Bool<parameter> graphics_exposures</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>graphics_exposures</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a Boolean value that indicates whether you want
+<symbol>GraphicsExpose</symbol>
+and
+<symbol>NoExpose</symbol>
+events to be reported when calling
+<xref linkend='XCopyArea' xrefstyle='select: title'/>
+and
+<xref linkend='XCopyPlane' xrefstyle='select: title'/>
+with this GC.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<xref linkend='XSetGraphicsExposures' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>,
+<errorname>BadGC</errorname>,
+and
+<errorname>BadValue</errorname>
+errors.
+<!-- .bp -->
+
+</para>
+</sect2>
+</sect1>
+</chapter>
diff --git a/specs/libX11/CH08.xml b/specs/libX11/CH08.xml
new file mode 100644 (file)
index 0000000..e4afa37
--- /dev/null
@@ -0,0 +1,5967 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+         "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
+<chapter id='Graphics_Functions'>
+<title>Graphics Functions</title>
+<para>
+Once you have established a connection to a display, you can use the Xlib graphics functions to:
+</para>
+<itemizedlist>
+  <listitem><para>Clear and copy areas</para></listitem>
+  <listitem><para>Draw points, lines, rectangles, and arcs</para></listitem>
+  <listitem><para>Fill areas</para></listitem>
+  <listitem><para>Manipulate fonts</para></listitem>
+  <listitem><para>Draw text</para></listitem>
+  <listitem><para>Transfer images between clients and the server</para></listitem>
+</itemizedlist>
+<para>
+If the same drawable and GC is used for each call, Xlib batches back-to-back
+calls to XDrawPoint, XDrawLine, XDrawRectangle, XFillArc, and XFillRectangle.
+Note that this reduces the total number of requests sent to the server.
+</para>
+<sect1 id="Clearing_Areas">
+<title>Clearing Areas</title>
+<!-- .XS -->
+<!-- (SN Clearing Areas  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to clear an area or the entire window.
+Because pixmaps do not have defined backgrounds, 
+they cannot be filled by using the functions described in this section.
+Instead, to accomplish an analogous operation on a pixmap,
+you should use 
+<xref linkend='XFillRectangle' xrefstyle='select: title'/>,
+which sets the pixmap to a known value.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To clear a rectangular area of a given window, use
+<xref linkend='XClearArea' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Areas</primary><secondary>clearing</secondary></indexterm>
+<indexterm><primary>Clearing</primary><secondary>areas</secondary></indexterm>
+<indexterm significance="preferred"><primary>XClearArea</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XClearArea'>
+<funcprototype>
+  <funcdef><function>XClearArea</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>intx,<parameter> y</parameter></paramdef>
+  <paramdef>unsignedintwidth,<parameter> height</parameter></paramdef>
+  <paramdef>Bool<parameter> exposures</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+<!-- .ds Xy , which are relative to the origin of the window \ -->
+and specify the upper-left corner of the rectangle
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates(Xy.
+<!-- .ds Wh , which are the dimensions of the rectangle -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the width and height(Wh.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>exposures</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a Boolean value that indicates if
+<symbol>Expose</symbol>
+events are to be generated.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XClearArea' xrefstyle='select: title'/>
+function paints a rectangular area in the specified window according to the
+specified dimensions with the window's background pixel or pixmap.
+The subwindow-mode effectively is
+<symbol>ClipByChildren</symbol>.
+If width is zero, it
+is replaced with the current width of the window minus x.
+If height is
+zero, it is replaced with the current height of the window minus y.
+If the window has a defined background tile, 
+the rectangle clipped by any children is filled with this tile.
+If the window has
+background 
+<symbol>None</symbol>,
+the contents of the window are not changed.  
+In either
+case, if exposures is 
+<symbol>True</symbol>,
+one or more 
+<symbol>Expose</symbol>
+events are generated for regions of the rectangle that are either visible or are
+being retained in a backing store.
+If you specify a window whose class is
+<symbol>InputOnly</symbol>,
+a
+<errorname>BadMatch</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XClearArea' xrefstyle='select: title'/>
+can generate
+<errorname>BadMatch</errorname>,
+<errorname>BadValue</errorname>,
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To clear the entire area in a given window, use
+<xref linkend='XClearWindow' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Window</primary><secondary>clearing</secondary></indexterm>
+<indexterm><primary>Clearing</primary><secondary>windows</secondary></indexterm>
+<indexterm significance="preferred"><primary>XClearWindow</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XClearWindow'>
+<funcprototype>
+  <funcdef><function>XClearWindow</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XClearWindow' xrefstyle='select: title'/>
+function clears the entire area in the specified window and is
+equivalent to
+<xref linkend='XClearArea' xrefstyle='select: title'/>
+(display, w, 0, 0, 0, 0, 
+<symbol>False</symbol>).
+If the window has a defined background tile, the rectangle is tiled with a
+plane-mask of all ones and 
+<symbol>GXcopy</symbol>
+function.
+If the window has
+background 
+<symbol>None</symbol>,
+the contents of the window are not changed.  
+If you specify a window whose class is
+<symbol>InputOnly</symbol>,
+a
+<errorname>BadMatch</errorname>
+error results. 
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XClearWindow' xrefstyle='select: title'/>
+can generate
+<errorname>BadMatch</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+</sect1>
+<sect1 id="Copying_Areas">
+<title>Copying Areas</title>
+<!-- .XS -->
+<!-- (SN Copying Areas  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to copy an area or a bit plane.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To copy an area between drawables of the same
+root and depth, use
+<xref linkend='XCopyArea' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Areas</primary><secondary>copying</secondary></indexterm>
+<indexterm><primary>Copying</primary><secondary>areas</secondary></indexterm>
+<indexterm significance="preferred"><primary>XCopyArea</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XCopyArea'>
+<funcprototype>
+  <funcdef><function>XCopyArea</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawablesrc,<parameter> dest</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>intsrc_x,<parameter> src_y</parameter></paramdef>
+  <paramdef>unsignedintwidth,<parameter> height</parameter></paramdef>
+  <paramdef>intdest_x,<parameter> dest_y</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>src</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dest</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the source and destination rectangles to be combined. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>src_x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>src_y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates, 
+which are relative to the origin of the source rectangle
+and specify its upper-left corner.
+<!-- .ds Wh , which are the dimensions of both the source \ -->
+and destination rectangles
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the width and height(Wh.
+<!-- .ds Dx , which are relative to the origin of the destination rectangle \ -->
+and specify its upper-left corner
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dest_x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dest_y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates(Dx. 
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XCopyArea' xrefstyle='select: title'/>
+function combines the specified rectangle of src with the specified rectangle 
+of dest.
+The drawables must have the same root and depth,
+or a
+<errorname>BadMatch</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+If regions of the source rectangle are obscured and have not been
+retained in backing store 
+or if regions outside the boundaries of the source drawable are specified, 
+those regions are not copied. 
+Instead, the 
+following occurs on all corresponding destination regions that are either
+visible or are retained in backing store.  
+If the destination is a window with a background other than 
+<symbol>None</symbol>,
+corresponding regions
+of the destination are tiled with that background
+(with plane-mask of all ones and
+<symbol>GXcopy</symbol>
+function).
+Regardless of tiling or whether the destination is a window or a pixmap,
+if graphics-exposures is 
+<symbol>True</symbol>,
+then
+<symbol>GraphicsExpose</symbol>
+events for all corresponding destination regions are generated.
+If graphics-exposures is 
+<symbol>True</symbol>
+but no
+<symbol>GraphicsExpose</symbol>
+events are generated, a
+<symbol>NoExpose</symbol>
+event is generated.
+Note that by default graphics-exposures is
+<symbol>True</symbol>
+in new GCs.
+</para>
+<para>
+<!-- .LP -->
+This function uses these GC components: function, plane-mask, 
+subwindow-mode, graphics-exposures, clip-x-origin,
+clip-y-origin, and clip-mask.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XCopyArea' xrefstyle='select: title'/>
+can generate
+<errorname>BadDrawable</errorname>,
+<errorname>BadGC</errorname>,
+and
+<errorname>BadMatch</errorname>
+errors.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To copy a single bit plane of a given drawable, use
+<xref linkend='XCopyPlane' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Plane</primary><secondary>copying</secondary></indexterm>
+<indexterm><primary>Copying</primary><secondary>planes</secondary></indexterm>
+<indexterm significance="preferred"><primary>XCopyPlane</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XCopyPlane'>
+<funcprototype>
+  <funcdef><function>XCopyPlane</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawablesrc,<parameter> dest</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>intsrc_x,<parameter> src_y</parameter></paramdef>
+  <paramdef>unsignedintwidth,<parameter> height</parameter></paramdef>
+  <paramdef>intdest_x,<parameter> dest_y</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> plane</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>src</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dest</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the source and destination rectangles to be combined. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>src_x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>src_y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates, 
+which are relative to the origin of the source rectangle
+and specify its upper-left corner.
+<!-- .ds Wh , which are the dimensions of both the source and destination rectangles -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the width and height(Wh.
+<!-- .ds Dx , which are relative to the origin of the destination rectangle \ -->
+and specify its upper-left corner
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dest_x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dest_y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates(Dx. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>plane</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the bit plane.
+You must set exactly one bit to 1.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XCopyPlane' xrefstyle='select: title'/>
+function uses a single bit plane of the specified source rectangle
+combined with the specified GC to modify the specified rectangle of dest.
+The drawables must have the same root but need not have the same depth.
+If the drawables do not have the same root, a
+<errorname>BadMatch</errorname>
+error results.
+If plane does not have exactly one bit set to 1 and the value of plane
+is not less than %2 sup n%, where <emphasis remap='I'>n</emphasis> is the depth of src, a
+<errorname>BadValue</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+Effectively, 
+<xref linkend='XCopyPlane' xrefstyle='select: title'/>
+forms a pixmap of the same depth as the rectangle of dest and with a
+size specified by the source region. 
+It uses the foreground/background pixels in the GC (foreground
+everywhere the bit plane in src contains a bit set to 1,
+background everywhere the bit plane in src contains a bit set to 0)
+and the equivalent of a 
+<systemitem>CopyArea</systemitem>
+protocol request is performed with all the same exposure semantics.
+This can also be thought of as using the specified region of the source 
+bit plane as a stipple with a fill-style of
+<symbol>FillOpaqueStippled</symbol>
+for filling a rectangular area of the destination.
+</para>
+<para>
+<!-- .LP -->
+This function uses these GC components: function, plane-mask, foreground,
+background, subwindow-mode, graphics-exposures, clip-x-origin, clip-y-origin,
+and clip-mask.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XCopyPlane' xrefstyle='select: title'/>
+can generate
+<errorname>BadDrawable</errorname>,
+<errorname>BadGC</errorname>,
+<errorname>BadMatch</errorname>,
+and 
+<errorname>BadValue</errorname>
+errors.
+</para>
+</sect1>
+<sect1 id="Drawing_Points_Lines_Rectangles_and_Arcs">
+<title>Drawing Points, Lines, Rectangles, and Arcs</title>
+<!-- .XS -->
+<!-- (SN Drawing Points, Lines, Rectangles, and Arcs  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to draw:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+A single point or multiple points
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A single line or multiple lines
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A single rectangle or multiple rectangles
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A single arc or multiple arcs
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+Some of the functions described in the following sections
+use these structures:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XSegment</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i -->
+<!-- .ta .5i -->
+typedef struct {
+     short x1, y1, x2, y2;
+} XSegment;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>XPoint</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i -->
+<!-- .ta .5i -->
+typedef struct {
+     short x, y;
+} XPoint;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>XRectangle</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i -->
+<!-- .ta .5i -->
+typedef struct {
+     short x, y;
+     unsigned short width, height;
+} XRectangle;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>XArc</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     short x, y;
+     unsigned short width, height;
+     short angle1, angle2;             /* Degrees * 64 */
+} XArc;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+All x and y members are signed integers.
+The width and height members are 16-bit unsigned integers.
+You should be careful not to generate coordinates and sizes
+out of the 16-bit ranges, because the protocol only has 16-bit fields
+for these values.
+</para>
+<sect2 id="Drawing_Single_and_Multiple_Points">
+<title>Drawing Single and Multiple Points</title>
+<!-- .XS -->
+<!-- (SN Drawing Single and Multiple Points  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Points</primary><secondary>drawing</secondary></indexterm>
+<indexterm><primary>Drawing</primary><secondary>points</secondary></indexterm>
+<indexterm><primary>XDrawPoints</primary></indexterm>
+<indexterm><primary>XDrawPoint</primary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+To draw a single point in a given drawable, use
+<xref linkend='XDrawPoint' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDrawPoint</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDrawPoint'>
+<funcprototype>
+  <funcdef><function>XDrawPoint</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>intx,<parameter> y</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates where you want the point drawn.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<!-- .sp -->
+To draw multiple points in a given drawable, use
+<xref linkend='XDrawPoints' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDrawPoints</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDrawPoints'>
+<funcprototype>
+  <funcdef><function>XDrawPoints</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>XPoint<parameter> *points</parameter></paramdef>
+  <paramdef>int<parameter> npoints</parameter></paramdef>
+  <paramdef>int<parameter> mode</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>points</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies an array of points.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>npoints</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of points in the array.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>mode</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the coordinate mode. 
+You can pass
+<symbol>CoordModeOrigin</symbol>
+or
+<symbol>CoordModePrevious</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XDrawPoint' xrefstyle='select: title'/>
+function uses the foreground pixel and function components of the
+GC to draw a single point into the specified drawable; 
+<xref linkend='XDrawPoints' xrefstyle='select: title'/>
+draws multiple points this way.
+<symbol>CoordModeOrigin</symbol>
+treats all coordinates as relative to the origin,
+and
+<symbol>CoordModePrevious</symbol>
+treats all coordinates after the first as relative to the previous point.
+<xref linkend='XDrawPoints' xrefstyle='select: title'/>
+draws the points in the order listed in the array.
+</para>
+<para>
+<!-- .LP -->
+Both functions use these GC components: function, plane-mask,
+foreground, subwindow-mode, clip-x-origin, clip-y-origin, and clip-mask.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XDrawPoint' xrefstyle='select: title'/>
+can generate
+<errorname>BadDrawable</errorname>,
+<errorname>BadGC</errorname>,
+and 
+<errorname>BadMatch</errorname>
+errors.
+<xref linkend='XDrawPoints' xrefstyle='select: title'/>
+can generate
+<errorname>BadDrawable</errorname>,
+<errorname>BadGC</errorname>,
+<errorname>BadMatch</errorname>,
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+</sect2>
+<sect2 id="Drawing_Single_and_Multiple_Lines">
+<title>Drawing Single and Multiple Lines</title>
+<!-- .XS -->
+<!-- (SN Drawing Single and Multiple Lines -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Lines</primary><secondary>drawing</secondary></indexterm>
+<indexterm><primary>Drawing</primary><secondary>lines</secondary></indexterm>
+<indexterm><primary>XDrawLine</primary></indexterm>
+<indexterm><primary>XDrawLines</primary></indexterm>
+<indexterm><primary>Polygons</primary><secondary>drawing</secondary></indexterm>
+<indexterm><primary>Drawing</primary><secondary>polygons</secondary></indexterm>
+<indexterm><primary>XDrawSegments</primary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+To draw a single line between two points in a given drawable, use
+<xref linkend='XDrawLine' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDrawLine</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDrawLine'>
+<funcprototype>
+  <funcdef><function>XDrawLine</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>intx1,y1,x2,<parameter> y2</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x1</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y1</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x2</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y2</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the points (x1, y1) and (x2, y2) to be connected.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<!-- .sp -->
+To draw multiple lines in a given drawable, use
+<xref linkend='XDrawLines' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDrawLines</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDrawLines'>
+<funcprototype>
+  <funcdef><function>XDrawLines</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>XPoint<parameter> *points</parameter></paramdef>
+  <paramdef>int<parameter> npoints</parameter></paramdef>
+  <paramdef>int<parameter> mode</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>points</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies an array of points.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>npoints</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of points in the array.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>mode</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the coordinate mode. 
+You can pass
+<symbol>CoordModeOrigin</symbol>
+or
+<symbol>CoordModePrevious</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<!-- .sp -->
+To draw multiple, unconnected lines in a given drawable,
+use
+<xref linkend='XDrawSegments' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDrawSegments</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDrawSegments'>
+<funcprototype>
+  <funcdef><function>XDrawSegments</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>XSegment<parameter> *segments</parameter></paramdef>
+  <paramdef>int<parameter> nsegments</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>segments</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies an array of segments.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nsegments</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of segments in the array.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XDrawLine' xrefstyle='select: title'/>
+function uses the components of the specified GC to
+draw a line between the specified set of points (x1, y1) and (x2, y2).
+It does not perform joining at coincident endpoints.
+For any given line, 
+<xref linkend='XDrawLine' xrefstyle='select: title'/>
+does not draw a pixel more than once.
+If lines intersect, the intersecting pixels are drawn multiple times.  
+</para>
+<para>
+<!-- .LP -->
+The
+<xref linkend='XDrawLines' xrefstyle='select: title'/>
+function uses the components of the specified GC to draw 
+npoints-1 lines between each pair of points (point[i], point[i+1]) 
+in the array of
+<structname>XPoint</structname>
+structures.
+It draws the lines in the order listed in the array.
+The lines join correctly at all intermediate points, and if the first and last
+points coincide, the first and last lines also join correctly.
+For any given line, 
+<xref linkend='XDrawLines' xrefstyle='select: title'/>
+does not draw a pixel more than once.
+If thin (zero line-width) lines intersect, 
+the intersecting pixels are drawn multiple times.
+If wide lines intersect, the intersecting pixels are drawn only once, as though
+the entire 
+<systemitem>PolyLine</systemitem>
+protocol request were a single, filled shape.
+<symbol>CoordModeOrigin</symbol>
+treats all coordinates as relative to the origin,
+and
+<symbol>CoordModePrevious</symbol>
+treats all coordinates after the first as relative to the previous point.
+</para>
+<para>
+<!-- .LP -->
+The
+<xref linkend='XDrawSegments' xrefstyle='select: title'/>
+function draws multiple, unconnected lines. 
+For each segment, 
+<xref linkend='XDrawSegments' xrefstyle='select: title'/>
+draws a
+line between (x1, y1) and (x2, y2).
+It draws the lines in the order listed in the array of
+<structname>XSegment</structname>
+structures and does not perform joining at coincident endpoints.
+For any given line, 
+<xref linkend='XDrawSegments' xrefstyle='select: title'/>
+does not draw a pixel more than once.  
+If lines intersect, the intersecting pixels are drawn multiple times.  
+</para>
+<para>
+<!-- .LP -->
+All three functions use these GC components:
+function, plane-mask, line-width,
+line-style, cap-style, fill-style, subwindow-mode,
+clip-x-origin, clip-y-origin, and clip-mask.
+The
+<xref linkend='XDrawLines' xrefstyle='select: title'/>
+function also uses the join-style GC component.
+All three functions also use these GC mode-dependent components:
+foreground, background, tile, stipple, tile-stipple-x-origin, 
+tile-stipple-y-origin, dash-offset, and dash-list.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XDrawLine' xrefstyle='select: title'/>,
+<xref linkend='XDrawLines' xrefstyle='select: title'/>,
+and
+<xref linkend='XDrawSegments' xrefstyle='select: title'/>
+can generate
+<errorname>BadDrawable</errorname>,
+<errorname>BadGC</errorname>,
+and
+<errorname>BadMatch</errorname>
+errors.
+<xref linkend='XDrawLines' xrefstyle='select: title'/>
+also can generate
+<errorname>BadValue</errorname>
+errors.
+</para>
+</sect2>
+<sect2 id='Drawing_Single_and_Multiple_Rectangles'>
+<title>Drawing Single and Multiple Rectangles</title>
+<!-- .XS -->
+<!-- (SN Drawing Single and Multiple Rectangles  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Rectangles</primary><secondary>drawing</secondary></indexterm>
+<indexterm><primary>Drawing</primary><secondary>rectangles</secondary></indexterm>
+<indexterm><primary>XDrawRectangle</primary></indexterm>
+<indexterm><primary>XDrawRectangles</primary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+To draw the outline of a single rectangle in a given drawable, use
+<xref linkend='XDrawRectangle' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDrawRectangle</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDrawRectangle'>
+<funcprototype>
+  <funcdef><function>XDrawRectangle</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>intx,<parameter> y</parameter></paramdef>
+  <paramdef>unsignedintwidth,<parameter> height</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+<!-- .ds Xy , which specify the upper-left corner of the rectangle -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates(Xy.
+<!-- .ds Wh , which specify the dimensions of the rectangle -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the width and height(Wh.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<!-- .sp -->
+To draw the outline of multiple rectangles
+in a given drawable, use
+<xref linkend='XDrawRectangles' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDrawRectangles</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDrawRectangles'>
+<funcprototype>
+  <funcdef><function>XDrawRectangles</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>XRectangle<parameter> rectangles[]</parameter></paramdef>
+  <paramdef>int<parameter> nrectangles</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>rectangles</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies an array of rectangles.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nrectangles</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of rectangles in the array.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XDrawRectangle' xrefstyle='select: title'/>
+and
+<xref linkend='XDrawRectangles' xrefstyle='select: title'/>
+functions draw the outlines of the specified rectangle or rectangles as
+if a five-point 
+<systemitem>PolyLine</systemitem>
+protocol request were specified for each rectangle:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+[x,y] [x+width,y] [x+width,y+height] [x,y+height] [x,y]
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP  -->
+For the specified rectangle or rectangles, 
+these functions do not draw a pixel more than once.
+<xref linkend='XDrawRectangles' xrefstyle='select: title'/>
+draws the rectangles in the order listed in the array.
+If rectangles intersect,
+the intersecting pixels are drawn multiple times.
+</para>
+<para>
+<!-- .LP -->
+Both functions use these GC components: 
+function, plane-mask, line-width,
+line-style, cap-style, join-style, fill-style, 
+subwindow-mode, clip-x-origin, clip-y-origin, and clip-mask.
+They also use these GC mode-dependent components: 
+foreground, background, tile, stipple, tile-stipple-x-origin, 
+tile-stipple-y-origin, dash-offset, and dash-list.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XDrawRectangle' xrefstyle='select: title'/>
+and
+<xref linkend='XDrawRectangles' xrefstyle='select: title'/>
+can generate
+<errorname>BadDrawable</errorname>,
+<errorname>BadGC</errorname>,
+and
+<errorname>BadMatch</errorname>
+errors.
+</para>
+</sect2>
+<sect2 id="Drawing_Single_and_Multiple_Arcs">
+<title>Drawing Single and Multiple Arcs</title>
+<!-- .XS -->
+<!-- (SN Drawing Single and Multiple Arcs  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Drawing</primary><secondary>arcs</secondary></indexterm>
+<indexterm><primary>XDrawArc</primary></indexterm>
+<indexterm><primary>Arcs</primary><secondary>drawing</secondary></indexterm>
+<indexterm><primary>XDrawArcs</primary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To draw a single arc in a given drawable, use
+<xref linkend='XDrawArc' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDrawArc</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDrawArc'>
+<funcprototype>
+  <funcdef><function>XDrawArc</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>intx,<parameter> y</parameter></paramdef>
+  <paramdef>unsignedintwidth,<parameter> height</parameter></paramdef>
+  <paramdef>intangle1,<parameter> angle2</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+<!-- .ds Xy , which are relative to the origin of the drawable \ -->
+and specify the upper-left corner of the bounding rectangle
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates(Xy.
+<!-- .ds Wh , which are the major and minor axes of the arc -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the width and height(Wh.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>angle1</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the start of the arc relative to the three-o'clock position
+from the center, in units of degrees * 64.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>angle2</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the path and extent of the arc relative to the start of the
+arc, in units of degrees * 64.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<!-- .sp -->
+To draw multiple arcs in a given drawable, use
+<xref linkend='XDrawArcs' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDrawArcs</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDrawArcs'>
+<funcprototype>
+  <funcdef><function>XDrawArcs</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>XArc<parameter> *arcs</parameter></paramdef>
+  <paramdef>int<parameter> narcs</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>arcs</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies an array of arcs.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>narcs</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of arcs in the array.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<!-- .EQ -->
+delim %%
+<!-- .EN -->
+<xref linkend='XDrawArc' xrefstyle='select: title'/>
+draws a single circular or elliptical arc, and 
+<xref linkend='XDrawArcs' xrefstyle='select: title'/>
+draws multiple circular or elliptical arcs.
+Each arc is specified by a rectangle and two angles.  
+The center of the circle or ellipse is the center of the
+rectangle, and the major and minor axes are specified by the width and height.
+Positive angles indicate counterclockwise motion, 
+and negative angles indicate clockwise motion.  
+If the magnitude of angle2 is greater than 360 degrees, 
+<xref linkend='XDrawArc' xrefstyle='select: title'/>
+or 
+<xref linkend='XDrawArcs' xrefstyle='select: title'/>
+truncates it to 360 degrees.
+</para>
+<para>
+<!-- .LP -->
+For an arc specified as %[ ~x, ~y, ~width , ~height, ~angle1, ~angle2 ]%, 
+the origin of the major and minor axes is at 
+% [ x +^ {width over 2} , ~y +^ {height over 2}  ]%, 
+and the infinitely thin path describing the entire circle or ellipse 
+intersects the horizontal axis at % [ x, ~y +^ {height over 2}  ]% and 
+% [ x +^ width , ~y +^ { height over 2 }] %
+and intersects the vertical axis at % [ x +^ { width over 2 } , ~y ]% and 
+% [ x +^ { width over 2 }, ~y +^ height ]%.
+These coordinates can be fractional
+and so are not truncated to discrete coordinates.
+The path should be defined by the ideal mathematical path.  
+For a wide line with line-width lw, 
+the bounding outlines for filling are given        
+by the two infinitely thin paths consisting of all points whose perpendicular
+distance from the path of the circle/ellipse is equal to lw/2
+(which may be a fractional value).
+The cap-style and join-style are applied the same as for a line
+corresponding to the tangent of the circle/ellipse at the endpoint.
+</para>
+<para>
+<!-- .LP -->
+For an arc specified as % [ ~x, ~y, ~width, ~height, ~angle1, ~angle2  ]%,
+the angles must be specified
+in the effectively skewed coordinate system of the ellipse (for a
+circle, the angles and coordinate systems are identical).  The
+relationship between these angles and angles expressed in the normal
+coordinate system of the screen (as measured with a protractor) is as
+follows:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+% roman "skewed-angle" ~ = ~ atan left ( tan ( roman "normal-angle" )
+ * width over height right ) +^ adjust%
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+The skewed-angle and normal-angle are expressed in radians (rather
+than in degrees scaled by 64) in the range % [ 0 , ~2 pi  ]% and where atan
+returns a value in the range % [ - pi over 2 , ~pi over 2  ] %
+and adjust is:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA 1i 2i -->
+<!-- .ta 1i 2i -->
+%0%     for normal-angle in the range % [ 0 , ~pi over 2  ]%
+%pi%     for normal-angle in the range % [ pi over 2 , ~{3 pi} over 2  ]%
+%2 pi%     for normal-angle in the range % [ {3 pi} over 2 , ~2 pi  ]%
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+For any given arc, 
+<xref linkend='XDrawArc' xrefstyle='select: title'/>
+and
+<xref linkend='XDrawArcs' xrefstyle='select: title'/>
+do not draw a pixel more than once.  
+If two arcs join correctly and if the line-width is greater than zero 
+and the arcs intersect, 
+<xref linkend='XDrawArc' xrefstyle='select: title'/>
+and
+<xref linkend='XDrawArcs' xrefstyle='select: title'/>
+do not draw a pixel more than once.
+Otherwise, 
+the intersecting pixels of intersecting arcs are drawn multiple times.
+Specifying an arc with one endpoint and a clockwise extent draws the same pixels
+as specifying the other endpoint and an equivalent counterclockwise extent,
+except as it affects joins.
+</para>
+<para>
+<!-- .LP -->
+If the last point in one arc coincides with the first point in the following 
+arc, the two arcs will join correctly.  
+If the first point in the first arc coincides with the last point in the last 
+arc, the two arcs will join correctly.
+By specifying one axis to be zero, a horizontal or vertical line can be
+drawn.
+Angles are computed based solely on the coordinate system and ignore the
+aspect ratio.
+</para>
+<para>
+<!-- .LP -->
+Both functions use these GC components: 
+function, plane-mask, line-width, line-style, cap-style, join-style, 
+fill-style, subwindow-mode, clip-x-origin, clip-y-origin, and clip-mask.
+They also use these GC mode-dependent components: 
+foreground, background, tile, stipple, tile-stipple-x-origin, 
+tile-stipple-y-origin, dash-offset, and dash-list.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XDrawArc' xrefstyle='select: title'/>
+and
+<xref linkend='XDrawArcs' xrefstyle='select: title'/>
+can generate
+<errorname>BadDrawable</errorname>,
+<errorname>BadGC</errorname>,
+and
+<errorname>BadMatch</errorname>
+errors.
+</para>
+</sect2>
+</sect1>
+<sect1 id="Filling_Areas">
+<title>Filling Areas</title>
+<!-- .XS -->
+<!-- (SN Filling Areas  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to fill:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+A single rectangle or multiple rectangles
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A single polygon
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A single arc or multiple arcs
+    </para>
+  </listitem>
+</itemizedlist>
+<sect2 id="Filling_Single_and_Multiple_Rectangles">
+<title>Filling Single and Multiple Rectangles</title>
+<!-- .XS -->
+<!-- (SN Filling Single and Multiple Rectangles  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Filling</primary><secondary>rectangles</secondary></indexterm>
+<indexterm><primary>XFillRectangle</primary></indexterm>
+<indexterm><primary>Rectangle</primary><secondary>filling</secondary></indexterm>
+<indexterm><primary>XFillRectangles</primary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To fill a single rectangular area in a given drawable, use
+<xref linkend='XFillRectangle' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XFillRectangle</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XFillRectangle'>
+<funcprototype>
+  <funcdef><function>XFillRectangle</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>intx,<parameter> y</parameter></paramdef>
+  <paramdef>unsignedintwidth,<parameter> height</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+<!-- .ds Xy , which are relative to the origin of the drawable \ -->
+and specify the upper-left corner of the rectangle
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates(Xy.
+<!-- .ds Wh , which are the dimensions of the rectangle to be filled -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the width and height(Wh.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<!-- .sp -->
+To fill multiple rectangular areas in a given drawable, use
+<xref linkend='XFillRectangles' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XFillRectangles</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XFillRectangles'>
+<funcprototype>
+  <funcdef><function>XFillRectangles</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>XRectangle<parameter> *rectangles</parameter></paramdef>
+  <paramdef>int<parameter> nrectangles</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>rectangles</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies an array of rectangles.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nrectangles</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of rectangles in the array.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XFillRectangle' xrefstyle='select: title'/>
+and
+<xref linkend='XFillRectangles' xrefstyle='select: title'/>
+functions fill the specified rectangle or rectangles
+as if a four-point 
+<systemitem>FillPolygon</systemitem>
+protocol request were specified for each rectangle:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+[x,y] [x+width,y] [x+width,y+height] [x,y+height]
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+Each function uses the x and y coordinates,
+width and height dimensions, and GC you specify.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XFillRectangles' xrefstyle='select: title'/>
+fills the rectangles in the order listed in the array.  
+For any given rectangle,
+<xref linkend='XFillRectangle' xrefstyle='select: title'/>
+and
+<xref linkend='XFillRectangles' xrefstyle='select: title'/>
+do not draw a pixel more than once.  
+If rectangles intersect, the intersecting pixels are
+drawn multiple times.
+</para>
+<para>
+<!-- .LP -->
+Both functions use these GC components: 
+function, plane-mask, fill-style, subwindow-mode, 
+clip-x-origin, clip-y-origin, and clip-mask.
+They also use these GC mode-dependent components: 
+foreground, background, tile, stipple, tile-stipple-x-origin, 
+and tile-stipple-y-origin.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XFillRectangle' xrefstyle='select: title'/>
+and
+<xref linkend='XFillRectangles' xrefstyle='select: title'/>
+can generate
+<errorname>BadDrawable</errorname>,
+<errorname>BadGC</errorname>,
+and
+<errorname>BadMatch</errorname>
+errors.
+</para>
+</sect2>
+<sect2 id="Filling_a_Single_Polygon">
+<title>Filling a Single Polygon</title>
+<!-- .XS -->
+<!-- (SN Filling a Single Polygon  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To fill a polygon area in a given drawable, use
+<xref linkend='XFillPolygon' xrefstyle='select: title'/>.
+<indexterm><primary>Polygons</primary><secondary>filling</secondary></indexterm>
+<indexterm><primary>Filling</primary><secondary>polygon</secondary></indexterm>
+</para>
+<indexterm significance="preferred"><primary>XFillPolygon</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XFillPolygon'>
+<funcprototype>
+  <funcdef><function>XFillPolygon</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>XPoint<parameter> *points</parameter></paramdef>
+  <paramdef>int<parameter> npoints</parameter></paramdef>
+  <paramdef>int<parameter> shape</parameter></paramdef>
+  <paramdef>int<parameter> mode</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>points</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies an array of points.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>npoints</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of points in the array.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>shape</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a shape that helps the server to improve performance.
+You can pass 
+<symbol>Complex</symbol>,
+<symbol>Convex</symbol>,
+or 
+<symbol>Nonconvex</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>mode</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the coordinate mode. 
+You can pass
+<symbol>CoordModeOrigin</symbol>
+or
+<symbol>CoordModePrevious</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<xref linkend='XFillPolygon' xrefstyle='select: title'/>
+fills the region closed by the specified path.
+The path is closed
+automatically if the last point in the list does not coincide with the
+first point.
+<xref linkend='XFillPolygon' xrefstyle='select: title'/>
+does not draw a pixel of the region more than once.
+<symbol>CoordModeOrigin</symbol>
+treats all coordinates as relative to the origin,
+and
+<symbol>CoordModePrevious</symbol>
+treats all coordinates after the first as relative to the previous point.
+</para>
+<para>
+<!-- .LP -->
+Depending on the specified shape, the following occurs: 
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+If shape is
+<symbol>Complex</symbol>,
+the path may self-intersect. 
+Note that contiguous coincident points in the path are not treated 
+as self-intersection.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If shape is
+<symbol>Convex</symbol>,
+for every pair of points inside the polygon,
+the line segment connecting them does not intersect the path.
+If known by the client,
+specifying 
+<symbol>Convex</symbol>
+can improve performance.  
+If you specify
+<symbol>Convex</symbol>
+for a path that is not convex, 
+the graphics results are undefined.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If shape is
+<symbol>Nonconvex</symbol>,
+the path does not self-intersect, but the shape is not
+wholly convex. 
+If known by the client, 
+specifying 
+<symbol>Nonconvex</symbol>
+instead of
+<symbol>Complex</symbol>
+may improve performance.  
+If you specify
+<symbol>Nonconvex</symbol>
+for a self-intersecting path, the graphics results are undefined.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+The fill-rule of the GC controls the filling behavior of 
+self-intersecting polygons.
+</para>
+<para>
+<!-- .LP -->
+This function uses these GC components: 
+function, plane-mask, fill-style, fill-rule, subwindow-mode, clip-x-origin, 
+clip-y-origin, and clip-mask.
+It also uses these GC mode-dependent components: 
+foreground, background, tile, stipple, tile-stipple-x-origin, 
+and tile-stipple-y-origin.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XFillPolygon' xrefstyle='select: title'/>
+can generate
+<errorname>BadDrawable</errorname>,
+<errorname>BadGC</errorname>,
+<errorname>BadMatch</errorname>,
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+</sect2>
+<sect2 id="Filling_Single_and_Multiple_Arcs">
+<title>Filling Single and Multiple Arcs</title>
+<!-- .XS -->
+<!-- (SN Filling Single and Multiple Arcs  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>XFillArc</primary></indexterm>
+<indexterm><primary>Arcs</primary><secondary>filling</secondary></indexterm>
+<indexterm><primary>Filling</primary><secondary>arcs</secondary></indexterm>
+To fill a single arc in a given drawable, use
+<xref linkend='XFillArc' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XFillArc</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XFillArc'>
+<funcprototype>
+  <funcdef><function>XFillArc</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>intx,<parameter> y</parameter></paramdef>
+  <paramdef>unsignedintwidth,<parameter> height</parameter></paramdef>
+  <paramdef>intangle1,<parameter> angle2</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+<!-- .ds Xy , which are relative to the origin of the drawable \ -->
+and specify the upper-left corner of the bounding rectangle
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates(Xy.
+<!-- .ds Wh , which are the major and minor axes of the arc -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the width and height(Wh.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>angle1</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the start of the arc relative to the three-o'clock position
+from the center, in units of degrees * 64.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>angle2</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the path and extent of the arc relative to the start of the
+arc, in units of degrees * 64.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<!-- .sp -->
+To fill multiple arcs in a given drawable, use
+<xref linkend='XFillArcs' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XFillArcs</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XFillArcs'>
+<funcprototype>
+  <funcdef><function>XFillArcs</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>XArc<parameter> *arcs</parameter></paramdef>
+  <paramdef>int<parameter> narcs</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>arcs</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies an array of arcs.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>narcs</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of arcs in the array.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+For each arc, 
+<xref linkend='XFillArc' xrefstyle='select: title'/>
+or
+<xref linkend='XFillArcs' xrefstyle='select: title'/>
+fills the region closed by the infinitely thin path
+described by the specified arc and, depending on the 
+arc-mode specified in the GC, one or two line segments. 
+For 
+<symbol>ArcChord</symbol>,
+the single line segment joining the endpoints of the arc is used.  
+For 
+<symbol>ArcPieSlice</symbol>,
+the two line segments joining the endpoints of the arc with the center
+point are used.  
+<xref linkend='XFillArcs' xrefstyle='select: title'/>
+fills the arcs in the order listed in the array.  
+For any given arc,  
+<xref linkend='XFillArc' xrefstyle='select: title'/>
+and
+<xref linkend='XFillArcs' xrefstyle='select: title'/>
+do not draw a pixel more than once.  
+If regions intersect, 
+the intersecting pixels are drawn multiple times.
+</para>
+<para>
+<!-- .LP -->
+Both functions use these GC components: 
+function, plane-mask, fill-style, arc-mode, subwindow-mode, clip-x-origin, 
+clip-y-origin, and clip-mask.
+They also use these GC mode-dependent components: 
+foreground, background, tile, stipple, tile-stipple-x-origin, 
+and tile-stipple-y-origin.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XFillArc' xrefstyle='select: title'/>
+and
+<xref linkend='XFillArcs' xrefstyle='select: title'/>
+can generate
+<errorname>BadDrawable</errorname>,
+<errorname>BadGC</errorname>,
+and
+<errorname>BadMatch</errorname>
+errors.
+</para>
+</sect2>
+</sect1>
+<sect1 id="Font_Metrics">
+<title>Font Metrics</title>
+<!-- .XS -->
+<!-- (SN Font Metrics  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Font</primary></indexterm>
+A font is a graphical description of a set of characters that are used to 
+increase efficiency whenever a set of small, similar sized patterns are 
+repeatedly used.
+</para>
+<para>
+<!-- .LP -->
+This section discusses how to:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+Load and free fonts
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Obtain and free font names
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Compute character string sizes
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Compute logical extents
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Query character string sizes
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+The X server loads fonts whenever a program requests a new font.
+The server can cache fonts for quick lookup.
+Fonts are global across all screens in a server.
+Several levels are possible when dealing with fonts.
+Most applications simply use 
+<xref linkend='XLoadQueryFont' xrefstyle='select: title'/>
+to load a font and query the font metrics.
+</para>
+<para>
+<!-- .LP -->
+Characters in fonts are regarded as masks.
+Except for image text requests,
+the only pixels modified are those in which bits are set to 1 in the character.
+This means that it makes sense to draw text using stipples or tiles
+(for example, many menus gray-out unusable entries).
+</para>
+<para>
+<!-- .LP -->
+<!-- .sM -->
+The
+<structname>XFontStruct</structname>
+structure contains all of the information for the font
+and consists of the font-specific information as well as
+a pointer to an array of
+<structname>XCharStruct</structname>
+structures for the
+characters contained in the font.
+The
+<structname>XFontStruct</structname>,
+<structname>XFontProp</structname>,
+and
+<structname>XCharStruct</structname>
+structures contain:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XCharStruct</primary></indexterm>
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     short lbearing;               /* origin to left edge of raster */
+     short rbearing;               /* origin to right edge of raster */
+     short width;                  /* advance to next char's origin */
+     short ascent;                 /* baseline to top edge of raster */
+     short descent;                /* baseline to bottom edge of raster */
+     unsigned short attributes;    /* per char flags (not predefined) */
+} XCharStruct;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XFontProp</primary></indexterm>
+<literallayout class="monospaced">
+<!-- .TA .5i 1i 3i -->
+<!-- .ta .5i 1i 3i -->
+typedef struct {
+     Atom     name;
+     unsigned long card32;
+} XFontProp;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XChar2b</primary></indexterm>
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {     /* normal 16 bit characters are two bytes */
+    unsigned char byte1;
+    unsigned char byte2;
+} XChar2b;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XFontStruct</primary></indexterm>
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     XExtData *ext_data;               /* hook for extension to hang data */
+     Font fid;                         /* Font id for this font */
+     unsigned direction;               /* hint about the direction font is painted */
+     unsigned min_char_or_byte2;       /* first character */
+     unsigned max_char_or_byte2;       /* last character */
+     unsigned min_byte1;               /* first row that exists */
+     unsigned max_byte1;               /* last row that exists */
+     Bool all_chars_exist;             /* flag if all characters have nonzero size */
+     unsigned default_char;            /* char to print for undefined character */
+     int n_properties;                 /* how many properties there are */
+     XFontProp *properties;            /* pointer to array of additional properties */
+     XCharStruct min_bounds;           /* minimum bounds over all existing char */
+     XCharStruct max_bounds;           /* maximum bounds over all existing char */
+     XCharStruct *per_char;            /* first_char to last_char information */
+     int ascent;                       /* logical extent above baseline for spacing */
+     int descent;                      /* logical descent below baseline for spacing */
+} XFontStruct;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+X supports single byte/character, two bytes/character matrix,
+and 16-bit character text operations.
+Note that any of these forms can be used with a font, but a
+single byte/character text request can only specify a single byte
+(that is, the first row of a 2-byte font).
+You should view 2-byte fonts as a two-dimensional matrix of defined
+characters: byte1 specifies the range of defined rows and
+byte2 defines the range of defined columns of the font.
+Single byte/character fonts have one row defined, and the byte2 range
+specified in the structure defines a range of characters.
+</para>
+<para>
+<!-- .LP -->
+The bounding box of a character is defined by the 
+<structname>XCharStruct</structname>
+of that character.
+When characters are absent from a font,
+the default_char is used.
+When fonts have all characters of the same size,
+only the information in the
+<structname>XFontStruct</structname>
+min and max bounds are used.
+</para>
+<para>
+<!-- .LP -->
+The members of the 
+<structname>XFontStruct</structname>
+have the following semantics:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+The direction member can be either 
+<symbol>FontLeftToRight</symbol>
+or 
+<symbol>FontRightToLeft</symbol>.
+It is just a hint as to whether most 
+<structname>XCharStruct</structname>
+elements 
+have a positive 
+(<symbol>FontLeftToRight</symbol>)
+or a negative 
+(<symbol>FontRightToLeft</symbol>)
+character width 
+metric.
+The core protocol defines no support for vertical text.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If the min_byte1 and max_byte1 members are both zero, min_char_or_byte2
+specifies the linear character index corresponding to the first element
+of the per_char array, and max_char_or_byte2 specifies the linear character
+index of the last element.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If either min_byte1 or max_byte1 are nonzero, both
+min_char_or_byte2 and max_char_or_byte2 are less than 256, 
+and the 2-byte character index values corresponding to the
+per_char array element N (counting from 0) are:
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<!-- .nf -->
+     byte1 = N/D + min_byte1
+<!-- .br -->
+     byte2 = N\\D + min_char_or_byte2
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<!-- .fi -->
+where:
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<!-- .nf -->
+        D = max_char_or_byte2 - min_char_or_byte2 + 1
+        / = integer division
+        \\ = integer modulus
+<!-- .fi -->
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If the per_char pointer is NULL, 
+all glyphs between the first and last character indexes
+inclusive have the same information,
+as given by both min_bounds and max_bounds.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If all_chars_exist is 
+<symbol>True</symbol>,
+all characters in the per_char array have nonzero bounding boxes.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The default_char member specifies the character that will be used when an
+undefined or nonexistent character is printed.  
+The default_char is a 16-bit character (not a 2-byte character).
+For a font using 2-byte matrix format, 
+the default_char has byte1 in the most-significant byte
+and byte2 in the least significant byte.
+If the default_char itself specifies an undefined or nonexistent character, 
+no printing is performed for an undefined or nonexistent character.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The min_bounds and max_bounds members contain the most extreme values of
+each individual 
+<structname>XCharStruct</structname>
+component over all elements of this array
+(and ignore nonexistent characters).
+The bounding box of the font (the smallest
+rectangle enclosing the shape obtained by superimposing all of the
+characters at the same origin [x,y]) has its upper-left coordinate at:
+<literallayout class="monospaced">
+     [x + min_bounds.lbearing, y - max_bounds.ascent]
+</literallayout>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Its width is:
+<literallayout class="monospaced">
+     max_bounds.rbearing - min_bounds.lbearing
+</literallayout>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Its height is:
+<literallayout class="monospaced">
+     max_bounds.ascent + max_bounds.descent
+</literallayout>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The ascent member is the logical extent of the font above the baseline that is
+used for determining line spacing.
+Specific characters may extend beyond
+this.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The descent member is the logical extent of the font at or below the
+baseline that is used for determining line spacing.
+Specific characters may extend beyond this.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If the baseline is at Y-coordinate y,
+the logical extent of the font is inclusive between the Y-coordinate 
+values (y - font.ascent) and (y + font.descent - 1).
+Typically,
+the minimum interline spacing between rows of text is given
+by ascent + descent.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+For a character origin at [x,y],
+the bounding box of a character (that is, 
+the smallest rectangle that encloses the character's shape)
+described in terms of 
+<structname>XCharStruct</structname>
+components is a rectangle with its upper-left corner at:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+[x + lbearing, y - ascent]
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+Its width is:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+rbearing - lbearing
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+Its height is:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+ascent + descent
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+The origin for the next character is defined to be:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+[x + width, y]
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+The lbearing member defines the extent of the left edge of the character ink
+from the origin.
+The rbearing member defines the extent of the right edge of the character ink
+from the origin.
+The ascent member defines the extent of the top edge of the character ink
+from the origin.
+The descent member defines the extent of the bottom edge of the character ink
+from the origin.
+The width member defines the logical width of the character.
+</para>
+<para>
+<!-- .LP -->
+Note that the baseline (the y position of the character origin) 
+is logically viewed as being the scanline just below nondescending characters. 
+When descent is zero,
+only pixels with Y-coordinates less than y are drawn,
+and the origin is logically viewed as being coincident with the left edge of
+a nonkerned character. 
+When lbearing is zero,
+no pixels with X-coordinate less than x are drawn.
+Any of the
+<structname>XCharStruct</structname>
+metric members could be negative.
+If the width is negative,
+the next character will be placed to the left of the current origin.
+</para>
+<para>
+<!-- .LP -->
+The X protocol does not define the interpretation of the attributes member 
+in the
+<structname>XCharStruct</structname>
+structure.
+A nonexistent character is represented with all members of its
+<structname>XCharStruct</structname>
+set to zero.
+</para>
+<para>
+<!-- .LP -->
+A font is not guaranteed to have any properties.
+The interpretation of the property value (for example, long or unsigned long)
+must be derived from <emphasis remap='I'>a priori</emphasis> knowledge of the property. 
+A basic set of font properties is specified in the X Consortium standard
+<olink targetdoc='xlfd' targetptr='xlfd'><citetitle>X Logical Font Description Conventions</citetitle></olink>.
+</para>
+<sect2 id="Loading_and_Freeing_Fonts">
+<title>Loading and Freeing Fonts</title>
+<!-- .XS -->
+<!-- (SN Loading and Freeing Fonts  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to load fonts, get font information,
+unload fonts, and free font information.
+<indexterm><primary>Fonts</primary><secondary>getting information</secondary></indexterm>
+<indexterm><primary>Fonts</primary><secondary>unloading</secondary></indexterm>
+<indexterm><primary>Fonts</primary><secondary>freeing font information</secondary></indexterm>
+A few font functions use a 
+<type>GContext</type>
+resource ID or a font ID interchangeably.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To load a given font, use
+<xref linkend='XLoadFont' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XLoadFont</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XLoadFont'>
+<funcprototype>
+  <funcdef>Font <function>XLoadFont</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>char<parameter> *name</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>name</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the name of the font,
+which is a null-terminated string.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XLoadFont' xrefstyle='select: title'/>
+function loads the specified font and returns its associated font ID.
+If the font name is not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+Use of uppercase or lowercase does not matter.
+When the characters ``?'' and ``*'' are used in a font name, a
+pattern match is performed and any matching font is used.
+In the pattern, 
+the ``?'' character will match any single character, 
+and the ``*'' character will match any number of characters.
+A structured format for font names is specified in the X Consortium standard 
+<olink targetdoc='xlfd' targetptr='xlfd'><citetitle>X Logical Font Description Conventions</citetitle></olink>.
+If 
+<xref linkend='XLoadFont' xrefstyle='select: title'/>
+was unsuccessful at loading the specified font, 
+a 
+<errorname>BadName</errorname>
+error results.
+Fonts are not associated with a particular screen 
+and can be stored as a component
+of any GC.
+When the font is no longer needed, call 
+<xref linkend='XUnloadFont' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XLoadFont' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>
+and
+<errorname>BadName</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To return information about an available font, use
+<xref linkend='XQueryFont' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XQueryFont</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XQueryFont'>
+<funcprototype>
+  <funcdef>XFontStruct *<function>XQueryFont</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XID<parameter> font_ID</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_ID</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the font ID or the 
+<type>GContext</type>
+ID.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XQueryFont' xrefstyle='select: title'/>
+function returns a pointer to the
+<structname>XFontStruct</structname>
+structure, which contains information associated with the font.
+You can query a font or the font stored in a GC.
+The font ID stored in the 
+<structname>XFontStruct</structname>
+structure will be the 
+<type>GContext</type>
+ID, and you need to be careful when using this ID in other functions
+(see
+<xref linkend='XGContextFromGC' xrefstyle='select: title'/>).
+If the font does not exist,
+<xref linkend='XQueryFont' xrefstyle='select: title'/>
+returns NULL.
+To free this data, use
+<xref linkend='XFreeFontInfo' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To perform a
+<xref linkend='XLoadFont' xrefstyle='select: title'/>
+and
+<xref linkend='XQueryFont' xrefstyle='select: title'/>
+in a single operation, use
+<xref linkend='XLoadQueryFont' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XLoadQueryFont</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XLoadQueryFont'>
+<funcprototype>
+  <funcdef>XFontStruct *<function>XLoadQueryFont</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>char<parameter> *name</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>name</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the name of the font,
+which is a null-terminated string.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XLoadQueryFont' xrefstyle='select: title'/>
+function provides the most common way for accessing a font.
+<xref linkend='XLoadQueryFont' xrefstyle='select: title'/>
+both opens (loads) the specified font and returns a pointer to the
+appropriate
+<structname>XFontStruct</structname>
+structure.
+If the font name is not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+If the font does not exist,
+<xref linkend='XLoadQueryFont' xrefstyle='select: title'/>
+returns NULL.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XLoadQueryFont' xrefstyle='select: title'/>
+can generate a
+<errorname>BadAlloc</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To unload the font and free the storage used by the font structure
+that was allocated by
+<xref linkend='XQueryFont' xrefstyle='select: title'/>
+or
+<xref linkend='XLoadQueryFont' xrefstyle='select: title'/>,
+use
+<xref linkend='XFreeFont' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XFreeFont</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XFreeFont'>
+<funcprototype>
+  <funcdef><function>XFreeFont</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XFontStruct<parameter> *font_struct</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_struct</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the storage associated with the font.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XFreeFont' xrefstyle='select: title'/>
+function deletes the association between the font resource ID and the specified 
+font and frees the
+<structname>XFontStruct</structname>
+structure.
+The font itself will be freed when no other resource references it.
+The data and the font should not be referenced again.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XFreeFont' xrefstyle='select: title'/>
+can generate a
+<errorname>BadFont</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To return a given font property, use
+<xref linkend='XGetFontProperty' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetFontProperty</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetFontProperty'>
+<funcprototype>
+  <funcdef>Bool <function>XGetFontProperty</function></funcdef>
+  <paramdef>XFontStruct<parameter> *font_struct</parameter></paramdef>
+  <paramdef>Atom<parameter> atom</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> *value_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_struct</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the storage associated with the font.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>atom</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the atom for the property name you want returned.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>value_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the value of the font property.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+Given the atom for that property,
+the
+<xref linkend='XGetFontProperty' xrefstyle='select: title'/>
+function returns the value of the specified font property. 
+<xref linkend='XGetFontProperty' xrefstyle='select: title'/>
+also returns 
+<symbol>False</symbol>
+if the property was not defined or 
+<symbol>True</symbol>
+if it was defined.
+A set of predefined atoms exists for font properties,
+which can be found in
+<filename class="headerfile">&lt;X11/Xatom.h&gt;</filename>.
+<indexterm type="file"><primary><filename class="headerfile">X11/Xatom.h</filename></primary></indexterm>
+<indexterm><primary>Files</primary><secondary><filename class="headerfile">&lt;X11/Xatom.h&gt;</filename></secondary></indexterm>
+<indexterm><primary>Headers</primary><secondary><filename class="headerfile">&lt;X11/Xatom.h&gt;</filename></secondary></indexterm>
+This set contains the standard properties associated with
+a font.
+Although it is not guaranteed,
+it is likely that the predefined font properties will be present.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To unload a font that was loaded by
+<xref linkend='XLoadFont' xrefstyle='select: title'/>,
+use
+<xref linkend='XUnloadFont' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XUnloadFont</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XUnloadFont'>
+<funcprototype>
+  <funcdef><function>XUnloadFont</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Font<parameter> font</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the font.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XUnloadFont' xrefstyle='select: title'/>
+function deletes the association between the font resource ID and the specified font.
+The font itself will be freed when no other resource references it.
+The font should not be referenced again.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XUnloadFont' xrefstyle='select: title'/>
+can generate a
+<errorname>BadFont</errorname>
+error.
+</para>
+</sect2>
+<sect2 id="Obtaining_and_Freeing_Font_Names_and_Information">
+<title>Obtaining and Freeing Font Names and Information</title>
+<!-- .XS -->
+<!-- (SN Obtaining and Freeing Font Names and Information -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+You obtain font names and information by matching a wildcard specification
+when querying a font type for a list of available sizes and so on.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To return a list of the available font names, use
+<xref linkend='XListFonts' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XListFonts</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XListFonts'>
+<funcprototype>
+  <funcdef>char **<function>XListFonts</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>char<parameter> *pattern</parameter></paramdef>
+  <paramdef>int<parameter> maxnames</parameter></paramdef>
+  <paramdef>int<parameter> *actual_count_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>pattern</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the null-terminated pattern string that can contain wildcard 
+characters.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>maxnames</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the maximum number of names to be returned.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>actual_count_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the actual number of font names.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XListFonts' xrefstyle='select: title'/>
+function returns an array of available font names 
+(as controlled by the font search path; see
+<xref linkend='XSetFontPath' xrefstyle='select: title'/>)
+that match the string you passed to the pattern argument.
+The pattern string can contain any characters,
+but each asterisk (*) is a wildcard for any number of characters,
+and each question mark (?) is a wildcard for a single character.
+If the pattern string is not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+Use of uppercase or lowercase does not matter.
+Each returned string is null-terminated.
+If the data returned by the server is in the Latin Portable Character Encoding,
+then the returned strings are in the Host Portable Character Encoding.
+Otherwise, the result is implementation-dependent.
+If there are no matching font names,
+<xref linkend='XListFonts' xrefstyle='select: title'/>
+returns NULL.
+The client should call
+<xref linkend='XFreeFontNames' xrefstyle='select: title'/>
+when finished with the result to free the memory.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To free a font name array, use
+<xref linkend='XFreeFontNames' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XFreeFontNames</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XFreeFontNames'>
+<funcprototype>
+  <funcdef><function>XFreeFontNames</function></funcdef>
+  <paramdef>char<parameter> *list[]</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>list</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the array of strings you want to free.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XFreeFontNames' xrefstyle='select: title'/>
+function frees the array and strings returned by
+<xref linkend='XListFonts' xrefstyle='select: title'/>
+or
+<xref linkend='XListFontsWithInfo' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain the names and information about available fonts, use
+<xref linkend='XListFontsWithInfo' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XListFontsWithInfo</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XListFontsWithInfo'>
+<funcprototype>
+  <funcdef>char **<function>XListFontsWithInfo</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>char<parameter> *pattern</parameter></paramdef>
+  <paramdef>int<parameter> maxnames</parameter></paramdef>
+  <paramdef>int<parameter> *count_return</parameter></paramdef>
+  <paramdef>XFontStruct<parameter> **info_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>pattern</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the null-terminated pattern string that can contain wildcard 
+characters.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>maxnames</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the maximum number of names to be returned.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>count_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the actual number of matched font names.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>info_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the font information.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XListFontsWithInfo' xrefstyle='select: title'/>
+function returns a list of font names that match the specified pattern and their
+associated font information.
+The list of names is limited to size specified by maxnames.
+The information returned for each font is identical to what
+<xref linkend='XLoadQueryFont' xrefstyle='select: title'/>
+would return except that the per-character metrics are not returned.
+The pattern string can contain any characters,
+but each asterisk (*) is a wildcard for any number of characters,
+and each question mark (?) is a wildcard for a single character.
+If the pattern string is not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+Use of uppercase or lowercase does not matter.
+Each returned string is null-terminated.
+If the data returned by the server is in the Latin Portable Character Encoding,
+then the returned strings are in the Host Portable Character Encoding.
+Otherwise, the result is implementation-dependent.
+If there are no matching font names,
+<xref linkend='XListFontsWithInfo' xrefstyle='select: title'/>
+returns NULL.
+</para>
+<para>
+<!-- .LP -->
+To free only the allocated name array,
+the client should call
+<xref linkend='XFreeFontNames' xrefstyle='select: title'/>.
+To free both the name array and the font information array
+or to free just the font information array,
+the client should call
+<xref linkend='XFreeFontInfo' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To free font structures and font names, use
+<xref linkend='XFreeFontInfo' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XFreeFontInfo</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XFreeFontInfo'>
+<funcprototype>
+  <funcdef><function>XFreeFontInfo</function></funcdef>
+  <paramdef>char<parameter> **names</parameter></paramdef>
+  <paramdef>XFontStruct<parameter> *free_info</parameter></paramdef>
+  <paramdef>int<parameter> actual_count</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>names</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the list of font names.
+
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>free_info</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the font information.
+
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>actual_count</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the actual number of font names.
+
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XFreeFontInfo' xrefstyle='select: title'/>
+function frees a font structure or an array of font structures
+and optionally an array of font names.
+If NULL is passed for names, no font names are freed.
+If a font structure for an open font (returned by
+<xref linkend='XLoadQueryFont' xrefstyle='select: title'/>)
+is passed, the structure is freed,
+but the font is not closed; use
+<xref linkend='XUnloadFont' xrefstyle='select: title'/>
+to close the font.
+</para>
+</sect2>
+<sect2 id="Computing_Character_String_Sizes">
+<title>Computing Character String Sizes</title>
+<!-- .XS -->
+<!-- (SN Computing Character String Sizes  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to compute the width,
+the logical extents, 
+and the server information about 8-bit and 2-byte text strings.
+<indexterm><primary>XTextWidth</primary></indexterm>
+<indexterm><primary>XTextWidth16</primary></indexterm>
+The width is computed by adding the character widths of all the characters.
+It does not matter if the font is an 8-bit or 2-byte font.
+These functions return the sum of the character metrics in pixels.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To determine the width of an 8-bit character string, use
+<xref linkend='XTextWidth' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XTextWidth</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XTextWidth'>
+<funcprototype>
+  <funcdef>int <function>XTextWidth</function></funcdef>
+  <paramdef>XFontStruct<parameter> *font_struct</parameter></paramdef>
+  <paramdef>char<parameter> *string</parameter></paramdef>
+  <paramdef>int<parameter> count</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_struct</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the font used for the width computation.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>string</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the character string.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>count</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the character count in the specified string.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<!-- .sp -->
+To determine the width of a 2-byte character string, use
+<xref linkend='XTextWidth16' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XTextWidth16</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XTextWidth16'>
+<funcprototype>
+  <funcdef>int <function>XTextWidth16</function></funcdef>
+  <paramdef>XFontStruct<parameter> *font_struct</parameter></paramdef>
+  <paramdef>XChar2b<parameter> *string</parameter></paramdef>
+  <paramdef>int<parameter> count</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_struct</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the font used for the width computation.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>string</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the character string.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>count</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the character count in the specified string.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+</para>
+</sect2>
+<sect2 id="Computing_Logical_Extents">
+<title>Computing Logical Extents</title>
+<!-- .XS -->
+<!-- (SN Computing Logical Extents  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To compute the bounding box of an 8-bit character string in a given font, use
+<xref linkend='XTextExtents' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XTextExtents</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XTextExtents'>
+<funcprototype>
+  <funcdef><function>XTextExtents</function></funcdef>
+  <paramdef>XFontStruct<parameter> *font_struct</parameter></paramdef>
+  <paramdef>char<parameter> *string</parameter></paramdef>
+  <paramdef>int<parameter> nchars</parameter></paramdef>
+  <paramdef>int<parameter> *direction_return</parameter></paramdef>
+  <paramdef>int*font_ascent_return,<parameter> *font_descent_return</parameter></paramdef>
+  <paramdef>XCharStruct<parameter> *overall_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_struct</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the 
+<structname>XFontStruct</structname>
+structure.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>string</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the character string.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nchars</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of characters in the character string.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>direction_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the value of the direction hint
+(<symbol>FontLeftToRight</symbol>
+or
+<symbol>FontRightToLeft</symbol>).
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_ascent_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the font ascent.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_descent_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the font descent.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>overall_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the overall size in the specified
+<structname>XCharStruct</structname>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<!-- .sp -->
+To compute the bounding box of a 2-byte character string in a given font, use
+<xref linkend='XTextExtents16' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XTextExtents16</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XTextExtents16'>
+<funcprototype>
+  <funcdef><function>XTextExtents16</function></funcdef>
+  <paramdef>XFontStruct<parameter> *font_struct</parameter></paramdef>
+  <paramdef>XChar2b<parameter> *string</parameter></paramdef>
+  <paramdef>int<parameter> nchars</parameter></paramdef>
+  <paramdef>int<parameter> *direction_return</parameter></paramdef>
+  <paramdef>int*font_ascent_return,<parameter> *font_descent_return</parameter></paramdef>
+  <paramdef>XCharStruct<parameter> *overall_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_struct</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the 
+<structname>XFontStruct</structname>
+structure.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>string</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the character string.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nchars</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of characters in the character string.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>direction_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the value of the direction hint
+(<symbol>FontLeftToRight</symbol>
+or
+<symbol>FontRightToLeft</symbol>).
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_ascent_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the font ascent.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_descent_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the font descent.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>overall_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the overall size in the specified
+<structname>XCharStruct</structname>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XTextExtents' xrefstyle='select: title'/>
+and
+<xref linkend='XTextExtents16' xrefstyle='select: title'/>
+functions 
+perform the size computation locally and, thereby,
+avoid the round-trip overhead of
+<xref linkend='XQueryTextExtents' xrefstyle='select: title'/>
+and
+<xref linkend='XQueryTextExtents16' xrefstyle='select: title'/>.
+Both functions return an
+<structname>XCharStruct</structname>
+structure, whose members are set to the values as follows.
+</para>
+<para>
+<!-- .LP -->
+The ascent member is set to the maximum of the ascent metrics of all
+characters in the string.
+The descent member is set to the maximum of the descent metrics.
+The width member is set to the sum of the character-width metrics of all
+characters in the string.
+For each character in the string,
+let W be the sum of the character-width metrics of all characters preceding 
+it in the string.
+Let L be the left-side-bearing metric of the character plus W.
+Let R be the right-side-bearing metric of the character plus W.
+The lbearing member is set to the minimum L of all characters in the string.
+The rbearing member is set to the maximum R.
+</para>
+<para>
+<!-- .LP -->
+For fonts defined with linear indexing rather than 2-byte matrix indexing,
+each 
+<structname>XChar2b</structname>
+structure is interpreted as a 16-bit number with byte1 as the 
+most significant byte.
+If the font has no defined default character,
+undefined characters in the string are taken to have all zero metrics.
+</para>
+</sect2>
+<sect2 id="Querying_Character_String_Sizes">
+<title>Querying Character String Sizes</title>
+<!-- .XS -->
+<!-- (SN Querying Character String Sizes  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To query the server for the bounding box of an 8-bit character string in a 
+given font, use 
+<xref linkend='XQueryTextExtents' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XQueryTextExtents</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XQueryTextExtents'>
+<funcprototype>
+  <funcdef><function>XQueryTextExtents</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XID<parameter> font_ID</parameter></paramdef>
+  <paramdef>char<parameter> *string</parameter></paramdef>
+  <paramdef>int<parameter> nchars</parameter></paramdef>
+  <paramdef>int<parameter> *direction_return</parameter></paramdef>
+  <paramdef>int*font_ascent_return,<parameter> *font_descent_return</parameter></paramdef>
+  <paramdef>XCharStruct<parameter> *overall_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_ID</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies either the font ID or the 
+<type>GContext</type>
+ID that contains the font.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>string</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the character string.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nchars</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of characters in the character string.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>direction_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the value of the direction hint
+(<symbol>FontLeftToRight</symbol>
+or
+<symbol>FontRightToLeft</symbol>).
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_ascent_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the font ascent.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_descent_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the font descent.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>overall_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the overall size in the specified
+<structname>XCharStruct</structname>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<!-- .sp -->
+To query the server for the bounding box of a 2-byte character string
+in a given font, use
+<xref linkend='XQueryTextExtents16' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XQueryTextExtents16</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XQueryTextExtents16'>
+<funcprototype>
+  <funcdef><function>XQueryTextExtents16</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XID<parameter> font_ID</parameter></paramdef>
+  <paramdef>XChar2b<parameter> *string</parameter></paramdef>
+  <paramdef>int<parameter> nchars</parameter></paramdef>
+  <paramdef>int<parameter> *direction_return</parameter></paramdef>
+  <paramdef>int*font_ascent_return,<parameter> *font_descent_return</parameter></paramdef>
+  <paramdef>XCharStruct<parameter> *overall_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_ID</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies either the font ID or the 
+<type>GContext</type>
+ID that contains the font.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>string</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the character string.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nchars</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of characters in the character string.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>direction_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the value of the direction hint
+(<symbol>FontLeftToRight</symbol>
+or
+<symbol>FontRightToLeft</symbol>).
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_ascent_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the font ascent.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_descent_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the font descent.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>overall_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the overall size in the specified
+<structname>XCharStruct</structname>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XQueryTextExtents' xrefstyle='select: title'/>
+and
+<xref linkend='XQueryTextExtents16' xrefstyle='select: title'/>
+functions return the bounding box of the specified 8-bit and 16-bit
+character string in the specified font or the font contained in the
+specified GC.
+These functions query the X server and, therefore, suffer the round-trip
+overhead that is avoided by
+<xref linkend='XTextExtents' xrefstyle='select: title'/>
+and 
+<xref linkend='XTextExtents16' xrefstyle='select: title'/>.
+Both functions return a
+<structname>XCharStruct</structname>
+structure, whose members are set to the values as follows.
+</para>
+<para>
+<!-- .LP -->
+The ascent member is set to the maximum of the ascent metrics 
+of all characters in the string.
+The descent member is set to the maximum of the descent metrics.
+The width member is set to the sum of the character-width metrics 
+of all characters in the string.
+For each character in the string,
+let W be the sum of the character-width metrics of all characters preceding
+it in the string.
+Let L be the left-side-bearing metric of the character plus W.
+Let R be the right-side-bearing metric of the character plus W.
+The lbearing member is set to the minimum L of all characters in the string.
+The rbearing member is set to the maximum R.
+</para>
+<para>
+<!-- .LP -->
+For fonts defined with linear indexing rather than 2-byte matrix indexing,
+each 
+<structname>XChar2b</structname>
+structure is interpreted as a 16-bit number with byte1 as the 
+most significant byte.
+If the font has no defined default character,
+undefined characters in the string are taken to have all zero metrics.
+</para>
+<para>
+<!-- .LP -->
+Characters with all zero metrics are ignored.
+If the font has no defined default_char,
+the undefined characters in the string are also ignored.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XQueryTextExtents' xrefstyle='select: title'/>
+and
+<xref linkend='XQueryTextExtents16' xrefstyle='select: title'/>
+can generate
+<errorname>BadFont</errorname>
+and
+<errorname>BadGC</errorname>
+errors.
+</para>
+</sect2>
+</sect1>
+<sect1 id="Drawing_Text">
+<title>Drawing Text</title>
+<!-- .XS -->
+<!-- (SN Drawing Text -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+This section discusses how to draw:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+Complex text 
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Text characters
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Image text characters
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+The fundamental text functions
+<xref linkend='XDrawText' xrefstyle='select: title'/>
+and
+<xref linkend='XDrawText16' xrefstyle='select: title'/>
+use the following structures:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XTextItem</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     char *chars;     /* pointer to string */
+     int nchars;      /* number of characters */
+     int delta;       /* delta between strings */
+     Font font;       /* Font to print it in, None don't change */
+} XTextItem;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XTextItem16</primary></indexterm>
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     XChar2b *chars;     /* pointer to two-byte characters */
+     int nchars;         /* number of characters */
+     int delta;         /* delta between strings */
+     Font font;         /* font to print it in, None don't change */
+} XTextItem16;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+If the font member is not
+<symbol>None</symbol>,
+the font is changed before printing and also is stored in the GC.
+If an error was generated during text drawing,
+the previous items may have been drawn.
+The baseline of the characters are drawn starting at the x and y
+coordinates that you pass in the text drawing functions.
+</para>
+<para>
+<!-- .LP -->
+For example, consider the background rectangle drawn by
+<xref linkend='XDrawImageString' xrefstyle='select: title'/>.
+If you want the upper-left corner of the background rectangle
+to be at pixel coordinate (x,y), pass the (x,y + ascent)
+as the baseline origin coordinates to the text functions.
+The ascent is the font ascent, as given in the
+<structname>XFontStruct</structname>
+structure.
+If you want the lower-left corner of the background rectangle
+to be at pixel coordinate (x,y), pass the (x,y - descent + 1)
+as the baseline origin coordinates to the text functions.
+The descent is the font descent, as given in the
+<structname>XFontStruct</structname>
+structure.
+</para>
+<sect2 id="Drawing_Complex_Text">
+<title>Drawing Complex Text</title>
+<!-- .XS -->
+<!-- (SN Drawing Complex Text  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Text</primary><secondary>drawing</secondary></indexterm>
+<indexterm><primary>Drawing</primary><secondary>text items</secondary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+To draw 8-bit characters in a given drawable, use
+<xref linkend='XDrawText' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDrawText</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDrawText'>
+<funcprototype>
+  <funcdef><function>XDrawText</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>intx,<parameter> y</parameter></paramdef>
+  <paramdef>XTextItem<parameter> *items</parameter></paramdef>
+  <paramdef>int<parameter> nitems</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+<!-- .ds Xy , which are relative to the origin of the specified drawable \ -->
+and define the origin of the first character
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates(Xy.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>items</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies an array of text items.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nitems</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of text items in the array.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<!-- .sp -->
+To draw 2-byte characters in a given drawable, use
+<xref linkend='XDrawText16' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDrawText16</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDrawText16'>
+<funcprototype>
+  <funcdef><function>XDrawText16</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>intx,<parameter> y</parameter></paramdef>
+  <paramdef>XTextItem16<parameter> *items</parameter></paramdef>
+  <paramdef>int<parameter> nitems</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+<!-- .ds Xy , which are relative to the origin of the specified drawable \ -->
+and define the origin of the first character
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates(Xy.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>items</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies an array of text items.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nitems</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of text items in the array.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XDrawText16' xrefstyle='select: title'/>
+function is similar to
+<xref linkend='XDrawText' xrefstyle='select: title'/>
+except that it uses 2-byte or 16-bit characters.
+Both functions allow complex spacing and font shifts between counted strings.
+</para>
+<para>
+<!-- .LP -->
+Each text item is processed in turn.
+A font member other than 
+<symbol>None</symbol>
+in an item causes the font to be stored in the GC
+and used for subsequent text.  
+A text element delta specifies an additional change
+in the position along the x axis before the string is drawn. 
+The delta is always added to the character origin
+and is not dependent on any characteristics of the font.
+Each character image, as defined by the font in the GC, is treated as an
+additional mask for a fill operation on the drawable.
+The drawable is modified only where the font character has a bit set to 1.
+If a text item generates a
+<errorname>BadFont</errorname>
+error, the previous text items may have been drawn.
+</para>
+<para>
+<!-- .LP -->
+For fonts defined with linear indexing rather than 2-byte matrix indexing,
+each 
+<structname>XChar2b</structname>
+structure is interpreted as a 16-bit number with byte1 as the 
+most significant byte.
+</para>
+<para>
+<!-- .LP -->
+Both functions use these GC components:
+function, plane-mask, fill-style, font, subwindow-mode, 
+clip-x-origin, clip-y-origin, and clip-mask.
+They also use these GC mode-dependent components: 
+foreground, background, tile, stipple, tile-stipple-x-origin, 
+and tile-stipple-y-origin.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XDrawText' xrefstyle='select: title'/>
+and
+<xref linkend='XDrawText16' xrefstyle='select: title'/>
+can generate
+<errorname>BadDrawable</errorname>,
+<errorname>BadFont</errorname>,
+<errorname>BadGC</errorname>,
+and
+<errorname>BadMatch</errorname>
+errors.
+</para>
+</sect2>
+<sect2 id="Drawing_Text_Characters">
+<title>Drawing Text Characters</title>
+<!-- .XS -->
+<!-- (SN Drawing Text Characters  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Strings</primary><secondary>drawing</secondary></indexterm>
+<indexterm><primary>Drawing</primary><secondary>strings</secondary></indexterm>
+To draw 8-bit characters in a given drawable, use
+<xref linkend='XDrawString' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDrawString</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDrawString'>
+<funcprototype>
+  <funcdef><function>XDrawString</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>int<parameter> x</parameter></paramdef>
+  <paramdef>int<parameter> y</parameter></paramdef>
+  <paramdef>char<parameter> *string</parameter></paramdef>
+  <paramdef>int<parameter> length</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+<!-- .ds Xy , which are relative to the origin of the specified drawable \ -->
+and define the origin of the first character
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates(Xy.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>string</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the character string.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>length</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of characters in the string argument.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<!-- .sp -->
+To draw 2-byte characters in a given drawable, use
+<xref linkend='XDrawString16' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDrawString16</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDrawString16'>
+<funcprototype>
+  <funcdef><function>XDrawString16</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>intx,<parameter> y</parameter></paramdef>
+  <paramdef>XChar2b<parameter> *string</parameter></paramdef>
+  <paramdef>int<parameter> length</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+<!-- .ds Xy , which are relative to the origin of the specified drawable \ -->
+and define the origin of the first character
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates(Xy.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>string</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the character string.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>length</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of characters in the string argument.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+Each character image, as defined by the font in the GC, is treated as an
+additional mask for a fill operation on the drawable.
+The drawable is modified only where the font character has a bit set to 1.
+For fonts defined with 2-byte matrix indexing
+and used with
+<xref linkend='XDrawString16' xrefstyle='select: title'/>,
+each byte is used as a byte2 with a byte1 of zero.
+</para>
+<para>
+<!-- .LP -->
+Both functions use these GC components: 
+function, plane-mask, fill-style, font, subwindow-mode, clip-x-origin, 
+clip-y-origin, and clip-mask.
+They also use these GC mode-dependent components: 
+foreground, background, tile, stipple, tile-stipple-x-origin, 
+and tile-stipple-y-origin.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XDrawString' xrefstyle='select: title'/>
+and
+<xref linkend='XDrawString16' xrefstyle='select: title'/>
+can generate
+<errorname>BadDrawable</errorname>,
+<errorname>BadGC</errorname>,
+and
+<errorname>BadMatch</errorname>
+errors.
+</para>
+</sect2>
+<sect2 id="Drawing_Image_Text_Characters">
+<title>Drawing Image Text Characters</title>
+<!-- .XS -->
+<!-- (SN Drawing Image Text Characters  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Image text</primary><secondary>drawing</secondary></indexterm>
+<indexterm><primary>Drawing</primary><secondary>image text</secondary></indexterm>
+Some applications, in particular terminal emulators, need to
+print image text in which both the foreground and background bits of
+each character are painted.
+This prevents annoying flicker on many displays.
+<indexterm><primary>XDrawImageString</primary></indexterm>
+<indexterm><primary>XDrawImageString16</primary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To draw 8-bit image text characters in a given drawable, use
+<xref linkend='XDrawImageString' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDrawImageString</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDrawImageString'>
+<funcprototype>
+  <funcdef><function>XDrawImageString</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>intx,<parameter> y</parameter></paramdef>
+  <paramdef>char<parameter> *string</parameter></paramdef>
+  <paramdef>int<parameter> length</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+<!-- .ds Xy , which are relative to the origin of the specified drawable \ -->
+and define the origin of the first character
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates(Xy.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>string</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the character string.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>length</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of characters in the string argument.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<!-- .sp -->
+To draw 2-byte image text characters in a given drawable, use
+<xref linkend='XDrawImageString16' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDrawImageString16</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDrawImageString16'>
+<funcprototype>
+  <funcdef><function>XDrawImageString16</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>intx,<parameter> y</parameter></paramdef>
+  <paramdef>XChar2b<parameter> *string</parameter></paramdef>
+  <paramdef>int<parameter> length</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+<!-- .ds Xy , which are relative to the origin of the specified drawable \ -->
+and define the origin of the first character
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates(Xy.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>string</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the character string.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>length</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of characters in the string argument.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XDrawImageString16' xrefstyle='select: title'/>
+function is similar to
+<xref linkend='XDrawImageString' xrefstyle='select: title'/>
+except that it uses 2-byte or 16-bit characters.
+Both functions also use both the foreground and background pixels 
+of the GC in the destination.
+</para>
+<para>
+<!-- .LP -->
+The effect is first to fill a
+destination rectangle with the background pixel defined in the GC and then
+to paint the text with the foreground pixel.
+The upper-left corner of the filled rectangle is at:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+[x, y - font-ascent]
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+The width is:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+overall-width
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+The height is:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+font-ascent + font-descent
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+The overall-width, font-ascent, and font-descent
+are as would be returned by 
+<xref linkend='XQueryTextExtents' xrefstyle='select: title'/>
+using gc and string.
+The function and fill-style defined in the GC are ignored for these functions. 
+The effective function is 
+<symbol>GXcopy</symbol>,
+and the effective fill-style is
+<symbol>FillSolid</symbol>.
+</para>
+<para>
+<!-- .LP -->
+For fonts defined with 2-byte matrix indexing
+and used with
+<xref linkend='XDrawImageString' xrefstyle='select: title'/>,
+each byte is used as a byte2 with a byte1 of zero.
+</para>
+<para>
+<!-- .LP -->
+Both functions use these GC components: 
+plane-mask, foreground, background, font, subwindow-mode, clip-x-origin, 
+clip-y-origin, and clip-mask.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XDrawImageString' xrefstyle='select: title'/>
+and
+<xref linkend='XDrawImageString16' xrefstyle='select: title'/>
+can generate
+<errorname>BadDrawable</errorname>,
+<errorname>BadGC</errorname>,
+and
+<errorname>BadMatch</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+</para>
+</sect2>
+</sect1>
+<sect1 id="Transferring_Images_between_Client_and_Server">
+<title>Transferring Images between Client and Server</title>
+<!-- .XS -->
+<!-- (SN Transferring Images between Client and Server  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to transfer images between a client 
+and the server.
+Because the server may require diverse data formats, 
+Xlib provides an image object that fully describes the data in memory 
+and that provides for basic operations on that data.  
+You should reference the data 
+through the image object rather than referencing the data directly.
+However, some implementations of the Xlib library may efficiently deal with 
+frequently used data formats by replacing
+functions in the procedure vector with special case functions.
+Supported operations include destroying the image, getting a pixel,
+storing a pixel, extracting a subimage of an image, and adding a constant
+to an image (see <link linkend="Manipulating_Images">section 16.8</link>).
+</para>
+<para>
+<!-- .LP -->
+All the image manipulation functions discussed in this section make use of 
+the 
+<structname>XImage</structname>
+structure,
+which describes an image as it exists in the client's memory.
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XImage</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 1i 3i -->
+<!-- .ta .5i 1i 3i -->
+typedef struct _XImage {
+     int width, height;         /* size of image */
+     int xoffset;               /* number of pixels offset in X direction */
+     int format;                /* XYBitmap, XYPixmap, ZPixmap */
+     char *data;                /* pointer to image data */
+     int byte_order;            /* data byte order, LSBFirst, MSBFirst */
+     int bitmap_unit;           /* quant. of scanline 8, 16, 32 */
+     int bitmap_bit_order;      /* LSBFirst, MSBFirst */
+     int bitmap_pad;            /* 8, 16, 32 either XY or ZPixmap */
+     int depth;                 /* depth of image */
+     int bytes_per_line;        /* accelerator to next scanline */
+     int bits_per_pixel;        /* bits per pixel (ZPixmap) */
+     unsigned long red_mask;    /* bits in z arrangement */
+     unsigned long green_mask;
+     unsigned long blue_mask;
+     XPointer obdata;           /* hook for the object routines to hang on */
+     struct funcs {             /* image manipulation routines */
+          struct _XImage *(*create_image)();
+          int             (*destroy_image)();
+          unsigned long   (*get_pixel)();
+          int             (*put_pixel)();
+          struct _XImage  *(*sub_image)();
+          int            (*add_pixel)();
+     } f;
+} XImage;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<!-- .sp -->
+To initialize the image manipulation routines of an image structure, use
+<xref linkend='XInitImage' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XInitImage</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XInitImage'>
+<funcprototype>
+  <funcdef>Status <function>XInitImage</function></funcdef>
+  <paramdef>XImage<parameter> *image</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ximage</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the image.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XInitImage' xrefstyle='select: title'/>
+function initializes the internal image manipulation routines of an
+image structure, based on the values of the various structure members.
+All fields other than the manipulation routines must already be initialized.
+If the bytes_per_line member is zero,
+<xref linkend='XInitImage' xrefstyle='select: title'/>
+will assume the image data is contiguous in memory and set the
+bytes_per_line member to an appropriate value based on the other
+members; otherwise, the value of bytes_per_line is not changed.
+All of the manipulation routines are initialized to functions
+that other Xlib image manipulation functions need to operate on the
+type of image specified by the rest of the structure.
+</para>
+<para>
+<!-- .LP -->
+This function must be called for any image constructed by the client
+before passing it to any other Xlib function.
+Image structures created or returned by Xlib do not need to be
+initialized in this fashion.
+</para>
+<para>
+<!-- .LP -->
+This function returns a nonzero status if initialization of the
+structure is successful.  It returns zero if it detected some error
+or inconsistency in the structure, in which case the image is not changed.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To combine an image with a rectangle of a drawable on the display,
+use
+<xref linkend='XPutImage' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XPutImage</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XPutImage'>
+<funcprototype>
+  <funcdef><function>XPutImage</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>XImage<parameter> *image</parameter></paramdef>
+  <paramdef>intsrc_x,<parameter> src_y</parameter></paramdef>
+  <paramdef>intdest_x,<parameter> dest_y</parameter></paramdef>
+  <paramdef>unsignedintwidth,<parameter> height</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>image</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the image you want combined with the rectangle. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>src_x</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the offset in X from the left edge of the image defined
+by the 
+<structname>XImage</structname>
+structure.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>src_y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the offset in Y from the top edge of the image defined
+by the 
+<structname>XImage</structname>
+structure.
+<!-- .ds Dx , which are relative to the origin of the drawable \ -->
+and are the coordinates of the subimage
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dest_x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dest_y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates(Dx. 
+<!-- .ds Wh \ of the subimage, which define the dimensions of the rectangle -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the width and height(Wh.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XPutImage' xrefstyle='select: title'/>
+function
+combines an image with a rectangle of the specified drawable.
+The section of the image defined by the src_x, src_y, width, and height 
+arguments is drawn on the specified part of the drawable.
+If 
+<symbol>XYBitmap</symbol>
+format is used, the depth of the image must be one,
+or a
+<errorname>BadMatch</errorname>
+error results.
+The foreground pixel in the GC defines the source for the one bits in the image,
+and the background pixel defines the source for the zero bits.
+For 
+<symbol>XYPixmap</symbol>
+and 
+<symbol>ZPixmap</symbol>,
+the depth of the image must match the depth of the drawable,
+or a
+<errorname>BadMatch</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+If the characteristics of the image (for example, byte_order and bitmap_unit)
+differ from what the server requires,
+<xref linkend='XPutImage' xrefstyle='select: title'/>
+automatically makes the appropriate
+conversions.
+</para>
+<para>
+<!-- .LP -->
+This function uses these GC components: 
+function, plane-mask, subwindow-mode, clip-x-origin, clip-y-origin, 
+and clip-mask.
+It also uses these GC mode-dependent components:
+foreground and background.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XPutImage' xrefstyle='select: title'/>
+can generate
+<errorname>BadDrawable</errorname>,
+<errorname>BadGC</errorname>,
+<errorname>BadMatch</errorname>,
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To return the contents of a rectangle in a given drawable on the display,
+use
+<xref linkend='XGetImage' xrefstyle='select: title'/>.
+This function specifically supports rudimentary screen dumps.
+</para>
+<indexterm significance="preferred"><primary>XGetImage</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetImage'>
+<funcprototype>
+  <funcdef>XImage *<function>XGetImage</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>intx,<parameter> y</parameter></paramdef>
+  <paramdef>unsignedintwidth,<parameter> height</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> plane_mask</parameter></paramdef>
+  <paramdef>int<parameter> format</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable. 
+<!-- .ds Xy , which are relative to the origin of the drawable \ -->
+and define the upper-left corner of the rectangle
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates(Xy.
+<!-- .ds Wh \ of the subimage, which define the dimensions of the rectangle -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the width and height(Wh.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>plane_mask</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the plane mask.
+<!-- .\" *** JIM: NEED MORE INFO FOR THIS. *** -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>format</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the format for the image.
+You can pass
+<symbol>XYPixmap</symbol>
+or 
+<symbol>ZPixmap</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetImage' xrefstyle='select: title'/>
+function returns a pointer to an
+<structname>XImage</structname>
+structure.
+This structure provides you with the contents of the specified rectangle of
+the drawable in the format you specify.
+If the format argument is 
+<symbol>XYPixmap</symbol>,
+the image contains only the bit planes you passed to the plane_mask argument.
+If the plane_mask argument only requests a subset of the planes of the
+display, the depth of the returned image will be the number of planes
+requested.
+If the format argument is 
+<symbol>ZPixmap</symbol>,
+<xref linkend='XGetImage' xrefstyle='select: title'/>
+returns as zero the bits in all planes not 
+specified in the plane_mask argument.
+The function performs no range checking on the values in plane_mask and ignores
+extraneous bits.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGetImage' xrefstyle='select: title'/>
+returns the depth of the image to the depth member of the
+<structname>XImage</structname>
+structure.
+The depth of the image is as specified when the drawable was created,
+except when getting a subset of the planes in 
+<symbol>XYPixmap</symbol>
+format, when the depth is given by the number of bits set to 1 in plane_mask.
+</para>
+<para>
+<!-- .LP -->
+If the drawable is a pixmap, 
+the given rectangle must be wholly contained within the pixmap, 
+or a
+<errorname>BadMatch</errorname>
+error results.
+If the drawable is a window, 
+the window must be viewable, 
+and it must be the case that if there were no inferiors or overlapping windows,
+the specified rectangle of the window would be fully visible on the screen
+and wholly contained within the outside edges of the window,
+or a
+<errorname>BadMatch</errorname>
+error results.
+Note that the borders of the window can be included and read with
+this request.
+If the window has backing-store, the backing-store contents are
+returned for regions of the window that are obscured by noninferior
+windows. 
+If the window does not have backing-store,
+the returned contents of such obscured regions are undefined.
+The returned contents of visible regions of inferiors
+of a different depth than the specified window's depth are also undefined.
+The pointer cursor image is not included in the returned contents.
+If a problem occurs,
+<xref linkend='XGetImage' xrefstyle='select: title'/>
+returns NULL.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGetImage' xrefstyle='select: title'/>
+can generate
+<errorname>BadDrawable</errorname>,
+<errorname>BadMatch</errorname>,
+and
+<errorname>BadValue</errorname>
+errors.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To copy the contents of a rectangle on the display
+to a location within a preexisting image structure, use
+<xref linkend='XGetSubImage' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetSubImage</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetSubImage'>
+<funcprototype>
+  <funcdef>XImage *<function>XGetSubImage</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>intx,<parameter> y</parameter></paramdef>
+  <paramdef>unsignedintwidth,<parameter> height</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> plane_mask</parameter></paramdef>
+  <paramdef>int<parameter> format</parameter></paramdef>
+  <paramdef>XImage<parameter> *dest_image</parameter></paramdef>
+  <paramdef>intdest_x,<parameter> dest_y</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable. 
+<!-- .ds Xy , which are relative to the origin of the drawable \ -->
+and define the upper-left corner of the rectangle
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates(Xy.
+<!-- .ds Wh \ of the subimage, which define the dimensions of the rectangle -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the width and height(Wh.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>plane_mask</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the plane mask.
+<!-- .\" *** JIM: NEED MORE INFO FOR THIS. *** -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>format</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the format for the image.
+You can pass
+<symbol>XYPixmap</symbol>
+or 
+<symbol>ZPixmap</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dest_image</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the destination image.
+<!-- .ds Dx , which are relative to the origin of the destination rectangle, \ -->
+specify its upper-left corner, and determine where the subimage \
+is placed in the destination image
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dest_x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dest_y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates(Dx. 
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The 
+<xref linkend='XGetSubImage' xrefstyle='select: title'/>
+function updates dest_image with the specified subimage in the same manner as 
+<xref linkend='XGetImage' xrefstyle='select: title'/>.
+If the format argument is 
+<symbol>XYPixmap</symbol>,
+the image contains only the bit planes you passed to the plane_mask argument.
+If the format argument is 
+<symbol>ZPixmap</symbol>,
+<xref linkend='XGetSubImage' xrefstyle='select: title'/>
+returns as zero the bits in all planes not 
+specified in the plane_mask argument.
+The function performs no range checking on the values in plane_mask and ignores
+extraneous bits.
+As a convenience,
+<xref linkend='XGetSubImage' xrefstyle='select: title'/>
+returns a pointer to the same
+<structname>XImage</structname>
+structure specified by dest_image.
+</para>
+<para>
+<!-- .LP -->
+The depth of the destination
+<structname>XImage</structname>
+structure must be the same as that of the drawable.
+If the specified subimage does not fit at the specified location
+on the destination image, the right and bottom edges are clipped.
+If the drawable is a pixmap,
+the given rectangle must be wholly contained within the pixmap,
+or a
+<errorname>BadMatch</errorname>
+error results.
+If the drawable is a window, 
+the window must be viewable, 
+and it must be the case that if there were no inferiors or overlapping windows,
+the specified rectangle of the window would be fully visible on the screen
+and wholly contained within the outside edges of the window,
+or a
+<errorname>BadMatch</errorname>
+error results.
+If the window has backing-store, 
+then the backing-store contents are returned for regions of the window 
+that are obscured by noninferior windows. 
+If the window does not have backing-store, 
+the returned contents of such obscured regions are undefined.
+The returned contents of visible regions of inferiors
+of a different depth than the specified window's depth are also undefined.
+If a problem occurs,
+<xref linkend='XGetSubImage' xrefstyle='select: title'/>
+returns NULL.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGetSubImage' xrefstyle='select: title'/>
+can generate
+<errorname>BadDrawable</errorname>,
+<errorname>BadGC</errorname>,
+<errorname>BadMatch</errorname>,
+and
+<errorname>BadValue</errorname>
+errors.
+<!-- .bp -->
+
+
+</para>
+</sect1>
+</chapter>
diff --git a/specs/libX11/CH09.xml b/specs/libX11/CH09.xml
new file mode 100644 (file)
index 0000000..5636df1
--- /dev/null
@@ -0,0 +1,2017 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+         "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
+<chapter id='Window_and_Session_Manager_Functions'>
+<title>Window and Session Manager Functions</title>
+
+<para>
+Although it is difficult to categorize functions as exclusively for an application,
+a window manager, or a session manager, the functions in this chapter are most
+often used by window managers and session managers. It is not expected that
+these functions will be used by most application programs. Xlib provides
+management functions to:
+</para>
+
+<itemizedlist>
+  <listitem><para>Change the parent of a window</para></listitem>
+  <listitem><para>Control the lifetime of a window</para></listitem>
+  <listitem><para>Manage installed colormaps</para></listitem>
+  <listitem><para>Set and retrieve the font search path</para></listitem>
+  <listitem><para>Grab the server</para></listitem>
+  <listitem><para>Kill a client</para></listitem>
+  <listitem><para>Control the screen saver</para></listitem>
+  <listitem><para>Control host access</para></listitem>
+</itemizedlist>
+
+<sect1 id="Changing_the_Parent_of_a_Window">
+<title>Changing the Parent of a Window</title>
+<!-- .XS -->
+<!-- (SN Changing the Parent of a Window  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To change a window's parent to another window on the same screen, use
+<xref linkend='XReparentWindow' xrefstyle='select: title'/>.
+There is no way to move a window between screens.
+</para>
+<indexterm significance="preferred"><primary>XReparentWindow</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XReparentWindow'>
+<funcprototype>
+  <funcdef><function>XReparentWindow</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>Window<parameter> parent</parameter></paramdef>
+  <paramdef>intx,<parameter> y</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>parent</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the parent window.
+<!-- .ds Xy \ of the position in the new parent window -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates(Xy.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+If the specified window is mapped,
+<xref linkend='XReparentWindow' xrefstyle='select: title'/>
+automatically performs an
+<systemitem>UnmapWindow</systemitem>
+request on it, removes it from its current position in the hierarchy,
+and inserts it as the child of the specified parent.
+The window is placed in the stacking order on top with respect to
+sibling windows.
+</para>
+<para>
+<!-- .LP -->
+After reparenting the specified window,
+<xref linkend='XReparentWindow' xrefstyle='select: title'/>
+causes the X server to generate a
+<symbol>ReparentNotify</symbol>
+event.
+The override_redirect member returned in this event is
+set to the window's corresponding attribute.
+Window manager clients usually should ignore this window if this member
+is set to
+<symbol>True</symbol>.
+Finally, if the specified window was originally mapped,
+the X server automatically performs a
+<systemitem>MapWindow</systemitem>
+request on it.
+</para>
+<para>
+<!-- .LP -->
+The X server performs normal exposure processing on formerly obscured
+windows.
+The X server might not generate 
+<symbol>Expose</symbol>
+events for regions from the initial
+<systemitem>UnmapWindow</systemitem>
+request that are immediately obscured by the final
+<systemitem>MapWindow</systemitem>
+request.
+A
+<errorname>BadMatch</errorname>
+error results if:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+The new parent window is not on the same screen as
+the old parent window.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The new parent window is the specified window or an inferior of the
+specified window.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The new parent is
+<symbol>InputOnly</symbol>,
+and the window is not.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The specified window has a
+<symbol>ParentRelative</symbol>
+background, and the new parent window is not the same depth as the
+specified window.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+<xref linkend='XReparentWindow' xrefstyle='select: title'/>
+can generate
+<errorname>BadMatch</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+</sect1>
+<sect1 id="Controlling_the_Lifetime_of_a_Window">
+<title>Controlling the Lifetime of a Window</title>
+<!-- .XS -->
+<!-- (SN Controlling the Lifetime of a Window  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The save-set of a client is a list of other clients' windows that,
+if they are inferiors of one of the client's windows at connection close,
+should not be destroyed and should be remapped if they are unmapped.
+For further information about close-connection processing,
+see <link linkend='Using_X_Server_Connection_Close_Operations'>section 2.6</link>.
+To allow an application's window to survive when a window manager that
+has reparented a window fails,
+Xlib provides the save-set functions that you can 
+use to control the longevity of subwindows
+that are normally destroyed when the parent is destroyed.
+For example, a window manager that wants to add decoration
+to a window by adding a frame might reparent an application's
+window. 
+When the frame is destroyed,
+the application's window should not be destroyed 
+but be returned to its previous place in the window hierarchy.
+</para>
+<para>
+<!-- .LP -->
+The X server automatically removes windows from the save-set
+when they are destroyed.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To add or remove a window from the client's save-set, use
+<xref linkend='XChangeSaveSet' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XChangeSaveSet</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XChangeSaveSet'>
+<funcprototype>
+  <funcdef><function>XChangeSaveSet</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>int<parameter> change_mode</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Wi that you want to add to or delete from the client's save-set -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window (Wi.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>change_mode</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the mode.
+You can pass
+<symbol>SetModeInsert</symbol>
+or
+<symbol>SetModeDelete</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+Depending on the specified mode,
+<xref linkend='XChangeSaveSet' xrefstyle='select: title'/>
+either inserts or deletes the specified window from the client's save-set. 
+The specified window must have been created by some other client,
+or a
+<errorname>BadMatch</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XChangeSaveSet' xrefstyle='select: title'/>
+can generate
+<errorname>BadMatch</errorname>,
+<errorname>BadValue</errorname>,
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To add a window to the client's save-set, use
+<xref linkend='XAddToSaveSet' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XAddToSaveSet</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XAddToSaveSet'>
+<funcprototype>
+  <funcdef><function>XAddToSaveSet</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Wi that you want to add to the client's save-set -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window (Wi.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XAddToSaveSet' xrefstyle='select: title'/>
+function adds the specified window to the client's save-set.
+The specified window must have been created by some other client,
+or a
+<errorname>BadMatch</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XAddToSaveSet' xrefstyle='select: title'/>
+can generate
+<errorname>BadMatch</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To remove a window from the client's save-set, use
+<xref linkend='XRemoveFromSaveSet' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XRemoveFromSaveSet</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XRemoveFromSaveSet'>
+<funcprototype>
+  <funcdef><function>XRemoveFromSaveSet</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Wi that you want to delete from the client's save-set -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window (Wi.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XRemoveFromSaveSet' xrefstyle='select: title'/>
+function removes the specified window from the client's save-set.
+The specified window must have been created by some other client,
+or a
+<errorname>BadMatch</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XRemoveFromSaveSet' xrefstyle='select: title'/>
+can generate
+<errorname>BadMatch</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+</sect1>
+<sect1 id="Managing_Installed_Colormaps">
+<title>Managing Installed Colormaps</title>
+<!-- .XS -->
+<!-- (SN Managing Installed Colormaps -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The X server maintains a list of installed colormaps.
+Windows using these colormaps are guaranteed to display with
+correct colors; windows using other colormaps may or may not display
+with correct colors.
+Xlib provides functions that you can use to install a colormap, 
+uninstall a colormap, and obtain a list of installed colormaps.
+</para>
+<para>
+<!-- .LP -->
+At any time,
+there is a subset of the installed maps that is viewed as an ordered list
+and is called the required list.
+The length of the required list is at most M,
+where M is the minimum number of installed colormaps specified for the screen
+in the connection setup.
+The required list is maintained as follows.
+When a colormap is specified to
+<xref linkend='XInstallColormap' xrefstyle='select: title'/>,
+it is added to the head of the list;
+the list is truncated at the tail, if necessary, to keep its length to 
+at most M.
+When a colormap is specified to
+<xref linkend='XUninstallColormap' xrefstyle='select: title'/>
+and it is in the required list,
+it is removed from the list.
+A colormap is not added to the required list when it is implicitly installed
+by the X server,
+and the X server cannot implicitly uninstall a colormap that is in the
+required list.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To install a colormap, use
+<xref linkend='XInstallColormap' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XInstallColormap</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XInstallColormap'>
+<funcprototype>
+  <funcdef><function>XInstallColormap</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Colormap<parameter> colormap</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colormap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the colormap.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XInstallColormap' xrefstyle='select: title'/>
+function installs the specified colormap for its associated screen.
+All windows associated with this colormap immediately display with
+true colors.
+You associated the windows with this colormap when you created them by calling
+<xref linkend='XCreateWindow' xrefstyle='select: title'/>,
+<xref linkend='XCreateSimpleWindow' xrefstyle='select: title'/>,
+<xref linkend='XChangeWindowAttributes' xrefstyle='select: title'/>,
+or
+<xref linkend='XSetWindowColormap' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+If the specified colormap is not already an installed colormap, 
+the X server generates a
+<symbol>ColormapNotify</symbol>
+event on each window that has that colormap.
+In addition, for every other colormap that is installed as 
+a result of a call to
+<xref linkend='XInstallColormap' xrefstyle='select: title'/>,
+the X server generates a
+<symbol>ColormapNotify</symbol>
+event on each window that has that colormap.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XInstallColormap' xrefstyle='select: title'/>
+can generate a
+<errorname>BadColor</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To uninstall a colormap, use
+<xref linkend='XUninstallColormap' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XUninstallColormap</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XUninstallColormap'>
+<funcprototype>
+  <funcdef><function>XUninstallColormap</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Colormap<parameter> colormap</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colormap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the colormap.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XUninstallColormap' xrefstyle='select: title'/>
+function removes the specified colormap from the required
+list for its screen.
+As a result,
+the specified colormap might be uninstalled, 
+and the X server might implicitly install or uninstall additional colormaps.
+Which colormaps get installed or uninstalled is server dependent
+except that the required list must remain installed.
+</para>
+<para>
+<!-- .LP -->
+If the specified colormap becomes uninstalled, 
+the X server generates a
+<symbol>ColormapNotify</symbol>
+event on each window that has that colormap.
+In addition, for every other colormap that is installed or uninstalled as a 
+result of a call to 
+<xref linkend='XUninstallColormap' xrefstyle='select: title'/>,
+the X server generates a
+<symbol>ColormapNotify</symbol>
+event on each window that has that colormap.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XUninstallColormap' xrefstyle='select: title'/>
+can generate a
+<errorname>BadColor</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain a list of the currently installed colormaps for a given screen, use
+<xref linkend='XListInstalledColormaps' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XListInstalledColormaps</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XListInstalledColormaps'>
+<funcprototype>
+  <funcdef>Colormap *<function>XListInstalledColormaps</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>int<parameter> *num_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Wi that determines the screen -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window (Wi.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>num_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the number of currently installed colormaps.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XListInstalledColormaps' xrefstyle='select: title'/>
+function returns a list of the currently installed colormaps for the screen 
+of the specified window.
+The order of the colormaps in the list is not significant
+and is no explicit indication of the required list.
+When the allocated list is no longer needed,
+free it by using
+<xref linkend='XFree' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XListInstalledColormaps' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+</sect1>
+<sect1 id="Setting_and_Retrieving_the_Font_Search_Path">
+<title>Setting and Retrieving the Font Search Path</title>
+<!-- .XS -->
+<!-- (SN Setting and Retrieving the Font Search Path  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The set of fonts available from a server depends on a font
+search path.  Xlib provides functions to set and retrieve the
+search path for a server.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set the font search path, use
+<xref linkend='XSetFontPath' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetFontPath</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetFontPath'>
+<funcprototype>
+  <funcdef><function>XSetFontPath</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>char<parameter> **directories</parameter></paramdef>
+  <paramdef>int<parameter> ndirs</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>directories</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the directory path used to look for a font.
+Setting the path to the empty list restores the default path defined
+for the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ndirs</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of directories in the path.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetFontPath' xrefstyle='select: title'/>
+function defines the directory search path for font lookup.
+There is only one search path per X server, not one per client.
+The encoding and interpretation of the strings are implementation-dependent,
+but typically they specify directories or font servers to be searched 
+in the order listed.
+An X server is permitted to cache font information internally;
+for example, it might cache an entire font from a file and not
+check on subsequent opens of that font to see if the underlying
+font file has changed.
+However,
+when the font path is changed,
+the X server is guaranteed to flush all cached information about fonts 
+for which there currently are no explicit resource IDs allocated.
+The meaning of an error from this request is implementation-dependent.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetFontPath' xrefstyle='select: title'/>
+can generate a
+<errorname>BadValue</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To get the current font search path, use
+<xref linkend='XGetFontPath' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetFontPath</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetFontPath'>
+<funcprototype>
+  <funcdef>char **<function>XGetFontPath</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> *npaths_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>npaths_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the number of strings in the font path array.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetFontPath' xrefstyle='select: title'/>
+function allocates and returns an array of strings containing the search path.
+The contents of these strings are implementation-dependent
+and are not intended to be interpreted by client applications.
+When it is no longer needed,
+the data in the font path should be freed by using
+<xref linkend='XFreeFontPath' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To free data returned by
+<xref linkend='XGetFontPath' xrefstyle='select: title'/>,
+use
+<xref linkend='XFreeFontPath' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XFreeFontPath</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XFreeFontPath'>
+<funcprototype>
+  <funcdef><function>XFreeFontPath</function></funcdef>
+  <paramdef>char<parameter> **list</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>list</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the array of strings you want to free.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XFreeFontPath' xrefstyle='select: title'/>
+function
+frees the data allocated by
+<xref linkend='XGetFontPath' xrefstyle='select: title'/>.
+</para>
+</sect1>
+<sect1 id='Grabbing_the_Server'>
+<title>Grabbing the Server</title>
+<!-- .XS -->
+<!-- (SN Grabbing the Server  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to grab and ungrab the server.
+These functions can be used to control processing of output on other
+connections by the window system server.
+While the server is grabbed,
+no processing of requests or close downs on any other connection will occur.
+A client closing its connection automatically ungrabs the server.
+<indexterm><primary>Menus</primary></indexterm>
+<indexterm><primary>Window</primary><secondary>managers</secondary></indexterm>
+Although grabbing the server is highly discouraged, it is sometimes necessary.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To grab the server, use
+<xref linkend='XGrabServer' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Server</primary><secondary>grabbing</secondary></indexterm>
+<indexterm><primary>Grabbing</primary><secondary>server</secondary></indexterm>
+<indexterm significance="preferred"><primary>XGrabServer</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGrabServer'>
+<funcprototype>
+  <funcdef><function>XGrabServer</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGrabServer' xrefstyle='select: title'/>
+function disables processing of requests and close downs on all other 
+connections than the one this request arrived on.
+You should not grab the X server any more than is absolutely necessary.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To ungrab the server, use
+<xref linkend='XUngrabServer' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XUngrabServer</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XUngrabServer'>
+<funcprototype>
+  <funcdef><function>XUngrabServer</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XUngrabServer' xrefstyle='select: title'/>
+function restarts processing of requests and close downs on other connections.
+You should avoid grabbing the X server as much as possible.
+</para>
+</sect1>
+<sect1 id="Killing_Clients">
+<title>Killing Clients</title>
+<!-- .XS -->
+<!-- (SN Killing Clients  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides a function to cause the connection to
+a client to be closed and its resources to be destroyed.
+To destroy a client, use
+<xref linkend='XKillClient' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XKillClient</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XKillClient'>
+<funcprototype>
+  <funcdef><function>XKillClient</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XID<parameter> resource</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>resource</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies any resource associated with the client that you want to destroy or
+<symbol>AllTemporary</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XKillClient' xrefstyle='select: title'/>
+function
+forces a close down of the client
+that created the resource
+if a valid resource is specified.
+If the client has already terminated in
+either 
+<symbol>RetainPermanent</symbol>
+or 
+<symbol>RetainTemporary</symbol>
+mode, all of the client's
+resources are destroyed.
+If 
+<symbol>AllTemporary</symbol>
+is specified, the resources of all clients that have terminated in
+<symbol>RetainTemporary</symbol>
+are destroyed (see <link linkend="Closing_the_Display">section 2.5</link>).
+This permits implementation of window manager facilities that aid debugging.
+A client can set its close-down mode to
+<symbol>RetainTemporary</symbol>.
+If the client then crashes,
+its windows would not be destroyed. 
+The programmer can then inspect the application's window tree 
+and use the window manager to destroy the zombie windows.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XKillClient' xrefstyle='select: title'/>
+can generate a
+<errorname>BadValue</errorname>
+error.
+</para>
+</sect1>
+<sect1 id='Controlling_the_Screen_Saver'>
+<title>Controlling the Screen Saver</title>
+<!-- .XS -->
+<!-- (SN Controlling the Screen Saver  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to set or reset the mode 
+of the screen saver, to force or activate the screen saver,
+or to obtain the current screen saver values.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set the screen saver mode, use
+<xref linkend='XSetScreenSaver' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetScreenSaver</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetScreenSaver'>
+<funcprototype>
+  <funcdef><function>XSetScreenSaver</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>inttimeout,<parameter> interval</parameter></paramdef>
+  <paramdef>int<parameter> prefer_blanking</parameter></paramdef>
+  <paramdef>int<parameter> allow_exposures</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>timeout</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the timeout, in seconds, until the screen saver turns on.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>interval</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the interval, in seconds, between screen saver alterations.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>prefer_blanking</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies how to enable screen blanking.
+You can pass
+<symbol>DontPreferBlanking</symbol>,
+<symbol>PreferBlanking</symbol>,
+or
+<symbol>DefaultBlanking</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>allow_exposures</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the screen save control values.
+You can pass
+<symbol>DontAllowExposures</symbol>,
+<symbol>AllowExposures</symbol>,
+or
+<symbol>DefaultExposures</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+Timeout and interval are specified in seconds. 
+A timeout of 0 disables the screen saver 
+(but an activated screen saver is not deactivated),
+and a timeout of &minus;1 restores the default.
+Other negative values generate a
+<errorname>BadValue</errorname>
+error.
+If the timeout value is nonzero, 
+<xref linkend='XSetScreenSaver' xrefstyle='select: title'/>
+enables the screen saver.
+An interval of 0 disables the random-pattern motion.
+If no input from devices (keyboard, mouse, and so on) is generated 
+for the specified number of timeout seconds once the screen saver is enabled,
+the screen saver is activated.
+</para>
+<para>
+<!-- .LP -->
+For each screen, 
+if blanking is preferred and the hardware supports video blanking, 
+the screen simply goes blank.  
+Otherwise, if either exposures are allowed or the screen can be regenerated 
+without sending 
+<symbol>Expose</symbol>
+events to clients, 
+the screen is tiled with the root window background tile randomly 
+re-origined each interval seconds.
+Otherwise, the screens' state do not change, 
+and the screen saver is not activated.
+The screen saver is deactivated,
+and all screen states are restored at the next
+keyboard or pointer input or at the next call to
+<xref linkend='XForceScreenSaver' xrefstyle='select: title'/>
+with mode
+<symbol>ScreenSaverReset</symbol>.
+</para>
+<para>
+<!-- .LP -->
+If the server-dependent screen saver method supports periodic change,
+the interval argument serves as a hint about how long the change period
+should be, and zero hints that no periodic change should be made.
+Examples of ways to change the screen include scrambling the colormap
+periodically, moving an icon image around the screen periodically, or tiling
+the screen with the root window background tile, randomly re-origined
+periodically.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetScreenSaver' xrefstyle='select: title'/>
+can generate a
+<errorname>BadValue</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To force the screen saver on or off, use
+<xref linkend='XForceScreenSaver' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XForceScreenSaver</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XForceScreenSaver'>
+<funcprototype>
+  <funcdef><function>XForceScreenSaver</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> mode</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>mode</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the mode that is to be applied.
+You can pass
+<symbol>ScreenSaverActive</symbol>
+or
+<symbol>ScreenSaverReset</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+If the specified mode is 
+<symbol>ScreenSaverActive</symbol>
+and the screen saver currently is deactivated,
+<xref linkend='XForceScreenSaver' xrefstyle='select: title'/>
+activates the screen saver even if the screen saver had been disabled
+with a timeout of zero.
+If the specified mode is 
+<symbol>ScreenSaverReset</symbol>
+and the screen saver currently is enabled,
+<xref linkend='XForceScreenSaver' xrefstyle='select: title'/>
+deactivates the screen saver if it was activated,
+and the activation timer is reset to its initial state 
+(as if device input had been received).
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XForceScreenSaver' xrefstyle='select: title'/>
+can generate a
+<errorname>BadValue</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To activate the screen saver, use
+<xref linkend='XActivateScreenSaver' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XActivateScreenSaver</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XActivateScreenSaver'>
+<funcprototype>
+  <funcdef><function>XActivateScreenSaver</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<!-- .sp -->
+To reset the screen saver, use
+<xref linkend='XResetScreenSaver' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XResetScreenSaver</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XResetScreenSaver'>
+<funcprototype>
+  <funcdef><function>XResetScreenSaver</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<!-- .sp -->
+To get the current screen saver values, use
+<xref linkend='XGetScreenSaver' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetScreenSaver</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetScreenSaver'>
+<funcprototype>
+  <funcdef><function>XGetScreenSaver</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int*timeout_return,<parameter> *interval_return</parameter></paramdef>
+  <paramdef>int<parameter> *prefer_blanking_return</parameter></paramdef>
+  <paramdef>int<parameter> *allow_exposures_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>timeout_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the timeout, in seconds, until the screen saver turns on.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>interval_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the interval between screen saver invocations.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>prefer_blanking_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the current screen blanking preference
+(<symbol>DontPreferBlanking</symbol>,
+<symbol>PreferBlanking</symbol>,
+or
+<symbol>DefaultBlanking</symbol>).
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>allow_exposures_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the current screen save control value
+(<symbol>DontAllowExposures</symbol>,
+<symbol>AllowExposures</symbol>,
+or
+<symbol>DefaultExposures</symbol>).
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+</para>
+</sect1>
+<sect1 id="Controlling_Host_Access">
+<title>Controlling Host Access</title>
+<!-- .XS -->
+<!-- (SN Controlling Host Access  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+This section discusses how to:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+Add, get, or remove hosts from the access control list
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Change, enable, or disable access
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+<indexterm><primary>Access control list</primary></indexterm>
+<indexterm><primary>Authentication</primary></indexterm>
+X does not provide any protection on a per-window basis.
+If you find out the resource ID of a resource, you can manipulate it.
+To provide some minimal level of protection, however,
+connections are permitted only from machines you trust.
+This is adequate on single-user workstations but obviously
+breaks down on timesharing machines.
+Although provisions exist in the X protocol for proper connection
+authentication, the lack of a standard authentication server
+leaves host-level access control as the only common mechanism.
+</para>
+<para>
+<!-- .LP -->
+<indexterm><primary>Default Protection</primary></indexterm>
+The initial set of hosts allowed to open connections typically consists of:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+The host the window system is running on.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+On <acronym>POSIX</acronym>-conformant systems, each host listed in the
+<filename>/etc/X<replaceable>?</replaceable>.hosts</filename>
+file.
+The ? indicates the number of the
+display.
+<indexterm><primary>Files</primary><secondary><filename>/etc/X<replaceable>?</replaceable>.hosts</filename></secondary></indexterm>
+This file should consist of host names separated by newlines.
+DECnet nodes must terminate in :: to distinguish them from Internet hosts.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+If a host is not in the access control list when the access control 
+mechanism is enabled and if the host attempts to establish a connection,
+the server refuses the connection.
+To change the access list,
+the client must reside on the same host as the server and/or must
+have been granted permission in the initial authorization at connection
+setup.
+</para>
+<para>
+<!-- .LP -->
+Servers also can implement other access control policies in addition to
+or in place of this host access facility.
+For further information about other access control implementations,
+see <olink targetdoc='x11protocol' targetptr='Connection_Setup'
+><citetitle>X Window System Protocol</citetitle></olink>.
+</para>
+<sect2 id="Adding_Getting_or_Removing_Hosts">
+<title>Adding, Getting, or Removing Hosts</title>
+<!-- .XS -->
+<!-- (SN Adding, Getting, or Removing Hosts  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to add, get, or remove hosts
+from the access control list.
+All the host access control functions use the 
+<structname>XHostAddress</structname>
+structure, which contains:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XHostAddress</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     int family;        /* for example FamilyInternet */
+     int length;        /* length of address, in bytes */
+     char *address;     /* pointer to where to find the address */
+} XHostAddress;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The family member specifies which protocol address family to use 
+(for example, <acronym>TCP</acronym>/<acronym>IP</acronym> or DECnet) and can be
+<symbol>FamilyInternet</symbol>,
+<symbol>FamilyInternet6</symbol>,
+<symbol>FamilyServerInterpreted</symbol>,
+<symbol>FamilyDECnet</symbol>,
+or
+<symbol>FamilyChaos</symbol>.
+The length member specifies the length of the address in bytes.
+The address member specifies a pointer to the address.
+</para>
+<para>
+<!-- .LP -->
+For <acronym>TCP</acronym>/<acronym>IP</acronym>, the address should be in network byte order.
+For <acronym>IP</acronym> version 4 addresses, the family should be FamilyInternet
+and the length should be 4 bytes.  For <acronym>IP</acronym> version 6 addresses, the
+family should be FamilyInternet6 and the length should be 16 bytes.
+</para>
+<para>
+<!-- .LP -->
+For the DECnet family, 
+the server performs no automatic swapping on the address bytes.
+A Phase IV address is 2 bytes long.
+The first byte contains the least significant 8 bits of the node number.
+The second byte contains the most significant 2 bits of the
+node number in the least significant 2 bits of the byte
+and the area in the most significant 6 bits of the byte.
+</para>
+<para>
+<!-- .LP -->
+For the ServerInterpreted family, the length is ignored and the address 
+member is a pointer to a 
+<structname>XServerInterpretedAddress</structname>
+structure, which contains:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XServerInterpretedAddress</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     int typelength;     /* length of type string, in bytes */
+     int valuelength;    /* length of value string, in bytes */
+     char *type;         /* pointer to where to find the type string */
+     char *value;        /* pointer to where to find the address */
+} XServerInterpretedAddress;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The type and value members point to strings representing the type and value of
+the server interpreted entry.  These strings may not be NULL-terminated so care
+should be used when accessing them.  The typelength and valuelength members
+specify the length in byte of the type and value strings.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To add a single host, use
+<xref linkend='XAddHost' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XAddHost</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XAddHost'>
+<funcprototype>
+  <funcdef><function>XAddHost</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XHostAddress<parameter> *host</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Ho added -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>host</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the host that is to be (Ho.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XAddHost' xrefstyle='select: title'/>
+function adds the specified host to the access control list for that display.
+The server must be on the same host as the client issuing the command, or a
+<errorname>BadAccess</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XAddHost' xrefstyle='select: title'/>
+can generate
+<errorname>BadAccess</errorname>
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To add multiple hosts at one time, use
+<xref linkend='XAddHosts' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XAddHosts</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XAddHosts'>
+<funcprototype>
+  <funcdef><function>XAddHosts</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XHostAddress<parameter> *hosts</parameter></paramdef>
+  <paramdef>int<parameter> num_hosts</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Ho added -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>hosts</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies each host that is to be (Ho.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>num_hosts</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of hosts.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XAddHosts' xrefstyle='select: title'/>
+function adds each specified host to the access control list for that display.
+The server must be on the same host as the client issuing the command, or a
+<errorname>BadAccess</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XAddHosts' xrefstyle='select: title'/>
+can generate
+<errorname>BadAccess</errorname>
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain a host list, use
+<xref linkend='XListHosts' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XListHosts</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XListHosts'>
+<funcprototype>
+  <funcdef>XHostAddress *<function>XListHosts</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> *nhosts_return</parameter></paramdef>
+  <paramdef>Bool<parameter> *state_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nhosts_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the number of hosts currently in the access control list.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>state_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the state of the access control.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XListHosts' xrefstyle='select: title'/>
+function returns the current access control list as well as whether the use 
+of the list at connection setup was enabled or disabled.
+<xref linkend='XListHosts' xrefstyle='select: title'/>
+allows a program to find out what machines can make connections.
+It also returns a pointer to a list of host structures that
+were allocated by the function. 
+When no longer needed,
+this memory should be freed by calling
+<xref linkend='XFree' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To remove a single host, use
+<xref linkend='XRemoveHost' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XRemoveHost</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XRemoveHost'>
+<funcprototype>
+  <funcdef><function>XRemoveHost</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XHostAddress<parameter> *host</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Ho removed -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>host</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the host that is to be (Ho.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XRemoveHost' xrefstyle='select: title'/>
+function removes the specified host from the access control list 
+for that display.
+The server must be on the same host as the client process, or a
+<errorname>BadAccess</errorname>
+error results.
+If you remove your machine from the access list,
+you can no longer connect to that server,
+and this operation cannot be reversed unless you reset the server.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XRemoveHost' xrefstyle='select: title'/>
+can generate
+<errorname>BadAccess</errorname>
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To remove multiple hosts at one time, use
+<xref linkend='XRemoveHosts' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XRemoveHosts</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XRemoveHosts'>
+<funcprototype>
+  <funcdef><function>XRemoveHosts</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XHostAddress<parameter> *hosts</parameter></paramdef>
+  <paramdef>int<parameter> num_hosts</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Ho removed -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>hosts</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies each host that is to be (Ho.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>num_hosts</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of hosts.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XRemoveHosts' xrefstyle='select: title'/>
+function removes each specified host from the access control list for that 
+display.  
+The X server must be on the same host as the client process, or a
+<errorname>BadAccess</errorname>
+error results.
+If you remove your machine from the access list, 
+you can no longer connect to that server,
+and this operation cannot be reversed unless you reset the server.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XRemoveHosts' xrefstyle='select: title'/>
+can generate
+<errorname>BadAccess</errorname>
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+</sect2>
+<sect2 id="Changing_Enabling_or_Disabling_Access_Control">
+<title>Changing, Enabling, or Disabling Access Control</title>
+<!-- .XS -->
+<!-- (SN Changing, Enabling, or Disabling Access Control  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to enable, disable, 
+or change access control.
+</para>
+<para>
+<!-- .LP -->
+For these functions to execute successfully,
+the client application must reside on the same host as the X server
+and/or have been given permission in the initial authorization
+at connection setup.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To change access control, use
+<xref linkend='XSetAccessControl' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetAccessControl</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetAccessControl'>
+<funcprototype>
+  <funcdef><function>XSetAccessControl</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> mode</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>mode</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the mode.
+You can pass
+<symbol>EnableAccess</symbol>
+or
+<symbol>DisableAccess</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetAccessControl' xrefstyle='select: title'/>
+function either enables or disables the use of the access control list 
+at each connection setup.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetAccessControl' xrefstyle='select: title'/>
+can generate
+<errorname>BadAccess</errorname>
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To enable access control, use
+<xref linkend='XEnableAccessControl' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XEnableAccessControl</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XEnableAccessControl'>
+<funcprototype>
+  <funcdef><function>XEnableAccessControl</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XEnableAccessControl' xrefstyle='select: title'/>
+function enables the use of the access control list at each connection setup.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XEnableAccessControl' xrefstyle='select: title'/>
+can generate a
+<errorname>BadAccess</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To disable access control, use
+<xref linkend='XDisableAccessControl' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDisableAccessControl</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDisableAccessControl'>
+<funcprototype>
+  <funcdef><function>XDisableAccessControl</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XDisableAccessControl' xrefstyle='select: title'/>
+function disables the use of the access control list at each connection setup.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XDisableAccessControl' xrefstyle='select: title'/>
+can generate a
+<errorname>BadAccess</errorname>
+error.
+<!-- .bp -->
+
+</para>
+</sect2>
+</sect1>
+</chapter>
diff --git a/specs/libX11/CH10.xml b/specs/libX11/CH10.xml
new file mode 100644 (file)
index 0000000..9c12ef7
--- /dev/null
@@ -0,0 +1,4721 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+         "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
+<chapter id='Events'>
+<title>Events</title>
+
+<para>
+A client application communicates with the X server through the connection you establish with
+the XOpenDisplay function. A client application sends requests to the X server over this
+connection. These requests are made by the Xlib functions that are called in the client application.
+Many Xlib functions cause the X server to generate events, and the user’s typing or moving the
+pointer can generate events asynchronously. The X server returns events to the client on the same
+connection.
+</para>
+<para>
+This chapter discusses the following topics associated with events:
+</para>
+
+<itemizedlist>
+  <listitem><para>Event types</para></listitem>
+  <listitem><para>Event structures</para></listitem>
+  <listitem><para>Event masks</para></listitem>
+  <listitem><para>Event processing</para></listitem>
+</itemizedlist>
+
+<para>
+Functions for handling events are dealt with in
+<link linkend='Event_Handling_Functions'>the next chapter</link>.
+</para>
+
+<sect1 id="Event_Types">
+<title>Event Types</title>
+<!-- .XS -->
+<!-- (SN Event Types  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Event</primary><secondary>types</secondary></indexterm>
+An event is data generated asynchronously by the X server as a result of some 
+device activity or as side effects of a request sent by an Xlib function.
+<indexterm><primary>Event</primary></indexterm>
+Device-related events propagate from the source window to ancestor windows
+until some client application has selected that event type 
+or until the event is explicitly discarded.
+The X server generally sends an event to a client application
+only if the client has specifically asked to be informed of that event type, 
+typically by setting the event-mask attribute of the window.
+The mask can also be set when you create a window
+or by changing the window's
+event-mask.
+You can also mask out events that would propagate to ancestor windows
+by manipulating the
+do-not-propagate mask of the window's attributes.
+However,
+<symbol>MappingNotify</symbol>
+events are always sent to all clients.
+<indexterm><primary>Input Control</primary></indexterm>
+<indexterm><primary>Output Control</primary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+An event type describes a specific event generated by the X server.
+For each event type, 
+a corresponding constant name is defined in
+<filename class="headerfile">&lt;X11/X.h&gt;</filename>,
+<indexterm type="file"><primary><filename class="headerfile">X11/X.h</filename></primary></indexterm>
+<indexterm><primary>Files</primary><secondary><filename class="headerfile">&lt;X11/X.h&gt;</filename></secondary></indexterm>
+<indexterm><primary>Headers</primary><secondary><filename class="headerfile">&lt;X11/X.h&gt;</filename></secondary></indexterm>
+which is used when referring to an event type.
+<indexterm><primary>Event</primary><secondary>categories</secondary></indexterm>
+The following table lists the event category 
+and its associated event type or types. 
+The processing associated with these events is discussed in section 10.5.
+</para>
+<para>
+<!-- .LP -->
+<!-- .\".CP T 1 -->
+<!-- .\"Event Categories and Event Types -->
+</para>
+<para>
+<!-- .LP -->
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='4.0*'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Event Category</entry>
+      <entry>Event Type</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>Keyboard events</entry>
+      <entry><symbol>KeyPress</symbol>,
+      <symbol>KeyRelease</symbol></entry>
+    </row>
+    <row>
+      <entry>Pointer events</entry>
+      <entry><symbol>ButtonPress</symbol>,
+      <symbol>ButtonRelease</symbol>,
+      <symbol>MotionNotify</symbol></entry>
+    </row>
+    <row>
+      <entry>Window crossing events</entry>
+      <entry><symbol>EnterNotify</symbol>,
+      <symbol>LeaveNotify</symbol></entry>
+    </row>
+    <row>
+      <entry>Input focus events</entry>
+      <entry><symbol>FocusIn</symbol>,
+      <symbol>FocusOut</symbol></entry>
+    </row>
+    <row>
+      <entry>Keymap state notification event</entry>
+      <entry><symbol>KeymapNotify</symbol></entry>
+    </row>
+    <row>
+      <entry>Exposure events</entry>
+      <entry><symbol>Expose</symbol>,
+      <symbol>GraphicsExpose</symbol>,
+      <symbol>NoExpose</symbol></entry>
+    </row>
+    <row>
+      <entry>Structure control events</entry>
+      <entry><symbol>CirculateRequest</symbol>,
+      <symbol>ConfigureRequest</symbol>,
+      <symbol>MapRequest</symbol>,
+      <symbol>ResizeRequest</symbol></entry>
+    </row>
+    <row>
+      <entry>Window state notification events</entry>
+      <entry>
+      <symbol>CirculateNotify</symbol>,
+      <symbol>ConfigureNotify</symbol>,
+      <symbol>CreateNotify</symbol>,
+      <symbol>DestroyNotify</symbol>,
+      <symbol>GravityNotify</symbol>,
+      <symbol>MapNotify</symbol>,
+      <symbol>MappingNotify</symbol>,
+      <symbol>ReparentNotify</symbol>,
+      <symbol>UnmapNotify</symbol>,
+      <symbol>VisibilityNotify</symbol></entry>
+    </row>
+    <row>
+      <entry>Colormap state notification event</entry>
+      <entry><symbol>ColormapNotify</symbol></entry>
+    </row>
+    <row>
+      <entry>Client communication events</entry>
+      <entry><symbol>ClientMessage</symbol>,
+      <symbol>PropertyNotify</symbol>,
+      <symbol>SelectionClear</symbol>,
+      <symbol>SelectionNotify</symbol>,
+      <symbol>SelectionRequest</symbol></entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<!-- .\".LP -->
+<!-- .\"Table 8-1 lists the event types and the Xlib functions that could cause -->
+<!-- .\"the X server to generate that event type. -->
+<!-- .\"The event types are listed alphabetically. -->
+<!-- .\"Note that the error event is not listed in this table. -->
+<!-- .\"For a list of the constants associated with an error event, see the Handling -->
+<!-- .\"Errors section in this chapter. -->
+<!-- .\".LP -->
+<!-- .\".so eventtable -->
+</para>
+</sect1>
+<sect1 id="Event_Structures">
+<title>Event Structures</title>
+<!-- .XS -->
+<!-- (SN Event Structures  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+For each event type,
+a corresponding structure is declared in
+<filename class="headerfile">&lt;X11/Xlib.h&gt;</filename>.
+<indexterm type="file"><primary><filename class="headerfile">X11/Xlib.h</filename></primary></indexterm>
+<indexterm><primary>Files</primary><secondary><filename class="headerfile">&lt;X11/Xlib.h&gt;</filename></secondary></indexterm>
+<indexterm><primary>Headers</primary><secondary><filename class="headerfile">&lt;X11/Xlib.h&gt;</filename></secondary></indexterm>
+All the event structures have the following common members:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XAnyEvent</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     int           type;
+     unsigned long serial;     /* # of last request processed by server */
+     Bool          send_event; /* true if this came from a SendEvent request */
+     Display       *display;   /* Display the event was read from */
+     Window        window;
+} XAnyEvent;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The type member is set to the event type constant name that uniquely identifies
+it.
+For example, when the X server reports a
+<symbol>GraphicsExpose</symbol>
+event to a client application, it sends an
+<structname>XGraphicsExposeEvent</structname>
+structure with the type member set to
+<symbol>GraphicsExpose</symbol>.
+The display member is set to a pointer to the display the event was read on.
+The send_event member is set to
+<symbol>True</symbol>
+if the event came from a
+<systemitem>SendEvent</systemitem>
+protocol request.
+The serial member is set from the serial number reported in the protocol
+but expanded from the 16-bit least-significant bits to a full 32-bit value.
+The window member is set to the window that is most useful to toolkit
+dispatchers.
+</para>
+<para>
+<!-- .LP -->
+The X server can send events at any time in the input stream. 
+Xlib stores any events received while waiting for a reply in an event queue 
+for later use.
+Xlib also provides functions that allow you to check events in the event queue
+(see <link linkend="Event_Queue_Management">section 11.3</link>).
+</para>
+<para>
+<!-- .LP -->
+In addition to the individual structures declared for each event type, the
+<structname>XEvent</structname>
+structure is a union of the individual structures declared for each event type.
+Depending on the type,
+you should access members of each event by using the 
+<structname>XEvent</structname>
+union.
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XEvent</primary></indexterm>
+<!-- .sM -->
+</para>
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef union _XEvent {
+     int                            type;          /* must not be changed */
+     XAnyEvent                      xany;
+     XKeyEvent                      xkey;
+     XButtonEvent                   xbutton;
+     XMotionEvent                   xmotion;
+     XCrossingEvent                 xcrossing;
+     XFocusChangeEvent              xfocus;
+     XExposeEvent                   xexpose;
+     XGraphicsExposeEvent           xgraphicsexpose;
+     XNoExposeEvent                 xnoexpose;
+     XVisibilityEvent               xvisibility;
+     XCreateWindowEvent             xcreatewindow;
+     XDestroyWindowEvent            xdestroywindow;
+     XUnmapEvent                    xunmap;
+     XMapEvent                      xmap;
+     XMapRequestEvent               xmaprequest;
+     XReparentEvent                 xreparent;
+     XConfigureEvent                xconfigure;
+     XGravityEvent                  xgravity;
+     XResizeRequestEvent            xresizerequest;
+     XConfigureRequestEvent         xconfigurerequest;
+     XCirculateEvent                xcirculate;
+     XCirculateRequestEvent         xcirculaterequest;
+     XPropertyEvent                 xproperty;
+     XSelectionClearEvent           xselectionclear;
+     XSelectionRequestEvent         xselectionrequest;
+     XSelectionEvent                xselection;
+     XColormapEvent                 xcolormap;
+     XClientMessageEvent            xclient;
+     XMappingEvent                  xmapping;
+     XErrorEvent                    xerror;
+     XKeymapEvent                   xkeymap;
+     long                           pad[24];
+} XEvent;
+</literallayout>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+An
+<structname>XEvent</structname>
+structure's first entry always is the type member,
+which is set to the event type.
+The second member always is the serial number of the protocol request
+that generated the event.
+The third member always is send_event,
+which is a
+<type>Bool</type>
+that indicates if the event was sent by a different client.
+The fourth member always is a display,
+which is the display that the event was read from.
+Except for keymap events,
+the fifth member always is a window,
+which has been carefully selected to be useful to toolkit dispatchers.
+To avoid breaking toolkits,
+the order of these first five entries is not to change.
+Most events also contain a time member,
+which is the time at which an event occurred.
+In addition, a pointer to the generic event must be cast before it
+is used to access any other information in the structure.
+</para>
+</sect1>
+<sect1 id="Event_Masks">
+<title>Event Masks</title>
+<!-- .XS -->
+<!-- (SN Event Masks -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>Event mask</primary></indexterm>
+Clients select event reporting of most events relative to a window.
+To do this, pass an event mask to an Xlib event-handling
+function that takes an event_mask argument.
+The bits of the event mask are defined in
+<filename class="headerfile">&lt;X11/X.h&gt;</filename>.
+<indexterm type="file"><primary><filename class="headerfile">X11/X.h</filename></primary></indexterm>
+<indexterm><primary>Files</primary><secondary><filename class="headerfile">&lt;X11/X.h&gt;</filename></secondary></indexterm>
+<indexterm><primary>Headers</primary><secondary><filename class="headerfile">&lt;X11/X.h&gt;</filename></secondary></indexterm>
+Each bit in the event mask maps to an event mask name,
+which describes the event or events you want the X server to
+return to a client application.
+</para>
+<para>
+<!-- .LP -->
+Unless the client has specifically asked for them,
+most events are not reported to clients when they are generated. 
+Unless the client suppresses them by setting graphics-exposures in the GC to
+<symbol>False</symbol>,
+<symbol>GraphicsExpose</symbol>
+and 
+<symbol>NoExpose</symbol>
+are reported by default as a result of
+<xref linkend='XCopyPlane' xrefstyle='select: title'/>
+and
+<xref linkend='XCopyArea' xrefstyle='select: title'/>.
+<symbol>SelectionClear</symbol>,
+<symbol>SelectionRequest</symbol>,
+<symbol>SelectionNotify</symbol>,
+or
+<symbol>ClientMessage</symbol>
+cannot be masked.
+Selection-related events are only sent to clients cooperating
+with selections
+(see <link linkend="Obtaining_and_Changing_Window_Properties">section 4.5</link>).
+When the keyboard or pointer mapping is changed,
+<symbol>MappingNotify</symbol>
+is always sent to clients.
+</para>
+<para>
+<!-- .LP -->
+<!-- .\"Table 8-2  -->
+The following table 
+lists the event mask constants you can pass to
+the event_mask argument and
+the circumstances in which you would want to specify the
+event mask:
+</para>
+<!-- .LP -->
+<!-- .\" .CP T 2 -->
+<!-- .\"Event Mask Definitions -->
+<informaltable frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='2.5*'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Event Mask</entry>
+      <entry>Circumstances</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry><symbol>NoEventMask</symbol></entry>
+      <entry>No events wanted</entry>
+    </row>
+    <row>
+      <entry><symbol>KeyPressMask</symbol></entry>
+      <entry>Keyboard down events wanted</entry>
+    </row>
+    <row>
+      <entry><symbol>KeyReleaseMask</symbol></entry>
+      <entry>Keyboard up events wanted</entry>
+    </row>
+    <row>
+      <entry><symbol>ButtonPressMask</symbol></entry>
+      <entry>Pointer button down events wanted</entry>
+    </row>
+    <row>
+      <entry><symbol>ButtonReleaseMask</symbol></entry>
+      <entry>Pointer button up events wanted</entry>
+    </row>
+    <row>
+      <entry><symbol>EnterWindowMask</symbol></entry>
+      <entry>Pointer window entry events wanted</entry>
+    </row>
+    <row>
+      <entry><symbol>LeaveWindowMask</symbol></entry>
+      <entry>Pointer window leave events wanted</entry>
+    </row>
+    <row>
+      <entry><symbol>PointerMotionMask</symbol></entry>
+      <entry>Pointer motion events wanted</entry>
+    </row>
+    <row>
+      <entry><symbol>PointerMotionHintMask</symbol></entry>
+      <entry>Pointer motion hints wanted</entry>
+    </row>
+    <row>
+      <entry><symbol>Button1MotionMask</symbol></entry>
+      <entry>Pointer motion while button 1 down</entry>
+    </row>
+    <row>
+      <entry><symbol>Button2MotionMask</symbol></entry>
+      <entry>Pointer motion while button 2 down</entry>
+    </row>
+    <row>
+      <entry><symbol>Button3MotionMask</symbol></entry>
+      <entry>Pointer motion while button 3 down</entry>
+    </row>
+    <row>
+      <entry><symbol>Button4MotionMask</symbol></entry>
+      <entry>Pointer motion while button 4 down</entry>
+    </row>
+    <row>
+      <entry><symbol>Button5MotionMask</symbol></entry>
+      <entry>Pointer motion while button 5 down</entry>
+    </row>
+    <row>
+      <entry><symbol>ButtonMotionMask</symbol></entry>
+      <entry>Pointer motion while any button down</entry>
+    </row>
+    <row>
+      <entry><symbol>KeymapStateMask</symbol></entry>
+      <entry>Keyboard state wanted at window entry and focus in</entry>
+    </row>
+    <row>
+      <entry><symbol>ExposureMask</symbol></entry>
+      <entry>Any exposure wanted</entry>
+    </row>
+    <row>
+      <entry><symbol>VisibilityChangeMask</symbol></entry>
+      <entry>Any change in visibility wanted</entry>
+    </row>
+    <row>
+      <entry><symbol>StructureNotifyMask</symbol></entry>
+      <entry>Any change in window structure wanted</entry>
+    </row>
+    <row>
+      <entry><symbol>ResizeRedirectMask</symbol></entry>
+      <entry>Redirect resize of this window</entry>
+    </row>
+    <row>
+      <entry><symbol>SubstructureNotifyMask</symbol></entry>
+      <entry>Substructure notification wanted</entry>
+    </row>
+    <row>
+      <entry><symbol>SubstructureRedirectMask</symbol></entry>
+      <entry>Redirect structure requests on children</entry>
+    </row>
+    <row>
+      <entry><symbol>FocusChangeMask</symbol></entry>
+      <entry>Any change in input focus wanted</entry>
+    </row>
+    <row>
+      <entry><symbol>PropertyChangeMask</symbol></entry>
+      <entry>Any change in property wanted</entry>
+    </row>
+    <row>
+      <entry><symbol>ColormapChangeMask</symbol></entry>
+      <entry>Any change in colormap wanted</entry>
+    </row>
+    <row>
+      <entry><symbol>OwnerGrabButtonMask</symbol></entry>
+      <entry>Automatic grabs should activate with owner_events set to True</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+<!-- .LP -->
+</para>
+</sect1>
+<sect1 id="Event_Processing_Overview">
+<title>Event Processing Overview</title>
+<!-- .XS -->
+<!-- (SN Event Processing Overview -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The event reported to a client application during event processing
+depends on which event masks you provide as the event-mask attribute 
+for a window.
+For some event masks, there is a one-to-one correspondence between
+the event mask constant and the event type constant.
+For example, if you pass the event mask
+<symbol>ButtonPressMask</symbol>,
+the X server sends back only
+<symbol>ButtonPress</symbol>
+events.
+<indexterm><primary>CurrentTime</primary></indexterm>
+Most events contain a time member,
+which is the time at which an event occurred.
+</para>
+<para>
+<!-- .LP -->
+In other cases, one event mask constant can map to several event type constants.
+For example, if you pass the event mask
+<symbol>SubstructureNotifyMask</symbol>,
+the X server can send back
+<symbol>CirculateNotify</symbol>,
+<symbol>ConfigureNotify</symbol>,
+<symbol>CreateNotify</symbol>,
+<symbol>DestroyNotify</symbol>,
+<symbol>GravityNotify</symbol>,
+<symbol>MapNotify</symbol>,
+<symbol>ReparentNotify</symbol>,
+or
+<symbol>UnmapNotify</symbol>
+events.
+</para>
+<para>
+<!-- .LP -->
+In another case, 
+two event masks can map to one event type.
+For example, 
+if you pass either
+<symbol>PointerMotionMask</symbol>
+or
+<symbol>ButtonMotionMask</symbol>,
+the X server sends back
+a
+<symbol>MotionNotify</symbol>
+event.
+</para>
+<para>
+<!-- .LP -->
+The following table 
+lists the event mask, 
+its associated event type or types, 
+and the structure name associated with the event type.
+Some of these structures actually are typedefs to a generic structure
+that is shared between two event types.
+Note that N.A. appears in columns for which the information is not applicable.
+</para>
+<!-- .LP -->
+<!-- .ps 9 -->
+<!-- .nr PS 9 -->
+<informaltable frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='4' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.2*'/>
+  <colspec colname='c2' colwidth='1.0*'/>
+  <colspec colname='c3' colwidth='1.2*'/>
+  <colspec colname='c4' colwidth='1.0*'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Event Mask</entry>
+      <entry>Event Type</entry>
+      <entry>Structure</entry>
+      <entry>Generic Structure</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>
+      <para>ButtonMotionMask</para>
+      <para>Button1MotionMask</para>
+      <para>Button2MotionMask</para>
+      <para>Button3MotionMask</para>
+      <para>Button4MotionMask</para>
+      <para>Button5MotionMask</para>
+      </entry>
+      <entry>MotionNotify</entry>
+      <entry>XPointerMovedEvent</entry>
+      <entry>XMotionEvent</entry>
+    </row>
+    <row>
+      <entry>ButtonPressMask</entry>
+      <entry>ButtonPress</entry>
+      <entry>XButtonPressedEvent</entry>
+      <entry>XButtonEvent</entry>
+    </row>
+    <row>
+      <entry>ButtonReleaseMask</entry>
+      <entry>ButtonRelease</entry>
+      <entry>XButtonReleasedEvent</entry>
+      <entry>XButtonEvent</entry>
+    </row>
+    <row>
+      <entry>ColormapChangeMask</entry>
+      <entry>ColormapNotify</entry>
+      <entry>XColormapEvent</entry>
+    </row>
+    <row>
+      <entry>EnterWindowMask</entry>
+      <entry>EnterNotify</entry>
+      <entry>XEnterWindowEvent</entry>
+      <entry>XCrossingEvent</entry>
+    </row>
+    <row>
+      <entry>LeaveWindowMask</entry>
+      <entry>LeaveNotify</entry>
+      <entry>XLeaveWindowEvent</entry>
+      <entry>XCrossingEvent</entry>
+    </row>
+    <row>
+      <entry>ExposureMask</entry>
+      <entry>Expose</entry>
+      <entry>XExposeEvent </entry>
+    </row>
+    <row>
+      <entry morerows='1'>GCGraphicsExposures in GC</entry>
+      <entry>GraphicsExpose</entry>
+      <entry>XGraphicsExposeEvent</entry>
+    </row>
+    <row>
+      <entry>NoExpose</entry>
+      <entry>XNoExposeEvent</entry>
+    </row>
+    <row>
+      <entry morerows='1'>FocusChangeMask</entry>
+      <entry>FocusIn</entry>
+      <entry>XFocusInEvent</entry>
+      <entry>XFocusChangeEvent</entry>
+    </row>
+    <row>
+      <entry>FocusOut</entry>
+      <entry>XFocusOutEvent</entry>
+      <entry>XFocusChangeEvent</entry>
+    </row>
+    <row>
+      <entry>KeymapStateMask</entry>
+      <entry>KeymapNotify</entry>
+      <entry>XKeymapEvent</entry>
+    </row>
+    <row>
+      <entry>KeyPressMask</entry>
+      <entry>KeyPress</entry>
+      <entry>XKeyPressedEvent</entry>
+      <entry>XKeyEvent</entry>
+    </row>
+    <row>
+      <entry>KeyReleaseMask</entry>
+      <entry>KeyRelease</entry>
+      <entry>XKeyReleasedEvent</entry>
+      <entry>XKeyEvent</entry>
+    </row>
+    <row>
+      <entry>OwnerGrabButtonMask</entry>
+      <entry>N.A.</entry>
+      <entry>N.A.</entry>
+    </row>
+    <row>
+      <entry>PointerMotionMask</entry>
+      <entry>MotionNotify</entry>
+      <entry>XPointerMovedEvent</entry>
+      <entry>XMotionEvent</entry>
+    </row>
+    <row>
+      <entry>PointerMotionHintMask</entry>
+      <entry>N.A.</entry>
+      <entry>N.A.</entry>
+    </row>
+    <row>
+      <entry>PropertyChangeMask</entry>
+      <entry>PropertyNotify</entry>
+      <entry>XPropertyEvent</entry>
+    </row>
+    <row>
+      <entry>ResizeRedirectMask</entry>
+      <entry>ResizeRequest</entry>
+      <entry>XResizeRequestEvent</entry>
+    </row>
+    <row>
+      <entry morerows='6'>StructureNotifyMask</entry>
+      <entry>CirculateNotify</entry>
+      <entry>XCirculateEvent</entry>
+    </row>
+    <row>
+      <entry>ConfigureNotify</entry>
+      <entry>XConfigureEvent</entry>
+    </row>
+    <row>
+      <entry>DestroyNotify</entry>
+      <entry>XDestroyWindowEvent</entry>
+    </row>
+    <row>
+      <entry>GravityNotify</entry>
+      <entry>XGravityEvent</entry>
+    </row>
+    <row>
+      <entry>MapNotify</entry>
+      <entry>XMapEvent</entry>
+    </row>
+    <row>
+      <entry>ReparentNotify</entry>
+      <entry>XReparentEvent</entry>
+    </row>
+    <row>
+      <entry>UnmapNotify</entry>
+      <entry>XUnmapEvent</entry>
+    </row>
+    <row>
+      <entry morerows='7'>SubstructureNotifyMask</entry>
+      <entry>CirculateNotify</entry>
+      <entry>XCirculateEvent</entry>
+    </row>
+    <row>
+      <entry>ConfigureNotify</entry>
+      <entry>XConfigureEvent</entry>
+    </row>
+    <row>
+      <entry>CreateNotify</entry>
+      <entry>XCreateWindowEvent</entry>
+    </row>
+    <row>
+      <entry>DestroyNotify</entry>
+      <entry>XDestroyWindowEvent</entry>
+    </row>
+    <row>
+      <entry>GravityNotify</entry>
+      <entry>XGravityEvent</entry>
+    </row>
+    <row>
+      <entry>MapNotify</entry>
+      <entry>XMapEvent</entry>
+    </row>
+    <row>
+      <entry>ReparentNotify</entry>
+      <entry>XReparentEvent</entry>
+    </row>
+    <row>
+      <entry>UnmapNotify</entry>
+      <entry>XUnmapEvent</entry>
+    </row>
+    <row>
+      <entry morerows='2'>SubstructureRedirectMask</entry>
+      <entry>CirculateRequest</entry>
+      <entry>XCirculateRequestEvent</entry>
+    </row>
+    <row>
+      <entry>ConfigureRequest</entry>
+      <entry>XConfigureRequestEvent</entry>
+    </row>
+    <row>
+      <entry>MapRequest</entry>
+      <entry>XMapRequestEvent</entry>
+    </row>
+    <row>
+      <entry>N.A.</entry>
+      <entry>ClientMessage</entry>
+      <entry>XClientMessageEvent</entry>
+    </row>
+    <row>
+      <entry>N.A.</entry>
+      <entry>MappingNotify</entry>
+      <entry>XMappingEvent</entry>
+    </row>
+    <row>
+      <entry>N.A.</entry>
+      <entry>SelectionClear</entry>
+      <entry>XSelectionClearEvent</entry>
+    </row>
+    <row>
+      <entry>N.A.</entry>
+      <entry>SelectionNotify</entry>
+      <entry>XSelectionEvent</entry>
+    </row>
+    <row>
+      <entry>N.A.</entry>
+      <entry>SelectionRequest</entry>
+      <entry>XSelectionRequestEvent</entry>
+    </row>
+    <row>
+      <entry>VisibilityChangeMask</entry>
+      <entry>VisibilityNotify</entry>
+      <entry>XVisibilityEvent</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+<!-- .LP -->
+The sections that follow describe the processing that occurs 
+when you select the different event masks.
+The sections are organized according to these processing categories:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+Keyboard and pointer events
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Window crossing events
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Input focus events
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Keymap state notification events
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Exposure events
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Window state notification events
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Structure control events
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Colormap state notification events
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Client communication events
+    </para>
+  </listitem>
+</itemizedlist>
+
+</sect1>
+
+<sect1 id="Keyboard_and_Pointer_Events">
+<title>Keyboard and Pointer Events</title>
+<!-- .XS -->
+<!-- (SN Keyboard and Pointer Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+This section discusses:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+Pointer button events
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Keyboard and pointer events
+    </para>
+  </listitem>
+</itemizedlist>
+<sect2 id="Pointer_Button_Events">
+<title>Pointer Button Events</title>
+<!-- .XS -->
+<!-- (SN Pointer Button Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The following describes the event processing that occurs when a pointer button 
+press is processed with the pointer in some window w and 
+when no active pointer grab is in progress.
+</para>
+<para>
+<!-- .LP -->
+The X server searches the ancestors of w from the root down,
+looking for a passive grab to activate.
+If no matching passive grab on the button exists,
+the X server automatically starts an active grab for the client receiving
+the event and sets the last-pointer-grab time to the current server time.
+The effect is essentially equivalent to an
+<xref linkend='XGrabButton' xrefstyle='select: title'/>
+with these client passed arguments:
+</para>
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='4.0*'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Argument</entry>
+      <entry>Value</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry><emphasis remap='I'>w</emphasis></entry>
+      <entry>The event window </entry>
+    </row>
+    <row>
+      <entry><emphasis remap='I'>event_mask</emphasis></entry>
+      <entry>The client's selected pointer events on the event window</entry>
+    </row>
+    <row>
+      <entry><emphasis remap='I'>pointer_mode</emphasis></entry>
+      <entry><symbol>GrabModeAsync</symbol></entry>
+    </row>
+    <row>
+      <entry><emphasis remap='I'>keyboard_mode</emphasis></entry>
+      <entry><symbol>GrabModeAsync</symbol></entry>
+    </row>
+    <row>
+      <entry><emphasis remap='I'>owner_events</emphasis></entry>
+      <entry><symbol>True</symbol>,
+      if the client has selected
+      <symbol>OwnerGrabButtonMask</symbol>
+      on the event window,
+      otherwise
+      <symbol>False</symbol></entry>
+    </row>
+    <row>
+      <entry><emphasis remap='I'>confine_to</emphasis></entry>
+      <entry><symbol>None</symbol></entry>
+    </row>
+    <row>
+      <entry><emphasis remap='I'>cursor</emphasis></entry>
+      <entry><symbol>None</symbol></entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+<!-- .LP -->
+The active grab is automatically terminated when 
+the logical state of the pointer has all buttons released.
+Clients can modify the active grab by calling
+<xref linkend='XUngrabPointer' xrefstyle='select: title'/>
+and
+<xref linkend='XChangeActivePointerGrab' xrefstyle='select: title'/>.
+</para>
+</sect2>
+
+<sect2 id="Keyboard_and_Pointer_Events_b">
+<title>Keyboard and Pointer Events</title>
+<!-- .XS -->
+<!-- (SN Keyboard and Pointer Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Events</primary><secondary>ButtonPress</secondary></indexterm>
+<indexterm><primary>Events</primary><secondary>ButtonRelease</secondary></indexterm>
+<indexterm><primary>Events</primary><secondary>KeyPress</secondary></indexterm>
+<indexterm><primary>Events</primary><secondary>KeyRelease</secondary></indexterm>
+<indexterm><primary>Events</primary><secondary>MotionNotify</secondary></indexterm>
+This section discusses the processing that occurs for the
+keyboard events
+<symbol>KeyPress</symbol>
+and 
+<symbol>KeyRelease</symbol>
+and the pointer events
+<symbol>ButtonPress</symbol>,
+<symbol>ButtonRelease</symbol>,
+and
+<symbol>MotionNotify</symbol>.
+For information about the keyboard event-handling utilities,
+see <link linkend='Event_Handling_Functions'>chapter 11</link>.
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>KeyPress</primary></indexterm>
+<indexterm significance="preferred"><primary>KeyRelease</primary></indexterm>
+The X server reports
+<symbol>KeyPress</symbol>
+or
+<symbol>KeyRelease</symbol>
+events to clients wanting information about keys that logically change state.
+Note that these events are generated for all keys, 
+even those mapped to modifier bits.
+<indexterm significance="preferred"><primary>ButtonPress</primary></indexterm>
+<indexterm significance="preferred"><primary>ButtonRelease</primary></indexterm>
+The X server reports
+<symbol>ButtonPress</symbol>
+or
+<symbol>ButtonRelease</symbol>
+events to clients wanting information about buttons that logically change state.
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>MotionNotify</primary></indexterm>
+The X server reports
+<symbol>MotionNotify</symbol>
+events to clients wanting information about when the pointer logically moves.
+The X server generates this event whenever the pointer is moved 
+and the pointer motion begins and ends in the window.
+The granularity of
+<symbol>MotionNotify</symbol>
+events is not guaranteed, 
+but a client that selects this event type is guaranteed
+to receive at least one event when the pointer moves and then rests.
+</para>
+<para>
+<!-- .LP -->
+The generation of the logical changes lags the physical changes 
+if device event processing is frozen.
+</para>
+<para>
+<!-- .LP -->
+To receive
+<symbol>KeyPress</symbol>,
+<symbol>KeyRelease</symbol>,
+<symbol>ButtonPress</symbol>,
+and
+<symbol>ButtonRelease</symbol>
+events, set 
+<symbol>KeyPressMask</symbol>,
+<symbol>KeyReleaseMask</symbol>,
+<symbol>ButtonPressMask</symbol>,
+and
+<symbol>ButtonReleaseMask</symbol>
+bits in the event-mask attribute of the window.
+</para>
+<para>
+<!-- .LP -->
+To receive 
+<symbol>MotionNotify</symbol>
+events, set one or more of the following event 
+masks bits in the event-mask attribute of the window.
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+<symbol>Button1MotionMask</symbol> - <symbol>Button5MotionMask</symbol>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The client application receives
+<symbol>MotionNotify</symbol>
+events only when one or more of the specified buttons is pressed.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<symbol>ButtonMotionMask</symbol>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The client application receives
+<symbol>MotionNotify</symbol>
+events only when at least one button is pressed.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<symbol>PointerMotionMask</symbol>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The client application receives 
+<symbol>MotionNotify</symbol>
+events independent of the state of
+the pointer buttons.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<symbol>PointerMotionHintMask</symbol>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If
+<symbol>PointerMotionHintMask</symbol>
+is selected in combination with one or more of the above masks, 
+the X server is free to send only one
+<symbol>MotionNotify</symbol>
+event (with the is_hint member  of the
+<type>XPointerMovedEvent</type>
+structure set to
+<symbol>NotifyHint</symbol>)
+to the client for the event window, 
+until either the key or button state changes,
+the pointer leaves the event window, or the client calls
+<xref linkend='XQueryPointer' xrefstyle='select: title'/>
+or
+<xref linkend='XGetMotionEvents' xrefstyle='select: title'/>.
+The server still may send
+<symbol>MotionNotify</symbol>
+events without is_hint set to
+<symbol>NotifyHint</symbol>.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+The source of the event is the viewable window that the pointer is in.
+The window used by the X server to report these events depends on 
+the window's position in the window hierarchy 
+and whether any intervening window prohibits the generation of these events.
+Starting with the source window, 
+the X server searches up the window hierarchy until it locates the first 
+window specified by a client as having an interest in these events.
+If one of the intervening windows has its do-not-propagate-mask
+set to prohibit generation of the event type,
+the events of those types will be suppressed.
+Clients can modify the actual window used for reporting by performing
+active grabs and, in the case of keyboard events, by using the focus window.
+</para>
+<para>
+<!-- .LP -->
+The structures for these event types contain:
+</para>
+<literallayout class="monospaced">
+typedef struct {
+     int            type;            /* ButtonPress or ButtonRelease */
+     unsigned long  serial;          /* # of last request processed by server */
+     Bool           send_event;      /* true if this came from a SendEvent request */
+     Display        *display;        /* Display the event was read from */
+     Window         window;          /* ``event'' window it is reported relative to */
+     Window         root;            /* root window that the event occurred on */
+     Window         subwindow;       /* child window */
+     Time           time;            /* milliseconds */
+     int            x, y;            /* pointer x, y coordinates in event window */
+     int            x_root, y_root;  /* coordinates relative to root */
+     unsigned int   state;           /* key or button mask */
+     unsigned int   button;          /* detail */
+     Bool           same_screen;     /* same screen flag */
+} XButtonEvent;
+typedef XButtonEvent XButtonPressedEvent;
+typedef XButtonEvent XButtonReleasedEvent;
+</literallayout>
+
+<literallayout class="monospaced">
+typedef struct {
+     int            type;            /* KeyPress or KeyRelease */
+     unsigned long  serial;          /* # of last request processed by server */
+     Bool           send_event;      /* true if this came from a SendEvent request */
+     Display        *display;        /* Display the event was read from */
+     Window         window;          /* ``event'' window it is reported relative to */
+     Window         root;            /* root window that the event occurred on */
+     Window         subwindow;       /* child window */
+     Time           time;            /* milliseconds */
+     int            x, y;            /* pointer x, y coordinates in event window */
+     int            x_root, y_root;  /* coordinates relative to root */
+     unsigned int   state;           /* key or button mask */
+     unsigned int   keycode;         /* detail */
+     Bool           same_screen;     /* same screen flag */
+} XKeyEvent;
+typedef XKeyEvent XKeyPressedEvent;
+typedef XKeyEvent XKeyReleasedEvent;
+</literallayout>
+
+<literallayout class="monospaced">
+typedef struct {
+     int            type;              /* MotionNotify */
+     unsigned long  serial;            /* # of last request processed by server */
+     Bool           send_event;        /* true if this came from a SendEvent request */
+     Display        *display;          /* Display the event was read from */
+     Window         window;            /* ``event'' window reported relative to */
+     Window         root;              /* root window that the event occurred on */
+     Window         subwindow;         /* child window */
+     Time           time;              /* milliseconds */
+     int            x, y;              /* pointer x, y coordinates in event window */
+     int            x_root, y_root;    /* coordinates relative to root */
+     unsigned int   state;             /* key or button mask */
+     char           is_hint;           /* detail */
+     Bool           same_screen;       /* same screen flag */
+} XMotionEvent;
+typedef XMotionEvent XPointerMovedEvent;
+</literallayout>
+
+<para>
+These structures have the following common members:
+window, root, subwindow, time, x, y, x_root, y_root, state, and same_screen.
+The window member is set to the window on which the
+event was generated and is referred to as the event window. 
+As long as the conditions previously discussed are met,
+this is the window used by the X server to report the event.
+The root member is set to the source window's root window.
+The x_root and y_root members are set to the pointer's coordinates
+relative to the root window's origin at the time of the event.
+</para>
+
+<para>
+<!-- .LP -->
+The same_screen member is set to indicate whether the event 
+window is on the same screen
+as the root window and can be either
+<symbol>True</symbol>
+or
+<symbol>False</symbol>.
+If
+<symbol>True</symbol>,
+the event and root windows are on the same screen.
+If
+<symbol>False</symbol>,
+the event and root windows are not on the same screen.
+</para>
+<para>
+<!-- .LP -->
+If the source window is an inferior of the event window, 
+the subwindow member of the structure is set to the child of the event window
+that is the source window or the child of the event window that is
+an ancestor of the source window.
+Otherwise, the X server sets the subwindow member to
+<symbol>None</symbol>.
+The time member is set to the time when the event was generated 
+and is expressed in milliseconds.
+</para>
+<para>
+<!-- .LP -->
+If the event window is on the same screen as the root window, 
+the x and y members
+are set to the coordinates relative to the event window's origin.
+Otherwise, these members are set to zero.
+</para>
+<para>
+<!-- .LP -->
+The state member is set to indicate the logical state of the pointer buttons 
+and modifier keys just prior to the event,
+which is the bitwise inclusive OR of one or more of the
+button or modifier key masks:
+<symbol>Button1Mask</symbol>,
+<symbol>Button2Mask</symbol>,
+<symbol>Button3Mask</symbol>,
+<symbol>Button4Mask</symbol>,
+<symbol>Button5Mask</symbol>,
+<symbol>ShiftMask</symbol>,
+<symbol>LockMask</symbol>,
+<symbol>ControlMask</symbol>,
+<symbol>Mod1Mask</symbol>,
+<symbol>Mod2Mask</symbol>,
+<symbol>Mod3Mask</symbol>,
+<symbol>Mod4Mask</symbol>,
+and
+<symbol>Mod5Mask</symbol>.
+</para>
+<para>
+<!-- .LP -->
+Each of these structures also has a member that indicates the detail.
+For the
+<type>XKeyPressedEvent</type>
+and
+<type>XKeyReleasedEvent</type>
+structures, this member is called a keycode.
+It is set to a number that represents a physical key on the keyboard.
+The keycode is an arbitrary representation for any key on the keyboard
+(see sections <link linkend="Manipulating_the_Keyboard_Encoding">12.7</link>
+ and <link linkend="Using_Keyboard_Utility_Functions">16.1</link>).
+</para>
+<para>
+<!-- .LP -->
+For the
+<type>XButtonPressedEvent</type>
+and
+<type>XButtonReleasedEvent</type>
+structures, this member is called button.
+It represents the pointer button that changed state and can be the
+<symbol>Button1</symbol>,
+<symbol>Button2</symbol>,
+<symbol>Button3</symbol>,
+<symbol>Button4</symbol>,
+or
+<symbol>Button5</symbol>
+value.
+For the
+<type>XPointerMovedEvent</type>
+structure, this member is called is_hint.
+It can be set to 
+<symbol>NotifyNormal</symbol>
+or
+<symbol>NotifyHint</symbol>.
+</para>
+<para>
+<!-- .LP -->
+Some of the symbols mentioned in this section have fixed values, as
+follows:
+</para>
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='3.0*'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Symbol</entry>
+      <entry>Value</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry><symbol>Button1MotionMask</symbol></entry>
+      <entry>(1L&lt;&lt;8)</entry>
+    </row>
+    <row>
+      <entry><symbol>Button2MotionMask</symbol></entry>
+      <entry>(1L&lt;&lt;9)</entry>
+    </row>
+    <row>
+      <entry><symbol>Button3MotionMask</symbol></entry>
+      <entry>(1L&lt;&lt;10)</entry>
+    </row>
+    <row>
+      <entry><symbol>Button4MotionMask</symbol></entry>
+      <entry>(1L&lt;&lt;11)</entry>
+    </row>
+    <row>
+      <entry><symbol>Button5MotionMask</symbol></entry>
+      <entry>(1L&lt;&lt;12)</entry>
+    </row>
+    <row>
+      <entry><symbol>Button1Mask</symbol></entry>
+      <entry>(1&lt;&lt;8)</entry>
+    </row>
+    <row>
+      <entry><symbol>Button2Mask</symbol></entry>
+      <entry>(1&lt;&lt;9)</entry>
+    </row>
+    <row>
+      <entry><symbol>Button3Mask</symbol></entry>
+      <entry>(1&lt;&lt;10)</entry>
+    </row>
+    <row>
+      <entry><symbol>Button4Mask</symbol></entry>
+      <entry>(1&lt;&lt;11)</entry>
+    </row>
+    <row>
+      <entry><symbol>Button5Mask</symbol></entry>
+      <entry>(1&lt;&lt;12)</entry>
+    </row>
+    <row>
+      <entry><symbol>ShiftMask</symbol></entry>
+      <entry>(1&lt;&lt;0)</entry>
+    </row>
+    <row>
+      <entry><symbol>LockMask</symbol></entry>
+      <entry>(1&lt;&lt;1)</entry>
+    </row>
+    <row>
+      <entry><symbol>ControlMask</symbol></entry>
+      <entry>(1&lt;&lt;2)</entry>
+    </row>
+    <row>
+      <entry><symbol>Mod1Mask</symbol></entry>
+      <entry>(1&lt;&lt;3)</entry>
+    </row>
+    <row>
+      <entry><symbol>Mod2Mask</symbol></entry>
+      <entry>(1&lt;&lt;4)</entry>
+    </row>
+    <row>
+      <entry><symbol>Mod3Mask</symbol></entry>
+      <entry>(1&lt;&lt;5)</entry>
+    </row>
+    <row>
+      <entry><symbol>Mod4Mask</symbol></entry>
+      <entry>(1&lt;&lt;6)</entry>
+    </row>
+    <row>
+      <entry><symbol>Mod5Mask</symbol></entry>
+      <entry>(1&lt;&lt;7)</entry>
+    </row>
+    <row>
+      <entry><symbol>Button1</symbol></entry>
+      <entry>1</entry>
+    </row>
+    <row>
+      <entry><symbol>Button2</symbol></entry>
+      <entry>2</entry>
+    </row>
+    <row>
+      <entry><symbol>Button3</symbol></entry>
+      <entry>3</entry>
+    </row>
+    <row>
+      <entry><symbol>Button4</symbol></entry>
+      <entry>4</entry>
+    </row>
+    <row>
+      <entry><symbol>Button5</symbol></entry>
+      <entry>5</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+</sect2>
+</sect1>
+<sect1 id='Window_EntryExit_Events'>
+<title>Window Entry/Exit Events</title>
+<!-- .XS -->
+<!-- (SN Window Entry/Exit Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Events</primary><secondary>EnterNotify</secondary></indexterm>
+<indexterm><primary>Events</primary><secondary>LeaveNotify</secondary></indexterm>
+This section describes the processing that 
+occurs for the window crossing events
+<symbol>EnterNotify</symbol>
+and
+<symbol>LeaveNotify</symbol>.
+<indexterm significance="preferred"><primary>EnterNotify</primary></indexterm>
+<indexterm significance="preferred"><primary>LeaveNotify</primary></indexterm>
+If a pointer motion or a window hierarchy change causes the
+pointer to be in a different window than before, the X server reports
+<symbol>EnterNotify</symbol>
+or
+<symbol>LeaveNotify</symbol>
+events to clients who have selected for these events.
+All 
+<symbol>EnterNotify</symbol>
+and 
+<symbol>LeaveNotify</symbol>
+events caused by a hierarchy change are
+generated after any hierarchy event
+(<symbol>UnmapNotify</symbol>,
+<symbol>MapNotify</symbol>,
+<symbol>ConfigureNotify</symbol>,
+<symbol>GravityNotify</symbol>,
+<symbol>CirculateNotify</symbol>)
+caused by that change;
+however, the X protocol does not constrain the ordering of 
+<symbol>EnterNotify</symbol>
+and 
+<symbol>LeaveNotify</symbol>
+events with respect to
+<symbol>FocusOut</symbol>,
+<symbol>VisibilityNotify</symbol>,
+and 
+<symbol>Expose</symbol>
+events.
+</para>
+<para>
+<!-- .LP -->
+This contrasts with
+<symbol>MotionNotify</symbol>
+events, which are also generated when the pointer moves
+but only when the pointer motion begins and ends in a single window.
+An
+<symbol>EnterNotify</symbol>
+or
+<symbol>LeaveNotify</symbol>
+event also can be generated when some client application calls
+<xref linkend='XGrabPointer' xrefstyle='select: title'/>
+and
+<xref linkend='XUngrabPointer' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+To receive
+<symbol>EnterNotify</symbol>
+or
+<symbol>LeaveNotify</symbol>
+events, set the
+<symbol>EnterWindowMask</symbol>
+or
+<symbol>LeaveWindowMask</symbol>
+bits of the event-mask attribute of the window.
+</para>
+<para>
+<!-- .LP -->
+The structure for these event types contains:
+</para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XCrossingEvent</primary></indexterm>
+<indexterm significance="preferred"><primary>XEnterWindowEvent</primary></indexterm>
+<indexterm significance="preferred"><primary>XLeaveWindowEvent</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     int           type;           /* EnterNotify or LeaveNotify */
+     unsigned long serial;         /* # of last request processed by server */
+     Bool          send_event;     /* true if this came from a SendEvent request */
+     Display       *display;       /* Display the event was read from */
+     Window        window;         /* ``event'' window reported relative to */
+     Window        root;           /* root window that the event occurred on */
+     Window        subwindow;      /* child window */
+     Time          time;           /* milliseconds */
+     int           x, y;           /* pointer x, y coordinates in event window */
+     int           x_root, y_root; /* coordinates relative to root */
+     int           mode;           /* NotifyNormal, NotifyGrab, NotifyUngrab */
+     int           detail;
+                   /*
+                    * NotifyAncestor, NotifyVirtual, NotifyInferior, 
+                    * NotifyNonlinear,NotifyNonlinearVirtual
+                    */
+     Bool          same_screen;    /* same screen flag */
+     Bool          focus;          /* boolean focus */
+     unsigned int  state;          /* key or button mask */
+} XCrossingEvent;
+typedef XCrossingEvent XEnterWindowEvent;
+typedef XCrossingEvent XLeaveWindowEvent;
+</literallayout>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The window member is set to the window on which the
+<symbol>EnterNotify</symbol>
+or
+<symbol>LeaveNotify</symbol>
+event was generated and is referred to as the event window. 
+This is the window used by the X server to report the event, 
+and is relative to the root
+window on which the event occurred. 
+The root member is set to the root window of the screen
+on which the event occurred.
+</para>
+<para>
+<!-- .LP -->
+For a
+<symbol>LeaveNotify</symbol>
+event,
+if a child of the event window contains the initial position of the pointer,
+the subwindow component is set to that child.
+Otherwise, the X server sets the subwindow member to
+<symbol>None</symbol>.
+For an
+<symbol>EnterNotify</symbol>
+event, if a child of the event window contains the final pointer position, 
+the subwindow component is set to that child or
+<symbol>None</symbol>.
+</para>
+<para>
+<!-- .LP -->
+The time member is set to the time when the event was generated
+and is expressed in milliseconds.
+The x and y members are set to the coordinates of the pointer position in 
+the event window.
+This position is always the pointer's final position,
+not its initial position.
+If the event window is on the same
+screen as the root window, x and y are the pointer coordinates
+relative to the event window's origin. 
+Otherwise, x and y are set to zero.
+The x_root and y_root members are set to the pointer's coordinates relative to the
+root window's origin at the time of the event.
+</para>
+<para>
+<!-- .LP -->
+The same_screen member is set to indicate whether the event window is on the same screen
+as the root window and can be either
+<symbol>True</symbol>
+or
+<symbol>False</symbol>.
+If
+<symbol>True</symbol>,
+the event and root windows are on the same screen.
+If
+<symbol>False</symbol>,
+the event and root windows are not on the same screen.
+</para>
+<para>
+<!-- .LP -->
+The focus member is set to indicate whether the event window is the focus window or an
+inferior of the focus window.
+The X server can set this member to either
+<symbol>True</symbol>
+or
+<symbol>False</symbol>.
+If
+<symbol>True</symbol>,
+the event window is the focus window or an inferior of the focus window.
+If
+<symbol>False</symbol>,
+the event window is not the focus window or an inferior of the focus window.
+</para>
+<para>
+<!-- .LP -->
+The state member is set to indicate the state of the pointer buttons and
+modifier keys just prior to the
+event.
+The X server can set this member to the bitwise inclusive OR of one 
+or more of the button or modifier key masks:
+<symbol>Button1Mask</symbol>,
+<symbol>Button2Mask</symbol>,
+<symbol>Button3Mask</symbol>,
+<symbol>Button4Mask</symbol>,
+<symbol>Button5Mask</symbol>,
+<symbol>ShiftMask</symbol>,
+<symbol>LockMask</symbol>,
+<symbol>ControlMask</symbol>,
+<symbol>Mod1Mask</symbol>,
+<symbol>Mod2Mask</symbol>,
+<symbol>Mod3Mask</symbol>,
+<symbol>Mod4Mask</symbol>,
+<symbol>Mod5Mask</symbol>.
+</para>
+<para>
+<!-- .LP -->
+The mode member is set to indicate whether the events are normal events, 
+pseudo-motion events
+when a grab activates, or pseudo-motion events when a grab deactivates.
+The X server can set this member to 
+<symbol>NotifyNormal</symbol>,
+<symbol>NotifyGrab</symbol>,
+or
+<symbol>NotifyUngrab</symbol>.
+</para>
+<para>
+<!-- .LP -->
+The detail member is set to indicate the notify detail and can be
+<symbol>NotifyAncestor</symbol>,
+<symbol>NotifyVirtual</symbol>,
+<symbol>NotifyInferior</symbol>,
+<symbol>NotifyNonlinear</symbol>,
+or
+<symbol>NotifyNonlinearVirtual</symbol>.
+</para>
+<sect2 id='Normal_EntryExit_Events'>
+<title>Normal Entry/Exit Events</title>
+<!-- .XS -->
+<!-- (SN Normal Entry/Exit Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<symbol>EnterNotify</symbol>
+and
+<symbol>LeaveNotify</symbol>
+events are generated when the pointer moves from
+one window to another window.
+Normal events are identified by
+<type>XEnterWindowEvent</type>
+or
+<type>XLeaveWindowEvent</type>
+structures whose mode member is set to
+<symbol>NotifyNormal</symbol>.
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+When the pointer moves from window A to window B and A is an inferior of B, 
+the X server does the following:
+<!-- .RS -->
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates a
+<symbol>LeaveNotify</symbol>
+event on window A, with the detail member of the
+<type>XLeaveWindowEvent</type>
+structure set to
+<symbol>NotifyAncestor</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates a
+<symbol>LeaveNotify</symbol>
+event on each window between window A and window B, exclusive,
+with the detail member of each
+<type>XLeaveWindowEvent</type>
+structure set to
+<symbol>NotifyVirtual</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates an
+<symbol>EnterNotify</symbol>
+event on window B, with the detail member of the 
+<type>XEnterWindowEvent</type>
+structure set to
+<symbol>NotifyInferior</symbol>.
+<!-- .RE -->
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+When the pointer moves from window A to window B and B is an inferior of A,
+the X server does the following:
+<!-- .RS -->
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates a
+<symbol>LeaveNotify</symbol>
+event on window A,
+with the detail member of the
+<type>XLeaveWindowEvent</type>
+structure set to
+<symbol>NotifyInferior</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates an
+<symbol>EnterNotify</symbol>
+event on each window between window A and window B, exclusive, with the 
+detail member of each 
+<type>XEnterWindowEvent</type>
+structure set to
+<symbol>NotifyVirtual</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates an
+<symbol>EnterNotify</symbol>
+event on window B, with the detail member of the 
+<type>XEnterWindowEvent</type>
+structure set to
+<symbol>NotifyAncestor</symbol>.
+<!-- .RE -->
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+When the pointer moves from window A to window B 
+and window C is their least common ancestor, 
+the X server does the following:
+<!-- .RS -->
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates a
+<symbol>LeaveNotify</symbol>
+event on window A,
+with the detail member of the
+<type>XLeaveWindowEvent</type>
+structure set to 
+<symbol>NotifyNonlinear</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates a
+<symbol>LeaveNotify</symbol>
+event on each window between window A and window C, exclusive,
+with the detail member of each
+<type>XLeaveWindowEvent</type>
+structure set to
+<symbol>NotifyNonlinearVirtual</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates an
+<symbol>EnterNotify</symbol>
+event on each window between window C and window B, exclusive, 
+with the detail member of each
+<type>XEnterWindowEvent</type>
+structure set to
+<symbol>NotifyNonlinearVirtual</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates an
+<symbol>EnterNotify</symbol>
+event on window B, with the detail member of the 
+<type>XEnterWindowEvent</type>
+structure set to 
+<symbol>NotifyNonlinear</symbol>.
+<!-- .RE -->
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+When the pointer moves from window A to window B on different screens, 
+the X server does the following:
+<!-- .RS -->
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates a
+<symbol>LeaveNotify</symbol>
+event on window A,
+with the detail member of the
+<type>XLeaveWindowEvent</type>
+structure set to 
+<symbol>NotifyNonlinear</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If window A is not a root window,
+it generates a
+<symbol>LeaveNotify</symbol>
+event on each window above window A up to and including its root,
+with the detail member of each
+<type>XLeaveWindowEvent</type>
+structure set to 
+<symbol>NotifyNonlinearVirtual</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If window B is not a root window,
+it generates an
+<symbol>EnterNotify</symbol>
+event on each window from window B's root down to but not including
+window B, with the detail member of each
+<type>XEnterWindowEvent</type>
+structure set to 
+<symbol>NotifyNonlinearVirtual</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates an
+<symbol>EnterNotify</symbol>
+event on window B, with the detail member of the
+<type>XEnterWindowEvent</type>
+structure set to 
+<symbol>NotifyNonlinear</symbol>.
+<!-- .RE -->
+<!-- .\".SH 3 -->
+    </para>
+  </listitem>
+</itemizedlist>
+</sect2>
+<sect2 id='Grab_and_Ungrab_EntryExit_Events'>
+<title>Grab and Ungrab Entry/Exit Events</title>
+<!-- .XS -->
+<!-- (SN Grab and Ungrab Entry/Exit Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Pseudo-motion mode
+<symbol>EnterNotify</symbol>
+and
+<symbol>LeaveNotify</symbol>
+events are generated when a pointer grab activates or deactivates.
+Events in which the pointer grab activates
+are identified by
+<type>XEnterWindowEvent</type>
+or
+<type>XLeaveWindowEvent</type>
+structures whose mode member is set to 
+<symbol>NotifyGrab</symbol>.
+Events in which the pointer grab deactivates
+are identified by
+<type>XEnterWindowEvent</type>
+or
+<type>XLeaveWindowEvent</type>
+structures whose mode member is set to 
+<symbol>NotifyUngrab</symbol>
+(see
+<xref linkend='XGrabPointer' xrefstyle='select: title'/>).
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+When a pointer grab activates after any initial warp into a confine_to
+window and before generating any actual
+<symbol>ButtonPress</symbol>
+event that activates the grab, 
+G is the grab_window for the grab, 
+and P is the window the pointer is in, 
+the X server does the following:
+<!-- .RS -->
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates
+<symbol>EnterNotify</symbol>
+and
+<symbol>LeaveNotify</symbol>
+events (see <link linkend='Normal_EntryExit_Events'>section 10.6.1</link>)
+with the mode members of the 
+<type>XEnterWindowEvent</type>
+and
+<type>XLeaveWindowEvent</type>
+structures set to 
+<symbol>NotifyGrab</symbol>.
+These events are generated
+as if the pointer were to suddenly warp from
+its current position in P to some position in G.
+However, the pointer does not warp, and the X server uses the pointer position 
+as both the initial and final positions for the events.
+<!-- .RE -->
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+When a pointer grab deactivates after generating any actual
+<symbol>ButtonRelease</symbol>
+event that deactivates the grab, 
+G is the grab_window for the grab,
+and P is the window the pointer is in, 
+the X server does the following:
+<!-- .RS -->
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates
+<symbol>EnterNotify</symbol>
+and
+<symbol>LeaveNotify</symbol>
+events (see <link linkend='Normal_EntryExit_Events'>section 10.6.1</link>)
+with the mode members of the
+<type>XEnterWindowEvent</type>
+and
+<type>XLeaveWindowEvent</type>
+structures set to 
+<symbol>NotifyUngrab</symbol>.
+These events are generated as if the pointer were to suddenly warp from
+some position in G to its current position in P.
+However, the pointer does not warp, and the X server uses the
+current pointer position as both the
+initial and final positions for the events.
+<!-- .RE -->
+    </para>
+  </listitem>
+</itemizedlist>
+</sect2>
+</sect1>
+<sect1 id="Input_Focus_Events">
+<title>Input Focus Events</title>
+<!-- .XS -->
+<!-- (SN Input Focus Events  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Events</primary><secondary>FocusIn</secondary></indexterm>
+<indexterm><primary>Events</primary><secondary>FocusOut</secondary></indexterm>
+This section describes the processing that occurs for the input focus events
+<symbol>FocusIn</symbol>
+and
+<symbol>FocusOut</symbol>.
+<indexterm significance="preferred"><primary>FocusIn</primary></indexterm>
+<indexterm significance="preferred"><primary>FocusOut</primary></indexterm>
+The X server can report
+<symbol>FocusIn</symbol>
+or
+<symbol>FocusOut</symbol>
+events to clients wanting information about when the input focus changes.
+The keyboard is always attached to some window 
+(typically, the root window or a top-level window), 
+which is called the focus window.
+The focus window and the position of the pointer determine the window that
+receives keyboard input.
+Clients may need to know when the input focus changes
+to control highlighting of areas on the screen.
+</para>
+<para>
+<!-- .LP -->
+To receive
+<symbol>FocusIn</symbol>
+or
+<symbol>FocusOut</symbol>
+events, set the
+<symbol>FocusChangeMask</symbol>
+bit in the event-mask attribute of the window. 
+</para>
+<para>
+<!-- .LP -->
+The structure for these event types contains:
+</para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XFocusChangeEvent</primary></indexterm>
+<indexterm significance="preferred"><primary>XFocusInEvent</primary></indexterm>
+<indexterm significance="preferred"><primary>XFocusOutEvent</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     int           type;       /* FocusIn or FocusOut */
+     unsigned long serial;     /* # of last request processed by server */
+     Bool          send_event; /* true if this came from a SendEvent request */
+     Display       *display;   /* Display the event was read from */
+     Window        window;     /* window of event */
+     int           mode;       /* NotifyNormal, NotifyGrab, NotifyUngrab */
+     int           detail;
+                   /*
+                    * NotifyAncestor, NotifyVirtual, NotifyInferior, 
+                    * NotifyNonlinear,NotifyNonlinearVirtual, NotifyPointer,
+                    * NotifyPointerRoot, NotifyDetailNone 
+                    */
+} XFocusChangeEvent;
+typedef XFocusChangeEvent XFocusInEvent;
+typedef XFocusChangeEvent XFocusOutEvent;
+</literallayout>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The window member is set to the window on which the
+<symbol>FocusIn</symbol>
+or
+<symbol>FocusOut</symbol>
+event was generated.
+This is the window used by the X server to report the event. 
+The mode member is set to indicate whether the focus events 
+are normal focus events, 
+focus events while grabbed,
+focus events
+when a grab activates, or focus events when a grab deactivates.
+The X server can set the mode member to 
+<symbol>NotifyNormal</symbol>,
+<symbol>NotifyWhileGrabbed</symbol>,
+<symbol>NotifyGrab</symbol>,
+or
+<symbol>NotifyUngrab</symbol>.
+</para>
+<para>
+<!-- .LP -->
+All 
+<symbol>FocusOut</symbol>
+events caused by a window unmap are generated after any
+<symbol>UnmapNotify</symbol>
+event; however, the X protocol does not constrain the ordering of 
+<symbol>FocusOut</symbol>
+events with respect to
+generated 
+<symbol>EnterNotify</symbol>,
+<symbol>LeaveNotify</symbol>,
+<symbol>VisibilityNotify</symbol>,
+and
+<symbol>Expose</symbol>
+events.
+</para>
+<para>
+<!-- .LP -->
+Depending on the event mode,
+the detail member is set to indicate the notify detail and can be
+<symbol>NotifyAncestor</symbol>,
+<symbol>NotifyVirtual</symbol>,
+<symbol>NotifyInferior</symbol>,
+<symbol>NotifyNonlinear</symbol>,
+<symbol>NotifyNonlinearVirtual</symbol>,
+<symbol>NotifyPointer</symbol>,
+<symbol>NotifyPointerRoot</symbol>,
+or
+<symbol>NotifyDetailNone</symbol>.
+</para>
+<sect2 id='Normal_Focus_Events_and_Focus_Events_While_Grabbed'>
+<title>Normal Focus Events and Focus Events While Grabbed</title>
+<!-- .XS -->
+<!-- (SN Normal Focus Events and Focus Events While Grabbed  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Normal focus events are identified by
+<type>XFocusInEvent</type>
+or
+<type>XFocusOutEvent</type>
+structures whose mode member is set to 
+<symbol>NotifyNormal</symbol>.
+Focus events while grabbed are identified by
+<type>XFocusInEvent</type>
+or
+<type>XFocusOutEvent</type>
+structures whose mode member is set to 
+<symbol>NotifyWhileGrabbed</symbol>.
+The X server processes normal focus and focus events while grabbed according to 
+the following:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+When the focus moves from window A to window B, A is an inferior of B, 
+and the pointer is in window P, 
+the X server does the following:
+<!-- .RS -->
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates a
+<symbol>FocusOut</symbol>
+event on window A, with the detail member of the
+<type>XFocusOutEvent</type>
+structure set to 
+<symbol>NotifyAncestor</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates a
+<symbol>FocusOut</symbol>
+event on each window between window A and window B, exclusive,
+with the detail member of each
+<type>XFocusOutEvent</type>
+structure set to 
+<symbol>NotifyVirtual</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates a
+<symbol>FocusIn</symbol>
+event on window B, with the detail member of the 
+<type>XFocusOutEvent</type>
+structure set to 
+<symbol>NotifyInferior</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If window P is an inferior of window B
+but window P is not window A or an inferior or ancestor of window A,
+it generates a
+<symbol>FocusIn</symbol>
+event on each window below window B, down to and including window P, 
+with the detail member of each 
+<type>XFocusInEvent</type>
+structure set to 
+<symbol>NotifyPointer</symbol>.
+<!-- .RE -->
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+When the focus moves from window A to window B, B is an inferior of A, 
+and the pointer is in window P, 
+the X server does the following:
+<!-- .RS -->
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If window P is an inferior of window A
+but P is not an inferior of window B or an ancestor of B,
+it generates a
+<symbol>FocusOut</symbol>
+event on each window from window P up to but not including window A,
+with the detail member of each 
+<type>XFocusOutEvent</type>
+structure set to  
+<symbol>NotifyPointer</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates a
+<symbol>FocusOut</symbol>
+event on window A,
+with the detail member of the
+<type>XFocusOutEvent</type>
+structure set to  
+<symbol>NotifyInferior</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates a
+<symbol>FocusIn</symbol>
+event on each window between window A and window B, exclusive, with the 
+detail member of each 
+<type>XFocusInEvent</type>
+structure set to  
+<symbol>NotifyVirtual</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates a
+<symbol>FocusIn</symbol>
+event on window B, with the detail member of the 
+<type>XFocusInEvent</type>
+structure set to  
+<symbol>NotifyAncestor</symbol>.
+<!-- .RE -->
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+When the focus moves from window A to window B, 
+window C is their least common ancestor, 
+and the pointer is in window P, 
+the X server does the following:
+<!-- .RS -->
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If window P is an inferior of window A,
+it generates a
+<symbol>FocusOut</symbol>
+event on each window from window P up to but not including window A, 
+with the detail member of the 
+<type>XFocusOutEvent</type>
+structure set to  
+<symbol>NotifyPointer</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates a
+<symbol>FocusOut</symbol>
+event on window A,
+with the detail member of the
+<type>XFocusOutEvent</type>
+structure set to  
+<symbol>NotifyNonlinear</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates a
+<symbol>FocusOut</symbol>
+event on each window between window A and window C, exclusive,
+with the detail member of each
+<type>XFocusOutEvent</type>
+structure set to  
+<symbol>NotifyNonlinearVirtual</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates a
+<symbol>FocusIn</symbol>
+event on each window between C and B, exclusive,
+with the detail member of each
+<type>XFocusInEvent</type>
+structure set to  
+<symbol>NotifyNonlinearVirtual</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates a
+<symbol>FocusIn</symbol>
+event on window B, with the detail member of the 
+<type>XFocusInEvent</type>
+structure set to  
+<symbol>NotifyNonlinear</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If window P is an inferior of window B, it generates a
+<symbol>FocusIn</symbol>
+event on each window below window B down to and including window P, 
+with the detail member of the 
+<type>XFocusInEvent</type>
+structure set to  
+<symbol>NotifyPointer</symbol>.
+<!-- .RE -->
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+When the focus moves from window A to window B on different screens 
+and the pointer is in window P, 
+the X server does the following:
+<!-- .RS -->
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If window P is an inferior of window A, it generates a
+<symbol>FocusOut</symbol>
+event on each window from window P up to but not including window A, 
+with the detail member of each 
+<type>XFocusOutEvent</type>
+structure set to  
+<symbol>NotifyPointer</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates a
+<symbol>FocusOut</symbol>
+event on window A,
+with the detail member of the
+<type>XFocusOutEvent</type>
+structure set to  
+<symbol>NotifyNonlinear</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If window A is not a root window,
+it generates a
+<symbol>FocusOut</symbol>
+event on each window above window A up to and including its root, 
+with the detail member of each
+<type>XFocusOutEvent</type>
+structure set to  
+<symbol>NotifyNonlinearVirtual</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If window B is not a root window,
+it generates a
+<symbol>FocusIn</symbol>
+event on each window from window B's root down to but not including
+window B, with the detail member of each
+<type>XFocusInEvent</type>
+structure set to  
+<symbol>NotifyNonlinearVirtual</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates a
+<symbol>FocusIn</symbol>
+event on window B, with the detail member of each 
+<type>XFocusInEvent</type>
+structure set to  
+<symbol>NotifyNonlinear</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If window P is an inferior of window B, it generates a
+<symbol>FocusIn</symbol>
+event on each window below window B down to and including window P, 
+with the detail member of each 
+<type>XFocusInEvent</type>
+structure set to  
+<symbol>NotifyPointer</symbol>.
+<!-- .RE -->
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+When the focus moves from window A to 
+<symbol>PointerRoot</symbol>
+(events sent to the window under the pointer)
+or
+<symbol>None</symbol>
+(discard), and the pointer is in window P,
+the X server does the following:
+<!-- .RS -->
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If window P is an inferior of window A, it generates a
+<symbol>FocusOut</symbol>
+event on each window from window P up to but not including window A, 
+with the detail member of each 
+<type>XFocusOutEvent</type>
+structure set to  
+<symbol>NotifyPointer</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates a
+<symbol>FocusOut</symbol>
+event on window A, with the detail member of the
+<type>XFocusOutEvent</type>
+structure set to
+<symbol>NotifyNonlinear</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If window A is not a root window,
+it generates a
+<symbol>FocusOut</symbol>
+event on each window above window A up to and including its root, 
+with the detail member of each
+<type>XFocusOutEvent</type>
+structure set to
+<symbol>NotifyNonlinearVirtual</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates a
+<symbol>FocusIn</symbol>
+event on the root window of all screens, with the detail member of each
+<type>XFocusInEvent</type>
+structure set to
+<symbol>NotifyPointerRoot</symbol>
+(or
+<symbol>NotifyDetailNone</symbol>).
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If the new focus is
+<symbol>PointerRoot</symbol>,
+it generates a
+<symbol>FocusIn</symbol>
+event on each window from window P's root down to and including window P, 
+with the detail member of each
+<type>XFocusInEvent</type>
+structure set to
+<symbol>NotifyPointer</symbol>.
+<!-- .RE -->
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+When the focus moves from 
+<symbol>PointerRoot</symbol>
+(events sent to the window under the pointer)
+or
+<symbol>None</symbol>
+to window A, and the pointer is in window P, 
+the X server does the following: 
+<!-- .RS -->
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If the old focus is
+<symbol>PointerRoot</symbol>,
+it generates a
+<symbol>FocusOut</symbol>
+event on each window from window P up to and including window P's root, 
+with the detail member of each
+<type>XFocusOutEvent</type>
+structure set to
+<symbol>NotifyPointer</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates a
+<symbol>FocusOut</symbol>
+event on all root windows,
+with the detail member of each
+<type>XFocusOutEvent</type>
+structure set to
+<symbol>NotifyPointerRoot</symbol>
+(or
+<symbol>NotifyDetailNone</symbol>).
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If window A is not a root window,
+it generates a
+<symbol>FocusIn</symbol>
+event on each window from window A's root down to but not including window A,
+with the detail member of each
+<type>XFocusInEvent</type>
+structure set to
+<symbol>NotifyNonlinearVirtual</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates a
+<symbol>FocusIn</symbol>
+event on window A,
+with the detail member of the 
+<type>XFocusInEvent</type>
+structure set to  
+<symbol>NotifyNonlinear</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If window P is an inferior of window A, it generates a
+<symbol>FocusIn</symbol>
+event on each window below window A down to and including window P, 
+with the detail member of each 
+<type>XFocusInEvent</type>
+structure set to  
+<symbol>NotifyPointer</symbol>.
+<!-- .RE -->
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+When the focus moves from 
+<symbol>PointerRoot</symbol>
+(events sent to the window under the pointer)
+to
+<symbol>None</symbol>
+(or vice versa), and the pointer is in window P, 
+the X server does the following:
+<!-- .RS -->
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If the old focus is
+<symbol>PointerRoot</symbol>,
+it generates a
+<symbol>FocusOut</symbol>
+event on each window from window P up to and including window P's root, 
+with the detail member of each
+<type>XFocusOutEvent</type>
+structure set to
+<symbol>NotifyPointer</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates a
+<symbol>FocusOut</symbol>
+event on all root windows,
+with the detail member of each 
+<type>XFocusOutEvent</type>
+structure set to either
+<symbol>NotifyPointerRoot</symbol>
+or
+<symbol>NotifyDetailNone</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates a
+<symbol>FocusIn</symbol>
+event on all root windows,
+with the detail member of each
+<type>XFocusInEvent</type>
+structure set to
+<symbol>NotifyDetailNone</symbol>
+or
+<symbol>NotifyPointerRoot</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If the new focus is
+<symbol>PointerRoot</symbol>,
+it generates a
+<symbol>FocusIn</symbol>
+event on each window from window P's root down to and including window P, 
+with the detail member of each
+<type>XFocusInEvent</type>
+structure set to
+<symbol>NotifyPointer</symbol>.
+<!-- .RE -->
+<!-- .\".SH 3 -->
+    </para>
+  </listitem>
+</itemizedlist>
+</sect2>
+<sect2 id="Focus_Events_Generated_by_Grabs">
+<title>Focus Events Generated by Grabs</title>
+<!-- .XS -->
+<!-- (SN Focus Events Generated by Grabs  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Focus events in which the keyboard grab activates
+are identified by
+<type>XFocusInEvent</type>
+or
+<type>XFocusOutEvent</type>
+structures whose mode member is set to 
+<symbol>NotifyGrab</symbol>.
+Focus events in which the keyboard grab deactivates
+are identified by
+<type>XFocusInEvent</type>
+or
+<type>XFocusOutEvent</type>
+structures whose mode member is set to 
+<symbol>NotifyUngrab</symbol>
+(see 
+<xref linkend='XGrabKeyboard' xrefstyle='select: title'/>).
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+When a keyboard grab activates before generating any actual 
+<symbol>KeyPress</symbol>
+event that activates the grab,
+G is the grab_window, and F is the current focus, 
+the X server does the following:
+<!-- .RS -->
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates 
+<symbol>FocusIn</symbol>
+and
+<symbol>FocusOut</symbol>
+events, with the mode members of the 
+<type>XFocusInEvent</type>
+and
+<type>XFocusOutEvent</type>
+structures set to 
+<symbol>NotifyGrab</symbol>.
+These events are generated
+as if the focus were to change from
+F to G.
+<!-- .RE -->
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+When a keyboard grab deactivates after generating any actual
+<symbol>KeyRelease</symbol>
+event that deactivates the grab,
+G is the grab_window, and F is the current focus,
+the X server does the following:
+<!-- .RS -->
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+It generates 
+<symbol>FocusIn</symbol>
+and
+<symbol>FocusOut</symbol>
+events, with the mode members of the 
+<type>XFocusInEvent</type>
+and
+<type>XFocusOutEvent</type>
+structures set to
+<symbol>NotifyUngrab</symbol>.
+These events are generated
+as if the focus were to change from
+G to F.
+<!-- .RE -->
+    </para>
+  </listitem>
+</itemizedlist>
+</sect2>
+</sect1>
+<sect1 id="Key_Map_State_Notification_Events">
+<title>Key Map State Notification Events</title>
+<!-- .XS -->
+<!-- (SN Key Map State Notification Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Events</primary><secondary>KeymapNotify</secondary></indexterm>
+<indexterm significance="preferred"><primary>KeymapNotify</primary></indexterm>
+The X server can report
+<symbol>KeymapNotify</symbol>
+events to clients that want information about changes in their keyboard state.
+</para>
+<para>
+<!-- .LP -->
+To receive
+<symbol>KeymapNotify</symbol>
+events, set the
+<symbol>KeymapStateMask</symbol>
+bit in the event-mask attribute of the window. 
+The X server generates this event immediately after every
+<symbol>EnterNotify</symbol>
+and
+<symbol>FocusIn</symbol>
+event.
+</para>
+<para>
+<!-- .LP -->
+The structure for this event type contains:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XKeymapEvent</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+/* generated on EnterWindow and FocusIn when KeymapState selected */
+typedef struct {
+     int            type;           /* KeymapNotify */
+     unsigned long  serial;         /* # of last request processed by server */
+     Bool           send_event;     /* true if this came from a SendEvent request */
+     Display        *display;       /* Display the event was read from */
+     Window         window;
+     char           key_vector[32];
+} XKeymapEvent;     
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The window member is not used but is present to aid some toolkits.
+The key_vector member is set to the bit vector of the keyboard.
+Each bit set to 1 indicates that the corresponding key 
+is currently pressed.
+The vector is represented as 32 bytes.
+Byte N (from 0) contains the bits for keys 8N to 8N + 7 
+with the least significant bit in the byte representing key 8N.
+</para>
+</sect1>
+<sect1 id="Exposure_Events">
+<title>Exposure Events</title>
+<!-- .XS -->
+<!-- (SN Exposure Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The X protocol does not guarantee to preserve the contents of window 
+regions when
+the windows are obscured or reconfigured.
+Some implementations may preserve the contents of windows.
+Other implementations are free to destroy the contents of windows
+when exposed.
+X expects client applications to assume the responsibility for
+restoring the contents of an exposed window region. 
+(An exposed window region describes a formerly obscured window whose 
+region becomes visible.) 
+Therefore, the X server sends 
+<symbol>Expose</symbol>
+events describing the window and the region of the window that has been exposed.
+A naive client application usually redraws the entire window. 
+A more sophisticated client application redraws only the exposed region.
+</para>
+<sect2 id="Expose_Events">
+<title>Expose Events</title>
+<!-- .XS -->
+<!-- (SN Expose Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Events</primary><secondary>Expose</secondary></indexterm>
+<indexterm significance="preferred"><primary>Expose</primary></indexterm>
+The X server can report
+<symbol>Expose</symbol>
+events to clients wanting information about when the contents of window regions
+have been lost.
+The circumstances in which the X server generates
+<symbol>Expose</symbol>
+events are not as definite as those for other events.
+However, the X server never generates
+<symbol>Expose</symbol>
+events on windows whose class you specified as
+<symbol>InputOnly</symbol>.
+The X server can generate
+<symbol>Expose</symbol>
+events when no valid contents are available for regions of a window
+and either the regions are visible, 
+the regions are viewable and the server is (perhaps newly) maintaining 
+backing store on the window,
+or the window is not viewable but the server is (perhaps newly) honoring the
+window's backing-store attribute of
+<symbol>Always</symbol>
+or
+<symbol>WhenMapped</symbol>.
+The regions decompose into an (arbitrary) set of rectangles,
+and an
+<symbol>Expose</symbol>
+event is generated for each rectangle.
+For any given window,
+the X server guarantees to report contiguously 
+all of the regions exposed by some action that causes 
+<symbol>Expose</symbol>
+events, such as raising a window.
+</para>
+<para>
+<!-- .LP -->
+To receive
+<symbol>Expose</symbol>
+events, set the
+<symbol>ExposureMask</symbol>
+bit in the event-mask attribute of the window. 
+</para>
+<para>
+<!-- .LP -->
+The structure for this event type contains:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XExposeEvent</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     int           type;           /* Expose */
+     unsigned long serial;         /* # of last request processed by server */
+     Bool          send_event;     /* true if this came from a SendEvent request */
+     Display       *display;       /* Display the event was read from */
+     Window        window;
+     int           x, y;
+     int           width, height;
+     int           count;          /* if nonzero, at least this many more */
+} XExposeEvent;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The window member is set to the exposed (damaged) window.
+The x and y members are set to the coordinates relative to the window's origin
+and indicate the upper-left corner of the rectangle.
+The width and height members are set to the size (extent) of the rectangle.
+The count member is set to the number of
+<symbol>Expose</symbol>
+events that are to follow.
+If count is zero, no more
+<symbol>Expose</symbol>
+events follow for this window.
+However, if count is nonzero, at least that number of 
+<symbol>Expose</symbol>
+events (and possibly more) follow for this window.
+Simple applications that do not want to optimize redisplay by distinguishing
+between subareas of its window can just ignore all
+<symbol>Expose</symbol>
+events with nonzero counts and perform full redisplays
+on events with zero counts.
+</para>
+</sect2>
+<sect2 id="GraphicsExpose_and_NoExpose_Events">
+<title>GraphicsExpose and NoExpose Events</title>
+<!-- .XS -->
+<!-- (SN GraphicsExpose and NoExpose Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Events</primary><secondary>GraphicsExpose</secondary></indexterm>
+<indexterm><primary>Events</primary><secondary>NoExpose</secondary></indexterm>
+<indexterm significance="preferred"><primary>GraphicsExpose</primary></indexterm>
+The X server can report
+<symbol>GraphicsExpose</symbol>
+events to clients wanting information about when a destination region could not
+be computed during certain graphics requests:
+<xref linkend='XCopyArea' xrefstyle='select: title'/>
+or
+<xref linkend='XCopyPlane' xrefstyle='select: title'/>.
+The X server generates this event whenever a destination region could not be
+computed because of an obscured or out-of-bounds source region.
+In addition, the X server guarantees to report contiguously all of the regions exposed by
+some graphics request 
+(for example, copying an area of a drawable to a destination
+drawable).
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>NoExpose</primary></indexterm>
+The X server generates a
+<symbol>NoExpose</symbol>
+event whenever a graphics request that might
+produce a
+<symbol>GraphicsExpose</symbol>
+event does not produce any.
+In other words, the client is really asking for a
+<symbol>GraphicsExpose</symbol>
+event but instead receives a
+<symbol>NoExpose</symbol>
+event.
+</para>
+<para>
+<!-- .LP -->
+To receive
+<symbol>GraphicsExpose</symbol>
+or
+<symbol>NoExpose</symbol>
+events, you must first set the graphics-exposure 
+attribute of the graphics context to
+<symbol>True</symbol>.
+You also can set the graphics-expose attribute when creating a graphics
+context using
+<xref linkend='XCreateGC' xrefstyle='select: title'/>
+or by calling
+<xref linkend='XSetGraphicsExposures' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+The structures for these event types contain:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XGraphicsExposeEvent</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     int            type;           /* GraphicsExpose */
+     unsigned long  serial;         /* # of last request processed by server */
+     Bool           send_event;     /* true if this came from a SendEvent request */
+     Display        *display;       /* Display the event was read from */
+     Drawable       drawable;
+     int            x, y;
+     int            width, height;
+     int            count;          /* if nonzero, at least this many more */
+     int            major_code;     /* core is CopyArea or CopyPlane */
+     int            minor_code;     /* not defined in the core */
+} XGraphicsExposeEvent;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XNoExposeEvent</primary></indexterm>
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     int           type;         /* NoExpose */
+     unsigned long serial;       /* # of last request processed by server */
+     Bool          send_event;   /* true if this came from a SendEvent request */
+     Display       *display;     /* Display the event was read from */
+     Drawable      drawable;
+     int           major_code;   /* core is CopyArea or CopyPlane */
+     int           minor_code;   /* not defined in the core */
+} XNoExposeEvent;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+Both structures have these common members: drawable, major_code, and minor_code.
+The drawable member is set to the drawable of the destination region on 
+which the graphics request was to be performed.
+The major_code member is set to the graphics request initiated by the client
+and can be either
+<symbol>X_CopyArea</symbol>
+or
+<symbol>X_CopyPlane</symbol>.
+If it is
+<symbol>X_CopyArea</symbol>,
+a call to
+<xref linkend='XCopyArea' xrefstyle='select: title'/>
+initiated the request.
+If it is
+<symbol>X_CopyPlane</symbol>,
+a call to
+<xref linkend='XCopyPlane' xrefstyle='select: title'/>
+initiated the request.
+These constants are defined in 
+<filename class="headerfile">&lt;X11/Xproto.h&gt;</filename>.
+<indexterm type="file"><primary><filename class="headerfile">X11/Xproto.h</filename></primary></indexterm>
+<indexterm><primary>Files</primary><secondary><filename class="headerfile">&lt;X11/Xproto.h&gt;</filename></secondary></indexterm>
+<indexterm><primary>Headers</primary><secondary><filename class="headerfile">&lt;X11/Xproto.h&gt;</filename></secondary></indexterm>
+The minor_code member,
+like the major_code member, 
+indicates which graphics request was initiated by
+the client. 
+However, the minor_code member is not defined by the core
+X protocol and will be zero in these cases, 
+although it may be used by an extension.
+</para>
+<para>
+<!-- .LP -->
+The 
+<structname>XGraphicsExposeEvent</structname>
+structure has these additional members: x, y, width, height, and count. 
+The x and y members are set to the coordinates relative to the drawable's origin
+and indicate the upper-left corner of the rectangle.
+The width and height members are set to the size (extent) of the rectangle.
+The count member is set to the number of
+<symbol>GraphicsExpose</symbol>
+events to follow.
+If count is zero, no more
+<symbol>GraphicsExpose</symbol>
+events follow for this window.
+However, if count is nonzero, at least that number of
+<symbol>GraphicsExpose</symbol>
+events (and possibly more) are to follow for this window.
+</para>
+</sect2>
+</sect1>
+<sect1 id='Window_State_Change_Events'>
+<title>Window State Change Events</title>
+<!-- .XS -->
+<!-- (SN Window State Change Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The following sections discuss:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+<symbol>CirculateNotify</symbol>
+events
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<symbol>ConfigureNotify</symbol>
+events
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<symbol>CreateNotify</symbol>
+events
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<symbol>DestroyNotify</symbol>
+events
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<symbol>GravityNotify</symbol>
+events
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<symbol>MapNotify</symbol>
+events
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<symbol>MappingNotify</symbol>
+events
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<symbol>ReparentNotify</symbol>
+events
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<symbol>UnmapNotify</symbol>
+events
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<symbol>VisibilityNotify</symbol>
+events
+<!-- .\" .SH 3 -->
+    </para>
+  </listitem>
+</itemizedlist>
+<sect2 id="CirculateNotify_Events">
+<title>CirculateNotify Events</title>
+<!-- .XS -->
+<!-- (SN CirculateNotify Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Events</primary><secondary>CirculateNotify</secondary></indexterm>
+<indexterm significance="preferred"><primary>CirculateNotify</primary></indexterm>
+The X server can report
+<symbol>CirculateNotify</symbol>
+events to clients wanting information about when a window changes 
+its position in the stack.
+The X server generates this event type whenever a window is actually restacked 
+as a result of a client application calling
+<xref linkend='XCirculateSubwindows' xrefstyle='select: title'/>,
+<xref linkend='XCirculateSubwindowsUp' xrefstyle='select: title'/>,
+or
+<xref linkend='XCirculateSubwindowsDown' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+To receive 
+<symbol>CirculateNotify</symbol>
+events, set the
+<symbol>StructureNotifyMask</symbol>
+bit in the event-mask attribute of the window
+or the
+<symbol>SubstructureNotifyMask</symbol>
+bit in the event-mask attribute of the parent window
+(in which case, circulating any child generates an event).
+</para>
+<para>
+<!-- .LP -->
+The structure for this event type contains:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XCirculateEvent</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     int type;     /* CirculateNotify */
+     unsigned long serial;     /* # of last request processed by server */
+     Bool send_event;     /* true if this came from a SendEvent request */
+     Display *display;     /* Display the event was read from */
+     Window event;
+     Window window;
+     int place;     /* PlaceOnTop, PlaceOnBottom */
+} XCirculateEvent;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The event member is set either to the restacked window or to its parent,
+depending on whether
+<systemitem class="event">StructureNotify</systemitem>
+or
+<systemitem class="event">SubstructureNotify</systemitem>
+was selected.
+The window member is set to the window that was restacked.
+The place member is set to the window's position after the restack occurs and
+is either
+<symbol>PlaceOnTop</symbol>
+or
+<symbol>PlaceOnBottom</symbol>.
+If it is
+<symbol>PlaceOnTop</symbol>,
+the window is now on top of all siblings.
+If it is
+<symbol>PlaceOnBottom</symbol>,
+the window is now below all siblings.
+</para>
+</sect2>
+<sect2 id="ConfigureNotify_Events">
+<title>ConfigureNotify Events</title>
+<!-- .XS -->
+<!-- (SN ConfigureNotify Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Events</primary><secondary>ConfigureNotify</secondary></indexterm>
+<indexterm significance="preferred"><primary>ConfigureNotify</primary></indexterm>
+The X server can report
+<symbol>ConfigureNotify</symbol>
+events to clients wanting information about actual changes to a window's
+state, such as size, position, border, and stacking order.
+The X server generates this event type whenever one of the following configure 
+window requests made by a client application actually completes:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+A window's size, position, border, and/or stacking order is reconfigured 
+by calling
+<xref linkend='XConfigureWindow' xrefstyle='select: title'/>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The window's position in the stacking order is changed by calling
+<xref linkend='XLowerWindow' xrefstyle='select: title'/>,
+<xref linkend='XRaiseWindow' xrefstyle='select: title'/>,
+or
+<xref linkend='XRestackWindows' xrefstyle='select: title'/>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A window is moved by calling
+<xref linkend='XMoveWindow' xrefstyle='select: title'/>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A window's size is changed by calling
+<xref linkend='XResizeWindow' xrefstyle='select: title'/>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A window's size and location is changed by calling
+<xref linkend='XMoveResizeWindow' xrefstyle='select: title'/>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A window is mapped and its position in the stacking order is changed
+by calling
+<xref linkend='XMapRaised' xrefstyle='select: title'/>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A window's border width is changed by calling
+<xref linkend='XSetWindowBorderWidth' xrefstyle='select: title'/>.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+To receive 
+<symbol>ConfigureNotify</symbol>
+events, set the
+<symbol>StructureNotifyMask</symbol>
+bit in the event-mask attribute of the window or the
+<symbol>SubstructureNotifyMask</symbol>
+bit in the event-mask attribute of the parent window
+(in which case, configuring any child generates an event).
+</para>
+<para>
+<!-- .LP -->
+The structure for this event type contains:
+</para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XConfigureEvent</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     int           type;       /* ConfigureNotify */
+     unsigned long serial;     /* # of last request processed by server */
+     Bool          send_event; /* true if this came from a SendEvent request */
+     Display       *display;   /* Display the event was read from */
+     Window        event;
+     Window        window;
+     int           x, y;
+     int           width, height;
+     int           border_width;
+     Window        above;
+     Bool          override_redirect;
+} XConfigureEvent;
+</literallayout>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The event member is set either to the reconfigured window or to its parent,
+depending on whether
+<systemitem class="event">StructureNotify</systemitem>
+or
+<systemitem class="event">SubstructureNotify</systemitem>
+was selected.
+The window member is set to the window whose size, position, 
+border, and/or stacking
+order was changed.
+</para>
+<para>
+<!-- .LP -->
+The x and y members are set to the coordinates relative to the parent window's 
+origin and indicate the position of the upper-left outside corner of the window.
+The width and height members are set to the inside size of the window, 
+not including
+the border.
+The border_width member is set to the width of the window's border, in pixels.
+</para>
+<para>
+<!-- .LP -->
+The above member is set to the sibling window and is used 
+for stacking operations.
+If the X server sets this member to
+<symbol>None</symbol>,
+the window whose state was changed is on the bottom of the stack
+with respect to sibling windows.
+However, if this member is set to a sibling window, 
+the window whose state was changed is placed on top of this sibling window.
+</para>
+<para>
+<!-- .LP -->
+The override_redirect member is set to the override-redirect attribute of the
+window.
+Window manager clients normally should ignore this window if the 
+override_redirect member
+is
+<symbol>True</symbol>.
+</para>
+</sect2>
+<sect2 id="CreateNotify_Events">
+<title>CreateNotify Events</title>
+<!-- .XS -->
+<!-- (SN CreateNotify Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Events</primary><secondary>CreateNotify</secondary></indexterm>
+<indexterm significance="preferred"><primary>CreateNotify</primary></indexterm>
+The X server can report
+<symbol>CreateNotify</symbol>
+events to clients wanting information about creation of windows.
+The X server generates this event whenever a client
+application creates a window by calling
+<xref linkend='XCreateWindow' xrefstyle='select: title'/>
+or
+<xref linkend='XCreateSimpleWindow' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+To receive 
+<symbol>CreateNotify</symbol>
+events, set the
+<symbol>SubstructureNotifyMask</symbol>
+bit in the event-mask attribute of the window.
+Creating any children then generates an event.
+</para>
+<para>
+<!-- .LP -->
+The structure for the event type contains:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XCreateWindowEvent</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     int           type;               /* CreateNotify */
+     unsigned long serial;             /* # of last request processed by server */
+     Bool          send_event;         /* true if this came from a SendEvent request */
+     Display       *display;           /* Display the event was read from */
+     Window        parent;             /* parent of the window */
+     Window        window;             /* window id of window created */
+     int           x, y;               /* window location */
+     int           width, height;      /* size of window */
+     int           border_width;       /* border width */
+     Bool          override_redirect;  /* creation should be overridden */
+} XCreateWindowEvent;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The parent member is set to the created window's parent.
+The window member specifies the created window.
+The x and y members are set to the created window's coordinates relative 
+to the parent window's origin and indicate the position of the upper-left 
+outside corner of the created window.
+The width and height members are set to the inside size of the created window 
+(not including the border) and are always nonzero.
+The border_width member is set to the width of the created window's border, in pixels.
+The override_redirect member is set to the override-redirect attribute of the
+window.
+Window manager clients normally should ignore this window 
+if the override_redirect member is
+<symbol>True</symbol>.
+</para>
+</sect2>
+<sect2 id="DestroyNotify_Events">
+<title>DestroyNotify Events</title>
+<!-- .XS -->
+<!-- (SN DestroyNotify Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Events</primary><secondary>DestroyNotify</secondary></indexterm>
+<indexterm significance="preferred"><primary>DestroyNotify</primary></indexterm>
+The X server can report
+<symbol>DestroyNotify</symbol>
+events to clients wanting information about which windows are destroyed.
+The X server generates this event whenever a client application destroys a 
+window by calling
+<xref linkend='XDestroyWindow' xrefstyle='select: title'/>
+or
+<xref linkend='XDestroySubwindows' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+The ordering of the 
+<symbol>DestroyNotify</symbol>
+events is such that for any given window, 
+<symbol>DestroyNotify</symbol>
+is generated on all inferiors of the window
+before being generated on the window itself.  
+The X protocol does not constrain the ordering among
+siblings and across subhierarchies.
+</para>
+<para>
+<!-- .LP -->
+To receive 
+<symbol>DestroyNotify</symbol>
+events, set the
+<symbol>StructureNotifyMask</symbol>
+bit in the event-mask attribute of the window or the
+<symbol>SubstructureNotifyMask</symbol>
+bit in the event-mask attribute of the parent window
+(in which case, destroying any child generates an event).
+</para>
+<para>
+<!-- .LP -->
+The structure for this event type contains:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XDestroyWindowEvent</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     int           type;       /* DestroyNotify */
+     unsigned long serial;     /* # of last request processed by server */
+     Bool          send_event; /* true if this came from a SendEvent request */
+     Display       *display;   /* Display the event was read from */
+     Window        event;
+     Window        window;
+} XDestroyWindowEvent;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The event member is set either to the destroyed window or to its parent,
+depending on whether
+<systemitem class="event">StructureNotify</systemitem>
+or 
+<systemitem class="event">SubstructureNotify</systemitem>
+was selected.
+The window member is set to the window that is destroyed.
+</para>
+</sect2>
+<sect2 id="GravityNotify_Events">
+<title>GravityNotify Events</title>
+<!-- .XS -->
+<!-- (SN GravityNotify Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Events</primary><secondary>GravityNotify</secondary></indexterm>
+<indexterm significance="preferred"><primary>GravityNotify</primary></indexterm>
+The X server can report
+<symbol>GravityNotify</symbol>
+events to clients wanting information about when a window is moved because of a
+change in the size of its parent.
+The X server generates this event whenever a client
+application actually moves a child window as a result of resizing its parent by calling
+<xref linkend='XConfigureWindow' xrefstyle='select: title'/>,
+<xref linkend='XMoveResizeWindow' xrefstyle='select: title'/>,
+or
+<xref linkend='XResizeWindow' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+To receive 
+<symbol>GravityNotify</symbol>
+events, set the
+<symbol>StructureNotifyMask</symbol>
+bit in the event-mask attribute of the window or the
+<symbol>SubstructureNotifyMask</symbol>
+bit in the event-mask attribute of the parent window
+(in which case, any child that is moved because its parent has been resized
+generates an event).
+</para>
+<para>
+<!-- .LP -->
+The structure for this event type contains:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XGravityEvent</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     int           type;       /* GravityNotify */
+     unsigned long serial;     /* # of last request processed by server */
+     Bool          send_event; /* true if this came from a SendEvent request */
+     Display       *display;   /* Display the event was read from */
+     Window        event;
+     Window        window;
+     int           x, y;
+} XGravityEvent;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The event member is set either to the window that was moved or to its parent,
+depending on whether
+<systemitem class="event">StructureNotify</systemitem>
+or
+<systemitem class="event">SubstructureNotify</systemitem>
+was selected.
+The window member is set to the child window that was moved.
+The x and y members are set to the coordinates relative to the 
+new parent window's origin
+and indicate the position of the upper-left outside corner of the 
+window.
+</para>
+</sect2>
+<sect2 id="MapNotify_Events">
+<title>MapNotify Events</title>
+<!-- .XS -->
+<!-- (SN MapNotify Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Events</primary><secondary>MapNotify</secondary></indexterm>
+<indexterm significance="preferred"><primary>MapNotify</primary></indexterm>
+The X server can report
+<symbol>MapNotify</symbol>
+events to clients wanting information about which windows are mapped.
+The X server generates this event type whenever a client application changes the
+window's state from unmapped to mapped by calling
+<xref linkend='XMapWindow' xrefstyle='select: title'/>,
+<xref linkend='XMapRaised' xrefstyle='select: title'/>,
+<xref linkend='XMapSubwindows' xrefstyle='select: title'/>,
+<xref linkend='XReparentWindow' xrefstyle='select: title'/>,
+or as a result of save-set processing.
+</para>
+<para>
+<!-- .LP -->
+To receive 
+<symbol>MapNotify</symbol>
+events, set the
+<symbol>StructureNotifyMask</symbol>
+bit in the event-mask attribute of the window or the
+<symbol>SubstructureNotifyMask</symbol>
+bit in the event-mask attribute of the parent window
+(in which case, mapping any child generates an event).
+</para>
+<para>
+<!-- .LP -->
+The structure for this event type contains:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XMapEvent</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     int           type;                  /* MapNotify */
+     unsigned long serial;                /* # of last request processed by server */
+     Bool          send_event;            /* true if this came from a SendEvent request */
+     Display       *display;              /* Display the event was read from */
+     Window        event;
+     Window        window;
+     Bool          override_redirect;     /* boolean, is override set... */
+} XMapEvent;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The event member is set either to the window that was mapped or to its parent,
+depending on whether
+<systemitem class="event">StructureNotify</systemitem>
+or
+<systemitem class="event">SubstructureNotify</systemitem>
+was selected.
+The window member is set to the window that was mapped.
+The override_redirect member is set to the override-redirect attribute
+of the window.
+Window manager clients normally should ignore this window 
+if the override-redirect attribute is
+<symbol>True</symbol>,
+because these events usually are generated from pop-ups,
+which override structure control.
+</para>
+</sect2>
+<sect2 id="MappingNotify_Events">
+<title>MappingNotify Events</title>
+<!-- .XS -->
+<!-- (SN MappingNotify Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Events</primary><secondary>MappingNotify</secondary></indexterm>
+<indexterm significance="preferred"><primary>MappingNotify</primary></indexterm>
+The X server reports
+<symbol>MappingNotify</symbol>
+events to all clients.
+There is no mechanism to express disinterest in this event.
+The X server generates this event type whenever a client application 
+successfully calls:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+<xref linkend='XSetModifierMapping' xrefstyle='select: title'/>
+to indicate which KeyCodes are to be used as modifiers
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XChangeKeyboardMapping' xrefstyle='select: title'/>
+to change the keyboard mapping
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<xref linkend='XSetPointerMapping' xrefstyle='select: title'/>
+to set the pointer mapping
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+The structure for this event type contains:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XMappingEvent</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     int           type;           /* MappingNotify */
+     unsigned long serial;         /* # of last request processed by server */
+     Bool          send_event;     /* true if this came from a SendEvent request */
+     Display       *display;       /* Display the event was read from */
+     Window        window;         /* unused */
+     int           request;        /* one of MappingModifier, MappingKeyboard,
+                   MappingPointer  */
+     int           first_keycode;  /* first keycode */
+     int           count;          /* defines range of change w. first_keycode*/
+} XMappingEvent;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The request member is set to indicate the kind of mapping change that occurred
+and can be
+<symbol>MappingModifier</symbol>,
+<symbol>MappingKeyboard</symbol>,
+or
+<symbol>MappingPointer</symbol>.
+If it is
+<symbol>MappingModifier</symbol>,
+the modifier mapping was changed.
+If it is
+<symbol>MappingKeyboard</symbol>,
+the keyboard mapping was changed.
+If it is
+<symbol>MappingPointer</symbol>,
+the pointer button mapping was changed. 
+The first_keycode and count members are set only 
+if the request member was set to
+<symbol>MappingKeyboard</symbol>.
+The number in first_keycode represents the first number in the range 
+of the altered mapping, 
+and count represents the number of keycodes altered.
+</para>
+<para>
+<!-- .LP -->
+To update the client application's knowledge of the keyboard,
+you should call
+<xref linkend='XRefreshKeyboardMapping' xrefstyle='select: title'/>.
+</para>
+</sect2>
+<sect2 id="ReparentNotify_Events">
+<title>ReparentNotify Events</title>
+<!-- .XS -->
+<!-- (SN ReparentNotify Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Events</primary><secondary>ReparentNotify</secondary></indexterm>
+<indexterm significance="preferred"><primary>ReparentNotify</primary></indexterm>
+The X server can report
+<symbol>ReparentNotify</symbol>
+events to clients wanting information about changing a window's parent.
+The X server generates this event whenever a client
+application calls
+<xref linkend='XReparentWindow' xrefstyle='select: title'/>
+and the window is actually reparented.
+</para>
+<para>
+<!-- .LP -->
+To receive 
+<symbol>ReparentNotify</symbol>
+events, set the
+<symbol>StructureNotifyMask</symbol>
+bit in the event-mask attribute of the window or the
+<symbol>SubstructureNotifyMask</symbol>
+bit in the event-mask attribute of either the old or the new parent window
+(in which case, reparenting any child generates an event).
+</para>
+<para>
+<!-- .LP -->
+The structure for this event type contains:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XReparentEvent</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     int           type;       /* ReparentNotify */
+     unsigned long serial;     /* # of last request processed by server */
+     Bool          send_event; /* true if this came from a SendEvent request */
+     Display       *display;   /* Display the event was read from */
+     Window        event;
+     Window        window;
+     Window        parent;
+     int           x, y;
+     Bool          override_redirect;
+} XReparentEvent;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The event member is set either to the reparented window
+or to the old or the new parent, depending on whether
+<systemitem class="event">StructureNotify</systemitem>
+or
+<systemitem class="event">SubstructureNotify</systemitem>
+was selected. 
+The window member is set to the window that was reparented.
+The parent member is set to the new parent window.
+The x and y members are set to the reparented window's coordinates relative 
+to the new parent window's
+origin and define the upper-left outer corner of the reparented window.
+The override_redirect member is set to the override-redirect attribute of the
+window specified by the window member.
+Window manager clients normally should ignore this window 
+if the override_redirect member is
+<symbol>True</symbol>.
+</para>
+</sect2>
+<sect2 id="UnmapNotify_Events">
+<title>UnmapNotify Events</title>
+<!-- .XS -->
+<!-- (SN UnmapNotify Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Events</primary><secondary>UnmapNotify</secondary></indexterm>
+<indexterm significance="preferred"><primary>UnmapNotify</primary></indexterm>
+The X server can report
+<symbol>UnmapNotify</symbol>
+events to clients wanting information about which windows are unmapped.
+The X server generates this event type whenever a client application changes the
+window's state from mapped to unmapped.
+</para>
+<para>
+<!-- .LP -->
+To receive 
+<symbol>UnmapNotify</symbol>
+events, set the
+<symbol>StructureNotifyMask</symbol>
+bit in the event-mask attribute of the window or the
+<symbol>SubstructureNotifyMask</symbol>
+bit in the event-mask attribute of the parent window
+(in which case, unmapping any child window generates an event).
+</para>
+<para>
+<!-- .LP -->
+The structure for this event type contains:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XUnmapEvent</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     int           type;       /* UnmapNotify */
+     unsigned long serial;     /* # of last request processed by server */
+     Bool          send_event; /* true if this came from a SendEvent request */
+     Display       *display;   /* Display the event was read from */
+     Window        event;
+     Window        window;
+     Bool          from_configure;
+} XUnmapEvent;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The event member is set either to the unmapped window or to its parent,
+depending on whether
+<systemitem class="event">StructureNotify</systemitem>
+or
+<systemitem class="event">SubstructureNotify</systemitem>
+was selected.
+This is the window used by the X server to report the event.
+The window member is set to the window that was unmapped.
+The from_configure member is set to
+<symbol>True</symbol>
+if the event was generated as a result of a resizing of the window's parent when
+the window itself had a win_gravity of
+<symbol>UnmapGravity</symbol>.
+</para>
+</sect2>
+<sect2 id="VisibilityNotify_Events">
+<title>VisibilityNotify Events</title>
+<!-- .XS -->
+<!-- (SN VisibilityNotify Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Events</primary><secondary>VisibilityNotify</secondary></indexterm>
+<indexterm significance="preferred"><primary>VisibilityNotify</primary></indexterm>
+The X server can report
+<symbol>VisibilityNotify</symbol>
+events to clients wanting any change in the visibility of the specified window.
+A region of a window is visible if someone looking at the screen can
+actually see it.
+The X server generates this event whenever the visibility changes state. 
+However, this event is never generated for windows whose class is
+<symbol>InputOnly</symbol>.
+</para>
+<para>
+<!-- .LP -->
+All 
+<symbol>VisibilityNotify</symbol>
+events caused by a hierarchy change are generated
+after any hierarchy event
+(<symbol>UnmapNotify</symbol>,
+<symbol>MapNotify</symbol>,
+<symbol>ConfigureNotify</symbol>,
+<symbol>GravityNotify</symbol>,
+<symbol>CirculateNotify</symbol>)
+caused by that change.  Any
+<symbol>VisibilityNotify</symbol>
+event on a given window is generated before any
+<symbol>Expose</symbol>
+events on that window, but it is not required that all
+<symbol>VisibilityNotify</symbol>
+events on all windows be generated before all 
+<symbol>Expose</symbol>
+events on all windows.  
+The X protocol does not constrain the ordering of 
+<symbol>VisibilityNotify</symbol>
+events with
+respect to 
+<symbol>FocusOut</symbol>,
+<symbol>EnterNotify</symbol>,
+and 
+<symbol>LeaveNotify</symbol>
+events.
+</para>
+<para>
+<!-- .LP -->
+To receive 
+<symbol>VisibilityNotify</symbol>
+events, set the
+<symbol>VisibilityChangeMask</symbol>
+bit in the event-mask attribute of the window. 
+</para>
+<para>
+<!-- .LP -->
+The structure for this event type contains:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XVisibilityEvent</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     int           type;       /* VisibilityNotify */
+     unsigned long serial;     /* # of last request processed by server */
+     Bool          send_event; /* true if this came from a SendEvent request */
+     Display       *display;   /* Display the event was read from */
+     Window        window;
+     int           state;
+} XVisibilityEvent;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The window member is set to the window whose visibility state changes.
+The state member is set to the state of the window's visibility and can be
+<symbol>VisibilityUnobscured</symbol>,
+<symbol>VisibilityPartiallyObscured</symbol>,
+or
+<symbol>VisibilityFullyObscured</symbol>.
+The X server ignores all of a window's subwindows
+when determining the visibility state of the window and processes 
+<symbol>VisibilityNotify</symbol>
+events according to the following:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+When the window changes state from partially obscured, fully obscured,
+or not viewable to viewable and completely unobscured,
+the X server generates the event with the state member of the
+<structname>XVisibilityEvent</structname>
+structure set to
+<symbol>VisibilityUnobscured</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+When the window changes state from viewable and completely unobscured or 
+not viewable to viewable and partially obscured,
+the X server generates the event with the state member of the
+<structname>XVisibilityEvent</structname>
+structure set to
+<symbol>VisibilityPartiallyObscured</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+When the window changes state from viewable and completely unobscured, 
+viewable and partially obscured, or not viewable to viewable and 
+fully obscured,
+the X server generates the event with the state member of the
+<structname>XVisibilityEvent</structname>
+structure set to
+<symbol>VisibilityFullyObscured</symbol>.
+    </para>
+  </listitem>
+</itemizedlist>
+</sect2>
+</sect1>
+<sect1 id="Structure_Control_Events">
+<title>Structure Control Events</title>
+<!-- .XS -->
+<!-- (SN Structure Control Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+This section discusses:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+<symbol>CirculateRequest</symbol>
+events
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<symbol>ConfigureRequest</symbol>
+events
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<symbol>MapRequest</symbol>
+events
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<symbol>ResizeRequest</symbol>
+events
+    </para>
+  </listitem>
+</itemizedlist>
+<sect2 id="CirculateRequest_Events">
+<title>CirculateRequest Events</title>
+<!-- .XS -->
+<!-- (SN CirculateRequest Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Events</primary><secondary>CirculateRequest</secondary></indexterm>
+<indexterm significance="preferred"><primary>CirculateRequest</primary></indexterm>
+The X server can report
+<symbol>CirculateRequest</symbol>
+events to clients wanting information about 
+when another client initiates a circulate window request 
+on a specified window.
+The X server generates this event type whenever a client initiates a circulate
+window request on a window and a subwindow actually needs to be restacked. 
+The client initiates a circulate window request on the window by calling
+<xref linkend='XCirculateSubwindows' xrefstyle='select: title'/>,
+<xref linkend='XCirculateSubwindowsUp' xrefstyle='select: title'/>,
+or
+<xref linkend='XCirculateSubwindowsDown' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+To receive
+<symbol>CirculateRequest</symbol>
+events, set the
+<symbol>SubstructureRedirectMask</symbol>
+in the event-mask attribute of the window. 
+Then, in the future,
+the circulate window request for the specified window is not executed,
+and thus, any subwindow's position in the stack is not changed.
+For example, suppose a client application calls
+<xref linkend='XCirculateSubwindowsUp' xrefstyle='select: title'/>
+to raise a subwindow to the top of the stack.
+If you had selected
+<symbol>SubstructureRedirectMask</symbol>
+on the window, the X server reports to you a
+<symbol>CirculateRequest</symbol>
+event and does not raise the subwindow to the top of the stack.
+</para>
+<para>
+<!-- .LP -->
+The structure for this event type contains:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XCirculateRequestEvent</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     int           type;       /* CirculateRequest */
+     unsigned long serial;     /* # of last request processed by server */
+     Bool          send_event; /* true if this came from a SendEvent request */
+     Display       *display;   /* Display the event was read from */
+     Window        parent;
+     Window        window;
+     int place;                /* PlaceOnTop, PlaceOnBottom */
+} XCirculateRequestEvent;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The parent member is set to the parent window.
+The window member is set to the subwindow to be restacked.
+The place member is set to what the new position in the stacking order should be
+and is either
+<symbol>PlaceOnTop</symbol>
+or
+<symbol>PlaceOnBottom</symbol>.
+If it is
+<symbol>PlaceOnTop</symbol>,
+the subwindow should be on top of all siblings.
+If it is
+<symbol>PlaceOnBottom</symbol>,
+the subwindow should be below all siblings.
+</para>
+</sect2>
+<sect2 id="ConfigureRequest_Events">
+<title>ConfigureRequest Events</title>
+<!-- .XS -->
+<!-- (SN ConfigureRequest Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Events</primary><secondary>ConfigureRequest</secondary></indexterm>
+<indexterm significance="preferred"><primary>ConfigureRequest</primary></indexterm>
+The X server can report
+<symbol>ConfigureRequest</symbol>
+events to clients wanting information about when a different client initiates 
+a configure window request on any child of a specified window. 
+The configure window request attempts to 
+reconfigure a window's size, position, border, and stacking order.
+The X server generates this event whenever a different client initiates
+a configure window request on a window by calling
+<xref linkend='XConfigureWindow' xrefstyle='select: title'/>,
+<xref linkend='XLowerWindow' xrefstyle='select: title'/>,
+<xref linkend='XRaiseWindow' xrefstyle='select: title'/>,
+<xref linkend='XMapRaised' xrefstyle='select: title'/>,
+<xref linkend='XMoveResizeWindow' xrefstyle='select: title'/>,
+<xref linkend='XMoveWindow' xrefstyle='select: title'/>,
+<xref linkend='XResizeWindow' xrefstyle='select: title'/>,
+<xref linkend='XRestackWindows' xrefstyle='select: title'/>,
+or
+<xref linkend='XSetWindowBorderWidth' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+To receive
+<symbol>ConfigureRequest</symbol>
+events, set the
+<symbol>SubstructureRedirectMask</symbol>
+bit in the event-mask attribute of the window. 
+<symbol>ConfigureRequest</symbol>
+events are generated when a
+<systemitem>ConfigureWindow</systemitem>
+protocol request is issued on a child window by another client.
+For example, suppose a client application calls
+<xref linkend='XLowerWindow' xrefstyle='select: title'/>
+to lower a window.
+If you had selected
+<symbol>SubstructureRedirectMask</symbol>
+on the parent window and if the override-redirect attribute 
+of the window is set to
+<symbol>False</symbol>,
+the X server reports a
+<symbol>ConfigureRequest</symbol>
+event to you and does not lower the specified window.
+</para>
+<para>
+<!-- .LP -->
+The structure for this event type contains:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XConfigureRequestEvent</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     int           type;         /* ConfigureRequest */
+     unsigned long serial;       /* # of last request processed by server */
+     Bool          send_event;   /* true if this came from a SendEvent request */
+     Display       *display;     /* Display the event was read from */
+     Window        parent;
+     Window        window;
+     int           x, y;
+     int           width, height;
+     int           border_width;
+     Window        above;
+     int           detail;       /* Above, Below, TopIf, BottomIf, Opposite */
+     unsigned long value_mask;
+} XConfigureRequestEvent;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The parent member is set to the parent window.
+The window member is set to the window whose size, position, border width, 
+and/or stacking order is to be reconfigured.
+The value_mask member indicates which components were specified in the
+<systemitem>ConfigureWindow</systemitem>
+protocol request.
+The corresponding values are reported as given in the request.
+The remaining values are filled in from the current geometry of the window,
+except in the case of above (sibling) and detail (stack-mode),
+which are reported as
+<symbol>None</symbol>
+and
+<symbol>Above</symbol>,
+respectively, if they are not given in the request.
+</para>
+</sect2>
+<sect2 id="MapRequest_Events">
+<title>MapRequest Events</title>
+<!-- .XS -->
+<!-- (SN MapRequest Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Events</primary><secondary>MapRequest</secondary></indexterm>
+<indexterm significance="preferred"><primary>MapRequest</primary></indexterm>
+The X server can report
+<symbol>MapRequest</symbol>
+events to clients wanting information about a different client's desire 
+to map windows.
+A window is considered mapped when a map window request completes.
+The X server generates this event whenever a different client initiates 
+a map window request on an unmapped window whose override_redirect member 
+is set to
+<symbol>False</symbol>.
+Clients initiate map window requests by calling
+<xref linkend='XMapWindow' xrefstyle='select: title'/>,
+<xref linkend='XMapRaised' xrefstyle='select: title'/>,
+or
+<xref linkend='XMapSubwindows' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+To receive
+<symbol>MapRequest</symbol>
+events, set the
+<symbol>SubstructureRedirectMask</symbol>
+bit in the event-mask attribute of the window. 
+This means another client's attempts to map a child window by calling one of
+the map window request functions is intercepted, and you are sent a 
+<symbol>MapRequest</symbol>
+instead.
+For example, suppose a client application calls
+<xref linkend='XMapWindow' xrefstyle='select: title'/>
+to map a window.
+If you (usually a window manager) had selected
+<symbol>SubstructureRedirectMask</symbol>
+on the parent window and if the override-redirect attribute 
+of the window is set to
+<symbol>False</symbol>,
+the X server reports a
+<symbol>MapRequest</symbol>
+event to you 
+and does not map the specified window.
+Thus, this event gives your window manager client the ability 
+to control the placement of subwindows.
+</para>
+<para>
+<!-- .LP -->
+The structure for this event type contains:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XMapRequestEvent</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     int           type;       /* MapRequest */
+     unsigned long serial;     /* # of last request processed by server */
+     Bool          send_event; /* true if this came from a SendEvent request */
+     Display       *display;   /* Display the event was read from */
+     Window        parent;
+     Window        window;
+} XMapRequestEvent;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The parent member is set to the parent window.
+The window member is set to the window to be mapped.
+</para>
+</sect2>
+<sect2 id="ResizeRequest_Events">
+<title>ResizeRequest Events</title>
+<!-- .XS -->
+<!-- (SN ResizeRequest Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Events</primary><secondary>ResizeRequest</secondary></indexterm>
+<indexterm significance="preferred"><primary>ResizeRequest</primary></indexterm>
+The X server can report
+<symbol>ResizeRequest</symbol>
+events to clients wanting information about another client's attempts to change the
+size of a window.
+The X server generates this event whenever some other client attempts to change
+the size of the specified window by calling
+<xref linkend='XConfigureWindow' xrefstyle='select: title'/>,
+<xref linkend='XResizeWindow' xrefstyle='select: title'/>,
+or
+<xref linkend='XMoveResizeWindow' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+To receive
+<symbol>ResizeRequest</symbol>
+events, set the
+<symbol>ResizeRedirect</symbol>
+bit in the event-mask attribute of the window. 
+Any attempts to change the size by other clients are then redirected.
+</para>
+<para>
+<!-- .LP -->
+The structure for this event type contains:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XResizeRequestEvent</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     int           type;        /* ResizeRequest */
+     unsigned long serial;      /* # of last request processed by server */
+     Bool          send_event;  /* true if this came from a SendEvent request */
+     Display       *display;    /* Display the event was read from */
+     Window        window;
+     int           width, height;
+} XResizeRequestEvent;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The window member is set to the window whose size another 
+client attempted to change.
+The width and height members are set to the inside size of the window, 
+excluding the border.
+</para>
+</sect2>
+</sect1>
+<sect1 id="Colormap_State_Change_Events">
+<title>Colormap State Change Events</title>
+<!-- .XS -->
+<!-- (SN Colormap State Change Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Events</primary><secondary>ColormapNotify</secondary></indexterm>
+<indexterm significance="preferred"><primary>ColormapNotify</primary></indexterm>
+The X server can report
+<symbol>ColormapNotify</symbol>
+events to clients wanting information about when the colormap changes 
+and when a colormap is installed or uninstalled. 
+The X server generates this event type whenever a client application:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+Changes the colormap member of the
+<structname>XSetWindowAttributes</structname>
+structure by 
+calling
+<xref linkend='XChangeWindowAttributes' xrefstyle='select: title'/>,
+<xref linkend='XFreeColormap' xrefstyle='select: title'/>,
+or
+<xref linkend='XSetWindowColormap' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Installs or uninstalls the colormap by calling
+<xref linkend='XInstallColormap' xrefstyle='select: title'/>
+or
+<xref linkend='XUninstallColormap' xrefstyle='select: title'/>
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+To receive 
+<symbol>ColormapNotify</symbol>
+events, set the
+<symbol>ColormapChangeMask</symbol>
+bit in the event-mask attribute of the window. 
+</para>
+<para>
+<!-- .LP -->
+The structure for this event type contains:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XColormapEvent</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     int           type;       /* ColormapNotify */
+     unsigned long serial;     /* # of last request processed by server */
+     Bool          send_event; /* true if this came from a SendEvent request */
+     Display       *display;   /* Display the event was read from */
+     Window        window;
+     Colormap      colormap;   /* colormap or None */
+     Bool          new;
+     int           state;      /* ColormapInstalled, ColormapUninstalled */
+} XColormapEvent;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The window member is set to the window whose associated 
+colormap is changed, installed, or uninstalled.
+For a colormap that is changed, installed, or uninstalled,
+the colormap member is set to the colormap associated with the window. 
+For a colormap that is changed by a call to
+<xref linkend='XFreeColormap' xrefstyle='select: title'/>,
+the colormap member is set to
+<symbol>None</symbol>.
+The new member is set to indicate whether the colormap 
+for the specified window was changed or installed or uninstalled
+and can be 
+<symbol>True</symbol>
+or
+<symbol>False</symbol>.
+If it is
+<symbol>True</symbol>,
+the colormap was changed.
+If it is
+<symbol>False</symbol>,
+the colormap was installed or uninstalled.
+The state member is always set to indicate whether the colormap is installed or
+uninstalled and can be 
+<symbol>ColormapInstalled</symbol>
+or
+<symbol>ColormapUninstalled</symbol>.
+</para>
+</sect1>
+<sect1 id="Client_Communication_Events">
+<title>Client Communication Events</title>
+<!-- .XS -->
+<!-- (SN Client Communication Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+This section discusses:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+<symbol>ClientMessage</symbol>
+events
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<symbol>PropertyNotify</symbol>
+events
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<symbol>SelectionClear</symbol>
+events
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<symbol>SelectionNotify</symbol>
+events
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<symbol>SelectionRequest</symbol>
+events
+    </para>
+  </listitem>
+</itemizedlist>
+<sect2 id="ClientMessage_Events">
+<title>ClientMessage Events</title>
+<!-- .XS -->
+<!-- (SN ClientMessage Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Events</primary><secondary>ClientMessage</secondary></indexterm>
+<indexterm significance="preferred"><primary>ClientMessage</primary></indexterm>
+The X server generates
+<symbol>ClientMessage</symbol>
+events only when a client calls the function
+<xref linkend='XSendEvent' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+The structure for this event type contains:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XClientMessageEvent</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 1i 3i -->
+<!-- .ta .5i 1i 3i -->
+typedef struct {
+     int           type;           /* ClientMessage */
+     unsigned long serial;         /* # of last request processed by server */
+     Bool          send_event;     /* true if this came from a SendEvent request */
+     Display       *display;       /* Display the event was read from */
+     Window        window;
+     Atom          message_type;
+     int           format;
+     union         {
+                     char  b[20];
+                     short s[10];
+                     long  l[5];
+                   } data;
+} XClientMessageEvent;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The message_type member is set to an atom that indicates how the data 
+should be interpreted by the receiving client.
+The format member is set to 8, 16, or 32 and specifies whether the data
+should be viewed as a list of bytes, shorts, or longs.
+The data member is a union that contains the members b, s, and l.
+The b, s, and l members represent data of twenty 8-bit values, 
+ten 16-bit values, and five 32-bit values.
+Particular message types might not make use of all these values.
+The X server places no interpretation on the values in the window,
+message_type, or data members.
+</para>
+</sect2>
+<sect2 id="PropertyNotify_Events">
+<title>PropertyNotify Events</title>
+<!-- .XS -->
+<!-- (SN PropertyNotify Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Events</primary><secondary>PropertyNotify</secondary></indexterm>
+<indexterm significance="preferred"><primary>PropertyNotify</primary></indexterm>
+The X server can report
+<symbol>PropertyNotify</symbol>
+events to clients wanting information about property changes 
+for a specified window.
+</para>
+<para>
+<!-- .LP -->
+To receive
+<symbol>PropertyNotify</symbol>
+events, set the
+<symbol>PropertyChangeMask</symbol>
+bit in the event-mask attribute of the window. 
+</para>
+<para>
+<!-- .LP -->
+The structure for this event type contains:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XPropertyEvent</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     int           type;       /* PropertyNotify */
+     unsigned long serial;     /* # of last request processed by server */
+     Bool          send_event; /* true if this came from a SendEvent request */
+     Display       *display;   /* Display the event was read from */
+     Window        window;
+     Atom atom;
+     Time time;
+     int state;                /* PropertyNewValue or PropertyDelete */
+} XPropertyEvent;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The window member is set to the window whose associated 
+property was changed.
+The atom member is set to the property's atom and indicates which
+property was changed or desired.
+The time member is set to the server time when the property was changed.
+The state member is set to indicate whether the property was changed 
+to a new value or deleted and can be
+<symbol>PropertyNewValue</symbol>
+or
+<symbol>PropertyDelete</symbol>.
+The state member is set to
+<symbol>PropertyNewValue</symbol>
+when a property of the window is changed using
+<xref linkend='XChangeProperty' xrefstyle='select: title'/>
+or
+<xref linkend='XRotateWindowProperties' xrefstyle='select: title'/>
+(even when adding zero-length data using
+<xref linkend='XChangeProperty' xrefstyle='select: title'/>)
+and when replacing all or part of a property with identical data using
+<xref linkend='XChangeProperty' xrefstyle='select: title'/>
+or 
+<xref linkend='XRotateWindowProperties' xrefstyle='select: title'/>.
+The state member is set to
+<symbol>PropertyDelete</symbol>
+when a property of the window is deleted using
+<xref linkend='XDeleteProperty' xrefstyle='select: title'/>
+or, if the delete argument is 
+<symbol>True</symbol>,
+<xref linkend='XGetWindowProperty' xrefstyle='select: title'/>.
+</para>
+</sect2>
+<sect2 id="SelectionClear_Events">
+<title>SelectionClear Events</title>
+<!-- .XS -->
+<!-- (SN SelectionClear Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm ><primary>Events</primary><secondary>SelectionClear</secondary></indexterm>
+<indexterm significance="preferred"><primary>SelectionClear</primary></indexterm>
+The X server reports
+<symbol>SelectionClear</symbol>
+events to the client losing ownership of a selection.
+The X server generates this event type when another client
+asserts ownership of the selection by calling
+<xref linkend='XSetSelectionOwner' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+The structure for this event type contains:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XSelectionClearEvent</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     int           type;       /* SelectionClear */
+     unsigned long serial;     /* # of last request processed by server */
+     Bool          send_event; /* true if this came from a SendEvent request */
+     Display       *display;   /* Display the event was read from */
+     Window        window;
+     Atom          selection;
+     Time          time;
+} XSelectionClearEvent;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The selection member is set to the selection atom.
+The time member is set to the last change time recorded for the 
+selection.
+The window member is the window that was specified by the current owner
+(the owner losing the selection) in its
+<xref linkend='XSetSelectionOwner' xrefstyle='select: title'/>
+call.
+</para>
+</sect2>
+<sect2 id="SelectionRequest_Events">
+<title>SelectionRequest Events</title>
+<!-- .XS -->
+<!-- (SN SelectionRequest Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Events</primary><secondary>SelectionRequest</secondary></indexterm>
+<indexterm significance="preferred"><primary>SelectionRequest</primary></indexterm>
+The X server reports
+<symbol>SelectionRequest</symbol>
+events to the owner of a selection.
+The X server generates this event whenever a client 
+requests a selection conversion by calling 
+<xref linkend='XConvertSelection' xrefstyle='select: title'/>
+for the owned selection.
+</para>
+<para>
+<!-- .LP -->
+The structure for this event type contains:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XSelectionRequestEvent</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     int           type;       /* SelectionRequest */
+     unsigned long serial;     /* # of last request processed by server */
+     Bool          send_event; /* true if this came from a SendEvent request */
+     Display       *display;   /* Display the event was read from */
+     Window        owner;
+     Window        requestor;
+     Atom          selection;
+     Atom          target;
+     Atom          property;
+     Time          time;
+} XSelectionRequestEvent;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The owner member is set to the window
+that was specified by the current owner in its
+<xref linkend='XSetSelectionOwner' xrefstyle='select: title'/>
+call.
+The requestor member is set to the window requesting the selection.
+The selection member is set to the atom that names the selection.
+For example, PRIMARY is used to indicate the primary selection.
+The target member is set to the atom that indicates the type
+the selection is desired in.
+The property member can be a property name or 
+<symbol>None</symbol>.
+The time member is set to the timestamp or 
+<symbol>CurrentTime</symbol>
+value from the
+<systemitem>ConvertSelection</systemitem>
+request.
+</para>
+<para>
+<!-- .LP -->
+The owner should convert the selection based on the specified target type
+and send a
+<symbol>SelectionNotify</symbol>
+event back to the requestor.
+A <olink targetdoc='icccm'
+targetptr='Peer_to_Peer_Communication_by_Means_of_Selections'>complete
+specification for using selections</olink> is given in the X Consortium
+standard <citetitle>Inter-Client Communication Conventions Manual</citetitle>.
+</para>
+</sect2>
+<sect2 id="SelectionNotify_Events">
+<title>SelectionNotify Events</title>
+<!-- .XS -->
+<!-- (SN SelectionNotify Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Events</primary><secondary>SelectionNotify</secondary></indexterm>
+<indexterm significance="preferred"><primary>SelectionNotify</primary></indexterm>
+This event is generated by the X server in response to a
+<systemitem>ConvertSelection</systemitem>
+protocol request when there is no owner for the selection.
+When there is an owner, it should be generated by the owner
+of the selection by using
+<xref linkend='XSendEvent' xrefstyle='select: title'/>.
+The owner of a selection should send this event to a requestor when a selection
+has been converted and stored as a property
+or when a selection conversion could
+not be performed (which is indicated by setting the property member to
+<symbol>None</symbol>).
+</para>
+<para>
+<!-- .LP -->
+If
+<symbol>None</symbol>
+is specified as the property in the 
+<systemitem>ConvertSelection</systemitem>
+protocol request, the owner should choose a property name,
+store the result as that property on the requestor window,
+and then send a 
+<symbol>SelectionNotify</symbol>
+giving that actual property name.
+</para>
+<para>
+<!-- .LP -->
+The structure for this event type contains:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XSelectionEvent</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     int           type;       /* SelectionNotify */
+     unsigned long serial;     /* # of last request processed by server */
+     Bool          send_event; /* true if this came from a SendEvent request */
+     Display       *display;   /* Display the event was read from */
+     Window        requestor;
+     Atom          selection;
+     Atom          target;
+     Atom          property;   /* atom or None */
+     Time          time;
+} XSelectionEvent;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The requestor member is set to the window associated with
+the requestor of the selection.
+The selection member is set to the atom that indicates the selection.
+For example, PRIMARY is used for the primary selection.
+The target member is set to the atom that indicates the converted type.
+For example, PIXMAP is used for a pixmap.
+The property member is set to the atom that indicates which
+property the result was stored on.
+If the conversion failed, 
+the property member is set to
+<symbol>None</symbol>.
+The time member is set to the time the conversion took place and
+can be a timestamp or
+<symbol>CurrentTime</symbol>.
+<!-- .bp -->
+
+
+</para>
+</sect2>
+</sect1>
+</chapter>
diff --git a/specs/libX11/CH11.xml b/specs/libX11/CH11.xml
new file mode 100644 (file)
index 0000000..001e05d
--- /dev/null
@@ -0,0 +1,2522 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+         "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
+<chapter id='Event_Handling_Functions'>
+<title>Event Handling Functions</title>
+
+<para>
+This chapter discusses the Xlib functions you can use to:
+</para>
+<itemizedlist>
+  <listitem><para>Select events</para></listitem>
+  <listitem><para>Handle the output buffer and the event queue</para></listitem>
+  <listitem><para>Select events from the event queue</para></listitem>
+  <listitem><para>Send and get events</para></listitem>
+  <listitem><para>Handle protocol errors</para></listitem>
+</itemizedlist>
+<note><para>
+Some toolkits use their own event-handling functions and do not allow you to
+interchange these event-handling functions with those in Xlib. For further
+information, see the documentation supplied with the toolkit.
+</para></note>
+
+<para>
+Most applications simply are event loops: they wait for an event, decide what to do with it,
+execute some amount of code that results in changes to the display, and then wait for the next
+event.
+</para>
+
+<sect1 id="Selecting_Events">
+<title>Selecting Events</title>
+<!-- .XS -->
+<!-- (SN Selecting Events  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+There are two ways to select the events you want reported to your client
+application.
+One way is to set the event_mask member of the
+<structname>XSetWindowAttributes</structname>
+structure when you call
+<xref linkend='XCreateWindow' xrefstyle='select: title'/>
+and
+<xref linkend='XChangeWindowAttributes' xrefstyle='select: title'/>.
+Another way is to use
+<xref linkend='XSelectInput' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSelectInput</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSelectInput'>
+<funcprototype>
+  <funcdef><function>XSelectInput</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>long<parameter> event_mask</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN        -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Wi whose events you are interested in -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window (Wi.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event_mask</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the event mask.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XSelectInput' xrefstyle='select: title'/>
+function requests that the X server report the events associated with the 
+specified event mask.
+Initially, X will not report any of these events.
+Events are reported relative to a window.
+If a window is not interested in a device event, it usually propagates to
+the closest ancestor that is interested,
+unless the do_not_propagate mask prohibits it.
+<indexterm><primary>Event</primary><secondary>propagation</secondary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+Setting the event-mask attribute of a window overrides any previous call
+for the same window but not for other clients.
+Multiple clients can select for the same events on the same window
+with the following restrictions:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+Multiple clients can select events on the same window because their event masks
+are disjoint.
+When the X server generates an event, it reports it
+to all interested clients.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Only one client at a time can select
+<symbol>CirculateRequest</symbol>,
+<symbol>ConfigureRequest</symbol>,
+or
+<symbol>MapRequest</symbol>
+events, which are associated with
+the event mask
+<symbol>SubstructureRedirectMask</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Only one client at a time can select
+a
+<symbol>ResizeRequest</symbol>
+event, which is associated with
+the event mask
+<symbol>ResizeRedirectMask</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Only one client at a time can select a 
+<symbol>ButtonPress</symbol>
+event, which is associated with
+the event mask
+<symbol>ButtonPressMask</symbol>.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+The server reports the event to all interested clients.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSelectInput' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+</sect1>
+<sect1 id="Handling_the_Output_Buffer">
+<title>Handling the Output Buffer</title>
+<!-- .XS -->
+<!-- (SN Handling the Output Buffer -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The output buffer is an area used by Xlib to store requests.
+The functions described in this section flush the output buffer
+if the function would block or not return an event.
+That is, all requests residing in the output buffer that
+have not yet been sent are transmitted to the X server.
+These functions differ in the additional tasks they might perform.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To flush the output buffer, use 
+<xref linkend='XFlush' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XFlush</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XFlush'>
+<funcprototype>
+  <funcdef><function>XFlush</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XFlush' xrefstyle='select: title'/>
+function
+flushes the output buffer.
+Most client applications need not use this function because the output
+buffer is automatically flushed as needed by calls to
+<xref linkend='XPending' xrefstyle='select: title'/>,
+<xref linkend='XNextEvent' xrefstyle='select: title'/>,
+and
+<xref linkend='XWindowEvent' xrefstyle='select: title'/>.
+<indexterm><primary>XPending</primary></indexterm>
+<indexterm><primary>XNextEvent</primary></indexterm>
+<indexterm><primary>XWindowEvent</primary></indexterm>
+Events generated by the server may be enqueued into the library's event queue.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To flush the output buffer and then wait until all requests have been processed,
+use 
+<xref linkend='XSync' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSync</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSync'>
+<funcprototype>
+  <funcdef><function>XSync</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Bool<parameter> discard</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>discard</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a Boolean value that indicates whether 
+<xref linkend='XSync' xrefstyle='select: title'/>
+discards all events on the event queue.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSync' xrefstyle='select: title'/>
+function
+flushes the output buffer and then waits until all requests have been received
+and processed by the X server.
+Any errors generated must be handled by the error handler.
+For each protocol error received by Xlib,
+<xref linkend='XSync' xrefstyle='select: title'/>
+calls the client application's error handling routine
+(see <link linkend="Using_the_Default_Error_Handlers">section 11.8.2</link>).
+Any events generated by the server are enqueued into the library's 
+event queue.
+</para>
+<para>
+<!-- .LP -->
+Finally, if you passed 
+<symbol>False</symbol>,
+<xref linkend='XSync' xrefstyle='select: title'/>
+does not discard the events in the queue.
+If you passed 
+<symbol>True</symbol>,
+<xref linkend='XSync' xrefstyle='select: title'/>
+discards all events in the queue,
+including those events that were on the queue before
+<xref linkend='XSync' xrefstyle='select: title'/>
+was called.
+Client applications seldom need to call
+<xref linkend='XSync' xrefstyle='select: title'/>.
+</para>
+</sect1>
+<sect1 id="Event_Queue_Management">
+<title>Event Queue Management</title>
+<!-- .XS -->
+<!-- (SN Event Queue Management -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib maintains an event queue.
+However, the operating system also may be buffering data 
+in its network connection that is not yet read into the event queue.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To check the number of events in the event queue, use
+<xref linkend='XEventsQueued' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XEventsQueued</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XEventsQueued'>
+<funcprototype>
+  <funcdef>int <function>XEventsQueued</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> mode</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>mode</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the mode.
+You can pass
+<symbol>QueuedAlready</symbol>,
+<symbol>QueuedAfterFlush</symbol>,
+or
+<symbol>QueuedAfterReading</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+If mode is 
+<symbol>QueuedAlready</symbol>,
+<xref linkend='XEventsQueued' xrefstyle='select: title'/>
+returns the number of events
+already in the event queue (and never performs a system call).
+If mode is 
+<symbol>QueuedAfterFlush</symbol>,
+<xref linkend='XEventsQueued' xrefstyle='select: title'/>
+returns the number of events already in the queue if the number is nonzero.
+If there are no events in the queue, 
+<xref linkend='XEventsQueued' xrefstyle='select: title'/>
+flushes the output buffer, 
+attempts to read more events out of the application's connection,
+and returns the number read.
+If mode is 
+<symbol>QueuedAfterReading</symbol>,
+<xref linkend='XEventsQueued' xrefstyle='select: title'/>
+returns the number of events already in the queue if the number is nonzero. 
+If there are no events in the queue, 
+<xref linkend='XEventsQueued' xrefstyle='select: title'/>
+attempts to read more events out of the application's connection 
+without flushing the output buffer and returns the number read.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XEventsQueued' xrefstyle='select: title'/>
+always returns immediately without I/O if there are events already in the
+queue.
+<xref linkend='XEventsQueued' xrefstyle='select: title'/>
+with mode 
+<symbol>QueuedAfterFlush</symbol>
+is identical in behavior to
+<xref linkend='XPending' xrefstyle='select: title'/>.
+<xref linkend='XEventsQueued' xrefstyle='select: title'/>
+with mode
+<symbol>QueuedAlready</symbol>
+is identical to the
+<xref linkend='XQLength' xrefstyle='select: title'/>
+function.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To return the number of events that are pending, use 
+<xref linkend='XPending' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XPending</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XPending'>
+<funcprototype>
+  <funcdef>int <function>XPending</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN        -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XPending' xrefstyle='select: title'/>
+function returns the number of events that have been received from the
+X server but have not been removed from the event queue.
+<xref linkend='XPending' xrefstyle='select: title'/>
+is identical to
+<xref linkend='XEventsQueued' xrefstyle='select: title'/>
+with the mode
+<symbol>QueuedAfterFlush</symbol>
+specified.
+</para>
+</sect1>
+<sect1 id="Manipulating_the_Event_Queue">
+<title>Manipulating the Event Queue</title>
+<!-- .XS -->
+<!-- (SN Manipulating the Event Queue  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that let you manipulate the event queue.
+This section discusses how to:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+Obtain events, in order, and remove them from the queue
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Peek at events in the queue without removing them
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Obtain events that match the event mask or the arbitrary
+predicate procedures that you provide
+    </para>
+  </listitem>
+</itemizedlist>
+<sect2 id="Returning_the_Next_Event">
+<title>Returning the Next Event</title>
+<!-- .XS -->
+<!-- (SN Returning the Next Event -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To get the next event and remove it from the queue, use
+<xref linkend='XNextEvent' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XNextEvent</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XNextEvent'>
+<funcprototype>
+  <funcdef><function>XNextEvent</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XEvent<parameter> *event_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the next event in the queue.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XNextEvent' xrefstyle='select: title'/>
+function copies the first event from the event queue into the specified
+<structname>XEvent</structname>
+structure and then removes it from the queue.
+If the event queue is empty,
+<xref linkend='XNextEvent' xrefstyle='select: title'/>
+flushes the output buffer and blocks until an event is received.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To peek at the event queue, use
+<xref linkend='XPeekEvent' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XPeekEvent</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XPeekEvent'>
+<funcprototype>
+  <funcdef><function>XPeekEvent</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XEvent<parameter> *event_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns a copy of the matched event's associated structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XPeekEvent' xrefstyle='select: title'/>
+function returns the first event from the event queue,
+but it does not remove the event from the queue.
+If the queue is empty,
+<xref linkend='XPeekEvent' xrefstyle='select: title'/>
+flushes the output buffer and blocks until an event is received.
+It then copies the event into the client-supplied
+<structname>XEvent</structname>
+structure without removing it from the event queue.
+</para>
+</sect2>
+<sect2 id="Selecting_Events_Using_a_Predicate_Procedure">
+<title>Selecting Events Using a Predicate Procedure</title>
+<!-- .XS -->
+<!-- (SN Selecting Events Using a Predicate Procedure -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Each of the functions discussed in this section requires you to
+pass a predicate procedure that determines if an event matches 
+what you want.
+Your predicate procedure must decide if the event is useful
+without calling any Xlib functions.
+If the predicate directly or indirectly causes the state of the event queue
+to change, the result is not defined.
+If Xlib has been initialized for threads, the predicate is called with
+the display locked and the result of a call by the predicate to any
+Xlib function that locks the display is not defined unless the caller
+has first called
+<function>XLockDisplay</function>.
+</para>
+<para>
+<!-- .LP -->
+The predicate procedure and its associated arguments are:
+</para>
+<!-- .sM -->
+<funcsynopsis>
+<funcprototype>
+  <funcdef><type>Bool</type></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XEvent<parameter> *event</parameter></paramdef>
+  <paramdef>XPointer<parameter> arg</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the
+<structname>XEvent</structname>
+structure.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>arg</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the argument passed in from the 
+<xref linkend='XIfEvent' xrefstyle='select: title'/>,
+<xref linkend='XCheckIfEvent' xrefstyle='select: title'/>,
+or
+<xref linkend='XPeekIfEvent' xrefstyle='select: title'/>
+function.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The predicate procedure is called once for each
+event in the queue until it finds a match. 
+After finding a match, the predicate procedure must return 
+<symbol>True</symbol>.
+If it did not find a match, it must return
+<symbol>False</symbol>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To check the event queue for a matching event
+and, if found, remove the event from the queue, use
+<xref linkend='XIfEvent' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XIfEvent</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XIfEvent'>
+<funcprototype>
+  <funcdef><function>XIfEvent</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XEvent<parameter> *event_return</parameter></paramdef>
+  <paramdef>Bool<parameter> (*predicate)()</parameter></paramdef>
+  <paramdef>XPointer<parameter> arg</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the matched event's associated structure.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>predicate</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the procedure that is to be called to determine
+if the next event in the queue matches what you want.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>arg</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the user-supplied argument that will be passed to the predicate procedure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XIfEvent' xrefstyle='select: title'/>
+function completes only when the specified predicate
+procedure returns 
+<symbol>True</symbol>
+for an event, 
+which indicates an event in the queue matches.
+<xref linkend='XIfEvent' xrefstyle='select: title'/>
+flushes the output buffer if it blocks waiting for additional events.
+<xref linkend='XIfEvent' xrefstyle='select: title'/>
+removes the matching event from the queue 
+and copies the structure into the client-supplied
+<structname>XEvent</structname>
+structure.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To check the event queue for a matching event without blocking, use
+<xref linkend='XCheckIfEvent' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XCheckIfEvent</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XCheckIfEvent'>
+<funcprototype>
+  <funcdef>Bool <function>XCheckIfEvent</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XEvent<parameter> *event_return</parameter></paramdef>
+  <paramdef>Bool<parameter> (*predicate)()</parameter></paramdef>
+  <paramdef>XPointer<parameter> arg</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns a copy of the matched event's associated structure.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>predicate</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the procedure that is to be called to determine
+if the next event in the queue matches what you want.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>arg</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the user-supplied argument that will be passed to the predicate procedure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+When the predicate procedure finds a match,
+<xref linkend='XCheckIfEvent' xrefstyle='select: title'/>
+copies the matched event into the client-supplied
+<structname>XEvent</structname>
+structure and returns 
+<symbol>True</symbol>.
+(This event is removed from the queue.)
+If the predicate procedure finds no match,
+<xref linkend='XCheckIfEvent' xrefstyle='select: title'/>
+returns
+<symbol>False</symbol>,
+and the output buffer will have been flushed.
+All earlier events stored in the queue are not discarded.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To check the event queue for a matching event
+without removing the event from the queue, use
+<xref linkend='XPeekIfEvent' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XPeekIfEvent</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XPeekIfEvent'>
+<funcprototype>
+  <funcdef><function>XPeekIfEvent</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XEvent<parameter> *event_return</parameter></paramdef>
+  <paramdef>Bool<parameter> (*predicate)()</parameter></paramdef>
+  <paramdef>XPointer<parameter> arg</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns a copy of the matched event's associated structure.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>predicate</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the procedure that is to be called to determine
+if the next event in the queue matches what you want.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>arg</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the user-supplied argument that will be passed to the predicate procedure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XPeekIfEvent' xrefstyle='select: title'/>
+function returns only when the specified predicate
+procedure returns 
+<symbol>True</symbol>
+for an event.
+After the predicate procedure finds a match,
+<xref linkend='XPeekIfEvent' xrefstyle='select: title'/>
+copies the matched event into the client-supplied
+<structname>XEvent</structname>
+structure without removing the event from the queue.
+<xref linkend='XPeekIfEvent' xrefstyle='select: title'/>
+flushes the output buffer if it blocks waiting for additional events.
+</para>
+</sect2>
+<sect2 id="Selecting_Events_Using_a_Window_or_Event_Mask">
+<title>Selecting Events Using a Window or Event Mask</title>
+<!-- .XS -->
+<!-- (SN Selecting Events Using a Window or Event Mask -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The functions discussed in this section let you select events by window 
+or event types, allowing you to process events out of order.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To remove the next event that matches both a window and an event mask, use
+<xref linkend='XWindowEvent' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XWindowEvent</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XWindowEvent'>
+<funcprototype>
+  <funcdef><function>XWindowEvent</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>long<parameter> event_mask</parameter></paramdef>
+  <paramdef>XEvent<parameter> *event_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Wi whose events you are interested in -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window (Wi.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event_mask</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the event mask.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the matched event's associated structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XWindowEvent' xrefstyle='select: title'/>
+function searches the event queue for an event that matches both the specified
+window and event mask.
+When it finds a match,
+<xref linkend='XWindowEvent' xrefstyle='select: title'/>
+removes that event from the queue and copies it into the specified
+<structname>XEvent</structname>
+structure.
+The other events stored in the queue are not discarded.
+If a matching event is not in the queue,
+<xref linkend='XWindowEvent' xrefstyle='select: title'/>
+flushes the output buffer and blocks until one is received.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To remove the next event that matches both a window and an event mask (if any),
+use
+<xref linkend='XCheckWindowEvent' xrefstyle='select: title'/>.
+<indexterm><primary>XCheckWindowEvent</primary></indexterm>
+This function is similar to
+<xref linkend='XWindowEvent' xrefstyle='select: title'/>
+except that it never blocks and it returns a 
+<type>Bool</type>
+indicating if the event was returned.
+</para>
+<indexterm significance="preferred"><primary>XCheckWindowEvent</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XCheckWindowEvent'>
+<funcprototype>
+  <funcdef>Bool <function>XCheckWindowEvent</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>long<parameter> event_mask</parameter></paramdef>
+  <paramdef>XEvent<parameter> *event_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Wi whose events you are interested in -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window (Wi.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event_mask</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the event mask.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the matched event's associated structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XCheckWindowEvent' xrefstyle='select: title'/>
+function searches the event queue and then the events available 
+on the server connection for the first event that matches the specified window
+and event mask.
+If it finds a match,
+<xref linkend='XCheckWindowEvent' xrefstyle='select: title'/>
+removes that event, copies it into the specified
+<structname>XEvent</structname>
+structure, and returns
+<symbol>True</symbol>.
+The other events stored in the queue are not discarded.
+If the event you requested is not available,
+<xref linkend='XCheckWindowEvent' xrefstyle='select: title'/>
+returns
+<symbol>False</symbol>,
+and the output buffer will have been flushed.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To remove the next event that matches an event mask, use
+<xref linkend='XMaskEvent' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XMaskEvent</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XMaskEvent'>
+<funcprototype>
+  <funcdef><function>XMaskEvent</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>long<parameter> event_mask</parameter></paramdef>
+  <paramdef>XEvent<parameter> *event_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event_mask</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the event mask.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the matched event's associated structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XMaskEvent' xrefstyle='select: title'/>
+function searches the event queue for the events associated with the 
+specified mask.
+When it finds a match,
+<xref linkend='XMaskEvent' xrefstyle='select: title'/>
+removes that event and copies it into the specified
+<structname>XEvent</structname>
+structure.
+The other events stored in the queue are not discarded.
+If the event you requested is not in the queue,
+<xref linkend='XMaskEvent' xrefstyle='select: title'/>
+flushes the output buffer and blocks until one is received.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To return and remove the next event that matches an event mask (if any), use
+<xref linkend='XCheckMaskEvent' xrefstyle='select: title'/>.
+This function is similar to 
+<xref linkend='XMaskEvent' xrefstyle='select: title'/>
+except that it never blocks and it returns a 
+<type>Bool</type>
+indicating if the event was returned.
+</para>
+<indexterm significance="preferred"><primary>XCheckMaskEvent</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XCheckMaskEvent'>
+<funcprototype>
+  <funcdef>Bool <function>XCheckMaskEvent</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>long<parameter> event_mask</parameter></paramdef>
+  <paramdef>XEvent<parameter> *event_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event_mask</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the event mask.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the matched event's associated structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XCheckMaskEvent' xrefstyle='select: title'/>
+function searches the event queue and then any events available on the
+server connection for the first event that matches the specified mask.
+If it finds a match,
+<xref linkend='XCheckMaskEvent' xrefstyle='select: title'/>
+removes that event, copies it into the specified
+<structname>XEvent</structname>
+structure, and returns
+<symbol>True</symbol>.
+The other events stored in the queue are not discarded.
+If the event you requested is not available,
+<xref linkend='XCheckMaskEvent' xrefstyle='select: title'/>
+returns
+<symbol>False</symbol>,
+and the output buffer will have been flushed.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp  -->
+To return and remove the next event in the queue that matches an event type, use
+<xref linkend='XCheckTypedEvent' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XCheckTypedEvent</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XCheckTypedEvent'>
+<funcprototype>
+  <funcdef>Bool <function>XCheckTypedEvent</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> event_type</parameter></paramdef>
+  <paramdef>XEvent<parameter> *event_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event_type</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the event type to be compared.
+
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the matched event's associated structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XCheckTypedEvent' xrefstyle='select: title'/>
+function searches the event queue and then any events available  
+on the server connection for the first event that matches the specified type.
+If it finds a match,
+<xref linkend='XCheckTypedEvent' xrefstyle='select: title'/>
+removes that event, copies it into the specified
+<structname>XEvent</structname>
+structure, and returns
+<symbol>True</symbol>.
+The other events in the queue are not discarded.
+If the event is not available,
+<xref linkend='XCheckTypedEvent' xrefstyle='select: title'/>
+returns
+<symbol>False</symbol>,
+and the output buffer will have been flushed.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To return and remove the next event in the queue that matches an event type 
+and a window, use
+<xref linkend='XCheckTypedWindowEvent' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XCheckTypedWindowEvent</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XCheckTypedWindowEvent'>
+<funcprototype>
+  <funcdef>Bool <function>XCheckTypedWindowEvent</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>int<parameter> event_type</parameter></paramdef>
+  <paramdef>XEvent<parameter> *event_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event_type</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the event type to be compared.
+
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the matched event's associated structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XCheckTypedWindowEvent' xrefstyle='select: title'/>
+function searches the event queue and then any events available  
+on the server connection for the first event that matches the specified
+type and window.
+If it finds a match,
+<xref linkend='XCheckTypedWindowEvent' xrefstyle='select: title'/>
+removes the event from the queue, copies it into the specified
+<structname>XEvent</structname>
+structure, and returns
+<symbol>True</symbol>.
+The other events in the queue are not discarded.
+If the event is not available,
+<xref linkend='XCheckTypedWindowEvent' xrefstyle='select: title'/>
+returns
+<symbol>False</symbol>,
+and the output buffer will have been flushed.
+</para>
+</sect2>
+</sect1>
+<sect1 id="Putting_an_Event_Back_into_the_Queue">
+<title>Putting an Event Back into the Queue</title>
+<!-- .XS -->
+<!-- (SN Putting an Event Back into the Queue  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To push an event back into the event queue, use
+<xref linkend='XPutBackEvent' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XPutBackEvent</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XPutBackEvent'>
+<funcprototype>
+  <funcdef><function>XPutBackEvent</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XEvent<parameter> *event</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the event.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XPutBackEvent' xrefstyle='select: title'/>
+function pushes an event back onto the head of the display's event queue
+by copying the event into the queue.
+This can be useful if you read an event and then decide that you
+would rather deal with it later.
+There is no limit to the number of times in succession that you can call
+<xref linkend='XPutBackEvent' xrefstyle='select: title'/>.
+</para>
+</sect1>
+<sect1 id="Sending_Events_to_Other_Applications">
+<title>Sending Events to Other Applications</title>
+<!-- .XS -->
+<!-- (SN Sending Events to Other Applications -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To send an event to a specified window, use
+<xref linkend='XSendEvent' xrefstyle='select: title'/>.
+<indexterm><primary>XSendEvent</primary></indexterm>
+This function is often used in selection processing.
+For example, the owner of a selection should use
+<xref linkend='XSendEvent' xrefstyle='select: title'/>
+to send a
+<symbol>SelectionNotify</symbol>
+event to a requestor when a selection has been converted 
+and stored as a property.
+</para>
+<indexterm significance="preferred"><primary>XSendEvent</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSendEvent'>
+<funcprototype>
+  <funcdef>Status <function>XSendEvent</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>Bool<parameter> propagate</parameter></paramdef>
+  <paramdef>long<parameter> event_mask</parameter></paramdef>
+  <paramdef>XEvent<parameter> *event_send</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window the event is to be sent to, or
+<symbol>PointerWindow</symbol>,
+or
+<symbol>InputFocus</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>propagate</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a Boolean value.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event_mask</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the event mask.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event_send</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the event that is to be sent.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSendEvent' xrefstyle='select: title'/>
+function identifies the destination window, 
+determines which clients should receive the specified events, 
+and ignores any active grabs.
+This function requires you to pass an event mask.
+For a discussion of the valid event mask names,
+see <link linkend="Event_Masks">section 10.3</link>.
+This function uses the w argument to identify the destination window as follows:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+If w is
+<symbol>PointerWindow</symbol>,
+the destination window is the window that contains the pointer.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If w is
+<symbol>InputFocus</symbol>
+and if the focus window contains the pointer, 
+the destination window is the window that contains the pointer; 
+otherwise, the destination window is the focus window.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+To determine which clients should receive the specified events,
+<xref linkend='XSendEvent' xrefstyle='select: title'/>
+uses the propagate argument as follows:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+If event_mask is the empty set,
+the event is sent to the client that created the destination window.
+If that client no longer exists,
+no event is sent.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If propagate is 
+<symbol>False</symbol>,
+the event is sent to every client selecting on destination any of the event
+types in the event_mask argument.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If propagate is 
+<symbol>True</symbol>
+and no clients have selected on destination any of
+the event types in event-mask, the destination is replaced with the
+closest ancestor of destination for which some client has selected a
+type in event-mask and for which no intervening window has that type in its
+do-not-propagate-mask. 
+If no such window exists or if the window is
+an ancestor of the focus window and 
+<symbol>InputFocus</symbol>
+was originally specified
+as the destination, the event is not sent to any clients.
+Otherwise, the event is reported to every client selecting on the final
+destination any of the types specified in event_mask.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+The event in the
+<structname>XEvent</structname>
+structure must be one of the core events or one of the events
+defined by an extension (or a 
+<errorname>BadValue</errorname>
+error results) so that the X server can correctly byte-swap 
+the contents as necessary.  
+The contents of the event are
+otherwise unaltered and unchecked by the X server except to force send_event to
+<symbol>True</symbol>
+in the forwarded event and to set the serial number in the event correctly;
+therefore these fields
+and the display field are ignored by
+<xref linkend='XSendEvent' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSendEvent' xrefstyle='select: title'/>
+returns zero if the conversion to wire protocol format failed
+and returns nonzero otherwise.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSendEvent' xrefstyle='select: title'/>
+can generate
+<errorname>BadValue</errorname>
+and 
+<errorname>BadWindow</errorname>
+errors.
+</para>
+</sect1>
+<sect1 id="Getting_Pointer_Motion_History">
+<title>Getting Pointer Motion History</title>
+<!-- .XS -->
+<!-- (SN Getting Pointer Motion History -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Some X server implementations will maintain a more complete
+history of pointer motion than is reported by event notification.
+The pointer position at each pointer hardware interrupt may be
+stored in a buffer for later retrieval.
+This buffer is called the motion history buffer.
+For example, a few applications, such as paint programs,
+want to have a precise history of where the pointer
+traveled. 
+However, this historical information is highly excessive for most applications.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To determine the approximate maximum number of elements in the motion buffer, 
+use
+<function>XDisplayMotionBufferSize</function>.
+</para>
+<indexterm significance="preferred"><primary>XDisplayMotionBufferSize</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetMotionEvents'>
+<funcprototype>
+  <funcdef>unsigned <type>long</type></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The server may retain the recent history of the pointer motion
+and do so to a finer granularity than is reported by
+<symbol>MotionNotify</symbol>
+events.
+The
+<xref linkend='XGetMotionEvents' xrefstyle='select: title'/>
+function makes this history available.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To get the motion history for a specified window and time, use
+<xref linkend='XGetMotionEvents' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetMotionEvents</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='xgetmotionevents'>
+<funcprototype>
+  <funcdef>XTimeCoord *<function>XGetMotionEvents</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>Timestart,<parameter> stop</parameter></paramdef>
+  <paramdef>int<parameter> *nevents_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>start</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>stop</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the time interval in which the events are returned from the motion
+history buffer.
+You can pass a timestamp or
+<symbol>CurrentTime</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nevents_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the number of events from the motion history buffer.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetMotionEvents' xrefstyle='select: title'/>
+function returns all events in the motion history buffer that fall between the
+specified start and stop times, inclusive, and that have coordinates
+that lie within the specified window (including its borders) at its present
+placement.
+If the server does not support motion history, 
+if the start time is later than the stop time,
+or if the start time is in the future, 
+no events are returned;
+<xref linkend='XGetMotionEvents' xrefstyle='select: title'/>
+returns NULL.
+If the stop time is in the future, it is equivalent to specifying
+<symbol>CurrentTime</symbol>.
+The return type for this function is a structure defined as follows:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XTimeCoord</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i -->
+<!-- .ta .5i -->
+typedef struct {
+       Time time;
+       short x, y;
+} XTimeCoord;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The time member is set to the time, in milliseconds. 
+The x and y members are set to the coordinates of the pointer and
+are reported relative to the origin
+of the specified window.
+To free the data returned from this call, use
+<xref linkend='XFree' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGetMotionEvents' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+</sect1>
+<sect1 id="Handling_Protocol_Errors">
+<title>Handling Protocol Errors</title>
+<!-- .XS -->
+<!-- (SN Handling Protocol Errors -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to enable or disable synchronization
+and to use the default error handlers.
+</para>
+<sect2 id="Enabling_or_Disabling_Synchronization">
+<title>Enabling or Disabling Synchronization</title>
+<!-- .XS -->
+<!-- (SN Enabling or Disabling Synchronization  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+When debugging X applications, 
+it often is very convenient to require Xlib to behave synchronously
+so that errors are reported as they occur.
+The following function lets you disable or enable synchronous behavior.
+Note that graphics may occur 30 or more times more slowly when 
+synchronization is enabled.
+<indexterm><primary>_Xdebug</primary></indexterm>
+On <acronym>POSIX</acronym>-conformant systems,
+there is also a global variable 
+<varname>_Xdebug</varname>
+that, if set to nonzero before starting a program under a debugger, will force
+synchronous library behavior.
+</para>
+<para>
+<!-- .LP -->
+After completing their work,
+all Xlib functions that generate protocol requests call what is known as
+an after function.
+<xref linkend='XSetAfterFunction' xrefstyle='select: title'/>
+sets which function is to be called.
+</para>
+<indexterm significance="preferred"><primary>XSetAfterFunction</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetAfterFunction'>
+<funcprototype>
+  <funcdef><type>int</type></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> (*procedure)()</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>procedure</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the procedure to be called.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The specified procedure is called with only a display pointer.
+<xref linkend='XSetAfterFunction' xrefstyle='select: title'/>
+returns the previous after function.
+</para>
+<para>
+<!-- .LP -->
+To enable or disable synchronization, use 
+<function>XSynchronize</function>.
+</para>
+<indexterm><primary>Debugging</primary><secondary>synchronous mode</secondary></indexterm>
+<indexterm significance="preferred"><primary>XSynchronize</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='xsynchronize'>
+<funcprototype>
+  <funcdef><type>int</type></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Bool<parameter> onoff</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>onoff</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a Boolean value that indicates whether to enable 
+or disable synchronization.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<function>XSynchronize</function>
+function returns 
+the previous after function.
+If onoff is 
+<symbol>True</symbol>,
+<function>XSynchronize</function>
+turns on synchronous behavior.
+If onoff is
+<symbol>False</symbol>,
+<function>XSynchronize</function>
+turns off synchronous behavior.
+</para>
+</sect2>
+<sect2 id="Using_the_Default_Error_Handlers">
+<title>Using the Default Error Handlers</title>
+<!-- .XS -->
+<!-- (SN Using the Default Error Handlers  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Debugging</primary><secondary>error handlers</secondary></indexterm>
+<indexterm><primary>Error</primary><secondary>handlers</secondary></indexterm>
+There are two default error handlers in Xlib: 
+one to handle typically fatal conditions (for example, 
+the connection to a display server dying because a machine crashed) 
+and one to handle protocol errors from the X server.
+These error handlers can be changed to user-supplied routines if you
+prefer your own error handling and can be changed as often as you like.
+If either function is passed a NULL pointer, it will
+reinvoke the default handler.
+The action of the default handlers is to print an explanatory
+message and exit.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set the error handler, use
+<xref linkend='XSetErrorHandler' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetErrorHandler</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetErrorHandler'>
+<funcprototype>
+  <funcdef>int *<function>XSetErrorHandler</function></funcdef>
+  <paramdef>int <parameter> *handler</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>handler</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the program's supplied error handler.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+Xlib generally calls the program's
+supplied error handler whenever an error is received.
+It is not called on
+<errorname>BadName</errorname>
+errors from
+<systemitem>OpenFont</systemitem>,
+<systemitem>LookupColor</systemitem>,
+or
+<systemitem>AllocNamedColor</systemitem>
+protocol requests or on
+<errorname>BadFont</errorname>
+errors from a
+<systemitem>QueryFont</systemitem>
+protocol request.
+These errors generally are reflected back to the program through the
+procedural interface.
+Because this condition is not assumed to be fatal, 
+it is acceptable for your error handler to return;
+the returned value is ignored.
+However, the error handler should not
+call any functions (directly or indirectly) on the display
+that will generate protocol requests or that will look for input events.
+The previous error handler is returned.
+</para>
+<para>
+<!-- .LP -->
+The 
+<structname>XErrorEvent</structname>
+structure contains:
+<indexterm><primary>Debugging</primary><secondary>error event</secondary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XErrorEvent</primary></indexterm>
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef struct {
+       int type;
+       Display *display;       /* Display the event was read from */
+       unsigned long serial;           /* serial number of failed request */
+       unsigned char error_code;       /* error code of failed request */
+       unsigned char request_code;     /* Major op-code of failed request */
+       unsigned char minor_code;       /* Minor op-code of failed request */
+       XID resourceid;         /* resource id */
+} XErrorEvent;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<indexterm><primary>Serial Number</primary></indexterm>
+The serial member is the number of requests, starting from one, 
+sent over the network connection since it was opened. 
+It is the number that was the value of 
+<function>NextRequest</function>
+immediately before the failing call was made.  
+The request_code member is a protocol request
+of the procedure that failed, as defined in 
+<filename class="headerfile">&lt;X11/Xproto.h&gt;</filename>.
+The following error codes can be returned by the functions described in this
+chapter:
+</para>
+<!-- .br -->
+<!-- .ne 13 -->
+<indexterm><primary>Debugging</primary><secondary>error numbers</secondary></indexterm>
+<indexterm><primary>Error</primary><secondary>codes</secondary></indexterm>
+<!-- .\".CP T 3 -->
+<!-- .\"Error Codes -->
+<indexterm significance="preferred"><primary>BadAccess</primary></indexterm>
+<indexterm significance="preferred"><primary>BadAlloc</primary></indexterm>
+<indexterm significance="preferred"><primary>BadAtom</primary></indexterm>
+<indexterm significance="preferred"><primary>BadColor</primary></indexterm>
+<indexterm significance="preferred"><primary>BadCursor</primary></indexterm>
+<indexterm significance="preferred"><primary>BadDrawable</primary></indexterm>
+<indexterm significance="preferred"><primary>BadFont</primary></indexterm>
+<indexterm significance="preferred"><primary>BadGC</primary></indexterm>
+<indexterm significance="preferred"><primary>BadIDChoice</primary></indexterm>
+<informaltable frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='3.5*'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Error Code</entry>
+      <entry>Description</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry><errorname id='BadAccess'>BadAccess</errorname></entry>
+      <entry>
+      <para>A client attempts to grab a key/button combination already grabbed
+      by another client.</para>
+      <para>A client attempts to free a colormap entry that it had not already allocated
+      or to free an entry in a colormap that was created with all entries writable.</para>
+      <para>A client attempts to store into a read-only or unallocated colormap entry.</para>
+      <para>A client attempts to modify the access control list from other than the local
+      (or otherwise authorized) host.</para>
+      <para>A client attempts to select an event type that another client
+      has already selected.</para>
+      </entry>
+    </row>
+    <row>
+      <entry><errorname id='BadAlloc'>BadAlloc</errorname></entry>
+      <entry>The server fails to allocate the requested resource.
+      Note that the explicit listing of
+      <errorname>BadAlloc</errorname>
+      errors in requests only covers allocation errors at a very coarse level
+      and is not intended to (nor can it in practice hope to) cover all cases of
+      a server running out of allocation space in the middle of service.
+      The semantics when a server runs out of allocation space are left unspecified,
+      but a server may generate a
+      <errorname>BadAlloc</errorname>
+      error on any request for this reason,
+      and clients should be prepared to receive such errors and handle or discard
+      them.</entry>
+    </row>
+    <row>
+      <entry><errorname id='BadAtom'>BadAtom</errorname></entry>
+      <entry>A value for an atom argument does not name a defined atom.</entry>
+    </row>
+    <row>
+      <entry><errorname id='BadColor'>BadColor</errorname></entry>
+      <entry>A value for a colormap argument does not name a defined colormap.</entry>
+    </row>
+    <row>
+      <entry><errorname id='BadCursor'>BadCursor</errorname></entry>
+      <entry>A value for a cursor argument does not name a defined cursor.</entry>
+    </row>
+    <row>
+      <entry><errorname id='BadDrawable'>BadDrawable</errorname></entry>
+      <entry>A value for a drawable argument does not name a defined window or pixmap.</entry>
+    </row>
+    <row>
+      <entry><errorname id='BadFont'>BadFont</errorname></entry>
+      <entry>A value for a font argument does not name a defined font (or, in some cases,
+      <type>GContext</type>).</entry>
+    </row>
+    <row>
+      <entry><errorname id='BadGC'>BadGC</errorname></entry>
+      <entry>A value for a
+      <type>GContext</type>
+      argument does not name a defined 
+      <type>GContext</type>.</entry>
+    </row>
+    <row>
+      <entry><errorname id='BadIDChoice'>BadIDChoice</errorname></entry>
+      <entry>The value chosen for a resource identifier either is not included in the
+      range assigned to the client or is already in use.
+      Under normal circumstances,
+      this cannot occur and should be considered a server or Xlib error.</entry>
+    </row>
+    <row>
+      <entry><errorname id='BadImplementation'>BadImplementation</errorname></entry>
+      <entry>The server does not implement some aspect of the request.
+      A server that generates this error for a core request is deficient.
+      As such, this error is not listed for any of the requests,
+      but clients should be prepared to receive such errors
+      and handle or discard them.</entry>
+    </row>
+    <row>
+      <entry><errorname id='BadLength'>BadLength</errorname></entry>
+      <entry><para>The length of a request is shorter or longer than that required to
+      contain the arguments.
+      This is an internal Xlib or server error.</para>
+      <para>The length of a request exceeds the maximum length accepted by the server.</para>
+      </entry>
+    </row>
+    <row>
+      <entry><errorname id='BadMatch'>BadMatch</errorname></entry>
+      <entry><para>In a graphics request,
+      the root and depth of the graphics context do not match those of the drawable.</para>
+      <para>An <symbol>InputOnly</symbol> window is used as a drawable.</para>
+      <para>Some argument or pair of arguments has the correct type and range,
+      but it fails to match in some other way required by the request.</para>
+      <para>An <symbol>InputOnly</symbol>
+      window lacks this attribute.</para>
+      </entry>
+    </row>
+    <row>
+      <entry><errorname id='BadName'>BadName</errorname></entry>
+      <entry>A font or color of the specified name does not exist.</entry>
+    </row>
+    <row>
+      <entry><errorname id='BadPixmap'>BadPixmap</errorname></entry>
+      <entry>A value for a pixmap argument does not name a defined pixmap.</entry>
+    </row>
+    <row>
+      <entry><errorname id='BadRequest'>BadRequest</errorname></entry>
+      <entry>The major or minor opcode does not specify a valid request.
+      This usually is an Xlib or server error.</entry>
+    </row>
+    <row>
+      <entry><errorname id='BadValue'>BadValue</errorname></entry>
+      <entry>Some numeric value falls outside of the range of values accepted
+      by the request.
+      Unless a specific range is specified for an argument,
+      the full range defined by the argument's type is accepted.
+      Any argument defined as a set of alternatives typically can generate
+      this error (due to the encoding).</entry>
+    </row>
+    <row>
+      <entry><errorname id='BadWindow'>BadWindow</errorname></entry>
+      <entry>A value for a window argument does not name a defined window.</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<indexterm significance="preferred"><primary>BadImplementation</primary></indexterm>
+<indexterm significance="preferred"><primary>BadLength</primary></indexterm>
+<indexterm significance="preferred"><primary>BadMatch</primary></indexterm>
+<indexterm significance="preferred"><primary>BadName</primary></indexterm>
+<indexterm significance="preferred"><primary>BadPixmap</primary></indexterm>
+<indexterm significance="preferred"><primary>BadRequest</primary></indexterm>
+<indexterm significance="preferred"><primary>BadValue</primary></indexterm>
+<indexterm significance="preferred"><primary>BadWindow</primary></indexterm>
+<!-- .NT Note -->
+
+<note>
+<para>
+The 
+<errorname>BadAtom</errorname>,
+<errorname>BadColor</errorname>,
+<errorname>BadCursor</errorname>,
+<errorname>BadDrawable</errorname>,
+<errorname>BadFont</errorname>,
+<errorname>BadGC</errorname>,
+<errorname>BadPixmap</errorname>,
+and 
+<errorname>BadWindow</errorname>
+errors are also used when the argument type is extended by a set of
+fixed alternatives.
+</para>
+</note>
+
+<!-- .NE -->
+<!-- .sp -->
+<para>
+<!-- .LP -->
+To obtain textual descriptions of the specified error code, use 
+<xref linkend='XGetErrorText' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetErrorText</primary></indexterm>
+<indexterm><primary>Debugging</primary><secondary>error message strings</secondary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetErrorText'>
+<funcprototype>
+  <funcdef><function>XGetErrorText</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> code</parameter></paramdef>
+  <paramdef>char<parameter> *buffer_return</parameter></paramdef>
+  <paramdef>int<parameter> length</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>code</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the error code for which you want to obtain a description.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>buffer_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the error description.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>length</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the size of the buffer.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XGetErrorText' xrefstyle='select: title'/>
+function copies a null-terminated string describing the specified error code
+into the specified buffer.
+The returned text is in the encoding of the current locale.
+It is recommended that you use this function to obtain an error description
+because extensions to Xlib may define their own error codes
+and error strings.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain error messages from the error database, use
+<xref linkend='XGetErrorDatabaseText' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetErrorDatabaseText</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetErrorDatabaseText'>
+<funcprototype>
+  <funcdef><function>XGetErrorDatabaseText</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>char*name,<parameter> *message</parameter></paramdef>
+  <paramdef>char<parameter> *default_string</parameter></paramdef>
+  <paramdef>char<parameter> *buffer_return</parameter></paramdef>
+  <paramdef>int<parameter> length</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>name</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the name of the application.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>message</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the type of the error message.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>default_string</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the default error message if none is found in the database.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>buffer_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the error description.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>length</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the size of the buffer.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetErrorDatabaseText' xrefstyle='select: title'/>
+function returns a null-terminated message
+(or the default message) from the error message
+database.
+Xlib uses this function internally to look up its error messages.
+The text in the default_string argument is assumed
+to be in the encoding of the current locale,
+and the text stored in the buffer_return argument
+is in the encoding of the current locale.
+</para>
+<para>
+<!-- .LP -->
+The name argument should generally be the name of your application.
+The message argument should indicate which type of error message you want.
+If the name and message are not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+Xlib uses three predefined ``application names'' to report errors.
+In these names,
+uppercase and lowercase matter.
+<variablelist>
+  <varlistentry>
+    <term>
+      XProtoError
+    </term>
+    <listitem>
+      <para>
+The protocol error number is used as a string for the message argument.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      XlibMessage
+    </term>
+    <listitem>
+      <para>
+These are the message strings that are used internally by the library.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      XRequest
+    </term>
+    <listitem>
+      <para>
+For a core protocol request,
+the major request protocol number is used for the message argument.
+For an extension request,
+the extension name (as given by
+<function>InitExtension</function>)
+followed by a period (.) and the minor request protocol number 
+is used for the message argument.
+If no string is found in the error database,
+the default_string is returned to the buffer argument.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To report an error to the user when the requested display does not exist, use
+<xref linkend='XDisplayName' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDisplayName</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDisplayName'>
+<funcprototype>
+  <funcdef>char *<function>XDisplayName</function></funcdef>
+  <paramdef>char<parameter> *string</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>string</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the character string.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XDisplayName' xrefstyle='select: title'/>
+function returns the name of the display that 
+<xref linkend='XOpenDisplay' xrefstyle='select: title'/>
+would attempt to use.
+If a NULL string is specified,
+<xref linkend='XDisplayName' xrefstyle='select: title'/>
+looks in the environment for the display and returns the display name that
+<xref linkend='XOpenDisplay' xrefstyle='select: title'/>
+would attempt to use.
+This makes it easier to report to the user precisely which display the
+program attempted to open when the initial connection attempt failed.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To handle fatal I/O errors, use
+<function>XSetIOErrorHandler</function>.
+</para>
+<indexterm significance="preferred"><primary>XSetIOErrorHandler</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='xsetioerrorhandler'>
+<funcprototype>
+  <funcdef><type>int</type></funcdef>
+  <paramdef>int(*handler)(Display<parameter> *)</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>handler</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the program's supplied error handler.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<function>XSetIOErrorHandler</function>
+sets the fatal I/O error handler.
+Xlib calls the program's supplied error handler if any sort of system call
+error occurs (for example, the connection to the server was lost).
+This is assumed to be a fatal condition,
+and the called routine should not return.
+If the I/O error handler does return,
+the client process exits.
+</para>
+<para>
+<!-- .LP -->
+Note that the previous error handler is returned.
+<!-- .bp -->
+
+</para>
+</sect2>
+</sect1>
+</chapter>
diff --git a/specs/libX11/CH12.xml b/specs/libX11/CH12.xml
new file mode 100644 (file)
index 0000000..cc14fe6
--- /dev/null
@@ -0,0 +1,3938 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+         "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
+<chapter id='Input_Device_Functions'>
+<title>Input Device Functions</title>
+
+<para>
+You can use the Xlib input device functions to:
+</para>
+
+<itemizedlist>
+  <listitem><para>Grab the pointer and individual buttons on the pointer</para></listitem>
+  <listitem><para>Grab the keyboard and individual keys on the keyboard</para></listitem>
+  <listitem><para>Resume event processing</para></listitem>
+  <listitem><para>Move the pointer</para></listitem>
+  <listitem><para>Set the input focus</para></listitem>
+  <listitem><para>Manipulate the keyboard and pointer settings</para></listitem>
+  <listitem><para>Manipulate the keyboard encoding</para></listitem>
+</itemizedlist>
+
+<sect1 id='Pointer_Grabbing'>
+<title>Pointer Grabbing</title>
+<!-- .XS -->
+<!-- (SN Pointer Grabbing   -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to control input from the pointer,
+which usually is a mouse.
+Usually, as soon as keyboard and mouse events occur,
+the X server delivers them to the appropriate client,
+which is determined by the window and input focus.
+The X server provides sufficient control over event delivery to
+allow window managers to support mouse ahead and various other
+styles of user interface.
+Many of these user interfaces depend on synchronous delivery of events.
+The delivery of  pointer and keyboard events can be controlled
+independently.
+</para>
+<para>
+<!-- .LP -->
+When mouse buttons or keyboard keys are grabbed, events
+will be sent to the grabbing client rather than the normal
+client who would have received the event.
+If the keyboard or pointer is in asynchronous mode,
+further mouse and keyboard events will continue to be processed.
+If the keyboard or pointer is in synchronous mode, no
+further events are processed until the grabbing client
+allows them (see
+<xref linkend='XAllowEvents' xrefstyle='select: title'/>).
+The keyboard or pointer is considered frozen during this
+interval.
+The event that triggered the grab can also be replayed.
+</para>
+<para>
+<!-- .LP -->
+Note that the logical state of a device (as seen by client applications)
+may lag the physical state if device event processing is frozen.
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>Active grab</primary></indexterm>
+There are two kinds of grabs:
+active and passive.
+An active grab occurs when a single client grabs the keyboard and/or pointer
+explicitly (see
+<xref linkend='XGrabPointer' xrefstyle='select: title'/>
+and
+<xref linkend='XGrabKeyboard' xrefstyle='select: title'/>).
+<indexterm><primary>Passive grab</primary></indexterm>
+A passive grab occurs when clients grab a particular keyboard key 
+or pointer button in a window,
+and the grab will activate when the key or button is actually pressed.
+Passive grabs are convenient for implementing reliable pop-up menus.
+For example, you can guarantee that the pop-up is mapped 
+before the up pointer button event occurs by
+grabbing a button requesting synchronous behavior.
+The down event will trigger the grab and freeze further
+processing of pointer events until you have the chance to
+map the pop-up window.
+You can then allow further event processing.
+The up event will then be correctly processed relative to the
+pop-up window.
+</para>
+<para>
+<!-- .LP -->
+For many operations,
+there are functions that take a time argument.
+The X server includes a timestamp in various events.
+One special time, called
+<indexterm significance="preferred"><primary>CurrentTime</primary></indexterm>
+<indexterm significance="preferred"><primary>Time</primary></indexterm>
+<symbol>CurrentTime</symbol>,
+represents the current server time.
+The X server maintains the time when the input focus was last changed,
+when the keyboard was last grabbed,
+when the pointer was last grabbed,
+or when a selection was last changed.
+Your
+application may be slow reacting to an event.
+You often need some way to specify that your
+request should not occur if another application has in the meanwhile
+taken control of the keyboard, pointer, or selection.
+By providing the timestamp from the event in the request, 
+you can arrange that the operation not take effect
+if someone else has performed an operation in the meanwhile.
+</para>
+<para>
+<!-- .LP -->
+A timestamp is a time value, expressed in milliseconds. 
+It typically is the time since the last server reset.
+Timestamp values wrap around (after about 49.7 days).
+The server, given its current time is represented by timestamp T, 
+always interprets timestamps from clients by treating half of the timestamp 
+space as being later in time than T.
+One timestamp value, named
+<symbol>CurrentTime</symbol>,
+is never generated by the server.
+This value is reserved for use in requests to represent the current server time.
+</para>
+<para>
+<!-- .LP -->
+For many functions in this section,
+you pass pointer event mask bits.
+The valid pointer event mask bits are:
+<symbol>ButtonPressMask</symbol>,
+<symbol>ButtonReleaseMask</symbol>,
+<symbol>EnterWindowMask</symbol>,
+<symbol>LeaveWindowMask</symbol>,
+<symbol>PointerMotionMask</symbol>,
+<symbol>PointerMotionHintMask</symbol>,
+<symbol>Button1MotionMask</symbol>,
+<symbol>Button2MotionMask</symbol>,
+<symbol>Button3MotionMask</symbol>,
+<symbol>Button4MotionMask</symbol>,
+<symbol>Button5MotionMask</symbol>,
+<symbol>ButtonMotionMask</symbol>,
+and
+<symbol>KeymapStateMask</symbol>.
+For other functions in this section,
+you pass keymask bits.
+The valid keymask bits are:
+<symbol>ShiftMask</symbol>,
+<symbol>LockMask</symbol>,
+<symbol>ControlMask</symbol>,
+<symbol>Mod1Mask</symbol>,
+<symbol>Mod2Mask</symbol>,
+<symbol>Mod3Mask</symbol>,
+<symbol>Mod4Mask</symbol>,
+and
+<symbol>Mod5Mask</symbol>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To grab the pointer, use
+<xref linkend='XGrabPointer' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Grabbing</primary><secondary>pointer</secondary></indexterm>
+<indexterm><primary>Pointer</primary><secondary>grabbing</secondary></indexterm>
+<indexterm significance="preferred"><primary>XGrabPointer</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGrabPointer'>
+<funcprototype>
+  <funcdef>int <function>XGrabPointer</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> grab_window</parameter></paramdef>
+  <paramdef>Bool<parameter> owner_events</parameter></paramdef>
+  <paramdef>unsignedint<parameter> event_mask</parameter></paramdef>
+  <paramdef>intpointer_mode,<parameter> keyboard_mode</parameter></paramdef>
+  <paramdef>Window<parameter> confine_to</parameter></paramdef>
+  <paramdef>Cursor<parameter> cursor</parameter></paramdef>
+  <paramdef>Time<parameter> time</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>grab_window</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the grab window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>owner_events</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a Boolean value that indicates whether the pointer 
+events are to be reported as usual or reported with respect to the grab window 
+if selected by the event mask.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event_mask</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies which pointer events are reported to the client.
+The mask is the bitwise inclusive OR of the valid pointer event mask bits.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>pointer_mode</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies further processing of pointer events.
+You can pass 
+<symbol>GrabModeSync</symbol>
+or
+<symbol>GrabModeAsync</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>keyboard_mode</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies further processing of keyboard events.
+You can pass 
+<symbol>GrabModeSync</symbol>
+or
+<symbol>GrabModeAsync</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>confine_to</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window to confine the pointer in or
+<symbol>None</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>cursor</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the cursor that is to be displayed during the grab or
+<symbol>None</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>time</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the time.
+You can pass either a timestamp or
+<symbol>CurrentTime</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGrabPointer' xrefstyle='select: title'/>
+function actively grabs control of the pointer and returns
+<symbol>GrabSuccess</symbol>
+if the grab was successful.
+Further pointer events are reported only to the grabbing client.
+<xref linkend='XGrabPointer' xrefstyle='select: title'/>
+overrides any active pointer grab by this client.
+If owner_events is 
+<symbol>False</symbol>,
+all generated pointer events
+are reported with respect to grab_window and are reported only if
+selected by event_mask.
+If owner_events is 
+<symbol>True</symbol>
+and if a generated
+pointer event would normally be reported to this client, 
+it is reported as usual. 
+Otherwise, the event is reported with respect to the
+grab_window and is reported only if selected by event_mask.
+For either value of owner_events, unreported events are discarded.
+</para>
+<para>
+<!-- .LP -->
+If the pointer_mode is 
+<symbol>GrabModeAsync</symbol>,
+pointer event processing continues as usual.
+If the pointer is currently frozen by this client, 
+the processing of events for the pointer is resumed.
+If the pointer_mode is 
+<symbol>GrabModeSync</symbol>,
+the state of the pointer, as seen by
+client applications,
+appears to freeze, and the X server generates no further pointer events
+until the grabbing client calls 
+<xref linkend='XAllowEvents' xrefstyle='select: title'/>
+or until the pointer grab is released.
+Actual pointer changes are not lost while the pointer is frozen;
+they are simply queued in the server for later processing.
+</para>
+<para>
+<!-- .LP -->
+If the keyboard_mode is 
+<symbol>GrabModeAsync</symbol>,
+keyboard event processing is unaffected by activation of the grab.
+If the keyboard_mode is 
+<symbol>GrabModeSync</symbol>,
+the state of the keyboard, as seen by
+client applications,
+appears to freeze, and the X server generates no further keyboard events
+until the grabbing client calls 
+<xref linkend='XAllowEvents' xrefstyle='select: title'/>
+or until the pointer grab is released.
+Actual keyboard changes are not lost while the pointer is frozen;
+they are simply queued in the server for later processing.
+</para>
+<para>
+<!-- .LP -->
+If a cursor is specified, it is displayed regardless of what
+window the pointer is in.  
+If 
+<symbol>None</symbol>
+is specified,
+the normal cursor for that window is displayed
+when the pointer is in grab_window or one of its subwindows;
+otherwise, the cursor for grab_window is displayed.
+</para>
+<para>
+<!-- .LP -->
+If a confine_to window is specified,
+the pointer is restricted to stay contained in that window.
+The confine_to window need have no relationship to the grab_window.
+If the pointer is not initially in the confine_to window, 
+it is warped automatically to the closest edge 
+just before the grab activates and enter/leave events are generated as usual. 
+If the confine_to window is subsequently reconfigured, 
+the pointer is warped automatically, as necessary, 
+to keep it contained in the window.
+</para>
+<para>
+<!-- .LP -->
+The time argument allows you to avoid certain circumstances that come up
+if applications take a long time to respond or if there are long network
+delays.
+Consider a situation where you have two applications, both
+of which normally grab the pointer when clicked on.
+If both applications specify the timestamp from the event, 
+the second application may wake up faster and successfully grab the pointer
+before the first application. 
+The first application then will get an indication that the other application 
+grabbed the pointer before its request was processed.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGrabPointer' xrefstyle='select: title'/>
+generates
+<symbol>EnterNotify</symbol>
+and
+<symbol>LeaveNotify</symbol>
+events.
+</para>
+<para>
+<!-- .LP -->
+Either if grab_window or confine_to window is not viewable
+or if the confine_to window lies completely outside the boundaries of the root
+window,
+<xref linkend='XGrabPointer' xrefstyle='select: title'/>
+fails and returns
+<symbol>GrabNotViewable</symbol>.
+If the pointer is actively grabbed by some other client,
+it fails and returns
+<symbol>AlreadyGrabbed</symbol>.
+If the pointer is frozen by an active grab of another client,
+it fails and returns
+<symbol>GrabFrozen</symbol>.
+If the specified time is earlier than the last-pointer-grab time or later 
+than the current X server time, it fails and returns
+<symbol>GrabInvalidTime</symbol>.
+Otherwise, the last-pointer-grab time is set to the specified time
+(<symbol>CurrentTime</symbol>
+is replaced by the current X server time).
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGrabPointer' xrefstyle='select: title'/>
+can generate
+<errorname>BadCursor</errorname>,
+<errorname>BadValue</errorname>,
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To ungrab the pointer, use
+<xref linkend='XUngrabPointer' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Ungrabbing</primary><secondary>pointer</secondary></indexterm>
+<indexterm><primary>Pointer</primary><secondary>ungrabbing</secondary></indexterm>
+<indexterm significance="preferred"><primary>XUngrabPointer</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XUngrabPointer'>
+<funcprototype>
+  <funcdef><function>XUngrabPointer</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Time<parameter> time</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>time</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the time.
+You can pass either a timestamp or
+<symbol>CurrentTime</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XUngrabPointer' xrefstyle='select: title'/>
+function releases the pointer and any queued events
+if this client has actively grabbed the pointer from
+<xref linkend='XGrabPointer' xrefstyle='select: title'/>,
+<xref linkend='XGrabButton' xrefstyle='select: title'/>,
+or from a normal button press.
+<xref linkend='XUngrabPointer' xrefstyle='select: title'/>
+does not release the pointer if the specified
+time is earlier than the last-pointer-grab time or is later than the
+current X server time.
+It also generates 
+<symbol>EnterNotify</symbol>
+and 
+<symbol>LeaveNotify</symbol>
+events.
+The X server performs an 
+<systemitem>UngrabPointer</systemitem>
+request automatically if the event window or confine_to window 
+for an active pointer grab becomes not viewable
+or if window reconfiguration causes the confine_to window to lie completely
+outside the boundaries of the root window.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To change an active pointer grab, use
+<xref linkend='XChangeActivePointerGrab' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Pointer</primary><secondary>grabbing</secondary></indexterm>
+<indexterm ><primary>Changing</primary><secondary>pointer grab</secondary></indexterm>
+<indexterm significance="preferred"><primary>XChangeActivePointerGrab</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XChangeActivePointerGrab'>
+<funcprototype>
+  <funcdef><function>XChangeActivePointerGrab</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>unsignedint<parameter> event_mask</parameter></paramdef>
+  <paramdef>Cursor<parameter> cursor</parameter></paramdef>
+  <paramdef>Time<parameter> time</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event_mask</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies which pointer events are reported to the client.
+The mask is the bitwise inclusive OR of the valid pointer event mask bits.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>cursor</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the cursor that is to be displayed or
+<symbol>None</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>time</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the time.
+You can pass either a timestamp or
+<symbol>CurrentTime</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XChangeActivePointerGrab' xrefstyle='select: title'/>
+function changes the specified dynamic parameters if the pointer is actively
+grabbed by the client and if the specified time is no earlier than the
+last-pointer-grab time and no later than the current X server time.
+This function has no effect on the passive parameters of an
+<xref linkend='XGrabButton' xrefstyle='select: title'/>.
+The interpretation of event_mask and cursor is the same as described in
+<xref linkend='XGrabPointer' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XChangeActivePointerGrab' xrefstyle='select: title'/>
+can generate
+<errorname>BadCursor</errorname>
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To grab a pointer button, use
+<xref linkend='XGrabButton' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Grabbing</primary><secondary>buttons</secondary></indexterm>
+<indexterm><primary>Button</primary><secondary>grabbing</secondary></indexterm>
+<indexterm significance="preferred"><primary>XGrabButton</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGrabButton'>
+<funcprototype>
+  <funcdef><function>XGrabButton</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>unsignedint<parameter> button</parameter></paramdef>
+  <paramdef>unsignedint<parameter> modifiers</parameter></paramdef>
+  <paramdef>Window<parameter> grab_window</parameter></paramdef>
+  <paramdef>Bool<parameter> owner_events</parameter></paramdef>
+  <paramdef>unsignedint<parameter> event_mask</parameter></paramdef>
+  <paramdef>intpointer_mode,<parameter> keyboard_mode</parameter></paramdef>
+  <paramdef>Window<parameter> confine_to</parameter></paramdef>
+  <paramdef>Cursor<parameter> cursor</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Bu grabbed -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>button</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the pointer button that is to be (Bu or
+<symbol>AnyButton</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>modifiers</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the set of keymasks or
+<symbol>AnyModifier</symbol>.
+The mask is the bitwise inclusive OR of the valid keymask bits.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>grab_window</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the grab window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>owner_events</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a Boolean value that indicates whether the pointer 
+events are to be reported as usual or reported with respect to the grab window 
+if selected by the event mask.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event_mask</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies which pointer events are reported to the client.
+The mask is the bitwise inclusive OR of the valid pointer event mask bits.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>pointer_mode</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies further processing of pointer events.
+You can pass 
+<symbol>GrabModeSync</symbol>
+or
+<symbol>GrabModeAsync</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>keyboard_mode</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies further processing of keyboard events.
+You can pass 
+<symbol>GrabModeSync</symbol>
+or
+<symbol>GrabModeAsync</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>confine_to</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window to confine the pointer in or
+<symbol>None</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>cursor</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the cursor that is to be displayed or
+<symbol>None</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGrabButton' xrefstyle='select: title'/>
+function establishes a passive grab.
+In the future,
+the pointer is actively grabbed (as for
+<xref linkend='XGrabPointer' xrefstyle='select: title'/>),
+the last-pointer-grab time is set to the time at which the button was pressed
+(as transmitted in the
+<symbol>ButtonPress</symbol>
+event), and the
+<symbol>ButtonPress</symbol>
+event is reported if all of the following conditions are true:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+The pointer is not grabbed, and the specified button is logically pressed
+when the specified modifier keys are logically down,
+and no other buttons or modifier keys are logically down.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The grab_window contains the pointer.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The confine_to window (if any) is viewable.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A passive grab on the same button/key combination does not exist
+on any ancestor of grab_window.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+The interpretation of the remaining arguments is as for
+<xref linkend='XGrabPointer' xrefstyle='select: title'/>.
+The active grab is terminated automatically when the logical state of the
+pointer has all buttons released
+(independent of the state of the logical modifier keys).
+</para>
+<para>
+<!-- .LP -->
+Note that the logical state of a device (as seen by client applications)
+may lag the physical state if device event processing is frozen.
+</para>
+<para>
+<!-- .LP -->
+This request overrides all previous grabs by the same client on the same
+button/key combinations on the same window.
+A modifiers of 
+<symbol>AnyModifier</symbol>
+is equivalent to issuing the grab request for all
+possible modifier combinations (including the combination of no modifiers).  
+It is not required that all modifiers specified have currently assigned 
+KeyCodes.
+A button of 
+<symbol>AnyButton</symbol>
+is equivalent to
+issuing the request for all possible buttons.
+Otherwise, it is not required that the specified button currently be assigned
+to a physical button.
+</para>
+<para>
+<!-- .LP -->
+If some other client has already issued an
+<xref linkend='XGrabButton' xrefstyle='select: title'/>
+with the same button/key combination on the same window, a
+<errorname>BadAccess</errorname>
+error results.
+When using 
+<symbol>AnyModifier</symbol>
+or 
+<symbol>AnyButton</symbol>,
+the request fails completely,
+and a
+<errorname>BadAccess</errorname>
+error results (no grabs are
+established) if there is a conflicting grab for any combination.
+<xref linkend='XGrabButton' xrefstyle='select: title'/>
+has no effect on an active grab.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGrabButton' xrefstyle='select: title'/>
+can generate
+<errorname>BadCursor</errorname>,
+<errorname>BadValue</errorname>,
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To ungrab a pointer button, use
+<xref linkend='XUngrabButton' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Ungrabbing</primary><secondary>buttons</secondary></indexterm>
+<indexterm><primary>Button</primary><secondary>ungrabbing</secondary></indexterm>
+<indexterm significance="preferred"><primary>XUngrabButton</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XUngrabButton'>
+<funcprototype>
+  <funcdef><function>XUngrabButton</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>unsignedint<parameter> button</parameter></paramdef>
+  <paramdef>unsignedint<parameter> modifiers</parameter></paramdef>
+  <paramdef>Window<parameter> grab_window</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Bu released -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>button</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the pointer button that is to be (Bu or
+<symbol>AnyButton</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>modifiers</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the set of keymasks or
+<symbol>AnyModifier</symbol>.
+The mask is the bitwise inclusive OR of the valid keymask bits.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>grab_window</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the grab window.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XUngrabButton' xrefstyle='select: title'/>
+function releases the passive button/key combination on the specified window if
+it was grabbed by this client.
+A modifiers of 
+<symbol>AnyModifier</symbol>
+is
+equivalent to issuing 
+the ungrab request for all possible modifier combinations, including 
+the combination of no modifiers.
+A button of 
+<symbol>AnyButton</symbol>
+is equivalent to issuing the
+request for all possible buttons.
+<xref linkend='XUngrabButton' xrefstyle='select: title'/>
+has no effect on an active grab.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XUngrabButton' xrefstyle='select: title'/>
+can generate
+<errorname>BadValue</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+</sect1>
+<sect1 id='Keyboard_Grabbing'>
+<title>Keyboard Grabbing</title>
+<!-- .XS -->
+<!-- (SN Keyboard Grabbing  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to grab or ungrab the keyboard
+as well as allow events.
+</para>
+<para>
+<!-- .LP -->
+For many functions in this section,
+you pass keymask bits.
+The valid keymask bits are:
+<symbol>ShiftMask</symbol>,
+<symbol>LockMask</symbol>,
+<symbol>ControlMask</symbol>,
+<symbol>Mod1Mask</symbol>,
+<symbol>Mod2Mask</symbol>,
+<symbol>Mod3Mask</symbol>,
+<symbol>Mod4Mask</symbol>,
+and
+<symbol>Mod5Mask</symbol>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To grab the keyboard, use
+<xref linkend='XGrabKeyboard' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Keyboard</primary><secondary>grabbing</secondary></indexterm>
+<indexterm><primary>Grabbing</primary><secondary>keyboard</secondary></indexterm>
+<indexterm significance="preferred"><primary>XGrabKeyboard</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGrabKeyboard'>
+<funcprototype>
+  <funcdef>int <function>XGrabKeyboard</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> grab_window</parameter></paramdef>
+  <paramdef>Bool<parameter> owner_events</parameter></paramdef>
+  <paramdef>intpointer_mode,<parameter> keyboard_mode</parameter></paramdef>
+  <paramdef>Time<parameter> time</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>grab_window</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the grab window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>owner_events</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a Boolean value that indicates whether the keyboard events 
+are to be reported as usual.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>pointer_mode</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies further processing of pointer events.
+You can pass 
+<symbol>GrabModeSync</symbol>
+or
+<symbol>GrabModeAsync</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>keyboard_mode</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies further processing of keyboard events.
+You can pass 
+<symbol>GrabModeSync</symbol>
+or
+<symbol>GrabModeAsync</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>time</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the time.
+You can pass either a timestamp or
+<symbol>CurrentTime</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGrabKeyboard' xrefstyle='select: title'/>
+function actively grabs control of the keyboard and generates
+<symbol>FocusIn</symbol>
+and
+<symbol>FocusOut</symbol>
+events.
+Further key events are reported only to the
+grabbing client.
+<xref linkend='XGrabKeyboard' xrefstyle='select: title'/>
+overrides any active keyboard grab by this client.
+If owner_events is 
+<symbol>False</symbol>,
+all generated key events are reported with
+respect to grab_window.  
+If owner_events is 
+<symbol>True</symbol>
+and if a generated
+key event would normally be reported to this client, it is reported
+normally; otherwise, the event is reported with respect to the
+grab_window.  
+Both 
+<symbol>KeyPress</symbol>
+and 
+<symbol>KeyRelease</symbol>
+events are always reported,
+independent of any event selection made by the client.
+</para>
+<para>
+<!-- .LP -->
+If the keyboard_mode argument is 
+<symbol>GrabModeAsync</symbol>,
+keyboard event processing continues
+as usual. 
+If the keyboard is currently frozen by this client, 
+then processing of keyboard events is resumed.
+If the keyboard_mode  argument is
+<symbol>GrabModeSync</symbol>,
+the state of the keyboard (as seen by client applications) appears to freeze,
+and the X server generates no further keyboard events until the
+grabbing client issues a releasing 
+<xref linkend='XAllowEvents' xrefstyle='select: title'/>
+call or until the keyboard grab is released.
+Actual keyboard changes are not lost while the keyboard is frozen; 
+they are simply queued in the server for later processing.
+</para>
+<para>
+<!-- .LP -->
+If pointer_mode is 
+<symbol>GrabModeAsync</symbol>,
+pointer event processing is unaffected
+by activation of the grab.  
+If pointer_mode is 
+<symbol>GrabModeSync</symbol>,
+the state of the pointer (as seen by client applications) appears to freeze, 
+and the X server generates no further pointer events 
+until the grabbing client issues a releasing 
+<xref linkend='XAllowEvents' xrefstyle='select: title'/>
+call or until the keyboard grab is released.
+Actual pointer changes are not lost while the pointer is frozen; 
+they are simply queued in the server for later processing.
+</para>
+<para>
+<!-- .LP -->
+If the keyboard is actively grabbed by some other client,
+<xref linkend='XGrabKeyboard' xrefstyle='select: title'/>
+fails and returns
+<symbol>AlreadyGrabbed</symbol>.
+If grab_window is not viewable,
+it fails and returns
+<symbol>GrabNotViewable</symbol>.
+If the keyboard is frozen by an active grab of another client,
+it fails and returns
+<symbol>GrabFrozen</symbol>.
+If the specified time is earlier than the last-keyboard-grab time 
+or later than the current X server time,
+it fails and returns
+<symbol>GrabInvalidTime</symbol>.
+Otherwise, the last-keyboard-grab time is set to the specified time
+(<symbol>CurrentTime</symbol>
+is replaced by the current X server time).
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGrabKeyboard' xrefstyle='select: title'/>
+can generate
+<errorname>BadValue</errorname>
+and 
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To ungrab the keyboard, use
+<xref linkend='XUngrabKeyboard' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Keyboard</primary><secondary>ungrabbing</secondary></indexterm>
+<indexterm><primary>Ungrabbing</primary><secondary>keyboard</secondary></indexterm>
+<indexterm significance="preferred"><primary>XUngrabKeyboard</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XUngrabKeyboard'>
+<funcprototype>
+  <funcdef><function>XUngrabKeyboard</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Time<parameter> time</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>time</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the time.
+You can pass either a timestamp or
+<symbol>CurrentTime</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XUngrabKeyboard' xrefstyle='select: title'/>
+function
+releases the keyboard and any queued events if this client has it actively grabbed from
+either
+<xref linkend='XGrabKeyboard' xrefstyle='select: title'/>
+or
+<xref linkend='XGrabKey' xrefstyle='select: title'/>.
+<xref linkend='XUngrabKeyboard' xrefstyle='select: title'/>
+does not release the keyboard and any queued events
+if the specified time is earlier than
+the last-keyboard-grab time or is later than the current X server time.
+It also generates
+<symbol>FocusIn</symbol>
+and 
+<symbol>FocusOut</symbol>
+events.
+The X server automatically performs an 
+<systemitem>UngrabKeyboard</systemitem>
+request if the event window for an
+active keyboard grab becomes not viewable.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To passively grab a single key of the keyboard, use
+<xref linkend='XGrabKey' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Key</primary><secondary>grabbing</secondary></indexterm>
+<indexterm><primary>Grabbing</primary><secondary>keys</secondary></indexterm>
+<indexterm significance="preferred"><primary>XGrabKey</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGrabKey'>
+<funcprototype>
+  <funcdef><function>XGrabKey</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> keycode</parameter></paramdef>
+  <paramdef>unsignedint<parameter> modifiers</parameter></paramdef>
+  <paramdef>Window<parameter> grab_window</parameter></paramdef>
+  <paramdef>Bool<parameter> owner_events</parameter></paramdef>
+  <paramdef>intpointer_mode,<parameter> keyboard_mode</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>keycode</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the KeyCode or
+<symbol>AnyKey</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>modifiers</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the set of keymasks or
+<symbol>AnyModifier</symbol>.
+The mask is the bitwise inclusive OR of the valid keymask bits.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>grab_window</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the grab window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>owner_events</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a Boolean value that indicates whether the keyboard events 
+are to be reported as usual.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>pointer_mode</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies further processing of pointer events.
+You can pass 
+<symbol>GrabModeSync</symbol>
+or
+<symbol>GrabModeAsync</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>keyboard_mode</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies further processing of keyboard events.
+You can pass 
+<symbol>GrabModeSync</symbol>
+or
+<symbol>GrabModeAsync</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGrabKey' xrefstyle='select: title'/>
+function establishes a passive grab on the keyboard.
+In the future,
+the keyboard is actively grabbed (as for
+<xref linkend='XGrabKeyboard' xrefstyle='select: title'/>),
+the last-keyboard-grab time is set to the time at which the key was pressed
+(as transmitted in the
+<symbol>KeyPress</symbol>
+event), and the
+<symbol>KeyPress</symbol>
+event is reported if all of the following conditions are true:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+The keyboard is not grabbed and the specified key
+(which can itself be a modifier key) is logically pressed
+when the specified modifier keys are logically down,
+and no other modifier keys are logically down.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Either the grab_window is an ancestor of (or is) the focus window,
+or the grab_window is a descendant of the focus window and contains the pointer.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A passive grab on the same key combination does not exist
+on any ancestor of grab_window.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+The interpretation of the remaining arguments is as for 
+<xref linkend='XGrabKeyboard' xrefstyle='select: title'/>.
+The active grab is terminated automatically when the logical state of the
+keyboard has the specified key released
+(independent of the logical state of the modifier keys).
+</para>
+<para>
+<!-- .LP -->
+Note that the logical state of a device (as seen by client applications)
+may lag the physical state if device event processing is frozen.
+</para>
+<para>
+<!-- .LP -->
+A modifiers argument of 
+<symbol>AnyModifier</symbol>
+is equivalent to issuing the request for all
+possible modifier combinations (including the combination of no
+modifiers).  
+It is not required that all modifiers specified have
+currently assigned KeyCodes.
+A keycode argument of 
+<symbol>AnyKey</symbol>
+is equivalent to issuing
+the request for all possible KeyCodes.
+Otherwise, the specified keycode must be in
+the range specified by min_keycode and max_keycode in the connection
+setup, 
+or a
+<errorname>BadValue</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+If some other client has issued a 
+<xref linkend='XGrabKey' xrefstyle='select: title'/>
+with the same key combination on the same window, a 
+<errorname>BadAccess</errorname>
+error results.
+When using
+<symbol>AnyModifier</symbol>
+or 
+<symbol>AnyKey</symbol>,
+the request fails completely,
+and a
+<errorname>BadAccess</errorname>
+error results (no grabs are established) 
+if there is a conflicting grab for any combination.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGrabKey' xrefstyle='select: title'/>
+can generate
+<errorname>BadAccess</errorname>,
+<errorname>BadValue</errorname>,
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To ungrab a key, use
+<xref linkend='XUngrabKey' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Key</primary><secondary>ungrabbing</secondary></indexterm>
+<indexterm><primary>Ungrabbing</primary><secondary>keys</secondary></indexterm>
+<indexterm significance="preferred"><primary>XUngrabKey</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XUngrabKey'>
+<funcprototype>
+  <funcdef><function>XUngrabKey</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> keycode</parameter></paramdef>
+  <paramdef>unsignedint<parameter> modifiers</parameter></paramdef>
+  <paramdef>Window<parameter> grab_window</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>keycode</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the KeyCode or
+<symbol>AnyKey</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>modifiers</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the set of keymasks or
+<symbol>AnyModifier</symbol>.
+The mask is the bitwise inclusive OR of the valid keymask bits.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>grab_window</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the grab window.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XUngrabKey' xrefstyle='select: title'/>
+function releases the key combination on the specified window if it was grabbed
+by this client.
+It has no effect on an active grab.
+A modifiers of
+<symbol>AnyModifier</symbol>
+is equivalent to issuing
+the request for all possible modifier combinations
+(including the combination of no modifiers).
+A keycode argument of
+<symbol>AnyKey</symbol>
+is equivalent to issuing the request for all possible key codes.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XUngrabKey' xrefstyle='select: title'/>
+can generate
+<errorname>BadValue</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+</sect1>
+<sect1 id="Resuming_Event_Processing">
+<title>Resuming Event Processing</title>
+<!-- .XS -->
+<!-- (SN Resuming Event Processing -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The previous sections discussed grab mechanisms with which processing
+of events by the server can be temporarily suspended.  This section
+describes the mechanism for resuming event processing.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To allow further events to be processed when the device has been frozen, use
+<xref linkend='XAllowEvents' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XAllowEvents</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XAllowEvents'>
+<funcprototype>
+  <funcdef><function>XAllowEvents</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> event_mode</parameter></paramdef>
+  <paramdef>Time<parameter> time</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event_mode</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the event mode.
+You can pass 
+<symbol>AsyncPointer</symbol>,
+<symbol>SyncPointer</symbol>,
+<symbol>AsyncKeyboard</symbol>,
+<symbol>SyncKeyboard</symbol>,
+<symbol>ReplayPointer</symbol>,
+<symbol>ReplayKeyboard</symbol>,
+<symbol>AsyncBoth</symbol>,
+or
+<symbol>SyncBoth</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>time</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the time.
+You can pass either a timestamp or
+<symbol>CurrentTime</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XAllowEvents' xrefstyle='select: title'/>
+function releases some queued events if the client has caused a device 
+to freeze.
+It has no effect if the specified time is earlier than the last-grab
+time of the most recent active grab for the client or if the specified time
+is later than the current X server time.
+Depending on the event_mode argument, the following occurs:
+</para>
+<informaltable frame='none'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='4.0*'/>
+  <tbody>
+    <row>
+      <entry><symbol>AsyncPointer</symbol></entry>
+      <entry>If the pointer is frozen by the client,
+      pointer event processing continues as usual.
+      If the pointer is frozen twice by the client on behalf of two separate grabs,
+      <symbol>AsyncPointer</symbol>
+      thaws for both.
+      <symbol>AsyncPointer</symbol>
+      has no effect if the pointer is not frozen by the client,
+      but the pointer need not be grabbed by the client.</entry>
+    </row>
+    <row>
+      <entry><symbol>SyncPointer</symbol></entry>
+      <entry>If the pointer is frozen and actively grabbed by the client,
+      pointer event processing continues as usual until the next
+      <symbol>ButtonPress</symbol>
+      or
+      <symbol>ButtonRelease</symbol>
+      event is reported to the client.
+      At this time,
+      the pointer again appears to freeze.
+      However, if the reported event causes the pointer grab to be released,
+      the pointer does not freeze.
+      <symbol>SyncPointer</symbol>
+      has no effect if the pointer is not frozen by the client
+      or if the pointer is not grabbed by the client.</entry>
+    </row>
+    <row>
+      <entry><symbol>ReplayPointer</symbol></entry>
+      <entry>If the pointer is actively grabbed by the client and is frozen as the result of
+      an event having been sent to the client (either from the activation of an
+      <xref linkend='XGrabButton' xrefstyle='select: title'/>
+      or from a previous
+      <xref linkend='XAllowEvents' xrefstyle='select: title'/>
+      with mode
+      <symbol>SyncPointer</symbol>
+      but not from an 
+      <xref linkend='XGrabPointer' xrefstyle='select: title'/>),
+      the pointer grab is released and that event is completely reprocessed.
+      This time, however, the function ignores any passive grabs at or above 
+      (toward the root of) the grab_window of the grab just released.
+      The request has no effect if the pointer is not grabbed by the client
+      or if the pointer is not frozen as the result of an event.</entry>
+    </row>
+    <row>
+      <entry><symbol>AsyncKeyboard</symbol></entry>
+      <entry>If the keyboard is frozen by the client,
+      keyboard event processing continues as usual.
+      If the keyboard is frozen twice by the client on behalf of two separate grabs,
+      <symbol>AsyncKeyboard</symbol>
+      thaws for both.
+      <symbol>AsyncKeyboard</symbol>
+      has no effect if the keyboard is not frozen by the client,
+      but the keyboard need not be grabbed by the client.</entry>
+    </row>
+    <row>
+      <entry><symbol>SyncKeyboard</symbol></entry>
+      <entry>If the keyboard is frozen and actively grabbed by the client,
+      keyboard event processing continues as usual until the next
+      <symbol>KeyPress</symbol>
+      or
+      <symbol>KeyRelease</symbol>
+      event is reported to the client.
+      At this time,
+      the keyboard again appears to freeze.
+      However, if the reported event causes the keyboard grab to be released,
+      the keyboard does not freeze.
+      <symbol>SyncKeyboard</symbol>
+      has no effect if the keyboard is not frozen by the client
+      or if the keyboard is not grabbed by the client.</entry>
+    </row>
+    <row>
+      <entry><symbol>ReplayKeyboard</symbol></entry>
+      <entry>If the keyboard is actively grabbed by the client and is frozen
+      as the result of an event having been sent to the client (either from the
+      activation of an
+      <xref linkend='XGrabKey' xrefstyle='select: title'/>
+      or from a previous
+      <xref linkend='XAllowEvents' xrefstyle='select: title'/>
+      with mode
+      <symbol>SyncKeyboard</symbol>
+      but not from an 
+      <xref linkend='XGrabKeyboard' xrefstyle='select: title'/>),
+      the keyboard grab is released and that event is completely reprocessed.
+      This time, however, the function ignores any passive grabs at or above
+      (toward the root of)
+      the grab_window of the grab just released.
+      The request has no effect if the keyboard is not grabbed by the client
+      or if the keyboard is not frozen as the result of an event.</entry>
+    </row>
+    <row>
+      <entry><symbol>SyncBoth</symbol></entry>
+      <entry>If both pointer and keyboard are frozen by the client,
+      event processing for both devices continues as usual until the next
+      <symbol>ButtonPress</symbol>,
+      <symbol>ButtonRelease</symbol>,
+      <symbol>KeyPress</symbol>,
+      or 
+      <symbol>KeyRelease</symbol>
+      event is reported to the client for a grabbed device 
+      (button event for the pointer, key event for the keyboard), 
+      at which time the devices again appear to freeze.  
+      However, if the reported event causes the grab to be released,
+      then the devices do not freeze (but if the other device is still
+      grabbed, then a subsequent event for it will still cause both devices
+      to freeze).  
+      <symbol>SyncBoth</symbol>
+      has no effect unless both pointer and keyboard
+      are frozen by the client.
+      If the pointer or keyboard is frozen twice
+      by the client on behalf of two separate grabs, 
+      <symbol>SyncBoth</symbol>
+      thaws for both (but a subsequent freeze for 
+      <symbol>SyncBoth</symbol>
+      will only freeze each device once).</entry>
+    </row>
+    <row>
+      <entry><symbol>AsyncBoth</symbol></entry>
+      <entry>If the pointer and the keyboard are frozen by the
+      client, event processing for both devices continues as usual.
+      If a device is frozen twice by the client on behalf of two separate grabs,
+      <symbol>AsyncBoth</symbol>
+      thaws for both.
+      <symbol>AsyncBoth</symbol>
+      has no effect unless both
+      pointer and keyboard are frozen by the client.</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+<!-- .LP -->
+<symbol>AsyncPointer</symbol>,
+<symbol>SyncPointer</symbol>,
+and 
+<symbol>ReplayPointer</symbol>
+have no effect on the
+processing of keyboard events.
+<symbol>AsyncKeyboard</symbol>,
+<symbol>SyncKeyboard</symbol>,
+and 
+<symbol>ReplayKeyboard</symbol>
+have no effect on the
+processing of pointer events.
+It is possible for both a pointer grab and a keyboard grab (by the same 
+or different clients) to be active simultaneously.
+If a device is frozen on behalf of either grab,
+no event processing is performed for the device.
+It is possible for a single device to be frozen because of both grabs.
+In this case,
+the freeze must be released on behalf of both grabs before events can 
+again be processed.
+If a device is frozen twice by a single client,
+then a single
+<xref linkend='XAllowEvents' xrefstyle='select: title'/>
+releases both.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XAllowEvents' xrefstyle='select: title'/>
+can generate a
+<errorname>BadValue</errorname>
+error.
+</para>
+</sect1>
+<sect1 id="Moving_the_Pointer">
+<title>Moving the Pointer</title>
+<!-- .XS -->
+<!-- (SN Moving the Pointer -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Although movement of the pointer normally should be left to the
+control of the end user, sometimes it is necessary to move the
+pointer to a new position under program control.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To move the pointer to an arbitrary point in a window, use
+<xref linkend='XWarpPointer' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XWarpPointer</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XWarpPointer'>
+<funcprototype>
+  <funcdef><function>XWarpPointer</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Windowsrc_w,<parameter> dest_w</parameter></paramdef>
+  <paramdef>intsrc_x,<parameter> src_y</parameter></paramdef>
+  <paramdef>unsignedintsrc_width,<parameter> src_height</parameter></paramdef>
+  <paramdef>intdest_x,<parameter> dest_y</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>src_w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the source window or
+<symbol>None</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dest_w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the destination window or
+<symbol>None</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>src_x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>src_y</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>src_width</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>src_height</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify a rectangle in the source window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dest_x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dest_y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates within the destination window.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+If dest_w is
+<symbol>None</symbol>,
+<xref linkend='XWarpPointer' xrefstyle='select: title'/>
+moves the pointer by the offsets (dest_x, dest_y) relative to the current
+position of the pointer.
+If dest_w is a window,
+<xref linkend='XWarpPointer' xrefstyle='select: title'/>
+moves the pointer to the offsets (dest_x, dest_y) relative to the origin of
+dest_w.
+However, if src_w is a window,
+the move only takes place if the window src_w contains the pointer 
+and if the specified rectangle of src_w contains the pointer.
+</para>
+<para>
+<!-- .LP -->
+The src_x and src_y coordinates are relative to the origin of src_w.
+If src_height is zero,
+it is replaced with the current height of src_w minus src_y.
+If src_width is zero,
+it is replaced with the current width of src_w minus src_x.
+</para>
+<para>
+<!-- .LP -->
+There is seldom any reason for calling this function. 
+The pointer should normally be left to the user.
+If you do use this function, however, it generates events just as if the user
+had instantaneously moved the pointer from one position to another.
+Note that you cannot use
+<xref linkend='XWarpPointer' xrefstyle='select: title'/>
+to move the pointer outside the confine_to window of an active pointer grab.
+An attempt to do so will only move the pointer as far as the closest edge of the
+confine_to window. 
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XWarpPointer' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+</sect1>
+<sect1 id="Controlling_Input_Focus">
+<title>Controlling Input Focus</title>
+<!-- .XS -->
+<!-- (SN Controlling Input Focus  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to set and get the input focus.
+The input focus is a shared resource, and cooperation among clients is
+required for correct interaction.  See the
+<olink targetdoc='icccm' targetptr='Input_Focus'><citetitle>Inter-Client Communication Conventions Manual</citetitle></olink>
+for input focus policy.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set the input focus, use
+<xref linkend='XSetInputFocus' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetInputFocus</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetInputFocus'>
+<funcprototype>
+  <funcdef><function>XSetInputFocus</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> focus</parameter></paramdef>
+  <paramdef>int<parameter> revert_to</parameter></paramdef>
+  <paramdef>Time<parameter> time</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>focus</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window,
+<symbol>PointerRoot</symbol>,
+or
+<symbol>None</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>revert_to</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies where the input focus reverts to if the window becomes not
+viewable.
+You can pass 
+<symbol>RevertToParent</symbol>,
+<symbol>RevertToPointerRoot</symbol>,
+or 
+<symbol>RevertToNone</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>time</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the time.
+You can pass either a timestamp or
+<symbol>CurrentTime</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetInputFocus' xrefstyle='select: title'/>
+function changes the input focus and the last-focus-change time.
+It has no effect if the specified time is earlier than the current
+last-focus-change time or is later than the current X server time.
+Otherwise, the last-focus-change time is set to the specified time
+(<symbol>CurrentTime</symbol>
+is replaced by the current X server time).
+<xref linkend='XSetInputFocus' xrefstyle='select: title'/>
+causes the X server to generate
+<symbol>FocusIn</symbol>
+and 
+<symbol>FocusOut</symbol>
+events.
+</para>
+<para>
+<!-- .LP -->
+Depending on the focus argument,
+the following occurs: 
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+If focus is
+<symbol>None</symbol>,
+all keyboard events are discarded until a new focus window is set,
+and the revert_to argument is ignored.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If focus is a window, 
+it becomes the keyboard's focus window.
+If a generated keyboard event would normally be reported to this window
+or one of its inferiors, the event is reported as usual. 
+Otherwise, the event is reported relative to the focus window.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If focus is
+<symbol>PointerRoot</symbol>,
+the focus window is dynamically taken to be the root window of whatever screen 
+the pointer is on at each keyboard event.  
+In this case, the revert_to argument is ignored.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+The specified focus window must be viewable at the time 
+<xref linkend='XSetInputFocus' xrefstyle='select: title'/>
+is called,
+or a
+<errorname>BadMatch</errorname>
+error results.
+If the focus window later becomes not viewable, 
+the X server
+evaluates the revert_to argument to determine the new focus window as follows: 
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+If revert_to is
+<symbol>RevertToParent</symbol>,
+the focus reverts to the parent (or the closest viewable ancestor), 
+and the new revert_to value is taken to be
+<symbol>RevertToNone</symbol>.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If revert_to is
+<symbol>RevertToPointerRoot</symbol>
+or 
+<symbol>RevertToNone</symbol>,
+the focus reverts to
+<symbol>PointerRoot</symbol>
+or
+<symbol>None</symbol>,
+respectively.
+When the focus reverts,
+the X server generates
+<symbol>FocusIn</symbol>
+and
+<symbol>FocusOut</symbol>
+events, but the last-focus-change time is not affected.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+<xref linkend='XSetInputFocus' xrefstyle='select: title'/>
+can generate
+<errorname>BadMatch</errorname>,
+<errorname>BadValue</errorname>,
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain the current input focus, use
+<xref linkend='XGetInputFocus' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetInputFocus</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetInputFocus'>
+<funcprototype>
+  <funcdef><function>XGetInputFocus</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> *focus_return</parameter></paramdef>
+  <paramdef>int<parameter> *revert_to_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>focus_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the focus window,
+<symbol>PointerRoot</symbol>,
+or 
+<symbol>None</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>revert_to_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the current focus state
+(<symbol>RevertToParent</symbol>,
+<symbol>RevertToPointerRoot</symbol>,
+or 
+<symbol>RevertToNone</symbol>).
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetInputFocus' xrefstyle='select: title'/>
+function returns the focus window and the current focus state.
+</para>
+</sect1>
+<sect1 id="Manipulating_the_Keyboard_and_Pointer_Settings">
+<title>Manipulating the Keyboard and Pointer Settings</title>
+<!-- .XS -->
+<!-- (SN Manipulating the Keyboard and Pointer Settings  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to
+change the keyboard control, obtain a list of the auto-repeat keys,
+turn keyboard auto-repeat on or off, ring the bell, 
+set or obtain the pointer button or keyboard mapping, 
+and obtain a bit vector for the keyboard.
+</para>
+<para>
+<!-- .LP -->
+<indexterm><primary>Keyboard</primary><secondary>bell volume</secondary></indexterm>
+<indexterm><primary>Keyboard</primary><secondary>keyclick volume</secondary></indexterm>
+<indexterm><primary>Keyboard</primary><secondary>bit vector</secondary></indexterm>
+<indexterm><primary>Mouse</primary><secondary>programming</secondary></indexterm>
+This section discusses 
+the user-preference options of bell, key click,
+pointer behavior, and so on.
+The default values for many of these options are server dependent.
+Not all implementations will actually be able to control all of these
+parameters.
+</para>
+<para>
+<!-- .LP -->
+The
+<xref linkend='XChangeKeyboardControl' xrefstyle='select: title'/>
+function changes control of a keyboard and operates on a
+<structname>XKeyboardControl</structname>
+structure:
+<!-- .sM -->
+</para>
+
+<literallayout class="monospaced">
+/* Mask bits for ChangeKeyboardControl */
+
+
+#define     KBBellPercent           (1L&lt;&lt;0)
+#define     KBBellPitch             (1L&lt;&lt;1)
+#define     KBBellDuration          (1L&lt;&lt;2)
+#define     KBLed                   (1L&lt;&lt;3)
+#define     KBLedMode               (1L&lt;&lt;4)
+#define     KBKey                   (1L&lt;&lt;5)
+#define     KBAutoRepeatMode        (1L&lt;&lt;6)
+
+
+/* Values */
+
+typedef struct {
+int key_click_percent;
+int bell_percent;
+int bell_pitch;
+int bell_duration;
+int led;
+int led_mode;                /* LedModeOn, LedModeOff */
+int key;
+int auto_repeat_mode;        /* AutoRepeatModeOff, AutoRepeatModeOn,
+                                AutoRepeatModeDefault */
+} XKeyboardControl;
+
+</literallayout>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The key_click_percent member sets the volume for key clicks between 0 (off) 
+and 100 (loud) inclusive, if possible.  
+A setting of -1 restores the default.
+Other negative values generate a
+<errorname>BadValue</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+The bell_percent sets the base volume for the bell between 0 (off) and 100
+(loud) inclusive, if possible.  
+A setting of -1 restores the default.
+Other negative values generate a
+<errorname>BadValue</errorname>
+error.
+The bell_pitch member sets the pitch (specified in Hz) of the bell, if possible.
+A setting of -1 restores the default.
+Other negative values generate a
+<errorname>BadValue</errorname>
+error.
+The bell_duration member sets the duration of the
+bell specified in milliseconds, if possible.  
+A setting of -1 restores the default.
+Other negative values generate a
+<errorname>BadValue</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+If both the led_mode and led members are specified,
+the state of that <acronym>LED</acronym> is changed, if possible.  
+The led_mode member can be set to
+<symbol>LedModeOn</symbol>
+or
+<symbol>LedModeOff</symbol>.
+If only led_mode is specified, the state of
+all LEDs are changed, if possible.  
+At most 32 LEDs numbered from one are supported. 
+No standard interpretation of LEDs is defined.
+If led is specified without led_mode, a
+<errorname>BadMatch</errorname>
+error results. 
+</para>
+<para>
+<!-- .LP -->
+If both the auto_repeat_mode and key members are specified, 
+the auto_repeat_mode of that key is changed (according to
+<symbol>AutoRepeatModeOn</symbol>,
+<symbol>AutoRepeatModeOff</symbol>,
+or
+<symbol>AutoRepeatModeDefault</symbol>),
+if possible.
+If only auto_repeat_mode is
+specified, the global auto_repeat_mode for the entire keyboard is
+changed, if possible, and does not affect the per-key settings.
+If a key is specified without an auto_repeat_mode, a
+<errorname>BadMatch</errorname>
+error results.
+Each key has an individual mode of whether or not it should auto-repeat
+and a default setting for the mode.
+In addition,
+there is a global mode of whether auto-repeat should be enabled or not
+and a default setting for that mode.
+When global mode is
+<symbol>AutoRepeatModeOn</symbol>,
+keys should obey their individual auto-repeat modes.
+When global mode is
+<symbol>AutoRepeatModeOff</symbol>,
+no keys should auto-repeat.
+An auto-repeating key generates alternating
+<symbol>KeyPress</symbol>
+and
+<symbol>KeyRelease</symbol>
+events.
+When a key is used as a modifier,
+it is desirable for the key not to auto-repeat,
+regardless of its auto-repeat setting.
+</para>
+<para>
+<!-- .LP -->
+A bell generator connected with the console but not directly on a
+keyboard is treated as if it were part of the keyboard.
+The order in which controls are verified and altered is server-dependent.
+If an error is generated, a subset of the controls may have been altered.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+</para>
+<indexterm significance="preferred"><primary>XChangeKeyboardControl</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XChangeKeyboardControl'>
+<funcprototype>
+  <funcdef><function>XChangeKeyboardControl</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> value_mask</parameter></paramdef>
+  <paramdef>XKeyboardControl<parameter> *values</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>value_mask</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies which controls to change.
+This mask is the bitwise inclusive OR of the valid control mask bits.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>values</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies one value for each bit set to 1 in the mask.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XChangeKeyboardControl' xrefstyle='select: title'/>
+function controls the keyboard characteristics defined by the
+<structname>XKeyboardControl</structname>
+structure.
+The value_mask argument specifies which values are to be changed.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XChangeKeyboardControl' xrefstyle='select: title'/>
+can generate
+<errorname>BadMatch</errorname>
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain the current control values for the keyboard, use
+<xref linkend='XGetKeyboardControl' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetKeyboardControl</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetKeyboardControl'>
+<funcprototype>
+  <funcdef><function>XGetKeyboardControl</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XKeyboardState<parameter> *values_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>values_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the current keyboard controls in the specified
+<structname>XKeyboardState</structname>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetKeyboardControl' xrefstyle='select: title'/>
+function returns the current control values for the keyboard to the
+<structname>XKeyboardState</structname>
+structure.
+</para>
+<para>
+<!-- .LP -->
+<indexterm><primary>XGetKeyboardControl</primary></indexterm>
+<indexterm significance="preferred"><primary>XKeyboardState</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i  -->
+<!-- .ta .5i -->
+typedef struct {
+       int key_click_percent;
+       int bell_percent;
+       unsigned int bell_pitch, bell_duration;
+       unsigned long led_mask;
+       int global_auto_repeat;
+       char auto_repeats[32];
+} XKeyboardState;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+For the LEDs, 
+the least significant bit of led_mask corresponds to <acronym>LED</acronym> one,
+and each bit set to 1 in led_mask indicates an <acronym>LED</acronym> that is lit.
+The global_auto_repeat member can be set to
+<symbol>AutoRepeatModeOn</symbol>
+or
+<symbol>AutoRepeatModeOff</symbol>.
+The auto_repeats member is a bit vector.
+Each bit set to 1 indicates that auto-repeat is enabled 
+for the corresponding key.
+The vector is represented as 32 bytes.  
+Byte N (from 0) contains the bits for keys 8N to 8N + 7
+with the least significant bit in the byte representing key 8N.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To turn on keyboard auto-repeat, use
+<xref linkend='XAutoRepeatOn' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XAutoRepeatOn</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XAutoRepeatOn'>
+<funcprototype>
+  <funcdef><function>XAutoRepeatOn</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XAutoRepeatOn' xrefstyle='select: title'/>
+function turns on auto-repeat for the keyboard on the specified display.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To turn off keyboard auto-repeat, use
+<xref linkend='XAutoRepeatOff' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XAutoRepeatOff</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XAutoRepeatOff'>
+<funcprototype>
+  <funcdef><function>XAutoRepeatOff</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XAutoRepeatOff' xrefstyle='select: title'/>
+function turns off auto-repeat for the keyboard on the specified display.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To ring the bell, use
+<xref linkend='XBell' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XBell</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XBell'>
+<funcprototype>
+  <funcdef><function>XBell</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> percent</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>percent</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the volume for the bell,
+which can range from -100 to 100 inclusive. 
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XBell' xrefstyle='select: title'/>
+function rings the bell on the keyboard on the specified display, if possible.
+The specified volume is relative to the base volume for the keyboard.
+If the value for the percent argument is not in the range -100 to 100
+inclusive, a
+<errorname>BadValue</errorname>
+error results.
+The volume at which the bell rings
+when the percent argument is nonnegative is:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+base - [(base * percent) / 100] + percent
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+The volume at which the bell rings
+when the percent argument is negative is:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+base + [(base * percent) / 100]
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+To change the base volume of the bell, use
+<xref linkend='XChangeKeyboardControl' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XBell' xrefstyle='select: title'/>
+can generate a
+<errorname>BadValue</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain a bit vector that describes the state of the keyboard, use
+<xref linkend='XQueryKeymap' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XQueryKeymap</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XQueryKeymap'>
+<funcprototype>
+  <funcdef><function>XQueryKeymap</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>char<parameter> keys_return[32]</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>keys_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns an array of bytes that identifies which keys are pressed down.
+Each bit represents one key of the keyboard.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XQueryKeymap' xrefstyle='select: title'/>
+function returns a bit vector for the logical state of the keyboard, 
+where each bit set to 1 indicates that the corresponding key is currently 
+pressed down.
+The vector is represented as 32 bytes.
+Byte N (from 0) contains the bits for keys 8N to 8N + 7 
+with the least significant bit in the byte representing key 8N.
+</para>
+<para>
+<!-- .LP -->
+Note that the logical state of a device (as seen by client applications)
+may lag the physical state if device event processing is frozen.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set the mapping of the pointer buttons, use
+<xref linkend='XSetPointerMapping' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetPointerMapping</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetPointerMapping'>
+<funcprototype>
+  <funcdef>int <function>XSetPointerMapping</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>unsignedchar<parameter> map[]</parameter></paramdef>
+  <paramdef>int<parameter> nmap</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>map</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the mapping list.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nmap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of items in the mapping list.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetPointerMapping' xrefstyle='select: title'/>
+function sets the mapping of the pointer.
+If it succeeds, the X server generates a
+<symbol>MappingNotify</symbol>
+event, and
+<xref linkend='XSetPointerMapping' xrefstyle='select: title'/>
+returns
+<symbol>MappingSuccess</symbol>.
+Element map[i] defines the logical button number for the physical button
+i+1.
+The length of the list must be the same as
+<xref linkend='XGetPointerMapping' xrefstyle='select: title'/>
+would return,
+or a
+<errorname>BadValue</errorname>
+error results.
+A zero element disables a button, and elements are not restricted in
+value by the number of physical buttons.
+However, no two elements can have the same nonzero value,
+or a
+<errorname>BadValue</errorname>
+error results.
+If any of the buttons to be altered are logically in the down state,
+<xref linkend='XSetPointerMapping' xrefstyle='select: title'/>
+returns
+<symbol>MappingBusy</symbol>,
+and the mapping is not changed.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetPointerMapping' xrefstyle='select: title'/>
+can generate a
+<errorname>BadValue</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To get the pointer mapping, use
+<xref linkend='XGetPointerMapping' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetPointerMapping</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetPointerMapping'>
+<funcprototype>
+  <funcdef>int <function>XGetPointerMapping</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>unsignedchar<parameter> map_return[]</parameter></paramdef>
+  <paramdef>int<parameter> nmap</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>map_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the mapping list.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nmap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of items in the mapping list.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetPointerMapping' xrefstyle='select: title'/>
+function returns the current mapping of the pointer.
+Pointer buttons are numbered starting from one.
+<xref linkend='XGetPointerMapping' xrefstyle='select: title'/>
+returns the number of physical buttons actually on the pointer.
+The nominal mapping for a pointer is map[i]=i+1.
+The nmap argument specifies the length of the array where the pointer
+mapping is returned, and only the first nmap elements are returned 
+in map_return.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To control the pointer's interactive feel, use
+<xref linkend='XChangePointerControl' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XChangePointerControl</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XChangePointerControl'>
+<funcprototype>
+  <funcdef><function>XChangePointerControl</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Booldo_accel,<parameter> do_threshold</parameter></paramdef>
+  <paramdef>intaccel_numerator,<parameter> accel_denominator</parameter></paramdef>
+  <paramdef>int<parameter> threshold</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>do_accel</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a Boolean value that controls whether the values for 
+the accel_numerator or accel_denominator are used.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>do_threshold</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a Boolean value that controls whether the value for the 
+threshold is used.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>accel_numerator</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the numerator for the acceleration multiplier.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>accel_denominator</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the denominator for the acceleration multiplier.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>threshold</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the acceleration threshold.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XChangePointerControl' xrefstyle='select: title'/>
+function defines how the pointing device moves.
+The acceleration, expressed as a fraction, is a
+multiplier for movement. 
+For example,
+specifying 3/1 means the pointer moves three times as fast as normal.
+The fraction may be rounded arbitrarily by the X server.  
+Acceleration
+only takes effect if the pointer moves more than threshold pixels at
+once and only applies to the amount beyond the value in the threshold argument.
+Setting a value to -1 restores the default.
+The values of the do_accel and do_threshold arguments must be 
+<symbol>True</symbol>
+for the pointer values to be set,
+or the parameters are unchanged.
+Negative values (other than -1) generate a
+<errorname>BadValue</errorname>
+error, as does a zero value
+for the accel_denominator argument.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XChangePointerControl' xrefstyle='select: title'/>
+can generate a
+<errorname>BadValue</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To get the current pointer parameters, use
+<xref linkend='XGetPointerControl' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetPointerControl</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetPointerControl'>
+<funcprototype>
+  <funcdef><function>XGetPointerControl</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int*accel_numerator_return,<parameter> *accel_denominator_return</parameter></paramdef>
+  <paramdef>int<parameter> *threshold_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>accel_numerator_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the numerator for the acceleration multiplier.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>accel_denominator_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the denominator for the acceleration multiplier.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>threshold_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the acceleration threshold.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetPointerControl' xrefstyle='select: title'/>
+function returns the pointer's current acceleration multiplier
+and acceleration threshold.
+</para>
+</sect1>
+<sect1 id="Manipulating_the_Keyboard_Encoding">
+<title>Manipulating the Keyboard Encoding</title>
+<!-- .XS -->
+<!-- (SN Manipulating the Keyboard Encoding  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+A KeyCode represents a physical (or logical) key.  
+KeyCodes lie in the inclusive range [8,255].  
+A KeyCode value carries no intrinsic information,
+although server implementors may attempt to encode geometry 
+(for example, matrix) information in some fashion so that it can
+be interpreted in a server-dependent fashion.
+The mapping between keys and KeyCodes cannot be changed.
+</para>
+<para>
+<!-- .LP -->
+A KeySym is an encoding of a symbol on the cap of a key.  
+The set of defined KeySyms includes the ISO Latin character sets (1-4), 
+Katakana, Arabic, Cyrillic, Greek, Technical,
+Special, Publishing, APL, Hebrew, Thai, Korean
+and a miscellany of keys found
+on keyboards (Return, Help, Tab, and so on).  
+To the extent possible, these sets are derived from international
+standards. 
+In areas where no standards exist,
+some of these sets are derived from Digital Equipment Corporation standards.
+The list of defined symbols can be found in
+<filename class="headerfile">&lt;X11/keysymdef.h&gt;</filename>.
+<indexterm type="file"><primary><filename class="headerfile">X11/keysymdef.h</filename></primary></indexterm>
+<indexterm><primary>Files</primary><secondary><filename class="headerfile">&lt;X11/keysymdef.h&gt;</filename></secondary></indexterm>
+<indexterm><primary>Headers</primary><secondary><filename class="headerfile">&lt;X11/keysymdef.h&gt;</filename></secondary></indexterm>
+Unfortunately, some C preprocessors have
+limits on the number of defined symbols.
+If you must use KeySyms not
+in the Latin 1-4, Greek, and miscellaneous classes,
+you may have to define a symbol for those sets.
+Most applications usually only include 
+<filename class="headerfile">&lt;X11/keysym.h&gt;</filename>,
+<indexterm type="file"><primary><filename class="headerfile">X11/keysym.h</filename></primary></indexterm>
+<indexterm><primary>Files</primary><secondary><filename class="headerfile">&lt;X11/keysym.h&gt;</filename></secondary></indexterm>
+<indexterm><primary>Headers</primary><secondary><filename class="headerfile">&lt;X11/keysym.h&gt;</filename></secondary></indexterm>
+which defines symbols for ISO Latin 1-4, Greek, and miscellaneous.
+</para>
+<para>
+<!-- .LP -->
+A list of KeySyms is associated with each KeyCode.
+The list is intended to convey the set of symbols on the corresponding key.
+If the list (ignoring trailing
+<symbol>NoSymbol</symbol>
+entries) is 
+a single KeySym ``<emphasis remap='I'>K</emphasis>'',
+then the list is treated as if it were the list 
+``<emphasis remap='I'>K</emphasis> NoSymbol <emphasis remap='I'>K</emphasis> NoSymbol''.
+If the list (ignoring trailing
+<symbol>NoSymbol</symbol>
+entries) is a pair of KeySyms ``<emphasis remap='I'>K1 K2</emphasis>'',
+then the list is treated as if it were the list ``<emphasis remap='I'>K1 K2 K1 K2</emphasis>''.
+If the list (ignoring trailing
+<symbol>NoSymbol</symbol>
+entries) is a triple of KeySyms ``<emphasis remap='I'>K1 K2 K3</emphasis>'',
+then the list is treated as if it were the list ``<emphasis remap='I'>K1 K2 K3</emphasis> NoSymbol''.
+When an explicit ``void'' element is desired in the list,
+the value
+<symbol>VoidSymbol</symbol>
+can be used.
+</para>
+<para>
+<!-- .LP -->
+The first four elements of the list are split into two groups of KeySyms.
+Group 1 contains the first and second KeySyms;
+Group 2 contains the third and fourth KeySyms.
+Within each group,
+if the second element of the group is
+<symbol>NoSymbol</symbol>,
+then the group should be treated as if the second element were 
+the same as the first element,
+except when the first element is an alphabetic KeySym ``<emphasis remap='I'>K</emphasis>'' 
+for which both lowercase and uppercase forms are defined.
+In that case,
+the group should be treated as if the first element were 
+the lowercase form of ``<emphasis remap='I'>K</emphasis>'' and the second element were 
+the uppercase form of ``<emphasis remap='I'>K</emphasis>''.
+</para>
+<para>
+<!-- .LP -->
+The standard rules for obtaining a KeySym from a
+<symbol>KeyPress</symbol>
+event make use of only the Group 1 and Group 2 KeySyms;
+no interpretation of other KeySyms in the list is given.
+Which group to use is determined by the modifier state.
+Switching between groups is controlled by the KeySym named MODE SWITCH,
+by attaching that KeySym to some KeyCode and attaching 
+that KeyCode to any one of the modifiers
+<symbol>Mod1</symbol>
+through
+<symbol>Mod5</symbol>.
+This modifier is called the <emphasis remap='I'>group modifier</emphasis>.
+For any KeyCode,
+Group 1 is used when the group modifier is off,
+and Group 2 is used when the group modifier is on.
+</para>
+<para>
+<!-- .LP -->
+The
+<symbol>Lock</symbol>
+modifier is interpreted as CapsLock when the KeySym named XK_Caps_Lock
+is attached to some KeyCode and that KeyCode is attached to the
+<symbol>Lock</symbol>
+modifier.  The
+<symbol>Lock</symbol>
+modifier is interpreted as ShiftLock when the KeySym named XK_Shift_Lock
+is attached to some KeyCode and that KeyCode is attached to the
+<symbol>Lock</symbol>
+modifier.  If the
+<symbol>Lock</symbol>
+modifier could be interpreted as both
+CapsLock and ShiftLock, the CapsLock interpretation is used.
+</para>
+<para>
+<!-- .LP -->
+The operation of keypad keys is controlled by the KeySym named XK_Num_Lock,
+by attaching that KeySym to some KeyCode and attaching that KeyCode to any
+one of the modifiers
+<symbol>Mod1</symbol>
+through
+<symbol>Mod5</symbol>.
+This modifier is called the
+<emphasis remap='I'>numlock modifier</emphasis>.  The standard KeySyms with the prefix ``XK_KP_''
+in their
+name are called keypad KeySyms; these are KeySyms with numeric value in
+the hexadecimal range 0xFF80 to 0xFFBD inclusive.  In addition,
+vendor-specific KeySyms in the hexadecimal range 0x11000000 to 0x1100FFFF
+are also keypad KeySyms.
+</para>
+<para>
+<!-- .LP -->
+Within a group, the choice of KeySym is determined by applying the first
+rule that is satisfied from the following list:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+The numlock modifier is on and the second KeySym is a keypad KeySym.  In
+this case, if the
+<symbol>Shift</symbol>
+modifier is on, or if the
+<symbol>Lock</symbol>
+modifier is on and
+is interpreted as ShiftLock, then the first KeySym is used, otherwise the
+second KeySym is used.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The
+<symbol>Shift</symbol>
+and
+<symbol>Lock</symbol>
+modifiers are both off.  In this case, the first
+KeySym is used.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The
+<symbol>Shift</symbol>
+modifier is off, and the
+<symbol>Lock</symbol>
+modifier is on and is
+interpreted as CapsLock.  In this case, the first KeySym is used, but if
+that KeySym is lowercase alphabetic, then the corresponding uppercase
+KeySym is used instead.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The
+<symbol>Shift</symbol>
+modifier is on, and the
+<symbol>Lock</symbol>
+modifier is on and is interpreted
+as CapsLock.  In this case, the second KeySym is used, but if that KeySym
+is lowercase alphabetic, then the corresponding uppercase KeySym is used
+instead.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The
+<symbol>Shift</symbol>
+modifier is on, or the
+<symbol>Lock</symbol>
+modifier is on and is interpreted
+as ShiftLock, or both.  In this case, the second KeySym is used.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+No spatial geometry of the symbols on the key is defined by
+their order in the KeySym list, 
+although a geometry might be defined on a
+server-specific basis.
+The X server does not use the mapping between KeyCodes and KeySyms.
+Rather, it merely stores it for reading and writing by clients.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To obtain the legal KeyCodes for a display, use
+<xref linkend='XDisplayKeycodes' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDisplayKeycodes</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDisplayKeycodes'>
+<funcprototype>
+  <funcdef><function>XDisplayKeycodes</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int*min_keycodes_return,<parameter> *max_keycodes_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>min_keycodes_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the minimum number of KeyCodes.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>max_keycodes_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the maximum number of KeyCodes.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XDisplayKeycodes' xrefstyle='select: title'/>
+function returns the min-keycodes and max-keycodes supported by the
+specified display.
+The minimum number of KeyCodes returned is never less than 8,
+and the maximum number of KeyCodes returned is never greater than 255.
+Not all KeyCodes in this range are required to have corresponding keys.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To obtain the symbols for the specified KeyCodes, use
+<xref linkend='XGetKeyboardMapping' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetKeyboardMapping</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetKeyboardMapping'>
+<funcprototype>
+  <funcdef>KeySym *<function>XGetKeyboardMapping</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>KeyCode<parameter> first_keycode</parameter></paramdef>
+  <paramdef>int<parameter> keycode_count</parameter></paramdef>
+  <paramdef>int<parameter> *keysyms_per_keycode_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Kc returned -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>first_keycode</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the first KeyCode that is to be (Kc.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>keycode_count</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of KeyCodes that are to be returned.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>keysyms_per_keycode_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the number of KeySyms per KeyCode.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetKeyboardMapping' xrefstyle='select: title'/>
+function returns the symbols for the specified number of KeyCodes
+starting with first_keycode.
+The value specified in first_keycode must be greater than 
+or equal to min_keycode as returned by
+<xref linkend='XDisplayKeycodes' xrefstyle='select: title'/>,
+or a
+<errorname>BadValue</errorname>
+error results.
+In addition, the following expression must be less than or equal 
+to max_keycode as returned by
+<xref linkend='XDisplayKeycodes' xrefstyle='select: title'/>:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+first_keycode + keycode_count - 1
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+If this is not the case, a 
+<errorname>BadValue</errorname>
+error results. 
+The number of elements in the KeySyms list is:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+keycode_count * keysyms_per_keycode_return
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+KeySym number N, counting from zero, for KeyCode K has the following index
+in the list, counting from zero: 
+<literallayout class="monospaced">
+(K - first_code) * keysyms_per_code_return + N
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+The X server arbitrarily chooses the keysyms_per_keycode_return value 
+to be large enough to report all requested symbols. 
+A special KeySym value of 
+<symbol>NoSymbol</symbol>
+is used to fill in unused elements for
+individual KeyCodes.
+To free the storage returned by 
+<xref linkend='XGetKeyboardMapping' xrefstyle='select: title'/>,
+use
+<xref linkend='XFree' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGetKeyboardMapping' xrefstyle='select: title'/>
+can generate a
+<errorname>BadValue</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To change the keyboard mapping, use
+<xref linkend='XChangeKeyboardMapping' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XChangeKeyboardMapping</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XChangeKeyboardMapping'>
+<funcprototype>
+  <funcdef><function>XChangeKeyboardMapping</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> first_keycode</parameter></paramdef>
+  <paramdef>int<parameter> keysyms_per_keycode</parameter></paramdef>
+  <paramdef>KeySym<parameter> *keysyms</parameter></paramdef>
+  <paramdef>int<parameter> num_codes</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Kc changed -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>first_keycode</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the first KeyCode that is to be (Kc.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>keysyms_per_keycode</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of KeySyms per KeyCode.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>keysyms</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies an array of KeySyms.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>num_codes</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of KeyCodes that are to be changed.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XChangeKeyboardMapping' xrefstyle='select: title'/>
+function defines the symbols for the specified number of KeyCodes
+starting with first_keycode.
+The symbols for KeyCodes outside this range remain unchanged.  
+The number of elements in keysyms must be:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+num_codes * keysyms_per_keycode
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+The specified first_keycode must be greater than or equal to min_keycode 
+returned by
+<xref linkend='XDisplayKeycodes' xrefstyle='select: title'/>,
+or a 
+<errorname>BadValue</errorname>
+error results.
+In addition, the following expression must be less than or equal to 
+max_keycode as returned by
+<xref linkend='XDisplayKeycodes' xrefstyle='select: title'/>,
+or a
+<errorname>BadValue</errorname>
+error results:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+first_keycode + num_codes - 1
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+KeySym number N, counting from zero, for KeyCode K has the following index
+in keysyms, counting from zero: 
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+(K - first_keycode) * keysyms_per_keycode + N
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+The specified keysyms_per_keycode can be chosen arbitrarily by the client
+to be large enough to hold all desired symbols. 
+A special KeySym value of 
+<symbol>NoSymbol</symbol>
+should be used to fill in unused elements 
+for individual KeyCodes.  
+It is legal for 
+<symbol>NoSymbol</symbol>
+to appear in nontrailing positions
+of the effective list for a KeyCode.
+<xref linkend='XChangeKeyboardMapping' xrefstyle='select: title'/>
+generates a 
+<symbol>MappingNotify</symbol>
+event.
+</para>
+<para>
+<!-- .LP -->
+There is no requirement that the X server interpret this mapping. 
+It is merely stored for reading and writing by clients.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XChangeKeyboardMapping' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+The next six functions make use of the 
+<structname>XModifierKeymap</structname>
+data structure, which contains:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XModifierKeymap</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef struct {
+       int max_keypermod;      /* This server's max number of keys per modifier */
+       KeyCode *modifiermap;   /* An 8 by max_keypermod array of the modifiers */
+} XModifierKeymap;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+To create an
+<structname>XModifierKeymap</structname>
+structure, use
+<xref linkend='XNewModifiermap' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XNewModifiermap</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XNewModifiermap'>
+<funcprototype>
+  <funcdef>XModifierKeymap *<function>XNewModifiermap</function></funcdef>
+  <paramdef>int<parameter> max_keys_per_mod</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>max_keys_per_mod</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of KeyCode entries preallocated to the modifiers
+in the map.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XNewModifiermap' xrefstyle='select: title'/>
+function returns a pointer to
+<structname>XModifierKeymap</structname>
+structure for later use.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To add a new entry to an 
+<structname>XModifierKeymap</structname>
+structure, use
+<xref linkend='XInsertModifiermapEntry' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XInsertModifiermapEntry</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XInsertModifiermapEntry'>
+<funcprototype>
+  <funcdef>XModifierKeymap *<function>XInsertModifiermapEntry</function></funcdef>
+  <paramdef>XModifierKeymap<parameter> *modmap</parameter></paramdef>
+  <paramdef>KeyCode<parameter> keycode_entry</parameter></paramdef>
+  <paramdef>int<parameter> modifier</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>modmap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the 
+<structname>XModifierKeymap</structname>
+structure.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>keycode_entry</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the KeyCode. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>modifier</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the modifier.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XInsertModifiermapEntry' xrefstyle='select: title'/>
+function adds the specified KeyCode to the set that controls the specified
+modifier and returns the resulting
+<structname>XModifierKeymap</structname>
+structure (expanded as needed).
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To delete an entry from an 
+<structname>XModifierKeymap</structname>
+structure, use
+<xref linkend='XDeleteModifiermapEntry' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDeleteModifiermapEntry</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDeleteModifiermapEntry'>
+<funcprototype>
+  <funcdef>XModifierKeymap *<function>XDeleteModifiermapEntry</function></funcdef>
+  <paramdef>XModifierKeymap<parameter> *modmap</parameter></paramdef>
+  <paramdef>KeyCode<parameter> keycode_entry</parameter></paramdef>
+  <paramdef>int<parameter> modifier</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>modmap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the 
+<structname>XModifierKeymap</structname>
+structure.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>keycode_entry</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the KeyCode. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>modifier</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the modifier.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XDeleteModifiermapEntry' xrefstyle='select: title'/>
+function deletes the specified KeyCode from the set that controls the
+specified modifier and returns a pointer to the resulting
+<structname>XModifierKeymap</structname>
+structure.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To destroy an
+<structname>XModifierKeymap</structname>
+structure, use
+<xref linkend='XFreeModifiermap' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XFreeModifiermap</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XFreeModifiermap'>
+<funcprototype>
+  <funcdef><function>XFreeModifiermap</function></funcdef>
+  <paramdef>XModifierKeymap<parameter> *modmap</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>modmap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the 
+<structname>XModifierKeymap</structname>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XFreeModifiermap' xrefstyle='select: title'/>
+function frees the specified
+<structname>XModifierKeymap</structname>
+structure.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set the KeyCodes to be used as modifiers, use
+<xref linkend='XSetModifierMapping' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetModifierMapping</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetModifierMapping'>
+<funcprototype>
+  <funcdef>int <function>XSetModifierMapping</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XModifierKeymap<parameter> *modmap</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>modmap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the 
+<structname>XModifierKeymap</structname>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetModifierMapping' xrefstyle='select: title'/>
+function specifies the KeyCodes of the keys (if any) that are to be used 
+as modifiers.
+If it succeeds,
+the X server generates a
+<symbol>MappingNotify</symbol>
+event, and
+<xref linkend='XSetModifierMapping' xrefstyle='select: title'/>
+returns
+<symbol>MappingSuccess</symbol>.
+X permits at most 8 modifier keys.
+If more than 8 are specified in the
+<structname>XModifierKeymap</structname>
+structure, a
+<errorname>BadLength</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+The modifiermap member of the 
+<structname>XModifierKeymap</structname>
+structure contains 8 sets of max_keypermod KeyCodes, 
+one for each modifier in the order 
+<symbol>Shift</symbol>,
+<symbol>Lock</symbol>,
+<symbol>Control</symbol>,
+<symbol>Mod1</symbol>,
+<symbol>Mod2</symbol>,
+<symbol>Mod3</symbol>,
+<symbol>Mod4</symbol>,
+and 
+<symbol>Mod5</symbol>.
+Only nonzero KeyCodes have meaning in each set, 
+and zero KeyCodes are ignored.
+In addition, all of the nonzero KeyCodes must be in the range specified by 
+min_keycode and max_keycode in the 
+<type>Display</type>
+structure,
+or a 
+<errorname>BadValue</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+An X server can impose restrictions on how modifiers can be changed, 
+for example,
+if certain keys do not generate up transitions in hardware,
+if auto-repeat cannot be disabled on certain keys,
+or if multiple modifier keys are not supported.  
+If some such restriction is violated, 
+the status reply is
+<symbol>MappingFailed</symbol>,
+and none of the modifiers are changed.
+If the new KeyCodes specified for a modifier differ from those
+currently defined and any (current or new) keys for that modifier are
+in the logically down state, 
+<xref linkend='XSetModifierMapping' xrefstyle='select: title'/>
+returns
+<symbol>MappingBusy</symbol>,
+and none of the modifiers is changed.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetModifierMapping' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>
+and 
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain the KeyCodes used as modifiers, use
+<xref linkend='XGetModifierMapping' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetModifierMapping</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetModifierMapping'>
+<funcprototype>
+  <funcdef>XModifierKeymap *<function>XGetModifierMapping</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetModifierMapping' xrefstyle='select: title'/>
+function returns a pointer to a newly created
+<structname>XModifierKeymap</structname>
+structure that contains the keys being used as modifiers.
+The structure should be freed after use by calling
+<xref linkend='XFreeModifiermap' xrefstyle='select: title'/>.
+If only zero values appear in the set for any modifier, 
+that modifier is disabled.
+<!-- .bp -->
+
+
+</para>
+</sect1>
+</chapter>
diff --git a/specs/libX11/CH13.xml b/specs/libX11/CH13.xml
new file mode 100644 (file)
index 0000000..e710414
--- /dev/null
@@ -0,0 +1,10344 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+         "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
+<chapter id='Locales_and_Internationalized_Text_Functions'>
+<title>Locales and Internationalized Text Functions</title>
+
+<para>
+An internationalized application is one that is adaptable to the requirements of different native
+languages, local customs, and character string encodings. The process of adapting the operation
+to a particular native language, local custom, or string encoding is called localization. A goal of
+internationalization is to permit localization without program source modifications or recompilation.
+</para>
+<para>
+As one of the localization mechanisms, Xlib provides an X Input Method (<acronym>XIM</acronym>)
+functional interface for internationalized text input and an X Output Method
+(<acronym>XOM</acronym>) functional interface for internationalized text output.
+</para>
+<para>
+Internationalization in X is based on the concept of a locale. A locale defines the localized
+behavior of a program at run time. Locales affect Xlib in its:
+</para>
+
+<itemizedlist>
+  <listitem><para>Encoding and processing of input method text</para></listitem>
+  <listitem><para>Encoding of resource files and values</para></listitem>
+  <listitem><para>Encoding and imaging of text strings</para></listitem>
+  <listitem><para>Encoding and decoding for inter-client text communication</para></listitem>
+</itemizedlist>
+
+
+<para>
+•
+Encoding and decoding for inter-client text communication
+Characters from various languages are represented in a computer using an encoding.
+Different languages have different encodings, and there are even different
+encodings for the same characters in the same language.
+</para>
+<para>
+This chapter defines support for localized text imaging and text input and describes the locale
+mechanism that controls all locale-dependent Xlib functions. Sets of functions are provided for
+multibyte (char *) text as well as wide character (wchar_t) text in the form supported by the host
+C language environment. The multibyte and wide character functions are equivalent except for
+the form of the text argument.
+</para>
+<para>
+The Xlib internationalization functions are not meant to provide support for
+multilingual applications (mixing multiple languages within a single piece of text),
+but they make it possible to implement applications that work in limited
+fashion with more than one language in independent contexts.
+</para>
+<para>
+The remainder of this chapter discusses:
+</para>
+
+<itemizedlist>
+  <listitem><para>X locale management</para></listitem>
+  <listitem><para>Locale and modifier dependencies</para></listitem>
+  <listitem><para>Variable argument lists</para></listitem>
+  <listitem><para>Output methods</para></listitem>
+  <listitem><para>Input methods</para></listitem>
+  <listitem><para>String constants</para></listitem>
+</itemizedlist>
+
+
+<sect1 id="X_Locale_Management">
+<title>X Locale Management</title>
+<!-- .XS -->
+<!-- (SN X Locale Management -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+X supports one or more of the locales defined by the host environment.
+On implementations that conform to the ANSI C library,
+the locale announcement method is
+<function>setlocale</function>.
+This function configures the locale operation of both
+the host C library and Xlib.
+The operation of Xlib is governed by the LC_CTYPE category;
+this is called the <emphasis remap='I'>current locale</emphasis>.
+An implementation is permitted to provide implementation-dependent
+mechanisms for announcing the locale in addition to
+<function>setlocale</function>.
+</para>
+<para>
+<!-- .LP -->
+On implementations that do not conform to the ANSI C library, 
+the locale announcement method is Xlib implementation-dependent.
+</para>
+<para>
+<!-- .LP -->
+The mechanism by which the semantic operation of Xlib is defined
+for a specific locale is implementation-dependent.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+X is not required to support all the locales supported by the host.
+To determine if the current locale is supported by X, use
+<function>XSupportsLocale</function>.
+</para>
+
+<para>Bool XSupportsLocale()</para>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The 
+<function>XSupportsLocale</function>
+function returns 
+<symbol>True</symbol>
+if Xlib functions are capable of operating under the current locale.
+If it returns 
+<symbol>False</symbol>,
+Xlib locale-dependent functions for which the 
+<symbol>XLocaleNotSupported</symbol>
+return status is defined will return 
+<symbol>XLocaleNotSupported</symbol>.
+Other Xlib locale-dependent routines will operate in the ``C'' locale.
+</para>
+<para>
+<!-- .LP -->
+The client is responsible for selecting its locale and X modifiers.
+Clients should provide a means for the user to override the clients'
+locale selection at client invocation.
+Most single-display X clients operate in a single locale 
+for both X and the host processing environment.
+They will configure the locale by calling three functions: 
+the host locale configuration function,
+<function>XSupportsLocale</function>,
+and 
+<xref linkend='XSetLocaleModifiers' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+The semantics of certain categories of X internationalization capabilities
+can be configured by setting modifiers.
+Modifiers are named by implementation-dependent and locale-specific strings.
+The only standard use for this capability at present
+is selecting one of several styles of keyboard input method.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To configure Xlib locale modifiers for the current locale, use
+<xref linkend='XSetLocaleModifiers' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetLocaleModifiers</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetLocaleModifiers'>
+<funcprototype>
+  <funcdef>char *<function>XSetLocaleModifiers</function></funcdef>
+  <paramdef>char<parameter> *modifier_list</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>modifier_list</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the modifiers.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetLocaleModifiers' xrefstyle='select: title'/>
+function sets the X modifiers for the current locale setting.
+The modifier_list argument is a null-terminated string of the form
+``{@<emphasis remap='I'>category</emphasis>=<emphasis remap='I'>value</emphasis>}'', that is,
+having zero or more concatenated ``@<emphasis remap='I'>category</emphasis>=<emphasis remap='I'>value</emphasis>''
+entries, where <emphasis remap='I'>category</emphasis> is a category name 
+and <emphasis remap='I'>value</emphasis> is the (possibly empty) setting for that category.
+The values are encoded in the current locale.
+Category names are restricted to the <acronym>POSIX</acronym> Portable Filename Character Set.
+</para>
+<para>
+<!-- .LP -->
+The local host X locale modifiers announcer (on <acronym>POSIX</acronym>-compliant systems,
+the XMODIFIERS environment variable) is appended to the modifier_list to
+provide default values on the local host.
+If a given category appears more than once in the list,
+the first setting in the list is used.
+If a given category is not included in the full modifier list,
+the category is set to an implementation-dependent default
+for the current locale.
+An empty value for a category explicitly specifies the
+implementation-dependent default.
+</para>
+<para>
+<!-- .LP -->
+If the function is successful, it returns a pointer to a string.
+The contents of the string are such that a subsequent call with that string
+(in the same locale) will restore the modifiers to the same settings.
+If modifier_list is a NULL pointer,
+<xref linkend='XSetLocaleModifiers' xrefstyle='select: title'/>
+also returns a pointer to such a string,
+and the current locale modifiers are not changed.
+</para>
+<para>
+<!-- .LP -->
+If invalid values are given for one or more modifier categories supported by
+the locale, a NULL pointer is returned, and none of the
+current modifiers are changed.
+</para>
+<para>
+<!-- .LP -->
+At program startup,
+the modifiers that are in effect are unspecified until
+the first successful call to set them.  Whenever the locale is changed, the
+modifiers that are in effect become unspecified until the next successful call
+to set them.
+Clients should always call
+<xref linkend='XSetLocaleModifiers' xrefstyle='select: title'/>
+with a non-NULL modifier_list after setting the locale
+before they call any locale-dependent Xlib routine.
+</para>
+<para>
+<!-- .LP -->
+The only standard modifier category currently defined is ``im'',
+which identifies the desired input method.
+The values for input method are not standardized.
+A single locale may use multiple input methods,
+switching input method under user control.
+The modifier may specify the initial input method in effect
+or an ordered list of input methods.
+Multiple input methods may be specified in a single im value string
+in an implementation-dependent manner.
+</para>
+<para>
+<!-- .LP -->
+The returned modifiers string is owned by Xlib and should not be modified or
+freed by the client.
+It may be freed by Xlib after the current locale or modifiers are changed.
+Until freed, it will not be modified by Xlib.
+</para>
+<para>
+<!-- .LP -->
+The recommended procedure for clients initializing their locale and modifiers
+is to obtain locale and modifier announcers separately from
+one of the following prioritized sources:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+A command line option
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A resource
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The empty string ("")
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+The first of these that is defined should be used.
+Note that when a locale command line option or locale resource is defined,
+the effect should be to set all categories to the specified locale,
+overriding any category-specific settings in the local host environment.
+</para>
+</sect1>
+<sect1 id="Locale_and_Modifier_Dependencies">
+<title>Locale and Modifier Dependencies</title>
+<!-- .XS -->
+<!-- (SN Locale and Modifier Dependencies -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The internationalized Xlib functions operate in the current locale
+configured by the host environment and X locale modifiers set by
+<xref linkend='XSetLocaleModifiers' xrefstyle='select: title'/>
+or in the locale and modifiers configured at the time
+some object supplied to the function was created.
+For each locale-dependent function,
+the following table describes the locale (and modifiers) dependency:
+</para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='3' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='2.5*'/>
+  <colspec colname='c3' colwidth='1.5*'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Locale from</entry>
+      <entry>Affects the Function</entry>
+      <entry>In</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry nameend='c3' namest='c1'>
+      <emphasis role='bold'>Locale Query/Configuration:</emphasis></entry>
+    </row>
+    <row>
+      <entry morerows='1'><function>setlocale</function></entry>
+      <entry><function>XSupportsLocale</function></entry>
+      <entry>Locale queried</entry>
+    </row>
+    <row>
+      <entry><xref linkend='XSetLocaleModifiers' xrefstyle='select: title'/></entry>
+      <entry>Locale modified</entry>
+    </row>
+    <row>
+      <entry nameend='c3' namest='c1'>
+      <emphasis role='bold'>Resources:</emphasis></entry>
+    </row>
+    <row>
+      <entry><function>setlocale</function></entry>
+      <entry>
+        <para><xref linkend='XrmGetFileDatabase' xrefstyle='select: title'/></para>
+        <para><xref linkend='XrmGetStringDatabase' xrefstyle='select: title'/></para>
+      </entry>
+      <entry>Locale of <type>XrmDatabase</type></entry>
+    </row>
+    <row>
+      <entry><type>XrmDatabase</type></entry>
+      <entry>
+        <para><xref linkend='XrmPutFileDatabase' xrefstyle='select: title'/></para>
+        <para><xref linkend='XrmLocaleOfDatabase' xrefstyle='select: title'/></para>
+      </entry>
+      <entry>Locale of <type>XrmDatabase</type></entry>
+    </row>
+    <row>
+      <entry nameend='c3' namest='c1'>
+      <emphasis role='bold'>Setting Standard Properties:</emphasis></entry>
+    </row>
+    <row>
+      <entry><function>setlocale</function></entry>
+      <entry><xref linkend='XmbSetWMProperties' xrefstyle='select: title'/></entry>
+      <entry>Encoding of supplied/returned
+      text (some WM_ property
+      text in environment locale)</entry>
+    </row>
+    <row>
+      <entry><function>setlocale</function></entry>
+      <entry>
+        <para><xref linkend='XmbTextPropertyToTextList' xrefstyle='select: title'/></para>
+        <para><xref linkend='XwcTextPropertyToTextList' xrefstyle='select: title'/></para>
+        <para><xref linkend='XmbTextListToTextProperty' xrefstyle='select: title'/></para>
+        <para><xref linkend='XwcTextListToTextProperty' xrefstyle='select: title'/></para>
+      </entry>
+      <entry>Encoding of supplied/returned text</entry>
+    </row>
+    <row>
+      <entry nameend='c3' namest='c1'>
+      <emphasis role='bold'>Text Input:</emphasis></entry>
+    </row>
+    <row>
+      <entry morerows='2'><function>setlocale</function></entry>
+      <entry><xref linkend='XOpenIM' xrefstyle='select: title'/></entry>
+      <entry><acronym>XIM</acronym> input method selection</entry>
+    </row>
+    <row>
+      <entry><xref linkend='XRegisterIMInstantiateCallback' xrefstyle='select: title'/></entry>
+      <entry><acronym>XIM</acronym> selection</entry>
+    </row>
+    <row>
+      <entry><xref linkend='XUnregisterIMInstantiateCallback' xrefstyle='select: title'/></entry>
+      <entry><acronym>XIM</acronym> selection</entry>
+    </row>
+    <row>
+      <entry morerows='1'><type>XIM</type></entry>
+      <entry><xref linkend='XCreateIC' xrefstyle='select: title'/></entry>
+      <entry><acronym>XIC</acronym> input method configuration</entry>
+    </row>
+    <row>
+      <entry><xref linkend='XLocaleOfIM' xrefstyle='select: title'/>,  and so on</entry>
+      <entry>Queried locale</entry>
+    </row>
+    <row>
+      <entry morerows='1'><type>XIC</type></entry>
+      <entry><xref linkend='XmbLookupString' xrefstyle='select: title'/></entry>
+      <entry>Keyboard layout</entry>
+    </row>
+    <row>
+      <entry><xref linkend='XwcLookupString' xrefstyle='select: title'/></entry>
+      <entry>Encoding of returned text</entry>
+    </row>
+    <row>
+      <entry nameend='c3' namest='c1'>
+      <emphasis role='bold'>Text Drawing:</emphasis></entry>
+    </row>
+    <row>
+      <entry morerows='1'><function>setlocale</function></entry>
+      <entry><xref linkend='XOpenOM' xrefstyle='select: title'/></entry>
+      <entry><acronym>XOM</acronym> output method selection</entry>
+    </row>
+    <row>
+      <entry><xref linkend='XCreateFontSet' xrefstyle='select: title'/></entry>
+      <entry>Charsets of fonts in XFontSet</entry>
+    </row>
+    <row>
+      <entry morerows='1'><type>XOM</type></entry>
+      <entry><xref linkend='XCreateOC' xrefstyle='select: title'/></entry>
+      <entry><acronym>XOC</acronym> output method configuration</entry>
+    </row>
+    <row>
+      <entry><xref linkend='XLocaleOfOM' xrefstyle='select: title'/>,  and so on</entry>
+      <entry>Queried locale</entry>
+    </row>
+    <row>
+      <entry morerows='2'><type>XFontSet</type></entry>
+      <entry><xref linkend='XmbDrawText' xrefstyle='select: title'/>,</entry>
+      <entry>Locale of supplied text</entry>
+    </row>
+    <row>
+      <entry><xref linkend='XwcDrawText' xrefstyle='select: title'/>, and so on</entry>
+      <entry>Locale of supplied text</entry>
+    </row>
+    <row>
+      <entry>
+        <para><xref linkend='XExtentsOfFontSet' xrefstyle='select: title'/>,  and so on</para>
+        <para><xref linkend='XmbTextExtents' xrefstyle='select: title'/>,</para>
+        <para><function>XwcTextExtents</function>,  and so on</para>
+      </entry>
+      <entry>Locale-dependent metrics</entry>
+    </row>
+    <row>
+      <entry nameend='c3' namest='c1'>
+      <emphasis role='bold'>Xlib Errors:</emphasis></entry>
+    </row>
+    <row>
+      <entry><function>setlocale</function></entry>
+      <entry>
+        <para><xref linkend='XGetErrorDatabaseText' xrefstyle='select: title'/>,</para>
+        <para><xref linkend='XGetErrorText' xrefstyle='select: title'/>,  and so on</para>
+      </entry>
+      <entry>Locale of error message</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+<!-- .LP -->
+Clients may assume that a locale-encoded text string returned 
+by an X function can be passed to a C library routine, or vice versa,
+if the locale is the same at the two calls.
+</para>
+<para>
+<!-- .LP -->
+All text strings processed by internationalized Xlib functions are assumed
+to begin in the initial state of the encoding of the locale, if the encoding
+is state-dependent.
+</para>
+<para>
+<!-- .LP -->
+All Xlib functions behave as if they do not change the current locale
+or X modifier setting.
+(This means that if they do change locale or call 
+<xref linkend='XSetLocaleModifiers' xrefstyle='select: title'/>
+with a non-NULL argument, they must save and restore the current state on
+entry and exit.)
+Also, Xlib functions on implementations that conform to the ANSI C library do
+not alter the global state associated with the ANSI C functions 
+<function>mblen</function>,
+<function>mbtowc</function>,
+<function>wctomb</function>,
+and 
+<function>strtok</function>.
+</para>
+</sect1>
+<sect1 id="Variable_Argument_Lists">
+<title>Variable Argument Lists</title>
+<!-- .XS -->
+<!-- (SN Variable Argument Lists -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Various functions in this chapter have arguments that conform
+to the ANSI C variable argument list calling convention.
+Each function denoted with an argument of the form ``...'' takes 
+a variable-length list of name and value pairs,
+where each name is a string and each value is of type 
+<type>XPointer</type>.
+A name argument that is NULL identifies the end of the list. 
+</para>
+<para>
+<!-- .LP -->
+A variable-length argument list may contain a nested list.
+If the name 
+<symbol>XNVaNestedList</symbol>
+is specified in place of an argument name,
+then the following value is interpreted as an 
+<type>XVaNestedList</type>
+value that specifies a list of values logically inserted into the
+original list at the point of declaration.
+A NULL identifies the end of a nested list.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To allocate a nested variable argument list dynamically, use
+<xref linkend='XVaCreateNestedList' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XVaCreateNestedList</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XVaCreateNestedList'>
+<funcprototype>
+  <funcdef>XVaNestedList <function>XVaCreateNestedList</function></funcdef>
+  <paramdef>int<parameter> dummy</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dummy</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies an unused argument (required by ANSI C).
+<!-- .ds Al -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      ...
+    </term>
+    <listitem>
+      <para>
+Specifies the variable length argument list(Al.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XVaCreateNestedList' xrefstyle='select: title'/>
+function allocates memory and copies its arguments into
+a single list pointer,
+which may be used as a value for arguments requiring a list value.
+Any entries are copied as specified.
+Data passed by reference is not copied;
+the caller must ensure data remains valid for the lifetime
+of the nested list.
+The list should be freed using
+<xref linkend='XFree' xrefstyle='select: title'/>
+when it is no longer needed.
+</para>
+</sect1>
+<sect1 id="Output_Methods">
+<title>Output Methods</title>
+<!-- .XS -->
+<!-- (SN Output Methods -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+This section provides discussions of the following X Output Method
+(<acronym>XOM</acronym>) topics:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+Output method overview
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Output method functions
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Output method values
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Output context functions
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Output context values
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Creating and freeing a font set
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Obtaining font set metrics
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Drawing text using font sets
+    </para>
+  </listitem>
+</itemizedlist>
+<sect2 id="Output_Method_Overview">
+<title>Output Method Overview</title>
+<!-- .XS -->
+<!-- (SN Output Method Overview -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Locale-dependent text may include one or more text components, each of
+which may require different fonts and character set encodings.
+In some languages, each component might have a different
+drawing direction, and some components might contain
+context-dependent characters that change shape based on
+relationships with neighboring characters.
+</para>
+<para>
+<!-- .LP -->
+When drawing such locale-dependent text, some locale-specific
+knowledge is required;
+for example, what fonts are required to draw the text,
+how the text can be separated into components, and which
+fonts are selected to draw each component.
+Further, when bidirectional text must be drawn,
+the internal representation order of the text must be changed
+into the visual representation order to be drawn.
+</para>
+<para>
+<!-- .LP -->
+An X Output Method provides a functional interface so that clients
+do not have to deal directly with such locale-dependent details.
+Output methods provide the following capabilities:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+Creating a set of fonts required to draw locale-dependent text.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Drawing locale-dependent text with a font set without the caller
+needing to be aware of locale dependencies.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Obtaining the escapement and extents in pixels of locale-dependent text.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Determining if bidirectional or context-dependent drawing is required
+in a specific locale with a specific font set.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+Two different abstractions are used in the representation of
+the output method for clients.
+</para>
+<para>
+<!-- .LP -->
+The abstraction used to communicate with an output method
+is an opaque data structure represented by the 
+<type>XOM</type>
+data type.
+The abstraction for representing the state of a particular output thread
+is called an <emphasis remap='I'>output context</emphasis>.
+The Xlib representation of an output context is an 
+<type>XOC</type>,
+which is compatible with 
+<type>XFontSet</type>
+in terms of its functional interface, but is 
+a broader, more generalized abstraction.
+</para>
+</sect2>
+<sect2 id="Output_Method_Functions">
+<title>Output Method Functions</title>
+<!-- .XS -->
+<!-- (SN Output Method Functions -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To open an output method, use
+<xref linkend='XOpenOM' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XOpenOM</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XOpenOM'>
+<funcprototype>
+  <funcdef>XOM <function>XOpenOM</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XrmDatabase<parameter> db</parameter></paramdef>
+  <paramdef>char<parameter> *res_name</parameter></paramdef>
+  <paramdef>char<parameter> *res_class</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>db</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a pointer to the resource database.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>res_name</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the full resource name of the application.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>res_class</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the full class name of the application.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XOpenOM' xrefstyle='select: title'/>
+function opens an output method
+matching the current locale and modifiers specification.
+The current locale and modifiers are bound to the output method
+when
+<xref linkend='XOpenOM' xrefstyle='select: title'/>
+is called.
+The locale associated with an output method cannot be changed.
+</para>
+<para>
+<!-- .LP -->
+The specific output method to which this call will be routed
+is identified on the basis of the current locale and modifiers.
+<xref linkend='XOpenOM' xrefstyle='select: title'/>
+will identify a default output method corresponding to the
+current locale.
+That default can be modified using 
+<xref linkend='XSetLocaleModifiers' xrefstyle='select: title'/>
+to set the output method modifier.
+</para>
+<para>
+<!-- .LP -->
+The db argument is the resource database to be used by the output method
+for looking up resources that are private to the output method.
+It is not intended that this database be used to look
+up values that can be set as OC values in an output context.
+If db is NULL,
+no database is passed to the output method.
+</para>
+<para>
+<!-- .LP -->
+The res_name and res_class arguments specify the resource name 
+and class of the application. 
+They are intended to be used as prefixes by the output method
+when looking up resources that are common to all output contexts
+that may be created for this output method.
+The characters used for resource names and classes must be in the
+X Portable Character Set.
+The resources looked up are not fully specified
+if res_name or res_class is NULL.
+</para>
+<para>
+<!-- .LP -->
+The res_name and res_class arguments are not assumed to exist beyond
+the call to
+<xref linkend='XOpenOM' xrefstyle='select: title'/>.
+The specified resource database is assumed to exist for the lifetime
+of the output method.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XOpenOM' xrefstyle='select: title'/>
+returns NULL if no output method could be opened.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To close an output method, use
+<xref linkend='XCloseOM' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XCloseOM</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XCloseOM'>
+<funcprototype>
+  <funcdef>Status <function>XCloseOM</function></funcdef>
+  <paramdef>XOM<parameter> om</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>om</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the output method.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XCloseOM' xrefstyle='select: title'/>
+function closes the specified output method.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set output method attributes, use 
+<xref linkend='XSetOMValues' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetOMValues</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetOMValues'>
+<funcprototype>
+  <funcdef>char *<function>XSetOMValues</function></funcdef>
+  <paramdef>XOM<parameter> om</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>om</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the output method.
+<!-- .ds Al \ to set <acronym>XOM</acronym> values -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      ...
+    </term>
+    <listitem>
+      <para>
+Specifies the variable-length argument list(Al.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetOMValues' xrefstyle='select: title'/>
+function presents a variable argument list programming interface
+for setting properties or features of the specified output method.
+This function returns NULL if it succeeds;
+otherwise,
+it returns the name of the first argument that could not be obtained.
+</para>
+<para>
+<!-- .LP -->
+No standard arguments are currently defined by Xlib.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To query an output method, use 
+<xref linkend='XGetOMValues' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetOMValues</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetOMValues'>
+<funcprototype>
+  <funcdef>char *<function>XGetOMValues</function></funcdef>
+  <paramdef>XOM<parameter> om</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>om</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the output method.
+<!-- .ds Al \ to get XOM values -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      ...
+    </term>
+    <listitem>
+      <para>
+Specifies the variable-length argument list(Al.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetOMValues' xrefstyle='select: title'/>
+function presents a variable argument list programming interface
+for querying properties or features of the specified output method.
+This function returns NULL if it succeeds;
+otherwise,
+it returns the name of the first argument that could not be obtained.
+</para>
+<para>
+<!-- .LP -->
+To obtain the display associated with an output method, use
+<xref linkend='XDisplayOfOM' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDisplayOfOM</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDisplayOfOM'>
+<funcprototype>
+  <funcdef>Display *<function>XDisplayOfOM</function></funcdef>
+  <paramdef>XOM<parameter> om</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>om</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the output method.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XDisplayOfOM' xrefstyle='select: title'/>
+function returns the display associated with the specified output method.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To get the locale associated with an output method, use
+<xref linkend='XLocaleOfOM' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XLocaleOfOM</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XLocaleOfOM'>
+<funcprototype>
+  <funcdef>char *<function>XLocaleOfOM</function></funcdef>
+  <paramdef>XOM<parameter> om</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>om</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the output method.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XLocaleOfOM' xrefstyle='select: title'/>
+returns the locale associated with the specified output method.
+</para>
+</sect2>
+<sect2 id="X_Output_Method_Values">
+<title>X Output Method Values</title>
+<!-- .XS -->
+<!-- (SN X Output Method Values -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The following table describes how <acronym>XOM</acronym> values are interpreted by an
+output method.
+The first column lists the <acronym>XOM</acronym> values.  The second column indicates
+how each of the <acronym>XOM</acronym> values are treated by a particular output style.
+</para>
+<para>
+<!-- .LP -->
+</para>
+<para>
+<!-- .LP -->
+The following key applies to this table.
+</para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='4.0*'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Key</entry>
+      <entry>Explanation</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>G</entry>
+      <entry>This value may be read using <xref linkend='XGetOMValues' xrefstyle='select: title'/>.</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para></para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='1.0*'/>
+  <thead>
+    <row rowsep='1'>
+      <entry><acronym>XOM</acronym> Value</entry>
+      <entry>Key</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry><symbol>XNRequiredCharSet</symbol></entry>
+      <entry>G</entry>
+    </row>
+    <row>
+      <entry><symbol>XNQueryOrientation</symbol></entry>
+      <entry>G</entry>
+    </row>
+    <row>
+      <entry><symbol>XNDirectionalDependentDrawing</symbol></entry>
+      <entry>G</entry>
+    </row>
+    <row>
+      <entry><symbol>XNContextualDrawing</symbol></entry>
+      <entry>G</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+<!-- .LP -->
+</para>
+<sect3 id="Required_Char_Set">
+<title>Required Char Set</title>
+<!-- .XS -->
+<!-- (SN Required Char Set -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The
+<symbol>XNRequiredCharSet</symbol>
+argument returns the list of charsets that are required for loading the fonts
+needed for the locale.
+The value of the argument is a pointer to a structure of type
+<structname>XOMCharSetList</structname>.
+</para>
+<para>
+<!-- .LP -->
+The
+<structname>XOMCharSetList</structname>
+structure is defined as follows:
+<indexterm significance="preferred"><primary>XOMCharSetList</primary></indexterm>
+<!-- .sM -->
+</para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef struct {
+     int    charset_count;
+     char   **charset_list;
+} XOMCharSetList;
+</literallayout>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The charset_list member is a list of one or more null-terminated
+charset names, and the charset_count member is the number of
+charset names.
+</para>
+<para>
+<!-- .LP -->
+The required charset list is owned by Xlib and should not be modified or
+freed by the client.
+It will be freed by a call to 
+<xref linkend='XCloseOM' xrefstyle='select: title'/>
+with the associated 
+<type>XOM</type>.
+Until freed, its contents will not be modified by Xlib.
+</para>
+<para>
+<!-- .LP -->
+</para>
+</sect3>
+<sect3 id="Query_Orientation">
+<title>Query Orientation</title>
+<!-- .XS -->
+<!-- (SN Query Orientation -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The
+<symbol>XNQueryOrientation</symbol>
+argument returns the global orientation of text when drawn.
+Other than
+<constant>XOMOrientation_LTR_TTB</constant>,
+the set of orientations supported is locale-dependent.
+The value of the argument is a pointer to a structure of type
+<structname>XOMOrientation</structname>.
+Clients are responsible for freeing the
+<structname>XOMOrientation</structname>
+structure by using
+<xref linkend='XFree' xrefstyle='select: title'/>;
+this also frees the contents of the structure.
+</para>
+
+<!-- .LP -->
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef struct {
+     int          num_orientation;
+     XOrientation *orientation;     /* Input Text description */
+} XOMOrientation;
+
+typedef enum {
+     XOMOrientation_LTR_TTB,
+     XOMOrientation_RTL_TTB,     
+     XOMOrientation_TTB_LTR,
+     XOMOrientation_TTB_RTL,
+     XOMOrientation_Context
+} XOrientation;
+</literallayout>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The possible value for XOrientation may be:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+<constant>XOMOrientation_LTR_TTB</constant>
+left-to-right, top-to-bottom global orientation
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<constant>XOMOrientation_RTL_TTB</constant>
+right-to-left, top-to-bottom global orientation
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<constant>XOMOrientation_TTB_LTR</constant>
+top-to-bottom, left-to-right global orientation
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<constant>XOMOrientation_TTB_RTL</constant>
+top-to-bottom, right-to-left global orientation
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<constant>XOMOrientation_Context</constant>
+contextual global orientation
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+</para>
+</sect3>
+<sect3 id="Directional_Dependent_Drawing">
+<title>Directional Dependent Drawing</title>
+<!-- .XS -->
+<!-- (SN Directional Dependent Drawing -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The
+<symbol>XNDirectionalDependentDrawing</symbol>
+argument indicates whether the text rendering functions
+implement implicit handling of directional text.  If this value
+is
+<symbol>True</symbol>,
+the output method has knowledge of directional
+dependencies and reorders text as necessary when
+rendering text.  If this value is
+<symbol>False</symbol>,
+the output method does not implement any directional text
+handling, and all character directions are assumed to be left-to-right.
+</para>
+<para>
+<!-- .LP -->
+Regardless of the rendering order of characters,
+the origins of all characters are on the primary draw direction side
+of the drawing origin.
+</para>
+<para>
+<!-- .LP -->
+This OM value presents functionality identical to the
+<xref linkend='XDirectionalDependentDrawing' xrefstyle='select: title'/>
+function.
+</para>
+</sect3>
+<sect3 id="Context_Dependent_Drawing">
+<title>Context Dependent Drawing</title>
+<!-- .XS -->
+<!-- (SN Context Dependent Drawing -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The
+<symbol>XNContextualDrawing</symbol>
+argument indicates whether the text rendering functions
+implement implicit context-dependent drawing.  If this value is
+<symbol>True</symbol>,
+the output method has knowledge of context dependencies and
+performs character shape editing, combining glyphs to present
+a single character as necessary.  The actual shape editing is
+dependent on the locale implementation and the font set used.
+</para>
+<para>
+<!-- .LP -->
+This OM value presents functionality identical to the
+<xref linkend='XContextualDrawing' xrefstyle='select: title'/>
+function.
+</para>
+</sect3>
+</sect2>
+<sect2 id="Output_Context_Functions">
+<title>Output Context Functions</title>
+<!-- .XS -->
+<!-- (SN Output Context Functions -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+An output context is an abstraction that contains both the data
+required by an output method and the information required
+to display that data.
+There can be multiple output contexts for one output method.
+The programming interfaces for creating, reading, or modifying
+an output context use a variable argument list.
+The name elements of the argument lists are referred to as <acronym>XOC</acronym> values.
+It is intended that output methods be controlled by these <acronym>XOC</acronym> values.
+As new <acronym>XOC</acronym> values are created,
+they should be registered with the X Consortium.
+An
+<type>XOC</type>
+can be used anywhere an
+<type>XFontSet</type>
+can be used, and vice versa;
+<type>XFontSet</type>
+is retained for compatibility with previous releases.
+The concepts of output methods and output contexts include broader,
+more generalized abstraction than font set,
+supporting complex and more intelligent text display, and dealing not only
+with multiple fonts but also with context dependencies.
+However,
+<type>XFontSet</type>
+is widely used in several interfaces, so
+<type>XOC</type>
+is defined as an upward compatible type of
+<type>XFontSet</type>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To create an output context, use
+<xref linkend='XCreateOC' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XCreateOC</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XCreateOC'>
+<funcprototype>
+  <funcdef>XOC <function>XCreateOC</function></funcdef>
+  <paramdef>XOM<parameter> om</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>om</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the output method.
+<!-- .ds Al \ to set <acronym>XOC</acronym> values -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      ...
+    </term>
+    <listitem>
+      <para>
+Specifies the variable-length argument list(Al.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XCreateOC' xrefstyle='select: title'/>
+function creates an output context within the specified output method.
+</para>
+<para>
+<!-- .LP -->
+The base font names argument is mandatory at creation time, and
+the output context will not be created unless it is provided.
+All other output context values can be set later.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XCreateOC' xrefstyle='select: title'/>
+returns NULL if no output context could be created.
+NULL can be returned for any of the following reasons:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+A required argument was not set.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A read-only argument was set.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+An argument name is not recognized.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The output method encountered an output method implementation-dependent error.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+<xref linkend='XCreateOC' xrefstyle='select: title'/>
+can generate a
+<errorname>BadAtom</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To destroy an output context, use
+<xref linkend='XDestroyOC' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDestroyOC</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDestroyOC'>
+<funcprototype>
+  <funcdef>void <function>XDestroyOC</function></funcdef>
+  <paramdef>XOC<parameter> oc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>oc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the output context.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XDestroyOC' xrefstyle='select: title'/>
+function destroys the specified output context.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To get the output method associated with an output context, use
+<xref linkend='XOMOfOC' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XOMOfOC</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XOMOfOC'>
+<funcprototype>
+  <funcdef>XOM <function>XOMOfOC</function></funcdef>
+  <paramdef>XOC<parameter> oc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>oc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the output context.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XOMOfOC' xrefstyle='select: title'/>
+function returns the output method associated with the
+specified output context.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+Xlib provides two functions for setting and reading output context values,
+respectively,
+<xref linkend='XSetOCValues' xrefstyle='select: title'/>
+and
+<xref linkend='XGetOCValues' xrefstyle='select: title'/>.
+Both functions have a variable-length argument list.
+In that argument list, any <acronym>XOC</acronym> value's name must be denoted
+with a character string using the X Portable Character Set.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set <acronym>XOC</acronym> values, use
+<xref linkend='XSetOCValues' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetOCValues</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetOCValues'>
+<funcprototype>
+  <funcdef>char *<function>XSetOCValues</function></funcdef>
+  <paramdef>XOC<parameter> oc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>oc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the output context.
+<!-- .ds Al \ to set <acronym>XOC</acronym> values -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      ...
+    </term>
+    <listitem>
+      <para>
+Specifies the variable-length argument list(Al.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetOCValues' xrefstyle='select: title'/>
+function returns NULL if no error occurred; 
+otherwise,
+it returns the name of the first argument that could not be set.
+An argument might not be set for any of the following reasons:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+The argument is read-only.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The argument name is not recognized.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+An implementation-dependent error occurs.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+Each value to be set must be an appropriate datum,
+matching the data type imposed by the semantics of the argument.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetOCValues' xrefstyle='select: title'/>
+can generate a
+<errorname>BadAtom</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain <acronym>XOC</acronym> values, use
+<xref linkend='XGetOCValues' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetOCValues</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetOCValues'>
+<funcprototype>
+  <funcdef>char *<function>XGetOCValues</function></funcdef>
+  <paramdef>XOC<parameter> oc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>oc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the output context.
+<!-- .ds Al \ to get XOC values -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      ...
+    </term>
+    <listitem>
+      <para>
+Specifies the variable-length argument list(Al.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetOCValues' xrefstyle='select: title'/>
+function returns NULL if no error occurred; otherwise,
+it returns the name of the first argument that could not be obtained.
+An argument might not be obtained for any of the following reasons:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+The argument name is not recognized.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+An implementation-dependent error occurs.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+Each argument value
+following a name must point to a location where the value is to be stored.
+</para>
+</sect2>
+
+<sect2 id="Output_Context_Values">
+<title>Output Context Values</title>
+<!-- .XS -->
+<!-- (SN Output Context Values -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The following table describes how <acronym>XOC</acronym> values are interpreted
+by an output method.
+The first column lists the <acronym>XOC</acronym> values.
+The second column indicates the alternative interfaces that function
+identically and are provided for compatibility with previous releases.
+The third column indicates how each of the <acronym>XOC</acronym> values is treated.
+</para>
+<!-- .LP -->
+<para>
+The following keys apply to this table.
+</para>
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='4.0*'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Key</entry>
+      <entry>Explanation</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>C</entry>
+      <entry>This value must be set with <xref linkend='XCreateOC' xrefstyle='select: title'/>.</entry>
+    </row>
+    <row>
+      <entry>D</entry>
+      <entry>This value may be set using <xref linkend='XCreateOC' xrefstyle='select: title'/>.
+      If it is not set,a default is provided.</entry>
+    </row>
+    <row>
+      <entry>G</entry>
+      <entry>This value may be read using <xref linkend='XGetOCValues' xrefstyle='select: title'/>.</entry>
+    </row>
+    <row>
+      <entry>S</entry>
+      <entry>This value must be set using <xref linkend='XSetOCValues' xrefstyle='select: title'/>.</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para></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 align='left'><acronym>XOC</acronym> Value</entry>
+      <entry align='left'>Alternative Interface</entry>
+      <entry align='left'>Key</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>BaseFontName</entry>
+      <entry><xref linkend='XCreateFontSet' xrefstyle='select: title'/></entry>
+      <entry>C-G</entry>
+    </row>
+    <row>
+      <entry>MissingCharSet</entry>
+      <entry><xref linkend='XCreateFontSet' xrefstyle='select: title'/></entry>
+      <entry>G</entry>
+    </row>
+    <row>
+      <entry>DefaultString</entry>
+      <entry><xref linkend='XCreateFontSet' xrefstyle='select: title'/></entry>
+      <entry>G</entry>
+    </row>
+    <row>
+      <entry>Orientation</entry>
+      <entry>-</entry>
+      <entry>D-S-G</entry>
+    </row>
+    <row>
+      <entry>ResourceName</entry>
+      <entry>-</entry>
+      <entry>S-G</entry>
+    </row>
+    <row>
+      <entry>ResourceClass</entry>
+      <entry>-</entry>
+      <entry>S-G</entry>
+    </row>
+    <row>
+      <entry>FontInfo</entry>
+      <entry><xref linkend='XFontsOfFontSet' xrefstyle='select: title'/></entry>
+      <entry>G</entry>
+    </row>
+    <row>
+      <entry>OMAutomatic</entry>
+      <entry>-</entry>
+      <entry>G</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+<!-- .LP -->
+</para>
+<sect3 id="Base_Font_Name">
+<title>Base Font Name</title>
+<!-- .XS -->
+<!-- (SN Base Font Name -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The
+<symbol>XNBaseFontName</symbol>
+argument is a list of base font names that Xlib uses
+to load the fonts needed for the locale.
+The base font names are a comma-separated list.  The string is null-terminated
+and is assumed to be in the Host Portable Character Encoding;
+otherwise, the result is implementation-dependent.
+White space immediately on either side of a separating comma is ignored.
+</para>
+<para>
+<!-- .LP -->
+Use of <acronym>XLFD</acronym> font names permits Xlib to obtain the fonts needed for a
+variety of locales from a single locale-independent base font name.
+The single base font name should name a family of fonts whose members
+are encoded in the various charsets needed by the locales of interest.
+</para>
+<para>
+<!-- .LP -->
+An <acronym>XLFD</acronym> base font name can explicitly name a charset needed for the locale.
+This allows the user to specify an exact font for use with a charset required
+by a locale, fully controlling the font selection.
+</para>
+<para>
+<!-- .LP -->
+If a base font name is not an <acronym>XLFD</acronym> name,
+Xlib will attempt to obtain an <acronym>XLFD</acronym> name from the font properties
+for the font.
+If Xlib is successful, the
+<xref linkend='XGetOCValues' xrefstyle='select: title'/>
+function will return this <acronym>XLFD</acronym> name instead of the client-supplied name.
+</para>
+<para>
+<!-- .LP -->
+This argument must be set at creation time
+and cannot be changed.
+If no fonts exist for any of the required charsets,
+or if the locale definition in Xlib requires that a font exist
+for a particular charset and a font is not found for that charset,
+<xref linkend='XCreateOC' xrefstyle='select: title'/>
+returns NULL.
+</para>
+<para>
+<!-- .LP -->
+When querying for the
+<symbol>XNBaseFontName</symbol>
+<acronym>XOC</acronym> value,
+<xref linkend='XGetOCValues' xrefstyle='select: title'/>
+returns a null-terminated string identifying the base font names that
+Xlib used to load the fonts needed for the locale.
+This string is owned by Xlib and should not be modified or freed by
+the client.
+The string will be freed by a call to
+<xref linkend='XDestroyOC' xrefstyle='select: title'/>
+with the associated
+<type>XOC</type>.
+Until freed, the string contents will not be modified by Xlib.
+</para>
+</sect3>
+<sect3 id="Missing_CharSet">
+<title>Missing CharSet</title>
+<!-- .XS -->
+<!-- (SN Missing CharSet -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The
+<symbol>XNMissingCharSet</symbol>
+argument returns the list of required charsets that are missing from the
+font set.
+The value of the argument is a pointer to a structure of type
+<structname>XOMCharSetList</structname>.
+</para>
+<para>
+<!-- .LP -->
+If fonts exist for all of the charsets required by the current locale,
+charset_list is set to NULL and charset_count is set to zero.
+If no fonts exist for one or more of the required charsets,
+charset_list is set to a list of one or more null-terminated charset names
+for which no fonts exist, and charset_count is set to the number of
+missing charsets.
+The charsets are from the list of the required charsets for
+the encoding of the locale and do not include any charsets to which Xlib
+may be able to remap a required charset.
+</para>
+<para>
+<!-- .LP -->
+The missing charset list is owned by Xlib and should not be modified or
+freed by the client.
+It will be freed by a call to 
+<xref linkend='XDestroyOC' xrefstyle='select: title'/>
+with the associated
+<type>XOC</type>.
+Until freed, its contents will not be modified by Xlib.
+</para>
+</sect3>
+<sect3 id="Default_String">
+<title>Default String</title>
+<!-- .XS -->
+<!-- (SN Default String -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+When a drawing or measuring function is called with an
+<type>XOC</type>
+that has missing charsets, some characters in the locale will not be
+drawable.
+The
+<symbol>XNDefaultString</symbol>
+argument returns a pointer to a string that represents the glyphs
+that are drawn with this
+<type>XOC</type>
+when the charsets of the available fonts do not include all glyphs
+required to draw a character.
+The string does not necessarily consist of valid characters
+in the current locale and is not necessarily drawn with
+the fonts loaded for the font set,
+but the client can draw or measure the default glyphs
+by including this string in a string being drawn or measured with the
+<type>XOC</type>.
+</para>
+<para>
+<!-- .LP -->
+If the
+<symbol>XNDefaultString</symbol>
+argument returned the empty string (""),
+no glyphs are drawn and the escapement is zero.
+The returned string is null-terminated.
+It is owned by Xlib and should not be modified or freed by the client.
+It will be freed by a call to
+<xref linkend='XDestroyOC' xrefstyle='select: title'/>
+with the associated
+<type>XOC</type>.
+Until freed, its contents will not be modified by Xlib.
+</para>
+</sect3>
+<sect3 id="Orientation">
+<title>Orientation</title>
+<!-- .XS -->
+<!-- (SN Orientation -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The
+<symbol>XNOrientation</symbol>
+argument specifies the current orientation of text when drawn.  The value of
+this argument is one of the values returned by the
+<xref linkend='XGetOMValues' xrefstyle='select: title'/>
+function with the
+<symbol>XNQueryOrientation</symbol>
+argument specified in the
+<type>XOrientation</type>
+list.
+The value of the argument is of type
+<type>XOrientation</type>.
+When
+<symbol>XNOrientation</symbol>
+is queried, the value specifies the current orientation.  
+When
+<symbol>XNOrientation</symbol>
+is set, a value is used to set the current orientation.
+</para>
+<para>
+<!-- .LP -->
+When 
+<constant>XOMOrientation_Context</constant>
+is set, the text orientation of the 
+text is determined according to an implementation-defined method
+(for example, ISO 6429 control sequences), and the initial text orientation for
+locale-dependent Xlib functions is assumed to 
+be
+<constant>XOMOrientation_LTR_TTB</constant>.
+</para>
+<para>
+<!-- .LP -->
+The
+<symbol>XNOrientation</symbol>
+value does not change the prime drawing direction 
+for Xlib drawing functions.  
+</para>
+</sect3>
+<sect3 id="Resource_Name_and_Class">
+<title>Resource Name and Class</title>
+<!-- .XS -->
+<!-- (SN Resource Name and Class -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The
+<symbol>XNResourceName</symbol>
+and
+<symbol>XNResourceClass</symbol>
+arguments are strings that specify the full name and class
+used by the client to obtain resources for the display of the output context.
+These values should be used as prefixes for name and class
+when looking up resources that may vary according to the output context.
+If these values are not set,
+the resources will not be fully specified.
+</para>
+<para>
+<!-- .LP -->
+It is not intended that values that can be set as <acronym>XOM</acronym> values be
+set as resources.
+</para>
+<para>
+<!-- .LP -->
+When querying for the
+<symbol>XNResourceName</symbol>
+or
+<symbol>XNResourceClass</symbol>
+<acronym>XOC</acronym> value,
+<xref linkend='XGetOCValues' xrefstyle='select: title'/>
+returns a null-terminated string.
+This string is owned by Xlib and should not be modified or freed by
+the client.
+The string will be freed by a call to
+<xref linkend='XDestroyOC' xrefstyle='select: title'/>
+with the associated
+<type>XOC</type>
+or when the associated value is changed via
+<xref linkend='XSetOCValues' xrefstyle='select: title'/>.
+Until freed, the string contents will not be modified by Xlib.
+</para>
+</sect3>
+<sect3 id="Font_Info">
+<title>Font Info</title>
+<!-- .XS -->
+<!-- (SN Font Info -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The
+<symbol>XNFontInfo</symbol>
+argument specifies a list of one or more 
+<structname>XFontStruct</structname>
+structures
+and font names for the fonts used for drawing by the given output context.
+The value of the argument is a pointer to a structure of type
+<structname>XOMFontInfo</structname>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef struct {
+     int         num_font;
+     XFontStruct **font_struct_list;
+     char        **font_name_list;
+} XOMFontInfo;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+A list of pointers to the
+<structname>XFontStruct</structname>
+structures is returned to font_struct_list.
+A list of pointers to null-terminated, fully-specified font name strings
+in the locale of the output context is returned to font_name_list.
+The font_name_list order corresponds to the font_struct_list order.
+The number of
+<structname>XFontStruct</structname>
+structures and font names is returned to num_font.
+</para>
+<para>
+<!-- .LP -->
+Because it is not guaranteed that a given character will be imaged using a
+single font glyph,
+there is no provision for mapping a character or default string 
+to the font properties, font ID, or direction hint for the font 
+for the character.
+The client may access the 
+<structname>XFontStruct</structname>
+list to obtain these values for all the fonts currently in use.
+</para>
+<para>
+<!-- .LP -->
+Xlib does not guarantee that fonts are loaded from the server
+at the creation of an 
+<type>XOC</type>.
+Xlib may choose to cache font data, loading it only as needed to draw text 
+or compute text dimensions.
+Therefore, existence of the per_char metrics in the 
+<structname>XFontStruct</structname>
+structures in the
+<structname>XFontStructSet</structname>
+is undefined.
+Also, note that all properties in the 
+<structname>XFontStruct</structname>
+structures are in the STRING encoding.
+</para>
+<para>
+<!-- .LP -->
+The client must not free the 
+<structname>XOMFontInfo</structname>
+struct itself; it will be freed when the
+<type>XOC</type>
+is closed.
+</para>
+</sect3>
+<sect3 id="OM_Automatic">
+<title>OM Automatic</title>
+<!-- .XS -->
+<!-- (SN OM Automatic -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The
+<symbol>XNOMAutomatic</symbol>
+argument returns whether the associated output context was created by
+<xref linkend='XCreateFontSet' xrefstyle='select: title'/>
+or not.  Because the
+<xref linkend='XFreeFontSet' xrefstyle='select: title'/>
+function not only destroys the output context but also closes the implicit
+output method associated with it,
+<xref linkend='XFreeFontSet' xrefstyle='select: title'/>
+should be used with any output context created by 
+<xref linkend='XCreateFontSet' xrefstyle='select: title'/>.
+However, it is possible that a client does not know how the output context
+was created.
+Before a client destroys the output context,
+it can query whether
+<symbol>XNOMAutomatic</symbol>
+is set to determine whether 
+<xref linkend='XFreeFontSet' xrefstyle='select: title'/>
+or 
+<xref linkend='XDestroyOC' xrefstyle='select: title'/>
+should be used to destroy the output context.
+</para>
+</sect3>
+</sect2>
+<sect2 id="Creating_and_Freeing_a_Font_Set">
+<title>Creating and Freeing a Font Set</title>
+<!-- .XS -->
+<!-- (SN Creating and Freeing a Font Set -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib international text drawing is done using a set of one or more fonts,
+as needed for the locale of the text.
+Fonts are loaded according to a list of base font names 
+supplied by the client and the charsets required by the locale.
+The
+<type>XFontSet</type>
+is an opaque type representing the state of a particular output thread
+and is equivalent to the type
+<type>XOC</type>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+The 
+<xref linkend='XCreateFontSet' xrefstyle='select: title'/>
+function is a convenience function for creating an output context using
+only default values.  The returned
+<type>XFontSet</type>
+has an implicitly created
+<type>XOM</type>.
+This
+<type>XOM</type>
+has an OM value
+<symbol>XNOMAutomatic</symbol>
+automatically set to
+<symbol>True</symbol>
+so that the output context self indicates whether it was created by
+<xref linkend='XCreateOC' xrefstyle='select: title'/>
+or
+<xref linkend='XCreateFontSet' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XCreateFontSet</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XCreateFontSet'>
+<funcprototype>
+  <funcdef>XFontSet <function>XCreateFontSet</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>char<parameter> *base_font_name_list</parameter></paramdef>
+  <paramdef>char<parameter> ***missing_charset_list_return</parameter></paramdef>
+  <paramdef>int<parameter> *missing_charset_count_return</parameter></paramdef>
+  <paramdef>char<parameter> **def_string_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>base_font_name_list</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the base font names.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>missing_charset_list_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the missing charsets.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>missing_charset_count_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the number of missing charsets.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>def_string_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the string drawn for missing charsets.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The 
+<xref linkend='XCreateFontSet' xrefstyle='select: title'/>
+function creates a font set for the specified display.
+The font set is bound to the current locale when 
+<xref linkend='XCreateFontSet' xrefstyle='select: title'/>
+is called.
+The font set may be used in subsequent calls to obtain font
+and character information and to image text in the locale of the font set.
+</para>
+<para>
+<!-- .LP -->
+The base_font_name_list argument is a list of base font names
+that Xlib uses to load the fonts needed for the locale.
+The base font names are a comma-separated list.
+The string is null-terminated
+and is assumed to be in the Host Portable Character Encoding; 
+otherwise, the result is implementation-dependent.
+White space immediately on either side of a separating comma is ignored.
+</para>
+<para>
+<!-- .LP -->
+Use of <acronym>XLFD</acronym> font names permits Xlib to obtain the fonts needed for a
+variety of locales from a single locale-independent base font name.
+The single base font name should name a family of fonts whose members
+are encoded in the various charsets needed by the locales of interest.
+</para>
+<para>
+<!-- .LP -->
+An <acronym>XLFD</acronym> base font name can explicitly name a charset needed for the locale.
+This allows the user to specify an exact font for use with a charset required
+by a locale, fully controlling the font selection.
+</para>
+<para>
+<!-- .LP -->
+If a base font name is not an <acronym>XLFD</acronym> name,
+Xlib will attempt to obtain an <acronym>XLFD</acronym> name from the font properties
+for the font.
+If this action is successful in obtaining an <acronym>XLFD</acronym> name, the
+<xref linkend='XBaseFontNameListOfFontSet' xrefstyle='select: title'/>
+function will return this <acronym>XLFD</acronym> name instead of the client-supplied name.
+</para>
+<para>
+<!-- .LP -->
+Xlib uses the following algorithm to select the fonts
+that will be used to display text with the 
+<type>XFontSet</type>.
+</para>
+<para>
+<!-- .LP -->
+For each font charset required by the locale,
+the base font name list is searched for the first appearance of one 
+of the following cases that names a set of fonts that exist at the server:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+The first <acronym>XLFD</acronym>-conforming base font name that specifies the required
+charset or a superset of the required charset in its 
+<structfield>CharSetRegistry</structfield>
+and 
+<structfield>CharSetEncoding</structfield>
+fields.
+The implementation may use a base font name whose specified charset
+is a superset of the required charset, for example,
+an ISO8859-1 font for an ASCII charset.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The first set of one or more <acronym>XLFD</acronym>-conforming base font names
+that specify one or more charsets that can be remapped to support the
+required charset.
+The Xlib implementation may recognize various mappings 
+from a required charset to one or more other charsets
+and use the fonts for those charsets.
+For example, JIS Roman is ASCII with tilde and backslash replaced 
+by yen and overbar;
+Xlib may load an ISO8859-1 font to support this character set
+if a JIS Roman font is not available.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The first <acronym>XLFD</acronym>-conforming font name or the first non-<acronym>XLFD</acronym> font name
+for which an <acronym>XLFD</acronym> font name can be obtained, combined with the
+required charset (replacing the 
+<structfield>CharSetRegistry</structfield>
+and
+<structfield>CharSetEncoding</structfield>
+fields in the <acronym>XLFD</acronym> font name).
+As in case 1,
+the implementation may use a charset that is a superset
+of the required charset.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The first font name that can be mapped in some implementation-dependent
+manner to one or more fonts that support imaging text in the charset.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+For example, assume that a locale required the charsets:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+ISO8859-1
+JISX0208.1983
+JISX0201.1976
+GB2312-1980.0
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+The user could supply a base_font_name_list that explicitly specifies the
+charsets, ensuring that specific fonts are used if they exist.
+For example:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+"-JIS-Fixed-Medium-R-Normal--26-180-100-100-C-240-JISX0208.1983-0,\\
+-JIS-Fixed-Medium-R-Normal--26-180-100-100-C-120-JISX0201.1976-0,\\
+-GB-Fixed-Medium-R-Normal--26-180-100-100-C-240-GB2312-1980.0,\\
+-Adobe-Courier-Bold-R-Normal--25-180-75-75-M-150-ISO8859-1"
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+Alternatively, the user could supply a base_font_name_list
+that omits the charsets,
+letting Xlib select font charsets required for the locale.
+For example:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+"-JIS-Fixed-Medium-R-Normal--26-180-100-100-C-240,\\
+-JIS-Fixed-Medium-R-Normal--26-180-100-100-C-120,\\
+-GB-Fixed-Medium-R-Normal--26-180-100-100-C-240,\\
+-Adobe-Courier-Bold-R-Normal--25-180-100-100-M-150"
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+Alternatively, the user could simply supply a single base font name
+that allows Xlib to select from all available fonts
+that meet certain minimum <acronym>XLFD</acronym> property requirements.
+For example:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+"-*-*-*-R-Normal--*-180-100-100-*-*"
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+If 
+<xref linkend='XCreateFontSet' xrefstyle='select: title'/>
+is unable to create the font set, 
+either because there is insufficient memory or because the current locale
+is not supported,
+<xref linkend='XCreateFontSet' xrefstyle='select: title'/>
+returns NULL, missing_charset_list_return is set to NULL,
+and missing_charset_count_return
+is set to zero.
+If fonts exist for all of the charsets required by the current locale,
+<xref linkend='XCreateFontSet' xrefstyle='select: title'/>
+returns a valid
+<type>XFontSet</type>,
+missing_charset_list_return is set to NULL,
+and missing_charset_count_return is set to zero.
+</para>
+<para>
+<!-- .LP -->
+If no font exists for one or more of the required charsets,
+<xref linkend='XCreateFontSet' xrefstyle='select: title'/>
+sets missing_charset_list_return to a
+list of one or more null-terminated charset names for which no font exists
+and sets missing_charset_count_return to the number of missing fonts.
+The charsets are from the list of the required charsets for
+the encoding of the locale and do not include any charsets to which Xlib
+may be able to remap a required charset.
+</para>
+<para>
+<!-- .LP -->
+If no font exists for any of the required charsets
+or if the locale definition in Xlib requires that a font exist
+for a particular charset and a font is not found for that charset, 
+<xref linkend='XCreateFontSet' xrefstyle='select: title'/>
+returns NULL.
+Otherwise, 
+<xref linkend='XCreateFontSet' xrefstyle='select: title'/>
+returns a valid 
+<type>XFontSet</type>
+to font_set.
+</para>
+<para>
+<!-- .LP -->
+When an Xmb/wc drawing or measuring function is called with an
+<type>XFontSet</type>
+that has missing charsets, some characters in the locale will not be
+drawable.
+If def_string_return is non-NULL,
+<xref linkend='XCreateFontSet' xrefstyle='select: title'/>
+returns a pointer to a string that represents the glyphs
+that are drawn with this 
+<type>XFontSet</type>
+when the charsets of the available fonts do not include all font glyphs
+required to draw a codepoint.
+The string does not necessarily consist of valid characters 
+in the current locale and is not necessarily drawn with
+the fonts loaded for the font set,
+but the client can draw and measure the default glyphs
+by including this string in a string being drawn or measured with the 
+<type>XFontSet</type>.
+</para>
+<para>
+<!-- .LP -->
+If the string returned to def_string_return is the empty string (""),
+no glyphs are drawn, and the escapement is zero.
+The returned string is null-terminated.
+It is owned by Xlib and should not be modified or freed by the client.
+It will be freed by a call to 
+<xref linkend='XFreeFontSet' xrefstyle='select: title'/>
+with the associated 
+<type>XFontSet</type>.
+Until freed, its contents will not be modified by Xlib.
+</para>
+<para>
+<!-- .LP -->
+The client is responsible for constructing an error message from the
+missing charset and default string information and may choose to continue
+operation in the case that some fonts did not exist.
+</para>
+<para>
+<!-- .LP -->
+The returned 
+<type>XFontSet</type>
+and missing charset list should be freed with 
+<xref linkend='XFreeFontSet' xrefstyle='select: title'/>
+and
+<xref linkend='XFreeStringList' xrefstyle='select: title'/>,
+respectively.
+The client-supplied base_font_name_list may be freed 
+by the client after calling 
+<xref linkend='XCreateFontSet' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain a list of 
+<structname>XFontStruct</structname>
+structures and full font names given an 
+<type>XFontSet</type>,
+use
+<xref linkend='XFontsOfFontSet' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XFontsOfFontSet</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XFontsOfFontSet'>
+<funcprototype>
+  <funcdef>int <function>XFontsOfFontSet</function></funcdef>
+  <paramdef>XFontSet<parameter> font_set</parameter></paramdef>
+  <paramdef>XFontStruct<parameter> ***font_struct_list_return</parameter></paramdef>
+  <paramdef>char<parameter> ***font_name_list_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_set</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the font set.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_struct_list_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the list of font structs.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_name_list_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the list of font names.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XFontsOfFontSet' xrefstyle='select: title'/>
+function returns a list of one or more 
+<structname>XFontStruct</structname>s
+and font names for the fonts used by the Xmb and Xwc layers
+for the given font set.
+A list of pointers to the
+<structname>XFontStruct</structname>
+structures is returned to font_struct_list_return.
+A list of pointers to null-terminated, fully specified font name strings
+in the locale of the font set is returned to font_name_list_return.
+The font_name_list order corresponds to the font_struct_list order.
+The number of
+<structname>XFontStruct</structname>
+structures and font names is returned as the value of the function.
+</para>
+<para>
+<!-- .LP -->
+Because it is not guaranteed that a given character will be imaged using a
+single font glyph,
+there is no provision for mapping a character or default string 
+to the font properties, font ID, or direction hint for the font 
+for the character.
+The client may access the 
+<structname>XFontStruct</structname>
+list to obtain these values for all the fonts currently in use.
+</para>
+<para>
+<!-- .LP -->
+Xlib does not guarantee that fonts are loaded from the server
+at the creation of an 
+<type>XFontSet</type>.
+Xlib may choose to cache font data, loading it only as needed to draw text 
+or compute text dimensions.
+Therefore, existence of the per_char metrics in the 
+<structname>XFontStruct</structname>
+structures in the
+<structname>XFontStructSet</structname>
+is undefined.
+Also, note that all properties in the 
+<structname>XFontStruct</structname>
+structures are in the STRING encoding.
+</para>
+<para>
+<!-- .LP -->
+The 
+<structname>XFontStruct</structname>
+and font name lists are owned by Xlib 
+and should not be modified or freed by the client.
+They will be freed by a call to
+<xref linkend='XFreeFontSet' xrefstyle='select: title'/>
+with the associated
+<type>XFontSet</type>.
+Until freed, their contents will not be modified by Xlib.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain the base font name list and the selected font name list given an
+<type>XFontSet</type>,
+use
+<xref linkend='XBaseFontNameListOfFontSet' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XBaseFontNameListOfFontSet</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XBaseFontNameListOfFontSet'>
+<funcprototype>
+  <funcdef>char *<function>XBaseFontNameListOfFontSet</function></funcdef>
+  <paramdef>XFontSet<parameter> font_set</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_set</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the font set.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XBaseFontNameListOfFontSet' xrefstyle='select: title'/>
+function returns the original base font name list supplied
+by the client when the 
+<type>XFontSet</type>
+was created.
+A null-terminated string containing a list of
+comma-separated font names is returned
+as the value of the function.
+White space may appear immediately on either side of separating commas.
+</para>
+<para>
+<!-- .LP -->
+If 
+<xref linkend='XCreateFontSet' xrefstyle='select: title'/>
+obtained an <acronym>XLFD</acronym> name from the font properties for the font specified
+by a non-<acronym>XLFD</acronym> base name, the
+<xref linkend='XBaseFontNameListOfFontSet' xrefstyle='select: title'/>
+function will return the <acronym>XLFD</acronym> name instead of the non-<acronym>XLFD</acronym> base name.
+</para>
+<para>
+<!-- .LP -->
+The base font name list is owned by Xlib and should not be modified or
+freed by the client.
+It will be freed by a call to 
+<xref linkend='XFreeFontSet' xrefstyle='select: title'/>
+with the associated 
+<type>XFontSet</type>.
+Until freed, its contents will not be modified by Xlib.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain the locale name given an 
+<type>XFontSet</type>,
+use
+<xref linkend='XLocaleOfFontSet' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XLocaleOfFontSet</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XLocaleOfFontSet'>
+<funcprototype>
+  <funcdef>char *<function>XLocaleOfFontSet</function></funcdef>
+  <paramdef>XFontSet<parameter> font_set</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_set</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the font set.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XLocaleOfFontSet' xrefstyle='select: title'/>
+function
+returns the name of the locale bound to the specified
+<type>XFontSet</type>,
+as a null-terminated string.
+</para>
+<para>
+<!-- .LP -->
+The returned locale name string is owned by Xlib
+and should not be modified or freed by the client.
+It may be freed by a call to
+<xref linkend='XFreeFontSet' xrefstyle='select: title'/>
+with the associated 
+<type>XFontSet</type>.
+Until freed, it will not be modified by Xlib.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+The 
+<xref linkend='XFreeFontSet' xrefstyle='select: title'/>
+function is a convenience function for freeing an output context.
+<xref linkend='XFreeFontSet' xrefstyle='select: title'/>
+also frees its associated 
+<type>XOM</type>
+if the output context was created by
+<xref linkend='XCreateFontSet' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XFreeFontSet</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XFreeFontSet'>
+<funcprototype>
+  <funcdef>void <function>XFreeFontSet</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XFontSet<parameter> font_set</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_set</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the font set.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XFreeFontSet' xrefstyle='select: title'/>
+function frees the specified font set.
+The associated base font name list, font name list, 
+<structname>XFontStruct</structname>
+list, and 
+<structname>XFontSetExtents</structname>,
+if any, are freed.
+</para>
+</sect2>
+<sect2 id="Obtaining_Font_Set_Metrics">
+<title>Obtaining Font Set Metrics</title>
+<!-- .XS -->
+<!-- (SN Obtaining Font Set Metrics -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Metrics for the internationalized text drawing functions 
+are defined in terms of a primary draw direction, 
+which is the default direction in which the character origin advances
+for each succeeding character in the string.
+The Xlib interface is currently defined to support only a left-to-right
+primary draw direction.
+The drawing origin is the position passed to the drawing function 
+when the text is drawn.
+The baseline is a line drawn through the drawing origin parallel
+to the primary draw direction.
+Character ink is the pixels painted in the foreground color 
+and does not include interline or intercharacter spacing 
+or image text background pixels.
+</para>
+<para>
+<!-- .LP -->
+The drawing functions are allowed to implement implicit text
+directionality control, reversing the order in which characters are
+rendered along the primary draw direction in response to locale-specific
+lexical analysis of the string.
+</para>
+<para>
+<!-- .LP -->
+Regardless of the character rendering order,
+the origins of all characters are on the primary draw direction side
+of the drawing origin.
+The screen location of a particular character image may be determined with
+<xref linkend='XmbTextPerCharExtents' xrefstyle='select: title'/>
+or
+<xref linkend='XwcTextPerCharExtents' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+The drawing functions are allowed to implement context-dependent
+rendering, where the glyphs drawn for a string are not simply a
+concatenation of the glyphs that represent each individual character.
+A string of two characters drawn with 
+<xref linkend='XmbDrawString' xrefstyle='select: title'/>
+may render differently than if the two characters 
+were drawn with separate calls to
+<xref linkend='XmbDrawString' xrefstyle='select: title'/>.
+If the client appends or inserts a character 
+in a previously drawn string,
+the client may need to redraw some adjacent characters 
+to obtain proper rendering.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To find out about direction-dependent rendering, use
+<xref linkend='XDirectionalDependentDrawing' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDirectionalDependentDrawing</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDirectionalDependentDrawing'>
+<funcprototype>
+  <funcdef>Bool <function>XDirectionalDependentDrawing</function></funcdef>
+  <paramdef>XFontSet<parameter> font_set</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_set</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the font set.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XDirectionalDependentDrawing' xrefstyle='select: title'/>
+function returns
+<symbol>True</symbol>
+if the drawing functions implement implicit text directionality;
+otherwise, it returns
+<symbol>False</symbol>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To find out about context-dependent rendering, use
+<xref linkend='XContextualDrawing' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XContextualDrawing</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XContextualDrawing'>
+<funcprototype>
+  <funcdef>Bool <function>XContextualDrawing</function></funcdef>
+  <paramdef>XFontSet<parameter> font_set</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_set</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the font set.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XContextualDrawing' xrefstyle='select: title'/>
+function returns
+<symbol>True</symbol>
+if text drawn with the font set might include context-dependent drawing;
+otherwise, it returns
+<symbol>False</symbol>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To find out about context-dependent or direction-dependent rendering, use
+<xref linkend='XContextDependentDrawing' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XContextDependentDrawing</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XContextDependentDrawing'>
+<funcprototype>
+  <funcdef>Bool <function>XContextDependentDrawing</function></funcdef>
+  <paramdef>XFontSet<parameter> font_set</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_set</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the font set.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XContextDependentDrawing' xrefstyle='select: title'/>
+function returns
+<symbol>True</symbol>
+if the drawing functions implement implicit text directionality or
+if text drawn with the font_set might include context-dependent drawing;
+otherwise, it returns
+<symbol>False</symbol>.
+</para>
+<para>
+<!-- .LP -->
+The drawing functions do not interpret newline, tab, or other control
+characters.
+The behavior when nonprinting characters other than space are drawn
+is implementation-dependent.
+It is the client's responsibility to interpret control characters
+in a text stream.
+</para>
+<para>
+<!-- .LP -->
+The maximum character extents for the fonts that are used by the text
+drawing layers can be accessed by the 
+<structname>XFontSetExtents</structname>
+structure:
+<indexterm significance="preferred"><primary>XFontSetExtents</primary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     XRectangle max_ink_extent;     /* over all drawable characters */
+     XRectangle max_logical_extent; /* over all drawable characters */
+} XFontSetExtents;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+The 
+<structname>XRectangle</structname>
+structures used to return font set metrics are the usual Xlib screen-oriented 
+rectangles
+with x, y giving the upper left corner, and width and height always positive.
+</para>
+<para>
+<!-- .LP -->
+The max_ink_extent member gives the maximum extent, over all drawable characters, of
+the rectangles that bound the character glyph image drawn in the
+foreground color, relative to a constant origin.
+See 
+<xref linkend='XmbTextExtents' xrefstyle='select: title'/>
+and
+<function>XwcTextExtents</function>
+for detailed semantics.
+</para>
+<para>
+<!-- .LP -->
+The max_logical_extent member gives the maximum extent,
+over all drawable characters, of the rectangles 
+that specify minimum spacing to other graphical features,
+relative to a constant origin.
+Other graphical features drawn by the client, for example,
+a border surrounding the text, should not intersect this rectangle.
+The max_logical_extent member should be used to compute minimum 
+interline spacing and the minimum area that must be allowed
+in a text field to draw a given number of arbitrary characters.
+</para>
+<para>
+<!-- .LP -->
+Due to context-dependent rendering,
+appending a given character to a string may change 
+the string's extent by an amount other than that character's
+individual extent.
+</para>
+<para>
+<!-- .LP -->
+The rectangles for a given character in a string can be obtained from
+<xref linkend='XmbTextPerCharExtents' xrefstyle='select: title'/>
+or
+<xref linkend='XwcTextPerCharExtents' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain the maximum extents structure given an
+<type>XFontSet</type>,
+use
+<xref linkend='XExtentsOfFontSet' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XExtentsOfFontSet</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XExtentsOfFontSet'>
+<funcprototype>
+  <funcdef>XFontSetExtents *<function>XExtentsOfFontSet</function></funcdef>
+  <paramdef>XFontSet<parameter> font_set</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_set</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the font set.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XExtentsOfFontSet' xrefstyle='select: title'/>
+function returns an
+<structname>XFontSetExtents</structname>
+structure for the fonts used by the Xmb and Xwc layers
+for the given font set.
+</para>
+<para>
+<!-- .LP -->
+The 
+<structname>XFontSetExtents</structname>
+structure is owned by Xlib and should not be modified
+or freed by the client.
+It will be freed by a call to 
+<xref linkend='XFreeFontSet' xrefstyle='select: title'/>
+with the associated 
+<type>XFontSet</type>.
+Until freed, its contents will not be modified by Xlib.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain the escapement in pixels of the specified text as a value,
+use
+<xref linkend='XmbTextEscapement' xrefstyle='select: title'/>
+or 
+<xref linkend='XwcTextEscapement' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XmbTextEscapement</primary></indexterm>
+<indexterm significance="preferred"><primary>XwcTextEscapement</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XmbTextEscapement'>
+<funcprototype>
+  <funcdef>int <function>XmbTextEscapement</function></funcdef>
+  <paramdef>XFontSet<parameter> font_set</parameter></paramdef>
+  <paramdef>char<parameter> *string</parameter></paramdef>
+  <paramdef>int<parameter> num_bytes</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<funcsynopsis id='XwcTextEscapement'>
+<funcprototype>
+  <funcdef>int <function>XwcTextEscapement</function></funcdef>
+  <paramdef>XFontSet<parameter> font_set</parameter></paramdef>
+  <paramdef>wchar_t<parameter> *string</parameter></paramdef>
+  <paramdef>int<parameter> num_wchars</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_set</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the font set.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>string</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the character string.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>num_bytes</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of bytes in the string argument.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>num_wchars</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of characters in the string argument.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XmbTextEscapement' xrefstyle='select: title'/>
+and
+<xref linkend='XwcTextEscapement' xrefstyle='select: title'/>
+functions return the escapement in pixels of the specified string as a value,
+using the fonts loaded for the specified font set.
+The escapement is the distance in pixels in the primary draw
+direction from the drawing origin to the origin of the next character to
+be drawn, assuming that the rendering of the next character is not
+dependent on the supplied string.
+</para>
+<para>
+<!-- .LP -->
+Regardless of the character rendering order,
+the escapement is always positive.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain the overall_ink_return and overall_logical_return arguments,
+the overall bounding box of the string's image, and a logical bounding box,
+use
+<xref linkend='XmbTextExtents' xrefstyle='select: title'/>
+ or
+<function>XwcTextExtents</function>.
+</para>
+<indexterm significance="preferred"><primary>XmbTextExtents</primary></indexterm>
+<indexterm significance="preferred"><primary>XwcTextExtents</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XmbTextExtents'>
+<funcprototype>
+  <funcdef>int <function>XmbTextExtents</function></funcdef>
+  <paramdef>XFontSet<parameter> font_set</parameter></paramdef>
+  <paramdef>char<parameter> *string</parameter></paramdef>
+  <paramdef>int<parameter> num_bytes</parameter></paramdef>
+  <paramdef>XRectangle<parameter> *overall_ink_return</parameter></paramdef>
+  <paramdef>XRectangle<parameter> *overall_logical_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<funcsynopsis>
+<funcprototype id='xwctextextents'>
+  <funcdef>int <function>XwcTextExtents</function></funcdef>
+  <paramdef>XFontSet<parameter> font_set</parameter></paramdef>
+  <paramdef>wchar_t<parameter> *string</parameter></paramdef>
+  <paramdef>int<parameter> num_wchars</parameter></paramdef>
+  <paramdef>XRectangle<parameter> *overall_ink_return</parameter></paramdef>
+  <paramdef>XRectangle<parameter> *overall_logical_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_set</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the font set.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>string</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the character string.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>num_bytes</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of bytes in the string argument.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>num_wchars</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of characters in the string argument.
+<!-- .ds Ov dimensions -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>overall_ink_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the overall ink dimensions.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>overall_logical_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the overall logical dimensions.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XmbTextExtents' xrefstyle='select: title'/>
+and
+<function>XwcTextExtents</function>
+functions set the components of the specified overall_ink_return and
+overall_logical_return
+arguments to the overall bounding box of the string's image
+and a logical bounding box for spacing purposes, respectively.
+They return the value returned by 
+<xref linkend='XmbTextEscapement' xrefstyle='select: title'/>
+or
+<xref linkend='XwcTextEscapement' xrefstyle='select: title'/>.
+These metrics are relative to the drawing origin of the string,
+using the fonts loaded for the specified font set.
+</para>
+<para>
+<!-- .LP -->
+If the overall_ink_return argument is non-NULL,
+it is set to the bounding box of the string's character ink.
+The overall_ink_return for a nondescending, horizontally drawn
+Latin character is conventionally entirely above the baseline;
+that is, overall_ink_return.height &lt;= -overall_ink_return.y.
+The overall_ink_return for a nonkerned character
+is entirely at, and to the right of, the origin;
+that is, overall_ink_return.x &gt;= 0.
+A character consisting of a single pixel at the origin would set
+overall_ink_return fields y = 0, x = 0, width = 1, and height = 1.
+</para>
+<para>
+<!-- .LP -->
+If the overall_logical_return argument is non-NULL,
+it is set to the bounding box that provides minimum spacing
+to other graphical features for the string.
+Other graphical features, for example, a border surrounding the text,
+should not intersect this rectangle.
+</para>
+<para>
+<!-- .LP -->
+When the 
+<type>XFontSet</type>
+has missing charsets,
+metrics for each unavailable character are taken 
+from the default string returned by 
+<xref linkend='XCreateFontSet' xrefstyle='select: title'/>
+so that the metrics represent the text as it will actually be drawn.
+The behavior for an invalid codepoint is undefined.
+</para>
+<para>
+<!-- .LP -->
+To determine the effective drawing origin for a character in a drawn string,
+the client should call 
+<xref linkend='XmbTextPerCharExtents' xrefstyle='select: title'/>
+on the entire string, then on the character,
+and subtract the x values of the returned 
+rectangles for the character.
+This is useful to redraw portions of a line of text
+or to justify words, but for context-dependent rendering,
+the client should not assume that it can redraw the character by itself
+and get the same rendering.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain per-character information for a text string,
+use
+<xref linkend='XmbTextPerCharExtents' xrefstyle='select: title'/>
+or
+<xref linkend='XwcTextPerCharExtents' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XmbTextPerCharExtents</primary></indexterm>
+<indexterm significance="preferred"><primary>XwcTextPerCharExtents</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XmbTextPerCharExtents'>
+<funcprototype>
+  <funcdef>Status <function>XmbTextPerCharExtents</function></funcdef>
+  <paramdef>XFontSet<parameter> font_set</parameter></paramdef>
+  <paramdef>char<parameter> *string</parameter></paramdef>
+  <paramdef>int<parameter> num_bytes</parameter></paramdef>
+  <paramdef>XRectangle<parameter> *ink_array_return</parameter></paramdef>
+  <paramdef>XRectangle<parameter> *logical_array_return</parameter></paramdef>
+  <paramdef>int<parameter> array_size</parameter></paramdef>
+  <paramdef>int<parameter> *num_chars_return</parameter></paramdef>
+  <paramdef>XRectangle<parameter> *overall_ink_return</parameter></paramdef>
+  <paramdef>XRectangle<parameter> *overall_logical_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<funcsynopsis id='XwcTextPerCharExtents'>
+<funcprototype>
+  <funcdef>Status <function>XwcTextPerCharExtents</function></funcdef>
+  <paramdef>XFontSet<parameter> font_set</parameter></paramdef>
+  <paramdef>wchar_t<parameter> *string</parameter></paramdef>
+  <paramdef>int<parameter> num_wchars</parameter></paramdef>
+  <paramdef>XRectangle<parameter> *ink_array_return</parameter></paramdef>
+  <paramdef>XRectangle<parameter> *logical_array_return</parameter></paramdef>
+  <paramdef>int<parameter> array_size</parameter></paramdef>
+  <paramdef>int<parameter> *num_chars_return</parameter></paramdef>
+  <paramdef>XRectangle<parameter> *overall_ink_return</parameter></paramdef>
+  <paramdef>XRectangle<parameter> *overall_logical_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_set</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the font set.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>string</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the character string.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>num_bytes</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of bytes in the string argument.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>num_wchars</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of characters in the string argument.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ink_array_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the ink dimensions for each character.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>logical_array_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the logical dimensions for each character.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>array_size</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the size of ink_array_return and logical_array_return.
+The caller must pass in arrays of this size.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>num_chars_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the number of characters in the string argument.
+<!-- .ds Ov extents of the entire string -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>overall_ink_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the overall ink dimensions.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>overall_logical_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the overall logical dimensions.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XmbTextPerCharExtents' xrefstyle='select: title'/>
+and
+<xref linkend='XwcTextPerCharExtents' xrefstyle='select: title'/>
+functions return the text dimensions of each character of the specified text,
+using the fonts loaded for the specified font set.
+Each successive element of ink_array_return and logical_array_return
+is set to the successive character's drawn metrics,
+relative to the drawing origin of the string and one 
+rectangle
+for each character in the supplied text string.
+The number of elements of ink_array_return and logical_array_return
+that have been set is returned to num_chars_return.
+</para>
+<para>
+<!-- .LP -->
+Each element of ink_array_return is set to the bounding box 
+of the corresponding character's drawn foreground color.
+Each element of logical_array_return is set to the bounding box 
+that provides minimum spacing to other graphical features
+for the corresponding character.
+Other graphical features should not intersect any of the
+logical_array_return rectangles.
+</para>
+<para>
+<!-- .LP -->
+Note that an 
+<structname>XRectangle</structname>
+represents the effective drawing dimensions of the character,
+regardless of the number of font glyphs that are used to draw
+the character or the direction in which the character is drawn.
+If multiple characters map to a single character glyph,
+the dimensions of all the 
+<structname>XRectangle</structname>s
+of those characters are the same.
+</para>
+<para>
+<!-- .LP -->
+When the 
+<type>XFontSet</type>
+has missing charsets, metrics for each unavailable
+character are taken from the default string returned by 
+<xref linkend='XCreateFontSet' xrefstyle='select: title'/>
+so that the metrics represent the text as it will actually be drawn.
+The behavior for an invalid codepoint is undefined.
+</para>
+<para>
+<!-- .LP -->
+If the array_size is too small for the number of characters in the
+supplied text, the functions return zero
+and num_chars_return is set to the number of rectangles required.
+Otherwise, the functions return a nonzero value.
+</para>
+<para>
+<!-- .LP -->
+If the overall_ink_return or overall_logical_return argument is non-NULL,
+<xref linkend='XmbTextPerCharExtents' xrefstyle='select: title'/>
+and 
+<xref linkend='XwcTextPerCharExtents' xrefstyle='select: title'/>
+return the maximum extent of the string's metrics to overall_ink_return
+or overall_logical_return, as returned by 
+<xref linkend='XmbTextExtents' xrefstyle='select: title'/>
+or 
+<function>XwcTextExtents</function>.
+</para>
+</sect2>
+<sect2 id="Drawing_Text_Using_Font_Sets">
+<title>Drawing Text Using Font Sets</title>
+<!-- .XS -->
+<!-- (SN Drawing Text Using Font Sets -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The functions defined in this section
+draw text at a specified location in a drawable.
+They are similar to the functions
+<xref linkend='XDrawText' xrefstyle='select: title'/>,
+<xref linkend='XDrawString' xrefstyle='select: title'/>,
+and
+<xref linkend='XDrawImageString' xrefstyle='select: title'/>
+except that they work with font sets instead of single fonts
+and interpret the text based on the locale of the font set
+instead of treating the bytes of the string as direct font indexes.
+See <link linkend="Drawing_Text">section 8.6</link> for details
+of the use of Graphics Contexts (GCs)
+and possible protocol errors.
+If a 
+<errorname>BadFont</errorname>
+error is generated,
+characters prior to the offending character may have been drawn.
+</para>
+<para>
+<!-- .LP -->
+The text is drawn using the fonts loaded for the specified font set;
+the font in the GC is ignored and may be modified by the functions.
+No validation that all fonts conform to some width rule is performed.
+</para>
+<para>
+<!-- .LP -->
+The text functions
+<xref linkend='XmbDrawText' xrefstyle='select: title'/>
+and
+<xref linkend='XwcDrawText' xrefstyle='select: title'/>
+use the following structures:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XmbTextItem</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef struct {
+     char     *chars;    /* pointer to string */
+     int      nchars;    /* number of bytes */
+     int      delta;     /* pixel delta between strings */
+     XFontSet font_set;  /* fonts, None means don't change */
+} XmbTextItem;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XwcTextItem</primary></indexterm>
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef struct {
+     wchar_t *chars;     /* pointer to wide char string */
+     int nchars;     /* number of wide characters */
+     int delta;     /* pixel delta between strings */
+     XFontSet font_set;     /* fonts, None means don't change */
+} XwcTextItem;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<!-- .sp -->
+To draw text using multiple font sets in a given drawable, use
+<xref linkend='XmbDrawText' xrefstyle='select: title'/>
+or
+<xref linkend='XwcDrawText' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XmbDrawText</primary></indexterm>
+<indexterm significance="preferred"><primary>XwcDrawText</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XmbDrawText'>
+<funcprototype>
+  <funcdef>void <function>XmbDrawText</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>intx,<parameter> y</parameter></paramdef>
+  <paramdef>XmbTextItem<parameter> *items</parameter></paramdef>
+  <paramdef>int<parameter> nitems</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<funcsynopsis id='XwcDrawText'>
+<funcprototype>
+  <funcdef>void <function>XwcDrawText</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>intx,<parameter> y</parameter></paramdef>
+  <paramdef>XwcTextItem<parameter> *items</parameter></paramdef>
+  <paramdef>int<parameter> nitems</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+<!-- .ds Xy -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates(Xy.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>items</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies an array of text items.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nitems</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of text items in the array.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XmbDrawText' xrefstyle='select: title'/>
+and 
+<xref linkend='XwcDrawText' xrefstyle='select: title'/>
+functions allow complex spacing and font set shifts between text strings.
+Each text item is processed in turn, with the origin of a text
+element advanced in the primary draw direction by the escapement of the
+previous text item.
+A text item delta specifies an additional escapement of the text item
+drawing origin in the primary draw direction.
+A font_set member other than 
+<symbol>None</symbol>
+in an item causes the font set to be used for this and subsequent text items
+in the text_items list.
+Leading text items with a font_set member set to
+<symbol>None</symbol>
+will not be drawn.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XmbDrawText' xrefstyle='select: title'/>
+and
+<xref linkend='XwcDrawText' xrefstyle='select: title'/>
+do not perform any context-dependent rendering between text segments.
+Clients may compute the drawing metrics by passing each text segment to
+<xref linkend='XmbTextExtents' xrefstyle='select: title'/>
+and
+<function>XwcTextExtents</function>
+or 
+<xref linkend='XmbTextPerCharExtents' xrefstyle='select: title'/>
+and
+<xref linkend='XwcTextPerCharExtents' xrefstyle='select: title'/>.
+When the 
+<type>XFontSet</type>
+has missing charsets, each unavailable character is drawn 
+with the default string returned by 
+<xref linkend='XCreateFontSet' xrefstyle='select: title'/>.
+The behavior for an invalid codepoint is undefined.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To draw text using a single font set in a given drawable, use
+<xref linkend='XmbDrawString' xrefstyle='select: title'/>
+or
+<xref linkend='XwcDrawString' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XmbDrawString</primary></indexterm>
+<indexterm significance="preferred"><primary>XwcDrawString</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XmbDrawString'>
+<funcprototype>
+  <funcdef>void <function>XmbDrawString</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>XFontSet<parameter> font_set</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>intx,<parameter> y</parameter></paramdef>
+  <paramdef>char<parameter> *string</parameter></paramdef>
+  <paramdef>int<parameter> num_bytes</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<funcsynopsis id='XwcDrawString'>
+<funcprototype>
+  <funcdef>void <function>XwcDrawString</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>XFontSet<parameter> font_set</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>intx,<parameter> y</parameter></paramdef>
+  <paramdef>wchar_t<parameter> *string</parameter></paramdef>
+  <paramdef>int<parameter> num_wchars</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_set</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the font set.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+<!-- .ds Xy -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates(Xy.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>string</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the character string.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>num_bytes</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of bytes in the string argument.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>num_wchars</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of characters in the string argument.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XmbDrawString' xrefstyle='select: title'/>
+and
+<xref linkend='XwcDrawString' xrefstyle='select: title'/>
+functions draw the specified text with the foreground pixel.
+When the 
+<type>XFontSet</type>
+has missing charsets, each unavailable character is drawn 
+with the default string returned by 
+<xref linkend='XCreateFontSet' xrefstyle='select: title'/>.
+The behavior for an invalid codepoint is undefined.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To draw image text using a single font set in a given drawable, use
+<xref linkend='XmbDrawImageString' xrefstyle='select: title'/>
+or
+<xref linkend='XwcDrawImageString' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XmbDrawImageString</primary></indexterm>
+<indexterm significance="preferred"><primary>XwcDrawImageString</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XmbDrawImageString'>
+<funcprototype>
+  <funcdef>void <function>XmbDrawImageString</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>XFontSet<parameter> font_set</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>intx,<parameter> y</parameter></paramdef>
+  <paramdef>char<parameter> *string</parameter></paramdef>
+  <paramdef>int<parameter> num_bytes</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<funcsynopsis id='XwcDrawImageString'>
+<funcprototype>
+  <funcdef>void <function>XwcDrawImageString</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>XFontSet<parameter> font_set</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>intx,<parameter> y</parameter></paramdef>
+  <paramdef>wchar_t<parameter> *string</parameter></paramdef>
+  <paramdef>int<parameter> num_wchars</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>font_set</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the font set.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+<!-- .ds Xy -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates(Xy.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>string</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the character string.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>num_bytes</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of bytes in the string argument.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>num_wchars</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of characters in the string argument.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XmbDrawImageString' xrefstyle='select: title'/>
+and
+<xref linkend='XwcDrawImageString' xrefstyle='select: title'/>
+functions fill a destination rectangle with the background pixel defined
+in the GC and then paint the text with the foreground pixel.
+The filled rectangle is the rectangle returned to overall_logical_return by
+<xref linkend='XmbTextExtents' xrefstyle='select: title'/>
+or 
+<function>XwcTextExtents</function>
+for the same text and 
+<type>XFontSet</type>.
+</para>
+<para>
+<!-- .LP -->
+When the 
+<type>XFontSet</type>
+has missing charsets, each unavailable character is drawn 
+with the default string returned by 
+<xref linkend='XCreateFontSet' xrefstyle='select: title'/>.
+The behavior for an invalid codepoint is undefined.
+</para>
+</sect2>
+</sect1>
+<sect1 id="Input_Methods">
+<title>Input Methods</title>
+<!-- .XS -->
+<!-- (SN Input Methods -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+This section provides discussions of the following X Input Method
+(<acronym>XIM</acronym>) topics:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+Input method overview
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Input method management
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Input method functions
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Input method values
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Input context functions
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Input context values
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Input method callback semantics
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Event filtering
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Getting keyboard input
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Input method conventions
+    </para>
+  </listitem>
+</itemizedlist>
+<sect2 id="Input_Method_Overview">
+<title>Input Method Overview</title>
+<!-- .XS -->
+<!-- (SN Input Method Overview -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+This section provides definitions for terms and concepts used
+for internationalized text input and a brief overview of the
+intended use of the mechanisms provided by Xlib.
+</para>
+<para>
+<!-- .LP -->
+A large number of languages in the world use alphabets
+consisting of a small set of symbols (letters) to form words.
+To enter text into a computer in an alphabetic language,
+a user usually has a keyboard on which there exist key symbols corresponding
+to the alphabet.
+Sometimes, a few characters of an alphabetic language are missing
+on the keyboard.
+Many computer users who speak a Latin-alphabet-based language 
+only have an English-based keyboard.
+They need to hit a combination of keystrokes
+to enter a character that does not exist directly on the keyboard.
+A number of algorithms have been developed for entering such characters.
+These are known as European input methods, compose input methods, 
+or dead-key input methods.
+</para>
+<para>
+<!-- .LP -->
+Japanese is an example of a language with a phonetic symbol set,
+where each symbol represents a specific sound.
+There are two phonetic symbol sets in Japanese:  Katakana and Hiragana.
+In general,
+Katakana is used for words that are of foreign origin,
+and Hiragana is used for writing native Japanese words.
+Collectively, the two systems are called Kana.
+Each set consists of 48 characters.
+</para>
+<para>
+<!-- .LP -->
+Korean also has a phonetic symbol set, called Hangul.
+Each of the 24 basic phonetic symbols (14 consonants and 10 vowels)
+represents a specific sound.
+A syllable is composed of two or three parts: 
+the initial consonants, the vowels, and the optional last consonants.
+With Hangul,
+syllables can be treated as the basic units on which text processing is done.
+For example,
+a delete operation may work on a phonetic symbol or a syllable.
+Korean code sets include several thousands of these syllables.
+A user types the phonetic symbols that make up the syllables of the words
+to be entered.
+The display may change as each phonetic symbol is entered.
+For example,
+when the second phonetic symbol of a syllable is entered,
+the first phonetic symbol may change its shape and size.
+Likewise, when the third phonetic symbol is entered,
+the first two phonetic symbols may change their shape and size.
+</para>
+<para>
+<!-- .LP -->
+Not all languages rely solely on alphabetic or phonetic systems.
+Some languages, including Japanese and Korean, employ an
+ideographic writing system.
+In an ideographic system, rather than taking a small set of
+symbols and combining them in different ways to create words,
+each word consists of one unique symbol (or, occasionally, several symbols).
+The number of symbols can be very large: 
+approximately 50,000 have been identified in Hanzi,
+the Chinese ideographic system.
+</para>
+<para>
+<!-- .LP -->
+Two major aspects of ideographic systems impact their use with computers.
+First, the standard computer character sets in Japan, China, and Korea
+include roughly 8,000 characters,
+while sets in Taiwan have between 15,000 and 30,000 characters.
+This makes it necessary to use more than one byte to represent a character.
+Second, it obviously is impractical to have a keyboard that includes
+all of a given language's ideographic symbols.
+Therefore, a mechanism is required for entering characters
+so that a keyboard with a reasonable number of keys can be used.
+Those input methods are usually based on phonetics,
+but there also exist methods based on the graphical properties of
+characters.
+</para>
+<para>
+<!-- .LP -->
+In Japan, both Kana and the ideographic system Kanji are used.
+In Korea, Hangul and sometimes the ideographic system Hanja are used.
+Now consider entering ideographs in Japan, Korea, China, and Taiwan.
+</para>
+<para>
+<!-- .LP -->
+In Japan, either Kana or English characters are typed and then a region
+is selected (sometimes automatically) for conversion to Kanji.
+Several Kanji characters may have the same phonetic representation.
+If that is the case with the string entered,
+a menu of characters is presented and
+the user must choose the appropriate one.
+If no choice is necessary or a preference has been established,
+the input method does the substitution directly.
+When Latin characters are converted to Kana or Kanji,
+it is called a romaji conversion.
+</para>
+<para>
+<!-- .LP -->
+In Korea, it is usually acceptable to keep Korean text in Hangul form,
+but some people may choose to write Hanja-originated words in Hanja
+rather than in Hangul.
+To change Hangul to Hanja,
+the user selects a region for conversion
+and then follows the same basic method as that described for Japanese.
+</para>
+<para>
+<!-- .LP -->
+Probably because there are well-accepted phonetic writing systems
+for Japanese and Korean,
+computer input methods in these countries for entering ideographs 
+are fairly standard.
+Keyboard keys have both English characters and phonetic symbols
+engraved on them, and the user can switch between the two sets.
+</para>
+<para>
+<!-- .LP -->
+The situation is different for Chinese.
+While there is a phonetic system called Pinyin promoted by authorities,
+there is no consensus for entering Chinese text.
+Some vendors use a phonetic decomposition (Pinyin or another),
+others use ideographic decomposition of Chinese words,
+with various implementations and keyboard layouts. 
+There are about 16 known methods, none of which is a clear standard. 
+</para>
+<para>
+<!-- .LP -->
+Also, there are actually two ideographic sets used:
+Traditional Chinese (the original written Chinese)
+and Simplified Chinese.
+Several years ago,
+the People's Republic of China launched a campaign to simplify
+some ideographic characters and eliminate redundancies altogether.
+Under the plan, 
+characters would be streamlined every five years.
+Characters have been revised several times now, 
+resulting in the smaller, simpler set that makes up Simplified Chinese.
+</para>
+<sect3 id="Input_Method_Architecture">
+<title>Input Method Architecture</title>
+<!-- .XS -->
+<!-- (SN Input Method Architecture -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+As shown in the previous section,
+there are many different input methods in use today,
+each varying with language, culture, and history. 
+A common feature of many input methods is that the user may type
+multiple keystrokes to compose a single character (or set
+of characters).
+The process of composing characters from keystrokes is called
+<emphasis remap='I'>preediting</emphasis>.
+It may require complex algorithms and large dictionaries 
+involving substantial computer resources.
+</para>
+<para>
+<!-- .LP -->
+Input methods may require one or more areas in which to show the
+feedback of the actual keystrokes, to propose disambiguation to the
+user, to list dictionaries, and so on.
+The input method areas of concern are as follows:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+The <emphasis remap='I'>status</emphasis> area is a logical extension of the
+LEDs that exist on the physical keyboard.
+It is a window that is intended to present the internal state
+of the input method that is critical to the user.
+The status area may consist of text data and bitmaps or some combination.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The <emphasis remap='I'>preedit</emphasis> area displays the
+intermediate text for those languages that are composing prior to 
+the client handling the data.   
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The <emphasis remap='I'>auxiliary</emphasis> area is used for pop-up menus and customizing
+dialogs that may be required for an input method.
+There may be multiple auxiliary areas for an input method.
+Auxiliary areas are managed by the input method independent of the client.
+Auxiliary areas are assumed to be separate dialogs,
+which are maintained by the input method.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+There are various user interaction styles used for preediting.
+The ones supported by Xlib are as follows:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+For <emphasis remap='I'>on-the-spot</emphasis> input methods,
+preediting data will be displayed directly in the application window.
+Application data is moved to allow preedit data to appear
+at the point of insertion.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<emphasis remap='I'>Over-the-spot</emphasis> preediting means that the data is displayed in
+a preedit window that is placed over the point of insertion.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<emphasis remap='I'>Off-the-spot</emphasis> preediting means that the preedit window is
+inside the application window but not at the point of insertion.
+Often, this type of window is placed at the bottom of the application window.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<emphasis remap='I'>Root-window</emphasis> preediting refers to input methods that use a preedit
+window that is the child of 
+<function>RootWindow</function>.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+It would require a lot of computing resources if portable applications
+had to include input methods for all the languages in the world.
+To avoid this,
+a goal of the Xlib design is to allow an application 
+to communicate with an input method placed in a separate process.
+Such a process is called an <emphasis remap='I'>input server</emphasis>.
+The server to which the application should connect is dependent on
+the environment when the application is started up,
+that is, the user language and the actual encoding to be used for it.
+The input method connection is said to be <emphasis remap='I'>locale-dependent</emphasis>.
+It is also user-dependent.
+For a given language, the user can choose, to some extent,
+the user interface style of input method (if choice is possible among
+several).
+</para>
+<para>
+<!-- .LP -->
+Using an input server implies communication overhead,
+but applications can be migrated without relinking.
+Input methods can be implemented either as a
+stub communicating to an input server or as a local library.
+</para>
+<para>
+<!-- .LP -->
+An input method may be based on a <emphasis remap='I'>front-end</emphasis> or a <emphasis remap='I'>back-end</emphasis>
+architecture.
+In a front-end architecture,
+there are two separate connections to the X server:
+keystrokes go directly from the X server to the input method on
+one connection and other events to the regular client connection.
+The input method is then acting as a filter and sends composed strings
+to the client.
+A front-end architecture requires synchronization between the
+two connections to avoid lost key events or locking issues.
+</para>
+<para>
+<!-- .LP -->
+In a back-end architecture,
+a single X server connection is used.
+A dispatching mechanism must decide on this channel to delegate appropriate
+keystrokes to the input method.
+For instance,
+it may retain a Help keystroke for its own purpose.
+In the case where the input method is a separate process (that is, a server),
+there must be a special communication protocol between the back-end client
+and the input server.
+</para>
+<para>
+<!-- .LP -->
+A front-end architecture introduces synchronization issues
+and a filtering mechanism for noncharacter keystrokes
+(Function keys, Help, and so on).
+A back-end architecture sometimes implies more communication overhead
+and more process switching.
+If all three processes (X server, input server, client)
+are running on a single workstation, 
+there are two process switches for each keystroke in a back-end
+architecture,
+but there is only one in a front-end architecture.
+</para>
+<para>
+<!-- .LP -->
+The abstraction used by a client to communicate with an input method
+is an opaque data structure represented by the 
+<type>XIM</type>
+data type.
+This data structure is returned by the 
+<xref linkend='XOpenIM' xrefstyle='select: title'/>
+function, which opens an input method on a given display.
+Subsequent operations on this data structure encapsulate all communication
+between client and input method.
+There is no need for an X client to use any networking library 
+or natural language package to use an input method.
+</para>
+<para>
+<!-- .LP -->
+A single input server may be used for one or more languages,
+supporting one or more encoding schemes.
+But the strings returned from an input method will always be encoded
+in the (single) locale associated with the
+<type>XIM</type>
+object.
+</para>
+</sect3>
+<sect3 id="Input_Contexts">
+<title>Input Contexts</title>
+<!-- .XS -->
+<!-- (SN Input Contexts -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides the ability to manage a multi-threaded state for text input.
+A client may be using multiple windows,
+each window with multiple text entry areas,
+and the user possibly switching among them at any time.
+The abstraction for representing the state of a particular input thread
+is called an <emphasis remap='I'>input context</emphasis>.
+The Xlib representation of an input context is an 
+<type>XIC</type>.
+</para>
+<para>
+<!-- .LP -->
+An input context is the abstraction retaining the state, properties,
+and semantics of communication between a client and an input method.
+An input context is a combination of an input method, a locale
+specifying the encoding of the character strings to be returned,
+a client window, internal state information,
+and various layout or appearance characteristics.
+The input context concept somewhat matches for input the graphics context
+abstraction defined for graphics output.
+</para>
+<para>
+<!-- .LP -->
+One input context belongs to exactly one input method.
+Different input contexts may be associated with the same input method,
+possibly with the same client window.
+An 
+<type>XIC</type>
+is created with the
+<xref linkend='XCreateIC' xrefstyle='select: title'/>
+function, providing an 
+<type>XIM</type>
+argument and affiliating the input context to the input method
+for its lifetime. 
+When an input method is closed with 
+<xref linkend='XCloseIM' xrefstyle='select: title'/>,
+all of its affiliated input contexts should not be used any more
+(and should preferably be destroyed before closing the input method).
+</para>
+<para>
+<!-- .LP -->
+Considering the example of a client window with multiple text entry areas,
+the application programmer could, for example, choose to implement as follows:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+As many input contexts are created as text entry areas, and the client
+will get the input accumulated on each context each time it looks up
+in that context.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A single context is created for a top-level window in the application.
+If such a window contains several text entry areas, 
+each time the user moves to another text entry area,
+the client has to indicate changes in the context.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+A range of choices can be made by application designers to use
+either a single or multiple input contexts,
+according to the needs of their application.
+</para>
+</sect3>
+<sect3 id="Getting_Keyboard_Input">
+<title>Getting Keyboard Input</title>
+<!-- .XS -->
+<!-- (SN Getting Keyboard Input -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To obtain characters from an input method,
+a client must call the function
+<xref linkend='XmbLookupString' xrefstyle='select: title'/>
+or 
+<xref linkend='XwcLookupString' xrefstyle='select: title'/>
+with an input context created from that input method.
+Both a locale and display are bound to an input method when it is opened,
+and an input context inherits this locale and display.
+Any strings returned by 
+<xref linkend='XmbLookupString' xrefstyle='select: title'/>
+or
+<xref linkend='XwcLookupString' xrefstyle='select: title'/>
+will be encoded in that locale. 
+</para>
+</sect3>
+<sect3 id="Focus_Management">
+<title>Focus Management</title>
+<!-- .XS -->
+<!-- (SN Focus Management -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+For each text entry area in which the
+<xref linkend='XmbLookupString' xrefstyle='select: title'/>
+or
+<xref linkend='XwcLookupString' xrefstyle='select: title'/>
+functions are used,
+there will be an associated input context.
+</para>
+<para>
+<!-- .LP -->
+When the application focus moves to a text entry area,
+the application must set the input context focus to the
+input context associated with that area.
+The input context focus is set by calling 
+<xref linkend='XSetICFocus' xrefstyle='select: title'/>
+with the appropriate input context.
+</para>
+<para>
+<!-- .LP -->
+Also, when the application focus moves out of a text entry area, the
+application should unset the focus for the associated input context
+by calling
+<xref linkend='XUnsetICFocus' xrefstyle='select: title'/>.
+As an optimization, if
+<xref linkend='XSetICFocus' xrefstyle='select: title'/>
+is called successively on two different input contexts,
+setting the focus on the second 
+will automatically unset the focus on the first.
+</para>
+<para>
+<!-- .LP -->
+To set and unset the input context focus correctly,
+it is necessary to track application-level focus changes.
+Such focus changes do not necessarily correspond to X server focus changes.
+</para>
+<para>
+<!-- .LP -->
+If a single input context
+is being used to do input for
+multiple text entry areas, it will also be necessary
+to set the focus window of the
+input context whenever the focus window changes
+(see <link linkend="Focus_Window">section 13.5.6.3</link>).
+</para>
+</sect3>
+<sect3 id="Geometry_Management">
+<title>Geometry Management</title>
+<!-- .XS -->
+<!-- (SN Geometry Management -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+In most input method architectures 
+(on-the-spot being the notable exception),
+the input method will perform the display of its own data.
+To provide better visual locality,
+it is often desirable to have the input method areas embedded within a client.
+To do this,
+the client may need to allocate space for an input method.
+Xlib provides support that allows the size and position of input method
+areas to be provided by a client.
+The input method areas that are supported for geometry management
+are the status area and the preedit area.
+</para>
+<para>
+<!-- .LP -->
+The fundamental concept on which geometry management for input method windows
+is based is the proper division of responsibilities between the
+client (or toolkit) and the input method.
+The division of responsibilities is as follows:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+The client is responsible for the geometry of the input method window.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The input method is responsible for the contents of the input method window.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+An input method is able to suggest a size to the client,
+but it cannot suggest a placement.
+Also the input method can only suggest a size.
+It does not determine the size,
+and it must accept the size it is given.
+</para>
+<para>
+<!-- .LP -->
+Before a client provides geometry management for an input method,
+it must determine if geometry management is needed.
+The input method indicates the need for geometry management 
+by setting 
+<symbol>XIMPreeditArea</symbol>
+or 
+<symbol>XIMStatusArea</symbol>
+in its 
+<structname>XIMStyles</structname>
+value returned by 
+<xref linkend='XGetIMValues' xrefstyle='select: title'/>.
+When a client has decided that it will provide geometry management
+for an input method, 
+it indicates that decision by setting the
+<symbol>XNInputStyle</symbol>
+value in the 
+<type>XIC</type>.
+</para>
+<para>
+<!-- .LP -->
+After a client has established with the input method
+that it will do geometry management,
+the client must negotiate the geometry with the input method.
+The geometry is negotiated by the following steps:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+The client suggests an area to the input method by setting the
+<symbol>XNAreaNeeded</symbol>
+value for that area.
+If the client has no constraints for the input method,
+it either will not suggest an area or will set the width and height to zero.
+Otherwise, it will set one of the values.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The client will get the <acronym>XIC</acronym> value 
+<symbol>XNAreaNeeded</symbol>.
+The input method will return its suggested size in this value.
+The input method should pay attention to any constraints suggested
+by the client.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The client sets the <acronym>XIC</acronym> value
+<symbol>XNArea</symbol>
+to inform the input method of the geometry of its window.  
+The client should try to honor the geometry requested by the input method.
+The input method must accept this geometry.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+Clients doing geometry management must be aware that setting other
+<acronym>XIC</acronym> values may affect the geometry desired by an input method.
+For example, 
+<symbol>XNFontSet</symbol>
+and
+<symbol>XNLineSpace</symbol>
+may change the geometry desired by the input method.  
+</para>
+<para>
+<!-- .LP -->
+The table of <acronym>XIC</acronym> values
+(see <link linkend="Input_Context_Values">section 13.5.6</link>)
+indicates the values that can cause the desired geometry to change
+when they are set.
+It is the responsibility of the client to renegotiate the geometry
+of the input method window when it is needed.
+</para>
+<para>
+<!-- .LP -->
+In addition,
+a geometry management callback is provided
+by which an input method can initiate a geometry change.
+</para>
+</sect3>
+<sect3 id="Event_Filtering">
+<title>Event Filtering</title>
+<!-- .XS -->
+<!-- (SN Event Filtering -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+A filtering mechanism is provided to allow input methods
+to capture X events transparently to clients.
+It is expected that toolkits (or clients) using
+<xref linkend='XmbLookupString' xrefstyle='select: title'/>
+or
+<xref linkend='XwcLookupString' xrefstyle='select: title'/>
+will call this filter at some point in the event processing mechanism
+to make sure that events needed by an input method can be filtered
+by that input method.
+</para>
+<para>
+<!-- .LP -->
+If there were no filter,
+a client could receive and discard events that are necessary
+for the proper functioning of an input method.
+The following provides a few examples of such events:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+Expose events on preedit window in local mode.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Events may be used by an input method to communicate with an input server.
+Such input server protocol-related events have to be intercepted
+if one does not want to disturb client code.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Key events can be sent to a filter before they are bound
+to translations such as those the X Toolkit Intrinsics library provides.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+Clients are expected to get the <acronym>XIC</acronym> value 
+<symbol>XNFilterEvents</symbol>
+and augment the event mask for the client window with that event mask.
+This mask may be zero.
+</para>
+</sect3>
+<sect3 id="Callbacks">
+<title>Callbacks</title>
+<!-- .XS -->
+<!-- (SN Callbacks -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+When an on-the-spot input method is implemented,
+only the client can insert or delete preedit data in place
+and possibly scroll existing text.
+This means that the echo of the keystrokes has to be achieved 
+by the client itself, tightly coupled with the input method logic.
+</para>
+<para>
+<!-- .LP -->
+When the user enters a keystroke,
+the client calls
+<xref linkend='XmbLookupString' xrefstyle='select: title'/>
+or
+<xref linkend='XwcLookupString' xrefstyle='select: title'/>.
+At this point, in the on-the-spot case,
+the echo of the keystroke in the preedit has not yet been done.
+Before returning to the client logic that handles the input characters,
+the look-up function
+must call the echoing logic to insert the new keystroke.
+If the keystrokes entered so far make up a character,
+the keystrokes entered need to be deleted,
+and the composed character will be returned.
+Hence, what happens is that, while being called by client code,
+the input method logic has to call back to the client before it returns.
+The client code, that is, a callback procedure,
+is called from the input method logic.
+</para>
+<para>
+<!-- .LP -->
+There are a number of cases where the input method logic has to
+call back the client.
+Each of those cases is associated with a well-defined callback action.
+It is possible for the client to specify, for each input context,
+what callback is to be called for each action.
+</para>
+<para>
+<!-- .LP -->
+There are also callbacks provided for feedback of status information
+and a callback to initiate a geometry request for an input method.
+</para>
+</sect3>
+<sect3 id="Visible_Position_Feedback_Masks">
+<title>Visible Position Feedback Masks</title>
+<!-- .XS -->
+<!-- (SN Visible Position Feedback Masks -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+In the on-the-spot input style, there is a problem when
+attempting to draw preedit strings that are longer than the
+available space.  Once the display area is exceeded, it is not
+clear how best to display the preedit string.
+The visible position feedback masks of
+<structname>XIMText</structname>
+help resolve this problem by allowing the input method to specify hints that
+indicate the essential portions of the preedit string.
+For example, such hints can help developers implement
+scrolling of a long preedit string within a short preedit display area.
+</para>
+</sect3>
+<sect3 id="Preedit_String_Management">
+<title>Preedit String Management</title>
+<!-- .XS -->
+<!-- (SN Preedit String Management -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+As highlighted before, the input method architecture provides
+preediting, which supports a type of preprocessor input composition.
+In this case, composition consists of interpreting a sequence
+of key events and returning a committed string via 
+<xref linkend='XmbLookupString' xrefstyle='select: title'/>
+or
+<xref linkend='XwcLookupString' xrefstyle='select: title'/>.
+This provides the basics for input methods.
+</para>
+<para>
+<!-- .LP -->
+In addition to preediting based on key events, a general framework
+is provided to give a client that desires it more advanced preediting based
+on the text within the client.  This framework is called 
+<emphasis remap='I'>string conversion</emphasis> and is provided using <acronym>XIC</acronym> values. 
+The fundamental concept of string conversion
+is to allow the input method to manipulate the client's
+text independent of any user preediting operation.
+</para>
+<para>
+<!-- .LP -->
+The need for string conversion is based on 
+language needs and input method capabilities.
+The following are some examples of string conversion:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+Transliteration conversion provides language-specific conversions
+within the input method.
+In the case of Korean input, users wish to convert a Hangul string 
+into a Hanja string while in preediting, after preediting,
+or in other situations (for example, on a selected string).
+The conversion is triggered when the user
+presses a Hangul-to-Hanja key sequence (which may be input method specific).
+Sometimes the user may want to invoke the conversion after finishing
+preediting or on a user-selected string.  
+Thus, the string to be converted is in an application buffer, not in 
+the preedit area of the input method.  The string conversion services
+allow the client to request this transliteration conversion from the 
+input method.
+There are many other transliteration conversions defined for 
+various languages, for example, Kana-to-Kanji conversion in Japanese.
+<!-- .sp -->
+The key to remember is that transliteration conversions are triggered
+at the request of the user and returned to the client 
+immediately without affecting the preedit area of the input method.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Reconversion of a previously committed string or 
+a selected string is supported by many input methods as a 
+convenience to the user.
+For example, a user tends to mistype the commit key while
+preediting.  In that case, some input methods provide a special
+key sequence to request a ``reconvert'' operation on the 
+committed string, similiar to the undo facility provided by most
+text editors.
+Another example is where the user is proofreading a document 
+that has some misconversions from preediting and wants to correct
+the misconverted text.  Such reconversion is again triggered
+by the user invoking some special action, but reconversions should
+not affect the state of the preedit area.  
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Context-sensitive conversion is required for some languages
+and input methods that need to retrieve text that surrounds the
+current spot location (cursor position) of the client's buffer.
+Such text is needed when the preediting operation depends on 
+some surrounding characters (usually preceding the spot location).
+For example, 
+in Thai language input, certain character sequences may be invalid and
+the input method may want to check whether characters constitute a
+valid word.  Input methods that do such context-dependent
+checking need to retrieve the characters surrounding the current
+cursor position to obtain complete words.
+<!-- .sp -->
+Unlike other conversions, this conversion is not explicitly 
+requested by the user.
+Input methods that provide such context-sensitive conversion 
+continuously need to request context from the client, and any change
+in the context of the spot location may affect such conversions.
+The client's context would be needed if the user moves the cursor
+and starts editing again.
+<!-- .sp -->
+For this reason, an input method supporting this type of conversion
+should take notice of when the client calls
+<xref linkend='XmbResetIC' xrefstyle='select: title'/>
+or
+<xref linkend='XwcResetIC' xrefstyle='select: title'/>,
+which is usually an indication of a context change.  
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+Context-sensitive conversions just need a copy of the client's text,
+while other conversions replace the client's text with new text
+to achieve the reconversion or transliteration.   Yet in all
+cases the result of a conversion, either immediately or via preediting,
+is returned by the
+<xref linkend='XmbLookupString' xrefstyle='select: title'/>
+and
+<xref linkend='XwcLookupString' xrefstyle='select: title'/>
+functions.
+</para>
+<para>
+<!-- .LP -->
+String conversion support is dependent on the availability of the 
+<symbol>XNStringConversion</symbol>
+or 
+<symbol>XNStringConversionCallback</symbol>
+<acronym>XIC</acronym> values.
+Because the input method may not support string conversions,
+clients have to query the availability of string conversion
+operations by checking the supported <acronym>XIC</acronym> values list by calling
+<xref linkend='XGetIMValues' xrefstyle='select: title'/>
+with the
+<symbol>XNQueryICValuesList</symbol>
+IM value.
+</para>
+<para>
+<!-- .LP -->
+The difference between these two values is whether the
+conversion is invoked by the client or the input method.  
+The 
+<symbol>XNStringConversion</symbol>
+<acronym>XIC</acronym> value is used by clients to request 
+a string conversion from the input method.  The client
+is responsible for determining which events are used 
+to trigger the string conversion and whether the string to be
+converted should be copied or deleted.  The type of conversion
+is determined by the input method; the client can only 
+pass the string to be converted.  The client is guaranteed that
+no
+<symbol>XNStringConversionCallback</symbol>
+will be issued when this value is set; thus, the client need
+only set one of these values.
+</para>
+<para>
+<!-- .LP -->
+The
+<symbol>XNStringConversionCallback</symbol>
+<acronym>XIC</acronym> value is used by the client to notify the input method that
+it will accept requests from the input method for string conversion.
+If this value is set,
+it is the input method's responsibility to determine which
+events are used to trigger the string conversion.
+When such events occur, the input method issues a call to the
+client-supplied procedure to retrieve the string to be converted.  The client's
+callback procedure is notified whether to copy or delete the string and 
+is provided with hints as to the amount of text needed.
+The
+<structname>XIMStringConversionCallbackStruct</structname>
+specifies which text should be passed back to the input method.
+</para>
+<para>
+<!-- .LP -->
+Finally, the input method may call the client's 
+<symbol>XNStringConversionCallback</symbol>
+procedure multiple times if the string returned from the callback is
+not sufficient to perform a successful conversion.   The arguments
+to the client's procedure allow the input method to define a
+position (in character units) relative to the client's cursor position 
+and the size of the text needed.  By varying the position and size of
+the desired text in subsequent callbacks, the input method can retrieve 
+additional text.
+</para>
+<para>
+<!-- .LP -->
+</para>
+</sect3>
+</sect2>
+<sect2 id="Input_Method_Management">
+<title>Input Method Management</title>
+<!-- .XS -->
+<!-- (SN Input Method Management -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The interface to input methods might appear to be simply creating
+an input method
+(<xref linkend='XOpenIM' xrefstyle='select: title'/>)
+and freeing an input method
+(<xref linkend='XCloseIM' xrefstyle='select: title'/>).
+However, input methods may 
+require complex communication with input method servers (IM servers),
+for example:
+</para>
+
+<itemizedlist>
+  <listitem>
+    <para>
+If the X server, IM server, and X clients are started asynchronously,
+some clients may attempt to connect to the IM server before it is
+fully operational, and fail.
+Therefore, some mechanism is needed to allow clients to detect when an IM 
+server has started.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+It is up to clients to decide what should be done when an IM server is 
+not available (for example, wait, or use some other IM server).
+</para>
+<para>
+<!-- .LP -->
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+Some input methods may allow the underlying IM server to be switched. 
+Such customization may be desired without restarting the entire client.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+To support management of input methods in these cases, the following 
+functions are provided:
+</para>
+<informaltable frame='none'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='1.0*'/>
+  <tbody>
+    <row>
+      <entry><xref linkend='XRegisterIMInstantiateCallback' xrefstyle='select: title'/></entry>
+      <entry>This function allows clients to register a callback procedure
+      to be called when Xlib detects that an IM server is up and available.</entry>
+    </row>
+    <row>
+      <entry><xref linkend='XOpenIM' xrefstyle='select: title'/></entry>
+      <entry>A client calls this function as a result of the callback procedure
+      being called.</entry>
+    </row>
+    <row>
+      <entry><xref linkend='XSetIMValues' xrefstyle='select: title'/>, <xref linkend='XSetICValues' xrefstyle='select: title'/></entry>
+      <entry>These functions use the <acronym>XIM</acronym> and <acronym>XIC</acronym> values,
+      <symbol>XNDestroyCallback</symbol>,
+      to allow a client 
+      to register a callback procedure to be called when Xlib detects that
+      an IM server that was associated with an opened 
+      input method is no longer available.
+      In addition, this function can be used to switch IM servers for those input 
+      methods that support such functionality.  The IM value for switching IM 
+      servers is implementation-dependent; see the description below about
+      switching IM servers.</entry>
+    </row>
+    <row>
+      <entry><xref linkend='XUnregisterIMInstantiateCallback' xrefstyle='select: title'/></entry>
+      <entry>This function removes a callback procedure registered by the client.</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+<!-- .LP -->
+Input methods that support switching of IM servers may exhibit some
+side-effects:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+The input method will ensure that any new IM server supports any of the 
+input styles being used by input contexts already associated with the
+input method.
+However, the list of supported input styles may be different.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+Geometry management requests on previously created input contexts
+may be initiated by the new IM server.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+</para>
+<sect3 id="Hot_Keys">
+<title>Hot Keys</title>
+<!-- .XS -->
+<!-- (SN Hot Keys -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Some clients need to guarantee which keys can be used to escape from the
+input method, regardless of the input method state;
+for example, the client-specific Help key or the keys to move the
+input focus.
+The HotKey mechanism allows clients 
+to specify a set of keys for this purpose.  However, the input 
+method might not allow clients to specify hot keys.
+Therefore, clients have to query support of hot keys by checking the
+supported <acronym>XIC</acronym> values list by calling
+<xref linkend='XGetIMValues' xrefstyle='select: title'/>
+with the
+<symbol>XNQueryICValuesList</symbol>
+IM value.
+When the hot keys specified conflict with the key bindings of the 
+input method, hot keys take precedence over the key bindings of the input 
+method.
+</para>
+<para>
+<!-- .LP -->
+</para>
+</sect3>
+<sect3 id="Preedit_State_Operation">
+<title>Preedit State Operation</title>
+<!-- .XS -->
+<!-- (SN Preedit State Operation -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+An input method may have several internal states, depending on its
+implementation and the locale.  However, one state that is
+independent of locale and implementation is whether the input method
+is currently performing a preediting operation.
+Xlib provides the ability for an application to manage the preedit state
+programmatically.  Two methods are provided for
+retrieving the preedit state of an input context.
+One method is to query the state by calling
+<xref linkend='XGetICValues' xrefstyle='select: title'/>
+with the
+<symbol>XNPreeditState</symbol>
+<acronym>XIC</acronym> value.
+Another method is to receive notification whenever
+the preedit state is changed.  To receive such notification,
+an application needs to register a callback by calling
+<xref linkend='XSetICValues' xrefstyle='select: title'/>
+with the
+<symbol>XNPreeditStateNotifyCallback</symbol>
+<acronym>XIC</acronym> value. 
+In order to change the preedit state programmatically, an application 
+needs to call 
+<xref linkend='XSetICValues' xrefstyle='select: title'/>
+with
+<symbol>XNPreeditState</symbol>.
+</para>
+<para>
+<!-- .LP -->
+Availability of the preedit state is input method dependent.  The input 
+method may not provide the ability to set the state or to
+retrieve the state programmatically.  Therefore, clients have to 
+query availability of preedit state operations by checking the 
+supported <acronym>XIC</acronym> values list by calling
+<xref linkend='XGetIMValues' xrefstyle='select: title'/>
+with the
+<symbol>XNQueryICValuesList</symbol>
+IM value.
+</para>
+</sect3>
+</sect2>
+<sect2 id="Input_Method_Functions">
+<title>Input Method Functions</title>
+<!-- .XS -->
+<!-- (SN Input Method Functions -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To open a connection, use
+<xref linkend='XOpenIM' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XOpenIM</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XOpenIM'>
+<funcprototype>
+  <funcdef>XIM <function>XOpenIM</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XrmDatabase<parameter> db</parameter></paramdef>
+  <paramdef>char<parameter> *res_name</parameter></paramdef>
+  <paramdef>char<parameter> *res_class</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>db</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a pointer to the resource database.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>res_name</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the full resource name of the application.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>res_class</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the full class name of the application.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XOpenIM' xrefstyle='select: title'/>
+function opens an input method, 
+matching the current locale and modifiers specification.
+Current locale and modifiers are bound to the input method at opening time.
+The locale associated with an input method cannot be changed dynamically.
+This implies that the strings returned by
+<xref linkend='XmbLookupString' xrefstyle='select: title'/>
+or
+<xref linkend='XwcLookupString' xrefstyle='select: title'/>,
+for any input context affiliated with a given input method,
+will be encoded in the locale current at the time the input method is opened.
+</para>
+<para>
+<!-- .LP -->
+The specific input method to which this call will be routed
+is identified on the basis of the current locale. 
+<xref linkend='XOpenIM' xrefstyle='select: title'/>
+will identify a default input method corresponding to the
+current locale.
+That default can be modified using 
+<xref linkend='XSetLocaleModifiers' xrefstyle='select: title'/>
+for the input method modifier.
+</para>
+<para>
+<!-- .LP -->
+The db argument is the resource database to be used by the input method
+for looking up resources that are private to the input method.
+It is not intended that this database be used to look
+up values that can be set as IC values in an input context.
+If db is NULL,
+no database is passed to the input method.
+</para>
+<para>
+<!-- .LP -->
+The res_name and res_class arguments specify the resource name 
+and class of the application. 
+They are intended to be used as prefixes by the input method
+when looking up resources that are common to all input contexts
+that may be created for this input method.
+The characters used for resource names and classes must be in the
+X Portable Character Set.
+The resources looked up are not fully specified
+if res_name or res_class is NULL.
+</para>
+<para>
+<!-- .LP -->
+The res_name and res_class arguments are not assumed to exist beyond
+the call to
+<xref linkend='XOpenIM' xrefstyle='select: title'/>.
+The specified resource database is assumed to exist for the lifetime
+of the input method.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XOpenIM' xrefstyle='select: title'/>
+returns NULL if no input method could be opened.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To close a connection, use
+<xref linkend='XCloseIM' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XCloseIM</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XCloseIM'>
+<funcprototype>
+  <funcdef>Status <function>XCloseIM</function></funcdef>
+  <paramdef>XIM<parameter> im</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>im</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the input method.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XCloseIM' xrefstyle='select: title'/>
+function closes the specified input method.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set input method attributes, use
+<xref linkend='XSetIMValues' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetIMValues</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetIMValues'>
+<funcprototype>
+  <funcdef>char *<function>XSetIMValues</function></funcdef>
+  <paramdef>XIM<parameter> im</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>im</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the input method.
+<!-- .ds Al \ to set <acronym>XIM</acronym> values -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      ...
+    </term>
+    <listitem>
+      <para>
+Specifies the variable-length argument list(Al.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetIMValues' xrefstyle='select: title'/>
+function presents a variable argument list programming interface
+for setting attributes of the specified input method.
+It returns NULL if it succeeds;
+otherwise,
+it returns the name of the first argument that could not be set.
+Xlib does not attempt to set arguments from the supplied list that
+follow the failed argument;
+all arguments in the list preceding the failed argument have been set
+correctly.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To query an input method, use 
+<xref linkend='XGetIMValues' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetIMValues</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetIMValues'>
+<funcprototype>
+  <funcdef>char *<function>XGetIMValues</function></funcdef>
+  <paramdef>XIM<parameter> im</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>im</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the input method.
+<!-- .ds Al \ to get XIM values -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      ...
+    </term>
+    <listitem>
+      <para>
+Specifies the variable length argument list(Al.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetIMValues' xrefstyle='select: title'/>
+function presents a variable argument list programming interface
+for querying properties or features of the specified input method.
+This function returns NULL if it succeeds;
+otherwise,
+it returns the name of the first argument that could not be obtained.
+</para>
+<para>
+<!-- .LP -->
+Each <acronym>XIM</acronym> value argument (following a name) must point to
+a location where the <acronym>XIM</acronym> value is to be stored.
+That is, if the <acronym>XIM</acronym> value is of type T,
+the argument must be of type T*.
+If T itself is a pointer type,
+then
+<xref linkend='XGetIMValues' xrefstyle='select: title'/>
+allocates memory to store the actual data,
+and the client is responsible for freeing this data by calling
+<xref linkend='XFree' xrefstyle='select: title'/>
+with the returned pointer.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain the display associated with an input method, use
+<xref linkend='XDisplayOfIM' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDisplayOfIM</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDisplayOfIM'>
+<funcprototype>
+  <funcdef>Display *<function>XDisplayOfIM</function></funcdef>
+  <paramdef>XIM<parameter> im</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>im</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the input method.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XDisplayOfIM' xrefstyle='select: title'/>
+function returns the display associated with the specified input method.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To get the locale associated with an input method, use
+<xref linkend='XLocaleOfIM' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XLocaleOfIM</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XLocaleOfIM'>
+<funcprototype>
+  <funcdef>char *<function>XLocaleOfIM</function></funcdef>
+  <paramdef>XIM<parameter> im</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>im</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the input method.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XLocaleOfIM' xrefstyle='select: title'/>
+function returns the locale associated with the specified input method.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To register an input method instantiate callback, use
+<xref linkend='XRegisterIMInstantiateCallback' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XRegisterIMInstantiateCallback</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XRegisterIMInstantiateCallback'>
+<funcprototype>
+  <funcdef>Bool <function>XRegisterIMInstantiateCallback</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XrmDatabase<parameter> db</parameter></paramdef>
+  <paramdef>char<parameter> *res_name</parameter></paramdef>
+  <paramdef>char<parameter> *res_class</parameter></paramdef>
+  <paramdef>XIMProc<parameter> callback</parameter></paramdef>
+  <paramdef>XPointer<parameter> *client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>db</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a pointer to the resource database.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>res_name</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the full resource name of the application.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>res_class</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the full class name of the application.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>callback</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a pointer to the input method instantiate callback.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>client_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the additional client data.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XRegisterIMInstantiateCallback' xrefstyle='select: title'/>
+function registers a callback to be invoked whenever a new input method
+becomes available for the specified display that matches the current
+locale and modifiers.
+</para>
+<para>
+<!-- .LP -->
+The function returns 
+<symbol>True</symbol>
+ if it succeeds; otherwise, it returns 
+<symbol>False</symbol>.
+</para>
+<para>
+<!-- .LP -->
+The generic prototype is as follows:
+</para>
+<indexterm significance="preferred"><primary>IMInstantiateCallback</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='IMInstantiateCallback'>
+<funcprototype>
+  <funcdef>void <function><replaceable>IMInstantiateCallback</replaceable></function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XPointer<parameter> client_data</parameter></paramdef>
+  <paramdef>XPointer<parameter> call_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>client_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the additional client data.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>call_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Not used for this callback and always passed as NULL.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+To unregister an input method instantiation callback, use
+<xref linkend='XUnregisterIMInstantiateCallback' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XUnregisterIMInstantiateCallback</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XUnregisterIMInstantiateCallback'>
+<funcprototype>
+  <funcdef>Bool <function>XUnregisterIMInstantiateCallback</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XrmDatabase<parameter> db</parameter></paramdef>
+  <paramdef>char<parameter> *res_name</parameter></paramdef>
+  <paramdef>char<parameter> *res_class</parameter></paramdef>
+  <paramdef>XIMProc<parameter> callback</parameter></paramdef>
+  <paramdef>XPointer<parameter> *client_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>db</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a pointer to the resource database.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>res_name</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the full resource name of the application.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>res_class</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the full class name of the application.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>callback</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a pointer to the input method instantiate callback.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>client_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the additional client data.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XUnregisterIMInstantiateCallback' xrefstyle='select: title'/>
+function removes an input method instantiation callback previously
+registered.
+The function returns
+<symbol>True</symbol>
+if it succeeds; otherwise, it returns 
+<symbol>False</symbol>.
+</para>
+</sect2>
+<sect2 id="Input_Method_Values">
+<title>Input Method Values</title>
+<!-- .XS -->
+<!-- (SN Input Method Values -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The following table describes how <acronym>XIM</acronym> values are interpreted
+by an input method.
+The first column lists the <acronym>XIM</acronym> values.
+The second column indicates how each of the <acronym>XIM</acronym> values 
+are treated by that input style.
+</para>
+<para>
+<!-- .LP -->
+</para>
+<para>
+<!-- .LP -->
+The following keys apply to this table.
+</para>
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='4.0*'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Key</entry>
+      <entry>Explanation</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>D</entry>
+      <entry>This value may be set using
+      <xref linkend='XSetIMValues' xrefstyle='select: title'/>.
+      If it is not set,
+      a default is provided.</entry>
+    </row>
+    <row>
+      <entry>S</entry>
+      <entry>This value may be set using <xref linkend='XSetIMValues' xrefstyle='select: title'/>.</entry>
+    </row>
+    <row>
+      <entry>G</entry>
+      <entry>This value may be read using <xref linkend='XGetIMValues' xrefstyle='select: title'/>.</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para></para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='1.0*'/>
+  <thead>
+    <row rowsep='1'>
+      <entry><acronym>XIM</acronym> Value</entry>
+      <entry>Key</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry><symbol>XNQueryInputStyle</symbol></entry>
+      <entry>G</entry>
+    </row>
+    <row>
+      <entry><symbol>XNResourceName</symbol></entry>
+      <entry>D-S-G</entry>
+    </row>
+    <row>
+      <entry><symbol>XNResourceClass</symbol></entry>
+      <entry>D-S-G</entry>
+    </row>
+    <row>
+      <entry><symbol>XNDestroyCallback</symbol></entry>
+      <entry>D-S-G</entry>
+    </row>
+    <row>
+      <entry><symbol>XNQueryIMValuesList</symbol></entry>
+      <entry>G</entry>
+    </row>
+    <row>
+      <entry><symbol>XNQueryICValuesList</symbol></entry>
+      <entry>G</entry>
+    </row>
+    <row>
+      <entry><symbol>XNVisiblePosition</symbol></entry>
+      <entry>G</entry>
+    </row>
+    <row>
+      <entry><symbol>XNR6PreeditCallback</symbol></entry>
+      <entry>D-S-G</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+<!-- .LP -->
+<symbol>XNR6PreeditCallback</symbol>
+is obsolete and its use is not recommended
+(see <link linkend="Preedit_Callback_Behavior">section 13.5.4.6</link>).
+</para>
+
+<sect3 id="Query_Input_Style">
+<title>Query Input Style</title>
+<!-- .XS -->
+<!-- (SN Query Input Style -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+A client should always query the input method to determine which input 
+styles are supported.
+The client should then find an input style it is capable of supporting.
+</para>
+<para>
+<!-- .LP -->
+If the client cannot find an input style that it can support,
+it should negotiate with the user the continuation of the program
+(exit, choose another input method, and so on).
+</para>
+<para>
+<!-- .LP -->
+The argument value must be a pointer to a location
+where the returned value will be stored.
+The returned value is a pointer to a structure of type
+<structname>XIMStyles</structname>.
+Clients are responsible for freeing the 
+<structname>XIMStyles</structname>
+structure.
+To do so, use
+<xref linkend='XFree' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+The
+<structname>XIMStyles</structname>
+structure is defined as follows:
+</para>
+
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XIMStyle</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMPreeditArea</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMPreeditCallbacks</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMPreeditPosition</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMPreeditNothing</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMPreeditNone</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMStatusArea</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMStatusCallbacks</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMStatusNothing</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMStatusNone</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMStyles</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+typedef unsigned long XIMStyle;
+
+
+#define     XIMPreeditArea             0x0001L
+#define     XIMPreeditCallbacks        0x0002L
+#define     XIMPreeditPosition         0x0004L
+#define     XIMPreeditNothing          0x0008L
+#define     XIMPreeditNone             0x0010L
+
+#define     XIMStatusArea              0x0100L
+#define     XIMStatusCallbacks         0x0200L
+#define     XIMStatusNothing           0x0400L
+#define     XIMStatusNone              0x0800L
+
+typedef struct {
+      unsigned short count_styles;
+      XIMStyle * supported_styles;
+} XIMStyles;
+
+</literallayout>
+
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+An 
+<structname>XIMStyles</structname>
+structure contains the number of input styles supported
+in its count_styles field.
+This is also the size of the supported_styles array.
+</para>
+<para>
+<!-- .LP -->
+The supported styles is a list of bitmask combinations,
+which indicate the combination of styles for each of the areas supported.
+These areas are described later.
+Each element in the list should select one of the bitmask values for
+each area.
+The list describes the complete set of combinations supported.
+Only these combinations are supported by the input method.
+</para>
+<para>
+<!-- .LP -->
+The preedit category defines what type of support is provided
+by the input method for preedit information.
+</para>
+<indexterm significance="preferred"><primary>XIMPreeditArea</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMPreeditPosition</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMPreeditCallbacks</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMPreeditNothing</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMPreeditNone</primary></indexterm>
+<informaltable frame='none'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='2.0*'/>
+  <tbody>
+    <row>
+      <entry><symbol>XIMPreeditArea</symbol></entry>
+      <entry>If chosen,
+      the input method would require the client to provide some area values
+      for it to do its preediting.
+      Refer to <acronym>XIC</acronym> values 
+      <symbol>XNArea</symbol>
+      and
+      <symbol>XNAreaNeeded</symbol>.</entry>
+    </row>
+    <row>
+      <entry><symbol>XIMPreeditPosition</symbol></entry>
+      <entry>If chosen,
+      the input method would require the client to provide positional values. 
+      Refer to <acronym>XIC</acronym> values 
+      <symbol>XNSpotLocation</symbol>
+      and
+      <symbol>XNFocusWindow</symbol>.</entry>
+    </row>
+    <row>
+      <entry><symbol>XIMPreeditCallbacks</symbol></entry>
+      <entry>If chosen,
+      the input method would require the client to define the set of preedit callbacks.
+      Refer to <acronym>XIC</acronym> values 
+      <symbol>XNPreeditStartCallback</symbol>,
+      <symbol>XNPreeditDoneCallback</symbol>,
+      <symbol>XNPreeditDrawCallback</symbol>,
+      and
+      <symbol>XNPreeditCaretCallback</symbol>.</entry>
+    </row>
+    <row>
+      <entry><symbol>XIMPreeditNothing</symbol></entry>
+      <entry>If chosen, the input method can function without any preedit values.</entry>
+    </row>
+    <row>
+      <entry><symbol>XIMPreeditNone</symbol></entry>
+      <entry>The input method does not provide any preedit feedback.
+      Any preedit value is ignored.
+      This style is mutually exclusive with the other preedit styles.</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+<!-- .LP -->
+The status category defines what type of support is provided
+by the input method for status information.
+</para>
+<indexterm significance="preferred"><primary>XIMStatusArea</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMStatusCallbacks</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMStatusNothing</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMStatusNone</primary></indexterm>
+<informaltable frame='none'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='2.0*'/>
+  <tbody>
+    <row>
+      <entry><symbol>XIMStatusArea</symbol></entry>
+      <entry>The input method requires the client to provide
+      some area values for it to do its status feedback.
+      See
+      <symbol>XNArea</symbol>
+      and
+      <symbol>XNAreaNeeded</symbol>.</entry>
+    </row>
+    <row>
+      <entry><symbol>XIMStatusCallbacks</symbol></entry>
+      <entry>The input method requires the client to define the set of status callbacks,
+      <symbol>XNStatusStartCallback</symbol>,
+      <symbol>XNStatusDoneCallback</symbol>,
+      and
+      <symbol>XNStatusDrawCallback</symbol>.</entry>
+    </row>
+    <row>
+      <entry><symbol>XIMStatusNothing</symbol></entry>
+      <entry>The input method can function without any status values.</entry>
+    </row>
+    <row>
+      <entry><symbol>XIMStatusNone</symbol></entry>
+      <entry>The input method does not provide any status feedback.
+      If chosen, any status value is ignored.
+      This style is mutually exclusive with the other status styles.</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+</sect3>
+<sect3 id="Resource_Name_and_Class_c">
+<title>Resource Name and Class</title>
+<!-- .XS -->
+<!-- (SN Resource Name and Class -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The
+<symbol>XNResourceName</symbol>
+and
+<symbol>XNResourceClass</symbol>
+arguments are strings that specify the full name and class
+used by the input method.
+These values should be used as prefixes for the name and class
+when looking up resources that may vary according to the input method.
+If these values are not set,
+the resources will not be fully specified.
+</para>
+<para>
+<!-- .LP -->
+It is not intended that values that can be set as <acronym>XIM</acronym> values be
+set as resources.
+</para>
+<para>
+<!-- .LP -->
+</para>
+</sect3>
+<sect3 id="Destroy_Callback">
+<title>Destroy Callback</title>
+<!-- .XS -->
+<!-- (SN Destroy Callback -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The 
+<symbol>XNDestroyCallback</symbol>
+argument is a pointer to a structure of type
+<structname>XIMCallback</structname>.
+<symbol>XNDestroyCallback</symbol>
+is triggered when an input method stops its service for any reason. 
+After the callback is invoked, the input method is closed and the
+associated input context(s) are destroyed by Xlib.
+Therefore, the client should not call
+<xref linkend='XCloseIM' xrefstyle='select: title'/>
+or
+<xref linkend='XDestroyIC' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+The generic prototype of this callback function is as follows:
+</para>
+<indexterm significance="preferred"><primary>DestroyCallback</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='DestroyCallback'>
+<funcprototype>
+  <funcdef>void <function><replaceable>DestroyCallback</replaceable></function></funcdef>
+  <paramdef>XIM<parameter> im</parameter></paramdef>
+  <paramdef>XPointer<parameter> client_data</parameter></paramdef>
+  <paramdef>XPointer<parameter> call_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>im</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the input method.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>client_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the additional client data.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>call_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Not used for this callback and always passed as NULL.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+A DestroyCallback is always called with a NULL call_data argument.
+</para>
+<para>
+<!-- .LP -->
+</para>
+</sect3>
+<sect3 id='Query_IMIC_Values_List'>
+<title>Query IM/IC Values List</title>
+<!-- .XS -->
+<!-- (SN Query IM/IC Values List -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<symbol>XNQueryIMValuesList</symbol>
+and
+<symbol>XNQueryICValuesList</symbol>
+are used to query about <acronym>XIM</acronym> and <acronym>XIC</acronym> values supported by the input method.
+</para>
+<para>
+<!-- .LP -->
+The argument value must be a pointer to a location where the returned
+value will be stored.  The returned value is a pointer to a structure
+of type
+<structname>XIMValuesList</structname>.
+Clients are responsible for freeing the 
+<structname>XIMValuesList</structname>
+structure.
+To do so, use
+<xref linkend='XFree' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+The
+<structname>XIMValuesList</structname>
+structure is defined as follows:
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef struct {
+     unsigned short count_values;
+     char **supported_values;
+} XIMValuesList;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+</para>
+</sect3>
+<sect3 id="Visible_Position">
+<title>Visible Position</title>
+<!-- .XS -->
+<!-- (SN Visible Position -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The 
+<symbol>XNVisiblePosition</symbol>
+argument indicates whether the visible position masks of 
+<type>XIMFeedback</type>
+in
+<structname>XIMText</structname>
+are available.
+</para>
+<para>
+<!-- .LP -->
+The argument value must be a pointer to a location where the returned
+value will be stored.  The returned value is of type
+<type>Bool</type>.
+If the returned value is
+<symbol>True</symbol>,
+the input method uses the visible position masks of
+<type>XIMFeedback</type>
+in
+<structname>XIMText</structname>;
+otherwise, the input method does not use the masks.
+</para>
+<para>
+<!-- .LP -->
+Because this <acronym>XIM</acronym> value is optional, a client should call
+<xref linkend='XGetIMValues' xrefstyle='select: title'/>
+with argument
+<symbol>XNQueryIMValuesList</symbol>
+before using this argument.
+If the 
+<symbol>XNVisiblePosition</symbol>
+does not exist in the IM values list returned from 
+<symbol>XNQueryIMValuesList</symbol>,
+the visible position masks of
+<type>XIMFeedback</type>
+in
+<structname>XIMText</structname>
+are not used to indicate the visible position.
+</para>
+<para>
+<!-- .LP -->
+</para>
+</sect3>
+<sect3 id="Preedit_Callback_Behavior">
+<title>Preedit Callback Behavior</title>
+<!-- .XS -->
+<!-- (SN Preedit Callback Behavior -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The
+<symbol>XNR6PreeditCallback</symbol>
+argument originally included in the X11R6 specification has been
+deprecated.\(dg
+<!-- .\" If XNR6PreeditCallbackBehavior is not deprecated, then its type -->
+<!-- .\" should be changed from *Bool to Bool. -->
+<!-- .FS \(dg -->
+During formulation of the X11R6 specification, the behavior of
+the R6 PreeditDrawCallbacks was going to differ significantly from
+that of the R5 callbacks.
+Late changes to the specification converged the R5 and R6 behaviors,
+eliminating the need for
+<symbol>XNR6PreeditCallback</symbol>.
+Unfortunately, this argument was not removed from the R6 specification
+before it was published.
+<!-- .FE -->
+</para>
+<para>
+<!-- .LP -->
+The 
+<symbol>XNR6PreeditCallback</symbol>
+argument indicates whether the behavior of preedit callbacks regarding
+<structname>XIMPreeditDrawCallbackStruct</structname>
+values follows Release 5 or Release 6 semantics.
+</para>
+<para>
+<!-- .LP -->
+The value is of type
+<type>Bool</type>.
+When querying for
+<symbol>XNR6PreeditCallback</symbol>,
+if the returned value is
+<symbol>True</symbol>,
+the input method uses the Release 6 behavior;
+otherwise, it uses the Release 5 behavior.
+The default value is
+<symbol>False</symbol>.
+In order to use Release 6 semantics, the value of
+<symbol>XNR6PreeditCallback</symbol>
+must be set to
+<symbol>True</symbol>.
+</para>
+<para>
+<!-- .LP -->
+Because this <acronym>XIM</acronym> value is optional, a client should call
+<xref linkend='XGetIMValues' xrefstyle='select: title'/>
+with argument
+<symbol>XNQueryIMValuesList</symbol>
+before using this argument.
+If the
+<symbol>XNR6PreeditCallback</symbol>
+does not exist in the IM values list returned from
+<symbol>XNQueryIMValuesList</symbol>,
+the PreeditCallback behavior is Release 5 semantics.
+</para>
+<para>
+<!-- .LP -->
+</para>
+</sect3>
+</sect2>
+<sect2 id="Input_Context_Functions">
+<title>Input Context Functions</title>
+<!-- .XS -->
+<!-- (SN Input Context Functions -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+An input context is an abstraction that is used to contain both the data
+required (if any) by an input method and the information required
+to display that data.
+There may be multiple input contexts for one input method.
+The programming interfaces for creating, reading, or modifying
+an input context use a variable argument list.
+The name elements of the argument lists are referred to as <acronym>XIC</acronym> values.
+It is intended that input methods be controlled by these <acronym>XIC</acronym> values.
+As new <acronym>XIC</acronym> values are created,
+they should be registered with the X Consortium.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To create an input context, use
+<xref linkend='XCreateIC' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XCreateIC</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XCreateIC'>
+<funcprototype>
+  <funcdef>XIC <function>XCreateIC</function></funcdef>
+  <paramdef>XIM<parameter> im</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>im</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the input method.
+<!-- .ds Al \ to set <acronym>XIC</acronym> values -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      ...
+    </term>
+    <listitem>
+      <para>
+Specifies the variable length argument list(Al.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XCreateIC' xrefstyle='select: title'/>
+function creates a context within the specified input method.
+</para>
+<para>
+<!-- .LP -->
+Some of the arguments are mandatory at creation time, and
+the input context will not be created if those arguments are not provided.
+The mandatory arguments are the input style and the set of text callbacks
+(if the input style selected requires callbacks).
+All other input context values can be set later.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XCreateIC' xrefstyle='select: title'/>
+returns a NULL value if no input context could be created.
+A NULL value could be returned for any of the following reasons:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+A required argument was not set.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A read-only argument was set (for example,
+<symbol>XNFilterEvents</symbol>).
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The argument name is not recognized.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The input method encountered an input method implementation-dependent error.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+<xref linkend='XCreateIC' xrefstyle='select: title'/>
+can generate
+<errorname>BadAtom</errorname>,
+<errorname>BadColor</errorname>,
+<errorname>BadPixmap</errorname>,
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To destroy an input context, use
+<xref linkend='XDestroyIC' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDestroyIC</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDestroyIC'>
+<funcprototype>
+  <funcdef>void <function>XDestroyIC</function></funcdef>
+  <paramdef>XIC<parameter> ic</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ic</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the input context.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<xref linkend='XDestroyIC' xrefstyle='select: title'/>
+destroys the specified input context.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To communicate to and synchronize with input method
+for any changes in keyboard focus from the client side,
+use 
+<xref linkend='XSetICFocus' xrefstyle='select: title'/>
+and
+<xref linkend='XUnsetICFocus' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetICFocus</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetICFocus'>
+<funcprototype>
+  <funcdef>void <function>XSetICFocus</function></funcdef>
+  <paramdef>XIC<parameter> ic</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ic</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the input context.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetICFocus' xrefstyle='select: title'/>
+function allows a client to notify an input method that the focus window
+attached to the specified input context has received keyboard focus.
+The input method should take action to provide appropriate feedback.
+Complete feedback specification is a matter of user interface policy.
+</para>
+<para>
+<!-- .LP -->
+Calling
+<xref linkend='XSetICFocus' xrefstyle='select: title'/>
+does not affect the focus window value.
+</para>
+<indexterm significance="preferred"><primary>XUnsetICFocus</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XUnsetICFocus'>
+<funcprototype>
+  <funcdef>void <function>XUnsetICFocus</function></funcdef>
+  <paramdef>XIC<parameter> ic</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ic</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the input context.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XUnsetICFocus' xrefstyle='select: title'/>
+function allows a client to notify an input method that the specified input context
+has lost the keyboard focus and that no more input is expected on the focus window
+attached to that input context.
+The input method should take action to provide appropriate feedback.
+Complete feedback specification is a matter of user interface policy.
+</para>
+<para>
+<!-- .LP -->
+Calling
+<xref linkend='XUnsetICFocus' xrefstyle='select: title'/>
+does not affect the focus window value;
+the client may still receive 
+events from the input method that are directed to the focus window.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To reset the state of an input context to its initial state, use
+<xref linkend='XmbResetIC' xrefstyle='select: title'/>
+or
+<xref linkend='XwcResetIC' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XmbResetIC</primary></indexterm>
+<indexterm significance="preferred"><primary>XwcResetIC</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XmbResetIC'>
+<funcprototype>
+  <funcdef>char *<function>XmbResetIC</function></funcdef>
+  <paramdef>XIC<parameter> ic</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<funcsynopsis id='XwcResetIC'>
+<funcprototype>
+  <funcdef>wchar_t *<function>XwcResetIC</function></funcdef>
+  <paramdef>XIC<parameter> ic</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ic</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the input context.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+When
+<symbol>XNResetState</symbol>
+is set to
+<symbol>XIMInitialState</symbol>,
+<xref linkend='XmbResetIC' xrefstyle='select: title'/>
+and
+<xref linkend='XwcResetIC' xrefstyle='select: title'/>
+reset an input context to its initial state;
+when
+<symbol>XNResetState</symbol>
+is set to
+<symbol>XIMPreserveState</symbol>,
+the current input context state is preserved.
+In both cases, any input pending on that context is deleted.
+The input method is required to clear the preedit area, if any,
+and update the status accordingly.
+Calling 
+<xref linkend='XmbResetIC' xrefstyle='select: title'/>
+or
+<xref linkend='XwcResetIC' xrefstyle='select: title'/>
+does not change the focus.
+</para>
+<para>
+<!-- .LP -->
+The return value of
+<xref linkend='XmbResetIC' xrefstyle='select: title'/>
+is its current preedit string as a multibyte string.
+If there is any preedit text drawn or visible to the user,
+then these procedures must return a non-NULL string.
+If there is no visible preedit text, 
+then it is input method implementation-dependent 
+whether these procedures return a non-NULL string or NULL.
+</para>
+<para>
+<!-- .LP -->
+The client should free the returned string by calling
+<xref linkend='XFree' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To get the input method associated with an input context, use
+<xref linkend='XIMOfIC' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XIMOfIC</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XIMOfIC'>
+<funcprototype>
+  <funcdef>XIM <function>XIMOfIC</function></funcdef>
+  <paramdef>XIC<parameter> ic</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ic</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the input context.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XIMOfIC' xrefstyle='select: title'/>
+function returns the input method associated with the specified input context.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+Xlib provides two functions for setting and reading <acronym>XIC</acronym> values, respectively,
+<xref linkend='XSetICValues' xrefstyle='select: title'/>
+and
+<xref linkend='XGetICValues' xrefstyle='select: title'/>.
+Both functions have a variable-length argument list.
+In that argument list, any <acronym>XIC</acronym> value's name must be denoted
+with a character string using the X Portable Character Set.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set <acronym>XIC</acronym> values, use
+<xref linkend='XSetICValues' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetICValues</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetICValues'>
+<funcprototype>
+  <funcdef>char *<function>XSetICValues</function></funcdef>
+  <paramdef>XIC<parameter> ic</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ic</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the input context.
+<!-- .ds Al \ to set <acronym>XIC</acronym> values -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      ...
+    </term>
+    <listitem>
+      <para>
+Specifies the variable length argument list(Al.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetICValues' xrefstyle='select: title'/>
+function returns NULL if no error occurred; 
+otherwise,
+it returns the name of the first argument that could not be set.
+An argument might not be set for any of the following reasons:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+The argument is read-only (for example,
+<symbol>XNFilterEvents</symbol>).
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The argument name is not recognized.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+An implementation-dependent error occurs.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+Each value to be set must be an appropriate datum,
+matching the data type imposed by the semantics of the argument.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetICValues' xrefstyle='select: title'/>
+can generate
+<errorname>BadAtom</errorname>,
+<errorname>BadColor</errorname>,
+<errorname>BadCursor</errorname>,
+<errorname>BadPixmap</errorname>,
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain <acronym>XIC</acronym> values, use
+<xref linkend='XGetICValues' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetICValues</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetICValues'>
+<funcprototype>
+  <funcdef>char *<function>XGetICValues</function></funcdef>
+  <paramdef>XIC<parameter> ic</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ic</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the input context.
+<!-- .ds Al \ to get XIC values -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      ...
+    </term>
+    <listitem>
+      <para>
+Specifies the variable length argument list(Al.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetICValues' xrefstyle='select: title'/>
+function returns NULL if no error occurred; otherwise,
+it returns the name of the first argument that could not be obtained.
+An argument could not be obtained for any of the following reasons:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+The argument name is not recognized.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The input method encountered an implementation-dependent error.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+Each IC attribute value argument (following a name) must point to
+a location where the IC value is to be stored.
+That is, if the IC value is of type T,
+the argument must be of type T*.
+If T itself is a pointer type,
+then
+<xref linkend='XGetICValues' xrefstyle='select: title'/>
+allocates memory to store the actual data,
+and the client is responsible for freeing this data by calling
+<xref linkend='XFree' xrefstyle='select: title'/>
+with the returned pointer.
+The exception to this rule is for an IC value of type
+<type>XVaNestedList</type>
+(for preedit and status attributes).
+In this case,  the argument must also be of type
+<type>XVaNestedList</type>.
+Then, the rule of changing type T to T* and freeing the allocated data
+applies to each element of the nested list.
+</para>
+</sect2>
+<sect2 id="Input_Context_Values">
+<title>Input Context Values</title>
+<!-- .XS -->
+<!-- (SN Input Context Values -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The following tables describe how <acronym>XIC</acronym> values are interpreted
+by an input method depending on the input style chosen by the 
+user.
+</para>
+<para>
+<!-- .LP -->
+The first column lists the <acronym>XIC</acronym> values.
+The second column indicates which values are involved in affecting,
+negotiating, and setting the geometry of the input method windows.
+The subentries under the third column indicate the different
+input styles that are supported.
+Each of these columns indicates how each of the <acronym>XIC</acronym> values 
+are treated by that input style.
+</para>
+<para>
+<!-- .LP -->
+The following keys apply to these tables.
+</para>
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='4.0*'/>
+  <thead>
+    <row rowsep='1'>
+      <entry align='left'>Key</entry>
+      <entry align='left'>Explanation</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>C</entry>
+      <entry>This value must be set with <xref linkend='XCreateIC' xrefstyle='select: title'/>.</entry>
+    </row>
+    <row>
+      <entry>D</entry>
+      <entry>This value may be set using 
+      <xref linkend='XCreateIC' xrefstyle='select: title'/>.>
+      If it is not set,>
+      a default is provided.</entry>
+    </row>
+    <row>
+      <entry>G</entry>
+      <entry>This value may be read using 
+      <xref linkend='XGetICValues' xrefstyle='select: title'/>.</entry>
+    </row>
+    <row>
+      <entry>GN</entry>
+      <entry>This value may cause geometry negotiation when its value is set by means of
+      <xref linkend='XCreateIC' xrefstyle='select: title'/>
+      or
+      <xref linkend='XSetICValues' xrefstyle='select: title'/>.</entry>
+    </row>
+    <row>
+      <entry>GR</entry>
+      <entry>This value will be the response of the input method when any 
+      GN value is changed.</entry>
+    </row>
+    <row>
+      <entry>GS</entry>
+      <entry>This value will cause the geometry of the input method window to be set.</entry>
+    </row>
+    <row>
+      <entry>O</entry>
+      <entry>This value must be set once and only once.
+      It need not be set at create time.</entry>
+    </row>
+    <row>
+      <entry>S</entry>
+      <entry>This value may be set with
+      <xref linkend='XSetICValues' xrefstyle='select: title'/>.</entry>
+    </row>
+    <row>
+      <entry>Ignored</entry>
+      <entry>This value is ignored by the input method for the given input style.</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para></para>
+
+<!-- .LP -->
+<informaltable frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='7' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='1.0*'/>
+  <colspec colname='c3' colwidth='1.0*'/>
+  <colspec colname='c4' colwidth='1.0*'/>
+  <colspec colname='c5' colwidth='1.0*'/>
+  <colspec colname='c6' colwidth='1.0*'/>
+  <colspec colname='c7' colwidth='1.0*'/>
+  <thead>
+    <row rowsep='1'>
+      <entry><acronym>XIC</acronym> Value</entry>
+      <entry>Geometry Mangement</entry>
+      <entry>Preedit Callback</entry>
+      <entry>Preedit Position</entry>
+      <entry>Input Style Preedit Area</entry>
+      <entry>Preedit Nothing</entry>
+      <entry>Preedit None</entry>
+    </row>
+    </thead>
+  <tbody>
+    <row>
+      <entry>Input Style</entry>
+      <entry></entry>
+      <entry>C-G</entry>
+      <entry>C-G</entry>
+      <entry>C-G</entry>
+      <entry>C-G</entry>
+      <entry>C-G</entry>
+    </row>
+    <row>
+      <entry>Client Window</entry>
+      <entry></entry>
+      <entry>O-G</entry>
+      <entry>O-G</entry>
+      <entry>O-G</entry>
+      <entry>O-G</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Focus Window</entry>
+      <entry>GN</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Resource Name</entry>
+      <entry></entry>
+      <entry>Ignored</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Resource Class</entry>
+      <entry></entry>
+      <entry>Ignored</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Geometry Callback</entry>
+      <entry></entry>
+      <entry>Ignored</entry>
+      <entry>Ignored</entry>
+      <entry>D-S-G</entry>
+      <entry>Ignored</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Filter Events</entry>
+      <entry></entry>
+      <entry>G</entry>
+      <entry>G</entry>
+      <entry>G</entry>
+      <entry>G</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Destroy Callback</entry>
+      <entry></entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+    </row>
+    <row>
+      <entry>String Conversion Callback</entry>
+      <entry></entry>
+      <entry>S-G</entry>
+      <entry>S-G</entry>
+      <entry>S-G</entry>
+      <entry>S-G</entry>
+      <entry>S-G</entry>
+    </row>
+    <row>
+      <entry>String Conversion</entry>
+      <entry></entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+    </row>
+    <row>
+      <entry>Reset State</entry>
+      <entry></entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>HotKey</entry>
+      <entry></entry>
+      <entry>S-G</entry>
+      <entry>S-G</entry>
+      <entry>S-G</entry>
+      <entry>S-G</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>HotKeyState</entry>
+      <entry></entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry><function>Preedit</function></entry>
+    </row>
+    <row>
+      <entry>Area</entry>
+      <entry>GS</entry>
+      <entry>Ignored</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>Ignored</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Area Needed</entry>
+      <entry>GN-GR</entry>
+      <entry>Ignored</entry>
+      <entry>Ignored</entry>
+      <entry>S-G</entry>
+      <entry>Ignored</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Spot Location</entry>
+      <entry></entry>
+      <entry>Ignored</entry>
+      <entry>D-S-G</entry>
+      <entry>Ignored</entry>
+      <entry>Ignored</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Colormap</entry>
+      <entry></entry>
+      <entry>Ignored</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Foreground</entry>
+      <entry></entry>
+      <entry>Ignored</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Background</entry>
+      <entry></entry>
+      <entry>Ignored</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Background Pixmap</entry>
+      <entry></entry>
+      <entry>Ignored</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Font Set</entry>
+      <entry>GN</entry>
+      <entry>Ignored</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Line Spacing</entry>
+      <entry>GN</entry>
+      <entry>Ignored</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Cursor</entry>
+      <entry></entry>
+      <entry>Ignored</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Preedit State</entry>
+      <entry></entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Preedit State Notify Callback</entry>
+      <entry></entry>
+      <entry>S-G</entry>
+      <entry>S-G</entry>
+      <entry>S-G</entry>
+      <entry>S-G</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Preedit Callbacks</entry>
+      <entry></entry>
+      <entry>C-S-G</entry>
+      <entry>Ignored</entry>
+      <entry>Ignored</entry>
+      <entry>Ignored</entry>
+      <entry>Ignored</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para></para>
+
+<!-- .LP -->
+<informaltable frame='topbot'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='6' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='1.0*'/>
+  <colspec colname='c3' colwidth='1.0*'/>
+  <colspec colname='c4' colwidth='1.0*'/>
+  <colspec colname='c5' colwidth='1.0*'/>
+  <colspec colname='c6' colwidth='1.0*'/>
+  <thead>
+    <row rowsep='1'>
+      <entry><acronym>XIC</acronym> Value</entry>
+      <entry>Geomentry Management</entry>
+      <entry>Status Callback</entry>
+      <entry>Status Area</entry>
+      <entry>Status Nothing</entry>
+      <entry>Status None</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>Input Style</entry>
+      <entry></entry>
+      <entry>C-G</entry>
+      <entry>C-G</entry>
+      <entry>C-G</entry>
+      <entry>C-G</entry>
+    </row>
+    <row>
+      <entry>Client Window</entry>
+      <entry></entry>
+      <entry>O-G</entry>
+      <entry>O-G</entry>
+      <entry>O-G</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Focus Window</entry>
+      <entry>GN</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Resource Name</entry>
+      <entry></entry>
+      <entry>Ignored</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Resource Class</entry>
+      <entry></entry>
+      <entry>Ignored</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Geometry Callback</entry>
+      <entry></entry>
+      <entry>Ignored</entry>
+      <entry>D-S-G</entry>
+      <entry>Ignored</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Filter Events</entry>
+      <entry></entry>
+      <entry>G</entry>
+      <entry>G</entry>
+      <entry>G</entry>
+      <entry>G</entry>
+    </row>
+    <row>
+      <entry><type>Status</type></entry>
+    </row>
+    <row>
+      <entry>Area</entry>
+      <entry>GS</entry>
+      <entry>Ignored</entry>
+      <entry>D-S-G</entry>
+      <entry>Ignored</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Area Needed</entry>
+      <entry>GN-GR</entry>
+      <entry>Ignored</entry>
+      <entry>S-G</entry>
+      <entry>Ignored</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Colormap</entry>
+      <entry></entry>
+      <entry>Ignored</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Foreground</entry>
+      <entry></entry>
+      <entry>Ignored</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Background</entry>
+      <entry></entry>
+      <entry>Ignored</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Background Pixmap</entry>
+      <entry></entry>
+      <entry>Ignored</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Font Set</entry>
+      <entry>GN</entry>
+      <entry>Ignored</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Line Spacing</entry>
+      <entry>GN</entry>
+      <entry>Ignored</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Cursor</entry>
+      <entry></entry>
+      <entry>Ignored</entry>
+      <entry>D-S-G</entry>
+      <entry>D-S-G</entry>
+      <entry>Ignored</entry>
+    </row>
+    <row>
+      <entry>Status Callbacks</entry>
+      <entry></entry>
+      <entry>C-S-G</entry>
+      <entry>Ignored</entry>
+      <entry>Ignored</entry>
+      <entry>Ignored</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+<sect3 id="Input_Style">
+<title>Input Style</title>
+<!-- .XS -->
+<!-- (SN Input Style -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The
+<symbol>XNInputStyle</symbol>
+argument specifies the input style to be used.
+The value of this argument must be one of the values returned by the
+<xref linkend='XGetIMValues' xrefstyle='select: title'/>
+function with the
+<symbol>XNQueryInputStyle</symbol>
+argument specified in the supported_styles list.
+</para>
+<para>
+<!-- .LP -->
+Note that this argument must be set at creation time
+and cannot be changed.
+</para>
+</sect3>
+<sect3 id="Client_Window">
+<title>Client Window</title>
+<!-- .XS -->
+<!-- (SN Client Window -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XNClientWindow</primary></indexterm>
+The
+<symbol>XNClientWindow</symbol>
+argument specifies to the input method the client window in
+which the input method
+can display data or create subwindows.
+Geometry values for input method areas are given with respect to the client
+window.
+Dynamic change of client window is not supported.
+This argument may be set only once and
+should be set before any input is done using this input context.
+If it is not set,
+the input method may not operate correctly.
+</para>
+<para>
+<!-- .LP -->
+If an attempt is made to set this value a second time with
+<xref linkend='XSetICValues' xrefstyle='select: title'/>,
+the string
+<symbol>XNClientWindow</symbol>
+will be returned by
+<xref linkend='XSetICValues' xrefstyle='select: title'/>,
+and the client window will not be changed.
+</para>
+<para>
+<!-- .LP -->
+If the client window is not a valid window ID on the display
+attached to the input method,
+a 
+<errorname>BadWindow</errorname>
+error can be generated when this value is used by the input method.
+</para>
+</sect3>
+<sect3 id="Focus_Window">
+<title>Focus Window</title>
+<!-- .XS -->
+<!-- (SN Focus Window -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XNFocusWindow</primary></indexterm>
+The
+<symbol>XNFocusWindow</symbol>
+argument specifies the focus window.
+The primary purpose of the 
+<symbol>XNFocusWindow</symbol>
+is to identify the window that will receive the key event when input
+is composed.
+In addition, the input method may possibly affect the focus window
+as follows:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+Select events on it
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Send events to it
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Modify its properties
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Grab the keyboard within that window  
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+The associated value must be of type 
+<type>Window</type>.
+If the focus window is not a valid window ID on the display 
+attached to the input method,
+a 
+<errorname>BadWindow</errorname>
+error can be generated when this value is used by the input method.
+</para>
+<para>
+<!-- .LP -->
+When this <acronym>XIC</acronym> value is left unspecified,
+the input method will use the client window as the default focus window.
+</para>
+</sect3>
+<sect3 id="Resource_Name_and_Class_b">
+<title>Resource Name and Class</title>
+<!-- .XS -->
+<!-- (SN Resource Name and Class -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XNResourceName</primary></indexterm>
+<indexterm significance="preferred"><primary>XNResourceClass</primary></indexterm>
+The
+<symbol>XNResourceName</symbol>
+and
+<symbol>XNResourceClass</symbol>
+arguments are strings that specify the full name and class
+used by the client to obtain resources for the client window. 
+These values should be used as prefixes for name and class
+when looking up resources that may vary according to the input context.
+If these values are not set,
+the resources will not be fully specified.
+</para>
+<para>
+<!-- .LP -->
+It is not intended that values that can be set as <acronym>XIC</acronym> values be
+set as resources.
+</para>
+</sect3>
+<sect3 id="Geometry_Callback">
+<title>Geometry Callback</title>
+<!-- .XS -->
+<!-- (SN Geometry Callback -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XNGeometryCallback</primary></indexterm>
+The 
+<symbol>XNGeometryCallback</symbol>
+argument is a structure of type 
+<structname>XIMCallback</structname>
+(see <link linkend="Preedit_and_Status_Callbacks">section 13.5.6.13.12</link>).
+</para>
+<para>
+<!-- .LP -->
+The 
+<symbol>XNGeometryCallback</symbol>
+argument specifies the geometry callback that a client can set.
+This callback is not required for correct operation of either 
+an input method or a client.
+It can be set for a client whose user interface policy permits
+an input method to request the dynamic change of that input 
+method's window.
+An input method that does dynamic change will need to filter any
+events that it uses to initiate the change.
+</para>
+</sect3>
+<sect3 id="Filter_Events">
+<title>Filter Events</title>
+<!-- .XS -->
+<!-- (SN Filter Events -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XNFilterEvents</primary></indexterm>
+The 
+<symbol>XNFilterEvents</symbol>
+argument returns the event mask that an input method needs
+to have selected for.
+The client is expected to augment its own event mask 
+for the client window with this one.
+</para>
+<para>
+<!-- .LP -->
+This argument is read-only, is set by the input method at create time,
+and is never changed.
+</para>
+<para>
+<!-- .LP -->
+The type of this argument is 
+<type>unsigned</type>
+<type>long</type>.
+Setting this value will cause an error.
+</para>
+</sect3>
+<sect3 id="Destroy_Callback_b">
+<title>Destroy Callback</title>
+<!-- .XS -->
+<!-- (SN Destroy Callback  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The 
+<symbol>XNDestroyCallback</symbol>
+argument is a pointer to a structure of type
+<structname>XIMCallback</structname>
+(see <link linkend="Preedit_and_Status_Callbacks">section 13.5.6.13.12</link>).
+This callback is triggered when the input method
+stops its service for any reason; for example, when a connection to an IM
+server is broken.  After the destroy callback is called, 
+the input context is destroyed and the input method is closed.
+Therefore, the client should not call 
+<xref linkend='XDestroyIC' xrefstyle='select: title'/>
+and
+<xref linkend='XCloseIM' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+</para>
+</sect3>
+<sect3 id="String_Conversion_Callback">
+<title>String Conversion Callback</title>
+<!-- .XS -->
+<!-- (SN String Conversion Callback -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The
+<symbol>XNStringConversionCallback</symbol>
+argument is a structure of type
+<structname>XIMCallback</structname>
+(see <link linkend="Preedit_and_Status_Callbacks">section 13.5.6.13.12</link>).
+</para>
+<para>
+<!-- .LP -->
+The
+<symbol>XNStringConversionCallback</symbol>
+argument specifies a string conversion callback.  This callback
+is not required for correct operation of
+either the input method or the client.  It can be set by a client
+to support string conversions that may be requested
+by the input method.  An input method that does string conversions
+will filter any events that it uses to initiate the conversion.
+</para>
+<para>
+<!-- .LP -->
+Because this <acronym>XIC</acronym> value is optional, a client should call
+<xref linkend='XGetIMValues' xrefstyle='select: title'/>
+with argument
+<symbol>XNQueryICValuesList</symbol>
+before using this argument.
+</para>
+<para>
+<!-- .LP -->
+</para>
+</sect3>
+<sect3 id='String_Conversion'>
+<title>String Conversion</title>
+<!-- .XS -->
+<!-- (SN String Conversion -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The
+<symbol>XNStringConversion</symbol>
+argument is a structure of type
+<structname>XIMStringConversionText</structname>.
+</para>
+<para>
+<!-- .LP -->
+The
+<symbol>XNStringConversion</symbol>
+argument specifies the string to be converted by an input method.
+This argument is not required for correct operation of either
+the input method or the client.
+</para>
+<para>
+<!-- .LP -->
+String conversion facilitates the manipulation of text independent
+of preediting.
+It is essential for some input methods and clients to manipulate
+text by performing context-sensitive conversion,
+reconversion, or transliteration conversion on it.
+</para>
+<para>
+<!-- .LP -->
+Because this <acronym>XIC</acronym> value is optional, a client should call
+<xref linkend='XGetIMValues' xrefstyle='select: title'/>
+with argument
+<symbol>XNQueryICValuesList</symbol>
+before using this argument.
+</para>
+<para>
+<!-- .LP -->
+The
+<structname>XIMStringConversionText</structname>
+structure is defined as follows:
+</para>
+<para>
+<!-- .LP -->
+<!-- .sM -->
+<literallayout class="monospaced">
+
+typedef struct _XIMStringConversionText {
+     unsigned short              length;
+     XIMStringConversionFeedback *feedback;
+     Bool                        encoding_is_wchar;
+     union {
+          char     *mbs;
+          wchar_t  *wcs;
+     } string;
+} XIMStringConversionText;
+
+typedef unsigned long XIMStringConversionFeedback;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The feedback member is reserved for future use.  The text to be
+converted is defined by the string and length members.  The length
+is indicated in characters.  To prevent the library from freeing memory
+pointed to by an uninitialized pointer, the client should set the feedback
+element to NULL.
+</para>
+<para>
+<!-- .LP -->
+</para>
+</sect3>
+<sect3 id="Reset_State">
+<title>Reset State</title>
+<!-- .XS -->
+<!-- (SN Reset State -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The
+<symbol>XNResetState</symbol>
+argument specifies the state the input context will return to after calling
+<xref linkend='XmbResetIC' xrefstyle='select: title'/>
+or
+<xref linkend='XwcResetIC' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+The <acronym>XIC</acronym> state may be set to its initial state, as specified by the
+<symbol>XNPreeditState</symbol>
+value when
+<xref linkend='XCreateIC' xrefstyle='select: title'/>
+was called, or it may be set to preserve the current state.
+</para>
+<para>
+<!-- .LP -->
+The valid masks for
+<type>XIMResetState</type>
+are as follows:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XIMInitialState</primary></indexterm>
+<indexterm significance="preferred"><primary>XINPreserveState</primary></indexterm>
+<!-- .sM -->
+</para>
+<literallayout class="monospaced">
+typedef unsigned long XIMResetState;
+
+#define XIMInitialState  (1L)
+#define XIMPreserveState (1L&lt;&lt;1)
+
+</literallayout>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+If
+<symbol>XIMInitialState</symbol>
+is set, then
+<xref linkend='XmbResetIC' xrefstyle='select: title'/>
+and
+<xref linkend='XwcResetIC' xrefstyle='select: title'/>
+will return to the initial
+<symbol>XNPreeditState</symbol>
+state of the <acronym>XIC</acronym>.
+</para>
+<para>
+<!-- .LP -->
+If
+<symbol>XIMPreserveState</symbol>
+is set, then 
+<xref linkend='XmbResetIC' xrefstyle='select: title'/>
+and
+<xref linkend='XwcResetIC' xrefstyle='select: title'/>
+will preserve the current state of the <acronym>XIC</acronym>.
+</para>
+<para>
+<!-- .LP -->
+If
+<symbol>XNResetState</symbol>
+is left unspecified, the default is
+<symbol>XIMInitialState</symbol>.
+</para>
+<para>
+<!-- .LP -->
+<type>XIMResetState</type>
+values other than those specified above will default to
+<symbol>XIMInitialState</symbol>.
+</para>
+<para>
+<!-- .LP -->
+Because this <acronym>XIC</acronym> value is optional, a client should call
+<xref linkend='XGetIMValues' xrefstyle='select: title'/>
+with argument
+<symbol>XNQueryICValuesList</symbol>
+before using this argument.
+</para>
+<para>
+<!-- .LP -->
+</para>
+</sect3>
+<sect3 id="Hot_Keys_b">
+<title>Hot Keys</title>
+<!-- .XS -->
+<!-- (SN Hot Keys -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The
+<symbol>XNHotKey</symbol>
+argument specifies the hot key list to the <acronym>XIC</acronym>.
+The hot key list is a pointer to the structure of type
+<structname>XIMHotKeyTriggers</structname>,
+which specifies the key events that must be received
+without any interruption of the input method.
+For the hot key list set with this argument to be utilized, the client
+must also set
+<symbol>XNHotKeyState</symbol>
+to
+<symbol>XIMHotKeyStateON</symbol>.
+</para>
+<para>
+<!-- .LP -->
+Because this <acronym>XIC</acronym> value is optional, a client should call
+<xref linkend='XGetIMValues' xrefstyle='select: title'/>
+with argument
+<symbol>XNQueryICValuesList</symbol>
+before using this functionality.
+</para>
+<para>
+<!-- .LP -->
+The value of the argument is a pointer to a structure of type
+<structname>XIMHotKeyTriggers</structname>.
+</para>
+<para>
+<!-- .LP -->
+If an event for a key in the hot key list is found, then the process will
+receive the event and it will be processed inside the client.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef struct {
+     KeySym keysym;
+     unsigned int modifier;
+     unsigned int modifier_mask;
+} XIMHotKeyTrigger;
+
+typedef struct {
+     int num_hot_key;
+     XIMHotKeyTrigger *key;
+} XIMHotKeyTriggers;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+</para>
+<para>
+<!-- .LP -->
+The combination of modifier and modifier_mask are used to represent one of
+three states for each modifier:
+either the modifier must be on, or the modifier must be off, or the modifier
+is a ``don't care'' - it may be on or off.
+When a modifier_mask bit is set to 0, the state of the associated modifier
+is ignored when evaluating whether the key is hot or not.
+</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='3.0*'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Modifier Bit</entry>
+      <entry>Mask Bit</entry>
+      <entry>Meaning</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry>0</entry>
+      <entry>1</entry>
+      <entry>The modifier must be off.</entry>
+    </row>
+    <row>
+      <entry>1</entry>
+      <entry>1</entry>
+      <entry>The modifier must be on.</entry>
+    </row>
+    <row>
+      <entry>n/a</entry>
+      <entry>0</entry>
+      <entry>Do not care if the modifier is on or off.</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+</sect3>
+<sect3 id="Hot_Key_State">
+<title>Hot Key State</title>
+<!-- .XS -->
+<!-- (SN Hot Key State -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The
+<symbol>XNHotKeyState</symbol>
+argument specifies the hot key state of the input method.
+This is usually used to switch the input method between hot key
+operation and normal input processing.
+</para>
+<para>
+<!-- .LP -->
+The value of the argument is a pointer to a structure of type
+XIMHotKeyState .
+</para>
+<literallayout class="monospaced">
+typedef unsigned long XIMHotKeyState;
+
+#define XIMHotKeyStateON            (0x0001L)
+#define XIMHotKeyStateOFF           (0x0002L)
+
+</literallayout>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+</para>
+<para>
+<!-- .LP -->
+If not specified, the default is
+<symbol>XIMHotKeyStateOFF</symbol>.
+</para>
+<para>
+<!-- .LP -->
+</para>
+</sect3>
+<sect3 id="Preedit_and_Status_Attributes">
+<title>Preedit and Status Attributes</title>
+<!-- .XS -->
+<!-- (SN Preedit and Status Attributes -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XNPreeditAttributes</primary></indexterm>
+<indexterm significance="preferred"><primary>XNStatusAttributes</primary></indexterm>
+The
+<symbol>XNPreeditAttributes</symbol>
+and
+<symbol>XNStatusAttributes</symbol>
+arguments specify to an input method the attributes to be used for the 
+preedit and status areas,
+if any.
+Those attributes are passed to 
+<xref linkend='XSetICValues' xrefstyle='select: title'/>
+or
+<xref linkend='XGetICValues' xrefstyle='select: title'/>
+as a nested variable-length list.
+The names to be used in these lists are described in the following sections.
+</para>
+<sect4 id="Area">
+<title>Area</title>
+<!-- .XS -->
+<!-- (SN Area -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XNArea</primary></indexterm>
+The value of the
+<symbol>XNArea</symbol>
+argument must be a pointer to a structure of type
+<structname>XRectangle</structname>.
+The interpretation of the
+<symbol>XNArea</symbol>
+argument is dependent on the input method style that has been set.
+</para>
+<para>
+<!-- .LP -->
+If the input method style is 
+<symbol>XIMPreeditPosition</symbol>,
+<symbol>XNArea</symbol>
+specifies the clipping region within which preediting will take place.
+If the focus window has been set,
+the coordinates are assumed to be relative to the focus window.
+Otherwise, the coordinates are assumed to be relative to the client window.
+If neither has been set,
+the results are undefined.
+</para>
+<para>
+<!-- .LP -->
+If 
+<symbol>XNArea</symbol>
+is not specified, is set to NULL, or is invalid,
+the input method will default the clipping region
+to the geometry of the
+<symbol>XNFocusWindow</symbol>.
+If the area specified is NULL or invalid,
+the results are undefined.
+</para>
+<para>
+<!-- .LP -->
+If the input style is 
+<symbol>XIMPreeditArea</symbol>
+or 
+<symbol>XIMStatusArea</symbol>,
+<symbol>XNArea</symbol>
+specifies the geometry provided by the client to the input method.
+The input method may use this area to display its data,
+either preedit or status depending on the area designated.
+The input method may create a window as a child of the client window
+with dimensions that fit the
+<symbol>XNArea</symbol>.
+The coordinates are relative to the client window.
+If the client window has not been set yet,
+the input method should save these values 
+and apply them when the client window is set.
+If 
+<symbol>XNArea</symbol>
+is not specified, is set to NULL, or is invalid,
+the results are undefined.
+</para>
+</sect4>
+<sect4 id="Area_Needed">
+<title>Area Needed</title>
+<!-- .XS -->
+<!-- (SN Area Needed -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XNAreaNeeded</primary></indexterm>
+When set, the
+<symbol>XNAreaNeeded</symbol>
+argument specifies the geometry suggested by the client for this area
+(preedit or status).
+The value associated with the argument must be a pointer to a 
+structure of type 
+<structname>XRectangle</structname>.
+Note that the x, y values are not used
+and that nonzero values for width or height are the constraints 
+that the client wishes the input method to respect.
+</para>
+<para>
+<!-- .LP -->
+When read, the
+<symbol>XNAreaNeeded</symbol>
+argument specifies the preferred geometry desired by the input method
+for the area.
+</para>
+<para>
+<!-- .LP -->
+This argument is only valid if the input style is 
+<symbol>XIMPreeditArea</symbol>
+or 
+<symbol>XIMStatusArea</symbol>.
+It is used for geometry negotiation between the client and the input method
+and has no other effect on the input method 
+(see <link linkend="Geometry_Management">section 13.5.1.5</link>).
+</para>
+</sect4>
+<sect4 id="Spot_Location">
+<title>Spot Location</title>
+<!-- .XS -->
+<!-- (SN Spot Location -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XNSpotLocation</primary></indexterm>
+The
+<symbol>XNSpotLocation</symbol>
+argument specifies to the input method the coordinates of the spot
+to be used by an input method executing with 
+<symbol>XNInputStyle</symbol>
+set to 
+<symbol>XIMPreeditPosition</symbol>.
+When specified to any input method other than 
+<symbol>XIMPreeditPosition</symbol>,
+this <acronym>XIC</acronym> value is ignored.
+</para>
+<para>
+<!-- .LP -->
+The x coordinate specifies the position where the next character
+would be inserted.
+The y coordinate is the position of the baseline used
+by the current text line in the focus window.
+The x and y coordinates are relative to the focus window, if it has been set;
+otherwise, they are relative to the client window.
+If neither the focus window nor the client window has been set,
+the results are undefined.
+</para>
+<para>
+<!-- .LP -->
+The value of the argument is a pointer to a structure of type
+<structname>XPoint</structname>.
+</para>
+</sect4>
+<sect4 id="Colormap">
+<title>Colormap</title>
+<!-- .XS -->
+<!-- (SN Colormap -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Two different arguments can be used to indicate what colormap the input method
+should use to allocate colors, a colormap ID, or a standard colormap name.
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XNColormap</primary></indexterm>
+The
+<symbol>XNColormap</symbol>
+argument is used to specify a colormap ID.
+The argument value is of type
+<type>Colormap</type>.
+An invalid argument may generate a 
+<errorname>BadColor</errorname>
+error when it is used by the input method.
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XNStdColormap</primary></indexterm>
+The
+<symbol>XNStdColormap</symbol>
+argument is used to indicate the name of the standard colormap
+in which the input method should allocate colors.
+The argument value is an 
+<type>Atom</type>
+that should be a valid atom for calling
+<xref linkend='XGetRGBColormaps' xrefstyle='select: title'/>.
+An invalid argument may generate a
+<errorname>BadAtom</errorname>
+error when it is used by the input method.
+</para>
+<para>
+<!-- .LP -->
+If the colormap is left unspecified,
+the client window colormap becomes the default.
+</para>
+</sect4>
+<sect4 id="Foreground_and_Background">
+<title>Foreground and Background</title>
+<!-- .XS -->
+<!-- (SN Foreground and Background -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XNForeground</primary></indexterm>
+<indexterm significance="preferred"><primary>XNBackground</primary></indexterm>
+The
+<symbol>XNForeground</symbol>
+and
+<symbol>XNBackground</symbol>
+arguments specify the foreground and background pixel, respectively.
+The argument value is of type
+<type>unsigned</type>
+<type>long</type>.
+It must be a valid pixel in the input method colormap.
+</para>
+<para>
+<!-- .LP -->
+If these values are left unspecified,
+the default is determined by the input method.
+</para>
+</sect4>
+<sect4 id="Background_Pixmap">
+<title>Background Pixmap</title>
+<!-- .XS -->
+<!-- (SN Background Pixmap -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The
+<symbol>XNBackgroundPixmap</symbol>
+argument specifies a background pixmap to be used as the background of the
+window.
+The value must be of type 
+<type>Pixmap</type>.
+An invalid argument may generate a
+<errorname>BadPixmap</errorname>
+error when it is used by the input method.
+</para>
+<para>
+<!-- .LP -->
+If this value is left unspecified,
+the default is determined by the input method.
+</para>
+</sect4>
+<sect4 id="Font_Set">
+<title>Font Set</title>
+<!-- .XS -->
+<!-- (SN Font Set -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XNFontSet</primary></indexterm>
+The
+<symbol>XNFontSet</symbol>
+argument specifies to the input method what font set is to be used.
+The argument value is of type
+<type>XFontSet</type>.
+</para>
+<para>
+<!-- .LP -->
+If this value is left unspecified,
+the default is determined by the input method.
+</para>
+</sect4>
+<sect4 id="Line_Spacing">
+<title>Line Spacing</title>
+<!-- .XS -->
+<!-- (SN Line Spacing -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The
+<symbol>XNLineSpace</symbol>
+argument specifies to the input method what line spacing is to be used
+in the preedit window if more than one line is to be used.
+This argument is of type
+<type>int</type>.
+</para>
+<para>
+<!-- .LP -->
+If this value is left unspecified,
+the default is determined by the input method.
+</para>
+</sect4>
+<sect4 id="Cursor">
+<title>Cursor</title>
+<!-- .XS -->
+<!-- (SN Cursor -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XNCursor</primary></indexterm>
+The
+<symbol>XNCursor</symbol>
+argument specifies to the input method what cursor is to be used
+in the specified window.
+This argument is of type 
+<type>Cursor</type>.
+</para>
+<para>
+<!-- .LP -->
+An invalid argument may generate a
+<errorname>BadCursor</errorname>
+error when it is used by the input method.
+If this value is left unspecified,
+the default is determined by the input method.
+</para>
+</sect4>
+<sect4 id="Preedit_State">
+<title>Preedit State</title>
+<!-- .XS -->
+<!-- (SN Preedit State -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The
+<symbol>XNPreeditState</symbol>
+argument specifies the state of input preediting for the input method.
+Input preediting can be on or off.
+</para>
+<para>
+<!-- .LP -->
+The valid mask names for
+<symbol>XNPreeditState</symbol>
+are as follows:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XIMPreeditUnknown</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMPreeditEnable</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMPreeditDisable</primary></indexterm>
+<!-- .sM -->
+</para>
+<!-- .LP -->
+<literallayout class="monospaced">
+typedef unsigned long XIMPreeditState;
+
+#define XIMPreeditUnknown    0L
+#define XIMPreeditEnable     1L
+#define XIMPreeditDisable    (1L&lt;&lt;1)
+
+</literallayout>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+If a value of
+<symbol>XIMPreeditEnable</symbol>
+is set, then input preediting is turned on by the input method.
+</para>
+<para>
+<!-- .LP -->
+If a value of
+<symbol>XIMPreeditDisable</symbol>
+is set, then input preediting is turned off by the input method.
+</para>
+<para>
+<!-- .LP -->
+If
+<symbol>XNPreeditState</symbol>
+is left unspecified, then the state will be implementation-dependent.
+</para>
+<para>
+<!-- .LP -->
+When
+<symbol>XNResetState</symbol>
+is set to
+<symbol>XIMInitialState</symbol>,
+the
+<symbol>XNPreeditState</symbol>
+value specified at the creation time will be reflected as the initial state for
+<xref linkend='XmbResetIC' xrefstyle='select: title'/>
+and
+<xref linkend='XwcResetIC' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+Because this <acronym>XIC</acronym> value is optional, a client should call
+<xref linkend='XGetIMValues' xrefstyle='select: title'/>
+with argument
+<symbol>XNQueryICValuesList</symbol>
+before using this argument.
+</para>
+</sect4>
+<sect4 id="Preedit_State_Notify_Callback">
+<title>Preedit State Notify Callback</title>
+<!-- .XS -->
+<!-- (SN Preedit State Notify Callback -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The preedit state notify callback is triggered by the input method
+when the preediting state has changed.
+The value of the
+<symbol>XNPreeditStateNotifyCallback</symbol>
+argument is a pointer to a structure of type
+<structname>XIMCallback</structname>.
+The generic prototype is as follows:
+</para>
+<indexterm significance="preferred"><primary>PreeditStateNotifyCallback</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='PreeditStateNotifyCallback'>
+<funcprototype>
+  <funcdef>void <function><replaceable>PreeditStateNotifyCallback</replaceable></function></funcdef>
+  <paramdef>XIC<parameter> ic</parameter></paramdef>
+  <paramdef>XPointer<parameter> client_data</parameter></paramdef>
+  <paramdef>XIMPreeditStateNotifyCallbackStruct<parameter> *call_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ic</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the input context.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>client_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the additional client data.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>call_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the current preedit state.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<structname>XIMPreeditStateNotifyCallbackStruct</structname>
+structure is defined as follows:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XIMPreeditStateNotifyCallbackStruct</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef struct _XIMPreeditStateNotifyCallbackStruct {
+     XIMPreeditState state;
+} XIMPreeditStateNotifyCallbackStruct;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+</para>
+<para>
+<!-- .LP -->
+Because this <acronym>XIC</acronym> value is optional, a client should call
+<xref linkend='XGetIMValues' xrefstyle='select: title'/>
+with argument
+<symbol>XNQueryICValuesList</symbol>
+before using this argument.
+</para>
+</sect4>
+<sect4 id="Preedit_and_Status_Callbacks">
+<title>Preedit and Status Callbacks</title>
+<!-- .XS -->
+<!-- (SN Preedit and Status Callbacks -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+A client that wants to support the input style
+<symbol>XIMPreeditCallbacks</symbol>
+must provide a set of preedit callbacks to the input method.
+The set of preedit callbacks is as follows:
+</para>
+<indexterm significance="preferred"><primary>XNPreeditStartCallback</primary></indexterm>
+<indexterm significance="preferred"><primary>XNPreeditDoneCallback</primary></indexterm>
+<indexterm significance="preferred"><primary>XNPreeditDrawCallback</primary></indexterm>
+<indexterm significance="preferred"><primary>XNPreeditCaretCallback</primary></indexterm>
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='2.0*'/>
+  <tbody>
+    <row>
+      <entry><symbol>XNPreeditStartCallback</symbol></entry>
+      <entry>This is called when the input method starts preedit.</entry>
+    </row>
+    <row>
+      <entry><symbol>XNPreeditDoneCallback</symbol></entry>
+      <entry>This is called when the input method stops preedit.</entry>
+    </row>
+    <row>
+      <entry><symbol>XNPreeditDrawCallback</symbol></entry>
+      <entry>This is called when a number of preedit keystrokes should be echoed.</entry>
+    </row>
+    <row>
+      <entry><symbol>XNPreeditCaretCallback</symbol></entry>
+      <entry>This is called to move the text insertion point within the preedit string.</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+<!-- .LP -->
+A client that wants to support the input style
+<symbol>XIMStatusCallbacks</symbol>
+must provide a set of status callbacks to the input method.
+The set of status callbacks is as follows:
+</para>
+
+<indexterm significance="preferred"><primary>XNStatusStartCallback</primary></indexterm>
+<indexterm significance="preferred"><primary>XNStatusDoneCallback</primary></indexterm>
+<indexterm significance="preferred"><primary>XNStatusDrawCallback</primary></indexterm>
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='2.0*'/>
+  <tbody>
+    <row>
+      <entry><symbol>XNStatusStartCallback</symbol></entry>
+      <entry>This is called when the input method initializes the status area.</entry>
+    </row>
+    <row>
+      <entry><symbol>XNStatusDoneCallback</symbol></entry>
+      <entry>This is called when the input method no longer needs the status area.</entry>
+    </row>
+    <row>
+      <entry><symbol>XNStatusDrawCallback</symbol></entry>
+      <entry>This is called when updating of the status area is required.</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+<para>
+<!-- .LP -->
+The value of any status or preedit argument is a pointer
+to a structure of type
+<structname>XIMCallback</structname>.
+<indexterm significance="preferred"><primary>XIMProc</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMCallback</primary></indexterm>
+<!-- .sM -->
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef void (*XIMProc)();
+
+typedef struct {
+     XPointer client_data;
+     XIMProc callback;
+} XIMCallback;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+Each callback has some particular semantics and will carry the data
+that expresses the environment necessary to the client 
+into a specific data structure.
+This paragraph only describes the arguments to be used to set
+the callback.
+</para>
+<para>
+<!-- .LP -->
+Setting any of these values while doing preedit
+may cause unexpected results.
+</para>
+</sect4>
+</sect3>
+</sect2>
+<sect2 id="Input_Method_Callback_Semantics">
+<title>Input Method Callback Semantics</title>
+<!-- .XS -->
+<!-- (SN Input Method Callback Semantics -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<acronym>XIM</acronym> callbacks are procedures defined by clients or text drawing packages
+that are to be called from the input method when selected events occur.
+Most clients will use a text editing package or a toolkit
+and, hence, will not need to define such callbacks.
+This section defines the callback semantics, when they are triggered,
+and what their arguments are.
+This information is mostly useful for X toolkit implementors.
+</para>
+<para>
+<!-- .LP -->
+Callbacks are mostly provided so that clients (or text editing
+packages) can implement on-the-spot preediting in their own window.
+In that case,
+the input method needs to communicate and synchronize with the client.
+The input method needs to communicate changes in the preedit window 
+when it is under control of the client.
+Those callbacks allow the client to initialize the preedit area,
+display a new preedit string,
+move the text insertion point during preedit,
+terminate preedit, or update the status area.
+</para>
+<para>
+<!-- .LP -->
+All callback procedures follow the generic prototype:
+</para>
+<indexterm significance="preferred"><primary>CallbackPrototype</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis>
+<funcprototype>
+  <funcdef>void <function><replaceable>CallbackPrototype</replaceable></function></funcdef>
+  <paramdef>XIC<parameter> ic</parameter></paramdef>
+  <paramdef>XPointer<parameter> client_data</parameter></paramdef>
+  <paramdef>SomeType<parameter> call_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ic</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the input context.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>client_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the additional client data.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>call_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies data specific to the callback.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The call_data argument is a structure that expresses the arguments needed
+to achieve the semantics;
+that is,
+it is a specific data structure appropriate to the callback.
+In cases where no data is needed in the callback,
+this call_data argument is NULL.
+The client_data argument is a closure that has been initially specified
+by the client when specifying the callback and passed back.
+It may serve, for example, to inherit application context in the callback.
+</para>
+<para>
+<!-- .LP -->
+The following paragraphs describe the programming semantics
+and specific data structure associated with the different reasons.
+</para>
+<sect3 id="Geometry_Callback_b">
+<title>Geometry Callback</title>
+<!-- .XS -->
+<!-- (SN Geometry Callback -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The geometry callback is triggered by the input method 
+to indicate that it wants the client to negotiate geometry.
+The generic prototype is as follows:
+</para>
+<indexterm significance="preferred"><primary>GeometryCallback</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis>
+<funcprototype>
+  <funcdef>void <function><replaceable>GeometryCallback</replaceable></function></funcdef>
+  <paramdef>XIC<parameter> ic</parameter></paramdef>
+  <paramdef>XPointer<parameter> client_data</parameter></paramdef>
+  <paramdef>XPointer<parameter> call_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ic</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the input context.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>client_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the additional client data.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>call_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Not used for this callback and always passed as NULL.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The callback is called with a NULL call_data argument.
+</para>
+</sect3>
+<sect3 id="Destroy_Callback_c">
+<title>Destroy Callback</title>
+<!-- .XS -->
+<!-- (SN Destroy Callback -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The destroy callback is triggered by the input method 
+when it stops service for any reason.
+After the callback is invoked, the input context will be freed by Xlib.
+The generic prototype is as follows:
+</para>
+<indexterm significance="preferred"><primary>DestroyCallback</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='DestroyCallback_2'>
+<funcprototype>
+  <funcdef>void <function><replaceable>DestroyCallback</replaceable></function></funcdef>
+  <paramdef>XIC<parameter> ic</parameter></paramdef>
+  <paramdef>XPointer<parameter> client_data</parameter></paramdef>
+  <paramdef>XPointer<parameter> call_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ic</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the input context.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>client_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the additional client data.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>call_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Not used for this callback and always passed as NULL.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The callback is called with a NULL call_data argument.
+</para>
+</sect3>
+<sect3 id="String_Conversion_Callback_b">
+<title>String Conversion Callback</title>
+<!-- .XS -->
+<!-- (SN String Conversion Callback -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The string conversion callback is triggered by the input method 
+to request the client to return the string to be converted.  The
+returned string may be either a multibyte or wide character string,
+with an encoding matching the locale bound to the input context.
+The callback prototype is as follows:
+</para>
+<indexterm significance="preferred"><primary>StringConversionCallback</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='StringConversionCallback'>
+<funcprototype>
+  <funcdef>void <function><replaceable>StringConversionCallback</replaceable></function></funcdef>
+  <paramdef>XIC<parameter> ic</parameter></paramdef>
+  <paramdef>XPointer<parameter> client_data</parameter></paramdef>
+  <paramdef>XIMStringConversionCallbackStruct<parameter> *call_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ic</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the input method.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>client_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the additional client data.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>call_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the amount of the string to be converted.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The callback is passed an
+<structname>XIMStringConversionCallbackStruct</structname>
+structure in the call_data argument.
+The text member is an
+<structname>XIMStringConversionText</structname>
+structure (see <link linkend='String_Conversion'>section 13.5.6.9</link>)
+to be filled in by the client
+and describes the text to be sent to the input method.
+The data pointed to by the 
+string and feedback elements of the
+<structname>XIMStringConversionText</structname>
+structure will be freed using
+<xref linkend='XFree' xrefstyle='select: title'/>
+by the input method
+after the callback returns.  So the client should not point to 
+internal buffers that are critical to the client.
+Similarly, because the feedback element is currently reserved for future
+use, the client should set feedback to NULL to prevent the library from
+freeing memory at some random location due to an uninitialized pointer.
+</para>
+<para>
+<!-- .LP -->
+The 
+<structname>XIMStringConversionCallbackStruct</structname>
+structure is defined as follows:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XIMStringConversionCallbackStruct</primary></indexterm>
+<!-- .sM -->
+</para>
+<!-- .LP -->
+<literallayout class="monospaced">
+typedef struct _XIMStringConversionCallbackStruct {
+     XIMStringConversionPosition position;          
+     XIMCaretDirection direction;
+     short factor;
+     XIMStringConversionOperation operation;
+     XIMStringConversionText *text;
+} XIMStringConversionCallbackStruct;
+
+typedef short XIMStringConversionPosition;
+
+typedef unsigned short XIMStringConversionOperation;
+
+#define XIMStringConversionSubstitution       (0x0001)
+#define XIMStringConversionRetrieval          (0x0001)
+
+</literallayout>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<type>XIMStringConversionPosition</type>
+specifies the starting position of the string to be returned
+in the
+<structname>XIMStringConversionText</structname>
+structure.  The value identifies a position, in units of characters,
+relative to the client's cursor position in the client's buffer.
+</para>
+<para>
+<!-- .LP -->
+The ending position of the text buffer is determined by
+the direction and factor members.  Specifically, it is the character position 
+relative to the starting point as defined by the
+<structname>XIMCaretDirection</structname>.
+The factor member of 
+<structname>XIMStringConversionCallbackStruct</structname>
+specifies the number of
+<structname>XIMCaretDirection</structname>
+positions to be applied.  For example, if the direction specifies
+<constant>XIMLineEnd</constant>
+and factor is 1, then all characters from the starting position to 
+the end of the current display line are returned.  If the direction
+specifies
+<constant>XIMForwardChar</constant>
+or
+<constant>XIMBackwardChar</constant>,
+then the factor specifies a relative position, indicated in characters, 
+from the starting position.
+</para>
+<para>
+<!-- .LP -->
+<type>XIMStringConversionOperation</type>
+specifies whether the string to be converted should be 
+deleted (substitution) or copied (retrieval) from the client's
+buffer.  When the
+<type>XIMStringConversionOperation</type>
+is
+<symbol>XIMStringConversionSubstitution</symbol>,
+the client must delete the string to be converted from its own buffer.
+When the
+<type>XIMStringConversionOperation</type>
+is
+<symbol>XIMStringConversionRetrieval</symbol>,
+the client must not delete the string to be converted from its buffer.
+The substitute operation is typically used for reconversion and
+transliteration conversion,
+while the retrieval operation is typically used for context-sensitive 
+conversion.
+</para>
+</sect3>
+<sect3 id="Preedit_State_Callbacks">
+<title>Preedit State Callbacks</title>
+<!-- .XS -->
+<!-- (SN Preedit State Callbacks -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+When the input method turns preediting on or off, a
+<xref linkend='PreeditStartCallback' xrefstyle='select: title'/>
+or
+<xref linkend='PreeditDoneCallback' xrefstyle='select: title'/>
+callback is triggered to let the toolkit do the setup
+or the cleanup for the preedit region.
+</para>
+<indexterm significance="preferred"><primary>PreeditStartCallback</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='PreeditStartCallback'>
+<funcprototype>
+  <funcdef>int <function><replaceable>PreeditStartCallback</replaceable></function></funcdef>
+  <paramdef>XIC<parameter> ic</parameter></paramdef>
+  <paramdef>XPointer<parameter> client_data</parameter></paramdef>
+  <paramdef>XPointer<parameter> call_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ic</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the input context.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>client_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the additional client data.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>call_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Not used for this callback and always passed as NULL.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+When preedit starts on the specified input context,
+the callback is called with a NULL call_data argument.
+<xref linkend='PreeditStartCallback' xrefstyle='select: title'/>
+will return the maximum size of the preedit string.
+A positive number indicates the maximum number of bytes allowed
+in the preedit string, 
+and a value of -1 indicates there is no limit.
+</para>
+<indexterm significance="preferred"><primary>PreeditDoneCallback</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='PreeditDoneCallback'>
+<funcprototype>
+  <funcdef>void <function><replaceable>PreeditDoneCallback</replaceable></function></funcdef>
+  <paramdef>XIC<parameter> ic</parameter></paramdef>
+  <paramdef>XPointer<parameter> client_data</parameter></paramdef>
+  <paramdef>XPointer<parameter> call_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ic</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the input context.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>client_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the additional client data.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>call_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Not used for this callback and always passed as NULL.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+When preedit stops on the specified input context,
+the callback is called with a NULL call_data argument.
+The client can release the data allocated by
+<xref linkend='PreeditStartCallback' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='PreeditStartCallback' xrefstyle='select: title'/>
+should initialize appropriate data needed for
+displaying preedit information and for handling further 
+<xref linkend='PreeditDrawCallback' xrefstyle='select: title'/>
+calls.
+Once
+<xref linkend='PreeditStartCallback' xrefstyle='select: title'/>
+is called, it will not be called again before
+<xref linkend='PreeditDoneCallback' xrefstyle='select: title'/>
+has been called.
+</para>
+</sect3>
+<sect3 id="Preedit_Draw_Callback">
+<title>Preedit Draw Callback</title>
+<!-- .XS -->
+<!-- (SN Preedit Draw Callback -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+This callback is triggered to draw and insert, delete or replace,
+preedit text in the preedit region.
+The preedit text may include unconverted input text such as Japanese Kana,
+converted text such as Japanese Kanji characters, or characters of both kinds.
+That string is either a multibyte or wide character string, 
+whose encoding matches the locale bound to the input context.
+The callback prototype
+is as follows:
+</para>
+<indexterm significance="preferred"><primary>PreeditDrawCallback</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='PreeditDrawCallback'>
+<funcprototype>
+  <funcdef>void <function><replaceable>PreeditDrawCallback</replaceable></function></funcdef>
+  <paramdef>XIC<parameter> ic</parameter></paramdef>
+  <paramdef>XPointer<parameter> client_data</parameter></paramdef>
+  <paramdef>XIMPreeditDrawCallbackStruct<parameter> *call_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ic</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the input context.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>client_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the additional client data.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>call_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the preedit drawing information.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The callback is passed an 
+<structname>XIMPreeditDrawCallbackStruct</structname>
+structure in the call_data argument.
+The text member of this structure contains the text to be drawn.
+After the string has been drawn,
+the caret should be moved to the specified location.
+</para>
+<para>
+<!-- .LP -->
+The 
+<structname>XIMPreeditDrawCallbackStruct</structname>
+structure is defined as follows:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XIMPreeditDrawCallbackStruct</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef struct _XIMPreeditDrawCallbackStruct {
+     int caret;     /* Cursor offset within preedit string */
+     int chg_first;     /* Starting change position */
+     int chg_length;     /* Length of the change in character count */
+     XIMText *text;
+} XIMPreeditDrawCallbackStruct;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The client must keep updating a buffer of the preedit text
+and the callback arguments referring to indexes in that buffer.
+The call_data fields have specific meanings according to the operation,
+as follows:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+To indicate text deletion, 
+the call_data member specifies a NULL text field.
+The text to be deleted is then the current text in the buffer 
+from position chg_first (starting at zero) on a character length
+of chg_length.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+When text is non-NULL,
+it indicates insertion or replacement of text in the buffer.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The chg_length member
+identifies the number of characters in the current preedit buffer
+that are affected by this call.
+A positive chg_length indicates that chg_length number of characters, starting
+at chg_first, must be deleted or must be replaced by text, whose length is
+specified in the
+<structname>XIMText</structname>
+structure.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A chg_length value of zero indicates that text must be inserted
+right at the position specified by chg_first.
+A value of zero for chg_first specifies the first character in the buffer.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+chg_length and chg_first combine to identify the modification required to
+the preedit buffer; beginning at chg_first, replace chg_length number of
+characters with the text in the supplied
+<structname>XIMText</structname>
+structure. For example, suppose the preedit buffer contains the string "ABCDE".
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+<literallayout class="monospaced">
+<!-- .ft C -->
+Text:      A B C D E
+          ^ ^ ^ ^ ^ ^
+CharPos:  0 1 2 3 4 5
+<!-- .sp -->
+<!-- .ft P -->
+</literallayout>
+The CharPos in the diagram shows the location of the character position
+relative to the character.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If the value of chg_first is 1 and the value of chg_length is 3, this
+says to replace 3 characters beginning at character position 1 with the
+string in the
+<structname>XIMText</structname>
+structure.
+Hence, <acronym>BCD</acronym> would be replaced by the value in the structure.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Though chg_length and chg_first are both signed integers they will
+never have a negative value.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The caret member
+identifies the character position before which the cursor should
+be placed - after modification to the preedit buffer has been completed.
+For example, if caret is zero, the cursor is at
+the beginning of the buffer.  If the caret is one, the cursor is between
+the first and second character.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XIMText</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 1.5i 3i -->
+typedef struct _XIMText {
+     unsigned short length;
+     XIMFeedback * feedback;
+     Bool encoding_is_wchar; 
+     union {
+          char * multi_byte;
+          wchar_t * wide_char;
+     } string; 
+} XIMText;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The text string passed is actually a structure specifying as follows:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+The length member is the text length in characters.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The encoding_is_wchar member is a value that indicates 
+if the text string is encoded in wide character or multibyte format.
+The text string may be passed either as multibyte or as wide character;
+the input method controls in which form data is passed.
+The client's
+callback routine must be able to handle data passed in either form.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The string member is the text string.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+The feedback member indicates rendering type for each character in the
+string member.
+If string is NULL (indicating that only highlighting of the existing
+preedit buffer should be updated), feedback points to length highlight
+elements that should be applied to the existing preedit buffer, beginning
+at chg_first.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+The feedback member expresses the types of rendering feedback
+the callback should apply when drawing text.
+Rendering of the text to be drawn is specified either in generic ways
+(for example, primary, secondary) or in specific ways (reverse, underline).
+When generic indications are given,
+the client is free to choose the rendering style.
+It is necessary, however, that primary and secondary be mapped 
+to two distinct rendering styles.
+</para>
+<para>
+<!-- .LP -->
+If an input method wants to control display of the preedit string, an 
+input method can indicate the visibility hints using feedbacks in
+a specific way.
+The 
+<symbol>XIMVisibleToForward</symbol>,
+<symbol>XIMVisibleToBackword</symbol>,
+and
+<symbol>XIMVisibleToCenter</symbol>
+masks are exclusively used for these visibility hints.
+The 
+<symbol>XIMVisibleToForward</symbol>
+mask
+indicates that the preedit text is preferably displayed in the
+primary draw direction from the
+caret position in the preedit area forward.
+The 
+<symbol>XIMVisibleToBackword</symbol>
+mask
+indicates that the preedit text is preferably displayed from
+the caret position in the preedit area backward, relative to the primary
+draw direction.
+The 
+<symbol>XIMVisibleToCenter</symbol>
+mask
+indicates that the preedit text is preferably displayed with
+the caret position in the preedit area centered.
+</para>
+<para>
+<!-- .LP -->
+The insertion point of the preedit string could exist outside of
+the visible area when visibility hints are used.
+Only one of the 
+masks
+is valid for the entire preedit string, and only one character
+can hold one of these feedbacks for a given input context at one time.
+This feedback may be OR'ed together with another highlight (such as
+<symbol>XIMReverse</symbol>).
+Only the most recently set feedback is valid, and any previous
+feedback is automatically canceled.  This is a hint to the client, and
+the client is free to choose how to display the preedit string.
+</para>
+<para>
+<!-- .LP -->
+The feedback member also specifies how rendering of the text argument
+should be performed.
+If the feedback is NULL,
+the callback should apply the same feedback as is used for the surrounding
+characters in the preedit buffer; if chg_first is at a highlight boundary,
+the client can choose which of the two highlights to use.
+If feedback is not NULL, feedback specifies an array defining the
+rendering for each
+character of the string, and the length of the array is thus length.
+</para>
+<para>
+<!-- .LP -->
+If an input method wants to indicate that it is only updating the feedback of
+the preedit text without changing the content of it, 
+the
+<structname>XIMText</structname>
+structure will contain a NULL value for the string field,
+the number of characters affected (relative to chg_first)
+will be in the length field,
+and the feedback field will point to an array of 
+<type>XIMFeedback</type>.
+</para>
+<para>
+<!-- .LP -->
+Each element in the feedback array is a bitmask represented by a value of type
+<type>XIMFeedback</type>.
+The valid mask names are as follows:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XIMReverse</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMUnderline</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMHighlight</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMPrimary</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMSecondary</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMTertiary</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMVisibleToForward</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMVisibleToBackward</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMVisibleToCenter</primary></indexterm>
+<!-- .sM -->
+</para>
+<literallayout class="monospaced">
+typedef unsigned long XIMFeedback;
+
+#define     XIMReverse                     1L
+#define     XIMUnderline                   (1L&lt;&lt;1)
+#define     XIMHighlight                   (1L&lt;&lt;2)
+#define     XIMPrimary                     (1L&lt;&lt;5)*
+#define     XIMSecondary                   (1L&lt;&lt;6)*
+#define     XIMTertiary                    (1L&lt;&lt;7)*
+#define     XIMVisibleToForward            (1L&lt;&lt;8)
+#define     XIMVisibleToBackward           (1L&lt;&lt;9)
+#define     XIMVisibleToCenter               (1L&lt;&lt;10)
+
+*† The values for XIMPrimary, XIMSecondary, and XIMTertiary were incorrectly defined in
+the R5 specification. The X Consortium’s X11R5 implementation correctly
+implemented the values for these highlights. The value of these highlights has
+been corrected in this specification to agree with the values in the
+Consortium’s X11R5 and X11R6 implementations.
+
+</literallayout>
+
+<para>
+<!-- .LP -->
+Characters drawn with the
+<symbol>XIMReverse</symbol>
+highlight should be drawn by swapping the foreground and background colors
+used to draw normal, unhighlighted characters.
+Characters drawn with the
+<symbol>XIMUnderline</symbol>
+highlight should be underlined.
+Characters drawn with the
+<symbol>XIMHighlight</symbol>,
+<symbol>XIMPrimary</symbol>,
+<symbol>XIMSecondary</symbol>,
+and
+<symbol>XIMTertiary</symbol>
+highlights should be drawn in some unique manner that must be different
+from
+<symbol>XIMReverse</symbol>
+and
+<symbol>XIMUnderline</symbol>.
+<!-- .FS \(dg -->
+The values for
+<symbol>XIMPrimary</symbol>,
+<symbol>XIMSecondary</symbol>,
+and
+<symbol>XIMTertiary</symbol>
+were incorrectly defined in the R5 specification.
+The X Consortium's X11R5
+implementation correctly implemented the values for these highlights.
+The value of these highlights has been corrected in this specification
+to agree with the values in the Consortium's X11R5 and X11R6 implementations.
+<!-- .FE -->
+</para>
+</sect3>
+<sect3 id="Preedit_Caret_Callback">
+<title>Preedit Caret Callback</title>
+<!-- .XS -->
+<!-- (SN Preedit Caret Callback -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+An input method may have its own navigation keys to allow the user
+to move the text insertion point in the preedit area 
+(for example, to move backward or forward). 
+Consequently, input method needs to indicate to the client that it
+should move the text insertion point.
+It then calls the PreeditCaretCallback.
+</para>
+<indexterm significance="preferred"><primary>PreeditCaretCallback</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='PreeditCaretCallback'>
+<funcprototype>
+  <funcdef>void <function><replaceable>PreeditCaretCallback</replaceable></function></funcdef>
+  <paramdef>XIC<parameter> ic</parameter></paramdef>
+  <paramdef>XPointer<parameter> client_data</parameter></paramdef>
+  <paramdef>XIMPreeditCaretCallbackStruct<parameter> *call_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ic</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the input context.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>client_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the additional client data.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>call_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the preedit caret information.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The input method will trigger PreeditCaretCallback
+to move the text insertion point during preedit.
+The call_data argument contains a pointer to an 
+<structname>XIMPreeditCaretCallbackStruct</structname>
+structure,
+which indicates where the caret should be moved.
+The callback must move the insertion point to its new location
+and return, in field position, the new offset value from the initial position.  
+</para>
+<para>
+<!-- .LP -->
+The
+<structname>XIMPreeditCaretCallbackStruct</structname>
+structure is defined as follows:
+<indexterm significance="preferred"><primary>XIMPreeditCaretCallbackStruct</primary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef struct _XIMPreeditCaretCallbackStruct {
+     int position;     /* Caret offset within preedit string */
+     XIMCaretDirection direction;     /* Caret moves direction */
+     XIMCaretStyle style;     /* Feedback of the caret */
+} XIMPreeditCaretCallbackStruct;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<structname>XIMCaretStyle</structname>
+structure is defined as follows:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XIMCaretStyle</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef enum {
+     XIMIsInvisible,     /* Disable caret feedback */ 
+     XIMIsPrimary,     /* <acronym>UI</acronym> defined caret feedback */
+     XIMIsSecondary,     /* <acronym>UI</acronym> defined caret feedback */
+} XIMCaretStyle;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<structname>XIMCaretDirection</structname>
+structure is defined as follows:
+<indexterm significance="preferred"><primary>XIMCaretDirection</primary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef enum {
+     XIMForwardChar, XIMBackwardChar,
+     XIMForwardWord, XIMBackwardWord,
+     XIMCaretUp, XIMCaretDown,
+     XIMNextLine, XIMPreviousLine,
+     XIMLineStart, XIMLineEnd, 
+     XIMAbsolutePosition,
+     XIMDontChange,
+ } XIMCaretDirection;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+These values are defined as follows:
+</para>
+<indexterm significance="preferred"><primary>XIMForwardChar</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMBackwardChar</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMForwardWord</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMBackwardWord</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMCaretUp</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMCaretDown</primary></indexterm>
+<informaltable frame='none'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='1.5*'/>
+  <tbody>
+    <row>
+      <entry><constant>XIMForwardChar</constant></entry>
+      <entry>Move the caret forward one character position.</entry>
+    </row>
+    <row>
+      <entry><constant>XIMBackwardChar</constant></entry>
+      <entry>Move the caret backward one character position.</entry>
+    </row>
+    <row>
+      <entry><constant>XIMForwardWord</constant></entry>
+      <entry>Move the caret forward one word.</entry>
+    </row>
+    <row>
+      <entry><constant>XIMBackwardWord</constant></entry>
+      <entry>Move the caret backward one word.</entry>
+    </row>
+    <row>
+      <entry><constant>XIMCaretUp</constant></entry>
+      <entry>Move the caret up one line keeping the current horizontal offset.</entry>
+    </row>
+    <row>
+      <entry><constant>XIMCaretDown</constant></entry>
+      <entry>Move the caret down one line keeping the current horizontal offset.</entry>
+    </row>
+    <row>
+      <entry><constant>XIMPreviousLine</constant></entry>
+      <entry>Move the caret to the beginning of the previous line.</entry>
+    </row>
+    <row>
+      <entry><constant>XIMNextLine</constant></entry>
+      <entry>Move the caret to the beginning of the next line.</entry>
+    </row>
+    <row>
+      <entry><constant>XIMLineStart</constant></entry>
+      <entry>Move the caret to the beginning of the current display line that contains the caret.</entry>
+    </row>
+    <row>
+      <entry><constant>XIMLineEnd</constant></entry>
+      <entry>Move the caret to the end of the current display line that contains the caret.</entry>
+    </row>
+    <row>
+      <entry><constant>XIMAbsolutePosition</constant></entry>
+      <entry>The callback must move to the location specified by the position field
+      of the callback data, indicated in characters, starting from the beginning
+      of the preedit text.
+      Hence, a value of zero means move back to the beginning of the preedit text.</entry>
+    </row>
+    <row>
+      <entry><constant>XIMDontChange</constant></entry>
+      <entry>The caret position does not change.</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<indexterm significance="preferred"><primary>XIMNextLine</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMPreviousLine</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMLineStart</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMLineEnd</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMAbsolutePosition</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMDontChange</primary></indexterm>
+</sect3>
+<sect3 id="Status_Callbacks">
+<title>Status Callbacks</title>
+<!-- .XS -->
+<!-- (SN Status Callbacks -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+An input method may communicate changes in the status of an input context
+(for example, created, destroyed, or focus changes) with three status
+callbacks:  StatusStartCallback, StatusDoneCallback, and StatusDrawCallback.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+When the input context is created or gains focus, 
+the input method calls the StatusStartCallback callback.
+</para>
+<indexterm significance="preferred"><primary>StatusStartCallback</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='StatusStartCallback'>
+<funcprototype>
+  <funcdef>void <function><replaceable>StatusStartCallback</replaceable></function></funcdef>
+  <paramdef>XIC<parameter> ic</parameter></paramdef>
+  <paramdef>XPointer<parameter> client_data</parameter></paramdef>
+  <paramdef>XPointer<parameter> call_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ic</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the input context.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>client_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the additional client data.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>call_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Not used for this callback and always passed as NULL.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The callback should initialize appropriate data for displaying status
+and for responding to StatusDrawCallback calls.  
+Once StatusStartCallback is called,
+it will not be called again before StatusDoneCallback has been called.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+When an input context
+is destroyed or when it loses focus, the input method calls StatusDoneCallback.
+</para>
+<indexterm significance="preferred"><primary>StatusDoneCallback</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='StatusDoneCallback'>
+<funcprototype>
+  <funcdef>void <function><replaceable>StatusDoneCallback</replaceable></function></funcdef>
+  <paramdef>XIC<parameter> ic</parameter></paramdef>
+  <paramdef>XPointer<parameter> client_data</parameter></paramdef>
+  <paramdef>XPointer<parameter> call_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ic</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the input context.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>client_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the additional client data.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>call_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Not used for this callback and always passed as NULL.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The callback may release any data allocated on 
+<function>StatusStart</function>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+When an input context status has to be updated, the input method calls
+StatusDrawCallback.
+</para>
+<indexterm significance="preferred"><primary>StatusDrawCallback</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='StatusDrawCallback'>
+<funcprototype>
+  <funcdef>void <function><replaceable>StatusDrawCallback</replaceable></function></funcdef>
+  <paramdef>XIC<parameter> ic</parameter></paramdef>
+  <paramdef>XPointer<parameter> client_data</parameter></paramdef>
+  <paramdef>XIMStatusDrawCallbackStruct<parameter> *call_data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ic</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the input context.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>client_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the additional client data.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>call_data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the status drawing information.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The callback should update the status area by either drawing a string
+or imaging a bitmap in the status area.
+</para>
+<para>
+<!-- .LP -->
+The
+<structname>XIMStatusDataType</structname>
+and
+<structname>XIMStatusDrawCallbackStruct</structname>
+structures are defined as follows:
+<indexterm significance="preferred"><primary>XIMStatusDataType</primary></indexterm>
+<indexterm significance="preferred"><primary>XIMStatusDrawCallbackStruct</primary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 1i 3i -->
+<!-- .ta .5i 1i 3i -->
+typedef enum {
+     XIMTextType,
+     XIMBitmapType,
+} XIMStatusDataType;
+
+typedef struct _XIMStatusDrawCallbackStruct {
+     XIMStatusDataType type;
+     union {
+          XIMText *text;
+          Pixmap  bitmap;
+     } data;
+} XIMStatusDrawCallbackStruct;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+</para>
+<para>
+<!-- .LP -->
+The feedback styles
+<symbol>XIMVisibleToForward</symbol>,
+<symbol>XIMVisibleToBackword</symbol>,
+and
+<symbol>XIMVisibleToCenter</symbol>
+are not relevant and will not appear in the
+<type>XIMFeedback</type>
+element of the
+<structname>XIMText</structname>
+structure.
+</para>
+<para>
+<!-- .LP -->
+</para>
+</sect3>
+</sect2>
+<sect2 id="Event_Filtering_b">
+<title>Event Filtering</title>
+<!-- .XS -->
+<!-- (SN Event Filtering -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides the ability for an input method
+to register a filter internal to Xlib.
+This filter is called by a client (or toolkit) by calling
+<xref linkend='XFilterEvent' xrefstyle='select: title'/>
+after calling 
+<xref linkend='XNextEvent' xrefstyle='select: title'/>.
+Any client that uses the 
+<type>XIM</type>
+interface should call
+<xref linkend='XFilterEvent' xrefstyle='select: title'/>
+to allow input methods to process their events without knowledge
+of the client's dispatching mechanism.
+A client's user interface policy may determine the priority
+of event filters with respect to other event-handling mechanisms
+(for example, modal grabs).
+</para>
+<para>
+<!-- .LP -->
+Clients may not know how many filters there are, if any,
+and what they do.
+They may only know if an event has been filtered on return of 
+<xref linkend='XFilterEvent' xrefstyle='select: title'/>.
+Clients should discard filtered events.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To filter an event, use
+<xref linkend='XFilterEvent' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XFilterEvent</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XFilterEvent'>
+<funcprototype>
+  <funcdef>Bool <function>XFilterEvent</function></funcdef>
+  <paramdef>XEvent<parameter> *event</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<!-- .ds Ev event to filter -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the (Ev.
+<!-- .ds Wi for which the filter is to be applied -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window (Wi.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+If the window argument is
+<symbol>None</symbol>,
+<xref linkend='XFilterEvent' xrefstyle='select: title'/>
+applies the filter to the window specified in the
+<structname>XEvent</structname>
+structure.
+The window argument is provided so that layers above Xlib
+that do event redirection can indicate to which window an event
+has been redirected.
+</para>
+<para>
+<!-- .LP -->
+If
+<xref linkend='XFilterEvent' xrefstyle='select: title'/>
+returns
+<symbol>True</symbol>,
+then some input method has filtered the event,
+and the client should discard the event.
+If
+<xref linkend='XFilterEvent' xrefstyle='select: title'/>
+returns
+<symbol>False</symbol>,
+then the client should continue processing the event.
+</para>
+<para>
+<!-- .LP -->
+If a grab has occurred in the client and
+<xref linkend='XFilterEvent' xrefstyle='select: title'/>
+returns
+<symbol>True</symbol>,
+the client should ungrab the keyboard.
+</para>
+</sect2>
+<sect2 id="Getting_Keyboard_Input_b">
+<title>Getting Keyboard Input</title>
+<!-- .XS -->
+<!-- (SN Getting Keyboard Input -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To get composed input from an input method,
+use
+<xref linkend='XmbLookupString' xrefstyle='select: title'/>
+or
+<xref linkend='XwcLookupString' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XmbLookupString</primary></indexterm>
+<indexterm significance="preferred"><primary>XwcLookupString</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XmbLookupString'>
+<funcprototype>
+  <funcdef>int <function>XmbLookupString</function></funcdef>
+  <paramdef>XIC<parameter> ic</parameter></paramdef>
+  <paramdef>XKeyPressedEvent<parameter> *event</parameter></paramdef>
+  <paramdef>char<parameter> *buffer_return</parameter></paramdef>
+  <paramdef>int<parameter> bytes_buffer</parameter></paramdef>
+  <paramdef>KeySym<parameter> *keysym_return</parameter></paramdef>
+  <paramdef>Status<parameter> *status_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<funcsynopsis id='XwcLookupString'>
+<funcprototype>
+  <funcdef>int <function>XwcLookupString</function></funcdef>
+  <paramdef>XIC<parameter> ic</parameter></paramdef>
+  <paramdef>XKeyPressedEvent<parameter> *event</parameter></paramdef>
+  <paramdef>wchar_t<parameter> *buffer_return</parameter></paramdef>
+  <paramdef>int<parameter> wchars_buffer</parameter></paramdef>
+  <paramdef>KeySym<parameter> *keysym_return</parameter></paramdef>
+  <paramdef>Status<parameter> *status_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ic</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the input context.
+<!-- .ds Ev key event to be used -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the (Ev.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>buffer_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns a multibyte string or wide character string (if any)
+from the input method.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>bytes_buffer</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>wchars_buffer</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies space available in the return buffer.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>keysym_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the KeySym computed from the event if this argument is not NULL.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>status_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns a value indicating what kind of data is returned.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XmbLookupString' xrefstyle='select: title'/>
+and
+<xref linkend='XwcLookupString' xrefstyle='select: title'/>
+functions return the string from the input method specified
+in the buffer_return argument.
+If no string is returned,
+the buffer_return argument is unchanged.
+</para>
+<para>
+<!-- .LP -->
+The KeySym into which the KeyCode from the event was mapped is returned
+in the keysym_return argument if it is non-NULL and the status_return
+argument indicates that a KeySym was returned.
+If both a string and a KeySym are returned,
+the KeySym value does not necessarily correspond to the string returned.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XmbLookupString' xrefstyle='select: title'/>
+returns the length of the string in bytes, and
+<xref linkend='XwcLookupString' xrefstyle='select: title'/>
+returns the length of the string in characters.
+Both
+<xref linkend='XmbLookupString' xrefstyle='select: title'/>
+and
+<xref linkend='XwcLookupString' xrefstyle='select: title'/>
+return text in the encoding of the locale bound to the input method
+of the specified input context.
+</para>
+<para>
+<!-- .LP -->
+Each string returned by
+<xref linkend='XmbLookupString' xrefstyle='select: title'/>
+and
+<xref linkend='XwcLookupString' xrefstyle='select: title'/>
+begins in the initial state of the encoding of the locale
+(if the encoding of the locale is state-dependent).
+<!-- .NT -->
+<note><para>
+To insure proper input processing,
+it is essential that the client pass only 
+<symbol>KeyPress</symbol>
+events to
+<xref linkend='XmbLookupString' xrefstyle='select: title'/>
+and
+<xref linkend='XwcLookupString' xrefstyle='select: title'/>.
+Their behavior when a client passes a 
+<symbol>KeyRelease</symbol>
+event is undefined.
+</para></note>
+<!-- .NE -->
+</para>
+<para>
+<!-- .LP -->
+Clients should check the status_return argument before
+using the other returned values.
+These two functions both return a value to status_return 
+that indicates what has been returned in the other arguments.
+The possible values returned are:
+</para>
+
+<informaltable frame='none'>
+  <?dbfo keep-together="auto" ?>
+  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='1.0*'/>
+  <colspec colname='c2' colwidth='2.0*'/>
+  <tbody>
+    <row>
+      <entry><symbol>XBufferOverflow</symbol></entry>
+      <entry>The input string to be returned is too large for the supplied buffer_return.
+      The required size
+      (<xref linkend='XmbLookupString' xrefstyle='select: title'/>
+      in bytes;
+      <xref linkend='XwcLookupString' xrefstyle='select: title'/>
+      in characters) is returned as the value of the function,
+      and the contents of buffer_return and keysym_return are not modified.
+      The client should recall the function with the same event
+      and a buffer of adequate size to obtain the string.</entry>
+    </row>
+    <row>
+      <entry><symbol>XLookupNone</symbol></entry>
+      <entry>No consistent input has been composed so far.
+      The contents of buffer_return and keysym_return are not modified, 
+      and the function returns zero.</entry>
+    </row>
+    <row>
+      <entry><symbol>XLookupChars</symbol></entry>
+      <entry>Some input characters have been composed.
+      They are placed in the buffer_return argument,
+      and the string length is returned as the value of the function.
+      The string is encoded in the locale bound to the input context.
+      The content of the keysym_return argument is not modified.</entry>
+    </row>
+    <row>
+      <entry><symbol>XLookupKeySym</symbol></entry>
+      <entry>A KeySym has been returned instead of a string
+      and is returned in keysym_return.
+      The content of the buffer_return argument is not modified,
+      and the function returns zero.</entry>
+    </row>
+    <row>
+      <entry><symbol>XLookupBoth</symbol></entry>
+      <entry>Both a KeySym and a string are returned;
+      <symbol>XLookupChars</symbol>
+      and
+      <symbol>XLookupKeySym</symbol>
+      occur simultaneously.</entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+<!-- .LP -->
+It does not make any difference if the input context passed as an argument to
+<xref linkend='XmbLookupString' xrefstyle='select: title'/>
+and
+<xref linkend='XwcLookupString' xrefstyle='select: title'/>
+is the one currently in possession of the focus or not.
+Input may have been composed within an input context before it lost the focus,
+and that input may be returned on subsequent calls to
+<xref linkend='XmbLookupString' xrefstyle='select: title'/>
+or
+<xref linkend='XwcLookupString' xrefstyle='select: title'/>
+even though it does not have any more keyboard focus.
+</para>
+</sect2>
+<sect2 id="Input_Method_Conventions">
+<title>Input Method Conventions</title>
+<!-- .XS -->
+<!-- (SN Input Method Conventions -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The input method architecture is transparent to the client.
+However, clients should respect a number of conventions in order
+to work properly.
+Clients must also be aware of possible effects of synchronization
+between input method and library in the case of a remote input server.
+</para>
+<sect3 id="Client_Conventions">
+<title>Client Conventions</title>
+<!-- .XS -->
+<!-- (SN Client Conventions -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+A well-behaved client (or toolkit) should first query the input method style.
+If the client cannot satisfy the requirements of the supported styles
+(in terms of geometry management or callbacks),
+it should negotiate with the user continuation of the program
+or raise an exception or error of some sort.
+</para>
+</sect3>
+<sect3 id="Synchronization_Conventions">
+<title>Synchronization Conventions</title>
+<!-- .XS -->
+<!-- (SN Synchronization Conventions -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+A 
+<symbol>KeyPress</symbol>
+event with a KeyCode of zero is used exclusively as a
+signal that an input method has composed input that can be returned by
+<xref linkend='XmbLookupString' xrefstyle='select: title'/>
+or
+<xref linkend='XwcLookupString' xrefstyle='select: title'/>.
+No other use is made of a 
+<symbol>KeyPress</symbol>
+event with KeyCode of zero.
+</para>
+<para>
+<!-- .LP -->
+Such an event may be generated by either a front-end
+or a back-end input method in an implementation-dependent manner.
+Some possible ways to generate this event include:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+A synthetic event sent by an input method server
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+An artificial event created by a input method filter and pushed
+onto a client's event queue
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+A 
+<symbol>KeyPress</symbol>
+event whose KeyCode value is modified by an input method filter
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+When callback support is specified by the client,
+input methods will not take action unless they explicitly
+called back the client and obtained no response
+(the callback is not specified or returned invalid data).
+</para>
+</sect3>
+</sect2>
+</sect1>
+<sect1 id="String_Constants">
+<title>String Constants</title>
+<!-- .XS -->
+<!-- (SN String Constants -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The following symbols for string constants are defined in
+<filename class="headerfile">&lt;X11/Xlib.h&gt;</filename>.
+Although they are shown here with particular macro definitions,
+they may be implemented as macros, as global symbols, or as a
+mixture of the two.  The string pointer value itself
+is not significant; clients must not assume that inequality of two
+values implies inequality of the actual string data.
+</para>
+
+<literallayout class="monospaced">
+#define XNVaNestedList                       "XNVaNestedList"
+#define XNSeparatorofNestedList              "separatorofNestedList"
+#define XNQueryInputStyle                    "queryInputStyle"
+#define XNClientWindow                       "clientWindow"
+#define XNInputStyle                         "inputStyle"
+#define XNFocusWindow                        "focusWindow"
+#define XNResourceName                       "resourceName"
+#define XNResourceClass                      "resourceClass"
+#define XNGeometryCallback                   "geometryCallback"
+#define XNDestroyCallback                    "destroyCallback"
+#define XNFilterEvents                       "filterEvents"
+#define XNPreeditStartCallback               "preeditStartCallback"
+#define XNPreeditDoneCallback                "preeditDoneCallback"
+#define XNPreeditDrawCallback                "preeditDrawCallback"
+#define XNPreeditCaretCallback               "preeditCaretCallback"
+#define XNPreeditStateNotifyCallback         "preeditStateNotifyCallback"
+#define XNPreeditAttributes                  "preeditAttributes"
+#define XNStatusStartCallback                "statusStartCallback"
+#define XNStatusDoneCallback                 "statusDoneCallback"
+#define XNStatusDrawCallback                 "statusDrawCallback"
+#define XNStatusAttributes                   "statusAttributes"
+#define XNArea                               "area"
+#define XNAreaNeeded                         "areaNeeded"
+#define XNSpotLocation                       "spotLocation"
+#define XNColormap                           "colorMap"
+#define XNStdColormap                        "stdColorMap"
+#define XNForeground                         "foreground"
+#define XNBackground                         "background"
+#define XNBackgroundPixmap                   "backgroundPixmap"
+#define XNFontSet                            "fontSet"
+#define XNLineSpace                          "lineSpace"
+#define XNCursor                             "cursor"
+#define XNQueryIMValuesList                  "queryIMValuesList"
+#define XNQueryICValuesList                  "queryICValuesList"
+#define XNStringConversionCallback           "stringConversionCallback"
+#define XNStringConversion                   "stringConversion"
+#define XNResetState                         "resetState"
+#define XNHotKey                             "hotkey"
+#define XNHotKeyState                        "hotkeyState"
+#define XNPreeditState                       "preeditState"
+#define XNVisiblePosition                    "visiblePosition"
+#define XNR6PreeditCallbackBehavior          "r6PreeditCallback"
+#define XNRequiredCharSet                    "requiredCharSet"
+#define XNQueryOrientation                   "queryOrientation"
+#define XNDirectionalDependentDrawing        "directionalDependentDrawing"
+#define XNContextualDrawing                  "contextualDrawing"
+#define XNBaseFontName                       "baseFontName"
+#define XNMissingCharSet                     "missingCharSet"
+#define XNDefaultString                      "defaultString"
+#define XNOrientation                        "orientation"
+#define XNFontInfo                           "fontInfo"
+#define XNOMAutomatic                        "omAutomatic"
+
+</literallayout>
+
+</sect1>
+</chapter>
diff --git a/specs/libX11/CH14.xml b/specs/libX11/CH14.xml
new file mode 100644 (file)
index 0000000..6dc947a
--- /dev/null
@@ -0,0 +1,5226 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+         "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
+<chapter id='Inter_Client_Communication_Functions'>
+<title>Inter-Client Communication Functions</title>
+<para>
+The <citetitle>Inter-Client Communication Conventions Manual</citetitle>,
+hereafter referred to as the <acronym>ICCCM</acronym>,
+details the X Consortium approved conventions that govern inter-client communications. These
+conventions ensure peer-to-peer client cooperation in the use of selections, cut buffers, and shared
+resources as well as client cooperation with window and session managers. For further information,
+see the <olink targetdoc='icccm' targetptr='icccm'><citetitle>Inter-Client Communication Conventions Manual</citetitle></olink>.
+</para>
+<para>
+Xlib provides a number of standard properties and programming interfaces that are <acronym>ICCCM</acronym>
+compliant. The predefined atoms for some of these properties are defined in the &lt;X11/Xatom.h&gt;
+header file, where to avoid name conflicts with user symbols their #define name has an XA_ prefix.
+For further information about atoms and properties,
+see <link linkend="Properties_and_Atoms">section 4.3</link>.
+</para>
+<para>
+Xlib’s selection and cut buffer mechanisms provide the primary programming interfaces by which
+peer client applications communicate with each other
+(see sections <link linkend="Selections">4.5</link> and
+<link linkend="Using_Cut_Buffers">16.6</link>). The functions
+discussed in this chapter provide the primary programming interfaces by which client applications
+communicate with their window and session managers as well as share standard colormaps.
+</para>
+<para>
+The standard properties that are of special interest for communicating with window and session
+managers are:
+</para>
+
+<informaltable frame='topbot'>
+  <?dbfo keep-together="always" ?>
+  <tgroup cols='4' align='left' colsep='0' rowsep='0'>
+  <colspec colname='c1' colwidth='3.0*'/>
+  <colspec colname='c2' colwidth='2.3*'/>
+  <colspec colname='c3' colwidth='0.9*'/>
+  <colspec colname='c4' colwidth='2.7*'/>
+  <thead>
+    <row rowsep='1'>
+      <entry>Name</entry>
+      <entry>Type</entry>
+      <entry>Format</entry>
+      <entry>Description</entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry><property>WM_CLASS</property></entry>
+      <entry>STRING</entry>
+      <entry>8</entry>
+      <entry>Set by application programs to allow
+      window and session managers to
+      obtain the application’s resources
+      from the resource database.
+      </entry>
+    </row>
+    <row>
+      <entry><property>WM_CLIENT_MACHINE</property></entry>
+      <entry>TEXT</entry>
+      <entry></entry>
+      <entry>The string name of the machine on
+      which the client application is running.
+      </entry>
+    </row>
+    <row>
+      <entry><property>WM_COLORMAP_WINDOWS</property></entry>
+      <entry>WINDOWS</entry>
+      <entry>32</entry>
+      <entry>The list of window IDs that may
+      need a different colormap from that
+      of their top-level window.
+      </entry>
+    </row>
+    <row>
+      <entry><property>WM_COMMAND</property></entry>
+      <entry>TEXT</entry>
+      <entry></entry>
+      <entry>The command and arguments, null
+      separated, used to invoke the application.
+      </entry>
+    </row>
+    <row>
+      <entry><property>WM_HINTS</property></entry>
+      <entry><property>WM_HINTS</property></entry>
+      <entry>32</entry>
+      <entry>Additional hints set by the client for
+      use by the window manager. The C
+      type of this property is XWMHints.
+      </entry> 
+    </row>
+    <row>
+      <entry><property>WM_ICON_NAME</property></entry>
+      <entry>TEXT</entry>
+      <entry></entry>
+      <entry>The name to be used in an icon.</entry>
+    </row>
+    <row>
+      <entry><property>WM_ICON_SIZE</property></entry>
+      <entry><property>WM_ICON_SIZE</property></entry>
+      <entry>32</entry>
+      <entry>The window manager may set this
+      property on the root window to
+      specify the icon sizes it supports.
+      The C type of this property is
+      XIconSize.
+      </entry>
+    </row>
+    <row>
+      <entry><property>WM_NAME</property></entry>
+      <entry>TEXT</entry>
+      <entry></entry>
+      <entry>The name of the application.</entry>
+    </row>
+    <row>
+      <entry><property>WM_NORMAL_HINTS</property></entry>
+      <entry><property>WM_NORMAL_HINTS</property></entry>
+      <entry>32</entry>
+      <entry>Size hints for a window in its
+      normal state. The C type of this
+      property is XSizeHints.
+      </entry>
+    </row>
+    <row>
+      <entry><property>WM_PROTOCOLS</property></entry>
+      <entry>ATOM</entry>
+      <entry>32</entry>
+      <entry>List of atoms that identify the 
+      communications protocols between the
+      client and window manager in
+      which the client is willing to participate.
+      </entry>
+    </row>
+    <row>
+      <entry><property>WM_STATE</property></entry>
+      <entry><property>WM_STATE</property></entry>
+      <entry>32</entry>
+      <entry>Intended for communication
+      between window and session managers only.
+      </entry>
+    </row>
+    <row>
+      <entry><property>WM_TRANSIENT_FOR</property></entry>
+      <entry>WINDOW</entry>
+      <entry>32</entry>
+      <entry>Set by application programs to 
+      indicate to the window manager that a
+      transient top-level window, such as a
+      dialog box.
+      </entry>
+    </row>
+  </tbody>
+  </tgroup>
+</informaltable>
+
+<para>
+The remainder of this chapter discusses:
+</para>
+
+<itemizedlist>
+  <listitem><para>Client to window manager communication</para></listitem>
+  <listitem><para>Client to session manager communication</para></listitem>
+  <listitem><para>Standard colormaps</para></listitem>
+</itemizedlist>
+
+<sect1 id="Client_to_Window_Manager_Communication">
+<title>Client to Window Manager Communication</title>
+<!-- .XS -->
+<!-- (SN Client to Window Manager Communication -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+This section discusses how to:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+Manipulate top-level windows
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Convert string lists
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Set and read text properties
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Set and read the <property>WM_NAME</property> property
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Set and read the <property>WM_ICON_NAME</property> property
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Set and read the <property>WM_HINTS</property> property
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Set and read the <property>WM_NORMAL_HINTS</property> property
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Set and read the <property>WM_CLASS</property> property
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Set and read the <property>WM_TRANSIENT_FOR</property> property
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Set and read the <property>WM_PROTOCOLS</property> property
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Set and read the <property>WM_COLORMAP_WINDOWS</property> property
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Set and read the <property>WM_ICON_SIZE</property> property
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Use window manager convenience functions
+    </para>
+  </listitem>
+</itemizedlist>
+<sect2 id="Manipulating_Top_Level_Windows">
+<title>Manipulating Top-Level Windows</title>
+<!-- .XS -->
+<!-- (SN Manipulating Top-Level Windows -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to change the visibility or size
+of top-level windows (that is, those that were created as children 
+of the root window).
+Note that the subwindows that you create are ignored by window managers.
+Therefore,
+you should use the basic window functions described in
+<link linkend='Window_Functions'>chapter 3</link>
+to manipulate your application's subwindows.
+</para>
+<para>
+<!-- .LP -->
+To request that a top-level window be iconified, use
+<xref linkend='XIconifyWindow' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XIconifyWindow</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XIconifyWindow'>
+<funcprototype>
+  <funcdef>Status <function>XIconifyWindow</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>int<parameter> screen_number</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen_number</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate screen number on the host server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The 
+<xref linkend='XIconifyWindow' xrefstyle='select: title'/>
+function sends a <property>WM_CHANGE_STATE</property> 
+<symbol>ClientMessage</symbol>
+event with a format of 32 and a first data element of 
+<symbol>IconicState</symbol>
+(as described in <olink targetdoc='icccm' targetptr='Changing_Window_State'
+>section 4.1.4 of the
+<citetitle>Inter-Client Communication Conventions Manual</citetitle></olink>)
+and a window of w
+to the root window of the specified screen
+with an event mask set to
+<symbol>SubstructureNotifyMask</symbol> |
+<symbol>SubstructureRedirectMask</symbol>.
+Window managers may elect to receive this message and
+if the window is in its normal state, 
+may treat it as a request to change the window's state from normal to iconic.
+If the <property>WM_CHANGE_STATE</property> property cannot be interned, 
+<xref linkend='XIconifyWindow' xrefstyle='select: title'/>
+does not send a message and returns a zero status.
+It returns a nonzero status if the client message is sent successfully;
+otherwise, it returns a zero status.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To request that a top-level window be withdrawn, use
+<xref linkend='XWithdrawWindow' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XWithdrawWindow</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XWithdrawWindow'>
+<funcprototype>
+  <funcdef>Status <function>XWithdrawWindow</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>int<parameter> screen_number</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen_number</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate screen number on the host server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The 
+<xref linkend='XWithdrawWindow' xrefstyle='select: title'/>
+function unmaps the specified window 
+and sends a synthetic 
+<symbol>UnmapNotify</symbol>
+event to the root window of the specified screen.
+Window managers may elect to receive this message 
+and may treat it as a request to change the window's state to withdrawn.
+When a window is in the withdrawn state, 
+neither its normal nor its iconic representations is visible.
+It returns a nonzero status if the 
+<symbol>UnmapNotify</symbol>
+event is successfully sent; 
+otherwise, it returns a zero status.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XWithdrawWindow' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To request that a top-level window be reconfigured, use
+<xref linkend='XReconfigureWMWindow' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XReconfigureWMWindow</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XReconfigureWMWindow'>
+<funcprototype>
+  <funcdef>Status <function>XReconfigureWMWindow</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>int<parameter> screen_number</parameter></paramdef>
+  <paramdef>unsignedint<parameter> value_mask</parameter></paramdef>
+  <paramdef>XWindowChanges<parameter> *values</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen_number</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the appropriate screen number on the host server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>value_mask</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies which values are to be set using information in
+the values structure.
+This mask is the bitwise inclusive OR of the valid configure window values bits.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>values</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the 
+<structname>XWindowChanges</structname>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The 
+<xref linkend='XReconfigureWMWindow' xrefstyle='select: title'/>
+function issues a 
+<systemitem>ConfigureWindow</systemitem>
+request on the specified top-level window.
+If the stacking mode is changed and the request fails with a 
+<errorname>BadMatch</errorname>
+error, 
+the error is trapped by Xlib and a synthetic 
+<systemitem class="event">ConfigureRequestEvent</systemitem>
+containing the same configuration parameters is sent to the root 
+of the specified window.
+Window managers may elect to receive this event 
+and treat it as a request to reconfigure the indicated window.
+It returns a nonzero status if the request or event is successfully sent;
+otherwise, it returns a zero status.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XReconfigureWMWindow' xrefstyle='select: title'/>
+can generate
+<errorname>BadValue</errorname>
+and 
+<errorname>BadWindow</errorname>
+errors.
+</para>
+</sect2>
+<sect2 id="Converting_String_Lists">
+<title>Converting String Lists</title>
+<!-- .XS -->
+<!-- (SN Converting String Lists -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Many of the text properties allow a variety of types and formats.
+Because the data stored in these properties are not
+simple null-terminated strings, an
+<structname>XTextProperty</structname>
+structure is used to describe the encoding, type, and length of the text 
+as well as its value.
+The
+<structname>XTextProperty</structname>
+structure contains:
+<indexterm significance="preferred"><primary>XTextProperty</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef struct {
+       unsigned char *value;   /* property data */
+       Atom encoding;  /* type of property */
+       int format;     /* 8, 16, or 32 */
+       unsigned long nitems;   /* number of items in value */
+} XTextProperty;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+Xlib provides functions to convert localized text to or from encodings
+that support the inter-client communication conventions for text.
+In addition, functions are provided for converting between lists of pointers 
+to character strings and text properties in the STRING encoding.
+</para>
+<para>
+<!-- .LP -->
+The functions for localized text return a signed integer error status 
+that encodes 
+<symbol>Success</symbol>
+as zero, specific error conditions as negative numbers, and partial conversion
+as a count of unconvertible characters.
+</para>
+
+<literallayout class="monospaced">
+
+#define #XNoMemory           -1
+#define #XLocaleNotSupported -2
+#define #XConverterNotFound  -3
+
+typedef enum {
+       XStringStyle,           /* STRING */
+       XCompoundTextStyle,     /* COMPOUND_TEXT */
+       XTextStyle,             /* text in owner's encoding (current locale) */
+       XStdICCTextStyle        /* STRING, else COMPOUND_TEXT */
+} XICCEncodingStyle;
+</literallayout>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To convert a list of text strings to an 
+<structname>XTextProperty</structname>
+structure, use
+<xref linkend='XmbTextListToTextProperty' xrefstyle='select: title'/>
+or
+<xref linkend='XwcTextListToTextProperty' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XmbTextListToTextProperty</primary></indexterm>
+<indexterm significance="preferred"><primary>XwcTextListToTextProperty</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XmbTextListToTextProperty'>
+<funcprototype>
+  <funcdef>int <function>XmbTextListToTextProperty</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>char<parameter> **list</parameter></paramdef>
+  <paramdef>int<parameter> count</parameter></paramdef>
+  <paramdef>XICCEncodingStyle<parameter> style</parameter></paramdef>
+  <paramdef>XTextProperty<parameter> *text_prop_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<funcsynopsis id='XwcTextListToTextProperty'>
+<funcprototype>
+  <funcdef>int <function>XwcTextListToTextProperty</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>wchar_t<parameter> **list</parameter></paramdef>
+  <paramdef>int<parameter> count</parameter></paramdef>
+  <paramdef>XICCEncodingStyle<parameter> style</parameter></paramdef>
+  <paramdef>XTextProperty<parameter> *text_prop_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>list</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a list of null-terminated character strings.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>count</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of strings specified.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>style</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the manner in which the property is encoded.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>text_prop_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the
+<structname>XTextProperty</structname>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XmbTextListToTextProperty' xrefstyle='select: title'/>
+and
+<xref linkend='XwcTextListToTextProperty' xrefstyle='select: title'/>
+functions set the specified 
+<structname>XTextProperty</structname>
+value to a set of null-separated elements representing the concatenation
+of the specified list of null-terminated text strings.
+A final terminating null is stored at the end of the value field 
+of text_prop_return but is not included in the nitems member.
+</para>
+<para>
+<!-- .LP -->
+The functions set the encoding field of text_prop_return to an
+<type>Atom</type>
+for the specified display 
+naming the encoding determined by the specified style
+and convert the specified text list to this encoding for storage in
+the text_prop_return value field.
+If the style 
+<constant>XStringStyle</constant>
+or 
+<constant>XCompoundTextStyle</constant>
+is specified,
+this encoding is ``STRING'' or ``COMPOUND_TEXT'', respectively.
+If the style 
+<constant>XTextStyle</constant>
+is specified,
+this encoding is the encoding of the current locale.
+If the style 
+<constant>XStdICCTextStyle</constant>
+is specified,
+this encoding is ``STRING'' if the text is fully convertible to STRING,
+else ``COMPOUND_TEXT''.
+</para>
+<para>
+<!-- .LP -->
+If insufficient memory is available for the new value string,
+the functions return 
+<symbol>XNoMemory</symbol>.
+If the current locale is not supported,
+the functions return 
+<symbol>XLocaleNotSupported</symbol>.
+In both of these error cases,
+the functions do not set text_prop_return.
+</para>
+<para>
+<!-- .LP -->
+To determine if the functions are guaranteed not to return
+<symbol>XLocaleNotSupported</symbol>,
+use
+<function>XSupportsLocale</function>.
+</para>
+<para>
+<!-- .LP -->
+If the supplied text is not fully convertible to the specified encoding,
+the functions return the number of unconvertible characters.
+Each unconvertible character is converted to an implementation-defined and
+encoding-specific default string.
+Otherwise, the functions return 
+<symbol>Success</symbol>.
+Note that full convertibility to all styles except 
+<constant>XStringStyle</constant>
+is guaranteed.
+</para>
+<para>
+<!-- .LP -->
+To free the storage for the value field, use
+<xref linkend='XFree' xrefstyle='select: title'/>.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To obtain a list of text strings from an 
+<structname>XTextProperty</structname>
+structure, use
+<xref linkend='XmbTextPropertyToTextList' xrefstyle='select: title'/>
+or
+<xref linkend='XwcTextPropertyToTextList' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XmbTextPropertyToTextList</primary></indexterm>
+<indexterm significance="preferred"><primary>XwcTextPropertyToTextList</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XmbTextPropertyToTextList'>
+<funcprototype>
+  <funcdef>int <function>XmbTextPropertyToTextList</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XTextProperty<parameter> *text_prop</parameter></paramdef>
+  <paramdef>char<parameter> ***list_return</parameter></paramdef>
+  <paramdef>int<parameter> *count_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<funcsynopsis id='XwcTextPropertyToTextList'>
+<funcprototype>
+  <funcdef>int <function>XwcTextPropertyToTextList</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XTextProperty<parameter> *text_prop</parameter></paramdef>
+  <paramdef>wchar_t<parameter> ***list_return</parameter></paramdef>
+  <paramdef>int<parameter> *count_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>text_prop</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the
+<structname>XTextProperty</structname>
+structure to be used.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>list_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns a list of null-terminated character strings.
+<!-- .ds Cn strings -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>count_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the number of (Cn.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The 
+<xref linkend='XmbTextPropertyToTextList' xrefstyle='select: title'/>
+and 
+<xref linkend='XwcTextPropertyToTextList' xrefstyle='select: title'/>
+functions return a list of text strings in the current locale representing the
+null-separated elements of the specified
+<structname>XTextProperty</structname>
+structure.
+The data in text_prop must be format 8.
+</para>
+<para>
+<!-- .LP -->
+Multiple elements of the property (for example, the strings in a disjoint
+text selection) are separated by a null byte.
+The contents of the property are not required to be null-terminated;
+any terminating null should not be included in text_prop.nitems.
+</para>
+<para>
+<!-- .LP -->
+If insufficient memory is available for the list and its elements,
+<xref linkend='XmbTextPropertyToTextList' xrefstyle='select: title'/>
+and
+<xref linkend='XwcTextPropertyToTextList' xrefstyle='select: title'/>
+return 
+<symbol>XNoMemory</symbol>.
+If the current locale is not supported,
+the functions return
+<symbol>XLocaleNotSupported</symbol>.
+Otherwise, if the encoding field of text_prop is not convertible 
+to the encoding of the current locale,
+the functions return
+<symbol>XConverterNotFound</symbol>.
+For supported locales,
+existence of a converter from COMPOUND_TEXT, STRING
+or the encoding of the current locale is guaranteed if
+<function>XSupportsLocale</function>
+returns 
+<symbol>True</symbol>
+for the current locale (but the actual text
+may contain unconvertible characters).
+Conversion of other encodings is implementation-dependent.
+In all of these error cases,
+the functions do not set any return values.
+</para>
+<para>
+<!-- .LP -->
+Otherwise, 
+<xref linkend='XmbTextPropertyToTextList' xrefstyle='select: title'/>
+and
+<xref linkend='XwcTextPropertyToTextList' xrefstyle='select: title'/>
+return the list of null-terminated text strings to list_return
+and the number of text strings to count_return.
+</para>
+<para>
+<!-- .LP -->
+If the value field of text_prop is not fully convertible to the encoding of
+the current locale,
+the functions return the number of unconvertible characters.
+Each unconvertible character is converted to a string in the
+current locale that is specific to the current locale.
+To obtain the value of this string, 
+use
+<function>XDefaultString</function>.
+Otherwise,
+<xref linkend='XmbTextPropertyToTextList' xrefstyle='select: title'/>
+and
+<xref linkend='XwcTextPropertyToTextList' xrefstyle='select: title'/>
+return 
+<symbol>Success</symbol>.
+</para>
+<para>
+<!-- .LP -->
+To free the storage for the list and its contents returned by
+<xref linkend='XmbTextPropertyToTextList' xrefstyle='select: title'/>,
+use
+<xref linkend='XFreeStringList' xrefstyle='select: title'/>.
+To free the storage for the list and its contents returned by
+<xref linkend='XwcTextPropertyToTextList' xrefstyle='select: title'/>,
+use
+<xref linkend='XwcFreeStringList' xrefstyle='select: title'/>.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To free the in-memory data associated with the specified
+wide character string list, use
+<xref linkend='XwcFreeStringList' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XwcFreeStringList</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XwcFreeStringList'>
+<funcprototype>
+  <funcdef>void <function>XwcFreeStringList</function></funcdef>
+  <paramdef>wchar_t<parameter> **list</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>list</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the list of strings to be freed.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XwcFreeStringList' xrefstyle='select: title'/>
+function frees memory allocated by
+<xref linkend='XwcTextPropertyToTextList' xrefstyle='select: title'/>.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To obtain the default string for text conversion in the current locale,
+use</para>
+
+<para>char *XDefaultString()</para>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<function>XDefaultString</function>
+function returns the default string used by Xlib for text conversion
+(for example, in 
+<xref linkend='XmbTextPropertyToTextList' xrefstyle='select: title'/>).
+The default string is the string in the current locale that is output 
+when an unconvertible character is found during text conversion.
+If the string returned by
+<function>XDefaultString</function>
+is the empty string (""),
+no character is output in the converted text.
+<function>XDefaultString</function>
+does not return NULL.
+</para>
+<para>
+<!-- .LP -->
+The string returned by 
+<function>XDefaultString</function>
+is independent of the default string for text drawing;
+see 
+<xref linkend='XCreateFontSet' xrefstyle='select: title'/>
+to obtain the default string for an
+<type>XFontSet</type>.
+</para>
+<para>
+<!-- .LP -->
+The behavior when an invalid codepoint is supplied to any Xlib function is
+undefined.
+</para>
+<para>
+<!-- .LP -->
+The returned string is null-terminated.
+It is owned by Xlib and should not be modified or freed by the client.
+It may be freed after the current locale is changed.
+Until freed, it will not be modified by Xlib.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To set the specified list of strings in the STRING encoding to a 
+<structname>XTextProperty</structname>
+structure, use
+<xref linkend='XStringListToTextProperty' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XStringListToTextProperty</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XStringListToTextProperty'>
+<funcprototype>
+  <funcdef>Status <function>XStringListToTextProperty</function></funcdef>
+  <paramdef>char<parameter> **list</parameter></paramdef>
+  <paramdef>int<parameter> count</parameter></paramdef>
+  <paramdef>XTextProperty<parameter> *text_prop_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>list</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a list of null-terminated character strings.
+<!-- .ds Cn strings -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>count</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of (Cn.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>text_prop_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the
+<structname>XTextProperty</structname>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The 
+<xref linkend='XStringListToTextProperty' xrefstyle='select: title'/>
+function sets the specified 
+<structname>XTextProperty</structname>
+to be of type STRING (format 8) with a value representing the
+concatenation of the specified list of null-separated character strings.
+An extra null byte (which is not included in the nitems member) 
+is stored at the end of the value field of text_prop_return.
+The strings are assumed (without verification) to be in the STRING encoding.
+If insufficient memory is available for the new value string, 
+<xref linkend='XStringListToTextProperty' xrefstyle='select: title'/>
+does not set any fields in the
+<structname>XTextProperty</structname>
+structure and returns a zero status.
+Otherwise, it returns a nonzero status.
+To free the storage for the value field, use 
+<xref linkend='XFree' xrefstyle='select: title'/>.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To obtain a list of strings from a specified
+<structname>XTextProperty</structname>
+structure in the STRING encoding, use
+<xref linkend='XTextPropertyToStringList' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XTextPropertyToStringList</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XTextPropertyToStringList'>
+<funcprototype>
+  <funcdef>Status <function>XTextPropertyToStringList</function></funcdef>
+  <paramdef>XTextProperty<parameter> *text_prop</parameter></paramdef>
+  <paramdef>char<parameter> ***list_return</parameter></paramdef>
+  <paramdef>int<parameter> *count_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>text_prop</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the
+<structname>XTextProperty</structname>
+structure to be used.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>list_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns a list of null-terminated character strings.
+<!-- .ds Cn strings -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>count_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the number of (Cn.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The 
+<xref linkend='XTextPropertyToStringList' xrefstyle='select: title'/>
+function returns a list of strings representing the null-separated elements 
+of the specified
+<structname>XTextProperty</structname>
+structure.
+The data in text_prop must be of type STRING and format 8. 
+Multiple elements of the property 
+(for example, the strings in a disjoint text selection) 
+are separated by NULL (encoding 0).
+The contents of the property are not null-terminated.
+If insufficient memory is available for the list and its elements, 
+<xref linkend='XTextPropertyToStringList' xrefstyle='select: title'/>
+sets no return values and returns a zero status.
+Otherwise, it returns a nonzero status.
+To free the storage for the list and its contents, use 
+<xref linkend='XFreeStringList' xrefstyle='select: title'/>.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To free the in-memory data associated with the specified string list, use
+<xref linkend='XFreeStringList' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XFreeStringList</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XFreeStringList'>
+<funcprototype>
+  <funcdef>void <function>XFreeStringList</function></funcdef>
+  <paramdef>char<parameter> **list</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>list</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the list of strings to be freed.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The 
+<xref linkend='XFreeStringList' xrefstyle='select: title'/>
+function releases memory allocated by 
+<xref linkend='XmbTextPropertyToTextList' xrefstyle='select: title'/>
+and
+<xref linkend='XTextPropertyToStringList' xrefstyle='select: title'/>
+and the missing charset list allocated by 
+<xref linkend='XCreateFontSet' xrefstyle='select: title'/>.
+</para>
+</sect2>
+<sect2 id="Setting_and_Reading_Text_Properties">
+<title>Setting and Reading Text Properties</title>
+<!-- .XS -->
+<!-- (SN Setting and Reading Text Properties -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides two functions that you can use to set and read
+the text properties for a given window.
+You can use these functions to set and read those properties of type TEXT
+(<property>WM_NAME</property>, <property>WM_ICON_NAME</property>, <property>WM_COMMAND</property>, and <property>WM_CLIENT_MACHINE</property>).
+In addition,
+Xlib provides separate convenience functions that you can use to set each 
+of these properties.
+For further information about these convenience functions,
+see sections
+<link linkend="Setting_and_Reading_the_WM_NAME_Property">14.1.4</link>,
+<link linkend="Setting_and_Reading_the_WM_ICON_NAME_Property">14.1.5</link>,
+<link linkend="Setting_and_Reading_the_WM_COMMAND_Property">14.2.1</link>, and
+<link linkend="Setting_and_Reading_the_WM_CLIENT_MACHINE_Property">14.2.2</link>,
+respectively.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To set one of a window's text properties, use
+<xref linkend='XSetTextProperty' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetTextProperty</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetTextProperty'>
+<funcprototype>
+  <funcdef>void <function>XSetTextProperty</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>XTextProperty<parameter> *text_prop</parameter></paramdef>
+  <paramdef>Atom<parameter> property</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>text_prop</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the
+<structname>XTextProperty</structname>
+structure to be used.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>property</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the property name.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetTextProperty' xrefstyle='select: title'/>
+function replaces the existing specified property for the named window 
+with the data, type, format, and number of items determined 
+by the value field, the encoding field, the format field, 
+and the nitems field, respectively, of the specified
+<structname>XTextProperty</structname>
+structure.
+If the property does not already exist,
+<xref linkend='XSetTextProperty' xrefstyle='select: title'/>
+sets it for the specified window.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetTextProperty' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>,
+<errorname>BadAtom</errorname>,
+<errorname>BadValue</errorname>,
+and 
+<errorname>BadWindow</errorname>
+errors.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To read one of a window's text properties, use
+<xref linkend='XGetTextProperty' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetTextProperty</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetTextProperty'>
+<funcprototype>
+  <funcdef>Status <function>XGetTextProperty</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>XTextProperty<parameter> *text_prop_return</parameter></paramdef>
+  <paramdef>Atom<parameter> property</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>text_prop_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the
+<structname>XTextProperty</structname>
+structure.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>property</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the property name.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetTextProperty' xrefstyle='select: title'/>
+function reads the specified property from the window
+and stores the data in the returned
+<structname>XTextProperty</structname>
+structure.
+It stores the data in the value field,
+the type of the data in the encoding field,
+the format of the data in the format field, 
+and the number of items of data in the nitems field.
+An extra byte containing null (which is not included in the nitems member) 
+is stored at the end of the value field of text_prop_return.
+The particular interpretation of the property's encoding 
+and data as text is left to the calling application.
+If the specified property does not exist on the window,
+<xref linkend='XGetTextProperty' xrefstyle='select: title'/>
+sets the value field to NULL, 
+the encoding field to
+<symbol>None</symbol>,
+the format field to zero, 
+and the nitems field to zero.
+</para>
+<para>
+<!-- .LP -->
+If it was able to read and store the data in the
+<structname>XTextProperty</structname>
+structure,
+<xref linkend='XGetTextProperty' xrefstyle='select: title'/>
+returns a nonzero status; 
+otherwise, it returns a zero status.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGetTextProperty' xrefstyle='select: title'/>
+can generate
+<errorname>BadAtom</errorname>
+and 
+<errorname>BadWindow</errorname>
+errors.
+</para>
+</sect2>
+<sect2 id="Setting_and_Reading_the_WM_NAME_Property">
+<title>Setting and Reading the WM_NAME Property</title>
+<!-- .XS -->
+<!-- (SN Setting and Reading the WM_NAME Property -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides convenience functions that you can use to set and read 
+the <property>WM_NAME</property> property for a given window.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To set a window's <property>WM_NAME</property> property with the supplied convenience function, use
+<xref linkend='XSetWMName' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetWMName</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetWMName'>
+<funcprototype>
+  <funcdef>void <function>XSetWMName</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>XTextProperty<parameter> *text_prop</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>text_prop</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the
+<structname>XTextProperty</structname>
+structure to be used.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetWMName' xrefstyle='select: title'/>
+convenience function calls
+<xref linkend='XSetTextProperty' xrefstyle='select: title'/>
+to set the <property>WM_NAME</property> property.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To read a window's <property>WM_NAME</property> property with the supplied convenience function, use
+<xref linkend='XGetWMName' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetWMName</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetWMName'>
+<funcprototype>
+  <funcdef>Status <function>XGetWMName</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>XTextProperty<parameter> *text_prop_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>text_prop_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the
+<structname>XTextProperty</structname>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetWMName' xrefstyle='select: title'/>
+convenience function calls
+<xref linkend='XGetTextProperty' xrefstyle='select: title'/>
+to obtain the <property>WM_NAME</property> property.
+It returns a nonzero status on success;
+otherwise, it returns a zero status.
+</para>
+<para>
+<!-- .LP -->
+The following two functions have been superseded by
+<xref linkend='XSetWMName' xrefstyle='select: title'/>
+and
+<xref linkend='XGetWMName' xrefstyle='select: title'/>,
+respectively. 
+You can use these additional convenience functions 
+for window names that are encoded as STRING properties.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To assign a name to a window, use
+<xref linkend='XStoreName' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Window</primary><secondary>name</secondary></indexterm>
+<indexterm significance="preferred"><primary>XStoreName</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XStoreName'>
+<funcprototype>
+  <funcdef><function>XStoreName</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>char<parameter> *window_name</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>window_name</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window name,
+which should be a null-terminated string.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XStoreName' xrefstyle='select: title'/>
+function assigns the name passed to window_name to the specified window.
+A window manager can display the window name in some prominent
+place, such as the title bar, to allow users to identify windows easily.
+Some window managers may display a window's name in the window's icon,
+although they are encouraged to use the window's icon name
+if one is provided by the application.
+If the string is not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XStoreName' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To get the name of a window, use
+<xref linkend='XFetchName' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XFetchName</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XFetchName'>
+<funcprototype>
+  <funcdef>Status <function>XFetchName</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>char<parameter> **window_name_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>window_name_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the window name, which is a null-terminated string.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XFetchName' xrefstyle='select: title'/>
+function returns the name of the specified window.
+If it succeeds,
+it returns a nonzero status; 
+otherwise, no name has been set for the window,
+and it returns zero.
+If the <property>WM_NAME</property> property has not been set for this window,
+<xref linkend='XFetchName' xrefstyle='select: title'/>
+sets window_name_return to NULL.
+If the data returned by the server is in the Latin Portable Character Encoding,
+then the returned string is in the Host Portable Character Encoding.
+Otherwise, the result is implementation-dependent.
+When finished with it, a client must free
+the window name string using
+<xref linkend='XFree' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XFetchName' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+</sect2>
+<sect2 id="Setting_and_Reading_the_WM_ICON_NAME_Property">
+<title>Setting and Reading the WM_ICON_NAME Property</title>
+<!-- .XS -->
+<!-- (SN Setting and Reading the WM_ICON_NAME Property -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides convenience functions that you can use to set and read 
+the <property>WM_ICON_NAME</property> property for a given window.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set a window's <property>WM_ICON_NAME</property> property,
+use
+<xref linkend='XSetWMIconName' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetWMIconName</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetWMIconName'>
+<funcprototype>
+  <funcdef>void <function>XSetWMIconName</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>XTextProperty<parameter> *text_prop</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>text_prop</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the
+<structname>XTextProperty</structname>
+structure to be used.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetWMIconName' xrefstyle='select: title'/>
+convenience function calls
+<xref linkend='XSetTextProperty' xrefstyle='select: title'/>
+to set the <property>WM_ICON_NAME</property> property.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To read a window's <property>WM_ICON_NAME</property> property,
+use
+<xref linkend='XGetWMIconName' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetWMIconName</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetWMIconName'>
+<funcprototype>
+  <funcdef>Status <function>XGetWMIconName</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>XTextProperty<parameter> *text_prop_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>text_prop_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the
+<structname>XTextProperty</structname>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The 
+<xref linkend='XGetWMIconName' xrefstyle='select: title'/>
+convenience function calls
+<xref linkend='XGetTextProperty' xrefstyle='select: title'/>
+to obtain the <property>WM_ICON_NAME</property> property.
+It returns a nonzero status on success;
+otherwise, it returns a zero status.
+</para>
+<para>
+<!-- .LP -->
+The next two functions have been superseded by
+<xref linkend='XSetWMIconName' xrefstyle='select: title'/>
+and
+<xref linkend='XGetWMIconName' xrefstyle='select: title'/>,
+respectively.
+You can use these additional convenience functions 
+for window names that are encoded as STRING properties.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set the name to be displayed in a window's icon, use
+<xref linkend='XSetIconName' xrefstyle='select: title'/>.
+</para>
+<indexterm><primary>Window</primary><secondary>icon name</secondary></indexterm>
+<indexterm significance="preferred"><primary>XSetIconName</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetIconName'>
+<funcprototype>
+  <funcdef><function>XSetIconName</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>char<parameter> *icon_name</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>icon_name</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the icon name,
+which should be a null-terminated string.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+If the string is not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+<xref linkend='XSetIconName' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To get the name a window wants displayed in its icon, use
+<xref linkend='XGetIconName' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetIconName</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetIconName'>
+<funcprototype>
+  <funcdef>Status <function>XGetIconName</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>char<parameter> **icon_name_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>icon_name_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the window's icon name,
+which is a null-terminated string.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetIconName' xrefstyle='select: title'/>
+function returns the name to be displayed in the specified window's icon.
+If it succeeds, it returns a nonzero status; otherwise, 
+if no icon name has been set for the window,
+it returns zero.
+If you never assigned a name to the window,
+<xref linkend='XGetIconName' xrefstyle='select: title'/>
+sets icon_name_return to NULL.
+If the data returned by the server is in the Latin Portable Character Encoding,
+then the returned string is in the Host Portable Character Encoding.
+Otherwise, the result is implementation-dependent.
+When finished with it, a client must free
+the icon name string using
+<xref linkend='XFree' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGetIconName' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+</sect2>
+<sect2 id="Setting_and_Reading_the_WM_HINTS_Property">
+<title>Setting and Reading the WM_HINTS Property</title>
+<!-- .XS -->
+<!-- (SN Setting and Reading the WM_HINTS Property -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to set and read 
+the <property>WM_HINTS</property> property for a given window.
+These functions use the flags and the
+<structname>XWMHints</structname>
+structure, as defined in the
+<filename class="headerfile">&lt;X11/Xutil.h&gt;</filename>
+<indexterm type="file"><primary><filename class="headerfile">X11/Xutil.h</filename></primary></indexterm>
+<indexterm><primary>Files</primary><secondary><filename class="headerfile">&lt;X11/Xutil.h&gt;</filename></secondary></indexterm>
+<indexterm><primary>Headers</primary><secondary><filename class="headerfile">&lt;X11/Xutil.h&gt;</filename></secondary></indexterm>
+header file.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To allocate an
+<structname>XWMHints</structname>
+structure, use
+<function>XAllocWMHints</function>.
+</para>
+
+<para>
+  XWMHints *XAllocWMHints()
+</para>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<function>XAllocWMHints</function>
+function allocates and returns a pointer to an
+<structname>XWMHints</structname>
+structure.
+Note that all fields in the
+<structname>XWMHints</structname>
+structure are initially set to zero.
+If insufficient memory is available, 
+<function>XAllocWMHints</function>
+returns NULL.
+To free the memory allocated to this structure,
+use
+<xref linkend='XFree' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+The
+<structname>XWMHints</structname>
+structure contains:
+</para>
+
+<literallayout class="monospaced">
+/* Window manager hints mask bits */
+
+#define         InputHint             (1L&lt;&lt;0)
+#define         StateHint             (1L&lt;&lt;1)
+#define         IconPixmapHint        (1L&lt;&lt;2)
+#define         IconWindowHint        (1L&lt;&lt;3)
+#define         IconPositionHint      (1L&lt;&lt;4)
+#define         IconMaskHint          (1L&lt;&lt;5)
+#define         WindowGroupHint       (1L&lt;&lt;6)
+#define         UrgencyHint           (1L&lt;&lt;8)
+#define         AllHints              (InputHint|StateHint|IconPixmapHint|
+                                       IconWIndowHint|IconPositionHint|
+                                       IconMaskHint|WindowGroupHint)
+
+
+/* Values */
+
+typedef struct {
+       long flags;             /* marks which fields in this structure are defined */
+       Bool input;             /* does this application rely on the window manager to
+                                  get keyboard input? */
+       int initial_state;      /* see below */
+       Pixmap icon_pixmap;     /* pixmap to be used as icon */
+       Window icon_window;     /* window to be used as icon */
+       int icon_x, icon_y;     /* initial position of icon */
+       Pixmap icon_mask;       /* pixmap to be used as mask for icon_pixmap */
+       XID window_group;       /* id of related window group */
+       /* this structure may be extended in the future */
+} XWMHints;
+</literallayout>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The input member is used to communicate to the window manager the input focus
+model used by the application.
+Applications that expect input but never explicitly set focus to any 
+of their subwindows (that is, use the push model of focus management), 
+such as X Version 10 style applications that use real-estate
+driven focus, should set this member to 
+<symbol>True</symbol>.
+Similarly, applications
+that set input focus to their subwindows only when it is given to their
+top-level window by a window manager should also set this member to 
+<symbol>True</symbol>.
+Applications that manage their own input focus by explicitly setting
+focus to one of their subwindows whenever they want keyboard input 
+(that is, use the pull model of focus management) should set this member to 
+<symbol>False</symbol>.
+Applications that never expect any keyboard input also should set this member
+to 
+<symbol>False</symbol>.
+</para>
+<para>
+<!-- .LP -->
+Pull model window managers should make it possible for push model
+applications to get input by setting input focus to the top-level windows of
+applications whose input member is 
+<symbol>True</symbol>.
+Push model window managers should
+make sure that pull model applications do not break them 
+by resetting input focus to 
+<symbol>PointerRoot</symbol>
+when it is appropriate (for example, whenever an application whose
+input member is 
+<symbol>False</symbol>
+sets input focus to one of its subwindows).
+</para>
+<para>
+<!-- .LP -->
+The definitions for the initial_state flag are:
+</para>
+
+<literallayout class="monospaced">
+#define      WithdrawnState 0
+#define      NormalState    1   /* most applications start this way */
+#define      IconicState    2   /* application wants to start as an icon */
+
+</literallayout>
+<para>
+The icon_mask specifies which pixels of the icon_pixmap should be used as the
+icon.  
+This allows for nonrectangular icons.
+Both icon_pixmap and icon_mask must be bitmaps.
+The icon_window lets an application provide a window for use as an icon
+for window managers that support such use.
+The window_group lets you specify that this window belongs to a group
+of other windows.
+For example, if a single application manipulates multiple 
+top-level windows, this allows you to provide enough
+information that a window manager can iconify all of the windows
+rather than just the one window.
+</para>
+<para>
+<!-- .LP -->
+The
+<symbol>UrgencyHint</symbol>
+flag, if set in the flags field, indicates that the client deems the window
+contents to be urgent, requiring the timely response of the user.  The
+window manager will make some effort to draw the user's attention to this
+window while this flag is set.  The client must provide some means by which the
+user can cause the urgency flag to be cleared (either mitigating
+the condition that made the window urgent or merely shutting off the alarm)
+or the window to be withdrawn.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set a window's <property>WM_HINTS</property> property, use
+<xref linkend='XSetWMHints' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetWMHints</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetWMHints'>
+<funcprototype>
+  <funcdef><function>XSetWMHints</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>XWMHints<parameter> *wmhints</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>wmhints</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the 
+<structname>XWMHints</structname>
+structure to be used.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetWMHints' xrefstyle='select: title'/>
+function sets the window manager hints that include icon information and location,
+the initial state of the window, and whether the application relies on the
+window manager to get keyboard input.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetWMHints' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To read a window's <property>WM_HINTS</property> property, use
+<xref linkend='XGetWMHints' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetWMHints</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetWMHints'>
+<funcprototype>
+  <funcdef>XWMHints *<function>XGetWMHints</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetWMHints' xrefstyle='select: title'/>
+function reads the window manager hints and 
+returns NULL if no <property>WM_HINTS</property> property was set on the window 
+or returns a pointer to an 
+<structname>XWMHints</structname>
+structure if it succeeds.
+When finished with the data,
+free the space used for it by calling
+<xref linkend='XFree' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGetWMHints' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+</sect2>
+<sect2 id="Setting_and_Reading_the_WM_NORMAL_HINTS_Property">
+<title>Setting and Reading the WM_NORMAL_HINTS Property</title>
+<!-- .XS -->
+<!-- (SN Setting and Reading the WM_NORMAL_HINTS Property -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to set or read 
+the <property>WM_NORMAL_HINTS</property> property for a given window.
+The functions use the flags and the
+<structname>XSizeHints</structname>
+structure, as defined in the
+<filename class="headerfile">&lt;X11/Xutil.h&gt;</filename>
+<indexterm type="file"><primary><filename class="headerfile">X11/Xutil.h</filename></primary></indexterm>
+<indexterm><primary>Files</primary><secondary><filename class="headerfile">&lt;X11/Xutil.h&gt;</filename></secondary></indexterm>
+<indexterm><primary>Headers</primary><secondary><filename class="headerfile">&lt;X11/Xutil.h&gt;</filename></secondary></indexterm>
+header file.
+</para>
+<para>
+<!-- .LP -->
+The size of the
+<structname>XSizeHints</structname>
+structure may grow in future releases, as new components are
+added to support new <acronym>ICCCM</acronym> features.
+Passing statically allocated instances of this structure into
+Xlib may result in memory corruption when running against a
+future release of the library.
+As such, it is recommended that only dynamically allocated
+instances of the structure be used.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To allocate an
+<structname>XSizeHints</structname>
+structure, use
+<function>XAllocSizeHints</function>.
+</para>
+
+<para>
+XSizeHints *XAllocSizeHints()
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<function>XAllocSizeHints</function>
+function allocates and returns a pointer to an
+<structname>XSizeHints</structname>
+structure.
+Note that all fields in the
+<structname>XSizeHints</structname>
+structure are initially set to zero.
+If insufficient memory is available, 
+<function>XAllocSizeHints</function>
+returns NULL.
+To free the memory allocated to this structure,
+use
+<xref linkend='XFree' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+The
+<structname>XSizeHints</structname>
+structure contains:
+</para>
+
+
+<literallayout class="monospaced">
+/* Size hints mask bits */
+
+#define           USPosition         (1L&lt;&lt;0)  /* user specified x,y */
+#define           USSize             (1L&lt;&lt;1)  /* user specified width,height */
+#define           PPosition          (1L&lt;&lt;2)  /* program specified posistion */
+#define           PSize              (1L&lt;&lt;3)  /* program specified size */
+#define           PMinSize           (1L&lt;&lt;4)  /* program specified minimum size */
+#define           PMaxSize           (1L&lt;&lt;5)  /* program specified maximum size */
+#define           PResizeInc         (1L&lt;&lt;5)  /* program specified resize increments */
+#define           PAspect            (1L&lt;&lt;6)  /* program specified min and max aspect ratios */
+#define           PBaseSize          (1L&lt;&lt;8)
+#define           PWinGravity        (1L&lt;&lt;9)
+#define           PAllHints          (PPosition|Psize|
+                                      PMinSize|PMaxSize|
+                                      PResizeInc|PAspect)
+
+
+/* Values */
+
+typedef struct {
+       long flags;             /* marks which fields in this structure are defined */
+       int x, y;               /* Obsolete */
+       int width, height;      /* Obsolete */
+       int min_width, min_height;
+       int max_width, max_height;
+       int width_inc, height_inc;
+       struct {
+              int x;           /* numerator */
+              int y;           /* denominator */
+       } min_aspect, max_aspect;
+       int base_width, base_height;
+       int win_gravity;
+       /* this structure may be extended in the future */
+} XSizeHints;
+</literallayout>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The x, y, width, and height members are now obsolete
+and are left solely for compatibility reasons.
+The min_width and min_height members specify the
+minimum window size that still allows the application to be useful.
+The max_width and max_height members specify the maximum window size.
+The width_inc and height_inc members define an arithmetic progression of
+sizes (minimum to maximum) into which the window prefers to be resized.
+The min_aspect and max_aspect members are expressed
+as ratios of x and y, 
+and they allow an application to specify the range of aspect
+ratios it prefers.
+The base_width and base_height members define the desired size of the window.
+The window manager will interpret the position of the window 
+and its border width to position the point of the outer rectangle 
+of the overall window specified by the win_gravity member.
+The outer rectangle of the window includes any borders or decorations
+supplied by the window manager.
+In other words,
+if the window manager decides to place the window where the client asked,
+the position on the parent window's border named by the win_gravity 
+will be placed where the client window would have been placed 
+in the absence of a window manager.
+</para>
+<para>
+<!-- .LP -->
+Note that use of the
+<symbol>PAllHints</symbol>
+macro is highly discouraged.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To set a window's <property>WM_NORMAL_HINTS</property> property, use
+<xref linkend='XSetWMNormalHints' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetWMNormalHints</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetWMNormalHints'>
+<funcprototype>
+  <funcdef>void <function>XSetWMNormalHints</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>XSizeHints<parameter> *hints</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>hints</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the size hints for the window in its normal state.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The 
+<xref linkend='XSetWMNormalHints' xrefstyle='select: title'/>
+function replaces the size hints for the <property>WM_NORMAL_HINTS</property> property 
+on the specified window.
+If the property does not already exist,
+<xref linkend='XSetWMNormalHints' xrefstyle='select: title'/>
+sets the size hints for the <property>WM_NORMAL_HINTS</property> property on the specified window.
+The property is stored with a type of <property>WM_SIZE_HINTS</property> and a format of 32.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetWMNormalHints' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To read a window's <property>WM_NORMAL_HINTS</property> property, use
+<xref linkend='XGetWMNormalHints' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetWMNormalHints</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetWMNormalHints'>
+<funcprototype>
+  <funcdef>Status <function>XGetWMNormalHints</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>XSizeHints<parameter> *hints_return</parameter></paramdef>
+  <paramdef>long<parameter> *supplied_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>hints_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the size hints for the window in its normal state.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>supplied_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the hints that were supplied by the user.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The 
+<xref linkend='XGetWMNormalHints' xrefstyle='select: title'/>
+function returns the size hints stored in the <property>WM_NORMAL_HINTS</property> property 
+on the specified window.
+If the property is of type <property>WM_SIZE_HINTS</property>, is of format 32,
+and is long enough to contain either an old (pre-<acronym>ICCCM</acronym>) 
+or new size hints structure, 
+<xref linkend='XGetWMNormalHints' xrefstyle='select: title'/>
+sets the various fields of the 
+<structname>XSizeHints</structname>
+structure, sets the supplied_return argument to the list of fields 
+that were supplied by the user (whether or not they contained defined values),
+and returns a nonzero status.
+Otherwise, it returns a zero status.
+</para>
+<para>
+<!-- .LP -->
+If 
+<xref linkend='XGetWMNormalHints' xrefstyle='select: title'/>
+returns successfully and a pre-<acronym>ICCCM</acronym> size hints property is read, 
+the supplied_return argument will contain the following bits:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+(USPosition|USSize|PPosition|PSize|PMinSize|
+ PMaxSize|PResizeInc|PAspect)
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+If the property is large enough to contain the base size 
+and window gravity fields as well, 
+the supplied_return argument will also contain the following bits:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+PBaseSize|PWinGravity
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGetWMNormalHints' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To set a window's <property>WM_SIZE_HINTS</property> property, use
+<xref linkend='XSetWMSizeHints' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetWMSizeHints</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetWMSizeHints'>
+<funcprototype>
+  <funcdef>void <function>XSetWMSizeHints</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>XSizeHints<parameter> *hints</parameter></paramdef>
+  <paramdef>Atom<parameter> property</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>hints</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the
+<structname>XSizeHints</structname>
+structure to be used.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>property</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the property name.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The 
+<xref linkend='XSetWMSizeHints' xrefstyle='select: title'/>
+function replaces the size hints for the specified property 
+on the named window.
+If the specified property does not already exist,
+<xref linkend='XSetWMSizeHints' xrefstyle='select: title'/>
+sets the size hints for the specified property
+on the named window.
+The property is stored with a type of <property>WM_SIZE_HINTS</property> and a format of 32.
+To set a window's normal size hints, 
+you can use the 
+<xref linkend='XSetWMNormalHints' xrefstyle='select: title'/>
+function.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetWMSizeHints' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>,
+<errorname>BadAtom</errorname>,
+and 
+<errorname>BadWindow</errorname>
+errors.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To read a window's <property>WM_SIZE_HINTS</property> property, use
+<xref linkend='XGetWMSizeHints' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetWMSizeHints</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetWMSizeHints'>
+<funcprototype>
+  <funcdef>Status <function>XGetWMSizeHints</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>XSizeHints<parameter> *hints_return</parameter></paramdef>
+  <paramdef>long<parameter> *supplied_return</parameter></paramdef>
+  <paramdef>Atom<parameter> property</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>hints_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the
+<structname>XSizeHints</structname>
+structure.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>supplied_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the hints that were supplied by the user.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>property</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the property name.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The 
+<xref linkend='XGetWMSizeHints' xrefstyle='select: title'/>
+function returns the size hints stored in the specified property 
+on the named window.
+If the property is of type <property>WM_SIZE_HINTS</property>, is of format 32, 
+and is long enough to contain either an old (pre-<acronym>ICCCM</acronym>) 
+or new size hints structure, 
+<xref linkend='XGetWMSizeHints' xrefstyle='select: title'/>
+sets the various fields of the 
+<structname>XSizeHints</structname>
+structure, sets the supplied_return argument to the
+list of fields that were supplied by the user 
+(whether or not they contained defined values), 
+and returns a nonzero status.
+Otherwise, it returns a zero status.
+To get a window's normal size hints, 
+you can use the 
+<xref linkend='XGetWMNormalHints' xrefstyle='select: title'/>
+function.
+</para>
+<para>
+<!-- .LP -->
+If 
+<xref linkend='XGetWMSizeHints' xrefstyle='select: title'/>
+returns successfully and a pre-<acronym>ICCCM</acronym> size hints property is read, 
+the supplied_return argument will contain the following bits:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+(USPosition|USSize|PPosition|PSize|PMinSize|
+ PMaxSize|PResizeInc|PAspect)
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+If the property is large enough to contain the base size 
+and window gravity fields as well, 
+the supplied_return argument will also contain the following bits:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+PBaseSize|PWinGravity
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGetWMSizeHints' xrefstyle='select: title'/>
+can generate
+<errorname>BadAtom</errorname>
+and 
+<errorname>BadWindow</errorname>
+errors.
+</para>
+</sect2>
+<sect2 id="Setting_and_Reading_the_WM_CLASS_Property">
+<title>Setting and Reading the WM_CLASS Property</title>
+<!-- .XS -->
+<!-- (SN Setting and Reading the WM_CLASS Property -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to set and get 
+the <property>WM_CLASS</property> property for a given window.
+These functions use the
+<structname>XClassHint</structname>
+structure, which is defined in the
+<filename class="headerfile">&lt;X11/Xutil.h&gt;</filename>
+<indexterm type="file"><primary><filename class="headerfile">X11/Xutil.h</filename></primary></indexterm>
+<indexterm><primary>Files</primary><secondary><filename class="headerfile">&lt;X11/Xutil.h&gt;</filename></secondary></indexterm>
+<indexterm><primary>Headers</primary><secondary><filename class="headerfile">&lt;X11/Xutil.h&gt;</filename></secondary></indexterm>
+header file.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To allocate an
+<structname>XClassHint</structname>
+structure, use
+<function>XAllocClassHint</function>.
+<indexterm significance="preferred"><primary>XAllocClassHint</primary></indexterm>
+<!-- .sM -->
+</para>
+<para>
+
+  XClassHint *XAllocClassHint()
+</para>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<function>XAllocClassHint</function>
+function allocates and returns a pointer to an
+<structname>XClassHint</structname>
+structure.
+Note that the pointer fields in the
+<structname>XClassHint</structname>
+structure are initially set to NULL.
+If insufficient memory is available, 
+<function>XAllocClassHint</function>
+returns NULL.
+To free the memory allocated to this structure,
+use
+<xref linkend='XFree' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+The
+<structname>XClassHint</structname>
+contains:
+</para>
+<para>
+<!-- .LP -->
+<!-- .sM -->
+<indexterm significance="preferred"><primary>XClassHint</primary></indexterm>
+<literallayout class="monospaced">
+<!-- .TA .5i -->
+<!-- .ta .5i -->
+typedef struct {
+       char *res_name;
+       char *res_class;
+} XClassHint;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The res_name member contains the application name, 
+and the res_class member contains the application class. 
+Note that the name set in this property may differ from the name set as <property>WM_NAME</property>.
+That is, <property>WM_NAME</property> specifies what should be displayed in the title bar and,
+therefore, can contain temporal information (for example, the name of
+a file currently in an editor's buffer).
+On the other hand, 
+the name specified as part of <property>WM_CLASS</property> is the formal name of the application
+that should be used when retrieving the application's resources from the 
+resource database.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set a window's <property>WM_CLASS</property> property, use
+<xref linkend='XSetClassHint' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetClassHint</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetClassHint'>
+<funcprototype>
+  <funcdef><function>XSetClassHint</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>XClassHint<parameter> *class_hints</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>class_hints</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the
+<structname>XClassHint</structname>
+structure that is to be used.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetClassHint' xrefstyle='select: title'/>
+function sets the class hint for the specified window.
+If the strings are not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetClassHint' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>
+and
+<errorname>BadWindow</errorname>
+errors. 
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To read a window's <property>WM_CLASS</property> property, use
+<xref linkend='XGetClassHint' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetClassHint</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetClassHint'>
+<funcprototype>
+  <funcdef>Status <function>XGetClassHint</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>XClassHint<parameter> *class_hints_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>class_hints_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the 
+<structname>XClassHint</structname>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetClassHint' xrefstyle='select: title'/>
+function returns the class hint of the specified window to the members
+of the supplied structure.
+If the data returned by the server is in the Latin Portable Character Encoding,
+then the returned strings are in the Host Portable Character Encoding.
+Otherwise, the result is implementation-dependent.
+It returns a nonzero status on success;
+otherwise, it returns a zero status.
+To free res_name and res_class when finished with the strings,
+use
+<xref linkend='XFree' xrefstyle='select: title'/>
+on each individually.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGetClassHint' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+</sect2>
+<sect2 id="Setting_and_Reading_the_WM_TRANSIENT_FOR_Property">
+<title>Setting and Reading the WM_TRANSIENT_FOR Property</title>
+<!-- .XS -->
+<!-- (SN Setting and Reading the WM_TRANSIENT_FOR Property -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to set and read
+the <property>WM_TRANSIENT_FOR</property> property for a given window.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set a window's <property>WM_TRANSIENT_FOR</property> property, use
+<xref linkend='XSetTransientForHint' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetTransientForHint</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetTransientForHint'>
+<funcprototype>
+  <funcdef><function>XSetTransientForHint</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>Window<parameter> prop_window</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>prop_window</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window that the <property>WM_TRANSIENT_FOR</property> property is to be set to.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetTransientForHint' xrefstyle='select: title'/>
+function sets the <property>WM_TRANSIENT_FOR</property> property of the specified window to the 
+specified prop_window.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetTransientForHint' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To read a window's <property>WM_TRANSIENT_FOR</property> property, use
+<xref linkend='XGetTransientForHint' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetTransientForHint</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetTransientForHint'>
+<funcprototype>
+  <funcdef>Status <function>XGetTransientForHint</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>Window<parameter> *prop_window_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>prop_window_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the <property>WM_TRANSIENT_FOR</property> property of the specified window.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetTransientForHint' xrefstyle='select: title'/>
+function returns the <property>WM_TRANSIENT_FOR</property> property for the specified window.
+It returns a nonzero status on success;
+otherwise, it returns a zero status.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGetTransientForHint' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+</sect2>
+<sect2 id="Setting_and_Reading_the_WM_PROTOCOLS_Property">
+<title>Setting and Reading the WM_PROTOCOLS Property</title>
+<!-- .XS -->
+<!-- (SN Setting and Reading the WM_PROTOCOLS Property -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to set and read
+the <property>WM_PROTOCOLS</property> property for a given window.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set a window's <property>WM_PROTOCOLS</property> property, use
+<xref linkend='XSetWMProtocols' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetWMProtocols</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetWMProtocols'>
+<funcprototype>
+  <funcdef>Status <function>XSetWMProtocols</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>Atom<parameter> *protocols</parameter></paramdef>
+  <paramdef>int<parameter> count</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>protocols</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the list of protocols.
+<!-- .ds Cn protocols in the list -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>count</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of (Cn.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The 
+<xref linkend='XSetWMProtocols' xrefstyle='select: title'/>
+function replaces the <property>WM_PROTOCOLS</property> property on the specified window 
+with the list of atoms specified by the protocols argument.
+If the property does not already exist,
+<xref linkend='XSetWMProtocols' xrefstyle='select: title'/>
+sets the <property>WM_PROTOCOLS</property> property on the specified window
+to the list of atoms specified by the protocols argument.
+The property is stored with a type of ATOM and a format of 32.
+If it cannot intern the <property>WM_PROTOCOLS</property> atom, 
+<xref linkend='XSetWMProtocols' xrefstyle='select: title'/>
+returns a zero status.
+Otherwise, it returns a nonzero status.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetWMProtocols' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To read a window's <property>WM_PROTOCOLS</property> property, use
+<xref linkend='XGetWMProtocols' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetWMProtocols</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetWMProtocols'>
+<funcprototype>
+  <funcdef>Status <function>XGetWMProtocols</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>Atom<parameter> **protocols_return</parameter></paramdef>
+  <paramdef>int<parameter> *count_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>protocols_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the list of protocols.
+<!-- .ds Cn protocols in the list -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>count_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the number of (Cn.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The 
+<xref linkend='XGetWMProtocols' xrefstyle='select: title'/>
+function returns the list of atoms stored in the <property>WM_PROTOCOLS</property> property 
+on the specified window.
+These atoms describe window manager protocols in which the owner 
+of this window is willing to participate.
+If the property exists, is of type ATOM, is of format 32, 
+and the atom <property>WM_PROTOCOLS</property> can be interned, 
+<xref linkend='XGetWMProtocols' xrefstyle='select: title'/>
+sets the protocols_return argument to a list of atoms, 
+sets the count_return argument to the number of elements in the list, 
+and returns a nonzero status.
+Otherwise, it sets neither of the return arguments
+and returns a zero status.
+To release the list of atoms, use
+<xref linkend='XFree' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGetWMProtocols' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+</sect2>
+<sect2 id="Setting_and_Reading_the_WM_COLORMAP_WINDOWS_Property">
+<title>Setting and Reading the WM_COLORMAP_WINDOWS Property</title>
+<!-- .XS -->
+<!-- (SN Setting and Reading the WM_COLORMAP_WINDOWS Property -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to set and read
+the <property>WM_COLORMAP_WINDOWS</property> property for a given window.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To set a window's <property>WM_COLORMAP_WINDOWS</property> property, use
+<xref linkend='XSetWMColormapWindows' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetWMColormapWindows</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetWMColormapWindows'>
+<funcprototype>
+  <funcdef>Status <function>XSetWMColormapWindows</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>Window<parameter> *colormap_windows</parameter></paramdef>
+  <paramdef>int<parameter> count</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colormap_windows</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the list of windows.
+<!-- .ds Cn windows in the list -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>count</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of (Cn.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The 
+<xref linkend='XSetWMColormapWindows' xrefstyle='select: title'/>
+function replaces the <property>WM_COLORMAP_WINDOWS</property> property on the specified
+window with the list of windows specified by the colormap_windows argument.
+If the property does not already exist,
+<xref linkend='XSetWMColormapWindows' xrefstyle='select: title'/>
+sets the <property>WM_COLORMAP_WINDOWS</property> property on the specified
+window to the list of windows specified by the colormap_windows argument.
+The property is stored with a type of WINDOW and a format of 32.
+If it cannot intern the <property>WM_COLORMAP_WINDOWS</property> atom,
+<xref linkend='XSetWMColormapWindows' xrefstyle='select: title'/>
+returns a zero status.
+Otherwise, it returns a nonzero status.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetWMColormapWindows' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To read a window's <property>WM_COLORMAP_WINDOWS</property> property, use
+<xref linkend='XGetWMColormapWindows' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetWMColormapWindows</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetWMColormapWindows'>
+<funcprototype>
+  <funcdef>Status <function>XGetWMColormapWindows</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>Window<parameter> **colormap_windows_return</parameter></paramdef>
+  <paramdef>int<parameter> *count_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>colormap_windows_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the list of windows.
+<!-- .ds Cn windows in the list -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>count_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the number of (Cn.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The 
+<xref linkend='XGetWMColormapWindows' xrefstyle='select: title'/>
+function returns the list of window identifiers stored 
+in the <property>WM_COLORMAP_WINDOWS</property> property on the specified window.
+These identifiers indicate the colormaps that the window manager
+may need to install for this window.
+If the property exists, is of type WINDOW, is of format 32, 
+and the atom <property>WM_COLORMAP_WINDOWS</property> can be interned, 
+<xref linkend='XGetWMColormapWindows' xrefstyle='select: title'/>
+sets the windows_return argument to a list of window identifiers, 
+sets the count_return argument to the number of elements in the list, 
+and returns a nonzero status.
+Otherwise, it sets neither of the return arguments
+and returns a zero status.
+To release the list of window identifiers, use
+<xref linkend='XFree' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGetWMColormapWindows' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+</sect2>
+<sect2 id="Setting_and_Reading_the_WM_ICON_SIZE_Property">
+<title>Setting and Reading the WM_ICON_SIZE Property</title>
+<!-- .XS -->
+<!-- (SN Setting and Reading the WM_ICON_SIZE Property -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to set and read 
+the <property>WM_ICON_SIZE</property> property for a given window.
+These functions use the 
+<structname>XIconSize</structname>
+<indexterm><primary>XIconSize</primary></indexterm>
+structure, which is defined in the
+<filename class="headerfile">&lt;X11/Xutil.h&gt;</filename>
+<indexterm type="file"><primary><filename class="headerfile">X11/Xutil.h</filename></primary></indexterm>
+<indexterm><primary>Files</primary><secondary><filename class="headerfile">&lt;X11/Xutil.h&gt;</filename></secondary></indexterm>
+<indexterm><primary>Headers</primary><secondary><filename class="headerfile">&lt;X11/Xutil.h&gt;</filename></secondary></indexterm>
+header file.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To allocate an
+<structname>XIconSize</structname>
+structure, use
+<function>XAllocIconSize</function>.
+</para>
+
+<para>
+  XIconSize *XAllocIconSize()
+</para>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<function>XAllocIconSize</function>
+function allocates and returns a pointer to an
+<structname>XIconSize</structname>
+structure.
+Note that all fields in the
+<structname>XIconSize</structname>
+structure are initially set to zero.
+If insufficient memory is available, 
+<function>XAllocIconSize</function>
+returns NULL.
+To free the memory allocated to this structure,
+use
+<xref linkend='XFree' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+The
+<structname>XIconSize</structname>
+structure contains:
+</para>
+<para>
+<!-- .LP -->
+<!-- .sM -->
+<indexterm significance="preferred"><primary>XIconSize</primary></indexterm>
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef struct {
+       int min_width, min_height;
+       int max_width, max_height;
+       int width_inc, height_inc;
+} XIconSize;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The width_inc and height_inc members define an arithmetic progression of
+sizes (minimum to maximum) that represent the supported icon sizes.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set a window's <property>WM_ICON_SIZE</property> property, use
+<xref linkend='XSetIconSizes' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetIconSizes</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetIconSizes'>
+<funcprototype>
+  <funcdef><function>XSetIconSizes</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>XIconSize<parameter> *size_list</parameter></paramdef>
+  <paramdef>int<parameter> count</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>size_list</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the size list.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>count</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of items in the size list.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetIconSizes' xrefstyle='select: title'/>
+function is used only by window managers to set the supported icon sizes.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetIconSizes' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To read a window's <property>WM_ICON_SIZE</property> property, use
+<xref linkend='XGetIconSizes' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetIconSizes</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetIconSizes'>
+<funcprototype>
+  <funcdef>Status <function>XGetIconSizes</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>XIconSize<parameter> **size_list_return</parameter></paramdef>
+  <paramdef>int<parameter> *count_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>size_list_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the size list.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>count_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the number of items in the size list.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetIconSizes' xrefstyle='select: title'/>
+function returns zero if a window manager has not set icon sizes;
+otherwise, it returns nonzero.
+<xref linkend='XGetIconSizes' xrefstyle='select: title'/>
+should be called by an application that
+wants to find out what icon sizes would be most appreciated by the
+window manager under which the application is running.
+The application
+should then use
+<xref linkend='XSetWMHints' xrefstyle='select: title'/>
+to supply the window manager with an icon pixmap or window in one of the
+supported sizes.
+To free the data allocated in size_list_return, use
+<xref linkend='XFree' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGetIconSizes' xrefstyle='select: title'/>
+can generate a
+<errorname>BadWindow</errorname>
+error.
+</para>
+</sect2>
+<sect2 id="Using_Window_Manager_Convenience_Functions">
+<title>Using Window Manager Convenience Functions</title>
+<!-- .XS -->
+<!-- (SN Using Window Manager Convenience Functions -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The 
+<xref linkend='XmbSetWMProperties' xrefstyle='select: title'/>
+function stores the standard set of window manager properties,
+with text properties in standard encodings
+for internationalized text communication.
+The standard window manager properties for a given window are
+<property>WM_NAME</property>, <property>WM_ICON_NAME</property>, <property>WM_HINTS</property>, <property>WM_NORMAL_HINTS</property>, <property>WM_CLASS</property>,
+<property>WM_COMMAND</property>, <property>WM_CLIENT_MACHINE</property>, and <property>WM_LOCALE_NAME</property>.
+</para>
+<indexterm significance="preferred"><primary>XmbSetWMProperties</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XmbSetWMProperties'>
+<funcprototype>
+  <funcdef>void <function>XmbSetWMProperties</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>char<parameter> *window_name</parameter></paramdef>
+  <paramdef>char<parameter> *icon_name</parameter></paramdef>
+  <paramdef>char<parameter> *argv[]</parameter></paramdef>
+  <paramdef>int<parameter> argc</parameter></paramdef>
+  <paramdef>XSizeHints<parameter> *normal_hints</parameter></paramdef>
+  <paramdef>XWMHints<parameter> *wm_hints</parameter></paramdef>
+  <paramdef>XClassHint<parameter> *class_hints</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>window_name</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window name,
+which should be a null-terminated string.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>icon_name</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the icon name,
+which should be a null-terminated string.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>argv</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the application's argument list.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>argc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of arguments.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>hints</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the size hints for the window in its normal state.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>wm_hints</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the
+<structname>XWMHints</structname>
+structure to be used.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>class_hints</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the
+<structname>XClassHint</structname>
+structure to be used.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XmbSetWMProperties' xrefstyle='select: title'/>
+convenience function provides a simple programming interface 
+for setting those essential window properties that are used 
+for communicating with other clients
+(particularly window and session managers).
+</para>
+<para>
+<!-- .LP -->
+If the window_name argument is non-NULL,
+<xref linkend='XmbSetWMProperties' xrefstyle='select: title'/>
+sets the <property>WM_NAME</property> property.
+If the icon_name argument is non-NULL,
+<xref linkend='XmbSetWMProperties' xrefstyle='select: title'/>
+sets the <property>WM_ICON_NAME</property> property.
+The window_name and icon_name arguments are null-terminated strings
+in the encoding of the current locale.
+If the arguments can be fully converted to the STRING encoding,
+the properties are created with type ``STRING''; 
+otherwise, the arguments are converted to Compound Text, 
+and the properties are created with type ``COMPOUND_TEXT''.
+</para>
+<para>
+<!-- .LP -->
+If the normal_hints argument is non-NULL,
+<xref linkend='XmbSetWMProperties' xrefstyle='select: title'/>
+calls
+<xref linkend='XSetWMNormalHints' xrefstyle='select: title'/>,
+which sets the <property>WM_NORMAL_HINTS</property> property
+(see <link linkend="Setting_and_Reading_the_WM_NORMAL_HINTS_Property">section 14.1.7</link>).
+If the wm_hints argument is non-NULL, 
+<xref linkend='XmbSetWMProperties' xrefstyle='select: title'/>
+calls
+<xref linkend='XSetWMHints' xrefstyle='select: title'/>,
+which sets the <property>WM_HINTS</property> property
+(see <link linkend="Setting_and_Reading_the_WM_HINTS_Property">section 14.1.6</link>).
+</para>
+<para>
+<!-- .LP -->
+If the argv argument is non-NULL,
+<xref linkend='XmbSetWMProperties' xrefstyle='select: title'/>
+sets the <property>WM_COMMAND</property> property from argv and argc.
+An argc of zero indicates a zero-length command.
+</para>
+<para>
+<!-- .LP -->
+The hostname of the machine is stored using 
+<xref linkend='XSetWMClientMachine' xrefstyle='select: title'/>
+(see <link linkend="Setting_and_Reading_the_WM_CLIENT_MACHINE_Property">section 14.2.2</link>).
+</para>
+<para>
+<!-- .LP -->
+If the class_hints argument is non-NULL,
+<xref linkend='XmbSetWMProperties' xrefstyle='select: title'/>
+sets the <property>WM_CLASS</property> property.
+If the res_name member in the 
+<structname>XClassHint</structname>
+structure is set to the NULL pointer and the RESOURCE_NAME
+environment variable is set,
+the value of the environment variable is substituted for res_name.
+If the res_name member is NULL,
+the environment variable is not set, and argv and argv[0] are set,
+then the value of argv[0], stripped of any directory prefixes,
+is substituted for res_name.
+</para>
+<para>
+<!-- .LP -->
+It is assumed that the supplied class_hints.res_name and argv,
+the RESOURCE_NAME environment variable, and the hostname of the machine
+are in the encoding of the locale announced for the LC_CTYPE category
+(on <acronym>POSIX</acronym>-compliant systems, the LC_CTYPE, else LANG environment variable).
+The corresponding <property>WM_CLASS</property>, <property>WM_COMMAND</property>, and <property>WM_CLIENT_MACHINE</property> properties
+are typed according to the local host locale announcer.
+No encoding conversion is performed prior to storage in the properties.
+</para>
+<para>
+<!-- .LP -->
+For clients that need to process the property text in a locale,
+<xref linkend='XmbSetWMProperties' xrefstyle='select: title'/>
+sets the <property>WM_LOCALE_NAME</property> property to be the name of the current locale.
+The name is assumed to be in the Host Portable Character Encoding
+and is converted to STRING for storage in the property.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XmbSetWMProperties' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To set a window's standard window manager properties
+with strings in client-specified encodings, use
+<xref linkend='XSetWMProperties' xrefstyle='select: title'/>.
+The standard window manager properties for a given window are
+<property>WM_NAME</property>, <property>WM_ICON_NAME</property>, <property>WM_HINTS</property>, <property>WM_NORMAL_HINTS</property>, <property>WM_CLASS</property>,
+<property>WM_COMMAND</property>, and <property>WM_CLIENT_MACHINE</property>.
+</para>
+<indexterm significance="preferred"><primary>XSetWMProperties</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetWMProperties'>
+<funcprototype>
+  <funcdef>void <function>XSetWMProperties</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>XTextProperty<parameter> *window_name</parameter></paramdef>
+  <paramdef>XTextProperty<parameter> *icon_name</parameter></paramdef>
+  <paramdef>char<parameter> **argv</parameter></paramdef>
+  <paramdef>int<parameter> argc</parameter></paramdef>
+  <paramdef>XSizeHints<parameter> *normal_hints</parameter></paramdef>
+  <paramdef>XWMHints<parameter> *wm_hints</parameter></paramdef>
+  <paramdef>XClassHint<parameter> *class_hints</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>window_name</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window name,
+which should be a null-terminated string.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>icon_name</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the icon name,
+which should be a null-terminated string.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>argv</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the application's argument list.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>argc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of arguments.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>normal_hints</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the size hints for the window in its normal state.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>wm_hints</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the
+<structname>XWMHints</structname>
+structure to be used.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>class_hints</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the
+<structname>XClassHint</structname>
+structure to be used.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The 
+<xref linkend='XSetWMProperties' xrefstyle='select: title'/>
+convenience function provides a single programming interface 
+for setting those essential window properties that are used 
+for communicating with other clients (particularly window and session
+managers).
+</para>
+<para>
+<!-- .LP -->
+If the window_name argument is non-NULL, 
+<xref linkend='XSetWMProperties' xrefstyle='select: title'/>
+calls
+<xref linkend='XSetWMName' xrefstyle='select: title'/>,
+which, in turn, sets the <property>WM_NAME</property> property
+(see <link linkend="Setting_and_Reading_the_WM_NAME_Property">section 14.1.4</link>).
+If the icon_name argument is non-NULL,
+<xref linkend='XSetWMProperties' xrefstyle='select: title'/>
+calls
+<xref linkend='XSetWMIconName' xrefstyle='select: title'/>,
+which sets the <property>WM_ICON_NAME</property> property
+(see <link linkend="Setting_and_Reading_the_WM_ICON_NAME_Property">section 14.1.5</link>).
+If the argv argument is non-NULL, 
+<xref linkend='XSetWMProperties' xrefstyle='select: title'/>
+calls
+<xref linkend='XSetCommand' xrefstyle='select: title'/>,
+which sets the <property>WM_COMMAND</property> property
+(see <link linkend="Setting_and_Reading_the_WM_COMMAND_Property">section 14.2.1</link>).
+Note that an argc of zero is allowed to indicate a zero-length command.
+Note also that the hostname of this machine is stored using
+<xref linkend='XSetWMClientMachine' xrefstyle='select: title'/>
+(see <link linkend="Setting_and_Reading_the_WM_CLIENT_MACHINE_Property">section 14.2.2</link>).
+</para>
+<para>
+<!-- .LP -->
+If the normal_hints argument is non-NULL, 
+<xref linkend='XSetWMProperties' xrefstyle='select: title'/>
+calls
+<xref linkend='XSetWMNormalHints' xrefstyle='select: title'/>,
+which sets the <property>WM_NORMAL_HINTS</property> property
+(see <link linkend="Setting_and_Reading_the_WM_NORMAL_HINTS_Property">section 14.1.7</link>).
+If the wm_hints argument is non-NULL, 
+<xref linkend='XSetWMProperties' xrefstyle='select: title'/>
+calls
+<xref linkend='XSetWMHints' xrefstyle='select: title'/>,
+which sets the <property>WM_HINTS</property> property
+(see <link linkend="Setting_and_Reading_the_WM_HINTS_Property">section 14.1.6</link>).
+</para>
+<para>
+<!-- .LP -->
+If the class_hints argument is non-NULL, 
+<xref linkend='XSetWMProperties' xrefstyle='select: title'/>
+calls
+<xref linkend='XSetClassHint' xrefstyle='select: title'/>,
+which sets the <property>WM_CLASS</property> property
+(see <link linkend="Setting_and_Reading_the_WM_CLASS_Property">section 14.1.8</link>).
+If the res_name member in the
+<structname>XClassHint</structname>
+structure is set to the NULL pointer and the RESOURCE_NAME environment 
+variable is set, 
+then the value of the environment variable is substituted for res_name.
+If the res_name member is NULL, 
+the environment variable is not set, 
+and argv and argv[0] are set, 
+then the value of argv[0], stripped of
+any directory prefixes, is substituted for res_name.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetWMProperties' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+</para>
+</sect2>
+</sect1>
+<sect1 id="Client_to_Session_Manager_Communication">
+<title>Client to Session Manager Communication</title>
+<!-- .XS -->
+<!-- (SN Client to Session Manager Communication -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+This section discusses how to:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+Set and read the <property>WM_COMMAND</property> property
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Set and read the <property>WM_CLIENT_MACHINE</property> property
+    </para>
+  </listitem>
+</itemizedlist>
+<sect2 id="Setting_and_Reading_the_WM_COMMAND_Property">
+<title>Setting and Reading the WM_COMMAND Property</title>
+<!-- .XS -->
+<!-- (SN Setting and Reading the WM_COMMAND Property -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to set and read
+the <property>WM_COMMAND</property> property for a given window.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To set a window's <property>WM_COMMAND</property> property, use
+<xref linkend='XSetCommand' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetCommand</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetCommand'>
+<funcprototype>
+  <funcdef><function>XSetCommand</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>char<parameter> **argv</parameter></paramdef>
+  <paramdef>int<parameter> argc</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>argv</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the application's argument list.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>argc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of arguments.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetCommand' xrefstyle='select: title'/>
+function sets the command and arguments used to invoke the
+application.
+(Typically, argv is the argv array of your main program.)
+If the strings are not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XSetCommand' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To read a window's <property>WM_COMMAND</property> property, use
+<xref linkend='XGetCommand' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetCommand</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetCommand'>
+<funcprototype>
+  <funcdef>Status <function>XGetCommand</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>char<parameter> ***argv_return</parameter></paramdef>
+  <paramdef>int<parameter> *argc_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>argv_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the application's argument list.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>argc_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the number of arguments returned.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The 
+<xref linkend='XGetCommand' xrefstyle='select: title'/>
+function reads the <property>WM_COMMAND</property> property from the specified window 
+and returns a string list.
+If the <property>WM_COMMAND</property> property exists, 
+it is of type STRING and format 8.
+If sufficient memory can be allocated to contain the string list, 
+<xref linkend='XGetCommand' xrefstyle='select: title'/>
+fills in the argv_return and argc_return arguments
+and returns a nonzero status.
+Otherwise, it returns a zero status.
+If the data returned by the server is in the Latin Portable Character Encoding,
+then the returned strings are in the Host Portable Character Encoding.
+Otherwise, the result is implementation-dependent.
+To free the memory allocated to the string list, use
+<xref linkend='XFreeStringList' xrefstyle='select: title'/>.
+</para>
+</sect2>
+<sect2 id="Setting_and_Reading_the_WM_CLIENT_MACHINE_Property">
+<title>Setting and Reading the WM_CLIENT_MACHINE Property</title>
+<!-- .XS -->
+<!-- (SN Setting and Reading the WM_CLIENT_MACHINE Property -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to set and read 
+the <property>WM_CLIENT_MACHINE</property> property for a given window.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To set a window's <property>WM_CLIENT_MACHINE</property> property, use
+<xref linkend='XSetWMClientMachine' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetWMClientMachine</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetWMClientMachine'>
+<funcprototype>
+  <funcdef>void <function>XSetWMClientMachine</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>XTextProperty<parameter> *text_prop</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>text_prop</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the
+<structname>XTextProperty</structname>
+structure to be used.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetWMClientMachine' xrefstyle='select: title'/>
+convenience function calls
+<xref linkend='XSetTextProperty' xrefstyle='select: title'/>
+to set the <property>WM_CLIENT_MACHINE</property> property.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To read a window's <property>WM_CLIENT_MACHINE</property> property, use
+<xref linkend='XGetWMClientMachine' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetWMClientMachine</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetWMClientMachine'>
+<funcprototype>
+  <funcdef>Status <function>XGetWMClientMachine</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>XTextProperty<parameter> *text_prop_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>text_prop_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the
+<structname>XTextProperty</structname>
+structure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetWMClientMachine' xrefstyle='select: title'/>
+convenience function performs an 
+<xref linkend='XGetTextProperty' xrefstyle='select: title'/>
+on the <property>WM_CLIENT_MACHINE</property> property.
+It returns a nonzero status on success;
+otherwise, it returns a zero status.
+</para>
+</sect2>
+</sect1>
+<sect1 id="Standard_Colormaps">
+<title>Standard Colormaps</title>
+<!-- .XS -->
+<!-- (SN Standard Colormaps  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Applications with color palettes, smooth-shaded drawings, or digitized
+images demand large numbers of colors.  
+In addition, these applications often require an efficient mapping 
+from color triples to pixel values that display the appropriate colors.
+</para>
+<para>
+<!-- .LP -->
+As an example, consider a three-dimensional display program that wants 
+to draw a smoothly shaded sphere.  
+At each pixel in the image of the sphere, 
+the program computes the intensity and color of light
+reflected back to the viewer.  
+The result of each computation is a triple of red, green, and blue (<acronym>RGB</acronym>)
+coefficients in the range 0.0 to 1.0.  
+To draw the sphere, the program needs a colormap that provides a
+large range of uniformly distributed colors.  
+The colormap should be arranged so that the program can
+convert its <acronym>RGB</acronym> triples into pixel values very quickly,
+because drawing the entire sphere requires many such
+conversions.
+</para>
+<para>
+<!-- .LP -->
+On many current workstations,
+the display is limited to 256 or fewer colors.  
+Applications must allocate colors carefully, 
+not only to make sure they cover the entire range they need 
+but also to make use of as many of the available colors as possible.
+On a typical X display, 
+many applications are active at once.
+Most workstations have only one hardware look-up table for colors,
+so only one application colormap can be installed at a given time.
+The application using the installed colormap is displayed correctly, 
+and the other applications go technicolor and are
+displayed with false colors.
+</para>
+<para>
+<!-- .LP -->
+As another example, consider a user who is running an 
+image processing program to display earth-resources data.  
+The image processing program needs a colormap set up with 8 reds, 
+8 greens, and 4 blues, for a total of 256 colors.
+Because some colors are already in use in the default colormap, 
+the image processing program allocates and installs a new colormap.
+</para>
+<para>
+<!-- .LP -->
+The user decides to alter some of the colors in the image
+by invoking a color palette program to mix and choose colors.
+The color palette program also needs a
+colormap with eight reds, eight greens, and four blues, so just like
+the image processing program, it must allocate and
+install a new colormap.
+</para>
+<para>
+<!-- .LP -->
+Because only one colormap can be installed at a time,
+the color palette may be displayed incorrectly
+whenever the image processing program is active.
+Conversely, whenever the palette program is active, 
+the image may be displayed incorrectly.  
+The user can never match or compare colors in the palette and image.
+Contention for colormap resources can be reduced if applications
+with similar color needs share colormaps.
+</para>
+<para>
+<!-- .LP -->
+The image processing program and the color palette program 
+could share the same colormap if there existed a convention that described
+how the colormap was set up.  
+Whenever either program was active, 
+both would be displayed correctly.
+</para>
+<para>
+<!-- .LP -->
+The standard colormap properties define a set of commonly used
+colormaps.  
+Applications that share these colormaps and conventions display 
+true colors more often and provide a better interface to the user.
+</para>
+<para>
+<!-- .LP -->
+Standard colormaps allow applications to share commonly used color
+resources.  
+This allows many applications to be displayed in true colors
+simultaneously, even when each application needs an entirely filled
+colormap.
+</para>
+<para>
+<!-- .LP -->
+Several standard colormaps are described in this section.
+Usually, a window manager creates these colormaps.
+Applications should use the standard colormaps if they already exist.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To allocate an
+<structname>XStandardColormap</structname>
+structure, use
+<function>XAllocStandardColormap</function>.
+</para>
+
+<para>
+XStandardColormap *XAllocStandardColormap()
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<function>XAllocStandardColormap</function>
+function allocates and returns a pointer to an
+<structname>XStandardColormap</structname>
+structure.
+Note that all fields in the
+<structname>XStandardColormap</structname>
+structure are initially set to zero.
+If insufficient memory is available, 
+<function>XAllocStandardColormap</function>
+returns NULL.
+To free the memory allocated to this structure,
+use
+<xref linkend='XFree' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+The 
+<structname>XStandardColormap</structname>
+structure contains:
+</para>
+<literallayout class="monospaced">
+/* Hints */
+
+#define       ReeaseByFreeingColormap  ((XID)1L)
+
+/* Values */
+
+typedef struct {
+       Colormap colormap;
+       unsigned long red_max;
+       unsigned long red_mult;
+       unsigned long green_max;
+       unsigned long green_mult;
+       unsigned long blue_max;
+       unsigned long blue_mult;
+       unsigned long base_pixel;
+       VisualID visualid;
+       XID killid;
+} XStandardColormap;
+</literallayout>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The colormap member is the colormap created by the
+<xref linkend='XCreateColormap' xrefstyle='select: title'/>
+function.
+The red_max, green_max, and blue_max members give the maximum
+red, green, and blue values, respectively.  
+Each color coefficient ranges from zero to its max, inclusive.  
+For example,
+a common colormap allocation is 3/3/2 (3 planes for red, 3
+planes for green, and 2 planes for blue).  
+This colormap would have red_max = 7, green_max = 7, 
+and blue_max = 3.  
+An alternate allocation that uses only 216 colors is red_max = 5, 
+green_max = 5, and blue_max = 5.
+</para>
+<para>
+<!-- .LP -->
+The red_mult, green_mult, and blue_mult members give the
+scale factors used to compose a full pixel value. 
+(See the discussion of the base_pixel members for further information.)
+For a 3/3/2 allocation, red_mult might be 32,
+green_mult might be 4, and blue_mult might be 1.  
+For a 6-colors-each allocation, red_mult might be 36, 
+green_mult might be 6, and blue_mult might be 1.
+</para>
+<para>
+<!-- .LP -->
+The base_pixel member gives the base pixel value used to
+compose a full pixel value.  
+Usually, the base_pixel is obtained from a call to the 
+<xref linkend='XAllocColorPlanes' xrefstyle='select: title'/>
+function.  
+Given integer red, green, and blue coefficients in their appropriate 
+ranges, one then can compute a corresponding pixel value by
+using the following expression:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .5i 1.5i -->
+<!-- .ta .5i 1.5i -->
+(r * red_mult + g * green_mult + b * blue_mult + base_pixel) &amp; 0xFFFFFFFF
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+For 
+<symbol>GrayScale</symbol>
+colormaps, 
+only the colormap, red_max, red_mult, 
+and base_pixel members are defined. 
+The other members are ignored.  
+To compute a 
+<symbol>GrayScale</symbol>
+pixel value, use the following expression:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .5i 1.5i -->
+<!-- .ta .5i 1.5i -->
+(gray * red_mult + base_pixel) &amp; 0xFFFFFFFF
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+Negative multipliers can be represented by converting the 2's
+complement representation of the multiplier into an unsigned long and
+storing the result in the appropriate _mult field.
+The step of masking by 0xFFFFFFFF effectively converts the resulting
+positive multiplier into a negative one.
+The masking step will take place automatically on many machine architectures,
+depending on the size of the integer type used to do the computation.
+</para>
+<para>
+<!-- .LP -->
+The visualid member gives the ID number of the visual from which the
+colormap was created.
+The killid member gives a resource ID that indicates whether
+the cells held by this standard colormap are to be released 
+by freeing the colormap ID or by calling the
+<xref linkend='XKillClient' xrefstyle='select: title'/>
+function on the indicated resource.
+(Note that this method is necessary for allocating out of an existing colormap.)
+</para>
+<para>
+<!-- .LP -->
+The properties containing the 
+<structname>XStandardColormap</structname>
+information have 
+the type RGB_COLOR_MAP.
+</para>
+<para>
+<!-- .LP -->
+The remainder of this section discusses standard colormap properties and atoms
+as well as how to manipulate standard colormaps.
+</para>
+<sect2 id="Standard_Colormap_Properties_and_Atoms">
+<title>Standard Colormap Properties and Atoms</title>
+<!-- .XS -->
+<!-- (SN Standard Colormap Properties and Atoms  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Standard Colormaps</primary></indexterm>
+<indexterm><primary>Colormaps</primary><secondary>standard</secondary></indexterm>
+Several standard colormaps are available.  
+Each standard colormap is defined by a property, 
+and each such property is identified by an atom.  
+The following list names the atoms and describes the colormap
+associated with each one.
+The
+<filename class="headerfile">&lt;X11/Xatom.h&gt;</filename>
+<indexterm type="file"><primary><filename class="headerfile">X11/Xatom.h</filename></primary></indexterm>
+<indexterm><primary>Files</primary><secondary><filename class="headerfile">&lt;X11/Xatom.h&gt;</filename></secondary></indexterm>
+<indexterm><primary>Headers</primary><secondary><filename class="headerfile">&lt;X11/Xatom.h&gt;</filename></secondary></indexterm>
+header file contains the definitions for each of the following atoms,
+which are prefixed with XA_.
+</para>
+
+
+
+<variablelist>
+  <varlistentry>
+    <term>RGB_DEFAULT_MAP</term>
+    <listitem>
+      <para>
+This atom names a property.
+The value of the property is an array of
+<structname>XStandardColormap</structname>
+structures.
+Each entry in the array describes an <acronym>RGB</acronym> subset of the default color
+map for the Visual specified by visual_id.
+      </para>
+      <para>
+Some applications only need a few <acronym>RGB</acronym> colors and
+may be able to allocate them from the system default colormap.
+This is the ideal situation because the fewer colormaps that are
+active in the system the more applications are displayed
+with correct colors at all times.
+      </para>
+      <para>
+A typical allocation for the RGB_DEFAULT_MAP on 8-plane displays
+is 6 reds, 6 greens, and 6 blues.  
+This gives 216 uniformly distributed colors 
+(6 intensities of 36 different hues) and still leaves 40 elements 
+of a 256-element colormap available for special-purpose colors 
+for text, borders, and so on.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>RGB_BEST_MAP</term>
+    <listitem>
+      <para>
+This atom names a property.  The value of the property is an 
+<structname>XStandardColormap</structname>.
+      </para>
+      <para>
+The property defines the best <acronym>RGB</acronym> colormap available on
+the screen.
+(Of course, this is a subjective evaluation.)
+Many image processing and three-dimensional applications need to
+use all available colormap cells and to distribute as many
+perceptually distinct colors as possible over those cells.
+This implies that there may be more green values available than
+red, as well as more green or red than blue.
+      </para>
+      <para>
+For an 8-plane 
+<symbol>PseudoColor</symbol>
+visual, 
+RGB_BEST_MAP is likely to be a 3/3/2 allocation.  
+For a 24-plane 
+<symbol>DirectColor</symbol>
+visual, 
+RGB_BEST_MAP is normally an 8/8/8 allocation.  
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>RGB_RED_MAP,RGB_GREEN_MAP,RGB_BLUE_MAP</term>
+    <listitem>
+      <para>
+These atoms name properties.
+The value of each property is an
+<structname>XStandardColormap</structname>.
+      </para>
+      <para>
+The properties define all-red, all-green, and all-blue
+colormaps, respectively.  
+These maps are used by applications that want to make color-separated 
+images.  
+For example, a user might generate a full-color image 
+on an 8-plane display both by rendering an image three times 
+(once with high color resolution in red, once with green, 
+and once with blue) and by multiply exposing a single frame in a camera.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry> 
+    <term>RGB_GRAY_MAP</term>
+    <listitem>
+      <para>
+This atom names a property.
+The value of the property is an 
+<structname>XStandardColormap</structname>.
+      </para>
+      <para>
+The property describes the best 
+<symbol>GrayScale</symbol>
+colormap available on the screen.  
+As previously mentioned, 
+only the colormap, red_max, red_mult, and base_pixel members of the
+<structname>XStandardColormap</structname>
+structure are used for 
+<symbol>GrayScale</symbol>
+colormaps.
+      </para>
+    </listitem>
+  </varlistentry>
+</variablelist>
+
+</sect2>
+
+<sect2 id="Setting_and_Obtaining_Standard_Colormaps">
+<title>Setting and Obtaining Standard Colormaps</title>
+<!-- .XS -->
+<!-- (SN Setting and Obtaining Standard Colormaps -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to set and obtain an
+<structname>XStandardColormap</structname>
+structure.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To set an
+<structname>XStandardColormap</structname>
+structure, use
+<xref linkend='XSetRGBColormaps' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetRGBColormaps</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetRGBColormaps'>
+<funcprototype>
+  <funcdef>void <function>XSetRGBColormaps</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>XStandardColormap<parameter> *std_colormap</parameter></paramdef>
+  <paramdef>int<parameter> count</parameter></paramdef>
+  <paramdef>Atom<parameter> property</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>std_colormap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the
+<structname>XStandardColormap</structname>
+structure to be used.
+<!-- .ds Cn colormaps -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>count</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of (Cn.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>property</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the property name.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The 
+<xref linkend='XSetRGBColormaps' xrefstyle='select: title'/>
+function replaces the <acronym>RGB</acronym> colormap definition in the specified property 
+on the named window.
+If the property does not already exist,
+<xref linkend='XSetRGBColormaps' xrefstyle='select: title'/>
+sets the <acronym>RGB</acronym> colormap definition in the specified property
+on the named window.
+The property is stored with a type of RGB_COLOR_MAP and a format of 32.
+Note that it is the caller's responsibility to honor the <acronym>ICCCM</acronym>
+restriction that only RGB_DEFAULT_MAP contain more than one definition.
+</para>
+<para>
+<!-- .LP -->
+The
+<xref linkend='XSetRGBColormaps' xrefstyle='select: title'/>
+function usually is only used by window or session managers.
+To create a standard colormap, 
+follow this procedure:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+Open a new connection to the same server.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Grab the server.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+See if the property is on the property list of the root window for the screen.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+If the desired property is not present:
+<!-- .RS -->
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Create a colormap (unless you are using the default colormap of the screen).
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Determine the color characteristics of the visual.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Allocate cells in the colormap (or create it with
+<symbol>AllocAll</symbol>).
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Call 
+<xref linkend='XStoreColors' xrefstyle='select: title'/>
+to store appropriate color values in the colormap.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Fill in the descriptive members in the 
+<structname>XStandardColormap</structname>
+structure.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Attach the property to the root window.
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Use
+<xref linkend='XSetCloseDownMode' xrefstyle='select: title'/>
+to make the resource permanent.
+<!-- .RE -->
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Ungrab the server.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+<xref linkend='XSetRGBColormaps' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>,
+<errorname>BadAtom</errorname>,
+and
+<errorname>BadWindow</errorname>
+errors.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To obtain the 
+<structname>XStandardColormap</structname>
+structure associated with the specified property, use
+<xref linkend='XGetRGBColormaps' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetRGBColormaps</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetRGBColormaps'>
+<funcprototype>
+  <funcdef>Status <function>XGetRGBColormaps</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Window<parameter> w</parameter></paramdef>
+  <paramdef>XStandardColormap<parameter> **std_colormap_return</parameter></paramdef>
+  <paramdef>int<parameter> *count_return</parameter></paramdef>
+  <paramdef>Atom<parameter> property</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>w</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the window.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>std_colormap_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the
+<structname>XStandardColormap</structname>
+structure.
+<!-- .ds Cn colormaps -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>count_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the number of (Cn.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>property</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the property name.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The 
+<xref linkend='XGetRGBColormaps' xrefstyle='select: title'/>
+function returns the <acronym>RGB</acronym> colormap definitions stored 
+in the specified property on the named window.
+If the property exists, is of type RGB_COLOR_MAP, is of format 32, 
+and is long enough to contain a colormap definition,
+<xref linkend='XGetRGBColormaps' xrefstyle='select: title'/>
+allocates and fills in space for the returned colormaps
+and returns a nonzero status.
+If the visualid is not present, 
+<xref linkend='XGetRGBColormaps' xrefstyle='select: title'/>
+assumes the default visual for the screen on which the window is located; 
+if the killid is not present, 
+<symbol>None</symbol>
+is assumed, which indicates that the resources cannot be released.
+Otherwise, 
+none of the fields are set, and 
+<xref linkend='XGetRGBColormaps' xrefstyle='select: title'/>
+returns a zero status.
+Note that it is the caller's responsibility to honor the <acronym>ICCCM</acronym>
+restriction that only RGB_DEFAULT_MAP contain more than one definition.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XGetRGBColormaps' xrefstyle='select: title'/>
+can generate
+<errorname>BadAtom</errorname>
+and
+<errorname>BadWindow</errorname>
+errors.
+<!-- .bp -->
+
+</para>
+</sect2>
+</sect1>
+</chapter>
diff --git a/specs/libX11/CH15.xml b/specs/libX11/CH15.xml
new file mode 100644 (file)
index 0000000..f6c76a4
--- /dev/null
@@ -0,0 +1,2483 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+         "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
+<chapter id='Resource_Manager_Functions'>
+<title>Resource Manager Functions</title>
+<!-- .sp 2 -->
+<!-- .nr H1 15 -->
+<!-- .nr H2 0 -->
+<!-- .nr H3 0 -->
+<!-- .nr H4 0 -->
+<!-- .nr H5 0 -->
+<!-- .na -->
+<para>
+<!-- .LP -->
+<!-- .XS -->
+<!-- Chapter 15: Resource Manager Functions -->
+<!-- .XE -->
+A program often needs a variety of options in the X environment
+(for example, fonts, colors, icons, and cursors).
+Specifying all of these options on the command line is awkward
+because users may want to customize many aspects of the program
+and need a convenient way to establish these customizations as
+the default settings.
+The resource manager is provided for this purpose.
+Resource specifications are usually stored in human-readable files
+and in server properties.
+</para>
+<para>
+<!-- .LP -->
+The resource manager is a database manager with a twist.
+In most database systems, 
+you perform a query using an imprecise specification,
+and you get back a set of records.
+The resource manager, however, allows you to specify a large
+set of values with an imprecise specification, to query the database 
+with a precise specification, and to get back only a single value.
+This should be used by applications that need to know what the
+user prefers for colors, fonts, and other resources.
+It is this use as a database for dealing with X resources that
+inspired the name "Resource Manager,"
+although the resource manager can be and is used in other ways.
+</para>
+<para>
+<!-- .LP -->
+For example, 
+a user of your application may want to specify 
+that all windows should have a blue background 
+but that all mail-reading windows should have a red background.
+With well-engineered and coordinated applications,
+a user can define this information using only two lines of specifications.
+</para>
+<para>
+<!-- .LP -->
+As an example of how the resource manager works,
+consider a mail-reading application called xmh.
+Assume that it is designed so that it uses a
+complex window hierarchy all the way down to individual command buttons,
+which may be actual small subwindows in some toolkits.
+These are often called objects or widgets.
+In such toolkit systems,
+each user interface object can be composed of other objects
+and can be assigned a name and a class.
+Fully qualified names or classes can have arbitrary numbers of component names,
+but a fully qualified name always has the same number of component names as a
+fully qualified class.
+This generally reflects the structure of the application as composed
+of these objects, starting with the application itself.
+</para>
+<para>
+<!-- .LP -->
+For example, the xmh mail program has a name "xmh" and is one
+of a class of "Mail" programs.
+By convention, the first character of class components is capitalized,
+and the first letter of name components is in lowercase.
+Each name and class finally has an attribute
+(for example, "foreground" or "font").
+If each window is properly assigned a name and class,
+it is easy for the user to specify attributes of any portion 
+of the application.
+</para>
+<para>
+<!-- .LP -->
+At the top level, 
+the application might consist of a paned window (that is, a window divided
+into several sections) named "toc".
+One pane of the paned window is a button box window named "buttons"
+and is filled with command buttons. 
+One of these command buttons is used to incorporate
+new mail and has the name "incorporate".
+This window has a fully qualified name, "xmh.toc.buttons.incorporate",
+and a fully qualified class, "Xmh.Paned.Box.Command".
+Its fully qualified name is the name of its parent, "xmh.toc.buttons", 
+followed by its name, "incorporate".
+Its class is the class of its parent, "Xmh.Paned.Box", 
+followed by its particular class, "Command".  
+The fully qualified name of a resource is
+the attribute's name appended to the object's fully qualified
+name, and the fully qualified class is its class appended to the object's
+class.
+</para>
+<para>
+<!-- .LP -->
+The incorporate button might need the following resources: 
+Title string,
+Font,
+Foreground color for its inactive state,
+Background color for its inactive state,
+Foreground color for its active state, and
+Background color for its active state.
+Each resource is considered
+to be an attribute of the button and, as such, has a name and a class.
+For example, the foreground color for the button in
+its active state might be named "activeForeground",
+and its class might be "Foreground".
+</para>
+<para>
+<!-- .LP -->
+When an application looks up a resource (for example, a color),
+it passes the complete name and complete class of the resource
+to a look-up routine.
+The resource manager compares this complete specification
+against the incomplete specifications of entries in the resource
+database, finds the best match, and returns the corresponding
+value for that entry.
+</para>
+<para>
+<!-- .LP -->
+The definitions for the resource manager are contained in
+<filename class="headerfile">&lt;X11/Xresource.h&gt;</filename>.
+<indexterm type="file"><primary><filename class="headerfile">X11/Xresource.h</filename></primary></indexterm>
+<indexterm><primary>Files</primary><secondary><filename class="headerfile">&lt;X11/Xresource.h&gt;</filename></secondary></indexterm>
+<indexterm><primary>Headers</primary><secondary><filename class="headerfile">&lt;X11/Xresource.h&gt;</filename></secondary></indexterm>
+</para>
+<sect1 id="Resource_File_Syntax">
+<title>Resource File Syntax</title>
+<!-- .XS -->
+<!-- (SN Resource File Syntax -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The syntax of a resource file is a sequence of resource lines
+terminated by newline characters or the end of the file.
+The syntax of an individual resource line is:
+</para>
+<para>
+<!-- .LP -->
+<!-- .\" Start marker code here -->
+<literallayout class="monospaced">
+<!-- .TA 1.5i 1.75i -->
+<!-- .ta 1.5i 1.75i -->
+ResourceLine     =     Comment | IncludeFile | ResourceSpec | &lt;empty line&gt;
+Comment     =     "!" {&lt;any character except null or newline&gt;}
+IncludeFile     =     "#" WhiteSpace "include" WhiteSpace FileName WhiteSpace
+FileName     =     &lt;valid filename for operating system&gt;
+ResourceSpec     =     WhiteSpace ResourceName WhiteSpace ":" WhiteSpace Value
+ResourceName     =     [Binding] {Component Binding} ComponentName
+Binding     =     "." | "*"
+WhiteSpace     =     {&lt;space&gt; | &lt;horizontal tab&gt;}
+Component     =     "?" | ComponentName
+ComponentName     =     NameChar {NameChar}
+NameChar     =     "a"-"z" | "A"-"Z" | "0"-"9" | "_" | "-"
+Value     =     {&lt;any character except null or unescaped newline&gt;}
+</literallayout>
+<!-- .\" End marker code here -->
+</para>
+<para>
+<!-- .LP -->
+Elements separated by vertical bar (|) are alternatives.
+Curly braces ({......}) indicate zero or more repetitions
+of the enclosed elements.
+Square brackets ([......]) indicate that the enclosed element is optional.
+Quotes ("......") are used around literal characters.
+</para>
+<para>
+<!-- .LP -->
+IncludeFile lines are interpreted by replacing the line with the
+contents of the specified file.
+The word "include" must be in lowercase.
+The file name is interpreted relative to the directory of the file in
+which the line occurs (for example, if the file name contains no
+directory or contains a relative directory specification).
+</para>
+<para>
+<!-- .LP -->
+If a ResourceName contains a contiguous sequence of two or more Binding
+characters, the sequence will be replaced with a single ".." character
+if the sequence contains only ".." characters;
+otherwise, the sequence will be replaced with a single "*" character.
+</para>
+<para>
+<!-- .LP -->
+A resource database never contains more than one entry for a given
+ResourceName.  If a resource file contains multiple lines with the
+same ResourceName, the last line in the file is used.
+</para>
+<para>
+<!-- .LP -->
+Any white space characters before or after the name or colon in a ResourceSpec
+are ignored.
+To allow a Value to begin with white space,
+the two-character sequence "\\<emphasis remap='I'>space</emphasis>" (backslash followed by space)
+is recognized and replaced by a space character,
+and the two-character sequence "\\<emphasis remap='I'>tab</emphasis>"
+(backslash followed by horizontal tab)
+is recognized and replaced by a horizontal tab character.
+To allow a Value to contain embedded newline characters,
+the two-character sequence "\\n" is recognized and replaced by a
+newline character.
+To allow a Value to be broken across multiple lines in a text file,
+the two-character sequence "\\<emphasis remap='I'>newline</emphasis>"
+(backslash followed by newline) is
+recognized and removed from the value.
+To allow a Value to contain arbitrary character codes,
+the four-character sequence "\\<emphasis remap='I'>nnn</emphasis>",
+where each <emphasis remap='I'>n</emphasis> is a digit character in the range of "0"-"7",
+is recognized and replaced with a single byte that contains
+the octal value specified by the sequence.
+Finally, the two-character sequence "\newline" is recognized
+and replaced with a single backslash.
+</para>
+<para>
+<!-- .LP -->
+As an example of these sequences,
+the following resource line contains a value consisting of four
+characters: a backslash, a null, a "z", and a newline:
+<literallayout class="monospaced">
+magic.values: \\000\
+z\n
+</literallayout>
+</para>
+</sect1>
+<sect1 id="Resource_Manager_Matching_Rules">
+<title>Resource Manager Matching Rules</title>
+<!-- .XS -->
+<!-- (SN Resource Manager Matching Rules -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The algorithm for determining which resource database entry
+matches a given query is the heart of the resource manager.
+All queries must fully specify the name and class of the desired resource
+(use of the characters "*" and "?" is not permitted).
+The library supports up to 100 components in a full name or class.
+Resources are stored in the database with only partially specified
+names and classes, using pattern matching constructs.
+An asterisk (*) is a loose binding and is used to represent any number
+of intervening components, including none.
+A period (.) is a tight binding and is used to separate immediately
+adjacent components.
+A question mark (?) is used to match any single component name or class.
+A database entry cannot end in a loose binding;
+the final component (which cannot be the character "?") must be specified.
+The lookup algorithm searches the database for the entry that most
+closely matches (is most specific for) the full name and class being queried.
+When more than one database entry matches the full name and class,
+precedence rules are used to select just one.
+</para>
+<para>
+<!-- .LP -->
+The full name and class are scanned from left to right (from highest
+level in the hierarchy to lowest), one component at a time.
+At each level, the corresponding component and/or binding of each
+matching entry is determined, and these matching components and
+bindings are compared according to precedence rules.
+Each of the rules is applied at each level before moving to the next level,
+until a rule selects a single entry over all others.
+The rules, in order of precedence, are:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+An entry that contains a matching component (whether name, class,
+or the character "?")
+takes precedence over entries that elide the level (that is, entries
+that match the level in a loose binding).
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+An entry with a matching name takes precedence over both
+entries with a matching class and entries that match using the character "?".
+An entry with a matching class takes precedence over
+entries that match using the character "?".
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+An entry preceded by a tight binding takes precedence over entries
+preceded by a loose binding.
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+To illustrate these rules,
+consider the following resource database entries:
+<literallayout class="monospaced">
+<!-- .TA 2.5i 3.5i -->
+<!-- .ta 2.5i 3.5i -->
+xmh*Paned*activeForeground:     red     <emphasis remap='I'>(entry A)</emphasis>
+*incorporate.Foreground:     blue     <emphasis remap='I'>(entry B)</emphasis>
+xmh.toc*Command*activeForeground:     green     <emphasis remap='I'>(entry C)</emphasis>
+xmh.toc*?.Foreground:     white     <emphasis remap='I'>(entry D)</emphasis>
+xmh.toc*Command.activeForeground:     black     <emphasis remap='I'>(entry E)</emphasis>
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+Consider a query for the resource:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA 3.5i -->
+<!-- .ta 3.5i -->
+xmh.toc.messagefunctions.incorporate.activeForeground     <emphasis remap='I'>(name)</emphasis>
+Xmh.Paned.Box.Command.Foreground     <emphasis remap='I'>(class)</emphasis>
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+At the first level (xmh, Xmh), rule 1 eliminates entry B.
+At the second level (toc, Paned), rule 2 eliminates entry A.
+At the third level (messagefunctions, Box), no entries are eliminated.
+At the fourth level (incorporate, Command), rule 2 eliminates entry D.
+At the fifth level (activeForeground, Foreground), rule 3 eliminates entry C.
+</para>
+</sect1>
+<sect1 id="Quarks">
+<title>Quarks</title>
+<!-- .XS -->
+<!-- (SN Quarks -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Most uses of the resource manager involve defining names,
+classes, and representation types as string constants.
+However, always referring to strings in the resource manager can be slow,
+because it is so heavily used in some toolkits.
+To solve this problem, 
+a shorthand for a string is used in place of the string
+in many of the resource manager functions.
+Simple comparisons can be performed rather than string comparisons.
+The shorthand name for a string is called a quark and is the
+type 
+<type>XrmQuark</type>.
+On some occasions,
+you may want to allocate a quark that has no string equivalent.
+</para>
+<para>
+<!-- .LP -->
+A quark is to a string what an atom is to a string in the server,
+but its use is entirely local to your application.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To allocate a new quark, use
+<function>XrmUniqueQuark</function>.
+</para>
+<indexterm significance="preferred"><primary>XrmUniqueQuark</primary></indexterm>
+<!-- .sM -->
+<para>XrmQuark XrmUniqueQuark()</para>
+<!-- .FN -->
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<function>XrmUniqueQuark</function>
+function allocates a quark that is guaranteed not to represent any string that
+is known to the resource manager.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+Each name, class, and representation type is typedef'd as an
+<type>XrmQuark</type>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sM -->
+<literallayout class="monospaced">
+typedef int XrmQuark, *XrmQuarkList;
+typedef XrmQuark XrmName;
+typedef XrmQuark XrmClass;
+typedef XrmQuark XrmRepresentation;
+#define NULLQUARK ((XrmQuark) 0)
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+Lists are represented as null-terminated arrays of quarks.
+The size of the array must be large enough for the number of components used.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sM -->
+<literallayout class="monospaced">
+typedef XrmQuarkList XrmNameList;
+typedef XrmQuarkList XrmClassList;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<!-- .sp -->
+To convert a string to a quark, use
+<xref linkend='XrmStringToQuark' xrefstyle='select: title'/>
+or
+<function>XrmPermStringToQuark</function>.
+</para>
+<literallayout class="monospaced">
+#define XrmStringToName(string) XrmStringToQuark(string)
+#define XrmStringToClass(string) XrmStringToQuark(string)
+#define XrmStringToRepresentation(string) XrmStringToQuark(string)
+</literallayout>
+
+<indexterm significance="preferred"><primary>XrmStringToQuark</primary></indexterm>
+<indexterm significance="preferred"><primary>XrmPermStringToQuark</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XrmStringToQuark'>
+<funcprototype>
+  <funcdef>XrmQuark <function>XrmStringToQuark</function></funcdef>
+  <paramdef>char<parameter> *string</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<!-- .ds Ql -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>string</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the string for which a quark(Ql is to be allocated.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+These functions can be used to convert from string to quark representation.
+If the string is not in the Host Portable Character Encoding,
+the conversion is implementation-dependent.
+The string argument to
+<xref linkend='XrmStringToQuark' xrefstyle='select: title'/>
+need not be permanently allocated storage.
+<function>XrmPermStringToQuark</function>
+is just like
+<xref linkend='XrmStringToQuark' xrefstyle='select: title'/>,
+except that Xlib is permitted to assume the string argument is permanently
+allocated,
+and, hence, that it can be used as the value to be returned by
+<xref linkend='XrmQuarkToString' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+For any given quark, if
+<xref linkend='XrmStringToQuark' xrefstyle='select: title'/>
+returns a non-NULL value,
+all future calls will return the same value (identical address).
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To convert a quark to a string, use 
+<xref linkend='XrmQuarkToString' xrefstyle='select: title'/>.
+</para>
+
+<literallayout class="monospaced">
+#define XrmNameToString(name)  XrmQuarkToString(name)
+#define XrmClassToString(class)  XrmQuarkToString(name)
+#define XrmRepresentationToString(type)  XrmQuarkToString(type)
+</literallayout>
+<indexterm significance="preferred"><primary>XrmQuarkToString</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XrmQuarkToString'>
+<funcprototype>
+  <funcdef>char *<function>XrmQuarkToString</function></funcdef>
+  <paramdef>XrmQuark<parameter> quark</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>quark</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the quark for which the equivalent string is desired.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<!-- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -->
+<para>
+These functions can be used to convert from quark representation to string.
+The string pointed to by the return value must not be modified or freed.
+The returned string is byte-for-byte equal to the original
+string passed to one of the string-to-quark routines.
+If no string exists for that quark,
+<xref linkend='XrmQuarkToString' xrefstyle='select: title'/>
+returns NULL.
+For any given quark, if
+<xref linkend='XrmQuarkToString' xrefstyle='select: title'/>
+returns a non-NULL value,
+all future calls will return the same value (identical address).
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To convert a string with one or more components to a quark list, use
+<xref linkend='XrmStringToQuarkList' xrefstyle='select: title'/>.
+</para>
+
+<literallayout class="monospaced">
+#define XrmStringToNameList(str,name)  XrmStringToQuarkList((str), (name))
+#define XrmStringToClassList(str,class)  XrmStringToQuarkList((str), (class))
+</literallayout>
+
+<indexterm significance="preferred"><primary>XrmStringToQuarkList</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XrmStringToQuarkList'>
+<funcprototype>
+  <funcdef>void <function>XrmStringToQuarkList</function></funcdef>
+  <paramdef>char<parameter> *string</parameter></paramdef>
+  <paramdef>XrmQuarkList<parameter> quarks_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<!-- .ds Ql \ list -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>string</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the string for which a quark(Ql is to be allocated.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>quarks_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the list of quarks.
+The caller must allocate sufficient space for the quarks list before calling 
+<xref linkend='XrmStringToQuarkList' xrefstyle='select: title'/>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XrmStringToQuarkList' xrefstyle='select: title'/>
+function converts the null-terminated string (generally a fully qualified name)
+to a list of quarks.
+Note that the string must be in the valid ResourceName format 
+(see <link linkend="Resource_File_Syntax">section 15.1</link>).
+If the string is not in the Host Portable Character Encoding,
+the conversion is implementation-dependent.
+</para>
+<para>
+<!-- .LP -->
+A binding list is a list of type
+<type>XrmBindingList</type>
+and indicates if components of name or class lists are bound tightly or loosely
+(that is, if wildcarding of intermediate components is specified).
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+typedef enum {XrmBindTightly, XrmBindLoosely} XrmBinding, *XrmBindingList;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<constant>XrmBindTightly</constant>
+indicates that a period separates the components, and
+<constant>XrmBindLoosely</constant>
+indicates that an asterisk separates the components.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To convert a string with one or more components to a binding list
+and a quark list, use
+<xref linkend='XrmStringToBindingQuarkList' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XrmStringToBindingQuarkList</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XrmStringToBindingQuarkList'>
+<funcprototype>
+  <funcdef><function>XrmStringToBindingQuarkList</function></funcdef>
+  <paramdef>char<parameter> *string</parameter></paramdef>
+  <paramdef>XrmBindingList<parameter> bindings_return</parameter></paramdef>
+  <paramdef>XrmQuarkList<parameter> quarks_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<!-- .ds Ql \ list -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>string</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the string for which a quark(Ql is to be allocated.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>bindings_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the binding list.
+The caller must allocate sufficient space for the binding list before calling 
+<xref linkend='XrmStringToBindingQuarkList' xrefstyle='select: title'/>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>quarks_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the list of quarks.
+The caller must allocate sufficient space for the quarks list before calling 
+<xref linkend='XrmStringToBindingQuarkList' xrefstyle='select: title'/>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+Component names in the list are separated by a period or 
+an asterisk character.
+The string must be in the format of a valid ResourceName
+(see <link linkend="Resource_File_Syntax">section 15.1</link>).
+If the string does not start with a period or an asterisk, 
+a tight binding is assumed.
+For example, the string ``*a.b*c'' becomes:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA .75i 1.5i 2.25i -->
+<!-- .ta .75i 1.5i 2.25i -->
+quarks:       a         b         c
+bindings:     loose     tight     loose
+</literallayout>
+</para>
+</sect1>
+<sect1 id="Creating_and_Storing_Databases">
+<title>Creating and Storing Databases</title>
+<!-- .XS -->
+<!-- (SN Creating and Storing Databases -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XrmDatabase</primary></indexterm>
+A resource database is an opaque type,
+<type>XrmDatabase</type>.
+Each database value is stored in an
+<type>XrmValue</type>
+structure.
+This structure consists of a size, an address, and a representation type.
+The size is specified in bytes.
+The representation type is a way for you to store data tagged by some 
+application-defined type (for example, the strings ``font'' or ``color'').
+It has nothing to do with the C data type or with its class. 
+The
+<type>XrmValue</type>
+structure is defined as:
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XrmValue</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+typedef struct {
+     unsigned int size;
+     XPointer addr;
+} XrmValue, *XrmValuePtr;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<!-- .sp -->
+To initialize the resource manager, use
+<xref linkend='XrmInitialize' xrefstyle='select: title'/>.
+<indexterm significance="preferred"><primary>XrmInitialize</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XrmInitialize'>
+<funcprototype>
+  <funcdef>void <function>XrmInitialize</function></funcdef>
+  <paramdef>void<parameter> XrmInitialize(\|)</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+To retrieve a database from disk, use
+<xref linkend='XrmGetFileDatabase' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XrmGetFileDatabase</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XrmGetFileDatabase'>
+<funcprototype>
+  <funcdef>XrmDatabase <function>XrmGetFileDatabase</function></funcdef>
+  <paramdef>char<parameter> *filename</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>filename</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the resource database file name.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XrmGetFileDatabase' xrefstyle='select: title'/>
+function opens the specified file,
+creates a new resource database, and loads it with the specifications
+read in from the specified file.
+The specified file should contain a sequence of entries in valid ResourceLine
+format (see <link linkend="Resource_File_Syntax">section 15.1</link>);
+the database that results from reading a file
+with incorrect syntax is implementation-dependent.
+The file is parsed in the current locale, 
+and the database is created in the current locale.
+If it cannot open the specified file,
+<xref linkend='XrmGetFileDatabase' xrefstyle='select: title'/>
+returns NULL.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To store a copy of a database to disk, use
+<xref linkend='XrmPutFileDatabase' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XrmPutFileDatabase</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XrmPutFileDatabase'>
+<funcprototype>
+  <funcdef>void <function>XrmPutFileDatabase</function></funcdef>
+  <paramdef>XrmDatabase<parameter> database</parameter></paramdef>
+  <paramdef>char<parameter> *stored_db</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>database</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the database that is to be used.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>stored_db</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the file name for the stored database.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XrmPutFileDatabase' xrefstyle='select: title'/>
+function stores a copy of the specified database in the specified file.
+Text is written to the file as a sequence of entries in valid
+ResourceLine format
+(see <link linkend="Resource_File_Syntax">section 15.1</link>).
+The file is written in the locale of the database.
+Entries containing resource names that are not in the Host Portable Character
+Encoding or containing values that are not in the encoding of the database
+locale, are written in an implementation-dependent manner.
+The order in which entries are written is implementation-dependent.
+Entries with representation types other than ``String'' are ignored.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain a pointer to the screen-independent resources of a display, use
+<xref linkend='XResourceManagerString' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XResourceManagerString</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XResourceManagerString'>
+<funcprototype>
+  <funcdef>char *<function>XResourceManagerString</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XResourceManagerString' xrefstyle='select: title'/>
+function returns the RESOURCE_MANAGER property from the server's root
+window of screen zero, which was returned when the connection was opened using
+<xref linkend='XOpenDisplay' xrefstyle='select: title'/>.
+The property is converted from type STRING to the current locale.
+The conversion is identical to that produced by 
+<xref linkend='XmbTextPropertyToTextList' xrefstyle='select: title'/>
+for a single element STRING property.
+The returned string is owned by Xlib and should not be freed by the client.
+The property value must be in a format that is acceptable to
+<xref linkend='XrmGetStringDatabase' xrefstyle='select: title'/>.
+If no property exists, NULL is returned.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain a pointer to the screen-specific resources of a screen, use
+<xref linkend='XScreenResourceString' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XScreenResourceString</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XScreenResourceString'>
+<funcprototype>
+  <funcdef>char *<function>XScreenResourceString</function></funcdef>
+  <paramdef>Screen<parameter> *screen</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the screen.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XScreenResourceString' xrefstyle='select: title'/>
+function returns the SCREEN_RESOURCES property from the root window of the
+specified screen.
+The property is converted from type STRING to the current locale.
+The conversion is identical to that produced by 
+<xref linkend='XmbTextPropertyToTextList' xrefstyle='select: title'/>
+for a single element STRING property.
+The property value must be in a format that is acceptable to
+<xref linkend='XrmGetStringDatabase' xrefstyle='select: title'/>.
+If no property exists, NULL is returned.
+The caller is responsible for freeing the returned string by using
+<xref linkend='XFree' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To create a database from a string, use
+<xref linkend='XrmGetStringDatabase' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XrmGetStringDatabase</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XrmGetStringDatabase'>
+<funcprototype>
+  <funcdef>XrmDatabase <function>XrmGetStringDatabase</function></funcdef>
+  <paramdef>char<parameter> *data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the database contents using a string.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XrmGetStringDatabase' xrefstyle='select: title'/>
+function creates a new database and stores the resources specified
+in the specified null-terminated string.
+<xref linkend='XrmGetStringDatabase' xrefstyle='select: title'/>
+is similar to
+<xref linkend='XrmGetFileDatabase' xrefstyle='select: title'/>
+except that it reads the information out of a string instead of out of a file.
+The string should contain a sequence of entries in valid ResourceLine
+format (see <link linkend="Resource_File_Syntax">section 15.1</link>)
+terminated by a null character;
+the database that results from using a string
+with incorrect syntax is implementation-dependent.
+The string is parsed in the current locale, 
+and the database is created in the current locale.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain the locale name of a database, use
+<xref linkend='XrmLocaleOfDatabase' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XrmLocaleOfDatabase</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XrmLocaleOfDatabase'>
+<funcprototype>
+  <funcdef>char *<function>XrmLocaleOfDatabase</function></funcdef>
+  <paramdef>XrmDatabase<parameter> database</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>database</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the resource database.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XrmLocaleOfDatabase' xrefstyle='select: title'/>
+function returns the name of the locale bound to the specified
+database, as a null-terminated string.
+The returned locale name string is owned by Xlib and should not be
+modified or freed by the client.
+Xlib is not permitted to free the string until the database is destroyed.
+Until the string is freed,
+it will not be modified by Xlib.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To destroy a resource database and free its allocated memory, use
+<xref linkend='XrmDestroyDatabase' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XrmDestroyDatabase</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XrmDestroyDatabase'>
+<funcprototype>
+  <funcdef>void <function>XrmDestroyDatabase</function></funcdef>
+  <paramdef>XrmDatabase<parameter> database</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>database</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the resource database.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+If database is NULL,
+<xref linkend='XrmDestroyDatabase' xrefstyle='select: title'/>
+returns immediately.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To associate a resource database with a display, use
+<xref linkend='XrmSetDatabase' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XrmSetDatabase</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XrmSetDatabase'>
+<funcprototype>
+  <funcdef>void <function>XrmSetDatabase</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XrmDatabase<parameter> database</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>database</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the resource database.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XrmSetDatabase' xrefstyle='select: title'/>
+function associates the specified resource database (or NULL)
+with the specified display.
+The database previously associated with the display (if any) is not destroyed.
+A client or toolkit may find this function convenient for retaining a database
+once it is constructed.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To get the resource database associated with a display, use
+<xref linkend='XrmGetDatabase' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XrmGetDatabase</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XrmGetDatabase'>
+<funcprototype>
+  <funcdef>XrmDatabase <function>XrmGetDatabase</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XrmGetDatabase' xrefstyle='select: title'/>
+function returns the database associated with the specified display.
+It returns NULL if a database has not yet been set.
+</para>
+</sect1>
+<sect1 id="Merging_Resource_Databases">
+<title>Merging Resource Databases</title>
+<!-- .XS -->
+<!-- (SN Merging Resource Databases -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To merge the contents of a resource file into a database, use
+<xref linkend='XrmCombineFileDatabase' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XrmCombineFileDatabase</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XrmCombineFileDatabase'>
+<funcprototype>
+  <funcdef>Status <function>XrmCombineFileDatabase</function></funcdef>
+  <paramdef>char<parameter> *filename</parameter></paramdef>
+  <paramdef>XrmDatabase<parameter> *target_db</parameter></paramdef>
+  <paramdef>Bool<parameter> override</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>filename</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the resource database file name.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>target_db</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the resource database into which the source 
+database is to be merged.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>override</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies whether source entries override target ones.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XrmCombineFileDatabase' xrefstyle='select: title'/>
+function merges the contents of a resource file into a database.
+If the same specifier is used for an entry in both the file and
+the database,
+the entry in the file will replace the entry in the database
+if override is
+<symbol>True</symbol>;
+otherwise, the entry in the file is discarded.
+The file is parsed in the current locale.
+If the file cannot be read,
+a zero status is returned;
+otherwise, a nonzero status is returned.
+If target_db contains NULL,
+<xref linkend='XrmCombineFileDatabase' xrefstyle='select: title'/>
+creates and returns a new database to it.
+Otherwise, the database pointed to by target_db is not destroyed by the merge.
+The database entries are merged without changing values or types,
+regardless of the locale of the database.
+The locale of the target database is not modified.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To merge the contents of one database into another database, use
+<xref linkend='XrmCombineDatabase' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XrmCombineDatabase</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XrmCombineDatabase'>
+<funcprototype>
+  <funcdef>void <function>XrmCombineDatabase</function></funcdef>
+  <paramdef>XrmDatabasesource_db,<parameter> *target_db</parameter></paramdef>
+  <paramdef>Bool<parameter> override</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>source_db</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the resource database that is to be merged into the target database.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>target_db</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the resource database into which the source 
+database is to be merged.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>override</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies whether source entries override target ones.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XrmCombineDatabase' xrefstyle='select: title'/>
+function merges the contents of one database into another.
+If the same specifier is used for an entry in both databases,
+the entry in the source_db will replace the entry in the target_db
+if override is
+<symbol>True</symbol>;
+otherwise, the entry in source_db is discarded.
+If target_db contains NULL,
+<xref linkend='XrmCombineDatabase' xrefstyle='select: title'/>
+simply stores source_db in it.
+Otherwise, source_db is destroyed by the merge, but the database pointed
+to by target_db is not destroyed.
+The database entries are merged without changing values or types,
+regardless of the locales of the databases.
+The locale of the target database is not modified.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To merge the contents of one database into another database with override
+semantics, use
+<xref linkend='XrmMergeDatabases' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XrmMergeDatabases</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XrmMergeDatabases'>
+<funcprototype>
+  <funcdef>void <function>XrmMergeDatabases</function></funcdef>
+  <paramdef>XrmDatabasesource_db,<parameter> *target_db</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>source_db</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the resource database that is to be merged into the target database.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>target_db</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the resource database into which the source 
+database is to be merged.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+Calling the
+<xref linkend='XrmMergeDatabases' xrefstyle='select: title'/>
+function is equivalent to calling the
+<xref linkend='XrmCombineDatabase' xrefstyle='select: title'/>
+function with an override argument of
+<symbol>True</symbol>.
+</para>
+</sect1>
+<sect1 id="Looking_Up_Resources">
+<title>Looking Up Resources</title>
+<!-- .XS -->
+<!-- (SN Looking Up Resources -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To retrieve a resource from a resource database, use
+<xref linkend='XrmGetResource' xrefstyle='select: title'/>,
+<xref linkend='XrmQGetResource' xrefstyle='select: title'/>,
+or
+<xref linkend='XrmQGetSearchResource' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XrmGetResource</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XrmGetResource'>
+<funcprototype>
+  <funcdef>Bool <function>XrmGetResource</function></funcdef>
+  <paramdef>XrmDatabase<parameter> database</parameter></paramdef>
+  <paramdef>char<parameter> *str_name</parameter></paramdef>
+  <paramdef>char<parameter> *str_class</parameter></paramdef>
+  <paramdef>char<parameter> **str_type_return</parameter></paramdef>
+  <paramdef>XrmValue<parameter> *value_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>database</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the database that is to be used.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>str_name</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the fully qualified name of the value being retrieved (as a string).
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>str_class</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the fully qualified class of the value being retrieved (as a string).
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>str_type_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the representation type of the destination (as a string).
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>value_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the value in the database.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<indexterm significance="preferred"><primary>XrmQGetResource</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XrmQGetResource'>
+<funcprototype>
+  <funcdef>Bool <function>XrmQGetResource</function></funcdef>
+  <paramdef>XrmDatabase<parameter> database</parameter></paramdef>
+  <paramdef>XrmNameList<parameter> quark_name</parameter></paramdef>
+  <paramdef>XrmClassList<parameter> quark_class</parameter></paramdef>
+  <paramdef>XrmRepresentation<parameter> *quark_type_return</parameter></paramdef>
+  <paramdef>XrmValue<parameter> *value_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>database</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the database that is to be used.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>quark_name</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the fully qualified name of the value being retrieved (as a quark).
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>quark_class</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the fully qualified class of the value being retrieved (as a quark).
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>quark_type_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the representation type of the destination (as a quark).
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>value_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the value in the database.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The 
+<xref linkend='XrmGetResource' xrefstyle='select: title'/>
+and 
+<xref linkend='XrmQGetResource' xrefstyle='select: title'/>
+functions retrieve a resource from the specified database.
+Both take a fully qualified name/class pair, a destination
+resource representation, and the address of a value
+(size/address pair).  
+The value and returned type point into database memory;
+therefore, you must not modify the data.
+</para>
+<para>
+<!-- .LP -->
+The database only frees or overwrites entries on
+<xref linkend='XrmPutResource' xrefstyle='select: title'/>,
+<xref linkend='XrmQPutResource' xrefstyle='select: title'/>,
+or 
+<xref linkend='XrmMergeDatabases' xrefstyle='select: title'/>.
+A client that is not storing new values into the database or
+is not merging the database should be safe using the address passed 
+back at any time until it exits.
+If a resource was found, both
+<xref linkend='XrmGetResource' xrefstyle='select: title'/>
+and
+<xref linkend='XrmQGetResource' xrefstyle='select: title'/>
+return 
+<symbol>True</symbol>;
+otherwise, they return 
+<symbol>False</symbol>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+Most applications and toolkits do not make random probes
+into a resource database to fetch resources.
+The X toolkit access pattern for a resource database is quite stylized.
+A series of from 1 to 20 probes is made with only the 
+last name/class differing in each probe.
+The 
+<xref linkend='XrmGetResource' xrefstyle='select: title'/>
+function is at worst a
+2<superscript><emphasis remap='I'>n</emphasis></superscript> algorithm,
+where <emphasis remap='I'>n</emphasis> is the length of the name/class list.
+This can be improved upon by the application programmer by prefetching a list
+of database levels that might match the first part of a name/class list.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain a list of database levels, use
+<function>XrmQGetSearchList</function>.
+</para>
+<indexterm significance="preferred"><primary>XrmQGetSearchList</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XrmQGetSearchResource'>
+<funcprototype>
+  <funcdef>Bool <function>XrmQGetSearchResource</function></funcdef>
+  <paramdef>XrmDatabase<parameter> database</parameter></paramdef>
+  <paramdef>XrmNameList<parameter> names</parameter></paramdef>
+  <paramdef>XrmClassList<parameter> classes</parameter></paramdef>
+  <paramdef>XrmSearchList<parameter> list_return</parameter></paramdef>
+  <paramdef>int<parameter> list_length</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>database</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the database that is to be used.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>names</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a list of resource names.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>classes</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a list of resource classes.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>list_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns a search list for further use.
+The caller must allocate sufficient space for the list before calling 
+<function>XrmQGetSearchList</function>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>list_length</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of entries (not the byte size) allocated for list_return.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<function>XrmQGetSearchList</function>
+function takes a list of names and classes
+and returns a list of database levels where a match might occur.
+The returned list is in best-to-worst order and
+uses the same algorithm as 
+<xref linkend='XrmGetResource' xrefstyle='select: title'/>
+for determining precedence.
+If list_return was large enough for the search list,
+<function>XrmQGetSearchList</function>
+returns 
+<symbol>True</symbol>;
+otherwise, it returns
+<symbol>False</symbol>.
+</para>
+<para>
+<!-- .LP -->
+The size of the search list that the caller must allocate is
+dependent upon the number of levels and wildcards in the resource specifiers 
+that are stored in the database.
+The worst case length is
+3<superscript><emphasis remap='I'>n</emphasis></superscript>,
+where <emphasis remap='I'>n</emphasis> is the number of name or class
+components in names or classes.
+</para>
+<para>
+<!-- .LP -->
+When using 
+<function>XrmQGetSearchList</function>
+followed by multiple probes for resources with a common name and class prefix,
+only the common prefix should be specified in the name and class list to 
+<function>XrmQGetSearchList</function>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To search resource database levels for a given resource, use
+<xref linkend='XrmQGetSearchResource' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XrmQGetSearchResource</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XrmQGetSearchResource_2'>
+<funcprototype>
+  <funcdef>Bool <function>XrmQGetSearchResource</function></funcdef>
+  <paramdef>XrmSearchList<parameter> list</parameter></paramdef>
+  <paramdef>XrmName<parameter> name</parameter></paramdef>
+  <paramdef>XrmClass<parameter> class</parameter></paramdef>
+  <paramdef>XrmRepresentation<parameter> *type_return</parameter></paramdef>
+  <paramdef>XrmValue<parameter> *value_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>list</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the search list returned by
+<function>XrmQGetSearchList</function>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>name</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the resource name.
+      </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'>type_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns data representation type.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>value_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the value in the database.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XrmQGetSearchResource' xrefstyle='select: title'/>
+function searches the specified database levels for the resource 
+that is fully identified by the specified name and class.
+The search stops with the first match.
+<xref linkend='XrmQGetSearchResource' xrefstyle='select: title'/>
+returns 
+<symbol>True</symbol>
+if the resource was found;
+otherwise, it returns
+<symbol>False</symbol>.
+</para>
+<para>
+<!-- .LP -->
+A call to 
+<function>XrmQGetSearchList</function>
+with a name and class list containing all but the last component 
+of a resource name followed by a call to 
+<xref linkend='XrmQGetSearchResource' xrefstyle='select: title'/>
+with the last component name and class returns the same database entry as 
+<xref linkend='XrmGetResource' xrefstyle='select: title'/>
+and 
+<xref linkend='XrmQGetResource' xrefstyle='select: title'/>
+with the fully qualified name and class.
+</para>
+</sect1>
+<sect1 id="Storing_into_a_Resource_Database">
+<title>Storing into a Resource Database</title>
+<!-- .XS -->
+<!-- (SN Storing into a Resource Database -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To store resources into the database, use
+<xref linkend='XrmPutResource' xrefstyle='select: title'/>
+or
+<xref linkend='XrmQPutResource' xrefstyle='select: title'/>.
+Both functions take a partial resource specification, a
+representation type, and a value.
+This value is copied into the specified database.
+</para>
+<!-- .LP -->
+<!-- .sp -->
+<indexterm significance="preferred"><primary>XrmPutResource</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XrmPutResource'>
+<funcprototype>
+  <funcdef>void <function>XrmPutResource</function></funcdef>
+  <paramdef>XrmDatabase<parameter> *database</parameter></paramdef>
+  <paramdef>char<parameter> *specifier</parameter></paramdef>
+  <paramdef>char<parameter> *type</parameter></paramdef>
+  <paramdef>XrmValue<parameter> *value</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>database</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the resource database.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>specifier</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a complete or partial specification of the resource.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>type</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the type of the resource.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>value</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the value of the resource, which is specified as a string.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+If database contains NULL,
+<xref linkend='XrmPutResource' xrefstyle='select: title'/>
+creates a new database and returns a pointer to it.
+<xref linkend='XrmPutResource' xrefstyle='select: title'/>
+is a convenience function that calls
+<xref linkend='XrmStringToBindingQuarkList' xrefstyle='select: title'/>
+followed by:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+XrmQPutResource(database, bindings, quarks, XrmStringToQuark(type), value)
+</literallayout>
+If the specifier and type are not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+The value is stored in the database without modification.
+</para>
+<!-- .LP -->
+<!-- .sp -->
+<indexterm significance="preferred"><primary>XrmQPutResource</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XrmQPutResource'>
+<funcprototype>
+  <funcdef>void <function>XrmQPutResource</function></funcdef>
+  <paramdef>XrmDatabase<parameter> *database</parameter></paramdef>
+  <paramdef>XrmBindingList<parameter> bindings</parameter></paramdef>
+  <paramdef>XrmQuarkList<parameter> quarks</parameter></paramdef>
+  <paramdef>XrmRepresentation<parameter> type</parameter></paramdef>
+  <paramdef>XrmValue<parameter> *value</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>database</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the resource database.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>bindings</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a list of bindings.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>quarks</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the complete or partial name or the class list of the resource.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>type</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the type of the resource.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>value</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the value of the resource, which is specified as a string.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+If database contains NULL,
+<xref linkend='XrmQPutResource' xrefstyle='select: title'/>
+creates a new database and returns a pointer to it.
+If a resource entry with the identical bindings and quarks already
+exists in the database, the previous type and value are replaced by the new
+specified type and value.
+The value is stored in the database without modification.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To add a resource that is specified as a string, use
+<xref linkend='XrmPutStringResource' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XrmPutStringResource</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XrmPutStringResource'>
+<funcprototype>
+  <funcdef>void <function>XrmPutStringResource</function></funcdef>
+  <paramdef>XrmDatabase<parameter> *database</parameter></paramdef>
+  <paramdef>char<parameter> *specifier</parameter></paramdef>
+  <paramdef>char<parameter> *value</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>database</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the resource database.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>specifier</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a complete or partial specification of the resource.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>value</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the value of the resource, which is specified as a string.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+If database contains NULL,
+<xref linkend='XrmPutStringResource' xrefstyle='select: title'/>
+creates a new database and returns a pointer to it.
+<xref linkend='XrmPutStringResource' xrefstyle='select: title'/>
+adds a resource with the specified value to the specified database.
+<xref linkend='XrmPutStringResource' xrefstyle='select: title'/>
+is a convenience function that first calls
+<xref linkend='XrmStringToBindingQuarkList' xrefstyle='select: title'/>
+on the specifier and then calls
+<xref linkend='XrmQPutResource' xrefstyle='select: title'/>,
+using a ``String'' representation type.
+If the specifier is not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+The value is stored in the database without modification.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To add a string resource using quarks as a specification, use
+<xref linkend='XrmQPutStringResource' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XrmQPutStringResource</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XrmQPutStringResource'>
+<funcprototype>
+  <funcdef>void <function>XrmQPutStringResource</function></funcdef>
+  <paramdef>XrmDatabase<parameter> *database</parameter></paramdef>
+  <paramdef>XrmBindingList<parameter> bindings</parameter></paramdef>
+  <paramdef>XrmQuarkList<parameter> quarks</parameter></paramdef>
+  <paramdef>char<parameter> *value</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>database</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the resource database.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>bindings</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies a list of bindings.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>quarks</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the complete or partial name or the class list of the resource.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>value</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the value of the resource, which is specified as a string.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+If database contains NULL,
+<xref linkend='XrmQPutStringResource' xrefstyle='select: title'/>
+creates a new database and returns a pointer to it.
+<xref linkend='XrmQPutStringResource' xrefstyle='select: title'/>
+is a convenience routine that constructs an
+<type>XrmValue</type>
+for the value string (by calling
+<function>strlen</function>
+to compute the size) and
+then calls
+<xref linkend='XrmQPutResource' xrefstyle='select: title'/>,
+using a ``String'' representation type.
+The value is stored in the database without modification.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To add a single resource entry that is specified as a string that contains
+both a name and a value, use
+<xref linkend='XrmPutLineResource' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XrmPutLineResource</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XrmPutLineResource'>
+<funcprototype>
+  <funcdef>void <function>XrmPutLineResource</function></funcdef>
+  <paramdef>XrmDatabase<parameter> *database</parameter></paramdef>
+  <paramdef>char<parameter> *line</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>database</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the resource database.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>line</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the resource name and value pair as a single string.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+If database contains NULL,
+<xref linkend='XrmPutLineResource' xrefstyle='select: title'/>
+creates a new database and returns a pointer to it.
+<xref linkend='XrmPutLineResource' xrefstyle='select: title'/>
+adds a single resource entry to the specified database.
+The line should be in valid ResourceLine format
+(see <link linkend="Resource_File_Syntax">section 15.1</link>)
+terminated by a newline or null character;
+the database that results from using a string
+with incorrect syntax is implementation-dependent.
+The string is parsed in the locale of the database.
+If the
+<replaceable>ResourceName</replaceable>
+is not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+Note that comment lines are not stored.
+</para>
+</sect1>
+<sect1 id="Enumerating_Database_Entries">
+<title>Enumerating Database Entries</title>
+<!-- .XS -->
+<!-- (SN Enumerating Database Entries -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To enumerate the entries of a database, use
+<xref linkend='XrmEnumerateDatabase' xrefstyle='select: title'/>.
+<indexterm significance="preferred"><primary>XrmEnumerateDatabase</primary></indexterm>
+<!-- .sM -->
+</para>
+
+<literallayout class="monospaced">
+#define       XrmEnumAllLevels       0
+#define       XrmEnumOneLevel        0
+</literallayout>
+
+<funcsynopsis id='XrmEnumerateDatabase'>
+<funcprototype>
+  <funcdef>Bool <function>XrmEnumerateDatabase</function></funcdef>
+  <paramdef>XrmDatabase<parameter> database</parameter></paramdef>
+  <paramdef>XrmNameList<parameter> name_prefix</parameter></paramdef>
+  <paramdef>XrmClassList<parameter> class_prefix</parameter></paramdef>
+  <paramdef>int<parameter> mode</parameter></paramdef>
+  <paramdef>Bool<parameter> (*proc)()</parameter></paramdef>
+  <paramdef>XPointer<parameter> arg</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>database</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the resource database.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>name_prefix</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the resource name prefix.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>class_prefix</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the resource class prefix.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>mode</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of levels to enumerate.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>proc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the procedure that is to be called for each matching entry.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>arg</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the user-supplied argument that will be passed to the procedure.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XrmEnumerateDatabase' xrefstyle='select: title'/>
+function calls the specified procedure for each resource in the database
+that would match some completion of the given name/class resource prefix.
+The order in which resources are found is implementation-dependent.
+If mode is
+<symbol>XrmEnumOneLevel</symbol>,
+a resource must match the given name/class prefix with
+just a single name and class appended.  If mode is
+<symbol>XrmEnumAllLevels</symbol>,
+the resource must match the given name/class prefix with one or more names and
+classes appended.
+If the procedure returns
+<symbol>True</symbol>,
+the enumeration terminates and the function returns
+<symbol>True</symbol>.
+If the procedure always returns
+<symbol>False</symbol>,
+all matching resources are enumerated and the function returns
+<symbol>False</symbol>.
+</para>
+<para>
+<!-- .LP -->
+The procedure is called with the following arguments:
+</para>
+<para>
+<!-- .LP -->
+<!-- .\" Start marker code here -->
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+(*<emphasis remap='I'>proc</emphasis>)(<emphasis remap='I'>database</emphasis>, <emphasis remap='I'>bindings</emphasis>, <emphasis remap='I'>quarks</emphasis>, <emphasis remap='I'>type</emphasis>, <emphasis remap='I'>value</emphasis>, <emphasis remap='I'>arg</emphasis>)
+     XrmDatabase *<emphasis remap='I'>database</emphasis>;
+     XrmBindingList <emphasis remap='I'>bindings</emphasis>;
+     XrmQuarkList <emphasis remap='I'>quarks</emphasis>;
+     XrmRepresentation *<emphasis remap='I'>type</emphasis>;
+     XrmValue *<emphasis remap='I'>value</emphasis>;
+     XPointer <emphasis remap='I'>arg</emphasis>;
+</literallayout>
+<!-- .\" End marker code here -->
+</para>
+<para>
+<!-- .LP -->
+The bindings and quarks lists are terminated by
+<symbol>NULLQUARK</symbol>.
+Note that pointers
+to the database and type are passed, but these values should not be modified.
+</para>
+<para>
+<!-- .LP -->
+The procedure must not modify the database.
+If Xlib has been initialized for threads, the procedure is called with
+the database locked and the result of a call by the procedure to any
+Xlib function using the same database is not defined.
+</para>
+</sect1>
+<sect1 id="Parsing_Command_Line_Options">
+<title>Parsing Command Line Options</title>
+<!-- .XS -->
+<!-- (SN Parsing Command Line Options  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The
+<xref linkend='XrmParseCommand' xrefstyle='select: title'/>
+function can be used to parse the command line arguments to a program
+and modify a resource database with selected entries from the command line.
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XrmOptionKind</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef enum {
+     XrmoptionNoArg,     /* Value is specified in XrmOptionDescRec.value */
+     XrmoptionIsArg,     /* Value is the option string itself */
+     XrmoptionStickyArg,     /* Value is characters immediately following option */
+     XrmoptionSepArg,     /* Value is next argument in argv */
+     XrmoptionResArg,     /* Resource and value in next argument in argv */
+     XrmoptionSkipArg,     /* Ignore this option and the next argument in argv */
+     XrmoptionSkipLine,     /* Ignore this option and the rest of argv */
+     XrmoptionSkipNArgs     /* Ignore this option and the next
+          \ \ \ XrmOptionDescRec.value arguments in argv */
+} XrmOptionKind;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+Note that
+<constant>XrmoptionSkipArg</constant>
+is equivalent to 
+<constant>XrmoptionSkipNArgs</constant>
+with the
+<structname>XrmOptionDescRec</structname>.<structfield>value</structfield>
+field containing the value one.
+Note also that the value zero for
+<constant>XrmoptionSkipNArgs</constant>
+indicates that only the option itself is to be skipped.
+</para>
+<para>
+<!-- .LP -->
+<indexterm significance="preferred"><primary>XrmOptionDescRec</primary></indexterm>
+<!-- .sM -->
+<literallayout class="monospaced">
+<!-- .TA .5i 2.5i -->
+<!-- .ta .5i 2.5i -->
+typedef struct {
+     char *option;     /* Option specification string in argv              */
+     char *specifier;     /* Binding and resource name (sans application name)    */
+     XrmOptionKind argKind;     /* Which style of option it is         */
+     XPointer value;     /* Value to provide if XrmoptionNoArg or 
+          \ \ \ XrmoptionSkipNArgs   */
+} XrmOptionDescRec, *XrmOptionDescList;
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<!-- .sp -->
+To load a resource database from a C command line, use
+<xref linkend='XrmParseCommand' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XrmParseCommand</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XrmParseCommand'>
+<funcprototype>
+  <funcdef>void <function>XrmParseCommand</function></funcdef>
+  <paramdef>XrmDatabase<parameter> *database</parameter></paramdef>
+  <paramdef>XrmOptionDescList<parameter> table</parameter></paramdef>
+  <paramdef>int<parameter> table_count</parameter></paramdef>
+  <paramdef>char<parameter> *name</parameter></paramdef>
+  <paramdef>int<parameter> *argc_in_out</parameter></paramdef>
+  <paramdef>char<parameter> **argv_in_out</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>database</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the resource database.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>table</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the table of command line arguments to be parsed.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>table_count</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of entries in the table.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>name</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the application name.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>argc_in_out</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of arguments and returns the number of remaining arguments.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>argv_in_out</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the command line arguments
+and returns the remaining arguments.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XrmParseCommand' xrefstyle='select: title'/>
+function parses an (argc, argv) pair according to the specified option table,
+loads recognized options into the specified database with type ``String,''
+and modifies the (argc, argv) pair to remove all recognized options.
+If database contains NULL,
+<xref linkend='XrmParseCommand' xrefstyle='select: title'/>
+creates a new database and returns a pointer to it.
+Otherwise, entries are added to the database specified.
+If a database is created, it is created in the current locale.
+</para>
+<para>
+<!-- .LP -->
+The specified table is used to parse the command line.
+Recognized options in the table are removed from argv,
+and entries are added to the specified resource database
+in the order they occur in argv.
+The table entries contain information on the option string,
+the option name, the style of option, 
+and a value to provide if the option kind is 
+<constant>XrmoptionNoArg</constant>.
+The option names are compared byte-for-byte to arguments in argv,
+independent of any locale.
+The resource values given in the table are stored in the resource database
+without modification.
+All resource database entries are created
+using a ``String'' representation type.
+The argc argument specifies the number of arguments in argv
+and is set on return to the remaining number of arguments that were not parsed.
+The name argument should be the name of your application
+for use in building the database entry.
+The name argument is prefixed to the resourceName in the option table
+before storing a database entry.
+The name argument is treated as a single component, even if it
+has embedded periods.
+No separating (binding) character is inserted,
+so the table must contain either a period (.) or an asterisk (*)
+as the first character in each resourceName entry.
+To specify a more completely qualified resource name,
+the resourceName entry can contain multiple components.
+If the name argument and the resourceNames are not in the
+Host Portable Character Encoding,
+the result is implementation-dependent.
+</para>
+<para>
+<!-- .LP -->
+The following provides a sample option table:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+<!-- .TA 1.25i 3.25i 4.75i -->
+<!-- .ta 1.25i 3.25i 4.75i -->
+static XrmOptionDescRec opTable[] = {
+{"-background",     "*background",                 XrmoptionSepArg,    (XPointer) NULL},
+{"-bd",             "*borderColor",                XrmoptionSepArg,    (XPointer) NULL},
+{"-bg",             "*background",                 XrmoptionSepArg,    (XPointer) NULL},
+{"-borderwidth",    "*TopLevelShell.borderWidth",  XrmoptionSepArg,    (XPointer) NULL},
+{"-bordercolor",    "*borderColor",                XrmoptionSepArg,    (XPointer) NULL},
+{"-bw",             "*TopLevelShell.borderWidth",  XrmoptionSepArg,    (XPointer) NULL},
+{"-display",        ".display",                    XrmoptionSepArg,    (XPointer) NULL},
+{"-fg",             "*foreground",                 XrmoptionSepArg,    (XPointer) NULL},
+{"-fn",             "*font",                       XrmoptionSepArg,    (XPointer) NULL},
+{"-font",           "*font",                       XrmoptionSepArg,    (XPointer) NULL},
+{"-foreground",     "*foreground",                 XrmoptionSepArg,    (XPointer) NULL},
+{"-geometry",       ".TopLevelShell.geometry",     XrmoptionSepArg,    (XPointer) NULL},
+{"-iconic",         ".TopLevelShell.iconic",       XrmoptionNoArg,     (XPointer) "on"},
+{"-name",           ".name",                       XrmoptionSepArg,    (XPointer) NULL},
+{"-reverse",        "*reverseVideo",               XrmoptionNoArg,     (XPointer) "on"},
+{"-rv",             "*reverseVideo",               XrmoptionNoArg,     (XPointer) "on"},
+{"-synchronous",    "*synchronous",                XrmoptionNoArg,     (XPointer) "on"},
+{"-title",          ".TopLevelShell.title",        XrmoptionSepArg,    (XPointer) NULL},
+{"-xrm",            NULL,                          XrmoptionResArg,    (XPointer) NULL},
+};
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+In this table, if the -background (or -bg) option is used to set
+background colors, the stored resource specifier matches all
+resources of attribute background.  
+If the -borderwidth option is used, 
+the stored resource specifier applies only to border width
+attributes of class TopLevelShell (that is, outer-most windows, including
+pop-up windows).  
+If the -title option is used to set a window name,
+only the topmost application windows receive the resource.
+</para>
+<para>
+<!-- .LP -->
+When parsing the command line,
+any unique unambiguous abbreviation for an option name in the table is 
+considered a match for the option.
+Note that uppercase and lowercase matter.
+<!-- .bp -->
+
+</para>
+</sect1>
+</chapter>
diff --git a/specs/libX11/CH16.xml b/specs/libX11/CH16.xml
new file mode 100644 (file)
index 0000000..e70b799
--- /dev/null
@@ -0,0 +1,4160 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+         "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
+<chapter id='Application_Utility_Functions'>
+<title>Application Utility Functions</title>
+<!-- .sp 2 -->
+<!-- .nr H1 16 -->
+<!-- .nr H2 0 -->
+<!-- .nr H3 0 -->
+<!-- .nr H4 0 -->
+<!-- .nr H5 0 -->
+<!-- .na -->
+<para>
+<!-- .LP -->
+<!-- .XS -->
+<!-- Chapter 16: Application Utility Functions  -->
+<!-- .XE -->
+Once you have initialized the X system,
+you can use the Xlib utility functions to:
+</para>
+<itemizedlist>
+  <listitem>
+    <para>
+Use keyboard utility functions
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Use Latin-1 keyboard event functions
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Allocate permanent storage
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Parse the window geometry
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Manipulate regions
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Use cut buffers
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Determine the appropriate visual type
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Manipulate images
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Manipulate bitmaps
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Use the context manager
+    </para>
+  </listitem>
+</itemizedlist>
+<para>
+<!-- .LP -->
+As a group,
+the functions discussed in this chapter provide the functionality that 
+is frequently needed and that spans toolkits.
+Many of these functions do not generate actual protocol requests to the server.
+</para>
+<sect1 id="Using_Keyboard_Utility_Functions">
+<title>Using Keyboard Utility Functions</title>
+<!-- .XS -->
+<!-- (SN Using Keyboard Utility Functions  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+This section discusses mapping between KeyCodes and KeySyms,
+classifying KeySyms, and mapping between KeySyms and string names.
+The first three functions in this section operate on a cached copy of the
+server keyboard mapping.
+The first four KeySyms for each KeyCode
+are modified according to the rules given in section 12.7.
+To obtain the untransformed KeySyms defined for a key,
+use the functions described in section 12.7.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain a KeySym for the KeyCode of an event, use
+<xref linkend='XLookupKeysym' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XLookupKeysym</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XLookupKeysym'>
+<funcprototype>
+  <funcdef>KeySym <function>XLookupKeysym</function></funcdef>
+  <paramdef>XKeyEvent<parameter> *key_event</parameter></paramdef>
+  <paramdef>int<parameter> index</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>key_event</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the 
+<symbol>KeyPress</symbol>
+or
+<symbol>KeyRelease</symbol>
+event.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>index</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the index into the KeySyms list for the event's KeyCode.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XLookupKeysym' xrefstyle='select: title'/>
+function uses a given keyboard event and the index you specified to return
+the KeySym from the list that corresponds to the KeyCode member in the
+<type>XKeyPressedEvent</type>
+or
+<type>XKeyReleasedEvent</type>
+structure.
+If no KeySym is defined for the KeyCode of the event,
+<xref linkend='XLookupKeysym' xrefstyle='select: title'/>
+returns
+<symbol>NoSymbol</symbol>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain a KeySym for a specific KeyCode, use
+<xref linkend='XKeycodeToKeysym' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XKeycodeToKeysym</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XKeycodeToKeysym'>
+<funcprototype>
+  <funcdef>KeySym <function>XKeycodeToKeysym</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>KeyCode<parameter> keycode</parameter></paramdef>
+  <paramdef>int<parameter> index</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>keycode</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the KeyCode.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>index</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the element of KeyCode vector.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XKeycodeToKeysym' xrefstyle='select: title'/>
+function uses internal Xlib tables
+and returns the KeySym defined for the specified KeyCode and
+the element of the KeyCode vector.
+If no symbol is defined,
+<xref linkend='XKeycodeToKeysym' xrefstyle='select: title'/>
+returns
+<symbol>NoSymbol</symbol>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain a KeyCode for a key having a specific KeySym, use
+<xref linkend='XKeysymToKeycode' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XKeysymToKeycode</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XKeysymToKeycode'>
+<funcprototype>
+  <funcdef>KeyCode <function>XKeysymToKeycode</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>KeySym<parameter> keysym</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>keysym</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the KeySym that is to be searched for.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+If the specified KeySym is not defined for any KeyCode,
+<xref linkend='XKeysymToKeycode' xrefstyle='select: title'/>
+returns zero.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+The mapping between KeyCodes and KeySyms is cached internal to Xlib.
+When this information is changed at the server, an Xlib function must
+be called to refresh the cache.
+To refresh the stored modifier and keymap information, use
+<xref linkend='XRefreshKeyboardMapping' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XRefreshKeyboardMapping</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XRefreshKeyboardMapping'>
+<funcprototype>
+  <funcdef><function>XRefreshKeyboardMapping</function></funcdef>
+  <paramdef>XMappingEvent<parameter> *event_map</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event_map</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the mapping event that is to be used.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XRefreshKeyboardMapping' xrefstyle='select: title'/>
+function refreshes the stored modifier and keymap information.
+You usually call this function when a
+<symbol>MappingNotify</symbol>
+event with a request member of
+<symbol>MappingKeyboard</symbol>
+or
+<symbol>MappingModifier</symbol>
+occurs.
+The result is to update Xlib's knowledge of the keyboard.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain the uppercase and lowercase forms of a KeySym, use
+<xref linkend='XConvertCase' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XConvertCase</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XConvertCase'>
+<funcprototype>
+  <funcdef>void <function>XConvertCase</function></funcdef>
+  <paramdef>KeySym<parameter> keysym</parameter></paramdef>
+  <paramdef>KeySym<parameter> *lower_return</parameter></paramdef>
+  <paramdef>KeySym<parameter> *upper_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<!-- .ds Fn converted -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>keysym</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the KeySym that is to be (Fn.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>lower_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the lowercase form of keysym, or keysym.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>upper_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the uppercase form of keysym, or keysym.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XConvertCase' xrefstyle='select: title'/>
+function returns the uppercase and lowercase forms of the specified Keysym,
+if the KeySym is subject to case conversion;
+otherwise, the specified KeySym is returned to both lower_return and
+upper_return.
+Support for conversion of other than Latin and Cyrillic KeySyms is
+implementation-dependent.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+KeySyms have string names as well as numeric codes.
+To convert the name of the KeySym to the KeySym code, use
+<xref linkend='XStringToKeysym' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XStringToKeysym</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XStringToKeysym'>
+<funcprototype>
+  <funcdef>KeySym <function>XStringToKeysym</function></funcdef>
+  <paramdef>char<parameter> *string</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>string</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the name of the KeySym that is to be converted.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+Standard KeySym names are obtained from
+<filename class="headerfile">&lt;X11/keysymdef.h&gt;</filename>
+<indexterm type="file"><primary><filename class="headerfile">X11/keysymdef.h</filename></primary></indexterm>
+<indexterm><primary>Files</primary><secondary><filename class="headerfile">&lt;X11/keysymdef.h&gt;</filename></secondary></indexterm>
+<indexterm><primary>Headers</primary><secondary><filename class="headerfile">&lt;X11/keysymdef.h&gt;</filename></secondary></indexterm>
+by removing the XK_ prefix from each name.
+KeySyms that are not part of the Xlib standard also may be obtained
+with this function.
+The set of KeySyms that are available in this manner 
+and the mechanisms by which Xlib obtains them is implementation-dependent.
+</para>
+<para>
+<!-- .LP -->
+If the KeySym name is not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+If the specified string does not match a valid KeySym,
+<xref linkend='XStringToKeysym' xrefstyle='select: title'/>
+returns
+<symbol>NoSymbol</symbol>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To convert a KeySym code to the name of the KeySym, use
+<xref linkend='XKeysymToString' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XKeysymToString</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XKeysymToString'>
+<funcprototype>
+  <funcdef>char *<function>XKeysymToString</function></funcdef>
+  <paramdef>KeySym<parameter> keysym</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<!-- .ds Fn converted -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>keysym</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the KeySym that is to be (Fn.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The returned string is in a static area and must not be modified.
+The returned string is in the Host Portable Character Encoding.
+If the specified KeySym is not defined,
+<xref linkend='XKeysymToString' xrefstyle='select: title'/>
+returns a NULL.
+</para>
+<sect2 id="KeySym_Classification_Macros">
+<title>KeySym Classification Macros</title>
+<!-- .XS -->
+<!-- (SN KeySym Classification Macros -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+You may want to test if a KeySym is, for example, 
+on the keypad or on one of the function keys.
+You can use KeySym macros to perform the following tests.
+</para>
+<para>IsCursorKey(<emphasis remap='I'>keysym</emphasis>)</para>
+<!-- .FN -->
+<!-- .ds Fn tested -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>keysym</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the KeySym that is to be tested.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>IsCursorKey</primary></indexterm>
+Returns
+<symbol>True</symbol>
+if the specified KeySym is a cursor key.
+</para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+<para>IsFunctionKey(<emphasis remap='I'>keysym</emphasis>)</para>
+<!-- .FN -->
+<!-- .ds Fn tested -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>keysym</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the KeySym that is to be tested.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>IsFunctionKey</primary></indexterm>
+Returns 
+<symbol>True</symbol>
+if the specified KeySym is a function key.
+</para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+<para>IsKeypadKey(<emphasis remap='I'>keysym</emphasis>)</para>
+<!-- .FN -->
+<!-- .ds Fn tested -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>keysym</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the KeySym that is to be (Fn.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>IsKeypadKey</primary></indexterm>
+Returns
+<symbol>True</symbol>
+if the specified KeySym is a standard keypad key.
+</para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+<para>IsPrivateKeypadKey(<emphasis remap='I'>keysym</emphasis>)</para>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>keysym</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the KeySym that is to be (Fn.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>IsPrivateKeypadKey</primary></indexterm>
+Returns
+<symbol>True</symbol>
+if the specified KeySym is a vendor-private keypad key.
+</para>
+
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+<para>IsMiscFunctionKey(<emphasis remap='I'>keysym</emphasis>)</para>
+<!-- .FN -->
+<!-- .ds Fn tested -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>keysym</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the KeySym that is to be (Fn.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>IsMiscFunctionKey</primary></indexterm>
+Returns 
+<symbol>True</symbol>
+if the specified KeySym is a miscellaneous function key.
+</para>
+<!-- .LP -->
+<!-- .sp -->
+<!-- .sM -->
+<para>IsModifierKey(<emphasis remap='I'>keysym</emphasis>)</para>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>keysym</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the KeySym that is to be tested.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>IsModifierKey</primary></indexterm>
+Returns 
+<symbol>True</symbol>
+if the specified KeySym is a modifier key.
+</para>
+
+<para>IsPFKey(<emphasis remap='I'>keysym</emphasis>)</para>
+
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>keysym</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the KeySym that is to be tested.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<indexterm significance="preferred"><primary>IsPFKey</primary></indexterm>
+Returns 
+<symbol>True</symbol>
+if the specified KeySym is a PF key.
+</para>
+</sect2>
+</sect1>
+<sect1 id='Using_Latin_1_Keyboard_Event_Functions'>
+<title>Using Latin-1 Keyboard Event Functions</title>
+<!-- .XS -->
+<!-- (SN Using Latin-1 Keyboard Event Functions  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<link linkend='Locales_and_Internationalized_Text_Functions'>Chapter 13</link>
+describes internationalized text input facilities,
+but sometimes it is expedient to write an application that
+only deals with Latin-1 characters and ASCII controls,
+so Xlib provides a simple function for that purpose.
+<xref linkend='XLookupString' xrefstyle='select: title'/>
+handles the standard modifier semantics described in section 12.7.
+This function does not use any of the input method facilities
+described in chapter 13 and does not depend on the current locale.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To map a key event to an ISO Latin-1 string, use
+<xref linkend='XLookupString' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XLookupString</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XLookupString'>
+<funcprototype>
+  <funcdef>int <function>XLookupString</function></funcdef>
+  <paramdef>XKeyEvent<parameter> *event_struct</parameter></paramdef>
+  <paramdef>char<parameter> *buffer_return</parameter></paramdef>
+  <paramdef>int<parameter> bytes_buffer</parameter></paramdef>
+  <paramdef>KeySym<parameter> *keysym_return</parameter></paramdef>
+  <paramdef>XComposeStatus<parameter> *status_in_out</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>event_struct</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the key event structure to be used.
+You can pass
+<type>XKeyPressedEvent</type>
+or
+<type>XKeyReleasedEvent</type>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>buffer_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the translated characters.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>bytes_buffer</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the length of the buffer.
+No more than bytes_buffer of translation are returned.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>keysym_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the KeySym computed from the event if this argument is not NULL.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>status_in_out</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies or returns the 
+<structname>XComposeStatus</structname>
+structure or NULL.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XLookupString' xrefstyle='select: title'/>
+function translates a key event to a KeySym and a string.
+The KeySym is obtained by using the standard interpretation of the
+<symbol>Shift</symbol>,
+<symbol>Lock</symbol>,
+group, and numlock modifiers as defined in the X Protocol specification.
+If the KeySym has been rebound (see
+<xref linkend='XRebindKeysym' xrefstyle='select: title'/>),
+the bound string will be stored in the buffer.
+Otherwise, the KeySym is mapped, if possible, to an ISO Latin-1 character
+or (if the Control modifier is on) to an ASCII control character,
+and that character is stored in the buffer.
+<xref linkend='XLookupString' xrefstyle='select: title'/>
+returns the number of characters that are stored in the buffer.
+</para>
+<para>
+<!-- .LP -->
+If present (non-NULL),
+the
+<structname>XComposeStatus</structname>
+structure records the state,
+which is private to Xlib,
+that needs preservation across calls to
+<xref linkend='XLookupString' xrefstyle='select: title'/>
+to implement compose processing.
+The creation of
+<structname>XComposeStatus</structname>
+structures is implementation-dependent;
+a portable program must pass NULL for this argument.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XLookupString' xrefstyle='select: title'/>
+depends on the cached keyboard information mentioned in the
+previous section, so it is necessary to use
+<xref linkend='XRefreshKeyboardMapping' xrefstyle='select: title'/>
+to keep this information up-to-date.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To rebind the meaning of a KeySym for
+<xref linkend='XLookupString' xrefstyle='select: title'/>,
+use
+<xref linkend='XRebindKeysym' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XRebindKeysym</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XRebindKeysym'>
+<funcprototype>
+  <funcdef><function>XRebindKeysym</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>KeySym<parameter> keysym</parameter></paramdef>
+  <paramdef>KeySym<parameter> list[&hairsp;]</parameter></paramdef>
+  <paramdef>int<parameter> mod_count</parameter></paramdef>
+  <paramdef>unsignedchar<parameter> *string</parameter></paramdef>
+  <paramdef>int<parameter> num_bytes</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Fn rebound -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>keysym</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the KeySym that is to be (Fn.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>list</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the KeySyms to be used as modifiers.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>mod_count</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of modifiers in the modifier list.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>string</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the string that is copied and will be returned by 
+<xref linkend='XLookupString' xrefstyle='select: title'/>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>num_bytes</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of bytes in the string argument.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XRebindKeysym' xrefstyle='select: title'/>
+function can be used to rebind the meaning of a KeySym for the client.
+It does not redefine any key in the X server but merely
+provides an easy way for long strings to be attached to keys.
+<xref linkend='XLookupString' xrefstyle='select: title'/>
+returns this string when the appropriate set of
+modifier keys are pressed and when the KeySym would have been used for
+the translation.
+No text conversions are performed;
+the client is responsible for supplying appropriately encoded strings.
+Note that you can rebind a KeySym that may not exist.
+</para>
+</sect1>
+<sect1 id="Allocating_Permanent_Storage">
+<title>Allocating Permanent Storage</title>
+<!-- .XS -->
+<!-- (SN Allocating Permanent Storage -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To allocate some memory you will never give back, use
+<xref linkend='Xpermalloc' xrefstyle='select: title'/>.
+<indexterm significance="preferred"><primary>Xpermalloc</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='Xpermalloc'>
+<funcprototype>
+  <funcdef>char *<function>Xpermalloc</function></funcdef>
+  <paramdef>unsignedint<parameter> size</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='Xpermalloc' xrefstyle='select: title'/>
+function allocates storage that can never be freed for the life of the
+program.  The memory is allocated with alignment for the C type double.
+This function may provide some performance and space savings over
+the standard operating system memory allocator.
+</para>
+</sect1>
+<sect1 id="Parsing_the_Window_Geometry">
+<title>Parsing the Window Geometry</title>
+<!-- .XS -->
+<!-- (SN Parsing the Window Geometry  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To parse standard window geometry strings, use
+<xref linkend='XParseGeometry' xrefstyle='select: title'/>.
+<indexterm><primary>Window</primary><secondary>determining location</secondary></indexterm>
+<indexterm significance="preferred"><primary>XParseGeometry</primary></indexterm>
+</para>
+<!-- .LP -->
+<!-- .sM -->
+<funcsynopsis id='XParseGeometry'>
+<funcprototype>
+  <funcdef>int <function>XParseGeometry</function></funcdef>
+  <paramdef>char<parameter> *parsestring</parameter></paramdef>
+  <paramdef>int*x_return,<parameter> *y_return</parameter></paramdef>
+  <paramdef>unsignedint*width_return,<parameter> *height_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>parsestring</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the string you want to parse.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Return the x and y offsets.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Return the width and height determined.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+By convention,
+X applications use a standard string to indicate window size and placement.
+<xref linkend='XParseGeometry' xrefstyle='select: title'/>
+makes it easier to conform to this standard because it allows you
+to parse the standard window geometry.
+Specifically, this function lets you parse strings of the form:
+</para>
+<para>
+<!-- .LP -->
+<!-- .\" Start marker code here -->
+<literallayout class="monospaced">
+[=][&lt;<emphasis remap='I'>width</emphasis>&gt;{xX}&lt;<emphasis remap='I'>height</emphasis>&gt;][{+-}&lt;<emphasis remap='I'>xoffset</emphasis>&gt;{+-}&lt;<emphasis remap='I'>yoffset</emphasis>&gt;] 
+</literallayout>
+<!-- .\" End marker code here -->
+</para>
+<para>
+<!-- .LP -->
+The fields map into the arguments associated with this function.
+(Items enclosed in &lt;&hairsp;&gt; are integers, items in [&hairsp;] are optional, and
+items enclosed in {&hairsp;} indicate ``choose one of.''
+Note that the brackets should not appear in the actual string.)
+If the string is not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+</para>
+<para>
+<!-- .LP -->
+The
+<xref linkend='XParseGeometry' xrefstyle='select: title'/>
+function returns a bitmask that indicates which of the four values (width,
+height, xoffset, and yoffset) were actually found in the string 
+and whether the x and y values are negative. 
+By convention, &minus;0 is not equal to +0, because the user needs to
+be able to say ``position the window relative to the right or bottom edge.''
+For each value found, the corresponding argument is updated.
+For each value not found, the argument is left unchanged.
+The bits are represented by
+<symbol>XValue</symbol>,
+<symbol>YValue</symbol>,
+<symbol>WidthValue</symbol>,
+<symbol>HeightValue</symbol>,
+<symbol>XNegative</symbol>,
+or
+<symbol>YNegative</symbol>
+and are defined in 
+<filename class="headerfile">&lt;X11/Xutil.h&gt;</filename>.
+<indexterm type="file"><primary><filename class="headerfile">X11/Xutil.h</filename></primary></indexterm>
+<indexterm><primary>Files</primary><secondary><filename class="headerfile">&lt;X11/Xutil.h&gt;</filename></secondary></indexterm>
+<indexterm><primary>Headers</primary><secondary><filename class="headerfile">&lt;X11/Xutil.h&gt;</filename></secondary></indexterm>
+They will be set whenever one of the values is defined 
+or one of the signs is set.
+</para>
+<para>
+<!-- .LP -->
+If the function returns either the 
+<symbol>XValue</symbol>
+or 
+<symbol>YValue</symbol>
+flag,
+you should place the window at the requested position.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To construct a window's geometry information, use
+<xref linkend='XWMGeometry' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XWMGeometry</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XWMGeometry'>
+<funcprototype>
+  <funcdef>int <function>XWMGeometry</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> screen</parameter></paramdef>
+  <paramdef>char<parameter> *user_geom</parameter></paramdef>
+  <paramdef>char<parameter> *def_geom</parameter></paramdef>
+  <paramdef>unsignedint<parameter> bwidth</parameter></paramdef>
+  <paramdef>XSizeHints<parameter> *hints</parameter></paramdef>
+  <paramdef>int*x_return,<parameter> *y_return</parameter></paramdef>
+  <paramdef>int<parameter> *width_return</parameter></paramdef>
+  <paramdef>int<parameter> *height_return</parameter></paramdef>
+  <paramdef>int<parameter> *gravity_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the screen.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>user_geom</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the user-specified geometry or NULL.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>def_geom</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the application's default geometry or NULL.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>bwidth</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the border width.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>hints</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the size hints for the window in its normal state.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Return the x and y offsets.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Return the width and height determined.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gravity_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the window gravity.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The 
+<xref linkend='XWMGeometry' xrefstyle='select: title'/>
+function combines any geometry information (given in the format used by 
+<xref linkend='XParseGeometry' xrefstyle='select: title'/>)
+specified by the user and by the calling program with size hints 
+(usually the ones to be stored in <property>WM_NORMAL_HINTS</property>) and returns the position, 
+size, and gravity
+(<symbol>NorthWestGravity</symbol>,
+<symbol>NorthEastGravity</symbol>,
+<symbol>SouthEastGravity</symbol>,
+or
+<symbol>SouthWestGravity</symbol>)
+that describe the window.
+If the base size is not set in the 
+<structname>XSizeHints</structname>
+structure, 
+the minimum size is used if set.
+Otherwise, a base size of zero is assumed.
+If no minimum size is set in the hints structure, 
+the base size is used.
+A mask (in the form returned by 
+<xref linkend='XParseGeometry' xrefstyle='select: title'/>)
+that describes which values came from the user specification 
+and whether or not the position coordinates are relative
+to the right and bottom edges is returned.
+Note that these coordinates will have already been accounted for 
+in the x_return and y_return values.
+</para>
+<para>
+<!-- .LP -->
+Note that invalid geometry specifications can cause a width or height 
+of zero to be returned.
+The caller may pass the address of the hints win_gravity field 
+as gravity_return to update the hints directly.
+</para>
+</sect1>
+
+<sect1 id="Manipulating_Regions">
+<title>Manipulating Regions</title>
+<!-- .XS -->
+<!-- (SN Manipulating Regions  -->
+<!-- .XE -->
+<para>
+Regions are arbitrary sets of pixel locations.
+Xlib provides functions for manipulating regions.
+The opaque type 
+<structname>Region</structname>
+is defined in 
+<filename class="headerfile">&lt;X11/Xutil.h&gt;</filename>.
+<indexterm type="file"><primary><filename class="headerfile">X11/Xutil.h</filename></primary></indexterm>
+<indexterm><primary>Files</primary><secondary><filename class="headerfile">&lt;X11/Xutil.h&gt;</filename></secondary></indexterm>
+<indexterm><primary>Headers</primary><secondary><filename class="headerfile">&lt;X11/Xutil.h&gt;</filename></secondary></indexterm>
+Xlib provides functions that you can use to manipulate regions.
+This section discusses how to:
+</para>
+
+<itemizedlist>
+  <listitem>
+    <para>
+Create, copy, or destroy regions
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Move or shrink regions
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Compute with regions
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Determine if regions are empty or equal
+    </para>
+  </listitem>
+  <listitem>
+    <para>
+Locate a point or rectangle in a region
+    </para>
+  </listitem>
+</itemizedlist>
+
+<sect2 id="Creating_Copying_or_Destroying_Regions">
+<title>Creating, Copying, or Destroying Regions</title>
+<!-- .XS -->
+<!-- (SN Creating, Copying, or Destroying Regions  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To create a new empty region, use
+<function>XCreateRegion</function>.
+</para>
+<para>Region XCreateRegion()</para>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<!-- .sp -->
+To generate a region from a polygon, use
+<xref linkend='XPolygonRegion' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XPolygonRegion</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XPolygonRegion'>
+<funcprototype>
+  <funcdef>Region <function>XPolygonRegion</function></funcdef>
+  <paramdef>XPoint<parameter> points[]</parameter></paramdef>
+  <paramdef>int<parameter> n</parameter></paramdef>
+  <paramdef>int<parameter> fill_rule</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>points</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies an array of points.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>n</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of points in the polygon. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>fill_rule</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the fill-rule you want to set for the specified GC.
+You can pass 
+<symbol>EvenOddRule</symbol>
+or
+<symbol>WindingRule</symbol>.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XPolygonRegion' xrefstyle='select: title'/>
+function returns a region for the polygon defined by the points array.
+For an explanation of fill_rule,
+see
+<xref linkend='XCreateGC' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set the clip-mask of a GC to a region, use
+<xref linkend='XSetRegion' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSetRegion</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSetRegion'>
+<funcprototype>
+  <funcdef><function>XSetRegion</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>GC<parameter> gc</parameter></paramdef>
+  <paramdef>Region<parameter> r</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>gc</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the GC.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>r</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the region.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSetRegion' xrefstyle='select: title'/>
+function sets the clip-mask in the GC to the specified region.
+The region is specified relative to the drawable's origin.
+The resulting GC clip origin is implementation-dependent.
+Once it is set in the GC,
+the region can be destroyed.
+</para>
+<para>
+<!-- .LP  -->
+<!-- .sp -->
+To deallocate the storage associated with a specified region, use
+<xref linkend='XDestroyRegion' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDestroyRegion</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDestroyRegion'>
+<funcprototype>
+  <funcdef><function>XDestroyRegion</function></funcdef>
+  <paramdef>Region<parameter> r</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>r</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the region.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+</para>
+</sect2>
+<sect2 id="Moving_or_Shrinking_Regions">
+<title>Moving or Shrinking Regions</title>
+<!-- .XS -->
+<!-- (SN Moving or Shrinking Regions  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To move a region by a specified amount, use 
+<xref linkend='XOffsetRegion' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XOffsetRegion</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XOffsetRegion'>
+<funcprototype>
+  <funcdef><function>XOffsetRegion</function></funcdef>
+  <paramdef>Region<parameter> r</parameter></paramdef>
+  <paramdef>intdx,<parameter> dy</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>r</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the region.
+<!-- .ds Dy move -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dx</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dy</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates,
+which define the amount you want to (Dy the specified region.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+<!-- .sp -->
+To reduce a region by a specified amount, use
+<xref linkend='XShrinkRegion' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XShrinkRegion</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XShrinkRegion'>
+<funcprototype>
+  <funcdef><function>XShrinkRegion</function></funcdef>
+  <paramdef>Region<parameter> r</parameter></paramdef>
+  <paramdef>intdx,<parameter> dy</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>r</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the region.
+<!-- .ds Dy shrink -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dx</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dy</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates,
+which define the amount you want to (Dy the specified region.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+Positive values shrink the size of the region, 
+and negative values expand the region.
+</para>
+</sect2>
+<sect2 id="Computing_with_Regions">
+<title>Computing with Regions</title>
+<!-- .XS -->
+<!-- (SN Computing with Regions  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To generate the smallest rectangle enclosing a region, use
+<xref linkend='XClipBox' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XClipBox</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XClipBox'>
+<funcprototype>
+  <funcdef><function>XClipBox</function></funcdef>
+  <paramdef>Region<parameter> r</parameter></paramdef>
+  <paramdef>XRectangle<parameter> *rect_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>r</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the region.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>rect_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the smallest enclosing rectangle.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XClipBox' xrefstyle='select: title'/>
+function returns the smallest rectangle enclosing the specified region.
+<!-- .sp -->
+</para>
+<para>
+<!-- .LP -->
+To compute the intersection of two regions, use
+<xref linkend='XIntersectRegion' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XIntersectRegion</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XIntersectRegion'>
+<funcprototype>
+  <funcdef><function>XIntersectRegion</function></funcdef>
+  <paramdef>Regionsra,srb,<parameter> dr_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>sra</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>srb</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the two regions with which you want to perform the computation.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dr_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the result of the computation.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<!-- .sp -->
+To compute the union of two regions, use
+<xref linkend='XUnionRegion' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XUnionRegion</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XUnionRegion'>
+<funcprototype>
+  <funcdef><function>XUnionRegion</function></funcdef>
+  <paramdef>Regionsra,srb,<parameter> dr_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>sra</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>srb</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the two regions with which you want to perform the computation.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dr_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the result of the computation.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+<!-- .sp -->
+To create a union of a source region and a rectangle, use
+<xref linkend='XUnionRectWithRegion' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XUnionRectWithRegion</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XUnionRectWithRegion'>
+<funcprototype>
+  <funcdef><function>XUnionRectWithRegion</function></funcdef>
+  <paramdef>XRectangle<parameter> *rectangle</parameter></paramdef>
+  <paramdef>Region<parameter> src_region</parameter></paramdef>
+  <paramdef>Region<parameter> dest_region_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>rectangle</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the rectangle.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>src_region</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the source region to be used.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dest_region_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the destination region.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XUnionRectWithRegion' xrefstyle='select: title'/>
+function updates the destination region from a union of the specified rectangle
+and the specified source region.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To subtract two regions, use
+<xref linkend='XSubtractRegion' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSubtractRegion</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSubtractRegion'>
+<funcprototype>
+  <funcdef><function>XSubtractRegion</function></funcdef>
+  <paramdef>Regionsra,srb,<parameter> dr_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>sra</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>srb</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the two regions with which you want to perform the computation.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dr_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the result of the computation.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSubtractRegion' xrefstyle='select: title'/>
+function subtracts srb from sra and stores the results in dr_return.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To calculate the difference between the union and intersection 
+of two regions, use
+<xref linkend='XXorRegion' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XXorRegion</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XXorRegion'>
+<funcprototype>
+  <funcdef><function>XXorRegion</function></funcdef>
+  <paramdef>Regionsra,srb,<parameter> dr_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>sra</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>srb</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the two regions with which you want to perform the computation.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>dr_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the result of the computation.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+</para>
+</sect2>
+<sect2 id="Determining_if_Regions_Are_Empty_or_Equal">
+<title>Determining if Regions Are Empty or Equal</title>
+<!-- .XS -->
+<!-- (SN Determining if Regions Are Empty or Equal  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To determine if the specified region is empty, use
+<xref linkend='XEmptyRegion' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XEmptyRegion</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XEmptyRegion'>
+<funcprototype>
+  <funcdef>Bool <function>XEmptyRegion</function></funcdef>
+  <paramdef>Region<parameter> r</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>r</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the region.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XEmptyRegion' xrefstyle='select: title'/>
+function returns
+<symbol>True</symbol>
+if the region is empty.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To determine if two regions have the same offset, size, and shape, use
+<xref linkend='XEqualRegion' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XEqualRegion</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XEqualRegion'>
+<funcprototype>
+  <funcdef>Bool <function>XEqualRegion</function></funcdef>
+  <paramdef>Regionr1,<parameter> r2</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>r1</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>r2</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the two regions.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XEqualRegion' xrefstyle='select: title'/>
+function returns
+<symbol>True</symbol>
+if the two regions have the same offset, size, and shape.
+</para>
+</sect2>
+<sect2 id="Locating_a_Point_or_a_Rectangle_in_a_Region">
+<title>Locating a Point or a Rectangle in a Region</title>
+<!-- .XS -->
+<!-- (SN Locating a Point or a Rectangle in a Region  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+To determine if a specified point resides in a specified region, use
+<xref linkend='XPointInRegion' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XPointInRegion</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XPointInRegion'>
+<funcprototype>
+  <funcdef>Bool <function>XPointInRegion</function></funcdef>
+  <paramdef>Region<parameter> r</parameter></paramdef>
+  <paramdef>intx,<parameter> y</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>r</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the region.
+<!-- .ds Xy , which define the point -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates(Xy.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XPointInRegion' xrefstyle='select: title'/>
+function returns 
+<symbol>True</symbol>
+if the point (x, y) is contained in the region r.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To determine if a specified rectangle is inside a region, use
+<xref linkend='XRectInRegion' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XRectInRegion</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XRectInRegion'>
+<funcprototype>
+  <funcdef>int <function>XRectInRegion</function></funcdef>
+  <paramdef>Region<parameter> r</parameter></paramdef>
+  <paramdef>intx,<parameter> y</parameter></paramdef>
+  <paramdef>unsignedintwidth,<parameter> height</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>r</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the region.
+<!-- .ds Xy , which define the coordinates of the upper-left corner of the rectangle -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates(Xy.
+<!-- .ds Wh , which define the rectangle -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the width and height(Wh.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XRectInRegion' xrefstyle='select: title'/>
+function returns
+<symbol>RectangleIn</symbol>
+if the rectangle is entirely in the specified region,
+<symbol>RectangleOut</symbol>
+if the rectangle is entirely out of the specified region,
+and
+<symbol>RectanglePart</symbol>
+if the rectangle is partially in the specified region.
+</para>
+</sect2>
+</sect1>
+<sect1 id="Using_Cut_Buffers">
+<title>Using Cut Buffers</title>
+<!-- .XS -->
+<!-- (SN Using Cut Buffers  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+<indexterm><primary>Cut Buffers</primary></indexterm>
+Xlib provides functions to manipulate cut buffers,
+a very simple form of cut-and-paste inter-client communication.
+Selections are a much more powerful and useful mechanism for
+interchanging data between client
+(see <link linkend="Selections">section 4.5</link>)
+and generally should be used instead of cut buffers.
+</para>
+<para>
+<!-- .LP -->
+Cut buffers are implemented as properties on the first root window
+of the display.
+The buffers can only contain text, in the STRING encoding.
+The text encoding is not changed by Xlib when fetching or storing.
+Eight buffers are provided
+and can be accessed as a ring or as explicit buffers (numbered 0 through 7).
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To store data in cut buffer 0, use 
+<xref linkend='XStoreBytes' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XStoreBytes</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XStoreBytes'>
+<funcprototype>
+  <funcdef><function>XStoreBytes</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>char<parameter> *bytes</parameter></paramdef>
+  <paramdef>int<parameter> nbytes</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN  -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>bytes</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the bytes, which are not necessarily ASCII or null-terminated.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nbytes</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of bytes to be stored.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The data can have embedded null characters
+and need not be null-terminated.
+The cut buffer's contents can be retrieved later by
+any client calling
+<xref linkend='XFetchBytes' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XStoreBytes' xrefstyle='select: title'/>
+can generate a
+<errorname>BadAlloc</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To store data in a specified cut buffer, use
+<xref linkend='XStoreBuffer' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XStoreBuffer</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XStoreBuffer'>
+<funcprototype>
+  <funcdef><function>XStoreBuffer</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>char<parameter> *bytes</parameter></paramdef>
+  <paramdef>int<parameter> nbytes</parameter></paramdef>
+  <paramdef>int<parameter> buffer</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>bytes</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the bytes, which are not necessarily ASCII or null-terminated.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nbytes</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of bytes to be stored.
+<!-- .ds Fn in which you want to store the bytes -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>buffer</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the buffer (Fn.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+If an invalid buffer is specified, the call has no effect.
+The data can have embedded null characters
+and need not be null-terminated.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XStoreBuffer' xrefstyle='select: title'/>
+can generate a
+<errorname>BadAlloc</errorname>
+error.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To return data from cut buffer 0, use 
+<xref linkend='XFetchBytes' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XFetchBytes</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XFetchBytes'>
+<funcprototype>
+  <funcdef>char *<function>XFetchBytes</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> *nbytes_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nbytes_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the number of bytes in the buffer.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XFetchBytes' xrefstyle='select: title'/>
+function
+returns the number of bytes in the nbytes_return argument,
+if the buffer contains data.
+Otherwise, the function
+returns NULL and sets nbytes to 0.
+The appropriate amount of storage is allocated and the pointer returned.
+The client must free this storage when finished with it by calling
+<xref linkend='XFree' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To return data from a specified cut buffer, use 
+<xref linkend='XFetchBuffer' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XFetchBuffer</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XFetchBuffer'>
+<funcprototype>
+  <funcdef>char *<function>XFetchBuffer</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> *nbytes_return</parameter></paramdef>
+  <paramdef>int<parameter> buffer</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nbytes_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the number of bytes in the buffer.
+<!-- .ds Fn from which you want the stored data returned -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>buffer</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the buffer (Fn.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XFetchBuffer' xrefstyle='select: title'/>
+function returns zero to the nbytes_return argument 
+if there is no data in the buffer or if an invalid
+buffer is specified.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To rotate the cut buffers, use 
+<xref linkend='XRotateBuffers' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XRotateBuffers</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XRotateBuffers'>
+<funcprototype>
+  <funcdef><function>XRotateBuffers</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> rotate</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>rotate</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies how much to rotate the cut buffers.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM  -->
+The
+<xref linkend='XRotateBuffers' xrefstyle='select: title'/>
+function rotates the cut
+buffers, such that buffer 0 becomes buffer n, 
+buffer 1 becomes n + 1 mod 8, and so on.
+This cut buffer numbering is global to the display.
+Note that
+<xref linkend='XRotateBuffers' xrefstyle='select: title'/>
+generates
+<errorname>BadMatch</errorname>
+errors if any of the eight buffers have not been created.
+</para>
+</sect1>
+<sect1 id="Determining_the_Appropriate_Visual_Type">
+<title>Determining the Appropriate Visual Type</title>
+<!-- .XS -->
+<!-- (SN Determining the Appropriate Visual Type -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+A single display can support multiple screens.
+Each screen can have several different visual types supported 
+at different depths.
+You can use the functions described in this section to determine
+which visual to use for your application.
+</para>
+<para>
+<!-- .LP -->
+The functions in this section use the visual information masks and the
+<structname>XVisualInfo</structname>
+structure,
+which is defined in
+<filename class="headerfile">&lt;X11/Xutil.h&gt;</filename>
+<indexterm type="file"><primary><filename class="headerfile">X11/Xutil.h</filename></primary></indexterm>
+<indexterm><primary>Files</primary><secondary><filename class="headerfile">&lt;X11/Xutil.h&gt;</filename></secondary></indexterm>
+<indexterm><primary>Headers</primary><secondary><filename class="headerfile">&lt;X11/Xutil.h&gt;</filename></secondary></indexterm>
+and contains:
+<!-- .sM -->
+</para>
+<!-- .LP -->
+<literallayout class="monospaced">
+
+/* Visual information mask bits */
+
+
+#define   VisualNoMask                 0x0
+#define   VisualIDMask                 0x1
+#define   VisualScreenMask             0x2
+#define   VisualDepthMask              0x4
+#define   VisualClassMask              0x8
+#define   VisualRedMaskMask            0x10
+#define   VisualGreenMaskMask          0x20
+#define   VisualBlueMaskMask           0x40
+#define   VisualColormapSizeMask       0x80
+#define   VisualBitsPerRGBMask         0x100
+#define   VisualAllMask                0x1FF
+
+</literallayout>
+
+<literallayout class="monospaced">
+<!-- .TA .5i 3i -->
+<!-- .ta .5i 3i -->
+/* Values */
+
+typedef struct {
+     Visual *visual;
+     VisualID visualid;
+     int screen;
+     unsigned int depth;
+     int class;
+     unsigned long red_mask;
+     unsigned long green_mask;
+     unsigned long blue_mask;
+     int colormap_size;
+     int bits_per_rgb;
+} XVisualInfo;
+</literallayout>
+
+<para>
+<!-- .LP -->
+<!-- .eM -->
+To obtain a list of visual information structures that match a specified
+template, use
+<xref linkend='XGetVisualInfo' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetVisualInfo</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetVisualInfo'>
+<funcprototype>
+  <funcdef>XVisualInfo *<function>XGetVisualInfo</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>long<parameter> vinfo_mask</parameter></paramdef>
+  <paramdef>XVisualInfo<parameter> *vinfo_template</parameter></paramdef>
+  <paramdef>int<parameter> *nitems_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>vinfo_mask</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the visual mask value.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>vinfo_template</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the visual attributes that are to be used in matching the visual
+structures.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>nitems_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the number of matching visual structures.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetVisualInfo' xrefstyle='select: title'/>
+function returns a list of visual structures that have attributes 
+equal to the attributes specified by vinfo_template.
+If no visual structures match the template using the specified vinfo_mask,
+<xref linkend='XGetVisualInfo' xrefstyle='select: title'/>
+returns a NULL.
+To free the data returned by this function, use
+<xref linkend='XFree' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain the visual information that matches the specified depth and
+class of the screen, use
+<xref linkend='XMatchVisualInfo' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XMatchVisualInfo</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XMatchVisualInfo'>
+<funcprototype>
+  <funcdef>Status <function>XMatchVisualInfo</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>int<parameter> screen</parameter></paramdef>
+  <paramdef>int<parameter> depth</parameter></paramdef>
+  <paramdef>int<parameter> class</parameter></paramdef>
+  <paramdef>XVisualInfo<parameter> *vinfo_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>screen</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the screen.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>depth</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the depth of the screen.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>class</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the class of the screen.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>vinfo_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the matched visual information.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XMatchVisualInfo' xrefstyle='select: title'/>
+function returns the visual information for a visual that matches the specified
+depth and class for a screen.
+Because multiple visuals that match the specified depth and class can exist,
+the exact visual chosen is undefined.
+If a visual is found,
+<xref linkend='XMatchVisualInfo' xrefstyle='select: title'/>
+returns nonzero and the information on the visual to vinfo_return.
+Otherwise, when a visual is not found,
+<xref linkend='XMatchVisualInfo' xrefstyle='select: title'/>
+returns zero.
+</para>
+</sect1>
+<sect1 id="Manipulating_Images">
+<title>Manipulating Images</title>
+<!-- .XS -->
+<!-- (SN Manipulating Images  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides several functions that perform basic operations on images.
+All operations on images are defined using an 
+<structname>XImage</structname>
+structure, 
+as defined in
+<filename class="headerfile">&lt;X11/Xlib.h&gt;</filename>.
+<indexterm type="file"><primary><filename class="headerfile">X11/Xlib.h</filename></primary></indexterm>
+<indexterm><primary>Files</primary><secondary><filename class="headerfile">&lt;X11/Xlib.h&gt;</filename></secondary></indexterm>
+<indexterm><primary>Headers</primary><secondary><filename class="headerfile">&lt;X11/Xlib.h&gt;</filename></secondary></indexterm>
+Because the number of different types of image formats can be very large,
+this hides details of image storage properly from applications.
+</para>
+<para>
+<!-- .LP -->
+This section describes the functions for generic operations on images.
+Manufacturers can provide very fast implementations of these for the
+formats frequently encountered on their hardware.
+These functions are neither sufficient nor desirable to use for general image
+processing.
+Rather, they are here to provide minimal functions on screen format
+images.
+The basic operations for getting and putting images are
+<xref linkend='XGetImage' xrefstyle='select: title'/>
+and 
+<xref linkend='XPutImage' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+Note that no functions have been defined, as yet, to read and write images 
+to and from disk files.
+</para>
+<para>
+<!-- .LP -->
+The
+<structname>XImage</structname>
+structure describes an image as it exists in the client's memory.  
+The user can request that some of the members such as height, width, 
+and xoffset be changed when the image is sent to the server.
+Note that bytes_per_line in concert with offset can be used to
+extract a subset of the image.
+Other members (for example, byte order, bitmap_unit, and so forth)
+are characteristics of both the image and the server.  
+If these members
+differ between the image and the server, 
+<xref linkend='XPutImage' xrefstyle='select: title'/>
+makes the appropriate conversions.
+The first byte of the first line of
+plane n must be located at the address (data + (n * height * bytes_per_line)).
+For a description of the 
+<structname>XImage</structname>
+structure,
+see <link linkend="Transferring_Images_between_Client_and_Server">section 8.7</link>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To allocate an 
+<structname>XImage</structname>
+structure and initialize it with image format values from a display, use
+<xref linkend='XCreateImage' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XCreateImage</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XCreateImage'>
+<funcprototype>
+  <funcdef>XImage *<function>XCreateImage</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Visual<parameter> *visual</parameter></paramdef>
+  <paramdef>unsignedint<parameter> depth</parameter></paramdef>
+  <paramdef>int<parameter> format</parameter></paramdef>
+  <paramdef>int<parameter> offset</parameter></paramdef>
+  <paramdef>char<parameter> *data</parameter></paramdef>
+  <paramdef>unsignedint<parameter> width</parameter></paramdef>
+  <paramdef>unsignedint<parameter> height</parameter></paramdef>
+  <paramdef>int<parameter> bitmap_pad</parameter></paramdef>
+  <paramdef>int<parameter> bytes_per_line</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>visual</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the
+<structname>Visual</structname>
+structure.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>depth</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the depth of the image.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>format</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the format for the image.
+You can pass
+<symbol>XYBitmap</symbol>,
+<symbol>XYPixmap</symbol>,
+or 
+<symbol>ZPixmap</symbol>.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>offset</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of pixels to ignore at the beginning of the scanline.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the image data.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the width of the image, in pixels.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the height of the image, in pixels.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>bitmap_pad</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the quantum of a scanline (8, 16, or 32).
+In other words, the start of one scanline is separated in client memory from 
+the start of the next scanline by an integer multiple of this many bits.  
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>bytes_per_line</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the number of bytes in the client image between
+the start of one scanline and the start of the next.  
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XCreateImage' xrefstyle='select: title'/>
+function allocates the memory needed for an
+<structname>XImage</structname>
+structure for the
+specified display but does not allocate space for the image itself.
+Rather, it initializes the structure byte-order, bit-order, and bitmap-unit
+values from the display and returns a pointer to the 
+<structname>XImage</structname>
+structure.
+The red, green, and blue mask values are defined for Z format images only
+and are derived from the 
+<structname>Visual</structname>
+structure passed in.
+Other values also are passed in.
+The offset permits the rapid displaying of the image without requiring each 
+scanline to be shifted into position.
+If you pass a zero value in bytes_per_line,
+Xlib assumes that the scanlines are contiguous
+in memory and calculates the value of bytes_per_line itself.
+</para>
+<para>
+<!-- .LP -->
+Note that when the image is created using
+<xref linkend='XCreateImage' xrefstyle='select: title'/>,
+<xref linkend='XGetImage' xrefstyle='select: title'/>,
+or
+<xref linkend='XSubImage' xrefstyle='select: title'/>,
+the destroy procedure that the 
+<xref linkend='XDestroyImage' xrefstyle='select: title'/>
+function calls frees both the image structure 
+and the data pointed to by the image structure.
+</para>
+<para>
+<!-- .LP -->
+The basic functions used to get a pixel, set a pixel, create a subimage,
+and add a constant value to an image are defined in the image object.
+The functions in this section are really macro invocations of the functions
+in the image object and are defined in
+<filename class="headerfile">&lt;X11/Xutil.h&gt;</filename>.
+<indexterm type="file"><primary><filename class="headerfile">X11/Xutil.h</filename></primary></indexterm>
+<indexterm><primary>Files</primary><secondary><filename class="headerfile">&lt;X11/Xutil.h&gt;</filename></secondary></indexterm>
+<indexterm><primary>Headers</primary><secondary><filename class="headerfile">&lt;X11/Xutil.h&gt;</filename></secondary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To obtain a pixel value in an image, use
+<xref linkend='XGetPixel' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XGetPixel</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XGetPixel'>
+<funcprototype>
+  <funcdef>unsigned long <function>XGetPixel</function></funcdef>
+  <paramdef>XImage<parameter> *ximage</parameter></paramdef>
+  <paramdef>int<parameter> x</parameter></paramdef>
+  <paramdef>int<parameter> y</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ximage</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the image.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XGetPixel' xrefstyle='select: title'/>
+function returns the specified pixel from the named image.
+The pixel value is returned in normalized format (that is,
+the least significant byte of the long is the least significant byte
+of the pixel).
+The image must contain the x and y coordinates.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To set a pixel value in an image, use
+<xref linkend='XPutPixel' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XPutPixel</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XPutPixel'>
+<funcprototype>
+  <funcdef><function>XPutPixel</function></funcdef>
+  <paramdef>XImage<parameter> *ximage</parameter></paramdef>
+  <paramdef>int<parameter> x</parameter></paramdef>
+  <paramdef>int<parameter> y</parameter></paramdef>
+  <paramdef>unsignedlong<parameter> pixel</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ximage</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the image.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>pixel</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the new pixel value.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XPutPixel' xrefstyle='select: title'/>
+function overwrites the pixel in the named image with the specified pixel value.
+The input pixel value must be in normalized format
+(that is, the least significant byte of the long is the least significant
+byte of the pixel).
+The image must contain the x and y coordinates.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To create a subimage, use
+<xref linkend='XSubImage' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSubImage</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSubImage'>
+<funcprototype>
+  <funcdef>XImage *<function>XSubImage</function></funcdef>
+  <paramdef>XImage<parameter> *ximage</parameter></paramdef>
+  <paramdef>int<parameter> x</parameter></paramdef>
+  <paramdef>int<parameter> y</parameter></paramdef>
+  <paramdef>unsignedint<parameter> subimage_width</parameter></paramdef>
+  <paramdef>unsignedint<parameter> subimage_height</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ximage</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the image.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the x and y coordinates.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>subimage_width</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the width of the new subimage, in pixels.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>subimage_height</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the height of the new subimage, in pixels.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XSubImage' xrefstyle='select: title'/>
+function creates a new image that is a subsection of an existing one.
+It allocates the memory necessary for the new
+<structname>XImage</structname>
+structure
+and returns a pointer to the new image.
+The data is copied from the source image,
+and the image must contain the rectangle defined by x, y, subimage_width,
+and subimage_height.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To increment each pixel in an image by a constant value, use
+<xref linkend='XAddPixel' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XAddPixel</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XAddPixel'>
+<funcprototype>
+  <funcdef><function>XAddPixel</function></funcdef>
+  <paramdef>XImage<parameter> *ximage</parameter></paramdef>
+  <paramdef>long<parameter> value</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ximage</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the image.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>value</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the constant value that is to be added.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XAddPixel' xrefstyle='select: title'/>
+function adds a constant value to every pixel in an image.
+It is useful when you have a base pixel value from allocating
+color resources and need to manipulate the image to that form.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To deallocate the memory allocated in a previous call to
+<xref linkend='XCreateImage' xrefstyle='select: title'/>,
+use
+<xref linkend='XDestroyImage' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDestroyImage</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDestroyImage'>
+<funcprototype>
+  <funcdef><function>XDestroyImage</function></funcdef>
+  <paramdef>XImage *<parameter>ximage</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>ximage</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the image.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XDestroyImage' xrefstyle='select: title'/>
+function deallocates the memory associated with the
+<structname>XImage</structname>
+structure.
+</para>
+<para>
+<!-- .LP -->
+Note that when the image is created using
+<xref linkend='XCreateImage' xrefstyle='select: title'/>,
+<xref linkend='XGetImage' xrefstyle='select: title'/>,
+or 
+<xref linkend='XSubImage' xrefstyle='select: title'/>,
+the destroy procedure that this macro calls
+frees both the image structure and the data pointed to by the image structure. 
+</para>
+</sect1>
+<sect1 id="Manipulating_Bitmaps">
+<title>Manipulating Bitmaps</title>
+<!-- .XS -->
+<!-- (SN Manipulating Bitmaps  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+Xlib provides functions that you can use to read a bitmap from a file,
+save a bitmap to a file, or create a bitmap. 
+This section describes those functions that transfer bitmaps to and
+from the client's file system, thus allowing their reuse in a later
+connection (for example, from an entirely different client or to a
+different display or server).
+</para>
+<para>
+<!-- .LP -->
+The X version 11 bitmap file format is:
+</para>
+<para>
+<!-- .LP -->
+<!-- .sM -->
+<literallayout class="monospaced">
+#define <emphasis remap='I'>name</emphasis>_width <emphasis remap='I'>width</emphasis>
+#define <emphasis remap='I'>name</emphasis>_height <emphasis remap='I'>height</emphasis>
+#define <emphasis remap='I'>name</emphasis>_x_hot <emphasis remap='I'>x</emphasis>
+#define <emphasis remap='I'>name</emphasis>_y_hot <emphasis remap='I'>y</emphasis>
+static unsigned char <emphasis remap='I'>name</emphasis>_bits[] = { 0x<emphasis remap='I'>NN</emphasis>,... }
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The lines for the variables ending with _x_hot and _y_hot suffixes are optional
+because they are present only if a hotspot has been defined for this bitmap.
+The lines for the other variables are required.
+The word ``unsigned'' is optional;
+that is, the type of the _bits array can be ``char'' or ``unsigned char''.
+The _bits array must be large enough to contain the size bitmap.
+The bitmap unit is 8.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To read a bitmap from a file and store it in a pixmap, use
+<xref linkend='XReadBitmapFile' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XReadBitmapFile</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XReadBitmapFile'>
+<funcprototype>
+  <funcdef>int <function>XReadBitmapFile</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>char<parameter> *filename</parameter></paramdef>
+  <paramdef>unsignedint*width_return,<parameter> *height_return</parameter></paramdef>
+  <paramdef>Pixmap<parameter> *bitmap_return</parameter></paramdef>
+  <paramdef>int*x_hot_return,<parameter> *y_hot_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Dr \ that indicates the screen -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable(Dr. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>filename</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the file name to use.
+The format of the file name is operating-system dependent.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Return the width and height values of the read in bitmap file.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>bitmap_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the bitmap that is created.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x_hot_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y_hot_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Return the hotspot coordinates.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XReadBitmapFile' xrefstyle='select: title'/>
+function reads in a file containing a bitmap.
+The file is parsed in the encoding of the current locale.
+The ability to read other than the standard format 
+is implementation-dependent.
+If the file cannot be opened, 
+<xref linkend='XReadBitmapFile' xrefstyle='select: title'/>
+returns 
+<returnvalue>BitmapOpenFailed</returnvalue>.
+If the file can be opened but does not contain valid bitmap data, 
+it returns 
+<returnvalue>BitmapFileInvalid</returnvalue>.
+If insufficient working storage is allocated,
+it returns
+<returnvalue>BitmapNoMemory</returnvalue>.
+If the file is readable and valid,
+it returns 
+<returnvalue>BitmapSuccess</returnvalue>.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XReadBitmapFile' xrefstyle='select: title'/>
+returns the bitmap's height and width, as read
+from the file, to width_return and height_return.
+It then creates a pixmap of the appropriate size, 
+reads the bitmap data from the file into the pixmap,
+and assigns the pixmap to the caller's variable bitmap.  
+The caller must free the bitmap using 
+<xref linkend='XFreePixmap' xrefstyle='select: title'/>
+when finished.
+If <emphasis remap='I'>name</emphasis>_x_hot and <emphasis remap='I'>name</emphasis>_y_hot exist,
+<xref linkend='XReadBitmapFile' xrefstyle='select: title'/>
+returns them to x_hot_return and y_hot_return;
+otherwise, it returns &minus;1,&minus;1.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XReadBitmapFile' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>,
+<errorname>BadDrawable</errorname>,
+and
+<errorname>BadGC</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To read a bitmap from a file and return it as data, use
+<xref linkend='XReadBitmapFileData' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XReadBitmapFileData</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XReadBitmapFileData'>
+<funcprototype>
+  <funcdef>int <function>XReadBitmapFileData</function></funcdef>
+  <paramdef>char<parameter> *filename</parameter></paramdef>
+  <paramdef>unsignedint*width_return,<parameter> *height_return</parameter></paramdef>
+  <paramdef>unsignedchar<parameter> *data_return</parameter></paramdef>
+  <paramdef>int*x_hot_return,<parameter> *y_hot_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>filename</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the file name to use.
+The format of the file name is operating-system dependent.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Return the width and height values of the read in bitmap file.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>data_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the bitmap data.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x_hot_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y_hot_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Return the hotspot coordinates.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XReadBitmapFileData' xrefstyle='select: title'/>
+function reads in a file containing a bitmap, in the same manner as
+<xref linkend='XReadBitmapFile' xrefstyle='select: title'/>,
+but returns the data directly rather than creating a pixmap in the server.
+The bitmap data is returned in data_return; the client must free this
+storage when finished with it by calling
+<xref linkend='XFree' xrefstyle='select: title'/>.
+The status and other return values are the same as for
+<xref linkend='XReadBitmapFile' xrefstyle='select: title'/>.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To write out a bitmap from a pixmap to a file, use
+<xref linkend='XWriteBitmapFile' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XWriteBitmapFile</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XWriteBitmapFile'>
+<funcprototype>
+  <funcdef>int <function>XWriteBitmapFile</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>char<parameter> *filename</parameter></paramdef>
+  <paramdef>Pixmap<parameter> bitmap</parameter></paramdef>
+  <paramdef>unsignedintwidth,<parameter> height</parameter></paramdef>
+  <paramdef>intx_hot,<parameter> y_hot</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>filename</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the file name to use.
+The format of the file name is operating-system dependent.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>bitmap</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the bitmap.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the width and height.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>x_hot</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>y_hot</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify where to place the hotspot coordinates (or &minus;1,&minus;1 if none are present)
+in the file.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XWriteBitmapFile' xrefstyle='select: title'/>
+function writes a bitmap out to a file in the X Version 11 format.
+The name used in the output file is derived from the file name
+by deleting the directory prefix.
+The file is written in the encoding of the current locale.
+If the file cannot be opened for writing, 
+it returns 
+<returnvalue>BitmapOpenFailed</returnvalue>.
+If insufficient memory is allocated,
+<xref linkend='XWriteBitmapFile' xrefstyle='select: title'/>
+returns
+<returnvalue>BitmapNoMemory</returnvalue>;
+otherwise, on no error,
+it returns
+<returnvalue>BitmapSuccess</returnvalue>.
+If x_hot and y_hot are not &minus;1, &minus;1,
+<xref linkend='XWriteBitmapFile' xrefstyle='select: title'/>
+writes them out as the hotspot coordinates for the bitmap.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XWriteBitmapFile' xrefstyle='select: title'/>
+can generate
+<errorname>BadDrawable</errorname>
+and
+<errorname>BadMatch</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To create a pixmap and then store bitmap-format data into it, use
+<xref linkend='XCreatePixmapFromBitmapData' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XCreatePixmapFromBitmapData</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XCreatePixmapFromBitmapData'>
+<funcprototype>
+  <funcdef>Pixmap <function>XCreatePixmapFromBitmapData</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>char<parameter> *data</parameter></paramdef>
+  <paramdef>unsignedintwidth,<parameter> height</parameter></paramdef>
+  <paramdef>unsignedlongfg,<parameter> bg</parameter></paramdef>
+  <paramdef>unsignedint<parameter> depth</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Dr \ that indicates the screen -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable(Dr. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the data in bitmap format.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the width and height.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>fg</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>bg</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the foreground and background pixel values to use.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>depth</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the depth of the pixmap.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XCreatePixmapFromBitmapData' xrefstyle='select: title'/>
+function creates a pixmap of the given depth and then does a bitmap-format
+<xref linkend='XPutImage' xrefstyle='select: title'/>
+of the data into it.
+The depth must be supported by the screen of the specified drawable,
+or a
+<errorname>BadMatch</errorname>
+error results.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XCreatePixmapFromBitmapData' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>,
+<errorname>BadDrawable</errorname>,
+<errorname>BadGC</errorname>,
+and
+<errorname>BadValue</errorname>
+errors.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To include a bitmap written out by 
+<xref linkend='XWriteBitmapFile' xrefstyle='select: title'/>
+<indexterm><primary>XWriteBitmapFile</primary></indexterm>
+in a program directly, as opposed to reading it in every time at run time, use
+<xref linkend='XCreateBitmapFromData' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XCreateBitmapFromData</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XCreateBitmapFromData'>
+<funcprototype>
+  <funcdef>Pixmap <function>XCreateBitmapFromData</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>Drawable<parameter> d</parameter></paramdef>
+  <paramdef>char<parameter> *data</parameter></paramdef>
+  <paramdef>unsignedintwidth,<parameter> height</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+<!-- .ds Dr \ that indicates the screen -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>d</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the drawable(Dr. 
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the location of the bitmap data.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>width</emphasis>
+    </term>
+    <listitem>
+      <para>
+<!-- .br -->
+<!-- .ns -->
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>height</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specify the width and height.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XCreateBitmapFromData' xrefstyle='select: title'/>
+function allows you to include in your C program (using
+<code>#include</code>)
+a bitmap file that was written out by
+<xref linkend='XWriteBitmapFile' xrefstyle='select: title'/>
+(X version 11 format only) without reading in the bitmap file.
+The following example creates a gray bitmap:
+</para>
+<para>
+<!-- .LP -->
+<literallayout class="monospaced">
+#include "gray.bitmap"
+<!-- .sp 6p -->
+Pixmap bitmap;
+bitmap = XCreateBitmapFromData(display, window, gray_bits, gray_width, gray_height);
+</literallayout>
+</para>
+<para>
+<!-- .LP -->
+If insufficient working storage was allocated,
+<xref linkend='XCreateBitmapFromData' xrefstyle='select: title'/>
+returns
+<symbol>None</symbol>.
+It is your responsibility to free the
+bitmap using
+<xref linkend='XFreePixmap' xrefstyle='select: title'/>
+when finished.
+</para>
+<para>
+<!-- .LP -->
+<xref linkend='XCreateBitmapFromData' xrefstyle='select: title'/>
+can generate
+<errorname>BadAlloc</errorname>
+and
+<errorname>BadGC</errorname>
+errors.
+</para>
+</sect1>
+<sect1 id="Using_the_Context_Manager">
+<title>Using the Context Manager</title>
+<!-- .XS -->
+<!-- (SN Using the Context Manager  -->
+<!-- .XE -->
+<para>
+<!-- .LP -->
+The context manager provides a way of associating data with an X resource ID
+(mostly typically a window) in your program.  
+Note that this is local to your program;
+the data is not stored in the server on a property list.
+Any amount of data in any number of pieces can be associated with a
+resource ID,
+and each piece of data has a type associated with it.  
+The context manager requires knowledge of the resource ID
+and type to store or retrieve data.
+</para>
+<para>
+<!-- .LP -->
+Essentially, the context manager can be viewed as a two-dimensional, 
+sparse array:  one dimension is subscripted by the X resource ID
+and the other by a context type field.
+Each entry in the array contains a pointer to the data.
+Xlib provides context management functions with which you can
+save data values, get data values, delete entries, and create a unique
+context type.
+The symbols used are in
+<filename class="headerfile">&lt;X11/Xutil.h&gt;</filename>.
+<indexterm type="file"><primary><filename class="headerfile">X11/Xutil.h</filename></primary></indexterm>
+<indexterm><primary>Files</primary><secondary><filename class="headerfile">&lt;X11/Xutil.h&gt;</filename></secondary></indexterm>
+<indexterm><primary>Headers</primary><secondary><filename class="headerfile">&lt;X11/Xutil.h&gt;</filename></secondary></indexterm>
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To save a data value that corresponds to a resource ID and context type, use
+<xref linkend='XSaveContext' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XSaveContext</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XSaveContext'>
+<funcprototype>
+  <funcdef>int <function>XSaveContext</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XID<parameter> rid</parameter></paramdef>
+  <paramdef>XContext<parameter> context</parameter></paramdef>
+  <paramdef>XPointer<parameter> data</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>rid</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the resource ID with which the data is associated.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>context</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the context type to which the data belongs.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>data</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the data to be associated with the window and type.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+If an entry with the specified resource ID and type already exists,
+<xref linkend='XSaveContext' xrefstyle='select: title'/>
+overrides it with the specified context.
+The
+<xref linkend='XSaveContext' xrefstyle='select: title'/>
+function returns a nonzero error code if an error has occurred
+and zero otherwise.
+Possible errors are
+<symbol>XCNOMEM</symbol>
+(out of memory).
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To get the data associated with a resource ID and type, use
+<xref linkend='XFindContext' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XFindContext</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XFindContext'>
+<funcprototype>
+  <funcdef>int <function>XFindContext</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XID<parameter> rid</parameter></paramdef>
+  <paramdef>XContext<parameter> context</parameter></paramdef>
+  <paramdef>XPointer<parameter> *data_return</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>rid</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the resource ID with which the data is associated.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>context</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the context type to which the data belongs.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>data_return</emphasis>
+    </term>
+    <listitem>
+      <para>
+Returns the data.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+Because it is a return value,
+the data is a pointer.
+The
+<xref linkend='XFindContext' xrefstyle='select: title'/>
+function returns a nonzero error code if an error has occurred
+and zero otherwise.
+Possible errors are
+<symbol>XCNOENT</symbol>
+(context-not-found).
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To delete an entry for a given resource ID and type, use
+<xref linkend='XDeleteContext' xrefstyle='select: title'/>.
+</para>
+<indexterm significance="preferred"><primary>XDeleteContext</primary></indexterm>
+<!-- .sM -->
+<funcsynopsis id='XDeleteContext'>
+<funcprototype>
+  <funcdef>int <function>XDeleteContext</function></funcdef>
+  <paramdef>Display<parameter> *display</parameter></paramdef>
+  <paramdef>XID<parameter> rid</parameter></paramdef>
+  <paramdef>XContext<parameter> context</parameter></paramdef>
+</funcprototype>
+</funcsynopsis>
+<!-- .FN -->
+<variablelist>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>display</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the connection to the X server.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>rid</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the resource ID with which the data is associated.
+      </para>
+    </listitem>
+  </varlistentry>
+  <varlistentry>
+    <term>
+      <emphasis remap='I'>context</emphasis>
+    </term>
+    <listitem>
+      <para>
+Specifies the context type to which the data belongs.
+    </para>
+  </listitem>
+  </varlistentry>
+</variablelist>
+<para>
+<!-- .LP -->
+<!-- .eM -->
+The
+<xref linkend='XDeleteContext' xrefstyle='select: title'/>
+function deletes the entry for the given resource ID 
+and type from the data structure.
+This function returns the same error codes that
+<xref linkend='XFindContext' xrefstyle='select: title'/>
+returns if called with the same arguments.
+<xref linkend='XDeleteContext' xrefstyle='select: title'/>
+does not free the data whose address was saved.
+</para>
+<para>
+<!-- .LP -->
+<!-- .sp -->
+To create a unique context type that may be used in subsequent calls to
+<xref linkend='XSaveContext' xrefstyle='select: title'/>
+and
+<xref linkend='XFindContext' xrefstyle='select: title'/>,
+use
+<function>XUniqueContext</function>.
+</para>
+<para>XContext XuniqueContext()</para>
+
+</sect1>
+</chapter>
diff --git a/specs/libX11/Makefile.am b/specs/libX11/Makefile.am
new file mode 100644 (file)
index 0000000..b87e568
--- /dev/null
@@ -0,0 +1,38 @@
+
+if ENABLE_SPECS
+
+# Main DocBook/XML files (DOCTYPE book)
+docbook = libX11.xml
+
+# Included chapters, appendix, images
+chapters =             \
+       AppA.xml        \
+       AppB.xml        \
+       AppC.xml        \
+       AppD.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        \
+       CH14.xml        \
+       CH15.xml        \
+       CH16.xml        \
+       credits.xml     \
+       glossary.xml
+
+# The location where the DocBook/XML files and their generated formats are installed
+shelfdir = $(docdir)/libX11
+
+# Generate DocBook/XML output formats with or without stylesheets
+include $(top_srcdir)/docbook.am
+
+endif ENABLE_SPECS
diff --git a/specs/libX11/credits.xml b/specs/libX11/credits.xml
new file mode 100644 (file)
index 0000000..c3d1f73
--- /dev/null
@@ -0,0 +1,237 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE preface PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+         "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
+<preface id="acknowledgments">
+<title>Acknowledgments</title>
+<para>
+The design and implementation of the first 10 versions of X
+were primarily the work of three individuals: Robert Scheifler of the
+MIT Laboratory for Computer Science and Jim Gettys of Digital
+Equipment Corporation and Ron Newman of MIT, both at MIT
+Project Athena. 
+X version 11, however, is the result of the efforts of 
+dozens of individuals at almost as many locations and organizations.
+At the risk of offending some of the players by exclusion, 
+we would like to acknowledge some of the people who deserve special credit 
+and recognition for their work on Xlib.
+Our apologies to anyone inadvertently overlooked.
+</para>
+<simplesect>
+<title>Release 1</title>
+<para>
+Our thanks does to Ron Newman (MIT Project Athena),
+who contributed substantially to the
+design and implementation of the Version 11 Xlib interface.
+</para>
+<para>
+Our thanks also goes to Ralph Swick (Project Athena and Digital) who kept 
+it all together for us during the early releases.
+He handled literally thousands of requests from people everywhere
+and saved the sanity of at least one of us.
+His calm good cheer was a foundation on which we could build.
+</para>
+<para>
+Our thanks also goes to Todd Brunhoff (Tektronix) who was ``loaned'' 
+to Project Athena at exactly the right moment to provide very capable 
+and much-needed assistance during the alpha and beta releases.
+He was responsible for the successful integration of sources
+from multiple sites;
+we would not have had a release without him.
+</para>
+<para>
+Our thanks also goes to Al Mento and Al Wojtas of Digital's ULTRIX 
+Documentation Group.
+With good humor and cheer,
+they took a rough draft and made it an infinitely better and more useful 
+document.
+The work they have done will help many everywhere.
+We also would like to thank Hal Murray (Digital SRC) and
+Peter George (Digital VMS) who contributed much
+by proofreading the early drafts of this document.
+</para>
+<para>
+Our thanks also goes to Jeff Dike (Digital UEG), Tom Benson, 
+Jackie Granfield, and Vince Orgovan (Digital VMS) who helped with the 
+library utilities implementation;
+to Hania Gajewska (Digital UEG-WSL) who,
+along with Ellis Cohen (CMU and Siemens),
+was instrumental in the semantic design of the window manager properties;
+and to Dave Rosenthal (Sun Microsystems) who also contributed to the protocol 
+and provided the sample generic color frame buffer device-dependent code.
+</para>
+<para>
+The alpha and beta test participants deserve special recognition and thanks
+as well.
+It is significant
+that the bug reports (and many fixes) during alpha and beta test came almost
+exclusively from just a few of the alpha testers, mostly hardware vendors
+working on product implementations of X.  
+The continued public
+contribution of vendors and universities is certainly to the benefit 
+of the entire X community.
+</para>
+<para>
+Our special thanks must go to Sam Fuller, Vice-President of Corporate
+Research at Digital, who has remained committed to the widest public 
+availability of X and who made it possible to greatly supplement MIT's
+resources with the Digital staff in order to make version 11 a reality.
+Many of the people mentioned here are part of the Western
+Software Laboratory (Digital UEG-WSL) of the ULTRIX Engineering group
+and work for Smokey Wallace, who has been vital to the project's success. 
+Others not mentioned here worked on the toolkit and are acknowledged 
+in the X Toolkit documentation.
+</para>
+<para>
+Of course, 
+we must particularly thank Paul Asente, formerly of Stanford University
+and now of Digital UEG-WSL, who wrote W, the predecessor to X,
+and Brian Reid, formerly of Stanford University and now of Digital WRL,
+who had much to do with W's design.
+</para>
+<para>
+Finally, our thanks goes to MIT,  Digital Equipment Corporation,
+and IBM for providing the environment where it could happen.
+</para>
+</simplesect>
+<simplesect>
+<title>Release 4</title>
+<para>
+Our thanks go to Jim Fulton (MIT X Consortium) for designing and
+specifying the new Xlib functions for Inter-Client Communication
+Conventions (<acronym>ICCCM</acronym>) support.
+</para>
+<para>
+We also thank Al Mento of Digital for his continued effort in
+maintaining this document and Jim Fulton and Donna Converse (MIT X Consortium)
+for their much-appreciated efforts in reviewing the changes.
+</para>
+</simplesect>
+<simplesect>
+<title>Release 5</title>
+<para>
+The principal authors of the Input Method facilities are
+Vania Joloboff (Open Software Foundation) and Bill McMahon (Hewlett-Packard).
+The principal author of the rest of the internationalization facilities
+is Glenn Widener (Tektronix).  Our thanks to them for keeping their
+sense of humor through a long and sometimes difficult design process.
+Although the words and much of the design are due to them, many others
+have contributed substantially to the design and implementation.
+Tom McFarland (HP) and Frank Rojas (IBM) deserve particular recognition
+for their contributions.   Other contributors were:
+Tim Anderson (Motorola), Alka Badshah (OSF), Gabe Beged-Dov (HP),
+Chih-Chung Ko (III), Vera Cheng (III), Michael Collins (Digital),
+Walt Daniels (IBM), Noritoshi Demizu (OMRON), Keisuke Fukui (Fujitsu),
+Hitoshoi Fukumoto (Nihon Sun), Tim Greenwood (Digital), John Harvey (IBM),
+Hideki Hiura (Sun), Fred Horman (AT&amp;T), Norikazu Kaiya (Fujitsu),
+Yuji Kamata (IBM),
+Yutaka Kataoka (Waseda University), Ranee Khubchandani (Sun), Akira Kon (NEC),
+Hiroshi Kuribayashi (OMRON), Teruhiko Kurosaka (Sun), Seiji Kuwari (OMRON),
+Sandra Martin (OSF), Narita Masahiko (Fujitsu), Masato Morisaki (NTT),
+Nelson Ng (Sun),
+Takashi Nishimura (NTT America), Makato Nishino (IBM),
+Akira Ohsone (Nihon Sun), Chris Peterson (MIT), Sam Shteingart (AT&amp;T),
+Manish Sheth (AT&amp;T), Muneiyoshi Suzuki (NTT), Cori Mehring (Digital),
+Shoji Sugiyama (IBM), and Eiji Tosa (IBM).
+</para>
+<para>
+We are deeply indebted to Tatsuya Kato (NTT),
+Hiroshi Kuribayashi (OMRON), Seiji Kuwari (OMRON), Muneiyoshi Suzuki (NTT),
+and Li Yuhong (OMRON) for producing one of the first complete
+sample implementation of the internationalization facilities, and 
+Hiromu Inukai (Nihon Sun), Takashi Fujiwara (Fujitsu), Hideki Hiura (Sun), 
+Yasuhiro Kawai (Oki Technosystems Laboratory), Kazunori Nishihara (Fuji Xerox),
+Masaki Takeuchi (Sony), Katsuhisa Yano (Toshiba),
+Makoto Wakamatsu (Sony Corporation) for producing the another complete
+sample implementation of the internationalization facilities.
+</para>
+<para>
+The principal authors (design and implementation) of the Xcms color
+management facilities are Al Tabayoyon (Tektronix)
+and Chuck Adams (Tektronix).  
+Joann Taylor (Tektronix), Bob Toole (Tektronix),
+and Keith Packard (MIT X Consortium) also
+contributed significantly to the design.  Others who contributed are:
+Harold Boll (Kodak), Ken Bronstein (HP), Nancy Cam (SGI),
+Donna Converse (MIT X Consortium), Elias Israel (ISC), Deron Johnson (Sun),
+Jim King (Adobe), Ricardo Motta (HP), Chuck Peek (IBM),
+Wil Plouffe (IBM), Dave Sternlicht (MIT X Consortium), Kumar Talluri (AT&amp;T),
+and Richard Verberg (IBM).
+</para>
+<para>
+We also once again thank Al Mento of Digital for his work in formatting
+and reformatting text for this manual, and for producing man pages.
+Thanks also to Clive Feather (IXI) for proof-reading and finding a
+number of small errors.
+</para>
+</simplesect>
+<simplesect>
+<title>Release 6</title>
+<para>
+Stephen Gildea (X Consortium) authored the threads support.
+Ovais Ashraf (Sun) and Greg Olsen (Sun) contributed substantially
+by testing the facilities and reporting bugs in a timely fashion.
+</para>
+<para>
+The principal authors of the internationalization facilities, including
+Input and Output Methods, are Hideki Hiura (SunSoft) and
+Shigeru Yamada (Fujitsu OSSI).
+Although the words and much of the design are due to them, many others
+have contributed substantially to the design and implementation.
+They are: Takashi Fujiwara (Fujitsu), Yoshio Horiuchi (IBM),
+Makoto Inada (Digital), Hiromu Inukai (Nihon SunSoft),
+Song JaeKyung (KAIST), Franky Ling (Digital), Tom McFarland (HP),
+Hiroyuki Miyamoto (Digital), Masahiko Narita (Fujitsu),
+Frank Rojas (IBM), Hidetoshi Tajima (HP), Masaki Takeuchi (Sony),
+Makoto Wakamatsu (Sony), Masaki Wakao (IBM), Katsuhisa Yano(Toshiba) and
+Jinsoo Yoon (KAIST).
+</para>
+<para>
+The principal producers of the sample implementation of the 
+internationalization facilities are: 
+Jeffrey Bloomfield (Fujitsu OSSI), Takashi Fujiwara (Fujitsu),
+Hideki Hiura (SunSoft), Yoshio Horiuchi (IBM), 
+Makoto Inada (Digital), Hiromu Inukai (Nihon SunSoft), 
+Song JaeKyung (KAIST), Riki Kawaguchi (Fujitsu), 
+Franky Ling (Digital), Hiroyuki Miyamoto (Digital), 
+Hidetoshi Tajima (HP), Toshimitsu Terazono (Fujitsu), 
+Makoto Wakamatsu (Sony), Masaki Wakao (IBM), 
+Shigeru Yamada (Fujitsu OSSI) and Katsuhisa Yano (Toshiba).
+</para>
+<para>
+The coordinators of the integration, testing, and release of this 
+implementation of the internationalization facilities are
+Nobuyuki Tanaka (Sony) and Makoto Wakamatsu (Sony).
+</para>
+<para>
+Others who have contributed to the architectural design or
+testing of the sample implementation of the
+internationalization facilities are:
+Hector Chan (Digital), Michael Kung (IBM), Joseph Kwok (Digital),
+Hiroyuki Machida (Sony), Nelson Ng (SunSoft), Frank Rojas (IBM), 
+Yoshiyuki Segawa (Fujitsu OSSI), Makiko Shimamura (Fujitsu), 
+Shoji Sugiyama (IBM), Lining Sun (SGI), Masaki Takeuchi (Sony),
+Jinsoo Yoon (KAIST) and Akiyasu Zen (HP).
+</para>
+<para>
+<literallayout>
+Jim Gettys
+Cambridge Research Laboratory
+Digital Equipment Corporation
+
+Robert W. Scheifler
+Laboratory for Computer Science
+Massachusetts Institute of Technology
+</literallayout>
+</para>
+</simplesect>
+<simplesect>
+<title>Release 7</title>
+<para>
+This document is made available to you in modern formats such as HTML and PDF
+thanks to the efforts of Matt Dew, who converted the original troff sources to
+DocBook/XML and edited them into shape; along with Gaetan Nadon and
+Alan Coopersmith, who set up the formatting machinery in the libX11 builds and
+performed further editing of the DocBook markup.
+</para>
+</simplesect>
+</preface>
diff --git a/specs/libX11/glossary.xml b/specs/libX11/glossary.xml
new file mode 100644 (file)
index 0000000..14ad2e2
--- /dev/null
@@ -0,0 +1,1754 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE glossary PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
+         "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd">
+<glossary id='glossary'>
+<title>Glossary</title>
+<glossentry id="glossary:Access_control_list">
+  <glossterm>Access control list</glossterm>
+<indexterm significance="preferred"><primary>Access control list</primary></indexterm>
+  <glossdef>
+    <para>
+X maintains a list of hosts from which client programs can be run.  
+By default, 
+only programs on the local host and hosts specified in an initial list read
+by the server can use the display.
+This access control list can be changed by clients on the local host.  
+Some server implementations can also implement other authorization mechanisms
+in addition to or in place of this mechanism.
+The action of this mechanism can be conditional based on the authorization 
+protocol name and data received by the server at connection setup. 
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Active_grab">
+  <glossterm>Active grab</glossterm>
+<indexterm significance="preferred"><primary>Active grab</primary></indexterm>
+  <glossdef>
+    <para>
+A grab is active when the pointer or keyboard is actually owned by the 
+single grabbing client.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Ancestors">
+  <glossterm>Ancestors</glossterm>
+<indexterm significance="preferred"><primary>Ancestors</primary></indexterm>
+  <glossdef>
+    <para>
+If W is an inferior of A, then A is an ancestor of W.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Atom">
+  <glossterm>Atom</glossterm>
+<indexterm significance="preferred"><primary>Atom</primary></indexterm>
+  <glossdef>
+    <para>
+An atom is a unique ID corresponding to a string name.
+Atoms are used to identify properties, types, and selections.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Background">
+  <glossterm>Background</glossterm>
+<indexterm significance="preferred"><primary>Background</primary></indexterm>
+  <glossdef>
+    <para>
+An
+<symbol>InputOutput</symbol>
+window can have a background, which is defined as a pixmap.
+When regions of the window have their contents lost 
+or invalidated,
+the server automatically tiles those regions with the background.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Backing_store">
+  <glossterm>Backing store</glossterm>
+<indexterm significance="preferred"><primary>Backing store</primary></indexterm>
+  <glossdef>
+    <para>
+When a server maintains the contents of a window, 
+the pixels saved off-screen are known as a backing store.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Base_font_name">
+  <glossterm>Base font name</glossterm>
+<indexterm significance="preferred"><primary>Base font name</primary></indexterm>
+  <glossdef>
+    <para>
+A font name used to select a family of fonts whose members may be encoded 
+in various charsets.
+The
+<structfield>CharSetRegistry</structfield>
+and 
+<structfield>CharSetEncoding</structfield>
+fields of an <acronym>XLFD</acronym> name identify the charset of the font.
+A base font name may be a full <acronym>XLFD</acronym> name, with all fourteen '-' delimiters, 
+or an abbreviated <acronym>XLFD</acronym> name containing only the first 12 fields of an <acronym>XLFD</acronym> name,
+up to but not including 
+<structfield>CharSetRegistry</structfield>,
+with or without the thirteenth '-', or a non-<acronym>XLFD</acronym> name.
+Any <acronym>XLFD</acronym> fields may contain wild cards.
+</para>
+    <para>
+When creating an 
+<type>XFontSet</type>,
+Xlib accepts from the client a list of one or more base font names 
+which select one or more font families.
+They are combined with charset names obtained from the encoding of the locale
+to load the fonts required to render text.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Bit_gravity">
+  <glossterm>Bit gravity</glossterm>
+<indexterm significance="preferred"><primary>Bit</primary><secondary>gravity</secondary></indexterm>
+  <glossdef>
+    <para>
+When a window is resized, 
+the contents of the window are not necessarily discarded.  
+It is possible to request that the server relocate the previous contents 
+to some region of the window (though no guarantees are made).
+This attraction of window contents for some location of
+a window is known as bit gravity.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Bit_plane">
+  <glossterm>Bit plane</glossterm>
+<indexterm significance="preferred"><primary>Bit</primary><secondary>plane</secondary></indexterm>
+  <glossdef>
+    <para>
+When a pixmap or window is thought of as a stack of bitmaps,
+each bitmap is called a bit plane or plane.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Bitmap">
+  <glossterm>Bitmap</glossterm>
+<indexterm significance="preferred"><primary>Bitmap</primary></indexterm>
+  <glossdef>
+    <para>
+A bitmap is a <glossterm linkend="glossary:Pixmap">pixmap</glossterm> of depth one.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Border">
+  <glossterm>Border</glossterm>
+<indexterm significance="preferred"><primary>Border</primary></indexterm>
+  <glossdef>
+    <para>
+An
+<symbol>InputOutput</symbol>
+window can have a border of equal thickness on all four sides of the window.
+The contents of the border are defined by a pixmap,
+and the server automatically maintains the contents of the border.
+Exposure events are never generated for border regions.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Button_grabbing">
+  <glossterm>Button grabbing</glossterm>
+<indexterm significance="preferred"><primary>Button</primary><secondary>grabbing</secondary></indexterm>
+  <glossdef>
+    <para>
+Buttons on the pointer can be passively grabbed by a client.
+When the button is pressed, 
+the pointer is then actively grabbed by the client.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Byte_order">
+  <glossterm>Byte order</glossterm>
+<indexterm significance="preferred"><primary>Byte</primary><secondary>order</secondary></indexterm>
+  <glossdef>
+    <para>
+For image (pixmap/bitmap) data, 
+the server defines the byte order,
+and clients with different native byte ordering must swap bytes as
+necessary.  
+For all other parts of the protocol, 
+the client defines the byte order,
+and the server swaps bytes as necessary.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Character">
+  <glossterm>Character</glossterm>
+<indexterm significance="preferred"><primary>Character</primary></indexterm>
+  <glossdef>
+    <para>
+A member of a set of elements used for the organization,
+control, or representation of text (ISO2022, as adapted by XPG3).
+Note that in ISO2022 terms, a character is not bound to a coded value 
+until it is identified as part of a coded character set.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Character_glyph">
+  <glossterm>Character glyph</glossterm>
+<indexterm significance="preferred"><primary>Character glyph</primary></indexterm>
+  <glossdef>
+    <para>
+The abstract graphical symbol for a character.
+Character glyphs may or may not map one-to-one to font glyphs,
+and may be context-dependent, varying with the adjacent characters.
+Multiple characters may map to a single character glyph.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Character_set">
+  <glossterm>Character set</glossterm>
+<indexterm significance="preferred"><primary>Character set</primary></indexterm>
+  <glossdef>
+    <para>
+A collection of characters.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Charset">
+  <glossterm>Charset</glossterm>
+<indexterm significance="preferred"><primary>Charset</primary></indexterm>
+  <glossdef>
+    <para>
+An encoding with a uniform, state-independent mapping from characters 
+to codepoints.
+A coded character set.
+</para>
+    <para>
+For display in X,
+there can be a direct mapping from a charset to one font,
+if the width of all characters in the charset is either one or two bytes.
+A text string encoded in an encoding such as Shift-JIS cannot be passed
+directly to the X server, because the text imaging requests accept only
+single-width charsets (either 8 or 16 bits).
+Charsets which meet these restrictions can serve as ``font charsets''.
+Font charsets strictly speaking map font indices to font glyphs,
+not characters to character glyphs.
+</para>
+    <para>
+Note that a single font charset is sometimes used as the encoding of a locale,
+for example, ISO8859-1.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Children">
+  <glossterm>Children</glossterm>
+<indexterm significance="preferred"><primary>Children</primary></indexterm>
+  <glossdef>
+    <para>
+The children of a window are its first-level subwindows.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Class">
+  <glossterm>Class</glossterm>
+<indexterm significance="preferred"><primary>Class</primary></indexterm>
+  <glossdef>
+    <para>
+Windows can be of different classes or types.
+See the entries for
+<glossterm linkend="glossary:InputOnly_window">InputOnly</glossterm>
+and
+<glossterm linkend="glossary:InputOutput_window">InputOutput</glossterm>
+windows for further information about valid window types.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Client">
+  <glossterm>Client</glossterm>
+<indexterm significance="preferred"><primary>Client</primary></indexterm>
+  <glossdef>
+    <para>
+An application program connects to the window system server by some
+interprocess communication (<acronym>IPC</acronym>) path, such as a <acronym>TCP</acronym> connection or a
+shared memory buffer.  
+This program is referred to as a client of the window system server.  
+More precisely, 
+the client is the <acronym>IPC</acronym> path itself. 
+A program with multiple paths open to the server is viewed as
+multiple clients by the protocol.  
+Resource lifetimes are controlled by
+connection lifetimes, not by program lifetimes.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Clipping_region">
+  <glossterm>Clipping region</glossterm>
+<indexterm significance="preferred"><primary>Clipping region</primary></indexterm>
+  <glossdef>
+    <para>
+In a graphics context, 
+a bitmap or list of rectangles can be specified
+to restrict output to a particular region of the window.  
+The image defined by the bitmap or rectangles is called a clipping region.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Coded_character">
+  <glossterm>Coded character</glossterm>
+<indexterm significance="preferred"><primary>Coded character</primary></indexterm>
+  <glossdef>
+    <para>
+A character bound to a codepoint.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Coded_character_set">
+  <glossterm>Coded character set</glossterm>
+<indexterm significance="preferred"><primary>Coded character set</primary></indexterm>
+  <glossdef>
+    <para>
+A set of unambiguous rules that establishes a character set 
+and the one-to-one relationship between each character of the set 
+and its bit representation.
+(ISO2022, as adapted by XPG3)
+A definition of a one-to-one mapping of a set of characters to a set of
+codepoints.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Codepoint">
+  <glossterm>Codepoint</glossterm>
+<indexterm significance="preferred"><primary>Codepoint</primary></indexterm>
+  <glossdef>
+    <para>
+The coded representation of a single character in a coded character set.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Colormap">
+  <glossterm>Colormap</glossterm>
+<indexterm significance="preferred"><primary>Colormap</primary></indexterm>
+  <glossdef>
+    <para>
+A colormap consists of a set of entries defining color values.
+The colormap associated with a window is used to display the contents of
+the window; each pixel value indexes the colormap to produce an <acronym>RGB</acronym> value
+that drives the guns of a monitor.
+Depending on hardware limitations, 
+one or more colormaps can be installed at one time so
+that windows associated with those maps display with true colors.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Connection">
+  <glossterm>Connection</glossterm>
+<indexterm significance="preferred"><primary>Connection</primary></indexterm>
+  <glossdef>
+    <para>
+The <acronym>IPC</acronym> path between the server and client program is known as a connection.
+A client program typically (but not necessarily) has one
+connection to the server over which requests and events are sent.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Containment">
+  <glossterm>Containment</glossterm>
+<indexterm significance="preferred"><primary>Containment</primary></indexterm>
+  <glossdef>
+    <para>
+A window contains the pointer if the window is viewable and the
+hotspot of the cursor is within a visible region of the window or a
+visible region of one of its inferiors.  
+The border of the window is included as part of the window for containment.  
+The pointer is in a window if the window contains the pointer
+but no inferior contains the pointer.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Coordinate_system">
+  <glossterm>Coordinate system</glossterm>
+<indexterm significance="preferred"><primary>Coordinate system</primary></indexterm>
+  <glossdef>
+    <para>
+The coordinate system has X horizontal and Y vertical, 
+with the origin [0, 0] at the upper left.  
+Coordinates are integral and coincide with pixel centers.
+Each window and pixmap has its own coordinate system.  
+For a window, 
+the origin is inside the border at the inside upper-left corner.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Cursor">
+  <glossterm>Cursor</glossterm>
+<indexterm significance="preferred"><primary>Cursor</primary></indexterm>
+  <glossdef>
+    <para>
+A cursor is the visible shape of the pointer on a screen.  
+It consists of a hotspot, a source bitmap, a shape bitmap, 
+and a pair of colors.  
+The cursor defined for a window controls the visible
+appearance when the pointer is in that window.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Depth">
+  <glossterm>Depth</glossterm>
+<indexterm significance="preferred"><primary>Depth</primary></indexterm>
+  <glossdef>
+    <para>
+The depth of a window or pixmap is the number of bits per pixel it has.
+The depth of a graphics context is the depth of the drawables it can be
+used in conjunction with graphics output.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Device">
+  <glossterm>Device</glossterm>
+<indexterm significance="preferred"><primary>Device</primary></indexterm>
+  <glossdef>
+    <para>
+Keyboards, mice, tablets, track-balls, button boxes, and so on are all
+collectively known as input devices.
+Pointers can have one or more buttons 
+(the most common number is three).
+The core protocol only deals with two devices: the keyboard 
+and the pointer.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:DirectColor">
+  <glossterm>DirectColor</glossterm>
+<indexterm significance="preferred"><primary>DirectColor</primary></indexterm>
+  <glossdef>
+    <para>
+<symbol>DirectColor</symbol>
+is a class of colormap in which a pixel value is decomposed into three
+separate subfields for indexing.
+The first subfield indexes an array to produce red intensity values. 
+The second subfield indexes a second array to produce blue intensity values.
+The third subfield indexes a third array to produce green intensity values.
+The <acronym>RGB</acronym> (red, green, and blue) values in the colormap entry can be 
+changed dynamically.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Display">
+  <glossterm>Display</glossterm>
+<indexterm significance="preferred"><primary>Display</primary></indexterm>
+<indexterm><primary>Display</primary><secondary>structure</secondary></indexterm>
+  <glossdef>
+    <para>
+A server, together with its screens and input devices, is called a display.
+The Xlib
+<type>Display</type>
+structure contains all information about the particular display and its screens
+as well as the state that Xlib needs to communicate with the display over a
+particular connection.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Drawable">
+  <glossterm>Drawable</glossterm>
+<indexterm significance="preferred"><primary>Drawable</primary></indexterm>
+  <glossdef>
+    <para>
+Both windows and pixmaps can be used as sources and destinations 
+in graphics operations.  
+These windows and pixmaps are collectively known as drawables.
+However, an 
+<symbol>InputOnly</symbol>
+window cannot be used as a source or destination in a
+graphics operation.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Encoding">
+  <glossterm>Encoding</glossterm>
+<indexterm significance="preferred"><primary>Encoding</primary></indexterm>
+  <glossdef>
+    <para>
+A set of unambiguous rules that establishes a character set 
+and a relationship between the characters and their representations.
+The character set does not have to be fixed to a finite pre-defined set of
+characters.
+The representations do not have to be of uniform length.
+Examples are an ISO2022 graphic set, a state-independent 
+or state-dependent combination of graphic sets, possibly including control
+sets, and the X Compound Text encoding.
+</para>
+    <para>
+In X, encodings are identified by a string
+which appears as: the
+<structfield>CharSetRegistry</structfield>
+and
+<structfield>CharSetEncoding</structfield>
+components of an <acronym>XLFD</acronym>
+name; the name of a charset of the locale for which a font could not be
+found; or an atom which identifies the encoding of a text property or
+which names an encoding for a text selection target type.
+Encoding names should be composed of characters from the X Portable 
+Character Set.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Escapement">
+  <glossterm>Escapement</glossterm>
+<indexterm significance="preferred"><primary>Escapement</primary></indexterm>
+  <glossdef>
+    <para>
+The escapement of a string is the distance in pixels in the
+primary draw direction from the drawing origin to the origin of the next
+character (that is, the one following the given string) to be drawn.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Event">
+  <glossterm>Event</glossterm>
+<indexterm significance="preferred"><primary>Event</primary></indexterm>
+  <glossdef>
+    <para>
+Clients are informed of information asynchronously by means of events.
+These events can be either asynchronously generated from devices or
+generated as side effects of client requests.  
+Events are grouped into types. 
+The server never sends an event to a client unless the
+client has specifically asked to be informed of that type of event.
+However, clients can force events to be sent to other clients.  
+Events are typically reported relative to a window.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Event_mask">
+  <glossterm>Event mask</glossterm>
+<indexterm significance="preferred"><primary>Event</primary><secondary>mask</secondary></indexterm>
+  <glossdef>
+    <para>
+Events are requested relative to a window.  
+The set of event types a client requests relative to a window is described 
+by using an event mask.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Event_propagation">
+  <glossterm>Event propagation</glossterm>
+<indexterm significance="preferred"><primary>Event</primary><secondary>propagation</secondary></indexterm>
+  <glossdef>
+    <para>
+Device-related events propagate from the source window to ancestor
+windows until some client has expressed interest in handling that type
+of event or until the event is discarded explicitly.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Event_source">
+  <glossterm>Event source</glossterm>
+<indexterm significance="preferred"><primary>Event</primary><secondary>source</secondary></indexterm>
+  <glossdef>
+    <para>
+The deepest viewable window that the pointer is in is called
+the source of a device-related event.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Event_synchronization">
+  <glossterm>Event synchronization</glossterm>
+<indexterm significance="preferred"><primary>Event</primary><secondary>synchronization</secondary></indexterm>
+  <glossdef>
+    <para>
+There are certain race conditions possible when demultiplexing device
+events to clients (in particular, deciding where pointer and keyboard
+events should be sent when in the middle of window management
+operations).  
+The event synchronization mechanism allows synchronous processing of 
+device events.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Exposure_event">
+  <glossterm>Exposure event</glossterm>
+<indexterm significance="preferred"><primary>Event</primary><secondary>Exposure</secondary></indexterm>
+  <glossdef>
+    <para>
+Servers do not guarantee to preserve the contents of windows when
+windows are obscured or reconfigured.  
+Exposure events are sent to clients to inform them when contents of regions
+of windows have been lost.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Extension">
+  <glossterm>Extension</glossterm>
+<indexterm significance="preferred"><primary>Extension</primary></indexterm>
+  <glossdef>
+    <para>
+Named extensions to the core protocol can be defined to extend the system.  
+Extensions to output requests, resources, and event types are all possible
+and expected.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Font">
+  <glossterm>Font</glossterm>
+<indexterm significance="preferred"><primary>Font</primary></indexterm>
+  <glossdef>
+    <para>
+A font is an array of glyphs (typically characters).  
+The protocol does no translation or interpretation of character sets.  
+The client simply indicates values used to index the glyph array.  
+A font contains additional metric information to determine interglyph 
+and interline spacing.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Font_glyph">
+  <glossterm>Font glyph</glossterm>
+<indexterm significance="preferred"><primary>Font glyph</primary></indexterm>
+  <glossdef>
+    <para>
+The abstract graphical symbol for an index into a font.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Frozen_events">
+  <glossterm>Frozen events</glossterm>
+<indexterm significance="preferred"><primary>Frozen events</primary></indexterm>
+  <glossdef>
+    <para>
+Clients can freeze event processing during keyboard and pointer grabs.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:GC">
+  <glossterm>GC</glossterm>
+<indexterm significance="preferred"><primary>GC</primary></indexterm>
+  <glossdef>
+    <para>
+GC is an abbreviation for graphics context.
+See <glossterm linkend="glossary:Graphics_context">Graphics context</glossterm>.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Glyph">
+  <glossterm>Glyph</glossterm>
+<indexterm significance="preferred"><primary>Glyph</primary></indexterm>
+  <glossdef>
+    <para>
+An identified abstract graphical symbol independent of any actual image.
+(ISO/IEC/DIS 9541-1)
+An abstract visual representation of a graphic character,
+not bound to a codepoint.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Glyph_image">
+  <glossterm>Glyph image</glossterm>
+<indexterm significance="preferred"><primary>Glyph image</primary></indexterm>
+  <glossdef>
+    <para>
+An image of a glyph, as obtained from a glyph representation displayed 
+on a presentation surface.
+(ISO/IEC/DIS 9541-1)
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Grab">
+  <glossterm>Grab</glossterm>
+<indexterm significance="preferred"><primary>Grab</primary></indexterm>
+  <glossdef>
+    <para>
+Keyboard keys, the keyboard, pointer buttons, the pointer, 
+and the server can be grabbed for exclusive use by a client.  
+In general, 
+these facilities are not intended to be used by normal applications
+but are intended for various input and window managers to implement various
+styles of user interfaces.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Graphics_context">
+  <glossterm>Graphics context</glossterm>
+<indexterm significance="preferred"><primary>Graphics context</primary></indexterm>
+  <glossdef>
+    <para>
+Various information for graphics output is stored in a graphics
+context (<acronym>GC</acronym>), such as foreground pixel, background
+pixel, line width, clipping region, and so on.
+A graphics context can only
+be used with drawables that have the same root and the same depth as
+the graphics context. 
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Gravity">
+  <glossterm>Gravity</glossterm>
+<indexterm significance="preferred"><primary>Gravity</primary></indexterm>
+  <glossdef>
+    <para>
+The contents of windows and windows themselves have a gravity,
+which determines how the contents move when a window is resized.
+See <glossterm linkend="glossary:Bit_gravity">Bit gravity</glossterm> and
+<glossterm linkend="glossary:Window_gravity">Window gravity</glossterm>.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:GrayScale">
+  <glossterm>GrayScale</glossterm>
+<indexterm significance="preferred"><primary>GrayScale</primary></indexterm>
+  <glossdef>
+    <para>
+<symbol>GrayScale</symbol>
+can be viewed as a degenerate case of 
+<glossterm linkend="glossary:PseudoColor"><symbol>PseudoColor</symbol></glossterm>,
+in which the red, green, and blue values in any given colormap entry 
+are equal and thus, produce shades of gray.
+The gray values can be changed dynamically.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Host_Portable_Character_Encoding">
+  <glossterm>Host Portable Character Encoding</glossterm>
+<indexterm significance="preferred"><primary>Host Portable Character Encoding</primary></indexterm>
+  <glossdef>
+    <para>
+The encoding of the <glossterm linkend="glossary:X_Portable_Character_Set">X Portable Character Set</glossterm> on the host.
+The encoding itself is not defined by this standard,
+but the encoding must be the same in all locales supported by Xlib on the host.
+If a string is said to be in the Host Portable Character Encoding,
+then it only contains characters from the X Portable Character Set,
+in the host encoding.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Hotspot">
+  <glossterm>Hotspot</glossterm>
+<indexterm significance="preferred"><primary>Hotspot</primary></indexterm>
+  <glossdef>
+    <para>
+A cursor has an associated hotspot, which defines the point in the
+cursor corresponding to the coordinates reported for the pointer.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Identifier">
+  <glossterm>Identifier</glossterm>
+<indexterm significance="preferred"><primary>Identifier</primary></indexterm>
+  <glossdef>
+    <para>
+An identifier is a unique value associated with a resource
+that clients use to name that resource.  
+The identifier can be used over any connection to name the resource.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Inferiors">
+  <glossterm>Inferiors</glossterm>
+<indexterm significance="preferred"><primary>Inferiors</primary></indexterm>
+  <glossdef>
+    <para>
+The inferiors of a window are all of the subwindows nested below it:
+the children, the children's children, and so on.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Input_focus">
+  <glossterm>Input focus</glossterm>
+<indexterm significance="preferred"><primary>Input</primary><secondary>focus</secondary></indexterm>
+  <glossdef>
+    <para>
+The input focus is usually a window defining the scope for processing
+of keyboard input.
+If a generated keyboard event usually would be reported to this window 
+or one of its inferiors,
+the event is reported as usual.
+Otherwise, the event is reported with respect to the focus window.
+The input focus also can be set such that all keyboard events are discarded
+and such that the focus window is dynamically taken to be the root window
+of whatever screen the pointer is on at each keyboard event.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Input_manager">
+  <glossterm>Input manager</glossterm>
+<indexterm significance="preferred"><primary>Input</primary><secondary>manager</secondary></indexterm>
+  <glossdef>
+    <para>
+Control over keyboard input is typically provided by an input manager 
+client, which usually is part of a window manager.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:InputOnly_window">
+  <glossterm>InputOnly window</glossterm>
+<indexterm significance="preferred"><primary>Window</primary><secondary>InputOnly</secondary></indexterm>
+  <glossdef>
+    <para>
+An
+<symbol>InputOnly</symbol>
+window is a window that cannot be used for graphics requests.  
+<symbol>InputOnly</symbol>
+windows are invisible and are used to control such things as cursors,
+input event generation, and grabbing.
+<symbol>InputOnly</symbol>
+windows cannot have 
+<symbol>InputOutput</symbol>
+windows as inferiors.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:InputOutput_window">
+  <glossterm>InputOutput window</glossterm>
+<indexterm significance="preferred"><primary>Window</primary><secondary>InputOutput</secondary></indexterm>
+  <glossdef>
+    <para>
+An
+<symbol>InputOutput</symbol>
+window is the normal kind of window that is used for both input and output.
+<symbol>InputOutput</symbol>
+windows can have both 
+<symbol>InputOutput</symbol>
+and 
+<symbol>InputOnly</symbol>
+windows as inferiors.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Internationalization">
+  <glossterm>Internationalization</glossterm>
+<indexterm significance="preferred"><primary>Internationalization</primary></indexterm>
+  <glossdef>
+    <para>
+The process of making software adaptable to the requirements
+of different native languages, local customs, and character string encodings.
+Making a computer program adaptable to different locales 
+without program source modifications or recompilation.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:ISO2022">
+  <glossterm>ISO2022</glossterm>
+<indexterm significance="preferred"><primary>ISO2022</primary></indexterm>
+  <glossdef>
+    <para>
+ISO standard for code extension techniques for 7-bit and 8-bit coded 
+character sets.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Key_grabbing">
+  <glossterm>Key grabbing</glossterm>
+<indexterm significance="preferred"><primary>Key</primary><secondary>grabbing</secondary></indexterm>
+  <glossdef>
+    <para>
+Keys on the keyboard can be passively grabbed by a client.  
+When the key is pressed, 
+the keyboard is then actively grabbed by the client.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Keyboard_grabbing">
+  <glossterm>Keyboard grabbing</glossterm>
+<indexterm significance="preferred"><primary>Keyboard</primary><secondary>grabbing</secondary></indexterm>
+  <glossdef>
+    <para>
+A client can actively grab control of the keyboard, and key events
+will be sent to that client rather than the client the events would
+normally have been sent to.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Keysym">
+  <glossterm>Keysym</glossterm>
+<indexterm significance="preferred"><primary>Keysym</primary></indexterm>
+  <glossdef>
+    <para>
+An encoding of a symbol on a keycap on a keyboard.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Latin-1">
+  <glossterm>Latin-1</glossterm>
+<indexterm significance="preferred"><primary>Latin-1</primary></indexterm>
+  <glossdef>
+    <para>
+The coded character set defined by the ISO8859-1 standard.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Latin_Portable_Character_Encoding">
+  <glossterm>Latin Portable Character Encoding</glossterm>
+<indexterm significance="preferred"><primary>Latin Portable Character Encoding</primary></indexterm>
+  <glossdef>
+    <para>
+The encoding of the X Portable Character Set using the Latin-1 codepoints
+plus ASCII control characters.
+If a string is said to be in the Latin Portable Character Encoding,
+then it only contains characters from the X Portable Character Set,
+not all of Latin-1.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Locale">
+  <glossterm>Locale</glossterm>
+<indexterm significance="preferred"><primary>Locale</primary></indexterm>
+  <glossdef>
+    <para>
+The international environment of a computer program defining the ``localized''
+behavior of that program at run-time.
+This information can be established from one or more sets of localization data.
+ANSI C defines locale-specific processing by C system library calls.
+See ANSI C and the X/Open Portability Guide specifications for more details.
+In this specification, on implementations that conform to the ANSI C library,
+the ``current locale'' is the current setting of the LC_CTYPE
+<function>setlocale</function>
+category.
+Associated with each locale is a text encoding.  When text is processed
+in the context of a locale, the text must be in the encoding of the locale.
+The current locale affects Xlib in its:
+    <itemizedlist>
+      <listitem><para>
+Encoding and processing of input method text
+      </para></listitem>
+      <listitem><para>
+Encoding of resource files and values
+      </para></listitem>
+      <listitem><para>
+Encoding and imaging of text strings
+      </para></listitem>
+      <listitem><para>
+Encoding and decoding for inter-client text communication
+      </para></listitem>
+    </itemizedlist></para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Locale_name">
+  <glossterm>Locale name</glossterm>
+<indexterm significance="preferred"><primary>Locale name</primary></indexterm>
+  <glossdef>
+    <para>
+The identifier used to select the desired locale for the host C library 
+and X library functions.
+On ANSI C library compliant systems,
+the locale argument to the
+<function>setlocale</function>
+function.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Localization">
+  <glossterm>Localization</glossterm>
+<indexterm significance="preferred"><primary>Localization</primary></indexterm>
+  <glossdef>
+    <para>
+The process of establishing information within a computer system specific 
+to the operation of particular native languages, local customs 
+and coded character sets.
+(XPG3)
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Mapped">
+  <glossterm>Mapped</glossterm>
+<indexterm significance="preferred"><primary>Mapped window</primary></indexterm>
+  <glossdef>
+    <para>
+A window is said to be mapped if a map call has been performed on it.
+Unmapped windows and their inferiors are never viewable or visible.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Modifier_keys">
+  <glossterm>Modifier keys</glossterm>
+<indexterm significance="preferred"><primary>Modifier keys</primary></indexterm>
+  <glossdef>
+    <para>
+Shift, Control, Meta, Super, Hyper, Alt, Compose, Apple, CapsLock,
+ShiftLock, and similar keys are called modifier keys.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Monochrome">
+  <glossterm>Monochrome</glossterm>
+<indexterm significance="preferred"><primary>Monochrome</primary></indexterm>
+  <glossdef>
+    <para>
+Monochrome is a special case of 
+<glossterm linkend="glossary:StaticGray"><symbol>StaticGray</symbol></glossterm>
+in which there are only two colormap entries.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Multibyte">
+  <glossterm>Multibyte</glossterm>
+<indexterm significance="preferred"><primary>Multibyte</primary></indexterm>
+  <glossdef>
+    <para>
+A character whose codepoint is stored in more than one byte;
+any encoding which can contain multibyte characters;
+text in a multibyte encoding.
+The ``<type>char *</type>'' null-terminated string datatype in ANSI C.
+Note that references in this document to multibyte strings
+imply only that the strings <emphasis remap='I'>may</emphasis> contain multibyte characters.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Obscure">
+  <glossterm>Obscure</glossterm>
+<indexterm significance="preferred"><primary>Obscure</primary></indexterm>
+  <glossdef>
+    <para>
+A window is obscured if some other window obscures it.
+A window can be partially obscured and so still have visible regions.
+Window A obscures window B if both are viewable 
+<symbol>InputOutput</symbol>
+windows, if A is higher in the global stacking order, 
+and if the rectangle defined by the outside
+edges of A intersects the rectangle defined by the outside edges of B.
+Note the distinction between obscures and occludes.
+Also note that window borders are included in the calculation.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Occlude">
+  <glossterm>Occlude</glossterm>
+<indexterm significance="preferred"><primary>Occlude</primary></indexterm>
+  <glossdef>
+    <para>
+A window is occluded if some other window occludes it.
+Window A occludes window B if both are mapped, 
+if A is higher in the global stacking order, 
+and if the rectangle defined by the outside edges of A intersects the rectangle defined 
+by the outside edges of B.  
+Note the distinction between occludes and obscures.
+Also note that window borders are included in the calculation
+and that
+<symbol>InputOnly</symbol>
+windows never obscure other windows but can occlude other windows.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Padding">
+  <glossterm>Padding</glossterm>
+<indexterm significance="preferred"><primary>Padding</primary></indexterm>
+  <glossdef>
+    <para>
+Some padding bytes are inserted in the data stream to maintain
+alignment of the protocol requests on natural boundaries.  
+This increases ease of portability to some machine architectures.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Parent_window">
+  <glossterm>Parent window</glossterm>
+<indexterm significance="preferred"><primary>Window</primary><secondary>parent</secondary></indexterm>
+  <glossdef>
+    <para>
+If C is a child of P, then P is the parent of C.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Passive_grab">
+  <glossterm>Passive grab</glossterm>
+<indexterm significance="preferred"><primary>Passive grab</primary></indexterm>
+  <glossdef>
+    <para>
+Grabbing a key or button is a passive grab.  
+The grab activates when the key or button is actually pressed.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Pixel_value">
+  <glossterm>Pixel value</glossterm>
+<indexterm significance="preferred"><primary>Pixel value</primary></indexterm>
+  <glossdef>
+    <para>
+A pixel is an N-bit value,
+where N is the number of bit planes used in a particular window or pixmap
+(that is, is the depth of the window or pixmap).  
+A pixel in a window indexes a colormap to derive an actual color to be 
+displayed.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Pixmap">
+  <glossterm>Pixmap</glossterm>
+<indexterm significance="preferred"><primary>Pixmap</primary></indexterm>
+  <glossdef>
+    <para>
+A pixmap is a three-dimensional array of bits.  
+A pixmap is normally thought of as a two-dimensional array of pixels, 
+where each pixel can be a value from 0 to 2<superscript>N</superscript>-1,
+and where N is the depth (z axis) of the pixmap.  
+A pixmap can also be thought of as a stack of N bitmaps.
+A pixmap can only be used on the screen that it was created in.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Plane">
+  <glossterm>Plane</glossterm>
+<indexterm significance="preferred"><primary>Plane</primary></indexterm>
+  <glossdef>
+    <para>
+When a pixmap or window is thought of as a stack of bitmaps, each
+bitmap is called a plane or bit plane.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Plane_mask">
+  <glossterm>Plane mask</glossterm>
+<indexterm significance="preferred"><primary>Plane</primary><secondary>mask</secondary></indexterm>
+  <glossdef>
+    <para>
+Graphics operations can be restricted to only affect a subset of bit
+planes of a destination.  
+A plane mask is a bit mask describing which planes are to be modified.
+The plane mask is stored in a graphics context.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Pointer">
+  <glossterm>Pointer</glossterm>
+<indexterm significance="preferred"><primary>Pointer</primary></indexterm>
+  <glossdef>
+    <para>
+The pointer is the pointing device currently attached to the cursor
+and tracked on the screens.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Pointer_grabbing">
+  <glossterm>Pointer grabbing</glossterm>
+<indexterm significance="preferred"><primary>Pointer</primary><secondary>grabbing</secondary></indexterm>
+  <glossdef>
+    <para>
+A client can actively grab control of the pointer. 
+Then button and motion events will be sent to that client 
+rather than the client the events would normally have been sent to.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Pointing_device">
+  <glossterm>Pointing device</glossterm>
+<indexterm significance="preferred"><primary>Pointing device</primary></indexterm>
+  <glossdef>
+    <para>
+A pointing device is typically a mouse, tablet, or some other
+device with effective dimensional motion.  
+The core protocol defines only one visible cursor,
+which tracks whatever pointing device is attached as the pointer.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:POSIX">
+  <glossterm><acronym>POSIX</acronym></glossterm>
+<indexterm significance="preferred"><primary><acronym>POSIX</acronym></primary></indexterm>
+  <glossdef>
+    <para>
+Portable Operating System Interface, ISO/IEC 9945-1 (IEEE Std 1003.1).
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:POSIX_Portable_Filename_Character_Set">
+  <glossterm><acronym>POSIX</acronym> Portable Filename Character Set</glossterm>
+<indexterm significance="preferred"><primary><acronym>POSIX</acronym> Portable Filename Character Set</primary></indexterm>
+  <glossdef>
+    <para>
+The set of 65 characters which can be used in naming files on a <acronym>POSIX</acronym>-compliant
+host that are correctly processed in all locales.
+The set is:
+</para>
+    <para>
+<!-- .Ds 0 -->
+a..z A..Z 0..9 ._-
+<!-- .De -->
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Property">
+  <glossterm>Property</glossterm>
+<indexterm significance="preferred"><primary>Property</primary></indexterm>
+  <glossdef>
+    <para>
+Windows can have associated properties that consist of a name, a type,
+a data format, and some data. 
+The protocol places no interpretation on properties. 
+They are intended as a general-purpose naming mechanism for clients.  
+For example, clients might use properties to share information such as resize
+hints, program names, and icon formats with a window manager.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Property_list">
+  <glossterm>Property list</glossterm>
+<indexterm significance="preferred"><primary>Property list</primary></indexterm>
+  <glossdef>
+    <para>
+The property list of a window is the list of properties that have
+been defined for the window.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:PseudoColor">
+  <glossterm>PseudoColor</glossterm>
+<indexterm significance="preferred"><primary>PseudoColor</primary></indexterm>
+  <glossdef>
+    <para>
+<symbol>PseudoColor</symbol>
+is a class of colormap in which a pixel value indexes the colormap entry to
+produce an independent <acronym>RGB</acronym> value;
+that is, the colormap is viewed as an array of triples (<acronym>RGB</acronym> values).
+The <acronym>RGB</acronym> values can be changed dynamically.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Rectangle">
+  <glossterm>Rectangle</glossterm>
+<indexterm significance="preferred"><primary>Rectangle</primary></indexterm>
+  <glossdef>
+    <para>
+A rectangle specified by [x,y,w,h] has an infinitely thin
+outline path with corners at [x,y], [x+w,y], [x+w,y+h], and [x, y+h].
+When a rectangle is filled,
+the lower-right edges are not drawn.
+For example,
+if w=h=0,
+nothing would be drawn.
+For w=h=1,
+a single pixel would be drawn.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Redirecting_control">
+  <glossterm>Redirecting control</glossterm>
+<indexterm significance="preferred"><primary>Redirecting control</primary></indexterm>
+  <glossdef>
+    <para>
+Window managers (or client programs) may enforce window layout
+policy in various ways.  
+When a client attempts to change the size or position of a window, 
+the operation may be redirected to a specified client
+rather than the operation actually being performed.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Reply">
+  <glossterm>Reply</glossterm>
+<indexterm significance="preferred"><primary>Reply</primary></indexterm>
+  <glossdef>
+    <para>
+Information requested by a client program using the X protocol 
+is sent back to the client with a reply.
+Both events and replies are multiplexed on the same connection.  
+Most requests do not generate replies,
+but some requests generate multiple replies.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Request">
+  <glossterm>Request</glossterm>
+<indexterm significance="preferred"><primary>Request</primary></indexterm>
+  <glossdef>
+    <para>
+A command to the server is called a request.
+It is a single block of data sent over a connection.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Resource">
+  <glossterm>Resource</glossterm>
+<indexterm significance="preferred"><primary>Resource</primary></indexterm>
+  <glossdef>
+    <para>
+Windows, pixmaps, cursors, fonts, graphics contexts, and colormaps are
+known as resources.  
+They all have unique identifiers associated with them for naming purposes.  
+The lifetime of a resource usually is bounded by the lifetime of the 
+connection over which the resource was created.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:RGB_values">
+  <glossterm><acronym>RGB</acronym> values</glossterm>
+<indexterm significance="preferred"><primary><acronym>RGB</acronym> values</primary></indexterm>
+  <glossdef>
+    <para>
+<acronym>RGB</acronym> values are the red, green, and blue intensity values that are used
+to define a color.
+These values are always represented as 16-bit, unsigned numbers, with 0
+the minimum intensity and 65535 the maximum intensity.
+The X server scales these values to match the display hardware.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Root">
+  <glossterm>Root</glossterm>
+<indexterm significance="preferred"><primary>Root</primary></indexterm>
+  <glossdef>
+    <para>
+The root of a pixmap or graphics context is the same as the root 
+of whatever drawable was used when the pixmap or GC was created.  
+The root of a window is the root window under which the window was created.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Root_window">
+  <glossterm>Root window</glossterm>
+<indexterm significance="preferred"><primary>Window</primary><secondary>root</secondary></indexterm>
+  <glossdef>
+    <para>
+Each screen has a root window covering it.
+The root window cannot be reconfigured or unmapped, 
+but otherwise it acts as a full-fledged window.
+A root window has no parent.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Save_set">
+  <glossterm>Save set</glossterm>
+<indexterm significance="preferred"><primary>Save set</primary></indexterm>
+  <glossdef>
+    <para>
+The save set of a client is a list of other clients' windows that,
+if they are inferiors of one of the client's windows at connection
+close, should not be destroyed and that should be remapped 
+if currently unmapped.
+Save sets are typically used by window managers to avoid
+lost windows if the manager should terminate abnormally.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Scanline">
+  <glossterm>Scanline</glossterm>
+<indexterm significance="preferred"><primary>Scanline</primary></indexterm>
+  <glossdef>
+    <para>
+A scanline is a list of pixel or bit values viewed as a horizontal
+row (all values having the same y coordinate) of an image, with the
+values ordered by increasing the x coordinate.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Scanline_order">
+  <glossterm>Scanline order</glossterm>
+<indexterm significance="preferred"><primary>Scanline</primary><secondary>order</secondary></indexterm>
+  <glossdef>
+    <para>
+An image represented in scanline order contains scanlines ordered by
+increasing the y coordinate.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Screen">
+  <glossterm>Screen</glossterm>
+<indexterm significance="preferred"><primary>Screen</primary></indexterm>
+<indexterm><primary>Screen</primary><secondary>structure</secondary></indexterm>
+<indexterm><primary>Display</primary><secondary>structure</secondary></indexterm>
+  <glossdef>
+    <para>
+A server can provide several independent screens, 
+which typically have physically independent monitors.  
+This would be the expected configuration when there is only a single keyboard 
+and pointer shared among the screens.
+A 
+<type>Screen</type>
+structure contains the information about that screen
+and is linked to the 
+<type>Display</type>
+structure.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Selection">
+  <glossterm>Selection</glossterm>
+<indexterm significance="preferred"><primary>Selection</primary></indexterm>
+  <glossdef>
+    <para>
+A selection can be thought of as an indirect property with dynamic
+type.
+That is, rather than having the property stored in the X server,
+it is maintained by some client (the owner).
+A selection is global and is thought of as belonging to the user 
+and being maintained by clients, 
+rather than being private to a particular window subhierarchy
+or a particular set of clients.
+When a client asks for the contents of
+a selection, it specifies a selection target type,
+which can be used to control the transmitted representation of the contents.
+For example, if the selection is ``the last thing the user clicked on,''
+and that is currently an image, then the target type might specify
+whether the contents of the image should be sent in XY format or
+Z format.
+</para>
+    <para>
+The target type can also be used to control the class of
+contents transmitted; for example, 
+asking for the ``looks'' (fonts, line
+spacing, indentation, and so forth) of a paragraph selection, rather than the
+text of the paragraph.
+The target type can also be used for other
+purposes.
+The protocol does not constrain the semantics.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Server">
+  <glossterm>Server</glossterm>
+<indexterm significance="preferred"><primary>Server</primary></indexterm>
+  <glossdef>
+    <para>
+The server, which is also referred to as the X server, 
+provides the basic windowing mechanism.  
+It handles <acronym>IPC</acronym> connections from clients, 
+multiplexes graphics requests onto the screens, 
+and demultiplexes input back to the appropriate clients.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Server_grabbing">
+  <glossterm>Server grabbing</glossterm>
+<indexterm significance="preferred"><primary>Server</primary><secondary>grabbing</secondary></indexterm>
+  <glossdef>
+    <para>
+The server can be grabbed by a single client for exclusive use.  
+This prevents processing of any requests from other client connections until
+the grab is completed.
+This is typically only a transient state for such things as rubber-banding,
+pop-up menus, or executing requests indivisibly.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Shift_sequence">
+  <glossterm>Shift sequence</glossterm>
+<indexterm significance="preferred"><primary>Shift sequence</primary></indexterm>
+  <glossdef>
+    <para>
+ISO2022 defines control characters and escape sequences 
+which temporarily (single shift) or permanently (locking shift) cause a
+different character set to be in effect (``invoking'' a character set).
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Sibling">
+  <glossterm>Sibling</glossterm>
+<indexterm significance="preferred"><primary>Sibling</primary></indexterm>
+  <glossdef>
+    <para>
+Children of the same parent window are known as sibling windows.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Stacking_order">
+  <glossterm>Stacking order</glossterm>
+<indexterm significance="preferred"><primary>Stacking order</primary></indexterm>
+  <glossdef>
+    <para>
+Sibling windows, similar to sheets of paper on a desk,
+can stack on top of each other.  
+Windows above both obscure and occlude lower windows.  
+The relationship between sibling windows is known as the stacking order.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:State-dependent_encoding">
+  <glossterm>State-dependent encoding</glossterm>
+<indexterm significance="preferred"><primary>State-dependent encoding</primary></indexterm>
+  <glossdef>
+    <para>
+An encoding in which an invocation of a charset can apply to multiple
+characters in sequence.
+A state-dependent encoding begins in an ``initial state'' 
+and enters other ``shift states'' when specific ``shift sequences'' 
+are encountered in the byte sequence.
+In ISO2022 terms,
+this means use of locking shifts, not single shifts.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:State-independent_encoding">
+  <glossterm>State-independent encoding</glossterm>
+<indexterm significance="preferred"><primary>State-independent encoding</primary></indexterm>
+  <glossdef>
+    <para>
+Any encoding in which the invocations of the charsets are fixed,
+or span only a single character.
+In ISO2022 terms,
+this means use of at most single shifts, not locking shifts.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:StaticColor">
+  <glossterm>StaticColor</glossterm>
+<indexterm significance="preferred"><primary>StaticColor</primary></indexterm>
+  <glossdef>
+    <para>
+<symbol>StaticColor</symbol>
+can be viewed as a degenerate case of 
+<glossterm linkend="glossary:PseudoColor"><symbol>PseudoColor</symbol></glossterm>
+in which the <acronym>RGB</acronym> values are predefined and read-only.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:StaticGray">
+  <glossterm>StaticGray</glossterm>
+<indexterm significance="preferred"><primary>StaticGray</primary></indexterm>
+  <glossdef>
+    <para>
+<symbol>StaticGray</symbol>
+can be viewed as a degenerate case of 
+<glossterm linkend="glossary:GrayScale"><symbol>GrayScale</symbol></glossterm>
+in which the gray values are predefined and read-only.
+The values are typically linear or near-linear increasing ramps.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Status">
+  <glossterm>Status</glossterm>
+<indexterm significance="preferred"><primary>Status</primary></indexterm>
+  <glossdef>
+    <para>
+Many Xlib functions return a success status.
+If the function does not succeed,
+however, its arguments are not disturbed.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Stipple">
+  <glossterm>Stipple</glossterm>
+<indexterm significance="preferred"><primary>Stipple</primary></indexterm>
+  <glossdef>
+    <para>
+A stipple pattern is a bitmap that is used to tile a region to serve
+as an additional clip mask for a fill operation with the foreground
+color.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:STRING_encoding">
+  <glossterm>STRING encoding</glossterm>
+  <glossdef>
+    <para>
+<glossterm linkend="glossary:Latin-1">Latin-1</glossterm>, plus tab and newline.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:String_Equivalence">
+  <glossterm>String Equivalence</glossterm>
+<indexterm significance="preferred"><primary>String Equivalence</primary></indexterm>
+  <glossdef>
+    <para>
+Two ISO Latin-1 STRING8 values are considered equal if they are the same
+length and if corresponding bytes are either equal or are equivalent as
+follows:  decimal values 65 to 90 inclusive (characters ``A'' to ``Z'') are
+pairwise equivalent to decimal values 97 to 122 inclusive
+(characters ``a'' to ``z''), decimal values 192 to 214 inclusive
+(characters ``A grave'' to ``O diaeresis'') are pairwise equivalent to decimal
+values 224 to 246 inclusive (characters ``a grave'' to ``o diaeresis''),
+and decimal values 216 to 222 inclusive (characters ``O oblique'' to ``THORN'')
+are pairwise equivalent to decimal values 246 to 254 inclusive
+(characters ``o oblique'' to ``thorn'').
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Tile">
+  <glossterm>Tile</glossterm>
+<indexterm significance="preferred"><primary>Tile</primary></indexterm>
+  <glossdef>
+    <para>
+A pixmap can be replicated in two dimensions to tile a region.  
+The pixmap itself is also known as a tile.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Timestamp">
+  <glossterm>Timestamp</glossterm>
+<indexterm significance="preferred"><primary>Timestamp</primary></indexterm>
+  <glossdef>
+    <para>
+A timestamp is a time value expressed in milliseconds. 
+It is typically the time since the last server reset.
+Timestamp values wrap around (after about 49.7 days).
+The server, given its current time is represented by timestamp T, 
+always interprets timestamps from clients by treating half 
+of the timestamp space as being earlier in time than T 
+and half of the timestamp space as being later in time than T.
+One timestamp value, represented by the constant 
+<symbol>CurrentTime</symbol>,
+is never generated by the server. 
+This value is reserved for use in requests to represent the current server time.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:TrueColor">
+  <glossterm>TrueColor</glossterm>
+<indexterm significance="preferred"><primary>TrueColor</primary></indexterm>
+  <glossdef>
+    <para>
+<symbol>TrueColor</symbol>
+can be viewed as a degenerate case of 
+<glossterm linkend="glossary:DirectColor"><symbol>DirectColor</symbol></glossterm>
+in which the subfields in the pixel value directly encode the corresponding <acronym>RGB</acronym>
+values.
+That is, the colormap has predefined read-only <acronym>RGB</acronym> values.
+The values are typically linear or near-linear increasing ramps.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Type">
+  <glossterm>Type</glossterm>
+<indexterm significance="preferred"><primary>Type</primary></indexterm>
+  <glossdef>
+    <para>
+A type is an arbitrary atom used to identify the interpretation of property 
+data.  
+Types are completely uninterpreted by the server. 
+They are solely for the benefit of clients.
+X predefines type atoms for many frequently used types,
+and clients also can define new types.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Viewable">
+  <glossterm>Viewable</glossterm>
+<indexterm significance="preferred"><primary>Viewable</primary></indexterm>
+  <glossdef>
+    <para>
+A window is viewable if it and all of its ancestors are mapped.  
+This does not imply that any portion of the window is actually visible.
+Graphics requests can be performed on a window when it is not
+viewable, but output will not be retained unless the server is maintaining
+backing store. 
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Visible">
+  <glossterm>Visible</glossterm>
+<indexterm significance="preferred"><primary>Visible</primary></indexterm>
+  <glossdef>
+    <para>
+A region of a window is visible if someone looking at the screen can
+actually see it; that is, the window is viewable and the region is not occluded
+by any other window.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Whitespace">
+  <glossterm>Whitespace</glossterm>
+<indexterm significance="preferred"><primary>Whitespace</primary></indexterm>
+  <glossdef>
+    <para>
+Any spacing character.
+On implementations that conform to the ANSI C library,
+whitespace is any character for which
+<function>isspace</function>
+returns true.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Window_gravity">
+  <glossterm>Window gravity</glossterm>
+<indexterm significance="preferred"><primary>Window</primary><secondary>gravity</secondary></indexterm>
+  <glossdef>
+    <para>
+When windows are resized, 
+subwindows may be repositioned automatically relative to some position in the 
+window.
+This attraction of a subwindow to some part of its parent is known 
+as window gravity.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Window_manager">
+  <glossterm>Window manager</glossterm>
+<indexterm significance="preferred"><primary>Window</primary><secondary>manager</secondary></indexterm>
+  <glossdef>
+    <para>
+Manipulation of windows on the screen and much of the user interface
+(policy) is typically provided by a window manager client.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:X_Portable_Character_Set">
+  <glossterm>X Portable Character Set</glossterm>
+<indexterm significance="preferred"><primary>X Portable Character Set</primary></indexterm>
+  <glossdef>
+    <para>
+A basic set of 97 characters which are assumed to exist in all
+locales supported by Xlib.  This set contains the following characters:
+      <literallayout>
+a..z A..Z 0..9
+!"#$%&amp;'()*+,-./:;&lt;=&gt;?@[\\]^_`{|}~
+&lt;space&gt;, &lt;tab&gt;, and &lt;newline&gt;
+      </literallayout>
+    </para>
+    <para>
+This is the left/lower half (also called the G0 set)
+of the graphic character set of ISO8859-1 plus &lt;space&gt;, &lt;tab&gt;, and &lt;newline&gt;.
+It is also the set of graphic characters in 7-bit ASCII plus the same
+three control characters.
+The actual encoding of these characters on the host is system dependent;
+see the <glossterm linkend="glossary:Host_Portable_Character_Encoding">Host Portable Character Encoding</glossterm>.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:XLFD">
+  <glossterm><acronym>XLFD</acronym></glossterm>
+<indexterm significance="preferred"><primary><acronym>XLFD</acronym></primary></indexterm>
+  <glossdef>
+    <para>
+The <olink targetdoc='xlfd' targetptr='xlfd'><citetitle>X Logical Font Description Conventions</citetitle></olink>
+that define a standard syntax for structured font names.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:XY_format">
+  <glossterm>XY format</glossterm>
+<indexterm significance="preferred"><primary>XY format</primary></indexterm>
+  <glossdef>
+    <para>
+The data for a pixmap is said to be in XY format if it is organized as
+a set of bitmaps representing individual bit planes with the planes
+appearing from most-significant to least-significant bit order.
+    </para>
+  </glossdef>
+</glossentry>
+<glossentry id="glossary:Z_format">
+  <glossterm>Z format</glossterm>
+<indexterm significance="preferred"><primary>Z format</primary></indexterm>
+  <glossdef>
+    <para>
+The data for a pixmap is said to be in Z format if it is organized as
+a set of pixel values in scanline order.
+    </para>
+  </glossdef>
+</glossentry>
+
+<bibliography>
+<title>References</title>
+<biblioentry>
+<title>Draft Proposed Multibyte Extension of ANSI C, Draft 1.1</title>
+<date>November 30, 1989 SC22/C WG/SWG IPSJ/ITSCJ Japan</date>
+</biblioentry>
+
+<biblioentry>
+<title>ISO2022: Information processing - ISO 7-bit and 8-bit coded character
+sets - Code extension techniques.</title>
+</biblioentry>
+
+<biblioentry>
+<title>ISO8859-1: Information processing - 8-bit single-byte coded graphic
+character sets - Part 1: Latin alphabet No. 1.</title>
+</biblioentry>
+
+<biblioentry>
+<title><acronym>POSIX</acronym>: Information Technology - Portable Operating System Interface (<acronym>POSIX</acronym>) -
+Part 1: System Application Program Interface (API) [C Language],
+ISO/IEC 9945-1.</title>
+</biblioentry>
+
+<biblioentry>
+<title>Text of ISO/IEC/DIS 9541-1, Information Processing - Font Information
+Interchange - Part 1:  Architecture.</title>
+</biblioentry>
+
+<biblioentry>
+<title>X/Open Portability Guide, Issue 3, December 1988 (XPG3), X/Open Company,
+Ltd, Prentice-Hall, Inc. 1989. ISBN 0-13-685835-8.
+(See especially Volume 3:  XSI Supplementary Definitions.)</title>
+</biblioentry>
+</bibliography>
+
+</glossary>
diff --git a/specs/libX11/libX11.xml b/specs/libX11/libX11.xml
new file mode 100644 (file)
index 0000000..4fb0575
--- /dev/null
@@ -0,0 +1,142 @@
+<?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="libX11" lang="en">
+
+<bookinfo>
+   <title>Xlib - C Language X Interface</title>
+   <subtitle>X Consortium Standard</subtitle>
+   <releaseinfo>X Version 11, Release &fullrelvers;</releaseinfo>
+   <authorgroup>
+      <author>
+         <firstname>James</firstname><surname>Gettys</surname>
+         <affiliation>
+          <orgname>Digital Equipment Corporation</orgname>
+          <orgdiv>Cambridge Research Laboratory</orgdiv>
+        </affiliation>
+      </author>
+      <author>
+         <firstname>Robert</firstname><othername role='mi'>W.</othername> <surname>Scheifler</surname>
+         <affiliation>
+          <orgname>Massachusetts Institute of Technology</orgname>
+          <orgdiv>Laboratory for Computer Science</orgdiv>
+        </affiliation>
+      </author>
+      <othercredit>
+         <firstname>Chuck</firstname><surname>Adams</surname>
+         <affiliation><orgname>Tektronix, Inc.</orgname></affiliation>
+      </othercredit>
+      <othercredit>
+         <firstname>Vania</firstname><surname>Joloboff</surname>
+         <affiliation><orgname>Open Software Foundation</orgname></affiliation>
+      </othercredit>
+      <othercredit>
+         <firstname>Hideki</firstname><surname>Hiura</surname>
+         <affiliation><orgname>Sun Microsystems, Inc.</orgname></affiliation>
+      </othercredit>
+      <othercredit>
+         <firstname>Bill</firstname><surname>McMahon</surname>
+         <affiliation><orgname>Hewlett-Packard Company</orgname></affiliation>
+      </othercredit>
+      <othercredit>
+         <firstname>Ron</firstname><surname>Newman</surname>
+         <affiliation><orgname>Massachusetts Institute of Technology</orgname></affiliation>
+      </othercredit>
+      <othercredit>
+         <firstname>Al</firstname><surname>Tabayoyon</surname>
+         <affiliation><orgname>Tektronix, Inc.</orgname></affiliation>
+      </othercredit>
+      <othercredit>
+         <firstname>Glenn</firstname><surname>Widener</surname>
+         <affiliation><orgname>Tektronix, Inc.</orgname></affiliation>
+      </othercredit>
+      <othercredit>
+         <firstname>Shigeru</firstname><surname>Yamada</surname>
+         <affiliation><orgname>Fujitsu OSSI</orgname></affiliation>
+      </othercredit>
+   </authorgroup>
+   <copyright><year>1985</year><year>1986</year><year>1987</year>
+     <year>1988</year><year>1989</year><year>1991</year><year>1994</year>
+     <year>1996</year><year>2002</year><holder>The Open Group</holder>
+   </copyright>
+
+<legalnotice>
+<para>
+Permission is hereby granted, free of charge, to any person obtaining a copy 
+of this software and associated documentation files 
+(the &ldquo;Software&rdquo;), 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 &ldquo;AS IS&rdquo;, WITHOUT WARRANTY OF ANY KIND, 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.
+</para>
+<para>
+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.
+</para>
+</legalnotice>
+
+<legalnotice>
+<para role="multiLicensing">Copyright © 1985, 1986, 1987, 1988, 1989, 1991 Digital Equipment Corporation</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 names of
+Digital and Tetronix not be used in in advertising or publicity pertaining
+to distribution of the software without specific, written prior permission.
+Digital and Tetronix make no representations about the suitability of the
+software described herein for any purpose.
+It is provided &ldquo;as is&rdquo; without express or implied warranty.
+</para>
+
+
+<para>TekHVC is a trademark of Tektronix, Inc.</para>
+
+</legalnotice>
+</bookinfo>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="credits.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="CH14.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="CH15.xml"/>
+<xi:include xmlns:xi="http://www.w3.org/2001/XInclude"  href="CH16.xml"/>
+<!--  runs out of mem at here -->
+<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="glossary.xml"/>
+<index />
+</book>
+
diff --git a/src/AllCells.c b/src/AllCells.c
new file mode 100644 (file)
index 0000000..ddd9c22
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+Status XAllocColorCells(
+    register Display *dpy,
+    Colormap cmap,
+    Bool contig,
+    unsigned long *masks, /* LISTofCARD32 */ /* RETURN */
+    unsigned int nplanes, /* CARD16 */
+    unsigned long *pixels, /* LISTofCARD32 */ /* RETURN */
+    unsigned int ncolors) /* CARD16 */
+{
+
+    Status status;
+    xAllocColorCellsReply rep;
+    register xAllocColorCellsReq *req;
+    LockDisplay(dpy);
+    GetReq(AllocColorCells, req);
+
+    req->cmap = cmap;
+    req->colors = ncolors;
+    req->planes = nplanes;
+    req->contiguous = contig;
+
+    status = _XReply(dpy, (xReply *)&rep, 0, xFalse);
+
+    if (status) {
+       _XRead32 (dpy, (long *) pixels, 4L * (long) (rep.nPixels));
+       _XRead32 (dpy, (long *) masks, 4L * (long) (rep.nMasks));
+    }
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return(status);
+}
diff --git a/src/AllPlanes.c b/src/AllPlanes.c
new file mode 100644 (file)
index 0000000..b2e2453
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+Status XAllocColorPlanes(
+    register Display *dpy,
+    Colormap cmap,
+    Bool contig,
+    unsigned long *pixels, /* LISTofCARD32 */ /* RETURN */
+    int ncolors,
+    int nreds,
+    int ngreens,
+    int nblues,
+    unsigned long *rmask,
+    unsigned long *gmask,
+    unsigned long *bmask) /* CARD32 */ /* RETURN */
+{
+    xAllocColorPlanesReply rep;
+    Status status;
+    register xAllocColorPlanesReq *req;
+
+    LockDisplay(dpy);
+    GetReq(AllocColorPlanes,req);
+
+    req->cmap = cmap;
+    req->colors = ncolors;
+    req->red = nreds;
+    req->green = ngreens;
+    req->blue = nblues;
+    req->contiguous = contig;
+
+    status = _XReply(dpy, (xReply *)&rep, 0, xFalse);
+
+
+    if (status) {
+       *rmask = rep.redMask;
+       *gmask = rep.greenMask;
+       *bmask = rep.blueMask;
+
+       /* sizeof(CARD32) = 4 */
+       _XRead32 (dpy, (long *) pixels, (long)(ncolors * 4));
+    }
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return(status);
+}
diff --git a/src/AllowEv.c b/src/AllowEv.c
new file mode 100644 (file)
index 0000000..4a17e7b
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XAllowEvents(
+    register Display *dpy,
+    int mode,
+    Time time)
+
+{
+    register xAllowEventsReq *req;
+
+    LockDisplay(dpy);
+    GetReq(AllowEvents,req);
+    req->mode = mode;
+    req->time = time;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
+
+
diff --git a/src/AutoRep.c b/src/AutoRep.c
new file mode 100644 (file)
index 0000000..66b4097
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+
+Copyright 1985, 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 "Xlibint.h"
+
+int
+XAutoRepeatOn (register Display *dpy)
+{
+       XKeyboardControl values;
+       values.auto_repeat_mode = AutoRepeatModeOn;
+       XChangeKeyboardControl (dpy, KBAutoRepeatMode, &values);
+       return 1;
+}
+
+int
+XAutoRepeatOff (register Display *dpy)
+{
+       XKeyboardControl values;
+       values.auto_repeat_mode = AutoRepeatModeOff;
+       XChangeKeyboardControl (dpy, KBAutoRepeatMode, &values);
+       return 1;
+}
+
+
diff --git a/src/Backgnd.c b/src/Backgnd.c
new file mode 100644 (file)
index 0000000..bf7d75f
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XSetWindowBackground(
+    register Display *dpy,
+    Window w,
+    unsigned long pixel)
+{
+    register xChangeWindowAttributesReq *req;
+
+    LockDisplay(dpy);
+    GetReqExtra (ChangeWindowAttributes, 4, req);
+    req->window = w;
+    req->valueMask = CWBackPixel;
+    OneDataCard32 (dpy, NEXTPTR(req,xChangeWindowAttributesReq), pixel);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/BdrWidth.c b/src/BdrWidth.c
new file mode 100644 (file)
index 0000000..5da8ce7
--- /dev/null
@@ -0,0 +1,53 @@
+
+/*
+
+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 "Xlibint.h"
+
+int
+XSetWindowBorderWidth(
+    Display *dpy,
+    Window w,
+    unsigned int width)
+{
+    unsigned long lwidth = width;      /* must be CARD32 */
+
+    register xConfigureWindowReq *req;
+    LockDisplay(dpy);
+    GetReqExtra(ConfigureWindow, 4, req);
+    req->window = w;
+    req->mask = CWBorderWidth;
+    OneDataCard32 (dpy, NEXTPTR(req,xConfigureWindowReq), lwidth);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/Bell.c b/src/Bell.c
new file mode 100644 (file)
index 0000000..7da8772
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XBell(
+    register Display *dpy,
+    int percent)
+{
+    register xBellReq *req;
+
+    LockDisplay(dpy);
+    GetReq(Bell,req);
+    req->percent = percent;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/Border.c b/src/Border.c
new file mode 100644 (file)
index 0000000..133043a
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XSetWindowBorder(
+    register Display *dpy,
+    Window w,
+    unsigned long pixel)
+{
+    register xChangeWindowAttributesReq *req;
+
+    LockDisplay(dpy);
+    GetReqExtra (ChangeWindowAttributes, 4, req);
+    req->window = w;
+    req->valueMask = CWBorderPixel;
+    OneDataCard32 (dpy, NEXTPTR(req,xChangeWindowAttributesReq), pixel);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/ChAccCon.c b/src/ChAccCon.c
new file mode 100644 (file)
index 0000000..f8d0996
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XEnableAccessControl(register Display *dpy)
+{
+    return XSetAccessControl(dpy, EnableAccess);
+}
+
+int
+XDisableAccessControl(register Display *dpy)
+{
+    return XSetAccessControl(dpy, DisableAccess);
+}
+
+int
+XSetAccessControl(
+    register Display *dpy,
+    int mode)
+
+{
+    register xSetAccessControlReq *req;
+
+    LockDisplay(dpy);
+    GetReq(SetAccessControl, req);
+    req->mode = mode;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/ChActPGb.c b/src/ChActPGb.c
new file mode 100644 (file)
index 0000000..bebef2b
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XChangeActivePointerGrab(
+    register Display *dpy,
+    unsigned int event_mask, /* CARD16 */
+    Cursor curs,
+    Time time)
+{
+    register xChangeActivePointerGrabReq *req;
+
+    LockDisplay(dpy);
+    GetReq(ChangeActivePointerGrab, req);
+    req->eventMask = event_mask;
+    req->cursor = curs;
+    req->time = time;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/ChClMode.c b/src/ChClMode.c
new file mode 100644 (file)
index 0000000..5250a80
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XSetCloseDownMode(
+    register Display *dpy,
+    int mode)
+{
+    register xSetCloseDownModeReq *req;
+
+    LockDisplay(dpy);
+    GetReq(SetCloseDownMode, req);
+    req->mode = mode;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/ChCmap.c b/src/ChCmap.c
new file mode 100644 (file)
index 0000000..d9372cd
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XSetWindowColormap(
+    register Display *dpy,
+    Window w,
+    Colormap colormap)
+{
+    register xChangeWindowAttributesReq *req;
+
+    LockDisplay(dpy);
+    GetReqExtra (ChangeWindowAttributes, 4, req);
+    req->window = w;
+    req->valueMask = CWColormap;
+    OneDataCard32 (dpy, NEXTPTR(req,xChangeWindowAttributesReq), colormap);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/ChGC.c b/src/ChGC.c
new file mode 100644 (file)
index 0000000..8f677dc
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+#include "Cr.h"
+
+int
+XChangeGC (
+    register Display *dpy,
+    GC gc,
+    unsigned long valuemask,
+    XGCValues *values)
+{
+    LockDisplay(dpy);
+
+    valuemask &= (1L << (GCLastBit + 1)) - 1;
+    if (valuemask) _XUpdateGCCache (gc, valuemask, values);
+
+    /* if any Resource ID changed, must flush */
+    if (gc->dirty & (GCFont | GCTile | GCStipple))
+       _XFlushGCCache(dpy, gc);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/ChKeyCon.c b/src/ChKeyCon.c
new file mode 100644 (file)
index 0000000..bcf5223
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XChangeKeyboardControl(
+    register Display *dpy,
+    unsigned long mask,
+    XKeyboardControl *value_list)
+{
+    unsigned long values[8];
+    register unsigned long *value = values;
+    long nvalues;
+    register xChangeKeyboardControlReq *req;
+
+    LockDisplay(dpy);
+    GetReq(ChangeKeyboardControl, req);
+    req->mask = mask;
+
+    if (mask & KBKeyClickPercent)
+       *value++ = value_list->key_click_percent;
+
+    if (mask & KBBellPercent)
+       *value++ = value_list->bell_percent;
+
+    if (mask & KBBellPitch)
+       *value++ = value_list->bell_pitch;
+
+    if (mask & KBBellDuration)
+       *value++ = value_list->bell_duration;
+
+    if (mask & KBLed)
+       *value++ = value_list->led;
+
+    if (mask & KBLedMode)
+       *value++ = value_list->led_mode;
+
+    if (mask & KBKey)
+        *value++ = value_list->key;
+
+    if (mask & KBAutoRepeatMode)
+        *value++ = value_list->auto_repeat_mode;
+
+
+    req->length += (nvalues = value - values);
+
+    /* note: Data is a macro that uses its arguments multiple
+       times, so "nvalues" is changed in a separate assignment
+       statement */
+
+    nvalues <<= 2;
+    Data32 (dpy, (long *) values, nvalues);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+    }
diff --git a/src/ChPntCon.c b/src/ChPntCon.c
new file mode 100644 (file)
index 0000000..c177c00
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XChangePointerControl(
+     register Display *dpy,
+     Bool do_acc,
+     Bool do_thresh,
+     int acc_numerator,
+     int acc_denominator,
+     int threshold)
+
+{
+    register xChangePointerControlReq *req;
+
+    LockDisplay(dpy);
+    GetReq(ChangePointerControl, req);
+    req->doAccel = do_acc;
+    req->doThresh = do_thresh;
+    req->accelNum = acc_numerator;
+    req->accelDenum = acc_denominator;
+    req->threshold = threshold;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/ChProp.c b/src/ChProp.c
new file mode 100644 (file)
index 0000000..b957751
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XChangeProperty (
+    register Display *dpy,
+    Window w,
+    Atom property,
+    Atom type,
+    int format,  /* 8, 16, or 32 */
+    int mode,  /* PropModeReplace, PropModePrepend, PropModeAppend */
+    _Xconst unsigned char *data,
+    int nelements)
+    {
+    register xChangePropertyReq *req;
+    register long len;
+
+    LockDisplay(dpy);
+    GetReq (ChangeProperty, req);
+    req->window = w;
+    req->property = property;
+    req->type = type;
+    req->mode = mode;
+    if (nelements < 0) {
+       req->nUnits = 0;
+       req->format = 0; /* ask for garbage, get garbage */
+    } else {
+       req->nUnits = nelements;
+       req->format = format;
+    }
+
+    switch (req->format) {
+      case 8:
+       len = ((long)nelements + 3)>>2;
+       if (dpy->bigreq_size || req->length + len <= (unsigned) 65535) {
+           SetReqLen(req, len, len);
+           Data (dpy, (char *)data, nelements);
+       } /* else force BadLength */
+        break;
+
+      case 16:
+       len = ((long)nelements + 1)>>1;
+       if (dpy->bigreq_size || req->length + len <= (unsigned) 65535) {
+           SetReqLen(req, len, len);
+           len = (long)nelements << 1;
+           Data16 (dpy, (short *) data, len);
+       } /* else force BadLength */
+       break;
+
+      case 32:
+       len = nelements;
+       if (dpy->bigreq_size || req->length + len <= (unsigned) 65535) {
+           SetReqLen(req, len, len);
+           len = (long)nelements << 2;
+           Data32 (dpy, (long *) data, len);
+       } /* else force BadLength */
+       break;
+
+      default:
+        /* BadValue will be generated */ ;
+      }
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+    }
+
+
+
+
+
diff --git a/src/ChSaveSet.c b/src/ChSaveSet.c
new file mode 100644 (file)
index 0000000..068b042
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XChangeSaveSet(
+    register Display *dpy,
+    Window win,
+    int mode)
+{
+    register xChangeSaveSetReq *req;
+
+    LockDisplay(dpy);
+    GetReq(ChangeSaveSet, req);
+    req->window = win;
+    req->mode = mode;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
+int
+XAddToSaveSet(
+    register Display *dpy,
+    Window win)
+{
+    return XChangeSaveSet(dpy,win,SetModeInsert);
+}
+
+int
+XRemoveFromSaveSet (
+    register Display *dpy,
+    Window win)
+{
+    return XChangeSaveSet(dpy,win,SetModeDelete);
+}
diff --git a/src/ChWAttrs.c b/src/ChWAttrs.c
new file mode 100644 (file)
index 0000000..25cbcbd
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+#define AllMaskBits (CWBackPixmap|CWBackPixel|CWBorderPixmap|\
+                    CWBorderPixel|CWBitGravity|CWWinGravity|\
+                    CWBackingStore|CWBackingPlanes|CWBackingPixel|\
+                    CWOverrideRedirect|CWSaveUnder|CWEventMask|\
+                    CWDontPropagate|CWColormap|CWCursor)
+
+int
+XChangeWindowAttributes (
+    register Display *dpy,
+    Window w,
+    unsigned long valuemask,
+    XSetWindowAttributes *attributes)
+{
+    register xChangeWindowAttributesReq *req;
+
+    LockDisplay(dpy);
+    GetReq(ChangeWindowAttributes,req);
+    req->window = w;
+    valuemask &= AllMaskBits;
+    if ((req->valueMask = valuemask))
+        _XProcessWindowAttributes (dpy, req, valuemask, attributes);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/ChWindow.c b/src/ChWindow.c
new file mode 100644 (file)
index 0000000..fbd6e88
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XResizeWindow(
+    register Display *dpy,
+    Window w,
+    unsigned int width,
+    unsigned int height)
+{
+    register xConfigureWindowReq *req;
+
+    LockDisplay(dpy);
+    GetReqExtra(ConfigureWindow, 8, req); /* 2 4-byte quantities */
+
+    req->window = w;
+    req->mask = CWWidth | CWHeight;
+#ifdef MUSTCOPY
+    {
+       unsigned long lwidth = width, lheight = height;
+    dpy->bufptr -= 8;
+    Data32 (dpy, (long *) &lwidth, 4); /* order dictated by values of */
+    Data32 (dpy, (long *) &lheight, 4);        /* CWWidth and CWHeight */
+    }
+#else
+    {
+       CARD32 *valuePtr = (CARD32 *) NEXTPTR(req,xConfigureWindowReq);
+       *valuePtr++ = width;
+       *valuePtr = height;
+    }
+#endif /* MUSTCOPY */
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/ChkIfEv.c b/src/ChkIfEv.c
new file mode 100644 (file)
index 0000000..876a850
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+
+Copyright 1985, 1987, 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 "Xlibint.h"
+
+/*
+ * Check existing events in queue to find if any match.  If so, return.
+ * If not, flush buffer and see if any more events are readable. If one
+ * matches, return.  If all else fails, tell the user no events found.
+ */
+
+Bool XCheckIfEvent (
+       register Display *dpy,
+       register XEvent *event,         /* XEvent to be filled in. */
+       Bool (*predicate)(
+                         Display*                      /* display */,
+                         XEvent*                       /* event */,
+                         char*                         /* arg */
+                         ),            /* function to call */
+       char *arg)
+{
+       register _XQEvent *prev, *qelt;
+       unsigned long qe_serial = 0;
+       int n;                  /* time through count */
+
+        LockDisplay(dpy);
+       prev = NULL;
+       for (n = 3; --n >= 0;) {
+           for (qelt = prev ? prev->next : dpy->head;
+                qelt;
+                prev = qelt, qelt = qelt->next) {
+               if(qelt->qserial_num > qe_serial
+                  && (*predicate)(dpy, &qelt->event, arg)) {
+                   *event = qelt->event;
+                   _XDeq(dpy, prev, qelt);
+                   _XStoreEventCookie(dpy, event);
+                   UnlockDisplay(dpy);
+                   return True;
+               }
+           }
+           if (prev)
+               qe_serial = prev->qserial_num;
+           switch (n) {
+             case 2:
+               _XEventsQueued(dpy, QueuedAfterReading);
+               break;
+             case 1:
+               _XFlush(dpy);
+               break;
+           }
+           if (prev && prev->qserial_num != qe_serial)
+               /* another thread has snatched this event */
+               prev = NULL;
+       }
+       UnlockDisplay(dpy);
+       return False;
+}
diff --git a/src/ChkMaskEv.c b/src/ChkMaskEv.c
new file mode 100644 (file)
index 0000000..78928e0
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+
+Copyright 1985, 1987, 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 "Xlibint.h"
+
+extern long const _Xevent_to_mask[];
+
+#define AllPointers (PointerMotionMask|PointerMotionHintMask|ButtonMotionMask)
+#define AllButtons (Button1MotionMask|Button2MotionMask|Button3MotionMask|\
+                   Button4MotionMask|Button5MotionMask)
+
+/*
+ * Check existing events in queue to find if any match.  If so, return.
+ * If not, flush buffer and see if any more events are readable. If one
+ * matches, return.  If all else fails, tell the user no events found.
+ */
+
+Bool XCheckMaskEvent (
+       register Display *dpy,
+       long mask,              /* Selected event mask. */
+       register XEvent *event) /* XEvent to be filled in. */
+{
+       register _XQEvent *prev, *qelt;
+       unsigned long qe_serial = 0;
+       int n;                  /* time through count */
+
+        LockDisplay(dpy);
+
+       /* Delete unclaimed cookies */
+       _XFreeEventCookies(dpy);
+
+       prev = NULL;
+       for (n = 3; --n >= 0;) {
+           for (qelt = prev ? prev->next : dpy->head;
+                qelt;
+                prev = qelt, qelt = qelt->next) {
+               if ((qelt->event.type < GenericEvent) &&
+                   (_Xevent_to_mask[qelt->event.type] & mask) &&
+                   ((qelt->event.type != MotionNotify) ||
+                    (mask & AllPointers) ||
+                    (mask & AllButtons & qelt->event.xmotion.state))) {
+                   *event = qelt->event;
+                   _XDeq(dpy, prev, qelt);
+                   UnlockDisplay(dpy);
+                   return True;
+               }
+           }
+           if (prev)
+               qe_serial = prev->qserial_num;
+           switch (n) {
+             case 2:
+               _XEventsQueued(dpy, QueuedAfterReading);
+               break;
+             case 1:
+               _XFlush(dpy);
+               break;
+           }
+           if (prev && prev->qserial_num != qe_serial)
+               /* another thread has snatched this event */
+               prev = NULL;
+       }
+       UnlockDisplay(dpy);
+       return False;
+}
diff --git a/src/ChkTypEv.c b/src/ChkTypEv.c
new file mode 100644 (file)
index 0000000..2e9bcdd
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+
+Copyright 1985, 1987, 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 "Xlibint.h"
+
+/*
+ * Check existing events in queue to find if any match.  If so, return.
+ * If not, flush buffer and see if any more events are readable. If one
+ * matches, return.  If all else fails, tell the user no events found.
+ */
+
+Bool XCheckTypedEvent (
+       register Display *dpy,
+       int type,               /* Selected event type. */
+       register XEvent *event) /* XEvent to be filled in. */
+{
+       register _XQEvent *prev, *qelt;
+       unsigned long qe_serial = 0;
+       int n;                  /* time through count */
+
+        LockDisplay(dpy);
+
+       /* Delete unclaimed cookies */
+       _XFreeEventCookies(dpy);
+
+       prev = NULL;
+       for (n = 3; --n >= 0;) {
+           for (qelt = prev ? prev->next : dpy->head;
+                qelt;
+                prev = qelt, qelt = qelt->next) {
+               if (qelt->event.type == type) {
+                   *event = qelt->event;
+                   _XDeq(dpy, prev, qelt);
+                   _XStoreEventCookie(dpy, event);
+                   UnlockDisplay(dpy);
+                   return True;
+               }
+           }
+           if (prev)
+               qe_serial = prev->qserial_num;
+           switch (n) {
+             case 2:
+               _XEventsQueued(dpy, QueuedAfterReading);
+               break;
+             case 1:
+               _XFlush(dpy);
+               break;
+           }
+           if (prev && prev->qserial_num != qe_serial)
+               /* another thread has snatched this event */
+               prev = NULL;
+       }
+       UnlockDisplay(dpy);
+       return False;
+}
diff --git a/src/ChkTypWEv.c b/src/ChkTypWEv.c
new file mode 100644 (file)
index 0000000..2f247be
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+
+Copyright 1985, 1987, 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 "Xlibint.h"
+
+/*
+ * Check existing events in queue to find if any match.  If so, return.
+ * If not, flush buffer and see if any more events are readable. If one
+ * matches, return.  If all else fails, tell the user no events found.
+ */
+
+Bool XCheckTypedWindowEvent (
+       register Display *dpy,
+       Window w,               /* Selected window. */
+       int type,               /* Selected event type. */
+       register XEvent *event) /* XEvent to be filled in. */
+{
+       register _XQEvent *prev, *qelt;
+       unsigned long qe_serial = 0;
+       int n;                  /* time through count */
+
+        LockDisplay(dpy);
+
+       /* Delete unclaimed cookies */
+       _XFreeEventCookies(dpy);
+
+       prev = NULL;
+       for (n = 3; --n >= 0;) {
+           for (qelt = prev ? prev->next : dpy->head;
+                qelt;
+                prev = qelt, qelt = qelt->next) {
+               if ((qelt->event.xany.window == w) &&
+                   (qelt->event.type == type)) {
+                   *event = qelt->event;
+                   _XDeq(dpy, prev, qelt);
+                   _XStoreEventCookie(dpy, event);
+                   UnlockDisplay(dpy);
+                   return True;
+               }
+           }
+           if (prev)
+               qe_serial = prev->qserial_num;
+           switch (n) {
+             case 2:
+               _XEventsQueued(dpy, QueuedAfterReading);
+               break;
+             case 1:
+               _XFlush(dpy);
+               break;
+           }
+           if (prev && prev->qserial_num != qe_serial)
+               /* another thread has snatched this event */
+               prev = NULL;
+       }
+       UnlockDisplay(dpy);
+       return False;
+}
diff --git a/src/ChkWinEv.c b/src/ChkWinEv.c
new file mode 100644 (file)
index 0000000..9fb7db0
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+
+Copyright 1985, 1987, 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 "Xlibint.h"
+
+extern long const _Xevent_to_mask[];
+#define AllPointers (PointerMotionMask|PointerMotionHintMask|ButtonMotionMask)
+#define AllButtons (Button1MotionMask|Button2MotionMask|Button3MotionMask|\
+                   Button4MotionMask|Button5MotionMask)
+
+/*
+ * Check existing events in queue to find if any match.  If so, return.
+ * If not, flush buffer and see if any more events are readable. If one
+ * matches, return.  If all else fails, tell the user no events found.
+ */
+
+Bool XCheckWindowEvent (
+       register Display *dpy,
+       Window w,               /* Selected window. */
+       long mask,              /* Selected event mask. */
+       register XEvent *event) /* XEvent to be filled in. */
+{
+       register _XQEvent *prev, *qelt;
+       unsigned long qe_serial = 0;
+       int n;                  /* time through count */
+
+        LockDisplay(dpy);
+
+       /* Delete unclaimed cookies */
+       _XFreeEventCookies(dpy);
+
+       prev = NULL;
+       for (n = 3; --n >= 0;) {
+           for (qelt = prev ? prev->next : dpy->head;
+                qelt;
+                prev = qelt, qelt = qelt->next) {
+               if ((qelt->event.xany.window == w) &&
+                   (qelt->event.type < GenericEvent) &&
+                   (_Xevent_to_mask[qelt->event.type] & mask) &&
+                   ((qelt->event.type != MotionNotify) ||
+                    (mask & AllPointers) ||
+                    (mask & AllButtons & qelt->event.xmotion.state))) {
+                   *event = qelt->event;
+                   _XDeq(dpy, prev, qelt);
+                   UnlockDisplay(dpy);
+                   return True;
+               }
+           }
+           if (prev)
+               qe_serial = prev->qserial_num;
+           switch (n) {
+             case 2:
+               _XEventsQueued(dpy, QueuedAfterReading);
+               break;
+             case 1:
+               _XFlush(dpy);
+               break;
+           }
+           if (prev && prev->qserial_num != qe_serial)
+               /* another thread has snatched this event */
+               prev = NULL;
+       }
+       UnlockDisplay(dpy);
+       return False;
+}
diff --git a/src/CirWin.c b/src/CirWin.c
new file mode 100644 (file)
index 0000000..e37a42a
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XCirculateSubwindows(
+    register Display *dpy,
+    Window w,
+    int direction)
+{
+    register xCirculateWindowReq *req;
+
+    LockDisplay(dpy);
+    GetReq(CirculateWindow, req);
+    req->window = w;
+    req->direction = direction;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/CirWinDn.c b/src/CirWinDn.c
new file mode 100644 (file)
index 0000000..f2b5485
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XCirculateSubwindowsDown(
+    register Display *dpy,
+    Window w)
+{
+    register xCirculateWindowReq *req;
+
+    LockDisplay(dpy);
+    GetReq(CirculateWindow, req);
+    req->window = w;
+    req->direction = LowerHighest;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/CirWinUp.c b/src/CirWinUp.c
new file mode 100644 (file)
index 0000000..be9f094
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XCirculateSubwindowsUp(
+    register Display *dpy,
+    Window w)
+{
+    register xCirculateWindowReq *req;
+
+    LockDisplay(dpy);
+    GetReq(CirculateWindow, req);
+    req->window = w;
+    req->direction = RaiseLowest;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/ClDisplay.c b/src/ClDisplay.c
new file mode 100644 (file)
index 0000000..bddd773
--- /dev/null
@@ -0,0 +1,74 @@
+
+/*
+
+Copyright 1985, 1990, 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 "Xxcbint.h"
+#include "Xlib.h"
+#include "Xlibint.h"
+#include "Xintconn.h"
+
+/*
+ * XCloseDisplay - XSync the connection to the X Server, close the connection,
+ * and free all associated storage.  Extension close procs should only free
+ * memory and must be careful about the types of requests they generate.
+ */
+
+int
+XCloseDisplay (
+       register Display *dpy)
+{
+       register _XExtension *ext;
+       register int i;
+
+       if (!(dpy->flags & XlibDisplayClosing))
+       {
+           dpy->flags |= XlibDisplayClosing;
+           for (i = 0; i < dpy->nscreens; i++) {
+                   register Screen *sp = &dpy->screens[i];
+                   XFreeGC (dpy, sp->default_gc);
+           }
+           if (dpy->cursor_font != None) {
+               XUnloadFont (dpy, dpy->cursor_font);
+           }
+           XSync(dpy, 1);  /* throw away pending events, catch errors */
+           /* call out to any extensions interested */
+           for (ext = dpy->ext_procs; ext; ext = ext->next) {
+               if (ext->close_display)
+                   (*ext->close_display)(dpy, &ext->codes);
+           }
+           /* if the closes generated more protocol, sync them up */
+           if (dpy->request != dpy->last_request_read)
+               XSync(dpy, 1);
+       }
+       xcb_disconnect(dpy->xcb->connection);
+       _XFreeDisplayStructure (dpy);
+       return 0;
+}
diff --git a/src/Clear.c b/src/Clear.c
new file mode 100644 (file)
index 0000000..63dc640
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XClearWindow(
+    register Display *dpy,
+    Window w)
+{
+    register xClearAreaReq *req;
+
+    LockDisplay(dpy);
+    GetReq(ClearArea, req);
+    req->window = w;
+    req->x = req->y = req->width = req->height = 0;
+        /* these values mean "clear the entire window" */
+    req->exposures = xFalse;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/ClearArea.c b/src/ClearArea.c
new file mode 100644 (file)
index 0000000..41fd17c
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XClearArea (
+    register Display *dpy,
+    Window w,
+    int x,
+    int y,
+    unsigned int width,
+    unsigned int height,
+    Bool exposures)
+{
+    register xClearAreaReq *req;
+
+    LockDisplay(dpy);
+    GetReq(ClearArea, req);
+    req->window = w;
+    req->x = x;
+    req->y = y;
+    req->width = width;
+    req->height = height;
+    req->exposures = exposures;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/Cmap.h b/src/Cmap.h
new file mode 100644 (file)
index 0000000..062b538
--- /dev/null
@@ -0,0 +1,10 @@
+
+#ifndef _CMAP_H_
+#define _CMAP_H_
+
+extern void
+_XcmsDeleteCmapRec(
+    Display *dpy,
+    Colormap cmap);
+
+#endif /* _CMAP_H_ */
diff --git a/src/ConfWind.c b/src/ConfWind.c
new file mode 100644 (file)
index 0000000..dd55b44
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XMoveResizeWindow(
+    register Display *dpy,
+    Window w,
+    int x,
+    int y,
+    unsigned int width,
+    unsigned int height)
+{
+    register xConfigureWindowReq *req;
+
+    LockDisplay(dpy);
+    GetReqExtra(ConfigureWindow, 16, req);
+    req->window = w;
+    req->mask = CWX | CWY | CWWidth | CWHeight;
+#ifdef MUSTCOPY
+    {
+       long lx = x, ly = y;
+       unsigned long lwidth = width, lheight = height;
+
+       dpy->bufptr -= 16;
+       Data32 (dpy, (long *) &lx, 4);  /* order must match values of */
+       Data32 (dpy, (long *) &ly, 4);  /* CWX, CWY, CWWidth, and CWHeight */
+       Data32 (dpy, (long *) &lwidth, 4);
+       Data32 (dpy, (long *) &lheight, 4);
+    }
+#else
+    {
+       register CARD32 *valuePtr =
+         (CARD32 *) NEXTPTR(req,xConfigureWindowReq);
+       *valuePtr++ = x;
+       *valuePtr++ = y;
+       *valuePtr++ = width;
+       *valuePtr   = height;
+    }
+#endif /* MUSTCOPY */
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/Context.c b/src/Context.c
new file mode 100644 (file)
index 0000000..79ae7d6
--- /dev/null
@@ -0,0 +1,302 @@
+
+/***********************************************************
+Copyright 1987, 1988, 1990 by Digital Equipment Corporation, Maynard,
+
+                        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, 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.
+
+*/
+
+/* This module implements a simple sparse array.
+
+   XSaveContext(a,b,c,d) will store d in position (a,b,c) of the array.
+   XFindContext(a,b,c,&d) will set d to be the value in position (a,b,c).
+   XDeleteContext(a,b,c) will delete the entry in (a,b,c).
+
+   a is a display id, b is a resource id, and c is a Context.  d is just an
+   XPointer.  This code will work with any range of parameters, but is geared
+   to be most efficient with very few (one or two) different a's.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xutil.h"
+#ifdef XTHREADS
+#include "locking.h"
+#endif
+
+#define INITHASHMASK 63 /* Number of entries originally in the hash table. */
+
+typedef struct _TableEntryRec {        /* Stores one entry. */
+    XID                        rid;
+    XContext                   context;
+    XPointer                   data;
+    struct _TableEntryRec      *next;
+} TableEntryRec, *TableEntry;
+
+typedef struct _XContextDB {   /* Stores hash table for one display. */
+    TableEntry *table;         /* Pointer to array of hash entries. */
+    int mask;                  /* Current size of hash table minus 1. */
+    int numentries;            /* Number of entries currently in table. */
+#ifdef XTHREADS
+    LockInfoRec linfo;
+#endif
+} DBRec, *DB;
+
+#ifdef MOTIFBC
+static DB NullDB = (DB)0;
+#endif
+
+/* Given an XID and a context, returns a value between 0 and HashSize-1.
+   Currently, this requires that HashSize be a power of 2.
+*/
+
+#define Hash(db,rid,context) \
+    (db)->table[(((rid) << 1) + context) & (db)->mask]
+
+/* Resize the given db */
+
+static void ResizeTable(DB db)
+{
+    TableEntry *otable;
+    register TableEntry entry, next, *pold, *head;
+    register int i, j;
+
+    otable = db->table;
+    for (i = INITHASHMASK+1; (i + i) < db->numentries; )
+       i += i;
+    db->table = (TableEntry *) Xcalloc((unsigned)i, sizeof(TableEntry));
+    if (!db->table) {
+       db->table = otable;
+       return;
+    }
+    j = db->mask + 1;
+    db->mask = i - 1;
+    for (pold = otable ; --j >= 0; pold++) {
+       for (entry = *pold; entry; entry = next) {
+           next = entry->next;
+           head = &Hash(db, entry->rid, entry->context);
+           entry->next = *head;
+           *head = entry;
+       }
+    }
+    Xfree((char *) otable);
+}
+
+static void _XFreeContextDB(Display *display)
+{
+    register DB db;
+    register int i;
+    register TableEntry *pentry, entry, next;
+
+    db = display->context_db;
+    if (db) {
+       for (i = db->mask + 1, pentry = db->table ; --i >= 0; pentry++) {
+           for (entry = *pentry; entry; entry = next) {
+               next = entry->next;
+               Xfree((char *)entry);
+           }
+       }
+       Xfree((char *) db->table);
+       _XFreeMutex(&db->linfo);
+       Xfree((char *) db);
+    }
+}
+
+/* Public routines. */
+
+/* Save the given value of data to correspond with the keys XID and context.
+   Returns nonzero error code if an error has occured, 0 otherwise.
+   Possible errors are Out-of-memory.
+*/
+
+int XSaveContext(
+    Display *display,
+    register XID rid,
+    register XContext context,
+    _Xconst char* data)
+{
+    DB *pdb;
+    register DB db;
+    TableEntry *head;
+    register TableEntry entry;
+
+#ifdef MOTIFBC
+    if (!display) {
+       pdb = &NullDB;
+       db = *pdb;
+    } else
+#endif
+    {
+       LockDisplay(display);
+       pdb = &display->context_db;
+       db = *pdb;
+       UnlockDisplay(display);
+    }
+    if (!db) {
+       db = (DB) Xmalloc(sizeof(DBRec));
+       if (!db)
+           return XCNOMEM;
+       db->mask = INITHASHMASK;
+       db->table = (TableEntry *)Xcalloc(db->mask + 1, sizeof(TableEntry));
+       if (!db->table) {
+           Xfree((char *)db);
+           return XCNOMEM;
+       }
+       db->numentries = 0;
+       _XCreateMutex(&db->linfo);
+#ifdef MOTIFBC
+       if (!display) *pdb = db; else
+#endif
+       {
+           LockDisplay(display);
+           *pdb = db;
+           display->free_funcs->context_db = _XFreeContextDB;
+           UnlockDisplay(display);
+       }
+    }
+    _XLockMutex(&db->linfo);
+    head = &Hash(db, rid, context);
+    _XUnlockMutex(&db->linfo);
+    for (entry = *head; entry; entry = entry->next) {
+       if (entry->rid == rid && entry->context == context) {
+           entry->data = (XPointer)data;
+           return 0;
+       }
+    }
+    entry = (TableEntry) Xmalloc(sizeof(TableEntryRec));
+    if (!entry)
+       return XCNOMEM;
+    entry->rid = rid;
+    entry->context = context;
+    entry->data = (XPointer)data;
+    entry->next = *head;
+    *head = entry;
+    _XLockMutex(&db->linfo);
+    db->numentries++;
+    if (db->numentries > (db->mask << 2))
+       ResizeTable(db);
+    _XUnlockMutex(&db->linfo);
+    return 0;
+}
+
+
+
+/* Given an XID and context, returns the associated data.  Note that data
+   here is a pointer since it is a return value.  Returns nonzero error code
+   if an error has occured, 0 otherwise.  Possible errors are Entry-not-found.
+*/
+
+int XFindContext(Display *display, XID rid, XContext context, XPointer *data)
+{
+    register DB db;
+    register TableEntry entry;
+
+#ifdef MOTIFBC
+    if (!display) db = NullDB; else
+#endif
+    {
+       LockDisplay(display);
+       db = display->context_db;
+       UnlockDisplay(display);
+    }
+    if (!db)
+       return XCNOENT;
+    _XLockMutex(&db->linfo);
+    for (entry = Hash(db, rid, context); entry; entry = entry->next)
+    {
+       if (entry->rid == rid && entry->context == context) {
+           *data = (XPointer)entry->data;
+           _XUnlockMutex(&db->linfo);
+           return 0;
+       }
+    }
+    _XUnlockMutex(&db->linfo);
+    return XCNOENT;
+}
+
+
+
+/* Deletes the entry for the given XID and context from the datastructure.
+   This returns the same thing that FindContext would have returned if called
+   with the same arguments.
+*/
+
+int XDeleteContext(Display *display, XID rid, XContext context)
+{
+    register DB db;
+    register TableEntry entry, *prev;
+
+#ifdef MOTIFBC
+    if (!display) db = NullDB; else
+#endif
+    {
+       LockDisplay(display);
+       db = display->context_db;
+       UnlockDisplay(display);
+    }
+    if (!db)
+       return XCNOENT;
+    _XLockMutex(&db->linfo);
+    for (prev = &Hash(db, rid, context);
+        (entry = *prev);
+        prev = &entry->next) {
+       if (entry->rid == rid && entry->context == context) {
+           *prev = entry->next;
+           Xfree((char *) entry);
+           db->numentries--;
+           if (db->numentries < db->mask && db->mask > INITHASHMASK)
+               ResizeTable(db);
+           _XUnlockMutex(&db->linfo);
+           return 0;
+       }
+    }
+    _XUnlockMutex(&db->linfo);
+    return XCNOENT;
+}
diff --git a/src/ConvSel.c b/src/ConvSel.c
new file mode 100644 (file)
index 0000000..fb6e8e3
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+
+Copyright 1986,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 "Xlibint.h"
+
+int
+XConvertSelection(
+    register Display *dpy,
+    Atom selection,
+    Atom target,
+    Atom property,
+    Window requestor,
+    Time time)
+{
+    register xConvertSelectionReq *req;
+
+    LockDisplay(dpy);
+    GetReq(ConvertSelection, req);
+    req->selection = selection;
+    req->target = target;
+    req->property = property;
+    req->requestor = requestor;
+    req->time = time;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/CopyArea.c b/src/CopyArea.c
new file mode 100644 (file)
index 0000000..5825821
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XCopyArea(
+     register Display *dpy,
+     Drawable src_drawable,
+     Drawable dst_drawable,
+     GC gc,
+     int src_x,
+     int src_y,
+     unsigned int width,
+     unsigned int height,
+     int dst_x,
+     int dst_y)
+
+{
+    register xCopyAreaReq *req;
+
+    LockDisplay(dpy);
+    FlushGC(dpy, gc);
+    GetReq(CopyArea, req);
+    req->srcDrawable = src_drawable;
+    req->dstDrawable = dst_drawable;
+    req->gc = gc->gid;
+    req->srcX = src_x;
+    req->srcY = src_y;
+    req->dstX = dst_x;
+    req->dstY = dst_y;
+    req->width = width;
+    req->height = height;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/CopyCmap.c b/src/CopyCmap.c
new file mode 100644 (file)
index 0000000..5444550
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+
+Copyright 1986, 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>
+#else
+#define XCMS 1
+#endif
+#include "Xlibint.h"
+
+#if XCMS
+#include "Xcmsint.h"
+
+/* cmsCmap.c */
+extern XcmsCmapRec * _XcmsCopyCmapRecAndFree(Display *dpy,
+                                            Colormap src_cmap,
+                                            Colormap copy_cmap);
+#endif
+
+Colormap XCopyColormapAndFree(
+    register Display *dpy,
+    Colormap src_cmap)
+{
+    Colormap mid;
+    register xCopyColormapAndFreeReq *req;
+
+    LockDisplay(dpy);
+    GetReq(CopyColormapAndFree, req);
+
+    mid = req->mid = XAllocID(dpy);
+    req->srcCmap = src_cmap;
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+
+#if XCMS
+    _XcmsCopyCmapRecAndFree(dpy, src_cmap, mid);
+#endif
+
+    return(mid);
+}
diff --git a/src/CopyGC.c b/src/CopyGC.c
new file mode 100644 (file)
index 0000000..9c71249
--- /dev/null
@@ -0,0 +1,138 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XCopyGC (
+     register Display *dpy,
+     GC srcGC,
+     unsigned long mask,               /* which ones to set initially */
+     GC destGC)
+{
+    register XGCValues *destgv = &destGC->values,
+                      *srcgv = &srcGC->values;
+    register xCopyGCReq *req;
+    register _XExtension *ext;
+
+    LockDisplay(dpy);
+
+    mask &= (1L << (GCLastBit + 1)) - 1;
+    /* if some of the source values to be copied are "dirty", flush them
+       out before sending the CopyGC request. */
+    if (srcGC->dirty & mask)
+         _XFlushGCCache(dpy, srcGC);
+
+    /* mark the copied values "not dirty" in the destination. */
+    destGC->dirty &= ~mask;
+
+    GetReq(CopyGC, req);
+    req->srcGC = srcGC->gid;
+    req->dstGC = destGC->gid;
+    req->mask = mask;
+
+    if (mask & GCFunction)
+       destgv->function = srcgv->function;
+
+    if (mask & GCPlaneMask)
+        destgv->plane_mask = srcgv->plane_mask;
+
+    if (mask & GCForeground)
+        destgv->foreground = srcgv->foreground;
+
+    if (mask & GCBackground)
+        destgv->background = srcgv->background;
+
+    if (mask & GCLineWidth)
+        destgv->line_width = srcgv->line_width;
+
+    if (mask & GCLineStyle)
+        destgv->line_style = srcgv->line_style;
+
+    if (mask & GCCapStyle)
+        destgv->cap_style = srcgv->cap_style;
+
+    if (mask & GCJoinStyle)
+        destgv->join_style = srcgv->join_style;
+
+    if (mask & GCFillStyle)
+       destgv->fill_style = srcgv->fill_style;
+
+    if (mask & GCFillRule)
+        destgv->fill_rule = srcgv->fill_rule;
+
+    if (mask & GCArcMode)
+        destgv->arc_mode = srcgv->arc_mode;
+
+    if (mask & GCTile)
+        destgv->tile = srcgv->tile;
+
+    if (mask & GCStipple)
+        destgv->stipple = srcgv->stipple;
+
+    if (mask & GCTileStipXOrigin)
+        destgv->ts_x_origin = srcgv->ts_x_origin;
+
+    if (mask & GCTileStipYOrigin)
+        destgv->ts_y_origin = srcgv->ts_y_origin;
+
+    if (mask & GCFont)
+        destgv->font = srcgv->font;
+
+    if (mask & GCSubwindowMode)
+        destgv->subwindow_mode = srcgv->subwindow_mode;
+
+    if (mask & GCGraphicsExposures)
+        destgv->graphics_exposures = srcgv->graphics_exposures;
+
+    if (mask & GCClipXOrigin)
+        destgv->clip_x_origin = srcgv->clip_x_origin;
+
+    if (mask & GCClipYOrigin)
+        destgv->clip_y_origin = srcgv->clip_y_origin;
+
+    if (mask & GCClipMask) {
+       destGC->rects = srcGC->rects;
+        destgv->clip_mask = srcgv->clip_mask;
+       }
+
+    if (mask & GCDashOffset)
+        destgv->dash_offset = srcgv->dash_offset;
+
+    if (mask & GCDashList) {
+       destGC->dashes = srcGC->dashes;
+        destgv->dashes = srcgv->dashes;
+       }
+    /* call out to any extensions interested */
+    for (ext = dpy->ext_procs; ext; ext = ext->next)
+       if (ext->copy_GC) (*ext->copy_GC)(dpy, destGC, &ext->codes);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+    }
diff --git a/src/CopyPlane.c b/src/CopyPlane.c
new file mode 100644 (file)
index 0000000..8186876
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XCopyPlane(
+     register Display *dpy,
+     Drawable src_drawable,
+     Drawable dst_drawable,
+     GC gc,
+     int src_x,
+     int src_y,
+     unsigned int width,
+     unsigned int height,
+     int dst_x,
+     int dst_y,
+     unsigned long bit_plane)
+
+{
+    register xCopyPlaneReq *req;
+
+    LockDisplay(dpy);
+    FlushGC(dpy, gc);
+    GetReq(CopyPlane, req);
+    req->srcDrawable = src_drawable;
+    req->dstDrawable = dst_drawable;
+    req->gc = gc->gid;
+    req->srcX = src_x;
+    req->srcY = src_y;
+    req->dstX = dst_x;
+    req->dstY = dst_y;
+    req->width = width;
+    req->height = height;
+    req->bitPlane = bit_plane;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/Cr.h b/src/Cr.h
new file mode 100644 (file)
index 0000000..800c9ab
--- /dev/null
+++ b/src/Cr.h
@@ -0,0 +1,27 @@
+
+#ifndef _CR_H_
+#define _CR_H_
+
+extern int _XUpdateGCCache(
+    register GC gc,
+    register unsigned long mask,
+    register XGCValues *attr);
+extern void _XNoticeCreateBitmap(
+    Display         *dpy,
+    Pixmap          pid,
+    unsigned int    width,
+    unsigned int    height);
+extern void _XNoticePutBitmap(
+    Display         *dpy,
+    Drawable        draw,
+    XImage          *image);
+extern Cursor _XTryShapeBitmapCursor(
+    Display         *dpy,
+    Pixmap          source,
+    Pixmap          mask,
+    XColor          *foreground,
+    XColor          *background,
+    unsigned int    x,
+    unsigned int    y);
+
+#endif /* _CR_H_ */
diff --git a/src/CrBFData.c b/src/CrBFData.c
new file mode 100644 (file)
index 0000000..4490956
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+
+Copyright 1987, 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 "Xlib.h"
+
+/*
+ * XCreateBitmapFromData: Routine to make a pixmap of depth 1 from user
+ *                       supplied data.
+ *     D is any drawable on the same screen that the pixmap will be used in.
+ *     Data is a pointer to the bit data, and
+ *     width & height give the size in bits of the pixmap.
+ *
+ * The following format is assumed for data:
+ *
+ *    format=XYPixmap
+ *    bit_order=LSBFirst
+ *    byte_order=LSBFirst
+ *    padding=8
+ *    bitmap_unit=8
+ *    xoffset=0
+ *    no extra bytes per line
+ */
+Pixmap XCreateBitmapFromData(
+     Display *display,
+     Drawable d,
+     _Xconst char *data,
+     unsigned int width,
+     unsigned int height)
+{
+    XImage ximage;
+    GC gc;
+    Pixmap pix;
+
+    pix = XCreatePixmap(display, d, width, height, 1);
+    if (! (gc = XCreateGC(display, pix, (unsigned long) 0, (XGCValues *) 0)))
+       return (Pixmap) None;
+    ximage.height = height;
+    ximage.width = width;
+    ximage.depth = 1;
+    ximage.bits_per_pixel = 1;
+    ximage.xoffset = 0;
+    ximage.format = XYPixmap;
+    ximage.data = (char *)data;
+    ximage.byte_order = LSBFirst;
+    ximage.bitmap_unit = 8;
+    ximage.bitmap_bit_order = LSBFirst;
+    ximage.bitmap_pad = 8;
+    ximage.bytes_per_line = (width+7)/8;
+
+    XPutImage(display, pix, gc, &ximage, 0, 0, 0, 0, width, height);
+    XFreeGC(display, gc);
+    return(pix);
+}
diff --git a/src/CrCmap.c b/src/CrCmap.c
new file mode 100644 (file)
index 0000000..9904c7d
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+#include "Xcmsint.h"
+
+
+Colormap XCreateColormap(
+    register Display *dpy,
+    Window w,
+    Visual *visual,
+    int alloc)
+{
+    register xCreateColormapReq *req;
+    Colormap mid;
+
+    LockDisplay(dpy);
+    GetReq(CreateColormap, req);
+    req->window = w;
+    mid = req->mid = XAllocID(dpy);
+    req->alloc = alloc;
+    if (visual == CopyFromParent) req->visual = CopyFromParent;
+    else req->visual = visual->visualid;
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+
+#ifdef XCMS
+    _XcmsAddCmapRec(dpy, mid, w, visual);
+#endif
+
+    return(mid);
+}
diff --git a/src/CrCursor.c b/src/CrCursor.c
new file mode 100644 (file)
index 0000000..c8c174e
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+#ifdef USE_DYNAMIC_XCURSOR
+Cursor
+_XTryShapeBitmapCursor (Display                *dpy,
+                       Pixmap          source,
+                       Pixmap          mask,
+                       XColor          *foreground,
+                       XColor          *background,
+                       unsigned int    x,
+                       unsigned int    y);
+#endif
+
+Cursor XCreatePixmapCursor(
+     register Display *dpy,
+     Pixmap source,
+     Pixmap mask,
+     XColor *foreground,
+     XColor *background,
+     unsigned int x,
+     unsigned int y)
+
+{
+    register xCreateCursorReq *req;
+    Cursor cid;
+
+#ifdef USE_DYNAMIC_XCURSOR
+    cid = _XTryShapeBitmapCursor (dpy, source, mask,
+                                 foreground, background, x, y);
+    if (cid)
+       return cid;
+#endif
+    LockDisplay(dpy);
+    GetReq(CreateCursor, req);
+    req->cid = cid = XAllocID(dpy);
+    req->source = source;
+    req->mask = mask;
+    req->foreRed = foreground->red;
+    req->foreGreen = foreground->green;
+    req->foreBlue = foreground->blue;
+    req->backRed = background->red;
+    req->backGreen = background->green;
+    req->backBlue = background->blue;
+    req->x = x;
+    req->y = y;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return (cid);
+}
+
diff --git a/src/CrGC.c b/src/CrGC.c
new file mode 100644 (file)
index 0000000..11de94c
--- /dev/null
@@ -0,0 +1,345 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+#include "Cr.h"
+
+static XGCValues const initial_GC = {
+    GXcopy,    /* function */
+    AllPlanes, /* plane_mask */
+    0L,                /* foreground */
+    1L,                /* background */
+    0,         /* line_width */
+    LineSolid, /* line_style */
+    CapButt,   /* cap_style */
+    JoinMiter, /* join_style */
+    FillSolid, /* fill_style */
+    EvenOddRule,/* fill_rule */
+    ArcPieSlice,/* arc_mode */
+    (Pixmap)~0L,/* tile, impossible (unknown) resource */
+    (Pixmap)~0L,/* stipple, impossible (unknown) resource */
+    0,         /* ts_x_origin */
+    0,         /* ts_y_origin */
+    (Font)~0L, /* font, impossible (unknown) resource */
+    ClipByChildren, /* subwindow_mode */
+    True,      /* graphics_exposures */
+    0,         /* clip_x_origin */
+    0,         /* clip_y_origin */
+    None,      /* clip_mask */
+    0,         /* dash_offset */
+    4          /* dashes (list [4,4]) */
+};
+
+static void _XGenerateGCList(
+    register Display *dpy,
+    GC gc,
+    xReq *req);
+
+GC XCreateGC (
+     register Display *dpy,
+     Drawable d,               /* Window or Pixmap for which depth matches */
+     unsigned long valuemask,  /* which ones to set initially */
+     XGCValues *values)                /* the values themselves */
+{
+    register GC gc;
+    register xCreateGCReq *req;
+    register _XExtension *ext;
+
+    LockDisplay(dpy);
+    if ((gc = (GC)Xmalloc (sizeof(struct _XGC))) == NULL) {
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return (NULL);
+    }
+    gc->rects = 0;
+    gc->dashes = 0;
+    gc->ext_data = NULL;
+    gc->values = initial_GC;
+    gc->dirty = 0L;
+
+    valuemask &= (1L << (GCLastBit + 1)) - 1;
+    if (valuemask) _XUpdateGCCache (gc, valuemask, values);
+
+    GetReq(CreateGC, req);
+    req->drawable = d;
+    req->gc = gc->gid = XAllocID(dpy);
+
+    if ((req->mask = gc->dirty))
+        _XGenerateGCList (dpy, gc, (xReq *) req);
+    /* call out to any extensions interested */
+    for (ext = dpy->ext_procs; ext; ext = ext->next)
+       if (ext->create_GC) (*ext->create_GC)(dpy, gc, &ext->codes);
+    gc->dirty = 0L; /* allow extensions to see dirty bits */
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return (gc);
+    }
+
+/*
+ * GenerateGCList looks at the GC dirty bits, and appends all the required
+ * long words to the request being generated.
+ */
+
+static void
+_XGenerateGCList (
+    register Display *dpy,
+    GC gc,
+    xReq *req)
+    {
+    unsigned long values[32];
+    register unsigned long *value = values;
+    long nvalues;
+    register XGCValues *gv = &gc->values;
+    register unsigned long dirty = gc->dirty;
+
+    /*
+     * Note: The order of these tests are critical; the order must be the
+     * same as the GC mask bits in the word.
+     */
+    if (dirty & GCFunction)          *value++ = gv->function;
+    if (dirty & GCPlaneMask)         *value++ = gv->plane_mask;
+    if (dirty & GCForeground)        *value++ = gv->foreground;
+    if (dirty & GCBackground)        *value++ = gv->background;
+    if (dirty & GCLineWidth)         *value++ = gv->line_width;
+    if (dirty & GCLineStyle)         *value++ = gv->line_style;
+    if (dirty & GCCapStyle)          *value++ = gv->cap_style;
+    if (dirty & GCJoinStyle)         *value++ = gv->join_style;
+    if (dirty & GCFillStyle)         *value++ = gv->fill_style;
+    if (dirty & GCFillRule)          *value++ = gv->fill_rule;
+    if (dirty & GCTile)              *value++ = gv->tile;
+    if (dirty & GCStipple)           *value++ = gv->stipple;
+    if (dirty & GCTileStipXOrigin)   *value++ = gv->ts_x_origin;
+    if (dirty & GCTileStipYOrigin)   *value++ = gv->ts_y_origin;
+    if (dirty & GCFont)              *value++ = gv->font;
+    if (dirty & GCSubwindowMode)     *value++ = gv->subwindow_mode;
+    if (dirty & GCGraphicsExposures) *value++ = gv->graphics_exposures;
+    if (dirty & GCClipXOrigin)       *value++ = gv->clip_x_origin;
+    if (dirty & GCClipYOrigin)       *value++ = gv->clip_y_origin;
+    if (dirty & GCClipMask)          *value++ = gv->clip_mask;
+    if (dirty & GCDashOffset)        *value++ = gv->dash_offset;
+    if (dirty & GCDashList)          *value++ = gv->dashes;
+    if (dirty & GCArcMode)           *value++ = gv->arc_mode;
+
+    req->length += (nvalues = value - values);
+
+    /*
+     * note: Data is a macro that uses its arguments multiple
+     * times, so "nvalues" is changed in a separate assignment
+     * statement
+     */
+
+    nvalues <<= 2;
+    Data32 (dpy, (long *) values, nvalues);
+
+    }
+
+
+int
+_XUpdateGCCache (
+    register GC gc,
+    register unsigned long mask,
+    register XGCValues *attr)
+{
+    register XGCValues *gv = &gc->values;
+
+    if (mask & GCFunction)
+        if (gv->function != attr->function) {
+         gv->function = attr->function;
+         gc->dirty |= GCFunction;
+       }
+
+    if (mask & GCPlaneMask)
+        if (gv->plane_mask != attr->plane_mask) {
+            gv->plane_mask = attr->plane_mask;
+           gc->dirty |= GCPlaneMask;
+         }
+
+    if (mask & GCForeground)
+        if (gv->foreground != attr->foreground) {
+            gv->foreground = attr->foreground;
+           gc->dirty |= GCForeground;
+         }
+
+    if (mask & GCBackground)
+        if (gv->background != attr->background) {
+            gv->background = attr->background;
+           gc->dirty |= GCBackground;
+         }
+
+    if (mask & GCLineWidth)
+        if (gv->line_width != attr->line_width) {
+            gv->line_width = attr->line_width;
+           gc->dirty |= GCLineWidth;
+         }
+
+    if (mask & GCLineStyle)
+        if (gv->line_style != attr->line_style) {
+            gv->line_style = attr->line_style;
+           gc->dirty |= GCLineStyle;
+         }
+
+    if (mask & GCCapStyle)
+        if (gv->cap_style != attr->cap_style) {
+            gv->cap_style = attr->cap_style;
+           gc->dirty |= GCCapStyle;
+         }
+
+    if (mask & GCJoinStyle)
+        if (gv->join_style != attr->join_style) {
+            gv->join_style = attr->join_style;
+           gc->dirty |= GCJoinStyle;
+         }
+
+    if (mask & GCFillStyle)
+        if (gv->fill_style != attr->fill_style) {
+            gv->fill_style = attr->fill_style;
+           gc->dirty |= GCFillStyle;
+         }
+
+    if (mask & GCFillRule)
+        if (gv->fill_rule != attr->fill_rule) {
+           gv->fill_rule = attr->fill_rule;
+           gc->dirty |= GCFillRule;
+         }
+
+    if (mask & GCArcMode)
+        if (gv->arc_mode != attr->arc_mode) {
+           gv->arc_mode = attr->arc_mode;
+           gc->dirty |= GCArcMode;
+         }
+
+    /* always write through tile change, since client may have changed pixmap contents */
+    if (mask & GCTile) {
+           gv->tile = attr->tile;
+           gc->dirty |= GCTile;
+         }
+
+    /* always write through stipple change, since client may have changed pixmap contents */
+    if (mask & GCStipple) {
+           gv->stipple = attr->stipple;
+           gc->dirty |= GCStipple;
+         }
+
+    if (mask & GCTileStipXOrigin)
+        if (gv->ts_x_origin != attr->ts_x_origin) {
+           gv->ts_x_origin = attr->ts_x_origin;
+           gc->dirty |= GCTileStipXOrigin;
+         }
+
+    if (mask & GCTileStipYOrigin)
+        if (gv->ts_y_origin != attr->ts_y_origin) {
+           gv->ts_y_origin = attr->ts_y_origin;
+           gc->dirty |= GCTileStipYOrigin;
+         }
+
+    if (mask & GCFont)
+        if (gv->font != attr->font) {
+           gv->font = attr->font;
+           gc->dirty |= GCFont;
+         }
+
+    if (mask & GCSubwindowMode)
+        if (gv->subwindow_mode != attr->subwindow_mode) {
+           gv->subwindow_mode = attr->subwindow_mode;
+           gc->dirty |= GCSubwindowMode;
+         }
+
+    if (mask & GCGraphicsExposures)
+        if (gv->graphics_exposures != attr->graphics_exposures) {
+           gv->graphics_exposures = attr->graphics_exposures;
+           gc->dirty |= GCGraphicsExposures;
+         }
+
+    if (mask & GCClipXOrigin)
+        if (gv->clip_x_origin != attr->clip_x_origin) {
+           gv->clip_x_origin = attr->clip_x_origin;
+           gc->dirty |= GCClipXOrigin;
+         }
+
+    if (mask & GCClipYOrigin)
+        if (gv->clip_y_origin != attr->clip_y_origin) {
+           gv->clip_y_origin = attr->clip_y_origin;
+           gc->dirty |= GCClipYOrigin;
+         }
+
+    /* always write through mask change, since client may have changed pixmap contents */
+    if (mask & GCClipMask) {
+           gv->clip_mask = attr->clip_mask;
+           gc->dirty |= GCClipMask;
+           gc->rects = 0;
+         }
+
+    if (mask & GCDashOffset)
+        if (gv->dash_offset != attr->dash_offset) {
+           gv->dash_offset = attr->dash_offset;
+           gc->dirty |= GCDashOffset;
+         }
+
+    if (mask & GCDashList)
+        if ((gv->dashes != attr->dashes) || (gc->dashes == True)) {
+            gv->dashes = attr->dashes;
+           gc->dirty |= GCDashList;
+           gc->dashes = 0;
+           }
+    return 0;
+}
+
+/* can only call when display is already locked. */
+
+void _XFlushGCCache(
+     Display *dpy,
+     GC gc)
+{
+    register xChangeGCReq *req;
+    register _XExtension *ext;
+
+    if (gc->dirty) {
+        GetReq(ChangeGC, req);
+        req->gc = gc->gid;
+       req->mask = gc->dirty;
+        _XGenerateGCList (dpy, gc, (xReq *) req);
+       /* call out to any extensions interested */
+       for (ext = dpy->ext_procs; ext; ext = ext->next)
+           if (ext->flush_GC) (*ext->flush_GC)(dpy, gc, &ext->codes);
+       gc->dirty = 0L; /* allow extensions to see dirty bits */
+    }
+}
+
+void
+XFlushGC(
+    Display *dpy,
+    GC gc)
+{
+    FlushGC(dpy, gc);
+}
+
+GContext XGContextFromGC(GC gc)
+{
+    return (gc->gid);
+}
diff --git a/src/CrGlCur.c b/src/CrGlCur.c
new file mode 100644 (file)
index 0000000..460660f
--- /dev/null
@@ -0,0 +1,260 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+#ifdef USE_DYNAMIC_XCURSOR
+
+#ifdef __UNIXOS2__
+#define RTLD_LAZY 1
+#define LIBXCURSOR "Xcursor.dll"
+#endif
+#include <stdio.h>
+#include <string.h>
+#if defined(hpux)
+#include <dl.h>
+#else
+#include <dlfcn.h>
+#endif
+#include "Cr.h"
+
+#ifdef __CYGWIN__
+#define LIBXCURSOR "cygXcursor-1.dll"
+#endif
+
+#if defined(hpux)
+typedef shl_t  XModuleType;
+#else
+typedef void *XModuleType;
+#endif
+
+#ifndef LIBXCURSOR
+#define LIBXCURSOR "libXcursor.so.1"
+#endif
+
+static char libraryName[] = LIBXCURSOR;
+
+static XModuleType
+open_library (void)
+{
+    char       *library = libraryName;
+    char       *dot;
+    XModuleType        module;
+    for (;;)
+    {
+#if defined(hpux)
+       module = shl_load(library, BIND_DEFERRED, 0L);
+#else
+       module =  dlopen(library, RTLD_LAZY);
+#endif
+       if (module)
+           return module;
+       dot = strrchr (library, '.');
+       if (!dot)
+           break;
+       *dot = '\0';
+    }
+    return NULL;
+}
+
+static void *
+fetch_symbol (XModuleType module, const char *under_symbol)
+{
+    void *result = NULL;
+    const char *symbol = under_symbol + 1;
+#if defined(hpux)
+    int getsyms_cnt, i;
+    struct shl_symbol *symbols;
+
+    getsyms_cnt = shl_getsymbols(module, TYPE_PROCEDURE,
+                                EXPORT_SYMBOLS, malloc, &symbols);
+
+    for(i=0; i<getsyms_cnt; i++) {
+        if(!strcmp(symbols[i].name, symbol)) {
+           result = symbols[i].value;
+           break;
+         }
+    }
+
+    if(getsyms_cnt > 0) {
+        free(symbols);
+    }
+#else
+    result = dlsym (module, symbol);
+    if (!result)
+       result = dlsym (module, under_symbol);
+#endif
+    return result;
+}
+
+typedef void   (*NoticeCreateBitmapFunc) (Display          *dpy,
+                                          Pixmap           pid,
+                                          unsigned int width,
+                                          unsigned int height);
+
+typedef void   (*NoticePutBitmapFunc) (Display     *dpy,
+                                       Drawable    draw,
+                                       XImage      *image);
+
+typedef Cursor (*TryShapeBitmapCursorFunc) (Display        *dpy,
+                                            Pixmap         source,
+                                            Pixmap         mask,
+                                            XColor         *foreground,
+                                            XColor         *background,
+                                            unsigned int   x,
+                                            unsigned int   y);
+
+typedef Cursor (*TryShapeCursorFunc) (Display      *dpy,
+                                      Font         source_font,
+                                      Font         mask_font,
+                                      unsigned int source_char,
+                                      unsigned int mask_char,
+                                      XColor _Xconst *foreground,
+                                      XColor _Xconst *background);
+
+static XModuleType  _XcursorModule;
+static Bool        _XcursorModuleTried;
+
+#define GetFunc(type,name,ret) {\
+    static Bool            been_here; \
+    static type            staticFunc; \
+     \
+    _XLockMutex (_Xglobal_lock); \
+    if (!been_here) \
+    { \
+       been_here = True; \
+       if (!_XcursorModuleTried) \
+       { \
+           _XcursorModuleTried = True; \
+           _XcursorModule = open_library (); \
+       } \
+       if (_XcursorModule) \
+           staticFunc = (type) fetch_symbol (_XcursorModule, "_" name); \
+    } \
+    ret = staticFunc; \
+    _XUnlockMutex (_Xglobal_lock); \
+}
+
+static Cursor
+_XTryShapeCursor (Display          *dpy,
+                 Font              source_font,
+                 Font              mask_font,
+                 unsigned int      source_char,
+                 unsigned int      mask_char,
+                 XColor _Xconst    *foreground,
+                 XColor _Xconst    *background)
+{
+    TryShapeCursorFunc         func;
+
+    GetFunc (TryShapeCursorFunc, "XcursorTryShapeCursor", func);
+    if (func)
+       return (*func) (dpy, source_font, mask_font, source_char, mask_char,
+                       foreground, background);
+    return None;
+}
+
+void
+_XNoticeCreateBitmap (Display      *dpy,
+                     Pixmap        pid,
+                     unsigned int  width,
+                     unsigned int  height)
+{
+    NoticeCreateBitmapFunc  func;
+
+    GetFunc (NoticeCreateBitmapFunc, "XcursorNoticeCreateBitmap", func);
+    if (func)
+       (*func) (dpy, pid, width, height);
+}
+
+void
+_XNoticePutBitmap (Display     *dpy,
+                  Drawable     draw,
+                  XImage       *image)
+{
+    NoticePutBitmapFunc        func;
+
+    GetFunc (NoticePutBitmapFunc, "XcursorNoticePutBitmap", func);
+    if (func)
+       (*func) (dpy, draw, image);
+}
+
+Cursor
+_XTryShapeBitmapCursor (Display                *dpy,
+                       Pixmap          source,
+                       Pixmap          mask,
+                       XColor          *foreground,
+                       XColor          *background,
+                       unsigned int    x,
+                       unsigned int    y)
+{
+    TryShapeBitmapCursorFunc   func;
+
+    GetFunc (TryShapeBitmapCursorFunc, "XcursorTryShapeBitmapCursor", func);
+    if (func)
+       return (*func) (dpy, source, mask, foreground, background, x, y);
+    return None;
+}
+#endif
+
+Cursor XCreateGlyphCursor(
+     register Display *dpy,
+     Font source_font,
+     Font mask_font,
+     unsigned int source_char,
+     unsigned int mask_char,
+     XColor _Xconst *foreground,
+     XColor _Xconst *background)
+{
+    Cursor cid;
+    register xCreateGlyphCursorReq *req;
+
+#ifdef USE_DYNAMIC_XCURSOR
+    cid = _XTryShapeCursor (dpy, source_font, mask_font,
+                           source_char, mask_char, foreground, background);
+    if (cid)
+       return cid;
+#endif
+    LockDisplay(dpy);
+    GetReq(CreateGlyphCursor, req);
+    cid = req->cid = XAllocID(dpy);
+    req->source = source_font;
+    req->mask = mask_font;
+    req->sourceChar = source_char;
+    req->maskChar = mask_char;
+    req->foreRed = foreground->red;
+    req->foreGreen = foreground->green;
+    req->foreBlue = foreground->blue;
+    req->backRed = background->red;
+    req->backGreen = background->green;
+    req->backBlue = background->blue;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return (cid);
+}
+
diff --git a/src/CrPFBData.c b/src/CrPFBData.c
new file mode 100644 (file)
index 0000000..57cd153
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+
+Copyright 1987, 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 "Xlib.h"
+#include <stdio.h>
+
+/*
+ * XCreatePixmapFromBitmapData: Routine to make a pixmap from user supplied bitmap data.
+ *             D is any drawable on the same screen that the pixmap will be used in.
+ *             Data is a pointer to the bit data, and
+ *             width & height give the size in bits of the pixmap.
+ *             Fg and Bg are the pixel values to use for the two colors.
+ *             Depth is the depth of the pixmap to create.
+ *
+ * The following format is assumed for data:
+ *
+ *    format=XYPixmap
+ *    bit_order=LSBFirst
+ *    byte_order=LSBFirst
+ *    padding=8
+ *    bitmap_unit=8
+ *    xoffset=0
+ *    no extra bytes per line
+ */
+Pixmap XCreatePixmapFromBitmapData(
+    Display *display,
+    Drawable d,
+    char *data,
+    unsigned int width,
+    unsigned int height,
+    unsigned long fg,
+    unsigned long bg,
+    unsigned int depth)
+{
+    XImage ximage;
+    GC gc;
+    XGCValues gcv;
+    Pixmap pix;
+
+    pix = XCreatePixmap(display, d, width, height, depth);
+    gcv.foreground = fg;
+    gcv.background = bg;
+    if (! (gc = XCreateGC(display, pix, GCForeground|GCBackground, &gcv)))
+       return (Pixmap) NULL;
+    ximage.height = height;
+    ximage.width = width;
+    ximage.depth = 1;
+    ximage.bits_per_pixel = 1;
+    ximage.xoffset = 0;
+    ximage.format = XYBitmap;
+    ximage.data = data;
+    ximage.byte_order = LSBFirst;
+    ximage.bitmap_unit = 8;
+    ximage.bitmap_bit_order = LSBFirst;
+    ximage.bitmap_pad = 8;
+    ximage.bytes_per_line = (width+7)/8;
+
+    XPutImage(display, pix, gc, &ximage, 0, 0, 0, 0, width, height);
+    XFreeGC(display, gc);
+    return(pix);
+}
diff --git a/src/CrPixmap.c b/src/CrPixmap.c
new file mode 100644 (file)
index 0000000..cdf3120
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+#ifdef USE_DYNAMIC_XCURSOR
+void
+_XNoticeCreateBitmap (Display      *dpy,
+                     Pixmap        pid,
+                     unsigned int  width,
+                     unsigned int  height);
+#endif
+
+Pixmap XCreatePixmap (
+    register Display *dpy,
+    Drawable d,
+    unsigned int width,
+    unsigned int height,
+    unsigned int depth)
+{
+    Pixmap pid;
+    register xCreatePixmapReq *req;
+
+    LockDisplay(dpy);
+    GetReq(CreatePixmap, req);
+    req->drawable = d;
+    req->width = width;
+    req->height = height;
+    req->depth = depth;
+    pid = req->pid = XAllocID(dpy);
+    UnlockDisplay(dpy);
+    SyncHandle();
+#ifdef USE_DYNAMIC_XCURSOR
+    if (depth == 1)
+       _XNoticeCreateBitmap (dpy, pid, width, height);
+#endif
+    return (pid);
+}
+
diff --git a/src/CrWindow.c b/src/CrWindow.c
new file mode 100644 (file)
index 0000000..23f7ddc
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+Window XCreateSimpleWindow(
+    register Display *dpy,
+    Window parent,
+    int x,
+    int y,
+    unsigned int width,
+    unsigned int height,
+    unsigned int borderWidth,
+    unsigned long border,
+    unsigned long background)
+{
+    Window wid;
+    register xCreateWindowReq *req;
+
+    LockDisplay(dpy);
+    GetReqExtra(CreateWindow, 8, req);
+    req->parent = parent;
+    req->x = x;
+    req->y = y;
+    req->width = width;
+    req->height = height;
+    req->borderWidth = borderWidth;
+    req->depth = 0;
+    req->class = CopyFromParent;
+    req->visual = CopyFromParent;
+    wid = req->wid = XAllocID(dpy);
+    req->mask = CWBackPixel | CWBorderPixel;
+
+#ifdef MUSTCOPY
+    {
+       unsigned long lbackground = background, lborder = border;
+       dpy->bufptr -= 8;
+       Data32 (dpy, (long *) &lbackground, 4);
+       Data32 (dpy, (long *) &lborder, 4);
+    }
+#else
+    {
+       register CARD32 *valuePtr = (CARD32 *) NEXTPTR(req,xCreateWindowReq);
+       *valuePtr++ = background;
+       *valuePtr = border;
+    }
+#endif /* MUSTCOPY */
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return (wid);
+    }
diff --git a/src/Cursor.c b/src/Cursor.c
new file mode 100644 (file)
index 0000000..80b91c3
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+
+Copyright 1987, 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 "Xlibint.h"
+static XColor _Xconst foreground = { 0,    0,     0,     0  };  /* black */
+static XColor _Xconst background = { 0, 65535, 65535, 65535 };  /* white */
+
+Cursor XCreateFontCursor(
+       Display *dpy,
+       unsigned int which)
+{
+       /*
+        * the cursor font contains the shape glyph followed by the mask
+        * glyph; so character position 0 contains a shape, 1 the mask for 0,
+        * 2 a shape, etc.  <X11/cursorfont.h> contains hash define names
+        * for all of these.
+        */
+
+       if (dpy->cursor_font == None) {
+           dpy->cursor_font = XLoadFont (dpy, CURSORFONT);
+           if (dpy->cursor_font == None) return None;
+       }
+
+       return XCreateGlyphCursor (dpy, dpy->cursor_font, dpy->cursor_font,
+                                  which, which + 1, &foreground, &background);
+}
+
diff --git a/src/DefCursor.c b/src/DefCursor.c
new file mode 100644 (file)
index 0000000..e3cee06
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+
+Copyright 1986,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 "Xlibint.h"
+
+int
+XDefineCursor (
+    register Display *dpy,
+    Window w,
+    Cursor cursor)
+{
+    register xChangeWindowAttributesReq *req;
+
+    LockDisplay(dpy);
+    GetReqExtra (ChangeWindowAttributes, 4, req);
+    req->window = w;
+    req->valueMask = CWCursor;
+    OneDataCard32 (dpy, NEXTPTR(req,xChangeWindowAttributesReq), cursor);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/DelProp.c b/src/DelProp.c
new file mode 100644 (file)
index 0000000..da486b8
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XDeleteProperty(
+    register Display *dpy,
+    Window window,
+    Atom property)
+{
+    register xDeletePropertyReq *req;
+
+    LockDisplay(dpy);
+    GetReq(DeleteProperty, req);
+    req->window = window;
+    req->property = property;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/Depths.c b/src/Depths.c
new file mode 100644 (file)
index 0000000..f49655c
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+
+Copyright 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 "Xlibint.h"
+#include <stdio.h>
+
+/*
+ * XListDepths - return info from connection setup
+ */
+int *XListDepths (
+    Display *dpy,
+    int scrnum,
+    int *countp)
+{
+    Screen *scr;
+    int count;
+    int *depths;
+
+    if (scrnum < 0 || scrnum >= dpy->nscreens) return NULL;
+
+    scr = &dpy->screens[scrnum];
+    if ((count = scr->ndepths) > 0) {
+       register Depth *dp;
+       register int i;
+
+       depths = (int *) Xmalloc (count * sizeof(int));
+       if (!depths) return NULL;
+       for (i = 0, dp = scr->depths; i < count; i++, dp++)
+         depths[i] = dp->depth;
+    } else {
+       /* a screen must have a depth */
+       return NULL;
+    }
+    *countp = count;
+    return depths;
+}
diff --git a/src/DestSubs.c b/src/DestSubs.c
new file mode 100644 (file)
index 0000000..7c6c428
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XDestroySubwindows(
+    register Display *dpy,
+    Window win)
+{
+    register xResourceReq *req;
+
+    LockDisplay(dpy);
+    GetResReq (DestroySubwindows,win, req);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/DestWind.c b/src/DestWind.c
new file mode 100644 (file)
index 0000000..c1aec89
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XDestroyWindow (
+       register Display *dpy,
+       Window w)
+{
+        register xResourceReq *req;
+
+       LockDisplay(dpy);
+        GetResReq(DestroyWindow, w, req);
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return 1;
+}
+
diff --git a/src/DisName.c b/src/DisName.c
new file mode 100644 (file)
index 0000000..87a1e2f
--- /dev/null
@@ -0,0 +1,64 @@
+
+/*
+
+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.
+
+*/
+
+/* XDisplayName.c */
+/*
+ * Returns the name of the display XOpenDisplay would use.  This is better
+ * than just printing the "display" variable in a program because that
+ * could be NULL and/or there could be an environment variable set.
+ * This makes it easier for programmers to provide meaningful error
+ * messages.
+ *
+ *
+ * For example, this is used in XOpenDisplay() as
+ *     strncpy( displaybuf, XDisplayName( display ), sizeof(displaybuf) );
+ *      if ( *displaybuf == '\0' ) return( NULL );
+ *  This check is actually unnecessary because the next thing is an index()
+ *  call looking for a ':' which will fail and we'll return(NULL).
+ */
+/* Written at Waterloo - JMSellens */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include "Xlib.h"
+
+char *
+XDisplayName(
+    _Xconst char *display)
+{
+    char *d;
+    if ( display != (char *)NULL && *display != '\0' )
+       return( (char *)display );
+    if ( (d = getenv( "DISPLAY" )) != (char *)NULL )
+       return( d );
+    return( "" );
+}
diff --git a/src/DrArc.c b/src/DrArc.c
new file mode 100644 (file)
index 0000000..1dc4a07
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+
+Copyright 1986, 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.
+
+*/
+
+/* Note to future maintainers:  XDrawArc does NOT batch successive PolyArc
+   requests into a single request like XDrawLine, XDrawPoint, etc.
+   We don't do this because X_PolyArc applies the GC's join-style if
+   the last point in one arc coincides with the first point in another.
+   The client wouldn't expect this and would have no easy way to defeat it. */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+
+int
+XDrawArc(
+    register Display *dpy,
+    Drawable d,
+    GC gc,
+    int x,
+    int y, /* INT16 */
+    unsigned int width,
+    unsigned int height, /* CARD16 */
+    int angle1,
+    int angle2) /* INT16 */
+{
+    register xPolyArcReq *req;
+    register xArc *arc;
+#ifdef MUSTCOPY
+    xArc arcdata;
+    long len = SIZEOF(xArc);
+
+    arc = &arcdata;
+#endif /* MUSTCOPY */
+
+    LockDisplay(dpy);
+    FlushGC(dpy, gc);
+    GetReqExtra (PolyArc, SIZEOF(xArc), req);
+
+    req->drawable = d;
+    req->gc = gc->gid;
+
+#ifndef MUSTCOPY
+    arc = (xArc *) NEXTPTR(req,xPolyArcReq);
+#endif /* MUSTCOPY */
+
+    arc->x = x;
+    arc->y = y;
+    arc->width = width;
+    arc->height = height;
+    arc->angle1 = angle1;
+    arc->angle2 = angle2;
+
+#ifdef MUSTCOPY
+    dpy->bufptr -= SIZEOF(xArc);
+    Data (dpy, (char *) arc, len);
+#endif /* MUSTCOPY */
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/DrArcs.c b/src/DrArcs.c
new file mode 100644 (file)
index 0000000..14405aa
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+#define arc_scale (SIZEOF(xArc) / 4)
+
+int
+XDrawArcs(
+    register Display *dpy,
+    Drawable d,
+    GC gc,
+    XArc *arcs,
+    int n_arcs)
+{
+    register xPolyArcReq *req;
+    register long len;
+
+    LockDisplay(dpy);
+    FlushGC(dpy, gc);
+    GetReq(PolyArc,req);
+    req->drawable = d;
+    req->gc = gc->gid;
+    len = ((long)n_arcs) * arc_scale;
+    SetReqLen(req, len, 1);
+    len <<= 2; /* watch out for macros... */
+    Data16 (dpy, (short *) arcs, len);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/DrLine.c b/src/DrLine.c
new file mode 100644 (file)
index 0000000..3786f59
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+/* precompute the maximum size of batching request allowed */
+
+#define wsize (SIZEOF(xPolySegmentReq) + WLNSPERBATCH * SIZEOF(xSegment))
+#define zsize (SIZEOF(xPolySegmentReq) + ZLNSPERBATCH * SIZEOF(xSegment))
+
+int
+XDrawLine (
+    register Display *dpy,
+    Drawable d,
+    GC gc,
+    int x1,
+    int y1,
+    int x2,
+    int y2)
+{
+    register xSegment *segment;
+#ifdef MUSTCOPY
+    xSegment segmentdata;
+    long len = SIZEOF(xSegment);
+
+    segment = &segmentdata;
+#endif /* not MUSTCOPY */
+
+    LockDisplay(dpy);
+    FlushGC(dpy, gc);
+
+    {
+    register xPolySegmentReq *req = (xPolySegmentReq *) dpy->last_req;
+
+    /* if same as previous request, with same drawable, batch requests */
+    if (
+          (req->reqType == X_PolySegment)
+       && (req->drawable == d)
+       && (req->gc == gc->gid)
+       && ((dpy->bufptr + SIZEOF(xSegment)) <= dpy->bufmax)
+       && (((char *)dpy->bufptr - (char *)req) < (gc->values.line_width ?
+                                                 wsize : zsize)) ) {
+        req->length += SIZEOF(xSegment) >> 2;
+#ifndef MUSTCOPY
+         segment = (xSegment *) dpy->bufptr;
+        dpy->bufptr += SIZEOF(xSegment);
+#endif /* not MUSTCOPY */
+        }
+
+    else {
+       GetReqExtra (PolySegment, SIZEOF(xSegment), req);
+       req->drawable = d;
+       req->gc = gc->gid;
+#ifdef MUSTCOPY
+       dpy->bufptr -= SIZEOF(xSegment);
+#else
+       segment = (xSegment *) NEXTPTR(req,xPolySegmentReq);
+#endif /* MUSTCOPY */
+       }
+
+    segment->x1 = x1;
+    segment->y1 = y1;
+    segment->x2 = x2;
+    segment->y2 = y2;
+
+#ifdef MUSTCOPY
+    Data (dpy, (char *) &segmentdata, len);
+#endif /* MUSTCOPY */
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+    }
+    return 1;
+}
+
diff --git a/src/DrLines.c b/src/DrLines.c
new file mode 100644 (file)
index 0000000..68071b6
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XDrawLines (
+    register Display *dpy,
+    Drawable d,
+    GC gc,
+    XPoint *points,
+    int npoints,
+    int mode)
+{
+    register xPolyLineReq *req;
+    register long length;
+    LockDisplay(dpy);
+    FlushGC(dpy, gc);
+    GetReq (PolyLine, req);
+    req->drawable = d;
+    req->gc = gc->gid;
+    req->coordMode = mode;
+    SetReqLen(req, npoints, 65535 - req->length);
+    /* each point is 2 16-bit integers */
+    length = npoints << 2;             /* watch out for macros... */
+    Data16 (dpy, (short *) points, length);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/DrPoint.c b/src/DrPoint.c
new file mode 100644 (file)
index 0000000..5c89b5c
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+/* precompute the maximum size of batching request allowed */
+
+#define size (SIZEOF(xPolyPointReq) + PTSPERBATCH * SIZEOF(xPoint))
+
+int
+XDrawPoint(
+    register Display *dpy,
+    Drawable d,
+    GC gc,
+    int x,
+    int y) /* INT16 */
+{
+    xPoint *point;
+#ifdef MUSTCOPY
+    xPoint pointdata;
+    long len = SIZEOF(xPoint);
+
+    point = &pointdata;
+#endif /* MUSTCOPY */
+
+    LockDisplay(dpy);
+    FlushGC(dpy, gc);
+
+    {
+    register xPolyPointReq *req = (xPolyPointReq *) dpy->last_req;
+
+
+    /* if same as previous request, with same drawable, batch requests */
+    if (
+          (req->reqType == X_PolyPoint)
+       && (req->drawable == d)
+       && (req->gc == gc->gid)
+       && (req->coordMode == CoordModeOrigin)
+       && ((dpy->bufptr + SIZEOF(xPoint)) <= dpy->bufmax)
+       && (((char *)dpy->bufptr - (char *)req) < size) ) {
+        req->length += SIZEOF(xPoint) >> 2;
+#ifndef MUSTCOPY
+         point = (xPoint *) dpy->bufptr;
+        dpy->bufptr += SIZEOF(xPoint);
+#endif /* not MUSTCOPY */
+        }
+
+    else {
+       GetReqExtra(PolyPoint, 4, req); /* 1 point = 4 bytes */
+       req->drawable = d;
+       req->gc = gc->gid;
+       req->coordMode = CoordModeOrigin;
+#ifdef MUSTCOPY
+       dpy->bufptr -= SIZEOF(xPoint);
+#else
+       point = (xPoint *) NEXTPTR(req,xPolyPointReq);
+#endif /* MUSTCOPY */
+       }
+
+    point->x = x;
+    point->y = y;
+
+#ifdef MUSTCOPY
+    Data (dpy, (char *) point, len);
+#endif /* MUSTCOPY */
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/DrPoints.c b/src/DrPoints.c
new file mode 100644 (file)
index 0000000..287fa05
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XDrawPoints(
+    register Display *dpy,
+    Drawable d,
+    GC gc,
+    XPoint *points,
+    int n_points,
+    int mode) /* CoordMode */
+{
+    register xPolyPointReq *req;
+    register long nbytes;
+    int n;
+    int xoff, yoff;
+    XPoint pt;
+
+    xoff = yoff = 0;
+    LockDisplay(dpy);
+    FlushGC(dpy, gc);
+    while (n_points) {
+       GetReq(PolyPoint, req);
+       req->drawable = d;
+       req->gc = gc->gid;
+       req->coordMode = mode;
+       n = n_points;
+       if (!dpy->bigreq_size && n > (dpy->max_request_size - req->length))
+           n = dpy->max_request_size - req->length;
+       SetReqLen(req, n, n);
+       nbytes = ((long)n) << 2; /* watch out for macros... */
+       if (xoff || yoff) {
+           pt.x = xoff + points->x;
+           pt.y = yoff + points->y;
+           Data16 (dpy, (short *) &pt, 4);
+           if (nbytes > 4) {
+               Data16 (dpy, (short *) (points + 1), nbytes - 4);
+           }
+       } else {
+           Data16 (dpy, (short *) points, nbytes);
+       }
+       n_points -= n;
+       if (n_points && (mode == CoordModePrevious)) {
+           register XPoint *pptr = points;
+           points += n;
+           while (pptr != points) {
+               xoff += pptr->x;
+               yoff += pptr->y;
+               pptr++;
+           }
+       } else
+           points += n;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/DrRect.c b/src/DrRect.c
new file mode 100644 (file)
index 0000000..dadd55e
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+/* precompute the maximum size of batching request allowed */
+
+#define wsize (SIZEOF(xPolyRectangleReq) + WRCTSPERBATCH * SIZEOF(xRectangle))
+#define zsize (SIZEOF(xPolyRectangleReq) + ZRCTSPERBATCH * SIZEOF(xRectangle))
+
+int
+XDrawRectangle(
+    register Display *dpy,
+    Drawable d,
+    GC gc,
+    int x,
+    int y, /* INT16 */
+    unsigned int width,
+    unsigned int height) /* CARD16 */
+{
+    xRectangle *rect;
+#ifdef MUSTCOPY
+    xRectangle rectdata;
+    long len = SIZEOF(xRectangle);
+
+    rect = &rectdata;
+#endif /* MUSTCOPY */
+
+    LockDisplay(dpy);
+    FlushGC(dpy, gc);
+
+    {
+    register xPolyRectangleReq *req = (xPolyRectangleReq *) dpy->last_req;
+
+    /* if same as previous request, with same drawable, batch requests */
+    if (
+          (req->reqType == X_PolyRectangle)
+       && (req->drawable == d)
+       && (req->gc == gc->gid)
+       && ((dpy->bufptr + SIZEOF(xRectangle)) <= dpy->bufmax)
+       && (((char *)dpy->bufptr - (char *)req) < (gc->values.line_width ?
+                                                 wsize : zsize)) ) {
+        req->length += SIZEOF(xRectangle) >> 2;
+#ifndef MUSTCOPY
+         rect = (xRectangle *) dpy->bufptr;
+        dpy->bufptr += SIZEOF(xRectangle);
+#endif /* not MUSTCOPY */
+        }
+
+    else {
+       GetReqExtra(PolyRectangle, SIZEOF(xRectangle), req);
+       req->drawable = d;
+       req->gc = gc->gid;
+#ifdef MUSTCOPY
+       dpy->bufptr -= SIZEOF(xRectangle);
+#else
+       rect = (xRectangle *) NEXTPTR(req,xPolyRectangleReq);
+#endif /* MUSTCOPY */
+       }
+
+    rect->x = x;
+    rect->y = y;
+    rect->width = width;
+    rect->height = height;
+
+#ifdef MUSTCOPY
+    Data (dpy, (char *) rect, len);    /* subtracted bufptr up above */
+#endif /* MUSTCOPY */
+
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/DrRects.c b/src/DrRects.c
new file mode 100644 (file)
index 0000000..7827bf1
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XDrawRectangles(
+    register Display *dpy,
+    Drawable d,
+    GC gc,
+    XRectangle *rects,
+    int n_rects)
+{
+    register xPolyRectangleReq *req;
+    long len;
+    int n;
+
+    LockDisplay(dpy);
+    FlushGC(dpy, gc);
+    while (n_rects) {
+       GetReq(PolyRectangle, req);
+       req->drawable = d;
+       req->gc = gc->gid;
+       n = n_rects;
+       len = ((long)n) << 1;
+       if (!dpy->bigreq_size && len > (dpy->max_request_size - req->length)) {
+           n = (dpy->max_request_size - req->length) >> 1;
+           len = ((long)n) << 1;
+       }
+       SetReqLen(req, len, len);
+       len <<= 2; /* watch out for macros... */
+       Data16 (dpy, (short *) rects, len);
+       n_rects -= n;
+       rects += n;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/DrSegs.c b/src/DrSegs.c
new file mode 100644 (file)
index 0000000..93eab4d
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XDrawSegments (
+    register Display *dpy,
+    Drawable d,
+    GC gc,
+    XSegment *segments,
+    int nsegments)
+{
+    register xPolySegmentReq *req;
+    long len;
+    int n;
+
+    LockDisplay(dpy);
+    FlushGC(dpy, gc);
+    while (nsegments) {
+       GetReq (PolySegment, req);
+       req->drawable = d;
+       req->gc = gc->gid;
+       n = nsegments;
+       len = ((long)n) << 1;
+       if (!dpy->bigreq_size && len > (dpy->max_request_size - req->length)) {
+           n = (dpy->max_request_size - req->length) >> 1;
+           len = ((long)n) << 1;
+       }
+       SetReqLen(req, len, len);
+       len <<= 2; /* watch out for macros... */
+       Data16 (dpy, (short *) segments, len);
+       nsegments -= n;
+       segments += n;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/ErrDes.c b/src/ErrDes.c
new file mode 100644 (file)
index 0000000..9a5b180
--- /dev/null
@@ -0,0 +1,211 @@
+/*
+ */
+
+/***********************************************************
+
+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 "Xlibint.h"
+#include <X11/Xos.h>
+#include "Xresource.h"
+#include <stdio.h>
+
+#ifndef ERRORDB
+#ifndef XERRORDB
+#define ERRORDB "/usr/lib/X11/XErrorDB"
+#else
+#define ERRORDB XERRORDB
+#endif
+#endif
+
+/*
+ * descriptions of errors in Section 4 of Protocol doc (pp. 350-351); more
+ * verbose descriptions are given in the error database
+ */
+static const char _XErrorList[] =
+    /* No error */          "no error\0"
+    /* BadRequest */        "BadRequest\0"
+    /* BadValue */          "BadValue\0"
+    /* BadWindow */         "BadWindow\0"
+    /* BadPixmap */         "BadPixmap\0"
+    /* BadAtom */           "BadAtom\0"
+    /* BadCursor */         "BadCursor\0"
+    /* BadFont */           "BadFont\0"
+    /* BadMatch */          "BadMatch\0"
+    /* BadDrawable */       "BadDrawable\0"
+    /* BadAccess */         "BadAccess\0"
+    /* BadAlloc */          "BadAlloc\0"
+    /* BadColor */          "BadColor\0"
+    /* BadGC */             "BadGC\0"
+    /* BadIDChoice */       "BadIDChoice\0"
+    /* BadName */           "BadName\0"
+    /* BadLength */         "BadLength\0"
+    /* BadImplementation */ "BadImplementation"
+;
+
+/* offsets into _XErrorList */
+static const unsigned char _XErrorOffsets[] = {
+    0, 9, 20, 29, 39, 49, 57, 67, 75, 84, 96,
+    106, 115, 124, 130, 142, 150, 160
+};
+
+
+int
+XGetErrorText(
+    register Display *dpy,
+    register int code,
+    char *buffer,
+    int nbytes)
+{
+    char buf[150];
+    register _XExtension *ext;
+    _XExtension *bext = (_XExtension *)NULL;
+
+    if (nbytes == 0) return 0;
+    if (code <= BadImplementation && code > 0) {
+       sprintf(buf, "%d", code);
+        (void) XGetErrorDatabaseText(dpy, "XProtoError", buf,
+                                     _XErrorList + _XErrorOffsets[code],
+                                    buffer, nbytes);
+    } else
+       buffer[0] = '\0';
+    /* call out to any extensions interested */
+    for (ext = dpy->ext_procs; ext; ext = ext->next) {
+       if (ext->error_string)
+           (*ext->error_string)(dpy, code, &ext->codes, buffer, nbytes);
+       if (ext->codes.first_error &&
+           ext->codes.first_error <= code &&
+           (!bext || ext->codes.first_error > bext->codes.first_error))
+           bext = ext;
+    }
+    if (!buffer[0] && bext) {
+       sprintf(buf, "%s.%d", bext->name, code - bext->codes.first_error);
+       (void) XGetErrorDatabaseText(dpy, "XProtoError", buf, "", buffer, nbytes);
+    }
+    if (!buffer[0])
+       sprintf(buffer, "%d", code);
+    return 0;
+}
+
+int
+/*ARGSUSED*/
+XGetErrorDatabaseText(
+    Display *dpy,
+    register _Xconst char *name,
+    register _Xconst char *type,
+    _Xconst char *defaultp,
+    char *buffer,
+    int nbytes)
+{
+
+    static XrmDatabase db = NULL;
+    XrmString type_str;
+    XrmValue result;
+    char temp[BUFSIZ];
+    char* tptr;
+    unsigned long tlen;
+
+    if (nbytes == 0) return 0;
+
+    if (!db) {
+       /* the Xrm routines expect to be called with the global
+          mutex unlocked. */
+       XrmDatabase temp_db;
+       int do_destroy;
+       const char *dbname;
+
+       XrmInitialize();
+#ifdef WIN32
+       dbname = getenv("XERRORDB");
+       if (!dbname)
+           dbname = ERRORDB;
+#else
+    dbname = ERRORDB;
+#endif
+       temp_db = XrmGetFileDatabase(dbname);
+
+       _XLockMutex(_Xglobal_lock);
+       if (!db) {
+           db = temp_db;
+           do_destroy = 0;
+       } else
+           do_destroy = 1;     /* we didn't need to get it after all */
+       _XUnlockMutex(_Xglobal_lock);
+
+       if (do_destroy)
+           XrmDestroyDatabase(temp_db);
+    }
+
+    if (db)
+    {
+       tlen = strlen (name) + strlen (type) + 2;
+       if (tlen <= sizeof(temp))
+           tptr = temp;
+       else
+           tptr = Xmalloc (tlen);
+       if (tptr) {
+           sprintf(tptr, "%s.%s", name, type);
+           XrmGetResource(db, tptr, "ErrorType.ErrorNumber",
+             &type_str, &result);
+           if (tptr != temp)
+               Xfree (tptr);
+       } else {
+           result.addr = (XPointer) NULL;
+       }
+    }
+    else
+       result.addr = (XPointer)NULL;
+    if (!result.addr) {
+       result.addr = (XPointer) defaultp;
+       result.size = strlen(defaultp) + 1;
+    }
+    (void) strncpy (buffer, (char *) result.addr, nbytes);
+    if (result.size > nbytes) buffer[nbytes-1] = '\0';
+    return 0;
+}
diff --git a/src/ErrHndlr.c b/src/ErrHndlr.c
new file mode 100644 (file)
index 0000000..167a68b
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+/*
+ * XErrorHandler - This procedure sets the X non-fatal error handler
+ * (_XErrorFunction) to be the specified routine.  If NULL is passed in
+ * the original error handler is restored.
+ */
+
+XErrorHandler
+XSetErrorHandler(XErrorHandler handler)
+{
+    int (*oldhandler)(Display *dpy, XErrorEvent *event);
+
+    _XLockMutex(_Xglobal_lock);
+    oldhandler = _XErrorFunction;
+
+    if (!oldhandler)
+       oldhandler = _XDefaultError;
+
+    if (handler != NULL) {
+       _XErrorFunction = handler;
+    }
+    else {
+       _XErrorFunction = _XDefaultError;
+    }
+    _XUnlockMutex(_Xglobal_lock);
+
+    return (XErrorHandler) oldhandler;
+}
+
+/*
+ * XIOErrorHandler - This procedure sets the X fatal I/O error handler
+ * (_XIOErrorFunction) to be the specified routine.  If NULL is passed in
+ * the original error handler is restored.
+ */
+
+XIOErrorHandler
+XSetIOErrorHandler(XIOErrorHandler handler)
+{
+    int (*oldhandler)(Display *dpy);
+
+    _XLockMutex(_Xglobal_lock);
+    oldhandler = _XIOErrorFunction;
+
+    if (!oldhandler)
+       oldhandler = _XDefaultIOError;
+
+    if (handler != NULL) {
+       _XIOErrorFunction = handler;
+    }
+    else {
+       _XIOErrorFunction = _XDefaultIOError;
+    }
+    _XUnlockMutex(_Xglobal_lock);
+
+    return (XIOErrorHandler) oldhandler;
+}
diff --git a/src/EvToWire.c b/src/EvToWire.c
new file mode 100644 (file)
index 0000000..4aca053
--- /dev/null
@@ -0,0 +1,406 @@
+
+/*
+
+Copyright 1985, 1986, 1987, 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.
+
+*/
+
+/*
+ *     XEvToWire.c - Internal support routines for the C subroutine
+ *     interface library (Xlib) to the X Window System Protocol V11.0.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+
+/*
+ * Reformat an XEvent structure to a wire event of the right type.
+ * Return True on success.  If the type is unrecognized, return what
+ * _XUnknownNativeEvent returns (i.e., False).
+ */
+Status
+_XEventToWire(
+    register Display *dpy,
+    register XEvent *re,        /* in: from */
+    register xEvent *event)     /* out: to */
+{
+       switch (event->u.u.type = re->type) {
+             case KeyPress:
+             case KeyRelease:
+               {
+                       register XKeyEvent *ev = (XKeyEvent*) re;
+                       event->u.keyButtonPointer.root  = ev->root;
+                       event->u.keyButtonPointer.event  = ev->window;
+                       event->u.keyButtonPointer.child  = ev->subwindow;
+                       event->u.keyButtonPointer.time   = ev->time;
+                       event->u.keyButtonPointer.eventX = ev->x ;
+                       event->u.keyButtonPointer.eventY = ev->y ;
+                       event->u.keyButtonPointer.rootX  = ev->x_root;
+                       event->u.keyButtonPointer.rootY  = ev->y_root;
+                       event->u.keyButtonPointer.state  = ev->state;
+                       event->u.keyButtonPointer.sameScreen = ev->same_screen;
+                       event->u.u.detail = ev->keycode;
+               }
+               break;
+             case ButtonPress:
+             case ButtonRelease:
+               {
+                       register XButtonEvent *ev =  (XButtonEvent *) re;
+                       event->u.keyButtonPointer.root   = ev->root;
+                       event->u.keyButtonPointer.event  = ev->window;
+                       event->u.keyButtonPointer.child  = ev->subwindow;
+                       event->u.keyButtonPointer.time   = ev->time;
+                       event->u.keyButtonPointer.eventX = ev->x;
+                       event->u.keyButtonPointer.eventY = ev->y;
+                       event->u.keyButtonPointer.rootX  = ev->x_root;
+                       event->u.keyButtonPointer.rootY  = ev->y_root;
+                       event->u.keyButtonPointer.state  = ev->state;
+                       event->u.keyButtonPointer.sameScreen    = ev->same_screen;
+                       event->u.u.detail               = ev->button;
+               }
+               break;
+             case MotionNotify:
+               {
+                       register XMotionEvent *ev =   (XMotionEvent *)re;
+                       event->u.keyButtonPointer.root  = ev->root;
+                       event->u.keyButtonPointer.event = ev->window;
+                       event->u.keyButtonPointer.child = ev->subwindow;
+                       event->u.keyButtonPointer.time  = ev->time;
+                       event->u.keyButtonPointer.eventX= ev->x;
+                       event->u.keyButtonPointer.eventY= ev->y;
+                       event->u.keyButtonPointer.rootX = ev->x_root;
+                       event->u.keyButtonPointer.rootY = ev->y_root;
+                       event->u.keyButtonPointer.state = ev->state;
+                       event->u.keyButtonPointer.sameScreen= ev->same_screen;
+                       event->u.u.detail               = ev->is_hint;
+               }
+               break;
+             case EnterNotify:
+             case LeaveNotify:
+               {
+                       register XCrossingEvent *ev   = (XCrossingEvent *) re;
+                       event->u.enterLeave.root        = ev->root;
+                       event->u.enterLeave.event       = ev->window;
+                       event->u.enterLeave.child       = ev->subwindow;
+                       event->u.enterLeave.time        = ev->time;
+                       event->u.enterLeave.eventX      = ev->x;
+                       event->u.enterLeave.eventY      = ev->y;
+                       event->u.enterLeave.rootX       = ev->x_root;
+                       event->u.enterLeave.rootY       = ev->y_root;
+                       event->u.enterLeave.state       = ev->state;
+                       event->u.enterLeave.mode        = ev->mode;
+                       event->u.enterLeave.flags       = 0;
+                       if (ev->same_screen) {
+                               event->u.enterLeave.flags |= ELFlagSameScreen;
+                               }
+                       if (ev->focus) {
+                               event->u.enterLeave.flags |= ELFlagFocus;
+                               }
+                       event->u.u.detail               = ev->detail;
+               }
+                 break;
+             case FocusIn:
+             case FocusOut:
+               {
+                       register XFocusChangeEvent *ev = (XFocusChangeEvent *) re;
+                       event->u.focus.window   = ev->window;
+                       event->u.focus.mode     = ev->mode;
+                       event->u.u.detail       = ev->detail;
+               }
+                 break;
+             case KeymapNotify:
+               {
+                       register XKeymapEvent *ev = (XKeymapEvent *) re;
+                       memcpy ((char *)(((xKeymapEvent *) event)->map),
+                               &ev->key_vector[1],
+                               sizeof (((xKeymapEvent *) event)->map));
+               }
+               break;
+             case Expose:
+               {
+                       register XExposeEvent *ev = (XExposeEvent *) re;
+                       event->u.expose.window          = ev->window;
+                       event->u.expose.x               = ev->x;
+                       event->u.expose.y               = ev->y;
+                       event->u.expose.width           = ev->width;
+                       event->u.expose.height          = ev->height;
+                       event->u.expose.count           = ev->count;
+               }
+               break;
+             case GraphicsExpose:
+               {
+                   register XGraphicsExposeEvent *ev =
+                       (XGraphicsExposeEvent *) re;
+                   event->u.graphicsExposure.drawable  = ev->drawable;
+                   event->u.graphicsExposure.x         = ev->x;
+                   event->u.graphicsExposure.y         = ev->y;
+                   event->u.graphicsExposure.width     = ev->width;
+                   event->u.graphicsExposure.height    = ev->height;
+                   event->u.graphicsExposure.count     = ev->count;
+                   event->u.graphicsExposure.majorEvent= ev->major_code;
+                   event->u.graphicsExposure.minorEvent= ev->minor_code;
+               }
+               break;
+             case NoExpose:
+               {
+                   register XNoExposeEvent *ev = (XNoExposeEvent *) re;
+                   event->u.noExposure.drawable        = ev->drawable;
+                   event->u.noExposure.majorEvent      = ev->major_code;
+                   event->u.noExposure.minorEvent      = ev->minor_code;
+               }
+               break;
+             case VisibilityNotify:
+               {
+                   register XVisibilityEvent *ev = (XVisibilityEvent *) re;
+                   event->u.visibility.window          = ev->window;
+                   event->u.visibility.state           = ev->state;
+               }
+               break;
+             case CreateNotify:
+               {
+                   register XCreateWindowEvent *ev =
+                        (XCreateWindowEvent *) re;
+                   event->u.createNotify.window        = ev->window;
+                   event->u.createNotify.parent        = ev->parent;
+                   event->u.createNotify.x             = ev->x;
+                   event->u.createNotify.y             = ev->y;
+                   event->u.createNotify.width         = ev->width;
+                   event->u.createNotify.height        = ev->height;
+                   event->u.createNotify.borderWidth   = ev->border_width;
+                   event->u.createNotify.override      = ev->override_redirect;
+               }
+               break;
+             case DestroyNotify:
+               {
+                   register XDestroyWindowEvent *ev =
+                               (XDestroyWindowEvent *) re;
+                   event->u.destroyNotify.window       = ev->window;
+                   event->u.destroyNotify.event        = ev->event;
+               }
+               break;
+             case UnmapNotify:
+               {
+                   register XUnmapEvent *ev = (XUnmapEvent *) re;
+                   event->u.unmapNotify.window = ev->window;
+                   event->u.unmapNotify.event  = ev->event;
+                   event->u.unmapNotify.fromConfigure  = ev->from_configure;
+               }
+               break;
+             case MapNotify:
+               {
+                   register XMapEvent *ev = (XMapEvent *) re;
+                   event->u.mapNotify.window   = ev->window;
+                   event->u.mapNotify.event    = ev->event;
+                   event->u.mapNotify.override = ev->override_redirect;
+               }
+               break;
+             case MapRequest:
+               {
+                   register XMapRequestEvent *ev = (XMapRequestEvent *) re;
+                   event->u.mapRequest.window  = ev->window;
+                   event->u.mapRequest.parent  = ev->parent;
+               }
+               break;
+             case ReparentNotify:
+               {
+                   register XReparentEvent *ev = (XReparentEvent *) re;
+                   event->u.reparent.window    = ev->window;
+                   event->u.reparent.event     = ev->event;
+                   event->u.reparent.parent    = ev->parent;
+                   event->u.reparent.x         = ev->x;
+                   event->u.reparent.y         = ev->y;
+                   event->u.reparent.override  = ev->override_redirect;
+               }
+               break;
+             case ConfigureNotify:
+               {
+                   register XConfigureEvent *ev = (XConfigureEvent *) re;
+                   event->u.configureNotify.window     = ev->window;
+                   event->u.configureNotify.event      = ev->event;
+                   event->u.configureNotify.aboveSibling       = ev->above;
+                   event->u.configureNotify.x          = ev->x;
+                   event->u.configureNotify.y          = ev->y;
+                   event->u.configureNotify.width      = ev->width;
+                   event->u.configureNotify.height     = ev->height;
+                   event->u.configureNotify.borderWidth= ev->border_width;
+                   event->u.configureNotify.override   = ev->override_redirect;
+               }
+               break;
+             case ConfigureRequest:
+               {
+                   register XConfigureRequestEvent *ev =
+                       (XConfigureRequestEvent *) re;
+                   event->u.configureRequest.window    = ev->window;
+                   event->u.configureRequest.parent    = ev->parent;
+                   event->u.configureRequest.sibling   = ev->above;
+                   event->u.configureRequest.x         = ev->x;
+                   event->u.configureRequest.y         = ev->y;
+                   event->u.configureRequest.width     = ev->width;
+                   event->u.configureRequest.height    = ev->height;
+                   event->u.configureRequest.borderWidth= ev->border_width;
+                   event->u.configureRequest.valueMask= ev->value_mask;
+                   event->u.u.detail                   = ev->detail;
+               }
+               break;
+             case GravityNotify:
+               {
+                   register XGravityEvent *ev  = (XGravityEvent *) re;
+                   event->u.gravity.window     = ev->window;
+                   event->u.gravity.event      = ev->event;
+                   event->u.gravity.x          = ev->x;
+                   event->u.gravity.y          = ev->y;
+               }
+               break;
+             case ResizeRequest:
+               {
+                   register XResizeRequestEvent *ev =
+                       (XResizeRequestEvent *) re;
+                   event->u.resizeRequest.window       = ev->window;
+                   event->u.resizeRequest.width        = ev->width;
+                   event->u.resizeRequest.height       = ev->height;
+               }
+               break;
+             case CirculateNotify:
+               {
+                   register XCirculateEvent *ev = (XCirculateEvent *) re;
+                   event->u.circulate.window           = ev->window;
+                   event->u.circulate.event            = ev->event;
+                   event->u.circulate.place            = ev->place;
+               }
+               break;
+             case CirculateRequest:
+               {
+                   register XCirculateRequestEvent *ev =
+                       (XCirculateRequestEvent *) re;
+                   event->u.circulate.window           = ev->window;
+                   event->u.circulate.event            = ev->parent;
+                   event->u.circulate.place            = ev->place;
+               }
+               break;
+             case PropertyNotify:
+               {
+                   register XPropertyEvent *ev = (XPropertyEvent *) re;
+                   event->u.property.window            = ev->window;
+                   event->u.property.atom              = ev->atom;
+                   event->u.property.time              = ev->time;
+                   event->u.property.state             = ev->state;
+               }
+               break;
+             case SelectionClear:
+               {
+                   register XSelectionClearEvent *ev =
+                        (XSelectionClearEvent *) re;
+                   event->u.selectionClear.window      = ev->window;
+                   event->u.selectionClear.atom        = ev->selection;
+                   event->u.selectionClear.time        = ev->time;
+               }
+               break;
+             case SelectionRequest:
+               {
+                   register XSelectionRequestEvent *ev =
+                       (XSelectionRequestEvent *) re;
+                   event->u.selectionRequest.owner     = ev->owner;
+                   event->u.selectionRequest.requestor = ev->requestor;
+                   event->u.selectionRequest.selection = ev->selection;
+                   event->u.selectionRequest.target    = ev->target;
+                   event->u.selectionRequest.property  = ev->property;
+                   event->u.selectionRequest.time      = ev->time;
+               }
+               break;
+             case SelectionNotify:
+               {
+                   register XSelectionEvent *ev = (XSelectionEvent *) re;
+                   event->u.selectionNotify.requestor  = ev->requestor;
+                   event->u.selectionNotify.selection  = ev->selection;
+                   event->u.selectionNotify.target     = ev->target;
+                   event->u.selectionNotify.property   = ev->property;
+                   event->u.selectionNotify.time       = ev->time;
+               }
+               break;
+             case ColormapNotify:
+               {
+                   register XColormapEvent *ev = (XColormapEvent *) re;
+                   event->u.colormap.window            = ev->window;
+                   event->u.colormap.colormap          = ev->colormap;
+                   event->u.colormap.new               = ev->new;
+                   event->u.colormap.state             = ev->state;
+               }
+               break;
+             case ClientMessage:
+               {
+                  register int i;
+                  register XClientMessageEvent *ev
+                                       = (XClientMessageEvent *) re;
+                  event->u.clientMessage.window = ev->window;
+                  event->u.u.detail             = ev->format;
+                  switch (ev->format) {
+                       case 8:
+                         event->u.clientMessage.u.b.type   = ev->message_type;
+                         for (i = 0; i < 20; i++)
+                          event->u.clientMessage.u.b.bytes[i] = ev->data.b[i];
+                         break;
+                       case 16:
+                         event->u.clientMessage.u.s.type   = ev->message_type;
+                         event->u.clientMessage.u.s.shorts0   = ev->data.s[0];
+                         event->u.clientMessage.u.s.shorts1   = ev->data.s[1];
+                         event->u.clientMessage.u.s.shorts2   = ev->data.s[2];
+                         event->u.clientMessage.u.s.shorts3   = ev->data.s[3];
+                         event->u.clientMessage.u.s.shorts4   = ev->data.s[4];
+                         event->u.clientMessage.u.s.shorts5   = ev->data.s[5];
+                         event->u.clientMessage.u.s.shorts6   = ev->data.s[6];
+                         event->u.clientMessage.u.s.shorts7   = ev->data.s[7];
+                         event->u.clientMessage.u.s.shorts8   = ev->data.s[8];
+                         event->u.clientMessage.u.s.shorts9   = ev->data.s[9];
+                         break;
+                       case 32:
+                         event->u.clientMessage.u.l.type   = ev->message_type;
+                         event->u.clientMessage.u.l.longs0   = ev->data.l[0];
+                         event->u.clientMessage.u.l.longs1   = ev->data.l[1];
+                         event->u.clientMessage.u.l.longs2   = ev->data.l[2];
+                         event->u.clientMessage.u.l.longs3   = ev->data.l[3];
+                         event->u.clientMessage.u.l.longs4   = ev->data.l[4];
+                         break;
+                       default:
+                         /* client passing bogus data, let server complain */
+                         break;
+                       }
+                   }
+               break;
+             case MappingNotify:
+                 {
+                   register XMappingEvent *ev = (XMappingEvent *) re;
+                   event->u.mappingNotify.firstKeyCode = ev->first_keycode;
+                   event->u.mappingNotify.request      = ev->request;
+                   event->u.mappingNotify.count        = ev->count;
+                  }
+               break;
+
+             default:
+               return(_XUnknownNativeEvent(dpy, re, event));
+       }
+       return(1);
+}
diff --git a/src/FSSaver.c b/src/FSSaver.c
new file mode 100644 (file)
index 0000000..3df8ae6
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+
+Copyright 1987, 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 "Xlibint.h"
+
+int
+XActivateScreenSaver(register Display *dpy)
+{
+    XForceScreenSaver (dpy, ScreenSaverActive);
+    return 1;
+}
+
+int
+XResetScreenSaver(register Display *dpy)
+{
+    XForceScreenSaver (dpy, ScreenSaverReset);
+    return 1;
+}
+
+int
+XForceScreenSaver(
+    register Display *dpy,
+    int mode)
+{
+    register xForceScreenSaverReq *req;
+
+    LockDisplay(dpy);
+    GetReq(ForceScreenSaver, req);
+    req->mode = mode;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/FSWrap.c b/src/FSWrap.c
new file mode 100644 (file)
index 0000000..910e602
--- /dev/null
@@ -0,0 +1,262 @@
+
+/*
+ * Copyright 1991 by the Open Software Foundation
+ * Copyright 1993 by the TOSHIBA Corp.
+ *
+ * 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 Open Software Foundation
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Open Software
+ * Foundation makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *
+ * OPEN SOFTWARE FOUNDATION DISCLAIMS ALL WARRANTIES WITH REGARD TO
+ * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS, IN NO EVENT SHALL OPEN SOFTWARE FOUNDATIONN 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.
+ *
+ *              M. Collins             OSF
+ *
+ *              Katsuhisa Yano         TOSHIBA Corp.
+ */
+
+/*
+
+Copyright 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.
+
+*/
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include <ctype.h>
+#include <X11/Xos.h>
+
+
+#define        XMAXLIST        256
+
+char **
+_XParseBaseFontNameList(
+    char           *str,
+    int            *num)
+{
+    char           *plist[XMAXLIST];
+    char          **list;
+    char           *ptr, *psave;
+
+    *num = 0;
+    if (!str || !*str) {
+       return (char **)NULL;
+    }
+    while (*str && isspace(*str))
+       str++;
+    if (!*str)
+       return (char **)NULL;
+
+    if (!(ptr = strdup(str))) {
+       return (char **)NULL;
+    }
+
+    psave = ptr;
+    /* somebody who specifies more than XMAXLIST basefontnames will lose */
+    while (*num < (sizeof plist / sizeof plist[0])) {
+       char    *back;
+
+       plist[*num] = ptr;
+       if ((ptr = strchr(ptr, ','))) {
+           back = ptr;
+       } else {
+           back = plist[*num] + strlen(plist[*num]);
+       }
+       while (isspace(*(back - 1)))
+           back--;
+       *back = '\0';
+       (*num)++;
+       if (!ptr)
+           break;
+       ptr++;
+       while (*ptr && isspace(*ptr))
+           ptr++;
+       if (!*ptr)
+           break;
+    }
+    if (!(list = (char **) Xmalloc((unsigned)sizeof(char *) * (*num + 1)))) {
+       Xfree(psave);
+       return (char **)NULL;
+    }
+    memcpy((char *)list, (char *)plist, sizeof(char *) * (*num));
+    *(list + *num) = NULL;
+
+    return list;
+}
+
+static char **
+copy_string_list(
+    char **string_list,
+    int list_count)
+{
+    char **string_list_ret, **list_src, **list_dst, *dst;
+    int length, count;
+
+    if (string_list == NULL || list_count <= 0)
+       return (char **) NULL;
+
+    string_list_ret = (char **) Xmalloc(sizeof(char *) * list_count);
+    if (string_list_ret == NULL)
+       return (char **) NULL;
+
+    list_src = string_list;
+    count = list_count;
+    for (length = 0; count-- > 0; list_src++)
+       length += strlen(*list_src) + 1;
+
+    dst = (char *) Xmalloc(length);
+    if (dst == NULL) {
+       Xfree(string_list_ret);
+       return (char **) NULL;
+    }
+
+    list_src = string_list;
+    count = list_count;
+    list_dst = string_list_ret;
+    for ( ;  count-- > 0; list_src++) {
+       strcpy(dst, *list_src);
+       *list_dst++ = dst;
+       dst += strlen(dst) + 1;
+    }
+
+    return string_list_ret;
+}
+
+XFontSet
+XCreateFontSet (
+    Display        *dpy,
+    _Xconst char   *base_font_name_list,
+    char         ***missing_charset_list,
+    int            *missing_charset_count,
+    char          **def_string)
+{
+    XOM om;
+    XOC oc;
+    XOMCharSetList *list;
+
+    *missing_charset_list = NULL;
+    *missing_charset_count = 0;
+
+    om = XOpenOM(dpy, NULL, NULL, NULL);
+    if (om == NULL)
+       return (XFontSet) NULL;
+
+    if ((oc = XCreateOC(om, XNBaseFontName, base_font_name_list, NULL))) {
+       list = &oc->core.missing_list;
+       oc->core.om_automatic = True;
+    } else
+       list = &om->core.required_charset;
+
+    *missing_charset_list = copy_string_list(list->charset_list,
+                                            list->charset_count);
+    *missing_charset_count = list->charset_count;
+
+    if (list->charset_list && *missing_charset_list == NULL)
+       oc = NULL;
+
+    if (oc && def_string) {
+       *def_string = oc->core.default_string;
+       if (!*def_string)
+           *def_string = "";
+    }
+
+    if (oc == NULL)
+       XCloseOM(om);
+
+    return (XFontSet) oc;
+}
+
+int
+XFontsOfFontSet(
+    XFontSet        font_set,
+    XFontStruct  ***font_struct_list,
+    char         ***font_name_list)
+{
+    *font_name_list   = font_set->core.font_info.font_name_list;
+    *font_struct_list = font_set->core.font_info.font_struct_list;
+    return font_set->core.font_info.num_font;
+}
+
+char *
+XBaseFontNameListOfFontSet(XFontSet font_set)
+{
+    return font_set->core.base_name_list;
+}
+
+char *
+XLocaleOfFontSet(XFontSet font_set)
+{
+    return font_set->core.om->core.lcd->core->name;
+}
+
+Bool
+XContextDependentDrawing(XFontSet font_set)
+{
+    return font_set->core.om->core.context_dependent;
+}
+
+Bool
+XDirectionalDependentDrawing(XFontSet font_set)
+{
+    return font_set->core.om->core.directional_dependent;
+}
+
+Bool
+XContextualDrawing(XFontSet font_set)
+{
+    return font_set->core.om->core.contextual_drawing;
+}
+
+XFontSetExtents *
+XExtentsOfFontSet(XFontSet font_set)
+{
+    if (!font_set)
+       return NULL;
+    return &font_set->core.font_set_extents;
+}
+
+void
+XFreeFontSet(
+    Display        *dpy,
+    XFontSet        font_set)
+{
+    XCloseOM(font_set->core.om);
+}
diff --git a/src/FetchName.c b/src/FetchName.c
new file mode 100644 (file)
index 0000000..22bd460
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+
+Copyright 1986, 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 <X11/Xlibint.h>
+#include <X11/Xatom.h>
+#include <X11/Xos.h>
+#include <stdio.h>
+
+
+Status XFetchName (
+    register Display *dpy,
+    Window w,
+    char **name)
+{
+    Atom actual_type;
+    int actual_format;
+    unsigned long nitems;
+    unsigned long leftover;
+    unsigned char *data = NULL;
+    if (XGetWindowProperty(dpy, w, XA_WM_NAME, 0L, (long)BUFSIZ, False, XA_STRING,
+       &actual_type,
+       &actual_format, &nitems, &leftover, &data) != Success) {
+        *name = NULL;
+       return (0);
+       }
+    if ( (actual_type == XA_STRING) &&  (actual_format == 8) ) {
+
+       /* The data returned by XGetWindowProperty is guarranteed to
+       contain one extra byte that is null terminated to make retrieveing
+       string properties easy. */
+
+       *name = (char *)data;
+       return(1);
+       }
+    if (data) Xfree ((char *)data);
+    *name = NULL;
+    return(0);
+}
+
+Status XGetIconName (
+    register Display *dpy,
+    Window w,
+    char **icon_name)
+{
+    Atom actual_type;
+    int actual_format;
+    unsigned long nitems;
+    unsigned long leftover;
+    unsigned char *data = NULL;
+    if (XGetWindowProperty(dpy, w, XA_WM_ICON_NAME, 0L, (long)BUFSIZ, False,
+        XA_STRING,
+       &actual_type,
+       &actual_format, &nitems, &leftover, &data) != Success) {
+        *icon_name = NULL;
+       return (0);
+       }
+    if ( (actual_type == XA_STRING) &&  (actual_format == 8) ) {
+
+       /* The data returned by XGetWindowProperty is guarranteed to
+       contain one extra byte that is null terminated to make retrieveing
+       string properties easy. */
+
+       *icon_name = (char*)data;
+       return(1);
+       }
+    if (data) Xfree ((char *)data);
+    *icon_name = NULL;
+    return(0);
+}
diff --git a/src/FillArc.c b/src/FillArc.c
new file mode 100644 (file)
index 0000000..0f1ad02
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+/* precompute the maximum size of batching request allowed */
+
+#define size (SIZEOF(xPolyFillArcReq) + FARCSPERBATCH * SIZEOF(xArc))
+
+int
+XFillArc(
+    register Display *dpy,
+    Drawable d,
+    GC gc,
+    int x,
+    int y, /* INT16 */
+    unsigned int width,
+    unsigned int height, /* CARD16 */
+    int angle1,
+    int angle2) /* INT16 */
+{
+    xArc *arc;
+#ifdef MUSTCOPY
+    xArc arcdata;
+    long len = SIZEOF(xArc);
+
+    arc = &arcdata;
+#endif /* MUSTCOPY */
+
+    LockDisplay(dpy);
+    FlushGC(dpy, gc);
+
+    {
+    register xPolyFillArcReq *req = (xPolyFillArcReq *) dpy->last_req;
+
+    /* if same as previous request, with same drawable, batch requests */
+    if (
+          (req->reqType == X_PolyFillArc)
+       && (req->drawable == d)
+       && (req->gc == gc->gid)
+       && ((dpy->bufptr + SIZEOF(xArc)) <= dpy->bufmax)
+       && (((char *)dpy->bufptr - (char *)req) < size) ) {
+        req->length += SIZEOF(xArc) >> 2;
+#ifndef MUSTCOPY
+         arc = (xArc *) dpy->bufptr;
+        dpy->bufptr += SIZEOF(xArc);
+#endif /* not MUSTCOPY */
+        }
+
+    else {
+       GetReqExtra(PolyFillArc, SIZEOF(xArc), req);
+
+       req->drawable = d;
+       req->gc = gc->gid;
+#ifdef MUSTCOPY
+       dpy->bufptr -= SIZEOF(xArc);
+#else
+       arc = (xArc *) NEXTPTR(req,xPolyFillArcReq);
+#endif /* MUSTCOPY */
+       }
+    arc->x = x;
+    arc->y = y;
+    arc->width = width;
+    arc->height = height;
+    arc->angle1 = angle1;
+    arc->angle2 = angle2;
+
+#ifdef MUSTCOPY
+    Data (dpy, (char *) arc, len);
+#endif /* MUSTCOPY */
+
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/FillArcs.c b/src/FillArcs.c
new file mode 100644 (file)
index 0000000..62cfabf
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+#define arc_scale (SIZEOF(xArc) / 4)
+
+int
+XFillArcs(
+    register Display *dpy,
+    Drawable d,
+    GC gc,
+    XArc *arcs,
+    int n_arcs)
+{
+    register xPolyFillArcReq *req;
+    long len;
+    int n;
+
+    LockDisplay(dpy);
+    FlushGC(dpy, gc);
+    while (n_arcs) {
+       GetReq(PolyFillArc, req);
+       req->drawable = d;
+       req->gc = gc->gid;
+       n = n_arcs;
+       len = ((long)n) * arc_scale;
+       if (!dpy->bigreq_size && len > (dpy->max_request_size - req->length)) {
+           n = (dpy->max_request_size - req->length) / arc_scale;
+           len = ((long)n) * arc_scale;
+       }
+       SetReqLen(req, len, len);
+       len <<= 2; /* watch out for macros... */
+       Data16 (dpy, (short *) arcs, len);
+       n_arcs -= n;
+       arcs += n;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/FillPoly.c b/src/FillPoly.c
new file mode 100644 (file)
index 0000000..ea162a4
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XFillPolygon(
+    register Display *dpy,
+    Drawable d,
+    GC gc,
+    XPoint *points,
+    int n_points,
+    int shape,
+    int mode)
+{
+    register xFillPolyReq *req;
+    register long nbytes;
+
+    LockDisplay(dpy);
+    FlushGC(dpy, gc);
+    GetReq(FillPoly, req);
+
+    req->drawable = d;
+    req->gc = gc->gid;
+    req->shape = shape;
+    req->coordMode = mode;
+
+    SetReqLen(req, n_points, 65535 - req->length);
+
+    /* shift (mult. by 4) before passing to the (possible) macro */
+
+    nbytes = n_points << 2;
+
+    Data16 (dpy, (short *) points, nbytes);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/FillRct.c b/src/FillRct.c
new file mode 100644 (file)
index 0000000..4cd104c
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+/* precompute the maximum size of batching request allowed */
+
+#define size (SIZEOF(xPolyFillRectangleReq) + FRCTSPERBATCH * SIZEOF(xRectangle))
+
+int
+XFillRectangle(
+    register Display *dpy,
+    Drawable d,
+    GC gc,
+    int x,
+    int y, /* INT16 */
+    unsigned int width,
+    unsigned int height) /* CARD16 */
+{
+    xRectangle *rect;
+#ifdef MUSTCOPY
+    xRectangle rectdata;
+    long len = SIZEOF(xRectangle);
+
+    rect = &rectdata;
+#endif /* MUSTCOPY */
+
+    LockDisplay(dpy);
+    FlushGC(dpy, gc);
+
+    {
+    register xPolyFillRectangleReq *req
+               = (xPolyFillRectangleReq *) dpy->last_req;
+
+    /* if same as previous request, with same drawable, batch requests */
+    if (
+          (req->reqType == X_PolyFillRectangle)
+       && (req->drawable == d)
+       && (req->gc == gc->gid)
+       && ((dpy->bufptr + SIZEOF(xRectangle)) <= dpy->bufmax)
+       && (((char *)dpy->bufptr - (char *)req) < size) ) {
+        req->length += SIZEOF(xRectangle) >> 2;
+#ifndef MUSTCOPY
+         rect = (xRectangle *) dpy->bufptr;
+        dpy->bufptr += SIZEOF(xRectangle);
+#endif /* not MUSTCOPY */
+        }
+
+    else {
+       GetReqExtra(PolyFillRectangle, SIZEOF(xRectangle), req);
+       req->drawable = d;
+       req->gc = gc->gid;
+#ifdef MUSTCOPY
+       dpy->bufptr -= SIZEOF(xRectangle);
+#else
+       rect = (xRectangle *) NEXTPTR(req,xPolyFillRectangleReq);
+#endif /* MUSTCOPY */
+       }
+    rect->x = x;
+    rect->y = y;
+    rect->width = width;
+    rect->height = height;
+
+#ifdef MUSTCOPY
+    Data (dpy, (char *) rect, len);
+#endif /* MUSTCOPY */
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/FillRcts.c b/src/FillRcts.c
new file mode 100644 (file)
index 0000000..ad33424
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XFillRectangles(
+    register Display *dpy,
+    Drawable d,
+    GC gc,
+    XRectangle *rectangles,
+    int n_rects)
+{
+    register xPolyFillRectangleReq *req;
+    long len;
+    int n;
+
+    LockDisplay(dpy);
+    FlushGC(dpy, gc);
+    while (n_rects) {
+       GetReq(PolyFillRectangle, req);
+       req->drawable = d;
+       req->gc = gc->gid;
+       n = n_rects;
+       len = ((long)n) << 1;
+       if (!dpy->bigreq_size && len > (dpy->max_request_size - req->length)) {
+           n = (dpy->max_request_size - req->length) >> 1;
+           len = ((long)n) << 1;
+       }
+       SetReqLen(req, len, len);
+       len <<= 2; /* watch out for macros... */
+       Data16 (dpy, (short *) rectangles, len);
+       n_rects -= n;
+       rectangles += n;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/FilterEv.c b/src/FilterEv.c
new file mode 100644 (file)
index 0000000..0a48e54
--- /dev/null
@@ -0,0 +1,106 @@
+
+ /*
+  * Copyright 1990, 1991 by OMRON Corporation
+  *
+  * 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 OMRON not be used in
+  * advertising or publicity pertaining to distribution of the software without
+  * specific, written prior permission.  OMRON makes no representations
+  * about the suitability of this software for any purpose.  It is provided
+  * "as is" without express or implied warranty.
+  *
+  * OMRON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+  * EVENT SHALL OMRON 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
+  * TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+  * PERFORMANCE OF THIS SOFTWARE.
+  *
+  *    Author: Seiji Kuwari    OMRON Corporation
+  *                            kuwa@omron.co.jp
+  *                            kuwa%omron.co.jp@uunet.uu.net
+  */
+
+/*
+
+Copyright 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.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#else
+#define XLOCALE 1
+#endif
+#include "Xlibint.h"
+#if XLOCALE
+#include "Xlcint.h"
+#endif
+
+extern long const _Xevent_to_mask[];
+
+/*
+ * Look up if there is a specified filter for the event.
+ */
+Bool
+XFilterEvent(
+    XEvent *ev,
+    Window window)
+{
+#if XLOCALE
+    XFilterEventList   p;
+    Window             win;
+    long               mask;
+    Bool               ret;
+
+    if (window)
+       win = window;
+    else
+       win = ev->xany.window;
+    if (ev->type >= LASTEvent)
+       mask = 0;
+    else
+       mask = _Xevent_to_mask[ev->type];
+
+    LockDisplay(ev->xany.display);
+    for (p = ev->xany.display->im_filters; p != NULL; p = p->next) {
+       if (win == p->window) {
+           if ((mask & p->event_mask) ||
+               (ev->type >= p->start_type && ev->type <= p->end_type)) {
+               UnlockDisplay(ev->xany.display);
+               ret = (*(p->filter))(ev->xany.display, p->window, ev,
+                                     p->client_data);
+               return(ret);
+           }
+       }
+    }
+    UnlockDisplay(ev->xany.display);
+#endif
+    return(False);
+}
diff --git a/src/Flush.c b/src/Flush.c
new file mode 100644 (file)
index 0000000..4616899
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+/* Flush all buffered output requests. */
+/* NOTE: NOT necessary when calling any of the Xlib routines. */
+
+int
+XFlush (register Display *dpy)
+{
+    LockDisplay(dpy);
+    _XFlush (dpy);
+    UnlockDisplay(dpy);
+    return 1;
+    }
diff --git a/src/Font.c b/src/Font.c
new file mode 100644 (file)
index 0000000..7f56f68
--- /dev/null
@@ -0,0 +1,730 @@
+/*
+
+Copyright 1986, 1998  The Open Group
+Copyright (c) 2000  The XFree86 Project, Inc.
+
+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
+X CONSORTIUM OR THE XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION 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 or of the
+XFree86 Project 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 and the XFree86 Project.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+
+#if defined(XF86BIGFONT) && !defined(MUSTCOPY)
+#define USE_XF86BIGFONT
+#endif
+#ifdef USE_XF86BIGFONT
+#include <sys/types.h>
+#ifdef HAS_SHM
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <X11/extensions/xf86bigfproto.h>
+#endif
+
+#include "Xlcint.h"
+#include "XlcPubI.h"
+
+
+static XFontStruct *_XQueryFont(
+    Display*           /* dpy */,
+    Font               /* fid */,
+    unsigned long      /* seq */
+);
+
+#ifdef USE_XF86BIGFONT
+
+/* Private data for this extension. */
+typedef struct {
+    XExtCodes *codes;
+    CARD32 serverSignature;
+    CARD32 serverCapabilities;
+} XF86BigfontCodes;
+
+/* Additional bit masks that can be set in serverCapabilities */
+#define CAP_VerifiedLocal 256
+
+static XF86BigfontCodes *_XF86BigfontCodes(
+    Display*           /* dpy */
+);
+
+static XFontStruct *_XF86BigfontQueryFont(
+    Display*           /* dpy */,
+    XF86BigfontCodes*  /* extcodes */,
+    Font               /* fid */,
+    unsigned long      /* seq */
+);
+
+void _XF86BigfontFreeFontMetrics(
+    XFontStruct*       /* fs */
+);
+
+#endif /* USE_XF86BIGFONT */
+
+
+XFontStruct *XLoadQueryFont(
+   register Display *dpy,
+   _Xconst char *name)
+{
+    XFontStruct *font_result;
+    register long nbytes;
+    Font fid;
+    xOpenFontReq *req;
+    unsigned long seq;
+#ifdef USE_XF86BIGFONT
+    XF86BigfontCodes *extcodes = _XF86BigfontCodes(dpy);
+#endif
+
+    if (_XF86LoadQueryLocaleFont(dpy, name, &font_result, (Font *)0))
+      return font_result;
+    LockDisplay(dpy);
+    GetReq(OpenFont, req);
+    seq = dpy->request;
+    nbytes = req->nbytes  = name ? strlen(name) : 0;
+    req->fid = fid = XAllocID(dpy);
+    req->length += (nbytes+3)>>2;
+    Data (dpy, name, nbytes);
+    font_result = NULL;
+#ifdef USE_XF86BIGFONT
+    if (extcodes) {
+       font_result = _XF86BigfontQueryFont(dpy, extcodes, fid, seq);
+       seq = 0;
+    }
+#endif
+    if (!font_result)
+       font_result = _XQueryFont(dpy, fid, seq);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return font_result;
+}
+
+XFontStruct *XQueryFont (
+    register Display *dpy,
+    Font fid)
+{
+    XFontStruct *font_result;
+#ifdef USE_XF86BIGFONT
+    XF86BigfontCodes *extcodes = _XF86BigfontCodes(dpy);
+#endif
+
+    LockDisplay(dpy);
+    font_result = NULL;
+#ifdef USE_XF86BIGFONT
+    if (extcodes) {
+       font_result = _XF86BigfontQueryFont(dpy, extcodes, fid, 0L);
+    }
+#endif
+    if (!font_result)
+       font_result = _XQueryFont(dpy, fid, 0L);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return font_result;
+}
+
+int
+XFreeFont(
+    register Display *dpy,
+    XFontStruct *fs)
+{
+    register xResourceReq *req;
+    register _XExtension *ext;
+
+    LockDisplay(dpy);
+    /* call out to any extensions interested */
+    for (ext = dpy->ext_procs; ext; ext = ext->next)
+       if (ext->free_Font) (*ext->free_Font)(dpy, fs, &ext->codes);
+    GetResReq (CloseFont, fs->fid, req);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    if (fs->per_char) {
+#ifdef USE_XF86BIGFONT
+       _XF86BigfontFreeFontMetrics(fs);
+#else
+       Xfree ((char *) fs->per_char);
+#endif
+    }
+    _XFreeExtData(fs->ext_data);
+    if (fs->properties)
+       Xfree ((char *) fs->properties);
+    Xfree ((char *) fs);
+    return 1;
+}
+
+
+static XFontStruct *
+_XQueryFont (
+    register Display *dpy,
+    Font fid,
+    unsigned long seq)
+{
+    register XFontStruct *fs;
+    register long nbytes;
+    xQueryFontReply reply;
+    register xResourceReq *req;
+    register _XExtension *ext;
+    _XAsyncHandler async;
+    _XAsyncErrorState async_state;
+
+    if (seq) {
+       async_state.min_sequence_number = seq;
+       async_state.max_sequence_number = seq;
+       async_state.error_code = BadName;
+       async_state.major_opcode = X_OpenFont;
+       async_state.minor_opcode = 0;
+       async_state.error_count = 0;
+       async.next = dpy->async_handlers;
+       async.handler = _XAsyncErrorHandler;
+       async.data = (XPointer)&async_state;
+       dpy->async_handlers = &async;
+    }
+    GetResReq(QueryFont, fid, req);
+    if (!_XReply (dpy, (xReply *) &reply,
+       ((SIZEOF(xQueryFontReply) - SIZEOF(xReply)) >> 2), xFalse)) {
+       if (seq)
+           DeqAsyncHandler(dpy, &async);
+       return (XFontStruct *)NULL;
+    }
+    if (seq)
+       DeqAsyncHandler(dpy, &async);
+    if (! (fs = (XFontStruct *) Xmalloc (sizeof (XFontStruct)))) {
+       _XEatData(dpy, (unsigned long)(reply.nFontProps * SIZEOF(xFontProp) +
+                                      reply.nCharInfos * SIZEOF(xCharInfo)));
+       return (XFontStruct *)NULL;
+    }
+    fs->ext_data               = NULL;
+    fs->fid                    = fid;
+    fs->direction              = reply.drawDirection;
+    fs->min_char_or_byte2      = reply.minCharOrByte2;
+    fs->max_char_or_byte2      = reply.maxCharOrByte2;
+    fs->min_byte1              = reply.minByte1;
+    fs->max_byte1              = reply.maxByte1;
+    fs->default_char           = reply.defaultChar;
+    fs->all_chars_exist        = reply.allCharsExist;
+    fs->ascent                         = cvtINT16toInt (reply.fontAscent);
+    fs->descent                = cvtINT16toInt (reply.fontDescent);
+
+#ifdef MUSTCOPY
+    {
+       xCharInfo *xcip;
+
+       xcip = (xCharInfo *) &reply.minBounds;
+       fs->min_bounds.lbearing = cvtINT16toShort(xcip->leftSideBearing);
+       fs->min_bounds.rbearing = cvtINT16toShort(xcip->rightSideBearing);
+       fs->min_bounds.width = cvtINT16toShort(xcip->characterWidth);
+       fs->min_bounds.ascent = cvtINT16toShort(xcip->ascent);
+       fs->min_bounds.descent = cvtINT16toShort(xcip->descent);
+       fs->min_bounds.attributes = xcip->attributes;
+
+       xcip = (xCharInfo *) &reply.maxBounds;
+       fs->max_bounds.lbearing = cvtINT16toShort(xcip->leftSideBearing);
+       fs->max_bounds.rbearing =  cvtINT16toShort(xcip->rightSideBearing);
+       fs->max_bounds.width =  cvtINT16toShort(xcip->characterWidth);
+       fs->max_bounds.ascent =  cvtINT16toShort(xcip->ascent);
+       fs->max_bounds.descent =  cvtINT16toShort(xcip->descent);
+       fs->max_bounds.attributes = xcip->attributes;
+    }
+#else
+    /* XXX the next two statements won't work if short isn't 16 bits */
+    fs->min_bounds = * (XCharStruct *) &reply.minBounds;
+    fs->max_bounds = * (XCharStruct *) &reply.maxBounds;
+#endif /* MUSTCOPY */
+
+    fs->n_properties = reply.nFontProps;
+    /*
+     * if no properties defined for the font, then it is bad
+     * font, but shouldn't try to read nothing.
+     */
+    fs->properties = NULL;
+    if (fs->n_properties > 0) {
+           nbytes = reply.nFontProps * sizeof(XFontProp);
+           fs->properties = (XFontProp *) Xmalloc ((unsigned) nbytes);
+           nbytes = reply.nFontProps * SIZEOF(xFontProp);
+           if (! fs->properties) {
+               Xfree((char *) fs);
+               _XEatData(dpy, (unsigned long)
+                         (nbytes + reply.nCharInfos * SIZEOF(xCharInfo)));
+               return (XFontStruct *)NULL;
+           }
+           _XRead32 (dpy, (long *)fs->properties, nbytes);
+    }
+    /*
+     * If no characters in font, then it is a bad font, but
+     * shouldn't try to read nothing.
+     */
+    /* have to unpack charinfos on some machines (CRAY) */
+    fs->per_char = NULL;
+    if (reply.nCharInfos > 0){
+       nbytes = reply.nCharInfos * sizeof(XCharStruct);
+       if (! (fs->per_char = (XCharStruct *) Xmalloc ((unsigned) nbytes))) {
+           if (fs->properties) Xfree((char *) fs->properties);
+           Xfree((char *) fs);
+           _XEatData(dpy, (unsigned long)
+                           (reply.nCharInfos * SIZEOF(xCharInfo)));
+           return (XFontStruct *)NULL;
+       }
+
+#ifdef MUSTCOPY
+       {
+           register XCharStruct *cs = fs->per_char;
+           register int i;
+
+           for (i = 0; i < reply.nCharInfos; i++, cs++) {
+               xCharInfo xcip;
+
+               _XRead(dpy, (char *)&xcip, SIZEOF(xCharInfo));
+               cs->lbearing = cvtINT16toShort(xcip.leftSideBearing);
+               cs->rbearing = cvtINT16toShort(xcip.rightSideBearing);
+               cs->width =  cvtINT16toShort(xcip.characterWidth);
+               cs->ascent =  cvtINT16toShort(xcip.ascent);
+               cs->descent =  cvtINT16toShort(xcip.descent);
+               cs->attributes = xcip.attributes;
+           }
+       }
+#else
+       nbytes = reply.nCharInfos * SIZEOF(xCharInfo);
+       _XRead16 (dpy, (char *)fs->per_char, nbytes);
+#endif
+    }
+
+    /* call out to any extensions interested */
+    for (ext = dpy->ext_procs; ext; ext = ext->next)
+       if (ext->create_Font) (*ext->create_Font)(dpy, fs, &ext->codes);
+    return fs;
+}
+
+#ifdef USE_XF86BIGFONT
+
+/* Magic cookie for finding the right XExtData structure on the display's
+   extension list. */
+static int XF86BigfontNumber = 1040697125;
+
+static int
+_XF86BigfontFreeCodes (
+    XExtData *extension)
+{
+    /* Don't Xfree(extension->private_data) because it is on the same malloc
+       chunk as extension. */
+    /* Don't Xfree(extension->private_data->codes) because this is shared with
+       the display's ext_procs list. */
+    return 0;
+}
+
+static XF86BigfontCodes *
+_XF86BigfontCodes (
+    register Display *dpy)
+{
+    XEDataObject dpy_union;
+    XExtData *pData;
+    XF86BigfontCodes *pCodes;
+    char *envval;
+
+    dpy_union.display = dpy;
+
+    /* If the server is known to support the XF86Bigfont extension,
+     * return the extension codes. If the server is known to not support
+     * the extension, don't bother checking again.
+     */
+    pData = XFindOnExtensionList(XEHeadOfExtensionList(dpy_union),
+                                XF86BigfontNumber);
+    if (pData)
+       return (XF86BigfontCodes *) pData->private_data;
+
+    pData = (XExtData *) Xmalloc(sizeof(XExtData) + sizeof(XF86BigfontCodes));
+    if (!pData) {
+       /* Out of luck. */
+       return (XF86BigfontCodes *) NULL;
+    }
+
+    /* See if the server supports the XF86Bigfont extension. */
+    envval = getenv("XF86BIGFONT_DISABLE"); /* Let the user disable it. */
+    if (envval != NULL && envval[0] != '\0')
+       pCodes = NULL;
+    else {
+       XExtCodes *codes = XInitExtension(dpy, XF86BIGFONTNAME);
+       if (codes == NULL)
+           pCodes = NULL;
+       else {
+           pCodes = (XF86BigfontCodes *) &pData[1];
+           pCodes->codes = codes;
+       }
+    }
+    pData->number = XF86BigfontNumber;
+    pData->private_data = (XPointer) pCodes;
+    pData->free_private = _XF86BigfontFreeCodes;
+    XAddToExtensionList(XEHeadOfExtensionList(dpy_union), pData);
+    if (pCodes) {
+       int result;
+
+       /* See if the server supports the XF86BigfontQueryFont request. */
+       xXF86BigfontQueryVersionReply reply;
+       register xXF86BigfontQueryVersionReq *req;
+
+       LockDisplay(dpy);
+
+       GetReq(XF86BigfontQueryVersion, req);
+       req->reqType = pCodes->codes->major_opcode;
+       req->xf86bigfontReqType = X_XF86BigfontQueryVersion;
+
+       result = _XReply (dpy, (xReply *) &reply,
+               (SIZEOF(xXF86BigfontQueryVersionReply) - SIZEOF(xReply)) >> 2,
+               xFalse);
+
+       UnlockDisplay(dpy);
+       SyncHandle();
+
+       if(!result)
+           goto ignore_extension;
+
+       /* No need to provide backward compatibility with version 1.0. It
+          was never widely distributed. */
+       if (!(reply.majorVersion > 1
+             || (reply.majorVersion == 1 && reply.minorVersion >= 1)))
+           goto ignore_extension;
+
+       pCodes->serverSignature = reply.signature;
+       pCodes->serverCapabilities = reply.capabilities;
+    }
+    return pCodes;
+
+  ignore_extension:
+    /* No need to Xfree(pCodes) or Xfree(pCodes->codes), see
+       _XF86BigfontFreeCodes comment. */
+    pCodes = (XF86BigfontCodes *) NULL;
+    pData->private_data = (XPointer) pCodes;
+    return pCodes;
+}
+
+static int
+_XF86BigfontFreeNop (
+    XExtData *extension)
+{
+    return 0;
+}
+
+static XFontStruct *
+_XF86BigfontQueryFont (
+    register Display *dpy,
+    XF86BigfontCodes *extcodes,
+    Font fid,
+    unsigned long seq)
+{
+    register XFontStruct *fs;
+    register long nbytes;
+    xXF86BigfontQueryFontReply reply;
+    register xXF86BigfontQueryFontReq *req;
+    register _XExtension *ext;
+    _XAsyncHandler async1;
+    _XAsyncErrorState async1_state;
+    _XAsyncHandler async2;
+    _XAsyncErrorState async2_state;
+
+    if (seq) {
+       async1_state.min_sequence_number = seq;
+       async1_state.max_sequence_number = seq;
+       async1_state.error_code = BadName;
+       async1_state.major_opcode = X_OpenFont;
+       async1_state.minor_opcode = 0;
+       async1_state.error_count = 0;
+       async1.next = dpy->async_handlers;
+       async1.handler = _XAsyncErrorHandler;
+       async1.data = (XPointer)&async1_state;
+       dpy->async_handlers = &async1;
+    }
+
+    GetReq(XF86BigfontQueryFont, req);
+    req->reqType = extcodes->codes->major_opcode;
+    req->xf86bigfontReqType = X_XF86BigfontQueryFont;
+    req->id = fid;
+    req->flags = (extcodes->serverCapabilities & XF86Bigfont_CAP_LocalShm
+                 ? XF86Bigfont_FLAGS_Shm : 0);
+
+    /* The function _XQueryFont benefits from a "magic" error handler for
+       BadFont coming from a X_QueryFont request. (See function _XReply.)
+       We have to establish an error handler ourselves. */
+    async2_state.min_sequence_number = dpy->request;
+    async2_state.max_sequence_number = dpy->request;
+    async2_state.error_code = BadFont;
+    async2_state.major_opcode = extcodes->codes->major_opcode;
+    async2_state.minor_opcode = X_XF86BigfontQueryFont;
+    async2_state.error_count = 0;
+    async2.next = dpy->async_handlers;
+    async2.handler = _XAsyncErrorHandler;
+    async2.data = (XPointer)&async2_state;
+    dpy->async_handlers = &async2;
+
+    if (!_XReply (dpy, (xReply *) &reply,
+       ((SIZEOF(xXF86BigfontQueryFontReply) - SIZEOF(xReply)) >> 2), xFalse)) {
+       DeqAsyncHandler(dpy, &async2);
+       if (seq)
+           DeqAsyncHandler(dpy, &async1);
+       return (XFontStruct *)NULL;
+    }
+    DeqAsyncHandler(dpy, &async2);
+    if (seq)
+       DeqAsyncHandler(dpy, &async1);
+    if (! (fs = (XFontStruct *) Xmalloc (sizeof (XFontStruct)))) {
+       _XEatData(dpy,
+                 reply.nFontProps * SIZEOF(xFontProp)
+                 + (reply.nCharInfos > 0 && reply.shmid == (CARD32)(-1)
+                    ? reply.nUniqCharInfos * SIZEOF(xCharInfo)
+                      + (reply.nCharInfos+1)/2 * 2 * sizeof(CARD16)
+                    : 0));
+       return (XFontStruct *)NULL;
+    }
+    fs->ext_data               = NULL;
+    fs->fid                    = fid;
+    fs->direction              = reply.drawDirection;
+    fs->min_char_or_byte2      = reply.minCharOrByte2;
+    fs->max_char_or_byte2      = reply.maxCharOrByte2;
+    fs->min_byte1              = reply.minByte1;
+    fs->max_byte1              = reply.maxByte1;
+    fs->default_char           = reply.defaultChar;
+    fs->all_chars_exist        = reply.allCharsExist;
+    fs->ascent                         = cvtINT16toInt (reply.fontAscent);
+    fs->descent                = cvtINT16toInt (reply.fontDescent);
+
+    /* XXX the next two statements won't work if short isn't 16 bits */
+    fs->min_bounds = * (XCharStruct *) &reply.minBounds;
+    fs->max_bounds = * (XCharStruct *) &reply.maxBounds;
+
+    fs->n_properties = reply.nFontProps;
+    /*
+     * if no properties defined for the font, then it is bad
+     * font, but shouldn't try to read nothing.
+     */
+    fs->properties = NULL;
+    if (fs->n_properties > 0) {
+       nbytes = reply.nFontProps * sizeof(XFontProp);
+       fs->properties = (XFontProp *) Xmalloc ((unsigned) nbytes);
+       nbytes = reply.nFontProps * SIZEOF(xFontProp);
+       if (! fs->properties) {
+           Xfree((char *) fs);
+           _XEatData(dpy,
+                     nbytes
+                     + (reply.nCharInfos > 0 && reply.shmid == (CARD32)(-1)
+                        ? reply.nUniqCharInfos * SIZEOF(xCharInfo)
+                          + (reply.nCharInfos+1)/2 * 2 * sizeof(CARD16)
+                        : 0));
+           return (XFontStruct *)NULL;
+       }
+       _XRead32 (dpy, (long *)fs->properties, nbytes);
+    }
+
+    fs->per_char = NULL;
+    if (reply.nCharInfos > 0) {
+       /* fprintf(stderr, "received font metrics, nCharInfos = %d, nUniqCharInfos = %d, shmid = %d\n", reply.nCharInfos, reply.nUniqCharInfos, reply.shmid); */
+       if (reply.shmid == (CARD32)(-1)) {
+           xCharInfo* pUniqCI;
+           CARD16* pIndex2UniqIndex;
+           int i;
+
+           nbytes = reply.nUniqCharInfos * SIZEOF(xCharInfo)
+                    + (reply.nCharInfos+1)/2 * 2 * sizeof(CARD16);
+           pUniqCI = (xCharInfo *) Xmalloc (nbytes);
+           if (!pUniqCI) {
+               if (fs->properties) Xfree((char *) fs->properties);
+               Xfree((char *) fs);
+               _XEatData(dpy, nbytes);
+               return (XFontStruct *)NULL;
+           }
+           if (! (fs->per_char = (XCharStruct *) Xmalloc (reply.nCharInfos * sizeof(XCharStruct)))) {
+               Xfree((char *) pUniqCI);
+               if (fs->properties) Xfree((char *) fs->properties);
+               Xfree((char *) fs);
+               _XEatData(dpy, nbytes);
+               return (XFontStruct *)NULL;
+           }
+           _XRead16 (dpy, (char *) pUniqCI, nbytes);
+           pIndex2UniqIndex = (CARD16*) (pUniqCI + reply.nUniqCharInfos);
+           for (i = 0; i < reply.nCharInfos; i++) {
+               if (pIndex2UniqIndex[i] >= reply.nUniqCharInfos) {
+                   fprintf(stderr, "_XF86BigfontQueryFont: server returned wrong data\n");
+                   Xfree((char *) pUniqCI);
+                   if (fs->properties) Xfree((char *) fs->properties);
+                   Xfree((char *) fs);
+                   return (XFontStruct *)NULL;
+               }
+               /* XXX the next statement won't work if short isn't 16 bits */
+               fs->per_char[i] = * (XCharStruct *) &pUniqCI[pIndex2UniqIndex[i]];
+           }
+           Xfree((char *) pUniqCI);
+       } else {
+#ifdef HAS_SHM
+           XExtData *pData;
+           XEDataObject fs_union;
+           char *addr;
+
+           pData = (XExtData *) Xmalloc(sizeof(XExtData));
+           if (!pData) {
+               if (fs->properties) Xfree((char *) fs->properties);
+               Xfree((char *) fs);
+               return (XFontStruct *)NULL;
+           }
+
+           /* In some cases (e.g. an ssh daemon forwarding an X session to
+              a remote machine) it is possible that the X server thinks we
+              are running on the same machine (because getpeername() and
+              LocalClient() cannot know about the forwarding) but we are
+              not really local. Therefore, when we attach the first shared
+              memory segment, we verify that we are on the same machine as
+              the X server by checking that 1. shmat() succeeds, 2. the
+              segment has a sufficient size, 3. it contains the X server's
+              signature. Then we set the CAP_VerifiedLocal bit to indicate
+              the verification was successful. */
+
+           if ((addr = shmat(reply.shmid, NULL, SHM_RDONLY)) == (char *)-1) {
+               if (extcodes->serverCapabilities & CAP_VerifiedLocal)
+                   fprintf(stderr, "_XF86BigfontQueryFont: could not attach shm segment\n");
+               Xfree((char *) pData);
+               if (fs->properties) Xfree((char *) fs->properties);
+               Xfree((char *) fs);
+               /* Stop requesting shared memory transport from now on. */
+               extcodes->serverCapabilities &= ~ XF86Bigfont_CAP_LocalShm;
+               return (XFontStruct *)NULL;
+           }
+
+           if (!(extcodes->serverCapabilities & CAP_VerifiedLocal)) {
+               struct shmid_ds buf;
+               if (!(shmctl(reply.shmid, IPC_STAT, &buf) >= 0
+                     && buf.shm_segsz >= reply.shmsegoffset + reply.nCharInfos * sizeof(XCharStruct) + sizeof(CARD32)
+                     && *(CARD32 *)(addr + reply.shmsegoffset + reply.nCharInfos * sizeof(XCharStruct)) == extcodes->serverSignature)) {
+                   shmdt(addr);
+                   Xfree((char *) pData);
+                   if (fs->properties) Xfree((char *) fs->properties);
+                   Xfree((char *) fs);
+                   /* Stop requesting shared memory transport from now on. */
+                   extcodes->serverCapabilities &= ~ XF86Bigfont_CAP_LocalShm;
+                   return (XFontStruct *)NULL;
+               }
+               extcodes->serverCapabilities |= CAP_VerifiedLocal;
+           }
+
+           pData->number = XF86BigfontNumber;
+           pData->private_data = (XPointer) addr;
+           pData->free_private = _XF86BigfontFreeNop;
+           fs_union.font = fs;
+           XAddToExtensionList(XEHeadOfExtensionList(fs_union), pData);
+
+           fs->per_char = (XCharStruct *) (addr + reply.shmsegoffset);
+#else
+           fprintf(stderr, "_XF86BigfontQueryFont: try recompiling libX11 with HasShm, Xserver has shm support\n");
+           if (fs->properties) Xfree((char *) fs->properties);
+           Xfree((char *) fs);
+           /* Stop requesting shared memory transport from now on. */
+           extcodes->serverCapabilities &= ~ XF86Bigfont_CAP_LocalShm;
+           return (XFontStruct *)NULL;
+#endif
+       }
+    }
+
+    /* call out to any extensions interested */
+    for (ext = dpy->ext_procs; ext; ext = ext->next)
+       if (ext->create_Font) (*ext->create_Font)(dpy, fs, &ext->codes);
+    return fs;
+}
+
+void
+_XF86BigfontFreeFontMetrics (XFontStruct *fs)
+{
+#ifdef HAS_SHM
+    XExtData *pData;
+    XEDataObject fs_union;
+
+    fs_union.font = fs;
+    if ((pData = XFindOnExtensionList(XEHeadOfExtensionList(fs_union),
+                                     XF86BigfontNumber)))
+       shmdt ((char *) pData->private_data);
+    else
+       Xfree ((char *) fs->per_char);
+#else
+    Xfree ((char *) fs->per_char);
+#endif
+}
+
+#endif /* USE_XF86BIGFONT */
+
+int _XF86LoadQueryLocaleFont(
+   Display *dpy,
+   _Xconst char *name,
+   XFontStruct **xfp,
+   Font *fidp)
+{
+    int l;
+    const char *charset, *p;
+    char buf[256];
+    XFontStruct *fs;
+    XLCd lcd;
+
+    if (!name)
+       return 0;
+    l = strlen(name);
+    if (l < 2 || name[l - 1] != '*' || name[l - 2] != '-')
+       return 0;
+    charset = NULL;
+    /* next three lines stolen from _XkbGetCharset() */
+    lcd = _XlcCurrentLC();
+    if ((lcd = _XlcCurrentLC()) != 0)
+       charset = XLC_PUBLIC(lcd, encoding_name);
+    if (!charset || (p = strrchr(charset, '-')) == 0 || p == charset || p[1] == 0 || (p[1] == '*' && p[2] == 0)) {
+       /* prefer latin1 if no encoding found */
+       charset = "ISO8859-1";
+       p = charset + 7;
+    }
+    if (l - 2 - (p - charset) < 0)
+       return 0;
+    if (_XlcNCompareISOLatin1(name + l - 2 - (p - charset), charset, p - charset))
+       return 0;
+    if (strlen(p + 1) + l - 1 >= sizeof(buf) - 1)
+       return 0;
+    strcpy(buf, name);
+    strcpy(buf + l - 1, p + 1);
+    fs = XLoadQueryFont(dpy, buf);
+    if (!fs)
+       return 0;
+    if (xfp) {
+       *xfp = fs;
+       if (fidp)
+           *fidp = fs->fid;
+    } else if (fidp) {
+       if (fs->per_char) {
+#ifdef USE_XF86BIGFONT
+           _XF86BigfontFreeFontMetrics(fs);
+#else
+           Xfree ((char *) fs->per_char);
+#endif
+       }
+       _XFreeExtData(fs->ext_data);
+       if (fs->properties)
+           Xfree ((char *) fs->properties);
+       *fidp = fs->fid;
+       Xfree ((char *) fs);
+    } else {
+       XFreeFont(dpy, fs);
+    }
+    return 1;
+}
diff --git a/src/FontInfo.c b/src/FontInfo.c
new file mode 100644 (file)
index 0000000..a3ab65b
--- /dev/null
@@ -0,0 +1,253 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+#if defined(XF86BIGFONT) && !defined(MUSTCOPY)
+#define USE_XF86BIGFONT
+#endif
+#ifdef USE_XF86BIGFONT
+extern void _XF86BigfontFreeFontMetrics(
+    XFontStruct*       /* fs */
+);
+#endif
+
+char **XListFontsWithInfo(
+register Display *dpy,
+_Xconst char *pattern,  /* null-terminated */
+int maxNames,
+int *actualCount,      /* RETURN */
+XFontStruct **info)    /* RETURN */
+{
+    register long nbytes;
+    register int i;
+    register XFontStruct *fs;
+    register int size = 0;
+    XFontStruct *finfo = NULL;
+    char **flist = NULL;
+    xListFontsWithInfoReply reply;
+    register xListFontsReq *req;
+    int j;
+
+    LockDisplay(dpy);
+    GetReq(ListFontsWithInfo, req);
+    req->maxNames = maxNames;
+    nbytes = req->nbytes = pattern ? strlen (pattern) : 0;
+    req->length += (nbytes + 3) >> 2;
+    _XSend (dpy, pattern, nbytes);
+    /* use _XSend instead of Data, since subsequent _XReply will flush buffer */
+
+    for (i = 0; ; i++) {
+       if (!_XReply (dpy, (xReply *) &reply,
+                     ((SIZEOF(xListFontsWithInfoReply) -
+                       SIZEOF(xGenericReply)) >> 2), xFalse)) {
+           for (j=(i-1); (j >= 0); j--) {
+               Xfree(flist[j]);
+               if (finfo[j].properties) Xfree((char *) finfo[j].properties);
+           }
+           if (flist) Xfree((char *) flist);
+           if (finfo) Xfree((char *) finfo);
+           UnlockDisplay(dpy);
+           SyncHandle();
+           return ((char **) NULL);
+       }
+       if (reply.nameLength == 0)
+           break;
+       if ((i + reply.nReplies) >= size) {
+           size = i + reply.nReplies + 1;
+
+           if (finfo) {
+               XFontStruct * tmp_finfo = (XFontStruct *)
+                   Xrealloc ((char *) finfo,
+                             (unsigned) (sizeof(XFontStruct) * size));
+               char ** tmp_flist = (char **)
+                   Xrealloc ((char *) flist,
+                             (unsigned) (sizeof(char *) * (size+1)));
+
+               if ((! tmp_finfo) || (! tmp_flist)) {
+                   /* free all the memory that we allocated */
+                   for (j=(i-1); (j >= 0); j--) {
+                       Xfree(flist[j]);
+                       if (finfo[j].properties)
+                           Xfree((char *) finfo[j].properties);
+                   }
+                   if (tmp_flist) Xfree((char *) tmp_flist);
+                   else Xfree((char *) flist);
+                   if (tmp_finfo) Xfree((char *) tmp_finfo);
+                   else Xfree((char *) finfo);
+                   goto clearwire;
+               }
+               finfo = tmp_finfo;
+               flist = tmp_flist;
+           }
+           else {
+               if (! (finfo = (XFontStruct *)
+                      Xmalloc((unsigned) (sizeof(XFontStruct) * size))))
+                   goto clearwire;
+               if (! (flist = (char **)
+                      Xmalloc((unsigned) (sizeof(char *) * (size+1))))) {
+                   Xfree((char *) finfo);
+                   goto clearwire;
+               }
+           }
+       }
+       fs = &finfo[i];
+
+       fs->ext_data            = NULL;
+       fs->per_char            = NULL;
+       fs->fid                 = None;
+       fs->direction           = reply.drawDirection;
+       fs->min_char_or_byte2   = reply.minCharOrByte2;
+       fs->max_char_or_byte2   = reply.maxCharOrByte2;
+       fs->min_byte1           = reply.minByte1;
+       fs->max_byte1           = reply.maxByte1;
+       fs->default_char        = reply.defaultChar;
+       fs->all_chars_exist     = reply.allCharsExist;
+       fs->ascent              = cvtINT16toInt (reply.fontAscent);
+       fs->descent             = cvtINT16toInt (reply.fontDescent);
+
+#ifdef MUSTCOPY
+       {
+           xCharInfo *xcip;
+
+           xcip = (xCharInfo *) &reply.minBounds;
+           fs->min_bounds.lbearing = xcip->leftSideBearing;
+           fs->min_bounds.rbearing = xcip->rightSideBearing;
+           fs->min_bounds.width = xcip->characterWidth;
+           fs->min_bounds.ascent = xcip->ascent;
+           fs->min_bounds.descent = xcip->descent;
+           fs->min_bounds.attributes = xcip->attributes;
+
+           xcip = (xCharInfo *) &reply.maxBounds;
+           fs->max_bounds.lbearing = xcip->leftSideBearing;
+           fs->max_bounds.rbearing = xcip->rightSideBearing;
+           fs->max_bounds.width = xcip->characterWidth;
+           fs->max_bounds.ascent = xcip->ascent;
+           fs->max_bounds.descent = xcip->descent;
+           fs->max_bounds.attributes = xcip->attributes;
+       }
+#else
+       /* XXX the next two statements won't work if short isn't 16 bits */
+       fs->min_bounds = * (XCharStruct *) &reply.minBounds;
+       fs->max_bounds = * (XCharStruct *) &reply.maxBounds;
+#endif /* MUSTCOPY */
+
+       fs->n_properties = reply.nFontProps;
+       if (fs->n_properties > 0) {
+           nbytes = reply.nFontProps * sizeof(XFontProp);
+           if (! (fs->properties = (XFontProp *) Xmalloc((unsigned) nbytes)))
+               goto badmem;
+           nbytes = reply.nFontProps * SIZEOF(xFontProp);
+           _XRead32 (dpy, (long *)fs->properties, nbytes);
+
+       } else
+           fs->properties = NULL;
+
+       j = reply.nameLength + 1;
+       if (!i)
+           j++; /* make first string 1 byte longer, to match XListFonts */
+       flist[i] = (char *) Xmalloc ((unsigned int) j);
+       if (! flist[i]) {
+           if (finfo[i].properties) Xfree((char *) finfo[i].properties);
+           nbytes = (reply.nameLength + 3) & ~3;
+           _XEatData(dpy, (unsigned long) nbytes);
+           goto badmem;
+       }
+       if (!i) {
+           *flist[0] = 0; /* zero to distinguish from XListFonts */
+           flist[0]++;
+       }
+       flist[i][reply.nameLength] = '\0';
+       _XReadPad (dpy, flist[i], (long) reply.nameLength);
+    }
+    *info = finfo;
+    *actualCount = i;
+    if (flist)
+       flist[i] = NULL; /* required in case XFreeFontNames is called */
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return (flist);
+
+
+  badmem:
+    /* Free all memory allocated by this function. */
+    for (j=(i-1); (j >= 0); j--) {
+       Xfree(flist[j]);
+       if (finfo[j].properties) Xfree((char *) finfo[j].properties);
+    }
+    if (flist) Xfree((char *) flist);
+    if (finfo) Xfree((char *) finfo);
+
+  clearwire:
+    /* Clear the wire. */
+    do {
+       if (reply.nFontProps)
+           _XEatData(dpy, (unsigned long)
+                     (reply.nFontProps * SIZEOF(xFontProp)));
+       nbytes = (reply.nameLength + 3) & ~3;
+       _XEatData(dpy, (unsigned long) nbytes);
+    }
+    while (_XReply(dpy,(xReply *) &reply, ((SIZEOF(xListFontsWithInfoReply) -
+                                           SIZEOF(xGenericReply)) >> 2),
+                  xFalse) && (reply.nameLength != 0));
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return (char **) NULL;
+}
+
+int
+XFreeFontInfo (
+    char **names,
+    XFontStruct *info,
+    int actualCount)
+{
+       register int i;
+       if (names) {
+               Xfree (names[0]-1);
+               for (i = 1; i < actualCount; i++) {
+                       Xfree (names[i]);
+               }
+               Xfree((char *) names);
+       }
+       if (info) {
+               for (i = 0; i < actualCount; i++) {
+                       if (info[i].per_char)
+#ifdef USE_XF86BIGFONT
+                               _XF86BigfontFreeFontMetrics(&info[i]);
+#else
+                               Xfree ((char *) info[i].per_char);
+#endif
+                       if (info[i].properties)
+                               Xfree ((char *) info[i].properties);
+                       }
+               Xfree((char *) info);
+       }
+       return 1;
+}
diff --git a/src/FontNames.c b/src/FontNames.c
new file mode 100644 (file)
index 0000000..3018cf2
--- /dev/null
@@ -0,0 +1,113 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+char **
+XListFonts(
+register Display *dpy,
+_Xconst char *pattern,  /* null-terminated */
+int maxNames,
+int *actualCount)      /* RETURN */
+{
+    register long nbytes;
+    register unsigned i;
+    register int length;
+    char **flist;
+    char *ch;
+    xListFontsReply rep;
+    register xListFontsReq *req;
+    register long rlen;
+
+    LockDisplay(dpy);
+    GetReq(ListFonts, req);
+    req->maxNames = maxNames;
+    nbytes = req->nbytes = pattern ? strlen (pattern) : 0;
+    req->length += (nbytes + 3) >> 2;
+    _XSend (dpy, pattern, nbytes);
+    /* use _XSend instead of Data, since following _XReply will flush buffer */
+
+    if (!_XReply (dpy, (xReply *)&rep, 0, xFalse)) {
+       *actualCount = 0;
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return (char **) NULL;
+    }
+
+    if (rep.nFonts) {
+       flist = (char **)Xmalloc ((unsigned)rep.nFonts * sizeof(char *));
+       rlen = rep.length << 2;
+       ch = (char *) Xmalloc((unsigned) (rlen + 1));
+           /* +1 to leave room for last null-terminator */
+
+       if ((! flist) || (! ch)) {
+           if (flist) Xfree((char *) flist);
+           if (ch) Xfree(ch);
+           _XEatData(dpy, (unsigned long) rlen);
+           *actualCount = 0;
+           UnlockDisplay(dpy);
+           SyncHandle();
+           return (char **) NULL;
+       }
+
+       _XReadPad (dpy, ch, rlen);
+       /*
+        * unpack into null terminated strings.
+        */
+       length = *(unsigned char *)ch;
+       *ch = 1; /* make sure it is non-zero for XFreeFontNames */
+       for (i = 0; i < rep.nFonts; i++) {
+           flist[i] = ch + 1;  /* skip over length */
+           ch += length + 1;  /* find next length ... */
+           length = *(unsigned char *)ch;
+           *ch = '\0';  /* and replace with null-termination */
+       }
+    }
+    else flist = (char **) NULL;
+    *actualCount = rep.nFonts;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return (flist);
+}
+
+int
+XFreeFontNames(char **list)
+{
+       if (list) {
+               if (!*(list[0]-1)) { /* from ListFontsWithInfo */
+                       register char **names;
+                       for (names = list+1; *names; names++)
+                               Xfree (*names);
+               }
+               Xfree (list[0]-1);
+               Xfree ((char *)list);
+       }
+       return 1;
+}
diff --git a/src/FreeCmap.c b/src/FreeCmap.c
new file mode 100644 (file)
index 0000000..e2b76fa
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+
+Copyright 1986, 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 "Xlib.h"
+#include "Xlibint.h"
+#include "Cmap.h"
+
+int
+XFreeColormap(
+    register Display *dpy,
+    Colormap cmap)
+{
+    register xResourceReq *req;
+
+    LockDisplay(dpy);
+    GetResReq(FreeColormap, cmap, req);
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+
+#ifdef XCMS
+    _XcmsDeleteCmapRec(dpy, cmap);
+#endif
+
+    return 1;
+}
diff --git a/src/FreeCols.c b/src/FreeCols.c
new file mode 100644 (file)
index 0000000..a8b7f88
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XFreeColors(
+    register Display *dpy,
+    Colormap cmap,
+    unsigned long *pixels, /* LISTofCARD32 */
+    int npixels,
+    unsigned long planes) /* CARD32 */
+{
+    register xFreeColorsReq *req;
+    register long nbytes;
+
+    LockDisplay(dpy);
+    GetReq(FreeColors, req);
+    req->cmap = cmap;
+    req->planeMask = planes;
+
+    /* on the VAX, each pixel is a 32-bit (unsigned) integer */
+    req->length += npixels;
+
+    nbytes = npixels << 2;             /* watch out for macros... */
+    Data32 (dpy, (long *) pixels, nbytes);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/FreeCurs.c b/src/FreeCurs.c
new file mode 100644 (file)
index 0000000..89fb577
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XFreeCursor(
+    register Display *dpy,
+    Cursor cursor)
+{
+    register xResourceReq *req;
+    LockDisplay(dpy);
+    GetResReq(FreeCursor, cursor, req);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/FreeEData.c b/src/FreeEData.c
new file mode 100644 (file)
index 0000000..3a7abca
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+_XFreeExtData (XExtData *extension)
+{
+       XExtData *temp;
+       while (extension) {
+               if (extension->free_private)
+                   (*extension->free_private)(extension);
+               else Xfree ((char *)extension->private_data);
+               temp = extension->next;
+               Xfree ((char *)extension);
+               extension = temp;
+       }
+       return 0;
+}
diff --git a/src/FreeEventData.c b/src/FreeEventData.c
new file mode 100644 (file)
index 0000000..e2d40b0
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * 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.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+
+void
+XFreeEventData(Display *dpy, XGenericEventCookie *event)
+{
+
+    if (_XIsEventCookie(dpy, (XEvent*)event) && event->data)
+    {
+        XFree(event->data);
+        event->data = NULL;
+        event->cookie = 0;
+    }
+    return;
+}
+
diff --git a/src/FreeGC.c b/src/FreeGC.c
new file mode 100644 (file)
index 0000000..ab994bc
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XFreeGC (
+    register Display *dpy,
+    GC gc)
+    {
+    register xResourceReq *req;
+    register _XExtension *ext;
+    LockDisplay(dpy);
+    /* call out to any extensions interested */
+    for (ext = dpy->ext_procs; ext; ext = ext->next)
+       if (ext->free_GC) (*ext->free_GC)(dpy, gc, &ext->codes);
+    GetResReq (FreeGC, gc->gid, req);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    _XFreeExtData(gc->ext_data);
+    Xfree ((char *) gc);
+    return 1;
+    }
+
diff --git a/src/FreePix.c b/src/FreePix.c
new file mode 100644 (file)
index 0000000..2136797
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XFreePixmap(
+    register Display *dpy,
+    Pixmap pixmap)
+{
+    register xResourceReq *req;
+    LockDisplay(dpy);
+    GetResReq(FreePixmap, pixmap, req);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/GCMisc.c b/src/GCMisc.c
new file mode 100644 (file)
index 0000000..751e27d
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XSetArcMode (
+    register Display *dpy,
+    register GC gc,
+    int arc_mode)
+{
+    LockDisplay(dpy);
+    if (gc->values.arc_mode != arc_mode) {
+       gc->values.arc_mode = arc_mode;
+       gc->dirty |= GCArcMode;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
+int
+XSetFillRule (
+    register Display *dpy,
+    register GC gc,
+    int fill_rule)
+{
+    LockDisplay(dpy);
+    if (gc->values.fill_rule != fill_rule) {
+       gc->values.fill_rule = fill_rule;
+       gc->dirty |= GCFillRule;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
+int
+XSetFillStyle (
+    register Display *dpy,
+    register GC gc,
+    int fill_style)
+{
+    LockDisplay(dpy);
+    if (gc->values.fill_style != fill_style) {
+       gc->values.fill_style = fill_style;
+       gc->dirty |= GCFillStyle;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
+int
+XSetGraphicsExposures (
+    register Display *dpy,
+    register GC gc,
+    Bool graphics_exposures)
+{
+    LockDisplay(dpy);
+    if (gc->values.graphics_exposures != graphics_exposures) {
+       gc->values.graphics_exposures = graphics_exposures;
+       gc->dirty |= GCGraphicsExposures;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
+int
+XSetSubwindowMode (
+    register Display *dpy,
+    register GC gc,
+    int subwindow_mode)
+{
+    LockDisplay(dpy);
+    if (gc->values.subwindow_mode != subwindow_mode) {
+       gc->values.subwindow_mode = subwindow_mode;
+       gc->dirty |= GCSubwindowMode;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/Geom.c b/src/Geom.c
new file mode 100644 (file)
index 0000000..1da74f1
--- /dev/null
@@ -0,0 +1,89 @@
+
+/*
+
+Copyright 1985, 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 "Xlibint.h"
+#include "Xutil.h"
+
+/*
+ * This routine given a user supplied positional argument and a default
+ * argument (fully qualified) will return the position the window should take
+ * returns 0 if there was some problem, else the position bitmask.
+ */
+
+int
+XGeometry (
+     Display *dpy,                     /* user's display connection */
+     int screen,                       /* screen on which to do computation */
+     _Xconst char *pos,                        /* user provided geometry spec */
+     _Xconst char *def,                        /* default geometry spec for window */
+     unsigned int bwidth,              /* border width */
+     unsigned int fwidth,              /* size of position units */
+     unsigned int fheight,
+     int xadd,                         /* any additional interior space */
+     int yadd,
+     register int *x,                  /* always set on successful RETURN */
+     register int *y,                  /* always set on successful RETURN */
+     register int *width,              /* always set on successful RETURN */
+     register int *height)             /* always set on successful RETURN */
+{
+       int px, py;                     /* returned values from parse */
+       unsigned int pwidth, pheight;   /* returned values from parse */
+       int dx, dy;                     /* default values from parse */
+       unsigned int dwidth, dheight;   /* default values from parse */
+       int pmask, dmask;               /* values back from parse */
+
+       pmask = XParseGeometry(pos, &px, &py, &pwidth, &pheight);
+       dmask = XParseGeometry(def, &dx, &dy, &dwidth, &dheight);
+
+       /* set default values */
+       *x = (dmask & XNegative) ?
+           DisplayWidth(dpy, screen)  + dx - dwidth * fwidth -
+               2 * bwidth - xadd : dx;
+       *y = (dmask & YNegative) ?
+           DisplayHeight(dpy, screen) + dy - dheight * fheight -
+               2 * bwidth - yadd : dy;
+       *width  = dwidth;
+       *height = dheight;
+
+       if (pmask & WidthValue)  *width  = pwidth;
+       if (pmask & HeightValue) *height = pheight;
+
+       if (pmask & XValue)
+           *x = (pmask & XNegative) ?
+             DisplayWidth(dpy, screen) + px - *width * fwidth -
+                 2 * bwidth - xadd : px;
+       if (pmask & YValue)
+           *y = (pmask & YNegative) ?
+             DisplayHeight(dpy, screen) + py - *height * fheight -
+                 2 * bwidth - yadd : py;
+       return (pmask);
+}
diff --git a/src/GetAtomNm.c b/src/GetAtomNm.c
new file mode 100644 (file)
index 0000000..9823c69
--- /dev/null
@@ -0,0 +1,189 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+#include "Xintatom.h"
+
+static
+char *_XGetAtomName(
+    Display *dpy,
+    Atom atom)
+{
+    xResourceReq *req;
+    char *name;
+    register Entry *table;
+    register int idx;
+    register Entry e;
+
+    if (dpy->atoms) {
+       table = dpy->atoms->table;
+       for (idx = TABLESIZE; --idx >= 0; ) {
+           if ((e = *table++) && (e->atom == atom)) {
+               idx = strlen(EntryName(e)) + 1;
+               if ((name = (char *)Xmalloc(idx)))
+                   strcpy(name, EntryName(e));
+               return name;
+           }
+       }
+    }
+    GetResReq(GetAtomName, atom, req);
+    return (char *)NULL;
+}
+
+char *XGetAtomName(
+    register Display *dpy,
+    Atom atom)
+{
+    xGetAtomNameReply rep;
+    char *name;
+
+    LockDisplay(dpy);
+    if ((name = _XGetAtomName(dpy, atom))) {
+       UnlockDisplay(dpy);
+       return name;
+    }
+    if (_XReply(dpy, (xReply *)&rep, 0, xFalse) == 0) {
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return(NULL);
+    }
+    if ((name = (char *) Xmalloc(rep.nameLength+1))) {
+       _XReadPad(dpy, name, (long)rep.nameLength);
+       name[rep.nameLength] = '\0';
+       _XUpdateAtomCache(dpy, name, atom, 0, -1, 0);
+    } else {
+       _XEatData(dpy, (unsigned long) (rep.nameLength + 3) & ~3);
+       name = (char *) NULL;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return(name);
+}
+
+typedef struct {
+    unsigned long start_seq;
+    unsigned long stop_seq;
+    Atom *atoms;
+    char **names;
+    int idx;
+    int count;
+    Status status;
+} _XGetAtomNameState;
+
+static
+Bool _XGetAtomNameHandler(
+    register Display *dpy,
+    register xReply *rep,
+    char *buf,
+    int len,
+    XPointer data)
+{
+    register _XGetAtomNameState *state;
+    xGetAtomNameReply replbuf;
+    register xGetAtomNameReply *repl;
+
+    state = (_XGetAtomNameState *)data;
+    if (dpy->last_request_read < state->start_seq ||
+       dpy->last_request_read > state->stop_seq)
+       return False;
+    while (state->idx < state->count && state->names[state->idx])
+       state->idx++;
+    if (state->idx >= state->count)
+       return False;
+    if (rep->generic.type == X_Error) {
+       state->status = 0;
+       return False;
+    }
+    repl = (xGetAtomNameReply *)
+       _XGetAsyncReply(dpy, (char *)&replbuf, rep, buf, len,
+                       (SIZEOF(xGetAtomNameReply) - SIZEOF(xReply)) >> 2,
+                       False);
+    state->names[state->idx] = (char *) Xmalloc(repl->nameLength+1);
+    _XGetAsyncData(dpy, state->names[state->idx], buf, len,
+                  SIZEOF(xGetAtomNameReply), repl->nameLength,
+                  repl->length << 2);
+    if (state->names[state->idx]) {
+       state->names[state->idx][repl->nameLength] = '\0';
+       _XUpdateAtomCache(dpy, state->names[state->idx],
+                         state->atoms[state->idx], 0, -1, 0);
+    } else {
+       state->status = 0;
+    }
+    return True;
+}
+
+Status
+XGetAtomNames (
+    Display *dpy,
+    Atom *atoms,
+    int count,
+    char **names_return)
+{
+    _XAsyncHandler async;
+    _XGetAtomNameState async_state;
+    xGetAtomNameReply rep;
+    int i;
+    int missed = -1;
+
+    LockDisplay(dpy);
+    async_state.start_seq = dpy->request + 1;
+    async_state.atoms = atoms;
+    async_state.names = names_return;
+    async_state.idx = 0;
+    async_state.count = count - 1;
+    async_state.status = 1;
+    async.next = dpy->async_handlers;
+    async.handler = _XGetAtomNameHandler;
+    async.data = (XPointer)&async_state;
+    dpy->async_handlers = &async;
+    for (i = 0; i < count; i++) {
+       if (!(names_return[i] = _XGetAtomName(dpy, atoms[i]))) {
+           missed = i;
+           async_state.stop_seq = dpy->request;
+       }
+    }
+    if (missed >= 0) {
+       if (_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
+           if ((names_return[missed] = (char *) Xmalloc(rep.nameLength+1))) {
+               _XReadPad(dpy, names_return[missed], (long)rep.nameLength);
+               names_return[missed][rep.nameLength] = '\0';
+               _XUpdateAtomCache(dpy, names_return[missed], atoms[missed],
+                                 0, -1, 0);
+           } else {
+               _XEatData(dpy, (unsigned long) (rep.nameLength + 3) & ~3);
+               async_state.status = 0;
+           }
+       }
+    }
+    DeqAsyncHandler(dpy, &async);
+    UnlockDisplay(dpy);
+    if (missed >= 0)
+       SyncHandle();
+    return async_state.status;
+}
diff --git a/src/GetColor.c b/src/GetColor.c
new file mode 100644 (file)
index 0000000..cd0eb9f
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+
+Copyright 1986, 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 <stdio.h>
+#include "Xlibint.h"
+#include "Xcmsint.h"
+
+Status
+XAllocNamedColor(
+register Display *dpy,
+Colormap cmap,
+_Xconst char *colorname, /* STRING8 */
+XColor *hard_def, /* RETURN */
+XColor *exact_def) /* RETURN */
+{
+
+    long nbytes;
+    xAllocNamedColorReply rep;
+    xAllocNamedColorReq *req;
+
+    XcmsCCC ccc;
+    XcmsColor cmsColor_exact;
+    Status ret;
+
+#ifdef XCMS
+    /*
+     * Let's Attempt to use Xcms and i18n approach to Parse Color
+     */
+    if ((ccc = XcmsCCCOfColormap(dpy, cmap)) != (XcmsCCC)NULL) {
+       const char *tmpName = colorname;
+
+       switch (_XcmsResolveColorString(ccc, &tmpName, &cmsColor_exact,
+                                       XcmsRGBFormat)) {
+       case XcmsSuccess:
+       case XcmsSuccessWithCompression:
+           _XcmsRGB_to_XColor(&cmsColor_exact, exact_def, 1);
+           memcpy((char *)hard_def, (char *)exact_def, sizeof(XColor));
+           ret = XAllocColor(dpy, cmap, hard_def);
+           exact_def->pixel = hard_def->pixel;
+           return(ret);
+       case XcmsFailure:
+       case _XCMS_NEWNAME:
+           /*
+            * if the result was _XCMS_NEWNAME tmpName points to
+            * a string in cmsColNm.c:pairs table, for example,
+            * gray70 would become tekhvc:0.0/70.0/0.0
+            */
+           break;
+       }
+    }
+#endif
+
+    /*
+     * Xcms and i18n approach failed.
+     */
+    LockDisplay(dpy);
+    GetReq(AllocNamedColor, req);
+
+    req->cmap = cmap;
+    nbytes = req->nbytes = strlen(colorname);
+    req->length += (nbytes + 3) >> 2; /* round up to mult of 4 */
+
+    _XSend(dpy, colorname, nbytes);
+       /* _XSend is more efficient that Data, since _XReply follows */
+
+    if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) {
+       UnlockDisplay(dpy);
+        SyncHandle();
+        return (0);
+    }
+
+    exact_def->red = rep.exactRed;
+    exact_def->green = rep.exactGreen;
+    exact_def->blue = rep.exactBlue;
+
+    hard_def->red = rep.screenRed;
+    hard_def->green = rep.screenGreen;
+    hard_def->blue = rep.screenBlue;
+
+    exact_def->pixel = hard_def->pixel = rep.pixel;
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return (1);
+}
diff --git a/src/GetDflt.c b/src/GetDflt.c
new file mode 100644 (file)
index 0000000..dfda1c6
--- /dev/null
@@ -0,0 +1,257 @@
+
+/***********************************************************
+
+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 "Xlibint.h"
+#include <X11/Xos.h>
+#include <X11/Xresource.h>
+
+#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
+
+#ifdef XTHREADS
+#include <X11/Xthreads.h>
+#endif
+#ifndef WIN32
+#define X_INCLUDE_PWD_H
+#define XOS_USE_XLIB_LOCKING
+#include <X11/Xos_r.h>
+#endif
+#include <stdio.h>
+#include <ctype.h>
+
+
+/*ARGSUSED*/
+static char *
+GetHomeDir(
+    char *dest,
+    int len)
+{
+#ifdef WIN32
+    register char *ptr1 = NULL;
+    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;
+    register 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 XrmDatabase
+InitDefaults(
+    Display *dpy)                      /* display for defaults.... */
+{
+    XrmDatabase userdb;
+    XrmDatabase xdb;
+    char fname[PATH_MAX];               /* longer than any conceivable size */
+    char *xenv;
+
+    XrmInitialize();
+
+    /*
+     * See lib/Xt/Initialize.c
+     *
+     * First, get the defaults from the server; if none, then load from
+     * ~/.Xdefaults.  Next, if there is an XENVIRONMENT environment variable,
+     * then load that file.
+     */
+
+    if (dpy->xdefaults == NULL) {
+       const char *slashDotXdefaults = "/.Xdefaults";
+
+       (void) GetHomeDir (fname, PATH_MAX - strlen (slashDotXdefaults) - 1);
+       (void) strcat (fname, slashDotXdefaults);
+       xdb = XrmGetFileDatabase (fname);
+    } else {
+       xdb = XrmGetStringDatabase(dpy->xdefaults);
+    }
+
+    if (!(xenv = getenv ("XENVIRONMENT"))) {
+       const char *slashDotXdefaultsDash = "/.Xdefaults-";
+       int len;
+
+       (void) GetHomeDir (fname, PATH_MAX - strlen (slashDotXdefaultsDash) - 1);
+       (void) strcat (fname, slashDotXdefaultsDash);
+       len = strlen (fname);
+       (void) _XGetHostname (fname+len, PATH_MAX-len);
+       xenv = fname;
+    }
+    userdb = XrmGetFileDatabase (xenv);
+    XrmMergeDatabases (userdb, &xdb);
+    return (xdb);
+
+#ifdef old
+    if (fname[0] != '\0') userdb =  XrmGetFileDatabase(fname);
+    xdb = XrmGetStringDatabase(dpy->xdefaults);
+    XrmMergeDatabases(userdb, &xdb);
+    return xdb;
+#endif
+}
+
+char *
+XGetDefault(
+       Display *dpy,                   /* display for defaults.... */
+       char _Xconst *prog,             /* name of program for option   */
+       register _Xconst char *name)    /* name of option program wants */
+{                                      /* to get, for example, "font"  */
+       XrmName names[3];
+       XrmClass classes[3];
+       XrmRepresentation fromType;
+       XrmValue result;
+       char *progname;
+#ifdef WIN32
+       char *progname2;
+#endif
+#ifdef __UNIXOS2__
+       char *progname2;
+       char *dotpos;
+#endif
+
+       /*
+        * strip path off of program name (XXX - this is OS specific)
+        */
+       progname = strrchr (prog, '/');
+#ifdef WIN32
+       progname2 = strrchr (prog, '\\');
+       if (progname2 && (!progname || progname < progname2))
+           progname = progname2;
+#endif
+#ifdef __UNIXOS2__  /* Very similar to WIN32 */
+       progname2 = strrchr (prog, '\\');
+       if (progname2 && (!progname || progname < progname2))
+           progname = progname2;
+       dotpos = strrchr (prog, '.');
+       if (dotpos && (dotpos>progname2)) *dotpos='\0';
+#endif  /* We take out the .exe suffix  */
+
+       if (progname)
+           progname++;
+       else
+           progname = (char *)prog;
+
+       /*
+        * see if database has ever been initialized.  Lookups can be done
+        * without locks held.
+        */
+       LockDisplay(dpy);
+       if (dpy->db == NULL) {
+           dpy->db = InitDefaults(dpy);
+           dpy->flags |= XlibDisplayDfltRMDB;
+       }
+       UnlockDisplay(dpy);
+
+       names[0] = XrmStringToName(progname);
+       names[1] = XrmStringToName(name);
+       names[2] = NULLQUARK;
+       classes[0] = XrmStringToClass("Program");
+       classes[1] = XrmStringToClass("Name");
+       classes[2] = NULLQUARK;
+       (void)XrmQGetResource(dpy->db, names, classes, &fromType, &result);
+       return (result.addr);
+}
+
diff --git a/src/GetEventData.c b/src/GetEventData.c
new file mode 100644 (file)
index 0000000..b93dee6
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Copyright © 2009 Red Hat, Inc.
+ *
+ * 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.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+
+Bool
+XGetEventData(Display *dpy, XGenericEventCookie *event)
+{
+    Bool rc;
+    LockDisplay(dpy);
+
+    rc = _XFetchEventCookie(dpy, event);
+
+    UnlockDisplay(dpy);
+
+    return rc;
+}
+
diff --git a/src/GetFPath.c b/src/GetFPath.c
new file mode 100644 (file)
index 0000000..7d497c9
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+char **XGetFontPath(
+    register Display *dpy,
+    int *npaths)       /* RETURN */
+{
+       xGetFontPathReply rep;
+       register long nbytes;
+       char **flist;
+       char *ch;
+       register unsigned i;
+       register int length;
+       register xReq *req;
+
+       LockDisplay(dpy);
+       GetEmptyReq (GetFontPath, req);
+       (void) _XReply (dpy, (xReply *) &rep, 0, xFalse);
+
+       if (rep.nPaths) {
+           flist = (char **)
+               Xmalloc((unsigned) rep.nPaths * sizeof (char *));
+           nbytes = (long)rep.length << 2;
+           ch = (char *) Xmalloc ((unsigned) (nbytes + 1));
+                /* +1 to leave room for last null-terminator */
+
+           if ((! flist) || (! ch)) {
+               if (flist) Xfree((char *) flist);
+               if (ch) Xfree(ch);
+               _XEatData(dpy, (unsigned long) nbytes);
+               UnlockDisplay(dpy);
+               SyncHandle();
+               return (char **) NULL;
+           }
+
+           _XReadPad (dpy, ch, nbytes);
+           /*
+            * unpack into null terminated strings.
+            */
+           length = *ch;
+           for (i = 0; i < rep.nPaths; i++) {
+               flist[i] = ch+1;  /* skip over length */
+               ch += length + 1; /* find next length ... */
+               length = *ch;
+               *ch = '\0'; /* and replace with null-termination */
+           }
+       }
+       else flist = NULL;
+       *npaths = rep.nPaths;
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return (flist);
+}
+
+int
+XFreeFontPath (char **list)
+{
+       if (list != NULL) {
+               Xfree (list[0]-1);
+               Xfree ((char *)list);
+       }
+       return 1;
+}
diff --git a/src/GetFProp.c b/src/GetFProp.c
new file mode 100644 (file)
index 0000000..27ec98b
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+Bool XGetFontProperty (
+    XFontStruct *fs,
+    register Atom name,
+    unsigned long *valuePtr)
+{
+    /* XXX this is a simple linear search for now.  If the
+      protocol is changed to sort the property list, this should
+      become a binary search. */
+    register XFontProp *prop = fs->properties;
+    register XFontProp *last = prop + fs->n_properties;
+    while (prop != last) {
+       if (prop->name == name) {
+           *valuePtr = prop->card32;
+           return (1);
+           }
+       prop++;
+       }
+    return (0);
+    }
+
+
+
+
+
diff --git a/src/GetGCVals.c b/src/GetGCVals.c
new file mode 100644 (file)
index 0000000..4861739
--- /dev/null
@@ -0,0 +1,128 @@
+
+/*
+
+Copyright 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 "Xlibint.h"
+
+/*
+ * All gc fields except GCClipMask and GCDashList
+ */
+#define ValidGCValuesBits (GCFunction | GCPlaneMask | GCForeground | \
+                          GCBackground | GCLineWidth | GCLineStyle | \
+                          GCCapStyle | GCJoinStyle | GCFillStyle | \
+                          GCFillRule | GCTile | GCStipple | \
+                          GCTileStipXOrigin | GCTileStipYOrigin | \
+                          GCFont | GCSubwindowMode | GCGraphicsExposures | \
+                          GCClipXOrigin | GCClipYOrigin | GCDashOffset | \
+                          GCArcMode)
+
+/*ARGSUSED*/
+Status XGetGCValues (
+    Display *dpy,
+    GC gc,
+    unsigned long valuemask,
+    XGCValues *values)
+{
+    if (valuemask == ValidGCValuesBits) {
+       char dashes = values->dashes;
+       Pixmap clip_mask = values->clip_mask;
+       *values = gc->values;
+       values->dashes = dashes;
+       values->clip_mask = clip_mask;
+       return True;
+    }
+
+    if (valuemask & ~ValidGCValuesBits) return False;
+
+    if (valuemask & GCFunction)
+      values->function = gc->values.function;
+
+    if (valuemask & GCPlaneMask)
+      values->plane_mask = gc->values.plane_mask;
+
+    if (valuemask & GCForeground)
+      values->foreground = gc->values.foreground;
+
+    if (valuemask & GCBackground)
+      values->background = gc->values.background;
+
+    if (valuemask & GCLineWidth)
+      values->line_width = gc->values.line_width;
+
+    if (valuemask & GCLineStyle)
+      values->line_style = gc->values.line_style;
+
+    if (valuemask & GCCapStyle)
+      values->cap_style = gc->values.cap_style;
+
+    if (valuemask & GCJoinStyle)
+      values->join_style = gc->values.join_style;
+
+    if (valuemask & GCFillStyle)
+      values->fill_style = gc->values.fill_style;
+
+    if (valuemask & GCFillRule)
+      values->fill_rule = gc->values.fill_rule;
+
+    if (valuemask & GCTile)
+      values->tile = gc->values.tile;
+
+    if (valuemask & GCStipple)
+      values->stipple = gc->values.stipple;
+
+    if (valuemask & GCTileStipXOrigin)
+      values->ts_x_origin = gc->values.ts_x_origin;
+
+    if (valuemask & GCTileStipYOrigin)
+      values->ts_y_origin = gc->values.ts_y_origin;
+
+    if (valuemask & GCFont)
+      values->font = gc->values.font;
+
+    if (valuemask & GCSubwindowMode)
+      values->subwindow_mode = gc->values.subwindow_mode;
+
+    if (valuemask & GCGraphicsExposures)
+      values->graphics_exposures = gc->values.graphics_exposures;
+
+    if (valuemask & GCClipXOrigin)
+      values->clip_x_origin = gc->values.clip_x_origin;
+
+    if (valuemask & GCClipYOrigin)
+      values->clip_y_origin = gc->values.clip_y_origin;
+
+    if (valuemask & GCDashOffset)
+
+      values->dash_offset = gc->values.dash_offset;
+
+    if (valuemask & GCArcMode)
+      values->arc_mode = gc->values.arc_mode;
+
+    return True;
+}
diff --git a/src/GetGeom.c b/src/GetGeom.c
new file mode 100644 (file)
index 0000000..1e1249d
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+Status XGetGeometry (
+    register Display *dpy,
+    Drawable d,
+    Window *root, /* RETURN */
+    int *x,
+    int *y,  /* RETURN */
+    unsigned int *width,
+    unsigned int *height,
+    unsigned int *borderWidth,
+    unsigned int *depth)  /* RETURN */
+{
+    xGetGeometryReply rep;
+    register xResourceReq *req;
+    LockDisplay(dpy);
+    GetResReq(GetGeometry, d, req);
+    if (!_XReply (dpy, (xReply *)&rep, 0, xTrue)) {
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return (0);
+       }
+    *root = rep.root;
+    *x = cvtINT16toInt (rep.x);
+    *y = cvtINT16toInt (rep.y);
+    *width = rep.width;
+    *height = rep.height;
+    *borderWidth = rep.borderWidth;
+    *depth = rep.depth;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return (1);
+}
+
diff --git a/src/GetHColor.c b/src/GetHColor.c
new file mode 100644 (file)
index 0000000..081a224
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+Status XAllocColor(
+    register Display *dpy,
+    Colormap cmap,
+    XColor *def)
+{
+    Status status;
+    xAllocColorReply rep;
+    register xAllocColorReq *req;
+    LockDisplay(dpy);
+    GetReq(AllocColor, req);
+
+    req->cmap = cmap;
+    req->red = def->red;
+    req->green = def->green;
+    req->blue = def->blue;
+
+    status = _XReply(dpy, (xReply *) &rep, 0, xTrue);
+    if (status) {
+      def->pixel = rep.pixel;
+      def->red = rep.red;
+      def->green = rep.green;
+      def->blue = rep.blue;
+      }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return(status);
+}
diff --git a/src/GetHints.c b/src/GetHints.c
new file mode 100644 (file)
index 0000000..4800fe7
--- /dev/null
@@ -0,0 +1,339 @@
+
+/***********************************************************
+
+Copyright 1987, 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 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 <X11/Xlibint.h>
+#include <X11/Xos.h>
+#include <X11/Xutil.h>
+#include "Xatomtype.h"
+#include <X11/Xatom.h>
+#include <stdio.h>
+
+Status XGetSizeHints (
+       Display *dpy,
+       Window w,
+       XSizeHints *hints,
+        Atom property)
+{
+       xPropSizeHints *prop = NULL;
+        Atom actual_type;
+        int actual_format;
+        unsigned long leftover;
+        unsigned long nitems;
+       if (XGetWindowProperty(dpy, w, property, 0L,
+                              (long) OldNumPropSizeElements,
+           False, XA_WM_SIZE_HINTS, &actual_type, &actual_format,
+            &nitems, &leftover, (unsigned char **)&prop)
+            != Success) return (0);
+
+        if ((actual_type != XA_WM_SIZE_HINTS) ||
+           (nitems < OldNumPropSizeElements) || (actual_format != 32)) {
+               if (prop != NULL) Xfree ((char *)prop);
+                return(0);
+               }
+       hints->flags      = (prop->flags & (USPosition|USSize|PAllHints));
+       hints->x          = cvtINT32toInt (prop->x);
+       hints->y          = cvtINT32toInt (prop->y);
+       hints->width      = cvtINT32toInt (prop->width);
+       hints->height     = cvtINT32toInt (prop->height);
+       hints->min_width  = cvtINT32toInt (prop->minWidth);
+       hints->min_height = cvtINT32toInt (prop->minHeight);
+       hints->max_width  = cvtINT32toInt (prop->maxWidth);
+       hints->max_height = cvtINT32toInt (prop->maxHeight);
+       hints->width_inc  = cvtINT32toInt (prop->widthInc);
+       hints->height_inc = cvtINT32toInt (prop->heightInc);
+       hints->min_aspect.x = cvtINT32toInt (prop->minAspectX);
+       hints->min_aspect.y = cvtINT32toInt (prop->minAspectY);
+       hints->max_aspect.x = cvtINT32toInt (prop->maxAspectX);
+       hints->max_aspect.y = cvtINT32toInt (prop->maxAspectY);
+       Xfree((char *)prop);
+       return(1);
+}
+
+/*
+ * must return a pointer to the hint, in malloc'd memory, or routine is not
+ * extensible; any use of the caller's memory would cause things to be stepped
+ * on.
+ */
+
+XWMHints *XGetWMHints (
+       Display *dpy,
+       Window w)
+{
+       xPropWMHints *prop = NULL;
+       register XWMHints *hints;
+        Atom actual_type;
+        int actual_format;
+        unsigned long leftover;
+        unsigned long nitems;
+       if (XGetWindowProperty(dpy, w, XA_WM_HINTS,
+           0L, (long)NumPropWMHintsElements,
+           False, XA_WM_HINTS, &actual_type, &actual_format,
+            &nitems, &leftover, (unsigned char **)&prop)
+            != Success) return (NULL);
+
+       /* If the property is undefined on the window, return null pointer. */
+       /* pre-R3 bogusly truncated window_group, don't fail on them */
+
+        if ((actual_type != XA_WM_HINTS) ||
+           (nitems < (NumPropWMHintsElements - 1)) || (actual_format != 32)) {
+               if (prop != NULL) Xfree ((char *)prop);
+                return(NULL);
+               }
+       /* static copies not allowed in library, due to reentrancy constraint*/
+       if ((hints = (XWMHints *) Xcalloc (1, (unsigned) sizeof(XWMHints)))) {
+           hints->flags = prop->flags;
+           hints->input = (prop->input ? True : False);
+           hints->initial_state = cvtINT32toInt (prop->initialState);
+           hints->icon_pixmap = prop->iconPixmap;
+           hints->icon_window = prop->iconWindow;
+           hints->icon_x = cvtINT32toInt (prop->iconX);
+           hints->icon_y = cvtINT32toInt (prop->iconY);
+           hints->icon_mask = prop->iconMask;
+           if (nitems >= NumPropWMHintsElements)
+               hints->window_group = prop->windowGroup;
+           else
+               hints->window_group = 0;
+       }
+       Xfree ((char *)prop);
+       return(hints);
+}
+
+Status
+XGetZoomHints (
+       Display *dpy,
+       Window w,
+       XSizeHints *zhints)
+{
+       return (XGetSizeHints(dpy, w, zhints, XA_WM_ZOOM_HINTS));
+}
+
+Status
+XGetNormalHints (
+       Display *dpy,
+       Window w,
+       XSizeHints *hints)
+{
+       return (XGetSizeHints(dpy, w, hints, XA_WM_NORMAL_HINTS));
+}
+
+
+/*
+ * XGetIconSizes reads the property
+ *     ICONSIZE_ATOM   type: ICONSIZE_ATOM format: 32
+ */
+
+Status XGetIconSizes (
+       Display *dpy,
+       Window w,       /* typically, root */
+       XIconSize **size_list,  /* RETURN */
+       int *count)             /* RETURN number of items on the list */
+{
+       xPropIconSize *prop = NULL;
+       register xPropIconSize *pp;
+       register XIconSize *hp, *hints;
+        Atom actual_type;
+        int actual_format;
+        unsigned long leftover;
+        unsigned long nitems;
+       register int i;
+
+       if (XGetWindowProperty(dpy, w, XA_WM_ICON_SIZE, 0L, 60L,
+           False, XA_WM_ICON_SIZE, &actual_type, &actual_format,
+            &nitems, &leftover, (unsigned char **)&prop)
+            != Success) return (0);
+
+       pp = prop;
+
+        if ((actual_type != XA_WM_ICON_SIZE) ||
+           (nitems < NumPropIconSizeElements) ||
+           (nitems % NumPropIconSizeElements != 0) ||
+           (actual_format != 32)) {
+               if (prop != NULL) Xfree ((char *)prop);
+                return(0);
+               }
+
+       /* static copies not allowed in library, due to reentrancy constraint*/
+
+       nitems /= NumPropIconSizeElements;
+       if (! (hp = hints = (XIconSize *)
+         Xcalloc ((unsigned) nitems, (unsigned) sizeof(XIconSize)))) {
+           if (prop) Xfree ((char *) prop);
+           return 0;
+       }
+
+       /* march down array putting things into native form */
+       for (i = 0; i < nitems; i++) {
+           hp->min_width  = cvtINT32toInt (pp->minWidth);
+           hp->min_height = cvtINT32toInt (pp->minHeight);
+           hp->max_width  = cvtINT32toInt (pp->maxWidth);
+           hp->max_height = cvtINT32toInt (pp->maxHeight);
+           hp->width_inc  = cvtINT32toInt (pp->widthInc);
+           hp->height_inc = cvtINT32toInt (pp->heightInc);
+           hp += 1;
+           pp += 1;
+       }
+       *count = nitems;
+       *size_list = hints;
+       Xfree ((char *)prop);
+       return(1);
+}
+
+
+Status XGetCommand (
+    Display *dpy,
+    Window w,
+    char ***argvp,
+    int *argcp)
+{
+    XTextProperty tp;
+    int argc;
+    char **argv;
+
+    if (!XGetTextProperty (dpy, w, &tp, XA_WM_COMMAND)) return 0;
+
+    if (tp.encoding != XA_STRING || tp.format != 8) {
+       if (tp.value) Xfree ((char *) tp.value);
+       return 0;
+    }
+
+
+    /*
+     * ignore final <NUL> if present since UNIX WM_COMMAND is nul-terminated
+     */
+    if (tp.nitems && (tp.value[tp.nitems - 1] == '\0')) tp.nitems--;
+
+
+    /*
+     * create a string list and return if successful
+     */
+    if (!XTextPropertyToStringList (&tp, &argv, &argc)) {
+       if (tp.value) Xfree ((char *) tp.value);
+       return (0);
+    }
+
+    if (tp.value) Xfree ((char *) tp.value);
+    *argvp = argv;
+    *argcp = argc;
+    return 1;
+}
+
+
+Status
+XGetTransientForHint(
+       Display *dpy,
+       Window w,
+       Window *propWindow)
+{
+    Atom actual_type;
+    int actual_format;
+    unsigned long nitems;
+    unsigned long leftover;
+    Window *data = NULL;
+    if (XGetWindowProperty(dpy, w, XA_WM_TRANSIENT_FOR, 0L, 1L, False,
+        XA_WINDOW,
+       &actual_type,
+       &actual_format, &nitems, &leftover, (unsigned char **) &data)
+       != Success) {
+       *propWindow = None;
+       return (0);
+       }
+    if ( (actual_type == XA_WINDOW) && (actual_format == 32) &&
+        (nitems != 0) ) {
+       *propWindow = *data;
+       Xfree( (char *) data);
+       return (1);
+       }
+    *propWindow = None;
+    if (data) Xfree( (char *) data);
+    return(0);
+}
+
+Status
+XGetClassHint(
+       Display *dpy,
+       Window w,
+       XClassHint *classhint)  /* RETURN */
+{
+    int len_name, len_class;
+
+    Atom actual_type;
+    int actual_format;
+    unsigned long nitems;
+    unsigned long leftover;
+    unsigned char *data = NULL;
+    if (XGetWindowProperty(dpy, w, XA_WM_CLASS, 0L, (long)BUFSIZ, False,
+        XA_STRING,
+       &actual_type,
+       &actual_format, &nitems, &leftover, &data) != Success)
+           return (0);
+
+   if ( (actual_type == XA_STRING) && (actual_format == 8) ) {
+       len_name = strlen((char *) data);
+       if (! (classhint->res_name = Xmalloc((unsigned) (len_name+1)))) {
+           Xfree((char *) data);
+           return (0);
+       }
+       strcpy(classhint->res_name, (char *) data);
+       if (len_name == nitems) len_name--;
+       len_class = strlen((char *) (data+len_name+1));
+       if (! (classhint->res_class = Xmalloc((unsigned) (len_class+1)))) {
+           Xfree(classhint->res_name);
+           classhint->res_name = (char *) NULL;
+           Xfree((char *) data);
+           return (0);
+       }
+       strcpy(classhint->res_class, (char *) (data+len_name+1));
+       Xfree( (char *) data);
+       return(1);
+       }
+    if (data) Xfree( (char *) data);
+    return(0);
+}
diff --git a/src/GetIFocus.c b/src/GetIFocus.c
new file mode 100644 (file)
index 0000000..5d43ead
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XGetInputFocus(
+     register Display *dpy,
+     Window *focus,
+     int *revert_to)
+{
+    xGetInputFocusReply rep;
+    register xReq *req;
+    LockDisplay(dpy);
+    GetEmptyReq(GetInputFocus, req);
+    (void) _XReply (dpy, (xReply *)&rep, 0, xTrue);
+    *focus = rep.focus;
+    *revert_to = rep.revertTo;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/GetImage.c b/src/GetImage.c
new file mode 100644 (file)
index 0000000..e8f1b03
--- /dev/null
@@ -0,0 +1,128 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+#include <X11/Xutil.h>         /* for XDestroyImage */
+#include "ImUtil.h"
+
+#define ROUNDUP(nbytes, pad) (((((nbytes) - 1) + (pad)) / (pad)) * (pad))
+
+static unsigned int Ones(                /* HACKMEM 169 */
+    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));
+}
+
+XImage *XGetImage (
+     register Display *dpy,
+     Drawable d,
+     int x,
+     int y,
+     unsigned int width,
+     unsigned int height,
+     unsigned long plane_mask,
+     int format)       /* either XYPixmap or ZPixmap */
+{
+       xGetImageReply rep;
+       register xGetImageReq *req;
+       char *data;
+       long nbytes;
+       XImage *image;
+       LockDisplay(dpy);
+       GetReq (GetImage, req);
+       /*
+        * first set up the standard stuff in the request
+        */
+       req->drawable = d;
+       req->x = x;
+       req->y = y;
+       req->width = width;
+       req->height = height;
+       req->planeMask = plane_mask;
+       req->format = format;
+
+       if (_XReply (dpy, (xReply *) &rep, 0, xFalse) == 0 ||
+           rep.length == 0) {
+               UnlockDisplay(dpy);
+               SyncHandle();
+               return (XImage *)NULL;
+       }
+
+       nbytes = (long)rep.length << 2;
+       data = (char *) Xmalloc((unsigned) nbytes);
+       if (! data) {
+           _XEatData(dpy, (unsigned long) nbytes);
+           UnlockDisplay(dpy);
+           SyncHandle();
+           return (XImage *) NULL;
+       }
+        _XReadPad (dpy, data, nbytes);
+        if (format == XYPixmap)
+          image = XCreateImage(dpy, _XVIDtoVisual(dpy, rep.visual),
+                 Ones (plane_mask &
+                       (((unsigned long)0xFFFFFFFF) >> (32 - rep.depth))),
+                 format, 0, data, width, height, dpy->bitmap_pad, 0);
+       else /* format == ZPixmap */
+           image = XCreateImage (dpy, _XVIDtoVisual(dpy, rep.visual),
+                rep.depth, ZPixmap, 0, data, width, height,
+                 _XGetScanlinePad(dpy, (int) rep.depth), 0);
+
+       if (!image)
+           Xfree(data);
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return (image);
+}
+
+XImage *XGetSubImage(
+     register Display *dpy,
+     Drawable d,
+     int x,
+     int y,
+     unsigned int width,
+     unsigned int height,
+     unsigned long plane_mask,
+     int format,       /* either XYPixmap or ZPixmap */
+     XImage *dest_image,
+     int dest_x,
+     int dest_y)
+{
+       XImage *temp_image;
+       temp_image = XGetImage(dpy, d, x, y, width, height,
+                               plane_mask, format);
+       if (!temp_image)
+           return (XImage *)NULL;
+       _XSetImage(temp_image, dest_image, dest_x, dest_y);
+       XDestroyImage(temp_image);
+       return (dest_image);
+}
diff --git a/src/GetKCnt.c b/src/GetKCnt.c
new file mode 100644 (file)
index 0000000..17f487f
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XGetKeyboardControl (
+    register Display *dpy,
+    register XKeyboardState *state)
+{
+    xGetKeyboardControlReply rep;
+    register xReq *req;
+    LockDisplay(dpy);
+    GetEmptyReq (GetKeyboardControl, req);
+    (void) _XReply (dpy, (xReply *) &rep,
+       (SIZEOF(xGetKeyboardControlReply) - SIZEOF(xReply)) >> 2, xTrue);
+
+    state->key_click_percent = rep.keyClickPercent;
+    state->bell_percent = rep.bellPercent;
+    state->bell_pitch = rep.bellPitch;
+    state->bell_duration = rep.bellDuration;
+    state->led_mask = rep.ledMask;
+    state->global_auto_repeat = rep.globalAutoRepeat;
+    memcpy (state->auto_repeats, rep.map, sizeof state->auto_repeats);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+    }
+
diff --git a/src/GetMoEv.c b/src/GetMoEv.c
new file mode 100644 (file)
index 0000000..3db176f
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+XTimeCoord *XGetMotionEvents(
+    register Display *dpy,
+    Window w,
+    Time start,
+    Time stop,
+    int *nEvents)  /* RETURN */
+{
+    xGetMotionEventsReply rep;
+    register xGetMotionEventsReq *req;
+    XTimeCoord *tc = NULL;
+    long nbytes;
+    LockDisplay(dpy);
+    GetReq(GetMotionEvents, req);
+    req->window = w;
+/* XXX is this right for all machines? */
+    req->start = start;
+    req->stop  = stop;
+    if (!_XReply (dpy, (xReply *)&rep, 0, xFalse)) {
+       UnlockDisplay(dpy);
+        SyncHandle();
+       return (NULL);
+       }
+
+    if (rep.nEvents) {
+       if (! (tc = (XTimeCoord *)
+              Xmalloc( (unsigned)
+                      (nbytes = (long) rep.nEvents * sizeof(XTimeCoord))))) {
+           _XEatData (dpy, (unsigned long) nbytes);
+           UnlockDisplay(dpy);
+           SyncHandle();
+           return (NULL);
+       }
+    }
+
+    *nEvents = rep.nEvents;
+    nbytes = SIZEOF (xTimecoord);
+    {
+       register XTimeCoord *tcptr;
+       register int i;
+       xTimecoord xtc;
+
+       for (i = rep.nEvents, tcptr = tc; i > 0; i--, tcptr++) {
+           _XRead (dpy, (char *) &xtc, nbytes);
+           tcptr->time = xtc.time;
+           tcptr->x    = cvtINT16toShort (xtc.x);
+           tcptr->y    = cvtINT16toShort (xtc.y);
+       }
+    }
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return (tc);
+}
+
diff --git a/src/GetNrmHint.c b/src/GetNrmHint.c
new file mode 100644 (file)
index 0000000..6f328e8
--- /dev/null
@@ -0,0 +1,127 @@
+/***********************************************************
+Copyright 1988 by Wyse Technology, Inc., San Jose, Ca,
+Copyright 1987 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 AND WYSE DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL DIGITAL OR WYSE 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 <X11/Xlibint.h>
+#include <X11/Xatom.h>
+#include "Xatomtype.h"
+#include <X11/Xutil.h>
+#include <stdio.h>
+
+Status XGetWMSizeHints (
+    Display *dpy,
+    Window w,
+    XSizeHints *hints,
+    long *supplied,
+    Atom property)
+{
+    xPropSizeHints *prop = NULL;
+    Atom actual_type;
+    int actual_format;
+    unsigned long leftover;
+    unsigned long nitems;
+
+    if (XGetWindowProperty (dpy, w, property, 0L,
+                           (long)NumPropSizeElements,
+                           False, XA_WM_SIZE_HINTS, &actual_type,
+                           &actual_format, &nitems, &leftover,
+                           (unsigned char **)&prop)
+       != Success)
+      return False;
+
+    if ((actual_type != XA_WM_SIZE_HINTS) ||
+       (nitems < OldNumPropSizeElements) || (actual_format != 32)) {
+       if (prop != NULL) Xfree ((char *)prop);
+       return False;
+    }
+
+    hints->flags         = prop->flags;
+    /* XSizeHints misdeclares these as int instead of long */
+    hints->x = cvtINT32toInt (prop->x);
+    hints->y = cvtINT32toInt (prop->y);
+    hints->width = cvtINT32toInt (prop->width);
+    hints->height = cvtINT32toInt (prop->height);
+    hints->min_width  = cvtINT32toInt (prop->minWidth);
+    hints->min_height = cvtINT32toInt (prop->minHeight);
+    hints->max_width  = cvtINT32toInt (prop->maxWidth);
+    hints->max_height = cvtINT32toInt (prop->maxHeight);
+    hints->width_inc  = cvtINT32toInt (prop->widthInc);
+    hints->height_inc = cvtINT32toInt (prop->heightInc);
+    hints->min_aspect.x = cvtINT32toInt (prop->minAspectX);
+    hints->min_aspect.y = cvtINT32toInt (prop->minAspectY);
+    hints->max_aspect.x = cvtINT32toInt (prop->maxAspectX);
+    hints->max_aspect.y = cvtINT32toInt (prop->maxAspectY);
+
+    *supplied = (USPosition | USSize | PAllHints);
+    if (nitems >= NumPropSizeElements) {
+       hints->base_width= cvtINT32toInt (prop->baseWidth);
+       hints->base_height= cvtINT32toInt (prop->baseHeight);
+       hints->win_gravity= cvtINT32toInt (prop->winGravity);
+       *supplied |= (PBaseSize | PWinGravity);
+    }
+    hints->flags &= (*supplied);       /* get rid of unwanted bits */
+    Xfree((char *)prop);
+    return True;
+}
+
+
+Status XGetWMNormalHints (
+    Display *dpy,
+    Window w,
+    XSizeHints *hints,
+    long *supplied)
+{
+    return (XGetWMSizeHints (dpy, w, hints, supplied, XA_WM_NORMAL_HINTS));
+}
diff --git a/src/GetPCnt.c b/src/GetPCnt.c
new file mode 100644 (file)
index 0000000..2c35d21
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XGetPointerControl(
+     register Display *dpy,
+     /* the following are return only vars */
+     int *accel_numer,
+     int *accel_denom,
+     int *threshold)
+{
+    xGetPointerControlReply rep;
+    xReq *req;
+    LockDisplay(dpy);
+    GetEmptyReq(GetPointerControl, req);
+    (void) _XReply (dpy, (xReply *)&rep, 0, xTrue);
+    *accel_numer = rep.accelNumerator;
+    *accel_denom = rep.accelDenominator;
+    *threshold = rep.threshold;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/GetPntMap.c b/src/GetPntMap.c
new file mode 100644 (file)
index 0000000..0fcdb66
--- /dev/null
@@ -0,0 +1,123 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+#ifdef MIN             /* some systems define this in <sys/param.h> */
+#undef MIN
+#endif
+#define MIN(a, b) ((a) < (b) ? (a) : (b))
+
+int XGetPointerMapping (
+    register Display *dpy,
+    unsigned char *map,        /* RETURN */
+    int nmaps)
+
+{
+    unsigned char mapping[256];        /* known fixed size */
+    long nbytes, remainder = 0;
+    xGetPointerMappingReply rep;
+    register xReq *req;
+
+    LockDisplay(dpy);
+    GetEmptyReq(GetPointerMapping, req);
+    if (! _XReply(dpy, (xReply *)&rep, 0, xFalse)) {
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return 0;
+    }
+
+    nbytes = (long)rep.length << 2;
+
+    /* Don't count on the server returning a valid value */
+    if (nbytes > sizeof mapping) {
+       remainder = nbytes - sizeof mapping;
+       nbytes = sizeof mapping;
+    }
+    _XRead (dpy, (char *)mapping, nbytes);
+    /* don't return more data than the user asked for. */
+    if (rep.nElts) {
+           memcpy ((char *) map, (char *) mapping,
+               MIN((int)rep.nElts, nmaps) );
+       }
+
+    if (remainder)
+       _XEatData(dpy, (unsigned long)remainder);
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return ((int) rep.nElts);
+}
+
+KeySym *
+XGetKeyboardMapping (Display *dpy,
+#if NeedWidePrototypes
+                            unsigned int first_keycode,
+#else
+                            KeyCode first_keycode,
+#endif
+                            int count,
+                            int *keysyms_per_keycode)
+{
+    long nbytes;
+    unsigned long nkeysyms;
+    register KeySym *mapping = NULL;
+    xGetKeyboardMappingReply rep;
+    register xGetKeyboardMappingReq *req;
+
+    LockDisplay(dpy);
+    GetReq(GetKeyboardMapping, req);
+    req->firstKeyCode = first_keycode;
+    req->count = count;
+    if (! _XReply(dpy, (xReply *)&rep, 0, xFalse)) {
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return (KeySym *) NULL;
+    }
+
+    nkeysyms = (unsigned long) rep.length;
+    if (nkeysyms > 0) {
+       nbytes = nkeysyms * sizeof (KeySym);
+       mapping = (KeySym *) Xmalloc ((unsigned) nbytes);
+       nbytes = nkeysyms << 2;
+       if (! mapping) {
+           _XEatData(dpy, (unsigned long) nbytes);
+           UnlockDisplay(dpy);
+           SyncHandle();
+           return (KeySym *) NULL;
+       }
+       _XRead32 (dpy, (long *) mapping, nbytes);
+    }
+    *keysyms_per_keycode = rep.keySymsPerKeyCode;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return (mapping);
+}
+
diff --git a/src/GetProp.c b/src/GetProp.c
new file mode 100644 (file)
index 0000000..5d6e0b8
--- /dev/null
@@ -0,0 +1,133 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XGetWindowProperty(
+    register Display *dpy,
+    Window w,
+    Atom property,
+    long offset,
+    long length,
+    Bool delete,
+    Atom req_type,
+    Atom *actual_type,         /* RETURN */
+    int *actual_format,        /* RETURN  8, 16, or 32 */
+    unsigned long *nitems,     /* RETURN  # of 8-, 16-, or 32-bit entities */
+    unsigned long *bytesafter, /* RETURN */
+    unsigned char **prop)      /* RETURN */
+{
+    xGetPropertyReply reply;
+    register xGetPropertyReq *req;
+    xError error = {0};
+
+    LockDisplay(dpy);
+    GetReq (GetProperty, req);
+    req->window = w;
+    req->property = property;
+    req->type = req_type;
+    req->delete = delete;
+    req->longOffset = offset;
+    req->longLength = length;
+    error.sequenceNumber = dpy->request;
+
+    if (!_XReply (dpy, (xReply *) &reply, 0, xFalse)) {
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return (1);     /* not Success */
+       }
+
+    *prop = (unsigned char *) NULL;
+    if (reply.propertyType != None) {
+       long nbytes, netbytes;
+       switch (reply.format) {
+      /*
+       * One extra byte is malloced than is needed to contain the property
+       * data, but this last byte is null terminated and convenient for
+       * returning string properties, so the client doesn't then have to
+       * recopy the string to make it null terminated.
+       */
+         case 8:
+           nbytes = netbytes = reply.nItems;
+           if (nbytes + 1 > 0 &&
+               (*prop = (unsigned char *) Xmalloc ((unsigned)nbytes + 1)))
+               _XReadPad (dpy, (char *) *prop, netbytes);
+           break;
+
+         case 16:
+           nbytes = reply.nItems * sizeof (short);
+           netbytes = reply.nItems << 1;
+           if (nbytes + 1 > 0 &&
+               (*prop = (unsigned char *) Xmalloc ((unsigned)nbytes + 1)))
+               _XRead16Pad (dpy, (short *) *prop, netbytes);
+           break;
+
+         case 32:
+           nbytes = reply.nItems * sizeof (long);
+           netbytes = reply.nItems << 2;
+           if (nbytes + 1 > 0 &&
+               (*prop = (unsigned char *) Xmalloc ((unsigned)nbytes + 1)))
+               _XRead32 (dpy, (long *) *prop, netbytes);
+           break;
+
+         default:
+           /*
+            * This part of the code should never be reached.  If it is,
+            * the server sent back a property with an invalid format.
+            * This is a BadImplementation error.
+            */
+           {
+               /* sequence number stored above */
+               error.type = X_Error;
+               error.majorCode = X_GetProperty;
+               error.minorCode = 0;
+               error.errorCode = BadImplementation;
+               _XError(dpy, &error);
+           }
+           nbytes = netbytes = 0L;
+           break;
+       }
+       if (! *prop) {
+           _XEatData(dpy, (unsigned long) netbytes);
+           UnlockDisplay(dpy);
+           SyncHandle();
+           return(BadAlloc);   /* not Success */
+       }
+       (*prop)[nbytes] = '\0';
+    }
+    *actual_type = reply.propertyType;
+    *actual_format = reply.format;
+    *nitems = reply.nItems;
+    *bytesafter = reply.bytesAfter;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return(Success);
+}
+
diff --git a/src/GetRGBCMap.c b/src/GetRGBCMap.c
new file mode 100644 (file)
index 0000000..9e227a2
--- /dev/null
@@ -0,0 +1,135 @@
+
+/*
+
+Copyright 1987, 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 <X11/Xlibint.h>
+#include <X11/Xutil.h>
+#include "Xatomtype.h"
+#include <X11/Xatom.h>
+
+Status XGetRGBColormaps (
+    Display *dpy,
+    Window w,
+    XStandardColormap **stdcmap,       /* RETURN */
+    int *count,                                /* RETURN */
+    Atom property)                     /* XA_RGB_BEST_MAP, etc. */
+{
+    register int i;                    /* iterator variable */
+    xPropStandardColormap *data = NULL;         /* data read in from prop */
+    Atom actual_type;                  /* how the prop was actually stored */
+    int actual_format;                 /* ditto */
+    unsigned long leftover;            /* how much was left over */
+    unsigned long nitems;              /* number of 32bits read */
+    int ncmaps;                                /* number of structs this makes */
+    Bool old_style = False;            /* if was too short */
+    VisualID def_visual = None;                /* visual to use if prop too short */
+    XStandardColormap *cmaps;          /* return value */
+
+
+    if (XGetWindowProperty (dpy, w, property, 0L, 1000000L, False,
+                           XA_RGB_COLOR_MAP, &actual_type, &actual_format,
+                           &nitems, &leftover, (unsigned char **)&data)
+       != Success)
+      return False;
+
+    /* if wrong type or format, or too small for us, then punt */
+    if ((actual_type != XA_RGB_COLOR_MAP) || (actual_format != 32) ||
+       (nitems < OldNumPropStandardColormapElements)) {
+       if (data) Xfree ((char *) data);
+       return False;
+    }
+
+    /*
+     * See how many properties were found; if pre-ICCCM then assume
+     * default visual and a kill id of 1.
+     */
+    if (nitems < NumPropStandardColormapElements) {
+       ncmaps = 1;
+       old_style = True;
+       if (nitems < (NumPropStandardColormapElements - 1)) {
+           Screen *sp = _XScreenOfWindow (dpy, w);
+
+           if (!sp) {
+               if (data) Xfree ((char *) data);
+               return False;
+           }
+           def_visual = sp->root_visual->visualid;
+       }
+    } else {
+       /*
+        * make sure we have an integral number of colormaps
+        */
+       ncmaps = (nitems / NumPropStandardColormapElements);
+       if ((((unsigned long) ncmaps) * NumPropStandardColormapElements) !=
+           nitems) {
+           if (data) Xfree ((char *) data);
+           return False;
+       }
+    }
+
+
+    /*
+     * allocate array
+     */
+    cmaps = (XStandardColormap *) Xmalloc (ncmaps *
+                                          sizeof (XStandardColormap));
+    if (!cmaps) {
+       if (data) Xfree ((char *) data);
+       return False;
+    }
+
+
+    /*
+     * and fill it in, handling compatibility with pre-ICCCM short stdcmaps
+     */
+    {
+       register XStandardColormap *map;
+       register xPropStandardColormap *prop;
+
+       for (i = ncmaps, map = cmaps, prop = data; i > 0; i--, map++, prop++) {
+           map->colormap   = prop->colormap;
+           map->red_max    = prop->red_max;
+           map->red_mult   = prop->red_mult;
+           map->green_max  = prop->green_max;
+           map->green_mult = prop->green_mult;
+           map->blue_max   = prop->blue_max;
+           map->blue_mult  = prop->blue_mult;
+           map->base_pixel = prop->base_pixel;
+           map->visualid   = (def_visual ? def_visual : prop->visualid);
+           map->killid     = (old_style ? None : prop->killid);
+       }
+    }
+    Xfree ((char *) data);
+    *stdcmap = cmaps;
+    *count = ncmaps;
+    return True;
+}
+
diff --git a/src/GetSOwner.c b/src/GetSOwner.c
new file mode 100644 (file)
index 0000000..2258f8c
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+Window XGetSelectionOwner(
+    register Display *dpy,
+    Atom selection)
+{
+    xGetSelectionOwnerReply rep;
+    register xResourceReq *req;
+    LockDisplay(dpy);
+    GetResReq(GetSelectionOwner, selection, req);
+
+    if (_XReply(dpy, (xReply *)&rep, 0, xTrue) == 0) rep.owner = None;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return(rep.owner);
+}
diff --git a/src/GetSSaver.c b/src/GetSSaver.c
new file mode 100644 (file)
index 0000000..1aba3bb
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XGetScreenSaver(
+     register Display *dpy,
+     /* the following are return only vars */
+     int *timeout,
+     int *interval,
+     int *prefer_blanking,
+     int *allow_exp)  /*boolean */
+
+{
+    xGetScreenSaverReply rep;
+    register xReq *req;
+    LockDisplay(dpy);
+    GetEmptyReq(GetScreenSaver, req);
+
+    (void) _XReply (dpy, (xReply *)&rep, 0, xTrue);
+    *timeout = rep.timeout;
+    *interval = rep.interval;
+    *prefer_blanking = rep.preferBlanking;
+    *allow_exp = rep.allowExposures;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/GetStCmap.c b/src/GetStCmap.c
new file mode 100644 (file)
index 0000000..82fb213
--- /dev/null
@@ -0,0 +1,117 @@
+
+/***********************************************************
+
+Copyright 1987, 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 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 <X11/Xlibint.h>
+#include <X11/Xutil.h>
+#include "Xatomtype.h"
+#include <X11/Xatom.h>
+
+/*
+ *                                 WARNING
+ *
+ * This is a pre-ICCCM routine.  It must not reference any of the new fields
+ * in the XStandardColormap structure.
+ */
+
+Status XGetStandardColormap (
+    Display *dpy,
+    Window w,
+    XStandardColormap *cmap,
+    Atom property)             /* XA_RGB_BEST_MAP, etc. */
+{
+    Status stat;                       /* return value */
+    XStandardColormap *stdcmaps;       /* will get malloced value */
+    int nstdcmaps;                     /* count of above */
+
+    stat = XGetRGBColormaps (dpy, w, &stdcmaps, &nstdcmaps, property);
+    if (stat) {
+       XStandardColormap *use;
+
+       if (nstdcmaps > 1) {
+           VisualID vid;
+           Screen *sp = _XScreenOfWindow (dpy, w);
+           int i;
+
+           if (!sp) {
+               if (stdcmaps) Xfree ((char *) stdcmaps);
+               return False;
+           }
+           vid = sp->root_visual->visualid;
+
+           for (i = 0; i < nstdcmaps; i++) {
+               if (stdcmaps[i].visualid == vid) break;
+           }
+
+           if (i == nstdcmaps) {       /* not found */
+               Xfree ((char *) stdcmaps);
+               return False;
+           }
+           use = &stdcmaps[i];
+       } else {
+           use = stdcmaps;
+       }
+
+       /*
+        * assign only those fields which were in the pre-ICCCM version
+        */
+       cmap->colormap   = use->colormap;
+       cmap->red_max    = use->red_max;
+       cmap->red_mult   = use->red_mult;
+       cmap->green_max  = use->green_max;
+       cmap->green_mult = use->green_mult;
+       cmap->blue_max   = use->blue_max;
+       cmap->blue_mult  = use->blue_mult;
+       cmap->base_pixel = use->base_pixel;
+
+       Xfree ((char *) stdcmaps);      /* don't need alloced memory */
+    }
+    return stat;
+}
diff --git a/src/GetTxtProp.c b/src/GetTxtProp.c
new file mode 100644 (file)
index 0000000..d14505e
--- /dev/null
@@ -0,0 +1,113 @@
+/***********************************************************
+Copyright 1988 by Wyse Technology, Inc., San Jose, Ca.,
+
+                        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 Wyse not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+WYSE 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 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 <X11/Xlibint.h>
+#include <X11/Xatom.h>
+#include <X11/Xutil.h>
+#include <X11/Xos.h>
+#include <stdio.h>
+
+Status XGetTextProperty (
+    Display *display,
+    Window window,
+    XTextProperty *tp,
+    Atom property)
+{
+    Atom actual_type;
+    int actual_format = 0;
+    unsigned long nitems = 0L, leftover = 0L;
+    unsigned char *prop = NULL;
+
+    if (XGetWindowProperty (display, window, property, 0L, 1000000L, False,
+                           AnyPropertyType, &actual_type, &actual_format,
+                           &nitems, &leftover, &prop) == Success &&
+       actual_type != None) {
+       /* okay, fill it in */
+       tp->value = prop;
+       tp->encoding = actual_type;
+       tp->format = actual_format;
+       tp->nitems = nitems;
+       return True;
+    }
+
+    tp->value = NULL;
+    tp->encoding = None;
+    tp->format = 0;
+    tp->nitems = 0;
+    return False;
+}
+
+Status XGetWMName (
+    Display *dpy,
+    Window w,
+    XTextProperty *tp)
+{
+    return (XGetTextProperty (dpy, w, tp, XA_WM_NAME));
+}
+
+Status XGetWMIconName (
+    Display *dpy,
+    Window w,
+    XTextProperty *tp)
+{
+    return (XGetTextProperty (dpy, w, tp, XA_WM_ICON_NAME));
+}
+
+Status XGetWMClientMachine (
+    Display *dpy,
+    Window w,
+    XTextProperty *tp)
+{
+    return (XGetTextProperty (dpy, w, tp, XA_WM_CLIENT_MACHINE));
+}
+
diff --git a/src/GetWAttrs.c b/src/GetWAttrs.c
new file mode 100644 (file)
index 0000000..c10824c
--- /dev/null
@@ -0,0 +1,155 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+typedef struct _WAttrsState {
+    unsigned long attr_seq;
+    unsigned long geom_seq;
+    XWindowAttributes *attr;
+} _XWAttrsState;
+
+static Bool
+_XWAttrsHandler(
+    register Display *dpy,
+    register xReply *rep,
+    char *buf,
+    int len,
+    XPointer data)
+{
+    register _XWAttrsState *state;
+    xGetWindowAttributesReply replbuf;
+    register xGetWindowAttributesReply *repl;
+    register XWindowAttributes *attr;
+
+    state = (_XWAttrsState *)data;
+    if (dpy->last_request_read != state->attr_seq) {
+       if (dpy->last_request_read == state->geom_seq &&
+           !state->attr &&
+           rep->generic.type == X_Error &&
+           rep->error.errorCode == BadDrawable)
+           return True;
+       return False;
+    }
+    if (rep->generic.type == X_Error) {
+       state->attr = (XWindowAttributes *)NULL;
+       return False;
+    }
+    repl = (xGetWindowAttributesReply *)
+       _XGetAsyncReply(dpy, (char *)&replbuf, rep, buf, len,
+                    (SIZEOF(xGetWindowAttributesReply) - SIZEOF(xReply)) >> 2,
+                       True);
+    attr = state->attr;
+    attr->class = repl->class;
+    attr->bit_gravity = repl->bitGravity;
+    attr->win_gravity = repl->winGravity;
+    attr->backing_store = repl->backingStore;
+    attr->backing_planes = repl->backingBitPlanes;
+    attr->backing_pixel = repl->backingPixel;
+    attr->save_under = repl->saveUnder;
+    attr->colormap = repl->colormap;
+    attr->map_installed = repl->mapInstalled;
+    attr->map_state = repl->mapState;
+    attr->all_event_masks = repl->allEventMasks;
+    attr->your_event_mask = repl->yourEventMask;
+    attr->do_not_propagate_mask = repl->doNotPropagateMask;
+    attr->override_redirect = repl->override;
+    attr->visual = _XVIDtoVisual (dpy, repl->visualID);
+    return True;
+}
+
+Status
+_XGetWindowAttributes(
+    register Display *dpy,
+    Window w,
+    XWindowAttributes *attr)
+{
+    xGetGeometryReply rep;
+    register xResourceReq *req;
+    register int i;
+    register Screen *sp;
+    _XAsyncHandler async;
+    _XWAttrsState async_state;
+
+    GetResReq(GetWindowAttributes, w, req);
+
+    async_state.attr_seq = dpy->request;
+    async_state.geom_seq = 0;
+    async_state.attr = attr;
+    async.next = dpy->async_handlers;
+    async.handler = _XWAttrsHandler;
+    async.data = (XPointer)&async_state;
+    dpy->async_handlers = &async;
+
+    GetResReq(GetGeometry, w, req);
+
+    async_state.geom_seq = dpy->request;
+
+    if (!_XReply (dpy, (xReply *)&rep, 0, xTrue)) {
+       DeqAsyncHandler(dpy, &async);
+       return (0);
+       }
+    DeqAsyncHandler(dpy, &async);
+    if (!async_state.attr) {
+       return (0);
+    }
+    attr->x = cvtINT16toInt (rep.x);
+    attr->y = cvtINT16toInt (rep.y);
+    attr->width = rep.width;
+    attr->height = rep.height;
+    attr->border_width = rep.borderWidth;
+    attr->depth = rep.depth;
+    attr->root = rep.root;
+    /* find correct screen so that applications find it easier.... */
+    for (i = 0; i < dpy->nscreens; i++) {
+       sp = &dpy->screens[i];
+       if (sp->root == attr->root) {
+           attr->screen = sp;
+           break;
+       }
+    }
+    return(1);
+}
+
+Status
+XGetWindowAttributes(
+    Display *dpy,
+    Window w,
+    XWindowAttributes *attr)
+{
+    Status ret;
+
+    LockDisplay(dpy);
+    ret = _XGetWindowAttributes(dpy, w, attr);
+    UnlockDisplay(dpy);
+    SyncHandle();
+
+    return ret;
+}
+
diff --git a/src/GetWMCMapW.c b/src/GetWMCMapW.c
new file mode 100644 (file)
index 0000000..5d54cc1
--- /dev/null
@@ -0,0 +1,87 @@
+
+/***********************************************************
+
+Copyright 1987, 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 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 "Xlibint.h"
+#include <X11/Xatom.h>
+#include <stdio.h>
+
+Status XGetWMColormapWindows (
+    Display *dpy,
+    Window w,
+    Window **colormapWindows,
+    int *countReturn)
+{
+    Atom *data = NULL;
+    Atom actual_type;
+    Atom prop;
+    int actual_format;
+    unsigned long leftover, nitems;
+
+    prop =  XInternAtom(dpy, "WM_COLORMAP_WINDOWS", False);
+    if (prop == None) return False;
+
+    /* get the property */
+    if (XGetWindowProperty (dpy, w, prop,
+                           0L, 1000000L, False,
+                           XA_WINDOW, &actual_type, &actual_format,
+                           &nitems, &leftover, (unsigned char **) &data)
+       != Success)
+      return False;
+
+    if (actual_type != XA_WINDOW || actual_format != 32) {
+       if (data) Xfree ((char *) data);
+       return False;
+    }
+
+    *colormapWindows = (Window *) data;
+    *countReturn = (int) nitems;
+    return True;
+}
diff --git a/src/GetWMProto.c b/src/GetWMProto.c
new file mode 100644 (file)
index 0000000..d8f8bda
--- /dev/null
@@ -0,0 +1,87 @@
+
+/***********************************************************
+
+Copyright 1987, 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 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 "Xlibint.h"
+#include <X11/Xatom.h>
+#include <stdio.h>
+
+Status XGetWMProtocols (
+    Display *dpy,
+    Window w,
+    Atom **protocols,
+    int *countReturn)
+{
+    Atom *data = NULL;
+    Atom actual_type;
+    Atom prop;
+    int actual_format;
+    unsigned long leftover, nitems;
+
+    prop =  XInternAtom(dpy, "WM_PROTOCOLS", False);
+    if (prop == None) return False;
+
+    /* get the property */
+    if (XGetWindowProperty (dpy, w, prop,
+                           0L, 1000000L, False,
+                           XA_ATOM, &actual_type, &actual_format,
+                           &nitems, &leftover, (unsigned char **) &data)
+       != Success)
+      return False;
+
+    if (actual_type != XA_ATOM || actual_format != 32) {
+       if (data) Xfree ((char *) data);
+       return False;
+    }
+
+    *protocols = (Atom *) data;
+    *countReturn = (int) nitems;
+    return True;
+}
diff --git a/src/GrButton.c b/src/GrButton.c
new file mode 100644 (file)
index 0000000..621f49a
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XGrabButton(
+    register Display *dpy,
+    unsigned int button, /* CARD8 */
+    unsigned int modifiers, /* CARD16 */
+    Window grab_window,
+    Bool owner_events,
+    unsigned int event_mask, /* CARD16 */
+    int pointer_mode,
+    int keyboard_mode,
+    Window confine_to,
+    Cursor curs)
+{
+    register xGrabButtonReq *req;
+    LockDisplay(dpy);
+    GetReq(GrabButton, req);
+    req->modifiers = modifiers;
+    req->button = button;
+    req->grabWindow = grab_window;
+    req->ownerEvents = owner_events;
+    req->eventMask = event_mask;
+    req->pointerMode = pointer_mode;
+    req->keyboardMode = keyboard_mode;
+    req->confineTo = confine_to;
+    req->cursor = curs;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/GrKey.c b/src/GrKey.c
new file mode 100644 (file)
index 0000000..d2da595
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XGrabKey(
+    register Display *dpy,
+    int key,
+    unsigned int modifiers,
+    Window grab_window,
+    Bool owner_events,
+    int pointer_mode,
+    int keyboard_mode)
+
+{
+    register xGrabKeyReq *req;
+    LockDisplay(dpy);
+    GetReq(GrabKey, req);
+    req->ownerEvents = owner_events;
+    req->grabWindow = grab_window;
+    req->modifiers = modifiers;
+    req->key = key;
+    req->pointerMode = pointer_mode;
+    req->keyboardMode = keyboard_mode;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
+
+
diff --git a/src/GrKeybd.c b/src/GrKeybd.c
new file mode 100644 (file)
index 0000000..07dc841
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+int XGrabKeyboard (
+    register Display *dpy,
+    Window window,
+    Bool ownerEvents,
+    int pointerMode,
+    int keyboardMode,
+    Time time)
+{
+        xGrabKeyboardReply rep;
+       register xGrabKeyboardReq *req;
+       register int status;
+       LockDisplay(dpy);
+        GetReq(GrabKeyboard, req);
+       req->grabWindow = window;
+       req->ownerEvents = ownerEvents;
+       req->pointerMode = pointerMode;
+       req->keyboardMode = keyboardMode;
+       req->time = time;
+
+       /* if we ever return, suppress the error */
+       if (_XReply (dpy, (xReply *) &rep, 0, xTrue) == 0)
+               rep.status = GrabSuccess;
+       status = rep.status;
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return (status);
+}
+
diff --git a/src/GrPointer.c b/src/GrPointer.c
new file mode 100644 (file)
index 0000000..a0d9827
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int XGrabPointer(
+    register Display *dpy,
+    Window grab_window,
+    Bool owner_events,
+    unsigned int event_mask, /* CARD16 */
+    int pointer_mode,
+    int keyboard_mode,
+    Window confine_to,
+    Cursor curs,
+    Time time)
+{
+    xGrabPointerReply rep;
+    register xGrabPointerReq *req;
+    register int status;
+    LockDisplay(dpy);
+    GetReq(GrabPointer, req);
+    req->grabWindow = grab_window;
+    req->ownerEvents = owner_events;
+    req->eventMask = event_mask;
+    req->pointerMode = pointer_mode;
+    req->keyboardMode = keyboard_mode;
+    req->confineTo = confine_to;
+    req->cursor = curs;
+    req->time = time;
+
+    /* if we ever return, suppress the error */
+    if (_XReply (dpy, (xReply *) &rep, 0, xTrue) == 0)
+       rep.status = GrabSuccess;
+    status = rep.status;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return (status);
+}
diff --git a/src/GrServer.c b/src/GrServer.c
new file mode 100644 (file)
index 0000000..11d21e4
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XGrabServer (register Display *dpy)
+{
+       register xReq *req;
+       LockDisplay(dpy);
+        GetEmptyReq(GrabServer, req);
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return 1;
+}
+
diff --git a/src/Host.c b/src/Host.c
new file mode 100644 (file)
index 0000000..da9923a
--- /dev/null
@@ -0,0 +1,161 @@
+/*
+
+Copyright 1986, 1998  The Open Group
+
+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, and/or sell copies of the Software, and to permit persons
+to whom the Software is furnished to do so, provided that the above
+copyright notice(s) and this permission notice appear in all copies of
+the Software and that both the above copyright notice(s) and this
+permission notice appear in supporting documentation.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR 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.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale, use
+or other dealings in this Software without prior written authorization
+of the copyright holder.
+
+X Window System is a trademark of The Open Group.
+
+*/
+
+/*
+ * Copyright 2004 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.
+ */
+
+
+/* this might be rightly regarded an os dependent file */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+
+int
+XAddHost (
+    register Display *dpy,
+    XHostAddress *host)
+{
+    register xChangeHostsReq *req;
+    register int length;
+    XServerInterpretedAddress *siAddr;
+    int addrlen;
+
+    siAddr = host->family == FamilyServerInterpreted ?
+       (XServerInterpretedAddress *)host->address : NULL;
+    addrlen = siAddr ?
+       siAddr->typelength + siAddr->valuelength + 1 : host->length;
+
+    length = (addrlen + 3) & ~0x3;     /* round up */
+
+    LockDisplay(dpy);
+    GetReqExtra (ChangeHosts, length, req);
+    req->mode = HostInsert;
+    req->hostFamily = host->family;
+    req->hostLength = addrlen;
+    if (siAddr) {
+       char *dest = (char *) NEXTPTR(req,xChangeHostsReq);
+       memcpy(dest, siAddr->type, siAddr->typelength);
+       dest[siAddr->typelength] = '\0';
+       memcpy(dest + siAddr->typelength + 1,siAddr->value,siAddr->valuelength);
+    } else {
+       memcpy((char *) NEXTPTR(req,xChangeHostsReq), host->address, addrlen);
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
+int
+XRemoveHost (
+    register Display *dpy,
+    XHostAddress *host)
+{
+    register xChangeHostsReq *req;
+    register int length;
+    XServerInterpretedAddress *siAddr;
+    int addrlen;
+
+    siAddr = host->family == FamilyServerInterpreted ?
+       (XServerInterpretedAddress *)host->address : NULL;
+    addrlen = siAddr ?
+       siAddr->typelength + siAddr->valuelength + 1 : host->length;
+
+    length = (addrlen + 3) & ~0x3;     /* round up */
+
+    LockDisplay(dpy);
+    GetReqExtra (ChangeHosts, length, req);
+    req->mode = HostDelete;
+    req->hostFamily = host->family;
+    req->hostLength = addrlen;
+    if (siAddr) {
+       char *dest = (char *) NEXTPTR(req,xChangeHostsReq);
+       memcpy(dest, siAddr->type, siAddr->typelength);
+       dest[siAddr->typelength] = '\0';
+       memcpy(dest + siAddr->typelength + 1,siAddr->value,siAddr->valuelength);
+    } else {
+       memcpy((char *) NEXTPTR(req,xChangeHostsReq), host->address, addrlen);
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
+int
+XAddHosts (
+    register Display *dpy,
+    XHostAddress *hosts,
+    int n)
+{
+    register int i;
+    for (i = 0; i < n; i++) {
+       (void) XAddHost(dpy, &hosts[i]);
+      }
+    return 1;
+}
+
+int
+XRemoveHosts (
+    register Display *dpy,
+    XHostAddress *hosts,
+    int n)
+{
+    register int i;
+    for (i = 0; i < n; i++) {
+       (void) XRemoveHost(dpy, &hosts[i]);
+      }
+    return 1;
+}
diff --git a/src/Iconify.c b/src/Iconify.c
new file mode 100644 (file)
index 0000000..3a969d7
--- /dev/null
@@ -0,0 +1,85 @@
+
+/***********************************************************
+Copyright 1988 by Wyse Technology, Inc., San Jose, Ca.
+
+                        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 Wyse not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+WYSE 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 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 <X11/Xlibint.h>
+#include <X11/Xatom.h>
+#include <X11/Xos.h>
+#include <X11/Xutil.h>
+#include <stdio.h>
+
+/*
+ * This function instructs the window manager to change this window from
+ * NormalState to IconicState.
+ */
+Status XIconifyWindow (
+    Display *dpy,
+    Window w,
+    int screen)
+{
+    XClientMessageEvent ev;
+    Window root = RootWindow (dpy, screen);
+    Atom prop;
+
+    prop = XInternAtom (dpy, "WM_CHANGE_STATE", False);
+    if (prop == None) return False;
+
+    ev.type = ClientMessage;
+    ev.window = w;
+    ev.message_type = prop;
+    ev.format = 32;
+    ev.data.l[0] = IconicState;
+    return (XSendEvent (dpy, root, False,
+                       SubstructureRedirectMask|SubstructureNotifyMask,
+                       (XEvent *)&ev));
+}
diff --git a/src/IfEvent.c b/src/IfEvent.c
new file mode 100644 (file)
index 0000000..ead93dc
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+/*
+ * Flush output and (wait for and) return the next event matching the
+ * predicate in the queue.
+ */
+
+int
+XIfEvent (
+       register Display *dpy,
+       register XEvent *event,
+       Bool (*predicate)(
+                         Display*                      /* display */,
+                         XEvent*                       /* event */,
+                         char*                         /* arg */
+                         ),            /* function to call */
+       char *arg)
+{
+       register _XQEvent *qelt, *prev;
+       unsigned long qe_serial = 0;
+
+        LockDisplay(dpy);
+       prev = NULL;
+       while (1) {
+           for (qelt = prev ? prev->next : dpy->head;
+                qelt;
+                prev = qelt, qelt = qelt->next) {
+               if(qelt->qserial_num > qe_serial
+                  && (*predicate)(dpy, &qelt->event, arg)) {
+                   *event = qelt->event;
+                   _XDeq(dpy, prev, qelt);
+                   _XStoreEventCookie(dpy, event);
+                   UnlockDisplay(dpy);
+                   return 0;
+               }
+           }
+           if (prev)
+               qe_serial = prev->qserial_num;
+           _XReadEvents(dpy);
+           if (prev && prev->qserial_num != qe_serial)
+               /* another thread has snatched this event */
+               prev = NULL;
+       }
+}
diff --git a/src/ImText.c b/src/ImText.c
new file mode 100644 (file)
index 0000000..c12f268
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XDrawImageString(
+    register Display *dpy,
+    Drawable d,
+    GC gc,
+    int x,
+    int y,
+    _Xconst char *string,
+    int length)
+{
+    register xImageText8Req *req;
+    char *CharacterOffset = (char *)string;
+    int FirstTimeThrough = True;
+    int lastX = 0;
+
+    LockDisplay(dpy);
+    FlushGC(dpy, gc);
+
+    while (length > 0)
+    {
+       int Unit;
+
+       if (length > 255) Unit = 255;
+       else Unit = length;
+
+       if (FirstTimeThrough)
+       {
+           FirstTimeThrough = False;
+        }
+       else
+       {
+           char buf[512];
+           char *ptr, *str;
+           xQueryTextExtentsReq *qreq;
+           xQueryTextExtentsReply rep;
+           int i;
+
+           GetReq(QueryTextExtents, qreq);
+           qreq->fid = gc->gid;
+           qreq->length += (510 + 3)>>2;
+           qreq->oddLength = 1;
+           str = CharacterOffset - 255;
+           for (ptr = buf, i = 255; --i >= 0; ) {
+               *ptr++ = 0;
+               *ptr++ = *str++;
+           }
+           Data (dpy, buf, 510);
+           if (!_XReply (dpy, (xReply *)&rep, 0, xTrue))
+               break;
+
+           x = lastX + cvtINT32toInt (rep.overallWidth);
+       }
+
+        GetReq (ImageText8, req);
+        req->length += (Unit + 3) >> 2;
+        req->nChars = Unit;
+        req->drawable = d;
+        req->gc = gc->gid;
+        req->y = y;
+
+       lastX = req->x = x;
+        Data (dpy, CharacterOffset, (long)Unit);
+        CharacterOffset += Unit;
+       length -= Unit;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 0;
+}
+
diff --git a/src/ImText16.c b/src/ImText16.c
new file mode 100644 (file)
index 0000000..b0b6071
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XDrawImageString16(
+    register Display *dpy,
+    Drawable d,
+    GC gc,
+    int x,
+    int y,
+    _Xconst XChar2b *string,
+    int length)
+{
+    register xImageText16Req *req;
+    XChar2b *CharacterOffset = (XChar2b *)string;
+    int FirstTimeThrough = True;
+    int lastX = 0;
+
+    LockDisplay(dpy);
+    FlushGC(dpy, gc);
+
+    while (length > 0)
+    {
+       int Unit, Datalength;
+
+       if (length > 255) Unit = 255;
+       else Unit = length;
+
+       if (FirstTimeThrough)
+       {
+           FirstTimeThrough = False;
+        }
+       else
+       {
+           char buf[512];
+           xQueryTextExtentsReq *qreq;
+           xQueryTextExtentsReply rep;
+           unsigned char *ptr;
+           XChar2b *str;
+           int i;
+
+           GetReq(QueryTextExtents, qreq);
+           qreq->fid = gc->gid;
+           qreq->length += (510 + 3)>>2;
+           qreq->oddLength = 1;
+           str = CharacterOffset - 255;
+           for (ptr = (unsigned char *)buf, i = 255; --i >= 0; str++) {
+               *ptr++ = str->byte1;
+               *ptr++ = str->byte2;
+           }
+           Data (dpy, buf, 510);
+           if (!_XReply (dpy, (xReply *)&rep, 0, xTrue))
+               break;
+
+           x = lastX + cvtINT32toInt (rep.overallWidth);
+       }
+
+        GetReq (ImageText16, req);
+        req->length += ((Unit << 1) + 3) >> 2;
+        req->nChars = Unit;
+        req->drawable = d;
+        req->gc = gc->gid;
+        req->y = y;
+
+       lastX = req->x = x;
+       Datalength = Unit << 1;
+        Data (dpy, (char *)CharacterOffset, (long)Datalength);
+        CharacterOffset += Unit;
+       length -= Unit;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 0;
+}
+
diff --git a/src/ImUtil.c b/src/ImUtil.c
new file mode 100644 (file)
index 0000000..3164d43
--- /dev/null
@@ -0,0 +1,1027 @@
+/*
+
+Copyright 1986, 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 <X11/Xlibint.h>
+#include <X11/Xutil.h>
+#include <stdio.h>
+#include "ImUtil.h"
+
+static int _XDestroyImage(XImage *);
+static unsigned long _XGetPixel(XImage *, int, int);
+static unsigned long _XGetPixel1(XImage *, int, int);
+static unsigned long _XGetPixel8(XImage *, int, int);
+static unsigned long _XGetPixel16(XImage *, int, int);
+static unsigned long _XGetPixel32(XImage *, int, int);
+static int _XPutPixel(XImage *, int, int, unsigned long);
+static int _XPutPixel1(XImage *, int, int, unsigned long);
+static int _XPutPixel8(XImage *, int, int, unsigned long);
+static int _XPutPixel16(XImage *, int, int, unsigned long);
+static int _XPutPixel32(XImage *, int, int, unsigned long);
+static XImage *_XSubImage(XImage *, int, int, unsigned int, unsigned int);
+static int _XAddPixel(XImage *, long);
+
+static unsigned char const _lomask[0x09] = { 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff };
+static unsigned char const _himask[0x09] = { 0xff, 0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00 };
+
+/* These two convenience routines return the scanline_pad and bits_per_pixel
+       associated with a specific depth of ZPixmap format image for a
+       display. */
+
+int
+_XGetScanlinePad(
+ Display *dpy,
+ int depth)
+ {
+       register ScreenFormat *fmt = dpy->pixmap_format;
+       register int i;
+
+       for (i = dpy->nformats + 1; --i; ++fmt)
+               if (fmt->depth == depth)
+                       return(fmt->scanline_pad);
+
+       return(dpy->bitmap_pad);
+ }
+
+int
+_XGetBitsPerPixel(
+ Display *dpy,
+ int depth)
+ {
+       register ScreenFormat *fmt = dpy->pixmap_format;
+       register int i;
+
+       for (i = dpy->nformats + 1; --i; ++fmt)
+               if (fmt->depth == depth)
+                       return(fmt->bits_per_pixel);
+       if (depth <= 4)
+           return 4;
+       if (depth <= 8)
+           return 8;
+       if (depth <= 16)
+           return 16;
+       return 32;
+ }
+
+
+/*
+ * This module provides rudimentary manipulation routines for image data
+ * structures.  The functions provided are:
+ *
+ *     XCreateImage    Creates a default XImage data structure
+ *     _XDestroyImage  Deletes an XImage data structure
+ *     _XGetPixel      Reads a pixel from an image data structure
+ *     _XGetPixel32    Reads a pixel from a 32-bit Z image data structure
+ *     _XGetPixel16    Reads a pixel from a 16-bit Z image data structure
+ *     _XGetPixel8     Reads a pixel from an 8-bit Z image data structure
+ *     _XGetPixel1     Reads a pixel from an 1-bit image data structure
+ *     _XPutPixel      Writes a pixel into an image data structure
+ *     _XPutPixel32    Writes a pixel into a 32-bit Z image data structure
+ *     _XPutPixel16    Writes a pixel into a 16-bit Z image data structure
+ *     _XPutPixel8     Writes a pixel into an 8-bit Z image data structure
+ *     _XPutPixel1     Writes a pixel into an 1-bit image data structure
+ *     _XSubImage      Clones a new (sub)image from an existing one
+ *     _XSetImage      Writes an image data pattern into another image
+ *     _XAddPixel      Adds a constant value to every pixel in an image
+ *
+ * The logic contained in these routines makes several assumptions about
+ * the image data structures, and at least for current implementations
+ * these assumptions are believed to be true.  They are:
+ *
+ *     For all formats, bits_per_pixel is less than or equal to 32.
+ *     For XY formats, bitmap_unit is always less than or equal to bitmap_pad.
+ *     For XY formats, bitmap_unit is 8, 16, or 32 bits.
+ *     For Z format, bits_per_pixel is 1, 4, 8, 16, 24, or 32 bits.
+ */
+static void _xynormalizeimagebits (
+    register unsigned char *bp,
+    register XImage *img)
+{
+       register unsigned char c;
+
+       if (img->byte_order != img->bitmap_bit_order) {
+           switch (img->bitmap_unit) {
+
+               case 16:
+                   c = *bp;
+                   *bp = *(bp + 1);
+                   *(bp + 1) = c;
+                   break;
+
+               case 32:
+                   c = *(bp + 3);
+                   *(bp + 3) = *bp;
+                   *bp = c;
+                   c = *(bp + 2);
+                   *(bp + 2) = *(bp + 1);
+                   *(bp + 1) = c;
+                   break;
+           }
+       }
+       if (img->bitmap_bit_order == MSBFirst)
+           _XReverse_Bytes (bp, img->bitmap_unit >> 3);
+}
+
+static void _znormalizeimagebits (
+    register unsigned char *bp,
+    register XImage *img)
+{
+       register unsigned char c;
+       switch (img->bits_per_pixel) {
+
+           case 4:
+               *bp = ((*bp >> 4) & 0xF) | ((*bp << 4) & ~0xF);
+               break;
+
+           case 16:
+               c = *bp;
+               *bp = *(bp + 1);
+               *(bp + 1) = c;
+               break;
+
+           case 24:
+               c = *(bp + 2);
+               *(bp + 2) = *bp;
+               *bp = c;
+               break;
+
+           case 32:
+               c = *(bp + 3);
+               *(bp + 3) = *bp;
+               *bp = c;
+               c = *(bp + 2);
+               *(bp + 2) = *(bp + 1);
+               *(bp + 1) = c;
+               break;
+       }
+}
+
+static void _putbits(
+    register char *src,        /* address of source bit string */
+    int dstoffset,     /* bit offset into destination; range is 0-31 */
+    register int numbits,/* number of bits to copy to destination */
+    register char *dst)        /* address of destination bit string */
+{
+       register unsigned char chlo, chhi;
+       int hibits;
+       dst = dst + (dstoffset >> 3);
+       dstoffset = dstoffset & 7;
+       hibits = 8 - dstoffset;
+       chlo = *dst & _lomask[dstoffset];
+       for (;;) {
+           chhi = (*src << dstoffset) & _himask[dstoffset];
+           if (numbits <= hibits) {
+               chhi = chhi & _lomask[dstoffset + numbits];
+               *dst = (*dst & _himask[dstoffset + numbits]) | chlo | chhi;
+               break;
+           }
+           *dst = chhi | chlo;
+           dst++;
+           numbits = numbits - hibits;
+           chlo = (unsigned char) (*src & _himask[hibits]) >> hibits;
+           src++;
+           if (numbits <= dstoffset) {
+               chlo = chlo & _lomask[numbits];
+               *dst = (*dst & _himask[numbits]) | chlo;
+               break;
+           }
+           numbits = numbits - dstoffset;
+       }
+}
+
+
+/*
+ * Macros
+ *
+ * The ROUNDUP macro rounds up a quantity to the specified boundary,
+ * then truncates to bytes.
+ *
+ * The XYNORMALIZE macro determines whether XY format data requires
+ * normalization and calls a routine to do so if needed. The logic in
+ * this module is designed for LSBFirst byte and bit order, so
+ * normalization is done as required to present the data in this order.
+ *
+ * The ZNORMALIZE macro performs byte and nibble order normalization if
+ * required for Z format data.
+ *
+ * The XYINDEX macro computes the index to the starting byte (char) boundary
+ * for a bitmap_unit containing a pixel with coordinates x and y for image
+ * data in XY format.
+ *
+ * The ZINDEX macro computes the index to the starting byte (char) boundary
+ * for a pixel with coordinates x and y for image data in ZPixmap format.
+ *
+ */
+
+#if defined(Lynx) && defined(ROUNDUP)
+#undef ROUNDUP
+#endif
+
+#define ROUNDUP(nbytes, pad) ((((nbytes) + ((pad)-1)) / (pad)) * ((pad)>>3))
+
+#define XYNORMALIZE(bp, img) \
+    if ((img->byte_order == MSBFirst) || (img->bitmap_bit_order == MSBFirst)) \
+       _xynormalizeimagebits((unsigned char *)(bp), img)
+
+#define ZNORMALIZE(bp, img) \
+    if (img->byte_order == MSBFirst) \
+       _znormalizeimagebits((unsigned char *)(bp), img)
+
+#define XYINDEX(x, y, img) \
+    ((y) * img->bytes_per_line) + \
+    (((x) + img->xoffset) / img->bitmap_unit) * (img->bitmap_unit >> 3)
+
+#define ZINDEX(x, y, img) ((y) * img->bytes_per_line) + \
+    (((x) * img->bits_per_pixel) >> 3)
+
+/*
+ * This routine initializes the image object function pointers.  The
+ * intent is to provide native (i.e. fast) routines for native format images
+ * only using the generic (i.e. slow) routines when fast ones don't exist.
+ * However, with the current rather botched external interface, clients may
+ * have to mung image attributes after the image gets created, so the fast
+ * routines always have to check to make sure the optimization is still
+ * valid, and reinit the functions if not.
+ */
+void _XInitImageFuncPtrs (
+    register XImage *image)
+{
+       image->f.create_image = XCreateImage;
+       image->f.destroy_image = _XDestroyImage;
+       if ((image->format == ZPixmap) && (image->bits_per_pixel == 8)) {
+           image->f.get_pixel = _XGetPixel8;
+           image->f.put_pixel = _XPutPixel8;
+       } else if (((image->bits_per_pixel | image->depth) == 1) &&
+                  (image->byte_order == image->bitmap_bit_order)) {
+           image->f.get_pixel = _XGetPixel1;
+           image->f.put_pixel = _XPutPixel1;
+       } else if ((image->format == ZPixmap) &&
+                  (image->bits_per_pixel == 32)) {
+           image->f.get_pixel = _XGetPixel32;
+           image->f.put_pixel = _XPutPixel32;
+       } else if ((image->format == ZPixmap) &&
+                  (image->bits_per_pixel == 16)) {
+           image->f.get_pixel = _XGetPixel16;
+           image->f.put_pixel = _XPutPixel16;
+       } else {
+           image->f.get_pixel = _XGetPixel;
+           image->f.put_pixel = _XPutPixel;
+       }
+       image->f.sub_image = _XSubImage;
+/*     image->f.set_image = _XSetImage;*/
+       image->f.add_pixel = _XAddPixel;
+}
+
+/*
+ * CreateImage
+ *
+ * Allocates the memory necessary for an XImage data structure.
+ * Initializes the structure with "default" values and returns XImage.
+ *
+ */
+
+XImage *XCreateImage (
+    register Display *dpy,
+    register Visual *visual,
+    unsigned int depth,
+    int format,
+    int offset, /*How many pixels from the start of the data does the
+               picture to be transmitted start?*/
+
+    char *data,
+    unsigned int width,
+    unsigned int height,
+    int xpad,
+    int image_bytes_per_line)
+               /*How many bytes between a pixel on one line and the pixel with
+                 the same X coordinate on the next line? 0 means
+                 XCreateImage can calculate it.*/
+{
+       register XImage *image;
+       int bits_per_pixel = 1;
+       int min_bytes_per_line;
+
+       if (depth == 0 || depth > 32 ||
+           (format != XYBitmap && format != XYPixmap && format != ZPixmap) ||
+           (format == XYBitmap && depth != 1) ||
+           (xpad != 8 && xpad != 16 && xpad != 32) ||
+           offset < 0)
+           return (XImage *) NULL;
+       if ((image = (XImage *) Xcalloc(1, (unsigned) sizeof(XImage))) == NULL)
+           return (XImage *) NULL;
+
+       image->width = width;
+       image->height = height;
+       image->format = format;
+       image->byte_order = dpy->byte_order;
+       image->bitmap_unit = dpy->bitmap_unit;
+       image->bitmap_bit_order = dpy->bitmap_bit_order;
+       if (visual != NULL) {
+               image->red_mask = visual->red_mask;
+               image->green_mask = visual->green_mask;
+               image->blue_mask = visual->blue_mask;
+       }
+       else {
+               image->red_mask = image->green_mask = image->blue_mask = 0;
+       }
+       if (format == ZPixmap)
+       {
+           bits_per_pixel = _XGetBitsPerPixel(dpy, (int) depth);
+       }
+
+       image->xoffset = offset;
+       image->bitmap_pad = xpad;
+       image->depth = depth;
+       image->data = data;
+       /*
+        * compute per line accelerator.
+        */
+       {
+       if (format == ZPixmap)
+           min_bytes_per_line =
+              ROUNDUP((bits_per_pixel * width), image->bitmap_pad);
+       else
+           min_bytes_per_line =
+               ROUNDUP((width + offset), image->bitmap_pad);
+       }
+       if (image_bytes_per_line == 0) {
+           image->bytes_per_line = min_bytes_per_line;
+       } else if (image_bytes_per_line < min_bytes_per_line) {
+           Xfree(image);
+           return NULL;
+       } else {
+           image->bytes_per_line = image_bytes_per_line;
+       }
+
+       image->bits_per_pixel = bits_per_pixel;
+       image->obdata = NULL;
+       _XInitImageFuncPtrs (image);
+
+       return image;
+}
+
+Status XInitImage (XImage *image)
+{
+       int min_bytes_per_line;
+
+       if (image->depth == 0 || image->depth > 32 ||
+           image->bits_per_pixel > 32 || image->bitmap_unit > 32 ||
+           image->bits_per_pixel < 0 || image->bitmap_unit < 0 ||
+           (image->format != XYBitmap &&
+            image->format != XYPixmap &&
+            image->format != ZPixmap) ||
+           (image->format == XYBitmap && image->depth != 1) ||
+           (image->bitmap_pad != 8 &&
+            image->bitmap_pad != 16 &&
+            image->bitmap_pad != 32) ||
+           image->xoffset < 0)
+           return 0;
+
+       /*
+        * compute per line accelerator.
+        */
+       if (image->format == ZPixmap)
+           min_bytes_per_line =
+              ROUNDUP((image->bits_per_pixel * image->width),
+                      image->bitmap_pad);
+       else
+           min_bytes_per_line =
+               ROUNDUP((image->width + image->xoffset), image->bitmap_pad);
+
+       if (image->bytes_per_line == 0) {
+           image->bytes_per_line = min_bytes_per_line;
+       } else if (image->bytes_per_line < min_bytes_per_line) {
+           return 0;
+       }
+
+       _XInitImageFuncPtrs (image);
+
+       return 1;
+}
+
+/*
+ * _DestroyImage
+ *
+ * Deallocates the memory associated with the ximage data structure.
+ * this version handles the case of the image data being malloc'd
+ * entirely by the library.
+ */
+
+static int _XDestroyImage (XImage *ximage)
+{
+       if (ximage->data != NULL) Xfree((char *)ximage->data);
+       if (ximage->obdata != NULL) Xfree((char *)ximage->obdata);
+       Xfree((char *)ximage);
+       return 1;
+}
+
+
+/*
+ * GetPixel
+ *
+ * Returns the specified pixel.  The X and Y coordinates are relative to
+ * the origin (upper left [0,0]) of the image.  The pixel value is returned
+ * in normalized format, i.e. the LSB of the long is the LSB of the pixel.
+ * The algorithm used is:
+ *
+ *     copy the source bitmap_unit or Zpixel into temp
+ *     normalize temp if needed
+ *     extract the pixel bits into return value
+ *
+ */
+
+static unsigned long const low_bits_table[] = {
+    0x00000000, 0x00000001, 0x00000003, 0x00000007,
+    0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f,
+    0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff,
+    0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff,
+    0x0000ffff, 0x0001ffff, 0x0003ffff, 0x0007ffff,
+    0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff,
+    0x00ffffff, 0x01ffffff, 0x03ffffff, 0x07ffffff,
+    0x0fffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff,
+    0xffffffff
+};
+
+static unsigned long _XGetPixel (
+    register XImage *ximage,
+    int x,
+    int y)
+
+{
+       unsigned long pixel, px;
+       register char *src;
+       register char *dst;
+       register int i, j;
+       int bits, nbytes;
+       long plane;
+
+       if ((ximage->bits_per_pixel | ximage->depth) == 1) {
+               src = &ximage->data[XYINDEX(x, y, ximage)];
+               dst = (char *)&pixel;
+               pixel = 0;
+               for (i = ximage->bitmap_unit >> 3; --i >= 0; ) *dst++ = *src++;
+               XYNORMALIZE(&pixel, ximage);
+               bits = (x + ximage->xoffset) % ximage->bitmap_unit;
+               pixel = ((((char *)&pixel)[bits>>3])>>(bits&7)) & 1;
+       } else if (ximage->format == XYPixmap) {
+               pixel = 0;
+               plane = 0;
+               nbytes = ximage->bitmap_unit >> 3;
+               for (i = ximage->depth; --i >= 0; ) {
+                   src = &ximage->data[XYINDEX(x, y, ximage)+ plane];
+                   dst = (char *)&px;
+                   px = 0;
+                   for (j = nbytes; --j >= 0; ) *dst++ = *src++;
+                   XYNORMALIZE(&px, ximage);
+                   bits = (x + ximage->xoffset) % ximage->bitmap_unit;
+                   pixel = (pixel << 1) |
+                           (((((char *)&px)[bits>>3])>>(bits&7)) & 1);
+                   plane = plane + (ximage->bytes_per_line * ximage->height);
+               }
+       } else if (ximage->format == ZPixmap) {
+               src = &ximage->data[ZINDEX(x, y, ximage)];
+               dst = (char *)&px;
+               px = 0;
+               for (i = (ximage->bits_per_pixel + 7) >> 3; --i >= 0; )
+                   *dst++ = *src++;
+               ZNORMALIZE(&px, ximage);
+               pixel = 0;
+               for (i=sizeof(unsigned long); --i >= 0; )
+                   pixel = (pixel << 8) | ((unsigned char *)&px)[i];
+               if (ximage->bits_per_pixel == 4) {
+                   if (x & 1)
+                       pixel >>= 4;
+                   else
+                       pixel &= 0xf;
+               }
+       } else {
+               return 0; /* bad image */
+       }
+       if (ximage->bits_per_pixel == ximage->depth)
+         return pixel;
+       else
+         return (pixel & low_bits_table[ximage->depth]);
+}
+
+#ifndef WORD64
+static CARD32 const byteorderpixel = MSBFirst << 24;
+#endif
+
+static unsigned long _XGetPixel32 (
+    register XImage *ximage,
+    int x,
+    int y)
+{
+       register unsigned char *addr;
+       unsigned long pixel;
+
+       if ((ximage->format == ZPixmap) && (ximage->bits_per_pixel == 32)) {
+           addr = &((unsigned char *)ximage->data)
+                       [y * ximage->bytes_per_line + (x << 2)];
+#ifndef WORD64
+           if (*((const char *)&byteorderpixel) == ximage->byte_order)
+               pixel = *((CARD32 *)addr);
+           else
+#endif
+           if (ximage->byte_order == MSBFirst)
+               pixel = ((unsigned long)addr[0] << 24 |
+                        (unsigned long)addr[1] << 16 |
+                        (unsigned long)addr[2] << 8 |
+                        addr[3]);
+           else
+               pixel = ((unsigned long)addr[3] << 24 |
+                        (unsigned long)addr[2] << 16 |
+                        (unsigned long)addr[1] << 8 |
+                        addr[0]);
+           if (ximage->depth != 32)
+               pixel &= low_bits_table[ximage->depth];
+           return pixel;
+       } else {
+           _XInitImageFuncPtrs(ximage);
+           return XGetPixel(ximage, x, y);
+       }
+}
+
+static unsigned long _XGetPixel16 (
+    register XImage *ximage,
+    int x,
+    int y)
+{
+       register unsigned char *addr;
+       unsigned long pixel;
+
+       if ((ximage->format == ZPixmap) && (ximage->bits_per_pixel == 16)) {
+           addr = &((unsigned char *)ximage->data)
+                       [y * ximage->bytes_per_line + (x << 1)];
+           if (ximage->byte_order == MSBFirst)
+               pixel = addr[0] << 8 | addr[1];
+           else
+               pixel = addr[1] << 8 | addr[0];
+           if (ximage->depth != 16)
+               pixel &= low_bits_table[ximage->depth];
+           return pixel;
+       } else {
+           _XInitImageFuncPtrs(ximage);
+           return XGetPixel(ximage, x, y);
+       }
+}
+
+static unsigned long _XGetPixel8 (
+    register XImage *ximage,
+    int x,
+    int y)
+{
+       unsigned char pixel;
+
+       if ((ximage->format == ZPixmap) && (ximage->bits_per_pixel == 8)) {
+           pixel = ((unsigned char *)ximage->data)
+                       [y * ximage->bytes_per_line + x];
+           if (ximage->depth != 8)
+               pixel &= low_bits_table[ximage->depth];
+           return pixel;
+       } else {
+           _XInitImageFuncPtrs(ximage);
+           return XGetPixel(ximage, x, y);
+       }
+}
+
+static unsigned long _XGetPixel1 (
+    register XImage *ximage,
+    int x,
+    int y)
+{
+       unsigned char bit;
+       int xoff, yoff;
+
+       if (((ximage->bits_per_pixel | ximage->depth) == 1) &&
+           (ximage->byte_order == ximage->bitmap_bit_order)) {
+           xoff = x + ximage->xoffset;
+           yoff = y * ximage->bytes_per_line + (xoff >> 3);
+           xoff &= 7;
+           if (ximage->bitmap_bit_order == MSBFirst)
+               bit = 0x80 >> xoff;
+           else
+               bit = 1 << xoff;
+           return (ximage->data[yoff] & bit) ? 1 : 0;
+       } else {
+           _XInitImageFuncPtrs(ximage);
+           return XGetPixel(ximage, x, y);
+       }
+}
+
+/*
+ * PutPixel
+ *
+ * Overwrites the specified pixel.  The X and Y coordinates are relative to
+ * the origin (upper left [0,0]) of the image.  The input pixel value must be
+ * in normalized format, i.e. the LSB of the long is the LSB of the pixel.
+ * The algorithm used is:
+ *
+ *     copy the destination bitmap_unit or Zpixel to temp
+ *     normalize temp if needed
+ *     copy the pixel bits into the temp
+ *     renormalize temp if needed
+ *     copy the temp back into the destination image data
+ *
+ */
+
+static int _XPutPixel (
+    register XImage *ximage,
+    int x,
+    int y,
+    unsigned long pixel)
+
+{
+       unsigned long px, npixel;
+       register char *src;
+       register char *dst;
+       register int i;
+       int j, nbytes;
+       long plane;
+
+       if (ximage->depth == 4)
+           pixel &= 0xf;
+        npixel = pixel;
+       for (i=0, px=pixel; i<sizeof(unsigned long); i++, px>>=8)
+           ((unsigned char *)&pixel)[i] = px;
+       if ((ximage->bits_per_pixel | ximage->depth) == 1) {
+               src = &ximage->data[XYINDEX(x, y, ximage)];
+               dst = (char *)&px;
+               px = 0;
+               nbytes = ximage->bitmap_unit >> 3;
+               for (i = nbytes; --i >= 0; ) *dst++ = *src++;
+               XYNORMALIZE(&px, ximage);
+               i = ((x + ximage->xoffset) % ximage->bitmap_unit);
+               _putbits ((char *)&pixel, i, 1, (char *)&px);
+               XYNORMALIZE(&px, ximage);
+               src = (char *) &px;
+               dst = &ximage->data[XYINDEX(x, y, ximage)];
+               for (i = nbytes; --i >= 0; ) *dst++ = *src++;
+       } else if (ximage->format == XYPixmap) {
+               plane = (ximage->bytes_per_line * ximage->height) *
+                   (ximage->depth - 1); /* do least signif plane 1st */
+               nbytes = ximage->bitmap_unit >> 3;
+               for (j = ximage->depth; --j >= 0; ) {
+                   src = &ximage->data[XYINDEX(x, y, ximage) + plane];
+                   dst = (char *) &px;
+                   px = 0;
+                   for (i = nbytes; --i >= 0; ) *dst++ = *src++;
+                   XYNORMALIZE(&px, ximage);
+                   i = ((x + ximage->xoffset) % ximage->bitmap_unit);
+                   _putbits ((char *)&pixel, i, 1, (char *)&px);
+                   XYNORMALIZE(&px, ximage);
+                   src = (char *)&px;
+                   dst = &ximage->data[XYINDEX(x, y, ximage) + plane];
+                   for (i = nbytes; --i >= 0; ) *dst++ = *src++;
+                   npixel = npixel >> 1;
+                   for (i=0, px=npixel; i<sizeof(unsigned long); i++, px>>=8)
+                       ((unsigned char *)&pixel)[i] = px;
+                   plane = plane - (ximage->bytes_per_line * ximage->height);
+               }
+       } else if (ximage->format == ZPixmap) {
+               src = &ximage->data[ZINDEX(x, y, ximage)];
+               dst = (char *)&px;
+               px = 0;
+               nbytes = (ximage->bits_per_pixel + 7) >> 3;
+               for (i = nbytes; --i >= 0; ) *dst++ = *src++;
+               ZNORMALIZE(&px, ximage);
+               _putbits ((char *)&pixel,
+                         (x * ximage->bits_per_pixel) & 7,
+                         ximage->bits_per_pixel, (char *)&px);
+               ZNORMALIZE(&px, ximage);
+               src = (char *)&px;
+               dst = &ximage->data[ZINDEX(x, y, ximage)];
+               for (i = nbytes; --i >= 0; ) *dst++ = *src++;
+       } else {
+               return 0; /* bad image */
+       }
+       return 1;
+}
+
+static int _XPutPixel32 (
+    register XImage *ximage,
+    int x,
+    int y,
+    unsigned long pixel)
+{
+       unsigned char *addr;
+
+       if ((ximage->format == ZPixmap) && (ximage->bits_per_pixel == 32)) {
+           addr = &((unsigned char *)ximage->data)
+                       [y * ximage->bytes_per_line + (x << 2)];
+#ifndef WORD64
+           if (*((const char *)&byteorderpixel) == ximage->byte_order)
+               *((CARD32 *)addr) = pixel;
+           else
+#endif
+           if (ximage->byte_order == MSBFirst) {
+               addr[0] = pixel >> 24;
+               addr[1] = pixel >> 16;
+               addr[2] = pixel >> 8;
+               addr[3] = pixel;
+           } else {
+               addr[3] = pixel >> 24;
+               addr[2] = pixel >> 16;
+               addr[1] = pixel >> 8;
+               addr[0] = pixel;
+           }
+           return 1;
+       } else {
+           _XInitImageFuncPtrs(ximage);
+           return XPutPixel(ximage, x, y, pixel);
+       }
+}
+
+static int _XPutPixel16 (
+    register XImage *ximage,
+    int x,
+    int y,
+    unsigned long pixel)
+{
+       unsigned char *addr;
+
+       if ((ximage->format == ZPixmap) && (ximage->bits_per_pixel == 16)) {
+           addr = &((unsigned char *)ximage->data)
+                       [y * ximage->bytes_per_line + (x << 1)];
+           if (ximage->byte_order == MSBFirst) {
+               addr[0] = pixel >> 8;
+               addr[1] = pixel;
+           } else {
+               addr[1] = pixel >> 8;
+               addr[0] = pixel;
+           }
+           return 1;
+       } else {
+           _XInitImageFuncPtrs(ximage);
+           return XPutPixel(ximage, x, y, pixel);
+       }
+}
+
+static int _XPutPixel8 (
+    register XImage *ximage,
+    int x,
+    int y,
+    unsigned long pixel)
+{
+       if ((ximage->format == ZPixmap) && (ximage->bits_per_pixel == 8)) {
+           ximage->data[y * ximage->bytes_per_line + x] = pixel;
+           return 1;
+       } else {
+           _XInitImageFuncPtrs(ximage);
+           return XPutPixel(ximage, x, y, pixel);
+       }
+}
+
+static int _XPutPixel1 (
+    register XImage *ximage,
+    int x,
+    int y,
+    unsigned long pixel)
+{
+       unsigned char bit;
+       int xoff, yoff;
+
+       if (((ximage->bits_per_pixel | ximage->depth) == 1) &&
+           (ximage->byte_order == ximage->bitmap_bit_order)) {
+           xoff = x + ximage->xoffset;
+           yoff = y * ximage->bytes_per_line + (xoff >> 3);
+           xoff &= 7;
+           if (ximage->bitmap_bit_order == MSBFirst)
+               bit = 0x80 >> xoff;
+           else
+               bit = 1 << xoff;
+           if (pixel & 1)
+               ximage->data[yoff] |= bit;
+           else
+               ximage->data[yoff] &= ~bit;
+           return 1;
+       } else {
+           _XInitImageFuncPtrs(ximage);
+           return XPutPixel(ximage, x, y, pixel);
+       }
+}
+
+/*
+ * SubImage
+ *
+ * Creates a new image that is a subsection of an existing one.
+ * Allocates the memory necessary for the new XImage data structure.
+ * Pointer to new image is returned.  The algorithm used is repetitive
+ * calls to get and put pixel.
+ *
+ */
+
+static XImage *_XSubImage (
+    XImage *ximage,
+    register int x,    /* starting x coordinate in existing image */
+    register int y,    /* starting y coordinate in existing image */
+    unsigned int width,        /* width in pixels of new subimage */
+    unsigned int height)/* height in pixels of new subimage */
+
+{
+       register XImage *subimage;
+       int dsize;
+       register int row, col;
+       register unsigned long pixel;
+       char *data;
+
+       if ((subimage = (XImage *) Xcalloc (1, sizeof (XImage))) == NULL)
+           return (XImage *) NULL;
+       subimage->width = width;
+       subimage->height = height;
+       subimage->xoffset = 0;
+       subimage->format = ximage->format;
+       subimage->byte_order = ximage->byte_order;
+       subimage->bitmap_unit = ximage->bitmap_unit;
+       subimage->bitmap_bit_order = ximage->bitmap_bit_order;
+       subimage->bitmap_pad = ximage->bitmap_pad;
+       subimage->bits_per_pixel = ximage->bits_per_pixel;
+       subimage->depth = ximage->depth;
+       /*
+        * compute per line accelerator.
+        */
+       if (subimage->format == ZPixmap)
+           subimage->bytes_per_line =
+               ROUNDUP(subimage->bits_per_pixel * width,
+                       subimage->bitmap_pad);
+       else
+           subimage->bytes_per_line =
+               ROUNDUP(width, subimage->bitmap_pad);
+       subimage->obdata = NULL;
+       _XInitImageFuncPtrs (subimage);
+       dsize = subimage->bytes_per_line * height;
+       if (subimage->format == XYPixmap) dsize = dsize * subimage->depth;
+       if (((data = Xcalloc (1, (unsigned) dsize)) == NULL) && (dsize > 0)) {
+           Xfree((char *) subimage);
+           return (XImage *) NULL;
+       }
+       subimage->data = data;
+
+       /*
+        * Test for cases where the new subimage is larger than the region
+        * that we are copying from the existing data.  In those cases,
+        * copy the area of the existing image, and allow the "uncovered"
+        * area of new subimage to remain with zero filled pixels.
+        */
+       if (height > ximage->height - y ) height = ximage->height - y;
+       if (width > ximage->width - x ) width = ximage->width - x;
+
+       for (row = y; row < (y + height); row++) {
+           for (col = x; col < (x + width); col++) {
+               pixel = XGetPixel(ximage, col, row);
+               XPutPixel(subimage, (col - x), (row - y), pixel);
+           }
+       }
+       return subimage;
+}
+
+
+/*
+ * SetImage
+ *
+ * Overwrites a section of one image with all of the data from another.
+ * If the two images are not of the same format (i.e. XYPixmap and ZPixmap),
+ * the image data is converted to the destination format.  The following
+ * restrictions apply:
+ *
+ *     1. The depths of the source and destination images must be equal.
+ *
+ *     2. If the height of the source image is too large to fit between
+ *        the specified y starting point and the bottom of the image,
+ *        then scanlines are truncated on the bottom.
+ *
+ *     3. If the width of the source image is too large to fit between
+ *        the specified x starting point and the end of the scanline,
+ *        then pixels are truncated on the right.
+ *
+ * The images need not have the same bitmap_bit_order, byte_order,
+ * bitmap_unit, bits_per_pixel, bitmap_pad, or xoffset.
+ *
+ */
+
+int _XSetImage(
+    XImage *srcimg,
+    register XImage *dstimg,
+    register int x,
+    register int y)
+{
+       register unsigned long pixel;
+       register int row, col;
+       int width, height, startrow, startcol;
+       if (x < 0) {
+           startcol = -x;
+           x = 0;
+       } else
+           startcol = 0;
+       if (y < 0) {
+           startrow = -y;
+           y = 0;
+       } else
+           startrow = 0;
+       width = dstimg->width - x;
+       if (srcimg->width < width)
+           width = srcimg->width;
+       height = dstimg->height - y;
+       if (srcimg->height < height)
+           height = srcimg->height;
+
+       /* this is slow, will do better later */
+       for (row = startrow; row < height; row++) {
+           for (col = startcol; col < width; col++) {
+               pixel = XGetPixel(srcimg, col, row);
+               XPutPixel(dstimg, x + col, y + row, pixel);
+           }
+       }
+       return 1;
+}
+
+/*
+ * AddPixel
+ *
+ * Adds a constant value to every pixel in a pixmap.
+ *
+ */
+
+static int
+_XAddPixel (
+    register XImage *ximage,
+    register long value)
+{
+       register int x;
+       register int y;
+
+       if (!value)
+           return 0;
+       if ((ximage->bits_per_pixel | ximage->depth) == 1) {
+           /* The only value that we can add here to an XYBitmap
+            * is one.  Since 1 + value = ~value for one bit wide
+            * data, we do this quickly by taking the ones complement
+            * of the entire bitmap data (offset and pad included!).
+            * Note that we don't need to be concerned with bit or
+            * byte order at all.
+            */
+           register unsigned char *dp = (unsigned char *) ximage->data;
+           x = ximage->bytes_per_line * ximage->height;
+           while (--x >= 0) {
+               *dp = ~*dp;
+               dp++;
+           }
+       } else if ((ximage->format == ZPixmap) &&
+                  (ximage->bits_per_pixel == 8)) {
+           register unsigned char *dp = (unsigned char *) ximage->data;
+           x = ximage->bytes_per_line * ximage->height;
+           while (--x >= 0)
+               *dp++ += value;
+#ifndef WORD64
+       } else if ((ximage->format == ZPixmap) &&
+                  (ximage->bits_per_pixel == 16) &&
+                  (*((const char *)&byteorderpixel) == ximage->byte_order)) {
+           register unsigned short *dp = (unsigned short *) ximage->data;
+           x = (ximage->bytes_per_line >> 1) * ximage->height;
+           while (--x >= 0)
+               *dp++ += value;
+       } else if ((ximage->format == ZPixmap) &&
+                  (ximage->bits_per_pixel == 32) &&
+                  (*((const char *)&byteorderpixel) == ximage->byte_order)) {
+           register CARD32 *dp = (CARD32 *) ximage->data;
+           x = (ximage->bytes_per_line >> 2) * ximage->height;
+           while (--x >= 0)
+               *dp++ += value;
+#endif
+       } else {
+           for (y = ximage->height; --y >= 0; ) {
+               for (x = ximage->width; --x >= 0; ) {
+                   register unsigned long pixel = XGetPixel(ximage, x, y);
+                   pixel = pixel + value;
+                   XPutPixel(ximage, x, y, pixel);
+               }
+           }
+       }
+       return 0;
+}
+
diff --git a/src/InitExt.c b/src/InitExt.c
new file mode 100644 (file)
index 0000000..19515cc
--- /dev/null
@@ -0,0 +1,409 @@
+/*
+
+Copyright 1987, 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 <X11/Xlibint.h>
+#include <X11/Xos.h>
+#include <stdio.h>
+
+/*
+ * This routine is used to link a extension in so it will be called
+ * at appropriate times.
+ */
+
+XExtCodes *XInitExtension (
+       Display *dpy,
+       _Xconst char *name)
+{
+       XExtCodes codes;        /* temp. place for extension information. */
+       register _XExtension *ext;/* need a place to build it all */
+       if (!XQueryExtension(dpy, name,
+               &codes.major_opcode, &codes.first_event,
+               &codes.first_error)) return (NULL);
+
+       LockDisplay (dpy);
+       if (! (ext = (_XExtension *) Xcalloc (1, sizeof (_XExtension))) ||
+           ! (ext->name = strdup(name))) {
+           if (ext) Xfree((char *) ext);
+           UnlockDisplay(dpy);
+           return (XExtCodes *) NULL;
+       }
+       codes.extension = dpy->ext_number++;
+       ext->codes = codes;
+
+       /* chain it onto the display list */
+       ext->next = dpy->ext_procs;
+       dpy->ext_procs = ext;
+       UnlockDisplay (dpy);
+
+       return (&ext->codes);           /* tell him which extension */
+}
+
+XExtCodes *XAddExtension (Display *dpy)
+{
+    register _XExtension *ext;
+
+    LockDisplay (dpy);
+    if (! (ext = (_XExtension *) Xcalloc (1, sizeof (_XExtension)))) {
+       UnlockDisplay(dpy);
+       return (XExtCodes *) NULL;
+    }
+    ext->codes.extension = dpy->ext_number++;
+
+    /* chain it onto the display list */
+    ext->next = dpy->ext_procs;
+    dpy->ext_procs = ext;
+    UnlockDisplay (dpy);
+
+    return (&ext->codes);              /* tell him which extension */
+}
+
+static _XExtension *XLookupExtension (
+       register Display *dpy,  /* display */
+       register int extension) /* extension number */
+{
+       register _XExtension *ext;
+       for (ext = dpy->ext_procs; ext; ext = ext->next)
+           if (ext->codes.extension == extension) return (ext);
+       return (NULL);
+}
+
+XExtData **XEHeadOfExtensionList(XEDataObject object)
+{
+    return *(XExtData ***)&object;
+}
+
+int
+XAddToExtensionList(
+    XExtData **structure,
+    XExtData *ext_data)
+{
+    ext_data->next = *structure;
+    *structure = ext_data;
+    return 1;
+}
+
+XExtData *XFindOnExtensionList(
+    XExtData **structure,
+    int number)
+{
+    XExtData *ext;
+
+    ext = *structure;
+    while (ext && (ext->number != number))
+       ext = ext->next;
+    return ext;
+}
+
+/*
+ * Routines to hang procs on the extension structure.
+ */
+CreateGCType XESetCreateGC(
+       Display *dpy,           /* display */
+       int extension,          /* extension number */
+       CreateGCType proc)      /* routine to call when GC created */
+{
+       register _XExtension *e;        /* for lookup of extension */
+       register CreateGCType oldproc;
+       if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
+       LockDisplay(dpy);
+       oldproc = e->create_GC;
+       e->create_GC = proc;
+       UnlockDisplay(dpy);
+       return (CreateGCType)oldproc;
+}
+
+CopyGCType XESetCopyGC(
+       Display *dpy,           /* display */
+       int extension,          /* extension number */
+       CopyGCType proc)        /* routine to call when GC copied */
+{
+       register _XExtension *e;        /* for lookup of extension */
+       register CopyGCType oldproc;
+       if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
+       LockDisplay(dpy);
+       oldproc = e->copy_GC;
+       e->copy_GC = proc;
+       UnlockDisplay(dpy);
+       return (CopyGCType)oldproc;
+}
+
+FlushGCType XESetFlushGC(
+       Display *dpy,           /* display */
+       int extension,          /* extension number */
+       FlushGCType proc)       /* routine to call when GC copied */
+{
+       register _XExtension *e;        /* for lookup of extension */
+       register FlushGCType oldproc;
+       if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
+       LockDisplay(dpy);
+       oldproc = e->flush_GC;
+       e->flush_GC = proc;
+       UnlockDisplay(dpy);
+       return (FlushGCType)oldproc;
+}
+
+FreeGCType XESetFreeGC(
+       Display *dpy,           /* display */
+       int extension,          /* extension number */
+       FreeGCType proc)        /* routine to call when GC freed */
+{
+       register _XExtension *e;        /* for lookup of extension */
+       register FreeGCType oldproc;
+       if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
+       LockDisplay(dpy);
+       oldproc = e->free_GC;
+       e->free_GC = proc;
+       UnlockDisplay(dpy);
+       return (FreeGCType)oldproc;
+}
+
+CreateFontType XESetCreateFont(
+       Display *dpy,           /* display */
+       int extension,          /* extension number */
+       CreateFontType proc)    /* routine to call when font created */
+{
+       register _XExtension *e;        /* for lookup of extension */
+       register CreateFontType oldproc;
+       if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
+       LockDisplay(dpy);
+       oldproc = e->create_Font;
+       e->create_Font = proc;
+       UnlockDisplay(dpy);
+       return (CreateFontType)oldproc;
+}
+
+FreeFontType XESetFreeFont(
+       Display *dpy,           /* display */
+       int extension,          /* extension number */
+       FreeFontType proc)      /* routine to call when font freed */
+{
+       register _XExtension *e;        /* for lookup of extension */
+       register FreeFontType oldproc;
+       if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
+       LockDisplay(dpy);
+       oldproc = e->free_Font;
+       e->free_Font = proc;
+       UnlockDisplay(dpy);
+       return (FreeFontType)oldproc;
+}
+
+CloseDisplayType XESetCloseDisplay(
+       Display *dpy,           /* display */
+       int extension,          /* extension number */
+       CloseDisplayType proc)  /* routine to call when display closed */
+{
+       register _XExtension *e;        /* for lookup of extension */
+       register CloseDisplayType oldproc;
+       if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
+       LockDisplay(dpy);
+       oldproc = e->close_display;
+       e->close_display = proc;
+       UnlockDisplay(dpy);
+       return (CloseDisplayType)oldproc;
+}
+
+typedef Bool (*WireToEventType) (
+    Display*   /* display */,
+    XEvent*    /* re */,
+    xEvent*    /* event */
+);
+
+WireToEventType XESetWireToEvent(
+       Display *dpy,           /* display */
+       int event_number,       /* event routine to replace */
+       WireToEventType proc)   /* routine to call when converting event */
+{
+       register WireToEventType oldproc;
+       if (proc == NULL) proc = (WireToEventType)_XUnknownWireEvent;
+       LockDisplay (dpy);
+       oldproc = dpy->event_vec[event_number];
+       dpy->event_vec[event_number] = proc;
+       UnlockDisplay (dpy);
+       return (WireToEventType)oldproc;
+}
+
+typedef Bool (*WireToEventCookieType) (
+    Display*   /* display */,
+    XGenericEventCookie*       /* re */,
+    xEvent*    /* event */
+);
+
+WireToEventCookieType XESetWireToEventCookie(
+    Display *dpy,       /* display */
+    int extension,      /* extension major opcode */
+    WireToEventCookieType proc /* routine to call for generic events */
+    )
+{
+       WireToEventCookieType oldproc;
+       if (proc == NULL) proc = (WireToEventCookieType)_XUnknownWireEventCookie;
+       LockDisplay (dpy);
+       oldproc = dpy->generic_event_vec[extension & 0x7F];
+       dpy->generic_event_vec[extension & 0x7F] = proc;
+       UnlockDisplay (dpy);
+       return (WireToEventCookieType)oldproc;
+}
+
+typedef Bool (*CopyEventCookieType) (
+    Display*   /* display */,
+    XGenericEventCookie*       /* in */,
+    XGenericEventCookie*       /* out */
+);
+
+CopyEventCookieType XESetCopyEventCookie(
+    Display *dpy,       /* display */
+    int extension,      /* extension major opcode */
+    CopyEventCookieType proc /* routine to copy generic events */
+    )
+{
+       CopyEventCookieType oldproc;
+       if (proc == NULL) proc = (CopyEventCookieType)_XUnknownCopyEventCookie;
+       LockDisplay (dpy);
+       oldproc = dpy->generic_event_copy_vec[extension & 0x7F];
+       dpy->generic_event_copy_vec[extension & 0x7F] = proc;
+       UnlockDisplay (dpy);
+       return (CopyEventCookieType)oldproc;
+}
+
+
+typedef Status (*EventToWireType) (
+    Display*   /* display */,
+    XEvent*    /* re */,
+    xEvent*    /* event */
+);
+
+EventToWireType XESetEventToWire(
+       Display *dpy,           /* display */
+       int event_number,       /* event routine to replace */
+       EventToWireType proc)   /* routine to call when converting event */
+{
+       register EventToWireType oldproc;
+       if (proc == NULL) proc = (EventToWireType) _XUnknownNativeEvent;
+       LockDisplay (dpy);
+       oldproc = dpy->wire_vec[event_number];
+       dpy->wire_vec[event_number] = proc;
+       UnlockDisplay(dpy);
+       return (EventToWireType)oldproc;
+}
+
+typedef Bool (*WireToErrorType) (
+    Display*   /* display */,
+    XErrorEvent* /* he */,
+    xError*    /* we */
+);
+
+WireToErrorType XESetWireToError(
+       Display *dpy,           /* display */
+       int error_number,       /* error routine to replace */
+       WireToErrorType proc)   /* routine to call when converting error */
+{
+       register WireToErrorType oldproc = NULL;
+       if (proc == NULL) proc = (WireToErrorType)_XDefaultWireError;
+       LockDisplay (dpy);
+       if (!dpy->error_vec) {
+           int i;
+           dpy->error_vec = Xmalloc(256 * sizeof(oldproc));
+           for (i = 1; i < 256; i++)
+               dpy->error_vec[i] = _XDefaultWireError;
+       }
+       if (dpy->error_vec) {
+           oldproc = dpy->error_vec[error_number];
+           dpy->error_vec[error_number] = proc;
+       }
+       UnlockDisplay (dpy);
+       return (WireToErrorType)oldproc;
+}
+
+ErrorType XESetError(
+       Display *dpy,           /* display */
+       int extension,          /* extension number */
+       ErrorType proc)         /* routine to call when X error happens */
+{
+       register _XExtension *e;        /* for lookup of extension */
+       register ErrorType oldproc;
+       if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
+       LockDisplay(dpy);
+       oldproc = e->error;
+       e->error = proc;
+       UnlockDisplay(dpy);
+       return (ErrorType)oldproc;
+}
+
+ErrorStringType XESetErrorString(
+       Display *dpy,           /* display */
+       int extension,          /* extension number */
+       ErrorStringType proc)   /* routine to call when I/O error happens */
+{
+       register _XExtension *e;        /* for lookup of extension */
+       register ErrorStringType oldproc;
+       if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
+       LockDisplay(dpy);
+       oldproc = e->error_string;
+       e->error_string = proc;
+       UnlockDisplay(dpy);
+       return (ErrorStringType)oldproc;
+}
+
+PrintErrorType XESetPrintErrorValues(
+       Display *dpy,           /* display */
+       int extension,          /* extension number */
+       PrintErrorType proc)    /* routine to call to print */
+{
+       register _XExtension *e;        /* for lookup of extension */
+       register PrintErrorType oldproc;
+       if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
+       LockDisplay(dpy);
+       oldproc = e->error_values;
+       e->error_values = proc;
+       UnlockDisplay(dpy);
+       return (PrintErrorType)oldproc;
+}
+
+BeforeFlushType XESetBeforeFlush(
+       Display *dpy,           /* display */
+       int extension,          /* extension number */
+       BeforeFlushType proc)   /* routine to call on flush */
+{
+       register _XExtension *e;        /* for lookup of extension */
+       register BeforeFlushType oldproc;
+       register _XExtension *ext;
+       if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
+       LockDisplay(dpy);
+       oldproc = e->before_flush;
+       e->before_flush = proc;
+       for (ext = dpy->flushes; ext && ext != e; ext = ext->next)
+           ;
+       if (!ext) {
+           e->next_flush = dpy->flushes;
+           dpy->flushes = e;
+       }
+       UnlockDisplay(dpy);
+       return (BeforeFlushType)oldproc;
+}
diff --git a/src/InsCmap.c b/src/InsCmap.c
new file mode 100644 (file)
index 0000000..735ab08
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XInstallColormap(
+    register Display *dpy,
+    Colormap cmap)
+{
+    register xResourceReq *req;
+    LockDisplay(dpy);
+    GetResReq(InstallColormap, cmap, req);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/IntAtom.c b/src/IntAtom.c
new file mode 100644 (file)
index 0000000..7a56258
--- /dev/null
@@ -0,0 +1,297 @@
+/*
+
+Copyright 1986, 1990, 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 "Xlibint.h"
+#include "Xintatom.h"
+
+#define HASH(sig) ((sig) & (TABLESIZE-1))
+#define REHASHVAL(sig) ((((sig) % (TABLESIZE-3)) + 2) | 1)
+#define REHASH(idx,rehash) ((idx + rehash) & (TABLESIZE-1))
+
+void
+_XFreeAtomTable(Display *dpy)
+{
+    register Entry *table;
+    register int i;
+    register Entry e;
+
+    if (dpy->atoms) {
+       table = dpy->atoms->table;
+       for (i = TABLESIZE; --i >= 0; ) {
+           if ((e = *table++) && (e != RESERVED))
+               Xfree((char *)e);
+       }
+       Xfree((char *)dpy->atoms);
+    }
+}
+
+static
+Atom _XInternAtom(
+    Display *dpy,
+    _Xconst char *name,
+    Bool onlyIfExists,
+    unsigned long *psig,
+    int *pidx,
+    int *pn)
+{
+    register AtomTable *atoms;
+    register char *s1, c, *s2;
+    register unsigned long sig;
+    register int idx = 0, i;
+    Entry e;
+    int n, firstidx, rehash = 0;
+    xInternAtomReq *req;
+
+    /* look in the cache first */
+    if (!(atoms = dpy->atoms)) {
+       dpy->atoms = atoms = (AtomTable *)Xcalloc(1, sizeof(AtomTable));
+       dpy->free_funcs->atoms = _XFreeAtomTable;
+    }
+    sig = 0;
+    for (s1 = (char *)name; (c = *s1++); )
+       sig += c;
+    n = s1 - (char *)name - 1;
+    if (atoms) {
+       firstidx = idx = HASH(sig);
+       while ((e = atoms->table[idx])) {
+           if (e != RESERVED && e->sig == sig) {
+               for (i = n, s1 = (char *)name, s2 = EntryName(e); --i >= 0; ) {
+                   if (*s1++ != *s2++)
+                       goto nomatch;
+               }
+               if (!*s2)
+                   return e->atom;
+           }
+nomatch:    if (idx == firstidx)
+               rehash = REHASHVAL(sig);
+           idx = REHASH(idx, rehash);
+           if (idx == firstidx)
+               break;
+       }
+    }
+    *psig = sig;
+    *pidx = idx;
+    if (atoms && !atoms->table[idx])
+       atoms->table[idx] = RESERVED; /* reserve slot */
+    *pn = n;
+    /* not found, go to the server */
+    GetReq(InternAtom, req);
+    req->nbytes = n;
+    req->onlyIfExists = onlyIfExists;
+    req->length += (n+3)>>2;
+    Data(dpy, name, n);
+    return None;
+}
+
+void
+_XUpdateAtomCache(
+    Display *dpy,
+    const char *name,
+    Atom atom,
+    unsigned long sig,
+    int idx,
+    int n)
+{
+    Entry e, oe;
+    register char *s1;
+    register char c;
+    int firstidx, rehash;
+
+    if (!dpy->atoms) {
+       if (idx < 0) {
+           dpy->atoms = (AtomTable *)Xcalloc(1, sizeof(AtomTable));
+           dpy->free_funcs->atoms = _XFreeAtomTable;
+       }
+       if (!dpy->atoms)
+           return;
+    }
+    if (!sig) {
+       for (s1 = (char *)name; (c = *s1++); )
+           sig += c;
+       n = s1 - (char *)name - 1;
+       if (idx < 0) {
+           firstidx = idx = HASH(sig);
+           if (dpy->atoms->table[idx]) {
+               rehash = REHASHVAL(sig);
+               do
+                   idx = REHASH(idx, rehash);
+               while (idx != firstidx && dpy->atoms->table[idx]);
+           }
+       }
+    }
+    e = (Entry)Xmalloc(sizeof(EntryRec) + n + 1);
+    if (e) {
+       e->sig = sig;
+       e->atom = atom;
+       strcpy(EntryName(e), name);
+       if ((oe = dpy->atoms->table[idx]) && (oe != RESERVED))
+           Xfree((char *)oe);
+       dpy->atoms->table[idx] = e;
+    }
+}
+
+Atom
+XInternAtom (
+    Display *dpy,
+    const char *name,
+    Bool onlyIfExists)
+{
+    Atom atom;
+    unsigned long sig;
+    int idx, n;
+    xInternAtomReply rep;
+
+    if (!name)
+       name = "";
+    LockDisplay(dpy);
+    if ((atom = _XInternAtom(dpy, name, onlyIfExists, &sig, &idx, &n))) {
+       UnlockDisplay(dpy);
+       return atom;
+    }
+    if (dpy->atoms && dpy->atoms->table[idx] == RESERVED)
+       dpy->atoms->table[idx] = NULL; /* unreserve slot */
+    if (_XReply (dpy, (xReply *)&rep, 0, xTrue)) {
+       if ((atom = rep.atom))
+           _XUpdateAtomCache(dpy, name, atom, sig, idx, n);
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return (rep.atom);
+}
+
+typedef struct {
+    unsigned long start_seq;
+    unsigned long stop_seq;
+    char **names;
+    Atom *atoms;
+    int count;
+    Status status;
+} _XIntAtomState;
+
+static
+Bool _XIntAtomHandler(
+    register Display *dpy,
+    register xReply *rep,
+    char *buf,
+    int len,
+    XPointer data)
+{
+    register _XIntAtomState *state;
+    register int i, idx = 0;
+    xInternAtomReply replbuf;
+    register xInternAtomReply *repl;
+
+    state = (_XIntAtomState *)data;
+    if (dpy->last_request_read < state->start_seq ||
+       dpy->last_request_read > state->stop_seq)
+       return False;
+    for (i = 0; i < state->count; i++) {
+       if (state->atoms[i] & 0x80000000) {
+           idx = ~state->atoms[i];
+           state->atoms[i] = None;
+           break;
+       }
+    }
+    if (i >= state->count)
+       return False;
+    if (rep->generic.type == X_Error) {
+       state->status = 0;
+       return False;
+    }
+    repl = (xInternAtomReply *)
+       _XGetAsyncReply(dpy, (char *)&replbuf, rep, buf, len,
+                       (SIZEOF(xInternAtomReply) - SIZEOF(xReply)) >> 2,
+                       True);
+    if ((state->atoms[i] = repl->atom))
+       _XUpdateAtomCache(dpy, state->names[i], (Atom) repl->atom,
+                         (unsigned long)0, idx, 0);
+    return True;
+}
+
+Status
+XInternAtoms (
+    Display *dpy,
+    char **names,
+    int count,
+    Bool onlyIfExists,
+    Atom *atoms_return)
+{
+    int i, idx, n, tidx;
+    unsigned long sig;
+    _XAsyncHandler async;
+    _XIntAtomState async_state;
+    int missed = -1;
+    xInternAtomReply rep;
+
+    LockDisplay(dpy);
+    async_state.start_seq = dpy->request + 1;
+    async_state.atoms = atoms_return;
+    async_state.names = names;
+    async_state.count = count - 1;
+    async_state.status = 1;
+    async.next = dpy->async_handlers;
+    async.handler = _XIntAtomHandler;
+    async.data = (XPointer)&async_state;
+    dpy->async_handlers = &async;
+    for (i = 0; i < count; i++) {
+       if (!(atoms_return[i] = _XInternAtom(dpy, names[i], onlyIfExists,
+                                            &sig, &idx, &n))) {
+           missed = i;
+           atoms_return[i] = ~((Atom)idx);
+           async_state.stop_seq = dpy->request;
+       }
+    }
+    if (missed >= 0) {
+        if (dpy->atoms) {
+           /* unreserve anything we just reserved */
+           for (i = 0; i < count; i++) {
+               if (atoms_return[i] & 0x80000000) {
+                   tidx = ~atoms_return[i];
+                   if (dpy->atoms->table[tidx] == RESERVED)
+                       dpy->atoms->table[tidx] = NULL;
+               }
+           }
+        }
+       if (_XReply (dpy, (xReply *)&rep, 0, xTrue)) {
+           if ((atoms_return[missed] = rep.atom))
+               _XUpdateAtomCache(dpy, names[missed], (Atom) rep.atom,
+                                 sig, idx, n);
+       } else {
+           atoms_return[missed] = None;
+           async_state.status = 0;
+       }
+    }
+    DeqAsyncHandler(dpy, &async);
+    UnlockDisplay(dpy);
+    if (missed >= 0)
+       SyncHandle();
+    return async_state.status;
+}
diff --git a/src/Key.h b/src/Key.h
new file mode 100644 (file)
index 0000000..0fe89ba
--- /dev/null
+++ b/src/Key.h
@@ -0,0 +1,17 @@
+
+#ifndef _KEY_H_
+#define _KEY_H_
+
+#ifndef NEEDKTABLE
+extern const unsigned char _XkeyTable[];
+#endif
+
+extern int
+_XKeyInitialize(
+    Display *dpy);
+
+extern XrmDatabase
+_XInitKeysymDB(
+        void);
+
+#endif /* _KEY_H_ */
diff --git a/src/KeyBind.c b/src/KeyBind.c
new file mode 100644 (file)
index 0000000..221cedd
--- /dev/null
@@ -0,0 +1,1078 @@
+/*
+
+Copyright 1985, 1987, 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.
+
+*/
+
+/* Beware, here be monsters (still under construction... - JG */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <X11/Xlibint.h>
+#include <X11/Xutil.h>
+#define XK_MISCELLANY
+#define XK_LATIN1
+#define XK_LATIN2
+#define XK_LATIN3
+#define XK_LATIN4
+#define XK_LATIN8
+#define XK_LATIN9
+#define XK_CYRILLIC
+#define XK_GREEK
+#define XK_ARMENIAN
+#define XK_CAUCASUS
+#define XK_VIETNAMESE
+#define XK_XKB_KEYS
+#define XK_SINHALA
+#include <X11/keysymdef.h>
+#include <stdio.h>
+
+#ifdef USE_OWN_COMPOSE
+#include "imComp.h"
+
+#endif
+
+#include "Xresource.h"
+#include "Key.h"
+
+#ifdef XKB
+#include "XKBlib.h"
+#include "XKBlibint.h"
+#define        XKeycodeToKeysym        _XKeycodeToKeysym
+#define        XKeysymToKeycode        _XKeysymToKeycode
+#define        XLookupKeysym           _XLookupKeysym
+#define        XRefreshKeyboardMapping _XRefreshKeyboardMapping
+#define        XLookupString           _XLookupString
+/* XKBBind.c */
+#else
+#define        XkbKeysymToModifiers    _XKeysymToModifiers
+#endif
+
+#define AllMods (ShiftMask|LockMask|ControlMask| \
+                Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask)
+
+static void
+ComputeMaskFromKeytrans(
+    Display *dpy,
+    register struct _XKeytrans *p);
+
+struct _XKeytrans {
+       struct _XKeytrans *next;/* next on list */
+       char *string;           /* string to return when the time comes */
+       int len;                /* length of string (since NULL is legit)*/
+       KeySym key;             /* keysym rebound */
+       unsigned int state;     /* modifier state */
+       KeySym *modifiers;      /* modifier keysyms you want */
+       int mlen;               /* length of modifier list */
+};
+
+static KeySym
+KeyCodetoKeySym(register Display *dpy, KeyCode keycode, int col)
+{
+    register int per = dpy->keysyms_per_keycode;
+    register KeySym *syms;
+    KeySym lsym, usym;
+
+    if ((col < 0) || ((col >= per) && (col > 3)) ||
+       ((int)keycode < dpy->min_keycode) || ((int)keycode > dpy->max_keycode))
+      return NoSymbol;
+
+    syms = &dpy->keysyms[(keycode - dpy->min_keycode) * per];
+    if (col < 4) {
+       if (col > 1) {
+           while ((per > 2) && (syms[per - 1] == NoSymbol))
+               per--;
+           if (per < 3)
+               col -= 2;
+       }
+       if ((per <= (col|1)) || (syms[col|1] == NoSymbol)) {
+           XConvertCase(syms[col&~1], &lsym, &usym);
+           if (!(col & 1))
+               return lsym;
+           else if (usym == lsym)
+               return NoSymbol;
+           else
+               return usym;
+       }
+    }
+    return syms[col];
+}
+
+KeySym
+XKeycodeToKeysym(Display *dpy,
+#if NeedWidePrototypes
+                unsigned int kc,
+#else
+                KeyCode kc,
+#endif
+                int col)
+{
+    if ((! dpy->keysyms) && (! _XKeyInitialize(dpy)))
+       return NoSymbol;
+    return KeyCodetoKeySym(dpy, kc, col);
+}
+
+KeyCode
+XKeysymToKeycode(
+    Display *dpy,
+    KeySym ks)
+{
+    register int i, j;
+
+    if ((! dpy->keysyms) && (! _XKeyInitialize(dpy)))
+       return (KeyCode) 0;
+    for (j = 0; j < dpy->keysyms_per_keycode; j++) {
+       for (i = dpy->min_keycode; i <= dpy->max_keycode; i++) {
+           if (KeyCodetoKeySym(dpy, (KeyCode) i, j) == ks)
+               return i;
+       }
+    }
+    return 0;
+}
+
+KeySym
+XLookupKeysym(
+    register XKeyEvent *event,
+    int col)
+{
+    if ((! event->display->keysyms) && (! _XKeyInitialize(event->display)))
+       return NoSymbol;
+    return KeyCodetoKeySym(event->display, event->keycode, col);
+}
+
+static void
+ResetModMap(
+    Display *dpy)
+{
+    register XModifierKeymap *map;
+    register int i, j, n;
+    KeySym sym;
+    register struct _XKeytrans *p;
+
+    map = dpy->modifiermap;
+    /* If any Lock key contains Caps_Lock, then interpret as Caps_Lock,
+     * else if any contains Shift_Lock, then interpret as Shift_Lock,
+     * else ignore Lock altogether.
+     */
+    dpy->lock_meaning = NoSymbol;
+    /* Lock modifiers are in the second row of the matrix */
+    n = 2 * map->max_keypermod;
+    for (i = map->max_keypermod; i < n; i++) {
+       for (j = 0; j < dpy->keysyms_per_keycode; j++) {
+           sym = KeyCodetoKeySym(dpy, map->modifiermap[i], j);
+           if (sym == XK_Caps_Lock) {
+               dpy->lock_meaning = XK_Caps_Lock;
+               break;
+           } else if (sym == XK_Shift_Lock) {
+               dpy->lock_meaning = XK_Shift_Lock;
+           }
+           else if (sym == XK_ISO_Lock) {
+               dpy->lock_meaning = XK_Caps_Lock;
+               break;
+           }
+       }
+    }
+    /* Now find any Mod<n> modifier acting as the Group or Numlock modifier */
+    dpy->mode_switch = 0;
+    dpy->num_lock = 0;
+    n *= 4;
+    for (i = 3*map->max_keypermod; i < n; i++) {
+       for (j = 0; j < dpy->keysyms_per_keycode; j++) {
+           sym = KeyCodetoKeySym(dpy, map->modifiermap[i], j);
+           if (sym == XK_Mode_switch)
+               dpy->mode_switch |= 1 << (i / map->max_keypermod);
+           if (sym == XK_Num_Lock)
+               dpy->num_lock |= 1 << (i / map->max_keypermod);
+       }
+    }
+    for (p = dpy->key_bindings; p; p = p->next)
+       ComputeMaskFromKeytrans(dpy, p);
+}
+
+static int
+InitModMap(
+    Display *dpy)
+{
+    register XModifierKeymap *map;
+
+    if (! (map = XGetModifierMapping(dpy)))
+       return 0;
+    LockDisplay(dpy);
+    if (dpy->modifiermap)
+       XFreeModifiermap(dpy->modifiermap);
+    dpy->modifiermap = map;
+    dpy->free_funcs->modifiermap = XFreeModifiermap;
+    if (dpy->keysyms)
+       ResetModMap(dpy);
+    UnlockDisplay(dpy);
+    return 1;
+}
+
+int
+XRefreshKeyboardMapping(register XMappingEvent *event)
+{
+
+    if(event->request == MappingKeyboard) {
+       /* XXX should really only refresh what is necessary
+        * for now, make initialize test fail
+        */
+       LockDisplay(event->display);
+       if (event->display->keysyms) {
+            Xfree ((char *)event->display->keysyms);
+            event->display->keysyms = NULL;
+       }
+       UnlockDisplay(event->display);
+    }
+    if(event->request == MappingModifier) {
+       LockDisplay(event->display);
+       if (event->display->modifiermap) {
+           XFreeModifiermap(event->display->modifiermap);
+           event->display->modifiermap = NULL;
+       }
+       UnlockDisplay(event->display);
+       /* go ahead and get it now, since initialize test may not fail */
+       if (event->display->keysyms)
+           (void) InitModMap(event->display);
+    }
+    return 1;
+}
+
+int
+_XKeyInitialize(
+    Display *dpy)
+{
+    int per, n;
+    KeySym *keysyms;
+
+    /*
+     * lets go get the keysyms from the server.
+     */
+    if (!dpy->keysyms) {
+       n = dpy->max_keycode - dpy->min_keycode + 1;
+       keysyms = XGetKeyboardMapping (dpy, (KeyCode) dpy->min_keycode,
+                                      n, &per);
+       /* keysyms may be NULL */
+       if (! keysyms) return 0;
+
+       LockDisplay(dpy);
+       if (dpy->keysyms)
+           Xfree ((char *)dpy->keysyms);
+       dpy->keysyms = keysyms;
+       dpy->keysyms_per_keycode = per;
+       if (dpy->modifiermap)
+           ResetModMap(dpy);
+       UnlockDisplay(dpy);
+    }
+    if (!dpy->modifiermap)
+        return InitModMap(dpy);
+    return 1;
+}
+
+static void
+UCSConvertCase( register unsigned code,
+                KeySym *lower,
+                KeySym *upper )
+{
+    /* Case conversion for UCS, as in Unicode Data version 4.0.0 */
+    /* NB: Only converts simple one-to-one mappings. */
+
+    /* Tables are used where they take less space than     */
+    /* the code to work out the mappings. Zero values mean */
+    /* undefined code points.                              */
+
+    static unsigned short const IPAExt_upper_mapping[] = { /* part only */
+                            0x0181, 0x0186, 0x0255, 0x0189, 0x018A,
+    0x0258, 0x018F, 0x025A, 0x0190, 0x025C, 0x025D, 0x025E, 0x025F,
+    0x0193, 0x0261, 0x0262, 0x0194, 0x0264, 0x0265, 0x0266, 0x0267,
+    0x0197, 0x0196, 0x026A, 0x026B, 0x026C, 0x026D, 0x026E, 0x019C,
+    0x0270, 0x0271, 0x019D, 0x0273, 0x0274, 0x019F, 0x0276, 0x0277,
+    0x0278, 0x0279, 0x027A, 0x027B, 0x027C, 0x027D, 0x027E, 0x027F,
+    0x01A6, 0x0281, 0x0282, 0x01A9, 0x0284, 0x0285, 0x0286, 0x0287,
+    0x01AE, 0x0289, 0x01B1, 0x01B2, 0x028C, 0x028D, 0x028E, 0x028F,
+    0x0290, 0x0291, 0x01B7
+    };
+
+    static unsigned short const LatinExtB_upper_mapping[] = { /* first part only */
+    0x0180, 0x0181, 0x0182, 0x0182, 0x0184, 0x0184, 0x0186, 0x0187,
+    0x0187, 0x0189, 0x018A, 0x018B, 0x018B, 0x018D, 0x018E, 0x018F,
+    0x0190, 0x0191, 0x0191, 0x0193, 0x0194, 0x01F6, 0x0196, 0x0197,
+    0x0198, 0x0198, 0x019A, 0x019B, 0x019C, 0x019D, 0x0220, 0x019F,
+    0x01A0, 0x01A0, 0x01A2, 0x01A2, 0x01A4, 0x01A4, 0x01A6, 0x01A7,
+    0x01A7, 0x01A9, 0x01AA, 0x01AB, 0x01AC, 0x01AC, 0x01AE, 0x01AF,
+    0x01AF, 0x01B1, 0x01B2, 0x01B3, 0x01B3, 0x01B5, 0x01B5, 0x01B7,
+    0x01B8, 0x01B8, 0x01BA, 0x01BB, 0x01BC, 0x01BC, 0x01BE, 0x01F7,
+    0x01C0, 0x01C1, 0x01C2, 0x01C3, 0x01C4, 0x01C4, 0x01C4, 0x01C7,
+    0x01C7, 0x01C7, 0x01CA, 0x01CA, 0x01CA
+    };
+
+    static unsigned short const LatinExtB_lower_mapping[] = { /* first part only */
+    0x0180, 0x0253, 0x0183, 0x0183, 0x0185, 0x0185, 0x0254, 0x0188,
+    0x0188, 0x0256, 0x0257, 0x018C, 0x018C, 0x018D, 0x01DD, 0x0259,
+    0x025B, 0x0192, 0x0192, 0x0260, 0x0263, 0x0195, 0x0269, 0x0268,
+    0x0199, 0x0199, 0x019A, 0x019B, 0x026F, 0x0272, 0x019E, 0x0275,
+    0x01A1, 0x01A1, 0x01A3, 0x01A3, 0x01A5, 0x01A5, 0x0280, 0x01A8,
+    0x01A8, 0x0283, 0x01AA, 0x01AB, 0x01AD, 0x01AD, 0x0288, 0x01B0,
+    0x01B0, 0x028A, 0x028B, 0x01B4, 0x01B4, 0x01B6, 0x01B6, 0x0292,
+    0x01B9, 0x01B9, 0x01BA, 0x01BB, 0x01BD, 0x01BD, 0x01BE, 0x01BF,
+    0x01C0, 0x01C1, 0x01C2, 0x01C3, 0x01C6, 0x01C6, 0x01C6, 0x01C9,
+    0x01C9, 0x01C9, 0x01CC, 0x01CC, 0x01CC
+    };
+
+    static unsigned short const Greek_upper_mapping[] = {
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0374, 0x0375, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x037A, 0x0000, 0x0000, 0x0000, 0x037E, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0384, 0x0385, 0x0386, 0x0387,
+    0x0388, 0x0389, 0x038A, 0x0000, 0x038C, 0x0000, 0x038E, 0x038F,
+    0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
+    0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
+    0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7,
+    0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x0386, 0x0388, 0x0389, 0x038A,
+    0x03B0, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
+    0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
+    0x03A0, 0x03A1, 0x03A3, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7,
+    0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x038C, 0x038E, 0x038F, 0x0000,
+    0x0392, 0x0398, 0x03D2, 0x03D3, 0x03D4, 0x03A6, 0x03A0, 0x03D7,
+    0x03D8, 0x03D8, 0x03DA, 0x03DA, 0x03DC, 0x03DC, 0x03DE, 0x03DE,
+    0x03E0, 0x03E0, 0x03E2, 0x03E2, 0x03E4, 0x03E4, 0x03E6, 0x03E6,
+    0x03E8, 0x03E8, 0x03EA, 0x03EA, 0x03EC, 0x03EC, 0x03EE, 0x03EE,
+    0x039A, 0x03A1, 0x03F9, 0x03F3, 0x03F4, 0x0395, 0x03F6, 0x03F7,
+    0x03F7, 0x03F9, 0x03FA, 0x03FA, 0x0000, 0x0000, 0x0000, 0x0000
+    };
+
+    static unsigned short const Greek_lower_mapping[] = {
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0374, 0x0375, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x037A, 0x0000, 0x0000, 0x0000, 0x037E, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0384, 0x0385, 0x03AC, 0x0387,
+    0x03AD, 0x03AE, 0x03AF, 0x0000, 0x03CC, 0x0000, 0x03CD, 0x03CE,
+    0x0390, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7,
+    0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
+    0x03C0, 0x03C1, 0x0000, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7,
+    0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03AC, 0x03AD, 0x03AE, 0x03AF,
+    0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7,
+    0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
+    0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7,
+    0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000,
+    0x03D0, 0x03D1, 0x03D2, 0x03D3, 0x03D4, 0x03D5, 0x03D6, 0x03D7,
+    0x03D9, 0x03D9, 0x03DB, 0x03DB, 0x03DD, 0x03DD, 0x03DF, 0x03DF,
+    0x03E1, 0x03E1, 0x03E3, 0x03E3, 0x03E5, 0x03E5, 0x03E7, 0x03E7,
+    0x03E9, 0x03E9, 0x03EB, 0x03EB, 0x03ED, 0x03ED, 0x03EF, 0x03EF,
+    0x03F0, 0x03F1, 0x03F2, 0x03F3, 0x03B8, 0x03F5, 0x03F6, 0x03F8,
+    0x03F8, 0x03F2, 0x03FB, 0x03FB, 0x0000, 0x0000, 0x0000, 0x0000
+    };
+
+    static unsigned short const GreekExt_lower_mapping[] = {
+    0x1F00, 0x1F01, 0x1F02, 0x1F03, 0x1F04, 0x1F05, 0x1F06, 0x1F07,
+    0x1F00, 0x1F01, 0x1F02, 0x1F03, 0x1F04, 0x1F05, 0x1F06, 0x1F07,
+    0x1F10, 0x1F11, 0x1F12, 0x1F13, 0x1F14, 0x1F15, 0x0000, 0x0000,
+    0x1F10, 0x1F11, 0x1F12, 0x1F13, 0x1F14, 0x1F15, 0x0000, 0x0000,
+    0x1F20, 0x1F21, 0x1F22, 0x1F23, 0x1F24, 0x1F25, 0x1F26, 0x1F27,
+    0x1F20, 0x1F21, 0x1F22, 0x1F23, 0x1F24, 0x1F25, 0x1F26, 0x1F27,
+    0x1F30, 0x1F31, 0x1F32, 0x1F33, 0x1F34, 0x1F35, 0x1F36, 0x1F37,
+    0x1F30, 0x1F31, 0x1F32, 0x1F33, 0x1F34, 0x1F35, 0x1F36, 0x1F37,
+    0x1F40, 0x1F41, 0x1F42, 0x1F43, 0x1F44, 0x1F45, 0x0000, 0x0000,
+    0x1F40, 0x1F41, 0x1F42, 0x1F43, 0x1F44, 0x1F45, 0x0000, 0x0000,
+    0x1F50, 0x1F51, 0x1F52, 0x1F53, 0x1F54, 0x1F55, 0x1F56, 0x1F57,
+    0x0000, 0x1F51, 0x0000, 0x1F53, 0x0000, 0x1F55, 0x0000, 0x1F57,
+    0x1F60, 0x1F61, 0x1F62, 0x1F63, 0x1F64, 0x1F65, 0x1F66, 0x1F67,
+    0x1F60, 0x1F61, 0x1F62, 0x1F63, 0x1F64, 0x1F65, 0x1F66, 0x1F67,
+    0x1F70, 0x1F71, 0x1F72, 0x1F73, 0x1F74, 0x1F75, 0x1F76, 0x1F77,
+    0x1F78, 0x1F79, 0x1F7A, 0x1F7B, 0x1F7C, 0x1F7D, 0x0000, 0x0000,
+    0x1F80, 0x1F81, 0x1F82, 0x1F83, 0x1F84, 0x1F85, 0x1F86, 0x1F87,
+    0x1F80, 0x1F81, 0x1F82, 0x1F83, 0x1F84, 0x1F85, 0x1F86, 0x1F87,
+    0x1F90, 0x1F91, 0x1F92, 0x1F93, 0x1F94, 0x1F95, 0x1F96, 0x1F97,
+    0x1F90, 0x1F91, 0x1F92, 0x1F93, 0x1F94, 0x1F95, 0x1F96, 0x1F97,
+    0x1FA0, 0x1FA1, 0x1FA2, 0x1FA3, 0x1FA4, 0x1FA5, 0x1FA6, 0x1FA7,
+    0x1FA0, 0x1FA1, 0x1FA2, 0x1FA3, 0x1FA4, 0x1FA5, 0x1FA6, 0x1FA7,
+    0x1FB0, 0x1FB1, 0x1FB2, 0x1FB3, 0x1FB4, 0x0000, 0x1FB6, 0x1FB7,
+    0x1FB0, 0x1FB1, 0x1F70, 0x1F71, 0x1FB3, 0x1FBD, 0x1FBE, 0x1FBF,
+    0x1FC0, 0x1FC1, 0x1FC2, 0x1FC3, 0x1FC4, 0x0000, 0x1FC6, 0x1FC7,
+    0x1F72, 0x1F73, 0x1F74, 0x1F75, 0x1FC3, 0x1FCD, 0x1FCE, 0x1FCF,
+    0x1FD0, 0x1FD1, 0x1FD2, 0x1FD3, 0x0000, 0x0000, 0x1FD6, 0x1FD7,
+    0x1FD0, 0x1FD1, 0x1F76, 0x1F77, 0x0000, 0x1FDD, 0x1FDE, 0x1FDF,
+    0x1FE0, 0x1FE1, 0x1FE2, 0x1FE3, 0x1FE4, 0x1FE5, 0x1FE6, 0x1FE7,
+    0x1FE0, 0x1FE1, 0x1F7A, 0x1F7B, 0x1FE5, 0x1FED, 0x1FEE, 0x1FEF,
+    0x0000, 0x0000, 0x1FF2, 0x1FF3, 0x1FF4, 0x0000, 0x1FF6, 0x1FF7,
+    0x1F78, 0x1F79, 0x1F7C, 0x1F7D, 0x1FF3, 0x1FFD, 0x1FFE, 0x0000
+    };
+
+    static unsigned short const GreekExt_upper_mapping[] = {
+    0x1F08, 0x1F09, 0x1F0A, 0x1F0B, 0x1F0C, 0x1F0D, 0x1F0E, 0x1F0F,
+    0x1F08, 0x1F09, 0x1F0A, 0x1F0B, 0x1F0C, 0x1F0D, 0x1F0E, 0x1F0F,
+    0x1F18, 0x1F19, 0x1F1A, 0x1F1B, 0x1F1C, 0x1F1D, 0x0000, 0x0000,
+    0x1F18, 0x1F19, 0x1F1A, 0x1F1B, 0x1F1C, 0x1F1D, 0x0000, 0x0000,
+    0x1F28, 0x1F29, 0x1F2A, 0x1F2B, 0x1F2C, 0x1F2D, 0x1F2E, 0x1F2F,
+    0x1F28, 0x1F29, 0x1F2A, 0x1F2B, 0x1F2C, 0x1F2D, 0x1F2E, 0x1F2F,
+    0x1F38, 0x1F39, 0x1F3A, 0x1F3B, 0x1F3C, 0x1F3D, 0x1F3E, 0x1F3F,
+    0x1F38, 0x1F39, 0x1F3A, 0x1F3B, 0x1F3C, 0x1F3D, 0x1F3E, 0x1F3F,
+    0x1F48, 0x1F49, 0x1F4A, 0x1F4B, 0x1F4C, 0x1F4D, 0x0000, 0x0000,
+    0x1F48, 0x1F49, 0x1F4A, 0x1F4B, 0x1F4C, 0x1F4D, 0x0000, 0x0000,
+    0x1F50, 0x1F59, 0x1F52, 0x1F5B, 0x1F54, 0x1F5D, 0x1F56, 0x1F5F,
+    0x0000, 0x1F59, 0x0000, 0x1F5B, 0x0000, 0x1F5D, 0x0000, 0x1F5F,
+    0x1F68, 0x1F69, 0x1F6A, 0x1F6B, 0x1F6C, 0x1F6D, 0x1F6E, 0x1F6F,
+    0x1F68, 0x1F69, 0x1F6A, 0x1F6B, 0x1F6C, 0x1F6D, 0x1F6E, 0x1F6F,
+    0x1FBA, 0x1FBB, 0x1FC8, 0x1FC9, 0x1FCA, 0x1FCB, 0x1FDA, 0x1FDB,
+    0x1FF8, 0x1FF9, 0x1FEA, 0x1FEB, 0x1FFA, 0x1FFB, 0x0000, 0x0000,
+    0x1F88, 0x1F89, 0x1F8A, 0x1F8B, 0x1F8C, 0x1F8D, 0x1F8E, 0x1F8F,
+    0x1F88, 0x1F89, 0x1F8A, 0x1F8B, 0x1F8C, 0x1F8D, 0x1F8E, 0x1F8F,
+    0x1F98, 0x1F99, 0x1F9A, 0x1F9B, 0x1F9C, 0x1F9D, 0x1F9E, 0x1F9F,
+    0x1F98, 0x1F99, 0x1F9A, 0x1F9B, 0x1F9C, 0x1F9D, 0x1F9E, 0x1F9F,
+    0x1FA8, 0x1FA9, 0x1FAA, 0x1FAB, 0x1FAC, 0x1FAD, 0x1FAE, 0x1FAF,
+    0x1FA8, 0x1FA9, 0x1FAA, 0x1FAB, 0x1FAC, 0x1FAD, 0x1FAE, 0x1FAF,
+    0x1FB8, 0x1FB9, 0x1FB2, 0x1FBC, 0x1FB4, 0x0000, 0x1FB6, 0x1FB7,
+    0x1FB8, 0x1FB9, 0x1FBA, 0x1FBB, 0x1FBC, 0x1FBD, 0x0399, 0x1FBF,
+    0x1FC0, 0x1FC1, 0x1FC2, 0x1FCC, 0x1FC4, 0x0000, 0x1FC6, 0x1FC7,
+    0x1FC8, 0x1FC9, 0x1FCA, 0x1FCB, 0x1FCC, 0x1FCD, 0x1FCE, 0x1FCF,
+    0x1FD8, 0x1FD9, 0x1FD2, 0x1FD3, 0x0000, 0x0000, 0x1FD6, 0x1FD7,
+    0x1FD8, 0x1FD9, 0x1FDA, 0x1FDB, 0x0000, 0x1FDD, 0x1FDE, 0x1FDF,
+    0x1FE8, 0x1FE9, 0x1FE2, 0x1FE3, 0x1FE4, 0x1FEC, 0x1FE6, 0x1FE7,
+    0x1FE8, 0x1FE9, 0x1FEA, 0x1FEB, 0x1FEC, 0x1FED, 0x1FEE, 0x1FEF,
+    0x0000, 0x0000, 0x1FF2, 0x1FFC, 0x1FF4, 0x0000, 0x1FF6, 0x1FF7,
+    0x1FF8, 0x1FF9, 0x1FFA, 0x1FFB, 0x1FFC, 0x1FFD, 0x1FFE, 0x0000
+    };
+
+    *lower = code;
+    *upper = code;
+
+    /* Basic Latin and Latin-1 Supplement, U+0000 to U+00FF */
+    if (code <= 0x00ff) {
+        if (code >= 0x0041 && code <= 0x005a)             /* A-Z */
+            *lower += 0x20;
+        else if (code >= 0x0061 && code <= 0x007a)        /* a-z */
+            *upper -= 0x20;
+        else if ( (code >= 0x00c0 && code <= 0x00d6) ||
+                 (code >= 0x00d8 && code <= 0x00de) )
+            *lower += 0x20;
+        else if ( (code >= 0x00e0 && code <= 0x00f6) ||
+                 (code >= 0x00f8 && code <= 0x00fe) )
+            *upper -= 0x20;
+        else if (code == 0x00ff)      /* y with diaeresis */
+            *upper = 0x0178;
+        else if (code == 0x00b5)      /* micro sign */
+            *upper = 0x039c;
+       return;
+    }
+
+    /* Latin Extended-A, U+0100 to U+017F */
+    if (code >= 0x0100 && code <= 0x017f) {
+        if ( (code >= 0x0100 && code <= 0x012f) ||
+             (code >= 0x0132 && code <= 0x0137) ||
+             (code >= 0x014a && code <= 0x0177) ) {
+            *upper = code & ~1;
+            *lower = code | 1;
+        }
+        else if ( (code >= 0x0139 && code <= 0x0148) ||
+                  (code >= 0x0179 && code <= 0x017e) ) {
+            if (code & 1)
+               *lower += 1;
+            else
+               *upper -= 1;
+        }
+        else if (code == 0x0130)
+            *lower = 0x0069;
+        else if (code == 0x0131)
+            *upper = 0x0049;
+        else if (code == 0x0178)
+            *lower = 0x00ff;
+        else if (code == 0x017f)
+            *upper = 0x0053;
+        return;
+    }
+
+    /* Latin Extended-B, U+0180 to U+024F */
+    if (code >= 0x0180 && code <= 0x024f) {
+        if (code >= 0x01cd && code <= 0x01dc) {
+           if (code & 1)
+              *lower += 1;
+           else
+              *upper -= 1;
+        }
+        else if ( (code >= 0x01de && code <= 0x01ef) ||
+                  (code >= 0x01f4 && code <= 0x01f5) ||
+                  (code >= 0x01f8 && code <= 0x021f) ||
+                  (code >= 0x0222 && code <= 0x0233) ) {
+            *lower |= 1;
+            *upper &= ~1;
+        }
+        else if (code >= 0x0180 && code <= 0x01cc) {
+            *lower = LatinExtB_lower_mapping[code - 0x0180];
+            *upper = LatinExtB_upper_mapping[code - 0x0180];
+        }
+        else if (code == 0x01dd)
+            *upper = 0x018e;
+        else if (code == 0x01f1 || code == 0x01f2) {
+            *lower = 0x01f3;
+            *upper = 0x01f1;
+        }
+        else if (code == 0x01f3)
+            *upper = 0x01f1;
+        else if (code == 0x01f6)
+            *lower = 0x0195;
+        else if (code == 0x01f7)
+            *lower = 0x01bf;
+        else if (code == 0x0220)
+            *lower = 0x019e;
+        return;
+    }
+
+    /* IPA Extensions, U+0250 to U+02AF */
+    if (code >= 0x0253 && code <= 0x0292) {
+        *upper = IPAExt_upper_mapping[code - 0x0253];
+    }
+
+    /* Combining Diacritical Marks, U+0300 to U+036F */
+    if (code == 0x0345) {
+        *upper = 0x0399;
+    }
+
+    /* Greek and Coptic, U+0370 to U+03FF */
+    if (code >= 0x0370 && code <= 0x03ff) {
+        *lower = Greek_lower_mapping[code - 0x0370];
+        *upper = Greek_upper_mapping[code - 0x0370];
+        if (*upper == 0)
+            *upper = code;
+        if (*lower == 0)
+            *lower = code;
+    }
+
+    /* Cyrillic and Cyrillic Supplementary, U+0400 to U+052F */
+    if ( (code >= 0x0400 && code <= 0x04ff) ||
+         (code >= 0x0500 && code <= 0x052f) ) {
+        if (code >= 0x0400 && code <= 0x040f)
+            *lower += 0x50;
+        else if (code >= 0x0410 && code <= 0x042f)
+            *lower += 0x20;
+        else if (code >= 0x0430 && code <= 0x044f)
+            *upper -= 0x20;
+        else if (code >= 0x0450 && code <= 0x045f)
+            *upper -= 0x50;
+        else if ( (code >= 0x0460 && code <= 0x0481) ||
+                  (code >= 0x048a && code <= 0x04bf) ||
+                 (code >= 0x04d0 && code <= 0x04f5) ||
+                 (code >= 0x04f8 && code <= 0x04f9) ||
+                  (code >= 0x0500 && code <= 0x050f) ) {
+            *upper &= ~1;
+            *lower |= 1;
+        }
+        else if (code >= 0x04c1 && code <= 0x04ce) {
+           if (code & 1)
+               *lower += 1;
+           else
+               *upper -= 1;
+        }
+    }
+
+    /* Armenian, U+0530 to U+058F */
+    if (code >= 0x0530 && code <= 0x058f) {
+        if (code >= 0x0531 && code <= 0x0556)
+            *lower += 0x30;
+        else if (code >=0x0561 && code <= 0x0586)
+            *upper -= 0x30;
+    }
+
+    /* Latin Extended Additional, U+1E00 to U+1EFF */
+    if (code >= 0x1e00 && code <= 0x1eff) {
+        if ( (code >= 0x1e00 && code <= 0x1e95) ||
+             (code >= 0x1ea0 && code <= 0x1ef9) ) {
+            *upper &= ~1;
+            *lower |= 1;
+        }
+        else if (code == 0x1e9b)
+            *upper = 0x1e60;
+    }
+
+    /* Greek Extended, U+1F00 to U+1FFF */
+    if (code >= 0x1f00 && code <= 0x1fff) {
+        *lower = GreekExt_lower_mapping[code - 0x1f00];
+        *upper = GreekExt_upper_mapping[code - 0x1f00];
+        if (*upper == 0)
+            *upper = code;
+        if (*lower == 0)
+            *lower = code;
+    }
+
+    /* Letterlike Symbols, U+2100 to U+214F */
+    if (code >= 0x2100 && code <= 0x214f) {
+        switch (code) {
+        case 0x2126: *lower = 0x03c9; break;
+        case 0x212a: *lower = 0x006b; break;
+        case 0x212b: *lower = 0x00e5; break;
+        }
+    }
+    /* Number Forms, U+2150 to U+218F */
+    else if (code >= 0x2160 && code <= 0x216f)
+        *lower += 0x10;
+    else if (code >= 0x2170 && code <= 0x217f)
+        *upper -= 0x10;
+    /* Enclosed Alphanumerics, U+2460 to U+24FF */
+    else if (code >= 0x24b6 && code <= 0x24cf)
+        *lower += 0x1a;
+    else if (code >= 0x24d0 && code <= 0x24e9)
+        *upper -= 0x1a;
+    /* Halfwidth and Fullwidth Forms, U+FF00 to U+FFEF */
+    else if (code >= 0xff21 && code <= 0xff3a)
+        *lower += 0x20;
+    else if (code >= 0xff41 && code <= 0xff5a)
+        *upper -= 0x20;
+    /* Deseret, U+10400 to U+104FF */
+    else if (code >= 0x10400 && code <= 0x10427)
+        *lower += 0x28;
+    else if (code >= 0x10428 && code <= 0x1044f)
+        *upper -= 0x28;
+}
+
+void
+XConvertCase(
+    register KeySym sym,
+    KeySym *lower,
+    KeySym *upper)
+{
+    /* Latin 1 keysym */
+    if (sym < 0x100) {
+        UCSConvertCase(sym, lower, upper);
+       return;
+    }
+
+    /* Unicode keysym */
+    if ((sym & 0xff000000) == 0x01000000) {
+        UCSConvertCase((sym & 0x00ffffff), lower, upper);
+        *upper |= 0x01000000;
+        *lower |= 0x01000000;
+        return;
+    }
+
+    /* Legacy keysym */
+
+    *lower = sym;
+    *upper = sym;
+
+    switch(sym >> 8) {
+    case 1: /* Latin 2 */
+       /* Assume the KeySym is a legal value (ignore discontinuities) */
+       if (sym == XK_Aogonek)
+           *lower = XK_aogonek;
+       else if (sym >= XK_Lstroke && sym <= XK_Sacute)
+           *lower += (XK_lstroke - XK_Lstroke);
+       else if (sym >= XK_Scaron && sym <= XK_Zacute)
+           *lower += (XK_scaron - XK_Scaron);
+       else if (sym >= XK_Zcaron && sym <= XK_Zabovedot)
+           *lower += (XK_zcaron - XK_Zcaron);
+       else if (sym == XK_aogonek)
+           *upper = XK_Aogonek;
+       else if (sym >= XK_lstroke && sym <= XK_sacute)
+           *upper -= (XK_lstroke - XK_Lstroke);
+       else if (sym >= XK_scaron && sym <= XK_zacute)
+           *upper -= (XK_scaron - XK_Scaron);
+       else if (sym >= XK_zcaron && sym <= XK_zabovedot)
+           *upper -= (XK_zcaron - XK_Zcaron);
+       else if (sym >= XK_Racute && sym <= XK_Tcedilla)
+           *lower += (XK_racute - XK_Racute);
+       else if (sym >= XK_racute && sym <= XK_tcedilla)
+           *upper -= (XK_racute - XK_Racute);
+       break;
+    case 2: /* Latin 3 */
+       /* Assume the KeySym is a legal value (ignore discontinuities) */
+       if (sym >= XK_Hstroke && sym <= XK_Hcircumflex)
+           *lower += (XK_hstroke - XK_Hstroke);
+       else if (sym >= XK_Gbreve && sym <= XK_Jcircumflex)
+           *lower += (XK_gbreve - XK_Gbreve);
+       else if (sym >= XK_hstroke && sym <= XK_hcircumflex)
+           *upper -= (XK_hstroke - XK_Hstroke);
+       else if (sym >= XK_gbreve && sym <= XK_jcircumflex)
+           *upper -= (XK_gbreve - XK_Gbreve);
+       else if (sym >= XK_Cabovedot && sym <= XK_Scircumflex)
+           *lower += (XK_cabovedot - XK_Cabovedot);
+       else if (sym >= XK_cabovedot && sym <= XK_scircumflex)
+           *upper -= (XK_cabovedot - XK_Cabovedot);
+       break;
+    case 3: /* Latin 4 */
+       /* Assume the KeySym is a legal value (ignore discontinuities) */
+       if (sym >= XK_Rcedilla && sym <= XK_Tslash)
+           *lower += (XK_rcedilla - XK_Rcedilla);
+       else if (sym >= XK_rcedilla && sym <= XK_tslash)
+           *upper -= (XK_rcedilla - XK_Rcedilla);
+       else if (sym == XK_ENG)
+           *lower = XK_eng;
+       else if (sym == XK_eng)
+           *upper = XK_ENG;
+       else if (sym >= XK_Amacron && sym <= XK_Umacron)
+           *lower += (XK_amacron - XK_Amacron);
+       else if (sym >= XK_amacron && sym <= XK_umacron)
+           *upper -= (XK_amacron - XK_Amacron);
+       break;
+    case 6: /* Cyrillic */
+       /* Assume the KeySym is a legal value (ignore discontinuities) */
+       if (sym >= XK_Serbian_DJE && sym <= XK_Serbian_DZE)
+           *lower -= (XK_Serbian_DJE - XK_Serbian_dje);
+       else if (sym >= XK_Serbian_dje && sym <= XK_Serbian_dze)
+           *upper += (XK_Serbian_DJE - XK_Serbian_dje);
+       else if (sym >= XK_Cyrillic_YU && sym <= XK_Cyrillic_HARDSIGN)
+           *lower -= (XK_Cyrillic_YU - XK_Cyrillic_yu);
+       else if (sym >= XK_Cyrillic_yu && sym <= XK_Cyrillic_hardsign)
+           *upper += (XK_Cyrillic_YU - XK_Cyrillic_yu);
+        break;
+    case 7: /* Greek */
+       /* Assume the KeySym is a legal value (ignore discontinuities) */
+       if (sym >= XK_Greek_ALPHAaccent && sym <= XK_Greek_OMEGAaccent)
+           *lower += (XK_Greek_alphaaccent - XK_Greek_ALPHAaccent);
+       else if (sym >= XK_Greek_alphaaccent && sym <= XK_Greek_omegaaccent &&
+                sym != XK_Greek_iotaaccentdieresis &&
+                sym != XK_Greek_upsilonaccentdieresis)
+           *upper -= (XK_Greek_alphaaccent - XK_Greek_ALPHAaccent);
+       else if (sym >= XK_Greek_ALPHA && sym <= XK_Greek_OMEGA)
+           *lower += (XK_Greek_alpha - XK_Greek_ALPHA);
+       else if (sym >= XK_Greek_alpha && sym <= XK_Greek_omega &&
+                sym != XK_Greek_finalsmallsigma)
+           *upper -= (XK_Greek_alpha - XK_Greek_ALPHA);
+        break;
+    case 0x13: /* Latin 9 */
+        if (sym == XK_OE)
+            *lower = XK_oe;
+        else if (sym == XK_oe)
+            *upper = XK_OE;
+        else if (sym == XK_Ydiaeresis)
+            *lower = XK_ydiaeresis;
+        break;
+    }
+}
+
+int
+_XTranslateKey(        register Display *dpy,
+               KeyCode keycode,
+               register unsigned int modifiers,
+               unsigned int *modifiers_return,
+               KeySym *keysym_return)
+{
+    int per;
+    register KeySym *syms;
+    KeySym sym, lsym, usym;
+
+    if ((! dpy->keysyms) && (! _XKeyInitialize(dpy)))
+       return 0;
+    *modifiers_return = ((ShiftMask|LockMask)
+                        | dpy->mode_switch | dpy->num_lock);
+    if (((int)keycode < dpy->min_keycode) || ((int)keycode > dpy->max_keycode))
+    {
+       *keysym_return = NoSymbol;
+       return 1;
+    }
+    per = dpy->keysyms_per_keycode;
+    syms = &dpy->keysyms[(keycode - dpy->min_keycode) * per];
+    while ((per > 2) && (syms[per - 1] == NoSymbol))
+       per--;
+    if ((per > 2) && (modifiers & dpy->mode_switch)) {
+       syms += 2;
+       per -= 2;
+    }
+    if ((modifiers & dpy->num_lock) &&
+       (per > 1 && (IsKeypadKey(syms[1]) || IsPrivateKeypadKey(syms[1])))) {
+       if ((modifiers & ShiftMask) ||
+           ((modifiers & LockMask) && (dpy->lock_meaning == XK_Shift_Lock)))
+           *keysym_return = syms[0];
+       else
+           *keysym_return = syms[1];
+    } else if (!(modifiers & ShiftMask) &&
+       (!(modifiers & LockMask) || (dpy->lock_meaning == NoSymbol))) {
+       if ((per == 1) || (syms[1] == NoSymbol))
+           XConvertCase(syms[0], keysym_return, &usym);
+       else
+           *keysym_return = syms[0];
+    } else if (!(modifiers & LockMask) ||
+              (dpy->lock_meaning != XK_Caps_Lock)) {
+       if ((per == 1) || ((usym = syms[1]) == NoSymbol))
+           XConvertCase(syms[0], &lsym, &usym);
+       *keysym_return = usym;
+    } else {
+       if ((per == 1) || ((sym = syms[1]) == NoSymbol))
+           sym = syms[0];
+       XConvertCase(sym, &lsym, &usym);
+       if (!(modifiers & ShiftMask) && (sym != syms[0]) &&
+           ((sym != usym) || (lsym == usym)))
+           XConvertCase(syms[0], &lsym, &usym);
+       *keysym_return = usym;
+    }
+    if (*keysym_return == XK_VoidSymbol)
+       *keysym_return = NoSymbol;
+    return 1;
+}
+
+int
+_XTranslateKeySym(
+    Display *dpy,
+    register KeySym symbol,
+    unsigned int modifiers,
+    char *buffer,
+    int nbytes)
+{
+    register struct _XKeytrans *p;
+    int length;
+    unsigned long hiBytes;
+    register unsigned char c;
+
+    if (!symbol)
+       return 0;
+    /* see if symbol rebound, if so, return that string. */
+    for (p = dpy->key_bindings; p; p = p->next) {
+       if (((modifiers & AllMods) == p->state) && (symbol == p->key)) {
+           length = p->len;
+           if (length > nbytes) length = nbytes;
+           memcpy (buffer, p->string, length);
+           return length;
+       }
+    }
+    /* try to convert to Latin-1, handling control */
+    hiBytes = symbol >> 8;
+    if (!(nbytes &&
+         ((hiBytes == 0) ||
+          ((hiBytes == 0xFF) &&
+           (((symbol >= XK_BackSpace) && (symbol <= XK_Clear)) ||
+            (symbol == XK_Return) ||
+            (symbol == XK_Escape) ||
+            (symbol == XK_KP_Space) ||
+            (symbol == XK_KP_Tab) ||
+            (symbol == XK_KP_Enter) ||
+            ((symbol >= XK_KP_Multiply) && (symbol <= XK_KP_9)) ||
+            (symbol == XK_KP_Equal) ||
+            (symbol == XK_Delete))))))
+       return 0;
+
+    /* if X keysym, convert to ascii by grabbing low 7 bits */
+    if (symbol == XK_KP_Space)
+       c = XK_space & 0x7F; /* patch encoding botch */
+    else if (hiBytes == 0xFF)
+       c = symbol & 0x7F;
+    else
+       c = symbol & 0xFF;
+    /* only apply Control key if it makes sense, else ignore it */
+    if (modifiers & ControlMask) {
+       if ((c >= '@' && c < '\177') || c == ' ') c &= 0x1F;
+       else if (c == '2') c = '\000';
+       else if (c >= '3' && c <= '7') c -= ('3' - '\033');
+       else if (c == '8') c = '\177';
+       else if (c == '/') c = '_' & 0x1F;
+    }
+    buffer[0] = c;
+    return 1;
+}
+
+/*ARGSUSED*/
+int
+XLookupString (
+    register XKeyEvent *event,
+    char *buffer,      /* buffer */
+    int nbytes,        /* space in buffer for characters */
+    KeySym *keysym,
+    XComposeStatus *status)    /* not implemented */
+{
+    unsigned int modifiers;
+    KeySym symbol;
+
+    if (! _XTranslateKey(event->display, event->keycode, event->state,
+                 &modifiers, &symbol))
+       return 0;
+
+#ifdef USE_OWN_COMPOSE
+    if ( status ) {
+       static int been_here= 0;
+       if ( !been_here ) {
+           XimCompInitTables();
+           been_here = 1;
+       }
+       if ( !XimCompLegalStatus(status) ) {
+           status->compose_ptr = NULL;
+           status->chars_matched = 0;
+       }
+       if ( ((status->chars_matched>0)&&(status->compose_ptr!=NULL)) ||
+               XimCompIsComposeKey(symbol,event->keycode,status) ) {
+           XimCompRtrn rtrn;
+           switch (XimCompProcessSym(status,symbol,&rtrn)) {
+               case XIM_COMP_IGNORE:
+                   break;
+               case XIM_COMP_IN_PROGRESS:
+                   if ( keysym!=NULL )
+                       *keysym = NoSymbol;
+                   return 0;
+               case XIM_COMP_FAIL:
+               {
+                   int n = 0, len= 0;
+                   for (n=len=0;rtrn.sym[n]!=XK_VoidSymbol;n++) {
+                       if ( nbytes-len > 0 ) {
+                           len+= _XTranslateKeySym(event->display,rtrn.sym[n],
+                                                       event->state,
+                                                       buffer+len,nbytes-len);
+                       }
+                   }
+                   if ( keysym!=NULL ) {
+                       if ( n==1 )     *keysym = rtrn.sym[0];
+                       else            *keysym = NoSymbol;
+                   }
+                   return len;
+               }
+               case XIM_COMP_SUCCEED:
+               {
+                   int len,n = 0;
+
+                   symbol = rtrn.matchSym;
+                   if ( keysym!=NULL ) *keysym = symbol;
+                   if ( rtrn.str[0]!='\0' ) {
+                       strncpy(buffer,rtrn.str,nbytes-1);
+                       buffer[nbytes-1]= '\0';
+                       len = strlen(buffer);
+                   }
+                   else {
+                       len = _XTranslateKeySym(event->display,symbol,
+                                                       event->state,
+                                                       buffer,nbytes);
+                   }
+                   for (n=0;rtrn.sym[n]!=XK_VoidSymbol;n++) {
+                       if ( nbytes-len > 0 ) {
+                           len+= _XTranslateKeySym(event->display,rtrn.sym[n],
+                                                       event->state,
+                                                       buffer+len,nbytes-len);
+                       }
+                   }
+                   return len;
+               }
+           }
+       }
+    }
+#endif
+
+    if (keysym)
+       *keysym = symbol;
+    /* arguable whether to use (event->state & ~modifiers) here */
+    return _XTranslateKeySym(event->display, symbol, event->state,
+                            buffer, nbytes);
+}
+
+static void
+_XFreeKeyBindings(
+    Display *dpy)
+{
+    register struct _XKeytrans *p, *np;
+
+    for (p = dpy->key_bindings; p; p = np) {
+       np = p->next;
+       Xfree(p->string);
+       Xfree((char *)p->modifiers);
+       Xfree((char *)p);
+    }
+}
+
+int
+XRebindKeysym (
+    Display *dpy,
+    KeySym keysym,
+    KeySym *mlist,
+    int nm,            /* number of modifiers in mlist */
+    _Xconst unsigned char *str,
+    int nbytes)
+{
+    register struct _XKeytrans *tmp, *p;
+    int nb;
+
+    if ((! dpy->keysyms) && (! _XKeyInitialize(dpy)))
+       return 0;
+    LockDisplay(dpy);
+    tmp = dpy->key_bindings;
+    nb = sizeof(KeySym) * nm;
+
+    if ((! (p = (struct _XKeytrans *) Xcalloc( 1, sizeof(struct _XKeytrans)))) ||
+       ((! (p->string = (char *) Xmalloc( (unsigned) nbytes))) &&
+        (nbytes > 0)) ||
+       ((! (p->modifiers = (KeySym *) Xmalloc( (unsigned) nb))) &&
+        (nb > 0))) {
+       if (p) {
+           if (p->string) Xfree(p->string);
+           if (p->modifiers) Xfree((char *) p->modifiers);
+           Xfree((char *) p);
+       }
+       UnlockDisplay(dpy);
+       return 0;
+    }
+
+    dpy->key_bindings = p;
+    dpy->free_funcs->key_bindings = _XFreeKeyBindings;
+    p->next = tmp;     /* chain onto list */
+    memcpy (p->string, (char *) str, nbytes);
+    p->len = nbytes;
+    memcpy ((char *) p->modifiers, (char *) mlist, nb);
+    p->key = keysym;
+    p->mlen = nm;
+    ComputeMaskFromKeytrans(dpy, p);
+    UnlockDisplay(dpy);
+    return 0;
+}
+
+unsigned
+_XKeysymToModifiers(
+    Display *dpy,
+    KeySym ks)
+{
+    CARD8 code,mods;
+    register KeySym *kmax;
+    register KeySym *k;
+    register XModifierKeymap *m;
+
+    if ((! dpy->keysyms) && (! _XKeyInitialize(dpy)))
+       return 0;
+    kmax = dpy->keysyms +
+          (dpy->max_keycode - dpy->min_keycode + 1) * dpy->keysyms_per_keycode;
+    k = dpy->keysyms;
+    m = dpy->modifiermap;
+    mods= 0;
+    while (k<kmax) {
+       if (*k == ks ) {
+           register int j = m->max_keypermod<<3;
+
+           code=(((k-dpy->keysyms)/dpy->keysyms_per_keycode)+dpy->min_keycode);
+
+           while (--j >= 0) {
+               if (code == m->modifiermap[j])
+                   mods|= (1<<(j/m->max_keypermod));
+           }
+       }
+       k++;
+    }
+    return mods;
+}
+
+/*
+ * given a list of modifiers, computes the mask necessary for later matching.
+ * This routine must lookup the key in the Keymap and then search to see
+ * what modifier it is bound to, if any.  Sets the AnyModifier bit if it
+ * can't map some keysym to a modifier.
+ */
+static void
+ComputeMaskFromKeytrans(
+    Display *dpy,
+    register struct _XKeytrans *p)
+{
+    register int i;
+
+    p->state = AnyModifier;
+    for (i = 0; i < p->mlen; i++) {
+       p->state|= XkbKeysymToModifiers(dpy,p->modifiers[i]);
+    }
+    p->state &= AllMods;
+}
diff --git a/src/KeysymStr.c b/src/KeysymStr.c
new file mode 100644 (file)
index 0000000..101f297
--- /dev/null
@@ -0,0 +1,150 @@
+
+/*
+
+Copyright 1990, 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 "Xlibint.h"
+#include <X11/Xresource.h>
+#include <X11/keysymdef.h>
+#include "Xresinternal.h"
+
+#include <stdio.h> /* sprintf */
+
+#define NEEDVTABLE
+#include "ks_tables.h"
+#include "Key.h"
+
+
+typedef struct _GRNData {
+    char *name;
+    XrmRepresentation type;
+    XrmValuePtr value;
+} GRNData;
+
+/*ARGSUSED*/
+static Bool
+SameValue(
+    XrmDatabase*       db,
+    XrmBindingList      bindings,
+    XrmQuarkList       quarks,
+    XrmRepresentation*  type,
+    XrmValuePtr                value,
+    XPointer           data
+)
+{
+    GRNData *gd = (GRNData *)data;
+
+    if ((*type == gd->type) && (value->size == gd->value->size) &&
+       !strncmp((char *)value->addr, (char *)gd->value->addr, value->size))
+    {
+       gd->name = XrmQuarkToString(*quarks); /* XXX */
+       return True;
+    }
+    return False;
+}
+
+char *XKeysymToString(KeySym ks)
+{
+    register int i, n;
+    int h;
+    register int idx;
+    const unsigned char *entry;
+    unsigned char val1, val2, val3, val4;
+    XrmDatabase keysymdb;
+
+    if (!ks || (ks & ((unsigned long) ~0x1fffffff)) != 0)
+       return ((char *)NULL);
+    if (ks == XK_VoidSymbol)
+       ks = 0;
+    if (ks <= 0x1fffffff)
+    {
+       val1 = ks >> 24;
+       val2 = (ks >> 16) & 0xff;
+       val3 = (ks >> 8) & 0xff;
+       val4 = ks & 0xff;
+       i = ks % VTABLESIZE;
+       h = i + 1;
+       n = VMAXHASH;
+       while ((idx = hashKeysym[i]))
+       {
+           entry = &_XkeyTable[idx];
+           if ((entry[0] == val1) && (entry[1] == val2) &&
+                (entry[2] == val3) && (entry[3] == val4))
+               return ((char *)entry + 4);
+           if (!--n)
+               break;
+           i += h;
+           if (i >= VTABLESIZE)
+               i -= VTABLESIZE;
+       }
+    }
+
+    if ((keysymdb = _XInitKeysymDB()))
+    {
+       char buf[9];
+       XrmValue resval;
+       XrmQuark empty = NULLQUARK;
+       GRNData data;
+
+       sprintf(buf, "%lX", ks);
+       resval.addr = (XPointer)buf;
+       resval.size = strlen(buf) + 1;
+       data.name = (char *)NULL;
+       data.type = XrmPermStringToQuark("String");
+       data.value = &resval;
+       (void)XrmEnumerateDatabase(keysymdb, &empty, &empty, XrmEnumAllLevels,
+                                  SameValue, (XPointer)&data);
+        if (data.name)
+           return data.name;
+    }
+    if (ks >= 0x01000100 && ks <= 0x0110ffff) {
+        KeySym val = ks & 0xffffff;
+        char *s;
+        int i;
+        if (val & 0xff0000)
+            i = 10;
+        else
+            i = 6;
+        s = Xmalloc(i);
+        if (s == NULL)
+            return s;
+        i--;
+        s[i--] = '\0';
+        for (; i; i--){
+            val1 = val & 0xf;
+            val >>= 4;
+            if (val1 < 10)
+                s[i] = '0'+ val1;
+            else
+                s[i] = 'A'+ val1 - 10;
+        }
+        s[i] = 'U';
+        return s;
+    }
+    return ((char *) NULL);
+}
diff --git a/src/KillCl.c b/src/KillCl.c
new file mode 100644 (file)
index 0000000..cfd8cb0
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XKillClient(
+       register Display *dpy,
+       XID resource)
+{
+       register xResourceReq *req;
+       LockDisplay(dpy);
+        GetResReq(KillClient, resource, req);
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return 1;
+}
+
diff --git a/src/LiHosts.c b/src/LiHosts.c
new file mode 100644 (file)
index 0000000..5ae70d5
--- /dev/null
@@ -0,0 +1,156 @@
+/*
+
+Copyright 1986, 1998  The Open Group
+
+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, and/or sell copies of the Software, and to permit persons
+to whom the Software is furnished to do so, provided that the above
+copyright notice(s) and this permission notice appear in all copies of
+the Software and that both the above copyright notice(s) and this
+permission notice appear in supporting documentation.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR 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.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale, use
+or other dealings in this Software without prior written authorization
+of the copyright holder.
+
+X Window System is a trademark of The Open Group.
+
+*/
+
+/*
+ * Copyright 2004 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.
+ */
+
+/* This can really be considered an os dependent routine */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+/*
+ * can be freed using XFree.
+ */
+
+XHostAddress *XListHosts (
+    register Display *dpy,
+    int *nhosts,       /* RETURN */
+    Bool *enabled)     /* RETURN */
+{
+    register XHostAddress *outbuf = NULL, *op;
+    xListHostsReply reply;
+    long nbytes;
+    unsigned char *buf, *bp;
+    register unsigned i;
+    register xListHostsReq *req;
+    XServerInterpretedAddress *sip;
+
+    *nhosts = 0;
+    LockDisplay(dpy);
+    GetReq (ListHosts, req);
+
+    if (!_XReply (dpy, (xReply *) &reply, 0, xFalse)) {
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return (XHostAddress *) NULL;
+    }
+
+    if (reply.nHosts) {
+       nbytes = reply.length << 2;     /* compute number of bytes in reply */
+
+       op = outbuf = (XHostAddress *)
+           Xmalloc((unsigned) (nbytes +
+             (reply.nHosts * sizeof(XHostAddress)) +
+             (reply.nHosts * sizeof(XServerInterpretedAddress))));
+
+       if (! outbuf) {
+           _XEatData(dpy, (unsigned long) nbytes);
+           UnlockDisplay(dpy);
+           SyncHandle();
+           return (XHostAddress *) NULL;
+       }
+       sip = (XServerInterpretedAddress *)
+        (((unsigned char  *) outbuf) + (reply.nHosts * sizeof(XHostAddress)));
+       bp = buf = ((unsigned char  *) sip)
+         + (reply.nHosts * sizeof(XServerInterpretedAddress));
+
+       _XRead (dpy, (char *) buf, nbytes);
+
+       for (i = 0; i < reply.nHosts; i++) {
+#ifdef WORD64
+           xHostEntry xhe;
+           memcpy((char *)&xhe, bp, SIZEOF(xHostEntry));
+           op->family = xhe.family;
+           op->length = xhe.length;
+#else
+           op->family = ((xHostEntry *) bp)->family;
+           op->length =((xHostEntry *) bp)->length;
+#endif
+           if (op->family == FamilyServerInterpreted) {
+               char *tp = (char *) (bp + SIZEOF(xHostEntry));
+               char *vp = memchr(tp, 0, op->length);
+
+               if (vp != NULL) {
+                   sip->type = tp;
+                   sip->typelength = vp - tp;
+                   sip->value = vp + 1;
+                   sip->valuelength = op->length - (sip->typelength + 1);
+               } else {
+                   sip->type = sip->value = NULL;
+                   sip->typelength = sip->valuelength = 0;
+               }
+               op->address = (char *) sip;
+               sip++;
+           } else {
+               op->address = (char *) (bp + SIZEOF(xHostEntry));
+           }
+           bp += SIZEOF(xHostEntry) + (((op->length + 3) >> 2) << 2);
+           op++;
+       }
+    }
+
+    *enabled = reply.enabled;
+    *nhosts = reply.nHosts;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return (outbuf);
+}
+
+
+
+
+
diff --git a/src/LiICmaps.c b/src/LiICmaps.c
new file mode 100644 (file)
index 0000000..e981619
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+Colormap *XListInstalledColormaps(
+    register Display *dpy,
+    Window win,
+    int *n)  /* RETURN */
+{
+    long nbytes;
+    Colormap *cmaps;
+    xListInstalledColormapsReply rep;
+    register xResourceReq *req;
+
+    LockDisplay(dpy);
+    GetResReq(ListInstalledColormaps, win, req);
+
+    if(_XReply(dpy, (xReply *) &rep, 0, xFalse) == 0) {
+           UnlockDisplay(dpy);
+           SyncHandle();
+           *n = 0;
+           return((Colormap *) NULL);
+       }
+
+    if (rep.nColormaps) {
+       nbytes = rep.nColormaps * sizeof(Colormap);
+       cmaps = (Colormap *) Xmalloc((unsigned) nbytes);
+       nbytes = rep.nColormaps << 2;
+       if (! cmaps) {
+           _XEatData(dpy, (unsigned long) nbytes);
+           UnlockDisplay(dpy);
+           SyncHandle();
+           return((Colormap *) NULL);
+       }
+       _XRead32 (dpy, (long *) cmaps, nbytes);
+    }
+    else cmaps = (Colormap *) NULL;
+
+    *n = rep.nColormaps;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return(cmaps);
+}
+
diff --git a/src/LiProps.c b/src/LiProps.c
new file mode 100644 (file)
index 0000000..72560ab
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+Atom *XListProperties(
+    register Display *dpy,
+    Window window,
+    int *n_props)  /* RETURN */
+{
+    long nbytes;
+    xListPropertiesReply rep;
+    Atom *properties;
+    register xResourceReq *req;
+
+    LockDisplay(dpy);
+    GetResReq(ListProperties, window, req);
+    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
+       *n_props = 0;
+       UnlockDisplay(dpy);
+        SyncHandle();
+       return ((Atom *) NULL);
+    }
+
+    if (rep.nProperties) {
+       nbytes = rep.nProperties * sizeof(Atom);
+       properties = (Atom *) Xmalloc ((unsigned) nbytes);
+       nbytes = rep.nProperties << 2;
+       if (! properties) {
+           _XEatData(dpy, (unsigned long) nbytes);
+           UnlockDisplay(dpy);
+           SyncHandle();
+           return (Atom *) NULL;
+       }
+       _XRead32 (dpy, (long *) properties, nbytes);
+    }
+    else properties = (Atom *) NULL;
+
+    *n_props = rep.nProperties;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return (properties);
+}
diff --git a/src/ListExt.c b/src/ListExt.c
new file mode 100644 (file)
index 0000000..16b522e
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+char **XListExtensions(
+    register Display *dpy,
+    int *nextensions)  /* RETURN */
+{
+       xListExtensionsReply rep;
+       char **list;
+       char *ch;
+       register unsigned i;
+       register int length;
+       register xReq *req;
+       register long rlen;
+
+       LockDisplay(dpy);
+       GetEmptyReq (ListExtensions, req);
+
+       if (! _XReply (dpy, (xReply *) &rep, 0, xFalse)) {
+           UnlockDisplay(dpy);
+           SyncHandle();
+           return (char **) NULL;
+       }
+
+       if (rep.nExtensions) {
+           list = (char **) Xmalloc (
+                (unsigned)(rep.nExtensions * sizeof (char *)));
+           rlen = rep.length << 2;
+           ch = (char *) Xmalloc ((unsigned) rlen + 1);
+                /* +1 to leave room for last null-terminator */
+
+           if ((!list) || (!ch)) {
+               if (list) Xfree((char *) list);
+               if (ch)   Xfree((char *) ch);
+               _XEatData(dpy, (unsigned long) rlen);
+               UnlockDisplay(dpy);
+               SyncHandle();
+               return (char **) NULL;
+           }
+
+           _XReadPad (dpy, ch, rlen);
+           /*
+            * unpack into null terminated strings.
+            */
+           length = *ch;
+           for (i = 0; i < rep.nExtensions; i++) {
+               list[i] = ch+1;  /* skip over length */
+               ch += length + 1; /* find next length ... */
+               length = *ch;
+               *ch = '\0'; /* and replace with null-termination */
+           }
+       }
+       else list = (char **) NULL;
+
+       *nextensions = rep.nExtensions;
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return (list);
+}
+
+int
+XFreeExtensionList (char **list)
+{
+       if (list != NULL) {
+           Xfree (list[0]-1);
+           Xfree ((char *)list);
+       }
+       return 1;
+}
diff --git a/src/LoadFont.c b/src/LoadFont.c
new file mode 100644 (file)
index 0000000..f547976
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+Font
+XLoadFont (
+    register Display *dpy,
+    _Xconst char *name)
+{
+    register long nbytes;
+    Font fid;
+    register xOpenFontReq *req;
+
+    if (_XF86LoadQueryLocaleFont(dpy, name, (XFontStruct **)0, &fid))
+      return fid;
+
+    LockDisplay(dpy);
+    GetReq(OpenFont, req);
+    nbytes = req->nbytes = name ? strlen(name) : 0;
+    req->fid = fid = XAllocID(dpy);
+    req->length += (nbytes+3)>>2;
+    Data (dpy, name, nbytes);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return (fid);
+       /* can't return (req->fid) since request may have already been sent */
+}
+
diff --git a/src/LockDis.c b/src/LockDis.c
new file mode 100644 (file)
index 0000000..12dd97d
--- /dev/null
@@ -0,0 +1,84 @@
+
+/*
+
+Copyright 1993, 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.
+
+*/
+
+/*
+ * Author: Stephen Gildea, MIT X Consortium
+ *
+ * XLockDis.c - multi-thread application-level locking routines
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#ifdef XTHREADS
+#include "locking.h"
+#endif
+
+void
+XLockDisplay(
+    register Display* dpy)
+{
+#ifdef XTHREADS
+    LockDisplay(dpy);
+    if (dpy->lock)
+       (*dpy->lock->user_lock_display)(dpy);
+    /*
+     * We want the threads in the reply queue to all get out before
+     * XLockDisplay returns, in case they have any side effects the
+     * caller of XLockDisplay was trying to protect against.
+     * XLockDisplay puts itself at the head of the event waiters queue
+     * to wait for all the replies to come in.
+     */
+    if (dpy->lock && dpy->lock->reply_awaiters) {
+       struct _XCVList *cvl;
+
+       cvl = (*dpy->lock->create_cvl)(dpy);
+
+       /* stuff ourselves on the head of the queue */
+       cvl->next = dpy->lock->event_awaiters;
+       dpy->lock->event_awaiters = cvl;
+
+       while (dpy->lock->reply_awaiters)
+           ConditionWait(dpy, cvl->cv);
+       UnlockNextEventReader(dpy); /* pass the signal on */
+    }
+    UnlockDisplay(dpy);
+#endif
+}
+
+void
+XUnlockDisplay(
+    register Display* dpy)
+{
+#ifdef XTHREADS
+    LockDisplay(dpy);
+    if (dpy->lock)
+       (*dpy->lock->user_unlock_display)(dpy);
+    UnlockDisplay(dpy);
+#endif
+}
diff --git a/src/LookupCol.c b/src/LookupCol.c
new file mode 100644 (file)
index 0000000..f7f969f
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+
+Copyright 1985, 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 <stdio.h>
+#include "Xlibint.h"
+#include "Xcmsint.h"
+
+
+Status
+XLookupColor (
+       register Display *dpy,
+        Colormap cmap,
+       _Xconst char *spec,
+       XColor *def,
+       XColor *scr)
+{
+       register int n;
+       xLookupColorReply reply;
+       register xLookupColorReq *req;
+       XcmsCCC ccc;
+       XcmsColor cmsColor_exact;
+
+#ifdef XCMS
+       /*
+        * Let's Attempt to use Xcms and i18n approach to Parse Color
+        */
+       if ((ccc = XcmsCCCOfColormap(dpy, cmap)) != (XcmsCCC)NULL) {
+           const char *tmpName = spec;
+
+           switch (_XcmsResolveColorString(ccc, &tmpName, &cmsColor_exact,
+                                           XcmsRGBFormat)) {
+           case XcmsSuccess:
+           case XcmsSuccessWithCompression:
+               _XcmsRGB_to_XColor(&cmsColor_exact, def, 1);
+               memcpy((char *)scr, (char *)def, sizeof(XColor));
+               _XUnresolveColor(ccc, scr);
+               return(1);
+           case XcmsFailure:
+           case _XCMS_NEWNAME:
+               /*
+                * if the result was _XCMS_NEWNAME tmpName points to
+                * a string in cmsColNm.c:pairs table, for example,
+                * gray70 would become tekhvc:0.0/70.0/0.0
+                */
+               break;
+           }
+       }
+#endif
+
+       /*
+        * Xcms and i18n methods failed, so lets pass it to the server
+        * for parsing.
+        */
+
+       n = strlen (spec);
+       LockDisplay(dpy);
+       GetReq (LookupColor, req);
+       req->cmap = cmap;
+       req->nbytes = n;
+       req->length += (n + 3) >> 2;
+       Data (dpy, spec, (long)n);
+       if (!_XReply (dpy, (xReply *) &reply, 0, xTrue)) {
+           UnlockDisplay(dpy);
+           SyncHandle();
+           return (0);
+           }
+       def->red   = reply.exactRed;
+       def->green = reply.exactGreen;
+       def->blue  = reply.exactBlue;
+
+       scr->red   = reply.screenRed;
+       scr->green = reply.screenGreen;
+       scr->blue  = reply.screenBlue;
+
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return (1);
+}
diff --git a/src/LowerWin.c b/src/LowerWin.c
new file mode 100644 (file)
index 0000000..d430e6f
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XLowerWindow(
+    Display *dpy,
+    Window w)
+{
+    register xConfigureWindowReq *req;
+    unsigned long val = Below;         /* needed for macro */
+
+    LockDisplay(dpy);
+    GetReqExtra(ConfigureWindow, 4, req);
+    req->window = w;
+    req->mask = CWStackMode;
+    OneDataCard32 (dpy, NEXTPTR(req,xConfigureWindowReq), val);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/Macros.c b/src/Macros.c
new file mode 100644 (file)
index 0000000..42d4cf1
--- /dev/null
@@ -0,0 +1,287 @@
+/*
+
+Copyright 1987, 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 "Xlibint.h"
+#define XUTIL_DEFINE_FUNCTIONS
+#include "Xutil.h"
+
+/*
+ * This file makes full definitions of routines for each macro.
+ * We do not expect C programs to use these, but other languages may
+ * need them.
+ */
+
+int XConnectionNumber(Display *dpy) { return (ConnectionNumber(dpy)); }
+
+Window XRootWindow (Display *dpy, int scr)
+{
+    return (RootWindow(dpy,scr));
+}
+
+int XDefaultScreen(Display *dpy) { return (DefaultScreen(dpy)); }
+
+Window XDefaultRootWindow (Display *dpy)
+{
+    return (RootWindow(dpy,DefaultScreen(dpy)));
+}
+
+Visual *XDefaultVisual(Display *dpy, int scr)
+{
+    return (DefaultVisual(dpy, scr));
+}
+
+GC XDefaultGC(Display *dpy, int scr)
+{
+    return (DefaultGC(dpy,scr));
+}
+
+unsigned long XBlackPixel(Display *dpy, int scr)
+{
+    return (BlackPixel(dpy, scr));
+}
+
+unsigned long XWhitePixel(Display *dpy, int scr)
+{
+    return (WhitePixel(dpy,scr));
+}
+
+unsigned long XAllPlanes(void) { return AllPlanes; }
+
+int XQLength(Display *dpy) { return (QLength(dpy)); }
+
+int XDisplayWidth(Display *dpy, int scr)
+{
+    return (DisplayWidth(dpy,scr));
+}
+
+int XDisplayHeight(Display *dpy, int scr)
+{
+    return (DisplayHeight(dpy, scr));
+}
+
+int XDisplayWidthMM(Display *dpy, int scr)
+{
+    return (DisplayWidthMM(dpy, scr));
+}
+
+int XDisplayHeightMM(Display *dpy, int scr)
+{
+    return (DisplayHeightMM(dpy, scr));
+}
+
+int XDisplayPlanes(Display *dpy, int scr)
+{
+    return (DisplayPlanes(dpy, scr));
+}
+
+int XDisplayCells(Display *dpy, int scr)
+{
+    return (DisplayCells (dpy, scr));
+}
+
+int XScreenCount(Display *dpy) { return (ScreenCount(dpy)); }
+
+char *XServerVendor(Display *dpy) { return (ServerVendor(dpy)); }
+
+int XProtocolVersion(Display *dpy) { return (ProtocolVersion(dpy)); }
+
+int XProtocolRevision(Display *dpy) { return (ProtocolRevision(dpy));}
+
+int XVendorRelease(Display *dpy) { return (VendorRelease(dpy)); }
+
+char *XDisplayString(Display *dpy) { return (DisplayString(dpy)); }
+
+int XDefaultDepth(Display *dpy, int scr)
+{
+    return(DefaultDepth(dpy, scr));
+}
+
+Colormap XDefaultColormap(Display *dpy, int scr)
+{
+    return (DefaultColormap(dpy, scr));
+}
+
+int XBitmapUnit(Display *dpy) { return (BitmapUnit(dpy)); }
+
+int XBitmapBitOrder(Display *dpy) { return (BitmapBitOrder(dpy)); }
+
+int XBitmapPad(Display *dpy) { return (BitmapPad(dpy)); }
+
+int XImageByteOrder(Display *dpy) { return (ImageByteOrder(dpy)); }
+
+unsigned long XNextRequest(Display *dpy)
+{
+#ifdef WORD64
+    WORD64ALIGN
+    return dpy->request + 1;
+#else
+    return (NextRequest(dpy));
+#endif
+}
+
+unsigned long XLastKnownRequestProcessed(Display *dpy)
+{
+    return (LastKnownRequestProcessed(dpy));
+}
+
+/* screen oriented macros (toolkit) */
+Screen *XScreenOfDisplay(Display *dpy, int scr)
+{
+    return (ScreenOfDisplay(dpy, scr));
+}
+
+Screen *XDefaultScreenOfDisplay(Display *dpy)
+{
+    return (DefaultScreenOfDisplay(dpy));
+}
+
+Display *XDisplayOfScreen(Screen *s) { return (DisplayOfScreen(s)); }
+
+Window XRootWindowOfScreen(Screen *s) { return (RootWindowOfScreen(s)); }
+
+unsigned long XBlackPixelOfScreen(Screen *s)
+{
+    return (BlackPixelOfScreen(s));
+}
+
+unsigned long XWhitePixelOfScreen(Screen *s)
+{
+    return (WhitePixelOfScreen(s));
+}
+
+Colormap XDefaultColormapOfScreen(Screen *s)
+{
+    return (DefaultColormapOfScreen(s));
+}
+
+int XDefaultDepthOfScreen(Screen *s)
+{
+    return (DefaultDepthOfScreen(s));
+}
+
+GC XDefaultGCOfScreen(Screen *s)
+{
+    return (DefaultGCOfScreen(s));
+}
+
+Visual *XDefaultVisualOfScreen(Screen *s)
+{
+    return (DefaultVisualOfScreen(s));
+}
+
+int XWidthOfScreen(Screen *s) { return (WidthOfScreen(s)); }
+
+int XHeightOfScreen(Screen *s) { return (HeightOfScreen(s)); }
+
+int XWidthMMOfScreen(Screen *s) { return (WidthMMOfScreen(s)); }
+
+int XHeightMMOfScreen(Screen *s) { return (HeightMMOfScreen(s)); }
+
+int XPlanesOfScreen(Screen *s) { return (PlanesOfScreen(s)); }
+
+int XCellsOfScreen(Screen *s) { return (CellsOfScreen(s)); }
+
+int XMinCmapsOfScreen(Screen *s) { return (MinCmapsOfScreen(s)); }
+
+int XMaxCmapsOfScreen(Screen *s) { return (MaxCmapsOfScreen(s)); }
+
+Bool XDoesSaveUnders(Screen *s) { return (DoesSaveUnders(s)); }
+
+int XDoesBackingStore(Screen *s) { return (DoesBackingStore(s)); }
+
+long XEventMaskOfScreen(Screen *s) { return (EventMaskOfScreen(s)); }
+
+int XScreenNumberOfScreen (register Screen *scr)
+{
+    register Display *dpy = scr->display;
+    register Screen *dpyscr = dpy->screens;
+    register int i;
+
+    for (i = 0; i < dpy->nscreens; i++, dpyscr++) {
+       if (scr == dpyscr) return i;
+    }
+    return -1;
+}
+
+/*
+ * These macros are used to give some sugar to the image routines so that
+ * naive people are more comfortable with them.
+ */
+#undef XDestroyImage
+int
+XDestroyImage(
+       XImage *ximage)
+{
+       return((*((ximage)->f.destroy_image))((ximage)));
+}
+#undef XGetPixel
+unsigned long XGetPixel(
+       XImage *ximage,
+       int x, int y)
+{
+       return ((*((ximage)->f.get_pixel))((ximage), (x), (y)));
+}
+#undef XPutPixel
+int XPutPixel(
+       XImage *ximage,
+       int x, int y,
+       unsigned long pixel)
+{
+       return((*((ximage)->f.put_pixel))((ximage), (x), (y), (pixel)));
+}
+#undef XSubImage
+XImage *XSubImage(
+       XImage *ximage,
+       int x, int y,
+       unsigned int width, unsigned int height)
+{
+       return((*((ximage)->f.sub_image))((ximage), (x),
+               (y), (width), (height)));
+}
+#undef XAddPixel
+int XAddPixel(
+       XImage *ximage,
+       long value)
+{
+       return((*((ximage)->f.add_pixel))((ximage), (value)));
+}
+
+
+int
+XNoOp (register Display *dpy)
+{
+    register xReq *req;
+
+    LockDisplay(dpy);
+    GetEmptyReq(NoOperation, req);
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/Makefile.am b/src/Makefile.am
new file mode 100644 (file)
index 0000000..71e02e7
--- /dev/null
@@ -0,0 +1,425 @@
+if XKB
+XKB_SUBDIRS = xkb
+endif
+SUBDIRS = util xcms xlibi18n $(XKB_SUBDIRS)
+
+lib_LTLIBRARIES = libX11.la libX11-xcb.la
+
+BUILT_SOURCES=ks_tables.h
+CLEANFILES=ks_tables.h ks_tables_h
+
+AM_CPPFLAGS= \
+       -I$(top_srcdir)/include \
+       -I$(top_srcdir)/include/X11 \
+       -I$(top_builddir)/include \
+       -I$(top_builddir)/include/X11 \
+       -I$(top_srcdir)/src/xcms \
+       -I$(top_srcdir)/src/xkb \
+       -I$(top_srcdir)/src/xlibi18n \
+       -D_BSD_SOURCE -DX11_t -DTRANS_CLIENT
+
+AM_CFLAGS= \
+       $(X11_CFLAGS) \
+       $(BIGFONT_CFLAGS) \
+       $(XMALLOC_ZERO_CFLAGS) \
+       $(CWARNFLAGS)
+
+#
+# =============================== I18N =============================
+#
+
+I18N_LIBS = \
+       xlibi18n/libi18n.la
+
+#
+# =============================== XCMS =============================
+#
+
+XCMS_LIBS = \
+       xcms/libxcms.la
+
+#
+# =============================== XKB ==============================
+#
+
+XKB_LIBS = \
+       xkb/libxkb.la
+
+#
+# =============================== XLIB =============================
+#
+
+libX11_la_SOURCES = \
+                  AllCells.c \
+                  AllowEv.c \
+                  AllPlanes.c \
+                  AutoRep.c \
+                  Backgnd.c \
+                  BdrWidth.c \
+                  Bell.c \
+                  Border.c \
+                  ChAccCon.c \
+                  ChActPGb.c \
+                  ChClMode.c \
+                  ChCmap.c \
+                  ChGC.c \
+                  ChKeyCon.c \
+                  ChkIfEv.c \
+                  ChkMaskEv.c \
+                  ChkTypEv.c \
+                  ChkTypWEv.c \
+                  ChkWinEv.c \
+                  ChPntCon.c \
+                  ChProp.c \
+                  ChSaveSet.c \
+                  ChWAttrs.c \
+                  ChWindow.c \
+                  CirWin.c \
+                  CirWinDn.c \
+                  CirWinUp.c \
+                  ClDisplay.c \
+                  ClearArea.c \
+                  Clear.c \
+                 Cmap.h \
+                  ConfWind.c \
+                  Context.c \
+                  ConvSel.c \
+                  CopyArea.c \
+                  CopyCmap.c \
+                  CopyGC.c \
+                  CopyPlane.c \
+                  CrBFData.c \
+                  CrCmap.c \
+                  CrCursor.c \
+                  CrGC.c \
+                  CrGlCur.c \
+                  Cr.h \
+                  CrPFBData.c \
+                  CrPixmap.c \
+                  CrWindow.c \
+                  Cursor.c \
+                  DefCursor.c \
+                  DelProp.c \
+                  Depths.c \
+                  DestSubs.c \
+                  DestWind.c \
+                  DisName.c \
+                  DrArc.c \
+                  DrArcs.c \
+                  DrLine.c \
+                  DrLines.c \
+                  DrPoint.c \
+                  DrPoints.c \
+                  DrRect.c \
+                  DrRects.c \
+                  DrSegs.c \
+                  ErrDes.c \
+                  ErrHndlr.c \
+                  evtomask.c \
+                  EvToWire.c \
+                  FetchName.c \
+                  FillArc.c \
+                  FillArcs.c \
+                  FillPoly.c \
+                  FillRct.c \
+                  FillRcts.c \
+                  FilterEv.c \
+                  Flush.c \
+                  Font.c \
+                  FontInfo.c \
+                  FontNames.c \
+                  FreeCmap.c \
+                  FreeCols.c \
+                  FreeCurs.c \
+                  FreeEData.c \
+                  FreeEventData.c \
+                  FreeGC.c \
+                  FreePix.c \
+                  FSSaver.c \
+                  FSWrap.c \
+                  GCMisc.c \
+                  Geom.c \
+                  GetAtomNm.c \
+                  GetColor.c \
+                  GetDflt.c \
+                  GetEventData.c \
+                  GetFPath.c \
+                  GetFProp.c \
+                  GetGCVals.c \
+                  GetGeom.c \
+                  GetHColor.c \
+                  GetHints.c \
+                  GetIFocus.c \
+                  GetImage.c \
+                  GetKCnt.c \
+                  GetMoEv.c \
+                  GetNrmHint.c \
+                  GetPCnt.c \
+                  GetPntMap.c \
+                  GetProp.c \
+                  GetRGBCMap.c \
+                  GetSOwner.c \
+                  GetSSaver.c \
+                  GetStCmap.c \
+                  GetTxtProp.c \
+                  GetWAttrs.c \
+                  GetWMCMapW.c \
+                  GetWMProto.c \
+                  globals.c \
+                  GrButton.c \
+                  GrKeybd.c \
+                  GrKey.c \
+                  GrPointer.c \
+                  GrServer.c \
+                  Host.c \
+                  Iconify.c \
+                  IfEvent.c \
+                 imConv.c \
+                  ImText16.c \
+                  ImText.c \
+                  ImUtil.c \
+                  InitExt.c \
+                  InsCmap.c \
+                  IntAtom.c \
+                  KeyBind.c \
+                  Key.h \
+                  KeysymStr.c \
+                  KillCl.c \
+                  LiHosts.c \
+                  LiICmaps.c \
+                  LiProps.c \
+                  ListExt.c \
+                  LoadFont.c \
+                  LockDis.c \
+                  locking.c \
+                  locking.h \
+                  LookupCol.c \
+                  LowerWin.c \
+                  Macros.c \
+                  MapRaised.c \
+                  MapSubs.c \
+                  MapWindow.c \
+                  MaskEvent.c \
+                  Misc.c \
+                  ModMap.c \
+                  MoveWin.c \
+                  NextEvent.c \
+                  OCWrap.c \
+                  OMWrap.c \
+                  OpenDis.c \
+                  ParseCmd.c \
+                  ParseCol.c \
+                  ParseGeom.c \
+                  PeekEvent.c \
+                  PeekIfEv.c \
+                  Pending.c \
+                  PixFormats.c \
+                  PmapBgnd.c \
+                  PmapBord.c \
+                  poly.h \
+                  PolyReg.c \
+                  PolyTxt16.c \
+                  PolyTxt.c \
+                  PropAlloc.c \
+                  PutBEvent.c \
+                  PutImage.c \
+                  Quarks.c \
+                  QuBest.c \
+                  QuColor.c \
+                  QuColors.c \
+                  QuCurShp.c \
+                  QuExt.c \
+                  QuKeybd.c \
+                  QuPntr.c \
+                  QuStipShp.c \
+                  QuTextE16.c \
+                  QuTextExt.c \
+                  QuTileShp.c \
+                  QuTree.c \
+                  RaiseWin.c \
+                  RdBitF.c \
+                  RecolorC.c \
+                  ReconfWin.c \
+                  ReconfWM.c \
+                  Region.c \
+                  RegstFlt.c \
+                  RepWindow.c \
+                  RestackWs.c \
+                  RotProp.c \
+                  ScrResStr.c \
+                  SelInput.c \
+                  SendEvent.c \
+                  SetBack.c \
+                  SetClMask.c \
+                  SetClOrig.c \
+                  SetCRects.c \
+                  SetDashes.c \
+                  SetFont.c \
+                  SetFore.c \
+                  SetFPath.c \
+                  SetFunc.c \
+                  SetHints.c \
+                  SetIFocus.c \
+                  SetLocale.c \
+                  SetLStyle.c \
+                  SetNrmHint.c \
+                  SetPMask.c \
+                  SetPntMap.c \
+                  SetRGBCMap.c \
+                  SetSOwner.c \
+                  SetSSaver.c \
+                  SetState.c \
+                  SetStCmap.c \
+                  SetStip.c \
+                  SetTile.c \
+                  SetTSOrig.c \
+                  SetTxtProp.c \
+                  SetWMCMapW.c \
+                  SetWMProto.c \
+                  StBytes.c \
+                  StColor.c \
+                  StColors.c \
+                  StName.c \
+                  StNColor.c \
+                  StrKeysym.c \
+                  StrToText.c \
+                  Sync.c \
+                  Synchro.c \
+                  Text16.c \
+                  Text.c \
+                  TextExt16.c \
+                  TextExt.c \
+                  TextToStr.c \
+                  TrCoords.c \
+                  UndefCurs.c \
+                  UngrabBut.c \
+                  UngrabKbd.c \
+                  UngrabKey.c \
+                  UngrabPtr.c \
+                  UngrabSvr.c \
+                  UninsCmap.c \
+                  UnldFont.c \
+                  UnmapSubs.c \
+                  UnmapWin.c \
+                  utlist.h \
+                  VisUtil.c \
+                  WarpPtr.c \
+                  Window.c \
+                  WinEvent.c \
+                  Withdraw.c \
+                  WMGeom.c \
+                  WMProps.c \
+                  WrBitF.c \
+                  Xatomtype.h \
+                  xcb_disp.c \
+                  xcb_io.c \
+                  Xintatom.h \
+                  Xintconn.h \
+                  XlibAsync.c \
+                  XlibInt.c \
+                  Xprivate.h \
+                  XomGeneric.h \
+                  Xresinternal.h \
+                  Xrm.c \
+                  Xxcbint.h
+
+#
+# ========================= Extra stuff ============================
+#
+
+if OS2
+libX11_la_SOURCES+=os2Stubs.c
+endif OS2
+
+if UDC
+libX11_la_SOURCES+=udcInf.c
+endif
+
+if THRSTUBS
+libX11_la_SOURCES+=UIThrStubs.c
+endif
+
+x11datadir = @X11_DATADIR@
+x11data_DATA = XErrorDB
+
+EXTRA_DIST = \
+       $(x11data_DATA) \
+       os2Stubs.c \
+       udcInf.c \
+       UIThrStubs.c 
+
+libX11_xcb_la_SOURCES = x11_xcb.c Xxcbint.h
+libX11_xcb_la_LDFLAGS = -version-number 1:0:0 -no-undefined
+libX11_xcb_la_LIBADD = libX11.la
+
+#
+# Figure out which sub-libraries to link into Xlib
+#
+
+if XLOCALE
+USE_I18N_LIBS = $(I18N_LIBS)
+endif
+
+if XCMS
+USE_XCMS_LIBS = $(XCMS_LIBS)
+endif
+
+if XKB
+USE_XKB_LIBS = $(XKB_LIBS)
+endif
+
+libX11_la_LDFLAGS = -version-number 6:3:0 -no-undefined
+
+libX11_la_LIBADD = \
+       $(USE_I18N_LIBS) \
+       $(USE_XCMS_LIBS) \
+       $(USE_XKB_LIBS) \
+       $(X11_LIBS)
+
+preprocess: $(patsubst %.c,%.ii,$(libX11_la_SOURCES))
+.c.ii:
+       $(COMPILE) -E -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
+
+if LINT
+# Check source code with tools like lint & sparse
+
+ALL_LINT_FLAGS=$(LINT_FLAGS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+               $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS)
+
+lint:  $(BUILT_SOURCES)
+       for f in $(libX11_la_SOURCES) ; do \
+               $(LINT) $(ALL_LINT_FLAGS) $$f ; \
+       done
+       @for subdir in $(SUBDIRS) ; do \
+               echo "Making $@ in src/$$subdir"; \
+               (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) lint) ; \
+       done
+endif LINT
+
+if MAKE_LINT_LIB
+lintlibdir = $(libdir)
+
+lintlib_DATA = $(LINTLIB)
+
+lintlib_src = $(libX11_la_SOURCES) xcms/*.c xkb/*.c
+
+CLEANFILES += $(lintlib_DATA)
+
+$(LINTLIB): $(libX11_la_SOURCES)
+       $(AM_V_GEN)$(LINT) -y -oX11 -x $(ALL_LINT_FLAGS) $(lintlib_src)
+endif MAKE_LINT_LIB
+
+#
+# Building ks_tables.h requires the makekeys utility
+#
+
+KEYSYMDEFS=@KEYSYMDEFS@
+
+ks_tables.h: $(KEYSYMDEFS) $(top_builddir)/src/util/makekeys$(EXEEXT)
+       $(top_builddir)/src/util/makekeys $(KEYSYMDEFS) > ks_tables_h
+       mv ks_tables_h $@
+
+$(top_builddir)/src/util/makekeys$(EXEEXT): force
+       cd util && $(MAKE)
+
+force:
diff --git a/src/MapRaised.c b/src/MapRaised.c
new file mode 100644 (file)
index 0000000..6ad6aef
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XMapRaised (
+    register Display *dpy,
+    Window w)
+{
+    register xConfigureWindowReq *req;
+    register xResourceReq *req2;
+    unsigned long val = Above;         /* needed for macro */
+
+    LockDisplay(dpy);
+    GetReqExtra(ConfigureWindow, 4, req);
+    req->window = w;
+    req->mask = CWStackMode;
+    OneDataCard32 (dpy, NEXTPTR(req,xConfigureWindowReq), val);
+    GetResReq (MapWindow, w, req2);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/MapSubs.c b/src/MapSubs.c
new file mode 100644 (file)
index 0000000..14e8b8a
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XMapSubwindows(
+    register Display *dpy,
+    Window win)
+{
+    register xResourceReq *req;
+    LockDisplay(dpy);
+    GetResReq(MapSubwindows, win, req);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/MapWindow.c b/src/MapWindow.c
new file mode 100644 (file)
index 0000000..cc041ff
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XMapWindow (
+       register Display *dpy,
+       Window w)
+{
+       register xResourceReq *req;
+       LockDisplay (dpy);
+        GetResReq(MapWindow, w, req);
+       UnlockDisplay (dpy);
+       SyncHandle();
+       return 1;
+}
+
diff --git a/src/MaskEvent.c b/src/MaskEvent.c
new file mode 100644 (file)
index 0000000..cbc8ca1
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+extern long const _Xevent_to_mask[];
+#define AllPointers (PointerMotionMask|PointerMotionHintMask|ButtonMotionMask)
+#define AllButtons (Button1MotionMask|Button2MotionMask|Button3MotionMask|\
+                   Button4MotionMask|Button5MotionMask)
+
+/*
+ * return the next event in the queue matching one of the events in the mask.
+ * If no event, flush output, and wait until match succeeds.
+ * Events earlier in the queue are not discarded.
+ */
+
+int
+XMaskEvent (
+       register Display *dpy,
+       long mask,              /* Selected event mask. */
+       register XEvent *event) /* XEvent to be filled in. */
+{
+       register _XQEvent *prev, *qelt;
+       unsigned long qe_serial = 0;
+
+        LockDisplay(dpy);
+
+       /* Delete unclaimed cookies */
+       _XFreeEventCookies(dpy);
+
+       prev = NULL;
+       while (1) {
+           for (qelt = prev ? prev->next : dpy->head;
+                qelt;
+                prev = qelt, qelt = qelt->next) {
+               if ((qelt->event.type < GenericEvent) &&
+                   (_Xevent_to_mask[qelt->event.type] & mask) &&
+                   ((qelt->event.type != MotionNotify) ||
+                    (mask & AllPointers) ||
+                    (mask & AllButtons & qelt->event.xmotion.state))) {
+                   *event = qelt->event;
+                   _XDeq(dpy, prev, qelt);
+                   UnlockDisplay(dpy);
+                   return 0;
+               }
+           }
+           if (prev)
+               qe_serial = prev->qserial_num;
+           _XReadEvents(dpy);
+           if (prev && prev->qserial_num != qe_serial)
+               /* another thread has snatched this event */
+               prev = NULL;
+       }
+}
diff --git a/src/Misc.c b/src/Misc.c
new file mode 100644 (file)
index 0000000..c3a0284
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+
+Copyright 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 "Xlibint.h"
+
+long XMaxRequestSize(Display *dpy)
+{
+    return dpy->max_request_size;
+}
+
+char *XResourceManagerString(Display *dpy)
+{
+    return dpy->xdefaults;
+}
+
+unsigned long XDisplayMotionBufferSize(Display *dpy)
+{
+    return dpy->motion_buffer;
+}
+
+int
+XDisplayKeycodes(
+    Display *dpy,
+    int *min_keycode_return,
+    int *max_keycode_return)
+{
+    *min_keycode_return = dpy->min_keycode;
+    *max_keycode_return = dpy->max_keycode;
+    return 1;
+}
+
+VisualID XVisualIDFromVisual(Visual *visual)
+{
+    return visual->visualid;
+}
+
+long XExtendedMaxRequestSize(Display *dpy)
+{
+    return dpy->bigreq_size;
+}
diff --git a/src/ModMap.c b/src/ModMap.c
new file mode 100644 (file)
index 0000000..c99bfdd
--- /dev/null
@@ -0,0 +1,181 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+XModifierKeymap *
+XGetModifierMapping(register Display *dpy)
+{
+    xGetModifierMappingReply rep;
+    register xReq *req;
+    unsigned long nbytes;
+    XModifierKeymap *res;
+
+    LockDisplay(dpy);
+    GetEmptyReq(GetModifierMapping, req);
+    (void) _XReply (dpy, (xReply *)&rep, 0, xFalse);
+
+    nbytes = (unsigned long)rep.length << 2;
+    res = (XModifierKeymap *) Xmalloc(sizeof (XModifierKeymap));
+    if (res) res->modifiermap = (KeyCode *) Xmalloc ((unsigned) nbytes);
+    if ((! res) || (! res->modifiermap)) {
+       if (res) Xfree((char *) res);
+       res = (XModifierKeymap *) NULL;
+       _XEatData(dpy, nbytes);
+    } else {
+       _XReadPad(dpy, (char *) res->modifiermap, (long) nbytes);
+       res->max_keypermod = rep.numKeyPerModifier;
+    }
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return (res);
+}
+
+/*
+ *     Returns:
+ *     0       Success
+ *     1       Busy - one or more old or new modifiers are down
+ *     2       Failed - one or more new modifiers unacceptable
+ */
+int
+XSetModifierMapping(
+    register Display *dpy,
+    register XModifierKeymap *modifier_map)
+{
+    register xSetModifierMappingReq *req;
+    xSetModifierMappingReply rep;
+    int         mapSize = modifier_map->max_keypermod << 3;    /* 8 modifiers */
+
+    LockDisplay(dpy);
+    GetReqExtra(SetModifierMapping, mapSize, req);
+
+    req->numKeyPerModifier = modifier_map->max_keypermod;
+
+    memcpy((char *) NEXTPTR(req,xSetModifierMappingReq),
+          (char *) modifier_map->modifiermap,
+          mapSize);
+
+    (void) _XReply(dpy, (xReply *) & rep,
+       (SIZEOF(xSetModifierMappingReply) - SIZEOF(xReply)) >> 2, xTrue);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return (rep.success);
+}
+
+XModifierKeymap *
+XNewModifiermap(int keyspermodifier)
+{
+    XModifierKeymap *res = (XModifierKeymap *) Xmalloc((sizeof (XModifierKeymap)));
+    if (res) {
+       res->max_keypermod = keyspermodifier;
+       res->modifiermap = (keyspermodifier > 0 ?
+                           (KeyCode *) Xmalloc((unsigned) (8 * keyspermodifier))
+                           : (KeyCode *) NULL);
+       if (keyspermodifier && (res->modifiermap == NULL)) {
+           Xfree((char *) res);
+           return (XModifierKeymap *) NULL;
+       }
+    }
+    return (res);
+}
+
+
+int
+XFreeModifiermap(XModifierKeymap *map)
+{
+    if (map) {
+       if (map->modifiermap)
+           Xfree((char *) map->modifiermap);
+       Xfree((char *) map);
+    }
+    return 1;
+}
+
+XModifierKeymap *
+XInsertModifiermapEntry(XModifierKeymap *map,
+#if NeedWidePrototypes
+                       unsigned int keycode,
+#else
+                       KeyCode keycode,
+#endif
+                       int modifier)
+{
+    XModifierKeymap *newmap;
+    int i,
+       row = modifier * map->max_keypermod,
+       newrow,
+       lastrow;
+
+    for (i=0; i<map->max_keypermod; i++) {
+        if (map->modifiermap[ row+i ] == keycode)
+           return(map); /* already in the map */
+        if (map->modifiermap[ row+i ] == 0) {
+            map->modifiermap[ row+i ] = keycode;
+           return(map); /* we added it without stretching the map */
+       }
+    }
+
+    /* stretch the map */
+    if ((newmap = XNewModifiermap(map->max_keypermod+1)) == NULL)
+       return (XModifierKeymap *) NULL;
+    newrow = row = 0;
+    lastrow = newmap->max_keypermod * 8;
+    while (newrow < lastrow) {
+       for (i=0; i<map->max_keypermod; i++)
+           newmap->modifiermap[ newrow+i ] = map->modifiermap[ row+i ];
+       newmap->modifiermap[ newrow+i ] = 0;
+       row += map->max_keypermod;
+       newrow += newmap->max_keypermod;
+    }
+    (void) XFreeModifiermap(map);
+    newrow = newmap->max_keypermod * modifier + newmap->max_keypermod - 1;
+    newmap->modifiermap[ newrow ] = keycode;
+    return(newmap);
+}
+
+XModifierKeymap *
+XDeleteModifiermapEntry(XModifierKeymap *map,
+#if NeedWidePrototypes
+                       unsigned int keycode,
+#else
+                       KeyCode keycode,
+#endif
+                       int modifier)
+{
+    int i,
+       row = modifier * map->max_keypermod;
+
+    for (i=0; i<map->max_keypermod; i++) {
+        if (map->modifiermap[ row+i ] == keycode)
+            map->modifiermap[ row+i ] = 0;
+    }
+    /* should we shrink the map?? */
+    return (map);
+}
diff --git a/src/MoveWin.c b/src/MoveWin.c
new file mode 100644 (file)
index 0000000..3cd75e1
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XMoveWindow (
+    register Display *dpy,
+    Window w,
+    int x,
+    int y)
+{
+    register xConfigureWindowReq *req;
+
+    LockDisplay(dpy);
+    GetReqExtra(ConfigureWindow, 8, req);
+
+    req->window = w;
+    req->mask = CWX | CWY;
+
+#ifdef MUSTCOPY
+    {
+       long lx = (long) x, ly = (long) y;
+       dpy->bufptr -= 8;
+       Data32 (dpy, (long *) &lx, 4);  /* order dictated by CWX and CWY */
+       Data32 (dpy, (long *) &ly, 4);
+    }
+#else
+    {
+       CARD32 *valuePtr = (CARD32 *) NEXTPTR(req,xConfigureWindowReq);
+       *valuePtr++ = x;
+       *valuePtr = y;
+    }
+#endif /* MUSTCOPY */
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/NextEvent.c b/src/NextEvent.c
new file mode 100644 (file)
index 0000000..69b979b
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+/*
+ * Return next event in queue, or if none, flush output and wait for
+ * events.
+ */
+
+int
+XNextEvent (
+       register Display *dpy,
+       register XEvent *event)
+{
+       register _XQEvent *qelt;
+
+       LockDisplay(dpy);
+
+       /* Delete unclaimed cookies */
+       _XFreeEventCookies(dpy);
+
+       if (dpy->head == NULL)
+           _XReadEvents(dpy);
+       qelt = dpy->head;
+       *event = qelt->event;
+       _XDeq(dpy, NULL, qelt);
+       _XStoreEventCookie(dpy, event);
+       UnlockDisplay(dpy);
+       return 0;
+}
+
diff --git a/src/OCWrap.c b/src/OCWrap.c
new file mode 100644 (file)
index 0000000..fe23a34
--- /dev/null
@@ -0,0 +1,140 @@
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * 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 TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA 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.
+ *
+ * Author: Katsuhisa Yano      TOSHIBA Corp.
+ *                             mopi@osa.ilab.toshiba.co.jp
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xlcint.h"
+
+XOC
+XCreateOC(XOM om, ...)
+{
+    va_list var;
+    XlcArgList args;
+    XOC oc;
+    int num_args;
+
+    va_start(var, om);
+    _XlcCountVaList(var, &num_args);
+    va_end(var);
+
+    va_start(var, om);
+    _XlcVaToArgList(var, num_args, &args);
+    va_end(var);
+
+    if (args == (XlcArgList) NULL)
+       return (XOC) NULL;
+
+    oc = (*om->methods->create_oc)(om, args, num_args);
+
+    Xfree(args);
+
+    if (oc) {
+       oc->core.next = om->core.oc_list;
+       om->core.oc_list = oc;
+    }
+
+    return oc;
+}
+
+void
+XDestroyOC(XOC oc)
+{
+    XOC prev, oc_list;
+
+    prev = oc_list = oc->core.om->core.oc_list;
+    if (oc_list == oc)
+       oc->core.om->core.oc_list = oc_list->core.next;
+    else {
+       while ((oc_list = oc_list->core.next)) {
+           if (oc_list == oc) {
+               prev->core.next = oc_list->core.next;
+               break;
+           }
+           prev = oc_list;
+       }
+    }
+
+    (*oc->methods->destroy)(oc);
+}
+
+XOM
+XOMOfOC(XOC oc)
+{
+    return oc->core.om;
+}
+
+char *
+XSetOCValues(XOC oc, ...)
+{
+    va_list var;
+    XlcArgList args;
+    char *ret;
+    int num_args;
+
+    va_start(var, oc);
+    _XlcCountVaList(var, &num_args);
+    va_end(var);
+
+    va_start(var, oc);
+    _XlcVaToArgList(var, num_args, &args);
+    va_end(var);
+
+    if (args == (XlcArgList) NULL)
+       return (char *) NULL;
+
+    ret = (*oc->methods->set_values)(oc, args, num_args);
+
+    Xfree(args);
+
+    return ret;
+}
+
+char *
+XGetOCValues(XOC oc, ...)
+{
+    va_list var;
+    XlcArgList args;
+    char *ret;
+    int num_args;
+
+    va_start(var, oc);
+    _XlcCountVaList(var, &num_args);
+    va_end(var);
+
+    va_start(var, oc);
+    _XlcVaToArgList(var, num_args, &args);
+    va_end(var);
+
+    if (args == (XlcArgList) NULL)
+       return (char *) NULL;
+
+    ret = (*oc->methods->get_values)(oc, args, num_args);
+
+    Xfree(args);
+
+    return ret;
+}
diff --git a/src/OMWrap.c b/src/OMWrap.c
new file mode 100644 (file)
index 0000000..045ca16
--- /dev/null
@@ -0,0 +1,129 @@
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * 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 TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA 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.
+ *
+ * Author: Katsuhisa Yano      TOSHIBA Corp.
+ *                             mopi@osa.ilab.toshiba.co.jp
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xlcint.h"
+
+XOM
+XOpenOM(Display *dpy, XrmDatabase rdb, _Xconst char *res_name,
+       _Xconst char *res_class)
+{
+    XLCd lcd = _XOpenLC((char *) NULL);
+
+    if (lcd == NULL)
+       return (XOM) NULL;
+
+    if (lcd->methods->open_om)
+       return (*lcd->methods->open_om)(lcd, dpy, rdb, res_name, res_class);
+
+    return (XOM) NULL;
+}
+
+Status
+XCloseOM(XOM om)
+{
+    XOC oc, next;
+    XLCd lcd = om->core.lcd;
+
+    next = om->core.oc_list;
+
+    while ((oc = next)) {
+       next = oc->core.next;
+       (*oc->methods->destroy)(oc);
+    }
+
+    om->core.oc_list = NULL;
+
+    _XCloseLC(lcd);
+
+    return (*om->methods->close)(om);
+}
+
+char *
+XSetOMValues(XOM om, ...)
+{
+    va_list var;
+    XlcArgList args;
+    char *ret;
+    int num_args;
+
+    va_start(var, om);
+    _XlcCountVaList(var, &num_args);
+    va_end(var);
+
+    va_start(var, om);
+    _XlcVaToArgList(var, num_args, &args);
+    va_end(var);
+
+    if (args == (XlcArgList) NULL)
+       return (char *) NULL;
+
+    ret = (*om->methods->set_values)(om, args, num_args);
+
+    Xfree(args);
+
+    return ret;
+}
+
+char *
+XGetOMValues(XOM om, ...)
+{
+    va_list var;
+    XlcArgList args;
+    char *ret;
+    int num_args;
+
+    va_start(var, om);
+    _XlcCountVaList(var, &num_args);
+    va_end(var);
+
+    va_start(var, om);
+    _XlcVaToArgList(var, num_args, &args);
+    va_end(var);
+
+    if (args == (XlcArgList) NULL)
+       return (char *) NULL;
+
+    ret = (*om->methods->get_values)(om, args, num_args);
+
+    Xfree(args);
+
+    return ret;
+}
+
+Display *
+XDisplayOfOM(XOM om)
+{
+    return om->core.display;
+}
+
+char *
+XLocaleOfOM(XOM om)
+{
+    return om->core.lcd->core->name;
+}
diff --git a/src/OpenDis.c b/src/OpenDis.c
new file mode 100644 (file)
index 0000000..9379fec
--- /dev/null
@@ -0,0 +1,720 @@
+/*
+
+Copyright 1985, 1986, 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 "Xlibint.h"
+#include "Xxcbint.h"
+#include <X11/Xatom.h>
+#include <X11/Xresource.h>
+#include <stdio.h>
+#include "Xintconn.h"
+
+#ifdef XKB
+#include "XKBlib.h"
+#endif /* XKB */
+
+#ifdef XTHREADS
+#include "locking.h"
+int  (*_XInitDisplayLock_fn)(Display *dpy) = NULL;
+void (*_XFreeDisplayLock_fn)(Display *dpy) = NULL;
+
+#define InitDisplayLock(d)     (_XInitDisplayLock_fn ? (*_XInitDisplayLock_fn)(d) : Success)
+#define FreeDisplayLock(d)     if (_XFreeDisplayLock_fn) (*_XFreeDisplayLock_fn)(d)
+#else
+#define InitDisplayLock(dis) Success
+#define FreeDisplayLock(dis)
+#endif /* XTHREADS */
+
+static xReq _dummy_request = {
+       0, 0, 0
+};
+
+static void OutOfMemory(Display *dpy);
+
+/*
+ * Connects to a server, creates a Display object and returns a pointer to
+ * the newly created Display back to the caller.
+ */
+Display *
+XOpenDisplay (
+       register _Xconst char *display)
+{
+       register Display *dpy;          /* New Display object being created. */
+       register int i;
+       int j, k;                       /* random iterator indexes */
+       char *display_name;             /* pointer to display name */
+       char *setup = NULL;             /* memory allocated at startup */
+       int iscreen;                    /* screen number */
+       xConnSetupPrefix prefix;        /* prefix information */
+       int vendorlen;                  /* length of vendor string */
+       union {
+               xConnSetup *setup;
+               char *failure;
+               char *vendor;
+               xPixmapFormat *sf;
+               xWindowRoot *rp;
+               xDepth *dp;
+               xVisualType *vp;
+       } u;                            /* proto data returned from server */
+       long setuplength;       /* number of bytes in setup message */
+       long usedbytes = 0;     /* number of bytes we have processed */
+       unsigned long mask;
+       long int conn_buf_size;
+       char *xlib_buffer_size;
+
+       /*
+        * If the display specifier string supplied as an argument to this
+        * routine is NULL or a pointer to NULL, read the DISPLAY variable.
+        */
+       if (display == NULL || *display == '\0') {
+               if ((display_name = getenv("DISPLAY")) == NULL) {
+                       /* Oops! No DISPLAY environment variable - error. */
+                       return(NULL);
+               }
+       }
+       else {
+               /* Display is non-NULL, copy the pointer */
+               display_name = (char *)display;
+       }
+
+/*
+ * Set the default error handlers.  This allows the global variables to
+ * default to NULL for use with shared libraries.
+ */
+       if (_XErrorFunction == NULL) (void) XSetErrorHandler (NULL);
+       if (_XIOErrorFunction == NULL) (void) XSetIOErrorHandler (NULL);
+
+/*
+ * Attempt to allocate a display structure. Return NULL if allocation fails.
+ */
+       if ((dpy = (Display *)Xcalloc(1, sizeof(Display))) == NULL) {
+               return(NULL);
+       }
+
+       if ((dpy->display_name = strdup(display_name)) == NULL) {
+               OutOfMemory(dpy);
+               return(NULL);
+       }
+
+/*
+ * Call the Connect routine to get the transport connection object.
+ * If NULL is returned, the connection failed.
+ */
+
+       if(!_XConnectXCB(dpy, display, &iscreen)) {
+               OutOfMemory(dpy);
+               return NULL;
+       }
+
+       /* Initialize as much of the display structure as we can.
+        * Initialize pointers to NULL so that XFreeDisplayStructure will
+        * work if we run out of memory before we finish initializing.
+        */
+       dpy->keysyms            = (KeySym *) NULL;
+       dpy->modifiermap        = NULL;
+       dpy->lock_meaning       = NoSymbol;
+       dpy->keysyms_per_keycode = 0;
+       dpy->xdefaults          = (char *)NULL;
+       dpy->scratch_length     = 0L;
+       dpy->scratch_buffer     = NULL;
+       dpy->key_bindings       = NULL;
+       dpy->ext_procs          = (_XExtension *)NULL;
+       dpy->ext_data           = (XExtData *)NULL;
+       dpy->ext_number         = 0;
+       dpy->event_vec[X_Error] = _XUnknownWireEvent;
+       dpy->event_vec[X_Reply] = _XUnknownWireEvent;
+       dpy->wire_vec[X_Error]  = _XUnknownNativeEvent;
+       dpy->wire_vec[X_Reply]  = _XUnknownNativeEvent;
+       for (i = KeyPress; i < LASTEvent; i++) {
+           dpy->event_vec[i]   = _XWireToEvent;
+           dpy->wire_vec[i]    = NULL;
+       }
+       for (i = LASTEvent; i < 128; i++) {
+           dpy->event_vec[i]   = _XUnknownWireEvent;
+           dpy->wire_vec[i]    = _XUnknownNativeEvent;
+       }
+       dpy->resource_id        = 0;
+       dpy->db                 = (struct _XrmHashBucketRec *)NULL;
+       dpy->cursor_font        = None;
+       dpy->flags              = 0;
+       dpy->async_handlers     = NULL;
+       dpy->screens            = NULL;
+       dpy->vendor             = NULL;
+       dpy->buffer             = NULL;
+       dpy->atoms              = NULL;
+       dpy->error_vec          = NULL;
+       dpy->context_db         = NULL;
+       dpy->free_funcs         = NULL;
+       dpy->pixmap_format      = NULL;
+       dpy->cms.clientCmaps    = NULL;
+       dpy->cms.defaultCCCs    = NULL;
+       dpy->cms.perVisualIntensityMaps = NULL;
+       dpy->im_filters         = NULL;
+       dpy->bigreq_size        = 0;
+       dpy->lock               = NULL;
+       dpy->lock_fns           = NULL;
+       dpy->qfree              = NULL;
+       dpy->next_event_serial_num = 1;
+       dpy->im_fd_info         = NULL;
+       dpy->im_fd_length       = 0;
+       dpy->conn_watchers      = NULL;
+       dpy->watcher_count      = 0;
+       dpy->filedes            = NULL;
+       dpy->flushes            = NULL;
+       dpy->xcmisc_opcode      = 0;
+       dpy->xkb_info           = NULL;
+
+/*
+ * Setup other information in this display structure.
+ */
+       dpy->vnumber = X_PROTOCOL;
+       dpy->resource_alloc = _XAllocID;
+       dpy->idlist_alloc = _XAllocIDs;
+       dpy->synchandler = NULL;
+       dpy->savedsynchandler = NULL;
+       dpy->request = 0;
+       dpy->last_request_read = 0;
+       dpy->default_screen = iscreen;  /* Value returned by ConnectDisplay */
+       dpy->last_req = (char *)&_dummy_request;
+
+       /* Initialize the display lock */
+       if (InitDisplayLock(dpy) != 0) {
+               OutOfMemory (dpy);
+               return(NULL);
+       }
+
+       if (!_XPollfdCacheInit(dpy)) {
+               OutOfMemory (dpy);
+               return(NULL);
+       }
+
+       /* Set up the output buffers. */
+#ifndef XLIBDEFAULTBUFSIZE
+#define XLIBDEFAULTBUFSIZE 16384 /* 16k */
+#endif
+#ifndef XLIBMINBUFSIZE
+#define XLIBMINBUFSIZE BUFSIZE /* old default buffer size */
+#endif
+       xlib_buffer_size = getenv("XLIBBUFFERSIZE");
+
+#ifdef __sun /* Backwards compatibility for old Solaris libX11 name */
+       if (xlib_buffer_size == NULL)
+           xlib_buffer_size = getenv("XSUNBUFFERSIZE");
+#endif
+
+       if (xlib_buffer_size == NULL)
+           conn_buf_size = XLIBDEFAULTBUFSIZE;
+       else
+           conn_buf_size = 1024 * strtol(xlib_buffer_size, NULL, 10);
+       if (conn_buf_size < XLIBMINBUFSIZE)
+           conn_buf_size = XLIBMINBUFSIZE;
+
+       if ((dpy->bufptr = dpy->buffer = Xcalloc(1, conn_buf_size)) == NULL) {
+           OutOfMemory (dpy);
+           return(NULL);
+       }
+       dpy->xcb->real_bufmax = dpy->buffer + conn_buf_size;
+       dpy->bufmax = dpy->buffer;
+
+       /* Set up the input event queue and input event queue parameters. */
+       dpy->head = dpy->tail = NULL;
+       dpy->qlen = 0;
+
+       /* Set up free-function record */
+       if ((dpy->free_funcs = (_XFreeFuncRec *)Xcalloc(1,
+                                                       sizeof(_XFreeFuncRec)))
+           == NULL) {
+           OutOfMemory (dpy);
+           return(NULL);
+       }
+
+       {
+               const struct xcb_setup_t *xcbsetup = xcb_get_setup(dpy->xcb->connection);
+               memcpy(&prefix, xcbsetup, sizeof(prefix));
+               setuplength = prefix.length << 2;
+               setup = (char *) xcbsetup;
+               setup += SIZEOF(xConnSetupPrefix);
+               u.setup = (xConnSetup *) setup;
+       }
+
+/*
+ * Check if the reply was long enough to get any information out of it.
+ */
+       usedbytes = sz_xConnSetup;
+       if (setuplength < usedbytes ) {
+           fprintf (stderr, "Xlib: Broken initial reply: Too short (%ld)\n", setuplength);
+           OutOfMemory(dpy);
+           return (NULL);
+       }
+
+/*
+ * We succeeded at authorization, so let us move the data into
+ * the display structure.
+ */
+       dpy->proto_major_version= prefix.majorVersion;
+       dpy->proto_minor_version= prefix.minorVersion;
+       dpy->release            = u.setup->release;
+       dpy->resource_base      = u.setup->ridBase;
+       dpy->resource_mask      = u.setup->ridMask;
+       dpy->min_keycode        = u.setup->minKeyCode;
+       dpy->max_keycode        = u.setup->maxKeyCode;
+       dpy->motion_buffer      = u.setup->motionBufferSize;
+       dpy->nformats           = u.setup->numFormats;
+       dpy->nscreens           = u.setup->numRoots;
+       dpy->byte_order         = u.setup->imageByteOrder;
+       dpy->bitmap_unit        = u.setup->bitmapScanlineUnit;
+       dpy->bitmap_pad         = u.setup->bitmapScanlinePad;
+       dpy->bitmap_bit_order   = u.setup->bitmapBitOrder;
+       dpy->max_request_size   = u.setup->maxRequestSize;
+       mask = dpy->resource_mask;
+       dpy->resource_shift     = 0;
+       if (!mask)
+       {
+           fprintf (stderr, "Xlib: connection to \"%s\" invalid setup\n",
+                    dpy->display_name);
+           OutOfMemory(dpy);
+           return (NULL);
+       }
+
+       while (!(mask & 1)) {
+           dpy->resource_shift++;
+           mask = mask >> 1;
+       }
+       dpy->resource_max = (dpy->resource_mask >> dpy->resource_shift) - 5;
+/*
+ * now extract the vendor string...  String must be null terminated,
+ * padded to multiple of 4 bytes.
+ */
+       /* Check for a sane vendor string length */
+       if (u.setup->nbytesVendor > 256) {
+           OutOfMemory(dpy);
+           return (NULL);
+       }
+
+       dpy->vendor = (char *) Xmalloc((unsigned) (u.setup->nbytesVendor + 1));
+       if (dpy->vendor == NULL) {
+           OutOfMemory(dpy);
+           return (NULL);
+       }
+       vendorlen = u.setup->nbytesVendor;
+
+/*
+ * validate setup length
+ */
+       usedbytes += (vendorlen + 3) & ~3;
+       if (setuplength < usedbytes) {
+           fprintf (stderr, "Xlib: Broken initial reply: Too short (%ld)\n", setuplength);
+           OutOfMemory(dpy);
+           return (NULL);
+       }
+
+       u.setup = (xConnSetup *) (((char *) u.setup) + sz_xConnSetup);
+       (void) strncpy(dpy->vendor, u.vendor, vendorlen);
+       dpy->vendor[vendorlen] = '\0';
+       vendorlen = (vendorlen + 3) & ~3;       /* round up */
+       u.vendor += vendorlen;
+
+/*
+ * Now iterate down setup information.....
+ */
+       dpy->pixmap_format =
+           (ScreenFormat *)Xmalloc(
+               (unsigned) (dpy->nformats *sizeof(ScreenFormat)));
+       if (dpy->pixmap_format == NULL) {
+               OutOfMemory (dpy);
+               return(NULL);
+       }
+/*
+ * First decode the Z axis Screen format information.
+ */
+       usedbytes += dpy->nformats * sz_xPixmapFormat;
+
+       if (setuplength < usedbytes) {
+           fprintf (stderr, "Xlib: Broken initial reply: Too short (%ld)\n", setuplength);
+           OutOfMemory (dpy);
+           return(NULL);
+       }
+
+       for (i = 0; i < dpy->nformats; i++) {
+           register ScreenFormat *fmt = &dpy->pixmap_format[i];
+           fmt->depth = u.sf->depth;
+           fmt->bits_per_pixel = u.sf->bitsPerPixel;
+           fmt->scanline_pad = u.sf->scanLinePad;
+           fmt->ext_data = NULL;
+           u.sf = (xPixmapFormat *) (((char *) u.sf) + sz_xPixmapFormat);
+       }
+
+/*
+ * next the Screen structures.
+ */
+       dpy->screens =
+           (Screen *)Xmalloc((unsigned) dpy->nscreens*sizeof(Screen));
+       if (dpy->screens == NULL) {
+               OutOfMemory (dpy);
+               return(NULL);
+       }
+
+/*
+ * Now go deal with each screen structure.
+ */
+       for (i = 0; i < dpy->nscreens; i++) {
+           register Screen *sp = &dpy->screens[i];
+           VisualID root_visualID;
+
+           usedbytes += sz_xWindowRoot;
+           if (setuplength < usedbytes) {
+               fprintf (stderr, "Xlib: Broken initial reply: Too short (%ld)\n", setuplength);
+               OutOfMemory (dpy);
+               return(NULL);
+           }
+
+           root_visualID = u.rp->rootVisualID;
+           sp->display     = dpy;
+           sp->root        = u.rp->windowId;
+           sp->cmap        = u.rp->defaultColormap;
+           sp->white_pixel = u.rp->whitePixel;
+           sp->black_pixel = u.rp->blackPixel;
+           sp->root_input_mask = u.rp->currentInputMask;
+           sp->width       = u.rp->pixWidth;
+           sp->height      = u.rp->pixHeight;
+           sp->mwidth      = u.rp->mmWidth;
+           sp->mheight     = u.rp->mmHeight;
+           sp->min_maps    = u.rp->minInstalledMaps;
+           sp->max_maps    = u.rp->maxInstalledMaps;
+           sp->backing_store= u.rp->backingStore;
+           sp->save_unders = u.rp->saveUnders;
+           sp->root_depth  = u.rp->rootDepth;
+           sp->ndepths     = u.rp->nDepths;
+           sp->ext_data   = NULL;
+           u.rp = (xWindowRoot *) (((char *) u.rp) + sz_xWindowRoot);
+/*
+ * lets set up the depth structures.
+ */
+           sp->depths = (Depth *)Xmalloc(
+                       (unsigned)sp->ndepths*sizeof(Depth));
+           if (sp->depths == NULL) {
+               OutOfMemory (dpy);
+               return(NULL);
+           }
+           /*
+            * for all depths on this screen.
+            */
+           for (j = 0; j < sp->ndepths; j++) {
+               Depth *dp = &sp->depths[j];
+
+               usedbytes += sz_xDepth;
+               if (setuplength < usedbytes) {
+                   fprintf (stderr, "Xlib: Broken initial reply: Too short (%ld)\n", setuplength);
+                   OutOfMemory (dpy);
+                   return(NULL);
+               }
+
+               dp->depth = u.dp->depth;
+               dp->nvisuals = u.dp->nVisuals;
+               u.dp = (xDepth *) (((char *) u.dp) + sz_xDepth);
+               if (dp->nvisuals > 0) {
+                   dp->visuals =
+                     (Visual *)Xmalloc((unsigned)dp->nvisuals*sizeof(Visual));
+                   if (dp->visuals == NULL) {
+                       OutOfMemory (dpy);
+                       return(NULL);
+                   }
+                   for (k = 0; k < dp->nvisuals; k++) {
+                       register Visual *vp = &dp->visuals[k];
+
+                       usedbytes += sz_xVisualType;
+                       if (setuplength < usedbytes) {
+                           fprintf (stderr, "Xlib: Broken initial reply: Too short (%ld)\n", setuplength);
+                           OutOfMemory (dpy);
+                           return(NULL);
+                       }
+
+                       vp->visualid    = u.vp->visualID;
+                       vp->class       = u.vp->class;
+                       vp->bits_per_rgb= u.vp->bitsPerRGB;
+                       vp->map_entries = u.vp->colormapEntries;
+                       vp->red_mask    = u.vp->redMask;
+                       vp->green_mask  = u.vp->greenMask;
+                       vp->blue_mask   = u.vp->blueMask;
+                       vp->ext_data    = NULL;
+                       u.vp = (xVisualType *) (((char *) u.vp) +
+                                               sz_xVisualType);
+                   }
+                   if (dp->depth == 32 && getenv ("XLIB_SKIP_ARGB_VISUALS"))
+                   {
+                       Xfree (dp->visuals);
+                       dp->visuals = NULL;
+                       dp->nvisuals = 0;
+                   }
+               } else {
+                   dp->visuals = (Visual *) NULL;
+               }
+           }
+           sp->root_visual = _XVIDtoVisual(dpy, root_visualID);
+       }
+
+       if(usedbytes != setuplength){
+           /* Sanity check, shouldn't happen. */
+           fprintf(stderr, "Xlib: Did not parse entire setup message: "
+                           "parsed: %ld, message: %ld\n",
+                   usedbytes, setuplength);
+           OutOfMemory(dpy);
+           return(NULL);
+       }
+
+/*
+ * Now start talking to the server to setup all other information...
+ */
+
+/*
+ * Make sure default screen is legal.
+ */
+       if (iscreen >= dpy->nscreens) {
+           OutOfMemory(dpy);
+           return(NULL);
+       }
+
+       dpy->bigreq_size = xcb_get_maximum_request_length(dpy->xcb->connection);
+       if(dpy->bigreq_size <= dpy->max_request_size)
+               dpy->bigreq_size = 0;
+
+/*
+ * Set up other stuff clients are always going to use.
+ */
+       for (i = 0; i < dpy->nscreens; i++) {
+           register Screen *sp = &dpy->screens[i];
+           XGCValues values;
+           values.foreground = sp->black_pixel;
+           values.background = sp->white_pixel;
+           if ((sp->default_gc = XCreateGC (dpy, sp->root,
+                                            GCForeground|GCBackground,
+                                            &values)) == NULL) {
+               OutOfMemory(dpy);
+               return (NULL);
+           }
+       }
+/*
+ * call into synchronization routine so that all programs can be
+ * forced synchronous
+ */
+       (void) XSynchronize(dpy, _Xdebug);
+
+/*
+ * get availability of large requests, and
+ * get the resource manager database off the root window.
+ */
+       LockDisplay(dpy);
+       {
+           xGetPropertyReply reply;
+           xGetPropertyReq *req;
+
+           GetReq (GetProperty, req);
+           req->window = RootWindow(dpy, 0);
+           req->property = XA_RESOURCE_MANAGER;
+           req->type = XA_STRING;
+           req->delete = False;
+           req->longOffset = 0;
+           req->longLength = 100000000L;
+
+           if (_XReply (dpy, (xReply *) &reply, 0, xFalse)) {
+               if (reply.format == 8 && reply.propertyType == XA_STRING &&
+                   (reply.nItems + 1 > 0) &&
+                   (reply.nItems <= req->longLength * 4) &&
+                   (dpy->xdefaults = Xmalloc (reply.nItems + 1))) {
+                   _XReadPad (dpy, dpy->xdefaults, reply.nItems);
+                   dpy->xdefaults[reply.nItems] = '\0';
+               }
+               else if (reply.propertyType != None)
+                   _XEatData(dpy, reply.nItems * (reply.format >> 3));
+           }
+       }
+       UnlockDisplay(dpy);
+
+#ifdef MOTIFBC
+       {
+           extern Display *_XHeadOfDisplayList;
+           _XHeadOfDisplayList = dpy;
+       }
+#endif
+#ifdef XKB
+       XkbUseExtension(dpy,NULL,NULL);
+#endif
+/*
+ * and return successfully
+ */
+       return(dpy);
+}
+
+/* XFreeDisplayStructure frees all the storage associated with a
+ * Display.  It is used by XOpenDisplay if it runs out of memory,
+ * and also by XCloseDisplay.   It needs to check whether all pointers
+ * are non-NULL before dereferencing them, since it may be called
+ * by XOpenDisplay before the Display structure is fully formed.
+ * XOpenDisplay must be sure to initialize all the pointers to NULL
+ * before the first possible call on this.
+ */
+
+void _XFreeDisplayStructure(Display *dpy)
+{
+       /* move all cookies in the EQ to the jar, then free them. */
+       if (dpy->qfree) {
+           _XQEvent *qelt = dpy->qfree;
+           while (qelt) {
+               if (_XIsEventCookie(dpy, &qelt->event))
+                   _XStoreEventCookie(dpy, &qelt->event);
+               qelt = qelt->next;
+           }
+        }
+       if (dpy->cookiejar)
+           _XFreeEventCookies(dpy);
+       while (dpy->ext_procs) {
+           _XExtension *ext = dpy->ext_procs;
+           dpy->ext_procs = ext->next;
+           if (ext->name)
+               Xfree (ext->name);
+           Xfree ((char *)ext);
+       }
+       if (dpy->im_filters)
+          (*dpy->free_funcs->im_filters)(dpy);
+       if (dpy->cms.clientCmaps)
+          (*dpy->free_funcs->clientCmaps)(dpy);
+       if (dpy->cms.defaultCCCs)
+          (*dpy->free_funcs->defaultCCCs)(dpy);
+       if (dpy->cms.perVisualIntensityMaps)
+          (*dpy->free_funcs->intensityMaps)(dpy);
+       if (dpy->atoms)
+           (*dpy->free_funcs->atoms)(dpy);
+       if (dpy->modifiermap)
+          (*dpy->free_funcs->modifiermap)(dpy->modifiermap);
+       if (dpy->key_bindings)
+          (*dpy->free_funcs->key_bindings)(dpy);
+       if (dpy->context_db)
+          (*dpy->free_funcs->context_db)(dpy);
+       if (dpy->xkb_info)
+          (*dpy->free_funcs->xkb)(dpy);
+
+       /* if RM database was allocated by XGetDefault() free it */
+       if (dpy->db && (dpy->flags & XlibDisplayDfltRMDB))
+           XrmDestroyDatabase(dpy->db);
+
+       if (dpy->screens) {
+           register int i;
+
+            for (i = 0; i < dpy->nscreens; i++) {
+               Screen *sp = &dpy->screens[i];
+
+               if (sp->depths) {
+                  register int j;
+
+                  for (j = 0; j < sp->ndepths; j++) {
+                       Depth *dp = &sp->depths[j];
+
+                       if (dp->visuals) {
+                          register int k;
+
+                          for (k = 0; k < dp->nvisuals; k++)
+                            _XFreeExtData (dp->visuals[k].ext_data);
+                          Xfree ((char *) dp->visuals);
+                          }
+                       }
+
+                  Xfree ((char *) sp->depths);
+                  }
+
+               _XFreeExtData (sp->ext_data);
+               }
+
+           Xfree ((char *)dpy->screens);
+           }
+
+       if (dpy->pixmap_format) {
+           register int i;
+
+           for (i = 0; i < dpy->nformats; i++)
+             _XFreeExtData (dpy->pixmap_format[i].ext_data);
+            Xfree ((char *)dpy->pixmap_format);
+           }
+
+       free(dpy->display_name);
+       if (dpy->vendor)
+          Xfree (dpy->vendor);
+
+        if (dpy->buffer)
+          Xfree (dpy->buffer);
+       if (dpy->keysyms)
+          Xfree ((char *) dpy->keysyms);
+       if (dpy->xdefaults)
+          Xfree (dpy->xdefaults);
+       if (dpy->error_vec)
+           Xfree ((char *)dpy->error_vec);
+
+       _XFreeExtData (dpy->ext_data);
+       if (dpy->free_funcs)
+           Xfree ((char *)dpy->free_funcs);
+       if (dpy->scratch_buffer)
+           Xfree (dpy->scratch_buffer);
+       FreeDisplayLock(dpy);
+
+       if (dpy->qfree) {
+           register _XQEvent *qelt = dpy->qfree;
+
+           while (qelt) {
+               register _XQEvent *qnxt = qelt->next;
+               Xfree ((char *) qelt);
+               qelt = qnxt;
+           }
+       }
+       while (dpy->im_fd_info) {
+           struct _XConnectionInfo *conni = dpy->im_fd_info;
+           dpy->im_fd_info = conni->next;
+           if (conni->watch_data)
+               Xfree (conni->watch_data);
+           Xfree (conni);
+       }
+       if (dpy->conn_watchers) {
+           struct _XConnWatchInfo *watcher = dpy->conn_watchers;
+           dpy->conn_watchers = watcher->next;
+           Xfree (watcher);
+       }
+       if (dpy->filedes)
+           Xfree (dpy->filedes);
+
+       _XFreeX11XCBStructure(dpy);
+
+       Xfree ((char *)dpy);
+}
+
+/* OutOfMemory is called if malloc fails.  XOpenDisplay returns NULL
+   after this returns. */
+
+static void OutOfMemory(Display *dpy)
+{
+    if(dpy->xcb->connection)
+       xcb_disconnect(dpy->xcb->connection);
+    _XFreeDisplayStructure (dpy);
+}
diff --git a/src/ParseCmd.c b/src/ParseCmd.c
new file mode 100644 (file)
index 0000000..6771908
--- /dev/null
@@ -0,0 +1,225 @@
+
+/***********************************************************
+
+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.
+
+******************************************************************/
+
+/* XrmParseCommand()
+
+   Parse command line and store argument values into resource database
+
+   Allows any un-ambiguous abbreviation for an option name, but requires
+   that the table be ordered with any options that are prefixes of
+   other options appearing before the longer version in the table.
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include <X11/Xresource.h>
+#include <stdio.h>
+
+
+static void _XReportParseError(XrmOptionDescRec *arg, const char *msg)
+{
+    (void) fprintf(stderr, "Error parsing argument \"%s\" (%s); %s\n",
+                  arg->option, arg->specifier, msg);
+    exit(1);
+}
+
+void
+XrmParseCommand(
+    XrmDatabase                *pdb,           /* data base */
+    register XrmOptionDescList options, /* pointer to table of valid options */
+    int                        num_options,    /* number of options                 */
+    _Xconst char       *prefix,        /* name to prefix resources with     */
+    int                        *argc,          /* address of argument count         */
+    char               **argv)         /* argument list (command line)      */
+{
+    int                foundOption;
+    char               **argsave;
+    register int       i, myargc;
+    XrmBinding         bindings[100];
+    XrmQuark           quarks[100];
+    XrmBinding         *start_bindings;
+    XrmQuark           *start_quarks;
+    char               *optP, *argP = NULL, optchar, argchar = 0;
+    int                        matches;
+    enum {DontCare, Check, NotSorted, Sorted} table_is_sorted;
+    char               **argend;
+
+#define PutCommandResource(value_str)                          \
+    {                                                          \
+    XrmStringToBindingQuarkList(                               \
+       options[i].specifier, start_bindings, start_quarks);    \
+    XrmQPutStringResource(pdb, bindings, quarks, value_str);    \
+    } /* PutCommandResource */
+
+    myargc = (*argc);
+    argend = argv + myargc;
+    argsave = ++argv;
+
+    /* Initialize bindings/quark list with prefix (typically app name). */
+    quarks[0] = XrmStringToName(prefix);
+    bindings[0] = XrmBindTightly;
+    start_quarks = quarks+1;
+    start_bindings = bindings+1;
+
+    table_is_sorted = (myargc > 2) ? Check : DontCare;
+    for (--myargc; myargc > 0; --myargc, ++argv) {
+       foundOption = False;
+       matches = 0;
+       for (i=0; i < num_options; ++i) {
+           /* checking the sort order first insures we don't have to
+              re-do the check if the arg hits on the last entry in
+              the table.  Useful because usually '=' is the last entry
+              and users frequently specify geometry early in the command */
+           if (table_is_sorted == Check && i > 0 &&
+               strcmp(options[i].option, options[i-1].option) < 0) {
+               table_is_sorted = NotSorted;
+           }
+           for (argP = *argv, optP = options[i].option;
+                (optchar = *optP++) &&
+                (argchar = *argP++) &&
+                argchar == optchar;);
+           if (!optchar) {
+               if (!*argP ||
+                   options[i].argKind == XrmoptionStickyArg ||
+                   options[i].argKind == XrmoptionIsArg) {
+                   /* give preference to exact matches, StickyArg and IsArg */
+                   matches = 1;
+                   foundOption = i;
+                   break;
+               }
+           }
+           else if (!argchar) {
+               /* may be an abbreviation for this option */
+               matches++;
+               foundOption = i;
+           }
+           else if (table_is_sorted == Sorted && optchar > argchar) {
+               break;
+           }
+           if (table_is_sorted == Check && i > 0 &&
+               strcmp(options[i].option, options[i-1].option) < 0) {
+               table_is_sorted = NotSorted;
+           }
+       }
+       if (table_is_sorted == Check && i >= (num_options-1))
+           table_is_sorted = Sorted;
+       if (matches == 1) {
+               i = foundOption;
+               switch (options[i].argKind){
+               case XrmoptionNoArg:
+                   --(*argc);
+                   PutCommandResource(options[i].value);
+                   break;
+
+               case XrmoptionIsArg:
+                   --(*argc);
+                   PutCommandResource(*argv);
+                   break;
+
+               case XrmoptionStickyArg:
+                   --(*argc);
+                   PutCommandResource(argP);
+                   break;
+
+               case XrmoptionSepArg:
+                   if (myargc > 1) {
+                       ++argv; --myargc; --(*argc); --(*argc);
+                       PutCommandResource(*argv);
+                   } else
+                       (*argsave++) = (*argv);
+                   break;
+
+               case XrmoptionResArg:
+                   if (myargc > 1) {
+                       ++argv; --myargc; --(*argc); --(*argc);
+                       XrmPutLineResource(pdb, *argv);
+                   } else
+                       (*argsave++) = (*argv);
+                   break;
+
+               case XrmoptionSkipArg:
+                   if (myargc > 1) {
+                       --myargc;
+                       (*argsave++) = (*argv++);
+                   }
+                   (*argsave++) = (*argv);
+                   break;
+
+               case XrmoptionSkipLine:
+                   for (; myargc > 0; myargc--)
+                       (*argsave++) = (*argv++);
+                   break;
+
+               case XrmoptionSkipNArgs:
+                   {
+                       register int j = 1 + (long) options[i].value;
+
+                       if (j > myargc) j = myargc;
+                       for (; j > 0; j--) {
+                           (*argsave++) = (*argv++);
+                           myargc--;
+                       }
+                       argv--;         /* went one too far before */
+                       myargc++;
+                   }
+                   break;
+
+               default:
+                   _XReportParseError (&options[i], "unknown kind");
+                   break;
+               }
+       }
+       else
+           (*argsave++) = (*argv);  /*compress arglist*/
+    }
+
+    if (argsave < argend)
+       (*argsave)=NULL; /* put NULL terminator on compressed argv */
+}
diff --git a/src/ParseCol.c b/src/ParseCol.c
new file mode 100644 (file)
index 0000000..e997b1b
--- /dev/null
@@ -0,0 +1,138 @@
+/*
+
+Copyright 1985, 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 <stdio.h>
+#include "Xlibint.h"
+#include "Xcmsint.h"
+
+
+Status
+XParseColor (
+       register Display *dpy,
+        Colormap cmap,
+       _Xconst char *spec,
+       XColor *def)
+{
+       register int n, i;
+       int r, g, b;
+       char c;
+       XcmsCCC ccc;
+       XcmsColor cmsColor;
+
+        if (!spec) return(0);
+       n = strlen (spec);
+       if (*spec == '#') {
+           /*
+            * RGB
+            */
+           spec++;
+           n--;
+           if (n != 3 && n != 6 && n != 9 && n != 12)
+               return (0);
+           n /= 3;
+           g = b = 0;
+           do {
+               r = g;
+               g = b;
+               b = 0;
+               for (i = n; --i >= 0; ) {
+                   c = *spec++;
+                   b <<= 4;
+                   if (c >= '0' && c <= '9')
+                       b |= c - '0';
+                   else if (c >= 'A' && c <= 'F')
+                       b |= c - ('A' - 10);
+                   else if (c >= 'a' && c <= 'f')
+                       b |= c - ('a' - 10);
+                   else return (0);
+               }
+           } while (*spec != '\0');
+           n <<= 2;
+           n = 16 - n;
+           def->red = r << n;
+           def->green = g << n;
+           def->blue = b << n;
+           def->flags = DoRed | DoGreen | DoBlue;
+           return (1);
+       }
+
+
+#ifdef XCMS
+       /*
+        * Let's Attempt to use Xcms and i18n approach to Parse Color
+        */
+       if ((ccc = XcmsCCCOfColormap(dpy, cmap)) != (XcmsCCC)NULL) {
+           const char *tmpName = spec;
+
+           switch (_XcmsResolveColorString(ccc, &tmpName, &cmsColor,
+                                           XcmsRGBFormat)) {
+           case XcmsSuccess:
+           case XcmsSuccessWithCompression:
+               cmsColor.pixel = def->pixel;
+               _XcmsRGB_to_XColor(&cmsColor, def, 1);
+               return(1);
+           case XcmsFailure:
+           case _XCMS_NEWNAME:
+               /*
+                * if the result was _XCMS_NEWNAME tmpName points to
+                * a string in cmsColNm.c:pairs table, for example,
+                * gray70 would become tekhvc:0.0/70.0/0.0
+                */
+               break;
+           }
+       }
+#endif
+
+       /*
+        * Xcms and i18n methods failed, so lets pass it to the server
+        * for parsing.
+        */
+       {
+           xLookupColorReply reply;
+           register xLookupColorReq *req;
+           LockDisplay(dpy);
+           GetReq (LookupColor, req);
+           req->cmap = cmap;
+           req->nbytes = n = strlen(spec);
+           req->length += (n + 3) >> 2;
+           Data (dpy, spec, (long)n);
+           if (!_XReply (dpy, (xReply *) &reply, 0, xTrue)) {
+               UnlockDisplay(dpy);
+               SyncHandle();
+               return (0);
+               }
+           def->red = reply.exactRed;
+           def->green = reply.exactGreen;
+           def->blue = reply.exactBlue;
+           def->flags = DoRed | DoGreen | DoBlue;
+           UnlockDisplay(dpy);
+           SyncHandle();
+           return (1);
+       }
+}
diff --git a/src/ParseGeom.c b/src/ParseGeom.c
new file mode 100644 (file)
index 0000000..dfd812f
--- /dev/null
@@ -0,0 +1,162 @@
+
+/*
+
+Copyright 1985, 1986, 1987,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 "Xlibint.h"
+#include "Xutil.h"
+
+/*
+ *    XParseGeometry parses strings of the form
+ *   "=<width>x<height>{+-}<xoffset>{+-}<yoffset>", where
+ *   width, height, xoffset, and yoffset are unsigned integers.
+ *   Example:  "=80x24+300-49"
+ *   The equal sign is optional.
+ *   It returns a bitmask that indicates which of the four values
+ *   were actually found in the string.  For each value found,
+ *   the corresponding argument is updated;  for each value
+ *   not found, the corresponding argument is left unchanged.
+ */
+
+static int
+ReadInteger(char *string, char **NextString)
+{
+    register int Result = 0;
+    int Sign = 1;
+
+    if (*string == '+')
+       string++;
+    else if (*string == '-')
+    {
+       string++;
+       Sign = -1;
+    }
+    for (; (*string >= '0') && (*string <= '9'); string++)
+    {
+       Result = (Result * 10) + (*string - '0');
+    }
+    *NextString = string;
+    if (Sign >= 0)
+       return (Result);
+    else
+       return (-Result);
+}
+
+int
+XParseGeometry (
+_Xconst char *string,
+int *x,
+int *y,
+unsigned int *width,    /* RETURN */
+unsigned int *height)    /* RETURN */
+{
+       int mask = NoValue;
+       register char *strind;
+       unsigned int tempWidth = 0, tempHeight = 0;
+       int tempX = 0, tempY = 0;
+       char *nextCharacter;
+
+       if ( (string == NULL) || (*string == '\0')) return(mask);
+       if (*string == '=')
+               string++;  /* ignore possible '=' at beg of geometry spec */
+
+       strind = (char *)string;
+       if (*strind != '+' && *strind != '-' && *strind != 'x') {
+               tempWidth = ReadInteger(strind, &nextCharacter);
+               if (strind == nextCharacter)
+                   return (0);
+               strind = nextCharacter;
+               mask |= WidthValue;
+       }
+
+       if (*strind == 'x' || *strind == 'X') {
+               strind++;
+               tempHeight = ReadInteger(strind, &nextCharacter);
+               if (strind == nextCharacter)
+                   return (0);
+               strind = nextCharacter;
+               mask |= HeightValue;
+       }
+
+       if ((*strind == '+') || (*strind == '-')) {
+               if (*strind == '-') {
+                       strind++;
+                       tempX = -ReadInteger(strind, &nextCharacter);
+                       if (strind == nextCharacter)
+                           return (0);
+                       strind = nextCharacter;
+                       mask |= XNegative;
+
+               }
+               else
+               {       strind++;
+                       tempX = ReadInteger(strind, &nextCharacter);
+                       if (strind == nextCharacter)
+                           return(0);
+                       strind = nextCharacter;
+               }
+               mask |= XValue;
+               if ((*strind == '+') || (*strind == '-')) {
+                       if (*strind == '-') {
+                               strind++;
+                               tempY = -ReadInteger(strind, &nextCharacter);
+                               if (strind == nextCharacter)
+                                   return(0);
+                               strind = nextCharacter;
+                               mask |= YNegative;
+
+                       }
+                       else
+                       {
+                               strind++;
+                               tempY = ReadInteger(strind, &nextCharacter);
+                               if (strind == nextCharacter)
+                                   return(0);
+                               strind = nextCharacter;
+                       }
+                       mask |= YValue;
+               }
+       }
+
+       /* If strind isn't at the end of the string the it's an invalid
+               geometry specification. */
+
+       if (*strind != '\0') return (0);
+
+       if (mask & XValue)
+           *x = tempX;
+       if (mask & YValue)
+           *y = tempY;
+       if (mask & WidthValue)
+            *width = tempWidth;
+       if (mask & HeightValue)
+            *height = tempHeight;
+       return (mask);
+}
diff --git a/src/PeekEvent.c b/src/PeekEvent.c
new file mode 100644 (file)
index 0000000..06546f0
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+/*
+ * Return the next event in the queue,
+ * BUT do not remove it from the queue.
+ * If none found, flush and wait until there is an event to peek.
+ */
+
+int
+XPeekEvent (
+       register Display *dpy,
+       register XEvent *event)
+{
+       XEvent copy;
+       LockDisplay(dpy);
+       if (dpy->head == NULL)
+           _XReadEvents(dpy);
+       *event = (dpy->head)->event;
+       if (_XCopyEventCookie(dpy, &event->xcookie, &copy.xcookie)) {
+           _XStoreEventCookie(dpy, &copy);
+           *event = copy;
+       }
+       UnlockDisplay(dpy);
+       return 1;
+}
+
diff --git a/src/PeekIfEv.c b/src/PeekIfEv.c
new file mode 100644 (file)
index 0000000..207cd11
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+/*
+ * return the next event in the queue that satisfies the predicate.
+ * BUT do not remove it from the queue.
+ * If none found, flush, and then wait until one satisfies the predicate.
+ */
+
+int
+XPeekIfEvent (
+       register Display *dpy,
+       register XEvent *event,
+       Bool (*predicate)(
+                         Display*                      /* display */,
+                         XEvent*                       /* event */,
+                         char*                         /* arg */
+                         ),
+       char *arg)
+{
+       register _XQEvent *prev, *qelt;
+       unsigned long qe_serial = 0;
+
+       LockDisplay(dpy);
+       prev = NULL;
+       while (1) {
+           for (qelt = prev ? prev->next : dpy->head;
+                qelt;
+                prev = qelt, qelt = qelt->next) {
+               if(qelt->qserial_num > qe_serial
+                  && (*predicate)(dpy, &qelt->event, arg)) {
+                   XEvent copy;
+                   *event = qelt->event;
+                   if (_XCopyEventCookie(dpy, &event->xcookie, &copy.xcookie)) {
+                       _XStoreEventCookie(dpy, &copy);
+                       *event = copy;
+                   }
+                   UnlockDisplay(dpy);
+                   return 0;
+               }
+           }
+           if (prev)
+               qe_serial = prev->qserial_num;
+           _XReadEvents(dpy);
+           if (prev && prev->qserial_num != qe_serial)
+               /* another thread has snatched this event */
+               prev = NULL;
+       }
+}
+
diff --git a/src/Pending.c b/src/Pending.c
new file mode 100644 (file)
index 0000000..eb97060
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+/* Read in pending events if needed and return the number of queued events. */
+
+int XEventsQueued (
+    register Display *dpy,
+    int mode)
+{
+    int ret_val;
+    LockDisplay(dpy);
+    if (dpy->qlen || (mode == QueuedAlready))
+       ret_val = dpy->qlen;
+    else
+       ret_val = _XEventsQueued (dpy, mode);
+    UnlockDisplay(dpy);
+    return ret_val;
+}
+
+int XPending (register Display *dpy)
+{
+    int ret_val;
+    LockDisplay(dpy);
+    if (dpy->qlen)
+       ret_val = dpy->qlen;
+    else
+       ret_val = _XEventsQueued (dpy, QueuedAfterFlush);
+    UnlockDisplay(dpy);
+    return ret_val;
+}
diff --git a/src/PixFormats.c b/src/PixFormats.c
new file mode 100644 (file)
index 0000000..8e4a100
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+
+Copyright 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 "Xlibint.h"
+#include <stdio.h>
+
+/*
+ * XListPixmapFormats - return info from connection setup
+ */
+
+XPixmapFormatValues *XListPixmapFormats (
+    Display *dpy,
+    int *count)        /* RETURN */
+{
+    XPixmapFormatValues *formats = (XPixmapFormatValues *)
+       Xmalloc((unsigned) (dpy->nformats * sizeof (XPixmapFormatValues)));
+
+    if (formats) {
+       register int i;
+       register XPixmapFormatValues *f;
+       register ScreenFormat *sf;
+
+       /*
+        * copy data from internal Xlib data structure in display
+        */
+       for (i = dpy->nformats, f = formats, sf = dpy->pixmap_format; i > 0;
+            i--, f++, sf++) {
+           f->depth = sf->depth;
+           f->bits_per_pixel = sf->bits_per_pixel;
+           f->scanline_pad = sf->scanline_pad;
+       }
+
+       *count = dpy->nformats;
+    }
+    return formats;
+}
diff --git a/src/PmapBgnd.c b/src/PmapBgnd.c
new file mode 100644 (file)
index 0000000..9c51558
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XSetWindowBackgroundPixmap(
+    register Display *dpy,
+    Window w,
+    Pixmap pixmap)
+{
+    register xChangeWindowAttributesReq *req;
+    LockDisplay (dpy);
+    GetReqExtra (ChangeWindowAttributes, 4, req);
+    req->window = w;
+    req->valueMask = CWBackPixmap;
+    OneDataCard32 (dpy, NEXTPTR(req,xChangeWindowAttributesReq), pixmap);
+    UnlockDisplay (dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/PmapBord.c b/src/PmapBord.c
new file mode 100644 (file)
index 0000000..7e1be61
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XSetWindowBorderPixmap(
+    register Display *dpy,
+    Window w,
+    Pixmap pixmap)
+{
+    register xChangeWindowAttributesReq *req;
+    LockDisplay(dpy);
+    GetReqExtra (ChangeWindowAttributes, 4, req);
+    req->window = w;
+    req->valueMask = CWBorderPixmap;
+    OneDataCard32 (dpy, NEXTPTR(req,xChangeWindowAttributesReq), pixmap);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/PolyReg.c b/src/PolyReg.c
new file mode 100644 (file)
index 0000000..74c8765
--- /dev/null
@@ -0,0 +1,638 @@
+/************************************************************************
+
+Copyright 1987, 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 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 LARGE_COORDINATE 1000000
+#define SMALL_COORDINATE -LARGE_COORDINATE
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xutil.h"
+#include <X11/Xregion.h>
+#include "poly.h"
+
+/*
+ *     InsertEdgeInET
+ *
+ *     Insert the given edge into the edge table.
+ *     First we must find the correct bucket in the
+ *     Edge table, then find the right slot in the
+ *     bucket.  Finally, we can insert it.
+ *
+ */
+static void
+InsertEdgeInET(
+    EdgeTable *ET,
+    EdgeTableEntry *ETE,
+    int scanline,
+    ScanLineListBlock **SLLBlock,
+    int *iSLLBlock)
+{
+    register EdgeTableEntry *start, *prev;
+    register ScanLineList *pSLL, *pPrevSLL;
+    ScanLineListBlock *tmpSLLBlock;
+
+    /*
+     * find the right bucket to put the edge into
+     */
+    pPrevSLL = &ET->scanlines;
+    pSLL = pPrevSLL->next;
+    while (pSLL && (pSLL->scanline < scanline))
+    {
+        pPrevSLL = pSLL;
+        pSLL = pSLL->next;
+    }
+
+    /*
+     * reassign pSLL (pointer to ScanLineList) if necessary
+     */
+    if ((!pSLL) || (pSLL->scanline > scanline))
+    {
+        if (*iSLLBlock > SLLSPERBLOCK-1)
+        {
+            tmpSLLBlock =
+                 (ScanLineListBlock *)Xmalloc(sizeof(ScanLineListBlock));
+            (*SLLBlock)->next = tmpSLLBlock;
+            tmpSLLBlock->next = (ScanLineListBlock *)NULL;
+            *SLLBlock = tmpSLLBlock;
+            *iSLLBlock = 0;
+        }
+        pSLL = &((*SLLBlock)->SLLs[(*iSLLBlock)++]);
+
+        pSLL->next = pPrevSLL->next;
+        pSLL->edgelist = (EdgeTableEntry *)NULL;
+        pPrevSLL->next = pSLL;
+    }
+    pSLL->scanline = scanline;
+
+    /*
+     * now insert the edge in the right bucket
+     */
+    prev = (EdgeTableEntry *)NULL;
+    start = pSLL->edgelist;
+    while (start && (start->bres.minor_axis < ETE->bres.minor_axis))
+    {
+        prev = start;
+        start = start->next;
+    }
+    ETE->next = start;
+
+    if (prev)
+        prev->next = ETE;
+    else
+        pSLL->edgelist = ETE;
+}
+\f
+/*
+ *     CreateEdgeTable
+ *
+ *     This routine creates the edge table for
+ *     scan converting polygons.
+ *     The Edge Table (ET) looks like:
+ *
+ *    EdgeTable
+ *     --------
+ *    |  ymax  |        ScanLineLists
+ *    |scanline|-->------------>-------------->...
+ *     --------   |scanline|   |scanline|
+ *                |edgelist|   |edgelist|
+ *                ---------    ---------
+ *                    |             |
+ *                    |             |
+ *                    V             V
+ *              list of ETEs   list of ETEs
+ *
+ *     where ETE is an EdgeTableEntry data structure,
+ *     and there is one ScanLineList per scanline at
+ *     which an edge is initially entered.
+ *
+ */
+
+static void
+CreateETandAET(
+    register int count,
+    register XPoint *pts,
+    EdgeTable *ET,
+    EdgeTableEntry *AET,
+    register EdgeTableEntry *pETEs,
+    ScanLineListBlock   *pSLLBlock)
+{
+    register XPoint *top, *bottom;
+    register XPoint *PrevPt, *CurrPt;
+    int iSLLBlock = 0;
+    int dy;
+
+    if (count < 2)  return;
+
+    /*
+     *  initialize the Active Edge Table
+     */
+    AET->next = (EdgeTableEntry *)NULL;
+    AET->back = (EdgeTableEntry *)NULL;
+    AET->nextWETE = (EdgeTableEntry *)NULL;
+    AET->bres.minor_axis = SMALL_COORDINATE;
+
+    /*
+     *  initialize the Edge Table.
+     */
+    ET->scanlines.next = (ScanLineList *)NULL;
+    ET->ymax = SMALL_COORDINATE;
+    ET->ymin = LARGE_COORDINATE;
+    pSLLBlock->next = (ScanLineListBlock *)NULL;
+
+    PrevPt = &pts[count-1];
+
+    /*
+     *  for each vertex in the array of points.
+     *  In this loop we are dealing with two vertices at
+     *  a time -- these make up one edge of the polygon.
+     */
+    while (count--)
+    {
+        CurrPt = pts++;
+
+        /*
+         *  find out which point is above and which is below.
+         */
+        if (PrevPt->y > CurrPt->y)
+        {
+            bottom = PrevPt, top = CurrPt;
+            pETEs->ClockWise = 0;
+        }
+        else
+        {
+            bottom = CurrPt, top = PrevPt;
+            pETEs->ClockWise = 1;
+        }
+
+        /*
+         * don't add horizontal edges to the Edge table.
+         */
+        if (bottom->y != top->y)
+        {
+            pETEs->ymax = bottom->y-1;  /* -1 so we don't get last scanline */
+
+            /*
+             *  initialize integer edge algorithm
+             */
+            dy = bottom->y - top->y;
+            BRESINITPGONSTRUCT(dy, top->x, bottom->x, pETEs->bres);
+
+            InsertEdgeInET(ET, pETEs, top->y, &pSLLBlock, &iSLLBlock);
+
+           if (PrevPt->y > ET->ymax)
+               ET->ymax = PrevPt->y;
+           if (PrevPt->y < ET->ymin)
+               ET->ymin = PrevPt->y;
+            pETEs++;
+        }
+
+        PrevPt = CurrPt;
+    }
+}
+\f
+/*
+ *     loadAET
+ *
+ *     This routine moves EdgeTableEntries from the
+ *     EdgeTable into the Active Edge Table,
+ *     leaving them sorted by smaller x coordinate.
+ *
+ */
+
+static void
+loadAET(
+    register EdgeTableEntry *AET,
+    register EdgeTableEntry *ETEs)
+{
+    register EdgeTableEntry *pPrevAET;
+    register EdgeTableEntry *tmp;
+
+    pPrevAET = AET;
+    AET = AET->next;
+    while (ETEs)
+    {
+        while (AET && (AET->bres.minor_axis < ETEs->bres.minor_axis))
+        {
+            pPrevAET = AET;
+            AET = AET->next;
+        }
+        tmp = ETEs->next;
+        ETEs->next = AET;
+        if (AET)
+            AET->back = ETEs;
+        ETEs->back = pPrevAET;
+        pPrevAET->next = ETEs;
+        pPrevAET = ETEs;
+
+        ETEs = tmp;
+    }
+}
+\f
+/*
+ *     computeWAET
+ *
+ *     This routine links the AET by the
+ *     nextWETE (winding EdgeTableEntry) link for
+ *     use by the winding number rule.  The final
+ *     Active Edge Table (AET) might look something
+ *     like:
+ *
+ *     AET
+ *     ----------  ---------   ---------
+ *     |ymax    |  |ymax    |  |ymax    |
+ *     | ...    |  |...     |  |...     |
+ *     |next    |->|next    |->|next    |->...
+ *     |nextWETE|  |nextWETE|  |nextWETE|
+ *     ---------   ---------   ^--------
+ *         |                   |       |
+ *         V------------------->       V---> ...
+ *
+ */
+static void
+computeWAET(
+    register EdgeTableEntry *AET)
+{
+    register EdgeTableEntry *pWETE;
+    register int inside = 1;
+    register int isInside = 0;
+
+    AET->nextWETE = (EdgeTableEntry *)NULL;
+    pWETE = AET;
+    AET = AET->next;
+    while (AET)
+    {
+        if (AET->ClockWise)
+            isInside++;
+        else
+            isInside--;
+
+        if ((!inside && !isInside) ||
+            ( inside &&  isInside))
+        {
+            pWETE->nextWETE = AET;
+            pWETE = AET;
+            inside = !inside;
+        }
+        AET = AET->next;
+    }
+    pWETE->nextWETE = (EdgeTableEntry *)NULL;
+}
+\f
+/*
+ *     InsertionSort
+ *
+ *     Just a simple insertion sort using
+ *     pointers and back pointers to sort the Active
+ *     Edge Table.
+ *
+ */
+
+static int
+InsertionSort(
+    register EdgeTableEntry *AET)
+{
+    register EdgeTableEntry *pETEchase;
+    register EdgeTableEntry *pETEinsert;
+    register EdgeTableEntry *pETEchaseBackTMP;
+    register int changed = 0;
+
+    AET = AET->next;
+    while (AET)
+    {
+        pETEinsert = AET;
+        pETEchase = AET;
+        while (pETEchase->back->bres.minor_axis > AET->bres.minor_axis)
+            pETEchase = pETEchase->back;
+
+        AET = AET->next;
+        if (pETEchase != pETEinsert)
+        {
+            pETEchaseBackTMP = pETEchase->back;
+            pETEinsert->back->next = AET;
+            if (AET)
+                AET->back = pETEinsert->back;
+            pETEinsert->next = pETEchase;
+            pETEchase->back->next = pETEinsert;
+            pETEchase->back = pETEinsert;
+            pETEinsert->back = pETEchaseBackTMP;
+            changed = 1;
+        }
+    }
+    return(changed);
+}
+\f
+/*
+ *     Clean up our act.
+ */
+static void
+FreeStorage(
+    register ScanLineListBlock   *pSLLBlock)
+{
+    register ScanLineListBlock   *tmpSLLBlock;
+
+    while (pSLLBlock)
+    {
+        tmpSLLBlock = pSLLBlock->next;
+        Xfree((char *)pSLLBlock);
+        pSLLBlock = tmpSLLBlock;
+    }
+}
+
+/*
+ *     Create an array of rectangles from a list of points.
+ *     If indeed these things (POINTS, RECTS) are the same,
+ *     then this proc is still needed, because it allocates
+ *     storage for the array, which was allocated on the
+ *     stack by the calling procedure.
+ *
+ */
+static int PtsToRegion(
+    register int numFullPtBlocks,
+    register int iCurPtBlock,
+    POINTBLOCK *FirstPtBlock,
+    REGION *reg)
+{
+    register BOX  *rects;
+    register XPoint *pts;
+    register POINTBLOCK *CurPtBlock;
+    register int i;
+    register BOX *extents;
+    register int numRects;
+    BOX *prevRects = reg->rects;
+
+    extents = &reg->extents;
+
+    numRects = ((numFullPtBlocks * NUMPTSTOBUFFER) + iCurPtBlock) >> 1;
+
+    if (!(reg->rects = (BOX *)Xrealloc((char *)reg->rects,
+           (unsigned) (sizeof(BOX) * numRects))))  {
+       Xfree(prevRects);
+       return(0);
+    }
+
+    reg->size = numRects;
+    CurPtBlock = FirstPtBlock;
+    rects = reg->rects - 1;
+    numRects = 0;
+    extents->x1 = MAXSHORT,  extents->x2 = MINSHORT;
+
+    for ( ; numFullPtBlocks >= 0; numFullPtBlocks--) {
+       /* the loop uses 2 points per iteration */
+       i = NUMPTSTOBUFFER >> 1;
+       if (!numFullPtBlocks)
+           i = iCurPtBlock >> 1;
+       for (pts = CurPtBlock->pts; i--; pts += 2) {
+           if (pts->x == pts[1].x)
+               continue;
+           if (numRects && pts->x == rects->x1 && pts->y == rects->y2 &&
+               pts[1].x == rects->x2 &&
+               (numRects == 1 || rects[-1].y1 != rects->y1) &&
+               (i && pts[2].y > pts[1].y)) {
+               rects->y2 = pts[1].y + 1;
+               continue;
+           }
+           numRects++;
+           rects++;
+           rects->x1 = pts->x;  rects->y1 = pts->y;
+           rects->x2 = pts[1].x;  rects->y2 = pts[1].y + 1;
+           if (rects->x1 < extents->x1)
+               extents->x1 = rects->x1;
+           if (rects->x2 > extents->x2)
+               extents->x2 = rects->x2;
+        }
+       CurPtBlock = CurPtBlock->next;
+    }
+
+    if (numRects) {
+       extents->y1 = reg->rects->y1;
+       extents->y2 = rects->y2;
+    } else {
+       extents->x1 = 0;
+       extents->y1 = 0;
+       extents->x2 = 0;
+       extents->y2 = 0;
+    }
+    reg->numRects = numRects;
+
+    return(TRUE);
+}
+
+/*
+ *     polytoregion
+ *
+ *     Scan converts a polygon by returning a run-length
+ *     encoding of the resultant bitmap -- the run-length
+ *     encoding is in the form of an array of rectangles.
+ */
+Region
+XPolygonRegion(
+    XPoint     *Pts,                /* the pts                 */
+    int       Count,                 /* number of pts           */
+    int        rule)                        /* winding rule */
+{
+    Region region;
+    register EdgeTableEntry *pAET;   /* Active Edge Table       */
+    register int y;                  /* current scanline        */
+    register int iPts = 0;           /* number of pts in buffer */
+    register EdgeTableEntry *pWETE;  /* Winding Edge Table Entry*/
+    register ScanLineList *pSLL;     /* current scanLineList    */
+    register XPoint *pts;             /* output buffer           */
+    EdgeTableEntry *pPrevAET;        /* ptr to previous AET     */
+    EdgeTable ET;                    /* header node for ET      */
+    EdgeTableEntry AET;              /* header node for AET     */
+    EdgeTableEntry *pETEs;           /* EdgeTableEntries pool   */
+    ScanLineListBlock SLLBlock;      /* header for scanlinelist */
+    int fixWAET = FALSE;
+    POINTBLOCK FirstPtBlock, *curPtBlock; /* PtBlock buffers    */
+    POINTBLOCK *tmpPtBlock;
+    int numFullPtBlocks = 0;
+
+    if (! (region = XCreateRegion())) return (Region) NULL;
+
+    /* special case a rectangle */
+    pts = Pts;
+    if (((Count == 4) ||
+        ((Count == 5) && (pts[4].x == pts[0].x) && (pts[4].y == pts[0].y))) &&
+       (((pts[0].y == pts[1].y) &&
+         (pts[1].x == pts[2].x) &&
+         (pts[2].y == pts[3].y) &&
+         (pts[3].x == pts[0].x)) ||
+        ((pts[0].x == pts[1].x) &&
+         (pts[1].y == pts[2].y) &&
+         (pts[2].x == pts[3].x) &&
+         (pts[3].y == pts[0].y)))) {
+       region->extents.x1 = min(pts[0].x, pts[2].x);
+       region->extents.y1 = min(pts[0].y, pts[2].y);
+       region->extents.x2 = max(pts[0].x, pts[2].x);
+       region->extents.y2 = max(pts[0].y, pts[2].y);
+       if ((region->extents.x1 != region->extents.x2) &&
+           (region->extents.y1 != region->extents.y2)) {
+           region->numRects = 1;
+           *(region->rects) = region->extents;
+       }
+       return(region);
+    }
+
+    if (Count < 2) return region;
+
+    if (! (pETEs = (EdgeTableEntry *)
+          Xmalloc((unsigned) (sizeof(EdgeTableEntry) * Count)))) {
+       XDestroyRegion(region);
+       return (Region) NULL;
+    }
+
+    pts = FirstPtBlock.pts;
+    CreateETandAET(Count, Pts, &ET, &AET, pETEs, &SLLBlock);
+    pSLL = ET.scanlines.next;
+    curPtBlock = &FirstPtBlock;
+
+    if (rule == EvenOddRule) {
+        /*
+         *  for each scanline
+         */
+        for (y = ET.ymin; y < ET.ymax; y++) {
+            /*
+             *  Add a new edge to the active edge table when we
+             *  get to the next edge.
+             */
+            if (pSLL != NULL && y == pSLL->scanline) {
+                loadAET(&AET, pSLL->edgelist);
+                pSLL = pSLL->next;
+            }
+            pPrevAET = &AET;
+            pAET = AET.next;
+
+            /*
+             *  for each active edge
+             */
+            while (pAET) {
+                pts->x = pAET->bres.minor_axis,  pts->y = y;
+                pts++, iPts++;
+
+                /*
+                 *  send out the buffer
+                 */
+                if (iPts == NUMPTSTOBUFFER) {
+                    tmpPtBlock = (POINTBLOCK *)Xmalloc(sizeof(POINTBLOCK));
+                    curPtBlock->next = tmpPtBlock;
+                    curPtBlock = tmpPtBlock;
+                    pts = curPtBlock->pts;
+                    numFullPtBlocks++;
+                    iPts = 0;
+                }
+                EVALUATEEDGEEVENODD(pAET, pPrevAET, y);
+            }
+            (void) InsertionSort(&AET);
+        }
+    }
+    else {
+        /*
+         *  for each scanline
+         */
+        for (y = ET.ymin; y < ET.ymax; y++) {
+            /*
+             *  Add a new edge to the active edge table when we
+             *  get to the next edge.
+             */
+            if (pSLL != NULL && y == pSLL->scanline) {
+                loadAET(&AET, pSLL->edgelist);
+                computeWAET(&AET);
+                pSLL = pSLL->next;
+            }
+            pPrevAET = &AET;
+            pAET = AET.next;
+            pWETE = pAET;
+
+            /*
+             *  for each active edge
+             */
+            while (pAET) {
+                /*
+                 *  add to the buffer only those edges that
+                 *  are in the Winding active edge table.
+                 */
+                if (pWETE == pAET) {
+                    pts->x = pAET->bres.minor_axis,  pts->y = y;
+                    pts++, iPts++;
+
+                    /*
+                     *  send out the buffer
+                     */
+                    if (iPts == NUMPTSTOBUFFER) {
+                        tmpPtBlock = (POINTBLOCK *)Xmalloc(sizeof(POINTBLOCK));
+                        curPtBlock->next = tmpPtBlock;
+                        curPtBlock = tmpPtBlock;
+                        pts = curPtBlock->pts;
+                        numFullPtBlocks++;    iPts = 0;
+                    }
+                    pWETE = pWETE->nextWETE;
+                }
+                EVALUATEEDGEWINDING(pAET, pPrevAET, y, fixWAET);
+            }
+
+            /*
+             *  recompute the winding active edge table if
+             *  we just resorted or have exited an edge.
+             */
+            if (InsertionSort(&AET) || fixWAET) {
+                computeWAET(&AET);
+                fixWAET = FALSE;
+            }
+        }
+    }
+    FreeStorage(SLLBlock.next);
+    (void) PtsToRegion(numFullPtBlocks, iPts, &FirstPtBlock, region);
+    for (curPtBlock = FirstPtBlock.next; --numFullPtBlocks >= 0;) {
+       tmpPtBlock = curPtBlock->next;
+       Xfree((char *)curPtBlock);
+       curPtBlock = tmpPtBlock;
+    }
+    Xfree((char *)pETEs);
+    return(region);
+}
diff --git a/src/PolyTxt.c b/src/PolyTxt.c
new file mode 100644 (file)
index 0000000..471383b
--- /dev/null
@@ -0,0 +1,234 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XDrawText(
+    register Display *dpy,
+    Drawable d,
+    GC gc,
+    int x,
+    int y,
+    XTextItem *items,
+    int nitems)
+{
+    register int i;
+    register XTextItem *item;
+    int length = 0;
+    register xPolyText8Req *req;
+
+    LockDisplay(dpy);
+    FlushGC(dpy, gc);
+    GetReq (PolyText8, req);
+    req->drawable = d;
+    req->gc = gc->gid;
+    req->x = x;
+    req->y = y;
+
+    item = items;
+    for (i=0; i < nitems; i++) {
+       if (item->font)
+           length += 5;  /* a 255 byte, plus size of Font id */
+        if (item->delta)
+        {
+           if (item->delta > 0)
+           {
+             length += SIZEOF(xTextElt) * ((item->delta + 126) / 127);
+           }
+            else
+            {
+             length += SIZEOF(xTextElt) * ((-item->delta + 127) / 128);
+           }
+        }
+       if (item->nchars > 0)
+       {
+           length += SIZEOF(xTextElt) * ((item->nchars + 253) / 254 - 1);
+           if (!item->delta) length += SIZEOF(xTextElt);
+           length += item->nchars;
+       }
+       item++;
+    }
+
+    req->length += (length + 3)>>2;  /* convert to number of 32-bit words */
+
+
+    /*
+     * If the entire request does not fit into the remaining space in the
+     * buffer, flush the buffer first.   If the request does fit into the
+     * empty buffer, then we won't have to flush it at the end to keep
+     * the buffer 32-bit aligned.
+     */
+
+    if (dpy->bufptr + length > dpy->bufmax)
+       _XFlush (dpy);
+
+    item = items;
+    for (i=0; i< nitems; i++) {
+
+       if (item->font) {
+            /* to mark a font shift, write a 255 byte followed by
+              the 4 bytes of font ID, big-end first */
+           register unsigned char *f;
+           BufAlloc (unsigned char *, f, 5);
+
+           f[0] = 255;
+           f[1] = (item->font & 0xff000000) >> 24;
+           f[2] = (item->font & 0x00ff0000) >> 16;
+           f[3] = (item->font & 0x0000ff00) >> 8;
+           f[4] =  item->font & 0x000000ff;
+
+            /* update GC shadow */
+           gc->values.font = item->font;
+           }
+
+       {
+           int nbytes = SIZEOF(xTextElt);
+           int PartialNChars = item->nchars;
+           int PartialDelta = item->delta;
+            /* register xTextElt *elt; */
+           int FirstTimeThrough = True;
+           char *CharacterOffset = item->chars;
+            char *tbuf = NULL;
+
+           while((PartialDelta < -128) || (PartialDelta > 127))
+            {
+               int nb = SIZEOF(xTextElt);
+
+               BufAlloc (char *, tbuf, nb);
+               *tbuf = 0;    /*   elt->len  */
+               if (PartialDelta > 0 )
+               {
+                   *(tbuf+1) = 127;  /* elt->delta  */
+                   PartialDelta = PartialDelta - 127;
+               }
+               else
+               {
+                   /* -128 = 0x8, need to be careful of signed chars... */
+                   *((unsigned char *)(tbuf+1)) = 0x80;  /* elt->delta */
+                   PartialDelta = PartialDelta + 128;
+               }
+           }
+           if (PartialDelta)
+            {
+                BufAlloc (char *, tbuf , nbytes);
+               *tbuf = 0;      /* elt->len */
+               *(tbuf+1) = PartialDelta;    /* elt->delta  */
+           }
+           while(PartialNChars > 254)
+            {
+               nbytes = 254;
+               if (FirstTimeThrough)
+               {
+                   FirstTimeThrough = False;
+                   if (!item->delta)
+                   {
+                       nbytes += SIZEOF(xTextElt);
+                       BufAlloc (char *, tbuf, nbytes);
+                       *(tbuf+1) = 0;     /* elt->delta */
+                   }
+                   else
+                   {
+                       char *DummyChar;
+                       BufAlloc(char *, DummyChar, nbytes);
+                   }
+               }
+               else
+               {
+                   nbytes += SIZEOF(xTextElt);
+                   BufAlloc (char *, tbuf, nbytes);
+                   *(tbuf+1) = 0;   /* elt->delta */
+               }
+               /* watch out for signs on chars */
+               *(unsigned char *)tbuf = 254;  /* elt->len */
+                memcpy (tbuf+2 , CharacterOffset, 254);
+               PartialNChars = PartialNChars - 254;
+               CharacterOffset += 254;
+
+           }
+           if (PartialNChars)
+            {
+               nbytes = PartialNChars;
+               if (FirstTimeThrough)
+               {
+                   FirstTimeThrough = False;
+                   if (!item->delta)
+                   {
+                       nbytes += SIZEOF(xTextElt);
+                       BufAlloc (char *, tbuf, nbytes);
+                       *(tbuf+1) = 0;   /*  elt->delta  */
+                   }
+                   else
+                   {
+                       char *DummyChar;
+                       BufAlloc(char *, DummyChar, nbytes);
+                   }
+               }
+               else
+               {
+                   nbytes += SIZEOF(xTextElt);
+                   BufAlloc (char *, tbuf, nbytes);
+                   *(tbuf+1) = 0;   /* elt->delta  */
+               }
+               *tbuf = PartialNChars;   /*  elt->len  */
+                memcpy (tbuf+2 , CharacterOffset, PartialNChars);
+           }
+       }
+    item++;
+    }
+
+    /* Pad request out to a 32-bit boundary */
+
+    if (length &= 3) {
+       char *pad;
+       /*
+        * BufAlloc is a macro that uses its last argument more than
+        * once, otherwise I'd write "BufAlloc (char *, pad, 4-length)"
+        */
+       length = 4 - length;
+       BufAlloc (char *, pad, length);
+       /*
+        * if there are 3 bytes of padding, the first byte MUST be 0
+        * so the pad bytes aren't mistaken for a final xTextElt
+        */
+       *pad = 0;
+        }
+
+    /*
+     * If the buffer pointer is not now pointing to a 32-bit boundary,
+     * we must flush the buffer so that it does point to a 32-bit boundary
+     * at the end of this routine.
+     */
+
+    if ((dpy->bufptr - dpy->buffer) & 3)
+       _XFlush (dpy);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 0;
+    }
diff --git a/src/PolyTxt16.c b/src/PolyTxt16.c
new file mode 100644 (file)
index 0000000..dd65818
--- /dev/null
@@ -0,0 +1,268 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XDrawText16(
+    register Display *dpy,
+    Drawable d,
+    GC gc,
+    int x,
+    int y,
+    XTextItem16 *items,
+    int nitems)
+{
+    register int i;
+    register XTextItem16 *item;
+    int length = 0;
+    register xPolyText16Req *req;
+
+    LockDisplay(dpy);
+    FlushGC(dpy, gc);
+    GetReq (PolyText16, req);
+    req->drawable = d;
+    req->gc = gc->gid;
+    req->x = x;
+    req->y = y;
+
+    item = items;
+    for (i=0; i < nitems; i++) {
+       if (item->font)
+           length += 5;  /* a 255 byte, plus size of Font id */
+        if (item->delta)
+        {
+           if (item->delta > 0)
+           {
+             length += SIZEOF(xTextElt) * ((item->delta + 126) / 127);
+           }
+            else
+            {
+             length += SIZEOF(xTextElt) * ((-item->delta + 127) / 128);
+           }
+        }
+       if (item->nchars > 0)
+       {
+           length += SIZEOF(xTextElt) * ((item->nchars + 253) / 254 - 1);
+           if (!item->delta) length += SIZEOF(xTextElt);
+           length += item->nchars << 1;
+       }
+       item++;
+    }
+
+    req->length += (length + 3)>>2;  /* convert to number of 32-bit words */
+
+
+    /*
+     * If the entire request does not fit into the remaining space in the
+     * buffer, flush the buffer first.   If the request does fit into the
+     * empty buffer, then we won't have to flush it at the end to keep
+     *  the buffer 32-bit aligned.
+     */
+
+    if (dpy->bufptr + length > dpy->bufmax)
+       _XFlush (dpy);
+
+    item = items;
+    for (i=0; i< nitems; i++) {
+
+       if (item->font) {
+            /* to mark a font shift, write a 255 byte followed by
+              the 4 bytes of font ID, big-end first */
+           register unsigned char *f;
+           BufAlloc (unsigned char *, f, 5);
+
+           f[0] = 255;
+           f[1] = (item->font & 0xff000000) >> 24;
+           f[2] = (item->font & 0x00ff0000) >> 16;
+           f[3] = (item->font & 0x0000ff00) >> 8;
+           f[4] =  item->font & 0x000000ff;
+
+            /* update GC shadow */
+           gc->values.font = item->font;
+           }
+
+       {
+           int nbytes = SIZEOF(xTextElt);
+           int PartialNChars = item->nchars;
+           int PartialDelta = item->delta;
+            register xTextElt *elt = NULL;
+           int FirstTimeThrough = True;
+           XChar2b *CharacterOffset = item->chars;
+
+           while((PartialDelta < -128) || (PartialDelta > 127))
+            {
+               int nb = SIZEOF(xTextElt);
+
+               BufAlloc (xTextElt *, elt, nb);
+               elt->len = 0;
+               if (PartialDelta > 0 )
+               {
+                   elt->delta = 127;
+                   PartialDelta = PartialDelta - 127;
+               }
+               else
+               {
+                   elt->delta = -128;
+                   PartialDelta = PartialDelta + 128;
+               }
+           }
+           if (PartialDelta)
+            {
+                BufAlloc (xTextElt *, elt, nbytes);
+               elt->len = 0;
+               elt->delta = PartialDelta;
+           }
+           while(PartialNChars > 254)
+            {
+               nbytes = 254 * 2;
+               if (FirstTimeThrough)
+               {
+                   FirstTimeThrough = False;
+                   if (!item->delta)
+                   {
+                       nbytes += SIZEOF(xTextElt);
+                       BufAlloc (xTextElt *, elt, nbytes);
+                       elt->delta = 0;
+                   }
+                   else
+                   {
+                       char *DummyChar;
+                       BufAlloc(char *, DummyChar, nbytes);
+#ifdef lint
+                       DummyChar = DummyChar;
+#endif
+                   }
+               }
+               else
+               {
+                   nbytes += SIZEOF(xTextElt);
+                   BufAlloc (xTextElt *, elt, nbytes);
+                   elt->delta = 0;
+               }
+               elt->len = 254;
+
+#if defined(MUSTCOPY) || defined(MUSTCOPY2B)
+               {
+                   register int i;
+                   register unsigned char *cp;
+                   for (i = 0, cp = ((unsigned char *)elt) + 2; i < 254; i++) {
+                       *cp++ = CharacterOffset[i].byte1;
+                       *cp++ = CharacterOffset[i].byte2;
+                   }
+               }
+#else
+               memcpy ((char *) (elt + 1), (char *)CharacterOffset, 254 * 2);
+#endif
+               PartialNChars = PartialNChars - 254;
+               CharacterOffset += 254;
+
+           }
+           if (PartialNChars)
+            {
+               nbytes = PartialNChars * 2;
+               if (FirstTimeThrough)
+               {
+                   FirstTimeThrough = False;
+                   if (!item->delta)
+                   {
+                       nbytes += SIZEOF(xTextElt);
+                       BufAlloc (xTextElt *, elt, nbytes);
+                       elt->delta = 0;
+                   }
+                   else
+                   {
+                       char *DummyChar;
+                       BufAlloc(char *, DummyChar, nbytes);
+#ifdef lint
+                       DummyChar = DummyChar;
+#endif
+                   }
+               }
+               else
+               {
+                   nbytes += SIZEOF(xTextElt);
+                   BufAlloc (xTextElt *, elt, nbytes);
+                   elt->delta = 0;
+               }
+               elt->len = PartialNChars;
+
+#if defined(MUSTCOPY) || defined(MUSTCOPY2B)
+               {
+                   register int i;
+                   register unsigned char *cp;
+                   for (i = 0, cp = ((unsigned char *)elt) + 2; i < PartialNChars;
+                        i++) {
+                       *cp++ = CharacterOffset[i].byte1;
+                       *cp++ = CharacterOffset[i].byte2;
+                   }
+               }
+#else
+               memcpy ((char *) (elt + 1), (char *)CharacterOffset,
+                       PartialNChars *
+2);
+#endif
+           }
+       }
+    item++;
+    }
+
+    /* Pad request out to a 32-bit boundary */
+
+    if (length &= 3) {
+       char *pad;
+       /*
+        * BufAlloc is a macro that uses its last argument more than
+        * once, otherwise I'd write "BufAlloc (char *, pad, 4-length)"
+        */
+       length = 4 - length;
+       BufAlloc (char *, pad, length);
+       /*
+        * if there are 3 bytes of padding, the first byte MUST be 0
+        * so the pad bytes aren't mistaken for a final xTextElt
+        */
+       *pad = 0;
+        }
+
+    /*
+     * If the buffer pointer is not now pointing to a 32-bit boundary,
+     * we must flush the buffer so that it does point to a 32-bit boundary
+     * at the end of this routine.
+     */
+
+    if ((dpy->bufptr - dpy->buffer) & 3)
+       _XFlush (dpy);
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+    }
+
+
+
diff --git a/src/PropAlloc.c b/src/PropAlloc.c
new file mode 100644 (file)
index 0000000..bad7681
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+
+Copyright 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 "Xlibint.h"
+#include "Xutil.h"
+#include <stdio.h>
+
+
+/*
+ * Routines for allocating space for structures that are expected to get
+ * longer at some point.
+ */
+
+XSizeHints *XAllocSizeHints (void)
+{
+    return ((XSizeHints *) Xcalloc (1, (unsigned) sizeof (XSizeHints)));
+}
+
+
+XStandardColormap *XAllocStandardColormap (void)
+{
+    return ((XStandardColormap *)
+           Xcalloc (1, (unsigned) sizeof (XStandardColormap)));
+}
+
+
+XWMHints *XAllocWMHints (void)
+{
+    return ((XWMHints *) Xcalloc (1, (unsigned) sizeof (XWMHints)));
+}
+
+
+XClassHint *XAllocClassHint (void)
+{
+    register XClassHint *h;
+
+    if ((h = (XClassHint *) Xcalloc (1, (unsigned) sizeof (XClassHint))))
+      h->res_name = h->res_class = NULL;
+
+    return h;
+}
+
+
+XIconSize *XAllocIconSize (void)
+{
+    return ((XIconSize *) Xcalloc (1, (unsigned) sizeof (XIconSize)));
+}
+
+
diff --git a/src/PutBEvent.c b/src/PutBEvent.c
new file mode 100644 (file)
index 0000000..f9d4c29
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+
+Copyright 1986, 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.
+
+*/
+
+/* XPutBackEvent puts an event back at the head of the queue. */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+
+int
+_XPutBackEvent (
+    register Display *dpy,
+    register XEvent *event)
+       {
+       register _XQEvent *qelt;
+       XEvent store = *event;
+
+       if (!dpy->qfree) {
+           if ((dpy->qfree = (_XQEvent *) Xmalloc (sizeof (_XQEvent))) == NULL) {
+               return 0;
+           }
+           dpy->qfree->next = NULL;
+       }
+
+       /* unclaimed cookie? */
+       if (_XIsEventCookie(dpy, event))
+       {
+           XEvent copy = {0};
+            /* if not claimed, then just fetch and store again */
+           if (!event->xcookie.data) {
+               _XFetchEventCookie(dpy, &event->xcookie);
+               store = *event;
+           } else { /* if claimed, copy, client must free */
+               _XCopyEventCookie(dpy, &event->xcookie, &copy.xcookie);
+               store = copy;
+           }
+       }
+
+       qelt = dpy->qfree;
+       dpy->qfree = qelt->next;
+       qelt->qserial_num = dpy->next_event_serial_num++;
+       qelt->next = dpy->head;
+       qelt->event = store;
+       dpy->head = qelt;
+       if (dpy->tail == NULL)
+           dpy->tail = qelt;
+       dpy->qlen++;
+       return 0;
+       }
+
+int
+XPutBackEvent (
+    register Display * dpy,
+    register XEvent *event)
+       {
+       int ret;
+
+       LockDisplay(dpy);
+       ret = _XPutBackEvent(dpy, event);
+       UnlockDisplay(dpy);
+       return ret;
+       }
diff --git a/src/PutImage.c b/src/PutImage.c
new file mode 100644 (file)
index 0000000..6dad4f1
--- /dev/null
@@ -0,0 +1,1044 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+#include "Xutil.h"
+#include <stdio.h>
+#include "Cr.h"
+#include "ImUtil.h"
+
+#if defined(__STDC__) && ((defined(sun) && defined(SVR4)) || defined(WIN32))
+#define RConst /**/
+#else
+#define RConst const
+#endif
+
+#if defined(Lynx) && defined(ROUNDUP)
+#undef ROUNDUP
+#endif
+
+/* assumes pad is a power of 2 */
+#define ROUNDUP(nbytes, pad) (((nbytes) + ((pad) - 1)) & ~(long)((pad) - 1))
+
+static unsigned char const _reverse_byte[0x100] = {
+       0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
+       0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
+       0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
+       0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
+       0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
+       0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
+       0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
+       0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
+       0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
+       0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
+       0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
+       0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
+       0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
+       0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
+       0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
+       0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
+       0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
+       0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
+       0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
+       0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
+       0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
+       0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
+       0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
+       0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
+       0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
+       0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
+       0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
+       0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
+       0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
+       0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
+       0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
+       0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
+};
+
+static unsigned char const _reverse_nibs[0x100] = {
+       0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70,
+       0x80, 0x90, 0xa0, 0xb0, 0xc0, 0xd0, 0xe0, 0xf0,
+       0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71,
+       0x81, 0x91, 0xa1, 0xb1, 0xc1, 0xd1, 0xe1, 0xf1,
+       0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72,
+       0x82, 0x92, 0xa2, 0xb2, 0xc2, 0xd2, 0xe2, 0xf2,
+       0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73,
+       0x83, 0x93, 0xa3, 0xb3, 0xc3, 0xd3, 0xe3, 0xf3,
+       0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74,
+       0x84, 0x94, 0xa4, 0xb4, 0xc4, 0xd4, 0xe4, 0xf4,
+       0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75,
+       0x85, 0x95, 0xa5, 0xb5, 0xc5, 0xd5, 0xe5, 0xf5,
+       0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76,
+       0x86, 0x96, 0xa6, 0xb6, 0xc6, 0xd6, 0xe6, 0xf6,
+       0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77,
+       0x87, 0x97, 0xa7, 0xb7, 0xc7, 0xd7, 0xe7, 0xf7,
+       0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78,
+       0x88, 0x98, 0xa8, 0xb8, 0xc8, 0xd8, 0xe8, 0xf8,
+       0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79,
+       0x89, 0x99, 0xa9, 0xb9, 0xc9, 0xd9, 0xe9, 0xf9,
+       0x0a, 0x1a, 0x2a, 0x3a, 0x4a, 0x5a, 0x6a, 0x7a,
+       0x8a, 0x9a, 0xaa, 0xba, 0xca, 0xda, 0xea, 0xfa,
+       0x0b, 0x1b, 0x2b, 0x3b, 0x4b, 0x5b, 0x6b, 0x7b,
+       0x8b, 0x9b, 0xab, 0xbb, 0xcb, 0xdb, 0xeb, 0xfb,
+       0x0c, 0x1c, 0x2c, 0x3c, 0x4c, 0x5c, 0x6c, 0x7c,
+       0x8c, 0x9c, 0xac, 0xbc, 0xcc, 0xdc, 0xec, 0xfc,
+       0x0d, 0x1d, 0x2d, 0x3d, 0x4d, 0x5d, 0x6d, 0x7d,
+       0x8d, 0x9d, 0xad, 0xbd, 0xcd, 0xdd, 0xed, 0xfd,
+       0x0e, 0x1e, 0x2e, 0x3e, 0x4e, 0x5e, 0x6e, 0x7e,
+       0x8e, 0x9e, 0xae, 0xbe, 0xce, 0xde, 0xee, 0xfe,
+       0x0f, 0x1f, 0x2f, 0x3f, 0x4f, 0x5f, 0x6f, 0x7f,
+       0x8f, 0x9f, 0xaf, 0xbf, 0xcf, 0xdf, 0xef, 0xff
+};
+
+int
+_XReverse_Bytes(
+    register unsigned char *bpt,
+    register int nb)
+{
+    do {
+       *bpt = _reverse_byte[*bpt];
+       bpt++;
+    } while (--nb > 0);
+    return 0;
+}
+
+
+/* XXX the following functions are declared int instead of void because various
+ * compilers and lints complain about later initialization of SwapFunc and/or
+ * (swapfunc == NoSwap) when void is used.
+ */
+
+/*ARGSUSED*/
+static void
+NoSwap (
+    register unsigned char *src,
+    register unsigned char *dest,
+    long srclen,
+    long srcinc,
+    long destinc,
+    unsigned int height,
+    int half_order)
+{
+    long h = height;
+
+    if (srcinc == destinc)
+       memcpy((char *)dest, (char *)src, (int)(srcinc * (h - 1) + srclen));
+    else
+       for (; --h >= 0; src += srcinc, dest += destinc)
+           memcpy((char *)dest, (char *)src, (int)srclen);
+}
+
+static void
+SwapTwoBytes (
+    register unsigned char *src,
+    register unsigned char *dest,
+    long srclen, long srcinc, long destinc,
+    unsigned int height,
+    int half_order)
+{
+    long length = ROUNDUP(srclen, 2);
+    register long h, n;
+
+    srcinc -= length;
+    destinc -= length;
+    for (h = height; --h >= 0; src += srcinc, dest += destinc) {
+       if ((h == 0) && (srclen != length)) {
+           length -= 2;
+           if (half_order == MSBFirst)
+               *(dest + length) = *(src + length + 1);
+           else
+               *(dest + length + 1) = *(src + length);
+       }
+       for (n = length; n > 0; n -= 2, src += 2) {
+           *dest++ = *(src + 1);
+           *dest++ = *src;
+       }
+    }
+}
+
+static void
+SwapThreeBytes (
+    register unsigned char *src,
+    register unsigned char *dest,
+    long srclen, long srcinc, long destinc,
+    unsigned int height,
+    int byte_order)
+{
+    long length = ((srclen + 2) / 3) * 3;
+    register long h, n;
+
+    srcinc -= length;
+    destinc -= length;
+    for (h = height; --h >= 0; src += srcinc, dest += destinc) {
+       if ((h == 0) && (srclen != length)) {
+           length -= 3;
+           if ((srclen - length) == 2)
+               *(dest + length + 1) = *(src + length + 1);
+           if (byte_order == MSBFirst)
+               *(dest + length) = *(src + length + 2);
+           else
+               *(dest + length + 2) = *(src + length);
+       }
+       for (n = length; n > 0; n -= 3, src += 3) {
+           *dest++ = *(src + 2);
+           *dest++ = *(src + 1);
+           *dest++ = *src;
+       }
+    }
+}
+
+static void
+SwapFourBytes (
+    register unsigned char *src,
+    register unsigned char *dest,
+    long srclen, long srcinc, long destinc,
+    unsigned int height,
+    int half_order)
+{
+    long length = ROUNDUP(srclen, 4);
+    register long h, n;
+
+    srcinc -= length;
+    destinc -= length;
+    for (h = height; --h >= 0; src += srcinc, dest += destinc) {
+       if ((h == 0) && (srclen != length)) {
+           length -= 4;
+           if (half_order == MSBFirst)
+               *(dest + length) = *(src + length + 3);
+           if (((half_order == LSBFirst) && ((srclen - length) == 3)) ||
+               ((half_order == MSBFirst) && (srclen & 2)))
+               *(dest + length + 1) = *(src + length + 2);
+           if (((half_order == MSBFirst) && ((srclen - length) == 3)) ||
+               ((half_order == LSBFirst) && (srclen & 2)))
+               *(dest + length + 2) = *(src + length + 1);
+           if (half_order == LSBFirst)
+               *(dest + length + 3) = *(src + length);
+       }
+       for (n = length; n > 0; n -= 4, src += 4) {
+           *dest++ = *(src + 3);
+           *dest++ = *(src + 2);
+           *dest++ = *(src + 1);
+           *dest++ = *src;
+       }
+    }
+}
+
+static void
+SwapWords (
+    register unsigned char *src,
+    register unsigned char *dest,
+    long srclen, long srcinc, long destinc,
+    unsigned int height,
+    int half_order)
+{
+    long length = ROUNDUP(srclen, 4);
+    register long h, n;
+
+    srcinc -= length;
+    destinc -= length;
+    for (h = height; --h >= 0; src += srcinc, dest += destinc) {
+       if ((h == 0) && (srclen != length)) {
+           length -= 4;
+           if (half_order == MSBFirst)
+               *(dest + length + 1) = *(src + length + 3);
+           if (((half_order == LSBFirst) && ((srclen - length) == 3)) ||
+               ((half_order == MSBFirst) && (srclen & 2)))
+               *(dest + length) = *(src + length + 2);
+           if (((half_order == MSBFirst) && ((srclen - length) == 3)) ||
+               ((half_order == LSBFirst) && (srclen & 2)))
+               *(dest + length + 3) = *(src + length + 1);
+           if (half_order == LSBFirst)
+               *(dest + length + 2) = *(src + length);
+       }
+       for (n = length; n > 0; n -= 4, src += 2) {
+           *dest++ = *(src + 2);
+           *dest++ = *(src + 3);
+           *dest++ = *src++;
+           *dest++ = *src++;
+       }
+    }
+}
+
+static void
+SwapNibbles(
+    register unsigned char *src,
+    register unsigned char *dest,
+    long srclen, long srcinc, long destinc,
+    unsigned int height)
+{
+    register long h, n;
+    register const unsigned char *rev = _reverse_nibs;
+
+    srcinc -= srclen;
+    destinc -= srclen;
+    for (h = height; --h >= 0; src += srcinc, dest += destinc)
+       for (n = srclen; --n >= 0; )
+           *dest++ = rev[*src++];
+}
+
+static void
+ShiftNibblesLeft (
+    register unsigned char *src,
+    register unsigned char *dest,
+    long srclen, long srcinc, long destinc,
+    unsigned int height,
+    int nibble_order)
+{
+    register long h, n;
+    register unsigned char c1, c2;
+
+    srcinc -= srclen;
+    destinc -= srclen;
+    if (nibble_order == MSBFirst) {
+       for (h = height; --h >= 0; src += srcinc, dest += destinc)
+           for (n = srclen; --n >= 0; ) {
+               c1 = *src++;
+               c2 = *src;
+               *dest++ = ((c1 & 0x0f) << 4) | ((c2 & (unsigned)0xf0) >> 4);
+           }
+    } else {
+       for (h = height; --h >= 0; src += srcinc, dest += destinc)
+           for (n = srclen; --n >= 0; ) {
+               c1 = *src++;
+               c2 = *src;
+               *dest++ = ((c2 & 0x0f) << 4) | ((c1 & (unsigned)0xf0) >> 4);
+           }
+    }
+}
+
+/*ARGSUSED*/
+static void
+SwapBits(
+    register unsigned char *src,
+    register unsigned char *dest,
+    long srclen, long srcinc, long destinc,
+    unsigned int height,
+    int half_order)
+{
+    register long h, n;
+    register const unsigned char *rev = _reverse_byte;
+
+    srcinc -= srclen;
+    destinc -= srclen;
+    for (h = height; --h >= 0; src += srcinc, dest += destinc)
+       for (n = srclen; --n >= 0; )
+           *dest++ = rev[*src++];
+}
+
+static void
+SwapBitsAndTwoBytes(
+    register unsigned char *src,
+    register unsigned char *dest,
+    long srclen, long srcinc, long destinc,
+    unsigned int height,
+    int half_order)
+{
+    long length = ROUNDUP(srclen, 2);
+    register long h, n;
+    register const unsigned char *rev = _reverse_byte;
+
+    srcinc -= length;
+    destinc -= length;
+    for (h = height; --h >= 0; src += srcinc, dest += destinc) {
+       if ((h == 0) && (srclen != length)) {
+           length -= 2;
+           if (half_order == MSBFirst)
+               *(dest + length) = rev[*(src + length + 1)];
+           else
+               *(dest + length + 1) = rev[*(src + length)];
+       }
+       for (n = length; n > 0; n -= 2, src += 2) {
+           *dest++ = rev[*(src + 1)];
+           *dest++ = rev[*src];
+       }
+    }
+}
+
+static void
+SwapBitsAndFourBytes(
+    register unsigned char *src,
+    register unsigned char *dest,
+    long srclen, long srcinc, long destinc,
+    unsigned int height,
+    int half_order)
+{
+    long length = ROUNDUP(srclen, 4);
+    register long h, n;
+    register const unsigned char *rev = _reverse_byte;
+
+    srcinc -= length;
+    destinc -= length;
+    for (h = height; --h >= 0; src += srcinc, dest += destinc) {
+       if ((h == 0) && (srclen != length)) {
+           length -= 4;
+           if (half_order == MSBFirst)
+               *(dest + length) = rev[*(src + length + 3)];
+           if (((half_order == LSBFirst) && ((srclen - length) == 3)) ||
+               ((half_order == MSBFirst) && (srclen & 2)))
+               *(dest + length + 1) = rev[*(src + length + 2)];
+           if (((half_order == MSBFirst) && ((srclen - length) == 3)) ||
+               ((half_order == LSBFirst) && (srclen & 2)))
+               *(dest + length + 2) = rev[*(src + length + 1)];
+           if (half_order == LSBFirst)
+               *(dest + length + 3) = rev[*(src + length)];
+       }
+       for (n = length; n > 0; n -= 4, src += 4) {
+           *dest++ = rev[*(src + 3)];
+           *dest++ = rev[*(src + 2)];
+           *dest++ = rev[*(src + 1)];
+           *dest++ = rev[*src];
+       }
+    }
+}
+
+static void
+SwapBitsAndWords(
+    register unsigned char *src,
+    register unsigned char *dest,
+    long srclen, long srcinc, long destinc,
+    unsigned int height,
+    int half_order)
+{
+    long length = ROUNDUP(srclen, 4);
+    register long h, n;
+    register const unsigned char *rev = _reverse_byte;
+
+    srcinc -= length;
+    destinc -= length;
+    for (h = height; --h >= 0; src += srcinc, dest += destinc) {
+       if ((h == 0) && (srclen != length)) {
+           length -= 4;
+           if (half_order == MSBFirst)
+               *(dest + length + 1) = rev[*(src + length + 3)];
+           if (((half_order == LSBFirst) && ((srclen - length) == 3)) ||
+               ((half_order == MSBFirst) && (srclen & 2)))
+               *(dest + length) = rev[*(src + length + 2)];
+           if (((half_order == MSBFirst) && ((srclen - length) == 3)) ||
+               ((half_order == LSBFirst) && (srclen & 2)))
+               *(dest + length + 3) = rev[*(src + length + 1)];
+           if (half_order == LSBFirst)
+               *(dest + length + 2) = rev[*(src + length)];
+       }
+       for (n = length; n > 0; n -= 4, src += 2) {
+           *dest++ = rev[*(src + 2)];
+           *dest++ = rev[*(src + 3)];
+           *dest++ = rev[*src++];
+           *dest++ = rev[*src++];
+       }
+    }
+}
+
+/*
+
+The following table gives the bit ordering within bytes (when accessed
+sequentially) for a scanline containing 32 bits, with bits numbered 0 to
+31, where bit 0 should be leftmost on the display.  For a given byte
+labelled A-B, A is for the most significant bit of the byte, and B is
+for the least significant bit.
+
+legend:
+       1   scanline-unit = 8
+       2   scanline-unit = 16
+       4   scanline-unit = 32
+       M   byte-order = MostSignificant
+       L   byte-order = LeastSignificant
+       m   bit-order = MostSignificant
+       l   bit-order = LeastSignificant
+
+
+format ordering
+
+1Mm    00-07 08-15 16-23 24-31
+2Mm    00-07 08-15 16-23 24-31
+4Mm    00-07 08-15 16-23 24-31
+1Ml    07-00 15-08 23-16 31-24
+2Ml    15-08 07-00 31-24 23-16
+4Ml    31-24 23-16 15-08 07-00
+1Lm    00-07 08-15 16-23 24-31
+2Lm    08-15 00-07 24-31 16-23
+4Lm    24-31 16-23 08-15 00-07
+1Ll    07-00 15-08 23-16 31-24
+2Ll    07-00 15-08 23-16 31-24
+4Ll    07-00 15-08 23-16 31-24
+
+
+The following table gives the required conversion between any two
+formats.  It is based strictly on the table above.  If you believe one,
+you should believe the other.
+
+legend:
+       n   no changes
+       s   reverse 8-bit units within 16-bit units
+       l   reverse 8-bit units within 32-bit units
+       w   reverse 16-bit units within 32-bit units
+       R   reverse bits within 8-bit units
+       S   s+R
+       L   l+R
+       W   w+R
+
+*/
+
+static void (* RConst (SwapFunction[12][12]))(
+    register unsigned char *src,
+    register unsigned char *dest,
+    long srclen,
+    long srcinc,
+    long destinc,
+    unsigned int height,
+    int half_order) = {
+#define n NoSwap,
+#define s SwapTwoBytes,
+#define l SwapFourBytes,
+#define w SwapWords,
+#define R SwapBits,
+#define S SwapBitsAndTwoBytes,
+#define L SwapBitsAndFourBytes,
+#define W SwapBitsAndWords,
+
+/*         1Mm 2Mm 4Mm 1Ml 2Ml 4Ml 1Lm 2Lm 4Lm 1Ll 2Ll 4Ll   */
+/* 1Mm */ { n   n   n   R   S   L   n   s   l   R   R   R },
+/* 2Mm */ { n   n   n   R   S   L   n   s   l   R   R   R },
+/* 4Mm */ { n   n   n   R   S   L   n   s   l   R   R   R },
+/* 1Ml */ { R   R   R   n   s   l   R   S   L   n   n   n },
+/* 2Ml */ { S   S   S   s   n   w   S   R   W   s   s   s },
+/* 4Ml */ { L   L   L   l   w   n   L   W   R   l   l   l },
+/* 1Lm */ { n   n   n   R   S   L   n   s   l   R   R   R },
+/* 2Lm */ { s   s   s   S   R   W   s   n   w   S   S   S },
+/* 4Lm */ { l   l   l   L   W   R   l   w   n   L   L   L },
+/* 1Ll */ { R   R   R   n   s   l   R   S   L   n   n   n },
+/* 2Ll */ { R   R   R   n   s   l   R   S   L   n   n   n },
+/* 4Ll */ { R   R   R   n   s   l   R   S   L   n   n   n }
+
+#undef n
+#undef s
+#undef l
+#undef w
+#undef R
+#undef S
+#undef L
+#undef W
+
+};
+
+/* Of course, the table above is a lie.  We also need to factor in the
+ * order of the source data to cope with swapping half of a unit at the
+ * end of a scanline, since we are trying to avoid de-ref'ing off the
+ * end of the source.
+ *
+ * Defines whether the first half of a unit has the first half of the data
+ */
+static int const HalfOrder[12] = {
+       LSBFirst, /* 1Mm */
+       LSBFirst, /* 2Mm */
+       LSBFirst, /* 4Mm */
+       LSBFirst, /* 1Ml */
+       MSBFirst, /* 2Ml */
+       MSBFirst, /* 4Ml */
+       LSBFirst, /* 1Lm */
+       MSBFirst, /* 2Lm */
+       MSBFirst, /* 4Lm */
+       LSBFirst, /* 1Ll */
+       LSBFirst, /* 2Ll */
+       LSBFirst  /* 4Ll */
+       };
+
+/* Finally, for SwapWords cases, the half order depends not just on the source
+ * but also on the destination scanline unit.  Use of this table changes some
+ * MSBFirsts to LSBFirsts that are "do not care" (because the function will be
+ * NoSwap or SwapBits) in addition to changing the desired ones.
+ */
+
+static int const HalfOrderWord[12] = {
+       MSBFirst, /* 1Mm */
+       MSBFirst, /* 2Mm */
+       MSBFirst, /* 4Mm */
+       MSBFirst, /* 1Ml */
+       MSBFirst, /* 2Ml */
+       LSBFirst, /* 4Ml */
+       MSBFirst, /* 1Lm */
+       MSBFirst, /* 2Lm */
+       LSBFirst, /* 4Lm */
+       MSBFirst, /* 1Ll */
+       MSBFirst, /* 2Ll */
+       MSBFirst  /* 4Ll */
+       };
+
+/*
+ * This macro creates a value from 0 to 11 suitable for indexing
+ * into the table above.
+ */
+#define        ComposeIndex(bitmap_unit, bitmap_bit_order, byte_order)                 \
+               (((bitmap_unit == 32) ? 2 : ((bitmap_unit == 16) ? 1 : 0))      \
+                    + (((bitmap_bit_order == MSBFirst) ? 0 : 3)                \
+                    + ((byte_order == MSBFirst) ? 0 : 6)))
+
+/* Cancel a GetReq operation, before doing _XSend or Data */
+
+#if (defined(__STDC__) && !defined(UNIXCPP)) || defined(ANSICPP)
+#define UnGetReq(name)\
+    dpy->bufptr -= SIZEOF(x##name##Req);\
+    dpy->request--
+#else
+#define UnGetReq(name)\
+    dpy->bufptr -= SIZEOF(x/**/name/**/Req);\
+    dpy->request--
+#endif
+
+static void
+SendXYImage(
+    register Display *dpy,
+    register xPutImageReq *req,
+    register XImage *image,
+    int req_xoffset, int req_yoffset)
+{
+    register int j;
+    long total_xoffset, bytes_per_src, bytes_per_dest, length;
+    long bytes_per_line, bytes_per_src_plane, bytes_per_dest_plane;
+    char *src, *dest, *buf;
+    char *extra = (char *)NULL;
+    register void (*swapfunc)(
+        register unsigned char *src,
+        register unsigned char *dest,
+        long srclen,
+        long srcinc,
+        long destinc,
+        unsigned int height,
+        int half_order);
+    int half_order;
+
+    total_xoffset = image->xoffset + req_xoffset;
+    req->leftPad = total_xoffset & (dpy->bitmap_unit - 1);
+    total_xoffset = (unsigned)(total_xoffset - req->leftPad) >> 3;
+    /* The protocol requires left-pad of zero on all ZPixmap, even
+     * though the 1-bit case is identical to bitmap format.  This is a
+     * bug in the protocol, caused because 1-bit ZPixmap was added late
+     * in the game.  Hairy shifting code compensation isn't worth it,
+     * just use XYPixmap format instead.
+     */
+    if ((req->leftPad != 0) && (req->format == ZPixmap))
+       req->format = XYPixmap;
+    bytes_per_dest = (unsigned long)ROUNDUP((long)req->width + req->leftPad,
+                                           dpy->bitmap_pad) >> 3;
+    bytes_per_dest_plane = bytes_per_dest * req->height;
+    length = bytes_per_dest_plane * image->depth;
+    req->length += (length + 3) >> 2;
+
+    swapfunc = SwapFunction[ComposeIndex(image->bitmap_unit,
+                                        image->bitmap_bit_order,
+                                        image->byte_order)]
+                          [ComposeIndex(dpy->bitmap_unit,
+                                        dpy->bitmap_bit_order,
+                                        dpy->byte_order)];
+    half_order = HalfOrder[ComposeIndex(image->bitmap_unit,
+                                       image->bitmap_bit_order,
+                                       image->byte_order)];
+    if (half_order == MSBFirst)
+       half_order = HalfOrderWord[ComposeIndex(dpy->bitmap_unit,
+                                               dpy->bitmap_bit_order,
+                                               dpy->byte_order)];
+
+    src = image->data + (image->bytes_per_line * req_yoffset) + total_xoffset;
+
+    /* when total_xoffset > 0, we have to worry about stepping off the
+     * end of image->data.
+     */
+    if ((swapfunc == NoSwap) &&
+       (image->bytes_per_line == bytes_per_dest) &&
+       (((total_xoffset == 0) &&
+         ((image->depth == 1) || (image->height == req->height))) ||
+        ((image->depth == 1) &&
+         ((req_yoffset + req->height) < (unsigned)image->height)))) {
+       Data(dpy, src, length);
+       return;
+    }
+
+    length = ROUNDUP(length, 4);
+    if ((dpy->bufptr + length) > dpy->bufmax) {
+       if ((buf = _XAllocScratch(dpy, (unsigned long) (length))) == NULL) {
+           UnGetReq(PutImage);
+           return;
+       }
+    }
+    else
+       buf = dpy->bufptr;
+
+    bytes_per_src = (req->width + req->leftPad + (unsigned)7) >> 3;
+    bytes_per_line = image->bytes_per_line;
+    bytes_per_src_plane = bytes_per_line * image->height;
+    total_xoffset &= (image->bitmap_unit - 1) >> 3;
+
+    if ((total_xoffset > 0) &&
+       (image->byte_order != image->bitmap_bit_order)) {
+       char *temp;
+       long bytes_per_temp_plane, temp_length;
+
+       bytes_per_line = bytes_per_src + total_xoffset;
+       src -= total_xoffset;
+       bytes_per_temp_plane = bytes_per_line * req->height;
+       temp_length = ROUNDUP(bytes_per_temp_plane * image->depth, 4);
+       if (buf == dpy->bufptr) {
+           if (! (temp = _XAllocScratch(dpy, (unsigned long) temp_length))) {
+               UnGetReq(PutImage);
+               return;
+           }
+       }
+       else
+           if ((extra = temp = Xmalloc((unsigned) temp_length)) == NULL) {
+               UnGetReq(PutImage);
+               return;
+           }
+
+       swapfunc = SwapFunction[ComposeIndex(image->bitmap_unit,
+                                            image->bitmap_bit_order,
+                                            image->byte_order)]
+                              [ComposeIndex(image->bitmap_unit,
+                                            dpy->byte_order,
+                                            dpy->byte_order)];
+       for (dest = temp, j = image->depth;
+            --j >= 0;
+            src += bytes_per_src_plane, dest += bytes_per_temp_plane)
+           (*swapfunc)((unsigned char *)src, (unsigned char *)dest,
+                       bytes_per_line, (long)image->bytes_per_line,
+                       bytes_per_line, req->height, half_order);
+       swapfunc = SwapFunction[ComposeIndex(image->bitmap_unit,
+                                            dpy->byte_order,
+                                            dpy->byte_order)]
+                              [ComposeIndex(dpy->bitmap_unit,
+                                            dpy->bitmap_bit_order,
+                                            dpy->byte_order)];
+       half_order = HalfOrder[ComposeIndex(image->bitmap_unit,
+                                           dpy->byte_order,
+                                           dpy->byte_order)];
+       src = temp + total_xoffset;
+       bytes_per_src_plane = bytes_per_temp_plane;
+    }
+
+    for (dest = buf, j = image->depth;
+        --j >= 0;
+        src += bytes_per_src_plane, dest += bytes_per_dest_plane)
+       (*swapfunc)((unsigned char *)src, (unsigned char *)dest,
+                   bytes_per_src, bytes_per_line,
+                   bytes_per_dest, req->height, half_order);
+
+    if (extra)
+       Xfree(extra);
+
+    if (buf == dpy->bufptr)
+       dpy->bufptr += length;
+    else
+       _XSend(dpy, buf, length);
+  }
+
+static void
+SendZImage(
+    register Display *dpy,
+    register xPutImageReq *req,
+    register XImage *image,
+    int req_xoffset, int req_yoffset,
+    int dest_bits_per_pixel, int dest_scanline_pad)
+{
+    long bytes_per_src, bytes_per_dest, length;
+    unsigned char *src, *dest;
+    unsigned char *shifted_src = NULL;
+
+    req->leftPad = 0;
+    bytes_per_src = ROUNDUP((long)req->width * image->bits_per_pixel, 8) >> 3;
+    bytes_per_dest = ROUNDUP((long)req->width * dest_bits_per_pixel,
+                            dest_scanline_pad) >> 3;
+    length = bytes_per_dest * req->height;
+    req->length += (length + 3) >> 2;
+
+    src = (unsigned char *)image->data +
+         (req_yoffset * image->bytes_per_line) +
+         ((req_xoffset * image->bits_per_pixel) >> 3);
+    if ((image->bits_per_pixel == 4) && ((unsigned int) req_xoffset & 0x01)) {
+       if (! (shifted_src = (unsigned char *)
+              Xmalloc((unsigned) (req->height * image->bytes_per_line)))) {
+           UnGetReq(PutImage);
+           return;
+       }
+
+       ShiftNibblesLeft(src, shifted_src, bytes_per_src,
+                        (long) image->bytes_per_line,
+                        (long) image->bytes_per_line, req->height,
+                        image->byte_order);
+       src = shifted_src;
+    }
+
+    /* when req_xoffset > 0, we have to worry about stepping off the
+     * end of image->data.
+     */
+    if (((image->byte_order == dpy->byte_order) ||
+        (image->bits_per_pixel == 8)) &&
+       ((long)image->bytes_per_line == bytes_per_dest) &&
+       ((req_xoffset == 0) ||
+        ((req_yoffset + req->height) < (unsigned)image->height))) {
+       Data(dpy, (char *)src, length);
+       if (shifted_src)
+           Xfree((char *)shifted_src);
+       return;
+    }
+
+    length = ROUNDUP(length, 4);
+    if ((dpy->bufptr + length) <= dpy->bufmax)
+       dest = (unsigned char *)dpy->bufptr;
+    else
+       if ((dest = (unsigned char *)
+            _XAllocScratch(dpy, (unsigned long)(length))) == NULL) {
+           if (shifted_src) Xfree((char *) shifted_src);
+           UnGetReq(PutImage);
+           return;
+       }
+
+    if ((image->byte_order == dpy->byte_order) ||
+       (image->bits_per_pixel == 8))
+       NoSwap(src, dest, bytes_per_src, (long)image->bytes_per_line,
+              bytes_per_dest, req->height, image->byte_order);
+    else if (image->bits_per_pixel == 32)
+       SwapFourBytes(src, dest, bytes_per_src, (long)image->bytes_per_line,
+                     bytes_per_dest, req->height, image->byte_order);
+    else if (image->bits_per_pixel == 24)
+       SwapThreeBytes(src, dest, bytes_per_src, (long)image->bytes_per_line,
+                      bytes_per_dest, req->height, image->byte_order);
+    else if (image->bits_per_pixel == 16)
+       SwapTwoBytes(src, dest, bytes_per_src, (long)image->bytes_per_line,
+                    bytes_per_dest, req->height, image->byte_order);
+    else
+       SwapNibbles(src, dest, bytes_per_src, (long)image->bytes_per_line,
+                   bytes_per_dest, req->height);
+
+    if (dest == (unsigned char *)dpy->bufptr)
+       dpy->bufptr += length;
+    else
+       _XSend(dpy, (char *)dest, length);
+
+    if (shifted_src)
+        Xfree((char *)shifted_src);
+}
+
+static void
+PutImageRequest(
+    register Display *dpy,
+    Drawable d,
+    GC gc,
+    register XImage *image,
+    int req_xoffset, int req_yoffset,
+    int x, int y,
+    unsigned int req_width, unsigned int req_height,
+    int dest_bits_per_pixel, int dest_scanline_pad)
+{
+    register xPutImageReq *req;
+
+    GetReq(PutImage, req);
+    req->drawable = d;
+    req->gc = gc->gid;
+    req->dstX = x;
+    req->dstY = y;
+    req->width = req_width;
+    req->height = req_height;
+    req->depth = image->depth;
+    req->format = image->format;
+    if ((image->bits_per_pixel == 1) || (image->format != ZPixmap))
+       SendXYImage(dpy, req, image, req_xoffset, req_yoffset);
+    else
+       SendZImage(dpy, req, image, req_xoffset, req_yoffset,
+                  dest_bits_per_pixel, dest_scanline_pad);
+}
+
+static void
+PutSubImage (
+    register Display *dpy,
+    Drawable d,
+    GC gc,
+    register XImage *image,
+    int req_xoffset,
+    int req_yoffset,
+    int x, int y,
+    unsigned int req_width,
+    unsigned int req_height,
+    int dest_bits_per_pixel,
+    int dest_scanline_pad)
+{
+    int left_pad, BytesPerRow, Available;
+
+    if ((req_width == 0) || (req_height == 0))
+       return;
+
+    Available = ((65536 < dpy->max_request_size) ? (65536 << 2)
+                                                : (dpy->max_request_size << 2))
+               - SIZEOF(xPutImageReq);
+
+    if ((image->bits_per_pixel == 1) || (image->format != ZPixmap)) {
+       left_pad = (image->xoffset + req_xoffset) & (dpy->bitmap_unit - 1);
+       BytesPerRow = (ROUNDUP((long)req_width + left_pad,
+                              dpy->bitmap_pad) >> 3) * image->depth;
+    } else {
+       left_pad = 0;
+       BytesPerRow = ROUNDUP((long)req_width * dest_bits_per_pixel,
+                             dest_scanline_pad) >> 3;
+    }
+
+    if ((BytesPerRow * req_height) <= Available) {
+        PutImageRequest(dpy, d, gc, image, req_xoffset, req_yoffset, x, y,
+                       req_width, req_height,
+                       dest_bits_per_pixel, dest_scanline_pad);
+    } else if (req_height > 1) {
+       int SubImageHeight = Available / BytesPerRow;
+
+       if (SubImageHeight == 0)
+           SubImageHeight = 1;
+
+       PutSubImage(dpy, d, gc, image, req_xoffset, req_yoffset, x, y,
+                   req_width, (unsigned int) SubImageHeight,
+                   dest_bits_per_pixel, dest_scanline_pad);
+
+       PutSubImage(dpy, d, gc, image, req_xoffset,
+                   req_yoffset + SubImageHeight, x, y + SubImageHeight,
+                   req_width, req_height - SubImageHeight,
+                   dest_bits_per_pixel, dest_scanline_pad);
+    } else {
+       int SubImageWidth = (((Available << 3) / dest_scanline_pad)
+                               * dest_scanline_pad) - left_pad;
+
+       PutSubImage(dpy, d, gc, image, req_xoffset, req_yoffset, x, y,
+                   (unsigned int) SubImageWidth, 1,
+                   dest_bits_per_pixel, dest_scanline_pad);
+
+       PutSubImage(dpy, d, gc, image, req_xoffset + SubImageWidth,
+                   req_yoffset, x + SubImageWidth, y,
+                   req_width - SubImageWidth, 1,
+                   dest_bits_per_pixel, dest_scanline_pad);
+    }
+}
+
+
+int
+XPutImage (
+    register Display *dpy,
+    Drawable d,
+    GC gc,
+    register XImage *image,
+    int req_xoffset,
+    int req_yoffset,
+    int x,
+    int y,
+    unsigned int req_width,
+    unsigned int req_height)
+
+{
+    long width = req_width;
+    long height = req_height;
+    int dest_bits_per_pixel, dest_scanline_pad;
+
+    if (req_xoffset < 0) {
+       width += req_xoffset;
+       req_xoffset = 0;
+    }
+    if (req_yoffset < 0) {
+       height += req_yoffset;
+       req_yoffset = 0;
+    }
+    if ((req_xoffset + width) > image->width)
+       width = image->width - req_xoffset;
+    if ((req_yoffset + height) > image->height)
+       height = image->height - req_yoffset;
+    if ((width <= 0) || (height <= 0))
+       return 0;
+
+    if ((image->bits_per_pixel == 1) || (image->format != ZPixmap)) {
+       dest_bits_per_pixel = 1;
+       dest_scanline_pad = dpy->bitmap_pad;
+    } else {
+       register int n;
+       register ScreenFormat *format;
+
+       dest_bits_per_pixel = image->bits_per_pixel;
+       dest_scanline_pad = image->bitmap_pad;
+       for (n = dpy->nformats, format = dpy->pixmap_format; --n >= 0; format++)
+           if (format->depth == image->depth) {
+               dest_bits_per_pixel = format->bits_per_pixel;
+               dest_scanline_pad = format->scanline_pad;
+           }
+       if (dest_bits_per_pixel != image->bits_per_pixel) {
+           XImage img;
+           register long i, j;
+           /* XXX slow, but works */
+           img.width = width;
+           img.height = height;
+           img.xoffset = 0;
+           img.format = ZPixmap;
+           img.byte_order = dpy->byte_order;
+           img.bitmap_unit = dpy->bitmap_unit;
+           img.bitmap_bit_order = dpy->bitmap_bit_order;
+           img.bitmap_pad = dest_scanline_pad;
+           img.depth = image->depth;
+           img.bits_per_pixel = dest_bits_per_pixel;
+           img.bytes_per_line = ROUNDUP((dest_bits_per_pixel * width),
+                                        dest_scanline_pad) >> 3;
+           img.data = Xmalloc((unsigned) (img.bytes_per_line * height));
+           if (img.data == NULL)
+               return 0;
+           _XInitImageFuncPtrs(&img);
+           for (j = height; --j >= 0; )
+               for (i = width; --i >= 0; )
+                   XPutPixel(&img, i, j, XGetPixel(image, req_xoffset + i,
+                                                   req_yoffset + j));
+           LockDisplay(dpy);
+           FlushGC(dpy, gc);
+           PutSubImage(dpy, d, gc, &img, 0, 0, x, y,
+                       (unsigned int) width, (unsigned int) height,
+                       dest_bits_per_pixel, dest_scanline_pad);
+           UnlockDisplay(dpy);
+           SyncHandle();
+           Xfree(img.data);
+           return 0;
+       }
+    }
+
+    LockDisplay(dpy);
+    FlushGC(dpy, gc);
+
+    PutSubImage(dpy, d, gc, image, req_xoffset, req_yoffset, x, y,
+               (unsigned int) width, (unsigned int) height,
+               dest_bits_per_pixel, dest_scanline_pad);
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+#ifdef USE_DYNAMIC_XCURSOR
+    if (image->bits_per_pixel == 1 &&
+       x == 0 && y == 0 &&
+       width == image->width && height == image->height &&
+       gc->values.function == GXcopy &&
+       (gc->values.plane_mask & 1))
+    {
+       _XNoticePutBitmap (dpy, d, image);
+    }
+#endif
+    return 0;
+}
diff --git a/src/QuBest.c b/src/QuBest.c
new file mode 100644 (file)
index 0000000..97b1f11
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+Status XQueryBestSize(
+    register Display *dpy,
+    int class,
+    Drawable drawable,
+    unsigned int width,
+    unsigned int height,
+    unsigned int *ret_width,
+    unsigned int *ret_height)
+{
+    xQueryBestSizeReply rep;
+    register xQueryBestSizeReq *req;
+
+    LockDisplay(dpy);
+    GetReq(QueryBestSize, req);
+    req->class = class;
+    req->drawable = drawable;
+    req->width = width;
+    req->height = height;
+    if (_XReply (dpy, (xReply *)&rep, 0, xTrue) == 0) {
+           UnlockDisplay(dpy);
+           SyncHandle();
+           return 0;
+       }
+    *ret_width = rep.width;
+    *ret_height = rep.height;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/QuColor.c b/src/QuColor.c
new file mode 100644 (file)
index 0000000..4638095
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XQueryColor(
+    register Display *dpy,
+    Colormap cmap,
+    XColor *def)       /* RETURN */
+{
+    xrgb color;
+    xQueryColorsReply rep;
+    register xQueryColorsReq *req;
+    unsigned long val = def->pixel;    /* needed for macro below */
+
+    LockDisplay(dpy);
+    GetReqExtra(QueryColors, 4, req); /* a pixel (CARD32) is 4 bytes */
+    req->cmap = cmap;
+
+    OneDataCard32 (dpy, NEXTPTR(req,xQueryColorsReq), val);
+
+    if (_XReply(dpy, (xReply *) &rep, 0, xFalse) != 0) {
+
+           _XRead(dpy, (char *)&color, (long) SIZEOF(xrgb));
+
+           def->red = color.red;
+           def->blue = color.blue;
+           def->green = color.green;
+           def->flags = DoRed | DoGreen | DoBlue;
+        }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/QuColors.c b/src/QuColors.c
new file mode 100644 (file)
index 0000000..237b8bf
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+static void
+_XQueryColors(
+    register Display *dpy,
+    Colormap cmap,
+    XColor *defs,              /* RETURN */
+    int ncolors)
+{
+    register int i;
+    xrgb *color;
+    xQueryColorsReply rep;
+    long nbytes;
+    register xQueryColorsReq *req;
+
+    GetReq(QueryColors, req);
+
+    req->cmap = cmap;
+    SetReqLen(req, ncolors, ncolors); /* each pixel is a CARD32 */
+
+    for (i = 0; i < ncolors; i++)
+      Data32 (dpy, (long *)&defs[i].pixel, 4L);
+       /* XXX this isn't very efficient */
+
+    if (_XReply(dpy, (xReply *) &rep, 0, xFalse) != 0) {
+       if ((color = (xrgb *)
+           Xmalloc((unsigned) (nbytes = (long) ncolors * SIZEOF(xrgb))))) {
+
+           _XRead(dpy, (char *) color, nbytes);
+
+           for (i = 0; i < ncolors; i++) {
+               register XColor *def = &defs[i];
+               register xrgb *rgb = &color[i];
+               def->red = rgb->red;
+               def->green = rgb->green;
+               def->blue = rgb->blue;
+               def->flags = DoRed | DoGreen | DoBlue;
+           }
+           Xfree((char *)color);
+       }
+       else _XEatData(dpy, (unsigned long) nbytes);
+    }
+}
+
+int
+XQueryColors(
+    register Display * const dpy,
+    const Colormap cmap,
+    XColor *defs,              /* RETURN */
+    int ncolors)
+{
+    int n;
+
+    if (dpy->bigreq_size > 0)
+       n = dpy->bigreq_size - (sizeof (xQueryColorsReq) >> 2) - 1;
+    else
+       n = dpy->max_request_size - (sizeof (xQueryColorsReq) >> 2);
+
+    LockDisplay(dpy);
+    while (ncolors >= n) {
+       _XQueryColors(dpy, cmap, defs, n);
+       defs += n;
+       ncolors -= n;
+    }
+    if (ncolors > 0)
+       _XQueryColors(dpy, cmap, defs, ncolors);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/QuCurShp.c b/src/QuCurShp.c
new file mode 100644 (file)
index 0000000..bb17c42
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+Status XQueryBestCursor(
+    register Display *dpy,
+    Drawable drawable,
+    unsigned int width,
+    unsigned int height,
+    unsigned int *ret_width,
+    unsigned int *ret_height)
+{
+    xQueryBestSizeReply rep;
+    register xQueryBestSizeReq *req;
+
+    LockDisplay(dpy);
+    GetReq(QueryBestSize, req);
+    req->class = CursorShape;
+    req->drawable = drawable;
+    req->width = width;
+    req->height = height;
+    if (_XReply (dpy, (xReply *)&rep, 0, xTrue) == 0) {
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return 0;
+       }
+    *ret_width = rep.width;
+    *ret_height = rep.height;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/QuExt.c b/src/QuExt.c
new file mode 100644 (file)
index 0000000..4e230e7
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+Bool
+XQueryExtension(
+    register Display *dpy,
+    _Xconst char *name,
+    int *major_opcode,  /* RETURN */
+    int *first_event,   /* RETURN */
+    int *first_error)  /* RETURN */
+{
+    xQueryExtensionReply rep;
+    register xQueryExtensionReq *req;
+
+    LockDisplay(dpy);
+    GetReq(QueryExtension, req);
+    req->nbytes = name ? strlen(name) : 0;
+    req->length += (req->nbytes+(unsigned)3)>>2;
+    _XSend(dpy, name, (long)req->nbytes);
+    (void) _XReply (dpy, (xReply *)&rep, 0, xTrue);
+    *major_opcode = rep.major_opcode;
+    *first_event = rep.first_event;
+    *first_error = rep.first_error;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return (rep.present);
+}
+
diff --git a/src/QuKeybd.c b/src/QuKeybd.c
new file mode 100644 (file)
index 0000000..4b8431d
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+struct kmap {
+  char map[32];
+};
+
+int
+XQueryKeymap(
+    register Display *dpy,
+    char keys[32])
+{
+    xQueryKeymapReply rep;
+    register xReq *req;
+
+    LockDisplay(dpy);
+    GetEmptyReq(QueryKeymap, req);
+    (void) _XReply(dpy, (xReply *)&rep,
+       (SIZEOF(xQueryKeymapReply) - SIZEOF(xReply)) >> 2, xTrue);
+    *(struct kmap *) keys = *(struct kmap *)rep.map;  /* faster than memcpy */
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/QuPntr.c b/src/QuPntr.c
new file mode 100644 (file)
index 0000000..e1379a6
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+Bool XQueryPointer(
+     register Display *dpy,
+     Window w,
+     Window *root,
+     Window *child,
+     int *root_x,
+     int *root_y,
+     int *win_x,
+     int *win_y,
+     unsigned int *mask)
+{
+    xQueryPointerReply rep;
+    xResourceReq *req;
+
+    LockDisplay(dpy);
+    GetResReq(QueryPointer, w, req);
+    if (_XReply (dpy, (xReply *)&rep, 0, xTrue) == 0) {
+           UnlockDisplay(dpy);
+           SyncHandle();
+           return(False);
+       }
+
+    *root = rep.root;
+    *child = rep.child;
+    *root_x = cvtINT16toInt (rep.rootX);
+    *root_y = cvtINT16toInt (rep.rootY);
+    *win_x = cvtINT16toInt (rep.winX);
+    *win_y = cvtINT16toInt (rep.winY);
+    *mask = rep.mask;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return (rep.sameScreen);
+}
+
diff --git a/src/QuStipShp.c b/src/QuStipShp.c
new file mode 100644 (file)
index 0000000..9f612fc
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+Status XQueryBestStipple(
+     register Display *dpy,
+     Drawable drawable,
+     unsigned int width,
+     unsigned int height,
+     unsigned int *ret_width,
+     unsigned int *ret_height)
+{
+    xQueryBestSizeReply rep;
+    register xQueryBestSizeReq *req;
+
+    LockDisplay(dpy);
+    GetReq(QueryBestSize, req);
+    req->class = StippleShape;
+    req->drawable = drawable;
+    req->width = width;
+    req->height = height;
+    if (_XReply (dpy, (xReply *)&rep, 0, xTrue) == 0) {
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return 0;
+       }
+    *ret_width = rep.width;
+    *ret_height = rep.height;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/QuTextE16.c b/src/QuTextE16.c
new file mode 100644 (file)
index 0000000..e458bc5
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+
+Copyright 1986, 1987, 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 "Xlibint.h"
+
+int
+XQueryTextExtents16 (
+    register Display *dpy,
+    Font fid,
+    _Xconst XChar2b *string,
+    register int nchars,
+    int *dir,
+    int *font_ascent,
+    int *font_descent,
+    register XCharStruct *overall)
+{
+    register long i;
+    register unsigned char *ptr;
+    char *buf;
+    xQueryTextExtentsReply rep;
+    long nbytes;
+    register xQueryTextExtentsReq *req;
+
+    LockDisplay(dpy);
+    nbytes = nchars << 1;
+    GetReq(QueryTextExtents, req);
+    req->fid = fid;
+    if ((buf = _XAllocScratch (dpy, (unsigned long) nbytes))) {
+       req->length += (nbytes + 3)>>2;
+       req->oddLength = nchars & 1;
+       for (ptr = (unsigned char *)buf, i = nchars; --i >= 0; string++) {
+           *ptr++ = string->byte1;
+           *ptr++ = string->byte2;
+       }
+       Data (dpy, buf, nbytes);
+    }
+    if (!_XReply (dpy, (xReply *)&rep, 0, xTrue) || !buf) {
+        UnlockDisplay(dpy);
+       SyncHandle();
+       return 0;
+    }
+    *dir = rep.drawDirection;
+    *font_ascent = cvtINT16toInt (rep.fontAscent);
+    *font_descent = cvtINT16toInt (rep.fontDescent);
+    overall->ascent = (short) cvtINT16toShort (rep.overallAscent);
+    overall->descent = (short) cvtINT16toShort (rep.overallDescent);
+    /* XXX bogus - we're throwing away information!!! */
+    overall->width  = (short) cvtINT32toInt (rep.overallWidth);
+    overall->lbearing = (short) cvtINT32toInt (rep.overallLeft);
+    overall->rbearing = (short) cvtINT32toInt (rep.overallRight);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/QuTextExt.c b/src/QuTextExt.c
new file mode 100644 (file)
index 0000000..8a17dbb
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+
+Copyright 1986, 1987, 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 "Xlibint.h"
+
+int
+XQueryTextExtents (
+    register Display *dpy,
+    Font fid,
+    register _Xconst char *string,
+    register int nchars,
+    int *dir,
+    int *font_ascent,
+    int *font_descent,
+    register XCharStruct *overall)
+{
+    register int i;
+    register char *ptr;
+    char *buf;
+    xQueryTextExtentsReply rep;
+    long nbytes;
+    register xQueryTextExtentsReq *req;
+
+    LockDisplay(dpy);
+    nbytes = nchars << 1;
+    GetReq(QueryTextExtents, req);
+    req->fid = fid;
+    if ((buf = _XAllocScratch (dpy, (unsigned long) nbytes))) {
+       req->length += (nbytes + 3)>>2;
+       req->oddLength = nchars & 1;
+       for (ptr = buf, i = nchars; --i >= 0;) {
+           *ptr++ = 0;
+           *ptr++ = *string++;
+       }
+       Data (dpy, buf, nbytes);
+    }
+    if (!_XReply (dpy, (xReply *)&rep, 0, xTrue) || !buf) {
+        UnlockDisplay(dpy);
+       SyncHandle();
+       return 0;
+    }
+    *dir = rep.drawDirection;
+    *font_ascent = cvtINT16toInt (rep.fontAscent);
+    *font_descent = cvtINT16toInt (rep.fontDescent);
+    overall->ascent = (short) cvtINT16toShort (rep.overallAscent);
+    overall->descent = (short) cvtINT16toShort (rep.overallDescent);
+    /* XXX bogus - we're throwing away information!!! */
+    overall->width  = (short) cvtINT32toInt (rep.overallWidth);
+    overall->lbearing = (short) cvtINT32toInt (rep.overallLeft);
+    overall->rbearing = (short) cvtINT32toInt (rep.overallRight);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/QuTileShp.c b/src/QuTileShp.c
new file mode 100644 (file)
index 0000000..f713f42
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+Status XQueryBestTile(
+     register Display *dpy,
+     Drawable drawable,
+     unsigned int width,
+     unsigned int height,
+     unsigned int *ret_width,
+     unsigned int *ret_height)
+{
+    xQueryBestSizeReply rep;
+    register xQueryBestSizeReq *req;
+
+    LockDisplay(dpy);
+    GetReq(QueryBestSize, req);
+    req->class = TileShape;
+    req->drawable = drawable;
+    req->width = width;
+    req->height = height;
+    if (_XReply (dpy, (xReply *)&rep, 0, xTrue) == 0) {
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return(0);
+       }
+
+    *ret_width = rep.width;
+    *ret_height = rep.height;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/QuTree.c b/src/QuTree.c
new file mode 100644 (file)
index 0000000..3cea282
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+Status XQueryTree (
+    register Display *dpy,
+    Window w,
+    Window *root,      /* RETURN */
+    Window *parent,    /* RETURN */
+    Window **children, /* RETURN */
+    unsigned int *nchildren)  /* RETURN */
+{
+    long nbytes;
+    xQueryTreeReply rep;
+    register xResourceReq *req;
+
+    LockDisplay(dpy);
+    GetResReq(QueryTree, w, req);
+    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return (0);
+       }
+
+    *children = (Window *) NULL;
+    if (rep.nChildren != 0) {
+       nbytes = rep.nChildren * sizeof(Window);
+       *children = (Window *) Xmalloc((unsigned) nbytes);
+       nbytes = rep.nChildren << 2;
+       if (! *children) {
+           _XEatData(dpy, (unsigned long) nbytes);
+           UnlockDisplay(dpy);
+           SyncHandle();
+           return (0);
+       }
+       _XRead32 (dpy, (long *) *children, nbytes);
+    }
+    *parent = rep.parent;
+    *root = rep.root;
+    *nchildren = rep.nChildren;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return (1);
+}
+
diff --git a/src/Quarks.c b/src/Quarks.c
new file mode 100644 (file)
index 0000000..7a704b1
--- /dev/null
@@ -0,0 +1,413 @@
+
+/***********************************************************
+Copyright 1987, 1988, 1990 by Digital Equipment Corporation, Maynard,
+
+                        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, 1990, 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 "Xlibint.h"
+#include <X11/Xresource.h>
+#include "Xresinternal.h"
+
+/* Not cost effective, at least for vanilla MIT clients */
+/* #define PERMQ */
+
+#ifdef PERMQ
+typedef unsigned char Bits;
+#endif
+typedef unsigned long Entry; /* dont confuse with EntryRec from Xintatom.h */
+
+static XrmQuark nextQuark = 1; /* next available quark number */
+static unsigned long quarkMask = 0;
+static Entry zero = 0;
+static Entry *quarkTable = &zero; /* crock */
+static unsigned long quarkRehash;
+static XrmString **stringTable = NULL;
+#ifdef PERMQ
+static Bits **permTable = NULL;
+#endif
+static XrmQuark nextUniq = -1; /* next quark from XrmUniqueQuark */
+
+#define QUANTUMSHIFT   8
+#define QUANTUMMASK    ((1 << QUANTUMSHIFT) - 1)
+#define CHUNKPER       8
+#define CHUNKMASK      ((CHUNKPER << QUANTUMSHIFT) - 1)
+
+#define LARGEQUARK     ((Entry)0x80000000L)
+#define QUARKSHIFT     18
+#define QUARKMASK      ((LARGEQUARK - 1) >> QUARKSHIFT)
+#define XSIGMASK       ((1L << QUARKSHIFT) - 1)
+
+#define STRQUANTSIZE   (sizeof(XrmString) * (QUANTUMMASK + 1))
+#ifdef PERMQ
+#define QUANTSIZE      (STRQUANTSIZE + \
+                        (sizeof(Bits) * ((QUANTUMMASK + 1) >> 3))
+#else
+#define QUANTSIZE      STRQUANTSIZE
+#endif
+
+#define HASH(sig) ((sig) & quarkMask)
+#define REHASHVAL(sig) ((((sig) % quarkRehash) + 2) | 1)
+#define REHASH(idx,rehash) ((idx + rehash) & quarkMask)
+#define NAME(q) stringTable[(q) >> QUANTUMSHIFT][(q) & QUANTUMMASK]
+#ifdef PERMQ
+#define BYTEREF(q) permTable[(q) >> QUANTUMSHIFT][((q) & QUANTUMMASK) >> 3]
+#define ISPERM(q) (BYTEREF(q) & (1 << ((q) & 7)))
+#define SETPERM(q) BYTEREF(q) |= (1 << ((q) & 7))
+#define CLEARPERM(q) BYTEREF(q) &= ~(1 << ((q) & 7))
+#endif
+
+/* Permanent memory allocation */
+
+#define WALIGN sizeof(unsigned long)
+#define DALIGN sizeof(double)
+
+#define NEVERFREETABLESIZE ((8192-12) & ~(DALIGN-1))
+static char *neverFreeTable = NULL;
+static int  neverFreeTableSize = 0;
+
+static char *permalloc(unsigned int length)
+{
+    char *ret;
+
+    if (neverFreeTableSize < length) {
+       if (length >= NEVERFREETABLESIZE)
+           return Xmalloc(length);
+       if (! (ret = Xmalloc(NEVERFREETABLESIZE)))
+           return (char *) NULL;
+       neverFreeTableSize = NEVERFREETABLESIZE;
+       neverFreeTable = ret;
+    }
+    ret = neverFreeTable;
+    neverFreeTable += length;
+    neverFreeTableSize -= length;
+    return(ret);
+}
+
+#ifndef WORD64
+typedef struct {char a; double b;} TestType1;
+typedef struct {char a; unsigned long b;} TestType2;
+#endif
+
+#ifdef XTHREADS
+static char *_Xpermalloc(unsigned int length);
+
+char *Xpermalloc(unsigned int length)
+{
+    char *p;
+
+    _XLockMutex(_Xglobal_lock);
+    p = _Xpermalloc(length);
+    _XUnlockMutex(_Xglobal_lock);
+    return p;
+}
+#define Xpermalloc _Xpermalloc
+
+static
+#endif /* XTHREADS */
+char *Xpermalloc(unsigned int length)
+{
+    int i;
+
+    if (neverFreeTableSize && length < NEVERFREETABLESIZE) {
+#ifndef WORD64
+       if ((sizeof(TestType1) !=
+            (sizeof(TestType2) - sizeof(unsigned long) + sizeof(double))) &&
+           !(length & (DALIGN-1)) &&
+           ((i = (NEVERFREETABLESIZE - neverFreeTableSize) & (DALIGN-1)))) {
+           neverFreeTableSize -= DALIGN - i;
+           neverFreeTable += DALIGN - i;
+       } else
+#endif
+           if ((i = (NEVERFREETABLESIZE - neverFreeTableSize) & (WALIGN-1))) {
+               neverFreeTableSize -= WALIGN - i;
+               neverFreeTable += WALIGN - i;
+           }
+    }
+    return permalloc(length);
+}
+
+static Bool
+ExpandQuarkTable(void)
+{
+    unsigned long oldmask, newmask;
+    register char c, *s;
+    register Entry *oldentries, *entries;
+    register Entry entry;
+    register int oldidx, newidx, rehash;
+    Signature sig;
+    XrmQuark q;
+
+    oldentries = quarkTable;
+    if ((oldmask = quarkMask))
+       newmask = (oldmask << 1) + 1;
+    else {
+       if (!stringTable) {
+           stringTable = (XrmString **)Xmalloc(sizeof(XrmString *) *
+                                               CHUNKPER);
+           if (!stringTable)
+               return False;
+           stringTable[0] = (XrmString *)NULL;
+       }
+#ifdef PERMQ
+       if (!permTable)
+           permTable = (Bits **)Xmalloc(sizeof(Bits *) * CHUNKPER);
+       if (!permTable)
+           return False;
+#endif
+       stringTable[0] = (XrmString *)Xpermalloc(QUANTSIZE);
+       if (!stringTable[0])
+           return False;
+#ifdef PERMQ
+       permTable[0] = (Bits *)((char *)stringTable[0] + STRQUANTSIZE);
+#endif
+       newmask = 0x1ff;
+    }
+    entries = Xcalloc(newmask + 1, sizeof(Entry));
+    if (!entries)
+       return False;
+    quarkTable = entries;
+    quarkMask = newmask;
+    quarkRehash = quarkMask - 2;
+    for (oldidx = 0; oldidx <= oldmask; oldidx++) {
+       if ((entry = oldentries[oldidx])) {
+           if (entry & LARGEQUARK)
+               q = entry & (LARGEQUARK-1);
+           else
+               q = (entry >> QUARKSHIFT) & QUARKMASK;
+           for (sig = 0, s = NAME(q); (c = *s++); )
+               sig = (sig << 1) + c;
+           newidx = HASH(sig);
+           if (entries[newidx]) {
+               rehash = REHASHVAL(sig);
+               do {
+                   newidx = REHASH(newidx, rehash);
+               } while (entries[newidx]);
+           }
+           entries[newidx] = entry;
+       }
+    }
+    if (oldmask)
+       Xfree((char *)oldentries);
+    return True;
+}
+
+XrmQuark
+_XrmInternalStringToQuark(
+    register _Xconst char *name, register int len, register Signature sig,
+    Bool permstring)
+{
+    register XrmQuark q;
+    register Entry entry;
+    register int idx, rehash;
+    register int i;
+    register char *s1, *s2;
+    char *new;
+
+    rehash = 0;
+    idx = HASH(sig);
+    _XLockMutex(_Xglobal_lock);
+    while ((entry = quarkTable[idx])) {
+       if (entry & LARGEQUARK)
+           q = entry & (LARGEQUARK-1);
+       else {
+           if ((entry - sig) & XSIGMASK)
+               goto nomatch;
+           q = (entry >> QUARKSHIFT) & QUARKMASK;
+       }
+       for (i = len, s1 = (char *)name, s2 = NAME(q); --i >= 0; ) {
+           if (*s1++ != *s2++)
+               goto nomatch;
+       }
+       if (*s2) {
+nomatch:    if (!rehash)
+               rehash = REHASHVAL(sig);
+           idx = REHASH(idx, rehash);
+           continue;
+       }
+#ifdef PERMQ
+       if (permstring && !ISPERM(q)) {
+           Xfree(NAME(q));
+           NAME(q) = (char *)name;
+           SETPERM(q);
+       }
+#endif
+       _XUnlockMutex(_Xglobal_lock);
+       return q;
+    }
+    if (nextUniq == nextQuark)
+       goto fail;
+    if ((nextQuark + (nextQuark >> 2)) > quarkMask) {
+       if (!ExpandQuarkTable())
+           goto fail;
+       _XUnlockMutex(_Xglobal_lock);
+       return _XrmInternalStringToQuark(name, len, sig, permstring);
+    }
+    q = nextQuark;
+    if (!(q & QUANTUMMASK)) {
+       if (!(q & CHUNKMASK)) {
+           if (!(new = Xrealloc((char *)stringTable,
+                                sizeof(XrmString *) *
+                                ((q >> QUANTUMSHIFT) + CHUNKPER))))
+               goto fail;
+           stringTable = (XrmString **)new;
+#ifdef PERMQ
+           if (!(new = Xrealloc((char *)permTable,
+                                sizeof(Bits *) *
+                                ((q >> QUANTUMSHIFT) + CHUNKPER))))
+               goto fail;
+           permTable = (Bits **)new;
+#endif
+       }
+       new = Xpermalloc(QUANTSIZE);
+       if (!new)
+           goto fail;
+       stringTable[q >> QUANTUMSHIFT] = (XrmString *)new;
+#ifdef PERMQ
+       permTable[q >> QUANTUMSHIFT] = (Bits *)(new + STRQUANTSIZE);
+#endif
+    }
+    if (!permstring) {
+       s2 = (char *)name;
+#ifdef PERMQ
+       name = Xmalloc(len+1);
+#else
+       name = permalloc(len+1);
+#endif
+       if (!name)
+           goto fail;
+       for (i = len, s1 = (char *)name; --i >= 0; )
+           *s1++ = *s2++;
+       *s1++ = '\0';
+#ifdef PERMQ
+       CLEARPERM(q);
+    }
+    else {
+       SETPERM(q);
+#endif
+    }
+    NAME(q) = (char *)name;
+    if (q <= QUARKMASK)
+       entry = (q << QUARKSHIFT) | (sig & XSIGMASK);
+    else
+       entry = q | LARGEQUARK;
+    quarkTable[idx] = entry;
+    nextQuark++;
+    _XUnlockMutex(_Xglobal_lock);
+    return q;
+ fail:
+    _XUnlockMutex(_Xglobal_lock);
+    return NULLQUARK;
+}
+
+XrmQuark
+XrmStringToQuark(
+    _Xconst char *name)
+{
+    register char c, *tname;
+    register Signature sig = 0;
+
+    if (!name)
+       return (NULLQUARK);
+
+    for (tname = (char *)name; (c = *tname++); )
+       sig = (sig << 1) + c;
+
+    return _XrmInternalStringToQuark(name, tname-(char *)name-1, sig, False);
+}
+
+XrmQuark
+XrmPermStringToQuark(
+    _Xconst char *name)
+{
+    register char c, *tname;
+    register Signature sig = 0;
+
+    if (!name)
+       return (NULLQUARK);
+
+    for (tname = (char *)name; (c = *tname++); )
+       sig = (sig << 1) + c;
+
+    return _XrmInternalStringToQuark(name, tname-(char *)name-1, sig, True);
+}
+
+XrmQuark XrmUniqueQuark(void)
+{
+    XrmQuark q;
+
+    _XLockMutex(_Xglobal_lock);
+    if (nextUniq == nextQuark)
+       q = NULLQUARK;
+    else
+       q = nextUniq--;
+    _XUnlockMutex(_Xglobal_lock);
+    return q;
+}
+
+XrmString XrmQuarkToString(register XrmQuark quark)
+{
+    XrmString s;
+
+    _XLockMutex(_Xglobal_lock);
+    if (quark <= 0 || quark >= nextQuark)
+       s = NULLSTRING;
+    else {
+#ifdef PERMQ
+       /* We have to mark the quark as permanent, since the caller might hold
+        * onto the string pointer forver.
+        */
+       SETPERM(quark);
+#endif
+       s = NAME(quark);
+    }
+    _XUnlockMutex(_Xglobal_lock);
+    return s;
+}
diff --git a/src/RaiseWin.c b/src/RaiseWin.c
new file mode 100644 (file)
index 0000000..f431db5
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XRaiseWindow (
+    register Display *dpy,
+    Window w)
+{
+    register xConfigureWindowReq *req;
+    unsigned long val = Above;         /* needed for macro below */
+
+    LockDisplay(dpy);
+    GetReqExtra(ConfigureWindow, 4, req);
+    req->window = w;
+    req->mask = CWStackMode;
+    OneDataCard32 (dpy, NEXTPTR(req,xConfigureWindowReq), val);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/RdBitF.c b/src/RdBitF.c
new file mode 100644 (file)
index 0000000..ab7d800
--- /dev/null
@@ -0,0 +1,261 @@
+/*
+
+Copyright 1987, 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.
+
+*/
+
+/*
+ *     Code to read bitmaps from disk files. Interprets
+ *     data from X10 and X11 bitmap files and creates
+ *     Pixmap representations of files. Returns Pixmap
+ *     ID and specifics about image.
+ *
+ *     Modified for speedup by Jim Becker, changed image
+ *     data parsing logic (removed some fscanf()s).
+ *     Aug 5, 1988
+ *
+ * Note that this file and ../Xmu/RdBitF.c look very similar....  Keep them
+ * that way (but don't use common source code so that people can have one
+ * without the other).
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include <X11/Xos.h>
+#include "Xutil.h"
+#include <stdio.h>
+#include <ctype.h>
+
+
+#define MAX_SIZE 255
+
+/* shared data for the image read/parse logic */
+static const short hexTable[256] = {
+    ['0'] = 0,  ['1'] = 1,
+    ['2'] = 2,  ['3'] = 3,
+    ['4'] = 4,  ['5'] = 5,
+    ['6'] = 6,  ['7'] = 7,
+    ['8'] = 8,  ['9'] = 9,
+    ['A'] = 10, ['B'] = 11,
+    ['C'] = 12, ['D'] = 13,
+    ['E'] = 14, ['F'] = 15,
+    ['a'] = 10, ['b'] = 11,
+    ['c'] = 12, ['d'] = 13,
+    ['e'] = 14, ['f'] = 15,
+
+    [' '] = -1, [','] = -1,
+    ['}'] = -1, ['\n'] = -1,
+    ['\t'] = -1
+};
+
+/*
+ *     read next hex value in the input stream, return -1 if EOF
+ */
+static int
+NextInt (
+    FILE *fstream)
+{
+    int        ch;
+    int        value = 0;
+    int gotone = 0;
+    int done = 0;
+
+    /* loop, accumulate hex value until find delimiter  */
+    /* skip any initial delimiters found in read stream */
+
+    while (!done) {
+       ch = getc(fstream);
+       if (ch == EOF) {
+           value       = -1;
+           done++;
+       } else {
+           /* trim high bits, check type and accumulate */
+           ch &= 0xff;
+           if (isascii(ch) && isxdigit(ch)) {
+               value = (value << 4) + hexTable[ch];
+               gotone++;
+           } else if ((hexTable[ch]) < 0 && gotone)
+             done++;
+       }
+    }
+    return value;
+}
+
+int
+XReadBitmapFileData (
+    _Xconst char *filename,
+    unsigned int *width,                /* RETURNED */
+    unsigned int *height,               /* RETURNED */
+    unsigned char **data,               /* RETURNED */
+    int *x_hot,                         /* RETURNED */
+    int *y_hot)                         /* RETURNED */
+{
+    FILE *fstream;                     /* handle on file  */
+    unsigned char *bits = NULL;                /* working variable */
+    char line[MAX_SIZE];               /* input line from file */
+    int size;                          /* number of bytes of data */
+    char name_and_type[MAX_SIZE];      /* an input line */
+    char *type;                                /* for parsing */
+    int value;                         /* from an input line */
+    int version10p;                    /* boolean, old format */
+    int padding;                       /* to handle alignment */
+    int bytes_per_line;                        /* per scanline of data */
+    unsigned int ww = 0;               /* width */
+    unsigned int hh = 0;               /* height */
+    int hx = -1;                       /* x hotspot */
+    int hy = -1;                       /* y hotspot */
+
+#ifdef __UNIXOS2__
+    filename = __XOS2RedirRoot(filename);
+#endif
+    if (!(fstream = fopen(filename, "r")))
+       return BitmapOpenFailed;
+
+    /* error cleanup and return macro  */
+#define        RETURN(code) \
+{ if (bits) Xfree ((char *)bits); fclose (fstream); return code; }
+
+    while (fgets(line, MAX_SIZE, fstream)) {
+       if (strlen(line) == MAX_SIZE-1)
+           RETURN (BitmapFileInvalid);
+       if (sscanf(line,"#define %s %d",name_and_type,&value) == 2) {
+           if (!(type = strrchr(name_and_type, '_')))
+             type = name_and_type;
+           else
+             type++;
+
+           if (!strcmp("width", type))
+             ww = (unsigned int) value;
+           if (!strcmp("height", type))
+             hh = (unsigned int) value;
+           if (!strcmp("hot", type)) {
+               if (type-- == name_and_type || type-- == name_and_type)
+                 continue;
+               if (!strcmp("x_hot", type))
+                 hx = value;
+               if (!strcmp("y_hot", type))
+                 hy = value;
+           }
+           continue;
+       }
+
+       if (sscanf(line, "static short %s = {", name_and_type) == 1)
+         version10p = 1;
+       else if (sscanf(line,"static unsigned char %s = {",name_and_type) == 1)
+         version10p = 0;
+       else if (sscanf(line, "static char %s = {", name_and_type) == 1)
+         version10p = 0;
+       else
+         continue;
+
+       if (!(type = strrchr(name_and_type, '_')))
+         type = name_and_type;
+       else
+         type++;
+
+       if (strcmp("bits[]", type))
+         continue;
+
+       if (!ww || !hh)
+         RETURN (BitmapFileInvalid);
+
+       if ((ww % 16) && ((ww % 16) < 9) && version10p)
+         padding = 1;
+       else
+         padding = 0;
+
+       bytes_per_line = (ww+7)/8 + padding;
+
+       size = bytes_per_line * hh;
+       bits = (unsigned char *) Xmalloc ((unsigned int) size);
+       if (!bits)
+         RETURN (BitmapNoMemory);
+
+       if (version10p) {
+           unsigned char *ptr;
+           int bytes;
+
+           for (bytes=0, ptr=bits; bytes<size; (bytes += 2)) {
+               if ((value = NextInt(fstream)) < 0)
+                 RETURN (BitmapFileInvalid);
+               *(ptr++) = value;
+               if (!padding || ((bytes+2) % bytes_per_line))
+                 *(ptr++) = value >> 8;
+           }
+       } else {
+           unsigned char *ptr;
+           int bytes;
+
+           for (bytes=0, ptr=bits; bytes<size; bytes++, ptr++) {
+               if ((value = NextInt(fstream)) < 0)
+                 RETURN (BitmapFileInvalid);
+               *ptr=value;
+           }
+       }
+
+       /* If we got to this point, we read a full bitmap file. Break so we don't
+        * start reading another one from the same file and leak the memory
+        * allocated for the previous one. */
+       break;
+    }                                  /* end while */
+
+    fclose(fstream);
+    if (!bits)
+       return (BitmapFileInvalid);
+
+    *data = bits;
+    *width = ww;
+    *height = hh;
+    if (x_hot) *x_hot = hx;
+    if (y_hot) *y_hot = hy;
+
+    return (BitmapSuccess);
+}
+
+int
+XReadBitmapFile (
+    Display *display,
+    Drawable d,
+    _Xconst char *filename,
+    unsigned int *width,                /* RETURNED */
+    unsigned int *height,               /* RETURNED */
+    Pixmap *pixmap,                     /* RETURNED */
+    int *x_hot,                         /* RETURNED */
+    int *y_hot)                         /* RETURNED */
+{
+    unsigned char *data;
+    int res;
+
+    res = XReadBitmapFileData(filename, width, height, &data, x_hot, y_hot);
+    if (res != BitmapSuccess)
+       return res;
+    *pixmap = XCreateBitmapFromData(display, d, (char *)data, *width, *height);
+    Xfree((char *)data);
+    if (*pixmap == None)
+       return (BitmapNoMemory);
+    return (BitmapSuccess);
+}
diff --git a/src/RecolorC.c b/src/RecolorC.c
new file mode 100644 (file)
index 0000000..a54b48c
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XRecolorCursor(
+     register Display *dpy,
+     Cursor cursor,
+     XColor *foreground,
+     XColor *background)
+{
+    register xRecolorCursorReq *req;
+
+    LockDisplay(dpy);
+    GetReq(RecolorCursor, req);
+    req->cursor = cursor;
+    req->foreRed = foreground->red;
+    req->foreGreen = foreground->green;
+    req->foreBlue = foreground->blue;
+    req->backRed = background->red;
+    req->backGreen = background->green;
+    req->backBlue = background->blue;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/ReconfWM.c b/src/ReconfWM.c
new file mode 100644 (file)
index 0000000..1776f2e
--- /dev/null
@@ -0,0 +1,139 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+#define AllMaskBits (CWX|CWY|CWWidth|CWHeight|\
+                     CWBorderWidth|CWSibling|CWStackMode)
+
+Status XReconfigureWMWindow (
+    register Display *dpy,
+    Window w,
+    int screen,
+    unsigned int mask,
+    XWindowChanges *changes)
+{
+    XConfigureRequestEvent ev;
+    Window root = RootWindow (dpy, screen);
+    _XAsyncHandler async;
+    _XAsyncErrorState async_state;
+
+    /*
+     * Only need to go through the trouble if we are actually changing the
+     * stacking mode.
+     */
+    if (!(mask & CWStackMode)) {
+       XConfigureWindow (dpy, w, mask, changes);
+       return True;
+    }
+
+
+    /*
+     * We need to inline XConfigureWindow and XSync so that everything is done
+     * while the display is locked.
+     */
+
+    LockDisplay(dpy);
+
+    /*
+     * XConfigureWindow (dpy, w, mask, changes);
+     */
+    {
+       unsigned long values[7];
+       register unsigned long *value = values;
+       long nvalues;
+       register xConfigureWindowReq *req;
+
+       GetReq(ConfigureWindow, req);
+
+       async_state.min_sequence_number = dpy->request;
+       async_state.max_sequence_number = dpy->request;
+       async_state.error_code = BadMatch;
+       async_state.major_opcode = X_ConfigureWindow;
+       async_state.minor_opcode = 0;
+       async_state.error_count = 0;
+       async.next = dpy->async_handlers;
+       async.handler = _XAsyncErrorHandler;
+       async.data = (XPointer)&async_state;
+       dpy->async_handlers = &async;
+
+       req->window = w;
+       mask &= AllMaskBits;
+       req->mask = mask;
+
+       if (mask & CWX) *value++ = changes->x;
+       if (mask & CWY) *value++ = changes->y;
+       if (mask & CWWidth) *value++ = changes->width;
+       if (mask & CWHeight) *value++ = changes->height;
+       if (mask & CWBorderWidth) *value++ = changes->border_width;
+       if (mask & CWSibling) *value++ = changes->sibling;
+       if (mask & CWStackMode) *value++ = changes->stack_mode;
+       req->length += (nvalues = value - values);
+       nvalues <<= 2;                  /* watch out for macros... */
+       Data32 (dpy, (long *) values, nvalues);
+    }
+
+    /*
+     * XSync (dpy, 0)
+     */
+    {
+       xGetInputFocusReply rep;
+       register xReq *req;
+
+       GetEmptyReq(GetInputFocus, req);
+       (void) _XReply (dpy, (xReply *)&rep, 0, xTrue);
+    }
+
+    DeqAsyncHandler(dpy, &async);
+    UnlockDisplay(dpy);
+    SyncHandle();
+
+
+    /*
+     * If the request succeeded, then everything is okay; otherwise, send event
+     */
+    if (!async_state.error_count) return True;
+
+    ev.type            = ConfigureRequest;
+    ev.window          = w;
+    ev.parent          = root;
+    ev.value_mask      = (mask & AllMaskBits);
+    ev.x               = changes->x;
+    ev.y               = changes->y;
+    ev.width           = changes->width;
+    ev.height          = changes->height;
+    ev.border_width    = changes->border_width;
+    ev.above           = changes->sibling;
+    ev.detail          = changes->stack_mode;
+    return (XSendEvent (dpy, root, False,
+                       SubstructureRedirectMask|SubstructureNotifyMask,
+                       (XEvent *)&ev));
+}
diff --git a/src/ReconfWin.c b/src/ReconfWin.c
new file mode 100644 (file)
index 0000000..bfa99f5
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+#define AllMaskBits (CWX|CWY|CWWidth|CWHeight|\
+                    CWBorderWidth|CWSibling|CWStackMode)
+
+int
+XConfigureWindow(
+    register Display *dpy,
+    Window w,
+    unsigned int mask,
+    XWindowChanges *changes)
+{
+    unsigned long values[7];
+    register unsigned long *value = values;
+    long nvalues;
+    register xConfigureWindowReq *req;
+
+    LockDisplay(dpy);
+    GetReq(ConfigureWindow, req);
+    req->window = w;
+    mask &= AllMaskBits;
+    req->mask = mask;
+
+    if (mask & CWX)
+       *value++ = changes->x;
+
+    if (mask & CWY)
+       *value++ = changes->y;
+
+    if (mask & CWWidth)
+       *value++ = changes->width;
+
+    if (mask & CWHeight)
+       *value++ = changes->height;
+
+    if (mask & CWBorderWidth)
+       *value++ = changes->border_width;
+
+    if (mask & CWSibling)
+       *value++ = changes->sibling;
+
+    if (mask & CWStackMode)
+        *value++ = changes->stack_mode;
+
+    req->length += (nvalues = value - values);
+
+    nvalues <<= 2;                     /* watch out for macros... */
+    Data32 (dpy, (long *) values, nvalues);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+    }
diff --git a/src/Region.c b/src/Region.c
new file mode 100644 (file)
index 0000000..41047b2
--- /dev/null
@@ -0,0 +1,1604 @@
+/************************************************************************
+
+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.
+
+************************************************************************/
+/*
+ * The functions in this file implement the Region abstraction, similar to one
+ * used in the X11 sample server. A Region is simply an area, as the name
+ * implies, and is implemented as a "y-x-banded" array of rectangles. To
+ * explain: Each Region is made up of a certain number of rectangles sorted
+ * by y coordinate first, and then by x coordinate.
+ *
+ * Furthermore, the rectangles are banded such that every rectangle with a
+ * given upper-left y coordinate (y1) will have the same lower-right y
+ * coordinate (y2) and vice versa. If a rectangle has scanlines in a band, it
+ * will span the entire vertical distance of the band. This means that some
+ * areas that could be merged into a taller rectangle will be represented as
+ * several shorter rectangles to account for shorter rectangles to its left
+ * or right but within its "vertical scope".
+ *
+ * An added constraint on the rectangles is that they must cover as much
+ * horizontal area as possible. E.g. no two rectangles in a band are allowed
+ * to touch.
+ *
+ * Whenever possible, bands will be merged together to cover a greater vertical
+ * distance (and thus reduce the number of rectangles). Two bands can be merged
+ * only if the bottom of one touches the top of the other and they have
+ * rectangles in the same places (of the same width, of course). This maintains
+ * the y-x-banding that's so nice to have...
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xutil.h"
+#include <X11/Xregion.h>
+#include "poly.h"
+
+#ifdef DEBUG
+#include <stdio.h>
+#define assert(expr) {if (!(expr)) fprintf(stderr,\
+"Assertion failed file %s, line %d: expr\n", __FILE__, __LINE__); }
+#else
+#define assert(expr)
+#endif
+
+typedef int (*overlapProcp)(
+        register Region     pReg,
+        register BoxPtr     r1,
+        BoxPtr              r1End,
+        register BoxPtr     r2,
+        BoxPtr              r2End,
+        short               y1,
+        short               y2);
+
+typedef int (*nonOverlapProcp)(
+    register Region     pReg,
+    register BoxPtr     r,
+    BoxPtr              rEnd,
+    register short      y1,
+    register short      y2);
+
+static void miRegionOp(
+    register Region    newReg,                 /* Place to store result */
+    Region             reg1,                   /* First region in operation */
+    Region             reg2,                   /* 2d region in operation */
+    int                (*overlapFunc)(
+        register Region     pReg,
+        register BoxPtr     r1,
+        BoxPtr              r1End,
+        register BoxPtr     r2,
+        BoxPtr              r2End,
+        short               y1,
+        short               y2),                /* Function to call for over-
+                                                * lapping bands */
+    int                (*nonOverlap1Func)(
+        register Region     pReg,
+        register BoxPtr     r,
+        BoxPtr              rEnd,
+        register short      y1,
+        register short      y2),                /* Function to call for non-
+                                                * overlapping bands in region
+                                                * 1 */
+    int                (*nonOverlap2Func)(
+        register Region     pReg,
+        register BoxPtr     r,
+        BoxPtr              rEnd,
+        register short      y1,
+        register short      y2));               /* Function to call for non-
+                                                * overlapping bands in region
+                                                * 2 */
+
+
+/*     Create a new empty region       */
+Region
+XCreateRegion(void)
+{
+    Region temp;
+
+    if (! (temp = ( Region )Xmalloc( (unsigned) sizeof( REGION ))))
+       return (Region) NULL;
+    if (! (temp->rects = ( BOX * )Xmalloc( (unsigned) sizeof( BOX )))) {
+       Xfree((char *) temp);
+       return (Region) NULL;
+    }
+    temp->numRects = 0;
+    temp->extents.x1 = 0;
+    temp->extents.y1 = 0;
+    temp->extents.x2 = 0;
+    temp->extents.y2 = 0;
+    temp->size = 1;
+    return( temp );
+}
+
+int
+XClipBox(
+    Region r,
+    XRectangle *rect)
+{
+    rect->x = r->extents.x1;
+    rect->y = r->extents.y1;
+    rect->width = r->extents.x2 - r->extents.x1;
+    rect->height = r->extents.y2 - r->extents.y1;
+    return 1;
+}
+
+int
+XUnionRectWithRegion(
+    register XRectangle *rect,
+    Region source, Region dest)
+{
+    REGION region;
+
+    if (!rect->width || !rect->height)
+       return 0;
+    region.rects = &region.extents;
+    region.numRects = 1;
+    region.extents.x1 = rect->x;
+    region.extents.y1 = rect->y;
+    region.extents.x2 = rect->x + rect->width;
+    region.extents.y2 = rect->y + rect->height;
+    region.size = 1;
+
+    return XUnionRegion(&region, source, dest);
+}
+
+/*-
+ *-----------------------------------------------------------------------
+ * miSetExtents --
+ *     Reset the extents of a region to what they should be. Called by
+ *     miSubtract and miIntersect b/c they can't figure it out along the
+ *     way or do so easily, as miUnion can.
+ *
+ * Results:
+ *     None.
+ *
+ * Side Effects:
+ *     The region's 'extents' structure is overwritten.
+ *
+ *-----------------------------------------------------------------------
+ */
+static void
+miSetExtents (
+    Region             pReg)
+{
+    register BoxPtr    pBox,
+                       pBoxEnd,
+                       pExtents;
+
+    if (pReg->numRects == 0)
+    {
+       pReg->extents.x1 = 0;
+       pReg->extents.y1 = 0;
+       pReg->extents.x2 = 0;
+       pReg->extents.y2 = 0;
+       return;
+    }
+
+    pExtents = &pReg->extents;
+    pBox = pReg->rects;
+    pBoxEnd = &pBox[pReg->numRects - 1];
+
+    /*
+     * Since pBox is the first rectangle in the region, it must have the
+     * smallest y1 and since pBoxEnd is the last rectangle in the region,
+     * it must have the largest y2, because of banding. Initialize x1 and
+     * x2 from  pBox and pBoxEnd, resp., as good things to initialize them
+     * to...
+     */
+    pExtents->x1 = pBox->x1;
+    pExtents->y1 = pBox->y1;
+    pExtents->x2 = pBoxEnd->x2;
+    pExtents->y2 = pBoxEnd->y2;
+
+    assert(pExtents->y1 < pExtents->y2);
+    while (pBox <= pBoxEnd)
+    {
+       if (pBox->x1 < pExtents->x1)
+       {
+           pExtents->x1 = pBox->x1;
+       }
+       if (pBox->x2 > pExtents->x2)
+       {
+           pExtents->x2 = pBox->x2;
+       }
+       pBox++;
+    }
+    assert(pExtents->x1 < pExtents->x2);
+}
+
+int
+XSetRegion(
+    Display *dpy,
+    GC gc,
+    register Region r)
+{
+    register int i;
+    register XRectangle *xr, *pr;
+    register BOX *pb;
+    unsigned long total;
+
+    LockDisplay (dpy);
+    total = r->numRects * sizeof (XRectangle);
+    if ((xr = (XRectangle *) _XAllocTemp(dpy, total))) {
+       for (pr = xr, pb = r->rects, i = r->numRects; --i >= 0; pr++, pb++) {
+           pr->x = pb->x1;
+           pr->y = pb->y1;
+           pr->width = pb->x2 - pb->x1;
+           pr->height = pb->y2 - pb->y1;
+       }
+    }
+    if (xr || !r->numRects)
+       _XSetClipRectangles(dpy, gc, 0, 0, xr, r->numRects, YXBanded);
+    if (xr)
+       _XFreeTemp(dpy, (char *)xr, total);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
+int
+XDestroyRegion(
+    Region r)
+{
+    Xfree( (char *) r->rects );
+    Xfree( (char *) r );
+    return 1;
+}
+
+
+/* TranslateRegion(pRegion, x, y)
+   translates in place
+   added by raymond
+*/
+
+int
+XOffsetRegion(
+    register Region pRegion,
+    register int x,
+    register int y)
+{
+    register int nbox;
+    register BOX *pbox;
+
+    pbox = pRegion->rects;
+    nbox = pRegion->numRects;
+
+    while(nbox--)
+    {
+       pbox->x1 += x;
+       pbox->x2 += x;
+       pbox->y1 += y;
+       pbox->y2 += y;
+       pbox++;
+    }
+    pRegion->extents.x1 += x;
+    pRegion->extents.x2 += x;
+    pRegion->extents.y1 += y;
+    pRegion->extents.y2 += y;
+    return 1;
+}
+
+/*
+   Utility procedure Compress:
+   Replace r by the region r', where
+     p in r' iff (Quantifer m <= dx) (p + m in r), and
+     Quantifier is Exists if grow is TRUE, For all if grow is FALSE, and
+     (x,y) + m = (x+m,y) if xdir is TRUE; (x,y+m) if xdir is FALSE.
+
+   Thus, if xdir is TRUE and grow is FALSE, r is replaced by the region
+   of all points p such that p and the next dx points on the same
+   horizontal scan line are all in r.  We do this using by noting
+   that p is the head of a run of length 2^i + k iff p is the head
+   of a run of length 2^i and p+2^i is the head of a run of length
+   k. Thus, the loop invariant: s contains the region corresponding
+   to the runs of length shift.  r contains the region corresponding
+   to the runs of length 1 + dxo & (shift-1), where dxo is the original
+   value of dx.  dx = dxo & ~(shift-1).  As parameters, s and t are
+   scratch regions, so that we don't have to allocate them on every
+   call.
+*/
+
+#define ZOpRegion(a,b,c) if (grow) XUnionRegion(a,b,c); \
+                        else XIntersectRegion(a,b,c)
+#define ZShiftRegion(a,b) if (xdir) XOffsetRegion(a,b,0); \
+                         else XOffsetRegion(a,0,b)
+#define ZCopyRegion(a,b) XUnionRegion(a,a,b)
+
+static void
+Compress(
+    Region r, Region s, Region t,
+    register unsigned dx,
+    register int xdir, register int grow)
+{
+    register unsigned shift = 1;
+
+    ZCopyRegion(r, s);
+    while (dx) {
+        if (dx & shift) {
+            ZShiftRegion(r, -(int)shift);
+            ZOpRegion(r, s, r);
+            dx -= shift;
+            if (!dx) break;
+        }
+        ZCopyRegion(s, t);
+        ZShiftRegion(s, -(int)shift);
+        ZOpRegion(s, t, s);
+        shift <<= 1;
+    }
+}
+
+#undef ZOpRegion
+#undef ZShiftRegion
+#undef ZCopyRegion
+
+int
+XShrinkRegion(
+    Region r,
+    int dx, int dy)
+{
+    Region s, t;
+    int grow;
+
+    if (!dx && !dy) return 0;
+    if (! (s = XCreateRegion()) )
+       return 0;
+    if (! (t = XCreateRegion()) ) {
+       XDestroyRegion(s);
+       return 0;
+    }
+    if ((grow = (dx < 0))) dx = -dx;
+    if (dx) Compress(r, s, t, (unsigned) 2*dx, TRUE, grow);
+    if ((grow = (dy < 0))) dy = -dy;
+    if (dy) Compress(r, s, t, (unsigned) 2*dy, FALSE, grow);
+    XOffsetRegion(r, dx, dy);
+    XDestroyRegion(s);
+    XDestroyRegion(t);
+    return 0;
+}
+
+\f
+/*======================================================================
+ *         Region Intersection
+ *====================================================================*/
+/*-
+ *-----------------------------------------------------------------------
+ * miIntersectO --
+ *     Handle an overlapping band for miIntersect.
+ *
+ * Results:
+ *     None.
+ *
+ * Side Effects:
+ *     Rectangles may be added to the region.
+ *
+ *-----------------------------------------------------------------------
+ */
+/* static void*/
+static int
+miIntersectO (
+    register Region    pReg,
+    register BoxPtr    r1,
+    BoxPtr             r1End,
+    register BoxPtr    r2,
+    BoxPtr             r2End,
+    short              y1,
+    short              y2)
+{
+    register short     x1;
+    register short     x2;
+    register BoxPtr    pNextRect;
+
+    pNextRect = &pReg->rects[pReg->numRects];
+
+    while ((r1 != r1End) && (r2 != r2End))
+    {
+       x1 = max(r1->x1,r2->x1);
+       x2 = min(r1->x2,r2->x2);
+
+       /*
+        * If there's any overlap between the two rectangles, add that
+        * overlap to the new region.
+        * There's no need to check for subsumption because the only way
+        * such a need could arise is if some region has two rectangles
+        * right next to each other. Since that should never happen...
+        */
+       if (x1 < x2)
+       {
+           assert(y1<y2);
+
+           MEMCHECK(pReg, pNextRect, pReg->rects);
+           pNextRect->x1 = x1;
+           pNextRect->y1 = y1;
+           pNextRect->x2 = x2;
+           pNextRect->y2 = y2;
+           pReg->numRects += 1;
+           pNextRect++;
+           assert(pReg->numRects <= pReg->size);
+       }
+
+       /*
+        * Need to advance the pointers. Shift the one that extends
+        * to the right the least, since the other still has a chance to
+        * overlap with that region's next rectangle, if you see what I mean.
+        */
+       if (r1->x2 < r2->x2)
+       {
+           r1++;
+       }
+       else if (r2->x2 < r1->x2)
+       {
+           r2++;
+       }
+       else
+       {
+           r1++;
+           r2++;
+       }
+    }
+    return 0;  /* lint */
+}
+
+int
+XIntersectRegion(
+    Region             reg1,
+    Region             reg2,          /* source regions     */
+    register Region    newReg)               /* destination Region */
+{
+   /* check for trivial reject */
+    if ( (!(reg1->numRects)) || (!(reg2->numRects))  ||
+       (!EXTENTCHECK(&reg1->extents, &reg2->extents)))
+        newReg->numRects = 0;
+    else
+       miRegionOp (newReg, reg1, reg2,
+               miIntersectO, NULL, NULL);
+
+    /*
+     * Can't alter newReg's extents before we call miRegionOp because
+     * it might be one of the source regions and miRegionOp depends
+     * on the extents of those regions being the same. Besides, this
+     * way there's no checking against rectangles that will be nuked
+     * due to coalescing, so we have to examine fewer rectangles.
+     */
+    miSetExtents(newReg);
+    return 1;
+}
+
+static void
+miRegionCopy(
+    register Region dstrgn,
+    register Region rgn)
+
+{
+    if (dstrgn != rgn) /*  don't want to copy to itself */
+    {
+        if (dstrgn->size < rgn->numRects)
+        {
+            if (dstrgn->rects)
+            {
+               BOX *prevRects = dstrgn->rects;
+
+                if (! (dstrgn->rects = (BOX *)
+                      Xrealloc((char *) dstrgn->rects,
+                               (unsigned) rgn->numRects * (sizeof(BOX))))) {
+                   Xfree(prevRects);
+                   return;
+               }
+            }
+            dstrgn->size = rgn->numRects;
+       }
+        dstrgn->numRects = rgn->numRects;
+        dstrgn->extents.x1 = rgn->extents.x1;
+        dstrgn->extents.y1 = rgn->extents.y1;
+        dstrgn->extents.x2 = rgn->extents.x2;
+        dstrgn->extents.y2 = rgn->extents.y2;
+
+       memcpy((char *) dstrgn->rects, (char *) rgn->rects,
+              (int) (rgn->numRects * sizeof(BOX)));
+    }
+}
+
+/*======================================================================
+ *         Generic Region Operator
+ *====================================================================*/
+
+/*-
+ *-----------------------------------------------------------------------
+ * miCoalesce --
+ *     Attempt to merge the boxes in the current band with those in the
+ *     previous one. Used only by miRegionOp.
+ *
+ * Results:
+ *     The new index for the previous band.
+ *
+ * Side Effects:
+ *     If coalescing takes place:
+ *         - rectangles in the previous band will have their y2 fields
+ *           altered.
+ *         - pReg->numRects will be decreased.
+ *
+ *-----------------------------------------------------------------------
+ */
+/* static int*/
+static int
+miCoalesce(
+    register Region    pReg,           /* Region to coalesce */
+    int                        prevStart,      /* Index of start of previous band */
+    int                        curStart)       /* Index of start of current band */
+{
+    register BoxPtr    pPrevBox;       /* Current box in previous band */
+    register BoxPtr    pCurBox;        /* Current box in current band */
+    register BoxPtr    pRegEnd;        /* End of region */
+    int                        curNumRects;    /* Number of rectangles in current
+                                        * band */
+    int                        prevNumRects;   /* Number of rectangles in previous
+                                        * band */
+    int                        bandY1;         /* Y1 coordinate for current band */
+
+    pRegEnd = &pReg->rects[pReg->numRects];
+
+    pPrevBox = &pReg->rects[prevStart];
+    prevNumRects = curStart - prevStart;
+
+    /*
+     * Figure out how many rectangles are in the current band. Have to do
+     * this because multiple bands could have been added in miRegionOp
+     * at the end when one region has been exhausted.
+     */
+    pCurBox = &pReg->rects[curStart];
+    bandY1 = pCurBox->y1;
+    for (curNumRects = 0;
+        (pCurBox != pRegEnd) && (pCurBox->y1 == bandY1);
+        curNumRects++)
+    {
+       pCurBox++;
+    }
+
+    if (pCurBox != pRegEnd)
+    {
+       /*
+        * If more than one band was added, we have to find the start
+        * of the last band added so the next coalescing job can start
+        * at the right place... (given when multiple bands are added,
+        * this may be pointless -- see above).
+        */
+       pRegEnd--;
+       while (pRegEnd[-1].y1 == pRegEnd->y1)
+       {
+           pRegEnd--;
+       }
+       curStart = pRegEnd - pReg->rects;
+       pRegEnd = pReg->rects + pReg->numRects;
+    }
+
+    if ((curNumRects == prevNumRects) && (curNumRects != 0)) {
+       pCurBox -= curNumRects;
+       /*
+        * The bands may only be coalesced if the bottom of the previous
+        * matches the top scanline of the current.
+        */
+       if (pPrevBox->y2 == pCurBox->y1)
+       {
+           /*
+            * Make sure the bands have boxes in the same places. This
+            * assumes that boxes have been added in such a way that they
+            * cover the most area possible. I.e. two boxes in a band must
+            * have some horizontal space between them.
+            */
+           do
+           {
+               if ((pPrevBox->x1 != pCurBox->x1) ||
+                   (pPrevBox->x2 != pCurBox->x2))
+               {
+                   /*
+                    * The bands don't line up so they can't be coalesced.
+                    */
+                   return (curStart);
+               }
+               pPrevBox++;
+               pCurBox++;
+               prevNumRects -= 1;
+           } while (prevNumRects != 0);
+
+           pReg->numRects -= curNumRects;
+           pCurBox -= curNumRects;
+           pPrevBox -= curNumRects;
+
+           /*
+            * The bands may be merged, so set the bottom y of each box
+            * in the previous band to that of the corresponding box in
+            * the current band.
+            */
+           do
+           {
+               pPrevBox->y2 = pCurBox->y2;
+               pPrevBox++;
+               pCurBox++;
+               curNumRects -= 1;
+           } while (curNumRects != 0);
+
+           /*
+            * If only one band was added to the region, we have to backup
+            * curStart to the start of the previous band.
+            *
+            * If more than one band was added to the region, copy the
+            * other bands down. The assumption here is that the other bands
+            * came from the same region as the current one and no further
+            * coalescing can be done on them since it's all been done
+            * already... curStart is already in the right place.
+            */
+           if (pCurBox == pRegEnd)
+           {
+               curStart = prevStart;
+           }
+           else
+           {
+               do
+               {
+                   *pPrevBox++ = *pCurBox++;
+               } while (pCurBox != pRegEnd);
+           }
+
+       }
+    }
+    return (curStart);
+}
+
+/*-
+ *-----------------------------------------------------------------------
+ * miRegionOp --
+ *     Apply an operation to two regions. Called by miUnion, miInverse,
+ *     miSubtract, miIntersect...
+ *
+ * Results:
+ *     None.
+ *
+ * Side Effects:
+ *     The new region is overwritten.
+ *
+ * Notes:
+ *     The idea behind this function is to view the two regions as sets.
+ *     Together they cover a rectangle of area that this function divides
+ *     into horizontal bands where points are covered only by one region
+ *     or by both. For the first case, the nonOverlapFunc is called with
+ *     each the band and the band's upper and lower extents. For the
+ *     second, the overlapFunc is called to process the entire band. It
+ *     is responsible for clipping the rectangles in the band, though
+ *     this function provides the boundaries.
+ *     At the end of each band, the new region is coalesced, if possible,
+ *     to reduce the number of rectangles in the region.
+ *
+ *-----------------------------------------------------------------------
+ */
+/* static void*/
+static void
+miRegionOp(
+    register Region    newReg,                 /* Place to store result */
+    Region             reg1,                   /* First region in operation */
+    Region             reg2,                   /* 2d region in operation */
+    int                (*overlapFunc)(
+        register Region     pReg,
+        register BoxPtr     r1,
+        BoxPtr              r1End,
+        register BoxPtr     r2,
+        BoxPtr              r2End,
+        short               y1,
+        short               y2),                /* Function to call for over-
+                                                * lapping bands */
+    int                (*nonOverlap1Func)(
+        register Region     pReg,
+        register BoxPtr     r,
+        BoxPtr              rEnd,
+        register short      y1,
+        register short      y2),                /* Function to call for non-
+                                                * overlapping bands in region
+                                                * 1 */
+    int                (*nonOverlap2Func)(
+        register Region     pReg,
+        register BoxPtr     r,
+        BoxPtr              rEnd,
+        register short      y1,
+        register short      y2))                /* Function to call for non-
+                                                * overlapping bands in region
+                                                * 2 */
+{
+    register BoxPtr    r1;                     /* Pointer into first region */
+    register BoxPtr    r2;                     /* Pointer into 2d region */
+    BoxPtr             r1End;                  /* End of 1st region */
+    BoxPtr             r2End;                  /* End of 2d region */
+    register short     ybot;                   /* Bottom of intersection */
+    register short     ytop;                   /* Top of intersection */
+    BoxPtr             oldRects;               /* Old rects for newReg */
+    int                        prevBand;               /* Index of start of
+                                                * previous band in newReg */
+    int                        curBand;                /* Index of start of current
+                                                * band in newReg */
+    register BoxPtr    r1BandEnd;              /* End of current band in r1 */
+    register BoxPtr    r2BandEnd;              /* End of current band in r2 */
+    short              top;                    /* Top of non-overlapping
+                                                * band */
+    short              bot;                    /* Bottom of non-overlapping
+                                                * band */
+
+    /*
+     * Initialization:
+     * set r1, r2, r1End and r2End appropriately, preserve the important
+     * parts of the destination region until the end in case it's one of
+     * the two source regions, then mark the "new" region empty, allocating
+     * another array of rectangles for it to use.
+     */
+    r1 = reg1->rects;
+    r2 = reg2->rects;
+    r1End = r1 + reg1->numRects;
+    r2End = r2 + reg2->numRects;
+
+    oldRects = newReg->rects;
+
+    EMPTY_REGION(newReg);
+
+    /*
+     * Allocate a reasonable number of rectangles for the new region. The idea
+     * is to allocate enough so the individual functions don't need to
+     * reallocate and copy the array, which is time consuming, yet we don't
+     * have to worry about using too much memory. I hope to be able to
+     * nuke the Xrealloc() at the end of this function eventually.
+     */
+    newReg->size = max(reg1->numRects,reg2->numRects) * 2;
+
+    if (! (newReg->rects = (BoxPtr)
+          Xmalloc ((unsigned) (sizeof(BoxRec) * newReg->size)))) {
+       newReg->size = 0;
+       return;
+    }
+
+    /*
+     * Initialize ybot and ytop.
+     * In the upcoming loop, ybot and ytop serve different functions depending
+     * on whether the band being handled is an overlapping or non-overlapping
+     * band.
+     *         In the case of a non-overlapping band (only one of the regions
+     * has points in the band), ybot is the bottom of the most recent
+     * intersection and thus clips the top of the rectangles in that band.
+     * ytop is the top of the next intersection between the two regions and
+     * serves to clip the bottom of the rectangles in the current band.
+     * For an overlapping band (where the two regions intersect), ytop clips
+     * the top of the rectangles of both regions and ybot clips the bottoms.
+     */
+    if (reg1->extents.y1 < reg2->extents.y1)
+       ybot = reg1->extents.y1;
+    else
+       ybot = reg2->extents.y1;
+
+    /*
+     * prevBand serves to mark the start of the previous band so rectangles
+     * can be coalesced into larger rectangles. qv. miCoalesce, above.
+     * In the beginning, there is no previous band, so prevBand == curBand
+     * (curBand is set later on, of course, but the first band will always
+     * start at index 0). prevBand and curBand must be indices because of
+     * the possible expansion, and resultant moving, of the new region's
+     * array of rectangles.
+     */
+    prevBand = 0;
+
+    do
+    {
+       curBand = newReg->numRects;
+
+       /*
+        * This algorithm proceeds one source-band (as opposed to a
+        * destination band, which is determined by where the two regions
+        * intersect) at a time. r1BandEnd and r2BandEnd serve to mark the
+        * rectangle after the last one in the current band for their
+        * respective regions.
+        */
+       r1BandEnd = r1;
+       while ((r1BandEnd != r1End) && (r1BandEnd->y1 == r1->y1))
+       {
+           r1BandEnd++;
+       }
+
+       r2BandEnd = r2;
+       while ((r2BandEnd != r2End) && (r2BandEnd->y1 == r2->y1))
+       {
+           r2BandEnd++;
+       }
+
+       /*
+        * First handle the band that doesn't intersect, if any.
+        *
+        * Note that attention is restricted to one band in the
+        * non-intersecting region at once, so if a region has n
+        * bands between the current position and the next place it overlaps
+        * the other, this entire loop will be passed through n times.
+        */
+       if (r1->y1 < r2->y1)
+       {
+           top = max(r1->y1,ybot);
+           bot = min(r1->y2,r2->y1);
+
+           if ((top != bot) && (nonOverlap1Func != NULL))
+           {
+               (* nonOverlap1Func) (newReg, r1, r1BandEnd, top, bot);
+           }
+
+           ytop = r2->y1;
+       }
+       else if (r2->y1 < r1->y1)
+       {
+           top = max(r2->y1,ybot);
+           bot = min(r2->y2,r1->y1);
+
+           if ((top != bot) && (nonOverlap2Func != NULL))
+           {
+               (* nonOverlap2Func) (newReg, r2, r2BandEnd, top, bot);
+           }
+
+           ytop = r1->y1;
+       }
+       else
+       {
+           ytop = r1->y1;
+       }
+
+       /*
+        * If any rectangles got added to the region, try and coalesce them
+        * with rectangles from the previous band. Note we could just do
+        * this test in miCoalesce, but some machines incur a not
+        * inconsiderable cost for function calls, so...
+        */
+       if (newReg->numRects != curBand)
+       {
+           prevBand = miCoalesce (newReg, prevBand, curBand);
+       }
+
+       /*
+        * Now see if we've hit an intersecting band. The two bands only
+        * intersect if ybot > ytop
+        */
+       ybot = min(r1->y2, r2->y2);
+       curBand = newReg->numRects;
+       if (ybot > ytop)
+       {
+           (* overlapFunc) (newReg, r1, r1BandEnd, r2, r2BandEnd, ytop, ybot);
+
+       }
+
+       if (newReg->numRects != curBand)
+       {
+           prevBand = miCoalesce (newReg, prevBand, curBand);
+       }
+
+       /*
+        * If we've finished with a band (y2 == ybot) we skip forward
+        * in the region to the next band.
+        */
+       if (r1->y2 == ybot)
+       {
+           r1 = r1BandEnd;
+       }
+       if (r2->y2 == ybot)
+       {
+           r2 = r2BandEnd;
+       }
+    } while ((r1 != r1End) && (r2 != r2End));
+
+    /*
+     * Deal with whichever region still has rectangles left.
+     */
+    curBand = newReg->numRects;
+    if (r1 != r1End)
+    {
+       if (nonOverlap1Func != NULL)
+       {
+           do
+           {
+               r1BandEnd = r1;
+               while ((r1BandEnd < r1End) && (r1BandEnd->y1 == r1->y1))
+               {
+                   r1BandEnd++;
+               }
+               (* nonOverlap1Func) (newReg, r1, r1BandEnd,
+                                    max(r1->y1,ybot), r1->y2);
+               r1 = r1BandEnd;
+           } while (r1 != r1End);
+       }
+    }
+    else if ((r2 != r2End) && (nonOverlap2Func != NULL))
+    {
+       do
+       {
+           r2BandEnd = r2;
+           while ((r2BandEnd < r2End) && (r2BandEnd->y1 == r2->y1))
+           {
+                r2BandEnd++;
+           }
+           (* nonOverlap2Func) (newReg, r2, r2BandEnd,
+                               max(r2->y1,ybot), r2->y2);
+           r2 = r2BandEnd;
+       } while (r2 != r2End);
+    }
+
+    if (newReg->numRects != curBand)
+    {
+       (void) miCoalesce (newReg, prevBand, curBand);
+    }
+
+    /*
+     * A bit of cleanup. To keep regions from growing without bound,
+     * we shrink the array of rectangles to match the new number of
+     * rectangles in the region. This never goes to 0, however...
+     *
+     * Only do this stuff if the number of rectangles allocated is more than
+     * twice the number of rectangles in the region (a simple optimization...).
+     */
+    if (newReg->numRects < (newReg->size >> 1))
+    {
+       if (REGION_NOT_EMPTY(newReg))
+       {
+           BoxPtr prev_rects = newReg->rects;
+           newReg->size = newReg->numRects;
+           newReg->rects = (BoxPtr) Xrealloc ((char *) newReg->rects,
+                                  (unsigned) (sizeof(BoxRec) * newReg->size));
+           if (! newReg->rects)
+               newReg->rects = prev_rects;
+       }
+       else
+       {
+           /*
+            * No point in doing the extra work involved in an Xrealloc if
+            * the region is empty
+            */
+           newReg->size = 1;
+           Xfree((char *) newReg->rects);
+           newReg->rects = (BoxPtr) Xmalloc(sizeof(BoxRec));
+       }
+    }
+    Xfree ((char *) oldRects);
+    return;
+}
+
+\f
+/*======================================================================
+ *         Region Union
+ *====================================================================*/
+
+/*-
+ *-----------------------------------------------------------------------
+ * miUnionNonO --
+ *     Handle a non-overlapping band for the union operation. Just
+ *     Adds the rectangles into the region. Doesn't have to check for
+ *     subsumption or anything.
+ *
+ * Results:
+ *     None.
+ *
+ * Side Effects:
+ *     pReg->numRects is incremented and the final rectangles overwritten
+ *     with the rectangles we're passed.
+ *
+ *-----------------------------------------------------------------------
+ */
+/* static void*/
+static int
+miUnionNonO (
+    register Region    pReg,
+    register BoxPtr    r,
+    BoxPtr             rEnd,
+    register short     y1,
+    register short     y2)
+{
+    register BoxPtr    pNextRect;
+
+    pNextRect = &pReg->rects[pReg->numRects];
+
+    assert(y1 < y2);
+
+    while (r != rEnd)
+    {
+       assert(r->x1 < r->x2);
+       MEMCHECK(pReg, pNextRect, pReg->rects);
+       pNextRect->x1 = r->x1;
+       pNextRect->y1 = y1;
+       pNextRect->x2 = r->x2;
+       pNextRect->y2 = y2;
+       pReg->numRects += 1;
+       pNextRect++;
+
+       assert(pReg->numRects<=pReg->size);
+       r++;
+    }
+    return 0;  /* lint */
+}
+
+
+/*-
+ *-----------------------------------------------------------------------
+ * miUnionO --
+ *     Handle an overlapping band for the union operation. Picks the
+ *     left-most rectangle each time and merges it into the region.
+ *
+ * Results:
+ *     None.
+ *
+ * Side Effects:
+ *     Rectangles are overwritten in pReg->rects and pReg->numRects will
+ *     be changed.
+ *
+ *-----------------------------------------------------------------------
+ */
+
+/* static void*/
+static int
+miUnionO (
+    register Region    pReg,
+    register BoxPtr    r1,
+    BoxPtr             r1End,
+    register BoxPtr    r2,
+    BoxPtr             r2End,
+    register short     y1,
+    register short     y2)
+{
+    register BoxPtr    pNextRect;
+
+    pNextRect = &pReg->rects[pReg->numRects];
+
+#define MERGERECT(r) \
+    if ((pReg->numRects != 0) &&  \
+       (pNextRect[-1].y1 == y1) &&  \
+       (pNextRect[-1].y2 == y2) &&  \
+       (pNextRect[-1].x2 >= r->x1))  \
+    {  \
+       if (pNextRect[-1].x2 < r->x2)  \
+       {  \
+           pNextRect[-1].x2 = r->x2;  \
+           assert(pNextRect[-1].x1<pNextRect[-1].x2); \
+       }  \
+    }  \
+    else  \
+    {  \
+       MEMCHECK(pReg, pNextRect, pReg->rects);  \
+       pNextRect->y1 = y1;  \
+       pNextRect->y2 = y2;  \
+       pNextRect->x1 = r->x1;  \
+       pNextRect->x2 = r->x2;  \
+       pReg->numRects += 1;  \
+        pNextRect += 1;  \
+    }  \
+    assert(pReg->numRects<=pReg->size);\
+    r++;
+
+    assert (y1<y2);
+    while ((r1 != r1End) && (r2 != r2End))
+    {
+       if (r1->x1 < r2->x1)
+       {
+           MERGERECT(r1);
+       }
+       else
+       {
+           MERGERECT(r2);
+       }
+    }
+
+    if (r1 != r1End)
+    {
+       do
+       {
+           MERGERECT(r1);
+       } while (r1 != r1End);
+    }
+    else while (r2 != r2End)
+    {
+       MERGERECT(r2);
+    }
+    return 0;  /* lint */
+}
+
+int
+XUnionRegion(
+    Region       reg1,
+    Region       reg2,             /* source regions     */
+    Region       newReg)                  /* destination Region */
+{
+    /*  checks all the simple cases */
+
+    /*
+     * Region 1 and 2 are the same or region 1 is empty
+     */
+    if ( (reg1 == reg2) || (!(reg1->numRects)) )
+    {
+        if (newReg != reg2)
+            miRegionCopy(newReg, reg2);
+        return 1;
+    }
+
+    /*
+     * if nothing to union (region 2 empty)
+     */
+    if (!(reg2->numRects))
+    {
+        if (newReg != reg1)
+            miRegionCopy(newReg, reg1);
+        return 1;
+    }
+
+    /*
+     * Region 1 completely subsumes region 2
+     */
+    if ((reg1->numRects == 1) &&
+       (reg1->extents.x1 <= reg2->extents.x1) &&
+       (reg1->extents.y1 <= reg2->extents.y1) &&
+       (reg1->extents.x2 >= reg2->extents.x2) &&
+       (reg1->extents.y2 >= reg2->extents.y2))
+    {
+        if (newReg != reg1)
+            miRegionCopy(newReg, reg1);
+        return 1;
+    }
+
+    /*
+     * Region 2 completely subsumes region 1
+     */
+    if ((reg2->numRects == 1) &&
+       (reg2->extents.x1 <= reg1->extents.x1) &&
+       (reg2->extents.y1 <= reg1->extents.y1) &&
+       (reg2->extents.x2 >= reg1->extents.x2) &&
+       (reg2->extents.y2 >= reg1->extents.y2))
+    {
+        if (newReg != reg2)
+            miRegionCopy(newReg, reg2);
+        return 1;
+    }
+
+    miRegionOp (newReg, reg1, reg2, miUnionO,
+               miUnionNonO, miUnionNonO);
+
+    newReg->extents.x1 = min(reg1->extents.x1, reg2->extents.x1);
+    newReg->extents.y1 = min(reg1->extents.y1, reg2->extents.y1);
+    newReg->extents.x2 = max(reg1->extents.x2, reg2->extents.x2);
+    newReg->extents.y2 = max(reg1->extents.y2, reg2->extents.y2);
+
+    return 1;
+}
+
+\f
+/*======================================================================
+ *               Region Subtraction
+ *====================================================================*/
+
+/*-
+ *-----------------------------------------------------------------------
+ * miSubtractNonO --
+ *     Deal with non-overlapping band for subtraction. Any parts from
+ *     region 2 we discard. Anything from region 1 we add to the region.
+ *
+ * Results:
+ *     None.
+ *
+ * Side Effects:
+ *     pReg may be affected.
+ *
+ *-----------------------------------------------------------------------
+ */
+/* static void*/
+static int
+miSubtractNonO1 (
+    register Region    pReg,
+    register BoxPtr    r,
+    BoxPtr             rEnd,
+    register short     y1,
+    register short     y2)
+{
+    register BoxPtr    pNextRect;
+
+    pNextRect = &pReg->rects[pReg->numRects];
+
+    assert(y1<y2);
+
+    while (r != rEnd)
+    {
+       assert(r->x1<r->x2);
+       MEMCHECK(pReg, pNextRect, pReg->rects);
+       pNextRect->x1 = r->x1;
+       pNextRect->y1 = y1;
+       pNextRect->x2 = r->x2;
+       pNextRect->y2 = y2;
+       pReg->numRects += 1;
+       pNextRect++;
+
+       assert(pReg->numRects <= pReg->size);
+
+       r++;
+    }
+    return 0;  /* lint */
+}
+
+/*-
+ *-----------------------------------------------------------------------
+ * miSubtractO --
+ *     Overlapping band subtraction. x1 is the left-most point not yet
+ *     checked.
+ *
+ * Results:
+ *     None.
+ *
+ * Side Effects:
+ *     pReg may have rectangles added to it.
+ *
+ *-----------------------------------------------------------------------
+ */
+/* static void*/
+static int
+miSubtractO (
+    register Region    pReg,
+    register BoxPtr    r1,
+    BoxPtr             r1End,
+    register BoxPtr    r2,
+    BoxPtr             r2End,
+    register short     y1,
+    register short     y2)
+{
+    register BoxPtr    pNextRect;
+    register int       x1;
+
+    x1 = r1->x1;
+
+    assert(y1<y2);
+    pNextRect = &pReg->rects[pReg->numRects];
+
+    while ((r1 != r1End) && (r2 != r2End))
+    {
+       if (r2->x2 <= x1)
+       {
+           /*
+            * Subtrahend missed the boat: go to next subtrahend.
+            */
+           r2++;
+       }
+       else if (r2->x1 <= x1)
+       {
+           /*
+            * Subtrahend preceeds minuend: nuke left edge of minuend.
+            */
+           x1 = r2->x2;
+           if (x1 >= r1->x2)
+           {
+               /*
+                * Minuend completely covered: advance to next minuend and
+                * reset left fence to edge of new minuend.
+                */
+               r1++;
+               if (r1 != r1End)
+                   x1 = r1->x1;
+           }
+           else
+           {
+               /*
+                * Subtrahend now used up since it doesn't extend beyond
+                * minuend
+                */
+               r2++;
+           }
+       }
+       else if (r2->x1 < r1->x2)
+       {
+           /*
+            * Left part of subtrahend covers part of minuend: add uncovered
+            * part of minuend to region and skip to next subtrahend.
+            */
+           assert(x1<r2->x1);
+           MEMCHECK(pReg, pNextRect, pReg->rects);
+           pNextRect->x1 = x1;
+           pNextRect->y1 = y1;
+           pNextRect->x2 = r2->x1;
+           pNextRect->y2 = y2;
+           pReg->numRects += 1;
+           pNextRect++;
+
+           assert(pReg->numRects<=pReg->size);
+
+           x1 = r2->x2;
+           if (x1 >= r1->x2)
+           {
+               /*
+                * Minuend used up: advance to new...
+                */
+               r1++;
+               if (r1 != r1End)
+                   x1 = r1->x1;
+           }
+           else
+           {
+               /*
+                * Subtrahend used up
+                */
+               r2++;
+           }
+       }
+       else
+       {
+           /*
+            * Minuend used up: add any remaining piece before advancing.
+            */
+           if (r1->x2 > x1)
+           {
+               MEMCHECK(pReg, pNextRect, pReg->rects);
+               pNextRect->x1 = x1;
+               pNextRect->y1 = y1;
+               pNextRect->x2 = r1->x2;
+               pNextRect->y2 = y2;
+               pReg->numRects += 1;
+               pNextRect++;
+               assert(pReg->numRects<=pReg->size);
+           }
+           r1++;
+           if (r1 != r1End)
+               x1 = r1->x1;
+       }
+    }
+
+    /*
+     * Add remaining minuend rectangles to region.
+     */
+    while (r1 != r1End)
+    {
+       assert(x1<r1->x2);
+       MEMCHECK(pReg, pNextRect, pReg->rects);
+       pNextRect->x1 = x1;
+       pNextRect->y1 = y1;
+       pNextRect->x2 = r1->x2;
+       pNextRect->y2 = y2;
+       pReg->numRects += 1;
+       pNextRect++;
+
+       assert(pReg->numRects<=pReg->size);
+
+       r1++;
+       if (r1 != r1End)
+       {
+           x1 = r1->x1;
+       }
+    }
+    return 0;  /* lint */
+}
+
+/*-
+ *-----------------------------------------------------------------------
+ * miSubtract --
+ *     Subtract regS from regM and leave the result in regD.
+ *     S stands for subtrahend, M for minuend and D for difference.
+ *
+ * Results:
+ *     TRUE.
+ *
+ * Side Effects:
+ *     regD is overwritten.
+ *
+ *-----------------------------------------------------------------------
+ */
+
+int
+XSubtractRegion(
+    Region             regM,
+    Region             regS,
+    register Region    regD)
+{
+   /* check for trivial reject */
+    if ( (!(regM->numRects)) || (!(regS->numRects))  ||
+       (!EXTENTCHECK(&regM->extents, &regS->extents)) )
+    {
+       miRegionCopy(regD, regM);
+        return 1;
+    }
+
+    miRegionOp (regD, regM, regS, miSubtractO,
+               miSubtractNonO1, NULL);
+
+    /*
+     * Can't alter newReg's extents before we call miRegionOp because
+     * it might be one of the source regions and miRegionOp depends
+     * on the extents of those regions being the unaltered. Besides, this
+     * way there's no checking against rectangles that will be nuked
+     * due to coalescing, so we have to examine fewer rectangles.
+     */
+    miSetExtents (regD);
+    return 1;
+}
+
+int
+XXorRegion(Region sra, Region srb, Region dr)
+{
+    Region tra, trb;
+
+    if (! (tra = XCreateRegion()) )
+       return 0;
+    if (! (trb = XCreateRegion()) ) {
+       XDestroyRegion(tra);
+       return 0;
+    }
+    (void) XSubtractRegion(sra,srb,tra);
+    (void) XSubtractRegion(srb,sra,trb);
+    (void) XUnionRegion(tra,trb,dr);
+    XDestroyRegion(tra);
+    XDestroyRegion(trb);
+    return 0;
+}
+
+/*
+ * Check to see if the region is empty.  Assumes a region is passed
+ * as a parameter
+ */
+int
+XEmptyRegion(
+    Region r)
+{
+    if( r->numRects == 0 ) return TRUE;
+    else  return FALSE;
+}
+
+/*
+ *     Check to see if two regions are equal
+ */
+int
+XEqualRegion(Region r1, Region r2)
+{
+    int i;
+
+    if( r1->numRects != r2->numRects ) return FALSE;
+    else if( r1->numRects == 0 ) return TRUE;
+    else if ( r1->extents.x1 != r2->extents.x1 ) return FALSE;
+    else if ( r1->extents.x2 != r2->extents.x2 ) return FALSE;
+    else if ( r1->extents.y1 != r2->extents.y1 ) return FALSE;
+    else if ( r1->extents.y2 != r2->extents.y2 ) return FALSE;
+    else for( i=0; i < r1->numRects; i++ ) {
+       if ( r1->rects[i].x1 != r2->rects[i].x1 ) return FALSE;
+       else if ( r1->rects[i].x2 != r2->rects[i].x2 ) return FALSE;
+       else if ( r1->rects[i].y1 != r2->rects[i].y1 ) return FALSE;
+       else if ( r1->rects[i].y2 != r2->rects[i].y2 ) return FALSE;
+    }
+    return TRUE;
+}
+
+int
+XPointInRegion(
+    Region pRegion,
+    int x, int y)
+{
+    int i;
+
+    if (pRegion->numRects == 0)
+        return FALSE;
+    if (!INBOX(pRegion->extents, x, y))
+        return FALSE;
+    for (i=0; i<pRegion->numRects; i++)
+    {
+        if (INBOX (pRegion->rects[i], x, y))
+           return TRUE;
+    }
+    return FALSE;
+}
+
+int
+XRectInRegion(
+    register Region    region,
+    int rx, int ry,
+    unsigned int rwidth, unsigned int rheight)
+{
+    register BoxPtr pbox;
+    register BoxPtr pboxEnd;
+    Box rect;
+    register BoxPtr prect = &rect;
+    int      partIn, partOut;
+
+    prect->x1 = rx;
+    prect->y1 = ry;
+    prect->x2 = rwidth + rx;
+    prect->y2 = rheight + ry;
+
+    /* this is (just) a useful optimization */
+    if ((region->numRects == 0) || !EXTENTCHECK(&region->extents, prect))
+        return(RectangleOut);
+
+    partOut = FALSE;
+    partIn = FALSE;
+
+    /* can stop when both partOut and partIn are TRUE, or we reach prect->y2 */
+    for (pbox = region->rects, pboxEnd = pbox + region->numRects;
+        pbox < pboxEnd;
+        pbox++)
+    {
+
+       if (pbox->y2 <= ry)
+          continue;    /* getting up to speed or skipping remainder of band */
+
+       if (pbox->y1 > ry)
+       {
+          partOut = TRUE;      /* missed part of rectangle above */
+          if (partIn || (pbox->y1 >= prect->y2))
+             break;
+          ry = pbox->y1;       /* x guaranteed to be == prect->x1 */
+       }
+
+       if (pbox->x2 <= rx)
+          continue;            /* not far enough over yet */
+
+       if (pbox->x1 > rx)
+       {
+          partOut = TRUE;      /* missed part of rectangle to left */
+          if (partIn)
+             break;
+       }
+
+       if (pbox->x1 < prect->x2)
+       {
+           partIn = TRUE;      /* definitely overlap */
+           if (partOut)
+              break;
+       }
+
+       if (pbox->x2 >= prect->x2)
+       {
+          ry = pbox->y2;       /* finished with this band */
+          if (ry >= prect->y2)
+             break;
+          rx = prect->x1;      /* reset x out to left again */
+       } else
+       {
+           /*
+            * Because boxes in a band are maximal width, if the first box
+            * to overlap the rectangle doesn't completely cover it in that
+            * band, the rectangle must be partially out, since some of it
+            * will be uncovered in that band. partIn will have been set true
+            * by now...
+            */
+           break;
+       }
+
+    }
+
+    return(partIn ? ((ry < prect->y2) ? RectanglePart : RectangleIn) :
+               RectangleOut);
+}
diff --git a/src/RegstFlt.c b/src/RegstFlt.c
new file mode 100644 (file)
index 0000000..9a560e7
--- /dev/null
@@ -0,0 +1,155 @@
+
+ /*
+  * Copyright 1990, 1991 by OMRON Corporation
+  *
+  * 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 OMRON not be used in
+  * advertising or publicity pertaining to distribution of the software without
+  * specific, written prior permission.  OMRON makes no representations
+  * about the suitability of this software for any purpose.  It is provided
+  * "as is" without express or implied warranty.
+  *
+  * OMRON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+  * EVENT SHALL OMRON 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
+  * TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+  * PERFORMANCE OF THIS SOFTWARE.
+  *
+  *    Author: Seiji Kuwari    OMRON Corporation
+  *                            kuwa@omron.co.jp
+  *                            kuwa%omron.co.jp@uunet.uu.net
+  */
+/*
+
+Copyright 1990, 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.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xlcint.h"
+
+static void
+_XFreeIMFilters(
+    Display *display)
+{
+    register XFilterEventList fl;
+
+    while ((fl = display->im_filters)) {
+        display->im_filters = fl->next;
+        Xfree((char *)fl);
+    }
+}
+
+/*
+ * Register a filter with the filter machinery by event mask.
+ */
+void
+_XRegisterFilterByMask(
+    Display *display,
+    Window window,
+    unsigned long event_mask,
+    Bool (*filter)(
+                  Display*, Window, XEvent*, XPointer
+                  ),
+    XPointer client_data)
+{
+    XFilterEventRec            *rec;
+
+    rec = (XFilterEventList)Xmalloc(sizeof(XFilterEventRec));
+    if (!rec)
+       return;
+    rec->window = window;
+    rec->event_mask = event_mask;
+    rec->start_type = 0;
+    rec->end_type = 0;
+    rec->filter = filter;
+    rec->client_data = client_data;
+    LockDisplay(display);
+    rec->next = display->im_filters;
+    display->im_filters = rec;
+    display->free_funcs->im_filters = _XFreeIMFilters;
+    UnlockDisplay(display);
+}
+
+/*
+ * Register a filter with the filter machinery by type code.
+ */
+void
+_XRegisterFilterByType(
+    Display *display,
+    Window window,
+    int start_type,
+    int end_type,
+    Bool (*filter)(
+                  Display*, Window, XEvent*, XPointer
+                  ),
+    XPointer client_data)
+{
+    XFilterEventRec            *rec;
+
+    rec = (XFilterEventList)Xmalloc(sizeof(XFilterEventRec));
+    if (!rec)
+       return;
+    rec->window = window;
+    rec->event_mask = 0;
+    rec->start_type = start_type;
+    rec->end_type = end_type;
+    rec->filter = filter;
+    rec->client_data = client_data;
+    LockDisplay(display);
+    rec->next = display->im_filters;
+    display->im_filters = rec;
+    display->free_funcs->im_filters = _XFreeIMFilters;
+    UnlockDisplay(display);
+}
+
+void
+_XUnregisterFilter(
+    Display *display,
+    Window window,
+    Bool (*filter)(
+                  Display*, Window, XEvent*, XPointer
+                  ),
+    XPointer client_data)
+{
+    register XFilterEventList  *prev, fl;
+
+    for (prev = &display->im_filters; (fl = *prev); ) {
+       if (fl->window == window &&
+           fl->filter == filter && fl->client_data == client_data) {
+           *prev = fl->next;
+           Xfree((char *)fl);
+       } else
+           prev = &fl->next;
+    }
+}
diff --git a/src/RepWindow.c b/src/RepWindow.c
new file mode 100644 (file)
index 0000000..1fde8d8
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XReparentWindow(
+    register Display *dpy,
+    Window w,
+    Window p,
+    int x,
+    int y)
+{
+    register xReparentWindowReq *req;
+
+    LockDisplay(dpy);
+    GetReq(ReparentWindow, req);
+    req->window = w;
+    req->parent = p;
+    req->x = x;
+    req->y = y;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/RestackWs.c b/src/RestackWs.c
new file mode 100644 (file)
index 0000000..1dba3c8
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XRestackWindows (
+    register Display *dpy,
+    register Window *windows,
+    int n)
+{
+    int i = 0;
+#ifdef MUSTCOPY
+    unsigned long val = Below;         /* needed for macro below */
+#endif
+
+    LockDisplay(dpy);
+    while (windows++, ++i < n) {
+       register xConfigureWindowReq *req;
+
+       GetReqExtra (ConfigureWindow, 8, req);
+       req->window = *windows;
+       req->mask = CWSibling | CWStackMode;
+#ifdef MUSTCOPY
+       dpy->bufptr -= 8;
+       Data32 (dpy, (long *)(windows-1), 4);
+       Data32 (dpy, (long *)&val, 4);
+#else
+       {
+           register CARD32 *values = (CARD32 *)
+             NEXTPTR(req,xConfigureWindowReq);
+           *values++ = *(windows-1);
+           *values   = Below;
+       }
+#endif /* MUSTCOPY */
+       }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+    }
+
+
+
+
diff --git a/src/RotProp.c b/src/RotProp.c
new file mode 100644 (file)
index 0000000..98d7dbd
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XRotateWindowProperties(
+    register Display *dpy,
+    Window w,
+    Atom *properties,
+    register int nprops,
+    int npositions)
+{
+    register long nbytes;
+    register xRotatePropertiesReq *req;
+
+    LockDisplay(dpy);
+    GetReq (RotateProperties, req);
+    req->window = w;
+    req->nAtoms = nprops;
+    req->nPositions = npositions;
+
+    req->length += nprops;
+    nbytes = nprops << 2;
+/* XXX Cray needs packing here.... */
+    Data32 (dpy, (long *) properties, nbytes);
+
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+    }
+
+
+
+
+
diff --git a/src/ScrResStr.c b/src/ScrResStr.c
new file mode 100644 (file)
index 0000000..0601c86
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+
+Copyright 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.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include <X11/Xatom.h>
+
+char *XScreenResourceString(Screen *screen)
+{
+    Atom prop_name;
+    Atom actual_type;
+    int actual_format;
+    unsigned long nitems;
+    unsigned long leftover;
+    char *val = NULL;
+
+    prop_name = XInternAtom(screen->display, "SCREEN_RESOURCES", True);
+    if (prop_name &&
+       XGetWindowProperty(screen->display, screen->root, prop_name,
+                          0L, 100000000L, False,
+                          XA_STRING, &actual_type, &actual_format,
+                          &nitems, &leftover,
+                          (unsigned char **) &val) == Success) {
+       if ((actual_type == XA_STRING) && (actual_format == 8))
+           return val;
+       if (val)
+           Xfree(val);
+    }
+    return (char *)NULL;
+}
diff --git a/src/SelInput.c b/src/SelInput.c
new file mode 100644 (file)
index 0000000..a3fa294
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XSelectInput (
+    register Display *dpy,
+    Window w,
+    long mask)
+{
+    register xChangeWindowAttributesReq *req;
+
+    LockDisplay(dpy);
+    GetReqExtra (ChangeWindowAttributes, 4, req);
+    req->window = w;
+    req->valueMask = CWEventMask;
+    OneDataCard32 (dpy, NEXTPTR(req,xChangeWindowAttributesReq), mask);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/SendEvent.c b/src/SendEvent.c
new file mode 100644 (file)
index 0000000..cc8bd5a
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+/*
+ * In order to avoid all images requiring _XEventToWire, we install the
+ * event converter here if it has never been installed.
+ */
+Status
+XSendEvent(
+    register Display *dpy,
+    Window w,
+    Bool propagate,
+    long event_mask,
+    XEvent *event)
+{
+    register xSendEventReq *req;
+    xEvent ev;
+    register Status (**fp)(
+                Display *       /* dpy */,
+                XEvent *        /* re */,
+                xEvent *        /* event */);
+    Status status;
+
+    /* initialize all of the event's fields first, before setting
+     * the meaningful ones later.
+     */
+    memset (&ev, 0, sizeof (ev));
+
+    LockDisplay (dpy);
+
+    /* call through display to find proper conversion routine */
+
+    fp = &dpy->wire_vec[event->type & 0177];
+    if (*fp == NULL) *fp = _XEventToWire;
+    status = (**fp)(dpy, event, &ev);
+
+    if (status) {
+       GetReq(SendEvent, req);
+       req->destination = w;
+       req->propagate = propagate;
+       req->eventMask = event_mask;
+#ifdef WORD64
+       /* avoid quad-alignment problems */
+       memcpy ((char *) req->eventdata, (char *) &ev, SIZEOF(xEvent));
+#else
+       req->event = ev;
+#endif /* WORD64 */
+    }
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return(status);
+}
diff --git a/src/SetBack.c b/src/SetBack.c
new file mode 100644 (file)
index 0000000..269d10c
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XSetBackground (
+    register Display *dpy,
+    GC gc,
+    unsigned long background) /* CARD32 */
+{
+    LockDisplay(dpy);
+    if (gc->values.background != background) {
+       gc->values.background = background;
+       gc->dirty |= GCBackground;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/SetCRects.c b/src/SetCRects.c
new file mode 100644 (file)
index 0000000..c7ad3fc
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+/* can only call when display is locked. */
+void _XSetClipRectangles (
+    register Display *dpy,
+    GC gc,
+    int clip_x_origin, int clip_y_origin,
+    XRectangle *rectangles,
+    int n,
+    int ordering)
+{
+    register xSetClipRectanglesReq *req;
+    register long len;
+    unsigned long dirty;
+    register _XExtension *ext;
+
+    GetReq (SetClipRectangles, req);
+    req->gc = gc->gid;
+    req->xOrigin = gc->values.clip_x_origin = clip_x_origin;
+    req->yOrigin = gc->values.clip_y_origin = clip_y_origin;
+    req->ordering = ordering;
+    len = ((long)n) << 1;
+    SetReqLen(req, len, 1);
+    len <<= 2;
+    Data16 (dpy, (short *) rectangles, len);
+    gc->rects = 1;
+    dirty = gc->dirty & ~(GCClipMask | GCClipXOrigin | GCClipYOrigin);
+    gc->dirty = GCClipMask | GCClipXOrigin | GCClipYOrigin;
+    /* call out to any extensions interested */
+    for (ext = dpy->ext_procs; ext; ext = ext->next)
+       if (ext->flush_GC) (*ext->flush_GC)(dpy, gc, &ext->codes);
+    gc->dirty = dirty;
+}
+
+int
+XSetClipRectangles (
+    register Display *dpy,
+    GC gc,
+    int clip_x_origin,
+    int clip_y_origin,
+    XRectangle *rectangles,
+    int n,
+    int ordering)
+{
+    LockDisplay(dpy);
+    _XSetClipRectangles (dpy, gc, clip_x_origin, clip_y_origin, rectangles, n,
+                    ordering);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/SetClMask.c b/src/SetClMask.c
new file mode 100644 (file)
index 0000000..82cdb2c
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XSetClipMask (
+    register Display *dpy,
+    GC gc,
+    Pixmap mask)
+{
+    LockDisplay(dpy);
+    /* always update, since client may have changed pixmap contents */
+    gc->values.clip_mask = mask;
+    gc->dirty |= GCClipMask;
+    gc->rects = 0;
+    _XFlushGCCache(dpy, gc);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/SetClOrig.c b/src/SetClOrig.c
new file mode 100644 (file)
index 0000000..800e157
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XSetClipOrigin (
+    register Display *dpy,
+    GC gc,
+    int xorig,
+    int yorig)
+{
+    XGCValues *gv = &gc->values;
+
+    LockDisplay(dpy);
+    if (xorig != gv->clip_x_origin) {
+        gv->clip_x_origin = xorig;
+       gc->dirty |= GCClipXOrigin;
+    }
+    if (yorig != gv->clip_y_origin) {
+        gv->clip_y_origin = yorig;
+       gc->dirty |= GCClipYOrigin;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/SetDashes.c b/src/SetDashes.c
new file mode 100644 (file)
index 0000000..ffe4a95
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XSetDashes (
+    register Display *dpy,
+    GC gc,
+    int dash_offset,
+    _Xconst char *list,
+    int n)
+    {
+    register xSetDashesReq *req;
+
+    LockDisplay(dpy);
+    GetReq (SetDashes,req);
+    req->gc = gc->gid;
+    req->dashOffset = gc->values.dash_offset = dash_offset;
+    req->nDashes = n;
+    req->length += (n+3)>>2;
+    gc->dashes = 1;
+    gc->dirty &= ~(GCDashList | GCDashOffset);
+    Data (dpy, list, (long)n);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+    }
+
diff --git a/src/SetFPath.c b/src/SetFPath.c
new file mode 100644 (file)
index 0000000..89955c2
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+#define safestrlen(s) ((s) ? strlen(s) : 0)
+
+int
+XSetFontPath (
+    register Display *dpy,
+    char **directories,
+    int ndirs)
+{
+       register int n = 0;
+       register int i;
+       register int nbytes;
+       char *p;
+       register xSetFontPathReq *req;
+       int retCode;
+
+        LockDisplay(dpy);
+       GetReq (SetFontPath, req);
+       req->nFonts = ndirs;
+       for (i = 0; i < ndirs; i++) {
+               n += safestrlen (directories[i]) + 1;
+       }
+       nbytes = (n + 3) & ~3;
+       req->length += nbytes >> 2;
+       if ((p = (char *) Xmalloc ((unsigned) nbytes))) {
+               /*
+                * pack into counted strings.
+                */
+               char    *tmp = p;
+
+               for (i = 0; i < ndirs; i++) {
+                       register int length = safestrlen (directories[i]);
+                       *p = length;
+                       memcpy (p + 1, directories[i], length);
+                       p += length + 1;
+               }
+               Data (dpy, tmp, nbytes);
+               Xfree ((char *) tmp);
+               retCode = 1;
+       }
+       else
+               retCode = 0;
+
+        UnlockDisplay(dpy);
+       SyncHandle();
+       return (retCode);
+}
diff --git a/src/SetFont.c b/src/SetFont.c
new file mode 100644 (file)
index 0000000..33ffca0
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XSetFont (
+    register Display *dpy,
+    GC gc,
+    Font font)
+{
+    LockDisplay(dpy);
+    if (gc->values.font != font) {
+        gc->values.font = font;
+       gc->dirty |= GCFont;
+       _XFlushGCCache(dpy, gc);
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/SetFore.c b/src/SetFore.c
new file mode 100644 (file)
index 0000000..50c9f12
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XSetForeground (
+    register Display *dpy,
+    GC gc,
+    unsigned long foreground) /* CARD32 */
+{
+    LockDisplay(dpy);
+    if (gc->values.foreground != foreground) {
+       gc->values.foreground = foreground;
+       gc->dirty |= GCForeground;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/SetFunc.c b/src/SetFunc.c
new file mode 100644 (file)
index 0000000..ffe4ec0
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XSetFunction (
+    register Display *dpy,
+    GC gc,
+    int function)
+{
+    LockDisplay(dpy);
+    if (gc->values.function != function) {
+       gc->values.function = function;
+       gc->dirty |= GCFunction;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/SetHints.c b/src/SetHints.c
new file mode 100644 (file)
index 0000000..0c33f59
--- /dev/null
@@ -0,0 +1,317 @@
+
+/***********************************************************
+
+Copyright 1987, 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 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 <X11/Xlibint.h>
+#include <X11/Xutil.h>
+#include "Xatomtype.h"
+#include <X11/Xatom.h>
+#include <X11/Xos.h>
+
+#define safestrlen(s) ((s) ? strlen(s) : 0)
+
+int
+XSetSizeHints(         /* old routine */
+       Display *dpy,
+       Window w,
+       XSizeHints *hints,
+        Atom property)
+{
+       xPropSizeHints prop;
+       memset(&prop, 0, sizeof(prop));
+       prop.flags = (hints->flags & (USPosition|USSize|PAllHints));
+       if (hints->flags & (USPosition|PPosition)) {
+           prop.x = hints->x;
+           prop.y = hints->y;
+       }
+       if (hints->flags & (USSize|PSize)) {
+           prop.width = hints->width;
+           prop.height = hints->height;
+       }
+       if (hints->flags & PMinSize) {
+           prop.minWidth = hints->min_width;
+           prop.minHeight = hints->min_height;
+       }
+       if (hints->flags & PMaxSize) {
+           prop.maxWidth  = hints->max_width;
+           prop.maxHeight = hints->max_height;
+       }
+       if (hints->flags & PResizeInc) {
+           prop.widthInc = hints->width_inc;
+           prop.heightInc = hints->height_inc;
+       }
+       if (hints->flags & PAspect) {
+           prop.minAspectX = hints->min_aspect.x;
+           prop.minAspectY = hints->min_aspect.y;
+           prop.maxAspectX = hints->max_aspect.x;
+           prop.maxAspectY = hints->max_aspect.y;
+       }
+       return XChangeProperty (dpy, w, property, XA_WM_SIZE_HINTS, 32,
+                               PropModeReplace, (unsigned char *) &prop,
+                               OldNumPropSizeElements);
+}
+
+/*
+ * XSetWMHints sets the property
+ *     WM_HINTS        type: WM_HINTS  format:32
+ */
+
+int
+XSetWMHints (
+       Display *dpy,
+       Window w,
+       XWMHints *wmhints)
+{
+       xPropWMHints prop;
+       memset(&prop, 0, sizeof(prop));
+       prop.flags = wmhints->flags;
+       if (wmhints->flags & InputHint)
+           prop.input = (wmhints->input == True ? 1 : 0);
+       if (wmhints->flags & StateHint)
+           prop.initialState = wmhints->initial_state;
+       if (wmhints->flags & IconPixmapHint)
+           prop.iconPixmap = wmhints->icon_pixmap;
+       if (wmhints->flags & IconWindowHint)
+           prop.iconWindow = wmhints->icon_window;
+       if (wmhints->flags & IconPositionHint) {
+           prop.iconX = wmhints->icon_x;
+           prop.iconY = wmhints->icon_y;
+       }
+       if (wmhints->flags & IconMaskHint)
+           prop.iconMask = wmhints->icon_mask;
+       if (wmhints->flags & WindowGroupHint)
+           prop.windowGroup = wmhints->window_group;
+       return XChangeProperty (dpy, w, XA_WM_HINTS, XA_WM_HINTS, 32,
+                               PropModeReplace, (unsigned char *) &prop,
+                               NumPropWMHintsElements);
+}
+
+
+
+/*
+ * XSetZoomHints sets the property
+ *     WM_ZOOM_HINTS   type: WM_SIZE_HINTS format: 32
+ */
+
+int
+XSetZoomHints (
+       Display *dpy,
+       Window w,
+       XSizeHints *zhints)
+{
+       return XSetSizeHints (dpy, w, zhints, XA_WM_ZOOM_HINTS);
+}
+
+
+/*
+ * XSetNormalHints sets the property
+ *     WM_NORMAL_HINTS         type: WM_SIZE_HINTS format: 32
+ */
+
+int
+XSetNormalHints (                      /* old routine */
+       Display *dpy,
+       Window w,
+       XSizeHints *hints)
+{
+       return XSetSizeHints (dpy, w, hints, XA_WM_NORMAL_HINTS);
+}
+
+
+
+/*
+ * Note, the following is one of the few cases were we really do want sizeof
+ * when examining a protocol structure.  This is because the XChangeProperty
+ * routine will take care of converting to host to network data structures.
+ */
+
+int
+XSetIconSizes (
+       Display *dpy,
+       Window w,       /* typically, root */
+       XIconSize *list,
+       int count)      /* number of items on the list */
+{
+       register int i;
+       xPropIconSize *pp, *prop;
+#define size_of_the_real_thing sizeof  /* avoid grepping screwups */
+       unsigned nbytes = count * size_of_the_real_thing(xPropIconSize);
+#undef size_of_the_real_thing
+       if ((prop = pp = (xPropIconSize *) Xmalloc (nbytes))) {
+           for (i = 0; i < count; i++) {
+               pp->minWidth  = list->min_width;
+               pp->minHeight = list->min_height;
+               pp->maxWidth  = list->max_width;
+               pp->maxHeight = list->max_height;
+               pp->widthInc  = list->width_inc;
+               pp->heightInc = list->height_inc;
+               pp += 1;
+               list += 1;
+           }
+           XChangeProperty (dpy, w, XA_WM_ICON_SIZE, XA_WM_ICON_SIZE, 32,
+                            PropModeReplace, (unsigned char *) prop,
+                            count * NumPropIconSizeElements);
+           Xfree ((char *)prop);
+       }
+       return 1;
+}
+
+int
+XSetCommand (
+       Display *dpy,
+       Window w,
+       char **argv,
+       int argc)
+{
+       register int i;
+       register int nbytes;
+       register char *buf, *bp;
+       for (i = 0, nbytes = 0; i < argc; i++) {
+               nbytes += safestrlen(argv[i]) + 1;
+       }
+       if ((bp = buf = Xmalloc((unsigned) nbytes))) {
+           /* copy arguments into single buffer */
+           for (i = 0; i < argc; i++) {
+               if (argv[i]) {
+                   (void) strcpy(bp, argv[i]);
+                   bp += strlen(argv[i]) + 1;
+               }
+               else
+                   *bp++ = '\0';
+           }
+           XChangeProperty (dpy, w, XA_WM_COMMAND, XA_STRING, 8,
+                            PropModeReplace, (unsigned char *)buf, nbytes);
+           Xfree(buf);
+       }
+       return 1;
+}
+/*
+ * XSetStandardProperties sets the following properties:
+ *     WM_NAME           type: STRING          format: 8
+ *     WM_ICON_NAME      type: STRING          format: 8
+ *     WM_HINTS          type: WM_HINTS        format: 32
+ *     WM_COMMAND        type: STRING
+ *     WM_NORMAL_HINTS   type: WM_SIZE_HINTS   format: 32
+ */
+
+int
+XSetStandardProperties (
+       Display *dpy,
+       Window w,               /* window to decorate */
+       _Xconst char *name,     /* name of application */
+       _Xconst char *icon_string,/* name string for icon */
+       Pixmap icon_pixmap,     /* pixmap to use as icon, or None */
+       char **argv,            /* command to be used to restart application */
+       int argc,               /* count of arguments */
+       XSizeHints *hints)      /* size hints for window in its normal state */
+{
+       XWMHints phints;
+       phints.flags = 0;
+
+       if (name != NULL) XStoreName (dpy, w, name);
+
+       if (icon_string != NULL) {
+           XChangeProperty (dpy, w, XA_WM_ICON_NAME, XA_STRING, 8,
+               PropModeReplace, (unsigned char *)icon_string, safestrlen(icon_string));
+               }
+
+       if (icon_pixmap != None) {
+               phints.icon_pixmap = icon_pixmap;
+               phints.flags |= IconPixmapHint;
+               }
+       if (argv != NULL) XSetCommand(dpy, w, argv, argc);
+
+       if (hints != NULL) XSetNormalHints(dpy, w, hints);
+
+       if (phints.flags != 0) XSetWMHints(dpy, w, &phints);
+
+       return 1;
+}
+
+int
+XSetTransientForHint(
+       Display *dpy,
+       Window w,
+       Window propWindow)
+{
+       return XChangeProperty(dpy, w, XA_WM_TRANSIENT_FOR, XA_WINDOW, 32,
+                              PropModeReplace, (unsigned char *) &propWindow, 1);
+}
+
+int
+XSetClassHint(
+       Display *dpy,
+       Window w,
+       XClassHint *classhint)
+{
+       char *class_string;
+       char *s;
+       int len_nm, len_cl;
+
+       len_nm = safestrlen(classhint->res_name);
+       len_cl = safestrlen(classhint->res_class);
+       if ((class_string = s = Xmalloc((unsigned) (len_nm + len_cl + 2)))) {
+           if (len_nm) {
+               strcpy(s, classhint->res_name);
+               s += len_nm + 1;
+           }
+           else
+               *s++ = '\0';
+           if (len_cl)
+               strcpy(s, classhint->res_class);
+           else
+               *s = '\0';
+           XChangeProperty(dpy, w, XA_WM_CLASS, XA_STRING, 8,
+                           PropModeReplace, (unsigned char *) class_string,
+                           len_nm+len_cl+2);
+           Xfree(class_string);
+       }
+       return 1;
+}
diff --git a/src/SetIFocus.c b/src/SetIFocus.c
new file mode 100644 (file)
index 0000000..bee96ca
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XSetInputFocus(
+    register Display *dpy,
+    Window focus,
+    int revert_to,
+    Time time)
+{
+    register xSetInputFocusReq *req;
+
+    LockDisplay(dpy);
+    GetReq(SetInputFocus, req);
+    req->focus = focus;
+    req->revertTo = revert_to;
+    req->time = time;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/SetLStyle.c b/src/SetLStyle.c
new file mode 100644 (file)
index 0000000..8b00fae
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XSetLineAttributes(
+    register Display *dpy,
+    GC gc,
+    unsigned int linewidth, /* CARD16 */
+    int linestyle,
+    int capstyle,
+    int joinstyle)
+{
+    XGCValues *gv = &gc->values;
+
+    LockDisplay(dpy);
+    if (linewidth != gv->line_width) {
+       gv->line_width = linewidth;
+       gc->dirty |= GCLineWidth;
+    }
+    if (linestyle != gv->line_style) {
+       gv->line_style = linestyle;
+       gc->dirty |= GCLineStyle;
+    }
+    if (capstyle != gv->cap_style) {
+       gv->cap_style = capstyle;
+       gc->dirty |= GCCapStyle;
+    }
+    if (joinstyle != gv->join_style) {
+       gv->join_style = joinstyle;
+       gc->dirty |= GCJoinStyle;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/SetLocale.c b/src/SetLocale.c
new file mode 100644 (file)
index 0000000..c49cb2e
--- /dev/null
@@ -0,0 +1,253 @@
+
+/*
+ * Copyright 1990, 1991 by OMRON Corporation, NTT Software Corporation,
+ *                      and Nippon Telegraph and Telephone Corporation
+ *
+ * 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 names of OMRON, NTT Software, and NTT
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. OMRON, NTT Software,
+ * and NTT make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *
+ * OMRON, NTT SOFTWARE, AND NTT, DISCLAIM ALL WARRANTIES WITH REGARD
+ * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS, IN NO EVENT SHALL OMRON, NTT SOFTWARE, OR NTT, 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.
+ *
+ *     Authors: Li Yuhong              OMRON Corporation
+ *              Tetsuya Kato           NTT Software Corporation
+ *              Hiroshi Kuribayashi    OMRON Corporation
+ *
+ */
+/*
+
+Copyright 1987,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 "Xlibint.h"
+#include "Xlcint.h"
+#include <X11/Xlocale.h>
+#include <X11/Xos.h>
+#include "XlcPubI.h"
+
+#define MAXLOCALE      64      /* buffer size of locale name */
+
+#ifdef X_LOCALE
+
+/* alternative setlocale() for when the OS does not provide one */
+
+char *
+_Xsetlocale(
+    int                  category,
+    _Xconst char  *name
+)
+{
+    static char *xsl_name;
+    char *old_name;
+    XrmMethods methods;
+    XPointer state;
+
+    if (category != LC_CTYPE && category != LC_ALL)
+       return NULL;
+    if (!name) {
+       if (xsl_name)
+           return xsl_name;
+       return "C";
+    }
+    if (!*name)
+       name = getenv("LC_CTYPE");
+    if (!name || !*name)
+       name = getenv("LANG");
+    if (name && strlen(name) >= MAXLOCALE)
+       name = NULL;
+    if (!name || !*name || !_XOpenLC((char *) name))
+       name = "C";
+    old_name = xsl_name;
+    xsl_name = (char *)name;
+    methods = _XrmInitParseInfo(&state);
+    xsl_name = old_name;
+    if (!methods)
+       return NULL;
+    name = (*methods->lcname)(state);
+    xsl_name = strdup(name);
+    if (!xsl_name) {
+       xsl_name = old_name;
+       (*methods->destroy)(state);
+       return NULL;
+    }
+    if (old_name)
+       Xfree(old_name);
+    (*methods->destroy)(state);
+    return xsl_name;
+}
+
+#else /* X_LOCALE */
+
+#if defined(__APPLE__) || defined(__CYGWIN__)
+char *
+_Xsetlocale(
+    int           category,
+    _Xconst char  *name
+)
+{
+    return setlocale(category, name);
+}
+#endif /* __APPLE__ || __CYGWIN__ */
+
+/*
+ * _XlcMapOSLocaleName is an implementation dependent routine that derives
+ * the LC_CTYPE locale name as used in the sample implementation from that
+ * returned by setlocale.
+ *
+ * Should match the code in Xt ExtractLocaleName.
+ *
+ * This function name is a bit of a misnomer. Even the siname parameter
+ * name is a misnomer. On most modern operating systems this function is
+ * a no-op, simply returning the osname; but on older operating systems
+ * like Ultrix, or HPUX 9.x and earlier, when you set LANG=german.88591
+ * then the string returned by setlocale(LC_ALL, "") will look something
+ * like: "german.88591 german.88591 ... german.88591". Then this function
+ * will pick out the LC_CTYPE component and return a pointer to that.
+ */
+
+char *
+_XlcMapOSLocaleName(
+    char *osname,
+    char *siname)
+{
+#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
+#  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
+
+    start = osname;
+# ifdef SKIPCOUNT
+    for (n = SKIPCOUNT;
+        --n >= 0 && start && (start = strchr (start, STARTCHAR));
+        start++)
+       ;
+    if (!start)
+       start = osname;
+# 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 (len >= MAXLOCALE)
+               len = MAXLOCALE - 1;
+           strncpy(siname, start, len);
+           *(siname + len) = '\0';
+# ifdef WHITEFILL
+           for (start = siname; start = strchr(start, ' '); )
+               *start++ = '-';
+# endif
+           return siname;
+       } else  /* if no ENDCHAR is found we are at the end of the line */
+           return start;
+    }
+# ifdef WHITEFILL
+    if (strchr(osname, ' ')) {
+       len = strlen(osname);
+       if (len >= MAXLOCALE - 1)
+           len = MAXLOCALE - 1;
+       strncpy(siname, osname, len);
+       *(siname + len) = '\0';
+       for (start = siname; start = strchr(start, ' '); )
+           *start++ = '-';
+       return siname;
+    }
+# endif
+# undef STARTCHAR
+# undef ENDCHAR
+# undef WHITEFILL
+#endif
+    return osname;
+}
+
+#endif  /* X_LOCALE */
diff --git a/src/SetNrmHint.c b/src/SetNrmHint.c
new file mode 100644 (file)
index 0000000..94b447f
--- /dev/null
@@ -0,0 +1,127 @@
+
+/***********************************************************
+Copyright 1988 by Wyse Technology, Inc., San Jose, Ca,
+Copyright 1987 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 AND WYSE DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL DIGITAL OR WYSE 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 <X11/Xlibint.h>
+#include <X11/Xutil.h>
+#include "Xatomtype.h"
+#include <X11/Xatom.h>
+#include <X11/Xos.h>
+
+void XSetWMSizeHints (
+    Display *dpy,
+    Window w,
+    XSizeHints *hints,
+    Atom prop)
+{
+    xPropSizeHints data;
+
+    memset(&data, 0, sizeof(data));
+    data.flags = (hints->flags &
+                 (USPosition|USSize|PPosition|PSize|PMinSize|PMaxSize|
+                  PResizeInc|PAspect|PBaseSize|PWinGravity));
+
+    /*
+     * The x, y, width, and height fields are obsolete; but, applications
+     * that want to work with old window managers might set them.
+     */
+    if (hints->flags & (USPosition|PPosition)) {
+       data.x = hints->x;
+       data.y = hints->y;
+    }
+    if (hints->flags & (USSize|PSize)) {
+       data.width = hints->width;
+       data.height = hints->height;
+    }
+
+    if (hints->flags & PMinSize) {
+       data.minWidth = hints->min_width;
+       data.minHeight = hints->min_height;
+    }
+    if (hints->flags & PMaxSize) {
+       data.maxWidth  = hints->max_width;
+       data.maxHeight = hints->max_height;
+    }
+    if (hints->flags & PResizeInc) {
+       data.widthInc = hints->width_inc;
+       data.heightInc = hints->height_inc;
+    }
+    if (hints->flags & PAspect) {
+       data.minAspectX = hints->min_aspect.x;
+       data.minAspectY = hints->min_aspect.y;
+       data.maxAspectX = hints->max_aspect.x;
+       data.maxAspectY = hints->max_aspect.y;
+    }
+    if (hints->flags & PBaseSize) {
+       data.baseWidth = hints->base_width;
+       data.baseHeight = hints->base_height;
+    }
+    if (hints->flags & PWinGravity) {
+       data.winGravity = hints->win_gravity;
+    }
+
+    XChangeProperty (dpy, w, prop, XA_WM_SIZE_HINTS, 32,
+                    PropModeReplace, (unsigned char *) &data,
+                    NumPropSizeElements);
+}
+
+
+void XSetWMNormalHints (
+    Display *dpy,
+    Window w,
+    XSizeHints *hints)
+{
+    XSetWMSizeHints (dpy, w, hints, XA_WM_NORMAL_HINTS);
+}
+
diff --git a/src/SetPMask.c b/src/SetPMask.c
new file mode 100644 (file)
index 0000000..9f236b0
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XSetPlaneMask (
+    register Display *dpy,
+    GC gc,
+    unsigned long planemask) /* CARD32 */
+{
+    LockDisplay(dpy);
+    if (gc->values.plane_mask != planemask) {
+       gc->values.plane_mask = planemask;
+       gc->dirty |= GCPlaneMask;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/SetPntMap.c b/src/SetPntMap.c
new file mode 100644 (file)
index 0000000..2e29201
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+/* returns either  DeviceMappingSuccess or DeviceMappingBusy  */
+
+int
+XSetPointerMapping (
+    register Display *dpy,
+    _Xconst unsigned char *map,
+    int nmaps)
+    {
+    register xSetPointerMappingReq *req;
+    xSetPointerMappingReply rep;
+
+    LockDisplay(dpy);
+    GetReq (SetPointerMapping, req);
+    req->nElts = nmaps;
+    req->length += (nmaps + 3)>>2;
+    Data (dpy, (char *)map, (long) nmaps);
+    if (_XReply (dpy, (xReply *)&rep, 0, xFalse) == 0)
+       rep.success = MappingSuccess;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return ((int) rep.success);
+    }
+
+int
+XChangeKeyboardMapping (
+    register Display *dpy,
+    int first_keycode,
+    int keysyms_per_keycode,
+    KeySym *keysyms,
+    int nkeycodes)
+{
+    register long nbytes;
+    register xChangeKeyboardMappingReq *req;
+
+    LockDisplay(dpy);
+    GetReq (ChangeKeyboardMapping, req);
+    req->firstKeyCode = first_keycode;
+    req->keyCodes = nkeycodes;
+    req->keySymsPerKeyCode = keysyms_per_keycode;
+    req->length += nkeycodes * keysyms_per_keycode;
+    nbytes = keysyms_per_keycode * nkeycodes * 4;
+    Data32 (dpy, (long *)keysyms, nbytes);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 0;
+    }
+
diff --git a/src/SetRGBCMap.c b/src/SetRGBCMap.c
new file mode 100644 (file)
index 0000000..d2cbb5b
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+
+Copyright 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 <X11/Xlibint.h>
+#include <X11/Xutil.h>
+#include "Xatomtype.h"
+#include <X11/Xatom.h>
+
+void XSetRGBColormaps (
+    Display *dpy,
+    Window w,
+    XStandardColormap *cmaps,
+    int count,
+    Atom property)                     /* XA_RGB_BEST_MAP, etc. */
+{
+    register int i;                    /* iterator variable */
+    register xPropStandardColormap *map;  /* tmp variable, data in prop */
+    register XStandardColormap *cmap;  /* tmp variable, user data */
+    xPropStandardColormap *data, tmpdata;  /* scratch data */
+    int mode = PropModeReplace;                /* for partial writes */
+    Bool alloced_scratch_space;                /* do we need to free? */
+
+
+    if (count < 1) return;
+
+    /*
+     * if doing more than one, allocate scratch space for it
+     */
+    if ((count > 1) && ((data = ((xPropStandardColormap *)
+                                Xmalloc(count*sizeof(xPropStandardColormap))))
+                        != NULL)) {
+       alloced_scratch_space = True;
+    } else {
+       data = &tmpdata;
+       alloced_scratch_space = False;
+    }
+
+
+    /*
+     * Do the iteration.  If using temp space put out each part of the prop;
+     * otherwise, wait until the end and blast it all at once.
+     */
+    for (i = count, map = data, cmap = cmaps; i > 0; i--, cmap++) {
+       map->colormap   = cmap->colormap;
+       map->red_max    = cmap->red_max;
+       map->red_mult   = cmap->red_mult;
+       map->green_max  = cmap->green_max;
+       map->green_mult = cmap->green_mult;
+       map->blue_max   = cmap->blue_max;
+       map->blue_mult  = cmap->blue_mult;
+       map->base_pixel = cmap->base_pixel;
+       map->visualid   = cmap->visualid;
+       map->killid     = cmap->killid;
+
+       if (alloced_scratch_space) {
+           map++;
+       } else {
+           XChangeProperty (dpy, w, property, XA_RGB_COLOR_MAP, 32, mode,
+                            (unsigned char *) data,
+                            NumPropStandardColormapElements);
+           mode = PropModeAppend;
+       }
+    }
+
+    if (alloced_scratch_space) {
+       XChangeProperty (dpy, w, property, XA_RGB_COLOR_MAP, 32,
+                        PropModeReplace, (unsigned char *) data,
+                        (int) (count * NumPropStandardColormapElements));
+       Xfree ((char *) data);
+    }
+}
diff --git a/src/SetSOwner.c b/src/SetSOwner.c
new file mode 100644 (file)
index 0000000..bc8f564
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XSetSelectionOwner(
+    register Display *dpy,
+    Atom selection,
+    Window owner,
+    Time time)
+{
+    register xSetSelectionOwnerReq *req;
+
+    LockDisplay(dpy);
+    GetReq(SetSelectionOwner,req);
+    req->selection = selection;
+    req->window = owner;
+    req->time = time;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/SetSSaver.c b/src/SetSSaver.c
new file mode 100644 (file)
index 0000000..adce749
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XSetScreenSaver(
+    register Display *dpy,
+    int timeout,
+    int interval,
+    int prefer_blank,
+    int allow_exp)
+
+{
+    register xSetScreenSaverReq *req;
+
+    LockDisplay(dpy);
+    GetReq(SetScreenSaver, req);
+    req->timeout = timeout;
+    req->interval = interval;
+    req->preferBlank = prefer_blank;
+    req->allowExpose = allow_exp;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/SetStCmap.c b/src/SetStCmap.c
new file mode 100644 (file)
index 0000000..8c3ae6e
--- /dev/null
@@ -0,0 +1,95 @@
+
+/***********************************************************
+
+Copyright 1987, 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 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 <X11/Xlibint.h>
+#include <X11/Xutil.h>
+#include "Xatomtype.h"
+#include <X11/Xatom.h>
+
+/*
+ *                                 WARNING
+ *
+ * This is a pre-ICCCM routine.  It must not reference any of the new fields
+ * in the XStandardColormap structure.
+ */
+
+void XSetStandardColormap(
+    Display *dpy,
+    Window w,
+    XStandardColormap *cmap,
+    Atom property)             /* XA_RGB_BEST_MAP, etc. */
+{
+    Screen *sp;
+    XStandardColormap stdcmap;
+
+    sp = _XScreenOfWindow (dpy, w);
+    if (!sp) {
+       /* already caught the XGetGeometry error in _XScreenOfWindow */
+       return;
+    }
+
+    stdcmap.colormap   = cmap->colormap;
+    stdcmap.red_max    = cmap->red_max;
+    stdcmap.red_mult   = cmap->red_mult;
+    stdcmap.green_max  = cmap->green_max;
+    stdcmap.green_mult  = cmap->green_mult;
+    stdcmap.blue_max   = cmap->blue_max;
+    stdcmap.blue_mult  = cmap->blue_mult;
+    stdcmap.base_pixel = cmap->base_pixel;
+    stdcmap.visualid   = sp->root_visual->visualid;
+    stdcmap.killid     = None;         /* don't know how to kill this one */
+
+#ifdef XCMS
+    XSetRGBColormaps (dpy, w, &stdcmap, 1, property);
+#endif
+
+    return;
+}
diff --git a/src/SetState.c b/src/SetState.c
new file mode 100644 (file)
index 0000000..e5aa21c
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XSetState(
+    register Display *dpy,
+    GC gc,
+    unsigned long foreground,
+    unsigned long background,
+    int function,
+    unsigned long planemask)
+{
+    XGCValues *gv = &gc->values;
+
+    LockDisplay(dpy);
+
+    if (function != gv->function) {
+       gv->function = function;
+       gc->dirty |= GCFunction;
+    }
+    if (planemask != gv->plane_mask) {
+       gv->plane_mask = planemask;
+       gc->dirty |= GCPlaneMask;
+    }
+    if (foreground != gv->foreground) {
+       gv->foreground = foreground;
+       gc->dirty |= GCForeground;
+    }
+    if (background != gv->background) {
+       gv->background = background;
+       gc->dirty |= GCBackground;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/SetStip.c b/src/SetStip.c
new file mode 100644 (file)
index 0000000..e958827
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XSetStipple (
+    register Display *dpy,
+    GC gc,
+    Pixmap stipple)
+{
+    LockDisplay(dpy);
+    /* always update, since client may have changed pixmap contents */
+    gc->values.stipple = stipple;
+    gc->dirty |= GCStipple;
+    _XFlushGCCache(dpy, gc);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/SetTSOrig.c b/src/SetTSOrig.c
new file mode 100644 (file)
index 0000000..0117c81
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XSetTSOrigin (
+    register Display *dpy,
+    GC gc,
+    int x,
+    int y)
+{
+    XGCValues *gv = &gc->values;
+
+    LockDisplay(dpy);
+    if (x != gv->ts_x_origin) {
+       gv->ts_x_origin = x;
+       gc->dirty |= GCTileStipXOrigin;
+    }
+    if (y != gv->ts_y_origin) {
+       gv->ts_y_origin = y;
+       gc->dirty |= GCTileStipYOrigin;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/SetTile.c b/src/SetTile.c
new file mode 100644 (file)
index 0000000..d32edff
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XSetTile (
+    register Display *dpy,
+    GC gc,
+    Pixmap tile)
+{
+    LockDisplay(dpy);
+    /* always update, since client may have changed pixmap contents */
+    gc->values.tile = tile;
+    gc->dirty |= GCTile;
+    _XFlushGCCache(dpy, gc);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/SetTxtProp.c b/src/SetTxtProp.c
new file mode 100644 (file)
index 0000000..48689bc
--- /dev/null
@@ -0,0 +1,93 @@
+/***********************************************************
+Copyright 1988 by Wyse Technology, Inc., San Jose, Ca.
+
+                        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 Wyse not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+WYSE 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 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 <X11/Xlibint.h>
+#include <X11/Xatom.h>
+#include <X11/Xutil.h>
+#include <X11/Xos.h>
+#include <stdio.h>
+
+void XSetTextProperty (
+    Display *dpy,
+    Window w,
+    XTextProperty *tp,
+    Atom property)
+{
+    XChangeProperty (dpy, w, property, tp->encoding, tp->format,
+                    PropModeReplace, tp->value, tp->nitems);
+}
+
+void XSetWMName (
+    Display *dpy,
+    Window w,
+    XTextProperty *tp)
+{
+    XSetTextProperty (dpy, w, tp, XA_WM_NAME);
+}
+
+void XSetWMIconName (
+    Display *dpy,
+    Window w,
+    XTextProperty *tp)
+{
+    XSetTextProperty (dpy, w, tp, XA_WM_ICON_NAME);
+}
+
+void XSetWMClientMachine (
+    Display *dpy,
+    Window w,
+    XTextProperty *tp)
+{
+    XSetTextProperty (dpy, w, tp, XA_WM_CLIENT_MACHINE);
+}
+
diff --git a/src/SetWMCMapW.c b/src/SetWMCMapW.c
new file mode 100644 (file)
index 0000000..a323912
--- /dev/null
@@ -0,0 +1,74 @@
+
+/***********************************************************
+
+Copyright 1987, 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 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 "Xlibint.h"
+#include <X11/Xatom.h>
+
+/*
+ * XSetWMProtocols sets the property
+ *     WM_COLORMAP_WINDOWS     type: WINDOW    format:32
+ */
+
+Status XSetWMColormapWindows (
+    Display *dpy,
+    Window w,
+    Window *windows,
+    int count)
+{
+    Atom prop;
+
+    prop = XInternAtom (dpy, "WM_COLORMAP_WINDOWS", False);
+    if (prop == None) return False;
+
+    XChangeProperty (dpy, w, prop, XA_WINDOW, 32,
+                    PropModeReplace, (unsigned char *) windows, count);
+    return True;
+}
diff --git a/src/SetWMProto.c b/src/SetWMProto.c
new file mode 100644 (file)
index 0000000..700e13e
--- /dev/null
@@ -0,0 +1,74 @@
+
+/***********************************************************
+
+Copyright 1987, 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 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 "Xlibint.h"
+#include <X11/Xatom.h>
+
+/*
+ * XSetWMProtocols sets the property
+ *     WM_PROTOCOLS    type: ATOM      format: 32
+ */
+
+Status XSetWMProtocols (
+    Display *dpy,
+    Window w,
+    Atom *protocols,
+    int count)
+{
+    Atom prop;
+
+    prop = XInternAtom (dpy, "WM_PROTOCOLS", False);
+    if (prop == None) return False;
+
+    XChangeProperty (dpy, w, prop, XA_ATOM, 32,
+                    PropModeReplace, (unsigned char *) protocols, count);
+    return True;
+}
diff --git a/src/StBytes.c b/src/StBytes.c
new file mode 100644 (file)
index 0000000..13ac879
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+
+Copyright 1986, 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 <X11/Xlibint.h>
+#include <X11/Xatom.h>
+
+/* insulate predefined atom numbers from cut routines */
+static const Atom n_to_atom[8] = {
+       XA_CUT_BUFFER0,
+       XA_CUT_BUFFER1,
+       XA_CUT_BUFFER2,
+       XA_CUT_BUFFER3,
+       XA_CUT_BUFFER4,
+       XA_CUT_BUFFER5,
+       XA_CUT_BUFFER6,
+       XA_CUT_BUFFER7};
+
+int
+XRotateBuffers (
+    register Display *dpy,
+    int rotate)
+{
+    /* XRotateWindowProperties wants a non-const Atom*, but it doesn't
+     * modify it, so this is safe.
+     */
+    return XRotateWindowProperties(dpy, RootWindow(dpy, 0), (Atom *)n_to_atom, 8, rotate);
+}
+
+char *XFetchBuffer (
+    register Display *dpy,
+    int *nbytes,
+    register int buffer)
+{
+    Atom actual_type;
+    int actual_format;
+    unsigned long nitems;
+    unsigned long leftover;
+    unsigned char *data;
+    *nbytes = 0;
+    if ((buffer < 0) || (buffer > 7)) return (NULL);
+/* XXX should be (sizeof (maxint) - 1)/4 */
+    if (XGetWindowProperty(dpy, RootWindow(dpy, 0), n_to_atom[buffer],
+       0L, 10000000L, False, XA_STRING,
+       &actual_type, &actual_format, &nitems, &leftover, &data) != Success) {
+       return (NULL);
+       }
+    if ( (actual_type == XA_STRING) &&  (actual_format != 32) ) {
+       *nbytes = nitems;
+       return((char *)data);
+       }
+    if ((char *) data != NULL) Xfree ((char *)data);
+    return(NULL);
+}
+
+char *XFetchBytes (
+    register Display *dpy,
+    int *nbytes)
+{
+    return (XFetchBuffer (dpy, nbytes, 0));
+}
+
+int
+XStoreBuffer (
+    register Display *dpy,
+    _Xconst char *bytes,
+    int nbytes,
+    register int buffer)
+{
+    if ((buffer < 0) || (buffer > 7)) return 0;
+    return XChangeProperty(dpy, RootWindow(dpy, 0), n_to_atom[buffer],
+       XA_STRING, 8, PropModeReplace, (unsigned char *) bytes, nbytes);
+}
+
+int
+XStoreBytes (
+    register Display *dpy,
+    _Xconst char *bytes,
+    int nbytes)
+{
+    return XStoreBuffer (dpy, bytes, nbytes, 0);
+}
diff --git a/src/StColor.c b/src/StColor.c
new file mode 100644 (file)
index 0000000..19f2a4b
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XStoreColor(
+    register Display *dpy,
+    Colormap cmap,
+    XColor *def)
+{
+    xColorItem *citem;
+    register xStoreColorsReq *req;
+#ifdef MUSTCOPY
+    xColorItem citemdata;
+    long len = SIZEOF(xColorItem);
+
+    citem = &citemdata;
+#endif /* MUSTCOPY */
+
+    LockDisplay(dpy);
+    GetReqExtra(StoreColors, SIZEOF(xColorItem), req); /* assume size is 4*n */
+
+    req->cmap = cmap;
+
+#ifndef MUSTCOPY
+    citem = (xColorItem *) NEXTPTR(req,xStoreColorsReq);
+#endif /* not MUSTCOPY */
+
+    citem->pixel = def->pixel;
+    citem->red = def->red;
+    citem->green = def->green;
+    citem->blue = def->blue;
+    citem->flags = def->flags; /* do_red, do_green, do_blue */
+
+#ifdef MUSTCOPY
+    dpy->bufptr -= SIZEOF(xColorItem);         /* adjust for GetReqExtra */
+    Data (dpy, (char *) citem, len);
+#endif /* MUSTCOPY */
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/StColors.c b/src/StColors.c
new file mode 100644 (file)
index 0000000..17a215c
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XStoreColors(
+    register Display *dpy,
+    Colormap cmap,
+    XColor *defs,
+    int ncolors)
+{
+    register int i;
+    xColorItem citem;
+    register xStoreColorsReq *req;
+
+    LockDisplay(dpy);
+    GetReq(StoreColors, req);
+
+    req->cmap = cmap;
+
+    req->length += (ncolors * SIZEOF(xColorItem)) >> 2; /* assume size is 4*n */
+
+    for (i = 0; i < ncolors; i++) {
+       citem.pixel = defs[i].pixel;
+       citem.red = defs[i].red;
+       citem.green = defs[i].green;
+       citem.blue = defs[i].blue;
+       citem.flags = defs[i].flags;
+
+       /* note that xColorItem doesn't contain all 16-bit quantities, so
+          we can't use Data16 */
+       Data(dpy, (char *)&citem, (long) SIZEOF(xColorItem));
+                       /* assume size is 4*n */
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/StNColor.c b/src/StNColor.c
new file mode 100644 (file)
index 0000000..8b821c3
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+
+Copyright 1986, 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 <stdio.h>
+#include "Xlibint.h"
+#include "Xcmsint.h"
+
+
+int
+XStoreNamedColor(
+register Display *dpy,
+Colormap cmap,
+_Xconst char *name, /* STRING8 */
+unsigned long pixel, /* CARD32 */
+int flags)  /* DoRed, DoGreen, DoBlue */
+{
+    unsigned int nbytes;
+    register xStoreNamedColorReq *req;
+    XcmsCCC ccc;
+    XcmsColor cmsColor_exact;
+    XColor scr_def;
+
+#ifdef XCMS
+    /*
+     * Let's Attempt to use Xcms approach to Parse Color
+     */
+    if ((ccc = XcmsCCCOfColormap(dpy, cmap)) != (XcmsCCC)NULL) {
+       if (_XcmsResolveColorString(ccc, &name, &cmsColor_exact,
+               XcmsRGBFormat) >= XcmsSuccess) {
+           _XcmsRGB_to_XColor(&cmsColor_exact, &scr_def, 1);
+           scr_def.pixel = pixel;
+           scr_def.flags = flags;
+           return XStoreColor(dpy, cmap, &scr_def);
+       }
+       /*
+        * Otherwise we failed; or name was changed with yet another
+        * name.  Thus pass name to the X Server.
+        */
+    }
+#endif
+
+    /*
+     * The Xcms and i18n methods failed, so lets pass it to the server
+     * for parsing.
+     */
+
+    LockDisplay(dpy);
+    GetReq(StoreNamedColor, req);
+
+    req->cmap = cmap;
+    req->flags = flags;
+    req->pixel = pixel;
+    req->nbytes = nbytes = strlen(name);
+    req->length += (nbytes + 3) >> 2; /* round up to multiple of 4 */
+    Data(dpy, name, (long)nbytes);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 0;
+}
+
+
diff --git a/src/StName.c b/src/StName.c
new file mode 100644 (file)
index 0000000..fb1e6f5
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+
+Copyright 1986, 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 <X11/Xlibint.h>
+#include <X11/Xatom.h>
+
+int
+XStoreName (
+    register Display *dpy,
+    Window w,
+    _Xconst char *name)
+{
+    return XChangeProperty(dpy, w, XA_WM_NAME, XA_STRING,
+                          8, PropModeReplace, (unsigned char *)name,
+                          name ? strlen(name) : 0);
+}
+
+int
+XSetIconName (
+    register Display *dpy,
+    Window w,
+    _Xconst char *icon_name)
+{
+    return XChangeProperty(dpy, w, XA_WM_ICON_NAME, XA_STRING,
+                          8, PropModeReplace, (unsigned char *)icon_name,
+                          icon_name ? strlen(icon_name) : 0);
+}
diff --git a/src/StrKeysym.c b/src/StrKeysym.c
new file mode 100644 (file)
index 0000000..4394e0c
--- /dev/null
@@ -0,0 +1,181 @@
+/*
+
+Copyright 1985, 1987, 1990, 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 <limits.h>
+#include "Xlibint.h"
+#include <X11/Xresource.h>
+#include <X11/keysymdef.h>
+#include "Xresinternal.h"
+
+#define NEEDKTABLE
+#include "ks_tables.h"
+#include "Key.h"
+
+#ifndef KEYSYMDB
+#ifndef XKEYSYMDB
+#define KEYSYMDB "/usr/lib/X11/XKeysymDB"
+#else
+#define KEYSYMDB XKEYSYMDB
+#endif
+#endif
+
+static Bool initialized;
+static XrmDatabase keysymdb;
+static XrmQuark Qkeysym[2];
+
+XrmDatabase
+_XInitKeysymDB(void)
+{
+    if (!initialized)
+    {
+       const char *dbname;
+
+       XrmInitialize();
+       /* use and name of this env var is not part of the standard */
+       /* implementation-dependent feature */
+       dbname = getenv("XKEYSYMDB");
+       if (!dbname)
+           dbname = KEYSYMDB;
+       keysymdb = XrmGetFileDatabase(dbname);
+       if (keysymdb)
+           Qkeysym[0] = XrmStringToQuark("Keysym");
+       initialized = True;
+    }
+    return keysymdb;
+}
+
+KeySym
+XStringToKeysym(_Xconst char *s)
+{
+    register int i, n;
+    int h;
+    register Signature sig = 0;
+    register const char *p = s;
+    register int c;
+    register int idx;
+    const unsigned char *entry;
+    unsigned char sig1, sig2;
+    KeySym val;
+
+    while ((c = *p++))
+       sig = (sig << 1) + c;
+    i = sig % KTABLESIZE;
+    h = i + 1;
+    sig1 = (sig >> 8) & 0xff;
+    sig2 = sig & 0xff;
+    n = KMAXHASH;
+    while ((idx = hashString[i]))
+    {
+       entry = &_XkeyTable[idx];
+       if ((entry[0] == sig1) && (entry[1] == sig2) &&
+           !strcmp(s, (char *)entry + 6))
+       {
+           val = (entry[2] << 24) | (entry[3] << 16) |
+                 (entry[4] << 8)  | entry[5];
+           if (!val)
+               val = XK_VoidSymbol;
+           return val;
+       }
+       if (!--n)
+           break;
+       i += h;
+       if (i >= KTABLESIZE)
+           i -= KTABLESIZE;
+    }
+
+    if (!initialized)
+       (void)_XInitKeysymDB();
+    if (keysymdb)
+    {
+       XrmValue result;
+       XrmRepresentation from_type;
+       char c;
+       XrmQuark names[2];
+
+       names[0] = _XrmInternalStringToQuark(s, p - s - 1, sig, False);
+       names[1] = NULLQUARK;
+       (void)XrmQGetResource(keysymdb, names, Qkeysym, &from_type, &result);
+       if (result.addr && (result.size > 1))
+       {
+           val = 0;
+           for (i = 0; i < result.size - 1; i++)
+           {
+               c = ((char *)result.addr)[i];
+               if ('0' <= c && c <= '9') val = (val<<4)+c-'0';
+               else if ('a' <= c && c <= 'f') val = (val<<4)+c-'a'+10;
+               else if ('A' <= c && c <= 'F') val = (val<<4)+c-'A'+10;
+               else return NoSymbol;
+           }
+           return val;
+       }
+    }
+
+    if (*s == 'U') {
+       val = 0;
+        for (p = &s[1]; *p; p++) {
+            c = *p;
+           if ('0' <= c && c <= '9') val = (val<<4)+c-'0';
+           else if ('a' <= c && c <= 'f') val = (val<<4)+c-'a'+10;
+           else if ('A' <= c && c <= 'F') val = (val<<4)+c-'A'+10;
+           else return NoSymbol;
+           if (val > 0x10ffff)
+               return NoSymbol;
+       }
+       if (val < 0x20 || (val > 0x7e && val < 0xa0))
+           return NoSymbol;
+       if (val < 0x100)
+           return val;
+        return val | 0x01000000;
+    }
+
+    if (strlen(s) > 2 && s[0] == '0' && s[1] == 'x') {
+        char *tmp = NULL;
+        val = strtoul(s, &tmp, 16);
+        if (val == ULONG_MAX || (tmp && *tmp != '\0'))
+            return NoSymbol;
+        else
+            return val;
+    }
+
+    /* Stupid inconsistency between the headers and XKeysymDB: the former has
+     * no separating underscore, while some XF86* syms in the latter did.
+     * As a last ditch effort, try without. */
+    if (strncmp(s, "XF86_", 5) == 0) {
+        KeySym ret;
+        char *tmp = strdup(s);
+        if (!tmp)
+            return NoSymbol;
+        memmove(&tmp[4], &tmp[5], strlen(s) - 5 + 1);
+        ret = XStringToKeysym(tmp);
+        free(tmp);
+        return ret;
+    }
+
+    return NoSymbol;
+}
diff --git a/src/StrToText.c b/src/StrToText.c
new file mode 100644 (file)
index 0000000..b5327e8
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+
+Copyright 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 <X11/Xlibint.h>
+#include <X11/Xatom.h>
+#include <X11/Xutil.h>
+
+/*
+ * XStringListToTextProperty - fill in TextProperty structure with
+ * concatenated list of null-separated strings.  Return True if successful
+ * else False.  Allocate room on end for trailing NULL, but don't include in
+ * count.
+ */
+
+Status XStringListToTextProperty (
+    char **argv,
+    int argc,
+    XTextProperty *textprop)
+{
+    register int i;
+    register unsigned int nbytes;
+    XTextProperty proto;
+
+    /* figure out how much space we'll need for this list */
+    for (i = 0, nbytes = 0; i < argc; i++) {
+       nbytes += (unsigned) ((argv[i] ? strlen (argv[i]) : 0) + 1);
+    }
+
+    /* fill in a prototype containing results so far */
+    proto.encoding = XA_STRING;
+    proto.format = 8;
+    if (nbytes)
+       proto.nitems = nbytes - 1;      /* subtract one for trailing <NUL> */
+    else
+       proto.nitems = 0;
+    proto.value = NULL;
+
+    /* build concatenated list of strings */
+    if (nbytes > 0) {
+       register char *buf = Xmalloc (nbytes);
+       if (!buf) return False;
+
+       proto.value = (unsigned char *) buf;
+       for (i = 0; i < argc; i++) {
+           char *arg = argv[i];
+
+           if (arg) {
+               (void) strcpy (buf, arg);
+               buf += (strlen (arg) + 1);
+           } else {
+               *buf++ = '\0';
+           }
+       }
+    } else {
+       proto.value = (unsigned char *) Xmalloc (1);    /* easier for client */
+       if (!proto.value) return False;
+
+       proto.value[0] = '\0';
+    }
+
+    /* we were successful, so set return value */
+    *textprop = proto;
+    return True;
+}
diff --git a/src/Sync.c b/src/Sync.c
new file mode 100644 (file)
index 0000000..6326de7
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+/* Synchronize with errors and events, optionally discarding pending events */
+
+int
+XSync (
+    register Display *dpy,
+    Bool discard)
+{
+    xGetInputFocusReply rep;
+    register xReq *req;
+
+    LockDisplay(dpy);
+    GetEmptyReq(GetInputFocus, req);
+    (void) _XReply (dpy, (xReply *)&rep, 0, xTrue);
+
+    if (discard && dpy->head) {
+       _XQEvent *qelt;
+
+       for (qelt=dpy->head; qelt; qelt=qelt->next)
+          qelt->qserial_num = 0;
+
+       ((_XQEvent *)dpy->tail)->next = dpy->qfree;
+       dpy->qfree = (_XQEvent *)dpy->head;
+       dpy->head = dpy->tail = NULL;
+       dpy->qlen = 0;
+    }
+    UnlockDisplay(dpy);
+    return 1;
+}
+
diff --git a/src/Synchro.c b/src/Synchro.c
new file mode 100644 (file)
index 0000000..930448e
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+
+static int _XSyncFunction(register Display *dpy)
+{
+       XSync(dpy,0);
+       return 0;
+}
+
+int (*XSynchronize(Display *dpy, int onoff))(Display *)
+{
+        int (*temp)(Display *);
+       int (*func)(Display *) = NULL;
+
+       if (onoff)
+           func = _XSyncFunction;
+
+       LockDisplay(dpy);
+       if (dpy->flags & XlibDisplayPrivSync) {
+           temp = dpy->savedsynchandler;
+           dpy->savedsynchandler = func;
+       } else {
+           temp = dpy->synchandler;
+           dpy->synchandler = func;
+       }
+       UnlockDisplay(dpy);
+       return (temp);
+}
+
+int (*XSetAfterFunction(
+     Display *dpy,
+     int (*func)(
+                Display*
+                )
+        ))(Display *)
+{
+        int (*temp)(Display *);
+
+       LockDisplay(dpy);
+       if (dpy->flags & XlibDisplayPrivSync) {
+           temp = dpy->savedsynchandler;
+           dpy->savedsynchandler = func;
+       } else {
+           temp = dpy->synchandler;
+           dpy->synchandler = func;
+       }
+       UnlockDisplay(dpy);
+       return (temp);
+}
+
diff --git a/src/Text.c b/src/Text.c
new file mode 100644 (file)
index 0000000..223b1cf
--- /dev/null
@@ -0,0 +1,139 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XDrawString(
+    register Display *dpy,
+    Drawable d,
+    GC gc,
+    int x,
+    int y,
+    _Xconst char *string,
+    int length)
+{
+    int Datalength = 0;
+    register xPolyText8Req *req;
+
+    if (length <= 0)
+       return 0;
+
+    LockDisplay(dpy);
+    FlushGC(dpy, gc);
+    GetReq (PolyText8, req);
+    req->drawable = d;
+    req->gc = gc->gid;
+    req->x = x;
+    req->y = y;
+
+
+    Datalength += SIZEOF(xTextElt) * ((length + 253) / 254) + length;
+
+
+    req->length += (Datalength + 3)>>2;  /* convert to number of 32-bit words */
+
+
+    /*
+     * If the entire request does not fit into the remaining space in the
+     * buffer, flush the buffer first.   If the request does fit into the
+     * empty buffer, then we won't have to flush it at the end to keep
+     * the buffer 32-bit aligned.
+     */
+
+    if (dpy->bufptr + Datalength > dpy->bufmax)
+       _XFlush (dpy);
+
+    {
+       int nbytes;
+       int PartialNChars = length;
+        /* register xTextElt *elt; */
+       char *CharacterOffset = (char *)string;
+        unsigned char *tbuf;
+
+       while(PartialNChars > 254)
+        {
+           nbytes = 254 + SIZEOF(xTextElt);
+           BufAlloc (unsigned char *, tbuf, nbytes);
+/*    elt->delta = 0;
+ *    elt->len = 254;
+ */
+            *(unsigned char *)tbuf = 254;
+            *(tbuf+1) = 0;
+/*       memcpy ((char *) (elt + 1), CharacterOffset, 254);
+ */
+            memcpy ((char *)tbuf+2, CharacterOffset, 254);
+           PartialNChars = PartialNChars - 254;
+           CharacterOffset += 254;
+       }
+
+        if (PartialNChars)
+        {
+           nbytes = PartialNChars + SIZEOF(xTextElt);
+           BufAlloc (unsigned char *, tbuf, nbytes);
+/*    elt->delta = 0;
+ *    elt->len = PartialNChars;
+ */
+            *(unsigned char *)tbuf =  PartialNChars;
+            *(tbuf+1) = 0;
+/*     memcpy ((char *) (elt + 1), CharacterOffset, PartialNChars);
+ */
+         memcpy ((char *)tbuf+2, CharacterOffset, PartialNChars);
+        }
+    }
+
+    /* Pad request out to a 32-bit boundary */
+
+    if (Datalength &= 3) {
+       char *pad;
+       /*
+        * BufAlloc is a macro that uses its last argument more than
+        * once, otherwise I'd write "BufAlloc (char *, pad, 4-length)"
+        */
+       length = 4 - Datalength;
+       BufAlloc (char *, pad, length);
+       /*
+        * if there are 3 bytes of padding, the first byte MUST be 0
+        * so the pad bytes aren't mistaken for a final xTextElt
+        */
+       *pad = 0;
+        }
+
+    /*
+     * If the buffer pointer is not now pointing to a 32-bit boundary,
+     * we must flush the buffer so that it does point to a 32-bit boundary
+     * at the end of this routine.
+     */
+
+    if ((dpy->bufptr - dpy->buffer) & 3)
+       _XFlush (dpy);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 0;
+}
diff --git a/src/Text16.c b/src/Text16.c
new file mode 100644 (file)
index 0000000..5a66a2b
--- /dev/null
@@ -0,0 +1,152 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XDrawString16(
+    register Display *dpy,
+    Drawable d,
+    GC gc,
+    int x,
+    int y,
+    _Xconst XChar2b *string,
+    int length)
+{
+    int Datalength = 0;
+    register xPolyText16Req *req;
+
+    if (length <= 0)
+       return 0;
+
+    LockDisplay(dpy);
+    FlushGC(dpy, gc);
+    GetReq (PolyText16, req);
+    req->drawable = d;
+    req->gc = gc->gid;
+    req->x = x;
+    req->y = y;
+
+
+    Datalength += SIZEOF(xTextElt) * ((length + 253) / 254) + (length << 1);
+
+
+    req->length += (Datalength + 3)>>2;  /* convert to number of 32-bit words */
+
+
+    /*
+     * If the entire request does not fit into the remaining space in the
+     * buffer, flush the buffer first.   If the request does fit into the
+     * empty buffer, then we won't have to flush it at the end to keep
+     * the buffer 32-bit aligned.
+     */
+
+    if (dpy->bufptr + Datalength > dpy->bufmax)
+       _XFlush (dpy);
+
+    {
+       int nbytes;
+       int PartialNChars = length;
+        register xTextElt *elt;
+       XChar2b *CharacterOffset = (XChar2b *)string;
+
+       while(PartialNChars > 254)
+        {
+           nbytes = 254 * 2 + SIZEOF(xTextElt);
+           BufAlloc (xTextElt *, elt, nbytes);
+           elt->delta = 0;
+           elt->len = 254;
+#if defined(MUSTCOPY) || defined(MUSTCOPY2B)
+           {
+               register int i;
+               register unsigned char *cp;
+               for (i = 0, cp = ((unsigned char *)elt) + 2; i < 254; i++) {
+                   *cp++ = CharacterOffset[i].byte1;
+                   *cp++ = CharacterOffset[i].byte2;
+               }
+           }
+#else
+            memcpy (((char *) elt) + 2, (char *)CharacterOffset, 254 * 2);
+#endif
+           PartialNChars = PartialNChars - 254;
+           CharacterOffset += 254;
+       }
+
+        if (PartialNChars)
+        {
+           nbytes = PartialNChars * 2  + SIZEOF(xTextElt);
+           BufAlloc (xTextElt *, elt, nbytes);
+           elt->delta = 0;
+           elt->len = PartialNChars;
+#if defined(MUSTCOPY) || defined(MUSTCOPY2B)
+           {
+               register int i;
+               register unsigned char *cp;
+               for (i = 0, cp = ((unsigned char *)elt) + 2; i < PartialNChars;
+                    i++) {
+                   *cp++ = CharacterOffset[i].byte1;
+                   *cp++ = CharacterOffset[i].byte2;
+               }
+           }
+#else
+            memcpy(((char *)elt) + 2, (char *)CharacterOffset, PartialNChars * 2);
+#endif
+        }
+    }
+
+    /* Pad request out to a 32-bit boundary */
+
+    if (Datalength &= 3) {
+       char *pad;
+       /*
+        * BufAlloc is a macro that uses its last argument more than
+        * once, otherwise I'd write "BufAlloc (char *, pad, 4-length)"
+        */
+       length = 4 - Datalength;
+       BufAlloc (char *, pad, length);
+       /*
+        * if there are 3 bytes of padding, the first byte MUST be 0
+        * so the pad bytes aren't mistaken for a final xTextElt
+        */
+       *pad = 0;
+        }
+
+    /*
+     * If the buffer pointer is not now pointing to a 32-bit boundary,
+     * we must flush the buffer so that it does point to a 32-bit boundary
+     * at the end of this routine.
+     */
+
+    if ((dpy->bufptr - dpy->buffer) & 3)
+       _XFlush (dpy);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 0;
+}
+
diff --git a/src/TextExt.c b/src/TextExt.c
new file mode 100644 (file)
index 0000000..b883b01
--- /dev/null
@@ -0,0 +1,234 @@
+/*
+
+Copyright 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.
+
+*/
+/*
+ * Copyright 1995 by FUJITSU LIMITED
+ * This is source code modified by FUJITSU LIMITED under the Joint
+ * Development Agreement for the CDE/Motif PST.
+ */
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+
+#define min_byte2 min_char_or_byte2
+#define max_byte2 max_char_or_byte2
+
+
+/*
+ * CI_GET_ROWZERO_CHAR_INFO_2D - do the same thing as CI_GET_CHAR_INFO_1D,
+ * except that the font has more than one row.  This is special case of more
+ * general version used in XTextExt16.c since row == 0.  This is used when
+ * max_byte2 is not zero.  A further optimization would do the check for
+ * min_byte1 being zero ahead of time.
+ */
+
+#define CI_GET_ROWZERO_CHAR_INFO_2D(fs,col,def,cs) \
+{ \
+    cs = def; \
+    if (fs->min_byte1 == 0 && \
+       col >= fs->min_byte2 && col <= fs->max_byte2) { \
+       if (fs->per_char == NULL) { \
+           cs = &fs->min_bounds; \
+       } else { \
+           cs = &fs->per_char[(col - fs->min_byte2)]; \
+           if (CI_NONEXISTCHAR(cs)) cs = def; \
+       } \
+    } \
+}
+
+
+/*
+ * XTextExtents - compute the extents of string given as a sequences of eight
+ * bit bytes.  Since we know that the input characters will always be from the
+ * first row of the font (i.e. byte1 == 0), we can do some optimizations beyond
+ * what is done in XTextExtents16.
+ */
+int
+XTextExtents (
+    XFontStruct *fs,
+    _Xconst char *string,
+    int nchars,
+    int *dir,           /* RETURN font information */
+    int *font_ascent,   /* RETURN font information */
+    int *font_descent,  /* RETURN font information */
+    register XCharStruct *overall)     /* RETURN character information */
+{
+    int i;                             /* iterator */
+    Bool singlerow = (fs->max_byte1 == 0);  /* optimization */
+    int nfound = 0;                    /* number of characters found */
+    XCharStruct *def;                  /* info about default char */
+    unsigned char *us;                 /* be 8bit clean */
+
+    if (singlerow) {                   /* optimization */
+       CI_GET_DEFAULT_INFO_1D (fs, def);
+    } else {
+       CI_GET_DEFAULT_INFO_2D (fs, def);
+    }
+
+    *dir = fs->direction;
+    *font_ascent = fs->ascent;
+    *font_descent = fs->descent;
+
+    /*
+     * Iterate over the input string getting the appropriate * char struct.
+     * The default (which may be null if there is no def_char) will be returned
+     * if the character doesn't exist.  On the first time * through the loop,
+     * assign the values to overall; otherwise, compute * the new values.
+     */
+
+    for (i = 0, us = (unsigned char *) string; i < nchars; i++, us++) {
+       register unsigned uc = (unsigned) *us;  /* since about to do macro */
+       register XCharStruct *cs;
+
+       if (singlerow) {                /* optimization */
+           CI_GET_CHAR_INFO_1D (fs, uc, def, cs);
+       } else {
+           CI_GET_ROWZERO_CHAR_INFO_2D (fs, uc, def, cs);
+       }
+
+       if (cs) {
+           if (nfound++ == 0) {
+               *overall = *cs;
+           } else {
+               overall->ascent = max (overall->ascent, cs->ascent);
+               overall->descent = max (overall->descent, cs->descent);
+               overall->lbearing = min (overall->lbearing,
+                                        overall->width + cs->lbearing);
+               overall->rbearing = max (overall->rbearing,
+                                        overall->width + cs->rbearing);
+               overall->width += cs->width;
+           }
+       }
+    }
+
+    /*
+     * if there were no characters, then set everything to 0
+     */
+    if (nfound == 0) {
+       overall->width = overall->ascent = overall->descent =
+         overall->lbearing = overall->rbearing = 0;
+    }
+
+    return 0;
+}
+
+
+/*
+ * XTextWidth - compute the width of a string of eightbit bytes.  This is a
+ * subset of XTextExtents.
+ */
+int
+XTextWidth (
+    XFontStruct *fs,
+    _Xconst char *string,
+    int count)
+{
+    int i;                             /* iterator */
+    Bool singlerow = (fs->max_byte1 == 0);  /* optimization */
+    XCharStruct *def;                  /* info about default char */
+    unsigned char *us;                 /* be 8bit clean */
+    int width = 0;                     /* RETURN value */
+
+    if (singlerow) {                   /* optimization */
+       CI_GET_DEFAULT_INFO_1D (fs, def);
+    } else {
+       CI_GET_DEFAULT_INFO_2D (fs, def);
+    }
+
+    if (def && fs->min_bounds.width == fs->max_bounds.width)
+       return (fs->min_bounds.width * count);
+
+    /*
+     * Iterate over all character in the input string; only consider characters
+     * that exist.
+     */
+    for (i = 0, us = (unsigned char *) string; i < count; i++, us++) {
+       register unsigned uc = (unsigned) *us;  /* since about to do macro */
+       register XCharStruct *cs;
+
+       if (singlerow) {                /* optimization */
+           CI_GET_CHAR_INFO_1D (fs, uc, def, cs);
+       } else {
+           CI_GET_ROWZERO_CHAR_INFO_2D (fs, uc, def, cs);
+       }
+
+       if (cs) width += cs->width;
+    }
+
+    return width;
+}
+
+
+
+/*
+ * _XTextHeight - compute the height of a string of eightbit bytes.
+ */
+int
+_XTextHeight (
+    XFontStruct *fs,
+    _Xconst char *string,
+    int count)
+{
+    int i;                             /* iterator */
+    Bool singlerow = (fs->max_byte1 == 0);  /* optimization */
+    XCharStruct *def;                  /* info about default char */
+    unsigned char *us;                 /* be 8bit clean */
+    int height = 0;                    /* RETURN value */
+
+    if (singlerow) {                   /* optimization */
+       CI_GET_DEFAULT_INFO_1D (fs, def);
+    } else {
+       CI_GET_DEFAULT_INFO_2D (fs, def);
+    }
+
+    if (def && (fs->min_bounds.ascent == fs->max_bounds.ascent)
+           && (fs->min_bounds.descent == fs->max_bounds.descent))
+       return ((fs->min_bounds.ascent + fs->min_bounds.descent) * count);
+
+    /*
+     * Iterate over all character in the input string; only consider characters
+     * that exist.
+     */
+    for (i = 0, us = (unsigned char *) string; i < count; i++, us++) {
+       register unsigned uc = (unsigned) *us;  /* since about to do macro */
+       register XCharStruct *cs;
+
+       if (singlerow) {                /* optimization */
+           CI_GET_CHAR_INFO_1D (fs, uc, def, cs);
+       } else {
+           CI_GET_ROWZERO_CHAR_INFO_2D (fs, uc, def, cs);
+       }
+
+       if (cs) height += (cs->ascent + cs->descent);
+    }
+
+    return height;
+}
+
diff --git a/src/TextExt16.c b/src/TextExt16.c
new file mode 100644 (file)
index 0000000..01a0f32
--- /dev/null
@@ -0,0 +1,210 @@
+/*
+
+Copyright 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.
+
+*/
+/*
+ * Copyright 1995 by FUJITSU LIMITED
+ * This is source code modified by FUJITSU LIMITED under the Joint
+ * Development Agreement for the CDE/Motif PST.
+ */
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+
+#define min_byte2 min_char_or_byte2
+#define max_byte2 max_char_or_byte2
+
+/*
+ * XTextExtents16 - compute the extents of string given as a sequence of
+ * XChar2bs.
+ */
+int
+XTextExtents16 (
+    XFontStruct *fs,
+    _Xconst XChar2b *string,
+    int nchars,
+    int *dir,           /* RETURN font information */
+    int *font_ascent,   /* RETURN font information */
+    int *font_descent,  /* RETURN font information */
+    register XCharStruct *overall)     /* RETURN character information */
+{
+    int i;                             /* iterator */
+    Bool singlerow = (fs->max_byte1 == 0);  /* optimization */
+    int nfound = 0;                    /* number of characters found */
+    XCharStruct *def;                  /* info about default char */
+
+    if (singlerow) {
+       CI_GET_DEFAULT_INFO_1D (fs, def);
+    } else {
+       CI_GET_DEFAULT_INFO_2D (fs, def);
+    }
+
+    *dir = fs->direction;
+    *font_ascent = fs->ascent;
+    *font_descent = fs->descent;
+
+    /*
+     * Iterate over the input string getting the appropriate * char struct.
+     * The default (which may be null if there is no def_char) will be returned
+     * if the character doesn't exist.  On the first time * through the loop,
+     * assign the values to overall; otherwise, compute * the new values.
+     */
+
+    for (i = 0; i < nchars; i++, string++) {
+       register XCharStruct *cs;
+       unsigned int r = (unsigned int) string->byte1;  /* watch for macros */
+       unsigned int c = (unsigned int) string->byte2;  /* watch for macros */
+
+       if (singlerow) {
+           unsigned int ind = ((r << 8) | c);          /* watch for macros */
+           CI_GET_CHAR_INFO_1D (fs, ind, def, cs);
+       } else {
+           CI_GET_CHAR_INFO_2D (fs, r, c, def, cs);
+       }
+
+       if (cs) {
+           if (nfound++ == 0) {
+               *overall = *cs;
+           } else {
+               overall->ascent = max (overall->ascent, cs->ascent);
+               overall->descent = max (overall->descent, cs->descent);
+               overall->lbearing = min (overall->lbearing,
+                                        overall->width + cs->lbearing);
+               overall->rbearing = max (overall->rbearing,
+                                        overall->width + cs->rbearing);
+               overall->width += cs->width;
+           }
+       }
+    }
+
+    /*
+     * if there were no characters, then set everything to 0
+     */
+    if (nfound == 0) {
+       overall->width = overall->ascent = overall->descent =
+         overall->lbearing = overall->rbearing = 0;
+    }
+
+    return 0;
+}
+
+
+/*
+ * XTextWidth16 - compute the width of sequence of XChar2bs.  This is a
+ * subset of XTextExtents16.
+ */
+int
+XTextWidth16 (
+    XFontStruct *fs,
+    _Xconst XChar2b *string,
+    int count)
+{
+    int i;                             /* iterator */
+    Bool singlerow = (fs->max_byte1 == 0);  /* optimization */
+    XCharStruct *def;                  /* info about default char */
+    int width = 0;                     /* RETURN value */
+
+    if (singlerow) {
+       CI_GET_DEFAULT_INFO_1D (fs, def);
+    } else {
+       CI_GET_DEFAULT_INFO_2D (fs, def);
+    }
+
+    if (def && fs->min_bounds.width == fs->max_bounds.width)
+       return (fs->min_bounds.width * count);
+
+    /*
+     * Iterate over all character in the input string; only consider characters
+     * that exist.
+     */
+    for (i = 0; i < count; i++, string++) {
+       register XCharStruct *cs;
+       unsigned int r = (unsigned int) string->byte1;  /* watch for macros */
+       unsigned int c = (unsigned int) string->byte2;  /* watch for macros */
+
+       if (singlerow) {
+           unsigned int ind = ((r << 8) | c);          /* watch for macros */
+           CI_GET_CHAR_INFO_1D (fs, ind, def, cs);
+       } else {
+           CI_GET_CHAR_INFO_2D (fs, r, c, def, cs);
+       }
+
+       if (cs) width += cs->width;
+    }
+
+    return width;
+}
+
+
+/*
+ * _XTextHeight16 - compute the height of sequence of XChar2bs.
+ */
+int
+_XTextHeight16 (
+    XFontStruct *fs,
+    _Xconst XChar2b *string,
+    int count)
+{
+    int i;                             /* iterator */
+    Bool singlerow = (fs->max_byte1 == 0);  /* optimization */
+    XCharStruct *def;                  /* info about default char */
+    int height = 0;                    /* RETURN value */
+
+    if (singlerow) {
+       CI_GET_DEFAULT_INFO_1D (fs, def);
+    } else {
+       CI_GET_DEFAULT_INFO_2D (fs, def);
+    }
+
+    if (def && (fs->min_bounds.ascent == fs->max_bounds.ascent)
+           && (fs->min_bounds.descent == fs->max_bounds.descent))
+       return ((fs->min_bounds.ascent + fs->min_bounds.descent) * count);
+
+    /*
+     * Iterate over all character in the input string; only consider characters
+     * that exist.
+     */
+    for (i = 0; i < count; i++, string++) {
+       register XCharStruct *cs;
+       unsigned int r = (unsigned int) string->byte1;  /* watch for macros */
+       unsigned int c = (unsigned int) string->byte2;  /* watch for macros */
+
+       if (singlerow) {
+           unsigned int ind = ((r << 8) | c);          /* watch for macros */
+           CI_GET_CHAR_INFO_1D (fs, ind, def, cs);
+       } else {
+           CI_GET_CHAR_INFO_2D (fs, r, c, def, cs);
+       }
+
+       if (cs) height += (cs->ascent + cs->descent);
+    }
+
+    return height;
+}
+
diff --git a/src/TextToStr.c b/src/TextToStr.c
new file mode 100644 (file)
index 0000000..216391c
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+
+Copyright 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 <X11/Xlibint.h>
+#include <X11/Xatom.h>
+#include <X11/Xutil.h>
+
+
+/*
+ * XTextPropertyToStringList - set list and count to contain data stored in
+ * null-separated STRING property.
+ */
+
+Status XTextPropertyToStringList (
+    XTextProperty *tp,
+    char ***list_return,
+    int *count_return)
+{
+    char **list;                       /* return value */
+    int nelements;                     /* return value */
+    register char *cp;                 /* temp variable */
+    char *start;                       /* start of thing to copy */
+    int i, j;                          /* iterator variables */
+    int datalen = (int) tp->nitems;    /* for convenience */
+
+    /*
+     * make sure we understand how to do it
+     */
+    if (tp->encoding != XA_STRING ||  tp->format != 8) return False;
+
+    if (datalen == 0) {
+       *list_return = NULL;
+       *count_return = 0;
+       return True;
+    }
+
+    /*
+     * walk the list to figure out how many elements there are
+     */
+    nelements = 1;                     /* since null-separated */
+    for (cp = (char *) tp->value, i = datalen; i > 0; cp++, i--) {
+       if (*cp == '\0') nelements++;
+    }
+
+    /*
+     * allocate list and duplicate
+     */
+    list = (char **) Xmalloc (nelements * sizeof (char *));
+    if (!list) return False;
+
+    start = (char *) Xmalloc ((datalen + 1) * sizeof (char));  /* for <NUL> */
+    if (!start) {
+       Xfree ((char *) list);
+       return False;
+    }
+
+    /*
+     * copy data
+     */
+    memcpy (start, (char *) tp->value, tp->nitems);
+    start[datalen] = '\0';
+
+    /*
+     * walk down list setting value
+     */
+    for (cp = start, i = datalen + 1, j = 0; i > 0; cp++, i--) {
+       if (*cp == '\0') {
+           list[j] = start;
+           start = (cp + 1);
+           j++;
+       }
+    }
+
+    /*
+     * append final null pointer and then return data
+     */
+    *list_return = list;
+    *count_return = nelements;
+    return True;
+}
+
+
+void XFreeStringList (char **list)
+{
+    if (list) {
+       if (list[0]) Xfree (list[0]);
+       Xfree ((char *) list);
+       list = NULL;
+    }
+}
+
diff --git a/src/TrCoords.c b/src/TrCoords.c
new file mode 100644 (file)
index 0000000..77c1f06
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+Bool XTranslateCoordinates(
+     register Display *dpy,
+     Window src_win,
+     Window dest_win,
+     int src_x,
+     int src_y,
+     int *dst_x,
+     int *dst_y,
+     Window *child)
+{
+    register xTranslateCoordsReq *req;
+    xTranslateCoordsReply rep;
+
+    LockDisplay(dpy);
+    GetReq(TranslateCoords, req);
+    req->srcWid = src_win;
+    req->dstWid = dest_win;
+    req->srcX = src_x;
+    req->srcY = src_y;
+    if (_XReply (dpy, (xReply *)&rep, 0, xTrue) == 0) {
+           UnlockDisplay(dpy);
+           SyncHandle();
+           return(False);
+       }
+
+    *child = rep.child;
+    *dst_x = cvtINT16toInt (rep.dstX);
+    *dst_y = cvtINT16toInt (rep.dstY);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return ((int)rep.sameScreen);
+}
+
diff --git a/src/UIThrStubs.c b/src/UIThrStubs.c
new file mode 100644 (file)
index 0000000..95873e8
--- /dev/null
@@ -0,0 +1,157 @@
+/*
+ *
+ * Copyright (c) 1995 David E. Wexelblat.  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 shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL DAVID E. WEXELBLAT BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION 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 David E. Wexelblat shall
+ * not be used in advertising or otherwise to promote the sale, use or
+ * other dealings in this Software without prior written authorization
+ * from David E. Wexelblat.
+ *
+ */
+
+/*
+ * Stubs for thread functions needed by the X library.  Supports
+ * UnixWare 2.x threads; may support Solaris 2 threads as well, but not
+ * tested.  Defining things this way removes the dependency of the X
+ * library on the threads library, but still supports threads if the user
+ * specificies the thread library on the link line.
+ */
+
+/*
+ * Modifications by Carlos A M dos Santos, XFree86 Project, November 1999.
+ *
+ * Explanation from <X11/Xos_r.h>:
+ * The structure below is complicated, mostly because P1003.1c (the
+ * IEEE POSIX Threads spec) went through lots of drafts, and some
+ * vendors shipped systems based on draft API that were changed later.
+ * Unfortunately POSIX did not provide a feature-test macro for
+ * distinguishing each of the drafts.
+ */
+
+#ifdef CTHREADS
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <cthreads.h>
+typedef cthread_t xthread_t;
+#define xthread_self cthread_self
+#pragma weak cthread_self = _Xthr_self_stub_
+#define xmutex_init mutex_init
+#pragma weak mutex_init = _Xthr_zero_stub_
+#pragma weak mutex_clear = _Xthr_zero_stub_
+#pragma weak mutex_lock = _Xthr_zero_stub_
+#pragma weak mutex_unlock = _Xthr_zero_stub_
+#pragma weak condition_init = _Xthr_zero_stub_
+#pragma weak condition_clear = _Xthr_zero_stub_
+#pragma weak condition_wait = _Xthr_zero_stub_
+#pragma weak condition_signal = _Xthr_zero_stub_
+#pragma weak condition_broadcast = _Xthr_zero_stub_
+#else /* !CTHREADS */
+#if defined(SVR4) && !defined(__sgi)
+#include <thread.h>
+typedef thread_t xthread_t;
+#pragma weak thr_self = _Xthr_self_stub_
+#pragma weak mutex_init = _Xthr_zero_stub_
+#pragma weak mutex_destroy = _Xthr_zero_stub_
+#pragma weak mutex_lock = _Xthr_zero_stub_
+#pragma weak mutex_unlock = _Xthr_zero_stub_
+#pragma weak cond_init = _Xthr_zero_stub_
+#pragma weak cond_destroy = _Xthr_zero_stub_
+#pragma weak cond_wait = _Xthr_zero_stub_
+#pragma weak cond_signal = _Xthr_zero_stub_
+#pragma weak cond_broadcast = _Xthr_zero_stub_
+#else /* !SVR4 */
+#ifdef WIN32
+#include <X11/Xthreads.h>
+#else /* !WIN32 */
+#ifdef USE_TIS_SUPPORT
+#include <tis.h>
+typedef pthread_t xthread_t;
+#pragma weak tis_self = _Xthr_self_stub_
+#pragma weak tis_mutex_init = _Xthr_zero_stub_
+#pragma weak tis_mutex_destroy = _Xthr_zero_stub_
+#pragma weak tis_mutex_lock = _Xthr_zero_stub_
+#pragma weak tis_mutex_unlock = _Xthr_zero_stub_
+#pragma weak tis_cond_init = _Xthr_zero_stub_
+#pragma weak tis_cond_destroy = _Xthr_zero_stub_
+#pragma weak tis_cond_wait = _Xthr_zero_stub_
+#pragma weak tis_cond_signal = _Xthr_zero_stub_
+#pragma weak tis_cond_broadcast = _Xthr_zero_stub_
+#else
+#include <pthread.h>
+typedef pthread_t xthread_t;
+#if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
+xthread_t pthread_self()    __attribute__ ((weak, alias ("_Xthr_self_stub_")));
+int pthread_mutex_init()    __attribute__ ((weak, alias ("_Xthr_zero_stub_")));
+int pthread_mutex_destroy() __attribute__ ((weak, alias ("_Xthr_zero_stub_")));
+int pthread_mutex_lock()    __attribute__ ((weak, alias ("_Xthr_zero_stub_")));
+int pthread_mutex_unlock()  __attribute__ ((weak, alias ("_Xthr_zero_stub_")));
+int pthread_cond_init()     __attribute__ ((weak, alias ("_Xthr_zero_stub_")));
+int pthread_cond_destroy()  __attribute__ ((weak, alias ("_Xthr_zero_stub_")));
+int pthread_cond_wait()     __attribute__ ((weak, alias ("_Xthr_zero_stub_")));
+int pthread_cond_signal()   __attribute__ ((weak, alias ("_Xthr_zero_stub_")));
+int pthread_cond_broadcast() __attribute__ ((weak, alias ("_Xthr_zero_stub_")));
+int pthread_key_create()    __attribute__ ((weak, alias ("_Xthr_zero_stub_")));
+void *pthread_getspecific()  __attribute__ ((weak, alias ("_Xthr_zero_stub_")));
+int pthread_setspecific()   __attribute__ ((weak, alias ("_Xthr_zero_stub_")));
+#else  /* __GNUC__ */
+#pragma weak pthread_self = _Xthr_self_stub_
+#pragma weak pthread_mutex_init = _Xthr_zero_stub_
+#pragma weak pthread_mutex_destroy = _Xthr_zero_stub_
+#pragma weak pthread_mutex_lock = _Xthr_zero_stub_
+#pragma weak pthread_mutex_unlock = _Xthr_zero_stub_
+#pragma weak pthread_cond_init = _Xthr_zero_stub_
+#pragma weak pthread_cond_destroy = _Xthr_zero_stub_
+#pragma weak pthread_cond_wait = _Xthr_zero_stub_
+#pragma weak pthread_cond_signal = _Xthr_zero_stub_
+#pragma weak pthread_cond_broadcast = _Xthr_zero_stub_
+/* These are added for libGL */
+#pragma weak pthread_key_create = _Xthr_zero_stub_
+#pragma weak pthread_getspecific = _Xthr_zero_stub_
+#pragma weak pthread_setspecific = _Xthr_zero_stub_
+#endif /* __GNUC__ */
+#if defined(_DECTHREADS_) || defined(linux)
+#pragma weak pthread_equal = _Xthr_equal_stub_ /* See Xthreads.h! */
+int
+_Xthr_equal_stub_()
+{
+    return(1);
+}
+#endif /* _DECTHREADS_ || linux */
+#endif /* USE_TIS_SUPPORT */
+#endif /* WIN32 */
+#endif /* SVR4 */
+#endif /* CTHREADS */
+
+static xthread_t
+_Xthr_self_stub_()
+{
+    static xthread_t _X_no_thread_id;
+
+    return(_X_no_thread_id);   /* defined by <X11/Xthreads.h> */
+}
+
+static int
+_Xthr_zero_stub_()
+{
+    return(0);
+}
diff --git a/src/UndefCurs.c b/src/UndefCurs.c
new file mode 100644 (file)
index 0000000..1d46ff9
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XUndefineCursor (
+    register Display *dpy,
+    Window w)
+{
+    register xChangeWindowAttributesReq *req;
+    unsigned long defcurs = None;
+
+    LockDisplay(dpy);
+    GetReqExtra (ChangeWindowAttributes, 4, req);
+    req->window = w;
+    req->valueMask = CWCursor;
+    OneDataCard32 (dpy, NEXTPTR(req,xChangeWindowAttributesReq), defcurs);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/UngrabBut.c b/src/UngrabBut.c
new file mode 100644 (file)
index 0000000..13545ed
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XUngrabButton(
+    register Display *dpy,
+    unsigned int button, /* CARD8 */
+    unsigned int modifiers, /* CARD16 */
+    Window grab_window)
+{
+    register xUngrabButtonReq *req;
+
+    LockDisplay(dpy);
+    GetReq(UngrabButton, req);
+    req->button = button;
+    req->modifiers = modifiers;
+    req->grabWindow = grab_window;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/UngrabKbd.c b/src/UngrabKbd.c
new file mode 100644 (file)
index 0000000..974e8a3
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XUngrabKeyboard (
+        register Display *dpy,
+       Time time)
+{
+        register xResourceReq *req;
+
+       LockDisplay(dpy);
+        GetResReq(UngrabKeyboard, time, req);
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return 1;
+}
+
diff --git a/src/UngrabKey.c b/src/UngrabKey.c
new file mode 100644 (file)
index 0000000..919c4e7
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XUngrabKey(
+     register Display *dpy,
+     int key,
+     unsigned int modifiers,
+     Window grab_window)
+{
+    register xUngrabKeyReq *req;
+
+    LockDisplay(dpy);
+    GetReq(UngrabKey, req);
+    req->grabWindow = grab_window;
+    req->modifiers = modifiers;
+    req->key = key;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
+
+
diff --git a/src/UngrabPtr.c b/src/UngrabPtr.c
new file mode 100644 (file)
index 0000000..1641792
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XUngrabPointer(
+    register Display *dpy,
+    Time time)
+{
+    register xResourceReq *req;
+
+    LockDisplay(dpy);
+    GetResReq(UngrabPointer, time, req);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/UngrabSvr.c b/src/UngrabSvr.c
new file mode 100644 (file)
index 0000000..ea00848
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XUngrabServer (
+    register Display *dpy)
+{
+        register xReq *req;
+
+        LockDisplay(dpy);
+        GetEmptyReq(UngrabServer, req);
+        UnlockDisplay(dpy);
+       SyncHandle();
+       return 1;
+}
+
diff --git a/src/UninsCmap.c b/src/UninsCmap.c
new file mode 100644 (file)
index 0000000..db574ef
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XUninstallColormap(
+    register Display *dpy,
+    Colormap cmap)
+{
+    register xResourceReq *req;
+
+    LockDisplay(dpy);
+    GetResReq(UninstallColormap, cmap, req);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/UnldFont.c b/src/UnldFont.c
new file mode 100644 (file)
index 0000000..a4f69fe
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XUnloadFont(
+     register Display *dpy,
+     Font font)
+{
+    register xResourceReq *req;
+
+    LockDisplay(dpy);
+    GetResReq(CloseFont, font, req);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/UnmapSubs.c b/src/UnmapSubs.c
new file mode 100644 (file)
index 0000000..7490a70
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XUnmapSubwindows(
+    register Display *dpy,
+    Window win)
+{
+    register xResourceReq *req;
+
+    LockDisplay(dpy);
+    GetResReq(UnmapSubwindows,win, req);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
diff --git a/src/UnmapWin.c b/src/UnmapWin.c
new file mode 100644 (file)
index 0000000..51ae163
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XUnmapWindow (
+        register Display *dpy,
+       Window w)
+{
+        register xResourceReq *req;
+
+        LockDisplay(dpy);
+        GetResReq(UnmapWindow, w, req);
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return 1;
+}
+
diff --git a/src/VisUtil.c b/src/VisUtil.c
new file mode 100644 (file)
index 0000000..3434c01
--- /dev/null
@@ -0,0 +1,254 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+#include "Xutil.h"
+#include <stdio.h>
+/*
+ *     This procedure returns a list of visual information structures
+ *     that match the specified attributes given in the visual information
+ *     template.
+ *
+ *     If no visuals exist that match the specified attributes, a NULL is
+ *     returned.
+ *
+ *     The choices for visual_info_mask are:
+ *
+ *             VisualNoMask
+ *             VisualIDMask
+ *             VisualScreenMask
+ *             VisualDepthMask
+ *             VisualClassMask
+ *             VisualRedMaskMask
+ *             VisualGreenMaskMask
+ *             VisualBlueMaskMask
+ *             VisualColormapSizeMask
+ *             VisualBitsPerRGBMask
+ *             VisualAllMask
+ */
+
+XVisualInfo *XGetVisualInfo(
+    Display *dpy,
+    register long visual_info_mask,
+    register XVisualInfo *visual_info_template,
+    int *nitems)       /* RETURN */
+{
+
+  register Visual *vp;
+  register Depth *dp;
+  Screen *sp;
+  int ii,screen_s,screen_e,total,count;
+  register XVisualInfo *vip,*vip_base;
+
+  /* NOTE: NO HIGH PERFORMING CODE TO BE FOUND HERE */
+
+  LockDisplay(dpy);
+
+  /* ALLOCATE THE ORIGINAL BUFFER; REALLOCED LATER IF OVERFLOW OCCURS;
+     FREED AT END IF NO VISUALS ARE FOUND */
+
+  count = 0;
+  total = 10;
+  if (! (vip_base = vip = (XVisualInfo *)
+        Xmalloc((unsigned) (sizeof(XVisualInfo) * total)))) {
+      UnlockDisplay(dpy);
+      return (XVisualInfo *) NULL;
+  }
+
+  /* DETERMINE IF WE DO ALL SCREENS OR ONLY ONE */
+
+  screen_s = 0;
+  screen_e = dpy->nscreens;
+  if (visual_info_mask & VisualScreenMask)
+    {
+      screen_s = visual_info_template->screen;
+      if (screen_s < 0 || screen_s >= screen_e)
+         screen_e = screen_s;
+      else
+         screen_e = screen_s + 1;
+    }
+
+  /* LOOP THROUGH SCREENS */
+
+  for (ii=screen_s; ii<screen_e; ii++)
+    {
+      sp = (Screen *)(&dpy->screens[ii]);
+
+      /* LOOP THROUGH DEPTHS */
+
+      for (dp=sp->depths; dp < (sp->depths + sp->ndepths); dp++)
+        {
+          if ((visual_info_mask & VisualDepthMask) &&
+             (dp->depth != visual_info_template->depth)) continue;
+
+          /* LOOP THROUGH VISUALS */
+
+         if (dp->visuals) {
+           for (vp=dp->visuals; vp<(dp->visuals + dp->nvisuals); vp++) {
+              if ((visual_info_mask & VisualIDMask) &&
+                (vp->visualid != visual_info_template->visualid)) continue;
+              if ((visual_info_mask & VisualClassMask) &&
+                (vp->class != visual_info_template->class)) continue;
+              if ((visual_info_mask & VisualRedMaskMask) &&
+                (vp->red_mask != visual_info_template->red_mask)) continue;
+              if ((visual_info_mask & VisualGreenMaskMask) &&
+                (vp->green_mask != visual_info_template->green_mask)) continue;
+              if ((visual_info_mask & VisualBlueMaskMask) &&
+                (vp->blue_mask != visual_info_template->blue_mask)) continue;
+              if ((visual_info_mask & VisualColormapSizeMask) &&
+                (vp->map_entries != visual_info_template->colormap_size)) continue;
+              if ((visual_info_mask & VisualBitsPerRGBMask) &&
+                (vp->bits_per_rgb != visual_info_template->bits_per_rgb)) continue;
+
+              /* YEA!!! WE FOUND A GOOD ONE */
+
+              if (count+1 > total)
+                {
+                 XVisualInfo *old_vip_base = vip_base;
+                  total += 10;
+                  if (! (vip_base = (XVisualInfo *)
+                        Xrealloc((char *) vip_base,
+                                 (unsigned) (sizeof(XVisualInfo) * total)))) {
+                     Xfree((char *) old_vip_base);
+                     UnlockDisplay(dpy);
+                     return (XVisualInfo *) NULL;
+                 }
+                  vip = &vip_base[count];
+                }
+
+              count++;
+
+              vip->visual = _XVIDtoVisual(dpy, vp->visualid);
+              vip->visualid = vp->visualid;
+              vip->screen = ii;
+              vip->depth = dp->depth;
+              vip->class = vp->class;
+              vip->red_mask = vp->red_mask;
+              vip->green_mask = vp->green_mask;
+              vip->blue_mask = vp->blue_mask;
+              vip->colormap_size = vp->map_entries;
+              vip->bits_per_rgb = vp->bits_per_rgb;
+
+              vip++;
+
+            } /* END OF LOOP ON VISUALS */
+         } /* END OF IF THERE ARE ANY VISUALS AT THIS DEPTH */
+
+        } /* END OF LOOP ON DEPTHS */
+
+    } /* END OF LOOP ON SCREENS */
+
+  UnlockDisplay(dpy);
+
+  if (count)
+    {
+      *nitems = count;
+      return vip_base;
+    }
+
+  Xfree((char *) vip_base);
+  *nitems = 0;
+  return NULL;
+}
+
+\f
+/*
+ *     This procedure will return the visual information for a visual
+ *      that matches the specified depth and class for a screen.  Since
+ *     multiple visuals may exist that match the specified depth and
+ *     class, which visual chosen is undefined.
+ *
+ *     If a visual is found, True is returned as the function value,
+ *     otherwise False is returned.
+ */
+
+Status XMatchVisualInfo(
+       Display *dpy,
+       int screen,
+       int depth,
+       int class,
+       XVisualInfo *visual_info) /* RETURNED */
+{
+
+  Visual *vp;
+  Depth *dp;
+  Screen *sp;
+  int ii,jj;
+
+  if (screen < 0 || screen >= dpy->nscreens)
+      return False;
+
+  LockDisplay(dpy);
+
+  sp = (Screen *)(&dpy->screens[screen]);
+
+  dp = sp->depths;
+
+  for (ii=0; ii < sp->ndepths; ii++)
+    {
+
+    /* LOOK THROUGH DEPTHS FOR THE WANTED DEPTH */
+
+    if (dp->depth == depth)
+      {
+        vp = dp->visuals;
+
+        /* LOOK THROUGH VISUALS FOR THE WANTED CLASS */
+
+       /* if nvisuals == 0 then vp will be NULL */
+        for (jj=0; jj<dp->nvisuals; jj++)
+          {
+            if (vp->class == class)
+              {
+               visual_info->visual = _XVIDtoVisual(dpy, vp->visualid);
+               visual_info->visualid = vp->visualid;
+               visual_info->screen = screen;
+               visual_info->depth = depth;
+               visual_info->class = vp->class;
+               visual_info->red_mask = vp->red_mask;
+               visual_info->green_mask = vp->green_mask;
+               visual_info->blue_mask = vp->blue_mask;
+               visual_info->colormap_size = vp->map_entries;
+               visual_info->bits_per_rgb = vp->bits_per_rgb;
+                UnlockDisplay(dpy);
+                return True;
+              }
+            vp++;
+          }
+      }
+
+    dp++;
+
+    }
+
+  UnlockDisplay(dpy);
+
+  return False;
+
+}
diff --git a/src/WMGeom.c b/src/WMGeom.c
new file mode 100644 (file)
index 0000000..7947536
--- /dev/null
@@ -0,0 +1,183 @@
+/*
+
+Copyright 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 "Xlibint.h"
+#include "Xutil.h"
+
+static int _GeometryMaskToGravity(
+    int mask);
+
+/*
+ * This routine given a user supplied positional argument and a default
+ * argument (fully qualified) will return the position the window should take
+ * as well as the gravity to be set in the WM_NORMAL_HINTS size hints.
+ * Always sets all return values and returns a mask describing which fields
+ * were set by the user or'ed with whether or not the x and y values should
+ * be considered "negative".
+ */
+
+int
+XWMGeometry (
+    Display *dpy,                      /* user's display connection */
+    int screen,                                /* screen on which to do computation */
+    _Xconst char *user_geom,           /* user provided geometry spec */
+    _Xconst char *def_geom,            /* default geometry spec for window */
+    unsigned int bwidth,               /* border width */
+    XSizeHints *hints,                 /* usually WM_NORMAL_HINTS */
+    int *x_return,                     /* location of window */
+    int *y_return,                     /* location of window */
+    int *width_return,                 /* size of window */
+    int *height_return,                        /* size of window */
+    int *gravity_return)               /* gravity of window */
+{
+    int ux, uy;                                /* returned values from parse */
+    unsigned int uwidth, uheight;      /* returned values from parse */
+    int umask;                         /* parse mask of returned values */
+    int dx, dy;                                /* default values from parse */
+    unsigned int dwidth, dheight;      /* default values from parse */
+    int dmask;                         /* parse mask of returned values */
+    int base_width, base_height;       /* valid amounts */
+    int min_width, min_height;         /* valid amounts */
+    int width_inc, height_inc;         /* valid amounts */
+    int rx, ry, rwidth, rheight;       /* return values */
+    int rmask;                         /* return mask */
+
+    /*
+     * Get the base sizes and increments.  Section 4.1.2.3 of the ICCCM
+     * states that the base and minimum sizes are defaults for each other.
+     * If neither is given, then the base sizes should be 0.  These parameters
+     * control the sets of sizes that window managers should allow for the
+     * window according to the following formulae:
+     *
+     *          width = base_width  + (i * width_inc)
+     *         height = base_height + (j * height_inc)
+     */
+    base_width =  ((hints->flags & PBaseSize) ? hints->base_width :
+                  ((hints->flags & PMinSize) ? hints->min_width : 0));
+    base_height = ((hints->flags & PBaseSize) ? hints->base_height :
+                  ((hints->flags & PMinSize) ? hints->min_height : 0));
+    min_width = ((hints->flags & PMinSize) ? hints->min_width : base_width);
+    min_height = ((hints->flags & PMinSize) ? hints->min_height : base_height);
+    width_inc = (hints->flags & PResizeInc) ? hints->width_inc : 1;
+    height_inc = (hints->flags & PResizeInc) ? hints->height_inc : 1;
+
+
+    /*
+     * parse the two geometry masks
+     */
+    rmask = umask = XParseGeometry (user_geom, &ux, &uy, &uwidth, &uheight);
+    dmask = XParseGeometry (def_geom, &dx, &dy, &dwidth, &dheight);
+
+
+    /*
+     * get the width and height:
+     *     1.  if user-specified, then take that value
+     *     2.  else, if program-specified, then take that value
+     *     3.  else, take 1
+     *     4.  multiply by the size increment
+     *     5.  and add to the base size
+     */
+    rwidth = ((((umask & WidthValue) ? uwidth :
+               ((dmask & WidthValue) ? dwidth : 1)) * width_inc) +
+             base_width);
+    rheight = ((((umask & HeightValue) ? uheight :
+                ((dmask & HeightValue) ? dheight : 1)) * height_inc) +
+              base_height);
+
+    /*
+     * Make sure computed size is within limits.  Note that we always do the
+     * lower bounds check since the base size (which defaults to 0) should
+     * be used if a minimum size isn't specified.
+     */
+    if (rwidth < min_width) rwidth = min_width;
+    if (rheight < min_height) rheight = min_height;
+
+    if (hints->flags & PMaxSize) {
+       if (rwidth > hints->max_width) rwidth = hints->max_width;
+       if (rheight > hints->max_height) rheight = hints->max_height;
+    }
+
+
+    /*
+     * Compute the location.  Set the negative flags in the return mask
+     * (and watch out for borders), if necessary.
+     */
+    if (umask & XValue) {
+       rx = ((umask & XNegative) ?
+             (DisplayWidth (dpy, screen) + ux - rwidth - 2 * bwidth) : ux);
+    } else if (dmask & XValue) {
+       if (dmask & XNegative) {
+           rx = (DisplayWidth (dpy, screen) + dx - rwidth - 2 * bwidth);
+           rmask |= XNegative;
+       } else
+         rx = dx;
+    } else {
+       rx = 0;                         /* gotta choose something... */
+    }
+
+    if (umask & YValue) {
+       ry = ((umask & YNegative) ?
+             (DisplayHeight(dpy, screen) + uy - rheight - 2 * bwidth) : uy);
+    } else if (dmask & YValue) {
+       if (dmask & YNegative) {
+           ry = (DisplayHeight(dpy, screen) + dy - rheight - 2 * bwidth);
+           rmask |= YNegative;
+       } else
+         ry = dy;
+    } else {
+       ry = 0;                         /* gotta choose something... */
+    }
+
+
+    /*
+     * All finished, so set the return variables.
+     */
+    *x_return = rx;
+    *y_return = ry;
+    *width_return = rwidth;
+    *height_return = rheight;
+    *gravity_return = _GeometryMaskToGravity (rmask);
+    return rmask;
+}
+
+
+static int _GeometryMaskToGravity(
+    int mask)
+{
+    switch (mask & (XNegative|YNegative)) {
+      case 0:
+        return NorthWestGravity;
+      case XNegative:
+        return NorthEastGravity;
+      case YNegative:
+        return SouthWestGravity;
+      default:
+        return SouthEastGravity;
+    }
+}
diff --git a/src/WMProps.c b/src/WMProps.c
new file mode 100644 (file)
index 0000000..3ccb654
--- /dev/null
@@ -0,0 +1,147 @@
+/*
+
+Copyright 1987, 1988, 1993, 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 1988 by Wyse Technology, Inc., San Jose, Ca.,
+Copyright 1987 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 Wyse not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+WYSE 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 <X11/Xlibint.h>
+#include <X11/Xatom.h>
+#include <X11/Xutil.h>
+#include <X11/Xos.h>
+#include <X11/Xlocale.h>
+
+
+/*
+ * XSetWMProperties sets the following properties:
+ *     WM_NAME           type: TEXT            format: varies?
+ *     WM_ICON_NAME      type: TEXT            format: varies?
+ *     WM_HINTS          type: WM_HINTS        format: 32
+ *     WM_COMMAND        type: TEXT            format: varies?
+ *     WM_CLIENT_MACHINE type: TEXT            format: varies?
+ *     WM_NORMAL_HINTS   type: WM_SIZE_HINTS   format: 32
+ *     WM_CLASS          type: STRING/STRING   format: 8
+  *    WM_LOCALE_NAME    type: STRING          format: 8
+ */
+
+void XSetWMProperties (
+     Display *dpy,
+     Window w,                 /* window to decorate */
+     XTextProperty *windowName,        /* name of application */
+     XTextProperty *iconName,  /* name string for icon */
+     char **argv,              /* command line */
+     int argc,                 /* size of command line */
+     XSizeHints *sizeHints,    /* size hints for window in its normal state */
+     XWMHints *wmHints,                /* miscelaneous window manager hints */
+     XClassHint *classHints)   /* resource name and class */
+{
+    XTextProperty textprop;
+    char hostName[256];
+    int len = _XGetHostname (hostName, sizeof hostName);
+    char *locale;
+
+    /* set names of window and icon */
+    if (windowName) XSetWMName (dpy, w, windowName);
+    if (iconName) XSetWMIconName (dpy, w, iconName);
+
+    /* set the command if given */
+    if (argv) {
+       /*
+        * for UNIX and other operating systems which use nul-terminated
+        * arrays of STRINGs.
+        */
+       XSetCommand (dpy, w, argv, argc);
+    }
+
+    /* set the name of the machine on which this application is running */
+    textprop.value = (unsigned char *) hostName;
+    textprop.encoding = XA_STRING;
+    textprop.format = 8;
+    textprop.nitems = len;
+    XSetWMClientMachine (dpy, w, &textprop);
+
+    /* set hints about how geometry and window manager interaction */
+    if (sizeHints) XSetWMNormalHints (dpy, w, sizeHints);
+    if (wmHints) XSetWMHints (dpy, w, wmHints);
+    if (classHints) {
+       XClassHint tmp;
+
+       if (!classHints->res_name) {
+           tmp.res_name = getenv ("RESOURCE_NAME");
+           if (!tmp.res_name && argv && argv[0]) {
+               /*
+                * UNIX uses /dir/subdir/.../basename; other operating
+                * systems will have to change this.
+                */
+               char *cp = strrchr (argv[0], '/');
+#ifdef __UNIXOS2__
+               char *os2_cp = strrchr (argv[0],'\\');
+               char *dot_cp = strrchr (argv[0],'.');
+               if (os2_cp && (os2_cp > cp)) {
+                   if(dot_cp && (dot_cp > os2_cp)) *dot_cp = '\0';
+                   cp=os2_cp;
+               }
+#endif
+               tmp.res_name = (cp ? cp + 1 : argv[0]);
+           }
+           tmp.res_class = classHints->res_class;
+           classHints = &tmp;
+       }
+       XSetClassHint (dpy, w, classHints);
+    }
+
+    locale = setlocale(LC_CTYPE, (char *)NULL);
+    if (locale)
+        XChangeProperty (dpy, w, XInternAtom(dpy, "WM_LOCALE_NAME", False),
+        XA_STRING, 8, PropModeReplace,
+        (unsigned char *)locale, strlen(locale));
+}
+
diff --git a/src/WarpPtr.c b/src/WarpPtr.c
new file mode 100644 (file)
index 0000000..c88ca47
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+int
+XWarpPointer(
+     register Display *dpy,
+     Window src_win,
+     Window dest_win,
+     int src_x,
+     int src_y,
+     unsigned int src_width,
+     unsigned int src_height,
+     int dest_x,
+     int dest_y)
+{
+    register xWarpPointerReq *req;
+
+    LockDisplay(dpy);
+    GetReq(WarpPointer, req);
+    req->srcWid = src_win;
+    req->dstWid = dest_win;
+    req->srcX = src_x;
+    req->srcY = src_y;
+    req->srcWidth = src_width;
+    req->srcHeight = src_height;
+    req->dstX = dest_x;
+    req->dstY = dest_y;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return 1;
+}
+
diff --git a/src/WinEvent.c b/src/WinEvent.c
new file mode 100644 (file)
index 0000000..c88c8da
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+
+Copyright 1985, 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 "Xlibint.h"
+
+extern long const _Xevent_to_mask[];
+#define AllPointers (PointerMotionMask|PointerMotionHintMask|ButtonMotionMask)
+#define AllButtons (Button1MotionMask|Button2MotionMask|Button3MotionMask|\
+                   Button4MotionMask|Button5MotionMask)
+
+/*
+ * Return the next event in the queue
+ * for the given window matching one of the events in the mask.
+ * Events earlier in the queue are not discarded.
+ * If none found, flush, and then wait until an event arrives which
+ * matches.
+ */
+
+int
+XWindowEvent (
+        register Display *dpy,
+       Window w,               /* Selected window. */
+       long mask,              /* Selected event mask. */
+       register XEvent *event) /* XEvent to be filled in. */
+{
+       register _XQEvent *prev, *qelt;
+       unsigned long qe_serial = 0;
+
+        LockDisplay(dpy);
+
+       /* Delete unclaimed cookies */
+       _XFreeEventCookies(dpy);
+
+       prev = NULL;
+       while (1) {
+           for (qelt = prev ? prev->next : dpy->head;
+                qelt;
+                prev = qelt, qelt = qelt->next) {
+               if ((qelt->event.xany.window == w) &&
+                   (qelt->event.type < GenericEvent) &&
+                   (_Xevent_to_mask[qelt->event.type] & mask) &&
+                   ((qelt->event.type != MotionNotify) ||
+                    (mask & AllPointers) ||
+                    (mask & AllButtons & qelt->event.xmotion.state))) {
+                   *event = qelt->event;
+                   _XDeq(dpy, prev, qelt);
+                   UnlockDisplay(dpy);
+                   return 0;
+               }
+           }
+           if (prev)
+               qe_serial = prev->qserial_num;
+           _XReadEvents(dpy);
+           if (prev && prev->qserial_num != qe_serial)
+               /* another thread has snatched this event */
+               prev = NULL;
+       }
+}
diff --git a/src/Window.c b/src/Window.c
new file mode 100644 (file)
index 0000000..85a28f3
--- /dev/null
@@ -0,0 +1,140 @@
+/*
+
+Copyright 1986, 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 "Xlibint.h"
+
+void _XProcessWindowAttributes (
+    register Display *dpy,
+    xChangeWindowAttributesReq *req,
+    register unsigned long valuemask,
+    register XSetWindowAttributes *attributes)
+{
+    unsigned long values[32];
+    register unsigned long *value = values;
+    unsigned int nvalues;
+
+    if (valuemask & CWBackPixmap)
+       *value++ = attributes->background_pixmap;
+
+    if (valuemask & CWBackPixel)
+       *value++ = attributes->background_pixel;
+
+    if (valuemask & CWBorderPixmap)
+       *value++ = attributes->border_pixmap;
+
+    if (valuemask & CWBorderPixel)
+       *value++ = attributes->border_pixel;
+
+    if (valuemask & CWBitGravity)
+       *value++ = attributes->bit_gravity;
+
+    if (valuemask & CWWinGravity)
+       *value++ = attributes->win_gravity;
+
+    if (valuemask & CWBackingStore)
+        *value++ = attributes->backing_store;
+
+    if (valuemask & CWBackingPlanes)
+       *value++ = attributes->backing_planes;
+
+    if (valuemask & CWBackingPixel)
+       *value++ = attributes->backing_pixel;
+
+    if (valuemask & CWOverrideRedirect)
+       *value++ = attributes->override_redirect;
+
+    if (valuemask & CWSaveUnder)
+       *value++ = attributes->save_under;
+
+    if (valuemask & CWEventMask)
+       *value++ = attributes->event_mask;
+
+    if (valuemask & CWDontPropagate)
+       *value++ = attributes->do_not_propagate_mask;
+
+    if (valuemask & CWColormap)
+       *value++ = attributes->colormap;
+
+    if (valuemask & CWCursor)
+       *value++ = attributes->cursor;
+
+    req->length += (nvalues = value - values);
+
+    nvalues <<= 2;                         /* watch out for macros... */
+    Data32 (dpy, (long *) values, (long)nvalues);
+
+}
+
+#define AllMaskBits (CWBackPixmap|CWBackPixel|CWBorderPixmap|\
+                    CWBorderPixel|CWBitGravity|CWWinGravity|\
+                    CWBackingStore|CWBackingPlanes|CWBackingPixel|\
+                    CWOverrideRedirect|CWSaveUnder|CWEventMask|\
+                    CWDontPropagate|CWColormap|CWCursor)
+
+Window XCreateWindow(
+    register Display *dpy,
+    Window parent,
+    int x,
+    int y,
+    unsigned int width,
+    unsigned int height,
+    unsigned int borderWidth,
+    int depth,
+    unsigned int class,
+    Visual *visual,
+    unsigned long valuemask,
+    XSetWindowAttributes *attributes)
+{
+    Window wid;
+    register xCreateWindowReq *req;
+
+    LockDisplay(dpy);
+    GetReq(CreateWindow, req);
+    req->parent = parent;
+    req->x = x;
+    req->y = y;
+    req->width = width;
+    req->height = height;
+    req->borderWidth = borderWidth;
+    req->depth = depth;
+    req->class = class;
+    if (visual == CopyFromParent)
+       req->visual = CopyFromParent;
+    else
+       req->visual = visual->visualid;
+    wid = req->wid = XAllocID(dpy);
+    valuemask &= AllMaskBits;
+    if ((req->mask = valuemask))
+        _XProcessWindowAttributes (dpy, (xChangeWindowAttributesReq *)req,
+                       valuemask, attributes);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return (wid);
+    }
+
diff --git a/src/Withdraw.c b/src/Withdraw.c
new file mode 100644 (file)
index 0000000..ac15ddc
--- /dev/null
@@ -0,0 +1,82 @@
+
+/***********************************************************
+Copyright 1988 by Wyse Technology, Inc., San Jose, Ca.,
+
+                        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 Wyse not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+WYSE 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 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 <X11/Xlibint.h>
+#include <X11/Xatom.h>
+#include <X11/Xos.h>
+#include <X11/Xutil.h>
+#include <stdio.h>
+
+/*
+ * This function instructs the window manager to change this window from
+ * NormalState or IconicState to Withdrawn.
+ */
+Status XWithdrawWindow (
+    Display *dpy,
+    Window w,
+    int screen)
+{
+    XUnmapEvent ev;
+    Window root = RootWindow (dpy, screen);
+
+    XUnmapWindow (dpy, w);
+
+    ev.type = UnmapNotify;
+    ev.event = root;
+    ev.window = w;
+    ev.from_configure = False;
+    return (XSendEvent (dpy, root, False,
+                       SubstructureRedirectMask|SubstructureNotifyMask,
+                       (XEvent *)&ev));
+}
diff --git a/src/WrBitF.c b/src/WrBitF.c
new file mode 100644 (file)
index 0000000..1ec6280
--- /dev/null
@@ -0,0 +1,156 @@
+/*
+
+Copyright 1987, 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 "Xlibint.h"
+#include <X11/Xos.h>
+#include "Xutil.h"
+#include <stdio.h>
+
+#define ERR_RETURN NULL
+
+static char *Format_Image(
+    XImage *image,
+    int *resultsize)
+{
+  register int x, c, b;
+  register char *ptr;
+  int y;
+  char *data;
+  int width, height;
+  int bytes_per_line;
+
+  width = image->width;
+  height = image->height;
+
+  bytes_per_line = (width+7)/8;
+  *resultsize = bytes_per_line * height;           /* Calculate size of data */
+
+  data = (char *) Xmalloc( *resultsize );           /* Get space for data */
+  if (!data)
+    return(ERR_RETURN);
+
+  /*
+   * The slow but robust brute force method of converting the image:
+   */
+  ptr = data;
+  c = 0; b=1;
+  for (y=0; y<height; y++) {
+    for (x=0; x<width;) {
+      if (XGetPixel(image, x, y))
+       c |= b;
+      b <<= 1;
+      if (!(++x & 7)) {
+       *(ptr++)=c;
+       c=0; b=1;
+      }
+    }
+    if (x & 7) {
+      *(ptr++)=c;
+      c=0; b=1;
+    }
+  }
+
+  return(data);
+}
+
+#define BYTES_PER_OUTPUT_LINE 12
+
+int
+XWriteBitmapFile(
+     Display *display,
+     _Xconst char *filename,
+     Pixmap bitmap,
+     unsigned int width,
+     unsigned int height,
+     int x_hot,
+     int y_hot)
+{
+  char *data, *ptr;
+  int size, byte;
+  int c;
+  XImage *image;
+  FILE *stream;
+  char *name;
+
+  if (!(name = strrchr(filename, '/')))
+    name = (char *)filename;
+  else
+    name++;
+
+#ifdef __UNIXOS2__
+  filename = (char*)__XOS2RedirRoot(filename);
+#endif
+  if (!(stream = fopen(filename, "w")))
+    return(BitmapOpenFailed);
+
+  /* Convert bitmap to an image */
+  image = XGetImage(display, bitmap, 0,0,width, height, 1L, XYPixmap);
+  if (!image) {
+    fclose(stream);
+    return(4); /* XXX spec does not say what to return */
+  }
+
+  /* Get standard format for data */
+  data = Format_Image(image, &size);
+  XDestroyImage(image);
+  if (!data) {
+    fclose(stream);
+    return(BitmapNoMemory);
+  }
+
+  /* Write out standard header */
+  fprintf(stream, "#define %s_width %d\n", name, width);
+  fprintf(stream, "#define %s_height %d\n", name, height);
+  if (x_hot != -1) {
+    fprintf(stream, "#define %s_x_hot %d\n", name, x_hot);
+    fprintf(stream, "#define %s_y_hot %d\n", name, y_hot);
+  }
+
+  /* Print out the data itself */
+  fprintf(stream, "static unsigned char %s_bits[] = {", name);
+  for (byte=0, ptr=data; byte<size; byte++, ptr++) {
+    if (!byte)
+      fprintf(stream, "\n   ");
+    else if (!(byte % BYTES_PER_OUTPUT_LINE))
+      fprintf(stream, ",\n   ");
+    else
+      fprintf(stream, ", ");
+    c = *ptr;
+    if (c<0)
+      c += 256;
+    fprintf(stream, "0x%02x", c);
+  }
+  fprintf(stream, "};\n");
+
+  Xfree(data);
+  fclose(stream);
+  return(BitmapSuccess);
+}
diff --git a/src/XErrorDB b/src/XErrorDB
new file mode 100644 (file)
index 0000000..fa24e21
--- /dev/null
@@ -0,0 +1,1009 @@
+!
+! Copyright 1993, 1995, 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.
+!
+!
+! these are used in XGetErrorMessage.
+XlibMessage.XError: X Error of failed request
+XlibMessage.MajorCode: Major opcode of failed request:  %d
+XlibMessage.MinorCode: Minor opcode of failed request:  %d
+XlibMessage.ResourceID: Resource id in failed request:  0x%lx
+XlibMessage.Value: Value in failed request:  0x%lx
+XlibMessage.AtomID: Atom id in failed request:  0x%lx
+XlibMessage.ErrorSerial: Serial number of failed request:  %lu
+XlibMessage.CurrentSerial: Current serial number in output stream:  %lu
+! X request codes.
+XRequest.1:X_CreateWindow
+XRequest.2:X_ChangeWindowAttributes
+XRequest.3:X_GetWindowAttributes
+XRequest.4:X_DestroyWindow
+XRequest.5:X_DestroySubwindows
+XRequest.6:X_ChangeSaveSet
+XRequest.7:X_ReparentWindow
+XRequest.8:X_MapWindow
+XRequest.9:X_MapSubwindows
+XRequest.10:X_UnmapWindow
+XRequest.11:X_UnmapSubwindows
+XRequest.12:X_ConfigureWindow
+XRequest.13:X_CirculateWindow
+XRequest.14:X_GetGeometry
+XRequest.15:X_QueryTree
+XRequest.16:X_InternAtom
+XRequest.17:X_GetAtomName
+XRequest.18:X_ChangeProperty
+XRequest.19:X_DeleteProperty
+XRequest.20:X_GetProperty
+XRequest.21:X_ListProperties
+XRequest.22:X_SetSelectionOwner
+XRequest.23:X_GetSelectionOwner
+XRequest.24:X_ConvertSelection
+XRequest.25:X_SendEvent
+XRequest.26:X_GrabPointer
+XRequest.27:X_UngrabPointer
+XRequest.28:X_GrabButton
+XRequest.29:X_UngrabButton
+XRequest.30:X_ChangeActivePointerGrab
+XRequest.31:X_GrabKeyboard
+XRequest.32:X_UngrabKeyboard
+XRequest.33:X_GrabKey
+XRequest.34:X_UngrabKey
+XRequest.35:X_AllowEvents
+XRequest.36:X_GrabServer
+XRequest.37:X_UngrabServer
+XRequest.38:X_QueryPointer
+XRequest.39:X_GetMotionEvents
+XRequest.40:X_TranslateCoords
+XRequest.41:X_WarpPointer
+XRequest.42:X_SetInputFocus
+XRequest.43:X_GetInputFocus
+XRequest.44:X_QueryKeymap
+XRequest.45:X_OpenFont
+XRequest.46:X_CloseFont
+XRequest.47:X_QueryFont
+XRequest.48:X_QueryTextExtents
+XRequest.49:X_ListFonts
+XRequest.50:X_ListFontsWithInfo
+XRequest.51:X_SetFontPath
+XRequest.52:X_GetFontPath
+XRequest.53:X_CreatePixmap
+XRequest.54:X_FreePixmap
+XRequest.55:X_CreateGC
+XRequest.56:X_ChangeGC
+XRequest.57:X_CopyGC
+XRequest.58:X_SetDashes
+XRequest.59:X_SetClipRectangles
+XRequest.60:X_FreeGC
+XRequest.61:X_ClearArea
+XRequest.62:X_CopyArea
+XRequest.63:X_CopyPlane
+XRequest.64:X_PolyPoint
+XRequest.65:X_PolyLine
+XRequest.66:X_PolySegment
+XRequest.67:X_PolyRectangle
+XRequest.68:X_PolyArc
+XRequest.69:X_FillPoly
+XRequest.70:X_PolyFillRectangle
+XRequest.71:X_PolyFillArc
+XRequest.72:X_PutImage
+XRequest.73:X_GetImage
+XRequest.74:X_PolyText8
+XRequest.75:X_PolyText16
+XRequest.76:X_ImageText8
+XRequest.77:X_ImageText16
+XRequest.78:X_CreateColormap
+XRequest.79:X_FreeColormap
+XRequest.80:X_CopyColormapAndFree
+XRequest.81:X_InstallColormap
+XRequest.82:X_UninstallColormap
+XRequest.83:X_ListInstalledColormaps
+XRequest.84:X_AllocColor
+XRequest.85:X_AllocNamedColor
+XRequest.86:X_AllocColorCells
+XRequest.87:X_AllocColorPlanes
+XRequest.88:X_FreeColors
+XRequest.89:X_StoreColors
+XRequest.90:X_StoreNamedColor
+XRequest.91:X_QueryColors
+XRequest.92:X_LookupColor
+XRequest.93:X_CreateCursor
+XRequest.94:X_CreateGlyphCursor
+XRequest.95:X_FreeCursor
+XRequest.96:X_RecolorCursor
+XRequest.97:X_QueryBestSize
+XRequest.98:X_QueryExtension
+XRequest.99:X_ListExtensions
+XRequest.100:X_ChangeKeyboardMapping
+XRequest.101:X_GetKeyboardMapping
+XRequest.102:X_ChangeKeyboardControl
+XRequest.103:X_GetKeyboardControl
+XRequest.104:X_Bell
+XRequest.105:X_ChangePointerControl
+XRequest.106:X_GetPointerControl
+XRequest.107:X_SetScreenSaver
+XRequest.108:X_GetScreenSaver
+XRequest.109:X_ChangeHosts
+XRequest.110:X_ListHosts
+XRequest.111:X_SetAccessControl
+XRequest.112:X_SetCloseDownMode
+XRequest.113:X_KillClient
+XRequest.114:X_RotateProperties
+XRequest.115:X_ForceScreenSaver
+XRequest.116:X_SetPointerMapping
+XRequest.117:X_GetPointerMapping
+XRequest.118:X_SetModifierMapping
+XRequest.119:X_GetModifierMapping
+XRequest.127:X_NoOperation
+! X Error Codes
+XProtoError.0: unknown error code 0
+XProtoError.1: BadRequest (invalid request code or no such operation)
+XProtoError.2: BadValue (integer parameter out of range for operation)
+XProtoError.3: BadWindow (invalid Window parameter)
+XProtoError.4: BadPixmap (invalid Pixmap parameter)
+XProtoError.5: BadAtom (invalid Atom parameter)
+XProtoError.6: BadCursor (invalid Cursor parameter)
+XProtoError.7: BadFont (invalid Font parameter)
+XProtoError.8: BadMatch (invalid parameter attributes)
+XProtoError.9: BadDrawable (invalid Pixmap or Window parameter)
+XProtoError.10: BadAccess (attempt to access private resource denied)
+XProtoError.11: BadAlloc (insufficient resources for operation)
+XProtoError.12: BadColor (invalid Colormap parameter)
+XProtoError.13: BadGC (invalid GC parameter)
+XProtoError.14: BadIDChoice (invalid resource ID chosen for this connection)
+XProtoError.15: BadName (named color or font does not exist)
+XProtoError.16: BadLength (poly request too large or internal Xlib length error)
+XProtoError.17: BadImplementation (server does not implement operation)
+! Multi-Buffering extension, not an X Consortium standard
+XRequest.Multi-Buffering.0: X_MbufGetBufferVersion
+XRequest.Multi-Buffering.1: X_MbufCreateImageBuffers
+XRequest.Multi-Buffering.2: X_MbufDestroyImageBuffers
+XRequest.Multi-Buffering.3: X_MbufDisplayImageBuffers
+XRequest.Multi-Buffering.4: X_MbufSetMultiBufferAttributes
+XRequest.Multi-Buffering.5: X_MbufGetMultiBufferAttributes
+XRequest.Multi-Buffering.6: X_MbufSetBufferAttributes
+XRequest.Multi-Buffering.7: X_MbufGetBufferAttributes
+XRequest.Multi-Buffering.8: X_MbufGetBufferInfo
+XRequest.Multi-Buffering.9: X_MbufCreateStereoWindow
+XProtoError.Multi-Buffering.0: BadBuffer (invalid Buffer parameter)
+XlibMessage.Multi-Buffering.0: Buffer id in failed request:  0x%lx
+! SHAPE extension, an X Consortium standard
+XRequest.SHAPE.0: X_ShapeQueryVersion
+XRequest.SHAPE.1: X_ShapeRectangles
+XRequest.SHAPE.2: X_ShapeMask
+XRequest.SHAPE.3: X_ShapeCombine
+XRequest.SHAPE.4: X_ShapeOffset
+XRequest.SHAPE.5: X_ShapeQueryExtents
+XRequest.SHAPE.6: X_ShapeSelectInput
+XRequest.SHAPE.7: X_ShapeInputSelected
+XRequest.SHAPE.8: X_ShapeGetRectangles
+! Input extension, an X Consortium standard
+XRequest.XInputExtension.1:X_GetExtensionVersion
+XRequest.XInputExtension.2:X_ListInputDevices
+XRequest.XInputExtension.3:X_OpenDevice
+XRequest.XInputExtension.4:X_CloseDevice
+XRequest.XInputExtension.5:X_SetDeviceMode
+XRequest.XInputExtension.6:X_SelectExtensionEvent
+XRequest.XInputExtension.7:X_GetSelectedExtensionEvents
+XRequest.XInputExtension.8:X_ChangeDeviceDontPropagateList
+XRequest.XInputExtension.9:X_GetDeviceDontPropagateList
+XRequest.XInputExtension.10:X_GetDeviceMotionEvents
+XRequest.XInputExtension.11:X_ChangeKeyboardDevice
+XRequest.XInputExtension.12:X_ChangePointerDevice
+XRequest.XInputExtension.13:X_GrabDevice
+XRequest.XInputExtension.14:X_UngrabDevice
+XRequest.XInputExtension.15:X_GrabDeviceKey
+XRequest.XInputExtension.16:X_UngrabDeviceKey
+XRequest.XInputExtension.17:X_GrabDeviceButton
+XRequest.XInputExtension.18:X_UngrabDeviceButton
+XRequest.XInputExtension.19:X_AllowDeviceEvents
+XRequest.XInputExtension.20:X_GetDeviceFocus
+XRequest.XInputExtension.21:X_SetDeviceFocus
+XRequest.XInputExtension.22:X_GetFeedbackControl
+XRequest.XInputExtension.23:X_ChangeFeedbackControl
+XRequest.XInputExtension.24:X_GetDeviceKeyMapping
+XRequest.XInputExtension.25:X_ChangeDeviceKeyMapping
+XRequest.XInputExtension.26:X_GetDeviceModifierMapping
+XRequest.XInputExtension.27:X_SetDeviceModifierMapping
+XRequest.XInputExtension.28:X_GetDeviceButtonMapping
+XRequest.XInputExtension.29:X_SetDeviceButtonMapping
+XRequest.XInputExtension.30:X_QueryDeviceState
+XRequest.XInputExtension.31:X_SendExtensionEvent
+XRequest.XInputExtension.32:X_DeviceBell
+XRequest.XInputExtension.33:X_SetDeviceValuators
+XRequest.XInputExtension.34:X_GetDeviceControl
+XRequest.XInputExtension.35:X_ChangeDeviceControl
+XRequest.XInputExtension.36: X_ListDeviceProperties
+XRequest.XInputExtension.37: X_ChangeDeviceProperty
+XRequest.XInputExtension.38: X_DeleteDeviceProperty
+XRequest.XInputExtension.39: X_GetDeviceProperty
+XProtoError.XInputExtension.0: XI_BadDevice (invalid Device parameter)
+XlibMessage.XInputExtension.0: Device id in failed request: 0x%lx
+XProtoError.XInputExtension.1: XI_BadEvent (invalid Event parameter)
+XlibMessage.XInputExtension.1: Event id in failed request: 0x%lx
+XProtoError.XInputExtension.2: XI_BadMode (invalid Mode parameter)
+XlibMessage.XInputExtension.2: Mode id in failed request: 0x%lx
+XProtoError.XInputExtension.3: XI_DeviceBusy
+XlibMessage.XInputExtension.3: Device id in failed request: 0x%lx
+XProtoError.XInputExtension.4: XI_BadClass (invalid Class parameter)
+XlibMessage.XInputExtension.4: Class id in failed request: 0x%lx
+! MIT-SHM extension, experimental, not an X Consortium standard
+XRequest.MIT-SHM.0: X_ShmQueryVersion
+XRequest.MIT-SHM.1: X_ShmAttach
+XRequest.MIT-SHM.2: X_ShmDetach
+XRequest.MIT-SHM.3: X_ShmPutImage
+XRequest.MIT-SHM.4: X_ShmGetImage
+XRequest.MIT-SHM.5: X_ShmCreatePixmap
+XProtoError.MIT-SHM.0: BadShmSeg (invalid shared segment parameter)
+XlibMessage.MIT-SHM.0: Segment id in failed request:  0x%lx
+! MIT-SUNDRY-NONSTANDARD extension, definitely not an X Consortium standard
+XRequest.MIT-SUNDRY-NONSTANDARD.0: X_MITSetBugMode
+XRequest.MIT-SUNDRY-NONSTANDARD.1: X_MITGetBugMode
+! X3D-PEX extension
+XRequest.X3D-PEX.1: PEX_GetExtensionInfo
+XRequest.X3D-PEX.2: PEX_GetEnumeratedTypeInfo
+XRequest.X3D-PEX.3: PEX_GetImpDepConstants
+XRequest.X3D-PEX.4: PEX_CreateLookupTable
+XRequest.X3D-PEX.5: PEX_CopyLookupTable
+XRequest.X3D-PEX.6: PEX_FreeLookupTable
+XRequest.X3D-PEX.7: PEX_GetTableInfo
+XRequest.X3D-PEX.8: PEX_GetPredefinedEntries
+XRequest.X3D-PEX.9: PEX_GetDefinedIndices
+XRequest.X3D-PEX.10: PEX_GetTableEntry
+XRequest.X3D-PEX.11: PEX_GetTableEntries
+XRequest.X3D-PEX.12: PEX_SetTableEntries
+XRequest.X3D-PEX.13: PEX_DeleteTableEntries
+XRequest.X3D-PEX.14: PEX_CreatePipelineContext
+XRequest.X3D-PEX.15: PEX_CopyPipelineContext
+XRequest.X3D-PEX.16: PEX_FreePipelineContext
+XRequest.X3D-PEX.17: PEX_GetPipelineContext
+XRequest.X3D-PEX.18: PEX_ChangePipelineContext
+XRequest.X3D-PEX.19: PEX_CreateRenderer
+XRequest.X3D-PEX.20: PEX_FreeRenderer
+XRequest.X3D-PEX.21: PEX_ChangeRenderer
+XRequest.X3D-PEX.22: PEX_GetRendererAttributes
+XRequest.X3D-PEX.23: PEX_GetRendererDynamics
+XRequest.X3D-PEX.24: PEX_BeginRendering
+XRequest.X3D-PEX.25: PEX_EndRendering
+XRequest.X3D-PEX.26: PEX_BeginStructure
+XRequest.X3D-PEX.27: PEX_EndStructure
+XRequest.X3D-PEX.28: PEX_RenderOutputCommands
+XRequest.X3D-PEX.29: PEX_RenderNetwork
+XRequest.X3D-PEX.30: PEX_CreateStructure
+XRequest.X3D-PEX.31: PEX_CopyStructure
+XRequest.X3D-PEX.32: PEX_DestroyStructures
+XRequest.X3D-PEX.33: PEX_GetStructureInfo
+XRequest.X3D-PEX.34: PEX_GetElementInfo
+XRequest.X3D-PEX.35: PEX_GetStructuresInNetwork
+XRequest.X3D-PEX.36: PEX_GetAncestors
+XRequest.X3D-PEX.37: PEX_GetDescendants
+XRequest.X3D-PEX.38: PEX_FetchElements
+XRequest.X3D-PEX.39: PEX_SetEditingMode
+XRequest.X3D-PEX.40: PEX_SetElementPointer
+XRequest.X3D-PEX.41: PEX_SetElementPointerAtLabel
+XRequest.X3D-PEX.42: PEX_ElementSearch
+XRequest.X3D-PEX.43: PEX_StoreElements
+XRequest.X3D-PEX.44: PEX_DeleteElements
+XRequest.X3D-PEX.45: PEX_DeleteElementsToLabel
+XRequest.X3D-PEX.46: PEX_DeleteBetweenLabels
+XRequest.X3D-PEX.47: PEX_CopyElements
+XRequest.X3D-PEX.48: PEX_ChangeStructureRefs
+XRequest.X3D-PEX.49: PEX_CreateNameSet
+XRequest.X3D-PEX.50: PEX_CopyNameSet
+XRequest.X3D-PEX.51: PEX_FreeNameSet
+XRequest.X3D-PEX.52: PEX_GetNameSet
+XRequest.X3D-PEX.53: PEX_ChangeNameSet
+XRequest.X3D-PEX.54: PEX_CreateSearchContext
+XRequest.X3D-PEX.55: PEX_CopySearchContext
+XRequest.X3D-PEX.56: PEX_FreeSearchContext
+XRequest.X3D-PEX.57: PEX_GetSearchContext
+XRequest.X3D-PEX.58: PEX_ChangeSearchContext
+XRequest.X3D-PEX.59: PEX_SearchNetwork
+XRequest.X3D-PEX.60: PEX_CreatePhigsWks
+XRequest.X3D-PEX.61: PEX_FreePhigsWks
+XRequest.X3D-PEX.62: PEX_GetWksInfo
+XRequest.X3D-PEX.63: PEX_GetDynamics
+XRequest.X3D-PEX.64: PEX_GetViewRep
+XRequest.X3D-PEX.65: PEX_RedrawAllStructures
+XRequest.X3D-PEX.66: PEX_UpdateWorkstation
+XRequest.X3D-PEX.67: PEX_RedrawClipRegion
+XRequest.X3D-PEX.68: PEX_ExecuteDeferredActions
+XRequest.X3D-PEX.69: PEX_SetViewPriority
+XRequest.X3D-PEX.70: PEX_SetDisplayUpdateMode
+XRequest.X3D-PEX.71: PEX_MapDCtoWC
+XRequest.X3D-PEX.72: PEX_MapWCtoDC
+XRequest.X3D-PEX.73: PEX_SetViewRep
+XRequest.X3D-PEX.74: PEX_SetWksWindow
+XRequest.X3D-PEX.75: PEX_SetWksViewport
+XRequest.X3D-PEX.76: PEX_SetHlhsrMode
+XRequest.X3D-PEX.77: PEX_SetWksBufferMode
+XRequest.X3D-PEX.78: PEX_PostStructure
+XRequest.X3D-PEX.79: PEX_UnpostStructure
+XRequest.X3D-PEX.80: PEX_UnpostAllStructures
+XRequest.X3D-PEX.81: PEX_GetWksPostings
+XRequest.X3D-PEX.82: PEX_GetPickDevice
+XRequest.X3D-PEX.83: PEX_ChangePickDevice
+XRequest.X3D-PEX.84: PEX_CreatePickMeasure
+XRequest.X3D-PEX.85: PEX_FreePickMeasure
+XRequest.X3D-PEX.86: PEX_GetPickMeasure
+XRequest.X3D-PEX.87: PEX_UpdatePickMeasure
+XRequest.X3D-PEX.88: PEX_OpenFont
+XRequest.X3D-PEX.89: PEX_CloseFont
+XRequest.X3D-PEX.90: PEX_QueryFont
+XRequest.X3D-PEX.91: PEX_ListFonts
+XRequest.X3D-PEX.92: PEX_ListFontsWithInfo
+XRequest.X3D-PEX.93: PEX_QueryTextExtents
+XRequest.X3D-PEX.94: PEX_MatchRenderingTargets
+XRequest.X3D-PEX.95: PEX_Escape
+XRequest.X3D-PEX.96: PEX_EscapeWithReply
+XRequest.X3D-PEX.97: PEX_RenderElements
+XRequest.X3D-PEX.98: PEX_AccumulateState
+XRequest.X3D-PEX.99: PEX_BeginPickOne
+XRequest.X3D-PEX.100: PEX_EndPickOne
+XRequest.X3D-PEX.101: PEX_PickOne
+XRequest.X3D-PEX.102: PEX_BeginPickAll
+XRequest.X3D-PEX.103: PEX_EndPickAll
+XRequest.X3D-PEX.104: PEX_PickAll
+XProtoError.X3D-PEX.0: PEXColorTypeError
+XlibMessage.X3D-PEX.0: Color type in failed request:  0x%lx
+XProtoError.X3D-PEX.1: PEXRendererStateError
+XlibMessage.X3D-PEX.1: Renderer id in failed request:  0x%lx
+XProtoError.X3D-PEX.2: PEXFloatingPointFormatError
+XlibMessage.X3D-PEX.2: Format in failed request:  0x%lx
+XProtoError.X3D-PEX.3: PEXLabelError
+XlibMessage.X3D-PEX.3: Label in failed request:  0x%lx
+XProtoError.X3D-PEX.4: PEXLookupTableError
+XlibMessage.X3D-PEX.4: Table id in failed request:  0x%lx
+XProtoError.X3D-PEX.5: PEXNameSetError
+XlibMessage.X3D-PEX.5: Nameset in failed request:  0x%lx
+XProtoError.X3D-PEX.6: PEXPathError
+XlibMessage.X3D-PEX.6: Path id in failed request:  0x%lx
+XProtoError.X3D-PEX.7: PEXFontError
+XlibMessage.X3D-PEX.7: Font id in failed request:  0x%lx
+XProtoError.X3D-PEX.8: PEXPhigsWksError
+XlibMessage.X3D-PEX.8: Workstation id in failed request:  0x%lx
+XProtoError.X3D-PEX.9: PEXPickMeasureError
+XlibMessage.X3D-PEX.9: Device id in failed request:  0x%lx
+XProtoError.X3D-PEX.10: PEXPipelineContextError
+XlibMessage.X3D-PEX.10: Context id in failed request:  0x%lx
+XProtoError.X3D-PEX.11: PEXRendererError
+XlibMessage.X3D-PEX.11: Renderer id in failed request:  0x%lx
+XProtoError.X3D-PEX.12: PEXSearchContextError
+XlibMessage.X3D-PEX.12: Context id in failed request:  0x%lx
+XProtoError.X3D-PEX.13: PEXStructureError
+XlibMessage.X3D-PEX.13: Structure id in failed request:  0x%lx
+XProtoError.X3D-PEX.14: PEXOutputCommandError
+XlibMessage.X3D-PEX.14: Resource id in failed request:  0x%lx
+! XTEST extension, an X Consortium standard
+XRequest.XTEST.0: X_XTestGetVersion
+XRequest.XTEST.1: X_XTestCompareCursor
+XRequest.XTEST.2: X_XTestFakeInput
+XRequest.XTEST.3: X_XTestGrabControl
+! BIG-REQUESTS extension, an X Consortium standard
+XRequest.BIG-REQUESTS.0: X_BigReqEnable
+! XIE extension, an X Consortium standard
+XRequest.XIE.1: XIE_QueryImageExtension
+XRequest.XIE.2: XIE_QueryTechniques
+XRequest.XIE.3: XIE_CreateColorList
+XRequest.XIE.4: XIE_DestroyColorList
+XRequest.XIE.5: XIE_PurgeColorList
+XRequest.XIE.6: XIE_QueryColorList
+XRequest.XIE.7: XIE_CreateLUT
+XRequest.XIE.8: XIE_DestroyLUT
+XRequest.XIE.9: XIE_CreatePhotomap
+XRequest.XIE.10: XIE_DestroyPhotomap
+XRequest.XIE.11: XIE_QueryPhotomap
+XRequest.XIE.12: XIE_CreateROI
+XRequest.XIE.13: XIE_DestroyROI
+XRequest.XIE.14: XIE_CreatePhotospace
+XRequest.XIE.15: XIE_DestroyPhotospace
+XRequest.XIE.16: XIE_ExecuteImmediate
+XRequest.XIE.17: XIE_CreatePhotoflo
+XRequest.XIE.18: XIE_DestroyPhotoflo
+XRequest.XIE.19: XIE_ExecutePhotoflo
+XRequest.XIE.20: XIE_ModifyPhotoflo
+XRequest.XIE.21: XIE_RedefinePhotoflo
+XRequest.XIE.22: XIE_PutClientData
+XRequest.XIE.23: XIE_GetClientData
+XRequest.XIE.24: XIE_QueryPhotoflo
+XRequest.XIE.25: XIE_Await
+XRequest.XIE.26: XIE_Abort
+XProtoError.XIE.0: XIE_ColorListError
+XlibMessage.XIE.0: ColorList in failed request:  0x%lx
+XProtoError.XIE.1: XIE_LUTError
+XlibMessage.XIE.1: LUT in failed request:  0x%lx
+XProtoError.XIE.2: XIE_PhotofloError
+XlibMessage.XIE.2: Photoflo in failed request:  0x%lx
+XProtoError.XIE.3: XIE_PhotomapError
+XlibMessage.XIE.3: Photomap in failed request:  0x%lx
+XProtoError.XIE.4: XIE_PhotospaceError
+XlibMessage.XIE.4: Photospace in failed request:  0x%lx
+XProtoError.XIE.5: XIE_ROIError
+XlibMessage.XIE.5: ROI in failed request:  0x%lx
+XProtoError.XIE.6: XIE_FloError
+XlibMessage.XIE.6: Photoflo in failed request:  0x%lx
+! SYNC extension, an X Consortium standard
+XRequest.SYNC.0: X_SyncInitialize
+XRequest.SYNC.1: X_SyncListSystemCounters
+XRequest.SYNC.2: X_SyncCreateCounter
+XRequest.SYNC.3: X_SyncSetCounter
+XRequest.SYNC.4: X_SyncChangeCounter
+XRequest.SYNC.5: X_SyncQueryCounter
+XRequest.SYNC.6: X_SyncDestroyCounter
+XRequest.SYNC.7: X_SyncAwait
+XRequest.SYNC.8: X_SyncCreateAlarm
+XRequest.SYNC.9: X_SyncChangeAlarm
+XRequest.SYNC.10: X_SyncQueryAlarm
+XRequest.SYNC.11: X_SyncDestroyAlarm
+XRequest.SYNC.12: X_SyncSetPriority
+XRequest.SYNC.13: X_SyncGetPriority
+XProtoError.SYNC.0: XSyncBadCounter
+XlibMessage.SYNC.0: Counter in failed request:  0x%lx
+XProtoError.SYNC.1: XSyncBadAlarm
+XlibMessage.SYNC.1: Alarm in failed request:  0x%lx
+! XKB extension
+XRequest.XKEYBOARD.0: XkbUseExtension
+XRequest.XKEYBOARD.1: XkbSelectEvents
+XRequest.XKEYBOARD.2: OBSOLETE
+XRequest.XKEYBOARD.3: XkbBell
+XRequest.XKEYBOARD.4: XkbGetState
+XRequest.XKEYBOARD.5: XkbLatchLockState
+XRequest.XKEYBOARD.6: XkbGetControls
+XRequest.XKEYBOARD.7: XkbSetControls
+XRequest.XKEYBOARD.8: XkbGetMap
+XRequest.XKEYBOARD.9: XkbSetMap
+XRequest.XKEYBOARD.10: XkbGetCompatMap
+XRequest.XKEYBOARD.11: XkbSetCompatMap
+XRequest.XKEYBOARD.12: XkbGetIndicatorState
+XRequest.XKEYBOARD.13: XkbGetIndicatorMap
+XRequest.XKEYBOARD.14: XkbSetIndicatorMap
+XRequest.XKEYBOARD.15: XkbGetNamedIndicator
+XRequest.XKEYBOARD.16: XkbSetNamedIndicator
+XRequest.XKEYBOARD.17: XkbGetNames
+XRequest.XKEYBOARD.18: XkbSetNames
+XRequest.XKEYBOARD.19: XkbGetGeometry
+XRequest.XKEYBOARD.20: XkbSetGeometry
+XRequest.XKEYBOARD.21: XkbPerClientFlags
+XRequest.XKEYBOARD.22: XkbListComponents
+XRequest.XKEYBOARD.23: XkbGetKbdByName
+XRequest.XKEYBOARD.24: XkbGetDeviceInfo
+XRequest.XKEYBOARD.25: XkbSetDeviceInfo
+XRequest.XKEYBOARD.101: XkbSetDebuggingFlags
+XProtoError.XKEYBOARD.0: XkbBadKeyboard
+XlibMessage.XKEYBOARD.0: Device id in failed request:  0x%lx
+! GLX extension for OpenGL, an OpenGL Architectural Review Board standard
+! GLX Commands
+XRequest.GLX.7: X_GLXQueryVersion
+XRequest.GLX.3: X_GLXCreateContext
+XRequest.GLX.4: X_GLXDestroyContext
+XRequest.GLX.5: X_GLXMakeCurrent
+XRequest.GLX.6: X_GLXIsDirect
+XRequest.GLX.10: X_GLXCopyContext
+XRequest.GLX.8: X_GLXWaitGL
+XRequest.GLX.9: X_GLXWaitX
+XRequest.GLX.11: X_GLXSwapBuffers
+XRequest.GLX.12: X_GLXUseXFont
+XRequest.GLX.13: X_GLXCreateGLXPixmap
+XRequest.GLX.15: X_GLXDestroyGLXPixmap
+XRequest.GLX.14: X_GLXGetVisualConfigs
+XRequest.GLX.16: X_GLXVendorPrivate
+XRequest.GLX.17: X_GLXVendorPrivateWithReply
+XRequest.GLX.18: X_GLXQueryExtensionsString
+XRequest.GLX.19: X_GLXQueryServerString
+XRequest.GLX.20: X_GLXClientInfo
+XRequest.GLX.21: X_GLXGetFBConfigs
+XRequest.GLX.22: X_GLXCreatePixmap
+XRequest.GLX.23: X_GLXDestroyPixmap
+XRequest.GLX.24: X_GLXCreateNewContext
+XRequest.GLX.25: X_GLXQueryContext
+XRequest.GLX.26: X_GLXMakeContextCurrent
+XRequest.GLX.27: X_GLXCreatePbuffer
+XRequest.GLX.28: X_GLXDestroyPbuffer
+XRequest.GLX.29: X_GLXGetDrawableAttributes
+XRequest.GLX.30: X_GLXChangeDrawableAttributes
+XRequest.GLX.31: X_GLXCreateWindow
+XRequest.GLX.32: X_GLXDestroyWindow
+! GL Non-rendering Commands
+XRequest.GLX.103: X_GLXDeleteLists
+XRequest.GLX.102: X_GLXEndList
+XRequest.GLX.105: X_GLXFeedbackBuffer
+XRequest.GLX.108: X_GLXFinish
+XRequest.GLX.142: X_GLXFlush
+XRequest.GLX.104: X_GLXGenLists
+XRequest.GLX.112: X_GLXGetBooleanv
+XRequest.GLX.113: X_GLXGetClipPlane
+XRequest.GLX.114: X_GLXGetDoublev
+XRequest.GLX.115: X_GLXGetError
+XRequest.GLX.116: X_GLXGetFloatv
+XRequest.GLX.117: X_GLXGetIntegerv
+XRequest.GLX.118: X_GLXGetLightfv
+XRequest.GLX.119: X_GLXGetLightiv
+XRequest.GLX.120: X_GLXGetMapdv
+XRequest.GLX.121: X_GLXGetMapfv
+XRequest.GLX.122: X_GLXGetMapiv
+XRequest.GLX.123: X_GLXGetMaterialfv
+XRequest.GLX.124: X_GLXGetMaterialiv
+XRequest.GLX.125: X_GLXGetPixelfv
+XRequest.GLX.126: X_GLXGetPixelMapuiv
+XRequest.GLX.127: X_GLXGetPixelMapusv
+XRequest.GLX.129: X_GLXGetString
+XRequest.GLX.130: X_GLXGetTexEnvfv
+XRequest.GLX.131: X_GLXGetTexEnviv
+XRequest.GLX.132: X_GLXGetTexGendv
+XRequest.GLX.133: X_GLXGetTexGenfv
+XRequest.GLX.134: X_GLXGetTexGeniv
+XRequest.GLX.138: X_GLXGetTexLevelParameterfv
+XRequest.GLX.139: X_GLXGetTexLevelParameteriv
+XRequest.GLX.136: X_GLXGetTexParameterfv
+XRequest.GLX.137: X_GLXGetTexParameteriv
+XRequest.GLX.140: X_GLXIsEnabled
+XRequest.GLX.141: X_GLXIsList
+XRequest.GLX.101: X_GLXNewList
+XRequest.GLX.109: X_GLXPixelStoref
+XRequest.GLX.110: X_GLXPixelStorei
+XRequest.GLX.107: X_GLXRenderMode
+XRequest.GLX.106: X_GLXSelectBuffer
+! GL Non-rendering Commands That Return Pixel Data
+XRequest.GLX.128: X_GLXGetPolygonStipple
+XRequest.GLX.135: X_GLXGetTexImage
+XRequest.GLX.111: X_GLXReadPixels
+! GL Rendering Commands
+XRequest.GLX.1: X_GLXRender
+XRequest.GLX.2: X_GLXRenderLarge
+! GLX Errors
+XProtoError.GLX.0: GLXBadContext
+XProtoError.GLX.1: GLXBadContextState
+XProtoError.GLX.2: GLXBadDrawable
+XProtoError.GLX.3: GLXBadPixmap
+XProtoError.GLX.4: GLXBadContextTag
+XProtoError.GLX.5: GLXBadCurrentWindow
+XProtoError.GLX.6: GLXBadRenderRequest
+XProtoError.GLX.7: GLXBadLargeRequest
+XProtoError.GLX.8: GLXUnsupportedPrivateRequest
+XProtoError.GLX.9: GLXBadFBConfig
+XProtoError.GLX.10: GLXBadPbuffer
+XProtoError.GLX.11: GLXBadCurrentDrawable
+XProtoError.GLX.12: GLXBadWindow
+! XC-MISC extension, an X Consortium standard
+XRequest.XC-MISC.0: XCMiscGetVersion
+XRequest.XC-MISC.1: XCMiscGetXIDRange
+! RECORD extension
+XRequest.RECORD.0: XRecordQueryVersion
+XRequest.RECORD.1: XRecordCreateContext
+XRequest.RECORD.2: XRecordRegisterClients
+XRequest.RECORD.3: XRecordUnregisterClients
+XRequest.RECORD.4: XRecordGetContext
+XRequest.RECORD.5: XRecordEnableContext
+XRequest.RECORD.6: XRecordDisableContext
+XRequest.RECORD.7: XRecordFreeContext
+XProtoError.RECORD.0: XRecordBadContext
+XlibMessage.RECORD.0: Context in failed request:  0x%lx
+! XFree86-VidModeExtension  -- not an X Consortium standard
+XRequest.XFree86-VidModeExtension.0: XF86VidModeQueryVersion
+XRequest.XFree86-VidModeExtension.1: XF86VidModeGetModeLine
+XRequest.XFree86-VidModeExtension.2: XF86VidModeModModeLine
+XRequest.XFree86-VidModeExtension.3: XF86VidModeSwitchMode
+XRequest.XFree86-VidModeExtension.4: XF86VidModeGetMonitor
+XRequest.XFree86-VidModeExtension.5: XF86VidModeLockModeSwitch
+XRequest.XFree86-VidModeExtension.6: XF86VidModeGetAllModeLines
+XRequest.XFree86-VidModeExtension.7: XF86VidModeAddModeLine
+XRequest.XFree86-VidModeExtension.8: XF86VidModeDeleteModeLine
+XRequest.XFree86-VidModeExtension.9: XF86VidModeValidateModeLine
+XRequest.XFree86-VidModeExtension.10: XF86VidModeSwitchToMode
+XRequest.XFree86-VidModeExtension.11: XF86VidModeGetViewPort
+XRequest.XFree86-VidModeExtension.12: XF86VidModeSetViewPort
+XRequest.XFree86-VidModeExtension.13: XF86VidModeGetDotClocks
+XRequest.XFree86-VidModeExtension.14: XF86VidModeSetClientVersion
+XRequest.XFree86-VidModeExtension.15: XF86VidModeSetGamma
+XRequest.XFree86-VidModeExtension.16: XF86VidModeGetGamma
+XRequest.XFree86-VidModeExtension.17: XF86VidModeGetGammaRamp
+XRequest.XFree86-VidModeExtension.18: XF86VidModeSetGammaRamp
+XRequest.XFree86-VidModeExtension.19: XF86VidModeGetGammaRampSize
+XRequest.XFree86-VidModeExtension.20: XF86VidModeGetPermissions
+XProtoError.XFree86-VidModeExtension.0: XF86VidModeBadClock
+XProtoError.XFree86-VidModeExtension.1: XF86VidModeBadHTimings
+XProtoError.XFree86-VidModeExtension.2: XF86VidModeBadVTimings
+XProtoError.XFree86-VidModeExtension.3: XF86VidModeModeUnsuitable
+XProtoError.XFree86-VidModeExtension.4: XF86VidModeExtensionDisabled
+XProtoError.XFree86-VidModeExtension.5: XF86VidModeClientNotLocal
+XProtoError.XFree86-VidModeExtension.6: XF86VidModeZoomLocked
+! XFree86-Misc -- not an X Consortium standard
+XRequest.XFree86-Misc.0: XF86MiscQueryVersion
+XRequest.XFree86-Misc.1: XF86MiscGetSaver
+XRequest.XFree86-Misc.2: XF86MiscSetSaver
+XRequest.XFree86-Misc.3: XF86MiscGetMouseSettings
+XRequest.XFree86-Misc.4: XF86MiscGetKbdSettings
+XRequest.XFree86-Misc.5: XF86MiscSetMouseSettings
+XRequest.XFree86-Misc.6: XF86MiscSetKbdSettings
+XRequest.XFree86-Misc.7: XF86MiscSetGrabKeysState
+XRequest.XFree86-Misc.8: XF86MiscSetClientVersion
+XRequest.XFree86-Misc.9: XF86MiscGetFilePaths
+XProtoError.XFree86-Misc.0: XF86MiscBadMouseProtocol
+XProtoError.XFree86-Misc.1: XF86MiscBadMouseBaudRate
+XProtoError.XFree86-Misc.2: XF86MiscBadMouseFlags
+XProtoError.XFree86-Misc.3: XF86MiscBadMouseCombo
+XProtoError.XFree86-Misc.4: XF86MiscBadKbdType
+XProtoError.XFree86-Misc.5: XF86MiscModInDevDisabled
+XProtoError.XFree86-Misc.6: XF86MiscModInDevClientNotLocal
+XProtoError.XFree86-Misc.7: XF86MiscNoModule
+! XFree86-DGA  -- not an X Consortium standard
+XRequest.XFree86-DGA.0: XF86DGAQueryVersion
+XRequest.XFree86-DGA.1: XF86DGAGetVideoLL
+XRequest.XFree86-DGA.2: XF86DGADirectVideo
+XRequest.XFree86-DGA.3: XF86DGAGetViewPortSize
+XRequest.XFree86-DGA.4: XF86DGASetViewPort
+XRequest.XFree86-DGA.5: XF86DGAGetVidPage
+XRequest.XFree86-DGA.6: XF86DGASetVidPage
+XRequest.XFree86-DGA.7: XF86DGAInstallColormap
+XRequest.XFree86-DGA.8: XF86DGAQueryDirectVideo
+XRequest.XFree86-DGA.9: XF86DGAViewPortChanged
+XRequest.XFree86-DGA.10: XF86DGAObsolete1
+XRequest.XFree86-DGA.11: XF86DGAObsolete2
+XRequest.XFree86-DGA.12: XDGAQueryModes
+XRequest.XFree86-DGA.13: XDGASetMode
+XRequest.XFree86-DGA.14: XDGASetViewport
+XRequest.XFree86-DGA.15: XDGAInstallColormap
+XRequest.XFree86-DGA.16: XDGASelectInput
+XRequest.XFree86-DGA.17: XDGAFillRectangle
+XRequest.XFree86-DGA.18: XDGACopyArea
+XRequest.XFree86-DGA.19: XDGACopyTransparentArea
+XRequest.XFree86-DGA.20: XDGAGetViewportStatus
+XRequest.XFree86-DGA.21: XDGASync
+XRequest.XFree86-DGA.22: XDGAOpenFramebuffer
+XRequest.XFree86-DGA.23: XDGACloseFramebuffer
+XRequest.XFree86-DGA.24: XDGASetClientVersion
+XRequest.XFree86-DGA.25: XDGAChangePixmapMode
+XRequest.XFree86-DGA.26: XDGACreateColormap
+XProtoError.XFree86-DGA.0: XF86DGAClientNotLocal
+XProtoError.XFree86-DGA.1: XF86DGANoDirectVideoMode
+XProtoError.XFree86-DGA.2: XF86DGAScreenNotActive
+XProtoError.XFree86-DGA.3: XF86DGADirectNotActivated
+XProtoError.XFree86-DGA.4: XF86DGAOperationNotSupported
+! DOUBLE-BUFFER (DBE), an X Consortium standard
+XRequest.DOUBLE-BUFFER.0: DBEGetVersion
+XRequest.DOUBLE-BUFFER.1: DBEAllocateBackBufferName
+XRequest.DOUBLE-BUFFER.2: DBEDeallocateBackBufferName
+XRequest.DOUBLE-BUFFER.3: DBESwapBuffers
+XRequest.DOUBLE-BUFFER.4: DBEBeginIdiom
+XRequest.DOUBLE-BUFFER.5: DBEEndIdiom
+XRequest.DOUBLE-BUFFER.6: DBEGetVisualInfo
+XRequest.DOUBLE-BUFFER.7: DBEGetBackBufferAttributes
+XProtoError.DOUBLE-BUFFER.0: DBEBadBuffer  (invalid BackBuffer parameter)
+XlibMessage.DOUBLE-BUFFER.0: BackBuffer in failed request:  0x%lx
+! SECURITY
+XRequest.SECURITY.0: SecurityQueryVersion
+XRequest.SECURITY.1: SecurityGenerateAuthorization
+XProtoError.SECURITY.0: SecurityBadAuthorization  (invalid authorization id)
+XProtoError.SECURITY.1: SecurityBadAuthorizationProtocol  (invalid authorization name or data)
+XlibMessage.SECURITY.1: authorization id in failed request:  0x%lx
+! AppGroup
+XRequest.APPGROUP.0: XagQueryVersion
+XRequest.APPGROUP.1: XagCreate
+XRequest.APPGROUP.2: XagDestroy
+XRequest.APPGROUP.3: XagGetAttr
+XRequest.APPGROUP.4: XagQuery
+XRequest.APPGROUP.5: XagCreateAssoc
+XRequest.APPGROUP.6: XagDestroyAssoc
+XProtoError.APPGROUP.0: XagBadAppGroup  (invalid AppGroup parameter)
+! LBX
+XRequest.LBX.0: LbxQueryVersion
+XRequest.LBX.1: LbxStartProxy
+XRequest.LBX.2: LbxStopProxy
+XRequest.LBX.3: LbxSwitch
+XRequest.LBX.4: LbxNewClient
+XRequest.LBX.5: LbxCloseClient
+XRequest.LBX.6: LbxModifySequence
+XRequest.LBX.7: LbxAllowMotion
+XRequest.LBX.8: LbxIncrementPixel
+XRequest.LBX.9: LbxDelta
+XRequest.LBX.10: LbxGetModifierMapping
+XRequest.LBX.11: LbxQueryTag
+XRequest.LBX.12: LbxInvalidateTag
+XRequest.LBX.13: LbxPolyPoint
+XRequest.LBX.14: LbxPolyLine
+XRequest.LBX.15: LbxPolySegment
+XRequest.LBX.16: LbxPolyRectangle
+XRequest.LBX.17: LbxPolyArc
+XRequest.LBX.18: LbxFillPoly
+XRequest.LBX.19: LbxPolyFillRectangle
+XRequest.LBX.20: LbxPolyFillArc
+XRequest.LBX.21: LbxGetKeyboardMapping
+XRequest.LBX.22: LbxQueryFont
+XRequest.LBX.23: LbxChangeProperty
+XRequest.LBX.24: LbxGetProperty
+XRequest.LBX.25: LbxTagData
+XRequest.LBX.26: LbxCopyArea
+XRequest.LBX.27: LbxCopyPlane
+XRequest.LBX.28: LbxPolyText8
+XRequest.LBX.29: LbxPolyText16
+XRequest.LBX.30: LbxImageText8
+XRequest.LBX.31: LbxImageText16
+XRequest.LBX.32: LbxQueryExtension
+XRequest.LBX.33: LbxPutImage
+XRequest.LBX.34: LbxGetImage
+XRequest.LBX.35: LbxBeginLargeRequest
+XRequest.LBX.36: LbxLargeRequestData
+XRequest.LBX.37: LbxEndLargeRequest
+XRequest.LBX.38: LbxInternAtoms
+XRequest.LBX.39: LbxGetWinAttrAndGeom
+XRequest.LBX.40: LbxGrabCmap
+XRequest.LBX.41: LbxReleaseCmap
+XRequest.LBX.42: LbxAllocColor
+XRequest.LBX.43: LbxSync
+XProtoError.LBX.0: BadLbxClient
+! XpExtension
+XRequest.XpExtension.0: PrintQueryVersion
+XRequest.XpExtension.1: PrintGetPrinterList
+XRequest.XpExtension.2: PrintCreateContext
+XRequest.XpExtension.3: PrintSetContext
+XRequest.XpExtension.4: PrintGetContext
+XRequest.XpExtension.5: PrintDestroyContext
+XRequest.XpExtension.6: PrintGetContextScreen
+XRequest.XpExtension.7: PrintStartJob
+XRequest.XpExtension.8: PrintEndJob
+XRequest.XpExtension.9: PrintStartDoc
+XRequest.XpExtension.10: PrintEndDoc
+XRequest.XpExtension.11: PrintPutDocumentData
+XRequest.XpExtension.12: PrintGetDocumentData
+XRequest.XpExtension.13: PrintStartPage
+XRequest.XpExtension.14: PrintEndPage
+XRequest.XpExtension.15: PrintSelectInput
+XRequest.XpExtension.16: PrintInputSelected
+XRequest.XpExtension.17: PrintGetAttributes
+XRequest.XpExtension.18: PrintSetAttributes
+XRequest.XpExtension.19: PrintGetOneAttribute
+XRequest.XpExtension.20: PrintRehashPrinterList
+XRequest.XpExtension.21: PrintGetPageDimensions
+XRequest.XpExtension.22: PrintQueryScreens
+XRequest.XpExtension.23: PrintSetImageResolution
+XRequest.XpExtension.24: PrintGetImageResolution
+XProtoError.XpExtension.0: XPBadContext (Print Context invalid or missing)
+XlibMessage.XpExtension.0: Context in failed request:  0x%lx
+XProtoError.XpExtension.1: XPBadSequence (Illegal sequence of XP operations)
+XProtoError.XpExtension.2: XPBadResourceID (X resource not valid)
+! TOG-CUP, an X Project Team specification
+XRequest.TOG-CUP.0: CUPQueryVersion
+XRequest.TOG-CUP.1: CUPGetReservedColormapEntries
+XRequest.TOG-CUP.2: CUPStoreColors
+! Extended-Visual-Information, an X Project Team specification
+XRequest.Extended-Visual-Information.0: EVIQueryVersion
+XRequest.Extended-Visual-Information.1: EVIGetVisualInfo
+! DPMS (Display Power Management Signaling), an X Project Team specification
+XRequest.DPMS.0: DPMSGetVersion
+XRequest.DPMS.1: DPMSCapable
+XRequest.DPMS.2: DPMSGetTimeouts
+XRequest.DPMS.3: DPMSSetTimeouts
+XRequest.DPMS.4: DPMSEnable
+XRequest.DPMS.5: DPMSDisable
+XRequest.DPMS.6: DPMSForceLevel
+XRequest.DPMS.7: DPMSInfo
+! XINERAMA, not an X Project Team specification
+XRequest.XINERAMA.0: XINERAMAQueryVersion
+XRequest.XINERAMA.1: XINERAMAGetState
+XRequest.XINERAMA.2: XINERAMAGetScreenCount
+XRequest.XINERAMA.3: XINERAMAGetScreenSize
+XRequest.XINERAMA.4: XINERAMAIsActive
+XRequest.XINERAMA.5: XINERAMAQueryScreens
+! XF86Rush extension, not a standard spec
+Xrequest.XFree86-Rush.0: XF86RushQueryVersion
+Xrequest.XFree86-Rush.1: XF86RushLockPixmap
+Xrequest.XFree86-Rush.2: XF86RushUnlockPixmap
+Xrequest.XFree86-Rush.3: XF86RushUnlockAllPixmaps
+Xrequest.XFree86-Rush.4: XF86RushGetCopyMode
+Xrequest.XFree86-Rush.5: XF86RushSetCopyMode
+Xrequest.XFree86-Rush.6: XF86RushGetPixelStride
+Xrequest.XFree86-Rush.7: XF86RushSetPixelStride
+Xrequest.XFree86-Rush.8: XF86RushOverlayPixmap
+Xrequest.XFree86-Rush.9: XF86RushStatusRegOffset
+Xrequest.XFree86-Rush.10: XF86RushAT3DEnableRegs
+Xrequest.XFree86-Rush.11: XF86RushAT3DDisableRegs
+! XVideo
+Xrequest.XVideo.0: XvQueryExtension
+Xrequest.XVideo.1: XvQueryAdaptors
+Xrequest.XVideo.2: XvQueryEncodings
+Xrequest.XVideo.3: XvGrabPort
+Xrequest.XVideo.4: XvUngrabPort
+Xrequest.XVideo.5: XvPutVideo
+Xrequest.XVideo.6: XvPutStill
+Xrequest.XVideo.7: XvGetVideo
+Xrequest.XVideo.8: XvGetStill
+Xrequest.XVideo.9: XvStopVideo
+Xrequest.XVideo.10: XvSelectVideoNotify
+Xrequest.XVideo.11: XvSelectPortNotify
+Xrequest.XVideo.12: XvQueryBestSize
+Xrequest.XVideo.13: XvSetPortAttribute
+Xrequest.XVideo.14: XvGetPortAttribute
+Xrequest.XVideo.15: XvQueryPortAttributes
+Xrequest.XVideo.16: XvListImageFormats
+Xrequest.XVideo.17: XvQueryImageAttributes
+Xrequest.XVideo.18: XvPutImage
+Xrequest.XVideo.19: XvShmPutImage
+XProtoError.XVideo.0: XvBadPort
+XProtoError.XVideo.1: XvBadEncoding
+XProtoError.XVideo.2: XvBadControl
+! XFree86-Bigfont
+Xrequest.XFree86-Bigfont.0: XF86BigfontQueryVersion
+Xrequest.XFree86-Bigfont.1: XF86BigfontQueryFont
+! Adobe-DPS-Extension, not a standard
+XRequest.Adobe-DPS-Extension.1: PSInit
+XRequest.Adobe-DPS-Extension.2: PSCreateContext
+XRequest.Adobe-DPS-Extension.3: PSCreateSpace
+XRequest.Adobe-DPS-Extension.4: PSGiveInput
+XRequest.Adobe-DPS-Extension.5: PSGetStatus
+XRequest.Adobe-DPS-Extension.6: PSDestroySpace
+XRequest.Adobe-DPS-Extension.7: PSReset
+XRequest.Adobe-DPS-Extension.8: PSNotifyContext
+XRequest.Adobe-DPS-Extension.9: PSCreateContextFromID
+XRequest.Adobe-DPS-Extension.10: PSXIDFromContext
+XRequest.Adobe-DPS-Extension.11: PSContextFromXID
+XRequest.Adobe-DPS-Extension.12: PSSetStatusMask
+XRequest.Adobe-DPS-Extension.13: PSCreateSecureContext
+XRequest.Adobe-DPS-Extension.14: PSNotifyWhenReady
+XProtoError.Adobe-DPS-Extension.0: PSErrorBadContext (invalid Context parameter)
+XlibMessage.Adobe-DPS-Extension.0: Context id in failed request:  0x%lx
+XProtoError.Adobe-DPS-Extension.1: PSErrorBadSpace (invalid Space parameter)
+XlibMessage.Adobe-DPS-Extension.1: Space id in failed request:  0x%lx
+XProtoError.Adobe-DPS-Extension.2: PSErrorAbort (interpreter aborted)
+XlibMessage.Adobe-DPS-Extension.2: Value in failed request:  0x%lx
+! RANDR
+XRequest.RANDR.0: RRQueryVersion
+XRequest.RANDR.1: RROldGetScreenInfo
+XRequest.RANDR.2: RRSetScreenConfig
+XRequest.RANDR.3: RROldScreenChangeSelectInput
+XRequest.RANDR.4: RRSelectInput
+XRequest.RANDR.5: RRGetScreenInfo
+XRequest.RANDR.6: RRGetScreenSizeRange
+XRequest.RANDR.7: RRSetScreenSize
+XRequest.RANDR.8: RRGetScreenResources
+XRequest.RANDR.9: RRGetOutputInfo
+XRequest.RANDR.10: RRListOutputProperties
+XRequest.RANDR.11: RRQueryOutputProperty
+XRequest.RANDR.12: RRConfigureOutputProperty
+XRequest.RANDR.13: RRChangeOutputProperty
+XRequest.RANDR.14: RRDeleteOutputProperty
+XRequest.RANDR.15: RRGetOutputProperty
+XRequest.RANDR.16: RRCreateMode
+XRequest.RANDR.17: RRDestroyMode
+XRequest.RANDR.18: RRAddOutputMode
+XRequest.RANDR.19: RRDeleteOutputMode
+XRequest.RANDR.20: RRGetCrtcInfo
+XRequest.RANDR.21: RRSetCrtcConfig
+XRequest.RANDR.22: RRGetCrtcGammaSize
+XRequest.RANDR.23: RRGetCrtcGamma
+XRequest.RANDR.24: RRSetCrtcGamma
+XRequest.RANDR.25: RRGetScreenResourcesCurrent
+XRequest.RANDR.26: RRSetCrtcTransform
+XRequest.RANDR.27: RRGetCrtcTransform
+XRequest.RANDR.28: RRGetPanning
+XRequest.RANDR.29: RRSetPanning
+XRequest.RANDR.30: RRSetOutputPrimary
+XRequest.RANDR.31: RRGetOutputPrimary
+XProtoError.RANDR.0: BadRROutput (invalid Output parameter)
+XlibMessage.RANDR.0: Output id in failed request: 0x%lx
+XProtoError.RANDR.1: BadRRCrtc (invalid Crtc parameter)
+XlibMessage.RANDR.1: Crtc id in failed request: 0x%lx
+XProtoError.RANDR.2: BadRRMode (invalid Mode parameter)
+XlibMessage.RANDR.2: Mode id in failed request: 0x%lx
+! RENDER
+XRequest.RENDER.0: RenderQueryVersion
+XRequest.RENDER.1: RenderQueryPictFormats
+XRequest.RENDER.2: RenderQueryPictIndexValues
+XRequest.RENDER.3: RenderQueryDithers
+XRequest.RENDER.4: RenderCreatePicture
+XRequest.RENDER.5: RenderChangePicture
+XRequest.RENDER.6: RenderSetPictureClipRectangles
+XRequest.RENDER.7: RenderFreePicture
+XRequest.RENDER.8: RenderComposite
+XRequest.RENDER.9: RenderScale
+XRequest.RENDER.10: RenderTrapezoids
+XRequest.RENDER.11: RenderTriangles
+XRequest.RENDER.12: RenderTriStrip
+XRequest.RENDER.13: RenderTriFan
+XRequest.RENDER.14: RenderColorTrapezoids
+XRequest.RENDER.15: RenderColorTriangles
+XRequest.RENDER.16: RenderTransform
+XRequest.RENDER.17: RenderCreateGlyphSet
+XRequest.RENDER.18: RenderReferenceGlyphSet
+XRequest.RENDER.19: RenderFreeGlyphSet
+XRequest.RENDER.20: RenderAddGlyphs
+XRequest.RENDER.21: RenderAddGlyphsFromPicture
+XRequest.RENDER.22: RenderFreeGlyphs
+XRequest.RENDER.23: RenderCompositeGlyphs8
+XRequest.RENDER.24: RenderCompositeGlyphs16
+XRequest.RENDER.25: RenderCompositeGlyphs32
+XRequest.RENDER.26: RenderFillRectangles
+XRequest.RENDER.27: RenderCreateCursor
+XRequest.RENDER.28: RenderSetPictureTransform
+XRequest.RENDER.29: RenderQueryFilters
+XRequest.RENDER.30: RenderSetPictureFilter
+XRequest.RENDER.31: RenderCreateAnimCursor
+XRequest.RENDER.32: RenderAddTraps
+XRequest.RENDER.33: RenderCreateSolidFill
+XRequest.RENDER.34: RenderCreateLinearGradient
+XRequest.RENDER.35: RenderCreateRadialGradient
+XRequest.RENDER.36: RenderCreateConicalGradient
+XProtoError.RENDER.0: RenderBadFormat (invalid PictFormat parameter)
+XlibMessage.RENDER.0: PictFormat id in failed request: 0x%lx
+XProtoError.RENDER.1: RenderBadPicture (invalid Picture parameter)
+XlibMessage.RENDER.1: Picture id in failed request: 0x%lx
+XProtoError.RENDER.2: RenderBadPictOp (invalid PictOp parameter)
+XlibMessage.RENDER.2: PictOp in failed request: 0x%lx
+XProtoError.RENDER.3: RenderBadGlyphSet (invalid GlyphSet parameter)
+XlibMessage.RENDER.3: GlyphSet id in failed request: 0x%lx
+XProtoError.RENDER.4: RenderBadGlyph (invalid Glyph parameter)
+XlibMessage.RENDER.4: Glyph in failed request: 0x%lx
+! XFixes
+XRequest.XFIXES.0: XFixesQueryVersion
+XRequest.XFIXES.1: XFixesChangeSaveSet
+XRequest.XFIXES.2: XFixesSelectSelectionInput
+XRequest.XFIXES.3: XFixesSelectCursorInput
+XRequest.XFIXES.4: XFixesGetCursorImage
+XRequest.XFIXES.5: XFixesCreateRegion
+XRequest.XFIXES.6: XFixesCreateRegionFromBitmap
+XRequest.XFIXES.7: XFixesCreateRegionFromWindow
+XRequest.XFIXES.8: XFixesCreateRegionFromGC
+XRequest.XFIXES.9: XFixesCreateRegionFromPicture
+XRequest.XFIXES.10: XFixesDestroyRegion
+XRequest.XFIXES.11: XFixesSetRegion
+XRequest.XFIXES.12: XFixesCopyRegion
+XRequest.XFIXES.13: XFixesUnionRegion
+XRequest.XFIXES.14: XFixesIntersectRegion
+XRequest.XFIXES.15: XFixesSubtractRegion
+XRequest.XFIXES.16: XFixesInvertRegion
+XRequest.XFIXES.17: XFixesTranslateRegion
+XRequest.XFIXES.18: XFixesRegionExtents
+XRequest.XFIXES.19: XFixesFetchRegion
+XRequest.XFIXES.20: XFixesSetGCClipRegion
+XRequest.XFIXES.21: XFixesSetWindowShapeRegion
+XRequest.XFIXES.22: XFixesSetPictureClipRegion
+XRequest.XFIXES.23: XFixesSetCursorName
+XRequest.XFIXES.24: XFixesGetCursorName
+XRequest.XFIXES.25: XFixesGetCursorImageAndName
+XRequest.XFIXES.26: XFixesChangeCursor
+XRequest.XFIXES.27: XFixesChangeCursorByName
+XRequest.XFIXES.28: XFixesExpandRegion
+XRequest.XFIXES.29: XFixesHideCursor
+XRequest.XFIXES.30: XFixesShowCursor
+XProtoError.XFIXES.0: BadRegion (invalid Region parameter)
+XlibMessage.XFIXES.0: Region id in failed request:  0x%lx
+! DAMAGE extension
+XRequest.DAMAGE.0: XDamageQueryVersion
+XRequest.DAMAGE.1: XDamageCreate
+XRequest.DAMAGE.2: XDamageDestroy
+XRequest.DAMAGE.3: XDamageSubtract
+XRequest.DAMAGE.4: XDamageAdd
+XProtoError.DAMAGE.0: BadDamage (invalid Damage parameter)
+XlibMessage.DAMAGE.0: Damage id in failed request: 0x%lx
+! DRI2 extension
+XRequest.DRI2.0: DRI2QueryVersion
+XRequest.DRI2.1: DRI2Connect
+XRequest.DRI2.2: DRI2Authenticate
+XRequest.DRI2.3: DRI2CreateDrawable
+XRequest.DRI2.4: DRI2DestroyDrawable
+XRequest.DRI2.5: DRI2GetBuffers
+XRequest.DRI2.6: DRI2CopyRegion
+XRequest.DRI2.7: DRI2GetBuffersWithFormat      
+XRequest.DRI2.8: DRI2SwapBuffers               
+XRequest.DRI2.9: DRI2GetMSC                    
+XRequest.DRI2.10: DRI2WaitMSC                  
+XRequest.DRI2.11: DRI2WaitSBC                  
+XRequest.DRI2.12: DRI2SwapInterval             
diff --git a/src/Xatomtype.h b/src/Xatomtype.h
new file mode 100644 (file)
index 0000000..1b2b477
--- /dev/null
@@ -0,0 +1,133 @@
+
+/***********************************************************
+
+Copyright 1987, 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 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 _XATOMTYPE_H_
+#define _XATOMTYPE_H_
+
+/*
+ * This files defines crock C structures for calling XGetWindowProperty and
+ * XChangeProperty.  All fields must be longs as the semantics of property
+ * routines will handle conversion to and from actual 32 bit objects.  If your
+ * compiler doesn't treat &structoflongs the same as &arrayoflongs[0], you
+ * will have some work to do.
+ */
+
+#define BOOL long
+#define SIGNEDINT long
+#define UNSIGNEDINT unsigned long
+#define RESOURCEID unsigned long
+
+
+/* this structure may be extended, but do not change the order */
+typedef struct {
+    UNSIGNEDINT flags;
+    SIGNEDINT x, y, width, height;     /* need to cvt; only for pre-ICCCM */
+    SIGNEDINT minWidth, minHeight;     /* need to cvt */
+    SIGNEDINT maxWidth, maxHeight;     /* need to cvt */
+    SIGNEDINT widthInc, heightInc;     /* need to cvt */
+    SIGNEDINT minAspectX, minAspectY;  /* need to cvt */
+    SIGNEDINT maxAspectX, maxAspectY;  /* need to cvt */
+    SIGNEDINT baseWidth,baseHeight;    /* need to cvt; ICCCM version 1 */
+    SIGNEDINT winGravity;              /* need to cvt; ICCCM version 1 */
+} xPropSizeHints;
+#define OldNumPropSizeElements 15      /* pre-ICCCM */
+#define NumPropSizeElements 18         /* ICCCM version 1 */
+
+/* this structure may be extended, but do not change the order */
+/* RGB properties */
+typedef struct {
+       RESOURCEID colormap;
+       UNSIGNEDINT red_max;
+       UNSIGNEDINT red_mult;
+       UNSIGNEDINT green_max;
+       UNSIGNEDINT green_mult;
+       UNSIGNEDINT blue_max;
+       UNSIGNEDINT blue_mult;
+       UNSIGNEDINT base_pixel;
+       RESOURCEID visualid;            /* ICCCM version 1 */
+       RESOURCEID killid;              /* ICCCM version 1 */
+} xPropStandardColormap;
+#define OldNumPropStandardColormapElements 8  /* pre-ICCCM */
+#define NumPropStandardColormapElements 10  /* ICCCM version 1 */
+
+
+/* this structure may be extended, but do not change the order */
+typedef struct {
+    UNSIGNEDINT flags;
+    BOOL input;                                /* need to convert */
+    SIGNEDINT initialState;            /* need to cvt */
+    RESOURCEID iconPixmap;
+    RESOURCEID iconWindow;
+    SIGNEDINT  iconX;                  /* need to cvt */
+    SIGNEDINT  iconY;                  /* need to cvt */
+    RESOURCEID iconMask;
+    UNSIGNEDINT windowGroup;
+  } xPropWMHints;
+#define NumPropWMHintsElements 9 /* number of elements in this structure */
+
+/* this structure defines the icon size hints information */
+typedef struct {
+    SIGNEDINT minWidth, minHeight;     /* need to cvt */
+    SIGNEDINT maxWidth, maxHeight;     /* need to cvt */
+    SIGNEDINT widthInc, heightInc;     /* need to cvt */
+  } xPropIconSize;
+#define NumPropIconSizeElements 6 /* number of elements in this structure */
+
+/* this structure defines the window manager state information */
+typedef struct {
+    SIGNEDINT state;                   /* need to cvt */
+    RESOURCEID iconWindow;
+} xPropWMState;
+#define NumPropWMStateElements 2       /* number of elements in struct */
+
+#undef BOOL
+#undef SIGNEDINT
+#undef UNSIGNEDINT
+#undef RESOURCEID
+
+#endif /* _XATOMTYPE_H_ */
diff --git a/src/Xintatom.h b/src/Xintatom.h
new file mode 100644 (file)
index 0000000..82dba36
--- /dev/null
@@ -0,0 +1,32 @@
+
+#ifndef _XINTATOM_H_
+#define _XINTATOM_H_ 1
+
+#include <X11/Xfuncproto.h>
+
+/* IntAtom.c */
+
+#define TABLESIZE 64
+
+typedef struct _Entry {
+    unsigned long sig;
+    Atom atom;
+} EntryRec, *Entry;
+
+#define RESERVED ((Entry) 1)
+
+#define EntryName(e) ((char *)(e+1))
+
+typedef struct _XDisplayAtoms {
+    Entry table[TABLESIZE];
+} AtomTable;
+
+_XFUNCPROTOBEGIN
+
+extern void _XUpdateAtomCache(Display *dpy, const char *name, Atom atom,
+                               unsigned long sig, int idx, int n);
+extern void _XFreeAtomTable(Display *dpy);
+
+_XFUNCPROTOEND
+
+#endif /* _XINTATOM_H_ */
diff --git a/src/Xintconn.h b/src/Xintconn.h
new file mode 100644 (file)
index 0000000..db59061
--- /dev/null
@@ -0,0 +1,14 @@
+
+#ifndef _XINTCONN_H_
+#define _XINTCONN_H_ 1
+
+#include <X11/Xfuncproto.h>
+
+_XFUNCPROTOBEGIN
+
+/* OpenDis.c */
+extern void _XFreeDisplayStructure(Display *dpy);
+
+_XFUNCPROTOEND
+
+#endif /* _XINTCONN_H_ */
diff --git a/src/XlibAsync.c b/src/XlibAsync.c
new file mode 100644 (file)
index 0000000..b17135c
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+
+Copyright 1992, 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 <X11/Xlibint.h>
+#include <X11/Xos.h>
+
+/*ARGSUSED*/
+Bool
+_XAsyncErrorHandler(
+    register Display *dpy,
+    register xReply *rep,
+    char *buf,
+    int len,
+    XPointer data)
+{
+    register _XAsyncErrorState *state;
+
+    state = (_XAsyncErrorState *)data;
+    if (rep->generic.type == X_Error &&
+       (!state->error_code ||
+        rep->error.errorCode == state->error_code) &&
+       (!state->major_opcode ||
+        rep->error.majorCode == state->major_opcode) &&
+       (!state->minor_opcode ||
+        rep->error.minorCode == state->minor_opcode) &&
+       (!state->min_sequence_number ||
+        (state->min_sequence_number <= dpy->last_request_read)) &&
+       (!state->max_sequence_number ||
+        (state->max_sequence_number >= dpy->last_request_read))) {
+       state->last_error_received = rep->error.errorCode;
+       state->error_count++;
+       return True;
+    }
+    return False;
+}
+
+void _XDeqAsyncHandler(
+    Display *dpy,
+    register _XAsyncHandler *handler)
+{
+    register _XAsyncHandler **prev;
+    register _XAsyncHandler *async;
+
+    for (prev = &dpy->async_handlers;
+        (async = *prev) && (async != handler);
+        prev = &async->next)
+       ;
+    if (async)
+       *prev = async->next;
+}
+
+char *
+_XGetAsyncReply(
+    register Display *dpy,
+    register char *replbuf,    /* data is read into this buffer */
+    register xReply *rep,      /* value passed to calling handler */
+    char *buf,                 /* value passed to calling handler */
+    int len,                   /* value passed to calling handler */
+    int extra,                 /* extra words to read, ala _XReply */
+    Bool discard)              /* discard after extra?, ala _XReply */
+{
+    if (extra == 0) {
+       if (discard && (rep->generic.length << 2) > len)
+           _XEatData (dpy, (rep->generic.length << 2) - len);
+       return (char *)rep;
+    }
+
+    if (extra <= rep->generic.length) {
+       int size = SIZEOF(xReply) + (extra << 2);
+       if (size > len) {
+           memcpy(replbuf, buf, len);
+           _XRead(dpy, replbuf + len, size - len);
+           buf = replbuf;
+           len = size;
+#ifdef MUSTCOPY
+       } else {
+           memcpy(replbuf, buf, size);
+           buf = replbuf;
+#endif
+       }
+
+       if (discard && rep->generic.length > extra &&
+           (rep->generic.length << 2) > len)
+           _XEatData (dpy, (rep->generic.length << 2) - len);
+
+       return buf;
+    }
+    /*
+     *if we get here, then extra > rep->generic.length--meaning we
+     * read a reply that's shorter than we expected.  This is an
+     * error,  but we still need to figure out how to handle it...
+     */
+    if ((rep->generic.length << 2) > len)
+       _XEatData (dpy, (rep->generic.length << 2) - len);
+    _XIOError (dpy);
+    return (char *)rep;
+}
+
+void
+_XGetAsyncData(
+    Display *dpy,
+    char *data,                        /* data is read into this buffer */
+    char *buf,                 /* value passed to calling handler */
+    int len,                   /* value passed to calling handler */
+    int skip,                  /* number of bytes already read in previous
+                                  _XGetAsyncReply or _XGetAsyncData calls */
+    int datalen,               /* size of data buffer in bytes */
+    int discardtotal)          /* min. bytes to consume (after skip) */
+{
+    buf += skip;
+    len -= skip;
+    if (!data) {
+       if (datalen > len)
+           _XEatData(dpy, datalen - len);
+    } else if (datalen <= len) {
+       memcpy(data, buf, datalen);
+    } else {
+       memcpy(data, buf, len);
+       _XRead(dpy, data + len, datalen - len);
+    }
+    if (discardtotal > len) {
+       if (datalen > len)
+           len = datalen;
+       _XEatData(dpy, discardtotal - len);
+    }
+}
diff --git a/src/XlibInt.c b/src/XlibInt.c
new file mode 100644 (file)
index 0000000..2827c10
--- /dev/null
@@ -0,0 +1,2189 @@
+/*
+
+Copyright 1985, 1986, 1987, 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.
+
+*/
+
+/*
+ *     XlibInt.c - Internal support routines for the C subroutine
+ *     interface library (Xlib) to the X Window System Protocol V11.0.
+ */
+
+#ifdef WIN32
+#define _XLIBINT_
+#endif
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xprivate.h"
+#include <X11/Xpoll.h>
+#include <assert.h>
+#include <stdio.h>
+#ifdef WIN32
+#include <direct.h>
+#endif
+
+#ifdef XTHREADS
+#include "locking.h"
+
+/* these pointers get initialized by XInitThreads */
+LockInfoPtr _Xglobal_lock = NULL;
+void (*_XCreateMutex_fn)(LockInfoPtr) = NULL;
+/* struct _XCVList *(*_XCreateCVL_fn)() = NULL; */
+void (*_XFreeMutex_fn)(LockInfoPtr) = NULL;
+void (*_XLockMutex_fn)(
+    LockInfoPtr /* lock */
+#if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE)
+    , char * /* file */
+    , int /* line */
+#endif
+    ) = NULL;
+void (*_XUnlockMutex_fn)(
+    LockInfoPtr /* lock */
+#if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE)
+    , char * /* file */
+    , int /* line */
+#endif
+    ) = NULL;
+xthread_t (*_Xthread_self_fn)(void) = NULL;
+
+#define XThread_Self() ((*_Xthread_self_fn)())
+
+#endif /* XTHREADS */
+
+/* check for both EAGAIN and EWOULDBLOCK, because some supposedly POSIX
+ * systems are broken and return EWOULDBLOCK when they should return EAGAIN
+ */
+#ifdef WIN32
+#define ETEST() (WSAGetLastError() == WSAEWOULDBLOCK)
+#else
+#ifdef __CYGWIN__ /* Cygwin uses ENOBUFS to signal socket is full */
+#define ETEST() (errno == EAGAIN || errno == EWOULDBLOCK || errno == ENOBUFS)
+#else
+#if defined(EAGAIN) && defined(EWOULDBLOCK)
+#define ETEST() (errno == EAGAIN || errno == EWOULDBLOCK)
+#else
+#ifdef EAGAIN
+#define ETEST() (errno == EAGAIN)
+#else
+#define ETEST() (errno == EWOULDBLOCK)
+#endif /* EAGAIN */
+#endif /* EAGAIN && EWOULDBLOCK */
+#endif /* __CYGWIN__ */
+#endif /* WIN32 */
+
+#ifdef WIN32
+#define ECHECK(err) (WSAGetLastError() == err)
+#define ESET(val) WSASetLastError(val)
+#else
+#ifdef __UNIXOS2__
+#define ECHECK(err) (errno == err)
+#define ESET(val)
+#else
+#define ECHECK(err) (errno == err)
+#define ESET(val) errno = val
+#endif
+#endif
+
+#if defined(LOCALCONN) || defined(LACHMAN)
+#ifdef EMSGSIZE
+#define ESZTEST() (ECHECK(EMSGSIZE) || ECHECK(ERANGE))
+#else
+#define ESZTEST() ECHECK(ERANGE)
+#endif
+#else
+#ifdef EMSGSIZE
+#define ESZTEST() ECHECK(EMSGSIZE)
+#endif
+#endif
+
+#ifdef __UNIXOS2__
+#include <limits.h>
+#define MAX_PATH _POSIX_PATH_MAX
+#endif
+
+/*
+ * The following routines are internal routines used by Xlib for protocol
+ * packet transmission and reception.
+ *
+ * _XIOError(Display *) will be called if any sort of system call error occurs.
+ * This is assumed to be a fatal condition, i.e., XIOError should not return.
+ *
+ * _XError(Display *, xError *) will be called whenever an X_Error event is
+ * received.  This is not assumed to be a fatal condition, i.e., it is
+ * acceptable for this procedure to return.  However, XError should NOT
+ * perform any operations (directly or indirectly) on the DISPLAY.
+ *
+ * Routines declared with a return type of 'Status' return 0 on failure,
+ * and non 0 on success.  Routines with no declared return type don't
+ * return anything.  Whenever possible routines that create objects return
+ * the object they have created.
+ */
+
+#define POLLFD_CACHE_SIZE 5
+
+/* initialize the struct array passed to poll() below */
+Bool _XPollfdCacheInit(
+    Display *dpy)
+{
+#ifdef USE_POLL
+    struct pollfd *pfp;
+
+    pfp = (struct pollfd *)Xmalloc(POLLFD_CACHE_SIZE * sizeof(struct pollfd));
+    if (!pfp)
+       return False;
+    pfp[0].fd = dpy->fd;
+    pfp[0].events = POLLIN;
+
+    dpy->filedes = (XPointer)pfp;
+#endif
+    return True;
+}
+
+void _XPollfdCacheAdd(
+    Display *dpy,
+    int fd)
+{
+#ifdef USE_POLL
+    struct pollfd *pfp = (struct pollfd *)dpy->filedes;
+
+    if (dpy->im_fd_length <= POLLFD_CACHE_SIZE) {
+       pfp[dpy->im_fd_length].fd = fd;
+       pfp[dpy->im_fd_length].events = POLLIN;
+    }
+#endif
+}
+
+/* ARGSUSED */
+void _XPollfdCacheDel(
+    Display *dpy,
+    int fd)                    /* not used */
+{
+#ifdef USE_POLL
+    struct pollfd *pfp = (struct pollfd *)dpy->filedes;
+    struct _XConnectionInfo *conni;
+
+    /* just recalculate whole list */
+    if (dpy->im_fd_length <= POLLFD_CACHE_SIZE) {
+       int loc = 1;
+       for (conni = dpy->im_fd_info; conni; conni=conni->next) {
+           pfp[loc].fd = conni->fd;
+           pfp[loc].events = POLLIN;
+           loc++;
+       }
+    }
+#endif
+}
+
+static int sync_hazard(Display *dpy)
+{
+    unsigned long span = dpy->request - dpy->last_request_read;
+    unsigned long hazard = min((dpy->bufmax - dpy->buffer) / SIZEOF(xReq), 65535 - 10);
+    return span >= 65535 - hazard - 10;
+}
+
+static
+void sync_while_locked(Display *dpy)
+{
+#ifdef XTHREADS
+    if (dpy->lock)
+        (*dpy->lock->user_lock_display)(dpy);
+#endif
+    UnlockDisplay(dpy);
+    SyncHandle();
+    InternalLockDisplay(dpy, /* don't skip user locks */ 0);
+#ifdef XTHREADS
+    if (dpy->lock)
+        (*dpy->lock->user_unlock_display)(dpy);
+#endif
+}
+
+void _XSeqSyncFunction(
+    register Display *dpy)
+{
+    xGetInputFocusReply rep;
+    register xReq *req;
+
+    if ((dpy->request - dpy->last_request_read) >= (65535 - BUFSIZE/SIZEOF(xReq))) {
+       GetEmptyReq(GetInputFocus, req);
+       (void) _XReply (dpy, (xReply *)&rep, 0, xTrue);
+       sync_while_locked(dpy);
+    } else if (sync_hazard(dpy))
+       _XSetPrivSyncFunction(dpy);
+}
+
+/* NOTE: only called if !XTHREADS, or when XInitThreads wasn't called. */
+static int
+_XPrivSyncFunction (Display *dpy)
+{
+#if XTHREADS
+    assert(!dpy->lock_fns);
+#endif
+    assert(dpy->synchandler == _XPrivSyncFunction);
+    assert((dpy->flags & XlibDisplayPrivSync) != 0);
+    dpy->synchandler = dpy->savedsynchandler;
+    dpy->savedsynchandler = NULL;
+    dpy->flags &= ~XlibDisplayPrivSync;
+    if(dpy->synchandler)
+        dpy->synchandler(dpy);
+    _XIDHandler(dpy);
+    _XSeqSyncFunction(dpy);
+    return 0;
+}
+
+void _XSetPrivSyncFunction(Display *dpy)
+{
+#ifdef XTHREADS
+    if (dpy->lock_fns)
+        return;
+#endif
+    if (!(dpy->flags & XlibDisplayPrivSync)) {
+       dpy->savedsynchandler = dpy->synchandler;
+       dpy->synchandler = _XPrivSyncFunction;
+       dpy->flags |= XlibDisplayPrivSync;
+    }
+}
+
+void _XSetSeqSyncFunction(Display *dpy)
+{
+    if (sync_hazard(dpy))
+       _XSetPrivSyncFunction (dpy);
+}
+
+#ifdef LONG64
+void _XRead32(
+    Display *dpy,
+    register long *data,
+    long len)
+{
+    register int *buf;
+    register long i;
+
+    if (len) {
+       (void) _XRead(dpy, (char *)data, len);
+       i = len >> 2;
+       buf = (int *)data + i;
+       data += i;
+       while (--i >= 0)
+           *--data = *--buf;
+    }
+}
+#endif /* LONG64 */
+
+#ifdef WORD64
+
+/*
+ * XXX This is a *really* stupid way of doing this....
+ * PACKBUFFERSIZE must be a multiple of 4.
+ */
+
+#define PACKBUFFERSIZE 4096
+
+
+/*
+ * _XRead32 - Read bytes from the socket unpacking each 32 bits
+ *            into a long (64 bits on a CRAY computer).
+ *
+ */
+static void _doXRead32(
+        register Display *dpy,
+        register long *data
+        register long size,
+       register char *packbuffer)
+{
+ long *lpack,*lp;
+ long mask32 = 0x00000000ffffffff;
+ long maskw, nwords, i, bits;
+
+        _XReadPad (dpy, packbuffer, size);
+
+        lp = data;
+        lpack = (long *) packbuffer;
+        nwords = size >> 2;
+        bits = 32;
+
+        for(i=0;i<nwords;i++){
+            maskw = mask32 << bits;
+           *lp++ = ( *lpack & maskw ) >> bits;
+            bits = bits ^32;
+            if(bits){
+               lpack++;
+            }
+        }
+}
+
+void _XRead32(
+    Display *dpy,
+    long *data,
+    long len)
+{
+    char packbuffer[PACKBUFFERSIZE];
+    unsigned nunits = PACKBUFFERSIZE >> 2;
+
+    for (; len > PACKBUFFERSIZE; len -= PACKBUFFERSIZE, data += nunits) {
+       _doXRead32 (dpy, data, PACKBUFFERSIZE, packbuffer);
+    }
+    if (len) _doXRead32 (dpy, data, len, packbuffer);
+}
+
+
+
+/*
+ * _XRead16 - Read bytes from the socket unpacking each 16 bits
+ *            into a long (64 bits on a CRAY computer).
+ *
+ */
+static _doXRead16(
+        register Display *dpy,
+        register short *data,
+        register long size,
+       char *packbuffer)
+{
+       long *lpack,*lp;
+       long mask16 = 0x000000000000ffff;
+       long maskw, nwords, i, bits;
+
+        (void) _XRead(dpy,packbuffer,size);    /* don't do a padded read... */
+
+        lp = (long *) data;
+        lpack = (long *) packbuffer;
+        nwords = size >> 1;  /* number of 16 bit words to be unpacked */
+        bits = 48;
+        for(i=0;i<nwords;i++){
+            maskw = mask16 << bits;
+           *lp++ = ( *lpack & maskw ) >> bits;
+            bits -= 16;
+            if(bits < 0){
+               lpack++;
+               bits = 48;
+            }
+        }
+}
+
+void _XRead16(
+    Display *dpy,
+    short *data,
+    long len)
+{
+    char packbuffer[PACKBUFFERSIZE];
+    unsigned nunits = PACKBUFFERSIZE >> 1;
+
+    for (; len > PACKBUFFERSIZE; len -= PACKBUFFERSIZE, data += nunits) {
+       _doXRead16 (dpy, data, PACKBUFFERSIZE, packbuffer);
+    }
+    if (len) _doXRead16 (dpy, data, len, packbuffer);
+}
+
+void _XRead16Pad(
+    Display *dpy,
+    short *data,
+    long size)
+{
+    int slop = (size & 3);
+    short slopbuf[3];
+
+    _XRead16 (dpy, data, size);
+    if (slop > 0) {
+       _XRead16 (dpy, slopbuf, 4 - slop);
+    }
+}
+#endif /* WORD64 */
+
+/*
+ * The hard part about this is that we only get 16 bits from a reply.
+ * We have three values that will march along, with the following invariant:
+ *     dpy->last_request_read <= rep->sequenceNumber <= dpy->request
+ * We have to keep
+ *     dpy->request - dpy->last_request_read < 2^16
+ * or else we won't know for sure what value to use in events.  We do this
+ * by forcing syncs when we get close.
+ */
+
+unsigned long
+_XSetLastRequestRead(
+    register Display *dpy,
+    register xGenericReply *rep)
+{
+    register unsigned long     newseq, lastseq;
+
+    lastseq = dpy->last_request_read;
+    /*
+     * KeymapNotify has no sequence number, but is always guaranteed
+     * to immediately follow another event, except when generated via
+     * SendEvent (hmmm).
+     */
+    if ((rep->type & 0x7f) == KeymapNotify)
+       return(lastseq);
+
+    newseq = (lastseq & ~((unsigned long)0xffff)) | rep->sequenceNumber;
+
+    if (newseq < lastseq) {
+       newseq += 0x10000;
+       if (newseq > dpy->request) {
+           (void) fprintf (stderr,
+           "Xlib: sequence lost (0x%lx > 0x%lx) in reply type 0x%x!\n",
+                           newseq, dpy->request,
+                           (unsigned int) rep->type);
+           newseq -= 0x10000;
+       }
+    }
+
+    dpy->last_request_read = newseq;
+    return(newseq);
+}
+
+/*
+ * Support for internal connections, such as an IM might use.
+ * By Stephen Gildea, X Consortium, September 1993
+ */
+
+/* _XRegisterInternalConnection
+ * Each IM (or Xlib extension) that opens a file descriptor that Xlib should
+ * include in its select/poll mask must call this function to register the
+ * fd with Xlib.  Any XConnectionWatchProc registered by XAddConnectionWatch
+ * will also be called.
+ *
+ * Whenever Xlib detects input available on fd, it will call callback
+ * with call_data to process it.  If non-Xlib code calls select/poll
+ * and detects input available, it must call XProcessInternalConnection,
+ * which will call the associated callback.
+ *
+ * Non-Xlib code can learn about these additional fds by calling
+ * XInternalConnectionNumbers or, more typically, by registering
+ * a XConnectionWatchProc with XAddConnectionWatch
+ * to be called when fds are registered or unregistered.
+ *
+ * Returns True if registration succeeded, False if not, typically
+ * because could not allocate memory.
+ * Assumes Display locked when called.
+ */
+Status
+_XRegisterInternalConnection(
+    Display* dpy,
+    int fd,
+    _XInternalConnectionProc callback,
+    XPointer call_data
+)
+{
+    struct _XConnectionInfo *new_conni, **iptr;
+    struct _XConnWatchInfo *watchers;
+    XPointer *wd;
+
+    new_conni = (struct _XConnectionInfo*)Xmalloc(sizeof(struct _XConnectionInfo));
+    if (!new_conni)
+       return 0;
+    new_conni->watch_data = (XPointer *)Xmalloc(dpy->watcher_count * sizeof(XPointer));
+    if (!new_conni->watch_data) {
+       Xfree(new_conni);
+       return 0;
+    }
+    new_conni->fd = fd;
+    new_conni->read_callback = callback;
+    new_conni->call_data = call_data;
+    new_conni->next = NULL;
+    /* link new structure onto end of list */
+    for (iptr = &dpy->im_fd_info; *iptr; iptr = &(*iptr)->next)
+       ;
+    *iptr = new_conni;
+    dpy->im_fd_length++;
+    _XPollfdCacheAdd(dpy, fd);
+
+    for (watchers=dpy->conn_watchers, wd=new_conni->watch_data;
+        watchers;
+        watchers=watchers->next, wd++) {
+       *wd = NULL;             /* for cleanliness */
+       (*watchers->fn) (dpy, watchers->client_data, fd, True, wd);
+    }
+
+    return 1;
+}
+
+/* _XUnregisterInternalConnection
+ * Each IM (or Xlib extension) that closes a file descriptor previously
+ * registered with _XRegisterInternalConnection must call this function.
+ * Any XConnectionWatchProc registered by XAddConnectionWatch
+ * will also be called.
+ *
+ * Assumes Display locked when called.
+ */
+void
+_XUnregisterInternalConnection(
+    Display* dpy,
+    int fd
+)
+{
+    struct _XConnectionInfo *info_list, **prev;
+    struct _XConnWatchInfo *watch;
+    XPointer *wd;
+
+    for (prev = &dpy->im_fd_info; (info_list = *prev);
+        prev = &info_list->next) {
+       if (info_list->fd == fd) {
+           *prev = info_list->next;
+           dpy->im_fd_length--;
+           for (watch=dpy->conn_watchers, wd=info_list->watch_data;
+                watch;
+                watch=watch->next, wd++) {
+               (*watch->fn) (dpy, watch->client_data, fd, False, wd);
+           }
+           if (info_list->watch_data)
+               Xfree (info_list->watch_data);
+           Xfree (info_list);
+           break;
+       }
+    }
+    _XPollfdCacheDel(dpy, fd);
+}
+
+/* XInternalConnectionNumbers
+ * Returns an array of fds and an array of corresponding call data.
+ * Typically a XConnectionWatchProc registered with XAddConnectionWatch
+ * will be used instead of this function to discover
+ * additional fds to include in the select/poll mask.
+ *
+ * The list is allocated with Xmalloc and should be freed by the caller
+ * with Xfree;
+ */
+Status
+XInternalConnectionNumbers(
+    Display *dpy,
+    int **fd_return,
+    int *count_return
+)
+{
+    int count;
+    struct _XConnectionInfo *info_list;
+    int *fd_list;
+
+    LockDisplay(dpy);
+    count = 0;
+    for (info_list=dpy->im_fd_info; info_list; info_list=info_list->next)
+       count++;
+    fd_list = (int*) Xmalloc (count * sizeof(int));
+    if (!fd_list) {
+       UnlockDisplay(dpy);
+       return 0;
+    }
+    count = 0;
+    for (info_list=dpy->im_fd_info; info_list; info_list=info_list->next) {
+       fd_list[count] = info_list->fd;
+       count++;
+    }
+    UnlockDisplay(dpy);
+
+    *fd_return = fd_list;
+    *count_return = count;
+    return 1;
+}
+
+void _XProcessInternalConnection(
+    Display *dpy,
+    struct _XConnectionInfo *conn_info)
+{
+    dpy->flags |= XlibDisplayProcConni;
+    UnlockDisplay(dpy);
+    (*conn_info->read_callback) (dpy, conn_info->fd, conn_info->call_data);
+    LockDisplay(dpy);
+    dpy->flags &= ~XlibDisplayProcConni;
+}
+
+/* XProcessInternalConnection
+ * Call the _XInternalConnectionProc registered by _XRegisterInternalConnection
+ * for this fd.
+ * The Display is NOT locked during the call.
+ */
+void
+XProcessInternalConnection(
+    Display* dpy,
+    int fd
+)
+{
+    struct _XConnectionInfo *info_list;
+
+    LockDisplay(dpy);
+    for (info_list=dpy->im_fd_info; info_list; info_list=info_list->next) {
+       if (info_list->fd == fd) {
+           _XProcessInternalConnection(dpy, info_list);
+           break;
+       }
+    }
+    UnlockDisplay(dpy);
+}
+
+/* XAddConnectionWatch
+ * Register a callback to be called whenever _XRegisterInternalConnection
+ * or _XUnregisterInternalConnection is called.
+ * Callbacks are called with the Display locked.
+ * If any connections are already registered, the callback is immediately
+ * called for each of them.
+ */
+Status
+XAddConnectionWatch(
+    Display* dpy,
+    XConnectionWatchProc callback,
+    XPointer client_data
+)
+{
+    struct _XConnWatchInfo *new_watcher, **wptr;
+    struct _XConnectionInfo *info_list;
+    XPointer *wd_array;
+
+    LockDisplay(dpy);
+
+    /* allocate new watch data */
+    for (info_list=dpy->im_fd_info; info_list; info_list=info_list->next) {
+       wd_array = (XPointer *)Xrealloc((char *)info_list->watch_data,
+                                       (dpy->watcher_count + 1) *
+                                       sizeof(XPointer));
+       if (!wd_array) {
+           UnlockDisplay(dpy);
+           return 0;
+       }
+       info_list->watch_data = wd_array;
+       wd_array[dpy->watcher_count] = NULL;    /* for cleanliness */
+    }
+
+    new_watcher = (struct _XConnWatchInfo*)Xmalloc(sizeof(struct _XConnWatchInfo));
+    if (!new_watcher) {
+       UnlockDisplay(dpy);
+       return 0;
+    }
+    new_watcher->fn = callback;
+    new_watcher->client_data = client_data;
+    new_watcher->next = NULL;
+
+    /* link new structure onto end of list */
+    for (wptr = &dpy->conn_watchers; *wptr; wptr = &(*wptr)->next)
+       ;
+    *wptr = new_watcher;
+    dpy->watcher_count++;
+
+    /* call new watcher on all currently registered fds */
+    for (info_list=dpy->im_fd_info; info_list; info_list=info_list->next) {
+       (*callback) (dpy, client_data, info_list->fd, True,
+                    info_list->watch_data + dpy->watcher_count - 1);
+    }
+
+    UnlockDisplay(dpy);
+    return 1;
+}
+
+/* XRemoveConnectionWatch
+ * Unregister a callback registered by XAddConnectionWatch.
+ * Both callback and client_data must match what was passed to
+ * XAddConnectionWatch.
+ */
+void
+XRemoveConnectionWatch(
+    Display* dpy,
+    XConnectionWatchProc callback,
+    XPointer client_data
+)
+{
+    struct _XConnWatchInfo *watch;
+    struct _XConnWatchInfo *previous = NULL;
+    struct _XConnectionInfo *conni;
+    int counter = 0;
+
+    LockDisplay(dpy);
+    for (watch=dpy->conn_watchers; watch; watch=watch->next) {
+       if (watch->fn == callback  &&  watch->client_data == client_data) {
+           if (previous)
+               previous->next = watch->next;
+           else
+               dpy->conn_watchers = watch->next;
+           Xfree (watch);
+           dpy->watcher_count--;
+           /* remove our watch_data for each connection */
+           for (conni=dpy->im_fd_info; conni; conni=conni->next) {
+               /* don't bother realloc'ing; these arrays are small anyway */
+               /* overlapping */
+               memmove(conni->watch_data+counter,
+                       conni->watch_data+counter+1,
+                       dpy->watcher_count - counter);
+           }
+           break;
+       }
+       previous = watch;
+       counter++;
+    }
+    UnlockDisplay(dpy);
+}
+
+/* end of internal connections support */
+
+/* Cookie jar implementation
+   dpy->cookiejar is a linked list. _XEnq receives the events but leaves
+   them in the normal EQ. _XStoreEvent returns the cookie event (minus
+   data pointer) and adds it to the cookiejar. _XDeq just removes
+   the entry like any other event but resets the data pointer for
+   cookie events (to avoid double-free, the memory is re-used by Xlib).
+
+   _XFetchEventCookie (called from XGetEventData) removes a cookie from the
+   jar. _XFreeEventCookies removes all unclaimed cookies from the jar
+   (called by XNextEvent).
+
+   _XFreeDisplayStructure calls _XFreeEventCookies for each cookie in the
+   normal EQ.
+ */
+
+#include "utlist.h"
+struct stored_event {
+    XGenericEventCookie ev;
+    struct stored_event *prev;
+    struct stored_event *next;
+};
+
+Bool
+_XIsEventCookie(Display *dpy, XEvent *ev)
+{
+    return (ev->xcookie.type == GenericEvent &&
+           dpy->generic_event_vec[ev->xcookie.extension & 0x7F] != NULL);
+}
+
+/**
+ * Free all events in the event list.
+ */
+void
+_XFreeEventCookies(Display *dpy)
+{
+    struct stored_event **head, *e, *tmp;
+
+    if (!dpy->cookiejar)
+        return;
+
+    head = (struct stored_event**)&dpy->cookiejar;
+
+    DL_FOREACH_SAFE(*head, e, tmp) {
+        if (dpy->cookiejar == e)
+            dpy->cookiejar = NULL;
+        XFree(e->ev.data);
+        XFree(e);
+    }
+}
+
+/**
+ * Add an event to the display's event list. This event must be freed on the
+ * next call to XNextEvent().
+ */
+void
+_XStoreEventCookie(Display *dpy, XEvent *event)
+{
+    XGenericEventCookie* cookie = &event->xcookie;
+    struct stored_event **head, *add;
+
+    if (!_XIsEventCookie(dpy, event))
+        return;
+
+    head = (struct stored_event**)(&dpy->cookiejar);
+
+    add = Xmalloc(sizeof(struct stored_event));
+    if (!add) {
+        ESET(ENOMEM);
+        _XIOError(dpy);
+    }
+    add->ev = *cookie;
+    DL_APPEND(*head, add);
+    cookie->data = NULL; /* don't return data yet, must be claimed */
+}
+
+/**
+ * Return the event with the given cookie and remove it from the list.
+ */
+Bool
+_XFetchEventCookie(Display *dpy, XGenericEventCookie* ev)
+{
+    Bool ret = False;
+    struct stored_event **head, *event;
+    head = (struct stored_event**)&dpy->cookiejar;
+
+    if (!_XIsEventCookie(dpy, (XEvent*)ev))
+        return ret;
+
+    DL_FOREACH(*head, event) {
+        if (event->ev.cookie == ev->cookie &&
+            event->ev.extension == ev->extension &&
+            event->ev.evtype == ev->evtype) {
+            *ev = event->ev;
+            DL_DELETE(*head, event);
+            Xfree(event);
+            ret = True;
+            break;
+        }
+    }
+
+    return ret;
+}
+
+Bool
+_XCopyEventCookie(Display *dpy, XGenericEventCookie *in, XGenericEventCookie *out)
+{
+    Bool ret = False;
+    int extension;
+
+    if (!_XIsEventCookie(dpy, (XEvent*)in) || !out)
+        return ret;
+
+    extension = in->extension & 0x7F;
+
+    if (!dpy->generic_event_copy_vec[extension])
+        return ret;
+
+    ret = ((*dpy->generic_event_copy_vec[extension])(dpy, in, out));
+    out->cookie = ret ? ++dpy->next_cookie  : 0;
+    return ret;
+}
+
+
+/*
+ * _XEnq - Place event packets on the display's queue.
+ * note that no squishing of move events in V11, since there
+ * is pointer motion hints....
+ */
+void _XEnq(
+       register Display *dpy,
+       register xEvent *event)
+{
+       register _XQEvent *qelt;
+       int type, extension;
+
+       if ((qelt = dpy->qfree)) {
+               /* If dpy->qfree is non-NULL do this, else malloc a new one. */
+               dpy->qfree = qelt->next;
+       }
+       else if ((qelt =
+           (_XQEvent *) Xmalloc((unsigned)sizeof(_XQEvent))) == NULL) {
+               /* Malloc call failed! */
+               ESET(ENOMEM);
+               _XIOError(dpy);
+       }
+       qelt->next = NULL;
+
+       type = event->u.u.type & 0177;
+       extension = ((xGenericEvent*)event)->extension;
+
+       qelt->event.type = type;
+       /* If an extension has registered a generic_event_vec handler, then
+        * it can handle event cookies. Otherwise, proceed with the normal
+        * event handlers.
+        *
+        * If the generic_event_vec is called, qelt->event is a event cookie
+        * with the data pointer and the "free" pointer set. Data pointer is
+        * some memory allocated by the extension.
+        */
+        if (type == GenericEvent && dpy->generic_event_vec[extension & 0x7F]) {
+           XGenericEventCookie *cookie = &qelt->event.xcookie;
+           (*dpy->generic_event_vec[extension & 0x7F])(dpy, cookie, event);
+           cookie->cookie = ++dpy->next_cookie;
+
+           qelt->qserial_num = dpy->next_event_serial_num++;
+           if (dpy->tail)      dpy->tail->next = qelt;
+           else                dpy->head = qelt;
+
+           dpy->tail = qelt;
+           dpy->qlen++;
+       } else if ((*dpy->event_vec[type])(dpy, &qelt->event, event)) {
+           qelt->qserial_num = dpy->next_event_serial_num++;
+           if (dpy->tail)      dpy->tail->next = qelt;
+           else                dpy->head = qelt;
+
+           dpy->tail = qelt;
+           dpy->qlen++;
+       } else {
+           /* ignored, or stashed away for many-to-one compression */
+           qelt->next = dpy->qfree;
+           dpy->qfree = qelt;
+       }
+}
+
+/*
+ * _XDeq - Remove event packet from the display's queue.
+ */
+void _XDeq(
+    register Display *dpy,
+    register _XQEvent *prev,   /* element before qelt */
+    register _XQEvent *qelt)   /* element to be unlinked */
+{
+    if (prev) {
+       if ((prev->next = qelt->next) == NULL)
+           dpy->tail = prev;
+    } else {
+       /* no prev, so removing first elt */
+       if ((dpy->head = qelt->next) == NULL)
+           dpy->tail = NULL;
+    }
+    qelt->qserial_num = 0;
+    qelt->next = dpy->qfree;
+    dpy->qfree = qelt;
+    dpy->qlen--;
+
+    if (_XIsEventCookie(dpy, &qelt->event)) {
+       XGenericEventCookie* cookie = &qelt->event.xcookie;
+       /* dpy->qfree is re-used, reset memory to avoid double free on
+        * _XFreeDisplayStructure */
+       cookie->data = NULL;
+    }
+}
+
+/*
+ * EventToWire in separate file in that often not needed.
+ */
+
+/*ARGSUSED*/
+Bool
+_XUnknownWireEvent(
+    register Display *dpy,     /* pointer to display structure */
+    register XEvent *re,       /* pointer to where event should be reformatted */
+    register xEvent *event)    /* wire protocol event */
+{
+#ifdef notdef
+       (void) fprintf(stderr,
+           "Xlib: unhandled wire event! event number = %d, display = %x\n.",
+                       event->u.u.type, dpy);
+#endif
+       return(False);
+}
+
+Bool
+_XUnknownWireEventCookie(
+    Display *dpy,      /* pointer to display structure */
+    XGenericEventCookie *re,   /* pointer to where event should be reformatted */
+    xEvent *event)     /* wire protocol event */
+{
+#ifdef notdef
+       fprintf(stderr,
+           "Xlib: unhandled wire cookie event! extension number = %d, display = %x\n.",
+                       ((xGenericEvent*)event)->extension, dpy);
+#endif
+       return(False);
+}
+
+Bool
+_XUnknownCopyEventCookie(
+    Display *dpy,      /* pointer to display structure */
+    XGenericEventCookie *in,   /* source */
+    XGenericEventCookie *out)  /* destination */
+{
+#ifdef notdef
+       fprintf(stderr,
+           "Xlib: unhandled cookie event copy! extension number = %d, display = %x\n.",
+                       in->extension, dpy);
+#endif
+       return(False);
+}
+
+/*ARGSUSED*/
+Status
+_XUnknownNativeEvent(
+    register Display *dpy,     /* pointer to display structure */
+    register XEvent *re,       /* pointer to where event should be reformatted */
+    register xEvent *event)    /* wire protocol event */
+{
+#ifdef notdef
+       (void) fprintf(stderr,
+          "Xlib: unhandled native event! event number = %d, display = %x\n.",
+                       re->type, dpy);
+#endif
+       return(0);
+}
+/*
+ * reformat a wire event into an XEvent structure of the right type.
+ */
+Bool
+_XWireToEvent(
+    register Display *dpy,     /* pointer to display structure */
+    register XEvent *re,       /* pointer to where event should be reformatted */
+    register xEvent *event)    /* wire protocol event */
+{
+
+       re->type = event->u.u.type & 0x7f;
+       ((XAnyEvent *)re)->serial = _XSetLastRequestRead(dpy,
+                                       (xGenericReply *)event);
+       ((XAnyEvent *)re)->send_event = ((event->u.u.type & 0x80) != 0);
+       ((XAnyEvent *)re)->display = dpy;
+
+       /* Ignore the leading bit of the event type since it is set when a
+               client sends an event rather than the server. */
+
+       switch (event-> u.u.type & 0177) {
+             case KeyPress:
+             case KeyRelease:
+               {
+                       register XKeyEvent *ev = (XKeyEvent*) re;
+                       ev->root        = event->u.keyButtonPointer.root;
+                       ev->window      = event->u.keyButtonPointer.event;
+                       ev->subwindow   = event->u.keyButtonPointer.child;
+                       ev->time        = event->u.keyButtonPointer.time;
+                       ev->x           = cvtINT16toInt(event->u.keyButtonPointer.eventX);
+                       ev->y           = cvtINT16toInt(event->u.keyButtonPointer.eventY);
+                       ev->x_root      = cvtINT16toInt(event->u.keyButtonPointer.rootX);
+                       ev->y_root      = cvtINT16toInt(event->u.keyButtonPointer.rootY);
+                       ev->state       = event->u.keyButtonPointer.state;
+                       ev->same_screen = event->u.keyButtonPointer.sameScreen;
+                       ev->keycode     = event->u.u.detail;
+               }
+               break;
+             case ButtonPress:
+             case ButtonRelease:
+               {
+                       register XButtonEvent *ev =  (XButtonEvent *) re;
+                       ev->root        = event->u.keyButtonPointer.root;
+                       ev->window      = event->u.keyButtonPointer.event;
+                       ev->subwindow   = event->u.keyButtonPointer.child;
+                       ev->time        = event->u.keyButtonPointer.time;
+                       ev->x           = cvtINT16toInt(event->u.keyButtonPointer.eventX);
+                       ev->y           = cvtINT16toInt(event->u.keyButtonPointer.eventY);
+                       ev->x_root      = cvtINT16toInt(event->u.keyButtonPointer.rootX);
+                       ev->y_root      = cvtINT16toInt(event->u.keyButtonPointer.rootY);
+                       ev->state       = event->u.keyButtonPointer.state;
+                       ev->same_screen = event->u.keyButtonPointer.sameScreen;
+                       ev->button      = event->u.u.detail;
+               }
+               break;
+             case MotionNotify:
+               {
+                       register XMotionEvent *ev =   (XMotionEvent *)re;
+                       ev->root        = event->u.keyButtonPointer.root;
+                       ev->window      = event->u.keyButtonPointer.event;
+                       ev->subwindow   = event->u.keyButtonPointer.child;
+                       ev->time        = event->u.keyButtonPointer.time;
+                       ev->x           = cvtINT16toInt(event->u.keyButtonPointer.eventX);
+                       ev->y           = cvtINT16toInt(event->u.keyButtonPointer.eventY);
+                       ev->x_root      = cvtINT16toInt(event->u.keyButtonPointer.rootX);
+                       ev->y_root      = cvtINT16toInt(event->u.keyButtonPointer.rootY);
+                       ev->state       = event->u.keyButtonPointer.state;
+                       ev->same_screen = event->u.keyButtonPointer.sameScreen;
+                       ev->is_hint     = event->u.u.detail;
+               }
+               break;
+             case EnterNotify:
+             case LeaveNotify:
+               {
+                       register XCrossingEvent *ev   = (XCrossingEvent *) re;
+                       ev->root        = event->u.enterLeave.root;
+                       ev->window      = event->u.enterLeave.event;
+                       ev->subwindow   = event->u.enterLeave.child;
+                       ev->time        = event->u.enterLeave.time;
+                       ev->x           = cvtINT16toInt(event->u.enterLeave.eventX);
+                       ev->y           = cvtINT16toInt(event->u.enterLeave.eventY);
+                       ev->x_root      = cvtINT16toInt(event->u.enterLeave.rootX);
+                       ev->y_root      = cvtINT16toInt(event->u.enterLeave.rootY);
+                       ev->state       = event->u.enterLeave.state;
+                       ev->mode        = event->u.enterLeave.mode;
+                       ev->same_screen = (event->u.enterLeave.flags &
+                               ELFlagSameScreen) && True;
+                       ev->focus       = (event->u.enterLeave.flags &
+                               ELFlagFocus) && True;
+                       ev->detail      = event->u.u.detail;
+               }
+                 break;
+             case FocusIn:
+             case FocusOut:
+               {
+                       register XFocusChangeEvent *ev = (XFocusChangeEvent *) re;
+                       ev->window      = event->u.focus.window;
+                       ev->mode        = event->u.focus.mode;
+                       ev->detail      = event->u.u.detail;
+               }
+                 break;
+             case KeymapNotify:
+               {
+                       register XKeymapEvent *ev = (XKeymapEvent *) re;
+                       ev->window      = None;
+                       memcpy(&ev->key_vector[1],
+                              (char *)((xKeymapEvent *) event)->map,
+                              sizeof (((xKeymapEvent *) event)->map));
+               }
+               break;
+             case Expose:
+               {
+                       register XExposeEvent *ev = (XExposeEvent *) re;
+                       ev->window      = event->u.expose.window;
+                       ev->x           = event->u.expose.x;
+                       ev->y           = event->u.expose.y;
+                       ev->width       = event->u.expose.width;
+                       ev->height      = event->u.expose.height;
+                       ev->count       = event->u.expose.count;
+               }
+               break;
+             case GraphicsExpose:
+               {
+                   register XGraphicsExposeEvent *ev =
+                       (XGraphicsExposeEvent *) re;
+                   ev->drawable        = event->u.graphicsExposure.drawable;
+                   ev->x               = event->u.graphicsExposure.x;
+                   ev->y               = event->u.graphicsExposure.y;
+                   ev->width           = event->u.graphicsExposure.width;
+                   ev->height          = event->u.graphicsExposure.height;
+                   ev->count           = event->u.graphicsExposure.count;
+                   ev->major_code      = event->u.graphicsExposure.majorEvent;
+                   ev->minor_code      = event->u.graphicsExposure.minorEvent;
+               }
+               break;
+             case NoExpose:
+               {
+                   register XNoExposeEvent *ev = (XNoExposeEvent *) re;
+                   ev->drawable        = event->u.noExposure.drawable;
+                   ev->major_code      = event->u.noExposure.majorEvent;
+                   ev->minor_code      = event->u.noExposure.minorEvent;
+               }
+               break;
+             case VisibilityNotify:
+               {
+                   register XVisibilityEvent *ev = (XVisibilityEvent *) re;
+                   ev->window          = event->u.visibility.window;
+                   ev->state           = event->u.visibility.state;
+               }
+               break;
+             case CreateNotify:
+               {
+                   register XCreateWindowEvent *ev =
+                        (XCreateWindowEvent *) re;
+                   ev->window          = event->u.createNotify.window;
+                   ev->parent          = event->u.createNotify.parent;
+                   ev->x               = cvtINT16toInt(event->u.createNotify.x);
+                   ev->y               = cvtINT16toInt(event->u.createNotify.y);
+                   ev->width           = event->u.createNotify.width;
+                   ev->height          = event->u.createNotify.height;
+                   ev->border_width    = event->u.createNotify.borderWidth;
+                   ev->override_redirect       = event->u.createNotify.override;
+               }
+               break;
+             case DestroyNotify:
+               {
+                   register XDestroyWindowEvent *ev =
+                               (XDestroyWindowEvent *) re;
+                   ev->window          = event->u.destroyNotify.window;
+                   ev->event           = event->u.destroyNotify.event;
+               }
+               break;
+             case UnmapNotify:
+               {
+                   register XUnmapEvent *ev = (XUnmapEvent *) re;
+                   ev->window          = event->u.unmapNotify.window;
+                   ev->event           = event->u.unmapNotify.event;
+                   ev->from_configure  = event->u.unmapNotify.fromConfigure;
+               }
+               break;
+             case MapNotify:
+               {
+                   register XMapEvent *ev = (XMapEvent *) re;
+                   ev->window          = event->u.mapNotify.window;
+                   ev->event           = event->u.mapNotify.event;
+                   ev->override_redirect       = event->u.mapNotify.override;
+               }
+               break;
+             case MapRequest:
+               {
+                   register XMapRequestEvent *ev = (XMapRequestEvent *) re;
+                   ev->window          = event->u.mapRequest.window;
+                   ev->parent          = event->u.mapRequest.parent;
+               }
+               break;
+             case ReparentNotify:
+               {
+                   register XReparentEvent *ev = (XReparentEvent *) re;
+                   ev->event           = event->u.reparent.event;
+                   ev->window          = event->u.reparent.window;
+                   ev->parent          = event->u.reparent.parent;
+                   ev->x               = cvtINT16toInt(event->u.reparent.x);
+                   ev->y               = cvtINT16toInt(event->u.reparent.y);
+                   ev->override_redirect       = event->u.reparent.override;
+               }
+               break;
+             case ConfigureNotify:
+               {
+                   register XConfigureEvent *ev = (XConfigureEvent *) re;
+                   ev->event   = event->u.configureNotify.event;
+                   ev->window  = event->u.configureNotify.window;
+                   ev->above   = event->u.configureNotify.aboveSibling;
+                   ev->x       = cvtINT16toInt(event->u.configureNotify.x);
+                   ev->y       = cvtINT16toInt(event->u.configureNotify.y);
+                   ev->width   = event->u.configureNotify.width;
+                   ev->height  = event->u.configureNotify.height;
+                   ev->border_width  = event->u.configureNotify.borderWidth;
+                   ev->override_redirect = event->u.configureNotify.override;
+               }
+               break;
+             case ConfigureRequest:
+               {
+                   register XConfigureRequestEvent *ev =
+                       (XConfigureRequestEvent *) re;
+                   ev->window          = event->u.configureRequest.window;
+                   ev->parent          = event->u.configureRequest.parent;
+                   ev->above           = event->u.configureRequest.sibling;
+                   ev->x               = cvtINT16toInt(event->u.configureRequest.x);
+                   ev->y               = cvtINT16toInt(event->u.configureRequest.y);
+                   ev->width           = event->u.configureRequest.width;
+                   ev->height          = event->u.configureRequest.height;
+                   ev->border_width    = event->u.configureRequest.borderWidth;
+                   ev->value_mask      = event->u.configureRequest.valueMask;
+                   ev->detail          = event->u.u.detail;
+               }
+               break;
+             case GravityNotify:
+               {
+                   register XGravityEvent *ev = (XGravityEvent *) re;
+                   ev->window          = event->u.gravity.window;
+                   ev->event           = event->u.gravity.event;
+                   ev->x               = cvtINT16toInt(event->u.gravity.x);
+                   ev->y               = cvtINT16toInt(event->u.gravity.y);
+               }
+               break;
+             case ResizeRequest:
+               {
+                   register XResizeRequestEvent *ev =
+                       (XResizeRequestEvent *) re;
+                   ev->window          = event->u.resizeRequest.window;
+                   ev->width           = event->u.resizeRequest.width;
+                   ev->height          = event->u.resizeRequest.height;
+               }
+               break;
+             case CirculateNotify:
+               {
+                   register XCirculateEvent *ev = (XCirculateEvent *) re;
+                   ev->window          = event->u.circulate.window;
+                   ev->event           = event->u.circulate.event;
+                   ev->place           = event->u.circulate.place;
+               }
+               break;
+             case CirculateRequest:
+               {
+                   register XCirculateRequestEvent *ev =
+                       (XCirculateRequestEvent *) re;
+                   ev->window          = event->u.circulate.window;
+                   ev->parent          = event->u.circulate.event;
+                   ev->place           = event->u.circulate.place;
+               }
+               break;
+             case PropertyNotify:
+               {
+                   register XPropertyEvent *ev = (XPropertyEvent *) re;
+                   ev->window          = event->u.property.window;
+                   ev->atom            = event->u.property.atom;
+                   ev->time            = event->u.property.time;
+                   ev->state           = event->u.property.state;
+               }
+               break;
+             case SelectionClear:
+               {
+                   register XSelectionClearEvent *ev =
+                        (XSelectionClearEvent *) re;
+                   ev->window          = event->u.selectionClear.window;
+                   ev->selection       = event->u.selectionClear.atom;
+                   ev->time            = event->u.selectionClear.time;
+               }
+               break;
+             case SelectionRequest:
+               {
+                   register XSelectionRequestEvent *ev =
+                       (XSelectionRequestEvent *) re;
+                   ev->owner           = event->u.selectionRequest.owner;
+                   ev->requestor       = event->u.selectionRequest.requestor;
+                   ev->selection       = event->u.selectionRequest.selection;
+                   ev->target          = event->u.selectionRequest.target;
+                   ev->property        = event->u.selectionRequest.property;
+                   ev->time            = event->u.selectionRequest.time;
+               }
+               break;
+             case SelectionNotify:
+               {
+                   register XSelectionEvent *ev = (XSelectionEvent *) re;
+                   ev->requestor       = event->u.selectionNotify.requestor;
+                   ev->selection       = event->u.selectionNotify.selection;
+                   ev->target          = event->u.selectionNotify.target;
+                   ev->property        = event->u.selectionNotify.property;
+                   ev->time            = event->u.selectionNotify.time;
+               }
+               break;
+             case ColormapNotify:
+               {
+                   register XColormapEvent *ev = (XColormapEvent *) re;
+                   ev->window          = event->u.colormap.window;
+                   ev->colormap        = event->u.colormap.colormap;
+                   ev->new             = event->u.colormap.new;
+                   ev->state           = event->u.colormap.state;
+               }
+               break;
+             case ClientMessage:
+               {
+                  register int i;
+                  register XClientMessageEvent *ev
+                                       = (XClientMessageEvent *) re;
+                  ev->window           = event->u.clientMessage.window;
+                  ev->format           = event->u.u.detail;
+                  switch (ev->format) {
+                       case 8:
+                          ev->message_type = event->u.clientMessage.u.b.type;
+                          for (i = 0; i < 20; i++)
+                            ev->data.b[i] = event->u.clientMessage.u.b.bytes[i];
+                          break;
+                       case 16:
+                          ev->message_type = event->u.clientMessage.u.s.type;
+                          ev->data.s[0] = cvtINT16toShort(event->u.clientMessage.u.s.shorts0);
+                          ev->data.s[1] = cvtINT16toShort(event->u.clientMessage.u.s.shorts1);
+                          ev->data.s[2] = cvtINT16toShort(event->u.clientMessage.u.s.shorts2);
+                          ev->data.s[3] = cvtINT16toShort(event->u.clientMessage.u.s.shorts3);
+                          ev->data.s[4] = cvtINT16toShort(event->u.clientMessage.u.s.shorts4);
+                          ev->data.s[5] = cvtINT16toShort(event->u.clientMessage.u.s.shorts5);
+                          ev->data.s[6] = cvtINT16toShort(event->u.clientMessage.u.s.shorts6);
+                          ev->data.s[7] = cvtINT16toShort(event->u.clientMessage.u.s.shorts7);
+                          ev->data.s[8] = cvtINT16toShort(event->u.clientMessage.u.s.shorts8);
+                          ev->data.s[9] = cvtINT16toShort(event->u.clientMessage.u.s.shorts9);
+                          break;
+                       case 32:
+                          ev->message_type = event->u.clientMessage.u.l.type;
+                          ev->data.l[0] = cvtINT32toLong(event->u.clientMessage.u.l.longs0);
+                          ev->data.l[1] = cvtINT32toLong(event->u.clientMessage.u.l.longs1);
+                          ev->data.l[2] = cvtINT32toLong(event->u.clientMessage.u.l.longs2);
+                          ev->data.l[3] = cvtINT32toLong(event->u.clientMessage.u.l.longs3);
+                          ev->data.l[4] = cvtINT32toLong(event->u.clientMessage.u.l.longs4);
+                          break;
+                       default: /* XXX should never occur */
+                               break;
+                   }
+               }
+               break;
+             case MappingNotify:
+               {
+                  register XMappingEvent *ev = (XMappingEvent *)re;
+                  ev->window           = 0;
+                  ev->first_keycode    = event->u.mappingNotify.firstKeyCode;
+                  ev->request          = event->u.mappingNotify.request;
+                  ev->count            = event->u.mappingNotify.count;
+               }
+               break;
+             default:
+               return(_XUnknownWireEvent(dpy, re, event));
+       }
+       return(True);
+}
+
+
+/*
+ * _XDefaultIOError - Default fatal system error reporting routine.  Called
+ * when an X internal system error is encountered.
+ */
+int _XDefaultIOError(
+       Display *dpy)
+{
+       if (ECHECK(EPIPE)) {
+           (void) fprintf (stderr,
+       "X connection to %s broken (explicit kill or server shutdown).\r\n",
+                           DisplayString (dpy));
+       } else {
+           (void) fprintf (stderr,
+                       "XIO:  fatal IO error %d (%s) on X server \"%s\"\r\n",
+#ifdef WIN32
+                       WSAGetLastError(), strerror(WSAGetLastError()),
+#else
+                       errno, strerror (errno),
+#endif
+                       DisplayString (dpy));
+           (void) fprintf (stderr,
+        "      after %lu requests (%lu known processed) with %d events remaining.\r\n",
+                       NextRequest(dpy) - 1, LastKnownRequestProcessed(dpy),
+                       QLength(dpy));
+
+       }
+       exit(1);
+        return(0); /* dummy - function should never return */
+}
+
+
+static int _XPrintDefaultError(
+    Display *dpy,
+    XErrorEvent *event,
+    FILE *fp)
+{
+    char buffer[BUFSIZ];
+    char mesg[BUFSIZ];
+    char number[32];
+    const char *mtype = "XlibMessage";
+    register _XExtension *ext = (_XExtension *)NULL;
+    _XExtension *bext = (_XExtension *)NULL;
+    XGetErrorText(dpy, event->error_code, buffer, BUFSIZ);
+    XGetErrorDatabaseText(dpy, mtype, "XError", "X Error", mesg, BUFSIZ);
+    (void) fprintf(fp, "%s:  %s\n  ", mesg, buffer);
+    XGetErrorDatabaseText(dpy, mtype, "MajorCode", "Request Major code %d",
+       mesg, BUFSIZ);
+    (void) fprintf(fp, mesg, event->request_code);
+    if (event->request_code < 128) {
+       sprintf(number, "%d", event->request_code);
+       XGetErrorDatabaseText(dpy, "XRequest", number, "", buffer, BUFSIZ);
+    } else {
+       for (ext = dpy->ext_procs;
+            ext && (ext->codes.major_opcode != event->request_code);
+            ext = ext->next)
+         ;
+       if (ext) {
+           strncpy(buffer, ext->name, BUFSIZ);
+           buffer[BUFSIZ - 1] = '\0';
+        } else
+           buffer[0] = '\0';
+    }
+    (void) fprintf(fp, " (%s)\n", buffer);
+    if (event->request_code >= 128) {
+       XGetErrorDatabaseText(dpy, mtype, "MinorCode", "Request Minor code %d",
+                             mesg, BUFSIZ);
+       fputs("  ", fp);
+       (void) fprintf(fp, mesg, event->minor_code);
+       if (ext) {
+           sprintf(mesg, "%s.%d", ext->name, event->minor_code);
+           XGetErrorDatabaseText(dpy, "XRequest", mesg, "", buffer, BUFSIZ);
+           (void) fprintf(fp, " (%s)", buffer);
+       }
+       fputs("\n", fp);
+    }
+    if (event->error_code >= 128) {
+       /* kludge, try to find the extension that caused it */
+       buffer[0] = '\0';
+       for (ext = dpy->ext_procs; ext; ext = ext->next) {
+           if (ext->error_string)
+               (*ext->error_string)(dpy, event->error_code, &ext->codes,
+                                    buffer, BUFSIZ);
+           if (buffer[0]) {
+               bext = ext;
+               break;
+           }
+           if (ext->codes.first_error &&
+               ext->codes.first_error < (int)event->error_code &&
+               (!bext || ext->codes.first_error > bext->codes.first_error))
+               bext = ext;
+       }
+       if (bext)
+           sprintf(buffer, "%s.%d", bext->name,
+                   event->error_code - bext->codes.first_error);
+       else
+           strcpy(buffer, "Value");
+       XGetErrorDatabaseText(dpy, mtype, buffer, "", mesg, BUFSIZ);
+       if (mesg[0]) {
+           fputs("  ", fp);
+           (void) fprintf(fp, mesg, event->resourceid);
+           fputs("\n", fp);
+       }
+       /* let extensions try to print the values */
+       for (ext = dpy->ext_procs; ext; ext = ext->next) {
+           if (ext->error_values)
+               (*ext->error_values)(dpy, event, fp);
+       }
+    } else if ((event->error_code == BadWindow) ||
+              (event->error_code == BadPixmap) ||
+              (event->error_code == BadCursor) ||
+              (event->error_code == BadFont) ||
+              (event->error_code == BadDrawable) ||
+              (event->error_code == BadColor) ||
+              (event->error_code == BadGC) ||
+              (event->error_code == BadIDChoice) ||
+              (event->error_code == BadValue) ||
+              (event->error_code == BadAtom)) {
+       if (event->error_code == BadValue)
+           XGetErrorDatabaseText(dpy, mtype, "Value", "Value 0x%x",
+                                 mesg, BUFSIZ);
+       else if (event->error_code == BadAtom)
+           XGetErrorDatabaseText(dpy, mtype, "AtomID", "AtomID 0x%x",
+                                 mesg, BUFSIZ);
+       else
+           XGetErrorDatabaseText(dpy, mtype, "ResourceID", "ResourceID 0x%x",
+                                 mesg, BUFSIZ);
+       fputs("  ", fp);
+       (void) fprintf(fp, mesg, event->resourceid);
+       fputs("\n", fp);
+    }
+    XGetErrorDatabaseText(dpy, mtype, "ErrorSerial", "Error Serial #%d",
+                         mesg, BUFSIZ);
+    fputs("  ", fp);
+    (void) fprintf(fp, mesg, event->serial);
+    XGetErrorDatabaseText(dpy, mtype, "CurrentSerial", "Current Serial #%d",
+                         mesg, BUFSIZ);
+    fputs("\n  ", fp);
+    (void) fprintf(fp, mesg, dpy->request);
+    fputs("\n", fp);
+    if (event->error_code == BadImplementation) return 0;
+    return 1;
+}
+
+int _XDefaultError(
+       Display *dpy,
+       XErrorEvent *event)
+{
+    if (_XPrintDefaultError (dpy, event, stderr) == 0) return 0;
+    exit(1);
+    /*NOTREACHED*/
+}
+
+/*ARGSUSED*/
+Bool _XDefaultWireError(Display *display, XErrorEvent *he, xError *we)
+{
+    return True;
+}
+
+/*
+ * _XError - upcall internal or user protocol error handler
+ */
+int _XError (
+    Display *dpy,
+    register xError *rep)
+{
+    /*
+     * X_Error packet encountered!  We need to unpack the error before
+     * giving it to the user.
+     */
+    XEvent event; /* make it a large event */
+    register _XAsyncHandler *async, *next;
+
+    event.xerror.serial = _XSetLastRequestRead(dpy, (xGenericReply *)rep);
+
+    for (async = dpy->async_handlers; async; async = next) {
+       next = async->next;
+       if ((*async->handler)(dpy, (xReply *)rep,
+                             (char *)rep, SIZEOF(xError), async->data))
+           return 0;
+    }
+
+    event.xerror.display = dpy;
+    event.xerror.type = X_Error;
+    event.xerror.resourceid = rep->resourceID;
+    event.xerror.error_code = rep->errorCode;
+    event.xerror.request_code = rep->majorCode;
+    event.xerror.minor_code = rep->minorCode;
+    if (dpy->error_vec &&
+       !(*dpy->error_vec[rep->errorCode])(dpy, &event.xerror, rep))
+       return 0;
+    if (_XErrorFunction != NULL) {
+       int rtn_val;
+#ifdef XTHREADS
+       if (dpy->lock)
+           (*dpy->lock->user_lock_display)(dpy);
+       UnlockDisplay(dpy);
+#endif
+       rtn_val = (*_XErrorFunction)(dpy, (XErrorEvent *)&event); /* upcall */
+#ifdef XTHREADS
+       LockDisplay(dpy);
+       if (dpy->lock)
+           (*dpy->lock->user_unlock_display)(dpy);
+#endif
+       return rtn_val;
+    } else {
+       return _XDefaultError(dpy, (XErrorEvent *)&event);
+    }
+}
+
+/*
+ * _XIOError - call user connection error handler and exit
+ */
+int
+_XIOError (
+    Display *dpy)
+{
+    dpy->flags |= XlibDisplayIOError;
+#ifdef WIN32
+    errno = WSAGetLastError();
+#endif
+
+    /* This assumes that the thread calling exit will call any atexit handlers.
+     * If this does not hold, then an alternate solution would involve
+     * registering an atexit handler to take over the lock, which would only
+     * assume that the same thread calls all the atexit handlers. */
+#ifdef XTHREADS
+    if (dpy->lock)
+       (*dpy->lock->user_lock_display)(dpy);
+#endif
+    UnlockDisplay(dpy);
+
+    if (_XIOErrorFunction != NULL)
+       (*_XIOErrorFunction)(dpy);
+    else
+       _XDefaultIOError(dpy);
+    exit (1);
+    return 0;
+}
+
+
+/*
+ * This routine can be used to (cheaply) get some memory within a single
+ * Xlib routine for scratch space.  A single buffer is reused each time
+ * if possible.  To be MT safe, you can only call this between a call to
+ * GetReq* and a call to Data* or _XSend*, or in a context when the thread
+ * is guaranteed to not unlock the display.
+ */
+char *_XAllocScratch(
+       register Display *dpy,
+       unsigned long nbytes)
+{
+       if (nbytes > dpy->scratch_length) {
+           if (dpy->scratch_buffer) Xfree (dpy->scratch_buffer);
+           if ((dpy->scratch_buffer = Xmalloc((unsigned) nbytes)))
+               dpy->scratch_length = nbytes;
+           else dpy->scratch_length = 0;
+       }
+       return (dpy->scratch_buffer);
+}
+
+/*
+ * Scratch space allocator you can call any time, multiple times, and be
+ * MT safe, but you must hand the buffer back with _XFreeTemp.
+ */
+char *_XAllocTemp(
+    register Display *dpy,
+    unsigned long nbytes)
+{
+    char *buf;
+
+    buf = _XAllocScratch(dpy, nbytes);
+    dpy->scratch_buffer = NULL;
+    dpy->scratch_length = 0;
+    return buf;
+}
+
+void _XFreeTemp(
+    register Display *dpy,
+    char *buf,
+    unsigned long nbytes)
+{
+    if (dpy->scratch_buffer)
+       Xfree(dpy->scratch_buffer);
+    dpy->scratch_buffer = buf;
+    dpy->scratch_length = nbytes;
+}
+
+/*
+ * Given a visual id, find the visual structure for this id on this display.
+ */
+Visual *_XVIDtoVisual(
+       Display *dpy,
+       VisualID id)
+{
+       register int i, j, k;
+       register Screen *sp;
+       register Depth *dp;
+       register Visual *vp;
+       for (i = 0; i < dpy->nscreens; i++) {
+               sp = &dpy->screens[i];
+               for (j = 0; j < sp->ndepths; j++) {
+                       dp = &sp->depths[j];
+                       /* if nvisuals == 0 then visuals will be NULL */
+                       for (k = 0; k < dp->nvisuals; k++) {
+                               vp = &dp->visuals[k];
+                               if (vp->visualid == id) return (vp);
+                       }
+               }
+       }
+       return (NULL);
+}
+
+int
+XFree (void *data)
+{
+       Xfree (data);
+       return 1;
+}
+
+#ifdef _XNEEDBCOPYFUNC
+void _Xbcopy(b1, b2, length)
+    register char *b1, *b2;
+    register length;
+{
+    if (b1 < b2) {
+       b2 += length;
+       b1 += length;
+       while (length--)
+           *--b2 = *--b1;
+    } else {
+       while (length--)
+           *b2++ = *b1++;
+    }
+}
+#endif
+
+#ifdef DataRoutineIsProcedure
+void Data(
+       Display *dpy,
+       char *data,
+       long len)
+{
+       if (dpy->bufptr + (len) <= dpy->bufmax) {
+               memcpy(dpy->bufptr, data, (int)len);
+               dpy->bufptr += ((len) + 3) & ~3;
+       } else {
+               _XSend(dpy, data, len);
+       }
+}
+#endif /* DataRoutineIsProcedure */
+
+
+#ifdef LONG64
+int
+_XData32(
+    Display *dpy,
+    register long *data,
+    unsigned len)
+{
+    register int *buf;
+    register long i;
+
+    while (len) {
+       buf = (int *)dpy->bufptr;
+       i = dpy->bufmax - (char *)buf;
+       if (!i) {
+           _XFlush(dpy);
+           continue;
+       }
+       if (len < i)
+           i = len;
+       dpy->bufptr = (char *)buf + i;
+       len -= i;
+       i >>= 2;
+       while (--i >= 0)
+           *buf++ = *data++;
+    }
+    return 0;
+}
+#endif /* LONG64 */
+
+#ifdef WORD64
+
+/*
+ * XXX This is a *really* stupid way of doing this.  It should just use
+ * dpy->bufptr directly, taking into account where in the word it is.
+ */
+
+/*
+ * Data16 - Place 16 bit data in the buffer.
+ *
+ * "dpy" is a pointer to a Display.
+ * "data" is a pointer to the data.
+ * "len" is the length in bytes of the data.
+ */
+
+static doData16(
+    register Display *dpy,
+    short *data,
+    unsigned len,
+    char *packbuffer)
+{
+    long *lp,*lpack;
+    long i, nwords,bits;
+    long mask16 = 0x000000000000ffff;
+
+        lp = (long *)data;
+        lpack = (long *)packbuffer;
+
+/*  nwords is the number of 16 bit values to be packed,
+ *  the low order 16 bits of each word will be packed
+ *  into 64 bit words
+ */
+        nwords = len >> 1;
+        bits = 48;
+
+        for(i=0;i<nwords;i++){
+          if (bits == 48) *lpack = 0;
+           *lpack ^= (*lp & mask16) << bits;
+           bits -= 16 ;
+           lp++;
+           if(bits < 0){
+               lpack++;
+               bits = 48;
+           }
+        }
+        Data(dpy, packbuffer, len);
+}
+
+_XData16 (
+    Display *dpy,
+    short *data,
+    unsigned len)
+{
+    char packbuffer[PACKBUFFERSIZE];
+    unsigned nunits = PACKBUFFERSIZE >> 1;
+
+    for (; len > PACKBUFFERSIZE; len -= PACKBUFFERSIZE, data += nunits) {
+       doData16 (dpy, data, PACKBUFFERSIZE, packbuffer);
+    }
+    if (len) doData16 (dpy, data, len, packbuffer);
+}
+
+/*
+ * Data32 - Place 32 bit data in the buffer.
+ *
+ * "dpy" is a pointer to a Display.
+ * "data" is a pointer to the data.
+ * "len" is the length in bytes of the data.
+ */
+
+static doData32(
+    register Display *dpy
+    long *data,
+    unsigned len,
+    char *packbuffer)
+{
+    long *lp,*lpack;
+    long i,bits,nwords;
+    long mask32 = 0x00000000ffffffff;
+
+        lpack = (long *) packbuffer;
+        lp = data;
+
+/*  nwords is the number of 32 bit values to be packed
+ *  the low order 32 bits of each word will be packed
+ *  into 64 bit words
+ */
+        nwords = len >> 2;
+        bits = 32;
+
+        for(i=0;i<nwords;i++){
+          if (bits == 32) *lpack = 0;
+           *lpack ^= (*lp & mask32) << bits;
+           bits = bits ^32;
+           lp++;
+           if(bits)
+              lpack++;
+        }
+        Data(dpy, packbuffer, len);
+}
+
+void _XData32(
+    Display *dpy,
+    long *data,
+    unsigned len)
+{
+    char packbuffer[PACKBUFFERSIZE];
+    unsigned nunits = PACKBUFFERSIZE >> 2;
+
+    for (; len > PACKBUFFERSIZE; len -= PACKBUFFERSIZE, data += nunits) {
+       doData32 (dpy, data, PACKBUFFERSIZE, packbuffer);
+    }
+    if (len) doData32 (dpy, data, len, packbuffer);
+}
+
+#endif /* WORD64 */
+
+
+/* Make sure this produces the same string as DefineLocal/DefineSelf in xdm.
+ * Otherwise, Xau will not be able to find your cookies in the Xauthority file.
+ *
+ * Note: POSIX says that the ``nodename'' member of utsname does _not_ have
+ *       to have sufficient information for interfacing to the network,
+ *       and so, you may be better off using gethostname (if it exists).
+ */
+
+#if (defined(_POSIX_SOURCE) && !defined(AIXV3) && !defined(__QNX__)) || defined(hpux) || defined(SVR4)
+#define NEED_UTSNAME
+#include <sys/utsname.h>
+#else
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#endif
+
+/*
+ * _XGetHostname - similar to gethostname but allows special processing.
+ */
+int _XGetHostname (
+    char *buf,
+    int maxlen)
+{
+    int len;
+
+#ifdef NEED_UTSNAME
+    struct utsname name;
+
+    if (maxlen <= 0 || buf == NULL)
+       return 0;
+
+    uname (&name);
+    len = strlen (name.nodename);
+    if (len >= maxlen) len = maxlen - 1;
+    strncpy (buf, name.nodename, len);
+    buf[len] = '\0';
+#else
+    if (maxlen <= 0 || buf == NULL)
+       return 0;
+
+    buf[0] = '\0';
+    (void) gethostname (buf, maxlen);
+    buf [maxlen - 1] = '\0';
+    len = strlen(buf);
+#endif /* NEED_UTSNAME */
+    return len;
+}
+
+
+/*
+ * _XScreenOfWindow - get the Screen of a given window
+ */
+
+Screen *_XScreenOfWindow(Display *dpy, Window w)
+{
+    register int i;
+    Window root;
+    int x, y;                          /* dummy variables */
+    unsigned int width, height, bw, depth;  /* dummy variables */
+
+    if (XGetGeometry (dpy, w, &root, &x, &y, &width, &height,
+                     &bw, &depth) == False) {
+       return NULL;
+    }
+    for (i = 0; i < ScreenCount (dpy); i++) {  /* find root from list */
+       if (root == RootWindow (dpy, i)) {
+           return ScreenOfDisplay (dpy, i);
+       }
+    }
+    return NULL;
+}
+
+
+/*
+ * WARNING: This implementation's pre-conditions and post-conditions
+ * must remain compatible with the old macro-based implementations of
+ * GetReq, GetReqExtra, GetResReq, and GetEmptyReq. The portions of the
+ * Display structure affected by those macros are part of libX11's
+ * ABI.
+ */
+void *_XGetRequest(Display *dpy, CARD8 type, size_t len)
+{
+    xReq *req;
+
+    WORD64ALIGN
+
+    if (dpy->bufptr + len > dpy->bufmax)
+       _XFlush(dpy);
+
+    if (len % 4)
+       fprintf(stderr,
+               "Xlib: request %d length %zd not a multiple of 4.\n",
+               type, len);
+
+    dpy->last_req = dpy->bufptr;
+
+    req = (xReq*)dpy->bufptr;
+    req->reqType = type;
+    req->length = len / 4;
+    dpy->bufptr += len;
+    dpy->request++;
+    return req;
+}
+
+#if defined(WIN32)
+
+/*
+ * These functions are intended to be used internally to Xlib only.
+ * These functions will always prefix the path with a DOS drive in the
+ * form "<drive-letter>:". As such, these functions are only suitable
+ * for use by Xlib function that supply a root-based path to some
+ * particular file, e.g. <ProjectRoot>/lib/X11/locale/locale.dir will
+ * be converted to "C:/usr/X11R6.3/lib/X11/locale/locale.dir".
+ */
+
+static int access_file (path, pathbuf, len_pathbuf, pathret)
+    char* path;
+    char* pathbuf;
+    int len_pathbuf;
+    char** pathret;
+{
+    if (access (path, F_OK) == 0) {
+       if (strlen (path) < len_pathbuf)
+           *pathret = pathbuf;
+       else
+           *pathret = Xmalloc (strlen (path) + 1);
+       if (*pathret) {
+           strcpy (*pathret, path);
+           return 1;
+       }
+    }
+    return 0;
+}
+
+static int AccessFile (path, pathbuf, len_pathbuf, pathret)
+    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;
+
+    /* 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);
+    if (len < MAX_PATH) bufp = buf;
+    else bufp = Xmalloc (len + 1);
+    strcpy (bufp, drive);
+    strcat (bufp, path);
+    if (access_file (bufp, pathbuf, len_pathbuf, pathret)) {
+       if (bufp != buf) Xfree (bufp);
+       return 1;
+    }
+
+#ifndef __UNIXOS2__
+    /* one last place to look */
+    drive = getenv ("HOMEDRIVE");
+    if (drive) {
+       len = strlen (drive) + strlen (path);
+       if (len < MAX_PATH) bufp = buf;
+       else bufp = Xmalloc (len + 1);
+       strcpy (bufp, drive);
+       strcat (bufp, path);
+       if (access_file (bufp, pathbuf, len_pathbuf, pathret)) {
+           if (bufp != buf) Xfree (bufp);
+           return 1;
+       }
+    }
+
+    /* tried everywhere else, go fishing */
+#define C_DRIVE ('C' - 'A')
+#define Z_DRIVE ('Z' - 'A')
+    /* does OS/2 (with or with gcc-emx) have getdrives? */
+    drives = _getdrives ();
+    for (i = C_DRIVE; i <= Z_DRIVE; i++) { /* don't check on A: or B: */
+       if ((1 << i) & drives) {
+           len = 2 + strlen (path);
+           if (len < MAX_PATH) bufp = buf;
+           else bufp = Xmalloc (len + 1);
+           *bufp = 'A' + i;
+           *(bufp + 1) = ':';
+           *(bufp + 2) = '\0';
+           strcat (bufp, path);
+           if (access_file (bufp, pathbuf, len_pathbuf, pathret)) {
+               if (bufp != buf) Xfree (bufp);
+               return 1;
+           }
+       }
+    }
+#endif
+    return 0;
+}
+
+int _XOpenFile(path, flags)
+    _Xconst char* path;
+    int flags;
+{
+    char buf[MAX_PATH];
+    char* bufp = NULL;
+    int ret = -1;
+    UINT olderror = SetErrorMode (SEM_FAILCRITICALERRORS);
+
+    if (AccessFile (path, buf, MAX_PATH, &bufp))
+       ret = open (bufp, flags);
+
+    (void) SetErrorMode (olderror);
+
+    if (bufp != buf) Xfree (bufp);
+
+    return ret;
+}
+
+int _XOpenFileMode(path, flags, mode)
+    _Xconst char* path;
+    int flags;
+    mode_t mode;
+{
+    char buf[MAX_PATH];
+    char* bufp = NULL;
+    int ret = -1;
+    UINT olderror = SetErrorMode (SEM_FAILCRITICALERRORS);
+
+    if (AccessFile (path, buf, MAX_PATH, &bufp))
+       ret = open (bufp, flags, mode);
+
+    (void) SetErrorMode (olderror);
+
+    if (bufp != buf) Xfree (bufp);
+
+    return ret;
+}
+
+void* _XFopenFile(path, mode)
+    _Xconst char* path;
+    _Xconst char* mode;
+{
+    char buf[MAX_PATH];
+    char* bufp = NULL;
+    void* ret = NULL;
+    UINT olderror = SetErrorMode (SEM_FAILCRITICALERRORS);
+
+    if (AccessFile (path, buf, MAX_PATH, &bufp))
+       ret = fopen (bufp, mode);
+
+    (void) SetErrorMode (olderror);
+
+    if (bufp != buf) Xfree (bufp);
+
+    return ret;
+}
+
+int _XAccessFile(path)
+    _Xconst char* path;
+{
+    char buf[MAX_PATH];
+    char* bufp;
+    int ret = -1;
+    UINT olderror = SetErrorMode (SEM_FAILCRITICALERRORS);
+
+    ret = AccessFile (path, buf, MAX_PATH, &bufp);
+
+    (void) SetErrorMode (olderror);
+
+    if (bufp != buf) Xfree (bufp);
+
+    return ret;
+}
+
+#endif
+
+#ifdef WIN32
+#undef _Xdebug
+int _Xdebug = 0;
+int *_Xdebug_p = &_Xdebug;
+void (**_XCreateMutex_fn_p)(LockInfoPtr) = &_XCreateMutex_fn;
+void (**_XFreeMutex_fn_p)(LockInfoPtr) = &_XFreeMutex_fn;
+void (**_XLockMutex_fn_p)(LockInfoPtr
+#if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE)
+    , char * /* file */
+    , int /* line */
+#endif
+        ) = &_XLockMutex_fn;
+void (**_XUnlockMutex_fn_p)(LockInfoPtr
+#if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE)
+    , char * /* file */
+    , int /* line */
+#endif
+        ) = &_XUnlockMutex_fn;
+LockInfoPtr *_Xglobal_lock_p = &_Xglobal_lock;
+#endif
diff --git a/src/XomGeneric.h b/src/XomGeneric.h
new file mode 100644 (file)
index 0000000..d6f182d
--- /dev/null
@@ -0,0 +1,316 @@
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * 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 TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA 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.
+ *
+ * Author: Katsuhisa Yano      TOSHIBA Corp.
+ *                             mopi@osa.ilab.toshiba.co.jp
+ */
+/*
+ * Copyright 1995 by FUJITSU LIMITED
+ * This is source code modified by FUJITSU LIMITED under the Joint
+ * Development Agreement for the CDE/Motif PST.
+ *
+ * Modifier: Takanori Tateno   FUJITSU LIMITED
+ *
+ */
+
+#ifndef _XOMGENERIC_H_
+#define _XOMGENERIC_H_
+
+#include "XlcPublic.h"
+
+#define XOM_GENERIC(om)                (&((XOMGeneric) om)->gen)
+#define XOC_GENERIC(font_set)  (&((XOCGeneric) font_set)->gen)
+
+/* For VW/UDC */
+typedef struct _CodeRangeRec {
+    unsigned long       start;
+    unsigned long       end;
+    unsigned long       dmy1;
+    unsigned long       dmy2;
+} CodeRangeRec, *CodeRange;
+
+typedef struct _VRotateRec {
+    char        *charset_name;  /* Charset name                         */
+    XlcSide     side;           /* Encoding side                        */
+    int         num_cr;
+    CodeRange   code_range;
+    char        *xlfd_name;
+    XFontStruct *font;
+} VRotateRec, *VRotate;
+
+typedef enum {
+    XOMMultiByte,
+    XOMWideChar,
+    XOMUtf8String
+} XOMTextType;
+
+typedef struct _FontDataRec {
+    char       *name;
+    XlcSide    side;
+    /* For VW/UDC */
+    int        scopes_num;
+    FontScope  scopes;
+    char       *xlfd_name;
+    XFontStruct *font;
+} FontDataRec, *FontData;
+
+#define VROTATE_NONE   0
+#define VROTATE_PART   1
+#define VROTATE_ALL    2
+
+typedef struct _OMDataRec {
+    int        charset_count;
+    XlcCharSet         *charset_list;
+    int        font_data_count;
+    FontData   font_data;
+    /* For VW/UDC */
+    int substitute_num;
+    FontData substitute;
+    /* Vertical Writing */
+    int         vmap_num;
+    FontData    vmap;
+    int                vrotate_type;
+    int         vrotate_num;
+    CodeRange   vrotate;
+} OMDataRec, *OMData;
+
+typedef struct _XOMGenericPart {
+    int        data_num;
+    OMData     data;
+    Bool       on_demand_loading;
+    char       *object_name;
+} XOMGenericPart;
+
+typedef struct _XOMGenericRec {
+    XOMMethods                 methods;
+    XOMCoreRec                 core;
+    XOMGenericPart     gen;
+} XOMGenericRec, *XOMGeneric;
+
+/*
+ * XOC dependent data
+ */
+
+typedef struct _FontSetRec {
+    int                id;
+    int                charset_count;
+    XlcCharSet                 *charset_list;
+    int                font_data_count;
+    FontData           font_data;
+    char               *font_name;
+    XFontStruct        *info;
+    XFontStruct        *font;
+    XlcSide            side;
+    Bool               is_xchar2b;
+    /* For VW/UDC */
+    int                substitute_num;
+    FontData           substitute;
+    /* Vertical Writing */
+    int                vpart_initialize;
+    int         vmap_num;
+    FontData    vmap;
+    int         vrotate_num;
+    VRotate     vrotate;
+} FontSetRec, *FontSet;
+
+typedef struct _XOCGenericPart {
+    XlcConv            mbs_to_cs;
+    XlcConv            wcs_to_cs;
+    XlcConv            utf8_to_cs;
+    int                font_set_num;
+    FontSet            font_set;
+} XOCGenericPart;
+
+typedef struct _XOCGenericRec {
+    XOCMethods                 methods;
+    XOCCoreRec                 core;
+    XOCGenericPart     gen;
+} XOCGenericRec, *XOCGeneric;
+
+_XFUNCPROTOBEGIN
+
+extern XOM _XomGenericOpenOM(
+    XLCd               /* lcd */,
+    Display*           /* dpy */,
+    XrmDatabase                /* rdb */,
+    _Xconst char*      /* res_name */,
+    _Xconst char*      /* res_class */
+);
+
+extern XlcConv _XomInitConverter(
+    XOC                        /* oc */,
+    XOMTextType                /* type */
+);
+
+extern int _XomConvert(
+    XOC                        /* oc */,
+    XlcConv            /* conv */,
+    XPointer*          /* from */,
+    int*               /* from_left */,
+    XPointer*          /* to */,
+    int*               /* to_left */,
+    XPointer*          /* args */,
+    int                        /* num_args */
+);
+
+extern int
+_XmbDefaultTextEscapement(XOC oc, _Xconst char *text, int length);
+extern int
+_XwcDefaultTextEscapement(XOC oc, _Xconst wchar_t *text, int length);
+extern int
+_Xutf8DefaultTextEscapement(XOC oc, _Xconst char *text, int length);
+extern int
+_XmbDefaultTextExtents(XOC oc, _Xconst char *text, int length,
+    XRectangle *overall_ink, XRectangle *overall_logical);
+extern int
+_XwcDefaultTextExtents(XOC oc, _Xconst wchar_t *text, int length,
+    XRectangle *overall_ink, XRectangle *overall_logical);
+extern int
+_Xutf8DefaultTextExtents(XOC oc, _Xconst char *text, int length,
+    XRectangle *overall_ink, XRectangle *overall_logical);
+extern Status
+_XmbDefaultTextPerCharExtents(
+    XOC oc, _Xconst char *text, int length,
+    XRectangle *ink_buf, XRectangle *logical_buf,
+    int buf_size, int *num_chars,
+    XRectangle *overall_ink,
+    XRectangle *overall_logical);
+extern Status
+_XwcDefaultTextPerCharExtents(
+    XOC oc, _Xconst wchar_t *text, int length,
+    XRectangle *ink_buf, XRectangle *logical_buf,
+    int buf_size, int *num_chars,
+    XRectangle *overall_ink,
+    XRectangle *overall_logical);
+extern Status
+_Xutf8DefaultTextPerCharExtents(
+    XOC oc, _Xconst char *text, int length,
+    XRectangle *ink_buf, XRectangle *logical_buf,
+    int buf_size, int *num_chars,
+    XRectangle *overall_ink,
+    XRectangle *overall_logical);
+extern int
+_XmbDefaultDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
+    _Xconst char *text, int length);
+extern int
+_XwcDefaultDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
+    _Xconst wchar_t *text, int length);
+extern int
+_Xutf8DefaultDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
+    _Xconst char *text, int length);
+extern void
+_XmbDefaultDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
+    int y, _Xconst char *text, int length);
+extern void
+_XwcDefaultDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
+    int y, _Xconst wchar_t *text, int length);
+extern void
+_Xutf8DefaultDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
+    int y, _Xconst char *text, int length);
+
+extern int
+_XmbGenericTextEscapement(XOC oc, _Xconst char *text, int length);
+extern int
+_XmbGenericTextExtents(XOC oc, _Xconst char *text, int length,
+    XRectangle *overall_ink, XRectangle *overall_logical);
+extern int
+_Xutf8GenericDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
+    _Xconst char *text, int length);
+extern void
+_Xutf8GenericDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
+    int y, _Xconst char *text, int length);
+extern Status
+_Xutf8GenericTextPerCharExtents(
+    XOC oc, _Xconst char *text, int length,
+    XRectangle *ink_buf, XRectangle *logical_buf,
+    int buf_size, int *num_chars,
+    XRectangle *overall_ink,
+    XRectangle *overall_logical);
+extern int
+_Xutf8GenericTextExtents(XOC oc, _Xconst char *text, int length,
+    XRectangle *overall_ink, XRectangle *overall_logical);
+extern int
+_Xutf8GenericTextEscapement(XOC oc, _Xconst char *text, int length);
+extern void
+_XwcGenericDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
+    int y, _Xconst wchar_t *text, int length);
+extern int
+_XwcGenericDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
+    _Xconst wchar_t *text, int length);
+extern Status
+_XwcGenericTextPerCharExtents(XOC oc, _Xconst wchar_t *text, int length,
+    XRectangle *ink_buf, XRectangle *logical_buf,
+    int buf_size, int *num_chars,
+    XRectangle *overall_ink,
+    XRectangle *overall_logical);
+extern int
+_XwcGenericTextExtents(XOC oc, _Xconst wchar_t *text, int length,
+    XRectangle *overall_ink, XRectangle *overall_logical);
+extern int
+_XwcGenericTextEscapement(XOC oc, _Xconst wchar_t *text, int length);
+extern void
+_XmbGenericDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
+    int y, _Xconst char *text, int length);
+extern int
+_XmbGenericDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
+    _Xconst char *text, int length);
+extern Status
+_XmbGenericTextPerCharExtents(XOC oc, _Xconst char *text, int length,
+    XRectangle *ink_buf, XRectangle *logical_buf,
+    int buf_size, int *num_chars,
+    XRectangle *overall_ink,
+    XRectangle *overall_logical);
+
+extern FontData
+read_EncodingInfo(
+    int count,
+    char **value);
+
+extern int
+_XomGenericDrawString(
+    Display *dpy,
+    Drawable d,
+    XOC oc,
+    GC gc,
+    int x, int y,
+    XOMTextType type,
+    XPointer text,
+    int length);
+extern int
+_XomGenericTextExtents(
+    XOC oc,
+    XOMTextType type,
+    XPointer text,
+    int length,
+    XRectangle *overall_ink,
+    XRectangle *overall_logical);
+extern FontData
+_XomGetFontDataFromFontSet(
+    FontSet fs,
+    unsigned char *str,
+    int len,
+    int *len_ret,
+    int is2b,
+    int type);
+
+_XFUNCPROTOEND
+
+#endif  /* _XOMGENERIC_H_ */
diff --git a/src/Xprivate.h b/src/Xprivate.h
new file mode 100644 (file)
index 0000000..006b170
--- /dev/null
@@ -0,0 +1,28 @@
+/* Copyright (C) 2008 Jamey Sharp, Josh Triplett
+ * This file is licensed under the MIT license. See the file COPYING.
+ *
+ * As Xlibint.h has long become effectively public API, this header exists
+ * for new private functions that nothing outside of libX11 should call.
+ */
+
+#ifndef XPRIVATE_H
+#define XPRIVATE_H
+
+extern _X_HIDDEN void _XIDHandler(Display *dpy);
+extern _X_HIDDEN void _XSeqSyncFunction(Display *dpy);
+extern _X_HIDDEN void _XSetPrivSyncFunction(Display *dpy);
+extern _X_HIDDEN void _XSetSeqSyncFunction(Display *dpy);
+
+#ifdef XTHREADS
+#if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE)
+#define InternalLockDisplay(d,wskip) if ((d)->lock) \
+    (*(d)->lock->internal_lock_display)(d,wskip,__FILE__,__LINE__)
+#else
+#define InternalLockDisplay(d,wskip) if ((d)->lock) \
+    (*(d)->lock->internal_lock_display)(d,wskip)
+#endif
+#else /* XTHREADS else */
+#define InternalLockDisplay(d,wskip)
+#endif /* XTHREADS else */
+
+#endif /* XPRIVATE_H */
diff --git a/src/Xresinternal.h b/src/Xresinternal.h
new file mode 100644 (file)
index 0000000..c2f355f
--- /dev/null
@@ -0,0 +1,16 @@
+
+#ifndef _XRESINTERNAL_H_
+#define _XRESINTERNAL_H_
+
+#include <inttypes.h>
+
+/* type defines */
+typedef uint32_t Signature;
+
+/* prototypes */
+extern XrmQuark _XrmInternalStringToQuark(
+    register _Xconst char *name, register int len, register Signature sig,
+    Bool permstring);
+
+#endif /* _XRESOURCEINTERNAL_H_ */
+/* DON'T ADD STUFF AFTER THIS #endif */
diff --git a/src/Xrm.c b/src/Xrm.c
new file mode 100644 (file)
index 0000000..d6899d9
--- /dev/null
+++ b/src/Xrm.c
@@ -0,0 +1,2660 @@
+
+/***********************************************************
+Copyright 1987, 1988, 1990 by Digital Equipment Corporation, Maynard
+
+                        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, 1990, 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       <stdio.h>
+#include       <ctype.h>
+#include       "Xlibint.h"
+#include       <X11/Xresource.h>
+#include       "Xlcint.h"
+#ifdef XTHREADS
+#include       "locking.h"
+#endif
+#include       <X11/Xos.h>
+#include       <sys/stat.h>
+#include "Xresinternal.h"
+#include "Xresource.h"
+
+/*
+
+These Xrm routines allow very fast lookup of resources in the resource
+database.  Several usage patterns are exploited:
+
+(1) Widgets get a lot of resources at one time.  Rather than look up each from
+scratch, we can precompute the prioritized list of database levels once, then
+search for each resource starting at the beginning of the list.
+
+(2) Many database levels don't contain any leaf resource nodes.  There is no
+point in looking for resources on a level that doesn't contain any.  This
+information is kept on a per-level basis.
+
+(3) Sometimes the widget instance tree is structured such that you get the same
+class name repeated on the fully qualified widget name.  This can result in the
+same database level occuring multiple times on the search list.  The code below
+only checks to see if you get two identical search lists in a row, rather than
+look back through all database levels, but in practice this removes all
+duplicates I've ever observed.
+
+Joel McCormack
+
+*/
+
+/*
+
+The Xrm representation has been completely redesigned to substantially reduce
+memory and hopefully improve performance.
+
+The database is structured into two kinds of tables: LTables that contain
+only values, and NTables that contain only other tables.
+
+Some invariants:
+
+The next pointer of the top-level node table points to the top-level leaf
+table, if any.
+
+Within an LTable, for a given name, the tight value always precedes the
+loose value, and if both are present the loose value is always right after
+the tight value.
+
+Within an NTable, all of the entries for a given name are contiguous,
+in the order tight NTable, loose NTable, tight LTable, loose LTable.
+
+Bob Scheifler
+
+*/
+
+static XrmQuark XrmQString, XrmQANY;
+
+typedef        Bool (*DBEnumProc)(
+    XrmDatabase*       /* db */,
+    XrmBindingList     /* bindings */,
+    XrmQuarkList       /* quarks */,
+    XrmRepresentation* /* type */,
+    XrmValue*          /* value */,
+    XPointer           /* closure */
+);
+
+typedef struct _VEntry {
+    struct _VEntry     *next;          /* next in chain */
+    XrmQuark           name;           /* name of this entry */
+    unsigned int       tight:1;        /* 1 if it is a tight binding */
+    unsigned int       string:1;       /* 1 if type is String */
+    unsigned int       size:30;        /* size of value */
+} VEntryRec, *VEntry;
+
+
+typedef struct _DEntry {
+    VEntryRec          entry;          /* entry */
+    XrmRepresentation  type;           /* representation type */
+} DEntryRec, *DEntry;
+
+/* the value is right after the structure */
+#define StringValue(ve) (XPointer)((ve) + 1)
+#define RepType(ve) ((DEntry)(ve))->type
+/* the value is right after the structure */
+#define DataValue(ve) (XPointer)(((DEntry)(ve)) + 1)
+#define RawValue(ve) (char *)((ve)->string ? StringValue(ve) : DataValue(ve))
+
+typedef struct _NTable {
+    struct _NTable     *next;          /* next in chain */
+    XrmQuark           name;           /* name of this entry */
+    unsigned int       tight:1;        /* 1 if it is a tight binding */
+    unsigned int       leaf:1;         /* 1 if children are values */
+    unsigned int       hasloose:1;     /* 1 if has loose children */
+    unsigned int       hasany:1;       /* 1 if has ANY entry */
+    unsigned int       pad:4;          /* unused */
+    unsigned int       mask:8;         /* hash size - 1 */
+    unsigned int       entries:16;     /* number of children */
+} NTableRec, *NTable;
+
+/* the buckets are right after the structure */
+#define NodeBuckets(ne) ((NTable *)((ne) + 1))
+#define NodeHash(ne,q) NodeBuckets(ne)[(q) & (ne)->mask]
+
+/* leaf tables have an extra level of indirection for the buckets,
+ * so that resizing can be done without invalidating a search list.
+ * This is completely ugly, and wastes some memory, but the Xlib
+ * spec doesn't really specify whether invalidation is OK, and the
+ * old implementation did not invalidate.
+ */
+typedef struct _LTable {
+    NTableRec          table;
+    VEntry             *buckets;
+} LTableRec, *LTable;
+
+#define LeafHash(le,q) (le)->buckets[(q) & (le)->table.mask]
+
+/* An XrmDatabase just holds a pointer to the first top-level table.
+ * The type name is no longer descriptive, but better to not change
+ * the Xresource.h header file.  This type also gets used to define
+ * XrmSearchList, which is a complete crock, but we'll just leave it
+ * and caste types as required.
+ */
+typedef struct _XrmHashBucketRec {
+    NTable table;
+    XPointer mbstate;
+    XrmMethods methods;
+#ifdef XTHREADS
+    LockInfoRec linfo;
+#endif
+} XrmHashBucketRec;
+
+/* closure used in get/put resource */
+typedef struct _VClosure {
+    XrmRepresentation  *type;          /* type of value */
+    XrmValuePtr                value;          /* value itself */
+} VClosureRec, *VClosure;
+
+/* closure used in get search list */
+typedef struct _SClosure {
+    LTable             *list;          /* search list */
+    int                        idx;            /* index of last filled element */
+    int                        limit;          /* maximum index */
+} SClosureRec, *SClosure;
+
+/* placed in XrmSearchList to indicate next table is loose only */
+#define LOOSESEARCH ((LTable)1)
+
+/* closure used in enumerate database */
+typedef struct _EClosure {
+    XrmDatabase db;                    /* the database */
+    DBEnumProc proc;                   /* the user proc */
+    XPointer closure;                  /* the user closure */
+    XrmBindingList bindings;           /* binding list */
+    XrmQuarkList quarks;               /* quark list */
+    int mode;                          /* XrmEnum<kind> */
+} EClosureRec, *EClosure;
+
+/* types for typecasting ETable based functions to NTable based functions */
+typedef Bool (*getNTableSProcp)(
+    NTable              table,
+    XrmNameList         names,
+    XrmClassList        classes,
+    SClosure            closure);
+typedef Bool (*getNTableVProcp)(
+    NTable              table,
+    XrmNameList         names,
+    XrmClassList        classes,
+    VClosure            closure);
+typedef Bool (*getNTableEProcp)(
+    NTable              table,
+    XrmNameList         names,
+    XrmClassList        classes,
+    register int        level,
+    EClosure            closure);
+
+/* predicate to determine when to resize a hash table */
+#define GrowthPred(n,m) ((unsigned)(n) > (((m) + 1) << 2))
+
+#define GROW(prev) \
+    if (GrowthPred((*prev)->entries, (*prev)->mask)) \
+       GrowTable(prev)
+
+/* pick a reasonable value for maximum depth of resource database */
+#define MAXDBDEPTH 100
+
+/* macro used in get/search functions */
+
+/* find an entry named ename, with leafness given by leaf */
+#define NFIND(ename) \
+    q = ename; \
+    entry = NodeHash(table, q); \
+    while (entry && entry->name != q) \
+       entry = entry->next; \
+    if (leaf && entry && !entry->leaf) { \
+       entry = entry->next; \
+       if (entry && !entry->leaf) \
+           entry = entry->next; \
+       if (entry && entry->name != q) \
+           entry = (NTable)NULL; \
+    }
+
+/* resourceQuarks keeps track of what quarks have been associated with values
+ * in all LTables.  If a quark has never been used in an LTable, we don't need
+ * to bother looking for it.
+ */
+
+static unsigned char *resourceQuarks = (unsigned char *)NULL;
+static XrmQuark maxResourceQuark = -1;
+
+/* determines if a quark has been used for a value in any database */
+#define IsResourceQuark(q)  ((q) > 0 && (q) <= maxResourceQuark && \
+                            resourceQuarks[(q) >> 3] & (1 << ((q) & 7)))
+
+typedef unsigned char XrmBits;
+
+#define BSLASH  ((XrmBits) (1 << 5))
+#define NORMAL ((XrmBits) (1 << 4))
+#define EOQ    ((XrmBits) (1 << 3))
+#define SEP    ((XrmBits) (1 << 2))
+#define ENDOF  ((XrmBits) (1 << 1))
+#define SPACE  (NORMAL|EOQ|SEP|(XrmBits)0)
+#define RSEP   (NORMAL|EOQ|SEP|(XrmBits)1)
+#define EOS    (EOQ|SEP|ENDOF|(XrmBits)0)
+#define EOL    (EOQ|SEP|ENDOF|(XrmBits)1)
+#define BINDING        (NORMAL|EOQ)
+#define ODIGIT (NORMAL|(XrmBits)1)
+
+#define next_char(ch,str) xrmtypes[(unsigned char)((ch) = *(++(str)))]
+#define next_mbchar(ch,len,str) xrmtypes[(unsigned char)(ch = (*db->methods->mbchar)(db->mbstate, str, &len), str += len, ch)]
+
+#define is_space(bits)         ((bits) == SPACE)
+#define is_EOQ(bits)           ((bits) & EOQ)
+#define is_EOF(bits)           ((bits) == EOS)
+#define is_EOL(bits)           ((bits) & ENDOF)
+#define is_binding(bits)       ((bits) == BINDING)
+#define is_odigit(bits)                ((bits) == ODIGIT)
+#define is_separator(bits)     ((bits) & SEP)
+#define is_nonpcs(bits)                (!(bits))
+#define is_normal(bits)                ((bits) & NORMAL)
+#define is_simple(bits)                ((bits) & (NORMAL|BSLASH))
+#define is_special(bits)       ((bits) & (ENDOF|BSLASH))
+
+/* parsing types */
+static XrmBits const xrmtypes[256] = {
+    EOS,0,0,0,0,0,0,0,
+    0,SPACE,EOL,0,0,
+#if defined(WIN32) || defined(__UNIXOS2__)
+                    EOL,       /* treat CR the same as LF, just in case */
+#else
+                    0,
+#endif
+                      0,0,
+    0,0,0,0,0,0,0,0,
+    0,0,0,0,0,0,0,0,
+    SPACE,NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,
+    NORMAL,NORMAL,BINDING,NORMAL,NORMAL,NORMAL,BINDING,NORMAL,
+    ODIGIT,ODIGIT,ODIGIT,ODIGIT,ODIGIT,ODIGIT,ODIGIT,ODIGIT,
+    NORMAL,NORMAL,RSEP,NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,
+    NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,
+    NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,
+    NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,
+    NORMAL,NORMAL,NORMAL,NORMAL,BSLASH,NORMAL,NORMAL,NORMAL,
+    NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,
+    NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,
+    NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,
+    NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,NORMAL,0
+    /* The rest will be automatically initialized to zero. */
+};
+
+void XrmInitialize(void)
+{
+    XrmQString = XrmPermStringToQuark("String");
+    XrmQANY = XrmPermStringToQuark("?");
+}
+
+XrmDatabase XrmGetDatabase(
+    Display *display)
+{
+    XrmDatabase retval;
+    LockDisplay(display);
+    retval = display->db;
+    UnlockDisplay(display);
+    return retval;
+}
+
+void XrmSetDatabase(
+    Display *display,
+    XrmDatabase database)
+{
+    LockDisplay(display);
+    /* destroy database if set up imlicitely by XGetDefault() */
+    if (display->db && (display->flags & XlibDisplayDfltRMDB)) {
+       XrmDestroyDatabase(display->db);
+       display->flags &= ~XlibDisplayDfltRMDB;
+    }
+    display->db = database;
+    UnlockDisplay(display);
+}
+
+void
+XrmStringToQuarkList(
+    register _Xconst char  *name,
+    register XrmQuarkList quarks)   /* RETURN */
+{
+    register XrmBits           bits;
+    register Signature         sig = 0;
+    register char              ch, *tname;
+    register int               i = 0;
+
+    if ((tname = (char *)name)) {
+       tname--;
+       while (!is_EOF(bits = next_char(ch, tname))) {
+           if (is_binding (bits)) {
+               if (i) {
+                   /* Found a complete name */
+                   *quarks++ = _XrmInternalStringToQuark(name,tname - name,
+                                                         sig, False);
+                   i = 0;
+                   sig = 0;
+               }
+               name = tname+1;
+           }
+           else {
+               sig = (sig << 1) + ch; /* Compute the signature. */
+               i++;
+           }
+       }
+       *quarks++ = _XrmInternalStringToQuark(name, tname - name, sig, False);
+    }
+    *quarks = NULLQUARK;
+}
+
+void
+XrmStringToBindingQuarkList(
+    register _Xconst char   *name,
+    register XrmBindingList bindings,   /* RETURN */
+    register XrmQuarkList   quarks)     /* RETURN */
+{
+    register XrmBits           bits;
+    register Signature         sig = 0;
+    register char              ch, *tname;
+    register XrmBinding        binding;
+    register int               i = 0;
+
+    if ((tname = (char *)name)) {
+       tname--;
+       binding = XrmBindTightly;
+       while (!is_EOF(bits = next_char(ch, tname))) {
+           if (is_binding (bits)) {
+               if (i) {
+                   /* Found a complete name */
+                   *bindings++ = binding;
+                   *quarks++ = _XrmInternalStringToQuark(name, tname - name,
+                                                         sig, False);
+
+                   i = 0;
+                   sig = 0;
+                   binding = XrmBindTightly;
+               }
+               name = tname+1;
+
+               if (ch == '*')
+                   binding = XrmBindLoosely;
+           }
+           else {
+               sig = (sig << 1) + ch; /* Compute the signature. */
+               i++;
+           }
+       }
+       *bindings = binding;
+       *quarks++ = _XrmInternalStringToQuark(name, tname - name, sig, False);
+    }
+    *quarks = NULLQUARK;
+}
+
+#ifdef DEBUG
+
+static void PrintQuarkList(
+    XrmQuarkList    quarks,
+    FILE           *stream)
+{
+    Bool           firstNameSeen;
+
+    for (firstNameSeen = False; *quarks; quarks++) {
+       if (firstNameSeen) {
+           (void) fprintf(stream, ".");
+       }
+       firstNameSeen = True;
+       (void) fputs(XrmQuarkToString(*quarks), stream);
+    }
+} /* PrintQuarkList */
+
+#endif /* DEBUG */
+
+
+/*
+ * Fallback methods for Xrm parsing.
+ * Simulate a C locale. No state needed here.
+ */
+
+static void
+c_mbnoop(
+    XPointer state)
+{
+}
+
+static char
+c_mbchar(
+    XPointer state,
+    const char *str,
+    int *lenp)
+{
+    *lenp = 1;
+    return *str;
+}
+
+static const char *
+c_lcname(
+    XPointer state)
+{
+    return "C";
+}
+
+static const XrmMethodsRec mb_methods = {
+    c_mbnoop,  /* mbinit */
+    c_mbchar,  /* mbchar */
+    c_mbnoop,  /* mbfinish */
+    c_lcname,  /* lcname */
+    c_mbnoop   /* destroy */
+};
+
+
+static XrmDatabase NewDatabase(void)
+{
+    register XrmDatabase db;
+
+    db = (XrmDatabase) Xmalloc(sizeof(XrmHashBucketRec));
+    if (db) {
+       _XCreateMutex(&db->linfo);
+       db->table = (NTable)NULL;
+       db->mbstate = (XPointer)NULL;
+       db->methods = _XrmInitParseInfo(&db->mbstate);
+       if (!db->methods)
+           db->methods = &mb_methods;
+    }
+    return db;
+}
+
+/* move all values from ftable to ttable, and free ftable's buckets.
+ * ttable is quaranteed empty to start with.
+ */
+static void MoveValues(
+    LTable ftable,
+    register LTable ttable)
+{
+    register VEntry fentry, nfentry;
+    register VEntry *prev;
+    register VEntry *bucket;
+    register VEntry tentry;
+    register int i;
+
+    for (i = ftable->table.mask, bucket = ftable->buckets; i >= 0; i--) {
+       for (fentry = *bucket++; fentry; fentry = nfentry) {
+           prev = &LeafHash(ttable, fentry->name);
+           tentry = *prev;
+           *prev = fentry;
+           /* chain on all with same name, to preserve invariant order */
+           while ((nfentry = fentry->next) && nfentry->name == fentry->name)
+               fentry = nfentry;
+           fentry->next = tentry;
+       }
+    }
+    Xfree((char *)ftable->buckets);
+}
+
+/* move all tables from ftable to ttable, and free ftable.
+ * ttable is quaranteed empty to start with.
+ */
+static void MoveTables(
+    NTable ftable,
+    register NTable ttable)
+{
+    register NTable fentry, nfentry;
+    register NTable *prev;
+    register NTable *bucket;
+    register NTable tentry;
+    register int i;
+
+    for (i = ftable->mask, bucket = NodeBuckets(ftable); i >= 0; i--) {
+       for (fentry = *bucket++; fentry; fentry = nfentry) {
+           prev = &NodeHash(ttable, fentry->name);
+           tentry = *prev;
+           *prev = fentry;
+           /* chain on all with same name, to preserve invariant order */
+           while ((nfentry = fentry->next) && nfentry->name == fentry->name)
+               fentry = nfentry;
+           fentry->next = tentry;
+       }
+    }
+    Xfree((char *)ftable);
+}
+
+/* grow the table, based on current number of entries */
+static void GrowTable(
+    NTable *prev)
+{
+    register NTable table;
+    register int i;
+
+    table = *prev;
+    i = table->mask;
+    if (i == 255) /* biggest it gets */
+       return;
+    while (i < 255 && GrowthPred(table->entries, i))
+       i = (i << 1) + 1;
+    i++; /* i is now the new size */
+    if (table->leaf) {
+       register LTable ltable;
+       LTableRec otable;
+
+       ltable = (LTable)table;
+       /* cons up a copy to make MoveValues look symmetric */
+       otable = *ltable;
+       ltable->buckets = Xcalloc(i, sizeof(VEntry));
+       if (!ltable->buckets) {
+           ltable->buckets = otable.buckets;
+           return;
+       }
+       ltable->table.mask = i - 1;
+       MoveValues(&otable, ltable);
+    } else {
+       register NTable ntable;
+
+       ntable = Xcalloc(1, sizeof(NTableRec) + (i * sizeof(NTable)));
+       if (!ntable)
+           return;
+       *ntable = *table;
+       ntable->mask = i - 1;
+       *prev = ntable;
+       MoveTables(table, ntable);
+    }
+}
+
+/* merge values from ftable into *pprev, destroy ftable in the process */
+static void MergeValues(
+    LTable ftable,
+    NTable *pprev,
+    Bool override)
+{
+    register VEntry fentry, tentry;
+    register VEntry *prev;
+    register LTable ttable;
+    VEntry *bucket;
+    int i;
+    register XrmQuark q;
+
+    ttable = (LTable)*pprev;
+    if (ftable->table.hasloose)
+       ttable->table.hasloose = 1;
+    for (i = ftable->table.mask, bucket = ftable->buckets;
+        i >= 0;
+        i--, bucket++) {
+       for (fentry = *bucket; fentry; ) {
+           q = fentry->name;
+           prev = &LeafHash(ttable, q);
+           tentry = *prev;
+           while (tentry && tentry->name != q)
+               tentry = *(prev = &tentry->next);
+           /* note: test intentionally uses fentry->name instead of q */
+           /* permits serendipitous inserts */
+           while (tentry && tentry->name == fentry->name) {
+               /* if tentry is earlier, skip it */
+               if (!fentry->tight && tentry->tight) {
+                   tentry = *(prev = &tentry->next);
+                   continue;
+               }
+               if (fentry->tight != tentry->tight) {
+                   /* no match, chain in fentry */
+                   *prev = fentry;
+                   prev = &fentry->next;
+                   fentry = *prev;
+                   *prev = tentry;
+                   ttable->table.entries++;
+               } else if (override) {
+                   /* match, chain in fentry, splice out and free tentry */
+                   *prev = fentry;
+                   prev = &fentry->next;
+                   fentry = *prev;
+                   *prev = tentry->next;
+                   /* free the overridden entry */
+                   Xfree((char *)tentry);
+                   /* get next tentry */
+                   tentry = *prev;
+               } else {
+                   /* match, discard fentry */
+                   prev = &tentry->next;
+                   tentry = fentry; /* use as a temp var */
+                   fentry = fentry->next;
+                   /* free the overpowered entry */
+                   Xfree((char *)tentry);
+                   /* get next tentry */
+                   tentry = *prev;
+               }
+               if (!fentry)
+                   break;
+           }
+           /* at this point, tentry cannot match any fentry named q */
+           /* chain in all bindings together, preserve invariant order */
+           while (fentry && fentry->name == q) {
+               *prev = fentry;
+               prev = &fentry->next;
+               fentry = *prev;
+               *prev = tentry;
+               ttable->table.entries++;
+           }
+       }
+    }
+    Xfree((char *)ftable->buckets);
+    Xfree((char *)ftable);
+    /* resize if necessary, now that we're all done */
+    GROW(pprev);
+}
+
+/* merge tables from ftable into *pprev, destroy ftable in the process */
+static void MergeTables(
+    NTable ftable,
+    NTable *pprev,
+    Bool override)
+{
+    register NTable fentry, tentry;
+    NTable nfentry;
+    register NTable *prev;
+    register NTable ttable;
+    NTable *bucket;
+    int i;
+    register XrmQuark q;
+
+    ttable = *pprev;
+    if (ftable->hasloose)
+       ttable->hasloose = 1;
+    if (ftable->hasany)
+       ttable->hasany = 1;
+    for (i = ftable->mask, bucket = NodeBuckets(ftable);
+        i >= 0;
+        i--, bucket++) {
+       for (fentry = *bucket; fentry; ) {
+           q = fentry->name;
+           prev = &NodeHash(ttable, q);
+           tentry = *prev;
+           while (tentry && tentry->name != q)
+               tentry = *(prev = &tentry->next);
+           /* note: test intentionally uses fentry->name instead of q */
+           /* permits serendipitous inserts */
+           while (tentry && tentry->name == fentry->name) {
+               /* if tentry is earlier, skip it */
+               if ((fentry->leaf && !tentry->leaf) ||
+                   (!fentry->tight && tentry->tight &&
+                    (fentry->leaf || !tentry->leaf))) {
+                   tentry = *(prev = &tentry->next);
+                   continue;
+               }
+               nfentry = fentry->next;
+               if (fentry->leaf != tentry->leaf ||
+                   fentry->tight != tentry->tight) {
+                   /* no match, just chain in */
+                   *prev = fentry;
+                   *(prev = &fentry->next) = tentry;
+                   ttable->entries++;
+               } else {
+                   if (fentry->leaf)
+                       MergeValues((LTable)fentry, prev, override);
+                   else
+                       MergeTables(fentry, prev, override);
+                   /* bump to next tentry */
+                   tentry = *(prev = &(*prev)->next);
+               }
+               /* bump to next fentry */
+               fentry = nfentry;
+               if (!fentry)
+                   break;
+           }
+           /* at this point, tentry cannot match any fentry named q */
+           /* chain in all bindings together, preserve invariant order */
+           while (fentry && fentry->name == q) {
+               *prev = fentry;
+               prev = &fentry->next;
+               fentry = *prev;
+               *prev = tentry;
+               ttable->entries++;
+           }
+       }
+    }
+    Xfree((char *)ftable);
+    /* resize if necessary, now that we're all done */
+    GROW(pprev);
+}
+
+void XrmCombineDatabase(
+    XrmDatabase        from, XrmDatabase *into,
+    Bool override)
+{
+    register NTable *prev;
+    register NTable ftable, ttable, nftable;
+
+    if (!*into) {
+       *into = from;
+    } else if (from) {
+       _XLockMutex(&from->linfo);
+       _XLockMutex(&(*into)->linfo);
+       if ((ftable = from->table)) {
+           prev = &(*into)->table;
+           ttable = *prev;
+           if (!ftable->leaf) {
+               nftable = ftable->next;
+               if (ttable && !ttable->leaf) {
+                   /* both have node tables, merge them */
+                   MergeTables(ftable, prev, override);
+                   /* bump to into's leaf table, if any */
+                   ttable = *(prev = &(*prev)->next);
+               } else {
+                   /* into has no node table, link from's in */
+                   *prev = ftable;
+                   *(prev = &ftable->next) = ttable;
+               }
+               /* bump to from's leaf table, if any */
+               ftable = nftable;
+           } else {
+               /* bump to into's leaf table, if any */
+               if (ttable && !ttable->leaf)
+                   ttable = *(prev = &ttable->next);
+           }
+           if (ftable) {
+               /* if into has a leaf, merge, else insert */
+               if (ttable)
+                   MergeValues((LTable)ftable, prev, override);
+               else
+                   *prev = ftable;
+           }
+       }
+       (from->methods->destroy)(from->mbstate);
+       _XUnlockMutex(&from->linfo);
+       _XFreeMutex(&from->linfo);
+       Xfree((char *)from);
+       _XUnlockMutex(&(*into)->linfo);
+    }
+}
+
+void XrmMergeDatabases(
+    XrmDatabase        from, XrmDatabase *into)
+{
+    XrmCombineDatabase(from, into, True);
+}
+
+/* store a value in the database, overriding any existing entry */
+static void PutEntry(
+    XrmDatabase                db,
+    XrmBindingList     bindings,
+    XrmQuarkList       quarks,
+    XrmRepresentation  type,
+    XrmValuePtr                value)
+{
+    register NTable *pprev, *prev;
+    register NTable table;
+    register XrmQuark q;
+    register VEntry *vprev;
+    register VEntry entry;
+    NTable *nprev, *firstpprev;
+
+#define NEWTABLE(q,i) \
+    table = (NTable)Xmalloc(sizeof(LTableRec)); \
+    if (!table) \
+       return; \
+    table->name = q; \
+    table->hasloose = 0; \
+    table->hasany = 0; \
+    table->mask = 0; \
+    table->entries = 0; \
+    if (quarks[i]) { \
+       table->leaf = 0; \
+       nprev = NodeBuckets(table); \
+    } else { \
+       table->leaf = 1; \
+       if (!(nprev = (NTable *)Xmalloc(sizeof(VEntry *)))) {\
+           Xfree(table); \
+           return; \
+        } \
+       ((LTable)table)->buckets = (VEntry *)nprev; \
+    } \
+    *nprev = (NTable)NULL; \
+    table->next = *prev; \
+    *prev = table
+
+    if (!db || !*quarks)
+       return;
+    table = *(prev = &db->table);
+    /* if already at leaf, bump to the leaf table */
+    if (!quarks[1] && table && !table->leaf)
+       table = *(prev = &table->next);
+    pprev = prev;
+    if (!table || (quarks[1] && table->leaf)) {
+       /* no top-level node table, create one and chain it in */
+       NEWTABLE(NULLQUARK,1);
+       table->tight = 1; /* arbitrary */
+       prev = nprev;
+    } else {
+       /* search along until we need a value */
+       while (quarks[1]) {
+           q = *quarks;
+           table = *(prev = &NodeHash(table, q));
+           while (table && table->name != q)
+               table = *(prev = &table->next);
+           if (!table)
+               break; /* not found */
+           if (quarks[2]) {
+               if (table->leaf)
+                   break; /* not found */
+           } else {
+               if (!table->leaf) {
+                   /* bump to leaf table, if any */
+                   table = *(prev = &table->next);
+                   if (!table || table->name != q)
+                       break; /* not found */
+                   if (!table->leaf) {
+                       /* bump to leaf table, if any */
+                       table = *(prev = &table->next);
+                       if (!table || table->name != q)
+                           break; /* not found */
+                   }
+               }
+           }
+           if (*bindings == XrmBindTightly) {
+               if (!table->tight)
+                   break; /* not found */
+           } else {
+               if (table->tight) {
+                   /* bump to loose table, if any */
+                   table = *(prev = &table->next);
+                   if (!table || table->name != q ||
+                       !quarks[2] != table->leaf)
+                       break; /* not found */
+               }
+           }
+           /* found that one, bump to next quark */
+           pprev = prev;
+           quarks++;
+           bindings++;
+       }
+       if (!quarks[1]) {
+           /* found all the way to a leaf */
+           q = *quarks;
+           entry = *(vprev = &LeafHash((LTable)table, q));
+           while (entry && entry->name != q)
+               entry = *(vprev = &entry->next);
+           /* if want loose and have tight, bump to next entry */
+           if (entry && *bindings == XrmBindLoosely && entry->tight)
+               entry = *(vprev = &entry->next);
+           if (entry && entry->name == q &&
+               (*bindings == XrmBindTightly) == entry->tight) {
+               /* match, need to override */
+               if ((type == XrmQString) == entry->string &&
+                   entry->size == value->size) {
+                   /* update type if not String, can be different */
+                   if (!entry->string)
+                       RepType(entry) = type;
+                   /* identical size, just overwrite value */
+                   memcpy(RawValue(entry), (char *)value->addr, value->size);
+                   return;
+               }
+               /* splice out and free old entry */
+               *vprev = entry->next;
+               Xfree((char *)entry);
+               (*pprev)->entries--;
+           }
+           /* this is where to insert */
+           prev = (NTable *)vprev;
+       }
+    }
+    /* keep the top table, because we may have to grow it */
+    firstpprev = pprev;
+    /* iterate until we get to the leaf */
+    while (quarks[1]) {
+       /* build a new table and chain it in */
+       NEWTABLE(*quarks,2);
+       if (*quarks++ == XrmQANY)
+           (*pprev)->hasany = 1;
+       if (*bindings++ == XrmBindTightly) {
+           table->tight = 1;
+       } else {
+           table->tight = 0;
+           (*pprev)->hasloose = 1;
+       }
+       (*pprev)->entries++;
+       pprev = prev;
+       prev = nprev;
+    }
+    /* now allocate the value entry */
+    entry = (VEntry)Xmalloc(((type == XrmQString) ?
+                            sizeof(VEntryRec) : sizeof(DEntryRec)) +
+                           value->size);
+    if (!entry)
+       return;
+    entry->name = q = *quarks;
+    if (*bindings == XrmBindTightly) {
+       entry->tight = 1;
+    } else {
+       entry->tight = 0;
+       (*pprev)->hasloose = 1;
+    }
+    /* chain it in, with a bit of type cast ugliness */
+    entry->next = *((VEntry *)prev);
+    *((VEntry *)prev) = entry;
+    entry->size = value->size;
+    if (type == XrmQString) {
+       entry->string = 1;
+    } else {
+       entry->string = 0;
+       RepType(entry) = type;
+    }
+    /* save a copy of the value */
+    memcpy(RawValue(entry), (char *)value->addr, value->size);
+    (*pprev)->entries++;
+    /* this is a new leaf, need to remember it for search lists */
+    if (q > maxResourceQuark) {
+       unsigned oldsize = (maxResourceQuark + 1) >> 3;
+       unsigned size = ((q | 0x7f) + 1) >> 3; /* reallocate in chunks */
+       if (resourceQuarks) {
+           unsigned char *prevQuarks = resourceQuarks;
+
+           resourceQuarks = (unsigned char *)Xrealloc((char *)resourceQuarks,
+                                                      size);
+           if (!resourceQuarks) {
+               Xfree(prevQuarks);
+           }
+       } else
+           resourceQuarks = (unsigned char *)Xmalloc(size);
+       if (resourceQuarks) {
+           bzero((char *)&resourceQuarks[oldsize], size - oldsize);
+           maxResourceQuark = (size << 3) - 1;
+       } else {
+           maxResourceQuark = -1;
+       }
+    }
+    if (q > 0 && resourceQuarks)
+       resourceQuarks[q >> 3] |= 1 << (q & 0x7);
+    GROW(firstpprev);
+
+#undef NEWTABLE
+}
+
+void XrmQPutResource(
+    XrmDatabase                *pdb,
+    XrmBindingList      bindings,
+    XrmQuarkList       quarks,
+    XrmRepresentation  type,
+    XrmValuePtr                value)
+{
+    if (!*pdb) *pdb = NewDatabase();
+    _XLockMutex(&(*pdb)->linfo);
+    PutEntry(*pdb, bindings, quarks, type, value);
+    _XUnlockMutex(&(*pdb)->linfo);
+}
+
+void
+XrmPutResource(
+    XrmDatabase     *pdb,
+    _Xconst char    *specifier,
+    _Xconst char    *type,
+    XrmValuePtr            value)
+{
+    XrmBinding     bindings[MAXDBDEPTH+1];
+    XrmQuark       quarks[MAXDBDEPTH+1];
+
+    if (!*pdb) *pdb = NewDatabase();
+    _XLockMutex(&(*pdb)->linfo);
+    XrmStringToBindingQuarkList(specifier, bindings, quarks);
+    PutEntry(*pdb, bindings, quarks, XrmStringToQuark(type), value);
+    _XUnlockMutex(&(*pdb)->linfo);
+}
+
+void
+XrmQPutStringResource(
+    XrmDatabase     *pdb,
+    XrmBindingList  bindings,
+    XrmQuarkList    quarks,
+    _Xconst char    *str)
+{
+    XrmValue   value;
+
+    if (!*pdb) *pdb = NewDatabase();
+    value.addr = (XPointer) str;
+    value.size = strlen(str)+1;
+    _XLockMutex(&(*pdb)->linfo);
+    PutEntry(*pdb, bindings, quarks, XrmQString, &value);
+    _XUnlockMutex(&(*pdb)->linfo);
+}
+
+/*     Function Name: GetDatabase
+ *     Description: Parses a string and stores it as a database.
+ *     Arguments: db - the database.
+ *                 str - a pointer to the string containing the database.
+ *                 filename - source filename, if any.
+ *                 doall - whether to do all lines or just one
+ */
+
+/*
+ * This function is highly optimized to inline as much as possible.
+ * Be very careful with modifications, or simplifications, as they
+ * may adversely affect the performance.
+ *
+ * Chris Peterson, MIT X Consortium            5/17/90.
+ */
+
+/*
+ * Xlib spec says max 100 quarks in a lookup, will stop and return if
+ * return if any single production's lhs has more than 100 components.
+ */
+#define QLIST_SIZE 100
+
+/*
+ * This should be big enough to handle things like the XKeysymDB or biggish
+ * ~/.Xdefaults or app-defaults files. Anything bigger will be allocated on
+ * the heap.
+ */
+#define DEF_BUFF_SIZE 8192
+
+static void GetIncludeFile(
+    XrmDatabase db,
+    _Xconst char *base,
+    _Xconst char *fname,
+    int fnamelen);
+
+static void GetDatabase(
+    XrmDatabase db,
+    _Xconst char *str,
+    _Xconst char *filename,
+    Bool doall)
+{
+    char *rhs;
+    char *lhs, lhs_s[DEF_BUFF_SIZE];
+    XrmQuark quarks[QLIST_SIZE + 1];   /* allow for a terminal NullQuark */
+    XrmBinding bindings[QLIST_SIZE + 1];
+
+    register char *ptr;
+    register XrmBits bits = 0;
+    register char c;
+    register Signature sig;
+    register char *ptr_max;
+    register int num_quarks;
+    register XrmBindingList t_bindings;
+
+    int len, alloc_chars;
+    unsigned long str_len;
+    XrmValue value;
+    Bool only_pcs;
+    Bool dolines;
+
+    if (!db)
+       return;
+
+    /*
+     * if strlen (str) < DEF_BUFF_SIZE allocate buffers on the stack for
+     * speed otherwise malloc the buffer. From a buffer overflow standpoint
+     * we can be sure that neither: a) a component on the lhs, or b) a
+     * value on the rhs, will be longer than the overall length of str,
+     * i.e. strlen(str).
+     *
+     * This should give good performance when parsing "*foo: bar" type
+     * databases as might be passed with -xrm command line options; but
+     * with larger databases, e.g. .Xdefaults, app-defaults, or KeysymDB
+     * files, the size of the buffers will be overly large. One way
+     * around this would be to double-parse each production with a resulting
+     * performance hit. In any event we can be assured that a lhs component
+     * name or a rhs value won't be longer than str itself.
+     */
+
+    str_len = strlen (str);
+    if (DEF_BUFF_SIZE > str_len) lhs = lhs_s;
+    else if ((lhs = (char*) Xmalloc (str_len)) == NULL)
+       return;
+
+    alloc_chars = DEF_BUFF_SIZE < str_len ? str_len : DEF_BUFF_SIZE;
+    if ((rhs = (char*) Xmalloc (alloc_chars)) == NULL) {
+       if (lhs != lhs_s) Xfree (lhs);
+       return;
+    }
+
+    (*db->methods->mbinit)(db->mbstate);
+    str--;
+    dolines = True;
+    while (!is_EOF(bits) && dolines) {
+       dolines = doall;
+
+       /*
+        * First: Remove extra whitespace.
+        */
+
+       do {
+           bits = next_char(c, str);
+       } while is_space(bits);
+
+       /*
+        * Ignore empty lines.
+        */
+
+       if (is_EOL(bits))
+           continue;           /* start a new line. */
+
+       /*
+        * Second: check the first character in a line to see if it is
+        * "!" signifying a comment, or "#" signifying a directive.
+        */
+
+       if (c == '!') { /* Comment, spin to next newline */
+           while (is_simple(bits = next_char(c, str))) {}
+           if (is_EOL(bits))
+               continue;
+           while (!is_EOL(bits = next_mbchar(c, len, str))) {}
+           str--;
+           continue;           /* start a new line. */
+       }
+
+       if (c == '#') { /* Directive */
+           /* remove extra whitespace */
+           only_pcs = True;
+           while (is_space(bits = next_char(c, str))) {};
+           /* only "include" directive is currently defined */
+           if (!strncmp(str, "include", 7)) {
+               str += (7-1);
+               /* remove extra whitespace */
+               while (is_space(bits = next_char(c, str))) {};
+               /* must have a starting " */
+               if (c == '"') {
+                   _Xconst char *fname = str+1;
+                   len = 0;
+                   do {
+                       if (only_pcs) {
+                           bits = next_char(c, str);
+                           if (is_nonpcs(bits))
+                               only_pcs = False;
+                       }
+                       if (!only_pcs)
+                           bits = next_mbchar(c, len, str);
+                   } while (c != '"' && !is_EOL(bits));
+                   /* must have an ending " */
+                   if (c == '"')
+                       GetIncludeFile(db, filename, fname, str - len - fname);
+               }
+           }
+           /* spin to next newline */
+           if (only_pcs) {
+               while (is_simple(bits))
+                   bits = next_char(c, str);
+               if (is_EOL(bits))
+                   continue;
+           }
+           while (!is_EOL(bits))
+               bits = next_mbchar(c, len, str);
+           str--;
+           continue;           /* start a new line. */
+       }
+
+       /*
+        * Third: loop through the LHS of the resource specification
+        * storing characters and converting this to a Quark.
+        */
+
+       num_quarks = 0;
+       t_bindings = bindings;
+
+       sig = 0;
+       ptr = lhs;
+       *t_bindings = XrmBindTightly;
+       for(;;) {
+           if (!is_binding(bits)) {
+               while (!is_EOQ(bits)) {
+                   *ptr++ = c;
+                   sig = (sig << 1) + c; /* Compute the signature. */
+                   bits = next_char(c, str);
+               }
+
+               quarks[num_quarks++] =
+                       _XrmInternalStringToQuark(lhs, ptr - lhs, sig, False);
+
+               if (num_quarks > QLIST_SIZE) {
+                   Xfree(rhs);
+                   if (lhs != lhs_s) Xfree (lhs);
+                   (*db->methods->mbfinish)(db->mbstate);
+                   return;
+               }
+
+               if (is_separator(bits))  {
+                   if (!is_space(bits))
+                       break;
+
+                   /* Remove white space */
+                   do {
+                       *ptr++ = c;
+                       sig = (sig << 1) + c; /* Compute the signature. */
+                   } while (is_space(bits = next_char(c, str)));
+
+                   /*
+                    * The spec doesn't permit it, but support spaces
+                    * internal to resource name/class
+                    */
+
+                   if (is_separator(bits))
+                       break;
+                   num_quarks--;
+                   continue;
+               }
+
+               if (c == '.')
+                   *(++t_bindings) = XrmBindTightly;
+               else
+                   *(++t_bindings) = XrmBindLoosely;
+
+               sig = 0;
+               ptr = lhs;
+           }
+           else {
+               /*
+                * Magic unspecified feature #254.
+                *
+                * If two separators appear with no Text between them then
+                * ignore them.
+                *
+                * If anyone of those separators is a '*' then the binding
+                * will be loose, otherwise it will be tight.
+                */
+
+               if (c == '*')
+                   *t_bindings = XrmBindLoosely;
+           }
+
+           bits = next_char(c, str);
+       }
+
+       quarks[num_quarks] = NULLQUARK;
+
+       /*
+        * Make sure that there is a ':' in this line.
+        */
+
+       if (c != ':') {
+           char oldc;
+
+           /*
+            * A parsing error has occured, toss everything on the line
+            * a new_line can still be escaped with a '\'.
+            */
+
+           while (is_normal(bits))
+               bits = next_char(c, str);
+           if (is_EOL(bits))
+               continue;
+           bits = next_mbchar(c, len, str);
+           do {
+               oldc = c;
+               bits = next_mbchar(c, len, str);
+           } while (c && (c != '\n' || oldc == '\\'));
+           str--;
+           continue;
+       }
+
+       /*
+        * I now have a quark and binding list for the entire left hand
+        * side.  "c" currently points to the ":" separating the left hand
+        * side for the right hand side.  It is time to begin processing
+        * the right hand side.
+        */
+
+       /*
+        * Fourth: Remove more whitespace
+        */
+
+       for(;;) {
+           if (is_space(bits = next_char(c, str)))
+               continue;
+           if (c != '\\')
+               break;
+           bits = next_char(c, str);
+           if (c == '\n')
+               continue;
+           str--;
+           bits = BSLASH;
+           c = '\\';
+           break;
+       }
+
+       /*
+        * Fifth: Process the right hand side.
+        */
+
+       ptr = rhs;
+       ptr_max = ptr + alloc_chars - 4;
+       only_pcs = True;
+       len = 1;
+
+       for(;;) {
+
+           /*
+            * Tight loop for the normal case:  Non backslash, non-end of value
+            * character that will fit into the allocated buffer.
+            */
+
+           if (only_pcs) {
+               while (is_normal(bits) && ptr < ptr_max) {
+                   *ptr++ = c;
+                   bits = next_char(c, str);
+               }
+               if (is_EOL(bits))
+                   break;
+               if (is_nonpcs(bits)) {
+                   only_pcs = False;
+                   bits = next_mbchar(c, len, str);
+               }
+           }
+           while (!is_special(bits) && ptr + len <= ptr_max) {
+               len = -len;
+               while (len)
+                   *ptr++ = str[len++];
+               if (*str == '\0') {
+                   bits = EOS;
+                   break;
+               }
+               bits = next_mbchar(c, len, str);
+           }
+
+           if (is_EOL(bits)) {
+               str--;
+               break;
+           }
+
+           if (c == '\\') {
+               /*
+                * We need to do some magic after a backslash.
+                */
+               Bool read_next = True;
+
+               if (only_pcs) {
+                   bits = next_char(c, str);
+                   if (is_nonpcs(bits))
+                       only_pcs = False;
+               }
+               if (!only_pcs)
+                   bits = next_mbchar(c, len, str);
+
+               if (is_EOL(bits)) {
+                   if (is_EOF(bits))
+                       continue;
+               } else if (c == 'n') {
+                   /*
+                    * "\n" means insert a newline.
+                    */
+                   *ptr++ = '\n';
+               } else if (c == '\\') {
+                   /*
+                    * "\\" completes to just one backslash.
+                    */
+                   *ptr++ = '\\';
+               } else {
+                   /*
+                    * pick up to three octal digits after the '\'.
+                    */
+                   char temp[3];
+                   int count = 0;
+                   while (is_odigit(bits) && count < 3) {
+                       temp[count++] = c;
+                       if (only_pcs) {
+                           bits = next_char(c, str);
+                           if (is_nonpcs(bits))
+                               only_pcs = False;
+                       }
+                       if (!only_pcs)
+                           bits = next_mbchar(c, len, str);
+                   }
+
+                   /*
+                    * If we found three digits then insert that octal code
+                    * into the value string as a character.
+                    */
+
+                   if (count == 3) {
+                       *ptr++ = (unsigned char) ((temp[0] - '0') * 0100 +
+                                                 (temp[1] - '0') * 010 +
+                                                 (temp[2] - '0'));
+                   }
+                   else {
+                       int tcount;
+
+                       /*
+                        * Otherwise just insert those characters into the
+                        * string, since no special processing is needed on
+                        * numerics we can skip the special processing.
+                        */
+
+                       for (tcount = 0; tcount < count; tcount++) {
+                           *ptr++ = temp[tcount]; /* print them in
+                                                     the correct order */
+                       }
+                   }
+                   read_next = False;
+               }
+               if (read_next) {
+                   if (only_pcs) {
+                       bits = next_char(c, str);
+                       if (is_nonpcs(bits))
+                           only_pcs = False;
+                   }
+                   if (!only_pcs)
+                       bits = next_mbchar(c, len, str);
+               }
+           }
+
+           /*
+            * It is important to make sure that there is room for at least
+            * four more characters in the buffer, since I can add that
+            * many characters into the buffer after a backslash has occured.
+            */
+
+           if (ptr + len > ptr_max) {
+               char * temp_str;
+
+               alloc_chars += BUFSIZ/10;
+               temp_str = Xrealloc(rhs, sizeof(char) * alloc_chars);
+
+               if (!temp_str) {
+                   Xfree(rhs);
+                   if (lhs != lhs_s) Xfree (lhs);
+                   (*db->methods->mbfinish)(db->mbstate);
+                   return;
+               }
+
+               ptr = temp_str + (ptr - rhs); /* reset pointer. */
+               rhs = temp_str;
+               ptr_max = rhs + alloc_chars - 4;
+           }
+       }
+
+       /*
+        * Lastly: Terminate the value string, and store this entry
+        *         into the database.
+        */
+
+       *ptr++ = '\0';
+
+       /* Store it in database */
+       value.size = ptr - rhs;
+       value.addr = (XPointer) rhs;
+
+       PutEntry(db, bindings, quarks, XrmQString, &value);
+    }
+
+    if (lhs != lhs_s) Xfree (lhs);
+    Xfree (rhs);
+
+    (*db->methods->mbfinish)(db->mbstate);
+}
+
+void
+XrmPutStringResource(
+    XrmDatabase *pdb,
+    _Xconst char*specifier,
+    _Xconst char*str)
+{
+    XrmValue   value;
+    XrmBinding bindings[MAXDBDEPTH+1];
+    XrmQuark   quarks[MAXDBDEPTH+1];
+
+    if (!*pdb) *pdb = NewDatabase();
+    XrmStringToBindingQuarkList(specifier, bindings, quarks);
+    value.addr = (XPointer) str;
+    value.size = strlen(str)+1;
+    _XLockMutex(&(*pdb)->linfo);
+    PutEntry(*pdb, bindings, quarks, XrmQString, &value);
+    _XUnlockMutex(&(*pdb)->linfo);
+}
+
+
+void
+XrmPutLineResource(
+    XrmDatabase *pdb,
+    _Xconst char*line)
+{
+    if (!*pdb) *pdb = NewDatabase();
+    _XLockMutex(&(*pdb)->linfo);
+    GetDatabase(*pdb, line, (char *)NULL, False);
+    _XUnlockMutex(&(*pdb)->linfo);
+}
+
+XrmDatabase
+XrmGetStringDatabase(
+    _Xconst char    *data)
+{
+    XrmDatabase     db;
+
+    db = NewDatabase();
+    _XLockMutex(&db->linfo);
+    GetDatabase(db, data, (char *)NULL, True);
+    _XUnlockMutex(&db->linfo);
+    return db;
+}
+
+/*     Function Name: ReadInFile
+ *     Description: Reads the file into a buffer.
+ *     Arguments: filename - the name of the file.
+ *     Returns: An allocated string containing the contents of the file.
+ */
+
+static char *
+ReadInFile(_Xconst char *filename)
+{
+    register int fd, size;
+    char * filebuf;
+
+#ifdef __UNIXOS2__
+    filename = __XOS2RedirRoot(filename);
+#endif
+
+    /*
+     * MS-Windows and OS/2 note: Default open mode includes O_TEXT
+     */
+    if ( (fd = _XOpenFile (filename, O_RDONLY)) == -1 )
+       return (char *)NULL;
+
+    /*
+     * MS-Windows and OS/2 note: depending on how the sources are
+     * untarred, the newlines in resource files may or may not have
+     * been expanded to CRLF. Either way the size returned by fstat
+     * is sufficient to read the file into because in text-mode any
+     * CRLFs in a file will be converted to newlines (LF) with the
+     * result that the number of bytes actually read with be <=
+     * to the size returned by fstat.
+     */
+    {
+       struct stat status_buffer;
+       if ( (fstat(fd, &status_buffer)) == -1 ) {
+           close (fd);
+           return (char *)NULL;
+       } else
+           size = status_buffer.st_size;
+    }
+
+    if (!(filebuf = Xmalloc(size + 1))) { /* leave room for '\0' */
+       close(fd);
+       return (char *)NULL;
+    }
+    size = read (fd, filebuf, size);
+
+#ifdef __UNIXOS2__
+    { /* kill CRLF */
+      int i,k;
+      for (i=k=0; i<size; i++)
+       if (filebuf[i] != 0x0d) {
+          filebuf[k++] = filebuf[i];
+       }
+       filebuf[k] = 0;
+    }
+#endif
+
+    if (size < 0) {
+       close (fd);
+       Xfree(filebuf);
+       return (char *)NULL;
+    }
+    close (fd);
+
+    filebuf[size] = '\0';      /* NULL terminate it. */
+    return filebuf;
+}
+
+static void
+GetIncludeFile(
+    XrmDatabase db,
+    _Xconst char *base,
+    _Xconst char *fname,
+    int fnamelen)
+{
+    int len;
+    char *str;
+    char realfname[BUFSIZ];
+
+    if (fnamelen <= 0 || fnamelen >= BUFSIZ)
+       return;
+    if (*fname != '/' && base && (str = strrchr(base, '/'))) {
+       len = str - base + 1;
+       if (len + fnamelen >= BUFSIZ)
+           return;
+       strncpy(realfname, base, len);
+       strncpy(realfname + len, fname, fnamelen);
+       realfname[len + fnamelen] = '\0';
+    } else {
+       strncpy(realfname, fname, fnamelen);
+       realfname[fnamelen] = '\0';
+    }
+    if (!(str = ReadInFile(realfname)))
+       return;
+    GetDatabase(db, str, realfname, True);
+    Xfree(str);
+}
+
+XrmDatabase
+XrmGetFileDatabase(
+    _Xconst char    *filename)
+{
+    XrmDatabase db;
+    char *str;
+
+    if (!(str = ReadInFile(filename)))
+       return (XrmDatabase)NULL;
+
+    db = NewDatabase();
+    _XLockMutex(&db->linfo);
+    GetDatabase(db, str, filename, True);
+    _XUnlockMutex(&db->linfo);
+    Xfree(str);
+    return db;
+}
+
+Status
+XrmCombineFileDatabase(
+    _Xconst char    *filename,
+    XrmDatabase     *target,
+    Bool             override)
+{
+    XrmDatabase db;
+    char *str;
+
+    if (!(str = ReadInFile(filename)))
+       return 0;
+    if (override) {
+       db = *target;
+       if (!db)
+           *target = db = NewDatabase();
+    } else
+       db = NewDatabase();
+    _XLockMutex(&db->linfo);
+    GetDatabase(db, str, filename, True);
+    _XUnlockMutex(&db->linfo);
+    Xfree(str);
+    if (!override)
+       XrmCombineDatabase(db, target, False);
+    return 1;
+}
+
+/* call the user proc for every value in the table, arbitrary order.
+ * stop if user proc returns True.  level is current depth in database.
+ */
+/*ARGSUSED*/
+static Bool EnumLTable(
+    LTable             table,
+    XrmNameList                names,
+    XrmClassList       classes,
+    register int       level,
+    register EClosure  closure)
+{
+    register VEntry *bucket;
+    register int i;
+    register VEntry entry;
+    XrmValue value;
+    XrmRepresentation type;
+    Bool tightOk;
+
+    closure->bindings[level] = (table->table.tight ?
+                               XrmBindTightly : XrmBindLoosely);
+    closure->quarks[level] = table->table.name;
+    level++;
+    tightOk = !*names;
+    closure->quarks[level + 1] = NULLQUARK;
+    for (i = table->table.mask, bucket = table->buckets;
+        i >= 0;
+        i--, bucket++) {
+       for (entry = *bucket; entry; entry = entry->next) {
+           if (entry->tight && !tightOk)
+               continue;
+           closure->bindings[level] = (entry->tight ?
+                                       XrmBindTightly : XrmBindLoosely);
+           closure->quarks[level] = entry->name;
+           value.size = entry->size;
+           if (entry->string) {
+               type = XrmQString;
+               value.addr = StringValue(entry);
+           } else {
+               type = RepType(entry);
+               value.addr = DataValue(entry);
+           }
+           if ((*closure->proc)(&closure->db, closure->bindings+1,
+                                closure->quarks+1, &type, &value,
+                                closure->closure))
+               return True;
+       }
+    }
+    return False;
+}
+
+static Bool EnumAllNTable(
+    NTable             table,
+    register int       level,
+    register EClosure  closure)
+{
+    register NTable *bucket;
+    register int i;
+    register NTable entry;
+    XrmQuark empty = NULLQUARK;
+
+    if (level >= MAXDBDEPTH)
+       return False;
+    for (i = table->mask, bucket = NodeBuckets(table);
+        i >= 0;
+        i--, bucket++) {
+       for (entry = *bucket; entry; entry = entry->next) {
+           if (entry->leaf) {
+               if (EnumLTable((LTable)entry, &empty, &empty, level, closure))
+                   return True;
+           } else {
+               closure->bindings[level] = (entry->tight ?
+                                           XrmBindTightly : XrmBindLoosely);
+               closure->quarks[level] = entry->name;
+               if (EnumAllNTable(entry, level+1, closure))
+                   return True;
+           }
+       }
+    }
+    return False;
+}
+
+/* recurse on every table in the table, arbitrary order.
+ * stop if user proc returns True.  level is current depth in database.
+ */
+static Bool EnumNTable(
+    NTable             table,
+    XrmNameList                names,
+    XrmClassList       classes,
+    register int       level,
+    register EClosure  closure)
+{
+    register NTable    entry;
+    register XrmQuark  q;
+    register unsigned int leaf;
+    Bool (*get)(
+            NTable             table,
+            XrmNameList                names,
+            XrmClassList       classes,
+            register int       level,
+            EClosure           closure);
+    Bool bilevel;
+
+/* find entries named ename, leafness leaf, tight or loose, and call get */
+#define ITIGHTLOOSE(ename) \
+    NFIND(ename); \
+    if (entry) { \
+       if (leaf == entry->leaf) { \
+           if (!leaf && !entry->tight && entry->next && \
+               entry->next->name == q && entry->next->tight && \
+               (bilevel || entry->next->hasloose) && \
+               EnumLTable((LTable)entry->next, names+1, classes+1, \
+                          level, closure)) \
+               return True; \
+           if ((*get)(entry, names+1, classes+1, level, closure)) \
+               return True; \
+           if (entry->tight && (entry = entry->next) && \
+               entry->name == q && leaf == entry->leaf && \
+               (*get)(entry, names+1, classes+1, level, closure)) \
+               return True; \
+       } else if (entry->leaf) { \
+           if ((bilevel || entry->hasloose) && \
+               EnumLTable((LTable)entry, names+1, classes+1, level, closure))\
+               return True; \
+           if (entry->tight && (entry = entry->next) && \
+               entry->name == q && (bilevel || entry->hasloose) && \
+               EnumLTable((LTable)entry, names+1, classes+1, level, closure))\
+               return True; \
+       } \
+    }
+
+/* find entries named ename, leafness leaf, loose only, and call get */
+#define ILOOSE(ename) \
+    NFIND(ename); \
+    if (entry && entry->tight && (entry = entry->next) && entry->name != q) \
+       entry = (NTable)NULL; \
+    if (entry) { \
+       if (leaf == entry->leaf) { \
+           if ((*get)(entry, names+1, classes+1, level, closure)) \
+               return True; \
+       } else if (entry->leaf && (bilevel || entry->hasloose)) { \
+           if (EnumLTable((LTable)entry, names+1, classes+1, level, closure))\
+               return True; \
+       } \
+    }
+
+    if (level >= MAXDBDEPTH)
+       return False;
+    closure->bindings[level] = (table->tight ?
+                               XrmBindTightly : XrmBindLoosely);
+    closure->quarks[level] = table->name;
+    level++;
+    if (!*names) {
+       if (EnumAllNTable(table, level, closure))
+           return True;
+    } else {
+       if (names[1] || closure->mode == XrmEnumAllLevels) {
+           get = EnumNTable; /* recurse */
+           leaf = 0;
+           bilevel = !names[1];
+       } else {
+           get = (getNTableEProcp)EnumLTable; /* bottom of recursion */
+           leaf = 1;
+           bilevel = False;
+       }
+       if (table->hasloose && closure->mode == XrmEnumAllLevels) {
+           NTable *bucket;
+           int i;
+           XrmQuark empty = NULLQUARK;
+
+           for (i = table->mask, bucket = NodeBuckets(table);
+                i >= 0;
+                i--, bucket++) {
+               q = NULLQUARK;
+               for (entry = *bucket; entry; entry = entry->next) {
+                   if (!entry->tight && entry->name != q &&
+                       entry->name != *names && entry->name != *classes) {
+                       q = entry->name;
+                       if (entry->leaf) {
+                           if (EnumLTable((LTable)entry, &empty, &empty,
+                                          level, closure))
+                               return True;
+                       } else {
+                           if (EnumNTable(entry, &empty, &empty,
+                                          level, closure))
+                               return True;
+                       }
+                   }
+               }
+           }
+       }
+
+       ITIGHTLOOSE(*names);   /* do name, tight and loose */
+       ITIGHTLOOSE(*classes); /* do class, tight and loose */
+       if (table->hasany) {
+           ITIGHTLOOSE(XrmQANY); /* do ANY, tight and loose */
+       }
+       if (table->hasloose) {
+           while (1) {
+               names++;
+               classes++;
+               if (!*names)
+                   break;
+               if (!names[1] && closure->mode != XrmEnumAllLevels) {
+                   get = (getNTableEProcp)EnumLTable; /* bottom of recursion */
+                   leaf = 1;
+               }
+               ILOOSE(*names);   /* loose names */
+               ILOOSE(*classes); /* loose classes */
+               if (table->hasany) {
+                   ILOOSE(XrmQANY); /* loose ANY */
+               }
+           }
+           names--;
+           classes--;
+       }
+    }
+    /* now look for matching leaf nodes */
+    entry = table->next;
+    if (!entry)
+       return False;
+    if (entry->leaf) {
+       if (entry->tight && !table->tight)
+           entry = entry->next;
+    } else {
+       entry = entry->next;
+       if (!entry || !entry->tight)
+           return False;
+    }
+    if (!entry || entry->name != table->name)
+       return False;
+    /* found one */
+    level--;
+    if ((!*names || entry->hasloose) &&
+       EnumLTable((LTable)entry, names, classes, level, closure))
+       return True;
+    if (entry->tight && entry == table->next && (entry = entry->next) &&
+       entry->name == table->name && (!*names || entry->hasloose))
+       return EnumLTable((LTable)entry, names, classes, level, closure);
+    return False;
+
+#undef ITIGHTLOOSE
+#undef ILOOSE
+}
+
+/* call the proc for every value in the database, arbitrary order.
+ * stop if the proc returns True.
+ */
+Bool XrmEnumerateDatabase(
+    XrmDatabase                db,
+    XrmNameList                names,
+    XrmClassList       classes,
+    int                        mode,
+    DBEnumProc         proc,
+    XPointer           closure)
+{
+    XrmBinding  bindings[MAXDBDEPTH+2];
+    XrmQuark   quarks[MAXDBDEPTH+2];
+    register NTable table;
+    EClosureRec        eclosure;
+    Bool retval = False;
+
+    if (!db)
+       return False;
+    _XLockMutex(&db->linfo);
+    eclosure.db = db;
+    eclosure.proc = proc;
+    eclosure.closure = closure;
+    eclosure.bindings = bindings;
+    eclosure.quarks = quarks;
+    eclosure.mode = mode;
+    table = db->table;
+    if (table && !table->leaf && !*names && mode == XrmEnumOneLevel)
+       table = table->next;
+    if (table) {
+       if (!table->leaf)
+           retval = EnumNTable(table, names, classes, 0, &eclosure);
+       else
+           retval = EnumLTable((LTable)table, names, classes, 0, &eclosure);
+    }
+    _XUnlockMutex(&db->linfo);
+    return retval;
+}
+
+static void PrintBindingQuarkList(
+    XrmBindingList      bindings,
+    XrmQuarkList       quarks,
+    FILE               *stream)
+{
+    Bool       firstNameSeen;
+
+    for (firstNameSeen = False; *quarks; bindings++, quarks++) {
+       if (*bindings == XrmBindLoosely) {
+           (void) fprintf(stream, "*");
+       } else if (firstNameSeen) {
+           (void) fprintf(stream, ".");
+       }
+       firstNameSeen = True;
+       (void) fputs(XrmQuarkToString(*quarks), stream);
+    }
+}
+
+/* output out the entry in correct file syntax */
+/*ARGSUSED*/
+static Bool DumpEntry(
+    XrmDatabase                *db,
+    XrmBindingList      bindings,
+    XrmQuarkList       quarks,
+    XrmRepresentation   *type,
+    XrmValuePtr                value,
+    XPointer           data)
+{
+    FILE                       *stream = (FILE *)data;
+    register unsigned int      i;
+    register char              *s;
+    register char              c;
+
+    if (*type != XrmQString)
+       (void) putc('!', stream);
+    PrintBindingQuarkList(bindings, quarks, stream);
+    s = value->addr;
+    i = value->size;
+    if (*type == XrmQString) {
+       (void) fputs(":\t", stream);
+       if (i)
+           i--;
+    }
+    else
+       (void) fprintf(stream, "=%s:\t", XrmRepresentationToString(*type));
+    if (i && (*s == ' ' || *s == '\t'))
+       (void) putc('\\', stream); /* preserve leading whitespace */
+    while (i--) {
+       c = *s++;
+       if (c == '\n') {
+           if (i)
+               (void) fputs("\\n\\\n", stream);
+           else
+               (void) fputs("\\n", stream);
+       } else if (c == '\\')
+           (void) fputs("\\\\", stream);
+       else if ((c < ' ' && c != '\t') ||
+                ((unsigned char)c >= 0x7f && (unsigned char)c < 0xa0))
+           (void) fprintf(stream, "\\%03o", (unsigned char)c);
+       else
+           (void) putc(c, stream);
+    }
+    (void) putc('\n', stream);
+    return ferror(stream) != 0;
+}
+
+#ifdef DEBUG
+
+void PrintTable(
+    NTable table,
+    FILE *file)
+{
+    XrmBinding  bindings[MAXDBDEPTH+1];
+    XrmQuark   quarks[MAXDBDEPTH+1];
+    EClosureRec closure;
+    XrmQuark   empty = NULLQUARK;
+
+    closure.db = (XrmDatabase)NULL;
+    closure.proc = DumpEntry;
+    closure.closure = (XPointer)file;
+    closure.bindings = bindings;
+    closure.quarks = quarks;
+    closure.mode = XrmEnumAllLevels;
+    if (table->leaf)
+       EnumLTable((LTable)table, &empty, &empty, 0, &closure);
+    else
+       EnumNTable(table, &empty, &empty, 0, &closure);
+}
+
+#endif /* DEBUG */
+
+void
+XrmPutFileDatabase(
+    XrmDatabase db,
+    _Xconst char *fileName)
+{
+    FILE       *file;
+    XrmQuark empty = NULLQUARK;
+
+    if (!db) return;
+    if (!(file = fopen(fileName, "w"))) return;
+    if (XrmEnumerateDatabase(db, &empty, &empty, XrmEnumAllLevels,
+                            DumpEntry, (XPointer) file))
+       unlink((char *)fileName);
+    fclose(file);
+}
+
+/* macros used in get/search functions */
+
+/* find entries named ename, leafness leaf, tight or loose, and call get */
+#define GTIGHTLOOSE(ename,looseleaf) \
+    NFIND(ename); \
+    if (entry) { \
+       if (leaf == entry->leaf) { \
+           if (!leaf && !entry->tight && entry->next && \
+               entry->next->name == q && entry->next->tight && \
+               entry->next->hasloose && \
+               looseleaf((LTable)entry->next, names+1, classes+1, closure)) \
+               return True; \
+           if ((*get)(entry, names+1, classes+1, closure)) \
+               return True; \
+           if (entry->tight && (entry = entry->next) && \
+               entry->name == q && leaf == entry->leaf && \
+               (*get)(entry, names+1, classes+1, closure)) \
+               return True; \
+       } else if (entry->leaf) { \
+           if (entry->hasloose && \
+               looseleaf((LTable)entry, names+1, classes+1, closure)) \
+               return True; \
+           if (entry->tight && (entry = entry->next) && \
+               entry->name == q && entry->hasloose && \
+               looseleaf((LTable)entry, names+1, classes+1, closure)) \
+               return True; \
+       } \
+    }
+
+/* find entries named ename, leafness leaf, loose only, and call get */
+#define GLOOSE(ename,looseleaf) \
+    NFIND(ename); \
+    if (entry && entry->tight && (entry = entry->next) && entry->name != q) \
+       entry = (NTable)NULL; \
+    if (entry) { \
+       if (leaf == entry->leaf) { \
+           if ((*get)(entry, names+1, classes+1, closure)) \
+               return True; \
+       } else if (entry->leaf && entry->hasloose) { \
+           if (looseleaf((LTable)entry, names+1, classes+1, closure)) \
+               return True; \
+       } \
+    }
+
+/* add tight/loose entry to the search list, return True if list is full */
+/*ARGSUSED*/
+static Bool AppendLEntry(
+    LTable             table,
+    XrmNameList                names,
+    XrmClassList       classes,
+    register SClosure  closure)
+{
+    /* check for duplicate */
+    if (closure->idx >= 0 && closure->list[closure->idx] == table)
+       return False;
+    if (closure->idx == closure->limit)
+       return True;
+    /* append it */
+    closure->idx++;
+    closure->list[closure->idx] = table;
+    return False;
+}
+
+/* add loose entry to the search list, return True if list is full */
+/*ARGSUSED*/
+static Bool AppendLooseLEntry(
+    LTable             table,
+    XrmNameList                names,
+    XrmClassList       classes,
+    register SClosure  closure)
+{
+    /* check for duplicate */
+    if (closure->idx >= 0 && closure->list[closure->idx] == table)
+       return False;
+    if (closure->idx >= closure->limit - 1)
+       return True;
+    /* append it */
+    closure->idx++;
+    closure->list[closure->idx] = LOOSESEARCH;
+    closure->idx++;
+    closure->list[closure->idx] = table;
+    return False;
+}
+
+/* search for a leaf table */
+static Bool SearchNEntry(
+    NTable             table,
+    XrmNameList                names,
+    XrmClassList       classes,
+    SClosure           closure)
+{
+    register NTable    entry;
+    register XrmQuark  q;
+    register unsigned int leaf;
+    Bool               (*get)(
+            NTable             table,
+            XrmNameList                names,
+            XrmClassList       classes,
+            SClosure           closure);
+
+    if (names[1]) {
+       get = SearchNEntry; /* recurse */
+       leaf = 0;
+    } else {
+       get = (getNTableSProcp)AppendLEntry; /* bottom of recursion */
+       leaf = 1;
+    }
+    GTIGHTLOOSE(*names, AppendLooseLEntry);   /* do name, tight and loose */
+    GTIGHTLOOSE(*classes, AppendLooseLEntry); /* do class, tight and loose */
+    if (table->hasany) {
+       GTIGHTLOOSE(XrmQANY, AppendLooseLEntry); /* do ANY, tight and loose */
+    }
+    if (table->hasloose) {
+       while (1) {
+           names++;
+           classes++;
+           if (!*names)
+               break;
+           if (!names[1]) {
+               get = (getNTableSProcp)AppendLEntry; /* bottom of recursion */
+               leaf = 1;
+           }
+           GLOOSE(*names, AppendLooseLEntry);   /* loose names */
+           GLOOSE(*classes, AppendLooseLEntry); /* loose classes */
+           if (table->hasany) {
+               GLOOSE(XrmQANY, AppendLooseLEntry); /* loose ANY */
+           }
+       }
+    }
+    /* now look for matching leaf nodes */
+    entry = table->next;
+    if (!entry)
+       return False;
+    if (entry->leaf) {
+       if (entry->tight && !table->tight)
+           entry = entry->next;
+    } else {
+       entry = entry->next;
+       if (!entry || !entry->tight)
+           return False;
+    }
+    if (!entry || entry->name != table->name)
+       return False;
+    /* found one */
+    if (entry->hasloose &&
+       AppendLooseLEntry((LTable)entry, names, classes, closure))
+       return True;
+    if (entry->tight && entry == table->next && (entry = entry->next) &&
+       entry->name == table->name && entry->hasloose)
+       return AppendLooseLEntry((LTable)entry, names, classes, closure);
+    return False;
+}
+
+Bool XrmQGetSearchList(
+    XrmDatabase     db,
+    XrmNameList            names,
+    XrmClassList    classes,
+    XrmSearchList   searchList,        /* RETURN */
+    int                    listLength)
+{
+    register NTable    table;
+    SClosureRec                closure;
+
+    if (listLength <= 0)
+       return False;
+    closure.list = (LTable *)searchList;
+    closure.idx = -1;
+    closure.limit = listLength - 2;
+    if (db) {
+       _XLockMutex(&db->linfo);
+       table = db->table;
+       if (*names) {
+           if (table && !table->leaf) {
+               if (SearchNEntry(table, names, classes, &closure)) {
+                   _XUnlockMutex(&db->linfo);
+                   return False;
+               }
+           } else if (table && table->hasloose &&
+                      AppendLooseLEntry((LTable)table, names, classes,
+                                        &closure)) {
+               _XUnlockMutex(&db->linfo);
+               return False;
+           }
+       } else {
+           if (table && !table->leaf)
+               table = table->next;
+           if (table &&
+               AppendLEntry((LTable)table, names, classes, &closure)) {
+               _XUnlockMutex(&db->linfo);
+               return False;
+           }
+       }
+       _XUnlockMutex(&db->linfo);
+    }
+    closure.list[closure.idx + 1] = (LTable)NULL;
+    return True;
+}
+
+Bool XrmQGetSearchResource(
+            XrmSearchList      searchList,
+    register XrmName           name,
+    register XrmClass          class,
+            XrmRepresentation  *pType,  /* RETURN */
+            XrmValue           *pValue) /* RETURN */
+{
+    register LTable *list;
+    register LTable table;
+    register VEntry entry = NULL;
+    int flags;
+
+/* find tight or loose entry */
+#define VTIGHTLOOSE(q) \
+    entry = LeafHash(table, q); \
+    while (entry && entry->name != q) \
+       entry = entry->next; \
+    if (entry) \
+       break
+
+/* find loose entry */
+#define VLOOSE(q) \
+    entry = LeafHash(table, q); \
+    while (entry && entry->name != q) \
+       entry = entry->next; \
+    if (entry) { \
+       if (!entry->tight) \
+           break; \
+       if ((entry = entry->next) && entry->name == q) \
+           break; \
+    }
+
+    list = (LTable *)searchList;
+    /* figure out which combination of name and class we need to search for */
+    flags = 0;
+    if (IsResourceQuark(name))
+       flags = 2;
+    if (IsResourceQuark(class))
+       flags |= 1;
+    if (!flags) {
+       /* neither name nor class has ever been used to name a resource */
+       table = (LTable)NULL;
+    } else if (flags == 3) {
+       /* both name and class */
+       while ((table = *list++)) {
+           if (table != LOOSESEARCH) {
+               VTIGHTLOOSE(name);  /* do name, tight and loose */
+               VTIGHTLOOSE(class); /* do class, tight and loose */
+           } else {
+               table = *list++;
+               VLOOSE(name);  /* do name, loose only */
+               VLOOSE(class); /* do class, loose only */
+           }
+       }
+    } else {
+       /* just one of name or class */
+       if (flags == 1)
+           name = class;
+       while ((table = *list++)) {
+           if (table != LOOSESEARCH) {
+               VTIGHTLOOSE(name); /* tight and loose */
+           } else {
+               table = *list++;
+               VLOOSE(name); /* loose only */
+           }
+       }
+    }
+    if (table) {
+       /* found a match */
+       if (entry->string) {
+           *pType = XrmQString;
+           pValue->addr = StringValue(entry);
+       } else {
+           *pType = RepType(entry);
+           pValue->addr = DataValue(entry);
+       }
+       pValue->size = entry->size;
+       return True;
+    }
+    *pType = NULLQUARK;
+    pValue->addr = (XPointer)NULL;
+    pValue->size = 0;
+    return False;
+
+#undef VTIGHTLOOSE
+#undef VLOOSE
+}
+
+/* look for a tight/loose value */
+static Bool GetVEntry(
+    LTable             table,
+    XrmNameList                names,
+    XrmClassList       classes,
+    VClosure           closure)
+{
+    register VEntry entry;
+    register XrmQuark q;
+
+    /* try name first */
+    q = *names;
+    entry = LeafHash(table, q);
+    while (entry && entry->name != q)
+       entry = entry->next;
+    if (!entry) {
+       /* not found, try class */
+       q = *classes;
+       entry = LeafHash(table, q);
+       while (entry && entry->name != q)
+           entry = entry->next;
+       if (!entry)
+           return False;
+    }
+    if (entry->string) {
+       *closure->type = XrmQString;
+       closure->value->addr = StringValue(entry);
+    } else {
+       *closure->type = RepType(entry);
+       closure->value->addr = DataValue(entry);
+    }
+    closure->value->size = entry->size;
+    return True;
+}
+
+/* look for a loose value */
+static Bool GetLooseVEntry(
+    LTable             table,
+    XrmNameList                names,
+    XrmClassList       classes,
+    VClosure           closure)
+{
+    register VEntry    entry;
+    register XrmQuark  q;
+
+#define VLOOSE(ename) \
+    q = ename; \
+    entry = LeafHash(table, q); \
+    while (entry && entry->name != q) \
+       entry = entry->next; \
+    if (entry && entry->tight && (entry = entry->next) && entry->name != q) \
+       entry = (VEntry)NULL;
+
+    /* bump to last component */
+    while (names[1]) {
+       names++;
+       classes++;
+    }
+    VLOOSE(*names);  /* do name, loose only */
+    if (!entry) {
+       VLOOSE(*classes); /* do class, loose only */
+       if (!entry)
+           return False;
+    }
+    if (entry->string) {
+       *closure->type = XrmQString;
+       closure->value->addr = StringValue(entry);
+    } else {
+       *closure->type = RepType(entry);
+       closure->value->addr = DataValue(entry);
+    }
+    closure->value->size = entry->size;
+    return True;
+
+#undef VLOOSE
+}
+
+/* recursive search for a value */
+static Bool GetNEntry(
+    NTable             table,
+    XrmNameList                names,
+    XrmClassList       classes,
+    VClosure           closure)
+{
+    register NTable    entry;
+    register XrmQuark  q;
+    register unsigned int leaf;
+    Bool               (*get)(
+            NTable              table,
+            XrmNameList         names,
+            XrmClassList        classes,
+            VClosure            closure);
+    NTable             otable;
+
+    if (names[2]) {
+       get = GetNEntry; /* recurse */
+       leaf = 0;
+    } else {
+       get = (getNTableVProcp)GetVEntry; /* bottom of recursion */
+       leaf = 1;
+    }
+    GTIGHTLOOSE(*names, GetLooseVEntry);   /* do name, tight and loose */
+    GTIGHTLOOSE(*classes, GetLooseVEntry); /* do class, tight and loose */
+    if (table->hasany) {
+       GTIGHTLOOSE(XrmQANY, GetLooseVEntry); /* do ANY, tight and loose */
+    }
+    if (table->hasloose) {
+       while (1) {
+           names++;
+           classes++;
+           if (!names[1])
+               break;
+           if (!names[2]) {
+               get = (getNTableVProcp)GetVEntry; /* bottom of recursion */
+               leaf = 1;
+           }
+           GLOOSE(*names, GetLooseVEntry);   /* do name, loose only */
+           GLOOSE(*classes, GetLooseVEntry); /* do class, loose only */
+           if (table->hasany) {
+               GLOOSE(XrmQANY, GetLooseVEntry); /* do ANY, loose only */
+           }
+       }
+    }
+    /* look for matching leaf tables */
+    otable = table;
+    table = table->next;
+    if (!table)
+       return False;
+    if (table->leaf) {
+       if (table->tight && !otable->tight)
+           table = table->next;
+    } else {
+       table = table->next;
+       if (!table || !table->tight)
+           return False;
+    }
+    if (!table || table->name != otable->name)
+       return False;
+    /* found one */
+    if (table->hasloose &&
+       GetLooseVEntry((LTable)table, names, classes, closure))
+       return True;
+    if (table->tight && table == otable->next) {
+       table = table->next;
+       if (table && table->name == otable->name && table->hasloose)
+           return GetLooseVEntry((LTable)table, names, classes, closure);
+    }
+    return False;
+}
+
+Bool XrmQGetResource(
+    XrmDatabase         db,
+    XrmNameList                names,
+    XrmClassList       classes,
+    XrmRepresentation  *pType,  /* RETURN */
+    XrmValuePtr                pValue)  /* RETURN */
+{
+    register NTable table;
+    VClosureRec closure;
+
+    if (db && *names) {
+       _XLockMutex(&db->linfo);
+       closure.type = pType;
+       closure.value = pValue;
+       table = db->table;
+       if (names[1]) {
+           if (table && !table->leaf) {
+               if (GetNEntry(table, names, classes, &closure)) {
+                   _XUnlockMutex(&db->linfo);
+                   return True;
+               }
+           } else if (table && table->hasloose &&
+                   GetLooseVEntry((LTable)table, names, classes, &closure)) {
+               _XUnlockMutex (&db->linfo);
+               return True;
+           }
+       } else {
+           if (table && !table->leaf)
+               table = table->next;
+           if (table && GetVEntry((LTable)table, names, classes, &closure)) {
+               _XUnlockMutex(&db->linfo);
+               return True;
+           }
+       }
+       _XUnlockMutex(&db->linfo);
+    }
+    *pType = NULLQUARK;
+    pValue->addr = (XPointer)NULL;
+    pValue->size = 0;
+    return False;
+}
+
+Bool
+XrmGetResource(XrmDatabase db, _Xconst char *name_str, _Xconst char *class_str,
+              XrmString *pType_str, XrmValuePtr pValue)
+{
+    XrmName            names[MAXDBDEPTH+1];
+    XrmClass           classes[MAXDBDEPTH+1];
+    XrmRepresentation   fromType;
+    Bool               result;
+
+    XrmStringToNameList(name_str, names);
+    XrmStringToClassList(class_str, classes);
+    result = XrmQGetResource(db, names, classes, &fromType, pValue);
+    (*pType_str) = XrmQuarkToString(fromType);
+    return result;
+}
+
+/* destroy all values, plus table itself */
+static void DestroyLTable(
+    LTable table)
+{
+    register int i;
+    register VEntry *buckets;
+    register VEntry entry, next;
+
+    buckets = table->buckets;
+    for (i = table->table.mask; i >= 0; i--, buckets++) {
+       for (next = *buckets; (entry = next); ) {
+           next = entry->next;
+           Xfree((char *)entry);
+       }
+    }
+    Xfree((char *)table->buckets);
+    Xfree((char *)table);
+}
+
+/* destroy all contained tables, plus table itself */
+static void DestroyNTable(
+    NTable table)
+{
+    register int i;
+    register NTable *buckets;
+    register NTable entry, next;
+
+    buckets = NodeBuckets(table);
+    for (i = table->mask; i >= 0; i--, buckets++) {
+       for (next = *buckets; (entry = next); ) {
+           next = entry->next;
+           if (entry->leaf)
+               DestroyLTable((LTable)entry);
+           else
+               DestroyNTable(entry);
+       }
+    }
+    Xfree((char *)table);
+}
+
+const char *
+XrmLocaleOfDatabase(
+    XrmDatabase db)
+{
+    const char* retval;
+    _XLockMutex(&db->linfo);
+    retval = (*db->methods->lcname)(db->mbstate);
+    _XUnlockMutex(&db->linfo);
+    return retval;
+}
+
+void XrmDestroyDatabase(
+    XrmDatabase   db)
+{
+    register NTable table, next;
+
+    if (db) {
+       _XLockMutex(&db->linfo);
+       for (next = db->table; (table = next); ) {
+           next = table->next;
+           if (table->leaf)
+               DestroyLTable((LTable)table);
+           else
+               DestroyNTable(table);
+       }
+       _XUnlockMutex(&db->linfo);
+       _XFreeMutex(&db->linfo);
+       (*db->methods->destroy)(db->mbstate);
+       Xfree((char *)db);
+    }
+}
diff --git a/src/Xxcbint.h b/src/Xxcbint.h
new file mode 100644 (file)
index 0000000..a8c9a67
--- /dev/null
@@ -0,0 +1,49 @@
+/* Copyright (C) 2003-2006 Jamey Sharp, Josh Triplett
+ * This file is licensed under the MIT license. See the file COPYING. */
+
+#ifndef XXCBINT_H
+#define XXCBINT_H
+
+#include <assert.h>
+#include <stdint.h>
+#include <X11/Xlibint.h>
+#ifdef WIN32
+#include <X11/Xwindows.h>
+#endif
+#include <X11/Xlib-xcb.h>
+#include "locking.h"
+
+#define XLIB_SEQUENCE_COMPARE(a,op,b)  (((long) (a) - (long) (b)) op 0)
+
+typedef struct PendingRequest PendingRequest;
+struct PendingRequest {
+       PendingRequest *next;
+       unsigned long sequence;
+       unsigned reply_waiter;
+};
+
+typedef struct _X11XCBPrivate {
+       xcb_connection_t *connection;
+       PendingRequest *pending_requests;
+       PendingRequest *pending_requests_tail;
+       xcb_generic_event_t *next_event;
+       char *real_bufmax;
+       char *reply_data;
+       int reply_length;
+       int reply_consumed;
+       uint64_t last_flushed;
+       enum XEventQueueOwner event_owner;
+       XID next_xid;
+
+       /* handle simultaneous threads waiting for responses */
+       xcondition_t event_notify;
+       int event_waiter;
+       xcondition_t reply_notify;
+} _X11XCBPrivate;
+
+/* xcb_disp.c */
+
+int _XConnectXCB(Display *dpy, _Xconst char *display, int *screenp);
+void _XFreeX11XCBStructure(Display *dpy);
+
+#endif /* XXCBINT_H */
diff --git a/src/evtomask.c b/src/evtomask.c
new file mode 100644 (file)
index 0000000..b108d2a
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+
+Copyright 1987, 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 <X11/X.h>
+
+/*
+ * This array can be used given an event type to determine the mask bits
+ * that could have generated it.
+ */
+long const _Xevent_to_mask [LASTEvent] = {
+       0,                                              /* no event 0 */
+       0,                                              /* no event 1 */
+       KeyPressMask,                                   /* KeyPress */
+       KeyReleaseMask,                                 /* KeyRelease */
+       ButtonPressMask,                                /* ButtonPress */
+       ButtonReleaseMask,                              /* ButtonRelease */
+       PointerMotionMask|PointerMotionHintMask|Button1MotionMask|
+               Button2MotionMask|Button3MotionMask|Button4MotionMask|
+               Button5MotionMask|ButtonMotionMask,     /* MotionNotify */
+       EnterWindowMask,                                /* EnterNotify */
+       LeaveWindowMask,                                /* LeaveNotify */
+       FocusChangeMask,                                /* FocusIn */
+       FocusChangeMask,                                /* FocusOut */
+       KeymapStateMask,                                /* KeymapNotify */
+       ExposureMask,                                   /* Expose */
+       ExposureMask,                                   /* GraphicsExpose */
+       ExposureMask,                                   /* NoExpose */
+       VisibilityChangeMask,                           /* VisibilityNotify */
+       SubstructureNotifyMask,                         /* CreateNotify */
+       StructureNotifyMask|SubstructureNotifyMask,     /* DestroyNotify */
+       StructureNotifyMask|SubstructureNotifyMask,     /* UnmapNotify */
+       StructureNotifyMask|SubstructureNotifyMask,     /* MapNotify */
+       SubstructureRedirectMask,                       /* MapRequest */
+       SubstructureNotifyMask|StructureNotifyMask,     /* ReparentNotify */
+       StructureNotifyMask|SubstructureNotifyMask,     /* ConfigureNotify */
+       SubstructureRedirectMask,                       /* ConfigureRequest */
+       SubstructureNotifyMask|StructureNotifyMask,     /* GravityNotify */
+       ResizeRedirectMask,                             /* ResizeRequest */
+       SubstructureNotifyMask|StructureNotifyMask,     /* CirculateNotify */
+       SubstructureRedirectMask,                       /* CirculateRequest */
+       PropertyChangeMask,                             /* PropertyNotify */
+       0,                                              /* SelectionClear */
+       0,                                              /* SelectionRequest */
+       0,                                              /* SelectionNotify */
+       ColormapChangeMask,                             /* ColormapNotify */
+       0,                                              /* ClientMessage */
+       0,                                              /* MappingNotify */
+};
diff --git a/src/globals.c b/src/globals.c
new file mode 100644 (file)
index 0000000..89e38a7
--- /dev/null
@@ -0,0 +1,235 @@
+/*
+
+Copyright 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.
+
+*/
+
+/*
+ *
+ *                                 Global data
+ *
+ * This file should contain only those objects which must be predefined.
+ */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <X11/Xlibint.h>
+
+
+/*
+ * If possible, it is useful to have the global data default to a null value.
+ * Some shared library implementations are *much* happier if there isn't any
+ * global initialized data.
+ */
+#ifdef NULL_NOT_ZERO                   /* then need to initialize */
+#define SetZero(t,var,z) t var = z
+#else
+#define SetZero(t,var,z) t var
+#endif
+
+#ifdef USL_SHAREDLIB                   /* then need extra variables */
+/*
+ * If we need to define extra variables for each global
+ */
+#if !defined(UNIXCPP) || defined(ANSICPP)
+#define ZEROINIT(t,var,val) SetZero(t,var,val); \
+  SetZero (long, _libX_##var##Flag, 0); \
+  SetZero (void *, _libX_##var##Ptr, NULL)
+#else /* else pcc concatenation */
+#define ZEROINIT(t,var,val) SetZero(t,var,val); \
+  SetZero (long, _libX_/**/var/**/Flag, 0); \
+  SetZero (void *, _libX_/**/var/**/Ptr, NULL)
+#endif /* concat ANSI C vs. pcc */
+
+#else /* else not USL_SHAREDLIB */
+/*
+ * no extra crud
+ */
+#define ZEROINIT(t,var,val) SetZero (t, var, val)
+
+#endif /* USL_SHAREDLIB */
+
+
+/*
+ * Error handlers; used to be in XlibInt.c
+ */
+ZEROINIT (XErrorHandler, _XErrorFunction, NULL);
+ZEROINIT (XIOErrorHandler, _XIOErrorFunction, NULL);
+ZEROINIT (_XQEvent *, _qfree, NULL);
+
+
+/*
+ * Debugging information and display list; used to be in XOpenDis.c
+ */
+ZEROINIT (int, _Xdebug, 0);
+ZEROINIT (Display *, _XHeadOfDisplayList, NULL);
+
+
+
+#if 0
+#ifdef STREAMSCONN
+
+
+/* The following are how the Xstream connections are used:              */
+/*      1)      Local connections over pseudo-tty ports.                */
+/*      2)      SVR4 local connections using named streams or SVR3.2    */
+/*              local connections using streams.                        */
+/*      3)      SVR4 stream pipe code. This code is proprietary and     */
+/*              the actual code is not included in the XC distribution. */
+/*      4)      remote connections using tcp                            */
+/*      5)      remote connections using StarLan                        */
+
+/*
+ * descriptor block for streams connections
+ */
+
+#include "Xstreams.h"
+
+char _XsTypeOfStream[100] = { 0 };
+
+extern int write();
+extern int close();
+#ifdef SVR4
+extern int _XsSetupSpStream();
+extern int _XsSetupNamedStream();
+#endif
+extern int _XsSetupLocalStream();
+extern int _XsConnectLocalClient();
+extern int _XsCallLocalServer();
+extern int _XsReadLocalStream();
+extern int _XsErrorCall();
+extern int _XsWriteLocalStream();
+extern int _XsCloseLocalStream();
+extern int _XsSetupTliStream();
+extern int _XsConnectTliClient();
+extern int _XsCallTliServer();
+extern int _XsReadTliStream();
+extern int _XsWriteTliStream();
+extern int _XsCloseTliStream();
+
+
+Xstream _XsStream[] = {
+
+    {
+       /* local connections using pseudo-ttys */
+
+       _XsSetupLocalStream,
+       _XsConnectLocalClient,
+       _XsCallLocalServer,
+       _XsReadLocalStream,
+       _XsErrorCall,
+       write,
+       close,
+       NULL
+    },
+    {
+#ifdef SVR4
+       /* local connections using named streams */
+
+        _XsSetupNamedStream,
+#else
+       /* local connections using streams */
+        _XsSetupLocalStream,
+#endif
+        _XsConnectLocalClient,
+        _XsCallLocalServer,
+        _XsReadLocalStream,
+        _XsErrorCall,
+        write,
+        close,
+        NULL
+    },
+    /* Enhanced Application Compatibility Support */
+    {
+#ifdef SVR4
+       /* SVR4 stream pipe code */
+       _XsSetupSpStream,
+#else
+       _XsSetupLocalStream,
+#endif
+       _XsConnectLocalClient,
+       _XsCallLocalServer,
+       _XsReadLocalStream,
+       _XsErrorCall,
+       write,
+       close,
+       NULL
+    },
+    /* End Enhanced Application Compatibility Support */
+
+    {
+       /* remote connections using tcp */
+        _XsSetupTliStream,
+        _XsConnectTliClient,
+        _XsCallTliServer,
+        _XsReadLocalStream,
+        _XsErrorCall,
+       write,
+       close,
+       NULL
+    },
+    {
+       /* remote connections using StarLan */
+        _XsSetupTliStream,
+        _XsConnectTliClient,
+        _XsCallTliServer,
+        _XsReadLocalStream,
+        _XsErrorCall,
+        write,
+        close,
+        NULL
+    }
+};
+
+
+#endif /* STREAMSCONN */
+#endif
+
+
+#ifdef XTEST1
+/*
+ * Stuff for input synthesis extension:
+ */
+/*
+ * Holds the two event type codes for this extension.  The event type codes
+ * for this extension may vary depending on how many extensions are installed
+ * already, so the initial values given below will be added to the base event
+ * code that is aquired when this extension is installed.
+ *
+ * These two variables must be available to programs that use this extension.
+ */
+int                    XTestInputActionType = 0;
+int                    XTestFakeAckType   = 1;
+#endif
+
+/*
+ * NOTE: any additional external definition NEED
+ * to be inserted BELOW this point!!!
+ */
+
+/*
+ * NOTE: any additional external definition NEED
+ * to be inserted ABOVE this point!!!
+ */
diff --git a/src/imConv.c b/src/imConv.c
new file mode 100644 (file)
index 0000000..c3c1974
--- /dev/null
@@ -0,0 +1,356 @@
+/******************************************************************
+
+              Copyright 1991, 1992 by Fuji Xerox Co.,Ltd.
+             Copyright 1993, 1994 by FUJITSU LIMITED
+
+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 Fuji Xerox Co.,Ltd.
+, and that the name of FUJITSU LIMITED not be used in advertising or
+publicity pertaining to distribution of the software without specific,
+ written prior permission.
+Fuji Xerox Co.,Ltd. , and FUJITSU LIMITED makes no representations about
+the suitability of this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+FUJI XEROX CO.,LTD. AND FUJITSU LIMITED DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL FUJI XEROX CO.,LTD.
+AND FUJITSU LIMITED 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.
+
+  Auther:   Kazunori Nishihara, Fuji Xerox Co.,Ltd.
+                                kaz@ssdev.ksp.fujixerox.co.jp
+  Modifier: Takashi Fujiwara    FUJITSU LIMITED
+                                fujiwara@a80.tech.yk.fujitsu.co.jp
+
+******************************************************************/
+/* 2000 Modifier: Ivan Pascal  The XFree86 Project.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "Ximint.h"
+#include "XlcPubI.h"
+
+#ifdef XKB
+/*
+ * rather than just call _XLookupString (i.e. the pre-XKB XLookupString)
+ * do this because with XKB the event may have some funky modifiers that
+ * _XLookupString doesn't grok.
+ */
+#include "XKBlib.h"
+#define        XLOOKUPSTRING lookup_string
+#else
+#define        XLOOKUPSTRING XLookupString
+#endif
+
+typedef unsigned int ucs4_t;
+
+typedef int (*ucstocsConvProc)(
+    XPointer,
+    unsigned char *,
+    ucs4_t,
+    int
+);
+
+struct SubstRec {
+    const char encoding_name[8];
+    const char charset_name[12];
+};
+
+static const struct SubstRec SubstTable[] = {
+    {"STRING", "ISO8859-1"},
+    {"TIS620", "TIS620-0"},
+    {"UTF-8",  "ISO10646-1"}
+};
+#define num_substitute (sizeof SubstTable / sizeof SubstTable[0])
+
+/*
+ * Given the name of a charset, returns the pointer to convertors
+ * from UCS char to specified charset char.
+ * This converter is needed for _XimGetCharCode subroutine.
+ */
+XPointer
+_XimGetLocaleCode (
+    _Xconst char*      encoding_name)
+{
+    XPointer cvt = _Utf8GetConvByName(encoding_name);
+    if (!cvt && encoding_name) {
+       int i;
+       for (i = 0; i < num_substitute; i++)
+           if (!strcmp(encoding_name, SubstTable[i].encoding_name))
+               return _Utf8GetConvByName(SubstTable[i].charset_name);
+    }
+    return cvt;
+}
+
+/*
+ * Returns the locale dependent representation of a keysym.
+ * The locale's encoding is passed in form of pointer to UCS convertor.
+ * The resulting multi-byte sequence is placed starting at buf (a buffer
+ * with nbytes bytes, nbytes should be >= 8) and is NUL terminated.
+ * Returns the length of the resulting multi-byte sequence, excluding the
+ * terminating NUL byte. Return 0 if the keysym is not representable in the
+ * locale
+ */
+/*ARGSUSED*/
+int
+_XimGetCharCode (
+    XPointer            ucs_conv,
+    KeySym             keysym,
+    unsigned char*     buf,
+    int                nbytes)
+{
+    int count = 0;
+    ucstocsConvProc cvt = (ucstocsConvProc) ucs_conv;
+    ucs4_t ucs4;
+
+    if (keysym < 0x80) {
+        buf[0] = (char) keysym;
+        count = 1;
+    } else if (cvt) {
+        ucs4 = KeySymToUcs4(keysym);
+        if (ucs4)
+            count = (*cvt)((XPointer)NULL, buf, ucs4, nbytes);
+    }
+
+    if (count < 0)
+               count = 0;
+    if (count>nbytes)
+        return nbytes;
+    if (count<nbytes)
+        buf[count]= '\0';
+    return count;
+}
+
+#ifdef XKB
+static int lookup_string(
+    XKeyEvent*         event,
+    char*              buffer,
+    int                        nbytes,
+    KeySym*            keysym,
+    XComposeStatus*    status)
+{
+    int ret;
+    unsigned ctrls = XkbGetXlibControls (event->display);
+    XkbSetXlibControls (event->display,
+                       XkbLC_ForceLatin1Lookup, XkbLC_ForceLatin1Lookup);
+    ret = XLookupString(event, (char *)buffer, nbytes, keysym, status);
+    XkbSetXlibControls (event->display,
+                       XkbLC_ForceLatin1Lookup, ctrls);
+    return ret;
+}
+#endif
+
+#define BUF_SIZE (20)
+
+int
+_XimLookupMBText(
+    Xic                         ic,
+    XKeyEvent*         event,
+    char*              buffer,
+    int                        nbytes,
+    KeySym*            keysym,
+    XComposeStatus*    status)
+{
+    int count;
+    KeySym symbol;
+    Status     dummy;
+    Xim        im = (Xim)ic->core.im;
+    XimCommonPrivateRec* private = &im->private.common;
+    unsigned char look[BUF_SIZE];
+    ucs4_t ucs4;
+
+    /* force a latin-1 lookup for compatibility */
+    count = XLOOKUPSTRING(event, (char *)buffer, nbytes, &symbol, status);
+    if (keysym != NULL) *keysym = symbol;
+    if ((nbytes == 0) || (symbol == NoSymbol)) return count;
+
+    if (count > 1) {
+       memcpy(look, (char *)buffer,count);
+       look[count] = '\0';
+       if ((count = im->methods->ctstombs(ic->core.im,
+                               (char*) look, count,
+                               buffer, nbytes, &dummy)) < 0) {
+           count = 0;
+       }
+    } else if ((count == 0) ||
+              (count == 1 && (symbol > 0x7f && symbol < 0xff00))) {
+
+        XPointer from = (XPointer) &ucs4;
+        XPointer to =   (XPointer) look;
+        int from_len = 1;
+        int to_len = BUF_SIZE;
+        XPointer args[1];
+        XlcCharSet charset;
+        args[0] = (XPointer) &charset;
+        ucs4 = (ucs4_t) KeySymToUcs4(symbol);
+        if (!ucs4)
+            return 0;
+
+       if (_XlcConvert(private->ucstoc_conv,
+                        &from, &from_len, &to, &to_len,
+                        args, 1 ) != 0) {
+           count = 0;
+       } else {
+            from = (XPointer) look;
+            to =   (XPointer) buffer;
+            from_len = BUF_SIZE - to_len;
+            to_len = nbytes;
+            args[0] = (XPointer) charset;
+           if (_XlcConvert(private->cstomb_conv,
+                            &from, &from_len, &to, &to_len,
+                           args, 1 ) != 0) {
+               count = 0;
+           } else {
+                count = nbytes - to_len;
+           }
+       }
+    }
+    /* FIXME:
+     * we should make sure that if the character is a Latin1 character
+     * and it's on the right side, and we're in a non-Latin1 locale
+     * that this is a valid Latin1 character for this locale.
+     */
+    return count;
+}
+
+int
+_XimLookupWCText(
+    Xic                         ic,
+    XKeyEvent*         event,
+    wchar_t*           buffer,
+    int                        nbytes,
+    KeySym*            keysym,
+    XComposeStatus*    status)
+{
+    int count;
+    KeySym symbol;
+    Status     dummy;
+    Xim        im = (Xim)ic->core.im;
+    XimCommonPrivateRec* private = &im->private.common;
+    unsigned char look[BUF_SIZE];
+    ucs4_t ucs4;
+
+    /* force a latin-1 lookup for compatibility */
+    count = XLOOKUPSTRING(event, (char *)look, nbytes, &symbol, status);
+    if (keysym != NULL) *keysym = symbol;
+    if ((nbytes == 0) || (symbol == NoSymbol)) return count;
+
+    if (count > 1) {
+       if ((count = im->methods->ctstowcs(ic->core.im,
+                               (char*) look, count,
+                               buffer, nbytes, &dummy)) < 0) {
+           count = 0;
+       }
+    } else if ((count == 0) ||
+              (count == 1 && (symbol > 0x7f && symbol < 0xff00))) {
+
+        XPointer from = (XPointer) &ucs4;
+        XPointer to =   (XPointer) look;
+        int from_len = 1;
+        int to_len = BUF_SIZE;
+        XPointer args[1];
+        XlcCharSet charset;
+        args[0] = (XPointer) &charset;
+        ucs4 = (ucs4_t) KeySymToUcs4(symbol);
+        if (!ucs4)
+            return 0;
+
+       if (_XlcConvert(private->ucstoc_conv,
+                        &from, &from_len, &to, &to_len,
+                        args, 1 ) != 0) {
+           count = 0;
+       } else {
+            from = (XPointer) look;
+            to =   (XPointer) buffer;
+            from_len = BUF_SIZE - to_len;
+            to_len = nbytes;
+            args[0] = (XPointer) charset;
+
+           if (_XlcConvert(private->cstowc_conv,
+                            &from, &from_len, &to, &to_len,
+                           args, 1 ) != 0) {
+               count = 0;
+           } else {
+                count = nbytes - to_len;
+           }
+       }
+    } else
+       /* FIXME:
+        * we should make sure that if the character is a Latin1 character
+        * and it's on the right side, and we're in a non-Latin1 locale
+        * that this is a valid Latin1 character for this locale.
+        */
+       buffer[0] = look[0];
+
+    return count;
+}
+
+int
+_XimLookupUTF8Text(
+    Xic                         ic,
+    XKeyEvent*         event,
+    char*              buffer,
+    int                        nbytes,
+    KeySym*            keysym,
+    XComposeStatus*    status)
+{
+    int count;
+    KeySym symbol;
+    Status     dummy;
+    Xim        im = (Xim)ic->core.im;
+    XimCommonPrivateRec* private = &im->private.common;
+    unsigned char look[BUF_SIZE];
+    ucs4_t ucs4;
+
+    /* force a latin-1 lookup for compatibility */
+    count = XLOOKUPSTRING(event, (char *)buffer, nbytes, &symbol, status);
+    if (keysym != NULL) *keysym = symbol;
+    if ((nbytes == 0) || (symbol == NoSymbol)) return count;
+
+    if (count > 1) {
+       memcpy(look, (char *)buffer,count);
+       look[count] = '\0';
+       if ((count = im->methods->ctstoutf8(ic->core.im,
+                               (char*) look, count,
+                               buffer, nbytes, &dummy)) < 0) {
+           count = 0;
+       }
+    } else if ((count == 0) ||
+              (count == 1 && (symbol > 0x7f && symbol < 0xff00))) {
+
+        XPointer from = (XPointer) &ucs4;
+        int from_len = 1;
+        XPointer to = (XPointer) buffer;
+        int to_len = nbytes;
+
+        ucs4 = (ucs4_t) KeySymToUcs4(symbol);
+        if (!ucs4)
+            return 0;
+
+       if (_XlcConvert(private->ucstoutf8_conv,
+                        &from, &from_len, &to, &to_len,
+                        NULL, 0) != 0) {
+           count = 0;
+       } else {
+            count = nbytes - to_len;
+       }
+    }
+    /* FIXME:
+     * we should make sure that if the character is a Latin1 character
+     * and it's on the right side, and we're in a non-Latin1 locale
+     * that this is a valid Latin1 character for this locale.
+     */
+    return count;
+}
diff --git a/src/locking.c b/src/locking.c
new file mode 100644 (file)
index 0000000..b3dfb3b
--- /dev/null
@@ -0,0 +1,625 @@
+/*
+
+Copyright 1992, 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.
+
+*/
+
+/*
+ * Author: Stephen Gildea, MIT X Consortium
+ *
+ * locking.c - multi-thread locking routines implemented in C Threads
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#undef _XLockMutex
+#undef _XUnlockMutex
+#undef _XCreateMutex
+#undef _XFreeMutex
+
+#ifdef XTHREADS
+
+#ifdef __UNIXWARE__
+#include <dlfcn.h>
+#endif
+
+#include "Xprivate.h"
+#include "locking.h"
+#ifdef XTHREADS_WARN
+#include <stdio.h>             /* for warn/debug stuff */
+#endif
+
+/* Additional arguments for source code location lock call was made from */
+#if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE)
+# define XTHREADS_FILE_LINE_ARGS \
+    ,                                                          \
+    char* file,                        /* source file, from macro */   \
+    int line
+#else
+# define XTHREADS_FILE_LINE_ARGS /* None */
+#endif
+
+
+#define NUM_FREE_CVLS 4
+
+/* in lcWrap.c */
+extern LockInfoPtr _Xi18n_lock;
+
+#ifdef WIN32
+static DWORD _X_TlsIndex = (DWORD)-1;
+
+void _Xthread_init(void)
+{
+    if (_X_TlsIndex == (DWORD)-1)
+       _X_TlsIndex = TlsAlloc();
+}
+
+struct _xthread_waiter *
+_Xthread_waiter(void)
+{
+    struct _xthread_waiter *me;
+
+    if (!(me = TlsGetValue(_X_TlsIndex))) {
+       me = (struct _xthread_waiter *)xmalloc(sizeof(struct _xthread_waiter));
+       me->sem = CreateSemaphore(NULL, 0, 1, NULL);
+       me->next = NULL;
+       TlsSetValue(_X_TlsIndex, me);
+    }
+    return me;
+}
+#endif /* WIN32 */
+
+static xthread_t _Xthread_self(void)
+{
+    return xthread_self();
+}
+
+static LockInfoRec global_lock;
+static LockInfoRec i18n_lock;
+
+static void _XLockMutex(
+    LockInfoPtr lip
+    XTHREADS_FILE_LINE_ARGS
+    )
+{
+    xmutex_lock(lip->lock);
+}
+
+static void _XUnlockMutex(
+    LockInfoPtr lip
+    XTHREADS_FILE_LINE_ARGS
+    )
+{
+    xmutex_unlock(lip->lock);
+}
+
+static void _XCreateMutex(
+    LockInfoPtr lip)
+{
+    lip->lock = xmutex_malloc();
+    if (lip->lock) {
+       xmutex_init(lip->lock);
+       xmutex_set_name(lip->lock, "Xlib");
+    }
+}
+
+static void _XFreeMutex(
+    LockInfoPtr lip)
+{
+    xmutex_clear(lip->lock);
+    xmutex_free(lip->lock);
+}
+
+#ifdef XTHREADS_WARN
+static char *locking_file;
+static int locking_line;
+static xthread_t locking_thread;
+static Bool xlibint_unlock = False; /* XlibInt.c may Unlock and re-Lock */
+
+/* history that is useful to examine in a debugger */
+#define LOCK_HIST_SIZE 21
+
+static struct {
+    Bool lockp;                        /* True for lock, False for unlock */
+    xthread_t thread;
+    char *file;
+    int line;
+} locking_history[LOCK_HIST_SIZE];
+
+int lock_hist_loc = 0;         /* next slot to fill */
+
+static void _XLockDisplayWarn(
+    Display *dpy,
+    char *file,                        /* source file, from macro */
+    int line)
+{
+    xthread_t self;
+    xthread_t old_locker;
+
+    self = xthread_self();
+    old_locker = locking_thread;
+    if (xthread_have_id(old_locker)) {
+       if (xthread_equal(old_locker, self))
+           printf("Xlib ERROR: %s line %d thread %x: locking display already locked at %s line %d\n",
+                  file, line, self, locking_file, locking_line);
+#ifdef XTHREADS_DEBUG
+       else
+           printf("%s line %d: thread %x waiting on lock held by %s line %d thread %x\n",
+                  file, line, self,
+                  locking_file, locking_line, old_locker);
+#endif /* XTHREADS_DEBUG */
+    }
+
+    xmutex_lock(dpy->lock->mutex);
+
+    if (strcmp(file, "XlibInt.c") == 0) {
+       if (!xlibint_unlock)
+           printf("Xlib ERROR: XlibInt.c line %d thread %x locking display it did not unlock\n",
+                  line, self);
+       xlibint_unlock = False;
+    }
+
+#ifdef XTHREADS_DEBUG
+    /* if (old_locker  &&  old_locker != self) */
+    if (strcmp("XClearArea.c", file) && strcmp("XDrSegs.c", file)) /* ico */
+       printf("%s line %d: thread %x got display lock\n", file, line, self);
+#endif /* XTHREADS_DEBUG */
+
+    locking_thread = self;
+    if (strcmp(file, "XlibInt.c") != 0) {
+       locking_file = file;
+       locking_line = line;
+    }
+    locking_history[lock_hist_loc].file = file;
+    locking_history[lock_hist_loc].line = line;
+    locking_history[lock_hist_loc].thread = self;
+    locking_history[lock_hist_loc].lockp = True;
+    lock_hist_loc++;
+    if (lock_hist_loc >= LOCK_HIST_SIZE)
+       lock_hist_loc = 0;
+}
+#endif /* XTHREADS_WARN */
+
+static void _XUnlockDisplay(
+    Display *dpy
+    XTHREADS_FILE_LINE_ARGS
+    )
+{
+#ifdef XTHREADS_WARN
+    xthread_t self = xthread_self();
+
+#ifdef XTHREADS_DEBUG
+    if (strcmp("XClearArea.c", file) && strcmp("XDrSegs.c", file)) /* ico */
+       printf("%s line %d: thread %x unlocking display\n", file, line, self);
+#endif /* XTHREADS_DEBUG */
+
+    if (!xthread_have_id(locking_thread))
+       printf("Xlib ERROR: %s line %d thread %x: unlocking display that is not locked\n",
+              file, line, self);
+    else if (strcmp(file, "XlibInt.c") == 0)
+       xlibint_unlock = True;
+#ifdef XTHREADS_DEBUG
+    else if (strcmp(file, locking_file) != 0)
+       /* not always an error because locking_file is not per-thread */
+       printf("%s line %d: unlocking display locked from %s line %d (probably okay)\n",
+              file, line, locking_file, locking_line);
+#endif /* XTHREADS_DEBUG */
+    xthread_clear_id(locking_thread);
+
+    locking_history[lock_hist_loc].file = file;
+    locking_history[lock_hist_loc].line = line;
+    locking_history[lock_hist_loc].thread = self;
+    locking_history[lock_hist_loc].lockp = False;
+    lock_hist_loc++;
+    if (lock_hist_loc >= LOCK_HIST_SIZE)
+       lock_hist_loc = 0;
+#endif /* XTHREADS_WARN */
+    xmutex_unlock(dpy->lock->mutex);
+}
+
+
+static struct _XCVList *_XCreateCVL(
+    Display *dpy)
+{
+    struct _XCVList *cvl;
+
+    if ((cvl = dpy->lock->free_cvls) != NULL) {
+       dpy->lock->free_cvls = cvl->next;
+       dpy->lock->num_free_cvls--;
+    } else {
+       cvl = (struct _XCVList *)Xmalloc(sizeof(struct _XCVList));
+       if (!cvl)
+           return NULL;
+       cvl->cv = xcondition_malloc();
+       if (!cvl->cv) {
+           Xfree(cvl);
+           return NULL;
+       }
+       xcondition_init(cvl->cv);
+       xcondition_set_name(cvl->cv, "Xlib read queue");
+    }
+    cvl->next = NULL;
+    return cvl;
+}
+
+/* Put ourselves on the queue to read the connection.
+   Allocates and returns a queue element. */
+
+static struct _XCVList *
+_XPushReader(
+    Display *dpy,
+    struct _XCVList ***tail)
+{
+    struct _XCVList *cvl;
+
+    cvl = _XCreateCVL(dpy);
+#ifdef XTHREADS_DEBUG
+    printf("_XPushReader called in thread %x, pushing %x\n",
+          xthread_self(), cvl);
+#endif
+    **tail = cvl;
+    *tail = &cvl->next;
+    return cvl;
+}
+
+/* signal the next thread waiting to read the connection */
+
+static void _XPopReader(
+    Display *dpy,
+    struct _XCVList **list,
+    struct _XCVList ***tail)
+{
+    register struct _XCVList *front = *list;
+
+#ifdef XTHREADS_DEBUG
+    printf("_XPopReader called in thread %x, popping %x\n",
+          xthread_self(), front);
+#endif
+
+    if (dpy->flags & XlibDisplayProcConni)
+       /* we never added ourself in the first place */
+       return;
+
+    if (front) {               /* check "front" for paranoia */
+       *list = front->next;
+       if (*tail == &front->next)      /* did we free the last elt? */
+           *tail = list;
+       if (dpy->lock->num_free_cvls < NUM_FREE_CVLS) {
+           front->next = dpy->lock->free_cvls;
+           dpy->lock->free_cvls = front;
+           dpy->lock->num_free_cvls++;
+       } else {
+           xcondition_clear(front->cv);
+           Xfree((char *)front->cv);
+           Xfree((char *)front);
+       }
+    }
+
+    /* signal new front after it is in place */
+    if ((dpy->lock->reply_first = (dpy->lock->reply_awaiters != NULL))) {
+       ConditionSignal(dpy, dpy->lock->reply_awaiters->cv);
+    } else if (dpy->lock->event_awaiters) {
+       ConditionSignal(dpy, dpy->lock->event_awaiters->cv);
+    }
+}
+
+static void _XConditionWait(
+    xcondition_t cv,
+    xmutex_t mutex
+    XTHREADS_FILE_LINE_ARGS
+    )
+{
+#ifdef XTHREADS_WARN
+    xthread_t self = xthread_self();
+    char *old_file = locking_file;
+    int old_line = locking_line;
+
+#ifdef XTHREADS_DEBUG
+    printf("line %d thread %x in condition wait\n", line, self);
+#endif
+    xthread_clear_id(locking_thread);
+
+    locking_history[lock_hist_loc].file = file;
+    locking_history[lock_hist_loc].line = line;
+    locking_history[lock_hist_loc].thread = self;
+    locking_history[lock_hist_loc].lockp = False;
+    lock_hist_loc++;
+    if (lock_hist_loc >= LOCK_HIST_SIZE)
+       lock_hist_loc = 0;
+#endif /* XTHREADS_WARN */
+
+    xcondition_wait(cv, mutex);
+
+#ifdef XTHREADS_WARN
+    locking_thread = self;
+    locking_file = old_file;
+    locking_line = old_line;
+
+    locking_history[lock_hist_loc].file = file;
+    locking_history[lock_hist_loc].line = line;
+    locking_history[lock_hist_loc].thread = self;
+    locking_history[lock_hist_loc].lockp = True;
+    lock_hist_loc++;
+    if (lock_hist_loc >= LOCK_HIST_SIZE)
+       lock_hist_loc = 0;
+#ifdef XTHREADS_DEBUG
+    printf("line %d thread %x was signaled\n", line, self);
+#endif /* XTHREADS_DEBUG */
+#endif /* XTHREADS_WARN */
+}
+
+static void _XConditionSignal(
+    xcondition_t cv
+    XTHREADS_FILE_LINE_ARGS
+    )
+{
+#ifdef XTHREADS_WARN
+#ifdef XTHREADS_DEBUG
+    printf("line %d thread %x is signalling\n", line, xthread_self());
+#endif
+#endif
+    xcondition_signal(cv);
+}
+
+
+static void _XConditionBroadcast(
+    xcondition_t cv
+    XTHREADS_FILE_LINE_ARGS
+    )
+{
+#ifdef XTHREADS_WARN
+#ifdef XTHREADS_DEBUG
+    printf("line %d thread %x is broadcasting\n", line, xthread_self());
+#endif
+#endif
+    xcondition_broadcast(cv);
+}
+
+
+static void _XFreeDisplayLock(
+    Display *dpy)
+{
+    struct _XCVList *cvl;
+
+    if (dpy->lock != NULL) {
+       if (dpy->lock->mutex != NULL) {
+           xmutex_clear(dpy->lock->mutex);
+           xmutex_free(dpy->lock->mutex);
+       }
+       if (dpy->lock->cv != NULL) {
+           xcondition_clear(dpy->lock->cv);
+           xcondition_free(dpy->lock->cv);
+       }
+       if (dpy->lock->writers != NULL) {
+           xcondition_clear(dpy->lock->writers);
+           xcondition_free(dpy->lock->writers);
+       }
+       while ((cvl = dpy->lock->free_cvls)) {
+           dpy->lock->free_cvls = cvl->next;
+           xcondition_clear(cvl->cv);
+           Xfree((char *)cvl->cv);
+           Xfree((char *)cvl);
+       }
+       Xfree((char *)dpy->lock);
+       dpy->lock = NULL;
+    }
+    if (dpy->lock_fns != NULL) {
+       Xfree((char *)dpy->lock_fns);
+       dpy->lock_fns = NULL;
+    }
+}
+
+/*
+ * wait for thread with user-level display lock to release it.
+ */
+
+static void _XDisplayLockWait(
+    Display *dpy)
+{
+    xthread_t self;
+
+    while (dpy->lock->locking_level > 0) {
+       self = xthread_self();
+       if (xthread_equal(dpy->lock->locking_thread, self))
+           break;
+       ConditionWait(dpy, dpy->lock->cv);
+    }
+}
+
+static void _XLockDisplay(
+    Display *dpy
+    XTHREADS_FILE_LINE_ARGS
+    )
+{
+#ifdef XTHREADS_WARN
+    _XLockDisplayWarn(dpy, file, line);
+#else
+    xmutex_lock(dpy->lock->mutex);
+#endif
+    if (dpy->lock->locking_level > 0)
+       _XDisplayLockWait(dpy);
+    _XIDHandler(dpy);
+    _XSeqSyncFunction(dpy);
+}
+
+/*
+ * _XReply is allowed to exit from select/poll and clean up even if a
+ * user-level lock is in force, so it uses this instead of _XFancyLockDisplay.
+ */
+static void _XInternalLockDisplay(
+    Display *dpy,
+    Bool wskip
+    XTHREADS_FILE_LINE_ARGS
+    )
+{
+#ifdef XTHREADS_WARN
+    _XLockDisplayWarn(dpy, file, line);
+#else
+    xmutex_lock(dpy->lock->mutex);
+#endif
+    if (!wskip && dpy->lock->locking_level > 0)
+       _XDisplayLockWait(dpy);
+}
+
+static void _XUserLockDisplay(
+    register Display* dpy)
+{
+    _XDisplayLockWait(dpy);
+
+    if (++dpy->lock->locking_level == 1) {
+       dpy->lock->lock_wait = _XDisplayLockWait;
+       dpy->lock->locking_thread = xthread_self();
+    }
+}
+
+static
+void _XUserUnlockDisplay(
+    register Display* dpy)
+{
+    if (dpy->lock->locking_level > 0 && --dpy->lock->locking_level == 0) {
+       /* signal other threads that might be waiting in XLockDisplay */
+       ConditionBroadcast(dpy, dpy->lock->cv);
+       dpy->lock->lock_wait = NULL;
+       xthread_clear_id(dpy->lock->locking_thread);
+    }
+}
+
+/* returns 0 if initialized ok, -1 if unable to allocate
+   a mutex or other memory */
+
+static int _XInitDisplayLock(
+    Display *dpy)
+{
+    dpy->lock_fns = (struct _XLockPtrs*)Xmalloc(sizeof(struct _XLockPtrs));
+    if (dpy->lock_fns == NULL)
+       return -1;
+    dpy->lock = (struct _XLockInfo *)Xmalloc(sizeof(struct _XLockInfo));
+    if (dpy->lock == NULL) {
+       _XFreeDisplayLock(dpy);
+       return -1;
+    }
+    dpy->lock->cv = xcondition_malloc();
+    dpy->lock->mutex = xmutex_malloc();
+    dpy->lock->writers = xcondition_malloc();
+    if (!dpy->lock->cv || !dpy->lock->mutex || !dpy->lock->writers) {
+       _XFreeDisplayLock(dpy);
+       return -1;
+    }
+
+    dpy->lock->reply_bytes_left = 0;
+    dpy->lock->reply_was_read = False;
+    dpy->lock->reply_awaiters = NULL;
+    dpy->lock->reply_awaiters_tail = &dpy->lock->reply_awaiters;
+    dpy->lock->event_awaiters = NULL;
+    dpy->lock->event_awaiters_tail = &dpy->lock->event_awaiters;
+    dpy->lock->reply_first = False;
+    dpy->lock->locking_level = 0;
+    dpy->lock->num_free_cvls = 0;
+    dpy->lock->free_cvls = NULL;
+    xthread_clear_id(dpy->lock->locking_thread);
+    xthread_clear_id(dpy->lock->reading_thread);
+    xthread_clear_id(dpy->lock->conni_thread);
+    xmutex_init(dpy->lock->mutex);
+    xmutex_set_name(dpy->lock->mutex, "Xlib Display");
+    xcondition_init(dpy->lock->cv);
+    xcondition_set_name(dpy->lock->cv, "XLockDisplay");
+    xcondition_init(dpy->lock->writers);
+    xcondition_set_name(dpy->lock->writers, "Xlib wait for writable");
+    dpy->lock_fns->lock_display = _XLockDisplay;
+    dpy->lock->internal_lock_display = _XInternalLockDisplay;
+    dpy->lock_fns->unlock_display = _XUnlockDisplay;
+    dpy->lock->user_lock_display = _XUserLockDisplay;
+    dpy->lock->user_unlock_display = _XUserUnlockDisplay;
+    dpy->lock->pop_reader = _XPopReader;
+    dpy->lock->push_reader = _XPushReader;
+    dpy->lock->condition_wait = _XConditionWait;
+    dpy->lock->condition_signal = _XConditionSignal;
+    dpy->lock->condition_broadcast = _XConditionBroadcast;
+    dpy->lock->create_cvl = _XCreateCVL;
+    dpy->lock->lock_wait = NULL; /* filled in by XLockDisplay() */
+
+    return 0;
+}
+
+#ifdef __UNIXWARE__
+xthread_t __x11_thr_self() { return 0; }
+xthread_t (*_x11_thr_self)() = __x11_thr_self;
+#endif
+
+
+Status XInitThreads(void)
+{
+    if (_Xglobal_lock)
+       return 1;
+#ifdef __UNIXWARE__
+    else {
+       void *dl_handle = dlopen(NULL, RTLD_LAZY);
+       if (!dl_handle ||
+         ((_x11_thr_self = (xthread_t(*)())dlsym(dl_handle,"thr_self")) == 0)) {
+              _x11_thr_self = __x11_thr_self;
+              (void) fprintf (stderr,
+       "XInitThreads called, but no libthread in the calling program!\n" );
+       }
+    }
+#endif /* __UNIXWARE__ */
+#ifdef xthread_init
+    xthread_init();            /* return value? */
+#endif
+    if (!(global_lock.lock = xmutex_malloc()))
+       return 0;
+    if (!(i18n_lock.lock = xmutex_malloc())) {
+       xmutex_free(global_lock.lock);
+       global_lock.lock = NULL;
+       return 0;
+    }
+    _Xglobal_lock = &global_lock;
+    xmutex_init(_Xglobal_lock->lock);
+    xmutex_set_name(_Xglobal_lock->lock, "Xlib global");
+    _Xi18n_lock = &i18n_lock;
+    xmutex_init(_Xi18n_lock->lock);
+    xmutex_set_name(_Xi18n_lock->lock, "Xlib i18n");
+    _XLockMutex_fn = _XLockMutex;
+    _XUnlockMutex_fn = _XUnlockMutex;
+    _XCreateMutex_fn = _XCreateMutex;
+    _XFreeMutex_fn = _XFreeMutex;
+    _XInitDisplayLock_fn = _XInitDisplayLock;
+    _XFreeDisplayLock_fn = _XFreeDisplayLock;
+    _Xthread_self_fn = _Xthread_self;
+
+#ifdef XTHREADS_WARN
+#ifdef XTHREADS_DEBUG
+    setlinebuf(stdout);                /* for debugging messages */
+#endif
+#endif
+
+    return 1;
+}
+
+#else /* XTHREADS */
+Status XInitThreads(void)
+{
+    return 0;
+}
+#endif /* XTHREADS */
diff --git a/src/locking.h b/src/locking.h
new file mode 100644 (file)
index 0000000..96019fc
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+
+Copyright 1992, 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.
+
+*/
+
+/*
+ * Author: Stephen Gildea, MIT X Consortium
+ *
+ * locking.h - data types for C Threads locking.
+ * Used by XlibInt.c, locking.c, LockDis.c
+ */
+
+#ifndef _X_locking_H_
+#define _X_locking_H_
+
+#define xmalloc(s) Xmalloc(s)
+#define xfree(s) Xfree(s)
+#include <X11/Xthreads.h>
+
+struct _XCVList {
+    xcondition_t cv;
+    xReply *buf;
+    struct _XCVList *next;
+};
+
+extern xthread_t (*_Xthread_self_fn)( /* in XlibInt.c */
+    void
+);
+
+/* Display->lock is a pointer to one of these */
+
+struct _XLockInfo {
+       xmutex_t mutex;         /* mutex for critical sections */
+       int reply_bytes_left;   /* nbytes of the reply still to read */
+       Bool reply_was_read;    /* _XReadEvents read a reply for _XReply */
+       struct _XCVList *reply_awaiters; /* list of CVs for _XReply */
+       struct _XCVList **reply_awaiters_tail;
+       struct _XCVList *event_awaiters; /* list of CVs for _XReadEvents */
+       struct _XCVList **event_awaiters_tail;
+       Bool reply_first;       /* who may read, reply queue or event queue */
+       /* for XLockDisplay */
+       int locking_level;      /* how many times into XLockDisplay we are */
+       xthread_t locking_thread; /* thread that did XLockDisplay */
+       xcondition_t cv;        /* wait if another thread has XLockDisplay */
+       xthread_t reading_thread; /* cache */
+       xthread_t conni_thread; /* thread in XProcessInternalConnection */
+       xcondition_t writers;   /* wait for writable */
+       int num_free_cvls;
+       struct _XCVList *free_cvls;
+       /* used only in XlibInt.c */
+       void (*pop_reader)(
+                          Display* /* dpy */,
+                          struct _XCVList** /* list */,
+                          struct _XCVList*** /* tail */
+                          );
+       struct _XCVList *(*push_reader)(
+                                       Display *          /* dpy */,
+                                       struct _XCVList*** /* tail */
+                                       );
+       void (*condition_wait)(
+                              xcondition_t /* cv */,
+                              xmutex_t /* mutex */
+#if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE)
+                              , char* /* file */,
+                              int /* line */
+#endif
+                              );
+       void (*internal_lock_display)(
+                                     Display* /* dpy */,
+                                     Bool /* wskip */
+#if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE)
+                                     , char* /* file */,
+                                     int /* line */
+#endif
+                                     );
+       /* used in XlibInt.c and locking.c */
+       void (*condition_signal)(
+                                xcondition_t /* cv */
+#if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE)
+                                , char* /* file */,
+                                int /* line */
+#endif
+                                );
+       void (*condition_broadcast)(
+                                xcondition_t /* cv */
+#if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE)
+                                , char* /* file */,
+                                int /* line */
+#endif
+                                   );
+       /* used in XlibInt.c and XLockDis.c */
+       void (*lock_wait)(
+                         Display* /* dpy */
+                         );
+       void (*user_lock_display)(
+                                 Display* /* dpy */
+                                 );
+       void (*user_unlock_display)(
+                                   Display* /* dpy */
+                                   );
+       struct _XCVList *(*create_cvl)(
+                                      Display * /* dpy */
+                                      );
+};
+
+#define UnlockNextEventReader(d) if ((d)->lock) \
+    (*(d)->lock->pop_reader)((d),&(d)->lock->event_awaiters,&(d)->lock->event_awaiters_tail)
+
+#if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE)
+#define ConditionWait(d,c) if ((d)->lock) \
+       (*(d)->lock->condition_wait)(c, (d)->lock->mutex,__FILE__,__LINE__)
+#define ConditionSignal(d,c) if ((d)->lock) \
+       (*(d)->lock->condition_signal)(c,__FILE__,__LINE__)
+#define ConditionBroadcast(d,c) if ((d)->lock) \
+       (*(d)->lock->condition_broadcast)(c,__FILE__,__LINE__)
+#else
+#define ConditionWait(d,c) if ((d)->lock) \
+       (*(d)->lock->condition_wait)(c, (d)->lock->mutex)
+#define ConditionSignal(d,c) if ((d)->lock) \
+       (*(d)->lock->condition_signal)(c)
+#define ConditionBroadcast(d,c) if ((d)->lock) \
+       (*(d)->lock->condition_broadcast)(c)
+#endif
+
+typedef struct _LockInfoRec {
+       xmutex_t        lock;
+} LockInfoRec;
+
+/* XOpenDis.c */
+extern int (*_XInitDisplayLock_fn)(Display *dpy);
+extern void (*_XFreeDisplayLock_fn)(Display *dpy);
+
+#endif /* _X_locking_H_ */
diff --git a/src/os2Stubs.c b/src/os2Stubs.c
new file mode 100644 (file)
index 0000000..ee09cb5
--- /dev/null
@@ -0,0 +1,428 @@
+/*
+ * (c) Copyright 1996 by Sebastien Marineau and Holger Veit
+ *                     <marineau@genie.uottawa.ca>
+ *                      <Holger.Veit@gmd.de>
+ *
+ * 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
+ * HOLGER VEIT  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION 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 Sebastien Marineau or Holger Veit
+ * shall not be used in advertising or otherwise to promote the sale, use or other
+ * dealings in this Software without prior written authorization from Holger Veit or
+ * Sebastien Marineau.
+ *
+ */
+
+
+/* A few OS/2 functions needed in the X11 lib. Mainly, the file path redirection
+ * functions and the "optimized" select() for the clients */
+
+#define I_NEED_OS2_H
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <X11/Xpoll.h>
+#include <stdio.h>
+#include <sys/errno.h>
+#define INCL_DOSSEMAPHORES
+#define INCL_DOSNPIPES
+#define INCL_DOSMISC
+#define INCL_DOSMODULEMGR
+#undef BOOL
+#undef BYTE
+#include <os2.h>
+#include <sys/select.h>
+#include <sys/time.h>
+
+char *__XOS2RedirRoot(char *fname)
+{
+    /* This adds a further redirection by allowing the ProjectRoot
+     * to be prepended by the content of the envvar X11ROOT.
+     * This is for the purpose to move the whole X11 stuff to a different
+     * disk drive.
+     * The feature was added despite various environment variables
+     * because not all file opens respect them.
+     */
+    static char redirname[300]; /* enough for long filenames */
+    char *root;
+
+    /* if name does not start with /, assume it is not root-based */
+    if (fname==0 || !(fname[0]=='/' || fname[0]=='\\'))
+       return fname;
+
+    root = (char*)getenv("X11ROOT");
+    if (root==0 ||
+       (fname[1]==':' && isalpha(fname[0])) ||
+        (strlen(fname)+strlen(root)+2) > 300)
+       return fname;
+    sprintf(redirname,"%s%s",root,fname);
+    return redirname;
+}
+
+char *__XOS2RedirRoot1(char *format, char *arg1, char *arg2, char *arg3)
+{
+    /* this first constructs a name from a format and up to three
+     * components, then adds a path
+     */
+    char buf[300];
+    sprintf(buf,format,arg1,arg2,arg3);
+    return __XOS2RedirRoot(buf);
+}
+
+/* This below implements select() for the calls in this file. It has been */
+/* somewhat optimized for improved performance, but assumes a few */
+/* things so it cannot be used as a general select. If both pipes and     */
+/* sockets are present, this may call the emx select                          */
+
+
+HEV hPipeSem;
+HMODULE hmod_so32dll;
+static int (*os2_tcp_select)(int*,int,int,int,long);
+ULONG os2_get_sys_millis();
+extern int _files[];
+
+#define MAX_TCP 256
+/* These lifted from sys/emx.h. Change if that changes there! */
+#define F_SOCKET 0x10000000
+#define F_PIPE 0x20000000
+
+struct select_data
+{
+   fd_set read_copy;
+   fd_set write_copy;
+   BOOL have_read;
+   BOOL have_write;
+   int tcp_select_mask[MAX_TCP];
+   int tcp_emx_handles[MAX_TCP];
+   int tcp_select_copy[MAX_TCP];
+   int socket_nread;
+   int socket_nwrite;
+   int socket_ntotal;
+   int pipe_ntotal;
+   int pipe_have_write;
+   int max_fds;
+};
+
+int os2ClientSelect(int nfds, fd_set *readfds, fd_set *writefds,
+        fd_set *exceptfds, struct timeval *timeout)
+{
+static BOOL FirstTime=TRUE;
+static haveTCPIP=TRUE;
+ULONG timeout_ms;
+ULONG postCount, start_millis,now_millis;
+char faildata[16];
+struct select_data sd;
+BOOL any_ready;
+int np,ns, i,ready_handles,n;
+APIRET rc;
+
+sd.have_read=FALSE; sd.have_write=FALSE;
+sd.socket_nread=0; sd.socket_nwrite=0; sd.socket_ntotal=0;
+sd.max_fds=31; ready_handles=0; any_ready=FALSE;
+sd.pipe_ntotal=0; sd.pipe_have_write=FALSE;
+
+if(FirstTime){
+   /* First load the so32dll.dll module and get a pointer to the SELECT fn */
+
+   if((rc=DosLoadModule(faildata,sizeof(faildata),"SO32DLL",&hmod_so32dll))!=0){
+        fprintf(stderr, "Could not load module so32dll.dll, rc = %d. Error note %s\n",rc,faildata);
+        haveTCPIP=FALSE;
+        }
+   if((rc = DosQueryProcAddr(hmod_so32dll, 0, "SELECT", (PPFN)&os2_tcp_select))!=0){
+        fprintf(stderr, "Could not query address of SELECT, rc = %d.\n",rc);
+        haveTCPIP=FALSE;
+        }
+   /* Call these a first time to set the semaphore */
+    rc = DosCreateEventSem(NULL, &hPipeSem, DC_SEM_SHARED, FALSE);
+    if(rc) {
+             fprintf(stderr, "Could not create event semaphore, rc=%d\n",rc);
+             return(-1);
+             }
+    rc = DosResetEventSem(hPipeSem, &postCount);
+    FirstTime = FALSE;
+}
+
+/* Set up the time delay structs */
+
+    if(timeout!=NULL) {
+       timeout_ms=timeout->tv_sec*1000+timeout->tv_usec/1000;
+       }
+    else { timeout_ms=1000000; }  /* This should be large enough... */
+    if(timeout_ms>0) start_millis=os2_get_sys_millis();
+
+/* Copy the masks */
+    {FD_ZERO(&sd.read_copy);}
+    {FD_ZERO(&sd.write_copy);}
+    if(readfds!=NULL){ XFD_COPYSET(readfds,&sd.read_copy); sd.have_read=TRUE;}
+    if(writefds!=NULL) {XFD_COPYSET(writefds,&sd.write_copy);sd.have_write=TRUE;}
+
+/* And zero the original masks */
+    if(sd.have_read){ FD_ZERO(readfds);}
+    if(sd.have_write) {FD_ZERO(writefds);}
+    if(exceptfds != NULL) {FD_ZERO(exceptfds);}
+
+/* Now we parse the fd_sets passed to select and separate pipe/sockets */
+        n = os2_parse_select(&sd,nfds);
+        if(n == -1) {
+           errno = EBADF;
+           return (-1);
+           }
+
+/* Now we have three cases: either we have sockets, pipes, or both */
+/* We handle all three cases differently to optimize things */
+
+/* Case 1: only pipes! */
+        if((sd.pipe_ntotal >0) && (!sd.socket_ntotal)){
+            np = os2_check_pipes(&sd,readfds,writefds);
+            if(np > 0){
+               return (np);
+               }
+            else if (np == -1) { return(-1); }
+            while(!any_ready){
+                 rc = DosWaitEventSem(hPipeSem, timeout_ms);
+                 if(rc == 640)  {
+                     return(0);
+                     }
+                 if((rc != 0) && (rc != 95)) {errno= EBADF; return(-1);}
+                 np = os2_check_pipes(&sd,readfds,writefds);
+                 if (np > 0){
+                    return(np);
+                    }
+                 else if (np < 0){ return(-1); }
+                 }
+          }
+
+/* Case 2: only sockets. Just let the os/2 tcp select do the work */
+        if((sd.socket_ntotal > 0) && (!sd.pipe_ntotal)){
+                ns = os2_check_sockets(&sd, readfds, writefds, timeout_ms);
+                return (ns);
+                }
+
+/* Case 3: combination of both */
+        if((sd.socket_ntotal > 0) && (sd.pipe_ntotal)){
+           np = os2_check_pipes(&sd,readfds,writefds);
+              if(np > 0){
+                 any_ready=TRUE;
+                 ready_handles += np;
+                 }
+              else if (np == -1) { return(-1); }
+
+           ns = os2_check_sockets(&sd,readfds,writefds, 0);
+           if(ns>0){
+               ready_handles+=ns;
+               any_ready = TRUE;
+               }
+           else if (ns == -1) {return(-1);}
+
+           while (!any_ready && timeout_ms){
+
+                rc = DosWaitEventSem(hPipeSem, 10L);
+                if(rc == 0){
+                        np = os2_check_pipes(&sd,readfds,writefds);
+                        if(np > 0){
+                        ready_handles+=np;
+                        any_ready = TRUE;
+                        }
+                        else if (np == -1) {
+                                return(-1); }
+                      }
+
+                 ns = os2_check_sockets(&sd,readfds,writefds,exceptfds, 0);
+                 if(ns>0){
+                      ready_handles+=ns;
+                      any_ready = TRUE;
+                     }
+                 else if (ns == -1) {return(-1);}
+
+                  if (i%8 == 0) {
+                    now_millis = os2_get_sys_millis();
+                    if((now_millis-start_millis) > timeout_ms) timeout_ms = 0;
+                    }
+                   i++;
+                  }
+        }
+
+return(ready_handles);
+}
+
+
+ULONG os2_get_sys_millis()
+{
+   APIRET rc;
+   ULONG milli;
+
+   rc = DosQuerySysInfo(14, 14, &milli, sizeof(milli));
+   if(rc) {
+        fprintf(stderr,"Bad return code querying the millisecond counter! rc=%d\n",rc);
+        return(0);
+        }
+   return(milli);
+}
+
+int os2_parse_select(sd,nfds)
+struct select_data *sd;
+int nfds;
+{
+   int i;
+   APIRET rc;
+/* First we determine up to which descriptor we need to check.              */
+/* No need to check up to 256 if we don't have to (and usually we dont...)*/
+/* Note: stuff here is hardcoded for fd_sets which are int[8] as in EMX!!!    */
+
+  if(nfds > sd->max_fds){
+     for(i=0;i<((FD_SETSIZE+31)/32);i++){
+        if(sd->read_copy.fds_bits[i] ||
+            sd->write_copy.fds_bits[i])
+                        sd->max_fds=(i*32) +32;
+        }
+     }
+   else { sd->max_fds = nfds; }
+/* Check if result is greater than specified in select() call */
+  if(sd->max_fds > nfds) sd->max_fds = nfds;
+
+  if (sd->have_read)
+    {
+      for (i = 0; i < sd->max_fds; ++i) {
+        if (FD_ISSET (i, &sd->read_copy)){
+         if(_files[i] & F_SOCKET)
+           {
+            sd->tcp_select_mask[sd->socket_ntotal]=_getsockhandle(i);
+            sd->tcp_emx_handles[sd->socket_ntotal]=i;
+            sd->socket_ntotal++; sd->socket_nread++;
+           }
+         else if (_files[i] & F_PIPE)
+          {
+            sd -> pipe_ntotal++;
+            rc = DosSetNPipeSem((HPIPE)i, (HSEM) hPipeSem, i);
+            if(rc) { fprintf(stderr,"Error SETNPIPE rc = %d\n",rc); return -1;}
+          }
+        }
+      }
+    }
+
+  if (sd->have_write)
+    {
+      for (i = 0; i < sd->max_fds; ++i) {
+        if (FD_ISSET (i, &sd->write_copy)){
+         if(_files[i] & F_SOCKET)
+         {
+            sd->tcp_select_mask[sd->socket_ntotal]=_getsockhandle(i);
+            sd->tcp_emx_handles[sd->socket_ntotal]=i;
+            sd->socket_ntotal++; sd->socket_nwrite++;
+         }
+         else if (_files[i] & F_PIPE)
+          {
+            sd -> pipe_ntotal++;
+            rc = DosSetNPipeSem((HPIPE)i, (HSEM) hPipeSem, i);
+            if(rc) { fprintf(stderr,"Error SETNPIPE rc = %d\n",rc); return -1;}
+            sd -> pipe_have_write=TRUE;
+          }
+        }
+      }
+    }
+
+
+return(sd->socket_ntotal);
+}
+
+
+int os2_check_sockets(sd,readfds,writefds)
+struct select_data *sd;
+fd_set *readfds,*writefds;
+{
+   int e,i;
+   int j,n;
+        memcpy(sd->tcp_select_copy,sd->tcp_select_mask,
+                sd->socket_ntotal*sizeof(int));
+
+        e = os2_tcp_select(sd->tcp_select_copy,sd->socket_nread,
+                sd->socket_nwrite, 0, 0);
+
+        if(e == 0) return(e);
+/* We have something ready? */
+        if(e>0){
+            j = 0; n = 0;
+            for (i = 0; i < sd->socket_nread; ++i, ++j)
+                 if (sd->tcp_select_copy[j] != -1)
+                    {
+                    FD_SET (sd->tcp_emx_handles[j], readfds);
+                    n ++;
+                    }
+             for (i = 0; i < sd->socket_nwrite; ++i, ++j)
+                  if (sd->tcp_select_copy[j] != -1)
+                     {
+                     FD_SET (sd->tcp_emx_handles[j], writefds);
+                     n ++;
+                     }
+               errno = 0;
+
+               return n;
+              }
+        if(e<0){
+           /*Error -- TODO */
+           fprintf(stderr,"Error in server select! e=%d\n",e);
+           errno = EBADF;
+           return (-1);
+           }
+ }
+
+/* Check to see if anything is ready on pipes */
+
+int os2_check_pipes(sd,readfds,writefds)
+struct select_data *sd;
+fd_set *readfds,*writefds;
+{
+int i,e;
+ULONG ulPostCount;
+PIPESEMSTATE pipeSemState[128];
+APIRET rc;
+        e = 0;
+        rc = DosResetEventSem(hPipeSem,&ulPostCount);
+        rc = DosQueryNPipeSemState((HSEM) hPipeSem, (PPIPESEMSTATE)&pipeSemState,
+                sizeof(pipeSemState));
+        if(rc) fprintf(stderr,"SELECT: rc from QueryNPipeSem: %d\n",rc);
+        i=0;
+        while (pipeSemState[i].fStatus != 0) {
+           /*fprintf(stderr,"SELECT: sem entry, stat=%d, flag=%d, key=%d,avail=%d\n",
+                pipeSemState[i].fStatus,pipeSemState[i].fFlag,pipeSemState[i].usKey,
+                pipeSemState[i].usAvail); */
+           if((pipeSemState[i].fStatus == 1) &&
+                    (FD_ISSET(pipeSemState[i].usKey,&sd->read_copy))){
+                FD_SET(pipeSemState[i].usKey,readfds);
+                e++;
+                }
+           else if((pipeSemState[i].fStatus == 2)  &&
+                    (FD_ISSET(pipeSemState[i].usKey,&sd->write_copy))){
+                FD_SET(pipeSemState[i].usKey,writefds);
+                e++;
+                }
+            else if( (pipeSemState[i].fStatus == 3) &&
+                ( (FD_ISSET(pipeSemState[i].usKey,&sd->read_copy)) ||
+                  (FD_ISSET(pipeSemState[i].usKey,&sd->write_copy)) )){
+                errno = EBADF;
+                return (-1);
+                }
+            i++;
+            } /* endwhile */
+        /*fprintf(stderr,"Done listing pipe sem entries, total %d entries, total ready entries %d\n",i,e);*/
+errno = 0;
+return(e);
+}
+
+
+
diff --git a/src/poly.h b/src/poly.h
new file mode 100644 (file)
index 0000000..e064783
--- /dev/null
@@ -0,0 +1,294 @@
+/************************************************************************
+
+Copyright 1987, 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 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.
+
+************************************************************************/
+
+/*
+ *     This file contains a few macros to help track
+ *     the edge of a filled object.  The object is assumed
+ *     to be filled in scanline order, and thus the
+ *     algorithm used is an extension of Bresenham's line
+ *     drawing algorithm which assumes that y is always the
+ *     major axis.
+ *     Since these pieces of code are the same for any filled shape,
+ *     it is more convenient to gather the library in one
+ *     place, but since these pieces of code are also in
+ *     the inner loops of output primitives, procedure call
+ *     overhead is out of the question.
+ *     See the author for a derivation if needed.
+ */
+\f
+
+/*
+ *  In scan converting polygons, we want to choose those pixels
+ *  which are inside the polygon.  Thus, we add .5 to the starting
+ *  x coordinate for both left and right edges.  Now we choose the
+ *  first pixel which is inside the pgon for the left edge and the
+ *  first pixel which is outside the pgon for the right edge.
+ *  Draw the left pixel, but not the right.
+ *
+ *  How to add .5 to the starting x coordinate:
+ *      If the edge is moving to the right, then subtract dy from the
+ *  error term from the general form of the algorithm.
+ *      If the edge is moving to the left, then add dy to the error term.
+ *
+ *  The reason for the difference between edges moving to the left
+ *  and edges moving to the right is simple:  If an edge is moving
+ *  to the right, then we want the algorithm to flip immediately.
+ *  If it is moving to the left, then we don't want it to flip until
+ *  we traverse an entire pixel.
+ */
+#define BRESINITPGON(dy, x1, x2, xStart, d, m, m1, incr1, incr2) { \
+    int dx;      /* local storage */ \
+\
+    /* \
+     *  if the edge is horizontal, then it is ignored \
+     *  and assumed not to be processed.  Otherwise, do this stuff. \
+     */ \
+    if ((dy) != 0) { \
+        xStart = (x1); \
+        dx = (x2) - xStart; \
+        if (dx < 0) { \
+            m = dx / (dy); \
+            m1 = m - 1; \
+            incr1 = -2 * dx + 2 * (dy) * m1; \
+            incr2 = -2 * dx + 2 * (dy) * m; \
+            d = 2 * m * (dy) - 2 * dx - 2 * (dy); \
+        } else { \
+            m = dx / (dy); \
+            m1 = m + 1; \
+            incr1 = 2 * dx - 2 * (dy) * m1; \
+            incr2 = 2 * dx - 2 * (dy) * m; \
+            d = -2 * m * (dy) + 2 * dx; \
+        } \
+    } \
+}
+\f
+#define BRESINCRPGON(d, minval, m, m1, incr1, incr2) { \
+    if (m1 > 0) { \
+        if (d > 0) { \
+            minval += m1; \
+            d += incr1; \
+        } \
+        else { \
+            minval += m; \
+            d += incr2; \
+        } \
+    } else {\
+        if (d >= 0) { \
+            minval += m1; \
+            d += incr1; \
+        } \
+        else { \
+            minval += m; \
+            d += incr2; \
+        } \
+    } \
+}
+
+\f
+/*
+ *     This structure contains all of the information needed
+ *     to run the bresenham algorithm.
+ *     The variables may be hardcoded into the declarations
+ *     instead of using this structure to make use of
+ *     register declarations.
+ */
+typedef struct {
+    int minor_axis;    /* minor axis        */
+    int d;             /* decision variable */
+    int m, m1;         /* slope and slope+1 */
+    int incr1, incr2;  /* error increments */
+} BRESINFO;
+
+
+#define BRESINITPGONSTRUCT(dmaj, min1, min2, bres) \
+       BRESINITPGON(dmaj, min1, min2, bres.minor_axis, bres.d, \
+                     bres.m, bres.m1, bres.incr1, bres.incr2)
+
+#define BRESINCRPGONSTRUCT(bres) \
+        BRESINCRPGON(bres.d, bres.minor_axis, bres.m, bres.m1, bres.incr1, bres.incr2)
+
+
+
+/*
+ *     These are the data structures needed to scan
+ *     convert regions.  Two different scan conversion
+ *     methods are available -- the even-odd method, and
+ *     the winding number method.
+ *     The even-odd rule states that a point is inside
+ *     the polygon if a ray drawn from that point in any
+ *     direction will pass through an odd number of
+ *     path segments.
+ *     By the winding number rule, a point is decided
+ *     to be inside the polygon if a ray drawn from that
+ *     point in any direction passes through a different
+ *     number of clockwise and counter-clockwise path
+ *     segments.
+ *
+ *     These data structures are adapted somewhat from
+ *     the algorithm in (Foley/Van Dam) for scan converting
+ *     polygons.
+ *     The basic algorithm is to start at the top (smallest y)
+ *     of the polygon, stepping down to the bottom of
+ *     the polygon by incrementing the y coordinate.  We
+ *     keep a list of edges which the current scanline crosses,
+ *     sorted by x.  This list is called the Active Edge Table (AET)
+ *     As we change the y-coordinate, we update each entry in
+ *     in the active edge table to reflect the edges new xcoord.
+ *     This list must be sorted at each scanline in case
+ *     two edges intersect.
+ *     We also keep a data structure known as the Edge Table (ET),
+ *     which keeps track of all the edges which the current
+ *     scanline has not yet reached.  The ET is basically a
+ *     list of ScanLineList structures containing a list of
+ *     edges which are entered at a given scanline.  There is one
+ *     ScanLineList per scanline at which an edge is entered.
+ *     When we enter a new edge, we move it from the ET to the AET.
+ *
+ *     From the AET, we can implement the even-odd rule as in
+ *     (Foley/Van Dam).
+ *     The winding number rule is a little trickier.  We also
+ *     keep the EdgeTableEntries in the AET linked by the
+ *     nextWETE (winding EdgeTableEntry) link.  This allows
+ *     the edges to be linked just as before for updating
+ *     purposes, but only uses the edges linked by the nextWETE
+ *     link as edges representing spans of the polygon to
+ *     drawn (as with the even-odd rule).
+ */
+
+/*
+ * for the winding number rule
+ */
+#define CLOCKWISE          1
+#define COUNTERCLOCKWISE  -1
+
+typedef struct _EdgeTableEntry {
+     int ymax;             /* ycoord at which we exit this edge. */
+     BRESINFO bres;        /* Bresenham info to run the edge     */
+     struct _EdgeTableEntry *next;       /* next in the list     */
+     struct _EdgeTableEntry *back;       /* for insertion sort   */
+     struct _EdgeTableEntry *nextWETE;   /* for winding num rule */
+     int ClockWise;        /* flag for winding number rule       */
+} EdgeTableEntry;
+
+
+typedef struct _ScanLineList{
+     int scanline;              /* the scanline represented */
+     EdgeTableEntry *edgelist;  /* header node              */
+     struct _ScanLineList *next;  /* next in the list       */
+} ScanLineList;
+
+
+typedef struct {
+     int ymax;                 /* ymax for the polygon     */
+     int ymin;                 /* ymin for the polygon     */
+     ScanLineList scanlines;   /* header node              */
+} EdgeTable;
+
+
+/*
+ * Here is a struct to help with storage allocation
+ * so we can allocate a big chunk at a time, and then take
+ * pieces from this heap when we need to.
+ */
+#define SLLSPERBLOCK 25
+
+typedef struct _ScanLineListBlock {
+     ScanLineList SLLs[SLLSPERBLOCK];
+     struct _ScanLineListBlock *next;
+} ScanLineListBlock;
+
+
+\f
+/*
+ *
+ *     a few macros for the inner loops of the fill code where
+ *     performance considerations don't allow a procedure call.
+ *
+ *     Evaluate the given edge at the given scanline.
+ *     If the edge has expired, then we leave it and fix up
+ *     the active edge table; otherwise, we increment the
+ *     x value to be ready for the next scanline.
+ *     The winding number rule is in effect, so we must notify
+ *     the caller when the edge has been removed so he
+ *     can reorder the Winding Active Edge Table.
+ */
+#define EVALUATEEDGEWINDING(pAET, pPrevAET, y, fixWAET) { \
+   if (pAET->ymax == y) {          /* leaving this edge */ \
+      pPrevAET->next = pAET->next; \
+      pAET = pPrevAET->next; \
+      fixWAET = 1; \
+      if (pAET) \
+         pAET->back = pPrevAET; \
+   } \
+   else { \
+      BRESINCRPGONSTRUCT(pAET->bres); \
+      pPrevAET = pAET; \
+      pAET = pAET->next; \
+   } \
+}
+
+
+/*
+ *     Evaluate the given edge at the given scanline.
+ *     If the edge has expired, then we leave it and fix up
+ *     the active edge table; otherwise, we increment the
+ *     x value to be ready for the next scanline.
+ *     The even-odd rule is in effect.
+ */
+#define EVALUATEEDGEEVENODD(pAET, pPrevAET, y) { \
+   if (pAET->ymax == y) {          /* leaving this edge */ \
+      pPrevAET->next = pAET->next; \
+      pAET = pPrevAET->next; \
+      if (pAET) \
+         pAET->back = pPrevAET; \
+   } \
+   else { \
+      BRESINCRPGONSTRUCT(pAET->bres); \
+      pPrevAET = pAET; \
+      pAET = pAET->next; \
+   } \
+}
diff --git a/src/udcInf.c b/src/udcInf.c
new file mode 100644 (file)
index 0000000..db7ad10
--- /dev/null
@@ -0,0 +1,716 @@
+/*
+Copyright 1996, 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 1995 by FUJITSU LIMITED
+ * This is source code modified by FUJITSU LIMITED under the Joint
+ * Development Agreement for the CDE/Motif PST.
+ *
+ * Modifier: Takanori Tateno   FUJITSU LIMITED
+ *
+ */
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include <locale.h>
+#include <Xlib.h>
+#include <Xlibint.h>
+#include <Xlcint.h>
+#include <XlcPubI.h>
+#include <XlcGeneric.h>
+#include <XomGeneric.h>
+
+/*
+   external symbols
+*/
+extern FontData read_EncodingInfo();
+extern int _xudc_get_codeset();
+
+extern int _xudc_utyderror ;
+extern int _xudc_utyerror ;
+
+extern unsigned long _xudc_utyerrno ;
+
+#define _XUDC_ERROR -1
+
+
+/*
+    UDC structure define
+*/
+typedef struct __XUDCGlyphRegion {
+    unsigned long  start;
+    unsigned long  end;
+} _XUDCGlyphRegion ;
+
+/*
+ *  "code" no jyoui "i" byte me wo "unsigned char" toshite kaesu.
+ */
+static unsigned char getbyte(code,i)
+unsigned long code;
+int          i;
+{
+    unsigned long byteL;
+    unsigned char byte;
+    byteL = code  >> (8*(3-i));
+    byte = (unsigned char)(0x000000ff & byteL);
+    return(byte);
+}
+/*
+    get codeset which described by charset_str and locale.
+    for examples ...
+    locale          :  ja_JP
+    charset_str     :  JISX0208.1983-0
+*/
+
+_xudc_get_codeset(locale,charset_str,codeset,num_codeset)
+char *locale;
+char *charset_str;
+int  **codeset;
+int  *num_codeset;
+{
+    XLCdRec lcdrec;
+    XLCd     lcd;
+    XLCdPublicRec xlcdp;
+    XPointer rdb;
+    int num = 0,count,num_ret=0,i,*ret;
+    char **value,buf[128],*ptr;
+
+
+    _xudc_utyderror = 0;
+    _xudc_utyerror = 0;
+
+    if((locale == NULL) || (charset_str == NULL)){
+        _xudc_utyerror = 5;
+        _xudc_utyderror = 1;
+       _xudc_utyerrno = 0x04 ;
+        return(_XUDC_ERROR);
+    }
+    if(codeset == NULL){
+        _xudc_utyerror = 5;
+        _xudc_utyderror = 2;
+       _xudc_utyerrno = 0x04 ;
+        return(_XUDC_ERROR);
+    }
+
+    /*    create XLCd     */
+    xlcdp.pub.siname = locale;
+    lcdrec.core = (XLCdCore)&xlcdp;
+    lcd = &lcdrec;
+        /* create X RDB (X NLS DB) */
+    rdb = _XlcCreateLocaleDataBase(lcd);
+    if(rdb == NULL){
+        _xudc_utyerror = 1;
+       _xudc_utyerrno = 0x15 ;
+        return(_XUDC_ERROR);
+    }
+
+    for(num=0;;num++){
+        /* XLC_FONTSET */
+        sprintf(buf, "fs%d.font.primary", num);
+        _XlcGetLocaleDataBase(lcd, "XLC_FONTSET", buf, &value, &count);
+        if(count < 1){
+            break ;
+        }
+        for(i=0;i<count;i++){
+           if (strlen(value[i]) >= sizeof(buf))
+               continue;
+            strcpy(buf,value[i]);
+            ptr = (char *)strchr(buf,(int)':');
+            *ptr = 0;
+            if(!_XlcCompareISOLatin1(charset_str,buf)){
+                num_ret += 1;
+                if(num_ret == 1){
+                    ret = (int *)Xmalloc(sizeof(int));
+                } else {
+                   int *prev_ret = ret;
+
+                   ret =
+                        (int *)Xrealloc(ret,num_ret*sizeof(int));
+                   if (ret == NULL){
+                       Xfree(prev_ret);
+                   }
+                }
+                if(ret == NULL){
+                   _xudc_utyerrno = 0x03 ;
+                    return(_XUDC_ERROR);
+                }
+               ret[num_ret-1]=num;
+                break ;
+            }
+        }
+    }
+    if(num_ret == 0){
+        *num_codeset = 0;
+        *codeset = NULL;
+        return (0xff);
+    }
+
+    *num_codeset = num_ret;
+    *codeset = ret;
+    return 0;
+}
+
+static Bool gi_to_vgi(gi,vgi,scope)
+unsigned long  gi,*vgi;
+FontScope      scope;
+{
+    if(scope->shift_direction == (unsigned long)'+'){
+        gi  -= scope->shift;
+    } else {
+        gi  += scope->shift;
+    }
+    if(gi >= scope->start && gi <= scope->end){
+       *vgi = gi;
+        return(True);
+    }
+    return(False);
+}
+
+static void shift_area(udc,scope)
+_XUDCGlyphRegion *udc;
+FontScope scope;
+{
+    if(scope->shift_direction == (unsigned long)'+'){
+        udc->start += scope->shift;
+        udc->end   += scope->shift;
+    } else {
+        udc->start -= scope->shift;
+        udc->end   -= scope->shift;
+    }
+}
+
+/*
+    get UDC area with glyph index.
+    for examples ...
+    locale          :  ja_JP
+    charset_str     :  JISX0208.1983-0
+*/
+_XUDCGetUDCGIArea(locale,codeset,charset_str,gr,num_gr)
+char *locale;
+int codeset;
+char *charset_str;
+_XUDCGlyphRegion  **gr;
+int  *num_gr;
+{
+    XLCdRec lcdrec;
+    XLCd     lcd;
+    XLCdPublicRec xlcdp;
+    XPointer rdb;
+    _XUDCGlyphRegion *udc;
+    int num = 0,count,num_ret=0;
+    int i,j,k;
+    char **value,buf[128],ptr;
+    FontData font_data;
+
+
+    _xudc_utyderror = 0;
+    _xudc_utyerror = 0;
+    _xudc_utyerrno = 0x00 ;
+
+    if((locale == NULL) || (charset_str == NULL)){
+        _xudc_utyerror = 5;
+        _xudc_utyderror = 1;
+       _xudc_utyerrno = 0x04;
+       _xudc_utyerrno |= (0x0b<<8) ;
+        return(_XUDC_ERROR);
+    }
+    if(gr == NULL){
+        _xudc_utyerror = 5;
+        _xudc_utyderror = 1;
+       _xudc_utyerrno = 0x04;
+       _xudc_utyerrno |= (0x0b<<8) ;
+        return(_XUDC_ERROR);
+    }
+    if(num_gr == NULL){
+        _xudc_utyerror = 5;
+        _xudc_utyderror = 2;
+       _xudc_utyerrno = 0x04;
+       _xudc_utyerrno |= (0x0b<<8) ;
+        return(_XUDC_ERROR);
+    }
+
+        /* create XLCd */
+    xlcdp.pub.siname = locale;
+    lcdrec.core = (XLCdCore)&xlcdp;
+    lcd = &lcdrec;
+        /* create X RDB (X NLS DB) */
+    rdb = _XlcCreateLocaleDataBase(lcd);
+    if(rdb == NULL){
+        _xudc_utyerror = 1;
+       _xudc_utyerrno = 0x15 ;
+       _xudc_utyerrno |= (0x0b<<8) ;
+        return(_XUDC_ERROR);
+    }
+    udc = NULL;
+
+        /* XLC_FONTSET */
+        sprintf(buf, "fs%d.charset.udc_area", codeset-1);
+        _XlcGetLocaleDataBase(lcd, "XLC_FONTSET", buf, &value, &count);
+        if(count > 0){
+            udc = (_XUDCGlyphRegion *)Xmalloc(count * sizeof(_XUDCGlyphRegion));
+            if(udc == NULL){
+               _xudc_utyerrno = 0x03 ;
+               _xudc_utyerrno |= (0x0b<<8) ;
+               return(_XUDC_ERROR);
+            }
+            for(i=0;i<count;i++){
+                sscanf(value[i],"\\x%lx,\\x%lx", &(udc[i].start), &(udc[i].end));
+            }
+        }
+
+    *num_gr = count;
+
+        sprintf(buf, "fs%d.font.primary", codeset-1);
+        _XlcGetLocaleDataBase(lcd, "XLC_FONTSET", buf, &value, &count);
+        if(count > 0){
+           font_data = read_EncodingInfo(count,value);
+            for(i=0;i<count;i++){
+                if( !_XlcCompareISOLatin1(font_data[i].name,charset_str)){
+                    for(j=0;j<(*num_gr);j++){
+                       for(k=0;k<font_data[i].scopes_num;k++){
+                           if(udc[j].start == font_data[i].scopes[k].start
+                                  && font_data[i].scopes[k].shift){
+                                shift_area(&udc[j],&(font_data[i].scopes[k]));
+                            }
+                       }
+                   }
+               }
+           }
+        }
+
+    *gr = udc;
+    return 0;
+}
+
+/*
+ *      Code convert wo tomonau UDC area no kakutoku
+ *      GetUDCCPArea() / glyph_to_code()
+ *
+ */
+
+static int
+_xudc_gi_to_vgi(lcd,locale,charset_str,codeset,gi,vgi,charsetname,size)
+XLCd   lcd;
+char   *locale;
+char   *charset_str;
+int    codeset;
+unsigned long  gi;
+unsigned long  *vgi;
+char    *charsetname;
+int    size;
+{
+    _XUDCGlyphRegion *udc;
+    int num = 0,count,num_ret=0;
+    int i,j,k;
+    char **value,buf[128],ptr;
+    FontData font_data;
+
+
+    sprintf(buf, "fs%d.charset.name", codeset-1);
+    _XlcGetLocaleDataBase(lcd, "XLC_FONTSET", buf, &value, &count);
+    if(count > 0){
+        strcpy(charsetname,value[0]);
+    }
+    if (count >= size)
+       return False;
+    sprintf(buf, "fs%d.font.primary", codeset-1);
+    _XlcGetLocaleDataBase(lcd, "XLC_FONTSET", buf, &value, &count);
+    if(count > 0){
+       font_data = read_EncodingInfo(count,value);
+        for(i=0;i<count;i++){
+            if( !_XlcCompareISOLatin1(font_data[i].name,charset_str)){
+                for(k=0;k<font_data[i].scopes_num;k++){
+                   if( gi_to_vgi(gi,vgi,&(font_data[i].scopes[k])) == True){
+                       return(True);
+                    }
+               }
+           }
+        }
+    }
+/*
+    free_fontdata(font_data);
+*/
+    *vgi = gi;
+    return(True);
+}
+
+Bool non_standard(lcd,charset)
+XLCd   lcd;
+XlcCharSet     charset;
+{
+    char buf[256];
+    int count,i;
+    char **value;
+    if(charset->ct_sequence == NULL){
+            return(False);
+    }
+    for(i=0;;i++){
+       sprintf(buf, "csd%d.charset_name", i);
+       _XlcGetLocaleDataBase(lcd, "XLC_CHARSET_DEFINE", buf, &value, &count);
+       if(count > 0){
+           if(!_XlcNCompareISOLatin1(value[0],
+                       charset->name,strlen(value[0])) ){
+               return(True);
+           }
+       } else {
+            return(False);
+       }
+    }
+}
+
+static Bool
+make_none_standard(from,charset,src,size)
+char *from;
+XlcCharSet     charset;
+char *src;
+int size;
+{
+    int name_len,seq_len,rest_len,i;
+    name_len = 2 + strlen(charset->encoding_name) + 1;
+    seq_len = strlen(charset->ct_sequence);
+    rest_len = strlen(charset->encoding_name) + 1 + strlen(src);
+    if (name_len + seq_len + strlen(src) >= size || rest_len >= 0x4000)
+       return False;
+    strcpy(from,charset->ct_sequence);
+    from[seq_len]    = (rest_len >> 7) + 128;
+    from[seq_len+1]  = (rest_len & 0x7f) + 128;
+    strcpy(&from[seq_len + 2],charset->encoding_name);
+    from[seq_len+name_len-1]  = 0x02;  /* STX */
+    strcpy(&from[seq_len + name_len],src);
+    return True;
+}
+int
+_xudc_glyph_to_code(locale,charset_str,codeset,glyph_index,codepoint)
+char   *locale;
+char   *charset_str;
+int    codeset;
+unsigned long  glyph_index;
+unsigned long  *codepoint;
+{
+    XLCd       lcd;
+    unsigned char *from; int   from_left;
+    unsigned char *to  ; int   to_left = 10;
+    unsigned char *dst;
+    unsigned char byte;
+    unsigned long from32[25];
+    unsigned long to32[25];
+    int             i,j;
+    char charsetname[256],src[10];
+    XlcConv    conv;
+    XlcCharSet         charset;
+    XPointer args[2];
+
+    from = (unsigned char *)from32;
+    to   = (unsigned char *)to32;
+    dst  = (unsigned char *)to32;
+
+    memset(dst,0,25);
+
+    lcd = (XLCd)_XlcGenericLoader(locale);
+
+    if (!_xudc_gi_to_vgi(lcd,locale,charset_str,codeset,
+       glyph_index,&glyph_index,charsetname,sizeof(charsetname)))
+       return(_XUDC_ERROR);
+
+    for(i=0,j=0;i<4;i++){
+       byte = getbyte(glyph_index,i);
+       if(byte){
+           src[j] = byte;
+            j ++;
+       }
+    }
+    src[j] = 0;
+
+
+    /* get charset */
+/*
+    sprintf(tmp,"%s%s",charset_str,":GL");
+    charset_name = strdup(tmp);
+*/
+    charset = _XlcGetCharSet(charsetname);
+    if(charset == NULL){
+       _xudc_utyerrno = 0x16 ;
+       return(_XUDC_ERROR);
+    }
+    /* make ct */
+    if( non_standard(lcd,charset)) {
+        if (!make_none_standard(from,charset,src,sizeof(from32)))
+           return(_XUDC_ERROR);
+    } else if(charset->ct_sequence){
+       if (strlen(charset->ct_sequence) + strlen(src) >= sizeof(from32))
+           return(_XUDC_ERROR);
+        sprintf((char *)from,"%s%s",charset->ct_sequence,src);
+    } else {
+        sprintf((char *)from,"%s\0",src);
+    }
+    /* compound text -> multi byte */
+    conv = _XlcOpenConverter(lcd, XlcNCompoundText, lcd, XlcNMultiByte);
+    from_left = strlen((char *)from);
+    _XlcConvert(conv,(XPointer *)&from,&from_left,
+                     (XPointer *)&to,  &to_left,args,0);
+    _XlcCloseConverter(conv);
+    _XlcDestroyLC(lcd);
+
+    *codepoint = 0;
+    for(i=0;dst[i];i++){
+        *codepoint = ((*codepoint << 8) | dst[i]) ;
+    }
+    return(0);
+}
+
+typedef struct __XUDCCodeRegion {
+       unsigned long start,end;
+} _XUDCCodeRegion ;
+
+int
+_XUDCGetUDCCPArea(locale,codeset,charset_str,cr,num_cr)
+char           *locale;
+int            codeset;
+char           *charset_str;
+_XUDCCodeRegion **cr;
+int  *num_cr;
+{
+    int i,num_gr,ret;
+    _XUDCGlyphRegion *gr;
+    _XUDCCodeRegion  *crr;
+
+    _xudc_utyerror  = 0;
+    _xudc_utyderror = 0;
+
+    if(cr == NULL){
+        _xudc_utyerror  = 5;
+        _xudc_utyderror = 1;
+       _xudc_utyerrno = 0x04 ;
+       _xudc_utyerrno |= (0x0a<<8) ;
+        return(_XUDC_ERROR);
+    }
+    if(num_cr == NULL){
+        _xudc_utyerror  = 5;
+        _xudc_utyderror = 2;
+       _xudc_utyerrno = 0x04 ;
+       _xudc_utyerrno |= (0x0a<<8) ;
+        return(_XUDC_ERROR);
+    }
+
+    ret = _XUDCGetUDCGIArea(locale,codeset,charset_str,&gr,&num_gr);
+    if(ret == _XUDC_ERROR){
+       _xudc_utyerrno &= 0xff ;
+       _xudc_utyerrno |= (0x0a<<8) ;
+       return(ret);
+    }
+
+    crr = (_XUDCCodeRegion *)Xmalloc(num_gr*sizeof(_XUDCCodeRegion));
+    if(crr == NULL){
+       Xfree(gr);
+       _xudc_utyerrno = 0x03 ;
+       _xudc_utyerrno |= (0x0a<<8) ;
+       return(_XUDC_ERROR);
+    }
+
+    for(i=0;i<num_gr;i++){
+       ret = _xudc_glyph_to_code(locale,charset_str,codeset,
+               gr[i].start, &(crr[i].start));
+       if(ret == _XUDC_ERROR){
+           _xudc_utyerrno |= (0x0a<<8) ;
+           Xfree(gr);
+           Xfree(crr);
+           return(ret);
+       }
+       ret = _xudc_glyph_to_code(locale,charset_str,codeset,
+               gr[i].end, &(crr[i].end));
+       if(ret == _XUDC_ERROR){
+           _xudc_utyerrno |= (0x0a<<8) ;
+           Xfree(gr);
+           Xfree(crr);
+           return(ret);
+       }
+    }
+    Xfree(gr);
+    *cr = crr;
+    *num_cr = num_gr;
+    return(0);
+}
+
+/*
+ *    code_to_glyph()
+ *
+ */
+typedef struct __XUDCGIInf {
+    char               *charset_str;
+    unsigned long      glyph_index;
+} _XUDCGIInf ;
+
+/*
+ *
+ *
+ */
+static Bool vgi_to_gi(gi,vgi,scope)
+unsigned long  *gi,vgi;
+FontScope      scope;
+{
+    if(vgi >= scope->start && vgi <= scope->end){
+        if(scope->shift_direction == (unsigned long)'+'){
+            *gi = vgi + scope->shift;
+        } else {
+            *gi = vgi - scope->shift;
+        }
+        return(True);
+    }
+    return(False);
+}
+/*
+ *
+ *
+ */
+static Bool
+_xudc_vgi_to_gi(lcd,locale,vglyph,glyph,charset,charsetname,size)
+XLCd    lcd;
+char    *locale;
+unsigned long   vglyph;
+unsigned long   *glyph;
+XlcCharSet     charset;
+char    *charsetname;
+int    size;
+{
+    int num = 0,count,num_ret=0;
+    int i,j,k;
+    char **value,buf[128],ptr;
+    FontData font_data;
+    CodeSet cs;
+
+
+    for(i=0;;i++){
+        sprintf(buf, "fs%d.charset.name",i);
+        _XlcGetLocaleDataBase(lcd, "XLC_FONTSET", buf, &value, &count);
+        if(count > 0){
+            if(!_XlcNCompareISOLatin1(charset->name,value[0],
+                       strlen(charset->name))){
+               break;
+           }
+        } else {
+           _xudc_utyerrno = 0x17 ;
+           return(False);
+       }
+    }
+/*
+    sprintf(buf, "fs%d.charset.name", codeset-1);
+    _XlcGetLocaleDataBase(lcd, "XLC_FONTSET", buf, &value, &count);
+    if(count > 0){
+        strcpy(charsetname,value[0]);
+    }
+*/
+    sprintf(buf, "fs%d.font.primary", i);
+    _XlcGetLocaleDataBase(lcd, "XLC_FONTSET", buf, &value, &count);
+    if(count > 0){
+       font_data = read_EncodingInfo(count,value);
+        for(i=0;i<count;i++){
+            for(k=0;k<font_data[i].scopes_num;k++){
+               if( vgi_to_gi(glyph,vglyph,&(font_data[i].scopes[k])) == True){
+                   if (strlen(font_data[i].name) >= size)
+                       return(False);
+                   strcpy(charsetname,font_data[i].name);
+                   return(True);
+                }
+           }
+        }
+    }
+    *glyph = vglyph;
+    return(True);
+}
+int
+_xudc_code_to_glyph(locale,codepoint,gi,num_gi)
+char           *locale;
+unsigned long  codepoint;
+_XUDCGIInf     **gi;
+int            *num_gi;
+{
+    XLCd        lcd;
+    unsigned char *from; int    from_left;
+    unsigned char *to  ; int    to_left = 10;
+    unsigned char *dst;
+    unsigned char byte;
+    unsigned int from32[25];
+    unsigned int to32[25];
+    int      i,j;
+    char charsetname[256],src[10];
+    XlcConv     conv;
+    XlcCharSet  charset;
+    XPointer args[2];
+    unsigned long glyph,vglyph;
+
+    from = (unsigned char *)from32;
+    to   = (unsigned char *)to32;
+    dst  = (unsigned char *)to32;
+    memset(dst,0,25);
+
+    lcd = (XLCd)_XlcGenericLoader(locale);
+
+    for(i=0,j=0;i<4;i++){
+       byte = getbyte(codepoint,i);
+       if(byte){
+           src[j] = byte;
+            j ++;
+       }
+    }
+    src[j] = 0;
+    sprintf((char *)from,"%s\0",src);
+    /* multi byte -> vgi */
+    conv = _XlcOpenConverter(lcd, XlcNMultiByte, lcd, XlcNCharSet);
+    from_left = strlen((char *)from);
+    args[0] = (XPointer) &charset;
+    _XlcConvert(conv,(XPointer *)&from,&from_left,
+                     (XPointer *)&to,  &to_left,args,1);
+
+    /* vgi -> gi */
+    vglyph = 0;
+    for(i=0;dst[i];i++){
+        vglyph = ((vglyph << 8) | dst[i]) ;
+    }
+    if(_xudc_vgi_to_gi(lcd,locale,vglyph,&glyph,charset,charsetname,
+                       sizeof(charsetname))==False){
+        _XlcCloseConverter(conv);
+       _XlcDestroyLC(lcd);
+        *num_gi = 0;
+       return(0);
+    }
+
+    _XlcCloseConverter(conv);
+    _XlcDestroyLC(lcd);
+
+    *gi = (_XUDCGIInf *)Xmalloc(sizeof(_XUDCGIInf));
+    (*gi)->charset_str = (char *)Xmalloc(strlen(charsetname)+1);
+    strcpy((*gi)->charset_str,charsetname);
+    (*gi)->glyph_index = glyph;
+    if(*gi == NULL){
+       _xudc_utyerrno = 0x03 ;
+        return(_XUDC_ERROR);
+    }
+    *num_gi = 1;
+    return(0);
+}
+
diff --git a/src/util/Makefile.am b/src/util/Makefile.am
new file mode 100644 (file)
index 0000000..dfe91f1
--- /dev/null
@@ -0,0 +1,27 @@
+
+noinst_PROGRAMS=makekeys
+
+makekeys_CFLAGS = \
+       $(X11_CFLAGS) \
+       $(CWARNFLAGS)
+
+makekeys_CPPFLAGS = \
+       -I$(top_srcdir)/include
+
+CC = @CC_FOR_BUILD@
+CPPFLAGS = @CPPFLAGS_FOR_BUILD@
+CFLAGS = @CFLAGS_FOR_BUILD@
+LDFLAGS = @LDFLAGS_FOR_BUILD@
+
+EXTRA_DIST = mkks.sh
+
+if LINT
+# Check source code with tools like lint & sparse
+
+ALL_LINT_FLAGS=$(LINT_FLAGS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+               $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS)
+
+lint:
+       $(LINT) $(ALL_LINT_FLAGS) makekeys.c
+
+endif LINT
diff --git a/src/util/makekeys.c b/src/util/makekeys.c
new file mode 100644 (file)
index 0000000..5613e42
--- /dev/null
@@ -0,0 +1,317 @@
+/*
+
+Copyright 1990, 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 hash tables for XStringToKeysym and XKeysymToString. */
+
+#include <X11/X.h>
+#include <X11/Xos.h>
+#include <X11/Xresource.h>
+#include <X11/keysymdef.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "../Xresinternal.h"
+
+#define KTNUM 4000
+
+static struct info {
+    char       *name;
+    KeySym     val;
+} info[KTNUM];
+
+#define MIN_REHASH 15
+#define MATCHES 10
+
+static char tab[KTNUM];
+static unsigned short offsets[KTNUM];
+static unsigned short indexes[KTNUM];
+static KeySym values[KTNUM];
+static int ksnum = 0;
+
+static int
+parse_line(const char *buf, char *key, KeySym *val, char *prefix)
+{
+    int i;
+    char alias[128];
+    char *tmp, *tmpa;
+
+    /* See if we can catch a straight XK_foo 0x1234-style definition first;
+     * the trickery around tmp is to account for prefices. */
+    i = sscanf(buf, "#define %127s 0x%lx", key, val);
+    if (i == 2 && (tmp = strstr(key, "XK_"))) {
+        memcpy(prefix, key, tmp - key);
+        prefix[tmp - key] = '\0';
+        tmp += 3;
+        memmove(key, tmp, strlen(tmp) + 1);
+        return 1;
+    }
+
+    /* Now try to catch alias (XK_foo XK_bar) definitions, and resolve them
+     * immediately: if the target is in the form XF86XK_foo, we need to
+     * canonicalise this to XF86foo before we do the lookup. */
+    i = sscanf(buf, "#define %127s %127s", key, alias);
+    if (i == 2 && (tmp = strstr(key, "XK_")) && (tmpa = strstr(alias, "XK_"))) {
+        memcpy(prefix, key, tmp - key);
+        prefix[tmp - key] = '\0';
+        tmp += 3;
+        memmove(key, tmp, strlen(tmp) + 1);
+        memmove(tmpa, tmpa + 3, strlen(tmpa + 3) + 1);
+
+        for (i = ksnum - 1; i >= 0; i--) {
+            if (strcmp(info[i].name, alias) == 0) {
+                *val = info[i].val;
+                return 1;
+            }
+        }
+
+        fprintf(stderr, "can't find matching definition %s for keysym %s%s\n",
+                alias, prefix, key);
+    }
+
+    return 0;
+}
+
+int
+main(int argc, char *argv[])
+{
+    int max_rehash;
+    Signature sig;
+    int i, j, k, l, z;
+    FILE *fptr;
+    char *name;
+    char c;
+    int first;
+    int best_max_rehash;
+    int best_z = 0;
+    int num_found;
+    KeySym val;
+    char key[128], prefix[128];
+    static char buf[1024];
+
+    for (l = 1; l < argc; l++) {
+        fptr = fopen(argv[l], "r");
+        if (!fptr) {
+            fprintf(stderr, "couldn't open %s\n", argv[l]);
+            continue;
+        }
+
+        while (fgets(buf, sizeof(buf), fptr)) {
+            if (!parse_line(buf, key, &val, prefix))
+                continue;
+
+            if (val == XK_VoidSymbol)
+                val = 0;
+            if (val > 0x1fffffff) {
+                fprintf(stderr, "ignoring illegal keysym (%s, %lx)\n", key,
+                        val);
+                continue;
+            }
+
+            name = malloc(strlen(prefix) + strlen(key) + 1);
+            if (!name) {
+                fprintf(stderr, "makekeys: out of memory!\n");
+                exit(1);
+            }
+            sprintf(name, "%s%s", prefix, key);
+            info[ksnum].name = name;
+            info[ksnum].val = val;
+            ksnum++;
+            if (ksnum == KTNUM) {
+                fprintf(stderr, "makekeys: too many keysyms!\n");
+                exit(1);
+            }
+        }
+
+        fclose(fptr);
+    }
+
+    printf("/* This file is generated from keysymdef.h. */\n");
+    printf("/* Do not edit. */\n");
+    printf("\n");
+
+    best_max_rehash = ksnum;
+    num_found = 0;
+    for (z = ksnum; z < KTNUM; z++) {
+       max_rehash = 0;
+       for (name = tab, i = z; --i >= 0;)
+               *name++ = 0;
+       for (i = 0; i < ksnum; i++) {
+           name = info[i].name;
+           sig = 0;
+           while ((c = *name++))
+               sig = (sig << 1) + c;
+           first = j = sig % z;
+           for (k = 0; tab[j]; k++) {
+               j += first + 1;
+               if (j >= z)
+                   j -= z;
+               if (j == first)
+                   goto next1;
+           }
+           tab[j] = 1;
+           if (k > max_rehash)
+               max_rehash = k;
+       }
+       if (max_rehash < MIN_REHASH) {
+           if (max_rehash < best_max_rehash) {
+               best_max_rehash = max_rehash;
+               best_z = z;
+           }
+           num_found++;
+           if (num_found >= MATCHES)
+               break;
+       }
+next1: ;
+    }
+
+    z = best_z;
+    if (z == 0) {
+       fprintf(stderr, "makekeys: failed to find small enough hash!\n"
+               "Try increasing KTNUM in makekeys.c\n");
+       exit(1);
+    }
+    printf("#ifdef NEEDKTABLE\n");
+    printf("const unsigned char _XkeyTable[] = {\n");
+    printf("0,\n");
+    k = 1;
+    for (i = 0; i < ksnum; i++) {
+       name = info[i].name;
+       sig = 0;
+       while ((c = *name++))
+           sig = (sig << 1) + c;
+       first = j = sig % z;
+       while (offsets[j]) {
+           j += first + 1;
+           if (j >= z)
+               j -= z;
+       }
+       offsets[j] = k;
+       indexes[i] = k;
+       val = info[i].val;
+       printf("0x%.2"PRIx32", 0x%.2"PRIx32", 0x%.2lx, 0x%.2lx, 0x%.2lx, 0x%.2lx, ",
+              (sig >> 8) & 0xff, sig & 0xff,
+              (val >> 24) & 0xff, (val >> 16) & 0xff,
+              (val >> 8) & 0xff, val & 0xff);
+       for (name = info[i].name, k += 7; (c = *name++); k++)
+           printf("'%c',", c);
+       printf((i == (ksnum-1)) ? "0\n" : "0,\n");
+    }
+    printf("};\n");
+    printf("\n");
+    printf("#define KTABLESIZE %d\n", z);
+    printf("#define KMAXHASH %d\n", best_max_rehash + 1);
+    printf("\n");
+    printf("static const unsigned short hashString[KTABLESIZE] = {\n");
+    for (i = 0; i < z;) {
+       printf("0x%.4x", offsets[i]);
+       i++;
+       if (i == z)
+           break;
+       printf((i & 7) ? ", " : ",\n");
+    }
+    printf("\n");
+    printf("};\n");
+    printf("#endif /* NEEDKTABLE */\n");
+
+    best_max_rehash = ksnum;
+    num_found = 0;
+    for (z = ksnum; z < KTNUM; z++) {
+       max_rehash = 0;
+       for (name = tab, i = z; --i >= 0;)
+               *name++ = 0;
+       for (i = 0; i < ksnum; i++) {
+           val = info[i].val;
+           first = j = val % z;
+           for (k = 0; tab[j]; k++) {
+               if (values[j] == val)
+                   goto skip1;
+               j += first + 1;
+               if (j >= z)
+                   j -= z;
+               if (j == first)
+                   goto next2;
+           }
+           tab[j] = 1;
+           values[j] = val;
+           if (k > max_rehash)
+               max_rehash = k;
+skip1: ;
+       }
+       if (max_rehash < MIN_REHASH) {
+           if (max_rehash < best_max_rehash) {
+               best_max_rehash = max_rehash;
+               best_z = z;
+           }
+           num_found++;
+           if (num_found >= MATCHES)
+               break;
+       }
+next2: ;
+    }
+
+    z = best_z;
+    if (z == 0) {
+       fprintf(stderr, "makekeys: failed to find small enough hash!\n"
+               "Try increasing KTNUM in makekeys.c\n");
+       exit(1);
+    }
+    for (i = z; --i >= 0;)
+       offsets[i] = 0;
+    for (i = 0; i < ksnum; i++) {
+       val = info[i].val;
+       first = j = val % z;
+       while (offsets[j]) {
+           if (values[j] == val)
+               goto skip2;
+           j += first + 1;
+           if (j >= z)
+               j -= z;
+       }
+       offsets[j] = indexes[i] + 2;
+       values[j] = val;
+skip2: ;
+    }
+    printf("\n");
+    printf("#ifdef NEEDVTABLE\n");
+    printf("#define VTABLESIZE %d\n", z);
+    printf("#define VMAXHASH %d\n", best_max_rehash + 1);
+    printf("\n");
+    printf("static const unsigned short hashKeysym[VTABLESIZE] = {\n");
+    for (i = 0; i < z;) {
+       printf("0x%.4x", offsets[i]);
+       i++;
+       if (i == z)
+           break;
+       printf((i & 7) ? ", " : ",\n");
+    }
+    printf("\n");
+    printf("};\n");
+    printf("#endif /* NEEDVTABLE */\n");
+
+    exit(0);
+}
diff --git a/src/util/mkks.sh b/src/util/mkks.sh
new file mode 100644 (file)
index 0000000..262cc95
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+cat $* | awk 'BEGIN { \
+    printf "/*\n * This file is generated from %s.  Do not edit.\n */\n", \
+          "$(INCLUDESRC)/keysymdef.h";\
+} \
+/^#define/ { \
+       len = length($2)-3; \
+       printf("{ \"%s\", %s },\n", substr($2,4,len), $3); \
+}' 
+
diff --git a/src/utlist.h b/src/utlist.h
new file mode 100644 (file)
index 0000000..215c2c6
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+Copyright (c) 2007-2009, Troy D. Hanson
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef UTLIST_H
+#define UTLIST_H
+
+#define UTLIST_VERSION 1.7
+
+/* From: http://uthash.sourceforge.net/utlist.html */
+/*
+ * This file contains macros to manipulate singly and doubly-linked lists.
+ *
+ * 1. LL_ macros:  singly-linked lists.
+ * 2. DL_ macros:  doubly-linked lists.
+ * 3. CDL_ macros: circular doubly-linked lists.
+ *
+ * To use singly-linked lists, your structure must have a "next" pointer.
+ * To use doubly-linked lists, your structure must "prev" and "next" pointers.
+ * Either way, the pointer to the head of the list must be initialized to NULL.
+ *
+ * ----------------.EXAMPLE -------------------------
+ * struct item {
+ *      int id;
+ *      struct item *prev, *next;
+ * }
+ *
+ * struct item *list = NULL:
+ *
+ * int main() {
+ *      struct item *item;
+ *      ... allocate and populate item ...
+ *      DL_APPEND(list, item);
+ * }
+ * --------------------------------------------------
+ *
+ * For doubly-linked lists, the append and delete macros are O(1)
+ * For singly-linked lists, append and delete are O(n) but prepend is O(1)
+ * The sort macro is O(n log(n)) for all types of single/double/circular lists.
+ */
+
+
+/******************************************************************************
+ * doubly linked list macros (non-circular)                                   *
+ *****************************************************************************/
+#define DL_PREPEND(head,add)                                                     \
+do {                                                                             \
+ (add)->next = head;                                                             \
+ if (head) {                                                                     \
+   (add)->prev = (head)->prev;                                                   \
+   (head)->prev = (add);                                                         \
+ } else {                                                                        \
+   (add)->prev = (add);                                                          \
+ }                                                                               \
+ (head) = (add);                                                                 \
+} while (0)
+
+#define DL_APPEND(head,add)                                                      \
+do {                                                                             \
+  if (head) {                                                                    \
+      (add)->prev = (head)->prev;                                                \
+      (head)->prev->next = (add);                                                \
+      (head)->prev = (add);                                                      \
+      (add)->next = NULL;                                                        \
+  } else {                                                                       \
+      (head)=(add);                                                              \
+      (head)->prev = (head);                                                     \
+      (head)->next = NULL;                                                       \
+  }                                                                              \
+} while (0);
+
+#define DL_DELETE(head,del)                                                      \
+do {                                                                             \
+  if ((del)->prev == (del)) {                                                    \
+      (head)=NULL;                                                               \
+  } else if ((del)==(head)) {                                                    \
+      (del)->next->prev = (del)->prev;                                           \
+      (head) = (del)->next;                                                      \
+  } else {                                                                       \
+      (del)->prev->next = (del)->next;                                           \
+      if ((del)->next) {                                                         \
+          (del)->next->prev = (del)->prev;                                       \
+      } else {                                                                   \
+          (head)->prev = (del)->prev;                                            \
+      }                                                                          \
+  }                                                                              \
+} while (0);
+
+
+#define DL_FOREACH(head,el)                                                      \
+    for(el=head;el;el=el->next)
+
+#define DL_FOREACH_SAFE(head,el,tmp)                                             \
+    for(el=head,tmp=el->next;el;el=tmp,tmp=(el) ? (el->next) : NULL)
+
+#endif /* UTLIST_H */
+
diff --git a/src/x11_xcb.c b/src/x11_xcb.c
new file mode 100644 (file)
index 0000000..3ddf403
--- /dev/null
@@ -0,0 +1,15 @@
+/* Copyright (C) 2003,2006 Jamey Sharp, Josh Triplett
+ * This file is licensed under the MIT license. See the file COPYING. */
+
+#include "Xlibint.h"
+#include "Xxcbint.h"
+
+xcb_connection_t *XGetXCBConnection(Display *dpy)
+{
+       return dpy->xcb->connection;
+}
+
+void XSetEventQueueOwner(Display *dpy, enum XEventQueueOwner owner)
+{
+       dpy->xcb->event_owner = owner;
+}
diff --git a/src/xcb_disp.c b/src/xcb_disp.c
new file mode 100644 (file)
index 0000000..0fa40de
--- /dev/null
@@ -0,0 +1,108 @@
+/* Copyright (C) 2003-2006 Jamey Sharp, Josh Triplett
+ * This file is licensed under the MIT license. See the file COPYING. */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "Xlibint.h"
+#include "Xxcbint.h"
+#include <xcb/xcbext.h>
+#include <X11/Xatom.h>
+#include <X11/Xresource.h>
+#include <stdio.h>
+
+static xcb_auth_info_t xauth;
+
+static void *alloc_copy(const void *src, int *dstn, size_t n)
+{
+       void *dst;
+       if(n <= 0)
+       {
+               *dstn = 0;
+               return NULL;
+       }
+       dst = Xmalloc(n);
+       if(!dst)
+               return NULL;
+       memcpy(dst, src, n);
+       *dstn = n;
+       return dst;
+}
+
+void XSetAuthorization(char *name, int namelen, char *data, int datalen)
+{
+       _XLockMutex(_Xglobal_lock);
+       Xfree(xauth.name);
+       Xfree(xauth.data);
+
+       /* if either of these allocs fail, _XConnectXCB won't use this auth
+        * data, so we don't need to check it here. */
+       xauth.name = alloc_copy(name, &xauth.namelen, namelen);
+       xauth.data = alloc_copy(data, &xauth.datalen, datalen);
+
+#if 0 /* but, for the paranoid among us: */
+       if((namelen > 0 && !xauth.name) || (datalen > 0 && !xauth.data))
+       {
+               Xfree(xauth.name);
+               Xfree(xauth.data);
+               xauth.name = xauth.data = 0;
+               xauth.namelen = xauth.datalen = 0;
+       }
+#endif
+
+       _XUnlockMutex(_Xglobal_lock);
+}
+
+int _XConnectXCB(Display *dpy, _Xconst char *display, int *screenp)
+{
+       char *host;
+       int n = 0;
+       xcb_connection_t *c;
+
+       dpy->fd = -1;
+
+       dpy->xcb = Xcalloc(1, sizeof(_X11XCBPrivate));
+       if(!dpy->xcb)
+               return 0;
+
+       if(!xcb_parse_display(display, &host, &n, screenp))
+               return 0;
+       /* host and n are unused, but xcb_parse_display requires them */
+       free(host);
+
+       _XLockMutex(_Xglobal_lock);
+       if(xauth.name && xauth.data)
+               c = xcb_connect_to_display_with_auth_info(display, &xauth, NULL);
+       else
+               c = xcb_connect(display, NULL);
+       _XUnlockMutex(_Xglobal_lock);
+
+       dpy->fd = xcb_get_file_descriptor(c);
+
+       dpy->xcb->connection = c;
+       dpy->xcb->next_xid = xcb_generate_id(dpy->xcb->connection);
+
+       dpy->xcb->event_notify = xcondition_malloc();
+       dpy->xcb->reply_notify = xcondition_malloc();
+       if (!dpy->xcb->event_notify || !dpy->xcb->reply_notify)
+               return 0;
+       xcondition_init(dpy->xcb->event_notify);
+       xcondition_init(dpy->xcb->reply_notify);
+       return !xcb_connection_has_error(c);
+}
+
+void _XFreeX11XCBStructure(Display *dpy)
+{
+       /* reply_data was allocated by system malloc, not Xmalloc */
+       free(dpy->xcb->reply_data);
+       while(dpy->xcb->pending_requests)
+       {
+               PendingRequest *tmp = dpy->xcb->pending_requests;
+               dpy->xcb->pending_requests = tmp->next;
+               free(tmp);
+       }
+       xcondition_free(dpy->xcb->event_notify);
+       xcondition_free(dpy->xcb->reply_notify);
+       Xfree(dpy->xcb);
+}
diff --git a/src/xcb_io.c b/src/xcb_io.c
new file mode 100644 (file)
index 0000000..376df23
--- /dev/null
@@ -0,0 +1,768 @@
+/* Copyright (C) 2003-2006 Jamey Sharp, Josh Triplett
+ * This file is licensed under the MIT license. See the file COPYING. */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "Xlibint.h"
+#include "locking.h"
+#include "Xprivate.h"
+#include "Xxcbint.h"
+#include <xcb/xcbext.h>
+
+#include <assert.h>
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+
+#define xcb_fail_assert(_message, _var) { \
+       unsigned int _var = 1; \
+       fprintf(stderr, "[xcb] Aborting, sorry about that.\n"); \
+       assert(!_var); \
+}
+
+#define throw_thread_fail_assert(_message, _var) { \
+       fprintf(stderr, "[xcb] " _message "\n"); \
+       fprintf(stderr, "[xcb] Most likely this is a multi-threaded client " \
+                       "and XInitThreads has not been called\n"); \
+       xcb_fail_assert(_message, _var); \
+}
+
+/* XXX: It would probably be most useful if we stored the last-processed
+ *      request, so we could find the offender from the message. */
+#define throw_extlib_fail_assert(_message, _var) { \
+       fprintf(stderr, "[xcb] " _message "\n"); \
+       fprintf(stderr, "[xcb] This is most likely caused by a broken X " \
+                       "extension library\n"); \
+       xcb_fail_assert(_message, _var); \
+}
+
+static void return_socket(void *closure)
+{
+       Display *dpy = closure;
+       InternalLockDisplay(dpy, /* don't skip user locks */ 0);
+       _XSend(dpy, NULL, 0);
+       dpy->bufmax = dpy->buffer;
+       UnlockDisplay(dpy);
+}
+
+static void require_socket(Display *dpy)
+{
+       if(dpy->bufmax == dpy->buffer)
+       {
+               uint64_t sent;
+               int flags = 0;
+               /* if we don't own the event queue, we have to ask XCB
+                * to set our errors aside for us. */
+               if(dpy->xcb->event_owner != XlibOwnsEventQueue)
+                       flags = XCB_REQUEST_CHECKED;
+               if(!xcb_take_socket(dpy->xcb->connection, return_socket, dpy,
+                                   flags, &sent))
+                       _XIOError(dpy);
+               /* Xlib uses unsigned long for sequence numbers.  XCB
+                * uses 64-bit internally, but currently exposes an
+                * unsigned int API.  If these differ, Xlib cannot track
+                * the full 64-bit sequence number if 32-bit wrap
+                * happens while Xlib does not own the socket.  A
+                * complete fix would be to make XCB's public API use
+                * 64-bit sequence numbers. */
+               if (sizeof(unsigned long) > sizeof(unsigned int) &&
+                   dpy->xcb->event_owner == XlibOwnsEventQueue &&
+                   (sent - dpy->last_request_read >= (UINT64_C(1) << 32))) {
+                       throw_thread_fail_assert("Sequence number wrapped "
+                                                "beyond 32 bits while Xlib "
+                                                "did not own the socket",
+                                                xcb_xlib_seq_number_wrapped);
+               }
+               dpy->xcb->last_flushed = dpy->request = sent;
+               dpy->bufmax = dpy->xcb->real_bufmax;
+       }
+}
+
+/* Call internal connection callbacks for any fds that are currently
+ * ready to read. This function will not block unless one of the
+ * callbacks blocks.
+ *
+ * This code borrowed from _XWaitForReadable. Inverse call tree:
+ * _XRead
+ *  _XWaitForWritable
+ *   _XFlush
+ *   _XSend
+ *  _XEventsQueued
+ *  _XReadEvents
+ *  _XRead[0-9]+
+ *   _XAllocIDs
+ *  _XReply
+ *  _XEatData
+ * _XReadPad
+ */
+static void check_internal_connections(Display *dpy)
+{
+       struct _XConnectionInfo *ilist;
+       fd_set r_mask;
+       struct timeval tv;
+       int result;
+       int highest_fd = -1;
+
+       if(dpy->flags & XlibDisplayProcConni || !dpy->im_fd_info)
+               return;
+
+       FD_ZERO(&r_mask);
+       for(ilist = dpy->im_fd_info; ilist; ilist = ilist->next)
+       {
+               assert(ilist->fd >= 0);
+               FD_SET(ilist->fd, &r_mask);
+               if(ilist->fd > highest_fd)
+                       highest_fd = ilist->fd;
+       }
+       assert(highest_fd >= 0);
+
+       tv.tv_sec = 0;
+       tv.tv_usec = 0;
+       result = select(highest_fd + 1, &r_mask, NULL, NULL, &tv);
+
+       if(result == -1)
+       {
+               if(errno == EINTR)
+                       return;
+               _XIOError(dpy);
+       }
+
+       for(ilist = dpy->im_fd_info; result && ilist; ilist = ilist->next)
+               if(FD_ISSET(ilist->fd, &r_mask))
+               {
+                       _XProcessInternalConnection(dpy, ilist);
+                       --result;
+               }
+}
+
+static PendingRequest *append_pending_request(Display *dpy, unsigned long sequence)
+{
+       PendingRequest *node = malloc(sizeof(PendingRequest));
+       assert(node);
+       node->next = NULL;
+       node->sequence = sequence;
+       node->reply_waiter = 0;
+       if(dpy->xcb->pending_requests_tail)
+       {
+               if (XLIB_SEQUENCE_COMPARE(dpy->xcb->pending_requests_tail->sequence,
+                                         >=, node->sequence))
+                       throw_thread_fail_assert("Unknown sequence number "
+                                                "while appending request",
+                                                xcb_xlib_unknown_seq_number);
+               if (dpy->xcb->pending_requests_tail->next != NULL)
+                       throw_thread_fail_assert("Unknown request in queue "
+                                                "while appending request",
+                                                xcb_xlib_unknown_req_pending);
+               dpy->xcb->pending_requests_tail->next = node;
+       }
+       else
+               dpy->xcb->pending_requests = node;
+       dpy->xcb->pending_requests_tail = node;
+       return node;
+}
+
+static void dequeue_pending_request(Display *dpy, PendingRequest *req)
+{
+       if (req != dpy->xcb->pending_requests)
+               throw_thread_fail_assert("Unknown request in queue while "
+                                        "dequeuing",
+                                        xcb_xlib_unknown_req_in_deq);
+
+       dpy->xcb->pending_requests = req->next;
+       if(!dpy->xcb->pending_requests)
+       {
+               if (req != dpy->xcb->pending_requests_tail)
+                       throw_thread_fail_assert("Unknown request in queue "
+                                                "while dequeuing",
+                                                xcb_xlib_unknown_req_in_deq);
+               dpy->xcb->pending_requests_tail = NULL;
+       }
+       else if (XLIB_SEQUENCE_COMPARE(req->sequence, >=,
+                                      dpy->xcb->pending_requests->sequence))
+               throw_thread_fail_assert("Unknown sequence number while "
+                                        "dequeuing request",
+                                        xcb_xlib_threads_sequence_lost);
+
+       free(req);
+}
+
+static int handle_error(Display *dpy, xError *err, Bool in_XReply)
+{
+       _XExtension *ext;
+       int ret_code;
+       /* Oddly, Xlib only allows extensions to suppress errors when
+        * those errors were seen by _XReply. */
+       if(in_XReply)
+               /*
+                * we better see if there is an extension who may
+                * want to suppress the error.
+                */
+               for(ext = dpy->ext_procs; ext; ext = ext->next)
+                       if(ext->error && (*ext->error)(dpy, err, &ext->codes, &ret_code))
+                               return ret_code;
+       _XError(dpy, err);
+       return 0;
+}
+
+/* Widen a 32-bit sequence number into a native-word-size (unsigned long)
+ * sequence number.  Treating the comparison as a 1 and shifting it avoids a
+ * conditional branch, and shifting by 16 twice avoids a compiler warning when
+ * sizeof(unsigned long) == 4. */
+static void widen(unsigned long *wide, unsigned int narrow)
+{
+       unsigned long new = (*wide & ~0xFFFFFFFFUL) | narrow;
+       *wide = new + ((unsigned long) (new < *wide) << 16 << 16);
+}
+
+/* Thread-safety rules:
+ *
+ * At most one thread can be reading from XCB's event queue at a time.
+ * If you are not the current event-reading thread and you need to find
+ * out if an event is available, you must wait.
+ *
+ * The same rule applies for reading replies.
+ *
+ * A single thread cannot be both the the event-reading and the
+ * reply-reading thread at the same time.
+ *
+ * We always look at both the current event and the first pending reply
+ * to decide which to process next.
+ *
+ * We always process all responses in sequence-number order, which may
+ * mean waiting for another thread (either the event_waiter or the
+ * reply_waiter) to handle an earlier response before we can process or
+ * return a later one. If so, we wait on the corresponding condition
+ * variable for that thread to process the response and wake us up.
+ */
+
+static xcb_generic_reply_t *poll_for_event(Display *dpy)
+{
+       /* Make sure the Display's sequence numbers are valid */
+       require_socket(dpy);
+
+       /* Precondition: This thread can safely get events from XCB. */
+       assert(dpy->xcb->event_owner == XlibOwnsEventQueue && !dpy->xcb->event_waiter);
+
+       if(!dpy->xcb->next_event)
+#ifdef _F_REDUCE_SYSCALL
+               dpy->xcb->next_event = xcb_poll_for_queued_event(dpy->xcb->connection);
+#else
+               dpy->xcb->next_event = xcb_poll_for_event(dpy->xcb->connection);
+#endif
+
+       if(dpy->xcb->next_event)
+       {
+               PendingRequest *req = dpy->xcb->pending_requests;
+               xcb_generic_event_t *event = dpy->xcb->next_event;
+               unsigned long event_sequence = dpy->last_request_read;
+               widen(&event_sequence, event->full_sequence);
+               if(!req || XLIB_SEQUENCE_COMPARE(event_sequence, <, req->sequence)
+                       || (event->response_type != X_Error && event_sequence == req->sequence))
+               {
+                       if (XLIB_SEQUENCE_COMPARE(event_sequence, >,
+                                                 dpy->request))
+                       {
+                               throw_thread_fail_assert("Unknown sequence "
+                                                        "number while "
+                                                        "processing queue",
+                                               xcb_xlib_threads_sequence_lost);
+                       }
+                       dpy->last_request_read = event_sequence;
+                       dpy->xcb->next_event = NULL;
+                       return (xcb_generic_reply_t *) event;
+               }
+       }
+       return NULL;
+}
+
+static xcb_generic_reply_t *poll_for_response(Display *dpy)
+{
+       void *response;
+       xcb_generic_error_t *error;
+       PendingRequest *req;
+       while(!(response = poll_for_event(dpy)) &&
+             (req = dpy->xcb->pending_requests) &&
+             !req->reply_waiter &&
+             xcb_poll_for_reply(dpy->xcb->connection, req->sequence, &response, &error))
+       {
+               if(XLIB_SEQUENCE_COMPARE(req->sequence, >, dpy->request))
+               {
+                       throw_thread_fail_assert("Unknown sequence number "
+                                                "while awaiting reply",
+                                               xcb_xlib_threads_sequence_lost);
+               }
+               dpy->last_request_read = req->sequence;
+               if(response)
+                       break;
+               dequeue_pending_request(dpy, req);
+               if(error)
+                       return (xcb_generic_reply_t *) error;
+       }
+       return response;
+}
+
+static void handle_response(Display *dpy, xcb_generic_reply_t *response, Bool in_XReply)
+{
+       _XAsyncHandler *async, *next;
+       switch(response->response_type)
+       {
+       case X_Reply:
+               for(async = dpy->async_handlers; async; async = next)
+               {
+                       next = async->next;
+                       if(async->handler(dpy, (xReply *) response, (char *) response, sizeof(xReply) + (response->length << 2), async->data))
+                               break;
+               }
+               break;
+
+       case X_Error:
+               handle_error(dpy, (xError *) response, in_XReply);
+               break;
+
+       default: /* event */
+               /* GenericEvents may be > 32 bytes. In this case, the
+                * event struct is trailed by the additional bytes. the
+                * xcb_generic_event_t struct uses 4 bytes for internal
+                * numbering, so we need to shift the trailing data to
+                * be after the first 32 bytes. */
+               if(response->response_type == GenericEvent && ((xcb_ge_event_t *) response)->length)
+               {
+                       xcb_ge_event_t *event = (xcb_ge_event_t *) response;
+                       memmove(&event->full_sequence, &event[1], event->length * 4);
+               }
+               _XEnq(dpy, (xEvent *) response);
+               break;
+       }
+       free(response);
+}
+
+int _XEventsQueued(Display *dpy, int mode)
+{
+       xcb_generic_reply_t *response;
+       if(dpy->flags & XlibDisplayIOError)
+               return 0;
+       if(dpy->xcb->event_owner != XlibOwnsEventQueue)
+               return 0;
+
+       if(mode == QueuedAfterFlush)
+               _XSend(dpy, NULL, 0);
+       else
+               check_internal_connections(dpy);
+
+       /* If another thread is blocked waiting for events, then we must
+        * let that thread pick up the next event. Since it blocked, we
+        * can reasonably claim there are no new events right now. */
+       if(!dpy->xcb->event_waiter)
+       {
+#ifdef _F_REDUCE_SYSCALL
+               if(!dpy->xcb->next_event)
+                       dpy->xcb->next_event = xcb_poll_for_event(dpy->xcb->connection);
+#endif
+
+               while((response = poll_for_response(dpy)))
+                       handle_response(dpy, response, False);
+               if(xcb_connection_has_error(dpy->xcb->connection))
+                       _XIOError(dpy);
+       }
+       return dpy->qlen;
+}
+
+/* _XReadEvents - Flush the output queue,
+ * then read as many events as possible (but at least 1) and enqueue them
+ */
+void _XReadEvents(Display *dpy)
+{
+       xcb_generic_reply_t *response;
+       unsigned long serial;
+
+       if(dpy->flags & XlibDisplayIOError)
+               return;
+       _XSend(dpy, NULL, 0);
+       if(dpy->xcb->event_owner != XlibOwnsEventQueue)
+               return;
+       check_internal_connections(dpy);
+
+       serial = dpy->next_event_serial_num;
+       while(serial == dpy->next_event_serial_num || dpy->qlen == 0)
+       {
+               if(dpy->xcb->event_waiter)
+               {
+                       ConditionWait(dpy, dpy->xcb->event_notify);
+                       /* Maybe the other thread got us an event. */
+                       continue;
+               }
+
+               if(!dpy->xcb->next_event)
+               {
+                       xcb_generic_event_t *event;
+                       dpy->xcb->event_waiter = 1;
+                       UnlockDisplay(dpy);
+                       event = xcb_wait_for_event(dpy->xcb->connection);
+                       /* It appears that classic Xlib respected user
+                        * locks when waking up after waiting for
+                        * events. However, if this thread did not have
+                        * any user locks, and another thread takes a
+                        * user lock and tries to read events, then we'd
+                        * deadlock. So we'll choose to let the thread
+                        * that got in first consume events, despite the
+                        * later thread's user locks. */
+                       InternalLockDisplay(dpy, /* ignore user locks */ 1);
+                       dpy->xcb->event_waiter = 0;
+                       ConditionBroadcast(dpy, dpy->xcb->event_notify);
+                       if(!event)
+                               _XIOError(dpy);
+                       dpy->xcb->next_event = event;
+               }
+
+               /* We've established most of the conditions for
+                * poll_for_response to return non-NULL. The exceptions
+                * are connection shutdown, and finding that another
+                * thread is waiting for the next reply we'd like to
+                * process. */
+
+               response = poll_for_response(dpy);
+               if(response)
+                       handle_response(dpy, response, False);
+               else if(dpy->xcb->pending_requests->reply_waiter)
+               { /* need braces around ConditionWait */
+                       ConditionWait(dpy, dpy->xcb->reply_notify);
+               }
+               else
+                       _XIOError(dpy);
+       }
+
+       /* The preceding loop established that there is no
+        * event_waiter--unless we just called ConditionWait because of
+        * a reply_waiter, in which case another thread may have become
+        * the event_waiter while we slept unlocked. */
+       if(!dpy->xcb->event_waiter)
+               while((response = poll_for_response(dpy)))
+                       handle_response(dpy, response, False);
+       if(xcb_connection_has_error(dpy->xcb->connection))
+               _XIOError(dpy);
+}
+
+/*
+ * _XSend - Flush the buffer and send the client data. 32 bit word aligned
+ * transmission is used, if size is not 0 mod 4, extra bytes are transmitted.
+ *
+ * Note that the connection must not be read from once the data currently
+ * in the buffer has been written.
+ */
+void _XSend(Display *dpy, const char *data, long size)
+{
+       static const xReq dummy_request;
+       static char const pad[3];
+       struct iovec vec[3];
+       uint64_t requests;
+       _XExtension *ext;
+       xcb_connection_t *c = dpy->xcb->connection;
+       if(dpy->flags & XlibDisplayIOError)
+               return;
+
+       if(dpy->bufptr == dpy->buffer && !size)
+               return;
+
+       /* iff we asked XCB to set aside errors, we must pick those up
+        * eventually. iff there are async handlers, we may have just
+        * issued requests that will generate replies. in either case,
+        * we need to remember to check later. */
+       if(dpy->xcb->event_owner != XlibOwnsEventQueue || dpy->async_handlers)
+       {
+               uint64_t sequence;
+               for(sequence = dpy->xcb->last_flushed + 1; sequence <= dpy->request; ++sequence)
+                       append_pending_request(dpy, sequence);
+       }
+       requests = dpy->request - dpy->xcb->last_flushed;
+       dpy->xcb->last_flushed = dpy->request;
+
+       vec[0].iov_base = dpy->buffer;
+       vec[0].iov_len = dpy->bufptr - dpy->buffer;
+       vec[1].iov_base = (char *)data;
+       vec[1].iov_len = size;
+       vec[2].iov_base = (char *)pad;
+       vec[2].iov_len = -size & 3;
+
+       for(ext = dpy->flushes; ext; ext = ext->next_flush)
+       {
+               int i;
+               for(i = 0; i < 3; ++i)
+                       if(vec[i].iov_len)
+                               ext->before_flush(dpy, &ext->codes, vec[i].iov_base, vec[i].iov_len);
+       }
+
+       if(xcb_writev(c, vec, 3, requests) < 0)
+               _XIOError(dpy);
+       dpy->bufptr = dpy->buffer;
+       dpy->last_req = (char *) &dummy_request;
+
+       check_internal_connections(dpy);
+
+       _XSetSeqSyncFunction(dpy);
+}
+
+/*
+ * _XFlush - Flush the X request buffer.  If the buffer is empty, no
+ * action is taken.
+ */
+void _XFlush(Display *dpy)
+{
+       require_socket(dpy);
+       _XSend(dpy, NULL, 0);
+
+       _XEventsQueued(dpy, QueuedAfterReading);
+}
+
+static const XID inval_id = ~0UL;
+
+void _XIDHandler(Display *dpy)
+{
+       if (dpy->xcb->next_xid == inval_id)
+               _XAllocIDs(dpy, &dpy->xcb->next_xid, 1);
+}
+
+/* _XAllocID - resource ID allocation routine. */
+XID _XAllocID(Display *dpy)
+{
+       XID ret = dpy->xcb->next_xid;
+       assert (ret != inval_id);
+       dpy->xcb->next_xid = inval_id;
+       _XSetPrivSyncFunction(dpy);
+       return ret;
+}
+
+/* _XAllocIDs - multiple resource ID allocation routine. */
+void _XAllocIDs(Display *dpy, XID *ids, int count)
+{
+       int i;
+#ifdef XTHREADS
+       if (dpy->lock)
+               (*dpy->lock->user_lock_display)(dpy);
+       UnlockDisplay(dpy);
+#endif
+       for (i = 0; i < count; i++)
+               ids[i] = xcb_generate_id(dpy->xcb->connection);
+#ifdef XTHREADS
+       InternalLockDisplay(dpy, /* don't skip user locks */ 0);
+       if (dpy->lock)
+               (*dpy->lock->user_unlock_display)(dpy);
+#endif
+}
+
+static void _XFreeReplyData(Display *dpy, Bool force)
+{
+       if(!force && dpy->xcb->reply_consumed < dpy->xcb->reply_length)
+               return;
+       free(dpy->xcb->reply_data);
+       dpy->xcb->reply_data = NULL;
+}
+
+/*
+ * _XReply - Wait for a reply packet and copy its contents into the
+ * specified rep.
+ * extra: number of 32-bit words expected after the reply
+ * discard: should I discard data following "extra" words?
+ */
+Status _XReply(Display *dpy, xReply *rep, int extra, Bool discard)
+{
+       xcb_generic_error_t *error;
+       xcb_connection_t *c = dpy->xcb->connection;
+       char *reply;
+       PendingRequest *current;
+
+       if (dpy->xcb->reply_data)
+               throw_extlib_fail_assert("Extra reply data still left in queue",
+                                        xcb_xlib_extra_reply_data_left);
+
+       if(dpy->flags & XlibDisplayIOError)
+               return 0;
+
+       _XSend(dpy, NULL, 0);
+       if(dpy->xcb->pending_requests_tail && dpy->xcb->pending_requests_tail->sequence == dpy->request)
+               current = dpy->xcb->pending_requests_tail;
+       else
+               current = append_pending_request(dpy, dpy->request);
+       /* Don't let any other thread get this reply. */
+       current->reply_waiter = 1;
+
+       while(1)
+       {
+               PendingRequest *req = dpy->xcb->pending_requests;
+               xcb_generic_reply_t *response;
+
+               if(req != current && req->reply_waiter)
+               {
+                       ConditionWait(dpy, dpy->xcb->reply_notify);
+                       /* Another thread got this reply. */
+                       continue;
+               }
+               req->reply_waiter = 1;
+               UnlockDisplay(dpy);
+               response = xcb_wait_for_reply(c, req->sequence, &error);
+               /* Any user locks on another thread must have been taken
+                * while we slept in xcb_wait_for_reply. Classic Xlib
+                * ignored those user locks in this case, so we do too. */
+               InternalLockDisplay(dpy, /* ignore user locks */ 1);
+
+               /* We have the response we're looking for. Now, before
+                * letting anyone else process this sequence number, we
+                * need to process any events that should have come
+                * earlier. */
+
+               if(dpy->xcb->event_owner == XlibOwnsEventQueue)
+               {
+                       xcb_generic_reply_t *event;
+                       /* If some thread is already waiting for events,
+                        * it will get the first one. That thread must
+                        * process that event before we can continue. */
+                       /* FIXME: That event might be after this reply,
+                        * and might never even come--or there might be
+                        * multiple threads trying to get events. */
+                       while(dpy->xcb->event_waiter)
+                       { /* need braces around ConditionWait */
+                               ConditionWait(dpy, dpy->xcb->event_notify);
+                       }
+                       while((event = poll_for_event(dpy)))
+                               handle_response(dpy, event, True);
+               }
+
+               req->reply_waiter = 0;
+               ConditionBroadcast(dpy, dpy->xcb->reply_notify);
+               if(XLIB_SEQUENCE_COMPARE(req->sequence, >, dpy->request)) {
+                       throw_thread_fail_assert("Unknown sequence number "
+                                                "while processing reply",
+                                               xcb_xlib_threads_sequence_lost);
+               }
+               dpy->last_request_read = req->sequence;
+               if(!response)
+                       dequeue_pending_request(dpy, req);
+
+               if(req == current)
+               {
+                       reply = (char *) response;
+                       break;
+               }
+
+               if(error)
+                       handle_response(dpy, (xcb_generic_reply_t *) error, True);
+               else if(response)
+                       handle_response(dpy, response, True);
+       }
+       check_internal_connections(dpy);
+
+       if(dpy->xcb->next_event && dpy->xcb->next_event->response_type == X_Error)
+       {
+               xcb_generic_event_t *event = dpy->xcb->next_event;
+               unsigned long event_sequence = dpy->last_request_read;
+               widen(&event_sequence, event->full_sequence);
+               if(event_sequence == dpy->last_request_read)
+               {
+                       error = (xcb_generic_error_t *) event;
+                       dpy->xcb->next_event = NULL;
+               }
+       }
+
+       if(error)
+       {
+               int ret_code;
+
+               /* Xlib is evil and assumes that even errors will be
+                * copied into rep. */
+               memcpy(rep, error, 32);
+
+               /* do not die on "no such font", "can't allocate",
+                  "can't grab" failures */
+               switch(error->error_code)
+               {
+                       case BadName:
+                               switch(error->major_code)
+                               {
+                                       case X_LookupColor:
+                                       case X_AllocNamedColor:
+                                               free(error);
+                                               return 0;
+                               }
+                               break;
+                       case BadFont:
+                               if(error->major_code == X_QueryFont) {
+                                       free(error);
+                                       return 0;
+                               }
+                               break;
+                       case BadAlloc:
+                       case BadAccess:
+                               free(error);
+                               return 0;
+               }
+
+               ret_code = handle_error(dpy, (xError *) error, True);
+               free(error);
+               return ret_code;
+       }
+
+       /* it's not an error, but we don't have a reply, so it's an I/O
+        * error. */
+       if(!reply)
+       {
+               _XIOError(dpy);
+               return 0;
+       }
+
+       /* there's no error and we have a reply. */
+       dpy->xcb->reply_data = reply;
+       dpy->xcb->reply_consumed = sizeof(xReply) + (extra * 4);
+       dpy->xcb->reply_length = sizeof(xReply);
+       if(dpy->xcb->reply_data[0] == 1)
+               dpy->xcb->reply_length += (((xcb_generic_reply_t *) dpy->xcb->reply_data)->length * 4);
+
+       /* error: Xlib asks too much. give them what we can anyway. */
+       if(dpy->xcb->reply_length < dpy->xcb->reply_consumed)
+               dpy->xcb->reply_consumed = dpy->xcb->reply_length;
+
+       memcpy(rep, dpy->xcb->reply_data, dpy->xcb->reply_consumed);
+       _XFreeReplyData(dpy, discard);
+       return 1;
+}
+
+int _XRead(Display *dpy, char *data, long size)
+{
+       assert(size >= 0);
+       if(size == 0)
+               return 0;
+       if(dpy->xcb->reply_data == NULL ||
+          dpy->xcb->reply_consumed + size > dpy->xcb->reply_length)
+               throw_extlib_fail_assert("Too much data requested from _XRead",
+                                        xcb_xlib_too_much_data_requested);
+       memcpy(data, dpy->xcb->reply_data + dpy->xcb->reply_consumed, size);
+       dpy->xcb->reply_consumed += size;
+       _XFreeReplyData(dpy, False);
+       return 0;
+}
+
+/*
+ * _XReadPad - Read bytes from the socket taking into account incomplete
+ * reads.  If the number of bytes is not 0 mod 4, read additional pad
+ * bytes.
+ */
+void _XReadPad(Display *dpy, char *data, long size)
+{
+       _XRead(dpy, data, size);
+       dpy->xcb->reply_consumed += -size & 3;
+       _XFreeReplyData(dpy, False);
+}
+
+/* Read and discard "n" 8-bit bytes of data */
+void _XEatData(Display *dpy, unsigned long n)
+{
+       dpy->xcb->reply_consumed += n;
+       _XFreeReplyData(dpy, False);
+}
diff --git a/src/xcms/AddDIC.c b/src/xcms/AddDIC.c
new file mode 100644 (file)
index 0000000..ecc6650
--- /dev/null
@@ -0,0 +1,149 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *             XcmsAddDIC.c
+ *
+ *     DESCRIPTION
+ *             Source for XcmsAddColorSpace
+ *
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+
+/*
+ *      DEFINES
+ */
+#define NextUnregDiCsID(lastid) \
+           (XCMS_UNREG_ID(lastid) ? ++lastid : XCMS_FIRST_UNREG_DI_ID)
+#define MAX(x,y) ((x) < (y) ? (y) : (x))
+
+\f
+/*
+ *     NAME
+ *             XcmsAddColorSpace - Add a Device-Independent Color Space
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsAddColorSpace(XcmsColorSpace *pCS)
+/*
+ *     DESCRIPTION
+ *             DI Color Spaces are managed on a global basis.
+ *             This means that with exception of the provided DI color spaces:
+ *                     CIEXYZ, CIExyY, CIELab, CIEuvY, CIELuv, and TekHVC
+ *             DI color spaces may have different XcmsColorFormat IDs between
+ *             clients.  So, you must be careful when using XcmsColor
+ *             structures between clients!  Use the routines XcmsFormatOfPrefix()
+ *             and XcmsPrefixOfFormat() appropriately.
+ *
+ *     RETURNS
+ *             XcmsSuccess if succeeded, otherwise XcmsFailure
+ */
+{
+    XcmsColorSpace **papColorSpaces;
+    XcmsColorSpace *ptmpCS;
+    XcmsColorFormat lastID = 0;
+
+    if ((pCS->id = _XcmsRegFormatOfPrefix(pCS->prefix)) != 0) {
+       if (XCMS_DD_ID(pCS->id)) {
+           /* This is a Device-Dependent Color Space */
+           return(XcmsFailure);
+       }
+       /*
+        * REGISTERED DI Color Space
+        *    then see if the color space has already been added to the
+        *    system:
+        *          a. If the same ID/prefix and same XcmsColorSpec is found,
+        *              then its a duplicate, so return success.
+        *          b. If same ID/prefix but different XcmsColorSpec is
+        *              found, then add the color space to the front of the
+        *              list using the same ID.  This allows one to override
+        *              an existing DI Color Space.
+        *          c. Otherwise none found so just add the color space.
+        */
+       if ((papColorSpaces = _XcmsDIColorSpaces) != NULL) {
+           while ((ptmpCS = *papColorSpaces++) != NULL) {
+               if (pCS->id == ptmpCS->id) {
+                   if (pCS == ptmpCS) {
+                       /* a. duplicate*/
+                       return(XcmsSuccess);
+                   }
+                   /* b. same ID/prefix but different XcmsColorSpace */
+                   break;
+               }
+           }
+       }
+       /* c. None found */
+    } else {
+       /*
+        * UNREGISTERED DI Color Space
+        *    then see if the color space has already been added to the
+        *    system:
+        *          a. If same prefix and XcmsColorSpec, then
+        *              its a duplicate ... return success.
+        *          b. If same prefix but different XcmsColorSpec, then
+        *              add the color space to the front of the list using
+        *              the same ID.  This allows one to override an existing
+        *              DI Color Space.
+        *          c. Otherwise none found so, add the color space using the
+        *              next unregistered ID for the connection.
+        */
+       if ((papColorSpaces = _XcmsDIColorSpaces) != NULL) {
+           while ((ptmpCS = *papColorSpaces++) != NULL) {
+               lastID = MAX(lastID, ptmpCS->id);
+               if (strcmp(pCS->prefix, ptmpCS->prefix) == 0) {
+                   if (pCS == ptmpCS) {
+                       /* a. duplicate */
+                       return(XcmsSuccess);
+                   }
+                   /* b. same prefix but different XcmsColorSpec */
+                   pCS->id = ptmpCS->id;
+                   goto AddColorSpace;
+               }
+           }
+       }
+       /* c. None found */
+       pCS->id = NextUnregDiCsID(lastID);
+    }
+
+
+AddColorSpace:
+    if ((papColorSpaces = (XcmsColorSpace **)
+           _XcmsPushPointerArray((XPointer *)_XcmsDIColorSpaces,
+           (XPointer)pCS,
+           (XPointer *)_XcmsDIColorSpacesInit)) == NULL) {
+       return(XcmsFailure);
+    }
+    _XcmsDIColorSpaces = papColorSpaces;
+    return(XcmsSuccess);
+}
diff --git a/src/xcms/AddSF.c b/src/xcms/AddSF.c
new file mode 100644 (file)
index 0000000..2e244e7
--- /dev/null
@@ -0,0 +1,145 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *             XcmsAddSF.c
+ *
+ *     DESCRIPTION
+ *             Source for XcmsAddFunctionSet
+ *
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+/*
+ *      DEFINES
+ */
+#define NextUnregDdCsID(lastid) \
+           (XCMS_UNREG_ID(lastid) ? ++lastid : XCMS_FIRST_UNREG_DD_ID)
+#define MIN(x,y) ((x) > (y) ? (y) : (x))
+
+\f
+/*
+ *     NAME
+ *             XcmsAddFunctionSet - Add an Screen Color Characterization
+ *                                     Function Set
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsAddFunctionSet(XcmsFunctionSet *pNewFS)
+/*
+ *     DESCRIPTION
+ *             Additional Screen Color Characterization Function Sets are
+ *             managed on a global basis.  This means that with exception
+ *             of the provided DD color spaces:
+ *                         RGB and RGBi
+ *             DD color spaces may have different XcmsColorFormat IDs between
+ *             clients.  So, you must be careful when using XcmsColorFormat
+ *             across clients!  Use the routines XcmsFormatOfPrefix()
+ *             and XcmsPrefixOfFormat() appropriately.
+ *
+ *     RETURNS
+ *             XcmsSuccess if succeeded, otherwise XcmsFailure
+ *
+ *     CAVEATS
+ *             Additional Screen Color Characterization Function Sets
+ *             should be added prior to any use of the routine
+ *             XcmsCreateCCC().  If not, XcmsCCC structures created
+ *             prior to the call of this routines will not have had
+ *             a chance to initialize using the added Screen Color
+ *             Characterization Function Set.
+ */
+{
+    XcmsFunctionSet **papSCCFuncSets = _XcmsSCCFuncSets;
+    XcmsColorSpace **papNewCSs;
+    XcmsColorSpace *pNewCS, **paptmpCS;
+    XcmsColorFormat lastID = 0;
+
+
+    if (papSCCFuncSets != NULL) {
+       if ((papNewCSs = pNewFS->DDColorSpaces) == NULL) {
+           /*
+            * Error, new Screen Color Characterization Function Set
+            *  missing color spaces
+            */
+           return(XcmsFailure);
+       }
+       while ((pNewCS = *papNewCSs++) != NULL) {
+           if ((pNewCS->id = _XcmsRegFormatOfPrefix(pNewCS->prefix)) != 0) {
+               if (XCMS_DI_ID(pNewCS->id)) {
+                   /* This is a Device-Independent Color Space */
+                   return(XcmsFailure);
+               }
+               /*
+                * REGISTERED DD Color Space
+                *    therefore use the registered ID.
+                */
+           } else {
+               /*
+                * UNREGISTERED DD Color Space
+                *    then see if the color space is already in
+                *    _XcmsDDColorSpaces.
+                *          a. If same prefix, then use the same ID.
+                *          b. Otherwise, use a new ID.
+                */
+               for (paptmpCS = _XcmsDDColorSpaces; *paptmpCS != NULL;
+                       paptmpCS++){
+                   lastID = MIN(lastID, (*paptmpCS)->id);
+                   if (strcmp(pNewCS->prefix, (*paptmpCS)->prefix) == 0) {
+                       pNewCS->id = (*paptmpCS)->id;
+                       break;
+                   }
+               }
+               if (pNewCS->id == 0) {
+                   /* still haven't found one */
+                   pNewCS->id = NextUnregDdCsID(lastID);
+                   if ((paptmpCS = (XcmsColorSpace **)_XcmsPushPointerArray(
+                           (XPointer *) _XcmsDDColorSpaces,
+                           (XPointer) pNewCS,
+                           (XPointer *) _XcmsDDColorSpacesInit)) == NULL) {
+                       return(XcmsFailure);
+                   }
+                   _XcmsDDColorSpaces = paptmpCS;
+               }
+           }
+       }
+    }
+    if ((papSCCFuncSets = (XcmsFunctionSet **)
+           _XcmsPushPointerArray((XPointer *) _XcmsSCCFuncSets,
+           (XPointer) pNewFS,
+           (XPointer *)_XcmsSCCFuncSetsInit)) == NULL) {
+       return(XcmsFailure);
+    }
+    _XcmsSCCFuncSets = papSCCFuncSets;
+
+    return(XcmsSuccess);
+}
diff --git a/src/xcms/CCC.c b/src/xcms/CCC.c
new file mode 100644 (file)
index 0000000..090b107
--- /dev/null
@@ -0,0 +1,286 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *             XcmsCCC.c - Color Conversion Context Routines
+ *
+ *     DESCRIPTION
+ *             Routines to create, access, and free Color Conversion
+ *             Context structures.
+ *
+ *
+ */
+
+/*
+
+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 <stdio.h>
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+\f
+
+/************************************************************************
+ *                                                                     *
+ *                     PUBLIC INTERFACES                               *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsCreateCCC
+ *
+ *     SYNOPSIS
+ */
+
+XcmsCCC
+XcmsCreateCCC(
+    Display *dpy,
+    int screenNumber,
+    Visual *visual,
+    XcmsColor *clientWhitePt,
+    XcmsCompressionProc gamutCompProc,
+    XPointer gamutCompClientData,
+    XcmsWhiteAdjustProc whitePtAdjProc,
+    XPointer whitePtAdjClientData)
+/*
+ *     DESCRIPTION
+ *             Given a Display, Screen, Visual, etc., this routine creates
+ *             an appropriate Color Conversion Context.
+ *
+ *     RETURNS
+ *             Returns NULL if failed; otherwise address of the newly
+ *             created XcmsCCC.
+ *
+ */
+{
+    XcmsCCC pDefaultCCC = XcmsDefaultCCC(dpy, screenNumber);
+    XcmsCCC newccc;
+    XcmsIntensityMap *pIMap;
+    XcmsPerScrnInfo *pNewScrnInfo;
+
+    if (pDefaultCCC == NULL ||
+           !(newccc = (XcmsCCC) Xcalloc(1, (unsigned) sizeof(XcmsCCCRec)))) {
+       return(NULL);
+    }
+
+    /*
+     * Should inherit the following as result of a memmove():
+     *         dpy
+     *         screenNumber
+     *         pPerScrnInfo
+     */
+    memcpy((char *)newccc, (char *)pDefaultCCC, sizeof(XcmsCCCRec));
+    if (clientWhitePt) {
+       memcpy((char *)&newccc->clientWhitePt, (char *)clientWhitePt,
+               sizeof(XcmsColor));
+    }
+    if (gamutCompProc) {
+       newccc->gamutCompProc = gamutCompProc;
+    }
+    if (gamutCompClientData) {
+       newccc->gamutCompClientData = gamutCompClientData;
+    }
+    if (whitePtAdjProc) {
+       newccc->whitePtAdjProc = whitePtAdjProc;
+    }
+    if (whitePtAdjClientData) {
+       newccc->whitePtAdjClientData = whitePtAdjClientData;
+    }
+
+    /*
+     * Now check our list of per-Visual Intensity tables.
+     * If one exists replace the pPerScrnInfo.
+     */
+    if ((pIMap = _XcmsGetIntensityMap(dpy, visual)) != NULL) {
+       if (!(pNewScrnInfo = (XcmsPerScrnInfo *)
+               Xcalloc(1, (unsigned) sizeof(XcmsPerScrnInfo)))) {
+           Xfree(newccc);
+           return(NULL);
+       }
+       memcpy((char *)pNewScrnInfo, (char *)newccc->pPerScrnInfo,
+               sizeof(XcmsPerScrnInfo));
+       pNewScrnInfo->screenData = pIMap->screenData;
+       newccc->pPerScrnInfo = pNewScrnInfo;
+    }
+
+    /*
+     * Set visual component
+     */
+    newccc->visual = visual;
+
+    return(newccc);
+}
+
+\f
+/*
+ *     NAME
+ *             XcmsDefaultCCC
+ *
+ *     SYNOPSIS
+ */
+XcmsCCC
+XcmsDefaultCCC(
+    Display *dpy,
+    int screenNumber)
+/*
+ *     DESCRIPTION
+ *             Given a Display and Screen, this routine creates
+ *             returns the Screen's default Color Conversion Context.
+ *             Note that a Screen's default CCC is built with the
+ *             screen default visual.
+ *
+ *     RETURNS
+ *             Returns NULL if failed; otherwise address of the
+ *             XcmsCCC for the Screen's default CCC.
+ *
+ */
+{
+    XcmsCCC ccc;
+
+
+    if ((screenNumber < 0) || (screenNumber >= ScreenCount(dpy))) {
+       return((XcmsCCC)NULL);
+    }
+
+    /*
+     * Check if the XcmsCCC's for each screen has been created
+     */
+    if ((XcmsCCC)dpy->cms.defaultCCCs == NULL) {
+       if (!_XcmsInitDefaultCCCs(dpy)) {
+           return((XcmsCCC)NULL);
+       }
+    }
+
+    ccc = (XcmsCCC)dpy->cms.defaultCCCs + screenNumber;
+
+    if (!ccc->pPerScrnInfo) {
+       /*
+        * Need to create the XcmsPerScrnInfo structure.  The
+        * _XcmsInitScrnInfo routine will create the XcmsPerScrnInfo
+        * structure as well as initialize its functionSet and pScreenData
+        * components.
+        */
+       if (!_XcmsInitScrnInfo(dpy, screenNumber)) {
+           return((XcmsCCC)NULL);
+       }
+       return(ccc);
+    } else {
+       /*
+        * If ccc->pPerScrnInfo->state == XcmsInitSuccess,
+        *    then the pPerScrnInfo component has already been initialized
+        *    therefore, just return ccc.
+        * If ccc->pPerScrnInfo->state == XcmsInitFailure,
+        *    then this means that we already attempted to initialize
+        *    the pPerScrnInfo component but failed therefore stuffing
+        *    the pPerScrnInfo component with defaults.  Just return ccc.
+        * If ccc->pPerScrnInfo->state == XcmsInitNone,
+        *    then attempt to initialize the pPerScrnInfo component.
+        */
+       switch (ccc->pPerScrnInfo->state) {
+          case XcmsInitFailure :
+           /* fall through */
+          case XcmsInitSuccess :
+           return(ccc);
+          case XcmsInitNone :
+           /* XcmsPerScreenInfo has not been initialized */
+           if (!_XcmsInitScrnInfo(dpy, screenNumber)) {
+               return((XcmsCCC)NULL);
+           }
+           return(ccc);
+          default :
+           return((XcmsCCC)NULL);
+       }
+    }
+}
+
+\f
+/*
+ *     NAME
+ *             XcmsFreeCCC
+ *
+ *     SYNOPSIS
+ */
+void
+XcmsFreeCCC(XcmsCCC ccc)
+/*
+ *     DESCRIPTION
+ *             Frees memory associated with a Color Conversion Context
+ *             that was created with XcmsCreateCCC().
+ *
+ *     RETURNS
+ *             void
+ *
+ */
+{
+    if (ccc->dpy->cms.defaultCCCs &&
+       ccc == ((XcmsCCC)ccc->dpy->cms.defaultCCCs) + ccc->screenNumber) {
+       /* do not allow clients to free DefaultCCC's */
+       return;
+    }
+
+    /*
+     * Note that XcmsPerScrnInfo sub-structures are freed here only if
+     * they are for visuals that have per-Visual intensity tables.
+     * Otherwise the XcmsPerScrnInfo structure is being shared!
+     * For the latter, there is only one allocated per Screen and it just
+     * so happens * that we place its initial reference is placed in the
+     *         default CCC.  The routine _XcmsFreeDefaultCCCs frees them.
+     */
+    if (_XcmsGetIntensityMap(ccc->dpy, ccc->visual) != NULL) {
+       Xfree(ccc->pPerScrnInfo);
+    }
+
+    Xfree(ccc);
+}
diff --git a/src/xcms/Cv.h b/src/xcms/Cv.h
new file mode 100644 (file)
index 0000000..0b66281
--- /dev/null
@@ -0,0 +1,189 @@
+
+#ifndef _CV_H_
+#define _CV_H_
+
+/* variables */
+extern const char      _XcmsCIEXYZ_prefix[];
+extern const char      _XcmsCIEuvY_prefix[];
+extern const char      _XcmsCIExyY_prefix[];
+extern const char      _XcmsCIELab_prefix[];
+extern const char      _XcmsCIELuv_prefix[];
+extern const char      _XcmsTekHVC_prefix[];
+extern const char      _XcmsRGBi_prefix[];
+extern const char      _XcmsRGB_prefix[];
+
+extern XcmsColorSpace  XcmsUNDEFINEDColorSpace;
+extern XcmsColorSpace  XcmsTekHVCColorSpace;
+extern XcmsColorSpace  XcmsCIEXYZColorSpace;
+extern XcmsColorSpace  XcmsCIEuvYColorSpace;
+extern XcmsColorSpace  XcmsCIExyYColorSpace;
+extern XcmsColorSpace  XcmsCIELabColorSpace;
+extern XcmsColorSpace  XcmsCIELuvColorSpace;
+extern XcmsColorSpace  XcmsRGBColorSpace;
+extern XcmsColorSpace  XcmsRGBiColorSpace;
+
+extern XcmsColorSpace  *_XcmsDIColorSpacesInit[];
+extern XcmsColorSpace  **_XcmsDIColorSpaces;
+
+extern XcmsColorSpace  *_XcmsDDColorSpacesInit[];
+extern XcmsColorSpace  **_XcmsDDColorSpaces;
+
+extern XcmsFunctionSet XcmsLinearRGBFunctionSet;
+
+extern XcmsFunctionSet *_XcmsSCCFuncSetsInit[];
+extern XcmsFunctionSet **_XcmsSCCFuncSets;
+
+extern XcmsRegColorSpaceEntry _XcmsRegColorSpaces[];
+
+/* functions */
+extern XPointer *
+_XcmsCopyPointerArray(
+    XPointer *pap);
+extern void
+_XcmsFreePointerArray(
+    XPointer *pap);
+extern XPointer *
+_XcmsPushPointerArray(
+    XPointer *pap,
+    XPointer p,
+    XPointer *papNoFree);
+extern Status
+_XcmsCIEXYZ_ValidSpec(
+    XcmsColor *pColor);
+extern Status
+_XcmsCIEuvY_ValidSpec(
+    XcmsColor *pColor);
+extern int
+_XcmsTekHVC_CheckModify(
+    XcmsColor *pColor);
+
+extern Status
+_XcmsTekHVCQueryMaxVCRGB(
+    XcmsCCC     ccc,
+    XcmsFloat   hue,
+    XcmsColor   *pColor_return,
+    XcmsRGBi    *pRGB_return);
+extern Status
+_XcmsCIELabQueryMaxLCRGB(
+    XcmsCCC     ccc,
+    XcmsFloat   hue,                /* hue in radians */
+    XcmsColor   *pColor_return,
+    XcmsRGBi    *pRGB_return);
+extern Status
+_XcmsConvertColorsWithWhitePt(
+    XcmsCCC ccc,
+    XcmsColor *pColors_in_out,
+    XcmsColor *pWhitePt,
+    unsigned int nColors,
+    XcmsColorFormat newFormat,
+    Bool *pCompressed);
+
+extern Status
+_XcmsDIConvertColors(
+    XcmsCCC ccc,
+    XcmsColor *pColors_in_out,
+    XcmsColor *pWhitePt,
+    unsigned int nColors,
+    XcmsColorFormat newFormat);
+extern Status
+_XcmsDDConvertColors(
+    XcmsCCC ccc,
+    XcmsColor *pColors_in_out,
+    unsigned int nColors,
+    XcmsColorFormat newFormat,
+    Bool *pCompressed);
+extern XcmsColorFormat
+_XcmsRegFormatOfPrefix(
+    _Xconst char *prefix);
+extern void
+_XColor_to_XcmsRGB(
+    XcmsCCC ccc,
+    XColor *pXColors,
+    XcmsColor *pColors,
+    unsigned int nColors);
+extern Status
+_XcmsSetGetColor(
+    Status (*xColorProc)(
+        Display*            /* display */,
+        Colormap            /* colormap */,
+        XColor*             /* screen_in_out */),
+    Display *dpy,
+    Colormap cmap,
+    XcmsColor *pColors_in_out,
+    XcmsColorFormat result_format,
+    Bool *pCompressed);
+extern Status
+_XcmsSetGetColors(
+    Status (*xColorProc)(
+        Display*            /* display */,
+        Colormap            /* colormap */,
+        XColor*             /* screen_in_out */,
+        int                 /* nColors */),
+    Display *dpy,
+    Colormap cmap,
+    XcmsColor *pColors_in_out,
+    int nColors,
+    XcmsColorFormat result_format,
+    Bool *pCompressed);
+extern Status
+_XcmsCIELuvQueryMaxLCRGB(
+    XcmsCCC     ccc,
+    XcmsFloat   hue,            /* hue in radians */
+    XcmsColor   *pColor_return,
+    XcmsRGBi    *pRGB_return);
+
+extern XcmsIntensityMap *
+_XcmsGetIntensityMap(
+    Display *dpy,
+    Visual *visual);
+extern int
+_XcmsInitDefaultCCCs(
+    Display *dpy);
+extern int
+_XcmsInitScrnInfo(
+    register Display *dpy,
+    int screenNumber);
+extern XcmsCmapRec *
+_XcmsCopyCmapRecAndFree(
+    Display *dpy,
+    Colormap src_cmap,
+    Colormap copy_cmap);
+extern void
+_XcmsCopyISOLatin1Lowered(
+    char *dst,
+    const char *src);
+extern int
+_XcmsEqualWhitePts(
+    XcmsCCC ccc, XcmsColor *pWhitePt1, XcmsColor *pWhitePt2);
+extern int
+_XcmsLRGB_InitScrnDefault(
+    Display *dpy,
+    int screenNumber,
+    XcmsPerScrnInfo *pPerScrnInfo);
+extern void
+_XcmsFreeIntensityMaps(
+    Display *dpy);
+extern int
+_XcmsGetProperty(
+    Display *pDpy,
+    Window  w,
+    Atom property,
+    int             *pFormat,
+    unsigned long   *pNItems,
+    unsigned long   *pNBytes,
+    char            **pValue);
+extern unsigned long
+_XcmsGetElement(
+    int             format,
+    char            **pValue,
+    unsigned long   *pCount);
+extern void
+_XcmsUnresolveColor(
+    XcmsCCC ccc,
+    XcmsColor *pColor);
+extern void
+_XcmsResolveColor(
+    XcmsCCC ccc,
+    XcmsColor *pXcmsColor);
+
+#endif /* _CV_H_ */
diff --git a/src/xcms/CvColW.c b/src/xcms/CvColW.c
new file mode 100644 (file)
index 0000000..4aabded
--- /dev/null
@@ -0,0 +1,141 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *
+ *     NAME
+ *             XcmsCvColW.c
+ *
+ *     DESCRIPTION
+ *             <overall description of what the package does>
+ *
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      API PRIVATE ROUTINES                           *
+ *                                                                     *
+ ************************************************************************/
+
+\f
+/*
+ *     NAME
+ *             _XcmsConvertColorsWithWhitePt - Convert XcmsColor structures
+ *
+ *     SYNOPSIS
+ */
+Status
+_XcmsConvertColorsWithWhitePt(
+    XcmsCCC ccc,
+    XcmsColor *pColors_in_out,
+    XcmsColor *pWhitePt,
+    unsigned int nColors,
+    XcmsColorFormat newFormat,
+    Bool *pCompressed)
+/*
+ *     DESCRIPTION
+ *             Convert XcmsColor structures between device-independent
+ *             and/or device-dependent formats but allowing the calling
+ *             routine to specify the white point to be associated
+ *             with the color specifications (overriding
+ *             ccc->clientWhitePt).
+ *
+ *             This routine has been provided for use in white point
+ *             adjustment routines.
+ *
+ *     RETURNS
+ *             XcmsFailure if failed,
+ *             XcmsSuccess if succeeded without gamut compression,
+ *             XcmsSuccessWithCompression if succeeded with gamut
+ *                     compression.
+ *
+ */
+{
+    if (ccc == NULL || pColors_in_out == NULL ||
+           pColors_in_out->format == XcmsUndefinedFormat) {
+       return(XcmsFailure);
+    }
+
+    if (nColors == 0 || pColors_in_out->format == newFormat) {
+       /* do nothing */
+       return(XcmsSuccess);
+    }
+
+    if (XCMS_DI_ID(pColors_in_out->format) && XCMS_DI_ID(newFormat)) {
+       /*
+        * Device-Independent to Device-Independent Conversion
+        */
+       return(_XcmsDIConvertColors(ccc, pColors_in_out, pWhitePt, nColors,
+               newFormat));
+    }
+    if (XCMS_DD_ID(pColors_in_out->format) && XCMS_DD_ID(newFormat)) {
+       /*
+        * Device-Dependent to Device-Dependent Conversion
+        */
+       return(_XcmsDDConvertColors(ccc, pColors_in_out, nColors, newFormat,
+               pCompressed));
+    }
+
+    /*
+     * Otherwise we have:
+     *    1. Device-Independent to Device-Dependent Conversion
+     *         OR
+     *    2. Device-Dependent to Device-Independent Conversion
+     */
+
+    if (XCMS_DI_ID(pColors_in_out->format)) {
+       /*
+        *    1. Device-Independent to Device-Dependent Conversion
+        */
+       /* First convert to CIEXYZ */
+       if (_XcmsDIConvertColors(ccc, pColors_in_out, pWhitePt, nColors,
+               XcmsCIEXYZFormat) == XcmsFailure) {
+           return(XcmsFailure);
+       }
+       /* Then convert to DD Format */
+       return(_XcmsDDConvertColors(ccc, pColors_in_out, nColors, newFormat,
+               pCompressed));
+    } else {
+       /*
+        *    2. Device-Dependent to Device-Independent Conversion
+        */
+       /* First convert to CIEXYZ */
+       if (_XcmsDDConvertColors(ccc, pColors_in_out, nColors,
+               XcmsCIEXYZFormat, pCompressed) == XcmsFailure) {
+           return(XcmsFailure);
+       }
+       /* Then convert to DI Format */
+       return(_XcmsDIConvertColors(ccc, pColors_in_out, pWhitePt, nColors,
+               newFormat));
+    }
+}
diff --git a/src/xcms/CvCols.c b/src/xcms/CvCols.c
new file mode 100644 (file)
index 0000000..ed35826
--- /dev/null
@@ -0,0 +1,1030 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *             XcmsCvCols.c
+ *
+ *     DESCRIPTION
+ *             Xcms API routine that converts between the
+ *             device-independent color spaces.
+ *
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+/*
+ *      LOCAL DEFINES
+ */
+#define        DD_FORMAT       0x01
+#define        DI_FORMAT       0x02
+#define        MIX_FORMAT      0x04
+#ifndef MAX
+#  define MAX(x,y) ((x) > (y) ? (x) : (y))
+#endif
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PRIVATE ROUTINES                               *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             EqualCIEXYZ
+ *
+ *     SYNOPSIS
+ */
+static int
+EqualCIEXYZ(
+    XcmsColor *p1, XcmsColor *p2)
+/*
+ *     DESCRIPTION
+ *             Compares two XcmsColor structures that are in XcmsCIEXYZFormat
+ *
+ *     RETURNS
+ *             Returns 1 if equal; 0 otherwise.
+ *
+ */
+{
+    if (p1->format != XcmsCIEXYZFormat || p2->format != XcmsCIEXYZFormat) {
+       return(0);
+    }
+    if ((p1->spec.CIEXYZ.X != p2->spec.CIEXYZ.X)
+           || (p1->spec.CIEXYZ.Y != p2->spec.CIEXYZ.Y)
+           || (p1->spec.CIEXYZ.Z != p2->spec.CIEXYZ.Z)) {
+       return(0);
+    }
+    return(1);
+}
+
+\f
+/*
+ *     NAME
+ *             XcmsColorSpace
+ *
+ *     SYNOPSIS
+ */
+static XcmsColorSpace *
+ColorSpaceOfID(
+    XcmsCCC ccc,
+    XcmsColorFormat    id)
+/*
+ *     DESCRIPTION
+ *             Returns a pointer to the color space structure
+ *             (XcmsColorSpace) associated with the specified color space
+ *             ID.
+ *
+ *     RETURNS
+ *             Pointer to matching XcmsColorSpace structure if found;
+ *             otherwise NULL.
+ */
+{
+    XcmsColorSpace     **papColorSpaces;
+
+    if (ccc == NULL) {
+       return(NULL);
+    }
+
+    /*
+     * First try Device-Independent color spaces
+     */
+    papColorSpaces = _XcmsDIColorSpaces;
+    if (papColorSpaces != NULL) {
+       while (*papColorSpaces != NULL) {
+           if ((*papColorSpaces)->id == id) {
+               return(*papColorSpaces);
+           }
+           papColorSpaces++;
+       }
+    }
+
+    /*
+     * Next try Device-Dependent color spaces
+     */
+    papColorSpaces = ((XcmsFunctionSet *)ccc->pPerScrnInfo->functionSet)->DDColorSpaces;
+    if (papColorSpaces != NULL) {
+       while (*papColorSpaces != NULL) {
+           if ((*papColorSpaces)->id == id) {
+               return(*papColorSpaces);
+           }
+           papColorSpaces++;
+       }
+    }
+
+    return(NULL);
+}
+
+\f
+/*
+ *     NAME
+ *             ValidDIColorSpaceID
+ *
+ *     SYNOPSIS
+ */
+static int
+ValidDIColorSpaceID(
+    XcmsColorFormat id)
+/*
+ *     DESCRIPTION
+ *             Determines if the specified color space ID is a valid
+ *             Device-Independent color space in the specified Color
+ *             Conversion Context.
+ *
+ *     RETURNS
+ *             Returns zero if not valid; otherwise non-zero.
+ */
+{
+    XcmsColorSpace **papRec;
+    papRec = _XcmsDIColorSpaces;
+    if (papRec != NULL) {
+       while (*papRec != NULL) {
+           if ((*papRec)->id == id) {
+               return(1);
+           }
+           papRec++;
+       }
+    }
+    return(0);
+}
+
+\f
+/*
+ *     NAME
+ *             ValidDDColorSpaceID
+ *
+ *     SYNOPSIS
+ */
+static int
+ValidDDColorSpaceID(
+    XcmsCCC ccc,
+    XcmsColorFormat id)
+/*
+ *     DESCRIPTION
+ *             Determines if the specified color space ID is a valid
+ *             Device-Dependent color space in the specified Color
+ *             Conversion Context.
+ *
+ *     RETURNS
+ *             Returns zero if not valid; otherwise non-zero.
+ */
+{
+    XcmsColorSpace **papRec;
+
+    if (ccc->pPerScrnInfo->state != XcmsInitNone) {
+       papRec = ((XcmsFunctionSet *)ccc->pPerScrnInfo->functionSet)->DDColorSpaces;
+       while (*papRec != NULL) {
+           if ((*papRec)->id == id) {
+               return(1);
+           }
+           papRec++;
+       }
+    }
+    return(0);
+}
+
+\f
+/*
+ *     NAME
+ *             ConvertMixedColors - Convert XcmsColor structures
+ *
+ *     SYNOPSIS
+ */
+static Status
+ConvertMixedColors(
+    XcmsCCC ccc,
+    XcmsColor *pColors_in_out,
+    XcmsColor *pWhitePt,
+    unsigned int nColors,
+    XcmsColorFormat targetFormat,
+    unsigned char format_flag)
+/*
+ *     DESCRIPTION
+ *             This routine will only convert the following types of
+ *             batches:
+ *                     DI to DI
+ *                     DD to DD
+ *                     DD to CIEXYZ
+ *             In other words, it will not convert the following types of
+ *             batches:
+ *                     DI to DD
+ *                     DD to DI(not CIEXYZ)
+ *
+ *             format_flag:
+ *                 0x01 : convert Device-Dependent only specifications to the
+ *                     target format.
+ *                 0x02 : convert Device-Independent only specifications to the
+ *                     target format.
+ *                 0x03 : convert all specifications to the target format.
+ *
+ *     RETURNS
+ *             XcmsFailure if failed,
+ *             XcmsSuccess if none of the color specifications were
+ *                     compressed in the conversion process
+ *             XcmsSuccessWithCompression if at least one of the
+ *                     color specifications were compressed in the
+ *                     conversion process.
+ *
+ */
+{
+    XcmsColor *pColor, *pColors_start;
+    XcmsColorFormat format;
+    Status retval_tmp;
+    Status retval = XcmsSuccess;
+    unsigned int iColors;
+    unsigned int nBatch;
+
+    /*
+     * Convert array of mixed color specifications in batches of
+     * contiguous formats to the target format
+     */
+    iColors = 0;
+    while (iColors < nColors) {
+       /*
+        * Find contiguous array of color specifications with the
+        * same format
+        */
+       pColor = pColors_start = pColors_in_out + iColors;
+       format = pColors_start->format;
+       nBatch = 0;
+       while (iColors < nColors && pColor->format == format) {
+               pColor++;
+               nBatch++;
+               iColors++;
+       }
+       if (format != targetFormat) {
+           /*
+            * Need to convert this batch from current format to target format.
+            */
+           if (XCMS_DI_ID(format) && (format_flag & DI_FORMAT) &&
+               XCMS_DI_ID(targetFormat)) {
+               /*
+                * DI->DI
+                *
+                * Format of interest is Device-Independent,
+                * This batch contains Device-Independent specifications, and
+                * the Target format is Device-Independent.
+                */
+               retval_tmp = _XcmsDIConvertColors(ccc, pColors_start, pWhitePt,
+                       nBatch, targetFormat);
+           } else if (XCMS_DD_ID(format) && (format_flag & DD_FORMAT) &&
+                   (targetFormat == XcmsCIEXYZFormat)) {
+               /*
+                * DD->CIEXYZ
+                *
+                * Format of interest is Device-Dependent,
+                * This batch contains Device-Dependent specifications, and
+                * the Target format is CIEXYZ.
+                *
+                * Since DD->CIEXYZ we can use NULL instead of pCompressed.
+                */
+               if ((ccc->whitePtAdjProc != NULL) && !_XcmsEqualWhitePts(ccc,
+                       pWhitePt, ScreenWhitePointOfCCC(ccc))) {
+                   /*
+                    * Need to call WhiteAdjustProc (Screen White Point to
+                    *   White Point).
+                    */
+                   retval_tmp = (*ccc->whitePtAdjProc)(ccc,
+                           ScreenWhitePointOfCCC(ccc), pWhitePt,
+                           XcmsCIEXYZFormat, pColors_start, nBatch,
+                           (Bool *)NULL);
+               } else {
+                   retval_tmp = _XcmsDDConvertColors(ccc, pColors_start,
+                           nBatch, XcmsCIEXYZFormat, (Bool *)NULL);
+               }
+           } else if (XCMS_DD_ID(format) && (format_flag & DD_FORMAT) &&
+                   XCMS_DD_ID(targetFormat)) {
+               /*
+                * DD->DD(not CIEXYZ)
+                *
+                * Format of interest is Device-Dependent,
+                * This batch contains Device-Dependent specifications, and
+                * the Target format is Device-Dependent and not CIEXYZ.
+                */
+               retval_tmp = _XcmsDDConvertColors(ccc, pColors_start, nBatch,
+                       targetFormat, (Bool *)NULL);
+           } else {
+               /*
+                * This routine is called for the wrong reason.
+                */
+               return(XcmsFailure);
+           }
+           if (retval_tmp == XcmsFailure) {
+               return(XcmsFailure);
+           }
+           retval = MAX(retval, retval_tmp);
+       }
+    }
+    return(retval);
+}
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      API PRIVATE ROUTINES                           *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             _XcmsEqualWhitePts
+ *
+ *     SYNOPSIS
+ */
+int
+_XcmsEqualWhitePts(XcmsCCC ccc, XcmsColor *pWhitePt1, XcmsColor *pWhitePt2)
+/*
+ *     DESCRIPTION
+ *
+ *     RETURNS
+ *             Returns 0 if not equal; otherwise 1.
+ *
+ */
+{
+    XcmsColor tmp1, tmp2;
+
+    memcpy((char *)&tmp1, (char *)pWhitePt1, sizeof(XcmsColor));
+    memcpy((char *)&tmp2, (char *)pWhitePt2, sizeof(XcmsColor));
+
+    if (tmp1.format != XcmsCIEXYZFormat) {
+       if (_XcmsDIConvertColors(ccc, &tmp1, (XcmsColor *) NULL, 1,
+               XcmsCIEXYZFormat)==0) {
+           return(0);
+       }
+    }
+
+    if (tmp2.format != XcmsCIEXYZFormat) {
+       if (_XcmsDIConvertColors(ccc, &tmp2, (XcmsColor *) NULL, 1,
+               XcmsCIEXYZFormat)==0) {
+           return(0);
+       }
+    }
+
+    return (EqualCIEXYZ(&tmp1, &tmp2));
+}
+
+\f
+/*
+ *     NAME
+ *             _XcmsDIConvertColors - Convert XcmsColor structures
+ *
+ *     SYNOPSIS
+ */
+Status
+_XcmsDIConvertColors(
+    XcmsCCC ccc,
+    XcmsColor *pColors_in_out,
+    XcmsColor *pWhitePt,
+    unsigned int nColors,
+    XcmsColorFormat newFormat)
+/*
+ *     DESCRIPTION
+ *             Convert XcmsColor structures to another Device-Independent
+ *             form.
+ *
+ *             Here are some assumptions that this routine makes:
+ *             1. The calling routine has already checked if
+ *                 pColors_in_out->format == newFormat, therefore
+ *                 there is no need to check again here.
+ *             2. The calling routine has already checked nColors,
+ *                 therefore this routine assumes nColors > 0.
+ *             3. The calling routine may want to convert only between
+ *                     CIExyY <-> CIEXYZ <-> CIEuvY
+ *                 therefore, this routine allows pWhitePt to equal NULL.
+ *
+ *
+ *     RETURNS
+ *             XcmsFailure if failed,
+ *             XcmsSuccess if succeeded.
+ *
+ */
+{
+    XcmsColorSpace *pFrom, *pTo;
+    XcmsDIConversionProc *src_to_CIEXYZ, *src_from_CIEXYZ;
+    XcmsDIConversionProc *dest_to_CIEXYZ, *dest_from_CIEXYZ;
+    XcmsDIConversionProc *to_CIEXYZ_stop, *from_CIEXYZ_start;
+    XcmsDIConversionProc *tmp;
+
+    /*
+     * Allow pWhitePt to equal NULL.  This appropriate when converting
+     *    anywhere between:
+     *         CIExyY <-> CIEXYZ <-> CIEuvY
+     */
+
+    if (pColors_in_out == NULL ||
+           !ValidDIColorSpaceID(pColors_in_out->format) ||
+           !ValidDIColorSpaceID(newFormat)) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Get a handle on the function list for the current specification format
+     */
+    if ((pFrom = ColorSpaceOfID(ccc, pColors_in_out->format))
+           == NULL) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Get a handle on the function list for the new specification format
+     */
+    if ((pTo = ColorSpaceOfID(ccc, newFormat)) == NULL) {
+       return(XcmsFailure);
+    }
+
+    src_to_CIEXYZ = pFrom->to_CIEXYZ;
+    src_from_CIEXYZ = pFrom->from_CIEXYZ;
+    dest_to_CIEXYZ = pTo->to_CIEXYZ;
+    dest_from_CIEXYZ = pTo->from_CIEXYZ;
+
+    if (pTo->inverse_flag && pFrom->inverse_flag) {
+       /*
+        * Find common function pointers
+        */
+       for (to_CIEXYZ_stop = src_to_CIEXYZ; *to_CIEXYZ_stop; to_CIEXYZ_stop++){
+           for (tmp = dest_to_CIEXYZ; *tmp; tmp++) {
+               if (*to_CIEXYZ_stop == *tmp) {
+                   goto Continue;
+               }
+           }
+       }
+
+Continue:
+
+       /*
+        * Execute the functions to CIEXYZ, stopping short as necessary
+        */
+       while (src_to_CIEXYZ != to_CIEXYZ_stop) {
+           if ((*src_to_CIEXYZ++)(ccc, pWhitePt, pColors_in_out,
+                   nColors) == XcmsFailure) {
+               return(XcmsFailure);
+           }
+       }
+
+       /*
+        * Determine where to start on the from_CIEXYZ path.
+        */
+       from_CIEXYZ_start = dest_from_CIEXYZ;
+       tmp = src_from_CIEXYZ;
+       while ((*from_CIEXYZ_start == *tmp) && (*from_CIEXYZ_start != NULL)) {
+           from_CIEXYZ_start++;
+           tmp++;
+       }
+
+    } else {
+       /*
+        * The function in at least one of the Color Spaces are not
+        * complementary, i.e.,
+        *      for an i, 0 <= i < n elements
+        *      from_CIEXYZ[i] is not the inverse of to_CIEXYZ[i]
+        *
+        * Execute the functions all the way to CIEXYZ
+        */
+       while (*src_to_CIEXYZ) {
+           if ((*src_to_CIEXYZ++)(ccc, pWhitePt, pColors_in_out,
+                   nColors) == XcmsFailure) {
+               return(XcmsFailure);
+           }
+       }
+
+       /*
+        * Determine where to start on the from_CIEXYZ path.
+        */
+       from_CIEXYZ_start = dest_from_CIEXYZ;
+    }
+
+
+    /*
+     * Execute the functions from CIEXYZ.
+     */
+    while (*from_CIEXYZ_start) {
+       if ((*from_CIEXYZ_start++)(ccc, pWhitePt, pColors_in_out,
+               nColors) == XcmsFailure) {
+           return(XcmsFailure);
+       }
+    }
+
+    return(XcmsSuccess);
+}
+
+\f
+/*
+ *     NAME
+ *             _XcmsDDConvertColors - Convert XcmsColor structures
+ *
+ *     SYNOPSIS
+ */
+Status
+_XcmsDDConvertColors(
+    XcmsCCC ccc,
+    XcmsColor *pColors_in_out,
+    unsigned int nColors,
+    XcmsColorFormat newFormat,
+    Bool *pCompressed)
+/*
+ *     DESCRIPTION
+ *             Convert XcmsColor structures:
+ *
+ *             1. From CIEXYZ to Device-Dependent formats (typically RGB and
+ *                     RGBi),
+ *                 or
+ *             2. Between Device-Dependent formats (typically RGB and RGBi).
+ *
+ *             Assumes that these specifications have already been white point
+ *             adjusted if necessary from Client White Point to Screen
+ *             White Point.  Therefore, the white point now associated
+ *             with the specifications is the Screen White Point.
+ *
+ *             pCompressed may be NULL.  If so this indicates that the
+ *             calling routine is not interested in knowing exactly which
+ *             color was compressed, if any.
+ *
+ *
+ *     RETURNS
+ *             XcmsFailure if failed,
+ *             XcmsSuccess if none of the color specifications were
+ *                     compressed in the conversion process
+ *             XcmsSuccessWithCompression if at least one of the
+ *                     color specifications were compressed in the
+ *                     conversion process.
+ *
+ */
+{
+    XcmsColorSpace *pFrom, *pTo;
+    XcmsDDConversionProc *src_to_CIEXYZ, *src_from_CIEXYZ;
+    XcmsDDConversionProc *dest_to_CIEXYZ, *dest_from_CIEXYZ;
+    XcmsDDConversionProc *from_CIEXYZ_start, *to_CIEXYZ_stop;
+    XcmsDDConversionProc *tmp;
+    int        retval;
+    int hasCompressed = 0;
+
+    if (ccc == NULL || pColors_in_out == NULL) {
+       return(XcmsFailure);
+    }
+
+    if (nColors == 0 || pColors_in_out->format == newFormat) {
+       /* do nothing */
+       return(XcmsSuccess);
+    }
+
+    if (((XcmsFunctionSet *)ccc->pPerScrnInfo->functionSet) == NULL) {
+       return(XcmsFailure);    /* hmm, an internal error? */
+    }
+
+    /*
+     * Its ok if pColors_in_out->format == XcmsCIEXYZFormat
+     * or
+     * if newFormat == XcmsCIEXYZFormat
+     */
+    if ( !( ValidDDColorSpaceID(ccc, pColors_in_out->format)
+           ||
+           (pColors_in_out->format == XcmsCIEXYZFormat))
+        ||
+        !(ValidDDColorSpaceID(ccc, newFormat)
+           ||
+           newFormat == XcmsCIEXYZFormat)) {
+       return(XcmsFailure);
+    }
+
+    if ((pFrom = ColorSpaceOfID(ccc, pColors_in_out->format)) == NULL){
+       return(XcmsFailure);
+    }
+
+    if ((pTo = ColorSpaceOfID(ccc, newFormat)) == NULL) {
+       return(XcmsFailure);
+    }
+
+    src_to_CIEXYZ = (XcmsDDConversionProc *)pFrom->to_CIEXYZ;
+    src_from_CIEXYZ = (XcmsDDConversionProc *)pFrom->from_CIEXYZ;
+    dest_to_CIEXYZ = (XcmsDDConversionProc *)pTo->to_CIEXYZ;
+    dest_from_CIEXYZ = (XcmsDDConversionProc *)pTo->from_CIEXYZ;
+
+    if (pTo->inverse_flag && pFrom->inverse_flag) {
+       /*
+        * Find common function pointers
+        */
+       for (to_CIEXYZ_stop = src_to_CIEXYZ; *to_CIEXYZ_stop; to_CIEXYZ_stop++){
+           for (tmp = dest_to_CIEXYZ; *tmp; tmp++) {
+               if (*to_CIEXYZ_stop == *tmp) {
+                   goto Continue;
+               }
+           }
+       }
+Continue:
+
+       /*
+        * Execute the functions
+        */
+       while (src_to_CIEXYZ != to_CIEXYZ_stop) {
+           retval = (*src_to_CIEXYZ++)(ccc, pColors_in_out, nColors,
+                   pCompressed);
+           if (retval == XcmsFailure) {
+               return(XcmsFailure);
+           }
+           hasCompressed |= (retval == XcmsSuccessWithCompression);
+       }
+
+       /*
+        * Determine where to start on the from_CIEXYZ path.
+        */
+       from_CIEXYZ_start = dest_from_CIEXYZ;
+       tmp = src_from_CIEXYZ;
+       while ((*from_CIEXYZ_start == *tmp) && (*from_CIEXYZ_start != NULL)) {
+           from_CIEXYZ_start++;
+           tmp++;
+       }
+
+    } else {
+       /*
+        * The function in at least one of the Color Spaces are not
+        * complementary, i.e.,
+        *      for an i, 0 <= i < n elements
+        *      from_CIEXYZ[i] is not the inverse of to_CIEXYZ[i]
+        *
+        * Execute the functions all the way to CIEXYZ
+        */
+       while (*src_to_CIEXYZ) {
+           retval = (*src_to_CIEXYZ++)(ccc, pColors_in_out, nColors,
+                   pCompressed);
+           if (retval == XcmsFailure) {
+               return(XcmsFailure);
+           }
+           hasCompressed |= (retval == XcmsSuccessWithCompression);
+       }
+
+       /*
+        * Determine where to start on the from_CIEXYZ path.
+        */
+       from_CIEXYZ_start = dest_from_CIEXYZ;
+    }
+
+    while (*from_CIEXYZ_start) {
+       retval = (*from_CIEXYZ_start++)(ccc, pColors_in_out, nColors,
+               pCompressed);
+       if (retval == XcmsFailure) {
+           return(XcmsFailure);
+       }
+       hasCompressed |= (retval == XcmsSuccessWithCompression);
+    }
+
+    return(hasCompressed ? XcmsSuccessWithCompression : XcmsSuccess);
+}
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsConvertColors - Convert XcmsColor structures
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsConvertColors(
+    XcmsCCC ccc,
+    XcmsColor *pColors_in_out,
+    unsigned int nColors,
+    XcmsColorFormat targetFormat,
+    Bool *pCompressed)
+/*
+ *     DESCRIPTION
+ *             Convert XcmsColor structures to another format
+ *
+ *     RETURNS
+ *             XcmsFailure if failed,
+ *             XcmsSuccess if succeeded without gamut compression,
+ *             XcmsSuccessWithCompression if succeeded with gamut
+ *                     compression.
+ *
+ */
+{
+    XcmsColor clientWhitePt;
+    XcmsColor Color1;
+    XcmsColor *pColors_tmp;
+    int callWhiteAdjustProc = 0;
+    XcmsColorFormat format;
+    Status retval;
+    unsigned char contents_flag = 0x00;
+    unsigned int iColors;
+
+    if (ccc == NULL || pColors_in_out == NULL ||
+               !(ValidDIColorSpaceID(targetFormat) ||
+               ValidDDColorSpaceID(ccc, targetFormat))) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Check formats in color specification array
+     */
+    format = pColors_in_out->format;
+    for (pColors_tmp = pColors_in_out, iColors = nColors; iColors; pColors_tmp++, iColors--) {
+       if (!(ValidDIColorSpaceID(pColors_tmp->format) ||
+               ValidDDColorSpaceID(ccc, pColors_tmp->format))) {
+           return(XcmsFailure);
+       }
+       if (XCMS_DI_ID(pColors_tmp->format)) {
+           contents_flag |= DI_FORMAT;
+       } else {
+           contents_flag |= DD_FORMAT;
+       }
+       if (pColors_tmp->format != format) {
+           contents_flag |= MIX_FORMAT;
+       }
+    }
+
+    /*
+     * Check if we need the Client White Point.
+     */
+    if ((contents_flag & DI_FORMAT) || XCMS_DI_ID(targetFormat)) {
+       /* To proceed, we need to get the Client White Point */
+       memcpy((char *)&clientWhitePt, (char *)&ccc->clientWhitePt,
+              sizeof(XcmsColor));
+       if (clientWhitePt.format == XcmsUndefinedFormat) {
+           /*
+            * Client White Point is undefined, therefore set to the Screen
+            *   White Point.
+            * Since Client White Point == Screen White Point, WhiteAdjustProc
+            *   is not called.
+            */
+           memcpy((char *)&clientWhitePt,
+                  (char *)&ccc->pPerScrnInfo->screenWhitePt,
+                  sizeof(XcmsColor));
+       } else if ((ccc->whitePtAdjProc != NULL) && !_XcmsEqualWhitePts(ccc,
+               &clientWhitePt, ScreenWhitePointOfCCC(ccc))) {
+           /*
+            * Client White Point != Screen White Point, and WhiteAdjustProc
+            *   is not NULL, therefore, will need to call it when
+            *   converting between DI and DD specifications.
+            */
+           callWhiteAdjustProc = 1;
+       }
+    }
+
+    /*
+     * Make copy of array of color specifications
+     */
+    if (nColors > 1) {
+       pColors_tmp = (XcmsColor *) Xmalloc(nColors * sizeof(XcmsColor));
+    } else {
+       pColors_tmp = &Color1;
+    }
+    memcpy((char *)pColors_tmp, (char *)pColors_in_out,
+          nColors * sizeof(XcmsColor));
+
+    /*
+     * zero out pCompressed
+     */
+    if (pCompressed) {
+       bzero((char *)pCompressed, nColors * sizeof(Bool));
+    }
+
+    if (contents_flag == DD_FORMAT || contents_flag == DI_FORMAT) {
+       /*
+        * ENTIRE ARRAY IS IN ONE FORMAT.
+        */
+       if (XCMS_DI_ID(format) && XCMS_DI_ID(targetFormat)) {
+           /*
+            * DI-to-DI only conversion
+            */
+           retval = _XcmsDIConvertColors(ccc, pColors_tmp,
+                   &clientWhitePt, nColors, targetFormat);
+       } else if (XCMS_DD_ID(format) && XCMS_DD_ID(targetFormat)) {
+           /*
+            * DD-to-DD only conversion
+            *   Since DD->DD there will be no compressed thus we can
+            *   pass NULL instead of pCompressed.
+            */
+           retval = _XcmsDDConvertColors(ccc, pColors_tmp, nColors,
+                   targetFormat, (Bool *)NULL);
+       } else {
+           /*
+            * Otherwise we have:
+            *    1. Device-Independent to Device-Dependent Conversion
+            *          OR
+            *    2. Device-Dependent to Device-Independent Conversion
+            *
+            *  We need to go from oldFormat -> CIEXYZ -> targetFormat
+            *  adjusting for white points as necessary.
+            */
+
+           if (XCMS_DI_ID(format)) {
+               /*
+                *    1. Device-Independent to Device-Dependent Conversion
+                */
+               if (callWhiteAdjustProc) {
+                   /*
+                    * White Point Adjustment
+                    *          Client White Point to Screen White Point
+                    */
+                   retval = (*ccc->whitePtAdjProc)(ccc, &clientWhitePt,
+                           ScreenWhitePointOfCCC(ccc), targetFormat,
+                           pColors_tmp, nColors, pCompressed);
+               } else {
+                   if (_XcmsDIConvertColors(ccc, pColors_tmp,
+                           &clientWhitePt, nColors, XcmsCIEXYZFormat)
+                           == XcmsFailure) {
+                       goto Failure;
+                   }
+                   retval = _XcmsDDConvertColors(ccc, pColors_tmp, nColors,
+                           targetFormat, pCompressed);
+               }
+           } else {
+               /*
+                *    2. Device-Dependent to Device-Independent Conversion
+                */
+               if (callWhiteAdjustProc) {
+                   /*
+                    * White Point Adjustment
+                    *          Screen White Point to Client White Point
+                    */
+                   retval = (*ccc->whitePtAdjProc)(ccc,
+                           ScreenWhitePointOfCCC(ccc), &clientWhitePt,
+                           targetFormat, pColors_tmp, nColors, pCompressed);
+               } else {
+                   /*
+                    * Since DD->CIEXYZ, no compression takes place therefore
+                    * we can pass NULL instead of pCompressed.
+                    */
+                   if (_XcmsDDConvertColors(ccc, pColors_tmp, nColors,
+                           XcmsCIEXYZFormat, (Bool *)NULL) == XcmsFailure) {
+                       goto Failure;
+                   }
+                   retval = _XcmsDIConvertColors(ccc, pColors_tmp,
+                           &clientWhitePt, nColors, targetFormat);
+               }
+           }
+       }
+    } else {
+       /*
+        * ARRAY HAS MIXED FORMATS.
+        */
+       if ((contents_flag == (DI_FORMAT | MIX_FORMAT)) &&
+               XCMS_DI_ID(targetFormat)) {
+           /*
+            * Convert from DI to DI in batches of contiguous formats
+            *
+            * Because DI->DI, WhiteAdjustProc not called.
+            */
+           retval = ConvertMixedColors(ccc, pColors_tmp, &clientWhitePt,
+                   nColors, targetFormat, (unsigned char)DI_FORMAT);
+       } else if ((contents_flag == (DD_FORMAT | MIX_FORMAT)) &&
+               XCMS_DD_ID(targetFormat)) {
+           /*
+            * Convert from DD to DD in batches of contiguous formats
+            *
+            * Because DD->DD, WhiteAdjustProc not called.
+            */
+           retval = ConvertMixedColors(ccc, pColors_tmp,
+                   (XcmsColor *)NULL, nColors, targetFormat,
+                   (unsigned char)DD_FORMAT);
+       } else if (XCMS_DI_ID(targetFormat)) {
+           /*
+            * We need to convert from DI-to-DI and DD-to-DI, therefore
+            *   1. convert DD specifications to CIEXYZ, then
+            *   2. convert all in batches to the target DI format.
+            *
+            * Note that ConvertMixedColors will call WhiteAdjustProc
+            * as necessary.
+            */
+
+           /*
+            * Convert only DD specifications in batches of contiguous formats
+            * to CIEXYZ
+            *
+            * Since DD->CIEXYZ, ConvertMixedColors will apply WhiteAdjustProc
+            * if required.
+            */
+           retval = ConvertMixedColors(ccc, pColors_tmp, &clientWhitePt,
+                   nColors, XcmsCIEXYZFormat, (unsigned char)DD_FORMAT);
+
+           /*
+            * Because at this point we may have a mix of DI formats
+            * (e.g., CIEXYZ, CIELuv) we must convert the specs to the
+            * target DI format in batches of contiguous source formats.
+            */
+           retval = ConvertMixedColors(ccc, pColors_tmp, &clientWhitePt,
+                   nColors, targetFormat, (unsigned char)DI_FORMAT);
+       } else {
+           /*
+            * We need to convert from DI-to-DD and DD-to-DD, therefore
+            *   1. convert DI specifications to CIEXYZ, then
+            *   2. convert all to the DD target format.
+            *
+            *   This allows white point adjustment and gamut compression
+            *   to be applied to all the color specifications in one
+            *   swoop if those functions do in fact modify the entire
+            *   group of color specifications.
+            */
+
+           /*
+            * Convert in batches to CIEXYZ
+            *
+            * If DD->CIEXYZ, ConvertMixedColors will apply WhiteAdjustProc
+            * if required.
+            */
+           if ((retval = ConvertMixedColors(ccc, pColors_tmp, &clientWhitePt,
+                   nColors, XcmsCIEXYZFormat,
+                   (unsigned char)(DI_FORMAT | DD_FORMAT))) == XcmsFailure) {
+               goto Failure;
+           }
+
+           /*
+            * Convert all specifications (now in CIEXYZ format) to
+            * the target DD format.
+            * Since CIEXYZ->DD, compression MAY take place therefore
+            * we must pass pCompressed.
+            * Note that WhiteAdjustProc must be used if necessary.
+            */
+           if (callWhiteAdjustProc) {
+               /*
+                * White Point Adjustment
+                *      Client White Point to Screen White Point
+                */
+               retval = (*ccc->whitePtAdjProc)(ccc,
+                       &clientWhitePt, ScreenWhitePointOfCCC(ccc),
+                       targetFormat, pColors_tmp, nColors, pCompressed);
+           } else {
+               retval = _XcmsDDConvertColors(ccc, pColors_tmp, nColors,
+                       targetFormat, pCompressed);
+           }
+       }
+    }
+
+    if (retval != XcmsFailure) {
+       memcpy((char *)pColors_in_out, (char *)pColors_tmp,
+              nColors * sizeof(XcmsColor));
+    }
+    if (nColors > 1) {
+       Xfree((char *)pColors_tmp);
+    }
+    return(retval);
+
+Failure:
+    if (nColors > 1) {
+       Xfree((char *)pColors_tmp);
+    }
+    return(XcmsFailure);
+}
+
+\f
+/*
+ *     NAME
+ *             XcmsRegFormatOfPrefix
+ *
+ *     SYNOPSIS
+ */
+XcmsColorFormat
+_XcmsRegFormatOfPrefix(
+    _Xconst char *prefix)
+/*
+ *     DESCRIPTION
+ *             Returns a color space ID associated with the specified
+ *             X Consortium registered color space prefix.
+ *
+ *     RETURNS
+ *             The color space ID if found;
+ *             otherwise NULL.
+ */
+{
+    XcmsRegColorSpaceEntry *pEntry = _XcmsRegColorSpaces;
+
+    while (pEntry->prefix != NULL) {
+       if (strcmp(prefix, pEntry->prefix) == 0) {
+           return(pEntry->id);
+       }
+       pEntry++;
+    }
+    return(XcmsUndefinedFormat);
+}
diff --git a/src/xcms/HVC.c b/src/xcms/HVC.c
new file mode 100644 (file)
index 0000000..80f1735
--- /dev/null
@@ -0,0 +1,625 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  TekColor is a
+ * trademark of Tektronix, Inc.  The term "TekHVC" designates a particular
+ * color space that is the subject of U.S. Patent No. 4,985,853 (equivalent
+ * foreign patents pending).  Permission is hereby granted to use, copy,
+ * modify, sell, and otherwise distribute this software and its
+ * documentation for any purpose and without fee, provided that:
+ *
+ * 1. This copyright, permission, and disclaimer notice is reproduced in
+ *    all copies of this software and any modification thereof and in
+ *    supporting documentation;
+ * 2. Any color-handling application which displays TekHVC color
+ *    cooordinates identifies these as TekHVC color coordinates in any
+ *    interface that displays these coordinates and in any associated
+ *    documentation;
+ * 3. The term "TekHVC" is always used, and is only used, in association
+ *    with the mathematical derivations of the TekHVC Color Space,
+ *    including those provided in this file and any equivalent pathways and
+ *    mathematical derivations, regardless of digital (e.g., floating point
+ *    or integer) representation.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *     NAME
+ *             TekHVC.c
+ *
+ *     DESCRIPTION
+ *             This file contains routines that support the TekHVC
+ *             color space to include conversions to and from the CIE
+ *             XYZ space.
+ *
+ *     DOCUMENTATION
+ *             "TekColor Color Management System, System Implementor's Manual"
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include <X11/Xos.h>
+#include <math.h>
+#include "Cv.h"
+
+#include <stdio.h>
+
+/*
+ *     DEFINES
+ */
+#define u_BR    0.7127          /* u' Best Red */
+#define v_BR    0.4931          /* v' Best Red */
+#define EPS     0.001
+#define CHROMA_SCALE_FACTOR   7.50725
+#ifndef PI
+#  ifdef M_PI
+#    define PI M_PI
+#  else
+#    define PI       3.14159265358979323846264338327950
+#  endif
+#endif
+#ifndef degrees
+#  define degrees(r) ((XcmsFloat)(r) * 180.0 / PI)
+#endif /* degrees */
+#ifndef radians
+#  define radians(d) ((XcmsFloat)(d) * PI / 180.0)
+#endif /* radians */
+
+/*************************************************************************
+ * Note: The DBL_EPSILON for ANSI is 1e-5 so my checks need to take
+ *       this into account.  If your DBL_EPSILON is different then
+ *       adjust this define.
+ *
+ *       Also note that EPS is the error factor in the calculations
+ *       This may need to be the same as XMY_DBL_EPSILON in
+ *       some implementations.
+ **************************************************************************/
+#ifdef DBL_EPSILON
+#  define XMY_DBL_EPSILON DBL_EPSILON
+#else
+#  define XMY_DBL_EPSILON 0.00001
+#endif
+
+/*
+ *     FORWARD DECLARATIONS
+ */
+static int TekHVC_ParseString(register char *spec, XcmsColor *pColor);
+static Status XcmsTekHVC_ValidSpec(XcmsColor *pColor);
+
+/*
+ *     LOCAL VARIABLES
+ */
+
+    /*
+     * NULL terminated list of functions applied to get from TekHVC to CIEXYZ
+     */
+static XcmsConversionProc Fl_TekHVC_to_CIEXYZ[] = {
+    XcmsTekHVCToCIEuvY,
+    XcmsCIEuvYToCIEXYZ,
+    NULL
+};
+
+    /*
+     * NULL terminated list of functions applied to get from CIEXYZ to TekHVC
+     */
+static XcmsConversionProc Fl_CIEXYZ_to_TekHVC[] = {
+    XcmsCIEXYZToCIEuvY,
+    XcmsCIEuvYToTekHVC,
+    NULL
+};
+
+/*
+ *     GLOBALS
+ */
+
+    /*
+     * TekHVC Color Space
+     */
+XcmsColorSpace XcmsTekHVCColorSpace =
+    {
+       _XcmsTekHVC_prefix,     /* prefix */
+       XcmsTekHVCFormat,               /* id */
+       TekHVC_ParseString,     /* parseString */
+       Fl_TekHVC_to_CIEXYZ,    /* to_CIEXYZ */
+       Fl_CIEXYZ_to_TekHVC,    /* from_CIEXYZ */
+       1
+    };
+
+
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PRIVATE ROUTINES                               *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             TekHVC_ParseString
+ *
+ *     SYNOPSIS
+ */
+static int
+TekHVC_ParseString(
+    register char *spec,
+    XcmsColor *pColor)
+/*
+ *     DESCRIPTION
+ *             This routines takes a string and attempts to convert
+ *             it into a XcmsColor structure with XcmsTekHVCFormat.
+ *             The assumed TekHVC string syntax is:
+ *                 TekHVC:<H>/<V>/<C>
+ *             Where H, V, and C are in string input format for floats
+ *             consisting of:
+ *                 a. an optional sign
+ *                 b. a string of numbers possibly containing a decimal point,
+ *                 c. an optional exponent field containing an 'E' or 'e'
+ *                     followed by a possibly signed integer string.
+ *
+ *     RETURNS
+ *             XcmsFailure if invalid;
+ *             XcmsSuccess if valid.
+ */
+{
+    int n;
+    char *pchar;
+
+    if ((pchar = strchr(spec, ':')) == NULL) {
+       return(XcmsFailure);
+    }
+    n = (int)(pchar - spec);
+
+    /*
+     * Check for proper prefix.
+     */
+    if (strncmp(spec, _XcmsTekHVC_prefix, n) != 0) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Attempt to parse the value portion.
+     */
+    if (sscanf(spec + n + 1, "%lf/%lf/%lf",
+           &pColor->spec.TekHVC.H,
+           &pColor->spec.TekHVC.V,
+           &pColor->spec.TekHVC.C) != 3) {
+        char *s; /* Maybe failed due to locale */
+        int f;
+        if ((s = strdup(spec))) {
+            for (f = 0; s[f]; ++f)
+                if (s[f] == '.')
+                    s[f] = ',';
+                else if (s[f] == ',')
+                    s[f] = '.';
+           if (sscanf(s + n + 1, "%lf/%lf/%lf",
+                      &pColor->spec.TekHVC.H,
+                      &pColor->spec.TekHVC.V,
+                      &pColor->spec.TekHVC.C) != 3) {
+                free(s);
+                return(XcmsFailure);
+            }
+            free(s);
+        } else
+           return(XcmsFailure);
+    }
+    pColor->format = XcmsTekHVCFormat;
+    pColor->pixel = 0;
+    return(XcmsTekHVC_ValidSpec(pColor));
+}
+
+\f
+/*
+ *     NAME
+ *             ThetaOffset -- compute thetaOffset
+ *
+ *     SYNOPSIS
+ */
+static int
+ThetaOffset(
+    XcmsColor *pWhitePt,
+    XcmsFloat *pThetaOffset)
+/*
+ *     DESCRIPTION
+ *             This routine computes the theta offset of a given
+ *             white point, i.e. XcmsColor.  It is used in both this
+ *             conversion and the printer conversions.
+ *
+ *     RETURNS
+ *             0 if failed.
+ *             1 if succeeded with no modifications.
+ *
+ *     ASSUMPTIONS
+ *             Assumes:
+ *                     pWhitePt != NULL
+ *                     pWhitePt->format == XcmsCIEuvYFormat
+ *
+ */
+{
+    double div, slopeuv;
+
+    if (pWhitePt == NULL || pWhitePt->format != XcmsCIEuvYFormat) {
+       return(0);
+    }
+
+    if ((div = u_BR - pWhitePt->spec.CIEuvY.u_prime) == 0.0) {
+       return(0);
+    }
+    slopeuv = (v_BR - pWhitePt->spec.CIEuvY.v_prime) / div;
+    *pThetaOffset = degrees(XCMS_ATAN(slopeuv));
+    return(1);
+}
+
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsTekHVC_ValidSpec()
+ *
+ *     SYNOPSIS
+ */
+static int
+XcmsTekHVC_ValidSpec(
+    XcmsColor *pColor)
+/*
+ *     DESCRIPTION
+ *             Checks if values in the color specification are valid.
+ *             Also brings hue into the range 0.0 <= Hue < 360.0
+ *
+ *     RETURNS
+ *             0 if not valid.
+ *             1 if valid.
+ *
+ */
+{
+    if (pColor->format != XcmsTekHVCFormat) {
+       return(XcmsFailure);
+    }
+    if (pColor->spec.TekHVC.V < (0.0 - XMY_DBL_EPSILON)
+           || pColor->spec.TekHVC.V > (100.0 + XMY_DBL_EPSILON)
+           || (pColor->spec.TekHVC.C < 0.0 - XMY_DBL_EPSILON)) {
+       return(XcmsFailure);
+    }
+
+    if (pColor->spec.TekHVC.V < 0.0) {
+           pColor->spec.TekHVC.V = 0.0 + XMY_DBL_EPSILON;
+    } else if (pColor->spec.TekHVC.V > 100.0) {
+       pColor->spec.TekHVC.V = 100.0 - XMY_DBL_EPSILON;
+    }
+
+    if (pColor->spec.TekHVC.C < 0.0) {
+       pColor->spec.TekHVC.C = 0.0 - XMY_DBL_EPSILON;
+    }
+
+    while (pColor->spec.TekHVC.H < 0.0) {
+       pColor->spec.TekHVC.H += 360.0;
+    }
+    while (pColor->spec.TekHVC.H >= 360.0) {
+       pColor->spec.TekHVC.H -= 360.0;
+    }
+    return(XcmsSuccess);
+}
+\f
+/*
+ *     NAME
+ *             XcmsTekHVCToCIEuvY - convert TekHVC to CIEuvY
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsTekHVCToCIEuvY(
+    XcmsCCC ccc,
+    XcmsColor *pHVC_WhitePt,
+    XcmsColor *pColors_in_out,
+    unsigned int nColors)
+/*
+ *     DESCRIPTION
+ *             Transforms an array of TekHVC color specifications, given
+ *             their associated white point, to CIECIEuvY.color
+ *             specifications.
+ *
+ *     RETURNS
+ *             XcmsFailure if failed, XcmsSuccess otherwise.
+ *
+ */
+{
+    XcmsFloat  thetaOffset;
+    XcmsColor  *pColor = pColors_in_out;
+    XcmsColor  whitePt;
+    XcmsCIEuvY uvY_return;
+    XcmsFloat  tempHue, u, v;
+    XcmsFloat  tmpVal;
+    register int i;
+
+    /*
+     * Check arguments
+     */
+    if (pHVC_WhitePt == NULL || pColors_in_out == NULL) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Make sure white point is in CIEuvY form
+     */
+    if (pHVC_WhitePt->format != XcmsCIEuvYFormat) {
+       /* Make copy of the white point because we're going to modify it */
+       memcpy((char *)&whitePt, (char *)pHVC_WhitePt, sizeof(XcmsColor));
+       if (!_XcmsDIConvertColors(ccc, &whitePt, (XcmsColor *)NULL, 1,
+               XcmsCIEuvYFormat)) {
+           return(XcmsFailure);
+       }
+       pHVC_WhitePt = &whitePt;
+    }
+    /* Make sure it is a white point, i.e., Y == 1.0 */
+    if (pHVC_WhitePt->spec.CIEuvY.Y != 1.0) {
+       return(XcmsFailure);
+    }
+
+    /* Get the thetaOffset */
+    if (!ThetaOffset(pHVC_WhitePt, &thetaOffset)) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Now convert each XcmsColor structure to CIEXYZ form
+     */
+    for (i = 0; i < nColors; i++, pColor++) {
+
+       /* Make sure original format is TekHVC and is valid */
+       if (!XcmsTekHVC_ValidSpec(pColor)) {
+           return(XcmsFailure);
+       }
+
+       if (pColor->spec.TekHVC.V == 0.0 || pColor->spec.TekHVC.V == 100.0) {
+           if (pColor->spec.TekHVC.V == 100.0) {
+               uvY_return.Y = 1.0;
+           } else { /* pColor->spec.TekHVC.V == 0.0 */
+               uvY_return.Y = 0.0;
+           }
+           uvY_return.u_prime = pHVC_WhitePt->spec.CIEuvY.u_prime;
+           uvY_return.v_prime = pHVC_WhitePt->spec.CIEuvY.v_prime;
+       } else {
+
+           /* Find the hue based on the white point offset */
+           tempHue = pColor->spec.TekHVC.H + thetaOffset;
+
+           while (tempHue < 0.0) {
+               tempHue += 360.0;
+           }
+           while (tempHue >= 360.0) {
+               tempHue -= 360.0;
+           }
+
+           tempHue = radians(tempHue);
+
+           /* Calculate u'v' for the obtained hue */
+           u = (XcmsFloat) ((XCMS_COS(tempHue) * pColor->spec.TekHVC.C) /
+                   (pColor->spec.TekHVC.V * (double)CHROMA_SCALE_FACTOR));
+           v = (XcmsFloat) ((XCMS_SIN(tempHue) * pColor->spec.TekHVC.C) /
+                   (pColor->spec.TekHVC.V * (double)CHROMA_SCALE_FACTOR));
+
+           /* Based on the white point get the offset from best red */
+           uvY_return.u_prime = u + pHVC_WhitePt->spec.CIEuvY.u_prime;
+           uvY_return.v_prime = v + pHVC_WhitePt->spec.CIEuvY.v_prime;
+
+           /* Calculate the Y value based on the L* = V. */
+           if (pColor->spec.TekHVC.V < 7.99953624) {
+               uvY_return.Y = pColor->spec.TekHVC.V / 903.29;
+           } else {
+               tmpVal = (pColor->spec.TekHVC.V + 16.0) / 116.0;
+               uvY_return.Y = tmpVal * tmpVal * tmpVal; /* tmpVal ** 3 */
+           }
+       }
+
+       /* Copy result to pColor */
+       memcpy((char *)&pColor->spec, (char *)&uvY_return, sizeof(XcmsCIEuvY));
+
+       /* Identify that the format is now CIEuvY */
+       pColor->format = XcmsCIEuvYFormat;
+    }
+    return(XcmsSuccess);
+}
+
+\f
+/*
+ *     NAME
+ *             XcmsCIEuvYToTekHVC - convert CIEuvY to TekHVC
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsCIEuvYToTekHVC(
+    XcmsCCC ccc,
+    XcmsColor *pHVC_WhitePt,
+    XcmsColor *pColors_in_out,
+    unsigned int nColors)
+/*
+ *     DESCRIPTION
+ *             Transforms an array of CIECIEuvY.color specifications, given
+ *             their assiciated white point, to TekHVC specifications.
+ *
+ *     RETURNS
+ *             XcmsFailure if failed, XcmsSuccess otherwise.
+ *
+ */
+{
+    XcmsFloat  theta, L2, u, v, nThetaLow, nThetaHigh;
+    XcmsFloat  thetaOffset;
+    XcmsColor  *pColor = pColors_in_out;
+    XcmsColor  whitePt;
+    XcmsTekHVC HVC_return;
+    register int i;
+
+    /*
+     * Check arguments
+     */
+    if (pHVC_WhitePt == NULL || pColors_in_out == NULL) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Make sure white point is in CIEuvY form
+     */
+    if (pHVC_WhitePt->format != XcmsCIEuvYFormat) {
+       /* Make copy of the white point because we're going to modify it */
+       memcpy((char *)&whitePt, (char *)pHVC_WhitePt, sizeof(XcmsColor));
+       if (!_XcmsDIConvertColors(ccc, &whitePt, (XcmsColor *)NULL, 1,
+               XcmsCIEuvYFormat)) {
+           return(XcmsFailure);
+       }
+       pHVC_WhitePt = &whitePt;
+    }
+    /* Make sure it is a white point, i.e., Y == 1.0 */
+    if (pHVC_WhitePt->spec.CIEuvY.Y != 1.0) {
+       return(XcmsFailure);
+    }
+    if (!ThetaOffset(pHVC_WhitePt, &thetaOffset)) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Now convert each XcmsColor structure to CIEXYZ form
+     */
+    for (i = 0; i < nColors; i++, pColor++) {
+       if (!_XcmsCIEuvY_ValidSpec(pColor)) {
+           return(XcmsFailure);
+       }
+
+       /* Use the white point offset to determine HVC */
+       u = pColor->spec.CIEuvY.u_prime - pHVC_WhitePt->spec.CIEuvY.u_prime;
+       v = pColor->spec.CIEuvY.v_prime - pHVC_WhitePt->spec.CIEuvY.v_prime;
+
+       /* Calculate the offset */
+       if (u == 0.0) {
+           theta = 0.0;
+       } else {
+           theta = v / u;
+           theta = (XcmsFloat) XCMS_ATAN((double)theta);
+           theta = degrees(theta);
+       }
+
+       nThetaLow = 0.0;
+       nThetaHigh = 360.0;
+       if (u > 0.0 && v > 0.0) {
+           nThetaLow = 0.0;
+           nThetaHigh = 90.0;
+       } else if (u < 0.0 && v > 0.0) {
+           nThetaLow = 90.0;
+           nThetaHigh = 180.0;
+       } else if (u < 0.0 && v < 0.0) {
+           nThetaLow = 180.0;
+           nThetaHigh = 270.0;
+       } else if (u > 0.0 && v < 0.0) {
+           nThetaLow = 270.0;
+           nThetaHigh = 360.0;
+       }
+       while (theta < nThetaLow) {
+               theta += 90.0;
+       }
+       while (theta >= nThetaHigh) {
+           theta -= 90.0;
+       }
+
+       /* calculate the L value from the given Y */
+       L2 = (pColor->spec.CIEuvY.Y < 0.008856)
+           ?
+           (pColor->spec.CIEuvY.Y * 903.29)
+           :
+           ((XcmsFloat)(XCMS_CUBEROOT(pColor->spec.CIEuvY.Y) * 116.0) - 16.0);
+       HVC_return.C = L2 * CHROMA_SCALE_FACTOR * XCMS_SQRT((double) ((u * u) + (v * v)));
+       if (HVC_return.C < 0.0) {
+           theta = 0.0;
+       }
+       HVC_return.V = L2;
+       HVC_return.H = theta - thetaOffset;
+
+       /*
+        * If this is within the error margin let some other routine later
+        * in the chain worry about the slop in the calculations.
+        */
+       while (HVC_return.H < -EPS) {
+           HVC_return.H += 360.0;
+       }
+       while (HVC_return.H >= 360.0 + EPS) {
+           HVC_return.H -= 360.0;
+       }
+
+       /* Copy result to pColor */
+       memcpy((char *)&pColor->spec, (char *)&HVC_return, sizeof(XcmsTekHVC));
+
+       /* Identify that the format is now CIEuvY */
+       pColor->format = XcmsTekHVCFormat;
+    }
+    return(XcmsSuccess);
+}
+
+\f
+/*
+ *     NAME
+ *             _XcmsTekHVC_CheckModify
+ *
+ *     SYNOPSIS
+ */
+int
+_XcmsTekHVC_CheckModify(
+    XcmsColor *pColor)
+/*
+ *     DESCRIPTION
+ *             Checks if values in the color specification are valid.
+ *             If they are not it modifies the values.
+ *             Also brings hue into the range 0.0 <= Hue < 360.0
+ *
+ *     RETURNS
+ *             0 if not valid.
+ *             1 if valid.
+ *
+ */
+{
+    int n;
+
+    /* For now only use the TekHVC numbers as inputs */
+    if (pColor->format != XcmsTekHVCFormat) {
+       return(0);
+    }
+
+    if (pColor->spec.TekHVC.V < 0.0) {
+       pColor->spec.TekHVC.V = 0.0 + XMY_DBL_EPSILON;
+    } else if (pColor->spec.TekHVC.V > 100.0) {
+       pColor->spec.TekHVC.V = 100.0 - XMY_DBL_EPSILON;
+    }
+
+    if (pColor->spec.TekHVC.C < 0.0) {
+       pColor->spec.TekHVC.C = 0.0 - XMY_DBL_EPSILON;
+    }
+
+    if (pColor->spec.TekHVC.H < 0.0) {
+       n = -pColor->spec.TekHVC.H / 360.0;
+       pColor->spec.TekHVC.H += (n + 1) * 360.0;
+       if (pColor->spec.TekHVC.H >= 360.0)
+           pColor->spec.TekHVC.H -= 360.0;
+    } else if (pColor->spec.TekHVC.H >= 360.0) {
+       n = pColor->spec.TekHVC.H / 360.0;
+       pColor->spec.TekHVC.H -= n * 360.0;
+    }
+    return(1);
+}
diff --git a/src/xcms/HVCGcC.c b/src/xcms/HVCGcC.c
new file mode 100644 (file)
index 0000000..6d52eac
--- /dev/null
@@ -0,0 +1,149 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  TekColor is a
+ * trademark of Tektronix, Inc.  The term "TekHVC" designates a particular
+ * color space that is the subject of U.S. Patent No. 4,985,853 (equivalent
+ * foreign patents pending).  Permission is hereby granted to use, copy,
+ * modify, sell, and otherwise distribute this software and its
+ * documentation for any purpose and without fee, provided that:
+ *
+ * 1. This copyright, permission, and disclaimer notice is reproduced in
+ *    all copies of this software and any modification thereof and in
+ *    supporting documentation;
+ * 2. Any color-handling application which displays TekHVC color
+ *    cooordinates identifies these as TekHVC color coordinates in any
+ *    interface that displays these coordinates and in any associated
+ *    documentation;
+ * 3. The term "TekHVC" is always used, and is only used, in association
+ *    with the mathematical derivations of the TekHVC Color Space,
+ *    including those provided in this file and any equivalent pathways and
+ *    mathematical derivations, regardless of digital (e.g., floating point
+ *    or integer) representation.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *     NAME
+ *             TekHVCGcC.c
+ *
+ *     DESCRIPTION
+ *             Source for XcmsTekHVCClipC() gamut compression routine.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsTekHVCClipC - Reduce the chroma for a hue and value
+ *
+ *     SYNOPSIS
+ */
+/* ARGSUSED */
+Status
+XcmsTekHVCClipC (
+    XcmsCCC ccc,
+    XcmsColor *pColors_in_out,
+    unsigned int nColors,
+    unsigned int i,
+    Bool *pCompressed)
+/*
+ *     DESCRIPTION
+ *             Reduce the Chroma for a specific hue and value to
+ *             to bring the given color into the gamut of the
+ *             specified device.  As required of gamut compression
+ *             functions in Xcms, this routine returns pColor_in_out
+ *             in XcmsCIEXYZFormat on successful completion.
+ *
+ *             Since this routine works with the value within
+ *             pColor_in_out intermediate results may be returned
+ *             even though it may be invalid.
+ *
+ *     RETURNS
+ *             XcmsFailure - Failure
+ *              XcmsSuccess - Succeeded
+ *
+ */
+{
+    Status retval;
+    XcmsColor *pColor;
+
+    /*
+     * Color specification passed as input can be assumed to:
+     * 1. Be in XcmsCIEXYZFormat
+     * 2. Already be white point adjusted for the Screen White Point.
+     *     This means that the white point now associated with this
+     *     color spec is the Screen White Point (even if the
+     *     ccc->clientWhitePt differs).
+     */
+
+    /*
+     * Insure TekHVC installed
+     */
+    if (XcmsAddColorSpace(&XcmsTekHVCColorSpace) == XcmsFailure) {
+       return(XcmsFailure);
+    }
+
+    pColor = pColors_in_out + i;
+
+    if (ccc->visual->class < StaticColor &&
+           FunctionSetOfCCC(ccc) != (XPointer) &XcmsLinearRGBFunctionSet) {
+       /*
+        * GRAY !
+        */
+       _XcmsDIConvertColors(ccc, pColor, &ccc->pPerScrnInfo->screenWhitePt,
+               1, XcmsTekHVCFormat);
+       pColor->spec.TekHVC.H = pColor->spec.TekHVC.C = 0.0;
+       _XcmsDIConvertColors(ccc, pColor, &ccc->pPerScrnInfo->screenWhitePt,
+               1, XcmsCIEXYZFormat);
+       if (pCompressed) {
+           *(pCompressed + i) = True;
+       }
+       return(XcmsSuccess);
+    } else {
+       if (pColor->format != XcmsTekHVCFormat) {
+           if (_XcmsDIConvertColors(ccc, pColor,
+                   &ccc->pPerScrnInfo->screenWhitePt, 1, XcmsTekHVCFormat)
+                   == XcmsFailure) {
+               return(XcmsFailure);
+           }
+       }
+       if (XcmsTekHVCQueryMaxC(ccc,
+               pColor->spec.TekHVC.H,
+               pColor->spec.TekHVC.V,
+               pColor)
+               == XcmsFailure) {
+           return(XcmsFailure);
+       }
+       retval = _XcmsDIConvertColors(ccc, pColor,
+               &ccc->pPerScrnInfo->screenWhitePt, 1, XcmsCIEXYZFormat);
+       if (retval != XcmsFailure && pCompressed != NULL) {
+           *(pCompressed + i) = True;
+       }
+       return(retval);
+    }
+}
diff --git a/src/xcms/HVCGcV.c b/src/xcms/HVCGcV.c
new file mode 100644 (file)
index 0000000..0752a07
--- /dev/null
@@ -0,0 +1,201 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  TekColor is a
+ * trademark of Tektronix, Inc.  The term "TekHVC" designates a particular
+ * color space that is the subject of U.S. Patent No. 4,985,853 (equivalent
+ * foreign patents pending).  Permission is hereby granted to use, copy,
+ * modify, sell, and otherwise distribute this software and its
+ * documentation for any purpose and without fee, provided that:
+ *
+ * 1. This copyright, permission, and disclaimer notice is reproduced in
+ *    all copies of this software and any modification thereof and in
+ *    supporting documentation;
+ * 2. Any color-handling application which displays TekHVC color
+ *    cooordinates identifies these as TekHVC color coordinates in any
+ *    interface that displays these coordinates and in any associated
+ *    documentation;
+ * 3. The term "TekHVC" is always used, and is only used, in association
+ *    with the mathematical derivations of the TekHVC Color Space,
+ *    including those provided in this file and any equivalent pathways and
+ *    mathematical derivations, regardless of digital (e.g., floating point
+ *    or integer) representation.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *     NAME
+ *             TekHVCGcV.c
+ *
+ *     DESCRIPTION
+ *             Source for XcmsTekHVCClipV() gamut compression routine.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsTekHVCClipV - Return the closest value
+ *
+ *     SYNOPSIS
+ */
+/* ARGSUSED */
+Status
+XcmsTekHVCClipV (
+    XcmsCCC ccc,
+    XcmsColor *pColors_in_out,
+    unsigned int nColors,
+    unsigned int i,
+    Bool *pCompressed)
+/*
+ *     DESCRIPTION
+ *             Return the closest value for a specific hue and chroma.
+ *             This routine takes any color as input and outputs
+ *             a CIE XYZ color.
+ *
+ *             Since this routine works with the value within
+ *             pColor_in_out intermediate results may be returned
+ *             even though it may be invalid.
+ *
+ *     RETURNS
+ *             XcmsFailure - Failure
+ *              XcmsSuccess - Succeeded
+ *
+ */
+{
+    XcmsColor  *pColor;
+    XcmsColor  hvc_max;
+    XcmsCCCRec myCCC;
+    Status retval;
+
+    /*
+     * Insure TekHVC installed
+     */
+    if (XcmsAddColorSpace(&XcmsTekHVCColorSpace) == XcmsFailure) {
+       return(XcmsFailure);
+    }
+
+    /* Use my own CCC */
+    memcpy ((char *)&myCCC, (char *)ccc, sizeof(XcmsCCCRec));
+    myCCC.clientWhitePt.format = XcmsUndefinedFormat;/* Inherit Screen WP */
+    myCCC.gamutCompProc = (XcmsCompressionProc)NULL;/* no gamut compression */
+
+    /*
+     * Color specification passed as input can be assumed to:
+     * 1. Be in XcmsCIEXYZFormat
+     * 2. Already be white point adjusted for the Screen White Point.
+     *     This means that the white point now associated with this
+     *     color spec is the Screen White Point (even if the
+     *     ccc->clientWhitePt differs).
+     */
+
+    pColor = pColors_in_out + i;
+
+    if (ccc->visual->class < StaticColor &&
+           FunctionSetOfCCC(ccc) != (XPointer) &XcmsLinearRGBFunctionSet) {
+       /*
+        * GRAY !
+        */
+       return(XcmsFailure);
+    } else {
+       /* Convert from CIEXYZ to TekHVC format */
+       if (_XcmsDIConvertColors(&myCCC, pColor,
+               &myCCC.pPerScrnInfo->screenWhitePt, 1, XcmsTekHVCFormat)
+               == XcmsFailure) {
+           return(XcmsFailure);
+       }
+
+       /* check to make sure we have a valid TekHVC number */
+       if (!_XcmsTekHVC_CheckModify (pColor)) {
+           return (XcmsFailure);
+       }
+
+       /* Step 1: compute the maximum value and chroma for this hue. */
+       /*         This copy may be overkill but it preserves the pixel etc. */
+       memcpy((char *)&hvc_max, (char *)pColor, sizeof(XcmsColor));
+       if (_XcmsTekHVCQueryMaxVCRGB (&myCCC, hvc_max.spec.TekHVC.H, &hvc_max,
+               (XcmsRGBi *)NULL) == XcmsFailure) {
+           return (XcmsFailure);
+       }
+
+       /* Now check and return the appropriate value */
+       if (pColor->spec.TekHVC.C == hvc_max.spec.TekHVC.C) {
+           /* When the chroma input is equal to the maximum chroma */
+           /* merely return the value for that chroma. */
+           pColor->spec.TekHVC.V = hvc_max.spec.TekHVC.V;
+           if (!_XcmsTekHVC_CheckModify (pColor)) {
+               return (XcmsFailure);
+           }
+           retval = _XcmsDIConvertColors(&myCCC, pColor,
+                   &myCCC.pPerScrnInfo->screenWhitePt, 1, XcmsCIEXYZFormat);
+       } else if (pColor->spec.TekHVC.C > hvc_max.spec.TekHVC.C) {
+           /* When the chroma input is greater than the maximum chroma */
+           /* merely return the value and chroma for the given hue. */
+           pColor->spec.TekHVC.C = hvc_max.spec.TekHVC.C;
+           pColor->spec.TekHVC.V = hvc_max.spec.TekHVC.V;
+           return (XcmsFailure);
+       } else if (pColor->spec.TekHVC.V < hvc_max.spec.TekHVC.V) {
+           /* When the value input is less than the maximum value point */
+           /* compute the intersection of the line from 0,0 to max_V, max_C */
+           /* using the chroma input. */
+           pColor->spec.TekHVC.V = pColor->spec.TekHVC.C *
+                                   hvc_max.spec.TekHVC.V / hvc_max.spec.TekHVC.C;
+           if (pColor->spec.TekHVC.V >= hvc_max.spec.TekHVC.V) {
+               pColor->spec.TekHVC.C = hvc_max.spec.TekHVC.C;
+               pColor->spec.TekHVC.V = hvc_max.spec.TekHVC.V;
+           }
+           if (!_XcmsTekHVC_CheckModify (pColor)) {
+               return (XcmsFailure);
+           }
+           retval = _XcmsDIConvertColors(&myCCC, pColor,
+                   &myCCC.pPerScrnInfo->screenWhitePt, 1, XcmsCIEXYZFormat);
+       } else {
+           /* When the value input is greater than the maximum value point */
+           /* use HvcMaxValue to find the maximum value for the given chroma. */
+           if (pColor->format != XcmsTekHVCFormat) {
+               if (_XcmsDIConvertColors(ccc, pColor,
+                       &ccc->pPerScrnInfo->screenWhitePt, 1, XcmsCIEXYZFormat)
+                       == XcmsFailure) {
+                   return(XcmsFailure);
+               }
+           }
+           if (XcmsTekHVCQueryMaxV(&myCCC,
+                   pColor->spec.TekHVC.H,
+                   pColor->spec.TekHVC.C,
+                   pColor)
+                   == XcmsFailure) {
+               return (XcmsFailure);
+           }
+           retval = _XcmsDIConvertColors(&myCCC, pColor,
+                   &myCCC.pPerScrnInfo->screenWhitePt, 1, XcmsCIEXYZFormat);
+       }
+       if (retval != XcmsFailure && pCompressed != NULL) {
+           *(pCompressed + i) = True;
+       }
+       return(retval);
+    }
+}
diff --git a/src/xcms/HVCGcVC.c b/src/xcms/HVCGcVC.c
new file mode 100644 (file)
index 0000000..7ace5f1
--- /dev/null
@@ -0,0 +1,262 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  TekColor is a
+ * trademark of Tektronix, Inc.  The term "TekHVC" designates a particular
+ * color space that is the subject of U.S. Patent No. 4,985,853 (equivalent
+ * foreign patents pending).  Permission is hereby granted to use, copy,
+ * modify, sell, and otherwise distribute this software and its
+ * documentation for any purpose and without fee, provided that:
+ *
+ * 1. This copyright, permission, and disclaimer notice is reproduced in
+ *    all copies of this software and any modification thereof and in
+ *    supporting documentation;
+ * 2. Any color-handling application which displays TekHVC color
+ *    cooordinates identifies these as TekHVC color coordinates in any
+ *    interface that displays these coordinates and in any associated
+ *    documentation;
+ * 3. The term "TekHVC" is always used, and is only used, in association
+ *    with the mathematical derivations of the TekHVC Color Space,
+ *    including those provided in this file and any equivalent pathways and
+ *    mathematical derivations, regardless of digital (e.g., floating point
+ *    or integer) representation.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *     NAME
+ *             TekHVCGcVC.c
+ *
+ *     DESCRIPTION
+ *             Source for XcmsTekHVCClipVC() gamut
+ *             compression function.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include <math.h>
+#include "Cv.h"
+
+/*
+ *     INTERNALS
+ *             Internal defines that need NOT be exported to any package or
+ *             program using this package.
+ */
+#define MAXBISECTCOUNT 100
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsTekHVCClipVC - Return the closest value and chroma
+ *
+ *     SYNOPSIS
+ */
+/* ARGSUSED */
+Status
+XcmsTekHVCClipVC (
+    XcmsCCC ccc,
+    XcmsColor *pColors_in_out,
+    unsigned int nColors,
+    unsigned int i,
+    Bool *pCompressed)
+/*
+ *     DESCRIPTION
+ *             This routine will find the closest value and chroma
+ *             for a specific hue.  The color input is converted to
+ *             HVC format and returned as CIE XYZ format.
+ *
+ *             Since this routine works with the value within
+ *             pColor_in_out intermediate results may be returned
+ *             even though it may be invalid.
+ *
+ *     RETURNS
+ *             XcmsFailure - Failure
+ *              XcmsSuccess - Succeeded
+ *
+ */
+{
+    Status retval;
+    XcmsCCCRec myCCC;
+    XcmsColor  *pColor;
+    XcmsColor  hvc_max;
+    XcmsRGBi   rgb_max;
+    int              nCount, nMaxCount, nI, nILast;
+    XcmsFloat  Chroma, Value, bestChroma, bestValue, nT, saveDist, tmpDist;
+
+    /*
+     * Insure TekHVC installed
+     */
+    if (XcmsAddColorSpace(&XcmsTekHVCColorSpace) == XcmsFailure) {
+       return(XcmsFailure);
+    }
+
+    /* Use my own CCC */
+    memcpy ((char *)&myCCC, (char *)ccc, sizeof(XcmsCCCRec));
+    myCCC.clientWhitePt.format = XcmsUndefinedFormat;/* inherit screen white pt */
+    myCCC.gamutCompProc = (XcmsCompressionProc)NULL;/* no gamut compression func */
+
+    /*
+     * Color specification passed as input can be assumed to:
+     * 1. Be in XcmsCIEXYZFormat
+     * 2. Already be white point adjusted for the Screen White Point.
+     *     This means that the white point now associated with this
+     *     color spec is the Screen White Point (even if the
+     *     ccc->clientWhitePt differs).
+     */
+
+    pColor = pColors_in_out + i;
+
+    if (ccc->visual->class < StaticColor &&
+           FunctionSetOfCCC(ccc) != (XPointer) &XcmsLinearRGBFunctionSet) {
+       /*
+        * GRAY !
+        */
+       _XcmsDIConvertColors(ccc, pColor, &ccc->pPerScrnInfo->screenWhitePt,
+               1, XcmsTekHVCFormat);
+       pColor->spec.TekHVC.H = pColor->spec.TekHVC.C = 0.0;
+       _XcmsDIConvertColors(ccc, pColor, &ccc->pPerScrnInfo->screenWhitePt,
+               1, XcmsCIEXYZFormat);
+       if (pCompressed) {
+           *(pCompressed + i) = True;
+       }
+       return(XcmsSuccess);
+    } else {
+       /* Convert from CIEXYZ to TekHVC format */
+       if (_XcmsDIConvertColors(&myCCC, pColor,
+               &myCCC.pPerScrnInfo->screenWhitePt, 1, XcmsTekHVCFormat)
+               == XcmsFailure) {
+           return(XcmsFailure);
+       }
+
+       if (!_XcmsTekHVC_CheckModify(pColor)) {
+           return (XcmsFailure);
+       }
+
+       /* Step 1: compute the maximum value and chroma for this hue. */
+       /*         This copy may be overkill but it preserves the pixel etc. */
+       memcpy((char *)&hvc_max, (char *)pColor, sizeof(XcmsColor));
+       if (_XcmsTekHVCQueryMaxVCRGB (&myCCC, hvc_max.spec.TekHVC.H, &hvc_max,
+               &rgb_max) == XcmsFailure) {
+           return (XcmsFailure);
+       }
+
+       /* Now check and return the appropriate value */
+       if (pColor->spec.TekHVC.V == hvc_max.spec.TekHVC.V) {
+           /* When the value input is equal to the maximum value */
+           /* merely return the chroma for that value. */
+           pColor->spec.TekHVC.C = hvc_max.spec.TekHVC.C;
+           retval = _XcmsDIConvertColors(&myCCC, pColor,
+                   &myCCC.pPerScrnInfo->screenWhitePt, 1, XcmsCIEXYZFormat);
+       }
+
+       if (pColor->spec.TekHVC.V < hvc_max.spec.TekHVC.V) {
+           /* return the intersection of the perpindicular line through     */
+           /* the value and chroma given and the line from 0,0 and hvc_max. */
+           Chroma = pColor->spec.TekHVC.C;
+           Value = pColor->spec.TekHVC.V;
+           pColor->spec.TekHVC.C =
+              (Value + (hvc_max.spec.TekHVC.C / hvc_max.spec.TekHVC.V * Chroma)) /
+              ((hvc_max.spec.TekHVC.V / hvc_max.spec.TekHVC.C) +
+               (hvc_max.spec.TekHVC.C / hvc_max.spec.TekHVC.V));
+           if (pColor->spec.TekHVC.C >= hvc_max.spec.TekHVC.C) {
+               pColor->spec.TekHVC.C = hvc_max.spec.TekHVC.C;
+               pColor->spec.TekHVC.V = hvc_max.spec.TekHVC.V;
+           } else {
+               pColor->spec.TekHVC.V = pColor->spec.TekHVC.C *
+                                   hvc_max.spec.TekHVC.V / hvc_max.spec.TekHVC.C;
+           }
+           retval = _XcmsDIConvertColors(&myCCC, pColor,
+                   &myCCC.pPerScrnInfo->screenWhitePt, 1, XcmsCIEXYZFormat);
+
+           if (retval != XcmsFailure && pCompressed != NULL) {
+               *(pCompressed + i) = True;
+           }
+           return (retval);
+       }
+
+       /* return the closest point on the upper part of the hue leaf. */
+       /* must do a bisection here to compute the delta e. */
+       nMaxCount = MAXBISECTCOUNT;
+       nI =     nMaxCount / 2;
+       bestValue = Value =  pColor->spec.TekHVC.V;
+       bestChroma = Chroma = pColor->spec.TekHVC.C;
+       saveDist = (XcmsFloat) XCMS_SQRT ((double) (((Chroma - hvc_max.spec.TekHVC.C) *
+                                              (Chroma - hvc_max.spec.TekHVC.C)) +
+                                             ((Value - hvc_max.spec.TekHVC.V) *
+                                              (Value - hvc_max.spec.TekHVC.V))));
+       for (nCount = 0; nCount < nMaxCount; nCount++) {
+           nT = (XcmsFloat) nI / (XcmsFloat) nMaxCount;
+           pColor->spec.RGBi.red   = rgb_max.red * (1.0 - nT) + nT;
+           pColor->spec.RGBi.green = rgb_max.green * (1.0 - nT) + nT;
+           pColor->spec.RGBi.blue  = rgb_max.blue * (1.0 - nT) + nT;
+           pColor->format = XcmsRGBiFormat;
+
+           /* Convert from RGBi to HVC */
+           if (_XcmsConvertColorsWithWhitePt(&myCCC, pColor,
+                   &myCCC.pPerScrnInfo->screenWhitePt, 1, XcmsTekHVCFormat,
+                   (Bool *) NULL)
+                   == XcmsFailure) {
+               return (XcmsFailure);
+           }
+           if (!_XcmsTekHVC_CheckModify(pColor)) {
+               return (XcmsFailure);
+           }
+           tmpDist = (XcmsFloat) XCMS_SQRT ((double)
+                       (((Chroma - pColor->spec.TekHVC.C) *
+                         (Chroma - pColor->spec.TekHVC.C)) +
+                        ((Value - pColor->spec.TekHVC.V) *
+                         (Value - pColor->spec.TekHVC.V))));
+           nILast = nI;
+           if (tmpDist > saveDist) {
+               nI /= 2;
+           } else {
+               nI = (nMaxCount + nI) / 2;
+               saveDist = tmpDist;
+               bestValue = pColor->spec.TekHVC.V;
+               bestChroma = pColor->spec.TekHVC.C;
+           }
+           if (nI == nILast || nI == 0) {
+               break;
+           }
+
+       }
+
+       if (bestChroma >= hvc_max.spec.TekHVC.C) {
+           pColor->spec.TekHVC.C = hvc_max.spec.TekHVC.C;
+           pColor->spec.TekHVC.V = hvc_max.spec.TekHVC.V;
+       } else {
+           pColor->spec.TekHVC.C = bestChroma;
+           pColor->spec.TekHVC.V = bestValue;
+       }
+       if (!_XcmsTekHVC_CheckModify(pColor)) {
+           return (XcmsFailure);
+       }
+       retval = _XcmsDIConvertColors(&myCCC, pColor,
+               &myCCC.pPerScrnInfo->screenWhitePt, 1, XcmsCIEXYZFormat);
+
+       if (retval != XcmsFailure && pCompressed != NULL) {
+           *(pCompressed + i) = True;
+       }
+       return(retval);
+    }
+}
diff --git a/src/xcms/HVCMnV.c b/src/xcms/HVCMnV.c
new file mode 100644 (file)
index 0000000..10a9f85
--- /dev/null
@@ -0,0 +1,163 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  TekColor is a
+ * trademark of Tektronix, Inc.  The term "TekHVC" designates a particular
+ * color space that is the subject of U.S. Patent No. 4,985,853 (equivalent
+ * foreign patents pending).  Permission is hereby granted to use, copy,
+ * modify, sell, and otherwise distribute this software and its
+ * documentation for any purpose and without fee, provided that:
+ *
+ * 1. This copyright, permission, and disclaimer notice is reproduced in
+ *    all copies of this software and any modification thereof and in
+ *    supporting documentation;
+ * 2. Any color-handling application which displays TekHVC color
+ *    cooordinates identifies these as TekHVC color coordinates in any
+ *    interface that displays these coordinates and in any associated
+ *    documentation;
+ * 3. The term "TekHVC" is always used, and is only used, in association
+ *    with the mathematical derivations of the TekHVC Color Space,
+ *    including those provided in this file and any equivalent pathways and
+ *    mathematical derivations, regardless of digital (e.g., floating point
+ *    or integer) representation.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *     NAME
+ *             TekHVCMnV.c
+ *
+ *     DESCRIPTION
+ *             Source for XcmsTekHVCQueryMinV gamut boundary querying routine.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+/*
+ *     DEFINES
+ */
+#define EPS        0.001
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsTekHVCQueryMinV - Compute minimum value for hue and chroma
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsTekHVCQueryMinV (
+    XcmsCCC ccc,
+    XcmsFloat hue,
+    XcmsFloat chroma,
+    XcmsColor *pColor_return)
+
+/*
+ *     DESCRIPTION
+ *             Return the minimum value for a specific hue, and the
+ *             corresponding chroma.  The input color specification
+ *             may be in any format, however output is in XcmsTekHVCFormat.
+ *
+ *             Since this routine works with the value within
+ *             pColor_return intermediate results may be returned
+ *             even though it may be invalid.
+ *
+ *     ASSUMPTIONS
+ *             This routine assumes that the white point associated with
+ *             the color specification is the Screen White Point.  The
+ *             Screen White Point will also be associated with the
+ *             returned color specification.
+ *
+ *     RETURNS
+ *             XcmsFailure - Failure
+ *             XcmsSuccess - Succeeded with no modifications
+ *
+ */
+{
+    XcmsCCCRec myCCC;
+    XcmsColor tmp;
+    XcmsColor max_vc;
+
+    /*
+     * Check Arguments
+     */
+    if (ccc == NULL || pColor_return == NULL) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Insure TekHVC installed
+     */
+    if (XcmsAddColorSpace(&XcmsTekHVCColorSpace) == XcmsFailure) {
+       return(XcmsFailure);
+    }
+
+    /* Use my own CCC */
+    memcpy ((char *)&myCCC, (char *)ccc, sizeof(XcmsCCCRec));
+    myCCC.clientWhitePt.format = XcmsUndefinedFormat;/* inherit screen white pt */
+    myCCC.gamutCompProc = (XcmsCompressionProc)NULL;/* no gamut comp func */
+
+    tmp.spec.TekHVC.H = hue;
+    tmp.spec.TekHVC.V = 100.0;
+    tmp.spec.TekHVC.C = chroma;
+    tmp.pixel = pColor_return->pixel;
+    tmp.format = XcmsTekHVCFormat;
+
+
+    /* Check for a valid HVC */
+    if (!_XcmsTekHVC_CheckModify (&tmp)) {
+       return(XcmsFailure);
+    }
+
+    /* Step 1: compute the maximum value and chroma for this hue. */
+    /*         This copy may be overkill but it preserves the pixel etc. */
+    memcpy((char *)&max_vc, (char *)&tmp, sizeof(XcmsColor));
+    if (_XcmsTekHVCQueryMaxVCRGB (&myCCC, max_vc.spec.TekHVC.H, &max_vc,
+           (XcmsRGBi *)NULL) == XcmsFailure) {
+       return(XcmsFailure);
+    }
+
+    /* Step 2: find the intersection with the maximum hvc and chroma line. */
+    if (tmp.spec.TekHVC.C > max_vc.spec.TekHVC.C + EPS) {
+       /* If the chroma is to large then return maximum hvc. */
+       tmp.spec.TekHVC.C = max_vc.spec.TekHVC.C;
+       tmp.spec.TekHVC.V = max_vc.spec.TekHVC.V;
+    } else {
+       tmp.spec.TekHVC.V = tmp.spec.TekHVC.C *
+               max_vc.spec.TekHVC.V / max_vc.spec.TekHVC.C;
+       if (tmp.spec.TekHVC.V > max_vc.spec.TekHVC.V) {
+           tmp.spec.TekHVC.V = max_vc.spec.TekHVC.V;
+       } else if (tmp.spec.TekHVC.V < 0.0) {
+           tmp.spec.TekHVC.V = tmp.spec.TekHVC.C = 0.0;
+       }
+    }
+    if (_XcmsTekHVC_CheckModify (&tmp)) {
+       memcpy ((char *) pColor_return, (char *) &tmp, sizeof (XcmsColor));
+       return(XcmsSuccess);
+    } else {
+       return(XcmsFailure);
+    }
+}
diff --git a/src/xcms/HVCMxC.c b/src/xcms/HVCMxC.c
new file mode 100644 (file)
index 0000000..074844c
--- /dev/null
@@ -0,0 +1,243 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  TekColor is a
+ * trademark of Tektronix, Inc.  The term "TekHVC" designates a particular
+ * color space that is the subject of U.S. Patent No. 4,985,853 (equivalent
+ * foreign patents pending).  Permission is hereby granted to use, copy,
+ * modify, sell, and otherwise distribute this software and its
+ * documentation for any purpose and without fee, provided that:
+ *
+ * 1. This copyright, permission, and disclaimer notice is reproduced in
+ *    all copies of this software and any modification thereof and in
+ *    supporting documentation;
+ * 2. Any color-handling application which displays TekHVC color
+ *    cooordinates identifies these as TekHVC color coordinates in any
+ *    interface that displays these coordinates and in any associated
+ *    documentation;
+ * 3. The term "TekHVC" is always used, and is only used, in association
+ *    with the mathematical derivations of the TekHVC Color Space,
+ *    including those provided in this file and any equivalent pathways and
+ *    mathematical derivations, regardless of digital (e.g., floating point
+ *    or integer) representation.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *     NAME
+ *             TekHVCMxC.c
+ *
+ *     DESCRIPTION
+ *             Source for the XcmsTekHVCQueryMaxC() gamut boudary
+ *             querying routine.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include <math.h>
+#include "Cv.h"
+
+/*
+ *     DEFINES
+ */
+#define MAXBISECTCOUNT 100
+#define EPS            0.001
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsTekHVCQueryMaxC - Compute the maximum chroma for a hue and value
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsTekHVCQueryMaxC(
+    XcmsCCC ccc,
+    XcmsFloat hue,
+    XcmsFloat value,
+    XcmsColor *pColor_return)
+/*
+ *     DESCRIPTION
+ *             Return the maximum chroma for a specific hue and value.
+ *             The returned format is in XcmsTekHVCFormat.
+ *
+ *
+ *     ASSUMPTIONS
+ *             This routine assumes that the white point associated with
+ *             the color specification is the Screen White Point.  The
+ *             Screen White Point will also be associated with the
+ *             returned color specification.
+ *
+ *     RETURNS
+ *             XcmsFailure - Failure
+ *              XcmsSuccess - Succeeded
+ *
+ */
+{
+    XcmsCCCRec myCCC;
+    XcmsColor  tmp;
+    XcmsColor  max_vc;
+    XcmsRGBi   rgb_saved;
+    int nCount, nMaxCount;
+    XcmsFloat nValue, savedValue, lastValue, lastChroma, prevValue;
+    XcmsFloat maxDist, nT, rFactor;
+    XcmsFloat ftmp1, ftmp2;
+
+    /*
+     * Check Arguments
+     */
+    if (ccc == NULL || pColor_return == NULL) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Insure TekHVC installed
+     */
+    if (XcmsAddColorSpace(&XcmsTekHVCColorSpace) == XcmsFailure) {
+       return(XcmsFailure);
+    }
+
+    /* Use my own CCC */
+    memcpy ((char *)&myCCC, (char *)ccc, sizeof(XcmsCCCRec));
+    myCCC.clientWhitePt.format = XcmsUndefinedFormat; /* inherit screen white Pt */
+    myCCC.gamutCompProc = (XcmsCompressionProc)NULL;/* no gamut comp func */
+
+    tmp.spec.TekHVC.H = hue;
+    tmp.spec.TekHVC.V = value;
+    tmp.spec.TekHVC.C = 100.0;
+    tmp.pixel = pColor_return->pixel;
+    tmp.format = XcmsTekHVCFormat;
+
+    /* check to make sure we have a valid TekHVC number */
+    if (!_XcmsTekHVC_CheckModify(&tmp)) {
+       return(XcmsFailure);
+    }
+
+    /* Step 1: compute the maximum value and chroma for this hue. */
+    memcpy((char *)&max_vc, (char *)&tmp, sizeof(XcmsColor));
+    if (_XcmsTekHVCQueryMaxVCRGB(&myCCC, hue, &max_vc, &rgb_saved)
+           == XcmsFailure) {
+       return(XcmsFailure);
+    }
+
+    /* Step 2: If the value is less than the value for the maximum */
+    /*         value, chroma point then the chroma is on the line  */
+    /*         from max_vc to 0,0. */
+    if (value <= max_vc.spec.TekHVC.V) {
+       tmp.spec.TekHVC.C = value
+                             * max_vc.spec.TekHVC.C / max_vc.spec.TekHVC.V;
+       if (_XcmsTekHVC_CheckModify (&tmp)) {
+           memcpy((char *)pColor_return, (char *)&tmp, sizeof(XcmsColor));
+           return(XcmsSuccess);
+       } else {
+           return(XcmsFailure);
+       }
+    } else {
+       /* must do a bisection here to compute the maximum chroma */
+       /* save the structure input so that any elements that */
+       /* are not touched are recopied later in the routine. */
+       nValue = savedValue = value;
+       lastChroma = -1.0;
+       lastValue = -1.0;
+       nMaxCount = MAXBISECTCOUNT;
+       maxDist = 100.0 - max_vc.spec.TekHVC.V;
+       rFactor = 1.0;
+
+       for (nCount = 0; nCount < nMaxCount; nCount++) {
+           prevValue =  lastValue;
+           lastValue =  tmp.spec.TekHVC.V;
+           lastChroma = tmp.spec.TekHVC.C;
+           nT = (nValue - max_vc.spec.TekHVC.V) / maxDist * rFactor;
+           tmp.spec.RGBi.red = rgb_saved.red * (1.0 - nT) + nT;
+           tmp.spec.RGBi.green = rgb_saved.green * (1.0 - nT) + nT;
+           tmp.spec.RGBi.blue  = rgb_saved.blue * (1.0 - nT) + nT;
+           tmp.format = XcmsRGBiFormat;
+
+           /* convert from RGB to HVC */
+           if (_XcmsConvertColorsWithWhitePt(&myCCC, &tmp,
+                   &myCCC.pPerScrnInfo->screenWhitePt, 1, XcmsTekHVCFormat,
+                   (Bool *) NULL) == XcmsFailure) {
+               return(XcmsFailure);
+           }
+
+           /* Now check the return against what is expected */
+           if (tmp.spec.TekHVC.V <= savedValue + EPS &&
+               tmp.spec.TekHVC.V >= savedValue - EPS) {
+               /* make sure to return the input hue */
+               tmp.spec.TekHVC.H = hue;
+               if (_XcmsTekHVC_CheckModify (&tmp)) {
+                   memcpy((char *)pColor_return, (char *)&tmp, sizeof(XcmsColor));
+                   return(XcmsSuccess);
+               } else {
+                   return(XcmsFailure);
+               }
+           }
+           nValue += savedValue - tmp.spec.TekHVC.V;
+           if (nValue < max_vc.spec.TekHVC.V) {
+               nValue = max_vc.spec.TekHVC.V;
+               rFactor *= 0.5;  /* selective relaxation employed */
+           } else if (nValue > 100.0) {
+               /* make sure to return the input hue */
+               tmp.spec.TekHVC.H = hue;
+               /* avoid using fabs */
+               ftmp1 = lastValue - savedValue;
+               if (ftmp1 < 0.0)
+                   ftmp1 = -ftmp1;
+               ftmp2 = tmp.spec.TekHVC.V - savedValue;
+               if (ftmp2 < 0.0)
+                   ftmp2 = -ftmp2;
+               if (ftmp1 < ftmp2) {
+                   tmp.spec.TekHVC.V = lastValue;
+                   tmp.spec.TekHVC.C = lastChroma;
+               }
+               if (_XcmsTekHVC_CheckModify (&tmp)) {
+                   memcpy((char *)pColor_return, (char *)&tmp, sizeof(XcmsColor));
+                   return(XcmsSuccess);
+               } else {
+                   return(XcmsFailure);
+               }
+           } else if (tmp.spec.TekHVC.V <= prevValue + EPS &&
+                      tmp.spec.TekHVC.V >= prevValue - EPS) {
+               rFactor *= 0.5;  /* selective relaxation employed */
+           }
+       }
+       if (nCount >= nMaxCount) {
+           /* avoid using fabs */
+           ftmp1 = lastValue - savedValue;
+           if (ftmp1 < 0.0)
+               ftmp1 = -ftmp1;
+           ftmp2 = tmp.spec.TekHVC.V - savedValue;
+           if (ftmp2 < 0.0)
+               ftmp2 = -ftmp2;
+           if (ftmp1 < ftmp2) {
+               tmp.spec.TekHVC.V = lastValue;
+               tmp.spec.TekHVC.C = lastChroma;
+           }
+       }
+    }
+    /* make sure to return the input hue */
+    tmp.spec.TekHVC.H = hue;
+    memcpy((char *)pColor_return, (char *)&tmp, sizeof(XcmsColor));
+    return(XcmsSuccess);
+}
diff --git a/src/xcms/HVCMxV.c b/src/xcms/HVCMxV.c
new file mode 100644 (file)
index 0000000..d5ef94e
--- /dev/null
@@ -0,0 +1,247 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  TekColor is a
+ * trademark of Tektronix, Inc.  The term "TekHVC" designates a particular
+ * color space that is the subject of U.S. Patent No. 4,985,853 (equivalent
+ * foreign patents pending).  Permission is hereby granted to use, copy,
+ * modify, sell, and otherwise distribute this software and its
+ * documentation for any purpose and without fee, provided that:
+ *
+ * 1. This copyright, permission, and disclaimer notice is reproduced in
+ *    all copies of this software and any modification thereof and in
+ *    supporting documentation;
+ * 2. Any color-handling application which displays TekHVC color
+ *    cooordinates identifies these as TekHVC color coordinates in any
+ *    interface that displays these coordinates and in any associated
+ *    documentation;
+ * 3. The term "TekHVC" is always used, and is only used, in association
+ *    with the mathematical derivations of the TekHVC Color Space,
+ *    including those provided in this file and any equivalent pathways and
+ *    mathematical derivations, regardless of digital (e.g., floating point
+ *    or integer) representation.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *     NAME
+ *             TekHVCMxV.c
+ *
+ *     DESCRIPTION
+ *             Source for the XcmsTekHVCQueryMaxV() gamut boundary
+ *             querying routine.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include <math.h>
+#include "Cv.h"
+
+/*
+ *     DEFINES
+ */
+#define MAXBISECTCOUNT 100
+#define EPS        0.001
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsTekHVCQueryMaxV - Compute maximum value for a hue and chroma
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsTekHVCQueryMaxV(
+    XcmsCCC ccc,
+    XcmsFloat hue,
+    XcmsFloat chroma,
+    XcmsColor *pColor_return)
+/*
+ *     DESCRIPTION
+ *             Return the maximum value for a specified hue and chroma.
+ *
+ *     ASSUMPTIONS
+ *             This routine assumes that the white point associated with
+ *             the color specification is the Screen White Point.  The
+ *             Screen White Point will also be associated with the
+ *             returned color specification.
+ *
+ *     RETURNS
+ *             XcmsFailure - Failure
+ *              XcmsSuccess - Succeeded with no modifications
+ *
+ */
+{
+    XcmsCCCRec myCCC;
+    XcmsColor   tmp;
+    XcmsColor   max_vc;
+    XcmsRGBi    rgb_saved;
+    int         nCount, nMaxCount;
+    XcmsFloat   nT, nChroma, savedChroma, lastValue, lastChroma, prevChroma;
+    XcmsFloat   rFactor;
+    XcmsFloat  ftmp1, ftmp2;
+
+    /*
+     * Check Arguments
+     */
+    if (ccc == NULL || pColor_return == NULL) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Insure TekHVC installed
+     */
+    if (XcmsAddColorSpace(&XcmsTekHVCColorSpace) == XcmsFailure) {
+       return(XcmsFailure);
+    }
+
+    /* setup the CCC to use for the conversions. */
+    memcpy ((char *) &myCCC, (char *) ccc, sizeof(XcmsCCCRec));
+    myCCC.clientWhitePt.format = XcmsUndefinedFormat;
+    myCCC.gamutCompProc = (XcmsCompressionProc) NULL;
+
+    tmp.spec.TekHVC.H = hue;
+    tmp.spec.TekHVC.V = 0.0;
+    tmp.spec.TekHVC.C = chroma;
+    tmp.pixel = pColor_return->pixel;
+    tmp.format = XcmsTekHVCFormat;
+
+    if (!_XcmsTekHVC_CheckModify (&tmp)) {
+       return(XcmsFailure);
+    }
+
+    /* Step 1: compute the maximum value and chroma for this hue. */
+    /*         This copy may be overkill but it preserves the pixel etc. */
+    memcpy((char *)&max_vc, (char *)&tmp, sizeof(XcmsColor));
+    hue = max_vc.spec.TekHVC.H;
+    if (_XcmsTekHVCQueryMaxVCRGB(&myCCC, max_vc.spec.TekHVC.H, &max_vc, &rgb_saved)
+           == XcmsFailure) {
+       return(XcmsFailure);
+    }
+
+    if (max_vc.spec.TekHVC.C < tmp.spec.TekHVC.C) {
+       /*
+        *  If the chroma is greater than the chroma for the
+        *  maximum value/chroma point then the value is the
+        *  the value for the maximum value, chroma point.
+        *  This is an error but it I return the best approximation I can.
+         *  Thus the inconsistency.
+        */
+       tmp.spec.TekHVC.C = max_vc.spec.TekHVC.C;
+       tmp.spec.TekHVC.V = max_vc.spec.TekHVC.V;
+       memcpy ((char *) pColor_return, (char *) &tmp, sizeof (XcmsColor));
+       return(XcmsSuccess);
+    } else if (max_vc.spec.TekHVC.C == tmp.spec.TekHVC.C) {
+       /*
+        *  If the chroma is equal to the chroma for the
+        *  maximum value/chroma point then the value is the
+        *  the value for the maximum value, chroma point.
+        */
+       tmp.spec.TekHVC.V = max_vc.spec.TekHVC.V;
+       memcpy ((char *) pColor_return, (char *) &tmp, sizeof (XcmsColor));
+       return(XcmsSuccess);
+    } else {
+       /* must do a bisection here to compute the maximum value */
+       /* save the structure input so that any elements that */
+       /* are not touched are recopied later in the routine. */
+       nChroma = savedChroma = tmp.spec.TekHVC.C;
+       tmp.spec.TekHVC.C = max_vc.spec.TekHVC.C;
+       tmp.spec.TekHVC.V = max_vc.spec.TekHVC.V;
+       lastChroma = -1.0;
+       lastValue = -1.0;
+       nMaxCount = MAXBISECTCOUNT;
+       rFactor = 1.0;
+
+       for (nCount = 0; nCount < nMaxCount; nCount++) {
+           prevChroma = lastChroma;
+           lastValue =  tmp.spec.TekHVC.V;
+           lastChroma = tmp.spec.TekHVC.C;
+           nT = (1.0 - (nChroma / max_vc.spec.TekHVC.C)) * rFactor;
+           tmp.spec.RGBi.red   = rgb_saved.red * (1.0 - nT) + nT;
+           tmp.spec.RGBi.green = rgb_saved.green * (1.0 - nT) + nT;
+           tmp.spec.RGBi.blue  = rgb_saved.blue * (1.0 - nT) + nT;
+           tmp.format = XcmsRGBiFormat;
+
+           /* convert from RGB to HVC */
+           if (_XcmsConvertColorsWithWhitePt(&myCCC, &tmp,
+                   &myCCC.pPerScrnInfo->screenWhitePt, 1, XcmsTekHVCFormat,
+                   (Bool *) NULL) == XcmsFailure) {
+               return(XcmsFailure);
+           }
+
+           /* Now check the return against what is expected */
+           if (tmp.spec.TekHVC.C <= savedChroma + EPS &&
+               tmp.spec.TekHVC.C >= savedChroma - EPS) {
+               tmp.spec.TekHVC.H = hue;  /* use the saved hue */
+               memcpy ((char *) pColor_return, (char *) &tmp, sizeof (XcmsColor));
+               return(XcmsSuccess);
+           }
+           nChroma += savedChroma - tmp.spec.TekHVC.C;
+           if (nChroma > max_vc.spec.TekHVC.C) {
+               nChroma = max_vc.spec.TekHVC.C;
+               rFactor *= 0.5;  /* selective relaxation employed */
+           } else if (nChroma < 0.0) {
+               /* avoid using fabs */
+               ftmp1 = lastChroma - savedChroma;
+               if (ftmp1 < 0.0)
+                   ftmp1 = -ftmp1;
+               ftmp2 = tmp.spec.TekHVC.C - savedChroma;
+               if (ftmp2 < 0.0)
+                   ftmp2 = -ftmp2;
+               if (ftmp1 < ftmp2) {
+                   tmp.spec.TekHVC.V = lastValue;
+                   tmp.spec.TekHVC.C = lastChroma;
+               }
+               /* make sure to return the input hue */
+               tmp.spec.TekHVC.H = hue;
+               if (!_XcmsTekHVC_CheckModify(&tmp)) {
+                   return(XcmsFailure);
+               }
+               memcpy ((char *) pColor_return, (char *) &tmp, sizeof (XcmsColor));
+               return(XcmsSuccess);
+           } else if (tmp.spec.TekHVC.C <= prevChroma + EPS &&
+                      tmp.spec.TekHVC.C >= prevChroma - EPS) {
+               rFactor *= 0.5;  /* selective relaxation employed */
+           }
+       }
+       if (nCount >= nMaxCount) {
+           /* avoid using fabs */
+           ftmp1 = lastChroma - savedChroma;
+           if (ftmp1 < 0.0)
+               ftmp1 = -ftmp1;
+           ftmp2 = tmp.spec.TekHVC.C - savedChroma;
+           if (ftmp2 < 0.0)
+               ftmp2 = -ftmp2;
+           if (ftmp1 < ftmp2) {
+                   tmp.spec.TekHVC.V = lastValue;
+                   tmp.spec.TekHVC.C = lastChroma;
+           }
+       }
+    }
+
+    /* make sure to return the input hue */
+    tmp.spec.TekHVC.H = hue;
+    memcpy ((char *) pColor_return, (char *) &tmp, sizeof (XcmsColor));
+    return(XcmsSuccess);
+}
diff --git a/src/xcms/HVCMxVC.c b/src/xcms/HVCMxVC.c
new file mode 100644 (file)
index 0000000..c7e0878
--- /dev/null
@@ -0,0 +1,235 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  TekColor is a
+ * trademark of Tektronix, Inc.  The term "TekHVC" designates a particular
+ * color space that is the subject of U.S. Patent No. 4,985,853 (equivalent
+ * foreign patents pending).  Permission is hereby granted to use, copy,
+ * modify, sell, and otherwise distribute this software and its
+ * documentation for any purpose and without fee, provided that:
+ *
+ * 1. This copyright, permission, and disclaimer notice is reproduced in
+ *    all copies of this software and any modification thereof and in
+ *    supporting documentation;
+ * 2. Any color-handling application which displays TekHVC color
+ *    cooordinates identifies these as TekHVC color coordinates in any
+ *    interface that displays these coordinates and in any associated
+ *    documentation;
+ * 3. The term "TekHVC" is always used, and is only used, in association
+ *    with the mathematical derivations of the TekHVC Color Space,
+ *    including those provided in this file and any equivalent pathways and
+ *    mathematical derivations, regardless of digital (e.g., floating point
+ *    or integer) representation.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *     NAME
+ *             TekHVCMxVC.c
+ *
+ *     DESCRIPTION
+ *             Source for the XcmsTekHVCQueryMaxVC() gamut boundary
+ *             querying routine.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+/*
+ *     DEFINES
+ */
+#define MIN(x,y) ((x) > (y) ? (y) : (x))
+#define MIN3(x,y,z) ((x) > (MIN((y), (z))) ? (MIN((y), (z))) : (x))
+#define MAX(x,y) ((x) > (y) ? (x) : (y))
+#define MAX3(x,y,z) ((x) > (MAX((y), (z))) ? (x) : (MAX((y), (z))))
+#define START_V            40.0
+#define START_C            120.0
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      API PRIVATE ROUTINES                           *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             _XcmsTekHVCQueryMaxVCRGB - Compute maximum value/chroma.
+ *
+ *     SYNOPSIS
+ */
+Status
+_XcmsTekHVCQueryMaxVCRGB(
+    XcmsCCC    ccc,
+    XcmsFloat  hue,
+    XcmsColor   *pColor_return,
+    XcmsRGBi    *pRGB_return)
+
+/*
+ *     DESCRIPTION
+ *             Return the maximum chroma for a specified hue, and the
+ *             corresponding value.  This is computed by a binary search of
+ *             all possible chromas.  An assumption is made that there are
+ *             no local maxima.  Use the unrounded Max Chroma because
+ *             the difference check can be small.
+ *
+ *             NOTE:  No local CCC is used because this is a private
+ *                    routine and all routines that call it are expected
+ *                    to behave properly, i.e. send a local CCC with
+ *                    no white adjust function and no gamut compression
+ *                    function.
+ *
+ *             This routine only accepts hue as input and outputs
+ *             HVC's and RGBi's.
+ *
+ *     RETURNS
+ *             XcmsFailure - Failure
+ *             XCMS_SUCCUSS - Succeeded
+ *
+ */
+{
+    XcmsFloat nSmall, nLarge;
+    XcmsColor tmp;
+
+    tmp.format = XcmsTekHVCFormat;
+    tmp.spec.TekHVC.H = hue;
+    /*  Use some unreachable color on the given hue */
+    tmp.spec.TekHVC.V = START_V;
+    tmp.spec.TekHVC.C = START_C;
+
+
+    /*
+     * Convert from HVC to RGB
+     *
+     * Note that the CIEXYZ to RGBi conversion routine must stuff the
+     * out of bounds RGBi values in tmp when the ccc->gamutCompProc
+     * is NULL.
+     */
+    if ((_XcmsConvertColorsWithWhitePt(ccc, &tmp,
+           &ccc->pPerScrnInfo->screenWhitePt, 1, XcmsRGBiFormat, (Bool *) NULL)
+           == XcmsFailure) && tmp.format != XcmsRGBiFormat) {
+       return (XcmsFailure);
+    }
+
+    /* Now pick the smallest RGB */
+    nSmall = MIN3(tmp.spec.RGBi.red,
+                 tmp.spec.RGBi.green,
+                 tmp.spec.RGBi.blue);
+    /* Make the smallest RGB equal to zero */
+    tmp.spec.RGBi.red   -= nSmall;
+    tmp.spec.RGBi.green -= nSmall;
+    tmp.spec.RGBi.blue  -= nSmall;
+
+    /* Now pick the largest RGB */
+    nLarge = MAX3(tmp.spec.RGBi.red,
+                 tmp.spec.RGBi.green,
+                 tmp.spec.RGBi.blue);
+    /* Scale the RGB values based on the largest one */
+    tmp.spec.RGBi.red   /= nLarge;
+    tmp.spec.RGBi.green /= nLarge;
+    tmp.spec.RGBi.blue  /= nLarge;
+    tmp.format = XcmsRGBiFormat;
+
+    /* If the calling routine wants RGB value give them the ones used. */
+    if (pRGB_return) {
+       pRGB_return->red   = tmp.spec.RGBi.red;
+       pRGB_return->green = tmp.spec.RGBi.green;
+       pRGB_return->blue  = tmp.spec.RGBi.blue;
+    }
+
+    /* Convert from RGBi to HVC */
+    if (_XcmsConvertColorsWithWhitePt(ccc, &tmp,
+           &ccc->pPerScrnInfo->screenWhitePt, 1, XcmsTekHVCFormat, (Bool *) NULL)
+           == XcmsFailure) {
+       return (XcmsFailure);
+    }
+
+    /* make sure to return the input hue */
+    tmp.spec.TekHVC.H = hue;
+    memcpy((char *)pColor_return, (char *)&tmp, sizeof(XcmsColor));
+    return (XcmsSuccess);
+}
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsTekHVCQueryMaxVC - Compute maximum value and chroma.
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsTekHVCQueryMaxVC (
+    XcmsCCC ccc,
+    XcmsFloat hue,
+    XcmsColor *pColor_return)
+
+/*
+ *     DESCRIPTION
+ *             Return the maximum chroma for the specified hue, and the
+ *             corresponding value.
+ *
+ *     ASSUMPTIONS
+ *             This routine assumes that the white point associated with
+ *             the color specification is the Screen White Point.  The
+ *             Screen White Point will also be associated with the
+ *             returned color specification.
+ *
+ *     RETURNS
+ *             XcmsFailure - Failure
+ *             XcmsSuccess - Succeeded
+ *
+ */
+{
+    XcmsCCCRec myCCC;
+
+    /*
+     * Check Arguments
+     */
+    if (ccc == NULL || pColor_return == NULL) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Insure TekHVC installed
+     */
+    if (XcmsAddColorSpace(&XcmsTekHVCColorSpace) == XcmsFailure) {
+       return(XcmsFailure);
+    }
+
+    /* Use my own CCC */
+    memcpy ((char *)&myCCC, (char *)ccc, sizeof(XcmsCCCRec));
+    myCCC.clientWhitePt.format = XcmsUndefinedFormat;
+    myCCC.gamutCompProc = (XcmsCompressionProc)NULL;
+
+    while (hue < 0.0) {
+       hue += 360.0;
+    }
+    while (hue >= 360.0) {
+       hue -= 360.0;
+    }
+
+    return(_XcmsTekHVCQueryMaxVCRGB (&myCCC, hue, pColor_return,
+           (XcmsRGBi *)NULL));
+}
diff --git a/src/xcms/HVCMxVs.c b/src/xcms/HVCMxVs.c
new file mode 100644 (file)
index 0000000..540e5c2
--- /dev/null
@@ -0,0 +1,161 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  TekColor is a
+ * trademark of Tektronix, Inc.  The term "TekHVC" designates a particular
+ * color space that is the subject of U.S. Patent No. 4,985,853 (equivalent
+ * foreign patents pending).  Permission is hereby granted to use, copy,
+ * modify, sell, and otherwise distribute this software and its
+ * documentation for any purpose and without fee, provided that:
+ *
+ * 1. This copyright, permission, and disclaimer notice is reproduced in
+ *    all copies of this software and any modification thereof and in
+ *    supporting documentation;
+ * 2. Any color-handling application which displays TekHVC color
+ *    cooordinates identifies these as TekHVC color coordinates in any
+ *    interface that displays these coordinates and in any associated
+ *    documentation;
+ * 3. The term "TekHVC" is always used, and is only used, in association
+ *    with the mathematical derivations of the TekHVC Color Space,
+ *    including those provided in this file and any equivalent pathways and
+ *    mathematical derivations, regardless of digital (e.g., floating point
+ *    or integer) representation.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *     NAME
+ *             TekHVCMxVs.c
+ *
+ *     DESCRIPTION
+ *             Source for the XcmsTekHVCQueryMaxVSamples() gamut boundary
+ *             querying routine.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsTekHVCQueryMaxVSamples - Compute a set of value/chroma
+ *                                             pairs.
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsTekHVCQueryMaxVSamples(
+    XcmsCCC ccc,
+    XcmsFloat hue,
+    XcmsColor *pColor_in_out,
+    unsigned int nSamples)
+
+/*
+ *     DESCRIPTION
+ *             Return a set of values and chromas for the input Hue.
+ *             This routine will take any color as input.
+ *             It returns TekHVC colors.
+ *
+ *             Since this routine works with the value within
+ *             pColor_in_out intermediate results may be returned
+ *             even though it may be invalid.
+ *
+ *     ASSUMPTIONS
+ *             This routine assumes that the white point associated with
+ *             the color specification is the Screen White Point.  The
+ *             Screen White Point will also be associated with the
+ *             returned color specification.
+ *
+ *     RETURNS
+ *             XcmsFailure - Failure
+ *             XcmsSuccess - Succeeded
+ *
+ */
+{
+    XcmsCCCRec myCCC;
+    XcmsColor *pHVC;
+    XcmsRGBi rgb_saved;
+    unsigned short nI;
+    XcmsFloat nT;
+
+    /*
+     * Check Arguments
+     */
+    if (ccc == NULL || pColor_in_out == NULL || nSamples == 0) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Insure TekHVC installed
+     */
+    if (XcmsAddColorSpace(&XcmsTekHVCColorSpace) == XcmsFailure) {
+       return(XcmsFailure);
+    }
+
+    /* setup the CCC to use for the conversions. */
+    memcpy ((char *) &myCCC, (char *) ccc, sizeof(XcmsCCCRec));
+    myCCC.clientWhitePt.format = XcmsUndefinedFormat;
+    myCCC.gamutCompProc = (XcmsCompressionProc) NULL;
+
+    /* Step 1: compute the maximum value and chroma for this hue. */
+
+
+    /* save the Hue for use later. */
+    while (hue < 0.0) {
+       hue += 360.0;
+    }
+    while (hue > 360.0) {
+       hue -= 360.0;
+    }
+    pColor_in_out->spec.TekHVC.H = hue;
+    pColor_in_out->format = XcmsTekHVCFormat;
+
+    /* Get the maximum value and chroma point for this hue */
+    if (_XcmsTekHVCQueryMaxVCRGB(&myCCC, pColor_in_out->spec.TekHVC.H,
+           pColor_in_out, (XcmsRGBi *)&rgb_saved) == XcmsFailure) {
+       return (XcmsFailure);
+    }
+
+    /* Step 2:  Convert each of the RGBi's to HVC's */
+    pHVC = pColor_in_out;
+    for (nI = 0; nI < nSamples; nI++, pHVC++) {
+       nT = (XcmsFloat) nI / (XcmsFloat) nSamples;
+       pHVC->spec.RGBi.red   = rgb_saved.red * (1.0 - nT) + nT;
+       pHVC->spec.RGBi.green = rgb_saved.green * (1.0 - nT) + nT;
+       pHVC->spec.RGBi.blue  = rgb_saved.blue * (1.0 - nT) + nT;
+       pHVC->format          = XcmsRGBiFormat;
+       pHVC->pixel           = pColor_in_out->pixel;
+       /* convert from RGB to HVC */
+       if (_XcmsConvertColorsWithWhitePt(&myCCC, pHVC,
+               &myCCC.pPerScrnInfo->screenWhitePt, 1, XcmsTekHVCFormat,
+               (Bool *) NULL) == XcmsFailure) {
+           return(XcmsFailure);
+       }
+
+       /* make sure to return the input hue */
+       pHVC->spec.TekHVC.H = hue;
+    }
+
+    return(XcmsSuccess);
+}
diff --git a/src/xcms/HVCWpAj.c b/src/xcms/HVCWpAj.c
new file mode 100644 (file)
index 0000000..dcefe75
--- /dev/null
@@ -0,0 +1,114 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  TekColor is a
+ * trademark of Tektronix, Inc.  The term "TekHVC" designates a particular
+ * color space that is the subject of U.S. Patent No. 4,985,853 (equivalent
+ * foreign patents pending).  Permission is hereby granted to use, copy,
+ * modify, sell, and otherwise distribute this software and its
+ * documentation for any purpose and without fee, provided that:
+ *
+ * 1. This copyright, permission, and disclaimer notice is reproduced in
+ *    all copies of this software and any modification thereof and in
+ *    supporting documentation;
+ * 2. Any color-handling application which displays TekHVC color
+ *    cooordinates identifies these as TekHVC color coordinates in any
+ *    interface that displays these coordinates and in any associated
+ *    documentation;
+ * 3. The term "TekHVC" is always used, and is only used, in association
+ *    with the mathematical derivations of the TekHVC Color Space,
+ *    including those provided in this file and any equivalent pathways and
+ *    mathematical derivations, regardless of digital (e.g., floating point
+ *    or integer) representation.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *     DESCRIPTION
+ *             TekHVCWpAj.c
+ *
+ *     DESCRIPTION
+ *             This file contains routine(s) that support white point
+ *             adjustment of color specifications in the TekHVC color
+ *             space.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsTekHVCWhiteShiftColors
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsTekHVCWhiteShiftColors(
+    XcmsCCC ccc,
+    XcmsColor *pWhitePtFrom,
+    XcmsColor *pWhitePtTo,
+    XcmsColorFormat destSpecFmt,
+    XcmsColor *pColors_in_out,
+    unsigned int nColors,
+    Bool *pCompressed)
+/*
+ *     DESCRIPTION
+ *             Convert color specifications in an array of XcmsColor structures
+ *             for differences in white points.
+ *
+ *     RETURNS
+ *             XcmsFailure if failed,
+ *             XcmsSuccess if succeeded without gamut compression,
+ *             XcmsSuccessWithCompression if succeeded with
+ *                     gamut compression.
+ */
+{
+    if (pWhitePtFrom == NULL || pWhitePtTo == NULL || pColors_in_out == NULL) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Insure TekHVC installed
+     */
+    if (XcmsAddColorSpace(&XcmsTekHVCColorSpace) == XcmsFailure) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Convert to TekHVC using pWhitePtFrom
+     *    We can ignore return value for compression because we are converting
+     *    to XcmsTekHVCFormat which is device-independent, not device-dependent.
+     */
+    if (_XcmsConvertColorsWithWhitePt(ccc, pColors_in_out, pWhitePtFrom,
+           nColors, XcmsTekHVCFormat, pCompressed) == XcmsFailure) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Convert from TekHVC to destSpecFmt using pWhitePtTo
+     */
+    return(_XcmsConvertColorsWithWhitePt(ccc, pColors_in_out, pWhitePtTo,
+           nColors, destSpecFmt, pCompressed));
+}
diff --git a/src/xcms/IdOfPr.c b/src/xcms/IdOfPr.c
new file mode 100644 (file)
index 0000000..3a92e0a
--- /dev/null
@@ -0,0 +1,106 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *             XcmsIdOfPr.c
+ *
+ *     DESCRIPTION
+ *             Source for XcmsFormatOfPrefix()
+ *
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+\f
+/*
+ *     NAME
+ *             XcmsFormatOfPrefix
+ *
+ *     SYNOPSIS
+ */
+XcmsColorFormat
+XcmsFormatOfPrefix(char *prefix)
+/*
+ *     DESCRIPTION
+ *             Returns the Color Space ID for the specified prefix
+ *             if the color space is found in the Color Conversion
+ *             Context.
+ *
+ *     RETURNS
+ *             Color Space ID if found; zero otherwise.
+ */
+{
+    XcmsColorSpace     **papColorSpaces;
+    char               string_buf[64];
+    char               *string_lowered;
+    int                        len;
+
+    /*
+     * While copying prefix to string_lowered, convert to lowercase
+     */
+    if ((len = strlen(prefix)) >= sizeof(string_buf)) {
+       string_lowered = (char *) Xmalloc(len+1);
+    } else {
+       string_lowered = string_buf;
+    }
+    _XcmsCopyISOLatin1Lowered(string_lowered, prefix);
+
+    /*
+     * First try Device-Independent color spaces
+     */
+    papColorSpaces = _XcmsDIColorSpaces;
+    if (papColorSpaces != NULL) {
+       while (*papColorSpaces != NULL) {
+           if (strcmp((*papColorSpaces)->prefix, string_lowered) == 0) {
+               if (len >= sizeof(string_buf)) Xfree(string_lowered);
+               return((*papColorSpaces)->id);
+           }
+           papColorSpaces++;
+       }
+    }
+
+    /*
+     * Next try Device-Dependent color spaces
+     */
+    papColorSpaces = _XcmsDDColorSpaces;
+    if (papColorSpaces != NULL) {
+       while (*papColorSpaces != NULL) {
+           if (strcmp((*papColorSpaces)->prefix, string_lowered) == 0) {
+               if (len >= sizeof(string_buf)) Xfree(string_lowered);
+               return((*papColorSpaces)->id);
+           }
+           papColorSpaces++;
+       }
+    }
+
+    if (len >= sizeof(string_buf)) Xfree(string_lowered);
+    return(XcmsUndefinedFormat);
+}
diff --git a/src/xcms/LRGB.c b/src/xcms/LRGB.c
new file mode 100644 (file)
index 0000000..5ecb7d1
--- /dev/null
@@ -0,0 +1,1844 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *             XcmsLRGB.c
+ *
+ *     DESCRIPTION
+ *             This file contains the conversion routines:
+ *                 1. CIE XYZ to RGB intensity
+ *                 2. RGB intensity to device RGB
+ *                 3. device RGB to RGB intensity
+ *                 4. RGB intensity to CIE XYZ
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include <X11/Xos.h>
+#include <X11/Xatom.h>
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+/*
+ *      LOCAL DEFINES
+ *             #define declarations local to this package.
+ */
+#define EPS    0.001
+#ifndef MIN
+#define MIN(x,y) ((x) > (y) ? (y) : (x))
+#endif /* MIN */
+#ifndef MAX
+#define MAX(x,y) ((x) > (y) ? (x) : (y))
+#endif /* MAX */
+#ifndef MIN3
+#define MIN3(x,y,z) ((x) > (MIN((y), (z))) ? (MIN((y), (z))) : (x))
+#endif /* MIN3 */
+#ifndef MAX3
+#define MAX3(x,y,z) ((x) > (MAX((y), (z))) ? (x) : (MAX((y), (z))))
+#endif /* MAX3 */
+
+/*
+ *      LOCAL TYPEDEFS
+ *              typedefs local to this package (for use with local vars).
+ *
+ */
+
+/*
+ *      FORWARD DECLARATIONS
+ */
+static void LINEAR_RGB_FreeSCCData(XPointer pScreenDataTemp);
+static int LINEAR_RGB_InitSCCData(Display *dpy,
+    int screenNumber, XcmsPerScrnInfo *pPerScrnInfo);
+static int XcmsLRGB_RGB_ParseString(register char *spec, XcmsColor *pColor);
+static int XcmsLRGB_RGBi_ParseString(register char *spec, XcmsColor *pColor);
+static Status
+_XcmsGetTableType0(
+    IntensityTbl *pTbl,
+    int          format,
+    char **pChar,
+    unsigned long *pCount);
+static Status
+_XcmsGetTableType1(
+    IntensityTbl *pTbl,
+    int          format,
+    char **pChar,
+    unsigned long *pCount);
+
+/*
+ *      LOCALS VARIABLES
+ *             Variables local to this package.
+ *                 Usage example:
+ *                     static int      ExampleLocalVar;
+ */
+
+static unsigned short const MASK[17] = {
+    0x0000,    /*  0 bitsPerRGB */
+    0x8000,    /*  1 bitsPerRGB */
+    0xc000,    /*  2 bitsPerRGB */
+    0xe000,    /*  3 bitsPerRGB */
+    0xf000,    /*  4 bitsPerRGB */
+    0xf800,    /*  5 bitsPerRGB */
+    0xfc00,    /*  6 bitsPerRGB */
+    0xfe00,    /*  7 bitsPerRGB */
+    0xff00,    /*  8 bitsPerRGB */
+    0xff80,    /*  9 bitsPerRGB */
+    0xffc0,    /* 10 bitsPerRGB */
+    0xffe0,    /* 11 bitsPerRGB */
+    0xfff0,    /* 12 bitsPerRGB */
+    0xfff8,    /* 13 bitsPerRGB */
+    0xfffc,    /* 14 bitsPerRGB */
+    0xfffe,    /* 15 bitsPerRGB */
+    0xffff     /* 16 bitsPerRGB */
+};
+
+
+    /*
+     * A NULL terminated array of function pointers that when applied
+     * in series will convert an XcmsColor structure from XcmsRGBFormat
+     * to XcmsCIEXYZFormat.
+     */
+static XcmsConversionProc Fl_RGB_to_CIEXYZ[] = {
+    (XcmsConversionProc)XcmsRGBToRGBi,
+    (XcmsConversionProc)XcmsRGBiToCIEXYZ,
+    NULL
+};
+
+    /*
+     * A NULL terminated array of function pointers that when applied
+     * in series will convert an XcmsColor structure from XcmsCIEXYZFormat
+     * to XcmsRGBFormat.
+     */
+static XcmsConversionProc Fl_CIEXYZ_to_RGB[] = {
+    (XcmsConversionProc)XcmsCIEXYZToRGBi,
+    (XcmsConversionProc)XcmsRGBiToRGB,
+    NULL
+};
+
+    /*
+     * A NULL terminated array of function pointers that when applied
+     * in series will convert an XcmsColor structure from XcmsRGBiFormat
+     * to XcmsCIEXYZFormat.
+     */
+static XcmsConversionProc Fl_RGBi_to_CIEXYZ[] = {
+    (XcmsConversionProc)XcmsRGBiToCIEXYZ,
+    NULL
+};
+
+    /*
+     * A NULL terminated array of function pointers that when applied
+     * in series will convert an XcmsColor structure from XcmsCIEXYZFormat
+     * to XcmsRGBiFormat.
+     */
+static XcmsConversionProc Fl_CIEXYZ_to_RGBi[] = {
+    (XcmsConversionProc)XcmsCIEXYZToRGBi,
+    NULL
+};
+
+    /*
+     * RGBi Color Spaces
+     */
+XcmsColorSpace XcmsRGBiColorSpace =
+    {
+       _XcmsRGBi_prefix,       /* prefix */
+       XcmsRGBiFormat,         /* id */
+       XcmsLRGB_RGBi_ParseString,      /* parseString */
+       Fl_RGBi_to_CIEXYZ,      /* to_CIEXYZ */
+       Fl_CIEXYZ_to_RGBi,      /* from_CIEXYZ */
+       1
+    };
+
+    /*
+     * RGB Color Spaces
+     */
+XcmsColorSpace XcmsRGBColorSpace =
+    {
+       _XcmsRGB_prefix,                /* prefix */
+       XcmsRGBFormat,          /* id */
+       XcmsLRGB_RGB_ParseString,       /* parseString */
+       Fl_RGB_to_CIEXYZ,       /* to_CIEXYZ */
+       Fl_CIEXYZ_to_RGB,       /* from_CIEXYZ */
+       1
+    };
+
+    /*
+     * Device-Independent Color Spaces known to the
+     * LINEAR_RGB Screen Color Characteristics Function Set.
+     */
+static XcmsColorSpace  *DDColorSpaces[] = {
+    &XcmsRGBColorSpace,
+    &XcmsRGBiColorSpace,
+    NULL
+};
+
+
+/*
+ *      GLOBALS
+ *              Variables declared in this package that are allowed
+ *             to be used globally.
+ */
+
+    /*
+     * LINEAR_RGB Screen Color Characteristics Function Set.
+     */
+XcmsFunctionSet        XcmsLinearRGBFunctionSet =
+    {
+       &DDColorSpaces[0],      /* pDDColorSpaces */
+       LINEAR_RGB_InitSCCData, /* pInitScrnFunc */
+       LINEAR_RGB_FreeSCCData  /* pFreeSCCData */
+    };
+
+/*
+ *     DESCRIPTION
+ *             Contents of Default SCCData should be replaced if other
+ *             data should be used as default.
+ *
+ *
+ */
+
+/*
+ * NAME                Tektronix 19" (Sony) CRT
+ * PART_NUMBER         119-2451-00
+ * MODEL               Tek4300, Tek4800
+ */
+
+static IntensityRec const Default_RGB_RedTuples[] = {
+    /* {unsigned short value, XcmsFloat intensity} */
+            { 0x0000,    0.000000 },
+            { 0x0909,    0.000000 },
+            { 0x0a0a,    0.000936 },
+            { 0x0f0f,    0.001481 },
+            { 0x1414,    0.002329 },
+            { 0x1919,    0.003529 },
+            { 0x1e1e,    0.005127 },
+            { 0x2323,    0.007169 },
+            { 0x2828,    0.009699 },
+            { 0x2d2d,    0.012759 },
+            { 0x3232,    0.016392 },
+            { 0x3737,    0.020637 },
+            { 0x3c3c,    0.025533 },
+            { 0x4141,    0.031119 },
+            { 0x4646,    0.037431 },
+            { 0x4b4b,    0.044504 },
+            { 0x5050,    0.052373 },
+            { 0x5555,    0.061069 },
+            { 0x5a5a,    0.070624 },
+            { 0x5f5f,    0.081070 },
+            { 0x6464,    0.092433 },
+            { 0x6969,    0.104744 },
+            { 0x6e6e,    0.118026 },
+            { 0x7373,    0.132307 },
+            { 0x7878,    0.147610 },
+            { 0x7d7d,    0.163958 },
+            { 0x8282,    0.181371 },
+            { 0x8787,    0.199871 },
+            { 0x8c8c,    0.219475 },
+            { 0x9191,    0.240202 },
+            { 0x9696,    0.262069 },
+            { 0x9b9b,    0.285089 },
+            { 0xa0a0,    0.309278 },
+            { 0xa5a5,    0.334647 },
+            { 0xaaaa,    0.361208 },
+            { 0xafaf,    0.388971 },
+            { 0xb4b4,    0.417945 },
+            { 0xb9b9,    0.448138 },
+            { 0xbebe,    0.479555 },
+            { 0xc3c3,    0.512202 },
+            { 0xc8c8,    0.546082 },
+            { 0xcdcd,    0.581199 },
+            { 0xd2d2,    0.617552 },
+            { 0xd7d7,    0.655144 },
+            { 0xdcdc,    0.693971 },
+            { 0xe1e1,    0.734031 },
+            { 0xe6e6,    0.775322 },
+            { 0xebeb,    0.817837 },
+            { 0xf0f0,    0.861571 },
+            { 0xf5f5,    0.906515 },
+            { 0xfafa,    0.952662 },
+            { 0xffff,    1.000000 }
+};
+
+static IntensityRec const Default_RGB_GreenTuples[] = {
+    /* {unsigned short value, XcmsFloat intensity} */
+            { 0x0000,    0.000000 },
+            { 0x1313,    0.000000 },
+            { 0x1414,    0.000832 },
+            { 0x1919,    0.001998 },
+            { 0x1e1e,    0.003612 },
+            { 0x2323,    0.005736 },
+            { 0x2828,    0.008428 },
+            { 0x2d2d,    0.011745 },
+            { 0x3232,    0.015740 },
+            { 0x3737,    0.020463 },
+            { 0x3c3c,    0.025960 },
+            { 0x4141,    0.032275 },
+            { 0x4646,    0.039449 },
+            { 0x4b4b,    0.047519 },
+            { 0x5050,    0.056520 },
+            { 0x5555,    0.066484 },
+            { 0x5a5a,    0.077439 },
+            { 0x5f5f,    0.089409 },
+            { 0x6464,    0.102418 },
+            { 0x6969,    0.116485 },
+            { 0x6e6e,    0.131625 },
+            { 0x7373,    0.147853 },
+            { 0x7878,    0.165176 },
+            { 0x7d7d,    0.183604 },
+            { 0x8282,    0.203140 },
+            { 0x8787,    0.223783 },
+            { 0x8c8c,    0.245533 },
+            { 0x9191,    0.268384 },
+            { 0x9696,    0.292327 },
+            { 0x9b9b,    0.317351 },
+            { 0xa0a0,    0.343441 },
+            { 0xa5a5,    0.370580 },
+            { 0xaaaa,    0.398747 },
+            { 0xafaf,    0.427919 },
+            { 0xb4b4,    0.458068 },
+            { 0xb9b9,    0.489165 },
+            { 0xbebe,    0.521176 },
+            { 0xc3c3,    0.554067 },
+            { 0xc8c8,    0.587797 },
+            { 0xcdcd,    0.622324 },
+            { 0xd2d2,    0.657604 },
+            { 0xd7d7,    0.693588 },
+            { 0xdcdc,    0.730225 },
+            { 0xe1e1,    0.767459 },
+            { 0xe6e6,    0.805235 },
+            { 0xebeb,    0.843491 },
+            { 0xf0f0,    0.882164 },
+            { 0xf5f5,    0.921187 },
+            { 0xfafa,    0.960490 },
+            { 0xffff,    1.000000 }
+};
+
+static IntensityRec const Default_RGB_BlueTuples[] = {
+    /* {unsigned short value, XcmsFloat intensity} */
+            { 0x0000,    0.000000 },
+            { 0x0e0e,    0.000000 },
+            { 0x0f0f,    0.001341 },
+            { 0x1414,    0.002080 },
+            { 0x1919,    0.003188 },
+            { 0x1e1e,    0.004729 },
+            { 0x2323,    0.006766 },
+            { 0x2828,    0.009357 },
+            { 0x2d2d,    0.012559 },
+            { 0x3232,    0.016424 },
+            { 0x3737,    0.021004 },
+            { 0x3c3c,    0.026344 },
+            { 0x4141,    0.032489 },
+            { 0x4646,    0.039481 },
+            { 0x4b4b,    0.047357 },
+            { 0x5050,    0.056154 },
+            { 0x5555,    0.065903 },
+            { 0x5a5a,    0.076634 },
+            { 0x5f5f,    0.088373 },
+            { 0x6464,    0.101145 },
+            { 0x6969,    0.114968 },
+            { 0x6e6e,    0.129862 },
+            { 0x7373,    0.145841 },
+            { 0x7878,    0.162915 },
+            { 0x7d7d,    0.181095 },
+            { 0x8282,    0.200386 },
+            { 0x8787,    0.220791 },
+            { 0x8c8c,    0.242309 },
+            { 0x9191,    0.264937 },
+            { 0x9696,    0.288670 },
+            { 0x9b9b,    0.313499 },
+            { 0xa0a0,    0.339410 },
+            { 0xa5a5,    0.366390 },
+            { 0xaaaa,    0.394421 },
+            { 0xafaf,    0.423481 },
+            { 0xb4b4,    0.453547 },
+            { 0xb9b9,    0.484592 },
+            { 0xbebe,    0.516587 },
+            { 0xc3c3,    0.549498 },
+            { 0xc8c8,    0.583291 },
+            { 0xcdcd,    0.617925 },
+            { 0xd2d2,    0.653361 },
+            { 0xd7d7,    0.689553 },
+            { 0xdcdc,    0.726454 },
+            { 0xe1e1,    0.764013 },
+            { 0xe6e6,    0.802178 },
+            { 0xebeb,    0.840891 },
+            { 0xf0f0,    0.880093 },
+            { 0xf5f5,    0.919723 },
+            { 0xfafa,    0.959715 },
+           { 0xffff,    1.00000 }
+};
+
+static IntensityTbl Default_RGB_RedTbl = {
+    /* IntensityRec *pBase */
+       (IntensityRec *) Default_RGB_RedTuples,
+    /* unsigned int nEntries */
+       52
+};
+
+static IntensityTbl Default_RGB_GreenTbl = {
+    /* IntensityRec *pBase */
+       (IntensityRec *)Default_RGB_GreenTuples,
+    /* unsigned int nEntries */
+       50
+};
+
+static IntensityTbl Default_RGB_BlueTbl = {
+    /* IntensityRec *pBase */
+       (IntensityRec *)Default_RGB_BlueTuples,
+    /* unsigned int nEntries */
+       51
+};
+
+static LINEAR_RGB_SCCData Default_RGB_SCCData = {
+    /* XcmsFloat XYZtoRGBmatrix[3][3] */
+  {
+    { 3.48340481253539000, -1.52176374927285200, -0.55923133354049780 },
+    {-1.07152751306193600,  1.96593795204372400,  0.03673691339553462 },
+    { 0.06351179790497788, -0.20020501000496480,  0.81070942031648220 }
+  },
+
+    /* XcmsFloat RGBtoXYZmatrix[3][3] */
+  {
+    { 0.38106149108714790, 0.32025712365352110, 0.24834578525933100 },
+    { 0.20729745115140850, 0.68054638776373240, 0.11215616108485920 },
+    { 0.02133944350088028, 0.14297193020246480, 1.24172892629665500 }
+  },
+
+    /* IntensityTbl *pRedTbl */
+       &Default_RGB_RedTbl,
+
+    /* IntensityTbl *pGreenTbl */
+       &Default_RGB_GreenTbl,
+
+    /* IntensityTbl *pBlueTbl */
+       &Default_RGB_BlueTbl
+};
+\f
+/************************************************************************
+ *                                                                     *
+ *                     PRIVATE ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             LINEAR_RGB_InitSCCData()
+ *
+ *     SYNOPSIS
+ */
+static Status
+LINEAR_RGB_InitSCCData(
+    Display *dpy,
+    int screenNumber,
+    XcmsPerScrnInfo *pPerScrnInfo)
+/*
+ *     DESCRIPTION
+ *
+ *     RETURNS
+ *             XcmsFailure if failed.
+ *             XcmsSuccess if succeeded.
+ *
+ */
+{
+    Atom  CorrectAtom = XInternAtom (dpy, XDCCC_CORRECT_ATOM_NAME, True);
+    Atom  MatrixAtom  = XInternAtom (dpy, XDCCC_MATRIX_ATOM_NAME, True);
+    int          format_return, count, cType, nTables;
+    unsigned long nitems, nbytes_return;
+    char *property_return, *pChar;
+    XcmsFloat *pValue;
+#ifdef ALLDEBUG
+    IntensityRec *pIRec;
+#endif /* ALLDEBUG */
+    VisualID visualID;
+
+    LINEAR_RGB_SCCData *pScreenData, *pScreenDefaultData;
+    XcmsIntensityMap *pNewMap;
+
+    /*
+     * Allocate memory for pScreenData
+     */
+    if (!(pScreenData = pScreenDefaultData = (LINEAR_RGB_SCCData *)
+                     Xcalloc (1, sizeof(LINEAR_RGB_SCCData)))) {
+       return(XcmsFailure);
+    }
+
+    /*
+     *  1. Get the XYZ->RGB and RGB->XYZ matrices
+     */
+
+    if (MatrixAtom == None ||
+       !_XcmsGetProperty (dpy, RootWindow(dpy, screenNumber), MatrixAtom,
+          &format_return, &nitems, &nbytes_return, &property_return) ||
+          nitems != 18 || format_return != 32) {
+       /*
+        * As per the XDCCC, there must be 18 data items and each must be
+        * in 32 bits !
+        */
+       goto FreeSCCData;
+
+    } else {
+
+       /*
+        * RGBtoXYZ and XYZtoRGB matrices
+        */
+       pValue = (XcmsFloat *) pScreenData;
+       pChar = property_return;
+       for (count = 0; count < 18; count++) {
+           *pValue++ = (long)_XcmsGetElement(format_return, &pChar,
+                   &nitems) / (XcmsFloat)XDCCC_NUMBER;
+       }
+       Xfree ((char *)property_return);
+       pPerScrnInfo->screenWhitePt.spec.CIEXYZ.X =
+               pScreenData->RGBtoXYZmatrix[0][0] +
+               pScreenData->RGBtoXYZmatrix[0][1] +
+               pScreenData->RGBtoXYZmatrix[0][2];
+       pPerScrnInfo->screenWhitePt.spec.CIEXYZ.Y =
+               pScreenData->RGBtoXYZmatrix[1][0] +
+               pScreenData->RGBtoXYZmatrix[1][1] +
+               pScreenData->RGBtoXYZmatrix[1][2];
+       pPerScrnInfo->screenWhitePt.spec.CIEXYZ.Z =
+               pScreenData->RGBtoXYZmatrix[2][0] +
+               pScreenData->RGBtoXYZmatrix[2][1] +
+               pScreenData->RGBtoXYZmatrix[2][2];
+
+       /*
+        * Compute the Screen White Point
+        */
+       if ((pPerScrnInfo->screenWhitePt.spec.CIEXYZ.Y < (1.0 - EPS) )
+               || (pPerScrnInfo->screenWhitePt.spec.CIEXYZ.Y > (1.0 + EPS))) {
+           goto FreeSCCData;
+       } else {
+           pPerScrnInfo->screenWhitePt.spec.CIEXYZ.Y = 1.0;
+       }
+       pPerScrnInfo->screenWhitePt.format = XcmsCIEXYZFormat;
+       pPerScrnInfo->screenWhitePt.pixel = 0;
+
+#ifdef PDEBUG
+       printf ("RGB to XYZ Matrix values:\n");
+       printf ("       %f %f %f\n       %f %f %f\n       %f %f %f\n",
+               pScreenData->RGBtoXYZmatrix[0][0],
+               pScreenData->RGBtoXYZmatrix[0][1],
+               pScreenData->RGBtoXYZmatrix[0][2],
+               pScreenData->RGBtoXYZmatrix[1][0],
+               pScreenData->RGBtoXYZmatrix[1][1],
+               pScreenData->RGBtoXYZmatrix[1][2],
+               pScreenData->RGBtoXYZmatrix[2][0],
+               pScreenData->RGBtoXYZmatrix[2][1],
+               pScreenData->RGBtoXYZmatrix[2][2]);
+       printf ("XYZ to RGB Matrix values:\n");
+       printf ("       %f %f %f\n       %f %f %f\n       %f %f %f\n",
+               pScreenData->XYZtoRGBmatrix[0][0],
+               pScreenData->XYZtoRGBmatrix[0][1],
+               pScreenData->XYZtoRGBmatrix[0][2],
+               pScreenData->XYZtoRGBmatrix[1][0],
+               pScreenData->XYZtoRGBmatrix[1][1],
+               pScreenData->XYZtoRGBmatrix[1][2],
+               pScreenData->XYZtoRGBmatrix[2][0],
+               pScreenData->XYZtoRGBmatrix[2][1],
+               pScreenData->XYZtoRGBmatrix[2][2]);
+       printf ("Screen White Pt value: %f %f %f\n",
+               pPerScrnInfo->screenWhitePt.spec.CIEXYZ.X,
+               pPerScrnInfo->screenWhitePt.spec.CIEXYZ.Y,
+               pPerScrnInfo->screenWhitePt.spec.CIEXYZ.Z);
+#endif /* PDEBUG */
+    }
+
+    /*
+     * 2. Get the Intensity Profile
+     */
+    if (CorrectAtom == None ||
+       !_XcmsGetProperty (dpy, RootWindow(dpy, screenNumber), CorrectAtom,
+          &format_return, &nitems, &nbytes_return, &property_return)) {
+       goto FreeSCCData;
+    }
+
+    pChar = property_return;
+
+    while (nitems) {
+       switch (format_return) {
+         case 8:
+           /*
+            * Must have at least:
+            *          VisualID0
+            *          VisualID1
+            *          VisualID2
+            *          VisualID3
+            *          type
+            *          count
+            *          length
+            *          intensity1
+            *          intensity2
+            */
+           if (nitems < 9) {
+               goto Free_property_return;
+           }
+           count = 3;
+           break;
+         case 16:
+           /*
+            * Must have at least:
+            *          VisualID0
+            *          VisualID3
+            *          type
+            *          count
+            *          length
+            *          intensity1
+            *          intensity2
+            */
+           if (nitems < 7) {
+               goto Free_property_return;
+           }
+           count = 1;
+           break;
+         case 32:
+           /*
+            * Must have at least:
+            *          VisualID0
+            *          type
+            *          count
+            *          length
+            *          intensity1
+            *          intensity2
+            */
+           if (nitems < 6) {
+               goto Free_property_return;
+           }
+           count = 0;
+           break;
+         default:
+           goto Free_property_return;
+       }
+
+       /*
+        * Get VisualID
+        */
+       visualID = _XcmsGetElement(format_return, &pChar, &nitems);
+       while (count--) {
+           visualID = visualID << format_return;
+           visualID |= _XcmsGetElement(format_return, &pChar, &nitems);
+       }
+
+       if (visualID == 0) {
+           /*
+            * This is a shared intensity table
+            */
+           pScreenData = pScreenDefaultData;
+       } else {
+           /*
+            * This is a per-Visual intensity table
+            */
+           if (!(pScreenData = (LINEAR_RGB_SCCData *)
+                             Xcalloc (1, sizeof(LINEAR_RGB_SCCData)))) {
+               goto Free_property_return;
+           }
+           /* copy matrices */
+           memcpy((char *)pScreenData, (char *)pScreenDefaultData,
+                  18 * sizeof(XcmsFloat));
+
+           /* Create, initialize, and add map */
+           if (!(pNewMap = (XcmsIntensityMap *)
+                             Xcalloc (1, sizeof(XcmsIntensityMap)))) {
+               Xfree((char *)pScreenData);
+               goto Free_property_return;
+           }
+           pNewMap->visualID = visualID;
+           pNewMap->screenData = (XPointer)pScreenData;
+           pNewMap->pFreeScreenData = LINEAR_RGB_FreeSCCData;
+           pNewMap->pNext =
+                   (XcmsIntensityMap *)dpy->cms.perVisualIntensityMaps;
+           dpy->cms.perVisualIntensityMaps = (XPointer)pNewMap;
+           dpy->free_funcs->intensityMaps = _XcmsFreeIntensityMaps;
+       }
+
+       cType = _XcmsGetElement(format_return, &pChar, &nitems);
+       nTables = _XcmsGetElement(format_return, &pChar, &nitems);
+
+       if (cType == 0) {
+
+           /* Red Intensity Table */
+           if (!(pScreenData->pRedTbl = (IntensityTbl *)
+                   Xcalloc (1, sizeof(IntensityTbl)))) {
+               goto Free_property_return;
+           }
+           if (_XcmsGetTableType0(pScreenData->pRedTbl, format_return, &pChar,
+                   &nitems) == XcmsFailure) {
+               goto FreeRedTbl;
+           }
+
+           if (nTables == 1) {
+               /* Green Intensity Table */
+               pScreenData->pGreenTbl = pScreenData->pRedTbl;
+               /* Blue Intensity Table */
+               pScreenData->pBlueTbl = pScreenData->pRedTbl;
+           } else {
+               /* Green Intensity Table */
+               if (!(pScreenData->pGreenTbl = (IntensityTbl *)
+                       Xcalloc (1, sizeof(IntensityTbl)))) {
+                   goto FreeRedTblElements;
+               }
+               if (_XcmsGetTableType0(pScreenData->pGreenTbl, format_return, &pChar,
+                       &nitems) == XcmsFailure) {
+                   goto FreeGreenTbl;
+               }
+
+               /* Blue Intensity Table */
+               if (!(pScreenData->pBlueTbl = (IntensityTbl *)
+                       Xcalloc (1, sizeof(IntensityTbl)))) {
+                   goto FreeGreenTblElements;
+               }
+               if (_XcmsGetTableType0(pScreenData->pBlueTbl, format_return, &pChar,
+                       &nitems) == XcmsFailure) {
+                   goto FreeBlueTbl;
+               }
+           }
+       } else if (cType == 1) {
+           /* Red Intensity Table */
+           if (!(pScreenData->pRedTbl = (IntensityTbl *)
+                   Xcalloc (1, sizeof(IntensityTbl)))) {
+               goto Free_property_return;
+           }
+           if (_XcmsGetTableType1(pScreenData->pRedTbl, format_return, &pChar,
+                   &nitems) == XcmsFailure) {
+               goto FreeRedTbl;
+           }
+
+           if (nTables == 1) {
+
+               /* Green Intensity Table */
+               pScreenData->pGreenTbl = pScreenData->pRedTbl;
+               /* Blue Intensity Table */
+               pScreenData->pBlueTbl = pScreenData->pRedTbl;
+
+           } else {
+
+               /* Green Intensity Table */
+               if (!(pScreenData->pGreenTbl = (IntensityTbl *)
+                       Xcalloc (1, sizeof(IntensityTbl)))) {
+                   goto FreeRedTblElements;
+               }
+               if (_XcmsGetTableType1(pScreenData->pGreenTbl, format_return, &pChar,
+                       &nitems) == XcmsFailure) {
+                   goto FreeGreenTbl;
+               }
+
+               /* Blue Intensity Table */
+               if (!(pScreenData->pBlueTbl = (IntensityTbl *)
+                       Xcalloc (1, sizeof(IntensityTbl)))) {
+                   goto FreeGreenTblElements;
+               }
+               if (_XcmsGetTableType1(pScreenData->pBlueTbl, format_return, &pChar,
+                       &nitems) == XcmsFailure) {
+                   goto FreeBlueTbl;
+               }
+           }
+       } else {
+           goto Free_property_return;
+       }
+
+#ifdef ALLDEBUG
+       printf ("Intensity Table  RED    %d\n", pScreenData->pRedTbl->nEntries);
+       pIRec = (IntensityRec *) pScreenData->pRedTbl->pBase;
+       for (count = 0; count < pScreenData->pRedTbl->nEntries; count++, pIRec++) {
+           printf ("\t0x%4x\t%f\n", pIRec->value, pIRec->intensity);
+       }
+       if (pScreenData->pGreenTbl->pBase != pScreenData->pRedTbl->pBase) {
+           printf ("Intensity Table  GREEN  %d\n", pScreenData->pGreenTbl->nEntries);
+           pIRec = (IntensityRec *)pScreenData->pGreenTbl->pBase;
+           for (count = 0; count < pScreenData->pGreenTbl->nEntries; count++, pIRec++) {
+               printf ("\t0x%4x\t%f\n", pIRec->value, pIRec->intensity);
+           }
+       }
+       if (pScreenData->pBlueTbl->pBase != pScreenData->pRedTbl->pBase) {
+           printf ("Intensity Table  BLUE   %d\n", pScreenData->pBlueTbl->nEntries);
+           pIRec = (IntensityRec *) pScreenData->pBlueTbl->pBase;
+           for (count = 0; count < pScreenData->pBlueTbl->nEntries; count++, pIRec++) {
+               printf ("\t0x%4x\t%f\n", pIRec->value, pIRec->intensity);
+           }
+       }
+#endif /* ALLDEBUG */
+    }
+
+    Xfree ((char *)property_return);
+
+    /* Free the old memory and use the new structure created. */
+    LINEAR_RGB_FreeSCCData(pPerScrnInfo->screenData);
+
+    pPerScrnInfo->functionSet = (XPointer) &XcmsLinearRGBFunctionSet;
+
+    pPerScrnInfo->screenData = (XPointer) pScreenData;
+
+    pPerScrnInfo->state = XcmsInitSuccess;
+
+    return(XcmsSuccess);
+
+FreeBlueTblElements:
+    Xfree((char *)pScreenData->pBlueTbl->pBase);
+
+FreeBlueTbl:
+    Xfree((char *)pScreenData->pBlueTbl);
+
+FreeGreenTblElements:
+    Xfree((char *)pScreenData->pGreenTbl->pBase);
+
+FreeGreenTbl:
+    Xfree((char *)pScreenData->pGreenTbl);
+
+FreeRedTblElements:
+    Xfree((char *)pScreenData->pRedTbl->pBase);
+
+FreeRedTbl:
+    Xfree((char *)pScreenData->pRedTbl);
+
+Free_property_return:
+    Xfree ((char *)property_return);
+
+FreeSCCData:
+    Xfree((char *)pScreenDefaultData);
+    pPerScrnInfo->state = XcmsInitNone;
+    return(XcmsFailure);
+}
+
+\f
+/*
+ *     NAME
+ *             LINEAR_RGB_FreeSCCData()
+ *
+ *     SYNOPSIS
+ */
+static void
+LINEAR_RGB_FreeSCCData(
+    XPointer pScreenDataTemp)
+/*
+ *     DESCRIPTION
+ *
+ *     RETURNS
+ *             0 if failed.
+ *             1 if succeeded with no modifications.
+ *
+ */
+{
+    LINEAR_RGB_SCCData *pScreenData = (LINEAR_RGB_SCCData *) pScreenDataTemp;
+
+    if (pScreenData && pScreenData != &Default_RGB_SCCData) {
+       if (pScreenData->pRedTbl) {
+           if (pScreenData->pGreenTbl) {
+               if (pScreenData->pRedTbl->pBase !=
+                   pScreenData->pGreenTbl->pBase) {
+                   if (pScreenData->pGreenTbl->pBase) {
+                       Xfree ((char *)pScreenData->pGreenTbl->pBase);
+                   }
+               }
+               if (pScreenData->pGreenTbl != pScreenData->pRedTbl) {
+                   Xfree ((char *)pScreenData->pGreenTbl);
+               }
+           }
+           if (pScreenData->pBlueTbl) {
+               if (pScreenData->pRedTbl->pBase !=
+                   pScreenData->pBlueTbl->pBase) {
+                   if (pScreenData->pBlueTbl->pBase) {
+                       Xfree ((char *)pScreenData->pBlueTbl->pBase);
+                   }
+               }
+               if (pScreenData->pBlueTbl != pScreenData->pRedTbl) {
+                   Xfree ((char *)pScreenData->pBlueTbl);
+               }
+           }
+           if (pScreenData->pRedTbl->pBase) {
+               Xfree ((char *)pScreenData->pRedTbl->pBase);
+           }
+           Xfree ((char *)pScreenData->pRedTbl);
+       }
+       Xfree ((char *)pScreenData);
+    }
+}
+
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                     API PRIVATE ROUTINES                            *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             _XcmsGetTableType0
+ *
+ *     SYNOPSIS
+ */
+static Status
+_XcmsGetTableType0(
+    IntensityTbl *pTbl,
+    int          format,
+    char **pChar,
+    unsigned long *pCount)
+/*
+ *     DESCRIPTION
+ *
+ *     RETURNS
+ *             XcmsFailure if failed.
+ *             XcmsSuccess if succeeded.
+ *
+ */
+{
+    unsigned int nElements;
+    IntensityRec *pIRec;
+
+    nElements = pTbl->nEntries =
+           _XcmsGetElement(format, pChar, pCount) + 1;
+    if (!(pIRec = pTbl->pBase = (IntensityRec *)
+         Xcalloc (nElements, sizeof(IntensityRec)))) {
+       return(XcmsFailure);
+    }
+
+    switch (format) {
+      case 8:
+       for (; nElements--; pIRec++) {
+           /* 0xFFFF/0xFF = 0x101 */
+           pIRec->value = _XcmsGetElement (format, pChar, pCount) * 0x101;
+           pIRec->intensity =
+                   _XcmsGetElement (format, pChar, pCount) / (XcmsFloat)255.0;
+       }
+       break;
+      case 16:
+       for (; nElements--; pIRec++) {
+           pIRec->value = _XcmsGetElement (format, pChar, pCount);
+           pIRec->intensity = _XcmsGetElement (format, pChar, pCount)
+                   / (XcmsFloat)65535.0;
+       }
+       break;
+      case 32:
+       for (; nElements--; pIRec++) {
+           pIRec->value = _XcmsGetElement (format, pChar, pCount);
+           pIRec->intensity = _XcmsGetElement (format, pChar, pCount)
+                   / (XcmsFloat)4294967295.0;
+       }
+       break;
+      default:
+       return(XcmsFailure);
+    }
+    return(XcmsSuccess);
+}
+
+\f
+/*
+ *     NAME
+ *             _XcmsGetTableType1
+ *
+ *     SYNOPSIS
+ */
+static Status
+_XcmsGetTableType1(
+    IntensityTbl *pTbl,
+    int          format,
+    char **pChar,
+    unsigned long *pCount)
+/*
+ *     DESCRIPTION
+ *
+ *     RETURNS
+ *             XcmsFailure if failed.
+ *             XcmsSuccess if succeeded.
+ *
+ */
+{
+    int count;
+    unsigned int max_index;
+    IntensityRec *pIRec;
+
+    max_index = _XcmsGetElement(format, pChar, pCount);
+    pTbl->nEntries = max_index + 1;
+    if (!(pIRec = pTbl->pBase = (IntensityRec *)
+         Xcalloc (max_index+1, sizeof(IntensityRec)))) {
+       return(XcmsFailure);
+    }
+
+    switch (format) {
+      case 8:
+       for (count = 0; count < max_index+1; count++, pIRec++) {
+           pIRec->value = (count * 65535) / max_index;
+           pIRec->intensity = _XcmsGetElement (format, pChar, pCount)
+                   / (XcmsFloat)255.0;
+       }
+       break;
+      case 16:
+       for (count = 0; count < max_index+1; count++, pIRec++) {
+           pIRec->value = (count * 65535) / max_index;
+           pIRec->intensity = _XcmsGetElement (format, pChar, pCount)
+                   / (XcmsFloat)65535.0;
+       }
+       break;
+      case 32:
+       for (count = 0; count < max_index+1; count++, pIRec++) {
+           pIRec->value = (count * 65535) / max_index;
+           pIRec->intensity = _XcmsGetElement (format, pChar, pCount)
+                   / (XcmsFloat)4294967295.0;
+       }
+       break;
+      default:
+       return(XcmsFailure);
+    }
+
+    return(XcmsSuccess);
+}
+
+\f
+/*
+ *     NAME
+ *             ValueCmp
+ *
+ *     SYNOPSIS
+ */
+static int
+_XcmsValueCmp(
+    IntensityRec *p1, IntensityRec *p2)
+/*
+ *     DESCRIPTION
+ *             Compares the value component of two IntensityRec
+ *             structures.
+ *
+ *     RETURNS
+ *             0 if p1->value is equal to p2->value
+ *             < 0 if p1->value is less than p2->value
+ *             > 0 if p1->value is greater than p2->value
+ *
+ */
+{
+    return (p1->value - p2->value);
+}
+
+\f
+/*
+ *     NAME
+ *             IntensityCmp
+ *
+ *     SYNOPSIS
+ */
+static int
+_XcmsIntensityCmp(
+    IntensityRec *p1, IntensityRec *p2)
+/*
+ *     DESCRIPTION
+ *             Compares the intensity component of two IntensityRec
+ *             structures.
+ *
+ *     RETURNS
+ *             0 if equal;
+ *             < 0 if first precedes second
+ *             > 0 if first succeeds second
+ *
+ */
+{
+    if (p1->intensity < p2->intensity) {
+       return (-1);
+    }
+    if (p1->intensity > p2->intensity) {
+       return (XcmsSuccess);
+    }
+    return (XcmsFailure);
+}
+\f
+/*
+ *     NAME
+ *             ValueInterpolation
+ *
+ *     SYNOPSIS
+ */
+/* ARGSUSED */
+static int
+_XcmsValueInterpolation(
+    IntensityRec *key, IntensityRec *lo, IntensityRec *hi, IntensityRec *answer,
+    int bitsPerRGB)
+/*
+ *     DESCRIPTION
+ *             Based on a given value, performs a linear interpolation
+ *             on the intensities between two IntensityRec structures.
+ *             Note that the bitsPerRGB parameter is ignored.
+ *
+ *     RETURNS
+ *             Returns 0 if failed; otherwise non-zero.
+ */
+{
+    XcmsFloat ratio;
+
+    ratio = ((XcmsFloat)key->value - (XcmsFloat)lo->value) /
+       ((XcmsFloat)hi->value - (XcmsFloat)lo->value);
+    answer->value = key->value;
+    answer->intensity = (hi->intensity - lo->intensity) * ratio;
+    answer->intensity += lo->intensity;
+    return (XcmsSuccess);
+}
+\f
+/*
+ *     NAME
+ *             IntensityInterpolation
+ *
+ *     SYNOPSIS
+ */
+static int
+_XcmsIntensityInterpolation(
+    IntensityRec *key, IntensityRec *lo, IntensityRec *hi, IntensityRec *answer,
+    int bitsPerRGB)
+/*
+ *     DESCRIPTION
+ *             Based on a given intensity, performs a linear interpolation
+ *             on the values between two IntensityRec structures.
+ *             The bitsPerRGB parameter is necessary to perform rounding
+ *             to the correct number of significant bits.
+ *
+ *     RETURNS
+ *             Returns 0 if failed; otherwise non-zero.
+ */
+{
+    XcmsFloat ratio;
+    long target, up, down;
+    int shift = 16 - bitsPerRGB;
+    int max_color = (1 << bitsPerRGB) - 1;
+
+    ratio = (key->intensity - lo->intensity) / (hi->intensity - lo->intensity);
+    answer->intensity = key->intensity;
+    target = hi->value - lo->value;
+    target *= ratio;
+    target += lo->value;
+
+    /*
+     * Ok now, lets find the closest in respects to bits per RGB
+     */
+    up = ((target >> shift) * 0xFFFF) / max_color;
+    if (up < target) {
+       down = up;
+       up = (MIN((down >> shift) + 1, max_color) * 0xFFFF) / max_color;
+    } else {
+       down = (MAX((up >> shift) - 1, 0) * 0xFFFF) / max_color;
+    }
+    answer->value = ((up - target) < (target - down) ? up : down);
+    answer->value &= MASK[bitsPerRGB];
+    return (XcmsSuccess);
+}
+
+\f
+
+typedef int (*comparProcp)(
+    char *p1,
+    char *p2);
+typedef int (*interpolProcp)(
+    char *key,
+    char *lo,
+    char *hi,
+    char *answer,
+    int bitsPerRGB);
+
+/*
+ *     NAME
+ *             _XcmsTableSearch
+ *
+ *     SYNOPSIS
+ */
+static int
+_XcmsTableSearch(
+    char *key,
+    int bitsPerRGB,
+    char *base,
+    unsigned nel,
+    unsigned nKeyPtrSize,
+    int (*compar)(
+        char *p1,
+        char *p2),
+    int (*interpol)(
+        char *key,
+        char *lo,
+        char *hi,
+        char *answer,
+        int bitsPerRGB),
+    char *answer)
+
+/*
+ *     DESCRIPTION
+ *             A binary search through the specificied table.
+ *
+ *     RETURNS
+ *             Returns 0 if failed; otherwise non-zero.
+ *
+ */
+{
+    char *hi, *lo, *mid, *last;
+    int result;
+
+    last = hi = base + ((nel - 1) * nKeyPtrSize);
+    mid = lo = base;
+
+    /* use only the significants bits, then scale into 16 bits */
+    ((IntensityRec *)key)->value = ((unsigned long)
+           (((IntensityRec *)key)->value >> (16 - bitsPerRGB)) * 0xFFFF)
+           / ((1 << bitsPerRGB) - 1);
+
+    /* Special case so that zero intensity always maps to zero value */
+    if ((*compar) (key,lo) <= 0) {
+       memcpy (answer, lo, nKeyPtrSize);
+       ((IntensityRec *)answer)->value &= MASK[bitsPerRGB];
+       return XcmsSuccess;
+    }
+    while (mid != last) {
+       last = mid;
+       mid = lo + (((unsigned)(hi - lo) / nKeyPtrSize) / 2) * nKeyPtrSize;
+       result = (*compar) (key, mid);
+       if (result == 0) {
+
+           memcpy(answer, mid, nKeyPtrSize);
+           ((IntensityRec *)answer)->value &= MASK[bitsPerRGB];
+           return (XcmsSuccess);
+       } else if (result < 0) {
+           hi = mid;
+       } else {
+           lo = mid;
+       }
+    }
+
+    /*
+     * If we got to here, we didn't find a solution, so we
+     * need to apply interpolation.
+     */
+    return ((*interpol)(key, lo, hi, answer, bitsPerRGB));
+}
+
+\f
+/*
+ *      NAME
+ *             _XcmsMatVec - multiply a 3 x 3 by a 3 x 1 vector
+ *
+ *     SYNOPSIS
+ */
+static void _XcmsMatVec(
+    XcmsFloat *pMat, XcmsFloat *pIn, XcmsFloat *pOut)
+/*
+ *      DESCRIPTION
+ *             Multiply the passed vector by the passed matrix to return a
+ *             vector. Matrix is 3x3, vectors are of length 3.
+ *
+ *     RETURNS
+ *             void
+ */
+{
+    int i, j;
+
+    for (i = 0; i < 3; i++) {
+       pOut[i] = 0.0;
+       for (j = 0; j < 3; j++)
+           pOut[i] += *(pMat+(i*3)+j) * pIn[j];
+    }
+}
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+
+/*
+ *     NAME
+ *             XcmsLRGB_RGB_ParseString
+ *
+ *     SYNOPSIS
+ */
+static int
+XcmsLRGB_RGB_ParseString(
+    register char *spec,
+    XcmsColor *pColor)
+/*
+ *     DESCRIPTION
+ *             This routines takes a string and attempts to convert
+ *             it into a XcmsColor structure with XcmsRGBFormat.
+ *
+ *     RETURNS
+ *             0 if failed, non-zero otherwise.
+ */
+{
+    register int n, i;
+    unsigned short r, g, b;
+    char c;
+    char *pchar;
+    unsigned short *pShort;
+
+    /*
+     * Check for old # format
+     */
+    if (*spec == '#') {
+       /*
+        * Attempt to parse the value portion.
+        */
+       spec++;
+       n = strlen(spec);
+       if (n != 3 && n != 6 && n != 9 && n != 12) {
+           return(XcmsFailure);
+       }
+
+       n /= 3;
+       g = b = 0;
+       do {
+           r = g;
+           g = b;
+           b = 0;
+           for (i = n; --i >= 0; ) {
+               c = *spec++;
+               b <<= 4;
+               if (c >= '0' && c <= '9')
+                   b |= c - '0';
+               /* assume string in lowercase
+               else if (c >= 'A' && c <= 'F')
+                   b |= c - ('A' - 10);
+               */
+               else if (c >= 'a' && c <= 'f')
+                   b |= c - ('a' - 10);
+               else return (XcmsFailure);
+           }
+       } while (*spec != '\0');
+
+       /*
+        * Succeeded !
+        */
+       n <<= 2;
+       n = 16 - n;
+       /* shift instead of scale, to match old broken semantics */
+       pColor->spec.RGB.red = r << n;
+       pColor->spec.RGB.green = g << n;
+       pColor->spec.RGB.blue =  b << n;
+    } else {
+       if ((pchar = strchr(spec, ':')) == NULL) {
+           return(XcmsFailure);
+       }
+       n = (int)(pchar - spec);
+
+       /*
+        * Check for proper prefix.
+        */
+       if (strncmp(spec, _XcmsRGB_prefix, n) != 0) {
+           return(XcmsFailure);
+       }
+
+       /*
+        * Attempt to parse the value portion.
+        */
+       spec += (n + 1);
+       pShort = &pColor->spec.RGB.red;
+       for (i = 0; i < 3; i++, pShort++, spec++) {
+           n = 0;
+           *pShort = 0;
+           while (*spec != '/' && *spec != '\0') {
+               if (++n > 4) {
+                   return(XcmsFailure);
+               }
+               c = *spec++;
+               *pShort <<= 4;
+               if (c >= '0' && c <= '9')
+                   *pShort |= c - '0';
+               /* assume string in lowercase
+               else if (c >= 'A' && c <= 'F')
+                   *pShort |= c - ('A' - 10);
+               */
+               else if (c >= 'a' && c <= 'f')
+                   *pShort |= c - ('a' - 10);
+               else return (XcmsFailure);
+           }
+           if (n == 0)
+               return (XcmsFailure);
+           if (n < 4) {
+               *pShort = ((unsigned long)*pShort * 0xFFFF) / ((1 << n*4) - 1);
+           }
+       }
+    }
+    pColor->format = XcmsRGBFormat;
+    pColor->pixel = 0;
+    return (XcmsSuccess);
+}
+
+\f
+/*
+ *     NAME
+ *             XcmsLRGB_RGBi_ParseString
+ *
+ *     SYNOPSIS
+ */
+static int
+XcmsLRGB_RGBi_ParseString(
+    register char *spec,
+    XcmsColor *pColor)
+/*
+ *     DESCRIPTION
+ *             This routines takes a string and attempts to convert
+ *             it into a XcmsColor structure with XcmsRGBiFormat.
+ *             The assumed RGBi string syntax is:
+ *                 RGBi:<r>/<g>/<b>
+ *             Where r, g, and b are in string input format for floats
+ *             consisting of:
+ *                 a. an optional sign
+ *                 b. a string of numbers possibly containing a decimal point,
+ *                 c. an optional exponent field containing an 'E' or 'e'
+ *                     followed by a possibly signed integer string.
+ *
+ *     RETURNS
+ *             0 if failed, non-zero otherwise.
+ */
+{
+    int n;
+    char *pchar;
+
+    if ((pchar = strchr(spec, ':')) == NULL) {
+       return(XcmsFailure);
+    }
+    n = (int)(pchar - spec);
+
+    /*
+     * Check for proper prefix.
+     */
+    if (strncmp(spec, _XcmsRGBi_prefix, n) != 0) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Attempt to parse the value portion.
+     */
+    if (sscanf(spec + n + 1, "%lf/%lf/%lf",
+           &pColor->spec.RGBi.red,
+           &pColor->spec.RGBi.green,
+           &pColor->spec.RGBi.blue) != 3) {
+        char *s; /* Maybe failed due to locale */
+        int f;
+        if ((s = strdup(spec))) {
+            for (f = 0; s[f]; ++f)
+                if (s[f] == '.')
+                    s[f] = ',';
+                else if (s[f] == ',')
+                    s[f] = '.';
+           if (sscanf(s + n + 1, "%lf/%lf/%lf",
+                      &pColor->spec.RGBi.red,
+                      &pColor->spec.RGBi.green,
+                      &pColor->spec.RGBi.blue) != 3) {
+                free(s);
+                return(XcmsFailure);
+            }
+            free(s);
+        } else
+           return(XcmsFailure);
+    }
+
+    /*
+     * Succeeded !
+     */
+    pColor->format = XcmsRGBiFormat;
+    pColor->pixel = 0;
+    return (XcmsSuccess);
+}
+
+\f
+/*
+ *     NAME
+ *             XcmsCIEXYZToRGBi - convert CIE XYZ to RGB
+ *
+ *     SYNOPSIS
+ */
+/* ARGSUSED */
+Status
+XcmsCIEXYZToRGBi(
+    XcmsCCC ccc,
+    XcmsColor *pXcmsColors_in_out,/* pointer to XcmsColors to convert  */
+    unsigned int nColors,      /* Number of colors                     */
+    Bool *pCompressed)         /* pointer to an array of Bool          */
+/*
+ *     DESCRIPTION
+ *             Converts color specifications in an array of XcmsColor
+ *             structures from RGB format to RGBi format.
+ *
+ *     RETURNS
+ *             XcmsFailure if failed,
+ *             XcmsSuccess if succeeded without gamut compression.
+ *             XcmsSuccessWithCompression if succeeded with gamut
+ *                     compression.
+ */
+{
+    LINEAR_RGB_SCCData *pScreenData;
+    XcmsFloat tmp[3];
+    int hasCompressed = 0;
+    unsigned int i;
+    XcmsColor *pColor = pXcmsColors_in_out;
+
+    if (ccc == NULL) {
+       return(XcmsFailure);
+    }
+
+    pScreenData = (LINEAR_RGB_SCCData *)ccc->pPerScrnInfo->screenData;
+
+    /*
+     * XcmsColors should be White Point Adjusted, if necessary, by now!
+     */
+
+    /*
+     * NEW!!! for extended gamut compression
+     *
+     * 1. Need to zero out pCompressed
+     *
+     * 2. Need to save initial address of pColor
+     *
+     * 3. Need to save initial address of pCompressed
+     */
+
+    for (i = 0; i < nColors; i++) {
+
+       /* Make sure format is XcmsCIEXYZFormat */
+       if (pColor->format != XcmsCIEXYZFormat) {
+           return(XcmsFailure);
+       }
+
+       /* Multiply [A]-1 * [XYZ] to get RGB intensity */
+       _XcmsMatVec((XcmsFloat *) pScreenData->XYZtoRGBmatrix,
+               (XcmsFloat *) &pColor->spec, tmp);
+
+       if ((MIN3 (tmp[0], tmp[1], tmp[2]) < -EPS) ||
+           (MAX3 (tmp[0], tmp[1], tmp[2]) > (1.0 + EPS))) {
+
+           /*
+            * RGBi out of screen's gamut
+            */
+
+           if (ccc->gamutCompProc == NULL) {
+               /*
+                * Aha!! Here's that little trick that will allow
+                * gamut compression routines to get the out of bound
+                * RGBi.
+                */
+               memcpy((char *)&pColor->spec, (char *)tmp, sizeof(tmp));
+               pColor->format = XcmsRGBiFormat;
+               return(XcmsFailure);
+           } else if ((*ccc->gamutCompProc)(ccc, pXcmsColors_in_out, nColors,
+                   i, pCompressed) == 0) {
+               return(XcmsFailure);
+           }
+
+           /*
+            * The gamut compression function should return colors in CIEXYZ
+            *  Also check again to if the new color is within gamut.
+            */
+           if (pColor->format != XcmsCIEXYZFormat) {
+               return(XcmsFailure);
+           }
+           _XcmsMatVec((XcmsFloat *) pScreenData->XYZtoRGBmatrix,
+                   (XcmsFloat *) &pColor->spec, tmp);
+           if ((MIN3 (tmp[0], tmp[1], tmp[2]) < -EPS) ||
+               (MAX3 (tmp[0], tmp[1], tmp[2]) > (1.0 + EPS))) {
+               return(XcmsFailure);
+           }
+           hasCompressed++;
+       }
+       memcpy((char *)&pColor->spec, (char *)tmp, sizeof(tmp));
+       /* These if statements are done to ensure the fudge factor is */
+       /* is taken into account. */
+       if (pColor->spec.RGBi.red < 0.0) {
+               pColor->spec.RGBi.red = 0.0;
+       } else if (pColor->spec.RGBi.red > 1.0) {
+               pColor->spec.RGBi.red = 1.0;
+       }
+       if (pColor->spec.RGBi.green < 0.0) {
+               pColor->spec.RGBi.green = 0.0;
+       } else if (pColor->spec.RGBi.green > 1.0) {
+               pColor->spec.RGBi.green = 1.0;
+       }
+       if (pColor->spec.RGBi.blue < 0.0) {
+               pColor->spec.RGBi.blue = 0.0;
+       } else if (pColor->spec.RGBi.blue > 1.0) {
+               pColor->spec.RGBi.blue = 1.0;
+       }
+       (pColor++)->format = XcmsRGBiFormat;
+    }
+    return (hasCompressed ? XcmsSuccessWithCompression : XcmsSuccess);
+}
+
+\f
+/*
+ *     NAME
+ *             LINEAR_RGBi_to_CIEXYZ - convert RGBi to CIEXYZ
+ *
+ *     SYNOPSIS
+ */
+/* ARGSUSED */
+Status
+XcmsRGBiToCIEXYZ(
+    XcmsCCC ccc,
+    XcmsColor *pXcmsColors_in_out,/* pointer to XcmsColors to convert  */
+    unsigned int nColors,      /* Number of colors                     */
+    Bool *pCompressed)         /* pointer to a bit array               */
+/*
+ *     DESCRIPTION
+ *             Converts color specifications in an array of XcmsColor
+ *             structures from RGBi format to CIEXYZ format.
+ *
+ *     RETURNS
+ *             XcmsFailure if failed,
+ *             XcmsSuccess if succeeded.
+ */
+{
+    LINEAR_RGB_SCCData *pScreenData;
+    XcmsFloat tmp[3];
+
+    /*
+     * pCompressed ignored in this function.
+     */
+
+    if (ccc == NULL) {
+       return(XcmsFailure);
+    }
+
+    pScreenData = (LINEAR_RGB_SCCData *)ccc->pPerScrnInfo->screenData;
+
+    /*
+     * XcmsColors should be White Point Adjusted, if necessary, by now!
+     */
+
+    while (nColors--) {
+
+       /* Multiply [A]-1 * [XYZ] to get RGB intensity */
+       _XcmsMatVec((XcmsFloat *) pScreenData->RGBtoXYZmatrix,
+               (XcmsFloat *) &pXcmsColors_in_out->spec, tmp);
+
+       memcpy((char *)&pXcmsColors_in_out->spec, (char *)tmp, sizeof(tmp));
+       (pXcmsColors_in_out++)->format = XcmsCIEXYZFormat;
+    }
+    return(XcmsSuccess);
+}
+
+\f
+/*
+ *     NAME
+ *             XcmsRGBiToRGB
+ *
+ *     SYNOPSIS
+ */
+/* ARGSUSED */
+Status
+XcmsRGBiToRGB(
+    XcmsCCC ccc,
+    XcmsColor *pXcmsColors_in_out,/* pointer to XcmsColors to convert  */
+    unsigned int nColors,      /* Number of colors                     */
+    Bool *pCompressed)         /* pointer to a bit array               */
+/*
+ *     DESCRIPTION
+ *             Converts color specifications in an array of XcmsColor
+ *             structures from RGBi format to RGB format.
+ *
+ *     RETURNS
+ *             XcmsFailure if failed,
+ *             XcmsSuccess if succeeded without gamut compression.
+ *             XcmsSuccessWithCompression if succeeded with gamut
+ *                     compression.
+ */
+{
+    LINEAR_RGB_SCCData *pScreenData;
+    XcmsRGB tmpRGB;
+    IntensityRec keyIRec, answerIRec;
+
+    /*
+     * pCompressed ignored in this function.
+     */
+
+    if (ccc == NULL) {
+       return(XcmsFailure);
+    }
+
+    pScreenData = (LINEAR_RGB_SCCData *)ccc->pPerScrnInfo->screenData;
+
+    while (nColors--) {
+
+       /* Make sure format is XcmsRGBiFormat */
+       if (pXcmsColors_in_out->format != XcmsRGBiFormat) {
+           return(XcmsFailure);
+       }
+
+       keyIRec.intensity = pXcmsColors_in_out->spec.RGBi.red;
+       if (!_XcmsTableSearch((char *)&keyIRec, ccc->visual->bits_per_rgb,
+               (char *)pScreenData->pRedTbl->pBase,
+               (unsigned)pScreenData->pRedTbl->nEntries,
+               (unsigned)sizeof(IntensityRec),
+               (comparProcp)_XcmsIntensityCmp, (interpolProcp)_XcmsIntensityInterpolation, (char *)&answerIRec)) {
+           return(XcmsFailure);
+       }
+       tmpRGB.red = answerIRec.value;
+
+       keyIRec.intensity = pXcmsColors_in_out->spec.RGBi.green;
+       if (!_XcmsTableSearch((char *)&keyIRec, ccc->visual->bits_per_rgb,
+               (char *)pScreenData->pGreenTbl->pBase,
+               (unsigned)pScreenData->pGreenTbl->nEntries,
+               (unsigned)sizeof(IntensityRec),
+               (comparProcp)_XcmsIntensityCmp, (interpolProcp)_XcmsIntensityInterpolation, (char *)&answerIRec)) {
+           return(XcmsFailure);
+       }
+       tmpRGB.green = answerIRec.value;
+
+       keyIRec.intensity = pXcmsColors_in_out->spec.RGBi.blue;
+       if (!_XcmsTableSearch((char *)&keyIRec, ccc->visual->bits_per_rgb,
+               (char *)pScreenData->pBlueTbl->pBase,
+               (unsigned)pScreenData->pBlueTbl->nEntries,
+               (unsigned)sizeof(IntensityRec),
+               (comparProcp)_XcmsIntensityCmp, (interpolProcp)_XcmsIntensityInterpolation, (char *)&answerIRec)) {
+           return(XcmsFailure);
+       }
+       tmpRGB.blue = answerIRec.value;
+
+       memcpy((char *)&pXcmsColors_in_out->spec, (char *)&tmpRGB, sizeof(XcmsRGB));
+       (pXcmsColors_in_out++)->format = XcmsRGBFormat;
+    }
+    return(XcmsSuccess);
+}
+
+\f
+/*
+ *     NAME
+ *             XcmsRGBToRGBi
+ *
+ *     SYNOPSIS
+ */
+/* ARGSUSED */
+Status
+XcmsRGBToRGBi(
+    XcmsCCC ccc,
+    XcmsColor *pXcmsColors_in_out,/* pointer to XcmsColors to convert  */
+    unsigned int nColors,      /* Number of colors                     */
+    Bool *pCompressed)         /* pointer to a bit array               */
+/*
+ *     DESCRIPTION
+ *             Converts color specifications in an array of XcmsColor
+ *             structures from RGB format to RGBi format.
+ *
+ *     RETURNS
+ *             XcmsFailure if failed,
+ *             XcmsSuccess if succeeded.
+ */
+{
+    LINEAR_RGB_SCCData *pScreenData;
+    XcmsRGBi tmpRGBi;
+    IntensityRec keyIRec, answerIRec;
+
+    /*
+     * pCompressed ignored in this function.
+     */
+
+    if (ccc == NULL) {
+       return(XcmsFailure);
+    }
+
+    pScreenData = (LINEAR_RGB_SCCData *)ccc->pPerScrnInfo->screenData;
+
+    while (nColors--) {
+
+       /* Make sure format is XcmsRGBFormat */
+       if (pXcmsColors_in_out->format != XcmsRGBFormat) {
+           return(XcmsFailure);
+       }
+
+       keyIRec.value = pXcmsColors_in_out->spec.RGB.red;
+       if (!_XcmsTableSearch((char *)&keyIRec, ccc->visual->bits_per_rgb,
+               (char *)pScreenData->pRedTbl->pBase,
+               (unsigned)pScreenData->pRedTbl->nEntries,
+               (unsigned)sizeof(IntensityRec),
+               (comparProcp)_XcmsValueCmp, (interpolProcp)_XcmsValueInterpolation, (char *)&answerIRec)) {
+           return(XcmsFailure);
+       }
+       tmpRGBi.red = answerIRec.intensity;
+
+       keyIRec.value = pXcmsColors_in_out->spec.RGB.green;
+       if (!_XcmsTableSearch((char *)&keyIRec, ccc->visual->bits_per_rgb,
+               (char *)pScreenData->pGreenTbl->pBase,
+               (unsigned)pScreenData->pGreenTbl->nEntries,
+               (unsigned)sizeof(IntensityRec),
+               (comparProcp)_XcmsValueCmp, (interpolProcp)_XcmsValueInterpolation, (char *)&answerIRec)) {
+           return(XcmsFailure);
+       }
+       tmpRGBi.green = answerIRec.intensity;
+
+       keyIRec.value = pXcmsColors_in_out->spec.RGB.blue;
+       if (!_XcmsTableSearch((char *)&keyIRec, ccc->visual->bits_per_rgb,
+               (char *)pScreenData->pBlueTbl->pBase,
+               (unsigned)pScreenData->pBlueTbl->nEntries,
+               (unsigned)sizeof(IntensityRec),
+               (comparProcp)_XcmsValueCmp, (interpolProcp)_XcmsValueInterpolation, (char *)&answerIRec)) {
+           return(XcmsFailure);
+       }
+       tmpRGBi.blue = answerIRec.intensity;
+
+       memcpy((char *)&pXcmsColors_in_out->spec, (char *)&tmpRGBi, sizeof(XcmsRGBi));
+       (pXcmsColors_in_out++)->format = XcmsRGBiFormat;
+    }
+    return(XcmsSuccess);
+}
+\f
+/*
+ *     NAME
+ *             _XcmsInitScrnDefaultInfo
+ *
+ *     SYNOPSIS
+ */
+/* ARGSUSED */
+int
+_XcmsLRGB_InitScrnDefault(
+    Display *dpy,
+    int screenNumber,
+    XcmsPerScrnInfo *pPerScrnInfo)
+/*
+ *     DESCRIPTION
+ *             Given a display and screen number, this routine attempts
+ *             to initialize the Xcms per Screen Info structure
+ *             (XcmsPerScrnInfo) with defaults.
+ *
+ *     RETURNS
+ *             Returns zero if initialization failed; non-zero otherwise.
+ */
+{
+    pPerScrnInfo->screenData = (XPointer)&Default_RGB_SCCData;
+    pPerScrnInfo->screenWhitePt.spec.CIEXYZ.X =
+               Default_RGB_SCCData.RGBtoXYZmatrix[0][0] +
+               Default_RGB_SCCData.RGBtoXYZmatrix[0][1] +
+               Default_RGB_SCCData.RGBtoXYZmatrix[0][2];
+    pPerScrnInfo->screenWhitePt.spec.CIEXYZ.Y =
+               Default_RGB_SCCData.RGBtoXYZmatrix[1][0] +
+               Default_RGB_SCCData.RGBtoXYZmatrix[1][1] +
+               Default_RGB_SCCData.RGBtoXYZmatrix[1][2];
+    pPerScrnInfo->screenWhitePt.spec.CIEXYZ.Z =
+               Default_RGB_SCCData.RGBtoXYZmatrix[2][0] +
+               Default_RGB_SCCData.RGBtoXYZmatrix[2][1] +
+               Default_RGB_SCCData.RGBtoXYZmatrix[2][2];
+    if ((pPerScrnInfo->screenWhitePt.spec.CIEXYZ.Y < (1.0 - EPS) )
+           || (pPerScrnInfo->screenWhitePt.spec.CIEXYZ.Y > (1.0 + EPS))) {
+       pPerScrnInfo->screenData = (XPointer)NULL;
+       pPerScrnInfo->state = XcmsInitNone;
+       return(0);
+    }
+    pPerScrnInfo->screenWhitePt.spec.CIEXYZ.Y = 1.0;
+    pPerScrnInfo->screenWhitePt.format = XcmsCIEXYZFormat;
+    pPerScrnInfo->screenWhitePt.pixel = 0;
+    pPerScrnInfo->functionSet = (XPointer)&XcmsLinearRGBFunctionSet;
+    pPerScrnInfo->state = XcmsInitFailure; /* default initialization */
+    return(1);
+}
diff --git a/src/xcms/Lab.c b/src/xcms/Lab.c
new file mode 100644 (file)
index 0000000..02c8d3b
--- /dev/null
@@ -0,0 +1,431 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of XCMS based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *         CIELab.c
+ *
+ *     DESCRIPTION
+ *             This file contains routines that support the CIE L*a*b*
+ *             color space to include conversions to and from the CIE
+ *             XYZ space.  These conversions are from Principles of
+ *             Color Technology Second Edition, Fred W. Billmeyer, Jr.
+ *             and Max Saltzman, John Wiley & Sons, Inc., 1981.
+ *
+ *             Note that the range for L* is 0 to 1.
+ */
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <X11/Xos.h>
+#include <stdio.h> /* sscanf */
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+/*
+ *     DEFINES
+ *             Internal definitions that need NOT be exported to any package
+ *             or program using this package.
+ */
+#ifdef DBL_EPSILON
+#  define XMY_DBL_EPSILON DBL_EPSILON
+#else
+#  define XMY_DBL_EPSILON 0.00001
+#endif
+#define DIV16BY116     0.137931
+
+/*
+ *     FORWARD DECLARATIONS
+ */
+
+static int CIELab_ParseString(register char *spec, XcmsColor *pColor);
+static Status XcmsCIELab_ValidSpec(XcmsColor *pColor);
+
+
+/*
+ *     LOCAL VARIABLES
+ */
+
+
+    /*
+     * NULL terminated list of functions applied to get from CIELab to CIEXYZ
+     */
+static XcmsConversionProc Fl_CIELab_to_CIEXYZ[] = {
+    XcmsCIELabToCIEXYZ,
+    NULL
+};
+
+    /*
+     * NULL terminated list of functions applied to get from CIEXYZ to CIELab
+     */
+static XcmsConversionProc Fl_CIEXYZ_to_CIELab[] = {
+    XcmsCIEXYZToCIELab,
+    NULL
+};
+
+
+/*
+ *     GLOBALS
+ */
+    /*
+     * CIE Lab Color Space
+     */
+XcmsColorSpace XcmsCIELabColorSpace =
+    {
+       _XcmsCIELab_prefix,     /* prefix */
+       XcmsCIELabFormat,               /* id */
+       CIELab_ParseString,     /* parseString */
+       Fl_CIELab_to_CIEXYZ,    /* to_CIEXYZ */
+       Fl_CIEXYZ_to_CIELab,    /* from_CIEXYZ */
+       1
+    };
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PRIVATE ROUTINES                               *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             CIELab_ParseString
+ *
+ *     SYNOPSIS
+ */
+static int
+CIELab_ParseString(
+    register char *spec,
+    XcmsColor *pColor)
+/*
+ *     DESCRIPTION
+ *             This routines takes a string and attempts to convert
+ *             it into a XcmsColor structure with XcmsCIELabFormat.
+ *             The assumed CIELab string syntax is:
+ *                 CIELab:<L>/<a>/<b>
+ *             Where L, a, and b are in string input format for floats
+ *             consisting of:
+ *                 a. an optional sign
+ *                 b. a string of numbers possibly containing a decimal point,
+ *                 c. an optional exponent field containing an 'E' or 'e'
+ *                     followed by a possibly signed integer string.
+ *
+ *     RETURNS
+ *             0 if failed, non-zero otherwise.
+ */
+{
+    int n;
+    char *pchar;
+
+    if ((pchar = strchr(spec, ':')) == NULL) {
+       return(XcmsFailure);
+    }
+    n = (int)(pchar - spec);
+
+    /*
+     * Check for proper prefix.
+     */
+    if (strncmp(spec, _XcmsCIELab_prefix, n) != 0) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Attempt to parse the value portion.
+     */
+    if (sscanf(spec + n + 1, "%lf/%lf/%lf",
+           &pColor->spec.CIELab.L_star,
+           &pColor->spec.CIELab.a_star,
+           &pColor->spec.CIELab.b_star) != 3) {
+        char *s; /* Maybe failed due to locale */
+        int f;
+        if ((s = strdup(spec))) {
+            for (f = 0; s[f]; ++f)
+                if (s[f] == '.')
+                    s[f] = ',';
+                else if (s[f] == ',')
+                    s[f] = '.';
+           if (sscanf(s + n + 1, "%lf/%lf/%lf",
+                      &pColor->spec.CIELab.L_star,
+                      &pColor->spec.CIELab.a_star,
+                      &pColor->spec.CIELab.b_star) != 3) {
+                free(s);
+                return(XcmsFailure);
+            }
+            free(s);
+        } else
+           return(XcmsFailure);
+    }
+    pColor->format = XcmsCIELabFormat;
+    pColor->pixel = 0;
+
+    return(XcmsCIELab_ValidSpec(pColor));
+}
+
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsCIELab_ValidSpec
+ *
+ *     SYNOPSIS
+ */
+static Status
+XcmsCIELab_ValidSpec(
+    XcmsColor *pColor)
+/*
+ *     DESCRIPTION
+ *             Checks if color specification valid for CIE L*a*b*.
+ *
+ *     RETURNS
+ *             XcmsFailure if invalid,
+ *             XcmsSuccess if valid.
+ *
+ */
+{
+    if (pColor->format != XcmsCIELabFormat
+           ||
+           (pColor->spec.CIELab.L_star < 0.0 - XMY_DBL_EPSILON)
+           ||
+           (pColor->spec.CIELab.L_star > 100.0 + XMY_DBL_EPSILON)) {
+       return(XcmsFailure);
+    }
+    return(XcmsSuccess);
+}
+
+\f
+/*
+ *     NAME
+ *             XcmsCIELabToCIEXYZ - convert CIELab to CIEXYZ
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsCIELabToCIEXYZ(
+    XcmsCCC ccc,
+    XcmsColor *pLab_WhitePt,
+    XcmsColor *pColors_in_out,
+    unsigned int nColors)
+/*
+ *     DESCRIPTION
+ *             Converts color specifications in an array of XcmsColor
+ *             structures from CIELab format to CIEXYZ format.
+ *
+ *             WARNING: This routine assumes that Yn = 1.0;
+ *
+ *     RETURNS
+ *             XcmsFailure if failed,
+ *             XcmsSuccess if succeeded.
+ *
+ */
+{
+    XcmsCIEXYZ XYZ_return;
+    XcmsFloat tmpFloat, tmpL;
+    XcmsColor whitePt;
+    int i;
+    XcmsColor *pColor = pColors_in_out;
+
+    /*
+     * Check arguments
+     */
+    if (pLab_WhitePt == NULL || pColors_in_out == NULL) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Make sure white point is in CIEXYZ form, if not, convert it.
+     */
+    if (pLab_WhitePt->format != XcmsCIEXYZFormat) {
+       /* Make a copy of the white point because we're going to modify it */
+       memcpy((char *)&whitePt, (char *)pLab_WhitePt, sizeof(XcmsColor));
+       if (!_XcmsDIConvertColors(ccc, &whitePt,
+               (XcmsColor *)NULL, 1, XcmsCIEXYZFormat)) {
+           return(XcmsFailure);
+       }
+       pLab_WhitePt = &whitePt;
+    }
+
+    /*
+     * Make sure it is a white point, i.e., Y == 1.0
+     */
+    if (pLab_WhitePt->spec.CIEXYZ.Y != 1.0) {
+       return (0);
+    }
+
+    /*
+     * Now convert each XcmsColor structure to CIEXYZ form
+     */
+    for (i = 0; i < nColors; i++, pColor++) {
+
+       /* Make sure original format is CIELab */
+       if (!XcmsCIELab_ValidSpec(pColor)) {
+           return(XcmsFailure);
+       }
+
+       /* Calculate Y: assume that Yn = 1.0 */
+       tmpL = (pColor->spec.CIELab.L_star + 16.0) / 116.0;
+       XYZ_return.Y = tmpL * tmpL * tmpL;
+
+       if (XYZ_return.Y < 0.008856) {
+           /* Calculate Y: assume that Yn = 1.0 */
+           tmpL = pColor->spec.CIELab.L_star / 9.03292;
+
+           /* Calculate X */
+           XYZ_return.X = pLab_WhitePt->spec.CIEXYZ.X *
+                   ((pColor->spec.CIELab.a_star / 3893.5) + tmpL);
+           /* Calculate Y */
+           XYZ_return.Y = tmpL;
+           /* Calculate Z */
+           XYZ_return.Z = pLab_WhitePt->spec.CIEXYZ.Z *
+                   (tmpL - (pColor->spec.CIELab.b_star / 1557.4));
+       } else {
+           /* Calculate X */
+           tmpFloat = tmpL + (pColor->spec.CIELab.a_star / 5.0);
+           XYZ_return.X = pLab_WhitePt->spec.CIEXYZ.X * tmpFloat * tmpFloat * tmpFloat;
+
+           /* Calculate Z */
+           tmpFloat = tmpL - (pColor->spec.CIELab.b_star / 2.0);
+           XYZ_return.Z = pLab_WhitePt->spec.CIEXYZ.Z * tmpFloat * tmpFloat * tmpFloat;
+       }
+
+       memcpy((char *)&pColor->spec.CIEXYZ, (char *)&XYZ_return,
+              sizeof(XcmsCIEXYZ));
+       pColor->format = XcmsCIEXYZFormat;
+    }
+
+    return (1);
+}
+
+\f
+/*
+ *     NAME
+ *             XcmsCIEXYZToCIELab - convert CIEXYZ to CIELab
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsCIEXYZToCIELab(
+    XcmsCCC ccc,
+    XcmsColor *pLab_WhitePt,
+    XcmsColor *pColors_in_out,
+    unsigned int nColors)
+/*
+ *     DESCRIPTION
+ *             Converts color specifications in an array of XcmsColor
+ *             structures from CIEXYZ format to CIELab format.
+ *
+ *             WARNING: This routine assumes that Yn = 1.0;
+ *
+ *     RETURNS
+ *             XcmsFailure if failed,
+ *             XcmsSuccess if succeeded.
+ *
+ */
+{
+    XcmsCIELab Lab_return;
+    XcmsFloat fX_Xn, fY_Yn, fZ_Zn;
+    XcmsColor whitePt;
+    int i;
+    XcmsColor *pColor = pColors_in_out;
+
+    /*
+     * Check arguments
+     */
+    if (pLab_WhitePt == NULL || pColors_in_out == NULL) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Make sure white point is in CIEXYZ form, if not, convert it.
+     */
+    if (pLab_WhitePt->format != XcmsCIEXYZFormat) {
+       /* Make a copy of the white point because we're going to modify it */
+       memcpy((char *)&whitePt, (char *)pLab_WhitePt, sizeof(XcmsColor));
+       if (!_XcmsDIConvertColors(ccc, &whitePt, (XcmsColor *)NULL,
+               1, XcmsCIEXYZFormat)) {
+           return(XcmsFailure);
+       }
+       pLab_WhitePt = &whitePt;
+    }
+
+    /*
+     * Make sure it is a white point, i.e., Y == 1.0
+     */
+    if (pLab_WhitePt->spec.CIEXYZ.Y != 1.0) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Now convert each XcmsColor structure to CIEXYZ form
+     */
+    for (i = 0; i < nColors; i++, pColor++) {
+
+       /* Make sure original format is CIELab */
+       if (!_XcmsCIEXYZ_ValidSpec(pColor)) {
+           return(XcmsFailure);
+       }
+
+       /* Calculate L*:  assume Yn = 1.0 */
+       if (pColor->spec.CIEXYZ.Y < 0.008856) {
+           fY_Yn = (0.07787 * pColor->spec.CIEXYZ.Y) + DIV16BY116;
+           /* note fY_Yn used to compute Lab_return.a below */
+           Lab_return.L_star = 116.0 * (fY_Yn - DIV16BY116);
+       } else {
+           fY_Yn = (XcmsFloat)XCMS_CUBEROOT(pColor->spec.CIEXYZ.Y);
+           /* note fY_Yn used to compute Lab_return.a_star below */
+           Lab_return.L_star = (116.0 * fY_Yn) - 16.0;
+       }
+
+       /* Calculate f(X/Xn) */
+       if ((fX_Xn = pColor->spec.CIEXYZ.X / pLab_WhitePt->spec.CIEXYZ.X) < 0.008856) {
+           fX_Xn = (0.07787 * fX_Xn) + DIV16BY116;
+       } else {
+           fX_Xn = (XcmsFloat) XCMS_CUBEROOT(fX_Xn);
+       }
+
+       /* Calculate f(Z/Zn) */
+       if ((fZ_Zn = pColor->spec.CIEXYZ.Z / pLab_WhitePt->spec.CIEXYZ.Z) < 0.008856) {
+           fZ_Zn = (0.07787 * fZ_Zn) + DIV16BY116;
+       } else {
+           fZ_Zn = (XcmsFloat) XCMS_CUBEROOT(fZ_Zn);
+       }
+
+       Lab_return.a_star = 5.0 * (fX_Xn - fY_Yn);
+       Lab_return.b_star = 2.0 * (fY_Yn - fZ_Zn);
+
+       memcpy((char *)&pColor->spec.CIELab, (char *)&Lab_return,
+              sizeof(XcmsCIELab));
+       pColor->format = XcmsCIELabFormat;
+    }
+
+    return(XcmsSuccess);
+}
diff --git a/src/xcms/LabGcC.c b/src/xcms/LabGcC.c
new file mode 100644 (file)
index 0000000..a5ec9f4
--- /dev/null
@@ -0,0 +1,127 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of XCMS based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *     NAME
+ *             CIELabGcC.c
+ *
+ *     DESCRIPTION
+ *             Source for XcmsCIELabClipuv() gamut compression routine.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsCIELabClipab - Reduce the chroma for a hue and L*
+ *
+ *     SYNOPSIS
+ */
+/* ARGSUSED */
+Status
+XcmsCIELabClipab (
+    XcmsCCC ccc,
+    XcmsColor *pColors_in_out,
+    unsigned int nColors,
+    unsigned int i,
+    Bool *pCompressed)
+/*
+ *     DESCRIPTION
+ *             Reduce the Chroma for a specific hue and chroma to
+ *             to bring the given color into the gamut of the
+ *             specified device.  As required of gamut compression
+ *             functions, this routine returns pColor_in_out
+ *             in XcmsCIEXYZFormat on successful completion.
+ *
+ *             Since this routine works with the L* within
+ *             pColor_in_out intermediate results may be returned
+ *             even though it may be invalid.
+ *
+ *     RETURNS
+ *             XcmsFailure - Failure
+ *              XcmsSuccess - Succeeded
+ *
+ */
+{
+    Status retval;
+    XcmsColor *pColor;
+
+    /*
+     * Color specification passed as input can be assumed to:
+     * 1. Be in XcmsCIEXYZFormat
+     * 2. Already be white point adjusted for the Screen White Point.
+     *     This means that the white point now associated with this
+     *     color spec is the Screen White Point (even if the
+     *     ccc->clientWhitePt differs).
+     */
+
+    pColor = pColors_in_out + i;
+
+    if (ccc->visual->class < PseudoColor) {
+       /*
+        * GRAY !
+        */
+       _XcmsDIConvertColors(ccc, pColor, ScreenWhitePointOfCCC(ccc),
+               1, XcmsCIELabFormat);
+       _XcmsDIConvertColors(ccc, pColor, ScreenWhitePointOfCCC(ccc),
+               1, XcmsCIEXYZFormat);
+       if (pCompressed) {
+           *(pCompressed + i) = True;
+       }
+       return(XcmsSuccess);
+    } else {
+       if (pColor->format != XcmsCIELabFormat) {
+           if (_XcmsDIConvertColors(ccc, pColor,
+                   &ccc->pPerScrnInfo->screenWhitePt, 1, XcmsCIELabFormat)
+                   == XcmsFailure) {
+               return(XcmsFailure);
+           }
+       }
+       if (XcmsCIELabQueryMaxC(ccc,
+               degrees(XCMS_CIELAB_PMETRIC_HUE(pColor->spec.CIELab.a_star,
+                                               pColor->spec.CIELab.b_star)),
+               pColor->spec.CIELab.L_star,
+               pColor) == XcmsFailure) {
+           return(XcmsFailure);
+       }
+       retval = _XcmsDIConvertColors(ccc, pColor,
+               &ccc->pPerScrnInfo->screenWhitePt, 1, XcmsCIEXYZFormat);
+       if (retval != XcmsFailure && pCompressed != NULL) {
+           *(pCompressed + i) = True;
+       }
+       return(retval);
+    }
+}
diff --git a/src/xcms/LabGcL.c b/src/xcms/LabGcL.c
new file mode 100644 (file)
index 0000000..3038b18
--- /dev/null
@@ -0,0 +1,174 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of XCMS based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *     NAME
+ *             CIELabGcL.c
+ *
+ *     DESCRIPTION
+ *             Source for XcmsCIELabClipL() gamut compression routine.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsCIELabClipL - Return the closest L*
+ *
+ *     SYNOPSIS
+ */
+/* ARGSUSED */
+Status
+XcmsCIELabClipL (
+    XcmsCCC ccc,
+    XcmsColor *pColors_in_out,
+    unsigned int nColors,
+    unsigned int i,
+    Bool *pCompressed)
+/*
+ *     DESCRIPTION
+ *             Return the closest L* for a specific hue and chroma.
+ *             This routine takes any color as input and outputs
+ *             a CIE XYZ color.
+ *
+ *             Since this routine works with the L* within
+ *             pColor_in_out intermediate results may be returned
+ *             even though it may be invalid.
+ *
+ *     RETURNS
+ *             XcmsFailure - Failure
+ *              XcmsSuccess - Succeeded
+ *
+ */
+{
+    XcmsCCCRec myCCC;
+    XcmsColor  *pColor;
+    XcmsColor   Lab_max;
+    XcmsFloat  hue, chroma, maxChroma;
+    Status retval;
+
+    /* Use my own CCC */
+    memcpy ((char *)&myCCC, (char *)ccc, sizeof(XcmsCCCRec));
+    myCCC.clientWhitePt.format = XcmsUndefinedFormat;/* Inherit Screen WP */
+    myCCC.gamutCompProc = (XcmsCompressionProc)NULL;/* no gamut compression */
+
+    /*
+     * Color specification passed as input can be assumed to:
+     * 1. Be in XcmsCIEXYZFormat
+     * 2. Already be white point adjusted for the Screen White Point.
+     *     This means that the white point now associated with this
+     *     color spec is the Screen White Point (even if the
+     *     ccc->clientWhitePt differs).
+     */
+
+    pColor = pColors_in_out + i;
+
+    if (ccc->visual->class < StaticColor) {
+       /*
+        * GRAY !
+        */
+       return(XcmsFailure);
+    } else {
+       /* Convert from CIEXYZ to CIE L*u*v* format */
+       if (_XcmsDIConvertColors(&myCCC, pColor,
+               ScreenWhitePointOfCCC(&myCCC), 1, XcmsCIELabFormat)
+               == XcmsFailure) {
+           return(XcmsFailure);
+       }
+
+       hue = XCMS_CIELAB_PMETRIC_HUE(pColor->spec.CIELab.a_star,
+                                     pColor->spec.CIELab.b_star);
+       chroma = XCMS_CIELAB_PMETRIC_CHROMA(pColor->spec.CIELab.a_star,
+                                           pColor->spec.CIELab.b_star);
+       /* Step 1: compute the maximum L* and chroma for this hue. */
+       /*         This copy may be overkill but it preserves the pixel etc. */
+       memcpy((char *)&Lab_max, (char *)pColor, sizeof(XcmsColor));
+       if (_XcmsCIELabQueryMaxLCRGB (&myCCC, hue, &Lab_max,
+               (XcmsRGBi *)NULL) == XcmsFailure) {
+           return (XcmsFailure);
+       }
+       maxChroma = XCMS_CIELAB_PMETRIC_CHROMA(Lab_max.spec.CIELab.a_star,
+                                              Lab_max.spec.CIELab.b_star);
+
+       /* Now check and return the appropriate L* */
+       if (chroma == maxChroma) {
+           /* When the chroma input is equal to the maximum chroma */
+           /* merely return the L* for that chroma. */
+           memcpy((char *)pColor, (char *)&Lab_max, sizeof(XcmsColor));
+           retval = _XcmsDIConvertColors(&myCCC, pColor,
+                   ScreenWhitePointOfCCC(&myCCC), 1, XcmsCIEXYZFormat);
+       } else if (chroma > maxChroma) {
+           /* When the chroma input is greater than the maximum chroma */
+           /* merely return the L* and chroma for the given hue. */
+           memcpy((char *)pColor, (char *)&Lab_max, sizeof(XcmsColor));
+           return (XcmsFailure);
+       } else if (pColor->spec.CIELab.L_star < Lab_max.spec.CIELab.L_star) {
+           /* Find the minimum lightness for the given chroma. */
+           if (pColor->format != XcmsCIELabFormat) {
+               if (_XcmsDIConvertColors(ccc, pColor,
+                       ScreenWhitePointOfCCC(ccc), 1, XcmsCIELabFormat)
+                       == XcmsFailure) {
+                   return(XcmsFailure);
+               }
+           }
+           if (XcmsCIELabQueryMinL(&myCCC, degrees(hue), chroma, pColor)
+               == XcmsFailure) {
+                   return (XcmsFailure);
+           }
+           retval = _XcmsDIConvertColors(&myCCC, pColor,
+                          ScreenWhitePointOfCCC(&myCCC), 1, XcmsCIEXYZFormat);
+       } else {
+           /* Find the maximum lightness for the given chroma. */
+           if (pColor->format != XcmsCIELabFormat) {
+               if (_XcmsDIConvertColors(ccc, pColor,
+                             ScreenWhitePointOfCCC(ccc), 1, XcmsCIELabFormat)
+                       == XcmsFailure) {
+                   return(XcmsFailure);
+               }
+           }
+           if (XcmsCIELabQueryMaxL(&myCCC, degrees(hue), chroma, pColor)
+               == XcmsFailure) {
+                   return (XcmsFailure);
+           }
+           retval = _XcmsDIConvertColors(&myCCC, pColor,
+                          ScreenWhitePointOfCCC(&myCCC), 1, XcmsCIEXYZFormat);
+       }
+       if (retval != XcmsFailure && pCompressed != NULL) {
+           *(pCompressed + i) = True;
+       }
+       return(retval);
+    }
+}
diff --git a/src/xcms/LabGcLC.c b/src/xcms/LabGcLC.c
new file mode 100644 (file)
index 0000000..494d34e
--- /dev/null
@@ -0,0 +1,223 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of XCMS based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *     NAME
+ *             CIELabGcLC.c
+ *
+ *     DESCRIPTION
+ *             Source for XcmsCIELabClipLab() gamut
+ *             compression function.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include <math.h>
+#include "Cv.h"
+
+/*
+ *     INTERNALS
+ *             Internal defines that need NOT be exported to any package or
+ *             program using this package.
+ */
+#define MAXBISECTCOUNT 100
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsCIELabClipLab - Return the closest L* and chroma
+ *
+ *     SYNOPSIS
+ */
+/* ARGSUSED */
+Status
+XcmsCIELabClipLab (
+    XcmsCCC ccc,
+    XcmsColor *pColors_in_out,
+    unsigned int nColors,
+    unsigned int i,
+    Bool *pCompressed)
+/*
+ *     DESCRIPTION
+ *             This routine will find the closest L* and chroma
+ *             for a specific hue.  The color input is converted to
+ *             CIE L*u*v* format and returned as CIE XYZ format.
+ *
+ *             Since this routine works with the L* within
+ *             pColor_in_out intermediate results may be returned
+ *             even though it may be invalid.
+ *
+ *     RETURNS
+ *             XcmsFailure - Failure
+ *              XcmsSuccess - Succeeded
+ *
+ */
+{
+    Status retval;
+    XcmsCCCRec myCCC;
+    XcmsColor  *pColor;
+    XcmsColor  Lab_max;
+    XcmsFloat  hue, chroma, maxChroma;
+    XcmsFloat  Chroma, bestChroma, Lstar, maxLstar, saveLstar;
+    XcmsFloat  bestLstar, bestastar, bestbstar;
+    XcmsFloat  nT, saveDist, tmpDist;
+    XcmsRGBi   rgb_max;
+    int                nCount, nMaxCount, nI, nILast;
+
+    /* Use my own CCC */
+    memcpy ((char *)&myCCC, (char *)ccc, sizeof(XcmsCCCRec));
+    myCCC.clientWhitePt.format = XcmsUndefinedFormat;/* inherit screen white */
+    myCCC.gamutCompProc = (XcmsCompressionProc)NULL;/* no gamut compression func */
+
+    /*
+     * Color specification passed as input can be assumed to:
+     * 1. Be in XcmsCIEXYZFormat
+     * 2. Already be white point adjusted for the Screen White Point.
+     *     This means that the white point now associated with this
+     *     color spec is the Screen White Point (even if the
+     *     ccc->clientWhitePt differs).
+     */
+
+    pColor = pColors_in_out + i;
+
+    if (ccc->visual->class < StaticColor) {
+       /*
+        * GRAY !
+        */
+       _XcmsDIConvertColors(ccc, pColor, ScreenWhitePointOfCCC(ccc),
+               1, XcmsCIELabFormat);
+       _XcmsDIConvertColors(ccc, pColor, ScreenWhitePointOfCCC(ccc),
+               1, XcmsCIEXYZFormat);
+       if (pCompressed) {
+           *(pCompressed + i) = True;
+       }
+       return(XcmsSuccess);
+    }
+
+    /* Convert from CIEXYZ to CIELab format */
+    if (_XcmsDIConvertColors(&myCCC, pColor,
+                           ScreenWhitePointOfCCC(&myCCC), 1, XcmsCIELabFormat)
+               == XcmsFailure) {
+       return(XcmsFailure);
+    }
+
+    /* Step 1: compute the maximum L* and chroma for this hue. */
+    /*         This copy may be overkill but it preserves the pixel etc. */
+    saveLstar = pColor->spec.CIELab.L_star;
+    hue = XCMS_CIELAB_PMETRIC_HUE(pColor->spec.CIELab.a_star,
+                                 pColor->spec.CIELab.b_star);
+    chroma = XCMS_CIELAB_PMETRIC_CHROMA(pColor->spec.CIELab.a_star,
+                                       pColor->spec.CIELab.b_star);
+    memcpy((char *)&Lab_max, (char *)pColor, sizeof(XcmsColor));
+    if (_XcmsCIELabQueryMaxLCRGB (&myCCC, hue, &Lab_max, &rgb_max)
+           == XcmsFailure) {
+       return (XcmsFailure);
+    }
+    maxLstar = Lab_max.spec.CIELab.L_star;
+
+    /* Now check and return the appropriate L* */
+    if (saveLstar == maxLstar) {
+       /* When the L* input is equal to the maximum L* */
+       /* merely return the maximum Lab point. */
+       memcpy((char *)pColor, (char *)&Lab_max, sizeof(XcmsColor));
+       retval = _XcmsDIConvertColors(&myCCC, pColor,
+                          ScreenWhitePointOfCCC(&myCCC), 1, XcmsCIEXYZFormat);
+    } else {
+       /* return the closest point on the hue leaf. */
+       /* must do a bisection here to compute the delta e. */
+       maxChroma = XCMS_CIELAB_PMETRIC_CHROMA(Lab_max.spec.CIELab.a_star,
+                                              Lab_max.spec.CIELab.b_star);
+       nMaxCount = MAXBISECTCOUNT;
+       nI = nMaxCount / 2;
+       bestLstar = Lstar =  pColor->spec.CIELab.L_star;
+       bestastar = pColor->spec.CIELab.a_star;
+       bestbstar = pColor->spec.CIELab.b_star;
+       bestChroma = Chroma = chroma;
+       saveDist = XCMS_SQRT(((Chroma - maxChroma) * (Chroma - maxChroma)) +
+                            ((Lstar - maxLstar) * (Lstar - maxLstar)));
+       for (nCount = 0; nCount < nMaxCount; nCount++) {
+           nT = (XcmsFloat) nI / (XcmsFloat) nMaxCount;
+           if (saveLstar > maxLstar) {
+               pColor->spec.RGBi.red   = rgb_max.red * (1.0 - nT) + nT;
+               pColor->spec.RGBi.green = rgb_max.green * (1.0 - nT) + nT;
+               pColor->spec.RGBi.blue  = rgb_max.blue * (1.0 - nT) + nT;
+           } else {
+               pColor->spec.RGBi.red   = rgb_max.red - (rgb_max.red * nT);
+               pColor->spec.RGBi.green = rgb_max.green - (rgb_max.green * nT);
+               pColor->spec.RGBi.blue  = rgb_max.blue - (rgb_max.blue * nT);
+           }
+           pColor->format = XcmsRGBiFormat;
+
+           /* Convert from RGBi to CIE Lab */
+           if (_XcmsConvertColorsWithWhitePt(&myCCC, pColor,
+                           ScreenWhitePointOfCCC(&myCCC), 1, XcmsCIELabFormat,
+                           (Bool *) NULL) == XcmsFailure) {
+               return (XcmsFailure);
+           }
+           chroma = XCMS_CIELAB_PMETRIC_CHROMA(pColor->spec.CIELab.a_star,
+                                               pColor->spec.CIELab.b_star);
+           tmpDist = XCMS_SQRT(((Chroma - chroma) * (Chroma - chroma)) +
+                               ((Lstar - pColor->spec.CIELab.L_star) *
+                                (Lstar - pColor->spec.CIELab.L_star)));
+           nILast = nI;
+           if (tmpDist > saveDist) {
+               nI /= 2;
+           } else {
+               nI = (nMaxCount + nI) / 2;
+               saveDist = tmpDist;
+               bestLstar = pColor->spec.CIELab.L_star;
+               bestastar = pColor->spec.CIELab.a_star;
+               bestbstar = pColor->spec.CIELab.b_star;
+               bestChroma = chroma;
+           }
+           if (nI == nILast || nI == 0) {
+               break;
+           }
+       }
+       if (bestChroma >= maxChroma) {
+           pColor->spec.CIELab.L_star = maxLstar;
+           pColor->spec.CIELab.a_star = Lab_max.spec.CIELab.a_star;
+           pColor->spec.CIELab.b_star = Lab_max.spec.CIELab.b_star;
+       } else {
+           pColor->spec.CIELab.L_star = bestLstar;
+           pColor->spec.CIELab.a_star = bestastar;
+           pColor->spec.CIELab.b_star = bestbstar;
+       }
+       retval = _XcmsDIConvertColors(&myCCC, pColor,
+                          ScreenWhitePointOfCCC(&myCCC), 1, XcmsCIEXYZFormat);
+
+       if (retval != XcmsFailure && pCompressed != NULL) {
+           *(pCompressed + i) = True;
+       }
+    }
+    return(retval);
+}
diff --git a/src/xcms/LabMnL.c b/src/xcms/LabMnL.c
new file mode 100644 (file)
index 0000000..18ff04c
--- /dev/null
@@ -0,0 +1,216 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of XCMS based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *     NAME
+ *             CIELabMnL.c
+ *
+ *     DESCRIPTION
+ *             Source for the XcmsCIELabQueryMinL() gamut boundary
+ *             querying routine.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include <math.h>
+#include "Cv.h"
+
+/*
+ *     DEFINES
+ */
+#define MAXBISECTCOUNT 100
+#define EPS            (XcmsFloat)0.001
+#define START_L_STAR   (XcmsFloat)40.0
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsCIELabQueryMinL - Compute max Lstar for a hue and chroma
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsCIELabQueryMinL(
+    XcmsCCC ccc,
+    XcmsFloat hue_angle,           /* hue angle in degrees */
+    XcmsFloat chroma,
+    XcmsColor *pColor_return)
+/*
+ *     DESCRIPTION
+ *             Return the maximum Lstar for a specified hue_angle and chroma.
+ *
+ *     ASSUMPTIONS
+ *             This routine assumes that the white point associated with
+ *             the color specification is the Screen White Point.  The
+ *             Screen White Point will also be associated with the
+ *             returned color specification.
+ *
+ *     RETURNS
+ *             XcmsFailure - Failure
+ *              XcmsSuccess - Succeeded with no modifications
+ *
+ */
+{
+    XcmsCCCRec myCCC;
+    XcmsColor   max_lc, tmp, prev;
+    XcmsFloat   max_chroma, tmp_chroma;
+    XcmsFloat   hue, nT, nChroma, lastChroma, prevChroma;
+    XcmsFloat   rFactor;
+    XcmsRGBi    rgb_saved;
+    int         nCount, nMaxCount;
+
+    /*
+     * Check Arguments
+     */
+    if (ccc == NULL || pColor_return == NULL) {
+       return(XcmsFailure);
+    }
+
+    /* setup the CCC to use for the conversions. */
+    memcpy ((char *) &myCCC, (char *) ccc, sizeof(XcmsCCCRec));
+    myCCC.clientWhitePt.format = XcmsUndefinedFormat;
+    myCCC.gamutCompProc = (XcmsCompressionProc) NULL;
+
+    while (hue_angle < 0.0) {
+       hue_angle += 360.0;
+    }
+    while (hue_angle >= 360.0) {
+       hue_angle -= 360.0;
+    }
+
+    hue = radians(hue_angle);
+    tmp.spec.CIELab.L_star = START_L_STAR;
+    tmp.spec.CIELab.a_star = XCMS_CIEASTAROFHUE(hue, chroma);
+    tmp.spec.CIELab.b_star = XCMS_CIEBSTAROFHUE(hue, chroma);
+    tmp.pixel = pColor_return->pixel;
+    tmp.format = XcmsCIELabFormat;
+
+    /* Step 1: Obtain the maximum L_star and chroma for this hue. */
+    if (_XcmsCIELabQueryMaxLCRGB(&myCCC, hue, &max_lc, &rgb_saved)
+           == XcmsFailure) {
+       return(XcmsFailure);
+    }
+
+    max_chroma = XCMS_CIELAB_PMETRIC_CHROMA(max_lc.spec.CIELab.a_star,
+                                           max_lc.spec.CIELab.b_star);
+
+    if (max_chroma <= chroma) {
+       /*
+        *  If the chroma is greater than the chroma for the
+        *  maximum L/chroma point then the L_star is the
+        *  the L_star for the maximum L_star/chroma point.
+        *  This is an error but I return the best approximation I can.
+         *  Thus the inconsistency.
+        */
+       memcpy ((char *) pColor_return, (char *) &max_lc, sizeof (XcmsColor));
+       return(XcmsSuccess);
+    }
+
+    /*
+     *  If the chroma is equal to the chroma for the
+     *  maximum L_star/chroma point then the L_star is the
+     *  the L_star for the maximum L* and chroma point.
+     */
+    /* if (max_chroma == chroma) {
+     *  memcpy ((char *) pColor_return, (char *) &max_lc, sizeof (XcmsColor));
+     * return(XcmsSuccess);
+     *    }
+     */
+
+    /* must do a bisection here to compute the maximum L* */
+    /* save the structure input so that any elements that */
+    /* are not touched are recopied later in the routine. */
+    nChroma = chroma;
+    tmp_chroma = max_chroma;
+    lastChroma = -1.0;
+    nMaxCount = MAXBISECTCOUNT;
+    rFactor = 1.0;
+
+    for (nCount = 0; nCount < nMaxCount; nCount++) {
+       prevChroma = lastChroma;
+       lastChroma = tmp_chroma;
+       nT = (nChroma - max_chroma) / max_chroma * rFactor;
+       memcpy ((char *)&prev, (char *)&tmp, sizeof(XcmsColor));
+       tmp.spec.RGBi.red   = rgb_saved.red + (rgb_saved.red * nT);
+       tmp.spec.RGBi.green = rgb_saved.green + (rgb_saved.green * nT);
+       tmp.spec.RGBi.blue  = rgb_saved.blue + (rgb_saved.blue * nT);
+       tmp.format = XcmsRGBiFormat;
+
+       /* convert from RGB to CIELab */
+       if (_XcmsConvertColorsWithWhitePt(&myCCC, &tmp,
+               ScreenWhitePointOfCCC(&myCCC), 1, XcmsCIELabFormat,
+               (Bool *) NULL) == XcmsFailure) {
+           return(XcmsFailure);
+       }
+
+       /* Now check the return against what is expected */
+       tmp_chroma = XCMS_CIELAB_PMETRIC_CHROMA(tmp.spec.CIELab.a_star,
+                                               tmp.spec.CIELab.b_star);
+       if (tmp_chroma <= chroma + EPS && tmp_chroma >= chroma - EPS) {
+           /* Found It! */
+           memcpy ((char *) pColor_return, (char *) &tmp, sizeof (XcmsColor));
+           return(XcmsSuccess);
+       }
+       nChroma += chroma - tmp_chroma;
+       if (nChroma > max_chroma) {
+           nChroma = max_chroma;
+           rFactor *= 0.5;  /* selective relaxation employed */
+       } else if (nChroma < 0.0) {
+           if (XCMS_FABS(lastChroma - chroma) <
+               XCMS_FABS(tmp_chroma - chroma)) {
+               memcpy ((char *)pColor_return, (char *)&prev,
+                       sizeof(XcmsColor));
+           } else {
+               memcpy ((char *)pColor_return, (char *)&tmp,
+                       sizeof(XcmsColor));
+           }
+           return(XcmsSuccess);
+       } else if (tmp_chroma <= prevChroma + EPS &&
+                  tmp_chroma >= prevChroma - EPS) {
+           rFactor *= 0.5;  /* selective relaxation employed */
+       }
+    }
+
+    if (nCount >= nMaxCount) {
+       if (XCMS_FABS(lastChroma - chroma) <
+           XCMS_FABS(tmp_chroma - chroma)) {
+               memcpy ((char *)pColor_return, (char *)&prev,
+                       sizeof(XcmsColor));
+           } else {
+               memcpy ((char *)pColor_return, (char *)&tmp,
+                       sizeof(XcmsColor));
+       }
+    }
+    memcpy ((char *) pColor_return, (char *) &tmp, sizeof (XcmsColor));
+    return(XcmsSuccess);
+}
diff --git a/src/xcms/LabMxC.c b/src/xcms/LabMxC.c
new file mode 100644 (file)
index 0000000..fcadd23
--- /dev/null
@@ -0,0 +1,203 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of XCMS based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *
+ *     NAME
+ *             CIELabMxC.c
+ *
+ *     DESCRIPTION
+ *             Source for the XcmsCIELabQueryMaxC() gamut boundary
+ *             querying routine.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include <math.h>
+#include "Cv.h"
+
+/*
+ *     DEFINES
+ */
+#define MAXBISECTCOUNT 100
+#define EPS            (XcmsFloat)0.001
+#define START_CHROMA   (XcmsFloat)3.6
+#define TOPL           (XcmsFloat)100.0
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsCIELabQueryMaxC - max chroma for a hue_angle and L_star
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsCIELabQueryMaxC(
+    XcmsCCC ccc,
+    XcmsFloat hue_angle,           /* hue angle in degrees */
+    XcmsFloat L_star,
+    XcmsColor *pColor_return)
+/*
+ *     DESCRIPTION
+ *             Return the maximum chroma for a specific hue_angle and L_star.
+ *             The returned format is in XcmsCIELabFormat.
+ *
+ *
+ *     ASSUMPTIONS
+ *             This routine assumes that the white point associated with
+ *             the color specification is the Screen White Point.  The
+ *             Screen White Point will also be associated with the
+ *             returned color specification.
+ *
+ *     RETURNS
+ *             XcmsFailure - Failure
+ *              XcmsSuccess - Succeeded
+ *
+ */
+{
+    XcmsCCCRec myCCC;
+    XcmsColor  tmp;
+    XcmsColor  max_lc;
+    XcmsFloat n_L_star, last_L_star, prev_L_star;
+    XcmsFloat hue, lastaStar, lastbStar, /*lastChroma,*/ maxDist, nT, rFactor;
+    XcmsRGBi   rgb_saved;
+    int nCount, nMaxCount;
+
+    /*
+     * Check Arguments
+     */
+    if (ccc == NULL || pColor_return == NULL) {
+       return(XcmsFailure);
+    }
+
+    /* Use my own CCC and inherit screen white Pt */
+    memcpy ((char *)&myCCC, (char *)ccc, sizeof(XcmsCCCRec));
+    myCCC.clientWhitePt.format = XcmsUndefinedFormat;
+    myCCC.gamutCompProc = (XcmsCompressionProc)NULL;/* no gamut comp func */
+
+    while (hue_angle < 0.0) {
+       hue_angle += 360.0;
+    }
+    while (hue_angle >= 360.0) {
+       hue_angle -= 360.0;
+    }
+
+    hue = radians(hue_angle);
+    tmp.spec.CIELab.L_star = L_star;
+    tmp.spec.CIELab.a_star = XCMS_CIEASTAROFHUE(hue, START_CHROMA);
+    tmp.spec.CIELab.b_star = XCMS_CIEBSTAROFHUE(hue, START_CHROMA);
+    tmp.pixel = pColor_return->pixel;
+    tmp.format = XcmsCIELabFormat;
+
+    /* Step 1: compute the maximum L_star and chroma for this hue. */
+    memcpy((char *)&max_lc, (char *)&tmp, sizeof(XcmsColor));
+    if (_XcmsCIELabQueryMaxLCRGB(&myCCC, hue, &max_lc, &rgb_saved)
+       == XcmsFailure) {
+           return(XcmsFailure);
+    }
+
+    /*
+     * Step 2:  Do a bisection here to compute the maximum chroma
+     *          Note the differences between when the point to be found
+     *          is above the maximum LC point and when it is below.
+     */
+    if (L_star <= max_lc.spec.CIELab.L_star) {
+       maxDist = max_lc.spec.CIELab.L_star;
+    } else {
+       maxDist = TOPL - max_lc.spec.CIELab.L_star;
+    }
+
+    n_L_star = L_star;
+    last_L_star = -1.0;
+    nMaxCount = MAXBISECTCOUNT;
+    rFactor = 1.0;
+
+    for (nCount = 0; nCount < nMaxCount; nCount++) {
+       prev_L_star =  last_L_star;
+       last_L_star =  tmp.spec.CIELab.L_star;
+/*     lastChroma = XCMS_CIELAB_PMETRIC_CHROMA(tmp.spec.CIELab.a_star,  */
+/*                                             tmp.spec.CIELab.b_star); */
+       lastaStar = tmp.spec.CIELab.a_star;
+       lastbStar = tmp.spec.CIELab.b_star;
+       nT = (n_L_star - max_lc.spec.CIELab.L_star) / maxDist * rFactor;
+       if (nT > 0) {
+           tmp.spec.RGBi.red = rgb_saved.red * (1.0 - nT) + nT;
+           tmp.spec.RGBi.green = rgb_saved.green * (1.0 - nT) + nT;
+           tmp.spec.RGBi.blue  = rgb_saved.blue * (1.0 - nT) + nT;
+       } else {
+           tmp.spec.RGBi.red = rgb_saved.red + (rgb_saved.red * nT);
+           tmp.spec.RGBi.green = rgb_saved.green + (rgb_saved.green * nT);
+           tmp.spec.RGBi.blue = rgb_saved.blue + (rgb_saved.blue * nT);
+       }
+       tmp.format = XcmsRGBiFormat;
+
+       /* convert from RGB to CIELab */
+       if (_XcmsConvertColorsWithWhitePt(&myCCC, &tmp,
+                           ScreenWhitePointOfCCC(&myCCC), 1, XcmsCIELabFormat,
+                           (Bool *) NULL) == XcmsFailure) {
+           return(XcmsFailure);
+       }
+
+       /*
+        * Now check if we've reached the target L_star
+        */
+       /* printf("result Lstar = %lf\n", tmp.spec.CIELab.L_star); */
+       if (tmp.spec.CIELab.L_star <= L_star + EPS &&
+           tmp.spec.CIELab.L_star >= L_star - EPS) {
+               memcpy((char *)pColor_return, (char *)&tmp, sizeof(XcmsColor));
+               return(XcmsSuccess);
+       }
+       if (nT > 0) {
+           n_L_star += ((TOPL - n_L_star) *
+                        (L_star - tmp.spec.CIELab.L_star)) / (TOPL - L_star);
+       } else {
+           n_L_star *= L_star / tmp.spec.CIELuv.L_star;
+       }
+       if (tmp.spec.CIELab.L_star <= prev_L_star + EPS &&
+           tmp.spec.CIELab.L_star >= prev_L_star - EPS) {
+               rFactor *= 0.5;  /* selective relaxation employed */
+               /* printf("rFactor = %lf\n", rFactor); */
+       }
+    }
+    if (XCMS_FABS(last_L_star - L_star) <
+       XCMS_FABS(tmp.spec.CIELab.L_star - L_star)) {
+           tmp.spec.CIELab.a_star = lastaStar;
+           tmp.spec.CIELab.b_star = lastbStar;
+/*         tmp.spec.CIELab.a_star = XCMS_CIEASTAROFHUE(hue, lastChroma); */
+/*         tmp.spec.CIELab.b_star = XCMS_CIEBSTAROFHUE(hue, lastChroma); */
+    }
+    tmp.spec.CIELab.L_star = L_star;
+    memcpy((char *)pColor_return, (char *)&tmp, sizeof(XcmsColor));
+    return(XcmsSuccess);
+}
diff --git a/src/xcms/LabMxL.c b/src/xcms/LabMxL.c
new file mode 100644 (file)
index 0000000..66ef484
--- /dev/null
@@ -0,0 +1,216 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of XCMS based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *     NAME
+ *             CIELabMxL.c
+ *
+ *     DESCRIPTION
+ *             Source for the XcmsCIELabQueryMaxL() gamut boundary
+ *             querying routine.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include <math.h>
+#include "Cv.h"
+
+/*
+ *     DEFINES
+ */
+#define MAXBISECTCOUNT 100
+#define EPS            (XcmsFloat)0.001
+#define START_L_STAR   (XcmsFloat)40
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsCIELabQueryMaxL - Compute max Lstar for a hue and chroma
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsCIELabQueryMaxL(
+    XcmsCCC ccc,
+    XcmsFloat hue_angle,       /* hue in degrees */
+    XcmsFloat chroma,
+    XcmsColor *pColor_return)
+/*
+ *     DESCRIPTION
+ *             Return the maximum Lstar for a specified hue_angle and chroma.
+ *
+ *     ASSUMPTIONS
+ *             This routine assumes that the white point associated with
+ *             the color specification is the Screen White Point.  The
+ *             Screen White Point will also be associated with the
+ *             returned color specification.
+ *
+ *     RETURNS
+ *             XcmsFailure - Failure
+ *              XcmsSuccess - Succeeded with no modifications
+ *
+ */
+{
+    XcmsCCCRec myCCC;
+    XcmsColor   max_lc, tmp, prev;
+    XcmsFloat   max_chroma, tmp_chroma;
+    XcmsFloat   hue, nT, nChroma, lastChroma, prevChroma;
+    XcmsFloat   rFactor;
+    XcmsRGBi    rgb_saved;
+    int         nCount, nMaxCount;
+
+    /*
+     * Check Arguments
+     */
+    if (ccc == NULL || pColor_return == NULL) {
+       return(XcmsFailure);
+    }
+
+    /* setup the CCC to use for the conversions. */
+    memcpy ((char *) &myCCC, (char *) ccc, sizeof(XcmsCCCRec));
+    myCCC.clientWhitePt.format = XcmsUndefinedFormat;
+    myCCC.gamutCompProc = (XcmsCompressionProc) NULL;
+
+    while (hue_angle < 0.0) {
+       hue_angle += 360.0;
+    }
+    while (hue_angle >= 360.0) {
+       hue_angle -= 360.0;
+    }
+
+    hue = radians(hue_angle);
+    tmp.spec.CIELab.L_star = START_L_STAR;
+    tmp.spec.CIELab.a_star = XCMS_CIEASTAROFHUE(hue, chroma);
+    tmp.spec.CIELab.b_star = XCMS_CIEBSTAROFHUE(hue, chroma);
+    tmp.pixel = pColor_return->pixel;
+    tmp.format = XcmsCIELabFormat;
+
+    /* Step 1: Obtain the maximum L_star and chroma for this hue. */
+    if (_XcmsCIELabQueryMaxLCRGB(&myCCC, hue, &max_lc, &rgb_saved)
+           == XcmsFailure) {
+       return(XcmsFailure);
+    }
+
+    max_chroma = XCMS_CIELAB_PMETRIC_CHROMA(max_lc.spec.CIELab.a_star,
+                                           max_lc.spec.CIELab.b_star);
+
+    if (max_chroma <= chroma) {
+       /*
+        *  If the chroma is greater than the chroma for the
+        *  maximum L/chroma point then the L_star is the
+        *  the L_star for the maximum L_star/chroma point.
+        *  This is an error but I return the best approximation I can.
+         *  Thus the inconsistency.
+        */
+       memcpy ((char *) pColor_return, (char *) &max_lc, sizeof (XcmsColor));
+       return(XcmsSuccess);
+    }
+
+    /*
+     *  If the chroma is equal to the chroma for the
+     *  maximum L_star/chroma point then the L_star is the
+     *  the L_star for the maximum L* and chroma point.
+     */
+    /* if (max_chroma == chroma) {
+     *  memcpy ((char *) pColor_return, (char *) &max_lc, sizeof (XcmsColor));
+     * return(XcmsSuccess);
+     *    }
+     */
+
+    /* must do a bisection here to compute the maximum L* */
+    /* save the structure input so that any elements that */
+    /* are not touched are recopied later in the routine. */
+    nChroma = chroma;
+    tmp_chroma = max_chroma;
+    lastChroma = -1.0;
+    nMaxCount = MAXBISECTCOUNT;
+    rFactor = 1.0;
+
+    for (nCount = 0; nCount < nMaxCount; nCount++) {
+       prevChroma = lastChroma;
+       lastChroma = tmp_chroma;
+       nT = (1.0 - (nChroma / max_chroma)) * rFactor;
+       memcpy ((char *)&prev, (char *)&tmp, sizeof(XcmsColor));
+       tmp.spec.RGBi.red   = rgb_saved.red * (1.0 - nT) + nT;
+       tmp.spec.RGBi.green = rgb_saved.green * (1.0 - nT) + nT;
+       tmp.spec.RGBi.blue  = rgb_saved.blue * (1.0 - nT) + nT;
+       tmp.format = XcmsRGBiFormat;
+
+       /* convert from RGB to CIELab */
+       if (_XcmsConvertColorsWithWhitePt(&myCCC, &tmp,
+               ScreenWhitePointOfCCC(&myCCC), 1, XcmsCIELabFormat,
+               (Bool *) NULL) == XcmsFailure) {
+           return(XcmsFailure);
+       }
+
+       /* Now check the return against what is expected */
+       tmp_chroma = XCMS_CIELAB_PMETRIC_CHROMA(tmp.spec.CIELab.a_star,
+                                               tmp.spec.CIELab.b_star);
+       if (tmp_chroma <= chroma + EPS && tmp_chroma >= chroma - EPS) {
+           /* Found It! */
+           memcpy ((char *) pColor_return, (char *) &tmp, sizeof (XcmsColor));
+           return(XcmsSuccess);
+       }
+       nChroma += chroma - tmp_chroma;
+       if (nChroma > max_chroma) {
+           nChroma = max_chroma;
+           rFactor *= 0.5;  /* selective relaxation employed */
+       } else if (nChroma < 0.0) {
+           if (XCMS_FABS(lastChroma - chroma) <
+               XCMS_FABS(tmp_chroma - chroma)) {
+               memcpy ((char *)pColor_return, (char *)&prev,
+                       sizeof(XcmsColor));
+           } else {
+               memcpy ((char *)pColor_return, (char *)&tmp,
+                       sizeof(XcmsColor));
+           }
+           return(XcmsSuccess);
+       } else if (tmp_chroma <= prevChroma + EPS &&
+                  tmp_chroma >= prevChroma - EPS) {
+           rFactor *= 0.5;  /* selective relaxation employed */
+       }
+    }
+
+    if (nCount >= nMaxCount) {
+       if (XCMS_FABS(lastChroma - chroma) <
+           XCMS_FABS(tmp_chroma - chroma)) {
+               memcpy ((char *)pColor_return, (char *)&prev,
+                       sizeof(XcmsColor));
+           } else {
+               memcpy ((char *)pColor_return, (char *)&tmp,
+                       sizeof(XcmsColor));
+       }
+    }
+    memcpy ((char *) pColor_return, (char *) &tmp, sizeof (XcmsColor));
+    return(XcmsSuccess);
+}
diff --git a/src/xcms/LabMxLC.c b/src/xcms/LabMxLC.c
new file mode 100644 (file)
index 0000000..8cc089a
--- /dev/null
@@ -0,0 +1,218 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of XCMS based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *
+ *     NAME
+ *             CIELabMxVC.c
+ *
+ *     DESCRIPTION
+ *             Source for the XcmsCIELabQueryMaxLC() gamut boundary
+ *             querying routine.
+ *
+ *     DOCUMENTATION
+ *             "TekColor Color Management System, System Implementor's Manual"
+ *             and
+ *             Fred W. Billmeyer & Max Saltzman, "Principles of Color
+ *             Technology", John Wily & Sons, Inc, 1981.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+/*
+ *     DEFINES
+ */
+#define MIN(x,y)       ((x) > (y) ? (y) : (x))
+#define MIN3(x,y,z)    ((x) > (MIN((y), (z))) ? (MIN((y), (z))) : (x))
+#define MAX(x,y)       ((x) > (y) ? (x) : (y))
+#define MAX3(x,y,z)    ((x) > (MAX((y), (z))) ? (x) : (MAX((y), (z))))
+#define START_LSTAR    (XcmsFloat)40.0
+#define START_CHROMA   (XcmsFloat)3.6
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      API PRIVATE ROUTINES                           *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             _XcmsCIELabQueryMaxLCRGB - Compute maximum L* and chroma.
+ *
+ *     SYNOPSIS
+ */
+Status
+_XcmsCIELabQueryMaxLCRGB(
+    XcmsCCC    ccc,
+    XcmsFloat  hue,                /* hue in radians */
+    XcmsColor   *pColor_return,
+    XcmsRGBi    *pRGB_return)
+/*
+ *     DESCRIPTION
+ *             Return the maximum psychometric chroma for a specified
+ *             hue, and the corresponding L*.  This is computed
+ *             by a binary search of all possible chromas.  An assumption
+ *             is made that there are no local maxima.  Use the unrounded
+ *             Max psychometric chroma because the difference check can be
+ *             small.
+ *
+ *             NOTE:  No local CCC is used because this is a private
+ *                    routine and all routines that call it are expected
+ *                    to behave properly, i.e. send a local CCC with
+ *                    no white adjust function and no gamut compression
+ *                    function.
+ *
+ *             This routine only accepts hue in radians as input and outputs
+ *             Lab and RGBi.
+ *
+ *     RETURNS
+ *             XcmsFailure - Failure
+ *             XcmsSuccess - Succeeded
+ *
+ */
+{
+    XcmsFloat nSmall, nLarge;
+    XcmsColor tmp;
+
+    tmp.format = XcmsCIELabFormat;
+    /*  Use some unreachable color on the given hue */
+    tmp.spec.CIELab.L_star = START_LSTAR;
+    tmp.spec.CIELab.a_star = XCMS_CIEASTAROFHUE(hue, START_CHROMA);
+    tmp.spec.CIELab.b_star = XCMS_CIEBSTAROFHUE(hue, START_CHROMA);
+    /*
+     * Convert from Lab to RGB
+     *
+     * Note that the CIEXYZ to RGBi conversion routine must stuff the
+     * out of bounds RGBi values in tmp when the ccc->gamutCompProc
+     * is NULL.
+     */
+    if ((_XcmsConvertColorsWithWhitePt(ccc, &tmp, ScreenWhitePointOfCCC(ccc),
+                              (unsigned int)1, XcmsRGBiFormat, (Bool *) NULL)
+           == XcmsFailure) && tmp.format != XcmsRGBiFormat) {
+       return (XcmsFailure);
+    }
+
+    /* Now pick the smallest RGB */
+    nSmall = MIN3(tmp.spec.RGBi.red,
+                 tmp.spec.RGBi.green,
+                 tmp.spec.RGBi.blue);
+    /* Make the smallest RGB equal to zero */
+    tmp.spec.RGBi.red   -= nSmall;
+    tmp.spec.RGBi.green -= nSmall;
+    tmp.spec.RGBi.blue  -= nSmall;
+
+    /* Now pick the largest RGB */
+    nLarge = MAX3(tmp.spec.RGBi.red,
+                 tmp.spec.RGBi.green,
+                 tmp.spec.RGBi.blue);
+    /* Scale the RGB values based on the largest one */
+    tmp.spec.RGBi.red   /= nLarge;
+    tmp.spec.RGBi.green /= nLarge;
+    tmp.spec.RGBi.blue  /= nLarge;
+    tmp.format = XcmsRGBiFormat;
+
+    /* If the calling routine wants RGB value give them the ones used. */
+    if (pRGB_return) {
+       pRGB_return->red   = tmp.spec.RGBi.red;
+       pRGB_return->green = tmp.spec.RGBi.green;
+       pRGB_return->blue  = tmp.spec.RGBi.blue;
+    }
+
+    /* Convert from RGBi to Lab */
+    if (_XcmsConvertColorsWithWhitePt(ccc, &tmp,
+              ScreenWhitePointOfCCC(ccc), 1, XcmsCIELabFormat, (Bool *) NULL)
+           == XcmsFailure) {
+       return (XcmsFailure);
+    }
+
+    memcpy((char *)pColor_return, (char *)&tmp, sizeof(XcmsColor));
+    return (XcmsSuccess);
+}
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsCIELabQueryMaxLC - Compute maximum L* and chroma.
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsCIELabQueryMaxLC (
+    XcmsCCC ccc,
+    XcmsFloat hue_angle,           /* hue_angle in degrees */
+    XcmsColor *pColor_return)
+
+/*
+ *     DESCRIPTION
+ *             Return the point of maximum chroma for the specified
+ *             hue_angle.
+ *
+ *     ASSUMPTIONS
+ *             This routine assumes that the white point associated with
+ *             the color specification is the Screen White Point.  The
+ *             Screen White Point will also be associated with the
+ *             returned color specification.
+ *
+ *     RETURNS
+ *             XcmsFailure - Failure
+ *             XcmsSuccess - Succeeded
+ *
+ */
+{
+    XcmsCCCRec myCCC;
+
+    /*
+     * Check Arguments
+     */
+    if (ccc == NULL || pColor_return == NULL) {
+       return(XcmsFailure);
+    }
+
+    /* Use my own CCC */
+    memcpy ((char *)&myCCC, (char *)ccc, sizeof(XcmsCCCRec));
+    myCCC.clientWhitePt.format = XcmsUndefinedFormat;
+    myCCC.gamutCompProc = (XcmsCompressionProc)NULL;
+
+    while (hue_angle < 0.0) {
+       hue_angle += 360.0;
+    }
+    while (hue_angle >= 360.0) {
+       hue_angle -= 360.0;
+    }
+
+    return(_XcmsCIELabQueryMaxLCRGB (&myCCC, radians(hue_angle), pColor_return,
+           (XcmsRGBi *)NULL));
+}
diff --git a/src/xcms/LabWpAj.c b/src/xcms/LabWpAj.c
new file mode 100644 (file)
index 0000000..0559fde
--- /dev/null
@@ -0,0 +1,97 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of XCMS based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *             CIELabWpAj.c
+ *
+ *     DESCRIPTION
+ *             This file contains routine(s) that support white point
+ *             adjustment of color specifications in the CIE L*a*b* color
+ *             space.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+/*
+ *     EXTERNS
+ */
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsCIELabWhiteShiftColors
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsCIELabWhiteShiftColors(
+    XcmsCCC ccc,
+    XcmsColor *pWhitePtFrom,
+    XcmsColor *pWhitePtTo,
+    XcmsColorFormat destSpecFmt,
+    XcmsColor *pColors_in_out,
+    unsigned int nColors,
+    Bool *pCompressed)
+/*
+ *     DESCRIPTION
+ *             Adjust color specifications in XcmsColor structures for
+ *             differences in white points.
+ *
+ *     RETURNS
+ *             XcmsFailure if failed,
+ *             XcmsSuccess if succeeded without gamut compression,
+ *             XcmsSuccessWithCompression if succeeded with gamut
+ *                     compression.
+ */
+{
+    if (pWhitePtFrom == NULL || pWhitePtTo == NULL || pColors_in_out == NULL) {
+       return(0);
+    }
+
+    /*
+     * Convert to CIELab using pWhitePtFrom
+     */
+    if (_XcmsConvertColorsWithWhitePt(ccc, pColors_in_out, pWhitePtFrom,
+           nColors, XcmsCIELabFormat, pCompressed) == XcmsFailure) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Convert from CIELab to destSpecFmt using pWhitePtTo
+     */
+    return(_XcmsConvertColorsWithWhitePt(ccc, pColors_in_out,
+       pWhitePtTo, nColors, destSpecFmt, pCompressed));
+}
diff --git a/src/xcms/Luv.c b/src/xcms/Luv.c
new file mode 100644 (file)
index 0000000..82bc294
--- /dev/null
@@ -0,0 +1,401 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of XCMS based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *             CIELuv.c
+ *
+ *     DESCRIPTION
+ *             This file contains routines that support the CIE L*u*v*
+ *             color space to include conversions to and from the CIE
+ *             XYZ space.
+ *
+ *     DOCUMENTATION
+ *             "TekColor Color Management System, System Implementor's Manual"
+ *             and
+ *             Fred W. Billmeyer & Max Saltzman, "Principles of Color
+ *             Technology", John Wily & Sons, Inc, 1981.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <X11/Xos.h>
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+#include <stdio.h> /* sscanf */
+
+
+/*
+ *     FORWARD DECLARATIONS
+ */
+
+static int CIELuv_ParseString(register char *spec, XcmsColor *pColor);
+static Status XcmsCIELuv_ValidSpec(XcmsColor *pColor);
+
+/*
+ *     DEFINES
+ *             Internal definitions that need NOT be exported to any package
+ *             or program using this package.
+ */
+#ifdef DBL_EPSILON
+#  define XMY_DBL_EPSILON DBL_EPSILON
+#else
+#  define XMY_DBL_EPSILON 0.00001
+#endif
+
+
+/*
+ *     LOCAL VARIABLES
+ */
+
+    /*
+     * NULL terminated list of functions applied to get from CIELuv to CIEXYZ
+     */
+static XcmsConversionProc Fl_CIELuv_to_CIEXYZ[] = {
+    XcmsCIELuvToCIEuvY,
+    XcmsCIEuvYToCIEXYZ,
+    NULL
+};
+
+    /*
+     * NULL terminated list of functions applied to get from CIEXYZ to CIELuv
+     */
+static XcmsConversionProc Fl_CIEXYZ_to_CIELuv[] = {
+    XcmsCIEXYZToCIEuvY,
+    XcmsCIEuvYToCIELuv,
+    NULL
+};
+
+/*
+ *     GLOBALS
+ */
+
+    /*
+     * CIE Luv Color Space
+     */
+XcmsColorSpace XcmsCIELuvColorSpace =
+    {
+       _XcmsCIELuv_prefix,     /* prefix */
+       XcmsCIELuvFormat,               /* id */
+       CIELuv_ParseString,     /* parseString */
+       Fl_CIELuv_to_CIEXYZ,    /* to_CIEXYZ */
+       Fl_CIEXYZ_to_CIELuv,    /* from_CIEXYZ */
+       1
+    };
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PRIVATE ROUTINES                               *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             CIELuv_ParseString
+ *
+ *     SYNOPSIS
+ */
+static int
+CIELuv_ParseString(
+    register char *spec,
+    XcmsColor *pColor)
+/*
+ *     DESCRIPTION
+ *             This routines takes a string and attempts to convert
+ *             it into a XcmsColor structure with XcmsCIELuvFormat.
+ *             The assumed CIELuv string syntax is:
+ *                 CIELuv:<L>/<u>/<v>
+ *             Where L, u, and v are in string input format for floats
+ *             consisting of:
+ *                 a. an optional sign
+ *                 b. a string of numbers possibly containing a decimal point,
+ *                 c. an optional exponent field containing an 'E' or 'e'
+ *                     followed by a possibly signed integer string.
+ *
+ *     RETURNS
+ *             0 if failed, non-zero otherwise.
+ */
+{
+    int n;
+    char *pchar;
+
+    if ((pchar = strchr(spec, ':')) == NULL) {
+       return(XcmsFailure);
+    }
+    n = (int)(pchar - spec);
+
+    /*
+     * Check for proper prefix.
+     */
+    if (strncmp(spec, _XcmsCIELuv_prefix, n) != 0) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Attempt to parse the value portion.
+     */
+    if (sscanf(spec + n + 1, "%lf/%lf/%lf",
+           &pColor->spec.CIELuv.L_star,
+           &pColor->spec.CIELuv.u_star,
+           &pColor->spec.CIELuv.v_star) != 3) {
+        char *s; /* Maybe failed due to locale */
+        int f;
+        if ((s = strdup(spec))) {
+            for (f = 0; s[f]; ++f)
+                if (s[f] == '.')
+                    s[f] = ',';
+                else if (s[f] == ',')
+                    s[f] = '.';
+           if (sscanf(s + n + 1, "%lf/%lf/%lf",
+                      &pColor->spec.CIELuv.L_star,
+                      &pColor->spec.CIELuv.u_star,
+                      &pColor->spec.CIELuv.v_star) != 3) {
+                free(s);
+                return(XcmsFailure);
+            }
+            free(s);
+        } else
+       return(XcmsFailure);
+    }
+    pColor->format = XcmsCIELuvFormat;
+    pColor->pixel = 0;
+    return(XcmsCIELuv_ValidSpec(pColor));
+}
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsCIELuv_ValidSpec
+ *
+ *     SYNOPSIS
+ */
+static Status
+XcmsCIELuv_ValidSpec(
+    XcmsColor *pColor)
+/*
+ *     DESCRIPTION
+ *             Checks if color specification valid for CIE L*u*v*.
+ *
+ *     RETURNS
+ *             XcmsFailure if invalid,
+ *             XcmsSuccess if valid.
+ *
+ */
+{
+    if (pColor->format != XcmsCIELuvFormat
+           ||
+           (pColor->spec.CIELuv.L_star < 0.0 - XMY_DBL_EPSILON)
+           ||
+           (pColor->spec.CIELuv.L_star > 100.0 + XMY_DBL_EPSILON)) {
+       return(XcmsFailure);
+    }
+    return(XcmsSuccess);
+}
+
+\f
+/*
+ *     NAME
+ *             XcmsCIELuvToCIEuvY - convert CIELuv to CIEuvY
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsCIELuvToCIEuvY(
+    XcmsCCC ccc,
+    XcmsColor *pLuv_WhitePt,
+    XcmsColor *pColors_in_out,
+    unsigned int nColors)
+/*
+ *     DESCRIPTION
+ *             Converts color specifications in an array of XcmsColor
+ *             structures from CIELuv format to CIEuvY format.
+ *
+ *     RETURNS
+ *             XcmsFailure if failed,
+ *             XcmsSuccess if succeeded.
+ *
+ */
+{
+    XcmsColor  *pColor = pColors_in_out;
+    XcmsColor  whitePt;
+    XcmsCIEuvY uvY_return;
+    XcmsFloat  tmpVal;
+    register int i;
+
+    /*
+     * Check arguments
+     */
+    if (pLuv_WhitePt == NULL || pColors_in_out == NULL) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Make sure white point is in CIEuvY form
+     */
+    if (pLuv_WhitePt->format != XcmsCIEuvYFormat) {
+       /* Make copy of the white point because we're going to modify it */
+       memcpy((char *)&whitePt, (char *)pLuv_WhitePt, sizeof(XcmsColor));
+       if (!_XcmsDIConvertColors(ccc, &whitePt, (XcmsColor *)NULL,
+               1, XcmsCIEuvYFormat)) {
+           return(XcmsFailure);
+       }
+       pLuv_WhitePt = &whitePt;
+    }
+    /* Make sure it is a white point, i.e., Y == 1.0 */
+    if (pLuv_WhitePt->spec.CIEuvY.Y != 1.0) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Now convert each XcmsColor structure to CIEXYZ form
+     */
+    for (i = 0; i < nColors; i++, pColor++) {
+
+       /* Make sure original format is CIELuv and is valid */
+       if (!XcmsCIELuv_ValidSpec(pColor)) {
+           return(XcmsFailure);
+       }
+
+       if (pColor->spec.CIELuv.L_star < 7.99953624) {
+           uvY_return.Y = pColor->spec.CIELuv.L_star / 903.29;
+       } else {
+           tmpVal = (pColor->spec.CIELuv.L_star + 16.0) / 116.0;
+           uvY_return.Y = tmpVal * tmpVal * tmpVal; /* tmpVal ** 3 */
+       }
+
+
+
+       if (pColor->spec.CIELuv.L_star == 0.0) {
+           uvY_return.u_prime = pLuv_WhitePt->spec.CIEuvY.u_prime;
+           uvY_return.v_prime = pLuv_WhitePt->spec.CIEuvY.v_prime;
+       } else {
+           tmpVal = 13.0 * (pColor->spec.CIELuv.L_star / 100.0);
+           uvY_return.u_prime = pColor->spec.CIELuv.u_star/tmpVal +
+                           pLuv_WhitePt->spec.CIEuvY.u_prime;
+           uvY_return.v_prime = pColor->spec.CIELuv.v_star/tmpVal +
+                           pLuv_WhitePt->spec.CIEuvY.v_prime;
+       }
+       /* Copy result to pColor */
+       memcpy((char *)&pColor->spec, (char *)&uvY_return, sizeof(XcmsCIEuvY));
+
+       /* Identify that the format is now CIEuvY */
+       pColor->format = XcmsCIEuvYFormat;
+    }
+    return(XcmsSuccess);
+}
+
+\f
+/*
+ *     NAME
+ *             XcmsCIEuvYToCIELuv - convert CIEuvY to CIELuv
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsCIEuvYToCIELuv(
+    XcmsCCC ccc,
+    XcmsColor *pLuv_WhitePt,
+    XcmsColor *pColors_in_out,
+    unsigned int nColors)
+/*
+ *     DESCRIPTION
+ *             Converts color specifications in an array of XcmsColor
+ *             structures from CIEuvY format to CIELab format.
+ *
+ *     RETURNS
+ *             XcmsFailure if failed,
+ *             XcmsSuccess if succeeded.
+ *
+ */
+{
+    XcmsColor  *pColor = pColors_in_out;
+    XcmsColor  whitePt;
+    XcmsCIELuv Luv_return;
+    XcmsFloat  tmpVal;
+    register int i;
+
+    /*
+     * Check arguments
+     */
+    if (pLuv_WhitePt == NULL || pColors_in_out == NULL) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Make sure white point is in CIEuvY form
+     */
+    if (pLuv_WhitePt->format != XcmsCIEuvYFormat) {
+       /* Make copy of the white point because we're going to modify it */
+       memcpy((char *)&whitePt, (char *)pLuv_WhitePt, sizeof(XcmsColor));
+       if (!_XcmsDIConvertColors(ccc, &whitePt,
+               (XcmsColor *)NULL, 1, XcmsCIEuvYFormat)) {
+           return(XcmsFailure);
+       }
+       pLuv_WhitePt = &whitePt;
+    }
+    /* Make sure it is a white point, i.e., Y == 1.0 */
+    if (pLuv_WhitePt->spec.CIEuvY.Y != 1.0) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Now convert each XcmsColor structure to CIEXYZ form
+     */
+    for (i = 0; i < nColors; i++, pColor++) {
+
+       if (!_XcmsCIEuvY_ValidSpec(pColor)) {
+           return(XcmsFailure);
+       }
+
+       /* Now convert the uvY to Luv */
+       Luv_return.L_star =
+           (pColor->spec.CIEuvY.Y < 0.008856)
+           ?
+           (pColor->spec.CIEuvY.Y * 903.29)
+           :
+           ((XcmsFloat)(XCMS_CUBEROOT(pColor->spec.CIEuvY.Y) * 116.0) - 16.0);
+       tmpVal = 13.0 * (Luv_return.L_star / 100.0);
+       Luv_return.u_star = tmpVal *
+          (pColor->spec.CIEuvY.u_prime - pLuv_WhitePt->spec.CIEuvY.u_prime);
+       Luv_return.v_star = tmpVal *
+          (pColor->spec.CIEuvY.v_prime - pLuv_WhitePt->spec.CIEuvY.v_prime);
+
+       /* Copy result to pColor */
+       memcpy((char *)&pColor->spec, (char *)&Luv_return, sizeof(XcmsCIELuv));
+
+       /* Identify that the format is now CIEuvY */
+       pColor->format = XcmsCIELuvFormat;
+    }
+    return(XcmsSuccess);
+}
diff --git a/src/xcms/LuvGcC.c b/src/xcms/LuvGcC.c
new file mode 100644 (file)
index 0000000..cadf4a8
--- /dev/null
@@ -0,0 +1,127 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of XCMS based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *     NAME
+ *             CIELuvGcC.c
+ *
+ *     DESCRIPTION
+ *             Source for XcmsCIELuvClipuv() gamut compression routine.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsCIELuvClipuv - Reduce the chroma for a hue and L*
+ *
+ *     SYNOPSIS
+ */
+/* ARGSUSED */
+Status
+XcmsCIELuvClipuv (
+    XcmsCCC ccc,
+    XcmsColor *pColors_in_out,
+    unsigned int nColors,
+    unsigned int i,
+    Bool *pCompressed)
+/*
+ *     DESCRIPTION
+ *             Reduce the Chroma for a specific hue and chroma to
+ *             to bring the given color into the gamut of the
+ *             specified device.  As required of gamut compression
+ *             functions, this routine returns pColor_in_out
+ *             in XcmsCIEXYZFormat on successful completion.
+ *
+ *             Since this routine works with the L* within
+ *             pColor_in_out intermediate results may be returned
+ *             even though it may be invalid.
+ *
+ *     RETURNS
+ *             XcmsFailure - Failure
+ *              XcmsSuccess - Succeeded
+ *
+ */
+{
+    Status retval;
+    XcmsColor *pColor;
+
+    /*
+     * Color specification passed as input can be assumed to:
+     * 1. Be in XcmsCIEXYZFormat
+     * 2. Already be white point adjusted for the Screen White Point.
+     *     This means that the white point now associated with this
+     *     color spec is the Screen White Point (even if the
+     *     ccc->clientWhitePt differs).
+     */
+
+    pColor = pColors_in_out + i;
+
+    if (ccc->visual->class < PseudoColor) {
+       /*
+        * GRAY !
+        */
+       _XcmsDIConvertColors(ccc, pColor, ScreenWhitePointOfCCC(ccc),
+               1, XcmsCIELuvFormat);
+       _XcmsDIConvertColors(ccc, pColor, ScreenWhitePointOfCCC(ccc),
+               1, XcmsCIEXYZFormat);
+       if (pCompressed) {
+           *(pCompressed + i) = True;
+       }
+       return(XcmsSuccess);
+    } else {
+       if (pColor->format != XcmsCIELuvFormat) {
+           if (_XcmsDIConvertColors(ccc, pColor,
+                   &ccc->pPerScrnInfo->screenWhitePt, 1, XcmsCIELuvFormat)
+                   == XcmsFailure) {
+               return(XcmsFailure);
+           }
+       }
+       if (XcmsCIELuvQueryMaxC(ccc,
+               degrees(XCMS_CIELUV_PMETRIC_HUE(pColor->spec.CIELuv.u_star,
+                                               pColor->spec.CIELuv.v_star)),
+               pColor->spec.CIELuv.L_star,
+               pColor) == XcmsFailure) {
+           return(XcmsFailure);
+       }
+       retval = _XcmsDIConvertColors(ccc, pColor,
+               &ccc->pPerScrnInfo->screenWhitePt, 1, XcmsCIEXYZFormat);
+       if (retval != XcmsFailure && pCompressed != NULL) {
+           *(pCompressed + i) = True;
+       }
+       return(retval);
+    }
+}
diff --git a/src/xcms/LuvGcL.c b/src/xcms/LuvGcL.c
new file mode 100644 (file)
index 0000000..f5b6d99
--- /dev/null
@@ -0,0 +1,174 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of XCMS based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *     NAME
+ *             CIELuvGcL.c
+ *
+ *     DESCRIPTION
+ *             Source for XcmsCIELuvClipL() gamut compression routine.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsCIELuvClipL - Return the closest L*
+ *
+ *     SYNOPSIS
+ */
+/* ARGSUSED */
+Status
+XcmsCIELuvClipL (
+    XcmsCCC ccc,
+    XcmsColor *pColors_in_out,
+    unsigned int nColors,
+    unsigned int i,
+    Bool *pCompressed)
+/*
+ *     DESCRIPTION
+ *             Return the closest L* for a specific hue and chroma.
+ *             This routine takes any color as input and outputs
+ *             a CIE XYZ color.
+ *
+ *             Since this routine works with the L* within
+ *             pColor_in_out intermediate results may be returned
+ *             even though it may be invalid.
+ *
+ *     RETURNS
+ *             XcmsFailure - Failure
+ *              XcmsSuccess - Succeeded
+ *
+ */
+{
+    XcmsCCCRec myCCC;
+    XcmsColor  *pColor;
+    XcmsColor   Luv_max;
+    XcmsFloat  hue, chroma, maxChroma;
+    Status retval;
+
+    /* Use my own CCC */
+    memcpy ((char *)&myCCC, (char *)ccc, sizeof(XcmsCCCRec));
+    myCCC.clientWhitePt.format = XcmsUndefinedFormat;/* Inherit Screen WP */
+    myCCC.gamutCompProc = (XcmsCompressionProc)NULL;/* no gamut compression */
+
+    /*
+     * Color specification passed as input can be assumed to:
+     * 1. Be in XcmsCIEXYZFormat
+     * 2. Already be white point adjusted for the Screen White Point.
+     *     This means that the white point now associated with this
+     *     color spec is the Screen White Point (even if the
+     *     ccc->clientWhitePt differs).
+     */
+
+    pColor = pColors_in_out + i;
+
+    if (ccc->visual->class < StaticColor) {
+       /*
+        * GRAY !
+        */
+       return(XcmsFailure);
+    } else {
+       /* Convert from CIEXYZ to CIE L*u*v* format */
+       if (_XcmsDIConvertColors(&myCCC, pColor,
+               ScreenWhitePointOfCCC(&myCCC), 1, XcmsCIELuvFormat)
+               == XcmsFailure) {
+           return(XcmsFailure);
+       }
+
+       hue = XCMS_CIELUV_PMETRIC_HUE(pColor->spec.CIELuv.u_star,
+                                     pColor->spec.CIELuv.v_star);
+       chroma = XCMS_CIELUV_PMETRIC_CHROMA(pColor->spec.CIELuv.u_star,
+                                           pColor->spec.CIELuv.v_star);
+       /* Step 1: compute the maximum L* and chroma for this hue. */
+       /*         This copy may be overkill but it preserves the pixel etc. */
+       memcpy((char *)&Luv_max, (char *)pColor, sizeof(XcmsColor));
+       if (_XcmsCIELuvQueryMaxLCRGB (&myCCC, hue, &Luv_max,
+               (XcmsRGBi *)NULL) == XcmsFailure) {
+           return (XcmsFailure);
+       }
+       maxChroma = XCMS_CIELUV_PMETRIC_CHROMA(Luv_max.spec.CIELuv.u_star,
+                                              Luv_max.spec.CIELuv.v_star);
+
+       /* Now check and return the appropriate L* */
+       if (chroma == maxChroma) {
+           /* When the chroma input is equal to the maximum chroma */
+           /* merely return the L* for that chroma. */
+           memcpy((char *)pColor, (char *)&Luv_max, sizeof(XcmsColor));
+           retval = _XcmsDIConvertColors(&myCCC, pColor,
+                   ScreenWhitePointOfCCC(&myCCC), 1, XcmsCIEXYZFormat);
+       } else if (chroma > maxChroma) {
+           /* When the chroma input is greater than the maximum chroma */
+           /* merely return the L* and chroma for the given hue. */
+           memcpy((char *)pColor, (char *)&Luv_max, sizeof(XcmsColor));
+           return (XcmsFailure);
+       } else if (pColor->spec.CIELuv.L_star < Luv_max.spec.CIELuv.L_star) {
+           /* Find the minimum lightness for the given chroma. */
+           if (pColor->format != XcmsCIELuvFormat) {
+               if (_XcmsDIConvertColors(ccc, pColor,
+                       ScreenWhitePointOfCCC(ccc), 1, XcmsCIELuvFormat)
+                       == XcmsFailure) {
+                   return(XcmsFailure);
+               }
+           }
+           if (XcmsCIELuvQueryMinL(&myCCC, degrees(hue), chroma, pColor)
+               == XcmsFailure) {
+                   return (XcmsFailure);
+           }
+           retval = _XcmsDIConvertColors(&myCCC, pColor,
+                          ScreenWhitePointOfCCC(&myCCC), 1, XcmsCIEXYZFormat);
+       } else {
+           /* Find the maximum lightness for the given chroma. */
+           if (pColor->format != XcmsCIELuvFormat) {
+               if (_XcmsDIConvertColors(ccc, pColor,
+                             ScreenWhitePointOfCCC(ccc), 1, XcmsCIELuvFormat)
+                       == XcmsFailure) {
+                   return(XcmsFailure);
+               }
+           }
+           if (XcmsCIELuvQueryMaxL(&myCCC, degrees(hue), chroma, pColor)
+               == XcmsFailure) {
+                   return (XcmsFailure);
+           }
+           retval = _XcmsDIConvertColors(&myCCC, pColor,
+                          ScreenWhitePointOfCCC(&myCCC), 1, XcmsCIEXYZFormat);
+       }
+       if (retval != XcmsFailure && pCompressed != NULL) {
+           *(pCompressed + i) = True;
+       }
+       return(retval);
+    }
+}
diff --git a/src/xcms/LuvGcLC.c b/src/xcms/LuvGcLC.c
new file mode 100644 (file)
index 0000000..a9f8cba
--- /dev/null
@@ -0,0 +1,223 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of XCMS based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *     NAME
+ *             CIELuvGcLC.c
+ *
+ *     DESCRIPTION
+ *             Source for XcmsCIELuvClipLuv() gamut
+ *             compression function.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include <math.h>
+#include "Cv.h"
+
+/*
+ *     INTERNALS
+ *             Internal defines that need NOT be exported to any package or
+ *             program using this package.
+ */
+#define MAXBISECTCOUNT 100
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsCIELuvClipLuv - Return the closest L* and chroma
+ *
+ *     SYNOPSIS
+ */
+/* ARGSUSED */
+Status
+XcmsCIELuvClipLuv (
+    XcmsCCC ccc,
+    XcmsColor *pColors_in_out,
+    unsigned int nColors,
+    unsigned int i,
+    Bool *pCompressed)
+/*
+ *     DESCRIPTION
+ *             This routine will find the closest L* and chroma
+ *             for a specific hue.  The color input is converted to
+ *             CIE L*u*v* format and returned as CIE XYZ format.
+ *
+ *             Since this routine works with the L* within
+ *             pColor_in_out intermediate results may be returned
+ *             even though it may be invalid.
+ *
+ *     RETURNS
+ *             XcmsFailure - Failure
+ *              XcmsSuccess - Succeeded
+ *
+ */
+{
+    Status retval;
+    XcmsCCCRec myCCC;
+    XcmsColor  *pColor;
+    XcmsColor  Luv_max;
+    XcmsFloat  hue, chroma, maxChroma;
+    XcmsFloat  Chroma, bestChroma, Lstar, maxLstar, saveLstar;
+    XcmsFloat  bestLstar, bestustar, bestvstar;
+    XcmsFloat  nT, saveDist, tmpDist;
+    XcmsRGBi   rgb_max;
+    int                nCount, nMaxCount, nI, nILast;
+
+    /* Use my own CCC */
+    memcpy ((char *)&myCCC, (char *)ccc, sizeof(XcmsCCCRec));
+    myCCC.clientWhitePt.format = XcmsUndefinedFormat;/* inherit screen white */
+    myCCC.gamutCompProc = (XcmsCompressionProc)NULL;/* no gamut compression func */
+
+    /*
+     * Color specification passed as input can be assumed to:
+     * 1. Be in XcmsCIEXYZFormat
+     * 2. Already be white point adjusted for the Screen White Point.
+     *     This means that the white point now associated with this
+     *     color spec is the Screen White Point (even if the
+     *     ccc->clientWhitePt differs).
+     */
+
+    pColor = pColors_in_out + i;
+
+    if (ccc->visual->class < StaticColor) {
+       /*
+        * GRAY !
+        */
+       _XcmsDIConvertColors(ccc, pColor, ScreenWhitePointOfCCC(ccc),
+               1, XcmsCIELuvFormat);
+       _XcmsDIConvertColors(ccc, pColor, ScreenWhitePointOfCCC(ccc),
+               1, XcmsCIEXYZFormat);
+       if (pCompressed) {
+           *(pCompressed + i) = True;
+       }
+       return(XcmsSuccess);
+    }
+
+    /* Convert from CIEXYZ to CIELuv format */
+    if (_XcmsDIConvertColors(&myCCC, pColor,
+                           ScreenWhitePointOfCCC(&myCCC), 1, XcmsCIELuvFormat)
+               == XcmsFailure) {
+       return(XcmsFailure);
+    }
+
+    /* Step 1: compute the maximum L* and chroma for this hue. */
+    /*         This copy may be overkill but it preserves the pixel etc. */
+    saveLstar = pColor->spec.CIELuv.L_star;
+    hue = XCMS_CIELUV_PMETRIC_HUE(pColor->spec.CIELuv.u_star,
+                                 pColor->spec.CIELuv.v_star);
+    chroma = XCMS_CIELUV_PMETRIC_CHROMA(pColor->spec.CIELuv.u_star,
+                                       pColor->spec.CIELuv.v_star);
+    memcpy((char *)&Luv_max, (char *)pColor, sizeof(XcmsColor));
+    if (_XcmsCIELuvQueryMaxLCRGB (&myCCC, hue, &Luv_max, &rgb_max)
+           == XcmsFailure) {
+       return (XcmsFailure);
+    }
+    maxLstar = Luv_max.spec.CIELuv.L_star;
+
+    /* Now check and return the appropriate L* */
+    if (saveLstar == maxLstar) {
+       /* When the L* input is equal to the maximum L* */
+       /* merely return the maximum Luv point. */
+       memcpy((char *)pColor, (char *)&Luv_max, sizeof(XcmsColor));
+       retval = _XcmsDIConvertColors(&myCCC, pColor,
+                          ScreenWhitePointOfCCC(&myCCC), 1, XcmsCIEXYZFormat);
+    } else {
+       /* return the closest point on the hue leaf. */
+       /* must do a bisection here to compute the delta e. */
+       maxChroma = XCMS_CIELUV_PMETRIC_CHROMA(Luv_max.spec.CIELuv.u_star,
+                                              Luv_max.spec.CIELuv.v_star);
+       nMaxCount = MAXBISECTCOUNT;
+       nI = nMaxCount / 2;
+       bestLstar = Lstar = pColor->spec.CIELuv.L_star;
+       bestustar = pColor->spec.CIELuv.u_star;
+       bestvstar = pColor->spec.CIELuv.v_star;
+       bestChroma = Chroma = chroma;
+       saveDist = XCMS_SQRT(((Chroma - maxChroma) * (Chroma - maxChroma)) +
+                            ((Lstar - maxLstar) * (Lstar - maxLstar)));
+       for (nCount = 0; nCount < nMaxCount; nCount++) {
+           nT = (XcmsFloat) nI / (XcmsFloat) nMaxCount;
+           if (saveLstar > maxLstar) {
+               pColor->spec.RGBi.red   = rgb_max.red * (1.0 - nT) + nT;
+               pColor->spec.RGBi.green = rgb_max.green * (1.0 - nT) + nT;
+               pColor->spec.RGBi.blue  = rgb_max.blue * (1.0 - nT) + nT;
+           } else {
+               pColor->spec.RGBi.red   = rgb_max.red - (rgb_max.red * nT);
+               pColor->spec.RGBi.green = rgb_max.green - (rgb_max.green * nT);
+               pColor->spec.RGBi.blue  = rgb_max.blue - (rgb_max.blue * nT);
+           }
+           pColor->format = XcmsRGBiFormat;
+
+           /* Convert from RGBi to CIE Luv */
+           if (_XcmsConvertColorsWithWhitePt(&myCCC, pColor,
+                           ScreenWhitePointOfCCC(&myCCC), 1, XcmsCIELuvFormat,
+                           (Bool *) NULL) == XcmsFailure) {
+               return (XcmsFailure);
+           }
+           chroma = XCMS_CIELUV_PMETRIC_CHROMA(pColor->spec.CIELuv.u_star,
+                                               pColor->spec.CIELuv.v_star);
+           tmpDist = XCMS_SQRT(((Chroma - chroma) * (Chroma - chroma)) +
+                               ((Lstar - pColor->spec.CIELuv.L_star) *
+                                (Lstar - pColor->spec.CIELuv.L_star)));
+           nILast = nI;
+           if (tmpDist > saveDist) {
+               nI /= 2;
+           } else {
+               nI = (nMaxCount + nI) / 2;
+               saveDist = tmpDist;
+               bestLstar = pColor->spec.CIELuv.L_star;
+               bestustar = pColor->spec.CIELuv.u_star;
+               bestvstar = pColor->spec.CIELuv.v_star;
+               bestChroma = chroma;
+           }
+           if (nI == nILast || nI == 0) {
+               break;
+           }
+       }
+       if (bestChroma >= maxChroma) {
+           pColor->spec.CIELuv.L_star = maxLstar;
+           pColor->spec.CIELuv.u_star = Luv_max.spec.CIELuv.u_star;
+           pColor->spec.CIELuv.v_star = Luv_max.spec.CIELuv.v_star;
+       } else {
+           pColor->spec.CIELuv.L_star = bestLstar;
+           pColor->spec.CIELuv.u_star = bestustar;
+           pColor->spec.CIELuv.v_star = bestvstar;
+       }
+       retval = _XcmsDIConvertColors(&myCCC, pColor,
+                          ScreenWhitePointOfCCC(&myCCC), 1, XcmsCIEXYZFormat);
+
+       if (retval != XcmsFailure && pCompressed != NULL) {
+           *(pCompressed + i) = True;
+       }
+    }
+    return(retval);
+}
diff --git a/src/xcms/LuvMnL.c b/src/xcms/LuvMnL.c
new file mode 100644 (file)
index 0000000..b873fa6
--- /dev/null
@@ -0,0 +1,216 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of XCMS based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *     NAME
+ *             CIELuvMnL.c
+ *
+ *     DESCRIPTION
+ *             Source for the XcmsCIELuvQueryMinL() gamut boundary
+ *             querying routine.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include <math.h>
+#include "Cv.h"
+
+/*
+ *     DEFINES
+ */
+#define MAXBISECTCOUNT 100
+#define EPS            (XcmsFloat)0.001
+#define START_L_STAR   (XcmsFloat)40.0
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsCIELuvQueryMinL - Compute max Lstar for a hue and chroma
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsCIELuvQueryMinL(
+    XcmsCCC ccc,
+    XcmsFloat hue_angle,           /* hue angle in degrees */
+    XcmsFloat chroma,
+    XcmsColor *pColor_return)
+/*
+ *     DESCRIPTION
+ *             Return the maximum Lstar for a specified hue_angle and chroma.
+ *
+ *     ASSUMPTIONS
+ *             This routine assumes that the white point associated with
+ *             the color specification is the Screen White Point.  The
+ *             Screen White Point will also be associated with the
+ *             returned color specification.
+ *
+ *     RETURNS
+ *             XcmsFailure - Failure
+ *              XcmsSuccess - Succeeded with no modifications
+ *
+ */
+{
+    XcmsCCCRec myCCC;
+    XcmsColor   max_lc, tmp, prev;
+    XcmsFloat   max_chroma, tmp_chroma;
+    XcmsFloat   hue, nT, nChroma, lastChroma, prevChroma;
+    XcmsFloat   rFactor;
+    XcmsRGBi    rgb_saved;
+    int         nCount, nMaxCount;
+
+    /*
+     * Check Arguments
+     */
+    if (ccc == NULL || pColor_return == NULL) {
+       return(XcmsFailure);
+    }
+
+    /* setup the CCC to use for the conversions. */
+    memcpy ((char *) &myCCC, (char *) ccc, sizeof(XcmsCCCRec));
+    myCCC.clientWhitePt.format = XcmsUndefinedFormat;
+    myCCC.gamutCompProc = (XcmsCompressionProc) NULL;
+
+    while (hue_angle < 0.0) {
+       hue_angle += 360.0;
+    }
+    while (hue_angle >= 360.0) {
+       hue_angle -= 360.0;
+    }
+
+    hue = radians(hue_angle);
+    tmp.spec.CIELuv.L_star = START_L_STAR;
+    tmp.spec.CIELuv.u_star = XCMS_CIEUSTAROFHUE(hue, chroma);
+    tmp.spec.CIELuv.v_star = XCMS_CIEVSTAROFHUE(hue, chroma);
+    tmp.pixel = pColor_return->pixel;
+    tmp.format = XcmsCIELuvFormat;
+
+    /* Step 1: Obtain the maximum L_star and chroma for this hue. */
+    if (_XcmsCIELuvQueryMaxLCRGB(&myCCC, hue, &max_lc, &rgb_saved)
+           == XcmsFailure) {
+       return(XcmsFailure);
+    }
+
+    max_chroma = XCMS_CIELUV_PMETRIC_CHROMA(max_lc.spec.CIELuv.u_star,
+                                           max_lc.spec.CIELuv.v_star);
+
+    if (max_chroma <= chroma) {
+       /*
+        *  If the chroma is greater than the chroma for the
+        *  maximum L/chroma point then the L_star is the
+        *  the L_star for the maximum L_star/chroma point.
+        *  This is an error but I return the best approximation I can.
+         *  Thus the inconsistency.
+        */
+       memcpy ((char *) pColor_return, (char *) &max_lc, sizeof (XcmsColor));
+       return(XcmsSuccess);
+    }
+
+    /*
+     *  If the chroma is equal to the chroma for the
+     *  maximum L_star/chroma point then the L_star is the
+     *  the L_star for the maximum L* and chroma point.
+     */
+    /* if (max_chroma == chroma) {
+     *  memcpy ((char *) pColor_return, (char *) &max_lc, sizeof (XcmsColor));
+     * return(XcmsSuccess);
+     *    }
+     */
+
+    /* must do a bisection here to compute the maximum L* */
+    /* save the structure input so that any elements that */
+    /* are not touched are recopied later in the routine. */
+    nChroma = chroma;
+    tmp_chroma = max_chroma;
+    lastChroma = -1.0;
+    nMaxCount = MAXBISECTCOUNT;
+    rFactor = 1.0;
+
+    for (nCount = 0; nCount < nMaxCount; nCount++) {
+       prevChroma = lastChroma;
+       lastChroma = tmp_chroma;
+       nT = (nChroma - max_chroma) / max_chroma * rFactor;
+       memcpy ((char *)&prev, (char *)&tmp, sizeof(XcmsColor));
+       tmp.spec.RGBi.red   = rgb_saved.red + (rgb_saved.red * nT);
+       tmp.spec.RGBi.green = rgb_saved.green + (rgb_saved.green * nT);
+       tmp.spec.RGBi.blue  = rgb_saved.blue + (rgb_saved.blue * nT);
+       tmp.format = XcmsRGBiFormat;
+
+       /* convert from RGB to CIELuv */
+       if (_XcmsConvertColorsWithWhitePt(&myCCC, &tmp,
+               ScreenWhitePointOfCCC(&myCCC), 1, XcmsCIELuvFormat,
+               (Bool *) NULL) == XcmsFailure) {
+           return(XcmsFailure);
+       }
+
+       /* Now check the return against what is expected */
+       tmp_chroma = XCMS_CIELUV_PMETRIC_CHROMA(tmp.spec.CIELuv.u_star,
+                                               tmp.spec.CIELuv.v_star);
+       if (tmp_chroma <= chroma + EPS && tmp_chroma >= chroma - EPS) {
+           /* Found It! */
+           memcpy ((char *) pColor_return, (char *) &tmp, sizeof (XcmsColor));
+           return(XcmsSuccess);
+       }
+       nChroma += chroma - tmp_chroma;
+       if (nChroma > max_chroma) {
+           nChroma = max_chroma;
+           rFactor *= 0.5;  /* selective relaxation employed */
+       } else if (nChroma < 0.0) {
+           if (XCMS_FABS(lastChroma - chroma) <
+               XCMS_FABS(tmp_chroma - chroma)) {
+               memcpy ((char *)pColor_return, (char *)&prev,
+                       sizeof(XcmsColor));
+           } else {
+               memcpy ((char *)pColor_return, (char *)&tmp,
+                       sizeof(XcmsColor));
+           }
+           return(XcmsSuccess);
+       } else if (tmp_chroma <= prevChroma + EPS &&
+                  tmp_chroma >= prevChroma - EPS) {
+           rFactor *= 0.5;  /* selective relaxation employed */
+       }
+    }
+
+    if (nCount >= nMaxCount) {
+       if (XCMS_FABS(lastChroma - chroma) <
+           XCMS_FABS(tmp_chroma - chroma)) {
+               memcpy ((char *)pColor_return, (char *)&prev,
+                       sizeof(XcmsColor));
+           } else {
+               memcpy ((char *)pColor_return, (char *)&tmp,
+                       sizeof(XcmsColor));
+       }
+    }
+    memcpy ((char *) pColor_return, (char *) &tmp, sizeof (XcmsColor));
+    return(XcmsSuccess);
+}
diff --git a/src/xcms/LuvMxC.c b/src/xcms/LuvMxC.c
new file mode 100644 (file)
index 0000000..a672514
--- /dev/null
@@ -0,0 +1,204 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of XCMS based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *
+ *     NAME
+ *             CIELuvMxC.c
+ *
+ *     DESCRIPTION
+ *             Source for the XcmsCIELuvQueryMaxC() gamut boundary
+ *             querying routine.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include <math.h>
+#include "Cv.h"
+
+/*
+ *     DEFINES
+ */
+#define MAXBISECTCOUNT 100
+#define EPS            (XcmsFloat)0.001
+#define START_CHROMA   (XcmsFloat)2.2
+#define TOPL           (XcmsFloat)100.0
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsCIELuvQueryMaxC - max chroma for a hue_angle and L_star
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsCIELuvQueryMaxC(
+    XcmsCCC ccc,
+    XcmsFloat hue_angle,           /* hue angle in degrees */
+    XcmsFloat L_star,
+    XcmsColor *pColor_return)
+/*
+ *     DESCRIPTION
+ *             Return the maximum chroma for a specific hue_angle and L_star.
+ *             The returned format is in XcmsCIELuvFormat.
+ *
+ *
+ *     ASSUMPTIONS
+ *             This routine assumes that the white point associated with
+ *             the color specification is the Screen White Point.  The
+ *             Screen White Point will also be associated with the
+ *             returned color specification.
+ *
+ *     RETURNS
+ *             XcmsFailure - Failure
+ *              XcmsSuccess - Succeeded
+ *
+ */
+{
+    XcmsCCCRec myCCC;
+    XcmsColor  tmp;
+    XcmsColor  max_lc;
+    XcmsFloat n_L_star, last_L_star, prev_L_star;
+    XcmsFloat hue, lastuStar, lastvStar, /*lastChroma,*/ maxDist, nT, rFactor;
+    XcmsRGBi   rgb_saved;
+    int nCount, nMaxCount;
+
+    /*
+     * Check Arguments
+     */
+    if (ccc == NULL || pColor_return == NULL) {
+       return(XcmsFailure);
+    }
+
+    /* Use my own CCC  and inherit screen white Pt */
+    memcpy ((char *)&myCCC, (char *)ccc, sizeof(XcmsCCCRec));
+    myCCC.clientWhitePt.format = XcmsUndefinedFormat;
+    myCCC.gamutCompProc = (XcmsCompressionProc)NULL;/* no gamut comp func */
+
+    while (hue_angle < 0.0) {
+       hue_angle += 360.0;
+    }
+    while (hue_angle >= 360.0) {
+       hue_angle -= 360.0;
+    }
+
+    hue = radians(hue_angle);
+    tmp.spec.CIELuv.L_star = L_star;
+    tmp.spec.CIELuv.u_star = XCMS_CIEUSTAROFHUE(hue, START_CHROMA);
+    tmp.spec.CIELuv.v_star = XCMS_CIEVSTAROFHUE(hue, START_CHROMA);
+    tmp.pixel = pColor_return->pixel;
+    tmp.format = XcmsCIELuvFormat;
+
+    /* Step 1: compute the maximum L_star and chroma for this hue. */
+    memcpy((char *)&max_lc, (char *)&tmp, sizeof(XcmsColor));
+    if (_XcmsCIELuvQueryMaxLCRGB(&myCCC, hue, &max_lc, &rgb_saved)
+       == XcmsFailure) {
+           return(XcmsFailure);
+    }
+
+    /*
+     * Step 2:  Do a bisection here to compute the maximum chroma
+     *          Note the differences between when the point to be found
+     *          is above the maximum LC point and when it is below.
+     */
+    if (L_star <= max_lc.spec.CIELuv.L_star) {
+       maxDist = max_lc.spec.CIELuv.L_star;
+    } else {
+       maxDist = TOPL - max_lc.spec.CIELuv.L_star;
+    }
+
+    n_L_star = L_star;
+    last_L_star = -1.0;
+    nMaxCount = MAXBISECTCOUNT;
+    rFactor = 1.0;
+
+    for (nCount = 0; nCount < nMaxCount; nCount++) {
+       prev_L_star =  last_L_star;
+       last_L_star =  tmp.spec.CIELuv.L_star;
+/*     lastChroma = XCMS_CIELUV_PMETRIC_CHROMA(tmp.spec.CIELuv.u_star,  */
+/*                                             tmp.spec.CIELuv.v_star); */
+       lastuStar = tmp.spec.CIELuv.u_star;
+       lastvStar = tmp.spec.CIELuv.v_star;
+       nT = (n_L_star - max_lc.spec.CIELuv.L_star) / maxDist * rFactor;
+        /* printf("(n_L_star, nT) = %lf %lf ", n_L_star, nT); */
+       if (nT > 0) {
+           tmp.spec.RGBi.red = rgb_saved.red * (1.0 - nT) + nT;
+           tmp.spec.RGBi.green = rgb_saved.green * (1.0 - nT) + nT;
+           tmp.spec.RGBi.blue  = rgb_saved.blue * (1.0 - nT) + nT;
+       } else {
+           tmp.spec.RGBi.red = rgb_saved.red + (rgb_saved.red * nT);
+           tmp.spec.RGBi.green = rgb_saved.green + (rgb_saved.green * nT);
+           tmp.spec.RGBi.blue = rgb_saved.blue + (rgb_saved.blue * nT);
+       }
+       tmp.format = XcmsRGBiFormat;
+
+       /* convert from RGB to CIELuv */
+       if (_XcmsConvertColorsWithWhitePt(&myCCC, &tmp,
+                           ScreenWhitePointOfCCC(&myCCC), 1, XcmsCIELuvFormat,
+                           (Bool *) NULL) == XcmsFailure) {
+           return(XcmsFailure);
+       }
+
+       /*
+        * Now check if we've reached the target L_star
+        */
+       /* printf("result Lstar = %lf\n", tmp.spec.CIELuv.L_star); */
+       if (tmp.spec.CIELuv.L_star <= L_star + EPS &&
+           tmp.spec.CIELuv.L_star >= L_star - EPS) {
+               memcpy((char *)pColor_return, (char *)&tmp, sizeof(XcmsColor));
+               return(XcmsSuccess);
+       }
+       if (nT > 0) {
+           n_L_star += ((TOPL - n_L_star) *
+                        (L_star - tmp.spec.CIELuv.L_star)) / (TOPL - L_star);
+       } else {
+           n_L_star *= L_star / tmp.spec.CIELuv.L_star;
+       }
+       if (tmp.spec.CIELuv.L_star <= prev_L_star + EPS &&
+           tmp.spec.CIELuv.L_star >= prev_L_star - EPS) {
+               rFactor *= 0.5;  /* selective relaxation employed */
+               /* printf("rFactor = %lf\n", rFactor); */
+       }
+    }
+    if (XCMS_FABS(last_L_star - L_star) <
+       XCMS_FABS(tmp.spec.CIELuv.L_star - L_star)) {
+           tmp.spec.CIELuv.u_star = lastuStar;
+           tmp.spec.CIELuv.v_star = lastvStar;
+/*         tmp.spec.CIELuv.u_star = XCMS_CIEUSTAROFHUE(hue, lastChroma); */
+/*         tmp.spec.CIELuv.v_star = XCMS_CIEVSTAROFHUE(hue, lastChroma); */
+    }
+    tmp.spec.CIELuv.L_star = L_star;
+    memcpy((char *)pColor_return, (char *)&tmp, sizeof(XcmsColor));
+    return(XcmsSuccess);
+}
diff --git a/src/xcms/LuvMxL.c b/src/xcms/LuvMxL.c
new file mode 100644 (file)
index 0000000..d1d495b
--- /dev/null
@@ -0,0 +1,216 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of XCMS based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *     NAME
+ *             CIELuvMxL.c
+ *
+ *     DESCRIPTION
+ *             Source for the XcmsCIELuvQueryMaxL() gamut boundary
+ *             querying routine.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include <math.h>
+#include "Cv.h"
+
+/*
+ *     DEFINES
+ */
+#define MAXBISECTCOUNT 100
+#define EPS            (XcmsFloat)0.001
+#define START_L_STAR   (XcmsFloat)40.0
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsCIELuvQueryMaxL - Compute max Lstar for a hue and chroma
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsCIELuvQueryMaxL(
+    XcmsCCC ccc,
+    XcmsFloat hue_angle,           /* hue angle in degrees */
+    XcmsFloat chroma,
+    XcmsColor *pColor_return)
+/*
+ *     DESCRIPTION
+ *             Return the maximum Lstar for a specified hue_angle and chroma.
+ *
+ *     ASSUMPTIONS
+ *             This routine assumes that the white point associated with
+ *             the color specification is the Screen White Point.  The
+ *             Screen White Point will also be associated with the
+ *             returned color specification.
+ *
+ *     RETURNS
+ *             XcmsFailure - Failure
+ *              XcmsSuccess - Succeeded with no modifications
+ *
+ */
+{
+    XcmsCCCRec myCCC;
+    XcmsColor   max_lc, tmp, prev;
+    XcmsFloat   max_chroma, tmp_chroma;
+    XcmsFloat   hue, nT, nChroma, lastChroma, prevChroma;
+    XcmsFloat   rFactor;
+    XcmsRGBi    rgb_saved;
+    int         nCount, nMaxCount;
+
+    /*
+     * Check Arguments
+     */
+    if (ccc == NULL || pColor_return == NULL) {
+       return(XcmsFailure);
+    }
+
+    /* setup the CCC to use for the conversions. */
+    memcpy ((char *) &myCCC, (char *) ccc, sizeof(XcmsCCCRec));
+    myCCC.clientWhitePt.format = XcmsUndefinedFormat;
+    myCCC.gamutCompProc = (XcmsCompressionProc) NULL;
+
+    while (hue_angle < 0.0) {
+       hue_angle += 360.0;
+    }
+    while (hue_angle >= 360.0) {
+       hue_angle -= 360.0;
+    }
+
+    hue = radians(hue_angle);
+    tmp.spec.CIELuv.L_star = START_L_STAR;
+    tmp.spec.CIELuv.u_star = XCMS_CIEUSTAROFHUE(hue, chroma);
+    tmp.spec.CIELuv.v_star = XCMS_CIEVSTAROFHUE(hue, chroma);
+    tmp.pixel = pColor_return->pixel;
+    tmp.format = XcmsCIELuvFormat;
+
+    /* Step 1: Obtain the maximum L_star and chroma for this hue. */
+    if (_XcmsCIELuvQueryMaxLCRGB(&myCCC, hue, &max_lc, &rgb_saved)
+           == XcmsFailure) {
+       return(XcmsFailure);
+    }
+
+    max_chroma = XCMS_CIELUV_PMETRIC_CHROMA(max_lc.spec.CIELuv.u_star,
+                                           max_lc.spec.CIELuv.v_star);
+
+    if (max_chroma <= chroma) {
+       /*
+        *  If the chroma is greater than the chroma for the
+        *  maximum L/chroma point then the L_star is the
+        *  the L_star for the maximum L_star/chroma point.
+        *  This is an error but I return the best approximation I can.
+         *  Thus the inconsistency.
+        */
+       memcpy ((char *) pColor_return, (char *) &max_lc, sizeof (XcmsColor));
+       return(XcmsSuccess);
+    }
+
+    /*
+     *  If the chroma is equal to the chroma for the
+     *  maximum L_star/chroma point then the L_star is the
+     *  the L_star for the maximum L* and chroma point.
+     */
+    /* if (max_chroma == chroma) {
+     *  memcpy ((char *) pColor_return, (char *) &max_lc, sizeof (XcmsColor));
+     * return(XcmsSuccess);
+     *    }
+     */
+
+    /* must do a bisection here to compute the maximum L* */
+    /* save the structure input so that any elements that */
+    /* are not touched are recopied later in the routine. */
+    nChroma = chroma;
+    tmp_chroma = max_chroma;
+    lastChroma = -1.0;
+    nMaxCount = MAXBISECTCOUNT;
+    rFactor = 1.0;
+
+    for (nCount = 0; nCount < nMaxCount; nCount++) {
+       prevChroma = lastChroma;
+       lastChroma = tmp_chroma;
+       nT = (1.0 - (nChroma / max_chroma)) * rFactor;
+       memcpy ((char *)&prev, (char *)&tmp, sizeof(XcmsColor));
+       tmp.spec.RGBi.red   = rgb_saved.red * (1.0 - nT) + nT;
+       tmp.spec.RGBi.green = rgb_saved.green * (1.0 - nT) + nT;
+       tmp.spec.RGBi.blue  = rgb_saved.blue * (1.0 - nT) + nT;
+       tmp.format = XcmsRGBiFormat;
+
+       /* convert from RGB to CIELuv */
+       if (_XcmsConvertColorsWithWhitePt(&myCCC, &tmp,
+               ScreenWhitePointOfCCC(&myCCC), 1, XcmsCIELuvFormat,
+               (Bool *) NULL) == XcmsFailure) {
+           return(XcmsFailure);
+       }
+
+       /* Now check the return against what is expected */
+       tmp_chroma = XCMS_CIELUV_PMETRIC_CHROMA(tmp.spec.CIELuv.u_star,
+                                               tmp.spec.CIELuv.v_star);
+       if (tmp_chroma <= chroma + EPS && tmp_chroma >= chroma - EPS) {
+           /* Found It! */
+           memcpy ((char *) pColor_return, (char *) &tmp, sizeof (XcmsColor));
+           return(XcmsSuccess);
+       }
+       nChroma += chroma - tmp_chroma;
+       if (nChroma > max_chroma) {
+           nChroma = max_chroma;
+           rFactor *= 0.5;  /* selective relaxation employed */
+       } else if (nChroma < 0.0) {
+           if (XCMS_FABS(lastChroma - chroma) <
+               XCMS_FABS(tmp_chroma - chroma)) {
+               memcpy ((char *)pColor_return, (char *)&prev,
+                       sizeof(XcmsColor));
+           } else {
+               memcpy ((char *)pColor_return, (char *)&tmp,
+                       sizeof(XcmsColor));
+           }
+           return(XcmsSuccess);
+       } else if (tmp_chroma <= prevChroma + EPS &&
+                  tmp_chroma >= prevChroma - EPS) {
+           rFactor *= 0.5;  /* selective relaxation employed */
+       }
+    }
+
+    if (nCount >= nMaxCount) {
+       if (XCMS_FABS(lastChroma - chroma) <
+           XCMS_FABS(tmp_chroma - chroma)) {
+               memcpy ((char *)pColor_return, (char *)&prev,
+                       sizeof(XcmsColor));
+           } else {
+               memcpy ((char *)pColor_return, (char *)&tmp,
+                       sizeof(XcmsColor));
+       }
+    }
+    memcpy ((char *) pColor_return, (char *) &tmp, sizeof (XcmsColor));
+    return(XcmsSuccess);
+}
diff --git a/src/xcms/LuvMxLC.c b/src/xcms/LuvMxLC.c
new file mode 100644 (file)
index 0000000..60b9549
--- /dev/null
@@ -0,0 +1,218 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of XCMS based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *
+ *     NAME
+ *             CIELuvMxVC.c
+ *
+ *     DESCRIPTION
+ *             Source for the XcmsCIELuvQueryMaxLC() gamut boundary
+ *             querying routine.
+ *
+ *     DOCUMENTATION
+ *             "TekColor Color Management System, System Implementor's Manual"
+ *             and
+ *             Fred W. Billmeyer & Max Saltzman, "Principles of Color
+ *             Technology", John Wily & Sons, Inc, 1981.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+/*
+ *     DEFINES
+ */
+#define MIN(x,y)       ((x) > (y) ? (y) : (x))
+#define MIN3(x,y,z)    ((x) > (MIN((y), (z))) ? (MIN((y), (z))) : (x))
+#define MAX(x,y)       ((x) > (y) ? (x) : (y))
+#define MAX3(x,y,z)    ((x) > (MAX((y), (z))) ? (x) : (MAX((y), (z))))
+#define START_LSTAR    (XcmsFloat)40.0
+#define START_CHROMA   (XcmsFloat)2.2
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      API PRIVATE ROUTINES                           *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             _XcmsCIELuvQueryMaxLCRGB - Compute maximum L* and chroma.
+ *
+ *     SYNOPSIS
+ */
+Status
+_XcmsCIELuvQueryMaxLCRGB(
+    XcmsCCC    ccc,
+    XcmsFloat  hue,            /* hue in radians */
+    XcmsColor   *pColor_return,
+    XcmsRGBi    *pRGB_return)
+/*
+ *     DESCRIPTION
+ *             Return the maximum psychometric chroma for a specified
+ *             hue angle(radians), and the corresponding L*.  This is computed
+ *             by a binary search of all possible chromas.  An assumption
+ *             is made that there are no local maxima.  Use the unrounded
+ *             Max psychometric chroma because the difference check can be
+ *             small.
+ *
+ *             NOTE:  No local CCC is used because this is a private
+ *                    routine and all routines that call it are expected
+ *                    to behave properly, i.e. send a local CCC with
+ *                    no white adjust function and no gamut compression
+ *                    function.
+ *
+ *             This routine only accepts hue as input and outputs
+ *             Luv and RGBi.
+ *
+ *     RETURNS
+ *             XcmsFailure - Failure
+ *             XcmsSuccess - Succeeded
+ *
+ */
+{
+    XcmsFloat nSmall, nLarge;
+    XcmsColor tmp;
+
+    tmp.format = XcmsCIELuvFormat;
+    /*  Use some unreachable color on the given hue angle */
+    tmp.spec.CIELuv.L_star = START_LSTAR;
+    tmp.spec.CIELuv.u_star = XCMS_CIEUSTAROFHUE(hue, START_CHROMA);
+    tmp.spec.CIELuv.v_star = XCMS_CIEVSTAROFHUE(hue, START_CHROMA);
+    /*
+     * Convert from Luv to RGB
+     *
+     * Note that the CIEXYZ to RGBi conversion routine must stuff the
+     * out of bounds RGBi values in tmp when the ccc->gamutCompProc
+     * is NULL.
+     */
+    if ((_XcmsConvertColorsWithWhitePt(ccc, &tmp, ScreenWhitePointOfCCC(ccc),
+                              (unsigned int)1, XcmsRGBiFormat, (Bool *) NULL)
+           == XcmsFailure) && tmp.format != XcmsRGBiFormat) {
+       return (XcmsFailure);
+    }
+
+    /* Now pick the smallest RGB */
+    nSmall = MIN3(tmp.spec.RGBi.red,
+                 tmp.spec.RGBi.green,
+                 tmp.spec.RGBi.blue);
+    /* Make the smallest RGB equal to zero */
+    tmp.spec.RGBi.red   -= nSmall;
+    tmp.spec.RGBi.green -= nSmall;
+    tmp.spec.RGBi.blue  -= nSmall;
+
+    /* Now pick the largest RGB */
+    nLarge = MAX3(tmp.spec.RGBi.red,
+                 tmp.spec.RGBi.green,
+                 tmp.spec.RGBi.blue);
+    /* Scale the RGB values based on the largest one */
+    tmp.spec.RGBi.red   /= nLarge;
+    tmp.spec.RGBi.green /= nLarge;
+    tmp.spec.RGBi.blue  /= nLarge;
+    tmp.format = XcmsRGBiFormat;
+
+    /* If the calling routine wants RGB value give them the ones used. */
+    if (pRGB_return) {
+       pRGB_return->red   = tmp.spec.RGBi.red;
+       pRGB_return->green = tmp.spec.RGBi.green;
+       pRGB_return->blue  = tmp.spec.RGBi.blue;
+    }
+
+    /* Convert from RGBi to Luv */
+    if (_XcmsConvertColorsWithWhitePt(ccc, &tmp,
+              ScreenWhitePointOfCCC(ccc), 1, XcmsCIELuvFormat, (Bool *) NULL)
+           == XcmsFailure) {
+       return (XcmsFailure);
+    }
+
+    memcpy((char *)pColor_return, (char *)&tmp, sizeof(XcmsColor));
+    return (XcmsSuccess);
+}
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsCIELuvQueryMaxLC - Compute maximum L* and chroma.
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsCIELuvQueryMaxLC (
+    XcmsCCC ccc,
+    XcmsFloat hue_angle,           /* hue angle in degrees */
+    XcmsColor *pColor_return)
+
+/*
+ *     DESCRIPTION
+ *             Return the point of maximum chroma for the specified
+ *             hue angle.
+ *
+ *     ASSUMPTIONS
+ *             This routine assumes that the white point associated with
+ *             the color specification is the Screen White Point.  The
+ *             Screen White Point will also be associated with the
+ *             returned color specification.
+ *
+ *     RETURNS
+ *             XcmsFailure - Failure
+ *             XcmsSuccess - Succeeded
+ *
+ */
+{
+    XcmsCCCRec myCCC;
+
+    /*
+     * Check Arguments
+     */
+    if (ccc == NULL || pColor_return == NULL) {
+       return(XcmsFailure);
+    }
+
+    /* Use my own CCC */
+    memcpy ((char *)&myCCC, (char *)ccc, sizeof(XcmsCCCRec));
+    myCCC.clientWhitePt.format = XcmsUndefinedFormat;
+    myCCC.gamutCompProc = (XcmsCompressionProc)NULL;
+
+    while (hue_angle < 0.0) {
+       hue_angle += 360.0;
+    }
+    while (hue_angle >= 360.0) {
+       hue_angle -= 360.0;
+    }
+
+    return(_XcmsCIELuvQueryMaxLCRGB (&myCCC, radians(hue_angle), pColor_return,
+           (XcmsRGBi *)NULL));
+}
diff --git a/src/xcms/LuvWpAj.c b/src/xcms/LuvWpAj.c
new file mode 100644 (file)
index 0000000..aa2a3f4
--- /dev/null
@@ -0,0 +1,96 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of XCMS based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *             CIELuvWpAj.c
+ *
+ *     DESCRIPTION
+ *             This file contains routine(s) that support white point
+ *             adjustment of color specifications in the CIE CIELuv.color
+ *             space.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+\f
+
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsCIELuvWhiteShiftColors
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsCIELuvWhiteShiftColors(
+    XcmsCCC ccc,
+    XcmsColor *pWhitePtFrom,
+    XcmsColor *pWhitePtTo,
+    XcmsColorFormat destSpecFmt,
+    XcmsColor *pColors_in_out,
+    unsigned int nColors,
+    Bool *pCompressed)
+/*
+ *     DESCRIPTION
+ *             Adjusts color specifications in an array of XcmsColor
+ *             structures for white point differences.
+ *
+ *     RETURNS
+ *             XcmsFailure if failed,
+ *             XcmsSuccess if succeeded without gamut compression,
+ *             XcmsSuccessWithCompression if succeeded with
+ *                     gamut compression.
+ */
+{
+    if (pWhitePtFrom == NULL || pWhitePtTo == NULL || pColors_in_out == NULL) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Convert to CIELuv using pWhitePtFrom
+     *    We can ignore return value for compression because we are converting
+     *    to XcmsCIELuvFormat which is device-independent, not device-dependent.
+     */
+    if (_XcmsConvertColorsWithWhitePt(ccc, pColors_in_out, pWhitePtFrom,
+           nColors, XcmsCIELuvFormat, pCompressed) == XcmsFailure) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Convert from CIELuv to destSpecFmt using pWhitePtTo
+     */
+    return(_XcmsConvertColorsWithWhitePt(ccc, pColors_in_out, pWhitePtTo,
+           nColors, destSpecFmt, pCompressed));
+}
diff --git a/src/xcms/Makefile.am b/src/xcms/Makefile.am
new file mode 100644 (file)
index 0000000..40212c0
--- /dev/null
@@ -0,0 +1,100 @@
+noinst_LTLIBRARIES = libxcms.la
+
+AM_CPPFLAGS= \
+       -I$(top_srcdir)/include \
+       -I$(top_srcdir)/include/X11 \
+       -I$(top_builddir)/include \
+       -I$(top_builddir)/include/X11 \
+       -I$(top_srcdir)/src/xcms \
+       -I$(top_srcdir)/src/xkb \
+       -I$(top_srcdir)/src/xlibi18n \
+       -I$(top_srcdir)/src \
+       -D_BSD_SOURCE
+
+AM_CFLAGS= \
+       $(X11_CFLAGS) \
+       $(BIGFONT_CFLAGS) \
+       $(XMALLOC_ZERO_CFLAGS) \
+       $(CWARNFLAGS)
+
+libxcms_la_SOURCES = \
+                 AddDIC.c \
+                  AddSF.c \
+                  CCC.c \
+                  CvColW.c \
+                  CvCols.c \
+                  Cv.h \
+                  HVC.c \
+                  HVCGcC.c \
+                  HVCGcV.c \
+                  HVCGcVC.c \
+                  HVCMnV.c \
+                  HVCMxC.c \
+                  HVCMxV.c \
+                  HVCMxVC.c \
+                  HVCMxVs.c \
+                  HVCWpAj.c \
+                  IdOfPr.c \
+                  LRGB.c \
+                  Lab.c \
+                  LabGcC.c \
+                  LabGcL.c \
+                  LabGcLC.c \
+                  LabMnL.c \
+                  LabMxC.c \
+                  LabMxL.c \
+                  LabMxLC.c \
+                  LabWpAj.c \
+                  Luv.c \
+                  LuvGcC.c \
+                  LuvGcL.c \
+                  LuvGcLC.c \
+                  LuvMnL.c \
+                  LuvMxC.c \
+                  LuvMxL.c \
+                  LuvMxLC.c \
+                  LuvWpAj.c \
+                  OfCCC.c \
+                  PrOfId.c \
+                  QBlack.c \
+                  QBlue.c \
+                  QGreen.c \
+                  QRed.c \
+                  QWhite.c \
+                  QuCol.c \
+                  QuCols.c \
+                  SetCCC.c \
+                  SetGetCols.c \
+                  StCol.c \
+                  StCols.c \
+                  UNDEFINED.c \
+                  XRGB.c \
+                  XYZ.c \
+                  cmsAllCol.c \
+                  cmsAllNCol.c \
+                  cmsCmap.c \
+                  cmsColNm.c \
+                  cmsGlobls.c \
+                  cmsInt.c \
+                  cmsLkCol.c \
+                  cmsMath.c \
+                  cmsProp.c \
+                  cmsTrig.c \
+                  uvY.c \
+                  xyY.c \
+                  Xcmsint.h
+
+X11dir = $(libdir)/X11
+dist_X11_DATA = Xcms.txt
+
+
+if LINT
+# Check source code with tools like lint & sparse
+
+ALL_LINT_FLAGS=$(LINT_FLAGS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+               $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS)
+
+lint:
+       $(LINT) $(ALL_LINT_FLAGS) $(libxcms_la_SOURCES) -lm
+
+endif LINT
diff --git a/src/xcms/OfCCC.c b/src/xcms/OfCCC.c
new file mode 100644 (file)
index 0000000..06fc3d7
--- /dev/null
@@ -0,0 +1,162 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *             XcmsOfCCC.c - Color Conversion Context Querying Routines
+ *
+ *     DESCRIPTION
+ *             Routines to query components of a Color Conversion
+ *             Context structure.
+ *
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlib.h"
+#include "Xcms.h"
+
+\f
+
+/************************************************************************
+ *                                                                     *
+ *                     PUBLIC INTERFACES                               *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsDisplayOfCCC
+ *
+ *     SYNOPSIS
+ */
+
+Display *
+XcmsDisplayOfCCC(
+    XcmsCCC ccc)
+/*
+ *     DESCRIPTION
+ *             Queries the Display of the specified CCC.
+ *
+ *     RETURNS
+ *             Pointer to the Display.
+ *
+ */
+{
+    return(ccc->dpy);
+}
+
+\f
+/*
+ *     NAME
+ *             XcmsVisualOfCCC
+ *
+ *     SYNOPSIS
+ */
+
+Visual *
+XcmsVisualOfCCC(
+    XcmsCCC ccc)
+/*
+ *     DESCRIPTION
+ *             Queries the Visual of the specified CCC.
+ *
+ *     RETURNS
+ *             Pointer to the Visual.
+ *
+ */
+{
+    return(ccc->visual);
+}
+
+\f
+/*
+ *     NAME
+ *             XcmsScreenNumberOfCCC
+ *
+ *     SYNOPSIS
+ */
+
+int
+XcmsScreenNumberOfCCC(
+    XcmsCCC ccc)
+/*
+ *     DESCRIPTION
+ *             Queries the screen number of the specified CCC.
+ *
+ *     RETURNS
+ *             screen number.
+ *
+ */
+{
+    return(ccc->screenNumber);
+}
+
+\f
+/*
+ *     NAME
+ *             XcmsScreenWhitePointOfCCC
+ *
+ *     SYNOPSIS
+ */
+
+XcmsColor *
+XcmsScreenWhitePointOfCCC(
+    XcmsCCC ccc)
+/*
+ *     DESCRIPTION
+ *             Queries the screen white point of the specified CCC.
+ *
+ *     RETURNS
+ *             Pointer to the XcmsColor containing the screen white point.
+ *
+ */
+{
+    return(&ccc->pPerScrnInfo->screenWhitePt);
+}
+
+\f
+/*
+ *     NAME
+ *             XcmsClientWhitePointOfCCC
+ *
+ *     SYNOPSIS
+ */
+
+XcmsColor *
+XcmsClientWhitePointOfCCC(
+    XcmsCCC ccc)
+/*
+ *     DESCRIPTION
+ *             Queries the client white point of the specified CCC.
+ *
+ *     RETURNS
+ *             Pointer to the XcmsColor containing the client white point.
+ *
+ */
+{
+    return(&ccc->clientWhitePt);
+}
diff --git a/src/xcms/PrOfId.c b/src/xcms/PrOfId.c
new file mode 100644 (file)
index 0000000..a96d28c
--- /dev/null
@@ -0,0 +1,97 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *             XcmsPrOfId.c
+ *
+ *     DESCRIPTION
+ *             Source for XcmsPrefixOfFormat()
+ *
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+\f
+/*
+ *     NAME
+ *             XcmsPrefixOfId
+ *
+ *     SYNOPSIS
+ */
+char *
+XcmsPrefixOfFormat(
+    XcmsColorFormat    id)
+/*
+ *     DESCRIPTION
+ *             Returns the color space prefix for the specified color
+ *             space ID if the color space is found in the Color
+ *             Conversion Context.
+ *
+ *     RETURNS
+ *             Returns a color space prefix.
+ *
+ *     CAVEATS
+ *             Space is allocated for the returned string, therefore,
+ *             the application is responsible for freeing (using XFree)
+ *             the space.
+ *
+ */
+{
+    XcmsColorSpace     **papColorSpaces;
+
+    /*
+     * First try Device-Independent color spaces
+     */
+    papColorSpaces = _XcmsDIColorSpaces;
+    if (papColorSpaces != NULL) {
+       while (*papColorSpaces != NULL) {
+           if ((*papColorSpaces)->id == id) {
+               return strdup((*papColorSpaces)->prefix);
+           }
+           papColorSpaces++;
+       }
+    }
+
+    /*
+     * Next try Device-Dependent color spaces
+     */
+    papColorSpaces = _XcmsDDColorSpaces;
+    if (papColorSpaces != NULL) {
+       while (*papColorSpaces != NULL) {
+           if ((*papColorSpaces)->id == id) {
+               return strdup((*papColorSpaces)->prefix);
+           }
+           papColorSpaces++;
+       }
+    }
+
+    return(NULL);
+}
diff --git a/src/xcms/QBlack.c b/src/xcms/QBlack.c
new file mode 100644 (file)
index 0000000..d7a69d3
--- /dev/null
@@ -0,0 +1,84 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *             XcmsQBlack.c - Query Black
+ *
+ *     DESCRIPTION
+ *             Routine to obtain a color specification for zero
+ *             red, green, and blue intensities.
+ *
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcms.h"
+
+\f
+
+/************************************************************************
+ *                                                                     *
+ *                     PUBLIC INTERFACES                               *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsQueryBlack
+ *
+ *     SYNOPSIS
+ */
+
+Status
+XcmsQueryBlack(
+    XcmsCCC ccc,
+    XcmsColorFormat target_format,
+    XcmsColor *pColor_ret)
+/*
+ *     DESCRIPTION
+ *             Returns the color specification in the target format for
+ *             zero intensity red, green, and blue.
+ *
+ *     RETURNS
+ *             Returns XcmsSuccess, if failed; otherwise XcmsFailure
+ *
+ */
+{
+    XcmsColor tmp;
+
+    tmp.format = XcmsRGBiFormat;
+    tmp.pixel = 0;
+    tmp.spec.RGBi.red = 0.0;
+    tmp.spec.RGBi.green = 0.0;
+    tmp.spec.RGBi.blue = 0.0;
+    if (XcmsConvertColors(ccc, &tmp, 1, target_format, NULL) != XcmsSuccess) {
+       return(XcmsFailure);
+    }
+    memcpy((char *)pColor_ret, (char *)&tmp, sizeof(XcmsColor));
+    return(XcmsSuccess);
+}
diff --git a/src/xcms/QBlue.c b/src/xcms/QBlue.c
new file mode 100644 (file)
index 0000000..4555344
--- /dev/null
@@ -0,0 +1,84 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *             XcmsQBlue.c - Query Blue
+ *
+ *     DESCRIPTION
+ *             Routine to obtain a color specification for full
+ *             blue intensity and zero red and green intensities.
+ *
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcms.h"
+
+\f
+
+/************************************************************************
+ *                                                                     *
+ *                     PUBLIC INTERFACES                               *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsQueryBlue
+ *
+ *     SYNOPSIS
+ */
+
+Status
+XcmsQueryBlue(
+    XcmsCCC ccc,
+    XcmsColorFormat target_format,
+    XcmsColor *pColor_ret)
+/*
+ *     DESCRIPTION
+ *             Returns the color specification in the target format for
+ *             full intensity blue and zero intensity red and green.
+ *
+ *     RETURNS
+ *             Returns XcmsSuccess, if failed; otherwise XcmsFailure
+ *
+ */
+{
+    XcmsColor tmp;
+
+    tmp.format = XcmsRGBiFormat;
+    tmp.pixel = 0;
+    tmp.spec.RGBi.red = 0.0;
+    tmp.spec.RGBi.green = 0.0;
+    tmp.spec.RGBi.blue = 1.0;
+    if (XcmsConvertColors(ccc, &tmp, 1, target_format, NULL) != XcmsSuccess) {
+       return(XcmsFailure);
+    }
+    memcpy((char *)pColor_ret, (char *)&tmp, sizeof(XcmsColor));
+    return(XcmsSuccess);
+}
diff --git a/src/xcms/QGreen.c b/src/xcms/QGreen.c
new file mode 100644 (file)
index 0000000..0c88835
--- /dev/null
@@ -0,0 +1,84 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *             XcmsQGreen.c - Query Green
+ *
+ *     DESCRIPTION
+ *             Routine to obtain a color specification for full
+ *             green intensity and zero red and blue intensities.
+ *
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcms.h"
+
+\f
+
+/************************************************************************
+ *                                                                     *
+ *                     PUBLIC INTERFACES                               *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsQueryGreen
+ *
+ *     SYNOPSIS
+ */
+
+Status
+XcmsQueryGreen(
+    XcmsCCC ccc,
+    XcmsColorFormat target_format,
+    XcmsColor *pColor_ret)
+/*
+ *     DESCRIPTION
+ *             Returns the color specification in the target format for
+ *             full intensity green and zero intensity red and blue.
+ *
+ *     RETURNS
+ *             Returns XcmsSuccess, if failed; otherwise XcmsFailure
+ *
+ */
+{
+    XcmsColor tmp;
+
+    tmp.format = XcmsRGBiFormat;
+    tmp.pixel = 0;
+    tmp.spec.RGBi.red = 0.0;
+    tmp.spec.RGBi.green = 1.0;
+    tmp.spec.RGBi.blue = 0.0;
+    if (XcmsConvertColors(ccc, &tmp, 1, target_format, NULL) != XcmsSuccess) {
+       return(XcmsFailure);
+    }
+    memcpy((char *)pColor_ret, (char *)&tmp, sizeof(XcmsColor));
+    return(XcmsSuccess);
+}
diff --git a/src/xcms/QRed.c b/src/xcms/QRed.c
new file mode 100644 (file)
index 0000000..357380d
--- /dev/null
@@ -0,0 +1,84 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *             XcmsQRed.c - Query Red
+ *
+ *     DESCRIPTION
+ *             Routine to obtain a color specification for full
+ *             red intensity and zero  green and blue intensities.
+ *
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcms.h"
+
+\f
+
+/************************************************************************
+ *                                                                     *
+ *                     PUBLIC INTERFACES                               *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsQueryRed
+ *
+ *     SYNOPSIS
+ */
+
+Status
+XcmsQueryRed(
+    XcmsCCC ccc,
+    XcmsColorFormat target_format,
+    XcmsColor *pColor_ret)
+/*
+ *     DESCRIPTION
+ *             Returns the color specification in the target format for
+ *             full intensity red and zero intensity green and blue.
+ *
+ *     RETURNS
+ *             Returns XcmsSuccess, if failed; otherwise XcmsFailure
+ *
+ */
+{
+    XcmsColor tmp;
+
+    tmp.format = XcmsRGBiFormat;
+    tmp.pixel = 0;
+    tmp.spec.RGBi.red = 1.0;
+    tmp.spec.RGBi.green = 0.0;
+    tmp.spec.RGBi.blue = 0.0;
+    if (XcmsConvertColors(ccc, &tmp, 1, target_format, NULL) != XcmsSuccess) {
+       return(XcmsFailure);
+    }
+    memcpy((char *)pColor_ret, (char *)&tmp, sizeof(XcmsColor));
+    return(XcmsSuccess);
+}
diff --git a/src/xcms/QWhite.c b/src/xcms/QWhite.c
new file mode 100644 (file)
index 0000000..36b764c
--- /dev/null
@@ -0,0 +1,84 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *             XcmsQWhite.c - Query White
+ *
+ *     DESCRIPTION
+ *             Routine to obtain a color specification for full
+ *             red, green, and blue intensities.
+ *
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcms.h"
+
+\f
+
+/************************************************************************
+ *                                                                     *
+ *                     PUBLIC INTERFACES                               *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsQueryWhite
+ *
+ *     SYNOPSIS
+ */
+
+Status
+XcmsQueryWhite(
+    XcmsCCC ccc,
+    XcmsColorFormat target_format,
+    XcmsColor *pColor_ret)
+/*
+ *     DESCRIPTION
+ *             Returns the color specification in the target format for
+ *             full intensity red, green, and blue.
+ *
+ *     RETURNS
+ *             Returns XcmsSuccess, if failed; otherwise XcmsFailure
+ *
+ */
+{
+    XcmsColor tmp;
+
+    tmp.format = XcmsRGBiFormat;
+    tmp.pixel = 0;
+    tmp.spec.RGBi.red = 1.0;
+    tmp.spec.RGBi.green = 1.0;
+    tmp.spec.RGBi.blue = 1.0;
+    if (XcmsConvertColors(ccc, &tmp, 1, target_format, NULL) != XcmsSuccess) {
+       return(XcmsFailure);
+    }
+    memcpy((char *)pColor_ret, (char *)&tmp, sizeof(XcmsColor));
+    return(XcmsSuccess);
+}
diff --git a/src/xcms/QuCol.c b/src/xcms/QuCol.c
new file mode 100644 (file)
index 0000000..b4c1cd3
--- /dev/null
@@ -0,0 +1,78 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *             XcmsQuCol.c
+ *
+ *     DESCRIPTION
+ *             Source for XcmsQueryColors
+ *
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                     PUBLIC ROUTINES                                 *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsQueryColor - Query Color
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsQueryColor(
+    Display *dpy,
+    Colormap colormap,
+    XcmsColor *pXcmsColor_in_out,
+    XcmsColorFormat result_format)
+/*
+ *     DESCRIPTION
+ *             This routine uses XQueryColor to obtain the X RGB values
+ *             stored in the specified colormap for the specified pixel.
+ *             The X RGB values are then converted to the target format as
+ *             specified by the format component of the XcmsColor structure.
+ *
+ *     RETURNS
+ *             XcmsFailure if failed;
+ *             XcmsSuccess if it succeeded.
+ *
+ *             Returns a color specification of the color stored in the
+ *             specified pixel.
+ */
+{
+    return(_XcmsSetGetColor(XQueryColor, dpy, colormap,
+           pXcmsColor_in_out, result_format, (Bool *) NULL));
+}
diff --git a/src/xcms/QuCols.c b/src/xcms/QuCols.c
new file mode 100644 (file)
index 0000000..25a38b8
--- /dev/null
@@ -0,0 +1,78 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *             XcmsQuCol.c
+ *
+ *     DESCRIPTION
+ *             Source for XcmsQueryColors
+ *
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                     PUBLIC ROUTINES                                 *
+ *                                                                     *
+ ************************************************************************/
+/*
+ *     NAME
+ *             XcmsQueryColors - Query Colors
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsQueryColors(
+    Display *dpy,
+    Colormap colormap,
+    XcmsColor *pXcmsColors_in_out,
+    unsigned int nColors,
+    XcmsColorFormat result_format)
+/*
+ *     DESCRIPTION
+ *             This routine uses XQueryColors to obtain the X RGB values
+ *             stored in the specified colormap for the specified pixels.
+ *             The X RGB values are then converted to the target format as
+ *             specified by the format component of the XcmsColor structure.
+ *
+ *     RETURNS
+ *             XcmsFailure if failed;
+ *             XcmsSuccess if it succeeded.
+ *
+ *             Returns the color specifications of the colors stored in the
+ *             specified pixels.
+ */
+{
+    return(_XcmsSetGetColors(XQueryColors, dpy, colormap,
+           pXcmsColors_in_out, nColors, result_format, (Bool *) NULL));
+}
diff --git a/src/xcms/SetCCC.c b/src/xcms/SetCCC.c
new file mode 100644 (file)
index 0000000..e8171b4
--- /dev/null
@@ -0,0 +1,138 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *             XcmsSetCCC.c - Color Conversion Context Setting Routines
+ *
+ *     DESCRIPTION
+ *             Routines to set components of a Color Conversion
+ *             Context structure.
+ *
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcms.h"
+
+\f
+
+/************************************************************************
+ *                                                                     *
+ *                     PUBLIC INTERFACES                               *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsSetWhitePoint
+ *
+ *     SYNOPSIS
+ */
+
+Status
+XcmsSetWhitePoint(
+    XcmsCCC ccc,
+    XcmsColor *pColor)
+/*
+ *     DESCRIPTION
+ *             Sets the Client White Point in the specified CCC.
+ *
+ *     RETURNS
+ *             Returns XcmsSuccess if succeeded; otherwise XcmsFailure.
+ *
+ */
+{
+    if (pColor == NULL || pColor->format == XcmsUndefinedFormat) {
+       ccc->clientWhitePt.format = XcmsUndefinedFormat;
+    } else if (pColor->format != XcmsCIEXYZFormat &&
+           pColor->format != XcmsCIEuvYFormat &&
+           pColor->format != XcmsCIExyYFormat) {
+       return(XcmsFailure);
+    } else {
+       memcpy((char *)&ccc->clientWhitePt, (char *)pColor, sizeof(XcmsColor));
+    }
+    return(XcmsSuccess);
+}
+
+\f
+/*
+ *     NAME
+ *             XcmsSetCompressionProc
+ *
+ *     SYNOPSIS
+ */
+
+XcmsCompressionProc
+XcmsSetCompressionProc(
+    XcmsCCC ccc,
+    XcmsCompressionProc compression_proc,
+    XPointer client_data)
+/*
+ *     DESCRIPTION
+ *             Set the specified CCC's compression function and client data.
+ *
+ *     RETURNS
+ *             Returns the old compression function.
+ *
+ */
+{
+    XcmsCompressionProc old = ccc->gamutCompProc;
+
+    ccc->gamutCompProc = compression_proc;
+    ccc->gamutCompClientData = client_data;
+    return(old);
+}
+
+\f
+/*
+ *     NAME
+ *             XcmsSetWhiteAdjustProc
+ *
+ *     SYNOPSIS
+ */
+
+XcmsWhiteAdjustProc
+XcmsSetWhiteAdjustProc(
+    XcmsCCC ccc,
+    XcmsWhiteAdjustProc white_adjust_proc,
+    XPointer client_data )
+/*
+ *     DESCRIPTION
+ *             Set the specified CCC's white_adjust function and client data.
+ *
+ *     RETURNS
+ *             Returns the old white_adjust function.
+ *
+ */
+{
+    XcmsWhiteAdjustProc old = ccc->whitePtAdjProc;
+
+    ccc->whitePtAdjProc = white_adjust_proc;
+    ccc->whitePtAdjClientData = client_data;
+    return(old);
+}
diff --git a/src/xcms/SetGetCols.c b/src/xcms/SetGetCols.c
new file mode 100644 (file)
index 0000000..9b548db
--- /dev/null
@@ -0,0 +1,301 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *             XcmsSetGet.c
+ *
+ *     DESCRIPTION
+ *             Source for _XcmsSetGetColors()
+ *
+ *
+ */
+
+/*
+ *      EXTERNAL INCLUDES
+ *              Include files that must be exported to any package or
+ *              program using this package.
+ */
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                     API PRIVATE ROUTINES                            *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsSetColor -
+ *
+ *     SYNOPSIS
+ */
+Status
+_XcmsSetGetColor(
+    Status (*xColorProc)(
+        Display*            /* display */,
+        Colormap            /* colormap */,
+        XColor*             /* screen_in_out */),
+    Display *dpy,
+    Colormap cmap,
+    XcmsColor *pColors_in_out,
+    XcmsColorFormat result_format,
+    Bool *pCompressed)
+/*
+ *     DESCRIPTION
+ *             Routine containing code common to:
+ *                     XcmsAllocColor
+ *                     XcmsQueryColor
+ *                     XcmsStoreColor
+ *
+ *     RETURNS
+ *             XcmsFailure if failed;
+ *             XcmsSuccess if it succeeded without gamut compression;
+ *             XcmsSuccessWithCompression if it succeeded with gamut
+ *                     compression;
+ */
+{
+    XcmsCCC ccc;
+    XColor XColors_in_out;
+    Status retval = XcmsSuccess;
+
+    /*
+     * Argument Checking
+     * 1. Assume xColorProc is correct
+     * 2. Insure ccc not NULL
+     * 3. Assume cmap correct (should be checked by Server)
+     * 4. Insure pColors_in_out valid
+     * 5. Assume method_in is valid (should be checked by Server)
+     */
+
+    if (dpy == NULL) {
+       return(XcmsFailure);
+    }
+
+    if (result_format == XcmsUndefinedFormat) {
+       return(XcmsFailure);
+    }
+
+    if ( !((*xColorProc == XAllocColor) || (*xColorProc == XStoreColor)
+           || (*xColorProc == XQueryColor)) ) {
+       return(XcmsFailure);
+    }
+
+    if ((ccc = XcmsCCCOfColormap(dpy, cmap)) == (XcmsCCC)NULL) {
+       return(XcmsFailure);
+    }
+
+    if (*xColorProc == XQueryColor) {
+       goto Query;
+    }
+
+    /*
+     * Convert to RGB, adjusting for white point differences if necessary.
+     */
+    if ((retval = XcmsConvertColors(ccc, pColors_in_out, 1, XcmsRGBFormat,
+           pCompressed)) == XcmsFailure) {
+       return(XcmsFailure);
+    }
+
+Query:
+    /*
+     * Convert XcmsColor to XColor structures
+     */
+    _XcmsRGB_to_XColor(pColors_in_out, &XColors_in_out, 1);
+
+    /*
+     * Now make appropriate X Call
+     */
+    if (*xColorProc == XAllocColor) {
+       if ((*xColorProc)(ccc->dpy, cmap, &XColors_in_out) == 0) {
+           return(XcmsFailure);
+       }
+    } else if ((*xColorProc == XQueryColor) || (*xColorProc == XStoreColor)) {
+       /* Note: XQueryColor and XStoreColor do not return any Status */
+       (*xColorProc)(ccc->dpy, cmap, &XColors_in_out);
+    } else {
+       return(XcmsFailure);
+    }
+
+    if ((*xColorProc == XStoreColor)) {
+       return(retval);
+    }
+
+    /*
+     * Now, convert the returned XColor (i.e., rgb) to XcmsColor structures
+     */
+    _XColor_to_XcmsRGB(ccc, &XColors_in_out, pColors_in_out, 1);
+
+    /*
+     * Then, convert XcmsColor structures to the original specification
+     *    format.  Note that we must use NULL instead of passing
+     *    pCompressed.
+     */
+
+    if (result_format != XcmsRGBFormat) {
+       if (XcmsConvertColors(ccc, pColors_in_out, 1, result_format,
+               (Bool *) NULL) == XcmsFailure) {
+           return(XcmsFailure);
+       }
+    }
+    return(retval);
+}
+
+/*
+ *     NAME
+ *             XcmsSetColors -
+ *
+ *     SYNOPSIS
+ */
+Status
+_XcmsSetGetColors(
+    Status (*xColorProc)(
+        Display*            /* display */,
+        Colormap            /* colormap */,
+        XColor*             /* screen_in_out */,
+        int                 /* nColors */),
+    Display *dpy,
+    Colormap cmap,
+    XcmsColor *pColors_in_out,
+    int nColors,
+    XcmsColorFormat result_format,
+    Bool *pCompressed)
+/*
+ *     DESCRIPTION
+ *             Routine containing code common to:
+ *                     XcmsQueryColors
+ *                     XcmsStoreColors
+ *
+ *     RETURNS
+ *             XcmsFailure if failed;
+ *             XcmsSuccess if it succeeded without gamut compression;
+ *             XcmsSuccessWithCompression if it succeeded with gamut
+ *                     compression;
+ */
+{
+    XcmsCCC ccc;
+    XColor *pXColors_in_out;
+    Status retval = XcmsSuccess;
+
+    /*
+     * Argument Checking
+     * 1. Assume xColorProc is correct
+     * 2. Insure ccc not NULL
+     * 3. Assume cmap correct (should be checked by Server)
+     * 4. Insure pColors_in_out valid
+     * 5. Assume method_in is valid (should be checked by Server)
+     * 6. Insure nColors > 0
+     */
+
+    if (dpy == NULL) {
+       return(XcmsFailure);
+    }
+
+    if (nColors == 0) {
+       return(XcmsSuccess);
+    }
+
+    if (result_format == XcmsUndefinedFormat) {
+       return(XcmsFailure);
+    }
+
+    if ( !((*xColorProc == XStoreColors) || (*xColorProc == XQueryColors)) ) {
+       return(XcmsFailure);
+    }
+
+    if ((ccc = XcmsCCCOfColormap(dpy, cmap)) == (XcmsCCC)NULL) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Allocate space for XColors
+     */
+    if ((pXColors_in_out = (XColor *)Xcalloc(nColors, sizeof(XColor))) ==
+           NULL) {
+       return(XcmsFailure);
+    }
+
+    if (*xColorProc == XQueryColors) {
+       goto Query;
+    }
+
+    /*
+     * Convert to RGB, adjusting for white point differences if necessary.
+     */
+    if ((retval = XcmsConvertColors(ccc, pColors_in_out, nColors, XcmsRGBFormat,
+           pCompressed)) == XcmsFailure) {
+        Xfree((char *)pXColors_in_out);
+       return(XcmsFailure);
+    }
+
+Query:
+    /*
+     * Convert XcmsColor to XColor structures
+     */
+    _XcmsRGB_to_XColor(pColors_in_out, pXColors_in_out, nColors);
+
+    /*
+     * Now make appropriate X Call
+     */
+    if ((*xColorProc == XQueryColors) || (*xColorProc == XStoreColors)){
+       /* Note: XQueryColors and XStoreColors do not return any Status */
+       (*xColorProc)(ccc->dpy, cmap, pXColors_in_out, nColors);
+    } else {
+       Xfree((char *)pXColors_in_out);
+       return(XcmsFailure);
+    }
+
+    if (*xColorProc == XStoreColors) {
+       Xfree((char *)pXColors_in_out);
+       return(retval);
+    }
+
+    /*
+     * Now, convert the returned XColor (i.e., rgb) to XcmsColor structures
+     */
+    _XColor_to_XcmsRGB(ccc, pXColors_in_out, pColors_in_out, nColors);
+    Xfree((char *)pXColors_in_out);
+
+    /*
+     * Then, convert XcmsColor structures to the original specification
+     *    format.  Note that we must use NULL instead of passing
+     *    pCompressed.
+     */
+    if (result_format != XcmsRGBFormat) {
+       if (XcmsConvertColors(ccc, pColors_in_out, nColors, result_format,
+               (Bool *) NULL) == XcmsFailure) {
+           return(XcmsFailure);
+       }
+    }
+
+    return(retval);
+}
+
+/* ### EOF ### */
diff --git a/src/xcms/StCol.c b/src/xcms/StCol.c
new file mode 100644 (file)
index 0000000..941ad07
--- /dev/null
@@ -0,0 +1,82 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *             XcmsStCol.c
+ *
+ *     DESCRIPTION
+ *             Source for XcmsStoreColor
+ *
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                     PUBLIC ROUTINES                                 *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsStoreColor - Store Color
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsStoreColor(
+    Display *dpy,
+    Colormap colormap,
+    XcmsColor *pColor_in)
+/*
+ *     DESCRIPTION
+ *             Given a device-dependent or device-independent color
+ *             specification, this routine will convert it to X RGB
+ *             values then use it in a call to XStoreColor.
+ *
+ *     RETURNS
+ *             XcmsFailure if failed;
+ *             XcmsSuccess if it succeeded without gamut compression;
+ *             XcmsSuccessWithCompression if it succeeded with gamut
+ *                     compression;
+ *
+ *             Since XStoreColor has no return value this routine
+ *             does not return the color specification of the color actually
+ *             stored.
+ */
+{
+    XcmsColor tmpColor;
+
+    tmpColor = *pColor_in;
+    return(_XcmsSetGetColor(XStoreColor, dpy, colormap,
+                             &tmpColor, XcmsRGBFormat, (Bool *) NULL));
+}
diff --git a/src/xcms/StCols.c b/src/xcms/StCols.c
new file mode 100644 (file)
index 0000000..24ccd38
--- /dev/null
@@ -0,0 +1,112 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *             XcmsStCols.c
+ *
+ *     DESCRIPTION
+ *             Source for XcmsStoreColors
+ *
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                     PUBLIC ROUTINES                                 *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsStoreColors - Store Colors
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsStoreColors(
+    Display *dpy,
+    Colormap colormap,
+    XcmsColor *pColors_in,
+    unsigned int nColors,
+    Bool *pCompressed)
+/*
+ *     DESCRIPTION
+ *             Given device-dependent or device-independent color
+ *             specifications, this routine will convert them to X RGB
+ *             values then use it in a call to XStoreColors.
+ *
+ *     RETURNS
+ *             XcmsFailure if failed;
+ *             XcmsSuccess if it succeeded without gamut compression;
+ *             XcmsSuccessWithCompression if it succeeded with gamut
+ *                     compression;
+ *
+ *             Since XStoreColors has no return value, this routine
+ *             does not return color specifications of the colors actually
+ *             stored.
+ */
+{
+    XcmsColor Color1;
+    XcmsColor *pColors_tmp;
+    Status retval;
+
+    /*
+     * Make copy of array of color specifications so we don't
+     * overwrite the contents.
+     */
+    if (nColors > 1) {
+       pColors_tmp = (XcmsColor *) Xmalloc(nColors * sizeof(XcmsColor));
+    } else {
+       pColors_tmp = &Color1;
+    }
+    memcpy((char *)pColors_tmp, (char *)pColors_in,
+           nColors * sizeof(XcmsColor));
+
+    /*
+     * Call routine to store colors using the copied color structures
+     */
+    retval = _XcmsSetGetColors (XStoreColors, dpy, colormap,
+           pColors_tmp, nColors, XcmsRGBFormat, pCompressed);
+
+    /*
+     * Free copies as needed.
+     */
+    if (nColors > 1) {
+       Xfree((char *)pColors_tmp);
+    }
+
+    /*
+     * Ah, finally return.
+     */
+    return(retval);
+}
diff --git a/src/xcms/UNDEFINED.c b/src/xcms/UNDEFINED.c
new file mode 100644 (file)
index 0000000..7b1bdb6
--- /dev/null
@@ -0,0 +1,131 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *
+ *     NAME
+ *             UNDEFINED.c
+ *
+ *     DESCRIPTION
+ *             UNDEFINED Color Space
+ *
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+
+/*
+ *      FORWARD DECLARATIONS
+ */
+static int DummyParseStringProc(
+    char*               /* color_string */,
+    XcmsColor*          /* color_return */
+    );
+static Status ReturnZero(
+    XcmsCCC             /* ccc */,
+    XcmsColor*          /* white_point */,
+    XcmsColor*          /* colors */,
+    unsigned int        /* ncolors */
+    );
+
+
+/*
+ *      LOCALS VARIABLES
+ */
+
+static Status (*(Fl_ReturnZero[]))(
+    XcmsCCC             /* ccc */,
+    XcmsColor*          /* white_point */,
+    XcmsColor*          /* colors */,
+    unsigned int        /* ncolors */
+    ) = {
+    ReturnZero,
+    NULL
+};
+
+
+/*
+ *      GLOBALS
+ *              Variables declared in this package that are allowed
+ *             to be used globally.
+ */
+    /*
+     * UNDEFINED Color Space
+     */
+XcmsColorSpace XcmsUNDEFINEDColorSpace =
+    {
+       "undefined",            /* prefix */
+       XcmsUndefinedFormat,    /* id */
+       &DummyParseStringProc,  /* parseString */
+       Fl_ReturnZero,          /* to_CIEXYZ */
+       Fl_ReturnZero           /* from_CIEXYZ */
+    };
+
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                     PRIVATE ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             ReturnZero
+ *
+ *     SYNOPSIS
+ */
+/* ARGSUSED */
+static Status
+ReturnZero(
+    XcmsCCC             ccc /* ccc */,
+    XcmsColor*          white /* white_point */,
+    XcmsColor*          colors /* colors */,
+    unsigned int        ncolors /* ncolors */
+    )
+/*
+ *     DESCRIPTION
+ *             Does nothing.
+ *
+ *     RETURNS
+ *             0
+ *
+ */
+{
+    return(0);
+}
+
+static int DummyParseStringProc(
+    char*               color_string /* color_string */,
+    XcmsColor*          color_return /* color_return */
+    )
+{
+    return(0);
+}
+
+/* ### EOF ### */
diff --git a/src/xcms/XRGB.c b/src/xcms/XRGB.c
new file mode 100644 (file)
index 0000000..03f980e
--- /dev/null
@@ -0,0 +1,242 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *             XcmsRtoX.c
+ *
+ *     DESCRIPTION
+ *             Convert color specifications in XcmsRGB format in one array of
+ *             XcmsColor structures to RGB in an array of XColor structures.
+ *
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+/*
+ *      LOCAL VARIABLES
+ */
+
+static unsigned short const MASK[17] = {
+    0x0000,    /*  0 bitsPerRGB */
+    0x8000,    /*  1 bitsPerRGB */
+    0xc000,    /*  2 bitsPerRGB */
+    0xe000,    /*  3 bitsPerRGB */
+    0xf000,    /*  4 bitsPerRGB */
+    0xf800,    /*  5 bitsPerRGB */
+    0xfc00,    /*  6 bitsPerRGB */
+    0xfe00,    /*  7 bitsPerRGB */
+    0xff00,    /*  8 bitsPerRGB */
+    0xff80,    /*  9 bitsPerRGB */
+    0xffc0,    /* 10 bitsPerRGB */
+    0xffe0,    /* 11 bitsPerRGB */
+    0xfff0,    /* 12 bitsPerRGB */
+    0xfff8,    /* 13 bitsPerRGB */
+    0xfffc,    /* 14 bitsPerRGB */
+    0xfffe,    /* 15 bitsPerRGB */
+    0xffff     /* 16 bitsPerRGB */
+};
+
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                     API PRIVATE ROUTINES                            *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             _XcmsRGB_to_XColor -
+ *
+ *     SYNOPSIS
+ */
+void
+_XcmsRGB_to_XColor(
+    XcmsColor *pColors,
+    XColor *pXColors,
+    unsigned int nColors)
+/*
+ *     DESCRIPTION
+ *         Translates a color specification in XcmsRGBFormat in a XcmsColor
+ *         structure to an XColor structure.
+ *
+ *     RETURNS
+ *             void.
+ */
+{
+    for (; nColors--; pXColors++, pColors++) {
+       pXColors->pixel = pColors->pixel;
+       pXColors->red = pColors->spec.RGB.red;
+       pXColors->green = pColors->spec.RGB.green;
+       pXColors->blue  = pColors->spec.RGB.blue;
+       pXColors->flags = (DoRed | DoGreen | DoBlue);
+    }
+}
+
+\f
+/*
+ *     NAME
+ *             _XColor_to_XcmsRGB
+ *
+ *     SYNOPSIS
+ */
+void
+_XColor_to_XcmsRGB(
+    XcmsCCC ccc,
+    XColor *pXColors,
+    XcmsColor *pColors,
+    unsigned int nColors)
+/*
+ *     DESCRIPTION
+ *             Translates an RGB color specification in an XColor
+ *             structure to an XcmsRGB structure.
+ *
+ *             IMPORTANT NOTE:  Bit replication that may have been caused
+ *             with ResolveColor() routine in the X Server is undone
+ *             here if requested!  For example, if red = 0xcaca and the
+ *             bits_per_rgb is 8, then spec.RGB.red will be 0xca00.
+ *
+ *     RETURNS
+ *             void
+ */
+{
+    int bits_per_rgb = ccc->visual->bits_per_rgb;
+
+    for (; nColors--; pXColors++, pColors++) {
+       pColors->spec.RGB.red = (pXColors->red & MASK[bits_per_rgb]);
+       pColors->spec.RGB.green = (pXColors->green & MASK[bits_per_rgb]);
+       pColors->spec.RGB.blue = (pXColors->blue & MASK[bits_per_rgb]);
+       pColors->format = XcmsRGBFormat;
+       pColors->pixel = pXColors->pixel;
+    }
+}
+
+\f
+/*
+ *     NAME
+ *             _XcmsResolveColor
+ *
+ *     SYNOPSIS
+ */
+void
+_XcmsResolveColor(
+    XcmsCCC ccc,
+    XcmsColor *pXcmsColor)
+/*
+ *     DESCRIPTION
+ *         Uses the X Server ResolveColor() algorithm to
+ *         modify values to closest values supported by hardware.
+ *         Old algorithm simply masked low-order bits.  The new algorithm
+ *         has the effect of replicating significant bits into lower order
+ *         bits in order to stretch the hardware value into all 16 bits.
+ *
+ *         On a display with N-bit DACs, the "hardware" color is computed as:
+ *
+ *         ((unsignedlong)(ClientValue >> (16-N)) * 0xFFFF) / ((1 << N) - 1)
+ *
+ *
+ *     RETURNS
+ *             void.
+ */
+{
+    int shift;
+    int max_color;
+
+    shift = 16 - ccc->visual->bits_per_rgb;
+    max_color = (1 << ccc->visual->bits_per_rgb) - 1;
+
+
+    pXcmsColor->spec.RGB.red =
+           ((unsigned long)(pXcmsColor->spec.RGB.red >> shift) * 0xFFFF)
+           / max_color;
+    pXcmsColor->spec.RGB.green =
+           ((unsigned long)(pXcmsColor->spec.RGB.green >> shift) * 0xFFFF)
+           / max_color;
+    pXcmsColor->spec.RGB.blue =
+           ((unsigned long)(pXcmsColor->spec.RGB.blue  >> shift) * 0xFFFF)
+           / max_color;
+}
+
+\f
+/*
+ *     NAME
+ *             _XcmsUnresolveColor
+ *
+ *     SYNOPSIS
+ */
+void
+_XcmsUnresolveColor(
+    XcmsCCC ccc,
+    XcmsColor *pColor)
+/*
+ *     DESCRIPTION
+ *             Masks out insignificant bits.
+ *
+ *     RETURNS
+ *             void.
+ *
+ *     ASSUMPTIONS
+ *             format == XcmsRGBFormat
+ */
+{
+    int bits_per_rgb = ccc->visual->bits_per_rgb;
+
+    pColor->spec.RGB.red &= MASK[bits_per_rgb];
+    pColor->spec.RGB.green &= MASK[bits_per_rgb];
+    pColor->spec.RGB.blue &= MASK[bits_per_rgb];
+}
+
+\f
+/*
+ *     NAME
+ *             _XUnresolveColor
+ *
+ *     SYNOPSIS
+ */
+void
+_XUnresolveColor(
+    XcmsCCC ccc,
+    XColor *pXColor)
+/*
+ *     DESCRIPTION
+ *             Masks out insignificant bits.
+ *
+ *     RETURNS
+ *             void.
+ */
+{
+    int bits_per_rgb = ccc->visual->bits_per_rgb;
+
+    pXColor->red &= MASK[bits_per_rgb];
+    pXColor->green &= MASK[bits_per_rgb];
+    pXColor->blue &= MASK[bits_per_rgb];
+}
+
diff --git a/src/xcms/XYZ.c b/src/xcms/XYZ.c
new file mode 100644 (file)
index 0000000..40d6ed3
--- /dev/null
@@ -0,0 +1,203 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of XCMS based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *
+ *     NAME
+ *             CIEXYZ.c
+ *
+ *     DESCRIPTION
+ *             CIE XYZ Color Space
+ *
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <X11/Xos.h>
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+#include <stdio.h> /* sscanf */
+
+/*
+ *     DEFINES
+ *             Internal definitions that need NOT be exported to any package
+ *             or program using this package.
+ */
+#ifdef DBL_EPSILON
+#  define XMY_DBL_EPSILON DBL_EPSILON
+#else
+#  define XMY_DBL_EPSILON 0.00001
+#endif
+
+/*
+ *      FORWARD DECLARATIONS
+ */
+static int CIEXYZ_ParseString(register char *spec, XcmsColor *pColor);
+
+/*
+ *      LOCALS VARIABLES
+ */
+
+static XcmsConversionProc Fl_CIEXYZ_to_CIEXYZ[] = {
+    NULL
+};
+
+
+
+/*
+ *      GLOBALS
+ *              Variables declared in this package that are allowed
+ *             to be used globally.
+ */
+    /*
+     * CIE XYZ Color Space
+     */
+XcmsColorSpace XcmsCIEXYZColorSpace =
+    {
+       _XcmsCIEXYZ_prefix,             /* prefix */
+       XcmsCIEXYZFormat,               /* id */
+       CIEXYZ_ParseString,     /* parseString */
+       Fl_CIEXYZ_to_CIEXYZ,    /* to_CIEXYZ */
+       Fl_CIEXYZ_to_CIEXYZ,    /* from_CIEXYZ */
+       1
+    };
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                     PRIVATE ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             CIEXYZ_ParseString
+ *
+ *     SYNOPSIS
+ */
+static int
+CIEXYZ_ParseString(
+    register char *spec,
+    XcmsColor *pColor)
+/*
+ *     DESCRIPTION
+ *             This routines takes a string and attempts to convert
+ *             it into a XcmsColor structure with XcmsCIEXYZFormat.
+ *             The assumed CIEXYZ string syntax is:
+ *                 CIEXYZ:<X>/<Y>/<Z>
+ *             Where X, Y, and Z are in string input format for floats
+ *             consisting of:
+ *                 a. an optional sign
+ *                 b. a string of numbers possibly containing a decimal point,
+ *                 c. an optional exponent field containing an 'E' or 'e'
+ *                     followed by a possibly signed integer string.
+ *
+ *     RETURNS
+ */
+{
+    int n;
+    char *pchar;
+
+    if ((pchar = strchr(spec, ':')) == NULL) {
+       return(XcmsFailure);
+    }
+    n = (int)(pchar - spec);
+
+    /*
+     * Check for proper prefix.
+     */
+    if (strncmp(spec, _XcmsCIEXYZ_prefix, n) != 0) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Attempt to parse the value portion.
+     */
+    if (sscanf(spec + n + 1, "%lf/%lf/%lf",
+           &pColor->spec.CIEXYZ.X,
+           &pColor->spec.CIEXYZ.Y,
+           &pColor->spec.CIEXYZ.Z) != 3) {
+       char *s; /* Maybe failed due to locale */
+       int f;
+       if ((s = strdup(spec))) {
+           for (f = 0; s[f]; ++f)
+               if (s[f] == '.')
+                   s[f] = ',';
+               else if (s[f] == ',')
+                   s[f] = '.';
+           if (sscanf(s + n + 1, "%lf/%lf/%lf",
+                      &pColor->spec.CIEXYZ.X,
+                      &pColor->spec.CIEXYZ.Y,
+                      &pColor->spec.CIEXYZ.Z) != 3) {
+               free(s);
+               return(XcmsFailure);
+           }
+           free(s);
+       } else
+           return(XcmsFailure);
+    }
+    pColor->format = XcmsCIEXYZFormat;
+    pColor->pixel = 0;
+    return(_XcmsCIEXYZ_ValidSpec(pColor));
+}
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                     PUBLIC ROUTINES                                 *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsCIELab_ValidSpec
+ *
+ *     SYNOPSIS
+ */
+Status
+_XcmsCIEXYZ_ValidSpec(
+    XcmsColor *pColor)
+/*
+ *     DESCRIPTION
+ *             Checks if color specification valid for CIE XYZ
+ *
+ *     RETURNS
+ *             XcmsFailure if invalid,
+ *             XcmsSuccess if valid.
+ *
+ */
+{
+    if (pColor->format != XcmsCIEXYZFormat
+           ||
+           (pColor->spec.CIEXYZ.Y < 0.0 - XMY_DBL_EPSILON)
+           ||
+           (pColor->spec.CIEXYZ.Y > 1.0 + XMY_DBL_EPSILON)) {
+       return(XcmsFailure);
+    }
+    return(XcmsSuccess);
+}
diff --git a/src/xcms/Xcms.txt b/src/xcms/Xcms.txt
new file mode 100644 (file)
index 0000000..1c5b1ad
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * (c) Copyright 1990 1991 Tektronix Inc.
+ *     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 Tektronix not be used
+ * in advertising or publicity pertaining to distribution of the software
+ * without specific, written prior permission.
+ *
+ * Tektronix disclaims all warranties with regard to this software, including
+ * all implied warranties of merchantability and fitness, in no event shall
+ * Tektronix 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.
+ *
+ *
+ *     NAME
+ *             Xcms.txt
+ *
+ *     DESCRIPTION
+ *             Sample Color Name Database
+ *
+ */
+
+
+This device-independent color name database is provided just as an example.
+There are no claims that these color specifications are or should be bound
+to the corresponding color name.
+
+As you can see, the start of the database is indicated by "XCMS_COLORDB_START".
+Anything before this is assumed to be comments.  The "0.1" indicates the
+version number of the format/syntax used in this file.  The color name is
+delimited from the color specification by one or more tabs.
+
+XCMS_COLORDB_START 0.1
+cms red                        CIEXYZ:0.3811/0.2073/0.0213
+cms green              CIEXYZ:0.3203/0.6805/0.1430
+cms blue               CIEXYZ:0.2483/0.1122/1.2417
+XCMS_COLORDB_END
diff --git a/src/xcms/Xcmsint.h b/src/xcms/Xcmsint.h
new file mode 100644 (file)
index 0000000..75d9471
--- /dev/null
@@ -0,0 +1,260 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     DESCRIPTION
+ *             Private include file for Color Management System.
+ *             (i.e., for API internal use only)
+ *
+ */
+
+#ifndef _XCMSINT_H_
+#define _XCMSINT_H_
+
+#include <X11/Xcms.h>
+
+/*
+ *     DEFINES
+ */
+
+       /*
+        * Private Status Value
+        */
+#define        _XCMS_NEWNAME   -1
+
+       /*
+        * Color Space ID's are of XcmsColorFormat type.
+        *
+        *      bit 31
+        *          0 == Device-Independent
+        *          1 == Device-Dependent
+        *
+        *      bit 30:
+         *          0 == Registered with X Consortium
+         *          1 == Unregistered
+         */
+#define       XCMS_DD_ID(id)          ((id) & (XcmsColorFormat)0x80000000)
+#define       XCMS_DI_ID(id)          (!((id) & (XcmsColorFormat)0x80000000))
+#define       XCMS_UNREG_ID(id)       ((id) & (XcmsColorFormat)0x40000000)
+#define       XCMS_REG_ID(id)         (!((id) & (XcmsColorFormat)0x40000000))
+#define       XCMS_FIRST_REG_DI_ID    (XcmsColorFormat)0x00000001
+#define       XCMS_FIRST_UNREG_DI_ID  (XcmsColorFormat)0x40000000
+#define       XCMS_FIRST_REG_DD_ID    (XcmsColorFormat)0x80000000
+#define       XCMS_FIRST_UNREG_DD_ID  (XcmsColorFormat)0xc0000000
+
+/*
+ *     TYPEDEFS
+ */
+
+    /*
+     * Structure for caching Colormap info.
+     *    This is provided for the Xlib modifications to:
+     *         XAllocNamedColor()
+     *         XLookupColor()
+     *         XParseColor()
+     *         XStoreNamedColor()
+     */
+typedef struct _XcmsCmapRec {
+    Colormap cmapID;
+    Display *dpy;
+    Window windowID;
+    Visual *visual;
+    struct _XcmsCCC *ccc;
+    struct _XcmsCmapRec *pNext;
+} XcmsCmapRec;
+
+    /*
+     * Intensity Record (i.e., value / intensity tuple)
+     */
+typedef struct _IntensityRec {
+    unsigned short value;
+    XcmsFloat intensity;
+} IntensityRec;
+
+    /*
+     * Intensity Table
+     */
+typedef struct _IntensityTbl {
+    IntensityRec *pBase;
+    unsigned int nEntries;
+} IntensityTbl;
+
+    /*
+     * Structure for storing per-Visual Intensity Tables (aka gamma maps).
+     */
+typedef struct _XcmsIntensityMap {
+    VisualID visualID;
+    XPointer   screenData;     /* pointer to corresponding Screen Color*/
+                               /*      Characterization Data           */
+    void (*pFreeScreenData)(XPointer pScreenDataTemp); /* Function that frees a Screen         */
+                               /*   structure.                         */
+    struct _XcmsIntensityMap *pNext;
+} XcmsIntensityMap;
+
+
+    /*
+     * Structure for storing "registered" color space prefix/ID
+     */
+typedef struct _XcmsRegColorSpaceEntry {
+    const char *prefix;        /* Color Space prefix (e.g., "CIEXYZ:") */
+    XcmsColorFormat id;        /* Color Space ID (e.g., XcmsCIEXYZFormat) */
+} XcmsRegColorSpaceEntry;
+
+
+    /*
+     * Xcms Per Display (i.e. connection) related data
+     */
+typedef struct _XcmsPerDpyInfo {
+
+    XcmsCCC paDefaultCCC; /* based on default visual of screen */
+           /*
+            * Pointer to an array of XcmsCCC structures, one for
+            * each screen.
+            */
+    XcmsCmapRec *pClientCmaps; /* Pointer to linked list of XcmsCmapRec's */
+
+} XcmsPerDpyInfo, *XcmsPerDpyInfoPtr;
+
+/*
+ *     DEFINES
+ */
+
+#define XDCCC_NUMBER   0x8000000L      /* 2**27 per XDCCC */
+
+#ifdef GRAY
+#define XDCCC_SCREENWHITEPT_ATOM_NAME  "XDCCC_GRAY_SCREENWHITEPOINT"
+#define XDCCC_GRAY_CORRECT_ATOM_NAME   "XDCCC_GRAY_CORRECTION"
+#endif /* GRAY */
+
+#ifndef _ConversionValues
+typedef struct _ConversionValues {
+    IntensityTbl IntensityTbl;
+} ConversionValues;
+#endif
+
+#ifdef GRAY
+typedef struct {
+    IntensityTbl *IntensityTbl;
+} GRAY_SCCData;
+#endif /* GRAY */
+
+/*
+ *     DEFINES
+ */
+
+#define XDCCC_MATRIX_ATOM_NAME "XDCCC_LINEAR_RGB_MATRICES"
+#define XDCCC_CORRECT_ATOM_NAME "XDCCC_LINEAR_RGB_CORRECTION"
+
+typedef struct {
+    XcmsFloat XYZtoRGBmatrix[3][3];
+    XcmsFloat RGBtoXYZmatrix[3][3];
+    IntensityTbl *pRedTbl;
+    IntensityTbl *pGreenTbl;
+    IntensityTbl *pBlueTbl;
+} LINEAR_RGB_SCCData;
+
+/* function prototypes */
+extern XcmsCmapRec *
+_XcmsAddCmapRec(
+    Display *dpy,
+    Colormap cmap,
+    Window windowID,
+    Visual *visual);
+extern void
+_XcmsRGB_to_XColor(
+    XcmsColor *pColors,
+    XColor *pXColors,
+    unsigned int nColors);
+extern Status
+_XcmsResolveColorString (
+    XcmsCCC ccc,
+    const char **color_string,
+    XcmsColor *pColor_exact_return,
+    XcmsColorFormat result_format);
+extern void
+_XUnresolveColor(
+    XcmsCCC ccc,
+    XColor *pXColor);
+/*
+ *     DESCRIPTION
+ *             Include file for defining the math macros used in the
+ *             XCMS source.  Instead of using math library routines
+ *             directly, XCMS uses macros so that based on the
+ *             definitions here, vendors and sites can specify exactly
+ *             what routine will be called (those from libm.a or their
+ *             custom routines).  If not defined to math library routines
+ *             (e.g., sqrt in libm.a), then the client is not forced to
+ *             be linked with -lm.
+ */
+
+#define XCMS_ATAN(x)           _XcmsArcTangent(x)
+#define XCMS_COS(x)            _XcmsCosine(x)
+#define XCMS_CUBEROOT(x)       _XcmsCubeRoot(x)
+#define XCMS_FABS(x)           ((x) < 0.0 ? -(x) : (x))
+#define XCMS_SIN(x)            _XcmsSine(x)
+#define XCMS_SQRT(x)           _XcmsSquareRoot(x)
+#define XCMS_TAN(x)            (XCMS_SIN(x) / XCMS_COS(x))
+
+double _XcmsArcTangent(double a);
+double _XcmsCosine(double a);
+double _XcmsCubeRoot(double a);
+double _XcmsSine(double a);
+double _XcmsSquareRoot(double a);
+
+/*
+ *  DEFINES FOR GAMUT COMPRESSION AND QUERY ROUTINES
+ */
+#ifndef PI
+#  ifdef M_PI
+#    define PI M_PI
+#  else
+#    define PI 3.14159265358979323846264338327950
+#  endif /* M_PI */
+#endif /* PI */
+#ifndef degrees
+#  define degrees(r) ((XcmsFloat)(r) * 180.0 / PI)
+#endif /* degrees */
+#ifndef radians
+#  define radians(d) ((XcmsFloat)(d) * PI / 180.0)
+#endif /* radians */
+
+#define XCMS_CIEUSTAROFHUE(h,c)        \
+((XCMS_COS((h)) == 0.0) ? (XcmsFloat)0.0 : (XcmsFloat) \
+((XcmsFloat)(c) / (XcmsFloat)XCMS_SQRT((XCMS_TAN(h) * XCMS_TAN(h)) + \
+(XcmsFloat)1.0)))
+#define XCMS_CIEVSTAROFHUE(h,c)        \
+((XCMS_COS((h)) == 0.0) ? (XcmsFloat)0.0 : (XcmsFloat) \
+((XcmsFloat)(c) / (XcmsFloat)XCMS_SQRT(((XcmsFloat)1.0 / \
+(XcmsFloat)(XCMS_TAN(h) * XCMS_TAN(h))) + (XcmsFloat)1.0)))
+/* this hue is returned in radians */
+#define XCMS_CIELUV_PMETRIC_HUE(u,v)   \
+(((u) != 0.0) ? XCMS_ATAN( (v) / (u)) : ((v >= 0.0) ? PI / 2 : -(PI / 2)))
+#define XCMS_CIELUV_PMETRIC_CHROMA(u,v)        XCMS_SQRT(((u)*(u)) + ((v)*(v)))
+
+#define XCMS_CIEASTAROFHUE(h,c)                XCMS_CIEUSTAROFHUE((h), (c))
+#define XCMS_CIEBSTAROFHUE(h,c)                XCMS_CIEVSTAROFHUE((h), (c))
+#define XCMS_CIELAB_PMETRIC_HUE(a,b)   XCMS_CIELUV_PMETRIC_HUE((a), (b))
+#define XCMS_CIELAB_PMETRIC_CHROMA(a,b)        XCMS_CIELUV_PMETRIC_CHROMA((a), (b))
+
+#endif /* _XCMSINT_H_ */
diff --git a/src/xcms/cmsAllCol.c b/src/xcms/cmsAllCol.c
new file mode 100644 (file)
index 0000000..aeea464
--- /dev/null
@@ -0,0 +1,74 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *             XcmsAllCol.c
+ *
+ *     DESCRIPTION
+ *             Source for XcmsAllocColor
+ *
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+\f
+/*
+ *     NAME
+ *             XcmsAllocColor - Allocate Color
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsAllocColor(
+    Display *dpy,
+    Colormap colormap,
+    XcmsColor *pXcmsColor_in_out,
+    XcmsColorFormat result_format)
+/*
+ *     DESCRIPTION
+ *             Given a device-dependent or device-independent color
+ *             specification, XcmsAllocColor will convert it to X RGB
+ *             values then use it in a call to XAllocColor.
+ *
+ *     RETURNS
+ *             XcmsFailure if failed;
+ *             XcmsSuccess if it succeeded without gamut compression;
+ *             XcmsSuccessWithCompression if it succeeded with gamut
+ *                     compression;
+ *
+ *             Also returns the pixel value of the color cell and a color
+ *             specification of the color actually stored.
+ *
+ */
+{
+    return(_XcmsSetGetColor(XAllocColor, dpy, colormap, pXcmsColor_in_out,
+           result_format, (Bool *)NULL));
+}
diff --git a/src/xcms/cmsAllNCol.c b/src/xcms/cmsAllNCol.c
new file mode 100644 (file)
index 0000000..d39de6c
--- /dev/null
@@ -0,0 +1,198 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *             XcmsAlNCol.c
+ *
+ *     DESCRIPTION
+ *             Source for XcmsAllocNamedColor
+ *
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+\f
+/*
+ *     NAME
+ *             XcmsAllocNamedColor -
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsAllocNamedColor (
+    Display *dpy,
+    Colormap cmap,
+    _Xconst char *colorname,
+    XcmsColor *pColor_scrn_return,
+    XcmsColor *pColor_exact_return,
+    XcmsColorFormat result_format)
+/*
+ *     DESCRIPTION
+ *             Finds the color specification associated with the color
+ *             name in the Device-Independent Color Name Database, then
+ *             converts that color specification to an RGB format.  This
+ *             RGB value is then used in a call to XAllocColor to allocate
+ *             a read-only color cell.
+ *
+ *     RETURNS
+ *             0 if failed to parse string or find any entry in the database.
+ *             1 if succeeded in converting color name to XcmsColor.
+ *             2 if succeeded in converting color name to another color name.
+ *
+ */
+{
+    long nbytes;
+    xAllocNamedColorReply rep;
+    xAllocNamedColorReq *req;
+    XColor hard_def;
+    XColor exact_def;
+    Status retval1 = 1;
+    Status retval2 = XcmsSuccess;
+    XcmsColor tmpColor;
+    XColor XColor_in_out;
+    XcmsCCC ccc;
+
+    /*
+     * 0. Check for invalid arguments.
+     */
+    if (dpy == NULL || colorname[0] == '\0' || pColor_scrn_return == 0
+           || pColor_exact_return == NULL) {
+       return(XcmsFailure);
+    }
+
+    if ((ccc = XcmsCCCOfColormap(dpy, cmap)) == (XcmsCCC)NULL) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * 1. Convert string to a XcmsColor using Xcms and i18n mechanism
+     */
+    if ((retval1 = _XcmsResolveColorString(ccc, &colorname,
+           &tmpColor, result_format)) == XcmsFailure) {
+       return(XcmsFailure);
+    }
+    if (retval1 == _XCMS_NEWNAME) {
+       goto PassToServer;
+    }
+    memcpy((char *)pColor_exact_return, (char *)&tmpColor, sizeof(XcmsColor));
+
+    /*
+     * 2. Convert tmpColor to RGB
+     * Assume pColor_exact_return is now adjusted to Client White Point
+     */
+    if ((retval2 = XcmsConvertColors(ccc, &tmpColor,
+           1, XcmsRGBFormat, (Bool *) NULL)) == XcmsFailure) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * 3. Convert to XColor and call XAllocColor
+     */
+    _XcmsRGB_to_XColor(&tmpColor, &XColor_in_out, 1);
+    if (XAllocColor(ccc->dpy, cmap, &XColor_in_out) == 0) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * 4. pColor_scrn_return
+     *
+     * Now convert to the target format.
+     *    We can ignore the return value because we're already in a
+     *    device-dependent format.
+     */
+    _XColor_to_XcmsRGB(ccc, &XColor_in_out, pColor_scrn_return, 1);
+    if (result_format != XcmsRGBFormat) {
+       if (result_format == XcmsUndefinedFormat) {
+           result_format = pColor_exact_return->format;
+       }
+       if (XcmsConvertColors(ccc, pColor_scrn_return, 1, result_format,
+               (Bool *) NULL) == XcmsFailure) {
+           return(XcmsFailure);
+       }
+    }
+
+    return(retval1 > retval2 ? retval1 : retval2);
+
+PassToServer:
+    /*
+     * All previous methods failed, so lets pass it to the server
+     * for parsing.
+     */
+    dpy = ccc->dpy;
+    LockDisplay(dpy);
+    GetReq(AllocNamedColor, req);
+
+    req->cmap = cmap;
+    nbytes = req->nbytes = strlen(colorname);
+    req->length += (nbytes + 3) >> 2; /* round up to mult of 4 */
+
+    _XSend(dpy, colorname, nbytes);
+       /* _XSend is more efficient that Data, since _XReply follows */
+
+    if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) {
+       UnlockDisplay(dpy);
+        SyncHandle();
+        return (0);
+    }
+
+    exact_def.red = rep.exactRed;
+    exact_def.green = rep.exactGreen;
+    exact_def.blue = rep.exactBlue;
+
+    hard_def.red = rep.screenRed;
+    hard_def.green = rep.screenGreen;
+    hard_def.blue = rep.screenBlue;
+
+    exact_def.pixel = hard_def.pixel = rep.pixel;
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+
+    /*
+     * Now convert to the target format.
+     */
+    _XColor_to_XcmsRGB(ccc, &exact_def, pColor_exact_return, 1);
+    _XColor_to_XcmsRGB(ccc, &hard_def, pColor_scrn_return, 1);
+    if (result_format != XcmsRGBFormat
+           && result_format != XcmsUndefinedFormat) {
+       if (XcmsConvertColors(ccc, pColor_exact_return, 1, result_format,
+               (Bool *) NULL) == XcmsFailure) {
+           return(XcmsFailure);
+       }
+       if (XcmsConvertColors(ccc, pColor_scrn_return, 1, result_format,
+               (Bool *) NULL) == XcmsFailure) {
+           return(XcmsFailure);
+       }
+    }
+
+    return(XcmsSuccess);
+}
diff --git a/src/xcms/cmsCmap.c b/src/xcms/cmsCmap.c
new file mode 100644 (file)
index 0000000..00816ce
--- /dev/null
@@ -0,0 +1,493 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *             XcmsCmap.c - Client Colormap Management Routines
+ *
+ *     DESCRIPTION
+ *             Routines that store additional information about
+ *             colormaps being used by the X Client.
+ *
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Xutil.h"
+#include "Cmap.h"
+#include "Cv.h"
+
+/*
+ *      FORWARD DECLARATIONS
+ */
+static void _XcmsFreeClientCmaps(Display *dpy);
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                     PRIVATE INTERFACES                              *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             CmapRecForColormap
+ *
+ *     SYNOPSIS
+ */
+static XcmsCmapRec *
+CmapRecForColormap(
+    Display *dpy,
+    Colormap cmap)
+/*
+ *     DESCRIPTION
+ *             Find the corresponding XcmsCmapRec for cmap.  In not found
+ *             this routines attempts to create one.
+ *
+ *     RETURNS
+ *             Returns NULL if failed; otherwise the address to
+ *             the corresponding XcmsCmapRec.
+ *
+ */
+{
+    XcmsCmapRec *pRec;
+    int nScrn;
+    int i, j;
+    XVisualInfo visualTemplate;        /* Template of the visual we want */
+    XVisualInfo *visualList;   /* List for visuals that match */
+    int nVisualsMatched;       /* Number of visuals that match */
+    Window tmpWindow;
+    Visual *vp;
+    unsigned long border = 0;
+    _XAsyncHandler async;
+    _XAsyncErrorState async_state;
+
+    for (pRec = (XcmsCmapRec *)dpy->cms.clientCmaps; pRec != NULL;
+           pRec = pRec->pNext) {
+       if (pRec->cmapID == cmap) {
+           return(pRec);
+       }
+    }
+
+    /*
+     * Can't find an XcmsCmapRec associated with cmap in our records.
+     * Let's try to see if its a default colormap
+     */
+    nScrn = ScreenCount(dpy);
+    for (i = 0; i < nScrn; i++) {
+       if (cmap == DefaultColormap(dpy, i)) {
+           /* It is ... lets go ahead and store that info */
+           if ((pRec = _XcmsAddCmapRec(dpy, cmap, RootWindow(dpy, i),
+                   DefaultVisual(dpy, i))) == NULL) {
+               return((XcmsCmapRec *)NULL);
+           }
+           pRec->ccc = XcmsCreateCCC(
+                   dpy,
+                   i,                  /* screenNumber */
+                   DefaultVisual(dpy, i),
+                   (XcmsColor *)NULL,  /* clientWhitePt */
+                   (XcmsCompressionProc)NULL,  /* gamutCompProc */
+                   (XPointer)NULL,     /* gamutCompClientData */
+                   (XcmsWhiteAdjustProc)NULL,  /* whitePtAdjProc */
+                   (XPointer)NULL      /* whitePtAdjClientData */
+                   );
+           return(pRec);
+       }
+    }
+
+    /*
+     * Nope, its not a default colormap, so it's probably a foreign color map
+     * of which we have no specific details.  Let's go through the
+     * rigorous process of finding this colormap:
+     *        for each screen
+     *            for each screen's visual types
+     *                create a window with cmap specified as the colormap
+     *                if successful
+     *                    Add a CmapRec
+     *                    Create an XcmsCCC
+     *                    return the CmapRec
+     *                else
+     *                    continue
+     */
+
+    async_state.error_code = 0; /* don't care */
+    async_state.major_opcode = X_CreateWindow;
+    async_state.minor_opcode = 0;
+    for (i = 0; i < nScrn; i++) {
+       visualTemplate.screen = i;
+       visualList = XGetVisualInfo(dpy, VisualScreenMask, &visualTemplate,
+           &nVisualsMatched);
+       if (visualList == NULL) {
+           continue;
+       }
+
+       /*
+        * Attempt to create a window with cmap
+        */
+       j = 0;
+       do {
+           vp = (visualList+j)->visual;
+           LockDisplay(dpy);
+           {
+               register xCreateWindowReq *req;
+
+               GetReq(CreateWindow, req);
+               async_state.min_sequence_number = dpy->request;
+               async_state.max_sequence_number = dpy->request;
+               async_state.error_count = 0;
+               async.next = dpy->async_handlers;
+               async.handler = _XAsyncErrorHandler;
+               async.data = (XPointer)&async_state;
+               dpy->async_handlers = &async;
+               req->parent = RootWindow(dpy, i);
+               req->x = 0;
+               req->y = 0;
+               req->width = 1;
+               req->height = 1;
+               req->borderWidth = 0;
+               req->depth = (visualList+j)->depth;
+               req->class = CopyFromParent;
+               req->visual = vp->visualid;
+               tmpWindow = req->wid = XAllocID(dpy);
+               req->mask = CWBorderPixel | CWColormap;
+               req->length += 2;
+               Data32 (dpy, (long *) &border, 4);
+               Data32 (dpy, (long *) &cmap, 4);
+           }
+           {
+               xGetInputFocusReply rep;
+               register xReq *req;
+
+               GetEmptyReq(GetInputFocus, req);
+               (void) _XReply (dpy, (xReply *)&rep, 0, xTrue);
+           }
+           DeqAsyncHandler(dpy, &async);
+           UnlockDisplay(dpy);
+           SyncHandle();
+       } while (async_state.error_count > 0 && ++j < nVisualsMatched);
+
+       Xfree((char *)visualList);
+
+       /*
+        * if successful
+        */
+       if (j < nVisualsMatched) {
+           if ((pRec = _XcmsAddCmapRec(dpy, cmap, tmpWindow, vp)) == NULL)
+               return((XcmsCmapRec *)NULL);
+           pRec->ccc = XcmsCreateCCC(
+                   dpy,
+                   i,                  /* screenNumber */
+                   vp,
+                   (XcmsColor *)NULL,  /* clientWhitePt */
+                   (XcmsCompressionProc)NULL,  /* gamutCompProc */
+                   (XPointer)NULL,     /* gamutCompClientData */
+                   (XcmsWhiteAdjustProc)NULL,  /* whitePtAdjProc */
+                   (XPointer)NULL      /* whitePtAdjClientData */
+                   );
+           XDestroyWindow(dpy, tmpWindow);
+           return(pRec);
+       }
+    }
+
+    return(NULL);
+}
+
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                     API PRIVATE INTERFACES                          *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             _XcmsAddCmapRec
+ *
+ *     SYNOPSIS
+ */
+XcmsCmapRec *
+_XcmsAddCmapRec(
+    Display *dpy,
+    Colormap cmap,
+    Window windowID,
+    Visual *visual)
+/*
+ *     DESCRIPTION
+ *             Create an XcmsCmapRec for the specified cmap, windowID,
+ *             and visual, then adds it to its list of CmapRec's.
+ *
+ *     RETURNS
+ *             Returns NULL if failed; otherwise the address to
+ *             the added XcmsCmapRec.
+ *
+ */
+{
+    XcmsCmapRec *pNew;
+
+    if ((pNew = (XcmsCmapRec *) Xcalloc(1, (unsigned) sizeof(XcmsCmapRec)))
+           == NULL) {
+       return((XcmsCmapRec *)NULL);
+    }
+
+    pNew->cmapID = cmap;
+    pNew->dpy = dpy;
+    pNew->windowID = windowID;
+    pNew->visual = visual;
+    pNew->pNext = (XcmsCmapRec *)dpy->cms.clientCmaps;
+    dpy->cms.clientCmaps = (XPointer)pNew;
+    dpy->free_funcs->clientCmaps = _XcmsFreeClientCmaps;
+
+    /*
+     * Note, we don't create the XcmsCCC for pNew->ccc here because
+     * it may require the use of XGetWindowAttributes (a round trip request)
+     * to determine the screen.
+     */
+    return(pNew);
+}
+
+\f
+/*
+ *     NAME
+ *             _XcmsCopyCmapRecAndFree
+ *
+ *     SYNOPSIS
+ */
+XcmsCmapRec *
+_XcmsCopyCmapRecAndFree(
+    Display *dpy,
+    Colormap src_cmap,
+    Colormap copy_cmap)
+/*
+ *     DESCRIPTION
+ *             Augments Xlib's XCopyColormapAndFree() to copy
+ *             XcmsCmapRecs.
+ *
+ *     RETURNS
+ *             Returns NULL if failed; otherwise the address to
+ *             the copy XcmsCmapRec.
+ *
+ */
+{
+    XcmsCmapRec *pRec_src;
+    XcmsCmapRec *pRec_copy;
+
+    if ((pRec_src = CmapRecForColormap(dpy, src_cmap)) != NULL) {
+       pRec_copy =_XcmsAddCmapRec(dpy, copy_cmap, pRec_src->windowID,
+               pRec_src->visual);
+       if (pRec_copy != NULL && pRec_src->ccc) {
+           pRec_copy->ccc = (XcmsCCC)Xcalloc(1, (unsigned) sizeof(XcmsCCCRec));
+           memcpy((char *)pRec_copy->ccc, (char *)pRec_src->ccc,
+                  sizeof(XcmsCCCRec));
+       }
+       return(pRec_copy);
+    }
+    return((XcmsCmapRec *)NULL);
+}
+
+\f
+/*
+ *     NAME
+ *             _XcmsDeleteCmapRec
+ *
+ *     SYNOPSIS
+ */
+void
+_XcmsDeleteCmapRec(
+    Display *dpy,
+    Colormap cmap)
+/*
+ *     DESCRIPTION
+ *             Removes and frees the specified XcmsCmapRec structure
+ *             from the linked list of structures.
+ *
+ *     RETURNS
+ *             void
+ *
+ */
+{
+    XcmsCmapRec **pPrevPtr;
+    XcmsCmapRec *pRec;
+    int scr;
+
+    /* If it is the default cmap for a screen, do not delete it,
+     * because the server will not actually free it */
+    for (scr = ScreenCount(dpy); --scr >= 0; ) {
+       if (cmap == DefaultColormap(dpy, scr))
+           return;
+    }
+
+    /* search for it in the list */
+    pPrevPtr = (XcmsCmapRec **)&dpy->cms.clientCmaps;
+    while ((pRec = *pPrevPtr) && (pRec->cmapID != cmap)) {
+       pPrevPtr = &pRec->pNext;
+    }
+
+    if (pRec) {
+       if (pRec->ccc) {
+           XcmsFreeCCC(pRec->ccc);
+       }
+       *pPrevPtr = pRec->pNext;
+       Xfree((char *)pRec);
+    }
+}
+
+\f
+/*
+ *     NAME
+ *             _XcmsFreeClientCmaps
+ *
+ *     SYNOPSIS
+ */
+static void
+_XcmsFreeClientCmaps(
+    Display *dpy)
+/*
+ *     DESCRIPTION
+ *             Frees all XcmsCmapRec structures in the linked list
+ *             and sets dpy->cms.clientCmaps to NULL.
+ *
+ *     RETURNS
+ *             void
+ *
+ */
+{
+    XcmsCmapRec *pRecNext, *pRecFree;
+
+    pRecNext = (XcmsCmapRec *)dpy->cms.clientCmaps;
+    while (pRecNext != NULL) {
+       pRecFree = pRecNext;
+       pRecNext = pRecNext->pNext;
+       if (pRecFree->ccc) {
+           /* Free the XcmsCCC structure */
+           XcmsFreeCCC(pRecFree->ccc);
+       }
+       /* Now free the XcmsCmapRec structure */
+       Xfree((char *)pRecFree);
+    }
+    dpy->cms.clientCmaps = (XPointer)NULL;
+}
+
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                     PUBLIC INTERFACES                               *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsCCCOfColormap
+ *
+ *     SYNOPSIS
+ */
+XcmsCCC
+XcmsCCCOfColormap(
+    Display *dpy,
+    Colormap cmap)
+/*
+ *     DESCRIPTION
+ *             Finds the XcmsCCC associated with the specified colormap.
+ *
+ *     RETURNS
+ *             Returns NULL if failed; otherwise the address to
+ *             the associated XcmsCCC structure.
+ *
+ */
+{
+    XWindowAttributes windowAttr;
+    XcmsCmapRec *pRec;
+    int nScrn = ScreenCount(dpy);
+    int i;
+
+    if ((pRec = CmapRecForColormap(dpy, cmap)) != NULL) {
+       if (pRec->ccc) {
+           /* XcmsCmapRec already has a XcmsCCC */
+           return(pRec->ccc);
+       }
+
+       /*
+        * The XcmsCmapRec does not have a XcmsCCC yet, so let's create
+        * one.  But first, we need to know the screen associated with
+        * cmap, so use XGetWindowAttributes() to extract that
+        * information.  Unless, of course there is only one screen!!
+        */
+       if (nScrn == 1) {
+           /* Assume screenNumber == 0 */
+           return(pRec->ccc = XcmsCreateCCC(
+                   dpy,
+                   0,                  /* screenNumber */
+                   pRec->visual,
+                   (XcmsColor *)NULL,  /* clientWhitePt */
+                   (XcmsCompressionProc)NULL,  /* gamutCompProc */
+                   (XPointer)NULL,     /* gamutCompClientData */
+                   (XcmsWhiteAdjustProc)NULL,  /* whitePtAdjProc */
+                   (XPointer)NULL      /* whitePtAdjClientData */
+                   ));
+       } else {
+           if (XGetWindowAttributes(dpy, pRec->windowID, &windowAttr)) {
+               for (i = 0; i < nScrn; i++) {
+                   if (ScreenOfDisplay(dpy, i) == windowAttr.screen) {
+                       return(pRec->ccc = XcmsCreateCCC(
+                               dpy,
+                               i,                 /* screenNumber */
+                               pRec->visual,
+                               (XcmsColor *)NULL, /* clientWhitePt */
+                               (XcmsCompressionProc)NULL, /* gamutCompProc */
+                               (XPointer)NULL,    /* gamutCompClientData */
+                               (XcmsWhiteAdjustProc)NULL, /* whitePtAdjProc */
+                               (XPointer)NULL     /* whitePtAdjClientData */
+                               ));
+                   }
+               }
+           }
+       }
+    }
+
+    /*
+     * No such cmap
+     */
+    return(NULL);
+}
+
+XcmsCCC XcmsSetCCCOfColormap(
+    Display *dpy,
+    Colormap cmap,
+    XcmsCCC ccc)
+{
+    XcmsCCC prev_ccc = NULL;
+    XcmsCmapRec *pRec;
+
+    pRec = CmapRecForColormap(dpy, cmap);
+    if (pRec) {
+       prev_ccc = pRec->ccc;
+       pRec->ccc = ccc;
+    }
+    return prev_ccc;
+}
diff --git a/src/xcms/cmsColNm.c b/src/xcms/cmsColNm.c
new file mode 100644 (file)
index 0000000..8518adf
--- /dev/null
@@ -0,0 +1,1038 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *     NAME
+ *             XcmsColNm.c
+ *
+ *     DESCRIPTION
+ *             Source for _XcmsLookupColorName().
+ *
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include <X11/Xos.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <ctype.h>
+#define XK_LATIN1
+#include <X11/keysymdef.h>
+#include "Cv.h"
+
+/* forwards/locals */
+static Status LoadColornameDB(void);
+
+
+/*
+ *      LOCAL DEFINES
+ *             #define declarations local to this package.
+ */
+#ifndef XCMSDB
+#define XCMSDB  "/usr/lib/X11/Xcms.txt"
+#endif
+
+#ifndef isgraph
+#  define isgraph(c)   (isprint((c)) && !isspace((c)))
+#endif
+
+#ifndef XCMSDB_MAXLINELEN
+#  define XCMSDB_MAXLINELEN    256
+#endif
+
+#define FORMAT_VERSION "0.1"
+#define START_TOKEN    "XCMS_COLORDB_START"
+#define END_TOKEN      "XCMS_COLORDB_END"
+#define DELIM_CHAR     '\t'
+
+#define        NOT_VISITED     0x0
+#define        VISITED         0x1
+#define CYCLE          0xFFFF
+#define XcmsDbInitNone         -1
+#define XcmsDbInitFailure      0
+#define XcmsDbInitSuccess      1
+
+/*
+ *      LOCAL TYPEDEFS
+ */
+typedef struct _XcmsPair {
+    const char *first;
+    const char *second;
+    int flag;
+} XcmsPair;
+
+/*
+ *      LOCAL VARIABLES
+ */
+static int XcmsColorDbState = XcmsDbInitNone;
+static int nEntries;
+static char *strings;
+static XcmsPair *pairs;
+static const char whitePtStr[] = "WhitePoint";
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                     PRIVATE ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             _XcmsColorSpaceOfString
+ *
+ *     SYNOPSIS
+ */
+static XcmsColorSpace *
+_XcmsColorSpaceOfString(
+    XcmsCCC ccc,
+    const char *color_string)
+/*
+ *     DESCRIPTION
+ *             Returns a pointer to the color space structure
+ *             (XcmsColorSpace) associated with the specified color string.
+ *
+ *     RETURNS
+ *             Pointer to matching XcmsColorSpace structure if found;
+ *             otherwise NULL.
+ *
+ *     CAVEATS
+ *
+ */
+{
+    XcmsColorSpace     **papColorSpaces;
+    int n;
+    char *pchar;
+
+    if ((pchar = strchr(color_string, ':')) == NULL) {
+       return(XcmsFailure);
+    }
+    n = (int)(pchar - color_string);
+
+    if (ccc == NULL) {
+       return(NULL);
+    }
+
+    /*
+     * First try Device-Independent color spaces
+     */
+    papColorSpaces = _XcmsDIColorSpaces;
+    if (papColorSpaces != NULL) {
+       while (*papColorSpaces != NULL) {
+           if (strncmp((*papColorSpaces)->prefix, color_string, n) == 0 &&
+               !((*papColorSpaces)->prefix)[n]) {
+               return(*papColorSpaces);
+           }
+           papColorSpaces++;
+       }
+    }
+
+    /*
+     * Next try Device-Dependent color spaces
+     */
+    papColorSpaces = ((XcmsFunctionSet *)ccc->pPerScrnInfo->functionSet)->DDColorSpaces;
+    if (papColorSpaces != NULL) {
+       while (*papColorSpaces != NULL) {
+           if (strncmp((*papColorSpaces)->prefix, color_string, n) == 0 &&
+               !((*papColorSpaces)->prefix)[n]) {
+               return(*papColorSpaces);
+           }
+           papColorSpaces++;
+       }
+    }
+
+    return(NULL);
+}
+
+\f
+/*
+ *     NAME
+ *             _XcmsParseColorString
+ *
+ *     SYNOPSIS
+ */
+static int
+_XcmsParseColorString(
+    XcmsCCC ccc,
+    const char *color_string,
+    XcmsColor *pColor)
+/*
+ *     DESCRIPTION
+ *             Assuming color_string contains a numerical string color
+ *             specification, attempts to parse a string into an
+ *             XcmsColor structure.
+ *
+ *     RETURNS
+ *             0 if failed; otherwise non-zero.
+ *
+ *     CAVEATS
+ *             A color string containing a numerical color specification
+ *             must be in ISO Latin-1 encoding!
+ */
+{
+    XcmsColorSpace     *pColorSpace;
+    char               string_buf[64];
+    char               *string_lowered;
+    int                        len;
+    int                        res;
+
+    if (ccc == NULL) {
+       return(0);
+    }
+
+    /*
+     * While copying color_string to string_lowered, convert to lowercase
+     */
+    if ((len = strlen(color_string)) >= sizeof(string_buf)) {
+       string_lowered = (char *) Xmalloc(len+1);
+    } else {
+       string_lowered = string_buf;
+    }
+
+    _XcmsCopyISOLatin1Lowered(string_lowered, color_string);
+
+    if (*string_lowered == '#') {
+       if ((pColorSpace = _XcmsColorSpaceOfString(ccc, "rgb:")) != NULL) {
+           res = (*pColorSpace->parseString)(string_lowered, pColor);
+           if (len >= sizeof(string_buf)) Xfree(string_lowered);
+           return res;
+       }
+    }
+
+    if ((pColorSpace = _XcmsColorSpaceOfString(ccc, string_lowered)) != NULL) {
+       res = (*pColorSpace->parseString)(string_lowered, pColor);
+       if (len >= sizeof(string_buf)) Xfree(string_lowered);
+       return res;
+    }
+
+    if (len >= sizeof(string_buf)) Xfree(string_lowered);
+    return(0);
+}
+
+\f
+/*
+ *     NAME
+ *             FirstCmp - Compare color names of pair recs
+ *
+ *     SYNOPSIS
+ */
+static int
+FirstCmp(const void *p1, const void *p2)
+/*
+ *     DESCRIPTION
+ *             Compares the color names of XcmsColorTuples.
+ *             This routine is public to allow access from qsort???.
+ *
+ *     RETURNS
+ *             0 if equal;
+ *             < 0 if first precedes second,
+ *             > 0 if first succeeds second.
+ *
+ */
+{
+    return(strcmp(((XcmsPair *)p1)->first, ((XcmsPair *)p2)->first));
+}
+
+
+\f
+/*
+ *     NAME
+ *             stringSectionSize - determine memory needed for strings
+ *
+ *     SYNOPSIS
+ */
+static void
+SetNoVisit(void)
+/*
+ *     DESCRIPTION
+ *
+ *     RETURNS
+ *             void
+ *
+ */
+{
+    int i;
+    XcmsPair *pair = pairs;
+
+    for (i = 0; i < nEntries; i++, pair++) {
+       if (pair->flag != CYCLE) {
+           pair->flag = NOT_VISITED;
+       }
+    }
+}
+
+
+
+\f
+/*
+ *     NAME
+ *             field2 - extract two fields
+ *
+ *     SYNOPSIS
+ */
+static int
+field2(
+    char *pBuf,
+    char delim,        /* in:  field delimiter */
+    char **p1, /* in/out: pointer to pointer to field 1 */
+    char **p2) /* in/out: pointer to pointer to field 2 */
+/*
+ *     DESCRIPTION
+ *             Extracts two fields from a "record".
+ *
+ *     RETURNS
+ *             XcmsSuccess if succeeded, otherwise XcmsFailure.
+ *
+ */
+{
+    *p1 = *p2 = NULL;
+
+    /* Find Field 1 */
+    while (!isgraph(*pBuf)) {
+       if ((*pBuf != '\n') || (*pBuf != '\0')) {
+           return(XcmsFailure);
+       }
+       if (isspace(*pBuf) || (*pBuf == delim)) {
+           pBuf++;
+       }
+    }
+    *p1 = pBuf;
+
+    /* Find end of Field 2 */
+    while (isprint(*pBuf) && (*pBuf != delim)) {
+       pBuf++;
+    }
+    if ((*pBuf == '\n') || (*pBuf == '\0')) {
+       return(XcmsFailure);
+    }
+    if ((*pBuf == ' ') || (*pBuf == delim)) {
+       *pBuf++ = '\0'; /* stuff end of string character */
+    } else {
+       return(XcmsFailure);
+    }
+
+    /* Find Field 2 */
+    while (!isgraph(*pBuf)) {
+       if ((*pBuf == '\n') || (*pBuf == '\0')) {
+           return(XcmsFailure);
+       }
+       if (isspace(*pBuf) || (*pBuf == delim)) {
+           pBuf++;
+       }
+    }
+    *p2 = pBuf;
+
+    /* Find end of Field 2 */
+    while (isprint(*pBuf) && (*pBuf != delim)) {
+       pBuf++;
+    }
+    if (*pBuf != '\0') {
+       *pBuf = '\0';   /* stuff end of string character */
+    }
+
+    return(XcmsSuccess);
+}
+
+\f
+/*
+ *     NAME
+ *             _XcmsLookupColorName - Lookup DB entry for a color name
+ *
+ *     SYNOPSIS
+ */
+static Status
+_XcmsLookupColorName(
+    XcmsCCC ccc,
+    const char **name,
+    XcmsColor *pColor)
+/*
+ *     DESCRIPTION
+ *             Searches for an entry in the Device-Independent Color Name
+ *             Database for the specified string.
+ *
+ *     RETURNS
+ *             XcmsFailure if failed to find a matching entry in
+ *                     the database.
+ *             XcmsSuccess if succeeded in converting color name to
+ *                     XcmsColor.
+ *             _XCMS_NEWNAME if succeeded in converting color string (which
+ *                     is a color name to yet another color name.  Note
+ *                     that the new name is passed back via 'name'.
+ */
+ {
+    Status             retval = 0;
+    char               name_lowered_64[64];
+    char               *name_lowered;
+    register int       i, j, left, right;
+    int                        len;
+    const char         *tmpName;
+    XcmsPair           *pair = NULL;
+
+    /*
+     * Check state of Database:
+     *         XcmsDbInitNone
+     *         XcmsDbInitSuccess
+     *         XcmsDbInitFailure
+     */
+    if (XcmsColorDbState == XcmsDbInitFailure) {
+       return(XcmsFailure);
+    }
+    if (XcmsColorDbState == XcmsDbInitNone) {
+       if (!LoadColornameDB()) {
+           return(XcmsFailure);
+       }
+    }
+
+    SetNoVisit();
+
+    /*
+     * While copying name to name_lowered, convert to lowercase
+     */
+
+    tmpName = *name;
+
+Retry:
+    if ((len = strlen(tmpName)) > 63) {
+       name_lowered = (char *) Xmalloc(len+1);
+    } else {
+       name_lowered = name_lowered_64;
+    }
+
+    _XcmsCopyISOLatin1Lowered(name_lowered, tmpName);
+
+    /*
+     * Now, remove spaces.
+     */
+    for (i = 0, j = 0; j < len; j++) {
+       if (!isspace(name_lowered[j])) {
+           name_lowered[i++] = name_lowered[j];
+       }
+    }
+    name_lowered[i] = '\0';
+
+    left = 0;
+    right = nEntries - 1;
+    while (left <= right) {
+       i = (left + right) >> 1;
+       pair = &pairs[i];
+       j = strcmp(name_lowered, pair->first);
+       if (j < 0)
+           right = i - 1;
+       else if (j > 0)
+           left = i + 1;
+       else {
+           break;
+       }
+    }
+    if (len > 63) Xfree(name_lowered);
+
+    if (left > right) {
+       if (retval == 2) {
+           if (*name != tmpName) {
+               *name = tmpName;
+           }
+           return(_XCMS_NEWNAME);
+       }
+       return(XcmsFailure);
+    }
+
+    if (pair->flag == CYCLE) {
+       return(XcmsFailure);
+    }
+    if (pair->flag == VISITED) {
+       pair->flag = CYCLE;
+       return(XcmsFailure);
+    }
+
+    if (_XcmsParseColorString(ccc, pair->second, pColor) == XcmsSuccess) {
+       /* f2 contains a numerical string specification */
+       return(XcmsSuccess);
+    } else {
+       /* f2 does not contain a numerical string specification */
+       tmpName = pair->second;
+       pair->flag = VISITED;
+       retval = 2;
+       goto Retry;
+    }
+}
+
+\f
+/*
+ *     NAME
+ *             RemoveSpaces
+ *
+ *     SYNOPSIS
+ */
+static int
+RemoveSpaces(
+    char *pString)
+/*
+ *     DESCRIPTION
+ *             Removes spaces from string.
+ *
+ *     RETURNS
+ *             Void
+ *
+ */
+{
+    int i, count = 0;
+    char *cptr;
+
+    /* REMOVE SPACES */
+    cptr = pString;
+    for (i = strlen(pString); i; i--, cptr++) {
+       if (!isspace(*cptr)) {
+           *pString++ = *cptr;
+           count++;
+       }
+    }
+    *pString = '\0';
+    return(count);
+}
+
+\f
+/*
+ *     NAME
+ *             stringSectionSize - determine memory needed for strings
+ *
+ *     SYNOPSIS
+ */
+static int
+stringSectionSize(
+    FILE *stream,
+    int        *pNumEntries,
+    int        *pSectionSize)
+/*
+ *     DESCRIPTION
+ *             Determines the amount of memory required to store the
+ *             color name strings and also the number of strings.
+ *
+ *     RETURNS
+ *             XcmsSuccess if succeeded, otherwise XcmsFailure.
+ *
+ */
+{
+    char buf[XCMSDB_MAXLINELEN];
+    char token[XCMSDB_MAXLINELEN];
+    char token2[XCMSDB_MAXLINELEN];
+    char *pBuf;
+    char *f1;
+    char *f2;
+    int i;
+
+    *pNumEntries = 0;
+    *pSectionSize = 0;
+
+    /*
+     * Advance to START_TOKEN
+     *  Anything before is just considered as comments.
+     */
+
+    while((pBuf = fgets(buf, XCMSDB_MAXLINELEN, stream)) != NULL) {
+       if ((sscanf(buf, "%s %s", token, token2))
+               && (strcmp(token, START_TOKEN) == 0)) {
+           if (strcmp(token2, FORMAT_VERSION) != 0) {
+               /* text file not in the right format */
+               return(XcmsFailure);
+           }
+           break;
+       } /* else it was just a blank line or comment */
+    }
+
+    if (pBuf == NULL) {
+       return(XcmsFailure);
+    }
+
+    while((fgets(buf, XCMSDB_MAXLINELEN, stream)) != NULL) {
+       if ((sscanf(buf, "%s", token)) && (strcmp(token, END_TOKEN) == 0)) {
+           break;
+       }
+
+       if (field2(buf, DELIM_CHAR, &f1, &f2) != XcmsSuccess) {
+           return(XcmsFailure);
+       }
+
+       (*pNumEntries)++;
+
+       (*pSectionSize) += (i = strlen(f1)) + 1;
+       for (; i; i--, f1++) {
+           /* REMOVE SPACES FROM COUNT */
+           if (isspace(*f1)) {
+               (*pSectionSize)--;
+           }
+       }
+
+       (*pSectionSize) += (i = strlen(f2)) + 1;
+       for (; i; i--, f2++) {
+           /* REMOVE SPACES FROM COUNT */
+           if (isspace(*f2)) {
+               (*pSectionSize)--;
+           }
+       }
+
+    }
+
+    return(XcmsSuccess);
+}
+
+\f
+/*
+ *     NAME
+ *             ReadColornameDB - Read the Color Name Database
+ *
+ *     SYNOPSIS
+ */
+static Status
+ReadColornameDB(
+    FILE *stream,
+    XcmsPair *pRec,
+    char *pString)
+/*
+ *     DESCRIPTION
+ *             Loads the Color Name Database from a text file.
+ *
+ *     RETURNS
+ *             XcmsSuccess if succeeded, otherwise XcmsFailure.
+ *
+ */
+{
+    char buf[XCMSDB_MAXLINELEN];
+    char token[XCMSDB_MAXLINELEN];
+    char token2[XCMSDB_MAXLINELEN];
+    char *f1;
+    char *f2;
+    char *pBuf;
+
+    /*
+     * Advance to START_TOKEN
+     *  Anything before is just considered as comments.
+     */
+
+    while((pBuf = fgets(buf, XCMSDB_MAXLINELEN, stream)) != NULL) {
+       if ((sscanf(buf, "%s %s", token, token2))
+               && (strcmp(token, START_TOKEN) == 0)) {
+           if (strcmp(token2, FORMAT_VERSION) != 0) {
+               /* text file not in the right format */
+               return(XcmsFailure);
+           }
+           break;
+       } /* else it was just a blank line or comment */
+    }
+
+    if (pBuf == NULL) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Process lines between START_TOKEN to END_TOKEN
+     */
+
+    while ((fgets(buf, XCMSDB_MAXLINELEN, stream)) != NULL) {
+       if ((sscanf(buf, "%s", token)) && (strcmp(token, END_TOKEN) == 0)) {
+           /*
+            * Found END_TOKEN so break out of for loop
+            */
+           break;
+       }
+
+       /*
+        * Get pairs
+        */
+       if (field2(buf, DELIM_CHAR, &f1, &f2) != XcmsSuccess) {
+           /* Invalid line */
+           continue;
+       }
+
+       /*
+        * Add strings
+        */
+
+       /* Left String */
+       pRec->first = pString;
+       _XcmsCopyISOLatin1Lowered(pString, f1);
+       pString += (1 + RemoveSpaces(pString));
+       pRec->second = pString;
+       /* Right String */
+       _XcmsCopyISOLatin1Lowered(pString, f2);
+       pString += RemoveSpaces(pString) + 1;
+       pRec++;
+
+    }
+
+    return(XcmsSuccess);
+}
+
+\f
+/*
+ *     NAME
+ *             LoadColornameDB - Load the Color Name Database
+ *
+ *     SYNOPSIS
+ */
+static Status
+LoadColornameDB(void)
+/*
+ *     DESCRIPTION
+ *             Loads the Color Name Database from a text file.
+ *
+ *     RETURNS
+ *             XcmsSuccess if succeeded, otherwise XcmsFailure.
+ *
+ */
+{
+    int size;
+    FILE *stream;
+    const char *pathname;
+    struct stat txt;
+    int length;
+
+    /* use and name of this env var is not part of the standard */
+    /* implementation-dependent feature */
+    if ((pathname = getenv("XCMSDB")) == NULL) {
+       pathname = XCMSDB;
+    }
+#ifdef __UNIXOS2__
+    pathname = __XOS2RedirRoot(pathname);
+#endif
+
+    length = strlen(pathname);
+    if ((length == 0) || (length >= (BUFSIZ - 5))){
+       XcmsColorDbState = XcmsDbInitFailure;
+       return(XcmsFailure);
+    }
+
+    if (stat(pathname, &txt)) {
+       /* can't stat file */
+       XcmsColorDbState = XcmsDbInitFailure;
+       return(XcmsFailure);
+    }
+
+    if ((stream = _XFopenFile (pathname, "r")) == NULL) {
+       /* can't open file */
+       XcmsColorDbState = XcmsDbInitFailure;
+       return(XcmsFailure);
+    }
+
+    if (stringSectionSize(stream, &nEntries, &size) != XcmsSuccess ||
+       nEntries == 0) {
+       (void) fclose(stream);
+       XcmsColorDbState = XcmsDbInitFailure;
+       return(XcmsFailure);
+    }
+    rewind(stream);
+
+    strings = (char *) Xmalloc(size);
+    pairs = (XcmsPair *)Xcalloc(nEntries, sizeof(XcmsPair));
+
+    ReadColornameDB(stream, pairs, strings);
+    (void) fclose(stream);
+
+    /*
+     * sort the pair recs
+     */
+    qsort((char *)pairs, nEntries, sizeof(XcmsPair), FirstCmp);
+
+    XcmsColorDbState = XcmsDbInitSuccess;
+    return(XcmsSuccess);
+}
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                     API PRIVATE ROUTINES                            *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             _XcmsCopyISOLatin1Lowered
+ *
+ *     SYNOPSIS
+ */
+void
+_XcmsCopyISOLatin1Lowered(
+    char *dst,
+    const char *src)
+/*
+ *     DESCRIPTION
+ *             ISO Latin-1 case conversion routine
+ *             Identical to XmuCopyISOLatin1Lowered() but provided here
+ *             to eliminate need to link with libXmu.a.
+ *
+ *             IMPLEMENTORS NOTE:
+ *                 This routine is also used in XcmsFormatOfPrefix.
+ *
+ *     RETURNS
+ *             Void
+ *
+ */
+{
+    register unsigned char *dest;
+    register const unsigned char *source;
+
+    for (dest = (unsigned char *)dst, source = (const unsigned char *)src;
+        *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';
+}
+
+\f
+/*
+ *     NAME
+ *             _XcmsResolveColorString -
+ *
+ *     SYNOPSIS
+ */
+Status
+_XcmsResolveColorString (
+    XcmsCCC ccc,
+    const char **color_string,
+    XcmsColor *pColor_exact_return,
+    XcmsColorFormat result_format)
+/*
+ *     DESCRIPTION
+ *             The XcmsLookupColor function finds the color specification
+ *             associated with a color name in the Device-Independent Color
+ *             Name Database.
+ *     RETURNS
+ *             XcmsFailure if failed to convert valid color string.
+ *             XcmsSuccess if succeeded in converting color string to
+ *                     XcmsColor.
+ *             _XCMS_NEWNAME if failed to parse the string or find it in
+ *                     the database, or if succeeded in looking it up and
+ *                     found another name which is not in the database.
+ *                     Note that the new name is returned in color_string.
+ *
+ *             This function returns both the color specification found in the
+ *             database (db specification) and the color specification for the
+ *             color displayable by the specified screen (screen
+ *             specification).  The calling routine sets the format for these
+ *             returned specifications in the XcmsColor format component.
+ *             If XcmsUndefinedFormat, the specification is returned in the
+ *             format used to store the color in the database.
+ */
+{
+    XcmsColor dbWhitePt;       /* whitePt associated with pColor_exact_return*/
+                               /*    the screen's white point */
+    XcmsColor *pClientWhitePt;
+    int retval;
+    const char *strptr = whitePtStr;
+
+/*
+ * 0. Check for invalid arguments.
+ */
+    if (ccc == NULL || (*color_string)[0] == '\0' || pColor_exact_return == NULL) {
+       return(XcmsFailure);
+    }
+
+/*
+ * 1. First attempt to parse the string
+ *    If successful, then convert the specification to the target format
+ *    and return.
+ */
+    if (_XcmsParseColorString(ccc, *color_string, pColor_exact_return)
+           == 1) {
+       if (result_format != XcmsUndefinedFormat
+               && pColor_exact_return->format != result_format) {
+           /* need to be converted to the target format */
+           return(XcmsConvertColors(ccc, pColor_exact_return, 1,
+                   result_format, (Bool *)NULL));
+       } else {
+           return(XcmsSuccess);
+       }
+    }
+
+/*
+ * 2. Attempt to find it in the DI Color Name Database
+ */
+
+    /*
+     * a. Convert String into a XcmsColor structure
+     *       Attempt to extract the specification for color_string from the
+     *       DI Database (pColor_exact_return).  If the DI Database does not
+     *      have this entry, then return failure.
+     */
+    retval = _XcmsLookupColorName(ccc, color_string, pColor_exact_return);
+
+    if (retval != XcmsSuccess) {
+       /* color_string replaced with a color name, or not found */
+       return(_XCMS_NEWNAME);
+    }
+
+    if (pColor_exact_return->format == XcmsUndefinedFormat) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * b. If result_format not defined, then assume target format
+     *   is the exact format.
+     */
+    if (result_format == XcmsUndefinedFormat) {
+       result_format = pColor_exact_return->format;
+    }
+
+    if ((ClientWhitePointOfCCC(ccc))->format == XcmsUndefinedFormat) {
+       pClientWhitePt = ScreenWhitePointOfCCC(ccc);
+    } else {
+       pClientWhitePt = ClientWhitePointOfCCC(ccc);
+    }
+
+    /*
+     * c. Convert to the target format, making adjustments for white
+     *   point differences as necessary.
+     */
+    if (XCMS_DD_ID(pColor_exact_return->format)) {
+       /*
+        * The spec format is Device-Dependent, therefore assume the
+        *    its white point is the Screen White Point.
+        */
+       if (XCMS_DD_ID(result_format)) {
+           /*
+            * Target format is Device-Dependent
+            *  Therefore, DD --> DD conversion
+            */
+           return(_XcmsDDConvertColors(ccc, pColor_exact_return,
+                   1, result_format, (Bool *) NULL));
+       } else {
+           /*
+            * Target format is Device-Independent
+            *  Therefore, DD --> DI conversion
+            */
+           if (ccc->whitePtAdjProc && !_XcmsEqualWhitePts(ccc,
+                   pClientWhitePt, ScreenWhitePointOfCCC(ccc))) {
+               return((*ccc->whitePtAdjProc)(ccc, ScreenWhitePointOfCCC(ccc),
+                       pClientWhitePt, result_format,
+                       pColor_exact_return, 1, (Bool *) NULL));
+           } else {
+               if (_XcmsDDConvertColors(ccc, pColor_exact_return, 1,
+                       XcmsCIEXYZFormat, (Bool *) NULL) == XcmsFailure) {
+                   return(XcmsFailure);
+               }
+               return(_XcmsDIConvertColors(ccc, pColor_exact_return,
+                       pClientWhitePt, 1, result_format));
+           }
+       }
+    } else {
+       /*
+        * The spec format is Device-Independent, therefore attempt
+        * to find a database white point.
+        *
+        * If the Database does not have a white point, then assume the
+        * database white point is the same as the Screen White Point.
+        */
+
+       if (_XcmsLookupColorName(ccc, &strptr, &dbWhitePt) != 1) {
+           memcpy((char *)&dbWhitePt,
+                  (char *)&ccc->pPerScrnInfo->screenWhitePt,
+                  sizeof(XcmsColor));
+       }
+       if (XCMS_DD_ID(result_format)) {
+           /*
+            * Target format is Device-Dependent
+            *  Therefore, DI --> DD conversion
+            */
+           if (ccc->whitePtAdjProc && !_XcmsEqualWhitePts(ccc,
+                   &dbWhitePt, ScreenWhitePointOfCCC(ccc))) {
+               return((*ccc->whitePtAdjProc)(ccc, &dbWhitePt,
+                       ScreenWhitePointOfCCC(ccc), result_format,
+                       pColor_exact_return, 1, (Bool *)NULL));
+           } else {
+               if (pColor_exact_return->format != XcmsCIEXYZFormat) {
+                   if (_XcmsDIConvertColors(ccc, pColor_exact_return,
+                           &dbWhitePt, 1, XcmsCIEXYZFormat) == XcmsFailure) {
+                       return(XcmsFailure);
+                   }
+               }
+               return (_XcmsDDConvertColors(ccc, pColor_exact_return, 1,
+                       result_format, (Bool *)NULL));
+           }
+       } else {
+           /*
+            * Target format is Device-Independent
+            *  Therefore, DI --> DI conversion
+            */
+           if (ccc->whitePtAdjProc && !_XcmsEqualWhitePts(ccc,
+                   &dbWhitePt, pClientWhitePt)) {
+               /*
+                * The calling routine wants to resolve this color
+                * in terms if it's white point (i.e. Client White Point).
+                * Therefore, apply white adjustment for the displacement
+                * between dbWhitePt to clientWhitePt.
+                */
+               return((*ccc->whitePtAdjProc)(ccc, &dbWhitePt,
+                       pClientWhitePt, result_format,
+                       pColor_exact_return, 1, (Bool *)NULL));
+           } else if (_XcmsEqualWhitePts(ccc,
+                   &dbWhitePt, pClientWhitePt)) {
+               /*
+                * Can use either dbWhitePt or pClientWhitePt to
+                * convert to the result_format.
+                */
+               if (pColor_exact_return->format == result_format) {
+                   return(XcmsSuccess);
+               } else {
+                   return (_XcmsDIConvertColors(ccc, pColor_exact_return,
+                           &dbWhitePt, 1, result_format));
+               }
+           } else {
+               /*
+                * Need to convert to a white point independent color
+                * space (let's choose CIEXYZ) then convert to the
+                * target color space.  Why? Lets assume that
+                * pColor_exact_return->format and result format
+                * are white point dependent format (e.g., CIELUV, CIELAB,
+                * TekHVC ... same or any combination). If so, we'll
+                * need to convert the color with dbWhitePt to an absolute
+                * spec (i.e.  non-white point dependent) then convert that
+                * absolute value with clientWhitePt to the result_format.
+                */
+               if (pColor_exact_return->format != XcmsCIEXYZFormat) {
+                   if (_XcmsDIConvertColors(ccc, pColor_exact_return,
+                           &dbWhitePt, 1, XcmsCIEXYZFormat) == XcmsFailure) {
+                       return(XcmsFailure);
+                   }
+               }
+               if (result_format == XcmsCIEXYZFormat) {
+                   return(XcmsSuccess);
+               } else {
+                   return(_XcmsDIConvertColors(ccc, pColor_exact_return,
+                           pClientWhitePt, 1, result_format));
+               }
+           }
+       }
+    }
+}
diff --git a/src/xcms/cmsGlobls.c b/src/xcms/cmsGlobls.c
new file mode 100644 (file)
index 0000000..c9e82f2
--- /dev/null
@@ -0,0 +1,126 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *             XcmsGlobls.c
+ *
+ *     DESCRIPTION
+ *             Source file containing Xcms globals
+ *
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+/*
+ *      GLOBALS
+ *              Variables declared in this package that are allowed
+ *             to be used globally.
+ */
+
+    /*
+     * Initial array of Device Independent Color Spaces
+     */
+XcmsColorSpace *_XcmsDIColorSpacesInit[] = {
+    &XcmsCIEXYZColorSpace,
+    &XcmsCIEuvYColorSpace,
+    &XcmsCIExyYColorSpace,
+    &XcmsCIELabColorSpace,
+    &XcmsCIELuvColorSpace,
+    &XcmsTekHVCColorSpace,
+    &XcmsUNDEFINEDColorSpace,
+    NULL
+};
+    /*
+     * Pointer to the array of pointers to XcmsColorSpace structures for
+     * Device-Independent Color Spaces that are currently accessible by
+     * the color management system.  End of list is indicated by a NULL pointer.
+     */
+XcmsColorSpace **_XcmsDIColorSpaces = _XcmsDIColorSpacesInit;
+
+    /*
+     * Initial array of Device Dependent Color Spaces
+     */
+XcmsColorSpace *_XcmsDDColorSpacesInit[] = {
+    &XcmsRGBColorSpace,
+    &XcmsRGBiColorSpace,
+    NULL
+};
+    /*
+     * Pointer to the array of pointers to XcmsColorSpace structures for
+     * Device-Dependent Color Spaces that are currently accessible by
+     * the color management system.  End of list is indicated by a NULL pointer.
+     */
+XcmsColorSpace **_XcmsDDColorSpaces = &_XcmsDDColorSpacesInit[0];
+
+    /*
+     * Initial array of Screen Color Characterization Function Sets
+     */
+XcmsFunctionSet        *_XcmsSCCFuncSetsInit[] = {
+       &XcmsLinearRGBFunctionSet,
+#ifdef GRAY
+       &XcmsGrayFunctionSet,
+#endif /* GRAY */
+       NULL};
+    /*
+     * Pointer to the array of pointers to XcmsSCCFuncSet structures
+     * (Screen Color Characterization Function Sets) that are currently
+     * accessible by the color management system.  End of list is
+     * indicated by a NULL pointer.
+     */
+XcmsFunctionSet **_XcmsSCCFuncSets = _XcmsSCCFuncSetsInit;
+
+    /*
+     * X Consortium Registered Device-Independent Color Spaces
+     * Note that prefix must be in lowercase.
+     */
+const char     _XcmsCIEXYZ_prefix[] = "ciexyz";
+const char     _XcmsCIEuvY_prefix[] = "cieuvy";
+const char     _XcmsCIExyY_prefix[] = "ciexyy";
+const char     _XcmsCIELab_prefix[] = "cielab";
+const char     _XcmsCIELuv_prefix[] = "cieluv";
+const char     _XcmsTekHVC_prefix[] = "tekhvc";
+    /*
+     * Registered Device-Dependent Color Spaces
+     */
+const char     _XcmsRGBi_prefix[] = "rgbi";
+const char     _XcmsRGB_prefix[] = "rgb";
+
+XcmsRegColorSpaceEntry _XcmsRegColorSpaces[] = {
+    { _XcmsCIEXYZ_prefix, XcmsCIEXYZFormat },
+    { _XcmsCIEuvY_prefix, XcmsCIEuvYFormat },
+    { _XcmsCIExyY_prefix, XcmsCIExyYFormat },
+    { _XcmsCIELab_prefix, XcmsCIELabFormat },
+    { _XcmsCIELuv_prefix, XcmsCIELuvFormat },
+    { _XcmsTekHVC_prefix, XcmsTekHVCFormat },
+    { _XcmsRGB_prefix, XcmsRGBFormat },
+    { _XcmsRGBi_prefix,        XcmsRGBiFormat },
+    { NULL, 0 }
+};
diff --git a/src/xcms/cmsInt.c b/src/xcms/cmsInt.c
new file mode 100644 (file)
index 0000000..b7c3214
--- /dev/null
@@ -0,0 +1,412 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *             XcmsInt.c - Xcms API utility routines
+ *
+ *     DESCRIPTION
+ *             Xcms Application Program Interface (API) utility
+ *             routines for hanging information directly onto
+ *             the Display structure.
+ *
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+#ifndef XCMSCOMPPROC
+#  define XCMSCOMPPROC XcmsTekHVCClipC
+#endif
+
+/* forward/static */
+static void _XcmsFreeDefaultCCCs(Display *dpy);
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                        API PRIVATE ROUTINES                         *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             _XcmsCopyPointerArray
+ *
+ *     SYNOPSIS
+ */
+XPointer *
+_XcmsCopyPointerArray(
+    XPointer *pap)
+/*
+ *     DESCRIPTION
+ *             Copies an array of NULL terminated pointers.
+ *
+ *     RETURNS
+ *             Returns NULL if failed; otherwise the address to
+ *             the copy.
+ *
+ */
+{
+    XPointer *newArray;
+    char **tmp;
+    int n;
+
+    for (tmp = pap, n = 0; *tmp != NULL; tmp++, n++);
+    n++; /* add 1 to include the NULL pointer */
+
+    if ((newArray = (XPointer *)Xmalloc(n * sizeof(XPointer)))) {
+       memcpy((char *)newArray, (char *)pap,
+              (unsigned)(n * sizeof(XPointer)));
+    }
+    return((XPointer *)newArray);
+}
+
+/*
+ *     NAME
+ *             _XcmsFreePointerArray
+ *
+ *     SYNOPSIS
+ */
+void
+_XcmsFreePointerArray(
+    XPointer *pap)
+/*
+ *     DESCRIPTION
+ *             Frees an array of NULL terminated pointers.
+ *
+ *     RETURNS
+ *             void
+ *
+ */
+{
+    Xfree(pap);
+}
+
+/*
+ *     NAME
+ *             _XcmsPushPointerArray
+ *
+ *     SYNOPSIS
+ */
+XPointer *
+_XcmsPushPointerArray(
+    XPointer *pap,
+    XPointer p,
+    XPointer *papNoFree)
+/*
+ *     DESCRIPTION
+ *             Places the specified pointer at the head of an array of NULL
+ *             terminated pointers.
+ *
+ *     RETURNS
+ *             Returns NULL if failed; otherwise the address to
+ *             the head of the array.
+ *
+ */
+{
+    XPointer *newArray;
+    char **tmp;
+    int n;
+
+    for (tmp = pap, n = 0; *tmp != NULL; tmp++, n++);
+
+    /* add 2: 1 for the new pointer and another for the NULL pointer */
+    n += 2;
+
+    if ((newArray = (XPointer *)Xmalloc(n * sizeof(XPointer)))) {
+       memcpy((char *)(newArray+1),(char *)pap,
+              (unsigned)((n-1) * sizeof(XPointer)));
+       *newArray = p;
+    }
+    if (pap != papNoFree) {
+        _XcmsFreePointerArray(pap);
+    }
+    return((XPointer *)newArray);
+}
+
+/*
+ *     NAME
+ *             _XcmsInitDefaultCCCs
+ *
+ *     SYNOPSIS
+ */
+int
+_XcmsInitDefaultCCCs(
+    Display *dpy)
+/*
+ *     DESCRIPTION
+ *             Initializes the Xcms per Display Info structure
+ *             (XcmsPerDpyInfo).
+ *
+ *     RETURNS
+ *             Returns 0 if failed; otherwise non-zero.
+ *
+ */
+{
+    int nScrn = ScreenCount(dpy);
+    int i;
+    XcmsCCC ccc;
+
+    if (nScrn <= 0) {
+       return(0);
+    }
+
+    /*
+     * Create an array of XcmsCCC structures, one for each screen.
+     * They serve as the screen's default CCC.
+     */
+    if (!(ccc = (XcmsCCC)
+           Xcalloc((unsigned)nScrn, (unsigned) sizeof(XcmsCCCRec)))) {
+       return(0);
+    }
+    dpy->cms.defaultCCCs = (XPointer)ccc;
+    dpy->free_funcs->defaultCCCs = _XcmsFreeDefaultCCCs;
+
+    for (i = 0; i < nScrn; i++, ccc++) {
+       ccc->dpy = dpy;
+       ccc->screenNumber = i;
+       ccc->visual = DefaultVisual(dpy, i);
+       /*
+        * Used calloc to allocate memory so:
+        *      ccc->clientWhitePt->format == XcmsUndefinedFormat
+        *      ccc->gamutCompProc == NULL
+        *      ccc->whitePtAdjProc == NULL
+        *      ccc->pPerScrnInfo = NULL
+        *
+        * Don't need to create XcmsPerScrnInfo and its functionSet and
+        * pScreenData components until the default CCC is accessed.
+        * Note that the XcmsDefaultCCC routine calls _XcmsInitScrnInto
+        * to do this.
+        */
+       ccc->gamutCompProc = XCMSCOMPPROC;
+    }
+
+    return(1);
+}
+
+\f
+/*
+ *     NAME
+ *             _XcmsFreeDefaultCCCs - Free Default CCCs and its PerScrnInfo
+ *
+ *     SYNOPSIS
+ */
+static void
+_XcmsFreeDefaultCCCs(
+    Display *dpy)
+/*
+ *     DESCRIPTION
+ *             This routine frees the default XcmsCCC's associated with
+ *             each screen and its associated substructures as neccessary.
+ *
+ *     RETURNS
+ *             void
+ *
+ *
+ */
+{
+    int nScrn = ScreenCount(dpy);
+    XcmsCCC ccc;
+    int i;
+
+    /*
+     * Free Screen data in each DefaultCCC
+     *         Do not use XcmsFreeCCC here because it will not free
+     *         DefaultCCC's.
+     */
+    ccc = (XcmsCCC)dpy->cms.defaultCCCs;
+    for (i = nScrn; i--; ccc++) {
+       /*
+        * Check if XcmsPerScrnInfo exists.
+        *
+        * This is the only place where XcmsPerScrnInfo structures
+        * are freed since there is only one allocated per Screen.
+        * It just so happens that we place its reference in the
+        * default CCC.
+        */
+       if (ccc->pPerScrnInfo) {
+           /* Check if SCCData exists */
+           if (ccc->pPerScrnInfo->state != XcmsInitNone
+                   && ccc->pPerScrnInfo->screenData) {
+               (*((XcmsFunctionSet *)ccc->pPerScrnInfo->functionSet)->screenFreeProc)
+                       (ccc->pPerScrnInfo->screenData);
+           }
+           Xfree(ccc->pPerScrnInfo);
+       }
+    }
+
+    /*
+     * Free the array of XcmsCCC structures
+     */
+    Xfree(dpy->cms.defaultCCCs);
+    dpy->cms.defaultCCCs = (XPointer)NULL;
+}
+
+
+\f
+/*
+ *     NAME
+ *             _XcmsInitScrnInfo
+ *
+ *     SYNOPSIS
+ */
+int
+_XcmsInitScrnInfo(
+    register Display *dpy,
+    int screenNumber)
+/*
+ *     DESCRIPTION
+ *             Given a display and screen number, this routine attempts
+ *             to initialize the Xcms per Screen Info structure
+ *             (XcmsPerScrnInfo).
+ *
+ *     RETURNS
+ *             Returns zero if initialization failed; non-zero otherwise.
+ */
+{
+    XcmsFunctionSet **papSCCFuncSet = _XcmsSCCFuncSets;
+    XcmsCCC defaultccc;
+
+    /*
+     * Check if the XcmsCCC's for each screen has been created.
+     * Really dont need to be created until some routine uses the Xcms
+     * API routines.
+     */
+    if ((XcmsCCC)dpy->cms.defaultCCCs == NULL) {
+       if (!_XcmsInitDefaultCCCs(dpy)) {
+           return(0);
+       }
+    }
+
+    defaultccc = (XcmsCCC)dpy->cms.defaultCCCs + screenNumber;
+
+    /*
+     * For each SCCFuncSet, try its pInitScrnFunc.
+     * If the function succeeds, then we got it!
+     */
+
+    if (!defaultccc->pPerScrnInfo) {
+       /*
+        * This is one of two places where XcmsPerScrnInfo structures
+        * are allocated.  There is one allocated per Screen that is
+        * shared among visuals that do not have specific intensity
+        * tables.  Other XcmsPerScrnInfo structures are created
+        * for the latter (see XcmsCreateCCC).  The ones created
+        * here are referenced by the default CCC.
+        */
+       if (!(defaultccc->pPerScrnInfo = (XcmsPerScrnInfo *)
+               Xcalloc(1, (unsigned) sizeof(XcmsPerScrnInfo)))) {
+           return(0);
+       }
+       defaultccc->pPerScrnInfo->state = XcmsInitNone;
+    }
+
+    while (*papSCCFuncSet != NULL) {
+       if ((*(*papSCCFuncSet)->screenInitProc)(dpy, screenNumber,
+               defaultccc->pPerScrnInfo)) {
+           defaultccc->pPerScrnInfo->state = XcmsInitSuccess;
+           return(1);
+       }
+       papSCCFuncSet++;
+    }
+
+    /*
+     * Use Default SCCData
+     */
+    return(_XcmsLRGB_InitScrnDefault(dpy, screenNumber, defaultccc->pPerScrnInfo));
+}
+
+\f
+/*
+ *     NAME
+ *             _XcmsFreeIntensityMaps
+ *
+ *     SYNOPSIS
+ */
+void
+_XcmsFreeIntensityMaps(
+    Display *dpy)
+/*
+ *     DESCRIPTION
+ *             Frees all XcmsIntensityMap structures in the linked list
+ *             and sets dpy->cms.perVisualIntensityMaps to NULL.
+ *
+ *     RETURNS
+ *             void
+ *
+ */
+{
+    XcmsIntensityMap *pNext, *pFree;
+
+    pNext = (XcmsIntensityMap *)dpy->cms.perVisualIntensityMaps;
+    while (pNext != NULL) {
+       pFree = pNext;
+       pNext = pNext->pNext;
+       (*pFree->pFreeScreenData)(pFree->screenData);
+       /* Now free the XcmsIntensityMap structure */
+       Xfree(pFree);
+    }
+    dpy->cms.perVisualIntensityMaps = (XPointer)NULL;
+}
+
+\f
+/*
+ *     NAME
+ *             _XcmsGetIntensityMap
+ *
+ *     SYNOPSIS
+ */
+XcmsIntensityMap *
+_XcmsGetIntensityMap(
+    Display *dpy,
+    Visual *visual)
+/*
+ *     DESCRIPTION
+ *             Attempts to return a per-Visual intensity map.
+ *
+ *     RETURNS
+ *             Pointer to the XcmsIntensityMap structure if found;
+ *             otherwise NULL
+ *
+ */
+{
+    VisualID targetID = visual->visualid;
+    XcmsIntensityMap *pNext;
+
+    pNext = (XcmsIntensityMap *)dpy->cms.perVisualIntensityMaps;
+    while (pNext != NULL) {
+       if (targetID == pNext->visualID) {
+           return(pNext);
+       }
+       pNext = pNext->pNext;
+    }
+    return((XcmsIntensityMap *)NULL);
+}
diff --git a/src/xcms/cmsLkCol.c b/src/xcms/cmsLkCol.c
new file mode 100644 (file)
index 0000000..15e9874
--- /dev/null
@@ -0,0 +1,193 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *             XcmsLkCol.c
+ *
+ *     DESCRIPTION
+ *             Source for XcmsLookupColor
+ *
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+\f
+/*
+ *     NAME
+ *             XcmsLookupColor -
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsLookupColor (
+    Display *dpy,
+    Colormap cmap,
+    _Xconst char *colorname,
+    XcmsColor *pColor_exact_return,
+    XcmsColor *pColor_scrn_return,
+    XcmsColorFormat result_format)
+/*
+ *     DESCRIPTION
+ *             The XcmsLookupColor function finds the color specification
+ *             associated with a color name in the Device-Independent Color
+ *             Name Database.
+ *     RETURNS
+ *             This function returns both the color specification found in the
+ *             database (db specification) and the color specification for the
+ *             color displayable by the specified screen (screen
+ *             specification).  The calling routine sets the format for these
+ *             returned specifications in the XcmsColor format component.
+ *             If XcmsUndefinedFormat, the specification is returned in the
+ *             format used to store the color in the database.
+ */
+{
+    Status retval1 = XcmsSuccess;
+    Status retval2 = XcmsSuccess;
+    XcmsCCC ccc;
+    register int n;
+    xLookupColorReply reply;
+    register xLookupColorReq *req;
+    XColor def, scr;
+
+/*
+ * 0. Check for invalid arguments.
+ */
+    if (dpy == NULL || colorname[0] == '\0' || pColor_scrn_return == 0
+           || pColor_exact_return == NULL) {
+       return(XcmsFailure);
+    }
+
+    if ((ccc = XcmsCCCOfColormap(dpy, cmap)) == (XcmsCCC)NULL) {
+       return(XcmsFailure);
+    }
+
+/*
+ * 1. Convert string to a XcmsColor
+ */
+    if ((retval1 = _XcmsResolveColorString(ccc, &colorname,
+           pColor_exact_return, result_format)) == XcmsFailure) {
+       return(XcmsFailure);
+    }
+    if (retval1 == _XCMS_NEWNAME) {
+       goto PassToServer;
+    }
+
+/*
+ * 2. pColor_scrn_return
+ *         Assume the pColor_exact_return has already been adjusted to
+ *         the Client White Point.
+ *
+ */
+    /*
+     * Convert to RGB, adjusting for white point differences if necessary.
+     */
+    memcpy((char *)pColor_scrn_return, (char *)pColor_exact_return,
+          sizeof(XcmsColor));
+    if (pColor_scrn_return->format == XcmsRGBFormat) {
+       retval2 = XcmsSuccess;
+    } else if ((retval2 = XcmsConvertColors(ccc, pColor_scrn_return, 1,
+           XcmsRGBFormat, (Bool *)NULL)) == XcmsFailure) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Then, convert XcmsColor structure to the target specification
+     *    format.  Note that we must use NULL instead of passing
+     *    pCompressed.
+     */
+
+    if (result_format ==  XcmsUndefinedFormat) {
+       result_format = pColor_exact_return->format;
+    }
+    if (result_format == XcmsRGBFormat) {
+       _XcmsUnresolveColor(ccc, pColor_scrn_return);
+    } else {
+       _XcmsResolveColor(ccc, pColor_scrn_return);
+       if (XcmsConvertColors(ccc, pColor_scrn_return, 1, result_format,
+               (Bool *) NULL) == XcmsFailure) {
+           return(XcmsFailure);
+       }
+    }
+
+    return(retval1 > retval2 ? retval1 : retval2);
+
+PassToServer:
+    /*
+     * Xcms and i18n methods failed, so lets pass it to the server
+     * for parsing.
+     */
+
+    LockDisplay(dpy);
+    GetReq (LookupColor, req);
+    req->cmap = cmap;
+    req->nbytes = n = strlen(colorname);
+    req->length += (n + 3) >> 2;
+    Data (dpy, colorname, (long)n);
+    if (!_XReply (dpy, (xReply *) &reply, 0, xTrue)) {
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return (XcmsFailure);
+       }
+    def.red   = reply.exactRed;
+    def.green = reply.exactGreen;
+    def.blue  = reply.exactBlue;
+
+    scr.red   = reply.screenRed;
+    scr.green = reply.screenGreen;
+    scr.blue  = reply.screenBlue;
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+
+    _XColor_to_XcmsRGB(ccc, &def, pColor_exact_return, 1);
+    _XColor_to_XcmsRGB(ccc, &scr, pColor_scrn_return, 1);
+
+    /*
+     * Then, convert XcmsColor structure to the target specification
+     *    format.  Note that we must use NULL instead of passing
+     *    pCompressed.
+     */
+
+    if (result_format != XcmsRGBFormat
+           && result_format != XcmsUndefinedFormat) {
+       if (XcmsConvertColors(ccc, pColor_exact_return, 1, result_format,
+               (Bool *) NULL) == XcmsFailure) {
+           return(XcmsFailure);
+       }
+       if (XcmsConvertColors(ccc, pColor_scrn_return, 1, result_format,
+               (Bool *) NULL) == XcmsFailure) {
+           return(XcmsFailure);
+       }
+    }
+
+    return(XcmsSuccess);
+}
diff --git a/src/xcms/cmsMath.c b/src/xcms/cmsMath.c
new file mode 100644 (file)
index 0000000..70b0675
--- /dev/null
@@ -0,0 +1,136 @@
+
+/*
+
+Copyright 1990, 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.
+
+*/
+
+/*
+ * Stephen Gildea, MIT X Consortium, January 1991
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xcmsint.h"
+
+#include <float.h>
+#ifndef DBL_EPSILON
+#define DBL_EPSILON 1e-6
+#endif
+
+#ifdef _X_ROOT_STATS
+int cbrt_loopcount;
+int sqrt_loopcount;
+#endif
+
+/* Newton's Method:  x_n+1 = x_n - ( f(x_n) / f'(x_n) ) */
+
+
+/* for cube roots, x^3 - a = 0,  x_new = x - 1/3 (x - a/x^2) */
+
+double
+_XcmsCubeRoot(double a)
+{
+    register double abs_a, cur_guess, delta;
+
+#ifdef DEBUG
+    printf("_XcmsCubeRoot passed in %g\n", a);
+#endif
+#ifdef _X_ROOT_STATS
+    cbrt_loopcount = 0;
+#endif
+    if (a == 0.)
+       return 0.;
+
+    abs_a = a<0. ? -a : a;     /* convert to positive to speed loop tests */
+
+    /* arbitrary first guess */
+    if (abs_a > 1.)
+       cur_guess = abs_a/8.;
+    else
+       cur_guess = abs_a*8.;
+
+    do {
+#ifdef _X_ROOT_STATS
+       cbrt_loopcount++;
+#endif
+       delta = (cur_guess - abs_a/(cur_guess*cur_guess))/3.;
+       cur_guess -= delta;
+       if (delta < 0.) delta = -delta;
+    } while (delta >= cur_guess*DBL_EPSILON);
+
+    if (a < 0.)
+       cur_guess = -cur_guess;
+
+#ifdef DEBUG
+    printf("_XcmsCubeRoot returning %g\n", cur_guess);
+#endif
+    return cur_guess;
+}
+
+
+
+/* for square roots, x^2 - a = 0,  x_new = x - 1/2 (x - a/x) */
+
+double
+_XcmsSquareRoot(double a)
+{
+    register double cur_guess, delta;
+
+#ifdef DEBUG
+    printf("_XcmsSquareRoot passed in %g\n", a);
+#endif
+#ifdef _X_ROOT_STATS
+    sqrt_loopcount = 0;
+#endif
+    if (a == 0.)
+       return 0.;
+
+    if (a < 0.) {
+       /* errno = EDOM; */
+       return 0.;
+    }
+
+    /* arbitrary first guess */
+    if (a > 1.)
+       cur_guess = a/4.;
+    else
+       cur_guess = a*4.;
+
+    do {
+#ifdef _X_ROOT_STATS
+       sqrt_loopcount++;
+#endif
+       delta = (cur_guess - a/cur_guess)/2.;
+       cur_guess -= delta;
+       if (delta < 0.) delta = -delta;
+    } while (delta >= cur_guess*DBL_EPSILON);
+
+#ifdef DEBUG
+    printf("_XcmsSquareRoot returning %g\n", cur_guess);
+#endif
+    return cur_guess;
+}
+
diff --git a/src/xcms/cmsProp.c b/src/xcms/cmsProp.c
new file mode 100644 (file)
index 0000000..2826ee7
--- /dev/null
@@ -0,0 +1,149 @@
+
+/*
+ *
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *     NAME
+ *             XcmsProp.c
+ *
+ *     DESCRIPTION
+ *             This utility routines for manipulating properties.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <X11/Xatom.h>
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                     API PRIVATE ROUTINES                            *
+ *                                                                     *
+ ************************************************************************/
+
+\f
+/*
+ *     NAME
+ *             _XcmsGetElement -- get an element value from the property passed
+ *
+ *     SYNOPSIS
+ */
+unsigned long
+_XcmsGetElement(
+    int             format,
+    char            **pValue,
+    unsigned long   *pCount)
+/*
+ *     DESCRIPTION
+ *         Get the next element from the property and return it.
+ *         Also increment the pointer the amount needed.
+ *
+ *     Returns
+ *         unsigned long
+ */
+{
+    unsigned long value;
+
+    switch (format) {
+      case 32:
+       value = *((unsigned long *)(*pValue)) & 0xFFFFFFFF;
+       *pValue += sizeof(unsigned long);
+       *pCount -= 1;
+       break;
+      case 16:
+       value = *((unsigned short *)(*pValue));
+       *pValue += sizeof(unsigned short);
+       *pCount -= 1;
+       break;
+      case 8:
+       value = *((unsigned char *) (*pValue));
+       *pValue += 1;
+       *pCount -= 1;
+       break;
+      default:
+       value = 0;
+       break;
+    }
+    return(value);
+}
+
+\f
+/*
+ *     NAME
+ *             _XcmsGetProperty -- Determine the existance of a property
+ *
+ *     SYNOPSIS
+ */
+int
+_XcmsGetProperty(
+    Display *pDpy,
+    Window  w,
+    Atom property,
+    int             *pFormat,
+    unsigned long   *pNItems,
+    unsigned long   *pNBytes,
+    char            **pValue)
+/*
+ *     DESCRIPTION
+ *
+ *     Returns
+ *         0 if property does not exist.
+ *         1 if property exists.
+ */
+{
+    char *prop_ret;
+    int format_ret;
+    long len = 6516;
+    unsigned long nitems_ret, after_ret;
+    Atom atom_ret;
+    int xgwp_ret;
+
+    while (True) {
+       xgwp_ret = XGetWindowProperty (pDpy, w, property, 0, len, False,
+                                      XA_INTEGER, &atom_ret, &format_ret,
+                                      &nitems_ret, &after_ret,
+                                      (unsigned char **)&prop_ret);
+       if (xgwp_ret == Success && after_ret > 0) {
+           len += nitems_ret * (format_ret >> 3);
+           XFree (prop_ret);
+       } else {
+           break;
+       }
+    }
+    if (xgwp_ret != Success || format_ret == 0 || nitems_ret == 0) {
+       /* the property does not exist or is of an unexpected type or
+           getting window property failed */
+       return(XcmsFailure);
+    }
+
+    *pFormat = format_ret;
+    *pNItems = nitems_ret;
+    *pNBytes = nitems_ret * (format_ret >> 3);
+    *pValue = prop_ret;
+    return(XcmsSuccess);
+}
diff --git a/src/xcms/cmsTrig.c b/src/xcms/cmsTrig.c
new file mode 100644 (file)
index 0000000..5a01a56
--- /dev/null
@@ -0,0 +1,593 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ *     It should be pointed out that for simplicity's sake, the
+ *     environment parameters are defined as floating point constants,
+ *     rather than octal or hexadecimal initializations of allocated
+ *     storage areas.  This means that the range of allowed numbers
+ *     may not exactly match the hardware's capabilities.  For example,
+ *     if the maximum positive double precision floating point number
+ *     is EXACTLY 1.11...E100 and the constant "MAXDOUBLE is
+ *     defined to be 1.11E100 then the numbers between 1.11E100 and
+ *     1.11...E100 are considered to be undefined.  For most
+ *     applications, this will cause no problems.
+ *
+ *     An alternate method is to allocate a global static "double" variable,
+ *     say "maxdouble", and use a union declaration and initialization
+ *     to initialize it with the proper bits for the EXACT maximum value.
+ *     This was not done because the only compilers available to the
+ *     author did not fully support union initialization features.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xcmsint.h"
+
+/* forward/static */
+static double _XcmsModulo(double value, double base);
+static double _XcmsPolynomial(
+    register int order,
+    double const *coeffs,
+    double x);
+static double
+_XcmsModuloF(
+    double val,
+    register double *dp);
+
+/*
+ *     DEFINES
+ */
+#define XCMS_MAXERROR          0.000001
+#define XCMS_MAXITER           10000
+#define XCMS_PI                3.14159265358979323846264338327950
+#define XCMS_TWOPI             6.28318530717958620
+#define XCMS_HALFPI            1.57079632679489660
+#define XCMS_FOURTHPI          0.785398163397448280
+#define XCMS_SIXTHPI           0.523598775598298820
+#define XCMS_RADIANS(d)                ((d) * XCMS_PI / 180.0)
+#define XCMS_DEGREES(r)                ((r) * 180.0 / XCMS_PI)
+#define XCMS_X6_UNDERFLOWS     (4.209340e-52)  /* X**6 almost underflows */
+#define XCMS_X16_UNDERFLOWS    (5.421010e-20)  /* X**16 almost underflows*/
+#define XCMS_CHAR_BIT          8
+#define XCMS_LONG_MAX          0x7FFFFFFF
+#define XCMS_DEXPLEN           11
+#define XCMS_NBITS(type)       (XCMS_CHAR_BIT * (int)sizeof(type))
+#define XCMS_FABS(x)           ((x) < 0.0 ? -(x) : (x))
+
+/* XCMS_DMAXPOWTWO - largest power of two exactly representable as a double */
+#ifdef _CRAY
+#define XCMS_DMAXPOWTWO        ((double)(1 < 47))
+#else
+#define XCMS_DMAXPOWTWO        ((double)(XCMS_LONG_MAX) * \
+           (1L << ((XCMS_NBITS(double)-XCMS_DEXPLEN) - XCMS_NBITS(int) + 1)))
+#endif
+
+/*
+ *     LOCAL VARIABLES
+ */
+
+static double const cos_pcoeffs[] = {
+    0.12905394659037374438e7,
+   -0.37456703915723204710e6,
+    0.13432300986539084285e5,
+   -0.11231450823340933092e3
+};
+
+static double const cos_qcoeffs[] = {
+    0.12905394659037373590e7,
+    0.23467773107245835052e5,
+    0.20969518196726306286e3,
+    1.0
+};
+
+static double const sin_pcoeffs[] = {
+    0.20664343336995858240e7,
+   -0.18160398797407332550e6,
+    0.35999306949636188317e4,
+   -0.20107483294588615719e2
+};
+
+static double const sin_qcoeffs[] = {
+    0.26310659102647698963e7,
+    0.39270242774649000308e5,
+    0.27811919481083844087e3,
+    1.0
+};
+\f
+/*
+ *
+ *  FUNCTION
+ *
+ *     _XcmsCosine   double precision cosine
+ *
+ *  KEY WORDS
+ *
+ *     cos
+ *     machine independent routines
+ *     trigonometric functions
+ *     math libraries
+ *
+ *  DESCRIPTION
+ *
+ *     Returns double precision cosine of double precision
+ *     floating point argument.
+ *
+ *  USAGE
+ *
+ *     double _XcmsCosine (x)
+ *     double x;
+ *
+ *  REFERENCES
+ *
+ *     Computer Approximations, J.F. Hart et al, John Wiley & Sons,
+ *     1968, pp. 112-120.
+ *
+ *  RESTRICTIONS
+ *
+ *     The sin and cos routines are interactive in the sense that
+ *     in the process of reducing the argument to the range -PI/4
+ *     to PI/4, each may call the other.  Ultimately one or the
+ *     other uses a polynomial approximation on the reduced
+ *     argument.  The sin approximation has a maximum relative error
+ *     of 10**(-17.59) and the cos approximation has a maximum
+ *     relative error of 10**(-16.18).
+ *
+ *     These error bounds assume exact arithmetic
+ *     in the polynomial evaluation.  Additional rounding and
+ *     truncation errors may occur as the argument is reduced
+ *     to the range over which the polynomial approximation
+ *     is valid, and as the polynomial is evaluated using
+ *     finite-precision arithmetic.
+ *
+ *  PROGRAMMER
+ *
+ *     Fred Fish
+ *
+ *  INTERNALS
+ *
+ *     Computes cos(x) from:
+ *
+ *             (1)     Reduce argument x to range -PI to PI.
+ *
+ *             (2)     If x > PI/2 then call cos recursively
+ *                     using relation cos(x) = -cos(x - PI).
+ *
+ *             (3)     If x < -PI/2 then call cos recursively
+ *                     using relation cos(x) = -cos(x + PI).
+ *
+ *             (4)     If x > PI/4 then call sin using
+ *                     relation cos(x) = sin(PI/2 - x).
+ *
+ *             (5)     If x < -PI/4 then call cos using
+ *                     relation cos(x) = sin(PI/2 + x).
+ *
+ *             (6)     If x would cause underflow in approx
+ *                     evaluation arithmetic then return
+ *                     sqrt(1.0 - x**2).
+ *
+ *             (7)     By now x has been reduced to range
+ *                     -PI/4 to PI/4 and the approximation
+ *                     from HART pg. 119 can be used:
+ *
+ *                     cos(x) = ( p(y) / q(y) )
+ *                     Where:
+ *
+ *                     y    =  x * (4/PI)
+ *
+ *                     p(y) =  SUM [ Pj * (y**(2*j)) ]
+ *                     over j = {0,1,2,3}
+ *
+ *                     q(y) =  SUM [ Qj * (y**(2*j)) ]
+ *                     over j = {0,1,2,3}
+ *
+ *                     P0   =  0.12905394659037374438571854e+7
+ *                     P1   =  -0.3745670391572320471032359e+6
+ *                     P2   =  0.134323009865390842853673e+5
+ *                     P3   =  -0.112314508233409330923e+3
+ *                     Q0   =  0.12905394659037373590295914e+7
+ *                     Q1   =  0.234677731072458350524124e+5
+ *                     Q2   =  0.2096951819672630628621e+3
+ *                     Q3   =  1.0000...
+ *                     (coefficients from HART table #3843 pg 244)
+ *
+ *
+ *     **** NOTE ****    The range reduction relations used in
+ *     this routine depend on the final approximation being valid
+ *     over the negative argument range in addition to the positive
+ *     argument range.  The particular approximation chosen from
+ *     HART satisfies this requirement, although not explicitly
+ *     stated in the text.  This may not be true of other
+ *     approximations given in the reference.
+ *
+ */
+
+double _XcmsCosine(double x)
+{
+    auto double y;
+    auto double yt2;
+    double retval;
+
+    if (x < -XCMS_PI || x > XCMS_PI) {
+       x = _XcmsModulo (x, XCMS_TWOPI);
+        if (x > XCMS_PI) {
+           x = x - XCMS_TWOPI;
+        } else if (x < -XCMS_PI) {
+           x = x + XCMS_TWOPI;
+        }
+    }
+    if (x > XCMS_HALFPI) {
+       retval = -(_XcmsCosine (x - XCMS_PI));
+    } else if (x < -XCMS_HALFPI) {
+       retval = -(_XcmsCosine (x + XCMS_PI));
+    } else if (x > XCMS_FOURTHPI) {
+       retval = _XcmsSine (XCMS_HALFPI - x);
+    } else if (x < -XCMS_FOURTHPI) {
+       retval = _XcmsSine (XCMS_HALFPI + x);
+    } else if (x < XCMS_X6_UNDERFLOWS && x > -XCMS_X6_UNDERFLOWS) {
+       retval = _XcmsSquareRoot (1.0 - (x * x));
+    } else {
+       y = x / XCMS_FOURTHPI;
+       yt2 = y * y;
+       retval = _XcmsPolynomial (3, cos_pcoeffs, yt2) / _XcmsPolynomial (3, cos_qcoeffs, yt2);
+    }
+    return (retval);
+}
+
+\f
+/*
+ *  FUNCTION
+ *
+ *     _XcmsModulo   double precision modulo
+ *
+ *  KEY WORDS
+ *
+ *     _XcmsModulo
+ *     machine independent routines
+ *     math libraries
+ *
+ *  DESCRIPTION
+ *
+ *     Returns double precision modulo of two double
+ *     precision arguments.
+ *
+ *  USAGE
+ *
+ *     double _XcmsModulo (value, base)
+ *     double value;
+ *     double base;
+ *
+ *  PROGRAMMER
+ *
+ *     Fred Fish
+ *
+ */
+static double _XcmsModulo(double value, double base)
+{
+    auto double intpart;
+
+    value /= base;
+    value = _XcmsModuloF (value, &intpart);
+    value *= base;
+    return(value);
+}
+
+\f
+/*
+ * frac = (double) _XcmsModuloF(double val, double *dp)
+ *     return fractional part of 'val'
+ *     set *dp to integer part of 'val'
+ *
+ * Note  -> only compiled for the CA or KA.  For the KB/MC,
+ * "math.c" instantiates a copy of the inline function
+ * defined in "math.h".
+ */
+static double
+_XcmsModuloF(
+    double val,
+    register double *dp)
+{
+       register double abs;
+       /*
+        * Don't use a register for this.  The extra precision this results
+        * in on some systems causes problems.
+        */
+       double ip;
+
+       /* should check for illegal values here - nan, inf, etc */
+       abs = XCMS_FABS(val);
+       if (abs >= XCMS_DMAXPOWTWO) {
+               ip = val;
+       } else {
+               ip = abs + XCMS_DMAXPOWTWO;     /* dump fraction */
+               ip -= XCMS_DMAXPOWTWO;  /* restore w/o frac */
+               if (ip > abs)           /* if it rounds up */
+                       ip -= 1.0;      /* fix it */
+               ip = XCMS_FABS(ip);
+       }
+       *dp = ip;
+       return (val - ip); /* signed fractional part */
+}
+
+\f
+/*
+ *  FUNCTION
+ *
+ *     _XcmsPolynomial   double precision polynomial evaluation
+ *
+ *  KEY WORDS
+ *
+ *     poly
+ *     machine independent routines
+ *     math libraries
+ *
+ *  DESCRIPTION
+ *
+ *     Evaluates a polynomial and returns double precision
+ *     result.  Is passed a the order of the polynomial,
+ *     a pointer to an array of double precision polynomial
+ *     coefficients (in ascending order), and the independent
+ *     variable.
+ *
+ *  USAGE
+ *
+ *     double _XcmsPolynomial (order, coeffs, x)
+ *     int order;
+ *     double *coeffs;
+ *     double x;
+ *
+ *  PROGRAMMER
+ *
+ *     Fred Fish
+ *
+ *  INTERNALS
+ *
+ *     Evalates the polynomial using recursion and the form:
+ *
+ *             P(x) = P0 + x(P1 + x(P2 +...x(Pn)))
+ *
+ */
+
+static double _XcmsPolynomial(
+    register int order,
+    double const *coeffs,
+    double x)
+{
+    auto double rtn_value;
+
+#if 0
+    auto double curr_coeff;
+    if (order <= 0) {
+       rtn_value = *coeffs;
+    } else {
+       curr_coeff = *coeffs;   /* Bug in Unisoft's compiler.  Does not */
+       coeffs++;               /* generate good code for *coeffs++ */
+       rtn_value = curr_coeff + x * _XcmsPolynomial (--order, coeffs, x);
+    }
+#else /* ++jrb -- removed tail recursion */
+    coeffs += order;
+    rtn_value = *coeffs--;
+    while(order-- > 0)
+       rtn_value = *coeffs-- + (x * rtn_value);
+#endif
+
+    return(rtn_value);
+}
+
+\f
+/*
+ *  FUNCTION
+ *
+ *     _XcmsSine       double precision sine
+ *
+ *  KEY WORDS
+ *
+ *     sin
+ *     machine independent routines
+ *     trigonometric functions
+ *     math libraries
+ *
+ *  DESCRIPTION
+ *
+ *     Returns double precision sine of double precision
+ *     floating point argument.
+ *
+ *  USAGE
+ *
+ *     double _XcmsSine (x)
+ *     double x;
+ *
+ *  REFERENCES
+ *
+ *     Computer Approximations, J.F. Hart et al, John Wiley & Sons,
+ *     1968, pp. 112-120.
+ *
+ *  RESTRICTIONS
+ *
+ *     The sin and cos routines are interactive in the sense that
+ *     in the process of reducing the argument to the range -PI/4
+ *     to PI/4, each may call the other.  Ultimately one or the
+ *     other uses a polynomial approximation on the reduced
+ *     argument.  The sin approximation has a maximum relative error
+ *     of 10**(-17.59) and the cos approximation has a maximum
+ *     relative error of 10**(-16.18).
+ *
+ *     These error bounds assume exact arithmetic
+ *     in the polynomial evaluation.  Additional rounding and
+ *     truncation errors may occur as the argument is reduced
+ *     to the range over which the polynomial approximation
+ *     is valid, and as the polynomial is evaluated using
+ *     finite-precision arithmetic.
+ *
+ *  PROGRAMMER
+ *
+ *     Fred Fish
+ *
+ *  INTERNALS
+ *
+ *     Computes sin(x) from:
+ *
+ *       (1)   Reduce argument x to range -PI to PI.
+ *
+ *       (2)   If x > PI/2 then call sin recursively
+ *             using relation sin(x) = -sin(x - PI).
+ *
+ *       (3)   If x < -PI/2 then call sin recursively
+ *             using relation sin(x) = -sin(x + PI).
+ *
+ *       (4)   If x > PI/4 then call cos using
+ *             relation sin(x) = cos(PI/2 - x).
+ *
+ *       (5)   If x < -PI/4 then call cos using
+ *             relation sin(x) = -cos(PI/2 + x).
+ *
+ *       (6)   If x is small enough that polynomial
+ *             evaluation would cause underflow
+ *             then return x, since sin(x)
+ *             approaches x as x approaches zero.
+ *
+ *       (7)   By now x has been reduced to range
+ *             -PI/4 to PI/4 and the approximation
+ *             from HART pg. 118 can be used:
+ *
+ *             sin(x) = y * ( p(y) / q(y) )
+ *             Where:
+ *
+ *             y    =  x * (4/PI)
+ *
+ *             p(y) =  SUM [ Pj * (y**(2*j)) ]
+ *             over j = {0,1,2,3}
+ *
+ *             q(y) =  SUM [ Qj * (y**(2*j)) ]
+ *             over j = {0,1,2,3}
+ *
+ *             P0   =  0.206643433369958582409167054e+7
+ *             P1   =  -0.18160398797407332550219213e+6
+ *             P2   =  0.359993069496361883172836e+4
+ *             P3   =  -0.2010748329458861571949e+2
+ *             Q0   =  0.263106591026476989637710307e+7
+ *             Q1   =  0.3927024277464900030883986e+5
+ *             Q2   =  0.27811919481083844087953e+3
+ *             Q3   =  1.0000...
+ *             (coefficients from HART table #3063 pg 234)
+ *
+ *
+ *     **** NOTE ****    The range reduction relations used in
+ *     this routine depend on the final approximation being valid
+ *     over the negative argument range in addition to the positive
+ *     argument range.  The particular approximation chosen from
+ *     HART satisfies this requirement, although not explicitly
+ *     stated in the text.  This may not be true of other
+ *     approximations given in the reference.
+ *
+ */
+
+double
+_XcmsSine (double x)
+{
+    double y;
+    double yt2;
+    double retval;
+
+    if (x < -XCMS_PI || x > XCMS_PI) {
+       x = _XcmsModulo (x, XCMS_TWOPI);
+       if (x > XCMS_PI) {
+           x = x - XCMS_TWOPI;
+       } else if (x < -XCMS_PI) {
+           x = x + XCMS_TWOPI;
+       }
+    }
+    if (x > XCMS_HALFPI) {
+       retval = -(_XcmsSine (x - XCMS_PI));
+    } else if (x < -XCMS_HALFPI) {
+       retval = -(_XcmsSine (x + XCMS_PI));
+    } else if (x > XCMS_FOURTHPI) {
+       retval = _XcmsCosine (XCMS_HALFPI - x);
+    } else if (x < -XCMS_FOURTHPI) {
+       retval = -(_XcmsCosine (XCMS_HALFPI + x));
+    } else if (x < XCMS_X6_UNDERFLOWS && x > -XCMS_X6_UNDERFLOWS) {
+       retval = x;
+    } else {
+       y = x / XCMS_FOURTHPI;
+       yt2 = y * y;
+       retval = y * (_XcmsPolynomial (3, sin_pcoeffs, yt2) / _XcmsPolynomial(3, sin_qcoeffs, yt2));
+    }
+    return(retval);
+}
+
+\f
+/*
+ *     NAME
+ *             _XcmsArcTangent
+ *
+ *     SYNOPSIS
+ */
+double
+_XcmsArcTangent(double x)
+/*
+ *     DESCRIPTION
+ *             Computes the arctangent.
+ *             This is an implementation of the Gauss algorithm as
+ *             described in:
+ *                 Forman S. Acton, Numerical Methods That Work,
+ *                     New York, NY, Harper & Row, 1970.
+ *
+ *     RETURNS
+ *             Returns the arctangent
+ */
+{
+    double ai, a1 = 0.0, bi, b1 = 0.0, l, d;
+    double maxerror;
+    int i;
+
+    if (x == 0.0)  {
+       return (0.0);
+    }
+    if (x < 1.0) {
+       maxerror = x * XCMS_MAXERROR;
+    } else {
+       maxerror = XCMS_MAXERROR;
+    }
+    ai = _XcmsSquareRoot( 1.0 / (1.0 + (x * x)) );
+    bi = 1.0;
+    for (i = 0; i < XCMS_MAXITER; i++) {
+       a1 = (ai + bi) / 2.0;
+       b1 = _XcmsSquareRoot((a1 * bi));
+       if (a1 == b1)
+           break;
+       d = XCMS_FABS(a1 - b1);
+       if (d < maxerror)
+           break;
+       ai = a1;
+       bi = b1;
+    }
+
+    l = ((a1 > b1) ? b1 : a1);
+
+    a1 = _XcmsSquareRoot(1 + (x * x));
+    return (x / (a1 * l));
+}
diff --git a/src/xcms/uvY.c b/src/xcms/uvY.c
new file mode 100644 (file)
index 0000000..5344fb1
--- /dev/null
@@ -0,0 +1,423 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of XCMS based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *
+ *     NAME
+ *             CIEuvy.c
+ *
+ *     DESCRIPTION
+ *             This file contains routines that support the CIE u'v'Y
+ *             color space to include conversions to and from the CIE
+ *             XYZ space.
+ *
+ *     DOCUMENTATION
+ *             "TekColor Color Management System, System Implementor's Manual"
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <X11/Xos.h>
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+#include <stdio.h>
+
+/*
+ *     FORWARD DECLARATIONS
+ */
+static int CIEuvY_ParseString(register char *spec, XcmsColor *pColor);
+
+/*
+ *     DEFINES
+ *             Internal definitions that need NOT be exported to any package
+ *             or program using this package.
+ */
+#ifdef DBL_EPSILON
+#  define XMY_DBL_EPSILON DBL_EPSILON
+#else
+#  define XMY_DBL_EPSILON 0.00001
+#endif
+
+
+/*
+ *     LOCAL VARIABLES
+ */
+
+    /*
+     * NULL terminated list of functions applied to get from CIEuvY to CIEXYZ
+     */
+static XcmsConversionProc Fl_CIEuvY_to_CIEXYZ[] = {
+    XcmsCIEuvYToCIEXYZ,
+    NULL
+};
+
+    /*
+     * NULL terminated list of functions applied to get from CIEXYZ to CIEuvY
+     */
+static XcmsConversionProc Fl_CIEXYZ_to_CIEuvY[] = {
+    XcmsCIEXYZToCIEuvY,
+    NULL
+};
+
+
+/*
+ *     GLOBALS
+ */
+
+    /*
+     * CIE uvY Color Space
+     */
+XcmsColorSpace XcmsCIEuvYColorSpace =
+    {
+       _XcmsCIEuvY_prefix,             /* prefix */
+       XcmsCIEuvYFormat,               /* id */
+       CIEuvY_ParseString,     /* parseString */
+       Fl_CIEuvY_to_CIEXYZ,    /* to_CIEXYZ */
+       Fl_CIEXYZ_to_CIEuvY,    /* from_CIEXYZ */
+       1
+    };
+
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PRIVATE ROUTINES                               *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             CIEuvY_ParseString
+ *
+ *     SYNOPSIS
+ */
+static int
+CIEuvY_ParseString(
+    register char *spec,
+    XcmsColor *pColor)
+/*
+ *     DESCRIPTION
+ *             This routines takes a string and attempts to convert
+ *             it into a XcmsColor structure with XcmsCIEuvYFormat.
+ *             The assumed CIEuvY string syntax is:
+ *                 CIEuvY:<u>/<v>/<Y>
+ *             Where u, v, and Y are in string input format for floats
+ *             consisting of:
+ *                 a. an optional sign
+ *                 b. a string of numbers possibly containing a decimal point,
+ *                 c. an optional exponent field containing an 'E' or 'e'
+ *                     followed by a possibly signed integer string.
+ *
+ *     RETURNS
+ *             0 if failed, non-zero otherwise.
+ */
+{
+    int n;
+    char *pchar;
+
+    if ((pchar = strchr(spec, ':')) == NULL) {
+       return(XcmsFailure);
+    }
+    n = (int)(pchar - spec);
+
+    /*
+     * Check for proper prefix.
+     */
+    if (strncmp(spec, _XcmsCIEuvY_prefix, n) != 0) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Attempt to parse the value portion.
+     */
+    if (sscanf(spec + n + 1, "%lf/%lf/%lf",
+           &pColor->spec.CIEuvY.u_prime,
+           &pColor->spec.CIEuvY.v_prime,
+           &pColor->spec.CIEuvY.Y) != 3) {
+        char *s; /* Maybe failed due to locale */
+        int f;
+        if ((s = strdup(spec))) {
+            for (f = 0; s[f]; ++f)
+                if (s[f] == '.')
+                    s[f] = ',';
+                else if (s[f] == ',')
+                    s[f] = '.';
+           if (sscanf(s + n + 1, "%lf/%lf/%lf",
+                      &pColor->spec.CIEuvY.u_prime,
+                      &pColor->spec.CIEuvY.v_prime,
+                      &pColor->spec.CIEuvY.Y) != 3) {
+                free(s);
+                return(XcmsFailure);
+            }
+            free(s);
+        } else
+           return(XcmsFailure);
+    }
+    pColor->format = XcmsCIEuvYFormat;
+    pColor->pixel = 0;
+    return(_XcmsCIEuvY_ValidSpec(pColor));
+}
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             XcmsCIEuvY_ValidSpec
+ *
+ *     SYNOPSIS
+ */
+Status
+_XcmsCIEuvY_ValidSpec(
+    XcmsColor *pColor)
+/*
+ *     DESCRIPTION
+ *             Checks if color specification valid for CIE u'v'Y.
+ *
+ *     RETURNS
+ *             XcmsFailure if invalid,
+ *             XcmsSuccess if valid.
+ *
+ */
+{
+    if (pColor->format != XcmsCIEuvYFormat
+           ||
+           (pColor->spec.CIEuvY.Y < 0.0 - XMY_DBL_EPSILON)
+           ||
+           (pColor->spec.CIEuvY.Y > 1.0 + XMY_DBL_EPSILON)) {
+       return(XcmsFailure);
+    }
+    return(XcmsSuccess);
+}
+
+\f
+/*
+ *     NAME
+ *             XcmsCIEuvYToCIEXYZ - convert CIEuvY to CIEXYZ
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsCIEuvYToCIEXYZ(
+    XcmsCCC ccc,
+    XcmsColor *puvY_WhitePt,
+    XcmsColor *pColors_in_out,
+    unsigned int nColors)
+/*
+ *     DESCRIPTION
+ *             Converts color specifications in an array of XcmsColor
+ *             structures from CIEuvY format to CIEXYZ format.
+ *
+ *     RETURNS
+ *             XcmsFailure if failed,
+ *             XcmsSuccess if succeeded.
+ *
+ */
+{
+    XcmsCIEXYZ XYZ_return;
+    XcmsColor whitePt;
+    int i;
+    XcmsColor *pColor = pColors_in_out;
+    XcmsFloat div, x, y, z, Y;
+
+    /*
+     * Check arguments
+     * Postpone checking puvY_WhitePt until it is actually needed
+     * otherwise converting between XYZ and uvY will fail.
+     */
+    if (pColors_in_out == NULL) {
+       return(XcmsFailure);
+    }
+
+
+    /*
+     * Now convert each XcmsColor structure to CIEXYZ form
+     */
+    for (i = 0; i < nColors; i++, pColor++) {
+
+       /* Make sure original format is CIEuvY */
+       if (!_XcmsCIEuvY_ValidSpec(pColor)) {
+           return(XcmsFailure);
+       }
+
+       /*
+        * Convert to CIEXYZ
+        */
+
+       Y = pColor->spec.CIEuvY.Y;
+
+       /* Convert color u'v' to xyz space */
+       div = (6.0 * pColor->spec.CIEuvY.u_prime) - (16.0 * pColor->spec.CIEuvY.v_prime) + 12.0;
+       if (div == 0.0) {
+           /* use white point since div == 0 */
+           if (puvY_WhitePt == NULL ) {
+               return(XcmsFailure);
+           }
+           /*
+            * Make sure white point is in CIEuvY form
+            */
+           if (puvY_WhitePt->format != XcmsCIEuvYFormat) {
+               /* Make copy of the white point because we're going to modify it */
+               memcpy((char *)&whitePt, (char *)puvY_WhitePt, sizeof(XcmsColor));
+               if (!_XcmsDIConvertColors(ccc, &whitePt, (XcmsColor *)NULL, 1,
+                       XcmsCIEuvYFormat)) {
+                   return(XcmsFailure);
+               }
+               puvY_WhitePt = &whitePt;
+           }
+           /* Make sure it is a white point, i.e., Y == 1.0 */
+           if (puvY_WhitePt->spec.CIEuvY.Y != 1.0) {
+               return(XcmsFailure);
+           }
+           div = (6.0 * puvY_WhitePt->spec.CIEuvY.u_prime) -
+                   (16.0 * puvY_WhitePt->spec.CIEuvY.v_prime) + 12.0;
+           if (div == 0) {
+               /* internal error */
+               return(XcmsFailure);
+           }
+           x = 9.0 * puvY_WhitePt->spec.CIEuvY.u_prime / div;
+           y = 4.0 * puvY_WhitePt->spec.CIEuvY.v_prime / div;
+       } else {
+           x = 9.0 * pColor->spec.CIEuvY.u_prime / div;
+           y = 4.0 * pColor->spec.CIEuvY.v_prime / div;
+       }
+       z = 1.0 - x - y;
+
+       /* Convert from xyz to XYZ */
+       /* Conversion uses color normalized lightness based on Y */
+       if (y != 0.0) {
+           XYZ_return.X = x * Y / y;
+       } else {
+           XYZ_return.X = x;
+       }
+       XYZ_return.Y = Y;
+       if (y != 0.0) {
+           XYZ_return.Z = z * Y / y;
+       } else {
+           XYZ_return.Z = z;
+       }
+
+       memcpy((char *)&pColor->spec.CIEXYZ, (char *)&XYZ_return, sizeof(XcmsCIEXYZ));
+       /* Identify that format is now CIEXYZ */
+       pColor->format = XcmsCIEXYZFormat;
+    }
+
+    return(XcmsSuccess);
+}
+
+\f
+/*
+ *     NAME
+ *             XcmsCIEXYZToCIEuvY - convert CIEXYZ to CIEuvY
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsCIEXYZToCIEuvY(
+    XcmsCCC ccc,
+    XcmsColor *puvY_WhitePt,
+    XcmsColor *pColors_in_out,
+    unsigned int nColors)
+/*
+ *     DESCRIPTION
+ *             Converts color specifications in an array of XcmsColor
+ *             structures from CIEXYZ format to CIEuvY format.
+ *
+ *     RETURNS
+ *             XcmsFailure if failed,
+ *             XcmsSuccess if succeeded.
+ *
+ */
+{
+    XcmsCIEuvY uvY_return;
+    XcmsColor whitePt;
+    int i;
+    XcmsColor *pColor = pColors_in_out;
+    XcmsFloat div;
+
+    /*
+     * Check arguments
+     * Postpone checking puvY_WhitePt until it is actually needed
+     * otherwise converting between XYZ and uvY will fail.
+     */
+    if (pColors_in_out == NULL) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Now convert each XcmsColor structure to CIEuvY form
+     */
+    for (i = 0; i < nColors; i++, pColor++) {
+
+       /* Make sure original format is CIEXYZ */
+       if (!_XcmsCIEXYZ_ValidSpec(pColor)) {
+           return(XcmsFailure);
+       }
+
+       /* Convert to CIEuvY */
+       div = pColor->spec.CIEXYZ.X + (15.0 * pColor->spec.CIEXYZ.Y) +
+               (3.0 * pColor->spec.CIEXYZ.Z);
+       if (div == 0.0) {
+           /* Use white point since div == 0.0 */
+           if (puvY_WhitePt == NULL ) {
+               return(XcmsFailure);
+           }
+           /*
+            * Make sure white point is in CIEuvY form
+            */
+           if (puvY_WhitePt->format != XcmsCIEuvYFormat) {
+               /* Make copy of the white point because we're going to modify it */
+               memcpy((char *)&whitePt, (char *)puvY_WhitePt, sizeof(XcmsColor));
+               if (!_XcmsDIConvertColors(ccc, &whitePt, (XcmsColor *)NULL, 1,
+                       XcmsCIEuvYFormat)) {
+                   return(XcmsFailure);
+               }
+               puvY_WhitePt = &whitePt;
+           }
+           /* Make sure it is a white point, i.e., Y == 1.0 */
+           if (puvY_WhitePt->spec.CIEuvY.Y != 1.0) {
+               return(XcmsFailure);
+           }
+           uvY_return.Y = pColor->spec.CIEXYZ.Y;
+           uvY_return.u_prime = puvY_WhitePt->spec.CIEuvY.u_prime;
+           uvY_return.v_prime = puvY_WhitePt->spec.CIEuvY.v_prime;
+       } else {
+           uvY_return.u_prime = 4.0 * pColor->spec.CIEXYZ.X / div;
+           uvY_return.v_prime = 9.0 * pColor->spec.CIEXYZ.Y / div;
+           uvY_return.Y = pColor->spec.CIEXYZ.Y;
+       }
+
+       memcpy((char *)&pColor->spec.CIEuvY, (char *)&uvY_return, sizeof(XcmsCIEuvY));
+       /* Identify that format is now CIEuvY */
+       pColor->format = XcmsCIEuvYFormat;
+    }
+
+    return(XcmsSuccess);
+}
diff --git a/src/xcms/xyY.c b/src/xcms/xyY.c
new file mode 100644 (file)
index 0000000..6f94574
--- /dev/null
@@ -0,0 +1,395 @@
+
+/*
+ * Code and supporting documentation (c) Copyright 1990 1991 Tektronix, Inc.
+ *     All Rights Reserved
+ *
+ * This file is a component of an X Window System-specific implementation
+ * of Xcms based on the TekColor Color Management System.  Permission is
+ * hereby granted to use, copy, modify, sell, and otherwise distribute this
+ * software and its documentation for any purpose and without fee, provided
+ * that this copyright, permission, and disclaimer notice is reproduced in
+ * all copies of this software and in supporting documentation.  TekColor
+ * is a trademark of Tektronix, Inc.
+ *
+ * Tektronix makes no representation about the suitability of this software
+ * for any purpose.  It is provided "as is" and with all faults.
+ *
+ * TEKTRONIX DISCLAIMS ALL WARRANTIES APPLICABLE TO THIS SOFTWARE,
+ * INCLUDING THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL TEKTRONIX 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 THE PERFORMANCE OF THIS SOFTWARE.
+ *
+ *     NAME
+ *             CIExyY.c
+ *
+ *     DESCRIPTION
+ *             This file contains routines that support the CIE xyY
+ *             color space to include conversions to and from the CIE
+ *             XYZ space.
+ *
+ *     DOCUMENTATION
+ *             "TekColor Color Management System, System Implementor's Manual"
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include <X11/Xos.h>
+#include "Xlibint.h"
+#include "Xcmsint.h"
+#include "Cv.h"
+
+/*
+ *     DEFINES
+ */
+#define EPS 0.00001    /* some extremely small number */
+#ifdef DBL_EPSILON
+#  define XMY_DBL_EPSILON DBL_EPSILON
+#else
+#  define XMY_DBL_EPSILON 0.00001
+#endif
+
+/*
+ *     FORWARD DECLARATIONS
+ */
+
+static int CIExyY_ParseString(register char *spec, XcmsColor *pColor);
+static Status XcmsCIExyY_ValidSpec(XcmsColor *pColor);
+
+
+/*
+ *     LOCAL VARIABLES
+ */
+
+    /*
+     * NULL terminated list of functions applied to get from CIExyY to CIEXYZ
+     */
+static XcmsConversionProc Fl_CIExyY_to_CIEXYZ[] = {
+    XcmsCIExyYToCIEXYZ,
+    NULL
+};
+
+    /*
+     * NULL terminated list of functions applied to get from CIEXYZ to CIExyY
+     */
+static XcmsConversionProc Fl_CIEXYZ_to_CIExyY[] = {
+    XcmsCIEXYZToCIExyY,
+    NULL
+};
+
+
+/*
+ *     GLOBALS
+ */
+
+    /*
+     * CIE xyY Color Space
+     */
+XcmsColorSpace XcmsCIExyYColorSpace =
+    {
+       _XcmsCIExyY_prefix,     /* prefix */
+       XcmsCIExyYFormat,               /* id */
+       CIExyY_ParseString,     /* parseString */
+       Fl_CIExyY_to_CIEXYZ,    /* to_CIEXYZ */
+       Fl_CIEXYZ_to_CIExyY,    /* from_CIEXYZ */
+       1
+    };
+
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PRIVATE ROUTINES                               *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             CIExyY_ParseString
+ *
+ *     SYNOPSIS
+ */
+static int
+CIExyY_ParseString(
+    register char *spec,
+    XcmsColor *pColor)
+/*
+ *     DESCRIPTION
+ *             This routines takes a string and attempts to convert
+ *             it into a XcmsColor structure with XcmsCIExyYFormat.
+ *             The assumed CIExyY string syntax is:
+ *                 CIExyY:<x>/<y>/<Y>
+ *             Where x, y, and Y are in string input format for floats
+ *             consisting of:
+ *                 a. an optional sign
+ *                 b. a string of numbers possibly containing a decimal point,
+ *                 c. an optional exponent field containing an 'E' or 'e'
+ *                     followed by a possibly signed integer string.
+ *
+ *     RETURNS
+ *             0 if failed, non-zero otherwise.
+ */
+{
+    int n;
+    char *pchar;
+
+    if ((pchar = strchr(spec, ':')) == NULL) {
+       return(XcmsFailure);
+    }
+    n = (int)(pchar - spec);
+
+    /*
+     * Check for proper prefix.
+     */
+    if (strncmp(spec, _XcmsCIExyY_prefix, n) != 0) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Attempt to parse the value portion.
+     */
+    if (sscanf(spec + n + 1, "%lf/%lf/%lf",
+           &pColor->spec.CIExyY.x,
+           &pColor->spec.CIExyY.y,
+           &pColor->spec.CIExyY.Y) != 3) {
+        char *s; /* Maybe failed due to locale */
+        int f;
+        if ((s = strdup(spec))) {
+            for (f = 0; s[f]; ++f)
+                if (s[f] == '.')
+                    s[f] = ',';
+                else if (s[f] == ',')
+                    s[f] = '.';
+           if (sscanf(s + n + 1, "%lf/%lf/%lf",
+                      &pColor->spec.CIExyY.x,
+                      &pColor->spec.CIExyY.y,
+                      &pColor->spec.CIExyY.Y) != 3) {
+                free(s);
+                return(XcmsFailure);
+            }
+            free(s);
+        } else
+           return(XcmsFailure);
+    }
+    pColor->format = XcmsCIExyYFormat;
+    pColor->pixel = 0;
+    return(XcmsCIExyY_ValidSpec(pColor));
+}
+
+
+\f
+/************************************************************************
+ *                                                                     *
+ *                      PUBLIC ROUTINES                                *
+ *                                                                     *
+ ************************************************************************/
+
+/*
+ *     NAME
+ *             CIExyY_ValidSpec()
+ *
+ *     SYNOPSIS
+ */
+static Status
+XcmsCIExyY_ValidSpec(
+    XcmsColor *pColor)
+/*
+ *     DESCRIPTION
+ *             Checks a valid CIExyY color specification.
+ *
+ *     RETURNS
+ *             XcmsFailure if invalid.
+ *             XcmsSuccess if valid.
+ *
+ */
+{
+    if (pColor->format != XcmsCIExyYFormat
+           ||
+           (pColor->spec.CIExyY.x < 0.0 - XMY_DBL_EPSILON)
+           ||
+           (pColor->spec.CIExyY.x > 1.0 + XMY_DBL_EPSILON)
+           ||
+           (pColor->spec.CIExyY.y < 0.0 - XMY_DBL_EPSILON)
+           ||
+           (pColor->spec.CIExyY.y > 1.0 + XMY_DBL_EPSILON)
+           ||
+           (pColor->spec.CIExyY.Y < 0.0 - XMY_DBL_EPSILON)
+           ||
+           (pColor->spec.CIExyY.Y > 1.0 + XMY_DBL_EPSILON)) {
+       return(XcmsFailure);
+    }
+    return(XcmsSuccess);
+}
+
+\f
+/*
+ *     NAME
+ *             XcmsCIExyYToCIEXYZ - convert CIExyY to CIEXYZ
+ *
+ *     SYNOPSIS
+ */
+Status
+XcmsCIExyYToCIEXYZ(
+    XcmsCCC ccc,
+    XcmsColor *pxyY_WhitePt,
+    XcmsColor *pColors_in_out,
+    unsigned int nColors)
+/*
+ *     DESCRIPTION
+ *             Converts color specifications in an array of XcmsColor
+ *             structures from CIExyY format to CIEXYZ format.
+ *
+ *     RETURNS
+ *             XcmsFailure if failed,
+ *             XcmsSuccess if succeeded.
+ */
+{
+    XcmsColor  *pColor = pColors_in_out;
+    XcmsColor  whitePt;
+    XcmsCIEXYZ XYZ_return;
+    XcmsFloat  div;            /* temporary storage in case divisor is zero */
+    XcmsFloat  u, v, x, y, z;  /* temporary storage */
+    register int i;
+
+    /*
+     * Check arguments
+     */
+    if (pxyY_WhitePt == NULL || pColors_in_out == NULL) {
+       return(XcmsFailure);
+    }
+
+
+    /*
+     * Now convert each XcmsColor structure to CIEXYZ form
+     */
+    for (i = 0; i < nColors; i++, pColor++) {
+       /* Make sure original format is CIExyY and valid */
+       if (!XcmsCIExyY_ValidSpec(pColor)) {
+           return(XcmsFailure);
+       }
+
+       if ((div = (-2 * pColor->spec.CIExyY.x) + (12 * pColor->spec.CIExyY.y) + 3) == 0.0) {
+           /* Note that the divisor is zero */
+           /* This return is abitrary. */
+           XYZ_return.X = 0;
+           XYZ_return.Y = 0;
+           XYZ_return.Z = 0;
+       } else {
+           /*
+            * Make sure white point is in CIEXYZ form
+            */
+           if (pxyY_WhitePt->format != XcmsCIEXYZFormat) {
+               /* Make copy of the white point because we're going to modify it */
+               memcpy((char *)&whitePt, (char *)pxyY_WhitePt, sizeof(XcmsColor));
+               if (!_XcmsDIConvertColors(ccc, &whitePt, (XcmsColor *)NULL, 1,
+                       XcmsCIEXYZFormat)) {
+                   return(XcmsFailure);
+               }
+               pxyY_WhitePt = &whitePt;
+           }
+
+           /* Make sure it is a white point, i.e., Y == 1.0 */
+           if (pxyY_WhitePt->spec.CIEXYZ.Y != 1.0) {
+               return(XcmsFailure);
+           }
+
+           /* Convert from xyY to uvY to XYZ */
+           u = (4 * pColor->spec.CIExyY.x) / div;
+           v = (9 * pColor->spec.CIExyY.y) / div;
+           div = (6.0 * u) - (16.0 * v) + 12.0;
+           if (div == 0.0) {
+               /* Note that the divisor is zero */
+               /* This return is abitrary. */
+               if ((div = (6.0 * whitePt.spec.CIEuvY.u_prime) -
+                          (16.0 * whitePt.spec.CIEuvY.v_prime) + 12.0) == 0.0) {
+                   div = EPS;
+               }
+               x = 9.0 * whitePt.spec.CIEuvY.u_prime / div;
+               y = 4.0 * whitePt.spec.CIEuvY.u_prime / div;
+           } else {
+               /* convert u, v to small xyz */
+               x = 9.0 * u / div;
+               y = 4.0 * v / div;
+           }
+           z = 1.0 - x - y;
+           if (y == 0.0) y = EPS;      /* Have to worry about divide by 0 */
+           XYZ_return.Y = pColor->spec.CIExyY.Y;
+           XYZ_return.X = x * XYZ_return.Y / y;
+           XYZ_return.Z = z * XYZ_return.Y / y;
+       }
+
+       /* Copy result to pColor */
+       memcpy ((char *)&pColor->spec, (char *)&XYZ_return, sizeof(XcmsCIEXYZ));
+
+       /* Identify that the format is now CIEXYZ */
+       pColor->format = XcmsCIEXYZFormat;
+    }
+    return(XcmsSuccess);
+}
+
+\f
+/*
+ *     NAME
+ *             XcmsCIEXYZToCIExyY - convert CIEXYZ to CIExyY
+ *
+ *     SYNOPSIS
+ */
+/* ARGSUSED */
+Status
+XcmsCIEXYZToCIExyY(
+    XcmsCCC ccc,
+    XcmsColor *pxyY_WhitePt,
+    XcmsColor *pColors_in_out,
+    unsigned int nColors)
+/*
+ *     DESCRIPTION
+ *             Converts color specifications in an array of XcmsColor
+ *             structures from CIEXYZ format to CIExyY format.
+ *
+ *     RETURNS
+ *             XcmsFailure if failed,
+ *             XcmsSuccess if succeeded.
+ *
+ */
+{
+    XcmsColor  *pColor = pColors_in_out;
+    XcmsCIExyY xyY_return;
+    XcmsFloat  div;            /* temporary storage in case divisor is zero */
+    register int i;
+
+    /*
+     * Check arguments
+     *                 pxyY_WhitePt ignored
+     */
+    if (pColors_in_out == NULL) {
+       return(XcmsFailure);
+    }
+
+    /*
+     * Now convert each XcmsColor structure to CIEXYZ form
+     */
+    for (i = 0; i < nColors; i++, pColor++) {
+
+       if (!_XcmsCIEXYZ_ValidSpec(pColor)) {
+           return(XcmsFailure);
+       }
+       /* Now convert for XYZ to xyY */
+       if ((div = pColor->spec.CIEXYZ.X + pColor->spec.CIEXYZ.Y + pColor->spec.CIEXYZ.Z) == 0.0) {
+           div = EPS;
+       }
+       xyY_return.x = pColor->spec.CIEXYZ.X / div;
+       xyY_return.y = pColor->spec.CIEXYZ.Y / div;
+       xyY_return.Y = pColor->spec.CIEXYZ.Y;
+
+       /* Copy result to pColor */
+       memcpy ((char *)&pColor->spec, (char *)&xyY_return, sizeof(XcmsCIExyY));
+
+       /* Identify that the format is now CIEXYZ */
+       pColor->format = XcmsCIExyYFormat;
+    }
+    return(XcmsSuccess);
+}
diff --git a/src/xkb/Makefile.am b/src/xkb/Makefile.am
new file mode 100644 (file)
index 0000000..cde2afb
--- /dev/null
@@ -0,0 +1,52 @@
+AM_CPPFLAGS= \
+       -I$(top_srcdir)/include \
+       -I$(top_srcdir)/include/X11 \
+       -I$(top_builddir)/include \
+       -I$(top_builddir)/include/X11 \
+       -I$(top_srcdir)/src/xcms \
+       -I$(top_srcdir)/src/xkb \
+       -I$(top_srcdir)/src/xlibi18n \
+       -D_BSD_SOURCE
+
+AM_CFLAGS= \
+       $(X11_CFLAGS) \
+       $(BIGFONT_CFLAGS) \
+       $(XMALLOC_ZERO_CFLAGS) \
+       $(CWARNFLAGS)
+
+noinst_LTLIBRARIES = libxkb.la
+
+libxkb_la_SOURCES = \
+       XKB.c \
+       XKBBind.c \
+       XKBCompat.c \
+       XKBCtrls.c \
+       XKBCvt.c \
+       XKBGetMap.c \
+       XKBGetByName.c \
+       XKBNames.c \
+       XKBRdBuf.c \
+       XKBSetMap.c \
+       XKBUse.c \
+       XKBleds.c \
+       XKBBell.c \
+       XKBGeom.c \
+       XKBSetGeom.c \
+       XKBExtDev.c \
+       XKBList.c \
+       XKBMisc.c \
+       XKBMAlloc.c \
+       XKBGAlloc.c \
+       XKBAlloc.c \
+       XKBlibint.h
+
+if LINT
+# Check source code with tools like lint & sparse
+
+ALL_LINT_FLAGS=$(LINT_FLAGS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+               $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS)
+
+lint:
+       $(LINT) $(ALL_LINT_FLAGS) $(libxkb_la_SOURCES) -lm
+
+endif LINT
diff --git a/src/xkb/XKB.c b/src/xkb/XKB.c
new file mode 100644 (file)
index 0000000..f926cb9
--- /dev/null
@@ -0,0 +1,767 @@
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+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 Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS 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 <stdio.h>
+#include "Xlibint.h"
+#include <X11/extensions/XKBproto.h>
+#include "XKBlibint.h"
+
+XkbInternAtomFunc      _XkbInternAtomFunc= XInternAtom;
+XkbGetAtomNameFunc     _XkbGetAtomNameFunc= XGetAtomName;
+
+Bool
+XkbQueryExtension(     Display *dpy,
+                       int *   opcodeReturn,
+                       int *   eventBaseReturn,
+                       int *   errorBaseReturn,
+                       int *   majorReturn,
+                       int *   minorReturn)
+{
+    if (!XkbUseExtension(dpy,majorReturn,minorReturn))
+       return False;
+    if (opcodeReturn)
+       *opcodeReturn = dpy->xkb_info->codes->major_opcode;
+    if (eventBaseReturn)
+       *eventBaseReturn = dpy->xkb_info->codes->first_event;
+    if (errorBaseReturn)
+       *errorBaseReturn = dpy->xkb_info->codes->first_error;
+    if (majorReturn)
+       *majorReturn = dpy->xkb_info->srv_major;
+    if (minorReturn)
+       *minorReturn = dpy->xkb_info->srv_minor;
+    return True;
+}
+
+Bool
+XkbLibraryVersion(int *libMajorRtrn,int *libMinorRtrn)
+{
+int supported;
+
+    if (*libMajorRtrn != XkbMajorVersion) {
+       /* version 0.65 is (almost) compatible with 1.00 */
+       if ((XkbMajorVersion==1)&&(((*libMajorRtrn)==0)&&((*libMinorRtrn)==65)))
+            supported= True;
+       else supported= False;
+    }
+    else {
+       supported = True;
+    }
+
+    *libMajorRtrn = XkbMajorVersion;
+    *libMinorRtrn = XkbMinorVersion;
+    return supported;
+}
+
+Bool
+XkbSelectEvents(       Display *       dpy,
+                       unsigned int    deviceSpec,
+                       unsigned int    affect,
+                       unsigned int    selectAll)
+{
+    register xkbSelectEventsReq *req;
+    XkbInfoPtr xkbi;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return False;
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    xkbi->selected_events&= ~affect;
+    xkbi->selected_events|= (affect&selectAll);
+    GetReq(kbSelectEvents, req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbSelectEvents;
+    req->deviceSpec = deviceSpec;
+    req->affectWhich = (CARD16)affect;
+    req->clear = affect&(~selectAll);
+    req->selectAll = affect&selectAll;
+    if (affect&XkbMapNotifyMask) {
+       req->affectMap= XkbAllMapComponentsMask;
+       /* the implicit support needs the client info */
+       /* even if the client itself doesn't want it */
+       if (selectAll&XkbMapNotifyMask)
+            req->map= XkbAllMapEventsMask;
+       else req->map= XkbAllClientInfoMask;
+       if (selectAll&XkbMapNotifyMask)
+            xkbi->selected_map_details= XkbAllMapEventsMask;
+       else xkbi->selected_map_details= 0;
+    }
+    if (affect&XkbNewKeyboardNotifyMask) {
+       if (selectAll&XkbNewKeyboardNotifyMask)
+            xkbi->selected_nkn_details= XkbAllNewKeyboardEventsMask;
+       else xkbi->selected_nkn_details= 0;
+       if (!(xkbi->xlib_ctrls&XkbLC_IgnoreNewKeyboards)) {
+           /* we want it, even if the client doesn't.  Don't mess */
+           /* around with details -- ask for all of them and throw */
+           /* away the ones we don't need */
+           req->selectAll|= XkbNewKeyboardNotifyMask;
+       }
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return True;
+}
+
+Bool
+XkbSelectEventDetails( Display *               dpy,
+                       unsigned                deviceSpec,
+                       unsigned                eventType,
+                       unsigned long int       affect,
+                       unsigned long int       details)
+{
+    register xkbSelectEventsReq *req;
+    XkbInfoPtr xkbi;
+    int             size = 0;
+    char     *out;
+    union {
+       CARD8   *c8;
+       CARD16  *c16;
+       CARD32  *c32;
+    } u;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return False;
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    if (affect&details)        xkbi->selected_events|= (1<<eventType);
+    else               xkbi->selected_events&= ~(1<<eventType);
+    GetReq(kbSelectEvents, req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbSelectEvents;
+    req->deviceSpec = deviceSpec;
+    req->clear= req->selectAll= 0;
+    if (eventType==XkbMapNotify) {
+       /* we need all of the client info, even if the application */
+       /* doesn't.   Make sure that we always request the stuff */
+       /* that the implicit support needs, and just filter out anything */
+       /* the client doesn't want later */
+       req->affectWhich = 0;
+       req->selectAll = 0;
+       req->clear = 0;
+       req->affectMap = (CARD16)affect;
+       req->map = (CARD16)details|(XkbAllClientInfoMask&affect);
+       req->affectWhich = XkbMapNotifyMask;
+       xkbi->selected_map_details&= ~affect;
+       xkbi->selected_map_details|=  (details&affect);
+    }
+    else {
+       req->affectMap = req->map = 0;
+       req->affectWhich= (1<<eventType);
+       switch (eventType) {
+           case XkbNewKeyboardNotify:
+               xkbi->selected_nkn_details&= ~affect;
+               xkbi->selected_nkn_details|= (details&affect);
+               if (!(xkbi->xlib_ctrls&XkbLC_IgnoreNewKeyboards))
+                   details= (affect&XkbAllNewKeyboardEventsMask);
+           case XkbStateNotify:
+           case XkbNamesNotify:
+           case XkbAccessXNotify:
+           case XkbExtensionDeviceNotify:
+               size= 2;
+               req->length+= 1;
+               break;
+           case XkbControlsNotify:
+           case XkbIndicatorStateNotify:
+           case XkbIndicatorMapNotify:
+               size= 4;
+               req->length+= 2;
+               break;
+           case XkbBellNotify:
+           case XkbActionMessage:
+           case XkbCompatMapNotify:
+               size= 1;
+               req->length+= 1;
+               break;
+       }
+       BufAlloc(char *,out,(((size*2)+(unsigned)3)/4)*4);
+       u.c8= (CARD8 *)out;
+       if (size==2) {
+           u.c16[0]= (CARD16)affect;
+           u.c16[1]= (CARD16)details;
+       }
+       else if (size==4) {
+           u.c32[0]= (CARD32)affect;
+           u.c32[1]= (CARD32)details;
+       }
+       else {
+           u.c8[0]= (CARD8)affect;
+           u.c8[1]= (CARD8)details;
+       }
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return True;
+}
+
+Bool
+XkbLockModifiers(      Display *       dpy,
+                       unsigned int    deviceSpec,
+                       unsigned int    affect,
+                       unsigned int    values)
+{
+    register xkbLatchLockStateReq *req;
+    XkbInfoPtr xkbi;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return False;
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    GetReq(kbLatchLockState, req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbLatchLockState;
+    req->deviceSpec = deviceSpec;
+    req->affectModLocks= affect;
+    req->modLocks = values;
+    req->lockGroup = False;
+    req->groupLock = 0;
+
+    req->affectModLatches = req->modLatches = 0;
+    req->latchGroup = False;
+    req->groupLatch = 0;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return True;
+}
+
+Bool
+XkbLatchModifiers(     Display *       dpy,
+                       unsigned int    deviceSpec,
+                       unsigned int    affect,
+                       unsigned int    values)
+{
+    register xkbLatchLockStateReq *req;
+    XkbInfoPtr xkbi;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return False;
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    GetReq(kbLatchLockState, req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbLatchLockState;
+    req->deviceSpec = deviceSpec;
+
+    req->affectModLatches= affect;
+    req->modLatches = values;
+    req->latchGroup = False;
+    req->groupLatch = 0;
+
+    req->affectModLocks = req->modLocks = 0;
+    req->lockGroup = False;
+    req->groupLock = 0;
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return True;
+}
+
+Bool
+XkbLockGroup(Display *dpy,unsigned int deviceSpec,unsigned int group)
+{
+    register xkbLatchLockStateReq *req;
+    XkbInfoPtr xkbi;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return False;
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    GetReq(kbLatchLockState, req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbLatchLockState;
+    req->deviceSpec = deviceSpec;
+    req->affectModLocks= 0;
+    req->modLocks = 0;
+    req->lockGroup = True;
+    req->groupLock = group;
+
+    req->affectModLatches = req->modLatches = 0;
+    req->latchGroup = False;
+    req->groupLatch = 0;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return True;
+}
+
+Bool
+XkbLatchGroup(Display *dpy,unsigned int deviceSpec,unsigned int group)
+{
+    register xkbLatchLockStateReq *req;
+    XkbInfoPtr xkbi;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return False;
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    GetReq(kbLatchLockState, req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbLatchLockState;
+    req->deviceSpec = deviceSpec;
+
+    req->affectModLatches= 0;
+    req->modLatches = 0;
+    req->latchGroup = True;
+    req->groupLatch = group;
+
+    req->affectModLocks = req->modLocks = 0;
+    req->lockGroup = False;
+    req->groupLock = 0;
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return True;
+}
+
+unsigned
+XkbSetXlibControls(Display *dpy,unsigned affect,unsigned values)
+{
+    if (!dpy->xkb_info)
+       XkbUseExtension(dpy,NULL,NULL);
+    if (!dpy->xkb_info)
+       return 0;
+    affect&= XkbLC_AllControls;
+    dpy->xkb_info->xlib_ctrls&= ~affect;
+    dpy->xkb_info->xlib_ctrls|= (affect&values);
+    return dpy->xkb_info->xlib_ctrls;
+}
+
+unsigned
+XkbGetXlibControls(Display *dpy)
+{
+    if (!dpy->xkb_info)
+       XkbUseExtension(dpy,NULL,NULL);
+    if (!dpy->xkb_info)
+       return 0;
+    return dpy->xkb_info->xlib_ctrls;
+}
+
+unsigned int
+XkbXlibControlsImplemented(void)
+{
+#ifdef __sgi
+    return XkbLC_AllControls;
+#else
+    return XkbLC_AllControls&~XkbLC_AllComposeControls;
+#endif
+}
+
+Bool
+XkbSetDebuggingFlags(  Display *       dpy,
+                       unsigned int    mask,
+                       unsigned int    flags,
+                       char *          msg,
+                       unsigned int    ctrls_mask,
+                       unsigned int    ctrls,
+                       unsigned int *  rtrn_flags,
+                       unsigned int *  rtrn_ctrls)
+{
+    register xkbSetDebuggingFlagsReq *req;
+    xkbSetDebuggingFlagsReply rep;
+    XkbInfoPtr xkbi;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return False;
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    GetReq(kbSetDebuggingFlags, req);
+    req->reqType=      xkbi->codes->major_opcode;
+    req->xkbReqType=   X_kbSetDebuggingFlags;
+    req->affectFlags=  mask;
+    req->flags=        flags;
+    req->affectCtrls=  ctrls_mask;
+    req->ctrls=        ctrls;
+
+    if (msg) {
+       char *out;
+       req->msgLength= (unsigned short)strlen(msg)+1;
+       req->length+= (req->msgLength+(unsigned)3)>>2;
+       BufAlloc(char *,out,((req->msgLength+(unsigned)3)/4)*4);
+       memcpy(out,msg,req->msgLength);
+    }
+    else req->msgLength= 0;
+    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return False;
+    }
+    if (rtrn_flags)
+       *rtrn_flags= rep.currentFlags;
+    if (rtrn_ctrls)
+       *rtrn_ctrls= rep.currentCtrls;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return True;
+}
+
+Bool
+XkbComputeEffectiveMap(        XkbDescPtr      xkb,
+                       XkbKeyTypePtr   type,
+                       unsigned char * map_rtrn)
+{
+register int           i;
+unsigned               tmp;
+XkbKTMapEntryPtr       entry = NULL;
+
+    if ((!xkb)||(!type)||(!xkb->server))
+       return False;
+
+    if (type->mods.vmods!=0) {
+       if (!XkbVirtualModsToReal(xkb,type->mods.vmods,&tmp))
+           return False;
+
+       type->mods.mask= tmp|type->mods.real_mods;
+       entry= type->map;
+       for (i=0;i<type->map_count;i++,entry++) {
+           tmp= 0;
+           if (entry->mods.vmods!=0) {
+               if (!XkbVirtualModsToReal(xkb,entry->mods.vmods,&tmp))
+                   return False;
+               if (tmp==0) {
+                   entry->active= False;
+                   continue;
+               }
+           }
+           entry->active= True;
+           entry->mods.mask= (entry->mods.real_mods|tmp)&type->mods.mask;
+       }
+    }
+    else {
+       type->mods.mask= type->mods.real_mods;
+    }
+    if (map_rtrn!=NULL) {
+       bzero(map_rtrn,type->mods.mask+1);
+       for (i=0;i<type->map_count;i++) {
+           if (entry && entry->active) {
+               map_rtrn[type->map[i].mods.mask]= type->map[i].level;
+           }
+       }
+    }
+    return True;
+}
+
+Status
+XkbGetState(Display *dpy,unsigned deviceSpec,XkbStatePtr rtrn)
+{
+    register xkbGetStateReq    *req;
+    xkbGetStateReply rep;
+    XkbInfoPtr xkbi;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return BadAccess;
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    GetReq(kbGetState, req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbGetState;
+    req->deviceSpec = deviceSpec;
+    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return BadImplementation;
+    }
+    rtrn->mods=                rep.mods;
+    rtrn->base_mods=           rep.baseMods;
+    rtrn->latched_mods=        rep.latchedMods;
+    rtrn->locked_mods=                 rep.lockedMods;
+    rtrn->group=               rep.group;
+    rtrn->base_group=          rep.baseGroup;
+    rtrn->latched_group=       rep.latchedGroup;
+    rtrn->locked_group=        rep.lockedGroup;
+    rtrn->compat_state=        rep.compatState;
+    rtrn->grab_mods=           rep.grabMods;
+    rtrn->compat_grab_mods=    rep.compatGrabMods;
+    rtrn->lookup_mods=         rep.lookupMods;
+    rtrn->compat_lookup_mods=  rep.compatLookupMods;
+    rtrn->ptr_buttons=         rep.ptrBtnState;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return Success;
+}
+
+Bool
+XkbSetDetectableAutoRepeat(Display *dpy,Bool detectable,Bool *supported)
+{
+register xkbPerClientFlagsReq *        req;
+xkbPerClientFlagsReply                 rep;
+XkbInfoPtr                     xkbi;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return False;
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    GetReq(kbPerClientFlags, req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbPerClientFlags;
+    req->deviceSpec = XkbUseCoreKbd;
+    req->change = XkbPCF_DetectableAutoRepeatMask;
+    if (detectable)
+        req->value = XkbPCF_DetectableAutoRepeatMask;
+    else req->value = 0;
+    req->ctrlsToChange = req->autoCtrls= req->autoCtrlValues= 0;
+    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return False;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    if (supported!=NULL)
+       *supported= ((rep.supported&XkbPCF_DetectableAutoRepeatMask)!=0);
+    return ((rep.value&XkbPCF_DetectableAutoRepeatMask)!=0);
+}
+
+Bool
+XkbGetDetectableAutoRepeat(Display *dpy,Bool *supported)
+{
+register xkbPerClientFlagsReq *        req;
+xkbPerClientFlagsReply                 rep;
+XkbInfoPtr                     xkbi;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return False;
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    GetReq(kbPerClientFlags, req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbPerClientFlags;
+    req->deviceSpec = XkbUseCoreKbd;
+    req->change = 0;
+    req->value = 0;
+    req->ctrlsToChange = req->autoCtrls= req->autoCtrlValues= 0;
+    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return False;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    if (supported!=NULL)
+       *supported= ((rep.supported&XkbPCF_DetectableAutoRepeatMask)!=0);
+    return ((rep.value&XkbPCF_DetectableAutoRepeatMask)!=0);
+}
+
+Bool
+XkbSetAutoResetControls(       Display *       dpy,
+                               unsigned        changes,
+                               unsigned *      auto_ctrls,
+                               unsigned *      auto_values)
+{
+register xkbPerClientFlagsReq *        req;
+xkbPerClientFlagsReply                 rep;
+XkbInfoPtr                     xkbi;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return False;
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    GetReq(kbPerClientFlags, req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbPerClientFlags;
+    req->change = XkbPCF_AutoResetControlsMask;
+    req->deviceSpec = XkbUseCoreKbd;
+    req->value = XkbPCF_AutoResetControlsMask;
+    req->ctrlsToChange= changes;
+    req->autoCtrls= *auto_ctrls;
+    req->autoCtrlValues= *auto_values;
+    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return False;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    *auto_ctrls= rep.autoCtrls;
+    *auto_values= rep.autoCtrlValues;
+    return ((rep.value&XkbPCF_AutoResetControlsMask)!=0);
+}
+
+Bool
+XkbGetAutoResetControls(       Display *       dpy,
+                               unsigned *      auto_ctrls,
+                               unsigned *      auto_ctrl_values)
+{
+register xkbPerClientFlagsReq *        req;
+xkbPerClientFlagsReply                 rep;
+XkbInfoPtr                     xkbi;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return False;
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    GetReq(kbPerClientFlags, req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbPerClientFlags;
+    req->deviceSpec = XkbUseCoreKbd;
+    req->change = 0;
+    req->value = 0;
+    req->ctrlsToChange = req->autoCtrls= req->autoCtrlValues= 0;
+    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return False;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    if (auto_ctrls)
+       *auto_ctrls= rep.autoCtrls;
+    if (auto_ctrl_values)
+       *auto_ctrl_values= rep.autoCtrlValues;
+    return ((rep.value&XkbPCF_AutoResetControlsMask)!=0);
+}
+
+Bool
+XkbSetPerClientControls(       Display *       dpy,
+                               unsigned        change,
+                               unsigned *      values)
+{
+register xkbPerClientFlagsReq *        req;
+xkbPerClientFlagsReply                 rep;
+XkbInfoPtr                     xkbi;
+unsigned                       value_hold = *values;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)) ||
+       (change & ~(XkbPCF_GrabsUseXKBStateMask|XkbPCF_LookupStateWhenGrabbed|XkbPCF_SendEventUsesXKBState)))
+       return False;
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    GetReq(kbPerClientFlags, req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbPerClientFlags;
+    req->change = change;
+    req->deviceSpec = XkbUseCoreKbd;
+    req->value = *values;
+    req->ctrlsToChange = req->autoCtrls = req->autoCtrlValues= 0;
+    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return False;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    *values = rep.value;
+    return ((rep.value&value_hold)!=0);
+}
+
+Bool
+XkbGetPerClientControls(       Display *       dpy,
+                               unsigned *      ctrls)
+{
+register xkbPerClientFlagsReq *        req;
+xkbPerClientFlagsReply                 rep;
+XkbInfoPtr                     xkbi;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)) ||
+       (*ctrls & ~(XkbPCF_GrabsUseXKBStateMask|XkbPCF_LookupStateWhenGrabbed|XkbPCF_SendEventUsesXKBState)))
+       return False;
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    GetReq(kbPerClientFlags, req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbPerClientFlags;
+    req->deviceSpec = XkbUseCoreKbd;
+    req->change = 0;
+    req->value = 0;
+    req->ctrlsToChange = req->autoCtrls= req->autoCtrlValues= 0;
+    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return False;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    if (ctrls)
+       *ctrls= (rep.value & (XkbPCF_GrabsUseXKBStateMask |
+                XkbPCF_LookupStateWhenGrabbed |
+                XkbPCF_SendEventUsesXKBState));
+    return (True);
+}
+
+Display *
+XkbOpenDisplay(        char *  name,
+               int *   ev_rtrn,
+               int *   err_rtrn,
+               int *   major_rtrn,
+               int *   minor_rtrn,
+               int *   reason)
+{
+    Display* dpy;
+    int         major_num,minor_num;
+
+    if ((major_rtrn!=NULL) && (minor_rtrn!=NULL)) {
+       if (!XkbLibraryVersion(major_rtrn,minor_rtrn)) {
+           if (reason!=NULL)
+               *reason= XkbOD_BadLibraryVersion;
+           return NULL;
+       }
+    }
+    else {
+       major_num= XkbMajorVersion;
+       minor_num= XkbMinorVersion;
+       major_rtrn= &major_num;
+       minor_rtrn= &minor_num;
+    }
+    dpy= XOpenDisplay(name);
+    if (dpy==NULL) {
+       if (reason!=NULL)
+           *reason= XkbOD_ConnectionRefused;
+       return NULL;
+    }
+    if (!XkbQueryExtension(dpy,NULL,ev_rtrn,err_rtrn,major_rtrn,minor_rtrn)) {
+       if (reason!=NULL) {
+           if ((*major_rtrn!=0)||(*minor_rtrn!=0))
+                *reason= XkbOD_BadServerVersion;
+           else *reason= XkbOD_NonXkbServer;
+       }
+       XCloseDisplay(dpy);
+       return NULL;
+    }
+    if (reason!=NULL)
+       *reason= XkbOD_Success;
+    return dpy;
+}
+
+void
+XkbSetAtomFuncs(XkbInternAtomFunc getAtom,XkbGetAtomNameFunc getName)
+{
+    _XkbInternAtomFunc= (getAtom?getAtom:XInternAtom);
+    _XkbGetAtomNameFunc= (getName?getName:XGetAtomName);
+    return;
+}
diff --git a/src/xkb/XKBAlloc.c b/src/xkb/XKBAlloc.c
new file mode 100644 (file)
index 0000000..05e9f73
--- /dev/null
@@ -0,0 +1,498 @@
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+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 Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS 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_DIX_CONFIG_H
+#include <dix-config.h>
+#elif defined(HAVE_CONFIG_H)
+#include <config.h>
+#endif
+
+#ifndef XKB_IN_SERVER
+
+#include <stdio.h>
+#include "Xlibint.h"
+#include "XKBlibint.h"
+#include <X11/extensions/XKBgeom.h>
+#include <X11/extensions/XKBproto.h>
+#include "XKBlibint.h"
+
+#else
+
+#include <stdio.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include "misc.h"
+#include "inputstr.h"
+#include <X11/extensions/XKBsrv.h>
+#include <X11/extensions/XKBgeom.h>
+
+#endif /* XKB_IN_SERVER */
+
+/***===================================================================***/
+
+/*ARGSUSED*/
+Status
+XkbAllocCompatMap(XkbDescPtr xkb,unsigned which,unsigned nSI)
+{
+XkbCompatMapPtr        compat;
+XkbSymInterpretRec *prev_interpret;
+
+    if (!xkb)
+       return BadMatch;
+    if (xkb->compat) {
+       if (xkb->compat->size_si>=nSI)
+           return Success;
+       compat= xkb->compat;
+       compat->size_si= nSI;
+       if (compat->sym_interpret==NULL)
+           compat->num_si= 0;
+       prev_interpret = compat->sym_interpret;
+       compat->sym_interpret= _XkbTypedRealloc(compat->sym_interpret,
+                                                    nSI,XkbSymInterpretRec);
+       if (compat->sym_interpret==NULL) {
+           _XkbFree(prev_interpret);
+           compat->size_si= compat->num_si= 0;
+           return BadAlloc;
+       }
+       if (compat->num_si!=0) {
+           _XkbClearElems(compat->sym_interpret,compat->num_si,
+                                       compat->size_si-1,XkbSymInterpretRec);
+       }
+       return Success;
+    }
+    compat= _XkbTypedCalloc(1,XkbCompatMapRec);
+    if (compat==NULL)
+       return BadAlloc;
+    if (nSI>0) {
+       compat->sym_interpret= _XkbTypedCalloc(nSI,XkbSymInterpretRec);
+       if (!compat->sym_interpret) {
+           _XkbFree(compat);
+           return BadAlloc;
+       }
+    }
+    compat->size_si= nSI;
+    compat->num_si= 0;
+    bzero((char *)&compat->groups[0],XkbNumKbdGroups*sizeof(XkbModsRec));
+    xkb->compat= compat;
+    return Success;
+}
+
+
+void
+XkbFreeCompatMap(XkbDescPtr xkb,unsigned which,Bool freeMap)
+{
+register XkbCompatMapPtr compat;
+
+    if ((xkb==NULL)||(xkb->compat==NULL))
+       return;
+    compat= xkb->compat;
+    if (freeMap)
+       which= XkbAllCompatMask;
+    if (which&XkbGroupCompatMask)
+       bzero((char *)&compat->groups[0],XkbNumKbdGroups*sizeof(XkbModsRec));
+    if (which&XkbSymInterpMask) {
+       if ((compat->sym_interpret)&&(compat->size_si>0))
+           _XkbFree(compat->sym_interpret);
+       compat->size_si= compat->num_si= 0;
+       compat->sym_interpret= NULL;
+    }
+    if (freeMap) {
+       _XkbFree(compat);
+       xkb->compat= NULL;
+    }
+    return;
+}
+
+/***===================================================================***/
+
+Status
+XkbAllocNames(XkbDescPtr xkb,unsigned which,int nTotalRG,int nTotalAliases)
+{
+XkbNamesPtr    names;
+
+    if (xkb==NULL)
+       return BadMatch;
+    if (xkb->names==NULL) {
+       xkb->names = _XkbTypedCalloc(1,XkbNamesRec);
+       if (xkb->names==NULL)
+           return BadAlloc;
+    }
+    names= xkb->names;
+    if ((which&XkbKTLevelNamesMask)&&(xkb->map!=NULL)&&(xkb->map->types!=NULL)){
+       register int    i;
+       XkbKeyTypePtr   type;
+
+       type= xkb->map->types;
+       for (i=0;i<xkb->map->num_types;i++,type++) {
+           if (type->level_names==NULL) {
+               type->level_names= _XkbTypedCalloc(type->num_levels,Atom);
+               if (type->level_names==NULL)
+                   return BadAlloc;
+           }
+       }
+    }
+    if ((which&XkbKeyNamesMask)&&(names->keys==NULL)) {
+       if ((!XkbIsLegalKeycode(xkb->min_key_code))||
+           (!XkbIsLegalKeycode(xkb->max_key_code))||
+           (xkb->max_key_code<xkb->min_key_code))
+           return BadValue;
+       names->keys= _XkbTypedCalloc((xkb->max_key_code+1),XkbKeyNameRec);
+       if (names->keys==NULL)
+           return BadAlloc;
+    }
+    if ((which&XkbKeyAliasesMask)&&(nTotalAliases>0)) {
+       if (names->key_aliases==NULL) {
+           names->key_aliases= _XkbTypedCalloc(nTotalAliases,XkbKeyAliasRec);
+       }
+       else if (nTotalAliases>names->num_key_aliases) {
+           XkbKeyAliasRec *prev_aliases = names->key_aliases;
+
+           names->key_aliases= _XkbTypedRealloc(names->key_aliases,
+                                               nTotalAliases,XkbKeyAliasRec);
+           if (names->key_aliases!=NULL) {
+               _XkbClearElems(names->key_aliases,names->num_key_aliases,
+                                               nTotalAliases-1,XkbKeyAliasRec);
+           } else {
+               _XkbFree(prev_aliases);
+           }
+       }
+       if (names->key_aliases==NULL) {
+           names->num_key_aliases= 0;
+           return BadAlloc;
+       }
+       names->num_key_aliases= nTotalAliases;
+    }
+    if ((which&XkbRGNamesMask)&&(nTotalRG>0)) {
+       if (names->radio_groups==NULL) {
+           names->radio_groups= _XkbTypedCalloc(nTotalRG,Atom);
+       }
+       else if (nTotalRG>names->num_rg) {
+           Atom *prev_radio_groups = names->radio_groups;
+
+           names->radio_groups= _XkbTypedRealloc(names->radio_groups,nTotalRG,
+                                                                       Atom);
+           if (names->radio_groups!=NULL) {
+               _XkbClearElems(names->radio_groups,names->num_rg,nTotalRG-1,
+                                                                       Atom);
+           } else {
+               _XkbFree(prev_radio_groups);
+           }
+       }
+       if (names->radio_groups==NULL)
+           return BadAlloc;
+       names->num_rg= nTotalRG;
+    }
+    return Success;
+}
+
+void
+XkbFreeNames(XkbDescPtr xkb,unsigned which,Bool freeMap)
+{
+XkbNamesPtr    names;
+
+    if ((xkb==NULL)||(xkb->names==NULL))
+       return;
+    names= xkb->names;
+    if (freeMap)
+       which= XkbAllNamesMask;
+    if (which&XkbKTLevelNamesMask) {
+       XkbClientMapPtr map= xkb->map;
+       if ((map!=NULL)&&(map->types!=NULL)) {
+           register int                i;
+           register XkbKeyTypePtr      type;
+           type= map->types;
+           for (i=0;i<map->num_types;i++,type++) {
+               if (type->level_names!=NULL) {
+                   _XkbFree(type->level_names);
+                   type->level_names= NULL;
+               }
+           }
+       }
+    }
+    if ((which&XkbKeyNamesMask)&&(names->keys!=NULL)) {
+       _XkbFree(names->keys);
+       names->keys= NULL;
+       names->num_keys= 0;
+    }
+    if ((which&XkbKeyAliasesMask)&&(names->key_aliases)){
+       _XkbFree(names->key_aliases);
+       names->key_aliases=NULL;
+       names->num_key_aliases=0;
+    }
+    if ((which&XkbRGNamesMask)&&(names->radio_groups)) {
+       _XkbFree(names->radio_groups);
+       names->radio_groups= NULL;
+       names->num_rg= 0;
+    }
+    if (freeMap) {
+       _XkbFree(names);
+       xkb->names= NULL;
+    }
+    return;
+}
+
+/***===================================================================***/
+
+/*ARGSUSED*/
+Status
+XkbAllocControls(XkbDescPtr xkb,unsigned which)
+{
+    if (xkb==NULL)
+       return BadMatch;
+
+    if (xkb->ctrls==NULL) {
+       xkb->ctrls= _XkbTypedCalloc(1,XkbControlsRec);
+       if (!xkb->ctrls)
+           return BadAlloc;
+    }
+    return Success;
+}
+
+/*ARGSUSED*/
+void
+XkbFreeControls(XkbDescPtr xkb,unsigned which,Bool freeMap)
+{
+    if (freeMap && (xkb!=NULL) && (xkb->ctrls!=NULL)) {
+       _XkbFree(xkb->ctrls);
+       xkb->ctrls= NULL;
+    }
+    return;
+}
+
+/***===================================================================***/
+
+Status
+XkbAllocIndicatorMaps(XkbDescPtr xkb)
+{
+    if (xkb==NULL)
+       return BadMatch;
+    if (xkb->indicators==NULL) {
+       xkb->indicators= _XkbTypedCalloc(1,XkbIndicatorRec);
+       if (!xkb->indicators)
+           return BadAlloc;
+    }
+    return Success;
+}
+
+void
+XkbFreeIndicatorMaps(XkbDescPtr xkb)
+{
+    if ((xkb!=NULL)&&(xkb->indicators!=NULL)) {
+       _XkbFree(xkb->indicators);
+       xkb->indicators= NULL;
+    }
+    return;
+}
+
+/***====================================================================***/
+
+XkbDescRec     *
+XkbAllocKeyboard(void)
+{
+XkbDescRec *xkb;
+
+    xkb = _XkbTypedCalloc(1,XkbDescRec);
+    if (xkb)
+       xkb->device_spec= XkbUseCoreKbd;
+    return xkb;
+}
+
+void
+XkbFreeKeyboard(XkbDescPtr xkb,unsigned which,Bool freeAll)
+{
+    if (xkb==NULL)
+       return;
+    if (freeAll)
+       which= XkbAllComponentsMask;
+    if (which&XkbClientMapMask)
+       XkbFreeClientMap(xkb,XkbAllClientInfoMask,True);
+    if (which&XkbServerMapMask)
+       XkbFreeServerMap(xkb,XkbAllServerInfoMask,True);
+    if (which&XkbCompatMapMask)
+       XkbFreeCompatMap(xkb,XkbAllCompatMask,True);
+    if (which&XkbIndicatorMapMask)
+       XkbFreeIndicatorMaps(xkb);
+    if (which&XkbNamesMask)
+       XkbFreeNames(xkb,XkbAllNamesMask,True);
+    if ((which&XkbGeometryMask) && (xkb->geom!=NULL))
+       XkbFreeGeometry(xkb->geom,XkbGeomAllMask,True);
+    if (which&XkbControlsMask)
+       XkbFreeControls(xkb,XkbAllControlsMask,True);
+    if (freeAll)
+       _XkbFree(xkb);
+    return;
+}
+
+/***====================================================================***/
+
+XkbDeviceLedInfoPtr
+XkbAddDeviceLedInfo(XkbDeviceInfoPtr devi,unsigned ledClass,unsigned ledId)
+{
+XkbDeviceLedInfoPtr    devli;
+register int           i;
+
+    if ((!devi)||(!XkbSingleXIClass(ledClass))||(!XkbSingleXIId(ledId)))
+       return NULL;
+    for (i=0,devli=devi->leds;i<devi->num_leds;i++,devli++) {
+       if ((devli->led_class==ledClass)&&(devli->led_id==ledId))
+           return devli;
+    }
+    if (devi->num_leds>=devi->sz_leds) {
+       XkbDeviceLedInfoRec *prev_leds = devi->leds;
+
+       if (devi->sz_leds>0)    devi->sz_leds*= 2;
+       else                    devi->sz_leds= 1;
+       devi->leds= _XkbTypedRealloc(devi->leds,devi->sz_leds,
+                                                       XkbDeviceLedInfoRec);
+       if (!devi->leds) {
+           _XkbFree(prev_leds);
+           devi->sz_leds= devi->num_leds= 0;
+           return NULL;
+       }
+       i= devi->num_leds;
+       for (devli=&devi->leds[i];i<devi->sz_leds;i++,devli++) {
+           bzero(devli,sizeof(XkbDeviceLedInfoRec));
+           devli->led_class= XkbXINone;
+           devli->led_id= XkbXINone;
+       }
+    }
+    devli= &devi->leds[devi->num_leds++];
+    bzero(devli,sizeof(XkbDeviceLedInfoRec));
+    devli->led_class= ledClass;
+    devli->led_id= ledId;
+    return devli;
+}
+
+Status
+XkbResizeDeviceButtonActions(XkbDeviceInfoPtr devi,unsigned newTotal)
+{
+    XkbAction *prev_btn_acts;
+
+    if ((!devi)||(newTotal>255))
+       return BadValue;
+    if ((devi->btn_acts!=NULL)&&(newTotal==devi->num_btns))
+       return Success;
+    if (newTotal==0) {
+       if (devi->btn_acts!=NULL) {
+           _XkbFree(devi->btn_acts);
+           devi->btn_acts= NULL;
+       }
+       devi->num_btns= 0;
+       return Success;
+    }
+    prev_btn_acts = devi->btn_acts;
+    devi->btn_acts= _XkbTypedRealloc(devi->btn_acts,newTotal,XkbAction);
+    if (devi->btn_acts==NULL) {
+       _XkbFree(prev_btn_acts);
+       devi->num_btns= 0;
+       return BadAlloc;
+    }
+    if (newTotal>devi->num_btns) {
+       XkbAction *act;
+       act= &devi->btn_acts[devi->num_btns];
+       bzero((char *)act,(newTotal-devi->num_btns)*sizeof(XkbAction));
+    }
+    devi->num_btns= newTotal;
+    return Success;
+}
+
+/*ARGSUSED*/
+XkbDeviceInfoPtr
+XkbAllocDeviceInfo(unsigned deviceSpec,unsigned nButtons,unsigned szLeds)
+{
+XkbDeviceInfoPtr       devi;
+
+    devi= _XkbTypedCalloc(1,XkbDeviceInfoRec);
+    if (devi!=NULL) {
+       devi->device_spec= deviceSpec;
+       devi->has_own_state= False;
+       devi->num_btns= 0;
+       devi->btn_acts= NULL;
+       if (nButtons>0) {
+           devi->num_btns= nButtons;
+           devi->btn_acts= _XkbTypedCalloc(nButtons,XkbAction);
+           if (!devi->btn_acts) {
+               _XkbFree(devi);
+               return NULL;
+           }
+       }
+       devi->dflt_kbd_fb= XkbXINone;
+       devi->dflt_led_fb= XkbXINone;
+       devi->num_leds= 0;
+       devi->sz_leds= 0;
+       devi->leds= NULL;
+       if (szLeds>0) {
+           devi->sz_leds= szLeds;
+           devi->leds= _XkbTypedCalloc(szLeds,XkbDeviceLedInfoRec);
+           if (!devi->leds) {
+               if (devi->btn_acts)
+                   _XkbFree(devi->btn_acts);
+               _XkbFree(devi);
+               return NULL;
+           }
+       }
+    }
+    return devi;
+}
+
+
+void
+XkbFreeDeviceInfo(XkbDeviceInfoPtr devi,unsigned which,Bool freeDevI)
+{
+    if (devi) {
+       if (freeDevI) {
+           which= XkbXI_AllDeviceFeaturesMask;
+           if (devi->name) {
+               _XkbFree(devi->name);
+               devi->name= NULL;
+           }
+       }
+       if ((which&XkbXI_ButtonActionsMask)&&(devi->btn_acts)) {
+           _XkbFree(devi->btn_acts);
+           devi->num_btns= 0;
+           devi->btn_acts= NULL;
+       }
+       if ((which&XkbXI_IndicatorsMask)&&(devi->leds)) {
+           register int i;
+           if ((which&XkbXI_IndicatorsMask)==XkbXI_IndicatorsMask) {
+               _XkbFree(devi->leds);
+               devi->sz_leds= devi->num_leds= 0;
+               devi->leds= NULL;
+           }
+           else {
+               XkbDeviceLedInfoPtr     devli;
+               for (i=0,devli=devi->leds;i<devi->num_leds;i++,devli++) {
+                   if (which&XkbXI_IndicatorMapsMask)
+                        bzero((char *)&devli->maps[0],sizeof(devli->maps));
+                   else bzero((char *)&devli->names[0],sizeof(devli->names));
+               }
+           }
+       }
+       if (freeDevI)
+           _XkbFree(devi);
+    }
+    return;
+}
diff --git a/src/xkb/XKBBell.c b/src/xkb/XKBBell.c
new file mode 100644 (file)
index 0000000..cf93ea7
--- /dev/null
@@ -0,0 +1,178 @@
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+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 Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS 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 <stdio.h>
+#include "Xlibint.h"
+#include <X11/extensions/XKBproto.h>
+#include "XKBlibint.h"
+
+
+Bool
+XkbDeviceBell( Display *       dpy,
+               Window          window,
+               int             deviceID,
+               int             bellClass,
+               int             bellID,
+               int             percent,
+               Atom            name)
+{
+    register xkbBellReq *req;
+    XkbInfoPtr xkbi;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return False;
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    GetReq(kbBell,req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbBell;
+    req->deviceSpec = deviceID;
+    req->window = (CARD32)window;
+    req->bellClass = (CARD16)bellClass;
+    req->bellID = (CARD16)bellID;
+    req->percent = percent;
+    req->forceSound = False;
+    req->eventOnly = False;
+    req->pitch = 0;
+    req->duration = 0;
+    req->name = (CARD32)name;
+    req->pad1= 0; req->pad2= 0;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return True;
+}
+
+Bool
+XkbForceDeviceBell(    Display *       dpy,
+                       int             deviceID,
+                       int             bellClass,
+                       int             bellID,
+                       int             percent)
+{
+    register xkbBellReq *req;
+    XkbInfoPtr xkbi;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return False;
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    GetReq(kbBell,req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbBell;
+    req->deviceSpec = deviceID;
+    req->window = (CARD32)None;
+    req->bellClass = (CARD16)bellClass;
+    req->bellID = (CARD16)bellID;
+    req->percent = percent;
+    req->forceSound = True;
+    req->eventOnly = False;
+    req->pitch = 0;
+    req->duration = 0;
+    req->name = None;
+    req->pad1= 0; req->pad2= 0;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return True;
+}
+
+Bool
+XkbDeviceBellEvent(    Display *       dpy,
+                       Window          window,
+                       int             deviceID,
+                       int             bellClass,
+                       int             bellID,
+                       int             percent,
+                       Atom            name)
+{
+    register xkbBellReq *req;
+    XkbInfoPtr xkbi;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return False;
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    GetReq(kbBell,req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbBell;
+    req->deviceSpec = deviceID;
+    req->window = (CARD32)window;
+    req->bellClass = (CARD16)bellClass;
+    req->bellID = (CARD16)bellID;
+    req->percent = percent;
+    req->forceSound = False;
+    req->eventOnly = True;
+    req->pitch = 0;
+    req->duration = 0;
+    req->name = (CARD32)name;
+    req->pad1= 0; req->pad2= 0;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return True;
+}
+
+Bool
+XkbBell(Display *dpy,Window window,int percent,Atom name)
+{
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL))) {
+       XBell(dpy,percent);
+       return False;
+    }
+    return XkbDeviceBell(dpy,window,XkbUseCoreKbd,XkbDfltXIClass,XkbDfltXIId,
+                                                               percent,name);
+}
+
+Bool
+XkbForceBell(Display *dpy,int percent)
+{
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL))) {
+       XBell(dpy,percent);
+       return False;
+    }
+    return XkbForceDeviceBell(dpy,XkbUseCoreKbd,XkbDfltXIClass,XkbDfltXIId,
+                                                               percent);
+}
+
+Bool
+XkbBellEvent(Display *dpy,Window window,int percent,Atom name)
+{
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL))) {
+       return False;
+    }
+    /* class 0 = KbdFeedbackClass (X Input Extension) */
+    return XkbDeviceBellEvent(dpy,window,XkbUseCoreKbd,
+                                       XkbDfltXIClass,XkbDfltXIId,
+                                       percent,name);
+}
+
diff --git a/src/xkb/XKBBind.c b/src/xkb/XKBBind.c
new file mode 100644 (file)
index 0000000..1c16adc
--- /dev/null
@@ -0,0 +1,848 @@
+/*
+
+Copyright 1985, 1987, 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.
+
+*/
+
+       /* the new monsters ate the old ones */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "XKBlib.h"
+#include <X11/Xlibint.h>
+#include <X11/Xutil.h>
+#include <X11/keysym.h>
+#include <stdio.h>
+#include <ctype.h>
+
+#include <X11/extensions/XKBproto.h>
+#include "XKBlibint.h"
+
+#ifdef USE_OWN_COMPOSE
+#define        COMPOSE_NO_CONST_MEMBERS
+#include "imComp.h"
+#endif
+
+#define AllMods (ShiftMask|LockMask|ControlMask| \
+                Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask)
+
+static int _XkbLoadDpy(
+    Display *dpy
+);
+
+struct _XKeytrans {
+       struct _XKeytrans *next;/* next on list */
+       char *string;           /* string to return when the time comes */
+       int len;                /* length of string (since NULL is legit)*/
+       KeySym key;             /* keysym rebound */
+       unsigned int state;     /* modifier state */
+       KeySym *modifiers;      /* modifier keysyms you want */
+       int mlen;               /* length of modifier list */
+};
+
+KeySym
+XkbKeycodeToKeysym(Display *dpy,
+#if NeedWidePrototypes
+                unsigned int kc,
+#else
+                KeyCode kc,
+#endif
+                int    group,
+                int    level)
+{
+    XkbDescRec *xkb;
+
+    if (_XkbUnavailable(dpy))
+       return NoSymbol;
+
+    _XkbCheckPendingRefresh(dpy,dpy->xkb_info);
+
+    xkb = dpy->xkb_info->desc;
+    if ((kc<xkb->min_key_code)||(kc>xkb->max_key_code))
+       return NoSymbol;
+
+    if ((group<0)||(level<0)||(group>=XkbKeyNumGroups(xkb,kc)))
+       return NoSymbol;
+    if (level>=XkbKeyGroupWidth(xkb,kc,group)) {
+       /* for compatibility with the core protocol, _always_ allow  */
+       /* two symbols in the first two groups.   If either of the   */
+       /* two is of type ONE_LEVEL, just replicate the first symbol */
+       if ((group>XkbGroup2Index)||(XkbKeyGroupWidth(xkb,kc,group)!=1)||
+                                                               (level!=1)) {
+           return NoSymbol;
+       }
+       level= 0;
+    }
+    return XkbKeySymEntry(xkb,kc,level,group);
+}
+
+KeySym
+XKeycodeToKeysym(Display *dpy,
+#if NeedWidePrototypes
+                unsigned int kc,
+#else
+                KeyCode kc,
+#endif
+                int col)
+{
+    XkbDescRec *xkb;
+
+    if (_XkbUnavailable(dpy))
+       return _XKeycodeToKeysym(dpy, kc, col);
+
+    _XkbCheckPendingRefresh(dpy,dpy->xkb_info);
+
+    xkb = dpy->xkb_info->desc;
+    if ((kc<xkb->min_key_code)||(kc>xkb->max_key_code))
+       return NoSymbol;
+
+    if (col>3) {
+       int lastSym,tmp,nGrp;
+
+       lastSym= 3;
+       nGrp= XkbKeyNumGroups(xkb,kc);
+       if ((nGrp>0)&&((tmp=XkbKeyGroupWidth(xkb,kc,XkbGroup1Index))>2)) {
+           if (col<=(lastSym+tmp-2))
+               return XkbKeycodeToKeysym(dpy,kc,XkbGroup1Index,col-lastSym+2);
+           lastSym+= tmp-2;
+       }
+       if ((nGrp>1)&&((tmp=XkbKeyGroupWidth(xkb,kc,XkbGroup2Index))>2)) {
+           if (col<=(lastSym+tmp-2))
+               return XkbKeycodeToKeysym(dpy,kc,XkbGroup2Index,col-lastSym+2);
+           lastSym+= tmp-2;
+       }
+       if (nGrp>2) {
+           tmp= XkbKeyGroupWidth(xkb,kc,XkbGroup3Index);
+           if (col<=lastSym+tmp)
+               return XkbKeycodeToKeysym(dpy,kc,XkbGroup3Index,col-lastSym);
+           lastSym+= tmp;
+       }
+       if (nGrp>3) {
+           tmp= XkbKeyGroupWidth(xkb,kc,XkbGroup4Index);
+           if (col<=lastSym+tmp)
+               return XkbKeycodeToKeysym(dpy,kc,XkbGroup4Index,col-lastSym);
+       }
+       return NoSymbol;
+    }
+    return XkbKeycodeToKeysym(dpy,kc,(col>>1),(col&1));
+}
+
+KeyCode
+XKeysymToKeycode(Display *dpy, KeySym ks)
+{
+    register int i, j, gotOne;
+
+    if (_XkbUnavailable(dpy))
+       return _XKeysymToKeycode(dpy,ks);
+    _XkbCheckPendingRefresh(dpy,dpy->xkb_info);
+
+    j= 0;
+    do {
+       register XkbDescRec *xkb = dpy->xkb_info->desc;
+       gotOne= 0;
+       for (i = dpy->min_keycode; i <= dpy->max_keycode; i++) {
+           if ( j<(int)XkbKeyNumSyms(xkb,i) ) {
+               gotOne = 1;
+               if ((XkbKeySym(xkb,i,j)==ks))
+                   return i;
+           }
+       }
+       j++;
+    } while (gotOne);
+    return 0;
+}
+
+static int
+_XkbComputeModmap(Display *dpy)
+{
+register XkbDescPtr xkb;
+
+    xkb= dpy->xkb_info->desc;
+    if (XkbGetUpdatedMap(dpy,XkbModifierMapMask,xkb)==Success)
+       return 1;
+    return 0;
+}
+
+unsigned
+XkbKeysymToModifiers(Display *dpy,KeySym ks)
+{
+    XkbDescRec *xkb;
+    register int i,j;
+    register KeySym *pSyms;
+    CARD8 mods;
+
+    if (_XkbUnavailable(dpy))
+       return _XKeysymToModifiers(dpy,ks);
+    _XkbCheckPendingRefresh(dpy,dpy->xkb_info);
+
+    if (_XkbNeedModmap(dpy->xkb_info)&&(!_XkbComputeModmap(dpy)))
+       return _XKeysymToModifiers(dpy,ks);
+
+    xkb= dpy->xkb_info->desc;
+    mods= 0;
+    for (i = xkb->min_key_code; i <= (int)xkb->max_key_code; i++) {
+       pSyms= XkbKeySymsPtr(xkb,i);
+       for (j=XkbKeyNumSyms(xkb,i)-1;j>=0;j--) {
+           if (pSyms[j]==ks) {
+               mods|= xkb->map->modmap[i];
+               break;
+           }
+       }
+    }
+    return mods;
+}
+
+KeySym
+XLookupKeysym(register XKeyEvent *event, int col)
+{
+    Display *dpy = event->display;
+    if (_XkbUnavailable(dpy))
+       return _XLookupKeysym(event, col);
+    _XkbCheckPendingRefresh(dpy,dpy->xkb_info);
+    return XKeycodeToKeysym(dpy, event->keycode, col);
+}
+
+   /*
+    * Not a public entry point -- XkbTranslateKey is an obsolete name
+    * that is preserved here so that functions linked against the old
+    * version will continue to work in a shared library environment.
+    */
+int
+XkbTranslateKey(       register Display *      dpy,
+                       KeyCode                 key,
+                       register unsigned int   mods,
+                       unsigned int *          mods_rtrn,
+                       KeySym *                keysym_rtrn);
+int
+XkbTranslateKey(       register Display *      dpy,
+                       KeyCode                 key,
+                       register unsigned int   mods,
+                       unsigned int *          mods_rtrn,
+                       KeySym *                keysym_rtrn)
+{
+    return XkbLookupKeySym(dpy,key,mods,mods_rtrn,keysym_rtrn);
+}
+
+Bool
+XkbLookupKeySym(       register Display *      dpy,
+                       KeyCode                 key,
+                       register unsigned int   mods,
+                       unsigned int *          mods_rtrn,
+                       KeySym *                keysym_rtrn)
+{
+    if (_XkbUnavailable(dpy))
+       return _XTranslateKey(dpy, key, mods, mods_rtrn, keysym_rtrn);
+    _XkbCheckPendingRefresh(dpy,dpy->xkb_info);
+    return XkbTranslateKeyCode(dpy->xkb_info->desc,key,mods,mods_rtrn,
+                                                               keysym_rtrn);
+}
+
+Bool
+XkbTranslateKeyCode(   register XkbDescPtr     xkb,
+                       KeyCode                 key,
+                       register unsigned int   mods,
+                       unsigned int *          mods_rtrn,
+                       KeySym *                keysym_rtrn)
+{
+    XkbKeyTypeRec *type;
+    int col,nKeyGroups;
+    unsigned preserve,effectiveGroup;
+    KeySym *syms;
+
+    if (mods_rtrn!=NULL)
+       *mods_rtrn = 0;
+
+    nKeyGroups= XkbKeyNumGroups(xkb,key);
+    if ((!XkbKeycodeInRange(xkb,key))||(nKeyGroups==0)) {
+       if (keysym_rtrn!=NULL)
+           *keysym_rtrn = NoSymbol;
+       return False;
+    }
+
+    syms = XkbKeySymsPtr(xkb,key);
+
+    /* find the offset of the effective group */
+    col = 0;
+    effectiveGroup= XkbGroupForCoreState(mods);
+    if ( effectiveGroup>=nKeyGroups ) {
+       unsigned groupInfo= XkbKeyGroupInfo(xkb,key);
+       switch (XkbOutOfRangeGroupAction(groupInfo)) {
+           default:
+               effectiveGroup %= nKeyGroups;
+               break;
+           case XkbClampIntoRange:
+               effectiveGroup = nKeyGroups-1;
+               break;
+           case XkbRedirectIntoRange:
+               effectiveGroup = XkbOutOfRangeGroupNumber(groupInfo);
+               if (effectiveGroup>=nKeyGroups)
+                   effectiveGroup= 0;
+               break;
+       }
+    }
+    col= effectiveGroup*XkbKeyGroupsWidth(xkb,key);
+    type = XkbKeyKeyType(xkb,key,effectiveGroup);
+
+    preserve= 0;
+    if (type->map) { /* find the column (shift level) within the group */
+       register int i;
+       register XkbKTMapEntryPtr entry;
+       for (i=0,entry=type->map;i<type->map_count;i++,entry++) {
+           if ((entry->active)&&((mods&type->mods.mask)==entry->mods.mask)) {
+               col+= entry->level;
+               if (type->preserve)
+                   preserve= type->preserve[i].mask;
+               break;
+           }
+       }
+    }
+
+    if (keysym_rtrn!=NULL)
+       *keysym_rtrn= syms[col];
+    if (mods_rtrn) {
+       *mods_rtrn= type->mods.mask&(~preserve);
+       /* The Motif VTS doesn't get the help callback called if help
+        * is bound to Shift+<whatever>, and it appears as though it
+        * is XkbTranslateKeyCode that is causing the problem.  The
+        * core X version of XTranslateKey always OR's in ShiftMask
+        * and LockMask for mods_rtrn, so this "fix" keeps this behavior
+        * and solves the VTS problem.
+        */
+       if ((xkb->dpy)&&(xkb->dpy->xkb_info)&&
+           (xkb->dpy->xkb_info->xlib_ctrls&XkbLC_AlwaysConsumeShiftAndLock)) {
+           *mods_rtrn|= (ShiftMask|LockMask);
+       }
+    }
+    return (syms[col]!=NoSymbol);
+}
+
+Status
+XkbRefreshKeyboardMapping(register XkbMapNotifyEvent *event)
+{
+    Display *dpy = event->display;
+    XkbInfoPtr xkbi;
+
+    if (_XkbUnavailable(dpy)) {
+       _XRefreshKeyboardMapping((XMappingEvent *)event);
+       return Success;
+    }
+    xkbi= dpy->xkb_info;
+
+    if (((event->type&0x7f)-xkbi->codes->first_event)!=XkbEventCode)
+       return BadMatch;
+    if (event->xkb_type==XkbNewKeyboardNotify) {
+       _XkbReloadDpy(dpy);
+       return Success;
+    }
+    if (event->xkb_type==XkbMapNotify) {
+       XkbMapChangesRec        changes;
+       Status                  rtrn;
+
+       if (xkbi->flags&XkbMapPending)
+            changes= xkbi->changes;
+       else bzero(&changes,sizeof(changes));
+       XkbNoteMapChanges(&changes,event,XKB_XLIB_MAP_MASK);
+       if ((rtrn=XkbGetMapChanges(dpy,xkbi->desc,&changes))!=Success) {
+#ifdef DEBUG
+           fprintf(stderr,"Internal Error! XkbGetMapChanges failed:\n");
+#endif
+           xkbi->changes= changes;
+       }
+       else if (xkbi->flags&XkbMapPending) {
+           xkbi->flags&= ~XkbMapPending;
+           bzero(&xkbi->changes,sizeof(XkbMapChangesRec));
+       }
+       return rtrn;
+    }
+    return BadMatch;
+}
+
+int
+XRefreshKeyboardMapping(register XMappingEvent *event)
+{
+    XkbEvent   *xkbevent = (XkbEvent *)event;
+    Display *dpy = event->display;
+    XkbMapChangesRec changes;
+    XkbInfoPtr xkbi;
+
+    /* always do this for input methods, which still use the old keymap */
+    (void) _XRefreshKeyboardMapping(event);
+
+    if (_XkbUnavailable(dpy))
+       return 1;
+
+    xkbi = dpy->xkb_info;
+
+    if (((event->type&0x7f)-xkbi->codes->first_event)==XkbEventCode)
+       return XkbRefreshKeyboardMapping(&xkbevent->map);
+
+    if (xkbi->flags&XkbXlibNewKeyboard) {
+       _XkbReloadDpy(dpy);
+       return 1;
+    }
+
+    if ((xkbi->flags&XkbMapPending)||(event->request==MappingKeyboard)) {
+       if (xkbi->flags&XkbMapPending) {
+           changes= xkbi->changes;
+           _XkbNoteCoreMapChanges(&changes,event,XKB_XLIB_MAP_MASK);
+       }
+       else {
+           bzero(&changes,sizeof(changes));
+           changes.changed= XkbKeySymsMask;
+           if (xkbi->desc->min_key_code<xkbi->desc->max_key_code) {
+               changes.first_key_sym= xkbi->desc->min_key_code;
+               changes.num_key_syms= xkbi->desc->max_key_code-
+                                               xkbi->desc->min_key_code+1;
+           }
+           else {
+               changes.first_key_sym= event->first_keycode;
+               changes.num_key_syms= event->count;
+           }
+       }
+
+       if (XkbGetMapChanges(dpy,xkbi->desc, &changes)!=Success) {
+#ifdef DEBUG
+               fprintf(stderr,"Internal Error! XkbGetMapChanges failed:\n");
+               if (changes.changed&XkbKeyTypesMask) {
+                   int first= changes.first_type;
+                   int last= changes.first_type+changes.num_types-1;
+                   fprintf(stderr,"       types:  %d..%d\n",first,last);
+               }
+               if (changes.changed&XkbKeySymsMask) {
+                   int first= changes.first_key_sym;
+                   int last= changes.first_key_sym+changes.num_key_syms-1;
+                   fprintf(stderr,"     symbols:  %d..%d\n",first,last);
+               }
+               if (changes.changed&XkbKeyActionsMask) {
+                   int last,first= changes.first_key_act;
+                   last= changes.first_key_act+changes.num_key_acts-1;
+                   fprintf(stderr,"     acts:  %d..%d\n",first,last);
+               }
+               if (changes.changed&XkbKeyBehaviorsMask) {
+                   int last,first= changes.first_key_behavior;
+                   last= first+changes.num_key_behaviors-1;
+                   fprintf(stderr,"   behaviors:  %d..%d\n",first,last);
+               }
+               if (changes.changed&XkbVirtualModsMask) {
+                   fprintf(stderr,"virtual mods: 0x%04x\n",
+                                       changes.vmods);
+               }
+               if (changes.changed&XkbExplicitComponentsMask) {
+                   int last,first= changes.first_key_explicit;
+                   last= first+changes.num_key_explicit-1;
+                   fprintf(stderr,"    explicit:  %d..%d\n",first,last);
+               }
+#endif
+       }
+       LockDisplay(dpy);
+       if (xkbi->flags&XkbMapPending) {
+           xkbi->flags&= ~XkbMapPending;
+           bzero(&xkbi->changes,sizeof(XkbMapChangesRec));
+       }
+       UnlockDisplay(dpy);
+    }
+    if (event->request==MappingModifier) {
+       LockDisplay(dpy);
+       if (xkbi->desc->map->modmap) {
+           _XkbFree(xkbi->desc->map->modmap);
+           xkbi->desc->map->modmap= NULL;
+       }
+       if (dpy->key_bindings) {
+           register struct _XKeytrans *p;
+           for (p = dpy->key_bindings; p; p = p->next) {
+               register int i;
+               p->state= 0;
+               if (p->mlen>0) {
+                   for (i = 0; i < p->mlen; i++) {
+                       p->state|= XkbKeysymToModifiers(dpy,p->modifiers[i]);
+                   }
+                   if (p->state)       p->state &= AllMods;
+                   else                p->state = AnyModifier;
+               }
+           }
+       }
+       UnlockDisplay(dpy);
+    }
+    return 1;
+}
+
+static int
+_XkbLoadDpy(Display *dpy)
+{
+    XkbInfoPtr xkbi;
+    unsigned query,oldEvents;
+    XkbDescRec *desc;
+
+    if (!XkbUseExtension(dpy,NULL,NULL))
+       return 0;
+
+    xkbi = dpy->xkb_info;
+    query = XkbAllClientInfoMask;
+    desc = XkbGetMap(dpy,query,XkbUseCoreKbd);
+    if (!desc) {
+#ifdef DEBUG
+       fprintf(stderr,"Warning! XkbGetMap failed!\n");
+#endif
+       return 0;
+    }
+    LockDisplay(dpy);
+    xkbi->desc = desc;
+
+    UnlockDisplay(dpy);
+    oldEvents= xkbi->selected_events;
+    if (!(xkbi->xlib_ctrls&XkbLC_IgnoreNewKeyboards)) {
+       XkbSelectEventDetails(dpy,xkbi->desc->device_spec,XkbNewKeyboardNotify,
+                               XkbNKN_KeycodesMask|XkbNKN_DeviceIDMask,
+                               XkbNKN_KeycodesMask|XkbNKN_DeviceIDMask);
+    }
+    XkbSelectEventDetails(dpy,xkbi->desc->device_spec,XkbMapNotify,
+                               XkbAllClientInfoMask,XkbAllClientInfoMask);
+    LockDisplay(dpy);
+    xkbi->selected_events= oldEvents;
+    UnlockDisplay(dpy);
+    return 1;
+}
+
+void
+_XkbReloadDpy(Display *dpy)
+{
+    XkbInfoPtr xkbi;
+    XkbDescRec *desc;
+    unsigned   oldDeviceID;
+
+    if (_XkbUnavailable(dpy))
+       return;
+
+    xkbi = dpy->xkb_info;
+    LockDisplay(dpy);
+    if (xkbi->desc) {
+       oldDeviceID= xkbi->desc->device_spec;
+       XkbFreeKeyboard(xkbi->desc,XkbAllComponentsMask,True);
+       xkbi->desc= NULL;
+       xkbi->flags&= ~(XkbMapPending|XkbXlibNewKeyboard);
+       xkbi->changes.changed= 0;
+    }
+    else oldDeviceID= XkbUseCoreKbd;
+    UnlockDisplay(dpy);
+    desc = XkbGetMap(dpy,XkbAllClientInfoMask,XkbUseCoreKbd);
+    if (!desc)
+       return;
+    LockDisplay(dpy);
+    xkbi->desc = desc;
+    UnlockDisplay(dpy);
+
+    if (desc->device_spec!=oldDeviceID) {
+       /* transfer(?) event masks here */
+#ifdef NOTYET
+       unsigned oldEvents;
+       oldEvents= xkbi->selected_events;
+       XkbSelectEventDetails(dpy,xkbi->desc->device_spec,XkbMapNotify,
+                               XkbAllMapComponentsMask,XkbAllClientInfoMask);
+       LockDisplay(dpy);
+       xkbi->selected_events= oldEvents;
+       UnlockDisplay(dpy);
+#endif
+    }
+    return;
+}
+
+int
+XkbTranslateKeySym(    register Display *      dpy,
+                       register KeySym *       sym_rtrn,
+                       unsigned int            mods,
+                       char *                  buffer,
+                       int                     nbytes,
+                       int *                   extra_rtrn)
+{
+    register XkbInfoPtr        xkb;
+    XkbKSToMBFunc cvtr;
+    XPointer priv;
+    char tmp[4];
+    int n;
+
+    xkb= dpy->xkb_info;
+    if (!xkb->cvt.KSToMB) {
+        _XkbGetConverters(_XkbGetCharset(),&xkb->cvt);
+        _XkbGetConverters("ISO8859-1",&xkb->latin1cvt);
+    }
+
+    if (extra_rtrn)
+       *extra_rtrn= 0;
+
+    if ((buffer==NULL)||(nbytes==0)) {
+       buffer= tmp;
+       nbytes= 4;
+    }
+
+    /* see if symbol rebound, if so, return that string. */
+    n = XkbLookupKeyBinding(dpy,*sym_rtrn,mods,buffer,nbytes,extra_rtrn);
+    if (n)
+        return n;
+
+    if ( nbytes>0 )
+       buffer[0]= '\0';
+
+    if ( xkb->cvt.KSToUpper && (mods&LockMask) ) {
+       *sym_rtrn = (*xkb->cvt.KSToUpper)(*sym_rtrn);
+    }
+    if (xkb->xlib_ctrls & XkbLC_ForceLatin1Lookup) {
+       cvtr = xkb->latin1cvt.KSToMB;
+       priv = xkb->latin1cvt.KSToMBPriv;
+    } else {
+       cvtr = xkb->cvt.KSToMB;
+       priv = xkb->cvt.KSToMBPriv;
+    }
+
+    n = (*cvtr)(priv,*sym_rtrn,buffer,nbytes,extra_rtrn);
+
+    if ((!xkb->cvt.KSToUpper)&&( mods&LockMask )) {
+       register int i;
+       int change;
+       char ch;
+       for (i=change=0;i<n;i++) {
+           ch= toupper(buffer[i]);
+           change= (change||(buffer[i]!=ch));
+           buffer[i] = ch;
+       }
+       if (change) {
+           if (n==1)
+               *sym_rtrn=(*xkb->cvt.MBToKS)(xkb->cvt.MBToKSPriv,buffer,n,NULL);
+           else *sym_rtrn= NoSymbol;
+       }
+    }
+
+    if ( mods&ControlMask ) {
+       if ( n==1 ) {
+           buffer[0]= XkbToControl(buffer[0]);
+           if ( nbytes>1 )
+               buffer[1]= '\0';
+           return 1;
+       }
+       if ( nbytes > 0 )
+           buffer[0]= '\0';
+       return 0;
+    }
+    return n;
+}
+
+int
+XLookupString (        register XKeyEvent *    event,
+               char *                  buffer,
+               int                     nbytes,
+               KeySym *                keysym,
+               XComposeStatus *        status)
+{
+    KeySym     dummy;
+    int rtrnLen;
+    unsigned int new_mods;
+    Display *dpy = event->display;
+
+    if (keysym==NULL)
+       keysym= &dummy;
+    if (!XkbLookupKeySym(dpy,event->keycode,event->state, &new_mods,keysym))
+       return 0;
+    new_mods= (event->state&(~new_mods));
+
+    /* find the group where a symbol can be converted to control one */
+    if (new_mods&ControlMask && *keysym > 0x7F &&
+       (dpy->xkb_info->xlib_ctrls & XkbLC_ControlFallback)) {
+       XKeyEvent tmp_ev = *event;
+       KeySym tmp_keysym;
+       unsigned int tmp_new_mods;
+       if (_XkbUnavailable(dpy)) {
+            tmp_ev.state= event->state ^ dpy->mode_switch;
+            if (XkbLookupKeySym(dpy, tmp_ev.keycode, tmp_ev.state,
+                                &tmp_new_mods, &tmp_keysym) &&
+                tmp_keysym != NoSymbol && tmp_keysym < 0x80 ) {
+                *keysym = tmp_keysym;
+            }
+        } else {
+            int n = XkbKeyNumGroups(dpy->xkb_info->desc, tmp_ev.keycode);
+            int i;
+            for (i = 0; i < n; i++) {
+                if (XkbGroupForCoreState(event->state) == i)
+                    continue;
+                tmp_ev.state= XkbBuildCoreState(tmp_ev.state, i);
+                if (XkbLookupKeySym(dpy, tmp_ev.keycode, tmp_ev.state,
+                                     &tmp_new_mods, &tmp_keysym) &&
+                    tmp_keysym != NoSymbol && tmp_keysym < 0x80 ) {
+                    *keysym = tmp_keysym;
+                    new_mods= (event->state&(~tmp_new_mods));
+                    break;
+                }
+            }
+        }
+    }
+
+#ifdef USE_OWN_COMPOSE
+    if ( status ) {
+       static int been_here= 0;
+       if ( !been_here ) {
+           XimCompInitTables();
+           been_here = 1;
+       }
+       if ( !XimCompLegalStatus(status) ) {
+           status->compose_ptr = NULL;
+           status->chars_matched = 0;
+       }
+       if ( ((status->chars_matched>0)&&(status->compose_ptr!=NULL)) ||
+               XimCompIsComposeKey(*keysym,event->keycode,status) ) {
+           XimCompRtrn rtrn;
+
+           switch (XimCompProcessSym(status,*keysym,&rtrn)) {
+               case XIM_COMP_IGNORE:
+                   break;
+               case XIM_COMP_IN_PROGRESS:
+                   if ( keysym!=NULL )
+                       *keysym = NoSymbol;
+#ifndef NO_COMPOSE_LED
+                   if ( dpy->xkb_info->xlib_ctrls&XkbLC_ComposeLED ) {
+                       XkbSetNamedIndicator(dpy,dpy->xkb_info->composeLED,
+                                               True,True,False,NULL);
+                   }
+#endif
+                   return 0;
+               case XIM_COMP_FAIL:
+               {
+                   static Atom _ComposeFail= None;
+                   int n = 0, len= 0;
+#ifndef NO_COMPOSE_LED
+                   if ( dpy->xkb_info->xlib_ctrls&XkbLC_ComposeLED ) {
+                       XkbSetNamedIndicator(dpy,dpy->xkb_info->composeLED,
+                                               True,False,False,NULL);
+                   }
+#endif
+#ifndef NO_BELL_ON_COMPOSE_FAIL
+                   if (dpy->xkb_info->xlib_ctrls&XkbLC_BeepOnComposeFail) {
+                       if (_ComposeFail==None)
+                           _ComposeFail= XInternAtom(dpy,"ComposeFail",0);
+                       XkbBell(dpy,event->window,0,_ComposeFail);
+                   }
+#endif
+                   for (n=len=0;rtrn.sym[n]!=XK_VoidSymbol;n++) {
+                       if ( nbytes-len > 0 ) {
+                           len+= XkbTranslateKeySym(dpy,&rtrn.sym[n],new_mods,
+                                                       buffer+len,nbytes-len,
+                                                       NULL);
+                       }
+                   }
+                   if ( keysym!=NULL ) {
+                       if ( n==1 )     *keysym = rtrn.sym[0];
+                       else            *keysym = NoSymbol;
+                   }
+                   return len;
+               }
+               case XIM_COMP_SUCCEED:
+               {
+                   int len,n = 0;
+
+#ifndef NO_COMPOSE_LED
+                   if ( dpy->xkb_info->xlib_ctrls&XkbLC_ComposeLED ) {
+                       XkbSetNamedIndicator(dpy,dpy->xkb_info->composeLED,
+                                               True,False,False,NULL);
+                   }
+#endif
+                   *keysym = rtrn.matchSym;
+                   if ( rtrn.str[0]!='\0' ) {
+                       strncpy(buffer,rtrn.str,nbytes-1);
+                       buffer[nbytes-1]= '\0';
+                       len = (int)strlen(buffer);
+                   }
+                   else {
+                       len = XkbTranslateKeySym(dpy,keysym,new_mods,
+                                                       buffer,nbytes,
+                                                       NULL);
+                   }
+                   for (n=0;rtrn.sym[n]!=XK_VoidSymbol;n++) {
+                       if ( nbytes-len > 0 ) {
+                           len+= XkbTranslateKeySym(dpy,&rtrn.sym[n],
+                                                       event->state,
+                                                       buffer+len,nbytes-len,
+                                                       NULL);
+                       }
+                   }
+                   return len;
+               }
+           }
+       }
+    }
+#endif
+
+    /* We *should* use the new_mods (which does not contain any modifiers */
+    /* that were used to compute the symbol here, but pre-XKB XLookupString */
+    /* did not and we have to remain compatible.  Sigh. */
+    if (_XkbUnavailable(dpy) ||
+       (dpy->xkb_info->xlib_ctrls&XkbLC_ConsumeLookupMods)==0)
+       new_mods= event->state;
+
+    rtrnLen= XkbLookupKeyBinding(dpy,*keysym,new_mods,buffer,nbytes,NULL);
+    if (rtrnLen>0)
+       return rtrnLen;
+
+    return XkbTranslateKeySym(dpy,keysym,new_mods,buffer,nbytes,NULL);
+}
+
+
+int
+XkbLookupKeyBinding(   Display *               dpy,
+                       register KeySym         sym,
+                       unsigned int            mods,
+                       char *                  buffer,
+                       int                     nbytes,
+                       int *                   extra_rtrn)
+{
+    register struct _XKeytrans *p;
+
+    if (extra_rtrn)
+       *extra_rtrn= 0;
+    for (p = dpy->key_bindings; p; p = p->next) {
+       if (((mods & AllMods) == p->state) && (sym == p->key)) {
+           int tmp = p->len;
+           if (tmp > nbytes) {
+               if (extra_rtrn)
+                   *extra_rtrn= (tmp-nbytes);
+               tmp = nbytes;
+           }
+           memcpy (buffer, p->string, tmp);
+           if (tmp < nbytes)   buffer[tmp]= '\0';
+           return tmp;
+       }
+    }
+    return 0;
+}
+
+char
+XkbToControl( char ch )
+{
+    register char c = ch;
+
+    if ((c >= '@' && c < '\177') || c == ' ') c &= 0x1F;
+    else if (c == '2') c = '\000';
+    else if (c >= '3' && c <= '7') c -= ('3' - '\033');
+    else if (c == '8') c = '\177';
+    else if (c == '/') c = '_' & 0x1F;
+    return c;
+}
diff --git a/src/xkb/XKBCompat.c b/src/xkb/XKBCompat.c
new file mode 100644 (file)
index 0000000..206b0c9
--- /dev/null
@@ -0,0 +1,247 @@
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+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 Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS 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 <stdio.h>
+#define        NEED_MAP_READERS
+#include "Xlibint.h"
+#include <X11/extensions/XKBproto.h>
+#include "XKBlibint.h"
+
+Status
+_XkbReadGetCompatMapReply(     Display *               dpy,
+                               xkbGetCompatMapReply *  rep,
+                               XkbDescPtr              xkb,
+                               int     *               nread_rtrn)
+{
+register int           i;
+XkbReadBufferRec       buf;
+
+    if (!_XkbInitReadBuffer(dpy,&buf,(int)rep->length*4))
+       return BadAlloc;
+
+    if (nread_rtrn)
+       *nread_rtrn= (int)rep->length*4;
+
+    i= rep->firstSI+rep->nSI;
+    if ((!xkb->compat)&&
+       (XkbAllocCompatMap(xkb,XkbAllCompatMask,i)!=Success))
+       return BadAlloc;
+
+    if (rep->nSI!=0) {
+       XkbSymInterpretRec *syms;
+       xkbSymInterpretWireDesc *wire;
+
+       wire= (xkbSymInterpretWireDesc *)_XkbGetReadBufferPtr(&buf,
+                                  rep->nSI*SIZEOF(xkbSymInterpretWireDesc));
+       if (wire==NULL)
+           goto BAILOUT;
+       syms= &xkb->compat->sym_interpret[rep->firstSI];
+
+       for (i=0;i<rep->nSI;i++,syms++,wire++) {
+           syms->sym= wire->sym;
+           syms->mods= wire->mods;
+           syms->match= wire->match;
+           syms->virtual_mod= wire->virtualMod;
+           syms->flags= wire->flags;
+           syms->act= *((XkbAnyAction *)&wire->act);
+       }
+       xkb->compat->num_si+= rep->nSI;
+    }
+
+    if (rep->groups&XkbAllGroupsMask) {
+       register unsigned       bit,nGroups;
+       xkbModsWireDesc *       wire;
+       for (i=0,nGroups=0,bit=1;i<XkbNumKbdGroups;i++,bit<<=1) {
+           if (rep->groups&bit)
+               nGroups++;
+       }
+       wire= (xkbModsWireDesc *)_XkbGetReadBufferPtr(&buf,
+                                 nGroups*SIZEOF(xkbModsWireDesc));
+       if (wire==NULL)
+           goto BAILOUT;
+       for (i=0,bit=1;i<XkbNumKbdGroups;i++,bit<<=1) {
+           if ((rep->groups&bit)==0)
+               continue;
+           xkb->compat->groups[i].mask= wire->mask;
+           xkb->compat->groups[i].real_mods= wire->realMods;
+           xkb->compat->groups[i].vmods= wire->virtualMods;
+           wire++;
+       }
+    }
+    i= _XkbFreeReadBuffer(&buf);
+    if (i)
+       fprintf(stderr,"CompatMapReply! Bad length (%d extra bytes)\n",i);
+    if (i || buf.error)
+       return BadLength;
+    return Success;
+BAILOUT:
+    _XkbFreeReadBuffer(&buf);
+    return BadLength;
+}
+
+Status
+XkbGetCompatMap(Display *dpy,unsigned which,XkbDescPtr xkb)
+{
+    register xkbGetCompatMapReq *req;
+    xkbGetCompatMapReply        rep;
+    Status                     status;
+    XkbInfoPtr xkbi;
+
+    if ( (!dpy) || (!xkb) || (dpy->flags & XlibDisplayNoXkb) ||
+       ((xkb->dpy!=NULL)&&(xkb->dpy!=dpy)) ||
+       (!dpy->xkb_info && (!XkbUseExtension(dpy,NULL,NULL))))
+       return BadAccess;
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    GetReq(kbGetCompatMap, req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbGetCompatMap;
+    req->deviceSpec = xkb->device_spec;
+    if (which&XkbSymInterpMask)
+        req->getAllSI= True;
+    else req->getAllSI= False;
+    req->firstSI= req->nSI= 0;
+
+    if (which&XkbGroupCompatMask)
+        req->groups= XkbAllGroupsMask;
+    else req->groups=  0;
+
+    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return BadLength;
+    }
+    if (xkb->dpy==NULL)
+       xkb->dpy= dpy;
+    if (xkb->device_spec==XkbUseCoreKbd)
+       xkb->device_spec= rep.deviceID;
+
+    status = _XkbReadGetCompatMapReply(dpy,&rep,xkb,NULL);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return status;
+}
+
+static Bool
+_XkbWriteSetCompatMap(Display *dpy,xkbSetCompatMapReq *req,XkbDescPtr xkb)
+{
+CARD16                 firstSI;
+CARD16                 nSI;
+int                    size;
+register int           i,nGroups;
+register unsigned      bit;
+unsigned               groups;
+char *                 buf;
+
+    firstSI = req->firstSI;
+    nSI = req->nSI;
+    size= nSI*SIZEOF(xkbSymInterpretWireDesc);
+    nGroups= 0;
+    groups= req->groups;
+    if (groups&XkbAllGroupsMask) {
+       for (i=0,bit=1;i<XkbNumKbdGroups;i++,bit<<=1) {
+           if (groups&bit)
+               nGroups++;
+       }
+       size+= SIZEOF(xkbModsWireDesc)*nGroups;
+    }
+    req->length+= size/4;
+    BufAlloc(char *,buf,size);
+    if (!buf)
+       return False;
+
+    if (nSI) {
+       XkbSymInterpretPtr sym= &xkb->compat->sym_interpret[firstSI];
+       xkbSymInterpretWireDesc *wire= (xkbSymInterpretWireDesc *)buf;
+       for (i=0;i<nSI;i++,wire++,sym++) {
+           wire->sym= (CARD32)sym->sym;
+           wire->mods= sym->mods;
+           wire->match= sym->match;
+           wire->flags= sym->flags;
+           wire->virtualMod= sym->virtual_mod;
+           memcpy(&wire->act,&sym->act,sz_xkbActionWireDesc);
+       }
+       buf+= nSI*SIZEOF(xkbSymInterpretWireDesc);
+    }
+    if (groups&XkbAllGroupsMask) {
+       xkbModsWireDesc *       out;
+
+       out= (xkbModsWireDesc *)buf;
+       for (i=0,bit=1;i<XkbNumKbdGroups;i++,bit<<=1) {
+           if ((groups&bit)!=0) {
+               out->mask= xkb->compat->groups[i].mask;
+               out->realMods= xkb->compat->groups[i].real_mods;
+               out->virtualMods=  xkb->compat->groups[i].vmods;
+               out++;
+           }
+       }
+       buf+= nGroups*SIZEOF(xkbModsWireDesc);
+    }
+    return True;
+}
+
+Bool
+XkbSetCompatMap(Display *dpy,unsigned which,XkbDescPtr xkb,Bool updateActions)
+{
+    register xkbSetCompatMapReq *req;
+    Status                  ok;
+    XkbInfoPtr xkbi;
+
+    if ((dpy->flags & XlibDisplayNoXkb) || (dpy!=xkb->dpy) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return False;
+    if ((!xkb->compat) ||
+       ((which&XkbSymInterpMask)&&(!xkb->compat->sym_interpret)))
+       return False;
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    GetReq(kbSetCompatMap, req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbSetCompatMap;
+    req->deviceSpec = xkb->device_spec;
+    req->recomputeActions = updateActions;
+    if (which&XkbSymInterpMask) {
+       req->truncateSI = True;
+       req->firstSI= 0;
+       req->nSI= xkb->compat->num_si;
+    }
+    else {
+       req->truncateSI = False;
+       req->firstSI= 0;
+       req->nSI= 0;
+    }
+    if (which&XkbGroupCompatMask)
+        req->groups= XkbAllGroupsMask;
+    else req->groups=  0;
+    ok= _XkbWriteSetCompatMap(dpy,req,xkb);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return ok;
+}
+
diff --git a/src/xkb/XKBCtrls.c b/src/xkb/XKBCtrls.c
new file mode 100644 (file)
index 0000000..2b33b30
--- /dev/null
@@ -0,0 +1,352 @@
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+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 Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS 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 <stdio.h>
+#include "Xlibint.h"
+#include <X11/extensions/XKBproto.h>
+#include "XKBlibint.h"
+
+
+static xkbSetControlsReq *
+_XkbGetSetControlsReq(Display *dpy,XkbInfoPtr xkbi,unsigned int deviceSpec)
+{
+xkbSetControlsReq *req;
+
+    GetReq(kbSetControls,req);
+    bzero(req,SIZEOF(xkbSetControlsReq));
+    req->reqType = xkbi->codes->major_opcode;
+    req->length = (SIZEOF(xkbSetControlsReq)>>2);
+    req->xkbReqType = X_kbSetControls;
+    req->deviceSpec = deviceSpec;
+    return req;
+}
+
+Bool
+XkbSetAutoRepeatRate(  Display *dpy,
+                       unsigned int deviceSpec,
+                       unsigned int timeout,
+                       unsigned int interval)
+{
+    register xkbSetControlsReq *req;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return False;
+    LockDisplay(dpy);
+    req= _XkbGetSetControlsReq(dpy,dpy->xkb_info,deviceSpec);
+    req->changeCtrls = XkbRepeatKeysMask;
+    req->repeatDelay = timeout;
+    req->repeatInterval = interval;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return True;
+}
+
+Bool
+XkbGetAutoRepeatRate(  Display *       dpy,
+                       unsigned int    deviceSpec,
+                       unsigned int *  timeoutp,
+                       unsigned int *  intervalp)
+{
+    register xkbGetControlsReq *req;
+    xkbGetControlsReply rep;
+    XkbInfoPtr xkbi;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return False;
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    GetReq(kbGetControls, req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbGetControls;
+    req->deviceSpec = deviceSpec;
+    if (!_XReply(dpy, (xReply *)&rep,
+               (SIZEOF(xkbGetControlsReply)-SIZEOF(xReply))>>2, xFalse)) {
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return False;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    *timeoutp = rep.repeatDelay;
+    *intervalp = rep.repeatInterval;
+    return True;
+}
+
+Bool
+XkbSetServerInternalMods(      Display *       dpy,
+                               unsigned        deviceSpec,
+                               unsigned        affectReal,
+                               unsigned        realValues,
+                               unsigned        affectVirtual,
+                               unsigned        virtualValues)
+{
+    register xkbSetControlsReq *req;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return False;
+    LockDisplay(dpy);
+    req= _XkbGetSetControlsReq(dpy,dpy->xkb_info,deviceSpec);
+    req->affectInternalMods = affectReal;
+    req->internalMods = realValues;
+    req->affectInternalVMods= affectVirtual;
+    req->internalVMods= virtualValues;
+    req->changeCtrls = XkbInternalModsMask;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return True;
+}
+
+Bool
+XkbSetIgnoreLockMods(  Display *       dpy,
+                       unsigned int    deviceSpec,
+                       unsigned        affectReal,
+                       unsigned        realValues,
+                       unsigned        affectVirtual,
+                       unsigned        virtualValues)
+{
+    register xkbSetControlsReq *req;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return False;
+    LockDisplay(dpy);
+    req= _XkbGetSetControlsReq(dpy,dpy->xkb_info,deviceSpec);
+    req->affectIgnoreLockMods= affectReal;
+    req->ignoreLockMods = realValues;
+    req->affectIgnoreLockVMods= affectVirtual;
+    req->ignoreLockVMods= virtualValues;
+    req->changeCtrls = XkbIgnoreLockModsMask;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return True;
+}
+
+Bool
+XkbChangeEnabledControls(      Display *       dpy,
+                               unsigned        deviceSpec,
+                               unsigned        affect,
+                               unsigned        values)
+{
+    register xkbSetControlsReq *req;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return False;
+    LockDisplay(dpy);
+    req= _XkbGetSetControlsReq(dpy,dpy->xkb_info,deviceSpec);
+    req->affectEnabledCtrls= affect;
+    req->enabledCtrls= (affect&values);
+    req->changeCtrls = XkbControlsEnabledMask;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return True;
+}
+
+Status
+XkbGetControls(Display *dpy, unsigned long which, XkbDescPtr xkb)
+{
+    register xkbGetControlsReq *req;
+    xkbGetControlsReply rep;
+    XkbControlsPtr     ctrls;
+    XkbInfoPtr xkbi;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return BadAccess;
+    if ((!xkb) || (!which))
+       return BadMatch;
+
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    GetReq(kbGetControls, req);
+    if (!xkb->ctrls)  {
+       xkb->ctrls = _XkbTypedCalloc(1,XkbControlsRec);
+       if (!xkb->ctrls) {
+           UnlockDisplay(dpy);
+           SyncHandle();
+           return BadAlloc;
+       }
+    }
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbGetControls;
+    req->deviceSpec = xkb->device_spec;
+    if (!_XReply(dpy, (xReply *)&rep,
+               (SIZEOF(xkbGetControlsReply)-SIZEOF(xReply))>>2, xFalse)) {
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return BadImplementation;
+    }
+    if (xkb->device_spec==XkbUseCoreKbd)
+       xkb->device_spec= rep.deviceID;
+    ctrls= xkb->ctrls;
+    if (which&XkbControlsEnabledMask)
+       ctrls->enabled_ctrls = rep.enabledCtrls;
+    ctrls->num_groups= rep.numGroups;
+    if (which&XkbGroupsWrapMask)
+       ctrls->groups_wrap= rep.groupsWrap;
+    if (which&XkbInternalModsMask) {
+       ctrls->internal.mask = rep.internalMods;
+       ctrls->internal.real_mods = rep.internalRealMods;
+       ctrls->internal.vmods = rep.internalVMods;
+    }
+    if (which&XkbIgnoreLockModsMask) {
+       ctrls->ignore_lock.mask = rep.ignoreLockMods;
+       ctrls->ignore_lock.real_mods = rep.ignoreLockRealMods;
+       ctrls->ignore_lock.vmods = rep.ignoreLockVMods;
+    }
+    if (which&XkbRepeatKeysMask) {
+       ctrls->repeat_delay = rep.repeatDelay;
+       ctrls->repeat_interval = rep.repeatInterval;
+    }
+    if (which&XkbSlowKeysMask)
+       ctrls->slow_keys_delay = rep.slowKeysDelay;
+    if (which&XkbBounceKeysMask)
+       ctrls->debounce_delay = rep.debounceDelay;
+    if (which&XkbMouseKeysMask) {
+       ctrls->mk_dflt_btn = rep.mkDfltBtn;
+    }
+    if (which&XkbMouseKeysAccelMask) {
+       ctrls->mk_delay = rep.mkDelay;
+       ctrls->mk_interval = rep.mkInterval;
+       ctrls->mk_time_to_max = rep.mkTimeToMax;
+       ctrls->mk_max_speed = rep.mkMaxSpeed;
+       ctrls->mk_curve = rep.mkCurve;
+    }
+    if (which&XkbAccessXKeysMask)
+       ctrls->ax_options= rep.axOptions;
+    if (which&XkbStickyKeysMask) {
+       ctrls->ax_options &= ~XkbAX_SKOptionsMask;
+       ctrls->ax_options |= rep.axOptions & XkbAX_SKOptionsMask;
+    }
+    if (which&XkbAccessXFeedbackMask) {
+       ctrls->ax_options &= ~XkbAX_FBOptionsMask;
+       ctrls->ax_options |= rep.axOptions & XkbAX_FBOptionsMask;
+    }
+    if (which&XkbAccessXTimeoutMask) {
+       ctrls->ax_timeout = rep.axTimeout;
+       ctrls->axt_ctrls_mask = rep.axtCtrlsMask;
+       ctrls->axt_ctrls_values = rep.axtCtrlsValues;
+       ctrls->axt_opts_mask = rep.axtOptsMask;
+       ctrls->axt_opts_values= rep.axtOptsValues;
+    }
+    if (which&XkbPerKeyRepeatMask) {
+       memcpy(ctrls->per_key_repeat,rep.perKeyRepeat,
+                                         XkbPerKeyBitArraySize);
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return Success;
+}
+
+Bool
+XkbSetControls(Display *dpy, unsigned long which, XkbDescPtr xkb)
+{
+    register xkbSetControlsReq *req;
+    XkbControlsPtr     ctrls;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return False;
+    if ((!xkb)||(!xkb->ctrls))
+       return False;
+
+    ctrls= xkb->ctrls;
+    LockDisplay(dpy);
+    req= _XkbGetSetControlsReq(dpy,dpy->xkb_info,xkb->device_spec);
+    req->changeCtrls = (CARD32)which;
+    if (which&XkbInternalModsMask) {
+       req->affectInternalMods= ~0;
+       req->internalMods= ctrls->internal.real_mods;
+       req->affectInternalVMods = ~0;
+       req->internalVMods= ctrls->internal.vmods;
+    }
+    if (which&XkbIgnoreLockModsMask) {
+       req->affectIgnoreLockMods= ~0;
+       req->ignoreLockMods= ctrls->ignore_lock.real_mods;
+       req->affectIgnoreLockVMods= ~0;
+       req->ignoreLockVMods= ctrls->ignore_lock.vmods;
+    }
+    if (which&XkbControlsEnabledMask) {
+       req->affectEnabledCtrls= XkbAllBooleanCtrlsMask;
+       req->enabledCtrls= ctrls->enabled_ctrls;
+    }
+    if (which&XkbRepeatKeysMask) {
+       req->repeatDelay = ctrls->repeat_delay;
+       req->repeatInterval = ctrls->repeat_interval;
+    }
+    if (which&XkbSlowKeysMask)
+        req->slowKeysDelay = ctrls->slow_keys_delay;
+    if (which&XkbBounceKeysMask)
+        req->debounceDelay = ctrls->debounce_delay;
+    if (which&XkbMouseKeysMask) {
+       req->mkDfltBtn = ctrls->mk_dflt_btn;
+    }
+    if (which&XkbGroupsWrapMask)
+       req->groupsWrap= ctrls->groups_wrap;
+    if (which&(XkbAccessXKeysMask|XkbStickyKeysMask|XkbAccessXFeedbackMask))
+       req->axOptions= ctrls->ax_options;
+    if (which&XkbMouseKeysAccelMask) {
+       req->mkDelay = ctrls->mk_delay;
+       req->mkInterval = ctrls->mk_interval;
+       req->mkTimeToMax = ctrls->mk_time_to_max;
+       req->mkMaxSpeed = ctrls->mk_max_speed;
+       req->mkCurve = ctrls->mk_curve;
+    }
+    if (which&XkbAccessXTimeoutMask) {
+        req->axTimeout = ctrls->ax_timeout;
+        req->axtCtrlsMask = ctrls->axt_ctrls_mask;
+        req->axtCtrlsValues = ctrls->axt_ctrls_values;
+        req->axtOptsMask = ctrls->axt_opts_mask;
+        req->axtOptsValues=ctrls->axt_opts_values;
+    }
+    if (which&XkbPerKeyRepeatMask) {
+       memcpy(req->perKeyRepeat,ctrls->per_key_repeat,
+                                       XkbPerKeyBitArraySize);
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return True;
+}
+
+/***====================================================================***/
+
+void
+XkbNoteControlsChanges(        XkbControlsChangesPtr           old,
+                       XkbControlsNotifyEvent *        new,
+                       unsigned int                    wanted)
+{
+    old->changed_ctrls|= (new->changed_ctrls&wanted);
+    if (new->changed_ctrls&XkbControlsEnabledMask&wanted)
+       old->enabled_ctrls_changes^= new->enabled_ctrl_changes;
+    /* num_groups_changed?? */
+    return;
+}
diff --git a/src/xkb/XKBCvt.c b/src/xkb/XKBCvt.c
new file mode 100644 (file)
index 0000000..da74fc0
--- /dev/null
@@ -0,0 +1,337 @@
+/*
+
+Copyright 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 <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <X11/X.h>
+#include <X11/Xlib.h>
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "XlcPubI.h"
+#include "Ximint.h"
+#include <X11/Xutil.h>
+#include <X11/Xmd.h>
+#define XK_LATIN1
+#define XK_PUBLISHING
+#include <X11/keysym.h>
+#include <X11/extensions/XKBproto.h>
+#include "XKBlibint.h"
+#include <X11/Xlocale.h>
+#include <ctype.h>
+#include <X11/Xos.h>
+
+#ifdef __sgi_not_xconsortium
+#define        XKB_EXTEND_LOOKUP_STRING
+#endif
+
+static int
+_XkbHandleSpecialSym(KeySym keysym, char *buffer, int nbytes, int *extra_rtrn)
+{
+
+    /* try to convert to Latin-1, handling ctrl */
+    if (!(((keysym >= XK_BackSpace) && (keysym <= XK_Clear)) ||
+          (keysym == XK_Return) || (keysym == XK_Escape) ||
+          (keysym == XK_KP_Space) || (keysym == XK_KP_Tab) ||
+          (keysym == XK_KP_Enter) ||
+          ((keysym >= XK_KP_Multiply) && (keysym <= XK_KP_9)) ||
+          (keysym == XK_KP_Equal) ||
+          (keysym == XK_Delete)))
+       return 0;
+
+    if (nbytes<1) {
+       if (extra_rtrn)
+           *extra_rtrn= 1;
+       return 0;
+    }
+    /* if X keysym, convert to ascii by grabbing low 7 bits */
+    if (keysym == XK_KP_Space)
+        buffer[0] = XK_space & 0x7F; /* patch encoding botch */
+    else if (keysym == XK_hyphen)
+        buffer[0] = (char)(XK_minus & 0xFF); /* map to equiv character */
+    else buffer[0] = (char)(keysym & 0x7F);
+    return 1;
+}
+
+/*ARGSUSED*/
+static int
+_XkbKSToKnownSet (     XPointer        priv,
+                       KeySym          keysym,
+                       char *          buffer,
+                       int             nbytes,
+                       int *           extra_rtrn)
+{
+    char tbuf[8],*buf;
+
+    if (extra_rtrn)
+       *extra_rtrn= 0;
+
+    /* convert "dead" diacriticals for dumb applications */
+    if ( (keysym&0xffffff00)== 0xfe00 ) {
+       switch ( keysym ) {
+           case XK_dead_grave:         keysym = XK_grave; break;
+           case XK_dead_acute:         keysym = XK_acute; break;
+           case XK_dead_circumflex:    keysym = XK_asciicircum; break;
+           case XK_dead_tilde:         keysym = XK_asciitilde; break;
+           case XK_dead_macron:        keysym = XK_macron; break;
+           case XK_dead_breve:         keysym = XK_breve; break;
+           case XK_dead_abovedot:      keysym = XK_abovedot; break;
+           case XK_dead_diaeresis:     keysym = XK_diaeresis; break;
+           case XK_dead_abovering:     keysym = XK_degree; break;
+           case XK_dead_doubleacute:   keysym = XK_doubleacute; break;
+           case XK_dead_caron:         keysym = XK_caron; break;
+           case XK_dead_cedilla:       keysym = XK_cedilla; break;
+           case XK_dead_ogonek :       keysym = XK_ogonek; break;
+           case XK_dead_iota:          keysym = XK_Greek_iota; break;
+#ifdef XK_KATAKANA
+           case XK_dead_voiced_sound:  keysym = XK_voicedsound; break;
+           case XK_dead_semivoiced_sound:keysym = XK_semivoicedsound; break;
+#endif
+       }
+    }
+
+    if (nbytes<1)      buf= tbuf;
+    else               buf= buffer;
+
+    if ((keysym&0xffffff00)==0xff00) {
+       return _XkbHandleSpecialSym(keysym, buf, nbytes, extra_rtrn);
+    }
+    return _XimGetCharCode (priv, keysym, (unsigned char *)buf, nbytes);
+}
+
+typedef struct _XkbToKS {
+       unsigned         prefix;
+       char            *map;
+} XkbToKS;
+
+/*ARGSUSED*/
+static KeySym
+_XkbKnownSetToKS(XPointer priv,char *buffer,int nbytes,Status *status)
+{
+    if (nbytes!=1)
+       return NoSymbol;
+    if (((buffer[0]&0x80)==0)&&(buffer[0]>=32))
+       return buffer[0];
+    else if ((buffer[0]&0x7f)>=32) {
+       XkbToKS *map= (XkbToKS *)priv;
+       if ( map ) {
+           if ( map->map )     return map->prefix|map->map[buffer[0]&0x7f];
+           else                return map->prefix|buffer[0];
+       }
+       return buffer[0];
+    }
+    return NoSymbol;
+}
+
+static KeySym
+__XkbDefaultToUpper(KeySym sym)
+{
+    KeySym     lower,upper;
+
+    XConvertCase(sym, &lower, &upper);
+    return upper;
+}
+
+#ifdef XKB_EXTEND_LOOKUP_STRING
+static int
+Strcmp(char *str1, char *str2)
+{
+    char str[256];
+    char c, *s;
+
+    /*
+     * unchecked strings from the environment can end up here, so check
+     * the length before copying.
+     */
+    if (strlen(str1) >= sizeof(str)) /* almost certain it's a mismatch */
+       return 1;
+
+    for (s = str; (c = *str1++); ) {
+       if (isupper(c))
+           c = tolower(c);
+       *s++ = c;
+    }
+    *s = '\0';
+    return (strcmp(str, str2));
+}
+#endif
+
+int
+_XkbGetConverters(const char *encoding_name, XkbConverters *cvt_rtrn)
+{
+    if ( !cvt_rtrn ) return 0;
+
+    cvt_rtrn->KSToMB = _XkbKSToKnownSet;
+    cvt_rtrn->KSToMBPriv = _XimGetLocaleCode(encoding_name);
+    cvt_rtrn->MBToKS = _XkbKnownSetToKS;
+    cvt_rtrn->MBToKSPriv = NULL;
+    cvt_rtrn->KSToUpper = __XkbDefaultToUpper;
+    return 1;
+}
+
+/***====================================================================***/
+
+/*
+ * The function _XkbGetCharset seems to be missnamed as what it seems to
+ * be used for is to determine the encoding-name for the locale. ???
+ */
+
+#ifdef XKB_EXTEND_LOOKUP_STRING
+
+/*
+ * XKB_EXTEND_LOOKUP_STRING is not used by the SI. It is used by various
+ * X Consortium/X Project Team members, so we leave it in the source as
+ * an simplify integration by these companies.
+ */
+
+#define        CHARSET_FILE    "/usr/lib/X11/input/charsets"
+static char *_XkbKnownLanguages = "c=ascii:da,de,en,es,fr,is,it,nl,no,pt,sv=iso8859-1:hu,pl,cs=iso8859-2:eo=iso8859-3:sp=iso8859-5:ar,ara=iso8859-6:el=iso8859-7:he=iso8859-8:tr=iso8859-9:lt,lv=iso8859-13:et,fi=iso8859-15:ru=koi8-r:uk=koi8-u:th,th_TH,th_TH.iso8859-11=iso8859-11:th_TH.TIS620=tis620:hy=armscii-8:vi=tcvn-5712:ka=georgian-academy:be,bg=microsoft-cp1251";
+
+char   *
+_XkbGetCharset(void)
+{
+    /*
+     * PAGE USAGE TUNING: explicitly initialize to move these to data
+     * instead of bss
+     */
+    static char buf[100] = { 0 };
+    char lang[256];
+    char *start,*tmp,*end,*next,*set;
+    char *country,*charset;
+    char *locale;
+
+    tmp = getenv( "_XKB_CHARSET" );
+    if ( tmp )
+       return tmp;
+    locale = setlocale(LC_CTYPE,NULL);
+
+    if ( locale == NULL )
+       return NULL;
+
+    if (strlen(locale) >= sizeof(lang))
+       return NULL;
+
+    for (tmp = lang; *tmp = *locale++; tmp++) {
+       if (isupper(*tmp))
+           *tmp = tolower(*tmp);
+    }
+    country = strchr( lang, '_');
+    if ( country ) {
+       *country++ = '\0';
+       charset = strchr( country, '.' );
+       if ( charset )  *charset++ = '\0';
+       if ( charset ) {
+           strncpy(buf,charset,99);
+           buf[99] = '\0';
+           return buf;
+       }
+    }
+    else {
+       charset = NULL;
+    }
+
+    if ((tmp = getenv("_XKB_LOCALE_CHARSETS"))!=NULL) {
+       start = _XkbAlloc(strlen(tmp) + 1);
+       strcpy(start, tmp);
+       tmp = start;
+    } else {
+       struct stat sbuf;
+       FILE *file;
+#ifndef __UNIXOS2__
+       char *cf = CHARSET_FILE;
+#else
+        char *cf = __XOS2RedirRoot(CHARSET_FILE);
+#endif
+
+#ifndef S_ISREG
+# define S_ISREG(mode)   (((mode) & S_IFMT) == S_IFREG)
+#endif
+
+       if ( (stat(cf,&sbuf)==0) && S_ISREG(sbuf.st_mode) &&
+           (file = fopen(cf,"r")) ) {
+           tmp = _XkbAlloc(sbuf.st_size+1);
+           if (tmp!=NULL) {
+               sbuf.st_size = (long)fread(tmp,1,sbuf.st_size,file);
+               tmp[sbuf.st_size] = '\0';
+           }
+           fclose(file);
+       }
+    }
+
+    if ( tmp == NULL ) {
+       tmp = _XkbAlloc(strlen(_XkbKnownLanguages) + 1);
+       if (!tmp)
+           return NULL;
+       strcpy(tmp, _XkbKnownLanguages);
+    }
+    start = tmp;
+    do {
+       if ( (set=strchr(tmp,'=')) == NULL )
+           break;
+       *set++ = '\0';
+       if ( (next=strchr(set,':')) != NULL )
+           *next++ = '\0';
+       while ( tmp && *tmp ) {
+           if ( (end=strchr(tmp,',')) != NULL )
+               *end++ = '\0';
+           if ( Strcmp( tmp, lang ) == 0 ) {
+               strncpy(buf,set,100);
+               buf[99] = '\0';
+               Xfree(start);
+               return buf;
+           }
+           tmp = end;
+       }
+       tmp = next;
+    } while ( tmp && *tmp );
+    Xfree(start);
+    return NULL;
+}
+#else
+char   *
+_XkbGetCharset(void)
+{
+    char *tmp;
+    XLCd lcd;
+
+    tmp = getenv( "_XKB_CHARSET" );
+    if ( tmp )
+       return tmp;
+
+    lcd = _XlcCurrentLC();
+    if ( lcd )
+       return XLC_PUBLIC(lcd,encoding_name);
+
+    return NULL;
+}
+#endif
+
diff --git a/src/xkb/XKBExtDev.c b/src/xkb/XKBExtDev.c
new file mode 100644 (file)
index 0000000..353e769
--- /dev/null
@@ -0,0 +1,819 @@
+/************************************************************
+Copyright (c) 1995 by Silicon Graphics Computer Systems, Inc.
+
+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 Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS 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 <stdio.h>
+#define        NEED_MAP_READERS
+#include "Xlibint.h"
+#include <X11/extensions/XKBproto.h>
+#include "XKBlibint.h"
+#include <X11/extensions/XI.h>
+
+/***====================================================================***/
+
+extern void
+XkbNoteDeviceChanges(  XkbDeviceChangesPtr             old,
+                       XkbExtensionDeviceNotifyEvent * new,
+                       unsigned int                    wanted)
+{
+    if ((!old)||(!new)||(!wanted)||((new->reason&wanted)==0))
+       return;
+    if ((wanted&new->reason)&XkbXI_ButtonActionsMask) {
+       if (old->changed&XkbXI_ButtonActionsMask) {
+           int first,last,newLast;
+           if (new->first_btn<old->first_btn)
+                first= new->first_btn;
+           else first= old->first_btn;
+           last= old->first_btn+old->num_btns-1;
+           newLast= new->first_btn+new->num_btns-1;
+           if (newLast>last)
+               last= newLast;
+           old->first_btn= first;
+           old->num_btns= (last-first)+1;
+       }
+       else {
+           old->changed|= XkbXI_ButtonActionsMask;
+           old->first_btn= new->first_btn;
+           old->num_btns= new->num_btns;
+       }
+    }
+    if ((wanted&new->reason)&XkbXI_IndicatorsMask) {
+       XkbDeviceLedChangesPtr this;
+       if (old->changed&XkbXI_IndicatorsMask) {
+           XkbDeviceLedChangesPtr found;
+           found= NULL;
+           for (this= &old->leds;this&&(!found);this=this->next) {
+               if ((this->led_class==new->led_class)&&
+                                               (this->led_id==new->led_id)) {
+                   found= this;
+               }
+           }
+           if (!found) {
+               found= _XkbTypedCalloc(1,XkbDeviceLedChangesRec);
+               if (!found)
+                   return;
+               found->next= old->leds.next;
+               found->led_class= new->led_class;
+               found->led_id= new->led_id;
+               old->leds.next= found;
+           }
+           if ((wanted&new->reason)&XkbXI_IndicatorNamesMask)
+               found->defined= new->leds_defined;
+       }
+       else {
+           old->changed|= ((wanted&new->reason)&XkbXI_IndicatorsMask);
+           old->leds.led_class= new->led_class;
+           old->leds.led_id= new->led_id;
+           old->leds.defined= new->leds_defined;
+           if (old->leds.next) {
+               XkbDeviceLedChangesPtr next;
+               for (this=old->leds.next;this;this=next) {
+                   next= this->next;
+                   _XkbFree(this);
+               }
+               old->leds.next= NULL;
+           }
+       }
+    }
+    return;
+}
+
+/***====================================================================***/
+
+static Status
+_XkbReadDeviceLedInfo( XkbReadBufferPtr        buf,
+                       unsigned                present,
+                       XkbDeviceInfoPtr        devi)
+{
+register unsigned      i,bit;
+XkbDeviceLedInfoPtr    devli;
+xkbDeviceLedsWireDesc *        wireli;
+
+    wireli= _XkbGetTypedRdBufPtr(buf,1,xkbDeviceLedsWireDesc);
+    if (!wireli)
+       return BadLength;
+    devli= XkbAddDeviceLedInfo(devi,wireli->ledClass,wireli->ledID);
+    if (!devli)
+       return BadAlloc;
+    devli->phys_indicators=    wireli->physIndicators;
+
+    if (present&XkbXI_IndicatorStateMask)
+       devli->state= wireli->state;
+
+    if (present&XkbXI_IndicatorNamesMask) {
+       devli->names_present=   wireli->namesPresent;
+       if (devli->names_present) {
+           for (i=0,bit=1;i<XkbNumIndicators;i++,bit<<=1) {
+               if (wireli->namesPresent&bit) {
+                   if (!_XkbCopyFromReadBuffer(buf,(char *)&devli->names[i],4))
+                       return BadLength;
+               }
+           }
+       }
+    }
+
+    if (present&XkbXI_IndicatorMapsMask) {
+       devli->maps_present=    wireli->mapsPresent;
+       if (devli->maps_present) {
+           XkbIndicatorMapPtr          im;
+           xkbIndicatorMapWireDesc *   wireim;
+           for (i=0,bit=1;i<XkbNumIndicators;i++,bit<<=1) {
+               if (wireli->mapsPresent&bit) {
+                   wireim= _XkbGetTypedRdBufPtr(buf,1,xkbIndicatorMapWireDesc);
+                   if (!wireim)
+                       return BadAlloc;
+                   im= &devli->maps[i];
+                   im->flags=          wireim->flags;
+                   im->which_groups=   wireim->whichGroups;
+                   im->groups=         wireim->groups;
+                   im->which_mods=     wireim->whichMods;
+                   im->mods.mask=      wireim->mods;
+                   im->mods.real_mods= wireim->realMods;
+                   im->mods.vmods=     wireim->virtualMods;
+                   im->ctrls=          wireim->ctrls;
+               }
+           }
+       }
+    }
+    return Success;
+}
+
+static Status
+_XkbReadGetDeviceInfoReply(    Display *               dpy,
+                               xkbGetDeviceInfoReply * rep,
+                               XkbDeviceInfoPtr        devi)
+{
+XkbReadBufferRec       buf;
+XkbAction *            act;
+int                    tmp;
+
+    if (!_XkbInitReadBuffer(dpy,&buf,(int)rep->length*4))
+       return BadAlloc;
+
+    if ((rep->totalBtns>0)&&(rep->totalBtns!=devi->num_btns)) {
+       tmp= XkbResizeDeviceButtonActions(devi,rep->totalBtns);
+       if (tmp!=Success)
+           return tmp;
+    }
+    if (rep->nBtnsWanted>0) {
+       act= &devi->btn_acts[rep->firstBtnWanted];
+       bzero((char *)act,(rep->nBtnsWanted*sizeof(XkbAction)));
+    }
+    if (devi->name!=NULL)
+       _XkbFree(devi->name);
+    if (!_XkbGetReadBufferCountedString(&buf,&devi->name))
+       goto BAILOUT;
+    if (rep->nBtnsRtrn>0) {
+       int size;
+       act= &devi->btn_acts[rep->firstBtnRtrn];
+       size= rep->nBtnsRtrn*SIZEOF(xkbActionWireDesc);
+       if (!_XkbCopyFromReadBuffer(&buf,(char *)act,size))
+           goto BAILOUT;
+    }
+    if (rep->nDeviceLedFBs>0) {
+       register int            i;
+       for (i=0;i<rep->nDeviceLedFBs;i++) {
+           if ((tmp= _XkbReadDeviceLedInfo(&buf,rep->present,devi))!=Success)
+               return tmp;
+       }
+    }
+    tmp= _XkbFreeReadBuffer(&buf);
+    if (tmp)
+       fprintf(stderr,"GetDeviceInfo! Bad length (%d extra bytes)\n",tmp);
+    if (tmp || buf.error)
+       return BadLength;
+    return Success;
+BAILOUT:
+    _XkbFreeReadBuffer(&buf);
+    return BadLength;
+}
+
+XkbDeviceInfoPtr
+XkbGetDeviceInfo(      Display *       dpy,
+                       unsigned        which,
+                       unsigned        deviceSpec,
+                       unsigned        class,
+                       unsigned        id)
+{
+    register xkbGetDeviceInfoReq *     req;
+    xkbGetDeviceInfoReply              rep;
+    Status                             status;
+    XkbDeviceInfoPtr                   devi;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return NULL;
+    LockDisplay(dpy);
+    GetReq(kbGetDeviceInfo, req);
+    req->reqType = dpy->xkb_info->codes->major_opcode;
+    req->xkbReqType = X_kbGetDeviceInfo;
+    req->deviceSpec = deviceSpec;
+    req->wanted= which;
+    req->allBtns= ((which&XkbXI_ButtonActionsMask)!=0);
+    req->firstBtn= req->nBtns= 0;
+    req->ledClass= class;
+    req->ledID= id;
+    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return NULL;
+    }
+    devi= XkbAllocDeviceInfo(rep.deviceID,rep.totalBtns,rep.nDeviceLedFBs);
+    if (devi) {
+       devi->supported= rep.supported;
+       devi->unsupported= rep.unsupported;
+       devi->type= rep.devType;
+       devi->has_own_state= rep.hasOwnState;
+       devi->dflt_kbd_fb = rep.dfltKbdFB;
+       devi->dflt_led_fb = rep.dfltLedFB;
+       status= _XkbReadGetDeviceInfoReply(dpy,&rep,devi);
+       if (status!=Success) {
+           XkbFreeDeviceInfo(devi,XkbXI_AllDeviceFeaturesMask,True);
+           devi= NULL;
+       }
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return devi;
+}
+
+Status
+XkbGetDeviceInfoChanges(       Display *               dpy,
+                               XkbDeviceInfoPtr        devi,
+                               XkbDeviceChangesPtr     changes)
+{
+    register xkbGetDeviceInfoReq *     req;
+    xkbGetDeviceInfoReply              rep;
+    Status                             status;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return BadMatch;
+    if ((changes->changed&XkbXI_AllDeviceFeaturesMask)==0)
+       return Success;
+    changes->changed&= ~XkbXI_AllDeviceFeaturesMask;
+    status= Success;
+    LockDisplay(dpy);
+    while ((changes->changed)&&(status==Success)) {
+       GetReq(kbGetDeviceInfo, req);
+       req->reqType = dpy->xkb_info->codes->major_opcode;
+       req->xkbReqType = X_kbGetDeviceInfo;
+       req->deviceSpec = devi->device_spec;
+       req->wanted= changes->changed;
+       req->allBtns= False;
+       if (changes->changed&XkbXI_ButtonActionsMask) {
+            req->firstBtn= changes->first_btn;
+            req->nBtns=        changes->num_btns;
+            changes->changed&= ~XkbXI_ButtonActionsMask;
+       }
+       else req->firstBtn= req->nBtns= 0;
+       if (changes->changed&XkbXI_IndicatorsMask) {
+           req->ledClass= changes->leds.led_class;
+           req->ledID= changes->leds.led_id;
+           if (changes->leds.next==NULL)
+               changes->changed&= ~XkbXI_IndicatorsMask;
+           else {
+               XkbDeviceLedChangesPtr next;
+               next= changes->leds.next;
+               changes->leds= *next;
+               _XkbFree(next);
+           }
+       }
+       else {
+           req->ledClass= XkbDfltXIClass;
+           req->ledID= XkbDfltXIId;
+       }
+       if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
+           status= BadLength;
+           break;
+       }
+       devi->supported|= rep.supported;
+       devi->unsupported|= rep.unsupported;
+       devi->type= rep.devType;
+       status= _XkbReadGetDeviceInfoReply(dpy,&rep,devi);
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return status;
+}
+
+Status
+XkbGetDeviceButtonActions(     Display *               dpy,
+                               XkbDeviceInfoPtr        devi,
+                               Bool                    all,
+                               unsigned int            first,
+                               unsigned int            num)
+{
+    register xkbGetDeviceInfoReq *     req;
+    xkbGetDeviceInfoReply              rep;
+    Status                             status;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return BadMatch;
+    if (!devi)
+       return BadValue;
+    LockDisplay(dpy);
+    GetReq(kbGetDeviceInfo, req);
+    req->reqType = dpy->xkb_info->codes->major_opcode;
+    req->xkbReqType = X_kbGetDeviceInfo;
+    req->deviceSpec = devi->device_spec;
+    req->wanted= XkbXI_ButtonActionsMask;
+    req->allBtns= all;
+    req->firstBtn= first;
+    req->nBtns= num;
+    req->ledClass= XkbDfltXIClass;
+    req->ledID= XkbDfltXIId;
+    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return BadLength;
+    }
+    devi->type= rep.devType;
+    devi->supported= rep.supported;
+    devi->unsupported= rep.unsupported;
+    status= _XkbReadGetDeviceInfoReply(dpy,&rep,devi);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return status;
+}
+
+Status
+XkbGetDeviceLedInfo(   Display *               dpy,
+                       XkbDeviceInfoPtr        devi,
+                       unsigned int            ledClass,
+                       unsigned int            ledId,
+                       unsigned int            which)
+{
+    register xkbGetDeviceInfoReq *     req;
+    xkbGetDeviceInfoReply              rep;
+    Status                             status;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return BadMatch;
+    if (((which&XkbXI_IndicatorsMask)==0)||(which&(~XkbXI_IndicatorsMask)))
+       return BadMatch;
+    if (!devi)
+       return BadValue;
+    LockDisplay(dpy);
+    GetReq(kbGetDeviceInfo, req);
+    req->reqType = dpy->xkb_info->codes->major_opcode;
+    req->xkbReqType = X_kbGetDeviceInfo;
+    req->deviceSpec = devi->device_spec;
+    req->wanted= which;
+    req->allBtns= False;
+    req->firstBtn= req->nBtns= 0;
+    req->ledClass= ledClass;
+    req->ledID= ledId;
+    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return BadLength;
+    }
+    devi->type= rep.devType;
+    devi->supported= rep.supported;
+    devi->unsupported= rep.unsupported;
+    status= _XkbReadGetDeviceInfoReply(dpy,&rep,devi);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return status;
+}
+
+/***====================================================================***/
+
+typedef struct _LedInfoStuff {
+       Bool                    used;
+       XkbDeviceLedInfoPtr     devli;
+} LedInfoStuff;
+
+typedef struct _SetLedStuff {
+       unsigned                wanted;
+       int                     num_info;
+       int                     dflt_class;
+       LedInfoStuff *          dflt_kbd_fb;
+       LedInfoStuff *          dflt_led_fb;
+       LedInfoStuff *          info;
+} SetLedStuff;
+
+static void
+_InitLedStuff(SetLedStuff *stuff,unsigned wanted,XkbDeviceInfoPtr devi)
+{
+int                            i;
+register XkbDeviceLedInfoPtr   devli;
+
+    bzero(stuff,sizeof(SetLedStuff));
+    stuff->wanted= wanted;
+    stuff->dflt_class= XkbXINone;
+    if ((devi->num_leds<1)||((wanted&XkbXI_IndicatorsMask)==0))
+       return;
+    stuff->info= _XkbTypedCalloc(devi->num_leds,LedInfoStuff);
+    if (!stuff->info)
+       return;
+    stuff->num_info= devi->num_leds;
+    for (devli=&devi->leds[0],i=0;i<devi->num_leds;i++,devli++) {
+       stuff->info[i].devli= devli;
+       if (devli->led_class==KbdFeedbackClass) {
+           stuff->dflt_class= KbdFeedbackClass;
+           if (stuff->dflt_kbd_fb==NULL)
+               stuff->dflt_kbd_fb= &stuff->info[i];
+       }
+       else if (devli->led_class==LedFeedbackClass) {
+           if (stuff->dflt_class==XkbXINone)
+               stuff->dflt_class= LedFeedbackClass;
+           if (stuff->dflt_led_fb==NULL)
+               stuff->dflt_led_fb= &stuff->info[i];
+       }
+    }
+    return;
+}
+
+static void
+_FreeLedStuff(SetLedStuff *stuff)
+{
+    if ((stuff->num_info>0)&&(stuff->info!=NULL))
+       _XkbFree(stuff->info);
+    bzero(stuff,sizeof(SetLedStuff));
+    return;
+}
+
+static int
+_XkbSizeLedInfo(unsigned changed,XkbDeviceLedInfoPtr devli)
+{
+register int i,size;
+register unsigned bit,namesNeeded,mapsNeeded;
+
+    size= SIZEOF(xkbDeviceLedsWireDesc);
+    namesNeeded= mapsNeeded= 0;
+    if (changed&XkbXI_IndicatorNamesMask)
+       namesNeeded= devli->names_present;
+    if (changed&XkbXI_IndicatorMapsMask)
+       mapsNeeded= devli->maps_present;
+    if ((namesNeeded)||(mapsNeeded)) {
+       for (i=0,bit=1;i<XkbNumIndicators;i++,bit<<=1) {
+           if (namesNeeded&bit)
+               size+= 4; /* atoms are 4 bytes on the wire */
+           if (mapsNeeded&bit)
+               size+= SIZEOF(xkbIndicatorMapWireDesc);
+       }
+    }
+    return size;
+}
+
+static Bool
+_SizeMatches(  SetLedStuff *           stuff,
+               XkbDeviceLedChangesPtr  changes,
+               int *                   sz_rtrn,
+               int *                   nleds_rtrn)
+{
+int            i,nMatch,class,id;
+LedInfoStuff * linfo;
+Bool           match;
+
+    nMatch= 0;
+    class= changes->led_class;
+    id= changes->led_id;
+    if (class==XkbDfltXIClass)
+       class= stuff->dflt_class;
+    for (i=0,linfo=&stuff->info[0];i<stuff->num_info;i++,linfo++) {
+       XkbDeviceLedInfoPtr     devli;
+       LedInfoStuff *          dflt;
+
+       devli= linfo->devli;
+       match= ((class==devli->led_class)||(class==XkbAllXIClasses));
+       if (devli->led_class==KbdFeedbackClass) dflt= stuff->dflt_kbd_fb;
+       else                                    dflt= stuff->dflt_led_fb;
+       match = (match && (id == devli->led_id)) ||
+         (id == XkbAllXIIds) ||
+         ((id == XkbDfltXIId) &&
+          (linfo == dflt));
+       if (match) {
+           if (!linfo->used) {
+               *sz_rtrn+= _XkbSizeLedInfo(stuff->wanted,devli);
+               *nleds_rtrn+= 1;
+               linfo->used= True;
+               if ((class!=XkbAllXIClasses)&&(id!=XkbAllXIIds))
+                   return True;
+           }
+           nMatch++;
+           linfo->used= True;
+       }
+    }
+    return (nMatch>0);
+}
+
+/***====================================================================***/
+
+
+static Status
+_XkbSetDeviceInfoSize( XkbDeviceInfoPtr        devi,
+                       XkbDeviceChangesPtr     changes,
+                       SetLedStuff *           stuff,
+                       int *                   sz_rtrn,
+                       int *                   num_leds_rtrn)
+{
+    *sz_rtrn= 0;
+    if ((changes->changed&XkbXI_ButtonActionsMask)&&(changes->num_btns>0)) {
+       if (!XkbXI_LegalDevBtn(devi,(changes->first_btn+changes->num_btns-1)))
+           return BadMatch;
+       *sz_rtrn+= changes->num_btns*SIZEOF(xkbActionWireDesc);
+    }
+    else {
+       changes->changed&= ~XkbXI_ButtonActionsMask;
+       changes->first_btn= changes->num_btns= 0;
+    }
+    if ((changes->changed&XkbXI_IndicatorsMask)&&
+                               XkbLegalXILedClass(changes->leds.led_class)) {
+       XkbDeviceLedChangesPtr  leds;
+
+       for (leds=&changes->leds;leds!=NULL;leds= leds->next) {
+           if (!_SizeMatches(stuff,leds,sz_rtrn,num_leds_rtrn))
+               return BadMatch;
+       }
+    }
+    else {
+       changes->changed&= ~XkbXI_IndicatorsMask;
+       *num_leds_rtrn= 0;
+    }
+    return Success;
+}
+
+static char *
+_XkbWriteLedInfo(char *wire,unsigned changed,XkbDeviceLedInfoPtr devli)
+{
+register int           i;
+register unsigned      bit,namesNeeded,mapsNeeded;
+xkbDeviceLedsWireDesc *        lwire;
+
+    namesNeeded= mapsNeeded= 0;
+    if (changed&XkbXI_IndicatorNamesMask)
+       namesNeeded= devli->names_present;
+    if (changed&XkbXI_IndicatorMapsMask)
+       mapsNeeded= devli->maps_present;
+
+    lwire= (xkbDeviceLedsWireDesc *)wire;
+    lwire->ledClass= devli->led_class;
+    lwire->ledID= devli->led_id;
+    lwire->namesPresent= namesNeeded;
+    lwire->mapsPresent=  mapsNeeded;
+    lwire->physIndicators= devli->phys_indicators;
+    lwire->state= devli->state;
+    wire= (char *)&lwire[1];
+    if (namesNeeded) {
+       CARD32 *awire;
+       awire= (CARD32 *)wire;
+       for (i=0,bit=1;i<XkbNumIndicators;i++,bit<<=1) {
+           if (namesNeeded&bit) {
+               *awire= (CARD32)devli->names[i];
+               awire++;
+           }
+       }
+       wire= (char *)awire;
+    }
+    if (mapsNeeded) {
+       xkbIndicatorMapWireDesc *mwire;
+
+       mwire= (xkbIndicatorMapWireDesc *)wire;
+       for (i=0,bit=1;i<XkbNumIndicators;i++,bit<<=1) {
+           if (mapsNeeded&bit) {
+               XkbIndicatorMapPtr      map;
+               map=                    &devli->maps[i];
+               mwire->flags=           map->flags;
+               mwire->whichGroups=     map->which_groups;
+               mwire->groups=          map->groups;
+               mwire->whichMods=       map->which_mods;
+               mwire->mods=            map->mods.mask;
+               mwire->realMods=        map->mods.real_mods;
+               mwire->virtualMods=     map->mods.vmods;
+               mwire->ctrls=           map->ctrls;
+               mwire++;
+           }
+       }
+       wire= (char *)mwire;
+    }
+    return wire;
+}
+
+
+static int
+_XkbWriteSetDeviceInfo(        char *                  wire,
+                       XkbDeviceChangesPtr     changes,
+                       SetLedStuff *           stuff,
+                       XkbDeviceInfoPtr        devi)
+{
+char *start;
+
+    start= wire;
+    if (changes->changed&XkbXI_ButtonActionsMask) {
+       int                     size;
+       size= changes->num_btns*SIZEOF(xkbActionWireDesc);
+       memcpy(wire,(char *)&devi->btn_acts[changes->first_btn],size);
+       wire+= size;
+    }
+    if (changes->changed&XkbXI_IndicatorsMask) {
+       register int i;
+       register LedInfoStuff *linfo;
+
+       for (i=0,linfo=&stuff->info[0];i<stuff->num_info;i++,linfo++) {
+           if (linfo->used) {
+               register char *new_wire;
+               new_wire= _XkbWriteLedInfo(wire,stuff->wanted,linfo->devli);
+               if (!new_wire)
+                   return wire-start;
+               wire= new_wire;
+           }
+       }
+    }
+    return wire-start;
+}
+
+Bool
+XkbSetDeviceInfo(      Display *               dpy,
+                       unsigned                which,
+                       XkbDeviceInfoPtr        devi)
+{
+    register xkbSetDeviceInfoReq *req;
+    Status                     ok = 0;
+    int                                size,nLeds;
+    XkbInfoPtr                         xkbi;
+    XkbDeviceChangesRec                changes;
+    SetLedStuff                        lstuff;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return False;
+    if ((!devi) || (which&(~XkbXI_AllDeviceFeaturesMask)) ||
+       ((which&XkbXI_ButtonActionsMask)&&(!XkbXI_DevHasBtnActs(devi)))||
+       ((which&XkbXI_IndicatorsMask)&&(!XkbXI_DevHasLeds(devi))))
+       return False;
+
+    bzero((char *)&changes,sizeof(XkbDeviceChangesRec));
+    changes.changed= which;
+    changes.first_btn=         0;
+    changes.num_btns=          devi->num_btns;
+    changes.leds.led_class=    XkbAllXIClasses;
+    changes.leds.led_id=       XkbAllXIIds;
+    changes.leds.defined=      0;
+    size= nLeds=               0;
+    _InitLedStuff(&lstuff,changes.changed,devi);
+    if (_XkbSetDeviceInfoSize(devi,&changes,&lstuff,&size,&nLeds)!=Success)
+       return False;
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    GetReq(kbSetDeviceInfo, req);
+    req->length+=      size/4;
+    req->reqType=      xkbi->codes->major_opcode;
+    req->xkbReqType=   X_kbSetDeviceInfo;
+    req->deviceSpec=   devi->device_spec;
+    req->firstBtn=     changes.first_btn;
+    req->nBtns=                changes.num_btns;
+    req->change=       changes.changed;
+    req->nDeviceLedFBs=        nLeds;
+    if (size>0) {
+       char *  wire;
+       BufAlloc(char *,wire,size);
+       ok= (wire!=NULL)&&
+               (_XkbWriteSetDeviceInfo(wire,&changes,&lstuff,devi)==size);
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    _FreeLedStuff(&lstuff);
+    /* 12/11/95 (ef) -- XXX!! should clear changes here */
+    return ok;
+}
+
+Bool
+XkbChangeDeviceInfo(   Display *               dpy,
+                       XkbDeviceInfoPtr        devi,
+                       XkbDeviceChangesPtr     changes)
+{
+    register xkbSetDeviceInfoReq *req;
+    Status                     ok = 0;
+    int                                size,nLeds;
+    XkbInfoPtr                         xkbi;
+    SetLedStuff                        lstuff;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return False;
+    if ((!devi) || (changes->changed&(~XkbXI_AllDeviceFeaturesMask)) ||
+       ((changes->changed&XkbXI_ButtonActionsMask)&&
+                                       (!XkbXI_DevHasBtnActs(devi)))||
+       ((changes->changed&XkbXI_IndicatorsMask)&&(!XkbXI_DevHasLeds(devi))))
+       return False;
+
+    size= nLeds= 0;
+    _InitLedStuff(&lstuff,changes->changed,devi);
+    if (_XkbSetDeviceInfoSize(devi,changes,&lstuff,&size,&nLeds)!=Success)
+       return False;
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    GetReq(kbSetDeviceInfo, req);
+    req->length+=      size/4;
+    req->reqType=      xkbi->codes->major_opcode;
+    req->xkbReqType=   X_kbSetDeviceInfo;
+    req->deviceSpec=   devi->device_spec;
+    req->firstBtn=     changes->first_btn;
+    req->nBtns=                changes->num_btns;
+    req->change=       changes->changed;
+    req->nDeviceLedFBs=        nLeds;
+    if (size>0) {
+       char *  wire;
+       BufAlloc(char *,wire,size);
+       ok= (wire!=NULL)&&
+               (_XkbWriteSetDeviceInfo(wire,changes,&lstuff,devi)==size);
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    _FreeLedStuff(&lstuff);
+    /* 12/11/95 (ef) -- XXX!! should clear changes here */
+    return ok;
+}
+
+Bool
+XkbSetDeviceLedInfo(   Display *               dpy,
+                       XkbDeviceInfoPtr        devi,
+                       unsigned                ledClass,
+                       unsigned                ledID,
+                       unsigned                which)
+{
+    return False;
+}
+
+Bool
+XkbSetDeviceButtonActions(     Display *               dpy,
+                               XkbDeviceInfoPtr        devi,
+                               unsigned int            first,
+                               unsigned int            nBtns)
+{
+    register xkbSetDeviceInfoReq *req;
+    Status                     ok = 0;
+    int                                size,nLeds;
+    XkbInfoPtr                         xkbi;
+    XkbDeviceChangesRec                changes;
+    SetLedStuff                        lstuff;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return False;
+    if ((!devi)||(!XkbXI_DevHasBtnActs(devi))||(first+nBtns>devi->num_btns))
+       return False;
+    if (nBtns==0)
+       return True;
+
+    bzero((char *)&changes,sizeof(XkbDeviceChangesRec));
+    changes.changed=           XkbXI_ButtonActionsMask;
+    changes.first_btn=         first;
+    changes.num_btns=          nBtns;
+    changes.leds.led_class=    XkbXINone;
+    changes.leds.led_id=       XkbXINone;
+    changes.leds.defined=      0;
+    size= nLeds=               0;
+    if (_XkbSetDeviceInfoSize(devi,&changes,NULL,&size,&nLeds)!=Success)
+       return False;
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    GetReq(kbSetDeviceInfo, req);
+    req->length+=      size/4;
+    req->reqType=      xkbi->codes->major_opcode;
+    req->xkbReqType=   X_kbSetDeviceInfo;
+    req->deviceSpec=   devi->device_spec;
+    req->firstBtn=     changes.first_btn;
+    req->nBtns=                changes.num_btns;
+    req->change=       changes.changed;
+    req->nDeviceLedFBs=        nLeds;
+    if (size>0) {
+       char *  wire;
+       BufAlloc(char *,wire,size);
+       ok= (wire!=NULL)&&
+               (_XkbWriteSetDeviceInfo(wire,&changes,&lstuff,devi)==size);
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return ok;
+}
diff --git a/src/xkb/XKBGAlloc.c b/src/xkb/XKBGAlloc.c
new file mode 100644 (file)
index 0000000..7679496
--- /dev/null
@@ -0,0 +1,1011 @@
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+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 Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS 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_DIX_CONFIG_H
+#include <dix-config.h>
+#elif defined(HAVE_CONFIG_H)
+#include <config.h>
+#endif
+
+#ifndef XKB_IN_SERVER
+
+#include <stdio.h>
+#include "Xlibint.h"
+#include "XKBlibint.h"
+#include <X11/extensions/XKBgeom.h>
+#include <X11/extensions/XKBproto.h>
+
+#else
+
+#include <stdio.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include "misc.h"
+#include "inputstr.h"
+#include <X11/extensions/XKBsrv.h>
+#include <X11/extensions/XKBgeom.h>
+
+#endif /* XKB_IN_SERVER */
+
+#ifdef X_NOT_POSIX
+#define Size_t unsigned int
+#else
+#define Size_t size_t
+#endif
+
+/***====================================================================***/
+
+static void
+_XkbFreeGeomLeafElems( Bool                    freeAll,
+                       int                     first,
+                       int                     count,
+                       unsigned short *        num_inout,
+                       unsigned short *        sz_inout,
+                       char **                 elems,
+                       unsigned int            elem_sz)
+{
+    if ((freeAll)||(*elems==NULL)) {
+       *num_inout= *sz_inout= 0;
+       if (*elems!=NULL) {
+           _XkbFree(*elems);
+           *elems= NULL;
+       }
+       return;
+    }
+
+    if ((first>=(*num_inout))||(first<0)||(count<1))
+       return;
+
+    if (first+count>=(*num_inout)) {
+       /* truncating the array is easy */
+       (*num_inout)= first;
+    }
+    else {
+       char *  ptr;
+       int     extra;
+       ptr= *elems;
+       extra= ((*num_inout)-(first+count))*elem_sz;
+       if (extra>0)
+           memmove(&ptr[first*elem_sz],&ptr[(first+count)*elem_sz],extra);
+       (*num_inout)-= count;
+    }
+    return;
+}
+
+typedef void (*ContentsClearFunc)(
+               char *          /* priv */
+);
+
+static void
+_XkbFreeGeomNonLeafElems(      Bool                    freeAll,
+                               int                     first,
+                               int                     count,
+                               unsigned short *        num_inout,
+                               unsigned short *        sz_inout,
+                               char **                 elems,
+                               unsigned int            elem_sz,
+                               ContentsClearFunc       freeFunc)
+{
+register int i;
+register char *ptr;
+
+    if (freeAll) {
+       first= 0;
+       count= (*num_inout);
+    }
+    else if ((first>=(*num_inout))||(first<0)||(count<1))
+       return;
+    else if (first+count>(*num_inout))
+       count= (*num_inout)-first;
+    if (*elems==NULL)
+       return;
+
+    if (freeFunc) {
+       ptr= *elems;
+       ptr+= first*elem_sz;
+       for (i=0;i<count;i++) {
+           (*freeFunc)(ptr);
+           ptr+= elem_sz;
+       }
+    }
+    if (freeAll) {
+       (*num_inout)= (*sz_inout)= 0;
+       if (*elems) {
+           _XkbFree(*elems);
+           *elems= NULL;
+       }
+    }
+    else if (first+count>=(*num_inout))
+       *num_inout= first;
+    else {
+       i= ((*num_inout)-(first+count))*elem_sz;
+       ptr= *elems;
+       memmove(&ptr[first*elem_sz],&ptr[(first+count)*elem_sz],i);
+       (*num_inout)-= count;
+    }
+    return;
+}
+
+/***====================================================================***/
+
+static void
+_XkbClearProperty(char *prop_in)
+{
+XkbPropertyPtr prop= (XkbPropertyPtr)prop_in;
+
+    if (prop->name) {
+       _XkbFree(prop->name);
+       prop->name= NULL;
+    }
+    if (prop->value) {
+       _XkbFree(prop->value);
+       prop->value= NULL;
+    }
+    return;
+}
+
+void
+XkbFreeGeomProperties( XkbGeometryPtr  geom,
+                       int             first,
+                       int             count,
+                       Bool            freeAll)
+{
+    _XkbFreeGeomNonLeafElems(freeAll,first,count,
+                               &geom->num_properties,&geom->sz_properties,
+                               (char **)&geom->properties,
+                               sizeof(XkbPropertyRec),_XkbClearProperty);
+    return;
+}
+
+/***====================================================================***/
+
+void
+XkbFreeGeomKeyAliases( XkbGeometryPtr  geom,
+                       int             first,
+                       int             count,
+                       Bool            freeAll)
+{
+    _XkbFreeGeomLeafElems(freeAll,first,count,
+                               &geom->num_key_aliases,&geom->sz_key_aliases,
+                               (char **)&geom->key_aliases,
+                               sizeof(XkbKeyAliasRec));
+    return;
+}
+
+/***====================================================================***/
+
+static void
+_XkbClearColor(char *color_in)
+{
+XkbColorPtr    color= (XkbColorPtr)color_in;
+
+    if (color->spec)
+       _XkbFree(color->spec);
+    return;
+}
+
+void
+XkbFreeGeomColors(XkbGeometryPtr geom,int first,int count,Bool freeAll)
+{
+    _XkbFreeGeomNonLeafElems(freeAll,first,count,
+                               &geom->num_colors,&geom->sz_colors,
+                               (char **)&geom->colors,
+                               sizeof(XkbColorRec),_XkbClearColor);
+    return;
+}
+
+/***====================================================================***/
+
+void
+XkbFreeGeomPoints(XkbOutlinePtr outline,int first,int count,Bool freeAll)
+{
+    _XkbFreeGeomLeafElems(freeAll,first,count,
+                               &outline->num_points,&outline->sz_points,
+                               (char **)&outline->points,
+                               sizeof(XkbPointRec));
+    return;
+}
+
+/***====================================================================***/
+
+static void
+_XkbClearOutline(char *outline_in)
+{
+XkbOutlinePtr  outline= (XkbOutlinePtr)outline_in;
+
+    if (outline->points!=NULL)
+       XkbFreeGeomPoints(outline,0,outline->num_points,True);
+    return;
+}
+
+void
+XkbFreeGeomOutlines(XkbShapePtr        shape,int first,int count,Bool freeAll)
+{
+    _XkbFreeGeomNonLeafElems(freeAll,first,count,
+                               &shape->num_outlines,&shape->sz_outlines,
+                               (char **)&shape->outlines,
+                               sizeof(XkbOutlineRec),_XkbClearOutline);
+
+    return;
+}
+
+/***====================================================================***/
+
+static void
+_XkbClearShape(char *shape_in)
+{
+XkbShapePtr    shape= (XkbShapePtr)shape_in;
+
+    if (shape->outlines)
+       XkbFreeGeomOutlines(shape,0,shape->num_outlines,True);
+    return;
+}
+
+void
+XkbFreeGeomShapes(XkbGeometryPtr geom,int first,int count,Bool freeAll)
+{
+    _XkbFreeGeomNonLeafElems(freeAll,first,count,
+                               &geom->num_shapes,&geom->sz_shapes,
+                               (char **)&geom->shapes,
+                               sizeof(XkbShapeRec),_XkbClearShape);
+    return;
+}
+
+/***====================================================================***/
+
+void
+XkbFreeGeomOverlayKeys(XkbOverlayRowPtr row,int first,int count,Bool freeAll)
+{
+    _XkbFreeGeomLeafElems(freeAll,first,count,
+                               &row->num_keys,&row->sz_keys,
+                               (char **)&row->keys,
+                               sizeof(XkbOverlayKeyRec));
+    return;
+}
+
+/***====================================================================***/
+
+static void
+_XkbClearOverlayRow(char *row_in)
+{
+XkbOverlayRowPtr       row= (XkbOverlayRowPtr)row_in;
+
+    if (row->keys!=NULL)
+       XkbFreeGeomOverlayKeys(row,0,row->num_keys,True);
+    return;
+}
+
+void
+XkbFreeGeomOverlayRows(XkbOverlayPtr overlay,int first,int count,Bool freeAll)
+{
+    _XkbFreeGeomNonLeafElems(freeAll,first,count,
+                               &overlay->num_rows,&overlay->sz_rows,
+                               (char **)&overlay->rows,
+                               sizeof(XkbOverlayRowRec),_XkbClearOverlayRow);
+    return;
+}
+
+/***====================================================================***/
+
+static void
+_XkbClearOverlay(char *overlay_in)
+{
+XkbOverlayPtr  overlay= (XkbOverlayPtr)overlay_in;
+
+    if (overlay->rows!=NULL)
+       XkbFreeGeomOverlayRows(overlay,0,overlay->num_rows,True);
+    return;
+}
+
+void
+XkbFreeGeomOverlays(XkbSectionPtr section,int first,int        count,Bool freeAll)
+{
+    _XkbFreeGeomNonLeafElems(freeAll,first,count,
+                               &section->num_overlays,&section->sz_overlays,
+                               (char **)&section->overlays,
+                               sizeof(XkbOverlayRec),_XkbClearOverlay);
+    return;
+}
+
+/***====================================================================***/
+
+void
+XkbFreeGeomKeys(XkbRowPtr row,int first,int count,Bool freeAll)
+{
+    _XkbFreeGeomLeafElems(freeAll,first,count,
+                               &row->num_keys,&row->sz_keys,
+                               (char **)&row->keys,
+                               sizeof(XkbKeyRec));
+    return;
+}
+
+/***====================================================================***/
+
+static void
+_XkbClearRow(char *row_in)
+{
+XkbRowPtr      row= (XkbRowPtr)row_in;
+
+    if (row->keys!=NULL)
+       XkbFreeGeomKeys(row,0,row->num_keys,True);
+    return;
+}
+
+void
+XkbFreeGeomRows(XkbSectionPtr section,int first,int count,Bool freeAll)
+{
+    _XkbFreeGeomNonLeafElems(freeAll,first,count,
+                               &section->num_rows,&section->sz_rows,
+                               (char **)&section->rows,
+                               sizeof(XkbRowRec),_XkbClearRow);
+}
+
+/***====================================================================***/
+
+static void
+_XkbClearSection(char *section_in)
+{
+XkbSectionPtr  section= (XkbSectionPtr)section_in;
+
+    if (section->rows!=NULL)
+       XkbFreeGeomRows(section,0,section->num_rows,True);
+    if (section->doodads!=NULL) {
+       XkbFreeGeomDoodads(section->doodads,section->num_doodads,True);
+       section->doodads= NULL;
+    }
+    return;
+}
+
+void
+XkbFreeGeomSections(XkbGeometryPtr geom,int first,int count,Bool freeAll)
+{
+    _XkbFreeGeomNonLeafElems(freeAll,first,count,
+                               &geom->num_sections,&geom->sz_sections,
+                               (char **)&geom->sections,
+                               sizeof(XkbSectionRec),_XkbClearSection);
+    return;
+}
+
+/***====================================================================***/
+
+static void
+_XkbClearDoodad(char *doodad_in)
+{
+XkbDoodadPtr   doodad= (XkbDoodadPtr)doodad_in;
+
+    switch (doodad->any.type) {
+       case XkbTextDoodad:
+           {
+               if (doodad->text.text!=NULL) {
+                   _XkbFree(doodad->text.text);
+                   doodad->text.text= NULL;
+               }
+               if (doodad->text.font!=NULL) {
+                   _XkbFree(doodad->text.font);
+                   doodad->text.font= NULL;
+               }
+           }
+           break;
+       case XkbLogoDoodad:
+           {
+               if (doodad->logo.logo_name!=NULL) {
+                   _XkbFree(doodad->logo.logo_name);
+                   doodad->logo.logo_name= NULL;
+               }
+           }
+           break;
+    }
+    return;
+}
+
+void
+XkbFreeGeomDoodads(XkbDoodadPtr doodads,int nDoodads,Bool freeAll)
+{
+register int           i;
+register XkbDoodadPtr  doodad;
+
+    if (doodads) {
+       for (i=0,doodad= doodads;i<nDoodads;i++,doodad++) {
+           _XkbClearDoodad((char *)doodad);
+       }
+       if (freeAll)
+           _XkbFree(doodads);
+    }
+    return;
+}
+
+void
+XkbFreeGeometry(XkbGeometryPtr geom,unsigned which,Bool freeMap)
+{
+    if (geom==NULL)
+       return;
+    if (freeMap)
+       which= XkbGeomAllMask;
+    if ((which&XkbGeomPropertiesMask)&&(geom->properties!=NULL))
+       XkbFreeGeomProperties(geom,0,geom->num_properties,True);
+    if ((which&XkbGeomColorsMask)&&(geom->colors!=NULL))
+       XkbFreeGeomColors(geom,0,geom->num_colors,True);
+    if ((which&XkbGeomShapesMask)&&(geom->shapes!=NULL))
+       XkbFreeGeomShapes(geom,0,geom->num_shapes,True);
+    if ((which&XkbGeomSectionsMask)&&(geom->sections!=NULL))
+       XkbFreeGeomSections(geom,0,geom->num_sections,True);
+    if ((which&XkbGeomDoodadsMask)&&(geom->doodads!= NULL)) {
+       XkbFreeGeomDoodads(geom->doodads,geom->num_doodads,True);
+       geom->doodads= NULL;
+       geom->num_doodads= geom->sz_doodads= 0;
+    }
+    if ((which&XkbGeomKeyAliasesMask)&&(geom->key_aliases!=NULL))
+       XkbFreeGeomKeyAliases(geom,0,geom->num_key_aliases,True);
+    if (freeMap) {
+       if (geom->label_font!=NULL) {
+           _XkbFree(geom->label_font);
+           geom->label_font= NULL;
+       }
+       _XkbFree(geom);
+    }
+    return;
+}
+
+/***====================================================================***/
+
+static Status
+_XkbGeomAlloc( XPointer *              old,
+               unsigned short *        num,
+               unsigned short *        total,
+               int                     num_new,
+               Size_t                  sz_elem)
+{
+    if (num_new<1)
+       return Success;
+    if ((*old)==NULL)
+       *num= *total= 0;
+
+    if ((*num)+num_new<=(*total))
+       return Success;
+
+    *total= (*num)+num_new;
+    if ((*old)!=NULL)
+        (*old)= (XPointer)_XkbRealloc((*old),(*total)*sz_elem);
+    else (*old)= (XPointer)_XkbCalloc((*total),sz_elem);
+    if ((*old)==NULL) {
+       *total= *num= 0;
+       return BadAlloc;
+    }
+
+    if (*num>0) {
+       char *tmp= (char *)(*old);
+       bzero(&tmp[sz_elem*(*num)],(num_new*sz_elem));
+    }
+    return Success;
+}
+
+#define        _XkbAllocProps(g,n) _XkbGeomAlloc((XPointer *)&(g)->properties,\
+                               &(g)->num_properties,&(g)->sz_properties,\
+                               (n),sizeof(XkbPropertyRec))
+#define        _XkbAllocColors(g,n) _XkbGeomAlloc((XPointer *)&(g)->colors,\
+                               &(g)->num_colors,&(g)->sz_colors,\
+                               (n),sizeof(XkbColorRec))
+#define        _XkbAllocShapes(g,n) _XkbGeomAlloc((XPointer *)&(g)->shapes,\
+                               &(g)->num_shapes,&(g)->sz_shapes,\
+                               (n),sizeof(XkbShapeRec))
+#define        _XkbAllocSections(g,n) _XkbGeomAlloc((XPointer *)&(g)->sections,\
+                               &(g)->num_sections,&(g)->sz_sections,\
+                               (n),sizeof(XkbSectionRec))
+#define        _XkbAllocDoodads(g,n) _XkbGeomAlloc((XPointer *)&(g)->doodads,\
+                               &(g)->num_doodads,&(g)->sz_doodads,\
+                               (n),sizeof(XkbDoodadRec))
+#define        _XkbAllocKeyAliases(g,n) _XkbGeomAlloc((XPointer *)&(g)->key_aliases,\
+                               &(g)->num_key_aliases,&(g)->sz_key_aliases,\
+                               (n),sizeof(XkbKeyAliasRec))
+
+#define        _XkbAllocOutlines(s,n) _XkbGeomAlloc((XPointer *)&(s)->outlines,\
+                               &(s)->num_outlines,&(s)->sz_outlines,\
+                               (n),sizeof(XkbOutlineRec))
+#define        _XkbAllocRows(s,n) _XkbGeomAlloc((XPointer *)&(s)->rows,\
+                               &(s)->num_rows,&(s)->sz_rows,\
+                               (n),sizeof(XkbRowRec))
+#define        _XkbAllocPoints(o,n) _XkbGeomAlloc((XPointer *)&(o)->points,\
+                               &(o)->num_points,&(o)->sz_points,\
+                               (n),sizeof(XkbPointRec))
+#define        _XkbAllocKeys(r,n) _XkbGeomAlloc((XPointer *)&(r)->keys,\
+                               &(r)->num_keys,&(r)->sz_keys,\
+                               (n),sizeof(XkbKeyRec))
+#define        _XkbAllocOverlays(s,n) _XkbGeomAlloc((XPointer *)&(s)->overlays,\
+                               &(s)->num_overlays,&(s)->sz_overlays,\
+                               (n),sizeof(XkbOverlayRec))
+#define        _XkbAllocOverlayRows(o,n) _XkbGeomAlloc((XPointer *)&(o)->rows,\
+                               &(o)->num_rows,&(o)->sz_rows,\
+                               (n),sizeof(XkbOverlayRowRec))
+#define        _XkbAllocOverlayKeys(r,n) _XkbGeomAlloc((XPointer *)&(r)->keys,\
+                               &(r)->num_keys,&(r)->sz_keys,\
+                               (n),sizeof(XkbOverlayKeyRec))
+
+Status
+XkbAllocGeomProps(XkbGeometryPtr geom,int nProps)
+{
+    return _XkbAllocProps(geom,nProps);
+}
+
+Status
+XkbAllocGeomColors(XkbGeometryPtr geom,int nColors)
+{
+    return _XkbAllocColors(geom,nColors);
+}
+
+Status
+XkbAllocGeomKeyAliases(XkbGeometryPtr geom,int nKeyAliases)
+{
+    return _XkbAllocKeyAliases(geom,nKeyAliases);
+}
+
+Status
+XkbAllocGeomShapes(XkbGeometryPtr geom,int nShapes)
+{
+    return _XkbAllocShapes(geom,nShapes);
+}
+
+Status
+XkbAllocGeomSections(XkbGeometryPtr geom,int nSections)
+{
+    return _XkbAllocSections(geom,nSections);
+}
+
+Status
+XkbAllocGeomOverlays(XkbSectionPtr section,int nOverlays)
+{
+    return _XkbAllocOverlays(section,nOverlays);
+}
+
+Status
+XkbAllocGeomOverlayRows(XkbOverlayPtr overlay,int nRows)
+{
+    return _XkbAllocOverlayRows(overlay,nRows);
+}
+
+Status
+XkbAllocGeomOverlayKeys(XkbOverlayRowPtr row,int nKeys)
+{
+    return _XkbAllocOverlayKeys(row,nKeys);
+}
+
+Status
+XkbAllocGeomDoodads(XkbGeometryPtr geom,int nDoodads)
+{
+    return _XkbAllocDoodads(geom,nDoodads);
+}
+
+Status
+XkbAllocGeomSectionDoodads(XkbSectionPtr section,int nDoodads)
+{
+    return _XkbAllocDoodads(section,nDoodads);
+}
+
+Status
+XkbAllocGeomOutlines(XkbShapePtr shape,int nOL)
+{
+    return _XkbAllocOutlines(shape,nOL);
+}
+
+Status
+XkbAllocGeomRows(XkbSectionPtr section,int nRows)
+{
+    return _XkbAllocRows(section,nRows);
+}
+
+Status
+XkbAllocGeomPoints(XkbOutlinePtr ol,int nPts)
+{
+    return _XkbAllocPoints(ol,nPts);
+}
+
+Status
+XkbAllocGeomKeys(XkbRowPtr row,int nKeys)
+{
+    return _XkbAllocKeys(row,nKeys);
+}
+
+Status
+XkbAllocGeometry(XkbDescPtr xkb,XkbGeometrySizesPtr sizes)
+{
+XkbGeometryPtr geom;
+Status         rtrn;
+
+    if (xkb->geom==NULL) {
+       xkb->geom= _XkbTypedCalloc(1,XkbGeometryRec);
+       if (!xkb->geom)
+           return BadAlloc;
+    }
+    geom= xkb->geom;
+    if ((sizes->which&XkbGeomPropertiesMask)&&
+       ((rtrn=_XkbAllocProps(geom,sizes->num_properties))!=Success)) {
+       goto BAIL;
+    }
+    if ((sizes->which&XkbGeomColorsMask)&&
+       ((rtrn=_XkbAllocColors(geom,sizes->num_colors))!=Success)) {
+       goto BAIL;
+    }
+    if ((sizes->which&XkbGeomShapesMask)&&
+       ((rtrn=_XkbAllocShapes(geom,sizes->num_shapes))!=Success)) {
+       goto BAIL;
+    }
+    if ((sizes->which&XkbGeomSectionsMask)&&
+       ((rtrn=_XkbAllocSections(geom,sizes->num_sections))!=Success)) {
+       goto BAIL;
+    }
+    if ((sizes->which&XkbGeomDoodadsMask)&&
+       ((rtrn=_XkbAllocDoodads(geom,sizes->num_doodads))!=Success)) {
+       goto BAIL;
+    }
+    if ((sizes->which&XkbGeomKeyAliasesMask)&&
+       ((rtrn=_XkbAllocKeyAliases(geom,sizes->num_key_aliases))!=Success)) {
+       goto BAIL;
+    }
+    return Success;
+BAIL:
+    XkbFreeGeometry(geom,XkbGeomAllMask,True);
+    xkb->geom= NULL;
+    return rtrn;
+}
+
+/***====================================================================***/
+
+XkbPropertyPtr
+XkbAddGeomProperty(XkbGeometryPtr geom,char *name,char *value)
+{
+register int i;
+register XkbPropertyPtr prop;
+
+    if ((!geom)||(!name)||(!value))
+       return NULL;
+    for (i=0,prop=geom->properties;i<geom->num_properties;i++,prop++) {
+       if ((prop->name)&&(strcmp(name,prop->name)==0)) {
+           if (prop->value)
+               _XkbFree(prop->value);
+           prop->value= strdup(value);
+           return prop;
+       }
+    }
+    if ((geom->num_properties>=geom->sz_properties)&&
+                                       (_XkbAllocProps(geom,1)!=Success)) {
+       return NULL;
+    }
+    prop= &geom->properties[geom->num_properties];
+    prop->name= strdup(name);
+    if (!prop->name)
+       return NULL;
+    prop->value= strdup(value);
+    if (!prop->value) {
+       _XkbFree(prop->name);
+       prop->name= NULL;
+       return NULL;
+    }
+    geom->num_properties++;
+    return prop;
+}
+
+XkbKeyAliasPtr
+XkbAddGeomKeyAlias(XkbGeometryPtr geom,char *aliasStr,char *realStr)
+{
+register int i;
+register XkbKeyAliasPtr alias;
+
+    if ((!geom)||(!aliasStr)||(!realStr)||(!aliasStr[0])||(!realStr[0]))
+       return NULL;
+    for (i=0,alias=geom->key_aliases;i<geom->num_key_aliases;i++,alias++) {
+       if (strncmp(alias->alias,aliasStr,XkbKeyNameLength)==0) {
+           bzero(alias->real,XkbKeyNameLength);
+           strncpy(alias->real,realStr,XkbKeyNameLength);
+           return alias;
+       }
+    }
+    if ((geom->num_key_aliases>=geom->sz_key_aliases)&&
+                               (_XkbAllocKeyAliases(geom,1)!=Success)) {
+       return NULL;
+    }
+    alias= &geom->key_aliases[geom->num_key_aliases];
+    bzero(alias,sizeof(XkbKeyAliasRec));
+    strncpy(alias->alias,aliasStr,XkbKeyNameLength);
+    strncpy(alias->real,realStr,XkbKeyNameLength);
+    geom->num_key_aliases++;
+    return alias;
+}
+
+XkbColorPtr
+XkbAddGeomColor(XkbGeometryPtr geom,char *spec,unsigned int pixel)
+{
+register int i;
+register XkbColorPtr color;
+
+    if ((!geom)||(!spec))
+       return NULL;
+    for (i=0,color=geom->colors;i<geom->num_colors;i++,color++) {
+       if ((color->spec)&&(strcmp(color->spec,spec)==0)) {
+           color->pixel= pixel;
+           return color;
+       }
+    }
+    if ((geom->num_colors>=geom->sz_colors)&&
+                                       (_XkbAllocColors(geom,1)!=Success)) {
+       return NULL;
+    }
+    color= &geom->colors[geom->num_colors];
+    color->pixel= pixel;
+    color->spec= strdup(spec);
+    if (!color->spec)
+       return NULL;
+    geom->num_colors++;
+    return color;
+}
+
+XkbOutlinePtr
+XkbAddGeomOutline(XkbShapePtr shape,int sz_points)
+{
+XkbOutlinePtr  outline;
+
+    if ((!shape)||(sz_points<0))
+       return NULL;
+    if ((shape->num_outlines>=shape->sz_outlines)&&
+                                       (_XkbAllocOutlines(shape,1)!=Success)) {
+       return NULL;
+    }
+    outline= &shape->outlines[shape->num_outlines];
+    bzero(outline,sizeof(XkbOutlineRec));
+    if ((sz_points>0)&&(_XkbAllocPoints(outline,sz_points)!=Success))
+       return NULL;
+    shape->num_outlines++;
+    return outline;
+}
+
+XkbShapePtr
+XkbAddGeomShape(XkbGeometryPtr geom,Atom name,int sz_outlines)
+{
+XkbShapePtr    shape;
+register int   i;
+
+    if ((!geom)||(!name)||(sz_outlines<0))
+       return NULL;
+    if (geom->num_shapes>0) {
+       for (shape=geom->shapes,i=0;i<geom->num_shapes;i++,shape++) {
+           if (name==shape->name)
+               return shape;
+       }
+    }
+    if ((geom->num_shapes>=geom->sz_shapes)&&
+                                       (_XkbAllocShapes(geom,1)!=Success))
+       return NULL;
+    shape= &geom->shapes[geom->num_shapes];
+    bzero(shape,sizeof(XkbShapeRec));
+    if ((sz_outlines>0)&&(_XkbAllocOutlines(shape,sz_outlines)!=Success))
+       return NULL;
+    shape->name= name;
+    shape->primary= shape->approx= NULL;
+    geom->num_shapes++;
+    return shape;
+}
+
+XkbKeyPtr
+XkbAddGeomKey(XkbRowPtr row)
+{
+XkbKeyPtr      key;
+    if (!row)
+       return NULL;
+    if ((row->num_keys>=row->sz_keys)&&(_XkbAllocKeys(row,1)!=Success))
+       return NULL;
+    key= &row->keys[row->num_keys++];
+    bzero(key,sizeof(XkbKeyRec));
+    return key;
+}
+
+XkbRowPtr
+XkbAddGeomRow(XkbSectionPtr section,int sz_keys)
+{
+XkbRowPtr      row;
+
+    if ((!section)||(sz_keys<0))
+       return NULL;
+    if ((section->num_rows>=section->sz_rows)&&
+                                       (_XkbAllocRows(section,1)!=Success))
+       return NULL;
+    row= &section->rows[section->num_rows];
+    bzero(row,sizeof(XkbRowRec));
+    if ((sz_keys>0)&&(_XkbAllocKeys(row,sz_keys)!=Success))
+       return NULL;
+    section->num_rows++;
+    return row;
+}
+
+XkbSectionPtr
+XkbAddGeomSection(     XkbGeometryPtr  geom,
+                       Atom            name,
+                       int             sz_rows,
+                       int             sz_doodads,
+                       int             sz_over)
+{
+register int   i;
+XkbSectionPtr  section;
+
+    if ((!geom)||(name==None)||(sz_rows<0))
+       return NULL;
+    for (i=0,section=geom->sections;i<geom->num_sections;i++,section++) {
+       if (section->name!=name)
+           continue;
+       if (((sz_rows>0)&&(_XkbAllocRows(section,sz_rows)!=Success))||
+           ((sz_doodads>0)&&(_XkbAllocDoodads(section,sz_doodads)!=Success))||
+           ((sz_over>0)&&(_XkbAllocOverlays(section,sz_over)!=Success)))
+           return NULL;
+       return section;
+    }
+    if ((geom->num_sections>=geom->sz_sections)&&
+                                       (_XkbAllocSections(geom,1)!=Success))
+       return NULL;
+    section= &geom->sections[geom->num_sections];
+    if ((sz_rows>0)&&(_XkbAllocRows(section,sz_rows)!=Success))
+       return NULL;
+    if ((sz_doodads>0)&&(_XkbAllocDoodads(section,sz_doodads)!=Success)) {
+       if (section->rows) {
+           _XkbFree(section->rows);
+           section->rows= NULL;
+           section->sz_rows= section->num_rows= 0;
+       }
+       return NULL;
+    }
+    section->name= name;
+    geom->num_sections++;
+    return section;
+}
+
+XkbDoodadPtr
+XkbAddGeomDoodad(XkbGeometryPtr geom,XkbSectionPtr section,Atom name)
+{
+XkbDoodadPtr   old,doodad;
+register int   i,nDoodads;
+
+    if ((!geom)||(name==None))
+       return NULL;
+    if ((section!=NULL)&&(section->num_doodads>0)) {
+       old= section->doodads;
+       nDoodads= section->num_doodads;
+    }
+    else {
+       old= geom->doodads;
+       nDoodads= geom->num_doodads;
+    }
+    for (i=0,doodad=old;i<nDoodads;i++,doodad++) {
+       if (doodad->any.name==name)
+           return doodad;
+    }
+    if (section) {
+       if ((section->num_doodads>=geom->sz_doodads)&&
+           (_XkbAllocDoodads(section,1)!=Success)) {
+           return NULL;
+       }
+       doodad= &section->doodads[section->num_doodads++];
+    }
+    else {
+       if ((geom->num_doodads>=geom->sz_doodads)&&
+                                       (_XkbAllocDoodads(geom,1)!=Success))
+           return NULL;
+       doodad= &geom->doodads[geom->num_doodads++];
+    }
+    bzero(doodad,sizeof(XkbDoodadRec));
+    doodad->any.name= name;
+    return doodad;
+}
+
+XkbOverlayKeyPtr
+XkbAddGeomOverlayKey(  XkbOverlayPtr           overlay,
+                       XkbOverlayRowPtr        row,
+                       char *                  over,
+                       char *                  under)
+{
+register int   i;
+XkbOverlayKeyPtr key;
+XkbSectionPtr  section;
+XkbRowPtr      row_under;
+Bool           found;
+
+    if ((!overlay)||(!row)||(!over)||(!under))
+       return NULL;
+    section= overlay->section_under;
+    if (row->row_under>=section->num_rows)
+       return NULL;
+    row_under= &section->rows[row->row_under];
+    for (i=0,found=False;i<row_under->num_keys;i++) {
+       if (strncmp(under,row_under->keys[i].name.name,XkbKeyNameLength)==0) {
+           found= True;
+           break;
+       }
+    }
+    if (!found)
+       return NULL;
+    if ((row->num_keys>=row->sz_keys)&&(_XkbAllocOverlayKeys(row,1)!=Success))
+       return NULL;
+    key= &row->keys[row->num_keys];
+    strncpy(key->under.name,under,XkbKeyNameLength);
+    strncpy(key->over.name,over,XkbKeyNameLength);
+    row->num_keys++;
+    return key;
+}
+
+XkbOverlayRowPtr
+XkbAddGeomOverlayRow(XkbOverlayPtr overlay,int row_under,int sz_keys)
+{
+register int           i;
+XkbOverlayRowPtr       row;
+
+    if ((!overlay)||(sz_keys<0))
+       return NULL;
+    if (row_under>=overlay->section_under->num_rows)
+       return NULL;
+    for (i=0;i<overlay->num_rows;i++) {
+       if (overlay->rows[i].row_under==row_under) {
+           row= &overlay->rows[i];
+           if ((row->sz_keys<sz_keys)&&
+                               (_XkbAllocOverlayKeys(row,sz_keys)!=Success)) {
+               return NULL;
+           }
+           return &overlay->rows[i];
+       }
+    }
+    if ((overlay->num_rows>=overlay->sz_rows)&&
+                               (_XkbAllocOverlayRows(overlay,1)!=Success))
+       return NULL;
+    row= &overlay->rows[overlay->num_rows];
+    bzero(row,sizeof(XkbOverlayRowRec));
+    if ((sz_keys>0)&&(_XkbAllocOverlayKeys(row,sz_keys)!=Success))
+       return NULL;
+    row->row_under= row_under;
+    overlay->num_rows++;
+    return row;
+}
+
+XkbOverlayPtr
+XkbAddGeomOverlay(XkbSectionPtr section,Atom name,int sz_rows)
+{
+register int   i;
+XkbOverlayPtr  overlay;
+
+    if ((!section)||(name==None)||(sz_rows==0))
+       return NULL;
+
+    for (i=0,overlay=section->overlays;i<section->num_overlays;i++,overlay++) {
+       if (overlay->name==name) {
+           if ((sz_rows>0)&&(_XkbAllocOverlayRows(overlay,sz_rows)!=Success))
+               return NULL;
+           return overlay;
+       }
+    }
+    if ((section->num_overlays>=section->sz_overlays)&&
+                               (_XkbAllocOverlays(section,1)!=Success))
+       return NULL;
+    overlay= &section->overlays[section->num_overlays];
+    if ((sz_rows>0)&&(_XkbAllocOverlayRows(overlay,sz_rows)!=Success))
+       return NULL;
+    overlay->name= name;
+    overlay->section_under= section;
+    section->num_overlays++;
+    return overlay;
+}
diff --git a/src/xkb/XKBGeom.c b/src/xkb/XKBGeom.c
new file mode 100644 (file)
index 0000000..7594a3d
--- /dev/null
@@ -0,0 +1,692 @@
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+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 Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS 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 DEBUG
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#endif
+
+#define NEED_MAP_READERS
+#include "Xlibint.h"
+#include <X11/extensions/XKBgeom.h>
+#include <X11/extensions/XKBproto.h>
+#include "XKBlibint.h"
+
+#ifndef MINSHORT
+#define        MINSHORT        -32768
+#endif
+#ifndef MAXSHORT
+#define        MAXSHORT        32767
+#endif
+
+/***====================================================================***/
+
+static void
+_XkbCheckBounds(XkbBoundsPtr bounds,int        x,int y)
+{
+    if (x<bounds->x1)  bounds->x1= x;
+    if (x>bounds->x2)  bounds->x2= x;
+    if (y<bounds->y1)  bounds->y1= y;
+    if (y>bounds->y2)  bounds->y2= y;
+    return;
+}
+
+Bool
+XkbComputeShapeBounds(XkbShapePtr shape)
+{
+register int   o,p;
+XkbOutlinePtr  outline;
+XkbPointPtr    pt;
+
+    if ((!shape)||(shape->num_outlines<1))
+       return False;
+    shape->bounds.x1= shape->bounds.y1= MAXSHORT;
+    shape->bounds.x2= shape->bounds.y2= MINSHORT;
+    for (outline=shape->outlines,o=0;o<shape->num_outlines;o++,outline++) {
+       for (pt=outline->points,p=0;p<outline->num_points;p++,pt++) {
+           _XkbCheckBounds(&shape->bounds,pt->x,pt->y);
+       }
+        if (outline->num_points<2) {
+            _XkbCheckBounds(&shape->bounds,0,0);
+        }
+    }
+    return True;
+}
+
+Bool
+XkbComputeShapeTop(XkbShapePtr shape,XkbBoundsPtr bounds)
+{
+register int   p;
+XkbOutlinePtr  outline;
+XkbPointPtr    pt;
+
+    if ((!shape)||(shape->num_outlines<1))
+       return False;
+    if (shape->approx) outline= shape->approx;
+    else               outline= &shape->outlines[shape->num_outlines-1];
+    if (outline->num_points<2) {
+        bounds->x1= bounds->y1= 0;
+        bounds->x2= bounds->y2= 0;
+    }
+    else {
+       bounds->x1= bounds->y1= MAXSHORT;
+       bounds->x2= bounds->y2= MINSHORT;
+    }
+    for (pt=outline->points,p=0;p<outline->num_points;p++,pt++) {
+       _XkbCheckBounds(bounds,pt->x,pt->y);
+    }
+    return True;
+}
+
+Bool
+XkbComputeRowBounds(XkbGeometryPtr geom,XkbSectionPtr section,XkbRowPtr row)
+{
+register int   k,pos;
+XkbKeyPtr      key;
+XkbBoundsPtr   bounds,sbounds;
+
+    if ((!geom)||(!section)||(!row))
+       return False;
+    bounds= &row->bounds;
+    bzero(bounds,sizeof(XkbBoundsRec));
+    for (key=row->keys,pos=k=0;k<row->num_keys;k++,key++) {
+       sbounds= &XkbKeyShape(geom,key)->bounds;
+       _XkbCheckBounds(bounds,pos,0);
+       if (!row->vertical) {
+           if (key->gap!=0) {
+               pos+= key->gap;
+               _XkbCheckBounds(bounds,pos,0);
+           }
+           _XkbCheckBounds(bounds,pos+sbounds->x1,sbounds->y1);
+           _XkbCheckBounds(bounds,pos+sbounds->x2,sbounds->y2);
+           pos+= sbounds->x2;
+       }
+       else {
+           if (key->gap!=0) {
+               pos+= key->gap;
+               _XkbCheckBounds(bounds,0,pos);
+           }
+           _XkbCheckBounds(bounds,pos+sbounds->x1,sbounds->y1);
+           _XkbCheckBounds(bounds,pos+sbounds->x2,sbounds->y2);
+           pos+= sbounds->y2;
+       }
+    }
+    return True;
+}
+
+Bool
+XkbComputeSectionBounds(XkbGeometryPtr geom,XkbSectionPtr section)
+{
+register int   i;
+XkbShapePtr    shape;
+XkbRowPtr      row;
+XkbDoodadPtr   doodad;
+XkbBoundsPtr   bounds,rbounds;
+
+    if ((!geom)||(!section))
+       return False;
+    bounds= &section->bounds;
+    bzero(bounds,sizeof(XkbBoundsRec));
+    for (i=0,row=section->rows;i<section->num_rows;i++,row++) {
+       if (!XkbComputeRowBounds(geom,section,row))
+           return False;
+       rbounds= &row->bounds;
+       _XkbCheckBounds(bounds,row->left+rbounds->x1,row->top+rbounds->y1);
+       _XkbCheckBounds(bounds,row->left+rbounds->x2,row->top+rbounds->y2);
+    }
+    for (i=0,doodad=section->doodads;i<section->num_doodads;i++,doodad++) {
+       static XkbBoundsRec     tbounds;
+       switch (doodad->any.type) {
+           case XkbOutlineDoodad:
+           case XkbSolidDoodad:
+               shape= XkbShapeDoodadShape(geom,&doodad->shape);
+               rbounds= &shape->bounds;
+               break;
+           case XkbTextDoodad:
+               tbounds.x1= doodad->text.left;
+               tbounds.y1= doodad->text.top;
+               tbounds.x2= tbounds.x1+doodad->text.width;
+               tbounds.y2= tbounds.y1+doodad->text.height;
+               rbounds= &tbounds;
+               break;
+           case XkbIndicatorDoodad:
+               shape= XkbIndicatorDoodadShape(geom,&doodad->indicator);
+               rbounds= &shape->bounds;
+               break;
+           case XkbLogoDoodad:
+               shape= XkbLogoDoodadShape(geom,&doodad->logo);
+               rbounds= &shape->bounds;
+               break;
+           default:
+               tbounds.x1= tbounds.x2= doodad->any.left;
+               tbounds.y1= tbounds.y2= doodad->any.top;
+               rbounds= &tbounds;
+               break;
+       }
+       _XkbCheckBounds(bounds,rbounds->x1,rbounds->y1);
+       _XkbCheckBounds(bounds,rbounds->x2,rbounds->y2);
+    }
+    return True;
+}
+
+/***====================================================================***/
+
+char *
+XkbFindOverlayForKey(XkbGeometryPtr geom,XkbSectionPtr wanted,char *under)
+{
+int            s;
+XkbSectionPtr  section;
+
+    if ((geom==NULL)||(under==NULL)||(geom->num_sections<1))
+       return NULL;
+
+    if (wanted)
+        section= wanted;
+    else section= geom->sections;
+
+    for (s=0;s<geom->num_sections;s++,section++) {
+       XkbOverlayPtr   ol;
+       int             o;
+
+       if (section->num_overlays<1)
+           continue;
+       for (o=0,ol=section->overlays;o<section->num_overlays;o++,ol++) {
+           XkbOverlayRowPtr    row;
+           int                 r;
+
+           for (r=0,row=ol->rows;r<ol->num_rows;r++,row++) {
+               XkbOverlayKeyPtr        key;
+               int                     k;
+               for (k=0,key=row->keys;k<row->num_keys;k++,key++) {
+                   if (strncmp(under,key->under.name,XkbKeyNameLength)==0)
+                       return key->over.name;
+               }
+           }
+       }
+       if (wanted!=NULL)
+           break;
+    }
+    return NULL;
+}
+
+/***====================================================================***/
+
+static Status
+_XkbReadGeomProperties(        XkbReadBufferPtr        buf,
+                       XkbGeometryPtr          geom,
+                       xkbGetGeometryReply *   rep)
+{
+Status rtrn;
+
+    if (rep->nProperties<1)
+       return Success;
+    if ((rtrn=XkbAllocGeomProps(geom,rep->nProperties))==Success) {
+       register int i;
+       register Bool ok;
+       char *name,*value;
+       ok= True;
+       for (i=0;(i<rep->nProperties)&&ok;i++) {
+           name=NULL;
+           value=NULL;
+           ok= _XkbGetReadBufferCountedString(buf,&name)&&ok;
+           ok= _XkbGetReadBufferCountedString(buf,&value)&&ok;
+           ok= ok&&(XkbAddGeomProperty(geom,name,value)!=NULL);
+           if (name)
+               _XkbFree(name);
+           if (value)
+               _XkbFree(value);
+       }
+       if (ok) rtrn= Success;
+       else    rtrn= BadLength;
+    }
+    return rtrn;
+}
+
+static Status
+_XkbReadGeomKeyAliases(        XkbReadBufferPtr        buf,
+                       XkbGeometryPtr          geom,
+                       xkbGetGeometryReply *   rep)
+{
+Status rtrn;
+
+    if (rep->nKeyAliases<1)
+       return Success;
+    if ((rtrn=XkbAllocGeomKeyAliases(geom,rep->nKeyAliases))==Success) {
+       if (!_XkbCopyFromReadBuffer(buf,(char *)geom->key_aliases,
+                                       (rep->nKeyAliases*XkbKeyNameLength*2)))
+           return BadLength;
+       geom->num_key_aliases= rep->nKeyAliases;
+       return Success;
+    }
+    else { /* alloc failed, just skip the aliases */
+       _XkbSkipReadBufferData(buf,(rep->nKeyAliases*XkbKeyNameLength*2));
+    }
+    return rtrn;
+}
+
+static Status
+_XkbReadGeomColors(    XkbReadBufferPtr        buf,
+                       XkbGeometryPtr          geom,
+                       xkbGetGeometryReply *   rep)
+{
+Status rtrn;
+
+    if (rep->nColors<1)
+       return Success;
+    if ((rtrn=XkbAllocGeomColors(geom,rep->nColors))==Success) {
+       register int i;
+       char *spec;
+       for (i=0;i<rep->nColors;i++) {
+           spec = NULL;
+           if (!_XkbGetReadBufferCountedString(buf,&spec))
+               rtrn = BadLength;
+           else if (XkbAddGeomColor(geom,spec,geom->num_colors)==NULL)
+               rtrn = BadAlloc;
+           if (spec)
+               _XkbFree(spec);
+           if (rtrn != Success)
+               return rtrn;
+       }
+       return Success;
+    }
+    return rtrn;
+}
+
+static Status
+_XkbReadGeomShapes(    XkbReadBufferPtr        buf,
+                       XkbGeometryPtr          geom,
+                       xkbGetGeometryReply *   rep)
+{
+register int i;
+Status rtrn;
+
+    if (rep->nShapes<1)
+       return Success;
+    if ((rtrn=XkbAllocGeomShapes(geom,rep->nShapes))!=Success)
+       return rtrn;
+    for (i=0;i<rep->nShapes;i++) {
+       xkbShapeWireDesc *shapeWire;
+       XkbShapePtr      shape;
+       register int     o;
+       shapeWire= (xkbShapeWireDesc *)
+                  _XkbGetReadBufferPtr(buf,SIZEOF(xkbShapeWireDesc));
+       if (!shapeWire)
+           return BadLength;
+       shape= XkbAddGeomShape(geom,shapeWire->name,shapeWire->nOutlines);
+       if (!shape)
+          return BadAlloc;
+       for (o=0;o<shapeWire->nOutlines;o++) {
+           xkbOutlineWireDesc *olWire;
+           XkbOutlinePtr       ol;
+           register int        p;
+           XkbPointPtr         pt;
+           olWire=  (xkbOutlineWireDesc *)
+                _XkbGetReadBufferPtr(buf,SIZEOF(xkbOutlineWireDesc));
+           if (!olWire)
+               return BadLength;
+           ol= XkbAddGeomOutline(shape,olWire->nPoints);
+           if (!ol)
+               return BadAlloc;
+           ol->corner_radius=  olWire->cornerRadius;
+           for (p=0,pt=ol->points;p<olWire->nPoints;p++,pt++) {
+               xkbPointWireDesc *      ptWire;
+               ptWire= (xkbPointWireDesc *)
+                   _XkbGetReadBufferPtr(buf,SIZEOF(xkbPointWireDesc));
+               if (!ptWire)
+                   return BadLength;
+               pt->x= ptWire->x;
+               pt->y= ptWire->y;
+           }
+           ol->num_points= olWire->nPoints;
+       }
+       if (shapeWire->primaryNdx!=XkbNoShape)
+            shape->primary= &shape->outlines[shapeWire->primaryNdx];
+       else shape->primary= NULL;
+       if (shapeWire->approxNdx!=XkbNoShape)
+            shape->approx= &shape->outlines[shapeWire->approxNdx];
+       else shape->approx= NULL;
+       XkbComputeShapeBounds(shape);
+    }
+    return Success;
+}
+
+static Status
+_XkbReadGeomDoodad(    XkbReadBufferPtr        buf,
+                       XkbGeometryPtr          geom,
+                       XkbSectionPtr           section)
+{
+XkbDoodadPtr           doodad;
+xkbDoodadWireDesc *    doodadWire;
+
+    doodadWire= (xkbDoodadWireDesc *)
+                  _XkbGetReadBufferPtr(buf,SIZEOF(xkbDoodadWireDesc));
+    if (!doodadWire)
+       return  BadLength;
+    doodad= XkbAddGeomDoodad(geom,section,doodadWire->any.name);
+    if (!doodad)
+       return BadAlloc;
+    doodad->any.type= doodadWire->any.type;
+    doodad->any.priority= doodadWire->any.priority;
+    doodad->any.top= doodadWire->any.top;
+    doodad->any.left= doodadWire->any.left;
+    doodad->any.angle= doodadWire->any.angle;
+    switch (doodad->any.type) {
+       case XkbOutlineDoodad:
+       case XkbSolidDoodad:
+           doodad->shape.color_ndx= doodadWire->shape.colorNdx;
+           doodad->shape.shape_ndx= doodadWire->shape.shapeNdx;
+           break;
+       case XkbTextDoodad:
+           doodad->text.width= doodadWire->text.width;
+           doodad->text.height= doodadWire->text.height;
+           doodad->text.color_ndx= doodadWire->text.colorNdx;
+           if (!_XkbGetReadBufferCountedString(buf,&doodad->text.text))
+               return BadLength;
+           if (!_XkbGetReadBufferCountedString(buf,&doodad->text.font))
+               return BadLength;
+           break;
+       case XkbIndicatorDoodad:
+           doodad->indicator.shape_ndx= doodadWire->indicator.shapeNdx;
+           doodad->indicator.on_color_ndx= doodadWire->indicator.onColorNdx;
+           doodad->indicator.off_color_ndx= doodadWire->indicator.offColorNdx;
+           break;
+       case XkbLogoDoodad:
+           doodad->logo.color_ndx= doodadWire->logo.colorNdx;
+           doodad->logo.shape_ndx= doodadWire->logo.shapeNdx;
+           if (!_XkbGetReadBufferCountedString(buf,&doodad->logo.logo_name))
+               return BadLength;
+           break;
+       default:
+           return BadValue;
+    }
+    return Success;
+}
+
+static Status
+_XkbReadGeomOverlay(   XkbReadBufferPtr        buf,
+                       XkbGeometryPtr          geom,
+                       XkbSectionPtr           section)
+{
+XkbOverlayPtr          ol;
+xkbOverlayWireDesc *   olWire;
+register int           r;
+
+    olWire= (xkbOverlayWireDesc *)
+                  _XkbGetReadBufferPtr(buf,SIZEOF(xkbOverlayWireDesc));
+    if (olWire==NULL)
+       return BadLength;
+    ol= XkbAddGeomOverlay(section,olWire->name,olWire->nRows);
+    if (ol==NULL)
+       return BadLength;
+    for (r=0;r<olWire->nRows;r++) {
+       register int                    k;
+       XkbOverlayRowPtr                row;
+       xkbOverlayRowWireDesc *         rowWire;
+       xkbOverlayKeyWireDesc *         keyWire;
+       rowWire= (xkbOverlayRowWireDesc *)
+                       _XkbGetReadBufferPtr(buf,SIZEOF(xkbOverlayRowWireDesc));
+       if (rowWire==NULL)
+           return BadLength;
+       row= XkbAddGeomOverlayRow(ol,rowWire->rowUnder,rowWire->nKeys);
+       row->row_under= rowWire->rowUnder;
+       if (!row)
+           return BadAlloc;
+       if (rowWire->nKeys<1)
+           continue;
+       keyWire= (xkbOverlayKeyWireDesc *)
+                       _XkbGetReadBufferPtr(buf,
+                               SIZEOF(xkbOverlayKeyWireDesc)*rowWire->nKeys);
+       if (keyWire==NULL)
+           return BadLength;
+       for (k=0;k<rowWire->nKeys;k++,keyWire++,row->num_keys++) {
+           memcpy(row->keys[row->num_keys].over.name,keyWire->over,
+                                                       XkbKeyNameLength);
+           memcpy(row->keys[row->num_keys].under.name,keyWire->under,
+                                                       XkbKeyNameLength);
+       }
+    }
+    return Success;
+}
+
+static Status
+_XkbReadGeomSections(  XkbReadBufferPtr        buf,
+                       XkbGeometryPtr          geom,
+                       xkbGetGeometryReply *   rep)
+{
+register int           s;
+XkbSectionPtr          section;
+xkbSectionWireDesc *   sectionWire;
+Status                 rtrn;
+
+    if (rep->nSections<1)
+       return Success;
+    if ((rtrn=XkbAllocGeomSections(geom,rep->nSections))!=Success)
+       return rtrn;
+    for (s=0;s<rep->nSections;s++) {
+       sectionWire= (xkbSectionWireDesc *)
+                       _XkbGetReadBufferPtr(buf,SIZEOF(xkbSectionWireDesc));
+       if (!sectionWire)
+           return BadLength;
+       section= XkbAddGeomSection(geom,sectionWire->name,sectionWire->nRows,
+                                               sectionWire->nDoodads,
+                                               sectionWire->nOverlays);
+       if (!section)
+           return BadAlloc;
+       section->top= sectionWire->top;
+       section->left= sectionWire->left;
+       section->width= sectionWire->width;
+       section->height= sectionWire->height;
+       section->angle= sectionWire->angle;
+       section->priority= sectionWire->priority;
+       if (sectionWire->nRows>0) {
+           register int        r;
+           XkbRowPtr           row;
+           xkbRowWireDesc *    rowWire;
+           for (r=0;r<sectionWire->nRows;r++) {
+               rowWire= (xkbRowWireDesc *)
+                        _XkbGetReadBufferPtr(buf,SIZEOF(xkbRowWireDesc));
+               if (!rowWire)
+                   return BadLength;
+               row= XkbAddGeomRow(section,rowWire->nKeys);
+               if (!row)
+                   return BadAlloc;
+               row->top= rowWire->top;
+               row->left= rowWire->left;
+               row->vertical= rowWire->vertical;
+               if (rowWire->nKeys>0) {
+                   register int        k;
+                   XkbKeyPtr           key;
+                   xkbKeyWireDesc *    keyWire;
+                   for (k=0;k<rowWire->nKeys;k++) {
+                       keyWire= (xkbKeyWireDesc *)
+                             _XkbGetReadBufferPtr(buf,SIZEOF(xkbKeyWireDesc));
+                       if (!keyWire)
+                           return BadLength;
+                       key= XkbAddGeomKey(row);
+                       if (!key)
+                           return BadAlloc;
+                       memcpy(key->name.name,keyWire->name,XkbKeyNameLength);
+                       key->gap= keyWire->gap;
+                       key->shape_ndx= keyWire->shapeNdx;
+                       key->color_ndx= keyWire->colorNdx;
+                   }
+               }
+           }
+       }
+       if (sectionWire->nDoodads>0) {
+           register int d;
+           for (d=0;d<sectionWire->nDoodads;d++) {
+               if ((rtrn=_XkbReadGeomDoodad(buf,geom,section))!=Success)
+                   return rtrn;
+           }
+       }
+       if (sectionWire->nOverlays>0) {
+           register int o;
+           for (o=0;o<sectionWire->nOverlays;o++) {
+               if ((rtrn=_XkbReadGeomOverlay(buf,geom,section))!=Success)
+                   return rtrn;
+           }
+       }
+    }
+    return Success;
+}
+
+static Status
+_XkbReadGeomDoodads(   XkbReadBufferPtr        buf,
+                       XkbGeometryPtr          geom,
+                       xkbGetGeometryReply *   rep)
+{
+register int d;
+Status rtrn;
+
+    if (rep->nDoodads<1)
+       return Success;
+    if ((rtrn=XkbAllocGeomDoodads(geom,rep->nDoodads))!=Success)
+       return rtrn;
+    for (d=0;d<rep->nDoodads;d++) {
+       if ((rtrn=_XkbReadGeomDoodad(buf,geom,NULL))!=Success)
+           return rtrn;
+    }
+    return Success;
+}
+
+Status
+_XkbReadGetGeometryReply(      Display * dpy,
+                               xkbGetGeometryReply * rep,
+                               XkbDescPtr xkb,
+                               int * nread_rtrn)
+{
+XkbGeometryPtr geom;
+
+    geom= _XkbTypedCalloc(1,XkbGeometryRec);
+    if (!geom)
+       return BadAlloc;
+    if (xkb->geom)
+       XkbFreeGeometry(xkb->geom,XkbGeomAllMask,True);
+    xkb->geom= geom;
+
+    geom->name= rep->name;
+    geom->width_mm= rep->widthMM;
+    geom->height_mm= rep->heightMM;
+    if (rep->length) {
+       XkbReadBufferRec        buf;
+       int                     left;
+       if (_XkbInitReadBuffer(dpy,&buf,(int)rep->length*4)) {
+           Status status= Success;
+           if (nread_rtrn)
+               *nread_rtrn= (int)rep->length*4;
+           if (!_XkbGetReadBufferCountedString(&buf,&geom->label_font))
+               status= BadLength;
+           if (status==Success)
+               status= _XkbReadGeomProperties(&buf,geom,rep);
+           if (status==Success)
+               status= _XkbReadGeomColors(&buf,geom,rep);
+           if (status==Success)
+               status= _XkbReadGeomShapes(&buf,geom,rep);
+           if (status==Success)
+               status= _XkbReadGeomSections(&buf,geom,rep);
+           if (status==Success)
+               status= _XkbReadGeomDoodads(&buf,geom,rep);
+           if (status==Success)
+               status= _XkbReadGeomKeyAliases(&buf,geom,rep);
+           left= _XkbFreeReadBuffer(&buf);
+           if ((status!=Success) || left || buf.error) {
+               if (status==Success)
+                   status= BadLength;
+               XkbFreeGeometry(geom,XkbGeomAllMask,True);
+               xkb->geom= NULL;
+               return status;
+           }
+           geom->base_color= &geom->colors[rep->baseColorNdx];
+           geom->label_color= &geom->colors[rep->labelColorNdx];
+       }
+       else {
+           XkbFreeGeometry(geom,XkbGeomAllMask,True);
+           xkb->geom= NULL;
+           return BadAlloc;
+       }
+    }
+    return Success;
+}
+
+Status
+XkbGetGeometry(Display *dpy,XkbDescPtr xkb)
+{
+xkbGetGeometryReq      *req;
+xkbGetGeometryReply     rep;
+Status                  status;
+
+    if ( (!xkb) || (dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return BadAccess;
+
+    LockDisplay(dpy);
+    GetReq(kbGetGeometry, req);
+    req->reqType = dpy->xkb_info->codes->major_opcode;
+    req->xkbReqType = X_kbGetGeometry;
+    req->deviceSpec = xkb->device_spec;
+    req->name= None;
+    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse))
+       status = BadImplementation;
+    else if (!rep.found)
+       status = BadName;
+    else
+       status = _XkbReadGetGeometryReply(dpy,&rep,xkb,NULL);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return status;
+}
+
+Status
+XkbGetNamedGeometry(Display *dpy,XkbDescPtr xkb,Atom name)
+{
+xkbGetGeometryReq      *req;
+xkbGetGeometryReply     rep;
+Status                  status;
+
+    if ( (name==None) || (dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)) )
+       return BadAccess;
+
+    LockDisplay(dpy);
+    GetReq(kbGetGeometry, req);
+    req->reqType = dpy->xkb_info->codes->major_opcode;
+    req->xkbReqType = X_kbGetGeometry;
+    req->deviceSpec = xkb->device_spec;
+    req->name= (CARD32)name;
+    if ((!_XReply(dpy, (xReply *)&rep, 0, xFalse))||(!rep.found))
+       status = BadImplementation;
+    else if (!rep.found)
+       status = BadName;
+    else
+       status = _XkbReadGetGeometryReply(dpy,&rep,xkb,NULL);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return status;
+}
+
diff --git a/src/xkb/XKBGetByName.c b/src/xkb/XKBGetByName.c
new file mode 100644 (file)
index 0000000..8e4f554
--- /dev/null
@@ -0,0 +1,214 @@
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+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 Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS 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        NEED_MAP_READERS
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include <X11/extensions/XKBproto.h>
+#include "XKBlibint.h"
+
+/***====================================================================***/
+
+XkbDescPtr
+XkbGetKeyboardByName(  Display *               dpy,
+                       unsigned                deviceSpec,
+                       XkbComponentNamesPtr    names,
+                       unsigned                want,
+                       unsigned                need,
+                       Bool                    load)
+{
+    register xkbGetKbdByNameReq        *       req;
+    xkbGetKbdByNameReply               rep;
+    int                                        len,extraLen;
+    char *                             str;
+    XkbDescPtr                         xkb;
+    int                                        mapLen,codesLen,typesLen,compatLen;
+    int                                        symsLen,geomLen;
+    XkbInfoPtr                                 xkbi;
+
+    if ( (dpy==NULL) || (dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)) )
+       return NULL;
+
+    xkbi= dpy->xkb_info;
+    xkb = (XkbDescRec *)_XkbCalloc(1,sizeof(XkbDescRec));
+    if (!xkb)
+       return NULL;
+    xkb->device_spec = deviceSpec;
+    xkb->map = (XkbClientMapRec *)_XkbCalloc(1,sizeof(XkbClientMapRec));
+    xkb->dpy = dpy;
+
+    LockDisplay(dpy);
+    GetReq(kbGetKbdByName, req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbGetKbdByName;
+    req->deviceSpec = xkb->device_spec;
+    req->want= want;
+    req->need= need;
+    req->load= load;
+
+    mapLen= codesLen= typesLen= compatLen= symsLen= geomLen= 0;
+    if (names) {
+       if (names->keymap)
+           mapLen= (int)strlen(names->keymap);
+       if (names->keycodes)
+           codesLen= (int)strlen(names->keycodes);
+       if (names->types)
+           typesLen= (int)strlen(names->types);
+       if (names->compat)
+           compatLen= (int)strlen(names->compat);
+       if (names->symbols)
+           symsLen= (int)strlen(names->symbols);
+       if (names->geometry)
+           geomLen= (int)strlen(names->geometry);
+       if (mapLen>255)         mapLen= 255;
+       if (codesLen>255)       codesLen= 255;
+       if (typesLen>255)       typesLen= 255;
+       if (compatLen>255)      compatLen= 255;
+       if (symsLen>255)        symsLen= 255;
+       if (geomLen>255)        geomLen= 255;
+    }
+    else mapLen= codesLen= typesLen= compatLen= symsLen= geomLen= 0;
+
+    len= mapLen+codesLen+typesLen+compatLen+symsLen+geomLen+6;
+    len= XkbPaddedSize(len);
+    req->length+= len/4;
+    BufAlloc(char *,str,len);
+    *str++= mapLen;
+    if (mapLen>0) {
+        memcpy(str,names->keymap,mapLen);
+        str+= mapLen;
+    }
+    *str++= codesLen;
+    if (codesLen>0) {
+        memcpy(str,names->keycodes,codesLen);
+        str+= codesLen;
+    }
+    *str++= typesLen;
+    if (typesLen>0) {
+        memcpy(str,names->types,typesLen);
+        str+= typesLen;
+    }
+    *str++= compatLen;
+    if (compatLen>0) {
+        memcpy(str,names->compat,compatLen);
+        str+= compatLen;
+    }
+    *str++= symsLen;
+    if (symsLen>0) {
+        memcpy(str,names->symbols,symsLen);
+        str+= symsLen;
+    }
+    *str++= geomLen;
+    if (geomLen>0) {
+        memcpy(str,names->geometry,geomLen);
+        str+= geomLen;
+    }
+    if ((!_XReply(dpy, (xReply *)&rep, 0, xFalse))||(!rep.reported))
+       goto BAILOUT;
+    extraLen= (int)rep.length*4;
+
+    xkb->device_spec= rep.deviceID;
+    xkb->min_key_code = rep.minKeyCode;
+    xkb->max_key_code = rep.maxKeyCode;
+    if (rep.reported&(XkbGBN_SymbolsMask|XkbGBN_TypesMask)) {
+       xkbGetMapReply  mrep;
+       Status          status;
+       int             nread= 0;
+
+       _XRead(dpy, (char *)&mrep, SIZEOF(xkbGetMapReply));
+       extraLen-= SIZEOF(xkbGetMapReply);
+       status= _XkbReadGetMapReply(dpy,&mrep,xkb,&nread);
+       extraLen-= nread;
+       if (status!=Success)
+           goto BAILOUT;
+    }
+    if (rep.reported&XkbGBN_CompatMapMask) {
+       xkbGetCompatMapReply    crep;
+       Status                  status;
+       int                     nread= 0;
+
+       _XRead(dpy, (char *)&crep, SIZEOF(xkbGetCompatMapReply));
+       extraLen-= SIZEOF(xkbGetCompatMapReply);
+       status= _XkbReadGetCompatMapReply(dpy,&crep,xkb,&nread);
+       extraLen-= nread;
+       if (status!=Success)
+           goto BAILOUT;
+    }
+    if (rep.reported&XkbGBN_IndicatorMapMask) {
+       xkbGetIndicatorMapReply irep;
+       Status                  status;
+       int                     nread= 0;
+
+       _XRead(dpy, (char *)&irep, SIZEOF(xkbGetIndicatorMapReply));
+       extraLen-= SIZEOF(xkbGetIndicatorMapReply);
+       status= _XkbReadGetIndicatorMapReply(dpy,&irep,xkb,&nread);
+       extraLen-= nread;
+       if (status!=Success)
+           goto BAILOUT;
+    }
+    if (rep.reported&(XkbGBN_KeyNamesMask|XkbGBN_OtherNamesMask)) {
+       xkbGetNamesReply        nrep;
+       Status                  status;
+       int                     nread= 0;
+
+       _XRead(dpy, (char *)&nrep, SIZEOF(xkbGetNamesReply));
+       extraLen-= SIZEOF(xkbGetNamesReply);
+       status= _XkbReadGetNamesReply(dpy,&nrep,xkb,&nread);
+       extraLen-= nread;
+       if (status!=Success)
+           goto BAILOUT;
+    }
+    if (rep.reported&XkbGBN_GeometryMask) {
+       xkbGetGeometryReply     grep;
+       Status                  status;
+       int                     nread= 0;
+
+       _XRead(dpy, (char *)&grep, SIZEOF(xkbGetGeometryReply));
+       extraLen-= SIZEOF(xkbGetGeometryReply);
+       status= _XkbReadGetGeometryReply(dpy,&grep,xkb,&nread);
+       extraLen-= nread;
+       if (status!=Success)
+           goto BAILOUT;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return xkb;
+BAILOUT:
+    if (xkb!=NULL)
+       XkbFreeKeyboard(xkb,XkbAllComponentsMask,xTrue);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return NULL;
+}
+
+XkbDescPtr
+XkbGetKeyboard(Display *dpy,unsigned which,unsigned deviceSpec)
+{
+    return XkbGetKeyboardByName(dpy,deviceSpec,NULL,which,which,False);
+}
diff --git a/src/xkb/XKBGetMap.c b/src/xkb/XKBGetMap.c
new file mode 100644 (file)
index 0000000..30fb629
--- /dev/null
@@ -0,0 +1,828 @@
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+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 Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS 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        NEED_MAP_READERS
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include <X11/extensions/XKBproto.h>
+#include "XKBlibint.h"
+
+static Status
+_XkbReadKeyTypes(XkbReadBufferPtr buf,XkbDescPtr xkb,xkbGetMapReply *rep)
+{
+int             i,n,lastMapCount;
+XkbKeyTypePtr  type;
+
+    if ( rep->nTypes>0 ) {
+       n = rep->firstType+rep->nTypes;
+       if (xkb->map->num_types>=n)
+           n= xkb->map->num_types;
+       else if (XkbAllocClientMap(xkb,XkbKeyTypesMask,n)!=Success)
+           return BadAlloc;
+
+       type = &xkb->map->types[rep->firstType];
+       for (i=0;i<(int)rep->nTypes;i++,type++) {
+           xkbKeyTypeWireDesc  *desc;
+           register int ndx;
+
+           ndx= i+rep->firstType;
+           if (ndx>=xkb->map->num_types)
+               xkb->map->num_types= ndx+1;
+
+           desc= (xkbKeyTypeWireDesc *)_XkbGetReadBufferPtr(buf,
+                                               SIZEOF(xkbKeyTypeWireDesc));
+           if (desc==NULL)
+               return BadLength;
+
+           lastMapCount= type->map_count;
+           if ( desc->nMapEntries>0 ) {
+               if ((type->map==NULL)||(desc->nMapEntries>type->map_count)) {
+                   XkbKTMapEntryRec *prev_map = type->map;
+
+                   type->map= _XkbTypedRealloc(type->map,desc->nMapEntries,
+                                                             XkbKTMapEntryRec);
+                   if (type->map==NULL) {
+                       _XkbFree(prev_map);
+                       return BadAlloc;
+                   }
+               }
+           }
+           else if (type->map!=NULL) {
+               Xfree(type->map);
+               type->map_count= 0;
+               type->map= NULL;
+           }
+
+           if ( desc->preserve && (desc->nMapEntries>0) ) {
+               if ((!type->preserve)||
+                   (desc->nMapEntries>lastMapCount)) {
+                   XkbModsRec *prev_preserve = type->preserve;
+
+                   type->preserve= _XkbTypedRealloc(type->preserve,
+                                                       desc->nMapEntries,
+                                                       XkbModsRec);
+                   if (type->preserve==NULL) {
+                       _XkbFree(prev_preserve);
+                       return BadAlloc;
+                   }
+               }
+           }
+           else if (type->preserve!=NULL) {
+               Xfree(type->preserve);
+               type->preserve= NULL;
+           }
+
+           type->mods.mask = desc->mask;
+           type->mods.real_mods = desc->realMods;
+           type->mods.vmods = desc->virtualMods;
+           type->num_levels = desc->numLevels;
+           type->map_count = desc->nMapEntries;
+           if (desc->nMapEntries>0) {
+               register xkbKTMapEntryWireDesc *wire;
+               register XkbKTMapEntryPtr       entry;
+               register int size;
+
+               size= type->map_count*SIZEOF(xkbKTMapEntryWireDesc);
+               wire= (xkbKTMapEntryWireDesc *)_XkbGetReadBufferPtr(buf,size);
+               if (wire==NULL)
+                   return BadLength;
+               entry= type->map;
+               for (n=0;n<type->map_count;n++,wire++,entry++) {
+                   entry->active= wire->active;
+                   entry->level= wire->level;
+                   entry->mods.mask= wire->mask;
+                   entry->mods.real_mods= wire->realMods;
+                   entry->mods.vmods= wire->virtualMods;
+               }
+
+               if (desc->preserve) {
+                   register xkbModsWireDesc *  pwire;
+                   register XkbModsPtr         preserve;
+                   register int sz;
+
+                   sz= desc->nMapEntries*SIZEOF(xkbModsWireDesc);
+                   pwire=(xkbModsWireDesc *)_XkbGetReadBufferPtr(buf,sz);
+                   if (pwire==NULL)
+                       return BadLength;
+                   preserve= type->preserve;
+                   for (n=0;n<desc->nMapEntries;n++,pwire++,preserve++) {
+                       preserve->mask=  pwire->mask;
+                       preserve->vmods=  pwire->virtualMods;
+                       preserve->real_mods= pwire->realMods;
+                   }
+               }
+           }
+       }
+    }
+    return Success;
+}
+
+static Status
+_XkbReadKeySyms(XkbReadBufferPtr buf,XkbDescPtr xkb,xkbGetMapReply *rep)
+{
+register int i;
+XkbClientMapPtr        map;
+
+    map= xkb->map;
+    if (map->key_sym_map==NULL) {
+       register int offset;
+       XkbSymMapPtr    oldMap;
+       xkbSymMapWireDesc *newMap;
+       map->key_sym_map= _XkbTypedCalloc((xkb->max_key_code+1),XkbSymMapRec);
+       if (map->key_sym_map==NULL)
+           return BadAlloc;
+       if (map->syms==NULL) {
+           int sz;
+           sz= (rep->totalSyms*12)/10;
+           sz= ((sz+(unsigned)128)/128)*128;
+           map->syms = _XkbTypedCalloc(sz,KeySym);
+           if (map->syms==NULL)
+               return BadAlloc;
+           map->size_syms = sz;
+       }
+       offset = 1;
+       oldMap = &map->key_sym_map[rep->firstKeySym];
+       for (i=0;i<(int)rep->nKeySyms;i++,oldMap++) {
+           newMap= (xkbSymMapWireDesc *)
+                       _XkbGetReadBufferPtr(buf,SIZEOF(xkbSymMapWireDesc));
+           if (newMap==NULL)
+               return BadLength;
+           oldMap->kt_index[0]= newMap->ktIndex[0];
+           oldMap->kt_index[1]= newMap->ktIndex[1];
+           oldMap->kt_index[2]= newMap->ktIndex[2];
+           oldMap->kt_index[3]= newMap->ktIndex[3];
+           oldMap->group_info= newMap->groupInfo;
+           oldMap->width= newMap->width;
+           oldMap->offset= offset;
+           if (offset+newMap->nSyms>=map->size_syms) {
+               register int sz;
+               KeySym *prev_syms = map->syms;
+
+               sz= map->size_syms+128;
+               map->syms= _XkbTypedRealloc(map->syms,sz,KeySym);
+               if (map->syms==NULL) {
+                   _XkbFree(prev_syms);
+                   map->size_syms= 0;
+                   return BadAlloc;
+               }
+               map->size_syms= sz;
+           }
+           if (newMap->nSyms>0) {
+               _XkbReadBufferCopyKeySyms(buf,(KeySym *)&map->syms[offset],
+                                                       newMap->nSyms);
+               offset+= newMap->nSyms;
+           }
+           else {
+               map->syms[offset]= 0;
+           }
+       }
+       map->num_syms= offset;
+    }
+    else {
+       xkbSymMapWireDesc *     newMap;
+       XkbSymMapPtr            oldMap;
+       KeySym *                newSyms;
+       int                     tmp;
+
+       oldMap = &map->key_sym_map[rep->firstKeySym];
+       for (i=0;i<(int)rep->nKeySyms;i++,oldMap++) {
+           newMap= (xkbSymMapWireDesc *)
+                       _XkbGetReadBufferPtr(buf,SIZEOF(xkbSymMapWireDesc));
+           if (newMap==NULL)
+               return BadLength;
+
+           if (newMap->nSyms>0)
+                tmp= newMap->nSyms;
+           else tmp= 0;
+
+           newSyms = XkbResizeKeySyms(xkb,i+rep->firstKeySym,tmp);
+           if (newSyms==NULL)
+               return BadAlloc;
+           if (newMap->nSyms>0)
+               _XkbReadBufferCopyKeySyms(buf,newSyms,newMap->nSyms);
+           else newSyms[0]= NoSymbol;
+           oldMap->kt_index[0] = newMap->ktIndex[0];
+           oldMap->kt_index[1] = newMap->ktIndex[1];
+           oldMap->kt_index[2] = newMap->ktIndex[2];
+           oldMap->kt_index[3] = newMap->ktIndex[3];
+           oldMap->group_info = newMap->groupInfo;
+           oldMap->width = newMap->width;
+       }
+    }
+    return Success;
+}
+
+static Status
+_XkbReadKeyActions(XkbReadBufferPtr buf,XkbDescPtr info,xkbGetMapReply *rep)
+{
+int            i;
+CARD8          numDescBuf[248];
+CARD8*         numDesc = NULL;
+register int   nKeyActs;
+Status         ret = Success;
+
+    if ( (nKeyActs=rep->nKeyActs)>0 ) {
+       XkbSymMapPtr    symMap;
+
+       if (nKeyActs < sizeof numDescBuf) numDesc = numDescBuf;
+       else numDesc = Xmalloc (nKeyActs * sizeof(CARD8));
+
+       if (!_XkbCopyFromReadBuffer(buf, (char *)numDesc, nKeyActs)) {
+           ret = BadLength;
+           goto done;
+       }
+       i= XkbPaddedSize(nKeyActs)-nKeyActs;
+       if ((i>0)&&(!_XkbSkipReadBufferData(buf,i))) {
+           ret = BadLength;
+           goto done;
+       }
+       symMap = &info->map->key_sym_map[rep->firstKeyAct];
+       for (i=0;i<(int)rep->nKeyActs;i++,symMap++) {
+           if (numDesc[i]==0) {
+               info->server->key_acts[i+rep->firstKeyAct]= 0;
+           }
+           else {
+               XkbAction *newActs;
+               /* 8/16/93 (ef) -- XXX! Verify size here (numdesc must be */
+               /*                 either zero or XkbKeyNumSyms(info,key) */
+               newActs=XkbResizeKeyActions(info,i+rep->firstKeyAct,
+                                                               numDesc[i]);
+               if (newActs==NULL) {
+                   ret = BadAlloc;
+                   goto done;
+               }
+               if (!_XkbCopyFromReadBuffer(buf,(char *)newActs,
+                                       (int)(numDesc[i]*sizeof(XkbAction)))) {
+                   ret = BadLength;
+                   goto done;
+               }
+           }
+       }
+    }
+done:
+    if (numDesc != NULL && numDesc != numDescBuf) Xfree (numDesc);
+    return ret;
+}
+
+static Status
+_XkbReadKeyBehaviors(XkbReadBufferPtr buf,XkbDescPtr xkb,xkbGetMapReply *rep)
+{
+register int i;
+xkbBehaviorWireDesc    *wire;
+
+    if ( rep->totalKeyBehaviors>0 ) {
+       if ( xkb->server->behaviors == NULL ) {
+           int size = xkb->max_key_code+1;
+           xkb->server->behaviors = _XkbTypedCalloc(size,XkbBehavior);
+           if (xkb->server->behaviors==NULL)
+               return BadAlloc;
+       }
+       else {
+           bzero(&xkb->server->behaviors[rep->firstKeyBehavior],
+                       (rep->nKeyBehaviors*sizeof(XkbBehavior)));
+       }
+       for (i=0;i<rep->totalKeyBehaviors;i++) {
+           wire= (xkbBehaviorWireDesc *)_XkbGetReadBufferPtr(buf,
+                                               SIZEOF(xkbBehaviorWireDesc));
+           if (wire==NULL)
+               return BadLength;
+           xkb->server->behaviors[wire->key].type= wire->type;
+           xkb->server->behaviors[wire->key].data= wire->data;
+       }
+    }
+    return Success;
+}
+
+static Status
+_XkbReadVirtualMods(XkbReadBufferPtr buf,XkbDescPtr xkb,xkbGetMapReply *rep)
+{
+    if ( rep->virtualMods ) {
+       register int i,bit,nVMods;
+       register char *data;
+
+       for (i=nVMods=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) {
+           if (rep->virtualMods&bit)
+               nVMods++;
+       }
+       data= _XkbGetReadBufferPtr(buf,XkbPaddedSize(nVMods));
+       if (data==NULL)
+           return BadLength;
+       for (i=0,bit=1;(i<XkbNumVirtualMods)&&(nVMods>0);i++,bit<<=1) {
+           if (rep->virtualMods&bit) {
+               xkb->server->vmods[i]= *data++;
+               nVMods--;
+           }
+       }
+    }
+    return Success;
+}
+
+static Status
+_XkbReadExplicitComponents(    XkbReadBufferPtr        buf,
+                               XkbDescPtr              xkb,
+                               xkbGetMapReply *        rep)
+{
+register int i;
+unsigned char *wire;
+
+    if ( rep->totalKeyExplicit>0 ) {
+       if ( xkb->server->explicit == NULL ) {
+           int size = xkb->max_key_code+1;
+           xkb->server->explicit = _XkbTypedCalloc(size,unsigned char);
+           if (xkb->server->explicit==NULL)
+               return BadAlloc;
+       }
+       else {
+           bzero(&xkb->server->explicit[rep->firstKeyExplicit],
+                                                       rep->nKeyExplicit);
+       }
+       i= XkbPaddedSize(2*rep->totalKeyExplicit);
+       wire=(unsigned char *)_XkbGetReadBufferPtr(buf,i);
+       if (!wire)
+           return BadLength;
+       for (i=0;i<rep->totalKeyExplicit;i++,wire+=2) {
+           xkb->server->explicit[wire[0]]= wire[1];
+       }
+    }
+    return Success;
+}
+
+static Status
+_XkbReadModifierMap(XkbReadBufferPtr buf,XkbDescPtr xkb,xkbGetMapReply *rep)
+{
+register int i;
+unsigned char *wire;
+
+    if ( rep->totalModMapKeys>0 ) {
+       if ((xkb->map->modmap==NULL)&&
+           (XkbAllocClientMap(xkb,XkbModifierMapMask,0)!=Success)) {
+           return BadAlloc;
+       }
+       else {
+           bzero(&xkb->map->modmap[rep->firstModMapKey],rep->nModMapKeys);
+       }
+       i= XkbPaddedSize(2*rep->totalModMapKeys);
+       wire=(unsigned char *)_XkbGetReadBufferPtr(buf,i);
+       if (!wire)
+           return BadLength;
+       for (i=0;i<rep->totalModMapKeys;i++,wire+=2) {
+           xkb->map->modmap[wire[0]]= wire[1];
+       }
+    }
+    return Success;
+}
+
+static Status
+_XkbReadVirtualModMap(XkbReadBufferPtr buf,XkbDescPtr xkb,xkbGetMapReply *rep)
+{
+register int           i;
+xkbVModMapWireDesc *   wire;
+XkbServerMapPtr                srv;
+
+    if ( rep->totalVModMapKeys>0 ) {
+       if (((xkb->server==NULL)||(xkb->server->vmodmap==NULL))&&
+           (XkbAllocServerMap(xkb,XkbVirtualModMapMask,0)!=Success)) {
+           return BadAlloc;
+       }
+       else {
+           srv= xkb->server;
+           if (rep->nVModMapKeys > rep->firstVModMapKey)
+               bzero((char *)&srv->vmodmap[rep->firstVModMapKey],
+                     (rep->nVModMapKeys - rep->firstVModMapKey) *
+                     sizeof(unsigned short));
+       }
+       srv= xkb->server;
+       i= rep->totalVModMapKeys*SIZEOF(xkbVModMapWireDesc);
+       wire=(xkbVModMapWireDesc *)_XkbGetReadBufferPtr(buf,i);
+       if (!wire)
+           return BadLength;
+       for (i=0;i<rep->totalVModMapKeys;i++,wire++) {
+           if ((wire->key>=xkb->min_key_code)&&(wire->key<=xkb->max_key_code))
+               srv->vmodmap[wire->key]= wire->vmods;
+       }
+    }
+    return Success;
+}
+
+static xkbGetMapReq *
+_XkbGetGetMapReq(Display *dpy,XkbDescPtr xkb)
+{
+xkbGetMapReq *req;
+
+    GetReq(kbGetMap, req);
+    req->reqType = dpy->xkb_info->codes->major_opcode;
+    req->xkbReqType = X_kbGetMap;
+    req->deviceSpec = xkb->device_spec;
+    req->full = req->partial = 0;
+    req->firstType = req->nTypes = 0;
+    req->firstKeySym = req->nKeySyms = 0;
+    req->firstKeyAct = req->nKeyActs = 0;
+    req->firstKeyBehavior = req->nKeyBehaviors = 0;
+    req->virtualMods = 0;
+    req->firstKeyExplicit = req->nKeyExplicit = 0;
+    req->firstModMapKey = req->nModMapKeys = 0;
+    req->firstVModMapKey = req->nVModMapKeys = 0;
+    return req;
+}
+
+Status
+_XkbReadGetMapReply(   Display *       dpy,
+                       xkbGetMapReply *rep,
+                       XkbDescPtr      xkb,
+                       int *           nread_rtrn)
+{
+int            extraData;
+unsigned       mask;
+
+    if ( xkb->device_spec == XkbUseCoreKbd )
+       xkb->device_spec= rep->deviceID;
+    xkb->min_key_code = rep->minKeyCode;
+    xkb->max_key_code = rep->maxKeyCode;
+
+    if (!xkb->map) {
+       mask= rep->present&XkbAllClientInfoMask;
+       if (mask&&(XkbAllocClientMap(xkb,mask,rep->nTypes)!=Success))
+           return BadAlloc;
+    }
+    if (!xkb->server) {
+       mask= rep->present&XkbAllServerInfoMask;
+       if (mask&&(XkbAllocServerMap(xkb,mask,rep->totalActs)!=Success))
+           return BadAlloc;
+    }
+    extraData= (int)(rep->length*4);
+    extraData-= (SIZEOF(xkbGetMapReply)-SIZEOF(xGenericReply));
+    if (rep->length) {
+       XkbReadBufferRec        buf;
+       int                     left;
+       if (_XkbInitReadBuffer(dpy,&buf,extraData)) {
+           Status status= Success;
+           if (nread_rtrn!=NULL)
+               *nread_rtrn= extraData;
+           if (status==Success)
+               status= _XkbReadKeyTypes(&buf,xkb,rep);
+           if (status==Success)
+               status= _XkbReadKeySyms(&buf,xkb,rep);
+           if (status==Success)
+               status= _XkbReadKeyActions(&buf,xkb,rep);
+           if (status==Success)
+               status= _XkbReadKeyBehaviors(&buf,xkb,rep);
+           if (status==Success)
+               status= _XkbReadVirtualMods(&buf,xkb,rep);
+           if (status==Success)
+               status= _XkbReadExplicitComponents(&buf,xkb,rep);
+           if (status==Success)
+               status= _XkbReadModifierMap(&buf,xkb,rep);
+           if (status==Success)
+               status= _XkbReadVirtualModMap(&buf,xkb,rep);
+           left= _XkbFreeReadBuffer(&buf);
+           if (status!=Success)                return status;
+           else if ( left || buf.error )       return BadLength;
+       }
+       else return BadAlloc;
+    }
+    return Success;
+}
+
+static Status
+_XkbHandleGetMapReply(Display *dpy,XkbDescPtr xkb)
+{
+xkbGetMapReply rep;
+
+    if (!_XReply(dpy, (xReply *)&rep,
+                ( (SIZEOF(xkbGetMapReply)-SIZEOF(xGenericReply)) >> 2 ),
+                xFalse)) {
+       return BadImplementation;
+    }
+    return _XkbReadGetMapReply(dpy,&rep,xkb,NULL);
+}
+
+Status
+XkbGetUpdatedMap(Display *dpy,unsigned which,XkbDescPtr xkb)
+{
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return BadAccess;
+    if (which) {
+       register xkbGetMapReq *req;
+       Status status;
+
+       LockDisplay(dpy);
+
+       req = _XkbGetGetMapReq(dpy, xkb);
+       req->full = which;
+       status= _XkbHandleGetMapReply(dpy, xkb);
+
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return status;
+    }
+    return Success;
+}
+
+XkbDescPtr
+XkbGetMap(Display *dpy,unsigned which,unsigned deviceSpec)
+{
+XkbDescPtr xkb;
+
+    xkb = _XkbTypedCalloc(1,XkbDescRec);
+    if (xkb) {
+       xkb->device_spec = deviceSpec;
+       xkb->map = _XkbTypedCalloc(1,XkbClientMapRec);
+       if ((xkb->map==NULL)||
+           ((which)&&(XkbGetUpdatedMap(dpy,which,xkb)!=Success))) {
+           if (xkb->map) {
+               Xfree(xkb->map);
+               xkb->map= NULL;
+           }
+           Xfree(xkb);
+           return NULL;
+       }
+       xkb->dpy= dpy;
+    }
+    return xkb;
+}
+
+Status
+XkbGetKeyTypes(Display *dpy,unsigned first,unsigned num,XkbDescPtr xkb)
+{
+    register xkbGetMapReq *req;
+    Status status;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return BadAccess;
+    if ((num<1)||(num>XkbMaxKeyTypes))
+       return BadValue;
+
+    LockDisplay(dpy);
+
+    req = _XkbGetGetMapReq(dpy, xkb);
+    req->firstType = first;
+    req->nTypes = num;
+    status= _XkbHandleGetMapReply(dpy, xkb);
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return status;
+}
+
+Status
+XkbGetKeyActions(Display *dpy,unsigned first,unsigned num,XkbDescPtr xkb)
+{
+    register xkbGetMapReq *req;
+    Status status;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return BadAccess;
+
+    if ((num<1)||(num>XkbMaxKeyCount))
+       return BadValue;
+
+    LockDisplay(dpy);
+
+    req = _XkbGetGetMapReq(dpy, xkb);
+    req->firstKeyAct = first;
+    req->nKeyActs = num;
+    status= _XkbHandleGetMapReply(dpy, xkb);
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return status;
+}
+
+Status
+XkbGetKeySyms(Display *dpy,unsigned first,unsigned num,XkbDescPtr xkb)
+{
+    register xkbGetMapReq *req;
+    Status status;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return BadAccess;
+
+    if ((num<1)||(num>XkbMaxKeyCount))
+       return BadValue;
+
+    LockDisplay(dpy);
+
+    req = _XkbGetGetMapReq(dpy, xkb);
+    req->firstKeySym = first;
+    req->nKeySyms = num;
+    status= _XkbHandleGetMapReply(dpy, xkb);
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+
+    return status;
+}
+
+Status
+XkbGetKeyBehaviors(Display *dpy,unsigned first,unsigned num,XkbDescPtr xkb)
+{
+    register xkbGetMapReq *req;
+    Status status;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return BadAccess;
+
+    if ((num<1)||(num>XkbMaxKeyCount))
+       return BadValue;
+
+    LockDisplay(dpy);
+
+    req = _XkbGetGetMapReq(dpy, xkb);
+    req->firstKeyBehavior = first;
+    req->nKeyBehaviors = num;
+    status= _XkbHandleGetMapReply(dpy, xkb);
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return status;
+}
+
+Status
+XkbGetVirtualMods(Display *dpy,unsigned which,XkbDescPtr xkb)
+{
+    register xkbGetMapReq *req;
+    Status status;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return BadAccess;
+
+    LockDisplay(dpy);
+
+    req = _XkbGetGetMapReq(dpy, xkb);
+    req->virtualMods = which;
+    status= _XkbHandleGetMapReply(dpy, xkb);
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return status;
+}
+
+Status
+XkbGetKeyExplicitComponents(   Display *       dpy,
+                               unsigned        first,
+                               unsigned        num,
+                               XkbDescPtr      xkb)
+{
+    register xkbGetMapReq *req;
+    Status status;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return BadAccess;
+
+    if ((num<1)||(num>XkbMaxKeyCount))
+       return BadValue;
+
+    LockDisplay(dpy);
+
+    req = _XkbGetGetMapReq(dpy, xkb);
+    req->firstKeyExplicit = first;
+    req->nKeyExplicit = num;
+    if ((xkb!=NULL) && (xkb->server!=NULL) && (xkb->server->explicit!=NULL)) {
+       if ((num>0)&&(first>=xkb->min_key_code)&&(first+num<=xkb->max_key_code))
+           bzero(&xkb->server->explicit[first],num);
+    }
+    if (xkb)
+        status= _XkbHandleGetMapReply(dpy, xkb);
+    else
+        status = BadMatch;
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return status;
+}
+
+Status
+XkbGetKeyModifierMap(Display *dpy,unsigned first,unsigned num,XkbDescPtr xkb)
+{
+    register xkbGetMapReq *req;
+    Status status;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return BadAccess;
+
+    if ((num<1)||(num>XkbMaxKeyCount))
+       return BadValue;
+
+    LockDisplay(dpy);
+
+    req = _XkbGetGetMapReq(dpy, xkb);
+    req->firstModMapKey = first;
+    req->nModMapKeys = num;
+    if ((xkb!=NULL) && (xkb->map!=NULL) && (xkb->map->modmap!=NULL)) {
+       if ((num>0)&&(first>=xkb->min_key_code)&&(first+num<=xkb->max_key_code))
+           bzero(&xkb->map->modmap[first],num);
+    }
+    if (xkb)
+        status= _XkbHandleGetMapReply(dpy, xkb);
+    else
+        status = BadMatch;
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return status;
+}
+
+Status
+XkbGetKeyVirtualModMap(Display *dpy,unsigned first,unsigned num,XkbDescPtr xkb)
+{
+    register xkbGetMapReq *req;
+    Status status;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return BadAccess;
+
+    if ((num<1)||(num>XkbMaxKeyCount))
+       return BadValue;
+
+    LockDisplay(dpy);
+
+    req = _XkbGetGetMapReq(dpy, xkb);
+    req->firstVModMapKey = first;
+    req->nVModMapKeys = num;
+    if ((xkb!=NULL) && (xkb->map!=NULL) && (xkb->map->modmap!=NULL)) {
+       if ((num>0)&&(first>=xkb->min_key_code)&&(first+num<=xkb->max_key_code))
+           bzero(&xkb->server->vmodmap[first],num*sizeof(unsigned short));
+    }
+
+    if (xkb)
+        status= _XkbHandleGetMapReply(dpy, xkb);
+    else
+        status = BadMatch;
+
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return status;
+}
+
+Status
+XkbGetMapChanges(Display *dpy,XkbDescPtr xkb,XkbMapChangesPtr changes)
+{
+    xkbGetMapReq *req;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return BadAccess;
+    LockDisplay(dpy);
+    if (changes->changed) {
+       Status status= Success;
+       req = _XkbGetGetMapReq(dpy, xkb);
+       req->full = 0;
+       req->partial = changes->changed;
+       req->firstType = changes->first_type;
+       req->nTypes = changes->num_types;
+       req->firstKeySym = changes->first_key_sym;
+       req->nKeySyms = changes->num_key_syms;
+       req->firstKeyAct = changes->first_key_act;
+       req->nKeyActs = changes->num_key_acts;
+       req->firstKeyBehavior = changes->first_key_behavior;
+       req->nKeyBehaviors = changes->num_key_behaviors;
+       req->virtualMods = changes->vmods;
+       req->firstKeyExplicit = changes->first_key_explicit;
+       req->nKeyExplicit = changes->num_key_explicit;
+       req->firstModMapKey = changes->first_modmap_key;
+       req->nModMapKeys = changes->num_modmap_keys;
+       req->firstVModMapKey = changes->first_vmodmap_key;
+       req->nVModMapKeys = changes->num_vmodmap_keys;
+       status= _XkbHandleGetMapReply(dpy, xkb);
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return status;
+    }
+    UnlockDisplay(dpy);
+    return Success;
+}
+
diff --git a/src/xkb/XKBList.c b/src/xkb/XKBList.c
new file mode 100644 (file)
index 0000000..8f245f2
--- /dev/null
@@ -0,0 +1,249 @@
+/************************************************************
+Copyright (c) 1995 by Silicon Graphics Computer Systems, Inc.
+
+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 Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS 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        NEED_MAP_READERS
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include <X11/extensions/XKBproto.h>
+#include "XKBlibint.h"
+
+/***====================================================================***/
+
+static void
+_FreeComponentNames(int num,XkbComponentNamePtr names)
+{
+int                    i;
+XkbComponentNamePtr    tmp;
+
+    if ((num<1)||(names==NULL))
+       return;
+    for (i=0,tmp=names;i<num;i++,tmp++) {
+       if (tmp->name) {
+           _XkbFree(tmp->name);
+           tmp->name= NULL;
+       }
+    }
+    _XkbFree(names);
+    return;
+}
+
+/***====================================================================***/
+
+static XkbComponentNamePtr
+_ReadListing(XkbReadBufferPtr buf,int count,Status *status_rtrn)
+{
+XkbComponentNamePtr    first,this;
+register int           i;
+CARD16 *               flags;
+int                    slen,wlen;
+char *                 str;
+
+    if (count<1)
+       return NULL;
+    first= _XkbTypedCalloc(count,XkbComponentNameRec);
+    if (!first)
+       return NULL;
+    for (this=first,i=0;i<count;i++,this++) {
+       flags= (CARD16 *)_XkbGetReadBufferPtr(buf,2*sizeof(CARD16));
+       if (!flags)
+           goto BAILOUT;
+       this->flags=    flags[0];
+       slen=           flags[1];
+       wlen=           ((slen+1)/2)*2; /* pad to 2 byte boundary */
+       this->name=     _XkbTypedCalloc(slen+1,char);
+       if (!this->name)
+           goto BAILOUT;
+       str= (char *)_XkbGetReadBufferPtr(buf,wlen);
+       if (!str)
+           goto BAILOUT;
+       memcpy(this->name,str,slen);
+    }
+    return first;
+BAILOUT:
+    *status_rtrn= BadAlloc;
+    _FreeComponentNames(i,first);
+    return NULL;
+}
+
+/***====================================================================***/
+
+XkbComponentListPtr
+XkbListComponents(     Display *               dpy,
+                       unsigned                deviceSpec,
+                       XkbComponentNamesPtr    ptrns,
+                       int *                   max_inout)
+{
+register xkbListComponentsReq* req;
+xkbListComponentsReply                 rep;
+XkbInfoPtr                     xkbi;
+XkbComponentListPtr            list;
+XkbReadBufferRec               buf;
+int                            left;
+char *                         str;
+int extraLen,len,mapLen,codesLen,typesLen,compatLen,symsLen,geomLen;
+
+    if ( (dpy==NULL) || (dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)) ||
+       (ptrns==NULL) || (max_inout==NULL))
+       return NULL;
+
+    xkbi= dpy->xkb_info;
+    LockDisplay(dpy);
+    GetReq(kbListComponents, req);
+    req->reqType =     xkbi->codes->major_opcode;
+    req->xkbReqType =  X_kbListComponents;
+    req->deviceSpec =  deviceSpec;
+    req->maxNames =    *max_inout;
+
+    mapLen= codesLen= typesLen= compatLen= symsLen= geomLen= 0;
+    if (ptrns->keymap)
+       mapLen= (int)strlen(ptrns->keymap);
+    if (ptrns->keycodes)
+       codesLen= (int)strlen(ptrns->keycodes);
+    if (ptrns->types)
+       typesLen= (int)strlen(ptrns->types);
+    if (ptrns->compat)
+       compatLen= (int)strlen(ptrns->compat);
+    if (ptrns->symbols)
+       symsLen= (int)strlen(ptrns->symbols);
+    if (ptrns->geometry)
+       geomLen= (int)strlen(ptrns->geometry);
+    if (mapLen>255)    mapLen= 255;
+    if (codesLen>255)  codesLen= 255;
+    if (typesLen>255)  typesLen= 255;
+    if (compatLen>255) compatLen= 255;
+    if (symsLen>255)   symsLen= 255;
+    if (geomLen>255)   geomLen= 255;
+
+    len= mapLen+codesLen+typesLen+compatLen+symsLen+geomLen+6;
+    len= XkbPaddedSize(len);
+    req->length+= len/4;
+    BufAlloc(char *,str,len);
+    *str++= mapLen;
+    if (mapLen>0) {
+        memcpy(str,ptrns->keymap,mapLen);
+        str+= mapLen;
+    }
+    *str++= codesLen;
+    if (codesLen>0) {
+        memcpy(str,ptrns->keycodes,codesLen);
+        str+= codesLen;
+    }
+    *str++= typesLen;
+    if (typesLen>0) {
+        memcpy(str,ptrns->types,typesLen);
+        str+= typesLen;
+    }
+    *str++= compatLen;
+    if (compatLen>0) {
+        memcpy(str,ptrns->compat,compatLen);
+        str+= compatLen;
+    }
+    *str++= symsLen;
+    if (symsLen>0) {
+        memcpy(str,ptrns->symbols,symsLen);
+        str+= symsLen;
+    }
+    *str++= geomLen;
+    if (geomLen>0) {
+        memcpy(str,ptrns->geometry,geomLen);
+        str+= geomLen;
+    }
+    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse))
+       goto BAILOUT;
+    extraLen= (int)rep.length*4;
+    *max_inout= rep.extra;
+    if (extraLen==0) { /* no matches, but we don't want to report a failure */
+       list= _XkbTypedCalloc(1,XkbComponentListRec);
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return list;
+    }
+    if (_XkbInitReadBuffer(dpy,&buf,extraLen)) {
+       Status status;
+
+       status= Success;
+       list= _XkbTypedCalloc(1,XkbComponentListRec);
+       if (!list) {
+           _XkbFreeReadBuffer(&buf);
+           goto BAILOUT;
+       }
+       list->num_keymaps= rep.nKeymaps;
+       list->num_keycodes= rep.nKeycodes;
+       list->num_types= rep.nTypes;
+       list->num_compat= rep.nCompatMaps;
+       list->num_symbols= rep.nSymbols;
+       list->num_geometry= rep.nGeometries;
+       if ((status==Success)&&(list->num_keymaps>0))
+           list->keymaps= _ReadListing(&buf,list->num_keymaps,&status);
+       if ((status==Success)&&(list->num_keycodes>0))
+           list->keycodes= _ReadListing(&buf,list->num_keycodes,&status);
+       if ((status==Success)&&(list->num_types>0))
+           list->types= _ReadListing(&buf,list->num_types,&status);
+       if ((status==Success)&&(list->num_compat>0))
+           list->compat= _ReadListing(&buf,list->num_compat,&status);
+       if ((status==Success)&&(list->num_symbols>0))
+           list->symbols= _ReadListing(&buf,list->num_symbols,&status);
+       if ((status==Success)&&(list->num_geometry>0))
+           list->geometry= _ReadListing(&buf,list->num_geometry,&status);
+       left= _XkbFreeReadBuffer(&buf);
+       if ((status!=Success)||(buf.error)||(left>2)) {
+           XkbFreeComponentList(list);
+           goto BAILOUT;
+       }
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return list;
+    }
+BAILOUT:
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return NULL;
+}
+
+void
+XkbFreeComponentList(XkbComponentListPtr list)
+{
+    if (list) {
+       if (list->keymaps)
+           _FreeComponentNames(list->num_keymaps,list->keymaps);
+       if (list->keycodes)
+           _FreeComponentNames(list->num_keycodes,list->keycodes);
+       if (list->types)
+           _FreeComponentNames(list->num_types,list->types);
+       if (list->compat)
+           _FreeComponentNames(list->num_compat,list->compat);
+       if (list->symbols)
+           _FreeComponentNames(list->num_symbols,list->symbols);
+       if (list->geometry)
+           _FreeComponentNames(list->num_geometry,list->geometry);
+       bzero((char *)list,sizeof(XkbComponentListRec));
+       _XkbFree(list);
+    }
+    return;
+}
diff --git a/src/xkb/XKBMAlloc.c b/src/xkb/XKBMAlloc.c
new file mode 100644 (file)
index 0000000..a6b3921
--- /dev/null
@@ -0,0 +1,990 @@
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+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 Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS 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_DIX_CONFIG_H
+#include <dix-config.h>
+#elif defined(HAVE_CONFIG_H)
+#include <config.h>
+#endif
+
+#ifndef XKB_IN_SERVER
+
+#include <stdio.h>
+#include "Xlibint.h"
+#include <X11/extensions/XKBproto.h>
+#include <X11/keysym.h>
+#include "XKBlibint.h"
+
+#else
+
+#include <stdio.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include "misc.h"
+#include "inputstr.h"
+#include <X11/keysym.h>
+#define        XKBSRV_NEED_FILE_FUNCS
+#include <X11/extensions/XKBsrv.h>
+
+#endif /* XKB_IN_SERVER */
+
+/***====================================================================***/
+
+Status
+XkbAllocClientMap(XkbDescPtr xkb,unsigned which,unsigned nTotalTypes)
+{
+register int   i;
+XkbClientMapPtr map;
+
+    if ((xkb==NULL)||((nTotalTypes>0)&&(nTotalTypes<XkbNumRequiredTypes)))
+       return BadValue;
+    if ((which&XkbKeySymsMask)&&
+       ((!XkbIsLegalKeycode(xkb->min_key_code))||
+        (!XkbIsLegalKeycode(xkb->max_key_code))||
+        (xkb->max_key_code<xkb->min_key_code))) {
+#ifdef DEBUG
+fprintf(stderr,"bad keycode (%d,%d) in XkbAllocClientMap\n",
+                               xkb->min_key_code,xkb->max_key_code);
+#endif
+       return BadValue;
+    }
+
+    if (xkb->map==NULL) {
+       map= _XkbTypedCalloc(1,XkbClientMapRec);
+       if (map==NULL)
+           return BadAlloc;
+       xkb->map= map;
+    }
+    else map= xkb->map;
+
+    if ((which&XkbKeyTypesMask)&&(nTotalTypes>0)) {
+       if (map->types==NULL) {
+           map->types= _XkbTypedCalloc(nTotalTypes,XkbKeyTypeRec);
+           if (map->types==NULL)
+               return BadAlloc;
+           map->num_types= 0;
+           map->size_types= nTotalTypes;
+       }
+       else if (map->size_types<nTotalTypes) {
+           XkbKeyTypeRec *prev_types = map->types;
+
+           map->types= _XkbTypedRealloc(map->types,nTotalTypes,XkbKeyTypeRec);
+           if (map->types==NULL) {
+               _XkbFree(prev_types);
+               map->num_types= map->size_types= 0;
+               return BadAlloc;
+           }
+           map->size_types= nTotalTypes;
+           bzero(&map->types[map->num_types],
+                 ((map->size_types-map->num_types)*sizeof(XkbKeyTypeRec)));
+       }
+    }
+    if (which&XkbKeySymsMask) {
+       int nKeys= XkbNumKeys(xkb);
+       if (map->syms==NULL) {
+           map->size_syms= (nKeys*15)/10;
+           map->syms= _XkbTypedCalloc(map->size_syms,KeySym);
+           if (!map->syms) {
+               map->size_syms= 0;
+               return BadAlloc;
+           }
+           map->num_syms= 1;
+           map->syms[0]= NoSymbol;
+       }
+       if (map->key_sym_map==NULL) {
+           i= xkb->max_key_code+1;
+           map->key_sym_map= _XkbTypedCalloc(i,XkbSymMapRec);
+           if (map->key_sym_map==NULL)
+               return BadAlloc;
+       }
+    }
+    if (which&XkbModifierMapMask) {
+       if ((!XkbIsLegalKeycode(xkb->min_key_code))||
+           (!XkbIsLegalKeycode(xkb->max_key_code))||
+           (xkb->max_key_code<xkb->min_key_code))
+           return BadMatch;
+       if (map->modmap==NULL) {
+           i= xkb->max_key_code+1;
+           map->modmap= _XkbTypedCalloc(i,unsigned char);
+           if (map->modmap==NULL)
+               return BadAlloc;
+       }
+    }
+    return Success;
+}
+
+Status
+XkbAllocServerMap(XkbDescPtr xkb,unsigned which,unsigned nNewActions)
+{
+register int   i;
+XkbServerMapPtr map;
+
+    if (xkb==NULL)
+       return BadMatch;
+    if (xkb->server==NULL) {
+       map= _XkbTypedCalloc(1,XkbServerMapRec);
+       if (map==NULL)
+           return BadAlloc;
+       for (i=0;i<XkbNumVirtualMods;i++) {
+           map->vmods[i]= XkbNoModifierMask;
+       }
+       xkb->server= map;
+    }
+    else map= xkb->server;
+    if (which&XkbExplicitComponentsMask) {
+       if ((!XkbIsLegalKeycode(xkb->min_key_code))||
+           (!XkbIsLegalKeycode(xkb->max_key_code))||
+           (xkb->max_key_code<xkb->min_key_code))
+           return BadMatch;
+       if (map->explicit==NULL) {
+           i= xkb->max_key_code+1;
+           map->explicit= _XkbTypedCalloc(i,unsigned char);
+           if (map->explicit==NULL)
+               return BadAlloc;
+       }
+    }
+    if (which&XkbKeyActionsMask) {
+       if ((!XkbIsLegalKeycode(xkb->min_key_code))||
+           (!XkbIsLegalKeycode(xkb->max_key_code))||
+           (xkb->max_key_code<xkb->min_key_code))
+           return BadMatch;
+        if (nNewActions<1)
+           nNewActions= 1;
+       if (map->acts==NULL) {
+           map->acts= _XkbTypedCalloc((nNewActions+1),XkbAction);
+           if (map->acts==NULL)
+               return BadAlloc;
+           map->num_acts= 1;
+           map->size_acts= nNewActions+1;
+       }
+       else if ((map->size_acts-map->num_acts)<nNewActions) {
+           unsigned need;
+           XkbAction *prev_acts = map->acts;
+           need= map->num_acts+nNewActions;
+           map->acts= _XkbTypedRealloc(map->acts,need,XkbAction);
+           if (map->acts==NULL) {
+               _XkbFree(prev_acts);
+               map->num_acts= map->size_acts= 0;
+               return BadAlloc;
+           }
+           map->size_acts= need;
+           bzero(&map->acts[map->num_acts],
+                   ((map->size_acts-map->num_acts)*sizeof(XkbAction)));
+       }
+       if (map->key_acts==NULL) {
+           i= xkb->max_key_code+1;
+           map->key_acts= _XkbTypedCalloc(i,unsigned short);
+           if (map->key_acts==NULL)
+               return BadAlloc;
+       }
+    }
+    if (which&XkbKeyBehaviorsMask) {
+       if ((!XkbIsLegalKeycode(xkb->min_key_code))||
+           (!XkbIsLegalKeycode(xkb->max_key_code))||
+           (xkb->max_key_code<xkb->min_key_code))
+           return BadMatch;
+       if (map->behaviors==NULL) {
+           i= xkb->max_key_code+1;
+           map->behaviors= _XkbTypedCalloc(i,XkbBehavior);
+           if (map->behaviors==NULL)
+               return BadAlloc;
+       }
+    }
+    if (which&XkbVirtualModMapMask) {
+       if ((!XkbIsLegalKeycode(xkb->min_key_code))||
+           (!XkbIsLegalKeycode(xkb->max_key_code))||
+           (xkb->max_key_code<xkb->min_key_code))
+           return BadMatch;
+       if (map->vmodmap==NULL) {
+           i= xkb->max_key_code+1;
+           map->vmodmap= _XkbTypedCalloc(i,unsigned short);
+           if (map->vmodmap==NULL)
+               return BadAlloc;
+       }
+    }
+    return Success;
+}
+
+/***====================================================================***/
+
+Status
+XkbCopyKeyType(XkbKeyTypePtr from,XkbKeyTypePtr into)
+{
+    if ((!from)||(!into))
+       return BadMatch;
+    if (into->map) {
+       _XkbFree(into->map);
+       into->map= NULL;
+    }
+    if (into->preserve) {
+       _XkbFree(into->preserve);
+       into->preserve= NULL;
+    }
+    if (into->level_names) {
+       _XkbFree(into->level_names);
+       into->level_names= NULL;
+    }
+    *into= *from;
+    if ((from->map)&&(into->map_count>0)) {
+       into->map= _XkbTypedCalloc(into->map_count,XkbKTMapEntryRec);
+       if (!into->map)
+           return BadAlloc;
+       memcpy(into->map,from->map,into->map_count*sizeof(XkbKTMapEntryRec));
+    }
+    if ((from->preserve)&&(into->map_count>0)) {
+       into->preserve= _XkbTypedCalloc(into->map_count,XkbModsRec);
+       if (!into->preserve)
+           return BadAlloc;
+       memcpy(into->preserve,from->preserve,
+                               into->map_count*sizeof(XkbModsRec));
+    }
+    if ((from->level_names)&&(into->num_levels>0)) {
+       into->level_names= _XkbTypedCalloc(into->num_levels,Atom);
+       if (!into->level_names)
+           return BadAlloc;
+       memcpy(into->level_names,from->level_names,
+                                into->num_levels*sizeof(Atom));
+    }
+    return Success;
+}
+
+Status
+XkbCopyKeyTypes(XkbKeyTypePtr from,XkbKeyTypePtr into,int num_types)
+{
+register int i,rtrn;
+
+    if ((!from)||(!into)||(num_types<0))
+       return BadMatch;
+    for (i=0;i<num_types;i++) {
+       if ((rtrn= XkbCopyKeyType(from++,into++))!=Success)
+           return rtrn;
+    }
+    return Success;
+}
+
+XkbKeyTypePtr
+XkbAddKeyType( XkbDescPtr      xkb,
+               Atom            name,
+               int             map_count,
+               Bool            want_preserve,
+               int             num_lvls)
+{
+register int   i;
+unsigned       tmp;
+XkbKeyTypePtr  type;
+XkbClientMapPtr        map;
+
+    if ((!xkb)||(num_lvls<1))
+       return NULL;
+    map= xkb->map;
+    if ((map)&&(map->types)) {
+       for (i=0;i<map->num_types;i++) {
+           if (map->types[i].name==name) {
+               Status status;
+               status=XkbResizeKeyType(xkb,i,map_count,want_preserve,num_lvls);
+               return (status==Success?&map->types[i]:NULL);
+           }
+       }
+    }
+    if ((!map)||(!map->types)||(!map->num_types<XkbNumRequiredTypes)) {
+       tmp= XkbNumRequiredTypes+1;
+       if (XkbAllocClientMap(xkb,XkbKeyTypesMask,tmp)!=Success)
+           return NULL;
+        if (!map)
+            map = xkb->map;
+       tmp= 0;
+       if (map->num_types<=XkbKeypadIndex)
+           tmp|= XkbKeypadMask;
+       if (map->num_types<=XkbAlphabeticIndex)
+           tmp|= XkbAlphabeticMask;
+       if (map->num_types<=XkbTwoLevelIndex)
+           tmp|= XkbTwoLevelMask;
+       if (map->num_types<=XkbOneLevelIndex)
+           tmp|= XkbOneLevelMask;
+       if (XkbInitCanonicalKeyTypes(xkb,tmp,XkbNoModifier)==Success) {
+           for (i=0;i<map->num_types;i++) {
+               Status status;
+               if (map->types[i].name!=name)
+                   continue;
+               status=XkbResizeKeyType(xkb,i,map_count,want_preserve,num_lvls);
+               return (status==Success?&map->types[i]:NULL);
+           }
+       }
+    }
+    if ((map->num_types<=map->size_types)&&
+       (XkbAllocClientMap(xkb,XkbKeyTypesMask,map->num_types+1)!=Success)) {
+       return NULL;
+    }
+    type= &map->types[map->num_types];
+    map->num_types++;
+    bzero((char *)type,sizeof(XkbKeyTypeRec));
+    type->num_levels=  num_lvls;
+    type->map_count=   map_count;
+    type->name=                name;
+    if (map_count>0) {
+       type->map=      _XkbTypedCalloc(map_count,XkbKTMapEntryRec);
+       if (!type->map) {
+           map->num_types--;
+           return NULL;
+       }
+       if (want_preserve) {
+           type->preserve=     _XkbTypedCalloc(map_count,XkbModsRec);
+           if (!type->preserve) {
+               _XkbFree(type->map);
+               map->num_types--;
+               return NULL;
+           }
+       }
+    }
+    return type;
+}
+
+Status
+XkbResizeKeyType(      XkbDescPtr      xkb,
+                       int             type_ndx,
+                       int             map_count,
+                       Bool            want_preserve,
+                       int             new_num_lvls)
+{
+XkbKeyTypePtr  type;
+KeyCode                matchingKeys[XkbMaxKeyCount],nMatchingKeys;
+
+    if ((type_ndx<0)||(type_ndx>=xkb->map->num_types)||(map_count<0)||
+                                                       (new_num_lvls<1))
+       return BadValue;
+    switch (type_ndx) {
+       case XkbOneLevelIndex:
+           if (new_num_lvls!=1)
+               return BadMatch;
+           break;
+       case XkbTwoLevelIndex:
+       case XkbAlphabeticIndex:
+       case XkbKeypadIndex:
+           if (new_num_lvls!=2)
+               return BadMatch;
+           break;
+    }
+    type= &xkb->map->types[type_ndx];
+    if (map_count==0) {
+       if (type->map!=NULL)
+           _XkbFree(type->map);
+       type->map= NULL;
+       if (type->preserve!=NULL)
+           _XkbFree(type->preserve);
+       type->preserve= NULL;
+       type->map_count= 0;
+    }
+    else {
+       XkbKTMapEntryRec *prev_map = type->map;
+
+       if ((map_count>type->map_count)||(type->map==NULL))
+           type->map=_XkbTypedRealloc(type->map,map_count,XkbKTMapEntryRec);
+       if (!type->map) {
+           if (prev_map)
+               _XkbFree(prev_map);
+           return BadAlloc;
+       }
+       if (want_preserve) {
+           XkbModsRec *prev_preserve = type->preserve;
+
+           if ((map_count>type->map_count)||(type->preserve==NULL)) {
+               type->preserve= _XkbTypedRealloc(type->preserve,map_count,
+                                                           XkbModsRec);
+           }
+           if (!type->preserve) {
+               if (prev_preserve)
+                   _XkbFree(prev_preserve);
+               return BadAlloc;
+           }
+       }
+       else if (type->preserve!=NULL) {
+           _XkbFree(type->preserve);
+           type->preserve= NULL;
+       }
+       type->map_count= map_count;
+    }
+
+    if ((new_num_lvls>type->num_levels)||(type->level_names==NULL)) {
+       Atom * prev_level_names = type->level_names;
+
+       type->level_names=_XkbTypedRealloc(type->level_names,new_num_lvls,Atom);
+       if (!type->level_names) {
+           if (prev_level_names)
+               _XkbFree(prev_level_names);
+           return BadAlloc;
+       }
+    }
+    /*
+     * Here's the theory:
+     *    If the width of the type changed, we might have to resize the symbol
+     * maps for any keys that use the type for one or more groups.  This is
+     * expensive, so we'll try to cull out any keys that are obviously okay:
+     * In any case:
+     *    - keys that have a group width <= the old width are okay (because
+     *      they could not possibly have been associated with the old type)
+     * If the key type increased in size:
+     *    - keys that already have a group width >= to the new width are okay
+     *    + keys that have a group width >= the old width but < the new width
+     *      might have to be enlarged.
+     * If the key type decreased in size:
+     *    - keys that have a group width > the old width don't have to be
+     *      resized (because they must have some other wider type associated
+     *      with some group).
+     *    + keys that have a group width == the old width might have to be
+     *      shrunk.
+     * The possibilities marked with '+' require us to examine the key types
+     * associated with each group for the key.
+     */
+    bzero(matchingKeys,XkbMaxKeyCount*sizeof(KeyCode));
+    nMatchingKeys= 0;
+    if (new_num_lvls>type->num_levels) {
+       int                     nTotal;
+       KeySym  *               newSyms;
+       int                     width,match,nResize;
+       register int            i,g,nSyms;
+
+       nResize= 0;
+       for (nTotal=1,i=xkb->min_key_code;i<=xkb->max_key_code;i++) {
+           width= XkbKeyGroupsWidth(xkb,i);
+           if (width<type->num_levels)
+               continue;
+           for (match=0,g=XkbKeyNumGroups(xkb,i)-1;(g>=0)&&(!match);g--) {
+               if (XkbKeyKeyTypeIndex(xkb,i,g)==type_ndx) {
+                   matchingKeys[nMatchingKeys++]= i;
+                   match= 1;
+               }
+           }
+           if ((!match)||(width>=new_num_lvls))
+               nTotal+= XkbKeyNumSyms(xkb,i);
+           else {
+               nTotal+= XkbKeyNumGroups(xkb,i)*new_num_lvls;
+               nResize++;
+           }
+       }
+       if (nResize>0) {
+           int nextMatch;
+           xkb->map->size_syms= (nTotal*12)/10;
+           newSyms = _XkbTypedCalloc(xkb->map->size_syms,KeySym);
+           if (newSyms==NULL)
+               return BadAlloc;
+           nextMatch= 0;
+           nSyms= 1;
+           for (i=xkb->min_key_code;i<=xkb->max_key_code;i++) {
+               if (matchingKeys[nextMatch]==i) {
+                   KeySym *pOld;
+                   nextMatch++;
+                   width= XkbKeyGroupsWidth(xkb,i);
+                   pOld= XkbKeySymsPtr(xkb,i);
+                   for (g=XkbKeyNumGroups(xkb,i)-1;g>=0;g--) {
+                       memcpy(&newSyms[nSyms+(new_num_lvls*g)],&pOld[width*g],
+                                                       width*sizeof(KeySym));
+                   }
+                   xkb->map->key_sym_map[i].offset= nSyms;
+                   nSyms+= XkbKeyNumGroups(xkb,i)*new_num_lvls;
+               }
+               else {
+                   memcpy(&newSyms[nSyms],XkbKeySymsPtr(xkb,i),
+                                       XkbKeyNumSyms(xkb,i)*sizeof(KeySym));
+                   xkb->map->key_sym_map[i].offset= nSyms;
+                   nSyms+= XkbKeyNumSyms(xkb,i);
+               }
+           }
+           type->num_levels= new_num_lvls;
+           _XkbFree(xkb->map->syms);
+           xkb->map->syms= newSyms;
+           xkb->map->num_syms= nSyms;
+           return Success;
+       }
+    }
+    else if (new_num_lvls<type->num_levels) {
+       int             width,match;
+       register int    g,i;
+       for (i=xkb->min_key_code;i<=xkb->max_key_code;i++) {
+           width= XkbKeyGroupsWidth(xkb,i);
+           if (width<type->num_levels)
+               continue;
+           for (match=0,g=XkbKeyNumGroups(xkb,i)-1;(g>=0)&&(!match);g--) {
+               if (XkbKeyKeyTypeIndex(xkb,i,g)==type_ndx) {
+                   matchingKeys[nMatchingKeys++]= i;
+                   match= 1;
+               }
+           }
+       }
+    }
+    if (nMatchingKeys>0) {
+       int             key,firstClear;
+       register int    i,g;
+       if (new_num_lvls>type->num_levels)
+            firstClear= type->num_levels;
+       else firstClear= new_num_lvls;
+       for (i=0;i<nMatchingKeys;i++) {
+           KeySym *    pSyms;
+           int         width,nClear;
+
+           key= matchingKeys[i];
+           width= XkbKeyGroupsWidth(xkb,key);
+           nClear= width-firstClear;
+           pSyms= XkbKeySymsPtr(xkb,key);
+           for (g=XkbKeyNumGroups(xkb,key)-1;g>=0;g--) {
+               if (XkbKeyKeyTypeIndex(xkb,key,g)==type_ndx) {
+                   if (nClear>0)
+                       bzero(&pSyms[g*width+firstClear],nClear*sizeof(KeySym));
+               }
+           }
+       }
+    }
+    type->num_levels= new_num_lvls;
+    return Success;
+}
+
+KeySym *
+XkbResizeKeySyms(XkbDescPtr xkb,int key,int needed)
+{
+register int i,nSyms,nKeySyms;
+unsigned nOldSyms;
+KeySym *newSyms;
+
+    if (needed==0) {
+       xkb->map->key_sym_map[key].offset= 0;
+       return xkb->map->syms;
+    }
+    nOldSyms= XkbKeyNumSyms(xkb,key);
+    if (nOldSyms>=(unsigned)needed) {
+       return XkbKeySymsPtr(xkb,key);
+    }
+    if (xkb->map->size_syms-xkb->map->num_syms>=(unsigned)needed) {
+       if (nOldSyms>0) {
+           memcpy(&xkb->map->syms[xkb->map->num_syms],XkbKeySymsPtr(xkb,key),
+                                               nOldSyms*sizeof(KeySym));
+       }
+       if ((needed-nOldSyms)>0) {
+           bzero(&xkb->map->syms[xkb->map->num_syms+XkbKeyNumSyms(xkb,key)],
+                                       (needed-nOldSyms)*sizeof(KeySym));
+       }
+       xkb->map->key_sym_map[key].offset = xkb->map->num_syms;
+       xkb->map->num_syms+= needed;
+       return &xkb->map->syms[xkb->map->key_sym_map[key].offset];
+    }
+    xkb->map->size_syms+= (needed>32?needed:32);
+    newSyms = _XkbTypedCalloc(xkb->map->size_syms,KeySym);
+    if (newSyms==NULL)
+       return NULL;
+    newSyms[0]= NoSymbol;
+    nSyms = 1;
+    for (i=xkb->min_key_code;i<=(int)xkb->max_key_code;i++) {
+       int nCopy;
+
+       nCopy= nKeySyms= XkbKeyNumSyms(xkb,i);
+       if ((nKeySyms==0)&&(i!=key))
+           continue;
+       if (i==key)
+           nKeySyms= needed;
+       if (nCopy!=0)
+          memcpy(&newSyms[nSyms],XkbKeySymsPtr(xkb,i),nCopy*sizeof(KeySym));
+       if (nKeySyms>nCopy)
+           bzero(&newSyms[nSyms+nCopy],(nKeySyms-nCopy)*sizeof(KeySym));
+       xkb->map->key_sym_map[i].offset = nSyms;
+       nSyms+= nKeySyms;
+    }
+    _XkbFree(xkb->map->syms);
+    xkb->map->syms = newSyms;
+    xkb->map->num_syms = nSyms;
+    return &xkb->map->syms[xkb->map->key_sym_map[key].offset];
+}
+
+static unsigned
+_ExtendRange(  unsigned int    old_flags,
+               unsigned int    flag,
+               KeyCode         newKC,
+               KeyCode *       old_min,
+               unsigned char * old_num)
+{
+    if ((old_flags&flag)==0) {
+       old_flags|= flag;
+       *old_min= newKC;
+       *old_num= 1;
+    }
+    else {
+       int     last= (*old_min)+(*old_num)-1;
+       if (newKC<*old_min) {
+           *old_min= newKC;
+           *old_num= (last-newKC)+1;
+       }
+       else if (newKC>last) {
+           *old_num= (newKC-(*old_min))+1;
+       }
+    }
+    return old_flags;
+}
+
+Status
+XkbChangeKeycodeRange( XkbDescPtr      xkb,
+                       int             minKC,
+                       int             maxKC,
+                       XkbChangesPtr   changes)
+{
+int    tmp;
+
+    if ((!xkb)||(minKC<XkbMinLegalKeyCode)||(maxKC>XkbMaxLegalKeyCode))
+       return BadValue;
+    if (minKC>maxKC)
+       return BadMatch;
+    if (minKC<xkb->min_key_code) {
+       if (changes)
+           changes->map.min_key_code= minKC;
+       tmp= xkb->min_key_code-minKC;
+       if (xkb->map)  {
+           if (xkb->map->key_sym_map) {
+               bzero((char *)&xkb->map->key_sym_map[minKC],
+                                       tmp*sizeof(XkbSymMapRec));
+               if (changes) {
+                   changes->map.changed= _ExtendRange(changes->map.changed,
+                                               XkbKeySymsMask,minKC,
+                                               &changes->map.first_key_sym,
+                                               &changes->map.num_key_syms);
+               }
+           }
+           if (xkb->map->modmap) {
+               bzero((char *)&xkb->map->modmap[minKC],tmp);
+               if (changes) {
+                   changes->map.changed= _ExtendRange(changes->map.changed,
+                                               XkbModifierMapMask,minKC,
+                                               &changes->map.first_modmap_key,
+                                               &changes->map.num_modmap_keys);
+               }
+           }
+       }
+       if (xkb->server) {
+           if (xkb->server->behaviors) {
+               bzero((char *)&xkb->server->behaviors[minKC],
+                                               tmp*sizeof(XkbBehavior));
+               if (changes) {
+                   changes->map.changed= _ExtendRange(changes->map.changed,
+                                       XkbKeyBehaviorsMask,minKC,
+                                       &changes->map.first_key_behavior,
+                                       &changes->map.num_key_behaviors);
+               }
+           }
+           if (xkb->server->key_acts) {
+               bzero((char *)&xkb->server->key_acts[minKC],
+                                               tmp*sizeof(unsigned short));
+               if (changes) {
+                   changes->map.changed= _ExtendRange(changes->map.changed,
+                                       XkbKeyActionsMask,minKC,
+                                       &changes->map.first_key_act,
+                                       &changes->map.num_key_acts);
+               }
+           }
+           if (xkb->server->vmodmap) {
+               bzero((char *)&xkb->server->vmodmap[minKC],
+                                               tmp*sizeof(unsigned short));
+               if (changes) {
+                   changes->map.changed= _ExtendRange(changes->map.changed,
+                                       XkbVirtualModMapMask,minKC,
+                                       &changes->map.first_modmap_key,
+                                       &changes->map.num_vmodmap_keys);
+               }
+           }
+       }
+       if ((xkb->names)&&(xkb->names->keys)) {
+           bzero((char *)&xkb->names->keys[minKC],tmp*sizeof(XkbKeyNameRec));
+           if (changes) {
+               changes->names.changed= _ExtendRange(changes->names.changed,
+                                       XkbKeyNamesMask,minKC,
+                                       &changes->names.first_key,
+                                       &changes->names.num_keys);
+           }
+       }
+       xkb->min_key_code= minKC;
+    }
+    if (maxKC>xkb->max_key_code) {
+       if (changes)
+           changes->map.max_key_code= maxKC;
+       tmp= maxKC-xkb->max_key_code;
+       if (xkb->map)  {
+           if (xkb->map->key_sym_map) {
+               XkbSymMapRec *prev_key_sym_map = xkb->map->key_sym_map;
+
+               xkb->map->key_sym_map= _XkbTypedRealloc(xkb->map->key_sym_map,
+                                               (maxKC+1),XkbSymMapRec);
+               if (!xkb->map->key_sym_map) {
+                   _XkbFree(prev_key_sym_map);
+                   return BadAlloc;
+               }
+               bzero((char *)&xkb->map->key_sym_map[xkb->max_key_code],
+                                       tmp*sizeof(XkbSymMapRec));
+               if (changes) {
+                   changes->map.changed= _ExtendRange(changes->map.changed,
+                                               XkbKeySymsMask,maxKC,
+                                               &changes->map.first_key_sym,
+                                               &changes->map.num_key_syms);
+               }
+           }
+           if (xkb->map->modmap) {
+               unsigned char *prev_modmap = xkb->map->modmap;
+
+               xkb->map->modmap= _XkbTypedRealloc(xkb->map->modmap,
+                                               (maxKC+1),unsigned char);
+               if (!xkb->map->modmap) {
+                   _XkbFree(prev_modmap);
+                   return BadAlloc;
+               }
+               bzero((char *)&xkb->map->modmap[xkb->max_key_code],tmp);
+               if (changes) {
+                   changes->map.changed= _ExtendRange(changes->map.changed,
+                                               XkbModifierMapMask,maxKC,
+                                               &changes->map.first_modmap_key,
+                                               &changes->map.num_modmap_keys);
+               }
+           }
+       }
+       if (xkb->server) {
+           if (xkb->server->behaviors) {
+               XkbBehavior *prev_behaviors = xkb->server->behaviors;
+
+               xkb->server->behaviors=_XkbTypedRealloc(xkb->server->behaviors,
+                                               (maxKC+1),XkbBehavior);
+               if (!xkb->server->behaviors) {
+                   _XkbFree(prev_behaviors);
+                   return BadAlloc;
+               }
+               bzero((char *)&xkb->server->behaviors[xkb->max_key_code],
+                                               tmp*sizeof(XkbBehavior));
+               if (changes) {
+                   changes->map.changed= _ExtendRange(changes->map.changed,
+                                       XkbKeyBehaviorsMask,maxKC,
+                                       &changes->map.first_key_behavior,
+                                       &changes->map.num_key_behaviors);
+               }
+           }
+           if (xkb->server->key_acts) {
+               unsigned short *prev_key_acts = xkb->server->key_acts;
+
+               xkb->server->key_acts= _XkbTypedRealloc(xkb->server->key_acts,
+                                               (maxKC+1),unsigned short);
+               if (!xkb->server->key_acts) {
+                   _XkbFree(prev_key_acts);
+                   return BadAlloc;
+               }
+               bzero((char *)&xkb->server->key_acts[xkb->max_key_code],
+                                               tmp*sizeof(unsigned short));
+               if (changes) {
+                   changes->map.changed= _ExtendRange(changes->map.changed,
+                                       XkbKeyActionsMask,maxKC,
+                                       &changes->map.first_key_act,
+                                       &changes->map.num_key_acts);
+               }
+           }
+           if (xkb->server->vmodmap) {
+               unsigned short *prev_vmodmap = xkb->server->vmodmap;
+
+               xkb->server->vmodmap= _XkbTypedRealloc(xkb->server->vmodmap,
+                                               (maxKC+1),unsigned short);
+               if (!xkb->server->vmodmap) {
+                   _XkbFree(prev_vmodmap);
+                   return BadAlloc;
+               }
+               bzero((char *)&xkb->server->vmodmap[xkb->max_key_code],
+                                               tmp*sizeof(unsigned short));
+               if (changes) {
+                   changes->map.changed= _ExtendRange(changes->map.changed,
+                                       XkbVirtualModMapMask,maxKC,
+                                       &changes->map.first_modmap_key,
+                                       &changes->map.num_vmodmap_keys);
+               }
+           }
+       }
+       if ((xkb->names)&&(xkb->names->keys)) {
+           XkbKeyNameRec *prev_keys = xkb->names->keys;
+
+           xkb->names->keys= _XkbTypedRealloc(xkb->names->keys,
+                                               (maxKC+1),XkbKeyNameRec);
+           if (!xkb->names->keys) {
+               _XkbFree(prev_keys);
+               return BadAlloc;
+           }
+           bzero((char *)&xkb->names->keys[xkb->max_key_code],
+                                               tmp*sizeof(XkbKeyNameRec));
+           if (changes) {
+               changes->names.changed= _ExtendRange(changes->names.changed,
+                                       XkbKeyNamesMask,maxKC,
+                                       &changes->names.first_key,
+                                       &changes->names.num_keys);
+           }
+       }
+       xkb->max_key_code= maxKC;
+    }
+    return Success;
+}
+
+XkbAction *
+XkbResizeKeyActions(XkbDescPtr xkb,int key,int needed)
+{
+register int i,nActs;
+XkbAction *newActs;
+
+    if (needed==0) {
+       xkb->server->key_acts[key]= 0;
+       return NULL;
+    }
+    if (XkbKeyHasActions(xkb,key)&&(XkbKeyNumSyms(xkb,key)>=(unsigned)needed))
+       return XkbKeyActionsPtr(xkb,key);
+    if (xkb->server->size_acts-xkb->server->num_acts>=(unsigned)needed) {
+       xkb->server->key_acts[key]= xkb->server->num_acts;
+       xkb->server->num_acts+= needed;
+       return &xkb->server->acts[xkb->server->key_acts[key]];
+    }
+    xkb->server->size_acts= xkb->server->num_acts+needed+8;
+    newActs = _XkbTypedCalloc(xkb->server->size_acts,XkbAction);
+    if (newActs==NULL)
+       return NULL;
+    newActs[0].type = XkbSA_NoAction;
+    nActs = 1;
+    for (i=xkb->min_key_code;i<=(int)xkb->max_key_code;i++) {
+       int nKeyActs,nCopy;
+
+       if ((xkb->server->key_acts[i]==0)&&(i!=key))
+           continue;
+
+       nCopy= nKeyActs= XkbKeyNumActions(xkb,i);
+       if (i==key) {
+           nKeyActs= needed;
+           if (needed<nCopy)
+               nCopy= needed;
+       }
+
+       if (nCopy>0)
+           memcpy(&newActs[nActs],XkbKeyActionsPtr(xkb,i),
+                                               nCopy*sizeof(XkbAction));
+       if (nCopy<nKeyActs)
+           bzero(&newActs[nActs+nCopy],(nKeyActs-nCopy)*sizeof(XkbAction));
+       xkb->server->key_acts[i]= nActs;
+       nActs+= nKeyActs;
+    }
+    _XkbFree(xkb->server->acts);
+    xkb->server->acts = newActs;
+    xkb->server->num_acts= nActs;
+    return &xkb->server->acts[xkb->server->key_acts[key]];
+}
+
+void
+XkbFreeClientMap(XkbDescPtr xkb,unsigned what,Bool freeMap)
+{
+XkbClientMapPtr        map;
+
+    if ((xkb==NULL)||(xkb->map==NULL))
+       return;
+    if (freeMap)
+       what= XkbAllClientInfoMask;
+    map= xkb->map;
+    if (what&XkbKeyTypesMask) {
+       if (map->types!=NULL) {
+           if (map->num_types>0) {
+               register int    i;
+               XkbKeyTypePtr   type;
+               for (i=0,type=map->types;i<map->num_types;i++,type++) {
+                   if (type->map!=NULL) {
+                       _XkbFree(type->map);
+                       type->map= NULL;
+                   }
+                   if (type->preserve!=NULL) {
+                       _XkbFree(type->preserve);
+                       type->preserve= NULL;
+                   }
+                   type->map_count= 0;
+                   if (type->level_names!=NULL) {
+                       _XkbFree(type->level_names);
+                       type->level_names= NULL;
+                   }
+               }
+           }
+           _XkbFree(map->types);
+           map->num_types= map->size_types= 0;
+           map->types= NULL;
+       }
+    }
+    if (what&XkbKeySymsMask) {
+       if (map->key_sym_map!=NULL) {
+           _XkbFree(map->key_sym_map);
+           map->key_sym_map= NULL;
+       }
+       if (map->syms!=NULL) {
+           _XkbFree(map->syms);
+           map->size_syms= map->num_syms= 0;
+           map->syms= NULL;
+       }
+    }
+    if ((what&XkbModifierMapMask)&&(map->modmap!=NULL)) {
+       _XkbFree(map->modmap);
+       map->modmap= NULL;
+    }
+    if (freeMap) {
+       _XkbFree(xkb->map);
+       xkb->map= NULL;
+    }
+    return;
+}
+
+void
+XkbFreeServerMap(XkbDescPtr xkb,unsigned what,Bool freeMap)
+{
+XkbServerMapPtr        map;
+
+    if ((xkb==NULL)||(xkb->server==NULL))
+       return;
+    if (freeMap)
+       what= XkbAllServerInfoMask;
+    map= xkb->server;
+    if ((what&XkbExplicitComponentsMask)&&(map->explicit!=NULL)) {
+       _XkbFree(map->explicit);
+       map->explicit= NULL;
+    }
+    if (what&XkbKeyActionsMask) {
+       if (map->key_acts!=NULL) {
+           _XkbFree(map->key_acts);
+           map->key_acts= NULL;
+       }
+       if (map->acts!=NULL) {
+           _XkbFree(map->acts);
+           map->num_acts= map->size_acts= 0;
+           map->acts= NULL;
+       }
+    }
+    if ((what&XkbKeyBehaviorsMask)&&(map->behaviors!=NULL)) {
+       _XkbFree(map->behaviors);
+       map->behaviors= NULL;
+    }
+    if ((what&XkbVirtualModMapMask)&&(map->vmodmap!=NULL)) {
+       _XkbFree(map->vmodmap);
+       map->vmodmap= NULL;
+    }
+
+    if (freeMap) {
+       _XkbFree(xkb->server);
+       xkb->server= NULL;
+    }
+    return;
+}
diff --git a/src/xkb/XKBMisc.c b/src/xkb/XKBMisc.c
new file mode 100644 (file)
index 0000000..4aa1f73
--- /dev/null
@@ -0,0 +1,978 @@
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+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 Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS 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_DIX_CONFIG_H
+#include <dix-config.h>
+#elif defined(HAVE_CONFIG_H)
+#include <config.h>
+#endif
+
+#ifndef XKB_IN_SERVER
+
+#include <stdio.h>
+#include "Xlibint.h"
+#include <X11/extensions/XKBproto.h>
+#include <X11/keysym.h>
+#include "XKBlibint.h"
+
+#else
+
+#include <stdio.h>
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include "misc.h"
+#include "inputstr.h"
+#include <X11/keysym.h>
+#define        XKBSRV_NEED_FILE_FUNCS
+#include <X11/extensions/XKBsrv.h>
+
+#endif /* XKB_IN_SERVER */
+
+/***====================================================================***/
+
+#define        mapSize(m)      (sizeof(m)/sizeof(XkbKTMapEntryRec))
+static  XkbKTMapEntryRec map2Level[]= {
+  { True, ShiftMask, {1, ShiftMask, 0} }
+};
+
+static  XkbKTMapEntryRec mapAlpha[]= {
+  { True, ShiftMask, { 1, ShiftMask, 0 } },
+  { True, LockMask,  { 0,  LockMask, 0 } }
+};
+
+static XkbModsRec preAlpha[]= {
+       {        0,        0, 0 },
+       { LockMask, LockMask, 0 }
+};
+
+#define        NL_VMOD_MASK    0
+static  XkbKTMapEntryRec mapKeypad[]= {
+       { True, ShiftMask, { 1, ShiftMask,            0 } },
+       { False,        0, { 1,         0, NL_VMOD_MASK } }
+};
+
+static XkbKeyTypeRec   canonicalTypes[XkbNumRequiredTypes] = {
+       { { 0, 0, 0 },
+         1,    /* num_levels */
+         0,    /* map_count */
+         NULL,         NULL,
+         None,         NULL
+       },
+       { { ShiftMask, ShiftMask, 0 },
+         2,    /* num_levels */
+         mapSize(map2Level),   /* map_count */
+         map2Level,    NULL,
+         None,         NULL
+       },
+       { { ShiftMask|LockMask, ShiftMask|LockMask, 0 },
+         2,                            /* num_levels */
+         mapSize(mapAlpha),            /* map_count */
+         mapAlpha,     preAlpha,
+         None,         NULL
+       },
+       { { ShiftMask, ShiftMask, NL_VMOD_MASK },
+         2,                            /* num_levels */
+         mapSize(mapKeypad),           /* map_count */
+         mapKeypad,    NULL,
+         None,         NULL
+       }
+};
+
+Status
+XkbInitCanonicalKeyTypes(XkbDescPtr xkb,unsigned which,int keypadVMod)
+{
+XkbClientMapPtr        map;
+XkbKeyTypePtr  from,to;
+Status         rtrn;
+
+    if (!xkb)
+       return BadMatch;
+    rtrn= XkbAllocClientMap(xkb,XkbKeyTypesMask,XkbNumRequiredTypes);
+    if (rtrn!=Success)
+       return rtrn;
+    map= xkb->map;
+    if ((which&XkbAllRequiredTypes)==0)
+       return Success;
+    rtrn= Success;
+    from= canonicalTypes;
+    to= map->types;
+    if (which&XkbOneLevelMask)
+       rtrn= XkbCopyKeyType(&from[XkbOneLevelIndex],&to[XkbOneLevelIndex]);
+    if ((which&XkbTwoLevelMask)&&(rtrn==Success))
+       rtrn= XkbCopyKeyType(&from[XkbTwoLevelIndex],&to[XkbTwoLevelIndex]);
+    if ((which&XkbAlphabeticMask)&&(rtrn==Success))
+       rtrn= XkbCopyKeyType(&from[XkbAlphabeticIndex],&to[XkbAlphabeticIndex]);
+    if ((which&XkbKeypadMask)&&(rtrn==Success)) {
+       XkbKeyTypePtr type;
+       rtrn= XkbCopyKeyType(&from[XkbKeypadIndex],&to[XkbKeypadIndex]);
+       type= &to[XkbKeypadIndex];
+       if ((keypadVMod>=0)&&(keypadVMod<XkbNumVirtualMods)&&(rtrn==Success)) {
+           type->mods.vmods= (1<<keypadVMod);
+           type->map[0].active= True;
+           type->map[0].mods.mask= ShiftMask;
+           type->map[0].mods.real_mods= ShiftMask;
+           type->map[0].mods.vmods= 0;
+           type->map[0].level= 1;
+           type->map[1].active= False;
+           type->map[1].mods.mask= 0;
+           type->map[1].mods.real_mods= 0;
+           type->map[1].mods.vmods= (1<<keypadVMod);
+           type->map[1].level= 1;
+       }
+    }
+    return Success;
+}
+
+/***====================================================================***/
+
+#define        CORE_SYM(i)     (i<map_width?core_syms[i]:NoSymbol)
+#define        XKB_OFFSET(g,l) (((g)*groupsWidth)+(l))
+
+int
+XkbKeyTypesForCoreSymbols(     XkbDescPtr      xkb,
+                               int             map_width,
+                               KeySym *        core_syms,
+                               unsigned int    protected,
+                               int *           types_inout,
+                               KeySym *        xkb_syms_rtrn)
+{
+register int   i;
+unsigned int   empty;
+int            nSyms[XkbNumKbdGroups];
+int            nGroups,tmp,groupsWidth;
+
+    /* Section 12.2 of the protocol describes this process in more detail */
+    /* Step 1:  find the # of symbols in the core mapping per group */
+    groupsWidth= 2;
+    for (i=0;i<XkbNumKbdGroups;i++) {
+       if ((protected&(1<<i))&&(types_inout[i]<xkb->map->num_types)) {
+           nSyms[i]= xkb->map->types[types_inout[i]].num_levels;
+           if (nSyms[i]>groupsWidth)
+               groupsWidth= nSyms[i];
+       }
+       else {
+           types_inout[i]= XkbTwoLevelIndex;   /* don't really know, yet */
+           nSyms[i]= 2;
+       }
+    }
+    if (nSyms[XkbGroup1Index]<2)
+       nSyms[XkbGroup1Index]= 2;
+    if (nSyms[XkbGroup2Index]<2)
+       nSyms[XkbGroup2Index]= 2;
+    /* Step 2: Copy the symbols from the core ordering to XKB ordering */
+    /*         symbols in the core are in the order:                   */
+    /*         G1L1 G1L2 G2L1 G2L2 [G1L[3-n]] [G2L[3-n]] [G3L*] [G3L*] */
+    xkb_syms_rtrn[XKB_OFFSET(XkbGroup1Index,0)]= CORE_SYM(0);
+    xkb_syms_rtrn[XKB_OFFSET(XkbGroup1Index,1)]= CORE_SYM(1);
+    for (i=2;i<nSyms[XkbGroup1Index];i++) {
+       xkb_syms_rtrn[XKB_OFFSET(XkbGroup1Index,i)]= CORE_SYM(2+i);
+    }
+    xkb_syms_rtrn[XKB_OFFSET(XkbGroup2Index,0)]= CORE_SYM(2);
+    xkb_syms_rtrn[XKB_OFFSET(XkbGroup2Index,1)]= CORE_SYM(3);
+    tmp= 2+(nSyms[XkbGroup1Index]-2); /* offset to extra group2 syms */
+    for (i=2;i<nSyms[XkbGroup2Index];i++) {
+       xkb_syms_rtrn[XKB_OFFSET(XkbGroup2Index,i)]= CORE_SYM(tmp+i);
+    }
+    tmp= nSyms[XkbGroup1Index]+nSyms[XkbGroup2Index];
+    if ((tmp>=map_width)&&
+        ((protected&(XkbExplicitKeyType3Mask|XkbExplicitKeyType4Mask))==0)) {
+       nSyms[XkbGroup3Index]= 0;
+       nSyms[XkbGroup4Index]= 0;
+       nGroups= 2;
+    }
+    else {
+       nGroups= 3;
+       for (i=0;i<nSyms[XkbGroup3Index];i++,tmp++) {
+           xkb_syms_rtrn[XKB_OFFSET(XkbGroup3Index,i)]= CORE_SYM(tmp);
+       }
+       if ((tmp<map_width)||(protected&XkbExplicitKeyType4Mask)) {
+           nGroups= 4;
+           for (i=0;i<nSyms[XkbGroup4Index];i++,tmp++) {
+               xkb_syms_rtrn[XKB_OFFSET(XkbGroup4Index,i)]= CORE_SYM(tmp);
+           }
+       }
+       else {
+           nSyms[XkbGroup4Index]= 0;
+       }
+    }
+    /* steps 3&4: alphanumeric expansion,  assign canonical types */
+    empty= 0;
+    for (i=0;i<nGroups;i++) {
+       KeySym *syms;
+       syms= &xkb_syms_rtrn[XKB_OFFSET(i,0)];
+       if ((nSyms[i]>1)&&(syms[1]==NoSymbol)&&(syms[0]!=NoSymbol)) {
+           KeySym upper,lower;
+           XConvertCase(syms[0],&lower,&upper);
+           if (upper!=lower) {
+               xkb_syms_rtrn[XKB_OFFSET(i,0)]= lower;
+               xkb_syms_rtrn[XKB_OFFSET(i,1)]= upper;
+               if ((protected&(1<<i))==0)
+                   types_inout[i]= XkbAlphabeticIndex;
+           }
+           else if ((protected&(1<<i))==0) {
+               types_inout[i]= XkbOneLevelIndex;
+       /*      nSyms[i]=       1;*/
+           }
+       }
+       if (((protected&(1<<i))==0)&&(types_inout[i]==XkbTwoLevelIndex)) {
+           if (IsKeypadKey(syms[0])||IsKeypadKey(syms[1]))
+               types_inout[i]= XkbKeypadIndex;
+           else {
+               KeySym upper,lower;
+               XConvertCase(syms[0],&lower,&upper);
+               if ((syms[0]==lower)&&(syms[1]==upper))
+                   types_inout[i]= XkbAlphabeticIndex;
+           }
+       }
+       if (syms[0]==NoSymbol) {
+           register int n;
+           Bool        found;
+           for (n=1,found=False;(!found)&&(n<nSyms[i]);n++) {
+               found= (syms[n]!=NoSymbol);
+           }
+           if (!found)
+               empty|= (1<<i);
+       }
+    }
+    /* step 5: squoosh out empty groups */
+    if (empty) {
+       for (i=nGroups-1;i>=0;i--) {
+           if (((empty&(1<<i))==0)||(protected&(1<<i)))
+               break;
+           nGroups--;
+       }
+    }
+    if (nGroups<1)
+       return 0;
+
+    /* step 6: replicate group 1 into group two, if necessary */
+    if ((nGroups>1)&&((empty&(XkbGroup1Mask|XkbGroup2Mask))==XkbGroup2Mask)) {
+       if ((protected&(XkbExplicitKeyType1Mask|XkbExplicitKeyType2Mask))==0) {
+           nSyms[XkbGroup2Index]= nSyms[XkbGroup1Index];
+           types_inout[XkbGroup2Index]= types_inout[XkbGroup1Index];
+           memcpy((char *)&xkb_syms_rtrn[2],(char *)xkb_syms_rtrn,
+                                                       2*sizeof(KeySym));
+       }
+       else if (types_inout[XkbGroup1Index]==types_inout[XkbGroup2Index]) {
+           memcpy((char *)&xkb_syms_rtrn[nSyms[XkbGroup1Index]],
+                                       (char *)xkb_syms_rtrn,
+                                       nSyms[XkbGroup1Index]*sizeof(KeySym));
+       }
+    }
+
+    /* step 7: check for all groups identical or all width 1 */
+    if (nGroups>1) {
+       Bool sameType,allOneLevel;
+       allOneLevel= (xkb->map->types[types_inout[0]].num_levels==1);
+       for (i=1,sameType=True;(allOneLevel||sameType)&&(i<nGroups);i++) {
+           sameType=(sameType&&(types_inout[i]==types_inout[XkbGroup1Index]));
+           if (allOneLevel)
+               allOneLevel= (xkb->map->types[types_inout[i]].num_levels==1);
+       }
+       if ((sameType)&&
+           (!(protected&(XkbExplicitKeyTypesMask&~XkbExplicitKeyType1Mask)))){
+           register int s;
+           Bool        identical;
+           for (i=1,identical=True;identical&&(i<nGroups);i++) {
+               KeySym *syms;
+               syms= &xkb_syms_rtrn[XKB_OFFSET(i,0)];
+               for (s=0;identical&&(s<nSyms[i]);s++) {
+                   if (syms[s]!=xkb_syms_rtrn[s])
+                       identical= False;
+               }
+           }
+           if (identical)
+               nGroups= 1;
+       }
+       if (allOneLevel && (nGroups>1)) {
+           KeySym *syms;
+           syms= &xkb_syms_rtrn[nSyms[XkbGroup1Index]];
+           nSyms[XkbGroup1Index]= 1;
+           for (i=1;i<nGroups;i++) {
+               xkb_syms_rtrn[i]= syms[0];
+               syms+= nSyms[i];
+               nSyms[i]= 1;
+           }
+       }
+    }
+    return nGroups;
+}
+
+static XkbSymInterpretPtr
+_XkbFindMatchingInterp(        XkbDescPtr      xkb,
+                       KeySym          sym,
+                       unsigned int    real_mods,
+                       unsigned int    level)
+{
+register unsigned       i;
+XkbSymInterpretPtr      interp,rtrn;
+CARD8                   mods;
+
+    rtrn= NULL;
+    interp= xkb->compat->sym_interpret;
+    for (i=0;i<xkb->compat->num_si;i++,interp++) {
+       if ((interp->sym==NoSymbol)||(sym==interp->sym)) {
+           int match;
+           if ((level==0)||((interp->match&XkbSI_LevelOneOnly)==0))
+                mods= real_mods;
+           else mods= 0;
+           switch (interp->match&XkbSI_OpMask) {
+               case XkbSI_NoneOf:
+                   match= ((interp->mods&mods)==0);
+                   break;
+               case XkbSI_AnyOfOrNone:
+                   match= ((mods==0)||((interp->mods&mods)!=0));
+                   break;
+               case XkbSI_AnyOf:
+                   match= ((interp->mods&mods)!=0);
+                   break;
+               case XkbSI_AllOf:
+                   match= ((interp->mods&mods)==interp->mods);
+                   break;
+               case XkbSI_Exactly:
+                   match= (interp->mods==mods);
+                   break;
+               default:
+                   match= 0;
+                   break;
+           }
+           if (match) {
+               if (interp->sym!=NoSymbol) {
+                   return interp;
+               }
+               else if (rtrn==NULL) {
+                   rtrn= interp;
+               }
+           }
+       }
+    }
+    return rtrn;
+}
+
+static void
+_XkbAddKeyChange(KeyCode *pFirst,unsigned char *pNum,KeyCode newKey)
+{
+KeyCode        last;
+
+    last= (*pFirst)+(*pNum);
+    if (newKey<*pFirst) {
+       *pFirst= newKey;
+       *pNum= (last-newKey)+1;
+    }
+    else if (newKey>last) {
+       *pNum= (last-*pFirst)+1;
+    }
+    return;
+}
+
+static void
+_XkbSetActionKeyMods(XkbDescPtr xkb,XkbAction *act,unsigned mods)
+{
+unsigned       tmp;
+
+    switch (act->type) {
+       case XkbSA_SetMods: case XkbSA_LatchMods: case XkbSA_LockMods:
+           if (act->mods.flags&XkbSA_UseModMapMods)
+               act->mods.real_mods= act->mods.mask= mods;
+           if ((tmp= XkbModActionVMods(&act->mods))!=0) {
+               XkbVirtualModsToReal(xkb,tmp,&tmp);
+               act->mods.mask|= tmp;
+           }
+           break;
+       case XkbSA_ISOLock:
+           if (act->iso.flags&XkbSA_UseModMapMods)
+               act->iso.real_mods= act->iso.mask= mods;
+           if ((tmp= XkbModActionVMods(&act->iso))!=0) {
+               XkbVirtualModsToReal(xkb,tmp,&tmp);
+               act->iso.mask|= tmp;
+           }
+           break;
+    }
+    return;
+}
+
+#define        IBUF_SIZE       8
+
+Bool
+XkbApplyCompatMapToKey(XkbDescPtr xkb,KeyCode key,XkbChangesPtr changes)
+{
+KeySym *               syms;
+unsigned char          explicit,mods;
+XkbSymInterpretPtr     *interps,ibuf[IBUF_SIZE];
+int                    n,nSyms,found;
+unsigned               changed,tmp;
+
+    if ((!xkb)||(!xkb->map)||(!xkb->map->key_sym_map)||
+                       (!xkb->compat)||(!xkb->compat->sym_interpret)||
+                       (key<xkb->min_key_code)||(key>xkb->max_key_code)) {
+       return False;
+    }
+    if (((!xkb->server)||(!xkb->server->key_acts))&&
+               (XkbAllocServerMap(xkb,XkbAllServerInfoMask,0)!=Success)) {
+       return False;
+    }
+    changed= 0;        /* keeps track of what has changed in _this_ call */
+    explicit= xkb->server->explicit[key];
+    if (explicit&XkbExplicitInterpretMask) /* nothing to do */
+       return True;
+    mods= (xkb->map->modmap?xkb->map->modmap[key]:0);
+    nSyms= XkbKeyNumSyms(xkb,key);
+    syms= XkbKeySymsPtr(xkb,key);
+    if (nSyms>IBUF_SIZE) {
+       interps= _XkbTypedCalloc(nSyms,XkbSymInterpretPtr);
+       if (interps==NULL) {
+           interps= ibuf;
+           nSyms= IBUF_SIZE;
+       }
+    }
+    else {
+       interps= ibuf;
+    }
+    found= 0;
+    for (n=0;n<nSyms;n++) {
+       unsigned level= (n%XkbKeyGroupsWidth(xkb,key));
+       interps[n]= NULL;
+       if (syms[n]!=NoSymbol) {
+           interps[n]= _XkbFindMatchingInterp(xkb,syms[n],mods,level);
+           if (interps[n]&&interps[n]->act.type!=XkbSA_NoAction)
+               found++;
+           else interps[n]= NULL;
+       }
+    }
+    /* 1/28/96 (ef) -- XXX! WORKING HERE */
+    if (!found) {
+       if (xkb->server->key_acts[key]!=0) {
+           xkb->server->key_acts[key]= 0;
+           changed|= XkbKeyActionsMask;
+       }
+    }
+    else {
+       XkbAction *pActs;
+       unsigned int    new_vmodmask;
+       changed|= XkbKeyActionsMask;
+       pActs= XkbResizeKeyActions(xkb,key,nSyms);
+       if (!pActs) {
+            if (nSyms > IBUF_SIZE)
+                Xfree(interps);
+           return False;
+        }
+       new_vmodmask= 0;
+       for (n=0;n<nSyms;n++) {
+           if (interps[n]) {
+               unsigned effMods;
+
+               pActs[n]= *((XkbAction *)&interps[n]->act);
+               if ((n==0)||((interps[n]->match&XkbSI_LevelOneOnly)==0)) {
+                    effMods= mods;
+                    if (interps[n]->virtual_mod!=XkbNoModifier)
+                       new_vmodmask|= (1<<interps[n]->virtual_mod);
+               }
+               else effMods= 0;
+               _XkbSetActionKeyMods(xkb,&pActs[n],effMods);
+           }
+           else pActs[n].type= XkbSA_NoAction;
+       }
+       if (((explicit&XkbExplicitVModMapMask)==0)&&
+                               (xkb->server->vmodmap[key]!=new_vmodmask)) {
+           changed|= XkbVirtualModMapMask;
+           xkb->server->vmodmap[key]= new_vmodmask;
+       }
+       if (interps[0]) {
+           if ((interps[0]->flags&XkbSI_LockingKey)&&
+                               ((explicit&XkbExplicitBehaviorMask)==0)) {
+               xkb->server->behaviors[key].type= XkbKB_Lock;
+               changed|= XkbKeyBehaviorsMask;
+           }
+           if (((explicit&XkbExplicitAutoRepeatMask)==0)&&(xkb->ctrls)) {
+               CARD8 old;
+               old= xkb->ctrls->per_key_repeat[key/8];
+               if (interps[0]->flags&XkbSI_AutoRepeat)
+                    xkb->ctrls->per_key_repeat[key/8]|= (1<<(key%8));
+               else xkb->ctrls->per_key_repeat[key/8]&= ~(1<<(key%8));
+               if (changes && (old!=xkb->ctrls->per_key_repeat[key/8]))
+                   changes->ctrls.changed_ctrls|= XkbPerKeyRepeatMask;
+           }
+       }
+    }
+    if ((!found)||(interps[0]==NULL)) {
+       if (((explicit&XkbExplicitAutoRepeatMask)==0)&&(xkb->ctrls)) {
+           CARD8 old;
+           old= xkb->ctrls->per_key_repeat[key/8];
+#ifdef RETURN_SHOULD_REPEAT
+           if (*XkbKeySymsPtr(xkb,key) != XK_Return)
+#endif
+               xkb->ctrls->per_key_repeat[key/8]|= (1<<(key%8));
+           if (changes && (old!=xkb->ctrls->per_key_repeat[key/8]))
+               changes->ctrls.changed_ctrls|= XkbPerKeyRepeatMask;
+       }
+       if (((explicit&XkbExplicitBehaviorMask)==0)&&
+               (xkb->server->behaviors[key].type==XkbKB_Lock)) {
+               xkb->server->behaviors[key].type= XkbKB_Default;
+               changed|= XkbKeyBehaviorsMask;
+       }
+    }
+    if (changes) {
+       XkbMapChangesPtr        mc;
+       mc= &changes->map;
+       tmp= (changed&mc->changed);
+       if (tmp&XkbKeyActionsMask)
+           _XkbAddKeyChange(&mc->first_key_act,&mc->num_key_acts,key);
+       else if (changed&XkbKeyActionsMask) {
+           mc->changed|= XkbKeyActionsMask;
+           mc->first_key_act= key;
+           mc->num_key_acts= 1;
+       }
+       if (tmp&XkbKeyBehaviorsMask) {
+           _XkbAddKeyChange(&mc->first_key_behavior,&mc->num_key_behaviors,
+                                                                       key);
+       }
+       else if (changed&XkbKeyBehaviorsMask) {
+           mc->changed|= XkbKeyBehaviorsMask;
+           mc->first_key_behavior= key;
+           mc->num_key_behaviors= 1;
+       }
+       if (tmp&XkbVirtualModMapMask)
+           _XkbAddKeyChange(&mc->first_vmodmap_key,&mc->num_vmodmap_keys,key);
+       else if (changed&XkbVirtualModMapMask) {
+           mc->changed|= XkbVirtualModMapMask;
+           mc->first_vmodmap_key= key;
+           mc->num_vmodmap_keys= 1;
+       }
+       mc->changed|= changed;
+    }
+    if (interps!=ibuf)
+       _XkbFree(interps);
+    return True;
+}
+
+Bool
+XkbUpdateMapFromCore(  XkbDescPtr      xkb,
+                       KeyCode         first_key,
+                       int             num_keys,
+                       int             map_width,
+                       KeySym *        core_keysyms,
+                       XkbChangesPtr   changes)
+{
+register int   key,last_key;
+KeySym *       syms;
+
+    syms= &core_keysyms[(first_key-xkb->min_key_code)*map_width];
+    if (changes) {
+       if (changes->map.changed&XkbKeySymsMask) {
+           _XkbAddKeyChange(&changes->map.first_key_sym,
+                               &changes->map.num_key_syms,first_key);
+           if (num_keys>1) {
+               _XkbAddKeyChange(&changes->map.first_key_sym,
+                                               &changes->map.num_key_syms,
+                                               first_key+num_keys-1);
+           }
+       }
+       else {
+           changes->map.changed|= XkbKeySymsMask;
+           changes->map.first_key_sym= first_key;
+           changes->map.num_key_syms= num_keys;
+       }
+    }
+    last_key= first_key+num_keys-1;
+    for (key=first_key;key<=last_key;key++,syms+= map_width) {
+       XkbMapChangesPtr        mc;
+       unsigned                explicit;
+       KeySym                  tsyms[XkbMaxSymsPerKey];
+       int                     types[XkbNumKbdGroups];
+       int                     nG;
+
+       explicit= xkb->server->explicit[key]&XkbExplicitKeyTypesMask;
+       types[XkbGroup1Index]= XkbKeyKeyTypeIndex(xkb,key,XkbGroup1Index);
+       types[XkbGroup2Index]= XkbKeyKeyTypeIndex(xkb,key,XkbGroup2Index);
+       types[XkbGroup3Index]= XkbKeyKeyTypeIndex(xkb,key,XkbGroup3Index);
+       types[XkbGroup4Index]= XkbKeyKeyTypeIndex(xkb,key,XkbGroup4Index);
+       nG= XkbKeyTypesForCoreSymbols(xkb,map_width,syms,explicit,types,tsyms);
+       if (changes)
+            mc= &changes->map;
+       else mc= NULL;
+       XkbChangeTypesOfKey(xkb,key,nG,XkbAllGroupsMask,types,mc);
+       memcpy((char *)XkbKeySymsPtr(xkb,key),(char *)tsyms,
+                                       XkbKeyNumSyms(xkb,key)*sizeof(KeySym));
+       XkbApplyCompatMapToKey(xkb,key,changes);
+    }
+
+    if ((xkb->map->modmap!=NULL)&&(changes)&&
+       (changes->map.changed&(XkbVirtualModMapMask|XkbModifierMapMask))) {
+       unsigned char           newVMods[XkbNumVirtualMods];
+       register  unsigned      bit,i;
+       unsigned                present;
+
+       bzero(newVMods,XkbNumVirtualMods);
+       present= 0;
+       for (key=xkb->min_key_code;key<=xkb->max_key_code;key++) {
+           if (xkb->server->vmodmap[key]==0)
+               continue;
+           for (i=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) {
+               if (bit&xkb->server->vmodmap[key]) {
+                   present|= bit;
+                   newVMods[i]|= xkb->map->modmap[key];
+               }
+           }
+       }
+       for (i=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) {
+           if ((bit&present)&&(newVMods[i]!=xkb->server->vmods[i])) {
+               changes->map.changed|= XkbVirtualModsMask;
+               changes->map.vmods|= bit;
+               xkb->server->vmods[i]= newVMods[i];
+           }
+       }
+    }
+    if (changes && (changes->map.changed&XkbVirtualModsMask))
+       XkbApplyVirtualModChanges(xkb,changes->map.vmods,changes);
+    return True;
+}
+
+Status
+XkbChangeTypesOfKey(   XkbDescPtr               xkb,
+                       int                      key,
+                       int                      nGroups,
+                       unsigned                 groups,
+                       int     *                newTypesIn,
+                       XkbMapChangesPtr         changes)
+{
+XkbKeyTypePtr  pOldType,pNewType;
+register int   i;
+int            width,nOldGroups,oldWidth,newTypes[XkbNumKbdGroups];
+
+    if ((!xkb) || (!XkbKeycodeInRange(xkb,key)) || (!xkb->map) ||
+       (!xkb->map->types)||((groups&XkbAllGroupsMask)==0)||
+       (nGroups>XkbNumKbdGroups)) {
+       return BadMatch;
+    }
+    if (nGroups==0) {
+       for (i=0;i<XkbNumKbdGroups;i++) {
+           xkb->map->key_sym_map[key].kt_index[i]= XkbOneLevelIndex;
+       }
+       i= xkb->map->key_sym_map[key].group_info;
+       i= XkbSetNumGroups(i,0);
+       xkb->map->key_sym_map[key].group_info= i;
+       XkbResizeKeySyms(xkb,key,0);
+       return Success;
+    }
+
+    nOldGroups= XkbKeyNumGroups(xkb,key);
+    oldWidth= XkbKeyGroupsWidth(xkb,key);
+    for (width=i=0;i<nGroups;i++) {
+       if (groups&(1<<i))
+            newTypes[i]=  newTypesIn[i];
+       else if (i<nOldGroups)
+            newTypes[i]= XkbKeyKeyTypeIndex(xkb,key,i);
+       else if (nOldGroups>0)
+            newTypes[i]= XkbKeyKeyTypeIndex(xkb,key,XkbGroup1Index);
+       else newTypes[i]= XkbTwoLevelIndex;
+       if (newTypes[i]>xkb->map->num_types)
+           return BadMatch;
+       pNewType= &xkb->map->types[newTypes[i]];
+       if (pNewType->num_levels>width)
+           width= pNewType->num_levels;
+    }
+    if ((xkb->ctrls)&&(nGroups>xkb->ctrls->num_groups))
+       xkb->ctrls->num_groups= nGroups;
+    if ((width!=oldWidth)||(nGroups!=nOldGroups)) {
+       KeySym          oldSyms[XkbMaxSymsPerKey],*pSyms;
+       int             nCopy;
+
+       if (nOldGroups==0) {
+           pSyms= XkbResizeKeySyms(xkb,key,width*nGroups);
+           if (pSyms!=NULL) {
+               i= xkb->map->key_sym_map[key].group_info;
+               i= XkbSetNumGroups(i,nGroups);
+               xkb->map->key_sym_map[key].group_info= i;
+               xkb->map->key_sym_map[key].width= width;
+               for (i=0;i<nGroups;i++) {
+                   xkb->map->key_sym_map[key].kt_index[i]= newTypes[i];
+               }
+               return Success;
+           }
+           return BadAlloc;
+       }
+       pSyms= XkbKeySymsPtr(xkb,key);
+       memcpy(oldSyms,pSyms,XkbKeyNumSyms(xkb,key)*sizeof(KeySym));
+       pSyms= XkbResizeKeySyms(xkb,key,width*nGroups);
+       if (pSyms==NULL)
+           return BadAlloc;
+       bzero(pSyms,width*nGroups*sizeof(KeySym));
+       for (i=0;(i<nGroups)&&(i<nOldGroups);i++) {
+           pOldType= XkbKeyKeyType(xkb,key,i);
+           pNewType= &xkb->map->types[newTypes[i]];
+           if (pNewType->num_levels>pOldType->num_levels)
+                nCopy= pOldType->num_levels;
+           else nCopy= pNewType->num_levels;
+           memcpy(&pSyms[i*width],&oldSyms[i*oldWidth],nCopy*sizeof(KeySym));
+       }
+       if (XkbKeyHasActions(xkb,key)) {
+           XkbAction   oldActs[XkbMaxSymsPerKey],*pActs;
+           pActs= XkbKeyActionsPtr(xkb,key);
+           memcpy(oldActs,pActs,XkbKeyNumSyms(xkb,key)*sizeof(XkbAction));
+           pActs= XkbResizeKeyActions(xkb,key,width*nGroups);
+           if (pActs==NULL)
+               return BadAlloc;
+           bzero(pActs,width*nGroups*sizeof(XkbAction));
+           for (i=0;(i<nGroups)&&(i<nOldGroups);i++) {
+               pOldType= XkbKeyKeyType(xkb,key,i);
+               pNewType= &xkb->map->types[newTypes[i]];
+               if (pNewType->num_levels>pOldType->num_levels)
+                    nCopy= pOldType->num_levels;
+               else nCopy= pNewType->num_levels;
+               memcpy(&pActs[i*width],&oldActs[i*oldWidth],
+                                               nCopy*sizeof(XkbAction));
+           }
+       }
+       i= xkb->map->key_sym_map[key].group_info;
+       i= XkbSetNumGroups(i,nGroups);
+       xkb->map->key_sym_map[key].group_info= i;
+       xkb->map->key_sym_map[key].width= width;
+    }
+    width= 0;
+    for (i=0;i<nGroups;i++) {
+       xkb->map->key_sym_map[key].kt_index[i]= newTypes[i];
+       if (xkb->map->types[newTypes[i]].num_levels>width)
+           width= xkb->map->types[newTypes[i]].num_levels;
+    }
+    xkb->map->key_sym_map[key].width= width;
+    if (changes!=NULL) {
+       if (changes->changed&XkbKeySymsMask) {
+           _XkbAddKeyChange(&changes->first_key_sym,&changes->num_key_syms,
+                                                                       key);
+       }
+       else {
+           changes->changed|= XkbKeySymsMask;
+           changes->first_key_sym= key;
+           changes->num_key_syms= 1;
+       }
+    }
+    return Success;
+}
+
+/***====================================================================***/
+
+Bool
+XkbVirtualModsToReal(XkbDescPtr xkb,unsigned virtual_mask,unsigned *mask_rtrn)
+{
+register int i,bit;
+register unsigned mask;
+
+    if (xkb==NULL)
+       return False;
+    if (virtual_mask==0) {
+       *mask_rtrn= 0;
+       return True;
+    }
+    if (xkb->server==NULL)
+       return False;
+    for (i=mask=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) {
+       if (virtual_mask&bit)
+           mask|= xkb->server->vmods[i];
+    }
+    *mask_rtrn= mask;
+    return True;
+}
+
+/***====================================================================***/
+
+Bool
+XkbUpdateActionVirtualMods(XkbDescPtr xkb,XkbAction *act,unsigned changed)
+{
+unsigned int   tmp;
+
+    switch (act->type) {
+       case XkbSA_SetMods: case XkbSA_LatchMods: case XkbSA_LockMods:
+           if (((tmp= XkbModActionVMods(&act->mods))&changed)!=0) {
+               XkbVirtualModsToReal(xkb,tmp,&tmp);
+               act->mods.mask= act->mods.real_mods;
+               act->mods.mask|= tmp;
+               return True;
+           }
+           break;
+       case XkbSA_ISOLock:
+           if ((((tmp= XkbModActionVMods(&act->iso))!=0)&changed)!=0) {
+               XkbVirtualModsToReal(xkb,tmp,&tmp);
+               act->iso.mask= act->iso.real_mods;
+               act->iso.mask|= tmp;
+               return True;
+           }
+           break;
+    }
+    return False;
+}
+
+void
+XkbUpdateKeyTypeVirtualMods(   XkbDescPtr      xkb,
+                               XkbKeyTypePtr   type,
+                               unsigned int    changed,
+                               XkbChangesPtr   changes)
+{
+register unsigned int  i;
+unsigned int           mask;
+
+    XkbVirtualModsToReal(xkb,type->mods.vmods,&mask);
+    type->mods.mask= type->mods.real_mods|mask;
+    if ((type->map_count>0)&&(type->mods.vmods!=0)) {
+       XkbKTMapEntryPtr entry;
+       for (i=0,entry=type->map;i<type->map_count;i++,entry++) {
+           if (entry->mods.vmods!=0) {
+               XkbVirtualModsToReal(xkb,entry->mods.vmods,&mask);
+               entry->mods.mask=entry->mods.real_mods|mask;
+               /* entry is active if vmods are bound*/
+               entry->active= (mask!=0);
+           }
+           else entry->active= 1;
+       }
+    }
+    if (changes) {
+       int     type_ndx;
+       type_ndx= type-xkb->map->types;
+       if ((type_ndx<0)||(type_ndx>xkb->map->num_types))
+           return;
+       if (changes->map.changed&XkbKeyTypesMask) {
+           int last;
+           last= changes->map.first_type+changes->map.num_types-1;
+           if (type_ndx<changes->map.first_type) {
+               changes->map.first_type= type_ndx;
+               changes->map.num_types= (last-type_ndx)+1;
+           }
+           else if (type_ndx>last) {
+               changes->map.num_types= (type_ndx-changes->map.first_type)+1;
+           }
+       }
+       else {
+           changes->map.changed|= XkbKeyTypesMask;
+           changes->map.first_type= type_ndx;
+           changes->map.num_types= 1;
+       }
+    }
+    return;
+}
+
+Bool
+XkbApplyVirtualModChanges(XkbDescPtr xkb,unsigned changed,XkbChangesPtr changes)
+{
+register int   i;
+unsigned int   checkState = 0;
+
+    if ((!xkb) || (!xkb->map) || (changed==0))
+       return False;
+    for (i=0;i<xkb->map->num_types;i++) {
+       if (xkb->map->types[i].mods.vmods & changed)
+       XkbUpdateKeyTypeVirtualMods(xkb,&xkb->map->types[i],changed,changes);
+    }
+    if (changed&xkb->ctrls->internal.vmods) {
+       unsigned int    newMask;
+       XkbVirtualModsToReal(xkb,xkb->ctrls->internal.vmods,&newMask);
+       newMask|= xkb->ctrls->internal.real_mods;
+       if (xkb->ctrls->internal.mask!=newMask) {
+           xkb->ctrls->internal.mask= newMask;
+           if (changes) {
+               changes->ctrls.changed_ctrls|= XkbInternalModsMask;
+               checkState= True;
+           }
+       }
+    }
+    if (changed&xkb->ctrls->ignore_lock.vmods) {
+       unsigned int    newMask;
+       XkbVirtualModsToReal(xkb,xkb->ctrls->ignore_lock.vmods,&newMask);
+       newMask|= xkb->ctrls->ignore_lock.real_mods;
+       if (xkb->ctrls->ignore_lock.mask!=newMask) {
+           xkb->ctrls->ignore_lock.mask= newMask;
+           if (changes) {
+               changes->ctrls.changed_ctrls|= XkbIgnoreLockModsMask;
+               checkState= True;
+           }
+       }
+    }
+    if (xkb->indicators!=NULL) {
+       XkbIndicatorMapPtr map;
+       map= &xkb->indicators->maps[0];
+       for (i=0;i<XkbNumIndicators;i++,map++) {
+           if (map->mods.vmods&changed) {
+               unsigned int newMask;
+               XkbVirtualModsToReal(xkb,map->mods.vmods,&newMask);
+               newMask|= map->mods.real_mods;
+               if (newMask!=map->mods.mask) {
+                   map->mods.mask= newMask;
+                   if (changes) {
+                       changes->indicators.map_changes|= (1<<i);
+                       checkState= True;
+                   }
+               }
+           }
+       }
+    }
+    if (xkb->compat!=NULL) {
+       XkbCompatMapPtr compat;
+       compat= xkb->compat;
+       for (i=0;i<XkbNumKbdGroups;i++) {
+           unsigned int newMask;
+           XkbVirtualModsToReal(xkb,compat->groups[i].vmods,&newMask);
+           newMask|= compat->groups[i].real_mods;
+           if (compat->groups[i].mask!=newMask) {
+               compat->groups[i].mask= newMask;
+               if (changes) {
+                   changes->compat.changed_groups|= (1<<i);
+                   checkState= True;
+               }
+           }
+       }
+    }
+    if (xkb->map && xkb->server) {
+       int highChange = 0, lowChange = -1;
+       for (i=xkb->min_key_code;i<=xkb->max_key_code;i++) {
+           if (XkbKeyHasActions(xkb,i)) {
+               register XkbAction *pAct;
+               register int n;
+
+               pAct= XkbKeyActionsPtr(xkb,i);
+               for (n=XkbKeyNumActions(xkb,i);n>0;n--,pAct++) {
+                   if ((pAct->type!=XkbSA_NoAction)&&
+                       XkbUpdateActionVirtualMods(xkb,pAct,changed)) {
+                       if (lowChange<0)
+                           lowChange= i;
+                       highChange= i;
+                   }
+               }
+           }
+       }
+       if (changes && (lowChange>0)) { /* something changed */
+           if (changes->map.changed&XkbKeyActionsMask) {
+               int last;
+               if (changes->map.first_key_act<lowChange)
+                   lowChange= changes->map.first_key_act;
+               last= changes->map.first_key_act+changes->map.num_key_acts-1;
+               if (last>highChange)
+                   highChange= last;
+           }
+           changes->map.changed|=      XkbKeyActionsMask;
+           changes->map.first_key_act= lowChange;
+           changes->map.num_key_acts=  (highChange-lowChange)+1;
+       }
+    }
+    return checkState;
+}
diff --git a/src/xkb/XKBNames.c b/src/xkb/XKBNames.c
new file mode 100644 (file)
index 0000000..cf2382c
--- /dev/null
@@ -0,0 +1,887 @@
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+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 Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS 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 NEED_MAP_READERS
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include <X11/extensions/XKBproto.h>
+#include "XKBlibint.h"
+
+
+static Status
+_XkbReadAtoms( XkbReadBufferPtr        buf,
+               Atom *                  atoms,
+               int                     maxAtoms,
+               CARD32                  present)
+{
+register int i,bit;
+
+    for (i=0,bit=1;(i<maxAtoms)&&(present);i++,bit<<=1) {
+       if (present&bit) {
+           if (!_XkbReadBufferCopy32(buf,(long *)&atoms[i],1))
+               return BadLength;
+           present&= ~bit;
+       }
+    }
+    return Success;
+}
+
+Status
+_XkbReadGetNamesReply( Display *               dpy,
+                       xkbGetNamesReply *      rep,
+                       XkbDescPtr              xkb,
+                       int *                   nread_rtrn)
+{
+    int                                 i,len;
+    XkbReadBufferRec            buf;
+    register XkbNamesPtr        names;
+
+    if ( xkb->device_spec == XkbUseCoreKbd )
+       xkb->device_spec = rep->deviceID;
+
+    if ((xkb->names==NULL)&&
+       (XkbAllocNames(xkb,rep->which,
+                               rep->nRadioGroups,rep->nKeyAliases)!=Success)) {
+       return BadAlloc;
+    }
+    names= xkb->names;
+    if (rep->length==0)
+       return Success;
+
+    if (!_XkbInitReadBuffer(dpy,&buf,(int)rep->length*4))
+       return BadAlloc;
+    if (nread_rtrn)
+       *nread_rtrn= (int)rep->length*4;
+
+    if ((rep->which&XkbKeycodesNameMask)&&
+       (!_XkbReadBufferCopy32(&buf,(long *)&names->keycodes,1)))
+           goto BAILOUT;
+    if ((rep->which&XkbGeometryNameMask)&&
+       (!_XkbReadBufferCopy32(&buf,(long *)&names->geometry,1)))
+           goto BAILOUT;
+    if ((rep->which&XkbSymbolsNameMask)&&
+       (!_XkbReadBufferCopy32(&buf,(long *)&names->symbols,1)))
+           goto BAILOUT;
+    if ((rep->which&XkbPhysSymbolsNameMask)&&
+       (!_XkbReadBufferCopy32(&buf,(long *)&names->phys_symbols,1)))
+           goto BAILOUT;
+    if ((rep->which&XkbTypesNameMask)&&
+       (!_XkbReadBufferCopy32(&buf,(long *)&names->types,1)))
+           goto BAILOUT;
+    if ((rep->which&XkbCompatNameMask)&&
+       (!_XkbReadBufferCopy32(&buf,(long *)&names->compat,1)))
+           goto BAILOUT;
+
+    if ( rep->which & XkbKeyTypeNamesMask ) {
+       XkbClientMapPtr map= xkb->map;
+       XkbKeyTypePtr   type;
+
+       len= rep->nTypes*4;
+       if (map!=NULL) {
+           type= map->types;
+           for (i=0;(i<map->num_types)&&(i<rep->nTypes);i++,type++) {
+               if (!_XkbReadBufferCopy32(&buf,(long *)&type->name,1))
+                   goto BAILOUT;
+               len-= 4;
+           }
+       }
+       if ((len>0)&&(!_XkbSkipReadBufferData(&buf,len)))
+           goto BAILOUT;
+    }
+    if ( rep->which&XkbKTLevelNamesMask ) {
+       CARD8 *nLevels;
+       XkbClientMapPtr map= xkb->map;
+       XkbKeyTypePtr   type;
+
+       nLevels=(CARD8*)_XkbGetReadBufferPtr(&buf,XkbPaddedSize(rep->nTypes));
+       if (nLevels==NULL)
+           goto BAILOUT;
+       if (map!=NULL) {
+           type= map->types;
+           for (i=0;i<(int)rep->nTypes;i++,type++) {
+               if (i>=map->num_types) {
+                   if (!_XkbSkipReadBufferData(&buf,nLevels[i]*4))
+                       goto BAILOUT;
+                   continue;
+               }
+               if ((nLevels[i]>0)&&(nLevels[i]!=type->num_levels)) {
+                   goto BAILOUT;
+               }
+               if (type->level_names!=NULL)
+                   Xfree(type->level_names);
+               if (nLevels[i]==0) {
+                   type->level_names= NULL;
+                   continue;
+               }
+               type->level_names= _XkbTypedCalloc(nLevels[i],Atom);
+               if (type->level_names!=NULL) {
+                   if (!_XkbReadBufferCopy32(&buf,(long *)type->level_names,
+                                                               nLevels[i]))
+                       goto BAILOUT;
+               }
+               else {
+                   _XkbSkipReadBufferData(&buf,nLevels[i]*4);
+               }
+           }
+       }
+       else {
+           for (i=0;i<(int)rep->nTypes;i++) {
+               _XkbSkipReadBufferData(&buf,nLevels[i]*4);
+           }
+       }
+    }
+    if (rep->which & XkbIndicatorNamesMask) {
+       if (_XkbReadAtoms(&buf,names->indicators,XkbNumIndicators,
+                                               rep->indicators)!=Success)
+           goto BAILOUT;
+    }
+    if ( rep->which&XkbVirtualModNamesMask ) {
+       if (_XkbReadAtoms(&buf,names->vmods,XkbNumVirtualMods,
+                                       (CARD32)rep->virtualMods)!=Success)
+           goto BAILOUT;
+    }
+    if ( rep->which&XkbGroupNamesMask ) {
+       if (_XkbReadAtoms(&buf,names->groups,XkbNumKbdGroups,
+                                       (CARD32)rep->groupNames)!=Success)
+           goto BAILOUT;
+    }
+    if ( rep->which&XkbKeyNamesMask ) {
+       if (names->keys==NULL) {
+           int nKeys;
+           if (xkb->max_key_code==0) {
+               xkb->min_key_code= rep->minKeyCode;
+               xkb->max_key_code= rep->maxKeyCode;
+           }
+           nKeys= xkb->max_key_code+1;
+           names->keys= _XkbTypedCalloc(nKeys,XkbKeyNameRec);
+       }
+       if (names->keys!=NULL) {
+           if (!_XkbCopyFromReadBuffer(&buf,
+                                       (char *)&names->keys[rep->firstKey],
+                                       rep->nKeys*XkbKeyNameLength))
+               goto BAILOUT;
+       }
+       else _XkbSkipReadBufferData(&buf,rep->nKeys*XkbKeyNameLength);
+    }
+    if ( rep->which&XkbKeyAliasesMask && (rep->nKeyAliases>0) ) {
+       if (XkbAllocNames(xkb,XkbKeyAliasesMask,0,rep->nKeyAliases)!=Success)
+           goto BAILOUT;
+       if (!_XkbCopyFromReadBuffer(&buf,(char *)names->key_aliases,
+                               rep->nKeyAliases*XkbKeyNameLength*2))
+           goto BAILOUT;
+    }
+    if ( rep->which&XkbRGNamesMask ) {
+       if (rep->nRadioGroups>0) {
+           Atom *rgNames;
+
+           if (names->radio_groups==NULL)
+               names->radio_groups = _XkbTypedCalloc(rep->nRadioGroups,Atom);
+           else if (names->num_rg<rep->nRadioGroups) {
+               names->radio_groups = _XkbTypedRealloc(names->radio_groups,
+                                                       rep->nRadioGroups,
+                                                       Atom);
+           }
+           rgNames= names->radio_groups;
+           if (!rgNames) {
+               goto BAILOUT;
+           }
+           if (!_XkbReadBufferCopy32(&buf,(long *)rgNames,rep->nRadioGroups))
+               goto BAILOUT;
+           names->num_rg= rep->nRadioGroups;
+       }
+       else if (names->num_rg>0) {
+           names->num_rg= 0;
+           Xfree(names->radio_groups);
+       }
+    }
+    len= _XkbFreeReadBuffer(&buf);
+    if (len!=0)        return BadLength;
+    else               return Success;
+BAILOUT:
+    _XkbFreeReadBuffer(&buf);
+    return BadLength;
+}
+
+Status
+XkbGetNames(Display *dpy,unsigned which,XkbDescPtr xkb)
+{
+    register xkbGetNamesReq *req;
+    xkbGetNamesReply        rep;
+    Status                  status;
+    XkbInfoPtr xkbi;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return BadAccess;
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    if (!xkb->names) {
+       xkb->names = _XkbTypedCalloc(1,XkbNamesRec);
+       if (!xkb->names) {
+           UnlockDisplay(dpy);
+           SyncHandle();
+           return BadAlloc;
+       }
+    }
+    GetReq(kbGetNames, req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbGetNames;
+    req->deviceSpec = xkb->device_spec;
+    req->which = which;
+    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return BadImplementation;
+    }
+
+    status = _XkbReadGetNamesReply(dpy,&rep,xkb,NULL);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return status;
+}
+
+/***====================================================================***/
+
+static int
+_XkbCountBits(int nBitsMax,unsigned long mask)
+{
+register unsigned long y, nBits;
+
+    y = (mask >> 1) &033333333333;
+    y = mask - y - ((y >>1) & 033333333333);
+    nBits = ((unsigned int) (((y + (y >> 3)) & 030707070707) % 077));
+
+    /* nBitsMax really means max+1 */
+    return (nBits < nBitsMax) ? nBits : (nBitsMax - 1);
+}
+
+static CARD32
+_XkbCountAtoms(Atom *atoms,int maxAtoms,int *count)
+{
+register unsigned int i,bit,nAtoms;
+register CARD32 atomsPresent;
+
+    for (i=nAtoms=atomsPresent=0,bit=1;i<maxAtoms;i++,bit<<=1) {
+        if (atoms[i]!=None) {
+            atomsPresent|= bit;
+            nAtoms++;
+        }
+    }
+    if (count)
+        *count= nAtoms;
+    return atomsPresent;
+}
+
+static void
+_XkbCopyAtoms(Display *dpy,Atom *atoms,CARD32 mask,int maxAtoms)
+{
+register unsigned int i,bit;
+
+    for (i=0,bit=1;i<maxAtoms;i++,bit<<=1) {
+        if (mask&bit)
+           Data32(dpy,&atoms[i],4);
+    }
+    return;
+}
+
+Bool
+XkbSetNames(   Display *       dpy,
+               unsigned int    which,
+               unsigned int    firstType,
+               unsigned int    nTypes,
+               XkbDescPtr      xkb)
+{
+    register xkbSetNamesReq *req;
+    int  nLvlNames = 0;
+    XkbInfoPtr xkbi;
+    XkbNamesPtr names;
+    unsigned firstLvlType,nLvlTypes;
+    int        nVMods,nLEDs,nRG,nKA,nGroups;
+    int nKeys=0,firstKey=0,nAtoms;
+    CARD32 leds,vmods,groups;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return False;
+    if ((!xkb)||(!xkb->names))
+       return False;
+    firstLvlType= firstType;
+    nLvlTypes= nTypes;
+    if (nTypes<1)
+       which&= ~(XkbKTLevelNamesMask|XkbKeyTypeNamesMask);
+    else if (firstType<=XkbLastRequiredType) {
+       int     adjust;
+       adjust= XkbLastRequiredType-firstType+1;
+       firstType+= adjust;
+       nTypes-= adjust;
+       if (nTypes<1)
+           which&= ~XkbKeyTypeNamesMask;
+    }
+    names= xkb->names;
+    if (which&(XkbKTLevelNamesMask|XkbKeyTypeNamesMask)) {
+       register int    i;
+       XkbKeyTypePtr   type;
+       if((xkb->map==NULL)||(xkb->map->types==NULL)||(nTypes==0)||
+                               (firstType+nTypes>xkb->map->num_types)||
+                               (firstLvlType+nLvlTypes>xkb->map->num_types))
+           return False;
+       if (which&XkbKTLevelNamesMask) {
+           type= &xkb->map->types[firstLvlType];
+           for (i=nLvlNames=0;i<nLvlTypes;i++,type++) {
+               if (type->level_names!=NULL)
+                   nLvlNames+= type->num_levels;
+           }
+       }
+    }
+
+    nVMods= nLEDs= nRG= nKA= nAtoms= nGroups= 0;
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    GetReq(kbSetNames, req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbSetNames;
+    req->deviceSpec = xkb->device_spec;
+    req->firstType = firstType;
+    req->nTypes = nTypes;
+    req->firstKey = xkb->min_key_code;
+    req->nKeys = xkb->max_key_code-xkb->min_key_code+1;
+
+    if (which&XkbKeycodesNameMask)
+       nAtoms++;
+    if (which&XkbGeometryNameMask)
+       nAtoms++;
+    if (which&XkbSymbolsNameMask)
+       nAtoms++;
+    if (which&XkbPhysSymbolsNameMask)
+       nAtoms++;
+    if (which&XkbTypesNameMask)
+       nAtoms++;
+    if (which&XkbCompatNameMask)
+       nAtoms++;
+    if (which&XkbKeyTypeNamesMask)
+       nAtoms+= nTypes;
+    if (which&XkbKTLevelNamesMask) {
+       req->firstKTLevel= firstLvlType;
+       req->nKTLevels= nLvlTypes;
+       req->length+= XkbPaddedSize(nLvlTypes)/4; /* room for group widths */
+       nAtoms+= nLvlNames;
+    }
+    else req->firstKTLevel= req->nKTLevels= 0;
+
+    if (which&XkbIndicatorNamesMask) {
+       req->indicators= leds=
+               _XkbCountAtoms(names->indicators,XkbNumIndicators,&nLEDs);
+       if (nLEDs>0)
+            nAtoms+= nLEDs;
+       else which&= ~XkbIndicatorNamesMask;
+    }
+    else req->indicators= leds= 0;
+
+    if (which&XkbVirtualModNamesMask) {
+       vmods= req->virtualMods= (CARD16)
+               _XkbCountAtoms(names->vmods,XkbNumVirtualMods,&nVMods);
+       if (nVMods>0)
+            nAtoms+= nVMods;
+       else which&= ~XkbVirtualModNamesMask;
+    }
+    else vmods= req->virtualMods= 0;
+
+    if (which&XkbGroupNamesMask) {
+       groups= req->groupNames= (CARD8)
+               _XkbCountAtoms(names->groups,XkbNumKbdGroups,&nGroups);
+       if (nGroups>0)
+            nAtoms+= nGroups;
+       else which&= ~XkbGroupNamesMask;
+    }
+    else groups= req->groupNames= 0;
+
+    if ((which&XkbKeyNamesMask)&&(names->keys!=NULL)) {
+       firstKey= req->firstKey;
+       nKeys= req->nKeys;
+       nAtoms+= nKeys; /* technically not atoms, but 4 bytes wide */
+    }
+    else which&= ~XkbKeyNamesMask;
+
+    if (which&XkbKeyAliasesMask) {
+       nKA= ((names->key_aliases!=NULL)?names->num_key_aliases:0);
+       if (nKA>0) {
+           req->nKeyAliases= nKA;
+           nAtoms+= nKA*2; /* not atoms, but 8 bytes on the wire */
+       }
+       else {
+           which&= ~XkbKeyAliasesMask;
+           req->nKeyAliases = 0;
+       }
+    }
+    else req->nKeyAliases= 0;
+
+    if (which&XkbRGNamesMask) {
+       nRG= names->num_rg;
+       if (nRG>0)
+            nAtoms+= nRG;
+       else which&= ~XkbRGNamesMask;
+    }
+
+    req->which= which;
+    req->nRadioGroups= nRG;
+    req->length+= (nAtoms*4)/4;
+
+    if (which&XkbKeycodesNameMask)
+       Data32(dpy,(long *)&names->keycodes,4);
+    if (which&XkbGeometryNameMask)
+       Data32(dpy,(long *)&names->geometry,4);
+    if (which&XkbSymbolsNameMask)
+       Data32(dpy,(long *)&names->symbols,4);
+    if (which&XkbPhysSymbolsNameMask)
+       Data32(dpy,(long *)&names->phys_symbols,4);
+    if (which&XkbTypesNameMask)
+       Data32(dpy,(long *)&names->types,4);
+    if (which&XkbCompatNameMask)
+       Data32(dpy,(long *)&names->compat,4);
+    if (which&XkbKeyTypeNamesMask) {
+       register int            i;
+       register XkbKeyTypePtr  type;
+       type= &xkb->map->types[firstType];
+       for (i=0;i<nTypes;i++,type++) {
+           Data32(dpy,(long *)&type->name,4);
+       }
+    }
+    if (which&XkbKTLevelNamesMask) {
+       XkbKeyTypePtr type;
+       int i;
+       char *tmp;
+
+       BufAlloc(char *,tmp,XkbPaddedSize(nLvlTypes));
+       type = &xkb->map->types[firstLvlType];
+       for (i=0;i<nLvlTypes;i++,type++) {
+           *tmp++ = type->num_levels;
+       }
+       type = &xkb->map->types[firstLvlType];
+       for (i=0;i<nLvlTypes;i++,type++) {
+           if (type->level_names!=NULL)
+               Data32(dpy,(long *)type->level_names,type->num_levels*4);
+       }
+    }
+    if (which&XkbIndicatorNamesMask)
+       _XkbCopyAtoms(dpy,names->indicators,leds,XkbNumIndicators);
+    if (which&XkbVirtualModNamesMask)
+       _XkbCopyAtoms(dpy,names->vmods,vmods,XkbNumVirtualMods);
+    if (which&XkbGroupNamesMask)
+       _XkbCopyAtoms(dpy,names->groups,groups,XkbNumKbdGroups);
+    if (which&XkbKeyNamesMask) {
+#ifdef WORD64
+       char *tmp;
+       register int i;
+       BufAlloc(char *,tmp,nKeys*XkbKeyNameLength);
+       for (i=0;i<nKeys;i++,tmp+= XkbKeyNameLength) {
+           tmp[0]= names->keys[firstKey+i].name[0];
+           tmp[1]= names->keys[firstKey+i].name[1];
+           tmp[2]= names->keys[firstKey+i].name[2];
+           tmp[3]= names->keys[firstKey+i].name[3];
+       }
+#else
+       Data(dpy,(char *)&names->keys[firstKey],nKeys*XkbKeyNameLength);
+#endif
+    }
+    if (which&XkbKeyAliasesMask) {
+#ifdef WORD64
+       char *tmp;
+       register int i;
+       BufAlloc(char *,tmp,nKA*XkbKeyNameLength*2);
+       for (i=0;i<nKeys;i++,tmp+= 2*XkbKeyNameLength) {
+           tmp[0]= names->key_aliases[i].real[0];
+           tmp[1]= names->key_aliases[i].real[1];
+           tmp[2]= names->key_aliases[i].real[2];
+           tmp[3]= names->key_aliases[i].real[3];
+           tmp[4]= names->key_aliases[i].alias[0];
+           tmp[5]= names->key_aliases[i].alias[1];
+           tmp[6]= names->key_aliases[i].alias[2];
+           tmp[7]= names->key_aliases[i].alias[3];
+       }
+#else
+       Data(dpy,(char *)names->key_aliases,nKA*XkbKeyNameLength*2);
+#endif
+    }
+    if (which&XkbRGNamesMask) {
+       Data32(dpy,(long *)names->radio_groups,nRG*4);
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return True;
+}
+
+Bool
+XkbChangeNames(Display *dpy,XkbDescPtr xkb,XkbNameChangesPtr changes)
+{
+    register xkbSetNamesReq *req;
+    int  nLvlNames = 0;
+    XkbInfoPtr xkbi;
+    XkbNamesPtr names;
+    unsigned which,firstType,nTypes;
+    unsigned firstLvlType,nLvlTypes;
+    int        nVMods,nLEDs,nRG,nKA,nGroups;
+    int nKeys=0,firstKey=0,nAtoms;
+    CARD32 leds=0,vmods=0,groups=0;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return False;
+    if ((!xkb)||(!xkb->names)||(!changes))
+       return False;
+    which= changes->changed;
+    firstType= changes->first_type;
+    nTypes= changes->num_types;
+    firstLvlType= changes->first_lvl;;
+    nLvlTypes= changes->num_lvls;
+    if (which&XkbKeyTypeNamesMask) {
+       if (nTypes<1)
+           which&= ~XkbKeyTypeNamesMask;
+       else if (firstType<=XkbLastRequiredType) {
+           int adjust;
+           adjust= XkbLastRequiredType-firstType+1;
+           firstType+= adjust;
+           nTypes-= adjust;
+           if (nTypes<1)
+               which&= ~XkbKeyTypeNamesMask;
+       }
+    }
+    else firstType= nTypes= 0;
+
+    if (which&XkbKTLevelNamesMask) {
+       if (nLvlTypes<1)
+           which&= ~XkbKTLevelNamesMask;
+    }
+    else firstLvlType= nLvlTypes= 0;
+
+    names= xkb->names;
+    if (which&(XkbKTLevelNamesMask|XkbKeyTypeNamesMask)) {
+       register int    i;
+       XkbKeyTypePtr   type;
+       if((xkb->map==NULL)||(xkb->map->types==NULL)||(nTypes==0)||
+                               (firstType+nTypes>xkb->map->num_types)||
+                               (firstLvlType+nLvlTypes>xkb->map->num_types))
+           return False;
+       if (which&XkbKTLevelNamesMask) {
+           type= &xkb->map->types[firstLvlType];
+           for (i=nLvlNames=0;i<nLvlTypes;i++,type++) {
+               if (type->level_names!=NULL)
+                   nLvlNames+= type->num_levels;
+           }
+       }
+    }
+
+    if (changes->num_keys<1)
+       which&= ~XkbKeyNamesMask;
+    if ((which&XkbKeyNamesMask)==0)
+       changes->first_key= changes->num_keys= 0;
+    else if ((changes->first_key<xkb->min_key_code)||
+            (changes->first_key+changes->num_keys>xkb->max_key_code)) {
+       return False;
+    }
+
+    if ((which&XkbVirtualModNamesMask)==0)
+       changes->changed_vmods= 0;
+    else if (changes->changed_vmods==0)
+       which&= ~XkbVirtualModNamesMask;
+
+    if ((which&XkbIndicatorNamesMask)==0)
+       changes->changed_indicators= 0;
+    else if (changes->changed_indicators==0)
+       which&= ~XkbIndicatorNamesMask;
+
+    if ((which&XkbGroupNamesMask)==0)
+       changes->changed_groups= 0;
+    else if (changes->changed_groups==0)
+       which&= ~XkbGroupNamesMask;
+
+    nVMods= nLEDs= nRG= nKA= nAtoms= nGroups= 0;
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    GetReq(kbSetNames, req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbSetNames;
+    req->deviceSpec = xkb->device_spec;
+    req->firstType = firstType;
+    req->nTypes = nTypes;
+    req->firstKey = changes->first_key;
+    req->nKeys = changes->num_keys;
+
+    if (which&XkbKeycodesNameMask)
+       nAtoms++;
+    if (which&XkbGeometryNameMask)
+       nAtoms++;
+    if (which&XkbSymbolsNameMask)
+       nAtoms++;
+    if (which&XkbPhysSymbolsNameMask)
+       nAtoms++;
+    if (which&XkbTypesNameMask)
+       nAtoms++;
+    if (which&XkbCompatNameMask)
+       nAtoms++;
+    if (which&XkbKeyTypeNamesMask)
+       nAtoms+= nTypes;
+    if (which&XkbKTLevelNamesMask) {
+       req->firstKTLevel= firstLvlType;
+       req->nKTLevels= nLvlTypes;
+       req->length+= XkbPaddedSize(nLvlTypes)/4; /* room for group widths */
+       nAtoms+= nLvlNames;
+    }
+    else req->firstKTLevel= req->nKTLevels= 0;
+
+    if (which&XkbIndicatorNamesMask) {
+       leds= req->indicators= (CARD32)changes->changed_indicators;
+       nLEDs= _XkbCountBits(XkbNumIndicators,changes->changed_indicators);
+       if (nLEDs>0)
+            nAtoms+= nLEDs;
+       else which&= ~XkbIndicatorNamesMask;
+    }
+    else req->indicators= 0;
+
+    if (which&XkbVirtualModNamesMask) {
+       vmods= req->virtualMods= changes->changed_vmods;
+       nVMods= _XkbCountBits(XkbNumVirtualMods,
+                                       (unsigned long)changes->changed_vmods);
+       if (nVMods>0)
+            nAtoms+= nVMods;
+       else which&= ~XkbVirtualModNamesMask;
+    }
+    else req->virtualMods= 0;
+
+    if (which&XkbGroupNamesMask) {
+       groups= req->groupNames= changes->changed_groups;
+       nGroups= _XkbCountBits(XkbNumKbdGroups,
+                                       (unsigned long)changes->changed_groups);
+       if (nGroups>0)
+            nAtoms+= nGroups;
+       else which&= ~XkbGroupNamesMask;
+    }
+    else req->groupNames= 0;
+
+    if ((which&XkbKeyNamesMask)&&(names->keys!=NULL)) {
+       firstKey= req->firstKey;
+       nKeys= req->nKeys;
+       nAtoms+= nKeys; /* technically not atoms, but 4 bytes wide */
+    }
+    else which&= ~XkbKeyNamesMask;
+
+    if (which&XkbKeyAliasesMask) {
+       nKA= ((names->key_aliases!=NULL)?names->num_key_aliases:0);
+       if (nKA>0)
+           nAtoms+= nKA*2; /* not atoms, but 8 bytes on the wire */
+       else which&= ~XkbKeyAliasesMask;
+    }
+
+    if (which&XkbRGNamesMask) {
+       nRG= names->num_rg;
+       if (nRG>0)
+            nAtoms+= nRG;
+       else which&= ~XkbRGNamesMask;
+    }
+
+    req->which= which;
+    req->nRadioGroups= nRG;
+    req->length+= (nAtoms*4)/4;
+
+    if (which&XkbKeycodesNameMask)
+       Data32(dpy,(long *)&names->keycodes,4);
+    if (which&XkbGeometryNameMask)
+       Data32(dpy,(long *)&names->geometry,4);
+    if (which&XkbSymbolsNameMask)
+       Data32(dpy,(long *)&names->symbols,4);
+    if (which&XkbPhysSymbolsNameMask)
+       Data32(dpy,(long *)&names->phys_symbols,4);
+    if (which&XkbTypesNameMask)
+       Data32(dpy,(long *)&names->types,4);
+    if (which&XkbCompatNameMask)
+       Data32(dpy,(long *)&names->compat,4);
+    if (which&XkbKeyTypeNamesMask) {
+       register int            i;
+       register XkbKeyTypePtr  type;
+       type= &xkb->map->types[firstType];
+       for (i=0;i<nTypes;i++,type++) {
+           Data32(dpy,(long *)&type->name,4);
+       }
+    }
+    if (which&XkbKTLevelNamesMask) {
+       XkbKeyTypePtr type;
+       int i;
+       char *tmp;
+
+       BufAlloc(char *,tmp,XkbPaddedSize(nLvlTypes));
+       type = &xkb->map->types[firstLvlType];
+       for (i=0;i<nLvlTypes;i++,type++) {
+           *tmp++ = type->num_levels;
+       }
+       type = &xkb->map->types[firstLvlType];
+       for (i=0;i<nLvlTypes;i++,type++) {
+           if (type->level_names!=NULL)
+               Data32(dpy,(long *)type->level_names,type->num_levels*4);
+       }
+    }
+    if (which&XkbIndicatorNamesMask)
+       _XkbCopyAtoms(dpy,names->indicators,leds,XkbNumIndicators);
+    if (which&XkbVirtualModNamesMask)
+       _XkbCopyAtoms(dpy,names->vmods,vmods,XkbNumVirtualMods);
+    if (which&XkbGroupNamesMask)
+       _XkbCopyAtoms(dpy,names->groups,groups,XkbNumKbdGroups);
+    if (which&XkbKeyNamesMask) {
+#ifdef WORD64
+       char *tmp;
+       register int i;
+       BufAlloc(char *,tmp,nKeys*4);
+       for (i=0;i<nKeys;i++,tmp+= 4) {
+           tmp[0]= names->keys[firstKey+i].name[0];
+           tmp[1]= names->keys[firstKey+i].name[1];
+           tmp[2]= names->keys[firstKey+i].name[2];
+           tmp[3]= names->keys[firstKey+i].name[3];
+       }
+#else
+       Data(dpy,(char *)&names->keys[firstKey],nKeys*XkbKeyNameLength);
+#endif
+    }
+    if (which&XkbKeyAliasesMask) {
+#ifdef WORD64
+       char *tmp;
+       register int i;
+       BufAlloc(char *,tmp,nKA*XkbKeyNameLength*2);
+       for (i=0;i<nKeys;i++,tmp+= 2*XkbKeyNameLength) {
+           tmp[0]= names->key_aliases[i].real[0];
+           tmp[1]= names->key_aliases[i].real[1];
+           tmp[2]= names->key_aliases[i].real[2];
+           tmp[3]= names->key_aliases[i].real[3];
+           tmp[4]= names->key_aliases[i].alias[0];
+           tmp[5]= names->key_aliases[i].alias[1];
+           tmp[6]= names->key_aliases[i].alias[2];
+           tmp[7]= names->key_aliases[i].alias[3];
+       }
+#else
+       Data(dpy,(char *)names->key_aliases,nKA*XkbKeyNameLength*2);
+#endif
+    }
+    if (which&XkbRGNamesMask) {
+       Data32(dpy,(long *)names->radio_groups,nRG*4);
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return True;
+}
+
+void
+XkbNoteNameChanges(    XkbNameChangesPtr       old,
+                       XkbNamesNotifyEvent *   new,
+                       unsigned int            wanted)
+{
+int    first,last,old_last,new_last;
+
+    wanted&= new->changed;
+    if ((old==NULL)||(new==NULL)||(wanted==0))
+       return;
+    if (wanted&XkbKeyTypeNamesMask) {
+       if (old->changed&XkbKeyTypeNamesMask) {
+           new_last= (new->first_type+new->num_types-1);
+           old_last= (old->first_type+old->num_types-1);
+
+           if (new->first_type<old->first_type)
+                first= new->first_type;
+           else first= old->first_type;
+
+           if (old_last>new_last)
+                last= old_last;
+           else last= new_last;
+
+           old->first_type= first;
+           old->num_types= (last-first)+1;
+       }
+       else {
+           old->first_type= new->first_type;
+           old->num_types= new->num_types;
+       }
+    }
+    if (wanted&XkbKTLevelNamesMask) {
+       if (old->changed&XkbKTLevelNamesMask) {
+           new_last= (new->first_lvl+new->num_lvls-1);
+           old_last= (old->first_lvl+old->num_lvls-1);
+
+           if (new->first_lvl<old->first_lvl)
+                first= new->first_lvl;
+           else first= old->first_lvl;
+
+           if (old_last>new_last)
+                last= old_last;
+           else last= new_last;
+
+           old->first_lvl= first;
+           old->num_lvls= (last-first)+1;
+       }
+       else {
+           old->first_lvl= new->first_lvl;
+           old->num_lvls= new->num_lvls;
+       }
+    }
+    if (wanted&XkbIndicatorNamesMask) {
+       if (old->changed&XkbIndicatorNamesMask)
+            old->changed_indicators|= new->changed_indicators;
+       else old->changed_indicators=  new->changed_indicators;
+    }
+    if (wanted&XkbKeyNamesMask) {
+       if (old->changed&XkbKeyNamesMask) {
+           new_last= (new->first_key+new->num_keys-1);
+           old_last= (old->first_key+old->num_keys-1);
+
+           first= old->first_key;
+
+           if (new->first_key<old->first_key)
+               first= new->first_key;
+           if (old_last>new_last)
+               new_last= old_last;
+
+           old->first_key= first;
+           old->num_keys= (new_last-first)+1;
+       }
+       else {
+           old->first_key= new->first_key;
+           old->num_keys= new->num_keys;
+       }
+    }
+    if (wanted&XkbVirtualModNamesMask) {
+       if (old->changed&XkbVirtualModNamesMask)
+            old->changed_vmods|= new->changed_vmods;
+       else old->changed_vmods=  new->changed_vmods;
+    }
+    if (wanted&XkbGroupNamesMask) {
+       if (old->changed&XkbGroupNamesMask)
+            old->changed_groups|= new->changed_groups;
+       else old->changed_groups=  new->changed_groups;
+    }
+    if (wanted&XkbRGNamesMask)
+       old->num_rg= new->num_radio_groups;
+    if (wanted&XkbKeyAliasesMask)
+       old->num_aliases= new->num_aliases;
+    old->changed|= wanted;
+    return;
+}
diff --git a/src/xkb/XKBRdBuf.c b/src/xkb/XKBRdBuf.c
new file mode 100644 (file)
index 0000000..3023a32
--- /dev/null
@@ -0,0 +1,230 @@
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+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 Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS 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 <stdio.h>
+#include "Xlibint.h"
+#include "XKBlibint.h"
+#include <X11/extensions/XKBproto.h>
+
+/***====================================================================***/
+
+int
+_XkbInitReadBuffer(Display *dpy,XkbReadBufferPtr buf,int size)
+{
+    if ((dpy!=NULL) && (buf!=NULL) && (size>0)) {
+       buf->error=  0;
+       buf->size=   size;
+       buf->start= buf->data= _XkbAlloc(size);
+       if (buf->start) {
+           _XRead(dpy, buf->start, size);
+           return 1;
+       }
+    }
+    return 0;
+}
+
+#define        _XkbReadBufferDataLeft(b)       (((b)->size)-((b)->data-(b)->start))
+
+int
+_XkbSkipReadBufferData(XkbReadBufferPtr        from,int size)
+{
+    if (size==0)
+       return 1;
+    if ((from==NULL)||(from->error)||(size<1)||
+                                       (_XkbReadBufferDataLeft(from)<size))
+       return 0;
+    from->data+= size;
+    return 1;
+}
+
+int
+_XkbCopyFromReadBuffer(XkbReadBufferPtr        from,char *to,int size)
+{
+    if (size==0)
+       return 1;
+    if ((from==NULL)||(from->error)||(to==NULL)||(size<1)||
+                                       (_XkbReadBufferDataLeft(from)<size))
+       return 0;
+    memcpy(to,from->data,size);
+    from->data+= size;
+    return 1;
+}
+
+#ifdef XKB_FORCE_INT_KEYSYM
+int
+_XkbReadCopyKeySyms(int *wire,KeySym *to,int num_words)
+{
+    while (num_words-->0) {
+       *to++= *wire++;
+    }
+    return 1;
+}
+
+int
+_XkbReadBufferCopyKeySyms(XkbReadBufferPtr from,KeySym *to,int num_words)
+{
+    if ((unsigned)(num_words*4)>_XkbReadBufferDataLeft(from))
+        return 0;
+    _XkbReadCopyKeySyms((int *)from->data,to,num_words);
+    from->data+= (4*num_words);
+    return True;
+}
+
+int
+_XkbWriteCopyKeySyms (register KeySym *from,CARD32 *to,int len)
+{
+
+    while (len-->0) {
+        *to++= (CARD32)*from++;
+    }
+    return True;
+}
+#endif
+
+#ifdef LONG64
+int
+_XkbReadCopyData32(int *wire,long *to,int num_words)
+{
+    while (num_words-->0) {
+       *to++= *wire++;
+    }
+    return 1;
+}
+#endif
+#ifdef WORD64
+int
+_XkbReadCopyData32(int *from,long *lp,int num_words)
+{
+long *lpack;
+long mask32 = 0x00000000ffffffff;
+long maskw, i, bits;
+
+    lpack = (long *)from;
+    bits = 32;
+
+    for (i=0;i<num_words;i++) {
+       maskw = mask32 << bits;
+       *lp++ = (*lpack & maskw) >> bits;
+       bits = bits ^ 32;
+       if (bits)
+           lpack++;
+    }
+    return 1;
+}
+#endif
+
+#if defined(LONG64) || defined(WORD64)
+int
+_XkbReadBufferCopy32(XkbReadBufferPtr from,long *to,int num_words)
+{
+    if ((unsigned)(num_words*4)>_XkbReadBufferDataLeft(from))
+       return 0;
+    _XkbReadCopyData32((int *)from->data,to,num_words);
+    from->data+= (4*num_words);
+    return True;
+}
+#endif
+
+#ifdef LONG64
+int
+_XkbWriteCopyData32 (register unsigned long *from,CARD32 *to,int len)
+{
+
+    while (len-->0) {
+       *to++= (CARD32)*from++;
+    }
+    return True;
+}
+#endif /* LONG64 */
+
+#ifdef WORD64
+_XkbWriteCopyData32 Not Implemented Yet for sizeof(int)==8
+#endif
+
+char *
+_XkbPeekAtReadBuffer(XkbReadBufferPtr from,int size)
+{
+    if ((from==NULL)||(from->error)||(size<1)||
+                                       (_XkbReadBufferDataLeft(from)<size))
+       return NULL;
+    return from->data;
+}
+
+char *
+_XkbGetReadBufferPtr(XkbReadBufferPtr from,int size)
+{
+char   *ptr;
+    if ((from==NULL)||(from->error)||(size<1)||
+                                       (_XkbReadBufferDataLeft(from)<size))
+       return NULL;
+    ptr= from->data;
+    from->data+= size;
+    return ptr;
+}
+
+
+int
+_XkbFreeReadBuffer(XkbReadBufferPtr buf)
+{
+    if ((buf!=NULL) && (buf->start!=NULL)) {
+       int left;
+       left= (int)_XkbReadBufferDataLeft(buf);
+       if (buf->start!=NULL)
+           Xfree(buf->start);
+       buf->size= 0;
+       buf->start= buf->data= NULL;
+       return left;
+    }
+    return 0;
+}
+
+Bool
+_XkbGetReadBufferCountedString(XkbReadBufferPtr buf,char **rtrn)
+{
+CARD16 len,*pLen;
+int    left;
+char * str = NULL;
+
+    if ((buf==NULL)||(buf->error)||((left=(int)_XkbReadBufferDataLeft(buf))<4))
+       return False;
+    pLen= (CARD16 *)buf->data;
+    len= *pLen;
+    if (len>0) {
+       if (XkbPaddedSize(len+2)>left)
+           return False;
+       str= _XkbAlloc(len+1);
+       if (str) {
+           memcpy(str,&buf->data[2],len);
+           str[len]= '\0';
+       }
+    }
+    buf->data+= XkbPaddedSize(len+2);
+    *rtrn= str;
+    return True;
+}
diff --git a/src/xkb/XKBSetGeom.c b/src/xkb/XKBSetGeom.c
new file mode 100644 (file)
index 0000000..ab76a20
--- /dev/null
@@ -0,0 +1,466 @@
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+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 Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS 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 DEBUG
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#endif
+
+#include "Xlibint.h"
+#include "XKBlibint.h"
+#include <X11/extensions/XKBgeom.h>
+#include <X11/extensions/XKBproto.h>
+
+#ifndef MINSHORT
+#define        MINSHORT        -32768
+#endif
+#ifndef MAXSHORT
+#define        MAXSHORT        32767
+#endif
+
+/***====================================================================***/
+
+#define        _SizeCountedString(s)  ((s)?XkbPaddedSize(2+strlen(s)):4)
+
+static char *
+_WriteCountedString(char *wire,char *str)
+{
+CARD16 len,*pLen;
+
+    len= (str?strlen(str):0);
+    pLen= (CARD16 *)wire;
+    *pLen= len;
+    if (len && str)
+       memcpy(&wire[2],str,len);
+    wire+= XkbPaddedSize(len+2);
+    return wire;
+}
+
+static int
+_SizeGeomProperties(XkbGeometryPtr geom)
+{
+register int   i,size;
+XkbPropertyPtr prop;
+
+    for (size=i=0,prop=geom->properties;i<geom->num_properties;i++,prop++) {
+       size+= _SizeCountedString(prop->name);
+       size+= _SizeCountedString(prop->value);
+    }
+    return size;
+}
+
+static int
+_SizeGeomColors(XkbGeometryPtr geom)
+{
+register int           i,size;
+register XkbColorPtr   color;
+
+    for (i=size=0,color=geom->colors;i<geom->num_colors;i++,color++) {
+       size+= _SizeCountedString(color->spec);
+    }
+    return size;
+}
+
+static int
+_SizeGeomShapes(XkbGeometryPtr geom)
+{
+register int           i,size;
+register XkbShapePtr   shape;
+
+    for (i=size=0,shape=geom->shapes;i<geom->num_shapes;i++,shape++) {
+       register int            n;
+       register XkbOutlinePtr  ol;
+       size+= SIZEOF(xkbShapeWireDesc);
+       for (n=0,ol=shape->outlines;n<shape->num_outlines;n++,ol++) {
+           size+= SIZEOF(xkbOutlineWireDesc);
+           size+= ol->num_points*SIZEOF(xkbPointWireDesc);
+       }
+    }
+    return size;
+}
+
+static int
+_SizeGeomDoodads(int num_doodads,XkbDoodadPtr doodad)
+{
+register int   i,size;
+
+    for (i=size=0;i<num_doodads;i++,doodad++) {
+       size+= SIZEOF(xkbAnyDoodadWireDesc);
+       if (doodad->any.type==XkbTextDoodad) {
+           size+= _SizeCountedString(doodad->text.text);
+           size+= _SizeCountedString(doodad->text.font);
+       }
+       else if (doodad->any.type==XkbLogoDoodad) {
+           size+= _SizeCountedString(doodad->logo.logo_name);
+       }
+    }
+    return size;
+}
+
+static int
+_SizeGeomSections(XkbGeometryPtr geom)
+{
+register int   i,size;
+XkbSectionPtr  section;
+
+    for (i=size=0,section=geom->sections;i<geom->num_sections;i++,section++) {
+       size+= SIZEOF(xkbSectionWireDesc);
+       if (section->rows) {
+           int         r;
+           XkbRowPtr   row;
+           for (r=0,row=section->rows;r<section->num_rows;row++,r++) {
+               size+= SIZEOF(xkbRowWireDesc);
+               size+= row->num_keys*SIZEOF(xkbKeyWireDesc);
+           }
+       }
+       if (section->doodads)
+           size+= _SizeGeomDoodads(section->num_doodads,section->doodads);
+       if (section->overlays) {
+           int                 o;
+           XkbOverlayPtr       ol;
+           for (o=0,ol=section->overlays;o<section->num_overlays;o++,ol++) {
+               int                     r;
+               XkbOverlayRowPtr        row;
+               size+= SIZEOF(xkbOverlayWireDesc);
+               for (r=0,row=ol->rows;r<ol->num_rows;r++,row++) {
+                  size+= SIZEOF(xkbOverlayRowWireDesc);
+                  size+= row->num_keys*SIZEOF(xkbOverlayKeyWireDesc);
+               }
+           }
+       }
+    }
+    return size;
+}
+
+static int
+_SizeGeomKeyAliases(XkbGeometryPtr geom)
+{
+    return geom->num_key_aliases*(2*XkbKeyNameLength);
+}
+
+/***====================================================================***/
+
+static char *
+_WriteGeomProperties(char *wire,XkbGeometryPtr geom)
+{
+register int   i;
+register XkbPropertyPtr        prop;
+
+    for (i=0,prop=geom->properties;i<geom->num_properties;i++,prop++) {
+       wire= _WriteCountedString(wire,prop->name);
+       wire= _WriteCountedString(wire,prop->value);
+    }
+    return wire;
+}
+
+static char *
+_WriteGeomColors(char *wire,XkbGeometryPtr geom)
+{
+register int           i;
+register XkbColorPtr   color;
+
+    for (i=0,color=geom->colors;i<geom->num_colors;i++,color++) {
+       wire= _WriteCountedString(wire,color->spec);
+    }
+    return wire;
+}
+
+static char *
+_WriteGeomShapes(char *wire,XkbGeometryPtr geom)
+{
+int                    i;
+XkbShapePtr            shape;
+xkbShapeWireDesc *     shapeWire;
+
+    for (i=0,shape=geom->shapes;i<geom->num_shapes;i++,shape++) {
+       register int            o;
+       XkbOutlinePtr           ol;
+       xkbOutlineWireDesc *    olWire;
+       shapeWire= (xkbShapeWireDesc *)wire;
+       shapeWire->name= shape->name;
+       shapeWire->nOutlines= shape->num_outlines;
+       if (shape->primary!=NULL)
+            shapeWire->primaryNdx= XkbOutlineIndex(shape,shape->primary);
+       else shapeWire->primaryNdx= XkbNoShape;
+       if (shape->approx!=NULL)
+            shapeWire->approxNdx= XkbOutlineIndex(shape,shape->approx);
+       else shapeWire->approxNdx= XkbNoShape;
+       wire= (char *)&shapeWire[1];
+       for (o=0,ol=shape->outlines;o<shape->num_outlines;o++,ol++) {
+           register int        p;
+           XkbPointPtr         pt;
+           xkbPointWireDesc *  ptWire;
+           olWire= (xkbOutlineWireDesc *)wire;
+           olWire->nPoints= ol->num_points;
+           olWire->cornerRadius= ol->corner_radius;
+           wire= (char *)&olWire[1];
+           ptWire= (xkbPointWireDesc *)wire;
+           for (p=0,pt=ol->points;p<ol->num_points;p++,pt++) {
+               ptWire[p].x= pt->x;
+               ptWire[p].y= pt->y;
+           }
+           wire= (char *)&ptWire[ol->num_points];
+       }
+    }
+    return wire;
+}
+
+static char *
+_WriteGeomDoodads(char *wire,int num_doodads,XkbDoodadPtr doodad)
+{
+register int           i;
+xkbDoodadWireDesc *    doodadWire;
+
+    for (i=0;i<num_doodads;i++,doodad++) {
+       doodadWire= (xkbDoodadWireDesc *)wire;
+       wire= (char *)&doodadWire[1];
+       bzero(doodadWire,SIZEOF(xkbDoodadWireDesc));
+       doodadWire->any.name= doodad->any.name;
+       doodadWire->any.type= doodad->any.type;
+       doodadWire->any.priority= doodad->any.priority;
+       doodadWire->any.top= doodad->any.top;
+       doodadWire->any.left= doodad->any.left;
+       doodadWire->any.angle= doodad->any.angle;
+       switch (doodad->any.type) {
+           case XkbOutlineDoodad:
+           case XkbSolidDoodad:
+               doodadWire->shape.colorNdx= doodad->shape.color_ndx;
+               doodadWire->shape.shapeNdx= doodad->shape.shape_ndx;
+               break;
+           case XkbTextDoodad:
+               doodadWire->text.width= doodad->text.width;
+               doodadWire->text.height= doodad->text.height;
+               doodadWire->text.colorNdx= doodad->text.color_ndx;
+               wire= _WriteCountedString(wire,doodad->text.text);
+               wire= _WriteCountedString(wire,doodad->text.font);
+               break;
+           case XkbIndicatorDoodad:
+               doodadWire->indicator.shapeNdx= doodad->indicator.shape_ndx;
+               doodadWire->indicator.onColorNdx=doodad->indicator.on_color_ndx;
+               doodadWire->indicator.offColorNdx=
+                                               doodad->indicator.off_color_ndx;
+               break;
+           case XkbLogoDoodad:
+               doodadWire->logo.colorNdx= doodad->logo.color_ndx;
+               doodadWire->logo.shapeNdx= doodad->logo.shape_ndx;
+               wire= _WriteCountedString(wire,doodad->logo.logo_name);
+               break;
+           default:
+               break;
+       }
+    }
+    return wire;
+}
+
+static char *
+_WriteGeomOverlay(char *wire,XkbOverlayPtr ol)
+{
+register int           r;
+XkbOverlayRowPtr       row;
+xkbOverlayWireDesc *   olWire;
+
+   olWire= (xkbOverlayWireDesc *)wire;
+   olWire->name= ol->name;
+   olWire->nRows= ol->num_rows;
+   wire= (char *)&olWire[1];
+   for (r=0,row=ol->rows;r<ol->num_rows;r++,row++) {
+       unsigned int            k;
+       XkbOverlayKeyPtr        key;
+       xkbOverlayRowWireDesc * rowWire;
+       rowWire= (xkbOverlayRowWireDesc *)wire;
+       rowWire->rowUnder= row->row_under;
+       rowWire->nKeys= row->num_keys;
+       wire= (char *)&rowWire[1];
+       for (k=0,key=row->keys;k<row->num_keys;k++,key++) {
+           xkbOverlayKeyWireDesc *     keyWire;
+           keyWire= (xkbOverlayKeyWireDesc *)wire;
+           memcpy(keyWire->over,key->over.name,XkbKeyNameLength);
+           memcpy(keyWire->under,key->under.name,XkbKeyNameLength);
+           wire= (char *)&keyWire[1];
+       }
+   }
+   return wire;
+}
+
+static char *
+_WriteGeomSections(char *wire,XkbGeometryPtr geom)
+{
+register int           i;
+XkbSectionPtr          section;
+xkbSectionWireDesc *   sectionWire;
+
+    for (i=0,section=geom->sections;i<geom->num_sections;i++,section++) {
+       sectionWire= (xkbSectionWireDesc *)wire;
+       sectionWire->name= section->name;
+       sectionWire->top= section->top;
+       sectionWire->left= section->left;
+       sectionWire->width= section->width;
+       sectionWire->height= section->height;
+       sectionWire->angle= section->angle;
+       sectionWire->priority= section->priority;
+       sectionWire->nRows= section->num_rows;
+       sectionWire->nDoodads= section->num_doodads;
+       sectionWire->nOverlays= section->num_overlays;
+       sectionWire->pad= 0;
+       wire= (char *)&sectionWire[1];
+       if (section->rows) {
+           int                 r;
+           XkbRowPtr           row;
+           xkbRowWireDesc *    rowWire;
+           for (r=0,row=section->rows;r<section->num_rows;r++,row++) {
+               rowWire= (xkbRowWireDesc *)wire;
+               rowWire->top= row->top;
+               rowWire->left= row->left;
+               rowWire->nKeys= row->num_keys;
+               rowWire->vertical= row->vertical;
+               rowWire->pad= 0;
+               wire= (char *)&rowWire[1];
+               if (row->keys) {
+                   int                 k;
+                   XkbKeyPtr           key;
+                   xkbKeyWireDesc *    keyWire;
+                   keyWire= (xkbKeyWireDesc *)wire;
+                   for (k=0,key=row->keys;k<row->num_keys;k++,key++) {
+                       memcpy(keyWire[k].name,key->name.name,XkbKeyNameLength);
+                       keyWire[k].gap= key->gap;
+                       keyWire[k].shapeNdx= key->shape_ndx;
+                       keyWire[k].colorNdx= key->color_ndx;
+                   }
+                   wire= (char *)&keyWire[row->num_keys];
+               }
+           }
+       }
+       if (section->doodads) {
+           wire= _WriteGeomDoodads(wire,
+                                     section->num_doodads,section->doodads);
+       }
+       if (section->overlays) {
+           register int o;
+           for (o=0;o<section->num_overlays;o++) {
+               wire= _WriteGeomOverlay(wire,&section->overlays[o]);
+           }
+       }
+    }
+    return wire;
+}
+
+static char *
+_WriteGeomKeyAliases(char *wire,XkbGeometryPtr geom)
+{
+register int sz;
+
+    sz= geom->num_key_aliases*(XkbKeyNameLength*2);
+    if (sz>0) {
+       memcpy(wire,(char *)geom->key_aliases,sz);
+       wire+= sz;
+    }
+    return wire;
+}
+
+/***====================================================================***/
+
+static Status
+_SendSetGeometry(Display *dpy,XkbGeometryPtr geom,xkbSetGeometryReq *req)
+{
+int                    sz;
+char *                 wire,*tbuf;
+
+    sz= 0;
+    sz+= _SizeCountedString(geom->label_font);
+    sz+= _SizeGeomProperties(geom);
+    sz+= _SizeGeomColors(geom);
+    sz+= _SizeGeomShapes(geom);
+    sz+= _SizeGeomSections(geom);
+    sz+= _SizeGeomDoodads(geom->num_doodads,geom->doodads);
+    sz+= _SizeGeomKeyAliases(geom);
+    req->length+= (sz/4);
+    if (sz < (dpy->bufmax - dpy->buffer)) {
+       BufAlloc(char *,wire,sz);
+       tbuf= NULL;
+    }
+    else {
+       tbuf= _XAllocTemp(dpy,sz);
+       if (!tbuf)
+           return BadAlloc;
+       wire= tbuf;
+    }
+    wire= _WriteCountedString(wire,geom->label_font);
+    if (geom->num_properties>0)
+       wire= _WriteGeomProperties(wire,geom);
+    if (geom->num_colors>0)
+       wire= _WriteGeomColors(wire,geom);
+    if (geom->num_shapes>0)
+       wire= _WriteGeomShapes(wire,geom);
+    if (geom->num_sections>0)
+       wire= _WriteGeomSections(wire,geom);
+    if (geom->num_doodads>0)
+       wire= _WriteGeomDoodads(wire,geom->num_doodads,geom->doodads);
+    if (geom->num_key_aliases>0)
+       wire= _WriteGeomKeyAliases(wire,geom);
+    if (tbuf!=NULL) {
+       Data(dpy,tbuf,sz);
+       _XFreeTemp(dpy,tbuf,sz);
+    }
+    return Success;
+}
+
+/***====================================================================***/
+
+Status
+XkbSetGeometry(Display *dpy,unsigned deviceSpec,XkbGeometryPtr geom)
+{
+xkbSetGeometryReq      *req;
+Status ret;
+
+    if ( (!geom) || (dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return BadAccess;
+
+    LockDisplay(dpy);
+    GetReq(kbSetGeometry, req);
+    req->reqType = dpy->xkb_info->codes->major_opcode;
+    req->xkbReqType = X_kbSetGeometry;
+    req->deviceSpec = deviceSpec;
+    req->nShapes= geom->num_shapes;
+    req->nSections= geom->num_sections;
+    req->name= geom->name;
+    req->widthMM= geom->width_mm;
+    req->heightMM= geom->height_mm;
+    req->nProperties= geom->num_properties;
+    req->nColors= geom->num_colors;
+    req->nDoodads= geom->num_doodads;
+    req->nKeyAliases= geom->num_key_aliases;
+    req->baseColorNdx= (geom->base_color-geom->colors);
+    req->labelColorNdx= (geom->label_color-geom->colors);
+
+    ret = _SendSetGeometry(dpy,geom,req);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return ret;
+}
+
diff --git a/src/xkb/XKBSetMap.c b/src/xkb/XKBSetMap.c
new file mode 100644 (file)
index 0000000..cad9364
--- /dev/null
@@ -0,0 +1,591 @@
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+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 Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS 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 <stdio.h>
+#include "Xlibint.h"
+#include <X11/extensions/XKBproto.h>
+#include "XKBlibint.h"
+
+static int
+_XkbSizeKeyTypes(XkbDescPtr xkb,xkbSetMapReq *req)
+{
+    XkbKeyTypePtr      map;
+    int                        i,len;
+
+    if (((req->present&XkbKeyTypesMask)==0)||(req->nTypes==0)) {
+       req->present&= ~XkbKeyTypesMask;
+       req->firstType= req->nTypes= 0;
+       return 0;
+    }
+    len= 0;
+    map= &xkb->map->types[req->firstType];
+    for (i=0;i<req->nTypes;i++,map++){
+       len+= SIZEOF(xkbKeyTypeWireDesc);
+       len+= map->map_count*SIZEOF(xkbKTSetMapEntryWireDesc);
+       if (map->preserve)
+           len+= map->map_count*SIZEOF(xkbModsWireDesc);
+    }
+    return len;
+}
+
+static void
+_XkbWriteKeyTypes(Display *dpy,XkbDescPtr xkb,xkbSetMapReq *req)
+{
+    char *             buf;
+    XkbKeyTypePtr      type;
+    int                        i,n,sz;
+    xkbKeyTypeWireDesc *desc;
+
+    if ((req->present&XkbKeyTypesMask)==0)
+       return;
+    type= &xkb->map->types[req->firstType];
+    for (i=0;i<req->nTypes;i++,type++) {
+       sz= SIZEOF(xkbKeyTypeWireDesc);
+       sz+= type->map_count*SIZEOF(xkbKTSetMapEntryWireDesc);
+       if (type->preserve)
+           sz+= type->map_count*SIZEOF(xkbModsWireDesc);
+       BufAlloc(xkbKeyTypeWireDesc *,desc,sz);
+       desc->mask = type->mods.mask;
+       desc->realMods = type->mods.real_mods;
+       desc->virtualMods = type->mods.vmods;
+       desc->numLevels = type->num_levels;
+       desc->nMapEntries = type->map_count;
+       desc->preserve = (type->preserve!=NULL);
+       buf= (char *)&desc[1];
+       if (desc->nMapEntries>0) {
+           xkbKTSetMapEntryWireDesc *wire;
+           wire= (xkbKTSetMapEntryWireDesc *)buf;
+           for (n=0;n<type->map_count;n++,wire++) {
+               wire->level= type->map[n].level;
+               wire->realMods= type->map[n].mods.real_mods;
+               wire->virtualMods= type->map[n].mods.vmods;
+           }
+           buf= (char *)wire;
+           if (type->preserve) {
+               xkbModsWireDesc *pwire;
+               pwire= (xkbModsWireDesc *)buf;
+               for (n=0;n<type->map_count;n++,pwire++) {
+                   pwire->realMods= type->preserve[n].real_mods;
+                   pwire->virtualMods= type->preserve[n].vmods;
+               }
+           }
+       }
+    }
+    return;
+}
+
+static int
+_XkbSizeKeySyms(XkbDescPtr xkb,xkbSetMapReq *req)
+{
+    int                        i,len;
+    unsigned           nSyms;
+
+    if (((req->present&XkbKeySymsMask)==0)||(req->nKeySyms==0)) {
+       req->present&= ~XkbKeySymsMask;
+       req->firstKeySym= req->nKeySyms= 0;
+       req->totalSyms= 0;
+       return 0;
+    }
+    len= (int)(req->nKeySyms*sizeof(XkbSymMapRec));
+    for (i=nSyms=0;i<req->nKeySyms;i++) {
+       nSyms+= XkbKeyNumSyms(xkb,i+req->firstKeySym);
+    }
+    len+= nSyms*sizeof(CARD32);
+    req->totalSyms= nSyms;
+    return len;
+}
+
+static void
+_XkbWriteKeySyms(Display *dpy,XkbDescPtr xkb,xkbSetMapReq *req)
+{
+register KeySym *      pSym;
+CARD32 *               outSym;
+XkbSymMapPtr           symMap;
+xkbSymMapWireDesc *desc;
+register int   i;
+
+    if ((req->present&XkbKeySymsMask)==0)
+       return;
+    symMap = &xkb->map->key_sym_map[req->firstKeySym];
+    for (i=0;i<req->nKeySyms;i++,symMap++) {
+       BufAlloc(xkbSymMapWireDesc *,desc,
+                SIZEOF(xkbSymMapWireDesc)+
+                (XkbKeyNumSyms(xkb,i+req->firstKeySym)*sizeof(CARD32)));
+       desc->ktIndex[0] = symMap->kt_index[0];
+       desc->ktIndex[1] = symMap->kt_index[1];
+       desc->ktIndex[2] = symMap->kt_index[2];
+       desc->ktIndex[3] = symMap->kt_index[3];
+       desc->groupInfo = symMap->group_info;
+       desc->width = symMap->width;
+       desc->nSyms = XkbKeyNumSyms(xkb,i+req->firstKeySym);
+       outSym = (CARD32 *)&desc[1];
+       if (desc->nSyms>0) {
+            pSym = XkbKeySymsPtr(xkb,i+req->firstKeySym);
+           _XkbWriteCopyKeySyms(pSym,outSym,desc->nSyms);
+       }
+    }
+    return;
+}
+
+static int
+_XkbSizeKeyActions(XkbDescPtr xkb,xkbSetMapReq *req)
+{
+    int                        i,len,nActs;
+
+    if (((req->present&XkbKeyActionsMask)==0)||(req->nKeyActs==0)) {
+       req->present&= ~XkbKeyActionsMask;
+       req->firstKeyAct= req->nKeyActs= 0;
+       req->totalActs= 0;
+       return 0;
+    }
+    for (nActs=i=0;i<req->nKeyActs;i++) {
+       if (xkb->server->key_acts[i+req->firstKeyAct]!=0)
+           nActs+= XkbKeyNumActions(xkb,i+req->firstKeyAct);
+    }
+    len= XkbPaddedSize(req->nKeyActs)+(nActs*SIZEOF(xkbActionWireDesc));
+    req->totalActs= nActs;
+    return len;
+}
+
+static void
+_XkbWriteKeyActions(Display *dpy,XkbDescPtr xkb,xkbSetMapReq *req)
+{
+    register int        i;
+    int                         n;
+    CARD8              *numDesc;
+    XkbAction          *actDesc;
+
+    if ((req->present&XkbKeyActionsMask)==0)
+       return;
+    n = XkbPaddedSize(req->nKeyActs);
+    n+= (req->totalActs*SIZEOF(xkbActionWireDesc));
+
+    BufAlloc(CARD8 *,numDesc,n);
+    for (i=0;i<req->nKeyActs;i++) {
+       if (xkb->server->key_acts[i+req->firstKeyAct]==0)
+            numDesc[i] = 0;
+       else numDesc[i] = XkbKeyNumActions(xkb,(i+req->firstKeyAct));
+    }
+    actDesc = (XkbAction *)&numDesc[XkbPaddedSize(req->nKeyActs)];
+    for (i=0;i<req->nKeyActs;i++) {
+       if (xkb->server->key_acts[i+req->firstKeyAct]!=0) {
+           n = XkbKeyNumActions(xkb,(i+req->firstKeyAct));
+           memcpy(actDesc,XkbKeyActionsPtr(xkb,(i+req->firstKeyAct)),
+                                                   n*SIZEOF(xkbActionWireDesc));
+           actDesc+= n;
+       }
+    }
+    return;
+}
+
+static int
+_XkbSizeKeyBehaviors(XkbDescPtr        xkb,xkbSetMapReq *req)
+{
+register int i,first,last,nFound;
+
+    if (((req->present&XkbKeyBehaviorsMask)==0)||(req->nKeyBehaviors<1)) {
+       req->present&= ~XkbKeyBehaviorsMask;
+       req->firstKeyBehavior= req->nKeyBehaviors= 0;
+       req->totalKeyBehaviors= 0;
+       return 0;
+    }
+    first= req->firstKeyBehavior;
+    last= first+req->nKeyBehaviors-1;
+    for (i=first,nFound=0;i<=last;i++) {
+       if (xkb->server->behaviors[i].type!=XkbKB_Default)
+           nFound++;
+    }
+    req->totalKeyBehaviors= nFound;
+    return (nFound*SIZEOF(xkbBehaviorWireDesc));
+}
+
+static void
+_XkbWriteKeyBehaviors(Display *dpy,XkbDescPtr xkb,xkbSetMapReq *req)
+{
+register int           i,first,last;
+xkbBehaviorWireDesc *  wire;
+char *                 buf;
+
+    if ((req->present&XkbKeyBehaviorsMask)==0)
+       return;
+    first= req->firstKeyBehavior;
+    last= first+req->nKeyBehaviors-1;
+
+    i= req->totalKeyBehaviors*SIZEOF(xkbBehaviorWireDesc);
+    BufAlloc(char *,buf,i);
+    wire= (xkbBehaviorWireDesc *)buf;
+    for (i=first;i<=last;i++) {
+       if (xkb->server->behaviors[i].type!=XkbKB_Default) {
+           wire->key= i;
+           wire->type= xkb->server->behaviors[i].type;
+           wire->data= xkb->server->behaviors[i].data;
+           buf+= SIZEOF(xkbBehaviorWireDesc);
+           wire= (xkbBehaviorWireDesc *)buf;
+       }
+    }
+    return;
+}
+
+static unsigned
+_XkbSizeVirtualMods(xkbSetMapReq *req)
+{
+register int i,bit,nMods;
+
+   if (((req->present&XkbVirtualModsMask)==0)||(req->virtualMods==0)) {
+       req->present&= ~XkbVirtualModsMask;
+       req->virtualMods= 0;
+       return 0;
+   }
+   for (i=nMods=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) {
+       if (req->virtualMods&bit)
+           nMods++;
+   }
+   return XkbPaddedSize(nMods);
+}
+
+static void
+_XkbWriteVirtualMods(  Display *       dpy,
+                       XkbDescPtr      xkb,
+                       xkbSetMapReq *  req,
+                       unsigned        size)
+{
+    register int        i,bit;
+    CARD8              *vmods;
+
+    /* This was req->present&XkbVirtualModsMask==0, and '==' beats '&' */
+    if (((req->present & XkbVirtualModsMask) == 0) || (size < 1))
+       return;
+    BufAlloc(CARD8 *,vmods,size);
+    for (i=0,bit=1;i<XkbNumVirtualMods;i++,bit<<=1) {
+       if (req->virtualMods&bit)
+           *vmods++= xkb->server->vmods[i];
+    }
+    return;
+}
+
+static int
+_XkbSizeKeyExplicit(XkbDescPtr xkb,xkbSetMapReq *req)
+{
+register int i,first,last,nFound;
+
+    if (((req->present&XkbExplicitComponentsMask)==0)||(req->nKeyExplicit==0)) {
+       req->present&= ~XkbExplicitComponentsMask;
+       req->firstKeyExplicit= req->nKeyExplicit= 0;
+       req->totalKeyExplicit= 0;
+       return 0;
+    }
+    first= req->firstKeyExplicit;
+    last= first+req->nKeyExplicit-1;
+
+    for (i=first,nFound=0;i<=last;i++) {
+       if (xkb->server->explicit[i]!=0)
+           nFound++;
+    }
+    req->totalKeyExplicit= nFound;
+    return XkbPaddedSize((nFound*2));
+}
+
+static void
+_XkbWriteKeyExplicit(Display *dpy,XkbDescPtr xkb,xkbSetMapReq *req)
+{
+register int   i,first,last;
+CARD8 *                wire;
+
+    if ((req->present&XkbExplicitComponentsMask)==0)
+       return;
+    first= req->firstKeyExplicit;
+    last= first+req->nKeyExplicit - 1;
+    i= XkbPaddedSize((req->totalKeyExplicit*2));
+    BufAlloc(CARD8 *,wire,i);
+    for (i=first;i<=last;i++) {
+       if (xkb->server->explicit[i]!=0) {
+           wire[0]= i;
+           wire[1]= xkb->server->explicit[i];
+           wire+= 2;
+       }
+    }
+    return;
+}
+
+static int
+_XkbSizeModifierMap(XkbDescPtr xkb,xkbSetMapReq *req)
+{
+register int i,first,last,nFound;
+
+    if (((req->present&XkbModifierMapMask)==0)||(req->nModMapKeys==0)) {
+       req->present&= ~XkbModifierMapMask;
+       req->firstModMapKey= req->nModMapKeys= 0;
+       req->totalModMapKeys= 0;
+       return 0;
+    }
+    first= req->firstModMapKey;
+    last= first+req->nModMapKeys-1;
+
+    for (i=first,nFound=0;i<=last;i++) {
+       if (xkb->map->modmap[i]!=0)
+           nFound++;
+    }
+    req->totalModMapKeys= nFound;
+    return XkbPaddedSize((nFound*2));
+}
+
+static void
+_XkbWriteModifierMap(Display *dpy,XkbDescPtr xkb,xkbSetMapReq *req)
+{
+register int   i,first,last;
+CARD8 *                wire;
+
+    if ((req->present&XkbModifierMapMask)==0)
+       return;
+    first= req->firstModMapKey;
+    last= first+req->nModMapKeys-1;
+    if (req->totalModMapKeys>0) {
+       i= XkbPaddedSize((req->totalModMapKeys*2));
+       BufAlloc(CARD8 *,wire,i);
+       for (i=first;i<=last;i++) {
+           if (xkb->map->modmap[i]!=0) {
+               wire[0]= i;
+               wire[1]= xkb->map->modmap[i];
+               wire+= 2;
+           }
+       }
+    }
+    return;
+}
+
+static int
+_XkbSizeVirtualModMap(XkbDescPtr xkb,xkbSetMapReq *req)
+{
+register int i,first,last,nFound;
+
+    if (((req->present&XkbVirtualModMapMask)==0)||(req->nVModMapKeys==0)) {
+       req->present&= ~XkbVirtualModMapMask;
+       req->firstVModMapKey= req->nVModMapKeys= 0;
+       req->totalVModMapKeys= 0;
+       return 0;
+    }
+    first= req->firstVModMapKey;
+    last= first+req->nVModMapKeys-1;
+
+    for (i=first,nFound=0;i<=last;i++) {
+       if (xkb->server->vmodmap[i]!=0)
+           nFound++;
+    }
+    req->totalVModMapKeys= nFound;
+    return nFound*SIZEOF(xkbVModMapWireDesc);
+}
+
+static void
+_XkbWriteVirtualModMap(Display *dpy,XkbDescPtr xkb,xkbSetMapReq *req)
+{
+register int           i,first,last;
+xkbVModMapWireDesc *   wire;
+
+    if ((req->present&XkbVirtualModMapMask)==0)
+       return;
+    first= req->firstVModMapKey;
+    last= first+req->nVModMapKeys-1;
+    if (req->totalVModMapKeys>0) {
+       i= req->totalVModMapKeys*SIZEOF(xkbVModMapWireDesc);
+       BufAlloc(xkbVModMapWireDesc *,wire,i);
+       for (i=first;i<=last;i++) {
+           if (xkb->server->vmodmap[i]!=0) {
+               wire->key= i;
+               wire->vmods= xkb->server->vmodmap[i];
+               wire++;
+           }
+       }
+    }
+    return;
+}
+
+static void
+SendSetMap(Display *dpy,XkbDescPtr xkb,xkbSetMapReq *req)
+{
+xkbSetMapReq tmp;
+unsigned szMods;
+
+    req->length+= _XkbSizeKeyTypes(xkb,req)/4;
+    req->length+= _XkbSizeKeySyms(xkb,req)/4;
+    req->length+= _XkbSizeKeyActions(xkb,req)/4;
+    req->length+= _XkbSizeKeyBehaviors(xkb,req)/4;
+    szMods= _XkbSizeVirtualMods(req);
+    req->length+= szMods/4;
+    req->length+= _XkbSizeKeyExplicit(xkb,req)/4;
+    req->length+= _XkbSizeModifierMap(xkb,req)/4;
+    req->length+= _XkbSizeVirtualModMap(xkb,req)/4;
+
+    tmp= *req;
+    if ( tmp.nTypes>0 )
+       _XkbWriteKeyTypes(dpy,xkb,&tmp);
+    if ( tmp.nKeySyms>0 )
+       _XkbWriteKeySyms(dpy,xkb,&tmp);
+    if ( tmp.nKeyActs )
+       _XkbWriteKeyActions(dpy,xkb,&tmp);
+    if ( tmp.totalKeyBehaviors>0 )
+       _XkbWriteKeyBehaviors(dpy,xkb,&tmp);
+    if ( tmp.virtualMods )
+       _XkbWriteVirtualMods(dpy,xkb,&tmp,szMods);
+    if ( tmp.totalKeyExplicit>0)
+       _XkbWriteKeyExplicit(dpy,xkb,&tmp);
+    if ( tmp.totalModMapKeys>0)
+       _XkbWriteModifierMap(dpy,xkb,&tmp);
+    if ( tmp.totalVModMapKeys>0)
+       _XkbWriteVirtualModMap(dpy,xkb,&tmp);
+    return;
+}
+
+Bool
+XkbSetMap(Display *dpy,unsigned which,XkbDescPtr xkb)
+{
+register xkbSetMapReq *        req;
+XkbInfoPtr             xkbi;
+XkbServerMapPtr                srv;
+XkbClientMapPtr                map;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL))||
+       (!xkb))
+       return False;
+    map= xkb->map;
+    srv= xkb->server;
+
+    if (((which&XkbKeyTypesMask)&&((!map)||(!map->types)))||
+       ((which&XkbKeySymsMask)&&((!map)||(!map->syms)||(!map->key_sym_map)))||
+       ((which&XkbKeyActionsMask)&&((!srv)||(!srv->key_acts)))||
+       ((which&XkbKeyBehaviorsMask)&&((!srv)||(!srv->behaviors)))||
+       ((which&XkbVirtualModsMask)&&(!srv))||
+       ((which&XkbExplicitComponentsMask)&&((!srv)||(!srv->explicit)))||
+       ((which&XkbModifierMapMask)&&((!map)||(!map->modmap)))||
+       ((which&XkbVirtualModMapMask)&&((!srv)||(!srv->vmodmap))))
+       return False;
+
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    GetReq(kbSetMap, req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbSetMap;
+    req->deviceSpec = xkb->device_spec;
+    req->present = which;
+    req->flags = XkbSetMapAllFlags;
+    req->minKeyCode= xkb->min_key_code;
+    req->maxKeyCode= xkb->max_key_code;
+    req->firstType = 0;
+    if (which&XkbKeyTypesMask) req->nTypes = map->num_types;
+    else                       req->nTypes = 0;
+    if (which&XkbKeySymsMask) {
+       req->firstKeySym = xkb->min_key_code;
+       req->nKeySyms = XkbNumKeys(xkb);
+    }
+    if (which&XkbKeyActionsMask) {
+       req->firstKeyAct = xkb->min_key_code;
+       req->nKeyActs = XkbNumKeys(xkb);
+    }
+    if (which&XkbKeyBehaviorsMask) {
+       req->firstKeyBehavior = xkb->min_key_code;
+       req->nKeyBehaviors = XkbNumKeys(xkb);
+    }
+    if (which&XkbVirtualModsMask)
+       req->virtualMods= ~0;
+    if (which&XkbExplicitComponentsMask) {
+       req->firstKeyExplicit= xkb->min_key_code;
+       req->nKeyExplicit = XkbNumKeys(xkb);
+    }
+    if (which&XkbModifierMapMask) {
+       req->firstModMapKey= xkb->min_key_code;
+       req->nModMapKeys = XkbNumKeys(xkb);
+    }
+    if (which&XkbVirtualModMapMask) {
+       req->firstVModMapKey= xkb->min_key_code;
+       req->nVModMapKeys = XkbNumKeys(xkb);
+    }
+    SendSetMap(dpy,xkb,req);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return True;
+}
+
+Bool
+XkbChangeMap(Display *dpy,XkbDescPtr xkb,XkbMapChangesPtr changes)
+{
+register xkbSetMapReq *        req;
+XkbInfoPtr             xkbi;
+XkbServerMapPtr                srv;
+XkbClientMapPtr                map;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL))||
+       (!xkb)||(!changes))
+       return False;
+    srv= xkb->server;
+    map= xkb->map;
+
+    if (((changes->changed&XkbKeyTypesMask)&&((!map)||(!map->types)))||
+       ((changes->changed&XkbKeySymsMask)&&((!map)||(!map->syms)||
+                               (!map->key_sym_map)))||
+       ((changes->changed&XkbKeyActionsMask)&&((!srv)||(!srv->key_acts)))||
+       ((changes->changed&XkbKeyBehaviorsMask)&&((!srv)||(!srv->behaviors)))||
+       ((changes->changed&XkbVirtualModsMask)&&(!srv))||
+       ((changes->changed&XkbExplicitComponentsMask)&&
+                               ((!srv)||(!srv->explicit)))||
+       ((changes->changed&XkbModifierMapMask)&&((!map)||(!map->modmap)))||
+       ((changes->changed&XkbVirtualModMapMask)&&((!srv)||(!srv->vmodmap))))
+       return False;
+
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    GetReq(kbSetMap, req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbSetMap;
+    req->deviceSpec = xkb->device_spec;
+    req->present = changes->changed;
+    req->flags = XkbSetMapRecomputeActions;
+    req->minKeyCode= xkb->min_key_code;
+    req->maxKeyCode= xkb->max_key_code;
+    req->firstType = changes->first_type;
+    req->nTypes = changes->num_types;
+    req->firstKeySym = changes->first_key_sym;
+    req->nKeySyms = changes->num_key_syms;
+    req->firstKeyAct = changes->first_key_act;
+    req->nKeyActs = changes->num_key_acts;
+    req->firstKeyBehavior = changes->first_key_behavior;
+    req->nKeyBehaviors = changes->num_key_behaviors;
+    req->virtualMods = changes->vmods;
+    req->firstKeyExplicit = changes->first_key_explicit;
+    req->nKeyExplicit = changes->num_key_explicit;
+    req->firstModMapKey = changes->first_modmap_key;
+    req->nModMapKeys = changes->num_modmap_keys;
+    req->firstVModMapKey = changes->first_vmodmap_key;
+    req->nVModMapKeys = changes->num_vmodmap_keys;
+    SendSetMap(dpy,xkb,req);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return True;
+}
+
diff --git a/src/xkb/XKBUse.c b/src/xkb/XKBUse.c
new file mode 100644 (file)
index 0000000..05dcfc1
--- /dev/null
@@ -0,0 +1,797 @@
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+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 Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS 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 <stdio.h>
+#include <ctype.h>
+#include "Xlibint.h"
+#include <X11/extensions/XKBproto.h>
+#include "XKBlibint.h"
+
+static Bool    _XkbIgnoreExtension = False;
+
+void
+XkbNoteMapChanges(XkbMapChangesPtr old,XkbMapNotifyEvent *new,unsigned wanted)
+{
+    int first,oldLast,newLast;
+    wanted&= new->changed;
+
+    if (wanted&XkbKeyTypesMask) {
+       if (old->changed&XkbKeyTypesMask) {
+           first = old->first_type;
+           oldLast = old->first_type+old->num_types-1;
+           newLast = new->first_type+new->num_types-1;
+
+           if (new->first_type<first)
+               first = new->first_type;
+           if (oldLast>newLast)
+               newLast= oldLast;
+           old->first_type = first;
+           old->num_types = newLast-first+1;
+       }
+       else {
+           old->first_type= new->first_type;
+           old->num_types = new->num_types;
+       }
+    }
+    if (wanted&XkbKeySymsMask) {
+       if (old->changed&XkbKeySymsMask) {
+           first = old->first_key_sym;
+           oldLast = old->first_key_sym+old->num_key_syms-1;
+           newLast = new->first_key_sym+new->num_key_syms-1;
+
+           if (new->first_key_sym<first)
+               first = new->first_key_sym;
+           if (oldLast>newLast)
+               newLast= oldLast;
+           old->first_key_sym = first;
+           old->num_key_syms = newLast-first+1;
+       }
+       else {
+           old->first_key_sym = new->first_key_sym;
+           old->num_key_syms = new->num_key_syms;
+       }
+    }
+    if (wanted&XkbKeyActionsMask) {
+       if (old->changed&XkbKeyActionsMask) {
+           first = old->first_key_act;
+           oldLast = old->first_key_act+old->num_key_acts-1;
+           newLast = new->first_key_act+new->num_key_acts-1;
+
+           if (new->first_key_act<first)
+               first = new->first_key_act;
+           if (oldLast>newLast)
+               newLast= oldLast;
+           old->first_key_act = first;
+           old->num_key_acts = newLast-first+1;
+       }
+       else {
+           old->first_key_act = new->first_key_act;
+           old->num_key_acts = new->num_key_acts;
+       }
+    }
+    if (wanted&XkbKeyBehaviorsMask) {
+       if (old->changed&XkbKeyBehaviorsMask) {
+           first = old->first_key_behavior;
+           oldLast = old->first_key_behavior+old->num_key_behaviors-1;
+           newLast = new->first_key_behavior+new->num_key_behaviors-1;
+
+           if (new->first_key_behavior<first)
+               first = new->first_key_behavior;
+           if (oldLast>newLast)
+               newLast= oldLast;
+           old->first_key_behavior = first;
+           old->num_key_behaviors = newLast-first+1;
+       }
+       else {
+           old->first_key_behavior = new->first_key_behavior;
+           old->num_key_behaviors = new->num_key_behaviors;
+       }
+    }
+    if (wanted&XkbVirtualModsMask) {
+       old->vmods|= new->vmods;
+    }
+    if (wanted&XkbExplicitComponentsMask) {
+       if (old->changed&XkbExplicitComponentsMask) {
+           first = old->first_key_explicit;
+           oldLast = old->first_key_explicit+old->num_key_explicit-1;
+           newLast = new->first_key_explicit+new->num_key_explicit-1;
+
+           if (new->first_key_explicit<first)
+               first = new->first_key_explicit;
+           if (oldLast>newLast)
+               newLast= oldLast;
+           old->first_key_explicit = first;
+           old->num_key_explicit = newLast-first+1;
+       }
+       else {
+           old->first_key_explicit = new->first_key_explicit;
+           old->num_key_explicit = new->num_key_explicit;
+       }
+    }
+    if (wanted&XkbModifierMapMask) {
+       if (old->changed&XkbModifierMapMask) {
+           first = old->first_modmap_key;
+           oldLast = old->first_modmap_key+old->num_modmap_keys-1;
+           newLast = new->first_modmap_key+new->num_modmap_keys-1;
+
+           if (new->first_modmap_key<first)
+               first = new->first_modmap_key;
+           if (oldLast>newLast)
+               newLast= oldLast;
+           old->first_modmap_key = first;
+           old->num_modmap_keys = newLast-first+1;
+       }
+       else {
+           old->first_modmap_key = new->first_modmap_key;
+           old->num_modmap_keys = new->num_modmap_keys;
+       }
+    }
+    if (wanted&XkbVirtualModMapMask) {
+       if (old->changed&XkbVirtualModMapMask) {
+           first = old->first_vmodmap_key;
+           oldLast = old->first_vmodmap_key+old->num_vmodmap_keys-1;
+           newLast = new->first_vmodmap_key+new->num_vmodmap_keys-1;
+
+           if (new->first_vmodmap_key<first)
+               first = new->first_vmodmap_key;
+           if (oldLast>newLast)
+               newLast= oldLast;
+           old->first_vmodmap_key = first;
+           old->num_vmodmap_keys = newLast-first+1;
+       }
+       else {
+           old->first_vmodmap_key = new->first_vmodmap_key;
+           old->num_vmodmap_keys = new->num_vmodmap_keys;
+       }
+    }
+    old->changed|= wanted;
+    return;
+}
+
+void
+_XkbNoteCoreMapChanges(        XkbMapChangesPtr         old,
+                       XMappingEvent *         new,
+                       unsigned int            wanted)
+{
+    int first,oldLast,newLast;
+
+    if ((new->request==MappingKeyboard)&&(wanted&XkbKeySymsMask)) {
+       if (old->changed&XkbKeySymsMask) {
+           first = old->first_key_sym;
+           oldLast = old->first_key_sym+old->num_key_syms-1;
+           newLast = new->first_keycode+new->count-1;
+
+           if (new->first_keycode<first)
+               first = new->first_keycode;
+           if (oldLast>newLast)
+               newLast= oldLast;
+           old->first_key_sym = first;
+           old->num_key_syms = newLast-first+1;
+       }
+       else {
+           old->changed|= XkbKeySymsMask;
+           old->first_key_sym = new->first_keycode;
+           old->num_key_syms = new->count;
+       }
+    }
+    return;
+}
+
+static Bool
+wire_to_event(Display *dpy,XEvent *re,xEvent *event)
+{
+    xkbEvent *xkbevent= (xkbEvent *)event;
+    XkbInfoPtr xkbi;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return False;
+    xkbi = dpy->xkb_info;
+    if (((event->u.u.type&0x7f)-xkbi->codes->first_event)!=XkbEventCode)
+       return False;
+
+    switch (xkbevent->u.any.xkbType) {
+       case XkbStateNotify:
+           {
+               xkbStateNotify *sn = (xkbStateNotify *)event;
+               if ( xkbi->selected_events&XkbStateNotifyMask ) {
+                   XkbStateNotifyEvent *sev=(XkbStateNotifyEvent *)re;
+                   sev->type = XkbEventCode+xkbi->codes->first_event;
+                   sev->xkb_type = XkbStateNotify;
+                   sev->serial = _XSetLastRequestRead(dpy,
+                                       (xGenericReply *)event);
+                   sev->send_event = ((event->u.u.type & 0x80) != 0);
+                   sev->display = dpy;
+                   sev->time = sn->time;
+                   sev->device = sn->deviceID;
+                   sev->keycode = sn->keycode;
+                   sev->event_type = sn->eventType;
+                   sev->req_major = sn->requestMajor;
+                   sev->req_minor = sn->requestMinor;
+                   sev->changed = sn->changed;
+                   sev->group = sn->group;
+                   sev->base_group = sn->baseGroup;
+                   sev->latched_group = sn->latchedGroup;
+                   sev->locked_group = sn->lockedGroup;
+                   sev->mods = sn->mods;
+                   sev->base_mods = sn->baseMods;
+                   sev->latched_mods = sn->latchedMods;
+                   sev->locked_mods = sn->lockedMods;
+                   sev->compat_state = sn->compatState;
+                   sev->grab_mods = sn->grabMods;
+                   sev->compat_grab_mods = sn->compatGrabMods;
+                   sev->lookup_mods = sn->lookupMods;
+                   sev->compat_lookup_mods = sn->compatLookupMods;
+                   sev->ptr_buttons = sn->ptrBtnState;
+                   return True;
+               }
+           }
+           break;
+       case XkbMapNotify:
+           {
+               xkbMapNotify *mn = (xkbMapNotify *)event;
+               if ((xkbi->selected_events&XkbMapNotifyMask)&&
+                               (xkbi->selected_map_details&mn->changed)) {
+                   XkbMapNotifyEvent *mev;
+                   mev =(XkbMapNotifyEvent *)re;
+                   mev->type = XkbEventCode+xkbi->codes->first_event;
+                   mev->xkb_type = XkbMapNotify;
+                   mev->serial = _XSetLastRequestRead(dpy,
+                                               (xGenericReply *)event);
+                   mev->send_event = ((event->u.u.type&0x80)!=0);
+                   mev->display = dpy;
+                   mev->time = mn->time;
+                   mev->device = mn->deviceID;
+                   mev->changed =  mn->changed;
+                   mev->min_key_code = mn->minKeyCode;
+                   mev->max_key_code = mn->maxKeyCode;
+                   mev->first_type = mn->firstType;
+                   mev->num_types = mn->nTypes;
+                   mev->first_key_sym = mn->firstKeySym;
+                   mev->num_key_syms = mn->nKeySyms;
+                   mev->first_key_act = mn->firstKeyAct;
+                   mev->num_key_acts = mn->nKeyActs;
+                   mev->first_key_behavior = mn->firstKeyBehavior;
+                   mev->num_key_behaviors = mn->nKeyBehaviors;
+                   mev->vmods = mn->virtualMods;
+                   mev->first_key_explicit = mn->firstKeyExplicit;
+                   mev->num_key_explicit = mn->nKeyExplicit;
+                   mev->first_modmap_key = mn->firstModMapKey;
+                   mev->num_modmap_keys = mn->nModMapKeys;
+                   mev->first_vmodmap_key = mn->firstVModMapKey;
+                   mev->num_vmodmap_keys = mn->nVModMapKeys;
+                   XkbNoteMapChanges(&xkbi->changes,mev,XKB_XLIB_MAP_MASK);
+                   if (xkbi->changes.changed)
+                       xkbi->flags|= XkbMapPending;
+                   return True;
+               }
+               else if (mn->nKeySyms>0) {
+                   register XMappingEvent *ev = (XMappingEvent *)re;
+                   ev->type = MappingNotify;
+                   ev->serial = _XSetLastRequestRead(dpy,
+                                               (xGenericReply *)event);
+                   ev->send_event = ((event->u.u.type&0x80)!=0);
+                   ev->display = dpy;
+                   ev->window = 0;
+                   ev->first_keycode = mn->firstKeySym;
+                   ev->request = MappingKeyboard;
+                   ev->count = mn->nKeySyms;
+                   _XkbNoteCoreMapChanges(&xkbi->changes,ev,XKB_XLIB_MAP_MASK);
+                   if (xkbi->changes.changed)
+                       xkbi->flags|= XkbMapPending;
+                   return True;
+               }
+           }
+           break;
+       case XkbControlsNotify:
+           {
+               if (xkbi->selected_events&XkbControlsNotifyMask) {
+                   xkbControlsNotify *cn =(xkbControlsNotify *)event;
+                   XkbControlsNotifyEvent *cev;
+                   cev =(XkbControlsNotifyEvent *)re;
+                   cev->type = XkbEventCode+xkbi->codes->first_event;
+                   cev->xkb_type = XkbControlsNotify;
+                   cev->serial = _XSetLastRequestRead(dpy,
+                                               (xGenericReply *)event);
+                   cev->send_event = ((event->u.u.type&0x80)!=0);
+                   cev->display = dpy;
+                   cev->time = cn->time;
+                   cev->device = cn->deviceID;
+                   cev->changed_ctrls =  cn->changedControls;
+                   cev->enabled_ctrls =  cn->enabledControls;
+                   cev->enabled_ctrl_changes = cn->enabledControlChanges;
+                   cev->keycode = cn->keycode;
+                   cev->num_groups = cn->numGroups;
+                   cev->event_type = cn->eventType;
+                   cev->req_major = cn->requestMajor;
+                   cev->req_minor = cn->requestMinor;
+                   return True;
+               }
+           }
+           break;
+       case XkbIndicatorMapNotify:
+           {
+               if (xkbi->selected_events&XkbIndicatorMapNotifyMask) {
+                   xkbIndicatorNotify *in =(xkbIndicatorNotify *)event;
+                   XkbIndicatorNotifyEvent *iev;
+                   iev =(XkbIndicatorNotifyEvent *)re;
+                   iev->type = XkbEventCode+xkbi->codes->first_event;
+                   iev->xkb_type = XkbIndicatorMapNotify;
+                   iev->serial = _XSetLastRequestRead(dpy,
+                                               (xGenericReply *)event);
+                   iev->send_event = ((event->u.u.type&0x80)!=0);
+                   iev->display = dpy;
+                   iev->time = in->time;
+                   iev->device = in->deviceID;
+                   iev->changed =  in->changed;
+                   iev->state=  in->state;
+                   return True;
+               }
+           }
+           break;
+       case XkbIndicatorStateNotify:
+           {
+               if (xkbi->selected_events&XkbIndicatorStateNotifyMask) {
+                   xkbIndicatorNotify *in =(xkbIndicatorNotify *)event;
+                   XkbIndicatorNotifyEvent *iev;
+                   iev =(XkbIndicatorNotifyEvent *)re;
+                   iev->type = XkbEventCode+xkbi->codes->first_event;
+                   iev->xkb_type = XkbIndicatorStateNotify;
+                   iev->serial = _XSetLastRequestRead(dpy,
+                                               (xGenericReply *)event);
+                   iev->send_event = ((event->u.u.type&0x80)!=0);
+                   iev->display = dpy;
+                   iev->time = in->time;
+                   iev->device = in->deviceID;
+                   iev->changed =  in->changed;
+                   iev->state=  in->state;
+                   return True;
+               }
+           }
+           break;
+       case XkbBellNotify:
+           {
+               if (xkbi->selected_events&XkbBellNotifyMask) {
+                   xkbBellNotify *bn =(xkbBellNotify *)event;
+                   XkbBellNotifyEvent *bev;
+                   bev =(XkbBellNotifyEvent *)re;
+                   bev->type = XkbEventCode+xkbi->codes->first_event;
+                   bev->xkb_type = XkbBellNotify;
+                   bev->serial = _XSetLastRequestRead(dpy,
+                                               (xGenericReply *)event);
+                   bev->send_event = ((event->u.u.type&0x80)!=0);
+                   bev->display = dpy;
+                   bev->time = bn->time;
+                   bev->device = bn->deviceID;
+                   bev->percent = bn->percent;
+                   bev->pitch = bn->pitch;
+                   bev->duration = bn->duration;
+                   bev->bell_class = bn->bellClass;
+                   bev->bell_id = bn->bellID;
+                   bev->name = bn->name;
+                   bev->window = bn->window;
+                   bev->event_only = bn->eventOnly;
+                   return True;
+               }
+           }
+           break;
+       case XkbAccessXNotify:
+           {
+               if (xkbi->selected_events&XkbAccessXNotifyMask) {
+                   xkbAccessXNotify *axn =(xkbAccessXNotify *)event;
+                   XkbAccessXNotifyEvent *axev;
+                   axev =(XkbAccessXNotifyEvent *)re;
+                   axev->type = XkbEventCode+xkbi->codes->first_event;
+                   axev->xkb_type = XkbAccessXNotify;
+                   axev->serial = _XSetLastRequestRead(dpy,
+                                               (xGenericReply *)event);
+                   axev->send_event = ((event->u.u.type&0x80)!=0);
+                   axev->display = dpy;
+                   axev->time = axn->time;
+                   axev->device = axn->deviceID;
+                   axev->detail = axn->detail;
+                   axev->keycode = axn->keycode;
+                   axev->sk_delay = axn->slowKeysDelay;
+                   axev->debounce_delay = axn->debounceDelay;
+                   return True;
+               }
+           }
+           break;
+       case XkbNamesNotify:
+           {
+               if (xkbi->selected_events&XkbNamesNotifyMask) {
+                   xkbNamesNotify *nn =(xkbNamesNotify *)event;
+                   XkbNamesNotifyEvent *nev;
+                   nev =(XkbNamesNotifyEvent *)re;
+                   nev->type = XkbEventCode+xkbi->codes->first_event;
+                   nev->xkb_type = XkbNamesNotify;
+                   nev->serial = _XSetLastRequestRead(dpy,
+                                               (xGenericReply *)event);
+                   nev->send_event = ((event->u.u.type&0x80)!=0);
+                   nev->display = dpy;
+                   nev->time = nn->time;
+                   nev->device = nn->deviceID;
+                   nev->changed = nn->changed;
+                   nev->first_type = nn->firstType;
+                   nev->num_types = nn->nTypes;
+                   nev->first_lvl = nn->firstLevelName;
+                   nev->num_lvls = nn->nLevelNames;
+                   nev->num_aliases = nn->nAliases;
+                   nev->num_radio_groups = nn->nRadioGroups;
+                   nev->changed_vmods = nn->changedVirtualMods;
+                   nev->changed_groups = nn->changedGroupNames;
+                   nev->changed_indicators = nn->changedIndicators;
+                   nev->first_key = nn->firstKey;
+                   nev->num_keys = nn->nKeys;
+                   return True;
+               }
+           }
+           break;
+       case XkbCompatMapNotify:
+           {
+               if (xkbi->selected_events&XkbCompatMapNotifyMask) {
+                   xkbCompatMapNotify *cmn =(xkbCompatMapNotify *)event;
+                   XkbCompatMapNotifyEvent *cmev;
+                   cmev =(XkbCompatMapNotifyEvent *)re;
+                   cmev->type = XkbEventCode+xkbi->codes->first_event;
+                   cmev->xkb_type = XkbCompatMapNotify;
+                   cmev->serial = _XSetLastRequestRead(dpy,
+                                               (xGenericReply *)event);
+                   cmev->send_event = ((event->u.u.type&0x80)!=0);
+                   cmev->display = dpy;
+                   cmev->time = cmn->time;
+                   cmev->device = cmn->deviceID;
+                   cmev->changed_groups = cmn->changedGroups;
+                   cmev->first_si = cmn->firstSI;
+                   cmev->num_si = cmn->nSI;
+                   cmev->num_total_si = cmn->nTotalSI;
+                   return True;
+               }
+           }
+           break;
+       case XkbActionMessage:
+           {
+               if (xkbi->selected_events&XkbActionMessageMask) {
+                   xkbActionMessage *am= (xkbActionMessage *)event;
+                   XkbActionMessageEvent *amev;
+                   amev= (XkbActionMessageEvent *)re;
+                   amev->type = XkbEventCode+xkbi->codes->first_event;
+                   amev->xkb_type = XkbActionMessage;
+                   amev->serial = _XSetLastRequestRead(dpy,
+                                               (xGenericReply *)event);
+                   amev->send_event = ((event->u.u.type&0x80)!=0);
+                   amev->display = dpy;
+                   amev->time = am->time;
+                   amev->device = am->deviceID;
+                   amev->keycode = am->keycode;
+                   amev->press = am->press;
+                   amev->key_event_follows = am->keyEventFollows;
+                   amev->group = am->group;
+                   amev->mods = am->mods;
+                   memcpy(amev->message,am->message,XkbActionMessageLength);
+                   amev->message[XkbActionMessageLength]= '\0';
+                   return True;
+               }
+           }
+           break;
+       case XkbExtensionDeviceNotify:
+           {
+               if (xkbi->selected_events&XkbExtensionDeviceNotifyMask) {
+                   xkbExtensionDeviceNotify *ed=
+                                       (xkbExtensionDeviceNotify *)event;
+                   XkbExtensionDeviceNotifyEvent *edev;
+                   edev= (XkbExtensionDeviceNotifyEvent *)re;
+                   edev->type= XkbEventCode+xkbi->codes->first_event;
+                   edev->xkb_type= XkbExtensionDeviceNotify;
+                   edev->serial= _XSetLastRequestRead(dpy,
+                                               (xGenericReply *)event);
+                   edev->send_event= ((event->u.u.type&0x80)!=0);
+                   edev->display= dpy;
+                   edev->time= ed->time;
+                   edev->device= ed->deviceID;
+                   edev->led_class= ed->ledClass;
+                   edev->led_id= ed->ledID;
+                   edev->reason= ed->reason;
+                   edev->supported= ed->supported;
+                   edev->leds_defined= ed->ledsDefined;
+                   edev->led_state= ed->ledState;
+                   edev->first_btn= ed->firstBtn;
+                   edev->num_btns= ed->nBtns;
+                   edev->unsupported= ed->unsupported;
+                   return True;
+               }
+           }
+           break;
+       case XkbNewKeyboardNotify:
+           {
+               xkbNewKeyboardNotify *nkn = (xkbNewKeyboardNotify *)event;
+               if ((xkbi->selected_events&XkbNewKeyboardNotifyMask)&&
+                                   (xkbi->selected_nkn_details&nkn->changed)) {
+                   XkbNewKeyboardNotifyEvent *nkev;
+                   nkev =(XkbNewKeyboardNotifyEvent *)re;
+                   nkev->type = XkbEventCode+xkbi->codes->first_event;
+                   nkev->xkb_type = XkbNewKeyboardNotify;
+                   nkev->serial = _XSetLastRequestRead(dpy,
+                                               (xGenericReply *)event);
+                   nkev->send_event = ((event->u.u.type&0x80)!=0);
+                   nkev->display = dpy;
+                   nkev->time = nkn->time;
+                   nkev->device = nkn->deviceID;
+                   nkev->old_device = nkn->oldDeviceID;
+                   nkev->min_key_code = nkn->minKeyCode;
+                   nkev->max_key_code = nkn->maxKeyCode;
+                   nkev->old_min_key_code = nkn->oldMinKeyCode;
+                   nkev->old_max_key_code = nkn->oldMaxKeyCode;
+                   nkev->req_major = nkn->requestMajor;
+                   nkev->req_minor = nkn->requestMinor;
+                   nkev->changed = nkn->changed;
+                   if ((xkbi->desc)&&(nkev->send_event==0)&&
+                       ((xkbi->desc->device_spec==nkev->old_device)||
+                        (nkev->device!=nkev->old_device))) {
+                       xkbi->flags= XkbMapPending|XkbXlibNewKeyboard;
+                   }
+                   return True;
+               }
+               else if(nkn->changed&(XkbNKN_KeycodesMask|XkbNKN_DeviceIDMask)){
+                   register XMappingEvent *ev = (XMappingEvent *)re;
+                   ev->type = MappingNotify;
+                   ev->serial = _XSetLastRequestRead(dpy,
+                                               (xGenericReply *)event);
+                   ev->send_event = ((event->u.u.type&0x80)!=0);
+                   ev->display = dpy;
+                   ev->window = 0;
+                   ev->first_keycode = dpy->min_keycode;
+                   ev->request = MappingKeyboard;
+                   ev->count = (dpy->max_keycode-dpy->min_keycode)+1;
+                   if ((xkbi->desc)&&(ev->send_event==0)&&
+                       ((xkbi->desc->device_spec==nkn->oldDeviceID)||
+                        (nkn->deviceID!=nkn->oldDeviceID))) {
+                       xkbi->flags|= XkbMapPending|XkbXlibNewKeyboard;
+                   }
+                   return True;
+               }
+           }
+           break;
+       default:
+#ifdef DEBUG
+           fprintf(stderr,"Got unknown XKEYBOARD event (%d, base=%d)\n",
+                                               re->type,
+                                               xkbi->codes->first_event);
+#endif
+           break;
+    }
+    return False;
+}
+
+Bool
+XkbIgnoreExtension(Bool ignore)
+{
+    if (getenv("XKB_FORCE")!=NULL) {
+#ifdef DEBUG
+       fprintf(stderr,"Forcing use of XKEYBOARD (overriding an IgnoreExtensions)\n");
+#endif
+       return False;
+    }
+#ifdef DEBUG
+    else if (getenv("XKB_DEBUG")!=NULL) {
+       fprintf(stderr,"Explicitly %signoring XKEYBOARD\n",ignore?"":"not ");
+    }
+#endif
+    _XkbIgnoreExtension = ignore;
+    return True;
+}
+
+static void
+_XkbFreeInfo(Display *dpy)
+{
+    XkbInfoPtr xkbi = dpy->xkb_info;
+    if (xkbi) {
+       if (xkbi->desc)
+           XkbFreeKeyboard(xkbi->desc,XkbAllComponentsMask,True);
+       Xfree(xkbi);
+      }
+}
+
+Bool
+XkbUseExtension(Display *dpy,int *major_rtrn,int *minor_rtrn)
+{
+    xkbUseExtensionReply rep;
+    register xkbUseExtensionReq *req;
+    XExtCodes          *codes;
+    int        ev_base,forceIgnore;
+    XkbInfoPtr xkbi;
+    char *     str;
+    static int debugMsg;
+    static int been_here= 0;
+
+    if ( dpy->xkb_info && !(dpy->flags & XlibDisplayNoXkb)) {
+       if (major_rtrn) *major_rtrn= dpy->xkb_info->srv_major;
+       if (minor_rtrn) *minor_rtrn= dpy->xkb_info->srv_minor;
+       return True;
+    }
+    if (!been_here) {
+       debugMsg= (getenv("XKB_DEBUG")!=NULL);
+       been_here= 1;
+    }
+
+    if (major_rtrn)    *major_rtrn= 0;
+    if (minor_rtrn)    *minor_rtrn= 0;
+
+    if (!dpy->xkb_info) {
+        xkbi = _XkbTypedCalloc(1, XkbInfoRec);
+        if ( !xkbi )
+           return False;
+        dpy->xkb_info = xkbi;
+        dpy->free_funcs->xkb = _XkbFreeInfo;
+
+        xkbi->xlib_ctrls|= (XkbLC_ControlFallback|XkbLC_ConsumeLookupMods);
+        if ((str=getenv("_XKB_OPTIONS_ENABLE"))!=NULL) {
+           if ((str=getenv("_XKB_LATIN1_LOOKUP"))!=NULL) {
+               if ((strcmp(str,"off")==0)||(strcmp(str,"0")==0))
+                    xkbi->xlib_ctrls&= ~XkbLC_ForceLatin1Lookup;
+               else xkbi->xlib_ctrls|= XkbLC_ForceLatin1Lookup;
+           }
+           if ((str=getenv("_XKB_CONSUME_LOOKUP_MODS"))!=NULL) {
+               if ((strcmp(str,"off")==0)||(strcmp(str,"0")==0))
+                    xkbi->xlib_ctrls&= ~XkbLC_ConsumeLookupMods;
+               else xkbi->xlib_ctrls|= XkbLC_ConsumeLookupMods;
+           }
+           if ((str=getenv("_XKB_CONSUME_SHIFT_AND_LOCK"))!=NULL) {
+               if ((strcmp(str,"off")==0)||(strcmp(str,"0")==0))
+                    xkbi->xlib_ctrls&= ~XkbLC_AlwaysConsumeShiftAndLock;
+               else xkbi->xlib_ctrls|= XkbLC_AlwaysConsumeShiftAndLock;
+           }
+           if ((str=getenv("_XKB_IGNORE_NEW_KEYBOARDS"))!=NULL) {
+               if ((strcmp(str,"off")==0)||(strcmp(str,"0")==0))
+                    xkbi->xlib_ctrls&= ~XkbLC_IgnoreNewKeyboards;
+               else xkbi->xlib_ctrls|= XkbLC_IgnoreNewKeyboards;
+           }
+           if ((str=getenv("_XKB_CONTROL_FALLBACK"))!=NULL) {
+               if ((strcmp(str,"off")==0)||(strcmp(str,"0")==0))
+                    xkbi->xlib_ctrls&= ~XkbLC_ControlFallback;
+               else xkbi->xlib_ctrls|= XkbLC_ControlFallback;
+           }
+           if ((str=getenv("_XKB_COMP_LED"))!=NULL) {
+               if ((strcmp(str,"off")==0)||(strcmp(str,"0")==0))
+                   xkbi->xlib_ctrls&= ~XkbLC_ComposeLED;
+               else {
+                   xkbi->xlib_ctrls|= XkbLC_ComposeLED;
+                   if (strlen(str)>0)
+                       xkbi->composeLED= XInternAtom(dpy,str,False);
+               }
+           }
+           if ((str=getenv("_XKB_COMP_FAIL_BEEP"))!=NULL) {
+               if ((strcmp(str,"off")==0)||(strcmp(str,"0")==0))
+                    xkbi->xlib_ctrls&= ~XkbLC_BeepOnComposeFail;
+               else xkbi->xlib_ctrls|= XkbLC_BeepOnComposeFail;
+           }
+        }
+        if ((xkbi->composeLED==None)&&((xkbi->xlib_ctrls&XkbLC_ComposeLED)!=0))
+           xkbi->composeLED= XInternAtom(dpy,"Compose",False);
+#ifdef DEBUG
+        if (debugMsg) {
+           register unsigned c= xkbi->xlib_ctrls;
+           fprintf(stderr,"XKEYBOARD compose: beep on failure is %s, LED is %s\n",
+               ((c&XkbLC_BeepOnComposeFail)?"on":"off"),
+               ((c&XkbLC_ComposeLED)?"on":"off"));
+           fprintf(stderr,"XKEYBOARD XLookupString: %slatin-1, %s lookup modifiers\n",
+               ((c&XkbLC_ForceLatin1Lookup)?"allow non-":"force "),
+               ((c&XkbLC_ConsumeLookupMods)?"consume":"re-use"));
+           fprintf(stderr,
+               "XKEYBOARD XLookupString: %sconsume shift and lock, %scontrol fallback\n",
+               ((c&XkbLC_AlwaysConsumeShiftAndLock)?"always ":"don't "),
+               ((c&XkbLC_ControlFallback)?"":"no "));
+
+        }
+#endif
+    } else
+        xkbi = dpy->xkb_info;
+
+    forceIgnore= (dpy->flags&XlibDisplayNoXkb)||dpy->keysyms;
+    forceIgnore= forceIgnore&&(major_rtrn==NULL)&&(minor_rtrn==NULL);
+    if ( forceIgnore || _XkbIgnoreExtension || getenv("XKB_DISABLE")) {
+       LockDisplay(dpy);
+       dpy->flags |= XlibDisplayNoXkb;
+       UnlockDisplay(dpy);
+       if (debugMsg)
+           fprintf(stderr,"XKEYBOARD extension disabled or missing\n");
+       return False;
+    }
+
+    if ( (codes=XInitExtension(dpy,XkbName))==NULL ) {
+       LockDisplay(dpy);
+       dpy->flags |= XlibDisplayNoXkb;
+       UnlockDisplay(dpy);
+       if (debugMsg)
+           fprintf(stderr,"XKEYBOARD extension not present\n");
+       return False;
+    }
+    xkbi->codes = codes;
+    LockDisplay(dpy);
+
+    GetReq(kbUseExtension, req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbUseExtension;
+    req->wantedMajor = XkbMajorVersion;
+    req->wantedMinor = XkbMinorVersion;
+    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse) || !rep.supported ) {
+       Bool    fail;
+       fail= True;
+       if (debugMsg)
+           fprintf(stderr,
+               "XKEYBOARD version mismatch (want %d.%02d, got %d.%02d)\n",
+               XkbMajorVersion,XkbMinorVersion,
+               rep.serverMajor, rep.serverMinor);
+
+       /* pre-release 0.65 is very close to 1.00 */
+       if ((rep.serverMajor==0)&&(rep.serverMinor==65)) {
+           if (debugMsg)
+               fprintf(stderr,"Trying to fall back to version 0.65...");
+           GetReq(kbUseExtension, req);
+           req->reqType = xkbi->codes->major_opcode;
+           req->xkbReqType = X_kbUseExtension;
+           req->wantedMajor = 0;
+           req->wantedMinor = 65;
+           if ( _XReply(dpy, (xReply *)&rep, 0, xFalse) && rep.supported ) {
+               if (debugMsg)
+                   fprintf(stderr,"succeeded\n");
+               fail= False;
+           }
+           else if (debugMsg) fprintf(stderr,"failed\n");
+       }
+       if (fail) {
+           dpy->flags |= XlibDisplayNoXkb;
+           UnlockDisplay(dpy);
+           SyncHandle();
+           if (major_rtrn) *major_rtrn= rep.serverMajor;
+           if (minor_rtrn) *minor_rtrn= rep.serverMinor;
+           return False;
+       }
+    }
+#ifdef DEBUG
+    else if ( forceIgnore ) {
+       fprintf(stderr,"Internal Error!  XkbUseExtension succeeded with forceIgnore set\n");
+    }
+#endif
+    UnlockDisplay(dpy);
+    xkbi->srv_major= rep.serverMajor;
+    xkbi->srv_minor= rep.serverMinor;
+    if (major_rtrn)    *major_rtrn= rep.serverMajor;
+    if (minor_rtrn)    *minor_rtrn= rep.serverMinor;
+    if (debugMsg)
+       fprintf(stderr,"XKEYBOARD (version %d.%02d/%d.%02d) OK!\n",
+                               XkbMajorVersion,XkbMinorVersion,
+                               rep.serverMajor,rep.serverMinor);
+
+    ev_base = codes->first_event;
+    XESetWireToEvent(dpy,ev_base+XkbEventCode,wire_to_event);
+    SyncHandle();
+    return True;
+}
+
diff --git a/src/xkb/XKBleds.c b/src/xkb/XKBleds.c
new file mode 100644 (file)
index 0000000..d9b743c
--- /dev/null
@@ -0,0 +1,333 @@
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+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 Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS 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 NEED_MAP_READERS
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include <X11/extensions/XKBproto.h>
+#include "XKBlibint.h"
+
+Status
+XkbGetIndicatorState(Display *dpy,unsigned deviceSpec,unsigned *pStateRtrn)
+{
+    register xkbGetIndicatorStateReq *req;
+    xkbGetIndicatorStateReply  rep;
+    XkbInfoPtr xkbi;
+    Bool ok;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return BadAccess;
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    GetReq(kbGetIndicatorState, req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbGetIndicatorState;
+    req->deviceSpec = deviceSpec;
+    ok=_XReply(dpy, (xReply *)&rep, 0, xFalse);
+    if (ok && (pStateRtrn!=NULL))
+       *pStateRtrn= rep.state;
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return (ok?Success:BadImplementation);
+}
+
+Status
+_XkbReadGetIndicatorMapReply(  Display *                       dpy,
+                               xkbGetIndicatorMapReply *       rep,
+                               XkbDescPtr                      xkb,
+                               int     *                       nread_rtrn)
+{
+XkbIndicatorPtr                leds;
+XkbReadBufferRec       buf;
+
+    if ((!xkb->indicators)&&(XkbAllocIndicatorMaps(xkb)!=Success))
+       return BadAlloc;
+    leds= xkb->indicators;
+
+    leds->phys_indicators = rep->realIndicators;
+    if (rep->length>0) {
+       register int left;
+       if (!_XkbInitReadBuffer(dpy,&buf,(int)rep->length*4))
+           return BadAlloc;
+       if (nread_rtrn)
+           *nread_rtrn= (int)rep->length*4;
+       if (rep->which) {
+           register int i,bit;
+           left= (int)rep->which;
+           for (i=0,bit=1;(i<XkbNumIndicators)&&(left);i++,bit<<=1) {
+               if (left&bit) {
+                   xkbIndicatorMapWireDesc *wire;
+                   wire= (xkbIndicatorMapWireDesc *)
+                         _XkbGetReadBufferPtr(&buf,
+                                       SIZEOF(xkbIndicatorMapWireDesc));
+                   if (wire==NULL) {
+                       _XkbFreeReadBuffer(&buf);
+                       return BadAlloc;
+                   }
+                   leds->maps[i].flags= wire->flags;
+                   leds->maps[i].which_groups= wire->whichGroups;
+                   leds->maps[i].groups= wire->groups;
+                   leds->maps[i].which_mods= wire->whichMods;
+                   leds->maps[i].mods.mask= wire->mods;
+                   leds->maps[i].mods.real_mods= wire->realMods;
+                   leds->maps[i].mods.vmods= wire->virtualMods;
+                   leds->maps[i].ctrls= wire->ctrls;
+                   left&= ~bit;
+               }
+           }
+       }
+       left= _XkbFreeReadBuffer(&buf);
+    }
+    return Success;
+}
+
+Bool
+XkbGetIndicatorMap(Display *dpy,unsigned long which,XkbDescPtr xkb)
+{
+    register xkbGetIndicatorMapReq *   req;
+    xkbGetIndicatorMapReply            rep;
+    XkbInfoPtr                                 xkbi;
+    Status                             status;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return BadAccess;
+    if ((!which)||(!xkb))
+       return BadValue;
+
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    if (!xkb->indicators) {
+       xkb->indicators = _XkbTypedCalloc(1,XkbIndicatorRec);
+       if (!xkb->indicators) {
+           UnlockDisplay(dpy);
+           SyncHandle();
+           return BadAlloc;
+       }
+    }
+    GetReq(kbGetIndicatorMap, req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbGetIndicatorMap;
+    req->deviceSpec = xkb->device_spec;
+    req->which = (CARD32)which;
+    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return BadValue;
+    }
+    status= _XkbReadGetIndicatorMapReply(dpy,&rep,xkb,NULL);
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return status;
+}
+
+Bool
+XkbSetIndicatorMap(Display *dpy,unsigned long which,XkbDescPtr xkb)
+{
+    register xkbSetIndicatorMapReq     *req;
+    register int i,bit;
+    int nMaps;
+    xkbIndicatorMapWireDesc *wire;
+    XkbInfoPtr xkbi;
+
+    if ((dpy->flags & XlibDisplayNoXkb) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return False;
+    if ((!xkb)||(!which)||(!xkb->indicators))
+       return False;
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    GetReq(kbSetIndicatorMap, req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbSetIndicatorMap;
+    req->deviceSpec = xkb->device_spec;
+    req->which = (CARD32)which;
+    for (i=nMaps=0,bit=1;i<32;i++,bit<<=1) {
+       if (which&bit)
+           nMaps++;
+    }
+    req->length+= (nMaps*sizeof(XkbIndicatorMapRec))/4;
+    BufAlloc(xkbIndicatorMapWireDesc *,wire,
+                                      (nMaps*SIZEOF(xkbIndicatorMapWireDesc)));
+    for (i=0,bit=1;i<32;i++,bit<<=1) {
+       if (which&bit) {
+           wire->flags= xkb->indicators->maps[i].flags;
+           wire->whichGroups= xkb->indicators->maps[i].which_groups;
+           wire->groups= xkb->indicators->maps[i].groups;
+           wire->whichMods= xkb->indicators->maps[i].which_mods;
+           wire->mods= xkb->indicators->maps[i].mods.real_mods;
+           wire->virtualMods= xkb->indicators->maps[i].mods.vmods;
+           wire->ctrls= xkb->indicators->maps[i].ctrls;
+           wire++;
+       }
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return True;
+}
+
+Bool
+XkbGetNamedDeviceIndicator(    Display *               dpy,
+                               unsigned                device,
+                               unsigned                class,
+                               unsigned                id,
+                               Atom                    name,
+                               int     *               pNdxRtrn,
+                               Bool *                  pStateRtrn,
+                               XkbIndicatorMapPtr      pMapRtrn,
+                               Bool *                  pRealRtrn)
+{
+    register xkbGetNamedIndicatorReq *req;
+    xkbGetNamedIndicatorReply  rep;
+    XkbInfoPtr xkbi;
+
+    if ((dpy->flags & XlibDisplayNoXkb) || (name==None) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return False;
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    GetReq(kbGetNamedIndicator, req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbGetNamedIndicator;
+    req->deviceSpec = device;
+    req->ledClass = class;
+    req->ledID = id;
+    req->indicator = (CARD32)name;
+    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
+       UnlockDisplay(dpy);
+       SyncHandle();
+       return False;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    if ((!rep.found)||(!rep.supported))
+       return False;
+    if (pNdxRtrn!=NULL)
+       *pNdxRtrn= rep.ndx;
+    if (pStateRtrn!=NULL)
+       *pStateRtrn= rep.on;
+    if (pMapRtrn!=NULL) {
+       pMapRtrn->flags= rep.flags;
+       pMapRtrn->which_groups= rep.whichGroups;
+       pMapRtrn->groups= rep.groups;
+       pMapRtrn->which_mods= rep.whichMods;
+       pMapRtrn->mods.mask= rep.mods;
+       pMapRtrn->mods.real_mods= rep.realMods;
+       pMapRtrn->mods.vmods= rep.virtualMods;
+       pMapRtrn->ctrls= rep.ctrls;
+    }
+    if (pRealRtrn!=NULL)
+       *pRealRtrn= rep.realIndicator;
+    return True;
+}
+
+Bool
+XkbGetNamedIndicator(  Display *               dpy,
+                       Atom                    name,
+                       int     *               pNdxRtrn,
+                       Bool *                  pStateRtrn,
+                       XkbIndicatorMapPtr      pMapRtrn,
+                       Bool *                  pRealRtrn)
+{
+    return XkbGetNamedDeviceIndicator(dpy,XkbUseCoreKbd,
+                                         XkbDfltXIClass,XkbDfltXIId,
+                                         name,pNdxRtrn,pStateRtrn,
+                                         pMapRtrn,pRealRtrn);
+}
+
+Bool
+XkbSetNamedDeviceIndicator(    Display *               dpy,
+                               unsigned                device,
+                               unsigned                class,
+                               unsigned                id,
+                               Atom                    name,
+                               Bool                    changeState,
+                               Bool                    state,
+                               Bool                    createNewMap,
+                               XkbIndicatorMapPtr      pMap)
+{
+    register xkbSetNamedIndicatorReq   *req;
+    XkbInfoPtr xkbi;
+
+    if ((dpy->flags & XlibDisplayNoXkb) || (name==None) ||
+       (!dpy->xkb_info && !XkbUseExtension(dpy,NULL,NULL)))
+       return False;
+    LockDisplay(dpy);
+    xkbi = dpy->xkb_info;
+    GetReq(kbSetNamedIndicator, req);
+    req->reqType = xkbi->codes->major_opcode;
+    req->xkbReqType = X_kbSetNamedIndicator;
+    req->deviceSpec = device;
+    req->ledClass = class;
+    req->ledID = id;
+    req->indicator= (CARD32)name;
+    req->setState= changeState;
+    if (req->setState)
+        req->on= state;
+    else req->on= False;
+    if (pMap!=NULL) {
+       req->setMap= True;
+       req->createMap= createNewMap;
+       req->flags= pMap->flags;
+       req->whichGroups= pMap->which_groups;
+       req->groups= pMap->groups;
+       req->whichMods= pMap->which_mods;
+       req->realMods= pMap->mods.real_mods;
+       req->virtualMods= pMap->mods.vmods;
+       req->ctrls= pMap->ctrls;
+    }
+    else {
+       req->setMap=            False;
+       req->createMap=         False;
+       req->flags=             0;
+       req->whichGroups=       0;
+       req->groups=            0;
+       req->whichMods=         0;
+       req->realMods=          0;
+       req->virtualMods=       0;
+       req->ctrls=             0;
+    }
+    UnlockDisplay(dpy);
+    SyncHandle();
+    return True;
+}
+
+Bool
+XkbSetNamedIndicator(  Display *               dpy,
+                       Atom                    name,
+                       Bool                    changeState,
+                       Bool                    state,
+                       Bool                    createNewMap,
+                       XkbIndicatorMapPtr      pMap)
+{
+    return XkbSetNamedDeviceIndicator(dpy,XkbUseCoreKbd,
+                                         XkbDfltXIClass,XkbDfltXIId,
+                                         name,changeState,state,
+                                         createNewMap,pMap);
+}
diff --git a/src/xkb/XKBlibint.h b/src/xkb/XKBlibint.h
new file mode 100644 (file)
index 0000000..ce14527
--- /dev/null
@@ -0,0 +1,343 @@
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+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 Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS 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 _XKBLIBINT_H_
+#define        _XKBLIBINT_H_
+
+#include <X11/Xutil.h>
+#include <X11/XKBlib.h>
+
+#define        XkbMapPending           (1<<0)
+#define        XkbXlibNewKeyboard      (1<<1)
+
+typedef int    (*XkbKSToMBFunc)(
+       XPointer        /* priv */,
+       KeySym          /* sym */,
+       char *          /* buf */,
+       int             /* len */,
+       int *           /* extra_rtrn */
+);
+
+typedef KeySym (*XkbMBToKSFunc)(
+       XPointer        /* priv */,
+       char *          /* buf */,
+       int             /* len */,
+       Status *        /* status */
+);
+
+typedef KeySym (*XkbToUpperFunc)(
+       KeySym          /* sym */
+);
+
+typedef struct _XkbConverters {
+       XkbKSToMBFunc    KSToMB;
+       XPointer         KSToMBPriv;
+       XkbMBToKSFunc    MBToKS;
+       XPointer         MBToKSPriv;
+       XkbToUpperFunc   KSToUpper;
+} XkbConverters;
+
+extern XkbInternAtomFunc       _XkbInternAtomFunc;
+extern XkbGetAtomNameFunc      _XkbGetAtomNameFunc;
+
+typedef struct _XkbInfoRec {
+       unsigned         flags;
+       unsigned         xlib_ctrls;
+       XExtCodes        *codes;
+       int              srv_major;
+       int              srv_minor;
+       unsigned         selected_events;
+       unsigned short   selected_nkn_details;
+       unsigned short   selected_map_details;
+       XkbDescRec      *desc;
+       XkbMapChangesRec changes;
+       Atom             composeLED;
+       XkbConverters    cvt;
+       XkbConverters    latin1cvt;
+} XkbInfoRec, *XkbInfoPtr;
+
+
+#define        _XkbUnavailable(d) \
+       (((d)->flags&XlibDisplayNoXkb) ||\
+        ((!(d)->xkb_info || (!(d)->xkb_info->desc)) && !_XkbLoadDpy(d)))
+
+#define        _XkbCheckPendingRefresh(d,xi) {\
+    if ((xi)->flags&XkbXlibNewKeyboard)\
+       _XkbReloadDpy((d));\
+    else if ((xi)->flags&XkbMapPending) {\
+       if (XkbGetMapChanges((d),(xi)->desc, &(xi)->changes)==Success) {\
+           LockDisplay((d));\
+           (xi)->changes.changed= 0;\
+           UnlockDisplay((d));\
+       }\
+    }\
+}
+
+#define        _XkbNeedModmap(i)    ((!(i)->desc->map)||(!(i)->desc->map->modmap))
+
+       /*
+        * mask of the events that the "invisible" XKB support in Xlib needs
+        */
+#define XKB_XLIB_MAP_MASK (XkbAllClientInfoMask)
+
+       /*
+        * Handy helper macros
+        */
+#define        XKB_INSURE_SIZE(f,t,nNum,oNum)  {\
+       if ((f)==NULL)  \
+            (f)=(t *)Xmalloc(sizeof(t)*(nNum));\
+       else if ((nNum)<(oNum))\
+            (f)=(t *)Xrealloc((f),sizeof(t)*(nNum));\
+       }
+
+typedef struct _XkbReadBuffer {
+       int      error;
+       int      size;
+       char    *start;
+       char    *data;
+} XkbReadBufferRec,*XkbReadBufferPtr;
+
+#define        _XkbAlloc(s)            Xmalloc((s))
+#define        _XkbCalloc(n,s)         Xcalloc((n),(s))
+#define        _XkbRealloc(o,s)        Xrealloc((o),(s))
+#define        _XkbTypedAlloc(t)       ((t *)Xmalloc(sizeof(t)))
+#define        _XkbTypedCalloc(n,t)    ((t *)Xcalloc((n),sizeof(t)))
+#define        _XkbTypedRealloc(o,n,t) \
+       ((o)?(t *)Xrealloc((o),(n)*sizeof(t)):_XkbTypedCalloc(n,t))
+#define        _XkbClearElems(a,f,l,t) bzero(&(a)[f],((l)-(f)+1)*sizeof(t))
+#define        _XkbFree(p)             Xfree(p)
+
+_XFUNCPROTOBEGIN
+
+extern void _XkbReloadDpy(
+    Display *          /* dpy */
+);
+
+extern KeySym _XKeycodeToKeysym(
+    Display*           /* display */,
+#if NeedWidePrototypes
+    unsigned int       /* keycode */,
+#else
+    KeyCode            /* keycode */,
+#endif
+    int                        /* index */
+);
+
+extern KeyCode _XKeysymToKeycode(
+    Display*           /* display */,
+    KeySym             /* keysym */
+);
+
+extern KeySym _XLookupKeysym(
+    XKeyEvent*         /* key_event */,
+    int                        /* index */
+);
+
+extern int _XRefreshKeyboardMapping(
+    XMappingEvent*     /* event_map */
+);
+
+extern unsigned        _XKeysymToModifiers(
+    Display *          /* dpy */,
+    KeySym             /* ks */
+);
+
+extern int _XTranslateKey(
+    register Display * /* dpy */,
+    KeyCode            /* keycode */,
+    register unsigned int /* modifiers */,
+    unsigned int *     /* modifiers_return */,
+    KeySym *           /* keysym_return */
+);
+
+extern int     _XTranslateKeySym(
+    Display *          /* dpy */,
+    register KeySym    /* symbol */,
+    unsigned int       /* modifiers */,
+    char *             /* buffer */,
+    int                /* nbytes */
+);
+
+extern int _XLookupString(
+    register XKeyEvent *       /* event */,
+    char *                     /* buffer */,
+    int                        /* nbytes */,
+    KeySym *                   /* keysym */,
+    XComposeStatus *           /* status */
+);
+
+extern void _XkbNoteCoreMapChanges(
+    XkbMapChangesRec *                 /* old */,
+    XMappingEvent *            /* new */,
+    unsigned int               /* wanted */
+);
+
+extern int _XkbInitReadBuffer(
+    Display *          /* dpy */,
+    XkbReadBufferPtr   /* buf */,
+    int                        /* size */
+);
+
+extern int _XkbSkipReadBufferData(
+    XkbReadBufferPtr   /* from */,
+    int                        /* size */
+);
+
+extern int _XkbCopyFromReadBuffer(
+    XkbReadBufferPtr   /* from */,
+    char *             /* to */,
+    int                        /* size */
+);
+
+
+#if defined(WORD64) || defined(LONG64)
+extern int _XkbReadCopyData32(
+    int *              /* from */,
+    long *             /* to */,
+    int                        /* num_words */
+);
+
+extern int _XkbWriteCopyData32(
+    unsigned long *    /* from */,
+    CARD32 *           /* to */,
+    int                        /* num_words */
+);
+
+extern int _XkbReadBufferCopy32(
+    XkbReadBufferPtr   /* from */,
+    long *             /* to */,
+    int                        /* size */
+);
+#else
+#define        _XkbReadCopyData32(f,t,s)    memcpy((char *)(t),(char *)(f),(s)*4)
+#define        _XkbWriteCopyData32(f,t,s)   memcpy((char *)(t),(char *)(f),(s)*4)
+#define        _XkbReadBufferCopy32(f,t,s) _XkbCopyFromReadBuffer(f,(char *)t,(s)*4)
+#endif
+
+#ifndef NO_DEC_BINARY_COMPATIBILITY
+#define XKB_FORCE_INT_KEYSYM 1
+#endif
+
+#ifdef XKB_FORCE_INT_KEYSYM
+extern int _XkbReadCopyKeySyms(
+    int *              /* from */,
+    KeySym *           /* to */,
+    int                        /* num_words */
+);
+
+extern int _XkbWriteCopyKeySyms(
+    KeySym *           /* from */,
+    CARD32 *           /* to */,
+    int                        /* num_words */
+);
+
+extern int _XkbReadBufferCopyKeySyms(
+    XkbReadBufferPtr   /* from */,
+#ifndef NO_DEC_BUG_FIX
+    KeySym *           /* to */,
+#else
+    long *             /* to */,
+#endif
+    int                        /* size */
+);
+#else
+#define        _XkbReadCopyKeySyms(f,t,n)              _XkbReadCopyData32(f,t,n)
+#define        _XkbWriteCopyKeySyms(f,t,n)             _XkbWriteCopyData32(f,t,n)
+#define        _XkbReadBufferCopyKeySyms(f,t,s)        _XkbReadBufferCopy32(f,t,s)
+#endif
+
+extern char *_XkbPeekAtReadBuffer(
+    XkbReadBufferPtr   /* from */,
+    int                        /*  size */
+);
+
+extern char *_XkbGetReadBufferPtr(
+    XkbReadBufferPtr   /* from */,
+    int                        /* size */
+);
+#define        _XkbGetTypedRdBufPtr(b,n,t) ((t *)_XkbGetReadBufferPtr(b,(n)*SIZEOF(t)))
+
+extern int _XkbFreeReadBuffer(
+    XkbReadBufferPtr   /* buf */
+);
+
+extern Bool
+_XkbGetReadBufferCountedString(
+    XkbReadBufferPtr   /* buf */,
+    char **            /* rtrn */
+);
+
+extern char    *_XkbGetCharset(
+    void
+);
+
+extern int      _XkbGetConverters(
+    const char *       /* encoding_name */,
+    XkbConverters *    /* cvt_rtrn */
+);
+
+#ifdef NEED_MAP_READERS
+
+extern Status  _XkbReadGetMapReply(
+    Display *          /* dpy */,
+    xkbGetMapReply *   /* rep */,
+    XkbDescRec *       /* xkb */,
+    int *              /* nread_rtrn */
+);
+
+extern Status  _XkbReadGetCompatMapReply(
+    Display *                  /* dpy */,
+    xkbGetCompatMapReply *     /* rep */,
+    XkbDescPtr                 /* xkb */,
+    int        *                       /* nread_rtrn */
+);
+
+extern Status  _XkbReadGetIndicatorMapReply(
+    Display *                  /* dpy */,
+    xkbGetIndicatorMapReply *  /* rep */,
+    XkbDescPtr                 /* xkb */,
+    int        *                       /* nread_rtrn */
+);
+
+extern Status  _XkbReadGetNamesReply(
+    Display *                  /* dpy */,
+    xkbGetNamesReply *         /* rep */,
+    XkbDescPtr                         /* xkb */,
+    int *                      /* nread_rtrn */
+);
+
+extern Status  _XkbReadGetGeometryReply(
+    Display *                  /* dpy */,
+    xkbGetGeometryReply *      /* rep */,
+    XkbDescPtr                         /* xkb */,
+    int *                      /* nread_rtrn */
+);
+
+#endif
+
+_XFUNCPROTOEND
+
+#endif /* _XKBLIBINT_H_ */
diff --git a/src/xlibi18n/ICWrap.c b/src/xlibi18n/ICWrap.c
new file mode 100644 (file)
index 0000000..1eacfa5
--- /dev/null
@@ -0,0 +1,429 @@
+/*
+ * Copyright 1990, 1991 by OMRON Corporation, NTT Software Corporation,
+ *                      and Nippon Telegraph and Telephone Corporation
+ * Copyright 1991 by the Open Software Foundation
+ * Copyright 1993 by the FUJITSU LIMITED
+ *
+ * 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 names of OMRON, NTT Software, NTT, and
+ * Open Software Foundation not be used in advertising or publicity
+ * pertaining to distribution of the software without specific,
+ * written prior permission. OMRON, NTT Software, NTT, and Open Software
+ * Foundation make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *
+ * OMRON, NTT SOFTWARE, NTT, AND OPEN SOFTWARE FOUNDATION
+ * DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT
+ * SHALL OMRON, NTT SOFTWARE, NTT, OR OPEN SOFTWARE FOUNDATION 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.
+ *
+ *     Authors: Li Yuhong              OMRON Corporation
+ *              Tatsuya Kato           NTT Software Corporation
+ *              Hiroshi Kuribayashi    OMRON Coproration
+ *              Muneiyoshi Suzuki      Nippon Telegraph and Telephone Co.
+ *
+ *              M. Collins             OSF
+ *              Takashi Fujiwara       FUJITSU LIMITED
+ */
+/*
+
+Copyright 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.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xlcint.h"
+
+static int
+_XIMNestedListToNestedList(
+    XIMArg *nlist,   /* This is the new list */
+    XIMArg *list)    /* The original list */
+{
+    register XIMArg *ptr = list;
+
+    while (ptr->name) {
+       if (!strcmp(ptr->name, XNVaNestedList)) {
+           nlist += _XIMNestedListToNestedList(nlist, (XIMArg *)ptr->value);
+       } else {
+           nlist->name = ptr->name;
+           nlist->value = ptr->value;
+           ptr++;
+           nlist++;
+       }
+    }
+    return ptr - list;
+}
+
+static void
+_XIMCountNestedList(
+    XIMArg *args,
+    int *total_count)
+{
+    for (; args->name; args++) {
+       if (!strcmp(args->name, XNVaNestedList))
+           _XIMCountNestedList((XIMArg *)args->value, total_count);
+       else
+           ++(*total_count);
+    }
+}
+
+static void
+_XIMCountVaList(va_list var, int *total_count)
+{
+    char *attr;
+
+    *total_count = 0;
+
+    for (attr = va_arg(var, char*); attr; attr = va_arg(var, char*)) {
+       if (!strcmp(attr, XNVaNestedList)) {
+           _XIMCountNestedList(va_arg(var, XIMArg*), total_count);
+       } else {
+           (void)va_arg(var, XIMArg*);
+           ++(*total_count);
+       }
+    }
+}
+
+static void
+_XIMVaToNestedList(va_list var, int max_count, XIMArg **args_return)
+{
+    XIMArg *args;
+    char   *attr;
+
+    if (max_count <= 0) {
+       *args_return = (XIMArg *)NULL;
+       return;
+    }
+
+    args = (XIMArg *)Xmalloc((unsigned)(max_count + 1) * sizeof(XIMArg));
+    *args_return = args;
+    if (!args) return;
+
+    for (attr = va_arg(var, char*); attr; attr = va_arg(var, char*)) {
+       if (!strcmp(attr, XNVaNestedList)) {
+           args += _XIMNestedListToNestedList(args, va_arg(var, XIMArg*));
+       } else {
+           args->name = attr;
+           args->value = va_arg(var, XPointer);
+           args++;
+       }
+    }
+    args->name = (char*)NULL;
+}
+
+/*ARGSUSED*/
+XVaNestedList
+XVaCreateNestedList(int dummy, ...)
+{
+    va_list            var;
+    XIMArg             *args = NULL;
+    int                        total_count;
+
+    va_start(var, dummy);
+    _XIMCountVaList(var, &total_count);
+    va_end(var);
+
+    va_start(var, dummy);
+    _XIMVaToNestedList(var, total_count, &args);
+    va_end(var);
+
+    return (XVaNestedList)args;
+}
+
+char *
+XSetIMValues(XIM im, ...)
+{
+    va_list var;
+    int     total_count;
+    XIMArg *args;
+    char   *ret;
+
+    /*
+     * so count the stuff dangling here
+     */
+    va_start(var, im);
+    _XIMCountVaList(var, &total_count);
+    va_end(var);
+
+    /*
+     * now package it up so we can send it along
+     */
+    va_start(var, im);
+    _XIMVaToNestedList(var, total_count, &args);
+    va_end(var);
+
+    ret = (*im->methods->set_values) (im, args);
+    if (args) Xfree((char *)args);
+    return ret;
+}
+
+char *
+XGetIMValues(XIM im, ...)
+{
+    va_list var;
+    int     total_count;
+    XIMArg *args;
+    char   *ret;
+
+    /*
+     * so count the stuff dangling here
+     */
+    va_start(var, im);
+    _XIMCountVaList(var, &total_count);
+    va_end(var);
+
+    /*
+     * now package it up so we can send it along
+     */
+    va_start(var, im);
+    _XIMVaToNestedList(var, total_count, &args);
+    va_end(var);
+
+    ret = (*im->methods->get_values) (im, args);
+    if (args) Xfree((char *)args);
+    return ret;
+}
+
+/*
+ * Create an input context within the input method,
+ * and return a pointer to the input context.
+ */
+
+XIC
+XCreateIC(XIM im, ...)
+{
+    va_list var;
+    int     total_count;
+    XIMArg *args;
+    XIC     ic;
+
+    /*
+     * so count the stuff dangling here
+     */
+    va_start(var, im);
+    _XIMCountVaList(var, &total_count);
+    va_end(var);
+
+    /*
+     * now package it up so we can send it along
+     */
+    va_start(var, im);
+    _XIMVaToNestedList(var, total_count, &args);
+    va_end(var);
+
+    ic = (XIC) (*im->methods->create_ic) (im, args);
+    if (args) Xfree((char *)args);
+    if (ic) {
+       ic->core.next = im->core.ic_chain;
+       im->core.ic_chain = ic;
+    }
+    return ic;
+}
+
+/*
+ * Free the input context.
+ */
+void
+XDestroyIC(XIC ic)
+{
+    XIM im = ic->core.im;
+    XIC *prev;
+
+    (*ic->methods->destroy) (ic);
+    if (im) {
+       for (prev = &im->core.ic_chain; *prev; prev = &(*prev)->core.next) {
+           if (*prev == ic) {
+               *prev = ic->core.next;
+               break;
+           }
+       }
+    }
+    Xfree ((char *) ic);
+}
+
+char *
+XGetICValues(XIC ic, ...)
+{
+    va_list var;
+    int     total_count;
+    XIMArg *args;
+    char   *ret;
+
+    if (!ic->core.im)
+       return (char *) NULL;
+
+    /*
+     * so count the stuff dangling here
+     */
+    va_start(var, ic);
+    _XIMCountVaList(var, &total_count);
+    va_end(var);
+
+    /*
+     * now package it up so we can send it along
+     */
+    va_start(var, ic);
+    _XIMVaToNestedList(var, total_count, &args);
+    va_end(var);
+
+    ret = (*ic->methods->get_values) (ic, args);
+    if (args) Xfree((char *)args);
+    return ret;
+}
+
+char *
+XSetICValues(XIC ic, ...)
+{
+    va_list var;
+    int     total_count;
+    XIMArg *args;
+    char   *ret;
+
+    if (!ic->core.im)
+       return (char *) NULL;
+
+    /*
+     * so count the stuff dangling here
+     */
+    va_start(var, ic);
+    _XIMCountVaList(var, &total_count);
+    va_end(var);
+
+    /*
+     * now package it up so we can send it along
+     */
+    va_start(var, ic);
+    _XIMVaToNestedList(var, total_count, &args);
+    va_end(var);
+
+    ret = (*ic->methods->set_values) (ic, args);
+    if (args) Xfree((char *)args);
+    return ret;
+}
+
+/*
+ * Require the input manager to focus the focus window attached to the ic
+ * argument.
+ */
+void
+XSetICFocus(XIC ic)
+{
+  if (ic && ic->core.im)
+      (*ic->methods->set_focus) (ic);
+}
+
+/*
+ * Require the input manager to unfocus the focus window attached to the ic
+ * argument.
+ */
+void
+XUnsetICFocus(XIC ic)
+{
+  if (ic->core.im)
+      (*ic->methods->unset_focus) (ic);
+}
+
+/*
+ * Return the XIM associated with the input context.
+ */
+XIM
+XIMOfIC(XIC ic)
+{
+    return ic->core.im;
+}
+
+char *
+XmbResetIC(XIC ic)
+{
+    if (ic->core.im)
+       return (*ic->methods->mb_reset)(ic);
+    return (char *)NULL;
+}
+
+wchar_t *
+XwcResetIC(XIC ic)
+{
+    if (ic->core.im)
+       return (*ic->methods->wc_reset)(ic);
+    return (wchar_t *)NULL;
+}
+
+char *
+Xutf8ResetIC(XIC ic)
+{
+    if (ic->core.im) {
+       if (ic->methods->utf8_reset)
+           return (*ic->methods->utf8_reset)(ic);
+       else if (ic->methods->mb_reset)
+           return (*ic->methods->mb_reset)(ic);
+    }
+    return (char *)NULL;
+}
+
+int
+XmbLookupString(XIC ic, XKeyEvent *ev, char *buffer, int nbytes,
+               KeySym *keysym, Status *status)
+{
+    if (ic->core.im)
+       return (*ic->methods->mb_lookup_string) (ic, ev, buffer, nbytes,
+                                                keysym, status);
+    return XLookupNone;
+}
+
+int
+XwcLookupString(XIC ic, XKeyEvent *ev, wchar_t *buffer, int nchars,
+               KeySym *keysym, Status *status)
+{
+    if (ic->core.im)
+       return (*ic->methods->wc_lookup_string) (ic, ev, buffer, nchars,
+                                                keysym, status);
+    return XLookupNone;
+}
+
+int
+Xutf8LookupString(XIC ic, XKeyEvent *ev, char *buffer, int nbytes,
+                 KeySym *keysym, Status *status)
+{
+    if (ic->core.im) {
+       if (ic->methods->utf8_lookup_string)
+           return (*ic->methods->utf8_lookup_string) (ic, ev, buffer, nbytes,
+                                                       keysym, status);
+       else if (ic->methods->mb_lookup_string)
+           return (*ic->methods->mb_lookup_string) (ic, ev, buffer, nbytes,
+                                                       keysym, status);
+    }
+    return XLookupNone;
+}
diff --git a/src/xlibi18n/IMWrap.c b/src/xlibi18n/IMWrap.c
new file mode 100644 (file)
index 0000000..0f6ed55
--- /dev/null
@@ -0,0 +1,204 @@
+/*
+ * Copyright 1991 by the Open Software Foundation
+ * Copyright 1993, 1994 by the Sony Corporation
+ *
+ * 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 names of Open Software Foundation and
+ * Sony Corporation not be used in advertising or publicity pertaining to
+ * distribution of the software without specific, written prior permission.
+ * Open Software Foundation and Sony Corporation make no
+ * representations about the suitability of this software for any purpose.
+ * It is provided "as is" without express or implied warranty.
+ *
+ * OPEN SOFTWARE FOUNDATION AND SONY CORPORATION DISCLAIM ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL OPEN
+ * SOFTWARE FOUNDATIONN OR SONY CORPORATION 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.
+ *
+ *              M. Collins             OSF
+ *               Makoto Wakamatsu       Sony Corporation
+ */
+/*
+
+Copyright 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.
+
+*/
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xlcint.h"
+
+/*
+ * Compile the resource name. (resource_name ---> xrm_name)
+ */
+void
+_XIMCompileResourceList(XIMResourceList res, unsigned int num_res)
+{
+    register unsigned int count;
+
+    for (count = 0; count < num_res; res++, count++) {
+       res->xrm_name = XrmStringToQuark(res->resource_name);
+    }
+}
+
+void
+_XCopyToArg(XPointer src, XPointer *dst, unsigned int size)
+{
+    if (!*dst) {
+       union {
+           long        longval;
+#ifdef LONG64
+           int         intval;
+#endif
+           short       shortval;
+           char        charval;
+           char*       charptr;
+           XPointer    ptr;
+       } u;
+       if (size <= sizeof(XPointer)) {
+           memcpy((char *)&u, (char *)src, (int)size);
+           if (size == sizeof(long))          *dst = (XPointer)u.longval;
+#ifdef LONG64
+           else if (size == sizeof(int))      *dst = (XPointer)(long)u.intval;
+#endif
+           else if (size == sizeof(short))    *dst = (XPointer)(long)u.shortval;
+           else if (size == sizeof(char))     *dst = (XPointer)(long)u.charval;
+           else if (size == sizeof(char*))    *dst = (XPointer)u.charptr;
+           else if (size == sizeof(XPointer)) *dst = (XPointer)u.ptr;
+           else memcpy( (char*)dst, (char*)src, (int)size );
+       } else {
+           memcpy( (char*)dst, (char*)src, (int)size );
+       }
+    } else {
+       memcpy( (char*)*dst, (char*)src, (int)size );
+    }
+}
+
+/*
+ * Connects to an input method matching current locale specification, creates
+ * a XIM object and return a pointer the newly created XIM back to the caller.
+ */
+
+XIM
+XOpenIM(Display *display, XrmDatabase rdb, char *res_name, char *res_class)
+{
+    XLCd       lcd = _XOpenLC( (char *)NULL );
+
+    if( !lcd )
+       return( (XIM)NULL );
+    return (*lcd->methods->open_im) (lcd, display, rdb, res_name, res_class);
+}
+
+/*
+ * Close the connection to the input manager, and free the XIM structure
+ */
+Status
+XCloseIM(XIM im)
+{
+    Status s;
+    XIC ic;
+    XLCd lcd = im->core.lcd;
+
+    s = (im->methods->close) (im);
+    for (ic = im->core.ic_chain; ic; ic = ic->core.next)
+       ic->core.im = (XIM)NULL;
+    Xfree ((char *) im);
+    _XCloseLC (lcd);
+    return (s);
+}
+
+/*
+ * Return the Display associated with the input method.
+ */
+Display *
+XDisplayOfIM(XIM im)
+{
+    return im->core.display;
+}
+
+/*
+ * Return the Locale associated with the input method.
+ */
+char *
+XLocaleOfIM(XIM im)
+{
+    return im->core.lcd->core->name;
+}
+
+/*
+ * Register to a input method instantiation callback to prepare the
+ * on-demand input method instantiation.
+ */
+Bool
+XRegisterIMInstantiateCallback(
+    Display    *display,
+    XrmDatabase         rdb,
+    char       *res_name,
+    char       *res_class,
+    XIDProc     callback,
+    XPointer    client_data)
+{
+    XLCd       lcd = _XOpenLC( (char *)NULL );
+
+    if( !lcd )
+       return( False );
+    return( (*lcd->methods->register_callback)( lcd, display, rdb, res_name,
+                                               res_class, callback,
+                                               client_data ) );
+}
+
+/*
+ * Unregister to a input method instantiation callback.
+ */
+Bool
+XUnregisterIMInstantiateCallback(
+    Display    *display,
+    XrmDatabase         rdb,
+    char       *res_name,
+    char       *res_class,
+    XIDProc     callback,
+    XPointer    client_data)
+{
+    XLCd       lcd = _XlcCurrentLC();
+
+    if( !lcd )
+       return( False );
+    if( lcd->methods->unregister_callback == NULL )
+       return( False );
+    return( (*lcd->methods->unregister_callback)( lcd, display, rdb, res_name,
+                                                 res_class, callback,
+                                                 client_data ) );
+}
+
diff --git a/src/xlibi18n/Makefile.am b/src/xlibi18n/Makefile.am
new file mode 100644 (file)
index 0000000..853953a
--- /dev/null
@@ -0,0 +1,151 @@
+AM_CPPFLAGS= \
+       -I$(top_srcdir)/include \
+       -I$(top_srcdir)/include/X11 \
+       -I$(top_builddir)/include \
+       -I$(top_builddir)/include/X11 \
+       -I$(top_srcdir)/src/xcms \
+       -I$(top_srcdir)/src/xkb \
+       -I$(top_srcdir)/src/xlibi18n \
+       -I$(top_srcdir)/src \
+       -D_BSD_SOURCE
+
+AM_CFLAGS= \
+       $(X11_CFLAGS) \
+       $(BIGFONT_CFLAGS) \
+       $(XMALLOC_ZERO_CFLAGS) \
+       $(CWARNFLAGS)
+
+noinst_LTLIBRARIES = libi18n.la
+
+
+#
+# Dynamic loading code for i18n modules
+#
+if XLIB_LOADABLE_I18N
+XI18N_DL_SOURCES = \
+                  XlcDL.c \
+                  XlcSL.c
+else
+#
+# Static interfaces to input/output methods
+#
+IM_LIBS = \
+       ${top_builddir}/modules/im/ximcp/libximcp.la
+
+LC_LIBS = \
+       ${top_builddir}/modules/lc/def/libxlcDef.la \
+       ${top_builddir}/modules/lc/gen/libxlibi18n.la \
+       ${top_builddir}/modules/lc/Utf8/libxlcUTF8Load.la \
+       ${top_builddir}/modules/lc/xlocale/libxlocale.la
+
+OM_LIBS = \
+       ${top_builddir}/modules/om/generic/libxomGeneric.la
+endif
+
+libi18n_la_LIBADD = \
+        $(IM_LIBS) $(LC_LIBS) $(OM_LIBS)
+
+libi18n_la_SOURCES = \
+       $(XI18N_DL_SOURCES) \
+       XDefaultIMIF.c \
+       XDefaultOMIF.c \
+       xim_trans.c\
+       ICWrap.c\
+       IMWrap.c\
+       imKStoUCS.c\
+       lcCT.c\
+       lcCharSet.c\
+       lcConv.c\
+       lcDB.c\
+       lcDynamic.c\
+       lcFile.c\
+       lcGeneric.c\
+       lcInit.c\
+       lcPrTxt.c\
+       lcPubWrap.c\
+       lcPublic.c\
+       lcRM.c\
+       lcStd.c\
+       lcTxtPr.c\
+       lcUTF8.c\
+       lcUtil.c\
+       lcWrap.c\
+       mbWMProps.c\
+       mbWrap.c\
+       utf8WMProps.c\
+       utf8Wrap.c\
+       wcWrap.c\
+       Xaixlcint.h\
+       XimImSw.h\
+       XimProto.h\
+       XimThai.h\
+       XimTrInt.h\
+       XimTrX.h\
+       XimTrans.h\
+       Ximint.h\
+       XimintL.h\
+       XimintP.h\
+       XlcGeneric.h\
+       XlcPubI.h\
+       XlcPublic.h\
+       Xlcint.h\
+       lcUniConv/armscii_8.h\
+       lcUniConv/ascii.h\
+       lcUniConv/big5.h\
+       lcUniConv/big5_emacs.h\
+       lcUniConv/big5hkscs.h\
+       lcUniConv/cp1133.h\
+       lcUniConv/cp1251.h\
+       lcUniConv/cp1255.h\
+       lcUniConv/cp1256.h\
+       lcUniConv/gb2312.h\
+       lcUniConv/gbk.h\
+       lcUniConv/georgian_academy.h\
+       lcUniConv/georgian_ps.h\
+       lcUniConv/iso8859_1.h\
+       lcUniConv/iso8859_10.h\
+       lcUniConv/iso8859_11.h\
+       lcUniConv/iso8859_13.h\
+       lcUniConv/iso8859_14.h\
+       lcUniConv/iso8859_15.h\
+       lcUniConv/iso8859_16.h\
+       lcUniConv/iso8859_2.h\
+       lcUniConv/iso8859_3.h\
+       lcUniConv/iso8859_4.h\
+       lcUniConv/iso8859_5.h\
+       lcUniConv/iso8859_6.h\
+       lcUniConv/iso8859_7.h\
+       lcUniConv/iso8859_8.h\
+       lcUniConv/iso8859_9.h\
+       lcUniConv/iso8859_9e.h\
+       lcUniConv/jisx0201.h\
+       lcUniConv/jisx0208.h\
+       lcUniConv/jisx0212.h\
+       lcUniConv/koi8_c.h\
+       lcUniConv/koi8_r.h\
+       lcUniConv/koi8_u.h\
+       lcUniConv/ksc5601.h\
+       lcUniConv/mulelao.h\
+       lcUniConv/tatar_cyr.h\
+       lcUniConv/tcvn.h\
+       lcUniConv/tis620.h\
+       lcUniConv/ucs2be.h\
+       lcUniConv/utf8.h\
+       lcUniConv/viscii.h
+
+EXTRA_DIST = \
+       lcUniConv/README \
+       lcUniConv/COPYRIGHT \
+       lcUniConv/8bit_tab_to_h.c \
+       lcUniConv/cjk_tab_to_h.c
+
+if LINT
+# Check source code with tools like lint & sparse
+
+ALL_LINT_FLAGS=$(LINT_FLAGS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+               $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS)
+
+lint:
+       $(LINT) $(ALL_LINT_FLAGS) $(libi18n_la_SOURCES)
+
+endif LINT
diff --git a/src/xlibi18n/XDefaultIMIF.c b/src/xlibi18n/XDefaultIMIF.c
new file mode 100644 (file)
index 0000000..e97d2f4
--- /dev/null
@@ -0,0 +1,469 @@
+/*
+Copyright 1985, 1986, 1987, 1991, 1998  The Open Group
+
+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
+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
+EVEN IF ADVISED IN ADVANCE OF THE POSSIBILITY OF SUCH DAMAGES.
+
+
+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 Window System is a trademark of The Open Group
+
+OSF/1, OSF/Motif and Motif are registered trademarks, and OSF, the OSF
+logo, LBX, X Window System, and Xinerama are trademarks of the Open
+Group. All other trademarks and registered trademarks mentioned herein
+are the property of their respective owners. No right, title or
+interest in or to any trademark, service mark, logo or trade name of
+Sun Microsystems, Inc. or its licensors is granted.
+
+*/
+/*
+ * Copyright 2000 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.
+ */
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "XlcGeneric.h"
+
+#ifndef MAXINT
+#define MAXINT          (~((unsigned int)1 << (8 * sizeof(int)) - 1))
+#endif /* !MAXINT */
+
+typedef struct _StaticXIM *StaticXIM;
+
+typedef struct _XIMStaticXIMRec {
+    /* for CT => MB,WC converter */
+    XlcConv             ctom_conv;
+    XlcConv             ctow_conv;
+} XIMStaticXIMRec;
+
+typedef enum {
+    CREATE_IC = 1,
+    SET_ICVAL = 2,
+    GET_ICVAL = 3
+} XICOp_t;
+
+typedef struct _StaticXIM {
+    XIMMethods         methods;
+    XIMCoreRec         core;
+    XIMStaticXIMRec    *private;
+} StaticXIMRec;
+
+static Status _CloseIM(
+       XIM
+);
+
+static char *_SetIMValues(
+       XIM, XIMArg *
+);
+
+static char *_GetIMValues(
+       XIM, XIMArg*
+);
+
+static XIC _CreateIC(
+       XIM, XIMArg*
+);
+
+static _Xconst XIMMethodsRec local_im_methods = {
+    _CloseIM,          /* close */
+    _SetIMValues,      /* set_values */
+    _GetIMValues,      /* get_values */
+    _CreateIC,         /* create_ic */
+    NULL,              /* ctstombs */
+    NULL               /* ctstowcs */
+};
+
+static void _DestroyIC(
+                      XIC
+);
+static void _SetFocus(
+                     XIC
+);
+static void _UnsetFocus(
+                       XIC
+);
+static char* _SetICValues(
+                        XIC, XIMArg *
+);
+static char* _GetICValues(
+                        XIC, XIMArg *
+);
+static char *_MbReset(
+                     XIC
+);
+static wchar_t *_WcReset(
+                        XIC
+);
+static int _MbLookupString(
+       XIC, XKeyEvent *, char *, int, KeySym *, Status *
+);
+static int _WcLookupString(
+       XIC, XKeyEvent *, wchar_t *, int, KeySym *, Status *
+);
+
+static _Xconst XICMethodsRec local_ic_methods = {
+    _DestroyIC,        /* destroy */
+    _SetFocus,         /* set_focus */
+    _UnsetFocus,       /* unset_focus */
+    _SetICValues,      /* set_values */
+    _GetICValues,      /* get_values */
+    _MbReset,          /* mb_reset */
+    _WcReset,          /* wc_reset */
+    NULL,              /* utf8_reset */                /* ??? */
+    _MbLookupString,   /* mb_lookup_string */
+    _WcLookupString,   /* wc_lookup_string */
+    NULL               /* utf8_lookup_string */        /* ??? */
+};
+
+XIM
+_XDefaultOpenIM(
+    XLCd                lcd,
+    Display             *dpy,
+    XrmDatabase         rdb,
+    char                *res_name,
+    char                *res_class)
+{
+    StaticXIM im;
+    XIMStaticXIMRec *local_impart;
+    XlcConv ctom_conv, ctow_conv;
+    int i;
+    char *mod;
+    char buf[BUFSIZ];
+
+    if (!(ctom_conv = _XlcOpenConverter(lcd,
+                       XlcNCompoundText, lcd, XlcNMultiByte))) {
+       return((XIM)NULL);
+    }
+
+    if (!(ctow_conv = _XlcOpenConverter(lcd,
+                       XlcNCompoundText, lcd, XlcNWideChar))) {
+       return((XIM)NULL);
+    }
+
+    if ((im = (StaticXIM)Xmalloc(sizeof(StaticXIMRec))) == (StaticXIM)NULL) {
+       return((XIM)NULL);
+    }
+    if ((local_impart = (XIMStaticXIMRec*)Xmalloc(sizeof(XIMStaticXIMRec)))
+       == (XIMStaticXIMRec *)NULL) {
+       Xfree(im);
+       return((XIM)NULL);
+    }
+    memset(im, 0, sizeof(StaticXIMRec));
+    memset(local_impart, 0, sizeof(XIMStaticXIMRec));
+
+    buf[0] = '\0';
+    i = 0;
+    if ((lcd->core->modifiers) && (*lcd->core->modifiers)) {
+#define        MODIFIER "@im="
+       mod = strstr(lcd->core->modifiers, MODIFIER);
+       if (mod) {
+           mod += strlen(MODIFIER);
+           while (*mod && *mod != '@' && i < BUFSIZ - 1) {
+               buf[i++] = *mod++;
+           }
+           buf[i] = '\0';
+       }
+    }
+#undef MODIFIER
+    if ((im->core.im_name = Xmalloc(i+1)) == NULL)
+       goto Error2;
+    strcpy(im->core.im_name, buf);
+
+    im->private = local_impart;
+    im->methods        = (XIMMethods)&local_im_methods;
+    im->core.lcd       = lcd;
+    im->core.ic_chain  = (XIC)NULL;
+    im->core.display   = dpy;
+    im->core.rdb       = rdb;
+    im->core.res_name  = NULL;
+    im->core.res_class = NULL;
+
+    local_impart->ctom_conv = ctom_conv;
+    local_impart->ctow_conv = ctow_conv;
+
+    if ((res_name != NULL) && (*res_name != '\0')){
+       im->core.res_name  = strdup(res_name);
+    }
+    if ((res_class != NULL) && (*res_class != '\0')){
+       im->core.res_class = strdup(res_class);
+    }
+
+    return (XIM)im;
+Error2 :
+    Xfree(im->private);
+    Xfree(im->core.im_name);
+    Xfree(im);
+    _XlcCloseConverter(ctom_conv);
+    _XlcCloseConverter(ctow_conv);
+    return(NULL);
+}
+
+static Status
+_CloseIM(XIM xim)
+{
+    StaticXIM im = (StaticXIM)xim;
+    _XlcCloseConverter(im->private->ctom_conv);
+    _XlcCloseConverter(im->private->ctow_conv);
+    XFree(im->private);
+    XFree(im->core.im_name);
+    if (im->core.res_name) XFree(im->core.res_name);
+    if (im->core.res_class) XFree(im->core.res_class);
+    return 1; /*bugID 4163122*/
+}
+
+static char *
+_SetIMValues(
+    XIM xim,
+    XIMArg *arg)
+{
+    return(arg->name);         /* evil */
+}
+
+static char *
+_GetIMValues(
+    XIM xim,
+    XIMArg *values)
+{
+    XIMArg *p;
+    XIMStyles *styles;
+
+    for (p = values; p->name != NULL; p++) {
+       if (strcmp(p->name, XNQueryInputStyle) == 0) {
+           styles = (XIMStyles *)Xmalloc(sizeof(XIMStyles));
+           *(XIMStyles **)p->value = styles;
+           styles->count_styles = 1;
+           styles->supported_styles =
+               (XIMStyle*)Xmalloc(styles->count_styles * sizeof(XIMStyle));
+           styles->supported_styles[0] = (XIMPreeditNone | XIMStatusNone);
+       } else {
+           break;
+       }
+    }
+    return (p->name);
+}
+
+static char*
+_SetICValueData(XIC ic, XIMArg *values, XICOp_t mode)
+{
+    XIMArg *p;
+    char *return_name = NULL;
+
+    for (p = values; p != NULL && p->name != NULL; p++) {
+       if(strcmp(p->name, XNInputStyle) == 0) {
+           if (mode == CREATE_IC)
+               ic->core.input_style = (XIMStyle)p->value;
+       } else if (strcmp(p->name, XNClientWindow) == 0) {
+           ic->core.client_window = (Window)p->value ;
+       } else if (strcmp(p->name, XNFocusWindow) == 0) {
+           ic->core.focus_window = (Window)p->value ;
+       } else if (strcmp(p->name, XNPreeditAttributes) == 0
+                  || strcmp(p->name, XNStatusAttributes) == 0) {
+            return_name = _SetICValueData(ic, (XIMArg*)p->value, mode);
+            if (return_name) break;
+        } else {
+            return_name = p->name;
+            break;
+        }
+    }
+    return(return_name);
+}
+
+static char*
+_GetICValueData(XIC ic, XIMArg *values, XICOp_t mode)
+{
+    XIMArg *p;
+    char *return_name = NULL;
+
+    for (p = values; p->name != NULL; p++) {
+       if(strcmp(p->name, XNInputStyle) == 0) {
+           *((XIMStyle *)(p->value)) = ic->core.input_style;
+       } else if (strcmp(p->name, XNClientWindow) == 0) {
+           *((Window *)(p->value)) = ic->core.client_window;
+       } else if (strcmp(p->name, XNFocusWindow) == 0) {
+           *((Window *)(p->value)) = ic->core.focus_window;
+       } else if (strcmp(p->name, XNFilterEvents) == 0) {
+           *((unsigned long *)(p->value))= ic->core.filter_events;
+       } else if (strcmp(p->name, XNPreeditAttributes) == 0
+                  || strcmp(p->name, XNStatusAttributes) == 0) {
+           return_name = _GetICValueData(ic, (XIMArg*)p->value, mode);
+           if (return_name) break;
+       } else {
+           return_name = p->name;
+           break;
+       }
+    }
+    return(return_name);
+}
+
+static XIC
+_CreateIC(XIM im, XIMArg *arg)
+{
+    XIC ic;
+
+    if ((ic = (XIC)Xmalloc(sizeof(XICRec))) == (XIC)NULL) {
+       return ((XIC)NULL);
+    }
+    memset(ic, 0, sizeof(XICRec));
+
+    ic->methods = (XICMethods)&local_ic_methods;
+    ic->core.im = im;
+    ic->core.filter_events = KeyPressMask;
+
+    if (_SetICValueData(ic, arg, CREATE_IC) != NULL)
+       goto err_return;
+    if (!(ic->core.input_style))
+       goto err_return;
+
+    return (XIC)ic;
+err_return:
+    XFree(ic);
+    return ((XIC)NULL);
+}
+
+static void
+_DestroyIC(XIC ic)
+{
+/*BugId4255571. This Xfree() should be removed because XDestroyIC() still need ic after invoking _DestroyIC() and there is a XFree(ic) at the end of XDestroyIC() already.
+   if(ic)
+       XFree(ic); */
+}
+
+static void
+_SetFocus(XIC ic)
+{
+}
+
+static void
+_UnsetFocus(XIC ic)
+{
+}
+
+static char*
+_SetICValues(XIC ic, XIMArg *args)
+{
+    char *ret = NULL;
+    if (!ic) {
+        return (args->name);
+    }
+    ret = _SetICValueData(ic, args, SET_ICVAL);
+    return(ret);
+}
+
+static char*
+_GetICValues(XIC ic, XIMArg *args)
+{
+    char *ret = NULL;
+    if (!ic) {
+        return (args->name);
+    }
+    ret = _GetICValueData(ic, args, GET_ICVAL);
+    return(ret);
+}
+
+static char *
+_MbReset(XIC xic)
+{
+    return(NULL);
+}
+
+static wchar_t *
+_WcReset(XIC xic)
+{
+    return(NULL);
+}
+
+static int
+_MbLookupString(
+    XIC xic,
+    XKeyEvent *ev,
+    char * buffer,
+    int bytes,
+    KeySym *keysym,
+    Status *status)
+{
+    XComposeStatus NotSupportedYet ;
+    int length;
+
+    length = XLookupString(ev, buffer, bytes, keysym, &NotSupportedYet);
+
+    if (keysym && *keysym == NoSymbol){
+       *status = XLookupNone;
+    } else if (length > 0) {
+       *status = XLookupBoth;
+    } else {
+       *status = XLookupKeySym;
+    }
+    return(length);
+}
+
+static int
+_WcLookupString(
+    XIC xic,
+    XKeyEvent *ev,
+    wchar_t * buffer,
+    int wlen,
+    KeySym *keysym,
+    Status *status)
+{
+    XComposeStatus NotSupportedYet ;
+    int length;
+    /* In single-byte, mb_len = wc_len */
+    char *mb_buf = (char *)Xmalloc(wlen);
+
+    length = XLookupString(ev, mb_buf, wlen, keysym, &NotSupportedYet);
+
+    if (keysym && *keysym == NoSymbol){
+       *status = XLookupNone;
+    } else if (length > 0) {
+       *status = XLookupBoth;
+    } else {
+       *status = XLookupKeySym;
+    }
+    mbstowcs(buffer, mb_buf, length);
+    XFree(mb_buf);
+    return(length);
+}
diff --git a/src/xlibi18n/XDefaultOMIF.c b/src/xlibi18n/XDefaultOMIF.c
new file mode 100644 (file)
index 0000000..b1dc66d
--- /dev/null
@@ -0,0 +1,1261 @@
+/*
+Copyright 1985, 1986, 1987, 1991, 1998  The Open Group
+
+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
+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
+EVEN IF ADVISED IN ADVANCE OF THE POSSIBILITY OF SUCH DAMAGES.
+
+
+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 Window System is a trademark of The Open Group
+
+OSF/1, OSF/Motif and Motif are registered trademarks, and OSF, the OSF
+logo, LBX, X Window System, and Xinerama are trademarks of the Open
+Group. All other trademarks and registered trademarks mentioned herein
+are the property of their respective owners. No right, title or
+interest in or to any trademark, service mark, logo or trade name of
+Sun Microsystems, Inc. or its licensors is granted.
+
+*/
+/*
+ * Copyright 2000 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.
+ */
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include "XlcPublic.h"
+#include <X11/Xos.h>
+#include <X11/Xatom.h>
+#include <stdio.h>
+
+#define MAXFONTS               100
+
+#define XOM_GENERIC(om)                (&((XOMGeneric) om)->gen)
+#define XOC_GENERIC(font_set)  (&((XOCGeneric) font_set)->gen)
+
+#define DefineLocalBuf         char local_buf[BUFSIZ]
+#define AllocLocalBuf(length)  (length > BUFSIZ ? (char *)Xmalloc(length) : local_buf)
+#define FreeLocalBuf(ptr)      if (ptr != local_buf) Xfree(ptr)
+
+typedef struct _FontDataRec {
+    char *name;
+} FontDataRec, *FontData;
+
+typedef struct _OMDataRec {
+    int font_data_count;
+    FontData font_data;
+} OMDataRec, *OMData;
+
+typedef struct _XOMGenericPart {
+    OMData data;
+} XOMGenericPart;
+
+typedef struct _XOMGenericRec {
+    XOMMethods methods;
+    XOMCoreRec core;
+    XOMGenericPart gen;
+} XOMGenericRec, *XOMGeneric;
+
+typedef struct _FontSetRec {
+    int id;
+    int font_data_count;
+    FontData font_data;
+    char *font_name;
+    XFontStruct *info;
+    XFontStruct *font;
+} FontSetRec, *FontSet;
+
+typedef struct _XOCGenericPart {
+    XlcConv wcs_to_cs;
+    FontSet font_set;
+} XOCGenericPart;
+
+typedef struct _XOCGenericRec {
+    XOCMethods methods;
+    XOCCoreRec core;
+    XOCGenericPart gen;
+} XOCGenericRec, *XOCGeneric;
+
+static Bool
+init_fontset(
+    XOC oc)
+{
+    XOCGenericPart *gen;
+    FontSet font_set;
+    OMData data;
+
+    data = XOM_GENERIC(oc->core.om)->data;
+
+    font_set = Xcalloc(1, sizeof(FontSetRec));
+    if (font_set == NULL)
+       return False;
+
+    gen = XOC_GENERIC(oc);
+    gen->font_set = font_set;
+
+    font_set->font_data_count = data->font_data_count;
+    font_set->font_data = data->font_data;
+
+    return True;
+}
+
+static char *
+get_prop_name(
+    Display *dpy,
+    XFontStruct        *fs)
+{
+    unsigned long fp;
+
+    if (XGetFontProperty(fs, XA_FONT, &fp))
+       return XGetAtomName(dpy, fp);
+
+    return (char *) NULL;
+}
+
+static FontData
+check_charset(
+    FontSet font_set,
+    char *font_name)
+{
+    FontData font_data;
+    char *last;
+    int count;
+    ssize_t length, name_len;
+
+    name_len = strlen(font_name);
+    last = font_name + name_len;
+
+    count = font_set->font_data_count;
+    font_data = font_set->font_data;
+
+    for ( ; count-- > 0; font_data++) {
+       length = strlen(font_data->name);
+
+       if (length > name_len)
+           return(NULL);
+
+       if (_XlcCompareISOLatin1(last - length, font_data->name) == 0)
+           return font_data;
+    }
+    return (FontData) NULL;
+}
+
+#if 0 /* Unused */
+static int
+check_fontname(
+    XOC oc,
+    char *name)
+{
+    Display *dpy = oc->core.om->core.display;
+    XOCGenericPart *gen = XOC_GENERIC(oc);
+    FontData data;
+    FontSet font_set;
+    XFontStruct *fs_list;
+    char **fn_list, *fname, *prop_fname = NULL;
+    int list_num, i;
+    int list2_num;
+    char **fn2_list = NULL;
+    int found_num = 0;
+
+    fn_list = XListFonts(dpy, name, MAXFONTS, &list_num);
+    if (fn_list == NULL)
+       return found_num;
+
+    for (i = 0; i < list_num; i++) {
+       fname = fn_list[i];
+
+       font_set = gen->font_set;
+
+       if ((data = check_charset(font_set, fname)) == NULL) {
+           if ((fn2_list = XListFontsWithInfo(dpy, name, MAXFONTS,
+                                              &list2_num, &fs_list))
+               && (prop_fname = get_prop_name(dpy, fs_list))
+               && (data = check_charset(font_set, prop_fname)))
+               fname = prop_fname;
+       }
+       if (data) {
+           font_set->font_name = strdup(fname);
+           if (font_set->font_name) {
+               found_num++;
+           }
+       }
+       if (fn2_list) {
+           XFreeFontInfo(fn2_list, fs_list, list2_num);
+           fn2_list = NULL;
+           if (prop_fname) {
+               Xfree(prop_fname);
+               prop_fname = NULL;
+           }
+       }
+       if (found_num == 1)
+           break;
+    }
+    XFreeFontNames(fn_list);
+    return found_num;
+}
+#endif
+
+static Bool
+load_font(
+    XOC oc)
+{
+    Display *dpy = oc->core.om->core.display;
+    XOCGenericPart *gen = XOC_GENERIC(oc);
+    FontSet font_set = gen->font_set;
+
+    if (font_set->font_name == NULL)
+       return False;
+
+    if (font_set->font == NULL) {
+       font_set->font = XLoadQueryFont(dpy, font_set->font_name);
+       if (font_set->font == NULL)
+           return False;
+    }
+    return True;
+}
+
+#if 0
+static Bool
+load_font_info(
+    XOC oc)
+{
+    Display *dpy = oc->core.om->core.display;
+    XOCGenericPart *gen = XOC_GENERIC(oc);
+    FontSet font_set = gen->font_set;
+    char **fn_list;
+    int fn_num;
+
+    if (font_set->font_name == NULL)
+       return False;
+
+    if (font_set->info == NULL) {
+       fn_list = XListFontsWithInfo(dpy, font_set->font_name, 1, &fn_num,
+                                    &font_set->info);
+       if (font_set->info == NULL)
+           return False;
+       if (fn_num > 0)
+           font_set->info->fid = XLoadFont(dpy, font_set->font_name);
+
+       if (fn_list) XFreeFontNames(fn_list);
+    }
+    return True;
+}
+#endif
+
+static void
+set_fontset_extents(
+    XOC oc)
+{
+    XRectangle *ink = &oc->core.font_set_extents.max_ink_extent;
+    XRectangle *logical = &oc->core.font_set_extents.max_logical_extent;
+    XFontStruct **font_list, *font;
+    XCharStruct overall;
+    int logical_ascent, logical_descent;
+
+    font_list = oc->core.font_info.font_struct_list;
+    font = *font_list++;
+    overall = font->max_bounds;
+    overall.lbearing = font->min_bounds.lbearing;
+    logical_ascent = font->ascent;
+    logical_descent = font->descent;
+
+    ink->x = overall.lbearing;
+    ink->y = -(overall.ascent);
+    ink->width = overall.rbearing - overall.lbearing;
+    ink->height = overall.ascent + overall.descent;
+
+    logical->x = 0;
+    logical->y = -(logical_ascent);
+    logical->width = overall.width;
+    logical->height = logical_ascent + logical_descent;
+}
+
+static Bool
+init_core_part(
+    XOC oc)
+{
+    XOCGenericPart *gen = XOC_GENERIC(oc);
+    FontSet font_set;
+    XFontStruct **font_struct_list;
+    char **font_name_list, *font_name_buf;
+    int        count, length;
+
+    font_set = gen->font_set;
+    count = length = 0;
+
+    if (font_set->font_name != NULL) {
+       length += strlen(font_set->font_name) + 1;
+       count++;
+    }
+    if (count == 0)
+        return False;
+
+    font_struct_list = (XFontStruct **) Xmalloc(sizeof(XFontStruct *));
+    if (font_struct_list == NULL)
+       return False;
+
+    font_name_list = (char **) Xmalloc(sizeof(char *));
+    if (font_name_list == NULL)
+       goto err;
+
+    font_name_buf = (char *) Xmalloc(length);
+    if (font_name_buf == NULL)
+       goto err;
+
+    oc->core.font_info.num_font = 1;
+    oc->core.font_info.font_name_list = font_name_list;
+    oc->core.font_info.font_struct_list = font_struct_list;
+
+    font_set = gen->font_set;
+
+    if (font_set->font_name != NULL) {
+       font_set->id = 1;
+       if (font_set->font)
+           *font_struct_list++ = font_set->font;
+       else
+           *font_struct_list++ = font_set->info;
+       strcpy(font_name_buf, font_set->font_name);
+       Xfree(font_set->font_name);
+       *font_name_list++ = font_set->font_name = font_name_buf;
+       font_name_buf += strlen(font_name_buf) + 1;
+    }
+
+    set_fontset_extents(oc);
+
+    return True;
+
+err:
+    if (font_name_list)
+       Xfree(font_name_list);
+    Xfree(font_struct_list);
+
+    return False;
+}
+
+static char *
+get_font_name(
+    XOC oc,
+    char *pattern)
+{
+    char **list, *name;
+    int count;
+    XFontStruct *fs;
+    Display *dpy = oc->core.om->core.display;
+
+    list = XListFonts(dpy, pattern, 1, &count);
+    if (list != NULL) {
+       name = strdup(*list);
+
+       XFreeFontNames(list);
+    } else {
+       fs = XLoadQueryFont(dpy, pattern);
+       if (fs == NULL) return NULL;
+
+       name = get_prop_name(dpy, fs);
+       XFreeFont(dpy, fs);
+    }
+    return name;
+}
+
+static int
+parse_fontname(
+    XOC oc)
+{
+    XOCGenericPart *gen = XOC_GENERIC(oc);
+    FontSet font_set;
+    FontData font_data;
+    char *pattern, *last, buf[BUFSIZ];
+    int font_data_count, found_num = 0;
+    ssize_t length;
+    int count, num_fields;
+    char *base_name, *font_name, **name_list, **cur_name_list;
+    char *charset_p = NULL;
+    Bool append_charset;
+    /*
+       append_charset flag should be set to True when the XLFD fontname
+       doesn't contain a chaset part.
+     */
+
+    name_list = _XParseBaseFontNameList(oc->core.base_name_list, &count);
+    if (name_list == NULL)
+       return -1;
+    cur_name_list = name_list;
+
+    while (count-- > 0) {
+        pattern = *cur_name_list++;
+       if (pattern == NULL || *pattern == '\0')
+           continue;
+
+       append_charset = False;
+
+       if (strchr(pattern, '*') == NULL &&
+           (font_name = get_font_name(oc, pattern))) {
+
+           font_set = gen->font_set;
+
+           font_data = check_charset(font_set, font_name);
+           if (font_data == NULL) {
+               Display *dpy = oc->core.om->core.display;
+               char **fn_list = NULL, *prop_fname = NULL;
+               int list_num;
+               XFontStruct *fs_list;
+               if ((fn_list = XListFontsWithInfo(dpy, font_name,
+                                                 MAXFONTS,
+                                                 &list_num, &fs_list))
+                   && (prop_fname = get_prop_name(dpy, fs_list))
+                   && (font_data = check_charset(font_set, prop_fname))) {
+                   if (fn_list) {
+                       XFreeFontInfo(fn_list, fs_list, list_num);
+                       fn_list = NULL;
+                   }
+                   font_name = prop_fname;
+               }
+           }
+           if (font_data == NULL)
+               continue;
+
+           font_set->font_name = strdup(font_name);
+           Xfree(font_name);
+           if (font_set->font_name == NULL) {
+               goto err;
+           }
+           found_num++;
+           goto found;
+       }
+/*
+1266793
+Limit the length of the string copy to prevent stack corruption.
+       strcpy(buf, pattern);
+*/
+       strncpy(buf, pattern, BUFSIZ);
+       buf[BUFSIZ-1] = '\0';
+       length = strlen(buf);
+       last = buf + length - 1;
+
+       for (num_fields = 0, base_name = buf; *base_name != '\0'; base_name++)
+           if (*base_name == '-') num_fields++;
+       if (strchr(pattern, '*') == NULL) {
+           if (num_fields == 12) {
+               append_charset = True;
+               *++last = '-';
+               last++;
+           } else
+               continue;
+       } else {
+           if (num_fields == 13 || num_fields == 14) {
+           /*
+            * There are 14 fields in an XLFD name -- make certain the
+            * charset (& encoding) is placed in the correct field.
+            */
+               append_charset = True;
+               last = strrchr (buf, '-');
+               if (num_fields == 14) {
+                   *last = '\0';
+                   last = strrchr (buf, '-');
+               }
+               last++;
+           } else if (*last == '*') {
+               append_charset = True;
+               if (length > 3 && *(last-3) == '-' && *(last-2) == '*'
+                   && *(last-1) == '-') {
+                   last -= 2;
+               }
+               *++last = '-';
+               last++;
+           } else {
+               last = strrchr (buf, '-');
+               charset_p = last;
+               charset_p = strrchr (buf, '-');
+               while (*(--charset_p) != '-');
+               charset_p++;
+           }
+       }
+
+       font_set = gen->font_set;
+
+       font_data = font_set->font_data;
+       font_data_count = font_set->font_data_count;
+       for ( ; font_data_count-- > 0; font_data++) {
+           if (append_charset)
+               {
+/*
+1266793
+Limit the length of the string copy to prevent stack corruption.
+               strcpy(last, font_data->name);
+*/
+               strncpy(last, font_data->name, BUFSIZ - length);
+               buf[BUFSIZ-1] = '\0';
+               }
+           else {
+               if (_XlcCompareISOLatin1(charset_p,
+                                        font_data->name)) {
+                   continue;
+               }
+           }
+           if ((font_set->font_name = get_font_name(oc, buf)))
+               break;
+       }
+       if (font_set->font_name != NULL) {
+           found_num++;
+           goto found;
+       }
+    }
+  found:
+    base_name = strdup(oc->core.base_name_list);
+    if (base_name == NULL)
+       goto err;
+
+    oc->core.base_name_list = base_name;
+
+    XFreeStringList(name_list);
+
+    return found_num;
+err:
+    XFreeStringList(name_list);
+
+    return -1;
+}
+
+static Bool
+set_missing_list(
+    XOC oc)
+{
+    XOCGenericPart *gen = XOC_GENERIC(oc);
+    FontSet font_set;
+    char **charset_list, *charset_buf;
+    int        count, length;
+
+    font_set = gen->font_set;
+    count = length = 0;
+
+    if (!font_set->info && !font_set->font) {
+       length += strlen(font_set->font_data->name) + 1;
+       count++;
+    }
+
+    if (count == 0)
+       return True;
+
+    charset_list = (char **) Xmalloc(sizeof(char *));
+    if (charset_list == NULL)
+       return False;
+
+    charset_buf = (char *) Xmalloc(length);
+    if (charset_buf == NULL) {
+       Xfree(charset_list);
+       return False;
+    }
+
+    oc->core.missing_list.charset_list = charset_list;
+
+    font_set = gen->font_set;
+
+    if (!font_set->info && !font_set->font) {
+       strcpy(charset_buf, font_set->font_data->name);
+       *charset_list++ = charset_buf;
+       charset_buf += strlen(charset_buf) + 1;
+    }
+    return True;
+}
+
+static Bool
+create_fontset(
+    XOC oc)
+{
+    int found_num;
+
+    if (init_fontset(oc) == False)
+        return False;
+
+    found_num = parse_fontname(oc);
+    if (found_num <= 0) {
+       if (found_num == 0)
+           set_missing_list(oc);
+       return False;
+    }
+
+    if (load_font(oc) == False)
+       return False;
+
+    if (init_core_part(oc) == False)
+       return False;
+
+    if (set_missing_list(oc) == False)
+       return False;
+
+    return True;
+}
+
+static void
+destroy_oc(
+    XOC oc)
+{
+    Display *dpy = oc->core.om->core.display;
+    XOCGenericPart *gen = XOC_GENERIC(oc);
+    XFontStruct **font_list, *font;
+
+    if (gen->font_set)
+       Xfree(gen->font_set);
+
+    if (oc->core.base_name_list)
+       Xfree(oc->core.base_name_list);
+
+    if (oc->core.font_info.font_name_list)
+       XFreeStringList(oc->core.font_info.font_name_list);
+
+    if ((font_list = oc->core.font_info.font_struct_list)) {
+       if ((font = *font_list)) {
+           if (font->fid)
+               XFreeFont(dpy, font);
+           else
+               XFreeFontInfo(NULL, font, 1);
+       }
+       Xfree(oc->core.font_info.font_struct_list);
+    }
+
+    if (oc->core.missing_list.charset_list)
+       XFreeStringList(oc->core.missing_list.charset_list);
+
+#ifdef notdef
+    if (oc->core.res_name)
+       Xfree(oc->core.res_name);
+    if (oc->core.res_class)
+       Xfree(oc->core.res_class);
+#endif
+
+    Xfree(oc);
+}
+
+static char *
+set_oc_values(
+    XOC oc,
+    XlcArgList args,
+    int num_args)
+{
+    if (oc->core.resources == NULL)
+       return NULL;
+
+    return _XlcSetValues((XPointer) oc, oc->core.resources,
+                        oc->core.num_resources, args, num_args, XlcSetMask);
+}
+
+static char *
+get_oc_values(
+    XOC oc,
+    XlcArgList args,
+    int num_args)
+{
+    if (oc->core.resources == NULL)
+       return NULL;
+
+    return _XlcGetValues((XPointer) oc, oc->core.resources,
+                        oc->core.num_resources, args, num_args, XlcGetMask);
+}
+
+static Bool
+wcs_to_mbs(
+    XOC oc,
+    char *to,
+    _Xconst wchar_t *from,
+    int length)
+{
+    XlcConv conv = XOC_GENERIC(oc)->wcs_to_cs;
+    XLCd lcd;
+    int ret, to_left = length;
+
+    if (conv == NULL) {
+       lcd = oc->core.om->core.lcd;
+       conv = _XlcOpenConverter(lcd, XlcNWideChar, lcd, XlcNMultiByte);
+       if (conv == NULL)
+           return False;
+       XOC_GENERIC(oc)->wcs_to_cs = conv;
+    } else
+       _XlcResetConverter(conv);
+
+    ret = _XlcConvert(conv, (XPointer *) &from, &length, (XPointer *) &to,
+                     &to_left, NULL, 0);
+    if (ret != 0 || length > 0)
+       return False;
+
+    return True;
+}
+
+static int
+_XmbDefaultTextEscapement(XOC oc, _Xconst char *text, int length)
+{
+    return XTextWidth(*oc->core.font_info.font_struct_list, text, length);
+}
+
+static int
+_XwcDefaultTextEscapement(XOC oc, _Xconst wchar_t *text, int length)
+{
+    DefineLocalBuf;
+    char *buf = AllocLocalBuf(length);
+    int ret = 0;
+
+    if (buf == NULL)
+       return 0;
+
+    if (wcs_to_mbs(oc, buf, text, length) == False)
+       goto err;
+
+    ret = _XmbDefaultTextEscapement(oc, buf, length);
+
+err:
+    FreeLocalBuf(buf);
+
+    return ret;
+}
+
+static int
+_XmbDefaultTextExtents(XOC oc, _Xconst char *text, int length,
+                      XRectangle *overall_ink, XRectangle *overall_logical)
+{
+    int direction, logical_ascent, logical_descent;
+    XCharStruct overall;
+
+    XTextExtents(*oc->core.font_info.font_struct_list, text, length, &direction,
+                &logical_ascent, &logical_descent, &overall);
+
+    if (overall_ink) {
+       overall_ink->x = overall.lbearing;
+       overall_ink->y = -(overall.ascent);
+       overall_ink->width = overall.rbearing - overall.lbearing;
+       overall_ink->height = overall.ascent + overall.descent;
+    }
+
+    if (overall_logical) {
+       overall_logical->x = 0;
+        overall_logical->y = -(logical_ascent);
+       overall_logical->width = overall.width;
+        overall_logical->height = logical_ascent + logical_descent;
+    }
+
+    return overall.width;
+}
+
+static int
+_XwcDefaultTextExtents(XOC oc, _Xconst wchar_t *text, int length,
+                      XRectangle *overall_ink, XRectangle *overall_logical)
+{
+    DefineLocalBuf;
+    char *buf = AllocLocalBuf(length);
+    int ret = 0;
+
+    if (buf == NULL)
+       return 0;
+
+    if (wcs_to_mbs(oc, buf, text, length) == False)
+       goto err;
+
+    ret = _XmbDefaultTextExtents(oc, buf, length, overall_ink, overall_logical);
+
+err:
+    FreeLocalBuf(buf);
+
+    return ret;
+}
+
+static Status
+_XmbDefaultTextPerCharExtents(XOC oc, _Xconst char *text, int length,
+                             XRectangle *ink_buf, XRectangle *logical_buf,
+                             int buf_size, int *num_chars,
+                             XRectangle *overall_ink,
+                             XRectangle *overall_logical)
+{
+    XFontStruct *font = *oc->core.font_info.font_struct_list;
+    XCharStruct *def, *cs, overall;
+    Bool first = True;
+
+    if (buf_size < length)
+       return 0;
+
+    bzero((char *) &overall, sizeof(XCharStruct));
+    *num_chars = 0;
+
+    CI_GET_DEFAULT_INFO_1D(font, def)
+
+    while (length-- > 0) {
+       CI_GET_CHAR_INFO_1D(font, *text, def, cs)
+       text++;
+       if (cs == NULL)
+           continue;
+
+       ink_buf->x = overall.width + cs->lbearing;
+       ink_buf->y = -(cs->ascent);
+       ink_buf->width = cs->rbearing - cs->lbearing;
+       ink_buf->height = cs->ascent + cs->descent;
+       ink_buf++;
+
+       logical_buf->x = overall.width;
+       logical_buf->y = -(font->ascent);
+       logical_buf->width = cs->width;
+       logical_buf->height = font->ascent + font->descent;
+       logical_buf++;
+
+       if (first) {
+           overall = *cs;
+           first = False;
+       } else {
+           overall.ascent = max(overall.ascent, cs->ascent);
+           overall.descent = max(overall.descent, cs->descent);
+           overall.lbearing = min(overall.lbearing, overall.width +
+                                  cs->lbearing);
+           overall.rbearing = max(overall.rbearing, overall.width +
+                                  cs->rbearing);
+           overall.width += cs->width;
+       }
+       (*num_chars)++;
+    }
+
+    if (overall_ink) {
+       overall_ink->x = overall.lbearing;
+       overall_ink->y = -(overall.ascent);
+       overall_ink->width = overall.rbearing - overall.lbearing;
+       overall_ink->height = overall.ascent + overall.descent;
+    }
+
+    if (overall_logical) {
+       overall_logical->x = 0;
+       overall_logical->y = -(font->ascent);
+       overall_logical->width = overall.width;
+       overall_logical->height = font->ascent + font->descent;
+    }
+
+    return 1;
+}
+
+static Status
+_XwcDefaultTextPerCharExtents(XOC oc, _Xconst wchar_t *text, int length,
+                             XRectangle *ink_buf, XRectangle *logical_buf,
+                             int buf_size, int *num_chars,
+                             XRectangle *overall_ink,
+                             XRectangle *overall_logical)
+{
+    DefineLocalBuf;
+    char *buf = AllocLocalBuf(length);
+    Status ret = 0;
+
+    if (buf == NULL)
+       return 0;
+
+    if (wcs_to_mbs(oc, buf, text, length) == False)
+       goto err;
+
+    ret = _XmbDefaultTextPerCharExtents(oc, buf, length, ink_buf, logical_buf,
+                                       buf_size, num_chars, overall_ink,
+                                       overall_logical);
+
+err:
+    FreeLocalBuf(buf);
+
+    return ret;
+}
+
+static int
+_XmbDefaultDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
+                     _Xconst char *text, int length)
+{
+    XFontStruct *font = *oc->core.font_info.font_struct_list;
+
+    XSetFont(dpy, gc, font->fid);
+    XDrawString(dpy, d, gc, x, y, text, length);
+
+    return XTextWidth(font, text, length);
+}
+
+static int
+_XwcDefaultDrawString(Display *dpy, Drawable d, XOC oc, GC gc, int x, int y,
+                     _Xconst wchar_t *text, int length)
+{
+    DefineLocalBuf;
+    char *buf = AllocLocalBuf(length);
+    int ret = 0;
+
+    if (buf == NULL)
+       return 0;
+
+    if (wcs_to_mbs(oc, buf, text, length) == False)
+       goto err;
+
+    ret = _XmbDefaultDrawString(dpy, d, oc, gc, x, y, buf, length);
+
+err:
+    FreeLocalBuf(buf);
+
+    return ret;
+}
+
+static void
+_XmbDefaultDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
+                          int y, _Xconst char *text, int length)
+{
+    XSetFont(dpy, gc, (*oc->core.font_info.font_struct_list)->fid);
+    XDrawImageString(dpy, d, gc, x, y, text, length);
+}
+
+static void
+_XwcDefaultDrawImageString(Display *dpy, Drawable d, XOC oc, GC gc, int x,
+                          int y, _Xconst wchar_t *text, int length)
+{
+    DefineLocalBuf;
+    char *buf = AllocLocalBuf(length);
+
+    if (buf == NULL)
+       return;
+
+    if (wcs_to_mbs(oc, buf, text, length) == False)
+       goto err;
+
+    _XmbDefaultDrawImageString(dpy, d, oc, gc, x, y, buf, length);
+
+err:
+    FreeLocalBuf(buf);
+}
+
+static _Xconst XOCMethodsRec oc_default_methods = {
+    destroy_oc,
+    set_oc_values,
+    get_oc_values,
+    _XmbDefaultTextEscapement,
+    _XmbDefaultTextExtents,
+    _XmbDefaultTextPerCharExtents,
+    _XmbDefaultDrawString,
+    _XmbDefaultDrawImageString,
+    _XwcDefaultTextEscapement,
+    _XwcDefaultTextExtents,
+    _XwcDefaultTextPerCharExtents,
+    _XwcDefaultDrawString,
+    _XwcDefaultDrawImageString
+};
+
+static XlcResource oc_resources[] = {
+    { XNBaseFontName, NULLQUARK, sizeof(char *),
+      XOffsetOf(XOCRec, core.base_name_list), XlcCreateMask | XlcGetMask },
+    { XNOMAutomatic, NULLQUARK, sizeof(Bool),
+      XOffsetOf(XOCRec, core.om_automatic), XlcGetMask },
+    { XNMissingCharSet, NULLQUARK, sizeof(XOMCharSetList),
+      XOffsetOf(XOCRec, core.missing_list), XlcGetMask },
+    { XNDefaultString, NULLQUARK, sizeof(char *),
+      XOffsetOf(XOCRec, core.default_string), XlcGetMask },
+    { XNOrientation, NULLQUARK, sizeof(XOrientation),
+      XOffsetOf(XOCRec, core.orientation), XlcSetMask | XlcGetMask },
+    { XNResourceName, NULLQUARK, sizeof(char *),
+      XOffsetOf(XOCRec, core.res_name), XlcSetMask | XlcGetMask },
+    { XNResourceClass, NULLQUARK, sizeof(char *),
+      XOffsetOf(XOCRec, core.res_class), XlcSetMask | XlcGetMask },
+    { XNFontInfo, NULLQUARK, sizeof(XOMFontInfo),
+      XOffsetOf(XOCRec, core.font_info), XlcGetMask }
+};
+
+static XOC
+create_oc(
+    XOM om,
+    XlcArgList args,
+    int num_args)
+{
+    XOC oc;
+
+    oc = Xcalloc(1, sizeof(XOCGenericRec));
+    if (oc == NULL)
+       return (XOC) NULL;
+
+    oc->core.om = om;
+
+    if (oc_resources[0].xrm_name == NULLQUARK)
+       _XlcCompileResourceList(oc_resources, XlcNumber(oc_resources));
+
+    if (_XlcSetValues((XPointer) oc, oc_resources, XlcNumber(oc_resources),
+                     args, num_args, XlcCreateMask | XlcDefaultMask))
+       goto err;
+
+    if (oc->core.base_name_list == NULL)
+       goto err;
+
+    oc->core.resources = oc_resources;
+    oc->core.num_resources = XlcNumber(oc_resources);
+
+    if (create_fontset(oc) == False)
+       goto err;
+
+    oc->methods = (XOCMethods)&oc_default_methods;
+
+    return oc;
+
+err:
+    destroy_oc(oc);
+
+    return (XOC) NULL;
+}
+
+static Status
+close_om(
+    XOM om)
+{
+    XOMGenericPart *gen = XOM_GENERIC(om);
+    OMData data;
+    FontData font_data;
+    int count;
+
+    if ((data = gen->data)) {
+       if (data->font_data) {
+         for (font_data = data->font_data, count = data->font_data_count;
+              count-- > 0 ; font_data++) {
+           if (font_data->name)
+               Xfree(font_data->name);
+         }
+         Xfree(data->font_data);
+       }
+       Xfree(gen->data);
+    }
+
+    if (om->core.res_name)
+       Xfree(om->core.res_name);
+    if (om->core.res_class)
+       Xfree(om->core.res_class);
+    if (om->core.required_charset.charset_list)
+       XFreeStringList(om->core.required_charset.charset_list);
+    else
+       Xfree((char*)om->core.required_charset.charset_list);
+    if (om->core.orientation_list.orientation)
+       Xfree(om->core.orientation_list.orientation);
+
+    Xfree(om);
+
+    return 1;
+}
+
+static char *
+set_om_values(
+    XOM om,
+    XlcArgList args,
+    int num_args)
+{
+    if (om->core.resources == NULL)
+       return NULL;
+
+    return _XlcSetValues((XPointer) om, om->core.resources,
+                        om->core.num_resources, args, num_args, XlcSetMask);
+}
+
+static char *
+get_om_values(
+    XOM om,
+    XlcArgList args,
+    int num_args)
+{
+    if (om->core.resources == NULL)
+       return NULL;
+
+    return _XlcGetValues((XPointer) om, om->core.resources,
+                        om->core.num_resources, args, num_args, XlcGetMask);
+}
+
+static _Xconst XOMMethodsRec methods = {
+    close_om,
+    set_om_values,
+    get_om_values,
+    create_oc
+};
+
+static XlcResource om_resources[] = {
+    { XNRequiredCharSet, NULLQUARK, sizeof(XOMCharSetList),
+      XOffsetOf(XOMRec, core.required_charset), XlcGetMask },
+    { XNQueryOrientation, NULLQUARK, sizeof(XOMOrientation),
+      XOffsetOf(XOMRec, core.orientation_list), XlcGetMask },
+    { XNDirectionalDependentDrawing, NULLQUARK, sizeof(Bool),
+      XOffsetOf(XOMRec, core.directional_dependent), XlcGetMask },
+    { XNContextualDrawing, NULLQUARK, sizeof(Bool),
+      XOffsetOf(XOMRec, core.contextual_drawing), XlcGetMask }
+};
+
+static OMData
+add_data(
+    XOM om)
+{
+    XOMGenericPart *gen = XOM_GENERIC(om);
+    OMData new;
+
+    new = Xcalloc(1, sizeof(OMDataRec));
+
+    if (new == NULL)
+        return NULL;
+
+    gen->data = new;
+
+    return new;
+}
+
+static _Xconst char *supported_charset_list[] = {
+    "ISO8859-1",
+/* fix for bug4332979 */
+    "adobe-fontspecific",
+/* fix for bug4237353: "JISX0201.1976-0" entry should be removed from
+   supported_charset_list because it is not a supported_charset for C locale
+    "JISX0201.1976-0", */
+    "SUNOLCURSOR-1",
+    "SUNOLGLYPH-1"
+};
+
+static Bool
+init_om(
+    XOM om)
+{
+    XOMGenericPart *gen = XOM_GENERIC(om);
+    OMData data;
+    FontData font_data;
+    char **required_list;
+    XOrientation *orientation;
+    char **value, buf[BUFSIZ], *bufptr;
+    int count, length = 0;
+
+    value = (char**)supported_charset_list;
+    count = XlcNumber(supported_charset_list);
+
+    data = add_data(om);
+    if (data == NULL)
+       return False;
+
+    font_data = Xcalloc(count, sizeof(FontDataRec));
+    if (font_data == NULL)
+       return False;
+    data->font_data = font_data;
+    data->font_data_count = count;
+
+    for ( ; count-- > 0; font_data++) {
+/*
+1266793
+This one is fine.  *value points to one of the local strings in
+supported_charset_list[].
+*/
+       strcpy(buf, *value++);
+       font_data->name = strdup(buf);
+       if (font_data->name == NULL)
+           return False;
+    }
+
+    length += strlen(data->font_data->name) + 1;
+
+    /* required charset list */
+    required_list = (char **) Xmalloc(sizeof(char *));
+    if (required_list == NULL)
+       return False;
+
+    bufptr = (char *) Xmalloc(length);
+    if (bufptr == NULL) {
+       Xfree(required_list);
+       return False;
+    }
+
+    om->core.required_charset.charset_list = required_list;
+    om->core.required_charset.charset_count = 1; /* always 1 */
+
+    data = gen->data;
+
+    strcpy(bufptr, data->font_data->name);
+    *required_list++ = bufptr;
+    bufptr += strlen(bufptr) + 1;
+
+    /* orientation list */
+    orientation = (XOrientation *) Xmalloc(sizeof(XOrientation));
+    if (orientation == NULL)
+       return False;
+
+    *orientation = XOMOrientation_LTR_TTB;
+    om->core.orientation_list.orientation = orientation;
+    om->core.orientation_list.num_orientation = 1;
+
+    /* directional dependent drawing */
+    om->core.directional_dependent = False;
+
+    /* contexual drawing */
+    om->core.contextual_drawing = False;
+
+    /* context dependent */
+    om->core.context_dependent = False;
+
+    return True;
+}
+
+XOM
+_XDefaultOpenOM(XLCd lcd, Display *dpy, XrmDatabase rdb,
+               _Xconst char *res_name, _Xconst char *res_class)
+{
+    XOM om;
+
+    om = Xcalloc(1, sizeof(XOMGenericRec));
+    if (om == NULL)
+       return (XOM) NULL;
+
+    om->methods = (XOMMethods)&methods;
+    om->core.lcd = lcd;
+    om->core.display = dpy;
+    om->core.rdb = rdb;
+    if (res_name) {
+       om->core.res_name = strdup(res_name);
+       if (om->core.res_name == NULL)
+           goto err;
+    }
+    if (res_class) {
+       om->core.res_class = strdup(res_class);
+       if (om->core.res_class == NULL)
+           goto err;
+    }
+
+    if (om_resources[0].xrm_name == NULLQUARK)
+       _XlcCompileResourceList(om_resources, XlcNumber(om_resources));
+
+    om->core.resources = om_resources;
+    om->core.num_resources = XlcNumber(om_resources);
+
+    if (init_om(om) == False)
+       goto err;
+
+    return om;
+err:
+    close_om(om);
+
+    return (XOM) NULL;
+}
diff --git a/src/xlibi18n/Xaixlcint.h b/src/xlibi18n/Xaixlcint.h
new file mode 100644 (file)
index 0000000..446ba25
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ *
+ * Copyright IBM Corporation 1993
+ *
+ * All Rights Reserved
+ *
+ * License 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 IBM not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ *
+ * IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS, AND
+ * NONINFRINGEMENT OF THIRD PARTY RIGHTS, IN NO EVENT SHALL
+ * IBM 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.
+ *
+*/
+/************************************************************************/
+/*     Xaixlcint.h                                                     */
+/*----------------------------------------------------------------------*/
+/*     This file contains Xlcint.h extension for AIX.                  */
+/************************************************************************/
+#ifndef        _Xaixlcint_h
+#define        _Xaixlcint_h
+
+#include "Xlcint.h"
+#include <sys/lc_core.h>
+
+#define        _LC_LDX         11
+#define        _LC_LDX_R6      (_LC_LDX+1)
+#define        _LC_VERSION_R5  5
+#define        _LC_VERSION_R6  6
+
+typedef        struct  _LC_core_ldx_t  {
+    _LC_object_t       lc_object_header;
+    XLCd               (*default_loader)();
+    Bool               sticky;
+} _XlcCoreObjRec, *_XlcCoreObj;
+
+#if _LC_VERSION < 0x40000000
+#define __type_id type_id
+#define __magic magic
+#define __version version
+#endif
+
+#endif /*_Xaixlcint_h*/
diff --git a/src/xlibi18n/XimImSw.h b/src/xlibi18n/XimImSw.h
new file mode 100644 (file)
index 0000000..e3a9625
--- /dev/null
@@ -0,0 +1,46 @@
+/******************************************************************
+
+                Copyright 1992, 1993 by FUJITSU LIMITED
+
+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 FUJITSU LIMITED
+not be used in advertising or publicity pertaining to distribution
+of the software without specific, written prior permission.
+FUJITSU LIMITED makes no representations about the suitability of
+this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL FUJITSU LIMITED 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.
+
+  Author: Takashi Fujiwara     FUJITSU LIMITED
+                               fujiwara@a80.tech.yk.fujitsu.co.jp
+
+******************************************************************/
+
+#ifndef _XIMIMSW_H
+#define _XIMIMSW_H
+
+typedef struct {
+    Bool       (*checkprocessing)(
+       Xim   im
+               );
+    Bool       (*im_open)(
+       Xim   im
+               );
+    void       (*im_free)(
+       Xim   im
+               );
+} XimImsportSW;
+
+extern XimImsportSW _XimImSportRec[];
+
+#endif /* _XIMIMSW_H */
diff --git a/src/xlibi18n/XimProto.h b/src/xlibi18n/XimProto.h
new file mode 100644 (file)
index 0000000..6b0096d
--- /dev/null
@@ -0,0 +1,226 @@
+/******************************************************************
+
+           Copyright 1992, 1993 by FUJITSU LIMITED
+
+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 FUJITSU LIMITED
+not be used in advertising or publicity pertaining to distribution
+of the software without specific, written prior permission.
+FUJITSU LIMITED makes no representations about the suitability of
+this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL FUJITSU LIMITED 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.
+
+  Author: Takashi Fujiwara     FUJITSU LIMITED
+                               fujiwara@a80.tech.yk.fujitsu.co.jp
+
+******************************************************************/
+
+#ifndef _XIMPROTO_H
+#define _XIMPROTO_H
+
+/*
+ * Default Preconnection selection target
+ */
+#define XIM_SERVERS            "XIM_SERVERS"
+#define XIM_LOCALES            "LOCALES"
+#define XIM_TRANSPORT          "TRANSPORT"
+
+/*
+ * categories in XIM_SERVERS
+ */
+#define XIM_SERVER_CATEGORY    "@server="
+#define XIM_LOCAL_CATEGORY     "@locale="
+#define XIM_TRANSPORT_CATEGORY "@transport="
+
+/*
+ * Xim implementation revision
+ */
+#define PROTOCOLMAJORVERSION           1
+#define PROTOCOLMINORVERSION           0
+
+/*
+ * Major Protocol number
+ */
+#define        XIM_CONNECT                       1
+#define        XIM_CONNECT_REPLY                 2
+#define        XIM_DISCONNECT                    3
+#define        XIM_DISCONNECT_REPLY              4
+
+#define XIM_AUTH_REQUIRED               10
+#define XIM_AUTH_REPLY                  11
+#define XIM_AUTH_NEXT                   12
+#define XIM_AUTH_SETUP                  13
+#define XIM_AUTH_NG                     14
+
+#define        XIM_ERROR                        20
+
+#define        XIM_OPEN                         30
+#define        XIM_OPEN_REPLY                   31
+#define        XIM_CLOSE                        32
+#define        XIM_CLOSE_REPLY                  33
+#define        XIM_REGISTER_TRIGGERKEYS         34
+#define        XIM_TRIGGER_NOTIFY               35
+#define        XIM_TRIGGER_NOTIFY_REPLY         36
+#define        XIM_SET_EVENT_MASK               37
+#define        XIM_ENCODING_NEGOTIATION         38
+#define        XIM_ENCODING_NEGOTIATION_REPLY   39
+#define        XIM_QUERY_EXTENSION              40
+#define        XIM_QUERY_EXTENSION_REPLY        41
+#define        XIM_SET_IM_VALUES                42
+#define        XIM_SET_IM_VALUES_REPLY          43
+#define        XIM_GET_IM_VALUES                44
+#define        XIM_GET_IM_VALUES_REPLY          45
+
+#define XIM_CREATE_IC                   50
+#define        XIM_CREATE_IC_REPLY              51
+#define        XIM_DESTROY_IC                   52
+#define        XIM_DESTROY_IC_REPLY             53
+#define XIM_SET_IC_VALUES               54
+#define        XIM_SET_IC_VALUES_REPLY          55
+#define XIM_GET_IC_VALUES               56
+#define XIM_GET_IC_VALUES_REPLY                 57
+#define        XIM_SET_IC_FOCUS                 58
+#define        XIM_UNSET_IC_FOCUS               59
+#define        XIM_FORWARD_EVENT                60
+#define        XIM_SYNC                         61
+#define        XIM_SYNC_REPLY                   62
+#define        XIM_COMMIT                       63
+#define        XIM_RESET_IC                     64
+#define        XIM_RESET_IC_REPLY               65
+
+#define        XIM_GEOMETRY                     70
+#define        XIM_STR_CONVERSION               71
+#define        XIM_STR_CONVERSION_REPLY         72
+#define        XIM_PREEDIT_START                73
+#define        XIM_PREEDIT_START_REPLY          74
+#define        XIM_PREEDIT_DRAW                 75
+#define        XIM_PREEDIT_CARET                76
+#define XIM_PREEDIT_CARET_REPLY                 77
+#define        XIM_PREEDIT_DONE                 78
+#define        XIM_STATUS_START                 79
+#define        XIM_STATUS_DRAW                  80
+#define        XIM_STATUS_DONE                  81
+#define        XIM_PREEDITSTATE                 82
+
+/*
+ * values for the flag of XIM_ERROR
+ */
+#define        XIM_IMID_VALID                  0x0001
+#define        XIM_ICID_VALID                  0x0002
+
+/*
+ * XIM Error Code
+ */
+#define XIM_BadAlloc                   1
+#define XIM_BadStyle                   2
+#define XIM_BadClientWindow            3
+#define XIM_BadFocusWindow             4
+#define XIM_BadArea                    5
+#define XIM_BadSpotLocation            6
+#define XIM_BadColormap                        7
+#define XIM_BadAtom                    8
+#define XIM_BadPixel                   9
+#define XIM_BadPixmap                  10
+#define XIM_BadName                    11
+#define XIM_BadCursor                  12
+#define XIM_BadProtocol                        13
+#define XIM_BadForeground              14
+#define XIM_BadBackground              15
+#define XIM_LocaleNotSupported         16
+#define XIM_BadSomething               999
+
+/*
+ * byte order
+ */
+#define BIGENDIAN      (CARD8)0x42     /* MSB first */
+#define LITTLEENDIAN   (CARD8)0x6c     /* LSB first */
+
+/*
+ * values for the type of XIMATTR & XICATTR
+ */
+#define        XimType_SeparatorOfNestedList   0
+#define        XimType_CARD8                   1
+#define        XimType_CARD16                  2
+#define        XimType_CARD32                  3
+#define        XimType_STRING8                 4
+#define        XimType_Window                  5
+#define        XimType_XIMStyles               10
+#define        XimType_XRectangle              11
+#define        XimType_XPoint                  12
+#define XimType_XFontSet               13
+#define XimType_XIMOptions             14
+#define XimType_XIMHotKeyTriggers      15
+#define XimType_XIMHotKeyState         16
+#define XimType_XIMStringConversion    17
+#define        XimType_NEST                    0x7fff
+
+/*
+ * values for the category of XIM_ENCODING_NEGITIATON_REPLY
+ */
+#define        XIM_Encoding_NameCategory       0
+#define        XIM_Encoding_DetailCategory     1
+
+/*
+ * value for the index of XIM_ENCODING_NEGITIATON_REPLY
+ */
+#define        XIM_Default_Encoding_IDX        -1
+
+/*
+ * value for the flag of XIM_FORWARD_EVENT, XIM_COMMIT
+ */
+#define XimSYNCHRONUS            0x0001
+#define XimLookupChars           0x0002
+#define XimLookupKeySym                  0x0004
+#define XimLookupBoth            0x0006
+
+/*
+ * request packet header size
+ */
+#define XIM_HEADER_SIZE                                                \
+         sizeof(CARD8)         /* sizeof mejor-opcode */       \
+       + sizeof(CARD8)         /* sizeof minor-opcode */       \
+       + sizeof(INT16)         /* sizeof length */
+
+/*
+ * Client Message data size
+ */
+#define        XIM_CM_DATA_SIZE        20
+
+/*
+ * XIM data structure
+ */
+typedef CARD16 BITMASK16;
+typedef CARD32 BITMASK32;
+typedef CARD32 EVENTMASK;
+
+typedef CARD16 XIMID;          /* Input Method ID */
+typedef CARD16 XICID;          /* Input Context ID */
+
+/*
+ * Padding macro
+ */
+#define        XIM_PAD(length) ((4 - ((length) % 4)) % 4)
+
+#define XIM_SET_PAD(ptr, length)                                       \
+    {                                                                  \
+       register int     Counter = XIM_PAD((int)length);                \
+       if (Counter) {                                                  \
+           register char       *Ptr = (char *)(ptr) + (length);        \
+           length += Counter;                                          \
+           for (; Counter; --Counter, ++Ptr)                           \
+               *Ptr = '\0';                                            \
+       }                                                               \
+    }
+
+#endif /* _XIMPROTO_H */
diff --git a/src/xlibi18n/XimThai.h b/src/xlibi18n/XimThai.h
new file mode 100644 (file)
index 0000000..e4c476c
--- /dev/null
@@ -0,0 +1,110 @@
+/***********************************************************
+
+Copyright 1993, 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 1993 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.
+
+******************************************************************/
+
+/*
+**++
+**  FACILITY:
+**
+**      Xlib
+**
+**  ABSTRACT:
+**
+**      Definition file for Thai specific functions.
+**
+**  MODIFICATION HISTORY:
+**
+**/
+
+#ifndef _XIMTHAI_H_
+#define _XIMTHAI_H_
+
+#include <X11/Xlib.h>
+
+/* Classification of characters in TIS620 according to WTT */
+
+#define CTRL    0   /* control chars */
+#define NON     1   /* non composibles */
+#define CONS    2   /* consonants */
+#define LV      3   /* leading vowels */
+#define FV1     4   /* following vowels */
+#define FV2     5
+#define FV3     6
+#define BV1     7   /* below vowels */
+#define BV2     8
+#define BD      9   /* below diacritics */
+#define TONE    10  /* tonemarks */
+#define AD1     11  /* above diacritics */
+#define AD2     12
+#define AD3     13
+#define AV1     14  /* above vowels */
+#define AV2     15
+#define AV3     16
+
+
+/* extended classification */
+
+#define DEAD    17  /* group of non-spacing characters */
+
+
+/* display levels in display cell */
+
+#define NONDISP 0   /* non displayable */
+#define TOP     1
+#define ABOVE   2
+#define BASE    3
+#define BELOW   4
+
+
+/* Input Sequence Check modes */
+
+#define WTT_ISC1        1   /* WTT default ISC mode */
+#define WTT_ISC2        2   /* WTT strict ISC mode */
+#define THAICAT_ISC     3   /* THAICAT ISC mode */
+#define NOISC        255   /* No ISC */
+
+
+#endif /* _XIMTHAI_H_ */
diff --git a/src/xlibi18n/XimTrInt.h b/src/xlibi18n/XimTrInt.h
new file mode 100644 (file)
index 0000000..a08ac03
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * Copyright 1992 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 1993, 1994 by FUJITSU LIMITED
+
+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 FUJITSU LIMITED
+not be used in advertising or publicity pertaining to distribution
+of the software without specific, written prior permission.
+FUJITSU LIMITED makes no representations about the suitability of
+this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL FUJITSU LIMITED 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.
+
+  Author: Hideki Hiura (hhiura@Sun.COM) Sun Microsystems, Inc.
+         Takashi Fujiwara     FUJITSU LIMITED
+                              fujiwara@a80.tech.yk.fujitsu.co.jp
+
+******************************************************************/
+
+#ifndef _XIMTRINT_H
+#define _XIMTRINT_H
+
+#include "Ximint.h"
+
+typedef struct {
+    const char *transportname;
+    Bool        (*config)(
+                       Xim,
+                       char *
+    );
+} TransportSW;
+
+extern TransportSW _XimTransportRec[];
+
+/*
+ * Global symbols
+ */
+
+extern Bool    _XimXConf(
+    Xim                 im,
+    char       *address
+);
+
+#if defined(TCPCONN) || defined(UNIXCONN) || defined(DNETCONN) || defined(STREAMSCONN)
+
+extern Bool    _XimTransConf(
+    Xim                 im,
+    char       *address
+);
+
+#endif
+
+#endif /* _XIMTRINT_H */
diff --git a/src/xlibi18n/XimTrX.h b/src/xlibi18n/XimTrX.h
new file mode 100644 (file)
index 0000000..198d5fa
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * Copyright 1992 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 1992, 1993, 1994 by FUJITSU LIMITED
+
+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 FUJITSU LIMITED
+not be used in advertising or publicity pertaining to distribution
+of the software without specific, written prior permission.
+FUJITSU LIMITED makes no representations about the suitability of
+this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL FUJITSU LIMITED 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.
+
+  Author: Hideki Hiura (hhiura@Sun.COM) Sun Microsystems, Inc.
+          Takashi Fujiwara     FUJITSU LIMITED
+                               fujiwara@a80.tech.yk.fujitsu.co.jp
+
+******************************************************************/
+
+#ifndef _XIMTRX_H
+#define _XIMTRX_H
+
+typedef struct _XIntrCallbackRec       *XIntrCallbackPtr;
+
+typedef struct _XIntrCallbackRec {
+    Bool                (*func)(
+                                Xim, INT16, XPointer, XPointer
+);
+    XPointer            call_data;
+    XIntrCallbackPtr    next;
+} XIntrCallbackRec ;
+
+typedef struct _XSpecRec {
+    XIntrCallbackPtr    intr_cb;
+    Atom                imconnectid;
+    Atom                improtocolid;
+    Atom                immoredataid;
+    Window              lib_connect_wid;
+    Window              ims_connect_wid;
+    XPointer            ev;
+    CARD32              major_code;
+    CARD32              minor_code;
+    CARD32              BoundarySize;
+} XSpecRec;
+
+#define _XIM_PROTOCOL          "_XIM_PROTOCOL"
+#define _XIM_XCONNECT          "_XIM_XCONNECT"
+#define _XIM_MOREDATA          "_XIM_MOREDATA"
+
+#define MAJOR_TRANSPORT_VERSION         0
+#define MINOR_TRANSPORT_VERSION         0
+
+#endif /* _XIMTRX_H */
diff --git a/src/xlibi18n/XimTrans.h b/src/xlibi18n/XimTrans.h
new file mode 100644 (file)
index 0000000..8c3aa82
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * Copyright 1992 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 1992, 1993, 1994 by FUJITSU LIMITED
+
+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 FUJITSU LIMITED
+not be used in advertising or publicity pertaining to distribution
+of the software without specific, written prior permission.
+FUJITSU LIMITED makes no representations about the suitability of
+this software for any purpose.
+It is provided "as is" without express or implied warranty.
+
+FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL FUJITSU LIMITED 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.
+
+  Author: Hideki Hiura (hhiura@Sun.COM) Sun Microsystems, Inc.
+          Takashi Fujiwara     FUJITSU LIMITED
+                               fujiwara@a80.tech.yk.fujitsu.co.jp
+
+******************************************************************/
+
+#ifndef _XIMTRANS_H
+#define _XIMTRANS_H
+
+typedef struct _TransIntrCallbackRec   *TransIntrCallbackPtr;
+
+typedef struct _TransIntrCallbackRec {
+    Bool                       (*func)(
+                                       Xim, INT16, XPointer, XPointer
+                                       );
+    XPointer                    call_data;
+    TransIntrCallbackPtr        next;
+} TransIntrCallbackRec ;
+
+typedef struct {
+    TransIntrCallbackPtr        intr_cb;
+    struct _XtransConnInfo     *trans_conn; /* transport connection object */
+    int                                 fd;
+    char                       *address;
+    Window                      window;
+    Bool                        is_putback;
+} TransSpecRec;
+
+
+/*
+ * Prototypes
+ */
+
+extern Bool _XimTransRegisterDispatcher(
+    Xim                 im,
+    Bool        (*callback)(
+                            Xim, INT16, XPointer, XPointer
+                            ),
+    XPointer    call_data
+);
+
+
+extern Bool _XimTransIntrCallback(
+    Xim                 im,
+    Bool        (*callback)(
+                            Xim, INT16, XPointer, XPointer
+                            ),
+    XPointer    call_data
+);
+
+extern Bool _XimTransCallDispatcher(
+    Xim                 im,
+    INT16       len,
+    XPointer    data
+);
+
+extern void _XimFreeTransIntrCallback(
+    Xim                 im
+);
+
+extern Bool _XimTransFilterWaitEvent(
+    Display    *d,
+    Window      w,
+    XEvent     *ev,
+    XPointer    arg
+);
+
+extern void _XimTransInternalConnection(
+    Display    *d,
+    int                 fd,
+    XPointer    arg
+);
+
+extern Bool _XimTransWrite(
+    Xim                 im,
+    INT16       len,
+    XPointer    data
+);
+
+extern Bool _XimTransRead(
+    Xim                 im,
+    XPointer    recv_buf,
+    int                 buf_len,
+    int                *ret_len
+);
+
+extern void _XimTransFlush(
+    Xim                 im
+);
+
+#endif /* _XIMTRANS__H */
diff --git a/src/xlibi18n/Ximint.h b/src/xlibi18n/Ximint.h
new file mode 100644 (file)
index 0000000..2fd3017
--- /dev/null
@@ -0,0 +1,998 @@
+/******************************************************************
+
+                Copyright 1992, 1993, 1994 by FUJITSU LIMITED
+                Copyright 1993, 1994 by Sony Corporation
+
+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 FUJITSU LIMITED and
+Sony Corporation not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.  FUJITSU LIMITED and Sony Corporation makes no
+representations about the suitability of this software for any
+purpose.  It is provided "as is" without express or implied warranty.
+
+FUJITSU LIMITED AND SONY CORPORATION DISCLAIM ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL FUJITSU LIMITED AND
+SONY CORPORATION 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.
+
+  Author:   Takashi Fujiwara   FUJITSU LIMITED
+                               fujiwara@a80.tech.yk.fujitsu.co.jp
+  Motifier: Makoto Wakamatsu   Sony Corporation
+                              makoto@sm.sony.co.jp
+
+******************************************************************/
+
+#ifndef _XIMINT_H
+#define _XIMINT_H
+
+#include <stdio.h>
+#include <X11/Xutil.h>
+
+#define Public /**/
+#define Private static
+
+typedef struct _Xim    *Xim;
+typedef struct _Xic    *Xic;
+
+/*
+ * Input Method data
+ */
+#include "XimintP.h"
+#include "XimintL.h"
+
+/*
+ * XIM dependent data
+ */
+
+typedef struct _XimCommonPrivateRec {
+    /* This struct is also inlined in XimLocalPrivateRec, XimProtoPrivateRec. */
+    XlcConv            ctom_conv;
+    XlcConv            ctow_conv;
+    XlcConv            ctoutf8_conv;
+    XlcConv            cstomb_conv;
+    XlcConv            cstowc_conv;
+    XlcConv            cstoutf8_conv;
+    XlcConv            ucstoc_conv;
+    XlcConv            ucstoutf8_conv;
+} XimCommonPrivateRec;
+
+typedef union _XIMPrivateRec {
+    XimCommonPrivateRec  common;
+    XimLocalPrivateRec   local;
+    XimProtoPrivateRec   proto;
+} XIMPrivateRec;
+
+/*
+ * IM struct
+ */
+typedef struct _Xim {
+    XIMMethods         methods;
+    XIMCoreRec         core;
+    XIMPrivateRec      private;
+} XimRec;
+
+/*
+ * IC deprndent data
+ */
+typedef union _XICPrivateRec {
+    XicLocalPrivateRec   local;
+    XicProtoPrivateRec   proto;
+} XICPrivateRec;
+
+/*
+ * IC struct
+ */
+typedef struct _Xic {
+       XICMethods      methods;
+       XICCoreRec      core;
+       XICPrivateRec   private;
+} XicRec;
+
+typedef struct _XimDefIMValues {
+       XIMValuesList           *im_values_list;
+       XIMValuesList           *ic_values_list;
+       XIMStyles               *styles;
+       XIMCallback              destroy_callback;
+       char                    *res_name;
+       char                    *res_class;
+       Bool                     visible_position;
+} XimDefIMValues;
+
+typedef struct _XimDefICValues {
+    XIMStyle                    input_style;
+    Window                      client_window;
+    Window                      focus_window;
+    unsigned long               filter_events;
+    XICCallback                         geometry_callback;
+    char                       *res_name;
+    char                       *res_class;
+    XICCallback                         destroy_callback;
+    XICCallback                         preedit_state_notify_callback;
+    XICCallback                         string_conversion_callback;
+    XIMStringConversionText     string_conversion;
+    XIMResetState               reset_state;
+    XIMHotKeyTriggers          *hotkey;
+    XIMHotKeyState              hotkey_state;
+    ICPreeditAttributes                 preedit_attr;
+    ICStatusAttributes          status_attr;
+} XimDefICValues;
+
+#define XIM_MODE_IM_GET                (1 << 0)
+#define XIM_MODE_IM_SET                (1 << 1)
+#define XIM_MODE_IM_DEFAULT    (1 << 2)
+
+#define XIM_MODE_PRE_GET       (1 << 0)
+#define XIM_MODE_PRE_SET       (1 << 1)
+#define XIM_MODE_PRE_CREATE    (1 << 2)
+#define XIM_MODE_PRE_ONCE      (1 << 3)
+#define XIM_MODE_PRE_DEFAULT   (1 << 4)
+
+#define XIM_MODE_STS_GET       (1 << 5)
+#define XIM_MODE_STS_SET       (1 << 6)
+#define XIM_MODE_STS_CREATE    (1 << 7)
+#define XIM_MODE_STS_ONCE      (1 << 8)
+#define XIM_MODE_STS_DEFAULT   (1 << 9)
+
+#define XIM_MODE_IC_GET                (XIM_MODE_PRE_GET      | XIM_MODE_STS_GET)
+#define XIM_MODE_IC_SET                (XIM_MODE_PRE_SET      | XIM_MODE_STS_SET)
+#define XIM_MODE_IC_CREATE     (XIM_MODE_PRE_CREATE   | XIM_MODE_STS_CREATE)
+#define XIM_MODE_IC_ONCE       (XIM_MODE_PRE_ONCE     | XIM_MODE_STS_ONCE)
+#define XIM_MODE_IC_DEFAULT    (XIM_MODE_PRE_DEFAULT  | XIM_MODE_STS_DEFAULT)
+
+#define XIM_MODE_PRE_MASK      (XIM_MODE_PRE_GET    | XIM_MODE_PRE_SET    | \
+                                XIM_MODE_PRE_CREATE | XIM_MODE_PRE_ONCE   | \
+                                XIM_MODE_PRE_DEFAULT)
+#define XIM_MODE_STS_MASK      (XIM_MODE_STS_GET    | XIM_MODE_STS_SET    | \
+                                XIM_MODE_STS_CREATE | XIM_MODE_STS_ONCE   | \
+                                XIM_MODE_STS_DEFAULT)
+
+#define XIM_SETIMDEFAULTS      (1L << 0)
+#define XIM_SETIMVALUES                (1L << 1)
+#define XIM_GETIMVALUES                (1L << 2)
+
+#define XIM_SETICDEFAULTS      (1L << 0)
+#define XIM_CREATEIC           (1L << 1)
+#define XIM_SETICVALUES                (1L << 2)
+#define XIM_GETICVALUES                (1L << 3)
+#define XIM_PREEDIT_ATTR       (1L << 4)
+#define XIM_STATUS_ATTR                (1L << 5)
+
+#define XIM_CHECK_VALID                0
+#define XIM_CHECK_INVALID      1
+#define XIM_CHECK_ERROR                2
+
+#define FILTERD         True
+#define NOTFILTERD      False
+
+#define XIMMODIFIER            "@im="
+
+#define        XIM_TRUE        True
+#define        XIM_FALSE       False
+#define        XIM_OVERFLOW    (-1)
+
+#define BRL_UC_ROW     0x2800
+
+/*
+ * Global symbols
+ */
+
+XPointer _XimGetLocaleCode (
+    const char *encoding_name
+);
+
+int _XimGetCharCode (
+    XPointer           conv,
+    KeySym             keysym,
+    unsigned char      *buf,
+    int                        nbytes
+);
+
+unsigned int KeySymToUcs4 (
+    KeySym             keysym
+);
+
+extern Bool _XimSetIMResourceList(
+    XIMResourceList    *res_list,
+    unsigned int       *list_num
+);
+
+extern Bool _XimSetICResourceList(
+    XIMResourceList    *res_list,
+    unsigned int       *list_num
+);
+
+extern Bool _XimSetInnerIMResourceList(
+    XIMResourceList    *res_list,
+    unsigned int       *list_num
+);
+
+extern Bool _XimSetInnerICResourceList(
+    XIMResourceList    *res_list,
+    unsigned int       *list_num
+);
+
+extern Bool _XimCheckCreateICValues(
+    XIMResourceList     res_list,
+    unsigned int        list_num
+);
+
+extern XIMResourceList _XimGetResourceListRec(
+    XIMResourceList     res_list,
+    unsigned int        list_num,
+    const char         *name
+);
+
+extern void _XimSetIMMode(
+    XIMResourceList     res_list,
+    unsigned int        list_num
+);
+
+extern void _XimSetICMode(
+    XIMResourceList     res_list,
+    unsigned int        list_num,
+    XIMStyle            style
+);
+
+extern int _XimCheckIMMode(
+    XIMResourceList     res_list,
+    unsigned long       mode
+);
+
+extern int _XimCheckICMode(
+    XIMResourceList     res_list,
+    unsigned long       mode
+);
+
+extern Bool _XimSetLocalIMDefaults(
+    Xim                         im,
+    XPointer            top,
+    XIMResourceList     res_list,
+    unsigned int        list_num
+);
+
+extern Bool _XimSetICDefaults(
+    Xic                         ic,
+    XPointer            top,
+    unsigned long       mode,
+    XIMResourceList     res_list,
+    unsigned int        list_num
+);
+
+extern Bool _XimEncodeLocalIMAttr(
+    XIMResourceList     res,
+    XPointer            top,
+    XPointer            val
+);
+
+extern Bool _XimEncodeLocalICAttr(
+    Xic                         ic,
+    XIMResourceList     res,
+    XPointer            top,
+    XIMArg             *arg,
+    unsigned long       mode
+);
+
+extern Bool _XimCheckLocalInputStyle(
+    Xic                         ic,
+    XPointer            top,
+    XIMArg             *values,
+    XIMStyles           *styles,
+    XIMResourceList     res_list,
+    unsigned int        list_num
+);
+
+extern Bool _XimDecodeLocalIMAttr(
+    XIMResourceList     res,
+    XPointer            top,
+    XPointer            val
+);
+
+extern Bool _XimDecodeLocalICAttr(
+    XIMResourceList     res,
+    XPointer            top,
+    XPointer            val,
+    unsigned long      mode
+);
+
+extern void _XimGetCurrentIMValues(
+    Xim                         im,
+    XimDefIMValues     *im_values
+);
+
+extern void _XimSetCurrentIMValues(
+    Xim                         im,
+    XimDefIMValues     *im_values
+);
+
+extern void _XimGetCurrentICValues(
+    Xic                         ic,
+    XimDefICValues     *ic_values
+);
+
+extern void _XimSetCurrentICValues(
+    Xic                         ic,
+    XimDefICValues     *ic_values
+);
+
+extern void _XimInitialResourceInfo(
+    void
+);
+
+extern void     _XimParseStringFile(
+    FILE        *fp,
+    Xim          im
+);
+
+extern Bool     _XimCheckIfLocalProcessing(
+    Xim                 im
+);
+
+extern Bool     _XimCheckIfThaiProcessing(
+    Xim                 im
+);
+
+extern Bool     _XimLocalOpenIM(
+    Xim                 im
+);
+
+extern Bool     _XimThaiOpenIM(
+    Xim                 im
+);
+
+extern Bool     _XimProtoOpenIM(
+    Xim                 im
+);
+
+extern void     _XimLocalIMFree(
+    Xim                 im
+);
+
+extern void     _XimThaiIMFree(
+    Xim                 im
+);
+
+extern void     _XimProtoIMFree(
+    Xim                 im
+);
+
+extern char *   _XimSetIMValueData(
+    Xim                         im,
+    XPointer            top,
+    XIMArg             *arg,
+    XIMResourceList     res_list,
+    unsigned int        list_num
+);
+
+extern char *   _XimGetIMValueData(
+    Xim                         im,
+    XPointer            top,
+    XIMArg             *arg,
+    XIMResourceList     res_list,
+    unsigned int        list_num
+);
+
+extern char *   _XimSetICValueData(
+    Xic                         ic,
+    XPointer            top,
+    XIMResourceList     res_list,
+    unsigned int        list_num,
+    XIMArg             *arg,
+    unsigned long       mode,
+    Bool                flag
+);
+
+extern char *   _XimGetICValueData(
+    Xic                         ic,
+    XPointer            top,
+    XIMResourceList     res_list,
+    unsigned int        list_num,
+    XIMArg             *arg,
+    unsigned long       mode
+);
+
+extern char *   _XimLocalSetIMValues(
+    XIM                 im,
+    XIMArg     *arg
+);
+
+extern char *   _XimLocalGetIMValues(
+    XIM                 im,
+    XIMArg     *arg
+);
+
+extern XIC      _XimLocalCreateIC(
+    XIM                 im,
+    XIMArg     *arg
+);
+
+extern Bool    _XimDispatchInit(
+    Xim                 im
+);
+
+extern Bool     _XimGetAttributeID(
+    Xim                 im,
+    CARD16     *buf
+);
+
+extern Bool     _XimExtension(
+    Xim                 im
+);
+
+extern void    _XimDestroyIMStructureList(
+    Xim                 im
+);
+
+extern char *  _XimMakeIMAttrIDList(
+    Xim                         im,
+    XIMResourceList     res_list,
+    unsigned int        res_num,
+    XIMArg             *arg,
+    CARD16             *buf,
+    INT16              *len,
+    unsigned long        mode
+);
+
+extern char *  _XimMakeICAttrIDList(
+    Xic                  ic,
+    XIMResourceList     res_list,
+    unsigned int        res_num,
+    XIMArg             *arg,
+    CARD16             *idList,
+    INT16              *num,
+    unsigned long       mode
+);
+
+extern char *  _XimDecodeIMATTRIBUTE(
+    Xim                         im,
+    XIMResourceList     res_list,
+    unsigned int        res_num,
+    CARD16             *buf,
+    INT16               buf_len,
+    XIMArg             *arg,
+    BITMASK32           mode
+);
+
+extern char *  _XimDecodeICATTRIBUTE(
+    Xic                         ic,
+    XIMResourceList     res_list,
+    unsigned int        res_num,
+    CARD16             *buf,
+    INT16               buf_len,
+    XIMArg             *arg,
+    BITMASK32           mode
+);
+
+extern Bool    _XimRegProtoIntrCallback(
+    Xim                 im,
+    CARD16      major_code,
+    CARD16      minor_code,
+    Bool        (*proc)(
+                       Xim, INT16, XPointer, XPointer
+                       ),
+    XPointer    call_data
+);
+
+extern Bool    _XimErrorCallback(
+    Xim                 im,
+    INT16       len,
+    XPointer    data,
+    XPointer    call_data
+);
+
+extern Bool    _XimError(
+    Xim                 im,
+    Xic                 ic,
+    CARD16      error_code,
+    INT16       detail_length,
+    CARD16      type,
+    char       *detail
+);
+
+extern Bool    _XimRegisterTriggerKeysCallback(
+    Xim                 im,
+    INT16       len,
+    XPointer    data,
+    XPointer    call_data
+);
+
+extern Bool    _XimSetEventMaskCallback(
+    Xim                 im,
+    INT16       len,
+    XPointer    data,
+    XPointer    call_data
+);
+
+extern Bool    _XimForwardEventCallback(
+    Xim                 im,
+    INT16       len,
+    XPointer    data,
+    XPointer    call_data
+);
+
+extern Bool    _XimCommitCallback(
+    Xim                 im,
+    INT16       len,
+    XPointer    data,
+    XPointer    call_data
+);
+
+extern Bool    _XimSyncCallback(
+    Xim                 im,
+    INT16       len,
+    XPointer    data,
+    XPointer    call_data
+);
+
+extern void    _XimFreeProtoIntrCallback(
+    Xim                 im
+);
+
+extern XIC      _XimProtoCreateIC(
+    XIM                 im,
+    XIMArg     *arg
+);
+
+extern void    _XimRegisterServerFilter(
+    Xim                 im
+);
+
+extern void    _XimUnregisterServerFilter(
+    Xim                 im
+);
+
+extern Bool    _XimTriggerNotify(
+    Xim                 im,
+    Xic                 ic,
+    int                 mode,
+    CARD32      idx
+);
+
+extern Bool    _XimProcSyncReply(
+    Xim                 im,
+    Xic                 ic
+);
+
+extern void    _XimSendSetFocus(
+    Xim                 im,
+    Xic                 ic
+);
+
+extern Bool    _XimForwardEvent(
+    Xic                 ic,
+    XEvent     *ev,
+    Bool        sync
+);
+
+extern void    _XimFreeRemakeArg(
+    XIMArg     *arg
+);
+
+extern void    _XimServerDestroy(
+    Xim                        im
+);
+
+extern char *  _XimEncodeIMATTRIBUTE(
+    Xim                          im,
+    XIMResourceList      res_list,
+    unsigned int         res_num,
+    XIMArg               *arg,
+    XIMArg             **arg_ret,
+    char                *buf,
+    int                          size,
+    int                         *ret_len,
+    XPointer             top,
+    unsigned long        mode
+);
+
+extern char *  _XimEncodeICATTRIBUTE(
+    Xic                          ic,
+    XIMResourceList      res_list,
+    unsigned int         res_num,
+    XIMArg               *arg,
+    XIMArg             **arg_ret,
+    char                *buf,
+    int                          size,
+    int                         *ret_len,
+    XPointer             top,
+    BITMASK32           *flag,
+    unsigned long        mode
+);
+
+#ifdef EXT_MOVE
+extern Bool    _XimExtenMove(
+    Xim                 im,
+    Xic                 ic,
+    CARD32      flag,
+    CARD16     *buf,
+    INT16       length
+);
+#endif
+
+extern int     _Ximctstombs(
+    XIM                 im,
+    char       *from,
+    int                 from_len,
+    char       *to,
+    int                 to_len,
+    Status     *state
+);
+
+extern int     _Ximctstowcs(
+    XIM                 im,
+    char       *from,
+    int                 from_len,
+    wchar_t    *to,
+    int                 to_len,
+    Status     *state
+);
+
+extern int     _Ximctstoutf8(
+    XIM                 im,
+    char       *from,
+    int                 from_len,
+    char       *to,
+    int                 to_len,
+    Status     *state
+);
+
+extern int     _XimLcctstombs(
+    XIM                 im,
+    char       *from,
+    int                 from_len,
+    char       *to,
+    int                 to_len,
+    Status     *state
+);
+
+extern int     _XimLcctstowcs(
+    XIM                 im,
+    char       *from,
+    int                 from_len,
+    wchar_t    *to,
+    int                 to_len,
+    Status     *state
+);
+
+extern int     _XimLcctstoutf8(
+    XIM                 im,
+    char       *from,
+    int                 from_len,
+    char       *to,
+    int                 to_len,
+    Status     *state
+);
+
+extern char _XimGetMyEndian(
+    void
+);
+
+extern int     _XimCheckDataSize(
+    XPointer    buf,
+    int                 len
+);
+
+extern void    _XimSetHeader(
+    XPointer    buf,
+    CARD8       major_opcode,
+    CARD8       minor_opcode,
+    INT16      *len
+);
+
+extern Bool    _XimSync(
+    Xim                 im,
+    Xic                 ic
+);
+
+extern int     _XimProtoMbLookupString(
+    XIC                 xic,
+    XKeyEvent  *ev,
+    char       *buffer,
+    int                 bytes,
+    KeySym     *keysym,
+    Status     *state
+);
+
+extern int     _XimProtoWcLookupString(
+    XIC                 xic,
+    XKeyEvent  *ev,
+    wchar_t    *buffer,
+    int                 bytes,
+    KeySym     *keysym,
+    Status     *state
+);
+
+extern int     _XimProtoUtf8LookupString(
+    XIC                 xic,
+    XKeyEvent  *ev,
+    char       *buffer,
+    int                 bytes,
+    KeySym     *keysym,
+    Status     *state
+);
+
+extern void    _XimRegisterFilter(
+    Xic                 ic
+);
+
+extern void    _XimUnregisterFilter(
+    Xic                 ic
+);
+
+extern void    _XimReregisterFilter(
+    Xic                 ic
+);
+
+extern Status  _XimProtoEventToWire(
+    XEvent     *re,
+    xEvent     *event,
+    Bool       sw
+);
+
+extern Bool    _XimProtoWireToEvent(
+    XEvent     *re,
+    xEvent     *event,
+    Bool        sw
+);
+
+#ifdef EXT_FORWARD
+extern Bool    _XimExtForwardKeyEvent(
+    Xic                 ic,
+    XKeyEvent  *ev,
+    Bool        sync
+);
+#endif
+
+extern int     _XimLookupMBText(
+    Xic                         ic,
+    XKeyEvent          *event,
+    char               *buffer,
+    int                         nbytes,
+    KeySym             *keysym,
+    XComposeStatus     *status
+);
+
+extern int     _XimLookupWCText(
+    Xic                         ic,
+    XKeyEvent          *event,
+    wchar_t            *buffer,
+    int                         nbytes,
+    KeySym             *keysym,
+    XComposeStatus     *status
+);
+
+extern int     _XimLookupUTF8Text(
+    Xic                         ic,
+    XKeyEvent          *event,
+    char               *buffer,
+    int                         nbytes,
+    KeySym             *keysym,
+    XComposeStatus     *status
+);
+
+extern EVENTMASK       _XimGetWindowEventmask(
+    Xic                 ic
+);
+
+extern Xic     _XimICOfXICID(
+    Xim                im,
+    XICID      icid
+);
+
+extern void    _XimResetIMInstantiateCallback(
+    Xim         xim
+);
+
+extern Bool    _XimRegisterIMInstantiateCallback(
+    XLCd        lcd,
+    Display    *display,
+    XrmDatabase         rdb,
+    char       *res_name,
+    char       *res_class,
+    XIDProc     callback,
+    XPointer    client_data
+);
+
+extern Bool    _XimUnRegisterIMInstantiateCallback(
+    XLCd        lcd,
+    Display    *display,
+    XrmDatabase         rdb,
+    char       *res_name,
+    char       *res_class,
+    XIDProc     callback,
+    XPointer    client_data
+);
+
+extern void    _XimFreeCommitInfo(
+    Xic                 ic
+);
+
+extern Bool    _XimConnect(
+    Xim                 im
+);
+
+extern Bool    _XimShutdown(
+    Xim                 im
+);
+
+extern Bool    _XimWrite(
+    Xim                 im,
+    INT16       len,
+    XPointer    data
+);
+
+extern Bool    _XimRead(
+    Xim                 im,
+    INT16      *len,
+    XPointer    data,
+    int                 data_len,
+    Bool        (*predicate)(
+                             Xim, INT16, XPointer, XPointer
+                             ),
+    XPointer    arg
+);
+
+extern void    _XimFlush(
+    Xim                 im
+);
+
+extern Bool    _XimFilterWaitEvent(
+    Xim                 im
+);
+
+extern void   _XimProcError(
+    Xim                im,
+    Xic                ic,
+    XPointer   data
+);
+
+#ifdef EXT_MOVE
+extern CARD32  _XimExtenArgCheck(
+    XIMArg     *arg
+);
+#endif
+
+extern Bool _XimCbDispatch(
+    Xim im,
+    INT16 len,
+    XPointer data,
+    XPointer call_data
+);
+
+extern Bool _XimLocalFilter(
+    Display            *d,
+    Window              w,
+    XEvent             *ev,
+    XPointer            client_data
+);
+
+extern XIMResourceList _XimGetResourceListRecByQuark(
+    XIMResourceList     res_list,
+    unsigned int        list_num,
+    XrmQuark            quark
+);
+
+extern Bool _XimReconnectModeCreateIC(
+    Xic                         ic
+);
+
+extern char *_XimLocalSetICValues(
+    XIC                         ic,
+    XIMArg             *values
+);
+
+extern char * _XimLocalGetICValues(
+    XIC                         ic,
+    XIMArg             *values
+);
+
+extern int _XimLocalMbLookupString(
+    XIC                         ic,
+    XKeyEvent          *ev,
+    char               *buffer,
+    int                         bytes,
+    KeySym             *keysym,
+    Status             *status
+);
+
+extern int _XimLocalWcLookupString(
+    XIC                         ic,
+    XKeyEvent          *ev,
+    wchar_t            *buffer,
+    int                         bytes,
+    KeySym             *keysym,
+    Status             *status
+);
+
+extern int _XimLocalUtf8LookupString(
+    XIC                         ic,
+    XKeyEvent          *ev,
+    char               *buffer,
+    int                         bytes,
+    KeySym             *keysym,
+    Status             *status
+);
+
+extern Bool _XimThaiFilter(
+    Display            *d,
+    Window              w,
+    XEvent             *ev,
+    XPointer            client_data
+);
+
+extern XIC _XimThaiCreateIC(
+    XIM                         im,
+    XIMArg             *values
+);
+
+extern Status _XimThaiCloseIM(
+    XIM                         xim
+);
+
+#ifdef XIM_CONNECTABLE
+extern void _XimSetProtoResource(
+    Xim im
+);
+
+extern Bool _XimConnectServer(
+    Xim im
+);
+
+extern Bool _XimDelayModeSetAttr(
+    Xim                         im
+);
+
+extern void    _XimServerReconectableDestroy(
+    void
+);
+
+extern Bool _XimReCreateIC(
+    Xic                        ic
+);
+
+extern Bool _XimEncodeSavedIMATTRIBUTE(
+    Xim                         im,
+    XIMResourceList     res_list,
+    unsigned int        res_num,
+    int                        *idx,
+    char               *buf,
+    int                         size,
+    int                        *ret_len,
+    XPointer            top,
+    unsigned long       mode
+);
+
+extern Bool _XimEncodeSavedICATTRIBUTE(
+    Xic                         ic,
+    XIMResourceList     res_list,
+    unsigned int        res_num,
+    int                        *idx,
+    char               *buf,
+    int                         size,
+    int                        *ret_len,
+    XPointer            top,
+    unsigned long       mode
+);
+#endif
+
+extern Public Bool
+_XimRegisterDispatcher(
+    Xim          im,
+    Bool         (*callback)(
+                             Xim, INT16, XPointer, XPointer
+                             ),
+    XPointer     call_data);
+
+extern Public Bool
+_XimRespSyncReply(
+    Xic          ic,
+    BITMASK16    mode);
+
+#endif /* _XIMINT_H */
diff --git a/src/xlibi18n/XimintL.h b/src/xlibi18n/XimintL.h
new file mode 100644 (file)
index 0000000..d2d9238
--- /dev/null
@@ -0,0 +1,106 @@
+/******************************************************************
+
+          Copyright 1991, 1992, 1993, 1994 by FUJITSU LIMITED
+          Copyright 1993 by Digital Equipment Corporation
+
+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 FUJITSU LIMITED and
+Digital Equipment Corporation not be used in advertising or publicity
+pertaining to distribution of the software without specific, written
+prior permission.  FUJITSU LIMITED and Digital Equipment Corporation
+makes no representations about the suitability of this software for
+any purpose.  It is provided "as is" without express or implied
+warranty.
+
+FUJITSU LIMITED AND DIGITAL EQUIPMENT CORPORATION DISCLAIM ALL
+WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+FUJITSU LIMITED AND DIGITAL EQUIPMENT CORPORATION 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.
+
+  Author:    Takashi Fujiwara     FUJITSU LIMITED
+                                         fujiwara@a80.tech.yk.fujitsu.co.jp
+  Modifier:  Franky Ling          Digital Equipment Corporation
+                                 frankyling@hgrd01.enet.dec.com
+
+******************************************************************/
+
+#ifndef _XIMINTL_H
+#define _XIMINTL_H
+
+#define        COMPOSE_FILE    "Compose"
+
+/*
+ * Data Structures for Local Processing
+ */
+typedef INT32  DTIndex;
+typedef INT32  DTCharIndex;
+typedef BITS32 DTModifier;
+
+typedef struct _DefTree {
+    DTIndex          next;
+    DTIndex          succession;       /* successive Key Sequence */
+                                       /* Key definitions */
+    DTModifier       modifier_mask;
+    DTModifier       modifier;
+    KeySym           keysym;           /* leaf only */
+    DTCharIndex      mb;
+    DTCharIndex      wc;               /* make from mb */
+    DTCharIndex      utf8;             /* make from mb */
+    KeySym           ks;
+} DefTree;
+
+typedef struct _DefTreeBase {
+    DefTree         *tree;
+    char            *mb;
+    wchar_t         *wc;
+    char            *utf8;
+    DTIndex          treeused, treesize;
+    DTCharIndex      mbused,   mbsize;
+    DTCharIndex      wcused,   wcsize;
+    DTCharIndex      utf8used, utf8size;
+} DefTreeBase;
+
+typedef struct _XimLocalPrivateRec {
+       /* The first fields are identical with XimCommonPrivateRec. */
+       XlcConv          ctom_conv;
+       XlcConv          ctow_conv;
+       XlcConv          ctoutf8_conv;
+       XlcConv          cstomb_conv;
+       XlcConv          cstowc_conv;
+       XlcConv          cstoutf8_conv;
+       XlcConv          ucstoc_conv;
+       XlcConv          ucstoutf8_conv;
+
+       XIC              current_ic;
+       DefTreeBase      base;
+       DTIndex          top;
+} XimLocalPrivateRec;
+
+typedef struct _XicThaiPart {
+       int             comp_state;
+       KeySym          keysym;
+       int             input_mode;
+} XicThaiPart;
+
+typedef struct _XicLocalPrivateRec {
+       long                     value_mask;
+       DefTreeBase              base;
+       DTIndex                  context;
+       DTIndex                  composed;
+       XicThaiPart              thai;
+
+       XIMResourceList          ic_resources;
+       unsigned int             ic_num_resources;
+
+       unsigned char            brl_pressed, brl_committing, brl_committed;
+       Time                     brl_release_start;
+} XicLocalPrivateRec;
+#endif /* _XIMINTL_H */
diff --git a/src/xlibi18n/XimintP.h b/src/xlibi18n/XimintP.h
new file mode 100644 (file)
index 0000000..14a7e6d
--- /dev/null
@@ -0,0 +1,310 @@
+/*
+ * Copyright 1991, 1992 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 1992, 1993, 1994 by FUJITSU LIMITED
+           Copyright 1993, 1994       by Sony Corporation
+
+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 FUJITSU LIMITED and Sony Corporation
+not be used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.  FUJITSU LIMITED and
+Sony Corporation makes no representations about the suitability of this
+software for any purpose.  It is provided "as is" without express or
+implied warranty.
+
+FUJITSU LIMITED AND SONY CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD
+TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS, IN NO EVENT SHALL FUJITSU LIMITED OR SONY CORPORATION 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.
+
+  Author: Hideki Hiura (hhiura@Sun.COM) Sun Microsystems, Inc.
+          Takashi Fujiwara     FUJITSU LIMITED
+                                 fujiwara@a80.tech.yk.fujitsu.co.jp
+         Makoto Wakamatsu     Sony Corporation
+                                 makoto@sm.sony.co.jp
+         Hiroyuki Miyamoto    Digital Equipment Corporation
+                                 miyamoto@jrd.dec.com
+
+******************************************************************/
+
+#ifndef _XIMINTP_H
+#define _XIMINTP_H
+
+#include "XimProto.h"
+#include "XlcPublic.h"
+
+/*
+ * for protocol layer callback function
+ */
+typedef Bool (*XimProtoIntrProc)(
+       Xim, INT16, XPointer, XPointer
+);
+typedef struct _XimProtoIntrRec {
+    XimProtoIntrProc            func;
+    CARD16                      major_code;
+    CARD16                      minor_code;
+    XPointer                    call_data;
+    struct _XimProtoIntrRec    *next;
+} XimProtoIntrRec;
+
+/*
+ * for transport layer methods
+ */
+typedef Bool (*XimTransConnectProc)(
+        Xim
+);
+typedef Bool (*XimTransShutdownProc)(
+        Xim
+);
+typedef Bool (*XimTransWriteProc)(
+        Xim, INT16, XPointer
+);
+typedef Bool (*XimTransReadProc)(
+        Xim, XPointer, int, int *
+);
+typedef void (*XimTransFlushProc)(
+        Xim
+);
+typedef Bool (*XimTransRegDispatcher)(
+        Xim, Bool (*)(Xim, INT16, XPointer, XPointer), XPointer
+);
+typedef Bool (*XimTransCallDispatcher)(
+        Xim, INT16, XPointer
+);
+
+/*
+ * private part of IM
+ */
+typedef struct _XimProtoPrivateRec {
+    /* The first fields are identical with XimCommonPrivateRec. */
+    XlcConv                     ctom_conv;
+    XlcConv                     ctow_conv;
+    XlcConv                     ctoutf8_conv;
+    XlcConv                     cstomb_conv;
+    XlcConv                     cstowc_conv;
+    XlcConv                     cstoutf8_conv;
+    XlcConv                     ucstoc_conv;
+    XlcConv                     ucstoutf8_conv;
+
+    Window                      im_window;
+    XIMID                       imid;
+    CARD16                      unused;
+    XIMStyles                  *default_styles;
+    CARD32                     *im_onkeylist;
+    CARD32                     *im_offkeylist;
+    BITMASK32                   flag;
+
+    BITMASK32                   registed_filter_event;
+    EVENTMASK                   forward_event_mask;
+    EVENTMASK                   synchronous_event_mask;
+
+    XimProtoIntrRec            *intrproto;
+    XIMResourceList             im_inner_resources;
+    unsigned int                im_num_inner_resources;
+    XIMResourceList             ic_inner_resources;
+    unsigned int                ic_num_inner_resources;
+    char                       *hold_data;
+    int                                 hold_data_len;
+    char                       *locale_name;
+    CARD16                      protocol_major_version;
+    CARD16                      protocol_minor_version;
+    XrmQuark                   *saved_imvalues;
+    int                                 num_saved_imvalues;
+
+    /*
+     * transport specific
+     */
+    XimTransConnectProc                 connect;
+    XimTransShutdownProc        shutdown;
+    XimTransWriteProc           write;
+    XimTransReadProc            read;
+    XimTransFlushProc           flush;
+    XimTransRegDispatcher       register_dispatcher;
+    XimTransCallDispatcher      call_dispatcher;
+    XPointer                    spec;
+} XimProtoPrivateRec;
+
+/*
+ * bit mask for the flag of XIMPrivateRec
+ */
+#define SERVER_CONNECTED       (1L)
+#define        DYNAMIC_EVENT_FLOW      (1L << 1)
+#define        USE_AUTHORIZATION_FUNC  (1L << 2)
+#ifdef XIM_CONNECTABLE
+#define DELAYBINDABLE          (1L << 3)
+#define RECONNECTABLE          (1L << 4)
+#endif /* XIM_CONNECTABLE */
+#define FABRICATED             (1L << 5)
+#define NEED_SYNC_REPLY                (1L << 6)
+
+/*
+ * macro for the flag of XIMPrivateRec
+ */
+#define IS_SERVER_CONNECTED(im) \
+               ((((Xim)im))->private.proto.flag & SERVER_CONNECTED)
+#define MARK_SERVER_CONNECTED(im) \
+               ((((Xim)im))->private.proto.flag |= SERVER_CONNECTED)
+#define UNMARK_SERVER_CONNECTED(im) \
+               ((((Xim)im))->private.proto.flag &= ~SERVER_CONNECTED)
+
+#define        IS_DYNAMIC_EVENT_FLOW(im) \
+               (((Xim)im)->private.proto.flag & DYNAMIC_EVENT_FLOW)
+#define        MARK_DYNAMIC_EVENT_FLOW(im) \
+               (((Xim)im)->private.proto.flag |= DYNAMIC_EVENT_FLOW)
+
+#define        IS_USE_AUTHORIZATION_FUNC(im) \
+               (((Xim)im)->private.proto.flag & USE_AUTHORIZATION_FUNC)
+#define        MARK_USE_AUTHORIZATION_FUNC(im) \
+               (((Xim)im)->private.proto.flag |= USE_AUTHORIZATION_FUNC)
+
+#ifdef XIM_CONNECTABLE
+#define IS_DELAYBINDABLE(im) \
+               (((Xim)im)->private.proto.flag & DELAYBINDABLE)
+#define MARK_DELAYBINDABLE(im) \
+               (((Xim)im)->private.proto.flag |= DELAYBINDABLE)
+
+#define IS_RECONNECTABLE(im) \
+               (((Xim)im)->private.proto.flag & RECONNECTABLE)
+#define MARK_RECONNECTABLE(im) \
+               (((Xim)im)->private.proto.flag |= RECONNECTABLE)
+
+#define IS_CONNECTABLE(im) \
+    (((Xim)im)->private.proto.flag & (DELAYBINDABLE|RECONNECTABLE))
+#define UNMAKE_CONNECTABLE(im) \
+    (((Xim)im)->private.proto.flag &= ~(DELAYBINDABLE|RECONNECTABLE))
+#endif /* XIM_CONNECTABLE */
+
+#define IS_FABRICATED(im) \
+               (((Xim)im)->private.proto.flag & FABRICATED)
+#define MARK_FABRICATED(im) \
+               (((Xim)im)->private.proto.flag |= FABRICATED)
+#define UNMARK_FABRICATED(im) \
+               (((Xim)im)->private.proto.flag &= ~FABRICATED)
+
+#define IS_NEED_SYNC_REPLY(im) \
+               (((Xim)im)->private.proto.flag & NEED_SYNC_REPLY)
+#define MARK_NEED_SYNC_REPLY(im) \
+               (((Xim)im)->private.proto.flag |= NEED_SYNC_REPLY)
+#define UNMARK_NEED_SYNC_REPLY(im) \
+               (((Xim)im)->private.proto.flag &= ~NEED_SYNC_REPLY)
+
+/*
+ * bit mask for the register_filter_event of XIMPrivateRec/XICPrivateRec
+ */
+#define KEYPRESS_MASK          (1L)
+#define KEYRELEASE_MASK                (1L << 1)
+#define DESTROYNOTIFY_MASK     (1L << 2)
+
+typedef struct _XimCommitInfoRec {
+    struct _XimCommitInfoRec   *next;
+    char                       *string;
+    int                                 string_len;
+    KeySym                     *keysym;
+    int                                 keysym_len;
+} XimCommitInfoRec, *XimCommitInfo;
+
+typedef struct _XimPendingCallback {
+    int                                 major_opcode;
+    Xim                                 im;
+    Xic                                 ic;
+    char                       *proto;
+    int                                 proto_len;
+    struct _XimPendingCallback *next;
+} XimPendingCallbackRec, *XimPendingCallback;
+
+
+/*
+ * private part of IC
+ */
+typedef struct _XicProtoPrivateRec {
+    XICID               icid;                  /* ICID         */
+    CARD16              dmy;
+    BITMASK32           flag;                  /* Input Mode   */
+
+    BITMASK32           registed_filter_event; /* registed filter mask */
+    EVENTMASK           forward_event_mask;    /* forward event mask */
+    EVENTMASK           synchronous_event_mask;/* sync event mask */
+    EVENTMASK           filter_event_mask;     /* negrect event mask */
+    EVENTMASK           intercept_event_mask;  /* deselect event mask */
+    EVENTMASK           select_event_mask;     /* select event mask */
+
+    char               *preedit_font;          /* Base font name list */
+    int                         preedit_font_length;   /* length of base font name */
+    char               *status_font;           /* Base font name list */
+    int                         status_font_length;    /* length of base font name */
+
+    XimCommitInfo       commit_info;
+    XIMResourceList     ic_resources;
+    unsigned int        ic_num_resources;
+    XIMResourceList     ic_inner_resources;
+    unsigned int        ic_num_inner_resources;
+    XrmQuark           *saved_icvalues;
+    int                         num_saved_icvalues;
+    XimPendingCallback  pend_cb_que;
+    Bool                waitCallback;
+} XicProtoPrivateRec ;
+
+/*
+ * bit mask for the flag of XICPrivateRec
+ */
+#define IC_CONNECTED           (1L)
+
+/*
+ * macro for the flag of XICPrivateRec
+ */
+#define        IS_IC_CONNECTED(ic) \
+               (((Xic)ic)->private.proto.flag & IC_CONNECTED)
+#define        MARK_IC_CONNECTED(ic) \
+               (((Xic)ic)->private.proto.flag |= IC_CONNECTED)
+#define        UNMARK_IC_CONNECTED(ic) \
+               (((Xic)ic)->private.proto.flag &= ~IC_CONNECTED)
+
+/*
+ * macro for the filter_event_mask of XICPrivateRec
+ */
+#define        IS_NEGLECT_EVENT(ic, mask) \
+               (((Xic)ic)->private.proto.filter_event_mask & (mask))
+
+/*
+ * macro for the forward_event_mask of XICPrivateRec
+ */
+#define        IS_FORWARD_EVENT(ic, mask) \
+               (((Xic)ic)->private.proto.forward_event_mask & (mask))
+
+/*
+ * macro for the synchronous_event_mask of XICPrivateRec
+ */
+#define        IS_SYNCHRONOUS_EVENT(ic, mask) \
+   ((((Xic)ic)->private.proto.synchronous_event_mask & (mask)) ? True: False)
+
+#define XIM_MAXIMNAMELEN 64
+#define XIM_MAXLCNAMELEN 64
+
+#endif /* _XIMINTP_H */
diff --git a/src/xlibi18n/XlcDL.c b/src/xlibi18n/XlcDL.c
new file mode 100644 (file)
index 0000000..75e193c
--- /dev/null
@@ -0,0 +1,612 @@
+/*
+Copyright 1985, 1986, 1987, 1991, 1998  The Open Group
+
+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
+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
+EVEN IF ADVISED IN ADVANCE OF THE POSSIBILITY OF SUCH DAMAGES.
+
+
+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 Window System is a trademark of The Open Group
+
+OSF/1, OSF/Motif and Motif are registered trademarks, and OSF, the OSF
+logo, LBX, X Window System, and Xinerama are trademarks of the Open
+Group. All other trademarks and registered trademarks mentioned herein
+are the property of their respective owners. No right, title or
+interest in or to any trademark, service mark, logo or trade name of
+Sun Microsystems, Inc. or its licensors is granted.
+
+*/
+/*
+ * Copyright 2000 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.
+ */
+
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#else
+# if defined(hpux)
+#  define HAVE_DL_H
+# else
+#  define HAVE_DLFCN_H
+# endif
+#endif
+
+#include <stdio.h>
+
+#ifdef HAVE_DL_H
+#include <dl.h>
+#endif
+
+#ifdef HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <ctype.h>
+
+#include "Xlibint.h"
+#include "XlcPublic.h"
+#include "XlcPubI.h"
+
+#define XI18N_DLREL            2
+
+#define        iscomment(ch)   ((ch) == '\0' || (ch) == '#')
+
+typedef enum {
+  XLC_OBJECT,
+  XIM_OBJECT,
+  XOM_OBJECT
+} XI18NDLType;
+
+typedef struct {
+  XI18NDLType type;
+  int  locale_name_len;
+  char *locale_name;
+  char *dl_name;
+  char *open;
+  char *im_register;
+  char *im_unregister;
+  int dl_release;
+  unsigned int refcount;
+#if defined(hpux)
+  shl_t dl_module;
+#else
+  void *dl_module;
+#endif
+} XI18NObjectsListRec, *XI18NObjectsList;
+
+#define OBJECT_INIT_LEN 8
+#define OBJECT_INC_LEN 4
+static int lc_len = 0;
+static XI18NObjectsListRec *xi18n_objects_list = NULL;
+static int lc_count = 0;
+
+static int
+parse_line(char *line, char **argv, int argsize)
+{
+    int argc = 0;
+    char *p = line;
+
+    while (argc < argsize) {
+       while (isspace(*p)) {
+           ++p;
+       }
+       if (iscomment(*p)){
+           break;
+       }
+       argv[argc++] = p;
+       while (!isspace(*p)) {
+           ++p;
+       }
+       if (iscomment(*p)) {
+           break;
+       }
+       *p++ = '\0';
+    }
+    return argc;
+}
+
+static char *
+strdup_with_underscore(const char *symbol)
+{
+       char *result;
+
+       if ((result = malloc(strlen(symbol) + 2)) == NULL)
+               return NULL;
+       result[0] = '_';
+       strcpy(result + 1, symbol);
+       return result;
+}
+
+#ifndef hpux
+static void *
+try_both_dlsym (void *handle, char *name)
+{
+    void    *ret;
+
+    ret = dlsym (handle, name);
+    if (!ret)
+    {
+        name = strdup_with_underscore (name);
+        if (name)
+        {
+            ret = dlsym (handle, name);
+            free (name);
+        }
+    }
+    return ret;
+}
+#endif
+
+static void
+resolve_object(char *path, const char *lc_name)
+{
+    char filename[BUFSIZ];
+    FILE *fp;
+    char buf[BUFSIZ];
+
+    if (lc_len == 0) { /* True only for the 1st time */
+      lc_len = OBJECT_INIT_LEN;
+      xi18n_objects_list = (XI18NObjectsList)
+         Xmalloc(sizeof(XI18NObjectsListRec) * lc_len);
+      if (!xi18n_objects_list) return;
+    }
+/*
+1266793
+Limit the length of path to prevent stack buffer corruption.
+    sprintf(filename, "%s/%s", path, "XI18N_OBJS");
+*/
+    sprintf(filename, "%.*s/%s", BUFSIZ - 12, path, "XI18N_OBJS");
+    fp = fopen(filename, "r");
+    if (fp == (FILE *)NULL){
+       return;
+    }
+
+    while (fgets(buf, BUFSIZ, fp) != NULL){
+       char *p = buf;
+       int n;
+       char *args[6];
+       while (isspace(*p)){
+           ++p;
+       }
+       if (iscomment(*p)){
+           continue;
+       }
+
+       if (lc_count == lc_len) {
+         lc_len += OBJECT_INC_LEN;
+         xi18n_objects_list = (XI18NObjectsList)
+           Xrealloc(xi18n_objects_list,
+                    sizeof(XI18NObjectsListRec) * lc_len);
+         if (!xi18n_objects_list) return;
+       }
+       n = parse_line(p, args, 6);
+
+       if (n == 3 || n == 5) {
+         if (!strcmp(args[0], "XLC")){
+           xi18n_objects_list[lc_count].type = XLC_OBJECT;
+         } else if (!strcmp(args[0], "XOM")){
+           xi18n_objects_list[lc_count].type = XOM_OBJECT;
+         } else if (!strcmp(args[0], "XIM")){
+           xi18n_objects_list[lc_count].type = XIM_OBJECT;
+         }
+         xi18n_objects_list[lc_count].dl_name = strdup(args[1]);
+         xi18n_objects_list[lc_count].open = strdup(args[2]);
+         xi18n_objects_list[lc_count].dl_release = XI18N_DLREL;
+         xi18n_objects_list[lc_count].locale_name = strdup(lc_name);
+         xi18n_objects_list[lc_count].refcount = 0;
+         xi18n_objects_list[lc_count].dl_module = (void*)NULL;
+         if (n == 5) {
+           xi18n_objects_list[lc_count].im_register = strdup(args[3]);
+           xi18n_objects_list[lc_count].im_unregister = strdup(args[4]);
+         } else {
+           xi18n_objects_list[lc_count].im_register = NULL;
+           xi18n_objects_list[lc_count].im_unregister = NULL;
+         }
+         lc_count++;
+       }
+    }
+    fclose(fp);
+}
+
+static char*
+__lc_path(const char *dl_name, const char *lc_dir)
+{
+    char *path;
+    size_t len;
+
+    /*
+     * reject this for possible security issue
+     */
+    if (strstr (dl_name, "../"))
+       return NULL;
+
+    len = (lc_dir ? strlen(lc_dir) : 0 ) +
+       (dl_name ? strlen(dl_name) : 0) + 10;
+#if defined POSTLOCALELIBDIR
+    len += (strlen(POSTLOCALELIBDIR) + 1);
+#endif
+    path = Xmalloc(len + 1);
+
+    if (strchr(dl_name, '/') != NULL) {
+       char *slash_p;
+       slash_p = strrchr(lc_dir, '/');
+       *slash_p = '\0';
+       strcpy(path, lc_dir); strcat(path, "/");
+#if defined POSTLOCALELIBDIR
+       strcat(path, POSTLOCALELIBDIR); strcat(path, "/");
+#endif
+       strcat(path, dl_name); strcat(path, ".so.2");
+       *slash_p = '/';
+    } else {
+       strcpy(path, lc_dir); strcat(path, "/");
+#if defined POSTLOCALELIBDIR
+       strcat(path, POSTLOCALELIBDIR); strcat(path, "/");
+#endif
+       strcat(path, dl_name); strcat(path, ".so.2");
+    }
+    return path;
+}
+
+/* We reference count dlopen() and dlclose() of modules; unfortunately,
+ * since XCloseIM, XCloseOM, XlcClose aren't wrapped, but directly
+ * call the close method of the object, we leak a reference count every
+ * time we open then close a module. Fixing this would require
+ * either creating proxy objects or hooks for close_im/close_om
+ * in XLCd
+ */
+static Bool
+open_object(
+     XI18NObjectsList object,
+     char *lc_dir)
+{
+  char *path;
+
+  if (object->refcount == 0) {
+      path = __lc_path(object->dl_name, lc_dir);
+      if (!path)
+         return False;
+#if defined(hpux)
+      object->dl_module = shl_load(path, BIND_DEFERRED, 0L);
+#else
+      object->dl_module = dlopen(path, RTLD_LAZY);
+#endif
+      Xfree(path);
+
+      if (!object->dl_module)
+         return False;
+    }
+
+  object->refcount++;
+  return True;
+}
+
+static void *
+fetch_symbol(
+     XI18NObjectsList object,
+     char *symbol)
+{
+    void *result = NULL;
+#if defined(hpux)
+    int getsyms_cnt, i;
+    struct shl_symbol *symbols;
+#endif
+
+    if (symbol == NULL)
+       return NULL;
+
+#if defined(hpux)
+    getsyms_cnt = shl_getsymbols(object->dl_module, TYPE_PROCEDURE,
+                                EXPORT_SYMBOLS, malloc, &symbols);
+
+    for(i=0; i<getsyms_cnt; i++) {
+        if(!strcmp(symbols[i].name, symbol)) {
+           result = symbols[i].value;
+           break;
+         }
+    }
+
+    if(getsyms_cnt > 0) {
+        free(symbols);
+    }
+#else
+    result = try_both_dlsym(object->dl_module, symbol);
+#endif
+
+    return result;
+}
+
+static void
+close_object(XI18NObjectsList object)
+{
+  object->refcount--;
+  if (object->refcount == 0)
+    {
+#if defined(hpux)
+        shl_unload(object->dl_module);
+#else
+        dlclose(object->dl_module);
+#endif
+        object->dl_module = NULL;
+    }
+}
+
+
+typedef XLCd (*dynamicLoadProc)(const char *);
+
+XLCd
+_XlcDynamicLoad(const char *lc_name)
+{
+    XLCd lcd = (XLCd)NULL;
+    dynamicLoadProc lc_loader = (dynamicLoadProc)NULL;
+    int count;
+    XI18NObjectsList objects_list;
+    char lc_dir[BUFSIZE], lc_lib_dir[BUFSIZE];
+
+    if (lc_name == NULL) return (XLCd)NULL;
+
+    if (_XlcLocaleDirName(lc_dir, BUFSIZE, (char *)lc_name) == (char *)NULL)
+        return (XLCd)NULL;
+    if (_XlcLocaleLibDirName(lc_lib_dir, BUFSIZE, (char *)lc_name) == (char*)NULL)
+       return (XLCd)NULL;
+
+    resolve_object(lc_dir, lc_name);
+    resolve_object(lc_lib_dir, lc_name);
+
+    objects_list = xi18n_objects_list;
+    count = lc_count;
+    for (; count-- > 0; objects_list++) {
+        if (objects_list->type != XLC_OBJECT ||
+           strcmp(objects_list->locale_name, lc_name)) continue;
+       if (!open_object (objects_list, lc_dir) && \
+            !open_object (objects_list, lc_lib_dir))
+           continue;
+
+       lc_loader = (dynamicLoadProc)fetch_symbol (objects_list, objects_list->open);
+       if (!lc_loader) continue;
+       lcd = (*lc_loader)(lc_name);
+       if (lcd != (XLCd)NULL) {
+           break;
+       }
+
+       close_object (objects_list);
+    }
+    return (XLCd)lcd;
+}
+
+
+typedef XIM (*dynamicOpenProcp)(XLCd, Display *, XrmDatabase, char *, char *);
+
+static XIM
+_XDynamicOpenIM(XLCd lcd, Display *display, XrmDatabase rdb,
+               char *res_name, char *res_class)
+{
+  XIM im = (XIM)NULL;
+  char lc_dir[BUFSIZE];
+  char *lc_name;
+  dynamicOpenProcp im_openIM = (dynamicOpenProcp)NULL;
+  int count;
+  XI18NObjectsList objects_list = xi18n_objects_list;
+
+  lc_name = lcd->core->name;
+
+  if (_XlcLocaleLibDirName(lc_dir, BUFSIZE, lc_name) == NULL) return (XIM)0;
+
+  count = lc_count;
+  for (; count-- > 0; objects_list++) {
+    if (objects_list->type != XIM_OBJECT ||
+       strcmp(objects_list->locale_name, lc_name)) continue;
+
+    if (!open_object (objects_list, lc_dir))
+        continue;
+
+    im_openIM = (dynamicOpenProcp)fetch_symbol(objects_list, objects_list->open);
+    if (!im_openIM) continue;
+    im = (*im_openIM)(lcd, display, rdb, res_name, res_class);
+    if (im != (XIM)NULL) {
+        break;
+    }
+
+    close_object (objects_list);
+  }
+  return (XIM)im;
+}
+
+typedef Bool (*dynamicRegisterCBProcp)(
+    XLCd, Display *, XrmDatabase, char *, char *, XIDProc, XPointer);
+
+static Bool
+_XDynamicRegisterIMInstantiateCallback(
+    XLCd        lcd,
+    Display    *display,
+    XrmDatabase         rdb,
+    char       *res_name,
+    char        *res_class,
+    XIDProc     callback,
+    XPointer    client_data)
+{
+  char lc_dir[BUFSIZE];
+  char *lc_name;
+  dynamicRegisterCBProcp im_registerIM = (dynamicRegisterCBProcp)NULL;
+  Bool ret_flag = False;
+  int count;
+  XI18NObjectsList objects_list = xi18n_objects_list;
+#if defined(hpux)
+  int getsyms_cnt, i;
+  struct shl_symbol *symbols;
+#endif
+
+  lc_name = lcd->core->name;
+
+  if (_XlcLocaleLibDirName(lc_dir, BUFSIZE, lc_name) == NULL) return False;
+
+  count = lc_count;
+  for (; count-- > 0; objects_list++) {
+    if (objects_list->type != XIM_OBJECT ||
+       strcmp(objects_list->locale_name, lc_name)) continue;
+
+    if (!open_object (objects_list, lc_dir))
+        continue;
+    im_registerIM = (dynamicRegisterCBProcp)fetch_symbol(objects_list,
+                                           objects_list->im_register);
+    if (!im_registerIM) continue;
+    ret_flag = (*im_registerIM)(lcd, display, rdb,
+                               res_name, res_class,
+                               callback, client_data);
+    if (ret_flag) break;
+
+    close_object (objects_list);
+  }
+  return (Bool)ret_flag;
+}
+
+typedef Bool (*dynamicUnregisterProcp)(
+    XLCd, Display *, XrmDatabase, char *, char *, XIDProc, XPointer);
+
+static Bool
+_XDynamicUnRegisterIMInstantiateCallback(
+    XLCd        lcd,
+    Display    *display,
+    XrmDatabase         rdb,
+    char       *res_name,
+    char        *res_class,
+    XIDProc     callback,
+    XPointer    client_data)
+{
+  char lc_dir[BUFSIZE];
+  char *lc_name;
+  dynamicUnregisterProcp im_unregisterIM = (dynamicUnregisterProcp)NULL;
+  Bool ret_flag = False;
+  int count;
+  XI18NObjectsList objects_list = xi18n_objects_list;
+#if defined(hpux)
+  int getsyms_cnt, i;
+  struct shl_symbol *symbols;
+#endif
+
+  lc_name = lcd->core->name;
+  if (_XlcLocaleDirName(lc_dir, BUFSIZE, lc_name) == NULL) return False;
+
+  count = lc_count;
+  for (; count-- > 0; objects_list++) {
+    if (objects_list->type != XIM_OBJECT ||
+       strcmp(objects_list->locale_name, lc_name)) continue;
+
+    if (!objects_list->refcount) /* Must already be opened */
+        continue;
+
+    im_unregisterIM = (dynamicUnregisterProcp)fetch_symbol(objects_list,
+                                             objects_list->im_unregister);
+
+    if (!im_unregisterIM) continue;
+    ret_flag = (*im_unregisterIM)(lcd, display, rdb,
+                                 res_name, res_class,
+                                 callback, client_data);
+    if (ret_flag) {
+        close_object (objects_list); /* opened in RegisterIMInstantiateCallback */
+       break;
+    }
+  }
+  return (Bool)ret_flag;
+}
+
+Bool
+_XInitDynamicIM(XLCd lcd)
+{
+    if(lcd == (XLCd)NULL)
+       return False;
+    lcd->methods->open_im = _XDynamicOpenIM;
+    lcd->methods->register_callback = _XDynamicRegisterIMInstantiateCallback;
+    lcd->methods->unregister_callback = _XDynamicUnRegisterIMInstantiateCallback;
+    return True;
+}
+
+
+typedef XOM (*dynamicIOpenProcp)(
+        XLCd, Display *, XrmDatabase, _Xconst char *, _Xconst char *);
+
+static XOM
+_XDynamicOpenOM(XLCd lcd, Display *display, XrmDatabase rdb,
+               _Xconst char *res_name, _Xconst char *res_class)
+{
+  XOM om = (XOM)NULL;
+  int count;
+  char lc_dir[BUFSIZE];
+  char *lc_name;
+  dynamicIOpenProcp om_openOM = (dynamicIOpenProcp)NULL;
+  XI18NObjectsList objects_list = xi18n_objects_list;
+#if defined(hpux)
+  int getsyms_cnt, i;
+  struct shl_symbol *symbols;
+#endif
+
+  lc_name = lcd->core->name;
+
+  if (_XlcLocaleLibDirName(lc_dir, BUFSIZE, lc_name) == NULL) return (XOM)0;
+
+  count = lc_count;
+  for (; count-- > 0; objects_list++) {
+    if (objects_list->type != XOM_OBJECT ||
+       strcmp(objects_list->locale_name, lc_name)) continue;
+    if (!open_object (objects_list, lc_dir))
+        continue;
+
+    om_openOM = (dynamicIOpenProcp)fetch_symbol(objects_list, objects_list->open);
+    if (!om_openOM) continue;
+    om = (*om_openOM)(lcd, display, rdb, res_name, res_class);
+    if (om != (XOM)NULL) {
+        break;
+    }
+    close_object(objects_list);
+  }
+  return (XOM)om;
+}
+
+Bool
+_XInitDynamicOM(XLCd lcd)
+{
+    if(lcd == (XLCd)NULL)
+       return False;
+
+    lcd->methods->open_om = _XDynamicOpenOM;
+
+    return True;
+}
diff --git a/src/xlibi18n/XlcGeneric.h b/src/xlibi18n/XlcGeneric.h
new file mode 100644 (file)
index 0000000..0c008fd
--- /dev/null
@@ -0,0 +1,162 @@
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * 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 TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA 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.
+ *
+ * Author: Katsuhisa Yano      TOSHIBA Corp.
+ *                             mopi@osa.ilab.toshiba.co.jp
+ */
+/*
+ * Copyright 1995 by FUJITSU LIMITED
+ * This is source code modified by FUJITSU LIMITED under the Joint
+ * Development Agreement for the CDE/Motif PST.
+ *
+ * Modifier: Takanori Tateno   FUJITSU LIMITED
+ *
+ */
+
+#ifndef _XLCGENERIC_H_
+#define _XLCGENERIC_H_
+
+#include "XlcPubI.h"
+
+typedef struct _ByteInfo {
+     unsigned char start,end;
+} ByteInfoRec, *ByteInfo;
+
+typedef struct _ByteInfoList {
+    int        M;                          /* 1 <= M <= length */
+    int        byteinfo_num;
+    ByteInfo   byteinfo;
+} ByteInfoListRec, *ByteInfoList;
+
+/* conversion_type values */
+#define LOCALCONV      1
+#define FILECONV       2
+#define FUNCTIONCONV   4
+
+typedef struct _Conversion {
+    unsigned long      conversion_type;
+    int                conv_num;
+    FontScope          convlist;
+    char               *cnv_file;
+    XlcConv                    cnvfunc;
+} ConversionRec, *Conversion;
+
+typedef struct _ExtdSegment {
+    char       *name;
+    XlcSide    side;
+    FontScope  area;
+    int        area_num;
+    XlcCharSet  charset;
+} ExtdSegmentRec, *ExtdSegment;
+
+typedef struct _SegConvRec {
+    int                length;
+    char               *source_encoding;
+    XlcCharSet         source;
+    char               *destination_encoding;
+    XlcCharSet         dest;
+    FontScopeRec       range;
+    int                conv_num;
+    FontScope          conv;
+} SegConvRec, *SegConv;
+
+typedef struct _ParseInfoRec *ParseInfo;
+
+typedef struct _CodeSetRec {
+    XlcCharSet                 *charset_list;
+    int                num_charsets;
+    int                cs_num;
+    XlcSide            side;
+    int                length;
+    ByteInfoList       byteM;
+    Conversion                 mbconv;
+    Conversion                 ctconv;
+    ExtdSegment        ctextseg;
+    ParseInfo          parse_info;
+    unsigned long      wc_encoding;
+    Bool               string_encoding;
+} CodeSetRec, *CodeSet;
+
+typedef enum {
+    E_GL,                      /* GL encoding */
+    E_GR,                      /* GR encoding */
+    E_SS,                      /* single shift */
+    E_LSL,                     /* locking shift left */
+    E_LSR,                     /* locking shift right */
+    E_LAST
+} EncodingType;
+
+typedef struct _ParseInfoRec {
+    EncodingType       type;
+    char               *encoding;
+    CodeSet            codeset;
+} ParseInfoRec;
+
+/*
+ * XLCd private data
+ */
+
+#define XLC_GENERIC(lcd, x)    (((XLCdGeneric) lcd->core)->gen.x)
+#define XLC_GENERIC_PART(lcd)  (&(((XLCdGeneric) lcd->core)->gen))
+
+typedef struct _XLCdGenericPart {
+    int                codeset_num;
+    CodeSet            *codeset_list;
+    unsigned char      *mb_parse_table;
+    int                mb_parse_list_num;
+    ParseInfo          *mb_parse_list;
+    unsigned long      wc_encode_mask;
+    unsigned long      wc_shift_bits;
+    CodeSet            initial_state_GL;
+    CodeSet            initial_state_GR;
+    int                segment_conv_num;  /* UDC */
+    SegConv            segment_conv;      /* UDC */
+    Bool               use_stdc_env;
+    Bool               force_convert_to_mb;
+} XLCdGenericPart;
+
+typedef struct _XLCdGenericRec {
+    XLCdCoreRec        core;
+    XLCdPublicPart     pub;
+    XLCdGenericPart    gen;
+} XLCdGenericRec, *XLCdGeneric;
+
+extern XLCdMethods _XlcGenericMethods;
+
+extern FontScope
+_XlcParse_scopemaps(
+    const char *str,
+    int *size);
+extern void
+_XlcDbg_printValue(
+    const char *str,
+    char **value,
+    int num);
+
+extern XIM
+_XDefaultOpenIM(
+    XLCd                lcd,
+    Display             *dpy,
+    XrmDatabase         rdb,
+    char                *res_name,
+    char                *res_class);
+
+#endif  /* _XLCGENERIC_H_ */
diff --git a/src/xlibi18n/XlcPubI.h b/src/xlibi18n/XlcPubI.h
new file mode 100644 (file)
index 0000000..22ac2bd
--- /dev/null
@@ -0,0 +1,305 @@
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * 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 TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA 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.
+ *
+ * Author: Katsuhisa Yano      TOSHIBA Corp.
+ *                             mopi@osa.ilab.toshiba.co.jp
+ */
+
+#ifndef _XLCPUBLICI_H_
+#define _XLCPUBLICI_H_
+
+#include "XlcPublic.h"
+
+#define XLC_PUBLIC(lcd, x)     (((XLCdPublic) lcd->core)->pub.x)
+#define XLC_PUBLIC_PART(lcd)   (&(((XLCdPublic) lcd->core)->pub))
+#define XLC_PUBLIC_METHODS(lcd)        (&(((XLCdPublicMethods) lcd->methods)->pub))
+
+/*
+ * XLCd public methods
+ */
+
+typedef struct _XLCdPublicMethodsRec *XLCdPublicMethods;
+
+typedef XLCd (*XlcPubCreateProc)(
+    const char*                name,
+    XLCdMethods                methods
+);
+
+typedef Bool (*XlcPubInitializeProc)(
+    XLCd               lcd
+);
+
+typedef void (*XlcPubDestroyProc)(
+    XLCd               lcd
+);
+
+typedef char* (*XlcPubGetValuesProc)(
+    XLCd               lcd,
+    XlcArgList         args,
+    int                        num_args
+);
+
+typedef void (*XlcPubGetResourceProc)(
+    XLCd               lcd,
+    const char*                category,
+    const char*                _class,
+    char***            value,
+    int*               count
+);
+
+typedef struct _XLCdPublicMethodsPart {
+    XLCdPublicMethods superclass;
+    XlcPubCreateProc create;
+    XlcPubInitializeProc initialize;
+    XlcPubDestroyProc destroy;
+    XlcPubGetValuesProc get_values;
+    XlcPubGetResourceProc get_resource;
+} XLCdPublicMethodsPart;
+
+typedef struct _XLCdPublicMethodsRec {
+    XLCdMethodsRec core;
+    XLCdPublicMethodsPart pub;
+} XLCdPublicMethodsRec;
+
+/*
+ * XLCd public data
+ */
+
+typedef struct _XLCdPublicPart {
+    char *siname;                      /* for _XlcMapOSLocaleName() */
+    char *language;                    /* language part of locale name */
+    char *territory;                   /* territory part of locale name */
+    char *codeset;                     /* codeset part of locale name */
+    char *encoding_name;               /* encoding name */
+    int mb_cur_max;                    /* ANSI C MB_CUR_MAX */
+    Bool is_state_depend;              /* state-depend encoding */
+    const char *default_string;                /* for XDefaultString() */
+    XPointer xlocale_db;
+} XLCdPublicPart;
+
+typedef struct _XLCdPublicRec {
+    XLCdCoreRec core;
+    XLCdPublicPart pub;
+} XLCdPublicRec, *XLCdPublic;
+
+extern XLCdMethods _XlcPublicMethods;
+
+_XFUNCPROTOBEGIN
+
+extern XLCd _XlcCreateLC(
+    const char*                name,
+    XLCdMethods                methods
+);
+
+extern void _XlcDestroyLC(
+    XLCd               lcd
+);
+
+/* Fills into a freshly created XlcCharSet the fields that can be inferred
+   from the ESC sequence. These are side, char_size, set_size. */
+extern Bool _XlcParseCharSet(
+    XlcCharSet         charset
+);
+
+/* Creates a new XlcCharSet, given its name (including side suffix) and
+   Compound Text ESC sequence (normally at most 4 bytes). */
+extern XlcCharSet _XlcCreateDefaultCharSet(
+    const char*                name,
+    const char*                ct_sequence
+);
+
+extern XlcCharSet _XlcAddCT(
+    const char*                name,
+    const char*                ct_sequence
+);
+
+extern Bool _XlcInitCTInfo (void);
+
+extern XrmMethods _XrmDefaultInitParseInfo(
+    XLCd               lcd,
+    XPointer*          state
+);
+
+extern int _XmbTextPropertyToTextList(
+    XLCd               lcd,
+    Display*           dpy,
+    const XTextProperty* text_prop,
+    char***            list_ret,
+    int*               count_ret
+);
+
+extern int _XwcTextPropertyToTextList(
+    XLCd               lcd,
+    Display*           dpy,
+    const XTextProperty* text_prop,
+    wchar_t***         list_ret,
+    int*               count_ret
+);
+
+extern int _Xutf8TextPropertyToTextList(
+    XLCd               lcd,
+    Display*           dpy,
+    const XTextProperty* text_prop,
+    char***            list_ret,
+    int*               count_ret
+);
+
+extern int _XmbTextListToTextProperty(
+    XLCd               /* lcd */,
+    Display*           /* dpy */,
+    char**             /* list */,
+    int                        /* count */,
+    XICCEncodingStyle  /* style */,
+    XTextProperty*     /* text_prop */
+);
+
+extern int _XwcTextListToTextProperty(
+    XLCd               /* lcd */,
+    Display*           /* dpy */,
+    wchar_t**          /* list */,
+    int                        /* count */,
+    XICCEncodingStyle  /* style */,
+    XTextProperty*     /* text_prop */
+);
+
+extern int _Xutf8TextListToTextProperty(
+    XLCd               /* lcd */,
+    Display*           /* dpy */,
+    char**             /* list */,
+    int                        /* count */,
+    XICCEncodingStyle  /* style */,
+    XTextProperty*     /* text_prop */
+);
+
+extern void _XwcFreeStringList(
+    XLCd               /* lcd */,
+    wchar_t**          /* list */
+);
+
+extern int _XlcResolveLocaleName(
+    const char*                lc_name,
+    XLCdPublicPart*    pub
+);
+
+extern int _XlcResolveI18NPath(
+    char*              buf,
+    int                        buf_len
+);
+
+extern char *_XlcLocaleLibDirName(
+     char*             /* dir_name */,
+     size_t,          /* dir_len */
+     char*             /* lc_name */
+);
+
+extern char *_XlcLocaleDirName(
+     char*             /* dir_name */,
+     size_t,          /* dir_len */
+     char*             /* lc_name */
+);
+
+extern XPointer _XlcCreateLocaleDataBase(
+    XLCd               lcd
+);
+
+extern void _XlcDestroyLocaleDataBase(
+    XLCd               lcd
+);
+
+extern void _XlcGetLocaleDataBase(
+    XLCd               /* lcd */,
+    const char*                /* category */,
+    const char*                /* name */,
+    char***            /* value */,
+    int*               /* count */
+);
+
+#ifdef X_LOCALE
+extern char *
+_Xsetlocale(
+    int           category,
+    _Xconst char  *name);
+#else
+#ifdef __APPLE__
+extern char *
+_Xsetlocale(
+    int           category,
+    _Xconst char  *name);
+#endif
+extern char *_XlcMapOSLocaleName(
+    char *osname,
+    char *siname);
+#endif
+
+extern int
+_Xmbstoutf8(
+    char *ustr,
+    const char *str,
+    int len);
+extern int
+_Xlcmbstoutf8(
+    XLCd lcd,
+    char *ustr,
+    const char *str,
+    int len);
+extern int
+_Xmbstowcs(
+    wchar_t *wstr,
+    char *str,
+    int len);
+extern int
+_Xlcwcstombs(
+    XLCd lcd,
+    char *str,
+    wchar_t *wstr,
+    int len);
+extern int
+_Xlcmbstowcs(
+    XLCd lcd,
+    wchar_t *wstr,
+    char *str,
+    int len);
+extern int
+_Xwcstombs(
+    char *str,
+    wchar_t *wstr,
+    int len);
+extern int
+_Xlcmbtowc(
+    XLCd lcd,
+    wchar_t *wstr,
+    char *str,
+    int len);
+extern int
+_Xlcwctomb(
+    XLCd lcd,
+    char *str,
+    wchar_t wc);
+
+
+
+extern XPointer
+_Utf8GetConvByName(
+    const char *name);
+
+_XFUNCPROTOEND
+
+#endif  /* _XLCPUBLICI_H_ */
diff --git a/src/xlibi18n/XlcPublic.h b/src/xlibi18n/XlcPublic.h
new file mode 100644 (file)
index 0000000..3d94ef3
--- /dev/null
@@ -0,0 +1,324 @@
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * 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 TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA 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.
+ *
+ * Author: Katsuhisa Yano      TOSHIBA Corp.
+ *                             mopi@osa.ilab.toshiba.co.jp
+ */
+/*
+ * Copyright 1995 by FUJITSU LIMITED
+ * This is source code modified by FUJITSU LIMITED under the Joint
+ * Development Agreement for the CDE/Motif PST.
+ *
+ * Modifier: Takanori Tateno   FUJITSU LIMITED
+ *
+ */
+/*
+ * Most of this API is documented in i18n/Framework.PS
+ */
+
+#ifndef _XLCPUBLIC_H_
+#define _XLCPUBLIC_H_
+
+#include "Xlcint.h"
+
+
+/*
+ * Character sets.
+ */
+
+/* Every character set has a "side". It denotes the range of byte values for
+   which the character set is responsible. This means that the character
+   set's encoded characters will only assumes bytes within the range, and
+   that the character set can be used simultaneously with another character
+   set responsible for a disjoint range. */
+typedef enum {
+    XlcUnknown,
+    XlcC0,             /* responsible for values 0x00..0x1F */
+    XlcGL,             /* responsible for values 0x00..0x7F or 0x20..0x7F */
+    XlcC1,             /* responsible for values 0x80..0x9F */
+    XlcGR,             /* responsible for values 0x80..0xFF or 0xA0..0xFF */
+    XlcGLGR,           /* responsible for values 0x00..0xFF */
+    XlcOther,          /* unused */
+    XlcNONE
+} XlcSide;
+
+/* Data read from XLC_LOCALE files.
+   XXX Apparently superseded by _XUDCGlyphRegion. */
+typedef struct _UDCArea {
+    unsigned long      start;
+    unsigned long      end;
+} UDCAreaRec, *UDCArea;
+
+/* Where the character set comes from. */
+typedef enum {
+    CSsrcUndef,                /* unused */
+    CSsrcStd,          /* defined in libX11 */
+    CSsrcXLC           /* defined in an XLC_LOCALE file */
+} CSSrc;
+
+/* These are the supported properties of XlcCharSet. */
+#define XlcNCharSize           "charSize"
+#define XlcNControlSequence    "controlSequence"
+#define XlcNEncodingName       "encodingName"
+#define XlcNName               "name"
+#define XlcNSetSize            "setSize"
+#define XlcNSide               "side"
+
+/* This is the structure of an XlcCharSet.
+   Once allocated, they are never freed. */
+typedef struct _XlcCharSetRec {
+    /* Character set name, including side suffix */
+    const char                 *name;
+    XrmQuark           xrm_name;
+
+    /* XLFD encoding name, no side suffix */
+    const char                 *encoding_name;
+    XrmQuark           xrm_encoding_name;
+
+    /* Range for which the charset is responsible: XlcGL, XlcGR or XlcGLGR */
+    XlcSide            side;
+
+    /* Number of bytes per character. 0 means a varying number (e.g. UTF-8) */
+    int                char_size;
+    /* Classification of the character set according to ISO-2022 */
+    int                set_size;       /* e.g. 94 or 96 */
+    const char                 *ct_sequence;   /* control sequence of CT */
+                                       /* (normally at most 4 bytes) */
+
+    /* for UDC */
+    Bool               string_encoding;
+    UDCArea            udc_area;
+    int                udc_area_num;
+
+    /* Description source */
+    CSSrc              source;
+} XlcCharSetRec, *XlcCharSet;
+
+_XFUNCPROTOBEGIN
+
+/* Returns the charset with the given name (including side suffix).
+   Returns NULL if not found. */
+extern XlcCharSet _XlcGetCharSet(
+    const char*                name
+);
+
+/* Returns the charset with the given encoding (no side suffix) and
+   responsible for at least the given side (XlcGL or XlcGR).
+   Returns NULL if not found. */
+extern XlcCharSet _XlcGetCharSetWithSide(
+    const char*                encoding_name,
+    XlcSide            side
+);
+
+/* Registers an XlcCharSet in the list of character sets.
+   Returns True if successful. */
+extern Bool _XlcAddCharSet(
+    XlcCharSet         charset
+);
+
+/* Retrieves a number of attributes of an XlcCharSet.
+   Return NULL if successful, otherwise the name of the first argument
+   specifiying a nonexistent attribute. */
+extern char *_XlcGetCSValues(
+    XlcCharSet         charset,
+    ...
+);
+
+_XFUNCPROTOEND
+
+
+#define XlcNCodeset            "codeset"
+#define XlcNDefaultString      "defaultString"
+#define XlcNLanguage           "language"
+#define XlcNMbCurMax           "mbCurMax"
+#define XlcNStateDependentEncoding "stateDependentEncoding"
+#define XlcNTerritory          "territory"
+
+typedef struct _FontScope {
+        unsigned long   start;
+        unsigned long   end;
+        unsigned long   shift;
+        unsigned long   shift_direction;
+} FontScopeRec, *FontScope;
+
+/*
+ * conversion methods
+ */
+
+typedef struct _XlcConvRec *XlcConv;
+
+typedef XlcConv (*XlcOpenConverterProc)(
+    XLCd               from_lcd,
+    const char*                from_type,
+    XLCd               to_lcd,
+    const char*                to_type
+);
+
+typedef void (*XlcCloseConverterProc)(
+    XlcConv            /* conv */
+);
+
+typedef int (*XlcConvertProc)(
+    XlcConv            /* conv */,
+    XPointer*          /* from */,
+    int*               /* from_left */,
+    XPointer*          /* to */,
+    int*               /* to_left */,
+    XPointer*          /* args */,
+    int                        /* num_args */
+);
+
+typedef void (*XlcResetConverterProc)(
+    XlcConv            /* conv */
+);
+
+typedef struct _XlcConvMethodsRec{
+    XlcCloseConverterProc      close;
+    XlcConvertProc             convert;
+    XlcResetConverterProc      reset;
+} XlcConvMethodsRec, *XlcConvMethods;
+
+/*
+ * conversion data
+ */
+
+#define XlcNMultiByte          "multiByte"
+#define XlcNWideChar           "wideChar"
+#define XlcNCompoundText       "compoundText"
+#define XlcNString             "string"
+#define XlcNUtf8String                 "utf8String"
+#define XlcNCharSet            "charSet"
+#define XlcNCTCharSet          "CTcharSet"
+#define XlcNFontCharSet                "FontCharSet"
+#define XlcNChar               "char"
+#define XlcNUcsChar            "UCSchar"
+
+typedef struct _XlcConvRec {
+    XlcConvMethods             methods;
+    XPointer                   state;
+} XlcConvRec;
+
+
+_XFUNCPROTOBEGIN
+
+extern Bool _XInitOM(
+    XLCd               /* lcd */
+);
+
+extern Bool _XInitIM(
+    XLCd               /* lcd */
+);
+
+extern XIM _XimOpenIM(
+    XLCd               /* lcd */,
+    Display *          /* dpy */,
+    XrmDatabase                /* rdb */,
+    char *             /* res_name */,
+    char *             /* res_class */
+);
+
+extern char *_XGetLCValues(
+    XLCd               /* lcd */,
+    ...
+);
+
+extern XlcConv _XlcOpenConverter(
+    XLCd               from_lcd,
+    const char*                from_type,
+    XLCd               to_lcd,
+    const char*                to_type
+);
+
+extern void _XlcCloseConverter(
+    XlcConv            conv
+);
+
+extern int _XlcConvert(
+    XlcConv            conv,
+    XPointer*          from,
+    int*               from_left,
+    XPointer*          to,
+    int*               to_left,
+    XPointer*          args,
+    int                        num_args
+);
+
+extern void _XlcResetConverter(
+    XlcConv            conv
+);
+
+extern Bool _XlcSetConverter(
+    XLCd                       from_lcd,
+    const char*                        from_type,
+    XLCd                       to_lcd,
+    const char*                        to_type,
+    XlcOpenConverterProc       open_converter
+);
+
+extern void _XlcGetResource(
+    XLCd               lcd,
+    const char*                category,
+    const char*                _class,
+    char***            value,
+    int*               count
+);
+
+extern char *_XlcFileName(
+    XLCd               lcd,
+    const char*                category
+);
+
+extern int _Xwcslen(
+    wchar_t*           /* wstr */
+);
+
+extern wchar_t *_Xwcscpy(
+    wchar_t*           /* wstr1 */,
+    wchar_t*           /* wstr2 */
+);
+
+extern wchar_t *_Xwcsncpy(wchar_t *wstr1, wchar_t *wstr2, int len);
+extern int _Xwcscmp(wchar_t *wstr1, wchar_t *wstr2);
+extern int _Xwcsncmp(wchar_t *wstr1, wchar_t *wstr2, int len);
+
+/* Compares two ISO 8859-1 strings, ignoring case of ASCII letters.
+   Like strcasecmp in an ASCII locale. */
+extern int _XlcCompareISOLatin1(
+    const char*                str1,
+    const char*                str2
+);
+
+/* Compares two ISO 8859-1 strings, at most len bytes of each, ignoring
+   case of ASCII letters. Like strncasecmp in an ASCII locale. */
+extern int _XlcNCompareISOLatin1(
+    const char*                str1,
+    const char*                str2,
+    int                        len
+);
+
+extern XOM
+_XDefaultOpenOM(
+    XLCd lcd, Display *dpy, XrmDatabase rdb,
+    _Xconst char *res_name, _Xconst char *res_class);
+
+_XFUNCPROTOEND
+
+#endif  /* _XLCPUBLIC_H_ */
diff --git a/src/xlibi18n/XlcSL.c b/src/xlibi18n/XlcSL.c
new file mode 100644 (file)
index 0000000..b8b3967
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+Copyright 1985, 1986, 1987, 1991, 1998  The Open Group
+
+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
+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
+EVEN IF ADVISED IN ADVANCE OF THE POSSIBILITY OF SUCH DAMAGES.
+
+
+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 Window System is a trademark of The Open Group
+
+OSF/1, OSF/Motif and Motif are registered trademarks, and OSF, the OSF
+logo, LBX, X Window System, and Xinerama are trademarks of the Open
+Group. All other trademarks and registered trademarks mentioned herein
+are the property of their respective owners. No right, title or
+interest in or to any trademark, service mark, logo or trade name of
+Sun Microsystems, Inc. or its licensors is granted.
+
+*/
+/*
+ * Copyright 2000 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.
+ */
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xlcint.h"
+
+extern XIM _XDefaultOpenIM(
+       XLCd, Display *, XrmDatabase, char *, char *
+                          );
+
+Bool
+_XInitDefaultIM(XLCd lcd)
+{
+    if(lcd == (XLCd)NULL)
+       return False;
+
+    lcd->methods->open_im = _XDefaultOpenIM;
+    lcd->methods->register_callback = NULL;
+    lcd->methods->unregister_callback = NULL;
+    return True;
+}
+
+extern XOM _XDefaultOpenOM(
+    XLCd, Display*, XrmDatabase, _Xconst char*, _Xconst char*
+                          );
+
+Bool
+_XInitDefaultOM(XLCd lcd)
+{
+    lcd->methods->open_om = _XDefaultOpenOM;
+    return True;
+}
diff --git a/src/xlibi18n/Xlcint.h b/src/xlibi18n/Xlcint.h
new file mode 100644 (file)
index 0000000..95d1f5d
--- /dev/null
@@ -0,0 +1,979 @@
+/*
+
+Copyright 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.
+
+*/
+
+/*
+ * Copyright 1990, 1991 by OMRON Corporation, NTT Software Corporation,
+ *                      and Nippon Telegraph and Telephone Corporation
+ * Copyright 1991 by the Open Software Foundation
+ * Copyright 1993 by the TOSHIBA Corp.
+ * Copyright 1993, 1994 by Sony Corporation
+ * Copyright 1993, 1994 by the FUJITSU LIMITED
+ *
+ * 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 names of OMRON, NTT Software, NTT, Open
+ * Software Foundation, and Sony Corporation not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. OMRON, NTT Software, NTT, Open Software
+ * Foundation, and Sony Corporation  make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * OMRON, NTT SOFTWARE, NTT, OPEN SOFTWARE FOUNDATION, AND SONY
+ * CORPORATION DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT
+ * SHALL OMRON, NTT SOFTWARE, NTT, OPEN SOFTWARE FOUNDATION, OR SONY
+ * CORPORATION 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.
+ *
+ *     Authors: Li Yuhong              OMRON Corporation
+ *              Tatsuya Kato           NTT Software Corporation
+ *              Hiroshi Kuribayashi    OMRON Coproration
+ *              Muneiyoshi Suzuki      Nippon Telegraph and Telephone Co.
+ *
+ *              M. Collins             OSF
+ *              Katsuhisa Yano         TOSHIBA Corp.
+ *               Makoto Wakamatsu       Sony Corporation
+ *               Takashi Fujiwara      FUJITSU LIMITED
+ */
+
+
+#ifndef        _XLCINT_H_
+#define        _XLCINT_H_
+
+#ifndef _XP_PRINT_SERVER_
+
+#include <X11/Xresource.h>
+#include <X11/Xutil.h>
+#include <stdarg.h>
+
+typedef Bool (*XFilterEventProc)(
+    Display*           /* display */,
+    Window             /* window */,
+    XEvent*            /* event */,
+    XPointer           /* client_data */
+);
+
+typedef struct _XIMFilter {
+    struct _XIMFilter *next;
+    Window window;
+    unsigned long event_mask;
+    int start_type, end_type;
+    XFilterEventProc filter;
+    XPointer client_data;
+} XFilterEventRec, *XFilterEventList;
+
+typedef struct {
+    char    *name;
+    XPointer value;
+} XIMArg;
+
+#ifdef offsetof
+#define XOffsetOf(s_type,field) offsetof(s_type,field)
+#else
+#define XOffsetOf(s_type,field) ((unsigned int)&(((s_type*)NULL)->field))
+#endif
+
+#define XIMNumber(arr) ((unsigned int) (sizeof(arr) / sizeof(arr[0])))
+
+/*
+ * define secondary data structs which are part of Input Methods
+ * and Input Context
+ */
+typedef struct {
+    const char         *resource_name;         /* Resource string */
+    XrmQuark           xrm_name;               /* Resource name quark */
+    int                        resource_size;          /* Size in bytes of data */
+    long               resource_offset;        /* Offset from base */
+    unsigned short     mode;                   /* Read Write Permission */
+    unsigned short     id;                     /* Input Method Protocol */
+} XIMResource, *XIMResourceList;
+
+/*
+ * data block describing the visual attributes associated with
+ * an input context
+ */
+typedef struct {
+    XRectangle         area;
+    XRectangle         area_needed;
+    XPoint             spot_location;
+    Colormap           colormap;
+    Atom               std_colormap;
+    unsigned long      foreground;
+    unsigned long      background;
+    Pixmap             background_pixmap;
+    XFontSet            fontset;
+    int                        line_spacing;
+    Cursor             cursor;
+    XICCallback                start_callback;
+    XICCallback                done_callback;
+    XICCallback                draw_callback;
+    XICCallback                caret_callback;
+    XIMPreeditState    preedit_state;
+    XICCallback                state_notify_callback;
+} ICPreeditAttributes, *ICPreeditAttributesPtr;
+
+typedef struct {
+    XRectangle         area;
+    XRectangle         area_needed;
+    Colormap           colormap;
+    Atom               std_colormap;
+    unsigned long      foreground;
+    unsigned long      background;
+    Pixmap             background_pixmap;
+    XFontSet            fontset;
+    int                        line_spacing;
+    Cursor             cursor;
+    XICCallback                start_callback;
+    XICCallback                done_callback;
+    XICCallback                draw_callback;
+} ICStatusAttributes, *ICStatusAttributesPtr;
+
+#endif /* !_XP_PRINT_SERVER_ */
+
+/*
+ * Methods for Xrm parsing
+ */
+
+/* The state is a pointer to an object created by the locale's
+   init_parse_info function (default: _XrmDefaultInitParseInfo). */
+
+/* Sets the state to the initial state.
+   Initiates a sequence of calls to the XmbCharProc. */
+typedef void (*XmbInitProc)(
+    XPointer           state
+);
+
+/* Transforms one multibyte character, starting at str, and return a 'char'
+   in the same parsing class (not a wide character!). Returns the number of
+   consumed bytes in *lenp. */
+typedef char (*XmbCharProc)(
+    XPointer           state,
+    const char *       str,
+    int*               lenp
+);
+
+/* Terminates a sequence of calls to the XmbCharProc. */
+typedef void (*XmbFinishProc)(
+    XPointer           state
+);
+
+/* Returns the name of the state's locale, as a static string. */
+typedef const char* (*XlcNameProc)(
+    XPointer           state
+);
+
+/* Frees the state, which was allocated by the locale's init_parse_info
+   function. */
+typedef void (*XrmDestroyProc)(
+    XPointer           state
+);
+
+/* Set of methods for Xrm parsing. */
+typedef struct {
+    XmbInitProc                mbinit;
+    XmbCharProc                mbchar;
+    XmbFinishProc      mbfinish;
+    XlcNameProc                lcname;
+    XrmDestroyProc     destroy;
+} XrmMethodsRec;
+typedef const XrmMethodsRec *XrmMethods;
+
+#ifndef _XP_PRINT_SERVER_
+
+typedef struct _XLCd *XLCd; /* need forward reference */
+
+/*
+ * define an LC, it's methods, and data.
+ */
+
+typedef void (*XCloseLCProc)(
+    XLCd               /* lcd */
+);
+
+typedef char* (*XlcMapModifiersProc)(
+    XLCd               /* lcd */,
+    _Xconst char*      /* user_mods */,
+    _Xconst char*      /* prog_mods */
+);
+
+typedef XOM (*XOpenOMProc)(
+    XLCd               /* lcd */,
+    Display*           /* display */,
+    XrmDatabase                /* rdb */,
+    _Xconst char*      /* res_name */,
+    _Xconst char*      /* res_class */
+);
+
+typedef XIM (*XOpenIMProc)(
+    XLCd               /* lcd */,
+    Display*           /* display */,
+    XrmDatabase                /* rdb */,
+    char*              /* res_name */,
+    char*              /* res_class */
+);
+
+typedef Bool (*XRegisterIMInstantiateCBProc)(
+    XLCd               /* lcd */,
+    Display*           /* display */,
+    XrmDatabase                /* rdb */,
+    char*              /* res_name */,
+    char*              /* res_class */,
+    XIDProc            /* callback */,
+    XPointer           /* client_data */
+);
+
+typedef Bool (*XUnregisterIMInstantiateCBProc)(
+    XLCd               /* lcd */,
+    Display*           /* display */,
+    XrmDatabase                /* rdb */,
+    char*              /* res_name */,
+    char*              /* res_class */,
+    XIDProc            /* callback */,
+    XPointer           /* client_data */
+);
+
+typedef XrmMethods (*XrmInitParseInfoProc)(
+    XLCd               /* lcd */,
+    XPointer*          /* state */
+);
+
+typedef int (*XmbTextPropertyToTextListProc)(
+    XLCd               lcd,
+    Display*           display,
+    const XTextProperty* text_prop,
+    char***            list_return,
+    int*               count_return
+);
+
+typedef int (*XwcTextPropertyToTextListProc)(
+    XLCd               lcd,
+    Display*           display,
+    const XTextProperty* text_prop,
+    wchar_t***         list_return,
+    int*               count_return
+);
+
+typedef int (*XmbTextListToTextPropertyProc)(
+    XLCd               lcd,
+    Display*           display,
+    char**             list,
+    int                        count,
+    XICCEncodingStyle  style,
+    XTextProperty*     text_prop_return
+);
+
+typedef int (*XwcTextListToTextPropertyProc)(
+    XLCd               lcd,
+    Display*           display,
+    wchar_t**          list,
+    int                        count,
+    XICCEncodingStyle  style,
+    XTextProperty*     text_prop_return
+);
+
+typedef void (*XwcFreeStringListProc)(
+    XLCd               lcd,
+    wchar_t**          list
+);
+
+typedef const char* (*XDefaultStringProc)(
+    XLCd               lcd
+);
+
+typedef struct {
+    XCloseLCProc                       close;
+    XlcMapModifiersProc                        map_modifiers;
+    XOpenOMProc                                open_om;
+    XOpenIMProc                                open_im;
+    XrmInitParseInfoProc               init_parse_info;
+    XmbTextPropertyToTextListProc      mb_text_prop_to_list;
+    XwcTextPropertyToTextListProc      wc_text_prop_to_list;
+    XmbTextPropertyToTextListProc      utf8_text_prop_to_list;
+    XmbTextListToTextPropertyProc      mb_text_list_to_prop;
+    XwcTextListToTextPropertyProc      wc_text_list_to_prop;
+    XmbTextListToTextPropertyProc      utf8_text_list_to_prop;
+    XwcFreeStringListProc              wc_free_string_list;
+    XDefaultStringProc                 default_string;
+    XRegisterIMInstantiateCBProc       register_callback;
+    XUnregisterIMInstantiateCBProc     unregister_callback;
+} XLCdMethodsRec, *XLCdMethods;
+
+
+typedef struct {
+    char*              name;                   /* name of this LC */
+    char*              modifiers;              /* modifiers of locale */
+} XLCdCoreRec, *XLCdCore;
+
+
+typedef struct _XLCd {
+    XLCdMethods                methods;                /* methods of this LC */
+    XLCdCore           core;                   /* data of this LC */
+    XPointer           opaque;                 /* LDX specific data */
+} XLCdRec;
+
+typedef int XlcPosition;
+
+#define XlcHead                0
+#define XlcTail                -1
+
+typedef struct {
+    char *name;
+    XPointer value;
+} XlcArg, *XlcArgList;
+
+typedef struct _XlcResource {
+    const char *name;
+    XrmQuark xrm_name;
+    int size;
+    int offset;
+    unsigned long mask;
+} XlcResource, *XlcResourceList;
+
+#define XlcCreateMask  (1L<<0)
+#define XlcDefaultMask (1L<<1)
+#define XlcGetMask     (1L<<2)
+#define XlcSetMask     (1L<<3)
+#define XlcIgnoreMask  (1L<<4)
+
+#define XlcNumber(arr) (sizeof(arr) / sizeof(arr[0]))
+
+typedef Status (*XCloseOMProc)(
+    XOM                        /* om */
+);
+
+typedef char* (*XSetOMValuesProc)(
+    XOM                        /* om */,
+    XlcArgList         /* args */,
+    int                        /* num_args */
+);
+
+typedef char* (*XGetOMValuesProc)(
+    XOM                        /* om */,
+    XlcArgList         /* args */,
+    int                        /* num_args */
+);
+
+typedef XOC (*XCreateOCProc)(
+    XOM                        /* om */,
+    XlcArgList         /* args */,
+    int                        /* num_args */
+);
+
+typedef struct _XOMMethodsRec {
+    XCloseOMProc       close;
+    XSetOMValuesProc   set_values;
+    XGetOMValuesProc   get_values;
+    XCreateOCProc      create_oc;
+} XOMMethodsRec, *XOMMethods;
+
+typedef struct _XOMCoreRec {
+    XLCd lcd;                          /* lcd */
+    Display *display;                  /* display */
+    XrmDatabase rdb;                   /* database */
+    char *res_name;                    /* resource name */
+    char *res_class;                   /* resource class */
+    XOC oc_list;                       /* xoc list */
+    XlcResourceList resources;         /* xom resources */
+    int num_resources;                 /* number of xom resources */
+    XOMCharSetList required_charset;   /* required charset list */
+    XOMOrientation orientation_list;   /* orientation list */
+    Bool directional_dependent;                /* directional-dependent */
+    Bool contextual_drawing;           /* contextual drawing */
+    Bool context_dependent;            /* context-dependent drawing */
+} XOMCoreRec, *XOMCore;
+
+typedef struct _XOM {
+    XOMMethods methods;
+    XOMCoreRec core;
+} XOMRec;
+
+typedef void (*XDestroyOCProc)(
+    XOC                        /* oc */
+);
+
+typedef char* (*XSetOCValuesProc)(
+    XOC                        /* oc */,
+    XlcArgList         /* args */,
+    int                        /* num_args */
+);
+
+typedef char* (*XGetOCValuesProc)(
+    XOC                        /* oc */,
+    XlcArgList         /* args */,
+    int                        /* num_args */
+);
+
+/*
+ * X Font Sets are an instantiable object, so we define it, the
+ * object itself, a method list and data
+ */
+
+/*
+ * XFontSet object method list
+ */
+
+typedef int (*XmbTextEscapementProc)(
+    XFontSet           /* font_set */,
+    _Xconst char*      /* text */,
+    int                        /* text_len */
+);
+
+typedef int (*XmbTextExtentsProc)(
+    XFontSet           /* font_set */,
+    _Xconst char*      /* text */,
+    int                        /* text_len */,
+    XRectangle*                /* overall_ink_extents */,
+    XRectangle*                /* overall_logical_extents */
+);
+
+typedef Status (*XmbTextPerCharExtentsProc)(
+    XFontSet           /* font_set */,
+    _Xconst char*      /* text */,
+    int                        /* text_len */,
+    XRectangle*                /* ink_extents_buffer */,
+    XRectangle*                /* logical_extents_buffer */,
+    int                        /* buffer_size */,
+    int*               /* num_chars */,
+    XRectangle*                /* max_ink_extents */,
+    XRectangle*                /* max_logical_extents */
+);
+
+typedef int (*XmbDrawStringProc)(
+    Display*           /* display */,
+    Drawable           /* drawable */,
+    XFontSet           /* font_set */,
+    GC                 /* gc */,
+    int                        /* x */,
+    int                        /* y */,
+    _Xconst char*      /* text */,
+    int                        /* text_len */
+);
+
+typedef void (*XmbDrawImageStringProc)(
+    Display*           /* display */,
+    Drawable           /* drawable */,
+    XFontSet           /* font_set */,
+    GC                 /* gc */,
+    int                        /* x */,
+    int                        /* y */,
+    _Xconst char*      /* text */,
+    int                        /* text_len */
+);
+
+typedef int (*XwcTextEscapementProc)(
+    XFontSet           /* font_set */,
+    _Xconst wchar_t*   /* text */,
+    int                        /* text_len */
+);
+
+typedef int (*XwcTextExtentsProc)(
+    XFontSet           /* font_set */,
+    _Xconst wchar_t*   /* text */,
+    int                        /* text_len */,
+    XRectangle*                /* overall_ink_extents */,
+    XRectangle*                /* overall_logical_extents */
+);
+
+typedef Status (*XwcTextPerCharExtentsProc)(
+    XFontSet           /* font_set */,
+    _Xconst wchar_t*   /* text */,
+    int                        /* text_len */,
+    XRectangle*                /* ink_extents_buffer */,
+    XRectangle*                /* logical_extents_buffer */,
+    int                        /* buffer_size */,
+    int*               /* num_chars */,
+    XRectangle*                /* max_ink_extents */,
+    XRectangle*                /* max_logical_extents */
+);
+
+typedef int (*XwcDrawStringProc)(
+    Display*           /* display */,
+    Drawable           /* drawable */,
+    XFontSet           /* font_set */,
+    GC                 /* gc */,
+    int                        /* x */,
+    int                        /* y */,
+    _Xconst wchar_t*   /* text */,
+    int                        /* text_len */
+);
+
+typedef void (*XwcDrawImageStringProc)(
+    Display*           /* display */,
+    Drawable           /* drawable */,
+    XFontSet           /* font_set */,
+    GC                 /* gc */,
+    int                        /* x */,
+    int                        /* y */,
+    _Xconst wchar_t*   /* text */,
+    int                        /* text_len */
+);
+
+typedef struct {
+    XDestroyOCProc             destroy;
+    XSetOCValuesProc           set_values;
+    XGetOCValuesProc           get_values;
+
+    /* multi-byte text drawing methods */
+
+    XmbTextEscapementProc      mb_escapement;
+    XmbTextExtentsProc         mb_extents;
+    XmbTextPerCharExtentsProc  mb_extents_per_char;
+    XmbDrawStringProc          mb_draw_string;
+    XmbDrawImageStringProc     mb_draw_image_string;
+
+    /* wide character text drawing methods */
+
+    XwcTextEscapementProc      wc_escapement;
+    XwcTextExtentsProc         wc_extents;
+    XwcTextPerCharExtentsProc  wc_extents_per_char;
+    XwcDrawStringProc          wc_draw_string;
+    XwcDrawImageStringProc     wc_draw_image_string;
+
+    /* UTF-8 text drawing methods */
+
+    XmbTextEscapementProc      utf8_escapement;
+    XmbTextExtentsProc         utf8_extents;
+    XmbTextPerCharExtentsProc  utf8_extents_per_char;
+    XmbDrawStringProc          utf8_draw_string;
+    XmbDrawImageStringProc     utf8_draw_image_string;
+} XOCMethodsRec, *XOCMethods;
+
+
+/*
+ * XOC independent data
+ */
+
+typedef struct {
+    XOM om;                            /* XOM */
+    XOC next;                          /* next XOC */
+    XlcResourceList resources;         /* xoc resources */
+    int num_resources;                 /* number of xoc resources */
+    char *base_name_list;              /* base font name list */
+    Bool om_automatic;                 /* OM Automatic */
+    XOMFontInfo font_info;             /* font info */
+    XFontSetExtents font_set_extents;          /* font set extents */
+    char *default_string;              /* default string */
+    XOMCharSetList missing_list;       /* missing charset list */
+    XOrientation orientation;          /* orientation */
+    char *res_name;                    /* resource name */
+    char *res_class;                   /* resource class */
+} XOCCoreRec, *XOCCore;
+
+typedef struct _XOC {
+    XOCMethods methods;
+    XOCCoreRec core;
+} XOCRec;
+
+
+/*
+ * X Input Managers are an instantiable object, so we define it, the
+ * object itself, a method list and data.
+ */
+
+/*
+ * an Input Manager object method list
+ */
+typedef struct {
+    Status (*close)(
+       XIM
+       );
+    char* (*set_values)(
+       XIM, XIMArg*
+       );
+    char* (*get_values)(
+       XIM, XIMArg*
+       );
+    XIC (*create_ic)(
+       XIM, XIMArg*
+       );
+    int (*ctstombs)(
+       XIM, char*, int, char*, int, Status *
+       );
+    int (*ctstowcs)(
+       XIM, char*, int, wchar_t*, int, Status *
+       );
+    int (*ctstoutf8)(
+       XIM, char*, int, char*, int, Status *
+       );
+} XIMMethodsRec, *XIMMethods;
+
+/*
+ * Input Manager LC independent data
+ */
+typedef struct {
+    XLCd               lcd;                    /* LC of this input method */
+    XIC                        ic_chain;               /* list of ICs for this IM */
+
+    Display *          display;                /* display */
+    XrmDatabase        rdb;
+    char *             res_name;
+    char *             res_class;
+
+    XIMValuesList      *im_values_list;
+    XIMValuesList      *ic_values_list;
+    XIMStyles          *styles;
+    XIMCallback                 destroy_callback;
+    char *             im_name;                /* XIMMODIFIER name */
+    XIMResourceList    im_resources;           /* compiled IM resource list */
+    unsigned int       im_num_resources;
+    XIMResourceList    ic_resources;           /* compiled IC resource list */
+    unsigned int       ic_num_resources;
+    Bool               visible_position;
+} XIMCoreRec, *XIMCore;
+
+
+
+/*
+ * An X Input Manager (IM).  Implementations may need to extend this data
+ * structure to accomodate additional data, state information etc.
+ */
+typedef struct _XIM {
+    XIMMethods         methods;                /* method list of this IM */
+    XIMCoreRec         core;                   /* data of this IM */
+} XIMRec;
+
+
+
+/*
+ * X Input Contexts (IC) are an instantiable object, so we define it, the
+ * object itself, a method list and data for this object
+ */
+
+/*
+ * Input Context method list
+ */
+typedef struct {
+    void (*destroy)(
+       XIC
+       );
+    void (*set_focus)(
+       XIC
+       );
+    void (*unset_focus)(
+       XIC
+       );
+    char* (*set_values)(
+       XIC, XIMArg*
+       );
+    char* (*get_values)(
+       XIC, XIMArg*
+       );
+    char* (*mb_reset)(
+       XIC
+       );
+    wchar_t* (*wc_reset)(
+       XIC
+       );
+    char* (*utf8_reset)(
+       XIC
+       );
+    int (*mb_lookup_string)(
+       XIC, XKeyEvent*, char*, int, KeySym*, Status*
+       );
+    int (*wc_lookup_string)(
+       XIC, XKeyEvent*, wchar_t*, int, KeySym*, Status*
+       );
+    int (*utf8_lookup_string)(
+       XIC, XKeyEvent*, char*, int, KeySym*, Status*
+       );
+} XICMethodsRec, *XICMethods;
+
+
+/*
+ * Input Context LC independent data
+ */
+typedef struct {
+    XIM                        im;                     /* XIM this IC belongs too */
+    XIC                        next;                   /* linked list of ICs for IM */
+
+    Window             client_window;          /* window IM can use for */
+                                               /* display or subwindows */
+    XIMStyle           input_style;            /* IM's input style */
+    Window             focus_window;           /* where key events go */
+    unsigned long      filter_events;          /* event mask from IM */
+    XICCallback                geometry_callback;      /* client callback */
+    char *             res_name;
+    char *             res_class;
+
+    XICCallback                destroy_callback;
+    XICCallback                string_conversion_callback;
+    XIMStringConversionText     string_conversion;
+    XIMResetState      reset_state;
+    XIMHotKeyTriggers  *hotkey;
+    XIMHotKeyState     hotkey_state;
+
+    ICPreeditAttributes        preedit_attr;           /* visuals of preedit area */
+    ICStatusAttributes status_attr;            /* visuals of status area */
+} XICCoreRec, *XICCore;
+
+
+/*
+ * an Input Context.  Implementations may need to extend this data
+ * structure to accomodate additional data, state information etc.
+ */
+typedef struct _XIC {
+    XICMethods         methods;                /* method list of this IC */
+    XICCoreRec         core;                   /* data of this IC */
+} XICRec;
+
+
+/* If the argument 'name' is appropriate for this loader, it instantiates an
+   XLCd object with appropriate locale methods and returns it. May return
+   NULL; in this case, the remaining loaders are tried. */
+typedef XLCd (*XLCdLoadProc)(
+    const char*                name
+);
+
+_XFUNCPROTOBEGIN
+
+extern XLCd _XOpenLC(
+    char*              name
+);
+
+extern void _XCloseLC(
+    XLCd               lcd
+);
+
+extern XLCd _XlcCurrentLC (void);
+
+extern Bool _XlcValidModSyntax(
+    const char*                mods,
+    const char* const *        valid
+);
+
+extern char *_XlcDefaultMapModifiers(
+    XLCd               lcd,
+    _Xconst char*              user_mods,
+    _Xconst char*              prog_mods
+);
+
+extern void _XIMCompileResourceList(
+    XIMResourceList    /* res */,
+    unsigned int       /* num_res */
+);
+
+extern void _XCopyToArg(
+    XPointer           /* src */,
+    XPointer*          /* dst */,
+    unsigned int       /* size */
+);
+
+extern char ** _XParseBaseFontNameList(
+    char*              /* str */,
+    int*               /* num */
+);
+
+extern XrmMethods _XrmInitParseInfo(
+       XPointer*       statep
+);
+
+extern void _XRegisterFilterByMask(
+    Display*           /* dpy */,
+    Window             /* window */,
+    unsigned long      /* event_mask */,
+    Bool (*)(
+            Display*   /* display */,
+            Window     /* window */,
+            XEvent*    /* event */,
+            XPointer   /* client_data */
+            )          /* filter */,
+    XPointer           /* client_data */
+);
+
+extern void _XRegisterFilterByType(
+    Display*           /* dpy */,
+    Window             /* window */,
+    int                        /* start_type */,
+    int                        /* end_type */,
+    Bool (*)(
+            Display*   /* display */,
+            Window     /* window */,
+            XEvent*    /* event */,
+            XPointer   /* client_data */
+            )          /* filter */,
+    XPointer           /* client_data */
+);
+
+extern void _XUnregisterFilter(
+    Display*           /* dpy */,
+    Window             /* window */,
+    Bool (*)(
+            Display*   /* display */,
+            Window     /* window */,
+            XEvent*    /* event */,
+            XPointer   /* client_data */
+            )          /* filter */,
+    XPointer           /* client_data */
+);
+
+extern void _XlcCountVaList(
+    va_list            var,
+    int*               count_return
+);
+
+extern void _XlcVaToArgList(
+    va_list            var,
+    int                        count,
+    XlcArgList*                args_return
+);
+
+
+extern void _XlcCopyFromArg(
+    char *             src,
+    char *             dst,
+    int                        size
+);
+
+extern void _XlcCopyToArg(
+    char *             src,
+    char **            dst,
+    int                        size
+);
+
+extern void _XlcCompileResourceList(
+    XlcResourceList    resources,
+    int                        num_resources
+);
+
+extern char *_XlcGetValues(
+    XPointer           base,
+    XlcResourceList    resources,
+    int                        num_resources,
+    XlcArgList         args,
+    int                        num_args,
+    unsigned long      mask
+);
+
+extern char *_XlcSetValues(
+    XPointer           base,
+    XlcResourceList    resources,
+    int                        num_resources,
+    XlcArgList         args,
+    int                        num_args,
+    unsigned long      mask
+);
+
+/* documented in i18n/Framework.PS */
+extern void _XlcInitLoader (void);
+
+extern void _XlcDeInitLoader (void);
+
+/* documented in i18n/Framework.PS */
+/* Returns True on success, False on failure. */
+extern Bool _XlcAddLoader(
+    XLCdLoadProc       proc,
+    XlcPosition                position
+);
+
+/* documented in i18n/Framework.PS */
+extern void _XlcRemoveLoader(
+    XLCdLoadProc       proc
+);
+
+/* Registers UTF-8 converters for a non-UTF-8 locale. */
+extern void _XlcAddUtf8Converters(
+    XLCd               lcd
+);
+
+/* Registers UTF-8 converters for a UTF-8 locale. */
+extern void _XlcAddUtf8LocaleConverters(
+    XLCd               lcd
+);
+
+/* Registers GB18030 converters for a GB18030 locale. */
+extern void _XlcAddGB18030LocaleConverters(
+    XLCd               lcd
+);
+
+/* The default locale loader. Assumes an ASCII encoding. */
+extern XLCd _XlcDefaultLoader(
+    const char*                name
+);
+
+/* The generic locale loader. Suitable for all encodings except UTF-8.
+   Uses an XLC_LOCALE configuration file. */
+extern XLCd _XlcGenericLoader(
+    const char*                name
+);
+
+/* The UTF-8 locale loader. Suitable for UTF-8 encoding.
+   Uses an XLC_LOCALE configuration file. */
+extern XLCd _XlcUtf8Loader(
+    const char*                name
+);
+
+/* The old EUC locale loader. */
+extern XLCd _XlcEucLoader(
+    const char*                name
+);
+
+/* The old SJIS locale loader. */
+extern XLCd _XlcSjisLoader(
+    const char*                name
+);
+
+/* The old ISO-2022-JP locale loader. */
+extern XLCd _XlcJisLoader(
+    const char*                name
+);
+
+extern XLCd _XlcDynamicLoad(
+    const char*                name
+);
+
+/* The old dynamic loader. */
+extern XLCd _XlcDynamicLoader(
+    const char*                name
+);
+
+extern Bool _XInitDefaultIM(
+    XLCd               lcd
+);
+
+extern Bool _XInitDefaultOM(
+    XLCd               lcd
+);
+
+extern Bool _XInitDynamicIM(
+    XLCd               lcd
+);
+
+extern Bool _XInitDynamicOM(
+    XLCd               lcd
+);
+
+_XFUNCPROTOEND
+
+#endif /* !_XP_PRINT_SERVER_ */
+
+#endif /* _XLCINT_H_ */
diff --git a/src/xlibi18n/imKStoUCS.c b/src/xlibi18n/imKStoUCS.c
new file mode 100644 (file)
index 0000000..640b351
--- /dev/null
@@ -0,0 +1,322 @@
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Ximint.h"
+
+static unsigned short const keysym_to_unicode_1a1_1ff[] = {
+            0x0104, 0x02d8, 0x0141, 0x0000, 0x013d, 0x015a, 0x0000, /* 0x01a0-0x01a7 */
+    0x0000, 0x0160, 0x015e, 0x0164, 0x0179, 0x0000, 0x017d, 0x017b, /* 0x01a8-0x01af */
+    0x0000, 0x0105, 0x02db, 0x0142, 0x0000, 0x013e, 0x015b, 0x02c7, /* 0x01b0-0x01b7 */
+    0x0000, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c, /* 0x01b8-0x01bf */
+    0x0154, 0x0000, 0x0000, 0x0102, 0x0000, 0x0139, 0x0106, 0x0000, /* 0x01c0-0x01c7 */
+    0x010c, 0x0000, 0x0118, 0x0000, 0x011a, 0x0000, 0x0000, 0x010e, /* 0x01c8-0x01cf */
+    0x0110, 0x0143, 0x0147, 0x0000, 0x0000, 0x0150, 0x0000, 0x0000, /* 0x01d0-0x01d7 */
+    0x0158, 0x016e, 0x0000, 0x0170, 0x0000, 0x0000, 0x0162, 0x0000, /* 0x01d8-0x01df */
+    0x0155, 0x0000, 0x0000, 0x0103, 0x0000, 0x013a, 0x0107, 0x0000, /* 0x01e0-0x01e7 */
+    0x010d, 0x0000, 0x0119, 0x0000, 0x011b, 0x0000, 0x0000, 0x010f, /* 0x01e8-0x01ef */
+    0x0111, 0x0144, 0x0148, 0x0000, 0x0000, 0x0151, 0x0000, 0x0000, /* 0x01f0-0x01f7 */
+    0x0159, 0x016f, 0x0000, 0x0171, 0x0000, 0x0000, 0x0163, 0x02d9  /* 0x01f8-0x01ff */
+};
+
+static unsigned short const keysym_to_unicode_2a1_2fe[] = {
+            0x0126, 0x0000, 0x0000, 0x0000, 0x0000, 0x0124, 0x0000, /* 0x02a0-0x02a7 */
+    0x0000, 0x0130, 0x0000, 0x011e, 0x0134, 0x0000, 0x0000, 0x0000, /* 0x02a8-0x02af */
+    0x0000, 0x0127, 0x0000, 0x0000, 0x0000, 0x0000, 0x0125, 0x0000, /* 0x02b0-0x02b7 */
+    0x0000, 0x0131, 0x0000, 0x011f, 0x0135, 0x0000, 0x0000, 0x0000, /* 0x02b8-0x02bf */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x010a, 0x0108, 0x0000, /* 0x02c0-0x02c7 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x02c8-0x02cf */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0120, 0x0000, 0x0000, /* 0x02d0-0x02d7 */
+    0x011c, 0x0000, 0x0000, 0x0000, 0x0000, 0x016c, 0x015c, 0x0000, /* 0x02d8-0x02df */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x010b, 0x0109, 0x0000, /* 0x02e0-0x02e7 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x02e8-0x02ef */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0121, 0x0000, 0x0000, /* 0x02f0-0x02f7 */
+    0x011d, 0x0000, 0x0000, 0x0000, 0x0000, 0x016d, 0x015d          /* 0x02f8-0x02ff */
+};
+
+static unsigned short const keysym_to_unicode_3a2_3fe[] = {
+                    0x0138, 0x0156, 0x0000, 0x0128, 0x013b, 0x0000, /* 0x03a0-0x03a7 */
+    0x0000, 0x0000, 0x0112, 0x0122, 0x0166, 0x0000, 0x0000, 0x0000, /* 0x03a8-0x03af */
+    0x0000, 0x0000, 0x0000, 0x0157, 0x0000, 0x0129, 0x013c, 0x0000, /* 0x03b0-0x03b7 */
+    0x0000, 0x0000, 0x0113, 0x0123, 0x0167, 0x014a, 0x0000, 0x014b, /* 0x03b8-0x03bf */
+    0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x012e, /* 0x03c0-0x03c7 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0116, 0x0000, 0x0000, 0x012a, /* 0x03c8-0x03cf */
+    0x0000, 0x0145, 0x014c, 0x0136, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x03d0-0x03d7 */
+    0x0000, 0x0172, 0x0000, 0x0000, 0x0000, 0x0168, 0x016a, 0x0000, /* 0x03d8-0x03df */
+    0x0101, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x012f, /* 0x03e0-0x03e7 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0117, 0x0000, 0x0000, 0x012b, /* 0x03e8-0x03ef */
+    0x0000, 0x0146, 0x014d, 0x0137, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x03f0-0x03f7 */
+    0x0000, 0x0173, 0x0000, 0x0000, 0x0000, 0x0169, 0x016b          /* 0x03f8-0x03ff */
+};
+
+static unsigned short const keysym_to_unicode_4a1_4df[] = {
+            0x3002, 0x3008, 0x3009, 0x3001, 0x30fb, 0x30f2, 0x30a1, /* 0x04a0-0x04a7 */
+    0x30a3, 0x30a5, 0x30a7, 0x30a9, 0x30e3, 0x30e5, 0x30e7, 0x30c3, /* 0x04a8-0x04af */
+    0x30fc, 0x30a2, 0x30a4, 0x30a6, 0x30a8, 0x30aa, 0x30ab, 0x30ad, /* 0x04b0-0x04b7 */
+    0x30af, 0x30b1, 0x30b3, 0x30b5, 0x30b7, 0x30b9, 0x30bb, 0x30bd, /* 0x04b8-0x04bf */
+    0x30bf, 0x30c1, 0x30c4, 0x30c6, 0x30c8, 0x30ca, 0x30cb, 0x30cc, /* 0x04c0-0x04c7 */
+    0x30cd, 0x30ce, 0x30cf, 0x30d2, 0x30d5, 0x30d8, 0x30db, 0x30de, /* 0x04c8-0x04cf */
+    0x30df, 0x30e0, 0x30e1, 0x30e2, 0x30e4, 0x30e6, 0x30e8, 0x30e9, /* 0x04d0-0x04d7 */
+    0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ef, 0x30f3, 0x309b, 0x309c  /* 0x04d8-0x04df */
+};
+
+static unsigned short const keysym_to_unicode_590_5fe[] = {
+    0x06f0, 0x06f1, 0x06f2, 0x06f3, 0x06f4, 0x06f5, 0x06f6, 0x06f7, /* 0x0590-0x0597 */
+    0x06f8, 0x06f9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x0598-0x059f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x066a, 0x0670, 0x0679, /* 0x05a0-0x05a7 */
+
+    0x067e, 0x0686, 0x0688, 0x0691, 0x060c, 0x0000, 0x06d4, 0x0000, /* 0x05ac-0x05af */
+    0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, /* 0x05b0-0x05b7 */
+    0x0668, 0x0669, 0x0000, 0x061b, 0x0000, 0x0000, 0x0000, 0x061f, /* 0x05b8-0x05bf */
+    0x0000, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, /* 0x05c0-0x05c7 */
+    0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, /* 0x05c8-0x05cf */
+    0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, /* 0x05d0-0x05d7 */
+    0x0638, 0x0639, 0x063a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x05d8-0x05df */
+    0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, /* 0x05e0-0x05e7 */
+    0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, /* 0x05e8-0x05ef */
+    0x0650, 0x0651, 0x0652, 0x0653, 0x0654, 0x0655, 0x0698, 0x06a4, /* 0x05f0-0x05f7 */
+    0x06a9, 0x06af, 0x06ba, 0x06be, 0x06cc, 0x06d2, 0x06c1          /* 0x05f8-0x05fe */
+};
+
+static unsigned short keysym_to_unicode_680_6ff[] = {
+    0x0492, 0x0496, 0x049a, 0x049c, 0x04a2, 0x04ae, 0x04b0, 0x04b2, /* 0x0680-0x0687 */
+    0x04b6, 0x04b8, 0x04ba, 0x0000, 0x04d8, 0x04e2, 0x04e8, 0x04ee, /* 0x0688-0x068f */
+    0x0493, 0x0497, 0x049b, 0x049d, 0x04a3, 0x04af, 0x04b1, 0x04b3, /* 0x0690-0x0697 */
+    0x04b7, 0x04b9, 0x04bb, 0x0000, 0x04d9, 0x04e3, 0x04e9, 0x04ef, /* 0x0698-0x069f */
+    0x0000, 0x0452, 0x0453, 0x0451, 0x0454, 0x0455, 0x0456, 0x0457, /* 0x06a0-0x06a7 */
+    0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x0491, 0x045e, 0x045f, /* 0x06a8-0x06af */
+    0x2116, 0x0402, 0x0403, 0x0401, 0x0404, 0x0405, 0x0406, 0x0407, /* 0x06b0-0x06b7 */
+    0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x0490, 0x040e, 0x040f, /* 0x06b8-0x06bf */
+    0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433, /* 0x06c0-0x06c7 */
+    0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, /* 0x06c8-0x06cf */
+    0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432, /* 0x06d0-0x06d7 */
+    0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a, /* 0x06d8-0x06df */
+    0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413, /* 0x06e0-0x06e7 */
+    0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, /* 0x06e8-0x06ef */
+    0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412, /* 0x06f0-0x06f7 */
+    0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a  /* 0x06f8-0x06ff */
+};
+
+static unsigned short const keysym_to_unicode_7a1_7f9[] = {
+            0x0386, 0x0388, 0x0389, 0x038a, 0x03aa, 0x0000, 0x038c, /* 0x07a0-0x07a7 */
+    0x038e, 0x03ab, 0x0000, 0x038f, 0x0000, 0x0000, 0x0385, 0x2015, /* 0x07a8-0x07af */
+    0x0000, 0x03ac, 0x03ad, 0x03ae, 0x03af, 0x03ca, 0x0390, 0x03cc, /* 0x07b0-0x07b7 */
+    0x03cd, 0x03cb, 0x03b0, 0x03ce, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x07b8-0x07bf */
+    0x0000, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, /* 0x07c0-0x07c7 */
+    0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, /* 0x07c8-0x07cf */
+    0x03a0, 0x03a1, 0x03a3, 0x0000, 0x03a4, 0x03a5, 0x03a6, 0x03a7, /* 0x07d0-0x07d7 */
+    0x03a8, 0x03a9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x07d8-0x07df */
+    0x0000, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, /* 0x07e0-0x07e7 */
+    0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, /* 0x07e8-0x07ef */
+    0x03c0, 0x03c1, 0x03c3, 0x03c2, 0x03c4, 0x03c5, 0x03c6, 0x03c7, /* 0x07f0-0x07f7 */
+    0x03c8, 0x03c9                                                  /* 0x07f8-0x07ff */
+};
+
+static unsigned short const keysym_to_unicode_8a4_8fe[] = {
+                                    0x2320, 0x2321, 0x0000, 0x231c, /* 0x08a0-0x08a7 */
+    0x231d, 0x231e, 0x231f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x08a8-0x08af */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x08b0-0x08b7 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x2264, 0x2260, 0x2265, 0x222b, /* 0x08b8-0x08bf */
+    0x2234, 0x0000, 0x221e, 0x0000, 0x0000, 0x2207, 0x0000, 0x0000, /* 0x08c0-0x08c7 */
+    0x2245, 0x2246, 0x0000, 0x0000, 0x0000, 0x0000, 0x21d2, 0x0000, /* 0x08c8-0x08cf */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x221a, 0x0000, /* 0x08d0-0x08d7 */
+    0x0000, 0x0000, 0x2282, 0x2283, 0x2229, 0x222a, 0x2227, 0x2228, /* 0x08d8-0x08df */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x08e0-0x08e7 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2202, /* 0x08e8-0x08ef */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0192, 0x0000, /* 0x08f0-0x08f7 */
+    0x0000, 0x0000, 0x0000, 0x2190, 0x2191, 0x2192, 0x2193          /* 0x08f8-0x08ff */
+};
+
+static unsigned short const keysym_to_unicode_9df_9f8[] = {
+                                                            0x2422, /* 0x09d8-0x09df */
+    0x2666, 0x25a6, 0x2409, 0x240c, 0x240d, 0x240a, 0x0000, 0x0000, /* 0x09e0-0x09e7 */
+    0x240a, 0x240b, 0x2518, 0x2510, 0x250c, 0x2514, 0x253c, 0x2500, /* 0x09e8-0x09ef */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x251c, 0x2524, 0x2534, 0x252c, /* 0x09f0-0x09f7 */
+    0x2502                                                          /* 0x09f8-0x09ff */
+};
+
+static unsigned short const keysym_to_unicode_aa1_afe[] = {
+            0x2003, 0x2002, 0x2004, 0x2005, 0x2007, 0x2008, 0x2009, /* 0x0aa0-0x0aa7 */
+    0x200a, 0x2014, 0x2013, 0x0000, 0x0000, 0x0000, 0x2026, 0x2025, /* 0x0aa8-0x0aaf */
+    0x2153, 0x2154, 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x215a, /* 0x0ab0-0x0ab7 */
+    0x2105, 0x0000, 0x0000, 0x2012, 0x2039, 0x2024, 0x203a, 0x0000, /* 0x0ab8-0x0abf */
+    0x0000, 0x0000, 0x0000, 0x215b, 0x215c, 0x215d, 0x215e, 0x0000, /* 0x0ac0-0x0ac7 */
+    0x0000, 0x2122, 0x2120, 0x0000, 0x25c1, 0x25b7, 0x25cb, 0x25ad, /* 0x0ac8-0x0acf */
+    0x2018, 0x2019, 0x201c, 0x201d, 0x211e, 0x2030, 0x2032, 0x2033, /* 0x0ad0-0x0ad7 */
+    0x0000, 0x271d, 0x0000, 0x220e, 0x25c2, 0x2023, 0x25cf, 0x25ac, /* 0x0ad8-0x0adf */
+    0x25e6, 0x25ab, 0x25ae, 0x25b5, 0x25bf, 0x2606, 0x2022, 0x25aa, /* 0x0ae0-0x0ae7 */
+    0x25b4, 0x25be, 0x261a, 0x261b, 0x2663, 0x2666, 0x2665, 0x0000, /* 0x0ae8-0x0aef */
+    0x2720, 0x2020, 0x2021, 0x2713, 0x2612, 0x266f, 0x266d, 0x2642, /* 0x0af0-0x0af7 */
+    0x2640, 0x2121, 0x2315, 0x2117, 0x2038, 0x201a, 0x201e          /* 0x0af8-0x0aff */
+};
+
+/* none of the APL keysyms match the Unicode characters */
+
+static unsigned short const keysym_to_unicode_cdf_cfa[] = {
+                                                            0x2017, /* 0x0cd8-0x0cdf */
+    0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, /* 0x0ce0-0x0ce7 */
+    0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, /* 0x0ce8-0x0cef */
+    0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, /* 0x0cf0-0x0cf7 */
+    0x05e8, 0x05e9, 0x05ea                                          /* 0x0cf8-0x0cff */
+};
+
+static unsigned short const keysym_to_unicode_da1_df9[] = {
+            0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07, /* 0x0da0-0x0da7 */
+    0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f, /* 0x0da8-0x0daf */
+    0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17, /* 0x0db0-0x0db7 */
+    0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f, /* 0x0db8-0x0dbf */
+    0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27, /* 0x0dc0-0x0dc7 */
+    0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f, /* 0x0dc8-0x0dcf */
+    0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37, /* 0x0dd0-0x0dd7 */
+    0x0e38, 0x0e39, 0x0e3a, 0x0000, 0x0000, 0x0000, 0x0e3e, 0x0e3f, /* 0x0dd8-0x0ddf */
+    0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47, /* 0x0de0-0x0de7 */
+    0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0000, 0x0000, /* 0x0de8-0x0def */
+    0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57, /* 0x0df0-0x0df7 */
+    0x0e58, 0x0e59                                                  /* 0x0df8-0x0dff */
+};
+
+static unsigned short const keysym_to_unicode_ea0_eff[] = {
+    0x0000, 0x1101, 0x1101, 0x11aa, 0x1102, 0x11ac, 0x11ad, 0x1103, /* 0x0ea0-0x0ea7 */
+    0x1104, 0x1105, 0x11b0, 0x11b1, 0x11b2, 0x11b3, 0x11b4, 0x11b5, /* 0x0ea8-0x0eaf */
+    0x11b6, 0x1106, 0x1107, 0x1108, 0x11b9, 0x1109, 0x110a, 0x110b, /* 0x0eb0-0x0eb7 */
+    0x110c, 0x110d, 0x110e, 0x110f, 0x1110, 0x1111, 0x1112, 0x1161, /* 0x0eb8-0x0ebf */
+    0x1162, 0x1163, 0x1164, 0x1165, 0x1166, 0x1167, 0x1168, 0x1169, /* 0x0ec0-0x0ec7 */
+    0x116a, 0x116b, 0x116c, 0x116d, 0x116e, 0x116f, 0x1170, 0x1171, /* 0x0ec8-0x0ecf */
+    0x1172, 0x1173, 0x1174, 0x1175, 0x11a8, 0x11a9, 0x11aa, 0x11ab, /* 0x0ed0-0x0ed7 */
+    0x11ac, 0x11ad, 0x11ae, 0x11af, 0x11b0, 0x11b1, 0x11b2, 0x11b3, /* 0x0ed8-0x0edf */
+    0x11b4, 0x11b5, 0x11b6, 0x11b7, 0x11b8, 0x11b9, 0x11ba, 0x11bb, /* 0x0ee0-0x0ee7 */
+    0x11bc, 0x11bd, 0x11be, 0x11bf, 0x11c0, 0x11c1, 0x11c2, 0x0000, /* 0x0ee8-0x0eef */
+    0x0000, 0x0000, 0x1140, 0x0000, 0x0000, 0x1159, 0x119e, 0x0000, /* 0x0ef0-0x0ef7 */
+    0x11eb, 0x0000, 0x11f9, 0x0000, 0x0000, 0x0000, 0x0000, 0x20a9, /* 0x0ef8-0x0eff */
+};
+
+static unsigned short keysym_to_unicode_12a1_12fe[] = {
+            0x1e02, 0x1e03, 0x0000, 0x0000, 0x0000, 0x1e0a, 0x0000, /* 0x12a0-0x12a7 */
+    0x1e80, 0x0000, 0x1e82, 0x1e0b, 0x1ef2, 0x0000, 0x0000, 0x0000, /* 0x12a8-0x12af */
+    0x1e1e, 0x1e1f, 0x0000, 0x0000, 0x1e40, 0x1e41, 0x0000, 0x1e56, /* 0x12b0-0x12b7 */
+    0x1e81, 0x1e57, 0x1e83, 0x1e60, 0x1ef3, 0x1e84, 0x1e85, 0x1e61, /* 0x12b8-0x12bf */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x12c0-0x12c7 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x12c8-0x12cf */
+    0x0174, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1e6a, /* 0x12d0-0x12d7 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0176, 0x0000, /* 0x12d8-0x12df */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x12e0-0x12e7 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x12e8-0x12ef */
+    0x0175, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1e6b, /* 0x12f0-0x12f7 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0177          /* 0x12f0-0x12ff */
+};
+
+static unsigned short const keysym_to_unicode_13bc_13be[] = {
+                                    0x0152, 0x0153, 0x0178          /* 0x13b8-0x13bf */
+};
+
+static unsigned short keysym_to_unicode_14a1_14ff[] = {
+            0x2741, 0x00a7, 0x0589, 0x0029, 0x0028, 0x00bb, 0x00ab, /* 0x14a0-0x14a7 */
+    0x2014, 0x002e, 0x055d, 0x002c, 0x2013, 0x058a, 0x2026, 0x055c, /* 0x14a8-0x14af */
+    0x055b, 0x055e, 0x0531, 0x0561, 0x0532, 0x0562, 0x0533, 0x0563, /* 0x14b0-0x14b7 */
+    0x0534, 0x0564, 0x0535, 0x0565, 0x0536, 0x0566, 0x0537, 0x0567, /* 0x14b8-0x14bf */
+    0x0538, 0x0568, 0x0539, 0x0569, 0x053a, 0x056a, 0x053b, 0x056b, /* 0x14c0-0x14c7 */
+    0x053c, 0x056c, 0x053d, 0x056d, 0x053e, 0x056e, 0x053f, 0x056f, /* 0x14c8-0x14cf */
+    0x0540, 0x0570, 0x0541, 0x0571, 0x0542, 0x0572, 0x0543, 0x0573, /* 0x14d0-0x14d7 */
+    0x0544, 0x0574, 0x0545, 0x0575, 0x0546, 0x0576, 0x0547, 0x0577, /* 0x14d8-0x14df */
+    0x0548, 0x0578, 0x0549, 0x0579, 0x054a, 0x057a, 0x054b, 0x057b, /* 0x14e0-0x14e7 */
+    0x054c, 0x057c, 0x054d, 0x057d, 0x054e, 0x057e, 0x054f, 0x057f, /* 0x14e8-0x14ef */
+    0x0550, 0x0580, 0x0551, 0x0581, 0x0552, 0x0582, 0x0553, 0x0583, /* 0x14f0-0x14f7 */
+    0x0554, 0x0584, 0x0555, 0x0585, 0x0556, 0x0586, 0x2019, 0x0027, /* 0x14f8-0x14ff */
+};
+
+static unsigned short keysym_to_unicode_15d0_15f6[] = {
+    0x10d0, 0x10d1, 0x10d2, 0x10d3, 0x10d4, 0x10d5, 0x10d6, 0x10d7, /* 0x15d0-0x15d7 */
+    0x10d8, 0x10d9, 0x10da, 0x10db, 0x10dc, 0x10dd, 0x10de, 0x10df, /* 0x15d8-0x15df */
+    0x10e0, 0x10e1, 0x10e2, 0x10e3, 0x10e4, 0x10e5, 0x10e6, 0x10e7, /* 0x15e0-0x15e7 */
+    0x10e8, 0x10e9, 0x10ea, 0x10eb, 0x10ec, 0x10ed, 0x10ee, 0x10ef, /* 0x15e8-0x15ef */
+    0x10f0, 0x10f1, 0x10f2, 0x10f3, 0x10f4, 0x10f5, 0x10f6          /* 0x15f0-0x15f7 */
+};
+
+static unsigned short keysym_to_unicode_16a0_16f6[] = {
+    0x0000, 0x0000, 0xf0a2, 0x1e8a, 0x0000, 0xf0a5, 0x012c, 0xf0a7, /* 0x16a0-0x16a7 */
+    0xf0a8, 0x01b5, 0x01e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x019f, /* 0x16a8-0x16af */
+    0x0000, 0x0000, 0xf0b2, 0x1e8b, 0x01d1, 0xf0b5, 0x012d, 0xf0b7, /* 0x16b0-0x16b7 */
+    0xf0b8, 0x01b6, 0x01e7, 0x0000, 0x0000, 0x01d2, 0x0000, 0x0275, /* 0x16b8-0x16bf */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x018f, 0x0000, /* 0x16c0-0x16c7 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x16c8-0x16cf */
+    0x0000, 0x1e36, 0xf0d2, 0xf0d3, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x16d0-0x16d7 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x16d8-0x16df */
+    0x0000, 0x1e37, 0xf0e2, 0xf0e3, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x16e0-0x16e7 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /* 0x16e8-0x16ef */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0259          /* 0x16f0-0x16f6 */
+};
+
+static unsigned short const keysym_to_unicode_1e9f_1eff[] = {
+                                                            0x0303,
+    0x1ea0, 0x1ea1, 0x1ea2, 0x1ea3, 0x1ea4, 0x1ea5, 0x1ea6, 0x1ea7, /* 0x1ea0-0x1ea7 */
+    0x1ea8, 0x1ea9, 0x1eaa, 0x1eab, 0x1eac, 0x1ead, 0x1eae, 0x1eaf, /* 0x1ea8-0x1eaf */
+    0x1eb0, 0x1eb1, 0x1eb2, 0x1eb3, 0x1eb4, 0x1eb5, 0x1eb6, 0x1eb7, /* 0x1eb0-0x1eb7 */
+    0x1eb8, 0x1eb9, 0x1eba, 0x1ebb, 0x1ebc, 0x1ebd, 0x1ebe, 0x1ebf, /* 0x1eb8-0x1ebf */
+    0x1ec0, 0x1ec1, 0x1ec2, 0x1ec3, 0x1ec4, 0x1ec5, 0x1ec6, 0x1ec7, /* 0x1ec0-0x1ec7 */
+    0x1ec8, 0x1ec9, 0x1eca, 0x1ecb, 0x1ecc, 0x1ecd, 0x1ece, 0x1ecf, /* 0x1ec8-0x1ecf */
+    0x1ed0, 0x1ed1, 0x1ed2, 0x1ed3, 0x1ed4, 0x1ed5, 0x1ed6, 0x1ed7, /* 0x1ed0-0x1ed7 */
+    0x1ed8, 0x1ed9, 0x1eda, 0x1edb, 0x1edc, 0x1edd, 0x1ede, 0x1edf, /* 0x1ed8-0x1edf */
+    0x1ee0, 0x1ee1, 0x1ee2, 0x1ee3, 0x1ee4, 0x1ee5, 0x1ee6, 0x1ee7, /* 0x1ee0-0x1ee7 */
+    0x1ee8, 0x1ee9, 0x1eea, 0x1eeb, 0x1eec, 0x1eed, 0x1eee, 0x1eef, /* 0x1ee8-0x1eef */
+    0x1ef0, 0x1ef1, 0x0300, 0x0301, 0x1ef4, 0x1ef5, 0x1ef6, 0x1ef7, /* 0x1ef0-0x1ef7 */
+    0x1ef8, 0x1ef9, 0x01a0, 0x01a1, 0x01af, 0x01b0, 0x0309, 0x0323  /* 0x1ef8-0x1eff */
+};
+
+static unsigned short const keysym_to_unicode_20a0_20ac[] = {
+    0x20a0, 0x20a1, 0x20a2, 0x20a3, 0x20a4, 0x20a5, 0x20a6, 0x20a7, /* 0x20a0-0x20a7 */
+    0x20a8, 0x20a9, 0x20aa, 0x20ab, 0x20ac                          /* 0x20a8-0x20af */
+};
+
+unsigned int
+KeySymToUcs4(KeySym keysym)
+{
+    /* 'Unicode keysym' */
+    if ((keysym & 0xff000000) == 0x01000000)
+        return (keysym & 0x00ffffff);
+
+    if (keysym > 0 && keysym < 0x100)
+       return keysym;
+    else if (keysym > 0x1a0 && keysym < 0x200)
+       return keysym_to_unicode_1a1_1ff[keysym - 0x1a1];
+    else if (keysym > 0x2a0 && keysym < 0x2ff)
+       return keysym_to_unicode_2a1_2fe[keysym - 0x2a1];
+    else if (keysym > 0x3a1 && keysym < 0x3ff)
+       return keysym_to_unicode_3a2_3fe[keysym - 0x3a2];
+    else if (keysym > 0x4a0 && keysym < 0x4e0)
+       return keysym_to_unicode_4a1_4df[keysym - 0x4a1];
+    else if (keysym > 0x589 && keysym < 0x5ff)
+       return keysym_to_unicode_590_5fe[keysym - 0x590];
+    else if (keysym > 0x67f && keysym < 0x700)
+       return keysym_to_unicode_680_6ff[keysym - 0x680];
+    else if (keysym > 0x7a0 && keysym < 0x7fa)
+       return keysym_to_unicode_7a1_7f9[keysym - 0x7a1];
+    else if (keysym > 0x8a3 && keysym < 0x8ff)
+       return keysym_to_unicode_8a4_8fe[keysym - 0x8a4];
+    else if (keysym > 0x9de && keysym < 0x9f9)
+       return keysym_to_unicode_9df_9f8[keysym - 0x9df];
+    else if (keysym > 0xaa0 && keysym < 0xaff)
+       return keysym_to_unicode_aa1_afe[keysym - 0xaa1];
+    else if (keysym > 0xcde && keysym < 0xcfb)
+       return keysym_to_unicode_cdf_cfa[keysym - 0xcdf];
+    else if (keysym > 0xda0 && keysym < 0xdfa)
+       return keysym_to_unicode_da1_df9[keysym - 0xda1];
+    else if (keysym > 0xe9f && keysym < 0xf00)
+       return keysym_to_unicode_ea0_eff[keysym - 0xea0];
+    else if (keysym > 0x12a0 && keysym < 0x12ff)
+       return keysym_to_unicode_12a1_12fe[keysym - 0x12a1];
+    else if (keysym > 0x13bb && keysym < 0x13bf)
+       return keysym_to_unicode_13bc_13be[keysym - 0x13bc];
+    else if (keysym > 0x14a0 && keysym < 0x1500)
+        return keysym_to_unicode_14a1_14ff[keysym - 0x14a1];
+    else if (keysym > 0x15cf && keysym < 0x15f7)
+       return keysym_to_unicode_15d0_15f6[keysym - 0x15d0];
+    else if (keysym > 0x169f && keysym < 0x16f7)
+       return keysym_to_unicode_16a0_16f6[keysym - 0x16a0];
+    else if (keysym > 0x1e9e && keysym < 0x1f00)
+       return keysym_to_unicode_1e9f_1eff[keysym - 0x1e9f];
+    else if (keysym > 0x209f && keysym < 0x20ad)
+       return keysym_to_unicode_20a0_20ac[keysym - 0x20a0];
+    else
+       return 0;
+}
diff --git a/src/xlibi18n/lcCT.c b/src/xlibi18n/lcCT.c
new file mode 100644 (file)
index 0000000..2fbe8aa
--- /dev/null
@@ -0,0 +1,1303 @@
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * 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 TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA 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.
+ *
+ * Author: Katsuhisa Yano      TOSHIBA Corp.
+ *                             mopi@osa.ilab.toshiba.co.jp
+ */
+/*
+ * Copyright 1995 by FUJITSU LIMITED
+ * This is source code modified by FUJITSU LIMITED under the Joint
+ * Development Agreement for the CDE/Motif PST.
+ *
+ * Modifier: Takanori Tateno   FUJITSU LIMITED
+ *
+ */
+/*
+ *  2000
+ *  Modifier: Ivan Pascal     The XFree86 Project
+ *  Modifier: Bruno Haible    The XFree86 Project
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XlcPubI.h"
+#include <X11/Xos.h>
+#include <stdio.h>
+
+
+/* ====================== Built-in Character Sets ====================== */
+
+/*
+ * Static representation of a character set that can be used in Compound Text.
+ */
+typedef struct _CTDataRec {
+    const char name[19];
+    const char ct_sequence[5]; /* Compound Text encoding, ESC sequence */
+} CTDataRec, *CTData;
+
+static const CTDataRec default_ct_data[] =
+{
+    /*                                                                    */
+    /* X11 registry name       MIME name         ISO-IR      ESC sequence */
+    /*                                                                    */
+
+    /* Registered character sets with one byte per character */
+    { "ISO8859-1:GL",       /* US-ASCII              6   */  "\033(B" },
+    { "ISO8859-1:GR",       /* ISO-8859-1          100   */  "\033-A" },
+    { "ISO8859-2:GR",       /* ISO-8859-2          101   */  "\033-B" },
+    { "ISO8859-3:GR",       /* ISO-8859-3          109   */  "\033-C" },
+    { "ISO8859-4:GR",       /* ISO-8859-4          110   */  "\033-D" },
+    { "ISO8859-5:GR",       /* ISO-8859-5          144   */  "\033-L" },
+    { "ISO8859-6:GR",       /* ISO-8859-6          127   */  "\033-G" },
+    { "ISO8859-7:GR",       /* ISO-8859-7          126   */  "\033-F" },
+    { "ISO8859-8:GR",       /* ISO-8859-8          138   */  "\033-H" },
+    { "ISO8859-9:GR",       /* ISO-8859-9          148   */  "\033-M" },
+    { "ISO8859-10:GR",      /* ISO-8859-10         157   */  "\033-V" },
+    { "ISO8859-11:GR",      /* ISO-8859-11         166   */  "\033-T" },
+    { "ISO8859-13:GR",      /* ISO-8859-13         179   */  "\033-Y" },
+    { "ISO8859-14:GR",      /* ISO-8859-14         199   */  "\033-_" },
+    { "ISO8859-15:GR",      /* ISO-8859-15         203   */  "\033-b" },
+    { "ISO8859-16:GR",      /* ISO-8859-16         226   */  "\033-f" },
+    { "JISX0201.1976-0:GL", /* ISO-646-JP           14   */  "\033(J" },
+    { "JISX0201.1976-0:GR",                                  "\033)I" },
+#if 0
+    { "TIS620-0:GR",        /* TIS-620             166   */  "\033-T" },
+#endif
+
+    /* Registered character sets with two byte per character */
+    { "GB2312.1980-0:GL",   /* GB_2312-80           58   */ "\033$(A" },
+    { "GB2312.1980-0:GR",   /* GB_2312-80           58   */ "\033$)A" },
+    { "JISX0208.1983-0:GL", /* JIS_X0208-1983       87   */ "\033$(B" },
+    { "JISX0208.1983-0:GR", /* JIS_X0208-1983       87   */ "\033$)B" },
+    { "JISX0208.1990-0:GL", /* JIS_X0208-1990      168   */ "\033$(B" },
+    { "JISX0208.1990-0:GR", /* JIS_X0208-1990      168   */ "\033$)B" },
+    { "JISX0212.1990-0:GL", /* JIS_X0212-1990      159   */ "\033$(D" },
+    { "JISX0212.1990-0:GR", /* JIS_X0212-1990      159   */ "\033$)D" },
+    { "KSC5601.1987-0:GL",  /* KS_C_5601-1987      149   */ "\033$(C" },
+    { "KSC5601.1987-0:GR",  /* KS_C_5601-1987      149   */ "\033$)C" },
+    { "CNS11643.1986-1:GL", /* CNS 11643-1992 pl.1 171   */ "\033$(G" },
+    { "CNS11643.1986-1:GR", /* CNS 11643-1992 pl.1 171   */ "\033$)G" },
+    { "CNS11643.1986-2:GL", /* CNS 11643-1992 pl.2 172   */ "\033$(H" },
+    { "CNS11643.1986-2:GR", /* CNS 11643-1992 pl.2 172   */ "\033$)H" },
+    { "CNS11643.1992-3:GL", /* CNS 11643-1992 pl.3 183   */ "\033$(I" },
+    { "CNS11643.1992-3:GR", /* CNS 11643-1992 pl.3 183   */ "\033$)I" },
+    { "CNS11643.1992-4:GL", /* CNS 11643-1992 pl.4 184   */ "\033$(J" },
+    { "CNS11643.1992-4:GR", /* CNS 11643-1992 pl.4 184   */ "\033$)J" },
+    { "CNS11643.1992-5:GL", /* CNS 11643-1992 pl.5 185   */ "\033$(K" },
+    { "CNS11643.1992-5:GR", /* CNS 11643-1992 pl.5 185   */ "\033$)K" },
+    { "CNS11643.1992-6:GL", /* CNS 11643-1992 pl.6 186   */ "\033$(L" },
+    { "CNS11643.1992-6:GR", /* CNS 11643-1992 pl.6 186   */ "\033$)L" },
+    { "CNS11643.1992-7:GL", /* CNS 11643-1992 pl.7 187   */ "\033$(M" },
+    { "CNS11643.1992-7:GR", /* CNS 11643-1992 pl.7 187   */ "\033$)M" },
+
+    /* Registered encodings with a varying number of bytes per character */
+    { "ISO10646-1",         /* UTF-8               196   */ "\033%G"  },
+
+    /* Encodings without ISO-IR assigned escape sequence must be
+       defined in XLC_LOCALE files, using "\033%/1" or "\033%/2". */
+
+    /* Backward compatibility with XFree86 3.x */
+#if 1
+    { "ISO8859-14:GR",                                      "\033%/1" },
+    { "ISO8859-15:GR",                                      "\033%/1" },
+#endif
+    /* For use by utf8 -> ctext */
+    { "BIG5-0:GLGR", "\033%/2"},
+    { "BIG5HKSCS-0:GLGR", "\033%/2"},
+    { "GBK-0:GLGR", "\033%/2"},
+    /* used by Emacs, but not backed by ISO-IR */
+    { "BIG5-E0:GL", "\033$(0" },
+    { "BIG5-E0:GR", "\033$)0" },
+    { "BIG5-E1:GL", "\033$(1" },
+    { "BIG5-E1:GR", "\033$)1" },
+
+};
+
+/* We represent UTF-8 as an XlcGLGR charset, not in extended segments. */
+#define UTF8_IN_EXTSEQ 0
+
+/* ======================= Parsing ESC Sequences ======================= */
+
+#define XctC0          0x0000
+#define XctHT          0x0009
+#define XctNL          0x000a
+#define XctESC         0x001b
+#define XctGL          0x0020
+#define XctC1          0x0080
+#define XctCSI         0x009b
+#define XctGR          0x00a0
+#define XctSTX         0x0002
+
+#define XctCntrlFunc   0x0023
+#define XctMB          0x0024
+#define XctOtherCoding 0x0025
+#define XctGL94                0x0028
+#define XctGR94                0x0029
+#define XctGR96                0x002d
+#define XctNonStandard 0x002f
+#define XctIgnoreExt   0x0030
+#define XctNotIgnoreExt        0x0031
+#define XctLeftToRight 0x0031
+#define XctRightToLeft 0x0032
+#define XctDirection   0x005d
+#define XctDirectionEnd        0x005d
+
+#define XctGL94MB      0x2428
+#define XctGR94MB      0x2429
+#define XctExtSeg      0x252f
+#define XctReturn      0x2540
+
+/*
+ * Parses the header of a Compound Text segment, i.e. the charset designator.
+ * The string starts at *text and has *length bytes.
+ * Return value is one of:
+ *   0 (no valid charset designator),
+ *   XctGL94, XctGR94, XctGR96, XctGL94MB, XctGR94MB,
+ *   XctLeftToRight, XctRightToLeft, XctDirectionEnd,
+ *   XctExtSeg, XctOtherCoding, XctReturn, XctIgnoreExt, XctNotIgnoreExt.
+ * If the return value is not 0, *text is incremented and *length decremented,
+ * to point past the charset designator. If the return value is one of
+ *   XctGL94, XctGR94, XctGR96, XctGL94MB, XctGR94MB,
+ *   XctExtSeg, XctOtherCoding, XctIgnoreExt, XctNotIgnoreExt,
+ * *final_byte is set to the "final byte" of the charset designator.
+ */
+static unsigned int
+_XlcParseCT(
+    const char **text,
+    int *length,
+    unsigned char *final_byte)
+{
+    unsigned int ret = 0;
+    unsigned char ch;
+    const unsigned char *str = (const unsigned char *) *text;
+
+    *final_byte = 0;
+
+    if (*length < 1)
+        return 0;
+    switch (ch = *str++) {
+        case XctESC:
+            if (*length < 2)
+                return 0;
+            switch (ch = *str++) {
+                case XctOtherCoding:             /* % */
+                    if (*length < 3)
+                        return 0;
+                    ch = *str++;
+                    if (ch == XctNonStandard) {  /* / */
+                        if (*length < 4)
+                            return 0;
+                        ret = XctExtSeg;
+                        ch = *str++;
+                    } else if (ch == '@') {
+                        ret = XctReturn;
+                    } else {
+                        ret = XctOtherCoding;
+                    }
+                    *final_byte = ch;
+                    break;
+
+                case XctCntrlFunc:               /* # */
+                    if (*length < 4)
+                        return 0;
+                    *final_byte = *str++;
+                    switch (*str++) {
+                        case XctIgnoreExt:       /* 0 */
+                            ret = XctIgnoreExt;
+                            break;
+                        case XctNotIgnoreExt:    /* 1 */
+                            ret = XctNotIgnoreExt;
+                            break;
+                        default:
+                            ret = 0;
+                            break;
+                    }
+                    break;
+
+                case XctMB:                      /* $ */
+                    if (*length < 4)
+                        return 0;
+                    ch = *str++;
+                    switch (ch) {
+                        case XctGL94:            /* ( */
+                            ret = XctGL94MB;
+                            break;
+                        case XctGR94:            /* ) */
+                            ret = XctGR94MB;
+                            break;
+                        default:
+                            ret = 0;
+                            break;
+                    }
+                    *final_byte = *str++;
+                    break;
+
+                case XctGL94:                    /* ( */
+                    if (*length < 3)
+                        return 0;
+                    ret = XctGL94;
+                    *final_byte = *str++;
+                    break;
+                case XctGR94:                    /* ) */
+                    if (*length < 3)
+                        return 0;
+                    ret = XctGR94;
+                    *final_byte = *str++;
+                    break;
+                case XctGR96:                    /* - */
+                    if (*length < 3)
+                        return 0;
+                    ret = XctGR96;
+                    *final_byte = *str++;
+                    break;
+            }
+            break;
+        case XctCSI:
+           /* direction */
+            if (*length < 2)
+                return 0;
+            switch (*str++) {
+                case XctLeftToRight:
+                    if (*length < 3)
+                        return 0;
+                    if (*str++ == XctDirection)
+                        ret = XctLeftToRight;
+                    break;
+                case XctRightToLeft:
+                    if (*length < 3)
+                        return 0;
+                    if (*str++ == XctDirection)
+                        ret = XctRightToLeft;
+                    break;
+                case XctDirectionEnd:
+                    ret = XctDirectionEnd;
+                    break;
+            }
+            break;
+    }
+
+    if (ret) {
+        *length -= (const char *) str - *text;
+        *text = (const char *) str;
+    }
+    return ret;
+}
+
+/*
+ * Fills into a freshly created XlcCharSet the fields that can be inferred
+ * from the ESC sequence. These are side, char_size, set_size.
+ * Returns True if the charset can be used with Compound Text.
+ *
+ * Used by _XlcCreateDefaultCharSet.
+ */
+Bool
+_XlcParseCharSet(
+    XlcCharSet charset)
+{
+    unsigned int type;
+    unsigned char final_byte;
+    const char *ptr = charset->ct_sequence;
+    int length;
+    int char_size;
+
+    if (*ptr == '\0')
+       return False;
+
+    length = strlen(ptr);
+
+    type = _XlcParseCT(&ptr, &length, &final_byte);
+
+    /* Check for validity and determine char_size.
+       char_size = 0 means varying number of bytes per character. */
+    switch (type) {
+        case XctGL94:
+        case XctGR94:
+        case XctGR96:
+            char_size = 1;
+            break;
+        case XctGL94MB:
+        case XctGR94MB:
+            char_size = (final_byte < 0x60 ? 2 : final_byte < 0x70 ? 3 : 4);
+            break;
+        case XctExtSeg:
+            char_size = final_byte - '0';
+            if (!(char_size >= 0 && char_size <= 4))
+                return False;
+            break;
+        case XctOtherCoding:
+            char_size = 0;
+            break;
+        default:
+            return False;
+    }
+
+    charset->char_size = char_size;
+
+    /* Fill in other values. */
+    switch (type) {
+        case XctGL94:
+        case XctGL94MB:
+            charset->side = XlcGL;
+            charset->set_size = 94;
+            break;
+        case XctGR94:
+        case XctGR94MB:
+            charset->side = XlcGR;
+            charset->set_size = 94;
+            break;
+        case XctGR96:
+            charset->side = XlcGR;
+            charset->set_size = 96;
+            break;
+        case XctExtSeg:
+        case XctOtherCoding:
+            charset->side = XlcGLGR;
+            charset->set_size = 0;
+            break;
+    }
+    return True;
+}
+
+
+/* =============== Management of the List of Character Sets =============== */
+
+/*
+ * Representation of a character set that can be used for Compound Text,
+ * at run time.
+ * Note: This information is not contained in the XlcCharSet, because
+ * multiple ESC sequences may be used for the same XlcCharSet.
+ */
+typedef struct _CTInfoRec {
+    XlcCharSet charset;
+    const char *ct_sequence;   /* Compound Text ESC sequence */
+    unsigned int type;
+    unsigned char final_byte;
+                               /* If type == XctExtSeg: */
+    const char *ext_segment;   /* extended segment name, then '\002' */
+    int ext_segment_len;       /* length of above, including final '\002' */
+
+    struct _CTInfoRec *next;
+} CTInfoRec, *CTInfo;
+
+/*
+ * List of character sets that can be used for Compound Text,
+ * Includes all that are listed in default_ct_data, but more can be added
+ * at runtime through _XlcAddCT.
+ */
+static CTInfo ct_list = NULL;
+static CTInfo ct_list_end = NULL;
+
+/*
+ * Returns a Compound Text info record for an ESC sequence.
+ * The first part of the ESC sequence has already been parsed into 'type'
+ * and 'final_byte'. The remainder starts at 'text', at least 'text_len'
+ * bytes (only used if type == XctExtSeg).
+ */
+static CTInfo
+_XlcGetCTInfo(
+    unsigned int type,
+    unsigned char final_byte,
+    const char *text,
+    int text_len)
+{
+    CTInfo ct_info;
+
+    for (ct_info = ct_list; ct_info; ct_info = ct_info->next)
+        if (ct_info->type == type
+            && ct_info->final_byte == final_byte
+            && (type != XctExtSeg
+                || (text_len >= ct_info->ext_segment_len
+                    && memcmp(text, ct_info->ext_segment,
+                              ct_info->ext_segment_len) == 0)))
+            return ct_info;
+
+    return (CTInfo) NULL;
+}
+
+/* Returns the Compound Text info for a given XlcCharSet.
+   Returns NULL if none is found. */
+static CTInfo
+_XlcGetCTInfoFromCharSet(
+    XlcCharSet charset)
+{
+    CTInfo ct_info;
+
+    for (ct_info = ct_list; ct_info; ct_info = ct_info->next)
+       if (ct_info->charset == charset)
+           return ct_info;
+
+    return (CTInfo) NULL;
+}
+
+/* Creates a new XlcCharSet, given its name (including side suffix) and
+   Compound Text ESC sequence (normally at most 4 bytes), and makes it
+   eligible for Compound Text processing. */
+XlcCharSet
+_XlcAddCT(
+    const char *name,
+    const char *ct_sequence)
+{
+    CTInfo ct_info, existing_info;
+    XlcCharSet charset;
+    const char *ct_ptr;
+    int length;
+    unsigned int type;
+    unsigned char final_byte;
+
+    charset = _XlcGetCharSet(name);
+    if (charset != NULL) {
+        /* Even if the charset already exists, it is OK to register a second
+           Compound Text sequence for it. */
+    } else {
+        /* Attempt to create the charset. */
+        charset = _XlcCreateDefaultCharSet(name, ct_sequence);
+        if (charset == NULL)
+           return (XlcCharSet) NULL;
+        _XlcAddCharSet(charset);
+    }
+
+    /* Allocate a CTinfo record. */
+    length = strlen(ct_sequence);
+    ct_info = (CTInfo) Xmalloc(sizeof(CTInfoRec) + length+1);
+    if (ct_info == NULL)
+       return charset;
+
+    ct_info->charset = charset;
+    ct_info->ct_sequence = strcpy((char *) (ct_info + 1), ct_sequence);
+
+    /* Parse the Compound Text sequence. */
+    ct_ptr = ct_sequence;
+    type = _XlcParseCT(&ct_ptr, &length, &final_byte);
+
+    ct_info->type = type;
+    ct_info->final_byte = final_byte;
+
+    switch (type) {
+       case XctGL94:
+       case XctGR94:
+       case XctGR96:
+       case XctGL94MB:
+       case XctGR94MB:
+       case XctOtherCoding:
+            ct_info->ext_segment = NULL;
+            ct_info->ext_segment_len = 0;
+            break;
+       case XctExtSeg: {
+            /* By convention, the extended segment name is the encoding_name
+               in lowercase. */
+            const char *q = charset->encoding_name;
+            int n = strlen(q);
+            char *p;
+
+            /* Ensure ct_info->ext_segment_len <= 0x3fff - 6. */
+            if (n > 0x3fff - 6 - 1) {
+                Xfree(ct_info);
+                return charset;
+            }
+            p = (char *) Xmalloc(n+1);
+            if (p == NULL) {
+                Xfree(ct_info);
+                return charset;
+            }
+            ct_info->ext_segment = p;
+            ct_info->ext_segment_len = n+1;
+            for ( ; n > 0; p++, q++, n--)
+                *p = (*q >= 'A' && *q <= 'Z' ? *q - 'A' + 'a' : *q);
+            *p = XctSTX;
+            break;
+        }
+       default:
+            Xfree(ct_info);
+            return (XlcCharSet) NULL;
+    }
+
+    /* Insert it into the list, if not already present. */
+    existing_info =
+        _XlcGetCTInfo(type, ct_info->final_byte,
+                      ct_info->ext_segment, ct_info->ext_segment_len);
+    if (existing_info == NULL) {
+        /* Insert it at the end. If there are duplicates CTinfo entries
+           for the same XlcCharSet, we want the first (standard) one to
+           override the second (user defined) one. */
+       ct_info->next = NULL;
+       if (ct_list_end)
+           ct_list_end->next = ct_info;
+       else
+           ct_list = ct_info;
+       ct_list_end = ct_info;
+    } else {
+        if (existing_info->charset != charset
+            /* We have a conflict, with one exception: JISX0208.1983-0 and
+               JISX0208.1990-0 are the same for all practical purposes. */
+            && !(strncmp(existing_info->charset->name, "JISX0208", 8) == 0
+                 && strncmp(charset->name, "JISX0208", 8) == 0)) {
+            fprintf(stderr,
+                    "Xlib: charsets %s and %s have the same CT sequence\n",
+                    charset->name, existing_info->charset->name);
+            if (strcmp(charset->ct_sequence, ct_sequence) == 0)
+                charset->ct_sequence = "";
+        }
+        Xfree(ct_info);
+    }
+
+    return charset;
+}
+
+
+/* ========== Converters String <--> CharSet <--> Compound Text ========== */
+
+/*
+ * Structure representing the parse state of a Compound Text string.
+ */
+typedef struct _StateRec {
+    XlcCharSet charset;                /* The charset of the current segment */
+    XlcCharSet GL_charset;     /* The charset responsible for 0x00..0x7F */
+    XlcCharSet GR_charset;     /* The charset responsible for 0x80..0xFF */
+    XlcCharSet Other_charset;  /* != NULL if currently in an other segment */
+    int ext_seg_left;          /* > 0 if currently in an extended segment */
+} StateRec, *State;
+
+
+/* Subroutine for parsing an ESC sequence. */
+
+typedef enum {
+    resOK,             /* Charset saved in 'state', sequence skipped */
+    resNotInList,      /* Charset not found, sequence skipped */
+    resNotCTSeq                /* EscSeq not recognized, pointers not changed */
+} CheckResult;
+
+static CheckResult
+_XlcCheckCTSequence(
+    State state,
+    const char **ctext,
+    int *ctext_len)
+{
+    XlcCharSet charset;
+    CTInfo ct_info;
+    const char *tmp_ctext = *ctext;
+    int tmp_ctext_len = *ctext_len;
+    unsigned int type;
+    unsigned char final_byte;
+    int ext_seg_left = 0;
+
+    /* Check for validity. */
+    type = _XlcParseCT(&tmp_ctext, &tmp_ctext_len, &final_byte);
+
+    switch (type) {
+       case XctGL94:
+       case XctGR94:
+       case XctGR96:
+       case XctGL94MB:
+       case XctGR94MB:
+       case XctOtherCoding:
+            *ctext = tmp_ctext;
+            *ctext_len = tmp_ctext_len;
+            break;
+        case XctReturn:
+            *ctext = tmp_ctext;
+            *ctext_len = tmp_ctext_len;
+            state->Other_charset = NULL;
+            return resOK;
+        case XctExtSeg:
+            if (tmp_ctext_len > 2
+                && (tmp_ctext[0] & 0x80) && (tmp_ctext[0] & 0x80)) {
+                unsigned int msb = tmp_ctext[0] & 0x7f;
+                unsigned int lsb = tmp_ctext[1] & 0x7f;
+                ext_seg_left = (msb << 7) + lsb;
+                if (ext_seg_left <= tmp_ctext_len - 2) {
+                    *ctext = tmp_ctext + 2;
+                    *ctext_len = tmp_ctext_len - 2;
+                    break;
+                }
+            }
+            return resNotCTSeq;
+        default:
+            return resNotCTSeq;
+    }
+
+    ct_info = _XlcGetCTInfo(type, final_byte, *ctext, ext_seg_left);
+
+    if (ct_info) {
+        charset = ct_info->charset;
+        state->ext_seg_left = ext_seg_left;
+        if (type == XctExtSeg) {
+            state->charset = charset;
+            /* Skip past the extended segment name and the separator. */
+            *ctext += ct_info->ext_segment_len;
+            *ctext_len -= ct_info->ext_segment_len;
+            state->ext_seg_left -= ct_info->ext_segment_len;
+        } else if (type == XctOtherCoding) {
+            state->Other_charset = charset;
+        } else {
+            if (charset->side == XlcGL) {
+                state->GL_charset = charset;
+            } else if (charset->side == XlcGR) {
+                state->GR_charset = charset;
+            } else {
+                state->GL_charset = charset;
+                state->GR_charset = charset;
+            }
+        }
+        return resOK;
+    } else {
+        state->ext_seg_left = 0;
+        if (type == XctExtSeg) {
+            /* Skip the entire extended segment. */
+            *ctext += ext_seg_left;
+            *ctext_len -= ext_seg_left;
+        }
+        return resNotInList;
+    }
+}
+
+static void
+init_state(
+    XlcConv conv)
+{
+    State state = (State) conv->state;
+    static XlcCharSet default_GL_charset = NULL;
+    static XlcCharSet default_GR_charset = NULL;
+
+    if (default_GL_charset == NULL) {
+       default_GL_charset = _XlcGetCharSet("ISO8859-1:GL");
+       default_GR_charset = _XlcGetCharSet("ISO8859-1:GR");
+    }
+
+    /* The initial state is ISO-8859-1 on both sides. */
+    state->GL_charset = state->charset = default_GL_charset;
+    state->GR_charset = default_GR_charset;
+
+    state->Other_charset = NULL;
+
+    state->ext_seg_left = 0;
+}
+
+/* from XlcNCompoundText to XlcNCharSet */
+
+static int
+cttocs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    State state = (State) conv->state;
+    XlcCharSet charset = NULL;
+    const char *ctptr;
+    char *bufptr;
+    int ctext_len, buf_len;
+    int unconv_num = 0;
+
+    ctptr = (const char *) *from;
+    bufptr = (char *) *to;
+    ctext_len = *from_left;
+    buf_len = *to_left;
+
+    while (ctext_len > 0 && buf_len > 0) {
+        if (state->ext_seg_left == 0) {
+            /* Not in the middle of an extended segment; look at next byte. */
+            unsigned char ch = *ctptr;
+            XlcCharSet ch_charset;
+
+            if (ch == XctESC) {
+                CheckResult ret =
+                    _XlcCheckCTSequence(state, &ctptr, &ctext_len);
+                if (ret == resOK)
+                    /* state has been modified. */
+                    continue;
+                if (ret == resNotInList) {
+                    /* XXX Just continue with previous charset. */
+                    unconv_num++;
+                    continue;
+                }
+            } else if (ch == XctCSI) {
+                /* XXX Simply ignore the XctLeftToRight, XctRightToLeft,
+                   XctDirectionEnd sequences for the moment. */
+                unsigned char dummy;
+                if (_XlcParseCT(&ctptr, &ctext_len, &dummy)) {
+                    unconv_num++;
+                    continue;
+                }
+            }
+
+            /* Find the charset which is responsible for this byte. */
+            ch_charset = (state->Other_charset != NULL ? state->Other_charset :
+                          (ch & 0x80 ? state->GR_charset : state->GL_charset));
+
+            /* Set the charset of this run, or continue the current run,
+               or stop the current run. */
+            if (charset) {
+                if (charset != ch_charset)
+                    break;
+            } else {
+                state->charset = charset = ch_charset;
+            }
+
+            /* We don't want to split a character into multiple pieces. */
+            if (buf_len < 6) {
+                if (charset->char_size > 0) {
+                    if (buf_len < charset->char_size)
+                        break;
+                } else {
+                    /* char_size == 0 is tricky. The code here is good only
+                       for valid UTF-8 input. */
+                    if (charset->ct_sequence[0] == XctESC
+                        && charset->ct_sequence[1] == XctOtherCoding
+                        && charset->ct_sequence[2] == 'G') {
+                        int char_size = (ch < 0xc0 ? 1 :
+                                         ch < 0xe0 ? 2 :
+                                         ch < 0xf0 ? 3 :
+                                         ch < 0xf8 ? 4 :
+                                         ch < 0xfc ? 5 :
+                                                     6);
+                        if (buf_len < char_size)
+                            break;
+                    }
+                }
+            }
+
+            *bufptr++ = *ctptr++;
+            ctext_len--;
+            buf_len--;
+        } else {
+            /* Copy as much as possible from the current extended segment
+               to the buffer. */
+            int char_size;
+
+            /* Set the charset of this run, or continue the current run,
+               or stop the current run. */
+            if (charset) {
+                if (charset != state->charset)
+                    break;
+            } else {
+                charset = state->charset;
+            }
+
+            char_size = charset->char_size;
+
+            if (state->ext_seg_left <= buf_len || char_size > 0) {
+                int n = (state->ext_seg_left <= buf_len
+                         ? state->ext_seg_left
+                         : (buf_len / char_size) * char_size);
+                memcpy(bufptr, ctptr, n);
+                ctptr += n; ctext_len -= n;
+                bufptr += n; buf_len -= n;
+                state->ext_seg_left -= n;
+            } else {
+#if UTF8_IN_EXTSEQ
+                /* char_size == 0 is tricky. The code here is good only
+                   for valid UTF-8 input. */
+                if (strcmp(charset->name, "ISO10646-1") == 0) {
+                    unsigned char ch = *ctptr;
+                    int char_size = (ch < 0xc0 ? 1 :
+                                     ch < 0xe0 ? 2 :
+                                     ch < 0xf0 ? 3 :
+                                     ch < 0xf8 ? 4 :
+                                     ch < 0xfc ? 5 :
+                                                 6);
+                    int i;
+                    if (buf_len < char_size)
+                        break;
+                    /* A small loop is faster than calling memcpy. */
+                    for (i = char_size; i > 0; i--)
+                        *bufptr++ = *ctptr++;
+                    ctext_len -= char_size;
+                    buf_len -= char_size;
+                    state->ext_seg_left -= char_size;
+                } else
+#endif
+                {
+                    /* Here ctext_len >= state->ext_seg_left > buf_len.
+                       We may be splitting a character into multiple pieces.
+                       Oh well. */
+                    int n = buf_len;
+                    memcpy(bufptr, ctptr, n);
+                    ctptr += n; ctext_len -= n;
+                    bufptr += n; buf_len -= n;
+                    state->ext_seg_left -= n;
+                }
+            }
+        }
+    }
+
+    /* 'charset' is the charset for the current run. In some cases,
+       'state->charset' contains the charset for the next run. Therefore,
+       return 'charset'.
+       'charset' may still be NULL only if no output was produced. */
+    if (num_args > 0)
+       *((XlcCharSet *) args[0]) = charset;
+
+    *from_left -= ctptr - *((const char **) from);
+    *from = (XPointer) ctptr;
+
+    *to_left -= bufptr - *((char **) to);
+    *to = (XPointer) bufptr;
+
+    return unconv_num;
+}
+
+/* from XlcNCharSet to XlcNCompoundText */
+
+static int
+cstoct(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    State state = (State) conv->state;
+    XlcSide side;
+    unsigned char min_ch = 0, max_ch = 0;
+    int length, unconv_num;
+    CTInfo ct_info;
+    XlcCharSet charset;
+    const char *csptr;
+    char *ctptr;
+    int csstr_len, ct_len;
+    char *ext_segment_start;
+    int char_size;
+
+    /* One argument is required, of type XlcCharSet. */
+    if (num_args < 1)
+       return -1;
+
+    csptr = *((const char **) from);
+    ctptr = *((char **) to);
+    csstr_len = *from_left;
+    ct_len = *to_left;
+
+    charset = (XlcCharSet) args[0];
+
+    ct_info = _XlcGetCTInfoFromCharSet(charset);
+    if (ct_info == NULL)
+       return -1;
+
+    side = charset->side;
+    length = strlen(ct_info->ct_sequence);
+
+    ext_segment_start = NULL;
+
+    if (ct_info->type == XctOtherCoding) {
+        /* Output the Escape sequence for switching to the charset, and
+           reserve room now for the XctReturn sequence at the end. */
+        if (ct_len < length + 3)
+            return -1;
+
+        memcpy(ctptr, ct_info->ct_sequence, length);
+        ctptr += length;
+        ct_len -= length + 3;
+    } else
+    /* Test whether the charset is already active. */
+    if (((side == XlcGR || side == XlcGLGR)
+        && charset != state->GR_charset)
+       || ((side == XlcGL || side == XlcGLGR)
+           && charset != state->GL_charset)) {
+
+        /* Output the Escape sequence for switching to the charset. */
+        if (ct_info->type == XctExtSeg) {
+            if (ct_len < length + 2 + ct_info->ext_segment_len)
+                return -1;
+
+            memcpy(ctptr, ct_info->ct_sequence, length);
+            ctptr += length;
+            ct_len -= length;
+
+            ctptr += 2;
+            ct_len -= 2;
+            ext_segment_start = ctptr;
+
+            /* The size of an extended segment must fit in 14 bits. */
+            if (ct_len > 0x3fff)
+                ct_len = 0x3fff;
+
+            memcpy(ctptr, ct_info->ext_segment, ct_info->ext_segment_len);
+            ctptr += ct_info->ext_segment_len;
+            ct_len -= ct_info->ext_segment_len;
+        } else {
+            if (ct_len < length)
+                return -1;
+
+            memcpy(ctptr, ct_info->ct_sequence, length);
+            ctptr += length;
+            ct_len -= length;
+        }
+    }
+
+    /* If the charset has side GL or GR, prepare remapping the characters
+       to the correct side. */
+    if (charset->set_size) {
+        min_ch = 0x20;
+        max_ch = 0x7f;
+        if (charset->set_size == 94) {
+            max_ch--;
+           if (charset->char_size > 1 || side == XlcGR)
+               min_ch++;
+        }
+    }
+
+    /* Actually copy the contents. */
+    unconv_num = 0;
+    char_size = charset->char_size;
+    if (char_size == 1) {
+       while (csstr_len > 0 && ct_len > 0) {
+           if (charset->set_size) {
+               /* The CompoundText specification says that the only
+                  control characters allowed are 0x09, 0x0a, 0x1b, 0x9b.
+                  Therefore here we eliminate other control characters. */
+               unsigned char ch = *((unsigned char *) csptr) & 0x7f;
+               if (!((ch >= min_ch && ch <= max_ch)
+                     || (side == XlcGL
+                         && (ch == 0x00 || ch == 0x09 || ch == 0x0a))
+                     || ((side == XlcGL || side == XlcGR)
+                         && (ch == 0x1b)))) {
+                    csptr++;
+                    csstr_len--;
+                   unconv_num++;
+                    continue;
+               }
+           }
+
+           if (side == XlcGL)
+               *ctptr++ = *csptr++ & 0x7f;
+           else if (side == XlcGR)
+               *ctptr++ = *csptr++ | 0x80;
+           else
+               *ctptr++ = *csptr++;
+           csstr_len--;
+           ct_len--;
+       }
+    } else if (char_size > 1) {
+       while (csstr_len >= char_size && ct_len >= char_size) {
+           if (side == XlcGL) {
+               int i;
+               for (i = char_size; i > 0; i--)
+                   *ctptr++ = *csptr++ & 0x7f;
+           } else if (side == XlcGR) {
+               int i;
+               for (i = char_size; i > 0; i--)
+                   *ctptr++ = *csptr++ | 0x80;
+           } else {
+               int i;
+               for (i = char_size; i > 0; i--)
+                   *ctptr++ = *csptr++;
+           }
+           csstr_len -= char_size;
+           ct_len -= char_size;
+       }
+    } else {
+        /* char_size = 0. The code here is good only for valid UTF-8 input. */
+        if ((charset->ct_sequence[0] == XctESC
+             && charset->ct_sequence[1] == XctOtherCoding
+             && charset->ct_sequence[2] == 'G')
+#if UTF8_IN_EXTSEQ
+            || strcmp(charset->name, "ISO10646-1") == 0
+#endif
+           ) {
+            while (csstr_len > 0 && ct_len > 0) {
+                unsigned char ch = * (unsigned char *) csptr;
+                int char_size = (ch < 0xc0 ? 1 :
+                                 ch < 0xe0 ? 2 :
+                                 ch < 0xf0 ? 3 :
+                                 ch < 0xf8 ? 4 :
+                                 ch < 0xfc ? 5 :
+                                             6);
+                int i;
+                if (!(csstr_len >= char_size && ct_len >= char_size))
+                    break;
+                for (i = char_size; i > 0; i--)
+                    *ctptr++ = *csptr++;
+                csstr_len -= char_size;
+                ct_len -= char_size;
+            }
+        } else {
+            while (csstr_len > 0 && ct_len > 0) {
+                *ctptr++ = *csptr++;
+                csstr_len--;
+                ct_len--;
+            }
+        }
+    }
+
+    if (ct_info->type == XctOtherCoding) {
+        /* Terminate with an XctReturn sequence. */
+        ctptr[0] = XctESC;
+        ctptr[1] = XctOtherCoding;
+        ctptr[2] = '@';
+        ctptr += 3;
+    } else if (ext_segment_start != NULL) {
+        /* Backpatch the extended segment's length. */
+        int ext_segment_length = ctptr - ext_segment_start;
+        *(ext_segment_start - 2) = (ext_segment_length >> 7) | 0x80;
+        *(ext_segment_start - 1) = (ext_segment_length & 0x7f) | 0x80;
+    } else {
+        if (side == XlcGR || side == XlcGLGR)
+            state->GR_charset = charset;
+        if (side == XlcGL || side == XlcGLGR)
+            state->GL_charset = charset;
+    }
+
+    *from_left -= csptr - *((const char **) from);
+    *from = (XPointer) csptr;
+
+    *to_left -= ctptr - *((char **) to);
+    *to = (XPointer) ctptr;
+
+    return 0;
+}
+
+/* from XlcNString to XlcNCharSet */
+
+static int
+strtocs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    State state = (State) conv->state;
+    const char *src;
+    char *dst;
+    unsigned char side;
+    int length;
+
+    src = (const char *) *from;
+    dst = (char *) *to;
+
+    length = min(*from_left, *to_left);
+    side = *((unsigned char *) src) & 0x80;
+
+    while (side == (*((unsigned char *) src) & 0x80) && length-- > 0)
+       *dst++ = *src++;
+
+    *from_left -= src - (const char *) *from;
+    *from = (XPointer) src;
+    *to_left -= dst - (char *) *to;
+    *to = (XPointer) dst;
+
+    if (num_args > 0)
+       *((XlcCharSet *)args[0]) = (side ? state->GR_charset : state->GL_charset);
+
+    return 0;
+}
+
+/* from XlcNCharSet to XlcNString */
+
+static int
+cstostr(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    State state = (State) conv->state;
+    const char *csptr;
+    char *string_ptr;
+    int csstr_len, str_len;
+    unsigned char ch;
+    int unconv_num = 0;
+
+    /* This converter can only convert from ISO8859-1:GL and ISO8859-1:GR. */
+    if (num_args < 1
+       || !((XlcCharSet) args[0] == state->GL_charset
+            || (XlcCharSet) args[0] == state->GR_charset))
+       return -1;
+
+    csptr = *((const char **) from);
+    string_ptr = *((char **) to);
+    csstr_len = *from_left;
+    str_len = *to_left;
+
+    while (csstr_len > 0 && str_len > 0) {
+       ch = *((unsigned char *) csptr++);
+       csstr_len--;
+       /* Citing ICCCM: "STRING as a type specifies the ISO Latin-1 character
+          set plus the control characters TAB and NEWLINE." */
+       if ((ch < 0x20 && ch != 0x00 && ch != 0x09 && ch != 0x0a)
+           || (ch >= 0x7f && ch < 0xa0)) {
+           unconv_num++;
+           continue;
+       }
+       *((unsigned char *) string_ptr++) = ch;
+       str_len--;
+    }
+
+    *from_left -= csptr - *((const char **) from);
+    *from = (XPointer) csptr;
+
+    *to_left -= string_ptr - *((char **) to);
+    *to = (XPointer) string_ptr;
+
+    return unconv_num;
+}
+
+
+static XlcConv
+create_conv(
+    XlcConvMethods methods)
+{
+    XlcConv conv;
+
+    conv = (XlcConv) Xmalloc(sizeof(XlcConvRec) + sizeof(StateRec));
+    if (conv == NULL)
+       return (XlcConv) NULL;
+
+    conv->state = (XPointer) &conv[1];
+
+    conv->methods = methods;
+
+    init_state(conv);
+
+    return conv;
+}
+
+static void
+close_converter(
+    XlcConv conv)
+{
+    /* conv->state is allocated together with conv, free both at once.  */
+    Xfree((char *) conv);
+}
+
+
+static XlcConvMethodsRec cttocs_methods = {
+    close_converter,
+    cttocs,
+    init_state
+};
+
+static XlcConv
+open_cttocs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(&cttocs_methods);
+}
+
+
+static XlcConvMethodsRec cstoct_methods = {
+    close_converter,
+    cstoct,
+    init_state
+};
+
+static XlcConv
+open_cstoct(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(&cstoct_methods);
+}
+
+
+static XlcConvMethodsRec strtocs_methods = {
+    close_converter,
+    strtocs,
+    init_state
+};
+
+static XlcConv
+open_strtocs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(&strtocs_methods);
+}
+
+
+static XlcConvMethodsRec cstostr_methods = {
+    close_converter,
+    cstostr,
+    init_state
+};
+
+static XlcConv
+open_cstostr(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(&cstostr_methods);
+}
+
+
+/* =========================== Initialization =========================== */
+
+Bool
+_XlcInitCTInfo(void)
+{
+    if (ct_list == NULL) {
+        const CTDataRec *ct_data;
+        int num;
+        XlcCharSet charset;
+
+        /* Initialize ct_list.  */
+
+       num = sizeof(default_ct_data) / sizeof(CTDataRec);
+       for (ct_data = default_ct_data; num > 0; ct_data++, num--) {
+           charset = _XlcAddCT(ct_data->name, ct_data->ct_sequence);
+            if (charset == NULL)
+                continue;
+                       if (strncmp(charset->ct_sequence, "\x1b\x25\x2f", 3) != 0)
+                               charset->source = CSsrcStd;
+                       else
+                               charset->source = CSsrcXLC;
+       }
+
+        /* Register CompoundText and CharSet converters.  */
+
+        _XlcSetConverter((XLCd) NULL, XlcNCompoundText,
+                         (XLCd) NULL, XlcNCharSet,
+                         open_cttocs);
+        _XlcSetConverter((XLCd) NULL, XlcNString,
+                         (XLCd) NULL, XlcNCharSet,
+                         open_strtocs);
+
+        _XlcSetConverter((XLCd) NULL, XlcNCharSet,
+                         (XLCd) NULL, XlcNCompoundText,
+                         open_cstoct);
+        _XlcSetConverter((XLCd) NULL, XlcNCharSet,
+                         (XLCd) NULL, XlcNString,
+                         open_cstostr);
+    }
+
+    return True;
+}
diff --git a/src/xlibi18n/lcCharSet.c b/src/xlibi18n/lcCharSet.c
new file mode 100644 (file)
index 0000000..5d28781
--- /dev/null
@@ -0,0 +1,225 @@
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * 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 TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA 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.
+ *
+ * Author: Katsuhisa Yano      TOSHIBA Corp.
+ *                             mopi@osa.ilab.toshiba.co.jp
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include "Xlibint.h"
+#include "XlcPublic.h"
+#include "XlcPubI.h"
+
+/* The list of all known XlcCharSets. They are identified by their name. */
+
+typedef struct _XlcCharSetListRec {
+    XlcCharSet charset;
+    struct _XlcCharSetListRec *next;
+} XlcCharSetListRec, *XlcCharSetList;
+
+static XlcCharSetList charset_list = NULL;
+
+/* Returns the charset with the given name (including side suffix).
+   Returns NULL if not found. */
+XlcCharSet
+_XlcGetCharSet(
+    const char *name)
+{
+    XlcCharSetList list;
+    XrmQuark xrm_name;
+
+    xrm_name = XrmStringToQuark(name);
+
+    for (list = charset_list; list; list = list->next) {
+       if (xrm_name == list->charset->xrm_name)
+           return (XlcCharSet) list->charset;
+    }
+
+    return (XlcCharSet) NULL;
+}
+
+/* Returns the charset with the given encoding (no side suffix) and
+   responsible for at least the given side (XlcGL or XlcGR).
+   Returns NULL if not found. */
+XlcCharSet
+_XlcGetCharSetWithSide(
+    const char *encoding_name,
+    XlcSide side)
+{
+    XlcCharSetList list;
+    XrmQuark xrm_encoding_name;
+
+    xrm_encoding_name = XrmStringToQuark(encoding_name);
+
+    for (list = charset_list; list; list = list->next) {
+       if (list->charset->xrm_encoding_name == xrm_encoding_name
+           && (list->charset->side == XlcGLGR || list->charset->side == side))
+           return (XlcCharSet) list->charset;
+    }
+
+    return (XlcCharSet) NULL;
+}
+
+/* Registers an XlcCharSet in the list of character sets.
+   Returns True if successful. */
+Bool
+_XlcAddCharSet(
+    XlcCharSet charset)
+{
+    XlcCharSetList list;
+
+    if (_XlcGetCharSet(charset->name))
+       return False;
+
+    list = (XlcCharSetList) Xmalloc(sizeof(XlcCharSetListRec));
+    if (list == NULL)
+       return False;
+
+    list->charset = charset;
+    list->next = charset_list;
+    charset_list = list;
+
+    return True;
+}
+
+/* List of resources for XlcCharSet. */
+static XlcResource resources[] = {
+    { XlcNName, NULLQUARK, sizeof(char *),
+      XOffsetOf(XlcCharSetRec, name), XlcGetMask },
+    { XlcNEncodingName, NULLQUARK, sizeof(char *),
+      XOffsetOf(XlcCharSetRec, encoding_name), XlcGetMask },
+    { XlcNSide, NULLQUARK, sizeof(XlcSide),
+      XOffsetOf(XlcCharSetRec, side), XlcGetMask },
+    { XlcNCharSize, NULLQUARK, sizeof(int),
+      XOffsetOf(XlcCharSetRec, char_size), XlcGetMask },
+    { XlcNSetSize, NULLQUARK, sizeof(int),
+      XOffsetOf(XlcCharSetRec, set_size), XlcGetMask },
+    { XlcNControlSequence, NULLQUARK, sizeof(char *),
+      XOffsetOf(XlcCharSetRec, ct_sequence), XlcGetMask }
+};
+
+/* Retrieves a number of attributes of an XlcCharSet.
+   Return NULL if successful, otherwise the name of the first argument
+   specifiying a nonexistent attribute. */
+static char *
+get_values(
+    XlcCharSet charset,
+    XlcArgList args,
+    int num_args)
+{
+    if (resources[0].xrm_name == NULLQUARK)
+       _XlcCompileResourceList(resources, XlcNumber(resources));
+
+    return _XlcGetValues((XPointer) charset, resources, XlcNumber(resources),
+                        args, num_args, XlcGetMask);
+}
+
+/* Retrieves a number of attributes of an XlcCharSet.
+   Return NULL if successful, otherwise the name of the first argument
+   specifiying a nonexistent attribute. */
+char *
+_XlcGetCSValues(XlcCharSet charset, ...)
+{
+    va_list var;
+    XlcArgList args;
+    char *ret;
+    int num_args;
+
+    va_start(var, charset);
+    _XlcCountVaList(var, &num_args);
+    va_end(var);
+
+    va_start(var, charset);
+    _XlcVaToArgList(var, num_args, &args);
+    va_end(var);
+
+    if (args == (XlcArgList) NULL)
+       return (char *) NULL;
+
+    ret = get_values(charset, args, num_args);
+
+    Xfree(args);
+
+    return ret;
+}
+
+/* Creates a new XlcCharSet, given its name (including side suffix) and
+   Compound Text ESC sequence (normally at most 4 bytes). */
+XlcCharSet
+_XlcCreateDefaultCharSet(
+    const char *name,
+    const char *ct_sequence)
+{
+    XlcCharSet charset;
+    int name_len, ct_sequence_len;
+    const char *colon;
+    char *tmp;
+
+    charset = Xcalloc(1, sizeof(XlcCharSetRec));
+    if (charset == NULL)
+       return (XlcCharSet) NULL;
+
+    name_len = strlen(name);
+    ct_sequence_len = strlen(ct_sequence);
+
+    /* Fill in name and xrm_name.  */
+    tmp = (char *) Xmalloc(name_len + 1 + ct_sequence_len + 1);
+    if (tmp == NULL) {
+       Xfree((char *) charset);
+       return (XlcCharSet) NULL;
+    }
+    memcpy(tmp, name, name_len+1);
+    charset->name = tmp;
+    charset->xrm_name = XrmStringToQuark(charset->name);
+
+    /* Fill in encoding_name and xrm_encoding_name.  */
+    if ((colon = strchr(charset->name, ':')) != NULL) {
+        unsigned int length = colon - charset->name;
+        char *encoding_tmp = (char *) Xmalloc(length + 1);
+        if (encoding_tmp == NULL) {
+            Xfree((char *) charset->name);
+            Xfree((char *) charset);
+            return (XlcCharSet) NULL;
+        }
+        memcpy(encoding_tmp, charset->name, length);
+        encoding_tmp[length] = '\0';
+        charset->encoding_name = encoding_tmp;
+        charset->xrm_encoding_name = XrmStringToQuark(charset->encoding_name);
+    } else {
+        charset->encoding_name = charset->name;
+        charset->xrm_encoding_name = charset->xrm_name;
+    }
+
+    /* Fill in ct_sequence.  */
+    tmp += name_len + 1;
+    memcpy(tmp, ct_sequence, ct_sequence_len+1);
+    charset->ct_sequence = tmp;
+
+    /* Fill in side, char_size, set_size. */
+    if (!_XlcParseCharSet(charset))
+        /* If ct_sequence is not usable in Compound Text, remove it. */
+        charset->ct_sequence = "";
+
+    return (XlcCharSet) charset;
+}
diff --git a/src/xlibi18n/lcConv.c b/src/xlibi18n/lcConv.c
new file mode 100644 (file)
index 0000000..9797e7e
--- /dev/null
@@ -0,0 +1,339 @@
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * 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 TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA 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.
+ *
+ * Author: Katsuhisa Yano      TOSHIBA Corp.
+ *                             mopi@osa.ilab.toshiba.co.jp
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XlcPubI.h"
+#include <stdio.h>
+
+typedef struct _XlcConverterListRec {
+    XLCd from_lcd;
+    const char *from;
+    XrmQuark from_type;
+    XLCd to_lcd;
+    const char *to;
+    XrmQuark to_type;
+    XlcOpenConverterProc converter;
+    struct _XlcConverterListRec *next;
+} XlcConverterListRec, *XlcConverterList;
+
+static XlcConverterList conv_list = NULL;
+
+static void
+close_converter(
+    XlcConv conv)
+{
+    (*conv->methods->close)(conv);
+}
+
+static XlcConv
+get_converter(
+    XLCd from_lcd,
+    XrmQuark from_type,
+    XLCd to_lcd,
+    XrmQuark to_type)
+{
+    XlcConverterList list, prev = NULL;
+
+    for (list = conv_list; list; list = list->next) {
+       if (list->from_lcd == from_lcd && list->to_lcd == to_lcd
+           && list->from_type == from_type && list->to_type == to_type) {
+
+           if (prev && prev != conv_list) {    /* XXX */
+               prev->next = list->next;
+               list->next = conv_list;
+               conv_list = list;
+           }
+
+           return (*list->converter)(from_lcd, list->from, to_lcd, list->to);
+       }
+
+       prev = list;
+    }
+
+    return (XlcConv) NULL;
+}
+
+Bool
+_XlcSetConverter(
+    XLCd from_lcd,
+    const char *from,
+    XLCd to_lcd,
+    const char *to,
+    XlcOpenConverterProc converter)
+{
+    XlcConverterList list;
+    XrmQuark from_type, to_type;
+
+    from_type = XrmStringToQuark(from);
+    to_type = XrmStringToQuark(to);
+
+    for (list = conv_list; list; list = list->next) {
+       if (list->from_lcd == from_lcd && list->to_lcd == to_lcd
+           && list->from_type == from_type && list->to_type == to_type) {
+
+           list->converter = converter;
+           return True;
+       }
+    }
+
+    list = (XlcConverterList) Xmalloc(sizeof(XlcConverterListRec));
+    if (list == NULL)
+       return False;
+
+    list->from_lcd = from_lcd;
+    list->from = from;
+    list->from_type = from_type;
+    list->to_lcd = to_lcd;
+    list->to = to;
+    list->to_type = to_type;
+    list->converter = converter;
+    list->next = conv_list;
+    conv_list = list;
+
+    return True;
+}
+
+typedef struct _ConvRec {
+    XlcConv from_conv;
+    XlcConv to_conv;
+} ConvRec, *Conv;
+
+static int
+indirect_convert(
+    XlcConv lc_conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    Conv conv = (Conv) lc_conv->state;
+    XlcConv from_conv = conv->from_conv;
+    XlcConv to_conv = conv->to_conv;
+    XlcCharSet charset;
+    char buf[BUFSIZ], *cs;
+    XPointer tmp_args[1];
+    int cs_left, ret, length, unconv_num = 0;
+
+    if (from == NULL || *from == NULL) {
+       if (from_conv->methods->reset)
+           (*from_conv->methods->reset)(from_conv);
+
+       if (to_conv->methods->reset)
+           (*to_conv->methods->reset)(to_conv);
+
+       return 0;
+    }
+
+    while (*from_left > 0) {
+       cs = buf;
+       cs_left = BUFSIZ;
+       tmp_args[0] = (XPointer) &charset;
+
+       ret = (*from_conv->methods->convert)(from_conv, from, from_left, &cs,
+                                            &cs_left, tmp_args, 1);
+       if (ret < 0)
+           break;
+
+       unconv_num += ret;
+
+       length = cs - buf;
+       if (length > 0) {
+           cs_left = length;
+           cs = buf;
+
+           tmp_args[0] = (XPointer) charset;
+
+           ret = (*to_conv->methods->convert)(to_conv, &cs, &cs_left, to, to_left,
+                                              tmp_args, 1);
+           if (ret < 0) {
+               unconv_num += length / (charset->char_size > 0 ? charset->char_size : 1);
+               continue;
+           }
+
+           unconv_num += ret;
+
+           if (*to_left < 1)
+               break;
+       }
+    }
+
+    return unconv_num;
+}
+
+static void
+close_indirect_converter(
+    XlcConv lc_conv)
+{
+    Conv conv = (Conv) lc_conv->state;
+
+    if (conv) {
+       if (conv->from_conv)
+           close_converter(conv->from_conv);
+       if (conv->to_conv)
+           close_converter(conv->to_conv);
+
+       Xfree((char *) conv);
+    }
+
+    Xfree((char *) lc_conv);
+}
+
+static void
+reset_indirect_converter(
+    XlcConv lc_conv)
+{
+    Conv conv = (Conv) lc_conv->state;
+
+    if (conv) {
+       if (conv->from_conv && conv->from_conv->methods->reset)
+           (*conv->from_conv->methods->reset)(conv->from_conv);
+       if (conv->to_conv && conv->to_conv->methods->reset)
+           (*conv->to_conv->methods->reset)(conv->to_conv);
+    }
+}
+
+static XlcConvMethodsRec conv_methods = {
+    close_indirect_converter,
+    indirect_convert,
+    reset_indirect_converter
+} ;
+
+static XlcConv
+open_indirect_converter(
+    XLCd from_lcd,
+    const char *from,
+    XLCd to_lcd,
+    const char *to)
+{
+    XlcConv lc_conv, from_conv, to_conv;
+    Conv conv;
+    XrmQuark from_type, to_type;
+    static XrmQuark QChar, QCharSet, QCTCharSet = (XrmQuark) 0;
+
+    if (QCTCharSet == (XrmQuark) 0) {
+       QCTCharSet = XrmStringToQuark(XlcNCTCharSet);
+       QCharSet = XrmStringToQuark(XlcNCharSet);
+       QChar = XrmStringToQuark(XlcNChar);
+    }
+
+    from_type = XrmStringToQuark(from);
+    to_type = XrmStringToQuark(to);
+
+    if (from_type == QCharSet || from_type == QChar || to_type == QCharSet ||
+       to_type == QChar)
+       return (XlcConv) NULL;
+
+    lc_conv = (XlcConv) Xmalloc(sizeof(XlcConvRec));
+    if (lc_conv == NULL)
+       return (XlcConv) NULL;
+
+    lc_conv->methods = &conv_methods;
+
+    lc_conv->state = (XPointer) Xcalloc(1, sizeof(ConvRec));
+    if (lc_conv->state == NULL)
+       goto err;
+
+    conv = (Conv) lc_conv->state;
+
+    from_conv = get_converter(from_lcd, from_type, from_lcd, QCTCharSet);
+    if (from_conv == NULL)
+       from_conv = get_converter(from_lcd, from_type, from_lcd, QCharSet);
+    if (from_conv == NULL)
+       from_conv = get_converter((XLCd)NULL, from_type, (XLCd)NULL, QCharSet);
+    if (from_conv == NULL)
+       from_conv = get_converter(from_lcd, from_type, from_lcd, QChar);
+    if (from_conv == NULL)
+       goto err;
+    conv->from_conv = from_conv;
+
+    to_conv = get_converter(to_lcd, QCTCharSet, to_lcd, to_type);
+    if (to_conv == NULL)
+       to_conv = get_converter(to_lcd, QCharSet, to_lcd, to_type);
+    if (to_conv == NULL)
+       to_conv = get_converter((XLCd) NULL, QCharSet, (XLCd) NULL, to_type);
+    if (to_conv == NULL)
+       goto err;
+    conv->to_conv = to_conv;
+
+    return lc_conv;
+
+err:
+    close_indirect_converter(lc_conv);
+
+    return (XlcConv) NULL;
+}
+
+XlcConv
+_XlcOpenConverter(
+    XLCd from_lcd,
+    const char *from,
+    XLCd to_lcd,
+    const char *to)
+{
+    XlcConv conv;
+    XrmQuark from_type, to_type;
+
+    from_type = XrmStringToQuark(from);
+    to_type = XrmStringToQuark(to);
+
+    if ((conv = get_converter(from_lcd, from_type, to_lcd, to_type)))
+       return conv;
+
+    return open_indirect_converter(from_lcd, from, to_lcd, to);
+}
+
+void
+_XlcCloseConverter(
+    XlcConv conv)
+{
+    close_converter(conv);
+}
+
+int
+_XlcConvert(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    return (*conv->methods->convert)(conv, from, from_left, to, to_left, args,
+                                    num_args);
+}
+
+void
+_XlcResetConverter(
+    XlcConv conv)
+{
+    if (conv->methods->reset)
+       (*conv->methods->reset)(conv);
+}
diff --git a/src/xlibi18n/lcDB.c b/src/xlibi18n/lcDB.c
new file mode 100644 (file)
index 0000000..97b22ac
--- /dev/null
@@ -0,0 +1,1339 @@
+/*
+ *
+ * Copyright IBM Corporation 1993
+ *
+ * All Rights Reserved
+ *
+ * License 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 IBM not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ *
+ * IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS, AND
+ * NONINFRINGEMENT OF THIRD PARTY RIGHTS, IN NO EVENT SHALL
+ * IBM 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.
+ *
+*/
+/*
+ *  (c) Copyright 1995 FUJITSU LIMITED
+ *  This is source code modified by FUJITSU LIMITED under the Joint
+ *  Development Agreement for the CDE/Motif PST.
+ */
+
+
+
+#ifndef        NOT_X_ENV
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <X11/Xlib.h>
+#include <X11/Xresource.h>
+#include "Xlibint.h"
+#include "XlcPubI.h"
+
+#else  /* NOT_X_ENV */
+
+#define        Xmalloc malloc
+#define        Xrealloc        realloc
+#define        Xfree   free
+
+#endif /* NOT_X_ENV */
+
+/* specifying NOT_X_ENV allows users to just use
+   the database parsing routine. */
+/* For UDC/VW */
+#ifndef        BUFSIZE
+#define        BUFSIZE 2048
+#endif
+
+#ifdef COMMENT
+#ifdef  BUFSIZE
+#undef BUFSIZE
+#endif
+#define BUFSIZE 6144 /* 2048*3 */
+#endif
+
+#include <stdio.h>
+
+typedef struct _DatabaseRec {
+    char *category;
+    char *name;
+    char **value;
+    int value_num;
+    struct _DatabaseRec *next;
+} DatabaseRec, *Database;
+
+typedef enum {
+    S_NULL,    /* outside category */
+    S_CATEGORY,        /* inside category */
+    S_NAME,    /* has name, expecting values */
+    S_VALUE
+} ParseState;
+
+typedef enum {
+    T_NEWLINE,
+    T_COMMENT,
+    T_SEMICOLON,
+    T_DOUBLE_QUOTE,
+    T_LEFT_BRACE,
+    T_RIGHT_BRACE,
+    T_SPACE,
+    T_TAB,
+    T_BACKSLASH,
+    T_NUMERIC_HEX,
+    T_NUMERIC_DEC,
+    T_NUMERIC_OCT,
+    T_DEFAULT
+} Token;
+
+typedef struct {
+    Token token;       /* token id */
+    int len;           /* length of token sequence */
+} TokenTable;
+
+static int f_newline (const char *str, Token token, Database *db);
+static int f_comment (const char *str, Token token, Database *db);
+static int f_semicolon (const char *str, Token token, Database *db);
+static int f_double_quote (const char *str, Token token, Database *db);
+static int f_left_brace (const char *str, Token token, Database *db);
+static int f_right_brace (const char *str, Token token, Database *db);
+static int f_white (const char *str, Token token, Database *db);
+static int f_backslash (const char *str, Token token, Database *db);
+static int f_numeric (const char *str, Token token, Database *db);
+static int f_default (const char *str, Token token, Database *db);
+
+static const TokenTable token_tbl[] = {
+    { T_NEWLINE,      1 },
+    { T_COMMENT,      1 },
+    { T_SEMICOLON,    1 },
+    { T_DOUBLE_QUOTE, 1 },
+    { T_LEFT_BRACE,   1 },
+    { T_RIGHT_BRACE,  1 },
+    { T_SPACE,        1 },
+    { T_TAB,          1 },
+    { T_BACKSLASH,    1 },
+    { T_NUMERIC_HEX,  2 },
+    { T_NUMERIC_DEC,  2 },
+    { T_NUMERIC_OCT,  2 },
+    { T_DEFAULT,      1 } /* any character */
+};
+
+#define        SYM_CR          '\r'
+#define        SYM_NEWLINE     '\n'
+#define        SYM_COMMENT     '#'
+#define        SYM_SEMICOLON   ';'
+#define        SYM_DOUBLE_QUOTE        '"'
+#define        SYM_LEFT_BRACE  '{'
+#define        SYM_RIGHT_BRACE '}'
+#define        SYM_SPACE       ' '
+#define        SYM_TAB         '\t'
+#define        SYM_BACKSLASH   '\\'
+
+/************************************************************************/
+
+#define MAX_NAME_NEST  64
+
+typedef struct {
+    ParseState pre_state;
+    char *category;
+    char *name[MAX_NAME_NEST];
+    int nest_depth;
+    char **value;
+    int value_len;
+    int value_num;
+    int bufsize;        /* bufMaxSize >= bufsize >= 0 */
+    int bufMaxSize;     /* default : BUFSIZE */
+    char *buf;
+} DBParseInfo;
+
+static DBParseInfo parse_info;
+
+static void
+init_parse_info (void)
+{
+    static int allocated /* = 0 */;
+    char *ptr;
+    int size;
+    if (!allocated) {
+       bzero(&parse_info, sizeof(DBParseInfo));
+       parse_info.buf = (char *)Xmalloc(BUFSIZE);
+       parse_info.bufMaxSize = BUFSIZE;
+       allocated = 1;
+       return;
+    }
+    ptr = parse_info.buf;
+    size = parse_info.bufMaxSize;
+    bzero(&parse_info, sizeof(DBParseInfo));
+    parse_info.buf = ptr;
+    parse_info.bufMaxSize = size;
+}
+
+static void
+clear_parse_info (void)
+{
+    int i;
+    char *ptr;
+    int size;
+    parse_info.pre_state = S_NULL;
+    if (parse_info.category != NULL) {
+       Xfree(parse_info.category);
+    }
+    for (i = 0; i <= parse_info.nest_depth; ++i) {
+       if (parse_info.name[i]) {
+           Xfree(parse_info.name[i]);
+       }
+    }
+    if (parse_info.value) {
+       if (*parse_info.value) {
+           Xfree(*parse_info.value);
+       }
+       Xfree((char *)parse_info.value);
+    }
+    ptr = parse_info.buf;
+    size = parse_info.bufMaxSize;
+    bzero(&parse_info, sizeof(DBParseInfo));
+    parse_info.buf = ptr;
+    parse_info.bufMaxSize = size;
+}
+
+static Bool
+realloc_parse_info(
+    int len)
+{
+    char *p;
+
+    parse_info.bufMaxSize = BUFSIZE * ((parse_info.bufsize + len)/BUFSIZE + 1);
+    p = (char *)Xrealloc(parse_info.buf, parse_info.bufMaxSize);
+    if (p == NULL)
+        return False;
+    parse_info.buf = p;
+
+    return True;
+}
+
+/************************************************************************/
+
+typedef struct _Line {
+    char *str;
+    int cursize;
+    int maxsize;
+    int seq;
+} Line;
+
+static void
+free_line(
+    Line *line)
+{
+    if (line->str != NULL) {
+       Xfree(line->str);
+    }
+    bzero(line, sizeof(Line));
+}
+
+static int
+realloc_line(
+    Line *line,
+    int size)
+{
+    char *str = line->str;
+
+    if (str != NULL) {
+       str = (char *)Xrealloc(str, size);
+    } else {
+       str = (char *)Xmalloc(size);
+    }
+    if (str == NULL) {
+       /* malloc error */
+       if (line->str != NULL) {
+           Xfree(line->str);
+       }
+       bzero(line, sizeof(Line));
+       return 0;
+    }
+    line->str = str;
+    line->maxsize = size;
+    return 1;
+}
+
+#define        iswhite(ch)     ((ch) == SYM_SPACE   || (ch) == SYM_TAB)
+
+static void
+zap_comment(
+    char *str,
+    int *quoted)
+{
+    char *p = str;
+#ifdef never
+    *quoted = 0;
+    if (*p == SYM_COMMENT) {
+       int len = strlen(str);
+       if (p[len - 1] == SYM_NEWLINE || p[len - 1] == SYM_CR) {
+           *p++ = SYM_NEWLINE;
+       }
+       *p = '\0';
+    }
+#else
+    while (*p) {
+       if (*p == SYM_DOUBLE_QUOTE) {
+           if (p == str || p[-1] != SYM_BACKSLASH) {
+               /* unescaped double quote changes quoted state. */
+               *quoted = *quoted ? 0 : 1;
+           }
+       }
+       if (*p == SYM_COMMENT && !*quoted) {
+           int pos = p - str;
+           if (pos == 0 ||
+               (iswhite(p[-1]) && (pos == 1 || p[-2] != SYM_BACKSLASH))) {
+               int len = strlen(p);
+               if (len > 0 && (p[len - 1] == SYM_NEWLINE || p[len-1] == SYM_CR)) {
+                   /* newline is the identifier for finding end of value.
+                      therefore, it should not be removed. */
+                   *p++ = SYM_NEWLINE;
+               }
+               *p = '\0';
+               break;
+           }
+       }
+       ++p;
+    }
+#endif
+}
+
+static int
+read_line(
+    FILE *fd,
+    Line *line)
+{
+    char buf[BUFSIZE], *p;
+    int len;
+    int quoted = 0;    /* quoted by double quote? */
+    char *str;
+    int cur;
+
+    str = line->str;
+    cur = line->cursize = 0;
+
+    while ((p = fgets(buf, BUFSIZE, fd)) != NULL) {
+       ++line->seq;
+       zap_comment(p, &quoted);        /* remove comment line */
+       len = strlen(p);
+       if (len == 0) {
+           if (cur > 0) {
+               break;
+           }
+           continue;
+       }
+       if (cur + len + 1 > line->maxsize) {
+           /* need to reallocate buffer. */
+           if (! realloc_line(line, line->maxsize + BUFSIZE)) {
+               return -1;      /* realloc error. */
+           }
+           str = line->str;
+       }
+       strncpy(str + cur, p, len);
+
+       cur += len;
+       str[cur] = '\0';
+#ifdef __UNIXOS2__  /* Take out carriage returns under OS/2 */
+       if (cur>1) {
+          if (str[cur-2] == '\r' && str[cur-1] == '\n') {
+             str[cur-2] = '\n';
+             str[cur-1] = '\0';
+             cur--;
+          }
+       }
+#endif
+       if (!quoted && cur > 1 && str[cur - 2] == SYM_BACKSLASH &&
+           (str[cur - 1] == SYM_NEWLINE || str[cur-1] == SYM_CR)) {
+           /* the line is ended backslash followed by newline.
+              need to concatinate the next line. */
+           cur -= 2;
+           str[cur] = '\0';
+       } else if (len < BUFSIZE - 1 || buf[len - 1] == SYM_NEWLINE ||
+                  buf[len - 1] == SYM_CR) {
+           /* the line is shorter than BUFSIZE. */
+           break;
+       }
+    }
+    if (quoted) {
+       /* error.  still in quoted state. */
+       return -1;
+    }
+    return line->cursize = cur;
+}
+
+/************************************************************************/
+
+static Token
+get_token(
+    const char *str)
+{
+    switch (*str) {
+    case SYM_NEWLINE:
+    case SYM_CR:               return T_NEWLINE;
+    case SYM_COMMENT:          return T_COMMENT;
+    case SYM_SEMICOLON:                return T_SEMICOLON;
+    case SYM_DOUBLE_QUOTE:     return T_DOUBLE_QUOTE;
+    case SYM_LEFT_BRACE:       return T_LEFT_BRACE;
+    case SYM_RIGHT_BRACE:      return T_RIGHT_BRACE;
+    case SYM_SPACE:            return T_SPACE;
+    case SYM_TAB:              return T_TAB;
+    case SYM_BACKSLASH:
+       switch (str[1]) {
+       case 'x': return T_NUMERIC_HEX;
+       case 'd': return T_NUMERIC_DEC;
+       case 'o': return T_NUMERIC_OCT;
+       }
+       return T_BACKSLASH;
+    default:
+       return T_DEFAULT;
+    }
+}
+
+static int
+get_word(
+    const char *str,
+    char *word)
+{
+    const char *p = str;
+    char *w = word;
+    Token token;
+    int token_len;
+
+    while (*p != '\0') {
+       token = get_token(p);
+       token_len = token_tbl[token].len;
+       if (token == T_BACKSLASH) {
+           p += token_len;
+           if (*p == '\0')
+               break;
+           token = get_token(p);
+           token_len = token_tbl[token].len;
+       } else if (token != T_COMMENT && token != T_DEFAULT) {
+           break;
+       }
+       strncpy(w, p, token_len);
+       p += token_len; w += token_len;
+    }
+    *w = '\0';
+    return p - str;    /* return number of scanned chars */
+}
+
+static int
+get_quoted_word(
+    const char *str,
+    char *word)
+{
+    const char *p = str;
+    char *w = word;
+    Token token;
+    int token_len;
+
+    if (*p == SYM_DOUBLE_QUOTE) {
+       ++p;
+    }
+    while (*p != '\0') {
+       token = get_token(p);
+       token_len = token_tbl[token].len;
+       if (token == T_DOUBLE_QUOTE) {
+           p += token_len;
+           goto found;
+       }
+       if (token == T_BACKSLASH) {
+           p += token_len;
+           if (*p == '\0') {
+               break;
+           }
+           token = get_token(p);
+           token_len = token_tbl[token].len;
+       }
+       strncpy(w, p, token_len);
+       p += token_len; w += token_len;
+    }
+    /* error. cannot detect next double quote */
+    return 0;
+
+ found:;
+    *w = '\0';
+    return p - str;
+}
+
+/************************************************************************/
+
+static int
+append_value_list (void)
+{
+    char **value_list = parse_info.value;
+    char *value;
+    int value_num = parse_info.value_num;
+    int value_len = parse_info.value_len;
+    char *str = parse_info.buf;
+    int len = parse_info.bufsize;
+    char *p;
+
+    if (len < 1) {
+       return 1; /* return with no error */
+    }
+
+    if (value_list == (char **)NULL) {
+       value_list = (char **)Xmalloc(sizeof(char *) * 2);
+       *value_list = NULL;
+    } else {
+       char **prev_list = value_list;
+
+       value_list = (char **)
+           Xrealloc(value_list, sizeof(char *) * (value_num + 2));
+       if (value_list == NULL) {
+           Xfree(prev_list);
+       }
+    }
+    if (value_list == (char **)NULL)
+       goto err2;
+
+    value = *value_list;
+    if (value == NULL) {
+       value = (char *)Xmalloc(value_len + len + 1);
+    } else {
+       char *prev_value = value;
+
+       value = (char *)Xrealloc(value, value_len + len + 1);
+       if (value == NULL) {
+           Xfree(prev_value);
+       }
+    }
+    if (value == NULL) {
+       goto err1;
+    }
+    if (value != *value_list) {
+       int i;
+       ssize_t delta;
+       delta = value - *value_list;
+       *value_list = value;
+       for (i = 1; i < value_num; ++i) {
+           value_list[i] += delta;
+       }
+    }
+
+    value_list[value_num] = p = &value[value_len];
+    value_list[value_num + 1] = NULL;
+    strncpy(p, str, len);
+    p[len] = 0;
+
+    parse_info.value = value_list;
+    parse_info.value_num = value_num + 1;
+    parse_info.value_len = value_len + len + 1;
+    parse_info.bufsize = 0;
+    return 1;
+
+ err1:
+    if (value_list) {
+       Xfree((char **)value_list);
+    }
+    if (value) {
+       Xfree(value);
+    }
+ err2:
+    parse_info.value = (char **)NULL;
+    parse_info.value_num = 0;
+    parse_info.value_len = 0;
+    parse_info.bufsize = 0;
+    return 0;
+}
+
+static int
+construct_name(
+    char *name,
+    int size)
+{
+    int i;
+    int len = 0;
+    char *p = name;
+
+    for (i = 0; i <= parse_info.nest_depth; ++i) {
+       len += strlen(parse_info.name[i]) + 1;
+    }
+    if (len >= size)
+       return 0;
+
+    strcpy(p, parse_info.name[0]);
+    p += strlen(parse_info.name[0]);
+    for (i = 1; i <= parse_info.nest_depth; ++i) {
+       *p++ = '.';
+       strcpy(p, parse_info.name[i]);
+       p += strlen(parse_info.name[i]);
+    }
+    return *name != '\0';
+}
+
+static int
+store_to_database(
+    Database *db)
+{
+    Database new = (Database)NULL;
+    char name[BUFSIZE];
+
+    if (parse_info.pre_state == S_VALUE) {
+       if (! append_value_list()) {
+           goto err;
+       }
+    }
+
+    if (parse_info.name[parse_info.nest_depth] == NULL) {
+       goto err;
+    }
+
+    new = Xcalloc(1, sizeof(DatabaseRec));
+    if (new == (Database)NULL) {
+       goto err;
+    }
+
+    new->category = strdup(parse_info.category);
+    if (new->category == NULL) {
+       goto err;
+    }
+
+    if (! construct_name(name, sizeof(name))) {
+       goto err;
+    }
+    new->name = strdup(name);
+    if (new->name == NULL) {
+       goto err;
+    }
+    new->next = *db;
+    new->value = parse_info.value;
+    new->value_num = parse_info.value_num;
+    *db = new;
+
+    Xfree(parse_info.name[parse_info.nest_depth]);
+    parse_info.name[parse_info.nest_depth] = NULL;
+
+    parse_info.value = (char **)NULL;
+    parse_info.value_num = 0;
+    parse_info.value_len = 0;
+
+    return 1;
+
+ err:
+    if (new) {
+       if (new->category) {
+           Xfree(new->category);
+       }
+       if (new->name) {
+           Xfree(new->name);
+       }
+       Xfree(new);
+    }
+    if (parse_info.value) {
+       if (*parse_info.value) {
+           Xfree(*parse_info.value);
+       }
+       Xfree((char **)parse_info.value);
+       parse_info.value = (char **)NULL;
+       parse_info.value_num = 0;
+       parse_info.value_len = 0;
+    }
+    return 0;
+}
+
+#define END_MARK       "END"
+#define        END_MARK_LEN    3 /*strlen(END_MARK)*/
+
+static int
+check_category_end(
+    const char *str)
+{
+    const char *p;
+    int len;
+
+    p = str;
+    if (strncmp(p, END_MARK, END_MARK_LEN)) {
+       return 0;
+    }
+    p += END_MARK_LEN;
+
+    while (iswhite(*p)) {
+       ++p;
+    }
+    len = strlen(parse_info.category);
+    if (strncmp(p, parse_info.category, len)) {
+       return 0;
+    }
+    p += len;
+    return p - str;
+}
+
+/************************************************************************/
+
+static int
+f_newline(
+    const char *str,
+    Token token,
+    Database *db)
+{
+    switch (parse_info.pre_state) {
+    case S_NULL:
+    case S_CATEGORY:
+       break;
+    case S_NAME:
+       return 0; /* no value */
+    case S_VALUE:
+       if (!store_to_database(db))
+           return 0;
+       parse_info.pre_state = S_CATEGORY;
+       break;
+    default:
+       return 0;
+    }
+    return token_tbl[token].len;
+}
+
+static int
+f_comment(
+    const char *str,
+    Token token,
+    Database *db)
+{
+    /* NOTE: comment is already handled in read_line(),
+       so this function is not necessary. */
+
+    const char *p = str;
+
+    while (*p != SYM_NEWLINE && *p != SYM_CR && *p != '\0') {
+       ++p;    /* zap to the end of line */
+    }
+    return p - str;
+}
+
+static int
+f_white(
+    const char *str,
+    Token token,
+    Database *db)
+{
+    const char *p = str;
+
+    while (iswhite(*p)) {
+       ++p;
+    }
+    return p - str;
+}
+
+static int
+f_semicolon(
+    const char *str,
+    Token token,
+    Database *db)
+{
+    switch (parse_info.pre_state) {
+    case S_NULL:
+    case S_CATEGORY:
+    case S_NAME:
+       return 0;
+    case S_VALUE:
+       if (! append_value_list())
+           return 0;
+       parse_info.pre_state = S_VALUE;
+       break;
+    default:
+       return 0;
+    }
+    return token_tbl[token].len;
+}
+
+static int
+f_left_brace(
+    const char *str,
+    Token token,
+    Database *db)
+{
+    switch (parse_info.pre_state) {
+    case S_NULL:
+    case S_CATEGORY:
+    case S_VALUE:
+       return 0;
+    case S_NAME:
+       if (parse_info.name[parse_info.nest_depth] == NULL
+           || parse_info.nest_depth + 1 > MAX_NAME_NEST)
+           return 0;
+       ++parse_info.nest_depth;
+       parse_info.pre_state = S_CATEGORY;
+       break;
+    default:
+       return 0;
+    }
+    return token_tbl[token].len;
+}
+
+static int
+f_right_brace(
+    const char *str,
+    Token token,
+    Database *db)
+{
+    if (parse_info.nest_depth < 1)
+       return 0;
+
+    switch (parse_info.pre_state) {
+    case S_NULL:
+    case S_NAME:
+       return 0;
+    case S_VALUE:
+       if (! store_to_database(db))
+           return 0;
+       /* fall into next case */
+    case S_CATEGORY:
+       if (parse_info.name[parse_info.nest_depth] != NULL) {
+           Xfree(parse_info.name[parse_info.nest_depth]);
+           parse_info.name[parse_info.nest_depth] = NULL;
+       }
+       --parse_info.nest_depth;
+       parse_info.pre_state = S_CATEGORY;
+       break;
+    default:
+       return 0;
+    }
+    return token_tbl[token].len;
+}
+
+static int
+f_double_quote(
+    const char *str,
+    Token token,
+    Database *db)
+{
+    char word[BUFSIZE];
+    char* wordp;
+    int len;
+
+    if ((len = strlen (str)) < sizeof word)
+       wordp = word;
+    else
+       wordp = Xmalloc (len + 1);
+    if (wordp == NULL)
+       return 0;
+
+    len = 0;
+    switch (parse_info.pre_state) {
+    case S_NULL:
+    case S_CATEGORY:
+       goto err;
+    case S_NAME:
+    case S_VALUE:
+       len = get_quoted_word(str, wordp);
+       if (len < 1)
+           goto err;
+       if ((parse_info.bufsize + (int)strlen(wordp) + 1)
+                                       >= parse_info.bufMaxSize) {
+           if (realloc_parse_info(strlen(wordp)+1) == False) {
+               goto err;
+           }
+       }
+       strcpy(&parse_info.buf[parse_info.bufsize], wordp);
+       parse_info.bufsize += strlen(wordp);
+       parse_info.pre_state = S_VALUE;
+       break;
+    default:
+       goto err;
+    }
+    if (wordp != word)
+       Xfree (wordp);
+    return len;        /* including length of token */
+
+err:
+    if (wordp != word)
+       Xfree (wordp);
+    return 0;
+}
+
+static int
+f_backslash(
+    const char *str,
+    Token token,
+    Database *db)
+{
+    return f_default(str, token, db);
+}
+
+static int
+f_numeric(
+    const char *str,
+    Token token,
+    Database *db)
+{
+    char word[BUFSIZE];
+    const char *p;
+    char* wordp;
+    int len;
+    int token_len;
+
+    if ((len = strlen (str)) < sizeof word)
+       wordp = word;
+    else
+       wordp = Xmalloc (len + 1);
+    if (wordp == NULL)
+       return 0;
+
+    switch (parse_info.pre_state) {
+    case S_NULL:
+    case S_CATEGORY:
+       goto err;
+    case S_NAME:
+    case S_VALUE:
+       token_len = token_tbl[token].len;
+       p = str + token_len;
+       len = get_word(p, wordp);
+       if (len < 1)
+           goto err;
+       if ((parse_info.bufsize + token_len + (int)strlen(wordp) + 1)
+                                       >= parse_info.bufMaxSize) {
+           if (realloc_parse_info(token_len + strlen(wordp) + 1) == False)
+               goto err;
+       }
+       strncpy(&parse_info.buf[parse_info.bufsize], str, token_len);
+       strcpy(&parse_info.buf[parse_info.bufsize + token_len], wordp);
+       parse_info.bufsize += token_len + strlen(wordp);
+       parse_info.pre_state = S_VALUE;
+       break;
+    default:
+       goto err;
+    }
+    if (wordp != word)
+       Xfree (wordp);
+    return len + token_len;
+
+err:
+    if (wordp != word)
+       Xfree (wordp);
+    return 0;
+}
+
+static int
+f_default(
+    const char *str,
+    Token token,
+    Database *db)
+{
+    char word[BUFSIZE], *p;
+    char* wordp;
+    int len;
+
+    if ((len = strlen (str)) < sizeof word)
+       wordp = word;
+    else
+       wordp = Xmalloc (len + 1);
+    if (wordp == NULL)
+       return 0;
+
+    len = get_word(str, wordp);
+    if (len < 1)
+       goto err;
+
+    switch (parse_info.pre_state) {
+    case S_NULL:
+       if (parse_info.category != NULL)
+           goto err;
+       p = strdup(wordp);
+       if (p == NULL)
+           goto err;
+       parse_info.category = p;
+       parse_info.pre_state = S_CATEGORY;
+       break;
+    case S_CATEGORY:
+       if (parse_info.nest_depth == 0) {
+           if (check_category_end(str)) {
+               /* end of category is detected.
+                  clear context and zap to end of this line */
+               clear_parse_info();
+               len = strlen(str);
+               break;
+           }
+       }
+       p = strdup(wordp);
+       if (p == NULL)
+           goto err;
+       if (parse_info.name[parse_info.nest_depth] != NULL) {
+           Xfree(parse_info.name[parse_info.nest_depth]);
+       }
+       parse_info.name[parse_info.nest_depth] = p;
+       parse_info.pre_state = S_NAME;
+       break;
+    case S_NAME:
+    case S_VALUE:
+       if ((parse_info.bufsize + (int)strlen(wordp) + 1)
+                                       >= parse_info.bufMaxSize) {
+           if (realloc_parse_info(strlen(wordp) + 1) == False)
+               goto err;
+       }
+       strcpy(&parse_info.buf[parse_info.bufsize], wordp);
+       parse_info.bufsize += strlen(wordp);
+       parse_info.pre_state = S_VALUE;
+       break;
+    default:
+       goto err;
+    }
+    if (wordp != word)
+       Xfree (wordp);
+    return len;
+
+err:
+    if (wordp != word)
+       Xfree (wordp);
+    return 0;
+}
+
+/************************************************************************/
+
+#ifdef DEBUG
+static void
+PrintDatabase(
+    Database db)
+{
+    Database p = db;
+    int i = 0, j;
+
+    printf("***\n*** BEGIN Database\n***\n");
+    while (p) {
+       printf("%3d: ", i++);
+       printf("%s, %s, ", p->category, p->name);
+       printf("\t[%d: ", p->value_num);
+       for (j = 0; j < p->value_num; ++j) {
+           printf("%s, ", p->value[j]);
+       }
+       printf("]\n");
+       p = p->next;
+    }
+    printf("***\n*** END   Database\n***\n");
+}
+#endif
+
+static void
+DestroyDatabase(
+    Database db)
+{
+    Database p = db;
+
+    while (p) {
+       if (p->category != NULL) {
+           Xfree(p->category);
+       }
+       if (p->name != NULL) {
+           Xfree(p->name);
+       }
+       if (p->value != (char **)NULL) {
+           if (*p->value != NULL) {
+               Xfree(*p->value);
+           }
+           Xfree((char *)p->value);
+       }
+       db = p->next;
+       Xfree((char *)p);
+       p = db;
+    }
+}
+
+static int
+CountDatabase(
+    Database db)
+{
+    Database p = db;
+    int cnt = 0;
+
+    while (p) {
+       ++cnt;
+       p = p->next;
+    }
+    return cnt;
+}
+
+static Database
+CreateDatabase(
+    char *dbfile)
+{
+    Database db = (Database)NULL;
+    FILE *fd;
+    Line line;
+    char *p;
+    Token token;
+    int len;
+    int error = 0;
+
+    fd = _XFopenFile(dbfile, "r");
+    if (fd == (FILE *)NULL)
+       return NULL;
+
+    bzero(&line, sizeof(Line));
+    init_parse_info();
+
+    do {
+       int rc = read_line(fd, &line);
+       if (rc < 0) {
+           error = 1;
+           break;
+       } else if (rc == 0) {
+           break;
+       }
+       p = line.str;
+       while (*p) {
+            int (*parse_proc)(const char *str, Token token, Database *db) = NULL;
+
+           token = get_token(p);
+
+            switch (token_tbl[token].token) {
+            case T_NEWLINE:
+                parse_proc = f_newline;
+                break;
+            case T_COMMENT:
+                parse_proc = f_comment;
+                break;
+            case T_SEMICOLON:
+                parse_proc = f_semicolon;
+                break;
+            case T_DOUBLE_QUOTE:
+                parse_proc = f_double_quote;
+                break;
+            case T_LEFT_BRACE:
+                parse_proc = f_left_brace;
+                break;
+            case T_RIGHT_BRACE:
+                parse_proc = f_right_brace;
+                break;
+            case T_SPACE:
+            case T_TAB:
+                parse_proc = f_white;
+                break;
+            case T_BACKSLASH:
+                parse_proc = f_backslash;
+                break;
+            case T_NUMERIC_HEX:
+            case T_NUMERIC_DEC:
+            case T_NUMERIC_OCT:
+                parse_proc = f_numeric;
+                break;
+            case T_DEFAULT:
+                parse_proc = f_default;
+                break;
+            }
+
+            len = parse_proc(p, token, &db);
+
+           if (len < 1) {
+               error = 1;
+               break;
+           }
+           p += len;
+       }
+    } while (!error);
+
+    if (parse_info.pre_state != S_NULL) {
+       clear_parse_info();
+       error = 1;
+    }
+    if (error) {
+#ifdef DEBUG
+       fprintf(stderr, "database format error at line %d.\n", line.seq);
+#endif
+       DestroyDatabase(db);
+       db = (Database)NULL;
+    }
+
+    fclose(fd);
+    free_line(&line);
+
+#ifdef DEBUG
+    PrintDatabase(db);
+#endif
+
+    return db;
+}
+
+/************************************************************************/
+
+#ifndef        NOT_X_ENV
+
+/* locale framework functions */
+
+typedef struct _XlcDatabaseRec {
+    XrmQuark category_q;
+    XrmQuark name_q;
+    Database db;
+    struct _XlcDatabaseRec *next;
+} XlcDatabaseRec, *XlcDatabase;
+
+typedef        struct _XlcDatabaseListRec {
+    XrmQuark name_q;
+    XlcDatabase lc_db;
+    Database database;
+    int ref_count;
+    struct _XlcDatabaseListRec *next;
+} XlcDatabaseListRec, *XlcDatabaseList;
+
+/* database cache list (per file) */
+static XlcDatabaseList _db_list = (XlcDatabaseList)NULL;
+
+/************************************************************************/
+/*     _XlcGetResource(lcd, category, class, value, count)             */
+/*----------------------------------------------------------------------*/
+/*     This function retrieves XLocale database information.           */
+/************************************************************************/
+void
+_XlcGetResource(
+    XLCd lcd,
+    const char *category,
+    const char *class,
+    char ***value,
+    int *count)
+{
+    XLCdPublicMethodsPart *methods = XLC_PUBLIC_METHODS(lcd);
+
+    (*methods->get_resource)(lcd, category, class, value, count);
+    return;
+}
+
+/************************************************************************/
+/*     _XlcGetLocaleDataBase(lcd, category, class, value, count)       */
+/*----------------------------------------------------------------------*/
+/*     This function retrieves XLocale database information.           */
+/************************************************************************/
+void
+_XlcGetLocaleDataBase(
+    XLCd lcd,
+    const char *category,
+    const char *name,
+    char ***value,
+    int *count)
+{
+    XlcDatabase lc_db = (XlcDatabase)XLC_PUBLIC(lcd, xlocale_db);
+    XrmQuark category_q, name_q;
+
+    category_q = XrmStringToQuark(category);
+    name_q = XrmStringToQuark(name);
+    for (; lc_db->db; ++lc_db) {
+       if (category_q == lc_db->category_q && name_q == lc_db->name_q) {
+           *value = lc_db->db->value;
+           *count = lc_db->db->value_num;
+           return;
+       }
+    }
+    *value = (char **)NULL;
+    *count = 0;
+}
+
+/************************************************************************/
+/*     _XlcDestroyLocaleDataBase(lcd)                                  */
+/*----------------------------------------------------------------------*/
+/*     This function destroy the XLocale Database that bound to the    */
+/*     specified lcd.  If the XLocale Database is refered from some    */
+/*     other lcd, this function just decreases reference count of      */
+/*     the database.  If no locale refers the database, this function  */
+/*     remove it from the cache list and free work area.               */
+/************************************************************************/
+void
+_XlcDestroyLocaleDataBase(
+    XLCd lcd)
+{
+    XlcDatabase lc_db = (XlcDatabase)XLC_PUBLIC(lcd, xlocale_db);
+    XlcDatabaseList p, prev;
+
+    for (p = _db_list, prev = (XlcDatabaseList)NULL; p;
+        prev = p, p = p->next) {
+       if (p->lc_db == lc_db) {
+           if ((-- p->ref_count) < 1) {
+               if (p->lc_db != (XlcDatabase)NULL) {
+                   Xfree((char *)p->lc_db);
+               }
+               DestroyDatabase(p->database);
+               if (prev == (XlcDatabaseList)NULL) {
+                   _db_list = p->next;
+               } else {
+                   prev->next = p->next;
+               }
+               Xfree((char*)p);
+           }
+           break;
+       }
+    }
+    XLC_PUBLIC(lcd, xlocale_db) = (XPointer)NULL;
+}
+
+/************************************************************************/
+/*     _XlcCreateLocaleDataBase(lcd)                                   */
+/*----------------------------------------------------------------------*/
+/*     This function create an XLocale database which correspond to    */
+/*     the specified XLCd.                                             */
+/************************************************************************/
+XPointer
+_XlcCreateLocaleDataBase(
+    XLCd lcd)
+{
+    XlcDatabaseList list, new;
+    Database p, database = (Database)NULL;
+    XlcDatabase lc_db = (XlcDatabase)NULL;
+    XrmQuark name_q;
+    char *name;
+    int i, n;
+
+    name = _XlcFileName(lcd, "locale");
+    if (name == NULL)
+       return (XPointer)NULL;
+
+#ifndef __UNIXOS2__
+    name_q = XrmStringToQuark(name);
+#else
+    name_q = XrmStringToQuark((char*)__XOS2RedirRoot(name));
+#endif
+    for (list = _db_list; list; list = list->next) {
+       if (name_q == list->name_q) {
+           list->ref_count++;
+           Xfree (name);
+           return XLC_PUBLIC(lcd, xlocale_db) = (XPointer)list->lc_db;
+       }
+    }
+
+    database = CreateDatabase(name);
+    if (database == (Database)NULL) {
+       Xfree (name);
+       return (XPointer)NULL;
+    }
+    n = CountDatabase(database);
+    lc_db = Xcalloc(n + 1, sizeof(XlcDatabaseRec));
+    if (lc_db == (XlcDatabase)NULL)
+       goto err;
+    for (p = database, i = 0; p && i < n; p = p->next, ++i) {
+       lc_db[i].category_q = XrmStringToQuark(p->category);
+       lc_db[i].name_q = XrmStringToQuark(p->name);
+       lc_db[i].db = p;
+    }
+
+    new = (XlcDatabaseList)Xmalloc(sizeof(XlcDatabaseListRec));
+    if (new == (XlcDatabaseList)NULL) {
+       goto err;
+    }
+    new->name_q = name_q;
+    new->lc_db = lc_db;
+    new->database = database;
+    new->ref_count = 1;
+    new->next = _db_list;
+    _db_list = new;
+
+    Xfree (name);
+    return XLC_PUBLIC(lcd, xlocale_db) = (XPointer)lc_db;
+
+ err:
+    DestroyDatabase(database);
+    if (lc_db != (XlcDatabase)NULL) {
+       Xfree((char *)lc_db);
+    }
+    Xfree (name);
+    return (XPointer)NULL;
+}
+
+#endif /* NOT_X_ENV */
diff --git a/src/xlibi18n/lcDynamic.c b/src/xlibi18n/lcDynamic.c
new file mode 100644 (file)
index 0000000..f6df94c
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+Copyright 1996, 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 1995 by FUJITSU LIMITED
+ * This is source code modified by FUJITSU LIMITED under the Joint
+ * Development Agreement for the CDE/Motif PST.
+ *
+ * Modifier: Takanori Tateno   FUJITSU LIMITED
+ *
+ */
+
+/*
+ * A dynamically loaded locale.
+ * Supports: All locale names.
+ * How: Loads $(XLOCALEDIR)/xi18n.so and forwards the request to that library.
+ * Platforms: Only those defining USE_DYNAMIC_LOADER (none known).
+ */
+
+#ifdef USE_DYNAMIC_LOADER
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include <string.h>
+#include <dlfcn.h>
+
+#include "Xlibint.h"
+#include "Xlcint.h"
+
+#ifndef XLOCALEDIR
+#define XLOCALEDIR "/usr/lib/X11/locale"
+#endif
+
+#define LCLIBNAME    "xi18n.so"
+
+XLCd
+_XlcDynamicLoader(
+    const char *name)
+{
+    char libpath[1024];
+    XLCdMethods _XlcGenericMethods;
+    XLCd lcd;
+    void *nlshandler;
+
+    sprintf(libpath,"%s/%s/%s",
+               XLOCALEDIR,name,LCLIBNAME);
+    nlshandler = dlopen(libpath,LAZY);
+    _XlcGenericMethods = (XLCdMethods)dlsym(nlshandler,"genericMethods");
+    lcd = _XlcCreateLC(name,_XlcGenericMethods);
+
+    return lcd;
+}
+#else
+typedef int dummy;
+#endif /* USE_DYNAMIC_LOADER */
diff --git a/src/xlibi18n/lcFile.c b/src/xlibi18n/lcFile.c
new file mode 100644 (file)
index 0000000..2c06fa2
--- /dev/null
@@ -0,0 +1,829 @@
+/*
+ *
+ * Copyright IBM Corporation 1993
+ *
+ * All Rights Reserved
+ *
+ * License 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 IBM not be
+ * used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ *
+ * IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS, AND
+ * NONINFRINGEMENT OF THIRD PARTY RIGHTS, IN NO EVENT SHALL
+ * IBM 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 <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include "Xlibint.h"
+#include "XlcPubI.h"
+#include <X11/Xos.h>
+#include <unistd.h>
+
+/************************************************************************/
+
+#ifndef HAVE_SETEUID
+# define seteuid setuid
+#endif
+#define        iscomment(ch)   ((ch) == '#' || (ch) == '\0')
+#if defined(WIN32)
+#define isreadable(f)  (_XAccessFile(f))
+#else
+#define isreadable(f)  ((access((f), R_OK) != -1) ? 1 : 0)
+#endif
+
+#ifndef __UNIXOS2__
+#define LC_PATHDELIM ':'
+#else
+#define LC_PATHDELIM ';'
+#endif
+
+#define XLC_BUFSIZE 256
+
+#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
+
+#define NUM_LOCALEDIR  64
+
+/* Splits a NUL terminated line into constituents, at colons and newline
+   characters. Leading whitespace is removed from constituents. The
+   constituents are stored at argv[0..argsize-1]. The number of stored
+   constituents (<= argsize) is returned. The line is destructively
+   modified. */
+static int
+parse_line(
+    char *line,
+    char **argv,
+    int argsize)
+{
+    int argc = 0;
+    char *p = line;
+
+    while (argc < argsize) {
+       while (isspace(*p)) {
+           ++p;
+       }
+       if (*p == '\0') {
+           break;
+       }
+       argv[argc++] = p;
+       while (*p != ':' && *p != '\n' && *p != '\0') {
+           ++p;
+       }
+       if (*p == '\0') {
+           break;
+       }
+       *p++ = '\0';
+    }
+
+    return argc;
+}
+
+#ifdef __UNIXOS2__
+
+/* fg021216: entries in locale files are separated by colons while under
+   OS/2, path entries are separated by semicolon, so we need two functions */
+
+static int
+parse_line1(
+    char *line,
+    char **argv,
+    int argsize)
+{
+    int argc = 0;
+    char *p = line;
+
+    while (argc < argsize) {
+       while (isspace(*p)) {
+           ++p;
+       }
+       if (*p == '\0') {
+           break;
+       }
+       argv[argc++] = p;
+       while (*p != ';' && *p != '\n' && *p != '\0') {
+           ++p;
+       }
+       if (*p == '\0') {
+           break;
+       }
+       *p++ = '\0';
+    }
+
+    return argc;
+}
+#elif defined(WIN32)
+
+/* this is parse_line but skips drive letters at the beginning of the entry */
+static int
+parse_line1(
+    char *line,
+    char **argv,
+    int argsize)
+{
+    int argc = 0;
+    char *p = line;
+
+    while (argc < argsize) {
+       while (isspace(*p)) {
+           ++p;
+       }
+       if (*p == '\0') {
+           break;
+       }
+       argv[argc++] = p;
+        if (isalpha(*p) && p[1] == ':') {
+            p+= 2; /* skip drive letters */
+        }
+       while (*p != ':' && *p != '\n' && *p != '\0') {
+           ++p;
+       }
+       if (*p == '\0') {
+           break;
+       }
+       *p++ = '\0';
+    }
+
+    return argc;
+}
+
+#endif   /* __UNIXOS2__ */
+
+/* Splits a colon separated list of directories, and returns the constituent
+   paths (without trailing slash). At most argsize constituents are stored
+   at argv[0..argsize-1]. The number of stored constituents is returned. */
+static int
+_XlcParsePath(
+    char *path,
+    char **argv,
+    int argsize)
+{
+    char *p = path;
+    int n, i;
+
+#if !defined(__UNIXOS2__) && !defined(WIN32)
+    n = parse_line(path, argv, argsize);
+#else
+    n = parse_line1(path, argv, argsize);
+#endif
+    for (i = 0; i < n; ++i) {
+       int len;
+       p = argv[i];
+       len = strlen(p);
+       if (len > 0 && p[len - 1] == '/') {
+           /* eliminate trailing slash */
+           p[len - 1] = '\0';
+       }
+    }
+    return n;
+}
+
+#ifndef XLOCALEDIR
+#define XLOCALEDIR "/usr/lib/X11/locale"
+#endif
+
+void
+xlocaledir(
+    char *buf,
+    int buf_len)
+{
+    char *p = buf;
+    int len = 0;
+
+#ifndef NO_XLOCALEDIR
+    char *dir;
+    int priv = 1;
+
+    dir = getenv("XLOCALEDIR");
+
+    if (dir) {
+#ifndef WIN32
+       /*
+        * Only use the user-supplied path if the process isn't priviledged.
+        */
+       if (getuid() == geteuid() && getgid() == getegid()) {
+#if defined(HASSETUGID)
+           priv = issetugid();
+#elif defined(HASGETRESUID)
+           {
+               uid_t ruid, euid, suid;
+               gid_t rgid, egid, sgid;
+               if ((getresuid(&ruid, &euid, &suid) == 0) &&
+                   (getresgid(&rgid, &egid, &sgid) == 0))
+                   priv = (euid != suid) || (egid != sgid);
+           }
+#else
+           /*
+            * If there are saved ID's the process might still be priviledged
+            * even though the above test succeeded.  If issetugid() and
+            * getresgid() aren't available, test this by trying to set
+            * euid to 0.
+            *
+            * Note: this only protects setuid-root clients.  It doesn't
+            * protect other setuid or any setgid clients.  If this tradeoff
+            * isn't acceptable, set DisableXLocaleDirEnv to YES in host.def.
+            */
+           unsigned int oldeuid;
+           oldeuid = geteuid();
+           if (seteuid(0) != 0) {
+               priv = 0;
+           } else {
+               if (seteuid(oldeuid) == -1) {
+                   /* XXX ouch, coudn't get back to original uid
+                    what can we do ??? */
+                   _exit(127);
+               }
+               priv = 1;
+           }
+#endif
+       }
+#else
+       priv = 0;
+#endif
+       if (!priv) {
+           len = strlen(dir);
+           strncpy(p, dir, buf_len);
+           if (len < buf_len) {
+               p[len++] = LC_PATHDELIM;
+               p += len;
+           }
+       }
+    }
+#endif /* NO_XLOCALEDIR */
+
+    if (len < buf_len)
+#ifndef __UNIXOS2__
+      strncpy(p, XLOCALEDIR, buf_len - len);
+#else
+      strncpy(p,__XOS2RedirRoot(XLOCALEDIR), buf_len - len);
+#endif
+    buf[buf_len-1] = '\0';
+}
+
+static void
+xlocalelibdir(
+    char *buf,
+    int buf_len)
+{
+    char *p = buf;
+    int len = 0;
+
+#ifndef NO_XLOCALEDIR
+    char *dir;
+    int priv = 1;
+
+    dir = getenv("XLOCALELIBDIR");
+
+    if (dir) {
+#ifndef WIN32
+       /*
+        * Only use the user-supplied path if the process isn't priviledged.
+        */
+       if (getuid() == geteuid() && getgid() == getegid()) {
+#if defined(HASSETUGID)
+           priv = issetugid();
+#elif defined(HASGETRESUID)
+           {
+               uid_t ruid, euid, suid;
+               gid_t rgid, egid, sgid;
+               if ((getresuid(&ruid, &euid, &suid) == 0) &&
+                   (getresgid(&rgid, &egid, &sgid) == 0))
+                   priv = (euid != suid) || (egid != sgid);
+           }
+#else
+           /*
+            * If there are saved ID's the process might still be priviledged
+            * even though the above test succeeded.  If issetugid() and
+            * getresgid() aren't available, test this by trying to set
+            * euid to 0.
+            *
+            * Note: this only protects setuid-root clients.  It doesn't
+            * protect other setuid or any setgid clients.  If this tradeoff
+            * isn't acceptable, set DisableXLocaleDirEnv to YES in host.def.
+            */
+           unsigned int oldeuid;
+           oldeuid = geteuid();
+           if (seteuid(0) != 0) {
+               priv = 0;
+           } else {
+               if (seteuid(oldeuid) == -1) {
+                   /* XXX ouch, coudn't get back to original uid
+                    what can we do ??? */
+                   _exit(127);
+               }
+               priv = 1;
+           }
+#endif
+       }
+#else
+       priv = 0;
+#endif
+       if (!priv) {
+           len = strlen(dir);
+           strncpy(p, dir, buf_len);
+           if (len < buf_len) {
+               p[len++] = LC_PATHDELIM;
+               p += len;
+           }
+       }
+    }
+#endif /* NO_XLOCALEDIR */
+
+    if (len < buf_len)
+#ifndef __UNIXOS2__
+      strncpy(p, XLOCALELIBDIR, buf_len - len);
+#else
+      strncpy(p,__XOS2RedirRoot(XLOCALELIBDIR), buf_len - len);
+#endif
+    buf[buf_len-1] = '\0';
+}
+
+/* Mapping direction */
+typedef enum {
+  LtoR,                /* Map first field to second field */
+  RtoL         /* Map second field to first field */
+} MapDirection;
+
+static char *
+resolve_name(
+    const char *lc_name,
+    char *file_name,
+    MapDirection direction)
+{
+    FILE *fp;
+    char buf[XLC_BUFSIZE], *name = NULL;
+
+    fp = _XFopenFile (file_name, "r");
+    if (fp == NULL)
+       return NULL;
+
+    while (fgets(buf, XLC_BUFSIZE, fp) != NULL) {
+       char *p = buf;
+       int n;
+       char *args[2], *from, *to;
+#ifdef __UNIXOS2__  /* Take out CR under OS/2 */
+       int len;
+
+       len = strlen(p);
+       if (len > 1) {
+           if (*(p+len-2) == '\r' && *(p+len-1) == '\n') {
+               *(p+len-2) = '\n';
+               *(p+len-1) = '\0';
+           }
+       }
+#endif
+       while (isspace(*p)) {
+           ++p;
+       }
+       if (iscomment(*p)) {
+           continue;
+       }
+       n = parse_line(p, args, 2);             /* get first 2 fields */
+       if (n != 2) {
+           continue;
+       }
+       if (direction == LtoR) {
+           from = args[0], to = args[1];       /* left to right */
+       } else {
+           from = args[1], to = args[0];       /* right to left */
+       }
+       if (! strcmp(from, lc_name)) {
+           name = strdup(to);
+           break;
+       }
+    }
+    fclose(fp);
+    return name;
+}
+
+#define        c_tolower(ch)   ((ch) >= 'A' && (ch) <= 'Z' ? (ch) - 'A' + 'a' : (ch))
+
+static char *
+lowercase(
+    char *dst,
+    const char *src)
+{
+    const char *s;
+    char *t;
+
+    for (s = src, t = dst; *s; ++s, ++t)
+       *t = c_tolower(*s);
+    *t = '\0';
+    return dst;
+}
+
+/*
+ * normalize_lcname(): remove any '_' and '-' and convert any character
+ * to lower case after the <language>_<territory> part. If result is identical
+ * to argument, free result and
+ * return NULL.
+ */
+static char *
+normalize_lcname (const char *name)
+{
+    char *p, *ret;
+    const char *tmp = name;
+
+    p = ret = Xmalloc(strlen(name) + 1);
+    if (!p)
+       return NULL;
+
+    if (tmp) {
+       while (*tmp && *tmp != '.' && *tmp != '@')
+           *p++ = *tmp++;
+       while (*tmp) {
+           if (*tmp != '-')
+               *p++ = c_tolower(*tmp);
+           tmp++;
+       }
+    }
+    *p = '\0';
+
+    if (strcmp(ret, name) == 0) {
+       Xfree(ret);
+       return NULL;
+    }
+
+    return ret;
+}
+
+/************************************************************************/
+char *
+_XlcFileName(
+    XLCd lcd,
+    const char *category)
+{
+    char *siname;
+    char cat[XLC_BUFSIZE], dir[XLC_BUFSIZE];
+    int i, n;
+    char *args[NUM_LOCALEDIR];
+    char *file_name = NULL;
+
+    if (lcd == (XLCd)NULL)
+       return NULL;
+
+    siname = XLC_PUBLIC(lcd, siname);
+
+    if (category)
+       lowercase(cat, category);
+    else
+       cat[0] = '\0';
+    xlocaledir(dir,XLC_BUFSIZE);
+    n = _XlcParsePath(dir, args, NUM_LOCALEDIR);
+    for (i = 0; i < n; ++i) {
+       char buf[PATH_MAX], *name;
+
+       name = NULL;
+       if ((5 + (args[i] ? strlen (args[i]) : 0) + strlen(cat)) < PATH_MAX) {
+           sprintf(buf, "%s/%s.dir", args[i], cat);
+           name = resolve_name(siname, buf, RtoL);
+       }
+       if (name == NULL) {
+           continue;
+       }
+       if (*name == '/') {
+           /* supposed to be absolute path name */
+           file_name = name;
+       } else {
+           file_name = Xmalloc(2 + (args[i] ? strlen (args[i]) : 0) +
+                               (name ? strlen (name) : 0));
+           if (file_name != NULL)
+               sprintf(file_name, "%s/%s", args[i], name);
+           Xfree(name);
+       }
+       if (isreadable(file_name)) {
+           break;
+       }
+       Xfree(file_name);
+       file_name = NULL;
+       /* Then, try with next dir */
+    }
+    return file_name;
+}
+
+/************************************************************************/
+#ifndef LOCALE_ALIAS
+#define LOCALE_ALIAS    "locale.alias"
+#endif
+
+int
+_XlcResolveLocaleName(
+    const char* lc_name,
+    XLCdPublicPart* pub)
+{
+    char dir[PATH_MAX], buf[PATH_MAX], *name = NULL;
+    char *dst;
+    int i, n, sinamelen;
+    char *args[NUM_LOCALEDIR];
+    static const char locale_alias[] = LOCALE_ALIAS;
+    char *tmp_siname;
+    char *nlc_name = NULL;
+
+    xlocaledir (dir, PATH_MAX);
+    n = _XlcParsePath(dir, args, NUM_LOCALEDIR);
+    for (i = 0; i < n; ++i) {
+       if ((2 + (args[i] ? strlen (args[i]) : 0) +
+           strlen (locale_alias)) < PATH_MAX) {
+           sprintf (buf, "%s/%s", args[i], locale_alias);
+           name = resolve_name (lc_name, buf, LtoR);
+           if (!name) {
+               if (!nlc_name)
+                   nlc_name = normalize_lcname(lc_name);
+               if (nlc_name)
+                   name = resolve_name (nlc_name, buf, LtoR);
+           }
+       }
+       if (name != NULL) {
+           break;
+       }
+    }
+    if (nlc_name) Xfree(nlc_name);
+
+    if (name == NULL) {
+       /* vendor locale name == Xlocale name, no expansion of alias */
+       pub->siname = strdup (lc_name);
+    } else {
+       pub->siname = name;
+    }
+
+    sinamelen = strlen (pub->siname);
+    if (sinamelen == 1 && pub->siname[0] == 'C') {
+       pub->language = pub->siname;
+       pub->territory = pub->codeset = NULL;
+       return 1;
+    }
+
+    /*
+     * pub->siname is in the format <lang>_<terr>.<codeset>, typical would
+     * be "en_US.ISO8859-1", "en_US.utf8", "ru_RU.KOI-8", or ja_JP.SJIS,
+     * although it could be ja.SJIS too.
+     */
+    tmp_siname = Xrealloc (pub->siname, 2 * (sinamelen + 1));
+    if (tmp_siname == NULL) {
+       return 0;
+    }
+    pub->siname = tmp_siname;
+
+    /* language */
+    dst = &pub->siname[sinamelen + 1];
+    strcpy (dst, pub->siname);
+    pub->language = dst;
+
+    /* territory */
+    dst = strchr (dst, '_');
+    if (dst) {
+       *dst = '\0';
+       pub->territory = ++dst;
+    } else
+       dst = &pub->siname[sinamelen + 1];
+
+    /* codeset */
+    dst = strchr (dst, '.');
+    if (dst) {
+       *dst = '\0';
+       pub->codeset = ++dst;
+    }
+
+    return (pub->siname[0] != '\0') ? 1 : 0;
+}
+
+/************************************************************************/
+int
+_XlcResolveI18NPath(char *buf, int buf_len)
+{
+    if (buf != NULL) {
+       xlocaledir(buf, buf_len);
+    }
+    return 1;
+}
+
+char *
+_XlcLocaleDirName(char *dir_name, size_t dir_len, char *lc_name)
+{
+    char dir[PATH_MAX], buf[PATH_MAX], *name = NULL;
+    int i, n;
+    char *args[NUM_LOCALEDIR];
+    static char locale_alias[] = LOCALE_ALIAS;
+    char *target_name = (char*)0;
+    char *target_dir = (char*)0;
+    char *nlc_name = NULL;
+    static char*  last_dir_name = 0;
+    static size_t last_dir_len = 0;
+    static char*  last_lc_name = 0;
+
+    if (last_lc_name != 0 && strcmp (last_lc_name, lc_name) == 0
+       && dir_len >= last_dir_len) {
+        strcpy (dir_name, last_dir_name);
+        return dir_name;
+    }
+
+    xlocaledir (dir, PATH_MAX);
+    n = _XlcParsePath(dir, args, 256);
+    for (i = 0; i < n; ++i) {
+
+       if ((2 + (args[i] ? strlen(args[i]) : 0) +
+            strlen(locale_alias)) < PATH_MAX) {
+           sprintf (buf, "%s/%s", args[i], locale_alias);
+           name = resolve_name(lc_name, buf, LtoR);
+           if (!name) {
+               if (!nlc_name)
+                   nlc_name = normalize_lcname(lc_name);
+               if (nlc_name)
+                   name = resolve_name (nlc_name, buf, LtoR);
+           }
+       }
+
+       /* If name is not an alias, use lc_name for locale.dir search */
+       if (name == NULL)
+           name = lc_name;
+
+       /* look at locale.dir */
+
+       target_dir = args[i];
+       if (!target_dir) {
+           /* something wrong */
+           if (name != lc_name)
+               Xfree(name);
+           continue;
+       }
+       if ((1 + strlen (target_dir) + strlen("locale.dir")) < PATH_MAX) {
+           sprintf(buf, "%s/locale.dir", target_dir);
+           target_name = resolve_name(name, buf, RtoL);
+       }
+       if (name != lc_name)
+           Xfree(name);
+       if (target_name != NULL) {
+           char *p = 0;
+           if ((p = strstr(target_name, "/XLC_LOCALE"))) {
+               *p = '\0';
+               break;
+           }
+           Xfree(target_name);
+           target_name = NULL;
+       }
+       name = NULL;
+    }
+    if (nlc_name) Xfree(nlc_name);
+
+    if (target_name == NULL) {
+       /* vendor locale name == Xlocale name, no expansion of alias */
+       target_dir = args[0];
+       target_name = lc_name;
+    }
+    /* snprintf(dir_name, dir_len, "%s/%", target_dir, target_name); */
+    strncpy(dir_name, target_dir, dir_len - 1);
+    if (strlen(target_dir) >= dir_len - 1) {
+       dir_name[dir_len - 1] = '\0';
+    } else  {
+       strcat(dir_name, "/");
+       strncat(dir_name, target_name, dir_len - strlen(dir_name) - 1);
+       if (strlen(target_name) >= dir_len - strlen(dir_name) - 1)
+           dir_name[dir_len - 1] = '\0';
+    }
+    if (target_name != lc_name)
+       Xfree(target_name);
+
+    if (last_dir_name != 0)
+       Xfree (last_dir_name);
+    if (last_lc_name != 0)
+       Xfree (last_lc_name);
+    last_dir_len = strlen (dir_name) + 1;
+    last_dir_name = Xmalloc (last_dir_len);
+    strcpy (last_dir_name, dir_name);
+    last_lc_name = strdup (lc_name);
+
+    return dir_name;
+}
+
+char *
+_XlcLocaleLibDirName(char *dir_name, size_t dir_len, char *lc_name)
+{
+    char dir[PATH_MAX], buf[PATH_MAX], *name = NULL;
+    int i, n;
+    char *args[NUM_LOCALEDIR];
+    static char locale_alias[] = LOCALE_ALIAS;
+    char *target_name = (char*)0;
+    char *target_dir = (char*)0;
+    char *nlc_name = NULL;
+    static char*  last_dir_name = 0;
+    static size_t last_dir_len = 0;
+    static char*  last_lc_name = 0;
+
+    if (last_lc_name != 0 && strcmp (last_lc_name, lc_name) == 0
+       && dir_len >= last_dir_len) {
+       strcpy (dir_name, last_dir_name);
+       return dir_name;
+    }
+
+    xlocalelibdir (dir, PATH_MAX);
+    n = _XlcParsePath(dir, args, 256);
+    for (i = 0; i < n; ++i) {
+
+       if ((2 + (args[i] ? strlen(args[i]) : 0) +
+            strlen(locale_alias)) < PATH_MAX) {
+           sprintf (buf, "%s/%s", args[i], locale_alias);
+           name = resolve_name(lc_name, buf, LtoR);
+           if (!name) {
+               if (!nlc_name)
+                   nlc_name = normalize_lcname(lc_name);
+               if (nlc_name)
+                   name = resolve_name (nlc_name, buf, LtoR);
+           }
+       }
+
+       /* If name is not an alias, use lc_name for locale.dir search */
+       if (name == NULL)
+           name = lc_name;
+
+       /* look at locale.dir */
+
+       target_dir = args[i];
+       if (!target_dir) {
+           /* something wrong */
+           if (name != lc_name)
+               Xfree(name);
+           continue;
+       }
+       if ((1 + strlen (target_dir) + strlen("locale.dir")) < PATH_MAX) {
+           sprintf(buf, "%s/locale.dir", target_dir);
+           target_name = resolve_name(name, buf, RtoL);
+       }
+       if (name != lc_name)
+           Xfree(name);
+       if (target_name != NULL) {
+           char *p = 0;
+           if ((p = strstr(target_name, "/XLC_LOCALE"))) {
+               *p = '\0';
+               break;
+           }
+           Xfree(target_name);
+           target_name = NULL;
+       }
+       name = NULL;
+    }
+    if (nlc_name) Xfree(nlc_name);
+
+    if (target_name == NULL) {
+       /* vendor locale name == Xlocale name, no expansion of alias */
+       target_dir = args[0];
+       target_name = lc_name;
+    }
+    /* snprintf(dir_name, dir_len, "%s/%", target_dir, target_name); */
+    strncpy(dir_name, target_dir, dir_len - 1);
+    if (strlen(target_dir) >= dir_len - 1) {
+       dir_name[dir_len - 1] = '\0';
+    } else  {
+       strcat(dir_name, "/");
+       strncat(dir_name, target_name, dir_len - strlen(dir_name) - 1);
+       if (strlen(target_name) >= dir_len - strlen(dir_name) - 1)
+           dir_name[dir_len - 1] = '\0';
+    }
+    if (target_name != lc_name)
+       Xfree(target_name);
+
+    if (last_dir_name != 0)
+       Xfree (last_dir_name);
+    if (last_lc_name != 0)
+       Xfree (last_lc_name);
+    last_dir_len = strlen (dir_name) + 1;
+    last_dir_name = Xmalloc (last_dir_len);
+    strcpy (last_dir_name, dir_name);
+    last_lc_name = strdup (lc_name);
+
+    return dir_name;
+}
diff --git a/src/xlibi18n/lcGeneric.c b/src/xlibi18n/lcGeneric.c
new file mode 100644 (file)
index 0000000..619cb47
--- /dev/null
@@ -0,0 +1,1180 @@
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * 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 TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA 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.
+ *
+ * Author: Katsuhisa Yano      TOSHIBA Corp.
+ *                             mopi@osa.ilab.toshiba.co.jp
+ */
+/*
+ *  (c) Copyright 1995 FUJITSU LIMITED
+ *  This is source code modified by FUJITSU LIMITED under the Joint
+ *  Development Agreement for the CDE/Motif PST.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include "Xlibint.h"
+#include "XlcGeneric.h"
+
+static XLCd create (const char *name, XLCdMethods methods);
+static Bool initialize (XLCd lcd);
+static void destroy (XLCd lcd);
+
+static XLCdPublicMethodsRec genericMethods = {
+    { NULL },                   /* use default methods */
+    {
+       NULL,
+       create,
+       initialize,
+       destroy,
+       NULL
+    }
+};
+
+XLCdMethods _XlcGenericMethods = (XLCdMethods) &genericMethods;
+
+static XLCd
+create(
+    const char *name,
+    XLCdMethods methods)
+{
+    XLCd lcd;
+    XLCdPublicMethods new;
+
+    lcd = Xcalloc(1, sizeof(XLCdRec));
+    if (lcd == NULL)
+        return (XLCd) NULL;
+
+    lcd->core = Xcalloc(1, sizeof(XLCdGenericRec));
+    if (lcd->core == NULL)
+       goto err;
+
+    new = (XLCdPublicMethods) Xmalloc(sizeof(XLCdPublicMethodsRec));
+    if (new == NULL)
+       goto err;
+    memcpy(new,methods,sizeof(XLCdPublicMethodsRec));
+    lcd->methods = (XLCdMethods) new;
+
+    return lcd;
+
+err:
+    Xfree(lcd);
+    return (XLCd) NULL;
+}
+
+static Bool
+string_to_encoding(
+    const char *str,
+    char *encoding)
+{
+    char *next;
+    long value;
+    int base;
+
+    while (*str) {
+       if (*str == '\\') {
+           switch (*(str + 1)) {
+               case 'x':
+               case 'X':
+                   base = 16;
+                   break;
+               default:
+                   base = 8;
+                   break;
+           }
+           value = strtol(str + 2, &next, base);
+           if (str + 2 != next) {
+               *((unsigned char *) encoding++) = (unsigned char) value;
+               str = next;
+               continue;
+           }
+       }
+       *encoding++ = *str++;
+    }
+
+    *encoding = '\0';
+
+    return True;
+}
+
+static Bool
+string_to_ulong(
+    const char *str,
+    unsigned long *value)
+{
+     const char *tmp1 = str;
+     int base;
+
+     if (*tmp1++ != '\\') {
+         tmp1--;
+         base = 10;
+     } else {
+         switch (*tmp1++) {
+         case 'x':
+              base = 16;
+              break;
+         case 'o':
+              base = 8;
+              break;
+         case 'd':
+              base = 10;
+              break;
+         default:
+              return(False);
+         }
+     }
+     *value = (unsigned long) strtol(tmp1, NULL, base);
+     return(True);
+}
+
+
+static Bool
+add_charset(
+    CodeSet codeset,
+    XlcCharSet charset)
+{
+    XlcCharSet *new_list;
+    int num;
+
+    if ((num = codeset->num_charsets))
+        new_list = (XlcCharSet *) Xrealloc(codeset->charset_list,
+                                        (num + 1) * sizeof(XlcCharSet));
+    else
+        new_list = (XlcCharSet *) Xmalloc(sizeof(XlcCharSet));
+
+    if (new_list == NULL)
+       return False;
+
+    new_list[num] = charset;
+    codeset->charset_list = new_list;
+    codeset->num_charsets = num + 1;
+
+    return True;
+}
+
+static CodeSet
+add_codeset(
+    XLCdGenericPart *gen)
+{
+    CodeSet new, *new_list;
+    int num;
+
+    new = Xcalloc(1, sizeof(CodeSetRec));
+    if (new == NULL)
+        return NULL;
+
+    if ((num = gen->codeset_num))
+        new_list = (CodeSet *) Xrealloc(gen->codeset_list,
+                                        (num + 1) * sizeof(CodeSet));
+    else
+        new_list = (CodeSet *) Xmalloc(sizeof(CodeSet));
+
+    if (new_list == NULL)
+        goto err;
+
+    new_list[num] = new;
+    gen->codeset_list = new_list;
+    gen->codeset_num = num + 1;
+
+    return new;
+
+err:
+    Xfree(new);
+
+    return NULL;
+}
+
+static Bool
+add_parse_list(
+    XLCdGenericPart *gen,
+    EncodingType type,
+    const char *encoding,
+    CodeSet codeset)
+{
+    ParseInfo new, *new_list;
+    char *str;
+    unsigned char ch;
+    int num;
+
+    str = strdup(encoding);
+    if (str == NULL)
+        return False;
+
+    new = Xcalloc(1, sizeof(ParseInfoRec));
+    if (new == NULL)
+        goto err;
+
+    if (gen->mb_parse_table == NULL) {
+        gen->mb_parse_table = Xcalloc(1, 256); /* 2^8 */
+        if (gen->mb_parse_table == NULL)
+            goto err;
+    }
+
+    if ((num = gen->mb_parse_list_num))
+        new_list = (ParseInfo *) Xrealloc(gen->mb_parse_list,
+                                          (num + 2) * sizeof(ParseInfo));
+    else {
+        new_list = (ParseInfo *) Xmalloc(2 * sizeof(ParseInfo));
+    }
+
+    if (new_list == NULL)
+        goto err;
+
+    new_list[num] = new;
+    new_list[num + 1] = NULL;
+    gen->mb_parse_list = new_list;
+    gen->mb_parse_list_num = num + 1;
+
+    ch = (unsigned char) *str;
+    if (gen->mb_parse_table[ch] == 0)
+        gen->mb_parse_table[ch] = num + 1;
+
+    new->type = type;
+    new->encoding = str;
+    new->codeset = codeset;
+
+    if (codeset->parse_info == NULL)
+        codeset->parse_info = new;
+
+    return True;
+
+err:
+    Xfree(str);
+    if (new)
+        Xfree(new);
+
+    return False;
+}
+
+static void
+free_charset(
+    XLCd lcd)
+{
+    XLCdGenericPart *gen = XLC_GENERIC_PART(lcd);
+    ParseInfo *parse_info;
+    int num;
+
+    if (gen->mb_parse_table)
+        Xfree(gen->mb_parse_table);
+    if ((num = gen->mb_parse_list_num) > 0) {
+        for (parse_info = gen->mb_parse_list; num-- > 0; parse_info++) {
+            if ((*parse_info)->encoding)
+                Xfree((*parse_info)->encoding);
+            Xfree(*parse_info);
+        }
+        Xfree(gen->mb_parse_list);
+    }
+
+    if ((num = gen->codeset_num) > 0)
+        Xfree(gen->codeset_list);
+}
+
+/* For VW/UDC */
+
+#define FORWARD  (unsigned long)'+'
+#define BACKWARD (unsigned long)'-'
+
+static const char *
+getscope(
+    const char *str,
+    FontScope scp)
+{
+    unsigned long start = 0;
+    unsigned long end = 0;
+    unsigned long dest = 0;
+    unsigned long shift = 0;
+    unsigned long direction = 0;
+    sscanf(str,"[\\x%lx,\\x%lx]->\\x%lx", &start, &end, &dest);
+    if (dest) {
+        if (dest >= start) {
+            shift = dest - start;
+            direction = FORWARD ;
+        } else {
+            shift = start - dest;
+            direction = BACKWARD;
+        }
+    }
+    scp->start = start      ;
+    scp->end   = end        ;
+    scp->shift = shift      ;
+    scp->shift_direction
+               = direction  ;
+    /* .......... */
+    while (*str) {
+        if (*str == ',' && *(str+1) == '[')
+            break;
+        str++;
+    }
+    return str+1;
+}
+
+static int
+count_scopemap(
+    const char *str)
+{
+    const char *ptr;
+    int num=0;
+    for (ptr=str; *ptr; ptr++) {
+        if (*ptr == ']') {
+            num++;
+        }
+    }
+    return num;
+}
+
+FontScope
+_XlcParse_scopemaps(
+    const char *str,
+    int *size)
+{
+    int num=0,i;
+    FontScope scope,sc_ptr;
+    const char *str_sc;
+
+    num = count_scopemap(str);
+    scope = (FontScope) Xmalloc(num * sizeof(FontScopeRec));
+    if (scope == NULL)
+       return NULL;
+
+    for (i=0, str_sc=str, sc_ptr=scope; i < num; i++, sc_ptr++) {
+       str_sc = getscope(str_sc, sc_ptr);
+    }
+    *size = num;
+    return scope;
+}
+
+void
+_XlcDbg_printValue(
+    const char *str,
+    char **value,
+    int num)
+{
+/*
+    int i;
+    for (i = 0; i < num; i++)
+        fprintf(stderr, "%s value[%d] = %s\n", str, i, value[i]);
+*/
+}
+
+static void
+dmpscope(
+    const char* name,
+    FontScope sc,
+    int num)
+{
+/*
+    int i;
+    fprintf(stderr, "dmpscope %s\n", name);
+    for (i=0; i<num; i++)
+        fprintf(stderr,"%x %x %x %x \n",
+                sc[i].start,
+                sc[i].end,
+                sc[i].shift,
+                sc[i].shift_direction);
+    fprintf(stderr, "dmpscope end\n");
+*/
+}
+
+static XlcCharSet
+srch_charset_define(
+    const char *name,
+    int *new)
+{
+    XlcCharSet charset;
+
+    *new = 0;
+    charset = _XlcGetCharSet(name);
+    if (charset == NULL &&
+        (charset = _XlcCreateDefaultCharSet(name, ""))) {
+        _XlcAddCharSet(charset);
+        *new = 1;
+        charset->source = CSsrcXLC;
+    }
+    return charset;
+}
+
+static void
+read_charset_define(
+    XLCd lcd,
+    XLCdGenericPart *gen)
+{
+    int i;
+    char csd[16], cset_name[256];
+    char name[BUFSIZ];
+    XlcCharSet charsetd;
+    char **value;
+    int num, new = 0;
+    XlcSide side = XlcUnknown;
+    char *tmp;
+
+    for (i=0; ; i++) { /* loop start */
+        charsetd = 0;
+        sprintf(csd, "csd%d", i);
+
+        /* charset_name  */
+        sprintf(name, "%s.%s", csd, "charset_name");
+        _XlcGetResource(lcd, "XLC_CHARSET_DEFINE", name, &value, &num);
+        _XlcDbg_printValue(name,value,num);
+        if (num > 0) {
+           /* hackers will get truncated -- C'est la vie */
+            strncpy(cset_name,value[0], sizeof cset_name - 1);
+           cset_name[(sizeof cset_name) - 1] = '\0';
+            sprintf(name, "%s.%s", csd , "side");
+            _XlcGetResource(lcd, "XLC_CHARSET_DEFINE", name, &value, &num);
+            if (num > 0) {
+                _XlcDbg_printValue(name,value,num);
+                if (!_XlcNCompareISOLatin1(value[0], "none", 4)) {
+                    side =  XlcGLGR;
+                } else if (!_XlcNCompareISOLatin1(value[0], "GL", 2)) {
+                    side =  XlcGL;
+                    strcat(cset_name,":GL");
+                } else {
+                    side =  XlcGR;
+                    strcat(cset_name,":GR");
+                }
+                if (charsetd == NULL &&
+                    (charsetd = srch_charset_define(cset_name,&new)) == NULL)
+                    return;
+            }
+        } else {
+            if (i == 0)
+                continue;
+            else
+                break;
+        }
+        if (new) {
+            tmp = strdup(cset_name);
+            if (tmp == NULL)
+                return;
+            charsetd->name = tmp;
+        }
+        /* side   */
+        charsetd->side = side ;
+        /* length */
+        sprintf(name, "%s.%s", csd, "length");
+        _XlcGetResource(lcd, "XLC_CHARSET_DEFINE", name, &value, &num);
+        if (num > 0) {
+            _XlcDbg_printValue(name,value,num);
+            charsetd->char_size = atoi(value[0]);
+        }
+        /* gc_number */
+        sprintf(name, "%s.%s", csd, "gc_number");
+        _XlcGetResource(lcd, "XLC_CHARSET_DEFINE", name, &value, &num);
+        if (num > 0) {
+            _XlcDbg_printValue(name,value,num);
+            charsetd->set_size = atoi(value[0]);
+        }
+        /* string_encoding */
+        sprintf(name, "%s.%s", csd, "string_encoding");
+        _XlcGetResource(lcd, "XLC_CHARSET_DEFINE", name, &value, &num);
+        if (num > 0) {
+            _XlcDbg_printValue(name,value,num);
+            if (!strcmp("False",value[0])) {
+                charsetd->string_encoding = False;
+            } else {
+                charsetd->string_encoding = True;
+            }
+        }
+        /* sequence */
+        sprintf(name, "%s.%s", csd, "sequence");
+        _XlcGetResource(lcd, "XLC_CHARSET_DEFINE", name, &value, &num);
+        if (num > 0) {
+            _XlcDbg_printValue(name,value,num);
+/*
+            if (charsetd->ct_sequence) {
+                Xfree(charsetd->ct_sequence);
+            }
+*/
+            tmp = (char *)Xmalloc(strlen(value[0])+1);
+            if (tmp == NULL)
+                return;
+            charsetd->ct_sequence = tmp;
+            string_to_encoding(value[0],tmp);
+        }
+        /* encoding_name */
+        sprintf(name, "%s.%s", csd, "encoding_name");
+        _XlcGetResource(lcd, "XLC_CHARSET_DEFINE", name, &value, &num);
+        if (num > 0) {
+            _XlcDbg_printValue(name,value,num);
+/*
+            if (charsetd->encoding_name) {
+                Xfree(charsetd->encoding_name);
+            }
+*/
+            tmp = strdup(value[0]);
+            charsetd->encoding_name = tmp;
+            charsetd->xrm_encoding_name = XrmStringToQuark(tmp);
+        }
+        _XlcAddCT(charsetd->name, charsetd->ct_sequence);
+    }
+}
+
+static SegConv
+add_conversion(
+    XLCdGenericPart *gen)
+{
+    SegConv new_list;
+    int num;
+
+    if ((num = gen->segment_conv_num) > 0) {
+        new_list = (SegConv) Xrealloc(gen->segment_conv,
+                                        (num + 1) * sizeof(SegConvRec));
+    } else {
+        new_list = (SegConv) Xmalloc(sizeof(SegConvRec));
+    }
+
+    if (new_list == NULL)
+        return NULL;
+
+    gen->segment_conv = new_list;
+    gen->segment_conv_num = num + 1;
+
+    return &new_list[num];
+
+}
+
+static void
+read_segmentconversion(
+    XLCd lcd,
+    XLCdGenericPart *gen)
+{
+    int i;
+    char conv[16];
+    char name[BUFSIZ];
+    char **value;
+    int num,new;
+    SegConv conversion;
+    for (i=0 ; ; i++) { /* loop start */
+        conversion = 0;
+        sprintf(conv, "conv%d", i);
+
+        /* length                */
+        sprintf(name, "%s.%s", conv, "length");
+        _XlcGetResource(lcd, "XLC_SEGMENTCONVERSION", name, &value, &num);
+        if (num > 0) {
+            if (conversion == NULL &&
+                (conversion = add_conversion(gen)) == NULL) {
+                return;
+            }
+            _XlcDbg_printValue(name,value,num);
+        } else {
+            if (i == 0)
+                continue;
+            else
+                break;
+        }
+        conversion->length = atoi(value[0]);
+
+        /* source_encoding       */
+        sprintf(name, "%s.%s", conv, "source_encoding");
+        _XlcGetResource(lcd, "XLC_SEGMENTCONVERSION", name, &value, &num);
+        if (num > 0) {
+            char *tmp;
+            _XlcDbg_printValue(name,value,num);
+            tmp = strdup(value[0]);
+            if (tmp == NULL)
+                return;
+            conversion->source_encoding = tmp;
+            conversion->source = srch_charset_define(tmp,&new);
+        }
+        /* destination_encoding  */
+        sprintf(name, "%s.%s", conv, "destination_encoding");
+        _XlcGetResource(lcd, "XLC_SEGMENTCONVERSION", name, &value, &num);
+        if (num > 0) {
+            char *tmp;
+            _XlcDbg_printValue(name,value,num);
+            tmp = strdup(value[0]);
+            if (tmp == NULL)
+                return;
+            conversion->destination_encoding = tmp;
+            conversion->dest = srch_charset_define(tmp,&new);
+        }
+        /* range                 */
+        sprintf(name, "%s.%s", conv, "range");
+        _XlcGetResource(lcd, "XLC_SEGMENTCONVERSION", name, &value, &num);
+        if (num > 0) {
+            _XlcDbg_printValue(name,value,num);
+            sscanf(value[0],"\\x%lx,\\x%lx",
+                   &(conversion->range.start), &(conversion->range.end));
+        }
+        /* conversion            */
+        sprintf(name, "%s.%s", conv, "conversion");
+        _XlcGetResource(lcd, "XLC_SEGMENTCONVERSION", name, &value, &num);
+        if (num > 0) {
+            _XlcDbg_printValue(name,value,num);
+            conversion->conv =
+                _XlcParse_scopemaps(value[0],&conversion->conv_num);
+        }
+    }  /* loop end */
+}
+
+static ExtdSegment
+create_ctextseg(
+    char **value,
+    int num)
+{
+    ExtdSegment ret;
+    char* ptr;
+    char* cset_name = NULL;
+    int i,new;
+    FontScope scope;
+    ret = (ExtdSegment)Xmalloc(sizeof(ExtdSegmentRec));
+    if (ret == NULL)
+        return NULL;
+    ret->name = strdup(value[0]);
+    if (ret->name == NULL) {
+        Xfree (ret);
+        return NULL;
+    }
+    cset_name = (char*) Xmalloc (strlen(ret->name) + 1);
+    if (cset_name == NULL) {
+        Xfree (ret->name);
+        Xfree (ret);
+        return NULL;
+    }
+    if (strchr(value[0],':')) {
+        ptr = strchr(ret->name,':');
+        *ptr = '\0';
+        ptr++;
+        if (!_XlcNCompareISOLatin1(ptr, "GL", 2)) {
+            ret->side =  XlcGL;
+            sprintf(cset_name,"%s:%s",ret->name,"GL");
+        } else {
+            ret->side =  XlcGR;
+            sprintf(cset_name,"%s:%s",ret->name,"GR");
+        }
+    } else {
+        ret->side =  XlcGLGR;
+        strcpy(cset_name,ret->name);
+    }
+    ret->area = (FontScope)Xmalloc((num - 1)*sizeof(FontScopeRec));
+    if (ret->area == NULL) {
+       Xfree (cset_name);
+       Xfree (ret->name);
+       Xfree (ret);
+        return NULL;
+    }
+    ret->area_num = num - 1;
+    scope = ret->area ;
+    for (i = 1; i < num; i++) {
+        sscanf(value[i],"\\x%lx,\\x%lx",
+               &scope[i-1].start, &scope[i-1].end);
+    }
+    ret->charset = srch_charset_define(cset_name,&new);
+    Xfree (cset_name);
+
+    return ret;
+}
+/* For VW/UDC end */
+
+static Bool
+load_generic(
+    XLCd lcd)
+{
+    XLCdGenericPart *gen = XLC_GENERIC_PART(lcd);
+    char **value;
+    int num;
+    unsigned long l;
+    int i;
+    int M,ii;
+    XlcCharSet charset;
+
+    gen->codeset_num = 0;
+
+    /***** wc_encoding_mask *****/
+    _XlcGetResource(lcd, "XLC_XLOCALE", "wc_encoding_mask", &value, &num);
+    if (num > 0) {
+       if (string_to_ulong(value[0], &l) == False)
+           goto err;
+       gen->wc_encode_mask = l;
+    }
+    /***** wc_shift_bits *****/
+    _XlcGetResource(lcd, "XLC_XLOCALE", "wc_shift_bits", &value, &num);
+    if (num > 0)
+       gen->wc_shift_bits = atoi(value[0]);
+    if (gen->wc_shift_bits < 1)
+       gen->wc_shift_bits = 8;
+    /***** use_stdc_env *****/
+    _XlcGetResource(lcd, "XLC_XLOCALE", "use_stdc_env", &value, &num);
+    if (num > 0 && !_XlcCompareISOLatin1(value[0], "True"))
+       gen->use_stdc_env = True;
+    else
+       gen->use_stdc_env = False;
+    /***** force_convert_to_mb *****/
+    _XlcGetResource(lcd, "XLC_XLOCALE", "force_convert_to_mb", &value, &num);
+    if (num > 0 && !_XlcCompareISOLatin1(value[0], "True"))
+       gen->force_convert_to_mb = True;
+    else
+       gen->force_convert_to_mb = False;
+
+    for (i = 0; ; i++) {
+       CodeSetRec *codeset = NULL;
+       char cs[16];
+       char name[BUFSIZ];
+
+       sprintf(cs, "cs%d", i);
+
+       /***** codeset.side *****/
+       sprintf(name, "%s.%s", cs , "side");
+       _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
+       if (num > 0) {
+           char *tmp;
+
+           if (codeset == NULL && (codeset = add_codeset(gen)) == NULL)
+               goto err;
+
+            /* 3.4.1 side */
+            if (!_XlcNCompareISOLatin1(value[0], "none", 4)) {
+                codeset->side =  XlcNONE;
+            } else if (!_XlcNCompareISOLatin1(value[0], "GL", 2)) {
+                codeset->side =  XlcGL;
+            } else {
+                codeset->side =  XlcGR;
+            }
+
+           tmp = strrchr(value[0], ':');
+           if (tmp != NULL && !_XlcCompareISOLatin1(tmp + 1, "Default")) {
+               if (codeset->side == XlcGR)
+                   gen->initial_state_GR = codeset;
+               else
+                   gen->initial_state_GL = codeset;
+           }
+       }
+
+       /***** codeset.length *****/
+       sprintf(name, "%s.%s", cs , "length");
+       _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
+       if (num > 0) {
+           if (codeset == NULL && (codeset = add_codeset(gen)) == NULL)
+               goto err;
+           codeset->length = atoi(value[0]);
+           if (codeset->length < 1)
+               codeset->length = 1;
+       }
+
+       /***** codeset.mb_encoding *****/
+       sprintf(name, "%s.%s", cs, "mb_encoding");
+       _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
+       if (num > 0) {
+           static struct {
+               const char *str;
+               EncodingType type;
+           } shifts[] = {
+               {"<SS>", E_SS},
+               {"<LSL>", E_LSL},
+               {"<LSR>", E_LSR},
+               {0}
+           };
+           int j;
+
+           if (codeset == NULL && (codeset = add_codeset(gen)) == NULL)
+               goto err;
+           for ( ; num-- > 0; value++) {
+               char encoding[256];
+               char *tmp = *value;
+               EncodingType type = E_SS;    /* for BC */
+               for (j = 0; shifts[j].str; j++) {
+                   if (!_XlcNCompareISOLatin1(tmp, shifts[j].str,
+                                              strlen(shifts[j].str))) {
+                       type = shifts[j].type;
+                       tmp += strlen(shifts[j].str);
+                       break;
+                   }
+               }
+               if (strlen (tmp) > sizeof encoding ||
+                   string_to_encoding(tmp, encoding) == False)
+                       goto err;
+               add_parse_list(gen, type, encoding, codeset);
+           }
+       }
+
+       /***** codeset.wc_encoding *****/
+       sprintf(name, "%s.%s", cs, "wc_encoding");
+       _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
+       if (num > 0) {
+           if (codeset == NULL && (codeset = add_codeset(gen)) == NULL)
+               goto err;
+           if (string_to_ulong(value[0], &l) == False)
+               goto err;
+           codeset->wc_encoding = l;
+       }
+
+       /***** codeset.ct_encoding *****/
+       sprintf(name, "%s.%s", cs, "ct_encoding");
+       _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
+       if (num > 0) {
+           char *encoding;
+
+           if (codeset == NULL && (codeset = add_codeset(gen)) == NULL)
+               goto err;
+           for ( ; num-- > 0; value++) {
+               if (strlen (*value) > sizeof name)
+                   goto err;
+               string_to_encoding(*value, name);
+               charset = NULL;
+               if ((encoding = strchr(name, ':')) &&
+                   (encoding = strchr(encoding + 1, ':'))) {
+                   *encoding++ = '\0';
+                   charset = _XlcAddCT(name, encoding);
+               }
+               if (charset == NULL) {
+                   charset = _XlcGetCharSet(name);
+                   if (charset == NULL &&
+                       (charset = _XlcCreateDefaultCharSet(name, ""))) {
+                       charset->side = codeset->side;
+                       charset->char_size = codeset->length;
+                       _XlcAddCharSet(charset);
+                   }
+               }
+               if (charset) {
+                   if (add_charset(codeset, charset) == False)
+                       goto err;
+               }
+           }
+       }
+
+       if (codeset == NULL)
+           break;
+       codeset->cs_num = i;
+        /* For VW/UDC */
+        /***** 3.4.2 byteM (1 <= M <= length)*****/
+        for (M=1; M-1  < codeset->length; M++) {
+            unsigned long start,end;
+            ByteInfo tmpb;
+
+            sprintf(name,"%s.%s%d",cs,"byte",M);
+            _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
+
+            if (M == 1) {
+                if (num < 1) {
+                    codeset->byteM = NULL;
+                    break ;
+                }
+                codeset->byteM =
+                    (ByteInfoListRec *)Xmalloc(
+                         (codeset->length)*sizeof(ByteInfoListRec));
+                if (codeset->byteM == NULL) {
+                    goto err;
+                }
+            }
+
+            if (num > 0) {
+                _XlcDbg_printValue(name,value,num);
+                (codeset->byteM)[M-1].M = M;
+                (codeset->byteM)[M-1].byteinfo_num = num;
+                (codeset->byteM)[M-1].byteinfo =
+                    (ByteInfo)Xmalloc( num * sizeof(ByteInfoRec));
+                for (ii = 0 ; ii < num ; ii++) {
+                    tmpb = (codeset->byteM)[M-1].byteinfo ;
+                    /* default 0x00 - 0xff */
+                    sscanf(value[ii],"\\x%lx,\\x%lx",&start,&end);
+                    tmpb[ii].start = (unsigned char)start;
+                    tmpb[ii].end  = (unsigned char)end;
+                }
+            }
+            /* .... */
+        }
+
+
+        /***** codeset.mb_conversion *****/
+        sprintf(name, "%s.%s", cs, "mb_conversion");
+        _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
+        if (num > 0) {
+                _XlcDbg_printValue(name,value,num);
+                codeset->mbconv = Xmalloc(sizeof(ConversionRec));
+                codeset->mbconv->convlist =
+                _XlcParse_scopemaps(value[0],&(codeset->mbconv->conv_num));
+                dmpscope("mb_conv",codeset->mbconv->convlist,
+                         codeset->mbconv->conv_num);
+                /* [\x%x,\x%x]->\x%x,... */
+        }
+        /***** codeset.ct_conversion *****/
+        sprintf(name, "%s.%s", cs, "ct_conversion");
+        _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
+        if (num > 0) {
+                _XlcDbg_printValue(name,value,num);
+                codeset->ctconv = Xmalloc(sizeof(ConversionRec));
+                codeset->ctconv->convlist =
+                _XlcParse_scopemaps(value[0],&(codeset->ctconv->conv_num));
+                dmpscope("ctconv",codeset->ctconv->convlist,
+                         codeset->ctconv->conv_num);
+                /* [\x%x,\x%x]->\x%x,... */
+        }
+        /***** codeset.ct_conversion_file *****/
+        sprintf(name, "%s.%s", cs, "ct_conversion_file");
+        _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
+        if (num > 0) {
+                _XlcDbg_printValue(name,value,num);
+                /* [\x%x,\x%x]->\x%x,... */
+        }
+        /***** codeset.ct_extended_segment *****/
+        sprintf(name, "%s.%s", cs, "ct_extended_segment");
+        _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
+        if (num > 0) {
+                _XlcDbg_printValue(name,value,num);
+                codeset->ctextseg = create_ctextseg(value,num);
+                /* [\x%x,\x%x]->\x%x,... */
+        }
+        /* For VW/UDC end */
+
+    }
+
+    read_charset_define(lcd,gen);       /* For VW/UDC */
+    read_segmentconversion(lcd,gen);    /* For VW/UDC */
+
+    if (gen->initial_state_GL == NULL) {
+       CodeSetRec *codeset;
+       for (i = 0; i < gen->codeset_num; i++) {
+          codeset = gen->codeset_list[i];
+          if (codeset->side == XlcGL)
+             gen->initial_state_GL = codeset;
+       }
+    }
+
+    if (gen->initial_state_GR == NULL) {
+       CodeSetRec *codeset;
+       for (i = 0; i < gen->codeset_num; i++) {
+          codeset = gen->codeset_list[i];
+          if (codeset->side == XlcGR)
+             gen->initial_state_GR = codeset;
+       }
+    }
+
+    for (i = 0; i < gen->codeset_num; i++) {
+       CodeSetRec *codeset = gen->codeset_list[i];
+       for (ii = 0; ii < codeset->num_charsets; ii++) {
+          charset = codeset->charset_list[ii];
+          if (! strcmp(charset->encoding_name, "ISO8859-1"))
+              charset->string_encoding = True;
+          if ( charset->string_encoding )
+              codeset->string_encoding = True;
+       }
+    }
+    return True;
+
+err:
+    free_charset(lcd);
+
+    return False;
+}
+
+#ifdef USE_DYNAMIC_LC
+/* override the open_om and open_im methods which were set by
+   super_class's initialize method() */
+
+static Bool
+initialize_core(
+    XLCd lcd)
+{
+    _XInitDynamicOM(lcd);
+
+    _XInitDynamicIM(lcd);
+
+    return True;
+}
+#endif
+
+static Bool
+initialize(XLCd lcd)
+{
+    XLCdPublicMethods superclass = (XLCdPublicMethods) _XlcPublicMethods;
+
+    XLC_PUBLIC_METHODS(lcd)->superclass = superclass;
+
+    if (superclass->pub.initialize) {
+       if ((*superclass->pub.initialize)(lcd) == False)
+           return False;
+    }
+
+#ifdef USE_DYNAMIC_LC
+    if (initialize_core(lcd) == False)
+       return False;
+#endif
+
+    if (load_generic(lcd) == False)
+       return False;
+
+    return True;
+}
+
+/* VW/UDC start 95.01.08 */
+static void
+freeByteM(
+    CodeSet codeset)
+{
+    int i;
+    ByteInfoList blst;
+    if (codeset->byteM == NULL) {
+       return ;
+    }
+    blst = codeset->byteM;
+    for (i = 0; i < codeset->length; i++) {
+       if (blst[i].byteinfo) {
+           Xfree(blst[i].byteinfo);
+           blst[i].byteinfo = NULL;
+       }
+    }
+    Xfree(codeset->byteM);
+    codeset->byteM = NULL;
+}
+
+static void
+freeConversion(
+    CodeSet codeset)
+{
+    Conversion mbconv,ctconv;
+    if (codeset->mbconv) {
+       mbconv = codeset->mbconv;
+       /*  ...  */
+       if (mbconv->convlist) {
+           Xfree(mbconv->convlist);
+           mbconv->convlist = NULL;
+       }
+       Xfree(mbconv);
+       codeset->mbconv = NULL;
+    }
+    if (codeset->ctconv) {
+       ctconv = codeset->ctconv;
+       /*  ...  */
+       if (ctconv->convlist) {
+           Xfree(ctconv->convlist);
+           ctconv->convlist = NULL;
+       }
+       Xfree(ctconv);
+       codeset->ctconv = NULL;
+    }
+}
+
+static void
+freeExtdSegment(
+    CodeSet codeset)
+{
+    ExtdSegment ctextseg;
+    if (codeset->ctextseg == NULL) {
+       return;
+    }
+    ctextseg = codeset->ctextseg;
+    if (ctextseg->name) {
+       Xfree(ctextseg->name);
+       ctextseg->name = NULL;
+    }
+    if (ctextseg->area) {
+       Xfree(ctextseg->area);
+       ctextseg->area = NULL;
+    }
+    Xfree(codeset->ctextseg);
+    codeset->ctextseg = NULL;
+}
+
+static void
+freeParseInfo(
+    CodeSet codeset)
+{
+    ParseInfo parse_info;
+    if (codeset->parse_info == NULL) {
+       return;
+    }
+    parse_info = codeset->parse_info;
+    if (parse_info->encoding) {
+       Xfree(parse_info->encoding);
+       parse_info->encoding = NULL;
+    }
+    Xfree(codeset->parse_info);
+    codeset->parse_info = NULL;
+}
+
+static void
+destroy_CodeSetList(
+    XLCdGenericPart *gen)
+{
+    CodeSet *codeset = gen->codeset_list;
+    int i;
+    if (gen->codeset_num == 0) {
+       return;
+    }
+    for (i=0;i<gen->codeset_num;i++) {
+        freeByteM(codeset[i]);
+       freeConversion(codeset[i]);
+       freeExtdSegment(codeset[i]);
+       freeParseInfo(codeset[i]);
+       if (codeset[i]->charset_list) {
+           Xfree(codeset[i]->charset_list);
+           codeset[i]->charset_list = NULL;
+       }
+       Xfree(codeset[i]); codeset[i]=NULL;
+    }
+    Xfree(codeset); gen->codeset_list = NULL;
+}
+
+static void
+destroy_SegConv(
+    XLCdGenericPart *gen)
+{
+    SegConv seg = gen->segment_conv;
+    int i;
+    if (gen->segment_conv_num == 0) {
+       return;
+    }
+    for (i=0;i<gen->segment_conv_num;i++) {
+       if (seg[i].source_encoding) {
+           Xfree(seg[i].source_encoding);
+           seg[i].source_encoding = NULL;
+       }
+       if (seg[i].destination_encoding) {
+           Xfree(seg[i].destination_encoding);
+           seg[i].destination_encoding = NULL;
+       }
+       if (seg[i].conv) {
+           Xfree(seg[i].conv); seg[i].conv = NULL;
+       }
+    }
+    Xfree(seg); gen->segment_conv = NULL;
+}
+
+static void
+destroy_gen(
+    XLCd lcd)
+{
+    XLCdGenericPart *gen = XLC_GENERIC_PART(lcd);
+    destroy_SegConv(gen);
+    destroy_CodeSetList(gen);
+    if (gen->mb_parse_table) {
+       Xfree(gen->mb_parse_table);
+       gen->mb_parse_table = NULL;
+    }
+    if (gen->mb_parse_list) {
+       Xfree(gen->mb_parse_list);
+       gen->mb_parse_list = NULL;
+    }
+}
+/* VW/UDC end 95.01.08 */
+
+static void
+destroy(
+    XLCd lcd)
+{
+    XLCdPublicMethods superclass = XLC_PUBLIC_METHODS(lcd)->superclass;
+
+    destroy_gen(lcd); /* ADD 1996.01.08 */
+    if (superclass && superclass->pub.destroy)
+       (*superclass->pub.destroy)(lcd);
+}
diff --git a/src/xlibi18n/lcInit.c b/src/xlibi18n/lcInit.c
new file mode 100644 (file)
index 0000000..5aaf183
--- /dev/null
@@ -0,0 +1,197 @@
+/*
+Copyright 1985, 1986, 1987, 1991, 1998  The Open Group
+
+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
+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
+EVEN IF ADVISED IN ADVANCE OF THE POSSIBILITY OF SUCH DAMAGES.
+
+
+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 Window System is a trademark of The Open Group
+
+OSF/1, OSF/Motif and Motif are registered trademarks, and OSF, the OSF
+logo, LBX, X Window System, and Xinerama are trademarks of the Open
+Group. All other trademarks and registered trademarks mentioned herein
+are the property of their respective owners. No right, title or
+interest in or to any trademark, service mark, logo or trade name of
+Sun Microsystems, Inc. or its licensors is granted.
+
+*/
+/*
+ * Copyright 2000 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 1992, 1993 by TOSHIBA Corp.
+ *
+ * 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 TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA 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.
+ *
+ * Author: Katsuhisa Yano      TOSHIBA Corp.
+ *                             mopi@osa.ilab.toshiba.co.jp
+ */
+/*
+ *  (c) Copyright 1995 FUJITSU LIMITED
+ *  This is source code modified by FUJITSU LIMITED under the Joint
+ *  Development Agreement for the CDE/Motif PST.
+ *
+ *   Modifier: Masayoshi Shimamura      FUJITSU LIMITED
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xlcint.h"
+
+#ifdef USE_DYNAMIC_LC
+#undef USE_DEFAULT_LOADER
+#undef USE_GENERIC_LOADER
+#undef USE_UTF8_LOADER
+#else
+#define USE_GENERIC_LOADER
+#define USE_DEFAULT_LOADER
+#define USE_UTF8_LOADER
+#ifdef X_LOCALE
+# define USE_EUC_LOADER
+# define USE_SJIS_LOADER
+# define USE_JIS_LOADER
+#endif
+#endif
+
+/*
+ * The _XlcInitLoader function initializes the locale object loader list
+ * with vendor specific manner.
+ */
+
+void
+_XlcInitLoader(void)
+{
+
+#ifdef USE_DYNAMIC_LC
+    _XlcAddLoader(_XlcDynamicLoad, XlcHead);
+#else /* USE_DYNAMIC_LC */
+
+#ifdef USE_GENERIC_LOADER
+    _XlcAddLoader(_XlcGenericLoader, XlcHead);
+#endif
+
+#ifdef USE_DEFAULT_LOADER
+    _XlcAddLoader(_XlcDefaultLoader, XlcHead);
+#endif
+
+#ifdef USE_UTF8_LOADER
+    _XlcAddLoader(_XlcUtf8Loader, XlcHead);
+#endif
+
+#ifdef USE_EUC_LOADER
+    _XlcAddLoader(_XlcEucLoader, XlcHead);
+#endif
+
+#ifdef USE_SJIS_LOADER
+    _XlcAddLoader(_XlcSjisLoader, XlcHead);
+#endif
+
+#ifdef USE_JIS_LOADER
+    _XlcAddLoader(_XlcJisLoader, XlcHead);
+#endif
+
+#ifdef USE_DYNAMIC_LOADER
+    _XlcAddLoader(_XlcDynamicLoader, XlcHead);
+#endif
+
+#endif /* USE_DYNAMIC_LC */
+}
+
+void
+_XlcDeInitLoader(void)
+{
+
+#ifdef USE_DYNAMIC_LC
+    _XlcRemoveLoader(_XlcDynamicLoad);
+#else /* USE_DYNAMIC_LC */
+
+#ifdef USE_GENERIC_LOADER
+    _XlcRemoveLoader(_XlcGenericLoader);
+#endif
+
+#ifdef USE_DEFAULT_LOADER
+    _XlcRemoveLoader(_XlcDefaultLoader);
+#endif
+
+#ifdef USE_UTF8_LOADER
+    _XlcRemoveLoader(_XlcUtf8Loader);
+#endif
+
+#ifdef USE_EUC_LOADER
+    _XlcRemoveLoader(_XlcEucLoader);
+#endif
+
+#ifdef USE_SJIS_LOADER
+   _XlcRemoveLoader(_XlcSjisLoader);
+#endif
+
+#ifdef USE_JIS_LOADER
+    _XlcRemoveLoader(_XlcJisLoader);
+#endif
+
+#ifdef USE_DYNAMIC_LOADER
+    _XlcRemoveLoader(_XlcDynamicLoader);
+#endif
+
+#endif /* USE_DYNAMIC_LC */
+}
diff --git a/src/xlibi18n/lcPrTxt.c b/src/xlibi18n/lcPrTxt.c
new file mode 100644 (file)
index 0000000..1b7627c
--- /dev/null
@@ -0,0 +1,290 @@
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * 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 TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA 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.
+ *
+ * Author: Katsuhisa Yano      TOSHIBA Corp.
+ *                             mopi@osa.ilab.toshiba.co.jp
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XlcPubI.h"
+#include <X11/Xutil.h>
+#include <X11/Xatom.h>
+
+static XPointer *
+alloc_list(
+    Bool is_wide_char,
+    int count,
+    int nitems)
+{
+    if (is_wide_char) {
+       wchar_t **wstr_list;
+
+       wstr_list = (wchar_t **) Xmalloc(count * sizeof(wchar_t *));
+       if (wstr_list == NULL)
+           return (XPointer *) NULL;
+
+       *wstr_list = (wchar_t *) Xmalloc(nitems * sizeof(wchar_t));
+       if (*wstr_list == NULL) {
+           Xfree(wstr_list);
+           return (XPointer *) NULL;
+       }
+
+       return (XPointer *) wstr_list;
+    } else {
+       char **str_list;
+
+       str_list = (char **) Xmalloc(count * sizeof(char *));
+       if (str_list == NULL)
+           return (XPointer *) NULL;
+
+       *str_list = (char *) Xmalloc(nitems);
+       if (*str_list == NULL) {
+           Xfree(str_list);
+           return (XPointer *) NULL;
+       }
+
+       return (XPointer *) str_list;
+    }
+}
+
+static void
+copy_list(
+    Bool is_wide_char,
+    XPointer text,
+    XPointer *list,
+    int count)
+{
+    int length;
+
+    if (is_wide_char) {
+       wchar_t *wc_text, *wstr, **wstr_list;
+
+       wc_text = (wchar_t *) text;
+       wstr_list = (wchar_t **) list;
+
+       for (wstr = *wstr_list; count > 0; count--, wstr_list++) {
+           _Xwcscpy(wstr, wc_text);
+           *wstr_list = wstr;
+           length = _Xwcslen(wstr) + 1;
+           wstr += length;
+           wc_text += length;
+       }
+    } else {
+       char *mb_text, *str, **str_list;
+
+       mb_text = (char *) text;
+       str_list = (char **) list;
+
+       for (str = *str_list; count > 0; count--, str_list++) {
+           strcpy(str, mb_text);
+           *str_list = str;
+           length = strlen(str) + 1;
+           str += length;
+           mb_text += length;
+       }
+    }
+}
+
+static int
+_XTextPropertyToTextList(
+    XLCd lcd,
+    Display *dpy,
+    const XTextProperty *text_prop,
+    const char *to_type,
+    XPointer **list_ret,
+    int *count_ret)
+{
+    XlcConv conv = NULL;
+    const char *from_type;
+    XPointer from, to, buf;
+    char *str_ptr, *last_ptr;
+    Atom encoding;
+    int from_left, to_left, buf_len, ret, len;
+    int unconv_num, nitems = text_prop->nitems;
+    Bool is_wide_char = False, do_strcpy = False;
+
+    if (strcmp(XlcNWideChar, to_type) == 0)
+       is_wide_char = True;
+
+    if (nitems <= 0) {
+       *list_ret = NULL;
+       *count_ret = 0;
+       return Success;
+    }
+
+    if (text_prop->format != 8)
+       return XConverterNotFound;
+
+    encoding = text_prop->encoding;
+    if (encoding == XA_STRING)
+       from_type = XlcNString;
+    else if (encoding == XInternAtom(dpy, "UTF8_STRING", False))
+       from_type = XlcNUtf8String;
+    else if (encoding == XInternAtom(dpy, "COMPOUND_TEXT", False))
+       from_type = XlcNCompoundText;
+    else if (encoding == XInternAtom(dpy, XLC_PUBLIC(lcd, encoding_name), False))
+       from_type = XlcNMultiByte;
+    else
+       return XConverterNotFound;
+
+    if (is_wide_char) {
+       buf_len = (text_prop->nitems + 1) * sizeof(wchar_t);;
+    } else {
+       if (strcmp(to_type, XlcNUtf8String) == 0)
+           buf_len = text_prop->nitems * 6 + 1;
+       else
+           buf_len = text_prop->nitems * XLC_PUBLIC(lcd, mb_cur_max) + 1;
+    }
+    buf = (XPointer) Xmalloc(buf_len);
+    if (buf == NULL)
+       return XNoMemory;
+    to = buf;
+    to_left = buf_len;
+
+    /* can be XlcNMultiByte to XlcNMultiByte,
+       or XlcNUtf8String to XlcNUtf8String */
+    if (!strcmp(from_type, to_type)) {
+        do_strcpy = True;
+    } else {
+        conv = _XlcOpenConverter(lcd, from_type, lcd, to_type);
+        if (conv == NULL) {
+           Xfree(buf);
+           return XConverterNotFound;
+        }
+    }
+
+    last_ptr = str_ptr = (char *) text_prop->value;
+    unconv_num = *count_ret = 0;
+
+    while (1) {
+       if (nitems == 0 || *str_ptr == 0) {
+           from = (XPointer) last_ptr;
+           from_left = str_ptr - last_ptr;
+           last_ptr = str_ptr;
+
+            if (do_strcpy) {
+               len = min(from_left, to_left);
+                strncpy(to, from, len);
+                from += len;
+                to += len;
+                from_left -= len;
+                to_left -= len;
+                ret = 0;
+            } else {
+               ret = _XlcConvert(conv, &from, &from_left, &to, &to_left, NULL, 0);
+            }
+
+           if (ret < 0)
+               continue;
+
+           unconv_num += ret;
+           (*count_ret)++;
+
+           if (nitems == 0)
+               break;
+           last_ptr = ++str_ptr;
+           if (is_wide_char) {
+               *((wchar_t *)to) = (wchar_t) 0;
+               to += sizeof(wchar_t);
+               to_left -= sizeof(wchar_t);
+           } else {
+               *((char *)to) = '\0';
+               to++;
+               to_left--;
+           }
+           if (! do_strcpy)
+               _XlcResetConverter(conv);
+       } else
+           str_ptr++;
+
+       nitems--;
+    }
+
+    if (! do_strcpy)
+        _XlcCloseConverter(conv);
+
+    if (is_wide_char) {
+       *((wchar_t *) to) = (wchar_t) 0;
+       to_left -= sizeof(wchar_t);
+    } else {
+       *((char *) to) = '\0';
+       to_left--;
+    }
+
+    *list_ret = alloc_list(is_wide_char, *count_ret, buf_len - to_left);
+    if (*list_ret)
+       copy_list(is_wide_char, buf, *list_ret, *count_ret);
+
+    Xfree(buf);
+
+    return unconv_num;
+}
+
+int
+_XmbTextPropertyToTextList(
+    XLCd lcd,
+    Display *dpy,
+    const XTextProperty *text_prop,
+    char ***list_ret,
+    int *count_ret)
+{
+    return _XTextPropertyToTextList(lcd, dpy, text_prop, XlcNMultiByte,
+                                   (XPointer **) list_ret, count_ret);
+}
+
+int
+_XwcTextPropertyToTextList(
+    XLCd lcd,
+    Display *dpy,
+    const XTextProperty *text_prop,
+    wchar_t ***list_ret,
+    int *count_ret)
+{
+    return _XTextPropertyToTextList(lcd, dpy, text_prop, XlcNWideChar,
+                                   (XPointer **) list_ret, count_ret);
+}
+
+int
+_Xutf8TextPropertyToTextList(
+    XLCd lcd,
+    Display *dpy,
+    const XTextProperty *text_prop,
+    char ***list_ret,
+    int *count_ret)
+{
+    return _XTextPropertyToTextList(lcd, dpy, text_prop, XlcNUtf8String,
+                                   (XPointer **) list_ret, count_ret);
+}
+
+void
+_XwcFreeStringList(
+    XLCd lcd,
+    wchar_t **list)
+{
+    if (list) {
+        if (*list)
+            Xfree(*list);
+        Xfree(list);
+    }
+}
diff --git a/src/xlibi18n/lcPubWrap.c b/src/xlibi18n/lcPubWrap.c
new file mode 100644 (file)
index 0000000..2a5ac08
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * 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 TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA 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.
+ *
+ * Author: Katsuhisa Yano      TOSHIBA Corp.
+ *                             mopi@osa.ilab.toshiba.co.jp
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XlcPubI.h"
+
+char *
+_XGetLCValues(XLCd lcd, ...)
+{
+    va_list var;
+    XlcArgList args;
+    char *ret;
+    int num_args;
+    XLCdPublicMethodsPart *methods = XLC_PUBLIC_METHODS(lcd);
+
+    va_start(var, lcd);
+    _XlcCountVaList(var, &num_args);
+    va_end(var);
+
+    va_start(var, lcd);
+    _XlcVaToArgList(var, num_args, &args);
+    va_end(var);
+
+    if (args == (XlcArgList) NULL)
+       return (char *) NULL;
+
+    ret = (*methods->get_values)(lcd, args, num_args);
+
+    Xfree(args);
+
+    return ret;
+}
+
+void
+_XlcDestroyLC(
+    XLCd lcd)
+{
+    XLCdPublicMethods methods = (XLCdPublicMethods) lcd->methods;
+
+    (*methods->pub.destroy)(lcd);
+}
+
+XLCd
+_XlcCreateLC(
+    const char *name,
+    XLCdMethods methods)
+{
+    XLCdPublicMethods pub_methods = (XLCdPublicMethods) methods;
+    XLCd lcd;
+
+    lcd = (*pub_methods->pub.create)(name, methods);
+    if (lcd == NULL)
+       return (XLCd) NULL;
+
+    if (lcd->core->name == NULL) {
+       lcd->core->name = (char*) Xmalloc(strlen(name) + 1);
+       if (lcd->core->name == NULL)
+           goto err;
+       strcpy(lcd->core->name, name);
+    }
+
+    if (lcd->methods == NULL)
+       lcd->methods = methods;
+
+    if ((*pub_methods->pub.initialize)(lcd) == False)
+       goto err;
+
+    return lcd;
+
+err:
+    _XlcDestroyLC(lcd);
+
+    return (XLCd) NULL;
+}
diff --git a/src/xlibi18n/lcPublic.c b/src/xlibi18n/lcPublic.c
new file mode 100644 (file)
index 0000000..1b1fb54
--- /dev/null
@@ -0,0 +1,314 @@
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * 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 TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA 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.
+ *
+ * Author: Katsuhisa Yano      TOSHIBA Corp.
+ *                             mopi@osa.ilab.toshiba.co.jp
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include "Xlibint.h"
+#include "XlcPubI.h"
+
+static const char *
+default_string(
+    XLCd lcd)
+{
+    return XLC_PUBLIC(lcd, default_string);
+}
+
+static XLCd create (const char *name, XLCdMethods methods);
+static Bool initialize (XLCd lcd);
+static void destroy (XLCd lcd);
+static char *get_values (XLCd lcd, XlcArgList args, int num_args);
+
+static XLCdPublicMethodsRec publicMethods = {
+    {
+       destroy,
+       _XlcDefaultMapModifiers,
+       NULL,
+       NULL,
+       _XrmDefaultInitParseInfo,
+       _XmbTextPropertyToTextList,
+       _XwcTextPropertyToTextList,
+       _Xutf8TextPropertyToTextList,
+       _XmbTextListToTextProperty,
+       _XwcTextListToTextProperty,
+       _Xutf8TextListToTextProperty,
+       _XwcFreeStringList,
+       default_string,
+       NULL,
+       NULL
+    },
+    {
+       NULL,
+       create,
+       initialize,
+       destroy,
+       get_values,
+       _XlcGetLocaleDataBase
+    }
+};
+
+XLCdMethods _XlcPublicMethods = (XLCdMethods) &publicMethods;
+
+static XLCd
+create(
+    const char *name,
+    XLCdMethods methods)
+{
+    XLCd lcd;
+    XLCdPublicMethods new;
+
+    lcd = Xcalloc(1, sizeof(XLCdRec));
+    if (lcd == NULL)
+        return (XLCd) NULL;
+
+    lcd->core = Xcalloc(1, sizeof(XLCdPublicRec));
+    if (lcd->core == NULL)
+       goto err;
+
+    new = (XLCdPublicMethods) Xmalloc(sizeof(XLCdPublicMethodsRec));
+    if (new == NULL)
+       goto err;
+    memcpy(new,methods,sizeof(XLCdPublicMethodsRec));
+    lcd->methods = (XLCdMethods) new;
+
+    return lcd;
+
+err:
+    Xfree(lcd);
+    return (XLCd) NULL;
+}
+
+static Bool
+load_public(
+    XLCd lcd)
+{
+    XLCdPublicPart *pub = XLC_PUBLIC_PART(lcd);
+    char **values, *str;
+    int num;
+
+    if(_XlcCreateLocaleDataBase(lcd) == NULL)
+       return False;
+
+    _XlcGetResource(lcd, "XLC_XLOCALE", "mb_cur_max", &values, &num);
+    if (num > 0) {
+       pub->mb_cur_max = atoi(values[0]);
+       if (pub->mb_cur_max < 1)
+           pub->mb_cur_max = 1;
+    } else
+       pub->mb_cur_max = 1;
+
+    _XlcGetResource(lcd, "XLC_XLOCALE", "state_depend_encoding", &values, &num);
+    if (num > 0 && !_XlcCompareISOLatin1(values[0], "True"))
+       pub->is_state_depend = True;
+    else
+       pub->is_state_depend = False;
+
+    _XlcGetResource(lcd, "XLC_XLOCALE", "encoding_name", &values, &num);
+    str = (num > 0) ? values[0] : "STRING";
+    pub->encoding_name = strdup(str);
+    if (pub->encoding_name == NULL)
+       return False;
+
+    return True;
+}
+
+static Bool
+initialize_core(
+    XLCd lcd)
+{
+    XLCdMethods methods = lcd->methods;
+    XLCdMethods core = &publicMethods.core;
+
+    if (methods->close == NULL)
+       methods->close = core->close;
+
+    if (methods->map_modifiers == NULL)
+       methods->map_modifiers = core->map_modifiers;
+
+    if (methods->open_om == NULL)
+#ifdef USE_DYNAMIC_LC
+       _XInitDefaultOM(lcd);
+#else
+       _XInitOM(lcd);
+#endif
+
+    if (methods->open_im == NULL)
+#ifdef USE_DYNAMIC_LC
+       _XInitDefaultIM(lcd);
+#else
+       _XInitIM(lcd);
+#endif
+
+    if (methods->init_parse_info == NULL)
+       methods->init_parse_info = core->init_parse_info;
+
+    if (methods->mb_text_prop_to_list == NULL)
+       methods->mb_text_prop_to_list = core->mb_text_prop_to_list;
+
+    if (methods->wc_text_prop_to_list == NULL)
+       methods->wc_text_prop_to_list = core->wc_text_prop_to_list;
+
+    if (methods->utf8_text_prop_to_list == NULL)
+       methods->utf8_text_prop_to_list = core->utf8_text_prop_to_list;
+
+    if (methods->mb_text_list_to_prop == NULL)
+       methods->mb_text_list_to_prop = core->mb_text_list_to_prop;
+
+    if (methods->wc_text_list_to_prop == NULL)
+       methods->wc_text_list_to_prop = core->wc_text_list_to_prop;
+
+    if (methods->utf8_text_list_to_prop == NULL)
+       methods->utf8_text_list_to_prop = core->utf8_text_list_to_prop;
+
+    if (methods->wc_free_string_list == NULL)
+       methods->wc_free_string_list = core->wc_free_string_list;
+
+    if (methods->default_string == NULL)
+       methods->default_string = core->default_string;
+
+    return True;
+}
+
+static Bool
+initialize(
+    XLCd lcd)
+{
+    XLCdPublicMethodsPart *methods = XLC_PUBLIC_METHODS(lcd);
+    XLCdPublicMethodsPart *pub_methods = &publicMethods.pub;
+    XLCdPublicPart *pub = XLC_PUBLIC_PART(lcd);
+    char *name;
+#if !defined(X_LOCALE)
+    int len;
+    char sinamebuf[256];
+    char* siname;
+#endif
+
+    _XlcInitCTInfo();
+
+    if (initialize_core(lcd) == False)
+       return False;
+
+    name = lcd->core->name;
+#if !defined(X_LOCALE)
+    /*
+     * _XlMapOSLocaleName will return the same string or a substring
+     * of name, so strlen(name) is okay
+     */
+    if ((len = strlen(name)) < sizeof sinamebuf)
+        siname = sinamebuf;
+    else
+        siname = Xmalloc (len + 1);
+    if (siname == NULL)
+        return False;
+    name = _XlcMapOSLocaleName(name, siname);
+#endif
+    /* _XlcResolveLocaleName will lookup the SI's name for the locale */
+    if (_XlcResolveLocaleName(name, pub) == 0) {
+#if !defined(X_LOCALE)
+       if (siname != sinamebuf) Xfree (siname);
+#endif
+       return False;
+    }
+#if !defined(X_LOCALE)
+    if (siname != sinamebuf)
+        Xfree (siname);
+#endif
+
+    if (pub->default_string == NULL)
+       pub->default_string = "";
+
+    if (methods->get_values == NULL)
+       methods->get_values = pub_methods->get_values;
+
+    if (methods->get_resource == NULL)
+       methods->get_resource = pub_methods->get_resource;
+
+    return load_public(lcd);
+}
+
+static void
+destroy_core(
+    XLCd lcd)
+{
+    if (lcd->core) {
+       if (lcd->core->name)
+            Xfree(lcd->core->name);
+       Xfree(lcd->core);
+    }
+
+    if (lcd->methods)
+       Xfree(lcd->methods);
+
+    Xfree(lcd);
+}
+
+static void
+destroy(
+    XLCd lcd)
+{
+    XLCdPublicPart *pub = XLC_PUBLIC_PART(lcd);
+
+    _XlcDestroyLocaleDataBase(lcd);
+
+    if (pub->siname)
+       Xfree(pub->siname);
+    if (pub->encoding_name)
+       Xfree(pub->encoding_name);
+
+    destroy_core(lcd);
+}
+
+static XlcResource resources[] = {
+    { XlcNCodeset, NULLQUARK, sizeof(char *),
+      XOffsetOf(XLCdPublicRec, pub.codeset), XlcGetMask },
+    { XlcNDefaultString, NULLQUARK, sizeof(char *),
+      XOffsetOf(XLCdPublicRec, pub.default_string), XlcGetMask },
+    { XlcNEncodingName, NULLQUARK, sizeof(char *),
+      XOffsetOf(XLCdPublicRec, pub.encoding_name), XlcGetMask },
+    { XlcNLanguage, NULLQUARK, sizeof(char *),
+      XOffsetOf(XLCdPublicRec, pub.language), XlcGetMask },
+    { XlcNMbCurMax, NULLQUARK, sizeof(int),
+      XOffsetOf(XLCdPublicRec, pub.mb_cur_max), XlcGetMask },
+    { XlcNStateDependentEncoding, NULLQUARK, sizeof(Bool),
+      XOffsetOf(XLCdPublicRec, pub.is_state_depend), XlcGetMask },
+    { XlcNTerritory, NULLQUARK, sizeof(char *),
+      XOffsetOf(XLCdPublicRec, pub.territory), XlcGetMask }
+};
+
+static char *
+get_values(
+    XLCd lcd,
+    XlcArgList args,
+    int num_args)
+{
+    XLCdPublic pub = (XLCdPublic) lcd->core;
+
+    if (resources[0].xrm_name == NULLQUARK)
+       _XlcCompileResourceList(resources, XlcNumber(resources));
+
+    return _XlcGetValues((XPointer) pub, resources, XlcNumber(resources), args,
+                        num_args, XlcGetMask);
+}
diff --git a/src/xlibi18n/lcRM.c b/src/xlibi18n/lcRM.c
new file mode 100644 (file)
index 0000000..9f72504
--- /dev/null
@@ -0,0 +1,224 @@
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * 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 TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA 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.
+ *
+ * Author: Katsuhisa Yano      TOSHIBA Corp.
+ *                             mopi@osa.ilab.toshiba.co.jp
+ * Bug fixes: Bruno Haible     XFree86 Inc.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XlcPubI.h"
+#include <stdio.h>
+
+/*
+ * Default implementation of methods for Xrm parsing.
+ */
+
+/* ======================= Unibyte implementation ======================= */
+
+/* Only for efficiency, to speed up things. */
+
+/* This implementation must keep the locale, for lcname. */
+typedef struct _UbStateRec {
+    XLCd       lcd;
+} UbStateRec, *UbState;
+
+/* Sets the state to the initial state.
+   Initiates a sequence of calls to mbchar. */
+static void
+ub_mbinit(
+    XPointer state)
+{
+}
+
+/* Transforms one multibyte character, and return a 'char' in the same
+   parsing class. Returns the number of consumed bytes in *lenp. */
+static char
+ub_mbchar(
+    XPointer state,
+    const char *str,
+    int        *lenp)
+{
+    *lenp = 1;
+    return *str;
+}
+
+/* Terminates a sequence of calls to mbchar. */
+static void
+ub_mbfinish(
+    XPointer state)
+{
+}
+
+/* Returns the name of the state's locale, as a static string. */
+static const char *
+ub_lcname(
+    XPointer state)
+{
+    return ((UbState) state)->lcd->core->name;
+}
+
+/* Frees the state, which was allocated by _XrmDefaultInitParseInfo. */
+static void
+ub_destroy(
+    XPointer state)
+{
+    _XCloseLC(((UbState) state)->lcd);
+    Xfree((char *) state);
+}
+
+static const XrmMethodsRec ub_methods = {
+    ub_mbinit,
+    ub_mbchar,
+    ub_mbfinish,
+    ub_lcname,
+    ub_destroy
+};
+
+/* ======================= Multibyte implementation ======================= */
+
+/* This implementation uses an XlcConv from XlcNMultiByte to XlcNWideChar. */
+typedef struct _MbStateRec {
+    XLCd       lcd;
+    XlcConv    conv;
+} MbStateRec, *MbState;
+
+/* Sets the state to the initial state.
+   Initiates a sequence of calls to mbchar. */
+static void
+mb_mbinit(
+    XPointer state)
+{
+    _XlcResetConverter(((MbState) state)->conv);
+}
+
+/* Transforms one multibyte character, and return a 'char' in the same
+   parsing class. Returns the number of consumed bytes in *lenp. */
+static char
+mb_mbchar(
+    XPointer state,
+    const char *str,
+    int        *lenp)
+{
+    XlcConv conv = ((MbState) state)->conv;
+    const char *from;
+    wchar_t *to, wc;
+    int cur_max, i, from_left, to_left, ret;
+
+    cur_max = XLC_PUBLIC(((MbState) state)->lcd, mb_cur_max);
+
+    from = str;
+    /* Determine from_left. Avoid overrun error which could occur if
+       from_left > strlen(str). */
+    from_left = cur_max;
+    for (i = 0; i < cur_max; i++)
+       if (str[i] == '\0') {
+           from_left = i;
+           break;
+       }
+    *lenp = from_left;
+
+    to = &wc;
+    to_left = 1;
+
+    ret = _XlcConvert(conv, (XPointer *) &from, &from_left,
+                     (XPointer *) &to, &to_left, NULL, 0);
+    *lenp -= from_left;
+
+    if (ret < 0 || to_left > 0) {
+       /* Invalid or incomplete multibyte character seen. */
+       *lenp = 1;
+       return 0x7f;
+    }
+    /* Return a 'char' equivalent to wc. */
+    return (wc >= 0 && wc <= 0x7f ? wc : 0x7f);
+}
+
+/* Terminates a sequence of calls to mbchar. */
+static void
+mb_mbfinish(
+    XPointer state)
+{
+}
+
+/* Returns the name of the state's locale, as a static string. */
+static const char *
+mb_lcname(
+    XPointer state)
+{
+    return ((MbState) state)->lcd->core->name;
+}
+
+/* Frees the state, which was allocated by _XrmDefaultInitParseInfo. */
+static void
+mb_destroy(
+    XPointer state)
+{
+    _XlcCloseConverter(((MbState) state)->conv);
+    _XCloseLC(((MbState) state)->lcd);
+    Xfree((char *) state);
+}
+
+static const XrmMethodsRec mb_methods = {
+    mb_mbinit,
+    mb_mbchar,
+    mb_mbfinish,
+    mb_lcname,
+    mb_destroy
+};
+
+/* ======================= Exported function ======================= */
+
+XrmMethods
+_XrmDefaultInitParseInfo(
+    XLCd lcd,
+    XPointer *rm_state)
+{
+    if (XLC_PUBLIC(lcd, mb_cur_max) == 1) {
+       /* Unibyte case. */
+       UbState state = (UbState) Xmalloc(sizeof(UbStateRec));
+       if (state == NULL)
+           return (XrmMethods) NULL;
+
+       state->lcd = lcd;
+
+       *rm_state = (XPointer) state;
+       return &ub_methods;
+    } else {
+       /* Multibyte case. */
+       MbState state = (MbState) Xmalloc(sizeof(MbStateRec));
+       if (state == NULL)
+           return (XrmMethods) NULL;
+
+       state->lcd = lcd;
+       state->conv = _XlcOpenConverter(lcd, XlcNMultiByte, lcd, XlcNWideChar);
+       if (state->conv == NULL) {
+           Xfree((char *) state);
+           return (XrmMethods) NULL;
+       }
+
+       *rm_state = (XPointer) state;
+       return &mb_methods;
+    }
+}
diff --git a/src/xlibi18n/lcStd.c b/src/xlibi18n/lcStd.c
new file mode 100644 (file)
index 0000000..87f6b60
--- /dev/null
@@ -0,0 +1,368 @@
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * 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 TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA 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.
+ *
+ * Author: Katsuhisa Yano      TOSHIBA Corp.
+ *                             mopi@osa.ilab.toshiba.co.jp
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XlcPubI.h"
+
+int
+_Xlcmbtowc(
+    XLCd lcd,
+    wchar_t *wstr,
+    char *str,
+    int len)
+{
+    static XLCd last_lcd = NULL;
+    static XlcConv conv = NULL;
+    XPointer from, to;
+    int from_left, to_left;
+    wchar_t tmp_wc;
+
+    if (lcd == NULL) {
+       lcd = _XlcCurrentLC();
+       if (lcd == NULL)
+           return -1;
+    }
+    if (str == NULL)
+       return XLC_PUBLIC(lcd, is_state_depend);
+
+    if (conv && lcd != last_lcd) {
+       _XlcCloseConverter(conv);
+       conv = NULL;
+    }
+
+    last_lcd = lcd;
+
+    if (conv == NULL) {
+       conv = _XlcOpenConverter(lcd, XlcNMultiByte, lcd, XlcNWideChar);
+       if (conv == NULL)
+           return -1;
+    }
+
+    from = (XPointer) str;
+    from_left = len;
+    to = (XPointer) (wstr ? wstr : &tmp_wc);
+    to_left = 1;
+
+    if (_XlcConvert(conv, &from, &from_left, &to, &to_left, NULL, 0) < 0)
+       return -1;
+
+    return (len - from_left);
+}
+
+int
+_Xlcwctomb(
+    XLCd lcd,
+    char *str,
+    wchar_t wc)
+{
+    static XLCd last_lcd = NULL;
+    static XlcConv conv = NULL;
+    XPointer from, to;
+    int from_left, to_left, length;
+
+    if (lcd == NULL) {
+       lcd = _XlcCurrentLC();
+       if (lcd == NULL)
+           return -1;
+    }
+    if (str == NULL)
+       return XLC_PUBLIC(lcd, is_state_depend);
+
+    if (conv && lcd != last_lcd) {
+       _XlcCloseConverter(conv);
+       conv = NULL;
+    }
+
+    last_lcd = lcd;
+
+    if (conv == NULL) {
+       conv = _XlcOpenConverter(lcd, XlcNWideChar, lcd, XlcNMultiByte);
+       if (conv == NULL)
+           return -1;
+    }
+
+    from = (XPointer) &wc;
+    from_left = 1;
+    to = (XPointer) str;
+    length = to_left = XLC_PUBLIC(lcd, mb_cur_max);
+
+    if (_XlcConvert(conv, &from, &from_left, &to, &to_left, NULL, 0) < 0)
+       return -1;
+
+    return (length - to_left);
+}
+
+int
+_Xlcmbstowcs(
+    XLCd lcd,
+    wchar_t *wstr,
+    char *str,
+    int len)
+{
+    XlcConv conv;
+    XPointer from, to;
+    int from_left, to_left, ret;
+
+    if (lcd == NULL) {
+       lcd = _XlcCurrentLC();
+       if (lcd == NULL)
+           return -1;
+    }
+
+    conv = _XlcOpenConverter(lcd, XlcNMultiByte, lcd, XlcNWideChar);
+    if (conv == NULL)
+       return -1;
+
+    from = (XPointer) str;
+    from_left = strlen(str);
+    to = (XPointer) wstr;
+    to_left = len;
+
+    if (_XlcConvert(conv, &from, &from_left, &to, &to_left, NULL, 0) < 0)
+       ret = -1;
+    else {
+       ret = len - to_left;
+       if (wstr && to_left > 0)
+           wstr[ret] = (wchar_t) 0;
+    }
+
+    _XlcCloseConverter(conv);
+
+    return ret;
+}
+
+int
+_Xlcwcstombs(
+    XLCd lcd,
+    char *str,
+    wchar_t *wstr,
+    int len)
+{
+    XlcConv conv;
+    XPointer from, to;
+    int from_left, to_left, ret;
+
+    if (lcd == NULL) {
+       lcd = _XlcCurrentLC();
+       if (lcd == NULL)
+           return -1;
+    }
+
+    conv = _XlcOpenConverter(lcd, XlcNWideChar, lcd, XlcNMultiByte);
+    if (conv == NULL)
+       return -1;
+
+    from = (XPointer) wstr;
+    from_left = _Xwcslen(wstr);
+    to = (XPointer) str;
+    to_left = len;
+
+    if (_XlcConvert(conv, &from, &from_left, &to, &to_left, NULL, 0) < 0)
+       ret = -1;
+    else {
+       ret = len - to_left;
+       if (str && to_left > 0)
+           str[ret] = '\0';
+    }
+
+    _XlcCloseConverter(conv);
+
+    return ret;
+}
+
+
+int
+_Xmbtowc(
+    wchar_t *wstr,
+#ifdef ISC
+    char const *str,
+    size_t len
+#else
+    char *str,
+    int len
+#endif
+    )
+{
+    return _Xlcmbtowc((XLCd) NULL, wstr, str, len);
+}
+
+int
+_Xmblen(
+#ifdef ISC
+    char const *str,
+    size_t len
+#else
+    char *str,
+    int len
+#endif
+    )
+{
+    return _Xmbtowc((wchar_t *) NULL, str, len);
+}
+
+int
+_Xwctomb(
+    char *str,
+    wchar_t wc)
+{
+    return _Xlcwctomb((XLCd) NULL, str, wc);
+}
+
+int
+_Xmbstowcs(
+    wchar_t *wstr,
+    char *str,
+    int len)
+{
+    return _Xlcmbstowcs((XLCd) NULL, wstr, str, len);
+}
+
+int
+_Xwcstombs(
+    char *str,
+    wchar_t *wstr,
+    int len)
+{
+    return _Xlcwcstombs((XLCd) NULL, str, wstr, len);
+}
+
+wchar_t *
+_Xwcscpy(
+    register wchar_t *wstr1, register wchar_t *wstr2)
+{
+    wchar_t *wstr_tmp = wstr1;
+
+    while ((*wstr1++ = *wstr2++))
+       ;
+
+    return wstr_tmp;
+}
+
+wchar_t *
+_Xwcsncpy(
+    register wchar_t *wstr1, register wchar_t *wstr2,
+    register int len)
+{
+    wchar_t *wstr_tmp = wstr1;
+
+    while (len-- > 0)
+       if (!(*wstr1++ = *wstr2++))
+           break;
+
+    while (len-- > 0)
+       *wstr1++ = (wchar_t) 0;
+
+    return wstr_tmp;
+}
+
+int
+_Xwcslen(
+    register wchar_t *wstr)
+{
+    register wchar_t *wstr_ptr = wstr;
+
+    while (*wstr_ptr)
+       wstr_ptr++;
+
+    return wstr_ptr - wstr;
+}
+
+int
+_Xwcscmp(
+    register wchar_t *wstr1, register wchar_t *wstr2)
+{
+    for ( ; *wstr1 && *wstr2; wstr1++, wstr2++)
+       if (*wstr1 != *wstr2)
+           break;
+
+    return *wstr1 - *wstr2;
+}
+
+int
+_Xwcsncmp(
+    register wchar_t *wstr1, register wchar_t *wstr2,
+    register int len)
+{
+    for ( ; *wstr1 && *wstr2 && len > 0; wstr1++, wstr2++, len--)
+       if (*wstr1 != *wstr2)
+           break;
+
+    if (len <= 0)
+       return 0;
+
+    return *wstr1 - *wstr2;
+}
+
+
+int
+_Xlcmbstoutf8(
+    XLCd lcd,
+    char *ustr,
+    const char *str,
+    int len)
+{
+    XlcConv conv;
+    XPointer from, to;
+    int from_left, to_left, ret;
+
+    if (lcd == NULL) {
+       lcd = _XlcCurrentLC();
+       if (lcd == NULL)
+           return -1;
+    }
+
+    conv = _XlcOpenConverter(lcd, XlcNMultiByte, lcd, XlcNUtf8String);
+    if (conv == NULL)
+       return -1;
+
+    from = (XPointer) str;
+    from_left = strlen(str);
+    to = (XPointer) ustr;
+    to_left = len;
+
+    if (_XlcConvert(conv, &from, &from_left, &to, &to_left, NULL, 0) < 0)
+       ret = -1;
+    else {
+       ret = len - to_left;
+       if (ustr && to_left > 0)
+           ustr[ret] = '\0';
+    }
+
+    _XlcCloseConverter(conv);
+
+    return ret;
+}
+
+int
+_Xmbstoutf8(
+    char *ustr,
+    const char *str,
+    int len)
+{
+    return _Xlcmbstoutf8((XLCd) NULL, ustr, str, len);
+}
diff --git a/src/xlibi18n/lcTxtPr.c b/src/xlibi18n/lcTxtPr.c
new file mode 100644 (file)
index 0000000..4dfafe0
--- /dev/null
@@ -0,0 +1,254 @@
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * 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 TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA 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.
+ *
+ * Author: Katsuhisa Yano      TOSHIBA Corp.
+ *                             mopi@osa.ilab.toshiba.co.jp
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "XlcPubI.h"
+#include <X11/Xutil.h>
+#include <X11/Xatom.h>
+#include <stdio.h>
+
+static int
+get_buf_size(
+    Bool is_wide_char,
+    XPointer list,
+    int count)
+{
+    int length = 0;
+    char **mb_list;
+    wchar_t **wc_list;
+
+    if (list == NULL)
+       return 0;
+
+    if (is_wide_char) {
+       wc_list = (wchar_t **) list;
+       for ( ; count-- > 0; wc_list++) {
+           if (*wc_list)
+               length += _Xwcslen(*wc_list) + 1;
+       }
+       length *= 5;    /* XXX */
+    } else {
+       mb_list = (char **) list;
+       for ( ; count-- > 0; mb_list++) {
+           if (*mb_list)
+               length += strlen(*mb_list) + 1;
+       }
+       length *= 3;    /* XXX */
+    }
+    length = (length / BUFSIZ + 1) * BUFSIZ;   /* XXX */
+
+    return length;
+}
+
+static int
+_XTextListToTextProperty(
+    XLCd lcd,
+    Display *dpy,
+    const char *from_type,
+    XPointer list,
+    int count,
+    XICCEncodingStyle style,
+    XTextProperty *text_prop)
+{
+    Atom encoding;
+    XlcConv conv;
+    const char *to_type;
+    char **mb_list = NULL;
+    wchar_t **wc_list = NULL;
+    XPointer from;
+    char *to, *buf, *value;
+    int from_left, to_left, buf_len, nitems, unconv_num = 0, ret, i;
+    Bool is_wide_char = False;
+
+    if (strcmp(XlcNWideChar, from_type) == 0)
+       is_wide_char = True;
+
+    buf_len = get_buf_size(is_wide_char, list, count);
+    if ((buf = (char *) Xmalloc(buf_len)) == NULL)
+       return XNoMemory;
+
+    switch (style) {
+       case XStringStyle:
+       case XStdICCTextStyle:
+           encoding = XA_STRING;
+           to_type = XlcNString;
+           break;
+       case XUTF8StringStyle:
+           encoding = XInternAtom(dpy, "UTF8_STRING", False);
+           to_type = XlcNUtf8String;
+           break;
+       case XCompoundTextStyle:
+           encoding = XInternAtom(dpy, "COMPOUND_TEXT", False);
+           to_type = XlcNCompoundText;
+           break;
+       case XTextStyle:
+           encoding = XInternAtom(dpy, XLC_PUBLIC(lcd, encoding_name), False);
+           to_type = XlcNMultiByte;
+           if (is_wide_char == False) {
+               nitems = 0;
+               mb_list = (char **) list;
+               to = buf;
+               for (i = 0; i < count && buf_len > 0; i++) {
+                   if (*mb_list)
+                       strcpy(to, *mb_list);
+                   else
+                       *to = '\0';
+                   from_left = (*mb_list ? strlen(*mb_list) : 0) + 1;
+                   nitems += from_left;
+                   to += from_left;
+                   mb_list++;
+               }
+               unconv_num = 0;
+               goto done;
+           }
+           break;
+       default:
+           Xfree(buf);
+           return XConverterNotFound;
+    }
+
+    if (count < 1) {
+       nitems = 0;
+       goto done;
+    }
+
+retry:
+    conv = _XlcOpenConverter(lcd, from_type, lcd, to_type);
+    if (conv == NULL) {
+       Xfree(buf);
+       return XConverterNotFound;
+    }
+
+    if (is_wide_char)
+       wc_list = (wchar_t **) list;
+    else
+       mb_list = (char **) list;
+
+    to = buf;
+    to_left = buf_len;
+
+    unconv_num = 0;
+
+    for (i = 1; to_left > 0; i++) {
+       if (is_wide_char) {
+           from = (XPointer) *wc_list;
+           from_left = _Xwcslen(*wc_list);
+           wc_list++;
+       } else {
+           from = (XPointer) *mb_list;
+           from_left = (*mb_list ? strlen(*mb_list) : 0);
+           mb_list++;
+       }
+
+       ret = _XlcConvert(conv, &from, &from_left, (XPointer *) &to, &to_left,
+                         NULL, 0);
+
+       if (ret < 0)
+           continue;
+
+       if (ret > 0 && style == XStdICCTextStyle && encoding == XA_STRING) {
+           _XlcCloseConverter(conv);
+           encoding = XInternAtom(dpy, "COMPOUND_TEXT", False);
+           to_type = XlcNCompoundText;
+           goto retry;
+       }
+
+       unconv_num += ret;
+       *to++ = '\0';
+       to_left--;
+
+       if (i >= count)
+           break;
+
+       _XlcResetConverter(conv);
+    }
+
+    _XlcCloseConverter(conv);
+
+    nitems = to - buf;
+done:
+    if (nitems <= 0)
+       nitems = 1;
+    value = (char *) Xmalloc(nitems);
+    if (value == NULL) {
+       Xfree(buf);
+       return XNoMemory;
+    }
+    if (nitems == 1)
+       *value = 0;
+    else
+       memcpy(value, buf, nitems);
+    nitems--;
+    Xfree(buf);
+
+    text_prop->value = (unsigned char *) value;
+    text_prop->encoding = encoding;
+    text_prop->format = 8;
+    text_prop->nitems = nitems;
+
+    return unconv_num;
+}
+
+int
+_XmbTextListToTextProperty(
+    XLCd lcd,
+    Display *dpy,
+    char **list,
+    int count,
+    XICCEncodingStyle style,
+    XTextProperty *text_prop)
+{
+    return _XTextListToTextProperty(lcd, dpy, XlcNMultiByte, (XPointer) list,
+                                   count, style, text_prop);
+}
+
+int
+_XwcTextListToTextProperty(
+    XLCd lcd,
+    Display *dpy,
+    wchar_t **list,
+    int count,
+    XICCEncodingStyle style,
+    XTextProperty *text_prop)
+{
+    return _XTextListToTextProperty(lcd, dpy, XlcNWideChar, (XPointer) list,
+                                   count, style, text_prop);
+}
+
+int
+_Xutf8TextListToTextProperty(
+    XLCd lcd,
+    Display *dpy,
+    char **list,
+    int count,
+    XICCEncodingStyle style,
+    XTextProperty *text_prop)
+{
+    return _XTextListToTextProperty(lcd, dpy, XlcNUtf8String, (XPointer) list,
+                                   count, style, text_prop);
+}
diff --git a/src/xlibi18n/lcUTF8.c b/src/xlibi18n/lcUTF8.c
new file mode 100644 (file)
index 0000000..3e934b7
--- /dev/null
@@ -0,0 +1,2390 @@
+/******************************************************************
+
+              Copyright 1993 by SunSoft, Inc.
+              Copyright 1999-2000 by Bruno Haible
+
+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 names of SunSoft, Inc. and
+Bruno Haible not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.  SunSoft, Inc. and Bruno Haible make no representations
+about the suitability of this software for any purpose.  It is
+provided "as is" without express or implied warranty.
+
+SunSoft Inc. AND Bruno Haible DISCLAIM ALL WARRANTIES WITH REGARD
+TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS, IN NO EVENT SHALL SunSoft, Inc. OR Bruno Haible 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.
+
+******************************************************************/
+
+/*
+ * This file contains:
+ *
+ * I. Conversion routines CompoundText/CharSet <--> Unicode/UTF-8.
+ *
+ *    Used for three purposes:
+ *      1. The UTF-8 locales, see below.
+ *      2. Unicode aware applications for which the use of 8-bit character
+ *         sets is an anachronism.
+ *      3. For conversion from keysym to locale encoding.
+ *
+ * II. Conversion files for an UTF-8 locale loader.
+ *     Supports: all locales with codeset UTF-8.
+ *     How: Provides converters for UTF-8.
+ *     Platforms: all systems.
+ *
+ * The loader itself is located in lcUTF8.c.
+ */
+
+/*
+ * The conversion from UTF-8 to CompoundText is realized in a very
+ * conservative way. Recall that CompoundText data is used for inter-client
+ * communication purposes. We distinguish three classes of clients:
+ * - Clients which accept only those pieces of CompoundText which belong to
+ *   the character set understood by the current locale.
+ *   (Example: clients which are linked to an older X11 library.)
+ * - Clients which accept CompoundText with multiple character sets and parse
+ *   it themselves.
+ *   (Example: emacs, xemacs.)
+ * - Clients which rely entirely on the X{mb,wc}TextPropertyToTextList
+ *   functions for the conversion of CompoundText to their current locale's
+ *   multi-byte/wide-character format.
+ * For best interoperation, the UTF-8 to CompoundText conversion proceeds as
+ * follows. For every character, it first tests whether the character is
+ * representable in the current locale's original (non-UTF-8) character set.
+ * If not, it goes through the list of predefined character sets for
+ * CompoundText and tests if the character is representable in that character
+ * set. If so, it encodes the character using its code within that character
+ * set. If not, it uses an UTF-8-in-CompoundText encapsulation. Since
+ * clients of the first and second kind ignore such encapsulated text,
+ * this encapsulation is kept to a minimum and terminated as early as possible.
+ *
+ * In a distant future, when clients of the first and second kind will have
+ * disappeared, we will be able to stuff UTF-8 data directly in CompoundText
+ * without first going through the list of predefined character sets.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include "Xlibint.h"
+#include "XlcPubI.h"
+#include "XlcGeneric.h"
+
+static XlcConv
+create_conv(
+    XLCd lcd,
+    XlcConvMethods methods)
+{
+    XlcConv conv;
+
+    conv = (XlcConv) Xmalloc(sizeof(XlcConvRec));
+    if (conv == (XlcConv) NULL)
+       return (XlcConv) NULL;
+
+    conv->methods = methods;
+    conv->state = NULL;
+
+    return conv;
+}
+
+static void
+close_converter(
+    XlcConv conv)
+{
+    Xfree((char *) conv);
+}
+
+/* Replacement character for invalid multibyte sequence or wide character. */
+#define BAD_WCHAR ((ucs4_t) 0xfffd)
+#define BAD_CHAR '?'
+
+/***************************************************************************/
+/* Part I: Conversion routines CompoundText/CharSet <--> Unicode/UTF-8.
+ *
+ * Note that this code works in any locale. We store Unicode values in
+ * `ucs4_t' variables, but don't pass them to the user.
+ *
+ * This code has to support all character sets that are used for CompoundText,
+ * nothing more, nothing less. See the table in lcCT.c.
+ * Since the conversion _to_ CompoundText is likely to need the tables for all
+ * character sets at once, we don't use dynamic loading (of tables or shared
+ * libraries through iconv()). Use a fixed set of tables instead.
+ *
+ * We use statically computed tables, not dynamically allocated arrays,
+ * because it's more memory efficient: Different processes using the same
+ * libX11 shared library share the "text" and read-only "data" sections.
+ */
+
+typedef unsigned int ucs4_t;
+#define conv_t XlcConv
+
+typedef struct _Utf8ConvRec {
+    const char *name;
+    XrmQuark xrm_name;
+    int (* cstowc) (XlcConv, ucs4_t *, unsigned char const *, int);
+    int (* wctocs) (XlcConv, unsigned char *, ucs4_t, int);
+} Utf8ConvRec, *Utf8Conv;
+
+/*
+ * int xxx_cstowc (XlcConv conv, ucs4_t *pwc, unsigned char const *s, int n)
+ * converts the byte sequence starting at s to a wide character. Up to n bytes
+ * are available at s. n is >= 1.
+ * Result is number of bytes consumed (if a wide character was read),
+ * or 0 if invalid, or -1 if n too small.
+ *
+ * int xxx_wctocs (XlcConv conv, unsigned char *r, ucs4_t wc, int n)
+ * converts the wide character wc to the character set xxx, and stores the
+ * result beginning at r. Up to n bytes may be written at r. n is >= 1.
+ * Result is number of bytes written, or 0 if invalid, or -1 if n too small.
+ */
+
+/* Return code if invalid. (xxx_mbtowc, xxx_wctomb) */
+#define RET_ILSEQ      0
+/* Return code if only a shift sequence of n bytes was read. (xxx_mbtowc) */
+#define RET_TOOFEW(n)  (-1-(n))
+/* Return code if output buffer is too small. (xxx_wctomb, xxx_reset) */
+#define RET_TOOSMALL   -1
+
+/*
+ * The tables below are bijective. It would be possible to extend the
+ * xxx_wctocs tables to do some transliteration (e.g. U+201C,U+201D -> 0x22)
+ * but *only* with characters not contained in any other table, and *only*
+ * when the current locale is not an UTF-8 locale.
+ */
+
+#include "lcUniConv/utf8.h"
+#include "lcUniConv/ucs2be.h"
+#ifdef notused
+#include "lcUniConv/ascii.h"
+#endif
+#include "lcUniConv/iso8859_1.h"
+#include "lcUniConv/iso8859_2.h"
+#include "lcUniConv/iso8859_3.h"
+#include "lcUniConv/iso8859_4.h"
+#include "lcUniConv/iso8859_5.h"
+#include "lcUniConv/iso8859_6.h"
+#include "lcUniConv/iso8859_7.h"
+#include "lcUniConv/iso8859_8.h"
+#include "lcUniConv/iso8859_9.h"
+#include "lcUniConv/iso8859_10.h"
+#include "lcUniConv/iso8859_11.h"
+#include "lcUniConv/iso8859_13.h"
+#include "lcUniConv/iso8859_14.h"
+#include "lcUniConv/iso8859_15.h"
+#include "lcUniConv/iso8859_16.h"
+#include "lcUniConv/iso8859_9e.h"
+#include "lcUniConv/jisx0201.h"
+#include "lcUniConv/tis620.h"
+#include "lcUniConv/koi8_r.h"
+#include "lcUniConv/koi8_u.h"
+#include "lcUniConv/koi8_c.h"
+#include "lcUniConv/armscii_8.h"
+#include "lcUniConv/cp1133.h"
+#include "lcUniConv/mulelao.h"
+#include "lcUniConv/viscii.h"
+#include "lcUniConv/tcvn.h"
+#include "lcUniConv/georgian_academy.h"
+#include "lcUniConv/georgian_ps.h"
+#include "lcUniConv/cp1251.h"
+#include "lcUniConv/cp1255.h"
+#include "lcUniConv/cp1256.h"
+#include "lcUniConv/tatar_cyr.h"
+
+typedef struct {
+    unsigned short indx; /* index into big table */
+    unsigned short used; /* bitmask of used entries */
+} Summary16;
+
+#include "lcUniConv/gb2312.h"
+#include "lcUniConv/jisx0208.h"
+#include "lcUniConv/jisx0212.h"
+#include "lcUniConv/ksc5601.h"
+#include "lcUniConv/big5.h"
+#include "lcUniConv/big5_emacs.h"
+#include "lcUniConv/big5hkscs.h"
+#include "lcUniConv/gbk.h"
+
+static Utf8ConvRec all_charsets[] = {
+    /* The ISO10646-1/UTF-8 entry occurs twice, once at the beginning
+       (for lookup speed), once at the end (as a fallback).  */
+    { "ISO10646-1", NULLQUARK,
+       utf8_mbtowc, utf8_wctomb
+    },
+
+    { "ISO8859-1", NULLQUARK,
+       iso8859_1_mbtowc, iso8859_1_wctomb
+    },
+    { "ISO8859-2", NULLQUARK,
+       iso8859_2_mbtowc, iso8859_2_wctomb
+    },
+    { "ISO8859-3", NULLQUARK,
+       iso8859_3_mbtowc, iso8859_3_wctomb
+    },
+    { "ISO8859-4", NULLQUARK,
+       iso8859_4_mbtowc, iso8859_4_wctomb
+    },
+    { "ISO8859-5", NULLQUARK,
+       iso8859_5_mbtowc, iso8859_5_wctomb
+    },
+    { "ISO8859-6", NULLQUARK,
+       iso8859_6_mbtowc, iso8859_6_wctomb
+    },
+    { "ISO8859-7", NULLQUARK,
+       iso8859_7_mbtowc, iso8859_7_wctomb
+    },
+    { "ISO8859-8", NULLQUARK,
+       iso8859_8_mbtowc, iso8859_8_wctomb
+    },
+    { "ISO8859-9", NULLQUARK,
+       iso8859_9_mbtowc, iso8859_9_wctomb
+    },
+    { "ISO8859-10", NULLQUARK,
+       iso8859_10_mbtowc, iso8859_10_wctomb
+    },
+    { "ISO8859-11", NULLQUARK,
+       iso8859_11_mbtowc, iso8859_11_wctomb
+    },
+    { "ISO8859-13", NULLQUARK,
+       iso8859_13_mbtowc, iso8859_13_wctomb
+    },
+    { "ISO8859-14", NULLQUARK,
+       iso8859_14_mbtowc, iso8859_14_wctomb
+    },
+    { "ISO8859-15", NULLQUARK,
+       iso8859_15_mbtowc, iso8859_15_wctomb
+    },
+    { "ISO8859-16", NULLQUARK,
+       iso8859_16_mbtowc, iso8859_16_wctomb
+    },
+    { "JISX0201.1976-0", NULLQUARK,
+       jisx0201_mbtowc, jisx0201_wctomb
+    },
+    { "TIS620-0", NULLQUARK,
+       tis620_mbtowc, tis620_wctomb
+    },
+    { "GB2312.1980-0", NULLQUARK,
+       gb2312_mbtowc, gb2312_wctomb
+    },
+    { "JISX0208.1983-0", NULLQUARK,
+       jisx0208_mbtowc, jisx0208_wctomb
+    },
+    { "JISX0208.1990-0", NULLQUARK,
+       jisx0208_mbtowc, jisx0208_wctomb
+    },
+    { "JISX0212.1990-0", NULLQUARK,
+       jisx0212_mbtowc, jisx0212_wctomb
+    },
+    { "KSC5601.1987-0", NULLQUARK,
+       ksc5601_mbtowc, ksc5601_wctomb
+    },
+    { "KOI8-R", NULLQUARK,
+       koi8_r_mbtowc, koi8_r_wctomb
+    },
+    { "KOI8-U", NULLQUARK,
+       koi8_u_mbtowc, koi8_u_wctomb
+    },
+    { "KOI8-C", NULLQUARK,
+       koi8_c_mbtowc, koi8_c_wctomb
+    },
+    { "TATAR-CYR", NULLQUARK,
+       tatar_cyr_mbtowc, tatar_cyr_wctomb
+    },
+    { "ARMSCII-8", NULLQUARK,
+       armscii_8_mbtowc, armscii_8_wctomb
+    },
+    { "IBM-CP1133", NULLQUARK,
+       cp1133_mbtowc, cp1133_wctomb
+    },
+    { "MULELAO-1", NULLQUARK,
+       mulelao_mbtowc, mulelao_wctomb
+    },
+    { "VISCII1.1-1", NULLQUARK,
+       viscii_mbtowc, viscii_wctomb
+    },
+    { "TCVN-5712", NULLQUARK,
+       tcvn_mbtowc, tcvn_wctomb
+    },
+    { "GEORGIAN-ACADEMY", NULLQUARK,
+       georgian_academy_mbtowc, georgian_academy_wctomb
+    },
+    { "GEORGIAN-PS", NULLQUARK,
+       georgian_ps_mbtowc, georgian_ps_wctomb
+    },
+    { "ISO8859-9E", NULLQUARK,
+       iso8859_9e_mbtowc, iso8859_9e_wctomb
+    },
+    { "MICROSOFT-CP1251", NULLQUARK,
+       cp1251_mbtowc, cp1251_wctomb
+    },
+    { "MICROSOFT-CP1255", NULLQUARK,
+       cp1255_mbtowc, cp1255_wctomb
+    },
+    { "MICROSOFT-CP1256", NULLQUARK,
+       cp1256_mbtowc, cp1256_wctomb
+    },
+    { "BIG5-0", NULLQUARK,
+       big5_mbtowc, big5_wctomb
+    },
+    { "BIG5-E0", NULLQUARK,
+       big5_0_mbtowc, big5_0_wctomb
+    },
+    { "BIG5-E1", NULLQUARK,
+       big5_1_mbtowc, big5_1_wctomb
+    },
+    { "GBK-0", NULLQUARK,
+       gbk_mbtowc, gbk_wctomb
+    },
+    { "BIG5HKSCS-0", NULLQUARK,
+       big5hkscs_mbtowc, big5hkscs_wctomb
+    },
+
+    /* The ISO10646-1/UTF-8 entry occurs twice, once at the beginning
+       (for lookup speed), once at the end (as a fallback).  */
+    { "ISO10646-1", NULLQUARK,
+       utf8_mbtowc, utf8_wctomb
+    },
+
+    /* Encoding ISO10646-1 for fonts means UCS2-like encoding
+       so for conversion to FontCharSet we need this record */
+    { "ISO10646-1", NULLQUARK,
+       ucs2be_mbtowc, ucs2be_wctomb
+    }
+};
+
+#define charsets_table_size (sizeof(all_charsets)/sizeof(all_charsets[0]))
+#define all_charsets_count  (charsets_table_size - 1)
+#define ucs2_conv_index     (charsets_table_size - 1)
+
+static void
+init_all_charsets (void)
+{
+    Utf8Conv convptr;
+    int i;
+
+    for (convptr = all_charsets, i = charsets_table_size; i > 0; convptr++, i--)
+       convptr->xrm_name = XrmStringToQuark(convptr->name);
+}
+
+#define lazy_init_all_charsets()                                       \
+    do {                                                               \
+       if (all_charsets[0].xrm_name == NULLQUARK)                      \
+           init_all_charsets();                                        \
+    } while (0)
+
+/* from XlcNCharSet to XlcNUtf8String */
+
+static int
+cstoutf8(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    XlcCharSet charset;
+    const char *name;
+    Utf8Conv convptr;
+    int i;
+    unsigned char const *src;
+    unsigned char const *srcend;
+    unsigned char *dst;
+    unsigned char *dstend;
+    int unconv_num;
+
+    if (from == NULL || *from == NULL)
+       return 0;
+
+    if (num_args < 1)
+       return -1;
+
+    charset = (XlcCharSet) args[0];
+    name = charset->encoding_name;
+    /* not charset->name because the latter has a ":GL"/":GR" suffix */
+
+    for (convptr = all_charsets, i = all_charsets_count-1; i > 0; convptr++, i--)
+       if (!strcmp(convptr->name, name))
+           break;
+    if (i == 0)
+       return -1;
+
+    src = (unsigned char const *) *from;
+    srcend = src + *from_left;
+    dst = (unsigned char *) *to;
+    dstend = dst + *to_left;
+    unconv_num = 0;
+
+    while (src < srcend) {
+       ucs4_t wc;
+       int consumed;
+       int count;
+
+       consumed = convptr->cstowc(conv, &wc, src, srcend-src);
+       if (consumed == RET_ILSEQ)
+           return -1;
+       if (consumed == RET_TOOFEW(0))
+           break;
+
+       count = utf8_wctomb(NULL, dst, wc, dstend-dst);
+       if (count == RET_TOOSMALL)
+           break;
+       if (count == RET_ILSEQ) {
+           count = utf8_wctomb(NULL, dst, BAD_WCHAR, dstend-dst);
+           if (count == RET_TOOSMALL)
+               break;
+           unconv_num++;
+       }
+       src += consumed;
+       dst += count;
+    }
+
+    *from = (XPointer) src;
+    *from_left = srcend - src;
+    *to = (XPointer) dst;
+    *to_left = dstend - dst;
+
+    return unconv_num;
+}
+
+static XlcConvMethodsRec methods_cstoutf8 = {
+    close_converter,
+    cstoutf8,
+    NULL
+};
+
+static XlcConv
+open_cstoutf8(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    lazy_init_all_charsets();
+    return create_conv(from_lcd, &methods_cstoutf8);
+}
+
+/* from XlcNUtf8String to XlcNCharSet */
+
+static XlcConv
+create_tocs_conv(
+    XLCd lcd,
+    XlcConvMethods methods)
+{
+    XlcConv conv;
+    CodeSet *codeset_list;
+    int codeset_num;
+    int charset_num;
+    int i, j, k;
+    Utf8Conv *preferred;
+
+    lazy_init_all_charsets();
+
+    codeset_list = XLC_GENERIC(lcd, codeset_list);
+    codeset_num = XLC_GENERIC(lcd, codeset_num);
+
+    charset_num = 0;
+    for (i = 0; i < codeset_num; i++)
+       charset_num += codeset_list[i]->num_charsets;
+    if (charset_num > all_charsets_count-1)
+       charset_num = all_charsets_count-1;
+
+    conv = (XlcConv) Xmalloc(sizeof(XlcConvRec)
+                            + (charset_num + 1) * sizeof(Utf8Conv));
+    if (conv == (XlcConv) NULL)
+       return (XlcConv) NULL;
+    preferred = (Utf8Conv *) ((char *) conv + sizeof(XlcConvRec));
+
+    /* Loop through all codesets mentioned in the locale. */
+    charset_num = 0;
+    for (i = 0; i < codeset_num; i++) {
+       XlcCharSet *charsets = codeset_list[i]->charset_list;
+       int num_charsets = codeset_list[i]->num_charsets;
+       for (j = 0; j < num_charsets; j++) {
+           const char *name = charsets[j]->encoding_name;
+           /* If it wasn't already encountered... */
+           for (k = charset_num-1; k >= 0; k--)
+               if (!strcmp(preferred[k]->name, name))
+                   break;
+           if (k < 0) {
+               /* Look it up in all_charsets[]. */
+               for (k = 0; k < all_charsets_count-1; k++)
+                   if (!strcmp(all_charsets[k].name, name)) {
+                       /* Add it to the preferred set. */
+                       preferred[charset_num++] = &all_charsets[k];
+                       break;
+                   }
+           }
+       }
+    }
+    preferred[charset_num] = (Utf8Conv) NULL;
+
+    conv->methods = methods;
+    conv->state = (XPointer) preferred;
+
+    return conv;
+}
+
+static void
+close_tocs_converter(
+    XlcConv conv)
+{
+    /* conv->state is allocated together with conv, free both at once.  */
+    Xfree((char *) conv);
+}
+
+/*
+ * Converts a Unicode character to an appropriate character set. The NULL
+ * terminated array of preferred character sets is passed as first argument.
+ * If successful, *charsetp is set to the character set that was used, and
+ * *sidep is set to the character set side (XlcGL or XlcGR).
+ */
+static int
+charset_wctocs(
+    Utf8Conv *preferred,
+    Utf8Conv *charsetp,
+    XlcSide *sidep,
+    XlcConv conv,
+    unsigned char *r,
+    ucs4_t wc,
+    int n)
+{
+    int count;
+    Utf8Conv convptr;
+    int i;
+
+    for (; *preferred != (Utf8Conv) NULL; preferred++) {
+       convptr = *preferred;
+       count = convptr->wctocs(conv, r, wc, n);
+       if (count == RET_TOOSMALL)
+           return RET_TOOSMALL;
+       if (count != RET_ILSEQ) {
+           *charsetp = convptr;
+           *sidep = (*r < 0x80 ? XlcGL : XlcGR);
+           return count;
+       }
+    }
+    for (convptr = all_charsets+1, i = all_charsets_count-1; i > 0; convptr++, i--) {
+       count = convptr->wctocs(conv, r, wc, n);
+       if (count == RET_TOOSMALL)
+           return RET_TOOSMALL;
+       if (count != RET_ILSEQ) {
+           *charsetp = convptr;
+           *sidep = (*r < 0x80 ? XlcGL : XlcGR);
+           return count;
+       }
+    }
+    return RET_ILSEQ;
+}
+
+static int
+utf8tocs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    Utf8Conv *preferred_charsets;
+    XlcCharSet last_charset = NULL;
+    unsigned char const *src;
+    unsigned char const *srcend;
+    unsigned char *dst;
+    unsigned char *dstend;
+    int unconv_num;
+
+    if (from == NULL || *from == NULL)
+       return 0;
+
+    preferred_charsets = (Utf8Conv *) conv->state;
+    src = (unsigned char const *) *from;
+    srcend = src + *from_left;
+    dst = (unsigned char *) *to;
+    dstend = dst + *to_left;
+    unconv_num = 0;
+
+    while (src < srcend && dst < dstend) {
+       Utf8Conv chosen_charset = NULL;
+       XlcSide chosen_side = XlcNONE;
+       ucs4_t wc;
+       int consumed;
+       int count;
+
+       consumed = utf8_mbtowc(NULL, &wc, src, srcend-src);
+       if (consumed == RET_TOOFEW(0))
+           break;
+       if (consumed == RET_ILSEQ) {
+           src++;
+           unconv_num++;
+           continue;
+       }
+
+       count = charset_wctocs(preferred_charsets, &chosen_charset, &chosen_side, conv, dst, wc, dstend-dst);
+       if (count == RET_TOOSMALL)
+           break;
+       if (count == RET_ILSEQ) {
+           src += consumed;
+           unconv_num++;
+           continue;
+       }
+
+       if (last_charset == NULL) {
+           last_charset =
+               _XlcGetCharSetWithSide(chosen_charset->name, chosen_side);
+           if (last_charset == NULL) {
+               src += consumed;
+               unconv_num++;
+               continue;
+           }
+       } else {
+           if (!(last_charset->xrm_encoding_name == chosen_charset->xrm_name
+                 && (last_charset->side == XlcGLGR
+                     || last_charset->side == chosen_side)))
+               break;
+       }
+       src += consumed;
+       dst += count;
+    }
+
+    if (last_charset == NULL)
+       return -1;
+
+    *from = (XPointer) src;
+    *from_left = srcend - src;
+    *to = (XPointer) dst;
+    *to_left = dstend - dst;
+
+    if (num_args >= 1)
+       *((XlcCharSet *)args[0]) = last_charset;
+
+    return unconv_num;
+}
+
+static XlcConvMethodsRec methods_utf8tocs = {
+    close_tocs_converter,
+    utf8tocs,
+    NULL
+};
+
+static XlcConv
+open_utf8tocs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_tocs_conv(from_lcd, &methods_utf8tocs);
+}
+
+/* from XlcNUtf8String to XlcNChar */
+
+static int
+utf8tocs1(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    Utf8Conv *preferred_charsets;
+    XlcCharSet last_charset = NULL;
+    unsigned char const *src;
+    unsigned char const *srcend;
+    unsigned char *dst;
+    unsigned char *dstend;
+    int unconv_num;
+
+    if (from == NULL || *from == NULL)
+       return 0;
+
+    preferred_charsets = (Utf8Conv *) conv->state;
+    src = (unsigned char const *) *from;
+    srcend = src + *from_left;
+    dst = (unsigned char *) *to;
+    dstend = dst + *to_left;
+    unconv_num = 0;
+
+    while (src < srcend && dst < dstend) {
+       Utf8Conv chosen_charset = NULL;
+       XlcSide chosen_side = XlcNONE;
+       ucs4_t wc;
+       int consumed;
+       int count;
+
+       consumed = utf8_mbtowc(NULL, &wc, src, srcend-src);
+       if (consumed == RET_TOOFEW(0))
+           break;
+       if (consumed == RET_ILSEQ) {
+           src++;
+           unconv_num++;
+           continue;
+       }
+
+       count = charset_wctocs(preferred_charsets, &chosen_charset, &chosen_side, conv, dst, wc, dstend-dst);
+       if (count == RET_TOOSMALL)
+           break;
+       if (count == RET_ILSEQ) {
+           src += consumed;
+           unconv_num++;
+           continue;
+       }
+
+       if (last_charset == NULL) {
+           last_charset =
+               _XlcGetCharSetWithSide(chosen_charset->name, chosen_side);
+           if (last_charset == NULL) {
+               src += consumed;
+               unconv_num++;
+               continue;
+           }
+       } else {
+           if (!(last_charset->xrm_encoding_name == chosen_charset->xrm_name
+                 && (last_charset->side == XlcGLGR
+                     || last_charset->side == chosen_side)))
+               break;
+       }
+       src += consumed;
+       dst += count;
+       break;
+    }
+
+    if (last_charset == NULL)
+       return -1;
+
+    *from = (XPointer) src;
+    *from_left = srcend - src;
+    *to = (XPointer) dst;
+    *to_left = dstend - dst;
+
+    if (num_args >= 1)
+       *((XlcCharSet *)args[0]) = last_charset;
+
+    return unconv_num;
+}
+
+static XlcConvMethodsRec methods_utf8tocs1 = {
+    close_tocs_converter,
+    utf8tocs1,
+    NULL
+};
+
+static XlcConv
+open_utf8tocs1(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_tocs_conv(from_lcd, &methods_utf8tocs1);
+}
+
+/* from XlcNUtf8String to XlcNString */
+
+static int
+utf8tostr(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    unsigned char const *src;
+    unsigned char const *srcend;
+    unsigned char *dst;
+    unsigned char *dstend;
+    int unconv_num;
+
+    if (from == NULL || *from == NULL)
+       return 0;
+
+    src = (unsigned char const *) *from;
+    srcend = src + *from_left;
+    dst = (unsigned char *) *to;
+    dstend = dst + *to_left;
+    unconv_num = 0;
+
+    while (src < srcend) {
+       unsigned char c;
+       ucs4_t wc;
+       int consumed;
+
+       consumed = utf8_mbtowc(NULL, &wc, src, srcend-src);
+       if (consumed == RET_TOOFEW(0))
+           break;
+       if (dst == dstend)
+           break;
+       if (consumed == RET_ILSEQ) {
+           consumed = 1;
+           c = BAD_CHAR;
+           unconv_num++;
+       } else {
+           if ((wc & ~(ucs4_t)0xff) != 0) {
+               c = BAD_CHAR;
+               unconv_num++;
+           } else
+               c = (unsigned char) wc;
+       }
+       *dst++ = c;
+       src += consumed;
+    }
+
+    *from = (XPointer) src;
+    *from_left = srcend - src;
+    *to = (XPointer) dst;
+    *to_left = dstend - dst;
+
+    return unconv_num;
+}
+
+static XlcConvMethodsRec methods_utf8tostr = {
+    close_converter,
+    utf8tostr,
+    NULL
+};
+
+static XlcConv
+open_utf8tostr(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &methods_utf8tostr);
+}
+
+/* from XlcNString to XlcNUtf8String */
+
+static int
+strtoutf8(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    unsigned char const *src;
+    unsigned char const *srcend;
+    unsigned char *dst;
+    unsigned char *dstend;
+
+    if (from == NULL || *from == NULL)
+       return 0;
+
+    src = (unsigned char const *) *from;
+    srcend = src + *from_left;
+    dst = (unsigned char *) *to;
+    dstend = dst + *to_left;
+
+    while (src < srcend) {
+       int count = utf8_wctomb(NULL, dst, *src, dstend-dst);
+       if (count == RET_TOOSMALL)
+           break;
+       dst += count;
+       src++;
+    }
+
+    *from = (XPointer) src;
+    *from_left = srcend - src;
+    *to = (XPointer) dst;
+    *to_left = dstend - dst;
+
+    return 0;
+}
+
+static XlcConvMethodsRec methods_strtoutf8 = {
+    close_converter,
+    strtoutf8,
+    NULL
+};
+
+static XlcConv
+open_strtoutf8(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &methods_strtoutf8);
+}
+
+/* Support for the input methods. */
+
+XPointer
+_Utf8GetConvByName(
+    const char *name)
+{
+    XrmQuark xrm_name;
+    Utf8Conv convptr;
+    int i;
+
+    if (name == NULL)
+        return (XPointer) NULL;
+
+    lazy_init_all_charsets();
+    xrm_name = XrmStringToQuark(name);
+
+    for (convptr = all_charsets, i = all_charsets_count-1; i > 0; convptr++, i--)
+       if (convptr->xrm_name == xrm_name)
+           return (XPointer) convptr->wctocs;
+    return (XPointer) NULL;
+}
+
+/* from XlcNUcsChar to XlcNChar, needed for input methods */
+
+static XlcConv
+create_ucstocs_conv(
+    XLCd lcd,
+    XlcConvMethods methods)
+{
+
+    if (XLC_PUBLIC_PART(lcd)->codeset
+       && _XlcCompareISOLatin1(XLC_PUBLIC_PART(lcd)->codeset, "UTF-8") == 0) {
+       XlcConv conv;
+       Utf8Conv *preferred;
+
+       lazy_init_all_charsets();
+
+       conv = (XlcConv) Xmalloc(sizeof(XlcConvRec) + 2 * sizeof(Utf8Conv));
+       if (conv == (XlcConv) NULL)
+           return (XlcConv) NULL;
+       preferred = (Utf8Conv *) ((char *) conv + sizeof(XlcConvRec));
+
+       preferred[0] = &all_charsets[0]; /* ISO10646 */
+       preferred[1] = (Utf8Conv) NULL;
+
+       conv->methods = methods;
+       conv->state = (XPointer) preferred;
+
+       return conv;
+    } else {
+       return create_tocs_conv(lcd, methods);
+    }
+}
+
+static int
+charset_wctocs_exactly(
+    Utf8Conv *preferred,
+    Utf8Conv *charsetp,
+    XlcSide *sidep,
+    XlcConv conv,
+    unsigned char *r,
+    ucs4_t wc,
+    int n)
+{
+    int count;
+    Utf8Conv convptr;
+
+    for (; *preferred != (Utf8Conv) NULL; preferred++) {
+       convptr = *preferred;
+       count = convptr->wctocs(conv, r, wc, n);
+       if (count == RET_TOOSMALL)
+           return RET_TOOSMALL;
+       if (count != RET_ILSEQ) {
+           *charsetp = convptr;
+           *sidep = (*r < 0x80 ? XlcGL : XlcGR);
+           return count;
+       }
+    }
+    return RET_ILSEQ;
+}
+
+static int
+ucstocs1(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    ucs4_t const *src = (ucs4_t const *) *from;
+    unsigned char *dst = (unsigned char *) *to;
+    int unconv_num = 0;
+    Utf8Conv *preferred_charsets = (Utf8Conv *) conv->state;
+    Utf8Conv chosen_charset = NULL;
+    XlcSide chosen_side = XlcNONE;
+    XlcCharSet charset = NULL;
+    int count;
+
+    if (from == NULL || *from == NULL)
+       return 0;
+
+    count = charset_wctocs_exactly(preferred_charsets, &chosen_charset,
+                                   &chosen_side, conv, dst, *src, *to_left);
+    if (count < 1) {
+        unconv_num++;
+        count = 0;
+    } else {
+        charset = _XlcGetCharSetWithSide(chosen_charset->name, chosen_side);
+    }
+    if (charset == NULL)
+       return -1;
+
+    *from = (XPointer) ++src;
+    (*from_left)--;
+    *to = (XPointer) dst;
+    *to_left -= count;
+
+    if (num_args >= 1)
+       *((XlcCharSet *)args[0]) = charset;
+
+    return unconv_num;
+}
+
+static XlcConvMethodsRec methods_ucstocs1 = {
+    close_tocs_converter,
+    ucstocs1,
+    NULL
+};
+
+static XlcConv
+open_ucstocs1(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_ucstocs_conv(from_lcd, &methods_ucstocs1);
+}
+
+/* from XlcNUcsChar to XlcNUtf8String, needed for input methods */
+
+static int
+ucstoutf8(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    const ucs4_t *src;
+    const ucs4_t *srcend;
+    unsigned char *dst;
+    unsigned char *dstend;
+    int unconv_num;
+
+    if (from == NULL || *from == NULL)
+       return 0;
+
+    src = (const ucs4_t *) *from;
+    srcend = src + *from_left;
+    dst = (unsigned char *) *to;
+    dstend = dst + *to_left;
+    unconv_num = 0;
+
+    while (src < srcend) {
+       int count = utf8_wctomb(NULL, dst, *src, dstend-dst);
+       if (count == RET_TOOSMALL)
+           break;
+       if (count == RET_ILSEQ)
+           unconv_num++;
+       src++;
+       dst += count;
+    }
+
+    *from = (XPointer) src;
+    *from_left = srcend - src;
+    *to = (XPointer) dst;
+    *to_left = dstend - dst;
+
+    return unconv_num;
+}
+
+static XlcConvMethodsRec methods_ucstoutf8 = {
+    close_converter,
+    ucstoutf8,
+    NULL
+};
+
+static XlcConv
+open_ucstoutf8(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &methods_ucstoutf8);
+}
+
+/* Registers UTF-8 converters for a non-UTF-8 locale. */
+void
+_XlcAddUtf8Converters(
+    XLCd lcd)
+{
+    _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNUtf8String, open_cstoutf8);
+    _XlcSetConverter(lcd, XlcNUtf8String, lcd, XlcNCharSet, open_utf8tocs);
+    _XlcSetConverter(lcd, XlcNUtf8String, lcd, XlcNChar, open_utf8tocs1);
+    _XlcSetConverter(lcd, XlcNString, lcd, XlcNUtf8String, open_strtoutf8);
+    _XlcSetConverter(lcd, XlcNUtf8String, lcd, XlcNString, open_utf8tostr);
+    _XlcSetConverter(lcd, XlcNUcsChar,    lcd, XlcNChar, open_ucstocs1);
+    _XlcSetConverter(lcd, XlcNUcsChar,    lcd, XlcNUtf8String, open_ucstoutf8);
+}
+
+/***************************************************************************/
+/* Part II: UTF-8 locale loader conversion files
+ *
+ * Here we can assume that "multi-byte" is UTF-8 and that `wchar_t' is Unicode.
+ */
+
+/* from XlcNMultiByte to XlcNWideChar */
+
+static int
+utf8towcs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    unsigned char const *src;
+    unsigned char const *srcend;
+    wchar_t *dst;
+    wchar_t *dstend;
+    int unconv_num;
+
+    if (from == NULL || *from == NULL)
+       return 0;
+
+    src = (unsigned char const *) *from;
+    srcend = src + *from_left;
+    dst = (wchar_t *) *to;
+    dstend = dst + *to_left;
+    unconv_num = 0;
+
+    while (src < srcend && dst < dstend) {
+       ucs4_t wc;
+       int consumed = utf8_mbtowc(NULL, &wc, src, srcend-src);
+       if (consumed == RET_TOOFEW(0))
+           break;
+       if (consumed == RET_ILSEQ) {
+           src++;
+           *dst = BAD_WCHAR;
+           unconv_num++;
+       } else {
+           src += consumed;
+           *dst = wc;
+       }
+       dst++;
+    }
+
+    *from = (XPointer) src;
+    *from_left = srcend - src;
+    *to = (XPointer) dst;
+    *to_left = dstend - dst;
+
+    return unconv_num;
+}
+
+static XlcConvMethodsRec methods_utf8towcs = {
+    close_converter,
+    utf8towcs,
+    NULL
+};
+
+static XlcConv
+open_utf8towcs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &methods_utf8towcs);
+}
+
+/* from XlcNWideChar to XlcNMultiByte */
+
+static int
+wcstoutf8(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    wchar_t const *src;
+    wchar_t const *srcend;
+    unsigned char *dst;
+    unsigned char *dstend;
+    int unconv_num;
+
+    if (from == NULL || *from == NULL)
+       return 0;
+
+    src = (wchar_t const *) *from;
+    srcend = src + *from_left;
+    dst = (unsigned char *) *to;
+    dstend = dst + *to_left;
+    unconv_num = 0;
+
+    while (src < srcend) {
+       int count = utf8_wctomb(NULL, dst, *src, dstend-dst);
+       if (count == RET_TOOSMALL)
+           break;
+       if (count == RET_ILSEQ) {
+           count = utf8_wctomb(NULL, dst, BAD_WCHAR, dstend-dst);
+           if (count == RET_TOOSMALL)
+               break;
+           unconv_num++;
+       }
+       dst += count;
+       src++;
+    }
+
+    *from = (XPointer) src;
+    *from_left = srcend - src;
+    *to = (XPointer) dst;
+    *to_left = dstend - dst;
+
+    return unconv_num;
+}
+
+static XlcConvMethodsRec methods_wcstoutf8 = {
+    close_converter,
+    wcstoutf8,
+    NULL
+};
+
+static XlcConv
+open_wcstoutf8(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &methods_wcstoutf8);
+}
+
+/* from XlcNString to XlcNWideChar */
+
+static int
+our_strtowcs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    unsigned char const *src;
+    unsigned char const *srcend;
+    wchar_t *dst;
+    wchar_t *dstend;
+
+    if (from == NULL || *from == NULL)
+       return 0;
+
+    src = (unsigned char const *) *from;
+    srcend = src + *from_left;
+    dst = (wchar_t *) *to;
+    dstend = dst + *to_left;
+
+    while (src < srcend && dst < dstend)
+       *dst++ = (wchar_t) *src++;
+
+    *from = (XPointer) src;
+    *from_left = srcend - src;
+    *to = (XPointer) dst;
+    *to_left = dstend - dst;
+
+    return 0;
+}
+
+static XlcConvMethodsRec methods_strtowcs = {
+    close_converter,
+    our_strtowcs,
+    NULL
+};
+
+static XlcConv
+open_strtowcs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &methods_strtowcs);
+}
+
+/* from XlcNWideChar to XlcNString */
+
+static int
+our_wcstostr(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    wchar_t const *src;
+    wchar_t const *srcend;
+    unsigned char *dst;
+    unsigned char *dstend;
+    int unconv_num;
+
+    if (from == NULL || *from == NULL)
+       return 0;
+
+    src = (wchar_t const *) *from;
+    srcend = src + *from_left;
+    dst = (unsigned char *) *to;
+    dstend = dst + *to_left;
+    unconv_num = 0;
+
+    while (src < srcend && dst < dstend) {
+       unsigned int wc = *src++;
+       if (wc < 0x80)
+           *dst = wc;
+       else {
+           *dst = BAD_CHAR;
+           unconv_num++;
+       }
+       dst++;
+    }
+
+    *from = (XPointer) src;
+    *from_left = srcend - src;
+    *to = (XPointer) dst;
+    *to_left = dstend - dst;
+
+    return unconv_num;
+}
+
+static XlcConvMethodsRec methods_wcstostr = {
+    close_converter,
+    our_wcstostr,
+    NULL
+};
+
+static XlcConv
+open_wcstostr(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &methods_wcstostr);
+}
+
+/* from XlcNCharSet to XlcNWideChar */
+
+static int
+cstowcs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    XlcCharSet charset;
+    const char *name;
+    Utf8Conv convptr;
+    int i;
+    unsigned char const *src;
+    unsigned char const *srcend;
+    wchar_t *dst;
+    wchar_t *dstend;
+    int unconv_num;
+
+    if (from == NULL || *from == NULL)
+       return 0;
+
+    if (num_args < 1)
+       return -1;
+
+    charset = (XlcCharSet) args[0];
+    name = charset->encoding_name;
+    /* not charset->name because the latter has a ":GL"/":GR" suffix */
+
+    for (convptr = all_charsets, i = all_charsets_count-1; i > 0; convptr++, i--)
+       if (!strcmp(convptr->name, name))
+           break;
+    if (i == 0)
+       return -1;
+
+    src = (unsigned char const *) *from;
+    srcend = src + *from_left;
+    dst = (wchar_t *) *to;
+    dstend = dst + *to_left;
+    unconv_num = 0;
+
+    while (src < srcend && dst < dstend) {
+       unsigned int wc;
+       int consumed;
+
+       consumed = convptr->cstowc(conv, &wc, src, srcend-src);
+       if (consumed == RET_ILSEQ)
+           return -1;
+       if (consumed == RET_TOOFEW(0))
+           break;
+
+       *dst++ = wc;
+       src += consumed;
+    }
+
+    *from = (XPointer) src;
+    *from_left = srcend - src;
+    *to = (XPointer) dst;
+    *to_left = dstend - dst;
+
+    return unconv_num;
+}
+
+static XlcConvMethodsRec methods_cstowcs = {
+    close_converter,
+    cstowcs,
+    NULL
+};
+
+static XlcConv
+open_cstowcs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    lazy_init_all_charsets();
+    return create_conv(from_lcd, &methods_cstowcs);
+}
+
+/* from XlcNWideChar to XlcNCharSet */
+
+static int
+wcstocs(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    Utf8Conv *preferred_charsets;
+    XlcCharSet last_charset = NULL;
+    wchar_t const *src;
+    wchar_t const *srcend;
+    unsigned char *dst;
+    unsigned char *dstend;
+    int unconv_num;
+
+    if (from == NULL || *from == NULL)
+       return 0;
+
+    preferred_charsets = (Utf8Conv *) conv->state;
+    src = (wchar_t const *) *from;
+    srcend = src + *from_left;
+    dst = (unsigned char *) *to;
+    dstend = dst + *to_left;
+    unconv_num = 0;
+
+    while (src < srcend && dst < dstend) {
+       Utf8Conv chosen_charset = NULL;
+       XlcSide chosen_side = XlcNONE;
+       wchar_t wc = *src;
+       int count;
+
+       count = charset_wctocs(preferred_charsets, &chosen_charset, &chosen_side, conv, dst, wc, dstend-dst);
+       if (count == RET_TOOSMALL)
+           break;
+       if (count == RET_ILSEQ) {
+           src++;
+           unconv_num++;
+           continue;
+       }
+
+       if (last_charset == NULL) {
+           last_charset =
+               _XlcGetCharSetWithSide(chosen_charset->name, chosen_side);
+           if (last_charset == NULL) {
+               src++;
+               unconv_num++;
+               continue;
+           }
+       } else {
+           if (!(last_charset->xrm_encoding_name == chosen_charset->xrm_name
+                 && (last_charset->side == XlcGLGR
+                     || last_charset->side == chosen_side)))
+               break;
+       }
+       src++;
+       dst += count;
+    }
+
+    if (last_charset == NULL)
+       return -1;
+
+    *from = (XPointer) src;
+    *from_left = srcend - src;
+    *to = (XPointer) dst;
+    *to_left = dstend - dst;
+
+    if (num_args >= 1)
+       *((XlcCharSet *)args[0]) = last_charset;
+
+    return unconv_num;
+}
+
+static XlcConvMethodsRec methods_wcstocs = {
+    close_tocs_converter,
+    wcstocs,
+    NULL
+};
+
+static XlcConv
+open_wcstocs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_tocs_conv(from_lcd, &methods_wcstocs);
+}
+
+/* from XlcNWideChar to XlcNChar */
+
+static int
+wcstocs1(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    Utf8Conv *preferred_charsets;
+    XlcCharSet last_charset = NULL;
+    wchar_t const *src;
+    wchar_t const *srcend;
+    unsigned char *dst;
+    unsigned char *dstend;
+    int unconv_num;
+
+    if (from == NULL || *from == NULL)
+       return 0;
+
+    preferred_charsets = (Utf8Conv *) conv->state;
+    src = (wchar_t const *) *from;
+    srcend = src + *from_left;
+    dst = (unsigned char *) *to;
+    dstend = dst + *to_left;
+    unconv_num = 0;
+
+    while (src < srcend && dst < dstend) {
+       Utf8Conv chosen_charset = NULL;
+       XlcSide chosen_side = XlcNONE;
+       wchar_t wc = *src;
+       int count;
+
+       count = charset_wctocs(preferred_charsets, &chosen_charset, &chosen_side, conv, dst, wc, dstend-dst);
+       if (count == RET_TOOSMALL)
+           break;
+       if (count == RET_ILSEQ) {
+           src++;
+           unconv_num++;
+           continue;
+       }
+
+       if (last_charset == NULL) {
+           last_charset =
+               _XlcGetCharSetWithSide(chosen_charset->name, chosen_side);
+           if (last_charset == NULL) {
+               src++;
+               unconv_num++;
+               continue;
+           }
+       } else {
+           if (!(last_charset->xrm_encoding_name == chosen_charset->xrm_name
+                 && (last_charset->side == XlcGLGR
+                     || last_charset->side == chosen_side)))
+               break;
+       }
+       src++;
+       dst += count;
+       break;
+    }
+
+    if (last_charset == NULL)
+       return -1;
+
+    *from = (XPointer) src;
+    *from_left = srcend - src;
+    *to = (XPointer) dst;
+    *to_left = dstend - dst;
+
+    if (num_args >= 1)
+       *((XlcCharSet *)args[0]) = last_charset;
+
+    return unconv_num;
+}
+
+static XlcConvMethodsRec methods_wcstocs1 = {
+    close_tocs_converter,
+    wcstocs1,
+    NULL
+};
+
+static XlcConv
+open_wcstocs1(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_tocs_conv(from_lcd, &methods_wcstocs1);
+}
+
+/* trivial, no conversion */
+
+static int
+identity(
+    XlcConv conv,
+    XPointer *from,
+    int *from_left,
+    XPointer *to,
+    int *to_left,
+    XPointer *args,
+    int num_args)
+{
+    unsigned char const *src;
+    unsigned char const *srcend;
+    unsigned char *dst;
+    unsigned char *dstend;
+
+    if (from == NULL || *from == NULL)
+       return 0;
+
+    src = (unsigned char const *) *from;
+    srcend = src + *from_left;
+    dst = (unsigned char *) *to;
+    dstend = dst + *to_left;
+
+    while (src < srcend && dst < dstend)
+       *dst++ = *src++;
+
+    *from = (XPointer) src;
+    *from_left = srcend - src;
+    *to = (XPointer) dst;
+    *to_left = dstend - dst;
+
+    return 0;
+}
+
+static XlcConvMethodsRec methods_identity = {
+    close_converter,
+    identity,
+    NULL
+};
+
+static XlcConv
+open_identity(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_conv(from_lcd, &methods_identity);
+}
+
+/* from MultiByte/WideChar to FontCharSet. */
+/* They really use converters to CharSet
+ * but with different create_conv procedure. */
+
+static XlcConv
+create_tofontcs_conv(
+    XLCd lcd,
+    XlcConvMethods methods)
+{
+    XlcConv conv;
+    int i, num, k, count;
+    char **value, buf[20];
+    Utf8Conv *preferred;
+
+    lazy_init_all_charsets();
+
+    for (i = 0, num = 0;; i++) {
+       sprintf(buf, "fs%d.charset.name", i);
+       _XlcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
+       if (count < 1) {
+           sprintf(buf, "fs%d.charset", i);
+           _XlcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
+           if (count < 1)
+               break;
+       }
+       num += count;
+    }
+
+    conv = (XlcConv) Xmalloc(sizeof(XlcConvRec) + (num + 1) * sizeof(Utf8Conv));
+    if (conv == (XlcConv) NULL)
+       return (XlcConv) NULL;
+    preferred = (Utf8Conv *) ((char *) conv + sizeof(XlcConvRec));
+
+    /* Loop through all fontsets mentioned in the locale. */
+    for (i = 0, num = 0;; i++) {
+        sprintf(buf, "fs%d.charset.name", i);
+        _XlcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
+        if (count < 1) {
+            sprintf(buf, "fs%d.charset", i);
+            _XlcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
+            if (count < 1)
+                break;
+        }
+       while (count-- > 0) {
+           XlcCharSet charset = _XlcGetCharSet(*value++);
+           const char *name;
+
+           if (charset == (XlcCharSet) NULL)
+               continue;
+
+           name = charset->encoding_name;
+           /* If it wasn't already encountered... */
+           for (k = num - 1; k >= 0; k--)
+               if (!strcmp(preferred[k]->name, name))
+                   break;
+           if (k < 0) {
+                /* For fonts "ISO10646-1" means ucs2, not utf8.*/
+                if (!strcmp("ISO10646-1", name)) {
+                    preferred[num++] = &all_charsets[ucs2_conv_index];
+                    continue;
+                }
+               /* Look it up in all_charsets[]. */
+               for (k = 0; k < all_charsets_count-1; k++)
+                   if (!strcmp(all_charsets[k].name, name)) {
+                       /* Add it to the preferred set. */
+                       preferred[num++] = &all_charsets[k];
+                       break;
+                   }
+           }
+        }
+    }
+    preferred[num] = (Utf8Conv) NULL;
+
+    conv->methods = methods;
+    conv->state = (XPointer) preferred;
+
+    return conv;
+}
+
+static XlcConv
+open_wcstofcs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_tofontcs_conv(from_lcd, &methods_wcstocs);
+}
+
+static XlcConv
+open_utf8tofcs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_tofontcs_conv(from_lcd, &methods_utf8tocs);
+}
+
+/* ========================== iconv Stuff ================================ */
+
+/* from XlcNCharSet to XlcNMultiByte */
+
+static int
+iconv_cstombs(XlcConv conv, XPointer *from, int *from_left,
+             XPointer *to, int *to_left, XPointer *args, int num_args)
+{
+    XlcCharSet charset;
+    char const *name;
+    Utf8Conv convptr;
+    int i;
+    unsigned char const *src;
+    unsigned char const *srcend;
+    unsigned char *dst;
+    unsigned char *dstend;
+    int unconv_num;
+
+    if (from == NULL || *from == NULL)
+       return 0;
+
+    if (num_args < 1)
+       return -1;
+
+    charset = (XlcCharSet) args[0];
+    name = charset->encoding_name;
+    /* not charset->name because the latter has a ":GL"/":GR" suffix */
+
+    for (convptr = all_charsets, i = all_charsets_count-1; i > 0; convptr++, i--)
+       if (!strcmp(convptr->name, name))
+           break;
+    if (i == 0)
+       return -1;
+
+    src = (unsigned char const *) *from;
+    srcend = src + *from_left;
+    dst = (unsigned char *) *to;
+    dstend = dst + *to_left;
+    unconv_num = 0;
+
+    while (src < srcend) {
+       ucs4_t wc;
+       int consumed;
+       int count;
+
+       consumed = convptr->cstowc(conv, &wc, src, srcend-src);
+       if (consumed == RET_ILSEQ)
+           return -1;
+       if (consumed == RET_TOOFEW(0))
+           break;
+
+    /* Use stdc iconv to convert widechar -> multibyte */
+
+       count = wctomb((char *)dst, wc);
+       if (count == 0)
+           break;
+       if (count == -1) {
+           count = wctomb((char *)dst, BAD_WCHAR);
+           if (count == 0)
+               break;
+           unconv_num++;
+       }
+       src += consumed;
+       dst += count;
+    }
+
+    *from = (XPointer) src;
+    *from_left = srcend - src;
+    *to = (XPointer) dst;
+    *to_left = dstend - dst;
+
+    return unconv_num;
+
+}
+
+static XlcConvMethodsRec iconv_cstombs_methods = {
+    close_converter,
+    iconv_cstombs,
+    NULL
+};
+
+static XlcConv
+open_iconv_cstombs(XLCd from_lcd, const char *from_type, XLCd to_lcd, const char *to_type)
+{
+    lazy_init_all_charsets();
+    return create_conv(from_lcd, &iconv_cstombs_methods);
+}
+
+static int
+iconv_mbstocs(XlcConv conv, XPointer *from, int *from_left,
+             XPointer *to, int *to_left, XPointer *args, int num_args)
+{
+    Utf8Conv *preferred_charsets;
+    XlcCharSet last_charset = NULL;
+    unsigned char const *src;
+    unsigned char const *srcend;
+    unsigned char *dst;
+    unsigned char *dstend;
+    int unconv_num;
+
+    if (from == NULL || *from == NULL)
+       return 0;
+
+    preferred_charsets = (Utf8Conv *) conv->state;
+    src = (unsigned char const *) *from;
+    srcend = src + *from_left;
+    dst = (unsigned char *) *to;
+    dstend = dst + *to_left;
+    unconv_num = 0;
+
+    while (src < srcend && dst < dstend) {
+       Utf8Conv chosen_charset = NULL;
+       XlcSide chosen_side = XlcNONE;
+       wchar_t wc;
+       int consumed;
+       int count;
+
+    /* Uses stdc iconv to convert multibyte -> widechar */
+
+       consumed = mbtowc(&wc, (const char *)src, srcend-src);
+       if (consumed == 0)
+           break;
+       if (consumed == -1) {
+           src++;
+           unconv_num++;
+           continue;
+       }
+
+       count = charset_wctocs(preferred_charsets, &chosen_charset, &chosen_side, conv, dst, wc, dstend-dst);
+
+       if (count == RET_TOOSMALL)
+           break;
+       if (count == RET_ILSEQ) {
+           src += consumed;
+           unconv_num++;
+           continue;
+       }
+
+       if (last_charset == NULL) {
+           last_charset =
+               _XlcGetCharSetWithSide(chosen_charset->name, chosen_side);
+           if (last_charset == NULL) {
+               src += consumed;
+               unconv_num++;
+               continue;
+           }
+       } else {
+           if (!(last_charset->xrm_encoding_name == chosen_charset->xrm_name
+                 && (last_charset->side == XlcGLGR
+                     || last_charset->side == chosen_side)))
+               break;
+       }
+       src += consumed;
+       dst += count;
+    }
+
+    if (last_charset == NULL)
+       return -1;
+
+    *from = (XPointer) src;
+    *from_left = srcend - src;
+    *to = (XPointer) dst;
+    *to_left = dstend - dst;
+
+    if (num_args >= 1)
+       *((XlcCharSet *)args[0]) = last_charset;
+
+    return unconv_num;
+}
+
+static XlcConvMethodsRec iconv_mbstocs_methods = {
+    close_tocs_converter,
+    iconv_mbstocs,
+    NULL
+};
+
+static XlcConv
+open_iconv_mbstocs(XLCd from_lcd, const char *from_type, XLCd to_lcd, const char *to_type)
+{
+    return create_tocs_conv(from_lcd, &iconv_mbstocs_methods);
+}
+
+/* from XlcNMultiByte to XlcNChar */
+
+static int
+iconv_mbtocs(XlcConv conv, XPointer *from, int *from_left,
+            XPointer *to, int *to_left, XPointer *args, int num_args)
+{
+    Utf8Conv *preferred_charsets;
+    XlcCharSet last_charset = NULL;
+    unsigned char const *src;
+    unsigned char const *srcend;
+    unsigned char *dst;
+    unsigned char *dstend;
+    int unconv_num;
+
+    if (from == NULL || *from == NULL)
+       return 0;
+
+    preferred_charsets = (Utf8Conv *) conv->state;
+    src = (unsigned char const *) *from;
+    srcend = src + *from_left;
+    dst = (unsigned char *) *to;
+    dstend = dst + *to_left;
+    unconv_num = 0;
+
+    while (src < srcend && dst < dstend) {
+       Utf8Conv chosen_charset = NULL;
+       XlcSide chosen_side = XlcNONE;
+       wchar_t wc;
+       int consumed;
+       int count;
+
+    /* Uses stdc iconv to convert multibyte -> widechar */
+
+       consumed = mbtowc(&wc, (const char *)src, srcend-src);
+       if (consumed == 0)
+           break;
+       if (consumed == -1) {
+           src++;
+           unconv_num++;
+           continue;
+       }
+
+       count = charset_wctocs(preferred_charsets, &chosen_charset, &chosen_side, conv, dst, wc, dstend-dst);
+       if (count == RET_TOOSMALL)
+           break;
+       if (count == RET_ILSEQ) {
+           src += consumed;
+           unconv_num++;
+           continue;
+       }
+
+       if (last_charset == NULL) {
+           last_charset =
+               _XlcGetCharSetWithSide(chosen_charset->name, chosen_side);
+           if (last_charset == NULL) {
+               src += consumed;
+               unconv_num++;
+               continue;
+           }
+       } else {
+           if (!(last_charset->xrm_encoding_name == chosen_charset->xrm_name
+                 && (last_charset->side == XlcGLGR
+                     || last_charset->side == chosen_side)))
+               break;
+       }
+       src += consumed;
+       dst += count;
+    }
+
+    if (last_charset == NULL)
+       return -1;
+
+    *from = (XPointer) src;
+    *from_left = srcend - src;
+    *to = (XPointer) dst;
+    *to_left = dstend - dst;
+
+    if (num_args >= 1)
+       *((XlcCharSet *)args[0]) = last_charset;
+
+    return unconv_num;
+}
+
+static XlcConvMethodsRec iconv_mbtocs_methods = {
+    close_tocs_converter,
+    iconv_mbtocs,
+    NULL
+};
+
+static XlcConv
+open_iconv_mbtocs(XLCd from_lcd, const char *from_type, XLCd to_lcd, const char *to_type)
+{
+    return create_tocs_conv(from_lcd, &iconv_mbtocs_methods );
+}
+
+/* from XlcNMultiByte to XlcNString */
+
+static int
+iconv_mbstostr(XlcConv conv, XPointer *from, int *from_left,
+              XPointer *to, int *to_left, XPointer *args, int num_args)
+{
+    unsigned char const *src;
+    unsigned char const *srcend;
+    unsigned char *dst;
+    unsigned char *dstend;
+    int unconv_num;
+
+    if (from == NULL || *from == NULL)
+       return 0;
+
+    src = (unsigned char const *) *from;
+    srcend = src + *from_left;
+    dst = (unsigned char *) *to;
+    dstend = dst + *to_left;
+    unconv_num = 0;
+
+    while (src < srcend) {
+       unsigned char c;
+       wchar_t wc;
+       int consumed;
+
+    /* Uses stdc iconv to convert multibyte -> widechar */
+
+       consumed = mbtowc(&wc, (const char *)src, srcend-src);
+       if (consumed == 0)
+           break;
+       if (dst == dstend)
+           break;
+       if (consumed == -1) {
+           consumed = 1;
+           c = BAD_CHAR;
+           unconv_num++;
+       } else {
+           if ((wc & ~(wchar_t)0xff) != 0) {
+               c = BAD_CHAR;
+               unconv_num++;
+           } else
+               c = (unsigned char) wc;
+       }
+       *dst++ = c;
+       src += consumed;
+    }
+
+    *from = (XPointer) src;
+    *from_left = srcend - src;
+    *to = (XPointer) dst;
+    *to_left = dstend - dst;
+
+    return unconv_num;
+}
+
+static XlcConvMethodsRec iconv_mbstostr_methods = {
+    close_converter,
+    iconv_mbstostr,
+    NULL
+};
+
+static XlcConv
+open_iconv_mbstostr(XLCd from_lcd, const char *from_type, XLCd to_lcd, const char *to_type)
+{
+    return create_conv(from_lcd, &iconv_mbstostr_methods);
+}
+
+/* from XlcNString to XlcNMultiByte */
+static int
+iconv_strtombs(XlcConv conv, XPointer *from, int *from_left,
+              XPointer *to, int *to_left, XPointer *args, int num_args)
+{
+    unsigned char const *src;
+    unsigned char const *srcend;
+    unsigned char *dst;
+    unsigned char *dstend;
+
+    if (from == NULL || *from == NULL)
+       return 0;
+
+    src = (unsigned char const *) *from;
+    srcend = src + *from_left;
+    dst = (unsigned char *) *to;
+    dstend = dst + *to_left;
+
+    while (src < srcend) {
+       int count = wctomb((char *)dst, *src);
+       if (count < 0)
+           break;
+       dst += count;
+       src++;
+    }
+
+    *from = (XPointer) src;
+    *from_left = srcend - src;
+    *to = (XPointer) dst;
+    *to_left = dstend - dst;
+
+    return 0;
+}
+
+static XlcConvMethodsRec iconv_strtombs_methods= {
+    close_converter,
+    iconv_strtombs,
+    NULL
+};
+
+static XlcConv
+open_iconv_strtombs(XLCd from_lcd, const char *from_type, XLCd to_lcd, const char *to_type)
+{
+    return create_conv(from_lcd, &iconv_strtombs_methods);
+}
+
+/***************************************************************************/
+/* Part II: An iconv locale loader.
+ *
+ *Here we can assume that "multi-byte" is iconv and that `wchar_t' is Unicode.
+ */
+
+/* from XlcNMultiByte to XlcNWideChar */
+static int
+iconv_mbstowcs(XlcConv conv, XPointer *from, int *from_left,
+              XPointer *to, int *to_left, XPointer *args,  int num_args)
+{
+    char *src = *((char **) from);
+    wchar_t *dst = *((wchar_t **) to);
+    int src_left = *from_left;
+    int dst_left = *to_left;
+    int length, unconv_num = 0;
+
+    while (src_left > 0 && dst_left > 0) {
+       length = mbtowc(dst, src, src_left);
+
+       if (length > 0) {
+           src += length;
+           src_left -= length;
+           if (dst)
+               dst++;
+           dst_left--;
+       } else if (length < 0) {
+           src++;
+           src_left--;
+           unconv_num++;
+        } else {
+            /* null ? */
+            src++;
+            src_left--;
+            if (dst) 
+                *dst++ = L'\0';
+            dst_left--;
+        }
+    }
+
+    *from = (XPointer) src;
+    if (dst)
+       *to = (XPointer) dst;
+    *from_left = src_left;
+    *to_left = dst_left;
+
+    return unconv_num;
+}
+
+static XlcConvMethodsRec iconv_mbstowcs_methods = {
+    close_converter,
+    iconv_mbstowcs,
+    NULL
+} ;
+
+static XlcConv
+open_iconv_mbstowcs(XLCd from_lcd, const char *from_type, XLCd to_lcd, const char *to_type)
+{
+    return create_conv(from_lcd, &iconv_mbstowcs_methods);
+}
+
+static int
+iconv_wcstombs(XlcConv conv, XPointer *from, int *from_left,
+              XPointer *to, int *to_left, XPointer *args, int num_args)
+{
+    wchar_t *src = *((wchar_t **) from);
+    char *dst = *((char **) to);
+    int src_left = *from_left;
+    int dst_left = *to_left;
+    int length, unconv_num = 0;
+
+    while (src_left > 0 && dst_left >= MB_CUR_MAX) { 
+       length = wctomb(dst, *src);             /* XXX */
+
+        if (length > 0) {
+           src++;
+           src_left--;
+           if (dst) 
+               dst += length;
+           dst_left -= length;
+       } else if (length < 0) {
+           src++;
+           src_left--;
+           unconv_num++;
+       } 
+    }
+
+    *from = (XPointer) src;
+    if (dst)
+      *to = (XPointer) dst;
+    *from_left = src_left;
+    *to_left = dst_left;
+
+    return unconv_num;
+}
+
+static XlcConvMethodsRec iconv_wcstombs_methods = {
+    close_converter,
+    iconv_wcstombs,
+    NULL
+} ;
+
+static XlcConv
+open_iconv_wcstombs(XLCd from_lcd, const char *from_type, XLCd to_lcd, const char *to_type)
+{
+    return create_conv(from_lcd, &iconv_wcstombs_methods);
+}
+
+static XlcConv
+open_iconv_mbstofcs(
+    XLCd from_lcd,
+    const char *from_type,
+    XLCd to_lcd,
+    const char *to_type)
+{
+    return create_tofontcs_conv(from_lcd, &iconv_mbstocs_methods);
+}
+
+/* Registers UTF-8 converters for a UTF-8 locale. */
+
+void
+_XlcAddUtf8LocaleConverters(
+    XLCd lcd)
+{
+    /* Register elementary converters. */
+
+    _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNWideChar, open_utf8towcs);
+
+    _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNMultiByte, open_wcstoutf8);
+    _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNString, open_wcstostr);
+
+    _XlcSetConverter(lcd, XlcNString, lcd, XlcNWideChar, open_strtowcs);
+
+    /* Register converters for XlcNCharSet. This implicitly provides
+     * converters from and to XlcNCompoundText. */
+
+    _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNMultiByte, open_cstoutf8);
+    _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCharSet, open_utf8tocs);
+    _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNChar, open_utf8tocs1);
+
+    _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNWideChar, open_cstowcs);
+    _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCharSet, open_wcstocs);
+    _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNChar, open_wcstocs1);
+
+    _XlcSetConverter(lcd, XlcNString, lcd, XlcNMultiByte, open_strtoutf8);
+    _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNString, open_utf8tostr);
+    _XlcSetConverter(lcd, XlcNUtf8String, lcd, XlcNMultiByte, open_identity);
+    _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNUtf8String, open_identity);
+
+    /* Register converters for XlcNFontCharSet */
+    _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNFontCharSet, open_utf8tofcs);
+    _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNFontCharSet, open_wcstofcs);
+}
+
+void
+_XlcAddGB18030LocaleConverters(
+    XLCd lcd)
+{
+
+    /* Register elementary converters. */
+    _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNWideChar, open_iconv_mbstowcs);
+    _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNMultiByte, open_iconv_wcstombs);
+
+    /* Register converters for XlcNCharSet. This implicitly provides
+     * converters from and to XlcNCompoundText. */
+
+    _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNMultiByte, open_iconv_cstombs);
+    _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNCharSet, open_iconv_mbstocs);
+    _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNChar, open_iconv_mbtocs);
+    _XlcSetConverter(lcd, XlcNString, lcd, XlcNMultiByte, open_iconv_strtombs);
+    _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNString, open_iconv_mbstostr);
+
+    /* Register converters for XlcNFontCharSet */
+    _XlcSetConverter(lcd, XlcNMultiByte, lcd, XlcNFontCharSet, open_iconv_mbstofcs);
+
+    _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNString, open_wcstostr);
+    _XlcSetConverter(lcd, XlcNString, lcd, XlcNWideChar, open_strtowcs);
+    _XlcSetConverter(lcd, XlcNCharSet, lcd, XlcNWideChar, open_cstowcs);
+    _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNCharSet, open_wcstocs);
+    _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNChar, open_wcstocs1);
+
+    /* Register converters for XlcNFontCharSet */
+    _XlcSetConverter(lcd, XlcNWideChar, lcd, XlcNFontCharSet, open_wcstofcs);
+}
diff --git a/src/xlibi18n/lcUniConv/8bit_tab_to_h.c b/src/xlibi18n/lcUniConv/8bit_tab_to_h.c
new file mode 100644 (file)
index 0000000..1caa28a
--- /dev/null
@@ -0,0 +1,535 @@
+
+/*
+ * Generates an 8-bit character set table from a .TXT table as found on
+ * ftp.unicode.org or from a table containing the 256 Unicode values as
+ * hexadecimal integers.
+ * Examples:
+ *
+ *   ./8bit_tab_to_h ISO-8859-1 iso8859_1 < tab8859_1
+ *   ./8bit_tab_to_h ISO-8859-2 iso8859_2 < tab8859_2
+ *   ./8bit_tab_to_h ISO-8859-3 iso8859_3 < tab8859_3
+ *   ./8bit_tab_to_h ISO-8859-4 iso8859_4 < tab8859_4
+ *   ./8bit_tab_to_h ISO-8859-5 iso8859_5 < tab8859_5
+ *   ./8bit_tab_to_h ISO-8859-6 iso8859_6 < tab8859_6
+ *   ./8bit_tab_to_h ISO-8859-7 iso8859_7 < tab8859_7
+ *   ./8bit_tab_to_h ISO-8859-8 iso8859_8 < tab8859_8
+ *   ./8bit_tab_to_h ISO-8859-9 iso8859_9 < tab8859_9
+ *   ./8bit_tab_to_h ISO-8859-10 iso8859_10 < tab8859_10
+ *   ./8bit_tab_to_h ISO-8859-14 iso8859_14 < tab8859_14
+ *   ./8bit_tab_to_h ISO-8859-15 iso8859_15 < tab8859_15
+ *   ./8bit_tab_to_h JISX0201.1976-0 jisx0201 < jis0201
+ *   ./8bit_tab_to_h TIS620-0 tis620 < tabtis620
+ *   ./8bit_tab_to_h KOI8-R koi8_r < tabkoi8_r
+ *   ./8bit_tab_to_h KOI8-U koi8_u < tabkoi8_u
+ *   ./8bit_tab_to_h ARMSCII-8 armscii_8 < tabarmscii_8
+ *   ./8bit_tab_to_h CP1133 cp1133 < tabibm_cp1133
+ *   ./8bit_tab_to_h MULELAO-1 mulelao < tabmulelao_1
+ *   ./8bit_tab_to_h VISCII1.1-1 viscii1 < tabviscii
+ *   ./8bit_tab_to_h TCVN-5712 tcvn < tabtcvn
+ *   ./8bit_tab_to_h GEORGIAN-ACADEMY georgian_ac < tabgeorgian_academy
+ *   ./8bit_tab_to_h GEORGIAN-PS georgian_ps < tabgeorgian_ps
+ *
+ *   ./8bit_tab_to_h ISO-8859-1 iso8859_1 < 8859-1.TXT
+ *   ./8bit_tab_to_h ISO-8859-2 iso8859_2 < 8859-2.TXT
+ *   ./8bit_tab_to_h ISO-8859-3 iso8859_3 < 8859-3.TXT
+ *   ./8bit_tab_to_h ISO-8859-4 iso8859_4 < 8859-4.TXT
+ *   ./8bit_tab_to_h ISO-8859-5 iso8859_5 < 8859-5.TXT
+ *   ./8bit_tab_to_h ISO-8859-6 iso8859_6 < 8859-6.TXT
+ *   ./8bit_tab_to_h ISO-8859-7 iso8859_7 < 8859-7.TXT
+ *   ./8bit_tab_to_h ISO-8859-8 iso8859_8 < 8859-8.TXT
+ *   ./8bit_tab_to_h ISO-8859-9 iso8859_9 < 8859-9.TXT
+ *   ./8bit_tab_to_h ISO-8859-10 iso8859_10 < 8859-10.TXT
+ *   ./8bit_tab_to_h ISO-8859-14 iso8859_14 < 8859-14.TXT
+ *   ./8bit_tab_to_h ISO-8859-15 iso8859_15 < 8859-15.TXT
+ *   ./8bit_tab_to_h JISX0201.1976-0 jisx0201 < JIS0201.TXT
+ *   ./8bit_tab_to_h KOI8-R koi8_r < KOI8-R.TXT
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <string.h>
+
+int main (int argc, char *argv[])
+{
+  const char* charsetname;
+  const char* c_charsetname;
+  const char* filename;
+  const char* directory;
+  int charset2uni[0x100];
+
+  if (argc != 3 && argc != 4 && argc != 5)
+    exit(1);
+  charsetname = argv[1];
+  c_charsetname = argv[2];
+  if (argc > 3) {
+    filename = argv[3];
+  } else {
+    char* s = (char*) malloc(strlen(c_charsetname)+strlen(".h")+1);
+    strcpy(s,c_charsetname); strcat(s,".h");
+    filename = s;
+  }
+  directory = (argc > 4 ? argv[4] : "");
+
+  fprintf(stderr, "Creating %s%s\n", directory, filename);
+
+  {
+    int i, c;
+    c = getc(stdin);
+    ungetc(c,stdin);
+    if (c == '#') {
+      /* Read a unicode.org style .TXT file. */
+      for (i = 0; i < 0x100; i++)
+        charset2uni[i] = 0xfffd;
+      for (;;) {
+        c = getc(stdin);
+        if (c == EOF)
+          break;
+        if (c == '\n' || c == ' ' || c == '\t')
+          continue;
+        if (c == '#') {
+          do { c = getc(stdin); } while (!(c == EOF || c == '\n'));
+          continue;
+        }
+        ungetc(c,stdin);
+        if (scanf("0x%x", &i) != 1 || !(i >= 0 && i < 0x100))
+          exit(1);
+        do { c = getc(stdin); } while (c == ' ' || c == '\t');
+        if (c != EOF)
+          ungetc(c,stdin);
+        if (c == '\n' || c == '#')
+          continue;
+        if (scanf("0x%x", &charset2uni[i]) != 1)
+          exit(1);
+      }
+    } else {
+      /* Read a table of hexadecimal Unicode values. */
+      for (i = 0; i < 0x100; i++) {
+        if (scanf("%x", &charset2uni[i]) != 1)
+          exit(1);
+        if (charset2uni[i] < 0 || charset2uni[i] == 0xffff)
+          charset2uni[i] = 0xfffd;
+      }
+      if (scanf("%x", &i) != EOF)
+        exit(1);
+    }
+  }
+
+  /* Write the output file. */
+  {
+    FILE* f;
+
+    {
+      char* fname = malloc(strlen(directory)+strlen(filename)+1);
+      strcpy(fname,directory); strcat(fname,filename);
+      f = fopen(fname,"w");
+      if (f == NULL)
+        exit(1);
+    }
+
+    fprintf(f, "\n");
+    fprintf(f, "/*\n");
+    fprintf(f, " * %s\n", charsetname);
+    fprintf(f, " */\n");
+    fprintf(f, "\n");
+
+    {
+      int i, i1, i2, i3;
+      int line[16];
+      int tableno;
+      struct { int minline; int maxline; } tables[16];
+      bool some_invalid;
+      bool final_ret_reached;
+
+      for (i1 = 0; i1 < 16; i1++) {
+        bool all_invalid = true;
+        bool all_identity = true;
+        for (i2 = 0; i2 < 16; i2++) {
+          i = 16*i1+i2;
+          if (charset2uni[i] != 0xfffd)
+            all_invalid = false;
+          if (charset2uni[i] != i)
+            all_identity = false;
+        }
+        if (all_invalid)
+          line[i1] = -2;
+        else if (all_identity)
+          line[i1] = -1;
+        else
+          line[i1] = 0;
+      }
+      tableno = 0;
+      for (i1 = 0; i1 < 16; i1++) {
+        if (line[i1] >= 0) {
+          if (i1 > 0 && tableno > 0 && line[i1-1] == tableno-1) {
+            line[i1] = tableno-1;
+            tables[tableno-1].maxline = i1;
+          } else {
+            tableno++;
+            line[i1] = tableno-1;
+            tables[tableno-1].minline = tables[tableno-1].maxline = i1;
+          }
+        }
+      }
+      some_invalid = false;
+      for (i = 0; i < 0x100; i++)
+        if (charset2uni[i] == 0xfffd)
+          some_invalid = true;
+      if (tableno > 0) {
+        int t;
+        for (t = 0; t < tableno; t++) {
+          fprintf(f, "static const unsigned short %s_2uni", c_charsetname);
+          if (tableno > 1)
+            fprintf(f, "_%d", t+1);
+          fprintf(f, "[%d] = {\n", 16*(tables[t].maxline-tables[t].minline+1));
+          for (i1 = tables[t].minline; i1 <= tables[t].maxline; i1++) {
+            fprintf(f, "  /* 0x%02x */\n", 16*i1);
+            for (i2 = 0; i2 < 2; i2++) {
+              fprintf(f, " ");
+              for (i3 = 0; i3 < 8; i3++) {
+                i = 16*i1+8*i2+i3;
+                fprintf(f, " 0x%04x,", charset2uni[i]);
+              }
+              fprintf(f, "\n");
+            }
+          }
+          fprintf(f, "};\n");
+        }
+        fprintf(f, "\n");
+      }
+      final_ret_reached = false;
+      fprintf(f, "static int\n%s_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)\n", c_charsetname);
+      fprintf(f, "{\n");
+      fprintf(f, "  unsigned char c = *s;\n");
+      if (some_invalid) {
+        for (i1 = 0; i1 < 16;) {
+          int t = line[i1];
+          const char* indent;
+          for (i2 = i1; i2 < 16 && line[i2] == t; i2++);
+          indent = (i1 == 0 && i2 == 16 ? "  " : "    ");
+          if (i1 == 0) {
+            if (i2 == 16) {
+            } else {
+              fprintf(f, "  if (c < 0x%02x) {\n", 16*i2);
+            }
+          } else {
+            if (i2 == 16) {
+              fprintf(f, "  else {\n");
+            } else {
+              fprintf(f, "  else if (c < 0x%02x) {\n", 16*i2);
+            }
+          }
+          if (t == -2) {
+            final_ret_reached = true;
+          } else if (t == -1) {
+            fprintf(f, "%s*pwc = (ucs4_t) c;\n", indent);
+            fprintf(f, "%sreturn 1;\n", indent);
+          } else {
+            fprintf(f, "%s", indent);
+            some_invalid = false;
+            for (i = 16*i1; i < 16*i2; i++)
+              if (charset2uni[i] == 0xfffd)
+                some_invalid = true;
+            if (some_invalid)
+              fprintf(f, "unsigned short wc = ");
+            else
+              fprintf(f, "*pwc = (ucs4_t) ");
+            fprintf(f, "%s_2uni", c_charsetname);
+            if (tableno > 1)
+              fprintf(f, "_%d", t+1);
+            fprintf(f, "[c");
+            if (tables[t].minline > 0)
+              fprintf(f, "-0x%02x", 16*tables[t].minline);
+            fprintf(f, "];\n");
+            if (some_invalid) {
+              fprintf(f, "%sif (wc != 0xfffd) {\n", indent);
+              fprintf(f, "%s  *pwc = (ucs4_t) wc;\n", indent);
+              fprintf(f, "%s  return 1;\n", indent);
+              fprintf(f, "%s}\n", indent);
+              final_ret_reached = true;
+            } else {
+              fprintf(f, "%sreturn 1;\n", indent);
+            }
+          }
+          if (!(i1 == 0 && i2 == 16))
+            fprintf(f, "  }\n");
+          i1 = i2;
+        }
+        if (final_ret_reached)
+          fprintf(f, "  return RET_ILSEQ;\n");
+      } else {
+        for (i1 = 0; i1 < 16;) {
+          int t = line[i1];
+          for (i2 = i1; i2 < 16 && line[i2] == t; i2++);
+          if (i1 == 0) {
+            if (i2 == 16) {
+              fprintf(f, "  ");
+            } else {
+              fprintf(f, "  if (c < 0x%02x)\n    ", 16*i2);
+            }
+          } else {
+            if (i2 == 16) {
+              fprintf(f, "  else\n    ");
+            } else {
+              fprintf(f, "  else if (c < 0x%02x)\n    ", 16*i2);
+            }
+          }
+          if (t == -1)
+            fprintf(f, "*pwc = (ucs4_t) c;\n");
+          else {
+            fprintf(f, "*pwc = (ucs4_t) %s_2uni", c_charsetname);
+            if (tableno > 1)
+              fprintf(f, "_%d", t+1);
+            fprintf(f, "[c");
+            if (tables[t].minline > 0)
+              fprintf(f, "-0x%02x", 16*tables[t].minline);
+            fprintf(f, "];\n");
+          }
+          i1 = i2;
+        }
+        fprintf(f, "  return 1;\n");
+      }
+      fprintf(f, "}\n");
+
+    }
+
+    fprintf(f, "\n");
+
+    {
+      int uni2charset[0x10000];
+      bool pages[0x100];
+      int line[0x2000];
+      int tableno;
+      struct { int minline; int maxline; int usecount; const char* suffix; } tables[0x2000];
+      bool need_c;
+      bool fix_0000;
+      int i, j, p, j1, j2, t;
+
+      for (j = 0; j < 0x10000; j++)
+        uni2charset[j] = 0;
+      for (p = 0; p < 0x100; p++)
+        pages[p] = false;
+      for (i = 0; i < 0x100; i++) {
+        j = charset2uni[i];
+        if (j != 0xfffd) {
+          uni2charset[j] = i;
+          pages[j>>8] = true;
+        }
+      }
+      for (j1 = 0; j1 < 0x2000; j1++) {
+        bool all_invalid = true;
+        bool all_identity = true;
+        for (j2 = 0; j2 < 8; j2++) {
+          j = 8*j1+j2;
+          if (uni2charset[j] != 0)
+            all_invalid = false;
+          if (uni2charset[j] != j)
+            all_identity = false;
+        }
+        if (all_invalid)
+          line[j1] = -2;
+        else if (all_identity)
+          line[j1] = -1;
+        else
+          line[j1] = 0;
+      }
+      tableno = 0;
+      for (j1 = 0; j1 < 0x2000; j1++) {
+        if (line[j1] >= 0) {
+          if (tableno > 0
+              && ((j1 > 0 && line[j1-1] == tableno-1)
+                  || ((tables[tableno-1].maxline >> 5) == (j1 >> 5)
+                      && j1 - tables[tableno-1].maxline <= 8))) {
+            line[j1] = tableno-1;
+            tables[tableno-1].maxline = j1;
+          } else {
+            tableno++;
+            line[j1] = tableno-1;
+            tables[tableno-1].minline = tables[tableno-1].maxline = j1;
+          }
+        }
+      }
+      for (t = 0; t < tableno; t++) {
+        tables[t].usecount = 0;
+        j1 = 8*tables[t].minline;
+        j2 = 8*(tables[t].maxline+1);
+        for (j = j1; j < j2; j++)
+          if (uni2charset[j] != 0)
+            tables[t].usecount++;
+      }
+      for (t = 0, p = -1, i = 0; t < tableno; t++) {
+        if (tables[t].usecount > 1) {
+          char* s;
+          if (p == tables[t].minline >> 5) {
+            s = (char*) malloc(5+1);
+            sprintf(s, "%02x_%d", p, ++i);
+          } else {
+            p = tables[t].minline >> 5;
+            s = (char*) malloc(2+1);
+            sprintf(s, "%02x", p);
+          }
+          tables[t].suffix = s;
+        } else
+          tables[t].suffix = NULL;
+      }
+      {
+        p = -1;
+        for (t = 0; t < tableno; t++)
+          if (tables[t].usecount > 1) {
+            p = 0;
+            fprintf(f, "static const unsigned char %s_page%s[%d] = {\n", c_charsetname, tables[t].suffix, 8*(tables[t].maxline-tables[t].minline+1));
+            for (j1 = tables[t].minline; j1 <= tables[t].maxline; j1++) {
+              if ((j1 % 0x20) == 0 && j1 > tables[t].minline)
+                fprintf(f, "  /* 0x%04x */\n", 8*j1);
+              fprintf(f, " ");
+              for (j2 = 0; j2 < 8; j2++) {
+                j = 8*j1+j2;
+                fprintf(f, " 0x%02x,", uni2charset[j]);
+              }
+              fprintf(f, " /* 0x%02x-0x%02x */\n", 8*(j1 % 0x20), 8*(j1 % 0x20)+7);
+            }
+            fprintf(f, "};\n");
+          }
+        if (p >= 0)
+          fprintf(f, "\n");
+      }
+      need_c = false;
+      for (j1 = 0; j1 < 0x2000;) {
+        t = line[j1];
+        for (j2 = j1; j2 < 0x2000 && line[j2] == t; j2++);
+        if (t >= 0)
+          j2 = tables[t].maxline+1;
+        if (!(t == -2 || (t == -1 && j1 == 0)))
+          need_c = true;
+        j1 = j2;
+      }
+      fix_0000 = false;
+      fprintf(f, "static int\n%s_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)\n", c_charsetname);
+      fprintf(f, "{\n");
+      if (need_c)
+        fprintf(f, "  unsigned char c = 0;\n");
+      for (j1 = 0; j1 < 0x2000;) {
+        t = line[j1];
+        for (j2 = j1; j2 < 0x2000 && line[j2] == t; j2++);
+        if (t >= 0) {
+          if (j1 != tables[t].minline) abort();
+          if (j2 > tables[t].maxline+1) abort();
+          j2 = tables[t].maxline+1;
+        }
+        if (t == -2) {
+        } else {
+          if (j1 == 0)
+            fprintf(f, "  ");
+          else
+            fprintf(f, "  else ");
+          if (t >= 0 && tables[t].usecount == 0) abort();
+          if (t >= 0 && tables[t].usecount == 1) {
+            if (j2 != j1+1) abort();
+            for (j = 8*j1; j < 8*j2; j++)
+              if (uni2charset[j] != 0) {
+                fprintf(f, "if (wc == 0x%04x)\n    c = 0x%02x;\n", j, uni2charset[j]);
+                break;
+              }
+          } else {
+            if (j1 == 0) {
+              fprintf(f, "if (wc < 0x%04x)", 8*j2);
+            } else {
+              fprintf(f, "if (wc >= 0x%04x && wc < 0x%04x)", 8*j1, 8*j2);
+            }
+            if (t == -1) {
+              if (j1 == 0)
+                /* If wc == 0, the function must return 1, not -1. */
+                fprintf(f, " {\n    *r = wc;\n    return 1;\n  }\n");
+              else
+                fprintf(f, "\n    c = wc;\n");
+            } else {
+              fprintf(f, "\n    c = %s_page%s[wc", c_charsetname, tables[t].suffix);
+              if (tables[t].minline > 0)
+                fprintf(f, "-0x%04x", 8*j1);
+              fprintf(f, "];\n");
+              if (j1 == 0 && uni2charset[0] == 0)
+                /* If wc == 0, the function must return 1, not -1. */
+                fix_0000 = true;
+            }
+          }
+        }
+        j1 = j2;
+      }
+      if (need_c) {
+        if (fix_0000)
+          fprintf(f, "  if (c != 0 || wc == 0) {\n");
+        else
+          fprintf(f, "  if (c != 0) {\n");
+        fprintf(f, "    *r = c;\n");
+        fprintf(f, "    return 1;\n");
+        fprintf(f, "  }\n");
+      }
+      fprintf(f, "  return RET_ILSEQ;\n");
+      fprintf(f, "}\n");
+
+    }
+
+    if (ferror(f) || fclose(f))
+      exit(1);
+  }
+
+#if 0
+
+    int i1, i2, i3, i1_min, i1_max, j1, j2;
+
+  i1_min = 16;
+  i1_max = -1;
+  for (i1 = 0; i1 < 16; i1++)
+    for (i2 = 0; i2 < 16; i2++)
+      if (charset2uni[16*i1+i2] != 0xfffd) {
+        if (i1_min > i1) i1_min = i1;
+        if (i1_max < i1) i1_max = i1;
+      }
+  printf("static const unsigned short %s_2uni[%d] = {\n",
+         name, 16*(i1_max-i1_min+1));
+  for (i1 = i1_min; i1 <= i1_max; i1++) {
+    printf("  /""* 0x%02x *""/\n", 16*i1);
+    for (i2 = 0; i2 < 2; i2++) {
+      printf("  ");
+      for (i3 = 0; i3 < 8; i3++) {
+        if (i3 > 0) printf(" ");
+        printf("0x%04x,", charset2uni[16*i1+8*i2+i3]);
+      }
+      printf("\n");
+    }
+  }
+  printf("};\n");
+  printf("\n");
+
+  for (p = 0; p < 0x100; p++)
+    pages[p] = 0;
+  for (i = 0; i < 0x100; i++)
+    if (charset2uni[i] != 0xfffd)
+      pages[charset2uni[i]>>8] = 1;
+  for (p = 0; p < 0x100; p++)
+    if (pages[p]) {
+      int j1_min = 32;
+      int j1_max = -1;
+      for (j1 = 0; j1 < 32; j1++)
+        for (j2 = 0; j2 < 8; j2++)
+          if (uni2charset[256*p+8*j1+j2] != 0) {
+            if (j1_min > j1) j1_min = j1;
+            if (j1_max < j1) j1_max = j1;
+          }
+      printf("static const unsigned char %s_page%02x[%d] = {\n",
+             name, p, 8*(j1_max-j1_min+1));
+      for (j1 = j1_min; j1 <= j1_max; j1++) {
+        printf("  ");
+        for (j2 = 0; j2 < 8; j2++)
+          printf("0x%02x, ", uni2charset[256*p+8*j1+j2]);
+        printf("/""* 0x%02x-0x%02x *""/\n", 8*j1, 8*j1+7);
+      }
+      printf("};\n");
+    }
+  printf("\n");
+
+}
+#endif
+
+  exit(0);
+}
diff --git a/src/xlibi18n/lcUniConv/COPYRIGHT b/src/xlibi18n/lcUniConv/COPYRIGHT
new file mode 100644 (file)
index 0000000..ccc1626
--- /dev/null
@@ -0,0 +1,39 @@
+This notice applies to the files in this directory. They are taken from
+the libiconv-1.1 package, which is covered by the LGPL license. The files
+in this directory have been placed under the following copyright, with
+permission from the Free Software Foundation.
+
+
+Copyright (c) 1999-2000  Free Software Foundation, Inc.
+
+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
+FREE SOFTWARE FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION 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 Free Software Foundation
+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
+Free Software Foundation.
+
+
+Notes:
+
+1. This copyright applies only to the files in this directory, and not to
+the remaining files in libiconv.
+
+2. The Free Software Foundation does not encourage the use of the above
+license for newly written software.
+
diff --git a/src/xlibi18n/lcUniConv/README b/src/xlibi18n/lcUniConv/README
new file mode 100644 (file)
index 0000000..53f39f2
--- /dev/null
@@ -0,0 +1,11 @@
+
+The files in this directory are taken from the libiconv-1.1 package.
+
+The *.h files were generated from tables (mostly from ftp.unicode.org) using
+the programs '8bit_tab_to_h.c' and 'cjk_tab_to_h.c'. On some of them, further
+optimizations were applied by hand.
+
+If you find a bug in these files, instead of modifying them in XFree86
+and let it diverge from libiconv, please notify the libiconv maintainer
+(currently <bruno@clisp.org>) so he can fix both in synch.
+
diff --git a/src/xlibi18n/lcUniConv/armscii_8.h b/src/xlibi18n/lcUniConv/armscii_8.h
new file mode 100644 (file)
index 0000000..567bfea
--- /dev/null
@@ -0,0 +1,97 @@
+
+/*
+ * ARMSCII-8
+ */
+
+static const unsigned short armscii_8_2uni[96] = {
+  /* 0xa0 */
+  0x00a0, 0xfffd, 0x0587, 0x0589, 0x0029, 0x0028, 0x00bb, 0x00ab,
+  0x2014, 0x002e, 0x055d, 0x002c, 0x002d, 0x058a, 0x2026, 0x055c,
+  /* 0xb0 */
+  0x055b, 0x055e, 0x0531, 0x0561, 0x0532, 0x0562, 0x0533, 0x0563,
+  0x0534, 0x0564, 0x0535, 0x0565, 0x0536, 0x0566, 0x0537, 0x0567,
+  /* 0xc0 */
+  0x0538, 0x0568, 0x0539, 0x0569, 0x053a, 0x056a, 0x053b, 0x056b,
+  0x053c, 0x056c, 0x053d, 0x056d, 0x053e, 0x056e, 0x053f, 0x056f,
+  /* 0xd0 */
+  0x0540, 0x0570, 0x0541, 0x0571, 0x0542, 0x0572, 0x0543, 0x0573,
+  0x0544, 0x0574, 0x0545, 0x0575, 0x0546, 0x0576, 0x0547, 0x0577,
+  /* 0xe0 */
+  0x0548, 0x0578, 0x0549, 0x0579, 0x054a, 0x057a, 0x054b, 0x057b,
+  0x054c, 0x057c, 0x054d, 0x057d, 0x054e, 0x057e, 0x054f, 0x057f,
+  /* 0xf0 */
+  0x0550, 0x0580, 0x0551, 0x0581, 0x0552, 0x0582, 0x0553, 0x0583,
+  0x0554, 0x0584, 0x0555, 0x0585, 0x0556, 0x0586, 0x055a, 0xfffd,
+};
+
+static int
+armscii_8_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c < 0xa0) {
+    *pwc = (ucs4_t) c;
+    return 1;
+  }
+  else {
+    unsigned short wc = armscii_8_2uni[c-0xa0];
+    if (wc != 0xfffd) {
+      *pwc = (ucs4_t) wc;
+      return 1;
+    }
+  }
+  return RET_ILSEQ;
+}
+
+static const unsigned char armscii_8_page00[8] = {
+  0xa5, 0xa4, 0x2a, 0x2b, 0xab, 0xac, 0xa9, 0x2f, /* 0x28-0x2f */
+};
+static const unsigned char armscii_8_page00_1[32] = {
+  0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */
+  0x00, 0x00, 0x00, 0xa7, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */
+  0x00, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */
+};
+static const unsigned char armscii_8_page05[96] = {
+  0x00, 0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc, 0xbe, /* 0x30-0x37 */
+  0xc0, 0xc2, 0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce, /* 0x38-0x3f */
+  0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, /* 0x40-0x47 */
+  0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, /* 0x48-0x4f */
+  0xf0, 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc, 0x00, /* 0x50-0x57 */
+  0x00, 0x00, 0xfe, 0xb0, 0xaf, 0xaa, 0xb1, 0x00, /* 0x58-0x5f */
+  0x00, 0xb3, 0xb5, 0xb7, 0xb9, 0xbb, 0xbd, 0xbf, /* 0x60-0x67 */
+  0xc1, 0xc3, 0xc5, 0xc7, 0xc9, 0xcb, 0xcd, 0xcf, /* 0x68-0x6f */
+  0xd1, 0xd3, 0xd5, 0xd7, 0xd9, 0xdb, 0xdd, 0xdf, /* 0x70-0x77 */
+  0xe1, 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, /* 0x78-0x7f */
+  0xf1, 0xf3, 0xf5, 0xf7, 0xf9, 0xfb, 0xfd, 0xa2, /* 0x80-0x87 */
+  0x00, 0xa3, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */
+};
+static const unsigned char armscii_8_page20[24] = {
+  0x00, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, /* 0x10-0x17 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0x00, /* 0x20-0x27 */
+};
+
+static int
+armscii_8_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  unsigned char c = 0;
+  if (wc < 0x0028) {
+    *r = wc;
+    return 1;
+  }
+  else if (wc >= 0x0028 && wc < 0x0030)
+    c = armscii_8_page00[wc-0x0028];
+  else if (wc >= 0x0030 && wc < 0x00a0)
+    c = wc;
+  else if (wc >= 0x00a0 && wc < 0x00c0)
+    c = armscii_8_page00_1[wc-0x00a0];
+  else if (wc >= 0x0530 && wc < 0x0590)
+    c = armscii_8_page05[wc-0x0530];
+  else if (wc >= 0x2010 && wc < 0x2028)
+    c = armscii_8_page20[wc-0x2010];
+  if (c != 0) {
+    *r = c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/ascii.h b/src/xlibi18n/lcUniConv/ascii.h
new file mode 100644 (file)
index 0000000..e32cf41
--- /dev/null
@@ -0,0 +1,25 @@
+
+/*
+ * ASCII
+ */
+
+static int
+ascii_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c < 0x80) {
+    *pwc = (ucs4_t) c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
+
+static int
+ascii_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  if (wc < 0x0080) {
+    *r = wc;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/big5.h b/src/xlibi18n/lcUniConv/big5.h
new file mode 100644 (file)
index 0000000..db43908
--- /dev/null
@@ -0,0 +1,4141 @@
+
+/*
+ * BIG5
+ */
+
+static const unsigned short big5_2uni_pagea1[6121] = {
+  /* 0xa1 */
+  0x3000, 0xff0c, 0x3001, 0x3002, 0xff0e, 0x2022, 0xff1b, 0xff1a,
+  0xff1f, 0xff01, 0xfe30, 0x2026, 0x2025, 0xfe50, 0xff64, 0xfe52,
+  0x00b7, 0xfe54, 0xfe55, 0xfe56, 0xfe57, 0xff5c, 0x2013, 0xfe31,
+  0x2014, 0xfe33, 0xfffd, 0xfe34, 0xfe4f, 0xff08, 0xff09, 0xfe35,
+  0xfe36, 0xff5b, 0xff5d, 0xfe37, 0xfe38, 0x3014, 0x3015, 0xfe39,
+  0xfe3a, 0x3010, 0x3011, 0xfe3b, 0xfe3c, 0x300a, 0x300b, 0xfe3d,
+  0xfe3e, 0x3008, 0x3009, 0xfe3f, 0xfe40, 0x300c, 0x300d, 0xfe41,
+  0xfe42, 0x300e, 0x300f, 0xfe43, 0xfe44, 0xfe59, 0xfe5a, 0xfe5b,
+  0xfe5c, 0xfe5d, 0xfe5e, 0x2018, 0x2019, 0x201c, 0x201d, 0x301d,
+  0x301e, 0x2035, 0x2032, 0xff03, 0xff06, 0xff0a, 0x203b, 0x00a7,
+  0x3003, 0x25cb, 0x25cf, 0x25b3, 0x25b2, 0x25ce, 0x2606, 0x2605,
+  0x25c7, 0x25c6, 0x25a1, 0x25a0, 0x25bd, 0x25bc, 0x32a3, 0x2105,
+  0x203e, 0xfffd, 0xff3f, 0xfffd, 0xfe49, 0xfe4a, 0xfe4d, 0xfe4e,
+  0xfe4b, 0xfe4c, 0xfe5f, 0xfe60, 0xfe61, 0xff0b, 0xff0d, 0x00d7,
+  0x00f7, 0x00b1, 0x221a, 0xff1c, 0xff1e, 0xff1d, 0x2266, 0x2267,
+  0x2260, 0x221e, 0x2252, 0x2261, 0xfe62, 0xfe63, 0xfe64, 0xfe65,
+  0xfe66, 0x223c, 0x2229, 0x222a, 0x22a5, 0x2220, 0x221f, 0x22bf,
+  0x33d2, 0x33d1, 0x222b, 0x222e, 0x2235, 0x2234, 0x2640, 0x2642,
+  0x2641, 0x2609, 0x2191, 0x2193, 0x2190, 0x2192, 0x2196, 0x2197,
+  0x2199, 0x2198, 0x2225, 0x2223, 0xfffd,
+  /* 0xa2 */
+  0xfffd, 0xff0f, 0xff3c, 0xff04, 0x00a5, 0x3012, 0x00a2, 0x00a3,
+  0xff05, 0xff20, 0x2103, 0x2109, 0xfe69, 0xfe6a, 0xfe6b, 0x33d5,
+  0x339c, 0x339d, 0x339e, 0x33ce, 0x33a1, 0x338e, 0x338f, 0x33c4,
+  0x00b0, 0x5159, 0x515b, 0x515e, 0x515d, 0x5161, 0x5163, 0x55e7,
+  0x74e9, 0x7cce, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586,
+  0x2587, 0x2588, 0x258f, 0x258e, 0x258d, 0x258c, 0x258b, 0x258a,
+  0x2589, 0x253c, 0x2534, 0x252c, 0x2524, 0x251c, 0x2594, 0x2500,
+  0x2502, 0x2595, 0x250c, 0x2510, 0x2514, 0x2518, 0x256d, 0x256e,
+  0x2570, 0x256f, 0x2550, 0x255e, 0x256a, 0x2561, 0x25e2, 0x25e3,
+  0x25e5, 0x25e4, 0x2571, 0x2572, 0x2573, 0xff10, 0xff11, 0xff12,
+  0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18, 0xff19, 0x2160,
+  0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168,
+  0x2169, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027,
+  0x3028, 0x3029, 0xfffd, 0x5344, 0xfffd, 0xff21, 0xff22, 0xff23,
+  0xff24, 0xff25, 0xff26, 0xff27, 0xff28, 0xff29, 0xff2a, 0xff2b,
+  0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, 0xff31, 0xff32, 0xff33,
+  0xff34, 0xff35, 0xff36, 0xff37, 0xff38, 0xff39, 0xff3a, 0xff41,
+  0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, 0xff49,
+  0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50, 0xff51,
+  0xff52, 0xff53, 0xff54, 0xff55, 0xff56,
+  /* 0xa3 */
+  0xff57, 0xff58, 0xff59, 0xff5a, 0x0391, 0x0392, 0x0393, 0x0394,
+  0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c,
+  0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a4, 0x03a5,
+  0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03b1, 0x03b2, 0x03b3, 0x03b4,
+  0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc,
+  0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x03c4, 0x03c5,
+  0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x3105, 0x3106, 0x3107, 0x3108,
+  0x3109, 0x310a, 0x310b, 0x310c, 0x310d, 0x310e, 0x310f, 0x3110,
+  0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, 0x3118,
+  0x3119, 0x311a, 0x311b, 0x311c, 0x311d, 0x311e, 0x311f, 0x3120,
+  0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128,
+  0x3129, 0x02d9, 0x02c9, 0x02ca, 0x02c7, 0x02cb, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0xa4 */
+  0x4e00, 0x4e59, 0x4e01, 0x4e03, 0x4e43, 0x4e5d, 0x4e86, 0x4e8c,
+  0x4eba, 0x513f, 0x5165, 0x516b, 0x51e0, 0x5200, 0x5201, 0x529b,
+  0x5315, 0x5341, 0x535c, 0x53c8, 0x4e09, 0x4e0b, 0x4e08, 0x4e0a,
+  0x4e2b, 0x4e38, 0x51e1, 0x4e45, 0x4e48, 0x4e5f, 0x4e5e, 0x4e8e,
+  0x4ea1, 0x5140, 0x5203, 0x52fa, 0x5343, 0x53c9, 0x53e3, 0x571f,
+  0x58eb, 0x5915, 0x5927, 0x5973, 0x5b50, 0x5b51, 0x5b53, 0x5bf8,
+  0x5c0f, 0x5c22, 0x5c38, 0x5c71, 0x5ddd, 0x5de5, 0x5df1, 0x5df2,
+  0x5df3, 0x5dfe, 0x5e72, 0x5efe, 0x5f0b, 0x5f13, 0x624d, 0x4e11,
+  0x4e10, 0x4e0d, 0x4e2d, 0x4e30, 0x4e39, 0x4e4b, 0x5c39, 0x4e88,
+  0x4e91, 0x4e95, 0x4e92, 0x4e94, 0x4ea2, 0x4ec1, 0x4ec0, 0x4ec3,
+  0x4ec6, 0x4ec7, 0x4ecd, 0x4eca, 0x4ecb, 0x4ec4, 0x5143, 0x5141,
+  0x5167, 0x516d, 0x516e, 0x516c, 0x5197, 0x51f6, 0x5206, 0x5207,
+  0x5208, 0x52fb, 0x52fe, 0x52ff, 0x5316, 0x5339, 0x5348, 0x5347,
+  0x5345, 0x535e, 0x5384, 0x53cb, 0x53ca, 0x53cd, 0x58ec, 0x5929,
+  0x592b, 0x592a, 0x592d, 0x5b54, 0x5c11, 0x5c24, 0x5c3a, 0x5c6f,
+  0x5df4, 0x5e7b, 0x5eff, 0x5f14, 0x5f15, 0x5fc3, 0x6208, 0x6236,
+  0x624b, 0x624e, 0x652f, 0x6587, 0x6597, 0x65a4, 0x65b9, 0x65e5,
+  0x66f0, 0x6708, 0x6728, 0x6b20, 0x6b62, 0x6b79, 0x6bcb, 0x6bd4,
+  0x6bdb, 0x6c0f, 0x6c34, 0x706b, 0x722a, 0x7236, 0x723b, 0x7247,
+  0x7259, 0x725b, 0x72ac, 0x738b, 0x4e19,
+  /* 0xa5 */
+  0x4e16, 0x4e15, 0x4e14, 0x4e18, 0x4e3b, 0x4e4d, 0x4e4f, 0x4e4e,
+  0x4ee5, 0x4ed8, 0x4ed4, 0x4ed5, 0x4ed6, 0x4ed7, 0x4ee3, 0x4ee4,
+  0x4ed9, 0x4ede, 0x5145, 0x5144, 0x5189, 0x518a, 0x51ac, 0x51f9,
+  0x51fa, 0x51f8, 0x520a, 0x52a0, 0x529f, 0x5305, 0x5306, 0x5317,
+  0x531d, 0x4edf, 0x534a, 0x5349, 0x5361, 0x5360, 0x536f, 0x536e,
+  0x53bb, 0x53ef, 0x53e4, 0x53f3, 0x53ec, 0x53ee, 0x53e9, 0x53e8,
+  0x53fc, 0x53f8, 0x53f5, 0x53eb, 0x53e6, 0x53ea, 0x53f2, 0x53f1,
+  0x53f0, 0x53e5, 0x53ed, 0x53fb, 0x56db, 0x56da, 0x5916, 0x592e,
+  0x5931, 0x5974, 0x5976, 0x5b55, 0x5b83, 0x5c3c, 0x5de8, 0x5de7,
+  0x5de6, 0x5e02, 0x5e03, 0x5e73, 0x5e7c, 0x5f01, 0x5f18, 0x5f17,
+  0x5fc5, 0x620a, 0x6253, 0x6254, 0x6252, 0x6251, 0x65a5, 0x65e6,
+  0x672e, 0x672c, 0x672a, 0x672b, 0x672d, 0x6b63, 0x6bcd, 0x6c11,
+  0x6c10, 0x6c38, 0x6c41, 0x6c40, 0x6c3e, 0x72af, 0x7384, 0x7389,
+  0x74dc, 0x74e6, 0x7518, 0x751f, 0x7528, 0x7529, 0x7530, 0x7531,
+  0x7532, 0x7533, 0x758b, 0x767d, 0x76ae, 0x76bf, 0x76ee, 0x77db,
+  0x77e2, 0x77f3, 0x793a, 0x79be, 0x7a74, 0x7acb, 0x4e1e, 0x4e1f,
+  0x4e52, 0x4e53, 0x4e69, 0x4e99, 0x4ea4, 0x4ea6, 0x4ea5, 0x4eff,
+  0x4f09, 0x4f19, 0x4f0a, 0x4f15, 0x4f0d, 0x4f10, 0x4f11, 0x4f0f,
+  0x4ef2, 0x4ef6, 0x4efb, 0x4ef0, 0x4ef3, 0x4efd, 0x4f01, 0x4f0b,
+  0x5149, 0x5147, 0x5146, 0x5148, 0x5168,
+  /* 0xa6 */
+  0x5171, 0x518d, 0x51b0, 0x5217, 0x5211, 0x5212, 0x520e, 0x5216,
+  0x52a3, 0x5308, 0x5321, 0x5320, 0x5370, 0x5371, 0x5409, 0x540f,
+  0x540c, 0x540a, 0x5410, 0x5401, 0x540b, 0x5404, 0x5411, 0x540d,
+  0x5408, 0x5403, 0x540e, 0x5406, 0x5412, 0x56e0, 0x56de, 0x56dd,
+  0x5733, 0x5730, 0x5728, 0x572d, 0x572c, 0x572f, 0x5729, 0x5919,
+  0x591a, 0x5937, 0x5938, 0x5984, 0x5978, 0x5983, 0x597d, 0x5979,
+  0x5982, 0x5981, 0x5b57, 0x5b58, 0x5b87, 0x5b88, 0x5b85, 0x5b89,
+  0x5bfa, 0x5c16, 0x5c79, 0x5dde, 0x5e06, 0x5e76, 0x5e74, 0x5f0f,
+  0x5f1b, 0x5fd9, 0x5fd6, 0x620e, 0x620c, 0x620d, 0x6210, 0x6263,
+  0x625b, 0x6258, 0x6536, 0x65e9, 0x65e8, 0x65ec, 0x65ed, 0x66f2,
+  0x66f3, 0x6709, 0x673d, 0x6734, 0x6731, 0x6735, 0x6b21, 0x6b64,
+  0x6b7b, 0x6c16, 0x6c5d, 0x6c57, 0x6c59, 0x6c5f, 0x6c60, 0x6c50,
+  0x6c55, 0x6c61, 0x6c5b, 0x6c4d, 0x6c4e, 0x7070, 0x725f, 0x725d,
+  0x767e, 0x7af9, 0x7c73, 0x7cf8, 0x7f36, 0x7f8a, 0x7fbd, 0x8001,
+  0x8003, 0x800c, 0x8012, 0x8033, 0x807f, 0x8089, 0x808b, 0x808c,
+  0x81e3, 0x81ea, 0x81f3, 0x81fc, 0x820c, 0x821b, 0x821f, 0x826e,
+  0x8272, 0x827e, 0x866b, 0x8840, 0x884c, 0x8863, 0x897f, 0x9621,
+  0x4e32, 0x4ea8, 0x4f4d, 0x4f4f, 0x4f47, 0x4f57, 0x4f5e, 0x4f34,
+  0x4f5b, 0x4f55, 0x4f30, 0x4f50, 0x4f51, 0x4f3d, 0x4f3a, 0x4f38,
+  0x4f43, 0x4f54, 0x4f3c, 0x4f46, 0x4f63,
+  /* 0xa7 */
+  0x4f5c, 0x4f60, 0x4f2f, 0x4f4e, 0x4f36, 0x4f59, 0x4f5d, 0x4f48,
+  0x4f5a, 0x514c, 0x514b, 0x514d, 0x5175, 0x51b6, 0x51b7, 0x5225,
+  0x5224, 0x5229, 0x522a, 0x5228, 0x52ab, 0x52a9, 0x52aa, 0x52ac,
+  0x5323, 0x5373, 0x5375, 0x541d, 0x542d, 0x541e, 0x543e, 0x5426,
+  0x544e, 0x5427, 0x5446, 0x5443, 0x5433, 0x5448, 0x5442, 0x541b,
+  0x5429, 0x544a, 0x5439, 0x543b, 0x5438, 0x542e, 0x5435, 0x5436,
+  0x5420, 0x543c, 0x5440, 0x5431, 0x542b, 0x541f, 0x542c, 0x56ea,
+  0x56f0, 0x56e4, 0x56eb, 0x574a, 0x5751, 0x5740, 0x574d, 0x5747,
+  0x574e, 0x573e, 0x5750, 0x574f, 0x573b, 0x58ef, 0x593e, 0x599d,
+  0x5992, 0x59a8, 0x599e, 0x59a3, 0x5999, 0x5996, 0x598d, 0x59a4,
+  0x5993, 0x598a, 0x59a5, 0x5b5d, 0x5b5c, 0x5b5a, 0x5b5b, 0x5b8c,
+  0x5b8b, 0x5b8f, 0x5c2c, 0x5c40, 0x5c41, 0x5c3f, 0x5c3e, 0x5c90,
+  0x5c91, 0x5c94, 0x5c8c, 0x5deb, 0x5e0c, 0x5e8f, 0x5e87, 0x5e8a,
+  0x5ef7, 0x5f04, 0x5f1f, 0x5f64, 0x5f62, 0x5f77, 0x5f79, 0x5fd8,
+  0x5fcc, 0x5fd7, 0x5fcd, 0x5ff1, 0x5feb, 0x5ff8, 0x5fea, 0x6212,
+  0x6211, 0x6284, 0x6297, 0x6296, 0x6280, 0x6276, 0x6289, 0x626d,
+  0x628a, 0x627c, 0x627e, 0x6279, 0x6273, 0x6292, 0x626f, 0x6298,
+  0x626e, 0x6295, 0x6293, 0x6291, 0x6286, 0x6539, 0x653b, 0x6538,
+  0x65f1, 0x66f4, 0x675f, 0x674e, 0x674f, 0x6750, 0x6751, 0x675c,
+  0x6756, 0x675e, 0x6749, 0x6746, 0x6760,
+  /* 0xa8 */
+  0x6753, 0x6757, 0x6b65, 0x6bcf, 0x6c42, 0x6c5e, 0x6c99, 0x6c81,
+  0x6c88, 0x6c89, 0x6c85, 0x6c9b, 0x6c6a, 0x6c7a, 0x6c90, 0x6c70,
+  0x6c8c, 0x6c68, 0x6c96, 0x6c92, 0x6c7d, 0x6c83, 0x6c72, 0x6c7e,
+  0x6c74, 0x6c86, 0x6c76, 0x6c8d, 0x6c94, 0x6c98, 0x6c82, 0x7076,
+  0x707c, 0x707d, 0x7078, 0x7262, 0x7261, 0x7260, 0x72c4, 0x72c2,
+  0x7396, 0x752c, 0x752b, 0x7537, 0x7538, 0x7682, 0x76ef, 0x77e3,
+  0x79c1, 0x79c0, 0x79bf, 0x7a76, 0x7cfb, 0x7f55, 0x8096, 0x8093,
+  0x809d, 0x8098, 0x809b, 0x809a, 0x80b2, 0x826f, 0x8292, 0x828b,
+  0x828d, 0x898b, 0x89d2, 0x8a00, 0x8c37, 0x8c46, 0x8c55, 0x8c9d,
+  0x8d64, 0x8d70, 0x8db3, 0x8eab, 0x8eca, 0x8f9b, 0x8fb0, 0x8fc2,
+  0x8fc6, 0x8fc5, 0x8fc4, 0x5de1, 0x9091, 0x90a2, 0x90aa, 0x90a6,
+  0x90a3, 0x9149, 0x91c6, 0x91cc, 0x9632, 0x962e, 0x9631, 0x962a,
+  0x962c, 0x4e26, 0x4e56, 0x4e73, 0x4e8b, 0x4e9b, 0x4e9e, 0x4eab,
+  0x4eac, 0x4f6f, 0x4f9d, 0x4f8d, 0x4f73, 0x4f7f, 0x4f6c, 0x4f9b,
+  0x4f8b, 0x4f86, 0x4f83, 0x4f70, 0x4f75, 0x4f88, 0x4f69, 0x4f7b,
+  0x4f96, 0x4f7e, 0x4f8f, 0x4f91, 0x4f7a, 0x5154, 0x5152, 0x5155,
+  0x5169, 0x5177, 0x5176, 0x5178, 0x51bd, 0x51fd, 0x523b, 0x5238,
+  0x5237, 0x523a, 0x5230, 0x522e, 0x5236, 0x5241, 0x52be, 0x52bb,
+  0x5352, 0x5354, 0x5353, 0x5351, 0x5366, 0x5377, 0x5378, 0x5379,
+  0x53d6, 0x53d4, 0x53d7, 0x5473, 0x5475,
+  /* 0xa9 */
+  0x5496, 0x5478, 0x5495, 0x5480, 0x547b, 0x5477, 0x5484, 0x5492,
+  0x5486, 0x547c, 0x5490, 0x5471, 0x5476, 0x548c, 0x549a, 0x5462,
+  0x5468, 0x548b, 0x547d, 0x548e, 0x56fa, 0x5783, 0x5777, 0x576a,
+  0x5769, 0x5761, 0x5766, 0x5764, 0x577c, 0x591c, 0x5949, 0x5947,
+  0x5948, 0x5944, 0x5954, 0x59be, 0x59bb, 0x59d4, 0x59b9, 0x59ae,
+  0x59d1, 0x59c6, 0x59d0, 0x59cd, 0x59cb, 0x59d3, 0x59ca, 0x59af,
+  0x59b3, 0x59d2, 0x59c5, 0x5b5f, 0x5b64, 0x5b63, 0x5b97, 0x5b9a,
+  0x5b98, 0x5b9c, 0x5b99, 0x5b9b, 0x5c1a, 0x5c48, 0x5c45, 0x5c46,
+  0x5cb7, 0x5ca1, 0x5cb8, 0x5ca9, 0x5cab, 0x5cb1, 0x5cb3, 0x5e18,
+  0x5e1a, 0x5e16, 0x5e15, 0x5e1b, 0x5e11, 0x5e78, 0x5e9a, 0x5e97,
+  0x5e9c, 0x5e95, 0x5e96, 0x5ef6, 0x5f26, 0x5f27, 0x5f29, 0x5f80,
+  0x5f81, 0x5f7f, 0x5f7c, 0x5fdd, 0x5fe0, 0x5ffd, 0x5ff5, 0x5fff,
+  0x600f, 0x6014, 0x602f, 0x6035, 0x6016, 0x602a, 0x6015, 0x6021,
+  0x6027, 0x6029, 0x602b, 0x601b, 0x6216, 0x6215, 0x623f, 0x623e,
+  0x6240, 0x627f, 0x62c9, 0x62cc, 0x62c4, 0x62bf, 0x62c2, 0x62b9,
+  0x62d2, 0x62db, 0x62ab, 0x62d3, 0x62d4, 0x62cb, 0x62c8, 0x62a8,
+  0x62bd, 0x62bc, 0x62d0, 0x62d9, 0x62c7, 0x62cd, 0x62b5, 0x62da,
+  0x62b1, 0x62d8, 0x62d6, 0x62d7, 0x62c6, 0x62ac, 0x62ce, 0x653e,
+  0x65a7, 0x65bc, 0x65fa, 0x6614, 0x6613, 0x660c, 0x6606, 0x6602,
+  0x660e, 0x6600, 0x660f, 0x6615, 0x660a,
+  /* 0xaa */
+  0x6607, 0x670d, 0x670b, 0x676d, 0x678b, 0x6795, 0x6771, 0x679c,
+  0x6773, 0x6777, 0x6787, 0x679d, 0x6797, 0x676f, 0x6770, 0x677f,
+  0x6789, 0x677e, 0x6790, 0x6775, 0x679a, 0x6793, 0x677c, 0x676a,
+  0x6772, 0x6b23, 0x6b66, 0x6b67, 0x6b7f, 0x6c13, 0x6c1b, 0x6ce3,
+  0x6ce8, 0x6cf3, 0x6cb1, 0x6ccc, 0x6ce5, 0x6cb3, 0x6cbd, 0x6cbe,
+  0x6cbc, 0x6ce2, 0x6cab, 0x6cd5, 0x6cd3, 0x6cb8, 0x6cc4, 0x6cb9,
+  0x6cc1, 0x6cae, 0x6cd7, 0x6cc5, 0x6cf1, 0x6cbf, 0x6cbb, 0x6ce1,
+  0x6cdb, 0x6cca, 0x6cac, 0x6cef, 0x6cdc, 0x6cd6, 0x6ce0, 0x7095,
+  0x708e, 0x7092, 0x708a, 0x7099, 0x722c, 0x722d, 0x7238, 0x7248,
+  0x7267, 0x7269, 0x72c0, 0x72ce, 0x72d9, 0x72d7, 0x72d0, 0x73a9,
+  0x73a8, 0x739f, 0x73ab, 0x73a5, 0x753d, 0x759d, 0x7599, 0x759a,
+  0x7684, 0x76c2, 0x76f2, 0x76f4, 0x77e5, 0x77fd, 0x793e, 0x7940,
+  0x7941, 0x79c9, 0x79c8, 0x7a7a, 0x7a79, 0x7afa, 0x7cfe, 0x7f54,
+  0x7f8c, 0x7f8b, 0x8005, 0x80ba, 0x80a5, 0x80a2, 0x80b1, 0x80a1,
+  0x80ab, 0x80a9, 0x80b4, 0x80aa, 0x80af, 0x81e5, 0x81fe, 0x820d,
+  0x82b3, 0x829d, 0x8299, 0x82ad, 0x82bd, 0x829f, 0x82b9, 0x82b1,
+  0x82ac, 0x82a5, 0x82af, 0x82b8, 0x82a3, 0x82b0, 0x82be, 0x82b7,
+  0x864e, 0x8671, 0x521d, 0x8868, 0x8ecb, 0x8fce, 0x8fd4, 0x8fd1,
+  0x90b5, 0x90b8, 0x90b1, 0x90b6, 0x91c7, 0x91d1, 0x9577, 0x9580,
+  0x961c, 0x9640, 0x963f, 0x963b, 0x9644,
+  /* 0xab */
+  0x9642, 0x96b9, 0x96e8, 0x9752, 0x975e, 0x4e9f, 0x4ead, 0x4eae,
+  0x4fe1, 0x4fb5, 0x4faf, 0x4fbf, 0x4fe0, 0x4fd1, 0x4fcf, 0x4fdd,
+  0x4fc3, 0x4fb6, 0x4fd8, 0x4fdf, 0x4fca, 0x4fd7, 0x4fae, 0x4fd0,
+  0x4fc4, 0x4fc2, 0x4fda, 0x4fce, 0x4fde, 0x4fb7, 0x5157, 0x5192,
+  0x5191, 0x51a0, 0x524e, 0x5243, 0x524a, 0x524d, 0x524c, 0x524b,
+  0x5247, 0x52c7, 0x52c9, 0x52c3, 0x52c1, 0x530d, 0x5357, 0x537b,
+  0x539a, 0x53db, 0x54ac, 0x54c0, 0x54a8, 0x54ce, 0x54c9, 0x54b8,
+  0x54a6, 0x54b3, 0x54c7, 0x54c2, 0x54bd, 0x54aa, 0x54c1, 0x54c4,
+  0x54c8, 0x54af, 0x54ab, 0x54b1, 0x54bb, 0x54a9, 0x54a7, 0x54bf,
+  0x56ff, 0x5782, 0x578b, 0x57a0, 0x57a3, 0x57a2, 0x57ce, 0x57ae,
+  0x5793, 0x5955, 0x5951, 0x594f, 0x594e, 0x5950, 0x59dc, 0x59d8,
+  0x59ff, 0x59e3, 0x59e8, 0x5a03, 0x59e5, 0x59ea, 0x59da, 0x59e6,
+  0x5a01, 0x59fb, 0x5b69, 0x5ba3, 0x5ba6, 0x5ba4, 0x5ba2, 0x5ba5,
+  0x5c01, 0x5c4e, 0x5c4f, 0x5c4d, 0x5c4b, 0x5cd9, 0x5cd2, 0x5df7,
+  0x5e1d, 0x5e25, 0x5e1f, 0x5e7d, 0x5ea0, 0x5ea6, 0x5efa, 0x5f08,
+  0x5f2d, 0x5f65, 0x5f88, 0x5f85, 0x5f8a, 0x5f8b, 0x5f87, 0x5f8c,
+  0x5f89, 0x6012, 0x601d, 0x6020, 0x6025, 0x600e, 0x6028, 0x604d,
+  0x6070, 0x6068, 0x6062, 0x6046, 0x6043, 0x606c, 0x606b, 0x606a,
+  0x6064, 0x6241, 0x62dc, 0x6316, 0x6309, 0x62fc, 0x62ed, 0x6301,
+  0x62ee, 0x62fd, 0x6307, 0x62f1, 0x62f7,
+  /* 0xac */
+  0x62ef, 0x62ec, 0x62fe, 0x62f4, 0x6311, 0x6302, 0x653f, 0x6545,
+  0x65ab, 0x65bd, 0x65e2, 0x6625, 0x662d, 0x6620, 0x6627, 0x662f,
+  0x661f, 0x6628, 0x6631, 0x6624, 0x66f7, 0x67ff, 0x67d3, 0x67f1,
+  0x67d4, 0x67d0, 0x67ec, 0x67b6, 0x67af, 0x67f5, 0x67e9, 0x67ef,
+  0x67c4, 0x67d1, 0x67b4, 0x67da, 0x67e5, 0x67b8, 0x67cf, 0x67de,
+  0x67f3, 0x67b0, 0x67d9, 0x67e2, 0x67dd, 0x67d2, 0x6b6a, 0x6b83,
+  0x6b86, 0x6bb5, 0x6bd2, 0x6bd7, 0x6c1f, 0x6cc9, 0x6d0b, 0x6d32,
+  0x6d2a, 0x6d41, 0x6d25, 0x6d0c, 0x6d31, 0x6d1e, 0x6d17, 0x6d3b,
+  0x6d3d, 0x6d3e, 0x6d36, 0x6d1b, 0x6cf5, 0x6d39, 0x6d27, 0x6d38,
+  0x6d29, 0x6d2e, 0x6d35, 0x6d0e, 0x6d2b, 0x70ab, 0x70ba, 0x70b3,
+  0x70ac, 0x70af, 0x70ad, 0x70b8, 0x70ae, 0x70a4, 0x7230, 0x7272,
+  0x726f, 0x7274, 0x72e9, 0x72e0, 0x72e1, 0x73b7, 0x73ca, 0x73bb,
+  0x73b2, 0x73cd, 0x73c0, 0x73b3, 0x751a, 0x752d, 0x754f, 0x754c,
+  0x754e, 0x754b, 0x75ab, 0x75a4, 0x75a5, 0x75a2, 0x75a3, 0x7678,
+  0x7686, 0x7687, 0x7688, 0x76c8, 0x76c6, 0x76c3, 0x76c5, 0x7701,
+  0x76f9, 0x76f8, 0x7709, 0x770b, 0x76fe, 0x76fc, 0x7707, 0x77dc,
+  0x7802, 0x7814, 0x780c, 0x780d, 0x7946, 0x7949, 0x7948, 0x7947,
+  0x79b9, 0x79ba, 0x79d1, 0x79d2, 0x79cb, 0x7a7f, 0x7a81, 0x7aff,
+  0x7afd, 0x7c7d, 0x7d02, 0x7d05, 0x7d00, 0x7d09, 0x7d07, 0x7d04,
+  0x7d06, 0x7f38, 0x7f8e, 0x7fbf, 0x8004,
+  /* 0xad */
+  0x8010, 0x800d, 0x8011, 0x8036, 0x80d6, 0x80e5, 0x80da, 0x80c3,
+  0x80c4, 0x80cc, 0x80e1, 0x80db, 0x80ce, 0x80de, 0x80e4, 0x80dd,
+  0x81f4, 0x8222, 0x82e7, 0x8303, 0x8305, 0x82e3, 0x82db, 0x82e6,
+  0x8304, 0x82e5, 0x8302, 0x8309, 0x82d2, 0x82d7, 0x82f1, 0x8301,
+  0x82dc, 0x82d4, 0x82d1, 0x82de, 0x82d3, 0x82df, 0x82ef, 0x8306,
+  0x8650, 0x8679, 0x867b, 0x867a, 0x884d, 0x886b, 0x8981, 0x89d4,
+  0x8a08, 0x8a02, 0x8a03, 0x8c9e, 0x8ca0, 0x8d74, 0x8d73, 0x8db4,
+  0x8ecd, 0x8ecc, 0x8ff0, 0x8fe6, 0x8fe2, 0x8fea, 0x8fe5, 0x8fed,
+  0x8feb, 0x8fe4, 0x8fe8, 0x90ca, 0x90ce, 0x90c1, 0x90c3, 0x914b,
+  0x914a, 0x91cd, 0x9582, 0x9650, 0x964b, 0x964c, 0x964d, 0x9762,
+  0x9769, 0x97cb, 0x97ed, 0x97f3, 0x9801, 0x98a8, 0x98db, 0x98df,
+  0x9996, 0x9999, 0x4e58, 0x4eb3, 0x500c, 0x500d, 0x5023, 0x4fef,
+  0x5026, 0x5025, 0x4ff8, 0x5029, 0x5016, 0x5006, 0x503c, 0x501f,
+  0x501a, 0x5012, 0x5011, 0x4ffa, 0x5000, 0x5014, 0x5028, 0x4ff1,
+  0x5021, 0x500b, 0x5019, 0x5018, 0x4ff3, 0x4fee, 0x502d, 0x502a,
+  0x4ffe, 0x502b, 0x5009, 0x517c, 0x51a4, 0x51a5, 0x51a2, 0x51cd,
+  0x51cc, 0x51c6, 0x51cb, 0x5256, 0x525c, 0x5254, 0x525b, 0x525d,
+  0x532a, 0x537f, 0x539f, 0x539d, 0x53df, 0x54e8, 0x5510, 0x5501,
+  0x5537, 0x54fc, 0x54e5, 0x54f2, 0x5506, 0x54fa, 0x5514, 0x54e9,
+  0x54ed, 0x54e1, 0x5509, 0x54ee, 0x54ea,
+  /* 0xae */
+  0x54e6, 0x5527, 0x5507, 0x54fd, 0x550f, 0x5703, 0x5704, 0x57c2,
+  0x57d4, 0x57cb, 0x57c3, 0x5809, 0x590f, 0x5957, 0x5958, 0x595a,
+  0x5a11, 0x5a18, 0x5a1c, 0x5a1f, 0x5a1b, 0x5a13, 0x59ec, 0x5a20,
+  0x5a23, 0x5a29, 0x5a25, 0x5a0c, 0x5a09, 0x5b6b, 0x5c58, 0x5bb0,
+  0x5bb3, 0x5bb6, 0x5bb4, 0x5bae, 0x5bb5, 0x5bb9, 0x5bb8, 0x5c04,
+  0x5c51, 0x5c55, 0x5c50, 0x5ced, 0x5cfd, 0x5cfb, 0x5cea, 0x5ce8,
+  0x5cf0, 0x5cf6, 0x5d01, 0x5cf4, 0x5dee, 0x5e2d, 0x5e2b, 0x5eab,
+  0x5ead, 0x5ea7, 0x5f31, 0x5f92, 0x5f91, 0x5f90, 0x6059, 0x6063,
+  0x6065, 0x6050, 0x6055, 0x606d, 0x6069, 0x606f, 0x6084, 0x609f,
+  0x609a, 0x608d, 0x6094, 0x608c, 0x6085, 0x6096, 0x6247, 0x62f3,
+  0x6308, 0x62ff, 0x634e, 0x633e, 0x632f, 0x6355, 0x6342, 0x6346,
+  0x634f, 0x6349, 0x633a, 0x6350, 0x633d, 0x632a, 0x632b, 0x6328,
+  0x634d, 0x634c, 0x6548, 0x6549, 0x6599, 0x65c1, 0x65c5, 0x6642,
+  0x6649, 0x664f, 0x6643, 0x6652, 0x664c, 0x6645, 0x6641, 0x66f8,
+  0x6714, 0x6715, 0x6717, 0x6821, 0x6838, 0x6848, 0x6846, 0x6853,
+  0x6839, 0x6842, 0x6854, 0x6829, 0x68b3, 0x6817, 0x684c, 0x6851,
+  0x683d, 0x67f4, 0x6850, 0x6840, 0x683c, 0x6843, 0x682a, 0x6845,
+  0x6813, 0x6818, 0x6841, 0x6b8a, 0x6b89, 0x6bb7, 0x6c23, 0x6c27,
+  0x6c28, 0x6c26, 0x6c24, 0x6cf0, 0x6d6a, 0x6d95, 0x6d88, 0x6d87,
+  0x6d66, 0x6d78, 0x6d77, 0x6d59, 0x6d93,
+  /* 0xaf */
+  0x6d6c, 0x6d89, 0x6d6e, 0x6d5a, 0x6d74, 0x6d69, 0x6d8c, 0x6d8a,
+  0x6d79, 0x6d85, 0x6d65, 0x6d94, 0x70ca, 0x70d8, 0x70e4, 0x70d9,
+  0x70c8, 0x70cf, 0x7239, 0x7279, 0x72fc, 0x72f9, 0x72fd, 0x72f8,
+  0x72f7, 0x7386, 0x73ed, 0x7409, 0x73ee, 0x73e0, 0x73ea, 0x73de,
+  0x7554, 0x755d, 0x755c, 0x755a, 0x7559, 0x75be, 0x75c5, 0x75c7,
+  0x75b2, 0x75b3, 0x75bd, 0x75bc, 0x75b9, 0x75c2, 0x75b8, 0x768b,
+  0x76b0, 0x76ca, 0x76cd, 0x76ce, 0x7729, 0x771f, 0x7720, 0x7728,
+  0x77e9, 0x7830, 0x7827, 0x7838, 0x781d, 0x7834, 0x7837, 0x7825,
+  0x782d, 0x7820, 0x781f, 0x7832, 0x7955, 0x7950, 0x7960, 0x795f,
+  0x7956, 0x795e, 0x795d, 0x7957, 0x795a, 0x79e4, 0x79e3, 0x79e7,
+  0x79df, 0x79e6, 0x79e9, 0x79d8, 0x7a84, 0x7a88, 0x7ad9, 0x7b06,
+  0x7b11, 0x7c89, 0x7d21, 0x7d17, 0x7d0b, 0x7d0a, 0x7d20, 0x7d22,
+  0x7d14, 0x7d10, 0x7d15, 0x7d1a, 0x7d1c, 0x7d0d, 0x7d19, 0x7d1b,
+  0x7f3a, 0x7f5f, 0x7f94, 0x7fc5, 0x7fc1, 0x8006, 0x8018, 0x8015,
+  0x8019, 0x8017, 0x803d, 0x803f, 0x80f1, 0x8102, 0x80f0, 0x8105,
+  0x80ed, 0x80f4, 0x8106, 0x80f8, 0x80f3, 0x8108, 0x80fd, 0x810a,
+  0x80fc, 0x80ef, 0x81ed, 0x81ec, 0x8200, 0x8210, 0x822a, 0x822b,
+  0x8228, 0x822c, 0x82bb, 0x832b, 0x8352, 0x8354, 0x834a, 0x8338,
+  0x8350, 0x8349, 0x8335, 0x8334, 0x834f, 0x8332, 0x8339, 0x8336,
+  0x8317, 0x8340, 0x8331, 0x8328, 0x8343,
+  /* 0xb0 */
+  0x8654, 0x868a, 0x86aa, 0x8693, 0x86a4, 0x86a9, 0x868c, 0x86a3,
+  0x869c, 0x8870, 0x8877, 0x8881, 0x8882, 0x887d, 0x8879, 0x8a18,
+  0x8a10, 0x8a0e, 0x8a0c, 0x8a15, 0x8a0a, 0x8a17, 0x8a13, 0x8a16,
+  0x8a0f, 0x8a11, 0x8c48, 0x8c7a, 0x8c79, 0x8ca1, 0x8ca2, 0x8d77,
+  0x8eac, 0x8ed2, 0x8ed4, 0x8ecf, 0x8fb1, 0x9001, 0x9006, 0x8ff7,
+  0x9000, 0x8ffa, 0x8ff4, 0x9003, 0x8ffd, 0x9005, 0x8ff8, 0x9095,
+  0x90e1, 0x90dd, 0x90e2, 0x9152, 0x914d, 0x914c, 0x91d8, 0x91dd,
+  0x91d7, 0x91dc, 0x91d9, 0x9583, 0x9662, 0x9663, 0x9661, 0x965b,
+  0x965d, 0x9664, 0x9658, 0x965e, 0x96bb, 0x98e2, 0x99ac, 0x9aa8,
+  0x9ad8, 0x9b25, 0x9b32, 0x9b3c, 0x4e7e, 0x507a, 0x507d, 0x505c,
+  0x5047, 0x5043, 0x504c, 0x505a, 0x5049, 0x5065, 0x5076, 0x504e,
+  0x5055, 0x5075, 0x5074, 0x5077, 0x504f, 0x500f, 0x506f, 0x506d,
+  0x515c, 0x5195, 0x51f0, 0x526a, 0x526f, 0x52d2, 0x52d9, 0x52d8,
+  0x52d5, 0x5310, 0x530f, 0x5319, 0x533f, 0x5340, 0x533e, 0x53c3,
+  0x66fc, 0x5546, 0x556a, 0x5566, 0x5544, 0x555e, 0x5561, 0x5543,
+  0x554a, 0x5531, 0x5556, 0x554f, 0x5555, 0x552f, 0x5564, 0x5538,
+  0x552e, 0x555c, 0x552c, 0x5563, 0x5533, 0x5541, 0x5557, 0x5708,
+  0x570b, 0x5709, 0x57df, 0x5805, 0x580a, 0x5806, 0x57e0, 0x57e4,
+  0x57fa, 0x5802, 0x5835, 0x57f7, 0x57f9, 0x5920, 0x5962, 0x5a36,
+  0x5a41, 0x5a49, 0x5a66, 0x5a6a, 0x5a40,
+  /* 0xb1 */
+  0x5a3c, 0x5a62, 0x5a5a, 0x5a46, 0x5a4a, 0x5b70, 0x5bc7, 0x5bc5,
+  0x5bc4, 0x5bc2, 0x5bbf, 0x5bc6, 0x5c09, 0x5c08, 0x5c07, 0x5c60,
+  0x5c5c, 0x5c5d, 0x5d07, 0x5d06, 0x5d0e, 0x5d1b, 0x5d16, 0x5d22,
+  0x5d11, 0x5d29, 0x5d14, 0x5d19, 0x5d24, 0x5d27, 0x5d17, 0x5de2,
+  0x5e38, 0x5e36, 0x5e33, 0x5e37, 0x5eb7, 0x5eb8, 0x5eb6, 0x5eb5,
+  0x5ebe, 0x5f35, 0x5f37, 0x5f57, 0x5f6c, 0x5f69, 0x5f6b, 0x5f97,
+  0x5f99, 0x5f9e, 0x5f98, 0x5fa1, 0x5fa0, 0x5f9c, 0x607f, 0x60a3,
+  0x6089, 0x60a0, 0x60a8, 0x60cb, 0x60b4, 0x60e6, 0x60bd, 0x60c5,
+  0x60bb, 0x60b5, 0x60dc, 0x60bc, 0x60d8, 0x60d5, 0x60c6, 0x60df,
+  0x60b8, 0x60da, 0x60c7, 0x621a, 0x621b, 0x6248, 0x63a0, 0x63a7,
+  0x6372, 0x6396, 0x63a2, 0x63a5, 0x6377, 0x6367, 0x6398, 0x63aa,
+  0x6371, 0x63a9, 0x6389, 0x6383, 0x639b, 0x636b, 0x63a8, 0x6384,
+  0x6388, 0x6399, 0x63a1, 0x63ac, 0x6392, 0x638f, 0x6380, 0x637b,
+  0x6369, 0x6368, 0x637a, 0x655d, 0x6556, 0x6551, 0x6559, 0x6557,
+  0x555f, 0x654f, 0x6558, 0x6555, 0x6554, 0x659c, 0x659b, 0x65ac,
+  0x65cf, 0x65cb, 0x65cc, 0x65ce, 0x665d, 0x665a, 0x6664, 0x6668,
+  0x6666, 0x665e, 0x66f9, 0x52d7, 0x671b, 0x6881, 0x68af, 0x68a2,
+  0x6893, 0x68b5, 0x687f, 0x6876, 0x68b1, 0x68a7, 0x6897, 0x68b0,
+  0x6883, 0x68c4, 0x68ad, 0x6886, 0x6885, 0x6894, 0x689d, 0x68a8,
+  0x689f, 0x68a1, 0x6882, 0x6b32, 0x6bba,
+  /* 0xb2 */
+  0x6beb, 0x6bec, 0x6c2b, 0x6d8e, 0x6dbc, 0x6df3, 0x6dd9, 0x6db2,
+  0x6de1, 0x6dcc, 0x6de4, 0x6dfb, 0x6dfa, 0x6e05, 0x6dc7, 0x6dcb,
+  0x6daf, 0x6dd1, 0x6dae, 0x6dde, 0x6df9, 0x6db8, 0x6df7, 0x6df5,
+  0x6dc5, 0x6dd2, 0x6e1a, 0x6db5, 0x6dda, 0x6deb, 0x6dd8, 0x6dea,
+  0x6df1, 0x6dee, 0x6de8, 0x6dc6, 0x6dc4, 0x6daa, 0x6dec, 0x6dbf,
+  0x6de6, 0x70f9, 0x7109, 0x710a, 0x70fd, 0x70ef, 0x723d, 0x727d,
+  0x7281, 0x731c, 0x731b, 0x7316, 0x7313, 0x7319, 0x7387, 0x7405,
+  0x740a, 0x7403, 0x7406, 0x73fe, 0x740d, 0x74e0, 0x74f6, 0x74f7,
+  0x751c, 0x7522, 0x7565, 0x7566, 0x7562, 0x7570, 0x758f, 0x75d4,
+  0x75d5, 0x75b5, 0x75ca, 0x75cd, 0x768e, 0x76d4, 0x76d2, 0x76db,
+  0x7737, 0x773e, 0x773c, 0x7736, 0x7738, 0x773a, 0x786b, 0x7843,
+  0x784e, 0x7965, 0x7968, 0x796d, 0x79fb, 0x7a92, 0x7a95, 0x7b20,
+  0x7b28, 0x7b1b, 0x7b2c, 0x7b26, 0x7b19, 0x7b1e, 0x7b2e, 0x7c92,
+  0x7c97, 0x7c95, 0x7d46, 0x7d43, 0x7d71, 0x7d2e, 0x7d39, 0x7d3c,
+  0x7d40, 0x7d30, 0x7d33, 0x7d44, 0x7d2f, 0x7d42, 0x7d32, 0x7d31,
+  0x7f3d, 0x7f9e, 0x7f9a, 0x7fcc, 0x7fce, 0x7fd2, 0x801c, 0x804a,
+  0x8046, 0x812f, 0x8116, 0x8123, 0x812b, 0x8129, 0x8130, 0x8124,
+  0x8202, 0x8235, 0x8237, 0x8236, 0x8239, 0x838e, 0x839e, 0x8398,
+  0x8378, 0x83a2, 0x8396, 0x83bd, 0x83ab, 0x8392, 0x838a, 0x8393,
+  0x8389, 0x83a0, 0x8377, 0x837b, 0x837c,
+  /* 0xb3 */
+  0x8386, 0x83a7, 0x8655, 0x5f6a, 0x86c7, 0x86c0, 0x86b6, 0x86c4,
+  0x86b5, 0x86c6, 0x86cb, 0x86b1, 0x86af, 0x86c9, 0x8853, 0x889e,
+  0x8888, 0x88ab, 0x8892, 0x8896, 0x888d, 0x888b, 0x8993, 0x898f,
+  0x8a2a, 0x8a1d, 0x8a23, 0x8a25, 0x8a31, 0x8a2d, 0x8a1f, 0x8a1b,
+  0x8a22, 0x8c49, 0x8c5a, 0x8ca9, 0x8cac, 0x8cab, 0x8ca8, 0x8caa,
+  0x8ca7, 0x8d67, 0x8d66, 0x8dbe, 0x8dba, 0x8edb, 0x8edf, 0x9019,
+  0x900d, 0x901a, 0x9017, 0x9023, 0x901f, 0x901d, 0x9010, 0x9015,
+  0x901e, 0x9020, 0x900f, 0x9022, 0x9016, 0x901b, 0x9014, 0x90e8,
+  0x90ed, 0x90fd, 0x9157, 0x91ce, 0x91f5, 0x91e6, 0x91e3, 0x91e7,
+  0x91ed, 0x91e9, 0x9589, 0x966a, 0x9675, 0x9673, 0x9678, 0x9670,
+  0x9674, 0x9676, 0x9677, 0x966c, 0x96c0, 0x96ea, 0x96e9, 0x7ae0,
+  0x7adf, 0x9802, 0x9803, 0x9b5a, 0x9ce5, 0x9e75, 0x9e7f, 0x9ea5,
+  0x9ebb, 0x50a2, 0x508d, 0x5085, 0x5099, 0x5091, 0x5080, 0x5096,
+  0x5098, 0x509a, 0x6700, 0x51f1, 0x5272, 0x5274, 0x5275, 0x5269,
+  0x52de, 0x52dd, 0x52db, 0x535a, 0x53a5, 0x557b, 0x5580, 0x55a7,
+  0x557c, 0x558a, 0x559d, 0x5598, 0x5582, 0x559c, 0x55aa, 0x5594,
+  0x5587, 0x558b, 0x5583, 0x55b3, 0x55ae, 0x559f, 0x553e, 0x55b2,
+  0x559a, 0x55bb, 0x55ac, 0x55b1, 0x557e, 0x5589, 0x55ab, 0x5599,
+  0x570d, 0x582f, 0x582a, 0x5834, 0x5824, 0x5830, 0x5831, 0x5821,
+  0x581d, 0x5820, 0x58f9, 0x58fa, 0x5960,
+  /* 0xb4 */
+  0x5a77, 0x5a9a, 0x5a7f, 0x5a92, 0x5a9b, 0x5aa7, 0x5b73, 0x5b71,
+  0x5bd2, 0x5bcc, 0x5bd3, 0x5bd0, 0x5c0a, 0x5c0b, 0x5c31, 0x5d4c,
+  0x5d50, 0x5d34, 0x5d47, 0x5dfd, 0x5e45, 0x5e3d, 0x5e40, 0x5e43,
+  0x5e7e, 0x5eca, 0x5ec1, 0x5ec2, 0x5ec4, 0x5f3c, 0x5f6d, 0x5fa9,
+  0x5faa, 0x5fa8, 0x60d1, 0x60e1, 0x60b2, 0x60b6, 0x60e0, 0x611c,
+  0x6123, 0x60fa, 0x6115, 0x60f0, 0x60fb, 0x60f4, 0x6168, 0x60f1,
+  0x610e, 0x60f6, 0x6109, 0x6100, 0x6112, 0x621f, 0x6249, 0x63a3,
+  0x638c, 0x63cf, 0x63c0, 0x63e9, 0x63c9, 0x63c6, 0x63cd, 0x63d2,
+  0x63e3, 0x63d0, 0x63e1, 0x63d6, 0x63ed, 0x63ee, 0x6376, 0x63f4,
+  0x63ea, 0x63db, 0x6452, 0x63da, 0x63f9, 0x655e, 0x6566, 0x6562,
+  0x6563, 0x6591, 0x6590, 0x65af, 0x666e, 0x6670, 0x6674, 0x6676,
+  0x666f, 0x6691, 0x667a, 0x667e, 0x6677, 0x66fe, 0x66ff, 0x671f,
+  0x671d, 0x68fa, 0x68d5, 0x68e0, 0x68d8, 0x68d7, 0x6905, 0x68df,
+  0x68f5, 0x68ee, 0x68e7, 0x68f9, 0x68d2, 0x68f2, 0x68e3, 0x68cb,
+  0x68cd, 0x690d, 0x6912, 0x690e, 0x68c9, 0x68da, 0x696e, 0x68fb,
+  0x6b3e, 0x6b3a, 0x6b3d, 0x6b98, 0x6b96, 0x6bbc, 0x6bef, 0x6c2e,
+  0x6c2f, 0x6c2c, 0x6e2f, 0x6e38, 0x6e54, 0x6e21, 0x6e32, 0x6e67,
+  0x6e4a, 0x6e20, 0x6e25, 0x6e23, 0x6e1b, 0x6e5b, 0x6e58, 0x6e24,
+  0x6e56, 0x6e6e, 0x6e2d, 0x6e26, 0x6e6f, 0x6e34, 0x6e4d, 0x6e3a,
+  0x6e2c, 0x6e43, 0x6e1d, 0x6e3e, 0x6ecb,
+  /* 0xb5 */
+  0x6e89, 0x6e19, 0x6e4e, 0x6e63, 0x6e44, 0x6e72, 0x6e69, 0x6e5f,
+  0x7119, 0x711a, 0x7126, 0x7130, 0x7121, 0x7136, 0x716e, 0x711c,
+  0x724c, 0x7284, 0x7280, 0x7336, 0x7325, 0x7334, 0x7329, 0x743a,
+  0x742a, 0x7433, 0x7422, 0x7425, 0x7435, 0x7436, 0x7434, 0x742f,
+  0x741b, 0x7426, 0x7428, 0x7525, 0x7526, 0x756b, 0x756a, 0x75e2,
+  0x75db, 0x75e3, 0x75d9, 0x75d8, 0x75de, 0x75e0, 0x767b, 0x767c,
+  0x7696, 0x7693, 0x76b4, 0x76dc, 0x774f, 0x77ed, 0x785d, 0x786c,
+  0x786f, 0x7a0d, 0x7a08, 0x7a0b, 0x7a05, 0x7a00, 0x7a98, 0x7a97,
+  0x7a96, 0x7ae5, 0x7ae3, 0x7b49, 0x7b56, 0x7b46, 0x7b50, 0x7b52,
+  0x7b54, 0x7b4d, 0x7b4b, 0x7b4f, 0x7b51, 0x7c9f, 0x7ca5, 0x7d5e,
+  0x7d50, 0x7d68, 0x7d55, 0x7d2b, 0x7d6e, 0x7d72, 0x7d61, 0x7d66,
+  0x7d62, 0x7d70, 0x7d73, 0x5584, 0x7fd4, 0x7fd5, 0x800b, 0x8052,
+  0x8085, 0x8155, 0x8154, 0x814b, 0x8151, 0x814e, 0x8139, 0x8146,
+  0x813e, 0x814c, 0x8153, 0x8174, 0x8212, 0x821c, 0x83e9, 0x8403,
+  0x83f8, 0x840d, 0x83e0, 0x83c5, 0x840b, 0x83c1, 0x83ef, 0x83f1,
+  0x83f4, 0x8457, 0x840a, 0x83f0, 0x840c, 0x83cc, 0x83fd, 0x83f2,
+  0x83ca, 0x8438, 0x840e, 0x8404, 0x83dc, 0x8407, 0x83d4, 0x83df,
+  0x865b, 0x86df, 0x86d9, 0x86ed, 0x86d4, 0x86db, 0x86e4, 0x86d0,
+  0x86de, 0x8857, 0x88c1, 0x88c2, 0x88b1, 0x8983, 0x8996, 0x8a3b,
+  0x8a60, 0x8a55, 0x8a5e, 0x8a3c, 0x8a41,
+  /* 0xb6 */
+  0x8a54, 0x8a5b, 0x8a50, 0x8a46, 0x8a34, 0x8a3a, 0x8a36, 0x8a56,
+  0x8c61, 0x8c82, 0x8caf, 0x8cbc, 0x8cb3, 0x8cbd, 0x8cc1, 0x8cbb,
+  0x8cc0, 0x8cb4, 0x8cb7, 0x8cb6, 0x8cbf, 0x8cb8, 0x8d8a, 0x8d85,
+  0x8d81, 0x8dce, 0x8ddd, 0x8dcb, 0x8dda, 0x8dd1, 0x8dcc, 0x8ddb,
+  0x8dc6, 0x8efb, 0x8ef8, 0x8efc, 0x8f9c, 0x902e, 0x9035, 0x9031,
+  0x9038, 0x9032, 0x9036, 0x9102, 0x90f5, 0x9109, 0x90fe, 0x9163,
+  0x9165, 0x91cf, 0x9214, 0x9215, 0x9223, 0x9209, 0x921e, 0x920d,
+  0x9210, 0x9207, 0x9211, 0x9594, 0x958f, 0x958b, 0x9591, 0x9593,
+  0x9592, 0x958e, 0x968a, 0x968e, 0x968b, 0x967d, 0x9685, 0x9686,
+  0x968d, 0x9672, 0x9684, 0x96c1, 0x96c5, 0x96c4, 0x96c6, 0x96c7,
+  0x96ef, 0x96f2, 0x97cc, 0x9805, 0x9806, 0x9808, 0x98e7, 0x98ea,
+  0x98ef, 0x98e9, 0x98f2, 0x98ed, 0x99ae, 0x99ad, 0x9ec3, 0x9ecd,
+  0x9ed1, 0x4e82, 0x50ad, 0x50b5, 0x50b2, 0x50b3, 0x50c5, 0x50be,
+  0x50ac, 0x50b7, 0x50bb, 0x50af, 0x50c7, 0x527f, 0x5277, 0x527d,
+  0x52df, 0x52e6, 0x52e4, 0x52e2, 0x52e3, 0x532f, 0x55df, 0x55e8,
+  0x55d3, 0x55e6, 0x55ce, 0x55dc, 0x55c7, 0x55d1, 0x55e3, 0x55e4,
+  0x55ef, 0x55da, 0x55e1, 0x55c5, 0x55c6, 0x55e5, 0x55c9, 0x5712,
+  0x5713, 0x585e, 0x5851, 0x5858, 0x5857, 0x585a, 0x5854, 0x586b,
+  0x584c, 0x586d, 0x584a, 0x5862, 0x5852, 0x584b, 0x5967, 0x5ac1,
+  0x5ac9, 0x5acc, 0x5abe, 0x5abd, 0x5abc,
+  /* 0xb7 */
+  0x5ab3, 0x5ac2, 0x5ab2, 0x5d69, 0x5d6f, 0x5e4c, 0x5e79, 0x5ec9,
+  0x5ec8, 0x5f12, 0x5f59, 0x5fac, 0x5fae, 0x611a, 0x610f, 0x6148,
+  0x611f, 0x60f3, 0x611b, 0x60f9, 0x6101, 0x6108, 0x614e, 0x614c,
+  0x6144, 0x614d, 0x613e, 0x6134, 0x6127, 0x610d, 0x6106, 0x6137,
+  0x6221, 0x6222, 0x6413, 0x643e, 0x641e, 0x642a, 0x642d, 0x643d,
+  0x642c, 0x640f, 0x641c, 0x6414, 0x640d, 0x6436, 0x6416, 0x6417,
+  0x6406, 0x656c, 0x659f, 0x65b0, 0x6697, 0x6689, 0x6687, 0x6688,
+  0x6696, 0x6684, 0x6698, 0x668d, 0x6703, 0x6994, 0x696d, 0x695a,
+  0x6977, 0x6960, 0x6954, 0x6975, 0x6930, 0x6982, 0x694a, 0x6968,
+  0x696b, 0x695e, 0x6953, 0x6979, 0x6986, 0x695d, 0x6963, 0x695b,
+  0x6b47, 0x6b72, 0x6bc0, 0x6bbf, 0x6bd3, 0x6bfd, 0x6ea2, 0x6eaf,
+  0x6ed3, 0x6eb6, 0x6ec2, 0x6e90, 0x6e9d, 0x6ec7, 0x6ec5, 0x6ea5,
+  0x6e98, 0x6ebc, 0x6eba, 0x6eab, 0x6ed1, 0x6e96, 0x6e9c, 0x6ec4,
+  0x6ed4, 0x6eaa, 0x6ea7, 0x6eb4, 0x714e, 0x7159, 0x7169, 0x7164,
+  0x7149, 0x7167, 0x715c, 0x716c, 0x7166, 0x714c, 0x7165, 0x715e,
+  0x7146, 0x7168, 0x7156, 0x723a, 0x7252, 0x7337, 0x7345, 0x733f,
+  0x733e, 0x746f, 0x745a, 0x7455, 0x745f, 0x745e, 0x7441, 0x743f,
+  0x7459, 0x745b, 0x745c, 0x7576, 0x7578, 0x7600, 0x75f0, 0x7601,
+  0x75f2, 0x75f1, 0x75fa, 0x75ff, 0x75f4, 0x75f3, 0x76de, 0x76df,
+  0x775b, 0x776b, 0x7766, 0x775e, 0x7763,
+  /* 0xb8 */
+  0x7779, 0x776a, 0x776c, 0x775c, 0x7765, 0x7768, 0x7762, 0x77ee,
+  0x788e, 0x78b0, 0x7897, 0x7898, 0x788c, 0x7889, 0x787c, 0x7891,
+  0x7893, 0x787f, 0x797a, 0x797f, 0x7981, 0x842c, 0x79bd, 0x7a1c,
+  0x7a1a, 0x7a20, 0x7a14, 0x7a1f, 0x7a1e, 0x7a9f, 0x7aa0, 0x7b77,
+  0x7bc0, 0x7b60, 0x7b6e, 0x7b67, 0x7cb1, 0x7cb3, 0x7cb5, 0x7d93,
+  0x7d79, 0x7d91, 0x7d81, 0x7d8f, 0x7d5b, 0x7f6e, 0x7f69, 0x7f6a,
+  0x7f72, 0x7fa9, 0x7fa8, 0x7fa4, 0x8056, 0x8058, 0x8086, 0x8084,
+  0x8171, 0x8170, 0x8178, 0x8165, 0x816e, 0x8173, 0x816b, 0x8179,
+  0x817a, 0x8166, 0x8205, 0x8247, 0x8482, 0x8477, 0x843d, 0x8431,
+  0x8475, 0x8466, 0x846b, 0x8449, 0x846c, 0x845b, 0x843c, 0x8435,
+  0x8461, 0x8463, 0x8469, 0x846d, 0x8446, 0x865e, 0x865c, 0x865f,
+  0x86f9, 0x8713, 0x8708, 0x8707, 0x8700, 0x86fe, 0x86fb, 0x8702,
+  0x8703, 0x8706, 0x870a, 0x8859, 0x88df, 0x88d4, 0x88d9, 0x88dc,
+  0x88d8, 0x88dd, 0x88e1, 0x88ca, 0x88d5, 0x88d2, 0x899c, 0x89e3,
+  0x8a6b, 0x8a72, 0x8a73, 0x8a66, 0x8a69, 0x8a70, 0x8a87, 0x8a7c,
+  0x8a63, 0x8aa0, 0x8a71, 0x8a85, 0x8a6d, 0x8a62, 0x8a6e, 0x8a6c,
+  0x8a79, 0x8a7b, 0x8a3e, 0x8a68, 0x8c62, 0x8c8a, 0x8c89, 0x8cca,
+  0x8cc7, 0x8cc8, 0x8cc4, 0x8cb2, 0x8cc3, 0x8cc2, 0x8cc5, 0x8de1,
+  0x8ddf, 0x8de8, 0x8def, 0x8df3, 0x8dfa, 0x8dea, 0x8de4, 0x8de6,
+  0x8eb2, 0x8f03, 0x8f09, 0x8efe, 0x8f0a,
+  /* 0xb9 */
+  0x8f9f, 0x8fb2, 0x904b, 0x904a, 0x9053, 0x9042, 0x9054, 0x903c,
+  0x9055, 0x9050, 0x9047, 0x904f, 0x904e, 0x904d, 0x9051, 0x903e,
+  0x9041, 0x9112, 0x9117, 0x916c, 0x916a, 0x9169, 0x91c9, 0x9237,
+  0x9257, 0x9238, 0x923d, 0x9240, 0x923e, 0x925b, 0x924b, 0x9264,
+  0x9251, 0x9234, 0x9249, 0x924d, 0x9245, 0x9239, 0x923f, 0x925a,
+  0x9598, 0x9698, 0x9694, 0x9695, 0x96cd, 0x96cb, 0x96c9, 0x96ca,
+  0x96f7, 0x96fb, 0x96f9, 0x96f6, 0x9756, 0x9774, 0x9776, 0x9810,
+  0x9811, 0x9813, 0x980a, 0x9812, 0x980c, 0x98fc, 0x98f4, 0x98fd,
+  0x98fe, 0x99b3, 0x99b1, 0x99b4, 0x9ae1, 0x9ce9, 0x9e82, 0x9f0e,
+  0x9f13, 0x9f20, 0x50e7, 0x50ee, 0x50e5, 0x50d6, 0x50ed, 0x50da,
+  0x50d5, 0x50cf, 0x50d1, 0x50f1, 0x50ce, 0x50e9, 0x5162, 0x51f3,
+  0x5283, 0x5282, 0x5331, 0x53ad, 0x55fe, 0x5600, 0x561b, 0x5617,
+  0x55fd, 0x5614, 0x5606, 0x5609, 0x560d, 0x560e, 0x55f7, 0x5616,
+  0x561f, 0x5608, 0x5610, 0x55f6, 0x5718, 0x5716, 0x5875, 0x587e,
+  0x5883, 0x5893, 0x588a, 0x5879, 0x5885, 0x587d, 0x58fd, 0x5925,
+  0x5922, 0x5924, 0x596a, 0x5969, 0x5ae1, 0x5ae6, 0x5ae9, 0x5ad7,
+  0x5ad6, 0x5ad8, 0x5ae3, 0x5b75, 0x5bde, 0x5be7, 0x5be1, 0x5be5,
+  0x5be6, 0x5be8, 0x5be2, 0x5be4, 0x5bdf, 0x5c0d, 0x5c62, 0x5d84,
+  0x5d87, 0x5e5b, 0x5e63, 0x5e55, 0x5e57, 0x5e54, 0x5ed3, 0x5ed6,
+  0x5f0a, 0x5f46, 0x5f70, 0x5fb9, 0x6147,
+  /* 0xba */
+  0x613f, 0x614b, 0x6177, 0x6162, 0x6163, 0x615f, 0x615a, 0x6158,
+  0x6175, 0x622a, 0x6487, 0x6458, 0x6454, 0x64a4, 0x6478, 0x645f,
+  0x647a, 0x6451, 0x6467, 0x6434, 0x646d, 0x647b, 0x6572, 0x65a1,
+  0x65d7, 0x65d6, 0x66a2, 0x66a8, 0x669d, 0x699c, 0x69a8, 0x6995,
+  0x69c1, 0x69ae, 0x69d3, 0x69cb, 0x699b, 0x69b7, 0x69bb, 0x69ab,
+  0x69b4, 0x69d0, 0x69cd, 0x69ad, 0x69cc, 0x69a6, 0x69c3, 0x69a3,
+  0x6b49, 0x6b4c, 0x6c33, 0x6f33, 0x6f14, 0x6efe, 0x6f13, 0x6ef4,
+  0x6f29, 0x6f3e, 0x6f20, 0x6f2c, 0x6f0f, 0x6f02, 0x6f22, 0x6eff,
+  0x6eef, 0x6f06, 0x6f31, 0x6f38, 0x6f32, 0x6f23, 0x6f15, 0x6f2b,
+  0x6f2f, 0x6f88, 0x6f2a, 0x6eec, 0x6f01, 0x6ef2, 0x6ecc, 0x6ef7,
+  0x7194, 0x7199, 0x717d, 0x718a, 0x7184, 0x7192, 0x723e, 0x7292,
+  0x7296, 0x7344, 0x7350, 0x7464, 0x7463, 0x746a, 0x7470, 0x746d,
+  0x7504, 0x7591, 0x7627, 0x760d, 0x760b, 0x7609, 0x7613, 0x76e1,
+  0x76e3, 0x7784, 0x777d, 0x777f, 0x7761, 0x78c1, 0x789f, 0x78a7,
+  0x78b3, 0x78a9, 0x78a3, 0x798e, 0x798f, 0x798d, 0x7a2e, 0x7a31,
+  0x7aaa, 0x7aa9, 0x7aed, 0x7aef, 0x7ba1, 0x7b95, 0x7b8b, 0x7b75,
+  0x7b97, 0x7b9d, 0x7b94, 0x7b8f, 0x7bb8, 0x7b87, 0x7b84, 0x7cb9,
+  0x7cbd, 0x7cbe, 0x7dbb, 0x7db0, 0x7d9c, 0x7dbd, 0x7dbe, 0x7da0,
+  0x7dca, 0x7db4, 0x7db2, 0x7db1, 0x7dba, 0x7da2, 0x7dbf, 0x7db5,
+  0x7db8, 0x7dad, 0x7dd2, 0x7dc7, 0x7dac,
+  /* 0xbb */
+  0x7f70, 0x7fe0, 0x7fe1, 0x7fdf, 0x805e, 0x805a, 0x8087, 0x8150,
+  0x8180, 0x818f, 0x8188, 0x818a, 0x817f, 0x8182, 0x81e7, 0x81fa,
+  0x8207, 0x8214, 0x821e, 0x824b, 0x84c9, 0x84bf, 0x84c6, 0x84c4,
+  0x8499, 0x849e, 0x84b2, 0x849c, 0x84cb, 0x84b8, 0x84c0, 0x84d3,
+  0x8490, 0x84bc, 0x84d1, 0x84ca, 0x873f, 0x871c, 0x873b, 0x8722,
+  0x8725, 0x8734, 0x8718, 0x8755, 0x8737, 0x8729, 0x88f3, 0x8902,
+  0x88f4, 0x88f9, 0x88f8, 0x88fd, 0x88e8, 0x891a, 0x88ef, 0x8aa6,
+  0x8a8c, 0x8a9e, 0x8aa3, 0x8a8d, 0x8aa1, 0x8a93, 0x8aa4, 0x8aaa,
+  0x8aa5, 0x8aa8, 0x8a98, 0x8a91, 0x8a9a, 0x8aa7, 0x8c6a, 0x8c8d,
+  0x8c8c, 0x8cd3, 0x8cd1, 0x8cd2, 0x8d6b, 0x8d99, 0x8d95, 0x8dfc,
+  0x8f14, 0x8f12, 0x8f15, 0x8f13, 0x8fa3, 0x9060, 0x9058, 0x905c,
+  0x9063, 0x9059, 0x905e, 0x9062, 0x905d, 0x905b, 0x9119, 0x9118,
+  0x911e, 0x9175, 0x9178, 0x9177, 0x9174, 0x9278, 0x9280, 0x9285,
+  0x9298, 0x9296, 0x927b, 0x9293, 0x929c, 0x92a8, 0x927c, 0x9291,
+  0x95a1, 0x95a8, 0x95a9, 0x95a3, 0x95a5, 0x95a4, 0x9699, 0x969c,
+  0x969b, 0x96cc, 0x96d2, 0x9700, 0x977c, 0x9785, 0x97f6, 0x9817,
+  0x9818, 0x98af, 0x98b1, 0x9903, 0x9905, 0x990c, 0x9909, 0x99c1,
+  0x9aaf, 0x9ab0, 0x9ae6, 0x9b41, 0x9b42, 0x9cf4, 0x9cf6, 0x9cf3,
+  0x9ebc, 0x9f3b, 0x9f4a, 0x5104, 0x5100, 0x50fb, 0x50f5, 0x50f9,
+  0x5102, 0x5108, 0x5109, 0x5105, 0x51dc,
+  /* 0xbc */
+  0x5287, 0x5288, 0x5289, 0x528d, 0x528a, 0x52f0, 0x53b2, 0x562e,
+  0x563b, 0x5639, 0x5632, 0x563f, 0x5634, 0x5629, 0x5653, 0x564e,
+  0x5657, 0x5674, 0x5636, 0x562f, 0x5630, 0x5880, 0x589f, 0x589e,
+  0x58b3, 0x589c, 0x58ae, 0x58a9, 0x58a6, 0x596d, 0x5b09, 0x5afb,
+  0x5b0b, 0x5af5, 0x5b0c, 0x5b08, 0x5bee, 0x5bec, 0x5be9, 0x5beb,
+  0x5c64, 0x5c65, 0x5d9d, 0x5d94, 0x5e62, 0x5e5f, 0x5e61, 0x5ee2,
+  0x5eda, 0x5edf, 0x5edd, 0x5ee3, 0x5ee0, 0x5f48, 0x5f71, 0x5fb7,
+  0x5fb5, 0x6176, 0x6167, 0x616e, 0x615d, 0x6155, 0x6182, 0x617c,
+  0x6170, 0x616b, 0x617e, 0x61a7, 0x6190, 0x61ab, 0x618e, 0x61ac,
+  0x619a, 0x61a4, 0x6194, 0x61ae, 0x622e, 0x6469, 0x646f, 0x6479,
+  0x649e, 0x64b2, 0x6488, 0x6490, 0x64b0, 0x64a5, 0x6493, 0x6495,
+  0x64a9, 0x6492, 0x64ae, 0x64ad, 0x64ab, 0x649a, 0x64ac, 0x6499,
+  0x64a2, 0x64b3, 0x6575, 0x6577, 0x6578, 0x66ae, 0x66ab, 0x66b4,
+  0x66b1, 0x6a23, 0x6a1f, 0x69e8, 0x6a01, 0x6a1e, 0x6a19, 0x69fd,
+  0x6a21, 0x6a13, 0x6a0a, 0x69f3, 0x6a02, 0x6a05, 0x69ed, 0x6a11,
+  0x6b50, 0x6b4e, 0x6ba4, 0x6bc5, 0x6bc6, 0x6f3f, 0x6f7c, 0x6f84,
+  0x6f51, 0x6f66, 0x6f54, 0x6f86, 0x6f6d, 0x6f5b, 0x6f78, 0x6f6e,
+  0x6f8e, 0x6f7a, 0x6f70, 0x6f64, 0x6f97, 0x6f58, 0x6ed5, 0x6f6f,
+  0x6f60, 0x6f5f, 0x719f, 0x71ac, 0x71b1, 0x71a8, 0x7256, 0x729b,
+  0x734e, 0x7357, 0x7469, 0x748b, 0x7483,
+  /* 0xbd */
+  0x747e, 0x7480, 0x757f, 0x7620, 0x7629, 0x761f, 0x7624, 0x7626,
+  0x7621, 0x7622, 0x769a, 0x76ba, 0x76e4, 0x778e, 0x7787, 0x778c,
+  0x7791, 0x778b, 0x78cb, 0x78c5, 0x78ba, 0x78ca, 0x78be, 0x78d5,
+  0x78bc, 0x78d0, 0x7a3f, 0x7a3c, 0x7a40, 0x7a3d, 0x7a37, 0x7a3b,
+  0x7aaf, 0x7aae, 0x7bad, 0x7bb1, 0x7bc4, 0x7bb4, 0x7bc6, 0x7bc7,
+  0x7bc1, 0x7ba0, 0x7bcc, 0x7cca, 0x7de0, 0x7df4, 0x7def, 0x7dfb,
+  0x7dd8, 0x7dec, 0x7ddd, 0x7de8, 0x7de3, 0x7dda, 0x7dde, 0x7de9,
+  0x7d9e, 0x7dd9, 0x7df2, 0x7df9, 0x7f75, 0x7f77, 0x7faf, 0x7fe9,
+  0x8026, 0x819b, 0x819c, 0x819d, 0x81a0, 0x819a, 0x8198, 0x8517,
+  0x853d, 0x851a, 0x84ee, 0x852c, 0x852d, 0x8513, 0x8511, 0x8523,
+  0x8521, 0x8514, 0x84ec, 0x8525, 0x84ff, 0x8506, 0x8782, 0x8774,
+  0x8776, 0x8760, 0x8766, 0x8778, 0x8768, 0x8759, 0x8757, 0x874c,
+  0x8753, 0x885b, 0x885d, 0x8910, 0x8907, 0x8912, 0x8913, 0x8915,
+  0x890a, 0x8abc, 0x8ad2, 0x8ac7, 0x8ac4, 0x8a95, 0x8acb, 0x8af8,
+  0x8ab2, 0x8ac9, 0x8ac2, 0x8abf, 0x8ab0, 0x8ad6, 0x8acd, 0x8ab6,
+  0x8ab9, 0x8adb, 0x8c4c, 0x8c4e, 0x8c6c, 0x8ce0, 0x8cde, 0x8ce6,
+  0x8ce4, 0x8cec, 0x8ced, 0x8ce2, 0x8ce3, 0x8cdc, 0x8cea, 0x8ce1,
+  0x8d6d, 0x8d9f, 0x8da3, 0x8e2b, 0x8e10, 0x8e1d, 0x8e22, 0x8e0f,
+  0x8e29, 0x8e1f, 0x8e21, 0x8e1e, 0x8eba, 0x8f1d, 0x8f1b, 0x8f1f,
+  0x8f29, 0x8f26, 0x8f2a, 0x8f1c, 0x8f1e,
+  /* 0xbe */
+  0x8f25, 0x9069, 0x906e, 0x9068, 0x906d, 0x9077, 0x9130, 0x912d,
+  0x9127, 0x9131, 0x9187, 0x9189, 0x918b, 0x9183, 0x92c5, 0x92bb,
+  0x92b7, 0x92ea, 0x92ac, 0x92e4, 0x92c1, 0x92b3, 0x92bc, 0x92d2,
+  0x92c7, 0x92f0, 0x92b2, 0x95ad, 0x95b1, 0x9704, 0x9706, 0x9707,
+  0x9709, 0x9760, 0x978d, 0x978b, 0x978f, 0x9821, 0x982b, 0x981c,
+  0x98b3, 0x990a, 0x9913, 0x9912, 0x9918, 0x99dd, 0x99d0, 0x99df,
+  0x99db, 0x99d1, 0x99d5, 0x99d2, 0x99d9, 0x9ab7, 0x9aee, 0x9aef,
+  0x9b27, 0x9b45, 0x9b44, 0x9b77, 0x9b6f, 0x9d06, 0x9d09, 0x9d03,
+  0x9ea9, 0x9ebe, 0x9ece, 0x58a8, 0x9f52, 0x5112, 0x5118, 0x5114,
+  0x5110, 0x5115, 0x5180, 0x51aa, 0x51dd, 0x5291, 0x5293, 0x52f3,
+  0x5659, 0x566b, 0x5679, 0x5669, 0x5664, 0x5678, 0x566a, 0x5668,
+  0x5665, 0x5671, 0x566f, 0x566c, 0x5662, 0x5676, 0x58c1, 0x58be,
+  0x58c7, 0x58c5, 0x596e, 0x5b1d, 0x5b34, 0x5b78, 0x5bf0, 0x5c0e,
+  0x5f4a, 0x61b2, 0x6191, 0x61a9, 0x618a, 0x61cd, 0x61b6, 0x61be,
+  0x61ca, 0x61c8, 0x6230, 0x64c5, 0x64c1, 0x64cb, 0x64bb, 0x64bc,
+  0x64da, 0x64c4, 0x64c7, 0x64c2, 0x64cd, 0x64bf, 0x64d2, 0x64d4,
+  0x64be, 0x6574, 0x66c6, 0x66c9, 0x66b9, 0x66c4, 0x66c7, 0x66b8,
+  0x6a3d, 0x6a38, 0x6a3a, 0x6a59, 0x6a6b, 0x6a58, 0x6a39, 0x6a44,
+  0x6a62, 0x6a61, 0x6a4b, 0x6a47, 0x6a35, 0x6a5f, 0x6a48, 0x6b59,
+  0x6b77, 0x6c05, 0x6fc2, 0x6fb1, 0x6fa1,
+  /* 0xbf */
+  0x6fc3, 0x6fa4, 0x6fc1, 0x6fa7, 0x6fb3, 0x6fc0, 0x6fb9, 0x6fb6,
+  0x6fa6, 0x6fa0, 0x6fb4, 0x71be, 0x71c9, 0x71d0, 0x71d2, 0x71c8,
+  0x71d5, 0x71b9, 0x71ce, 0x71d9, 0x71dc, 0x71c3, 0x71c4, 0x7368,
+  0x749c, 0x74a3, 0x7498, 0x749f, 0x749e, 0x74e2, 0x750c, 0x750d,
+  0x7634, 0x7638, 0x763a, 0x76e7, 0x76e5, 0x77a0, 0x779e, 0x779f,
+  0x77a5, 0x78e8, 0x78da, 0x78ec, 0x78e7, 0x79a6, 0x7a4d, 0x7a4e,
+  0x7a46, 0x7a4c, 0x7a4b, 0x7aba, 0x7bd9, 0x7c11, 0x7bc9, 0x7be4,
+  0x7bdb, 0x7be1, 0x7be9, 0x7be6, 0x7cd5, 0x7cd6, 0x7e0a, 0x7e11,
+  0x7e08, 0x7e1b, 0x7e23, 0x7e1e, 0x7e1d, 0x7e09, 0x7e10, 0x7f79,
+  0x7fb2, 0x7ff0, 0x7ff1, 0x7fee, 0x8028, 0x81b3, 0x81a9, 0x81a8,
+  0x81fb, 0x8208, 0x8258, 0x8259, 0x854a, 0x8559, 0x8548, 0x8568,
+  0x8569, 0x8543, 0x8549, 0x856d, 0x856a, 0x855e, 0x8783, 0x879f,
+  0x879e, 0x87a2, 0x878d, 0x8861, 0x892a, 0x8932, 0x8925, 0x892b,
+  0x8921, 0x89aa, 0x89a6, 0x8ae6, 0x8afa, 0x8aeb, 0x8af1, 0x8b00,
+  0x8adc, 0x8ae7, 0x8aee, 0x8afe, 0x8b01, 0x8b02, 0x8af7, 0x8aed,
+  0x8af3, 0x8af6, 0x8afc, 0x8c6b, 0x8c6d, 0x8c93, 0x8cf4, 0x8e44,
+  0x8e31, 0x8e34, 0x8e42, 0x8e39, 0x8e35, 0x8f3b, 0x8f2f, 0x8f38,
+  0x8f33, 0x8fa8, 0x8fa6, 0x9075, 0x9074, 0x9078, 0x9072, 0x907c,
+  0x907a, 0x9134, 0x9192, 0x9320, 0x9336, 0x92f8, 0x9333, 0x932f,
+  0x9322, 0x92fc, 0x932b, 0x9304, 0x931a,
+  /* 0xc0 */
+  0x9310, 0x9326, 0x9321, 0x9315, 0x932e, 0x9319, 0x95bb, 0x96a7,
+  0x96a8, 0x96aa, 0x96d5, 0x970e, 0x9711, 0x9716, 0x970d, 0x9713,
+  0x970f, 0x975b, 0x975c, 0x9766, 0x9798, 0x9830, 0x9838, 0x983b,
+  0x9837, 0x982d, 0x9839, 0x9824, 0x9910, 0x9928, 0x991e, 0x991b,
+  0x9921, 0x991a, 0x99ed, 0x99e2, 0x99f1, 0x9ab8, 0x9abc, 0x9afb,
+  0x9aed, 0x9b28, 0x9b91, 0x9d15, 0x9d23, 0x9d26, 0x9d28, 0x9d12,
+  0x9d1b, 0x9ed8, 0x9ed4, 0x9f8d, 0x9f9c, 0x512a, 0x511f, 0x5121,
+  0x5132, 0x52f5, 0x568e, 0x5680, 0x5690, 0x5685, 0x5687, 0x568f,
+  0x58d5, 0x58d3, 0x58d1, 0x58ce, 0x5b30, 0x5b2a, 0x5b24, 0x5b7a,
+  0x5c37, 0x5c68, 0x5dbc, 0x5dba, 0x5dbd, 0x5db8, 0x5e6b, 0x5f4c,
+  0x5fbd, 0x61c9, 0x61c2, 0x61c7, 0x61e6, 0x61cb, 0x6232, 0x6234,
+  0x64ce, 0x64ca, 0x64d8, 0x64e0, 0x64f0, 0x64e6, 0x64ec, 0x64f1,
+  0x64e2, 0x64ed, 0x6582, 0x6583, 0x66d9, 0x66d6, 0x6a80, 0x6a94,
+  0x6a84, 0x6aa2, 0x6a9c, 0x6adb, 0x6aa3, 0x6a7e, 0x6a97, 0x6a90,
+  0x6aa0, 0x6b5c, 0x6bae, 0x6bda, 0x6c08, 0x6fd8, 0x6ff1, 0x6fdf,
+  0x6fe0, 0x6fdb, 0x6fe4, 0x6feb, 0x6fef, 0x6f80, 0x6fec, 0x6fe1,
+  0x6fe9, 0x6fd5, 0x6fee, 0x6ff0, 0x71e7, 0x71df, 0x71ee, 0x71e6,
+  0x71e5, 0x71ed, 0x71ec, 0x71f4, 0x71e0, 0x7235, 0x7246, 0x7370,
+  0x7372, 0x74a9, 0x74b0, 0x74a6, 0x74a8, 0x7646, 0x7642, 0x764c,
+  0x76ea, 0x77b3, 0x77aa, 0x77b0, 0x77ac,
+  /* 0xc1 */
+  0x77a7, 0x77ad, 0x77ef, 0x78f7, 0x78fa, 0x78f4, 0x78ef, 0x7901,
+  0x79a7, 0x79aa, 0x7a57, 0x7abf, 0x7c07, 0x7c0d, 0x7bfe, 0x7bf7,
+  0x7c0c, 0x7be0, 0x7ce0, 0x7cdc, 0x7cde, 0x7ce2, 0x7cdf, 0x7cd9,
+  0x7cdd, 0x7e2e, 0x7e3e, 0x7e46, 0x7e37, 0x7e32, 0x7e43, 0x7e2b,
+  0x7e3d, 0x7e31, 0x7e45, 0x7e41, 0x7e34, 0x7e39, 0x7e48, 0x7e35,
+  0x7e3f, 0x7e2f, 0x7f44, 0x7ff3, 0x7ffc, 0x8071, 0x8072, 0x8070,
+  0x806f, 0x8073, 0x81c6, 0x81c3, 0x81ba, 0x81c2, 0x81c0, 0x81bf,
+  0x81bd, 0x81c9, 0x81be, 0x81e8, 0x8209, 0x8271, 0x85aa, 0x8584,
+  0x857e, 0x859c, 0x8591, 0x8594, 0x85af, 0x859b, 0x8587, 0x85a8,
+  0x858a, 0x8667, 0x87c0, 0x87d1, 0x87b3, 0x87d2, 0x87c6, 0x87ab,
+  0x87bb, 0x87ba, 0x87c8, 0x87cb, 0x893b, 0x8936, 0x8944, 0x8938,
+  0x893d, 0x89ac, 0x8b0e, 0x8b17, 0x8b19, 0x8b1b, 0x8b0a, 0x8b20,
+  0x8b1d, 0x8b04, 0x8b10, 0x8c41, 0x8c3f, 0x8c73, 0x8cfa, 0x8cfd,
+  0x8cfc, 0x8cf8, 0x8cfb, 0x8da8, 0x8e49, 0x8e4b, 0x8e48, 0x8e4a,
+  0x8f44, 0x8f3e, 0x8f42, 0x8f45, 0x8f3f, 0x907f, 0x907d, 0x9084,
+  0x9081, 0x9082, 0x9080, 0x9139, 0x91a3, 0x919e, 0x919c, 0x934d,
+  0x9382, 0x9328, 0x9375, 0x934a, 0x9365, 0x934b, 0x9318, 0x937e,
+  0x936c, 0x935b, 0x9370, 0x935a, 0x9354, 0x95ca, 0x95cb, 0x95cc,
+  0x95c8, 0x95c6, 0x96b1, 0x96b8, 0x96d6, 0x971c, 0x971e, 0x97a0,
+  0x97d3, 0x9846, 0x98b6, 0x9935, 0x9a01,
+  /* 0xc2 */
+  0x99ff, 0x9bae, 0x9bab, 0x9baa, 0x9bad, 0x9d3b, 0x9d3f, 0x9e8b,
+  0x9ecf, 0x9ede, 0x9edc, 0x9edd, 0x9edb, 0x9f3e, 0x9f4b, 0x53e2,
+  0x5695, 0x56ae, 0x58d9, 0x58d8, 0x5b38, 0x5f5d, 0x61e3, 0x6233,
+  0x64f4, 0x64f2, 0x64fe, 0x6506, 0x64fa, 0x64fb, 0x64f7, 0x65b7,
+  0x66dc, 0x6726, 0x6ab3, 0x6aac, 0x6ac3, 0x6abb, 0x6ab8, 0x6ac2,
+  0x6aae, 0x6aaf, 0x6b5f, 0x6b78, 0x6baf, 0x7009, 0x700b, 0x6ffe,
+  0x7006, 0x6ffa, 0x7011, 0x700f, 0x71fb, 0x71fc, 0x71fe, 0x71f8,
+  0x7377, 0x7375, 0x74a7, 0x74bf, 0x7515, 0x7656, 0x7658, 0x7652,
+  0x77bd, 0x77bf, 0x77bb, 0x77bc, 0x790e, 0x79ae, 0x7a61, 0x7a62,
+  0x7a60, 0x7ac4, 0x7ac5, 0x7c2b, 0x7c27, 0x7c2a, 0x7c1e, 0x7c23,
+  0x7c21, 0x7ce7, 0x7e54, 0x7e55, 0x7e5e, 0x7e5a, 0x7e61, 0x7e52,
+  0x7e59, 0x7f48, 0x7ff9, 0x7ffb, 0x8077, 0x8076, 0x81cd, 0x81cf,
+  0x820a, 0x85cf, 0x85a9, 0x85cd, 0x85d0, 0x85c9, 0x85b0, 0x85ba,
+  0x85b9, 0x85a6, 0x87ef, 0x87ec, 0x87f2, 0x87e0, 0x8986, 0x89b2,
+  0x89f4, 0x8b28, 0x8b39, 0x8b2c, 0x8b2b, 0x8c50, 0x8d05, 0x8e59,
+  0x8e63, 0x8e66, 0x8e64, 0x8e5f, 0x8e55, 0x8ec0, 0x8f49, 0x8f4d,
+  0x9087, 0x9083, 0x9088, 0x91ab, 0x91ac, 0x91d0, 0x9394, 0x938a,
+  0x9396, 0x93a2, 0x93b3, 0x93ae, 0x93ac, 0x93b0, 0x9398, 0x939a,
+  0x9397, 0x95d4, 0x95d6, 0x95d0, 0x95d5, 0x96e2, 0x96dc, 0x96d9,
+  0x96db, 0x96de, 0x9724, 0x97a3, 0x97a6,
+  /* 0xc3 */
+  0x97ad, 0x97f9, 0x984d, 0x984f, 0x984c, 0x984e, 0x9853, 0x98ba,
+  0x993e, 0x993f, 0x993d, 0x992e, 0x99a5, 0x9a0e, 0x9ac1, 0x9b03,
+  0x9b06, 0x9b4f, 0x9b4e, 0x9b4d, 0x9bca, 0x9bc9, 0x9bfd, 0x9bc8,
+  0x9bc0, 0x9d51, 0x9d5d, 0x9d60, 0x9ee0, 0x9f15, 0x9f2c, 0x5133,
+  0x56a5, 0x58de, 0x58df, 0x58e2, 0x5bf5, 0x9f90, 0x5eec, 0x61f2,
+  0x61f7, 0x61f6, 0x61f5, 0x6500, 0x650f, 0x66e0, 0x66dd, 0x6ae5,
+  0x6add, 0x6ada, 0x6ad3, 0x701b, 0x701f, 0x7028, 0x701a, 0x701d,
+  0x7015, 0x7018, 0x7206, 0x720d, 0x7258, 0x72a2, 0x7378, 0x737a,
+  0x74bd, 0x74ca, 0x74e3, 0x7587, 0x7586, 0x765f, 0x7661, 0x77c7,
+  0x7919, 0x79b1, 0x7a6b, 0x7a69, 0x7c3e, 0x7c3f, 0x7c38, 0x7c3d,
+  0x7c37, 0x7c40, 0x7e6b, 0x7e6d, 0x7e79, 0x7e69, 0x7e6a, 0x7f85,
+  0x7e73, 0x7fb6, 0x7fb9, 0x7fb8, 0x81d8, 0x85e9, 0x85dd, 0x85ea,
+  0x85d5, 0x85e4, 0x85e5, 0x85f7, 0x87fb, 0x8805, 0x880d, 0x87f9,
+  0x87fe, 0x8960, 0x895f, 0x8956, 0x895e, 0x8b41, 0x8b5c, 0x8b58,
+  0x8b49, 0x8b5a, 0x8b4e, 0x8b4f, 0x8b46, 0x8b59, 0x8d08, 0x8d0a,
+  0x8e7c, 0x8e72, 0x8e87, 0x8e76, 0x8e6c, 0x8e7a, 0x8e74, 0x8f54,
+  0x8f4e, 0x8fad, 0x908a, 0x908b, 0x91b1, 0x91ae, 0x93e1, 0x93d1,
+  0x93df, 0x93c3, 0x93c8, 0x93dc, 0x93dd, 0x93d6, 0x93e2, 0x93cd,
+  0x93d8, 0x93e4, 0x93d7, 0x93e8, 0x95dc, 0x96b4, 0x96e3, 0x972a,
+  0x9727, 0x9761, 0x97dc, 0x97fb, 0x985e,
+  /* 0xc4 */
+  0x9858, 0x985b, 0x98bc, 0x9945, 0x9949, 0x9a16, 0x9a19, 0x9b0d,
+  0x9be8, 0x9be7, 0x9bd6, 0x9bdb, 0x9d89, 0x9d61, 0x9d72, 0x9d6a,
+  0x9d6c, 0x9e92, 0x9e97, 0x9e93, 0x9eb4, 0x52f8, 0x56a8, 0x56b7,
+  0x56b6, 0x56b4, 0x56bc, 0x58e4, 0x5b40, 0x5b43, 0x5b7d, 0x5bf6,
+  0x5dc9, 0x61f8, 0x61fa, 0x6518, 0x6514, 0x6519, 0x66e6, 0x6727,
+  0x6aec, 0x703e, 0x7030, 0x7032, 0x7210, 0x737b, 0x74cf, 0x7662,
+  0x7665, 0x7926, 0x792a, 0x792c, 0x792b, 0x7ac7, 0x7af6, 0x7c4c,
+  0x7c43, 0x7c4d, 0x7cef, 0x7cf0, 0x8fae, 0x7e7d, 0x7e7c, 0x7e82,
+  0x7f4c, 0x8000, 0x81da, 0x8266, 0x85fb, 0x85f9, 0x8611, 0x85fa,
+  0x8606, 0x860b, 0x8607, 0x860a, 0x8814, 0x8815, 0x8964, 0x89ba,
+  0x89f8, 0x8b70, 0x8b6c, 0x8b66, 0x8b6f, 0x8b5f, 0x8b6b, 0x8d0f,
+  0x8d0d, 0x8e89, 0x8e81, 0x8e85, 0x8e82, 0x91b4, 0x91cb, 0x9418,
+  0x9403, 0x93fd, 0x95e1, 0x9730, 0x98c4, 0x9952, 0x9951, 0x99a8,
+  0x9a2b, 0x9a30, 0x9a37, 0x9a35, 0x9c13, 0x9c0d, 0x9e79, 0x9eb5,
+  0x9ee8, 0x9f2f, 0x9f5f, 0x9f63, 0x9f61, 0x5137, 0x5138, 0x56c1,
+  0x56c0, 0x56c2, 0x5914, 0x5c6c, 0x5dcd, 0x61fc, 0x61fe, 0x651d,
+  0x651c, 0x6595, 0x66e9, 0x6afb, 0x6b04, 0x6afa, 0x6bb2, 0x704c,
+  0x721b, 0x72a7, 0x74d6, 0x74d4, 0x7669, 0x77d3, 0x7c50, 0x7e8f,
+  0x7e8c, 0x7fbc, 0x8617, 0x862d, 0x861a, 0x8823, 0x8822, 0x8821,
+  0x881f, 0x896a, 0x896c, 0x89bd, 0x8b74,
+  /* 0xc5 */
+  0x8b77, 0x8b7d, 0x8d13, 0x8e8a, 0x8e8d, 0x8e8b, 0x8f5f, 0x8faf,
+  0x91ba, 0x942e, 0x9433, 0x9435, 0x943a, 0x9438, 0x9432, 0x942b,
+  0x95e2, 0x9738, 0x9739, 0x9732, 0x97ff, 0x9867, 0x9865, 0x9957,
+  0x9a45, 0x9a43, 0x9a40, 0x9a3e, 0x9acf, 0x9b54, 0x9b51, 0x9c2d,
+  0x9c25, 0x9daf, 0x9db4, 0x9dc2, 0x9db8, 0x9e9d, 0x9eef, 0x9f19,
+  0x9f5c, 0x9f66, 0x9f67, 0x513c, 0x513b, 0x56c8, 0x56ca, 0x56c9,
+  0x5b7f, 0x5dd4, 0x5dd2, 0x5f4e, 0x61ff, 0x6524, 0x6b0a, 0x6b61,
+  0x7051, 0x7058, 0x7380, 0x74e4, 0x758a, 0x766e, 0x766c, 0x79b3,
+  0x7c60, 0x7c5f, 0x807e, 0x807d, 0x81df, 0x8972, 0x896f, 0x89fc,
+  0x8b80, 0x8d16, 0x8d17, 0x8e91, 0x8e93, 0x8f61, 0x9148, 0x9444,
+  0x9451, 0x9452, 0x973d, 0x973e, 0x97c3, 0x97c1, 0x986b, 0x9955,
+  0x9a55, 0x9a4d, 0x9ad2, 0x9b1a, 0x9c49, 0x9c31, 0x9c3e, 0x9c3b,
+  0x9dd3, 0x9dd7, 0x9f34, 0x9f6c, 0x9f6a, 0x9f94, 0x56cc, 0x5dd6,
+  0x6200, 0x6523, 0x652b, 0x652a, 0x66ec, 0x6b10, 0x74da, 0x7aca,
+  0x7c64, 0x7c63, 0x7c65, 0x7e93, 0x7e96, 0x7e94, 0x81e2, 0x8638,
+  0x863f, 0x8831, 0x8b8a, 0x9090, 0x908f, 0x9463, 0x9460, 0x9464,
+  0x9768, 0x986f, 0x995c, 0x9a5a, 0x9a5b, 0x9a57, 0x9ad3, 0x9ad4,
+  0x9ad1, 0x9c54, 0x9c57, 0x9c56, 0x9de5, 0x9e9f, 0x9ef4, 0x56d1,
+  0x58e9, 0x652c, 0x705e, 0x7671, 0x7672, 0x77d7, 0x7f50, 0x7f88,
+  0x8836, 0x8839, 0x8862, 0x8b93, 0x8b92,
+  /* 0xc6 */
+  0x8b96, 0x8277, 0x8d1b, 0x91c0, 0x946a, 0x9742, 0x9748, 0x9744,
+  0x97c6, 0x9870, 0x9a5f, 0x9b22, 0x9b58, 0x9c5f, 0x9df9, 0x9dfa,
+  0x9e7c, 0x9e7d, 0x9f07, 0x9f77, 0x9f72, 0x5ef3, 0x6b16, 0x7063,
+  0x7c6c, 0x7c6e, 0x883b, 0x89c0, 0x8ea1, 0x91c1, 0x9472, 0x9470,
+  0x9871, 0x995e, 0x9ad6, 0x9b23, 0x9ecc, 0x7064, 0x77da, 0x8b9a,
+  0x9477, 0x97c9, 0x9a62, 0x9a65, 0x7e9c, 0x8b9c, 0x8eaa, 0x91c5,
+  0x947d, 0x947e, 0x947c, 0x9c77, 0x9c78, 0x9ef7, 0x8c54, 0x947f,
+  0x9e1a, 0x7228, 0x9a6a, 0x9b31, 0x9e1b, 0x9e1e, 0x7c72, 0x30fe,
+  0x309d, 0x309e, 0x3005, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045,
+  0x3046, 0x3047, 0x3048, 0x3049, 0x304a, 0x304b, 0x304c, 0x304d,
+  0x304e, 0x304f, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055,
+  0x3056, 0x3057, 0x3058, 0x3059, 0x305a, 0x305b, 0x305c, 0x305d,
+  0x305e, 0x305f, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065,
+  0x3066, 0x3067, 0x3068, 0x3069, 0x306a, 0x306b, 0x306c, 0x306d,
+  0x306e, 0x306f, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075,
+  0x3076, 0x3077, 0x3078, 0x3079, 0x307a, 0x307b, 0x307c, 0x307d,
+  0x307e, 0x307f, 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085,
+  0x3086, 0x3087, 0x3088, 0x3089, 0x308a, 0x308b, 0x308c, 0x308d,
+  0x308e, 0x308f, 0x3090, 0x3091, 0x3092, 0x3093, 0x30a1, 0x30a2,
+  0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7,
+  /* 0xc7 */
+  0x30a8, 0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad, 0x30ae, 0x30af,
+  0x30b0, 0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5, 0x30b6, 0x30b7,
+  0x30b8, 0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd, 0x30be, 0x30bf,
+  0x30c0, 0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5, 0x30c6, 0x30c7,
+  0x30c8, 0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf,
+  0x30d0, 0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5, 0x30d6, 0x30d7,
+  0x30d8, 0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd, 0x30de, 0x30df,
+  0x30e0, 0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7,
+  0x30e8, 0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ee, 0x30ef,
+  0x30f0, 0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5, 0x30f6, 0x0414,
+  0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b,
+  0x041c, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429,
+  0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, 0x0430, 0x0431,
+  0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438,
+  0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x0440,
+  0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448,
+  0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, 0x2460,
+  0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468,
+  0x2469, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247a,
+  0x247b, 0x247c, 0x247d,
+};
+static const unsigned short big5_2uni_pagec9[7652] = {
+  /* 0xc9 */
+  0x4e42, 0x4e5c, 0x51f5, 0x531a, 0x5382, 0x4e07, 0x4e0c, 0x4e47,
+  0x4e8d, 0x56d7, 0xfa0c, 0x5c6e, 0x5f73, 0x4e0f, 0x5187, 0x4e0e,
+  0x4e2e, 0x4e93, 0x4ec2, 0x4ec9, 0x4ec8, 0x5198, 0x52fc, 0x536c,
+  0x53b9, 0x5720, 0x5903, 0x592c, 0x5c10, 0x5dff, 0x65e1, 0x6bb3,
+  0x6bcc, 0x6c14, 0x723f, 0x4e31, 0x4e3c, 0x4ee8, 0x4edc, 0x4ee9,
+  0x4ee1, 0x4edd, 0x4eda, 0x520c, 0x531c, 0x534c, 0x5722, 0x5723,
+  0x5917, 0x592f, 0x5b81, 0x5b84, 0x5c12, 0x5c3b, 0x5c74, 0x5c73,
+  0x5e04, 0x5e80, 0x5e82, 0x5fc9, 0x6209, 0x6250, 0x6c15, 0x6c36,
+  0x6c43, 0x6c3f, 0x6c3b, 0x72ae, 0x72b0, 0x738a, 0x79b8, 0x808a,
+  0x961e, 0x4f0e, 0x4f18, 0x4f2c, 0x4ef5, 0x4f14, 0x4ef1, 0x4f00,
+  0x4ef7, 0x4f08, 0x4f1d, 0x4f02, 0x4f05, 0x4f22, 0x4f13, 0x4f04,
+  0x4ef4, 0x4f12, 0x51b1, 0x5213, 0x5209, 0x5210, 0x52a6, 0x5322,
+  0x531f, 0x534d, 0x538a, 0x5407, 0x56e1, 0x56df, 0x572e, 0x572a,
+  0x5734, 0x593c, 0x5980, 0x597c, 0x5985, 0x597b, 0x597e, 0x5977,
+  0x597f, 0x5b56, 0x5c15, 0x5c25, 0x5c7c, 0x5c7a, 0x5c7b, 0x5c7e,
+  0x5ddf, 0x5e75, 0x5e84, 0x5f02, 0x5f1a, 0x5f74, 0x5fd5, 0x5fd4,
+  0x5fcf, 0x625c, 0x625e, 0x6264, 0x6261, 0x6266, 0x6262, 0x6259,
+  0x6260, 0x625a, 0x6265, 0x65ef, 0x65ee, 0x673e, 0x6739, 0x6738,
+  0x673b, 0x673a, 0x673f, 0x673c, 0x6733, 0x6c18, 0x6c46, 0x6c52,
+  0x6c5c, 0x6c4f, 0x6c4a, 0x6c54, 0x6c4b,
+  /* 0xca */
+  0x6c4c, 0x7071, 0x725e, 0x72b4, 0x72b5, 0x738e, 0x752a, 0x767f,
+  0x7a75, 0x7f51, 0x8278, 0x827c, 0x8280, 0x827d, 0x827f, 0x864d,
+  0x897e, 0x9099, 0x9097, 0x9098, 0x909b, 0x9094, 0x9622, 0x9624,
+  0x9620, 0x9623, 0x4f56, 0x4f3b, 0x4f62, 0x4f49, 0x4f53, 0x4f64,
+  0x4f3e, 0x4f67, 0x4f52, 0x4f5f, 0x4f41, 0x4f58, 0x4f2d, 0x4f33,
+  0x4f3f, 0x4f61, 0x518f, 0x51b9, 0x521c, 0x521e, 0x5221, 0x52ad,
+  0x52ae, 0x5309, 0x5363, 0x5372, 0x538e, 0x538f, 0x5430, 0x5437,
+  0x542a, 0x5454, 0x5445, 0x5419, 0x541c, 0x5425, 0x5418, 0x543d,
+  0x544f, 0x5441, 0x5428, 0x5424, 0x5447, 0x56ee, 0x56e7, 0x56e5,
+  0x5741, 0x5745, 0x574c, 0x5749, 0x574b, 0x5752, 0x5906, 0x5940,
+  0x59a6, 0x5998, 0x59a0, 0x5997, 0x598e, 0x59a2, 0x5990, 0x598f,
+  0x59a7, 0x59a1, 0x5b8e, 0x5b92, 0x5c28, 0x5c2a, 0x5c8d, 0x5c8f,
+  0x5c88, 0x5c8b, 0x5c89, 0x5c92, 0x5c8a, 0x5c86, 0x5c93, 0x5c95,
+  0x5de0, 0x5e0a, 0x5e0e, 0x5e8b, 0x5e89, 0x5e8c, 0x5e88, 0x5e8d,
+  0x5f05, 0x5f1d, 0x5f78, 0x5f76, 0x5fd2, 0x5fd1, 0x5fd0, 0x5fed,
+  0x5fe8, 0x5fee, 0x5ff3, 0x5fe1, 0x5fe4, 0x5fe3, 0x5ffa, 0x5fef,
+  0x5ff7, 0x5ffb, 0x6000, 0x5ff4, 0x623a, 0x6283, 0x628c, 0x628e,
+  0x628f, 0x6294, 0x6287, 0x6271, 0x627b, 0x627a, 0x6270, 0x6281,
+  0x6288, 0x6277, 0x627d, 0x6272, 0x6274, 0x6537, 0x65f0, 0x65f4,
+  0x65f3, 0x65f2, 0x65f5, 0x6745, 0x6747,
+  /* 0xcb */
+  0x6759, 0x6755, 0x674c, 0x6748, 0x675d, 0x674d, 0x675a, 0x674b,
+  0x6bd0, 0x6c19, 0x6c1a, 0x6c78, 0x6c67, 0x6c6b, 0x6c84, 0x6c8b,
+  0x6c8f, 0x6c71, 0x6c6f, 0x6c69, 0x6c9a, 0x6c6d, 0x6c87, 0x6c95,
+  0x6c9c, 0x6c66, 0x6c73, 0x6c65, 0x6c7b, 0x6c8e, 0x7074, 0x707a,
+  0x7263, 0x72bf, 0x72bd, 0x72c3, 0x72c6, 0x72c1, 0x72ba, 0x72c5,
+  0x7395, 0x7397, 0x7393, 0x7394, 0x7392, 0x753a, 0x7539, 0x7594,
+  0x7595, 0x7681, 0x793d, 0x8034, 0x8095, 0x8099, 0x8090, 0x8092,
+  0x809c, 0x8290, 0x828f, 0x8285, 0x828e, 0x8291, 0x8293, 0x828a,
+  0x8283, 0x8284, 0x8c78, 0x8fc9, 0x8fbf, 0x909f, 0x90a1, 0x90a5,
+  0x909e, 0x90a7, 0x90a0, 0x9630, 0x9628, 0x962f, 0x962d, 0x4e33,
+  0x4f98, 0x4f7c, 0x4f85, 0x4f7d, 0x4f80, 0x4f87, 0x4f76, 0x4f74,
+  0x4f89, 0x4f84, 0x4f77, 0x4f4c, 0x4f97, 0x4f6a, 0x4f9a, 0x4f79,
+  0x4f81, 0x4f78, 0x4f90, 0x4f9c, 0x4f94, 0x4f9e, 0x4f92, 0x4f82,
+  0x4f95, 0x4f6b, 0x4f6e, 0x519e, 0x51bc, 0x51be, 0x5235, 0x5232,
+  0x5233, 0x5246, 0x5231, 0x52bc, 0x530a, 0x530b, 0x533c, 0x5392,
+  0x5394, 0x5487, 0x547f, 0x5481, 0x5491, 0x5482, 0x5488, 0x546b,
+  0x547a, 0x547e, 0x5465, 0x546c, 0x5474, 0x5466, 0x548d, 0x546f,
+  0x5461, 0x5460, 0x5498, 0x5463, 0x5467, 0x5464, 0x56f7, 0x56f9,
+  0x576f, 0x5772, 0x576d, 0x576b, 0x5771, 0x5770, 0x5776, 0x5780,
+  0x5775, 0x577b, 0x5773, 0x5774, 0x5762,
+  /* 0xcc */
+  0x5768, 0x577d, 0x590c, 0x5945, 0x59b5, 0x59ba, 0x59cf, 0x59ce,
+  0x59b2, 0x59cc, 0x59c1, 0x59b6, 0x59bc, 0x59c3, 0x59d6, 0x59b1,
+  0x59bd, 0x59c0, 0x59c8, 0x59b4, 0x59c7, 0x5b62, 0x5b65, 0x5b93,
+  0x5b95, 0x5c44, 0x5c47, 0x5cae, 0x5ca4, 0x5ca0, 0x5cb5, 0x5caf,
+  0x5ca8, 0x5cac, 0x5c9f, 0x5ca3, 0x5cad, 0x5ca2, 0x5caa, 0x5ca7,
+  0x5c9d, 0x5ca5, 0x5cb6, 0x5cb0, 0x5ca6, 0x5e17, 0x5e14, 0x5e19,
+  0x5f28, 0x5f22, 0x5f23, 0x5f24, 0x5f54, 0x5f82, 0x5f7e, 0x5f7d,
+  0x5fde, 0x5fe5, 0x602d, 0x6026, 0x6019, 0x6032, 0x600b, 0x6034,
+  0x600a, 0x6017, 0x6033, 0x601a, 0x601e, 0x602c, 0x6022, 0x600d,
+  0x6010, 0x602e, 0x6013, 0x6011, 0x600c, 0x6009, 0x601c, 0x6214,
+  0x623d, 0x62ad, 0x62b4, 0x62d1, 0x62be, 0x62aa, 0x62b6, 0x62ca,
+  0x62ae, 0x62b3, 0x62af, 0x62bb, 0x62a9, 0x62b0, 0x62b8, 0x653d,
+  0x65a8, 0x65bb, 0x6609, 0x65fc, 0x6604, 0x6612, 0x6608, 0x65fb,
+  0x6603, 0x660b, 0x660d, 0x6605, 0x65fd, 0x6611, 0x6610, 0x66f6,
+  0x670a, 0x6785, 0x676c, 0x678e, 0x6792, 0x6776, 0x677b, 0x6798,
+  0x6786, 0x6784, 0x6774, 0x678d, 0x678c, 0x677a, 0x679f, 0x6791,
+  0x6799, 0x6783, 0x677d, 0x6781, 0x6778, 0x6779, 0x6794, 0x6b25,
+  0x6b80, 0x6b7e, 0x6bde, 0x6c1d, 0x6c93, 0x6cec, 0x6ceb, 0x6cee,
+  0x6cd9, 0x6cb6, 0x6cd4, 0x6cad, 0x6ce7, 0x6cb7, 0x6cd0, 0x6cc2,
+  0x6cba, 0x6cc3, 0x6cc6, 0x6ced, 0x6cf2,
+  /* 0xcd */
+  0x6cd2, 0x6cdd, 0x6cb4, 0x6c8a, 0x6c9d, 0x6c80, 0x6cde, 0x6cc0,
+  0x6d30, 0x6ccd, 0x6cc7, 0x6cb0, 0x6cf9, 0x6ccf, 0x6ce9, 0x6cd1,
+  0x7094, 0x7098, 0x7085, 0x7093, 0x7086, 0x7084, 0x7091, 0x7096,
+  0x7082, 0x709a, 0x7083, 0x726a, 0x72d6, 0x72cb, 0x72d8, 0x72c9,
+  0x72dc, 0x72d2, 0x72d4, 0x72da, 0x72cc, 0x72d1, 0x73a4, 0x73a1,
+  0x73ad, 0x73a6, 0x73a2, 0x73a0, 0x73ac, 0x739d, 0x74dd, 0x74e8,
+  0x753f, 0x7540, 0x753e, 0x758c, 0x7598, 0x76af, 0x76f3, 0x76f1,
+  0x76f0, 0x76f5, 0x77f8, 0x77fc, 0x77f9, 0x77fb, 0x77fa, 0x77f7,
+  0x7942, 0x793f, 0x79c5, 0x7a78, 0x7a7b, 0x7afb, 0x7c75, 0x7cfd,
+  0x8035, 0x808f, 0x80ae, 0x80a3, 0x80b8, 0x80b5, 0x80ad, 0x8220,
+  0x82a0, 0x82c0, 0x82ab, 0x829a, 0x8298, 0x829b, 0x82b5, 0x82a7,
+  0x82ae, 0x82bc, 0x829e, 0x82ba, 0x82b4, 0x82a8, 0x82a1, 0x82a9,
+  0x82c2, 0x82a4, 0x82c3, 0x82b6, 0x82a2, 0x8670, 0x866f, 0x866d,
+  0x866e, 0x8c56, 0x8fd2, 0x8fcb, 0x8fd3, 0x8fcd, 0x8fd6, 0x8fd5,
+  0x8fd7, 0x90b2, 0x90b4, 0x90af, 0x90b3, 0x90b0, 0x9639, 0x963d,
+  0x963c, 0x963a, 0x9643, 0x4fcd, 0x4fc5, 0x4fd3, 0x4fb2, 0x4fc9,
+  0x4fcb, 0x4fc1, 0x4fd4, 0x4fdc, 0x4fd9, 0x4fbb, 0x4fb3, 0x4fdb,
+  0x4fc7, 0x4fd6, 0x4fba, 0x4fc0, 0x4fb9, 0x4fec, 0x5244, 0x5249,
+  0x52c0, 0x52c2, 0x533d, 0x537c, 0x5397, 0x5396, 0x5399, 0x5398,
+  0x54ba, 0x54a1, 0x54ad, 0x54a5, 0x54cf,
+  /* 0xce */
+  0x54c3, 0x830d, 0x54b7, 0x54ae, 0x54d6, 0x54b6, 0x54c5, 0x54c6,
+  0x54a0, 0x5470, 0x54bc, 0x54a2, 0x54be, 0x5472, 0x54de, 0x54b0,
+  0x57b5, 0x579e, 0x579f, 0x57a4, 0x578c, 0x5797, 0x579d, 0x579b,
+  0x5794, 0x5798, 0x578f, 0x5799, 0x57a5, 0x579a, 0x5795, 0x58f4,
+  0x590d, 0x5953, 0x59e1, 0x59de, 0x59ee, 0x5a00, 0x59f1, 0x59dd,
+  0x59fa, 0x59fd, 0x59fc, 0x59f6, 0x59e4, 0x59f2, 0x59f7, 0x59db,
+  0x59e9, 0x59f3, 0x59f5, 0x59e0, 0x59fe, 0x59f4, 0x59ed, 0x5ba8,
+  0x5c4c, 0x5cd0, 0x5cd8, 0x5ccc, 0x5cd7, 0x5ccb, 0x5cdb, 0x5cde,
+  0x5cda, 0x5cc9, 0x5cc7, 0x5cca, 0x5cd6, 0x5cd3, 0x5cd4, 0x5ccf,
+  0x5cc8, 0x5cc6, 0x5cce, 0x5cdf, 0x5cf8, 0x5df9, 0x5e21, 0x5e22,
+  0x5e23, 0x5e20, 0x5e24, 0x5eb0, 0x5ea4, 0x5ea2, 0x5e9b, 0x5ea3,
+  0x5ea5, 0x5f07, 0x5f2e, 0x5f56, 0x5f86, 0x6037, 0x6039, 0x6054,
+  0x6072, 0x605e, 0x6045, 0x6053, 0x6047, 0x6049, 0x605b, 0x604c,
+  0x6040, 0x6042, 0x605f, 0x6024, 0x6044, 0x6058, 0x6066, 0x606e,
+  0x6242, 0x6243, 0x62cf, 0x630d, 0x630b, 0x62f5, 0x630e, 0x6303,
+  0x62eb, 0x62f9, 0x630f, 0x630c, 0x62f8, 0x62f6, 0x6300, 0x6313,
+  0x6314, 0x62fa, 0x6315, 0x62fb, 0x62f0, 0x6541, 0x6543, 0x65aa,
+  0x65bf, 0x6636, 0x6621, 0x6632, 0x6635, 0x661c, 0x6626, 0x6622,
+  0x6633, 0x662b, 0x663a, 0x661d, 0x6634, 0x6639, 0x662e, 0x670f,
+  0x6710, 0x67c1, 0x67f2, 0x67c8, 0x67ba,
+  /* 0xcf */
+  0x67dc, 0x67bb, 0x67f8, 0x67d8, 0x67c0, 0x67b7, 0x67c5, 0x67eb,
+  0x67e4, 0x67df, 0x67b5, 0x67cd, 0x67b3, 0x67f7, 0x67f6, 0x67ee,
+  0x67e3, 0x67c2, 0x67b9, 0x67ce, 0x67e7, 0x67f0, 0x67b2, 0x67fc,
+  0x67c6, 0x67ed, 0x67cc, 0x67ae, 0x67e6, 0x67db, 0x67fa, 0x67c9,
+  0x67ca, 0x67c3, 0x67ea, 0x67cb, 0x6b28, 0x6b82, 0x6b84, 0x6bb6,
+  0x6bd6, 0x6bd8, 0x6be0, 0x6c20, 0x6c21, 0x6d28, 0x6d34, 0x6d2d,
+  0x6d1f, 0x6d3c, 0x6d3f, 0x6d12, 0x6d0a, 0x6cda, 0x6d33, 0x6d04,
+  0x6d19, 0x6d3a, 0x6d1a, 0x6d11, 0x6d00, 0x6d1d, 0x6d42, 0x6d01,
+  0x6d18, 0x6d37, 0x6d03, 0x6d0f, 0x6d40, 0x6d07, 0x6d20, 0x6d2c,
+  0x6d08, 0x6d22, 0x6d09, 0x6d10, 0x70b7, 0x709f, 0x70be, 0x70b1,
+  0x70b0, 0x70a1, 0x70b4, 0x70b5, 0x70a9, 0x7241, 0x7249, 0x724a,
+  0x726c, 0x7270, 0x7273, 0x726e, 0x72ca, 0x72e4, 0x72e8, 0x72eb,
+  0x72df, 0x72ea, 0x72e6, 0x72e3, 0x7385, 0x73cc, 0x73c2, 0x73c8,
+  0x73c5, 0x73b9, 0x73b6, 0x73b5, 0x73b4, 0x73eb, 0x73bf, 0x73c7,
+  0x73be, 0x73c3, 0x73c6, 0x73b8, 0x73cb, 0x74ec, 0x74ee, 0x752e,
+  0x7547, 0x7548, 0x75a7, 0x75aa, 0x7679, 0x76c4, 0x7708, 0x7703,
+  0x7704, 0x7705, 0x770a, 0x76f7, 0x76fb, 0x76fa, 0x77e7, 0x77e8,
+  0x7806, 0x7811, 0x7812, 0x7805, 0x7810, 0x780f, 0x780e, 0x7809,
+  0x7803, 0x7813, 0x794a, 0x794c, 0x794b, 0x7945, 0x7944, 0x79d5,
+  0x79cd, 0x79cf, 0x79d6, 0x79ce, 0x7a80,
+  /* 0xd0 */
+  0x7a7e, 0x7ad1, 0x7b00, 0x7b01, 0x7c7a, 0x7c78, 0x7c79, 0x7c7f,
+  0x7c80, 0x7c81, 0x7d03, 0x7d08, 0x7d01, 0x7f58, 0x7f91, 0x7f8d,
+  0x7fbe, 0x8007, 0x800e, 0x800f, 0x8014, 0x8037, 0x80d8, 0x80c7,
+  0x80e0, 0x80d1, 0x80c8, 0x80c2, 0x80d0, 0x80c5, 0x80e3, 0x80d9,
+  0x80dc, 0x80ca, 0x80d5, 0x80c9, 0x80cf, 0x80d7, 0x80e6, 0x80cd,
+  0x81ff, 0x8221, 0x8294, 0x82d9, 0x82fe, 0x82f9, 0x8307, 0x82e8,
+  0x8300, 0x82d5, 0x833a, 0x82eb, 0x82d6, 0x82f4, 0x82ec, 0x82e1,
+  0x82f2, 0x82f5, 0x830c, 0x82fb, 0x82f6, 0x82f0, 0x82ea, 0x82e4,
+  0x82e0, 0x82fa, 0x82f3, 0x82ed, 0x8677, 0x8674, 0x867c, 0x8673,
+  0x8841, 0x884e, 0x8867, 0x886a, 0x8869, 0x89d3, 0x8a04, 0x8a07,
+  0x8d72, 0x8fe3, 0x8fe1, 0x8fee, 0x8fe0, 0x90f1, 0x90bd, 0x90bf,
+  0x90d5, 0x90c5, 0x90be, 0x90c7, 0x90cb, 0x90c8, 0x91d4, 0x91d3,
+  0x9654, 0x964f, 0x9651, 0x9653, 0x964a, 0x964e, 0x501e, 0x5005,
+  0x5007, 0x5013, 0x5022, 0x5030, 0x501b, 0x4ff5, 0x4ff4, 0x5033,
+  0x5037, 0x502c, 0x4ff6, 0x4ff7, 0x5017, 0x501c, 0x5020, 0x5027,
+  0x5035, 0x502f, 0x5031, 0x500e, 0x515a, 0x5194, 0x5193, 0x51ca,
+  0x51c4, 0x51c5, 0x51c8, 0x51ce, 0x5261, 0x525a, 0x5252, 0x525e,
+  0x525f, 0x5255, 0x5262, 0x52cd, 0x530e, 0x539e, 0x5526, 0x54e2,
+  0x5517, 0x5512, 0x54e7, 0x54f3, 0x54e4, 0x551a, 0x54ff, 0x5504,
+  0x5508, 0x54eb, 0x5511, 0x5505, 0x54f1,
+  /* 0xd1 */
+  0x550a, 0x54fb, 0x54f7, 0x54f8, 0x54e0, 0x550e, 0x5503, 0x550b,
+  0x5701, 0x5702, 0x57cc, 0x5832, 0x57d5, 0x57d2, 0x57ba, 0x57c6,
+  0x57bd, 0x57bc, 0x57b8, 0x57b6, 0x57bf, 0x57c7, 0x57d0, 0x57b9,
+  0x57c1, 0x590e, 0x594a, 0x5a19, 0x5a16, 0x5a2d, 0x5a2e, 0x5a15,
+  0x5a0f, 0x5a17, 0x5a0a, 0x5a1e, 0x5a33, 0x5b6c, 0x5ba7, 0x5bad,
+  0x5bac, 0x5c03, 0x5c56, 0x5c54, 0x5cec, 0x5cff, 0x5cee, 0x5cf1,
+  0x5cf7, 0x5d00, 0x5cf9, 0x5e29, 0x5e28, 0x5ea8, 0x5eae, 0x5eaa,
+  0x5eac, 0x5f33, 0x5f30, 0x5f67, 0x605d, 0x605a, 0x6067, 0x6041,
+  0x60a2, 0x6088, 0x6080, 0x6092, 0x6081, 0x609d, 0x6083, 0x6095,
+  0x609b, 0x6097, 0x6087, 0x609c, 0x608e, 0x6219, 0x6246, 0x62f2,
+  0x6310, 0x6356, 0x632c, 0x6344, 0x6345, 0x6336, 0x6343, 0x63e4,
+  0x6339, 0x634b, 0x634a, 0x633c, 0x6329, 0x6341, 0x6334, 0x6358,
+  0x6354, 0x6359, 0x632d, 0x6347, 0x6333, 0x635a, 0x6351, 0x6338,
+  0x6357, 0x6340, 0x6348, 0x654a, 0x6546, 0x65c6, 0x65c3, 0x65c4,
+  0x65c2, 0x664a, 0x665f, 0x6647, 0x6651, 0x6712, 0x6713, 0x681f,
+  0x681a, 0x6849, 0x6832, 0x6833, 0x683b, 0x684b, 0x684f, 0x6816,
+  0x6831, 0x681c, 0x6835, 0x682b, 0x682d, 0x682f, 0x684e, 0x6844,
+  0x6834, 0x681d, 0x6812, 0x6814, 0x6826, 0x6828, 0x682e, 0x684d,
+  0x683a, 0x6825, 0x6820, 0x6b2c, 0x6b2f, 0x6b2d, 0x6b31, 0x6b34,
+  0x6b6d, 0x8082, 0x6b88, 0x6be6, 0x6be4,
+  /* 0xd2 */
+  0x6be8, 0x6be3, 0x6be2, 0x6be7, 0x6c25, 0x6d7a, 0x6d63, 0x6d64,
+  0x6d76, 0x6d0d, 0x6d61, 0x6d92, 0x6d58, 0x6d62, 0x6d6d, 0x6d6f,
+  0x6d91, 0x6d8d, 0x6def, 0x6d7f, 0x6d86, 0x6d5e, 0x6d67, 0x6d60,
+  0x6d97, 0x6d70, 0x6d7c, 0x6d5f, 0x6d82, 0x6d98, 0x6d2f, 0x6d68,
+  0x6d8b, 0x6d7e, 0x6d80, 0x6d84, 0x6d16, 0x6d83, 0x6d7b, 0x6d7d,
+  0x6d75, 0x6d90, 0x70dc, 0x70d3, 0x70d1, 0x70dd, 0x70cb, 0x7f39,
+  0x70e2, 0x70d7, 0x70d2, 0x70de, 0x70e0, 0x70d4, 0x70cd, 0x70c5,
+  0x70c6, 0x70c7, 0x70da, 0x70ce, 0x70e1, 0x7242, 0x7278, 0x7277,
+  0x7276, 0x7300, 0x72fa, 0x72f4, 0x72fe, 0x72f6, 0x72f3, 0x72fb,
+  0x7301, 0x73d3, 0x73d9, 0x73e5, 0x73d6, 0x73bc, 0x73e7, 0x73e3,
+  0x73e9, 0x73dc, 0x73d2, 0x73db, 0x73d4, 0x73dd, 0x73da, 0x73d7,
+  0x73d8, 0x73e8, 0x74de, 0x74df, 0x74f4, 0x74f5, 0x7521, 0x755b,
+  0x755f, 0x75b0, 0x75c1, 0x75bb, 0x75c4, 0x75c0, 0x75bf, 0x75b6,
+  0x75ba, 0x768a, 0x76c9, 0x771d, 0x771b, 0x7710, 0x7713, 0x7712,
+  0x7723, 0x7711, 0x7715, 0x7719, 0x771a, 0x7722, 0x7727, 0x7823,
+  0x782c, 0x7822, 0x7835, 0x782f, 0x7828, 0x782e, 0x782b, 0x7821,
+  0x7829, 0x7833, 0x782a, 0x7831, 0x7954, 0x795b, 0x794f, 0x795c,
+  0x7953, 0x7952, 0x7951, 0x79eb, 0x79ec, 0x79e0, 0x79ee, 0x79ed,
+  0x79ea, 0x79dc, 0x79de, 0x79dd, 0x7a86, 0x7a89, 0x7a85, 0x7a8b,
+  0x7a8c, 0x7a8a, 0x7a87, 0x7ad8, 0x7b10,
+  /* 0xd3 */
+  0x7b04, 0x7b13, 0x7b05, 0x7b0f, 0x7b08, 0x7b0a, 0x7b0e, 0x7b09,
+  0x7b12, 0x7c84, 0x7c91, 0x7c8a, 0x7c8c, 0x7c88, 0x7c8d, 0x7c85,
+  0x7d1e, 0x7d1d, 0x7d11, 0x7d0e, 0x7d18, 0x7d16, 0x7d13, 0x7d1f,
+  0x7d12, 0x7d0f, 0x7d0c, 0x7f5c, 0x7f61, 0x7f5e, 0x7f60, 0x7f5d,
+  0x7f5b, 0x7f96, 0x7f92, 0x7fc3, 0x7fc2, 0x7fc0, 0x8016, 0x803e,
+  0x8039, 0x80fa, 0x80f2, 0x80f9, 0x80f5, 0x8101, 0x80fb, 0x8100,
+  0x8201, 0x822f, 0x8225, 0x8333, 0x832d, 0x8344, 0x8319, 0x8351,
+  0x8325, 0x8356, 0x833f, 0x8341, 0x8326, 0x831c, 0x8322, 0x8342,
+  0x834e, 0x831b, 0x832a, 0x8308, 0x833c, 0x834d, 0x8316, 0x8324,
+  0x8320, 0x8337, 0x832f, 0x8329, 0x8347, 0x8345, 0x834c, 0x8353,
+  0x831e, 0x832c, 0x834b, 0x8327, 0x8348, 0x8653, 0x8652, 0x86a2,
+  0x86a8, 0x8696, 0x868d, 0x8691, 0x869e, 0x8687, 0x8697, 0x8686,
+  0x868b, 0x869a, 0x8685, 0x86a5, 0x8699, 0x86a1, 0x86a7, 0x8695,
+  0x8698, 0x868e, 0x869d, 0x8690, 0x8694, 0x8843, 0x8844, 0x886d,
+  0x8875, 0x8876, 0x8872, 0x8880, 0x8871, 0x887f, 0x886f, 0x8883,
+  0x887e, 0x8874, 0x887c, 0x8a12, 0x8c47, 0x8c57, 0x8c7b, 0x8ca4,
+  0x8ca3, 0x8d76, 0x8d78, 0x8db5, 0x8db7, 0x8db6, 0x8ed1, 0x8ed3,
+  0x8ffe, 0x8ff5, 0x9002, 0x8fff, 0x8ffb, 0x9004, 0x8ffc, 0x8ff6,
+  0x90d6, 0x90e0, 0x90d9, 0x90da, 0x90e3, 0x90df, 0x90e5, 0x90d8,
+  0x90db, 0x90d7, 0x90dc, 0x90e4, 0x9150,
+  /* 0xd4 */
+  0x914e, 0x914f, 0x91d5, 0x91e2, 0x91da, 0x965c, 0x965f, 0x96bc,
+  0x98e3, 0x9adf, 0x9b2f, 0x4e7f, 0x5070, 0x506a, 0x5061, 0x505e,
+  0x5060, 0x5053, 0x504b, 0x505d, 0x5072, 0x5048, 0x504d, 0x5041,
+  0x505b, 0x504a, 0x5062, 0x5015, 0x5045, 0x505f, 0x5069, 0x506b,
+  0x5063, 0x5064, 0x5046, 0x5040, 0x506e, 0x5073, 0x5057, 0x5051,
+  0x51d0, 0x526b, 0x526d, 0x526c, 0x526e, 0x52d6, 0x52d3, 0x532d,
+  0x539c, 0x5575, 0x5576, 0x553c, 0x554d, 0x5550, 0x5534, 0x552a,
+  0x5551, 0x5562, 0x5536, 0x5535, 0x5530, 0x5552, 0x5545, 0x550c,
+  0x5532, 0x5565, 0x554e, 0x5539, 0x5548, 0x552d, 0x553b, 0x5540,
+  0x554b, 0x570a, 0x5707, 0x57fb, 0x5814, 0x57e2, 0x57f6, 0x57dc,
+  0x57f4, 0x5800, 0x57ed, 0x57fd, 0x5808, 0x57f8, 0x580b, 0x57f3,
+  0x57cf, 0x5807, 0x57ee, 0x57e3, 0x57f2, 0x57e5, 0x57ec, 0x57e1,
+  0x580e, 0x57fc, 0x5810, 0x57e7, 0x5801, 0x580c, 0x57f1, 0x57e9,
+  0x57f0, 0x580d, 0x5804, 0x595c, 0x5a60, 0x5a58, 0x5a55, 0x5a67,
+  0x5a5e, 0x5a38, 0x5a35, 0x5a6d, 0x5a50, 0x5a5f, 0x5a65, 0x5a6c,
+  0x5a53, 0x5a64, 0x5a57, 0x5a43, 0x5a5d, 0x5a52, 0x5a44, 0x5a5b,
+  0x5a48, 0x5a8e, 0x5a3e, 0x5a4d, 0x5a39, 0x5a4c, 0x5a70, 0x5a69,
+  0x5a47, 0x5a51, 0x5a56, 0x5a42, 0x5a5c, 0x5b72, 0x5b6e, 0x5bc1,
+  0x5bc0, 0x5c59, 0x5d1e, 0x5d0b, 0x5d1d, 0x5d1a, 0x5d20, 0x5d0c,
+  0x5d28, 0x5d0d, 0x5d26, 0x5d25, 0x5d0f,
+  /* 0xd5 */
+  0x5d30, 0x5d12, 0x5d23, 0x5d1f, 0x5d2e, 0x5e3e, 0x5e34, 0x5eb1,
+  0x5eb4, 0x5eb9, 0x5eb2, 0x5eb3, 0x5f36, 0x5f38, 0x5f9b, 0x5f96,
+  0x5f9f, 0x608a, 0x6090, 0x6086, 0x60be, 0x60b0, 0x60ba, 0x60d3,
+  0x60d4, 0x60cf, 0x60e4, 0x60d9, 0x60dd, 0x60c8, 0x60b1, 0x60db,
+  0x60b7, 0x60ca, 0x60bf, 0x60c3, 0x60cd, 0x60c0, 0x6332, 0x6365,
+  0x638a, 0x6382, 0x637d, 0x63bd, 0x639e, 0x63ad, 0x639d, 0x6397,
+  0x63ab, 0x638e, 0x636f, 0x6387, 0x6390, 0x636e, 0x63af, 0x6375,
+  0x639c, 0x636d, 0x63ae, 0x637c, 0x63a4, 0x633b, 0x639f, 0x6378,
+  0x6385, 0x6381, 0x6391, 0x638d, 0x6370, 0x6553, 0x65cd, 0x6665,
+  0x6661, 0x665b, 0x6659, 0x665c, 0x6662, 0x6718, 0x6879, 0x6887,
+  0x6890, 0x689c, 0x686d, 0x686e, 0x68ae, 0x68ab, 0x6956, 0x686f,
+  0x68a3, 0x68ac, 0x68a9, 0x6875, 0x6874, 0x68b2, 0x688f, 0x6877,
+  0x6892, 0x687c, 0x686b, 0x6872, 0x68aa, 0x6880, 0x6871, 0x687e,
+  0x689b, 0x6896, 0x688b, 0x68a0, 0x6889, 0x68a4, 0x6878, 0x687b,
+  0x6891, 0x688c, 0x688a, 0x687d, 0x6b36, 0x6b33, 0x6b37, 0x6b38,
+  0x6b91, 0x6b8f, 0x6b8d, 0x6b8e, 0x6b8c, 0x6c2a, 0x6dc0, 0x6dab,
+  0x6db4, 0x6db3, 0x6e74, 0x6dac, 0x6de9, 0x6de2, 0x6db7, 0x6df6,
+  0x6dd4, 0x6e00, 0x6dc8, 0x6de0, 0x6ddf, 0x6dd6, 0x6dbe, 0x6de5,
+  0x6ddc, 0x6ddd, 0x6ddb, 0x6df4, 0x6dca, 0x6dbd, 0x6ded, 0x6df0,
+  0x6dba, 0x6dd5, 0x6dc2, 0x6dcf, 0x6dc9,
+  /* 0xd6 */
+  0x6dd0, 0x6df2, 0x6dd3, 0x6dfd, 0x6dd7, 0x6dcd, 0x6de3, 0x6dbb,
+  0x70fa, 0x710d, 0x70f7, 0x7117, 0x70f4, 0x710c, 0x70f0, 0x7104,
+  0x70f3, 0x7110, 0x70fc, 0x70ff, 0x7106, 0x7113, 0x7100, 0x70f8,
+  0x70f6, 0x710b, 0x7102, 0x710e, 0x727e, 0x727b, 0x727c, 0x727f,
+  0x731d, 0x7317, 0x7307, 0x7311, 0x7318, 0x730a, 0x7308, 0x72ff,
+  0x730f, 0x731e, 0x7388, 0x73f6, 0x73f8, 0x73f5, 0x7404, 0x7401,
+  0x73fd, 0x7407, 0x7400, 0x73fa, 0x73fc, 0x73ff, 0x740c, 0x740b,
+  0x73f4, 0x7408, 0x7564, 0x7563, 0x75ce, 0x75d2, 0x75cf, 0x75cb,
+  0x75cc, 0x75d1, 0x75d0, 0x768f, 0x7689, 0x76d3, 0x7739, 0x772f,
+  0x772d, 0x7731, 0x7732, 0x7734, 0x7733, 0x773d, 0x7725, 0x773b,
+  0x7735, 0x7848, 0x7852, 0x7849, 0x784d, 0x784a, 0x784c, 0x7826,
+  0x7845, 0x7850, 0x7964, 0x7967, 0x7969, 0x796a, 0x7963, 0x796b,
+  0x7961, 0x79bb, 0x79fa, 0x79f8, 0x79f6, 0x79f7, 0x7a8f, 0x7a94,
+  0x7a90, 0x7b35, 0x7b47, 0x7b34, 0x7b25, 0x7b30, 0x7b22, 0x7b24,
+  0x7b33, 0x7b18, 0x7b2a, 0x7b1d, 0x7b31, 0x7b2b, 0x7b2d, 0x7b2f,
+  0x7b32, 0x7b38, 0x7b1a, 0x7b23, 0x7c94, 0x7c98, 0x7c96, 0x7ca3,
+  0x7d35, 0x7d3d, 0x7d38, 0x7d36, 0x7d3a, 0x7d45, 0x7d2c, 0x7d29,
+  0x7d41, 0x7d47, 0x7d3e, 0x7d3f, 0x7d4a, 0x7d3b, 0x7d28, 0x7f63,
+  0x7f95, 0x7f9c, 0x7f9d, 0x7f9b, 0x7fca, 0x7fcb, 0x7fcd, 0x7fd0,
+  0x7fd1, 0x7fc7, 0x7fcf, 0x7fc9, 0x801f,
+  /* 0xd7 */
+  0x801e, 0x801b, 0x8047, 0x8043, 0x8048, 0x8118, 0x8125, 0x8119,
+  0x811b, 0x812d, 0x811f, 0x812c, 0x811e, 0x8121, 0x8115, 0x8127,
+  0x811d, 0x8122, 0x8211, 0x8238, 0x8233, 0x823a, 0x8234, 0x8232,
+  0x8274, 0x8390, 0x83a3, 0x83a8, 0x838d, 0x837a, 0x8373, 0x83a4,
+  0x8374, 0x838f, 0x8381, 0x8395, 0x8399, 0x8375, 0x8394, 0x83a9,
+  0x837d, 0x8383, 0x838c, 0x839d, 0x839b, 0x83aa, 0x838b, 0x837e,
+  0x83a5, 0x83af, 0x8388, 0x8397, 0x83b0, 0x837f, 0x83a6, 0x8387,
+  0x83ae, 0x8376, 0x839a, 0x8659, 0x8656, 0x86bf, 0x86b7, 0x86c2,
+  0x86c1, 0x86c5, 0x86ba, 0x86b0, 0x86c8, 0x86b9, 0x86b3, 0x86b8,
+  0x86cc, 0x86b4, 0x86bb, 0x86bc, 0x86c3, 0x86bd, 0x86be, 0x8852,
+  0x8889, 0x8895, 0x88a8, 0x88a2, 0x88aa, 0x889a, 0x8891, 0x88a1,
+  0x889f, 0x8898, 0x88a7, 0x8899, 0x889b, 0x8897, 0x88a4, 0x88ac,
+  0x888c, 0x8893, 0x888e, 0x8982, 0x89d6, 0x89d9, 0x89d5, 0x8a30,
+  0x8a27, 0x8a2c, 0x8a1e, 0x8c39, 0x8c3b, 0x8c5c, 0x8c5d, 0x8c7d,
+  0x8ca5, 0x8d7d, 0x8d7b, 0x8d79, 0x8dbc, 0x8dc2, 0x8db9, 0x8dbf,
+  0x8dc1, 0x8ed8, 0x8ede, 0x8edd, 0x8edc, 0x8ed7, 0x8ee0, 0x8ee1,
+  0x9024, 0x900b, 0x9011, 0x901c, 0x900c, 0x9021, 0x90ef, 0x90ea,
+  0x90f0, 0x90f4, 0x90f2, 0x90f3, 0x90d4, 0x90eb, 0x90ec, 0x90e9,
+  0x9156, 0x9158, 0x915a, 0x9153, 0x9155, 0x91ec, 0x91f4, 0x91f1,
+  0x91f3, 0x91f8, 0x91e4, 0x91f9, 0x91ea,
+  /* 0xd8 */
+  0x91eb, 0x91f7, 0x91e8, 0x91ee, 0x957a, 0x9586, 0x9588, 0x967c,
+  0x966d, 0x966b, 0x9671, 0x966f, 0x96bf, 0x976a, 0x9804, 0x98e5,
+  0x9997, 0x509b, 0x5095, 0x5094, 0x509e, 0x508b, 0x50a3, 0x5083,
+  0x508c, 0x508e, 0x509d, 0x5068, 0x509c, 0x5092, 0x5082, 0x5087,
+  0x515f, 0x51d4, 0x5312, 0x5311, 0x53a4, 0x53a7, 0x5591, 0x55a8,
+  0x55a5, 0x55ad, 0x5577, 0x5645, 0x55a2, 0x5593, 0x5588, 0x558f,
+  0x55b5, 0x5581, 0x55a3, 0x5592, 0x55a4, 0x557d, 0x558c, 0x55a6,
+  0x557f, 0x5595, 0x55a1, 0x558e, 0x570c, 0x5829, 0x5837, 0x5819,
+  0x581e, 0x5827, 0x5823, 0x5828, 0x57f5, 0x5848, 0x5825, 0x581c,
+  0x581b, 0x5833, 0x583f, 0x5836, 0x582e, 0x5839, 0x5838, 0x582d,
+  0x582c, 0x583b, 0x5961, 0x5aaf, 0x5a94, 0x5a9f, 0x5a7a, 0x5aa2,
+  0x5a9e, 0x5a78, 0x5aa6, 0x5a7c, 0x5aa5, 0x5aac, 0x5a95, 0x5aae,
+  0x5a37, 0x5a84, 0x5a8a, 0x5a97, 0x5a83, 0x5a8b, 0x5aa9, 0x5a7b,
+  0x5a7d, 0x5a8c, 0x5a9c, 0x5a8f, 0x5a93, 0x5a9d, 0x5bea, 0x5bcd,
+  0x5bcb, 0x5bd4, 0x5bd1, 0x5bca, 0x5bce, 0x5c0c, 0x5c30, 0x5d37,
+  0x5d43, 0x5d6b, 0x5d41, 0x5d4b, 0x5d3f, 0x5d35, 0x5d51, 0x5d4e,
+  0x5d55, 0x5d33, 0x5d3a, 0x5d52, 0x5d3d, 0x5d31, 0x5d59, 0x5d42,
+  0x5d39, 0x5d49, 0x5d38, 0x5d3c, 0x5d32, 0x5d36, 0x5d40, 0x5d45,
+  0x5e44, 0x5e41, 0x5f58, 0x5fa6, 0x5fa5, 0x5fab, 0x60c9, 0x60b9,
+  0x60cc, 0x60e2, 0x60ce, 0x60c4, 0x6114,
+  /* 0xd9 */
+  0x60f2, 0x610a, 0x6116, 0x6105, 0x60f5, 0x6113, 0x60f8, 0x60fc,
+  0x60fe, 0x60c1, 0x6103, 0x6118, 0x611d, 0x6110, 0x60ff, 0x6104,
+  0x610b, 0x624a, 0x6394, 0x63b1, 0x63b0, 0x63ce, 0x63e5, 0x63e8,
+  0x63ef, 0x63c3, 0x649d, 0x63f3, 0x63ca, 0x63e0, 0x63f6, 0x63d5,
+  0x63f2, 0x63f5, 0x6461, 0x63df, 0x63be, 0x63dd, 0x63dc, 0x63c4,
+  0x63d8, 0x63d3, 0x63c2, 0x63c7, 0x63cc, 0x63cb, 0x63c8, 0x63f0,
+  0x63d7, 0x63d9, 0x6532, 0x6567, 0x656a, 0x6564, 0x655c, 0x6568,
+  0x6565, 0x658c, 0x659d, 0x659e, 0x65ae, 0x65d0, 0x65d2, 0x667c,
+  0x666c, 0x667b, 0x6680, 0x6671, 0x6679, 0x666a, 0x6672, 0x6701,
+  0x690c, 0x68d3, 0x6904, 0x68dc, 0x692a, 0x68ec, 0x68ea, 0x68f1,
+  0x690f, 0x68d6, 0x68f7, 0x68eb, 0x68e4, 0x68f6, 0x6913, 0x6910,
+  0x68f3, 0x68e1, 0x6907, 0x68cc, 0x6908, 0x6970, 0x68b4, 0x6911,
+  0x68ef, 0x68c6, 0x6914, 0x68f8, 0x68d0, 0x68fd, 0x68fc, 0x68e8,
+  0x690b, 0x690a, 0x6917, 0x68ce, 0x68c8, 0x68dd, 0x68de, 0x68e6,
+  0x68f4, 0x68d1, 0x6906, 0x68d4, 0x68e9, 0x6915, 0x6925, 0x68c7,
+  0x6b39, 0x6b3b, 0x6b3f, 0x6b3c, 0x6b94, 0x6b97, 0x6b99, 0x6b95,
+  0x6bbd, 0x6bf0, 0x6bf2, 0x6bf3, 0x6c30, 0x6dfc, 0x6e46, 0x6e47,
+  0x6e1f, 0x6e49, 0x6e88, 0x6e3c, 0x6e3d, 0x6e45, 0x6e62, 0x6e2b,
+  0x6e3f, 0x6e41, 0x6e5d, 0x6e73, 0x6e1c, 0x6e33, 0x6e4b, 0x6e40,
+  0x6e51, 0x6e3b, 0x6e03, 0x6e2e, 0x6e5e,
+  /* 0xda */
+  0x6e68, 0x6e5c, 0x6e61, 0x6e31, 0x6e28, 0x6e60, 0x6e71, 0x6e6b,
+  0x6e39, 0x6e22, 0x6e30, 0x6e53, 0x6e65, 0x6e27, 0x6e78, 0x6e64,
+  0x6e77, 0x6e55, 0x6e79, 0x6e52, 0x6e66, 0x6e35, 0x6e36, 0x6e5a,
+  0x7120, 0x711e, 0x712f, 0x70fb, 0x712e, 0x7131, 0x7123, 0x7125,
+  0x7122, 0x7132, 0x711f, 0x7128, 0x713a, 0x711b, 0x724b, 0x725a,
+  0x7288, 0x7289, 0x7286, 0x7285, 0x728b, 0x7312, 0x730b, 0x7330,
+  0x7322, 0x7331, 0x7333, 0x7327, 0x7332, 0x732d, 0x7326, 0x7323,
+  0x7335, 0x730c, 0x742e, 0x742c, 0x7430, 0x742b, 0x7416, 0x741a,
+  0x7421, 0x742d, 0x7431, 0x7424, 0x7423, 0x741d, 0x7429, 0x7420,
+  0x7432, 0x74fb, 0x752f, 0x756f, 0x756c, 0x75e7, 0x75da, 0x75e1,
+  0x75e6, 0x75dd, 0x75df, 0x75e4, 0x75d7, 0x7695, 0x7692, 0x76da,
+  0x7746, 0x7747, 0x7744, 0x774d, 0x7745, 0x774a, 0x774e, 0x774b,
+  0x774c, 0x77de, 0x77ec, 0x7860, 0x7864, 0x7865, 0x785c, 0x786d,
+  0x7871, 0x786a, 0x786e, 0x7870, 0x7869, 0x7868, 0x785e, 0x7862,
+  0x7974, 0x7973, 0x7972, 0x7970, 0x7a02, 0x7a0a, 0x7a03, 0x7a0c,
+  0x7a04, 0x7a99, 0x7ae6, 0x7ae4, 0x7b4a, 0x7b3b, 0x7b44, 0x7b48,
+  0x7b4c, 0x7b4e, 0x7b40, 0x7b58, 0x7b45, 0x7ca2, 0x7c9e, 0x7ca8,
+  0x7ca1, 0x7d58, 0x7d6f, 0x7d63, 0x7d53, 0x7d56, 0x7d67, 0x7d6a,
+  0x7d4f, 0x7d6d, 0x7d5c, 0x7d6b, 0x7d52, 0x7d54, 0x7d69, 0x7d51,
+  0x7d5f, 0x7d4e, 0x7f3e, 0x7f3f, 0x7f65,
+  /* 0xdb */
+  0x7f66, 0x7fa2, 0x7fa0, 0x7fa1, 0x7fd7, 0x8051, 0x804f, 0x8050,
+  0x80fe, 0x80d4, 0x8143, 0x814a, 0x8152, 0x814f, 0x8147, 0x813d,
+  0x814d, 0x813a, 0x81e6, 0x81ee, 0x81f7, 0x81f8, 0x81f9, 0x8204,
+  0x823c, 0x823d, 0x823f, 0x8275, 0x833b, 0x83cf, 0x83f9, 0x8423,
+  0x83c0, 0x83e8, 0x8412, 0x83e7, 0x83e4, 0x83fc, 0x83f6, 0x8410,
+  0x83c6, 0x83c8, 0x83eb, 0x83e3, 0x83bf, 0x8401, 0x83dd, 0x83e5,
+  0x83d8, 0x83ff, 0x83e1, 0x83cb, 0x83ce, 0x83d6, 0x83f5, 0x83c9,
+  0x8409, 0x840f, 0x83de, 0x8411, 0x8406, 0x83c2, 0x83f3, 0x83d5,
+  0x83fa, 0x83c7, 0x83d1, 0x83ea, 0x8413, 0x83c3, 0x83ec, 0x83ee,
+  0x83c4, 0x83fb, 0x83d7, 0x83e2, 0x841b, 0x83db, 0x83fe, 0x86d8,
+  0x86e2, 0x86e6, 0x86d3, 0x86e3, 0x86da, 0x86ea, 0x86dd, 0x86eb,
+  0x86dc, 0x86ec, 0x86e9, 0x86d7, 0x86e8, 0x86d1, 0x8848, 0x8856,
+  0x8855, 0x88ba, 0x88d7, 0x88b9, 0x88b8, 0x88c0, 0x88be, 0x88b6,
+  0x88bc, 0x88b7, 0x88bd, 0x88b2, 0x8901, 0x88c9, 0x8995, 0x8998,
+  0x8997, 0x89dd, 0x89da, 0x89db, 0x8a4e, 0x8a4d, 0x8a39, 0x8a59,
+  0x8a40, 0x8a57, 0x8a58, 0x8a44, 0x8a45, 0x8a52, 0x8a48, 0x8a51,
+  0x8a4a, 0x8a4c, 0x8a4f, 0x8c5f, 0x8c81, 0x8c80, 0x8cba, 0x8cbe,
+  0x8cb0, 0x8cb9, 0x8cb5, 0x8d84, 0x8d80, 0x8d89, 0x8dd8, 0x8dd3,
+  0x8dcd, 0x8dc7, 0x8dd6, 0x8ddc, 0x8dcf, 0x8dd5, 0x8dd9, 0x8dc8,
+  0x8dd7, 0x8dc5, 0x8eef, 0x8ef7, 0x8efa,
+  /* 0xdc */
+  0x8ef9, 0x8ee6, 0x8eee, 0x8ee5, 0x8ef5, 0x8ee7, 0x8ee8, 0x8ef6,
+  0x8eeb, 0x8ef1, 0x8eec, 0x8ef4, 0x8ee9, 0x902d, 0x9034, 0x902f,
+  0x9106, 0x912c, 0x9104, 0x90ff, 0x90fc, 0x9108, 0x90f9, 0x90fb,
+  0x9101, 0x9100, 0x9107, 0x9105, 0x9103, 0x9161, 0x9164, 0x915f,
+  0x9162, 0x9160, 0x9201, 0x920a, 0x9225, 0x9203, 0x921a, 0x9226,
+  0x920f, 0x920c, 0x9200, 0x9212, 0x91ff, 0x91fd, 0x9206, 0x9204,
+  0x9227, 0x9202, 0x921c, 0x9224, 0x9219, 0x9217, 0x9205, 0x9216,
+  0x957b, 0x958d, 0x958c, 0x9590, 0x9687, 0x967e, 0x9688, 0x9689,
+  0x9683, 0x9680, 0x96c2, 0x96c8, 0x96c3, 0x96f1, 0x96f0, 0x976c,
+  0x9770, 0x976e, 0x9807, 0x98a9, 0x98eb, 0x9ce6, 0x9ef9, 0x4e83,
+  0x4e84, 0x4eb6, 0x50bd, 0x50bf, 0x50c6, 0x50ae, 0x50c4, 0x50ca,
+  0x50b4, 0x50c8, 0x50c2, 0x50b0, 0x50c1, 0x50ba, 0x50b1, 0x50cb,
+  0x50c9, 0x50b6, 0x50b8, 0x51d7, 0x527a, 0x5278, 0x527b, 0x527c,
+  0x55c3, 0x55db, 0x55cc, 0x55d0, 0x55cb, 0x55ca, 0x55dd, 0x55c0,
+  0x55d4, 0x55c4, 0x55e9, 0x55bf, 0x55d2, 0x558d, 0x55cf, 0x55d5,
+  0x55e2, 0x55d6, 0x55c8, 0x55f2, 0x55cd, 0x55d9, 0x55c2, 0x5714,
+  0x5853, 0x5868, 0x5864, 0x584f, 0x584d, 0x5849, 0x586f, 0x5855,
+  0x584e, 0x585d, 0x5859, 0x5865, 0x585b, 0x583d, 0x5863, 0x5871,
+  0x58fc, 0x5ac7, 0x5ac4, 0x5acb, 0x5aba, 0x5ab8, 0x5ab1, 0x5ab5,
+  0x5ab0, 0x5abf, 0x5ac8, 0x5abb, 0x5ac6,
+  /* 0xdd */
+  0x5ab7, 0x5ac0, 0x5aca, 0x5ab4, 0x5ab6, 0x5acd, 0x5ab9, 0x5a90,
+  0x5bd6, 0x5bd8, 0x5bd9, 0x5c1f, 0x5c33, 0x5d71, 0x5d63, 0x5d4a,
+  0x5d65, 0x5d72, 0x5d6c, 0x5d5e, 0x5d68, 0x5d67, 0x5d62, 0x5df0,
+  0x5e4f, 0x5e4e, 0x5e4a, 0x5e4d, 0x5e4b, 0x5ec5, 0x5ecc, 0x5ec6,
+  0x5ecb, 0x5ec7, 0x5f40, 0x5faf, 0x5fad, 0x60f7, 0x6149, 0x614a,
+  0x612b, 0x6145, 0x6136, 0x6132, 0x612e, 0x6146, 0x612f, 0x614f,
+  0x6129, 0x6140, 0x6220, 0x9168, 0x6223, 0x6225, 0x6224, 0x63c5,
+  0x63f1, 0x63eb, 0x6410, 0x6412, 0x6409, 0x6420, 0x6424, 0x6433,
+  0x6443, 0x641f, 0x6415, 0x6418, 0x6439, 0x6437, 0x6422, 0x6423,
+  0x640c, 0x6426, 0x6430, 0x6428, 0x6441, 0x6435, 0x642f, 0x640a,
+  0x641a, 0x6440, 0x6425, 0x6427, 0x640b, 0x63e7, 0x641b, 0x642e,
+  0x6421, 0x640e, 0x656f, 0x6592, 0x65d3, 0x6686, 0x668c, 0x6695,
+  0x6690, 0x668b, 0x668a, 0x6699, 0x6694, 0x6678, 0x6720, 0x6966,
+  0x695f, 0x6938, 0x694e, 0x6962, 0x6971, 0x693f, 0x6945, 0x696a,
+  0x6939, 0x6942, 0x6957, 0x6959, 0x697a, 0x6948, 0x6949, 0x6935,
+  0x696c, 0x6933, 0x693d, 0x6965, 0x68f0, 0x6978, 0x6934, 0x6969,
+  0x6940, 0x696f, 0x6944, 0x6976, 0x6958, 0x6941, 0x6974, 0x694c,
+  0x693b, 0x694b, 0x6937, 0x695c, 0x694f, 0x6951, 0x6932, 0x6952,
+  0x692f, 0x697b, 0x693c, 0x6b46, 0x6b45, 0x6b43, 0x6b42, 0x6b48,
+  0x6b41, 0x6b9b, 0xfa0d, 0x6bfb, 0x6bfc,
+  /* 0xde */
+  0x6bf9, 0x6bf7, 0x6bf8, 0x6e9b, 0x6ed6, 0x6ec8, 0x6e8f, 0x6ec0,
+  0x6e9f, 0x6e93, 0x6e94, 0x6ea0, 0x6eb1, 0x6eb9, 0x6ec6, 0x6ed2,
+  0x6ebd, 0x6ec1, 0x6e9e, 0x6ec9, 0x6eb7, 0x6eb0, 0x6ecd, 0x6ea6,
+  0x6ecf, 0x6eb2, 0x6ebe, 0x6ec3, 0x6edc, 0x6ed8, 0x6e99, 0x6e92,
+  0x6e8e, 0x6e8d, 0x6ea4, 0x6ea1, 0x6ebf, 0x6eb3, 0x6ed0, 0x6eca,
+  0x6e97, 0x6eae, 0x6ea3, 0x7147, 0x7154, 0x7152, 0x7163, 0x7160,
+  0x7141, 0x715d, 0x7162, 0x7172, 0x7178, 0x716a, 0x7161, 0x7142,
+  0x7158, 0x7143, 0x714b, 0x7170, 0x715f, 0x7150, 0x7153, 0x7144,
+  0x714d, 0x715a, 0x724f, 0x728d, 0x728c, 0x7291, 0x7290, 0x728e,
+  0x733c, 0x7342, 0x733b, 0x733a, 0x7340, 0x734a, 0x7349, 0x7444,
+  0x744a, 0x744b, 0x7452, 0x7451, 0x7457, 0x7440, 0x744f, 0x7450,
+  0x744e, 0x7442, 0x7446, 0x744d, 0x7454, 0x74e1, 0x74ff, 0x74fe,
+  0x74fd, 0x751d, 0x7579, 0x7577, 0x6983, 0x75ef, 0x760f, 0x7603,
+  0x75f7, 0x75fe, 0x75fc, 0x75f9, 0x75f8, 0x7610, 0x75fb, 0x75f6,
+  0x75ed, 0x75f5, 0x75fd, 0x7699, 0x76b5, 0x76dd, 0x7755, 0x775f,
+  0x7760, 0x7752, 0x7756, 0x775a, 0x7769, 0x7767, 0x7754, 0x7759,
+  0x776d, 0x77e0, 0x7887, 0x789a, 0x7894, 0x788f, 0x7884, 0x7895,
+  0x7885, 0x7886, 0x78a1, 0x7883, 0x7879, 0x7899, 0x7880, 0x7896,
+  0x787b, 0x797c, 0x7982, 0x797d, 0x7979, 0x7a11, 0x7a18, 0x7a19,
+  0x7a12, 0x7a17, 0x7a15, 0x7a22, 0x7a13,
+  /* 0xdf */
+  0x7a1b, 0x7a10, 0x7aa3, 0x7aa2, 0x7a9e, 0x7aeb, 0x7b66, 0x7b64,
+  0x7b6d, 0x7b74, 0x7b69, 0x7b72, 0x7b65, 0x7b73, 0x7b71, 0x7b70,
+  0x7b61, 0x7b78, 0x7b76, 0x7b63, 0x7cb2, 0x7cb4, 0x7caf, 0x7d88,
+  0x7d86, 0x7d80, 0x7d8d, 0x7d7f, 0x7d85, 0x7d7a, 0x7d8e, 0x7d7b,
+  0x7d83, 0x7d7c, 0x7d8c, 0x7d94, 0x7d84, 0x7d7d, 0x7d92, 0x7f6d,
+  0x7f6b, 0x7f67, 0x7f68, 0x7f6c, 0x7fa6, 0x7fa5, 0x7fa7, 0x7fdb,
+  0x7fdc, 0x8021, 0x8164, 0x8160, 0x8177, 0x815c, 0x8169, 0x815b,
+  0x8162, 0x8172, 0x6721, 0x815e, 0x8176, 0x8167, 0x816f, 0x8144,
+  0x8161, 0x821d, 0x8249, 0x8244, 0x8240, 0x8242, 0x8245, 0x84f1,
+  0x843f, 0x8456, 0x8476, 0x8479, 0x848f, 0x848d, 0x8465, 0x8451,
+  0x8440, 0x8486, 0x8467, 0x8430, 0x844d, 0x847d, 0x845a, 0x8459,
+  0x8474, 0x8473, 0x845d, 0x8507, 0x845e, 0x8437, 0x843a, 0x8434,
+  0x847a, 0x8443, 0x8478, 0x8432, 0x8445, 0x8429, 0x83d9, 0x844b,
+  0x842f, 0x8442, 0x842d, 0x845f, 0x8470, 0x8439, 0x844e, 0x844c,
+  0x8452, 0x846f, 0x84c5, 0x848e, 0x843b, 0x8447, 0x8436, 0x8433,
+  0x8468, 0x847e, 0x8444, 0x842b, 0x8460, 0x8454, 0x846e, 0x8450,
+  0x870b, 0x8704, 0x86f7, 0x870c, 0x86fa, 0x86d6, 0x86f5, 0x874d,
+  0x86f8, 0x870e, 0x8709, 0x8701, 0x86f6, 0x870d, 0x8705, 0x88d6,
+  0x88cb, 0x88cd, 0x88ce, 0x88de, 0x88db, 0x88da, 0x88cc, 0x88d0,
+  0x8985, 0x899b, 0x89df, 0x89e5, 0x89e4,
+  /* 0xe0 */
+  0x89e1, 0x89e0, 0x89e2, 0x89dc, 0x89e6, 0x8a76, 0x8a86, 0x8a7f,
+  0x8a61, 0x8a3f, 0x8a77, 0x8a82, 0x8a84, 0x8a75, 0x8a83, 0x8a81,
+  0x8a74, 0x8a7a, 0x8c3c, 0x8c4b, 0x8c4a, 0x8c65, 0x8c64, 0x8c66,
+  0x8c86, 0x8c84, 0x8c85, 0x8ccc, 0x8d68, 0x8d69, 0x8d91, 0x8d8c,
+  0x8d8e, 0x8d8f, 0x8d8d, 0x8d93, 0x8d94, 0x8d90, 0x8d92, 0x8df0,
+  0x8de0, 0x8dec, 0x8df1, 0x8dee, 0x8dd0, 0x8de9, 0x8de3, 0x8de2,
+  0x8de7, 0x8df2, 0x8deb, 0x8df4, 0x8f06, 0x8eff, 0x8f01, 0x8f00,
+  0x8f05, 0x8f07, 0x8f08, 0x8f02, 0x8f0b, 0x9052, 0x903f, 0x9044,
+  0x9049, 0x903d, 0x9110, 0x910d, 0x910f, 0x9111, 0x9116, 0x9114,
+  0x910b, 0x910e, 0x916e, 0x916f, 0x9248, 0x9252, 0x9230, 0x923a,
+  0x9266, 0x9233, 0x9265, 0x925e, 0x9283, 0x922e, 0x924a, 0x9246,
+  0x926d, 0x926c, 0x924f, 0x9260, 0x9267, 0x926f, 0x9236, 0x9261,
+  0x9270, 0x9231, 0x9254, 0x9263, 0x9250, 0x9272, 0x924e, 0x9253,
+  0x924c, 0x9256, 0x9232, 0x959f, 0x959c, 0x959e, 0x959b, 0x9692,
+  0x9693, 0x9691, 0x9697, 0x96ce, 0x96fa, 0x96fd, 0x96f8, 0x96f5,
+  0x9773, 0x9777, 0x9778, 0x9772, 0x980f, 0x980d, 0x980e, 0x98ac,
+  0x98f6, 0x98f9, 0x99af, 0x99b2, 0x99b0, 0x99b5, 0x9aad, 0x9aab,
+  0x9b5b, 0x9cea, 0x9ced, 0x9ce7, 0x9e80, 0x9efd, 0x50e6, 0x50d4,
+  0x50d7, 0x50e8, 0x50f3, 0x50db, 0x50ea, 0x50dd, 0x50e4, 0x50d3,
+  0x50ec, 0x50f0, 0x50ef, 0x50e3, 0x50e0,
+  /* 0xe1 */
+  0x51d8, 0x5280, 0x5281, 0x52e9, 0x52eb, 0x5330, 0x53ac, 0x5627,
+  0x5615, 0x560c, 0x5612, 0x55fc, 0x560f, 0x561c, 0x5601, 0x5613,
+  0x5602, 0x55fa, 0x561d, 0x5604, 0x55ff, 0x55f9, 0x5889, 0x587c,
+  0x5890, 0x5898, 0x5886, 0x5881, 0x587f, 0x5874, 0x588b, 0x587a,
+  0x5887, 0x5891, 0x588e, 0x5876, 0x5882, 0x5888, 0x587b, 0x5894,
+  0x588f, 0x58fe, 0x596b, 0x5adc, 0x5aee, 0x5ae5, 0x5ad5, 0x5aea,
+  0x5ada, 0x5aed, 0x5aeb, 0x5af3, 0x5ae2, 0x5ae0, 0x5adb, 0x5aec,
+  0x5ade, 0x5add, 0x5ad9, 0x5ae8, 0x5adf, 0x5b77, 0x5be0, 0x5be3,
+  0x5c63, 0x5d82, 0x5d80, 0x5d7d, 0x5d86, 0x5d7a, 0x5d81, 0x5d77,
+  0x5d8a, 0x5d89, 0x5d88, 0x5d7e, 0x5d7c, 0x5d8d, 0x5d79, 0x5d7f,
+  0x5e58, 0x5e59, 0x5e53, 0x5ed8, 0x5ed1, 0x5ed7, 0x5ece, 0x5edc,
+  0x5ed5, 0x5ed9, 0x5ed2, 0x5ed4, 0x5f44, 0x5f43, 0x5f6f, 0x5fb6,
+  0x612c, 0x6128, 0x6141, 0x615e, 0x6171, 0x6173, 0x6152, 0x6153,
+  0x6172, 0x616c, 0x6180, 0x6174, 0x6154, 0x617a, 0x615b, 0x6165,
+  0x613b, 0x616a, 0x6161, 0x6156, 0x6229, 0x6227, 0x622b, 0x642b,
+  0x644d, 0x645b, 0x645d, 0x6474, 0x6476, 0x6472, 0x6473, 0x647d,
+  0x6475, 0x6466, 0x64a6, 0x644e, 0x6482, 0x645e, 0x645c, 0x644b,
+  0x6453, 0x6460, 0x6450, 0x647f, 0x643f, 0x646c, 0x646b, 0x6459,
+  0x6465, 0x6477, 0x6573, 0x65a0, 0x66a1, 0x66a0, 0x669f, 0x6705,
+  0x6704, 0x6722, 0x69b1, 0x69b6, 0x69c9,
+  /* 0xe2 */
+  0x69a0, 0x69ce, 0x6996, 0x69b0, 0x69ac, 0x69bc, 0x6991, 0x6999,
+  0x698e, 0x69a7, 0x698d, 0x69a9, 0x69be, 0x69af, 0x69bf, 0x69c4,
+  0x69bd, 0x69a4, 0x69d4, 0x69b9, 0x69ca, 0x699a, 0x69cf, 0x69b3,
+  0x6993, 0x69aa, 0x69a1, 0x699e, 0x69d9, 0x6997, 0x6990, 0x69c2,
+  0x69b5, 0x69a5, 0x69c6, 0x6b4a, 0x6b4d, 0x6b4b, 0x6b9e, 0x6b9f,
+  0x6ba0, 0x6bc3, 0x6bc4, 0x6bfe, 0x6ece, 0x6ef5, 0x6ef1, 0x6f03,
+  0x6f25, 0x6ef8, 0x6f37, 0x6efb, 0x6f2e, 0x6f09, 0x6f4e, 0x6f19,
+  0x6f1a, 0x6f27, 0x6f18, 0x6f3b, 0x6f12, 0x6eed, 0x6f0a, 0x6f36,
+  0x6f73, 0x6ef9, 0x6eee, 0x6f2d, 0x6f40, 0x6f30, 0x6f3c, 0x6f35,
+  0x6eeb, 0x6f07, 0x6f0e, 0x6f43, 0x6f05, 0x6efd, 0x6ef6, 0x6f39,
+  0x6f1c, 0x6efc, 0x6f3a, 0x6f1f, 0x6f0d, 0x6f1e, 0x6f08, 0x6f21,
+  0x7187, 0x7190, 0x7189, 0x7180, 0x7185, 0x7182, 0x718f, 0x717b,
+  0x7186, 0x7181, 0x7197, 0x7244, 0x7253, 0x7297, 0x7295, 0x7293,
+  0x7343, 0x734d, 0x7351, 0x734c, 0x7462, 0x7473, 0x7471, 0x7475,
+  0x7472, 0x7467, 0x746e, 0x7500, 0x7502, 0x7503, 0x757d, 0x7590,
+  0x7616, 0x7608, 0x760c, 0x7615, 0x7611, 0x760a, 0x7614, 0x76b8,
+  0x7781, 0x777c, 0x7785, 0x7782, 0x776e, 0x7780, 0x776f, 0x777e,
+  0x7783, 0x78b2, 0x78aa, 0x78b4, 0x78ad, 0x78a8, 0x787e, 0x78ab,
+  0x789e, 0x78a5, 0x78a0, 0x78ac, 0x78a2, 0x78a4, 0x7998, 0x798a,
+  0x798b, 0x7996, 0x7995, 0x7994, 0x7993,
+  /* 0xe3 */
+  0x7997, 0x7988, 0x7992, 0x7990, 0x7a2b, 0x7a4a, 0x7a30, 0x7a2f,
+  0x7a28, 0x7a26, 0x7aa8, 0x7aab, 0x7aac, 0x7aee, 0x7b88, 0x7b9c,
+  0x7b8a, 0x7b91, 0x7b90, 0x7b96, 0x7b8d, 0x7b8c, 0x7b9b, 0x7b8e,
+  0x7b85, 0x7b98, 0x5284, 0x7b99, 0x7ba4, 0x7b82, 0x7cbb, 0x7cbf,
+  0x7cbc, 0x7cba, 0x7da7, 0x7db7, 0x7dc2, 0x7da3, 0x7daa, 0x7dc1,
+  0x7dc0, 0x7dc5, 0x7d9d, 0x7dce, 0x7dc4, 0x7dc6, 0x7dcb, 0x7dcc,
+  0x7daf, 0x7db9, 0x7d96, 0x7dbc, 0x7d9f, 0x7da6, 0x7dae, 0x7da9,
+  0x7da1, 0x7dc9, 0x7f73, 0x7fe2, 0x7fe3, 0x7fe5, 0x7fde, 0x8024,
+  0x805d, 0x805c, 0x8189, 0x8186, 0x8183, 0x8187, 0x818d, 0x818c,
+  0x818b, 0x8215, 0x8497, 0x84a4, 0x84a1, 0x849f, 0x84ba, 0x84ce,
+  0x84c2, 0x84ac, 0x84ae, 0x84ab, 0x84b9, 0x84b4, 0x84c1, 0x84cd,
+  0x84aa, 0x849a, 0x84b1, 0x84d0, 0x849d, 0x84a7, 0x84bb, 0x84a2,
+  0x8494, 0x84c7, 0x84cc, 0x849b, 0x84a9, 0x84af, 0x84a8, 0x84d6,
+  0x8498, 0x84b6, 0x84cf, 0x84a0, 0x84d7, 0x84d4, 0x84d2, 0x84db,
+  0x84b0, 0x8491, 0x8661, 0x8733, 0x8723, 0x8728, 0x876b, 0x8740,
+  0x872e, 0x871e, 0x8721, 0x8719, 0x871b, 0x8743, 0x872c, 0x8741,
+  0x873e, 0x8746, 0x8720, 0x8732, 0x872a, 0x872d, 0x873c, 0x8712,
+  0x873a, 0x8731, 0x8735, 0x8742, 0x8726, 0x8727, 0x8738, 0x8724,
+  0x871a, 0x8730, 0x8711, 0x88f7, 0x88e7, 0x88f1, 0x88f2, 0x88fa,
+  0x88fe, 0x88ee, 0x88fc, 0x88f6, 0x88fb,
+  /* 0xe4 */
+  0x88f0, 0x88ec, 0x88eb, 0x899d, 0x89a1, 0x899f, 0x899e, 0x89e9,
+  0x89eb, 0x89e8, 0x8aab, 0x8a99, 0x8a8b, 0x8a92, 0x8a8f, 0x8a96,
+  0x8c3d, 0x8c68, 0x8c69, 0x8cd5, 0x8ccf, 0x8cd7, 0x8d96, 0x8e09,
+  0x8e02, 0x8dff, 0x8e0d, 0x8dfd, 0x8e0a, 0x8e03, 0x8e07, 0x8e06,
+  0x8e05, 0x8dfe, 0x8e00, 0x8e04, 0x8f10, 0x8f11, 0x8f0e, 0x8f0d,
+  0x9123, 0x911c, 0x9120, 0x9122, 0x911f, 0x911d, 0x911a, 0x9124,
+  0x9121, 0x911b, 0x917a, 0x9172, 0x9179, 0x9173, 0x92a5, 0x92a4,
+  0x9276, 0x929b, 0x927a, 0x92a0, 0x9294, 0x92aa, 0x928d, 0x92a6,
+  0x929a, 0x92ab, 0x9279, 0x9297, 0x927f, 0x92a3, 0x92ee, 0x928e,
+  0x9282, 0x9295, 0x92a2, 0x927d, 0x9288, 0x92a1, 0x928a, 0x9286,
+  0x928c, 0x9299, 0x92a7, 0x927e, 0x9287, 0x92a9, 0x929d, 0x928b,
+  0x922d, 0x969e, 0x96a1, 0x96ff, 0x9758, 0x977d, 0x977a, 0x977e,
+  0x9783, 0x9780, 0x9782, 0x977b, 0x9784, 0x9781, 0x977f, 0x97ce,
+  0x97cd, 0x9816, 0x98ad, 0x98ae, 0x9902, 0x9900, 0x9907, 0x999d,
+  0x999c, 0x99c3, 0x99b9, 0x99bb, 0x99ba, 0x99c2, 0x99bd, 0x99c7,
+  0x9ab1, 0x9ae3, 0x9ae7, 0x9b3e, 0x9b3f, 0x9b60, 0x9b61, 0x9b5f,
+  0x9cf1, 0x9cf2, 0x9cf5, 0x9ea7, 0x50ff, 0x5103, 0x5130, 0x50f8,
+  0x5106, 0x5107, 0x50f6, 0x50fe, 0x510b, 0x510c, 0x50fd, 0x510a,
+  0x528b, 0x528c, 0x52f1, 0x52ef, 0x5648, 0x5642, 0x564c, 0x5635,
+  0x5641, 0x564a, 0x5649, 0x5646, 0x5658,
+  /* 0xe5 */
+  0x565a, 0x5640, 0x5633, 0x563d, 0x562c, 0x563e, 0x5638, 0x562a,
+  0x563a, 0x571a, 0x58ab, 0x589d, 0x58b1, 0x58a0, 0x58a3, 0x58af,
+  0x58ac, 0x58a5, 0x58a1, 0x58ff, 0x5aff, 0x5af4, 0x5afd, 0x5af7,
+  0x5af6, 0x5b03, 0x5af8, 0x5b02, 0x5af9, 0x5b01, 0x5b07, 0x5b05,
+  0x5b0f, 0x5c67, 0x5d99, 0x5d97, 0x5d9f, 0x5d92, 0x5da2, 0x5d93,
+  0x5d95, 0x5da0, 0x5d9c, 0x5da1, 0x5d9a, 0x5d9e, 0x5e69, 0x5e5d,
+  0x5e60, 0x5e5c, 0x7df3, 0x5edb, 0x5ede, 0x5ee1, 0x5f49, 0x5fb2,
+  0x618b, 0x6183, 0x6179, 0x61b1, 0x61b0, 0x61a2, 0x6189, 0x619b,
+  0x6193, 0x61af, 0x61ad, 0x619f, 0x6192, 0x61aa, 0x61a1, 0x618d,
+  0x6166, 0x61b3, 0x622d, 0x646e, 0x6470, 0x6496, 0x64a0, 0x6485,
+  0x6497, 0x649c, 0x648f, 0x648b, 0x648a, 0x648c, 0x64a3, 0x649f,
+  0x6468, 0x64b1, 0x6498, 0x6576, 0x657a, 0x6579, 0x657b, 0x65b2,
+  0x65b3, 0x66b5, 0x66b0, 0x66a9, 0x66b2, 0x66b7, 0x66aa, 0x66af,
+  0x6a00, 0x6a06, 0x6a17, 0x69e5, 0x69f8, 0x6a15, 0x69f1, 0x69e4,
+  0x6a20, 0x69ff, 0x69ec, 0x69e2, 0x6a1b, 0x6a1d, 0x69fe, 0x6a27,
+  0x69f2, 0x69ee, 0x6a14, 0x69f7, 0x69e7, 0x6a40, 0x6a08, 0x69e6,
+  0x69fb, 0x6a0d, 0x69fc, 0x69eb, 0x6a09, 0x6a04, 0x6a18, 0x6a25,
+  0x6a0f, 0x69f6, 0x6a26, 0x6a07, 0x69f4, 0x6a16, 0x6b51, 0x6ba5,
+  0x6ba3, 0x6ba2, 0x6ba6, 0x6c01, 0x6c00, 0x6bff, 0x6c02, 0x6f41,
+  0x6f26, 0x6f7e, 0x6f87, 0x6fc6, 0x6f92,
+  /* 0xe6 */
+  0x6f8d, 0x6f89, 0x6f8c, 0x6f62, 0x6f4f, 0x6f85, 0x6f5a, 0x6f96,
+  0x6f76, 0x6f6c, 0x6f82, 0x6f55, 0x6f72, 0x6f52, 0x6f50, 0x6f57,
+  0x6f94, 0x6f93, 0x6f5d, 0x6f00, 0x6f61, 0x6f6b, 0x6f7d, 0x6f67,
+  0x6f90, 0x6f53, 0x6f8b, 0x6f69, 0x6f7f, 0x6f95, 0x6f63, 0x6f77,
+  0x6f6a, 0x6f7b, 0x71b2, 0x71af, 0x719b, 0x71b0, 0x71a0, 0x719a,
+  0x71a9, 0x71b5, 0x719d, 0x71a5, 0x719e, 0x71a4, 0x71a1, 0x71aa,
+  0x719c, 0x71a7, 0x71b3, 0x7298, 0x729a, 0x7358, 0x7352, 0x735e,
+  0x735f, 0x7360, 0x735d, 0x735b, 0x7361, 0x735a, 0x7359, 0x7362,
+  0x7487, 0x7489, 0x748a, 0x7486, 0x7481, 0x747d, 0x7485, 0x7488,
+  0x747c, 0x7479, 0x7508, 0x7507, 0x757e, 0x7625, 0x761e, 0x7619,
+  0x761d, 0x761c, 0x7623, 0x761a, 0x7628, 0x761b, 0x769c, 0x769d,
+  0x769e, 0x769b, 0x778d, 0x778f, 0x7789, 0x7788, 0x78cd, 0x78bb,
+  0x78cf, 0x78cc, 0x78d1, 0x78ce, 0x78d4, 0x78c8, 0x78c3, 0x78c4,
+  0x78c9, 0x799a, 0x79a1, 0x79a0, 0x799c, 0x79a2, 0x799b, 0x6b76,
+  0x7a39, 0x7ab2, 0x7ab4, 0x7ab3, 0x7bb7, 0x7bcb, 0x7bbe, 0x7bac,
+  0x7bce, 0x7baf, 0x7bb9, 0x7bca, 0x7bb5, 0x7cc5, 0x7cc8, 0x7ccc,
+  0x7ccb, 0x7df7, 0x7ddb, 0x7dea, 0x7de7, 0x7dd7, 0x7de1, 0x7e03,
+  0x7dfa, 0x7de6, 0x7df6, 0x7df1, 0x7df0, 0x7dee, 0x7ddf, 0x7f76,
+  0x7fac, 0x7fb0, 0x7fad, 0x7fed, 0x7feb, 0x7fea, 0x7fec, 0x7fe6,
+  0x7fe8, 0x8064, 0x8067, 0x81a3, 0x819f,
+  /* 0xe7 */
+  0x819e, 0x8195, 0x81a2, 0x8199, 0x8197, 0x8216, 0x824f, 0x8253,
+  0x8252, 0x8250, 0x824e, 0x8251, 0x8524, 0x853b, 0x850f, 0x8500,
+  0x8529, 0x850e, 0x8509, 0x850d, 0x851f, 0x850a, 0x8527, 0x851c,
+  0x84fb, 0x852b, 0x84fa, 0x8508, 0x850c, 0x84f4, 0x852a, 0x84f2,
+  0x8515, 0x84f7, 0x84eb, 0x84f3, 0x84fc, 0x8512, 0x84ea, 0x84e9,
+  0x8516, 0x84fe, 0x8528, 0x851d, 0x852e, 0x8502, 0x84fd, 0x851e,
+  0x84f6, 0x8531, 0x8526, 0x84e7, 0x84e8, 0x84f0, 0x84ef, 0x84f9,
+  0x8518, 0x8520, 0x8530, 0x850b, 0x8519, 0x852f, 0x8662, 0x8756,
+  0x8763, 0x8764, 0x8777, 0x87e1, 0x8773, 0x8758, 0x8754, 0x875b,
+  0x8752, 0x8761, 0x875a, 0x8751, 0x875e, 0x876d, 0x876a, 0x8750,
+  0x874e, 0x875f, 0x875d, 0x876f, 0x876c, 0x877a, 0x876e, 0x875c,
+  0x8765, 0x874f, 0x877b, 0x8775, 0x8762, 0x8767, 0x8769, 0x885a,
+  0x8905, 0x890c, 0x8914, 0x890b, 0x8917, 0x8918, 0x8919, 0x8906,
+  0x8916, 0x8911, 0x890e, 0x8909, 0x89a2, 0x89a4, 0x89a3, 0x89ed,
+  0x89f0, 0x89ec, 0x8acf, 0x8ac6, 0x8ab8, 0x8ad3, 0x8ad1, 0x8ad4,
+  0x8ad5, 0x8abb, 0x8ad7, 0x8abe, 0x8ac0, 0x8ac5, 0x8ad8, 0x8ac3,
+  0x8aba, 0x8abd, 0x8ad9, 0x8c3e, 0x8c4d, 0x8c8f, 0x8ce5, 0x8cdf,
+  0x8cd9, 0x8ce8, 0x8cda, 0x8cdd, 0x8ce7, 0x8da0, 0x8d9c, 0x8da1,
+  0x8d9b, 0x8e20, 0x8e23, 0x8e25, 0x8e24, 0x8e2e, 0x8e15, 0x8e1b,
+  0x8e16, 0x8e11, 0x8e19, 0x8e26, 0x8e27,
+  /* 0xe8 */
+  0x8e14, 0x8e12, 0x8e18, 0x8e13, 0x8e1c, 0x8e17, 0x8e1a, 0x8f2c,
+  0x8f24, 0x8f18, 0x8f1a, 0x8f20, 0x8f23, 0x8f16, 0x8f17, 0x9073,
+  0x9070, 0x906f, 0x9067, 0x906b, 0x912f, 0x912b, 0x9129, 0x912a,
+  0x9132, 0x9126, 0x912e, 0x9185, 0x9186, 0x918a, 0x9181, 0x9182,
+  0x9184, 0x9180, 0x92d0, 0x92c3, 0x92c4, 0x92c0, 0x92d9, 0x92b6,
+  0x92cf, 0x92f1, 0x92df, 0x92d8, 0x92e9, 0x92d7, 0x92dd, 0x92cc,
+  0x92ef, 0x92c2, 0x92e8, 0x92ca, 0x92c8, 0x92ce, 0x92e6, 0x92cd,
+  0x92d5, 0x92c9, 0x92e0, 0x92de, 0x92e7, 0x92d1, 0x92d3, 0x92b5,
+  0x92e1, 0x92c6, 0x92b4, 0x957c, 0x95ac, 0x95ab, 0x95ae, 0x95b0,
+  0x96a4, 0x96a2, 0x96d3, 0x9705, 0x9708, 0x9702, 0x975a, 0x978a,
+  0x978e, 0x9788, 0x97d0, 0x97cf, 0x981e, 0x981d, 0x9826, 0x9829,
+  0x9828, 0x9820, 0x981b, 0x9827, 0x98b2, 0x9908, 0x98fa, 0x9911,
+  0x9914, 0x9916, 0x9917, 0x9915, 0x99dc, 0x99cd, 0x99cf, 0x99d3,
+  0x99d4, 0x99ce, 0x99c9, 0x99d6, 0x99d8, 0x99cb, 0x99d7, 0x99cc,
+  0x9ab3, 0x9aec, 0x9aeb, 0x9af3, 0x9af2, 0x9af1, 0x9b46, 0x9b43,
+  0x9b67, 0x9b74, 0x9b71, 0x9b66, 0x9b76, 0x9b75, 0x9b70, 0x9b68,
+  0x9b64, 0x9b6c, 0x9cfc, 0x9cfa, 0x9cfd, 0x9cff, 0x9cf7, 0x9d07,
+  0x9d00, 0x9cf9, 0x9cfb, 0x9d08, 0x9d05, 0x9d04, 0x9e83, 0x9ed3,
+  0x9f0f, 0x9f10, 0x511c, 0x5113, 0x5117, 0x511a, 0x5111, 0x51de,
+  0x5334, 0x53e1, 0x5670, 0x5660, 0x566e,
+  /* 0xe9 */
+  0x5673, 0x5666, 0x5663, 0x566d, 0x5672, 0x565e, 0x5677, 0x571c,
+  0x571b, 0x58c8, 0x58bd, 0x58c9, 0x58bf, 0x58ba, 0x58c2, 0x58bc,
+  0x58c6, 0x5b17, 0x5b19, 0x5b1b, 0x5b21, 0x5b14, 0x5b13, 0x5b10,
+  0x5b16, 0x5b28, 0x5b1a, 0x5b20, 0x5b1e, 0x5bef, 0x5dac, 0x5db1,
+  0x5da9, 0x5da7, 0x5db5, 0x5db0, 0x5dae, 0x5daa, 0x5da8, 0x5db2,
+  0x5dad, 0x5daf, 0x5db4, 0x5e67, 0x5e68, 0x5e66, 0x5e6f, 0x5ee9,
+  0x5ee7, 0x5ee6, 0x5ee8, 0x5ee5, 0x5f4b, 0x5fbc, 0x619d, 0x61a8,
+  0x6196, 0x61c5, 0x61b4, 0x61c6, 0x61c1, 0x61cc, 0x61ba, 0x61bf,
+  0x61b8, 0x618c, 0x64d7, 0x64d6, 0x64d0, 0x64cf, 0x64c9, 0x64bd,
+  0x6489, 0x64c3, 0x64db, 0x64f3, 0x64d9, 0x6533, 0x657f, 0x657c,
+  0x65a2, 0x66c8, 0x66be, 0x66c0, 0x66ca, 0x66cb, 0x66cf, 0x66bd,
+  0x66bb, 0x66ba, 0x66cc, 0x6723, 0x6a34, 0x6a66, 0x6a49, 0x6a67,
+  0x6a32, 0x6a68, 0x6a3e, 0x6a5d, 0x6a6d, 0x6a76, 0x6a5b, 0x6a51,
+  0x6a28, 0x6a5a, 0x6a3b, 0x6a3f, 0x6a41, 0x6a6a, 0x6a64, 0x6a50,
+  0x6a4f, 0x6a54, 0x6a6f, 0x6a69, 0x6a60, 0x6a3c, 0x6a5e, 0x6a56,
+  0x6a55, 0x6a4d, 0x6a4e, 0x6a46, 0x6b55, 0x6b54, 0x6b56, 0x6ba7,
+  0x6baa, 0x6bab, 0x6bc8, 0x6bc7, 0x6c04, 0x6c03, 0x6c06, 0x6fad,
+  0x6fcb, 0x6fa3, 0x6fc7, 0x6fbc, 0x6fce, 0x6fc8, 0x6f5e, 0x6fc4,
+  0x6fbd, 0x6f9e, 0x6fca, 0x6fa8, 0x7004, 0x6fa5, 0x6fae, 0x6fba,
+  0x6fac, 0x6faa, 0x6fcf, 0x6fbf, 0x6fb8,
+  /* 0xea */
+  0x6fa2, 0x6fc9, 0x6fab, 0x6fcd, 0x6faf, 0x6fb2, 0x6fb0, 0x71c5,
+  0x71c2, 0x71bf, 0x71b8, 0x71d6, 0x71c0, 0x71c1, 0x71cb, 0x71d4,
+  0x71ca, 0x71c7, 0x71cf, 0x71bd, 0x71d8, 0x71bc, 0x71c6, 0x71da,
+  0x71db, 0x729d, 0x729e, 0x7369, 0x7366, 0x7367, 0x736c, 0x7365,
+  0x736b, 0x736a, 0x747f, 0x749a, 0x74a0, 0x7494, 0x7492, 0x7495,
+  0x74a1, 0x750b, 0x7580, 0x762f, 0x762d, 0x7631, 0x763d, 0x7633,
+  0x763c, 0x7635, 0x7632, 0x7630, 0x76bb, 0x76e6, 0x779a, 0x779d,
+  0x77a1, 0x779c, 0x779b, 0x77a2, 0x77a3, 0x7795, 0x7799, 0x7797,
+  0x78dd, 0x78e9, 0x78e5, 0x78ea, 0x78de, 0x78e3, 0x78db, 0x78e1,
+  0x78e2, 0x78ed, 0x78df, 0x78e0, 0x79a4, 0x7a44, 0x7a48, 0x7a47,
+  0x7ab6, 0x7ab8, 0x7ab5, 0x7ab1, 0x7ab7, 0x7bde, 0x7be3, 0x7be7,
+  0x7bdd, 0x7bd5, 0x7be5, 0x7bda, 0x7be8, 0x7bf9, 0x7bd4, 0x7bea,
+  0x7be2, 0x7bdc, 0x7beb, 0x7bd8, 0x7bdf, 0x7cd2, 0x7cd4, 0x7cd7,
+  0x7cd0, 0x7cd1, 0x7e12, 0x7e21, 0x7e17, 0x7e0c, 0x7e1f, 0x7e20,
+  0x7e13, 0x7e0e, 0x7e1c, 0x7e15, 0x7e1a, 0x7e22, 0x7e0b, 0x7e0f,
+  0x7e16, 0x7e0d, 0x7e14, 0x7e25, 0x7e24, 0x7f43, 0x7f7b, 0x7f7c,
+  0x7f7a, 0x7fb1, 0x7fef, 0x802a, 0x8029, 0x806c, 0x81b1, 0x81a6,
+  0x81ae, 0x81b9, 0x81b5, 0x81ab, 0x81b0, 0x81ac, 0x81b4, 0x81b2,
+  0x81b7, 0x81a7, 0x81f2, 0x8255, 0x8256, 0x8257, 0x8556, 0x8545,
+  0x856b, 0x854d, 0x8553, 0x8561, 0x8558,
+  /* 0xeb */
+  0x8540, 0x8546, 0x8564, 0x8541, 0x8562, 0x8544, 0x8551, 0x8547,
+  0x8563, 0x853e, 0x855b, 0x8571, 0x854e, 0x856e, 0x8575, 0x8555,
+  0x8567, 0x8560, 0x858c, 0x8566, 0x855d, 0x8554, 0x8565, 0x856c,
+  0x8663, 0x8665, 0x8664, 0x879b, 0x878f, 0x8797, 0x8793, 0x8792,
+  0x8788, 0x8781, 0x8796, 0x8798, 0x8779, 0x8787, 0x87a3, 0x8785,
+  0x8790, 0x8791, 0x879d, 0x8784, 0x8794, 0x879c, 0x879a, 0x8789,
+  0x891e, 0x8926, 0x8930, 0x892d, 0x892e, 0x8927, 0x8931, 0x8922,
+  0x8929, 0x8923, 0x892f, 0x892c, 0x891f, 0x89f1, 0x8ae0, 0x8ae2,
+  0x8af2, 0x8af4, 0x8af5, 0x8add, 0x8b14, 0x8ae4, 0x8adf, 0x8af0,
+  0x8ac8, 0x8ade, 0x8ae1, 0x8ae8, 0x8aff, 0x8aef, 0x8afb, 0x8c91,
+  0x8c92, 0x8c90, 0x8cf5, 0x8cee, 0x8cf1, 0x8cf0, 0x8cf3, 0x8d6c,
+  0x8d6e, 0x8da5, 0x8da7, 0x8e33, 0x8e3e, 0x8e38, 0x8e40, 0x8e45,
+  0x8e36, 0x8e3c, 0x8e3d, 0x8e41, 0x8e30, 0x8e3f, 0x8ebd, 0x8f36,
+  0x8f2e, 0x8f35, 0x8f32, 0x8f39, 0x8f37, 0x8f34, 0x9076, 0x9079,
+  0x907b, 0x9086, 0x90fa, 0x9133, 0x9135, 0x9136, 0x9193, 0x9190,
+  0x9191, 0x918d, 0x918f, 0x9327, 0x931e, 0x9308, 0x931f, 0x9306,
+  0x930f, 0x937a, 0x9338, 0x933c, 0x931b, 0x9323, 0x9312, 0x9301,
+  0x9346, 0x932d, 0x930e, 0x930d, 0x92cb, 0x931d, 0x92fa, 0x9325,
+  0x9313, 0x92f9, 0x92f7, 0x9334, 0x9302, 0x9324, 0x92ff, 0x9329,
+  0x9339, 0x9335, 0x932a, 0x9314, 0x930c,
+  /* 0xec */
+  0x930b, 0x92fe, 0x9309, 0x9300, 0x92fb, 0x9316, 0x95bc, 0x95cd,
+  0x95be, 0x95b9, 0x95ba, 0x95b6, 0x95bf, 0x95b5, 0x95bd, 0x96a9,
+  0x96d4, 0x970b, 0x9712, 0x9710, 0x9799, 0x9797, 0x9794, 0x97f0,
+  0x97f8, 0x9835, 0x982f, 0x9832, 0x9924, 0x991f, 0x9927, 0x9929,
+  0x999e, 0x99ee, 0x99ec, 0x99e5, 0x99e4, 0x99f0, 0x99e3, 0x99ea,
+  0x99e9, 0x99e7, 0x9ab9, 0x9abf, 0x9ab4, 0x9abb, 0x9af6, 0x9afa,
+  0x9af9, 0x9af7, 0x9b33, 0x9b80, 0x9b85, 0x9b87, 0x9b7c, 0x9b7e,
+  0x9b7b, 0x9b82, 0x9b93, 0x9b92, 0x9b90, 0x9b7a, 0x9b95, 0x9b7d,
+  0x9b88, 0x9d25, 0x9d17, 0x9d20, 0x9d1e, 0x9d14, 0x9d29, 0x9d1d,
+  0x9d18, 0x9d22, 0x9d10, 0x9d19, 0x9d1f, 0x9e88, 0x9e86, 0x9e87,
+  0x9eae, 0x9ead, 0x9ed5, 0x9ed6, 0x9efa, 0x9f12, 0x9f3d, 0x5126,
+  0x5125, 0x5122, 0x5124, 0x5120, 0x5129, 0x52f4, 0x5693, 0x568c,
+  0x568d, 0x5686, 0x5684, 0x5683, 0x567e, 0x5682, 0x567f, 0x5681,
+  0x58d6, 0x58d4, 0x58cf, 0x58d2, 0x5b2d, 0x5b25, 0x5b32, 0x5b23,
+  0x5b2c, 0x5b27, 0x5b26, 0x5b2f, 0x5b2e, 0x5b7b, 0x5bf1, 0x5bf2,
+  0x5db7, 0x5e6c, 0x5e6a, 0x5fbe, 0x5fbb, 0x61c3, 0x61b5, 0x61bc,
+  0x61e7, 0x61e0, 0x61e5, 0x61e4, 0x61e8, 0x61de, 0x64ef, 0x64e9,
+  0x64e3, 0x64eb, 0x64e4, 0x64e8, 0x6581, 0x6580, 0x65b6, 0x65da,
+  0x66d2, 0x6a8d, 0x6a96, 0x6a81, 0x6aa5, 0x6a89, 0x6a9f, 0x6a9b,
+  0x6aa1, 0x6a9e, 0x6a87, 0x6a93, 0x6a8e,
+  /* 0xed */
+  0x6a95, 0x6a83, 0x6aa8, 0x6aa4, 0x6a91, 0x6a7f, 0x6aa6, 0x6a9a,
+  0x6a85, 0x6a8c, 0x6a92, 0x6b5b, 0x6bad, 0x6c09, 0x6fcc, 0x6fa9,
+  0x6ff4, 0x6fd4, 0x6fe3, 0x6fdc, 0x6fed, 0x6fe7, 0x6fe6, 0x6fde,
+  0x6ff2, 0x6fdd, 0x6fe2, 0x6fe8, 0x71e1, 0x71f1, 0x71e8, 0x71f2,
+  0x71e4, 0x71f0, 0x71e2, 0x7373, 0x736e, 0x736f, 0x7497, 0x74b2,
+  0x74ab, 0x7490, 0x74aa, 0x74ad, 0x74b1, 0x74a5, 0x74af, 0x7510,
+  0x7511, 0x7512, 0x750f, 0x7584, 0x7643, 0x7648, 0x7649, 0x7647,
+  0x76a4, 0x76e9, 0x77b5, 0x77ab, 0x77b2, 0x77b7, 0x77b6, 0x77b4,
+  0x77b1, 0x77a8, 0x77f0, 0x78f3, 0x78fd, 0x7902, 0x78fb, 0x78fc,
+  0x78f2, 0x7905, 0x78f9, 0x78fe, 0x7904, 0x79ab, 0x79a8, 0x7a5c,
+  0x7a5b, 0x7a56, 0x7a58, 0x7a54, 0x7a5a, 0x7abe, 0x7ac0, 0x7ac1,
+  0x7c05, 0x7c0f, 0x7bf2, 0x7c00, 0x7bff, 0x7bfb, 0x7c0e, 0x7bf4,
+  0x7c0b, 0x7bf3, 0x7c02, 0x7c09, 0x7c03, 0x7c01, 0x7bf8, 0x7bfd,
+  0x7c06, 0x7bf0, 0x7bf1, 0x7c10, 0x7c0a, 0x7ce8, 0x7e2d, 0x7e3c,
+  0x7e42, 0x7e33, 0x9848, 0x7e38, 0x7e2a, 0x7e49, 0x7e40, 0x7e47,
+  0x7e29, 0x7e4c, 0x7e30, 0x7e3b, 0x7e36, 0x7e44, 0x7e3a, 0x7f45,
+  0x7f7f, 0x7f7e, 0x7f7d, 0x7ff4, 0x7ff2, 0x802c, 0x81bb, 0x81c4,
+  0x81cc, 0x81ca, 0x81c5, 0x81c7, 0x81bc, 0x81e9, 0x825b, 0x825a,
+  0x825c, 0x8583, 0x8580, 0x858f, 0x85a7, 0x8595, 0x85a0, 0x858b,
+  0x85a3, 0x857b, 0x85a4, 0x859a, 0x859e,
+  /* 0xee */
+  0x8577, 0x857c, 0x8589, 0x85a1, 0x857a, 0x8578, 0x8557, 0x858e,
+  0x8596, 0x8586, 0x858d, 0x8599, 0x859d, 0x8581, 0x85a2, 0x8582,
+  0x8588, 0x8585, 0x8579, 0x8576, 0x8598, 0x8590, 0x859f, 0x8668,
+  0x87be, 0x87aa, 0x87ad, 0x87c5, 0x87b0, 0x87ac, 0x87b9, 0x87b5,
+  0x87bc, 0x87ae, 0x87c9, 0x87c3, 0x87c2, 0x87cc, 0x87b7, 0x87af,
+  0x87c4, 0x87ca, 0x87b4, 0x87b6, 0x87bf, 0x87b8, 0x87bd, 0x87de,
+  0x87b2, 0x8935, 0x8933, 0x893c, 0x893e, 0x8941, 0x8952, 0x8937,
+  0x8942, 0x89ad, 0x89af, 0x89ae, 0x89f2, 0x89f3, 0x8b1e, 0x8b18,
+  0x8b16, 0x8b11, 0x8b05, 0x8b0b, 0x8b22, 0x8b0f, 0x8b12, 0x8b15,
+  0x8b07, 0x8b0d, 0x8b08, 0x8b06, 0x8b1c, 0x8b13, 0x8b1a, 0x8c4f,
+  0x8c70, 0x8c72, 0x8c71, 0x8c6f, 0x8c95, 0x8c94, 0x8cf9, 0x8d6f,
+  0x8e4e, 0x8e4d, 0x8e53, 0x8e50, 0x8e4c, 0x8e47, 0x8f43, 0x8f40,
+  0x9085, 0x907e, 0x9138, 0x919a, 0x91a2, 0x919b, 0x9199, 0x919f,
+  0x91a1, 0x919d, 0x91a0, 0x93a1, 0x9383, 0x93af, 0x9364, 0x9356,
+  0x9347, 0x937c, 0x9358, 0x935c, 0x9376, 0x9349, 0x9350, 0x9351,
+  0x9360, 0x936d, 0x938f, 0x934c, 0x936a, 0x9379, 0x9357, 0x9355,
+  0x9352, 0x934f, 0x9371, 0x9377, 0x937b, 0x9361, 0x935e, 0x9363,
+  0x9367, 0x9380, 0x934e, 0x9359, 0x95c7, 0x95c0, 0x95c9, 0x95c3,
+  0x95c5, 0x95b7, 0x96ae, 0x96b0, 0x96ac, 0x9720, 0x971f, 0x9718,
+  0x971d, 0x9719, 0x979a, 0x97a1, 0x979c,
+  /* 0xef */
+  0x979e, 0x979d, 0x97d5, 0x97d4, 0x97f1, 0x9841, 0x9844, 0x984a,
+  0x9849, 0x9845, 0x9843, 0x9925, 0x992b, 0x992c, 0x992a, 0x9933,
+  0x9932, 0x992f, 0x992d, 0x9931, 0x9930, 0x9998, 0x99a3, 0x99a1,
+  0x9a02, 0x99fa, 0x99f4, 0x99f7, 0x99f9, 0x99f8, 0x99f6, 0x99fb,
+  0x99fd, 0x99fe, 0x99fc, 0x9a03, 0x9abe, 0x9afe, 0x9afd, 0x9b01,
+  0x9afc, 0x9b48, 0x9b9a, 0x9ba8, 0x9b9e, 0x9b9b, 0x9ba6, 0x9ba1,
+  0x9ba5, 0x9ba4, 0x9b86, 0x9ba2, 0x9ba0, 0x9baf, 0x9d33, 0x9d41,
+  0x9d67, 0x9d36, 0x9d2e, 0x9d2f, 0x9d31, 0x9d38, 0x9d30, 0x9d45,
+  0x9d42, 0x9d43, 0x9d3e, 0x9d37, 0x9d40, 0x9d3d, 0x7ff5, 0x9d2d,
+  0x9e8a, 0x9e89, 0x9e8d, 0x9eb0, 0x9ec8, 0x9eda, 0x9efb, 0x9eff,
+  0x9f24, 0x9f23, 0x9f22, 0x9f54, 0x9fa0, 0x5131, 0x512d, 0x512e,
+  0x5698, 0x569c, 0x5697, 0x569a, 0x569d, 0x5699, 0x5970, 0x5b3c,
+  0x5c69, 0x5c6a, 0x5dc0, 0x5e6d, 0x5e6e, 0x61d8, 0x61df, 0x61ed,
+  0x61ee, 0x61f1, 0x61ea, 0x61f0, 0x61eb, 0x61d6, 0x61e9, 0x64ff,
+  0x6504, 0x64fd, 0x64f8, 0x6501, 0x6503, 0x64fc, 0x6594, 0x65db,
+  0x66da, 0x66db, 0x66d8, 0x6ac5, 0x6ab9, 0x6abd, 0x6ae1, 0x6ac6,
+  0x6aba, 0x6ab6, 0x6ab7, 0x6ac7, 0x6ab4, 0x6aad, 0x6b5e, 0x6bc9,
+  0x6c0b, 0x7007, 0x700c, 0x700d, 0x7001, 0x7005, 0x7014, 0x700e,
+  0x6fff, 0x7000, 0x6ffb, 0x7026, 0x6ffc, 0x6ff7, 0x700a, 0x7201,
+  0x71ff, 0x71f9, 0x7203, 0x71fd, 0x7376,
+  /* 0xf0 */
+  0x74b8, 0x74c0, 0x74b5, 0x74c1, 0x74be, 0x74b6, 0x74bb, 0x74c2,
+  0x7514, 0x7513, 0x765c, 0x7664, 0x7659, 0x7650, 0x7653, 0x7657,
+  0x765a, 0x76a6, 0x76bd, 0x76ec, 0x77c2, 0x77ba, 0x78ff, 0x790c,
+  0x7913, 0x7914, 0x7909, 0x7910, 0x7912, 0x7911, 0x79ad, 0x79ac,
+  0x7a5f, 0x7c1c, 0x7c29, 0x7c19, 0x7c20, 0x7c1f, 0x7c2d, 0x7c1d,
+  0x7c26, 0x7c28, 0x7c22, 0x7c25, 0x7c30, 0x7e5c, 0x7e50, 0x7e56,
+  0x7e63, 0x7e58, 0x7e62, 0x7e5f, 0x7e51, 0x7e60, 0x7e57, 0x7e53,
+  0x7fb5, 0x7fb3, 0x7ff7, 0x7ff8, 0x8075, 0x81d1, 0x81d2, 0x81d0,
+  0x825f, 0x825e, 0x85b4, 0x85c6, 0x85c0, 0x85c3, 0x85c2, 0x85b3,
+  0x85b5, 0x85bd, 0x85c7, 0x85c4, 0x85bf, 0x85cb, 0x85ce, 0x85c8,
+  0x85c5, 0x85b1, 0x85b6, 0x85d2, 0x8624, 0x85b8, 0x85b7, 0x85be,
+  0x8669, 0x87e7, 0x87e6, 0x87e2, 0x87db, 0x87eb, 0x87ea, 0x87e5,
+  0x87df, 0x87f3, 0x87e4, 0x87d4, 0x87dc, 0x87d3, 0x87ed, 0x87d8,
+  0x87e3, 0x87a4, 0x87d7, 0x87d9, 0x8801, 0x87f4, 0x87e8, 0x87dd,
+  0x8953, 0x894b, 0x894f, 0x894c, 0x8946, 0x8950, 0x8951, 0x8949,
+  0x8b2a, 0x8b27, 0x8b23, 0x8b33, 0x8b30, 0x8b35, 0x8b47, 0x8b2f,
+  0x8b3c, 0x8b3e, 0x8b31, 0x8b25, 0x8b37, 0x8b26, 0x8b36, 0x8b2e,
+  0x8b24, 0x8b3b, 0x8b3d, 0x8b3a, 0x8c42, 0x8c75, 0x8c99, 0x8c98,
+  0x8c97, 0x8cfe, 0x8d04, 0x8d02, 0x8d00, 0x8e5c, 0x8e62, 0x8e60,
+  0x8e57, 0x8e56, 0x8e5e, 0x8e65, 0x8e67,
+  /* 0xf1 */
+  0x8e5b, 0x8e5a, 0x8e61, 0x8e5d, 0x8e69, 0x8e54, 0x8f46, 0x8f47,
+  0x8f48, 0x8f4b, 0x9128, 0x913a, 0x913b, 0x913e, 0x91a8, 0x91a5,
+  0x91a7, 0x91af, 0x91aa, 0x93b5, 0x938c, 0x9392, 0x93b7, 0x939b,
+  0x939d, 0x9389, 0x93a7, 0x938e, 0x93aa, 0x939e, 0x93a6, 0x9395,
+  0x9388, 0x9399, 0x939f, 0x938d, 0x93b1, 0x9391, 0x93b2, 0x93a4,
+  0x93a8, 0x93b4, 0x93a3, 0x93a5, 0x95d2, 0x95d3, 0x95d1, 0x96b3,
+  0x96d7, 0x96da, 0x5dc2, 0x96df, 0x96d8, 0x96dd, 0x9723, 0x9722,
+  0x9725, 0x97ac, 0x97ae, 0x97a8, 0x97ab, 0x97a4, 0x97aa, 0x97a2,
+  0x97a5, 0x97d7, 0x97d9, 0x97d6, 0x97d8, 0x97fa, 0x9850, 0x9851,
+  0x9852, 0x98b8, 0x9941, 0x993c, 0x993a, 0x9a0f, 0x9a0b, 0x9a09,
+  0x9a0d, 0x9a04, 0x9a11, 0x9a0a, 0x9a05, 0x9a07, 0x9a06, 0x9ac0,
+  0x9adc, 0x9b08, 0x9b04, 0x9b05, 0x9b29, 0x9b35, 0x9b4a, 0x9b4c,
+  0x9b4b, 0x9bc7, 0x9bc6, 0x9bc3, 0x9bbf, 0x9bc1, 0x9bb5, 0x9bb8,
+  0x9bd3, 0x9bb6, 0x9bc4, 0x9bb9, 0x9bbd, 0x9d5c, 0x9d53, 0x9d4f,
+  0x9d4a, 0x9d5b, 0x9d4b, 0x9d59, 0x9d56, 0x9d4c, 0x9d57, 0x9d52,
+  0x9d54, 0x9d5f, 0x9d58, 0x9d5a, 0x9e8e, 0x9e8c, 0x9edf, 0x9f01,
+  0x9f00, 0x9f16, 0x9f25, 0x9f2b, 0x9f2a, 0x9f29, 0x9f28, 0x9f4c,
+  0x9f55, 0x5134, 0x5135, 0x5296, 0x52f7, 0x53b4, 0x56ab, 0x56ad,
+  0x56a6, 0x56a7, 0x56aa, 0x56ac, 0x58da, 0x58dd, 0x58db, 0x5912,
+  0x5b3d, 0x5b3e, 0x5b3f, 0x5dc3, 0x5e70,
+  /* 0xf2 */
+  0x5fbf, 0x61fb, 0x6507, 0x6510, 0x650d, 0x6509, 0x650c, 0x650e,
+  0x6584, 0x65de, 0x65dd, 0x66de, 0x6ae7, 0x6ae0, 0x6acc, 0x6ad1,
+  0x6ad9, 0x6acb, 0x6adf, 0x6adc, 0x6ad0, 0x6aeb, 0x6acf, 0x6acd,
+  0x6ade, 0x6b60, 0x6bb0, 0x6c0c, 0x7019, 0x7027, 0x7020, 0x7016,
+  0x702b, 0x7021, 0x7022, 0x7023, 0x7029, 0x7017, 0x7024, 0x701c,
+  0x702a, 0x720c, 0x720a, 0x7207, 0x7202, 0x7205, 0x72a5, 0x72a6,
+  0x72a4, 0x72a3, 0x72a1, 0x74cb, 0x74c5, 0x74b7, 0x74c3, 0x7516,
+  0x7660, 0x77c9, 0x77ca, 0x77c4, 0x77f1, 0x791d, 0x791b, 0x7921,
+  0x791c, 0x7917, 0x791e, 0x79b0, 0x7a67, 0x7a68, 0x7c33, 0x7c3c,
+  0x7c39, 0x7c2c, 0x7c3b, 0x7cec, 0x7cea, 0x7e76, 0x7e75, 0x7e78,
+  0x7e70, 0x7e77, 0x7e6f, 0x7e7a, 0x7e72, 0x7e74, 0x7e68, 0x7f4b,
+  0x7f4a, 0x7f83, 0x7f86, 0x7fb7, 0x7ffd, 0x7ffe, 0x8078, 0x81d7,
+  0x81d5, 0x8264, 0x8261, 0x8263, 0x85eb, 0x85f1, 0x85ed, 0x85d9,
+  0x85e1, 0x85e8, 0x85da, 0x85d7, 0x85ec, 0x85f2, 0x85f8, 0x85d8,
+  0x85df, 0x85e3, 0x85dc, 0x85d1, 0x85f0, 0x85e6, 0x85ef, 0x85de,
+  0x85e2, 0x8800, 0x87fa, 0x8803, 0x87f6, 0x87f7, 0x8809, 0x880c,
+  0x880b, 0x8806, 0x87fc, 0x8808, 0x87ff, 0x880a, 0x8802, 0x8962,
+  0x895a, 0x895b, 0x8957, 0x8961, 0x895c, 0x8958, 0x895d, 0x8959,
+  0x8988, 0x89b7, 0x89b6, 0x89f6, 0x8b50, 0x8b48, 0x8b4a, 0x8b40,
+  0x8b53, 0x8b56, 0x8b54, 0x8b4b, 0x8b55,
+  /* 0xf3 */
+  0x8b51, 0x8b42, 0x8b52, 0x8b57, 0x8c43, 0x8c77, 0x8c76, 0x8c9a,
+  0x8d06, 0x8d07, 0x8d09, 0x8dac, 0x8daa, 0x8dad, 0x8dab, 0x8e6d,
+  0x8e78, 0x8e73, 0x8e6a, 0x8e6f, 0x8e7b, 0x8ec2, 0x8f52, 0x8f51,
+  0x8f4f, 0x8f50, 0x8f53, 0x8fb4, 0x9140, 0x913f, 0x91b0, 0x91ad,
+  0x93de, 0x93c7, 0x93cf, 0x93c2, 0x93da, 0x93d0, 0x93f9, 0x93ec,
+  0x93cc, 0x93d9, 0x93a9, 0x93e6, 0x93ca, 0x93d4, 0x93ee, 0x93e3,
+  0x93d5, 0x93c4, 0x93ce, 0x93c0, 0x93d2, 0x93e7, 0x957d, 0x95da,
+  0x95db, 0x96e1, 0x9729, 0x972b, 0x972c, 0x9728, 0x9726, 0x97b3,
+  0x97b7, 0x97b6, 0x97dd, 0x97de, 0x97df, 0x985c, 0x9859, 0x985d,
+  0x9857, 0x98bf, 0x98bd, 0x98bb, 0x98be, 0x9948, 0x9947, 0x9943,
+  0x99a6, 0x99a7, 0x9a1a, 0x9a15, 0x9a25, 0x9a1d, 0x9a24, 0x9a1b,
+  0x9a22, 0x9a20, 0x9a27, 0x9a23, 0x9a1e, 0x9a1c, 0x9a14, 0x9ac2,
+  0x9b0b, 0x9b0a, 0x9b0e, 0x9b0c, 0x9b37, 0x9bea, 0x9beb, 0x9be0,
+  0x9bde, 0x9be4, 0x9be6, 0x9be2, 0x9bf0, 0x9bd4, 0x9bd7, 0x9bec,
+  0x9bdc, 0x9bd9, 0x9be5, 0x9bd5, 0x9be1, 0x9bda, 0x9d77, 0x9d81,
+  0x9d8a, 0x9d84, 0x9d88, 0x9d71, 0x9d80, 0x9d78, 0x9d86, 0x9d8b,
+  0x9d8c, 0x9d7d, 0x9d6b, 0x9d74, 0x9d75, 0x9d70, 0x9d69, 0x9d85,
+  0x9d73, 0x9d7b, 0x9d82, 0x9d6f, 0x9d79, 0x9d7f, 0x9d87, 0x9d68,
+  0x9e94, 0x9e91, 0x9ec0, 0x9efc, 0x9f2d, 0x9f40, 0x9f41, 0x9f4d,
+  0x9f56, 0x9f57, 0x9f58, 0x5337, 0x56b2,
+  /* 0xf4 */
+  0x56b5, 0x56b3, 0x58e3, 0x5b45, 0x5dc6, 0x5dc7, 0x5eee, 0x5eef,
+  0x5fc0, 0x5fc1, 0x61f9, 0x6517, 0x6516, 0x6515, 0x6513, 0x65df,
+  0x66e8, 0x66e3, 0x66e4, 0x6af3, 0x6af0, 0x6aea, 0x6ae8, 0x6af9,
+  0x6af1, 0x6aee, 0x6aef, 0x703c, 0x7035, 0x702f, 0x7037, 0x7034,
+  0x7031, 0x7042, 0x7038, 0x703f, 0x703a, 0x7039, 0x7040, 0x703b,
+  0x7033, 0x7041, 0x7213, 0x7214, 0x72a8, 0x737d, 0x737c, 0x74ba,
+  0x76ab, 0x76aa, 0x76be, 0x76ed, 0x77cc, 0x77ce, 0x77cf, 0x77cd,
+  0x77f2, 0x7925, 0x7923, 0x7927, 0x7928, 0x7924, 0x7929, 0x79b2,
+  0x7a6e, 0x7a6c, 0x7a6d, 0x7af7, 0x7c49, 0x7c48, 0x7c4a, 0x7c47,
+  0x7c45, 0x7cee, 0x7e7b, 0x7e7e, 0x7e81, 0x7e80, 0x7fba, 0x7fff,
+  0x8079, 0x81db, 0x81d9, 0x820b, 0x8268, 0x8269, 0x8622, 0x85ff,
+  0x8601, 0x85fe, 0x861b, 0x8600, 0x85f6, 0x8604, 0x8609, 0x8605,
+  0x860c, 0x85fd, 0x8819, 0x8810, 0x8811, 0x8817, 0x8813, 0x8816,
+  0x8963, 0x8966, 0x89b9, 0x89f7, 0x8b60, 0x8b6a, 0x8b5d, 0x8b68,
+  0x8b63, 0x8b65, 0x8b67, 0x8b6d, 0x8dae, 0x8e86, 0x8e88, 0x8e84,
+  0x8f59, 0x8f56, 0x8f57, 0x8f55, 0x8f58, 0x8f5a, 0x908d, 0x9143,
+  0x9141, 0x91b7, 0x91b5, 0x91b2, 0x91b3, 0x940b, 0x9413, 0x93fb,
+  0x9420, 0x940f, 0x9414, 0x93fe, 0x9415, 0x9410, 0x9428, 0x9419,
+  0x940d, 0x93f5, 0x9400, 0x93f7, 0x9407, 0x940e, 0x9416, 0x9412,
+  0x93fa, 0x9409, 0x93f8, 0x940a, 0x93ff,
+  /* 0xf5 */
+  0x93fc, 0x940c, 0x93f6, 0x9411, 0x9406, 0x95de, 0x95e0, 0x95df,
+  0x972e, 0x972f, 0x97b9, 0x97bb, 0x97fd, 0x97fe, 0x9860, 0x9862,
+  0x9863, 0x985f, 0x98c1, 0x98c2, 0x9950, 0x994e, 0x9959, 0x994c,
+  0x994b, 0x9953, 0x9a32, 0x9a34, 0x9a31, 0x9a2c, 0x9a2a, 0x9a36,
+  0x9a29, 0x9a2e, 0x9a38, 0x9a2d, 0x9ac7, 0x9aca, 0x9ac6, 0x9b10,
+  0x9b12, 0x9b11, 0x9c0b, 0x9c08, 0x9bf7, 0x9c05, 0x9c12, 0x9bf8,
+  0x9c40, 0x9c07, 0x9c0e, 0x9c06, 0x9c17, 0x9c14, 0x9c09, 0x9d9f,
+  0x9d99, 0x9da4, 0x9d9d, 0x9d92, 0x9d98, 0x9d90, 0x9d9b, 0x9da0,
+  0x9d94, 0x9d9c, 0x9daa, 0x9d97, 0x9da1, 0x9d9a, 0x9da2, 0x9da8,
+  0x9d9e, 0x9da3, 0x9dbf, 0x9da9, 0x9d96, 0x9da6, 0x9da7, 0x9e99,
+  0x9e9b, 0x9e9a, 0x9ee5, 0x9ee4, 0x9ee7, 0x9ee6, 0x9f30, 0x9f2e,
+  0x9f5b, 0x9f60, 0x9f5e, 0x9f5d, 0x9f59, 0x9f91, 0x513a, 0x5139,
+  0x5298, 0x5297, 0x56c3, 0x56bd, 0x56be, 0x5b48, 0x5b47, 0x5dcb,
+  0x5dcf, 0x5ef1, 0x61fd, 0x651b, 0x6b02, 0x6afc, 0x6b03, 0x6af8,
+  0x6b00, 0x7043, 0x7044, 0x704a, 0x7048, 0x7049, 0x7045, 0x7046,
+  0x721d, 0x721a, 0x7219, 0x737e, 0x7517, 0x766a, 0x77d0, 0x792d,
+  0x7931, 0x792f, 0x7c54, 0x7c53, 0x7cf2, 0x7e8a, 0x7e87, 0x7e88,
+  0x7e8b, 0x7e86, 0x7e8d, 0x7f4d, 0x7fbb, 0x8030, 0x81dd, 0x8618,
+  0x862a, 0x8626, 0x861f, 0x8623, 0x861c, 0x8619, 0x8627, 0x862e,
+  0x8621, 0x8620, 0x8629, 0x861e, 0x8625,
+  /* 0xf6 */
+  0x8829, 0x881d, 0x881b, 0x8820, 0x8824, 0x881c, 0x882b, 0x884a,
+  0x896d, 0x8969, 0x896e, 0x896b, 0x89fa, 0x8b79, 0x8b78, 0x8b45,
+  0x8b7a, 0x8b7b, 0x8d10, 0x8d14, 0x8daf, 0x8e8e, 0x8e8c, 0x8f5e,
+  0x8f5b, 0x8f5d, 0x9146, 0x9144, 0x9145, 0x91b9, 0x943f, 0x943b,
+  0x9436, 0x9429, 0x943d, 0x943c, 0x9430, 0x9439, 0x942a, 0x9437,
+  0x942c, 0x9440, 0x9431, 0x95e5, 0x95e4, 0x95e3, 0x9735, 0x973a,
+  0x97bf, 0x97e1, 0x9864, 0x98c9, 0x98c6, 0x98c0, 0x9958, 0x9956,
+  0x9a39, 0x9a3d, 0x9a46, 0x9a44, 0x9a42, 0x9a41, 0x9a3a, 0x9a3f,
+  0x9acd, 0x9b15, 0x9b17, 0x9b18, 0x9b16, 0x9b3a, 0x9b52, 0x9c2b,
+  0x9c1d, 0x9c1c, 0x9c2c, 0x9c23, 0x9c28, 0x9c29, 0x9c24, 0x9c21,
+  0x9db7, 0x9db6, 0x9dbc, 0x9dc1, 0x9dc7, 0x9dca, 0x9dcf, 0x9dbe,
+  0x9dc5, 0x9dc3, 0x9dbb, 0x9db5, 0x9dce, 0x9db9, 0x9dba, 0x9dac,
+  0x9dc8, 0x9db1, 0x9dad, 0x9dcc, 0x9db3, 0x9dcd, 0x9db2, 0x9e7a,
+  0x9e9c, 0x9eeb, 0x9eee, 0x9eed, 0x9f1b, 0x9f18, 0x9f1a, 0x9f31,
+  0x9f4e, 0x9f65, 0x9f64, 0x9f92, 0x4eb9, 0x56c6, 0x56c5, 0x56cb,
+  0x5971, 0x5b4b, 0x5b4c, 0x5dd5, 0x5dd1, 0x5ef2, 0x6521, 0x6520,
+  0x6526, 0x6522, 0x6b0b, 0x6b08, 0x6b09, 0x6c0d, 0x7055, 0x7056,
+  0x7057, 0x7052, 0x721e, 0x721f, 0x72a9, 0x737f, 0x74d8, 0x74d5,
+  0x74d9, 0x74d7, 0x766d, 0x76ad, 0x7935, 0x79b4, 0x7a70, 0x7a71,
+  0x7c57, 0x7c5c, 0x7c59, 0x7c5b, 0x7c5a,
+  /* 0xf7 */
+  0x7cf4, 0x7cf1, 0x7e91, 0x7f4f, 0x7f87, 0x81de, 0x826b, 0x8634,
+  0x8635, 0x8633, 0x862c, 0x8632, 0x8636, 0x882c, 0x8828, 0x8826,
+  0x882a, 0x8825, 0x8971, 0x89bf, 0x89be, 0x89fb, 0x8b7e, 0x8b84,
+  0x8b82, 0x8b86, 0x8b85, 0x8b7f, 0x8d15, 0x8e95, 0x8e94, 0x8e9a,
+  0x8e92, 0x8e90, 0x8e96, 0x8e97, 0x8f60, 0x8f62, 0x9147, 0x944c,
+  0x9450, 0x944a, 0x944b, 0x944f, 0x9447, 0x9445, 0x9448, 0x9449,
+  0x9446, 0x973f, 0x97e3, 0x986a, 0x9869, 0x98cb, 0x9954, 0x995b,
+  0x9a4e, 0x9a53, 0x9a54, 0x9a4c, 0x9a4f, 0x9a48, 0x9a4a, 0x9a49,
+  0x9a52, 0x9a50, 0x9ad0, 0x9b19, 0x9b2b, 0x9b3b, 0x9b56, 0x9b55,
+  0x9c46, 0x9c48, 0x9c3f, 0x9c44, 0x9c39, 0x9c33, 0x9c41, 0x9c3c,
+  0x9c37, 0x9c34, 0x9c32, 0x9c3d, 0x9c36, 0x9ddb, 0x9dd2, 0x9dde,
+  0x9dda, 0x9dcb, 0x9dd0, 0x9ddc, 0x9dd1, 0x9ddf, 0x9de9, 0x9dd9,
+  0x9dd8, 0x9dd6, 0x9df5, 0x9dd5, 0x9ddd, 0x9eb6, 0x9ef0, 0x9f35,
+  0x9f33, 0x9f32, 0x9f42, 0x9f6b, 0x9f95, 0x9fa2, 0x513d, 0x5299,
+  0x58e8, 0x58e7, 0x5972, 0x5b4d, 0x5dd8, 0x882f, 0x5f4f, 0x6201,
+  0x6203, 0x6204, 0x6529, 0x6525, 0x6596, 0x66eb, 0x6b11, 0x6b12,
+  0x6b0f, 0x6bca, 0x705b, 0x705a, 0x7222, 0x7382, 0x7381, 0x7383,
+  0x7670, 0x77d4, 0x7c67, 0x7c66, 0x7e95, 0x826c, 0x863a, 0x8640,
+  0x8639, 0x863c, 0x8631, 0x863b, 0x863e, 0x8830, 0x8832, 0x882e,
+  0x8833, 0x8976, 0x8974, 0x8973, 0x89fe,
+  /* 0xf8 */
+  0x8b8c, 0x8b8e, 0x8b8b, 0x8b88, 0x8c45, 0x8d19, 0x8e98, 0x8f64,
+  0x8f63, 0x91bc, 0x9462, 0x9455, 0x945d, 0x9457, 0x945e, 0x97c4,
+  0x97c5, 0x9800, 0x9a56, 0x9a59, 0x9b1e, 0x9b1f, 0x9b20, 0x9c52,
+  0x9c58, 0x9c50, 0x9c4a, 0x9c4d, 0x9c4b, 0x9c55, 0x9c59, 0x9c4c,
+  0x9c4e, 0x9dfb, 0x9df7, 0x9def, 0x9de3, 0x9deb, 0x9df8, 0x9de4,
+  0x9df6, 0x9de1, 0x9dee, 0x9de6, 0x9df2, 0x9df0, 0x9de2, 0x9dec,
+  0x9df4, 0x9df3, 0x9de8, 0x9ded, 0x9ec2, 0x9ed0, 0x9ef2, 0x9ef3,
+  0x9f06, 0x9f1c, 0x9f38, 0x9f37, 0x9f36, 0x9f43, 0x9f4f, 0x9f71,
+  0x9f70, 0x9f6e, 0x9f6f, 0x56d3, 0x56cd, 0x5b4e, 0x5c6d, 0x652d,
+  0x66ed, 0x66ee, 0x6b13, 0x705f, 0x7061, 0x705d, 0x7060, 0x7223,
+  0x74db, 0x74e5, 0x77d5, 0x7938, 0x79b7, 0x79b6, 0x7c6a, 0x7e97,
+  0x7f89, 0x826d, 0x8643, 0x8838, 0x8837, 0x8835, 0x884b, 0x8b94,
+  0x8b95, 0x8e9e, 0x8e9f, 0x8ea0, 0x8e9d, 0x91be, 0x91bd, 0x91c2,
+  0x946b, 0x9468, 0x9469, 0x96e5, 0x9746, 0x9743, 0x9747, 0x97c7,
+  0x97e5, 0x9a5e, 0x9ad5, 0x9b59, 0x9c63, 0x9c67, 0x9c66, 0x9c62,
+  0x9c5e, 0x9c60, 0x9e02, 0x9dfe, 0x9e07, 0x9e03, 0x9e06, 0x9e05,
+  0x9e00, 0x9e01, 0x9e09, 0x9dff, 0x9dfd, 0x9e04, 0x9ea0, 0x9f1e,
+  0x9f46, 0x9f74, 0x9f75, 0x9f76, 0x56d4, 0x652e, 0x65b8, 0x6b18,
+  0x6b19, 0x6b17, 0x6b1a, 0x7062, 0x7226, 0x72aa, 0x77d8, 0x77d9,
+  0x7939, 0x7c69, 0x7c6b, 0x7cf6, 0x7e9a,
+  /* 0xf9 */
+  0x7e98, 0x7e9b, 0x7e99, 0x81e0, 0x81e1, 0x8646, 0x8647, 0x8648,
+  0x8979, 0x897a, 0x897c, 0x897b, 0x89ff, 0x8b98, 0x8b99, 0x8ea5,
+  0x8ea4, 0x8ea3, 0x946e, 0x946d, 0x946f, 0x9471, 0x9473, 0x9749,
+  0x9872, 0x995f, 0x9c68, 0x9c6e, 0x9c6d, 0x9e0b, 0x9e0d, 0x9e10,
+  0x9e0f, 0x9e12, 0x9e11, 0x9ea1, 0x9ef5, 0x9f09, 0x9f47, 0x9f78,
+  0x9f7b, 0x9f7a, 0x9f79, 0x571e, 0x7066, 0x7c6f, 0x883c, 0x8db2,
+  0x8ea6, 0x91c3, 0x9474, 0x9478, 0x9476, 0x9475, 0x9a60, 0x9c74,
+  0x9c73, 0x9c71, 0x9c75, 0x9e14, 0x9e13, 0x9ef6, 0x9f0a, 0x9fa4,
+  0x7068, 0x7065, 0x7cf7, 0x866a, 0x883e, 0x883d, 0x883f, 0x8b9e,
+  0x8c9c, 0x8ea9, 0x8ec9, 0x974b, 0x9873, 0x9874, 0x98cc, 0x9961,
+  0x99ab, 0x9a64, 0x9a66, 0x9a67, 0x9b24, 0x9e15, 0x9e17, 0x9f48,
+  0x6207, 0x6b1e, 0x7227, 0x864c, 0x8ea8, 0x9482, 0x9480, 0x9481,
+  0x9a69, 0x9a68, 0x9b2e, 0x9e19, 0x7229, 0x864b, 0x8b9f, 0x9483,
+  0x9c79, 0x9eb7, 0x7675, 0x9a6b, 0x9c7a, 0x9e1d, 0x7069, 0x706a,
+  0x9ea4, 0x9f7e, 0x9f49, 0x9f98,
+};
+
+static int
+big5_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c1 = s[0];
+  if ((c1 >= 0xa1 && c1 <= 0xc7) || (c1 >= 0xc9 && c1 <= 0xf9)) {
+    if (n >= 2) {
+      unsigned char c2 = s[1];
+      if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) {
+        unsigned int i = 157 * (c1 - 0xa1) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40));
+        unsigned short wc = 0xfffd;
+        if (i < 6280) {
+          if (i < 6121)
+            wc = big5_2uni_pagea1[i];
+        } else {
+          if (i < 13932)
+            wc = big5_2uni_pagec9[i-6280];
+        }
+        if (wc != 0xfffd) {
+          *pwc = (ucs4_t) wc;
+          return 2;
+        }
+      }
+      return RET_ILSEQ;
+    }
+    return RET_TOOFEW(0);
+  }
+  return RET_ILSEQ;
+}
+
+static const unsigned short big5_2charset[13703] = {
+  0xa246, 0xa247, 0xa244, 0xa1b1, 0xa258, 0xa1d3, 0xa150, 0xa1d1,
+  0xa1d2, 0xa3be, 0xa3bc, 0xa3bd, 0xa3bf, 0xa3bb, 0xa344, 0xa345,
+  0xa346, 0xa347, 0xa348, 0xa349, 0xa34a, 0xa34b, 0xa34c, 0xa34d,
+  0xa34e, 0xa34f, 0xa350, 0xa351, 0xa352, 0xa353, 0xa354, 0xa355,
+  0xa356, 0xa357, 0xa358, 0xa359, 0xa35a, 0xa35b, 0xa35c, 0xa35d,
+  0xa35e, 0xa35f, 0xa360, 0xa361, 0xa362, 0xa363, 0xa364, 0xa365,
+  0xa366, 0xa367, 0xa368, 0xa369, 0xa36a, 0xa36b, 0xa36c, 0xa36d,
+  0xa36e, 0xa36f, 0xa370, 0xa371, 0xa372, 0xa373, 0xc7b3, 0xc7b1,
+  0xc7b2, 0xc7b4, 0xc7b5, 0xc7b6, 0xc7b7, 0xc7b8, 0xc7b9, 0xc7ba,
+  0xc7bb, 0xc7bc, 0xc7bd, 0xc7be, 0xc7bf, 0xc7c0, 0xc7c1, 0xc7c2,
+  0xc7c3, 0xc7c4, 0xc7c5, 0xc7c6, 0xc7c7, 0xc7c8, 0xc7c9, 0xc7ca,
+  0xc7cb, 0xc7cc, 0xc7cd, 0xc7cf, 0xc7d0, 0xc7d1, 0xc7d2, 0xc7d3,
+  0xc7d4, 0xc7d5, 0xc7d6, 0xc7d7, 0xc7d8, 0xc7d9, 0xc7da, 0xc7db,
+  0xc7dc, 0xc7dd, 0xc7de, 0xc7df, 0xc7e0, 0xc7e1, 0xc7e2, 0xc7e3,
+  0xc7e4, 0xc7e5, 0xc7e6, 0xc7e7, 0xc7e8, 0xc7ce, 0xa156, 0xa158,
+  0xa1a5, 0xa1a6, 0xa1a7, 0xa1a8, 0xa145, 0xa14c, 0xa14b, 0xa1ac,
+  0xa1ab, 0xa1b0, 0xa1c2, 0xa24a, 0xa1c1, 0xa24b, 0xa2b9, 0xa2ba,
+  0xa2bb, 0xa2bc, 0xa2bd, 0xa2be, 0xa2bf, 0xa2c0, 0xa2c1, 0xa2c2,
+  0xa1f6, 0xa1f4, 0xa1f7, 0xa1f5, 0xa1f8, 0xa1f9, 0xa1fb, 0xa1fa,
+  0xa1d4, 0xa1db, 0xa1e8, 0xa1e7, 0xa1fd, 0xa1fc, 0xa1e4, 0xa1e5,
+  0xa1ec, 0xa1ed, 0xa1ef, 0xa1ee, 0xa1e3, 0xa1dc, 0xa1da, 0xa1dd,
+  0xa1d8, 0xa1d9, 0xa1e6, 0xa1e9, 0xc7e9, 0xc7ea, 0xc7eb, 0xc7ec,
+  0xc7ed, 0xc7ee, 0xc7ef, 0xc7f0, 0xc7f1, 0xc7f2, 0xc7f3, 0xc7f4,
+  0xc7f5, 0xc7f6, 0xc7f7, 0xc7f8, 0xc7f9, 0xc7fa, 0xc7fb, 0xc7fc,
+  0xa277, 0xa278, 0xa27a, 0xa27b, 0xa27c, 0xa27d, 0xa275, 0xa274,
+  0xa273, 0xa272, 0xa271, 0xa2a4, 0xa2a5, 0xa2a7, 0xa2a6, 0xa27e,
+  0xa2a1, 0xa2a3, 0xa2a2, 0xa2ac, 0xa2ad, 0xa2ae, 0xa262, 0xa263,
+  0xa264, 0xa265, 0xa266, 0xa267, 0xa268, 0xa269, 0xa270, 0xa26f,
+  0xa26e, 0xa26d, 0xa26c, 0xa26b, 0xa26a, 0xa276, 0xa279, 0xa1bd,
+  0xa1bc, 0xa1b6, 0xa1b5, 0xa1bf, 0xa1be, 0xa1bb, 0xa1ba, 0xa1b3,
+  0xa1b7, 0xa1b4, 0xa2a8, 0xa2a9, 0xa2ab, 0xa2aa, 0xa1b9, 0xa1b8,
+  0xa1f3, 0xa1f0, 0xa1f2, 0xa1f1, 0xa140, 0xa142, 0xa143, 0xa1b2,
+  0xc6a4, 0xa171, 0xa172, 0xa16d, 0xa16e, 0xa175, 0xa176, 0xa179,
+  0xa17a, 0xa169, 0xa16a, 0xa245, 0xa165, 0xa166, 0xa1a9, 0xa1aa,
+  0xa2c3, 0xa2c4, 0xa2c5, 0xa2c6, 0xa2c7, 0xa2c8, 0xa2c9, 0xa2ca,
+  0xa2cb, 0xc6a5, 0xc6a6, 0xc6a7, 0xc6a8, 0xc6a9, 0xc6aa, 0xc6ab,
+  0xc6ac, 0xc6ad, 0xc6ae, 0xc6af, 0xc6b0, 0xc6b1, 0xc6b2, 0xc6b3,
+  0xc6b4, 0xc6b5, 0xc6b6, 0xc6b7, 0xc6b8, 0xc6b9, 0xc6ba, 0xc6bb,
+  0xc6bc, 0xc6bd, 0xc6be, 0xc6bf, 0xc6c0, 0xc6c1, 0xc6c2, 0xc6c3,
+  0xc6c4, 0xc6c5, 0xc6c6, 0xc6c7, 0xc6c8, 0xc6c9, 0xc6ca, 0xc6cb,
+  0xc6cc, 0xc6cd, 0xc6ce, 0xc6cf, 0xc6d0, 0xc6d1, 0xc6d2, 0xc6d3,
+  0xc6d4, 0xc6d5, 0xc6d6, 0xc6d7, 0xc6d8, 0xc6d9, 0xc6da, 0xc6db,
+  0xc6dc, 0xc6dd, 0xc6de, 0xc6df, 0xc6e0, 0xc6e1, 0xc6e2, 0xc6e3,
+  0xc6e4, 0xc6e5, 0xc6e6, 0xc6e7, 0xc6e8, 0xc6e9, 0xc6ea, 0xc6eb,
+  0xc6ec, 0xc6ed, 0xc6ee, 0xc6ef, 0xc6f0, 0xc6f1, 0xc6f2, 0xc6f3,
+  0xc6f4, 0xc6f5, 0xc6f6, 0xc6f7, 0xc6a2, 0xc6a3, 0xc6f8, 0xc6f9,
+  0xc6fa, 0xc6fb, 0xc6fc, 0xc6fd, 0xc6fe, 0xc740, 0xc741, 0xc742,
+  0xc743, 0xc744, 0xc745, 0xc746, 0xc747, 0xc748, 0xc749, 0xc74a,
+  0xc74b, 0xc74c, 0xc74d, 0xc74e, 0xc74f, 0xc750, 0xc751, 0xc752,
+  0xc753, 0xc754, 0xc755, 0xc756, 0xc757, 0xc758, 0xc759, 0xc75a,
+  0xc75b, 0xc75c, 0xc75d, 0xc75e, 0xc75f, 0xc760, 0xc761, 0xc762,
+  0xc763, 0xc764, 0xc765, 0xc766, 0xc767, 0xc768, 0xc769, 0xc76a,
+  0xc76b, 0xc76c, 0xc76d, 0xc76e, 0xc76f, 0xc770, 0xc771, 0xc772,
+  0xc773, 0xc774, 0xc775, 0xc776, 0xc777, 0xc778, 0xc779, 0xc77a,
+  0xc77b, 0xc77c, 0xc77d, 0xc77e, 0xc7a1, 0xc7a2, 0xc7a3, 0xc7a4,
+  0xc7a5, 0xc7a6, 0xc7a7, 0xc7a8, 0xc7a9, 0xc7aa, 0xc7ab, 0xc7ac,
+  0xc7ad, 0xc7ae, 0xc7af, 0xc7b0, 0xc6a1, 0xa374, 0xa375, 0xa376,
+  0xa377, 0xa378, 0xa379, 0xa37a, 0xa37b, 0xa37c, 0xa37d, 0xa37e,
+  0xa3a1, 0xa3a2, 0xa3a3, 0xa3a4, 0xa3a5, 0xa3a6, 0xa3a7, 0xa3a8,
+  0xa3a9, 0xa3aa, 0xa3ab, 0xa3ac, 0xa3ad, 0xa3ae, 0xa3af, 0xa3b0,
+  0xa3b1, 0xa3b2, 0xa3b3, 0xa3b4, 0xa3b5, 0xa3b6, 0xa3b7, 0xa3b8,
+  0xa3b9, 0xa3ba, 0xa1c0, 0xa255, 0xa256, 0xa250, 0xa251, 0xa252,
+  0xa254, 0xa257, 0xa253, 0xa1eb, 0xa1ea, 0xa24f, 0xa440, 0xa442,
+  0xa443, 0xc945, 0xa456, 0xa454, 0xa457, 0xa455, 0xc946, 0xa4a3,
+  0xc94f, 0xc94d, 0xa4a2, 0xa4a1, 0xa542, 0xa541, 0xa540, 0xa543,
+  0xa4fe, 0xa5e0, 0xa5e1, 0xa8c3, 0xa458, 0xa4a4, 0xc950, 0xa4a5,
+  0xc963, 0xa6ea, 0xcbb1, 0xa459, 0xa4a6, 0xa544, 0xc964, 0xc940,
+  0xa444, 0xa45b, 0xc947, 0xa45c, 0xa4a7, 0xa545, 0xa547, 0xa546,
+  0xa5e2, 0xa5e3, 0xa8c4, 0xadbc, 0xa441, 0xc941, 0xa445, 0xa45e,
+  0xa45d, 0xa5e4, 0xa8c5, 0xb0ae, 0xd44b, 0xb6c3, 0xdcb1, 0xdcb2,
+  0xa446, 0xa4a9, 0xa8c6, 0xa447, 0xc948, 0xa45f, 0xa4aa, 0xa4ac,
+  0xc951, 0xa4ad, 0xa4ab, 0xa5e5, 0xa8c7, 0xa8c8, 0xab45, 0xa460,
+  0xa4ae, 0xa5e6, 0xa5e8, 0xa5e7, 0xa6eb, 0xa8c9, 0xa8ca, 0xab46,
+  0xab47, 0xadbd, 0xdcb3, 0xf6d6, 0xa448, 0xa4b0, 0xa4af, 0xc952,
+  0xa4b1, 0xa4b7, 0xa4b2, 0xa4b3, 0xc954, 0xc953, 0xa4b5, 0xa4b6,
+  0xa4b4, 0xa54a, 0xa54b, 0xa54c, 0xa54d, 0xa549, 0xa550, 0xc96a,
+  0xc966, 0xc969, 0xa551, 0xa561, 0xc968, 0xa54e, 0xa54f, 0xa548,
+  0xc965, 0xc967, 0xa5f5, 0xc9b0, 0xa5f2, 0xa5f6, 0xc9ba, 0xc9ae,
+  0xa5f3, 0xc9b2, 0xa5f4, 0xa5f7, 0xa5e9, 0xc9b1, 0xa5f8, 0xc9b5,
+  0xc9b9, 0xc9b6, 0xc9b3, 0xa5ea, 0xa5ec, 0xa5f9, 0xa5ee, 0xc9ab,
+  0xa5f1, 0xa5ef, 0xa5f0, 0xc9bb, 0xc9b8, 0xc9af, 0xa5ed, 0xc9ac,
+  0xa5eb, 0xc9b4, 0xc9b7, 0xc9ad, 0xca66, 0xa742, 0xa6f4, 0xca67,
+  0xa6f1, 0xa744, 0xa6f9, 0xa6f8, 0xca5b, 0xa6fc, 0xa6f7, 0xca60,
+  0xca68, 0xca64, 0xa6fa, 0xa6fd, 0xa6ee, 0xa747, 0xca5d, 0xcbbd,
+  0xa6ec, 0xa743, 0xa6ed, 0xa6f5, 0xa6f6, 0xca62, 0xca5e, 0xa6fb,
+  0xa6f3, 0xca5a, 0xa6ef, 0xca65, 0xa745, 0xa748, 0xa6f2, 0xa740,
+  0xa746, 0xa6f0, 0xca63, 0xa741, 0xca69, 0xca5c, 0xa6fe, 0xca5f,
+  0xca61, 0xa8d8, 0xcbbf, 0xcbcb, 0xa8d0, 0xcbcc, 0xa8cb, 0xa8d5,
+  0xa8ce, 0xcbb9, 0xa8d6, 0xcbb8, 0xcbbc, 0xcbc3, 0xcbc1, 0xa8de,
+  0xa8d9, 0xcbb3, 0xcbb5, 0xa8db, 0xa8cf, 0xcbb6, 0xcbc2, 0xcbc9,
+  0xa8d4, 0xcbbb, 0xcbb4, 0xa8d3, 0xcbb7, 0xa8d7, 0xcbba, 0xa8d2,
+  0xa8cd, 0xa8dc, 0xcbc4, 0xa8dd, 0xcbc8, 0xcbc6, 0xcbca, 0xa8da,
+  0xcbbe, 0xcbb2, 0xcbc0, 0xa8d1, 0xcbc5, 0xa8cc, 0xcbc7, 0xab56,
+  0xab4a, 0xcde0, 0xcde8, 0xab49, 0xab51, 0xab5d, 0xcdee, 0xcdec,
+  0xcde7, 0xab4b, 0xcded, 0xcde3, 0xab59, 0xab50, 0xab58, 0xcdde,
+  0xcdea, 0xcde1, 0xab54, 0xcde2, 0xcddd, 0xab5b, 0xab4e, 0xab57,
+  0xab4d, 0xcddf, 0xcde4, 0xcdeb, 0xab55, 0xab52, 0xcde6, 0xab5a,
+  0xcde9, 0xcde5, 0xab4f, 0xab5c, 0xab53, 0xab4c, 0xab48, 0xcdef,
+  0xadd7, 0xadc1, 0xadd1, 0xadd6, 0xd0d0, 0xd0cf, 0xd0d4, 0xd0d5,
+  0xadc4, 0xadcd, 0xadda, 0xadce, 0xd0c9, 0xadc7, 0xd0ca, 0xaddc,
+  0xadd3, 0xadbe, 0xadbf, 0xd0dd, 0xb0bf, 0xadcc, 0xadcb, 0xd0cb,
+  0xadcf, 0xd45b, 0xadc6, 0xd0d6, 0xadd5, 0xadd4, 0xadca, 0xd0ce,
+  0xd0d7, 0xd0c8, 0xadc9, 0xd0d8, 0xadd2, 0xd0cc, 0xadc0, 0xadc3,
+  0xadc2, 0xd0d9, 0xadd0, 0xadc5, 0xadd9, 0xaddb, 0xd0d3, 0xadd8,
+  0xd0db, 0xd0cd, 0xd0dc, 0xd0d1, 0xd0da, 0xd0d2, 0xadc8, 0xd463,
+  0xd457, 0xb0b3, 0xd45c, 0xd462, 0xb0b2, 0xd455, 0xb0b6, 0xd459,
+  0xd452, 0xb0b4, 0xd456, 0xb0b9, 0xb0be, 0xd467, 0xd451, 0xb0ba,
+  0xd466, 0xb0b5, 0xd458, 0xb0b1, 0xd453, 0xd44f, 0xd45d, 0xd450,
+  0xd44e, 0xd45a, 0xd460, 0xd461, 0xb0b7, 0xd85b, 0xd45e, 0xd44d,
+  0xd45f, 0xb0c1, 0xd464, 0xb0c0, 0xd44c, 0xd454, 0xd465, 0xb0bc,
+  0xb0bb, 0xb0b8, 0xb0bd, 0xb0af, 0xb0b0, 0xb3c8, 0xd85e, 0xd857,
+  0xb3c5, 0xd85f, 0xd855, 0xd858, 0xb3c4, 0xd859, 0xb3c7, 0xd85d,
+  0xd853, 0xd852, 0xb3c9, 0xb3ca, 0xb3c6, 0xb3cb, 0xd851, 0xd85c,
+  0xd85a, 0xd854, 0xb3c3, 0xd856, 0xb6ca, 0xb6c4, 0xdcb7, 0xb6cd,
+  0xdcbd, 0xdcc0, 0xb6c6, 0xb6c7, 0xdcba, 0xb6c5, 0xdcc3, 0xb6cb,
+  0xdcc4, 0xdcbf, 0xb6cc, 0xdcb4, 0xb6c9, 0xdcb5, 0xdcbe, 0xdcbc,
+  0xdcb8, 0xb6c8, 0xdcb6, 0xb6ce, 0xdcbb, 0xdcc2, 0xdcb9, 0xdcc1,
+  0xb9b6, 0xb9b3, 0xb9b4, 0xe0f9, 0xe0f1, 0xb9b2, 0xb9af, 0xe0f2,
+  0xb9b1, 0xe0f5, 0xe0f7, 0xe0fe, 0xe0fd, 0xe0f8, 0xb9ae, 0xe0f0,
+  0xb9ac, 0xe0f3, 0xb9b7, 0xe0f6, 0xe0fa, 0xb9b0, 0xb9ad, 0xe0fc,
+  0xe0fb, 0xb9b5, 0xe0f4, 0xbbf8, 0xe4ec, 0xe4e9, 0xbbf9, 0xbbf7,
+  0xe4f0, 0xe4ed, 0xe4e6, 0xbbf6, 0xbbfa, 0xe4e7, 0xbbf5, 0xbbfd,
+  0xe4ea, 0xe4eb, 0xbbfb, 0xbbfc, 0xe4f1, 0xe4ee, 0xe4ef, 0xbeaa,
+  0xe8f8, 0xbea7, 0xe8f5, 0xbea9, 0xbeab, 0xe8f6, 0xbea8, 0xe8f7,
+  0xe8f4, 0xc076, 0xecbd, 0xc077, 0xecbb, 0xecbc, 0xecba, 0xecb9,
+  0xecbe, 0xc075, 0xefb8, 0xefb9, 0xe4e8, 0xefb7, 0xc078, 0xc35f,
+  0xf1eb, 0xf1ec, 0xc4d7, 0xc4d8, 0xf5c1, 0xf5c0, 0xc56c, 0xc56b,
+  0xf7d0, 0xa449, 0xa461, 0xa4b9, 0xa4b8, 0xa553, 0xa552, 0xa5fc,
+  0xa5fb, 0xa5fd, 0xa5fa, 0xa74a, 0xa749, 0xa74b, 0xa8e0, 0xa8df,
+  0xa8e1, 0xab5e, 0xa259, 0xd0de, 0xa25a, 0xb0c2, 0xa25c, 0xa25b,
+  0xd860, 0xa25d, 0xb9b8, 0xa25e, 0xa44a, 0xa4ba, 0xa5fe, 0xa8e2,
+  0xa44b, 0xa4bd, 0xa4bb, 0xa4bc, 0xa640, 0xa74c, 0xa8e4, 0xa8e3,
+  0xa8e5, 0xaddd, 0xbeac, 0xc94e, 0xa554, 0xa555, 0xa641, 0xca6a,
+  0xab60, 0xab5f, 0xd0e0, 0xd0df, 0xb0c3, 0xa4be, 0xc955, 0xcbcd,
+  0xab61, 0xade0, 0xadde, 0xaddf, 0xbead, 0xa556, 0xa642, 0xc9bc,
+  0xa74d, 0xa74e, 0xca6b, 0xcbce, 0xa8e6, 0xcbcf, 0xd0e2, 0xd0e3,
+  0xade3, 0xd0e4, 0xd0e1, 0xade4, 0xade2, 0xade1, 0xd0e5, 0xd468,
+  0xd861, 0xdcc5, 0xe140, 0xbbfe, 0xbeae, 0xe8f9, 0xa44c, 0xa45a,
+  0xb0c4, 0xb3cd, 0xb9b9, 0xc942, 0xa4bf, 0xa559, 0xa557, 0xa558,
+  0xa8e7, 0xa44d, 0xa44e, 0xa462, 0xa4c0, 0xa4c1, 0xa4c2, 0xc9be,
+  0xa55a, 0xc96b, 0xa646, 0xc9bf, 0xa644, 0xa645, 0xc9bd, 0xa647,
+  0xa643, 0xca6c, 0xaaec, 0xca6d, 0xca6e, 0xa750, 0xa74f, 0xa753,
+  0xa751, 0xa752, 0xa8ed, 0xa8ec, 0xcbd4, 0xcbd1, 0xcbd2, 0xcbd0,
+  0xa8ee, 0xa8ea, 0xa8e9, 0xa8eb, 0xa8e8, 0xa8ef, 0xab63, 0xcdf0,
+  0xcbd3, 0xab68, 0xcdf1, 0xab64, 0xab67, 0xab66, 0xab65, 0xab62,
+  0xd0e8, 0xade7, 0xd0eb, 0xade5, 0xd0e7, 0xade8, 0xade6, 0xade9,
+  0xd0e9, 0xd0ea, 0xd0e6, 0xd0ec, 0xb3d1, 0xb0c5, 0xd469, 0xd46b,
+  0xd46a, 0xd46c, 0xb0c6, 0xb3ce, 0xb3cf, 0xb3d0, 0xb6d0, 0xdcc7,
+  0xdcc6, 0xdcc8, 0xdcc9, 0xb6d1, 0xb6cf, 0xe141, 0xe142, 0xb9bb,
+  0xb9ba, 0xe35a, 0xbc40, 0xbc41, 0xbc42, 0xbc44, 0xe4f2, 0xe4f3,
+  0xbc43, 0xbeaf, 0xbeb0, 0xf1ed, 0xf5c3, 0xf5c2, 0xf7d1, 0xa44f,
+  0xa55c, 0xa55b, 0xa648, 0xc9c0, 0xa755, 0xa756, 0xa754, 0xa757,
+  0xca6f, 0xca70, 0xa8f1, 0xcbd5, 0xa8f0, 0xcdf2, 0xab6c, 0xcdf3,
+  0xab6b, 0xab69, 0xab6a, 0xd0ed, 0xb0c7, 0xd46e, 0xb0ca, 0xd46d,
+  0xb1e5, 0xb0c9, 0xb0c8, 0xb3d4, 0xb3d3, 0xb3d2, 0xb6d2, 0xb6d5,
+  0xb6d6, 0xb6d4, 0xb6d3, 0xe143, 0xe144, 0xe4f5, 0xbc45, 0xe4f4,
+  0xbeb1, 0xecbf, 0xc079, 0xf1ee, 0xc455, 0xa463, 0xa4c3, 0xc956,
+  0xa4c4, 0xa4c5, 0xa55d, 0xa55e, 0xa649, 0xca71, 0xcbd6, 0xcbd7,
+  0xab6d, 0xd0ee, 0xb0cc, 0xb0cb, 0xd863, 0xd862, 0xa450, 0xa4c6,
+  0xa55f, 0xb0cd, 0xc943, 0xc96c, 0xa560, 0xc9c2, 0xa64b, 0xa64a,
+  0xc9c1, 0xa758, 0xadea, 0xd46f, 0xb6d7, 0xe145, 0xb9bc, 0xe8fa,
+  0xf3fd, 0xa4c7, 0xcbd8, 0xcdf4, 0xb0d0, 0xb0ce, 0xb0cf, 0xa451,
+  0xa464, 0xa2cd, 0xa4ca, 0xa4c9, 0xa4c8, 0xa563, 0xa562, 0xc96d,
+  0xc9c3, 0xa8f5, 0xa8f2, 0xa8f4, 0xa8f3, 0xab6e, 0xb3d5, 0xa452,
+  0xa4cb, 0xa565, 0xa564, 0xca72, 0xa8f6, 0xc957, 0xa567, 0xa566,
+  0xa64c, 0xa64d, 0xca73, 0xa759, 0xa75a, 0xa8f7, 0xa8f8, 0xa8f9,
+  0xab6f, 0xcdf5, 0xadeb, 0xc944, 0xa4cc, 0xc9c4, 0xca74, 0xca75,
+  0xcbd9, 0xcbda, 0xcdf7, 0xcdf6, 0xcdf9, 0xcdf8, 0xab70, 0xd470,
+  0xaded, 0xd0ef, 0xadec, 0xd864, 0xb3d6, 0xd865, 0xe146, 0xb9bd,
+  0xbc46, 0xf1ef, 0xc958, 0xa568, 0xb0d1, 0xa453, 0xa465, 0xa4ce,
+  0xa4cd, 0xa4cf, 0xa8fb, 0xa8fa, 0xa8fc, 0xab71, 0xadee, 0xe8fb,
+  0xc24f, 0xa466, 0xa56a, 0xa579, 0xa574, 0xa56f, 0xa56e, 0xa575,
+  0xa573, 0xa56c, 0xa57a, 0xa56d, 0xa569, 0xa578, 0xa577, 0xa576,
+  0xa56b, 0xa572, 0xa571, 0xa57b, 0xa570, 0xa653, 0xa659, 0xa655,
+  0xa65b, 0xc9c5, 0xa658, 0xa64e, 0xa651, 0xa654, 0xa650, 0xa657,
+  0xa65a, 0xa64f, 0xa652, 0xa656, 0xa65c, 0xca7e, 0xca7b, 0xa767,
+  0xca7c, 0xa75b, 0xa75d, 0xa775, 0xa770, 0xcaa5, 0xca7d, 0xa75f,
+  0xa761, 0xcaa4, 0xa768, 0xca78, 0xa774, 0xa776, 0xa75c, 0xa76d,
+  0xca76, 0xa773, 0xa764, 0xa76e, 0xa76f, 0xca77, 0xa76c, 0xa76a,
+  0xa76b, 0xa771, 0xcaa1, 0xa75e, 0xa772, 0xcaa3, 0xa766, 0xa763,
+  0xca7a, 0xa762, 0xcaa6, 0xa765, 0xa769, 0xa760, 0xcaa2, 0xca79,
+  0xcbeb, 0xcbea, 0xa94f, 0xcbed, 0xcbef, 0xcbe4, 0xcbe7, 0xcbee,
+  0xa950, 0xcbe1, 0xcbe5, 0xcbe9, 0xce49, 0xa94b, 0xce4d, 0xa8fd,
+  0xcbe6, 0xa8fe, 0xa94c, 0xa945, 0xa941, 0xcbe2, 0xa944, 0xa949,
+  0xa952, 0xcbe3, 0xcbdc, 0xa943, 0xcbdd, 0xcbdf, 0xa946, 0xa948,
+  0xcbdb, 0xcbe0, 0xa951, 0xa94d, 0xcbe8, 0xa953, 0xa94a, 0xcbde,
+  0xa947, 0xa942, 0xa940, 0xcbec, 0xa94e, 0xce48, 0xcdfb, 0xce4b,
+  0xcdfd, 0xab78, 0xaba8, 0xab74, 0xaba7, 0xab7d, 0xaba4, 0xab72,
+  0xcdfc, 0xce43, 0xaba3, 0xce4f, 0xaba5, 0xab79, 0xce45, 0xce42,
+  0xab77, 0xcdfa, 0xaba6, 0xce4a, 0xab7c, 0xce4c, 0xaba9, 0xab73,
+  0xab7e, 0xab7b, 0xce40, 0xaba1, 0xce46, 0xce47, 0xab7a, 0xaba2,
+  0xab76, 0xab75, 0xcdfe, 0xce44, 0xce4e, 0xd144, 0xadfb, 0xd0f1,
+  0xd0f6, 0xadf4, 0xae40, 0xd0f4, 0xadef, 0xadf9, 0xadfe, 0xd0fb,
+  0xadfa, 0xadfd, 0xd0fe, 0xadf5, 0xd0f5, 0xd142, 0xd143, 0xadf7,
+  0xd141, 0xadf3, 0xae43, 0xd0f8, 0xadf1, 0xd146, 0xd0f9, 0xd0fd,
+  0xadf6, 0xae42, 0xd0fa, 0xadfc, 0xd140, 0xd147, 0xd4a1, 0xd145,
+  0xae44, 0xadf0, 0xd0fc, 0xd0f3, 0xadf8, 0xd0f2, 0xd0f7, 0xd0f0,
+  0xae41, 0xd477, 0xb0e4, 0xd4a7, 0xb0e2, 0xb0df, 0xd47c, 0xb0db,
+  0xd4a2, 0xb0e6, 0xd476, 0xd47b, 0xd47a, 0xadf2, 0xb0e1, 0xd4a5,
+  0xd4a8, 0xd473, 0xb3e8, 0xd4a9, 0xb0e7, 0xb0d9, 0xb0d6, 0xd47e,
+  0xb0d3, 0xd4a6, 0xb0da, 0xd4aa, 0xd474, 0xd4a4, 0xb0dd, 0xd475,
+  0xd478, 0xd47d, 0xb0de, 0xb0dc, 0xb0e8, 0xb0e3, 0xb0d7, 0xb1d2,
+  0xb0d8, 0xd479, 0xb0e5, 0xb0e0, 0xd4a3, 0xb0d5, 0xb0d4, 0xd471,
+  0xd472, 0xd86a, 0xb3d7, 0xb3da, 0xd875, 0xb3ee, 0xd878, 0xb3d8,
+  0xd871, 0xb3de, 0xb3e4, 0xb5bd, 0xb3e2, 0xd86e, 0xb3ef, 0xb3db,
+  0xb3e3, 0xd876, 0xdcd7, 0xd87b, 0xd86f, 0xd866, 0xd873, 0xd86d,
+  0xb3e1, 0xd879, 0xb3dd, 0xb3f1, 0xb3ea, 0xb3df, 0xb3dc, 0xb3e7,
+  0xd87a, 0xd86c, 0xd872, 0xd874, 0xd868, 0xd877, 0xb3d9, 0xd867,
+  0xb3e0, 0xb3f0, 0xb3ec, 0xd869, 0xb3e6, 0xb3ed, 0xb3e9, 0xb3e5,
+  0xd870, 0xb3eb, 0xdcd5, 0xdcd1, 0xdce0, 0xdcca, 0xdcd3, 0xb6e5,
+  0xb6e6, 0xb6de, 0xdcdc, 0xb6e8, 0xdccf, 0xdcce, 0xdccc, 0xdcde,
+  0xb6dc, 0xdcd8, 0xdccd, 0xb6df, 0xdcd6, 0xb6da, 0xdcd2, 0xdcd9,
+  0xdcdb, 0xdcdf, 0xb6e3, 0xdccb, 0xb6dd, 0xdcd0, 0xb6d8, 0xb6e4,
+  0xdcda, 0xb6e0, 0xb6e1, 0xb6e7, 0xb6db, 0xa25f, 0xb6d9, 0xdcd4,
+  0xb6e2, 0xdcdd, 0xb9cd, 0xb9c8, 0xe155, 0xe151, 0xe14b, 0xb9c2,
+  0xb9be, 0xe154, 0xb9bf, 0xe14e, 0xe150, 0xe153, 0xb9c4, 0xb9cb,
+  0xb9c5, 0xe149, 0xb9c6, 0xb9c7, 0xe14c, 0xb9cc, 0xe14a, 0xe14f,
+  0xb9c3, 0xe148, 0xb9c9, 0xb9c1, 0xb9c0, 0xe14d, 0xe152, 0xb9ca,
+  0xe147, 0xbc4d, 0xe547, 0xe544, 0xbc47, 0xbc53, 0xbc54, 0xbc4a,
+  0xe542, 0xbc4c, 0xe4f9, 0xbc52, 0xe546, 0xbc49, 0xe548, 0xbc48,
+  0xe543, 0xe545, 0xbc4b, 0xe541, 0xe4fa, 0xe4f7, 0xd86b, 0xe4fd,
+  0xe4f6, 0xe4fc, 0xe4fb, 0xe4f8, 0xbc4f, 0xbc4e, 0xbc50, 0xe4fe,
+  0xbeb2, 0xe540, 0xe945, 0xe8fd, 0xbebe, 0xe942, 0xbeb6, 0xbeba,
+  0xe941, 0xbeb9, 0xbeb5, 0xbeb8, 0xbeb3, 0xbebd, 0xe943, 0xe8fe,
+  0xbebc, 0xe8fc, 0xbebb, 0xe944, 0xe940, 0xbc51, 0xbebf, 0xe946,
+  0xbeb7, 0xbeb4, 0xecc6, 0xecc8, 0xc07b, 0xecc9, 0xecc7, 0xecc5,
+  0xecc4, 0xc07d, 0xecc3, 0xc07e, 0xecc1, 0xecc2, 0xc07a, 0xc0a1,
+  0xc07c, 0xecc0, 0xc250, 0xefbc, 0xefba, 0xefbf, 0xefbd, 0xefbb,
+  0xefbe, 0xc360, 0xf1f2, 0xf1f3, 0xc456, 0xf1f4, 0xf1f0, 0xf1f5,
+  0xf1f1, 0xc251, 0xf3fe, 0xf441, 0xc459, 0xf440, 0xc458, 0xc457,
+  0xc45a, 0xf5c5, 0xf5c6, 0xc4da, 0xc4d9, 0xc4db, 0xf5c4, 0xf6d8,
+  0xf6d7, 0xc56d, 0xc56f, 0xc56e, 0xf6d9, 0xc5c8, 0xf8a6, 0xc5f1,
+  0xf8a5, 0xf8ee, 0xc949, 0xa57d, 0xa57c, 0xa65f, 0xa65e, 0xc9c7,
+  0xa65d, 0xc9c6, 0xa779, 0xcaa9, 0xcaa8, 0xa777, 0xa77a, 0xcaa7,
+  0xa778, 0xcbf0, 0xcbf1, 0xa954, 0xabaa, 0xd148, 0xd149, 0xae45,
+  0xae46, 0xd4ac, 0xb0e9, 0xb0eb, 0xd4ab, 0xb0ea, 0xd87c, 0xb3f2,
+  0xb6e9, 0xb6ea, 0xdce1, 0xb9cf, 0xb9ce, 0xe549, 0xe948, 0xe947,
+  0xf96b, 0xa467, 0xc959, 0xc96e, 0xc96f, 0xa662, 0xa666, 0xc9c9,
+  0xa664, 0xa663, 0xc9c8, 0xa665, 0xa661, 0xa660, 0xc9ca, 0xa7a6,
+  0xa7a3, 0xa77d, 0xcaaa, 0xcaab, 0xa7a1, 0xcaad, 0xa77b, 0xcaae,
+  0xcaac, 0xa77e, 0xa7a2, 0xa7a5, 0xa7a4, 0xa77c, 0xcaaf, 0xa959,
+  0xcbfe, 0xa95b, 0xa95a, 0xcc40, 0xa958, 0xa957, 0xcbf5, 0xcbf4,
+  0xcbf2, 0xcbf7, 0xcbf6, 0xcbf3, 0xcbfc, 0xcbfd, 0xcbfa, 0xcbf8,
+  0xa956, 0xcbfb, 0xa95c, 0xcc41, 0xcbf9, 0xabab, 0xa955, 0xabac,
+  0xce54, 0xce5a, 0xabb2, 0xce58, 0xce5e, 0xce55, 0xce59, 0xce5b,
+  0xce5d, 0xce57, 0xce56, 0xce51, 0xce52, 0xabad, 0xabaf, 0xabae,
+  0xce53, 0xce5c, 0xabb1, 0xce50, 0xd153, 0xd152, 0xd157, 0xd14e,
+  0xd151, 0xd150, 0xd154, 0xd158, 0xae47, 0xae4a, 0xd14f, 0xd155,
+  0xae49, 0xd14a, 0xabb0, 0xd4ba, 0xd156, 0xd14d, 0xae48, 0xd14c,
+  0xd4b1, 0xb0ec, 0xb0f0, 0xd4c1, 0xd4af, 0xd4bd, 0xb0f1, 0xd4bf,
+  0xd4c5, 0xd4c9, 0xd4c0, 0xd4b4, 0xd4bc, 0xd4ca, 0xd4c8, 0xd4be,
+  0xd4b9, 0xd4b2, 0xd8a6, 0xd4b0, 0xb0f5, 0xd4b7, 0xb0f6, 0xb0f2,
+  0xd4ad, 0xd4c3, 0xd4b5, 0xd4b3, 0xd4c6, 0xb0f3, 0xd4cc, 0xb0ed,
+  0xb0ef, 0xd4bb, 0xd4b6, 0xae4b, 0xb0ee, 0xd4b8, 0xd4c7, 0xd4cb,
+  0xd4c2, 0xd4c4, 0xd4ae, 0xd8a1, 0xd8aa, 0xd8a9, 0xb3fa, 0xd8a2,
+  0xb3fb, 0xb3f9, 0xd8a4, 0xb3f6, 0xd8a8, 0xd8a3, 0xd8a5, 0xd87d,
+  0xb3f4, 0xd8b2, 0xd8b1, 0xd8ae, 0xb3f3, 0xb3f7, 0xb3f8, 0xd14b,
+  0xd8ab, 0xb3f5, 0xb0f4, 0xd8ad, 0xd87e, 0xd8b0, 0xd8af, 0xd8b3,
+  0xdcef, 0xd8ac, 0xd8a7, 0xdce7, 0xb6f4, 0xb6f7, 0xb6f2, 0xdce6,
+  0xdcea, 0xdce5, 0xb6ec, 0xb6f6, 0xdce2, 0xb6f0, 0xdce9, 0xb6ee,
+  0xb6ed, 0xdcec, 0xb6ef, 0xdcee, 0xdceb, 0xb6eb, 0xb6f5, 0xdcf0,
+  0xdce4, 0xdced, 0xdce3, 0xb6f1, 0xb6f3, 0xdce8, 0xdcf1, 0xe15d,
+  0xb9d0, 0xe163, 0xb9d5, 0xe15f, 0xe166, 0xe157, 0xb9d7, 0xb9d1,
+  0xe15c, 0xbc55, 0xe15b, 0xe164, 0xb9d2, 0xb9d6, 0xe15a, 0xe160,
+  0xe165, 0xe156, 0xb9d4, 0xe15e, 0xe162, 0xe168, 0xe158, 0xe161,
+  0xb9d3, 0xe167, 0xe159, 0xbc59, 0xe54b, 0xbc57, 0xbc56, 0xe54d,
+  0xe552, 0xe54e, 0xe551, 0xbc5c, 0xbea5, 0xbc5b, 0xe54a, 0xe550,
+  0xbc5a, 0xe54f, 0xe54c, 0xbc58, 0xe94d, 0xe94f, 0xe94a, 0xbec1,
+  0xe94c, 0xbec0, 0xe94e, 0xbec3, 0xe950, 0xbec2, 0xe949, 0xe94b,
+  0xc0a5, 0xeccc, 0xc0a4, 0xeccd, 0xc0a3, 0xeccb, 0xc0a2, 0xecca,
+  0xc253, 0xc252, 0xf1f6, 0xf1f8, 0xf1f7, 0xc361, 0xc362, 0xc363,
+  0xf442, 0xc45b, 0xf7d3, 0xf7d2, 0xc5f2, 0xa468, 0xa4d0, 0xa7a7,
+  0xce5f, 0xb3fc, 0xb3fd, 0xdcf2, 0xb9d8, 0xe169, 0xe553, 0xc95a,
+  0xcab0, 0xcc42, 0xce60, 0xd159, 0xae4c, 0xf1f9, 0xc4dc, 0xa469,
+  0xa57e, 0xc970, 0xa667, 0xa668, 0xa95d, 0xb0f7, 0xb9da, 0xb9db,
+  0xb9d9, 0xa46a, 0xa4d1, 0xa4d3, 0xa4d2, 0xc95b, 0xa4d4, 0xa5a1,
+  0xc971, 0xa5a2, 0xa669, 0xa66a, 0xc9cb, 0xa7a8, 0xcab1, 0xa961,
+  0xcc43, 0xa95f, 0xa960, 0xa95e, 0xd15a, 0xabb6, 0xabb5, 0xabb7,
+  0xabb4, 0xce61, 0xa962, 0xabb3, 0xae4d, 0xae4e, 0xae4f, 0xd4cd,
+  0xb3fe, 0xd8b4, 0xb0f8, 0xb6f8, 0xb9dd, 0xb9dc, 0xe16a, 0xbc5d,
+  0xbec4, 0xefc0, 0xf6da, 0xf7d4, 0xa46b, 0xa5a3, 0xa5a4, 0xc9d1,
+  0xa66c, 0xa66f, 0xc9cf, 0xc9cd, 0xa66e, 0xc9d0, 0xc9d2, 0xc9cc,
+  0xa671, 0xa670, 0xa66d, 0xa66b, 0xc9ce, 0xa7b3, 0xa7b0, 0xcab6,
+  0xcab9, 0xcab8, 0xa7aa, 0xa7b2, 0xa7af, 0xcab5, 0xcab3, 0xa7ae,
+  0xa7a9, 0xa7ac, 0xcab4, 0xcabb, 0xcab7, 0xa7ad, 0xa7b1, 0xa7b4,
+  0xcab2, 0xcaba, 0xa7ab, 0xa967, 0xa96f, 0xcc4f, 0xcc48, 0xa970,
+  0xcc53, 0xcc44, 0xcc4b, 0xa966, 0xcc45, 0xa964, 0xcc4c, 0xcc50,
+  0xa963, 0xcc51, 0xcc4a, 0xcc4d, 0xa972, 0xa969, 0xcc54, 0xcc52,
+  0xa96e, 0xa96c, 0xcc49, 0xa96b, 0xcc47, 0xcc46, 0xa96a, 0xa968,
+  0xa971, 0xa96d, 0xa965, 0xcc4e, 0xabb9, 0xabc0, 0xce6f, 0xabb8,
+  0xce67, 0xce63, 0xce73, 0xce62, 0xabbb, 0xce6c, 0xabbe, 0xabc1,
+  0xabbc, 0xce70, 0xabbf, 0xae56, 0xce76, 0xce64, 0xce66, 0xce6d,
+  0xce71, 0xce75, 0xce72, 0xce6b, 0xce6e, 0xce68, 0xabc3, 0xce6a,
+  0xce69, 0xce74, 0xabba, 0xce65, 0xabc2, 0xabbd, 0xae5c, 0xd162,
+  0xae5b, 0xd160, 0xae50, 0xae55, 0xd15f, 0xd15c, 0xd161, 0xae51,
+  0xd15b, 0xae54, 0xae52, 0xd163, 0xae53, 0xae57, 0xae58, 0xae5a,
+  0xae59, 0xd15d, 0xd15e, 0xd164, 0xd4d4, 0xb0f9, 0xd8c2, 0xd4d3,
+  0xd4e6, 0xb140, 0xd4e4, 0xb0fe, 0xb0fa, 0xd4ed, 0xd4dd, 0xd4e0,
+  0xb143, 0xd4ea, 0xd4e2, 0xb0fb, 0xb144, 0xd4e7, 0xd4e5, 0xd4d6,
+  0xd4eb, 0xd4df, 0xd4da, 0xd4d0, 0xd4ec, 0xd4dc, 0xd4cf, 0xb142,
+  0xd4e1, 0xd4ee, 0xd4de, 0xd4d2, 0xd4d7, 0xd4ce, 0xb141, 0xd4db,
+  0xd4d8, 0xb0fc, 0xd4d1, 0xd4e9, 0xb0fd, 0xd4d9, 0xd4d5, 0xd4e8,
+  0xb440, 0xd8bb, 0xd8b8, 0xd8c9, 0xd8bd, 0xd8ca, 0xb442, 0xd8c6,
+  0xd8c3, 0xd8c4, 0xd8c7, 0xd8cb, 0xd4e3, 0xd8cd, 0xdd47, 0xb443,
+  0xd8ce, 0xd8b6, 0xd8c0, 0xd8c5, 0xb441, 0xb444, 0xd8cc, 0xd8cf,
+  0xd8ba, 0xd8b7, 0xd8b9, 0xd8be, 0xd8bc, 0xb445, 0xd8c8, 0xd8bf,
+  0xd8c1, 0xd8b5, 0xdcfa, 0xdcf8, 0xb742, 0xb740, 0xdd43, 0xdcf9,
+  0xdd44, 0xdd40, 0xdcf7, 0xdd46, 0xdcf6, 0xdcfd, 0xb6fe, 0xb6fd,
+  0xb6fc, 0xdcfb, 0xdd41, 0xb6f9, 0xb741, 0xdcf4, 0xdcfe, 0xdcf3,
+  0xdcfc, 0xb6fa, 0xdd42, 0xdcf5, 0xb6fb, 0xdd45, 0xe16e, 0xb9e2,
+  0xb9e1, 0xb9e3, 0xe17a, 0xe170, 0xe176, 0xe16b, 0xe179, 0xe178,
+  0xe17c, 0xe175, 0xb9de, 0xe174, 0xb9e4, 0xe16d, 0xb9df, 0xe17b,
+  0xb9e0, 0xe16f, 0xe172, 0xe177, 0xe171, 0xe16c, 0xe173, 0xe555,
+  0xbc61, 0xe558, 0xe557, 0xe55a, 0xe55c, 0xbc5f, 0xe556, 0xe554,
+  0xe55d, 0xe55b, 0xe559, 0xe55f, 0xe55e, 0xbc63, 0xbc5e, 0xbc60,
+  0xbc62, 0xe560, 0xe957, 0xe956, 0xe955, 0xe958, 0xe951, 0xe952,
+  0xe95a, 0xe953, 0xbec5, 0xe95c, 0xe95b, 0xe954, 0xecd1, 0xc0a8,
+  0xeccf, 0xecd4, 0xecd3, 0xe959, 0xc0a7, 0xecd2, 0xecce, 0xecd6,
+  0xecd5, 0xc0a6, 0xecd0, 0xbec6, 0xc254, 0xefc1, 0xf1fa, 0xf1fb,
+  0xf1fc, 0xc45c, 0xc45d, 0xf443, 0xf5c8, 0xf5c7, 0xf6db, 0xf6dc,
+  0xf7d5, 0xf8a7, 0xa46c, 0xa46d, 0xa46e, 0xa4d5, 0xa5a5, 0xc9d3,
+  0xa672, 0xa673, 0xa7b7, 0xa7b8, 0xa7b6, 0xa7b5, 0xa973, 0xcc55,
+  0xa975, 0xa974, 0xcc56, 0xabc4, 0xae5d, 0xd165, 0xd4f0, 0xb145,
+  0xb447, 0xd4ef, 0xb446, 0xb9e5, 0xe17d, 0xbec7, 0xc0a9, 0xecd7,
+  0xc45e, 0xc570, 0xc972, 0xa5a6, 0xc973, 0xa676, 0xa674, 0xa675,
+  0xa677, 0xa7ba, 0xa7b9, 0xcabc, 0xa7bb, 0xcabd, 0xcc57, 0xcc58,
+  0xa976, 0xa978, 0xa97a, 0xa977, 0xa97b, 0xa979, 0xabc8, 0xabc5,
+  0xabc7, 0xabc9, 0xabc6, 0xd166, 0xce77, 0xd168, 0xd167, 0xae63,
+  0xae5f, 0xae60, 0xae62, 0xae64, 0xae61, 0xae66, 0xae65, 0xb14a,
+  0xd4f2, 0xd4f1, 0xb149, 0xb148, 0xb147, 0xb14b, 0xb146, 0xd8d5,
+  0xd8d2, 0xb449, 0xd8d1, 0xd8d6, 0xb44b, 0xd8d4, 0xb448, 0xb44a,
+  0xd8d3, 0xdd48, 0xdd49, 0xdd4a, 0xb9e6, 0xb9ee, 0xe17e, 0xb9e8,
+  0xb9ec, 0xe1a1, 0xb9ed, 0xb9e9, 0xb9ea, 0xb9e7, 0xb9eb, 0xbc66,
+  0xd8d0, 0xbc67, 0xbc65, 0xbc64, 0xe95d, 0xbec8, 0xecd8, 0xecd9,
+  0xc364, 0xc45f, 0xa46f, 0xa678, 0xabca, 0xd169, 0xae67, 0xb14e,
+  0xb14d, 0xb14c, 0xb44c, 0xb44d, 0xd8d7, 0xb9ef, 0xbec9, 0xa470,
+  0xc95c, 0xa4d6, 0xc974, 0xc9d4, 0xa679, 0xa97c, 0xdd4b, 0xa471,
+  0xa4d7, 0xc9d5, 0xcabe, 0xcabf, 0xa7bc, 0xd8d8, 0xb44e, 0xdd4c,
+  0xc0aa, 0xa472, 0xa4a8, 0xa4d8, 0xc975, 0xa5a7, 0xa7c0, 0xa7bf,
+  0xa7bd, 0xa7be, 0xcc59, 0xa97e, 0xa9a1, 0xcc5a, 0xa97d, 0xabce,
+  0xce78, 0xabcd, 0xabcb, 0xabcc, 0xae6a, 0xae68, 0xd16b, 0xae69,
+  0xd16a, 0xae5e, 0xd4f3, 0xb150, 0xb151, 0xb14f, 0xb9f0, 0xe1a2,
+  0xbc68, 0xbc69, 0xe561, 0xc0ab, 0xefc2, 0xefc3, 0xc4dd, 0xf8a8,
+  0xc94b, 0xa4d9, 0xa473, 0xc977, 0xc976, 0xa67a, 0xc9d7, 0xc9d8,
+  0xc9d6, 0xc9d9, 0xcac7, 0xcac2, 0xcac4, 0xcac6, 0xcac3, 0xa7c4,
+  0xcac0, 0xcac1, 0xa7c1, 0xa7c2, 0xcac5, 0xcac8, 0xa7c3, 0xcac9,
+  0xcc68, 0xcc62, 0xcc5d, 0xa9a3, 0xcc65, 0xcc63, 0xcc5c, 0xcc69,
+  0xcc6c, 0xcc67, 0xcc60, 0xa9a5, 0xcc66, 0xa9a6, 0xcc61, 0xcc64,
+  0xcc5b, 0xcc5f, 0xcc6b, 0xa9a7, 0xa9a8, 0xcc5e, 0xcc6a, 0xa9a2,
+  0xa9a4, 0xceab, 0xcea4, 0xceaa, 0xcea3, 0xcea5, 0xce7d, 0xce7b,
+  0xceac, 0xcea9, 0xce79, 0xabd0, 0xcea7, 0xcea8, 0xcea6, 0xce7c,
+  0xce7a, 0xabcf, 0xcea2, 0xce7e, 0xcea1, 0xcead, 0xae6f, 0xae6e,
+  0xd16c, 0xae6b, 0xd16e, 0xae70, 0xd16f, 0xae73, 0xae71, 0xd170,
+  0xceae, 0xd172, 0xae6d, 0xae6c, 0xd16d, 0xd171, 0xae72, 0xb153,
+  0xb152, 0xd4f5, 0xd4f9, 0xd4fb, 0xb154, 0xd4fe, 0xb158, 0xd541,
+  0xb15a, 0xb156, 0xb15e, 0xb15b, 0xd4f7, 0xb155, 0xd4f6, 0xd4f4,
+  0xd543, 0xd4f8, 0xb157, 0xd542, 0xb15c, 0xd4fd, 0xd4fc, 0xb15d,
+  0xd4fa, 0xb159, 0xd544, 0xd540, 0xd8e7, 0xd8ee, 0xd8e3, 0xb451,
+  0xd8df, 0xd8ef, 0xd8d9, 0xd8ec, 0xd8ea, 0xd8e4, 0xd8ed, 0xd8e6,
+  0xd8de, 0xd8f0, 0xd8dc, 0xd8e9, 0xd8da, 0xd8f1, 0xb452, 0xd8eb,
+  0xdd4f, 0xd8dd, 0xb44f, 0xd8e1, 0xb450, 0xd8e0, 0xd8e5, 0xd8e2,
+  0xd8e8, 0xdd53, 0xdd56, 0xdd4e, 0xdd50, 0xdd55, 0xdd54, 0xb743,
+  0xd8db, 0xdd52, 0xb744, 0xdd4d, 0xdd51, 0xe1a9, 0xe1b0, 0xe1a7,
+  0xe1ae, 0xe1a5, 0xe1ad, 0xe1b1, 0xe1a4, 0xe1a8, 0xe1a3, 0xb9f1,
+  0xe1a6, 0xb9f2, 0xe1ac, 0xe1ab, 0xe1aa, 0xe1af, 0xe565, 0xe567,
+  0xbc6b, 0xe568, 0xe563, 0xe562, 0xe56c, 0xe56a, 0xbc6a, 0xe56d,
+  0xe564, 0xe569, 0xe56b, 0xe566, 0xe961, 0xe966, 0xe960, 0xe965,
+  0xe95e, 0xe968, 0xe964, 0xe969, 0xe963, 0xe95f, 0xe967, 0xe96a,
+  0xe962, 0xecda, 0xc0af, 0xc0ad, 0xc0ac, 0xc0ae, 0xefc4, 0xf172,
+  0xf1fd, 0xf444, 0xf445, 0xc460, 0xf5c9, 0xc4de, 0xf5ca, 0xf6de,
+  0xc572, 0xc571, 0xf6dd, 0xc5c9, 0xf7d6, 0xa474, 0xa67b, 0xc9da,
+  0xcaca, 0xa8b5, 0xb15f, 0xa475, 0xa5aa, 0xa5a9, 0xa5a8, 0xa7c5,
+  0xae74, 0xdd57, 0xa476, 0xa477, 0xa478, 0xa4da, 0xabd1, 0xceaf,
+  0xb453, 0xa479, 0xc95d, 0xa5ab, 0xa5ac, 0xc978, 0xa67c, 0xcacb,
+  0xa7c6, 0xcacc, 0xa9ae, 0xcc6e, 0xa9ac, 0xa9ab, 0xcc6d, 0xa9a9,
+  0xcc6f, 0xa9aa, 0xa9ad, 0xabd2, 0xabd4, 0xceb3, 0xceb0, 0xceb1,
+  0xceb2, 0xceb4, 0xabd3, 0xd174, 0xd173, 0xae76, 0xae75, 0xb162,
+  0xd546, 0xb161, 0xb163, 0xb160, 0xb455, 0xd545, 0xb456, 0xd8f3,
+  0xb457, 0xd8f2, 0xb454, 0xdd5a, 0xdd5c, 0xb745, 0xdd5b, 0xdd59,
+  0xdd58, 0xe1b4, 0xb9f7, 0xb9f5, 0xb9f6, 0xe1b2, 0xe1b3, 0xb9f3,
+  0xe571, 0xe56f, 0xbc6d, 0xe570, 0xbc6e, 0xbc6c, 0xb9f4, 0xe96d,
+  0xe96b, 0xe96c, 0xe56e, 0xecdc, 0xc0b0, 0xecdb, 0xefc5, 0xefc6,
+  0xe96e, 0xf1fe, 0xa47a, 0xa5ad, 0xa67e, 0xc9db, 0xa67d, 0xa9af,
+  0xb746, 0xa4db, 0xa5ae, 0xabd5, 0xb458, 0xc979, 0xc97a, 0xc9dc,
+  0xa7c8, 0xcad0, 0xcace, 0xa7c9, 0xcacd, 0xcacf, 0xcad1, 0xa7c7,
+  0xa9b3, 0xa9b4, 0xa9b1, 0xa9b0, 0xceb8, 0xa9b2, 0xabd6, 0xceb7,
+  0xceb9, 0xceb6, 0xceba, 0xabd7, 0xae79, 0xd175, 0xd177, 0xae77,
+  0xd178, 0xae78, 0xd176, 0xceb5, 0xd547, 0xd54a, 0xd54b, 0xd548,
+  0xb167, 0xb166, 0xb164, 0xb165, 0xd549, 0xb168, 0xb45a, 0xb45b,
+  0xb45c, 0xdd5d, 0xdd5f, 0xdd61, 0xb748, 0xb747, 0xb459, 0xdd60,
+  0xdd5e, 0xe1b8, 0xe1b6, 0xe1bc, 0xb9f8, 0xe1bd, 0xe1ba, 0xb9f9,
+  0xe1b7, 0xe1b5, 0xe1bb, 0xbc70, 0xe573, 0xe1b9, 0xbc72, 0xe574,
+  0xbc71, 0xbc74, 0xe575, 0xbc6f, 0xbc73, 0xe973, 0xe971, 0xe970,
+  0xe972, 0xe96f, 0xc366, 0xf446, 0xf447, 0xf5cb, 0xf6df, 0xc655,
+  0xa9b5, 0xa7ca, 0xabd8, 0xa47b, 0xa4dc, 0xa5af, 0xc9dd, 0xa7cb,
+  0xcad2, 0xcebb, 0xabd9, 0xb9fa, 0xa47c, 0xa6a1, 0xb749, 0xa47d,
+  0xa4dd, 0xa4de, 0xa5b1, 0xa5b0, 0xc9de, 0xa6a2, 0xcad3, 0xa7cc,
+  0xcc71, 0xcc72, 0xcc73, 0xa9b6, 0xa9b7, 0xcc70, 0xa9b8, 0xabda,
+  0xcebc, 0xd17a, 0xae7a, 0xd179, 0xb169, 0xd54c, 0xb16a, 0xd54d,
+  0xb45d, 0xdd62, 0xe1bf, 0xe1be, 0xb9fb, 0xbc75, 0xe576, 0xbeca,
+  0xe974, 0xc0b1, 0xc573, 0xf7d8, 0xcc74, 0xcebd, 0xb16b, 0xd8f4,
+  0xb74a, 0xc255, 0xa7ce, 0xa7cd, 0xabdb, 0xd17b, 0xb16d, 0xb343,
+  0xb16e, 0xb16c, 0xb45e, 0xe1c0, 0xb9fc, 0xbc76, 0xc94c, 0xc9df,
+  0xcad5, 0xa7cf, 0xcad4, 0xa7d0, 0xa9bc, 0xcc77, 0xcc76, 0xa9bb,
+  0xa9b9, 0xa9ba, 0xcc75, 0xabdd, 0xcebe, 0xabe0, 0xabdc, 0xabe2,
+  0xabde, 0xabdf, 0xabe1, 0xae7d, 0xae7c, 0xae7b, 0xd54f, 0xb16f,
+  0xb172, 0xb170, 0xd54e, 0xb175, 0xb171, 0xd550, 0xb174, 0xb173,
+  0xd8f6, 0xd8f5, 0xb461, 0xb45f, 0xb460, 0xd8f7, 0xb74b, 0xdd64,
+  0xb74c, 0xdd63, 0xe577, 0xbc78, 0xe1c1, 0xbc77, 0xb9fd, 0xecde,
+  0xe975, 0xc0b2, 0xecdd, 0xf240, 0xf448, 0xf449, 0xa4df, 0xa5b2,
+  0xc97b, 0xa7d2, 0xa7d4, 0xc9e2, 0xcad8, 0xcad7, 0xcad6, 0xc9e1,
+  0xc9e0, 0xa6a4, 0xa7d3, 0xa7d1, 0xa6a3, 0xa9bd, 0xcc78, 0xa9be,
+  0xcadd, 0xcadf, 0xcade, 0xcc79, 0xcada, 0xa7d8, 0xa7d6, 0xcad9,
+  0xcadb, 0xcae1, 0xa7d5, 0xcadc, 0xcae5, 0xa9c0, 0xcae2, 0xa7d7,
+  0xcae0, 0xcae3, 0xa9bf, 0xa9c1, 0xcae4, 0xccaf, 0xcca2, 0xcc7e,
+  0xccae, 0xcca9, 0xabe7, 0xa9c2, 0xccaa, 0xccad, 0xabe3, 0xccac,
+  0xa9c3, 0xa9c8, 0xa9c6, 0xcca3, 0xcc7c, 0xcca5, 0xa9cd, 0xccb0,
+  0xabe4, 0xcca6, 0xabe5, 0xa9c9, 0xcca8, 0xcecd, 0xabe6, 0xcc7b,
+  0xa9ca, 0xabe8, 0xa9cb, 0xa9c7, 0xa9cc, 0xcca7, 0xcc7a, 0xccab,
+  0xa9c4, 0xcc7d, 0xcca4, 0xcca1, 0xa9c5, 0xcebf, 0xcec0, 0xceca,
+  0xd1a1, 0xcecb, 0xabee, 0xcece, 0xcec4, 0xabed, 0xcec6, 0xcec7,
+  0xcec9, 0xabe9, 0xaea3, 0xcec5, 0xcec1, 0xaea4, 0xcecf, 0xae7e,
+  0xd17d, 0xcec8, 0xd17c, 0xcec3, 0xcecc, 0xabec, 0xaea1, 0xabf2,
+  0xaea2, 0xced0, 0xd17e, 0xabeb, 0xaea6, 0xabf1, 0xabf0, 0xabef,
+  0xaea5, 0xced1, 0xaea7, 0xabea, 0xcec2, 0xb176, 0xd1a4, 0xd1a6,
+  0xd1a8, 0xaea8, 0xaeae, 0xd553, 0xd1ac, 0xd1a3, 0xb178, 0xd551,
+  0xaead, 0xaeab, 0xd1ae, 0xd552, 0xd1a5, 0xaeac, 0xd1a9, 0xaeaf,
+  0xd1ab, 0xaeaa, 0xd1aa, 0xd1ad, 0xd1a7, 0xaea9, 0xb179, 0xd1a2,
+  0xb177, 0xb17a, 0xd555, 0xd55e, 0xb464, 0xb17c, 0xb1a3, 0xb465,
+  0xd560, 0xb1aa, 0xd8f9, 0xd556, 0xb1a2, 0xb1a5, 0xb17e, 0xd554,
+  0xd562, 0xd565, 0xd949, 0xd563, 0xd8fd, 0xb1a1, 0xb1a8, 0xb1ac,
+  0xd55d, 0xd8f8, 0xd561, 0xb17b, 0xd8fa, 0xd564, 0xd8fc, 0xd559,
+  0xb462, 0xd557, 0xd558, 0xb1a7, 0xb1a6, 0xd55b, 0xb1ab, 0xd55f,
+  0xb1a4, 0xd55c, 0xb1a9, 0xb466, 0xb463, 0xd8fb, 0xd55a, 0xb17d,
+  0xb46b, 0xb46f, 0xd940, 0xb751, 0xb46d, 0xd944, 0xb471, 0xdd65,
+  0xd946, 0xb753, 0xb469, 0xb46c, 0xd947, 0xd948, 0xd94e, 0xb473,
+  0xb754, 0xd94a, 0xd94f, 0xd943, 0xb75e, 0xb755, 0xb472, 0xd941,
+  0xd950, 0xb75d, 0xb470, 0xb74e, 0xd94d, 0xb474, 0xd945, 0xd8fe,
+  0xb46a, 0xd942, 0xd94b, 0xb74d, 0xb752, 0xb467, 0xd94c, 0xb750,
+  0xb468, 0xb75c, 0xe1c3, 0xdd70, 0xdd68, 0xe1c2, 0xdd6c, 0xdd6e,
+  0xdd6b, 0xb75b, 0xdd6a, 0xb75f, 0xe1d2, 0xb75a, 0xba40, 0xdd71,
+  0xe1c4, 0xb758, 0xdd69, 0xdd6d, 0xb9fe, 0xb74f, 0xdd66, 0xdd67,
+  0xba41, 0xb757, 0xb759, 0xb756, 0xdd6f, 0xe1c8, 0xe1c9, 0xe1ce,
+  0xbc7d, 0xe1d5, 0xba47, 0xba46, 0xe1d0, 0xbc7c, 0xe1c5, 0xba45,
+  0xe1d4, 0xba43, 0xba44, 0xe1d1, 0xe5aa, 0xbc7a, 0xb46e, 0xe1d3,
+  0xbca3, 0xe1cb, 0xbc7b, 0xbca2, 0xe1c6, 0xe1ca, 0xe1c7, 0xe1cd,
+  0xba48, 0xbc79, 0xba42, 0xe57a, 0xe1cf, 0xbca1, 0xbca4, 0xe1cc,
+  0xbc7e, 0xe579, 0xe57e, 0xbece, 0xe578, 0xe9a3, 0xe5a9, 0xbca8,
+  0xbca6, 0xbecc, 0xe5a6, 0xe5a2, 0xbcac, 0xe978, 0xbcaa, 0xe5a1,
+  0xe976, 0xe5a5, 0xe5a8, 0xe57d, 0xbcab, 0xbca5, 0xe977, 0xbecd,
+  0xe5a7, 0xbca7, 0xbca9, 0xe5a4, 0xbcad, 0xe5a3, 0xe57c, 0xe57b,
+  0xbecb, 0xe5ab, 0xe97a, 0xece0, 0xbed0, 0xe9a2, 0xe97e, 0xece1,
+  0xbed1, 0xe9a1, 0xe97c, 0xc0b4, 0xecdf, 0xe979, 0xe97b, 0xc0b5,
+  0xbed3, 0xc0b3, 0xbed2, 0xc0b7, 0xe97d, 0xbecf, 0xefcf, 0xefc7,
+  0xece7, 0xefc8, 0xece3, 0xc256, 0xece5, 0xece4, 0xc0b6, 0xece2,
+  0xece6, 0xefd0, 0xefcc, 0xefce, 0xefc9, 0xefca, 0xefcd, 0xefcb,
+  0xc367, 0xc36a, 0xc369, 0xc368, 0xc461, 0xf44a, 0xc462, 0xf241,
+  0xc4df, 0xf5cc, 0xc4e0, 0xc574, 0xc5ca, 0xf7d9, 0xf7da, 0xf7db,
+  0xf9ba, 0xa4e0, 0xc97c, 0xa5b3, 0xa6a6, 0xa6a7, 0xa6a5, 0xa6a8,
+  0xa7da, 0xa7d9, 0xccb1, 0xa9cf, 0xa9ce, 0xd1af, 0xb1ad, 0xb1ae,
+  0xb475, 0xdd72, 0xb760, 0xb761, 0xdd74, 0xdd76, 0xdd75, 0xe1d7,
+  0xe1d6, 0xba49, 0xe1d8, 0xe5ac, 0xbcae, 0xbed4, 0xc0b8, 0xc257,
+  0xc0b9, 0xa4e1, 0xcae6, 0xccb2, 0xa9d1, 0xa9d0, 0xa9d2, 0xabf3,
+  0xced2, 0xced3, 0xd1b0, 0xaeb0, 0xb1af, 0xb476, 0xd951, 0xa4e2,
+  0xa47e, 0xa4e3, 0xc97d, 0xa5b7, 0xa5b6, 0xa5b4, 0xa5b5, 0xa6ab,
+  0xc9e9, 0xc9eb, 0xa6aa, 0xc9e3, 0xc9e4, 0xc9ea, 0xc9e6, 0xc9e8,
+  0xa6a9, 0xc9e5, 0xc9ec, 0xc9e7, 0xa7e1, 0xa7ea, 0xa7e8, 0xcaf0,
+  0xcaed, 0xcaf5, 0xa7e6, 0xcaf6, 0xa7df, 0xcaf3, 0xa7e5, 0xcaef,
+  0xcaee, 0xa7e3, 0xcaf4, 0xa7e4, 0xa9d3, 0xa7de, 0xcaf1, 0xcae7,
+  0xa7db, 0xa7ee, 0xcaec, 0xcaf2, 0xa7e0, 0xa7e2, 0xcae8, 0xcae9,
+  0xcaea, 0xa7ed, 0xa7e7, 0xa7ec, 0xcaeb, 0xa7eb, 0xa7dd, 0xa7dc,
+  0xa7e9, 0xa9e1, 0xccbe, 0xccb7, 0xa9dc, 0xa9ef, 0xccb3, 0xccba,
+  0xccbc, 0xccbf, 0xa9ea, 0xccbb, 0xccb4, 0xa9e8, 0xccb8, 0xccc0,
+  0xa9d9, 0xccbd, 0xa9e3, 0xa9e2, 0xccb6, 0xa9d7, 0xa9d8, 0xa9d6,
+  0xa9ee, 0xa9e6, 0xa9e0, 0xa9d4, 0xccb9, 0xa9df, 0xa9d5, 0xa9e7,
+  0xa9f0, 0xced4, 0xa9e4, 0xccb5, 0xa9da, 0xa9dd, 0xa9de, 0xa9ec,
+  0xa9ed, 0xa9eb, 0xa9e5, 0xa9e9, 0xa9db, 0xabf4, 0xceda, 0xac41,
+  0xabf8, 0xabfa, 0xac40, 0xcee6, 0xabfd, 0xd1b1, 0xaeb1, 0xac43,
+  0xced7, 0xcedf, 0xabfe, 0xcede, 0xcedb, 0xcee3, 0xcee5, 0xabf7,
+  0xabfb, 0xac42, 0xaeb3, 0xcee0, 0xabf9, 0xac45, 0xced9, 0xabfc,
+  0xaeb2, 0xabf6, 0xced6, 0xcedd, 0xced5, 0xced8, 0xcedc, 0xd1b2,
+  0xac44, 0xcee1, 0xcee2, 0xcee4, 0xabf5, 0xaec1, 0xd1be, 0xaebf,
+  0xaec0, 0xd1b4, 0xd1c4, 0xaeb6, 0xd566, 0xd1c6, 0xd1c0, 0xd1b7,
+  0xd1c9, 0xd1ba, 0xaebc, 0xd57d, 0xd1bd, 0xaebe, 0xaeb5, 0xd1cb,
+  0xd1bf, 0xaeb8, 0xd1b8, 0xd1b5, 0xd1b6, 0xaeb9, 0xd1c5, 0xd1cc,
+  0xaebb, 0xd1bc, 0xd1bb, 0xaec3, 0xaec2, 0xaeb4, 0xaeba, 0xaebd,
+  0xd1c8, 0xd1c2, 0xaeb7, 0xd1b3, 0xd1ca, 0xd1c1, 0xd1c3, 0xd1c7,
+  0xd567, 0xb1b7, 0xb1cb, 0xb1ca, 0xb1bf, 0xd579, 0xd575, 0xd572,
+  0xd5a6, 0xb1ba, 0xb1b2, 0xd577, 0xb4a8, 0xb1b6, 0xd5a1, 0xb1cc,
+  0xb1c9, 0xd57b, 0xd56a, 0xb1c8, 0xd5a3, 0xd569, 0xb1bd, 0xb1c1,
+  0xd5a2, 0xd573, 0xb1c2, 0xb1bc, 0xd568, 0xb478, 0xd5a5, 0xd571,
+  0xb1c7, 0xd574, 0xd5a4, 0xb1c6, 0xd952, 0xb1b3, 0xd56f, 0xb1b8,
+  0xb1c3, 0xb1be, 0xd578, 0xd56e, 0xd56c, 0xd57e, 0xb1b0, 0xb1c4,
+  0xb1b4, 0xb477, 0xd57c, 0xb1b5, 0xb1b1, 0xb1c0, 0xb1bb, 0xb1b9,
+  0xd570, 0xb1c5, 0xd56d, 0xd57a, 0xd576, 0xd954, 0xd953, 0xd56b,
+  0xd964, 0xb47a, 0xd96a, 0xd959, 0xd967, 0xdd77, 0xb47d, 0xd96b,
+  0xd96e, 0xb47c, 0xd95c, 0xd96d, 0xd96c, 0xb47e, 0xd955, 0xb479,
+  0xb4a3, 0xb4a1, 0xd969, 0xd95f, 0xb4a5, 0xd970, 0xd968, 0xd971,
+  0xb4ad, 0xb4ab, 0xd966, 0xd965, 0xd963, 0xd95d, 0xb4a4, 0xb4a2,
+  0xd1b9, 0xd956, 0xddb7, 0xd957, 0xb47b, 0xb4aa, 0xdd79, 0xb4a6,
+  0xb4a7, 0xd958, 0xd96f, 0xdd78, 0xd960, 0xd95b, 0xb4a9, 0xd961,
+  0xd95e, 0xb4ae, 0xb770, 0xdd7c, 0xddb1, 0xddb6, 0xddaa, 0xb76c,
+  0xddbb, 0xb769, 0xdd7a, 0xdd7b, 0xb762, 0xb76b, 0xdda4, 0xb76e,
+  0xb76f, 0xdda5, 0xddb2, 0xddb8, 0xb76a, 0xb764, 0xdda3, 0xdd7d,
+  0xddba, 0xdda8, 0xdda9, 0xdd7e, 0xddb4, 0xddab, 0xddb5, 0xddad,
+  0xb765, 0xe1d9, 0xb768, 0xb766, 0xddb9, 0xddb0, 0xddac, 0xdda1,
+  0xba53, 0xddaf, 0xb76d, 0xdda7, 0xdda6, 0xb767, 0xb763, 0xe1ee,
+  0xddb3, 0xddae, 0xdda2, 0xe1e9, 0xe1da, 0xe1e5, 0xe1ec, 0xba51,
+  0xb4ac, 0xe1ea, 0xba4c, 0xba4b, 0xe1f1, 0xe1db, 0xe1e8, 0xe1dc,
+  0xe1e7, 0xba4f, 0xe1eb, 0xd962, 0xe1f2, 0xe1e3, 0xba52, 0xe5ba,
+  0xbcaf, 0xe1f0, 0xe1ef, 0xba54, 0xe5ad, 0xbcb0, 0xe5ae, 0xe1df,
+  0xe1e0, 0xe1dd, 0xe1e2, 0xe1de, 0xe1f3, 0xba4e, 0xbcb1, 0xba50,
+  0xba55, 0xe1e1, 0xe1ed, 0xe1e6, 0xe5b1, 0xba4a, 0xbcb4, 0xe9aa,
+  0xe5b6, 0xe5b5, 0xe5b7, 0xe5b4, 0xbcb5, 0xbcbb, 0xbcb8, 0xbcb9,
+  0xe5af, 0xe5b2, 0xe5bc, 0xbcc1, 0xbcbf, 0xe5b3, 0xd95a, 0xbcb2,
+  0xe5b9, 0xe5b0, 0xbcc2, 0xe5b8, 0xba4d, 0xbcb7, 0xe1e4, 0xbcba,
+  0xbcbe, 0xbcc0, 0xbcbd, 0xbcbc, 0xbcb6, 0xe5bb, 0xbcb3, 0xbcc3,
+  0xbed8, 0xbed9, 0xe9a9, 0xbee2, 0xbedf, 0xbed6, 0xbedd, 0xe9ab,
+  0xbedb, 0xbed5, 0xbedc, 0xe9a8, 0xc0bb, 0xbed7, 0xbede, 0xc0ba,
+  0xe9a7, 0xe9a6, 0xbee0, 0xbee1, 0xe9a5, 0xe9a4, 0xc0bc, 0xe9ae,
+  0xbeda, 0xe9ac, 0xc0bd, 0xc0c2, 0xecea, 0xecec, 0xc0bf, 0xeced,
+  0xece9, 0xeceb, 0xc0c0, 0xc0c3, 0xece8, 0xc0be, 0xc0c1, 0xc259,
+  0xe9ad, 0xc258, 0xc25e, 0xefd4, 0xc25c, 0xc25d, 0xefd7, 0xefd3,
+  0xc25a, 0xefd1, 0xc36b, 0xefd5, 0xefd6, 0xefd2, 0xc25b, 0xf242,
+  0xf245, 0xf246, 0xf244, 0xf247, 0xc36c, 0xf243, 0xf44e, 0xc464,
+  0xf44d, 0xf44c, 0xf44b, 0xc463, 0xc465, 0xf5cd, 0xc4e2, 0xc4e1,
+  0xf6e1, 0xf6e0, 0xf6e3, 0xc5cb, 0xc575, 0xf7dd, 0xf6e2, 0xf7dc,
+  0xc5cd, 0xc5cc, 0xc5f3, 0xf8a9, 0xf8ef, 0xa4e4, 0xd972, 0xe9af,
+  0xa6ac, 0xcaf7, 0xa7f1, 0xa7ef, 0xa7f0, 0xccc1, 0xa9f1, 0xac46,
+  0xcee7, 0xcee8, 0xac47, 0xd1ce, 0xaec4, 0xaec5, 0xd1cd, 0xb1d3,
+  0xb1cf, 0xd5a7, 0xb1d6, 0xb1d5, 0xb1ce, 0xb1d1, 0xb1d4, 0xb1d0,
+  0xd976, 0xb1cd, 0xb4af, 0xb4b1, 0xb4b2, 0xd975, 0xd978, 0xb4b0,
+  0xd973, 0xd977, 0xd974, 0xb771, 0xddbc, 0xba56, 0xe1f4, 0xbee3,
+  0xbcc4, 0xe5bd, 0xbcc5, 0xbcc6, 0xe5bf, 0xe5be, 0xe5c0, 0xe9b1,
+  0xe9b0, 0xecef, 0xecee, 0xc0c4, 0xc0c5, 0xf248, 0xa4e5, 0xd979,
+  0xb4b4, 0xb4b3, 0xddbd, 0xefd8, 0xc4e3, 0xf7de, 0xa4e6, 0xaec6,
+  0xb1d8, 0xb1d7, 0xd97a, 0xd97b, 0xb772, 0xe1f5, 0xba57, 0xe9b2,
+  0xa4e7, 0xa5b8, 0xa9f2, 0xccc2, 0xcee9, 0xac48, 0xb1d9, 0xd97c,
+  0xb4b5, 0xb773, 0xe5c1, 0xe5c2, 0xecf0, 0xc25f, 0xf8f0, 0xa4e8,
+  0xccc3, 0xa9f3, 0xac49, 0xceea, 0xaec7, 0xd1d2, 0xd1d0, 0xd1d1,
+  0xaec8, 0xd1cf, 0xb1db, 0xb1dc, 0xd5a8, 0xb1dd, 0xb1da, 0xd97d,
+  0xd97e, 0xddbe, 0xba59, 0xba58, 0xecf1, 0xefd9, 0xf24a, 0xf249,
+  0xf44f, 0xc95e, 0xac4a, 0xa4e9, 0xa5b9, 0xa6ae, 0xa6ad, 0xa6af,
+  0xa6b0, 0xc9ee, 0xc9ed, 0xcaf8, 0xa7f2, 0xcafb, 0xcafa, 0xcaf9,
+  0xcafc, 0xa9f4, 0xccc9, 0xccc5, 0xccce, 0xa9fb, 0xa9f9, 0xccca,
+  0xccc6, 0xcccd, 0xa9f8, 0xaa40, 0xccc8, 0xccc4, 0xa9fe, 0xcccb,
+  0xa9f7, 0xcccc, 0xa9fa, 0xa9fc, 0xccd0, 0xcccf, 0xccc7, 0xa9f6,
+  0xa9f5, 0xa9fd, 0xceef, 0xcef5, 0xac50, 0xac4d, 0xceec, 0xcef1,
+  0xac53, 0xac4b, 0xcef0, 0xac4e, 0xac51, 0xcef3, 0xac4c, 0xcef8,
+  0xac4f, 0xac52, 0xceed, 0xcef2, 0xcef6, 0xceee, 0xceeb, 0xcef7,
+  0xcef4, 0xaed0, 0xaec9, 0xaecc, 0xaecf, 0xd1d5, 0xaeca, 0xd1d3,
+  0xaece, 0xaecb, 0xd1d6, 0xaecd, 0xd5ac, 0xb1df, 0xd5ab, 0xd5ad,
+  0xb1de, 0xb1e3, 0xd1d4, 0xd5aa, 0xd5ae, 0xb1e0, 0xd5a9, 0xb1e2,
+  0xb1e1, 0xd9a7, 0xd9a2, 0xb4b6, 0xb4ba, 0xb4b7, 0xd9a5, 0xd9a8,
+  0xb4b8, 0xb4b9, 0xb4be, 0xddc7, 0xd9a6, 0xb4bc, 0xd9a3, 0xd9a1,
+  0xb4bd, 0xd9a4, 0xb779, 0xddbf, 0xb776, 0xb777, 0xb775, 0xddc4,
+  0xddc3, 0xddc0, 0xb77b, 0xddc2, 0xb4bb, 0xddc6, 0xddc1, 0xb778,
+  0xb774, 0xb77a, 0xddc5, 0xba5c, 0xe1f8, 0xe1f7, 0xe1f6, 0xba5a,
+  0xba5b, 0xe5c5, 0xe5c8, 0xbcc8, 0xbcc7, 0xe5c9, 0xe5c4, 0xbcca,
+  0xe5c6, 0xbcc9, 0xe5c3, 0xe5c7, 0xbee9, 0xbee6, 0xe9bb, 0xe9ba,
+  0xe9b9, 0xe9b4, 0xe9b5, 0xbee7, 0xbee4, 0xbee8, 0xe9b3, 0xbee5,
+  0xe9b6, 0xe9b7, 0xe9bc, 0xe9b8, 0xecf2, 0xc0c7, 0xefdc, 0xc0c6,
+  0xefda, 0xefdb, 0xc260, 0xc36e, 0xf24b, 0xc36d, 0xf451, 0xf452,
+  0xc466, 0xf450, 0xc4e4, 0xf7df, 0xc5ce, 0xf8aa, 0xf8ab, 0xa4ea,
+  0xa6b1, 0xa6b2, 0xa7f3, 0xccd1, 0xac54, 0xaed1, 0xb1e4, 0xb0d2,
+  0xb4bf, 0xb4c0, 0xb3cc, 0xd9a9, 0xb77c, 0xe1fa, 0xe1f9, 0xa4eb,
+  0xa6b3, 0xccd2, 0xaa42, 0xaa41, 0xcef9, 0xcefa, 0xd1d7, 0xd1d8,
+  0xaed2, 0xaed3, 0xaed4, 0xd5af, 0xb1e6, 0xb4c2, 0xb4c1, 0xddc8,
+  0xdf7a, 0xe1fb, 0xe9bd, 0xc261, 0xc467, 0xa4ec, 0xa5bc, 0xa5bd,
+  0xa5bb, 0xa5be, 0xa5ba, 0xa6b6, 0xc9f6, 0xa6b5, 0xa6b7, 0xc9f1,
+  0xc9f0, 0xc9f3, 0xc9f2, 0xc9f5, 0xa6b4, 0xc9ef, 0xc9f4, 0xcafd,
+  0xa7fd, 0xcafe, 0xcb43, 0xa7fc, 0xcb47, 0xcb42, 0xcb45, 0xa7f5,
+  0xa7f6, 0xa7f7, 0xa7f8, 0xa840, 0xcb41, 0xa7fa, 0xa841, 0xcb40,
+  0xcb46, 0xa7f9, 0xcb44, 0xa7fb, 0xa7f4, 0xa7fe, 0xaa57, 0xccd4,
+  0xaa43, 0xaa4d, 0xaa4e, 0xaa46, 0xaa58, 0xaa48, 0xccdc, 0xaa53,
+  0xccd7, 0xaa49, 0xcce6, 0xcce7, 0xccdf, 0xccd8, 0xaa56, 0xcce4,
+  0xaa51, 0xaa4f, 0xcce5, 0xcce3, 0xccdb, 0xccd3, 0xccda, 0xaa4a,
+  0xaa50, 0xaa44, 0xccde, 0xccdd, 0xccd5, 0xaa52, 0xcce1, 0xccd6,
+  0xaa55, 0xcce8, 0xaa45, 0xaa4c, 0xccd9, 0xcce2, 0xaa54, 0xaa47,
+  0xaa4b, 0xcce0, 0xcf5b, 0xac5c, 0xac69, 0xcf56, 0xcf4c, 0xac62,
+  0xcf4a, 0xac5b, 0xcf45, 0xac65, 0xcf52, 0xcefe, 0xcf41, 0xcf44,
+  0xcefb, 0xcf51, 0xcf61, 0xac60, 0xcf46, 0xcf58, 0xcefd, 0xcf5f,
+  0xcf60, 0xcf63, 0xcf5a, 0xcf4b, 0xcf53, 0xac66, 0xac59, 0xac61,
+  0xac6d, 0xac56, 0xac58, 0xcf43, 0xac6a, 0xac63, 0xcf5d, 0xcf40,
+  0xac6c, 0xac67, 0xcf49, 0xac6b, 0xcf50, 0xcf48, 0xac64, 0xcf5c,
+  0xcf54, 0xac5e, 0xcf62, 0xcf47, 0xac5a, 0xcf59, 0xcf4f, 0xac5f,
+  0xcf55, 0xac57, 0xcefc, 0xac68, 0xaee3, 0xac5d, 0xcf4e, 0xcf4d,
+  0xcf42, 0xcf5e, 0xcf57, 0xac55, 0xd1ec, 0xaeea, 0xd1ed, 0xd1e1,
+  0xaedf, 0xaeeb, 0xd1da, 0xd1e3, 0xd1eb, 0xd1d9, 0xd1f4, 0xaed5,
+  0xd1f3, 0xd1ee, 0xd1ef, 0xaedd, 0xaee8, 0xd1e5, 0xd1e6, 0xd1f0,
+  0xd1e7, 0xd1e2, 0xd1dc, 0xd1dd, 0xd1ea, 0xd1e4, 0xaed6, 0xaeda,
+  0xd1f2, 0xd1de, 0xaee6, 0xaee2, 0xaee5, 0xaeec, 0xaedb, 0xaee7,
+  0xd1e9, 0xaee9, 0xaed8, 0xaed7, 0xd1db, 0xd1df, 0xaee0, 0xd1f1,
+  0xd1e8, 0xd1e0, 0xaee4, 0xaee1, 0xaed9, 0xaedc, 0xd5c4, 0xd5b4,
+  0xd5b5, 0xd5b9, 0xd5c8, 0xd5c5, 0xd5be, 0xd5bd, 0xb1ed, 0xd5c1,
+  0xd5d0, 0xd5b0, 0xd5d1, 0xd5c3, 0xd5d5, 0xd5c9, 0xb1ec, 0xd5c7,
+  0xb1e7, 0xb1fc, 0xb1f2, 0xb1f6, 0xb1f5, 0xd5b1, 0xd5ce, 0xd5d4,
+  0xd5cc, 0xd5d3, 0xd5c0, 0xd5b2, 0xd5d2, 0xd5c2, 0xb1ea, 0xb1f7,
+  0xd5cb, 0xb1f0, 0xd5ca, 0xd5b3, 0xb1f8, 0xb1fa, 0xd5cd, 0xb1fb,
+  0xb1e9, 0xd5ba, 0xd5cf, 0xb1ef, 0xb1f9, 0xd5bc, 0xd5c6, 0xd5b7,
+  0xd5bb, 0xb1f4, 0xd5b6, 0xb1e8, 0xb1f1, 0xb1ee, 0xd5bf, 0xaede,
+  0xd9c0, 0xb1eb, 0xb1f3, 0xd9c3, 0xd9d9, 0xd9ce, 0xb4d6, 0xb4d1,
+  0xd9bd, 0xb4d2, 0xd9cd, 0xd9c6, 0xd9d3, 0xb4ce, 0xd9ab, 0xd9d5,
+  0xb4c4, 0xd9b3, 0xb4c7, 0xb4c6, 0xb4d7, 0xd9ad, 0xd9cf, 0xd9d0,
+  0xb4c9, 0xb4c5, 0xd9bb, 0xb4d0, 0xd9b6, 0xd9d1, 0xb4cc, 0xd9c9,
+  0xd9d6, 0xd9b0, 0xd9b5, 0xd9af, 0xb4cb, 0xd9c2, 0xddde, 0xd9b1,
+  0xb4cf, 0xd9ba, 0xd9d2, 0xb4ca, 0xd9b7, 0xd9b4, 0xd9c5, 0xb4cd,
+  0xb4c3, 0xb4d9, 0xd9c8, 0xd9c7, 0xd9ac, 0xb4c8, 0xd9d4, 0xd9bc,
+  0xd9be, 0xd9cb, 0xd9ca, 0xd9aa, 0xb4d3, 0xb4d5, 0xd9b2, 0xd9b9,
+  0xd9c1, 0xb4d4, 0xd9b8, 0xd9c4, 0xd9d7, 0xd9cc, 0xd9d8, 0xd9ae,
+  0xddf2, 0xb7a6, 0xddf0, 0xdddb, 0xdde0, 0xddd9, 0xddec, 0xddcb,
+  0xddd2, 0xddea, 0xddf4, 0xdddc, 0xddcf, 0xdde2, 0xdde7, 0xddd3,
+  0xdde4, 0xddd0, 0xddd7, 0xddd8, 0xb7a8, 0xddeb, 0xdde9, 0xddcc,
+  0xddee, 0xddef, 0xddf1, 0xb7ac, 0xb7a4, 0xd5b8, 0xddd4, 0xdde6,
+  0xddd5, 0xb7a1, 0xb7b1, 0xdded, 0xb7af, 0xb7ab, 0xddca, 0xb7a3,
+  0xddcd, 0xb7b0, 0xdddd, 0xddc9, 0xb7a9, 0xdde1, 0xddd1, 0xb7aa,
+  0xddda, 0xb77e, 0xb4d8, 0xdde3, 0xd9bf, 0xddce, 0xdde8, 0xb7a5,
+  0xdde5, 0xb7a2, 0xdddf, 0xb7ad, 0xddd6, 0xddf3, 0xb7a7, 0xdec6,
+  0xb7ae, 0xe24a, 0xe248, 0xe25e, 0xe246, 0xe258, 0xb77d, 0xba5f,
+  0xe242, 0xe25d, 0xe247, 0xe255, 0xba64, 0xba5d, 0xe25b, 0xe240,
+  0xe25a, 0xba6f, 0xe251, 0xe261, 0xba6d, 0xe249, 0xba5e, 0xe24b,
+  0xe259, 0xba67, 0xe244, 0xba6b, 0xba61, 0xe24d, 0xe243, 0xe1fc,
+  0xe257, 0xba68, 0xe260, 0xe1fd, 0xba65, 0xe253, 0xba66, 0xe245,
+  0xe250, 0xe24c, 0xe24e, 0xba60, 0xe25f, 0xba6e, 0xe24f, 0xe262,
+  0xe1fe, 0xe254, 0xba63, 0xba6c, 0xba6a, 0xe241, 0xe256, 0xba69,
+  0xba62, 0xe252, 0xe25c, 0xe5d5, 0xe5d1, 0xe5cd, 0xe5e1, 0xe5de,
+  0xbccd, 0xe5e5, 0xe5d4, 0xbcd8, 0xe5db, 0xe5d0, 0xe5da, 0xbcd5,
+  0xe5ee, 0xe5eb, 0xe5dd, 0xe5ce, 0xe5e2, 0xe5e4, 0xbcd1, 0xe5d8,
+  0xe5d3, 0xe5ca, 0xbcce, 0xbcd6, 0xe5e7, 0xbcd7, 0xe5cb, 0xe5ed,
+  0xe5e0, 0xe5e6, 0xbcd4, 0xe5e3, 0xe5ea, 0xbcd9, 0xbcd3, 0xe5dc,
+  0xe5cf, 0xe5ef, 0xe5cc, 0xe5e8, 0xbcd0, 0xe5d6, 0xe5d7, 0xbccf,
+  0xbccc, 0xe5d2, 0xbcd2, 0xbccb, 0xe5e9, 0xe5ec, 0xe5d9, 0xe9ca,
+  0xe9c2, 0xe9be, 0xbef6, 0xbeeb, 0xbef0, 0xbeec, 0xe9cc, 0xe9d7,
+  0xbeea, 0xe9c4, 0xe9cd, 0xe5df, 0xe9ce, 0xbef1, 0xe9dd, 0xbef5,
+  0xbef8, 0xe9c0, 0xbef4, 0xe9db, 0xe9dc, 0xe9d2, 0xe9d1, 0xe9c9,
+  0xe9d3, 0xe9da, 0xe9d9, 0xbeef, 0xbeed, 0xe9cb, 0xe9c8, 0xe9c5,
+  0xe9d8, 0xbef7, 0xe9d6, 0xbef3, 0xbef2, 0xe9d0, 0xe9bf, 0xe9c1,
+  0xe9c3, 0xe9d5, 0xe9cf, 0xbeee, 0xe9c6, 0xe9d4, 0xe9c7, 0xc0cf,
+  0xed45, 0xc0c8, 0xecf5, 0xed41, 0xc0ca, 0xed48, 0xecfc, 0xecf7,
+  0xed49, 0xecf3, 0xecfe, 0xc0d1, 0xed44, 0xed4a, 0xecfd, 0xc0c9,
+  0xed40, 0xecf4, 0xc0d0, 0xed47, 0xecf9, 0xc0cc, 0xecfb, 0xecf8,
+  0xc0d2, 0xecfa, 0xc0cb, 0xc0ce, 0xed43, 0xecf6, 0xed46, 0xed42,
+  0xc263, 0xefe7, 0xc268, 0xc269, 0xc262, 0xefe6, 0xefe3, 0xefe4,
+  0xc266, 0xefde, 0xefe2, 0xc265, 0xefdf, 0xc267, 0xc264, 0xefdd,
+  0xefe1, 0xefe5, 0xf251, 0xf24e, 0xf257, 0xf256, 0xf254, 0xf24f,
+  0xc372, 0xf250, 0xc371, 0xc0cd, 0xf253, 0xc370, 0xf258, 0xf252,
+  0xf24d, 0xefe0, 0xc36f, 0xf24c, 0xf456, 0xf455, 0xf255, 0xc468,
+  0xf459, 0xf45a, 0xf454, 0xf458, 0xf453, 0xf5d1, 0xf457, 0xc4e7,
+  0xc4e5, 0xf5cf, 0xf5d2, 0xf5ce, 0xf5d0, 0xc4e6, 0xf6e5, 0xf6e6,
+  0xc576, 0xf6e4, 0xf7e2, 0xc5cf, 0xf7e0, 0xf7e1, 0xf8ac, 0xc656,
+  0xf8f3, 0xf8f1, 0xf8f2, 0xf8f4, 0xf9bb, 0xa4ed, 0xa6b8, 0xaa59,
+  0xcce9, 0xcf64, 0xd1f5, 0xd1f7, 0xd1f6, 0xd1f8, 0xb1fd, 0xd5d7,
+  0xd1f9, 0xd5d6, 0xd5d8, 0xd5d9, 0xd9da, 0xb4db, 0xd9db, 0xd9dd,
+  0xb4dc, 0xb4da, 0xd9dc, 0xddfa, 0xddf8, 0xddf7, 0xddf6, 0xddf5,
+  0xb7b2, 0xddf9, 0xba70, 0xe263, 0xe265, 0xba71, 0xe264, 0xbcdb,
+  0xbcda, 0xe5f0, 0xe9df, 0xe9de, 0xe9e0, 0xbef9, 0xed4b, 0xc0d3,
+  0xefe8, 0xc26a, 0xf259, 0xc577, 0xa4ee, 0xa5bf, 0xa6b9, 0xa842,
+  0xaa5a, 0xaa5b, 0xac6e, 0xd1fa, 0xb7b3, 0xe6d1, 0xbefa, 0xc26b,
+  0xa4ef, 0xa6ba, 0xcceb, 0xaa5c, 0xccea, 0xcf65, 0xac6f, 0xcf66,
+  0xac70, 0xd1fc, 0xaeee, 0xaeed, 0xd5de, 0xd5dc, 0xd5dd, 0xd5db,
+  0xd5da, 0xd9de, 0xd9e1, 0xb4de, 0xd9df, 0xb4dd, 0xd9e0, 0xddfb,
+  0xe266, 0xe267, 0xe268, 0xe5f3, 0xe5f2, 0xbcdc, 0xe5f1, 0xe5f4,
+  0xe9e1, 0xe9e2, 0xe9e3, 0xed4c, 0xc0d4, 0xc26c, 0xf25a, 0xc4e8,
+  0xc95f, 0xac71, 0xcf67, 0xaeef, 0xb1fe, 0xb4df, 0xd9e2, 0xb7b5,
+  0xb7b4, 0xe269, 0xe26a, 0xbcdd, 0xbcde, 0xe9e5, 0xe9e4, 0xefe9,
+  0xf7e3, 0xa4f0, 0xc960, 0xa5c0, 0xa843, 0xcb48, 0xac72, 0xb7b6,
+  0xa4f1, 0xcf68, 0xac73, 0xcf69, 0xc0d5, 0xa4f2, 0xccec, 0xcf6a,
+  0xd242, 0xd241, 0xd1fe, 0xd1fd, 0xd243, 0xd240, 0xb240, 0xb241,
+  0xb4e0, 0xd9e3, 0xd9e4, 0xd9e5, 0xde41, 0xde42, 0xde40, 0xddfd,
+  0xddfe, 0xb7b7, 0xe26b, 0xe5f7, 0xe5f6, 0xe5f5, 0xe5f8, 0xe9e7,
+  0xe9e6, 0xbefb, 0xe9e8, 0xc0d6, 0xed4d, 0xefea, 0xf25b, 0xf6e7,
+  0xa4f3, 0xa5c2, 0xa5c1, 0xaa5d, 0xc961, 0xc97e, 0xa6bb, 0xc9f7,
+  0xcb49, 0xcb4a, 0xaa5e, 0xcced, 0xac74, 0xcf6b, 0xcf6c, 0xaef0,
+  0xaef4, 0xd244, 0xaef3, 0xaef1, 0xaef2, 0xd5df, 0xb242, 0xb4e3,
+  0xb4e1, 0xb4e2, 0xd9e6, 0xba72, 0xa4f4, 0xc9a1, 0xa5c3, 0xc9a4,
+  0xa5c6, 0xc9a3, 0xa5c5, 0xa5c4, 0xa844, 0xc9a2, 0xc9f8, 0xc9fc,
+  0xc9fe, 0xca40, 0xa6c5, 0xa6c6, 0xc9fb, 0xa6c1, 0xc9f9, 0xc9fd,
+  0xa6c2, 0xa6bd, 0xa6be, 0xa6c4, 0xc9fa, 0xa6bc, 0xa845, 0xa6bf,
+  0xa6c0, 0xa6c3, 0xcb5b, 0xcb59, 0xcb4c, 0xa851, 0xcb53, 0xa84c,
+  0xcb4d, 0xcb55, 0xcb52, 0xa84f, 0xcb51, 0xa856, 0xcb5a, 0xa858,
+  0xa85a, 0xcb4b, 0xa84d, 0xcb5c, 0xa854, 0xa857, 0xcd45, 0xa847,
+  0xa85e, 0xa855, 0xcb4e, 0xa84a, 0xa859, 0xcb56, 0xa848, 0xa849,
+  0xcd43, 0xcb4f, 0xa850, 0xa85b, 0xcb5d, 0xcb50, 0xa84e, 0xa853,
+  0xccee, 0xa85c, 0xcb57, 0xa852, 0xa85d, 0xa846, 0xcb54, 0xa84b,
+  0xcb58, 0xcd44, 0xaa6a, 0xaa7a, 0xccf5, 0xaa71, 0xcd4b, 0xaa62,
+  0xaa65, 0xcd42, 0xccf3, 0xccf7, 0xaa6d, 0xaa6f, 0xccfa, 0xaa76,
+  0xaa68, 0xaa66, 0xaa67, 0xaa75, 0xcd47, 0xaa70, 0xccf9, 0xccfb,
+  0xaa6e, 0xaa73, 0xccfc, 0xcd4a, 0xac75, 0xaa79, 0xaa63, 0xcd49,
+  0xcd4d, 0xccf8, 0xcd4f, 0xcd40, 0xaa6c, 0xccf4, 0xaa6b, 0xaa7d,
+  0xaa72, 0xccf2, 0xcf75, 0xaa78, 0xaa7c, 0xcd41, 0xcd46, 0xaa7e,
+  0xaa77, 0xaa69, 0xaa5f, 0xaa64, 0xccf6, 0xaa60, 0xcd4e, 0xccf0,
+  0xccef, 0xccfd, 0xccf1, 0xaa7b, 0xaef5, 0xaa74, 0xccfe, 0xaa61,
+  0xaca6, 0xcd4c, 0xcf7c, 0xcfa1, 0xcfa4, 0xcf77, 0xcfa7, 0xcfaa,
+  0xcfac, 0xcf74, 0xac76, 0xac7b, 0xd249, 0xacad, 0xcfa5, 0xcfad,
+  0xcf7b, 0xcf73, 0xd264, 0xac7e, 0xcfa2, 0xcf78, 0xcf7a, 0xaca5,
+  0xcf7d, 0xac7d, 0xcf70, 0xcfa8, 0xcfab, 0xac7a, 0xaca8, 0xcf6d,
+  0xacaa, 0xac78, 0xacae, 0xcfa9, 0xcf6f, 0xacab, 0xd25e, 0xcd48,
+  0xac7c, 0xac77, 0xcf76, 0xcf6e, 0xacac, 0xaca4, 0xcfa3, 0xaca9,
+  0xaca7, 0xcf79, 0xaca1, 0xcf71, 0xaca2, 0xaca3, 0xcf72, 0xcfa6,
+  0xac79, 0xcf7e, 0xd24c, 0xaefd, 0xaf43, 0xd255, 0xd25b, 0xd257,
+  0xd24a, 0xd24d, 0xd246, 0xd247, 0xaf4a, 0xaefa, 0xd256, 0xd25f,
+  0xaf45, 0xaef6, 0xaf40, 0xd24e, 0xaf42, 0xd24f, 0xd259, 0xaf44,
+  0xd268, 0xd248, 0xaefc, 0xaefb, 0xaf48, 0xd245, 0xd266, 0xd25a,
+  0xd267, 0xd261, 0xd253, 0xd262, 0xd25c, 0xd265, 0xd263, 0xaf49,
+  0xd254, 0xaef9, 0xaef8, 0xaf41, 0xaf47, 0xd260, 0xaf46, 0xd251,
+  0xb243, 0xd269, 0xd250, 0xd24b, 0xaefe, 0xaf4b, 0xaef7, 0xd258,
+  0xd25d, 0xb265, 0xd5e1, 0xd5e5, 0xb252, 0xb250, 0xb247, 0xd5e3,
+  0xd5e2, 0xb25b, 0xd5e8, 0xb255, 0xd5fa, 0xd647, 0xb244, 0xd5f7,
+  0xd5f0, 0xb267, 0xd5e0, 0xd5fc, 0xb264, 0xb258, 0xb263, 0xb24e,
+  0xd5ec, 0xd5fe, 0xd5f6, 0xb24f, 0xb249, 0xd645, 0xd5fd, 0xd640,
+  0xb251, 0xb259, 0xd642, 0xd5ea, 0xd5fb, 0xd5ef, 0xd644, 0xb25e,
+  0xb246, 0xb25c, 0xd5f4, 0xd5f2, 0xd5f3, 0xb253, 0xd5ee, 0xd5ed,
+  0xb248, 0xd5e7, 0xd646, 0xb24a, 0xd5f1, 0xb268, 0xb262, 0xd5e6,
+  0xb25f, 0xb25d, 0xb266, 0xd5f8, 0xb261, 0xd252, 0xd5f9, 0xb260,
+  0xd641, 0xb245, 0xd5f5, 0xb257, 0xd5e9, 0xb256, 0xb254, 0xb24c,
+  0xb24b, 0xd9e7, 0xd643, 0xd5eb, 0xd9fc, 0xb24d, 0xb541, 0xb25a,
+  0xb4ee, 0xd9f6, 0xb4fc, 0xd9ea, 0xb4eb, 0xb4e7, 0xda49, 0xb4ed,
+  0xb4f1, 0xb4ec, 0xb4f5, 0xda4d, 0xda44, 0xd9f1, 0xb4fa, 0xb4f4,
+  0xd9fd, 0xb4e4, 0xda4a, 0xda43, 0xb4e8, 0xd9f7, 0xb4f7, 0xda55,
+  0xda56, 0xb4e5, 0xda48, 0xb4f9, 0xd9fb, 0xd9ed, 0xd9ee, 0xb4fd,
+  0xd9f2, 0xd9f9, 0xd9f3, 0xb4fb, 0xb544, 0xd9ef, 0xd9e8, 0xd9e9,
+  0xd9eb, 0xb4ea, 0xd9f8, 0xb4f8, 0xb542, 0xd9fa, 0xda53, 0xda4b,
+  0xb4e6, 0xda51, 0xb4f2, 0xb4f0, 0xda57, 0xb4ef, 0xda41, 0xd9f4,
+  0xd9fe, 0xb547, 0xda45, 0xda42, 0xd9f0, 0xb543, 0xda4f, 0xda4c,
+  0xda54, 0xb4e9, 0xda40, 0xb546, 0xda47, 0xb4f3, 0xb4f6, 0xda46,
+  0xb545, 0xd9f5, 0xd5e4, 0xda50, 0xda4e, 0xda52, 0xd9ec, 0xb540,
+  0xde61, 0xde60, 0xde46, 0xb7bd, 0xde5f, 0xde49, 0xde4a, 0xb7c7,
+  0xde68, 0xb7c2, 0xde5e, 0xde43, 0xb7c8, 0xb7be, 0xde52, 0xde48,
+  0xde4b, 0xde63, 0xb7b8, 0xde6a, 0xde62, 0xb7c1, 0xde57, 0xb7cc,
+  0xb7cb, 0xb7c5, 0xde69, 0xb7b9, 0xde55, 0xde4c, 0xde59, 0xde65,
+  0xb7cd, 0xb7bb, 0xde54, 0xde4d, 0xb7c4, 0xb7c3, 0xde50, 0xde5a,
+  0xde64, 0xde47, 0xde51, 0xb7bc, 0xde5b, 0xb7c9, 0xb7c0, 0xde4e,
+  0xb7bf, 0xde45, 0xde53, 0xde67, 0xb4fe, 0xbab0, 0xde56, 0xe26c,
+  0xde58, 0xde66, 0xb7c6, 0xde4f, 0xb7ba, 0xb7ca, 0xbcf0, 0xde44,
+  0xde5d, 0xde5c, 0xe2aa, 0xbaad, 0xe27d, 0xe2a4, 0xbaa2, 0xe26e,
+  0xbaaf, 0xba77, 0xe26d, 0xe2b0, 0xbab1, 0xe271, 0xe2a3, 0xe273,
+  0xe2b3, 0xe2af, 0xba75, 0xbaa1, 0xe653, 0xbaae, 0xba7d, 0xe26f,
+  0xe2ae, 0xbaa3, 0xe2ab, 0xe2b8, 0xe275, 0xe27e, 0xe2b6, 0xe2ac,
+  0xba7c, 0xe27c, 0xba76, 0xba74, 0xbaa8, 0xe27a, 0xe277, 0xe278,
+  0xe2b2, 0xe2b7, 0xe2b5, 0xba7a, 0xe2b9, 0xba7e, 0xbaa7, 0xe270,
+  0xe5fa, 0xe279, 0xba78, 0xbaac, 0xbaa9, 0xba7b, 0xe2a5, 0xe274,
+  0xbaaa, 0xe2a7, 0xbaa4, 0xbaa6, 0xba73, 0xe2a9, 0xe2a1, 0xe272,
+  0xbaa5, 0xe2b1, 0xe2b4, 0xe27b, 0xe2a8, 0xba79, 0xbcdf, 0xe2a6,
+  0xe5f9, 0xe2ad, 0xe276, 0xe644, 0xe64e, 0xbce2, 0xe64d, 0xe659,
+  0xbce4, 0xe64b, 0xe64f, 0xbcef, 0xe646, 0xbce7, 0xe652, 0xe9f0,
+  0xbcf3, 0xbcf2, 0xe654, 0xe643, 0xe65e, 0xbced, 0xbce3, 0xe657,
+  0xe65b, 0xe660, 0xe655, 0xe649, 0xbce6, 0xbce9, 0xbcf1, 0xbcec,
+  0xe64c, 0xe2a2, 0xe648, 0xe65f, 0xbce8, 0xbceb, 0xe661, 0xbce0,
+  0xe656, 0xe5fb, 0xe65c, 0xc0df, 0xe64a, 0xbce1, 0xe645, 0xbce5,
+  0xe5fc, 0xbaab, 0xe641, 0xe65a, 0xe642, 0xe640, 0xbcea, 0xe658,
+  0xe5fe, 0xe651, 0xe650, 0xe65d, 0xe647, 0xbcee, 0xe9f3, 0xbf49,
+  0xbefe, 0xea40, 0xe9eb, 0xbf41, 0xe9f7, 0xbf48, 0xbf43, 0xe9f5,
+  0xed4f, 0xe9fb, 0xea42, 0xe9fa, 0xe9e9, 0xe9f8, 0xea44, 0xea46,
+  0xbefd, 0xea45, 0xbf44, 0xbf4a, 0xbf47, 0xe9fe, 0xbf46, 0xe9f9,
+  0xe9ed, 0xe9f2, 0xe9fd, 0xbf45, 0xbf42, 0xbefc, 0xbf40, 0xe9f1,
+  0xe5fd, 0xe9ec, 0xe9ef, 0xea41, 0xe9f4, 0xe9ea, 0xed4e, 0xea43,
+  0xe9ee, 0xe9fc, 0xed51, 0xc0e3, 0xc0d7, 0xc0db, 0xed53, 0xed59,
+  0xed57, 0xc0d9, 0xc0da, 0xc0e1, 0xed5a, 0xed52, 0xc0dc, 0xed56,
+  0xed55, 0xed5b, 0xc0e2, 0xc0dd, 0xc0e0, 0xed54, 0xc0e4, 0xc0de,
+  0xc0e5, 0xc0d8, 0xed58, 0xed50, 0xeff7, 0xc271, 0xeff4, 0xeff6,
+  0xc26f, 0xeff2, 0xeff3, 0xefee, 0xe9f6, 0xefef, 0xc270, 0xefeb,
+  0xc26d, 0xeff8, 0xc26e, 0xefec, 0xefed, 0xeff1, 0xc273, 0xc272,
+  0xeff0, 0xc378, 0xf25f, 0xf265, 0xc379, 0xf25c, 0xc376, 0xc373,
+  0xf267, 0xc377, 0xc374, 0xf25e, 0xf261, 0xf262, 0xf263, 0xf266,
+  0xeff5, 0xf25d, 0xc375, 0xf264, 0xf268, 0xf260, 0xf45d, 0xc46a,
+  0xf460, 0xc46b, 0xf468, 0xf45f, 0xf45c, 0xf45e, 0xf462, 0xf465,
+  0xf464, 0xf467, 0xf45b, 0xc469, 0xf463, 0xf466, 0xf469, 0xf461,
+  0xf5d3, 0xf5d4, 0xf5d8, 0xf5d9, 0xf5d6, 0xf5d7, 0xf5d5, 0xc4e9,
+  0xc578, 0xf6eb, 0xf6e8, 0xf6e9, 0xf6ea, 0xc579, 0xf7e5, 0xf7e4,
+  0xf8af, 0xc5f4, 0xf8ad, 0xf8b0, 0xf8ae, 0xf8f5, 0xc657, 0xc665,
+  0xf9a3, 0xf96c, 0xf9a2, 0xf9d0, 0xf9d1, 0xa4f5, 0xa6c7, 0xca41,
+  0xcb5e, 0xa85f, 0xa862, 0xcb5f, 0xa860, 0xa861, 0xcd58, 0xcd5a,
+  0xcd55, 0xcd52, 0xcd54, 0xaaa4, 0xaaa2, 0xcd56, 0xaaa3, 0xcd53,
+  0xcd50, 0xaaa1, 0xcd57, 0xcd51, 0xaaa5, 0xcd59, 0xcfaf, 0xcfb3,
+  0xacb7, 0xcfb6, 0xacaf, 0xacb2, 0xacb4, 0xacb6, 0xacb3, 0xcfb2,
+  0xcfb1, 0xacb1, 0xcfb4, 0xcfb5, 0xcfae, 0xacb5, 0xacb0, 0xcfb0,
+  0xd277, 0xd278, 0xd279, 0xaf50, 0xaf4c, 0xd26e, 0xd276, 0xd27b,
+  0xaf51, 0xd26c, 0xd272, 0xd26b, 0xd275, 0xd271, 0xaf4d, 0xaf4f,
+  0xd27a, 0xd26a, 0xd26d, 0xd273, 0xd274, 0xd27c, 0xd270, 0xaf4e,
+  0xb26d, 0xd64e, 0xd650, 0xd64c, 0xd658, 0xd64a, 0xd657, 0xb269,
+  0xd648, 0xda5b, 0xd652, 0xb26c, 0xd653, 0xd656, 0xd65a, 0xd64f,
+  0xd654, 0xb26a, 0xb26b, 0xd659, 0xd64d, 0xd649, 0xd65b, 0xd651,
+  0xd655, 0xd64b, 0xb548, 0xb549, 0xda65, 0xb54f, 0xda59, 0xda62,
+  0xda58, 0xb54c, 0xda60, 0xda5e, 0xda5f, 0xb54a, 0xda63, 0xda5c,
+  0xda5a, 0xb54b, 0xda5d, 0xda61, 0xb54d, 0xda64, 0xde70, 0xde77,
+  0xde79, 0xdea1, 0xb7da, 0xde6b, 0xb7d2, 0xde7a, 0xb7d7, 0xdea2,
+  0xb7ce, 0xde7d, 0xde6d, 0xde7e, 0xde6c, 0xb7dc, 0xde78, 0xb7cf,
+  0xdea3, 0xb7d4, 0xde71, 0xb7d9, 0xde7c, 0xde6f, 0xde76, 0xde72,
+  0xde6e, 0xb7d1, 0xb7d8, 0xb7d6, 0xb7d3, 0xb7db, 0xb7d0, 0xde75,
+  0xb7d5, 0xb54e, 0xde7b, 0xde73, 0xde74, 0xe2c1, 0xbab4, 0xe2bd,
+  0xe2c3, 0xe2bf, 0xbab6, 0xe2be, 0xe2c2, 0xe2ba, 0xe2bc, 0xbab5,
+  0xe2c0, 0xe2bb, 0xbab7, 0xbab2, 0xe2c4, 0xbab3, 0xe667, 0xe664,
+  0xe670, 0xe66a, 0xe66c, 0xbcf4, 0xe666, 0xe66e, 0xe66d, 0xe66b,
+  0xe671, 0xbcf7, 0xe668, 0xe66f, 0xbcf5, 0xe663, 0xe665, 0xbcf6,
+  0xe662, 0xe672, 0xe669, 0xea4a, 0xbf51, 0xea55, 0xea53, 0xbf4b,
+  0xea49, 0xea4c, 0xea4d, 0xea48, 0xbf55, 0xbf56, 0xea47, 0xea56,
+  0xea51, 0xbf4f, 0xbf4c, 0xea50, 0xea4e, 0xbf52, 0xea52, 0xbf4d,
+  0xbf4e, 0xea4f, 0xbf50, 0xea4b, 0xea54, 0xbf53, 0xea57, 0xea58,
+  0xbf54, 0xc0e7, 0xc0ee, 0xed5c, 0xed62, 0xed60, 0xc0ea, 0xc0e9,
+  0xc0e6, 0xed5e, 0xc0ec, 0xc0eb, 0xc0e8, 0xed61, 0xed5d, 0xed5f,
+  0xc0ed, 0xc277, 0xeffb, 0xc274, 0xc275, 0xeffd, 0xc276, 0xeffa,
+  0xeff9, 0xf26c, 0xeffc, 0xf26d, 0xc37a, 0xf26b, 0xf26a, 0xf269,
+  0xc37b, 0xc46c, 0xf46a, 0xf46b, 0xf5dc, 0xf5db, 0xc4ea, 0xf5da,
+  0xf6ec, 0xf6ed, 0xf7e6, 0xf8b1, 0xf8f6, 0xf9bc, 0xc679, 0xf9c6,
+  0xa4f6, 0xaaa6, 0xaaa7, 0xacb8, 0xc0ef, 0xa4f7, 0xaaa8, 0xaf52,
+  0xb7dd, 0xa4f8, 0xb26e, 0xbab8, 0xc962, 0xcfb7, 0xd27d, 0xe2c5,
+  0xc0f0, 0xa4f9, 0xaaa9, 0xcfb8, 0xcfb9, 0xda66, 0xb550, 0xdea4,
+  0xb7de, 0xe2c6, 0xbcf8, 0xc37c, 0xa4fa, 0xda67, 0xa4fb, 0xa6c9,
+  0xca42, 0xa6c8, 0xa865, 0xa864, 0xa863, 0xcb60, 0xaaaa, 0xaaab,
+  0xcd5b, 0xcfba, 0xcfbd, 0xacba, 0xcfbb, 0xacb9, 0xcfbc, 0xacbb,
+  0xd2a2, 0xd2a1, 0xd27e, 0xaf53, 0xd65d, 0xd65e, 0xb26f, 0xd65c,
+  0xd65f, 0xb552, 0xb270, 0xb551, 0xda6b, 0xda6a, 0xda68, 0xda69,
+  0xda6c, 0xdea6, 0xdea5, 0xdea9, 0xdea8, 0xdea7, 0xbab9, 0xe2c9,
+  0xe2c8, 0xbaba, 0xe2c7, 0xe673, 0xe674, 0xbcf9, 0xea59, 0xea5a,
+  0xf272, 0xc37d, 0xf271, 0xf270, 0xf26e, 0xf26f, 0xc4eb, 0xf46c,
+  0xf6ee, 0xf8f7, 0xa4fc, 0xc9a5, 0xa5c7, 0xc9a6, 0xca43, 0xca44,
+  0xcb66, 0xcb62, 0xcb61, 0xaaac, 0xcb65, 0xa867, 0xcb63, 0xa866,
+  0xcb67, 0xcb64, 0xcd5f, 0xcfbe, 0xcd5d, 0xcd64, 0xaaad, 0xaab0,
+  0xcd65, 0xcd61, 0xcd62, 0xcd5c, 0xaaaf, 0xcd5e, 0xaaae, 0xcd63,
+  0xcd60, 0xcfc2, 0xacbd, 0xacbe, 0xcfc5, 0xcfbf, 0xcfc4, 0xcfc0,
+  0xacbc, 0xcfc3, 0xcfc1, 0xd2a8, 0xd2a5, 0xd2a7, 0xaf58, 0xaf57,
+  0xaf55, 0xd2a4, 0xd2a9, 0xaf54, 0xaf56, 0xd2a6, 0xd667, 0xd2a3,
+  0xd2aa, 0xd662, 0xd666, 0xd665, 0xda6e, 0xda79, 0xd668, 0xd663,
+  0xda6d, 0xb274, 0xb273, 0xd661, 0xd664, 0xb275, 0xb272, 0xb271,
+  0xd660, 0xd669, 0xda70, 0xda77, 0xb554, 0xda76, 0xda73, 0xb556,
+  0xda75, 0xda6f, 0xda71, 0xda74, 0xda72, 0xb555, 0xda78, 0xb553,
+  0xb7df, 0xdead, 0xdeac, 0xdeaa, 0xb7e2, 0xb7e1, 0xdeae, 0xdeab,
+  0xe2ca, 0xbabb, 0xb7e0, 0xdeb0, 0xdeaf, 0xe2cd, 0xe2cb, 0xbcfa,
+  0xbabc, 0xe2cc, 0xe676, 0xbcfb, 0xe675, 0xe67e, 0xe67d, 0xe67b,
+  0xe67a, 0xe677, 0xe678, 0xe679, 0xe67c, 0xe6a1, 0xea5f, 0xea5c,
+  0xea5d, 0xbf57, 0xea5b, 0xea61, 0xea60, 0xea5e, 0xed64, 0xed65,
+  0xc0f1, 0xc0f2, 0xed63, 0xc279, 0xeffe, 0xc278, 0xc37e, 0xc3a1,
+  0xc46d, 0xf46e, 0xf46d, 0xf5dd, 0xf6ef, 0xc57a, 0xf7e8, 0xf7e7,
+  0xf7e9, 0xa5c8, 0xcfc6, 0xaf59, 0xb276, 0xd66a, 0xa5c9, 0xc9a7,
+  0xa4fd, 0xca45, 0xcb6c, 0xcb6a, 0xcb6b, 0xcb68, 0xa868, 0xcb69,
+  0xcd6d, 0xaab3, 0xcd6b, 0xcd67, 0xcd6a, 0xcd66, 0xaab5, 0xcd69,
+  0xaab2, 0xaab1, 0xaab4, 0xcd6c, 0xcd68, 0xacc2, 0xacc5, 0xcfce,
+  0xcfcd, 0xcfcc, 0xacbf, 0xcfd5, 0xcfcb, 0xacc1, 0xd2af, 0xcfd2,
+  0xcfd0, 0xacc4, 0xcfc8, 0xcfd3, 0xcfca, 0xcfd4, 0xcfd1, 0xcfc9,
+  0xacc0, 0xcfd6, 0xcfc7, 0xacc3, 0xd2b4, 0xd2ab, 0xd2b6, 0xd2ae,
+  0xd2b9, 0xd2ba, 0xd2ac, 0xd2b8, 0xd2b5, 0xd2b3, 0xd2b7, 0xaf5f,
+  0xaf5d, 0xd2b1, 0xd2ad, 0xd2b0, 0xd2bb, 0xd2b2, 0xaf5e, 0xcfcf,
+  0xaf5a, 0xaf5c, 0xd678, 0xd66d, 0xd66b, 0xd66c, 0xd673, 0xd674,
+  0xd670, 0xb27b, 0xd675, 0xd672, 0xd66f, 0xb279, 0xd66e, 0xb277,
+  0xb27a, 0xd671, 0xd679, 0xaf5b, 0xb278, 0xd677, 0xd676, 0xb27c,
+  0xda7e, 0xdaa1, 0xb560, 0xdaa7, 0xdaa9, 0xdaa2, 0xb55a, 0xdaa6,
+  0xdaa5, 0xb55b, 0xb561, 0xb562, 0xdaa8, 0xb558, 0xda7d, 0xda7b,
+  0xdaa3, 0xda7a, 0xb55f, 0xda7c, 0xdaa4, 0xdaaa, 0xb559, 0xb55e,
+  0xb55c, 0xb55d, 0xb557, 0xb7e9, 0xdeb7, 0xb7e8, 0xdebb, 0xdeb1,
+  0xdebc, 0xdeb2, 0xdeb3, 0xdebd, 0xdeba, 0xdeb8, 0xdeb9, 0xdeb5,
+  0xdeb4, 0xdebe, 0xb7e5, 0xdeb6, 0xb7ea, 0xb7e4, 0xb7eb, 0xb7ec,
+  0xb7e7, 0xb7e6, 0xe2ce, 0xbabe, 0xbabd, 0xe2d3, 0xbcfc, 0xbabf,
+  0xbac1, 0xe2d4, 0xb7e3, 0xbac0, 0xe2d0, 0xe2d2, 0xe2cf, 0xe2d1,
+  0xe6ab, 0xe6aa, 0xe6a7, 0xbd40, 0xea62, 0xbd41, 0xe6a6, 0xbcfe,
+  0xe6a8, 0xe6a5, 0xe6a2, 0xe6a9, 0xe6a3, 0xe6a4, 0xbcfd, 0xed69,
+  0xea66, 0xea65, 0xea67, 0xed66, 0xbf5a, 0xea63, 0xbf58, 0xbf5c,
+  0xbf5b, 0xea64, 0xea68, 0xbf59, 0xed6d, 0xc0f5, 0xc27a, 0xc0f6,
+  0xc0f3, 0xed6a, 0xed68, 0xed6b, 0xed6e, 0xc0f4, 0xed6c, 0xed67,
+  0xf042, 0xf045, 0xf275, 0xf040, 0xf46f, 0xf046, 0xc3a2, 0xf044,
+  0xc27b, 0xf041, 0xf043, 0xf047, 0xf276, 0xf274, 0xc3a3, 0xf273,
+  0xc46e, 0xc4ed, 0xf6f1, 0xc4ec, 0xf6f3, 0xf6f0, 0xf6f2, 0xc5d0,
+  0xf8b2, 0xa5ca, 0xcd6e, 0xd2bc, 0xd2bd, 0xb27d, 0xdebf, 0xbf5d,
+  0xc3a4, 0xc57b, 0xf8b3, 0xa5cb, 0xcd6f, 0xa260, 0xcfd7, 0xcfd8,
+  0xd2be, 0xd2bf, 0xb27e, 0xb2a1, 0xdaab, 0xdec2, 0xdec1, 0xdec0,
+  0xe2d5, 0xe2d6, 0xe2d7, 0xbac2, 0xe6ad, 0xe6ac, 0xea69, 0xbf5e,
+  0xbf5f, 0xed72, 0xed6f, 0xed70, 0xed71, 0xf049, 0xf048, 0xc27c,
+  0xf277, 0xf5de, 0xa5cc, 0xacc6, 0xb2a2, 0xdec3, 0xa5cd, 0xd2c0,
+  0xb2a3, 0xb563, 0xb564, 0xa5ce, 0xa5cf, 0xca46, 0xa86a, 0xa869,
+  0xacc7, 0xcfd9, 0xdaac, 0xa5d0, 0xa5d1, 0xa5d2, 0xa5d3, 0xa86b,
+  0xa86c, 0xcb6e, 0xcb6d, 0xaab6, 0xcd72, 0xcd70, 0xcd71, 0xcfda,
+  0xcfdb, 0xaccb, 0xacc9, 0xacca, 0xacc8, 0xaf60, 0xaf64, 0xaf63,
+  0xd2c1, 0xaf62, 0xaf61, 0xd2c2, 0xb2a6, 0xd67b, 0xd67a, 0xb2a4,
+  0xb2a5, 0xb566, 0xb565, 0xdaae, 0xdaad, 0xb2a7, 0xb7ed, 0xdec5,
+  0xb7ee, 0xdec4, 0xe2d8, 0xe6ae, 0xbd42, 0xea6a, 0xed73, 0xc3a6,
+  0xc3a5, 0xc57c, 0xa5d4, 0xcd73, 0xb2a8, 0xe2d9, 0xbac3, 0xcb6f,
+  0xcb70, 0xcd74, 0xaab8, 0xaab9, 0xaab7, 0xaccf, 0xacd0, 0xaccd,
+  0xacce, 0xcfdc, 0xcfdd, 0xaccc, 0xd2c3, 0xaf68, 0xaf69, 0xb2ab,
+  0xd2c9, 0xaf6e, 0xaf6c, 0xd2ca, 0xd2c5, 0xaf6b, 0xaf6a, 0xaf65,
+  0xd2c8, 0xd2c7, 0xd2c4, 0xaf6d, 0xd2c6, 0xaf66, 0xaf67, 0xb2ac,
+  0xd6a1, 0xd6a2, 0xb2ad, 0xd67c, 0xd67e, 0xd6a4, 0xd6a3, 0xd67d,
+  0xb2a9, 0xb2aa, 0xdab6, 0xb56b, 0xb56a, 0xdab0, 0xb568, 0xdab3,
+  0xb56c, 0xdab4, 0xb56d, 0xdab1, 0xb567, 0xb569, 0xdab5, 0xdab2,
+  0xdaaf, 0xded2, 0xdec7, 0xb7f0, 0xb7f3, 0xb7f2, 0xb7f7, 0xb7f6,
+  0xded3, 0xded1, 0xdeca, 0xdece, 0xdecd, 0xb7f4, 0xded0, 0xdecc,
+  0xded4, 0xdecb, 0xb7f5, 0xb7ef, 0xb7f1, 0xdec9, 0xe2db, 0xbac7,
+  0xe2df, 0xbac6, 0xe2dc, 0xbac5, 0xdec8, 0xdecf, 0xe2de, 0xbac8,
+  0xe2e0, 0xe2dd, 0xe2da, 0xe6b1, 0xe6b5, 0xe6b7, 0xe6b3, 0xe6b2,
+  0xe6b0, 0xbd45, 0xbd43, 0xbd48, 0xbd49, 0xe6b4, 0xbd46, 0xe6af,
+  0xbd47, 0xbac4, 0xe6b6, 0xbd44, 0xea6c, 0xea6b, 0xea73, 0xea6d,
+  0xea72, 0xea6f, 0xbf60, 0xea71, 0xbf61, 0xbf62, 0xea70, 0xea6e,
+  0xc0f8, 0xed74, 0xc0f7, 0xed77, 0xed75, 0xed76, 0xc0f9, 0xf04d,
+  0xc2a1, 0xf04e, 0xc27d, 0xf04f, 0xc27e, 0xf04c, 0xf050, 0xf04a,
+  0xc3a7, 0xf278, 0xc3a8, 0xc46f, 0xf04b, 0xc470, 0xc4ee, 0xf5df,
+  0xc57e, 0xf6f4, 0xc57d, 0xf7ea, 0xc5f5, 0xc5f6, 0xf9cc, 0xacd1,
+  0xcfde, 0xb56e, 0xb56f, 0xa5d5, 0xa6ca, 0xca47, 0xcb71, 0xa86d,
+  0xaaba, 0xacd2, 0xacd3, 0xacd4, 0xd6a6, 0xd2cb, 0xaf6f, 0xb2ae,
+  0xd6a5, 0xdab8, 0xb571, 0xdab7, 0xb570, 0xded5, 0xbd4a, 0xe6bb,
+  0xe6b8, 0xe6b9, 0xe6ba, 0xed78, 0xf051, 0xf471, 0xf470, 0xf6f5,
+  0xa5d6, 0xcd75, 0xaf70, 0xb572, 0xded6, 0xe2e1, 0xbd4b, 0xea74,
+  0xf052, 0xf472, 0xa5d7, 0xaabb, 0xacd7, 0xcfdf, 0xacd8, 0xacd6,
+  0xacd5, 0xd2cc, 0xaf71, 0xaf72, 0xaf73, 0xb2b0, 0xd6a7, 0xb2af,
+  0xdab9, 0xb2b1, 0xb573, 0xded7, 0xb7f8, 0xb7f9, 0xbac9, 0xbaca,
+  0xbd4c, 0xbf64, 0xea75, 0xbf63, 0xed79, 0xc0fa, 0xf053, 0xf473,
+  0xa5d8, 0xa86e, 0xcd78, 0xcd77, 0xaabc, 0xcd76, 0xaabd, 0xcd79,
+  0xcfe5, 0xacdb, 0xacda, 0xcfe7, 0xcfe6, 0xacdf, 0xacde, 0xacd9,
+  0xcfe1, 0xcfe2, 0xcfe3, 0xace0, 0xcfe0, 0xacdc, 0xcfe4, 0xacdd,
+  0xd2cf, 0xd2d3, 0xd2d1, 0xd2d0, 0xd2d4, 0xd2d5, 0xd2d6, 0xd2ce,
+  0xd2cd, 0xaf75, 0xaf76, 0xd2d7, 0xd2d2, 0xd6b0, 0xd2d8, 0xaf77,
+  0xaf74, 0xd6aa, 0xd6a9, 0xd6ab, 0xd6ac, 0xd6ae, 0xd6ad, 0xd6b2,
+  0xb2b5, 0xb2b2, 0xb2b6, 0xd6a8, 0xb2b7, 0xd6b1, 0xb2b4, 0xd6af,
+  0xb2b3, 0xdabc, 0xdabe, 0xdaba, 0xdabb, 0xdabf, 0xdac1, 0xdac2,
+  0xdabd, 0xdac0, 0xb574, 0xdedb, 0xdee0, 0xded8, 0xdedc, 0xdee1,
+  0xdedd, 0xb7fa, 0xb843, 0xb7fd, 0xded9, 0xdeda, 0xbace, 0xb846,
+  0xb7fe, 0xb844, 0xb7fc, 0xdedf, 0xb845, 0xdede, 0xb841, 0xb7fb,
+  0xb842, 0xdee2, 0xe2e6, 0xe2e8, 0xb840, 0xe2e3, 0xbacc, 0xe2e9,
+  0xbacd, 0xe2e7, 0xe2e2, 0xe2e5, 0xe2ea, 0xbacb, 0xe2e4, 0xbd4e,
+  0xe6bf, 0xe6be, 0xbd51, 0xbd4f, 0xe6bc, 0xbd4d, 0xe6bd, 0xbd50,
+  0xea7d, 0xeaa1, 0xea7e, 0xea76, 0xea7a, 0xea79, 0xea77, 0xbf66,
+  0xbf67, 0xbf65, 0xea78, 0xea7b, 0xea7c, 0xbf68, 0xc140, 0xeda3,
+  0xc0fc, 0xed7b, 0xc0fe, 0xc141, 0xc0fd, 0xeda2, 0xed7c, 0xc0fb,
+  0xeda1, 0xed7a, 0xed7e, 0xed7d, 0xf055, 0xc2a4, 0xc2a5, 0xc2a2,
+  0xc2a3, 0xf054, 0xf27b, 0xc3a9, 0xf279, 0xf27a, 0xf474, 0xf477,
+  0xf475, 0xf476, 0xf5e0, 0xc4ef, 0xf7eb, 0xf8b4, 0xc5f7, 0xf8f8,
+  0xf8f9, 0xc666, 0xa5d9, 0xace1, 0xdac3, 0xdee3, 0xa5da, 0xa86f,
+  0xaabe, 0xcfe8, 0xcfe9, 0xaf78, 0xdac4, 0xb575, 0xb847, 0xc142,
+  0xeda4, 0xf27c, 0xf478, 0xa5db, 0xcda1, 0xcd7a, 0xcd7c, 0xcd7e,
+  0xcd7d, 0xcd7b, 0xaabf, 0xace2, 0xcff2, 0xcfed, 0xcfea, 0xcff1,
+  0xace4, 0xace5, 0xcff0, 0xcfef, 0xcfee, 0xcfeb, 0xcfec, 0xcff3,
+  0xace3, 0xaf7c, 0xafa4, 0xafa3, 0xd2e1, 0xd2db, 0xd2d9, 0xafa1,
+  0xd6b9, 0xaf7a, 0xd2de, 0xd2e2, 0xd2e4, 0xd2e0, 0xd2da, 0xafa2,
+  0xd2df, 0xd2dd, 0xaf79, 0xd2e5, 0xafa5, 0xd2e3, 0xaf7d, 0xd2dc,
+  0xaf7e, 0xaf7b, 0xb2b9, 0xd6ba, 0xd6b3, 0xd6b5, 0xd6b7, 0xd6b8,
+  0xd6b6, 0xb2ba, 0xd6bb, 0xd6b4, 0xdac8, 0xb576, 0xdad0, 0xdac5,
+  0xdad1, 0xdac6, 0xdac7, 0xdacf, 0xdace, 0xdacb, 0xb2b8, 0xb577,
+  0xdac9, 0xdacc, 0xb578, 0xdacd, 0xdaca, 0xdeee, 0xdef2, 0xb84e,
+  0xe2f0, 0xb851, 0xdef0, 0xdeed, 0xdee8, 0xdeea, 0xdeeb, 0xdee4,
+  0xb84d, 0xb84c, 0xb848, 0xdee7, 0xb84f, 0xb850, 0xdee6, 0xdee9,
+  0xdef1, 0xb84a, 0xb84b, 0xdeef, 0xdee5, 0xe2f2, 0xbad0, 0xe2f4,
+  0xdeec, 0xe2f6, 0xbad4, 0xe2f7, 0xe2f3, 0xbad1, 0xe2ef, 0xbad3,
+  0xe2ec, 0xe2f1, 0xe2f5, 0xe2ee, 0xb849, 0xe2eb, 0xbad2, 0xe2ed,
+  0xbd54, 0xe6c1, 0xbd58, 0xbd56, 0xbacf, 0xe6c8, 0xe6c9, 0xbd53,
+  0xe6c7, 0xe6ca, 0xbd55, 0xbd52, 0xe6c3, 0xe6c0, 0xe6c5, 0xe6c2,
+  0xbd59, 0xe6c4, 0xe6c6, 0xbd57, 0xbf6a, 0xeaa8, 0xeaa2, 0xeaa6,
+  0xeaac, 0xeaad, 0xeaa9, 0xeaaa, 0xeaa7, 0xeaa4, 0xbf6c, 0xbf69,
+  0xeaa3, 0xeaa5, 0xbf6b, 0xeaab, 0xc146, 0xedaa, 0xeda5, 0xc145,
+  0xc143, 0xedac, 0xc144, 0xeda8, 0xeda9, 0xeda6, 0xedad, 0xf056,
+  0xc147, 0xeda7, 0xedae, 0xedab, 0xf05a, 0xf057, 0xc2a6, 0xf05b,
+  0xf05d, 0xf05c, 0xf058, 0xf059, 0xf2a3, 0xc3aa, 0xf27e, 0xf2a2,
+  0xf27d, 0xf2a4, 0xf2a1, 0xf47a, 0xf47d, 0xf479, 0xc471, 0xf47b,
+  0xf47c, 0xf47e, 0xc472, 0xc474, 0xc473, 0xf5e1, 0xf5e3, 0xf5e2,
+  0xf6f6, 0xf8b5, 0xf8fa, 0xa5dc, 0xcb72, 0xaac0, 0xcda3, 0xaac1,
+  0xaac2, 0xcda2, 0xcff8, 0xcff7, 0xace6, 0xace9, 0xace8, 0xace7,
+  0xcff4, 0xcff6, 0xcff5, 0xd2e8, 0xafa7, 0xd2ec, 0xd2eb, 0xd2ea,
+  0xd2e6, 0xafa6, 0xafaa, 0xafad, 0xafae, 0xd2e7, 0xd2e9, 0xafac,
+  0xafab, 0xafa9, 0xafa8, 0xd6c2, 0xd6c0, 0xd6bc, 0xb2bb, 0xd6bd,
+  0xb2bc, 0xd6be, 0xd6bf, 0xd6c1, 0xb2bd, 0xdad5, 0xdad4, 0xdad3,
+  0xdad2, 0xdef6, 0xb852, 0xdef3, 0xdef5, 0xb853, 0xb854, 0xdef4,
+  0xe341, 0xe2f9, 0xe2fa, 0xbad7, 0xbad5, 0xbad6, 0xe343, 0xe342,
+  0xe2fe, 0xe2fd, 0xe2fc, 0xe2fb, 0xe340, 0xe2f8, 0xe6cb, 0xe6d0,
+  0xe6ce, 0xe6cd, 0xe6cc, 0xe6cf, 0xeaae, 0xbf6d, 0xc148, 0xedb0,
+  0xc149, 0xedaf, 0xf05f, 0xf05e, 0xc2a7, 0xf2a5, 0xc3ab, 0xf4a1,
+  0xc5a1, 0xf6f7, 0xf8b7, 0xf8b6, 0xc9a8, 0xacea, 0xaceb, 0xd6c3,
+  0xb856, 0xa5dd, 0xa872, 0xa871, 0xa870, 0xcda4, 0xaac4, 0xaac3,
+  0xacee, 0xcffa, 0xcffd, 0xcffb, 0xacec, 0xaced, 0xcff9, 0xcffc,
+  0xafb5, 0xd2f3, 0xd2f5, 0xd2f4, 0xafb2, 0xd2ef, 0xafb0, 0xafaf,
+  0xafb3, 0xafb1, 0xafb4, 0xd2f2, 0xd2ed, 0xd2ee, 0xd2f1, 0xd2f0,
+  0xd6c6, 0xd6c7, 0xd6c5, 0xd6c4, 0xb2be, 0xb57d, 0xdad6, 0xdad8,
+  0xdada, 0xb57c, 0xb57a, 0xdad7, 0xb57b, 0xdad9, 0xb579, 0xdf41,
+  0xdef7, 0xdefa, 0xdefe, 0xb85a, 0xdefc, 0xdefb, 0xdef8, 0xdef9,
+  0xb858, 0xdf40, 0xb857, 0xb85c, 0xb85b, 0xb859, 0xdefd, 0xe349,
+  0xe348, 0xe344, 0xbad8, 0xe347, 0xe346, 0xbad9, 0xbd5e, 0xe6d2,
+  0xbd5f, 0xbd5b, 0xbd5d, 0xbd5a, 0xbd5c, 0xeaaf, 0xbf70, 0xeab1,
+  0xeab0, 0xe345, 0xbf72, 0xbf71, 0xbf6e, 0xbf6f, 0xedb5, 0xedb3,
+  0xc14a, 0xedb4, 0xedb6, 0xedb2, 0xedb1, 0xf060, 0xc2aa, 0xc2a8,
+  0xc2a9, 0xf2a6, 0xf2a7, 0xc3ad, 0xc3ac, 0xf4a3, 0xf4a4, 0xf4a2,
+  0xf6f8, 0xf6f9, 0xa5de, 0xca48, 0xa873, 0xcda5, 0xaac6, 0xaac5,
+  0xcda6, 0xd040, 0xacef, 0xcffe, 0xacf0, 0xafb6, 0xd2f8, 0xd2f6,
+  0xd2fc, 0xafb7, 0xd2f7, 0xd2fb, 0xd2f9, 0xd2fa, 0xd6c8, 0xd6ca,
+  0xb2bf, 0xd6c9, 0xb2c0, 0xb5a2, 0xb5a1, 0xb57e, 0xdadb, 0xdf44,
+  0xb85d, 0xb85e, 0xdf43, 0xdf42, 0xe34a, 0xbadb, 0xbada, 0xe34b,
+  0xe34c, 0xbd61, 0xbd60, 0xeab5, 0xe6d3, 0xe6d5, 0xe6d4, 0xeab4,
+  0xeab2, 0xeab6, 0xeab3, 0xbf73, 0xedb7, 0xc14b, 0xedb8, 0xedb9,
+  0xc2ab, 0xc2ac, 0xc475, 0xc5d1, 0xa5df, 0xd041, 0xd2fd, 0xafb8,
+  0xb3ba, 0xb3b9, 0xb5a4, 0xdadd, 0xb5a3, 0xdadc, 0xdf45, 0xbadc,
+  0xe34d, 0xbadd, 0xc476, 0xf4a5, 0xa6cb, 0xaac7, 0xcda7, 0xacf2,
+  0xacf1, 0xd042, 0xd043, 0xd340, 0xd342, 0xafb9, 0xd344, 0xd347,
+  0xd345, 0xd346, 0xd343, 0xd2fe, 0xafba, 0xd348, 0xd341, 0xd6d3,
+  0xb2c6, 0xd6dc, 0xb2c3, 0xd6d5, 0xb2c7, 0xb2c1, 0xd6d0, 0xd6dd,
+  0xd6d1, 0xd6ce, 0xb2c5, 0xb2c2, 0xd6d4, 0xd6d7, 0xb2c4, 0xd6d8,
+  0xb2c8, 0xd6d9, 0xd6cf, 0xd6d6, 0xd6da, 0xd6d2, 0xd6cd, 0xd6cb,
+  0xd6db, 0xdadf, 0xdae4, 0xdae0, 0xdae6, 0xb5a7, 0xd6cc, 0xdae1,
+  0xb5a5, 0xdade, 0xb5ac, 0xdae2, 0xb5ab, 0xdae3, 0xb5ad, 0xb5a8,
+  0xb5ae, 0xb5a9, 0xb5aa, 0xb5a6, 0xdae5, 0xb861, 0xdf50, 0xdf53,
+  0xdf47, 0xdf4c, 0xdf46, 0xb863, 0xdf4a, 0xdf48, 0xb862, 0xdf4f,
+  0xdf4e, 0xdf4b, 0xdf4d, 0xdf49, 0xbae1, 0xdf52, 0xb85f, 0xdf51,
+  0xe35d, 0xbae8, 0xe358, 0xbae7, 0xe34e, 0xe350, 0xbae0, 0xe355,
+  0xe354, 0xe357, 0xbae5, 0xe352, 0xe351, 0xbae4, 0xbadf, 0xe353,
+  0xbae2, 0xe359, 0xe35b, 0xe356, 0xe34f, 0xbae3, 0xbd69, 0xbade,
+  0xe35c, 0xe6d9, 0xbd62, 0xe6db, 0xbd63, 0xbd65, 0xe6de, 0xe6d6,
+  0xbae6, 0xe6dc, 0xe6d8, 0xb860, 0xbd68, 0xbd64, 0xbd66, 0xbd67,
+  0xbf76, 0xe6dd, 0xe6d7, 0xbd6a, 0xe6da, 0xeac0, 0xeabb, 0xeac5,
+  0xbf74, 0xeabd, 0xbf78, 0xeac3, 0xeaba, 0xeab7, 0xeac6, 0xc151,
+  0xbf79, 0xeac2, 0xeab8, 0xbf77, 0xeabc, 0xbf7b, 0xeab9, 0xeabe,
+  0xbf7a, 0xeac1, 0xeac4, 0xedcb, 0xedcc, 0xedbc, 0xedc3, 0xedc1,
+  0xc14f, 0xedc8, 0xeabf, 0xedbf, 0xedc9, 0xc14e, 0xedbe, 0xedbd,
+  0xedc7, 0xedc4, 0xedc6, 0xedba, 0xedca, 0xc14c, 0xedc5, 0xedce,
+  0xedc2, 0xc150, 0xc14d, 0xedc0, 0xedbb, 0xedcd, 0xbf75, 0xf063,
+  0xf061, 0xf067, 0xc2b0, 0xf065, 0xf064, 0xc2b2, 0xf06a, 0xc2b1,
+  0xf06b, 0xf068, 0xc2ae, 0xf069, 0xf062, 0xc2af, 0xc2ad, 0xf2ab,
+  0xf066, 0xf06c, 0xf2a8, 0xc3b2, 0xc3b0, 0xf2aa, 0xf2ac, 0xf2a9,
+  0xc3b1, 0xc3ae, 0xc3af, 0xc3b3, 0xc478, 0xf4aa, 0xf4a9, 0xf4a7,
+  0xf4a6, 0xf4a8, 0xc477, 0xc479, 0xc4f0, 0xf5e5, 0xf5e4, 0xf6fa,
+  0xf6fc, 0xf6fe, 0xf6fd, 0xf6fb, 0xc5a3, 0xc5a2, 0xc5d3, 0xc5d2,
+  0xc5d4, 0xf7ed, 0xf7ec, 0xf8fb, 0xf8b8, 0xf8fc, 0xc658, 0xc659,
+  0xf96d, 0xc67e, 0xa6cc, 0xcda8, 0xd045, 0xd046, 0xd044, 0xacf3,
+  0xd047, 0xd048, 0xd049, 0xd349, 0xd34f, 0xd34d, 0xafbb, 0xd34b,
+  0xd34c, 0xd34e, 0xd34a, 0xb2c9, 0xd6de, 0xb2cb, 0xd6e0, 0xb2ca,
+  0xd6df, 0xdae8, 0xb5af, 0xdaea, 0xdae7, 0xd6e1, 0xb5b0, 0xdae9,
+  0xdf56, 0xb864, 0xdf54, 0xb865, 0xdf55, 0xb866, 0xbae9, 0xe361,
+  0xe35e, 0xe360, 0xbaea, 0xbaeb, 0xe35f, 0xe6df, 0xe6e0, 0xbd6b,
+  0xe6e2, 0xe6e1, 0xa261, 0xeaca, 0xeacb, 0xeac7, 0xeac8, 0xbf7c,
+  0xbf7d, 0xeac9, 0xc157, 0xc153, 0xc158, 0xc154, 0xc156, 0xc152,
+  0xc155, 0xc2b3, 0xedcf, 0xf2ae, 0xf2ad, 0xf4ab, 0xc47a, 0xc47b,
+  0xf741, 0xf5e6, 0xf740, 0xf8fd, 0xf9a4, 0xa6cd, 0xa874, 0xcda9,
+  0xaac8, 0xacf6, 0xd04c, 0xacf4, 0xd04a, 0xacf9, 0xacf5, 0xacfa,
+  0xacf8, 0xd04b, 0xacf7, 0xafbf, 0xafbe, 0xd35a, 0xafc7, 0xd353,
+  0xd359, 0xafc3, 0xd352, 0xd358, 0xd356, 0xafc2, 0xafc4, 0xd355,
+  0xafbd, 0xd354, 0xafc8, 0xafc5, 0xafc9, 0xafc6, 0xd351, 0xd350,
+  0xd357, 0xafc0, 0xafbc, 0xafc1, 0xd6f0, 0xd6e9, 0xb5b5, 0xd6e8,
+  0xb2cf, 0xb2d6, 0xb2d3, 0xb2d9, 0xb2d8, 0xb2d4, 0xd6e2, 0xd6e5,
+  0xd6e4, 0xb2d0, 0xd6e6, 0xd6ef, 0xb2d1, 0xd6e3, 0xd6ec, 0xd6ed,
+  0xb2d2, 0xd6ea, 0xb2d7, 0xb2cd, 0xb2d5, 0xd6e7, 0xb2cc, 0xd6eb,
+  0xd6ee, 0xdafb, 0xdaf2, 0xb5b2, 0xdaf9, 0xdaf6, 0xdaee, 0xdaf7,
+  0xb5b4, 0xdaef, 0xdaeb, 0xb86c, 0xdaf4, 0xb5b1, 0xdafa, 0xb5b8,
+  0xb5ba, 0xdaed, 0xb5b9, 0xdaf0, 0xb5b3, 0xdaf8, 0xdaf1, 0xdaf5,
+  0xdaf3, 0xb5b6, 0xdaec, 0xb5bb, 0xb2ce, 0xb5b7, 0xb5bc, 0xb868,
+  0xdf5d, 0xdf5f, 0xdf61, 0xdf65, 0xdf5b, 0xdf59, 0xb86a, 0xdf60,
+  0xdf64, 0xdf5c, 0xdf58, 0xdf57, 0xdf62, 0xdf5a, 0xdf5e, 0xb86b,
+  0xb869, 0xdf66, 0xb867, 0xdf63, 0xe372, 0xbaee, 0xe36a, 0xbd78,
+  0xe374, 0xbaf1, 0xe378, 0xbaf7, 0xe365, 0xe375, 0xe362, 0xe377,
+  0xe366, 0xbafe, 0xbafb, 0xe376, 0xe370, 0xbaed, 0xbaf5, 0xbaf4,
+  0xbaf3, 0xbaf9, 0xe363, 0xbafa, 0xe371, 0xbaf6, 0xbaec, 0xe373,
+  0xbaef, 0xbaf0, 0xbaf8, 0xe368, 0xe367, 0xe364, 0xe36c, 0xe369,
+  0xe36d, 0xbafd, 0xe379, 0xbaf2, 0xe36e, 0xe36f, 0xe36b, 0xbafc,
+  0xe6e7, 0xbd70, 0xbd79, 0xbd75, 0xe6e4, 0xbd72, 0xbd76, 0xe6f0,
+  0xbd6c, 0xe6e8, 0xbd74, 0xe6eb, 0xe6e6, 0xbd73, 0xbd77, 0xe6e5,
+  0xbd71, 0xe6ef, 0xbd6e, 0xe6ee, 0xe6ed, 0xbd7a, 0xe572, 0xbd6d,
+  0xe6ec, 0xe6e3, 0xbd7b, 0xe6ea, 0xbd6f, 0xe6e9, 0xbfa2, 0xbfa7,
+  0xbf7e, 0xead8, 0xeacf, 0xeadb, 0xead3, 0xead9, 0xbfa8, 0xbfa1,
+  0xeacc, 0xead2, 0xeadc, 0xead5, 0xeada, 0xeace, 0xead6, 0xbfa3,
+  0xead4, 0xbfa6, 0xbfa5, 0xead0, 0xead1, 0xeacd, 0xead7, 0xbfa4,
+  0xeade, 0xeadd, 0xedda, 0xedd6, 0xc15f, 0xedd0, 0xc159, 0xc169,
+  0xeddc, 0xc161, 0xc15d, 0xedd3, 0xc164, 0xc167, 0xedde, 0xc15c,
+  0xedd5, 0xc165, 0xede0, 0xeddd, 0xedd1, 0xc160, 0xc15a, 0xc168,
+  0xedd8, 0xc163, 0xedd2, 0xc15e, 0xeddf, 0xc162, 0xc15b, 0xedd9,
+  0xc166, 0xedd7, 0xeddb, 0xf06e, 0xf074, 0xc2b9, 0xf077, 0xc2b4,
+  0xc2b5, 0xf06f, 0xf076, 0xf071, 0xc2ba, 0xc2b7, 0xf06d, 0xc2b6,
+  0xf073, 0xf075, 0xc2b8, 0xf072, 0xf070, 0xf2b8, 0xc3b7, 0xc3b8,
+  0xc3b4, 0xc3b5, 0xf2b4, 0xf2b2, 0xf2b6, 0xc3ba, 0xf2b7, 0xf2b0,
+  0xf2af, 0xf2b3, 0xf2b1, 0xc3b6, 0xf2b5, 0xf4ac, 0xc47e, 0xc47d,
+  0xf4ad, 0xf4af, 0xf4ae, 0xc4a1, 0xf5eb, 0xf5e8, 0xf5e9, 0xf5e7,
+  0xf5ea, 0xc4f2, 0xf5ec, 0xc4f1, 0xf742, 0xc5d5, 0xc5d7, 0xf7ee,
+  0xc5d6, 0xf8b9, 0xf940, 0xf942, 0xf8fe, 0xf941, 0xc66c, 0xa6ce,
+  0xacfb, 0xd26f, 0xafca, 0xb2da, 0xdafc, 0xdafd, 0xeadf, 0xc16a,
+  0xede1, 0xc2bb, 0xf2ba, 0xf2b9, 0xc4a2, 0xf5ed, 0xf743, 0xc5f8,
+  0xca49, 0xaac9, 0xa875, 0xd04d, 0xd360, 0xd35b, 0xd35f, 0xd35d,
+  0xafcb, 0xd35e, 0xd35c, 0xd6f1, 0xdafe, 0xdb40, 0xdf69, 0xdf6a,
+  0xb86e, 0xb86f, 0xdf68, 0xdf6b, 0xdf67, 0xb86d, 0xbb40, 0xb870,
+  0xe37a, 0xbd7c, 0xe6f1, 0xbd7d, 0xbfa9, 0xeae2, 0xeae0, 0xeae1,
+  0xede4, 0xede3, 0xede2, 0xf2bb, 0xc3b9, 0xf2bc, 0xf744, 0xc5f9,
+  0xf8ba, 0xa6cf, 0xaacb, 0xaaca, 0xd04f, 0xacfc, 0xd04e, 0xd362,
+  0xafcc, 0xd6f2, 0xd361, 0xb2dc, 0xd6f5, 0xd6f3, 0xd6f4, 0xb2db,
+  0xdb42, 0xdb43, 0xdb41, 0xb873, 0xdf6d, 0xdf6c, 0xdf6e, 0xb872,
+  0xb871, 0xe6f2, 0xe6f4, 0xbd7e, 0xe6f3, 0xeae3, 0xbfaa, 0xf079,
+  0xf078, 0xc3bb, 0xf2bd, 0xc3bd, 0xc3bc, 0xf4b0, 0xf5ee, 0xc4f3,
+  0xa6d0, 0xd050, 0xacfd, 0xd365, 0xafce, 0xd364, 0xd363, 0xafcd,
+  0xd6fb, 0xd6fd, 0xd6f6, 0xd6f7, 0xb2dd, 0xd6f8, 0xb2de, 0xd6fc,
+  0xd6f9, 0xd6fa, 0xb2df, 0xb5be, 0xb5bf, 0xdb44, 0xdf6f, 0xdf70,
+  0xe37e, 0xbb43, 0xbb41, 0xbb42, 0xe37b, 0xe37c, 0xe37d, 0xe6f9,
+  0xe6fa, 0xbda1, 0xe6f7, 0xe6f6, 0xe6f8, 0xe6f5, 0xbfad, 0xeae4,
+  0xbfab, 0xbfac, 0xede6, 0xc16b, 0xede5, 0xefa8, 0xf07a, 0xf07b,
+  0xc2bc, 0xc2bd, 0xc16c, 0xf2be, 0xf2bf, 0xf4b1, 0xc4a3, 0xa6d1,
+  0xa6d2, 0xacfe, 0xaacc, 0xafcf, 0xd051, 0xb5c0, 0xa6d3, 0xad41,
+  0xd052, 0xd053, 0xad40, 0xad42, 0xa6d4, 0xd054, 0xafd1, 0xd366,
+  0xafd3, 0xafd0, 0xafd2, 0xd741, 0xb2e0, 0xd740, 0xd6fe, 0xdf71,
+  0xe3a1, 0xbda2, 0xbfae, 0xeae6, 0xeae5, 0xede7, 0xf5ef, 0xa6d5,
+  0xcb73, 0xcdaa, 0xad43, 0xd055, 0xd368, 0xafd4, 0xd367, 0xafd5,
+  0xd743, 0xb2e2, 0xd742, 0xd744, 0xb2e1, 0xdb46, 0xdb47, 0xdb45,
+  0xb5c1, 0xb874, 0xb875, 0xbb45, 0xe3a3, 0xe3a2, 0xbb44, 0xe6fb,
+  0xe6fc, 0xeae7, 0xc170, 0xc16f, 0xc16d, 0xc16e, 0xc171, 0xf07c,
+  0xc2bf, 0xc2be, 0xf2c0, 0xf4b2, 0xc5a5, 0xc5a4, 0xa6d6, 0xd1fb,
+  0xb877, 0xb5c2, 0xb876, 0xbb46, 0xa6d7, 0xc9a9, 0xa6d8, 0xa6d9,
+  0xcdab, 0xcb76, 0xcb77, 0xa877, 0xcb74, 0xa876, 0xa879, 0xcb75,
+  0xa87b, 0xa87a, 0xcb78, 0xa878, 0xaad1, 0xaacf, 0xcdad, 0xaace,
+  0xaad3, 0xaad5, 0xaad2, 0xcdb0, 0xcdac, 0xaad6, 0xaad0, 0xa87c,
+  0xaad4, 0xcdaf, 0xcdae, 0xaacd, 0xd05b, 0xad47, 0xad48, 0xd05d,
+  0xd057, 0xd05a, 0xd063, 0xd061, 0xad49, 0xd067, 0xad4c, 0xd064,
+  0xd05c, 0xd059, 0xdb49, 0xd062, 0xad44, 0xd065, 0xd056, 0xd05f,
+  0xad46, 0xad4b, 0xd060, 0xad4f, 0xad4d, 0xd058, 0xad4a, 0xd05e,
+  0xad4e, 0xad45, 0xd066, 0xafda, 0xafe3, 0xafd8, 0xafd6, 0xd36a,
+  0xafde, 0xafdb, 0xd36c, 0xafdd, 0xd36b, 0xd369, 0xd36e, 0xafe2,
+  0xafe0, 0xdb48, 0xd36f, 0xd36d, 0xafd7, 0xafd9, 0xafdc, 0xafdf,
+  0xafe1, 0xd74e, 0xb2e4, 0xd745, 0xd747, 0xd748, 0xd750, 0xd74c,
+  0xd74a, 0xd74d, 0xd751, 0xb2e5, 0xb2e9, 0xd746, 0xd74f, 0xb2e7,
+  0xb2e6, 0xd74b, 0xd749, 0xb2e3, 0xb2e8, 0xb5c8, 0xdb51, 0xdb4f,
+  0xb5ca, 0xdb4a, 0xdfa1, 0xb5c9, 0xdb4e, 0xdb4b, 0xb5c5, 0xb5cb,
+  0xdb50, 0xb5c7, 0xdb4d, 0xbb47, 0xb5c6, 0xdb4c, 0xb5cc, 0xb5c4,
+  0xb5c3, 0xdf77, 0xdf75, 0xdf7b, 0xdf73, 0xdfa2, 0xdf78, 0xdf72,
+  0xb87b, 0xb8a3, 0xdf7d, 0xdf76, 0xb87e, 0xb87c, 0xdf7e, 0xb879,
+  0xb878, 0xdf79, 0xb87d, 0xb5cd, 0xdf7c, 0xdf74, 0xb87a, 0xb8a1,
+  0xb8a2, 0xbb4c, 0xbb48, 0xbb4d, 0xe3a6, 0xe3a5, 0xe3a7, 0xbb4a,
+  0xe3a4, 0xbb4b, 0xe3aa, 0xe3a9, 0xe3a8, 0xbb49, 0xe741, 0xe744,
+  0xbda8, 0xe743, 0xbda7, 0xbda3, 0xbda4, 0xbda5, 0xe740, 0xe6fe,
+  0xbda6, 0xe742, 0xe6fd, 0xeae9, 0xeaf3, 0xbfb1, 0xbfb0, 0xeaed,
+  0xeaef, 0xeaea, 0xeaee, 0xeae8, 0xeaf1, 0xbfaf, 0xeaf0, 0xeaec,
+  0xeaf2, 0xeaeb, 0xc174, 0xede8, 0xedee, 0xc178, 0xc17a, 0xc177,
+  0xc176, 0xc175, 0xc173, 0xede9, 0xedec, 0xc172, 0xeded, 0xc179,
+  0xedeb, 0xedea, 0xc2c0, 0xc2c1, 0xf0a1, 0xf07d, 0xf07e, 0xf2c2,
+  0xf2c1, 0xc3be, 0xf4b4, 0xc4a4, 0xf4b3, 0xf5f0, 0xf745, 0xc5a6,
+  0xf943, 0xf944, 0xc5d8, 0xa6da, 0xaad7, 0xdb52, 0xbb4e, 0xc17b,
+  0xedef, 0xa6db, 0xafe5, 0xafe4, 0xdb53, 0xeaf4, 0xa6dc, 0xad50,
+  0xdb54, 0xdb55, 0xdb56, 0xbb4f, 0xbfb2, 0xa6dd, 0xaad8, 0xd068,
+  0xafe6, 0xd370, 0xb2ea, 0xdb57, 0xb8a4, 0xbb50, 0xbfb3, 0xc17c,
+  0xc2c2, 0xf4b5, 0xa6de, 0xaad9, 0xafe7, 0xd752, 0xb5ce, 0xbb51,
+  0xe3ab, 0xe745, 0xa6df, 0xb5cf, 0xdfa3, 0xbb52, 0xa6e0, 0xcdb1,
+  0xd069, 0xad51, 0xd372, 0xafea, 0xafe8, 0xafe9, 0xafeb, 0xd371,
+  0xd757, 0xd754, 0xd756, 0xb2eb, 0xb2ed, 0xb2ec, 0xd753, 0xb2ee,
+  0xd755, 0xdb58, 0xdb59, 0xdb5a, 0xdfa6, 0xdfa7, 0xdfa5, 0xdfa8,
+  0xb8a5, 0xdfa4, 0xbb53, 0xe74a, 0xe746, 0xe749, 0xe74b, 0xe748,
+  0xe747, 0xeaf5, 0xeaf6, 0xeaf7, 0xbfb4, 0xbfb5, 0xedf1, 0xedf0,
+  0xedf2, 0xf0a3, 0xf0a2, 0xf2c4, 0xf2c5, 0xf2c3, 0xc4a5, 0xf4b6,
+  0xf4b7, 0xf746, 0xf7ef, 0xf8bb, 0xa6e1, 0xa87d, 0xc17d, 0xa6e2,
+  0xd758, 0xdb5b, 0xc641, 0xca4a, 0xca4b, 0xca4d, 0xa6e3, 0xca4e,
+  0xca4c, 0xcba2, 0xcba3, 0xcb7b, 0xcba1, 0xa8a1, 0xa8a2, 0xcb7c,
+  0xcb7a, 0xcb79, 0xcb7d, 0xa87e, 0xcb7e, 0xd06a, 0xcdb6, 0xaadc,
+  0xcdb5, 0xcdb7, 0xaadb, 0xcdbc, 0xaadf, 0xcdb2, 0xcdc0, 0xcdc6,
+  0xaae6, 0xcdc3, 0xaae3, 0xcdb9, 0xcdbf, 0xcdc1, 0xcdb4, 0xaae2,
+  0xaadd, 0xcdba, 0xaae4, 0xaae7, 0xaae1, 0xaada, 0xcdbe, 0xcdb8,
+  0xcdc5, 0xaae9, 0xaae5, 0xaae0, 0xcdbd, 0xafec, 0xcdbb, 0xaade,
+  0xaae8, 0xcdb3, 0xcdc2, 0xcdc4, 0xad62, 0xad5c, 0xad64, 0xad61,
+  0xd071, 0xd074, 0xad5d, 0xd06b, 0xad56, 0xad60, 0xad63, 0xad65,
+  0xd0a2, 0xd077, 0xad55, 0xd0a1, 0xad59, 0xad57, 0xad52, 0xd06f,
+  0xd07e, 0xd073, 0xd076, 0xd0a5, 0xad66, 0xd07d, 0xad5e, 0xd078,
+  0xd0a4, 0xd075, 0xd079, 0xd07c, 0xd06d, 0xd0a3, 0xd07b, 0xd06c,
+  0xd070, 0xad5f, 0xad5a, 0xad53, 0xad58, 0xad54, 0xad67, 0xd06e,
+  0xd3a5, 0xad5b, 0xd07a, 0xce41, 0xd3a8, 0xaffa, 0xd376, 0xd3a3,
+  0xd37d, 0xd3b2, 0xd3aa, 0xd37e, 0xd3a9, 0xd378, 0xd37c, 0xd3b5,
+  0xaffd, 0xd3ad, 0xd3a4, 0xafed, 0xd3b3, 0xd374, 0xd3ac, 0xaffc,
+  0xaff7, 0xd373, 0xaff5, 0xaff4, 0xaff9, 0xd3ab, 0xaff1, 0xaff8,
+  0xd072, 0xdb5c, 0xd3a6, 0xd37a, 0xaffb, 0xd37b, 0xd3a1, 0xaffe,
+  0xd375, 0xd3af, 0xd3ae, 0xd3b6, 0xaff3, 0xaff0, 0xd3b4, 0xd3b0,
+  0xd3a7, 0xd3a2, 0xaff6, 0xaff2, 0xd377, 0xafee, 0xd3b1, 0xafef,
+  0xd379, 0xd75e, 0xd760, 0xd765, 0xd779, 0xb2fc, 0xb2f2, 0xd75d,
+  0xb2fd, 0xb2fe, 0xd768, 0xd76f, 0xd775, 0xd762, 0xd769, 0xb340,
+  0xd777, 0xd772, 0xb2fa, 0xb2f8, 0xd76e, 0xd76a, 0xd75c, 0xb2ef,
+  0xd761, 0xd759, 0xb2f7, 0xb2f9, 0xd766, 0xd763, 0xb2f4, 0xd773,
+  0xb2f1, 0xd764, 0xd77a, 0xd76c, 0xd76b, 0xb2f0, 0xb2fb, 0xb2f3,
+  0xd75a, 0xd75f, 0xd770, 0xd776, 0xb341, 0xd75b, 0xd767, 0xd76d,
+  0xb2f6, 0xd778, 0xd771, 0xd774, 0xb2f5, 0xdb6c, 0xdb60, 0xb5d7,
+  0xdb7d, 0xdba7, 0xdbaa, 0xb5d5, 0xdb68, 0xdba3, 0xdb69, 0xdb77,
+  0xb5e2, 0xdb73, 0xb5df, 0xdb74, 0xdb5d, 0xdba4, 0xb5e8, 0xdba1,
+  0xdb75, 0xdbac, 0xdb70, 0xdfc8, 0xdbaf, 0xb5e6, 0xdb6e, 0xdb7a,
+  0xb5e9, 0xb5d4, 0xdb72, 0xdbad, 0xdb6b, 0xdb64, 0xdb6f, 0xdb63,
+  0xdb61, 0xb5d0, 0xdba5, 0xdb6a, 0xdba8, 0xdba9, 0xb5d8, 0xb5dd,
+  0xb5d9, 0xb5e1, 0xdb7e, 0xb5da, 0xdb76, 0xdb66, 0xb5d2, 0xdb5e,
+  0xdba2, 0xdbab, 0xdb65, 0xb5e0, 0xdbb0, 0xdb71, 0xdb6d, 0xb5d1,
+  0xb5e5, 0xdb7c, 0xb5e7, 0xdb78, 0xb5dc, 0xb5d6, 0xb5de, 0xb5d3,
+  0xb5e4, 0xdb79, 0xdb67, 0xdb7b, 0xdb62, 0xdba6, 0xdbae, 0xdb5f,
+  0xdfc7, 0xdfdd, 0xb855, 0xdfcc, 0xdfca, 0xdfb5, 0xb8a9, 0xdfc5,
+  0xdfd9, 0xdfc1, 0xb8b1, 0xdfd8, 0xdfbf, 0xb5e3, 0xdfcf, 0xdfc0,
+  0xdfd6, 0xb8b0, 0xb8a8, 0xdfaa, 0xdfb2, 0xdfcb, 0xdfc3, 0xdfdc,
+  0xdfc6, 0xb8b6, 0xdfd7, 0xb8ad, 0xdfc9, 0xdfd1, 0xdfb6, 0xdfd0,
+  0xdfe1, 0xdfb1, 0xdfd2, 0xdfdf, 0xdfab, 0xb5db, 0xdfb9, 0xdfb8,
+  0xb8af, 0xdfbc, 0xdfbe, 0xdfcd, 0xdfde, 0xb8b2, 0xb8b3, 0xdfb0,
+  0xb8ab, 0xdfb4, 0xdfda, 0xb8b4, 0xb8ac, 0xb8ae, 0xb8b5, 0xdfe0,
+  0xdfd3, 0xdfce, 0xdfbb, 0xdfba, 0xb8aa, 0xdfac, 0xb8a7, 0xdfc4,
+  0xdfad, 0xdfc2, 0xdfb7, 0xdfdb, 0xb8a6, 0xdfb3, 0xdfaf, 0xdfd5,
+  0xdfae, 0xbb60, 0xe3d3, 0xe3c2, 0xe3ac, 0xe3ca, 0xbb58, 0xe3bb,
+  0xe3c5, 0xbb5b, 0xe3be, 0xbb59, 0xe3af, 0xe3cd, 0xe3ae, 0xe3c1,
+  0xe3ad, 0xe3bf, 0xe3c8, 0xe3c6, 0xe3ba, 0xe3b5, 0xe3b3, 0xe3b4,
+  0xe3c7, 0xe3d2, 0xe3bc, 0xbb5a, 0xe3b7, 0xe3cb, 0xbb5d, 0xe3b6,
+  0xe3b0, 0xe3c0, 0xbb61, 0xbb55, 0xbb5e, 0xe3b8, 0xe3b2, 0xbb57,
+  0xdfd4, 0xbb56, 0xe3c3, 0xbb54, 0xbb63, 0xbb5c, 0xe3c4, 0xe3b9,
+  0xe3b1, 0xe3cc, 0xe3bd, 0xbb62, 0xe3d0, 0xbb5f, 0xe3cf, 0xe3c9,
+  0xe3ce, 0xe3d1, 0xe773, 0xe774, 0xe767, 0xe766, 0xe762, 0xbdb4,
+  0xbdac, 0xe776, 0xe775, 0xdfa9, 0xe75f, 0xe763, 0xe75d, 0xe770,
+  0xe761, 0xe777, 0xe75a, 0xe758, 0xe764, 0xe76e, 0xe769, 0xbdb6,
+  0xe74f, 0xe76d, 0xbdb7, 0xdfbd, 0xe75b, 0xe752, 0xe755, 0xe77b,
+  0xe75c, 0xe753, 0xe751, 0xe74e, 0xbdb0, 0xe765, 0xbdaf, 0xbdb3,
+  0xe760, 0xe768, 0xbda9, 0xe778, 0xe77c, 0xbdab, 0xe757, 0xe76b,
+  0xe76f, 0xe754, 0xe779, 0xbdb2, 0xbdb1, 0xe74c, 0xbdb5, 0xe772,
+  0xe756, 0xe76a, 0xe750, 0xe75e, 0xe759, 0xbdad, 0xbdae, 0xe76c,
+  0xe77d, 0xe77a, 0xe771, 0xe74d, 0xbdaa, 0xeb49, 0xeb40, 0xeb43,
+  0xbfbb, 0xeb45, 0xeaf9, 0xeb41, 0xeb47, 0xbfb8, 0xbfbc, 0xbfb6,
+  0xeafb, 0xeb4c, 0xeb46, 0xeafc, 0xeb55, 0xeb4f, 0xeaf8, 0xee46,
+  0xeafe, 0xbfb7, 0xeb4a, 0xeb54, 0xbfbf, 0xeb51, 0xeafd, 0xeb44,
+  0xeb48, 0xeb42, 0xeb56, 0xeb53, 0xeb50, 0xbfb9, 0xbfba, 0xbfbe,
+  0xeafa, 0xeb57, 0xbfbd, 0xeb4d, 0xeb4b, 0xeb4e, 0xee53, 0xee40,
+  0xee45, 0xee52, 0xee44, 0xedfb, 0xee41, 0xc1a2, 0xedf4, 0xee4d,
+  0xee4f, 0xedf3, 0xc1a1, 0xee51, 0xee49, 0xc1a8, 0xee50, 0xee42,
+  0xc1aa, 0xedf9, 0xeb52, 0xee4a, 0xee47, 0xedf5, 0xee55, 0xc1a4,
+  0xc1a5, 0xedf7, 0xee48, 0xee54, 0xee4b, 0xedfd, 0xc1a7, 0xc1a3,
+  0xee4c, 0xedfe, 0xee56, 0xedf8, 0xee43, 0xee4e, 0xedfa, 0xedfc,
+  0xc2cb, 0xedf6, 0xc1a9, 0xc2c4, 0xc17e, 0xc1a6, 0xc2c8, 0xf0b3,
+  0xf0a9, 0xf0a4, 0xf0aa, 0xf0b4, 0xf0b8, 0xf0b7, 0xc2ca, 0xc2c9,
+  0xf0ab, 0xf0b9, 0xf0ae, 0xf0a6, 0xf0a8, 0xf0a7, 0xf0ad, 0xf0b2,
+  0xf0a5, 0xf0ac, 0xf0b1, 0xc2c7, 0xf0af, 0xc2c5, 0xf0b0, 0xc2c3,
+  0xc2c6, 0xf2d5, 0xf0b5, 0xc3c2, 0xf2cd, 0xf2d1, 0xf2c9, 0xf2cc,
+  0xf2d4, 0xc3c0, 0xf2d9, 0xf2d2, 0xf2ca, 0xf2da, 0xf2d3, 0xc3c3,
+  0xc3c4, 0xf2d7, 0xf2cb, 0xc3bf, 0xc3c1, 0xf2c6, 0xf2ce, 0xf2c8,
+  0xf2d8, 0xf2d6, 0xf2c7, 0xf2cf, 0xf4be, 0xc3c5, 0xf2d0, 0xc4a7,
+  0xc4a9, 0xc4a6, 0xf4c3, 0xf4bb, 0xf4b9, 0xf4bd, 0xf4ba, 0xf4bf,
+  0xf4c1, 0xc4aa, 0xc4ac, 0xf4c0, 0xc4ad, 0xc4ab, 0xf4c2, 0xc4a8,
+  0xc4f4, 0xf5f1, 0xf5f7, 0xc4f6, 0xf4bc, 0xf5f6, 0xf5fd, 0xf5f4,
+  0xf5fb, 0xf5fa, 0xf4b8, 0xf5f5, 0xf0b6, 0xf5fe, 0xf5f3, 0xf5f8,
+  0xf5fc, 0xf5f2, 0xf74a, 0xc4f5, 0xf5f9, 0xf7f4, 0xf74b, 0xf749,
+  0xf747, 0xf748, 0xf74c, 0xc5d9, 0xf7f2, 0xf7f0, 0xf7f5, 0xf7f3,
+  0xf7f6, 0xc5da, 0xf7f1, 0xf8bc, 0xf945, 0xf946, 0xf947, 0xf9c7,
+  0xf9bd, 0xca4f, 0xaaea, 0xad68, 0xd3b8, 0xd3b7, 0xb040, 0xb342,
+  0xd77c, 0xd77b, 0xb5ea, 0xb8b8, 0xb8b7, 0xb8b9, 0xe3d4, 0xe77e,
+  0xeb58, 0xeb5a, 0xeb59, 0xc1ab, 0xee57, 0xf0ba, 0xf9a5, 0xa6e4,
+  0xcdc9, 0xcdca, 0xcdc8, 0xcdc7, 0xaaeb, 0xd0a9, 0xd0a7, 0xd0a6,
+  0xad69, 0xad6b, 0xad6a, 0xd0a8, 0xd3c4, 0xd3c1, 0xd3bf, 0xb041,
+  0xd3c2, 0xb046, 0xd3bc, 0xd3cb, 0xd3cd, 0xd3bd, 0xb043, 0xd3ce,
+  0xd3c9, 0xd3bb, 0xd3c0, 0xd3ca, 0xd3c6, 0xd3c3, 0xb048, 0xd3cc,
+  0xd3be, 0xd3c7, 0xd3b9, 0xb047, 0xb044, 0xd3c5, 0xd3c8, 0xd3ba,
+  0xb045, 0xb042, 0xb34c, 0xd7a5, 0xb34b, 0xd7a8, 0xd7ab, 0xb348,
+  0xb346, 0xd77e, 0xd7a9, 0xd7a7, 0xd7a4, 0xd7ac, 0xd7ad, 0xd7af,
+  0xd7b0, 0xd77d, 0xb345, 0xd7a2, 0xd7a1, 0xd7ae, 0xb347, 0xd7a3,
+  0xb349, 0xb344, 0xd7a6, 0xb34d, 0xb34a, 0xd7aa, 0xb5f1, 0xdbbf,
+  0xdbb4, 0xb5ee, 0xdfe7, 0xdbbd, 0xdbb1, 0xb5ec, 0xdbb6, 0xb5ef,
+  0xdbba, 0xdbb8, 0xb5f2, 0xb5eb, 0xdbb2, 0xdbb5, 0xb5f0, 0xdbb3,
+  0xdbbe, 0xdbbc, 0xdbb7, 0xdbb9, 0xdbbb, 0xb5ed, 0xdfe8, 0xdfee,
+  0xdfe4, 0xdfea, 0xb8ba, 0xdfe6, 0xb8c0, 0xb8bf, 0xb8be, 0xdfed,
+  0xb8c1, 0xb8c2, 0xdfe3, 0xdff0, 0xb8c3, 0xb8bd, 0xb8bc, 0xdfec,
+  0xb8c4, 0xdfe2, 0xdfe5, 0xdfef, 0xdfeb, 0xe3f4, 0xe3e9, 0xb8bb,
+  0xbb6a, 0xe3dd, 0xe3f2, 0xe3de, 0xbb65, 0xe3db, 0xe3e4, 0xe3dc,
+  0xbb67, 0xe3d6, 0xe3f1, 0xbb68, 0xe3ee, 0xe3ef, 0xe3d7, 0xbb6d,
+  0xe3e6, 0xe3e0, 0xe3e7, 0xe3da, 0xe3f3, 0xe3eb, 0xe3e5, 0xe3d5,
+  0xbb69, 0xe3ec, 0xbb6c, 0xe3f0, 0xe3ea, 0xbb66, 0xe3e8, 0xe3e2,
+  0xbb64, 0xe3d9, 0xe3e1, 0xe3ed, 0xe3df, 0xe3e3, 0xbdc1, 0xdfe9,
+  0xe7b2, 0xe7bb, 0xe7b1, 0xe7ad, 0xe7aa, 0xbdc2, 0xe7a8, 0xbb6b,
+  0xe7a1, 0xbdc0, 0xe7a7, 0xbdbf, 0xe7ac, 0xe7a9, 0xe7b9, 0xe7b4,
+  0xe7ae, 0xe7b3, 0xbdbb, 0xe7ab, 0xe7be, 0xe7a2, 0xe7a3, 0xe7ba,
+  0xbdbc, 0xe7bf, 0xbdbe, 0xe7c0, 0xe7b0, 0xe3d8, 0xe7b6, 0xe7af,
+  0xe7b8, 0xe7b5, 0xe7a6, 0xbdb9, 0xe7bd, 0xbdba, 0xe7a4, 0xbdbd,
+  0xeb64, 0xe7b7, 0xe7bc, 0xeb61, 0xbdb8, 0xbfc0, 0xeb6b, 0xeb67,
+  0xeb65, 0xeb60, 0xeb6f, 0xbfc4, 0xeb5c, 0xeb68, 0xeb69, 0xeb5f,
+  0xeb5e, 0xeb6c, 0xeb62, 0xeb5d, 0xeb63, 0xeb6e, 0xeb5b, 0xeb6d,
+  0xeb6a, 0xbfc2, 0xbfc1, 0xbfc3, 0xeb66, 0xf0cb, 0xee59, 0xc1b1,
+  0xee5d, 0xee5a, 0xee61, 0xee67, 0xee5c, 0xee70, 0xc1ae, 0xee6a,
+  0xee5f, 0xee6b, 0xee66, 0xee6d, 0xee5e, 0xc1b3, 0xc1b2, 0xee60,
+  0xee6e, 0xee58, 0xee6c, 0xc1ac, 0xee64, 0xee63, 0xee68, 0xee5b,
+  0xc1b0, 0xc1b4, 0xee62, 0xee69, 0xc1b5, 0xee65, 0xc1ad, 0xc1af,
+  0xf0c7, 0xf0c5, 0xf0cc, 0xf0c9, 0xf0cd, 0xf0be, 0xf0c6, 0xf0d1,
+  0xee6f, 0xf0c2, 0xc2cf, 0xe7a5, 0xf0bd, 0xf0ca, 0xf0c4, 0xf0c1,
+  0xf0bc, 0xf0bb, 0xf0d0, 0xf0c0, 0xf0bf, 0xc2cd, 0xf0c8, 0xc2cc,
+  0xc2ce, 0xf0c3, 0xf0cf, 0xf2de, 0xf2df, 0xc3c9, 0xf2dc, 0xc3c6,
+  0xf2e4, 0xc3ca, 0xf2e6, 0xf2db, 0xf0ce, 0xf2e8, 0xf2dd, 0xc3c7,
+  0xf2e3, 0xf2e5, 0xf2e0, 0xf2e7, 0xf2e2, 0xf2e1, 0xc3c8, 0xf4c5,
+  0xf4c6, 0xf4c8, 0xc4ae, 0xc4af, 0xf4c9, 0xf4c7, 0xf4c4, 0xf642,
+  0xf645, 0xf641, 0xc4fa, 0xf643, 0xc4f9, 0xc4f8, 0xc4f7, 0xf644,
+  0xf751, 0xf74f, 0xf74e, 0xf640, 0xf750, 0xf646, 0xf74d, 0xf7f9,
+  0xf7d7, 0xf7f7, 0xc5db, 0xf7f8, 0xf7fa, 0xf8bf, 0xc5fa, 0xf8be,
+  0xf8bd, 0xc5fb, 0xc65a, 0xf96e, 0xf9a7, 0xf9a6, 0xf9a8, 0xa6e5,
+  0xd0aa, 0xd3cf, 0xd3d0, 0xdbc0, 0xf647, 0xf8c0, 0xa6e6, 0xad6c,
+  0xd0ab, 0xd7b1, 0xb34e, 0xdbc2, 0xdbc1, 0xb5f3, 0xb8c5, 0xe7c1,
+  0xbdc3, 0xbdc4, 0xbfc5, 0xc5fc, 0xa6e7, 0xd0ac, 0xaaed, 0xd0ae,
+  0xd0ad, 0xad6d, 0xd3d1, 0xd3d8, 0xb049, 0xd3d6, 0xd3d4, 0xd3db,
+  0xd3d2, 0xd3d3, 0xb04a, 0xb04e, 0xd3dc, 0xb04d, 0xd3da, 0xd3d7,
+  0xd3d5, 0xb04b, 0xb04c, 0xd3d9, 0xb350, 0xd7b2, 0xb355, 0xd7c2,
+  0xb354, 0xd7c4, 0xd7b8, 0xb352, 0xd7c3, 0xd7b3, 0xb353, 0xd7bf,
+  0xd7bb, 0xd7bd, 0xd7b7, 0xd7be, 0xb34f, 0xd7ba, 0xd7b9, 0xd7b5,
+  0xd7c0, 0xd7bc, 0xd7b4, 0xd7b6, 0xb351, 0xd7c1, 0xb5f6, 0xdbcd,
+  0xdbc9, 0xdbcb, 0xdbc6, 0xdbc5, 0xdbc3, 0xdbca, 0xdbcc, 0xdbc8,
+  0xdbc7, 0xb5f4, 0xb5f5, 0xdbcf, 0xb8cd, 0xdff2, 0xdff8, 0xdff3,
+  0xdff4, 0xdff9, 0xb8cf, 0xb8c7, 0xb8ce, 0xdff1, 0xdbc4, 0xb8ca,
+  0xb8c8, 0xdff7, 0xdff6, 0xb8c9, 0xb8cb, 0xdff5, 0xb8c6, 0xb8cc,
+  0xe3f6, 0xbb74, 0xe442, 0xe441, 0xe3fb, 0xbb76, 0xe440, 0xe3f7,
+  0xe3f8, 0xbb6e, 0xbb70, 0xe3fd, 0xe3f5, 0xbb72, 0xbb71, 0xe3f9,
+  0xe3fe, 0xe3fc, 0xbb73, 0xe3fa, 0xdbce, 0xbb6f, 0xe7c2, 0xe7c9,
+  0xbdc6, 0xe7cd, 0xbdca, 0xe7c5, 0xe7c3, 0xe7cc, 0xbdc5, 0xe7cb,
+  0xbdc7, 0xbdc8, 0xe7c4, 0xbdc9, 0xe7ca, 0xe7c6, 0xe7c7, 0xe7c8,
+  0xbb75, 0xeb70, 0xeb7c, 0xbfca, 0xeb77, 0xeb79, 0xbfc8, 0xeb71,
+  0xeb75, 0xeb78, 0xbfc6, 0xbfc9, 0xeb7b, 0xeb73, 0xeb74, 0xeb7a,
+  0xeb72, 0xeb76, 0xbfc7, 0xee72, 0xee71, 0xc1b7, 0xee77, 0xc1b9,
+  0xc1b6, 0xee73, 0xc1ba, 0xee74, 0xee75, 0xee78, 0xc1b8, 0xf0d6,
+  0xf0d9, 0xf0d3, 0xf0d5, 0xf0d4, 0xf0d7, 0xf0d8, 0xee76, 0xf0d2,
+  0xc3cd, 0xf2ec, 0xf2ef, 0xf2f1, 0xf2ea, 0xf2eb, 0xf2ee, 0xf2f0,
+  0xc3ce, 0xc3cc, 0xc3cb, 0xf2ed, 0xf2e9, 0xf4ca, 0xc4b0, 0xf4cb,
+  0xf649, 0xc4fb, 0xf64b, 0xc4fc, 0xf648, 0xf64a, 0xc5a8, 0xf752,
+  0xc5a7, 0xf7fd, 0xf7fc, 0xf7fb, 0xf948, 0xf949, 0xf94b, 0xf94a,
+  0xca50, 0xa6e8, 0xad6e, 0xd7c5, 0xb5f7, 0xdffa, 0xc2d0, 0xf2f2,
+  0xa8a3, 0xb357, 0xb356, 0xdbd0, 0xb5f8, 0xdbd2, 0xdbd1, 0xdffb,
+  0xb8d0, 0xe443, 0xe446, 0xe445, 0xe444, 0xe7ce, 0xe7d0, 0xe7cf,
+  0xbfcc, 0xbfcb, 0xc1bb, 0xee79, 0xee7b, 0xee7a, 0xc2d1, 0xf2f4,
+  0xf2f3, 0xf4cc, 0xc4b1, 0xc4fd, 0xf754, 0xf753, 0xc65b, 0xa8a4,
+  0xd0af, 0xad6f, 0xd7c8, 0xd7c6, 0xd7c7, 0xdbd4, 0xdbd5, 0xe043,
+  0xdbd3, 0xdffc, 0xe041, 0xe040, 0xe042, 0xb8d1, 0xdffe, 0xdffd,
+  0xe044, 0xe449, 0xe447, 0xe448, 0xe7d3, 0xe7d1, 0xe7d2, 0xeb7d,
+  0xee7c, 0xee7d, 0xc2d2, 0xf2f5, 0xf4cd, 0xc4b2, 0xf64c, 0xf755,
+  0xc5a9, 0xf7fe, 0xf94c, 0xa8a5, 0xad71, 0xad72, 0xd0b0, 0xd0b1,
+  0xad70, 0xb054, 0xb052, 0xb051, 0xb058, 0xb050, 0xb059, 0xd3dd,
+  0xb056, 0xb053, 0xb057, 0xb055, 0xb04f, 0xb35f, 0xb359, 0xd7cc,
+  0xb35e, 0xb360, 0xb35a, 0xb35b, 0xd7ca, 0xb358, 0xd7cb, 0xb35d,
+  0xd7c9, 0xb35c, 0xb644, 0xb646, 0xdbd8, 0xb645, 0xb5f9, 0xb5fd,
+  0xb8e4, 0xe049, 0xdbda, 0xb5fe, 0xdbdd, 0xdbde, 0xb643, 0xdbe0,
+  0xdbe2, 0xdbe3, 0xdbd7, 0xdbd6, 0xdbe4, 0xb642, 0xdbe1, 0xdbdf,
+  0xb640, 0xb5fb, 0xb647, 0xdbdb, 0xdbdc, 0xdbd9, 0xb641, 0xb5fc,
+  0xb5fa, 0xe048, 0xb8df, 0xb8da, 0xb8d5, 0xb8e5, 0xb8d6, 0xb8d2,
+  0xb8e1, 0xb8de, 0xb8e0, 0xb8d7, 0xb8dc, 0xb8d3, 0xb8d4, 0xe050,
+  0xe04d, 0xe045, 0xe04a, 0xb8e2, 0xe051, 0xb8e3, 0xb8d9, 0xe047,
+  0xe04f, 0xe04b, 0xe04e, 0xe04c, 0xb8dd, 0xe046, 0xb8d8, 0xe44c,
+  0xbb78, 0xbb7b, 0xe44e, 0xbba5, 0xe44d, 0xbb7d, 0xbdcf, 0xe44f,
+  0xbba4, 0xe44b, 0xbba6, 0xbb79, 0xb8db, 0xbb7c, 0xbb7a, 0xbb7e,
+  0xbba2, 0xbb77, 0xbba7, 0xbba3, 0xbba1, 0xe44a, 0xbdd6, 0xbdd2,
+  0xbdd9, 0xe7d6, 0xbdda, 0xe7e2, 0xe7db, 0xbdcb, 0xe7e3, 0xe7dd,
+  0xbdd5, 0xe7de, 0xbdd4, 0xe7e1, 0xbdce, 0xe7df, 0xe7d5, 0xbdcd,
+  0xebaa, 0xbdd3, 0xbdd0, 0xbdd8, 0xe7d4, 0xe7d8, 0xbdcc, 0xe7d7,
+  0xe7d9, 0xe7da, 0xbdd7, 0xe7dc, 0xe7e0, 0xe7e4, 0xbddb, 0xbfd2,
+  0xeba5, 0xebab, 0xeba8, 0xeb7e, 0xebac, 0xeba1, 0xeba7, 0xbfcd,
+  0xbfd3, 0xebad, 0xbfcf, 0xbfd9, 0xbfd4, 0xebaf, 0xeba9, 0xbfd0,
+  0xeba2, 0xbfda, 0xeba3, 0xeba4, 0xbfdb, 0xbfd8, 0xbdd1, 0xbfce,
+  0xebb0, 0xbfdc, 0xbfd5, 0xebae, 0xbfd1, 0xbfd6, 0xbfd7, 0xc1c3,
+  0xeea4, 0xeead, 0xeeaa, 0xeeac, 0xc1c0, 0xeea5, 0xeeab, 0xc1bc,
+  0xeea7, 0xc1c4, 0xeea3, 0xeea8, 0xeeaf, 0xeba6, 0xeea9, 0xeea2,
+  0xc1bd, 0xeea1, 0xc1be, 0xeeb0, 0xc1bf, 0xeeae, 0xc1c2, 0xee7e,
+  0xc1c1, 0xeea6, 0xf0dc, 0xf0ea, 0xf0e5, 0xf0e7, 0xf0db, 0xc2d3,
+  0xf0da, 0xc2d6, 0xc2d5, 0xf0e9, 0xf0e1, 0xf0de, 0xf0e4, 0xf0dd,
+  0xf0df, 0xf0e8, 0xf0e6, 0xc2d4, 0xf0ed, 0xf0eb, 0xf0e2, 0xf0ec,
+  0xf0e3, 0xf2f9, 0xc3cf, 0xf341, 0xf64f, 0xc3d6, 0xf0e0, 0xf2f7,
+  0xc3d2, 0xf2f8, 0xf2fd, 0xc3d4, 0xc3d5, 0xf2f6, 0xf340, 0xf342,
+  0xf2fa, 0xf2fc, 0xf2fe, 0xf2fb, 0xf343, 0xc3d1, 0xc3d7, 0xc3d3,
+  0xc3d0, 0xf4d0, 0xc4b7, 0xf4ce, 0xf4d2, 0xf4d3, 0xc4b5, 0xf4d4,
+  0xf4d1, 0xf4cf, 0xc4b8, 0xc4b4, 0xf4d5, 0xc4b6, 0xc4b3, 0xc4fe,
+  0xc540, 0xf64e, 0xf64d, 0xf650, 0xf651, 0xc541, 0xf756, 0xf75b,
+  0xc5aa, 0xf758, 0xf757, 0xf75a, 0xf759, 0xf843, 0xc5dc, 0xf842,
+  0xf840, 0xf841, 0xc5fe, 0xc5fd, 0xf8c1, 0xf8c2, 0xc640, 0xf94d,
+  0xf94e, 0xc667, 0xc66d, 0xf9a9, 0xf9c8, 0xa8a6, 0xd7cd, 0xd7ce,
+  0xe052, 0xe450, 0xe7e5, 0xc1c6, 0xc1c5, 0xf0ee, 0xf344, 0xf844,
+  0xa8a7, 0xd3de, 0xb05a, 0xb361, 0xe054, 0xe053, 0xbddc, 0xe7e6,
+  0xbddd, 0xeeb1, 0xc2d7, 0xc676, 0xa8a8, 0xcdcb, 0xd3df, 0xb362,
+  0xd7cf, 0xd7d0, 0xdbe5, 0xb648, 0xb8e6, 0xe056, 0xe055, 0xe057,
+  0xe451, 0xe452, 0xbba8, 0xbfdd, 0xbdde, 0xbfde, 0xeeb5, 0xeeb2,
+  0xeeb4, 0xeeb3, 0xc1c7, 0xf0ef, 0xf346, 0xf345, 0xcba4, 0xb05c,
+  0xb05b, 0xd3e0, 0xd7d1, 0xdbe7, 0xdbe6, 0xb649, 0xe059, 0xe05a,
+  0xe058, 0xb8e8, 0xb8e7, 0xbbaa, 0xbba9, 0xe7e7, 0xebb3, 0xebb1,
+  0xebb2, 0xbfdf, 0xeeb7, 0xeeb6, 0xf0f2, 0xf0f1, 0xf0f0, 0xf347,
+  0xf9aa, 0xa8a9, 0xad73, 0xad74, 0xb05d, 0xb05e, 0xd3e2, 0xd3e1,
+  0xd7d2, 0xb368, 0xb366, 0xb363, 0xb367, 0xb365, 0xb364, 0xb64a,
+  0xdbea, 0xb8ed, 0xb64c, 0xb651, 0xdbec, 0xb653, 0xb652, 0xb655,
+  0xdbeb, 0xdbe8, 0xb64f, 0xb64b, 0xb64d, 0xdbe9, 0xb654, 0xb650,
+  0xb64e, 0xb8ef, 0xb8ee, 0xb8ec, 0xb8f0, 0xb8ea, 0xb8eb, 0xb8e9,
+  0xe05b, 0xe454, 0xbbac, 0xbbad, 0xbbab, 0xe453, 0xe455, 0xe7ea,
+  0xe7ec, 0xbde7, 0xe7ed, 0xbde0, 0xe7e9, 0xbddf, 0xbde9, 0xbde5,
+  0xbde6, 0xbde2, 0xe7e8, 0xbde1, 0xe7ee, 0xe7eb, 0xbde8, 0xbde3,
+  0xbde4, 0xebb5, 0xebb7, 0xebb6, 0xebb8, 0xbfe0, 0xebb4, 0xc1cb,
+  0xeeb8, 0xc1c8, 0xc1cc, 0xc1ca, 0xc1c9, 0xf0f3, 0xf0f6, 0xf0f5,
+  0xf0f4, 0xc2d8, 0xf348, 0xf349, 0xc3d8, 0xf34a, 0xc3d9, 0xc4ba,
+  0xc4b9, 0xf652, 0xc542, 0xf653, 0xf75c, 0xc5ab, 0xc5ac, 0xf845,
+  0xc642, 0xa8aa, 0xb36a, 0xb369, 0xe05c, 0xe05d, 0xbbae, 0xebb9,
+  0xbdea, 0xebba, 0xeeb9, 0xa8ab, 0xd0b2, 0xad76, 0xad75, 0xd3e3,
+  0xb05f, 0xd3e4, 0xd7d5, 0xd7d4, 0xd7d3, 0xdbee, 0xb658, 0xdbed,
+  0xb657, 0xdbef, 0xb656, 0xe05f, 0xe062, 0xe060, 0xe061, 0xe065,
+  0xe05e, 0xe066, 0xe063, 0xe064, 0xbbb0, 0xe456, 0xbbaf, 0xe7f2,
+  0xe7f0, 0xbdeb, 0xe7ef, 0xe7f1, 0xbdec, 0xebbb, 0xebbc, 0xc1cd,
+  0xf34c, 0xf34e, 0xf34b, 0xf34d, 0xf4d6, 0xf654, 0xf96f, 0xa8ac,
+  0xad77, 0xd3e5, 0xd3e7, 0xd3e6, 0xd7d8, 0xb36c, 0xd7d6, 0xb36b,
+  0xd7d9, 0xd7da, 0xd7d7, 0xdbfb, 0xb660, 0xdbf3, 0xdbf9, 0xb65b,
+  0xb65e, 0xdbf2, 0xb659, 0xdbf6, 0xe06c, 0xb65d, 0xdbf1, 0xdbf7,
+  0xdbf4, 0xdbfa, 0xdbf0, 0xdbf8, 0xb65c, 0xb65f, 0xdbf5, 0xb65a,
+  0xb8f2, 0xe068, 0xb8f1, 0xe06f, 0xe06e, 0xb8f8, 0xb8f9, 0xe070,
+  0xb8f3, 0xe06d, 0xb8f7, 0xe072, 0xe069, 0xe06b, 0xb8f4, 0xe067,
+  0xe06a, 0xe071, 0xb8f5, 0xe073, 0xb8f6, 0xbbb1, 0xe45b, 0xe461,
+  0xe459, 0xe462, 0xe458, 0xe45d, 0xe463, 0xe460, 0xe45f, 0xe45e,
+  0xe457, 0xe45c, 0xe45a, 0xbdf1, 0xbdee, 0xe7fb, 0xe841, 0xe843,
+  0xe840, 0xe7f8, 0xe7fa, 0xe845, 0xe842, 0xe7fc, 0xe846, 0xe7f9,
+  0xe844, 0xbdef, 0xbdf5, 0xbdf3, 0xe7f3, 0xbdf4, 0xbdf0, 0xe7f4,
+  0xe7f6, 0xe7f5, 0xe7fd, 0xe7fe, 0xbdf2, 0xbded, 0xe7f7, 0xebc6,
+  0xbfe2, 0xebbd, 0xbfe3, 0xbfe6, 0xebc2, 0xebbf, 0xbfe5, 0xebc3,
+  0xebc4, 0xebbe, 0xebc7, 0xebc0, 0xebc5, 0xbfe4, 0xbfe1, 0xebc1,
+  0xeebf, 0xc1d0, 0xc1ce, 0xc1d1, 0xc1cf, 0xeebe, 0xeebb, 0xeeba,
+  0xeebd, 0xeebc, 0xf145, 0xc2de, 0xf0fb, 0xf0fa, 0xc2d9, 0xf141,
+  0xf140, 0xf0f7, 0xf143, 0xf0fc, 0xc2dd, 0xf0f9, 0xf142, 0xf0f8,
+  0xc2da, 0xc2dc, 0xf0fd, 0xc2db, 0xf0fe, 0xf144, 0xf352, 0xc3de,
+  0xf34f, 0xf353, 0xc3db, 0xf351, 0xc3e0, 0xc3dd, 0xf350, 0xc3df,
+  0xf354, 0xc3da, 0xc4bc, 0xc4be, 0xf4d9, 0xc4bd, 0xf4d7, 0xc3dc,
+  0xf4d8, 0xc4bb, 0xc543, 0xc545, 0xf656, 0xc544, 0xf655, 0xf761,
+  0xc5ad, 0xf760, 0xc5ae, 0xf75e, 0xf75d, 0xf762, 0xf763, 0xf846,
+  0xf75f, 0xf8c6, 0xf8c3, 0xf8c4, 0xf8c5, 0xc65c, 0xf951, 0xf950,
+  0xf94f, 0xf970, 0xf9be, 0xf9ab, 0xc66e, 0xa8ad, 0xb060, 0xb8fa,
+  0xbdf6, 0xebc8, 0xc2df, 0xf355, 0xf9ac, 0xa8ae, 0xaaee, 0xad79,
+  0xad78, 0xb063, 0xd3e8, 0xb061, 0xd3e9, 0xb062, 0xd7df, 0xd7db,
+  0xb36d, 0xd7de, 0xd7dd, 0xd7dc, 0xb36e, 0xd7e0, 0xd7e1, 0xdc43,
+  0xdc41, 0xdc45, 0xdc46, 0xdc4c, 0xdc48, 0xdc4a, 0xdc42, 0xdbfc,
+  0xdc49, 0xdc4b, 0xdc44, 0xdc47, 0xdbfd, 0xb662, 0xdc40, 0xdbfe,
+  0xb661, 0xb663, 0xb8fd, 0xe075, 0xe077, 0xe076, 0xe07b, 0xb8fb,
+  0xe078, 0xe074, 0xe079, 0xe07a, 0xb8fc, 0xb8fe, 0xe07c, 0xe467,
+  0xe466, 0xe464, 0xe465, 0xbbb3, 0xbbb5, 0xbbb2, 0xbbb4, 0xe84d,
+  0xe84e, 0xe849, 0xe84a, 0xbdf8, 0xbdfd, 0xbdf7, 0xbdfe, 0xbdf9,
+  0xe84b, 0xe84c, 0xe848, 0xbe40, 0xbdfb, 0xbdfa, 0xbdfc, 0xe847,
+  0xebca, 0xbfe8, 0xebcc, 0xbfea, 0xebcf, 0xebcb, 0xebc9, 0xebce,
+  0xbfe9, 0xebcd, 0xbfe7, 0xc1d3, 0xc1d6, 0xeec1, 0xc1d4, 0xeec0,
+  0xc1d2, 0xc1d5, 0xf146, 0xf147, 0xf148, 0xc2e0, 0xf149, 0xc2e1,
+  0xc3e2, 0xf358, 0xf359, 0xf357, 0xf356, 0xf35a, 0xc3e1, 0xf4dd,
+  0xf4db, 0xf4dc, 0xf4de, 0xf4da, 0xf4df, 0xf658, 0xf659, 0xf657,
+  0xc546, 0xf764, 0xc5af, 0xf765, 0xf848, 0xf847, 0xa8af, 0xb664,
+  0xb940, 0xbbb6, 0xbfec, 0xbfeb, 0xc3e3, 0xc47c, 0xc547, 0xa8b0,
+  0xb064, 0xb941, 0xf35b, 0xcba6, 0xa8b1, 0xa8b4, 0xa8b3, 0xa8b2,
+  0xcba5, 0xcdcd, 0xcdcf, 0xaaef, 0xaaf1, 0xcdcc, 0xcdce, 0xaaf0,
+  0xcdd1, 0xcdd0, 0xcdd2, 0xd0b6, 0xd0b4, 0xad7c, 0xd0b3, 0xada3,
+  0xad7e, 0xad7b, 0xada4, 0xad7d, 0xada2, 0xada1, 0xd0b5, 0xad7a,
+  0xb06a, 0xd3eb, 0xd3f1, 0xb067, 0xb06e, 0xb069, 0xd3ee, 0xd3f0,
+  0xb06c, 0xd3ea, 0xd3ed, 0xb068, 0xb065, 0xd3ec, 0xb06b, 0xd3ef,
+  0xb06d, 0xb066, 0xd7e3, 0xd7e6, 0xb370, 0xb37a, 0xb376, 0xd7e4,
+  0xb37e, 0xb377, 0xb37c, 0xb372, 0xb36f, 0xb371, 0xb37d, 0xd7e5,
+  0xb375, 0xb378, 0xb374, 0xb379, 0xd7e7, 0xb37b, 0xb373, 0xd7e2,
+  0xdc4d, 0xb665, 0xdc4f, 0xb667, 0xb669, 0xdc4e, 0xb666, 0xb66a,
+  0xb668, 0xb947, 0xe0a3, 0xb94f, 0xe07e, 0xb950, 0xb945, 0xe0a1,
+  0xb94a, 0xe0a2, 0xb943, 0xb942, 0xb94d, 0xb94c, 0xb94b, 0xb949,
+  0xb94e, 0xe07d, 0xb944, 0xb946, 0xb948, 0xbbb8, 0xbbbb, 0xbbbf,
+  0xbbb9, 0xbbbe, 0xbbbc, 0xbbb7, 0xbbbd, 0xbbba, 0xe852, 0xbe43,
+  0xbe41, 0xe853, 0xbe44, 0xbe42, 0xe851, 0xe850, 0xbff0, 0xe84f,
+  0xbfee, 0xbfed, 0xebd0, 0xbe45, 0xbfef, 0xebd1, 0xbff2, 0xebd2,
+  0xbff1, 0xc1d8, 0xeec3, 0xc1d7, 0xc1dc, 0xc1da, 0xc1db, 0xc2e3,
+  0xc1d9, 0xeec2, 0xebd3, 0xc2e2, 0xc2e4, 0xc3e4, 0xc3e5, 0xf4e0,
+  0xc5de, 0xc5dd, 0xa8b6, 0xca55, 0xb06f, 0xca52, 0xca53, 0xca51,
+  0xca54, 0xcbaa, 0xcba7, 0xcbac, 0xcba8, 0xa8b7, 0xa8ba, 0xcba9,
+  0xa8b9, 0xcbab, 0xa8b8, 0xcdd5, 0xcdd7, 0xaaf4, 0xcdd3, 0xcdd6,
+  0xcdd4, 0xaaf2, 0xaaf5, 0xaaf3, 0xd0b8, 0xd0bc, 0xd0b9, 0xada7,
+  0xada8, 0xd0bb, 0xd0bd, 0xd0bf, 0xada5, 0xd0be, 0xada6, 0xd7ee,
+  0xd0ba, 0xd3f2, 0xd3fb, 0xd3f9, 0xd3f4, 0xd3f5, 0xd3fa, 0xd3fc,
+  0xb071, 0xd3f7, 0xd3f3, 0xb070, 0xb072, 0xd3f6, 0xd3fd, 0xd3f8,
+  0xb3a1, 0xd7f1, 0xd7e9, 0xd7ef, 0xd7f0, 0xb3a2, 0xd7e8, 0xd7ea,
+  0xd0b7, 0xd7ec, 0xd7ed, 0xd7eb, 0xb66c, 0xdc56, 0xebd4, 0xdc57,
+  0xdc54, 0xb3a3, 0xb66e, 0xdc53, 0xdc59, 0xdc58, 0xb66b, 0xdc5c,
+  0xdc52, 0xdc5b, 0xdc50, 0xdc5a, 0xdc55, 0xb66d, 0xe0aa, 0xe0a5,
+  0xe0ab, 0xe0a6, 0xe0a4, 0xe0a7, 0xb951, 0xe0a9, 0xe0a8, 0xb952,
+  0xbbc1, 0xbbc0, 0xe46e, 0xe471, 0xe469, 0xe46d, 0xbbc2, 0xe46c,
+  0xe46a, 0xe470, 0xe46b, 0xe468, 0xe46f, 0xe859, 0xbe48, 0xf14a,
+  0xe856, 0xe857, 0xe855, 0xdc51, 0xbe47, 0xe85a, 0xe854, 0xbe46,
+  0xbe49, 0xe858, 0xebd5, 0xbff3, 0xebd6, 0xebd7, 0xeec4, 0xc1dd,
+  0xf14b, 0xf14c, 0xf14d, 0xf35d, 0xf35c, 0xf4e2, 0xf4e1, 0xf65b,
+  0xf65c, 0xf65a, 0xf766, 0xc5b0, 0xa8bb, 0xadaa, 0xada9, 0xb075,
+  0xb074, 0xd440, 0xd441, 0xd3fe, 0xb073, 0xd7f5, 0xd7f6, 0xd7f2,
+  0xb3a4, 0xd7f3, 0xd7f4, 0xdc5f, 0xdc61, 0xdc5d, 0xdc60, 0xb66f,
+  0xdc5e, 0xb670, 0xdd73, 0xb955, 0xb954, 0xb953, 0xe0ac, 0xe0ad,
+  0xe473, 0xe475, 0xbbc6, 0xbbc3, 0xbbc5, 0xbbc4, 0xe474, 0xe472,
+  0xe861, 0xe85e, 0xe85f, 0xbe4d, 0xe860, 0xe85b, 0xe85c, 0xbe4a,
+  0xbe4b, 0xe85d, 0xbe4c, 0xebdb, 0xebdc, 0xebd9, 0xebda, 0xbff4,
+  0xebd8, 0xeec8, 0xeec5, 0xeec7, 0xc1e0, 0xeecb, 0xc1df, 0xeec9,
+  0xeecc, 0xeeca, 0xeec6, 0xc1de, 0xf14f, 0xf150, 0xf14e, 0xf152,
+  0xc2e5, 0xc2e6, 0xf35f, 0xc3e7, 0xf151, 0xf35e, 0xc3e6, 0xf4e5,
+  0xf4e6, 0xc4bf, 0xf4e4, 0xf4e3, 0xf65d, 0xc548, 0xf849, 0xf8c8,
+  0xf8c7, 0xc643, 0xc65d, 0xf8c9, 0xf971, 0xc66f, 0xa8bc, 0xaaf6,
+  0xb956, 0xc4c0, 0xa8bd, 0xadab, 0xb3a5, 0xb671, 0xc2e7, 0xaaf7,
+  0xd0c1, 0xd0c0, 0xd442, 0xb078, 0xb076, 0xb07a, 0xd444, 0xb079,
+  0xb077, 0xd443, 0xb3a8, 0xd7fc, 0xb3a7, 0xb3a9, 0xd842, 0xb3ab,
+  0xd7fe, 0xd840, 0xd7f7, 0xb3aa, 0xd843, 0xd7f9, 0xd7fa, 0xd7f8,
+  0xb3a6, 0xd841, 0xd7fb, 0xd7fd, 0xdc6d, 0xdc6c, 0xdc6a, 0xdc62,
+  0xdc71, 0xdc65, 0xdc6f, 0xdc76, 0xdc6e, 0xb679, 0xb675, 0xdc63,
+  0xdc69, 0xb677, 0xdc68, 0xb678, 0xb67a, 0xdc6b, 0xb672, 0xb673,
+  0xdc77, 0xdc75, 0xdc74, 0xdc66, 0xdc72, 0xb676, 0xb674, 0xdc73,
+  0xdc64, 0xdc67, 0xdc70, 0xe4ba, 0xe0b7, 0xe0b0, 0xe0c3, 0xe0cc,
+  0xe0b3, 0xb961, 0xe0c0, 0xb957, 0xb959, 0xb965, 0xe0b1, 0xb95a,
+  0xb95c, 0xb966, 0xb95b, 0xb964, 0xe0b9, 0xe0ae, 0xb962, 0xe0b8,
+  0xb95e, 0xe0ca, 0xb963, 0xe0c8, 0xe0bc, 0xe0c6, 0xb960, 0xe0af,
+  0xe0c9, 0xe0c4, 0xe0cb, 0xb958, 0xb967, 0xb95d, 0xe0b5, 0xe0bd,
+  0xe0c1, 0xe0c5, 0xb95f, 0xe0b4, 0xe0b2, 0xe0be, 0xe0bb, 0xe0ba,
+  0xe0bf, 0xe0c2, 0xe0c7, 0xe478, 0xbbc7, 0xe4a4, 0xe47a, 0xbbcc,
+  0xbbd0, 0xe4ad, 0xe4b5, 0xe4a6, 0xbbc8, 0xe4aa, 0xe0b6, 0xbbc9,
+  0xe4b1, 0xe4b6, 0xe4ae, 0xe4b0, 0xe4b9, 0xe4b2, 0xe47e, 0xe4a9,
+  0xbbd1, 0xbbcd, 0xe47c, 0xe4ab, 0xbbcb, 0xe4a5, 0xbbca, 0xe4b3,
+  0xe4a2, 0xe479, 0xbbce, 0xe4b8, 0xe47b, 0xe4af, 0xe4ac, 0xe4a7,
+  0xe477, 0xe476, 0xe4a1, 0xe4b4, 0xbbcf, 0xe4b7, 0xe47d, 0xe4a3,
+  0xbe52, 0xbe5a, 0xbe55, 0xe8a4, 0xe8a1, 0xe867, 0xbe50, 0xbe4f,
+  0xbe56, 0xe865, 0xbe54, 0xe871, 0xe863, 0xe864, 0xbe4e, 0xe8a3,
+  0xbe58, 0xe874, 0xe879, 0xe873, 0xebee, 0xe86f, 0xe877, 0xe875,
+  0xe868, 0xe862, 0xe87d, 0xbe57, 0xe87e, 0xe878, 0xe86d, 0xe86b,
+  0xe866, 0xe86e, 0xe87b, 0xe86a, 0xe87a, 0xe8a2, 0xbe53, 0xe876,
+  0xe87c, 0xe872, 0xe86c, 0xbe51, 0xe4a8, 0xe870, 0xbe59, 0xe869,
+  0xebf4, 0xbff7, 0xebf3, 0xebf0, 0xec44, 0xbffb, 0xec41, 0xebf8,
+  0xec43, 0xebe9, 0xebf6, 0xbffd, 0xebe1, 0xebdf, 0xec42, 0xec40,
+  0xebfe, 0xebed, 0xebec, 0xebe2, 0xc040, 0xebe8, 0xebf2, 0xebfd,
+  0xc043, 0xec45, 0xc1e8, 0xc045, 0xbffe, 0xebe6, 0xebef, 0xebde,
+  0xebe0, 0xbff5, 0xc042, 0xbffa, 0xebe7, 0xebf7, 0xebf1, 0xc041,
+  0xebdd, 0xc1e3, 0xebf9, 0xebfc, 0xbffc, 0xebeb, 0xc044, 0xbff9,
+  0xbff8, 0xebf5, 0xebfb, 0xbff6, 0xebe4, 0xebfa, 0xebe5, 0xebea,
+  0xeed2, 0xeed7, 0xc1e5, 0xc1e7, 0xeedd, 0xc1e1, 0xeeec, 0xeee3,
+  0xeed8, 0xeed9, 0xeee2, 0xc1ee, 0xeee1, 0xeed1, 0xeee0, 0xeed4,
+  0xeeed, 0xc1ed, 0xc1eb, 0xeed5, 0xeee8, 0xeeda, 0xeee7, 0xeee9,
+  0xeed0, 0xc1e6, 0xeeea, 0xeede, 0xc1ea, 0xeedb, 0xc1ec, 0xeee4,
+  0xc1e4, 0xeed6, 0xeee5, 0xeedf, 0xebe3, 0xeee6, 0xeed3, 0xc1e9,
+  0xeeeb, 0xc1e2, 0xeece, 0xf160, 0xf159, 0xc2e9, 0xf154, 0xf163,
+  0xf15b, 0xeedc, 0xf165, 0xf155, 0xc2e8, 0xf15f, 0xc2ea, 0xc2f2,
+  0xc2f0, 0xf161, 0xc2f1, 0xf157, 0xf158, 0xf15d, 0xf162, 0xeecd,
+  0xc2eb, 0xf16a, 0xf167, 0xf16b, 0xf15e, 0xf15a, 0xf168, 0xf36a,
+  0xf15c, 0xc2ee, 0xc2ed, 0xeecf, 0xc2ef, 0xf164, 0xf166, 0xc2ec,
+  0xf169, 0xf153, 0xf156, 0xf373, 0xf363, 0xc3eb, 0xf371, 0xf361,
+  0xc3ec, 0xf36c, 0xf368, 0xc3f1, 0xf372, 0xf362, 0xf365, 0xc3e9,
+  0xf374, 0xf36d, 0xf370, 0xc3ef, 0xc3f4, 0xc3f2, 0xf369, 0xf364,
+  0xc3ed, 0xc3ee, 0xf360, 0xc3ea, 0xc3e8, 0xc3f0, 0xf36f, 0xc3f3,
+  0xf36b, 0xf375, 0xc3f5, 0xf367, 0xf36e, 0xf4f3, 0xf542, 0xf4f5,
+  0xf4fc, 0xf366, 0xf4fa, 0xf4e9, 0xf540, 0xc4c3, 0xf4ed, 0xf4fe,
+  0xf4f4, 0xc4c2, 0xf544, 0xf4f6, 0xf4fb, 0xf4fd, 0xf4e7, 0xf541,
+  0xf4f2, 0xf4f7, 0xf4eb, 0xf4ef, 0xf543, 0xf4f9, 0xf4e8, 0xf4ec,
+  0xf4ee, 0xf4f8, 0xc4c1, 0xf4f1, 0xf4ea, 0xf4f0, 0xf661, 0xf666,
+  0xc54f, 0xf668, 0xc549, 0xf664, 0xf66a, 0xc54e, 0xc54a, 0xc54b,
+  0xf660, 0xf667, 0xc54d, 0xf665, 0xc54c, 0xf65f, 0xf663, 0xf662,
+  0xf65e, 0xf669, 0xc5b1, 0xf76d, 0xf770, 0xf76c, 0xf76e, 0xf76f,
+  0xf769, 0xf76a, 0xf767, 0xf76b, 0xf768, 0xc5b2, 0xc5b3, 0xf84b,
+  0xf84d, 0xf84c, 0xf84e, 0xc5e0, 0xf84a, 0xc5df, 0xc5e1, 0xf8cb,
+  0xf8cc, 0xc644, 0xf8ca, 0xf953, 0xf952, 0xf954, 0xc65f, 0xf955,
+  0xc65e, 0xf956, 0xf972, 0xf975, 0xf974, 0xc668, 0xf973, 0xc672,
+  0xc670, 0xc671, 0xc677, 0xf9c0, 0xf9c1, 0xf9bf, 0xf9c9, 0xaaf8,
+  0xd844, 0xdc78, 0xe8a5, 0xf376, 0xaaf9, 0xadac, 0xb07b, 0xd845,
+  0xd846, 0xb3ac, 0xb67d, 0xdc7a, 0xdc79, 0xb6a3, 0xb67c, 0xdc7b,
+  0xb67e, 0xb6a2, 0xb6a1, 0xb67b, 0xb968, 0xe0d0, 0xe0ce, 0xe0cf,
+  0xe0cd, 0xbbd2, 0xbbd5, 0xbbd7, 0xbbd6, 0xbbd3, 0xbbd4, 0xe8a7,
+  0xe8a6, 0xbe5b, 0xe8a8, 0xe8a9, 0xbe5c, 0xec4d, 0xec4b, 0xeef3,
+  0xec49, 0xec4a, 0xc046, 0xec46, 0xec4e, 0xec48, 0xec4c, 0xeeef,
+  0xeef1, 0xeef2, 0xc1f3, 0xeeee, 0xc1f2, 0xeef0, 0xc1ef, 0xc1f0,
+  0xc1f1, 0xec47, 0xc2f5, 0xf16e, 0xf16c, 0xf16d, 0xc2f3, 0xc2f6,
+  0xc2f4, 0xf377, 0xf378, 0xc3f6, 0xf545, 0xf547, 0xf546, 0xc4c4,
+  0xc550, 0xf66d, 0xf66c, 0xf66b, 0xaafa, 0xc9aa, 0xca58, 0xa6e9,
+  0xca56, 0xca59, 0xca57, 0xcbae, 0xa8c1, 0xa8c2, 0xcbb0, 0xa8bf,
+  0xcbaf, 0xcbad, 0xa8c0, 0xa8be, 0xcdd8, 0xcddb, 0xaafd, 0xcdda,
+  0xcdd9, 0xaafc, 0xaafb, 0xab40, 0xcddc, 0xaafe, 0xd0c6, 0xadae,
+  0xadaf, 0xadb0, 0xd0c7, 0xd0c3, 0xadad, 0xd0c4, 0xd0c5, 0xd0c2,
+  0xb0a4, 0xb0a1, 0xd445, 0xb0a2, 0xb0a5, 0xd446, 0xb07e, 0xb07c,
+  0xb07d, 0xb0a3, 0xb3ad, 0xd849, 0xb3b5, 0xd848, 0xd84b, 0xb3b1,
+  0xd84a, 0xb6ab, 0xb3af, 0xb3b2, 0xb3ae, 0xb3b3, 0xb3b4, 0xb3b0,
+  0xd847, 0xb6a7, 0xdc7d, 0xdca3, 0xdca2, 0xb6ac, 0xb6a8, 0xb6a9,
+  0xdc7c, 0xdc7e, 0xdca1, 0xb6a4, 0xb6a6, 0xb6aa, 0xb6a5, 0xe0d3,
+  0xe0d1, 0xe0d2, 0xb96a, 0xb96b, 0xe0d4, 0xb969, 0xbbd8, 0xbbda,
+  0xbbd9, 0xe4bb, 0xe4bc, 0xe8ab, 0xe8aa, 0xc047, 0xc048, 0xec4f,
+  0xc049, 0xeef6, 0xeef4, 0xeef5, 0xc1f4, 0xf16f, 0xc3f7, 0xc1f5,
+  0xab41, 0xb0a6, 0xd447, 0xd84c, 0xb3b6, 0xb6ad, 0xdca4, 0xdca6,
+  0xb6af, 0xb6ae, 0xb6b0, 0xb6b1, 0xdca5, 0xb96e, 0xb96f, 0xb96d,
+  0xbbdb, 0xb96c, 0xe0d5, 0xbbdc, 0xe8ac, 0xec50, 0xc04a, 0xc1f6,
+  0xf170, 0xf174, 0xc2f9, 0xf171, 0xc2fa, 0xc2f8, 0xf175, 0xc2fb,
+  0xf173, 0xf379, 0xc2f7, 0xc3f8, 0xf8cd, 0xab42, 0xb3b8, 0xb3b7,
+  0xb6b2, 0xdca8, 0xdca7, 0xb6b3, 0xe0d9, 0xb973, 0xb970, 0xe0d8,
+  0xb972, 0xe0d6, 0xb971, 0xe0d7, 0xe4bd, 0xbbdd, 0xe8af, 0xbe5d,
+  0xe8ad, 0xbe5e, 0xbe5f, 0xe8ae, 0xbe60, 0xec51, 0xc04e, 0xc04b,
+  0xc050, 0xec53, 0xc04c, 0xec52, 0xc04f, 0xc04d, 0xeef9, 0xeefb,
+  0xc1f7, 0xeefa, 0xc1f8, 0xeef8, 0xeef7, 0xf177, 0xf176, 0xc2fc,
+  0xf178, 0xf37e, 0xc3fa, 0xf37d, 0xf37a, 0xc3f9, 0xf37b, 0xf37c,
+  0xf548, 0xf549, 0xc4c5, 0xc553, 0xf66e, 0xc551, 0xc552, 0xf66f,
+  0xc5b4, 0xc5b5, 0xf771, 0xc645, 0xf8cf, 0xc647, 0xf8ce, 0xf8d0,
+  0xc646, 0xf957, 0xf9ad, 0xab43, 0xb974, 0xe4be, 0xe8b0, 0xc051,
+  0xc052, 0xab44, 0xbe61, 0xc3fb, 0xadb1, 0xc053, 0xc5e2, 0xadb2,
+  0xd84d, 0xdca9, 0xdcab, 0xdcaa, 0xe0dd, 0xe0da, 0xb975, 0xb976,
+  0xe0db, 0xe0dc, 0xe4c0, 0xe4c5, 0xbbde, 0xe4bf, 0xe4c1, 0xe4c8,
+  0xe4c3, 0xe4c7, 0xe4c4, 0xe4c2, 0xe4c6, 0xbbdf, 0xe8b3, 0xe8b1,
+  0xbe63, 0xbe62, 0xe8b2, 0xbe64, 0xec56, 0xec55, 0xc054, 0xec54,
+  0xeefc, 0xeefe, 0xef41, 0xef40, 0xc1f9, 0xeefd, 0xf1a1, 0xc2fd,
+  0xf17d, 0xf1a2, 0xc2fe, 0xf17b, 0xf17e, 0xf17c, 0xf179, 0xc340,
+  0xf17a, 0xf3a1, 0xf3a3, 0xf3a2, 0xf54a, 0xf54b, 0xf670, 0xc5b7,
+  0xc5b6, 0xf84f, 0xf850, 0xc648, 0xf8d1, 0xc669, 0xadb3, 0xb6b4,
+  0xe4ca, 0xe4c9, 0xe8b5, 0xe8b4, 0xc1fa, 0xef43, 0xef42, 0xf1a5,
+  0xf1a3, 0xf1a6, 0xf1a4, 0xc3fc, 0xf3a4, 0xf3a5, 0xf3a6, 0xf671,
+  0xf772, 0xf8d2, 0xadb4, 0xec57, 0xef44, 0xadb5, 0xbbe0, 0xec58,
+  0xc341, 0xf1a7, 0xc3fd, 0xf54c, 0xf54d, 0xc554, 0xf851, 0xadb6,
+  0xb3bb, 0xb3bc, 0xd84e, 0xb6b5, 0xb6b6, 0xdcac, 0xb6b7, 0xb97a,
+  0xb97c, 0xe0df, 0xe0e0, 0xe0de, 0xb977, 0xb978, 0xb97b, 0xb979,
+  0xe4cb, 0xbbe1, 0xbbe2, 0xe8bc, 0xbe67, 0xe8b7, 0xe8b6, 0xe8bb,
+  0xbe65, 0xc05b, 0xe8b8, 0xe8bd, 0xe8ba, 0xe8b9, 0xbe66, 0xc059,
+  0xec5a, 0xc055, 0xec5b, 0xec59, 0xc058, 0xc056, 0xc05a, 0xc057,
+  0xef45, 0xef4a, 0xef46, 0xef49, 0xc1fb, 0xedd4, 0xef48, 0xef47,
+  0xc344, 0xc342, 0xc345, 0xc343, 0xf1a8, 0xf1a9, 0xf1aa, 0xc346,
+  0xf3aa, 0xc440, 0xf3a8, 0xc441, 0xf3a7, 0xf3a9, 0xc3fe, 0xf551,
+  0xf54e, 0xf54f, 0xf550, 0xf672, 0xc556, 0xc555, 0xf774, 0xf773,
+  0xc5b8, 0xc5e3, 0xc649, 0xc660, 0xf958, 0xf9ae, 0xf9af, 0xadb7,
+  0xdcad, 0xe0e1, 0xe4cc, 0xe4cd, 0xbbe3, 0xbbe4, 0xe8be, 0xbe68,
+  0xc1fc, 0xf1ab, 0xc347, 0xf3ad, 0xc442, 0xf3ac, 0xf3ae, 0xf3ab,
+  0xf675, 0xf552, 0xf553, 0xc4c6, 0xf674, 0xf673, 0xf775, 0xf9b0,
+  0xadb8, 0xadb9, 0xb0a7, 0xd448, 0xd84f, 0xb6b8, 0xb6bb, 0xb6b9,
+  0xdcae, 0xb6bd, 0xb6ba, 0xb6bc, 0xb97e, 0xe0e2, 0xe0e3, 0xe8c0,
+  0xb97d, 0xb9a1, 0xb9a2, 0xe4cf, 0xe4ce, 0xbbe5, 0xbbe6, 0xe4d0,
+  0xe8bf, 0xbbe8, 0xbe69, 0xbbe7, 0xc05c, 0xe8c1, 0xbe6b, 0xbe6a,
+  0xe8c2, 0xe8c5, 0xe8c3, 0xe8c4, 0xbe6c, 0xc061, 0xc05f, 0xc05e,
+  0xec5d, 0xc060, 0xec5c, 0xef4b, 0xec5e, 0xc05d, 0xec5f, 0xef4e,
+  0xef4c, 0xef4d, 0xef52, 0xc34b, 0xef51, 0xef54, 0xef53, 0xef50,
+  0xef4f, 0xc1fd, 0xf1ae, 0xf1ad, 0xc34a, 0xc348, 0xc349, 0xf1ac,
+  0xf3b1, 0xc443, 0xf3b0, 0xf3af, 0xc444, 0xf558, 0xf557, 0xf555,
+  0xf554, 0xc4c8, 0xc4c7, 0xf559, 0xf776, 0xc5b9, 0xf677, 0xc557,
+  0xf676, 0xf556, 0xf777, 0xc5e4, 0xc661, 0xf959, 0xf9b1, 0xadba,
+  0xd850, 0xef55, 0xadbb, 0xe4d2, 0xe4d1, 0xec60, 0xef57, 0xef56,
+  0xc34c, 0xf3b2, 0xf3b3, 0xc4c9, 0xf9b2, 0xb0a8, 0xb6bf, 0xb6be,
+  0xe0e4, 0xe0e6, 0xb9a4, 0xe0e5, 0xb9a3, 0xb9a5, 0xe0e7, 0xe4d4,
+  0xe4d6, 0xe4d5, 0xe4d8, 0xbbe9, 0xe4d7, 0xe4d3, 0xe4d9, 0xe8cc,
+  0xe8cf, 0xe8d1, 0xe8c7, 0xe8cb, 0xe8c8, 0xbe6e, 0xbe71, 0xbe73,
+  0xe8c9, 0xe8ca, 0xbe72, 0xe8cd, 0xe8d0, 0xe8ce, 0xbe74, 0xbe70,
+  0xe8c6, 0xbe6d, 0xbe6f, 0xc063, 0xec66, 0xec64, 0xec63, 0xec69,
+  0xec68, 0xec67, 0xec62, 0xc062, 0xec61, 0xec65, 0xc064, 0xef5a,
+  0xef5e, 0xef5b, 0xef5d, 0xef5c, 0xef59, 0xef5f, 0xef62, 0xef60,
+  0xef61, 0xc240, 0xc1fe, 0xef58, 0xef63, 0xf1b3, 0xf1b6, 0xf1b8,
+  0xf1b7, 0xf1b1, 0xf1b5, 0xf1b0, 0xf1b2, 0xc34d, 0xf1af, 0xf1b4,
+  0xf3c0, 0xf3b5, 0xc445, 0xc446, 0xf3b4, 0xf3b9, 0xf3bf, 0xf3b7,
+  0xf3be, 0xf3bb, 0xf3ba, 0xf3bd, 0xf3b8, 0xf3b6, 0xf3bc, 0xf560,
+  0xf55e, 0xc4ca, 0xf55d, 0xf563, 0xf561, 0xc4cb, 0xf55c, 0xf55a,
+  0xf55b, 0xc4cd, 0xf55f, 0xc4cc, 0xf562, 0xf678, 0xf67e, 0xf679,
+  0xc55b, 0xf6a1, 0xc55a, 0xf67d, 0xf67c, 0xc559, 0xf67b, 0xc558,
+  0xf67a, 0xf77d, 0xf7a1, 0xf77e, 0xf77b, 0xc5bb, 0xf778, 0xf77c,
+  0xf7a3, 0xf7a2, 0xf779, 0xf77a, 0xc5ba, 0xf852, 0xc5e7, 0xf853,
+  0xc5e5, 0xc5e6, 0xf8d3, 0xc64a, 0xf976, 0xc66a, 0xf9b3, 0xc66b,
+  0xf9b4, 0xf9b5, 0xf9c3, 0xf9c2, 0xc67a, 0xf9cd, 0xb0a9, 0xe0e9,
+  0xe0e8, 0xbbea, 0xbbeb, 0xe4da, 0xe8d2, 0xec6c, 0xbe75, 0xc065,
+  0xec6a, 0xec6d, 0xc066, 0xef64, 0xec6b, 0xf1b9, 0xc34e, 0xf3c1,
+  0xf566, 0xf564, 0xf565, 0xf6a2, 0xc55c, 0xf7a4, 0xc5ea, 0xc5bc,
+  0xc5e8, 0xc5e9, 0xf8d4, 0xc662, 0xb0aa, 0xf1ba, 0xd449, 0xb9a6,
+  0xe4db, 0xbbec, 0xe4dc, 0xe8d4, 0xe8d3, 0xc068, 0xbe76, 0xbe77,
+  0xe8d7, 0xe8d6, 0xe8d5, 0xec6e, 0xec71, 0xec70, 0xec6f, 0xc067,
+  0xef68, 0xef66, 0xef65, 0xef67, 0xc34f, 0xf1bc, 0xf1bd, 0xc350,
+  0xf1bb, 0xf3c3, 0xf3c2, 0xf3c5, 0xc447, 0xf3c4, 0xf567, 0xf569,
+  0xf568, 0xf6a3, 0xf6a6, 0xf6a4, 0xf6a5, 0xf7a5, 0xc5bd, 0xf854,
+  0xf855, 0xf856, 0xc64b, 0xc663, 0xf9b6, 0xb0ab, 0xbe78, 0xc069,
+  0xf1be, 0xf7a6, 0xf9c4, 0xd44a, 0xc67b, 0xb0ac, 0xec72, 0xf1bf,
+  0xf3c6, 0xf6a7, 0xf7a7, 0xb0ad, 0xe4dd, 0xe4de, 0xbbed, 0xbbee,
+  0xe8d9, 0xbe7a, 0xbe79, 0xe8d8, 0xef69, 0xf1c0, 0xf1c2, 0xf1c1,
+  0xc353, 0xc352, 0xc351, 0xc55e, 0xf6a8, 0xc55d, 0xf7a9, 0xf7a8,
+  0xc64c, 0xf8d5, 0xb3bd, 0xe0ea, 0xe4e1, 0xe4df, 0xe4e0, 0xe8e2,
+  0xe8dd, 0xe8da, 0xe8e1, 0xe8e3, 0xbe7c, 0xe8e0, 0xe8dc, 0xe8db,
+  0xe8df, 0xe8de, 0xbe7b, 0xec7d, 0xec78, 0xec76, 0xeca1, 0xec77,
+  0xec73, 0xec79, 0xec74, 0xef72, 0xec75, 0xeca2, 0xec7c, 0xc06a,
+  0xec7b, 0xec7a, 0xec7e, 0xef6a, 0xef6d, 0xef6c, 0xef74, 0xef6f,
+  0xef73, 0xef71, 0xef70, 0xef6e, 0xef6b, 0xc243, 0xc242, 0xc244,
+  0xc241, 0xef75, 0xf1c8, 0xf1cb, 0xf1c9, 0xf1cd, 0xf1ce, 0xf1c6,
+  0xc358, 0xf1c7, 0xf1c5, 0xf1cc, 0xf1c4, 0xf1c3, 0xc357, 0xc355,
+  0xc354, 0xf1ca, 0xf3cf, 0xf3d5, 0xc44a, 0xf3d0, 0xf3d3, 0xf3d7,
+  0xc44b, 0xf3d2, 0xf3ca, 0xf3c9, 0xf3d6, 0xf3cd, 0xf3cb, 0xf3d4,
+  0xf3cc, 0xc449, 0xc448, 0xf3c7, 0xf3c8, 0xf3d1, 0xf3ce, 0xf56c,
+  0xf56f, 0xc356, 0xf56d, 0xf573, 0xf571, 0xf56b, 0xf576, 0xf56a,
+  0xc4cf, 0xf572, 0xf56e, 0xc4ce, 0xf575, 0xf574, 0xf6ab, 0xf6aa,
+  0xf6b1, 0xf6ad, 0xf6b0, 0xc560, 0xf6ae, 0xf6af, 0xf6a9, 0xf6ac,
+  0xc55f, 0xc5bf, 0xf7b4, 0xf7af, 0xf7b3, 0xf7b6, 0xf7b2, 0xf7ae,
+  0xc5c1, 0xf7b1, 0xf7b5, 0xc5c0, 0xf7ac, 0xf570, 0xf7b0, 0xf7ad,
+  0xf7aa, 0xf7ab, 0xc5be, 0xf85a, 0xf85c, 0xf85f, 0xf85b, 0xf860,
+  0xf859, 0xf857, 0xc5eb, 0xf85d, 0xc5ed, 0xc5ec, 0xf858, 0xf85e,
+  0xf8da, 0xc64d, 0xf8db, 0xf8d9, 0xf8d6, 0xf8d8, 0xf8d7, 0xf95a,
+  0xf95c, 0xf95b, 0xf979, 0xf978, 0xf977, 0xf97a, 0xc673, 0xc674,
+  0xf9ca, 0xf9ce, 0xb3be, 0xdcaf, 0xe0ed, 0xb9a7, 0xe0eb, 0xe0ec,
+  0xe4e2, 0xe4e3, 0xbbf1, 0xbbef, 0xe4e4, 0xbbf0, 0xe8e8, 0xe8eb,
+  0xe8e5, 0xe8ec, 0xe8e4, 0xe8e6, 0xe8e7, 0xe8ea, 0xbea1, 0xe8ef,
+  0xe8ee, 0xbe7d, 0xe8e9, 0xe8ed, 0xbe7e, 0xecac, 0xc06f, 0xeca7,
+  0xc06b, 0xeca4, 0xecaa, 0xecad, 0xc070, 0xeca9, 0xeca6, 0xecae,
+  0xeca5, 0xecab, 0xc06c, 0xeca3, 0xc06d, 0xc06e, 0xeca8, 0xefa9,
+  0xef7a, 0xef7b, 0xef7e, 0xef7c, 0xef76, 0xef79, 0xefa5, 0xef7d,
+  0xc245, 0xefa7, 0xefa4, 0xc246, 0xefa6, 0xef77, 0xefa2, 0xefa3,
+  0xefa1, 0xf1d2, 0xf1d4, 0xf1d7, 0xf1d1, 0xc359, 0xf1d9, 0xf1d0,
+  0xf1da, 0xf1d6, 0xf1d8, 0xf1dc, 0xf1d5, 0xf1dd, 0xf1d3, 0xf1cf,
+  0xc35a, 0xf1db, 0xc35b, 0xc44d, 0xef78, 0xf3f1, 0xf3e8, 0xc44f,
+  0xf3e4, 0xc450, 0xf3ed, 0xf3e7, 0xf3dd, 0xc44e, 0xf3ea, 0xf3e5,
+  0xf3e6, 0xf3d8, 0xf3df, 0xf3ee, 0xf3eb, 0xf3e3, 0xf3ef, 0xf3de,
+  0xf3d9, 0xf3ec, 0xf3db, 0xf3e9, 0xf3e0, 0xf3f0, 0xf3dc, 0xc44c,
+  0xf3da, 0xf3e1, 0xf3e2, 0xf57d, 0xf57b, 0xf5a2, 0xf5ae, 0xf5a5,
+  0xf57c, 0xf578, 0xf5a7, 0xf57e, 0xf5a3, 0xf57a, 0xf5aa, 0xf577,
+  0xf5a1, 0xf5a6, 0xf5a8, 0xf5ab, 0xf579, 0xf5af, 0xf5b0, 0xf5a9,
+  0xf5ad, 0xf5a4, 0xf6c1, 0xf6c4, 0xc561, 0xf6c3, 0xf6c8, 0xf6c6,
+  0xc562, 0xf6bd, 0xf6b3, 0xf6b2, 0xc564, 0xf6bf, 0xf6c0, 0xf6bc,
+  0xf6b4, 0xf6b9, 0xf5ac, 0xf6b5, 0xc563, 0xf6bb, 0xf6ba, 0xf6b6,
+  0xf6c2, 0xf6b7, 0xf7bb, 0xf6c5, 0xf6c7, 0xf6be, 0xf6b8, 0xf7bc,
+  0xf7be, 0xf7b8, 0xc5c2, 0xf7c5, 0xf7c3, 0xc5c3, 0xf7c2, 0xf7c1,
+  0xf7ba, 0xf7b7, 0xf7bd, 0xf7c6, 0xf7b9, 0xf7bf, 0xf869, 0xf86e,
+  0xf864, 0xf867, 0xc5ee, 0xf86b, 0xf872, 0xf7c0, 0xf865, 0xf86f,
+  0xf873, 0xf86a, 0xf863, 0xf86d, 0xf86c, 0xf871, 0xf870, 0xf7c4,
+  0xf868, 0xf862, 0xf866, 0xc64e, 0xc64f, 0xf861, 0xf8e6, 0xf8dd,
+  0xf8e5, 0xf8e2, 0xf8e3, 0xf8dc, 0xf8df, 0xf8e7, 0xf8e1, 0xf8e0,
+  0xf8de, 0xf8e4, 0xf95d, 0xf95e, 0xf960, 0xf95f, 0xf962, 0xf961,
+  0xf97c, 0xf97b, 0xf9b7, 0xf9b8, 0xf9c5, 0xc678, 0xc67c, 0xf9cf,
+  0xc67d, 0xb3bf, 0xc4d0, 0xf6c9, 0xc650, 0xc651, 0xb3c0, 0xe0ee,
+  0xb9a8, 0xe8f0, 0xecb0, 0xecb1, 0xecaf, 0xefab, 0xefaa, 0xc247,
+  0xf1df, 0xefac, 0xf1de, 0xf3f3, 0xc451, 0xc453, 0xf3f2, 0xc452,
+  0xf5b1, 0xf5b3, 0xf5b2, 0xf6ca, 0xc565, 0xc5ef, 0xf8e8, 0xf963,
+  0xf9d2, 0xb3c1, 0xe4e5, 0xbea2, 0xecb3, 0xecb2, 0xefad, 0xc454,
+  0xc4d1, 0xf7c7, 0xf9cb, 0xb3c2, 0xbbf2, 0xbea3, 0xf3f4, 0xf874,
+  0xb6c0, 0xefae, 0xc664, 0xb6c1, 0xbea4, 0xc248, 0xf875, 0xb6c2,
+  0xe8f1, 0xc072, 0xecb4, 0xecb5, 0xc071, 0xefaf, 0xc24c, 0xc24a,
+  0xc24b, 0xc249, 0xf1e0, 0xc35c, 0xf5b5, 0xf5b4, 0xf5b7, 0xf5b6,
+  0xc4d2, 0xf6cb, 0xf6cd, 0xf6cc, 0xc566, 0xf7c8, 0xf876, 0xf877,
+  0xc5f0, 0xf964, 0xf97d, 0xc675, 0xdcb0, 0xecb6, 0xefb0, 0xf3f5,
+  0xe0ef, 0xefb1, 0xf1e2, 0xf1e1, 0xf878, 0xc652, 0xf965, 0xf97e,
+  0xb9a9, 0xe8f2, 0xe8f3, 0xecb7, 0xb9aa, 0xc35d, 0xf1e3, 0xf6cf,
+  0xc567, 0xf6d0, 0xf6ce, 0xf879, 0xf8e9, 0xb9ab, 0xefb4, 0xefb3,
+  0xefb2, 0xf1e4, 0xf1e8, 0xf1e7, 0xf1e6, 0xf1e5, 0xc35e, 0xf3f6,
+  0xf5b9, 0xc4d3, 0xf5b8, 0xf6d1, 0xf7cb, 0xf7ca, 0xc5c4, 0xf7c9,
+  0xf87c, 0xf87b, 0xf87a, 0xbbf3, 0xecb8, 0xc24d, 0xf3f7, 0xf3f8,
+  0xf7cc, 0xf87d, 0xf8ea, 0xf966, 0xf9b9, 0xf9d4, 0xbbf4, 0xc24e,
+  0xf1e9, 0xf3f9, 0xf6d2, 0xf87e, 0xbea6, 0xefb5, 0xf1ea, 0xf3fa,
+  0xf3fb, 0xf3fc, 0xf5be, 0xf5ba, 0xc568, 0xf5bd, 0xf5bc, 0xc4d4,
+  0xf5bb, 0xc4d6, 0xc4d5, 0xf6d4, 0xf6d3, 0xc569, 0xc56a, 0xc5c6,
+  0xf7cd, 0xc5c5, 0xf8a3, 0xf8a4, 0xf8a2, 0xf8a1, 0xc654, 0xf8eb,
+  0xf8ec, 0xf8ed, 0xc653, 0xf967, 0xf96a, 0xf969, 0xf968, 0xf9d3,
+  0xc073, 0xc365, 0xf5bf, 0xf6d5, 0xc5c7, 0xf7ce, 0xf9d5, 0xc074,
+  0xefb6, 0xf7cf, 0xf9a1, 0xc94a, 0xddfc, 0xa14a, 0xa157, 0xa159,
+  0xa15b, 0xa15f, 0xa160, 0xa163, 0xa164, 0xa167, 0xa168, 0xa16b,
+  0xa16c, 0xa16f, 0xa170, 0xa173, 0xa174, 0xa177, 0xa178, 0xa17b,
+  0xa17c, 0xa1c6, 0xa1c7, 0xa1ca, 0xa1cb, 0xa1c8, 0xa1c9, 0xa15c,
+  0xa14d, 0xa14f, 0xa151, 0xa152, 0xa153, 0xa154, 0xa17d, 0xa17e,
+  0xa1a1, 0xa1a2, 0xa1a3, 0xa1a4, 0xa1cc, 0xa1cd, 0xa1ce, 0xa1de,
+  0xa1df, 0xa1e0, 0xa1e1, 0xa1e2, 0xa24c, 0xa24d, 0xa24e, 0xa149,
+  0xa1ad, 0xa243, 0xa248, 0xa1ae, 0xa15d, 0xa15e, 0xa1af, 0xa1cf,
+  0xa141, 0xa1d0, 0xa144, 0xa241, 0xa2af, 0xa2b0, 0xa2b1, 0xa2b2,
+  0xa2b3, 0xa2b4, 0xa2b5, 0xa2b6, 0xa2b7, 0xa2b8, 0xa147, 0xa146,
+  0xa1d5, 0xa1d7, 0xa1d6, 0xa148, 0xa249, 0xa2cf, 0xa2d0, 0xa2d1,
+  0xa2d2, 0xa2d3, 0xa2d4, 0xa2d5, 0xa2d6, 0xa2d7, 0xa2d8, 0xa2d9,
+  0xa2da, 0xa2db, 0xa2dc, 0xa2dd, 0xa2de, 0xa2df, 0xa2e0, 0xa2e1,
+  0xa2e2, 0xa2e3, 0xa2e4, 0xa2e5, 0xa2e6, 0xa2e7, 0xa2e8, 0xa242,
+  0xa1c4, 0xa2e9, 0xa2ea, 0xa2eb, 0xa2ec, 0xa2ed, 0xa2ee, 0xa2ef,
+  0xa2f0, 0xa2f1, 0xa2f2, 0xa2f3, 0xa2f4, 0xa2f5, 0xa2f6, 0xa2f7,
+  0xa2f8, 0xa2f9, 0xa2fa, 0xa2fb, 0xa2fc, 0xa2fd, 0xa2fe, 0xa340,
+  0xa341, 0xa342, 0xa343, 0xa161, 0xa155, 0xa162, 0xa14e,
+};
+
+static const Summary16 big5_uni2indx_page00[16] = {
+  /* 0x0000 */
+  {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 },
+  {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 },
+  {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x00ac }, {    4, 0x0083 },
+  {    7, 0x0000 }, {    7, 0x0080 }, {    8, 0x0000 }, {    8, 0x0080 },
+};
+static const Summary16 big5_uni2indx_page02[38] = {
+  /* 0x0200 */
+  {    9, 0x0000 }, {    9, 0x0000 }, {    9, 0x0000 }, {    9, 0x0000 },
+  {    9, 0x0000 }, {    9, 0x0000 }, {    9, 0x0000 }, {    9, 0x0000 },
+  {    9, 0x0000 }, {    9, 0x0000 }, {    9, 0x0000 }, {    9, 0x0000 },
+  {    9, 0x0e80 }, {   13, 0x0200 }, {   14, 0x0000 }, {   14, 0x0000 },
+  /* 0x0300 */
+  {   14, 0x0000 }, {   14, 0x0000 }, {   14, 0x0000 }, {   14, 0x0000 },
+  {   14, 0x0000 }, {   14, 0x0000 }, {   14, 0x0000 }, {   14, 0x0000 },
+  {   14, 0x0000 }, {   14, 0xfffe }, {   29, 0x03fb }, {   38, 0xfffe },
+  {   53, 0x03fb }, {   62, 0x0000 }, {   62, 0x0000 }, {   62, 0x0000 },
+  /* 0x0400 */
+  {   62, 0x0002 }, {   63, 0x1ff0 }, {   72, 0xfff8 }, {   85, 0xffff },
+  {  101, 0xffff }, {  117, 0x0002 },
+};
+static const Summary16 big5_uni2indx_page20[44] = {
+  /* 0x2000 */
+  {  118, 0x0000 }, {  118, 0x3318 }, {  124, 0x0064 }, {  127, 0x4824 },
+  {  131, 0x0000 }, {  131, 0x0000 }, {  131, 0x0000 }, {  131, 0x0000 },
+  {  131, 0x0000 }, {  131, 0x0000 }, {  131, 0x0000 }, {  131, 0x0000 },
+  {  131, 0x0000 }, {  131, 0x0000 }, {  131, 0x0000 }, {  131, 0x0000 },
+  /* 0x2100 */
+  {  131, 0x0228 }, {  134, 0x0000 }, {  134, 0x0000 }, {  134, 0x0000 },
+  {  134, 0x0000 }, {  134, 0x0000 }, {  134, 0x03ff }, {  144, 0x0000 },
+  {  144, 0x0000 }, {  144, 0x03cf }, {  152, 0x0000 }, {  152, 0x0000 },
+  {  152, 0x0000 }, {  152, 0x0000 }, {  152, 0x0000 }, {  152, 0x0000 },
+  /* 0x2200 */
+  {  152, 0x0000 }, {  152, 0xc400 }, {  155, 0x4e29 }, {  162, 0x1030 },
+  {  165, 0x0000 }, {  165, 0x0004 }, {  166, 0x00c3 }, {  170, 0x0000 },
+  {  170, 0x0000 }, {  170, 0x0000 }, {  170, 0x0020 }, {  171, 0x8000 },
+};
+static const Summary16 big5_uni2indx_page24[37] = {
+  /* 0x2400 */
+  {  172, 0x0000 }, {  172, 0x0000 }, {  172, 0x0000 }, {  172, 0x0000 },
+  {  172, 0x0000 }, {  172, 0x0000 }, {  172, 0x03ff }, {  182, 0x3ff0 },
+  {  192, 0x0000 }, {  192, 0x0000 }, {  192, 0x0000 }, {  192, 0x0000 },
+  {  192, 0x0000 }, {  192, 0x0000 }, {  192, 0x0000 }, {  192, 0x0000 },
+  /* 0x2500 */
+  {  192, 0x1005 }, {  195, 0x1111 }, {  199, 0x1010 }, {  201, 0x1010 },
+  {  203, 0x0000 }, {  203, 0x4001 }, {  205, 0xe402 }, {  210, 0x000f },
+  {  214, 0xfffe }, {  229, 0x0030 }, {  231, 0x0003 }, {  233, 0x300c },
+  {  237, 0xc8c0 }, {  242, 0x0000 }, {  242, 0x003c }, {  246, 0x0000 },
+  /* 0x2600 */
+  {  246, 0x0260 }, {  249, 0x0000 }, {  249, 0x0000 }, {  249, 0x0000 },
+  {  249, 0x0007 },
+};
+static const Summary16 big5_uni2indx_page30[62] = {
+  /* 0x3000 */
+  {  252, 0xff2f }, {  265, 0x6037 }, {  272, 0x03fe }, {  281, 0x0000 },
+  {  281, 0xfffe }, {  296, 0xffff }, {  312, 0xffff }, {  328, 0xffff },
+  {  344, 0xffff }, {  360, 0x600f }, {  366, 0xfffe }, {  381, 0xffff },
+  {  397, 0xffff }, {  413, 0xffff }, {  429, 0xffff }, {  445, 0x407f },
+  /* 0x3100 */
+  {  453, 0xffe0 }, {  464, 0xffff }, {  480, 0x03ff }, {  490, 0x0000 },
+  {  490, 0x0000 }, {  490, 0x0000 }, {  490, 0x0000 }, {  490, 0x0000 },
+  {  490, 0x0000 }, {  490, 0x0000 }, {  490, 0x0000 }, {  490, 0x0000 },
+  {  490, 0x0000 }, {  490, 0x0000 }, {  490, 0x0000 }, {  490, 0x0000 },
+  /* 0x3200 */
+  {  490, 0x0000 }, {  490, 0x0000 }, {  490, 0x0000 }, {  490, 0x0000 },
+  {  490, 0x0000 }, {  490, 0x0000 }, {  490, 0x0000 }, {  490, 0x0000 },
+  {  490, 0x0000 }, {  490, 0x0000 }, {  490, 0x0008 }, {  491, 0x0000 },
+  {  491, 0x0000 }, {  491, 0x0000 }, {  491, 0x0000 }, {  491, 0x0000 },
+  /* 0x3300 */
+  {  491, 0x0000 }, {  491, 0x0000 }, {  491, 0x0000 }, {  491, 0x0000 },
+  {  491, 0x0000 }, {  491, 0x0000 }, {  491, 0x0000 }, {  491, 0x0000 },
+  {  491, 0xc000 }, {  493, 0x7000 }, {  496, 0x0002 }, {  497, 0x0000 },
+  {  497, 0x4010 }, {  499, 0x0026 },
+};
+static const Summary16 big5_uni2indx_page4e[1307] = {
+  /* 0x4e00 */
+  {  502, 0xff8b }, {  514, 0xc373 }, {  523, 0x6840 }, {  527, 0x1b0f },
+  {  535, 0xe9ac }, {  544, 0xf34c }, {  553, 0x0200 }, {  554, 0xc008 },
+  {  557, 0x795c }, {  566, 0xca3e }, {  575, 0x7976 }, {  585, 0x0648 },
+  {  589, 0x2fdf }, {  601, 0xf7f0 }, {  612, 0x033a }, {  618, 0xa8ff },
+  /* 0x4f00 */
+  {  629, 0xef37 }, {  641, 0x233f }, {  650, 0xb004 }, {  654, 0xfd59 },
+  {  665, 0xf3ca }, {  675, 0xffff }, {  691, 0xde9f }, {  703, 0xfff9 },
+  {  717, 0xabff }, {  730, 0x7df7 }, {  743, 0xc000 }, {  745, 0x8eec },
+  {  754, 0xeebf }, {  767, 0xffdb }, {  781, 0xd003 }, {  786, 0x45fa },
+  /* 0x5000 */
+  {  795, 0xfae1 }, {  805, 0xdffe }, {  819, 0xbfef }, {  833, 0x10ab },
+  {  839, 0xffeb }, {  853, 0xfcaa }, {  863, 0xef3f }, {  876, 0x24fd },
+  {  885, 0x78ad }, {  894, 0x7f76 }, {  906, 0xf00c }, {  912, 0xedff },
+  {  926, 0xcff6 }, {  938, 0x2cfa }, {  947, 0xf7f9 }, {  960, 0xeb6b },
+  /* 0x5100 */
+  {  971, 0x1ffd }, {  983, 0x95bf }, {  994, 0x6677 }, { 1004, 0xbfbf },
+  { 1018, 0x3bfb }, { 1030, 0xfeb4 }, { 1041, 0x7bae }, { 1052, 0x11e2 },
+  { 1058, 0xa681 }, { 1064, 0x41be }, { 1072, 0x1435 }, { 1078, 0x72c3 },
+  { 1086, 0x7d70 }, { 1095, 0x7191 }, { 1102, 0x0003 }, { 1104, 0x276b },
+  /* 0x5200 */
+  { 1113, 0x57cb }, { 1123, 0x70cf }, { 1132, 0x4732 }, { 1139, 0x0def },
+  { 1149, 0x7eda }, { 1160, 0xfc74 }, { 1170, 0xfe06 }, { 1179, 0xbdb4 },
+  { 1189, 0x3f9f }, { 1201, 0x8bca }, { 1209, 0x7e49 }, { 1218, 0x5800 },
+  { 1221, 0x228f }, { 1228, 0xebec }, { 1239, 0x8a5c }, { 1246, 0xddbb },
+  /* 0x5300 */
+  { 1258, 0xef60 }, { 1267, 0xb6e7 }, { 1278, 0xa40f }, { 1285, 0xf293 },
+  { 1294, 0x37bb }, { 1305, 0x549e }, { 1313, 0xd04b }, { 1320, 0x9baf },
+  { 1331, 0xc414 }, { 1336, 0xf7d4 }, { 1347, 0x30b0 }, { 1352, 0x0a14 },
+  { 1356, 0x2f08 }, { 1362, 0x88d0 }, { 1367, 0xff7e }, { 1381, 0x192f },
+  /* 0x5400 */
+  { 1389, 0xffda }, { 1402, 0xfb07 }, { 1412, 0x7ff1 }, { 1424, 0x7beb },
+  { 1436, 0xc5ef }, { 1447, 0x0010 }, { 1448, 0x99ff }, { 1460, 0xfdff },
+  { 1475, 0x79d7 }, { 1486, 0x0567 }, { 1493, 0xffe7 }, { 1507, 0xfdcb },
+  { 1519, 0xc3ff }, { 1531, 0x4040 }, { 1533, 0x6ff7 }, { 1546, 0xbd8e },
+  /* 0x5500 */
+  { 1556, 0xdffa }, { 1569, 0x0497 }, { 1575, 0xf4c0 }, { 1582, 0x5bff },
+  { 1595, 0xed7b }, { 1607, 0xd0e7 }, { 1616, 0x047e }, { 1623, 0xf8e0 },
+  { 1631, 0xff9f }, { 1645, 0xb73e }, { 1656, 0x7dfe }, { 1669, 0x882e },
+  { 1675, 0xfffd }, { 1690, 0xbe7f }, { 1703, 0x83fe }, { 1713, 0xf6c4 },
+  /* 0x5600 */
+  { 1722, 0xf357 }, { 1733, 0xb8fd }, { 1744, 0xd680 }, { 1750, 0xef7d },
+  { 1763, 0x5767 }, { 1773, 0x4788 }, { 1779, 0xff7d }, { 1793, 0xc3df },
+  { 1804, 0xf0ff }, { 1816, 0x37a9 }, { 1825, 0x7de0 }, { 1834, 0x70fc },
+  { 1843, 0x3f6f }, { 1855, 0xec9a }, { 1864, 0x4cb3 }, { 1872, 0x8681 },
+  /* 0x5700 */
+  { 1877, 0x3f9e }, { 1888, 0xdd5c }, { 1898, 0xf70d }, { 1908, 0x4819 },
+  { 1913, 0xfea3 }, { 1924, 0x0007 }, { 1927, 0xaf56 }, { 1937, 0x38ff },
+  { 1948, 0x980d }, { 1954, 0xefb8 }, { 1965, 0x403d }, { 1971, 0xb760 },
+  { 1979, 0xd8ce }, { 1988, 0x9035 }, { 1994, 0x72bf }, { 2005, 0x3fff },
+  /* 0x5800 */
+  { 2019, 0x7ff7 }, { 2033, 0x7a11 }, { 2040, 0xf7bb }, { 2053, 0xabff },
+  { 2066, 0xff00 }, { 2074, 0x6fbe }, { 2086, 0xa93c }, { 2094, 0xfe72 },
+  { 2105, 0xcfef }, { 2118, 0xf11b }, { 2127, 0xdb6b }, { 2138, 0xf40a },
+  { 2145, 0xc3e6 }, { 2154, 0xef7e }, { 2167, 0x9b9c }, { 2176, 0xf610 },
+  /* 0x5900 */
+  { 2183, 0xf048 }, { 2189, 0x16f4 }, { 2197, 0xfeb5 }, { 2209, 0x5182 },
+  { 2214, 0xc7b1 }, { 2223, 0x15bb }, { 2232, 0x6e87 }, { 2241, 0xfbdf },
+  { 2255, 0xe43f }, { 2265, 0x63cd }, { 2274, 0xc1ff }, { 2285, 0x7e7e },
+  { 2297, 0xfdeb }, { 2310, 0x7d5f }, { 2322, 0x777b }, { 2334, 0xfcfe },
+  /* 0x5a00 */
+  { 2347, 0x960b }, { 2354, 0xdbea }, { 2365, 0x6229 }, { 2371, 0x53e8 },
+  { 2379, 0x37df }, { 2391, 0xfdef }, { 2405, 0x36f5 }, { 2415, 0xbd81 },
+  { 2423, 0xdc18 }, { 2430, 0xfcbd }, { 2442, 0xd2e4 }, { 2450, 0xffff },
+  { 2466, 0x3fd7 }, { 2478, 0xffe0 }, { 2489, 0x7f6f }, { 2502, 0xabf8 },
+  /* 0x5b00 */
+  { 2512, 0x9bae }, { 2522, 0x6ed9 }, { 2532, 0xf5fb }, { 2545, 0xf115 },
+  { 2553, 0x79a9 }, { 2562, 0xbdfb }, { 2575, 0x5a3c }, { 2583, 0xadaf },
+  { 2594, 0xdbba }, { 2605, 0x1fac }, { 2614, 0x71fc }, { 2624, 0x8379 },
+  { 2632, 0x7cf7 }, { 2644, 0xc35f }, { 2654, 0xdfff }, { 2669, 0x0567 },
+  /* 0x5c00 */
+  { 2676, 0xff9a }, { 2688, 0x8467 }, { 2695, 0x1534 }, { 2701, 0xdf8b },
+  { 2712, 0xf9f3 }, { 2724, 0x3373 }, { 2733, 0xf7bd }, { 2746, 0x5e1a },
+  { 2754, 0xbf40 }, { 2762, 0xa03f }, { 2770, 0xffff }, { 2786, 0x01eb },
+  { 2793, 0xdfc0 }, { 2802, 0xcfdd }, { 2814, 0x7500 }, { 2819, 0xabd3 },
+  /* 0x5d00 */
+  { 2829, 0xf8c3 }, { 2838, 0xeed6 }, { 2849, 0x43fd }, { 2859, 0xb7ff },
+  { 2873, 0x5eaf }, { 2884, 0x4227 }, { 2890, 0x9bac }, { 2899, 0xf686 },
+  { 2908, 0x27d7 }, { 2918, 0xf6bc }, { 2929, 0xf787 }, { 2940, 0x35b7 },
+  { 2950, 0xaacd }, { 2959, 0xe176 }, { 2968, 0x49e7 }, { 2977, 0xe29f },
+  /* 0x5e00 */
+  { 2987, 0x545c }, { 2994, 0xaff2 }, { 3005, 0x2b3f }, { 3015, 0x61d8 },
+  { 3022, 0xfc3b }, { 3033, 0xbbb8 }, { 3043, 0xffcf }, { 3057, 0x7b7d },
+  { 3069, 0xbf95 }, { 3080, 0x1ce0 }, { 3086, 0x7dfd }, { 3099, 0x43ff },
+  { 3110, 0x5ff6 }, { 3122, 0xfffe }, { 3137, 0xd3ef }, { 3149, 0xc4ce },
+  /* 0x5f00 */
+  { 3157, 0x8db6 }, { 3166, 0xadbc }, { 3176, 0x63dc }, { 3185, 0x11eb },
+  { 3193, 0xdf59 }, { 3204, 0x23d0 }, { 3210, 0xbeb4 }, { 3220, 0xf3db },
+  { 3232, 0x1fe7 }, { 3243, 0xdbc7 }, { 3254, 0xff63 }, { 3266, 0xfae4 },
+  { 3276, 0xb22b }, { 3284, 0x63f7 }, { 3295, 0xed3b }, { 3306, 0xadba },
+  /* 0x6000 */
+  { 3316, 0xfe01 }, { 3324, 0x7eff }, { 3338, 0xfff7 }, { 3353, 0x02bc },
+  { 3359, 0x32ff }, { 3370, 0xef39 }, { 3381, 0xfffc }, { 3395, 0x8005 },
+  { 3398, 0x77fb }, { 3411, 0xbcf5 }, { 3422, 0x010d }, { 3426, 0xfff7 },
+  { 3441, 0xfffb }, { 3456, 0xbf3a }, { 3467, 0x0057 }, { 3472, 0xdfff },
+  /* 0x6100 */
+  { 3487, 0xef7b }, { 3500, 0xbd7d }, { 3512, 0xdb88 }, { 3520, 0xc8d4 },
+  { 3527, 0xfff3 }, { 3541, 0xed7c }, { 3552, 0x5dee }, { 3563, 0x56ff },
+  { 3575, 0x7e0d }, { 3584, 0xac5f }, { 3594, 0xff96 }, { 3606, 0xd57f },
+  { 3618, 0x3fee }, { 3630, 0xc140 }, { 3634, 0x6ff9 }, { 3646, 0xffe7 },
+  /* 0x6200 */
+  { 3660, 0x779b }, { 3671, 0x8e77 }, { 3681, 0x6ebf }, { 3693, 0xe45d },
+  { 3702, 0x6fcf }, { 3714, 0x5f1f }, { 3725, 0xe07f }, { 3735, 0xfedf },
+  { 3749, 0xd7db }, { 3761, 0x01fe }, { 3769, 0xff00 }, { 3777, 0xfb7b },
+  { 3790, 0xffd4 }, { 3802, 0x1fdf }, { 3814, 0xf800 }, { 3819, 0xffff },
+  /* 0x6300 */
+  { 3835, 0xfb8f }, { 3847, 0x007b }, { 3853, 0xbf00 }, { 3860, 0x7f5c },
+  { 3871, 0xffff }, { 3887, 0x07f3 }, { 3896, 0xeba0 }, { 3904, 0x3de7 },
+  { 3915, 0xf7bf }, { 3929, 0xfbd7 }, { 3942, 0xffbf }, { 3957, 0x6003 },
+  { 3961, 0xfffd }, { 3976, 0xbfed }, { 3989, 0xefbb }, { 4002, 0x027f },
+  /* 0x6400 */
+  { 4010, 0xfe40 }, { 4018, 0xddfd }, { 4031, 0xfdff }, { 4046, 0xe2f9 },
+  { 4056, 0x680b }, { 4062, 0xfb1f }, { 4074, 0xfbe3 }, { 4086, 0xaffd },
+  { 4099, 0x9fa4 }, { 4108, 0xf7ed }, { 4121, 0x7a7d }, { 4132, 0xf80f },
+  { 4141, 0xeebe }, { 4153, 0x0fd5 }, { 4162, 0xbb5d }, { 4173, 0xfd9f },
+  /* 0x6500 */
+  { 4186, 0xf2db }, { 4197, 0x3bf9 }, { 4208, 0xfe7f }, { 4222, 0xebcc },
+  { 4232, 0x876a }, { 4240, 0x73fa }, { 4251, 0x95fc }, { 4261, 0x9ffc },
+  { 4273, 0x109f }, { 4280, 0xfaf7 }, { 4293, 0xddb7 }, { 4305, 0xbbcd },
+  { 4316, 0xf87e }, { 4327, 0xeccd }, { 4337, 0xf366 }, { 4347, 0x3c3f },
+  /* 0x6600 */
+  { 4357, 0xfffd }, { 4372, 0xb03f }, { 4381, 0xe9f7 }, { 4393, 0x067e },
+  { 4401, 0x96ae }, { 4410, 0xfe06 }, { 4419, 0xd576 }, { 4429, 0x5fd7 },
+  { 4441, 0x3fd1 }, { 4451, 0xa3f3 }, { 4461, 0xcf07 }, { 4470, 0x6fb7 },
+  { 4482, 0x9fd1 }, { 4492, 0x7f44 }, { 4501, 0x7b59 }, { 4511, 0xd3dd },
+  /* 0x6700 */
+  { 4522, 0xaf3b }, { 4533, 0xa9bd }, { 4543, 0x7dcf }, { 4555, 0xff3a },
+  { 4567, 0xfbe0 }, { 4577, 0xf6eb }, { 4589, 0xb401 }, { 4594, 0xffff },
+  { 4610, 0x7afa }, { 4621, 0xb7bf }, { 4634, 0xc000 }, { 4636, 0x0ffd },
+  { 4647, 0xff7f }, { 4662, 0xff1f }, { 4675, 0xfefc }, { 4688, 0x95ff },
+  /* 0x6800 */
+  { 4700, 0x0000 }, { 4700, 0xb5dc }, { 4710, 0xef63 }, { 4721, 0x3f3e },
+  { 4732, 0xfb7f }, { 4746, 0x001b }, { 4750, 0xe800 }, { 4754, 0xfbf6 },
+  { 4767, 0x9eef }, { 4779, 0xb8df }, { 4790, 0xff9f }, { 4804, 0x003f },
+  { 4810, 0x7bd0 }, { 4819, 0xf5ff }, { 4833, 0xdfdb }, { 4846, 0x3fff },
+  /* 0x6900 */
+  { 4860, 0xfdf0 }, { 4871, 0x00bf }, { 4878, 0x8420 }, { 4881, 0xbbbd },
+  { 4893, 0xdf37 }, { 4905, 0xffde }, { 4919, 0xff6d }, { 4932, 0x0ff3 },
+  { 4942, 0x604c }, { 4947, 0x5efb }, { 4959, 0xfffb }, { 4974, 0xfafb },
+  { 4987, 0xfe5e }, { 4999, 0x0219 }, { 5003, 0x79f4 }, { 5013, 0xf9de },
+  /* 0x6a00 */
+  { 5025, 0xa7f7 }, { 5037, 0xebfa }, { 5049, 0x01eb }, { 5056, 0xff34 },
+  { 5067, 0xebd3 }, { 5078, 0xef73 }, { 5090, 0xafd7 }, { 5102, 0xc040 },
+  { 5105, 0x72bb }, { 5115, 0xdcff }, { 5128, 0xf17f }, { 5140, 0x2fd8 },
+  { 5149, 0xb8ec }, { 5158, 0xfe0b }, { 5168, 0xdda3 }, { 5178, 0x1f0b },
+  /* 0x6b00 */
+  { 5186, 0x8f1d }, { 5195, 0x47cf }, { 5205, 0xb12b }, { 5213, 0xffde },
+  { 5227, 0x7fee }, { 5240, 0xda73 }, { 5250, 0x24ff }, { 5260, 0xcbc4 },
+  { 5268, 0xf75d }, { 5280, 0xcbf2 }, { 5290, 0xecfd }, { 5302, 0xb4ed },
+  { 5312, 0xbff9 }, { 5325, 0x4ddd }, { 5335, 0x99dd }, { 5345, 0xfb8d },
+  /* 0x6c00 */
+  { 5356, 0xbb7f }, { 5369, 0xaf7b }, { 5381, 0xddfb }, { 5394, 0xc959 },
+  { 5402, 0xfc4f }, { 5413, 0xfab5 }, { 5424, 0xafe3 }, { 5435, 0x6d5f },
+  { 5446, 0xffff }, { 5462, 0x3f7d }, { 5474, 0x7800 }, { 5478, 0xffdb },
+  { 5492, 0xb6ff }, { 5505, 0x7eff }, { 5519, 0xfbaf }, { 5532, 0x022f },
+  /* 0x6d00 */
+  { 5538, 0xff9b }, { 5551, 0xefc7 }, { 5563, 0xffa5 }, { 5575, 0xffff },
+  { 5591, 0x0007 }, { 5594, 0xc700 }, { 5599, 0xf7ff }, { 5614, 0xfff1 },
+  { 5627, 0x7ffd }, { 5641, 0x01bf }, { 5649, 0xdc00 }, { 5654, 0xfdbc },
+  { 5666, 0xbff5 }, { 5679, 0xffff }, { 5695, 0xff7f }, { 5710, 0x3eff },
+  /* 0x6e00 */
+  { 5723, 0x0029 }, { 5726, 0xbe00 }, { 5732, 0xf9ff }, { 5746, 0xff7f },
+  { 5761, 0x6efb }, { 5773, 0xfd7e }, { 5786, 0xcbff }, { 5799, 0x039e },
+  { 5806, 0xe300 }, { 5811, 0xfbdd }, { 5824, 0xccff }, { 5836, 0xf6df },
+  { 5849, 0xffff }, { 5865, 0x117f }, { 5874, 0xf800 }, { 5879, 0xfbf6 },
+  /* 0x6f00 */
+  { 5892, 0xe7ef }, { 5905, 0xd73c }, { 5915, 0xfeef }, { 5929, 0xdfef },
+  { 5943, 0xc00b }, { 5948, 0xedbf }, { 5961, 0xfedf }, { 5975, 0xfdcd },
+  { 5987, 0x7bf5 }, { 5999, 0x40fd }, { 6007, 0xffff }, { 6023, 0xb75f },
+  { 6035, 0xffdf }, { 6050, 0xf930 }, { 6058, 0xfbdf }, { 6072, 0xdc97 },
+  /* 0x7000 */
+  { 6082, 0xfef3 }, { 6095, 0xbff2 }, { 6107, 0x8fdf }, { 6119, 0xdfbf },
+  { 6133, 0x177f }, { 6144, 0xede6 }, { 6155, 0x0f7f }, { 6166, 0x3553 },
+  { 6174, 0x447c }, { 6181, 0x877e }, { 6191, 0xfa12 }, { 6199, 0x45bb },
+  { 6208, 0xede0 }, { 6217, 0x779e }, { 6228, 0x8017 }, { 6233, 0xbfd9 },
+  /* 0x7100 */
+  { 6245, 0x7e55 }, { 6255, 0xde89 }, { 6264, 0xc16f }, { 6273, 0x0447 },
+  { 6278, 0x7ade }, { 6289, 0xf75d }, { 6301, 0x57ff }, { 6314, 0x2905 },
+  { 6319, 0x86f7 }, { 6329, 0xfe95 }, { 6340, 0x97b3 }, { 6350, 0xf32f },
+  { 6361, 0xcfff }, { 6375, 0x9f75 }, { 6386, 0x71f7 }, { 6397, 0xfb17 },
+  /* 0x7200 */
+  { 6408, 0x34ee }, { 6417, 0xee19 }, { 6426, 0x37cc }, { 6435, 0xef61 },
+  { 6445, 0x9fd6 }, { 6456, 0xef4c }, { 6466, 0xd68f }, { 6476, 0xfbdd },
+  { 6489, 0x7b73 }, { 6500, 0x6def }, { 6512, 0xd7fe }, { 6525, 0xa431 },
+  { 6531, 0x5e7f }, { 6543, 0x97d7 }, { 6554, 0x0f5b }, { 6563, 0xffd8 },
+  /* 0x7300 */
+  { 6575, 0x9d83 }, { 6583, 0x7bce }, { 6594, 0x22ec }, { 6601, 0xdcff },
+  { 6614, 0x763d }, { 6624, 0xef87 }, { 6635, 0xdfe7 }, { 6648, 0xfded },
+  { 6661, 0x4fff }, { 6674, 0xa0fc }, { 6682, 0x3b77 }, { 6693, 0xdbfc },
+  { 6705, 0x3ded }, { 6716, 0x7fdc }, { 6728, 0x6fa9 }, { 6738, 0xf570 },
+  /* 0x7400 */
+  { 6747, 0x3ffb }, { 6760, 0x2c40 }, { 6764, 0xff7f }, { 6779, 0x847f },
+  { 6788, 0xec57 }, { 6798, 0xdeb7 }, { 6810, 0xe69c }, { 6819, 0xf22f },
+  { 6829, 0x0feb }, { 6839, 0xd5b5 }, { 6849, 0xafeb }, { 6861, 0xede7 },
+  { 6873, 0x8c2f }, { 6881, 0xfff0 }, { 6893, 0x537f }, { 6904, 0xe8f0 },
+  /* 0x7500 */
+  { 6912, 0xb99d }, { 6922, 0xb5ff }, { 6935, 0xff66 }, { 6947, 0xe78f },
+  { 6958, 0xd981 }, { 6965, 0xbe10 }, { 6972, 0x9c7c }, { 6981, 0xe3c1 },
+  { 6989, 0x9cd1 }, { 6997, 0x2733 }, { 7005, 0x0cbc }, { 7012, 0xff6d },
+  { 7025, 0xfcb7 }, { 7037, 0xefb7 }, { 7050, 0xa0df }, { 7059, 0xffff },
+  /* 0x7600 */
+  { 7075, 0xbf0b }, { 7085, 0xfe7b }, { 7098, 0xa3ff }, { 7110, 0x353f },
+  { 7120, 0x13cc }, { 7127, 0x97cd }, { 7137, 0x7637 }, { 7147, 0xfb27 },
+  { 7158, 0xcfd6 }, { 7169, 0x7e6c }, { 7179, 0xec50 }, { 7186, 0xed31 },
+  { 7195, 0x677c }, { 7205, 0xfc1c }, { 7214, 0xf6fa }, { 7226, 0x5fbf },
+  /* 0x7700 */
+  { 7239, 0x0fba }, { 7248, 0xae2f }, { 7258, 0xa3ad }, { 7267, 0x7ffe },
+  { 7281, 0xfcf0 }, { 7291, 0xde74 }, { 7301, 0xffef }, { 7316, 0xf200 },
+  { 7321, 0xfbbf }, { 7335, 0xfea2 }, { 7345, 0x3daf }, { 7356, 0xbcff },
+  { 7369, 0xf694 }, { 7378, 0x5fb9 }, { 7389, 0xf3ad }, { 7400, 0x3f8f },
+  /* 0x7800 */
+  { 7411, 0xf26c }, { 7420, 0xa01f }, { 7427, 0xffef }, { 7442, 0x01bf },
+  { 7450, 0x7728 }, { 7458, 0x7005 }, { 7463, 0xff35 }, { 7475, 0xda03 },
+  { 7482, 0xd2f9 }, { 7492, 0xc7fa }, { 7503, 0x3fbf }, { 7516, 0x5c1d },
+  { 7524, 0xff3a }, { 7536, 0xec33 }, { 7545, 0xb7af }, { 7557, 0xfe9c },
+  /* 0x7900 */
+  { 7568, 0x5236 }, { 7575, 0x7a9f }, { 7586, 0xbffa }, { 7599, 0xe722 },
+  { 7607, 0x9ff7 }, { 7620, 0xfcff }, { 7634, 0x2fbb }, { 7645, 0xb61d },
+  { 7654, 0xed06 }, { 7662, 0x1dfd }, { 7673, 0x7dd7 }, { 7685, 0xefdf },
+  { 7699, 0xeb23 }, { 7708, 0xf166 }, { 7717, 0x7ed9 }, { 7728, 0x0dc0 },
+  /* 0x7a00 */
+  { 7733, 0x3d3d }, { 7743, 0xdfbf }, { 7757, 0xc945 }, { 7764, 0xba83 },
+  { 7772, 0x7dd1 }, { 7782, 0x9dd0 }, { 7790, 0x7b87 }, { 7800, 0xcf73 },
+  { 7811, 0x9ff3 }, { 7823, 0xc3f5 }, { 7833, 0xdf0d }, { 7843, 0xc5fe },
+  { 7854, 0x0cb3 }, { 7861, 0x8302 }, { 7865, 0xe879 }, { 7874, 0xaec0 },
+  /* 0x7b00 */
+  { 7881, 0xc773 }, { 7891, 0x6f0f }, { 7901, 0xfd7d }, { 7914, 0x093f },
+  { 7922, 0xfff1 }, { 7935, 0x0157 }, { 7941, 0x62fb }, { 7951, 0x01ff },
+  { 7960, 0xfdb4 }, { 7971, 0x3bf3 }, { 7982, 0xb013 }, { 7988, 0x43b2 },
+  { 7995, 0x5ed3 }, { 8005, 0xff30 }, { 8015, 0x0fff }, { 8027, 0xeb9f },
+  /* 0x7c00 */
+  { 8039, 0xfeef }, { 8053, 0xf203 }, { 8060, 0x3fef }, { 8073, 0xfb89 },
+  { 8083, 0x37a9 }, { 8092, 0x9e99 }, { 8101, 0xdef9 }, { 8113, 0xa72c },
+  { 8121, 0x3733 }, { 8130, 0xc1f6 }, { 8139, 0x812e }, { 8145, 0xfe3e },
+  { 8157, 0x5d20 }, { 8163, 0xf2f7 }, { 8175, 0xd585 }, { 8183, 0x69d7 },
+  /* 0x7d00 */
+  { 8193, 0xffff }, { 8209, 0xffff }, { 8225, 0xdb07 }, { 8234, 0xff6f },
+  { 8248, 0xc4ff }, { 8259, 0xd97f }, { 8271, 0xefce }, { 8283, 0xbe0f },
+  { 8293, 0xf17b }, { 8304, 0xf05e }, { 8313, 0xf6cf }, { 8325, 0xffb7 },
+  { 8339, 0x5ef7 }, { 8351, 0xef84 }, { 8360, 0xd7cb }, { 8371, 0x0edf },
+  /* 0x7e00 */
+  { 8381, 0xff08 }, { 8390, 0xfcff }, { 8404, 0xee3f }, { 8416, 0xffff },
+  { 8432, 0x13ff }, { 8443, 0xd7ff }, { 8457, 0xaf0f }, { 8467, 0x7ffd },
+  { 8481, 0xbdc7 }, { 8492, 0x1ffa }, { 8503, 0x0000 }, { 8503, 0x0000 },
+  { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0x0000 },
+  /* 0x7f00 */
+  { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0x0000 }, { 8503, 0xe740 },
+  { 8510, 0xbd38 }, { 8519, 0xf933 }, { 8529, 0x7feb }, { 8542, 0xfeed },
+  { 8555, 0x7fe8 }, { 8566, 0x7c76 }, { 8576, 0xb3f7 }, { 8588, 0xffef },
+  { 8603, 0xfeaf }, { 8616, 0xd8b7 }, { 8626, 0xff6f }, { 8640, 0xfbbf },
+  /* 0x8000 */
+  { 8654, 0xf8fb }, { 8666, 0xdbf7 }, { 8679, 0x1752 }, { 8686, 0xe2f9 },
+  { 8696, 0x85c8 }, { 8702, 0x7547 }, { 8711, 0x9090 }, { 8715, 0xe3ef },
+  { 8727, 0x9ef4 }, { 8737, 0x3f6d }, { 8748, 0xee2e }, { 8758, 0x0536 },
+  { 8764, 0xf7bc }, { 8776, 0x7ff3 }, { 8789, 0xa07b }, { 8797, 0x7f3f },
+  /* 0x8100 */
+  { 8810, 0x0567 }, { 8817, 0xeb60 }, { 8825, 0xbabe }, { 8836, 0x6601 },
+  { 8841, 0xfcd8 }, { 8851, 0x583f }, { 8860, 0xcaf7 }, { 8871, 0x87df },
+  { 8882, 0xbfcd }, { 8894, 0xffa0 }, { 8904, 0x5bcd }, { 8914, 0xfebf },
+  { 8928, 0xb6fd }, { 8940, 0xefa7 }, { 8952, 0x77ef }, { 8965, 0xdf9c },
+  /* 0x8200 */
+  { 8976, 0x3fb7 }, { 8988, 0xf877 }, { 8999, 0x9d27 }, { 9008, 0xb7fc },
+  { 9020, 0xcab5 }, { 9029, 0xdfef }, { 9043, 0xfb5a }, { 9054, 0xf1b6 },
+  { 9064, 0xec39 }, { 9073, 0xef1f }, { 9085, 0xfbbf }, { 9099, 0x7ffb },
+  { 9113, 0x000d }, { 9116, 0xdafe }, { 9128, 0xbdfb }, { 9141, 0x4e7f },
+  /* 0x8300 */
+  { 9152, 0x33ff }, { 9164, 0x5ac0 }, { 9170, 0xbff5 }, { 9183, 0x9ffe },
+  { 9196, 0xffbf }, { 9211, 0x005f }, { 9217, 0x0000 }, { 9217, 0xfdf8 },
+  { 9229, 0xffca }, { 9241, 0x6ffd }, { 9254, 0xcffd }, { 9267, 0xa001 },
+  { 9270, 0xdfff }, { 9285, 0xfbf2 }, { 9297, 0xdfbf }, { 9311, 0xff7f },
+  /* 0x8400 */
+  { 9326, 0xfeda }, { 9338, 0x080f }, { 9343, 0xba08 }, { 9349, 0xbfff },
+  { 9364, 0x7afd }, { 9376, 0xeed7 }, { 9388, 0xfbeb }, { 9401, 0x67f9 },
+  { 9412, 0xe044 }, { 9417, 0xff93 }, { 9429, 0xdf97 }, { 9441, 0x9f57 },
+  { 9452, 0xfef7 }, { 9466, 0x08df }, { 9474, 0xdf80 }, { 9482, 0xfedf },
+  /* 0x8500 */
+  { 9496, 0xffc5 }, { 9508, 0xf7fe }, { 9522, 0xfffb }, { 9537, 0x6803 },
+  { 9542, 0x67fb }, { 9554, 0x6bfa }, { 9565, 0x7fff }, { 9580, 0x5fe2 },
+  { 9590, 0xffff }, { 9606, 0xff73 }, { 9619, 0x87df }, { 9630, 0xe7fb },
+  { 9643, 0xebfd }, { 9656, 0xf7a7 }, { 9668, 0xbf7e }, { 9681, 0xefc7 },
+  /* 0x8600 */
+  { 9693, 0x1ef3 }, { 9703, 0xdf82 }, { 9712, 0x76ff }, { 9725, 0xdf7e },
+  { 9738, 0x79c9 }, { 9747, 0xda7d }, { 9758, 0xefbe }, { 9771, 0x1e9b },
+  { 9780, 0x7ce0 }, { 9788, 0x77fb }, { 9801, 0x87be }, { 9811, 0xfffb },
+  { 9826, 0x1bff }, { 9838, 0xffdb }, { 9852, 0x3f5c }, { 9862, 0x4fe0 },
+  /* 0x8700 */
+  { 9870, 0x7fff }, { 9885, 0x5f0e }, { 9894, 0x77ff }, { 9908, 0xddbf },
+  { 9921, 0xf04f }, { 9930, 0xffff }, { 9946, 0xffff }, { 9962, 0x0ff8 },
+  { 9971, 0xa3be }, { 9981, 0xfddf }, { 9995, 0xfc1c }, { 10004, 0xfffd },
+  { 10019, 0x1f7d }, { 10030, 0xfb9e }, { 10042, 0xbdff }, { 10056, 0xdedc },
+  /* 0x8800 */
+  { 10067, 0x3f6f }, { 10079, 0xbafb }, { 10091, 0xdf7f }, { 10105, 0xfbef },
+  { 10119, 0x7d1b }, { 10129, 0x2eec }, { 10138, 0xaf8e }, { 10148, 0xf2f7 },
+  { 10160, 0x7b0f }, { 10170, 0xcfee }, { 10182, 0x1d96 }, { 10190, 0x77c6 },
+  { 10200, 0x7e07 }, { 10209, 0xfff5 }, { 10223, 0xd982 }, { 10230, 0x7fdf },
+  /* 0x8900 */
+  { 10244, 0x5ee6 }, { 10254, 0xc7ff }, { 10267, 0xfeee }, { 10280, 0x79ef },
+  { 10292, 0x9a56 }, { 10300, 0xffcf }, { 10314, 0xfe5f }, { 10327, 0xde5e },
+  { 10338, 0x896e }, { 10346, 0xf9e8 }, { 10356, 0xf45e }, { 10366, 0xe6c4 },
+  { 10374, 0x0001 }, { 10375, 0xbe7c }, { 10386, 0x3b7f }, { 10398, 0xdddf },
+  /* 0x8a00 */
+  { 10411, 0xd59d }, { 10421, 0xe9ef }, { 10433, 0x34ac }, { 10440, 0xde53 },
+  { 10450, 0xf573 }, { 10461, 0x4bf7 }, { 10472, 0x7b4f }, { 10483, 0x9eff },
+  { 10496, 0xb8fe }, { 10507, 0x476e }, { 10516, 0x0dfb }, { 10526, 0xff45 },
+  { 10537, 0xabfd }, { 10549, 0xfbfe }, { 10563, 0xe9d7 }, { 10574, 0xddff },
+  /* 0x8b00 */
+  { 10588, 0xedf7 }, { 10601, 0x7fff }, { 10616, 0xddfd }, { 10629, 0x7eeb },
+  { 10641, 0xcfe7 }, { 10653, 0xb7ff }, { 10667, 0xbde9 }, { 10678, 0xef91 },
+  { 10688, 0x5d75 }, { 10698, 0xd77c }, { 10709, 0x0000 }, { 10709, 0x0000 },
+  { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0x0000 },
+  /* 0x8c00 */
+  { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0x0000 }, { 10709, 0xfa80 },
+  { 10716, 0xffee }, { 10730, 0xb4f1 }, { 10739, 0xbf76 }, { 10751, 0x2fef },
+  { 10763, 0xb677 }, { 10774, 0x77bf }, { 10787, 0x9fbf }, { 10800, 0xfffd },
+  { 10815, 0x95bf }, { 10826, 0xf6ae }, { 10837, 0x75ff }, { 10850, 0x7f3b },
+  /* 0x8d00 */
+  { 10862, 0xa7f5 }, { 10873, 0x0af9 }, { 10881, 0x0000 }, { 10881, 0x0000 },
+  { 10881, 0x0000 }, { 10881, 0x0000 }, { 10881, 0xfbd0 }, { 10891, 0x2bdd },
+  { 10901, 0xf633 }, { 10911, 0x9a7f }, { 10922, 0xfdab }, { 10934, 0xd6fc },
+  { 10945, 0xf9e6 }, { 10956, 0xbfeb }, { 10969, 0xdfdf }, { 10983, 0xf41f },
+  /* 0x8e00 */
+  { 10993, 0xa6fd }, { 11004, 0xffff }, { 11020, 0x4aff }, { 11031, 0xf37b },
+  { 11043, 0x7fb7 }, { 11056, 0xfef9 }, { 11069, 0xb6ff }, { 11082, 0x1d5c },
+  { 11090, 0x7ff6 }, { 11103, 0xe5ff }, { 11116, 0x1f7b }, { 11127, 0x2404 },
+  { 11130, 0xbe05 }, { 11138, 0xf99e }, { 11149, 0xdbe3 }, { 11160, 0xdff2 },
+  /* 0x8f00 */
+  { 11172, 0x6fef }, { 11185, 0xfdff }, { 11200, 0xd679 }, { 11210, 0xcbfc },
+  { 11221, 0xebfd }, { 11234, 0xefff }, { 11249, 0x001f }, { 11254, 0x0000 },
+  { 11254, 0x0000 }, { 11254, 0x9800 }, { 11257, 0xe148 }, { 11263, 0x8017 },
+  { 11268, 0x6a74 }, { 11276, 0x00fe }, { 11283, 0x6d7f }, { 11295, 0xfdf1 },
+  /* 0x9000 */
+  { 11307, 0xb87f }, { 11318, 0xfef3 }, { 11331, 0xe01f }, { 11339, 0xf176 },
+  { 11349, 0xee96 }, { 11359, 0x7b3f }, { 11371, 0xeb8d }, { 11381, 0xfffd },
+  { 11396, 0xadff }, { 11409, 0xcbb3 }, { 11419, 0x84ef }, { 11428, 0xe17f },
+  { 11439, 0x4daa }, { 11447, 0xbff0 }, { 11458, 0xbf3f }, { 11471, 0xfe3f },
+  /* 0x9100 */
+  { 11484, 0xebff }, { 11498, 0xffd7 }, { 11512, 0xffdf }, { 11527, 0xcf7f },
+  { 11540, 0xfffb }, { 11555, 0x85ed }, { 11564, 0xd73f }, { 11576, 0x07bc },
+  { 11584, 0xaeff }, { 11597, 0xfe0f }, { 11608, 0xfdaf }, { 11621, 0x76bf },
+  { 11633, 0xfaef }, { 11646, 0x37bb }, { 11657, 0x7fdc }, { 11669, 0xa3ba },
+  /* 0x9200 */
+  { 11678, 0xb6ff }, { 11691, 0x56f7 }, { 11702, 0x60f8 }, { 11709, 0xe7df },
+  { 11722, 0xff61 }, { 11733, 0x4cdf }, { 11743, 0xb0fb }, { 11753, 0xff45 },
+  { 11764, 0x7ded }, { 11776, 0x3ffa }, { 11788, 0x1fff }, { 11801, 0x18fc },
+  { 11809, 0xffff }, { 11825, 0xe3af }, { 11836, 0xc7d3 }, { 11846, 0xdf83 },
+  /* 0x9300 */
+  { 11856, 0xfb57 }, { 11868, 0xef7d }, { 11881, 0xefff }, { 11896, 0x1378 },
+  { 11903, 0xfec0 }, { 11912, 0x5ff7 }, { 11925, 0x34bb }, { 11934, 0x5ee3 },
+  { 11944, 0xf70d }, { 11954, 0xeff6 }, { 11967, 0xd7fe }, { 11980, 0x00bf },
+  { 11987, 0xf59d }, { 11998, 0xf7f7 }, { 12012, 0x51de }, { 12021, 0xffe0 },
+  /* 0x9400 */
+  { 12032, 0xfec9 }, { 12043, 0x037f }, { 12052, 0x5f01 }, { 12059, 0xbfef },
+  { 12073, 0x9ff1 }, { 12084, 0x60a7 }, { 12091, 0xef1d }, { 12102, 0xf1ff },
+  { 12115, 0x000f }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 },
+  { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 },
+  /* 0x9500 */
+  { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 },
+  { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x0000 }, { 12119, 0x3c80 },
+  { 12124, 0xfb4d }, { 12135, 0xd91f }, { 12145, 0x7b3a }, { 12155, 0xfee3 },
+  { 12167, 0x3fe9 }, { 12178, 0xdc7f }, { 12190, 0x003f }, { 12196, 0x0000 },
+  /* 0x9600 */
+  { 12196, 0x0000 }, { 12196, 0x5000 }, { 12198, 0xf51f }, { 12209, 0xbe07 },
+  { 12218, 0xfc1d }, { 12228, 0xf91b }, { 12238, 0xbc1e }, { 12247, 0x71ff },
+  { 12259, 0x6ff9 }, { 12271, 0x5bbe }, { 12282, 0x5796 }, { 12291, 0x9b1b },
+  { 12300, 0x7fff }, { 12315, 0xfffc }, { 12329, 0x872e }, { 12337, 0xafe7 },
+  /* 0x9700 */
+  { 12349, 0xebf5 }, { 12361, 0xf34f }, { 12372, 0xdffd }, { 12386, 0xe725 },
+  { 12395, 0x0bdc }, { 12403, 0x5d44 }, { 12410, 0x5747 }, { 12419, 0xfddd },
+  { 12432, 0xed3f }, { 12444, 0x7790 }, { 12452, 0x7d7f }, { 12465, 0x8ac8 },
+  { 12471, 0xfafa }, { 12483, 0xf3f9 }, { 12495, 0x202a }, { 12499, 0xef4b },
+  /* 0x9800 */
+  { 12510, 0xf5ff }, { 12524, 0x79cf }, { 12535, 0xabd3 }, { 12545, 0x0ba5 },
+  { 12552, 0xf77a }, { 12564, 0xfb8f }, { 12576, 0x8ebd }, { 12586, 0x001f },
+  { 12591, 0x0000 }, { 12591, 0x0000 }, { 12591, 0xf300 }, { 12597, 0xfd4e },
+  { 12608, 0x1a57 }, { 12616, 0x8800 }, { 12618, 0xaeac }, { 12627, 0x7654 },
+  /* 0x9900 */
+  { 12635, 0x17ad }, { 12644, 0xcdff }, { 12657, 0xffb2 }, { 12669, 0xf42f },
+  { 12679, 0x5baa }, { 12688, 0xdbff }, { 12702, 0x0002 }, { 12703, 0x0000 },
+  { 12703, 0x0000 }, { 12703, 0x73c0 }, { 12710, 0xf9ea }, { 12721, 0x2e3f },
+  { 12731, 0xfa8e }, { 12741, 0xbbff }, { 12755, 0x76bc }, { 12765, 0xffd3 },
+  /* 0x9a00 */
+  { 12778, 0xeefe }, { 12791, 0x7e72 }, { 12801, 0x7ebd }, { 12813, 0xe7f7 },
+  { 12826, 0xf77f }, { 12840, 0xcefd }, { 12852, 0x0ff5 }, { 12862, 0x0000 },
+  { 12862, 0x0000 }, { 12862, 0x0000 }, { 12862, 0xa900 }, { 12866, 0xdb9b },
+  { 12877, 0xa4c7 }, { 12885, 0x917f }, { 12895, 0xf8ca }, { 12904, 0x7ece },
+  /* 0x9b00 */
+  { 12915, 0x7d7a }, { 12926, 0xc7e7 }, { 12937, 0xcbbd }, { 12948, 0xdcae },
+  { 12958, 0xfd7e }, { 12971, 0x8f76 }, { 12981, 0x91d3 }, { 12989, 0x7cf3 },
+  { 13000, 0x01e5 }, { 13006, 0x4c2f }, { 13014, 0xed77 }, { 13026, 0xa360 },
+  { 13032, 0x07db }, { 13041, 0x5ef8 }, { 13051, 0x1df7 }, { 13062, 0x2181 },
+  /* 0x9c00 */
+  { 13066, 0x6be0 }, { 13074, 0x309c }, { 13080, 0x3b3a }, { 13089, 0xfade },
+  { 13101, 0x7f53 }, { 13112, 0xc3f5 }, { 13122, 0x61cd }, { 13130, 0x07ba },
+  { 13138, 0x0000 }, { 13138, 0x0000 }, { 13138, 0x0000 }, { 13138, 0x0000 },
+  { 13138, 0x0000 }, { 13138, 0x0000 }, { 13138, 0x26e0 }, { 13144, 0xbefe },
+  /* 0x9d00 */
+  { 13157, 0x03f9 }, { 13165, 0xebb5 }, { 13176, 0xe36d }, { 13186, 0xe9cb },
+  { 13196, 0x9c2f }, { 13205, 0xbfde }, { 13218, 0x9f83 }, { 13227, 0xabbf },
+  { 13239, 0x1ff7 }, { 13251, 0xffd5 }, { 13264, 0xb7df }, { 13277, 0xdffe },
+  { 13291, 0xfdae }, { 13303, 0xffef }, { 13318, 0xfb7e }, { 13331, 0xeffd },
+  /* 0x9e00 */
+  { 13345, 0xaaff }, { 13357, 0x6ebf }, { 13369, 0x0000 }, { 13369, 0x0000 },
+  { 13369, 0x0000 }, { 13369, 0x0000 }, { 13369, 0x0000 }, { 13369, 0xb620 },
+  { 13375, 0x7fcd }, { 13387, 0xbe9e }, { 13398, 0x62b3 }, { 13406, 0x58f1 },
+  { 13414, 0xf10d }, { 13422, 0xfd7b }, { 13435, 0xe9f1 }, { 13445, 0xbefd },
+  /* 0x9f00 */
+  { 13458, 0xc6c3 }, { 13466, 0x5f6d }, { 13477, 0xff3d }, { 13490, 0x69ff },
+  { 13502, 0xffcf }, { 13516, 0xfbf4 }, { 13528, 0xdcfb }, { 13540, 0x4ff7 },
+  { 13552, 0x2000 }, { 13553, 0x1137 }, { 13560, 0x0015 },
+};
+static const Summary16 big5_uni2indx_pagefa[1] = {
+  /* 0xfa00 */
+  { 13563, 0x3000 },
+};
+static const Summary16 big5_uni2indx_pagefe[23] = {
+  /* 0xfe00 */
+  { 13565, 0x0000 }, { 13565, 0x0000 }, { 13565, 0x0000 }, { 13565, 0xfffb },
+  { 13580, 0xfe1f }, { 13592, 0xfef5 }, { 13605, 0x0e7f }, { 13615, 0x0000 },
+  { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 },
+  { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 }, { 13615, 0x0000 },
+  /* 0xff00 */
+  { 13615, 0xff7a }, { 13628, 0xffff }, { 13644, 0xffff }, { 13660, 0x97ff },
+  { 13673, 0xfffe }, { 13688, 0x3fff }, { 13702, 0x0010 },
+};
+
+static int
+big5_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  if (n >= 2) {
+    const Summary16 *summary = NULL;
+    if (wc < 0x0100)
+      summary = &big5_uni2indx_page00[(wc>>4)];
+    else if (wc >= 0x0200 && wc < 0x0460)
+      summary = &big5_uni2indx_page02[(wc>>4)-0x020];
+    else if (wc >= 0x2000 && wc < 0x22c0)
+      summary = &big5_uni2indx_page20[(wc>>4)-0x200];
+    else if (wc >= 0x2400 && wc < 0x2650)
+      summary = &big5_uni2indx_page24[(wc>>4)-0x240];
+    else if (wc >= 0x3000 && wc < 0x33e0)
+      summary = &big5_uni2indx_page30[(wc>>4)-0x300];
+    else if (wc >= 0x4e00 && wc < 0x9fb0)
+      summary = &big5_uni2indx_page4e[(wc>>4)-0x4e0];
+    else if (wc >= 0xfa00 && wc < 0xfa10)
+      summary = &big5_uni2indx_pagefa[(wc>>4)-0xfa0];
+    else if (wc >= 0xfe00 && wc < 0xff70)
+      summary = &big5_uni2indx_pagefe[(wc>>4)-0xfe0];
+    if (summary) {
+      unsigned short used = summary->used;
+      unsigned int i = wc & 0x0f;
+      if (used & ((unsigned short) 1 << i)) {
+        unsigned short c;
+        /* Keep in `used' only the bits 0..i-1. */
+        used &= ((unsigned short) 1 << i) - 1;
+        /* Add `summary->indx' and the number of bits set in `used'. */
+        used = (used & 0x5555) + ((used & 0xaaaa) >> 1);
+        used = (used & 0x3333) + ((used & 0xcccc) >> 2);
+        used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4);
+        used = (used & 0x00ff) + (used >> 8);
+        c = big5_2charset[summary->indx + used];
+        r[0] = (c >> 8); r[1] = (c & 0xff);
+        return 2;
+      }
+    }
+    return RET_ILSEQ;
+  }
+  return RET_TOOSMALL;
+}
diff --git a/src/xlibi18n/lcUniConv/big5_emacs.h b/src/xlibi18n/lcUniConv/big5_emacs.h
new file mode 100644 (file)
index 0000000..246aebe
--- /dev/null
@@ -0,0 +1,163 @@
+
+/*
+ * BIG5-0 and BIG5-1
+ */
+
+/*
+   BIG5 with its 13494 characters doesn't fit in a single 94x94 or 96x96
+   block. Therefore Emacs/Mule developers, in a typically Japanese way of
+   thinking, have developed an alternative encoding of BIG5 in two 94x94
+   planes, very similar to the SHIFT_JIS encoding for JISX0208.
+
+   Conversion between BIG5 codes (s1,s2) and BIG5-0 codes (c1,c2):
+   Example. (s1,s2) = 0xA140, (c1,c2) = 0x2121.
+   0xA1 <= s1 <= 0xC7, 0x40 <= s2 <= 0x7E || 0xA1 <= s2 <= 0xFE,
+   0x21 <= c1 <= 0x62, 0x21 <= c2 <= 0x7E.
+   Invariant:
+     157*(s1-0xA1) + (s2 < 0x80 ? s2-0x40 : s2-0x62)
+     = 94*(c1-0x21)+(c2-0x21)
+   Conversion (s1,s2) -> (c1,c2):
+     t := 157*(s1-0xA1) + (s2 < 0x80 ? s2-0x40 : s2-0x62)
+     c1 := (t div 94) + 0x21
+     c2 := (t mod 94) + 0x21
+   Conversion (c1,c2) -> (s1,s2):
+     t := 94*(c1-0x21)+(c2-0x21)
+     t2 := t mod 157
+     s1 := (t div 157) + 0xA1
+     s2 := (t2 < 0x3F ? t2+0x40 : t2+0x62)
+
+   Conversion between BIG5 codes (s1,s2) and BIG5-1 codes (c1,c2):
+   Example. (s1,s2) = 0xC940, (c1,c2) = 0x2121.
+   0xC9 <= s1 <= 0xF9, 0x40 <= s2 <= 0x7E || 0xA1 <= s2 <= 0xFE,
+   0x21 <= c1 <= 0x72, 0x21 <= c2 <= 0x7E.
+   Invariant:
+     157*(s1-0xC9) + (s2 < 0x80 ? s2-0x40 : s2-0x62)
+     = 94*(c1-0x21)+(c2-0x21)
+   Conversion (s1,s2) -> (c1,c2):
+     t := 157*(s1-0xC9) + (s2 < 0x80 ? s2-0x40 : s2-0x62)
+     c1 := (t div 94) + 0x21
+     c2 := (t mod 94) + 0x21
+   Conversion (c1,c2) -> (s1,s2):
+     t := 94*(c1-0x21)+(c2-0x21)
+     t2 := t mod 157
+     s1 := (t div 157) + 0xC9
+     s2 := (t2 < 0x3F ? t2+0x40 : t2+0x62)
+ */
+
+static int
+big5_0_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c1 = s[0];
+  if (c1 >= 0x21 && c1 <= 0x62) {
+    if (n >= 2) {
+      unsigned char c2 = s[1];
+      if (c2 >= 0x21 && c2 <= 0x7e) {
+        unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21);
+        if (0) {
+          /* Unoptimized. */
+          unsigned char buf[2];
+          buf[0] = (i / 157) + 0xa1;
+          i = i % 157;
+          buf[1] = i + (i < 0x3f ? 0x40 : 0x62);
+          return big5_mbtowc(conv,pwc,buf,2);
+        } else {
+          /* Inline the implementation of big5_mbtowc. */
+          if (i < 6121) {
+            unsigned short wc = big5_2uni_pagea1[i];
+            if (wc != 0xfffd) {
+              *pwc = (ucs4_t) wc;
+              return 2;
+            }
+          }
+        }
+      }
+      return RET_ILSEQ;
+    }
+    return RET_TOOFEW(0);
+  }
+  return RET_ILSEQ;
+}
+
+static int
+big5_1_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c1 = s[0];
+  if (c1 >= 0x21 && c1 <= 0x72) {
+    if (n >= 2) {
+      unsigned char c2 = s[1];
+      if (c2 >= 0x21 && c2 <= 0x7e) {
+        unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21);
+        if (0) {
+          /* Unoptimized. */
+          unsigned char buf[2];
+          buf[0] = (i / 157) + 0xc9;
+          i = i % 157;
+          buf[1] = i + (i < 0x3f ? 0x40 : 0x62);
+          return big5_mbtowc(conv,pwc,buf,2);
+        } else {
+          /* Inline the implementation of big5_mbtowc. */
+          if (i < 7652) {
+            unsigned short wc = big5_2uni_pagec9[i];
+            if (wc != 0xfffd) {
+              *pwc = (ucs4_t) wc;
+              return 2;
+            }
+          }
+        }
+      }
+      return RET_ILSEQ;
+    }
+    return RET_TOOFEW(0);
+  }
+  return RET_ILSEQ;
+}
+
+static int
+big5_0_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  if (n >= 2) {
+    unsigned char buf[2];
+    int ret = big5_wctomb(conv,buf,wc,2);
+    if (ret != RET_ILSEQ) {
+      unsigned char s1, s2;
+      if (ret != 2) abort();
+      s1 = buf[0];
+      s2 = buf[1];
+      if (!(s1 >= 0xa1)) abort();
+      if (!((s2 >= 0x40 && s2 <= 0x7e) || (s2 >= 0xa1 && s2 <= 0xfe))) abort();
+      if (s1 < 0xc9) {
+        unsigned int t = 157 * (s1 - 0xa1) + s2 - (s2 < 0x80 ? 0x40 : 0x62);
+        r[0] = (t / 94) + 0x21;
+        r[1] = (t % 94) + 0x21;
+        return 2;
+      }
+    }
+    return RET_ILSEQ;
+  }
+  return RET_TOOSMALL;
+}
+
+static int
+big5_1_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  if (n >= 2) {
+    unsigned char buf[2];
+    int ret = big5_wctomb(conv,buf,wc,2);
+    if (ret != RET_ILSEQ) {
+      unsigned char s1, s2;
+      if (ret != 2) abort();
+      s1 = buf[0];
+      s2 = buf[1];
+      if (!(s1 <= 0xf9)) abort();
+      if (!((s2 >= 0x40 && s2 <= 0x7e) || (s2 >= 0xa1 && s2 <= 0xfe))) abort();
+      if (s1 >= 0xc9) {
+        unsigned int t = 157 * (s1 - 0xc9) + s2 - (s2 < 0x80 ? 0x40 : 0x62);
+        r[0] = (t / 94) + 0x21;
+        r[1] = (t % 94) + 0x21;
+        return 2;
+      }
+    }
+    return RET_ILSEQ;
+  }
+  return RET_TOOSMALL;
+}
diff --git a/src/xlibi18n/lcUniConv/big5hkscs.h b/src/xlibi18n/lcUniConv/big5hkscs.h
new file mode 100644 (file)
index 0000000..721d122
--- /dev/null
@@ -0,0 +1,6252 @@
+
+/*
+ * BIG5-HKSCS
+ */
+
+static const unsigned short big5hkscs_2uni_page81[19782] = {
+  /* 0x81 */
+  0xeeb8, 0xeeb9, 0xeeba, 0xeebb, 0xeebc, 0xeebd, 0xeebe, 0xeebf,
+  0xeec0, 0xeec1, 0xeec2, 0xeec3, 0xeec4, 0xeec5, 0xeec6, 0xeec7,
+  0xeec8, 0xeec9, 0xeeca, 0xeecb, 0xeecc, 0xeecd, 0xeece, 0xeecf,
+  0xeed0, 0xeed1, 0xeed2, 0xeed3, 0xeed4, 0xeed5, 0xeed6, 0xeed7,
+  0xeed8, 0xeed9, 0xeeda, 0xeedb, 0xeedc, 0xeedd, 0xeede, 0xeedf,
+  0xeee0, 0xeee1, 0xeee2, 0xeee3, 0xeee4, 0xeee5, 0xeee6, 0xeee7,
+  0xeee8, 0xeee9, 0xeeea, 0xeeeb, 0xeeec, 0xeeed, 0xeeee, 0xeeef,
+  0xeef0, 0xeef1, 0xeef2, 0xeef3, 0xeef4, 0xeef5, 0xeef6, 0xeef7,
+  0xeef8, 0xeef9, 0xeefa, 0xeefb, 0xeefc, 0xeefd, 0xeefe, 0xeeff,
+  0xef00, 0xef01, 0xef02, 0xef03, 0xef04, 0xef05, 0xef06, 0xef07,
+  0xef08, 0xef09, 0xef0a, 0xef0b, 0xef0c, 0xef0d, 0xef0e, 0xef0f,
+  0xef10, 0xef11, 0xef12, 0xef13, 0xef14, 0xef15, 0xef16, 0xef17,
+  0xef18, 0xef19, 0xef1a, 0xef1b, 0xef1c, 0xef1d, 0xef1e, 0xef1f,
+  0xef20, 0xef21, 0xef22, 0xef23, 0xef24, 0xef25, 0xef26, 0xef27,
+  0xef28, 0xef29, 0xef2a, 0xef2b, 0xef2c, 0xef2d, 0xef2e, 0xef2f,
+  0xef30, 0xef31, 0xef32, 0xef33, 0xef34, 0xef35, 0xef36, 0xef37,
+  0xef38, 0xef39, 0xef3a, 0xef3b, 0xef3c, 0xef3d, 0xef3e, 0xef3f,
+  0xef40, 0xef41, 0xef42, 0xef43, 0xef44, 0xef45, 0xef46, 0xef47,
+  0xef48, 0xef49, 0xef4a, 0xef4b, 0xef4c, 0xef4d, 0xef4e, 0xef4f,
+  0xef50, 0xef51, 0xef52, 0xef53, 0xef54,
+  /* 0x82 */
+  0xef55, 0xef56, 0xef57, 0xef58, 0xef59, 0xef5a, 0xef5b, 0xef5c,
+  0xef5d, 0xef5e, 0xef5f, 0xef60, 0xef61, 0xef62, 0xef63, 0xef64,
+  0xef65, 0xef66, 0xef67, 0xef68, 0xef69, 0xef6a, 0xef6b, 0xef6c,
+  0xef6d, 0xef6e, 0xef6f, 0xef70, 0xef71, 0xef72, 0xef73, 0xef74,
+  0xef75, 0xef76, 0xef77, 0xef78, 0xef79, 0xef7a, 0xef7b, 0xef7c,
+  0xef7d, 0xef7e, 0xef7f, 0xef80, 0xef81, 0xef82, 0xef83, 0xef84,
+  0xef85, 0xef86, 0xef87, 0xef88, 0xef89, 0xef8a, 0xef8b, 0xef8c,
+  0xef8d, 0xef8e, 0xef8f, 0xef90, 0xef91, 0xef92, 0xef93, 0xef94,
+  0xef95, 0xef96, 0xef97, 0xef98, 0xef99, 0xef9a, 0xef9b, 0xef9c,
+  0xef9d, 0xef9e, 0xef9f, 0xefa0, 0xefa1, 0xefa2, 0xefa3, 0xefa4,
+  0xefa5, 0xefa6, 0xefa7, 0xefa8, 0xefa9, 0xefaa, 0xefab, 0xefac,
+  0xefad, 0xefae, 0xefaf, 0xefb0, 0xefb1, 0xefb2, 0xefb3, 0xefb4,
+  0xefb5, 0xefb6, 0xefb7, 0xefb8, 0xefb9, 0xefba, 0xefbb, 0xefbc,
+  0xefbd, 0xefbe, 0xefbf, 0xefc0, 0xefc1, 0xefc2, 0xefc3, 0xefc4,
+  0xefc5, 0xefc6, 0xefc7, 0xefc8, 0xefc9, 0xefca, 0xefcb, 0xefcc,
+  0xefcd, 0xefce, 0xefcf, 0xefd0, 0xefd1, 0xefd2, 0xefd3, 0xefd4,
+  0xefd5, 0xefd6, 0xefd7, 0xefd8, 0xefd9, 0xefda, 0xefdb, 0xefdc,
+  0xefdd, 0xefde, 0xefdf, 0xefe0, 0xefe1, 0xefe2, 0xefe3, 0xefe4,
+  0xefe5, 0xefe6, 0xefe7, 0xefe8, 0xefe9, 0xefea, 0xefeb, 0xefec,
+  0xefed, 0xefee, 0xefef, 0xeff0, 0xeff1,
+  /* 0x83 */
+  0xeff2, 0xeff3, 0xeff4, 0xeff5, 0xeff6, 0xeff7, 0xeff8, 0xeff9,
+  0xeffa, 0xeffb, 0xeffc, 0xeffd, 0xeffe, 0xefff, 0xf000, 0xf001,
+  0xf002, 0xf003, 0xf004, 0xf005, 0xf006, 0xf007, 0xf008, 0xf009,
+  0xf00a, 0xf00b, 0xf00c, 0xf00d, 0xf00e, 0xf00f, 0xf010, 0xf011,
+  0xf012, 0xf013, 0xf014, 0xf015, 0xf016, 0xf017, 0xf018, 0xf019,
+  0xf01a, 0xf01b, 0xf01c, 0xf01d, 0xf01e, 0xf01f, 0xf020, 0xf021,
+  0xf022, 0xf023, 0xf024, 0xf025, 0xf026, 0xf027, 0xf028, 0xf029,
+  0xf02a, 0xf02b, 0xf02c, 0xf02d, 0xf02e, 0xf02f, 0xf030, 0xf031,
+  0xf032, 0xf033, 0xf034, 0xf035, 0xf036, 0xf037, 0xf038, 0xf039,
+  0xf03a, 0xf03b, 0xf03c, 0xf03d, 0xf03e, 0xf03f, 0xf040, 0xf041,
+  0xf042, 0xf043, 0xf044, 0xf045, 0xf046, 0xf047, 0xf048, 0xf049,
+  0xf04a, 0xf04b, 0xf04c, 0xf04d, 0xf04e, 0xf04f, 0xf050, 0xf051,
+  0xf052, 0xf053, 0xf054, 0xf055, 0xf056, 0xf057, 0xf058, 0xf059,
+  0xf05a, 0xf05b, 0xf05c, 0xf05d, 0xf05e, 0xf05f, 0xf060, 0xf061,
+  0xf062, 0xf063, 0xf064, 0xf065, 0xf066, 0xf067, 0xf068, 0xf069,
+  0xf06a, 0xf06b, 0xf06c, 0xf06d, 0xf06e, 0xf06f, 0xf070, 0xf071,
+  0xf072, 0xf073, 0xf074, 0xf075, 0xf076, 0xf077, 0xf078, 0xf079,
+  0xf07a, 0xf07b, 0xf07c, 0xf07d, 0xf07e, 0xf07f, 0xf080, 0xf081,
+  0xf082, 0xf083, 0xf084, 0xf085, 0xf086, 0xf087, 0xf088, 0xf089,
+  0xf08a, 0xf08b, 0xf08c, 0xf08d, 0xf08e,
+  /* 0x84 */
+  0xf08f, 0xf090, 0xf091, 0xf092, 0xf093, 0xf094, 0xf095, 0xf096,
+  0xf097, 0xf098, 0xf099, 0xf09a, 0xf09b, 0xf09c, 0xf09d, 0xf09e,
+  0xf09f, 0xf0a0, 0xf0a1, 0xf0a2, 0xf0a3, 0xf0a4, 0xf0a5, 0xf0a6,
+  0xf0a7, 0xf0a8, 0xf0a9, 0xf0aa, 0xf0ab, 0xf0ac, 0xf0ad, 0xf0ae,
+  0xf0af, 0xf0b0, 0xf0b1, 0xf0b2, 0xf0b3, 0xf0b4, 0xf0b5, 0xf0b6,
+  0xf0b7, 0xf0b8, 0xf0b9, 0xf0ba, 0xf0bb, 0xf0bc, 0xf0bd, 0xf0be,
+  0xf0bf, 0xf0c0, 0xf0c1, 0xf0c2, 0xf0c3, 0xf0c4, 0xf0c5, 0xf0c6,
+  0xf0c7, 0xf0c8, 0xf0c9, 0xf0ca, 0xf0cb, 0xf0cc, 0xf0cd, 0xf0ce,
+  0xf0cf, 0xf0d0, 0xf0d1, 0xf0d2, 0xf0d3, 0xf0d4, 0xf0d5, 0xf0d6,
+  0xf0d7, 0xf0d8, 0xf0d9, 0xf0da, 0xf0db, 0xf0dc, 0xf0dd, 0xf0de,
+  0xf0df, 0xf0e0, 0xf0e1, 0xf0e2, 0xf0e3, 0xf0e4, 0xf0e5, 0xf0e6,
+  0xf0e7, 0xf0e8, 0xf0e9, 0xf0ea, 0xf0eb, 0xf0ec, 0xf0ed, 0xf0ee,
+  0xf0ef, 0xf0f0, 0xf0f1, 0xf0f2, 0xf0f3, 0xf0f4, 0xf0f5, 0xf0f6,
+  0xf0f7, 0xf0f8, 0xf0f9, 0xf0fa, 0xf0fb, 0xf0fc, 0xf0fd, 0xf0fe,
+  0xf0ff, 0xf100, 0xf101, 0xf102, 0xf103, 0xf104, 0xf105, 0xf106,
+  0xf107, 0xf108, 0xf109, 0xf10a, 0xf10b, 0xf10c, 0xf10d, 0xf10e,
+  0xf10f, 0xf110, 0xf111, 0xf112, 0xf113, 0xf114, 0xf115, 0xf116,
+  0xf117, 0xf118, 0xf119, 0xf11a, 0xf11b, 0xf11c, 0xf11d, 0xf11e,
+  0xf11f, 0xf120, 0xf121, 0xf122, 0xf123, 0xf124, 0xf125, 0xf126,
+  0xf127, 0xf128, 0xf129, 0xf12a, 0xf12b,
+  /* 0x85 */
+  0xf12c, 0xf12d, 0xf12e, 0xf12f, 0xf130, 0xf131, 0xf132, 0xf133,
+  0xf134, 0xf135, 0xf136, 0xf137, 0xf138, 0xf139, 0xf13a, 0xf13b,
+  0xf13c, 0xf13d, 0xf13e, 0xf13f, 0xf140, 0xf141, 0xf142, 0xf143,
+  0xf144, 0xf145, 0xf146, 0xf147, 0xf148, 0xf149, 0xf14a, 0xf14b,
+  0xf14c, 0xf14d, 0xf14e, 0xf14f, 0xf150, 0xf151, 0xf152, 0xf153,
+  0xf154, 0xf155, 0xf156, 0xf157, 0xf158, 0xf159, 0xf15a, 0xf15b,
+  0xf15c, 0xf15d, 0xf15e, 0xf15f, 0xf160, 0xf161, 0xf162, 0xf163,
+  0xf164, 0xf165, 0xf166, 0xf167, 0xf168, 0xf169, 0xf16a, 0xf16b,
+  0xf16c, 0xf16d, 0xf16e, 0xf16f, 0xf170, 0xf171, 0xf172, 0xf173,
+  0xf174, 0xf175, 0xf176, 0xf177, 0xf178, 0xf179, 0xf17a, 0xf17b,
+  0xf17c, 0xf17d, 0xf17e, 0xf17f, 0xf180, 0xf181, 0xf182, 0xf183,
+  0xf184, 0xf185, 0xf186, 0xf187, 0xf188, 0xf189, 0xf18a, 0xf18b,
+  0xf18c, 0xf18d, 0xf18e, 0xf18f, 0xf190, 0xf191, 0xf192, 0xf193,
+  0xf194, 0xf195, 0xf196, 0xf197, 0xf198, 0xf199, 0xf19a, 0xf19b,
+  0xf19c, 0xf19d, 0xf19e, 0xf19f, 0xf1a0, 0xf1a1, 0xf1a2, 0xf1a3,
+  0xf1a4, 0xf1a5, 0xf1a6, 0xf1a7, 0xf1a8, 0xf1a9, 0xf1aa, 0xf1ab,
+  0xf1ac, 0xf1ad, 0xf1ae, 0xf1af, 0xf1b0, 0xf1b1, 0xf1b2, 0xf1b3,
+  0xf1b4, 0xf1b5, 0xf1b6, 0xf1b7, 0xf1b8, 0xf1b9, 0xf1ba, 0xf1bb,
+  0xf1bc, 0xf1bd, 0xf1be, 0xf1bf, 0xf1c0, 0xf1c1, 0xf1c2, 0xf1c3,
+  0xf1c4, 0xf1c5, 0xf1c6, 0xf1c7, 0xf1c8,
+  /* 0x86 */
+  0xf1c9, 0xf1ca, 0xf1cb, 0xf1cc, 0xf1cd, 0xf1ce, 0xf1cf, 0xf1d0,
+  0xf1d1, 0xf1d2, 0xf1d3, 0xf1d4, 0xf1d5, 0xf1d6, 0xf1d7, 0xf1d8,
+  0xf1d9, 0xf1da, 0xf1db, 0xf1dc, 0xf1dd, 0xf1de, 0xf1df, 0xf1e0,
+  0xf1e1, 0xf1e2, 0xf1e3, 0xf1e4, 0xf1e5, 0xf1e6, 0xf1e7, 0xf1e8,
+  0xf1e9, 0xf1ea, 0xf1eb, 0xf1ec, 0xf1ed, 0xf1ee, 0xf1ef, 0xf1f0,
+  0xf1f1, 0xf1f2, 0xf1f3, 0xf1f4, 0xf1f5, 0xf1f6, 0xf1f7, 0xf1f8,
+  0xf1f9, 0xf1fa, 0xf1fb, 0xf1fc, 0xf1fd, 0xf1fe, 0xf1ff, 0xf200,
+  0xf201, 0xf202, 0xf203, 0xf204, 0xf205, 0xf206, 0xf207, 0xf208,
+  0xf209, 0xf20a, 0xf20b, 0xf20c, 0xf20d, 0xf20e, 0xf20f, 0xf210,
+  0xf211, 0xf212, 0xf213, 0xf214, 0xf215, 0xf216, 0xf217, 0xf218,
+  0xf219, 0xf21a, 0xf21b, 0xf21c, 0xf21d, 0xf21e, 0xf21f, 0xf220,
+  0xf221, 0xf222, 0xf223, 0xf224, 0xf225, 0xf226, 0xf227, 0xf228,
+  0xf229, 0xf22a, 0xf22b, 0xf22c, 0xf22d, 0xf22e, 0xf22f, 0xf230,
+  0xf231, 0xf232, 0xf233, 0xf234, 0xf235, 0xf236, 0xf237, 0xf238,
+  0xf239, 0xf23a, 0xf23b, 0xf23c, 0xf23d, 0xf23e, 0xf23f, 0xf240,
+  0xf241, 0xf242, 0xf243, 0xf244, 0xf245, 0xf246, 0xf247, 0xf248,
+  0xf249, 0xf24a, 0xf24b, 0xf24c, 0xf24d, 0xf24e, 0xf24f, 0xf250,
+  0xf251, 0xf252, 0xf253, 0xf254, 0xf255, 0xf256, 0xf257, 0xf258,
+  0xf259, 0xf25a, 0xf25b, 0xf25c, 0xf25d, 0xf25e, 0xf25f, 0xf260,
+  0xf261, 0xf262, 0xf263, 0xf264, 0xf265,
+  /* 0x87 */
+  0xf266, 0xf267, 0xf268, 0xf269, 0xf26a, 0xf26b, 0xf26c, 0xf26d,
+  0xf26e, 0xf26f, 0xf270, 0xf271, 0xf272, 0xf273, 0xf274, 0xf275,
+  0xf276, 0xf277, 0xf278, 0xf279, 0xf27a, 0xf27b, 0xf27c, 0xf27d,
+  0xf27e, 0xf27f, 0xf280, 0xf281, 0xf282, 0xf283, 0xf284, 0xf285,
+  0xf286, 0xf287, 0xf288, 0xf289, 0xf28a, 0xf28b, 0xf28c, 0xf28d,
+  0xf28e, 0xf28f, 0xf290, 0xf291, 0xf292, 0xf293, 0xf294, 0xf295,
+  0xf296, 0xf297, 0xf298, 0xf299, 0xf29a, 0xf29b, 0xf29c, 0xf29d,
+  0xf29e, 0xf29f, 0xf2a0, 0xf2a1, 0xf2a2, 0xf2a3, 0xf2a4, 0xf2a5,
+  0xf2a6, 0xf2a7, 0xf2a8, 0xf2a9, 0xf2aa, 0xf2ab, 0xf2ac, 0xf2ad,
+  0xf2ae, 0xf2af, 0xf2b0, 0xf2b1, 0xf2b2, 0xf2b3, 0xf2b4, 0xf2b5,
+  0xf2b6, 0xf2b7, 0xf2b8, 0xf2b9, 0xf2ba, 0xf2bb, 0xf2bc, 0xf2bd,
+  0xf2be, 0xf2bf, 0xf2c0, 0xf2c1, 0xf2c2, 0xf2c3, 0xf2c4, 0xf2c5,
+  0xf2c6, 0xf2c7, 0xf2c8, 0xf2c9, 0xf2ca, 0xf2cb, 0xf2cc, 0xf2cd,
+  0xf2ce, 0xf2cf, 0xf2d0, 0xf2d1, 0xf2d2, 0xf2d3, 0xf2d4, 0xf2d5,
+  0xf2d6, 0xf2d7, 0xf2d8, 0xf2d9, 0xf2da, 0xf2db, 0xf2dc, 0xf2dd,
+  0xf2de, 0xf2df, 0xf2e0, 0xf2e1, 0xf2e2, 0xf2e3, 0xf2e4, 0xf2e5,
+  0xf2e6, 0xf2e7, 0xf2e8, 0xf2e9, 0xf2ea, 0xf2eb, 0xf2ec, 0xf2ed,
+  0xf2ee, 0xf2ef, 0xf2f0, 0xf2f1, 0xf2f2, 0xf2f3, 0xf2f4, 0xf2f5,
+  0xf2f6, 0xf2f7, 0xf2f8, 0xf2f9, 0xf2fa, 0xf2fb, 0xf2fc, 0xf2fd,
+  0xf2fe, 0xf2ff, 0xf300, 0xf301, 0xf302,
+  /* 0x88 */
+  0xf303, 0xf304, 0xf305, 0xf306, 0xf307, 0xf308, 0xf309, 0xf30a,
+  0xf30b, 0xf30c, 0xf30d, 0xf30e, 0xf30f, 0xf310, 0xf311, 0xf312,
+  0xf313, 0xf314, 0xf315, 0xf316, 0xf317, 0xf318, 0x0100, 0x00c1,
+  0x01cd, 0x00c0, 0x0112, 0x00c9, 0x011a, 0x00c8, 0x014c, 0x00d3,
+  0x01d1, 0x00d2, 0xf325, 0x1ebe, 0xf327, 0x1ec0, 0x00ca, 0x0101,
+  0x00e1, 0x01ce, 0x00e0, 0x0251, 0x0113, 0x00e9, 0x011b, 0x00e8,
+  0x012b, 0x00ed, 0x01d0, 0x00ec, 0x014d, 0x00f3, 0x01d2, 0x00f2,
+  0x016b, 0x00fa, 0x01d4, 0x00f9, 0x01d6, 0x01d8, 0x01da, 0x01dc,
+  0x00fc, 0xf344, 0x1ebf, 0xf346, 0x1ec1, 0x00ea, 0x0261, 0xf34a,
+  0xf34b, 0xf34c, 0xf34d, 0xf34e, 0xf34f, 0xf350, 0xf351, 0xf352,
+  0xf353, 0xf354, 0xf355, 0xf356, 0xf357, 0xf358, 0xf359, 0xf35a,
+  0xf35b, 0xf35c, 0xf35d, 0xf35e, 0xf35f, 0xf360, 0xf361, 0xf362,
+  0xf363, 0xf364, 0xf365, 0xf366, 0xf367, 0xf368, 0xf369, 0xf36a,
+  0xf36b, 0xf36c, 0xf36d, 0xf36e, 0xf36f, 0xf370, 0xf371, 0xf372,
+  0xf373, 0xf374, 0xf375, 0xf376, 0xf377, 0xf378, 0xf379, 0xf37a,
+  0xf37b, 0xf37c, 0xf37d, 0xf37e, 0xf37f, 0xf380, 0xf381, 0xf382,
+  0xf383, 0xf384, 0xf385, 0xf386, 0xf387, 0xf388, 0xf389, 0xf38a,
+  0xf38b, 0xf38c, 0xf38d, 0xf38e, 0xf38f, 0xf390, 0xf391, 0xf392,
+  0xf393, 0xf394, 0xf395, 0xf396, 0xf397, 0xf398, 0xf399, 0xf39a,
+  0xf39b, 0xf39c, 0xf39d, 0xf39e, 0xf39f,
+  /* 0x89 */
+  0xf3a0, 0xf3a1, 0xf3a2, 0x650a, 0xf3a4, 0xf3a5, 0x4e3d, 0x6edd,
+  0x9d4e, 0x91df, 0xf3aa, 0xf3ab, 0xf3ac, 0x6491, 0x4f1a, 0x4f28,
+  0x4fa8, 0x5156, 0x5174, 0x519c, 0x51e4, 0x52a1, 0x52a8, 0x533b,
+  0x534e, 0x53d1, 0x53d8, 0x56e2, 0x58f0, 0x5904, 0x5907, 0x5932,
+  0x5934, 0x5b66, 0x5b9e, 0x5b9f, 0x5c9a, 0x5e86, 0x603b, 0x6589,
+  0x67fe, 0x6804, 0x6865, 0x6d4e, 0x70bc, 0x7535, 0x7ea4, 0x7eac,
+  0x7eba, 0x7ec7, 0x7ecf, 0x7edf, 0x7f06, 0x7f37, 0x827a, 0x82cf,
+  0x836f, 0x89c6, 0x8bbe, 0x8be2, 0x8f66, 0x8f67, 0x8f6e, 0x7411,
+  0x7cfc, 0x7dcd, 0x6946, 0x7ac9, 0x5227, 0xf3e5, 0xf3e6, 0xf3e7,
+  0xf3e8, 0x918c, 0x78b8, 0x915e, 0x80bc, 0xf3ed, 0x8d0b, 0x80f6,
+  0xf3f0, 0xf3f1, 0xf3f2, 0x809f, 0x9ec7, 0x4ccd, 0x9dc9, 0x9e0c,
+  0x4c3e, 0xf3f9, 0xf3fa, 0x9e0a, 0xf3fc, 0x35c1, 0xf3fe, 0x6e9a,
+  0x823e, 0x7519, 0xf402, 0x4911, 0x9a6c, 0x9a8f, 0x9f99, 0x7987,
+  0xf408, 0xf409, 0xf40a, 0xf40b, 0x4e24, 0x4e81, 0x4e80, 0x4e87,
+  0x4ebf, 0x4eeb, 0x4f37, 0x344c, 0x4fbd, 0x3e48, 0x5003, 0x5088,
+  0x347d, 0x3493, 0x34a5, 0x5186, 0x5905, 0x51db, 0x51fc, 0x5205,
+  0x4e89, 0x5279, 0x5290, 0x5327, 0x35c7, 0x53a9, 0x3551, 0x53b0,
+  0x3553, 0x53c2, 0x5423, 0x356d, 0x3572, 0x3681, 0x5493, 0x54a3,
+  0x54b4, 0x54b9, 0x54d0, 0x54ef, 0x5518, 0x5523, 0x5528, 0x3598,
+  0x553f, 0x35a5, 0x35bf, 0x55d7, 0x35c5,
+  /* 0x8a */
+  0xf43d, 0x5525, 0xf43f, 0xf440, 0xf441, 0xf442, 0x5590, 0xf444,
+  0x39ec, 0xf446, 0x8e46, 0xf448, 0xf449, 0x4053, 0xf44b, 0x777a,
+  0xf44d, 0x3a34, 0x47d5, 0xf450, 0xf451, 0xf452, 0x64dd, 0xf454,
+  0xf455, 0xf456, 0xf457, 0x648d, 0x8e7e, 0xf45a, 0xf45b, 0xf45c,
+  0xf45d, 0xf45e, 0xf45f, 0xf460, 0xf461, 0xf462, 0xf463, 0x47f4,
+  0xf465, 0xf466, 0x9ab2, 0x3a67, 0xf469, 0x3fed, 0x3506, 0xf46c,
+  0xf46d, 0xf46e, 0xf46f, 0x9d6e, 0x9815, 0xf472, 0x43d9, 0xf474,
+  0x64b4, 0x54e3, 0xf477, 0xf478, 0xf479, 0x39fb, 0xf47b, 0xf47c,
+  0xf47d, 0xf47e, 0x64ea, 0xf480, 0xf481, 0x8e68, 0xf483, 0xf484,
+  0xf485, 0xf486, 0x480b, 0xf488, 0x3ffa, 0x5873, 0xf48b, 0xf48c,
+  0xf48d, 0xf48e, 0xf48f, 0xf490, 0xf491, 0x5579, 0x40bb, 0x43ba,
+  0xf495, 0x4ab4, 0xf497, 0xf498, 0x81aa, 0x98f5, 0xf49b, 0x6379,
+  0x39fe, 0xf49e, 0x8dc0, 0x56a1, 0x647c, 0x3e43, 0xf4a3, 0xf4a4,
+  0xf4a5, 0xf4a6, 0xf4a7, 0xf4a8, 0xf4a9, 0xf4aa, 0x3992, 0x3a06,
+  0xf4ad, 0x3578, 0xf4af, 0xf4b0, 0x5652, 0xf4b2, 0xf4b3, 0xf4b4,
+  0x34bc, 0x6c3d, 0xf4b7, 0xf4b8, 0xf4b9, 0xf4ba, 0xf4bb, 0xf4bc,
+  0xf4bd, 0xf4be, 0xf4bf, 0xf4c0, 0xf4c1, 0x7f93, 0xf4c3, 0xf4c4,
+  0xf4c5, 0x35fb, 0xf4c7, 0xf4c8, 0xf4c9, 0xf4ca, 0x3f93, 0xf4cc,
+  0xf4cd, 0xf4ce, 0xf4cf, 0xf4d0, 0xf4d1, 0xf4d2, 0xf4d3, 0xf4d4,
+  0xf4d5, 0x3ff9, 0xf4d7, 0x6432, 0xf4d9,
+  /* 0x8b */
+  0xf4da, 0xf4db, 0xf4dc, 0xf4dd, 0xf4de, 0xf4df, 0xf4e0, 0x3a18,
+  0xf4e2, 0xf4e3, 0xf4e4, 0xf4e5, 0xf4e6, 0xf4e7, 0xf4e8, 0xf4e9,
+  0x95aa, 0x54cc, 0x82c4, 0x55b9, 0xf4ee, 0xf4ef, 0x9c26, 0x9ab6,
+  0xf4f2, 0xf4f3, 0x7140, 0x816d, 0x80ec, 0x5c1c, 0xf4f8, 0x8134,
+  0x3797, 0x535f, 0xf4fc, 0x91b6, 0xf4fe, 0xf4ff, 0xf500, 0xf501,
+  0x35dd, 0xf503, 0x3609, 0xf505, 0x56af, 0xf507, 0xf508, 0xf509,
+  0xf50a, 0xf50b, 0xf50c, 0xf50d, 0xf50e, 0xf50f, 0xf510, 0xf511,
+  0x5a54, 0xf513, 0xf514, 0xf515, 0xf516, 0x579c, 0xf518, 0xf519,
+  0xf51a, 0xf51b, 0xf51c, 0xf51d, 0x3703, 0xf51f, 0xf520, 0xf521,
+  0xf522, 0xf523, 0xf524, 0xf525, 0xf526, 0x5899, 0x5268, 0x361a,
+  0xf52a, 0x7bb2, 0x5b68, 0x4800, 0x4b2c, 0x9f27, 0x49e7, 0x9c1f,
+  0x9b8d, 0xf533, 0xf534, 0x55fb, 0x35f2, 0x5689, 0x4e28, 0x5902,
+  0xf53a, 0xf53b, 0x9751, 0xf53d, 0x4e5b, 0x4ebb, 0x353e, 0x5c23,
+  0x5f51, 0x5fc4, 0x38fa, 0x624c, 0x6535, 0x6b7a, 0x6c35, 0x6c3a,
+  0x706c, 0x722b, 0x4e2c, 0x72ad, 0xf54e, 0x7f52, 0x793b, 0x7cf9,
+  0x7f53, 0xf553, 0x34c1, 0xf555, 0xf556, 0x8002, 0x8080, 0xf559,
+  0xf55a, 0x535d, 0x8864, 0x89c1, 0xf55e, 0x8ba0, 0x8d1d, 0x9485,
+  0x9578, 0x957f, 0x95e8, 0xf565, 0x97e6, 0x9875, 0x98ce, 0x98de,
+  0x9963, 0xf56b, 0x9c7c, 0x9e1f, 0x9ec4, 0x6b6f, 0xf907, 0x4e37,
+  0xf572, 0x961d, 0x6237, 0x94a2, 0xf576,
+  /* 0x8c */
+  0x503b, 0x6dfe, 0xf579, 0xf57a, 0x3dc9, 0x888f, 0xf57d, 0x7077,
+  0x5cf5, 0x4b20, 0xf581, 0x3559, 0xf583, 0x6122, 0xf585, 0x8fa7,
+  0x91f6, 0x7191, 0x6719, 0x73ba, 0xf58b, 0xf58c, 0x3c8b, 0xf58e,
+  0x4b10, 0x78e4, 0x7402, 0x51ae, 0xf593, 0x4009, 0x6a63, 0xf596,
+  0x4223, 0x860f, 0xf599, 0x7a2a, 0xf59b, 0xf59c, 0x9755, 0x704d,
+  0x5324, 0xf5a0, 0x93f4, 0x76d9, 0xf5a3, 0xf5a4, 0x77dd, 0x4ea3,
+  0x4ff0, 0x50bc, 0x4e2f, 0x4f17, 0xf5ab, 0x5434, 0x7d8b, 0x5892,
+  0x58d0, 0xf5b0, 0x5e92, 0x5e99, 0x5fc2, 0xf5b4, 0x658b, 0xf5b6,
+  0x6919, 0x6a43, 0xf5b9, 0x6cff, 0xf5bb, 0x7200, 0xf5bd, 0x738c,
+  0x3edb, 0xf5c0, 0x5b15, 0x74b9, 0x8b83, 0xf5c4, 0xf5c5, 0x7a93,
+  0x7bec, 0x7cc3, 0x7e6c, 0x82f8, 0x8597, 0xf5cc, 0x8890, 0xf5ce,
+  0x8eb9, 0xf5d0, 0x8fcf, 0x855f, 0x99e0, 0x9221, 0xf5d5, 0xf5d6,
+  0xf5d7, 0x4071, 0x42a2, 0x5a1a, 0xf5db, 0xf5dc, 0xf5dd, 0x9868,
+  0x676b, 0x4276, 0x573d, 0xf5e2, 0x85d6, 0xf5e4, 0x82bf, 0xf5e6,
+  0x4c81, 0xf5e8, 0x5d7b, 0xf5ea, 0xf5eb, 0xf5ec, 0xf5ed, 0x5b96,
+  0xf5ef, 0xf5f0, 0x7e5b, 0xf5f2, 0xf5f3, 0xf5f4, 0xf5f5, 0xf5f6,
+  0xf5f7, 0xf5f8, 0xf5f9, 0xf5fa, 0xf5fb, 0xf5fc, 0xf5fd, 0xf5fe,
+  0xf5ff, 0xf600, 0xf601, 0xf602, 0xf603, 0xf604, 0xf605, 0xf606,
+  0xf607, 0xf608, 0xf609, 0xf60a, 0xf60b, 0xf60c, 0xf60d, 0xf60e,
+  0xf60f, 0xf610, 0xf611, 0xf612, 0xf613,
+  /* 0x8d */
+  0xf614, 0xf615, 0xf616, 0xf617, 0xf618, 0xf619, 0xf61a, 0xf61b,
+  0xf61c, 0xf61d, 0xf61e, 0xf61f, 0xf620, 0xf621, 0xf622, 0xf623,
+  0xf624, 0xf625, 0xf626, 0xf627, 0xf628, 0xf629, 0xf62a, 0xf62b,
+  0xf62c, 0xf62d, 0xf62e, 0xf62f, 0xf630, 0xf631, 0xf632, 0xf633,
+  0x5d3e, 0x5d48, 0x5d56, 0x3dfc, 0x380f, 0x5da4, 0x5db9, 0x3820,
+  0x3838, 0x5e42, 0x5ebd, 0x5f25, 0x5f83, 0x3908, 0x3914, 0x393f,
+  0x394d, 0x60d7, 0x613d, 0x5ce5, 0x3989, 0x61b7, 0x61b9, 0x61cf,
+  0x39b8, 0x622c, 0x6290, 0x62e5, 0x6318, 0x39f8, 0x56b1, 0x3a03,
+  0x63e2, 0x63fb, 0x6407, 0x645a, 0x3a4b, 0x64c0, 0x5d15, 0x5621,
+  0x9f9f, 0x3a97, 0x6586, 0x3abd, 0x65ff, 0x6653, 0x3af2, 0x6692,
+  0x3b22, 0x6716, 0x3b42, 0x67a4, 0x6800, 0x3b58, 0x684a, 0x6884,
+  0x3b72, 0x3b71, 0x3b7b, 0x6909, 0x6943, 0x725c, 0x6964, 0x699f,
+  0x6985, 0x3bbc, 0x69d6, 0x3bdd, 0x6a65, 0x6a74, 0x6a71, 0x6a82,
+  0x3bec, 0x6a99, 0x3bf2, 0x6aab, 0x6ab5, 0x6ad4, 0x6af6, 0x6b81,
+  0x6bc1, 0x6bea, 0x6c75, 0x6caa, 0x3ccb, 0x6d02, 0x6d06, 0x6d26,
+  0x6d81, 0x3cef, 0x6da4, 0x6db1, 0x6e15, 0x6e18, 0x6e29, 0x6e86,
+  0xf694, 0x6ebb, 0x6ee2, 0x6eda, 0x9f7f, 0x6ee8, 0x6ee9, 0x6f24,
+  0x6f34, 0x3d46, 0xf69e, 0x6f81, 0x6fbe, 0x3d6a, 0x3d75, 0x71b7,
+  0x5c99, 0x3d8a, 0x702c, 0x3d91, 0x7050, 0x7054, 0x706f, 0x707f,
+  0x7089, 0xf6ad, 0x43c1, 0x35f1, 0xf6b0,
+  /* 0x8e */
+  0xe311, 0x57be, 0xe313, 0x713e, 0xe315, 0x364e, 0x69a2, 0xe318,
+  0x5b74, 0x7a49, 0xe31b, 0xe31c, 0x7a65, 0x7a7d, 0xe31f, 0x7abb,
+  0x7ab0, 0x7ac2, 0x7ac3, 0x71d1, 0xe325, 0x41ca, 0x7ada, 0x7add,
+  0x7aea, 0x41ef, 0x54b2, 0xe32c, 0x7b0b, 0x7b55, 0x7b29, 0xe330,
+  0xe331, 0x7ba2, 0x7b6f, 0x839c, 0xe335, 0xe336, 0x7bd0, 0x8421,
+  0x7b92, 0x7bb8, 0xe33b, 0x3dad, 0xe33d, 0x8492, 0x7bfa, 0x7c06,
+  0x7c35, 0xe342, 0x7c44, 0x7c83, 0xe345, 0x7ca6, 0x667d, 0xe348,
+  0x7cc9, 0x7cc7, 0x7ce6, 0x7c74, 0x7cf3, 0x7cf5, 0x7cce, 0x7e67,
+  0x451d, 0xe352, 0x7d5d, 0xe354, 0x748d, 0x7d89, 0x7dab, 0x7135,
+  0x7db3, 0x7dd2, 0xe35b, 0xe35c, 0x7de4, 0x3d13, 0x7df5, 0xe360,
+  0x7de5, 0xe362, 0x7e1d, 0xe364, 0xe365, 0x7e6e, 0x7e92, 0x432b,
+  0x946c, 0x7e27, 0x7f40, 0x7f41, 0x7f47, 0x7936, 0xe36f, 0x99e1,
+  0x7f97, 0xe372, 0x7fa3, 0xe374, 0xe375, 0x455c, 0xe377, 0x4503,
+  0xe379, 0x7ffa, 0xe37b, 0x8005, 0x8008, 0x801d, 0x8028, 0x802f,
+  0xe381, 0xe382, 0x803b, 0x803c, 0x8061, 0xe386, 0x4989, 0xe388,
+  0xe389, 0xe38a, 0x6725, 0x80a7, 0xe38d, 0x8107, 0x811a, 0x58b0,
+  0xe391, 0x6c7f, 0xe393, 0xe394, 0x64e7, 0xe396, 0x8218, 0xe398,
+  0x6a53, 0xe39a, 0xe39b, 0x447a, 0x8229, 0xe39e, 0xe39f, 0xe3a0,
+  0x4ff9, 0xe3a2, 0x84e2, 0x8362, 0xe3a5, 0xe3a6, 0xe3a7, 0xe3a8,
+  0xe3a9, 0x82aa, 0x691b, 0xe3ac, 0x41db,
+  /* 0x8f */
+  0x854b, 0x82d0, 0x831a, 0xe3b1, 0xe3b2, 0x36c1, 0xe3b4, 0xe3b5,
+  0x827b, 0x82e2, 0x8318, 0xe3b9, 0xe3ba, 0xe3bb, 0xe3bc, 0xe3bd,
+  0x3dbf, 0x831d, 0x55ec, 0x8385, 0x450b, 0xe3c3, 0x83ac, 0x83c1,
+  0x83d3, 0x347e, 0xe3c8, 0x6a57, 0x855a, 0x3496, 0xe3cc, 0xe3cd,
+  0x8458, 0xe3cf, 0x8471, 0x3dd3, 0x44e4, 0x6aa7, 0x844a, 0xe3d5,
+  0x7958, 0x84a8, 0xe3d8, 0xe3d9, 0xe3da, 0x84de, 0x840f, 0x8391,
+  0x44a0, 0x8493, 0x84e4, 0xe3e1, 0x4240, 0xe3e3, 0x4543, 0x8534,
+  0x5af2, 0xe3e7, 0x4527, 0x8573, 0x4516, 0x67bf, 0x8616, 0xe3ed,
+  0xe3ee, 0x85c1, 0xe3f0, 0x8602, 0xe3f2, 0xe3f3, 0xe3f4, 0x456a,
+  0x8628, 0x3648, 0xe3f8, 0x53f7, 0xe3fa, 0x867e, 0x8771, 0xe3fd,
+  0x87ee, 0xe3ff, 0x87b1, 0x87da, 0x880f, 0x5661, 0x866c, 0x6856,
+  0x460f, 0x8845, 0x8846, 0xe409, 0xe40a, 0xe40b, 0x885e, 0x889c,
+  0x465b, 0x88b4, 0x88b5, 0x63c1, 0x88c5, 0x7777, 0xe414, 0x8987,
+  0x898a, 0x89a6, 0x89a9, 0x89a7, 0x89bc, 0xe41b, 0x89e7, 0xe41d,
+  0xe41e, 0x8a9c, 0x7793, 0x91fe, 0x8a90, 0xe423, 0x7ae9, 0xe425,
+  0xe426, 0x4713, 0xe428, 0x717c, 0x8b0c, 0x8b1f, 0xe42c, 0xe42d,
+  0x8b3f, 0x8b4c, 0x8b4d, 0x8aa9, 0xe432, 0x8b90, 0x8b9b, 0x8aaf,
+  0xe436, 0x4615, 0x884f, 0x8c9b, 0xe43a, 0xe43b, 0xe43c, 0x3725,
+  0xe43e, 0x8cd6, 0xe440, 0xe441, 0x8d12, 0x8d03, 0xe444, 0x8cdb,
+  0x705c, 0x8d11, 0xe448, 0x3ed0, 0x8d77,
+  /* 0x90 */
+  0x8da9, 0xe44c, 0xe44d, 0xe44e, 0x3b7c, 0xe450, 0xe451, 0x7ae7,
+  0x8ead, 0x8eb6, 0x8ec3, 0x92d4, 0x8f19, 0x8f2d, 0xe459, 0xe45a,
+  0x8fa5, 0x9303, 0xe45d, 0xe45e, 0x8fb3, 0x492a, 0xe461, 0xe462,
+  0xe463, 0x5ef8, 0xe465, 0x8ff9, 0xe467, 0xe468, 0xe469, 0xe46a,
+  0x3980, 0xe46c, 0x9037, 0xe46e, 0xe46f, 0x9061, 0xe471, 0xe472,
+  0x90a8, 0xe474, 0x90c4, 0xe476, 0x90ae, 0x90fd, 0x9167, 0x3af0,
+  0x91a9, 0x91c4, 0x7cac, 0xe47e, 0xe47f, 0x920e, 0x6c9f, 0x9241,
+  0x9262, 0xe484, 0x92b9, 0xe486, 0xe487, 0xe488, 0xe489, 0xe48a,
+  0x932c, 0x936b, 0xe48d, 0xe48e, 0x708f, 0x5ac3, 0xe491, 0xe492,
+  0x4965, 0x9244, 0xe495, 0xe496, 0xe497, 0x9373, 0x945b, 0x8ebc,
+  0x9585, 0x95a6, 0x9426, 0x95a0, 0x6ff6, 0x42b9, 0xe4a1, 0xe4a2,
+  0xe4a3, 0xe4a4, 0x49df, 0x6c1c, 0x967b, 0x9696, 0x416c, 0x96a3,
+  0xe4ab, 0x61da, 0x96b6, 0x78f5, 0xe4af, 0x96bd, 0x53cc, 0x49a1,
+  0xe4b3, 0xe4b4, 0xe4b5, 0xe4b6, 0xe4b7, 0xe4b8, 0xe4b9, 0xe4ba,
+  0x9731, 0x8642, 0x9736, 0x4a0f, 0x453d, 0x4585, 0xe4c1, 0x7075,
+  0x5b41, 0x971b, 0x975c, 0xe4c6, 0x9757, 0x5b4a, 0xe4c9, 0x975f,
+  0x9425, 0x50d0, 0xe4cd, 0xe4ce, 0x9789, 0x979f, 0x97b1, 0x97be,
+  0x97c0, 0x97d2, 0x97e0, 0xe4d6, 0x97ee, 0x741c, 0xe4d9, 0x97ff,
+  0x97f5, 0xe4dc, 0xe4dd, 0x4ad1, 0x9834, 0x9833, 0x984b, 0x9866,
+  0x3b0e, 0xe4e4, 0x3d51, 0xe4e6, 0xe4e7,
+  /* 0x91 */
+  0xe4e8, 0x98ca, 0x98b7, 0x98c8, 0x98c7, 0x4aff, 0xe4ee, 0xe4ef,
+  0x55b0, 0x98e1, 0x98e6, 0x98ec, 0x9378, 0x9939, 0xe4f6, 0x4b72,
+  0xe4f8, 0xe4f9, 0x99f5, 0x9a0c, 0x9a3b, 0x9a10, 0x9a58, 0xe4ff,
+  0x36c4, 0xe501, 0xe502, 0x9ae0, 0x9ae2, 0xe505, 0x9af4, 0x4c0e,
+  0x9b14, 0x9b2d, 0xe50a, 0x5034, 0x9b34, 0xe50d, 0x38c3, 0xe50f,
+  0x9b50, 0x9b40, 0xe512, 0x5a45, 0xe514, 0x9b8e, 0xe516, 0x9c02,
+  0x9bff, 0x9c0c, 0xe51a, 0x9dd4, 0xe51c, 0xe51d, 0xe51e, 0xe51f,
+  0xe520, 0xe521, 0x9d7e, 0x9d83, 0xe524, 0x9e0e, 0x6888, 0x9dc4,
+  0xe528, 0xe529, 0xe52a, 0xe52b, 0xe52c, 0x9d39, 0xe52e, 0xe52f,
+  0x9e90, 0x9e95, 0x9e9e, 0x9ea2, 0x4d34, 0x9eaa, 0x9eaf, 0xe537,
+  0x9ec1, 0x3b60, 0x39e5, 0x3d1d, 0x4f32, 0x37be, 0xe53e, 0x9f02,
+  0x9f08, 0x4b96, 0x9424, 0xe543, 0x9f17, 0x9f16, 0x9f39, 0x569f,
+  0x568a, 0x9f45, 0x99b8, 0xe54b, 0x97f2, 0x847f, 0x9f62, 0x9f69,
+  0x7adc, 0x9f8e, 0x7216, 0x4bbe, 0xe554, 0xe555, 0x7177, 0xe557,
+  0xe558, 0xe559, 0x739e, 0xe55b, 0xe55c, 0x799f, 0xe55e, 0xe55f,
+  0x9369, 0x93f3, 0xe562, 0x92ec, 0x9381, 0x93cb, 0xe566, 0xe567,
+  0x7217, 0x3eeb, 0x7772, 0x7a43, 0x70d0, 0xe56d, 0xe56e, 0x717e,
+  0xe570, 0x70a3, 0xe572, 0xe573, 0x3ec7, 0xe575, 0xe576, 0xe577,
+  0x3722, 0xe579, 0xe57a, 0x36e1, 0xe57c, 0xe57d, 0xe57e, 0x3723,
+  0xe580, 0x575b, 0xe582, 0xe583, 0xe584,
+  /* 0x92 */
+  0xe585, 0xe586, 0x8503, 0xe588, 0x8503, 0x8455, 0xe58b, 0xe58c,
+  0xe58d, 0xe58e, 0xe58f, 0xe590, 0x44f4, 0xe592, 0xe593, 0xe594,
+  0x67f9, 0x3733, 0x3c15, 0x3de7, 0x586c, 0xe59a, 0x6810, 0x4057,
+  0xe59d, 0xe59e, 0xe59f, 0xe5a0, 0xe5a1, 0x54cb, 0x569e, 0xe5a4,
+  0x5692, 0xe5a6, 0xe5a7, 0xe5a8, 0x93c6, 0xe5aa, 0x939c, 0x4ef8,
+  0x512b, 0x3819, 0xe5af, 0x4ebc, 0xe5b1, 0xe5b2, 0x4f4b, 0x4f8a,
+  0xe5b5, 0x5a68, 0xe5b7, 0xe5b8, 0x3999, 0xe5ba, 0xe5bb, 0x3435,
+  0x4f29, 0xe5be, 0xe5bf, 0xe5c0, 0x8ada, 0xe5c2, 0x4e98, 0x50cd,
+  0x510d, 0x4fa2, 0x4f03, 0xe5c8, 0xe5c9, 0x4f42, 0x502e, 0x506c,
+  0x5081, 0x4fcc, 0x4fe5, 0x5058, 0x50fc, 0x5159, 0x515b, 0x515d,
+  0x515e, 0x6e76, 0xe5d7, 0xe5d8, 0xe5d9, 0x6d72, 0xe5db, 0xe5dc,
+  0x51a8, 0x51c3, 0xe5df, 0x44dd, 0xe5e1, 0xe5e2, 0xe5e3, 0x8d7a,
+  0xe5e5, 0xe5e6, 0x5259, 0x52a4, 0xe5e9, 0x52e1, 0x936e, 0x467a,
+  0x718c, 0xe5ee, 0xe5ef, 0xe5f0, 0xe5f1, 0x69d1, 0xe5f3, 0x7479,
+  0x3ede, 0x7499, 0x7414, 0x7456, 0x7398, 0x4b8e, 0xe5fb, 0xe5fc,
+  0x53d0, 0x3584, 0x720f, 0xe600, 0x55b4, 0xe602, 0x54cd, 0xe604,
+  0x571d, 0x925d, 0x96f4, 0x9366, 0x57dd, 0x578d, 0x577f, 0x363e,
+  0x58cb, 0x5a99, 0xe60f, 0xe610, 0xe611, 0xe612, 0x5a2c, 0x59b8,
+  0x928f, 0x5a7e, 0x5acf, 0x5a12, 0xe619, 0xe61a, 0xe61b, 0xe61c,
+  0x36f5, 0x6d05, 0x7443, 0x5a21, 0xe621,
+  /* 0x93 */
+  0x5a81, 0xe623, 0xe624, 0x93e0, 0x748c, 0xe627, 0x7105, 0x4972,
+  0x9408, 0xe62b, 0x93bd, 0x37a0, 0x5c1e, 0x5c9e, 0x5e5e, 0x5e48,
+  0xe632, 0xe633, 0xe634, 0x5ecd, 0x5b4f, 0xe637, 0xe638, 0x3701,
+  0xe63a, 0x36dd, 0xe63c, 0x36d3, 0x812a, 0xe63f, 0xe640, 0xe641,
+  0xe642, 0x5f0c, 0x5f0e, 0xe645, 0xe646, 0x5a6b, 0xe648, 0x5b44,
+  0x8614, 0xe64b, 0x8860, 0x607e, 0xe64e, 0xe64f, 0x5fdb, 0x3eb8,
+  0xe652, 0xe653, 0xe654, 0xe655, 0x61c0, 0xe657, 0xe658, 0xe659,
+  0x6199, 0x6198, 0x6075, 0xe65d, 0xe65e, 0xe65f, 0xe660, 0x6471,
+  0xe662, 0xe663, 0x3a29, 0xe665, 0xe666, 0xe667, 0xe668, 0x6337,
+  0xe66a, 0x64b6, 0x6331, 0x63d1, 0xe66e, 0xe66f, 0x62a4, 0xe671,
+  0x643b, 0x656b, 0x6972, 0x3bf4, 0xe676, 0xe677, 0xe678, 0xe679,
+  0x550d, 0xe67b, 0xe67c, 0xe67d, 0x66ce, 0xe67f, 0xe680, 0x3ae0,
+  0x4190, 0xe683, 0xe684, 0xe685, 0xe686, 0xe687, 0xe688, 0x78ee,
+  0xe68a, 0xe68b, 0xe68c, 0x3464, 0xe68e, 0xe68f, 0xe690, 0x668e,
+  0xe692, 0x666b, 0x4b93, 0x6630, 0xe696, 0xe697, 0x6663, 0xe699,
+  0xe69a, 0x661e, 0xe69c, 0x38d1, 0xe69e, 0xe69f, 0x3b99, 0xe6a1,
+  0xe6a2, 0x74d0, 0x3b96, 0x678f, 0xe6a6, 0x68b6, 0x681e, 0x3bc4,
+  0x6abe, 0x3863, 0xe6ac, 0xe6ad, 0x6a33, 0x6a52, 0x6ac9, 0x6b05,
+  0xe6b2, 0x6511, 0x6898, 0x6a4c, 0x3bd7, 0x6a7a, 0x6b57, 0xe6b9,
+  0xe6ba, 0x93a0, 0x92f2, 0xe6bd, 0xe6be,
+  /* 0x94 */
+  0x9289, 0xe6c0, 0xe6c1, 0x9467, 0x6da5, 0x6f0b, 0xe6c5, 0x6d67,
+  0xe6c7, 0x3d8f, 0x6e04, 0xe6ca, 0x5a3d, 0x6e0a, 0x5847, 0x6d24,
+  0x7842, 0x713b, 0xe6d1, 0xe6d2, 0x70f1, 0x7250, 0x7287, 0x7294,
+  0xe6d7, 0xe6d8, 0x5179, 0xe6da, 0xe6db, 0x747a, 0xe6dd, 0xe6de,
+  0xe6df, 0xe6e0, 0xe6e1, 0x3f06, 0x3eb1, 0xe6e4, 0xe6e5, 0xe6e6,
+  0x60a7, 0x3ef3, 0x74cc, 0x743c, 0x9387, 0x7437, 0x449f, 0xe6ee,
+  0x4551, 0x7583, 0x3f63, 0xe6f2, 0xe6f3, 0x3f58, 0x7555, 0x7673,
+  0xe6f7, 0x3b19, 0x7468, 0xe6fa, 0xe6fb, 0xe6fc, 0x3afb, 0x3dcd,
+  0xe6ff, 0x3eff, 0xe701, 0xe702, 0x91fa, 0x5732, 0x9342, 0xe706,
+  0xe707, 0x50df, 0xe709, 0xe70a, 0x7778, 0xe70c, 0x770e, 0x770f,
+  0x777b, 0xe710, 0xe711, 0x3a5e, 0xe713, 0x7438, 0x749b, 0x3ebf,
+  0xe717, 0xe718, 0x40c8, 0xe71a, 0xe71b, 0x9307, 0xe71d, 0x781e,
+  0x788d, 0x7888, 0x78d2, 0x73d0, 0x7959, 0xe724, 0xe725, 0x410e,
+  0x799b, 0x8496, 0x79a5, 0x6a2d, 0xe72b, 0x7a3a, 0x79f4, 0x416e,
+  0xe72f, 0x4132, 0x9235, 0x79f1, 0xe733, 0xe734, 0xe735, 0xe736,
+  0xe737, 0x3597, 0x556b, 0x3570, 0x36aa, 0xe73c, 0xe73d, 0x7ae2,
+  0x5a59, 0xe740, 0xe741, 0xe742, 0x5a0d, 0xe744, 0x78f0, 0x5a2a,
+  0xe747, 0x7afe, 0x41f9, 0x7c5d, 0x7c6d, 0x4211, 0xe74d, 0xe74e,
+  0xe74f, 0x7ccd, 0xe751, 0xe752, 0x7c8e, 0x7c7c, 0x7cae, 0x6ab2,
+  0x7ddc, 0x7e07, 0x7dd3, 0x7f4e, 0xe75b,
+  /* 0x95 */
+  0xe75c, 0xe75d, 0x7d97, 0xe75f, 0x426a, 0xe761, 0xe762, 0x67d6,
+  0xe764, 0xe765, 0x57c4, 0xe767, 0xe768, 0xe769, 0x7fdd, 0x7b27,
+  0xe76c, 0xe76d, 0xe76e, 0x7b0c, 0xe770, 0x99e6, 0x8645, 0x9a63,
+  0x6a1c, 0xe775, 0x39e2, 0xe777, 0xe778, 0x9a1f, 0xe77a, 0x8480,
+  0xe77c, 0xe77d, 0x44ea, 0x8137, 0x4402, 0x80c6, 0x8109, 0x8142,
+  0xe784, 0x98c3, 0xe786, 0x8262, 0x8265, 0xe789, 0x8453, 0xe78b,
+  0x8610, 0xe78d, 0x5a86, 0x417f, 0xe790, 0x5b2b, 0xe792, 0x5ae4,
+  0xe794, 0x86a0, 0xe796, 0xe797, 0x882d, 0xe799, 0x5a02, 0x886e,
+  0x4f45, 0x8887, 0x88bf, 0x88e6, 0x8965, 0x894d, 0xe7a2, 0x8954,
+  0xe7a4, 0xe7a5, 0xe7a6, 0xe7a7, 0xe7a8, 0xe7a9, 0x3ead, 0x84a3,
+  0x46f5, 0x46cf, 0x37f2, 0x8a3d, 0x8a1c, 0xe7b1, 0x5f4d, 0x922b,
+  0xe7b4, 0x65d4, 0x7129, 0x70c4, 0xe7b8, 0x9d6d, 0x8c9f, 0x8ce9,
+  0xe7bc, 0x599a, 0x77c3, 0x59f0, 0x436e, 0x36d4, 0x8e2a, 0x8ea7,
+  0xe7c4, 0x8f30, 0x8f4a, 0x42f4, 0x6c58, 0x6fbb, 0xe7ca, 0x489b,
+  0x6f79, 0x6e8b, 0xe7ce, 0x9be9, 0x36b5, 0xe7d1, 0x90bb, 0x9097,
+  0x5571, 0x4906, 0x91bb, 0x9404, 0xe7d8, 0x4062, 0xe7da, 0x9427,
+  0xe7dc, 0xe7dd, 0x84e5, 0x8a2b, 0x9599, 0x95a7, 0x9597, 0x9596,
+  0xe7e4, 0x7445, 0x3ec2, 0xe7e7, 0xe7e8, 0xe7e9, 0x3ee7, 0xe7eb,
+  0x968f, 0xe7ed, 0xe7ee, 0xe7ef, 0x3ecc, 0xe7f1, 0xe7f2, 0xe7f3,
+  0x7412, 0x746b, 0x3efc, 0x9741, 0xe7f8,
+  /* 0x96 */
+  0x6847, 0x4a1d, 0xe7fb, 0xe7fc, 0x975d, 0x9368, 0xe7ff, 0xe800,
+  0xe801, 0xe802, 0x92ba, 0x5b11, 0x8b69, 0x493c, 0x73f9, 0xe808,
+  0x979b, 0x9771, 0x9938, 0xe80c, 0x5dc1, 0xe80e, 0xe80f, 0x981f,
+  0xe811, 0x92f6, 0xe813, 0x91e5, 0x44c0, 0xe816, 0xe817, 0xe818,
+  0x98dc, 0xe81a, 0x3f00, 0x922a, 0x4925, 0x8414, 0x993b, 0x994d,
+  0xe821, 0x3dfd, 0x999b, 0x4b6f, 0x99aa, 0x9a5c, 0xe827, 0xe828,
+  0x6a8f, 0x9a21, 0x5afe, 0x9a2f, 0xe82d, 0x4b90, 0xe82f, 0x99bc,
+  0x4bbd, 0x4b97, 0x937d, 0x5872, 0xe835, 0x5822, 0xe837, 0xe838,
+  0x7844, 0xe83a, 0xe83b, 0x68c5, 0x3d7d, 0x9458, 0x3927, 0x6150,
+  0xe841, 0xe842, 0x6107, 0x9c4f, 0x9c53, 0x9c7b, 0x9c35, 0x9c10,
+  0x9b7f, 0x9bcf, 0xe84b, 0x9b9f, 0xe84d, 0xe84e, 0x9d21, 0x4cae,
+  0xe851, 0x9e18, 0x4cb0, 0x9d0c, 0xe855, 0xe856, 0xe857, 0xe858,
+  0x9da5, 0x84bd, 0xe85b, 0xe85c, 0xe85d, 0x85fc, 0x4533, 0xe860,
+  0xe861, 0xe862, 0x8420, 0x85ee, 0xe865, 0xe866, 0xe867, 0x79e2,
+  0xe869, 0xe86a, 0x492d, 0xe86c, 0x3d62, 0x93db, 0x92be, 0x9348,
+  0xe871, 0x78b9, 0x9277, 0x944d, 0x4fe4, 0x3440, 0x9064, 0xe878,
+  0x783d, 0x7854, 0x78b6, 0x784b, 0xe87d, 0xe87e, 0xe87f, 0x369a,
+  0x4f72, 0x6fda, 0x6fd9, 0x701e, 0x701e, 0x5414, 0xe887, 0x57bb,
+  0x58f3, 0x578a, 0x9d16, 0x57d7, 0x7134, 0x34af, 0xe88f, 0x71eb,
+  0xe891, 0xe892, 0x5b28, 0xe894, 0xe895,
+  /* 0x97 */
+  0x610c, 0x5ace, 0x5a0b, 0x42bc, 0xe89a, 0x372c, 0x4b7b, 0xe89d,
+  0x93bb, 0x93b8, 0xe8a0, 0xe8a1, 0x8472, 0xe8a3, 0xe8a4, 0xe8a5,
+  0xe8a6, 0xe8a7, 0x5994, 0xe8a9, 0xe8aa, 0x7da8, 0xe8ac, 0xe8ad,
+  0xe8ae, 0xe8af, 0xe8b0, 0x92e5, 0x73e2, 0x3ee9, 0x74b4, 0xe8b5,
+  0xe8b6, 0x3ee1, 0xe8b8, 0x6ad8, 0x73f3, 0x73fb, 0x3ed6, 0xe8bd,
+  0xe8be, 0xe8bf, 0xe8c0, 0xe8c1, 0xe8c2, 0xe8c3, 0x7448, 0xe8c5,
+  0x70a5, 0xe8c7, 0x9284, 0x73e6, 0x935f, 0xe8cb, 0x9331, 0xe8cd,
+  0xe8ce, 0x9386, 0xe8d0, 0xe8d1, 0x4935, 0xe8d3, 0x716b, 0xe8d5,
+  0xe8d6, 0x56a4, 0xe8d8, 0xe8d9, 0xe8da, 0x5502, 0x79c4, 0xe8dd,
+  0x7dfe, 0xe8df, 0xe8e0, 0xe8e1, 0x452e, 0x9401, 0x370a, 0xe8e5,
+  0xe8e6, 0x59b0, 0xe8e8, 0xe8e9, 0xe8ea, 0x5aa1, 0x36e2, 0xe8ed,
+  0x36b0, 0x925f, 0x5a79, 0xe8f1, 0xe8f2, 0x9374, 0x3ccd, 0xe8f5,
+  0x4a96, 0x398a, 0x50f4, 0x3d69, 0x3d4c, 0xe8fb, 0x7175, 0x42fb,
+  0xe8fe, 0x6e0f, 0xe900, 0x44eb, 0x6d57, 0xe903, 0x7067, 0x6caf,
+  0x3cd6, 0xe907, 0xe908, 0x6e02, 0x6f0c, 0x3d6f, 0xe90c, 0x7551,
+  0x36bc, 0x34c8, 0x4680, 0x3eda, 0x4871, 0x59c4, 0x926e, 0x493e,
+  0x8f41, 0xe917, 0xe918, 0x5812, 0x57c8, 0x36d6, 0xe91c, 0x70fe,
+  0xe91e, 0xe91f, 0xe920, 0xe921, 0xe922, 0x68b9, 0x6967, 0xe925,
+  0xe926, 0xe927, 0xe928, 0xe929, 0xe92a, 0xe92b, 0xe92c, 0x6a1a,
+  0xe92e, 0xe92f, 0x843e, 0x44df, 0x44ce,
+  /* 0x98 */
+  0xe933, 0xe934, 0xe935, 0xe936, 0x6f17, 0xe938, 0x833d, 0xe93a,
+  0x83ed, 0xe93c, 0xe93d, 0xe93e, 0x5989, 0x5a82, 0xe941, 0x5a61,
+  0x5a71, 0xe944, 0xe945, 0x372d, 0x59ef, 0xe948, 0x36c7, 0x718e,
+  0x9390, 0x669a, 0xe94d, 0x5a6e, 0x5a2b, 0xe950, 0x6a2b, 0xe952,
+  0xe953, 0xe954, 0xe955, 0x711d, 0xe957, 0xe958, 0x4fb0, 0xe95a,
+  0x5cc2, 0xe95c, 0xe95d, 0xe95e, 0x6a0c, 0xe960, 0xe961, 0x70a6,
+  0x7133, 0xe964, 0x3da5, 0x6cdf, 0xe967, 0xe968, 0x7e65, 0x59eb,
+  0x5d2f, 0x3df3, 0x5f5c, 0xe96e, 0xe96f, 0x7da4, 0x8426, 0x5485,
+  0xe973, 0xe974, 0xe975, 0x577e, 0xe977, 0xe978, 0x3fe5, 0xe97a,
+  0xe97b, 0x7003, 0xe97d, 0x5d70, 0x738f, 0x7cd3, 0xe981, 0xe982,
+  0x4fc8, 0x7fe7, 0x72cd, 0x7310, 0xe987, 0x7338, 0x7339, 0xe98a,
+  0x7341, 0x7348, 0x3ea9, 0xe98e, 0x906c, 0x71f5, 0xe991, 0x73e1,
+  0x81f6, 0x3eca, 0x770c, 0x3ed1, 0x6ca2, 0x56fd, 0x7419, 0x741e,
+  0x741f, 0x3ee2, 0x3ef0, 0x3ef4, 0x3efa, 0x74d3, 0x3f0e, 0x3f53,
+  0x7542, 0x756d, 0x7572, 0x758d, 0x3f7c, 0x75c8, 0x75dc, 0x3fc0,
+  0x764d, 0x3fd7, 0x7674, 0x3fdc, 0x767a, 0xe9b0, 0x7188, 0x5623,
+  0x8980, 0x5869, 0x401d, 0x7743, 0x4039, 0x6761, 0x4045, 0x35db,
+  0x7798, 0x406a, 0x406f, 0x5c5e, 0x77be, 0x77cb, 0x58f2, 0x7818,
+  0x70b9, 0x781c, 0x40a8, 0x7839, 0x7847, 0x7851, 0x7866, 0x8448,
+  0xe9cb, 0x7933, 0x6803, 0x7932, 0x4103,
+  /* 0x99 */
+  0x4109, 0x7991, 0x7999, 0x8fbb, 0x7a06, 0x8fbc, 0x4167, 0x7a91,
+  0x41b2, 0x7abc, 0x8279, 0x41c4, 0x7acf, 0x7adb, 0x41cf, 0x4e21,
+  0x7b62, 0x7b6c, 0x7b7b, 0x7c12, 0x7c1b, 0x4260, 0x427a, 0x7c7b,
+  0x7c9c, 0x428c, 0x7cb8, 0x4294, 0x7ced, 0x8f93, 0x70c0, 0xe9ef,
+  0x7dcf, 0x7dd4, 0x7dd0, 0x7dfd, 0x7fae, 0x7fb4, 0x729f, 0x4397,
+  0x8020, 0x8025, 0x7b39, 0x802e, 0x8031, 0x8054, 0x3dcc, 0x57b4,
+  0x70a0, 0x80b7, 0x80e9, 0x43ed, 0x810c, 0x732a, 0x810e, 0x8112,
+  0x7560, 0x8114, 0x4401, 0x3b39, 0x8156, 0x8159, 0x815a, 0x4413,
+  0x583a, 0x817c, 0x8184, 0x4425, 0x8193, 0x442d, 0x81a5, 0x57ef,
+  0x81c1, 0x81e4, 0x8254, 0x448f, 0x82a6, 0x8276, 0x82ca, 0x82d8,
+  0x82ff, 0x44b0, 0x8357, 0x9669, 0x698a, 0x8405, 0x70f5, 0x8464,
+  0x60e3, 0x8488, 0x4504, 0x84be, 0x84e1, 0x84f8, 0x8510, 0x8538,
+  0x8552, 0x453b, 0x856f, 0x8570, 0x85e0, 0x4577, 0x8672, 0x8692,
+  0x86b2, 0x86ef, 0x9645, 0x878b, 0x4606, 0x4617, 0x88ae, 0x88ff,
+  0x8924, 0x8947, 0x8991, 0xea43, 0x8a29, 0x8a38, 0x8a94, 0x8ab4,
+  0x8c51, 0x8cd4, 0x8cf2, 0x8d1c, 0x4798, 0x585f, 0x8dc3, 0x47ed,
+  0x4eee, 0x8e3a, 0x55d8, 0x5754, 0x8e71, 0x55f5, 0x8eb0, 0x4837,
+  0x8ece, 0x8ee2, 0x8ee4, 0x8eed, 0x8ef2, 0x8fb7, 0x8fc1, 0x8fca,
+  0x8fcc, 0x9033, 0x99c4, 0x48ad, 0x98e0, 0x9213, 0x491e, 0x9228,
+  0x9258, 0x926b, 0x92b1, 0x92ae, 0x92bf,
+  /* 0x9a */
+  0x92e3, 0x92eb, 0x92f3, 0x92f4, 0x92fd, 0x9343, 0x9384, 0x93ad,
+  0x4945, 0x4951, 0x9ebf, 0x9417, 0x5301, 0x941d, 0x942d, 0x943e,
+  0x496a, 0x9454, 0x9479, 0x952d, 0x95a2, 0x49a7, 0x95f4, 0x9633,
+  0x49e5, 0x67a0, 0x4a24, 0x9740, 0x4a35, 0x97b2, 0x97c2, 0x5654,
+  0x4ae4, 0x60e8, 0x98b9, 0x4b19, 0x98f1, 0x5844, 0x990e, 0x9919,
+  0x51b4, 0x991c, 0x9937, 0x9942, 0x995d, 0x9962, 0x4b70, 0x99c5,
+  0x4b9d, 0x9a3c, 0x9b0f, 0x7a83, 0x9b69, 0x9b81, 0x9bdd, 0x9bf1,
+  0x9bf4, 0x4c6d, 0x9c20, 0x376f, 0xeaa9, 0x9d49, 0x9c3a, 0x9efe,
+  0x5650, 0x9d93, 0x9dbd, 0x9dc0, 0x9dfc, 0x94f6, 0x8fb6, 0x9e7b,
+  0x9eac, 0x9eb1, 0x9ebd, 0x9ec6, 0x94dc, 0x9ee2, 0x9ef1, 0x9ef8,
+  0x7ac8, 0x9f44, 0xeabf, 0xeac0, 0xeac1, 0x691a, 0x94c3, 0x59ac,
+  0xeac5, 0x5840, 0x94c1, 0x37b9, 0xeac9, 0xeaca, 0xeacb, 0xeacc,
+  0x5757, 0x7173, 0xeacf, 0xead0, 0xead1, 0x546a, 0xead3, 0xead4,
+  0x549e, 0xead6, 0xead7, 0xead8, 0xead9, 0xeada, 0x60e7, 0xeadc,
+  0x567a, 0xeade, 0xeadf, 0xeae0, 0xeae1, 0xeae2, 0xeae3, 0x6955,
+  0x9c2f, 0x87a5, 0xeae7, 0xeae8, 0xeae9, 0xeaea, 0xeaeb, 0xeaec,
+  0x5c20, 0xeaee, 0x5e0b, 0xeaf0, 0xeaf1, 0xeaf2, 0x671e, 0xeaf4,
+  0xeaf5, 0xeaf6, 0x3647, 0xeaf8, 0xeaf9, 0xeafa, 0xeafb, 0x5364,
+  0x84ad, 0xeafe, 0xeaff, 0xeb00, 0x8b81, 0xeb02, 0xeb03, 0xeb04,
+  0xeb05, 0x4e78, 0x70bb, 0xeb08, 0xeb09,
+  /* 0x9b */
+  0xeb0a, 0xeb0b, 0xeb0c, 0xeb0d, 0xeb0e, 0xeb0f, 0x62c3, 0xeb11,
+  0xeb12, 0x7198, 0x6855, 0xeb15, 0x69e9, 0x36c8, 0xeb18, 0xeb19,
+  0xeb1a, 0xeb1b, 0xeb1c, 0xeb1d, 0x82fd, 0xeb1f, 0xeb20, 0xeb21,
+  0x89a5, 0xeb23, 0x8fa0, 0xeb25, 0x97b8, 0xeb27, 0x9847, 0x9abd,
+  0xeb2a, 0xeb2b, 0xeb2c, 0xeb2d, 0xeb2e, 0xeb2f, 0xeb30, 0xeb31,
+  0xeb32, 0xeb33, 0xeb34, 0xeb35, 0xeb36, 0xeb37, 0xeb38, 0xeb39,
+  0x5fb1, 0x6648, 0x66bf, 0xeb3d, 0xeb3e, 0xeb3f, 0x7201, 0xeb41,
+  0x77d7, 0xeb43, 0xeb44, 0x7e87, 0xeb46, 0x58b5, 0x670e, 0x6918,
+  0xeb4a, 0xeb4b, 0xeb4c, 0xeb4d, 0xeb4e, 0xeb4f, 0xeb50, 0x48d0,
+  0x4ab8, 0xeb53, 0xeb54, 0xeb55, 0xeb56, 0xeb57, 0xeb58, 0xeb59,
+  0xeb5a, 0xeb5b, 0x51d2, 0xeb5d, 0x599f, 0xeb5f, 0x3bbe, 0xeb61,
+  0xeb62, 0xeb63, 0x5788, 0xeb65, 0x399b, 0xeb67, 0xeb68, 0xeb69,
+  0x3762, 0xeb6b, 0x8b5e, 0xeb6d, 0x99d6, 0xeb6f, 0xeb70, 0xeb71,
+  0x7209, 0xeb73, 0xeb74, 0x5965, 0xeb76, 0xeb77, 0xeb78, 0x8eda,
+  0xeb7a, 0x528f, 0x573f, 0x7171, 0xeb7e, 0xeb7f, 0xeb80, 0xeb81,
+  0x55bc, 0xeb83, 0xeb84, 0xeb85, 0x91d4, 0x3473, 0xeb88, 0xeb89,
+  0xeb8a, 0x4718, 0xeb8c, 0xeb8d, 0xeb8e, 0xeb8f, 0xeb90, 0x5066,
+  0x34fb, 0xeb93, 0x60de, 0xeb95, 0x477c, 0xeb97, 0xeb98, 0xeb99,
+  0xeb9a, 0xeb9b, 0x57a1, 0x7151, 0x6fb6, 0xeb9f, 0xeba0, 0x9056,
+  0xeba2, 0xeba3, 0x8b62, 0xeba5, 0xeba6,
+  /* 0x9c */
+  0x5d5b, 0xeba8, 0x8f36, 0xebaa, 0xebab, 0x8aea, 0xebad, 0xebae,
+  0xebaf, 0xebb0, 0x4bc0, 0xebb2, 0xebb3, 0xebb4, 0x9465, 0xebb6,
+  0x6195, 0x5a27, 0xebb9, 0x4fbb, 0x56b9, 0xebbc, 0xebbd, 0x4e6a,
+  0xebbf, 0x9656, 0x6d8f, 0xebc2, 0x3618, 0x8977, 0xebc5, 0xebc6,
+  0xebc7, 0xebc8, 0x71df, 0xebca, 0x7b42, 0xebcc, 0xebcd, 0xebce,
+  0x9104, 0xebd0, 0x7a45, 0x9df0, 0xebd3, 0x9a26, 0xebd5, 0x365f,
+  0xebd7, 0xebd8, 0x7983, 0xebda, 0xebdb, 0x5d2c, 0xebdd, 0x83cf,
+  0xebdf, 0x46d0, 0xebe1, 0x753b, 0x8865, 0xebe4, 0x58b6, 0x371c,
+  0xebe7, 0xebe8, 0xebe9, 0x3c54, 0xebeb, 0xebec, 0x9281, 0xebee,
+  0xebef, 0x9330, 0xebf1, 0xebf2, 0x6c39, 0x949f, 0xebf5, 0xebf6,
+  0x8827, 0x88f5, 0xebf9, 0xebfa, 0xebfb, 0x6eb8, 0xebfd, 0xebfe,
+  0x39a4, 0x36b9, 0x5c10, 0x79e3, 0x453f, 0x66b6, 0xec05, 0xec06,
+  0x8943, 0xec08, 0xec09, 0x56d6, 0x40df, 0xec0c, 0x39a1, 0xec0e,
+  0xec0f, 0xec10, 0x71ad, 0x8366, 0xec13, 0xec14, 0x5a67, 0x4cb7,
+  0xec17, 0xec18, 0xec19, 0xec1a, 0xec1b, 0xec1c, 0xec1d, 0x7b43,
+  0x797e, 0xec20, 0x6fb5, 0xec22, 0x6a03, 0xec24, 0x53a2, 0xec26,
+  0x93bf, 0x6836, 0x975d, 0xec2a, 0xec2b, 0xec2c, 0xec2d, 0xec2e,
+  0xec2f, 0x5d85, 0xec31, 0xec32, 0x5715, 0x9823, 0xec35, 0x5dab,
+  0xec37, 0x65be, 0x69d5, 0x53d2, 0xec3b, 0xec3c, 0x3c11, 0x6736,
+  0xec3f, 0xec40, 0xec41, 0xec42, 0xec43,
+  /* 0x9d */
+  0xec44, 0xec45, 0xec46, 0xec47, 0xec48, 0xec49, 0x35ca, 0xec4b,
+  0xec4c, 0x48fa, 0x63e6, 0xec4f, 0x7808, 0x9255, 0xec52, 0x43f2,
+  0xec54, 0x43df, 0xec56, 0xec57, 0xec58, 0x59f8, 0xec5a, 0x8f0b,
+  0xec5c, 0xec5d, 0x7b51, 0xec5f, 0xec60, 0x3df7, 0xec62, 0xec63,
+  0x8fd0, 0x728f, 0x568b, 0xec67, 0xec68, 0xec69, 0xec6a, 0xec6b,
+  0xec6c, 0xec6d, 0xec6e, 0xec6f, 0xec70, 0xec71, 0xec72, 0xec73,
+  0x7e9f, 0xec75, 0xec76, 0x4ca4, 0x9547, 0xec79, 0x71a2, 0xec7b,
+  0x4d91, 0x9012, 0xec7e, 0x4d9c, 0xec80, 0x8fbe, 0x55c1, 0x8fba,
+  0xec84, 0x8fb9, 0xec86, 0x4509, 0x7e7f, 0x6f56, 0x6ab1, 0x4eea,
+  0x34e4, 0xec8d, 0xec8e, 0x373a, 0x8e80, 0xec91, 0xec92, 0xec93,
+  0xec94, 0xec95, 0xec96, 0x3deb, 0xec98, 0xec99, 0xec9a, 0xec9b,
+  0x4e9a, 0xec9d, 0xec9e, 0x56bf, 0xeca0, 0x8e0e, 0x5b6d, 0xeca3,
+  0xeca4, 0x63de, 0x62d0, 0xeca7, 0xeca8, 0x6530, 0x562d, 0xecab,
+  0x541a, 0xecad, 0x3dc6, 0xecaf, 0x4c7d, 0x5622, 0x561e, 0x7f49,
+  0xecb4, 0x5975, 0xecb6, 0x8770, 0x4e1c, 0xecb9, 0xecba, 0xecbb,
+  0x8117, 0x9d5e, 0x8d18, 0x763b, 0x9c45, 0x764e, 0x77b9, 0x9345,
+  0x5432, 0x8148, 0x82f7, 0x5625, 0x8132, 0x8418, 0x80bd, 0x55ea,
+  0x7962, 0x5643, 0x5416, 0xeccf, 0x35ce, 0x5605, 0x55f1, 0x66f1,
+  0xecd4, 0x362d, 0x7534, 0x55f0, 0x55ba, 0x5497, 0x5572, 0xecdb,
+  0xecdc, 0x5ed0, 0xecde, 0xecdf, 0xece0,
+  /* 0x9e */
+  0xece1, 0x9eab, 0x7d5a, 0x55de, 0xece5, 0x629d, 0x976d, 0x5494,
+  0x8ccd, 0x71f6, 0x9176, 0x63fc, 0x63b9, 0x63fe, 0x5569, 0xecf0,
+  0x9c72, 0xecf2, 0x519a, 0x34df, 0xecf5, 0x51a7, 0x544d, 0x551e,
+  0x5513, 0x7666, 0x8e2d, 0xecfc, 0x75b1, 0x80b6, 0x8804, 0x8786,
+  0x88c7, 0x81b6, 0x841c, 0xed04, 0x44ec, 0x7304, 0xed07, 0x5b90,
+  0x830b, 0xed0a, 0x567b, 0xed0c, 0xed0d, 0xed0e, 0xed0f, 0xed10,
+  0xed11, 0x9170, 0xed13, 0x9208, 0xed15, 0xed16, 0xed17, 0xed18,
+  0x7266, 0xed1a, 0x474e, 0xed1c, 0xed1d, 0xed1e, 0x40fa, 0x9c5d,
+  0x651f, 0xed22, 0x48f3, 0xed24, 0xed25, 0xed26, 0xed27, 0x6062,
+  0xed29, 0xed2a, 0xed2b, 0xed2c, 0xed2d, 0x71a3, 0x7e8e, 0x9d50,
+  0x4e1a, 0x4e04, 0x3577, 0x5b0d, 0x6cb2, 0x5367, 0x36ac, 0x39dc,
+  0x537d, 0x36a5, 0xed3b, 0x589a, 0xed3d, 0x822d, 0x544b, 0x57aa,
+  0xed41, 0xed42, 0xed43, 0x3a52, 0xed45, 0x7374, 0xed47, 0x4d09,
+  0x9bed, 0xed4a, 0xed4b, 0x4c5b, 0xed4d, 0xed4e, 0xed4f, 0x845c,
+  0xed51, 0xed52, 0xed53, 0xed54, 0x632e, 0x7d25, 0xed57, 0xed58,
+  0x3a2a, 0x9008, 0x52cc, 0x3e74, 0x367a, 0x45e9, 0xed5f, 0x7640,
+  0x5af0, 0xed62, 0x787a, 0x47b6, 0x58a7, 0x40bf, 0x567c, 0x9b8b,
+  0x5d74, 0x7654, 0xed6b, 0x9e85, 0x4ce1, 0x75f9, 0x37fb, 0x6119,
+  0xed71, 0xed72, 0xed73, 0x565d, 0xed75, 0x57a7, 0xed77, 0xed78,
+  0x5234, 0xed7a, 0x35ad, 0x6c4a, 0x9d7c,
+  /* 0x9f */
+  0x7c56, 0x9b39, 0x57de, 0xed81, 0x5c53, 0x64d3, 0xed84, 0xed85,
+  0xed86, 0x86ad, 0xed88, 0xed89, 0xed8a, 0xed8b, 0xed8c, 0x51fe,
+  0xed8e, 0x5d8e, 0x9703, 0xed91, 0x9e81, 0x904c, 0x7b1f, 0x9b02,
+  0x5cd1, 0x7ba3, 0x6268, 0x6335, 0x9aff, 0x7bcf, 0x9b2a, 0x7c7e,
+  0x9b2e, 0x7c42, 0x7c86, 0x9c15, 0x7bfc, 0x9b09, 0x9f17, 0x9c1b,
+  0xeda6, 0x9f5a, 0x5573, 0x5bc3, 0x4ffd, 0x9e98, 0x4ff2, 0x5260,
+  0x3e06, 0x52d1, 0x5767, 0x5056, 0x59b7, 0x5e12, 0x97c8, 0x9dab,
+  0x8f5c, 0x5469, 0x97b4, 0x9940, 0x97ba, 0x532c, 0x6130, 0x692c,
+  0x53da, 0x9c0a, 0x9d02, 0x4c3b, 0x9641, 0x6980, 0x50a6, 0x7546,
+  0xedc6, 0x99da, 0x5273, 0xedc9, 0x9159, 0x9681, 0x915c, 0xedcd,
+  0x9151, 0xedcf, 0x637f, 0xedd1, 0x6aca, 0x5611, 0x918e, 0x757a,
+  0x6285, 0xedd7, 0x734f, 0x7c70, 0xedda, 0xeddb, 0xeddc, 0xeddd,
+  0x76d6, 0x9b9d, 0x4e2a, 0xede1, 0x83be, 0x8842, 0xede4, 0x5c4a,
+  0x69c0, 0x50ed, 0x577a, 0x521f, 0x5df5, 0x4ece, 0x6c31, 0xeded,
+  0x4f39, 0x549c, 0x54da, 0x529a, 0x8d82, 0x35fe, 0x5f0c, 0x35f3,
+  0xedf6, 0x6b52, 0x917c, 0x9fa5, 0x9b97, 0x982e, 0x98b4, 0x9aba,
+  0x9ea8, 0x9e84, 0x717a, 0x7b14, 0xee02, 0x6bfa, 0x8818, 0x7f78,
+  0xee06, 0x5620, 0xee08, 0x8e77, 0x9f53, 0xee0b, 0x8dd4, 0x8e4f,
+  0x9e1c, 0x8e01, 0x6282, 0xee11, 0x8e28, 0x8e75, 0x7ad3, 0xee15,
+  0x7a3e, 0x78d8, 0x6cea, 0x8a67, 0x7607,
+  /* 0xa0 */
+  0xee1b, 0x9f26, 0x6cce, 0x87d6, 0x75c3, 0xee20, 0x7853, 0xee22,
+  0x8d0c, 0x72e2, 0x7371, 0x8b2d, 0x7302, 0x74f1, 0x8ceb, 0xee2a,
+  0x862f, 0x5fba, 0x88a0, 0x44b7, 0xee2f, 0xee30, 0xee31, 0xee32,
+  0x8a7e, 0xee34, 0xee35, 0x60fd, 0x7667, 0x9ad7, 0x9d44, 0x936e,
+  0x9b8f, 0x87f5, 0xee3d, 0x880f, 0x8cf7, 0x732c, 0x9721, 0x9bb0,
+  0x35d6, 0x72b2, 0x4c07, 0x7c51, 0x994a, 0xee48, 0x6159, 0x4c04,
+  0x9e96, 0x617d, 0xee4d, 0x575f, 0x616f, 0x62a6, 0x6239, 0x62ce,
+  0x3a5c, 0x61e2, 0x53aa, 0xee56, 0x6364, 0x6802, 0x35d2, 0x5d57,
+  0xee5b, 0x8fda, 0xee5d, 0xee5e, 0x50d9, 0xee60, 0x7906, 0x5332,
+  0x9638, 0xee64, 0x4065, 0xee66, 0x77fe, 0xee68, 0x7cc2, 0xee6a,
+  0x7cda, 0x7a2d, 0x8066, 0x8063, 0x7d4d, 0x7505, 0x74f2, 0x8994,
+  0x821a, 0x670c, 0x8062, 0xee76, 0x805b, 0x74f0, 0x8103, 0x7724,
+  0x8989, 0xee7c, 0x7553, 0xee7e, 0x87a9, 0x87ce, 0x81c8, 0x878c,
+  0x8a49, 0x8cad, 0x8b43, 0x772b, 0x74f8, 0x84da, 0x3635, 0x69b2,
+  0x8da6, 0xee8c, 0x89a9, 0x7468, 0x6db9, 0x87c1, 0xee91, 0x74e7,
+  0x3ddb, 0x7176, 0x60a4, 0x619c, 0x3cd1, 0x7162, 0x6077, 0xee9a,
+  0x7f71, 0xee9c, 0x7250, 0x60e9, 0x4b7e, 0x5220, 0x3c18, 0xeea2,
+  0xeea3, 0xeea4, 0xeea5, 0xeea6, 0xeea7, 0xeea8, 0xeea9, 0xeeaa,
+  0x5cc1, 0xeeac, 0xeead, 0xeeae, 0xeeaf, 0xeeb0, 0xeeb1, 0x4562,
+  0x5b1f, 0xeeb4, 0x9f50, 0x9ea6, 0xeeb7,
+  /* 0xa1 */
+  0x3000, 0xff0c, 0x3001, 0x3002, 0xff0e, 0x2027, 0xff1b, 0xff1a,
+  0xff1f, 0xff01, 0xfe30, 0x2026, 0x2025, 0xfe50, 0xfe51, 0xfe52,
+  0x00b7, 0xfe54, 0xfe55, 0xfe56, 0xfe57, 0xff5c, 0x2013, 0xfe31,
+  0x2014, 0xfe33, 0x2574, 0xfe34, 0xfe4f, 0xff08, 0xff09, 0xfe35,
+  0xfe36, 0xff5b, 0xff5d, 0xfe37, 0xfe38, 0x3014, 0x3015, 0xfe39,
+  0xfe3a, 0x3010, 0x3011, 0xfe3b, 0xfe3c, 0x300a, 0x300b, 0xfe3d,
+  0xfe3e, 0x3008, 0x3009, 0xfe3f, 0xfe40, 0x300c, 0x300d, 0xfe41,
+  0xfe42, 0x300e, 0x300f, 0xfe43, 0xfe44, 0xfe59, 0xfe5a, 0xfe5b,
+  0xfe5c, 0xfe5d, 0xfe5e, 0x2018, 0x2019, 0x201c, 0x201d, 0x301d,
+  0x301e, 0x2035, 0x2032, 0xff03, 0xff06, 0xff0a, 0x203b, 0x00a7,
+  0x3003, 0x25cb, 0x25cf, 0x25b3, 0x25b2, 0x25ce, 0x2606, 0x2605,
+  0x25c7, 0x25c6, 0x25a1, 0x25a0, 0x25bd, 0x25bc, 0x32a3, 0x2105,
+  0x00af, 0xffe3, 0xff3f, 0x02cd, 0xfe49, 0xfe4a, 0xfe4d, 0xfe4e,
+  0xfe4b, 0xfe4c, 0xfe5f, 0xfe60, 0xfe61, 0xff0b, 0xff0d, 0x00d7,
+  0x00f7, 0x00b1, 0x221a, 0xff1c, 0xff1e, 0xff1d, 0x2266, 0x2267,
+  0x2260, 0x221e, 0x2252, 0x2261, 0xfe62, 0xfe63, 0xfe64, 0xfe65,
+  0xfe66, 0xff5e, 0x2229, 0x222a, 0x22a5, 0x2220, 0x221f, 0x22bf,
+  0x33d2, 0x33d1, 0x222b, 0x222e, 0x2235, 0x2234, 0x2640, 0x2642,
+  0x2295, 0x2299, 0x2191, 0x2193, 0x2190, 0x2192, 0x2196, 0x2197,
+  0x2199, 0x2198, 0x2225, 0x2223, 0xff0f,
+  /* 0xa2 */
+  0xff3c, 0x2215, 0xfe68, 0xff04, 0xffe5, 0x3012, 0xffe0, 0xffe1,
+  0xff05, 0xff20, 0x2103, 0x2109, 0xfe69, 0xfe6a, 0xfe6b, 0x33d5,
+  0x339c, 0x339d, 0x339e, 0x33ce, 0x33a1, 0x338e, 0x338f, 0x33c4,
+  0x00b0, 0x5159, 0x515b, 0x515e, 0x515d, 0x5161, 0x5163, 0x55e7,
+  0x74e9, 0x7cce, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586,
+  0x2587, 0x2588, 0x258f, 0x258e, 0x258d, 0x258c, 0x258b, 0x258a,
+  0x2589, 0x253c, 0x2534, 0x252c, 0x2524, 0x251c, 0x2594, 0x2500,
+  0x2502, 0x2595, 0x250c, 0x2510, 0x2514, 0x2518, 0x256d, 0x256e,
+  0x2570, 0x256f, 0x2550, 0x255e, 0x256a, 0x2561, 0x25e2, 0x25e3,
+  0x25e5, 0x25e4, 0x2571, 0x2572, 0x2573, 0xff10, 0xff11, 0xff12,
+  0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18, 0xff19, 0x2160,
+  0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168,
+  0x2169, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027,
+  0x3028, 0x3029, 0x5341, 0x5344, 0x5345, 0xff21, 0xff22, 0xff23,
+  0xff24, 0xff25, 0xff26, 0xff27, 0xff28, 0xff29, 0xff2a, 0xff2b,
+  0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, 0xff31, 0xff32, 0xff33,
+  0xff34, 0xff35, 0xff36, 0xff37, 0xff38, 0xff39, 0xff3a, 0xff41,
+  0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, 0xff49,
+  0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50, 0xff51,
+  0xff52, 0xff53, 0xff54, 0xff55, 0xff56,
+  /* 0xa3 */
+  0xff57, 0xff58, 0xff59, 0xff5a, 0x0391, 0x0392, 0x0393, 0x0394,
+  0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c,
+  0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a4, 0x03a5,
+  0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03b1, 0x03b2, 0x03b3, 0x03b4,
+  0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc,
+  0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x03c4, 0x03c5,
+  0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x3105, 0x3106, 0x3107, 0x3108,
+  0x3109, 0x310a, 0x310b, 0x310c, 0x310d, 0x310e, 0x310f, 0x3110,
+  0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, 0x3118,
+  0x3119, 0x311a, 0x311b, 0x311c, 0x311d, 0x311e, 0x311f, 0x3120,
+  0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128,
+  0x3129, 0x02d9, 0x02c9, 0x02ca, 0x02c7, 0x02cb, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0xa4 */
+  0x4e00, 0x4e59, 0x4e01, 0x4e03, 0x4e43, 0x4e5d, 0x4e86, 0x4e8c,
+  0x4eba, 0x513f, 0x5165, 0x516b, 0x51e0, 0x5200, 0x5201, 0x529b,
+  0x5315, 0x5341, 0x535c, 0x53c8, 0x4e09, 0x4e0b, 0x4e08, 0x4e0a,
+  0x4e2b, 0x4e38, 0x51e1, 0x4e45, 0x4e48, 0x4e5f, 0x4e5e, 0x4e8e,
+  0x4ea1, 0x5140, 0x5203, 0x52fa, 0x5343, 0x53c9, 0x53e3, 0x571f,
+  0x58eb, 0x5915, 0x5927, 0x5973, 0x5b50, 0x5b51, 0x5b53, 0x5bf8,
+  0x5c0f, 0x5c22, 0x5c38, 0x5c71, 0x5ddd, 0x5de5, 0x5df1, 0x5df2,
+  0x5df3, 0x5dfe, 0x5e72, 0x5efe, 0x5f0b, 0x5f13, 0x624d, 0x4e11,
+  0x4e10, 0x4e0d, 0x4e2d, 0x4e30, 0x4e39, 0x4e4b, 0x5c39, 0x4e88,
+  0x4e91, 0x4e95, 0x4e92, 0x4e94, 0x4ea2, 0x4ec1, 0x4ec0, 0x4ec3,
+  0x4ec6, 0x4ec7, 0x4ecd, 0x4eca, 0x4ecb, 0x4ec4, 0x5143, 0x5141,
+  0x5167, 0x516d, 0x516e, 0x516c, 0x5197, 0x51f6, 0x5206, 0x5207,
+  0x5208, 0x52fb, 0x52fe, 0x52ff, 0x5316, 0x5339, 0x5348, 0x5347,
+  0x5345, 0x535e, 0x5384, 0x53cb, 0x53ca, 0x53cd, 0x58ec, 0x5929,
+  0x592b, 0x592a, 0x592d, 0x5b54, 0x5c11, 0x5c24, 0x5c3a, 0x5c6f,
+  0x5df4, 0x5e7b, 0x5eff, 0x5f14, 0x5f15, 0x5fc3, 0x6208, 0x6236,
+  0x624b, 0x624e, 0x652f, 0x6587, 0x6597, 0x65a4, 0x65b9, 0x65e5,
+  0x66f0, 0x6708, 0x6728, 0x6b20, 0x6b62, 0x6b79, 0x6bcb, 0x6bd4,
+  0x6bdb, 0x6c0f, 0x6c34, 0x706b, 0x722a, 0x7236, 0x723b, 0x7247,
+  0x7259, 0x725b, 0x72ac, 0x738b, 0x4e19,
+  /* 0xa5 */
+  0x4e16, 0x4e15, 0x4e14, 0x4e18, 0x4e3b, 0x4e4d, 0x4e4f, 0x4e4e,
+  0x4ee5, 0x4ed8, 0x4ed4, 0x4ed5, 0x4ed6, 0x4ed7, 0x4ee3, 0x4ee4,
+  0x4ed9, 0x4ede, 0x5145, 0x5144, 0x5189, 0x518a, 0x51ac, 0x51f9,
+  0x51fa, 0x51f8, 0x520a, 0x52a0, 0x529f, 0x5305, 0x5306, 0x5317,
+  0x531d, 0x4edf, 0x534a, 0x5349, 0x5361, 0x5360, 0x536f, 0x536e,
+  0x53bb, 0x53ef, 0x53e4, 0x53f3, 0x53ec, 0x53ee, 0x53e9, 0x53e8,
+  0x53fc, 0x53f8, 0x53f5, 0x53eb, 0x53e6, 0x53ea, 0x53f2, 0x53f1,
+  0x53f0, 0x53e5, 0x53ed, 0x53fb, 0x56db, 0x56da, 0x5916, 0x592e,
+  0x5931, 0x5974, 0x5976, 0x5b55, 0x5b83, 0x5c3c, 0x5de8, 0x5de7,
+  0x5de6, 0x5e02, 0x5e03, 0x5e73, 0x5e7c, 0x5f01, 0x5f18, 0x5f17,
+  0x5fc5, 0x620a, 0x6253, 0x6254, 0x6252, 0x6251, 0x65a5, 0x65e6,
+  0x672e, 0x672c, 0x672a, 0x672b, 0x672d, 0x6b63, 0x6bcd, 0x6c11,
+  0x6c10, 0x6c38, 0x6c41, 0x6c40, 0x6c3e, 0x72af, 0x7384, 0x7389,
+  0x74dc, 0x74e6, 0x7518, 0x751f, 0x7528, 0x7529, 0x7530, 0x7531,
+  0x7532, 0x7533, 0x758b, 0x767d, 0x76ae, 0x76bf, 0x76ee, 0x77db,
+  0x77e2, 0x77f3, 0x793a, 0x79be, 0x7a74, 0x7acb, 0x4e1e, 0x4e1f,
+  0x4e52, 0x4e53, 0x4e69, 0x4e99, 0x4ea4, 0x4ea6, 0x4ea5, 0x4eff,
+  0x4f09, 0x4f19, 0x4f0a, 0x4f15, 0x4f0d, 0x4f10, 0x4f11, 0x4f0f,
+  0x4ef2, 0x4ef6, 0x4efb, 0x4ef0, 0x4ef3, 0x4efd, 0x4f01, 0x4f0b,
+  0x5149, 0x5147, 0x5146, 0x5148, 0x5168,
+  /* 0xa6 */
+  0x5171, 0x518d, 0x51b0, 0x5217, 0x5211, 0x5212, 0x520e, 0x5216,
+  0x52a3, 0x5308, 0x5321, 0x5320, 0x5370, 0x5371, 0x5409, 0x540f,
+  0x540c, 0x540a, 0x5410, 0x5401, 0x540b, 0x5404, 0x5411, 0x540d,
+  0x5408, 0x5403, 0x540e, 0x5406, 0x5412, 0x56e0, 0x56de, 0x56dd,
+  0x5733, 0x5730, 0x5728, 0x572d, 0x572c, 0x572f, 0x5729, 0x5919,
+  0x591a, 0x5937, 0x5938, 0x5984, 0x5978, 0x5983, 0x597d, 0x5979,
+  0x5982, 0x5981, 0x5b57, 0x5b58, 0x5b87, 0x5b88, 0x5b85, 0x5b89,
+  0x5bfa, 0x5c16, 0x5c79, 0x5dde, 0x5e06, 0x5e76, 0x5e74, 0x5f0f,
+  0x5f1b, 0x5fd9, 0x5fd6, 0x620e, 0x620c, 0x620d, 0x6210, 0x6263,
+  0x625b, 0x6258, 0x6536, 0x65e9, 0x65e8, 0x65ec, 0x65ed, 0x66f2,
+  0x66f3, 0x6709, 0x673d, 0x6734, 0x6731, 0x6735, 0x6b21, 0x6b64,
+  0x6b7b, 0x6c16, 0x6c5d, 0x6c57, 0x6c59, 0x6c5f, 0x6c60, 0x6c50,
+  0x6c55, 0x6c61, 0x6c5b, 0x6c4d, 0x6c4e, 0x7070, 0x725f, 0x725d,
+  0x767e, 0x7af9, 0x7c73, 0x7cf8, 0x7f36, 0x7f8a, 0x7fbd, 0x8001,
+  0x8003, 0x800c, 0x8012, 0x8033, 0x807f, 0x8089, 0x808b, 0x808c,
+  0x81e3, 0x81ea, 0x81f3, 0x81fc, 0x820c, 0x821b, 0x821f, 0x826e,
+  0x8272, 0x827e, 0x866b, 0x8840, 0x884c, 0x8863, 0x897f, 0x9621,
+  0x4e32, 0x4ea8, 0x4f4d, 0x4f4f, 0x4f47, 0x4f57, 0x4f5e, 0x4f34,
+  0x4f5b, 0x4f55, 0x4f30, 0x4f50, 0x4f51, 0x4f3d, 0x4f3a, 0x4f38,
+  0x4f43, 0x4f54, 0x4f3c, 0x4f46, 0x4f63,
+  /* 0xa7 */
+  0x4f5c, 0x4f60, 0x4f2f, 0x4f4e, 0x4f36, 0x4f59, 0x4f5d, 0x4f48,
+  0x4f5a, 0x514c, 0x514b, 0x514d, 0x5175, 0x51b6, 0x51b7, 0x5225,
+  0x5224, 0x5229, 0x522a, 0x5228, 0x52ab, 0x52a9, 0x52aa, 0x52ac,
+  0x5323, 0x5373, 0x5375, 0x541d, 0x542d, 0x541e, 0x543e, 0x5426,
+  0x544e, 0x5427, 0x5446, 0x5443, 0x5433, 0x5448, 0x5442, 0x541b,
+  0x5429, 0x544a, 0x5439, 0x543b, 0x5438, 0x542e, 0x5435, 0x5436,
+  0x5420, 0x543c, 0x5440, 0x5431, 0x542b, 0x541f, 0x542c, 0x56ea,
+  0x56f0, 0x56e4, 0x56eb, 0x574a, 0x5751, 0x5740, 0x574d, 0x5747,
+  0x574e, 0x573e, 0x5750, 0x574f, 0x573b, 0x58ef, 0x593e, 0x599d,
+  0x5992, 0x59a8, 0x599e, 0x59a3, 0x5999, 0x5996, 0x598d, 0x59a4,
+  0x5993, 0x598a, 0x59a5, 0x5b5d, 0x5b5c, 0x5b5a, 0x5b5b, 0x5b8c,
+  0x5b8b, 0x5b8f, 0x5c2c, 0x5c40, 0x5c41, 0x5c3f, 0x5c3e, 0x5c90,
+  0x5c91, 0x5c94, 0x5c8c, 0x5deb, 0x5e0c, 0x5e8f, 0x5e87, 0x5e8a,
+  0x5ef7, 0x5f04, 0x5f1f, 0x5f64, 0x5f62, 0x5f77, 0x5f79, 0x5fd8,
+  0x5fcc, 0x5fd7, 0x5fcd, 0x5ff1, 0x5feb, 0x5ff8, 0x5fea, 0x6212,
+  0x6211, 0x6284, 0x6297, 0x6296, 0x6280, 0x6276, 0x6289, 0x626d,
+  0x628a, 0x627c, 0x627e, 0x6279, 0x6273, 0x6292, 0x626f, 0x6298,
+  0x626e, 0x6295, 0x6293, 0x6291, 0x6286, 0x6539, 0x653b, 0x6538,
+  0x65f1, 0x66f4, 0x675f, 0x674e, 0x674f, 0x6750, 0x6751, 0x675c,
+  0x6756, 0x675e, 0x6749, 0x6746, 0x6760,
+  /* 0xa8 */
+  0x6753, 0x6757, 0x6b65, 0x6bcf, 0x6c42, 0x6c5e, 0x6c99, 0x6c81,
+  0x6c88, 0x6c89, 0x6c85, 0x6c9b, 0x6c6a, 0x6c7a, 0x6c90, 0x6c70,
+  0x6c8c, 0x6c68, 0x6c96, 0x6c92, 0x6c7d, 0x6c83, 0x6c72, 0x6c7e,
+  0x6c74, 0x6c86, 0x6c76, 0x6c8d, 0x6c94, 0x6c98, 0x6c82, 0x7076,
+  0x707c, 0x707d, 0x7078, 0x7262, 0x7261, 0x7260, 0x72c4, 0x72c2,
+  0x7396, 0x752c, 0x752b, 0x7537, 0x7538, 0x7682, 0x76ef, 0x77e3,
+  0x79c1, 0x79c0, 0x79bf, 0x7a76, 0x7cfb, 0x7f55, 0x8096, 0x8093,
+  0x809d, 0x8098, 0x809b, 0x809a, 0x80b2, 0x826f, 0x8292, 0x828b,
+  0x828d, 0x898b, 0x89d2, 0x8a00, 0x8c37, 0x8c46, 0x8c55, 0x8c9d,
+  0x8d64, 0x8d70, 0x8db3, 0x8eab, 0x8eca, 0x8f9b, 0x8fb0, 0x8fc2,
+  0x8fc6, 0x8fc5, 0x8fc4, 0x5de1, 0x9091, 0x90a2, 0x90aa, 0x90a6,
+  0x90a3, 0x9149, 0x91c6, 0x91cc, 0x9632, 0x962e, 0x9631, 0x962a,
+  0x962c, 0x4e26, 0x4e56, 0x4e73, 0x4e8b, 0x4e9b, 0x4e9e, 0x4eab,
+  0x4eac, 0x4f6f, 0x4f9d, 0x4f8d, 0x4f73, 0x4f7f, 0x4f6c, 0x4f9b,
+  0x4f8b, 0x4f86, 0x4f83, 0x4f70, 0x4f75, 0x4f88, 0x4f69, 0x4f7b,
+  0x4f96, 0x4f7e, 0x4f8f, 0x4f91, 0x4f7a, 0x5154, 0x5152, 0x5155,
+  0x5169, 0x5177, 0x5176, 0x5178, 0x51bd, 0x51fd, 0x523b, 0x5238,
+  0x5237, 0x523a, 0x5230, 0x522e, 0x5236, 0x5241, 0x52be, 0x52bb,
+  0x5352, 0x5354, 0x5353, 0x5351, 0x5366, 0x5377, 0x5378, 0x5379,
+  0x53d6, 0x53d4, 0x53d7, 0x5473, 0x5475,
+  /* 0xa9 */
+  0x5496, 0x5478, 0x5495, 0x5480, 0x547b, 0x5477, 0x5484, 0x5492,
+  0x5486, 0x547c, 0x5490, 0x5471, 0x5476, 0x548c, 0x549a, 0x5462,
+  0x5468, 0x548b, 0x547d, 0x548e, 0x56fa, 0x5783, 0x5777, 0x576a,
+  0x5769, 0x5761, 0x5766, 0x5764, 0x577c, 0x591c, 0x5949, 0x5947,
+  0x5948, 0x5944, 0x5954, 0x59be, 0x59bb, 0x59d4, 0x59b9, 0x59ae,
+  0x59d1, 0x59c6, 0x59d0, 0x59cd, 0x59cb, 0x59d3, 0x59ca, 0x59af,
+  0x59b3, 0x59d2, 0x59c5, 0x5b5f, 0x5b64, 0x5b63, 0x5b97, 0x5b9a,
+  0x5b98, 0x5b9c, 0x5b99, 0x5b9b, 0x5c1a, 0x5c48, 0x5c45, 0x5c46,
+  0x5cb7, 0x5ca1, 0x5cb8, 0x5ca9, 0x5cab, 0x5cb1, 0x5cb3, 0x5e18,
+  0x5e1a, 0x5e16, 0x5e15, 0x5e1b, 0x5e11, 0x5e78, 0x5e9a, 0x5e97,
+  0x5e9c, 0x5e95, 0x5e96, 0x5ef6, 0x5f26, 0x5f27, 0x5f29, 0x5f80,
+  0x5f81, 0x5f7f, 0x5f7c, 0x5fdd, 0x5fe0, 0x5ffd, 0x5ff5, 0x5fff,
+  0x600f, 0x6014, 0x602f, 0x6035, 0x6016, 0x602a, 0x6015, 0x6021,
+  0x6027, 0x6029, 0x602b, 0x601b, 0x6216, 0x6215, 0x623f, 0x623e,
+  0x6240, 0x627f, 0x62c9, 0x62cc, 0x62c4, 0x62bf, 0x62c2, 0x62b9,
+  0x62d2, 0x62db, 0x62ab, 0x62d3, 0x62d4, 0x62cb, 0x62c8, 0x62a8,
+  0x62bd, 0x62bc, 0x62d0, 0x62d9, 0x62c7, 0x62cd, 0x62b5, 0x62da,
+  0x62b1, 0x62d8, 0x62d6, 0x62d7, 0x62c6, 0x62ac, 0x62ce, 0x653e,
+  0x65a7, 0x65bc, 0x65fa, 0x6614, 0x6613, 0x660c, 0x6606, 0x6602,
+  0x660e, 0x6600, 0x660f, 0x6615, 0x660a,
+  /* 0xaa */
+  0x6607, 0x670d, 0x670b, 0x676d, 0x678b, 0x6795, 0x6771, 0x679c,
+  0x6773, 0x6777, 0x6787, 0x679d, 0x6797, 0x676f, 0x6770, 0x677f,
+  0x6789, 0x677e, 0x6790, 0x6775, 0x679a, 0x6793, 0x677c, 0x676a,
+  0x6772, 0x6b23, 0x6b66, 0x6b67, 0x6b7f, 0x6c13, 0x6c1b, 0x6ce3,
+  0x6ce8, 0x6cf3, 0x6cb1, 0x6ccc, 0x6ce5, 0x6cb3, 0x6cbd, 0x6cbe,
+  0x6cbc, 0x6ce2, 0x6cab, 0x6cd5, 0x6cd3, 0x6cb8, 0x6cc4, 0x6cb9,
+  0x6cc1, 0x6cae, 0x6cd7, 0x6cc5, 0x6cf1, 0x6cbf, 0x6cbb, 0x6ce1,
+  0x6cdb, 0x6cca, 0x6cac, 0x6cef, 0x6cdc, 0x6cd6, 0x6ce0, 0x7095,
+  0x708e, 0x7092, 0x708a, 0x7099, 0x722c, 0x722d, 0x7238, 0x7248,
+  0x7267, 0x7269, 0x72c0, 0x72ce, 0x72d9, 0x72d7, 0x72d0, 0x73a9,
+  0x73a8, 0x739f, 0x73ab, 0x73a5, 0x753d, 0x759d, 0x7599, 0x759a,
+  0x7684, 0x76c2, 0x76f2, 0x76f4, 0x77e5, 0x77fd, 0x793e, 0x7940,
+  0x7941, 0x79c9, 0x79c8, 0x7a7a, 0x7a79, 0x7afa, 0x7cfe, 0x7f54,
+  0x7f8c, 0x7f8b, 0x8005, 0x80ba, 0x80a5, 0x80a2, 0x80b1, 0x80a1,
+  0x80ab, 0x80a9, 0x80b4, 0x80aa, 0x80af, 0x81e5, 0x81fe, 0x820d,
+  0x82b3, 0x829d, 0x8299, 0x82ad, 0x82bd, 0x829f, 0x82b9, 0x82b1,
+  0x82ac, 0x82a5, 0x82af, 0x82b8, 0x82a3, 0x82b0, 0x82be, 0x82b7,
+  0x864e, 0x8671, 0x521d, 0x8868, 0x8ecb, 0x8fce, 0x8fd4, 0x8fd1,
+  0x90b5, 0x90b8, 0x90b1, 0x90b6, 0x91c7, 0x91d1, 0x9577, 0x9580,
+  0x961c, 0x9640, 0x963f, 0x963b, 0x9644,
+  /* 0xab */
+  0x9642, 0x96b9, 0x96e8, 0x9752, 0x975e, 0x4e9f, 0x4ead, 0x4eae,
+  0x4fe1, 0x4fb5, 0x4faf, 0x4fbf, 0x4fe0, 0x4fd1, 0x4fcf, 0x4fdd,
+  0x4fc3, 0x4fb6, 0x4fd8, 0x4fdf, 0x4fca, 0x4fd7, 0x4fae, 0x4fd0,
+  0x4fc4, 0x4fc2, 0x4fda, 0x4fce, 0x4fde, 0x4fb7, 0x5157, 0x5192,
+  0x5191, 0x51a0, 0x524e, 0x5243, 0x524a, 0x524d, 0x524c, 0x524b,
+  0x5247, 0x52c7, 0x52c9, 0x52c3, 0x52c1, 0x530d, 0x5357, 0x537b,
+  0x539a, 0x53db, 0x54ac, 0x54c0, 0x54a8, 0x54ce, 0x54c9, 0x54b8,
+  0x54a6, 0x54b3, 0x54c7, 0x54c2, 0x54bd, 0x54aa, 0x54c1, 0x54c4,
+  0x54c8, 0x54af, 0x54ab, 0x54b1, 0x54bb, 0x54a9, 0x54a7, 0x54bf,
+  0x56ff, 0x5782, 0x578b, 0x57a0, 0x57a3, 0x57a2, 0x57ce, 0x57ae,
+  0x5793, 0x5955, 0x5951, 0x594f, 0x594e, 0x5950, 0x59dc, 0x59d8,
+  0x59ff, 0x59e3, 0x59e8, 0x5a03, 0x59e5, 0x59ea, 0x59da, 0x59e6,
+  0x5a01, 0x59fb, 0x5b69, 0x5ba3, 0x5ba6, 0x5ba4, 0x5ba2, 0x5ba5,
+  0x5c01, 0x5c4e, 0x5c4f, 0x5c4d, 0x5c4b, 0x5cd9, 0x5cd2, 0x5df7,
+  0x5e1d, 0x5e25, 0x5e1f, 0x5e7d, 0x5ea0, 0x5ea6, 0x5efa, 0x5f08,
+  0x5f2d, 0x5f65, 0x5f88, 0x5f85, 0x5f8a, 0x5f8b, 0x5f87, 0x5f8c,
+  0x5f89, 0x6012, 0x601d, 0x6020, 0x6025, 0x600e, 0x6028, 0x604d,
+  0x6070, 0x6068, 0x6062, 0x6046, 0x6043, 0x606c, 0x606b, 0x606a,
+  0x6064, 0x6241, 0x62dc, 0x6316, 0x6309, 0x62fc, 0x62ed, 0x6301,
+  0x62ee, 0x62fd, 0x6307, 0x62f1, 0x62f7,
+  /* 0xac */
+  0x62ef, 0x62ec, 0x62fe, 0x62f4, 0x6311, 0x6302, 0x653f, 0x6545,
+  0x65ab, 0x65bd, 0x65e2, 0x6625, 0x662d, 0x6620, 0x6627, 0x662f,
+  0x661f, 0x6628, 0x6631, 0x6624, 0x66f7, 0x67ff, 0x67d3, 0x67f1,
+  0x67d4, 0x67d0, 0x67ec, 0x67b6, 0x67af, 0x67f5, 0x67e9, 0x67ef,
+  0x67c4, 0x67d1, 0x67b4, 0x67da, 0x67e5, 0x67b8, 0x67cf, 0x67de,
+  0x67f3, 0x67b0, 0x67d9, 0x67e2, 0x67dd, 0x67d2, 0x6b6a, 0x6b83,
+  0x6b86, 0x6bb5, 0x6bd2, 0x6bd7, 0x6c1f, 0x6cc9, 0x6d0b, 0x6d32,
+  0x6d2a, 0x6d41, 0x6d25, 0x6d0c, 0x6d31, 0x6d1e, 0x6d17, 0x6d3b,
+  0x6d3d, 0x6d3e, 0x6d36, 0x6d1b, 0x6cf5, 0x6d39, 0x6d27, 0x6d38,
+  0x6d29, 0x6d2e, 0x6d35, 0x6d0e, 0x6d2b, 0x70ab, 0x70ba, 0x70b3,
+  0x70ac, 0x70af, 0x70ad, 0x70b8, 0x70ae, 0x70a4, 0x7230, 0x7272,
+  0x726f, 0x7274, 0x72e9, 0x72e0, 0x72e1, 0x73b7, 0x73ca, 0x73bb,
+  0x73b2, 0x73cd, 0x73c0, 0x73b3, 0x751a, 0x752d, 0x754f, 0x754c,
+  0x754e, 0x754b, 0x75ab, 0x75a4, 0x75a5, 0x75a2, 0x75a3, 0x7678,
+  0x7686, 0x7687, 0x7688, 0x76c8, 0x76c6, 0x76c3, 0x76c5, 0x7701,
+  0x76f9, 0x76f8, 0x7709, 0x770b, 0x76fe, 0x76fc, 0x7707, 0x77dc,
+  0x7802, 0x7814, 0x780c, 0x780d, 0x7946, 0x7949, 0x7948, 0x7947,
+  0x79b9, 0x79ba, 0x79d1, 0x79d2, 0x79cb, 0x7a7f, 0x7a81, 0x7aff,
+  0x7afd, 0x7c7d, 0x7d02, 0x7d05, 0x7d00, 0x7d09, 0x7d07, 0x7d04,
+  0x7d06, 0x7f38, 0x7f8e, 0x7fbf, 0x8004,
+  /* 0xad */
+  0x8010, 0x800d, 0x8011, 0x8036, 0x80d6, 0x80e5, 0x80da, 0x80c3,
+  0x80c4, 0x80cc, 0x80e1, 0x80db, 0x80ce, 0x80de, 0x80e4, 0x80dd,
+  0x81f4, 0x8222, 0x82e7, 0x8303, 0x8305, 0x82e3, 0x82db, 0x82e6,
+  0x8304, 0x82e5, 0x8302, 0x8309, 0x82d2, 0x82d7, 0x82f1, 0x8301,
+  0x82dc, 0x82d4, 0x82d1, 0x82de, 0x82d3, 0x82df, 0x82ef, 0x8306,
+  0x8650, 0x8679, 0x867b, 0x867a, 0x884d, 0x886b, 0x8981, 0x89d4,
+  0x8a08, 0x8a02, 0x8a03, 0x8c9e, 0x8ca0, 0x8d74, 0x8d73, 0x8db4,
+  0x8ecd, 0x8ecc, 0x8ff0, 0x8fe6, 0x8fe2, 0x8fea, 0x8fe5, 0x8fed,
+  0x8feb, 0x8fe4, 0x8fe8, 0x90ca, 0x90ce, 0x90c1, 0x90c3, 0x914b,
+  0x914a, 0x91cd, 0x9582, 0x9650, 0x964b, 0x964c, 0x964d, 0x9762,
+  0x9769, 0x97cb, 0x97ed, 0x97f3, 0x9801, 0x98a8, 0x98db, 0x98df,
+  0x9996, 0x9999, 0x4e58, 0x4eb3, 0x500c, 0x500d, 0x5023, 0x4fef,
+  0x5026, 0x5025, 0x4ff8, 0x5029, 0x5016, 0x5006, 0x503c, 0x501f,
+  0x501a, 0x5012, 0x5011, 0x4ffa, 0x5000, 0x5014, 0x5028, 0x4ff1,
+  0x5021, 0x500b, 0x5019, 0x5018, 0x4ff3, 0x4fee, 0x502d, 0x502a,
+  0x4ffe, 0x502b, 0x5009, 0x517c, 0x51a4, 0x51a5, 0x51a2, 0x51cd,
+  0x51cc, 0x51c6, 0x51cb, 0x5256, 0x525c, 0x5254, 0x525b, 0x525d,
+  0x532a, 0x537f, 0x539f, 0x539d, 0x53df, 0x54e8, 0x5510, 0x5501,
+  0x5537, 0x54fc, 0x54e5, 0x54f2, 0x5506, 0x54fa, 0x5514, 0x54e9,
+  0x54ed, 0x54e1, 0x5509, 0x54ee, 0x54ea,
+  /* 0xae */
+  0x54e6, 0x5527, 0x5507, 0x54fd, 0x550f, 0x5703, 0x5704, 0x57c2,
+  0x57d4, 0x57cb, 0x57c3, 0x5809, 0x590f, 0x5957, 0x5958, 0x595a,
+  0x5a11, 0x5a18, 0x5a1c, 0x5a1f, 0x5a1b, 0x5a13, 0x59ec, 0x5a20,
+  0x5a23, 0x5a29, 0x5a25, 0x5a0c, 0x5a09, 0x5b6b, 0x5c58, 0x5bb0,
+  0x5bb3, 0x5bb6, 0x5bb4, 0x5bae, 0x5bb5, 0x5bb9, 0x5bb8, 0x5c04,
+  0x5c51, 0x5c55, 0x5c50, 0x5ced, 0x5cfd, 0x5cfb, 0x5cea, 0x5ce8,
+  0x5cf0, 0x5cf6, 0x5d01, 0x5cf4, 0x5dee, 0x5e2d, 0x5e2b, 0x5eab,
+  0x5ead, 0x5ea7, 0x5f31, 0x5f92, 0x5f91, 0x5f90, 0x6059, 0x6063,
+  0x6065, 0x6050, 0x6055, 0x606d, 0x6069, 0x606f, 0x6084, 0x609f,
+  0x609a, 0x608d, 0x6094, 0x608c, 0x6085, 0x6096, 0x6247, 0x62f3,
+  0x6308, 0x62ff, 0x634e, 0x633e, 0x632f, 0x6355, 0x6342, 0x6346,
+  0x634f, 0x6349, 0x633a, 0x6350, 0x633d, 0x632a, 0x632b, 0x6328,
+  0x634d, 0x634c, 0x6548, 0x6549, 0x6599, 0x65c1, 0x65c5, 0x6642,
+  0x6649, 0x664f, 0x6643, 0x6652, 0x664c, 0x6645, 0x6641, 0x66f8,
+  0x6714, 0x6715, 0x6717, 0x6821, 0x6838, 0x6848, 0x6846, 0x6853,
+  0x6839, 0x6842, 0x6854, 0x6829, 0x68b3, 0x6817, 0x684c, 0x6851,
+  0x683d, 0x67f4, 0x6850, 0x6840, 0x683c, 0x6843, 0x682a, 0x6845,
+  0x6813, 0x6818, 0x6841, 0x6b8a, 0x6b89, 0x6bb7, 0x6c23, 0x6c27,
+  0x6c28, 0x6c26, 0x6c24, 0x6cf0, 0x6d6a, 0x6d95, 0x6d88, 0x6d87,
+  0x6d66, 0x6d78, 0x6d77, 0x6d59, 0x6d93,
+  /* 0xaf */
+  0x6d6c, 0x6d89, 0x6d6e, 0x6d5a, 0x6d74, 0x6d69, 0x6d8c, 0x6d8a,
+  0x6d79, 0x6d85, 0x6d65, 0x6d94, 0x70ca, 0x70d8, 0x70e4, 0x70d9,
+  0x70c8, 0x70cf, 0x7239, 0x7279, 0x72fc, 0x72f9, 0x72fd, 0x72f8,
+  0x72f7, 0x7386, 0x73ed, 0x7409, 0x73ee, 0x73e0, 0x73ea, 0x73de,
+  0x7554, 0x755d, 0x755c, 0x755a, 0x7559, 0x75be, 0x75c5, 0x75c7,
+  0x75b2, 0x75b3, 0x75bd, 0x75bc, 0x75b9, 0x75c2, 0x75b8, 0x768b,
+  0x76b0, 0x76ca, 0x76cd, 0x76ce, 0x7729, 0x771f, 0x7720, 0x7728,
+  0x77e9, 0x7830, 0x7827, 0x7838, 0x781d, 0x7834, 0x7837, 0x7825,
+  0x782d, 0x7820, 0x781f, 0x7832, 0x7955, 0x7950, 0x7960, 0x795f,
+  0x7956, 0x795e, 0x795d, 0x7957, 0x795a, 0x79e4, 0x79e3, 0x79e7,
+  0x79df, 0x79e6, 0x79e9, 0x79d8, 0x7a84, 0x7a88, 0x7ad9, 0x7b06,
+  0x7b11, 0x7c89, 0x7d21, 0x7d17, 0x7d0b, 0x7d0a, 0x7d20, 0x7d22,
+  0x7d14, 0x7d10, 0x7d15, 0x7d1a, 0x7d1c, 0x7d0d, 0x7d19, 0x7d1b,
+  0x7f3a, 0x7f5f, 0x7f94, 0x7fc5, 0x7fc1, 0x8006, 0x8018, 0x8015,
+  0x8019, 0x8017, 0x803d, 0x803f, 0x80f1, 0x8102, 0x80f0, 0x8105,
+  0x80ed, 0x80f4, 0x8106, 0x80f8, 0x80f3, 0x8108, 0x80fd, 0x810a,
+  0x80fc, 0x80ef, 0x81ed, 0x81ec, 0x8200, 0x8210, 0x822a, 0x822b,
+  0x8228, 0x822c, 0x82bb, 0x832b, 0x8352, 0x8354, 0x834a, 0x8338,
+  0x8350, 0x8349, 0x8335, 0x8334, 0x834f, 0x8332, 0x8339, 0x8336,
+  0x8317, 0x8340, 0x8331, 0x8328, 0x8343,
+  /* 0xb0 */
+  0x8654, 0x868a, 0x86aa, 0x8693, 0x86a4, 0x86a9, 0x868c, 0x86a3,
+  0x869c, 0x8870, 0x8877, 0x8881, 0x8882, 0x887d, 0x8879, 0x8a18,
+  0x8a10, 0x8a0e, 0x8a0c, 0x8a15, 0x8a0a, 0x8a17, 0x8a13, 0x8a16,
+  0x8a0f, 0x8a11, 0x8c48, 0x8c7a, 0x8c79, 0x8ca1, 0x8ca2, 0x8d77,
+  0x8eac, 0x8ed2, 0x8ed4, 0x8ecf, 0x8fb1, 0x9001, 0x9006, 0x8ff7,
+  0x9000, 0x8ffa, 0x8ff4, 0x9003, 0x8ffd, 0x9005, 0x8ff8, 0x9095,
+  0x90e1, 0x90dd, 0x90e2, 0x9152, 0x914d, 0x914c, 0x91d8, 0x91dd,
+  0x91d7, 0x91dc, 0x91d9, 0x9583, 0x9662, 0x9663, 0x9661, 0x965b,
+  0x965d, 0x9664, 0x9658, 0x965e, 0x96bb, 0x98e2, 0x99ac, 0x9aa8,
+  0x9ad8, 0x9b25, 0x9b32, 0x9b3c, 0x4e7e, 0x507a, 0x507d, 0x505c,
+  0x5047, 0x5043, 0x504c, 0x505a, 0x5049, 0x5065, 0x5076, 0x504e,
+  0x5055, 0x5075, 0x5074, 0x5077, 0x504f, 0x500f, 0x506f, 0x506d,
+  0x515c, 0x5195, 0x51f0, 0x526a, 0x526f, 0x52d2, 0x52d9, 0x52d8,
+  0x52d5, 0x5310, 0x530f, 0x5319, 0x533f, 0x5340, 0x533e, 0x53c3,
+  0x66fc, 0x5546, 0x556a, 0x5566, 0x5544, 0x555e, 0x5561, 0x5543,
+  0x554a, 0x5531, 0x5556, 0x554f, 0x5555, 0x552f, 0x5564, 0x5538,
+  0x552e, 0x555c, 0x552c, 0x5563, 0x5533, 0x5541, 0x5557, 0x5708,
+  0x570b, 0x5709, 0x57df, 0x5805, 0x580a, 0x5806, 0x57e0, 0x57e4,
+  0x57fa, 0x5802, 0x5835, 0x57f7, 0x57f9, 0x5920, 0x5962, 0x5a36,
+  0x5a41, 0x5a49, 0x5a66, 0x5a6a, 0x5a40,
+  /* 0xb1 */
+  0x5a3c, 0x5a62, 0x5a5a, 0x5a46, 0x5a4a, 0x5b70, 0x5bc7, 0x5bc5,
+  0x5bc4, 0x5bc2, 0x5bbf, 0x5bc6, 0x5c09, 0x5c08, 0x5c07, 0x5c60,
+  0x5c5c, 0x5c5d, 0x5d07, 0x5d06, 0x5d0e, 0x5d1b, 0x5d16, 0x5d22,
+  0x5d11, 0x5d29, 0x5d14, 0x5d19, 0x5d24, 0x5d27, 0x5d17, 0x5de2,
+  0x5e38, 0x5e36, 0x5e33, 0x5e37, 0x5eb7, 0x5eb8, 0x5eb6, 0x5eb5,
+  0x5ebe, 0x5f35, 0x5f37, 0x5f57, 0x5f6c, 0x5f69, 0x5f6b, 0x5f97,
+  0x5f99, 0x5f9e, 0x5f98, 0x5fa1, 0x5fa0, 0x5f9c, 0x607f, 0x60a3,
+  0x6089, 0x60a0, 0x60a8, 0x60cb, 0x60b4, 0x60e6, 0x60bd, 0x60c5,
+  0x60bb, 0x60b5, 0x60dc, 0x60bc, 0x60d8, 0x60d5, 0x60c6, 0x60df,
+  0x60b8, 0x60da, 0x60c7, 0x621a, 0x621b, 0x6248, 0x63a0, 0x63a7,
+  0x6372, 0x6396, 0x63a2, 0x63a5, 0x6377, 0x6367, 0x6398, 0x63aa,
+  0x6371, 0x63a9, 0x6389, 0x6383, 0x639b, 0x636b, 0x63a8, 0x6384,
+  0x6388, 0x6399, 0x63a1, 0x63ac, 0x6392, 0x638f, 0x6380, 0x637b,
+  0x6369, 0x6368, 0x637a, 0x655d, 0x6556, 0x6551, 0x6559, 0x6557,
+  0x555f, 0x654f, 0x6558, 0x6555, 0x6554, 0x659c, 0x659b, 0x65ac,
+  0x65cf, 0x65cb, 0x65cc, 0x65ce, 0x665d, 0x665a, 0x6664, 0x6668,
+  0x6666, 0x665e, 0x66f9, 0x52d7, 0x671b, 0x6881, 0x68af, 0x68a2,
+  0x6893, 0x68b5, 0x687f, 0x6876, 0x68b1, 0x68a7, 0x6897, 0x68b0,
+  0x6883, 0x68c4, 0x68ad, 0x6886, 0x6885, 0x6894, 0x689d, 0x68a8,
+  0x689f, 0x68a1, 0x6882, 0x6b32, 0x6bba,
+  /* 0xb2 */
+  0x6beb, 0x6bec, 0x6c2b, 0x6d8e, 0x6dbc, 0x6df3, 0x6dd9, 0x6db2,
+  0x6de1, 0x6dcc, 0x6de4, 0x6dfb, 0x6dfa, 0x6e05, 0x6dc7, 0x6dcb,
+  0x6daf, 0x6dd1, 0x6dae, 0x6dde, 0x6df9, 0x6db8, 0x6df7, 0x6df5,
+  0x6dc5, 0x6dd2, 0x6e1a, 0x6db5, 0x6dda, 0x6deb, 0x6dd8, 0x6dea,
+  0x6df1, 0x6dee, 0x6de8, 0x6dc6, 0x6dc4, 0x6daa, 0x6dec, 0x6dbf,
+  0x6de6, 0x70f9, 0x7109, 0x710a, 0x70fd, 0x70ef, 0x723d, 0x727d,
+  0x7281, 0x731c, 0x731b, 0x7316, 0x7313, 0x7319, 0x7387, 0x7405,
+  0x740a, 0x7403, 0x7406, 0x73fe, 0x740d, 0x74e0, 0x74f6, 0x74f7,
+  0x751c, 0x7522, 0x7565, 0x7566, 0x7562, 0x7570, 0x758f, 0x75d4,
+  0x75d5, 0x75b5, 0x75ca, 0x75cd, 0x768e, 0x76d4, 0x76d2, 0x76db,
+  0x7737, 0x773e, 0x773c, 0x7736, 0x7738, 0x773a, 0x786b, 0x7843,
+  0x784e, 0x7965, 0x7968, 0x796d, 0x79fb, 0x7a92, 0x7a95, 0x7b20,
+  0x7b28, 0x7b1b, 0x7b2c, 0x7b26, 0x7b19, 0x7b1e, 0x7b2e, 0x7c92,
+  0x7c97, 0x7c95, 0x7d46, 0x7d43, 0x7d71, 0x7d2e, 0x7d39, 0x7d3c,
+  0x7d40, 0x7d30, 0x7d33, 0x7d44, 0x7d2f, 0x7d42, 0x7d32, 0x7d31,
+  0x7f3d, 0x7f9e, 0x7f9a, 0x7fcc, 0x7fce, 0x7fd2, 0x801c, 0x804a,
+  0x8046, 0x812f, 0x8116, 0x8123, 0x812b, 0x8129, 0x8130, 0x8124,
+  0x8202, 0x8235, 0x8237, 0x8236, 0x8239, 0x838e, 0x839e, 0x8398,
+  0x8378, 0x83a2, 0x8396, 0x83bd, 0x83ab, 0x8392, 0x838a, 0x8393,
+  0x8389, 0x83a0, 0x8377, 0x837b, 0x837c,
+  /* 0xb3 */
+  0x8386, 0x83a7, 0x8655, 0x5f6a, 0x86c7, 0x86c0, 0x86b6, 0x86c4,
+  0x86b5, 0x86c6, 0x86cb, 0x86b1, 0x86af, 0x86c9, 0x8853, 0x889e,
+  0x8888, 0x88ab, 0x8892, 0x8896, 0x888d, 0x888b, 0x8993, 0x898f,
+  0x8a2a, 0x8a1d, 0x8a23, 0x8a25, 0x8a31, 0x8a2d, 0x8a1f, 0x8a1b,
+  0x8a22, 0x8c49, 0x8c5a, 0x8ca9, 0x8cac, 0x8cab, 0x8ca8, 0x8caa,
+  0x8ca7, 0x8d67, 0x8d66, 0x8dbe, 0x8dba, 0x8edb, 0x8edf, 0x9019,
+  0x900d, 0x901a, 0x9017, 0x9023, 0x901f, 0x901d, 0x9010, 0x9015,
+  0x901e, 0x9020, 0x900f, 0x9022, 0x9016, 0x901b, 0x9014, 0x90e8,
+  0x90ed, 0x90fd, 0x9157, 0x91ce, 0x91f5, 0x91e6, 0x91e3, 0x91e7,
+  0x91ed, 0x91e9, 0x9589, 0x966a, 0x9675, 0x9673, 0x9678, 0x9670,
+  0x9674, 0x9676, 0x9677, 0x966c, 0x96c0, 0x96ea, 0x96e9, 0x7ae0,
+  0x7adf, 0x9802, 0x9803, 0x9b5a, 0x9ce5, 0x9e75, 0x9e7f, 0x9ea5,
+  0x9ebb, 0x50a2, 0x508d, 0x5085, 0x5099, 0x5091, 0x5080, 0x5096,
+  0x5098, 0x509a, 0x6700, 0x51f1, 0x5272, 0x5274, 0x5275, 0x5269,
+  0x52de, 0x52dd, 0x52db, 0x535a, 0x53a5, 0x557b, 0x5580, 0x55a7,
+  0x557c, 0x558a, 0x559d, 0x5598, 0x5582, 0x559c, 0x55aa, 0x5594,
+  0x5587, 0x558b, 0x5583, 0x55b3, 0x55ae, 0x559f, 0x553e, 0x55b2,
+  0x559a, 0x55bb, 0x55ac, 0x55b1, 0x557e, 0x5589, 0x55ab, 0x5599,
+  0x570d, 0x582f, 0x582a, 0x5834, 0x5824, 0x5830, 0x5831, 0x5821,
+  0x581d, 0x5820, 0x58f9, 0x58fa, 0x5960,
+  /* 0xb4 */
+  0x5a77, 0x5a9a, 0x5a7f, 0x5a92, 0x5a9b, 0x5aa7, 0x5b73, 0x5b71,
+  0x5bd2, 0x5bcc, 0x5bd3, 0x5bd0, 0x5c0a, 0x5c0b, 0x5c31, 0x5d4c,
+  0x5d50, 0x5d34, 0x5d47, 0x5dfd, 0x5e45, 0x5e3d, 0x5e40, 0x5e43,
+  0x5e7e, 0x5eca, 0x5ec1, 0x5ec2, 0x5ec4, 0x5f3c, 0x5f6d, 0x5fa9,
+  0x5faa, 0x5fa8, 0x60d1, 0x60e1, 0x60b2, 0x60b6, 0x60e0, 0x611c,
+  0x6123, 0x60fa, 0x6115, 0x60f0, 0x60fb, 0x60f4, 0x6168, 0x60f1,
+  0x610e, 0x60f6, 0x6109, 0x6100, 0x6112, 0x621f, 0x6249, 0x63a3,
+  0x638c, 0x63cf, 0x63c0, 0x63e9, 0x63c9, 0x63c6, 0x63cd, 0x63d2,
+  0x63e3, 0x63d0, 0x63e1, 0x63d6, 0x63ed, 0x63ee, 0x6376, 0x63f4,
+  0x63ea, 0x63db, 0x6452, 0x63da, 0x63f9, 0x655e, 0x6566, 0x6562,
+  0x6563, 0x6591, 0x6590, 0x65af, 0x666e, 0x6670, 0x6674, 0x6676,
+  0x666f, 0x6691, 0x667a, 0x667e, 0x6677, 0x66fe, 0x66ff, 0x671f,
+  0x671d, 0x68fa, 0x68d5, 0x68e0, 0x68d8, 0x68d7, 0x6905, 0x68df,
+  0x68f5, 0x68ee, 0x68e7, 0x68f9, 0x68d2, 0x68f2, 0x68e3, 0x68cb,
+  0x68cd, 0x690d, 0x6912, 0x690e, 0x68c9, 0x68da, 0x696e, 0x68fb,
+  0x6b3e, 0x6b3a, 0x6b3d, 0x6b98, 0x6b96, 0x6bbc, 0x6bef, 0x6c2e,
+  0x6c2f, 0x6c2c, 0x6e2f, 0x6e38, 0x6e54, 0x6e21, 0x6e32, 0x6e67,
+  0x6e4a, 0x6e20, 0x6e25, 0x6e23, 0x6e1b, 0x6e5b, 0x6e58, 0x6e24,
+  0x6e56, 0x6e6e, 0x6e2d, 0x6e26, 0x6e6f, 0x6e34, 0x6e4d, 0x6e3a,
+  0x6e2c, 0x6e43, 0x6e1d, 0x6e3e, 0x6ecb,
+  /* 0xb5 */
+  0x6e89, 0x6e19, 0x6e4e, 0x6e63, 0x6e44, 0x6e72, 0x6e69, 0x6e5f,
+  0x7119, 0x711a, 0x7126, 0x7130, 0x7121, 0x7136, 0x716e, 0x711c,
+  0x724c, 0x7284, 0x7280, 0x7336, 0x7325, 0x7334, 0x7329, 0x743a,
+  0x742a, 0x7433, 0x7422, 0x7425, 0x7435, 0x7436, 0x7434, 0x742f,
+  0x741b, 0x7426, 0x7428, 0x7525, 0x7526, 0x756b, 0x756a, 0x75e2,
+  0x75db, 0x75e3, 0x75d9, 0x75d8, 0x75de, 0x75e0, 0x767b, 0x767c,
+  0x7696, 0x7693, 0x76b4, 0x76dc, 0x774f, 0x77ed, 0x785d, 0x786c,
+  0x786f, 0x7a0d, 0x7a08, 0x7a0b, 0x7a05, 0x7a00, 0x7a98, 0x7a97,
+  0x7a96, 0x7ae5, 0x7ae3, 0x7b49, 0x7b56, 0x7b46, 0x7b50, 0x7b52,
+  0x7b54, 0x7b4d, 0x7b4b, 0x7b4f, 0x7b51, 0x7c9f, 0x7ca5, 0x7d5e,
+  0x7d50, 0x7d68, 0x7d55, 0x7d2b, 0x7d6e, 0x7d72, 0x7d61, 0x7d66,
+  0x7d62, 0x7d70, 0x7d73, 0x5584, 0x7fd4, 0x7fd5, 0x800b, 0x8052,
+  0x8085, 0x8155, 0x8154, 0x814b, 0x8151, 0x814e, 0x8139, 0x8146,
+  0x813e, 0x814c, 0x8153, 0x8174, 0x8212, 0x821c, 0x83e9, 0x8403,
+  0x83f8, 0x840d, 0x83e0, 0x83c5, 0x840b, 0x83c1, 0x83ef, 0x83f1,
+  0x83f4, 0x8457, 0x840a, 0x83f0, 0x840c, 0x83cc, 0x83fd, 0x83f2,
+  0x83ca, 0x8438, 0x840e, 0x8404, 0x83dc, 0x8407, 0x83d4, 0x83df,
+  0x865b, 0x86df, 0x86d9, 0x86ed, 0x86d4, 0x86db, 0x86e4, 0x86d0,
+  0x86de, 0x8857, 0x88c1, 0x88c2, 0x88b1, 0x8983, 0x8996, 0x8a3b,
+  0x8a60, 0x8a55, 0x8a5e, 0x8a3c, 0x8a41,
+  /* 0xb6 */
+  0x8a54, 0x8a5b, 0x8a50, 0x8a46, 0x8a34, 0x8a3a, 0x8a36, 0x8a56,
+  0x8c61, 0x8c82, 0x8caf, 0x8cbc, 0x8cb3, 0x8cbd, 0x8cc1, 0x8cbb,
+  0x8cc0, 0x8cb4, 0x8cb7, 0x8cb6, 0x8cbf, 0x8cb8, 0x8d8a, 0x8d85,
+  0x8d81, 0x8dce, 0x8ddd, 0x8dcb, 0x8dda, 0x8dd1, 0x8dcc, 0x8ddb,
+  0x8dc6, 0x8efb, 0x8ef8, 0x8efc, 0x8f9c, 0x902e, 0x9035, 0x9031,
+  0x9038, 0x9032, 0x9036, 0x9102, 0x90f5, 0x9109, 0x90fe, 0x9163,
+  0x9165, 0x91cf, 0x9214, 0x9215, 0x9223, 0x9209, 0x921e, 0x920d,
+  0x9210, 0x9207, 0x9211, 0x9594, 0x958f, 0x958b, 0x9591, 0x9593,
+  0x9592, 0x958e, 0x968a, 0x968e, 0x968b, 0x967d, 0x9685, 0x9686,
+  0x968d, 0x9672, 0x9684, 0x96c1, 0x96c5, 0x96c4, 0x96c6, 0x96c7,
+  0x96ef, 0x96f2, 0x97cc, 0x9805, 0x9806, 0x9808, 0x98e7, 0x98ea,
+  0x98ef, 0x98e9, 0x98f2, 0x98ed, 0x99ae, 0x99ad, 0x9ec3, 0x9ecd,
+  0x9ed1, 0x4e82, 0x50ad, 0x50b5, 0x50b2, 0x50b3, 0x50c5, 0x50be,
+  0x50ac, 0x50b7, 0x50bb, 0x50af, 0x50c7, 0x527f, 0x5277, 0x527d,
+  0x52df, 0x52e6, 0x52e4, 0x52e2, 0x52e3, 0x532f, 0x55df, 0x55e8,
+  0x55d3, 0x55e6, 0x55ce, 0x55dc, 0x55c7, 0x55d1, 0x55e3, 0x55e4,
+  0x55ef, 0x55da, 0x55e1, 0x55c5, 0x55c6, 0x55e5, 0x55c9, 0x5712,
+  0x5713, 0x585e, 0x5851, 0x5858, 0x5857, 0x585a, 0x5854, 0x586b,
+  0x584c, 0x586d, 0x584a, 0x5862, 0x5852, 0x584b, 0x5967, 0x5ac1,
+  0x5ac9, 0x5acc, 0x5abe, 0x5abd, 0x5abc,
+  /* 0xb7 */
+  0x5ab3, 0x5ac2, 0x5ab2, 0x5d69, 0x5d6f, 0x5e4c, 0x5e79, 0x5ec9,
+  0x5ec8, 0x5f12, 0x5f59, 0x5fac, 0x5fae, 0x611a, 0x610f, 0x6148,
+  0x611f, 0x60f3, 0x611b, 0x60f9, 0x6101, 0x6108, 0x614e, 0x614c,
+  0x6144, 0x614d, 0x613e, 0x6134, 0x6127, 0x610d, 0x6106, 0x6137,
+  0x6221, 0x6222, 0x6413, 0x643e, 0x641e, 0x642a, 0x642d, 0x643d,
+  0x642c, 0x640f, 0x641c, 0x6414, 0x640d, 0x6436, 0x6416, 0x6417,
+  0x6406, 0x656c, 0x659f, 0x65b0, 0x6697, 0x6689, 0x6687, 0x6688,
+  0x6696, 0x6684, 0x6698, 0x668d, 0x6703, 0x6994, 0x696d, 0x695a,
+  0x6977, 0x6960, 0x6954, 0x6975, 0x6930, 0x6982, 0x694a, 0x6968,
+  0x696b, 0x695e, 0x6953, 0x6979, 0x6986, 0x695d, 0x6963, 0x695b,
+  0x6b47, 0x6b72, 0x6bc0, 0x6bbf, 0x6bd3, 0x6bfd, 0x6ea2, 0x6eaf,
+  0x6ed3, 0x6eb6, 0x6ec2, 0x6e90, 0x6e9d, 0x6ec7, 0x6ec5, 0x6ea5,
+  0x6e98, 0x6ebc, 0x6eba, 0x6eab, 0x6ed1, 0x6e96, 0x6e9c, 0x6ec4,
+  0x6ed4, 0x6eaa, 0x6ea7, 0x6eb4, 0x714e, 0x7159, 0x7169, 0x7164,
+  0x7149, 0x7167, 0x715c, 0x716c, 0x7166, 0x714c, 0x7165, 0x715e,
+  0x7146, 0x7168, 0x7156, 0x723a, 0x7252, 0x7337, 0x7345, 0x733f,
+  0x733e, 0x746f, 0x745a, 0x7455, 0x745f, 0x745e, 0x7441, 0x743f,
+  0x7459, 0x745b, 0x745c, 0x7576, 0x7578, 0x7600, 0x75f0, 0x7601,
+  0x75f2, 0x75f1, 0x75fa, 0x75ff, 0x75f4, 0x75f3, 0x76de, 0x76df,
+  0x775b, 0x776b, 0x7766, 0x775e, 0x7763,
+  /* 0xb8 */
+  0x7779, 0x776a, 0x776c, 0x775c, 0x7765, 0x7768, 0x7762, 0x77ee,
+  0x788e, 0x78b0, 0x7897, 0x7898, 0x788c, 0x7889, 0x787c, 0x7891,
+  0x7893, 0x787f, 0x797a, 0x797f, 0x7981, 0x842c, 0x79bd, 0x7a1c,
+  0x7a1a, 0x7a20, 0x7a14, 0x7a1f, 0x7a1e, 0x7a9f, 0x7aa0, 0x7b77,
+  0x7bc0, 0x7b60, 0x7b6e, 0x7b67, 0x7cb1, 0x7cb3, 0x7cb5, 0x7d93,
+  0x7d79, 0x7d91, 0x7d81, 0x7d8f, 0x7d5b, 0x7f6e, 0x7f69, 0x7f6a,
+  0x7f72, 0x7fa9, 0x7fa8, 0x7fa4, 0x8056, 0x8058, 0x8086, 0x8084,
+  0x8171, 0x8170, 0x8178, 0x8165, 0x816e, 0x8173, 0x816b, 0x8179,
+  0x817a, 0x8166, 0x8205, 0x8247, 0x8482, 0x8477, 0x843d, 0x8431,
+  0x8475, 0x8466, 0x846b, 0x8449, 0x846c, 0x845b, 0x843c, 0x8435,
+  0x8461, 0x8463, 0x8469, 0x846d, 0x8446, 0x865e, 0x865c, 0x865f,
+  0x86f9, 0x8713, 0x8708, 0x8707, 0x8700, 0x86fe, 0x86fb, 0x8702,
+  0x8703, 0x8706, 0x870a, 0x8859, 0x88df, 0x88d4, 0x88d9, 0x88dc,
+  0x88d8, 0x88dd, 0x88e1, 0x88ca, 0x88d5, 0x88d2, 0x899c, 0x89e3,
+  0x8a6b, 0x8a72, 0x8a73, 0x8a66, 0x8a69, 0x8a70, 0x8a87, 0x8a7c,
+  0x8a63, 0x8aa0, 0x8a71, 0x8a85, 0x8a6d, 0x8a62, 0x8a6e, 0x8a6c,
+  0x8a79, 0x8a7b, 0x8a3e, 0x8a68, 0x8c62, 0x8c8a, 0x8c89, 0x8cca,
+  0x8cc7, 0x8cc8, 0x8cc4, 0x8cb2, 0x8cc3, 0x8cc2, 0x8cc5, 0x8de1,
+  0x8ddf, 0x8de8, 0x8def, 0x8df3, 0x8dfa, 0x8dea, 0x8de4, 0x8de6,
+  0x8eb2, 0x8f03, 0x8f09, 0x8efe, 0x8f0a,
+  /* 0xb9 */
+  0x8f9f, 0x8fb2, 0x904b, 0x904a, 0x9053, 0x9042, 0x9054, 0x903c,
+  0x9055, 0x9050, 0x9047, 0x904f, 0x904e, 0x904d, 0x9051, 0x903e,
+  0x9041, 0x9112, 0x9117, 0x916c, 0x916a, 0x9169, 0x91c9, 0x9237,
+  0x9257, 0x9238, 0x923d, 0x9240, 0x923e, 0x925b, 0x924b, 0x9264,
+  0x9251, 0x9234, 0x9249, 0x924d, 0x9245, 0x9239, 0x923f, 0x925a,
+  0x9598, 0x9698, 0x9694, 0x9695, 0x96cd, 0x96cb, 0x96c9, 0x96ca,
+  0x96f7, 0x96fb, 0x96f9, 0x96f6, 0x9756, 0x9774, 0x9776, 0x9810,
+  0x9811, 0x9813, 0x980a, 0x9812, 0x980c, 0x98fc, 0x98f4, 0x98fd,
+  0x98fe, 0x99b3, 0x99b1, 0x99b4, 0x9ae1, 0x9ce9, 0x9e82, 0x9f0e,
+  0x9f13, 0x9f20, 0x50e7, 0x50ee, 0x50e5, 0x50d6, 0x50ed, 0x50da,
+  0x50d5, 0x50cf, 0x50d1, 0x50f1, 0x50ce, 0x50e9, 0x5162, 0x51f3,
+  0x5283, 0x5282, 0x5331, 0x53ad, 0x55fe, 0x5600, 0x561b, 0x5617,
+  0x55fd, 0x5614, 0x5606, 0x5609, 0x560d, 0x560e, 0x55f7, 0x5616,
+  0x561f, 0x5608, 0x5610, 0x55f6, 0x5718, 0x5716, 0x5875, 0x587e,
+  0x5883, 0x5893, 0x588a, 0x5879, 0x5885, 0x587d, 0x58fd, 0x5925,
+  0x5922, 0x5924, 0x596a, 0x5969, 0x5ae1, 0x5ae6, 0x5ae9, 0x5ad7,
+  0x5ad6, 0x5ad8, 0x5ae3, 0x5b75, 0x5bde, 0x5be7, 0x5be1, 0x5be5,
+  0x5be6, 0x5be8, 0x5be2, 0x5be4, 0x5bdf, 0x5c0d, 0x5c62, 0x5d84,
+  0x5d87, 0x5e5b, 0x5e63, 0x5e55, 0x5e57, 0x5e54, 0x5ed3, 0x5ed6,
+  0x5f0a, 0x5f46, 0x5f70, 0x5fb9, 0x6147,
+  /* 0xba */
+  0x613f, 0x614b, 0x6177, 0x6162, 0x6163, 0x615f, 0x615a, 0x6158,
+  0x6175, 0x622a, 0x6487, 0x6458, 0x6454, 0x64a4, 0x6478, 0x645f,
+  0x647a, 0x6451, 0x6467, 0x6434, 0x646d, 0x647b, 0x6572, 0x65a1,
+  0x65d7, 0x65d6, 0x66a2, 0x66a8, 0x669d, 0x699c, 0x69a8, 0x6995,
+  0x69c1, 0x69ae, 0x69d3, 0x69cb, 0x699b, 0x69b7, 0x69bb, 0x69ab,
+  0x69b4, 0x69d0, 0x69cd, 0x69ad, 0x69cc, 0x69a6, 0x69c3, 0x69a3,
+  0x6b49, 0x6b4c, 0x6c33, 0x6f33, 0x6f14, 0x6efe, 0x6f13, 0x6ef4,
+  0x6f29, 0x6f3e, 0x6f20, 0x6f2c, 0x6f0f, 0x6f02, 0x6f22, 0x6eff,
+  0x6eef, 0x6f06, 0x6f31, 0x6f38, 0x6f32, 0x6f23, 0x6f15, 0x6f2b,
+  0x6f2f, 0x6f88, 0x6f2a, 0x6eec, 0x6f01, 0x6ef2, 0x6ecc, 0x6ef7,
+  0x7194, 0x7199, 0x717d, 0x718a, 0x7184, 0x7192, 0x723e, 0x7292,
+  0x7296, 0x7344, 0x7350, 0x7464, 0x7463, 0x746a, 0x7470, 0x746d,
+  0x7504, 0x7591, 0x7627, 0x760d, 0x760b, 0x7609, 0x7613, 0x76e1,
+  0x76e3, 0x7784, 0x777d, 0x777f, 0x7761, 0x78c1, 0x789f, 0x78a7,
+  0x78b3, 0x78a9, 0x78a3, 0x798e, 0x798f, 0x798d, 0x7a2e, 0x7a31,
+  0x7aaa, 0x7aa9, 0x7aed, 0x7aef, 0x7ba1, 0x7b95, 0x7b8b, 0x7b75,
+  0x7b97, 0x7b9d, 0x7b94, 0x7b8f, 0x7bb8, 0x7b87, 0x7b84, 0x7cb9,
+  0x7cbd, 0x7cbe, 0x7dbb, 0x7db0, 0x7d9c, 0x7dbd, 0x7dbe, 0x7da0,
+  0x7dca, 0x7db4, 0x7db2, 0x7db1, 0x7dba, 0x7da2, 0x7dbf, 0x7db5,
+  0x7db8, 0x7dad, 0x7dd2, 0x7dc7, 0x7dac,
+  /* 0xbb */
+  0x7f70, 0x7fe0, 0x7fe1, 0x7fdf, 0x805e, 0x805a, 0x8087, 0x8150,
+  0x8180, 0x818f, 0x8188, 0x818a, 0x817f, 0x8182, 0x81e7, 0x81fa,
+  0x8207, 0x8214, 0x821e, 0x824b, 0x84c9, 0x84bf, 0x84c6, 0x84c4,
+  0x8499, 0x849e, 0x84b2, 0x849c, 0x84cb, 0x84b8, 0x84c0, 0x84d3,
+  0x8490, 0x84bc, 0x84d1, 0x84ca, 0x873f, 0x871c, 0x873b, 0x8722,
+  0x8725, 0x8734, 0x8718, 0x8755, 0x8737, 0x8729, 0x88f3, 0x8902,
+  0x88f4, 0x88f9, 0x88f8, 0x88fd, 0x88e8, 0x891a, 0x88ef, 0x8aa6,
+  0x8a8c, 0x8a9e, 0x8aa3, 0x8a8d, 0x8aa1, 0x8a93, 0x8aa4, 0x8aaa,
+  0x8aa5, 0x8aa8, 0x8a98, 0x8a91, 0x8a9a, 0x8aa7, 0x8c6a, 0x8c8d,
+  0x8c8c, 0x8cd3, 0x8cd1, 0x8cd2, 0x8d6b, 0x8d99, 0x8d95, 0x8dfc,
+  0x8f14, 0x8f12, 0x8f15, 0x8f13, 0x8fa3, 0x9060, 0x9058, 0x905c,
+  0x9063, 0x9059, 0x905e, 0x9062, 0x905d, 0x905b, 0x9119, 0x9118,
+  0x911e, 0x9175, 0x9178, 0x9177, 0x9174, 0x9278, 0x9280, 0x9285,
+  0x9298, 0x9296, 0x927b, 0x9293, 0x929c, 0x92a8, 0x927c, 0x9291,
+  0x95a1, 0x95a8, 0x95a9, 0x95a3, 0x95a5, 0x95a4, 0x9699, 0x969c,
+  0x969b, 0x96cc, 0x96d2, 0x9700, 0x977c, 0x9785, 0x97f6, 0x9817,
+  0x9818, 0x98af, 0x98b1, 0x9903, 0x9905, 0x990c, 0x9909, 0x99c1,
+  0x9aaf, 0x9ab0, 0x9ae6, 0x9b41, 0x9b42, 0x9cf4, 0x9cf6, 0x9cf3,
+  0x9ebc, 0x9f3b, 0x9f4a, 0x5104, 0x5100, 0x50fb, 0x50f5, 0x50f9,
+  0x5102, 0x5108, 0x5109, 0x5105, 0x51dc,
+  /* 0xbc */
+  0x5287, 0x5288, 0x5289, 0x528d, 0x528a, 0x52f0, 0x53b2, 0x562e,
+  0x563b, 0x5639, 0x5632, 0x563f, 0x5634, 0x5629, 0x5653, 0x564e,
+  0x5657, 0x5674, 0x5636, 0x562f, 0x5630, 0x5880, 0x589f, 0x589e,
+  0x58b3, 0x589c, 0x58ae, 0x58a9, 0x58a6, 0x596d, 0x5b09, 0x5afb,
+  0x5b0b, 0x5af5, 0x5b0c, 0x5b08, 0x5bee, 0x5bec, 0x5be9, 0x5beb,
+  0x5c64, 0x5c65, 0x5d9d, 0x5d94, 0x5e62, 0x5e5f, 0x5e61, 0x5ee2,
+  0x5eda, 0x5edf, 0x5edd, 0x5ee3, 0x5ee0, 0x5f48, 0x5f71, 0x5fb7,
+  0x5fb5, 0x6176, 0x6167, 0x616e, 0x615d, 0x6155, 0x6182, 0x617c,
+  0x6170, 0x616b, 0x617e, 0x61a7, 0x6190, 0x61ab, 0x618e, 0x61ac,
+  0x619a, 0x61a4, 0x6194, 0x61ae, 0x622e, 0x6469, 0x646f, 0x6479,
+  0x649e, 0x64b2, 0x6488, 0x6490, 0x64b0, 0x64a5, 0x6493, 0x6495,
+  0x64a9, 0x6492, 0x64ae, 0x64ad, 0x64ab, 0x649a, 0x64ac, 0x6499,
+  0x64a2, 0x64b3, 0x6575, 0x6577, 0x6578, 0x66ae, 0x66ab, 0x66b4,
+  0x66b1, 0x6a23, 0x6a1f, 0x69e8, 0x6a01, 0x6a1e, 0x6a19, 0x69fd,
+  0x6a21, 0x6a13, 0x6a0a, 0x69f3, 0x6a02, 0x6a05, 0x69ed, 0x6a11,
+  0x6b50, 0x6b4e, 0x6ba4, 0x6bc5, 0x6bc6, 0x6f3f, 0x6f7c, 0x6f84,
+  0x6f51, 0x6f66, 0x6f54, 0x6f86, 0x6f6d, 0x6f5b, 0x6f78, 0x6f6e,
+  0x6f8e, 0x6f7a, 0x6f70, 0x6f64, 0x6f97, 0x6f58, 0x6ed5, 0x6f6f,
+  0x6f60, 0x6f5f, 0x719f, 0x71ac, 0x71b1, 0x71a8, 0x7256, 0x729b,
+  0x734e, 0x7357, 0x7469, 0x748b, 0x7483,
+  /* 0xbd */
+  0x747e, 0x7480, 0x757f, 0x7620, 0x7629, 0x761f, 0x7624, 0x7626,
+  0x7621, 0x7622, 0x769a, 0x76ba, 0x76e4, 0x778e, 0x7787, 0x778c,
+  0x7791, 0x778b, 0x78cb, 0x78c5, 0x78ba, 0x78ca, 0x78be, 0x78d5,
+  0x78bc, 0x78d0, 0x7a3f, 0x7a3c, 0x7a40, 0x7a3d, 0x7a37, 0x7a3b,
+  0x7aaf, 0x7aae, 0x7bad, 0x7bb1, 0x7bc4, 0x7bb4, 0x7bc6, 0x7bc7,
+  0x7bc1, 0x7ba0, 0x7bcc, 0x7cca, 0x7de0, 0x7df4, 0x7def, 0x7dfb,
+  0x7dd8, 0x7dec, 0x7ddd, 0x7de8, 0x7de3, 0x7dda, 0x7dde, 0x7de9,
+  0x7d9e, 0x7dd9, 0x7df2, 0x7df9, 0x7f75, 0x7f77, 0x7faf, 0x7fe9,
+  0x8026, 0x819b, 0x819c, 0x819d, 0x81a0, 0x819a, 0x8198, 0x8517,
+  0x853d, 0x851a, 0x84ee, 0x852c, 0x852d, 0x8513, 0x8511, 0x8523,
+  0x8521, 0x8514, 0x84ec, 0x8525, 0x84ff, 0x8506, 0x8782, 0x8774,
+  0x8776, 0x8760, 0x8766, 0x8778, 0x8768, 0x8759, 0x8757, 0x874c,
+  0x8753, 0x885b, 0x885d, 0x8910, 0x8907, 0x8912, 0x8913, 0x8915,
+  0x890a, 0x8abc, 0x8ad2, 0x8ac7, 0x8ac4, 0x8a95, 0x8acb, 0x8af8,
+  0x8ab2, 0x8ac9, 0x8ac2, 0x8abf, 0x8ab0, 0x8ad6, 0x8acd, 0x8ab6,
+  0x8ab9, 0x8adb, 0x8c4c, 0x8c4e, 0x8c6c, 0x8ce0, 0x8cde, 0x8ce6,
+  0x8ce4, 0x8cec, 0x8ced, 0x8ce2, 0x8ce3, 0x8cdc, 0x8cea, 0x8ce1,
+  0x8d6d, 0x8d9f, 0x8da3, 0x8e2b, 0x8e10, 0x8e1d, 0x8e22, 0x8e0f,
+  0x8e29, 0x8e1f, 0x8e21, 0x8e1e, 0x8eba, 0x8f1d, 0x8f1b, 0x8f1f,
+  0x8f29, 0x8f26, 0x8f2a, 0x8f1c, 0x8f1e,
+  /* 0xbe */
+  0x8f25, 0x9069, 0x906e, 0x9068, 0x906d, 0x9077, 0x9130, 0x912d,
+  0x9127, 0x9131, 0x9187, 0x9189, 0x918b, 0x9183, 0x92c5, 0x92bb,
+  0x92b7, 0x92ea, 0x92ac, 0x92e4, 0x92c1, 0x92b3, 0x92bc, 0x92d2,
+  0x92c7, 0x92f0, 0x92b2, 0x95ad, 0x95b1, 0x9704, 0x9706, 0x9707,
+  0x9709, 0x9760, 0x978d, 0x978b, 0x978f, 0x9821, 0x982b, 0x981c,
+  0x98b3, 0x990a, 0x9913, 0x9912, 0x9918, 0x99dd, 0x99d0, 0x99df,
+  0x99db, 0x99d1, 0x99d5, 0x99d2, 0x99d9, 0x9ab7, 0x9aee, 0x9aef,
+  0x9b27, 0x9b45, 0x9b44, 0x9b77, 0x9b6f, 0x9d06, 0x9d09, 0x9d03,
+  0x9ea9, 0x9ebe, 0x9ece, 0x58a8, 0x9f52, 0x5112, 0x5118, 0x5114,
+  0x5110, 0x5115, 0x5180, 0x51aa, 0x51dd, 0x5291, 0x5293, 0x52f3,
+  0x5659, 0x566b, 0x5679, 0x5669, 0x5664, 0x5678, 0x566a, 0x5668,
+  0x5665, 0x5671, 0x566f, 0x566c, 0x5662, 0x5676, 0x58c1, 0x58be,
+  0x58c7, 0x58c5, 0x596e, 0x5b1d, 0x5b34, 0x5b78, 0x5bf0, 0x5c0e,
+  0x5f4a, 0x61b2, 0x6191, 0x61a9, 0x618a, 0x61cd, 0x61b6, 0x61be,
+  0x61ca, 0x61c8, 0x6230, 0x64c5, 0x64c1, 0x64cb, 0x64bb, 0x64bc,
+  0x64da, 0x64c4, 0x64c7, 0x64c2, 0x64cd, 0x64bf, 0x64d2, 0x64d4,
+  0x64be, 0x6574, 0x66c6, 0x66c9, 0x66b9, 0x66c4, 0x66c7, 0x66b8,
+  0x6a3d, 0x6a38, 0x6a3a, 0x6a59, 0x6a6b, 0x6a58, 0x6a39, 0x6a44,
+  0x6a62, 0x6a61, 0x6a4b, 0x6a47, 0x6a35, 0x6a5f, 0x6a48, 0x6b59,
+  0x6b77, 0x6c05, 0x6fc2, 0x6fb1, 0x6fa1,
+  /* 0xbf */
+  0x6fc3, 0x6fa4, 0x6fc1, 0x6fa7, 0x6fb3, 0x6fc0, 0x6fb9, 0x6fb6,
+  0x6fa6, 0x6fa0, 0x6fb4, 0x71be, 0x71c9, 0x71d0, 0x71d2, 0x71c8,
+  0x71d5, 0x71b9, 0x71ce, 0x71d9, 0x71dc, 0x71c3, 0x71c4, 0x7368,
+  0x749c, 0x74a3, 0x7498, 0x749f, 0x749e, 0x74e2, 0x750c, 0x750d,
+  0x7634, 0x7638, 0x763a, 0x76e7, 0x76e5, 0x77a0, 0x779e, 0x779f,
+  0x77a5, 0x78e8, 0x78da, 0x78ec, 0x78e7, 0x79a6, 0x7a4d, 0x7a4e,
+  0x7a46, 0x7a4c, 0x7a4b, 0x7aba, 0x7bd9, 0x7c11, 0x7bc9, 0x7be4,
+  0x7bdb, 0x7be1, 0x7be9, 0x7be6, 0x7cd5, 0x7cd6, 0x7e0a, 0x7e11,
+  0x7e08, 0x7e1b, 0x7e23, 0x7e1e, 0x7e1d, 0x7e09, 0x7e10, 0x7f79,
+  0x7fb2, 0x7ff0, 0x7ff1, 0x7fee, 0x8028, 0x81b3, 0x81a9, 0x81a8,
+  0x81fb, 0x8208, 0x8258, 0x8259, 0x854a, 0x8559, 0x8548, 0x8568,
+  0x8569, 0x8543, 0x8549, 0x856d, 0x856a, 0x855e, 0x8783, 0x879f,
+  0x879e, 0x87a2, 0x878d, 0x8861, 0x892a, 0x8932, 0x8925, 0x892b,
+  0x8921, 0x89aa, 0x89a6, 0x8ae6, 0x8afa, 0x8aeb, 0x8af1, 0x8b00,
+  0x8adc, 0x8ae7, 0x8aee, 0x8afe, 0x8b01, 0x8b02, 0x8af7, 0x8aed,
+  0x8af3, 0x8af6, 0x8afc, 0x8c6b, 0x8c6d, 0x8c93, 0x8cf4, 0x8e44,
+  0x8e31, 0x8e34, 0x8e42, 0x8e39, 0x8e35, 0x8f3b, 0x8f2f, 0x8f38,
+  0x8f33, 0x8fa8, 0x8fa6, 0x9075, 0x9074, 0x9078, 0x9072, 0x907c,
+  0x907a, 0x9134, 0x9192, 0x9320, 0x9336, 0x92f8, 0x9333, 0x932f,
+  0x9322, 0x92fc, 0x932b, 0x9304, 0x931a,
+  /* 0xc0 */
+  0x9310, 0x9326, 0x9321, 0x9315, 0x932e, 0x9319, 0x95bb, 0x96a7,
+  0x96a8, 0x96aa, 0x96d5, 0x970e, 0x9711, 0x9716, 0x970d, 0x9713,
+  0x970f, 0x975b, 0x975c, 0x9766, 0x9798, 0x9830, 0x9838, 0x983b,
+  0x9837, 0x982d, 0x9839, 0x9824, 0x9910, 0x9928, 0x991e, 0x991b,
+  0x9921, 0x991a, 0x99ed, 0x99e2, 0x99f1, 0x9ab8, 0x9abc, 0x9afb,
+  0x9aed, 0x9b28, 0x9b91, 0x9d15, 0x9d23, 0x9d26, 0x9d28, 0x9d12,
+  0x9d1b, 0x9ed8, 0x9ed4, 0x9f8d, 0x9f9c, 0x512a, 0x511f, 0x5121,
+  0x5132, 0x52f5, 0x568e, 0x5680, 0x5690, 0x5685, 0x5687, 0x568f,
+  0x58d5, 0x58d3, 0x58d1, 0x58ce, 0x5b30, 0x5b2a, 0x5b24, 0x5b7a,
+  0x5c37, 0x5c68, 0x5dbc, 0x5dba, 0x5dbd, 0x5db8, 0x5e6b, 0x5f4c,
+  0x5fbd, 0x61c9, 0x61c2, 0x61c7, 0x61e6, 0x61cb, 0x6232, 0x6234,
+  0x64ce, 0x64ca, 0x64d8, 0x64e0, 0x64f0, 0x64e6, 0x64ec, 0x64f1,
+  0x64e2, 0x64ed, 0x6582, 0x6583, 0x66d9, 0x66d6, 0x6a80, 0x6a94,
+  0x6a84, 0x6aa2, 0x6a9c, 0x6adb, 0x6aa3, 0x6a7e, 0x6a97, 0x6a90,
+  0x6aa0, 0x6b5c, 0x6bae, 0x6bda, 0x6c08, 0x6fd8, 0x6ff1, 0x6fdf,
+  0x6fe0, 0x6fdb, 0x6fe4, 0x6feb, 0x6fef, 0x6f80, 0x6fec, 0x6fe1,
+  0x6fe9, 0x6fd5, 0x6fee, 0x6ff0, 0x71e7, 0x71df, 0x71ee, 0x71e6,
+  0x71e5, 0x71ed, 0x71ec, 0x71f4, 0x71e0, 0x7235, 0x7246, 0x7370,
+  0x7372, 0x74a9, 0x74b0, 0x74a6, 0x74a8, 0x7646, 0x7642, 0x764c,
+  0x76ea, 0x77b3, 0x77aa, 0x77b0, 0x77ac,
+  /* 0xc1 */
+  0x77a7, 0x77ad, 0x77ef, 0x78f7, 0x78fa, 0x78f4, 0x78ef, 0x7901,
+  0x79a7, 0x79aa, 0x7a57, 0x7abf, 0x7c07, 0x7c0d, 0x7bfe, 0x7bf7,
+  0x7c0c, 0x7be0, 0x7ce0, 0x7cdc, 0x7cde, 0x7ce2, 0x7cdf, 0x7cd9,
+  0x7cdd, 0x7e2e, 0x7e3e, 0x7e46, 0x7e37, 0x7e32, 0x7e43, 0x7e2b,
+  0x7e3d, 0x7e31, 0x7e45, 0x7e41, 0x7e34, 0x7e39, 0x7e48, 0x7e35,
+  0x7e3f, 0x7e2f, 0x7f44, 0x7ff3, 0x7ffc, 0x8071, 0x8072, 0x8070,
+  0x806f, 0x8073, 0x81c6, 0x81c3, 0x81ba, 0x81c2, 0x81c0, 0x81bf,
+  0x81bd, 0x81c9, 0x81be, 0x81e8, 0x8209, 0x8271, 0x85aa, 0x8584,
+  0x857e, 0x859c, 0x8591, 0x8594, 0x85af, 0x859b, 0x8587, 0x85a8,
+  0x858a, 0x8667, 0x87c0, 0x87d1, 0x87b3, 0x87d2, 0x87c6, 0x87ab,
+  0x87bb, 0x87ba, 0x87c8, 0x87cb, 0x893b, 0x8936, 0x8944, 0x8938,
+  0x893d, 0x89ac, 0x8b0e, 0x8b17, 0x8b19, 0x8b1b, 0x8b0a, 0x8b20,
+  0x8b1d, 0x8b04, 0x8b10, 0x8c41, 0x8c3f, 0x8c73, 0x8cfa, 0x8cfd,
+  0x8cfc, 0x8cf8, 0x8cfb, 0x8da8, 0x8e49, 0x8e4b, 0x8e48, 0x8e4a,
+  0x8f44, 0x8f3e, 0x8f42, 0x8f45, 0x8f3f, 0x907f, 0x907d, 0x9084,
+  0x9081, 0x9082, 0x9080, 0x9139, 0x91a3, 0x919e, 0x919c, 0x934d,
+  0x9382, 0x9328, 0x9375, 0x934a, 0x9365, 0x934b, 0x9318, 0x937e,
+  0x936c, 0x935b, 0x9370, 0x935a, 0x9354, 0x95ca, 0x95cb, 0x95cc,
+  0x95c8, 0x95c6, 0x96b1, 0x96b8, 0x96d6, 0x971c, 0x971e, 0x97a0,
+  0x97d3, 0x9846, 0x98b6, 0x9935, 0x9a01,
+  /* 0xc2 */
+  0x99ff, 0x9bae, 0x9bab, 0x9baa, 0x9bad, 0x9d3b, 0x9d3f, 0x9e8b,
+  0x9ecf, 0x9ede, 0x9edc, 0x9edd, 0x9edb, 0x9f3e, 0x9f4b, 0x53e2,
+  0x5695, 0x56ae, 0x58d9, 0x58d8, 0x5b38, 0x5f5d, 0x61e3, 0x6233,
+  0x64f4, 0x64f2, 0x64fe, 0x6506, 0x64fa, 0x64fb, 0x64f7, 0x65b7,
+  0x66dc, 0x6726, 0x6ab3, 0x6aac, 0x6ac3, 0x6abb, 0x6ab8, 0x6ac2,
+  0x6aae, 0x6aaf, 0x6b5f, 0x6b78, 0x6baf, 0x7009, 0x700b, 0x6ffe,
+  0x7006, 0x6ffa, 0x7011, 0x700f, 0x71fb, 0x71fc, 0x71fe, 0x71f8,
+  0x7377, 0x7375, 0x74a7, 0x74bf, 0x7515, 0x7656, 0x7658, 0x7652,
+  0x77bd, 0x77bf, 0x77bb, 0x77bc, 0x790e, 0x79ae, 0x7a61, 0x7a62,
+  0x7a60, 0x7ac4, 0x7ac5, 0x7c2b, 0x7c27, 0x7c2a, 0x7c1e, 0x7c23,
+  0x7c21, 0x7ce7, 0x7e54, 0x7e55, 0x7e5e, 0x7e5a, 0x7e61, 0x7e52,
+  0x7e59, 0x7f48, 0x7ff9, 0x7ffb, 0x8077, 0x8076, 0x81cd, 0x81cf,
+  0x820a, 0x85cf, 0x85a9, 0x85cd, 0x85d0, 0x85c9, 0x85b0, 0x85ba,
+  0x85b9, 0x85a6, 0x87ef, 0x87ec, 0x87f2, 0x87e0, 0x8986, 0x89b2,
+  0x89f4, 0x8b28, 0x8b39, 0x8b2c, 0x8b2b, 0x8c50, 0x8d05, 0x8e59,
+  0x8e63, 0x8e66, 0x8e64, 0x8e5f, 0x8e55, 0x8ec0, 0x8f49, 0x8f4d,
+  0x9087, 0x9083, 0x9088, 0x91ab, 0x91ac, 0x91d0, 0x9394, 0x938a,
+  0x9396, 0x93a2, 0x93b3, 0x93ae, 0x93ac, 0x93b0, 0x9398, 0x939a,
+  0x9397, 0x95d4, 0x95d6, 0x95d0, 0x95d5, 0x96e2, 0x96dc, 0x96d9,
+  0x96db, 0x96de, 0x9724, 0x97a3, 0x97a6,
+  /* 0xc3 */
+  0x97ad, 0x97f9, 0x984d, 0x984f, 0x984c, 0x984e, 0x9853, 0x98ba,
+  0x993e, 0x993f, 0x993d, 0x992e, 0x99a5, 0x9a0e, 0x9ac1, 0x9b03,
+  0x9b06, 0x9b4f, 0x9b4e, 0x9b4d, 0x9bca, 0x9bc9, 0x9bfd, 0x9bc8,
+  0x9bc0, 0x9d51, 0x9d5d, 0x9d60, 0x9ee0, 0x9f15, 0x9f2c, 0x5133,
+  0x56a5, 0x58de, 0x58df, 0x58e2, 0x5bf5, 0x9f90, 0x5eec, 0x61f2,
+  0x61f7, 0x61f6, 0x61f5, 0x6500, 0x650f, 0x66e0, 0x66dd, 0x6ae5,
+  0x6add, 0x6ada, 0x6ad3, 0x701b, 0x701f, 0x7028, 0x701a, 0x701d,
+  0x7015, 0x7018, 0x7206, 0x720d, 0x7258, 0x72a2, 0x7378, 0x737a,
+  0x74bd, 0x74ca, 0x74e3, 0x7587, 0x7586, 0x765f, 0x7661, 0x77c7,
+  0x7919, 0x79b1, 0x7a6b, 0x7a69, 0x7c3e, 0x7c3f, 0x7c38, 0x7c3d,
+  0x7c37, 0x7c40, 0x7e6b, 0x7e6d, 0x7e79, 0x7e69, 0x7e6a, 0x7f85,
+  0x7e73, 0x7fb6, 0x7fb9, 0x7fb8, 0x81d8, 0x85e9, 0x85dd, 0x85ea,
+  0x85d5, 0x85e4, 0x85e5, 0x85f7, 0x87fb, 0x8805, 0x880d, 0x87f9,
+  0x87fe, 0x8960, 0x895f, 0x8956, 0x895e, 0x8b41, 0x8b5c, 0x8b58,
+  0x8b49, 0x8b5a, 0x8b4e, 0x8b4f, 0x8b46, 0x8b59, 0x8d08, 0x8d0a,
+  0x8e7c, 0x8e72, 0x8e87, 0x8e76, 0x8e6c, 0x8e7a, 0x8e74, 0x8f54,
+  0x8f4e, 0x8fad, 0x908a, 0x908b, 0x91b1, 0x91ae, 0x93e1, 0x93d1,
+  0x93df, 0x93c3, 0x93c8, 0x93dc, 0x93dd, 0x93d6, 0x93e2, 0x93cd,
+  0x93d8, 0x93e4, 0x93d7, 0x93e8, 0x95dc, 0x96b4, 0x96e3, 0x972a,
+  0x9727, 0x9761, 0x97dc, 0x97fb, 0x985e,
+  /* 0xc4 */
+  0x9858, 0x985b, 0x98bc, 0x9945, 0x9949, 0x9a16, 0x9a19, 0x9b0d,
+  0x9be8, 0x9be7, 0x9bd6, 0x9bdb, 0x9d89, 0x9d61, 0x9d72, 0x9d6a,
+  0x9d6c, 0x9e92, 0x9e97, 0x9e93, 0x9eb4, 0x52f8, 0x56a8, 0x56b7,
+  0x56b6, 0x56b4, 0x56bc, 0x58e4, 0x5b40, 0x5b43, 0x5b7d, 0x5bf6,
+  0x5dc9, 0x61f8, 0x61fa, 0x6518, 0x6514, 0x6519, 0x66e6, 0x6727,
+  0x6aec, 0x703e, 0x7030, 0x7032, 0x7210, 0x737b, 0x74cf, 0x7662,
+  0x7665, 0x7926, 0x792a, 0x792c, 0x792b, 0x7ac7, 0x7af6, 0x7c4c,
+  0x7c43, 0x7c4d, 0x7cef, 0x7cf0, 0x8fae, 0x7e7d, 0x7e7c, 0x7e82,
+  0x7f4c, 0x8000, 0x81da, 0x8266, 0x85fb, 0x85f9, 0x8611, 0x85fa,
+  0x8606, 0x860b, 0x8607, 0x860a, 0x8814, 0x8815, 0x8964, 0x89ba,
+  0x89f8, 0x8b70, 0x8b6c, 0x8b66, 0x8b6f, 0x8b5f, 0x8b6b, 0x8d0f,
+  0x8d0d, 0x8e89, 0x8e81, 0x8e85, 0x8e82, 0x91b4, 0x91cb, 0x9418,
+  0x9403, 0x93fd, 0x95e1, 0x9730, 0x98c4, 0x9952, 0x9951, 0x99a8,
+  0x9a2b, 0x9a30, 0x9a37, 0x9a35, 0x9c13, 0x9c0d, 0x9e79, 0x9eb5,
+  0x9ee8, 0x9f2f, 0x9f5f, 0x9f63, 0x9f61, 0x5137, 0x5138, 0x56c1,
+  0x56c0, 0x56c2, 0x5914, 0x5c6c, 0x5dcd, 0x61fc, 0x61fe, 0x651d,
+  0x651c, 0x6595, 0x66e9, 0x6afb, 0x6b04, 0x6afa, 0x6bb2, 0x704c,
+  0x721b, 0x72a7, 0x74d6, 0x74d4, 0x7669, 0x77d3, 0x7c50, 0x7e8f,
+  0x7e8c, 0x7fbc, 0x8617, 0x862d, 0x861a, 0x8823, 0x8822, 0x8821,
+  0x881f, 0x896a, 0x896c, 0x89bd, 0x8b74,
+  /* 0xc5 */
+  0x8b77, 0x8b7d, 0x8d13, 0x8e8a, 0x8e8d, 0x8e8b, 0x8f5f, 0x8faf,
+  0x91ba, 0x942e, 0x9433, 0x9435, 0x943a, 0x9438, 0x9432, 0x942b,
+  0x95e2, 0x9738, 0x9739, 0x9732, 0x97ff, 0x9867, 0x9865, 0x9957,
+  0x9a45, 0x9a43, 0x9a40, 0x9a3e, 0x9acf, 0x9b54, 0x9b51, 0x9c2d,
+  0x9c25, 0x9daf, 0x9db4, 0x9dc2, 0x9db8, 0x9e9d, 0x9eef, 0x9f19,
+  0x9f5c, 0x9f66, 0x9f67, 0x513c, 0x513b, 0x56c8, 0x56ca, 0x56c9,
+  0x5b7f, 0x5dd4, 0x5dd2, 0x5f4e, 0x61ff, 0x6524, 0x6b0a, 0x6b61,
+  0x7051, 0x7058, 0x7380, 0x74e4, 0x758a, 0x766e, 0x766c, 0x79b3,
+  0x7c60, 0x7c5f, 0x807e, 0x807d, 0x81df, 0x8972, 0x896f, 0x89fc,
+  0x8b80, 0x8d16, 0x8d17, 0x8e91, 0x8e93, 0x8f61, 0x9148, 0x9444,
+  0x9451, 0x9452, 0x973d, 0x973e, 0x97c3, 0x97c1, 0x986b, 0x9955,
+  0x9a55, 0x9a4d, 0x9ad2, 0x9b1a, 0x9c49, 0x9c31, 0x9c3e, 0x9c3b,
+  0x9dd3, 0x9dd7, 0x9f34, 0x9f6c, 0x9f6a, 0x9f94, 0x56cc, 0x5dd6,
+  0x6200, 0x6523, 0x652b, 0x652a, 0x66ec, 0x6b10, 0x74da, 0x7aca,
+  0x7c64, 0x7c63, 0x7c65, 0x7e93, 0x7e96, 0x7e94, 0x81e2, 0x8638,
+  0x863f, 0x8831, 0x8b8a, 0x9090, 0x908f, 0x9463, 0x9460, 0x9464,
+  0x9768, 0x986f, 0x995c, 0x9a5a, 0x9a5b, 0x9a57, 0x9ad3, 0x9ad4,
+  0x9ad1, 0x9c54, 0x9c57, 0x9c56, 0x9de5, 0x9e9f, 0x9ef4, 0x56d1,
+  0x58e9, 0x652c, 0x705e, 0x7671, 0x7672, 0x77d7, 0x7f50, 0x7f88,
+  0x8836, 0x8839, 0x8862, 0x8b93, 0x8b92,
+  /* 0xc6 */
+  0x8b96, 0x8277, 0x8d1b, 0x91c0, 0x946a, 0x9742, 0x9748, 0x9744,
+  0x97c6, 0x9870, 0x9a5f, 0x9b22, 0x9b58, 0x9c5f, 0x9df9, 0x9dfa,
+  0x9e7c, 0x9e7d, 0x9f07, 0x9f77, 0x9f72, 0x5ef3, 0x6b16, 0x7063,
+  0x7c6c, 0x7c6e, 0x883b, 0x89c0, 0x8ea1, 0x91c1, 0x9472, 0x9470,
+  0x9871, 0x995e, 0x9ad6, 0x9b23, 0x9ecc, 0x7064, 0x77da, 0x8b9a,
+  0x9477, 0x97c9, 0x9a62, 0x9a65, 0x7e9c, 0x8b9c, 0x8eaa, 0x91c5,
+  0x947d, 0x947e, 0x947c, 0x9c77, 0x9c78, 0x9ef7, 0x8c54, 0x947f,
+  0x9e1a, 0x7228, 0x9a6a, 0x9b31, 0x9e1b, 0x9e1e, 0x7c72, 0x2460,
+  0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468,
+  0x2469, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247a,
+  0x247b, 0x247c, 0x247d, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174,
+  0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x4e36, 0x4e3f, 0x4e85,
+  0x4ea0, 0x5182, 0x5196, 0x51ab, 0x52f9, 0x5338, 0x5369, 0x53b6,
+  0x590a, 0x5b80, 0x5ddb, 0x2f33, 0x5e7f, 0xf6df, 0x5f50, 0x5f61,
+  0x6534, 0xf6e3, 0x7592, 0xf6e5, 0x8fb5, 0xf6e7, 0x00a8, 0x02c6,
+  0x30fd, 0x30fe, 0x309d, 0x309e, 0xf6ee, 0xf6ef, 0x3005, 0x3006,
+  0x3007, 0x30fc, 0xff3b, 0xff3d, 0x273d, 0x3041, 0x3042, 0x3043,
+  0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304a, 0x304b,
+  0x304c, 0x304d, 0x304e, 0x304f, 0x3050, 0x3051, 0x3052, 0x3053,
+  0x3054, 0x3055, 0x3056, 0x3057, 0x3058,
+  /* 0xc7 */
+  0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f, 0x3060,
+  0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068,
+  0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070,
+  0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078,
+  0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x307f, 0x3080,
+  0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088,
+  0x3089, 0x308a, 0x308b, 0x308c, 0x308d, 0x308e, 0x308f, 0x3090,
+  0x3091, 0x3092, 0x3093, 0x30a1, 0x30a2, 0x30a3, 0x30a4, 0x30a5,
+  0x30a6, 0x30a7, 0x30a8, 0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad,
+  0x30ae, 0x30af, 0x30b0, 0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5,
+  0x30b6, 0x30b7, 0x30b8, 0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd,
+  0x30be, 0x30bf, 0x30c0, 0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5,
+  0x30c6, 0x30c7, 0x30c8, 0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd,
+  0x30ce, 0x30cf, 0x30d0, 0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5,
+  0x30d6, 0x30d7, 0x30d8, 0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd,
+  0x30de, 0x30df, 0x30e0, 0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5,
+  0x30e6, 0x30e7, 0x30e8, 0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed,
+  0x30ee, 0x30ef, 0x30f0, 0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5,
+  0x30f6, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401,
+  0x0416, 0x0417, 0x0418, 0x0419, 0x041a,
+  /* 0xc8 */
+  0x041b, 0x041c, 0x041d, 0x041e, 0x041f, 0x0420, 0x0421, 0x0422,
+  0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a,
+  0x042b, 0x042c, 0x042d, 0x042e, 0x042f, 0x0430, 0x0431, 0x0432,
+  0x0433, 0x0434, 0x0435, 0x0451, 0x0436, 0x0437, 0x0438, 0x0439,
+  0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x0440, 0x0441,
+  0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449,
+  0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, 0x21e7, 0x21b8,
+  0x21b9, 0xf7e5, 0xf7e6, 0x4e5a, 0xf7e8, 0x5202, 0xf7ea, 0xf7eb,
+  0x5188, 0xf7ed, 0xf7ee, 0xf7ef, 0xf7f0, 0xf7f1, 0xf7f2, 0xf7f3,
+  0xf7f4, 0xf7f5, 0xf7f6, 0xf7f7, 0xf7f8, 0xf7f9, 0xf7fa, 0xf7fb,
+  0xf7fc, 0xf7fd, 0xf7fe, 0xf7ff, 0xf800, 0xf801, 0xf802, 0xf803,
+  0xf804, 0xf805, 0xf806, 0xf807, 0xf808, 0xf809, 0xf80a, 0xf80b,
+  0xf80c, 0xf80d, 0xf80e, 0xf80f, 0xf810, 0xf811, 0xf812, 0xf813,
+  0xf814, 0xf815, 0xf816, 0xffe2, 0xffe4, 0xff07, 0xff02, 0x3231,
+  0x2116, 0x2121, 0x309b, 0x309c, 0x2e80, 0x2e84, 0x2e86, 0x2e87,
+  0x2e88, 0x2e8a, 0x2e8c, 0x2e8d, 0x2e95, 0x2e9c, 0x2e9d, 0x2ea5,
+  0x2ea7, 0x2eaa, 0x2eac, 0x2eae, 0x2eb6, 0x2ebc, 0x2ebe, 0x2ec6,
+  0x2eca, 0x2ecc, 0x2ecd, 0x2ecf, 0x2ed6, 0x2ed7, 0x2ede, 0x2ee3,
+  0xf83c, 0xf83d, 0xf83e, 0x0283, 0x0250, 0x025b, 0x0254, 0x0275,
+  0x0153, 0x00f8, 0x014b, 0x028a, 0x026a,
+  /* 0xc9 */
+  0x4e42, 0x4e5c, 0x51f5, 0x531a, 0x5382, 0x4e07, 0x4e0c, 0x4e47,
+  0x4e8d, 0x56d7, 0xfa0c, 0x5c6e, 0x5f73, 0x4e0f, 0x5187, 0x4e0e,
+  0x4e2e, 0x4e93, 0x4ec2, 0x4ec9, 0x4ec8, 0x5198, 0x52fc, 0x536c,
+  0x53b9, 0x5720, 0x5903, 0x592c, 0x5c10, 0x5dff, 0x65e1, 0x6bb3,
+  0x6bcc, 0x6c14, 0x723f, 0x4e31, 0x4e3c, 0x4ee8, 0x4edc, 0x4ee9,
+  0x4ee1, 0x4edd, 0x4eda, 0x520c, 0x531c, 0x534c, 0x5722, 0x5723,
+  0x5917, 0x592f, 0x5b81, 0x5b84, 0x5c12, 0x5c3b, 0x5c74, 0x5c73,
+  0x5e04, 0x5e80, 0x5e82, 0x5fc9, 0x6209, 0x6250, 0x6c15, 0x6c36,
+  0x6c43, 0x6c3f, 0x6c3b, 0x72ae, 0x72b0, 0x738a, 0x79b8, 0x808a,
+  0x961e, 0x4f0e, 0x4f18, 0x4f2c, 0x4ef5, 0x4f14, 0x4ef1, 0x4f00,
+  0x4ef7, 0x4f08, 0x4f1d, 0x4f02, 0x4f05, 0x4f22, 0x4f13, 0x4f04,
+  0x4ef4, 0x4f12, 0x51b1, 0x5213, 0x5209, 0x5210, 0x52a6, 0x5322,
+  0x531f, 0x534d, 0x538a, 0x5407, 0x56e1, 0x56df, 0x572e, 0x572a,
+  0x5734, 0x593c, 0x5980, 0x597c, 0x5985, 0x597b, 0x597e, 0x5977,
+  0x597f, 0x5b56, 0x5c15, 0x5c25, 0x5c7c, 0x5c7a, 0x5c7b, 0x5c7e,
+  0x5ddf, 0x5e75, 0x5e84, 0x5f02, 0x5f1a, 0x5f74, 0x5fd5, 0x5fd4,
+  0x5fcf, 0x625c, 0x625e, 0x6264, 0x6261, 0x6266, 0x6262, 0x6259,
+  0x6260, 0x625a, 0x6265, 0x65ef, 0x65ee, 0x673e, 0x6739, 0x6738,
+  0x673b, 0x673a, 0x673f, 0x673c, 0x6733, 0x6c18, 0x6c46, 0x6c52,
+  0x6c5c, 0x6c4f, 0x6c4a, 0x6c54, 0x6c4b,
+  /* 0xca */
+  0x6c4c, 0x7071, 0x725e, 0x72b4, 0x72b5, 0x738e, 0x752a, 0x767f,
+  0x7a75, 0x7f51, 0x8278, 0x827c, 0x8280, 0x827d, 0x827f, 0x864d,
+  0x897e, 0x9099, 0x9097, 0x9098, 0x909b, 0x9094, 0x9622, 0x9624,
+  0x9620, 0x9623, 0x4f56, 0x4f3b, 0x4f62, 0x4f49, 0x4f53, 0x4f64,
+  0x4f3e, 0x4f67, 0x4f52, 0x4f5f, 0x4f41, 0x4f58, 0x4f2d, 0x4f33,
+  0x4f3f, 0x4f61, 0x518f, 0x51b9, 0x521c, 0x521e, 0x5221, 0x52ad,
+  0x52ae, 0x5309, 0x5363, 0x5372, 0x538e, 0x538f, 0x5430, 0x5437,
+  0x542a, 0x5454, 0x5445, 0x5419, 0x541c, 0x5425, 0x5418, 0x543d,
+  0x544f, 0x5441, 0x5428, 0x5424, 0x5447, 0x56ee, 0x56e7, 0x56e5,
+  0x5741, 0x5745, 0x574c, 0x5749, 0x574b, 0x5752, 0x5906, 0x5940,
+  0x59a6, 0x5998, 0x59a0, 0x5997, 0x598e, 0x59a2, 0x5990, 0x598f,
+  0x59a7, 0x59a1, 0x5b8e, 0x5b92, 0x5c28, 0x5c2a, 0x5c8d, 0x5c8f,
+  0x5c88, 0x5c8b, 0x5c89, 0x5c92, 0x5c8a, 0x5c86, 0x5c93, 0x5c95,
+  0x5de0, 0x5e0a, 0x5e0e, 0x5e8b, 0x5e89, 0x5e8c, 0x5e88, 0x5e8d,
+  0x5f05, 0x5f1d, 0x5f78, 0x5f76, 0x5fd2, 0x5fd1, 0x5fd0, 0x5fed,
+  0x5fe8, 0x5fee, 0x5ff3, 0x5fe1, 0x5fe4, 0x5fe3, 0x5ffa, 0x5fef,
+  0x5ff7, 0x5ffb, 0x6000, 0x5ff4, 0x623a, 0x6283, 0x628c, 0x628e,
+  0x628f, 0x6294, 0x6287, 0x6271, 0x627b, 0x627a, 0x6270, 0x6281,
+  0x6288, 0x6277, 0x627d, 0x6272, 0x6274, 0x6537, 0x65f0, 0x65f4,
+  0x65f3, 0x65f2, 0x65f5, 0x6745, 0x6747,
+  /* 0xcb */
+  0x6759, 0x6755, 0x674c, 0x6748, 0x675d, 0x674d, 0x675a, 0x674b,
+  0x6bd0, 0x6c19, 0x6c1a, 0x6c78, 0x6c67, 0x6c6b, 0x6c84, 0x6c8b,
+  0x6c8f, 0x6c71, 0x6c6f, 0x6c69, 0x6c9a, 0x6c6d, 0x6c87, 0x6c95,
+  0x6c9c, 0x6c66, 0x6c73, 0x6c65, 0x6c7b, 0x6c8e, 0x7074, 0x707a,
+  0x7263, 0x72bf, 0x72bd, 0x72c3, 0x72c6, 0x72c1, 0x72ba, 0x72c5,
+  0x7395, 0x7397, 0x7393, 0x7394, 0x7392, 0x753a, 0x7539, 0x7594,
+  0x7595, 0x7681, 0x793d, 0x8034, 0x8095, 0x8099, 0x8090, 0x8092,
+  0x809c, 0x8290, 0x828f, 0x8285, 0x828e, 0x8291, 0x8293, 0x828a,
+  0x8283, 0x8284, 0x8c78, 0x8fc9, 0x8fbf, 0x909f, 0x90a1, 0x90a5,
+  0x909e, 0x90a7, 0x90a0, 0x9630, 0x9628, 0x962f, 0x962d, 0x4e33,
+  0x4f98, 0x4f7c, 0x4f85, 0x4f7d, 0x4f80, 0x4f87, 0x4f76, 0x4f74,
+  0x4f89, 0x4f84, 0x4f77, 0x4f4c, 0x4f97, 0x4f6a, 0x4f9a, 0x4f79,
+  0x4f81, 0x4f78, 0x4f90, 0x4f9c, 0x4f94, 0x4f9e, 0x4f92, 0x4f82,
+  0x4f95, 0x4f6b, 0x4f6e, 0x519e, 0x51bc, 0x51be, 0x5235, 0x5232,
+  0x5233, 0x5246, 0x5231, 0x52bc, 0x530a, 0x530b, 0x533c, 0x5392,
+  0x5394, 0x5487, 0x547f, 0x5481, 0x5491, 0x5482, 0x5488, 0x546b,
+  0x547a, 0x547e, 0x5465, 0x546c, 0x5474, 0x5466, 0x548d, 0x546f,
+  0x5461, 0x5460, 0x5498, 0x5463, 0x5467, 0x5464, 0x56f7, 0x56f9,
+  0x576f, 0x5772, 0x576d, 0x576b, 0x5771, 0x5770, 0x5776, 0x5780,
+  0x5775, 0x577b, 0x5773, 0x5774, 0x5762,
+  /* 0xcc */
+  0x5768, 0x577d, 0x590c, 0x5945, 0x59b5, 0x59ba, 0x59cf, 0x59ce,
+  0x59b2, 0x59cc, 0x59c1, 0x59b6, 0x59bc, 0x59c3, 0x59d6, 0x59b1,
+  0x59bd, 0x59c0, 0x59c8, 0x59b4, 0x59c7, 0x5b62, 0x5b65, 0x5b93,
+  0x5b95, 0x5c44, 0x5c47, 0x5cae, 0x5ca4, 0x5ca0, 0x5cb5, 0x5caf,
+  0x5ca8, 0x5cac, 0x5c9f, 0x5ca3, 0x5cad, 0x5ca2, 0x5caa, 0x5ca7,
+  0x5c9d, 0x5ca5, 0x5cb6, 0x5cb0, 0x5ca6, 0x5e17, 0x5e14, 0x5e19,
+  0x5f28, 0x5f22, 0x5f23, 0x5f24, 0x5f54, 0x5f82, 0x5f7e, 0x5f7d,
+  0x5fde, 0x5fe5, 0x602d, 0x6026, 0x6019, 0x6032, 0x600b, 0x6034,
+  0x600a, 0x6017, 0x6033, 0x601a, 0x601e, 0x602c, 0x6022, 0x600d,
+  0x6010, 0x602e, 0x6013, 0x6011, 0x600c, 0x6009, 0x601c, 0x6214,
+  0x623d, 0x62ad, 0x62b4, 0x62d1, 0x62be, 0x62aa, 0x62b6, 0x62ca,
+  0x62ae, 0x62b3, 0x62af, 0x62bb, 0x62a9, 0x62b0, 0x62b8, 0x653d,
+  0x65a8, 0x65bb, 0x6609, 0x65fc, 0x6604, 0x6612, 0x6608, 0x65fb,
+  0x6603, 0x660b, 0x660d, 0x6605, 0x65fd, 0x6611, 0x6610, 0x66f6,
+  0x670a, 0x6785, 0x676c, 0x678e, 0x6792, 0x6776, 0x677b, 0x6798,
+  0x6786, 0x6784, 0x6774, 0x678d, 0x678c, 0x677a, 0x679f, 0x6791,
+  0x6799, 0x6783, 0x677d, 0x6781, 0x6778, 0x6779, 0x6794, 0x6b25,
+  0x6b80, 0x6b7e, 0x6bde, 0x6c1d, 0x6c93, 0x6cec, 0x6ceb, 0x6cee,
+  0x6cd9, 0x6cb6, 0x6cd4, 0x6cad, 0x6ce7, 0x6cb7, 0x6cd0, 0x6cc2,
+  0x6cba, 0x6cc3, 0x6cc6, 0x6ced, 0x6cf2,
+  /* 0xcd */
+  0x6cd2, 0x6cdd, 0x6cb4, 0x6c8a, 0x6c9d, 0x6c80, 0x6cde, 0x6cc0,
+  0x6d30, 0x6ccd, 0x6cc7, 0x6cb0, 0x6cf9, 0x6ccf, 0x6ce9, 0x6cd1,
+  0x7094, 0x7098, 0x7085, 0x7093, 0x7086, 0x7084, 0x7091, 0x7096,
+  0x7082, 0x709a, 0x7083, 0x726a, 0x72d6, 0x72cb, 0x72d8, 0x72c9,
+  0x72dc, 0x72d2, 0x72d4, 0x72da, 0x72cc, 0x72d1, 0x73a4, 0x73a1,
+  0x73ad, 0x73a6, 0x73a2, 0x73a0, 0x73ac, 0x739d, 0x74dd, 0x74e8,
+  0x753f, 0x7540, 0x753e, 0x758c, 0x7598, 0x76af, 0x76f3, 0x76f1,
+  0x76f0, 0x76f5, 0x77f8, 0x77fc, 0x77f9, 0x77fb, 0x77fa, 0x77f7,
+  0x7942, 0x793f, 0x79c5, 0x7a78, 0x7a7b, 0x7afb, 0x7c75, 0x7cfd,
+  0x8035, 0x808f, 0x80ae, 0x80a3, 0x80b8, 0x80b5, 0x80ad, 0x8220,
+  0x82a0, 0x82c0, 0x82ab, 0x829a, 0x8298, 0x829b, 0x82b5, 0x82a7,
+  0x82ae, 0x82bc, 0x829e, 0x82ba, 0x82b4, 0x82a8, 0x82a1, 0x82a9,
+  0x82c2, 0x82a4, 0x82c3, 0x82b6, 0x82a2, 0x8670, 0x866f, 0x866d,
+  0x866e, 0x8c56, 0x8fd2, 0x8fcb, 0x8fd3, 0x8fcd, 0x8fd6, 0x8fd5,
+  0x8fd7, 0x90b2, 0x90b4, 0x90af, 0x90b3, 0x90b0, 0x9639, 0x963d,
+  0x963c, 0x963a, 0x9643, 0x4fcd, 0x4fc5, 0x4fd3, 0x4fb2, 0x4fc9,
+  0x4fcb, 0x4fc1, 0x4fd4, 0x4fdc, 0x4fd9, 0x4fbb, 0x4fb3, 0x4fdb,
+  0x4fc7, 0x4fd6, 0x4fba, 0x4fc0, 0x4fb9, 0x4fec, 0x5244, 0x5249,
+  0x52c0, 0x52c2, 0x533d, 0x537c, 0x5397, 0x5396, 0x5399, 0x5398,
+  0x54ba, 0x54a1, 0x54ad, 0x54a5, 0x54cf,
+  /* 0xce */
+  0x54c3, 0x830d, 0x54b7, 0x54ae, 0x54d6, 0x54b6, 0x54c5, 0x54c6,
+  0x54a0, 0x5470, 0x54bc, 0x54a2, 0x54be, 0x5472, 0x54de, 0x54b0,
+  0x57b5, 0x579e, 0x579f, 0x57a4, 0x578c, 0x5797, 0x579d, 0x579b,
+  0x5794, 0x5798, 0x578f, 0x5799, 0x57a5, 0x579a, 0x5795, 0x58f4,
+  0x590d, 0x5953, 0x59e1, 0x59de, 0x59ee, 0x5a00, 0x59f1, 0x59dd,
+  0x59fa, 0x59fd, 0x59fc, 0x59f6, 0x59e4, 0x59f2, 0x59f7, 0x59db,
+  0x59e9, 0x59f3, 0x59f5, 0x59e0, 0x59fe, 0x59f4, 0x59ed, 0x5ba8,
+  0x5c4c, 0x5cd0, 0x5cd8, 0x5ccc, 0x5cd7, 0x5ccb, 0x5cdb, 0x5cde,
+  0x5cda, 0x5cc9, 0x5cc7, 0x5cca, 0x5cd6, 0x5cd3, 0x5cd4, 0x5ccf,
+  0x5cc8, 0x5cc6, 0x5cce, 0x5cdf, 0x5cf8, 0x5df9, 0x5e21, 0x5e22,
+  0x5e23, 0x5e20, 0x5e24, 0x5eb0, 0x5ea4, 0x5ea2, 0x5e9b, 0x5ea3,
+  0x5ea5, 0x5f07, 0x5f2e, 0x5f56, 0x5f86, 0x6037, 0x6039, 0x6054,
+  0x6072, 0x605e, 0x6045, 0x6053, 0x6047, 0x6049, 0x605b, 0x604c,
+  0x6040, 0x6042, 0x605f, 0x6024, 0x6044, 0x6058, 0x6066, 0x606e,
+  0x6242, 0x6243, 0x62cf, 0x630d, 0x630b, 0x62f5, 0x630e, 0x6303,
+  0x62eb, 0x62f9, 0x630f, 0x630c, 0x62f8, 0x62f6, 0x6300, 0x6313,
+  0x6314, 0x62fa, 0x6315, 0x62fb, 0x62f0, 0x6541, 0x6543, 0x65aa,
+  0x65bf, 0x6636, 0x6621, 0x6632, 0x6635, 0x661c, 0x6626, 0x6622,
+  0x6633, 0x662b, 0x663a, 0x661d, 0x6634, 0x6639, 0x662e, 0x670f,
+  0x6710, 0x67c1, 0x67f2, 0x67c8, 0x67ba,
+  /* 0xcf */
+  0x67dc, 0x67bb, 0x67f8, 0x67d8, 0x67c0, 0x67b7, 0x67c5, 0x67eb,
+  0x67e4, 0x67df, 0x67b5, 0x67cd, 0x67b3, 0x67f7, 0x67f6, 0x67ee,
+  0x67e3, 0x67c2, 0x67b9, 0x67ce, 0x67e7, 0x67f0, 0x67b2, 0x67fc,
+  0x67c6, 0x67ed, 0x67cc, 0x67ae, 0x67e6, 0x67db, 0x67fa, 0x67c9,
+  0x67ca, 0x67c3, 0x67ea, 0x67cb, 0x6b28, 0x6b82, 0x6b84, 0x6bb6,
+  0x6bd6, 0x6bd8, 0x6be0, 0x6c20, 0x6c21, 0x6d28, 0x6d34, 0x6d2d,
+  0x6d1f, 0x6d3c, 0x6d3f, 0x6d12, 0x6d0a, 0x6cda, 0x6d33, 0x6d04,
+  0x6d19, 0x6d3a, 0x6d1a, 0x6d11, 0x6d00, 0x6d1d, 0x6d42, 0x6d01,
+  0x6d18, 0x6d37, 0x6d03, 0x6d0f, 0x6d40, 0x6d07, 0x6d20, 0x6d2c,
+  0x6d08, 0x6d22, 0x6d09, 0x6d10, 0x70b7, 0x709f, 0x70be, 0x70b1,
+  0x70b0, 0x70a1, 0x70b4, 0x70b5, 0x70a9, 0x7241, 0x7249, 0x724a,
+  0x726c, 0x7270, 0x7273, 0x726e, 0x72ca, 0x72e4, 0x72e8, 0x72eb,
+  0x72df, 0x72ea, 0x72e6, 0x72e3, 0x7385, 0x73cc, 0x73c2, 0x73c8,
+  0x73c5, 0x73b9, 0x73b6, 0x73b5, 0x73b4, 0x73eb, 0x73bf, 0x73c7,
+  0x73be, 0x73c3, 0x73c6, 0x73b8, 0x73cb, 0x74ec, 0x74ee, 0x752e,
+  0x7547, 0x7548, 0x75a7, 0x75aa, 0x7679, 0x76c4, 0x7708, 0x7703,
+  0x7704, 0x7705, 0x770a, 0x76f7, 0x76fb, 0x76fa, 0x77e7, 0x77e8,
+  0x7806, 0x7811, 0x7812, 0x7805, 0x7810, 0x780f, 0x780e, 0x7809,
+  0x7803, 0x7813, 0x794a, 0x794c, 0x794b, 0x7945, 0x7944, 0x79d5,
+  0x79cd, 0x79cf, 0x79d6, 0x79ce, 0x7a80,
+  /* 0xd0 */
+  0x7a7e, 0x7ad1, 0x7b00, 0x7b01, 0x7c7a, 0x7c78, 0x7c79, 0x7c7f,
+  0x7c80, 0x7c81, 0x7d03, 0x7d08, 0x7d01, 0x7f58, 0x7f91, 0x7f8d,
+  0x7fbe, 0x8007, 0x800e, 0x800f, 0x8014, 0x8037, 0x80d8, 0x80c7,
+  0x80e0, 0x80d1, 0x80c8, 0x80c2, 0x80d0, 0x80c5, 0x80e3, 0x80d9,
+  0x80dc, 0x80ca, 0x80d5, 0x80c9, 0x80cf, 0x80d7, 0x80e6, 0x80cd,
+  0x81ff, 0x8221, 0x8294, 0x82d9, 0x82fe, 0x82f9, 0x8307, 0x82e8,
+  0x8300, 0x82d5, 0x833a, 0x82eb, 0x82d6, 0x82f4, 0x82ec, 0x82e1,
+  0x82f2, 0x82f5, 0x830c, 0x82fb, 0x82f6, 0x82f0, 0x82ea, 0x82e4,
+  0x82e0, 0x82fa, 0x82f3, 0x82ed, 0x8677, 0x8674, 0x867c, 0x8673,
+  0x8841, 0x884e, 0x8867, 0x886a, 0x8869, 0x89d3, 0x8a04, 0x8a07,
+  0x8d72, 0x8fe3, 0x8fe1, 0x8fee, 0x8fe0, 0x90f1, 0x90bd, 0x90bf,
+  0x90d5, 0x90c5, 0x90be, 0x90c7, 0x90cb, 0x90c8, 0x91d4, 0x91d3,
+  0x9654, 0x964f, 0x9651, 0x9653, 0x964a, 0x964e, 0x501e, 0x5005,
+  0x5007, 0x5013, 0x5022, 0x5030, 0x501b, 0x4ff5, 0x4ff4, 0x5033,
+  0x5037, 0x502c, 0x4ff6, 0x4ff7, 0x5017, 0x501c, 0x5020, 0x5027,
+  0x5035, 0x502f, 0x5031, 0x500e, 0x515a, 0x5194, 0x5193, 0x51ca,
+  0x51c4, 0x51c5, 0x51c8, 0x51ce, 0x5261, 0x525a, 0x5252, 0x525e,
+  0x525f, 0x5255, 0x5262, 0x52cd, 0x530e, 0x539e, 0x5526, 0x54e2,
+  0x5517, 0x5512, 0x54e7, 0x54f3, 0x54e4, 0x551a, 0x54ff, 0x5504,
+  0x5508, 0x54eb, 0x5511, 0x5505, 0x54f1,
+  /* 0xd1 */
+  0x550a, 0x54fb, 0x54f7, 0x54f8, 0x54e0, 0x550e, 0x5503, 0x550b,
+  0x5701, 0x5702, 0x57cc, 0x5832, 0x57d5, 0x57d2, 0x57ba, 0x57c6,
+  0x57bd, 0x57bc, 0x57b8, 0x57b6, 0x57bf, 0x57c7, 0x57d0, 0x57b9,
+  0x57c1, 0x590e, 0x594a, 0x5a19, 0x5a16, 0x5a2d, 0x5a2e, 0x5a15,
+  0x5a0f, 0x5a17, 0x5a0a, 0x5a1e, 0x5a33, 0x5b6c, 0x5ba7, 0x5bad,
+  0x5bac, 0x5c03, 0x5c56, 0x5c54, 0x5cec, 0x5cff, 0x5cee, 0x5cf1,
+  0x5cf7, 0x5d00, 0x5cf9, 0x5e29, 0x5e28, 0x5ea8, 0x5eae, 0x5eaa,
+  0x5eac, 0x5f33, 0x5f30, 0x5f67, 0x605d, 0x605a, 0x6067, 0x6041,
+  0x60a2, 0x6088, 0x6080, 0x6092, 0x6081, 0x609d, 0x6083, 0x6095,
+  0x609b, 0x6097, 0x6087, 0x609c, 0x608e, 0x6219, 0x6246, 0x62f2,
+  0x6310, 0x6356, 0x632c, 0x6344, 0x6345, 0x6336, 0x6343, 0x63e4,
+  0x6339, 0x634b, 0x634a, 0x633c, 0x6329, 0x6341, 0x6334, 0x6358,
+  0x6354, 0x6359, 0x632d, 0x6347, 0x6333, 0x635a, 0x6351, 0x6338,
+  0x6357, 0x6340, 0x6348, 0x654a, 0x6546, 0x65c6, 0x65c3, 0x65c4,
+  0x65c2, 0x664a, 0x665f, 0x6647, 0x6651, 0x6712, 0x6713, 0x681f,
+  0x681a, 0x6849, 0x6832, 0x6833, 0x683b, 0x684b, 0x684f, 0x6816,
+  0x6831, 0x681c, 0x6835, 0x682b, 0x682d, 0x682f, 0x684e, 0x6844,
+  0x6834, 0x681d, 0x6812, 0x6814, 0x6826, 0x6828, 0x682e, 0x684d,
+  0x683a, 0x6825, 0x6820, 0x6b2c, 0x6b2f, 0x6b2d, 0x6b31, 0x6b34,
+  0x6b6d, 0x8082, 0x6b88, 0x6be6, 0x6be4,
+  /* 0xd2 */
+  0x6be8, 0x6be3, 0x6be2, 0x6be7, 0x6c25, 0x6d7a, 0x6d63, 0x6d64,
+  0x6d76, 0x6d0d, 0x6d61, 0x6d92, 0x6d58, 0x6d62, 0x6d6d, 0x6d6f,
+  0x6d91, 0x6d8d, 0x6def, 0x6d7f, 0x6d86, 0x6d5e, 0x6d67, 0x6d60,
+  0x6d97, 0x6d70, 0x6d7c, 0x6d5f, 0x6d82, 0x6d98, 0x6d2f, 0x6d68,
+  0x6d8b, 0x6d7e, 0x6d80, 0x6d84, 0x6d16, 0x6d83, 0x6d7b, 0x6d7d,
+  0x6d75, 0x6d90, 0x70dc, 0x70d3, 0x70d1, 0x70dd, 0x70cb, 0x7f39,
+  0x70e2, 0x70d7, 0x70d2, 0x70de, 0x70e0, 0x70d4, 0x70cd, 0x70c5,
+  0x70c6, 0x70c7, 0x70da, 0x70ce, 0x70e1, 0x7242, 0x7278, 0x7277,
+  0x7276, 0x7300, 0x72fa, 0x72f4, 0x72fe, 0x72f6, 0x72f3, 0x72fb,
+  0x7301, 0x73d3, 0x73d9, 0x73e5, 0x73d6, 0x73bc, 0x73e7, 0x73e3,
+  0x73e9, 0x73dc, 0x73d2, 0x73db, 0x73d4, 0x73dd, 0x73da, 0x73d7,
+  0x73d8, 0x73e8, 0x74de, 0x74df, 0x74f4, 0x74f5, 0x7521, 0x755b,
+  0x755f, 0x75b0, 0x75c1, 0x75bb, 0x75c4, 0x75c0, 0x75bf, 0x75b6,
+  0x75ba, 0x768a, 0x76c9, 0x771d, 0x771b, 0x7710, 0x7713, 0x7712,
+  0x7723, 0x7711, 0x7715, 0x7719, 0x771a, 0x7722, 0x7727, 0x7823,
+  0x782c, 0x7822, 0x7835, 0x782f, 0x7828, 0x782e, 0x782b, 0x7821,
+  0x7829, 0x7833, 0x782a, 0x7831, 0x7954, 0x795b, 0x794f, 0x795c,
+  0x7953, 0x7952, 0x7951, 0x79eb, 0x79ec, 0x79e0, 0x79ee, 0x79ed,
+  0x79ea, 0x79dc, 0x79de, 0x79dd, 0x7a86, 0x7a89, 0x7a85, 0x7a8b,
+  0x7a8c, 0x7a8a, 0x7a87, 0x7ad8, 0x7b10,
+  /* 0xd3 */
+  0x7b04, 0x7b13, 0x7b05, 0x7b0f, 0x7b08, 0x7b0a, 0x7b0e, 0x7b09,
+  0x7b12, 0x7c84, 0x7c91, 0x7c8a, 0x7c8c, 0x7c88, 0x7c8d, 0x7c85,
+  0x7d1e, 0x7d1d, 0x7d11, 0x7d0e, 0x7d18, 0x7d16, 0x7d13, 0x7d1f,
+  0x7d12, 0x7d0f, 0x7d0c, 0x7f5c, 0x7f61, 0x7f5e, 0x7f60, 0x7f5d,
+  0x7f5b, 0x7f96, 0x7f92, 0x7fc3, 0x7fc2, 0x7fc0, 0x8016, 0x803e,
+  0x8039, 0x80fa, 0x80f2, 0x80f9, 0x80f5, 0x8101, 0x80fb, 0x8100,
+  0x8201, 0x822f, 0x8225, 0x8333, 0x832d, 0x8344, 0x8319, 0x8351,
+  0x8325, 0x8356, 0x833f, 0x8341, 0x8326, 0x831c, 0x8322, 0x8342,
+  0x834e, 0x831b, 0x832a, 0x8308, 0x833c, 0x834d, 0x8316, 0x8324,
+  0x8320, 0x8337, 0x832f, 0x8329, 0x8347, 0x8345, 0x834c, 0x8353,
+  0x831e, 0x832c, 0x834b, 0x8327, 0x8348, 0x8653, 0x8652, 0x86a2,
+  0x86a8, 0x8696, 0x868d, 0x8691, 0x869e, 0x8687, 0x8697, 0x8686,
+  0x868b, 0x869a, 0x8685, 0x86a5, 0x8699, 0x86a1, 0x86a7, 0x8695,
+  0x8698, 0x868e, 0x869d, 0x8690, 0x8694, 0x8843, 0x8844, 0x886d,
+  0x8875, 0x8876, 0x8872, 0x8880, 0x8871, 0x887f, 0x886f, 0x8883,
+  0x887e, 0x8874, 0x887c, 0x8a12, 0x8c47, 0x8c57, 0x8c7b, 0x8ca4,
+  0x8ca3, 0x8d76, 0x8d78, 0x8db5, 0x8db7, 0x8db6, 0x8ed1, 0x8ed3,
+  0x8ffe, 0x8ff5, 0x9002, 0x8fff, 0x8ffb, 0x9004, 0x8ffc, 0x8ff6,
+  0x90d6, 0x90e0, 0x90d9, 0x90da, 0x90e3, 0x90df, 0x90e5, 0x90d8,
+  0x90db, 0x90d7, 0x90dc, 0x90e4, 0x9150,
+  /* 0xd4 */
+  0x914e, 0x914f, 0x91d5, 0x91e2, 0x91da, 0x965c, 0x965f, 0x96bc,
+  0x98e3, 0x9adf, 0x9b2f, 0x4e7f, 0x5070, 0x506a, 0x5061, 0x505e,
+  0x5060, 0x5053, 0x504b, 0x505d, 0x5072, 0x5048, 0x504d, 0x5041,
+  0x505b, 0x504a, 0x5062, 0x5015, 0x5045, 0x505f, 0x5069, 0x506b,
+  0x5063, 0x5064, 0x5046, 0x5040, 0x506e, 0x5073, 0x5057, 0x5051,
+  0x51d0, 0x526b, 0x526d, 0x526c, 0x526e, 0x52d6, 0x52d3, 0x532d,
+  0x539c, 0x5575, 0x5576, 0x553c, 0x554d, 0x5550, 0x5534, 0x552a,
+  0x5551, 0x5562, 0x5536, 0x5535, 0x5530, 0x5552, 0x5545, 0x550c,
+  0x5532, 0x5565, 0x554e, 0x5539, 0x5548, 0x552d, 0x553b, 0x5540,
+  0x554b, 0x570a, 0x5707, 0x57fb, 0x5814, 0x57e2, 0x57f6, 0x57dc,
+  0x57f4, 0x5800, 0x57ed, 0x57fd, 0x5808, 0x57f8, 0x580b, 0x57f3,
+  0x57cf, 0x5807, 0x57ee, 0x57e3, 0x57f2, 0x57e5, 0x57ec, 0x57e1,
+  0x580e, 0x57fc, 0x5810, 0x57e7, 0x5801, 0x580c, 0x57f1, 0x57e9,
+  0x57f0, 0x580d, 0x5804, 0x595c, 0x5a60, 0x5a58, 0x5a55, 0x5a67,
+  0x5a5e, 0x5a38, 0x5a35, 0x5a6d, 0x5a50, 0x5a5f, 0x5a65, 0x5a6c,
+  0x5a53, 0x5a64, 0x5a57, 0x5a43, 0x5a5d, 0x5a52, 0x5a44, 0x5a5b,
+  0x5a48, 0x5a8e, 0x5a3e, 0x5a4d, 0x5a39, 0x5a4c, 0x5a70, 0x5a69,
+  0x5a47, 0x5a51, 0x5a56, 0x5a42, 0x5a5c, 0x5b72, 0x5b6e, 0x5bc1,
+  0x5bc0, 0x5c59, 0x5d1e, 0x5d0b, 0x5d1d, 0x5d1a, 0x5d20, 0x5d0c,
+  0x5d28, 0x5d0d, 0x5d26, 0x5d25, 0x5d0f,
+  /* 0xd5 */
+  0x5d30, 0x5d12, 0x5d23, 0x5d1f, 0x5d2e, 0x5e3e, 0x5e34, 0x5eb1,
+  0x5eb4, 0x5eb9, 0x5eb2, 0x5eb3, 0x5f36, 0x5f38, 0x5f9b, 0x5f96,
+  0x5f9f, 0x608a, 0x6090, 0x6086, 0x60be, 0x60b0, 0x60ba, 0x60d3,
+  0x60d4, 0x60cf, 0x60e4, 0x60d9, 0x60dd, 0x60c8, 0x60b1, 0x60db,
+  0x60b7, 0x60ca, 0x60bf, 0x60c3, 0x60cd, 0x60c0, 0x6332, 0x6365,
+  0x638a, 0x6382, 0x637d, 0x63bd, 0x639e, 0x63ad, 0x639d, 0x6397,
+  0x63ab, 0x638e, 0x636f, 0x6387, 0x6390, 0x636e, 0x63af, 0x6375,
+  0x639c, 0x636d, 0x63ae, 0x637c, 0x63a4, 0x633b, 0x639f, 0x6378,
+  0x6385, 0x6381, 0x6391, 0x638d, 0x6370, 0x6553, 0x65cd, 0x6665,
+  0x6661, 0x665b, 0x6659, 0x665c, 0x6662, 0x6718, 0x6879, 0x6887,
+  0x6890, 0x689c, 0x686d, 0x686e, 0x68ae, 0x68ab, 0x6956, 0x686f,
+  0x68a3, 0x68ac, 0x68a9, 0x6875, 0x6874, 0x68b2, 0x688f, 0x6877,
+  0x6892, 0x687c, 0x686b, 0x6872, 0x68aa, 0x6880, 0x6871, 0x687e,
+  0x689b, 0x6896, 0x688b, 0x68a0, 0x6889, 0x68a4, 0x6878, 0x687b,
+  0x6891, 0x688c, 0x688a, 0x687d, 0x6b36, 0x6b33, 0x6b37, 0x6b38,
+  0x6b91, 0x6b8f, 0x6b8d, 0x6b8e, 0x6b8c, 0x6c2a, 0x6dc0, 0x6dab,
+  0x6db4, 0x6db3, 0x6e74, 0x6dac, 0x6de9, 0x6de2, 0x6db7, 0x6df6,
+  0x6dd4, 0x6e00, 0x6dc8, 0x6de0, 0x6ddf, 0x6dd6, 0x6dbe, 0x6de5,
+  0x6ddc, 0x6ddd, 0x6ddb, 0x6df4, 0x6dca, 0x6dbd, 0x6ded, 0x6df0,
+  0x6dba, 0x6dd5, 0x6dc2, 0x6dcf, 0x6dc9,
+  /* 0xd6 */
+  0x6dd0, 0x6df2, 0x6dd3, 0x6dfd, 0x6dd7, 0x6dcd, 0x6de3, 0x6dbb,
+  0x70fa, 0x710d, 0x70f7, 0x7117, 0x70f4, 0x710c, 0x70f0, 0x7104,
+  0x70f3, 0x7110, 0x70fc, 0x70ff, 0x7106, 0x7113, 0x7100, 0x70f8,
+  0x70f6, 0x710b, 0x7102, 0x710e, 0x727e, 0x727b, 0x727c, 0x727f,
+  0x731d, 0x7317, 0x7307, 0x7311, 0x7318, 0x730a, 0x7308, 0x72ff,
+  0x730f, 0x731e, 0x7388, 0x73f6, 0x73f8, 0x73f5, 0x7404, 0x7401,
+  0x73fd, 0x7407, 0x7400, 0x73fa, 0x73fc, 0x73ff, 0x740c, 0x740b,
+  0x73f4, 0x7408, 0x7564, 0x7563, 0x75ce, 0x75d2, 0x75cf, 0x75cb,
+  0x75cc, 0x75d1, 0x75d0, 0x768f, 0x7689, 0x76d3, 0x7739, 0x772f,
+  0x772d, 0x7731, 0x7732, 0x7734, 0x7733, 0x773d, 0x7725, 0x773b,
+  0x7735, 0x7848, 0x7852, 0x7849, 0x784d, 0x784a, 0x784c, 0x7826,
+  0x7845, 0x7850, 0x7964, 0x7967, 0x7969, 0x796a, 0x7963, 0x796b,
+  0x7961, 0x79bb, 0x79fa, 0x79f8, 0x79f6, 0x79f7, 0x7a8f, 0x7a94,
+  0x7a90, 0x7b35, 0x7b47, 0x7b34, 0x7b25, 0x7b30, 0x7b22, 0x7b24,
+  0x7b33, 0x7b18, 0x7b2a, 0x7b1d, 0x7b31, 0x7b2b, 0x7b2d, 0x7b2f,
+  0x7b32, 0x7b38, 0x7b1a, 0x7b23, 0x7c94, 0x7c98, 0x7c96, 0x7ca3,
+  0x7d35, 0x7d3d, 0x7d38, 0x7d36, 0x7d3a, 0x7d45, 0x7d2c, 0x7d29,
+  0x7d41, 0x7d47, 0x7d3e, 0x7d3f, 0x7d4a, 0x7d3b, 0x7d28, 0x7f63,
+  0x7f95, 0x7f9c, 0x7f9d, 0x7f9b, 0x7fca, 0x7fcb, 0x7fcd, 0x7fd0,
+  0x7fd1, 0x7fc7, 0x7fcf, 0x7fc9, 0x801f,
+  /* 0xd7 */
+  0x801e, 0x801b, 0x8047, 0x8043, 0x8048, 0x8118, 0x8125, 0x8119,
+  0x811b, 0x812d, 0x811f, 0x812c, 0x811e, 0x8121, 0x8115, 0x8127,
+  0x811d, 0x8122, 0x8211, 0x8238, 0x8233, 0x823a, 0x8234, 0x8232,
+  0x8274, 0x8390, 0x83a3, 0x83a8, 0x838d, 0x837a, 0x8373, 0x83a4,
+  0x8374, 0x838f, 0x8381, 0x8395, 0x8399, 0x8375, 0x8394, 0x83a9,
+  0x837d, 0x8383, 0x838c, 0x839d, 0x839b, 0x83aa, 0x838b, 0x837e,
+  0x83a5, 0x83af, 0x8388, 0x8397, 0x83b0, 0x837f, 0x83a6, 0x8387,
+  0x83ae, 0x8376, 0x839a, 0x8659, 0x8656, 0x86bf, 0x86b7, 0x86c2,
+  0x86c1, 0x86c5, 0x86ba, 0x86b0, 0x86c8, 0x86b9, 0x86b3, 0x86b8,
+  0x86cc, 0x86b4, 0x86bb, 0x86bc, 0x86c3, 0x86bd, 0x86be, 0x8852,
+  0x8889, 0x8895, 0x88a8, 0x88a2, 0x88aa, 0x889a, 0x8891, 0x88a1,
+  0x889f, 0x8898, 0x88a7, 0x8899, 0x889b, 0x8897, 0x88a4, 0x88ac,
+  0x888c, 0x8893, 0x888e, 0x8982, 0x89d6, 0x89d9, 0x89d5, 0x8a30,
+  0x8a27, 0x8a2c, 0x8a1e, 0x8c39, 0x8c3b, 0x8c5c, 0x8c5d, 0x8c7d,
+  0x8ca5, 0x8d7d, 0x8d7b, 0x8d79, 0x8dbc, 0x8dc2, 0x8db9, 0x8dbf,
+  0x8dc1, 0x8ed8, 0x8ede, 0x8edd, 0x8edc, 0x8ed7, 0x8ee0, 0x8ee1,
+  0x9024, 0x900b, 0x9011, 0x901c, 0x900c, 0x9021, 0x90ef, 0x90ea,
+  0x90f0, 0x90f4, 0x90f2, 0x90f3, 0x90d4, 0x90eb, 0x90ec, 0x90e9,
+  0x9156, 0x9158, 0x915a, 0x9153, 0x9155, 0x91ec, 0x91f4, 0x91f1,
+  0x91f3, 0x91f8, 0x91e4, 0x91f9, 0x91ea,
+  /* 0xd8 */
+  0x91eb, 0x91f7, 0x91e8, 0x91ee, 0x957a, 0x9586, 0x9588, 0x967c,
+  0x966d, 0x966b, 0x9671, 0x966f, 0x96bf, 0x976a, 0x9804, 0x98e5,
+  0x9997, 0x509b, 0x5095, 0x5094, 0x509e, 0x508b, 0x50a3, 0x5083,
+  0x508c, 0x508e, 0x509d, 0x5068, 0x509c, 0x5092, 0x5082, 0x5087,
+  0x515f, 0x51d4, 0x5312, 0x5311, 0x53a4, 0x53a7, 0x5591, 0x55a8,
+  0x55a5, 0x55ad, 0x5577, 0x5645, 0x55a2, 0x5593, 0x5588, 0x558f,
+  0x55b5, 0x5581, 0x55a3, 0x5592, 0x55a4, 0x557d, 0x558c, 0x55a6,
+  0x557f, 0x5595, 0x55a1, 0x558e, 0x570c, 0x5829, 0x5837, 0x5819,
+  0x581e, 0x5827, 0x5823, 0x5828, 0x57f5, 0x5848, 0x5825, 0x581c,
+  0x581b, 0x5833, 0x583f, 0x5836, 0x582e, 0x5839, 0x5838, 0x582d,
+  0x582c, 0x583b, 0x5961, 0x5aaf, 0x5a94, 0x5a9f, 0x5a7a, 0x5aa2,
+  0x5a9e, 0x5a78, 0x5aa6, 0x5a7c, 0x5aa5, 0x5aac, 0x5a95, 0x5aae,
+  0x5a37, 0x5a84, 0x5a8a, 0x5a97, 0x5a83, 0x5a8b, 0x5aa9, 0x5a7b,
+  0x5a7d, 0x5a8c, 0x5a9c, 0x5a8f, 0x5a93, 0x5a9d, 0x5bea, 0x5bcd,
+  0x5bcb, 0x5bd4, 0x5bd1, 0x5bca, 0x5bce, 0x5c0c, 0x5c30, 0x5d37,
+  0x5d43, 0x5d6b, 0x5d41, 0x5d4b, 0x5d3f, 0x5d35, 0x5d51, 0x5d4e,
+  0x5d55, 0x5d33, 0x5d3a, 0x5d52, 0x5d3d, 0x5d31, 0x5d59, 0x5d42,
+  0x5d39, 0x5d49, 0x5d38, 0x5d3c, 0x5d32, 0x5d36, 0x5d40, 0x5d45,
+  0x5e44, 0x5e41, 0x5f58, 0x5fa6, 0x5fa5, 0x5fab, 0x60c9, 0x60b9,
+  0x60cc, 0x60e2, 0x60ce, 0x60c4, 0x6114,
+  /* 0xd9 */
+  0x60f2, 0x610a, 0x6116, 0x6105, 0x60f5, 0x6113, 0x60f8, 0x60fc,
+  0x60fe, 0x60c1, 0x6103, 0x6118, 0x611d, 0x6110, 0x60ff, 0x6104,
+  0x610b, 0x624a, 0x6394, 0x63b1, 0x63b0, 0x63ce, 0x63e5, 0x63e8,
+  0x63ef, 0x63c3, 0x649d, 0x63f3, 0x63ca, 0x63e0, 0x63f6, 0x63d5,
+  0x63f2, 0x63f5, 0x6461, 0x63df, 0x63be, 0x63dd, 0x63dc, 0x63c4,
+  0x63d8, 0x63d3, 0x63c2, 0x63c7, 0x63cc, 0x63cb, 0x63c8, 0x63f0,
+  0x63d7, 0x63d9, 0x6532, 0x6567, 0x656a, 0x6564, 0x655c, 0x6568,
+  0x6565, 0x658c, 0x659d, 0x659e, 0x65ae, 0x65d0, 0x65d2, 0x667c,
+  0x666c, 0x667b, 0x6680, 0x6671, 0x6679, 0x666a, 0x6672, 0x6701,
+  0x690c, 0x68d3, 0x6904, 0x68dc, 0x692a, 0x68ec, 0x68ea, 0x68f1,
+  0x690f, 0x68d6, 0x68f7, 0x68eb, 0x68e4, 0x68f6, 0x6913, 0x6910,
+  0x68f3, 0x68e1, 0x6907, 0x68cc, 0x6908, 0x6970, 0x68b4, 0x6911,
+  0x68ef, 0x68c6, 0x6914, 0x68f8, 0x68d0, 0x68fd, 0x68fc, 0x68e8,
+  0x690b, 0x690a, 0x6917, 0x68ce, 0x68c8, 0x68dd, 0x68de, 0x68e6,
+  0x68f4, 0x68d1, 0x6906, 0x68d4, 0x68e9, 0x6915, 0x6925, 0x68c7,
+  0x6b39, 0x6b3b, 0x6b3f, 0x6b3c, 0x6b94, 0x6b97, 0x6b99, 0x6b95,
+  0x6bbd, 0x6bf0, 0x6bf2, 0x6bf3, 0x6c30, 0x6dfc, 0x6e46, 0x6e47,
+  0x6e1f, 0x6e49, 0x6e88, 0x6e3c, 0x6e3d, 0x6e45, 0x6e62, 0x6e2b,
+  0x6e3f, 0x6e41, 0x6e5d, 0x6e73, 0x6e1c, 0x6e33, 0x6e4b, 0x6e40,
+  0x6e51, 0x6e3b, 0x6e03, 0x6e2e, 0x6e5e,
+  /* 0xda */
+  0x6e68, 0x6e5c, 0x6e61, 0x6e31, 0x6e28, 0x6e60, 0x6e71, 0x6e6b,
+  0x6e39, 0x6e22, 0x6e30, 0x6e53, 0x6e65, 0x6e27, 0x6e78, 0x6e64,
+  0x6e77, 0x6e55, 0x6e79, 0x6e52, 0x6e66, 0x6e35, 0x6e36, 0x6e5a,
+  0x7120, 0x711e, 0x712f, 0x70fb, 0x712e, 0x7131, 0x7123, 0x7125,
+  0x7122, 0x7132, 0x711f, 0x7128, 0x713a, 0x711b, 0x724b, 0x725a,
+  0x7288, 0x7289, 0x7286, 0x7285, 0x728b, 0x7312, 0x730b, 0x7330,
+  0x7322, 0x7331, 0x7333, 0x7327, 0x7332, 0x732d, 0x7326, 0x7323,
+  0x7335, 0x730c, 0x742e, 0x742c, 0x7430, 0x742b, 0x7416, 0x741a,
+  0x7421, 0x742d, 0x7431, 0x7424, 0x7423, 0x741d, 0x7429, 0x7420,
+  0x7432, 0x74fb, 0x752f, 0x756f, 0x756c, 0x75e7, 0x75da, 0x75e1,
+  0x75e6, 0x75dd, 0x75df, 0x75e4, 0x75d7, 0x7695, 0x7692, 0x76da,
+  0x7746, 0x7747, 0x7744, 0x774d, 0x7745, 0x774a, 0x774e, 0x774b,
+  0x774c, 0x77de, 0x77ec, 0x7860, 0x7864, 0x7865, 0x785c, 0x786d,
+  0x7871, 0x786a, 0x786e, 0x7870, 0x7869, 0x7868, 0x785e, 0x7862,
+  0x7974, 0x7973, 0x7972, 0x7970, 0x7a02, 0x7a0a, 0x7a03, 0x7a0c,
+  0x7a04, 0x7a99, 0x7ae6, 0x7ae4, 0x7b4a, 0x7b3b, 0x7b44, 0x7b48,
+  0x7b4c, 0x7b4e, 0x7b40, 0x7b58, 0x7b45, 0x7ca2, 0x7c9e, 0x7ca8,
+  0x7ca1, 0x7d58, 0x7d6f, 0x7d63, 0x7d53, 0x7d56, 0x7d67, 0x7d6a,
+  0x7d4f, 0x7d6d, 0x7d5c, 0x7d6b, 0x7d52, 0x7d54, 0x7d69, 0x7d51,
+  0x7d5f, 0x7d4e, 0x7f3e, 0x7f3f, 0x7f65,
+  /* 0xdb */
+  0x7f66, 0x7fa2, 0x7fa0, 0x7fa1, 0x7fd7, 0x8051, 0x804f, 0x8050,
+  0x80fe, 0x80d4, 0x8143, 0x814a, 0x8152, 0x814f, 0x8147, 0x813d,
+  0x814d, 0x813a, 0x81e6, 0x81ee, 0x81f7, 0x81f8, 0x81f9, 0x8204,
+  0x823c, 0x823d, 0x823f, 0x8275, 0x833b, 0x83cf, 0x83f9, 0x8423,
+  0x83c0, 0x83e8, 0x8412, 0x83e7, 0x83e4, 0x83fc, 0x83f6, 0x8410,
+  0x83c6, 0x83c8, 0x83eb, 0x83e3, 0x83bf, 0x8401, 0x83dd, 0x83e5,
+  0x83d8, 0x83ff, 0x83e1, 0x83cb, 0x83ce, 0x83d6, 0x83f5, 0x83c9,
+  0x8409, 0x840f, 0x83de, 0x8411, 0x8406, 0x83c2, 0x83f3, 0x83d5,
+  0x83fa, 0x83c7, 0x83d1, 0x83ea, 0x8413, 0x83c3, 0x83ec, 0x83ee,
+  0x83c4, 0x83fb, 0x83d7, 0x83e2, 0x841b, 0x83db, 0x83fe, 0x86d8,
+  0x86e2, 0x86e6, 0x86d3, 0x86e3, 0x86da, 0x86ea, 0x86dd, 0x86eb,
+  0x86dc, 0x86ec, 0x86e9, 0x86d7, 0x86e8, 0x86d1, 0x8848, 0x8856,
+  0x8855, 0x88ba, 0x88d7, 0x88b9, 0x88b8, 0x88c0, 0x88be, 0x88b6,
+  0x88bc, 0x88b7, 0x88bd, 0x88b2, 0x8901, 0x88c9, 0x8995, 0x8998,
+  0x8997, 0x89dd, 0x89da, 0x89db, 0x8a4e, 0x8a4d, 0x8a39, 0x8a59,
+  0x8a40, 0x8a57, 0x8a58, 0x8a44, 0x8a45, 0x8a52, 0x8a48, 0x8a51,
+  0x8a4a, 0x8a4c, 0x8a4f, 0x8c5f, 0x8c81, 0x8c80, 0x8cba, 0x8cbe,
+  0x8cb0, 0x8cb9, 0x8cb5, 0x8d84, 0x8d80, 0x8d89, 0x8dd8, 0x8dd3,
+  0x8dcd, 0x8dc7, 0x8dd6, 0x8ddc, 0x8dcf, 0x8dd5, 0x8dd9, 0x8dc8,
+  0x8dd7, 0x8dc5, 0x8eef, 0x8ef7, 0x8efa,
+  /* 0xdc */
+  0x8ef9, 0x8ee6, 0x8eee, 0x8ee5, 0x8ef5, 0x8ee7, 0x8ee8, 0x8ef6,
+  0x8eeb, 0x8ef1, 0x8eec, 0x8ef4, 0x8ee9, 0x902d, 0x9034, 0x902f,
+  0x9106, 0x912c, 0x9104, 0x90ff, 0x90fc, 0x9108, 0x90f9, 0x90fb,
+  0x9101, 0x9100, 0x9107, 0x9105, 0x9103, 0x9161, 0x9164, 0x915f,
+  0x9162, 0x9160, 0x9201, 0x920a, 0x9225, 0x9203, 0x921a, 0x9226,
+  0x920f, 0x920c, 0x9200, 0x9212, 0x91ff, 0x91fd, 0x9206, 0x9204,
+  0x9227, 0x9202, 0x921c, 0x9224, 0x9219, 0x9217, 0x9205, 0x9216,
+  0x957b, 0x958d, 0x958c, 0x9590, 0x9687, 0x967e, 0x9688, 0x9689,
+  0x9683, 0x9680, 0x96c2, 0x96c8, 0x96c3, 0x96f1, 0x96f0, 0x976c,
+  0x9770, 0x976e, 0x9807, 0x98a9, 0x98eb, 0x9ce6, 0x9ef9, 0x4e83,
+  0x4e84, 0x4eb6, 0x50bd, 0x50bf, 0x50c6, 0x50ae, 0x50c4, 0x50ca,
+  0x50b4, 0x50c8, 0x50c2, 0x50b0, 0x50c1, 0x50ba, 0x50b1, 0x50cb,
+  0x50c9, 0x50b6, 0x50b8, 0x51d7, 0x527a, 0x5278, 0x527b, 0x527c,
+  0x55c3, 0x55db, 0x55cc, 0x55d0, 0x55cb, 0x55ca, 0x55dd, 0x55c0,
+  0x55d4, 0x55c4, 0x55e9, 0x55bf, 0x55d2, 0x558d, 0x55cf, 0x55d5,
+  0x55e2, 0x55d6, 0x55c8, 0x55f2, 0x55cd, 0x55d9, 0x55c2, 0x5714,
+  0x5853, 0x5868, 0x5864, 0x584f, 0x584d, 0x5849, 0x586f, 0x5855,
+  0x584e, 0x585d, 0x5859, 0x5865, 0x585b, 0x583d, 0x5863, 0x5871,
+  0x58fc, 0x5ac7, 0x5ac4, 0x5acb, 0x5aba, 0x5ab8, 0x5ab1, 0x5ab5,
+  0x5ab0, 0x5abf, 0x5ac8, 0x5abb, 0x5ac6,
+  /* 0xdd */
+  0x5ab7, 0x5ac0, 0x5aca, 0x5ab4, 0x5ab6, 0x5acd, 0x5ab9, 0x5a90,
+  0x5bd6, 0x5bd8, 0x5bd9, 0x5c1f, 0x5c33, 0x5d71, 0x5d63, 0x5d4a,
+  0x5d65, 0x5d72, 0x5d6c, 0x5d5e, 0x5d68, 0x5d67, 0x5d62, 0x5df0,
+  0x5e4f, 0x5e4e, 0x5e4a, 0x5e4d, 0x5e4b, 0x5ec5, 0x5ecc, 0x5ec6,
+  0x5ecb, 0x5ec7, 0x5f40, 0x5faf, 0x5fad, 0x60f7, 0x6149, 0x614a,
+  0x612b, 0x6145, 0x6136, 0x6132, 0x612e, 0x6146, 0x612f, 0x614f,
+  0x6129, 0x6140, 0x6220, 0x9168, 0x6223, 0x6225, 0x6224, 0x63c5,
+  0x63f1, 0x63eb, 0x6410, 0x6412, 0x6409, 0x6420, 0x6424, 0x6433,
+  0x6443, 0x641f, 0x6415, 0x6418, 0x6439, 0x6437, 0x6422, 0x6423,
+  0x640c, 0x6426, 0x6430, 0x6428, 0x6441, 0x6435, 0x642f, 0x640a,
+  0x641a, 0x6440, 0x6425, 0x6427, 0x640b, 0x63e7, 0x641b, 0x642e,
+  0x6421, 0x640e, 0x656f, 0x6592, 0x65d3, 0x6686, 0x668c, 0x6695,
+  0x6690, 0x668b, 0x668a, 0x6699, 0x6694, 0x6678, 0x6720, 0x6966,
+  0x695f, 0x6938, 0x694e, 0x6962, 0x6971, 0x693f, 0x6945, 0x696a,
+  0x6939, 0x6942, 0x6957, 0x6959, 0x697a, 0x6948, 0x6949, 0x6935,
+  0x696c, 0x6933, 0x693d, 0x6965, 0x68f0, 0x6978, 0x6934, 0x6969,
+  0x6940, 0x696f, 0x6944, 0x6976, 0x6958, 0x6941, 0x6974, 0x694c,
+  0x693b, 0x694b, 0x6937, 0x695c, 0x694f, 0x6951, 0x6932, 0x6952,
+  0x692f, 0x697b, 0x693c, 0x6b46, 0x6b45, 0x6b43, 0x6b42, 0x6b48,
+  0x6b41, 0x6b9b, 0xfa0d, 0x6bfb, 0x6bfc,
+  /* 0xde */
+  0x6bf9, 0x6bf7, 0x6bf8, 0x6e9b, 0x6ed6, 0x6ec8, 0x6e8f, 0x6ec0,
+  0x6e9f, 0x6e93, 0x6e94, 0x6ea0, 0x6eb1, 0x6eb9, 0x6ec6, 0x6ed2,
+  0x6ebd, 0x6ec1, 0x6e9e, 0x6ec9, 0x6eb7, 0x6eb0, 0x6ecd, 0x6ea6,
+  0x6ecf, 0x6eb2, 0x6ebe, 0x6ec3, 0x6edc, 0x6ed8, 0x6e99, 0x6e92,
+  0x6e8e, 0x6e8d, 0x6ea4, 0x6ea1, 0x6ebf, 0x6eb3, 0x6ed0, 0x6eca,
+  0x6e97, 0x6eae, 0x6ea3, 0x7147, 0x7154, 0x7152, 0x7163, 0x7160,
+  0x7141, 0x715d, 0x7162, 0x7172, 0x7178, 0x716a, 0x7161, 0x7142,
+  0x7158, 0x7143, 0x714b, 0x7170, 0x715f, 0x7150, 0x7153, 0x7144,
+  0x714d, 0x715a, 0x724f, 0x728d, 0x728c, 0x7291, 0x7290, 0x728e,
+  0x733c, 0x7342, 0x733b, 0x733a, 0x7340, 0x734a, 0x7349, 0x7444,
+  0x744a, 0x744b, 0x7452, 0x7451, 0x7457, 0x7440, 0x744f, 0x7450,
+  0x744e, 0x7442, 0x7446, 0x744d, 0x7454, 0x74e1, 0x74ff, 0x74fe,
+  0x74fd, 0x751d, 0x7579, 0x7577, 0x6983, 0x75ef, 0x760f, 0x7603,
+  0x75f7, 0x75fe, 0x75fc, 0x75f9, 0x75f8, 0x7610, 0x75fb, 0x75f6,
+  0x75ed, 0x75f5, 0x75fd, 0x7699, 0x76b5, 0x76dd, 0x7755, 0x775f,
+  0x7760, 0x7752, 0x7756, 0x775a, 0x7769, 0x7767, 0x7754, 0x7759,
+  0x776d, 0x77e0, 0x7887, 0x789a, 0x7894, 0x788f, 0x7884, 0x7895,
+  0x7885, 0x7886, 0x78a1, 0x7883, 0x7879, 0x7899, 0x7880, 0x7896,
+  0x787b, 0x797c, 0x7982, 0x797d, 0x7979, 0x7a11, 0x7a18, 0x7a19,
+  0x7a12, 0x7a17, 0x7a15, 0x7a22, 0x7a13,
+  /* 0xdf */
+  0x7a1b, 0x7a10, 0x7aa3, 0x7aa2, 0x7a9e, 0x7aeb, 0x7b66, 0x7b64,
+  0x7b6d, 0x7b74, 0x7b69, 0x7b72, 0x7b65, 0x7b73, 0x7b71, 0x7b70,
+  0x7b61, 0x7b78, 0x7b76, 0x7b63, 0x7cb2, 0x7cb4, 0x7caf, 0x7d88,
+  0x7d86, 0x7d80, 0x7d8d, 0x7d7f, 0x7d85, 0x7d7a, 0x7d8e, 0x7d7b,
+  0x7d83, 0x7d7c, 0x7d8c, 0x7d94, 0x7d84, 0x7d7d, 0x7d92, 0x7f6d,
+  0x7f6b, 0x7f67, 0x7f68, 0x7f6c, 0x7fa6, 0x7fa5, 0x7fa7, 0x7fdb,
+  0x7fdc, 0x8021, 0x8164, 0x8160, 0x8177, 0x815c, 0x8169, 0x815b,
+  0x8162, 0x8172, 0x6721, 0x815e, 0x8176, 0x8167, 0x816f, 0x8144,
+  0x8161, 0x821d, 0x8249, 0x8244, 0x8240, 0x8242, 0x8245, 0x84f1,
+  0x843f, 0x8456, 0x8476, 0x8479, 0x848f, 0x848d, 0x8465, 0x8451,
+  0x8440, 0x8486, 0x8467, 0x8430, 0x844d, 0x847d, 0x845a, 0x8459,
+  0x8474, 0x8473, 0x845d, 0x8507, 0x845e, 0x8437, 0x843a, 0x8434,
+  0x847a, 0x8443, 0x8478, 0x8432, 0x8445, 0x8429, 0x83d9, 0x844b,
+  0x842f, 0x8442, 0x842d, 0x845f, 0x8470, 0x8439, 0x844e, 0x844c,
+  0x8452, 0x846f, 0x84c5, 0x848e, 0x843b, 0x8447, 0x8436, 0x8433,
+  0x8468, 0x847e, 0x8444, 0x842b, 0x8460, 0x8454, 0x846e, 0x8450,
+  0x870b, 0x8704, 0x86f7, 0x870c, 0x86fa, 0x86d6, 0x86f5, 0x874d,
+  0x86f8, 0x870e, 0x8709, 0x8701, 0x86f6, 0x870d, 0x8705, 0x88d6,
+  0x88cb, 0x88cd, 0x88ce, 0x88de, 0x88db, 0x88da, 0x88cc, 0x88d0,
+  0x8985, 0x899b, 0x89df, 0x89e5, 0x89e4,
+  /* 0xe0 */
+  0x89e1, 0x89e0, 0x89e2, 0x89dc, 0x89e6, 0x8a76, 0x8a86, 0x8a7f,
+  0x8a61, 0x8a3f, 0x8a77, 0x8a82, 0x8a84, 0x8a75, 0x8a83, 0x8a81,
+  0x8a74, 0x8a7a, 0x8c3c, 0x8c4b, 0x8c4a, 0x8c65, 0x8c64, 0x8c66,
+  0x8c86, 0x8c84, 0x8c85, 0x8ccc, 0x8d68, 0x8d69, 0x8d91, 0x8d8c,
+  0x8d8e, 0x8d8f, 0x8d8d, 0x8d93, 0x8d94, 0x8d90, 0x8d92, 0x8df0,
+  0x8de0, 0x8dec, 0x8df1, 0x8dee, 0x8dd0, 0x8de9, 0x8de3, 0x8de2,
+  0x8de7, 0x8df2, 0x8deb, 0x8df4, 0x8f06, 0x8eff, 0x8f01, 0x8f00,
+  0x8f05, 0x8f07, 0x8f08, 0x8f02, 0x8f0b, 0x9052, 0x903f, 0x9044,
+  0x9049, 0x903d, 0x9110, 0x910d, 0x910f, 0x9111, 0x9116, 0x9114,
+  0x910b, 0x910e, 0x916e, 0x916f, 0x9248, 0x9252, 0x9230, 0x923a,
+  0x9266, 0x9233, 0x9265, 0x925e, 0x9283, 0x922e, 0x924a, 0x9246,
+  0x926d, 0x926c, 0x924f, 0x9260, 0x9267, 0x926f, 0x9236, 0x9261,
+  0x9270, 0x9231, 0x9254, 0x9263, 0x9250, 0x9272, 0x924e, 0x9253,
+  0x924c, 0x9256, 0x9232, 0x959f, 0x959c, 0x959e, 0x959b, 0x9692,
+  0x9693, 0x9691, 0x9697, 0x96ce, 0x96fa, 0x96fd, 0x96f8, 0x96f5,
+  0x9773, 0x9777, 0x9778, 0x9772, 0x980f, 0x980d, 0x980e, 0x98ac,
+  0x98f6, 0x98f9, 0x99af, 0x99b2, 0x99b0, 0x99b5, 0x9aad, 0x9aab,
+  0x9b5b, 0x9cea, 0x9ced, 0x9ce7, 0x9e80, 0x9efd, 0x50e6, 0x50d4,
+  0x50d7, 0x50e8, 0x50f3, 0x50db, 0x50ea, 0x50dd, 0x50e4, 0x50d3,
+  0x50ec, 0x50f0, 0x50ef, 0x50e3, 0x50e0,
+  /* 0xe1 */
+  0x51d8, 0x5280, 0x5281, 0x52e9, 0x52eb, 0x5330, 0x53ac, 0x5627,
+  0x5615, 0x560c, 0x5612, 0x55fc, 0x560f, 0x561c, 0x5601, 0x5613,
+  0x5602, 0x55fa, 0x561d, 0x5604, 0x55ff, 0x55f9, 0x5889, 0x587c,
+  0x5890, 0x5898, 0x5886, 0x5881, 0x587f, 0x5874, 0x588b, 0x587a,
+  0x5887, 0x5891, 0x588e, 0x5876, 0x5882, 0x5888, 0x587b, 0x5894,
+  0x588f, 0x58fe, 0x596b, 0x5adc, 0x5aee, 0x5ae5, 0x5ad5, 0x5aea,
+  0x5ada, 0x5aed, 0x5aeb, 0x5af3, 0x5ae2, 0x5ae0, 0x5adb, 0x5aec,
+  0x5ade, 0x5add, 0x5ad9, 0x5ae8, 0x5adf, 0x5b77, 0x5be0, 0x5be3,
+  0x5c63, 0x5d82, 0x5d80, 0x5d7d, 0x5d86, 0x5d7a, 0x5d81, 0x5d77,
+  0x5d8a, 0x5d89, 0x5d88, 0x5d7e, 0x5d7c, 0x5d8d, 0x5d79, 0x5d7f,
+  0x5e58, 0x5e59, 0x5e53, 0x5ed8, 0x5ed1, 0x5ed7, 0x5ece, 0x5edc,
+  0x5ed5, 0x5ed9, 0x5ed2, 0x5ed4, 0x5f44, 0x5f43, 0x5f6f, 0x5fb6,
+  0x612c, 0x6128, 0x6141, 0x615e, 0x6171, 0x6173, 0x6152, 0x6153,
+  0x6172, 0x616c, 0x6180, 0x6174, 0x6154, 0x617a, 0x615b, 0x6165,
+  0x613b, 0x616a, 0x6161, 0x6156, 0x6229, 0x6227, 0x622b, 0x642b,
+  0x644d, 0x645b, 0x645d, 0x6474, 0x6476, 0x6472, 0x6473, 0x647d,
+  0x6475, 0x6466, 0x64a6, 0x644e, 0x6482, 0x645e, 0x645c, 0x644b,
+  0x6453, 0x6460, 0x6450, 0x647f, 0x643f, 0x646c, 0x646b, 0x6459,
+  0x6465, 0x6477, 0x6573, 0x65a0, 0x66a1, 0x66a0, 0x669f, 0x6705,
+  0x6704, 0x6722, 0x69b1, 0x69b6, 0x69c9,
+  /* 0xe2 */
+  0x69a0, 0x69ce, 0x6996, 0x69b0, 0x69ac, 0x69bc, 0x6991, 0x6999,
+  0x698e, 0x69a7, 0x698d, 0x69a9, 0x69be, 0x69af, 0x69bf, 0x69c4,
+  0x69bd, 0x69a4, 0x69d4, 0x69b9, 0x69ca, 0x699a, 0x69cf, 0x69b3,
+  0x6993, 0x69aa, 0x69a1, 0x699e, 0x69d9, 0x6997, 0x6990, 0x69c2,
+  0x69b5, 0x69a5, 0x69c6, 0x6b4a, 0x6b4d, 0x6b4b, 0x6b9e, 0x6b9f,
+  0x6ba0, 0x6bc3, 0x6bc4, 0x6bfe, 0x6ece, 0x6ef5, 0x6ef1, 0x6f03,
+  0x6f25, 0x6ef8, 0x6f37, 0x6efb, 0x6f2e, 0x6f09, 0x6f4e, 0x6f19,
+  0x6f1a, 0x6f27, 0x6f18, 0x6f3b, 0x6f12, 0x6eed, 0x6f0a, 0x6f36,
+  0x6f73, 0x6ef9, 0x6eee, 0x6f2d, 0x6f40, 0x6f30, 0x6f3c, 0x6f35,
+  0x6eeb, 0x6f07, 0x6f0e, 0x6f43, 0x6f05, 0x6efd, 0x6ef6, 0x6f39,
+  0x6f1c, 0x6efc, 0x6f3a, 0x6f1f, 0x6f0d, 0x6f1e, 0x6f08, 0x6f21,
+  0x7187, 0x7190, 0x7189, 0x7180, 0x7185, 0x7182, 0x718f, 0x717b,
+  0x7186, 0x7181, 0x7197, 0x7244, 0x7253, 0x7297, 0x7295, 0x7293,
+  0x7343, 0x734d, 0x7351, 0x734c, 0x7462, 0x7473, 0x7471, 0x7475,
+  0x7472, 0x7467, 0x746e, 0x7500, 0x7502, 0x7503, 0x757d, 0x7590,
+  0x7616, 0x7608, 0x760c, 0x7615, 0x7611, 0x760a, 0x7614, 0x76b8,
+  0x7781, 0x777c, 0x7785, 0x7782, 0x776e, 0x7780, 0x776f, 0x777e,
+  0x7783, 0x78b2, 0x78aa, 0x78b4, 0x78ad, 0x78a8, 0x787e, 0x78ab,
+  0x789e, 0x78a5, 0x78a0, 0x78ac, 0x78a2, 0x78a4, 0x7998, 0x798a,
+  0x798b, 0x7996, 0x7995, 0x7994, 0x7993,
+  /* 0xe3 */
+  0x7997, 0x7988, 0x7992, 0x7990, 0x7a2b, 0x7a4a, 0x7a30, 0x7a2f,
+  0x7a28, 0x7a26, 0x7aa8, 0x7aab, 0x7aac, 0x7aee, 0x7b88, 0x7b9c,
+  0x7b8a, 0x7b91, 0x7b90, 0x7b96, 0x7b8d, 0x7b8c, 0x7b9b, 0x7b8e,
+  0x7b85, 0x7b98, 0x5284, 0x7b99, 0x7ba4, 0x7b82, 0x7cbb, 0x7cbf,
+  0x7cbc, 0x7cba, 0x7da7, 0x7db7, 0x7dc2, 0x7da3, 0x7daa, 0x7dc1,
+  0x7dc0, 0x7dc5, 0x7d9d, 0x7dce, 0x7dc4, 0x7dc6, 0x7dcb, 0x7dcc,
+  0x7daf, 0x7db9, 0x7d96, 0x7dbc, 0x7d9f, 0x7da6, 0x7dae, 0x7da9,
+  0x7da1, 0x7dc9, 0x7f73, 0x7fe2, 0x7fe3, 0x7fe5, 0x7fde, 0x8024,
+  0x805d, 0x805c, 0x8189, 0x8186, 0x8183, 0x8187, 0x818d, 0x818c,
+  0x818b, 0x8215, 0x8497, 0x84a4, 0x84a1, 0x849f, 0x84ba, 0x84ce,
+  0x84c2, 0x84ac, 0x84ae, 0x84ab, 0x84b9, 0x84b4, 0x84c1, 0x84cd,
+  0x84aa, 0x849a, 0x84b1, 0x84d0, 0x849d, 0x84a7, 0x84bb, 0x84a2,
+  0x8494, 0x84c7, 0x84cc, 0x849b, 0x84a9, 0x84af, 0x84a8, 0x84d6,
+  0x8498, 0x84b6, 0x84cf, 0x84a0, 0x84d7, 0x84d4, 0x84d2, 0x84db,
+  0x84b0, 0x8491, 0x8661, 0x8733, 0x8723, 0x8728, 0x876b, 0x8740,
+  0x872e, 0x871e, 0x8721, 0x8719, 0x871b, 0x8743, 0x872c, 0x8741,
+  0x873e, 0x8746, 0x8720, 0x8732, 0x872a, 0x872d, 0x873c, 0x8712,
+  0x873a, 0x8731, 0x8735, 0x8742, 0x8726, 0x8727, 0x8738, 0x8724,
+  0x871a, 0x8730, 0x8711, 0x88f7, 0x88e7, 0x88f1, 0x88f2, 0x88fa,
+  0x88fe, 0x88ee, 0x88fc, 0x88f6, 0x88fb,
+  /* 0xe4 */
+  0x88f0, 0x88ec, 0x88eb, 0x899d, 0x89a1, 0x899f, 0x899e, 0x89e9,
+  0x89eb, 0x89e8, 0x8aab, 0x8a99, 0x8a8b, 0x8a92, 0x8a8f, 0x8a96,
+  0x8c3d, 0x8c68, 0x8c69, 0x8cd5, 0x8ccf, 0x8cd7, 0x8d96, 0x8e09,
+  0x8e02, 0x8dff, 0x8e0d, 0x8dfd, 0x8e0a, 0x8e03, 0x8e07, 0x8e06,
+  0x8e05, 0x8dfe, 0x8e00, 0x8e04, 0x8f10, 0x8f11, 0x8f0e, 0x8f0d,
+  0x9123, 0x911c, 0x9120, 0x9122, 0x911f, 0x911d, 0x911a, 0x9124,
+  0x9121, 0x911b, 0x917a, 0x9172, 0x9179, 0x9173, 0x92a5, 0x92a4,
+  0x9276, 0x929b, 0x927a, 0x92a0, 0x9294, 0x92aa, 0x928d, 0x92a6,
+  0x929a, 0x92ab, 0x9279, 0x9297, 0x927f, 0x92a3, 0x92ee, 0x928e,
+  0x9282, 0x9295, 0x92a2, 0x927d, 0x9288, 0x92a1, 0x928a, 0x9286,
+  0x928c, 0x9299, 0x92a7, 0x927e, 0x9287, 0x92a9, 0x929d, 0x928b,
+  0x922d, 0x969e, 0x96a1, 0x96ff, 0x9758, 0x977d, 0x977a, 0x977e,
+  0x9783, 0x9780, 0x9782, 0x977b, 0x9784, 0x9781, 0x977f, 0x97ce,
+  0x97cd, 0x9816, 0x98ad, 0x98ae, 0x9902, 0x9900, 0x9907, 0x999d,
+  0x999c, 0x99c3, 0x99b9, 0x99bb, 0x99ba, 0x99c2, 0x99bd, 0x99c7,
+  0x9ab1, 0x9ae3, 0x9ae7, 0x9b3e, 0x9b3f, 0x9b60, 0x9b61, 0x9b5f,
+  0x9cf1, 0x9cf2, 0x9cf5, 0x9ea7, 0x50ff, 0x5103, 0x5130, 0x50f8,
+  0x5106, 0x5107, 0x50f6, 0x50fe, 0x510b, 0x510c, 0x50fd, 0x510a,
+  0x528b, 0x528c, 0x52f1, 0x52ef, 0x5648, 0x5642, 0x564c, 0x5635,
+  0x5641, 0x564a, 0x5649, 0x5646, 0x5658,
+  /* 0xe5 */
+  0x565a, 0x5640, 0x5633, 0x563d, 0x562c, 0x563e, 0x5638, 0x562a,
+  0x563a, 0x571a, 0x58ab, 0x589d, 0x58b1, 0x58a0, 0x58a3, 0x58af,
+  0x58ac, 0x58a5, 0x58a1, 0x58ff, 0x5aff, 0x5af4, 0x5afd, 0x5af7,
+  0x5af6, 0x5b03, 0x5af8, 0x5b02, 0x5af9, 0x5b01, 0x5b07, 0x5b05,
+  0x5b0f, 0x5c67, 0x5d99, 0x5d97, 0x5d9f, 0x5d92, 0x5da2, 0x5d93,
+  0x5d95, 0x5da0, 0x5d9c, 0x5da1, 0x5d9a, 0x5d9e, 0x5e69, 0x5e5d,
+  0x5e60, 0x5e5c, 0x7df3, 0x5edb, 0x5ede, 0x5ee1, 0x5f49, 0x5fb2,
+  0x618b, 0x6183, 0x6179, 0x61b1, 0x61b0, 0x61a2, 0x6189, 0x619b,
+  0x6193, 0x61af, 0x61ad, 0x619f, 0x6192, 0x61aa, 0x61a1, 0x618d,
+  0x6166, 0x61b3, 0x622d, 0x646e, 0x6470, 0x6496, 0x64a0, 0x6485,
+  0x6497, 0x649c, 0x648f, 0x648b, 0x648a, 0x648c, 0x64a3, 0x649f,
+  0x6468, 0x64b1, 0x6498, 0x6576, 0x657a, 0x6579, 0x657b, 0x65b2,
+  0x65b3, 0x66b5, 0x66b0, 0x66a9, 0x66b2, 0x66b7, 0x66aa, 0x66af,
+  0x6a00, 0x6a06, 0x6a17, 0x69e5, 0x69f8, 0x6a15, 0x69f1, 0x69e4,
+  0x6a20, 0x69ff, 0x69ec, 0x69e2, 0x6a1b, 0x6a1d, 0x69fe, 0x6a27,
+  0x69f2, 0x69ee, 0x6a14, 0x69f7, 0x69e7, 0x6a40, 0x6a08, 0x69e6,
+  0x69fb, 0x6a0d, 0x69fc, 0x69eb, 0x6a09, 0x6a04, 0x6a18, 0x6a25,
+  0x6a0f, 0x69f6, 0x6a26, 0x6a07, 0x69f4, 0x6a16, 0x6b51, 0x6ba5,
+  0x6ba3, 0x6ba2, 0x6ba6, 0x6c01, 0x6c00, 0x6bff, 0x6c02, 0x6f41,
+  0x6f26, 0x6f7e, 0x6f87, 0x6fc6, 0x6f92,
+  /* 0xe6 */
+  0x6f8d, 0x6f89, 0x6f8c, 0x6f62, 0x6f4f, 0x6f85, 0x6f5a, 0x6f96,
+  0x6f76, 0x6f6c, 0x6f82, 0x6f55, 0x6f72, 0x6f52, 0x6f50, 0x6f57,
+  0x6f94, 0x6f93, 0x6f5d, 0x6f00, 0x6f61, 0x6f6b, 0x6f7d, 0x6f67,
+  0x6f90, 0x6f53, 0x6f8b, 0x6f69, 0x6f7f, 0x6f95, 0x6f63, 0x6f77,
+  0x6f6a, 0x6f7b, 0x71b2, 0x71af, 0x719b, 0x71b0, 0x71a0, 0x719a,
+  0x71a9, 0x71b5, 0x719d, 0x71a5, 0x719e, 0x71a4, 0x71a1, 0x71aa,
+  0x719c, 0x71a7, 0x71b3, 0x7298, 0x729a, 0x7358, 0x7352, 0x735e,
+  0x735f, 0x7360, 0x735d, 0x735b, 0x7361, 0x735a, 0x7359, 0x7362,
+  0x7487, 0x7489, 0x748a, 0x7486, 0x7481, 0x747d, 0x7485, 0x7488,
+  0x747c, 0x7479, 0x7508, 0x7507, 0x757e, 0x7625, 0x761e, 0x7619,
+  0x761d, 0x761c, 0x7623, 0x761a, 0x7628, 0x761b, 0x769c, 0x769d,
+  0x769e, 0x769b, 0x778d, 0x778f, 0x7789, 0x7788, 0x78cd, 0x78bb,
+  0x78cf, 0x78cc, 0x78d1, 0x78ce, 0x78d4, 0x78c8, 0x78c3, 0x78c4,
+  0x78c9, 0x799a, 0x79a1, 0x79a0, 0x799c, 0x79a2, 0x799b, 0x6b76,
+  0x7a39, 0x7ab2, 0x7ab4, 0x7ab3, 0x7bb7, 0x7bcb, 0x7bbe, 0x7bac,
+  0x7bce, 0x7baf, 0x7bb9, 0x7bca, 0x7bb5, 0x7cc5, 0x7cc8, 0x7ccc,
+  0x7ccb, 0x7df7, 0x7ddb, 0x7dea, 0x7de7, 0x7dd7, 0x7de1, 0x7e03,
+  0x7dfa, 0x7de6, 0x7df6, 0x7df1, 0x7df0, 0x7dee, 0x7ddf, 0x7f76,
+  0x7fac, 0x7fb0, 0x7fad, 0x7fed, 0x7feb, 0x7fea, 0x7fec, 0x7fe6,
+  0x7fe8, 0x8064, 0x8067, 0x81a3, 0x819f,
+  /* 0xe7 */
+  0x819e, 0x8195, 0x81a2, 0x8199, 0x8197, 0x8216, 0x824f, 0x8253,
+  0x8252, 0x8250, 0x824e, 0x8251, 0x8524, 0x853b, 0x850f, 0x8500,
+  0x8529, 0x850e, 0x8509, 0x850d, 0x851f, 0x850a, 0x8527, 0x851c,
+  0x84fb, 0x852b, 0x84fa, 0x8508, 0x850c, 0x84f4, 0x852a, 0x84f2,
+  0x8515, 0x84f7, 0x84eb, 0x84f3, 0x84fc, 0x8512, 0x84ea, 0x84e9,
+  0x8516, 0x84fe, 0x8528, 0x851d, 0x852e, 0x8502, 0x84fd, 0x851e,
+  0x84f6, 0x8531, 0x8526, 0x84e7, 0x84e8, 0x84f0, 0x84ef, 0x84f9,
+  0x8518, 0x8520, 0x8530, 0x850b, 0x8519, 0x852f, 0x8662, 0x8756,
+  0x8763, 0x8764, 0x8777, 0x87e1, 0x8773, 0x8758, 0x8754, 0x875b,
+  0x8752, 0x8761, 0x875a, 0x8751, 0x875e, 0x876d, 0x876a, 0x8750,
+  0x874e, 0x875f, 0x875d, 0x876f, 0x876c, 0x877a, 0x876e, 0x875c,
+  0x8765, 0x874f, 0x877b, 0x8775, 0x8762, 0x8767, 0x8769, 0x885a,
+  0x8905, 0x890c, 0x8914, 0x890b, 0x8917, 0x8918, 0x8919, 0x8906,
+  0x8916, 0x8911, 0x890e, 0x8909, 0x89a2, 0x89a4, 0x89a3, 0x89ed,
+  0x89f0, 0x89ec, 0x8acf, 0x8ac6, 0x8ab8, 0x8ad3, 0x8ad1, 0x8ad4,
+  0x8ad5, 0x8abb, 0x8ad7, 0x8abe, 0x8ac0, 0x8ac5, 0x8ad8, 0x8ac3,
+  0x8aba, 0x8abd, 0x8ad9, 0x8c3e, 0x8c4d, 0x8c8f, 0x8ce5, 0x8cdf,
+  0x8cd9, 0x8ce8, 0x8cda, 0x8cdd, 0x8ce7, 0x8da0, 0x8d9c, 0x8da1,
+  0x8d9b, 0x8e20, 0x8e23, 0x8e25, 0x8e24, 0x8e2e, 0x8e15, 0x8e1b,
+  0x8e16, 0x8e11, 0x8e19, 0x8e26, 0x8e27,
+  /* 0xe8 */
+  0x8e14, 0x8e12, 0x8e18, 0x8e13, 0x8e1c, 0x8e17, 0x8e1a, 0x8f2c,
+  0x8f24, 0x8f18, 0x8f1a, 0x8f20, 0x8f23, 0x8f16, 0x8f17, 0x9073,
+  0x9070, 0x906f, 0x9067, 0x906b, 0x912f, 0x912b, 0x9129, 0x912a,
+  0x9132, 0x9126, 0x912e, 0x9185, 0x9186, 0x918a, 0x9181, 0x9182,
+  0x9184, 0x9180, 0x92d0, 0x92c3, 0x92c4, 0x92c0, 0x92d9, 0x92b6,
+  0x92cf, 0x92f1, 0x92df, 0x92d8, 0x92e9, 0x92d7, 0x92dd, 0x92cc,
+  0x92ef, 0x92c2, 0x92e8, 0x92ca, 0x92c8, 0x92ce, 0x92e6, 0x92cd,
+  0x92d5, 0x92c9, 0x92e0, 0x92de, 0x92e7, 0x92d1, 0x92d3, 0x92b5,
+  0x92e1, 0x92c6, 0x92b4, 0x957c, 0x95ac, 0x95ab, 0x95ae, 0x95b0,
+  0x96a4, 0x96a2, 0x96d3, 0x9705, 0x9708, 0x9702, 0x975a, 0x978a,
+  0x978e, 0x9788, 0x97d0, 0x97cf, 0x981e, 0x981d, 0x9826, 0x9829,
+  0x9828, 0x9820, 0x981b, 0x9827, 0x98b2, 0x9908, 0x98fa, 0x9911,
+  0x9914, 0x9916, 0x9917, 0x9915, 0x99dc, 0x99cd, 0x99cf, 0x99d3,
+  0x99d4, 0x99ce, 0x99c9, 0x99d6, 0x99d8, 0x99cb, 0x99d7, 0x99cc,
+  0x9ab3, 0x9aec, 0x9aeb, 0x9af3, 0x9af2, 0x9af1, 0x9b46, 0x9b43,
+  0x9b67, 0x9b74, 0x9b71, 0x9b66, 0x9b76, 0x9b75, 0x9b70, 0x9b68,
+  0x9b64, 0x9b6c, 0x9cfc, 0x9cfa, 0x9cfd, 0x9cff, 0x9cf7, 0x9d07,
+  0x9d00, 0x9cf9, 0x9cfb, 0x9d08, 0x9d05, 0x9d04, 0x9e83, 0x9ed3,
+  0x9f0f, 0x9f10, 0x511c, 0x5113, 0x5117, 0x511a, 0x5111, 0x51de,
+  0x5334, 0x53e1, 0x5670, 0x5660, 0x566e,
+  /* 0xe9 */
+  0x5673, 0x5666, 0x5663, 0x566d, 0x5672, 0x565e, 0x5677, 0x571c,
+  0x571b, 0x58c8, 0x58bd, 0x58c9, 0x58bf, 0x58ba, 0x58c2, 0x58bc,
+  0x58c6, 0x5b17, 0x5b19, 0x5b1b, 0x5b21, 0x5b14, 0x5b13, 0x5b10,
+  0x5b16, 0x5b28, 0x5b1a, 0x5b20, 0x5b1e, 0x5bef, 0x5dac, 0x5db1,
+  0x5da9, 0x5da7, 0x5db5, 0x5db0, 0x5dae, 0x5daa, 0x5da8, 0x5db2,
+  0x5dad, 0x5daf, 0x5db4, 0x5e67, 0x5e68, 0x5e66, 0x5e6f, 0x5ee9,
+  0x5ee7, 0x5ee6, 0x5ee8, 0x5ee5, 0x5f4b, 0x5fbc, 0x619d, 0x61a8,
+  0x6196, 0x61c5, 0x61b4, 0x61c6, 0x61c1, 0x61cc, 0x61ba, 0x61bf,
+  0x61b8, 0x618c, 0x64d7, 0x64d6, 0x64d0, 0x64cf, 0x64c9, 0x64bd,
+  0x6489, 0x64c3, 0x64db, 0x64f3, 0x64d9, 0x6533, 0x657f, 0x657c,
+  0x65a2, 0x66c8, 0x66be, 0x66c0, 0x66ca, 0x66cb, 0x66cf, 0x66bd,
+  0x66bb, 0x66ba, 0x66cc, 0x6723, 0x6a34, 0x6a66, 0x6a49, 0x6a67,
+  0x6a32, 0x6a68, 0x6a3e, 0x6a5d, 0x6a6d, 0x6a76, 0x6a5b, 0x6a51,
+  0x6a28, 0x6a5a, 0x6a3b, 0x6a3f, 0x6a41, 0x6a6a, 0x6a64, 0x6a50,
+  0x6a4f, 0x6a54, 0x6a6f, 0x6a69, 0x6a60, 0x6a3c, 0x6a5e, 0x6a56,
+  0x6a55, 0x6a4d, 0x6a4e, 0x6a46, 0x6b55, 0x6b54, 0x6b56, 0x6ba7,
+  0x6baa, 0x6bab, 0x6bc8, 0x6bc7, 0x6c04, 0x6c03, 0x6c06, 0x6fad,
+  0x6fcb, 0x6fa3, 0x6fc7, 0x6fbc, 0x6fce, 0x6fc8, 0x6f5e, 0x6fc4,
+  0x6fbd, 0x6f9e, 0x6fca, 0x6fa8, 0x7004, 0x6fa5, 0x6fae, 0x6fba,
+  0x6fac, 0x6faa, 0x6fcf, 0x6fbf, 0x6fb8,
+  /* 0xea */
+  0x6fa2, 0x6fc9, 0x6fab, 0x6fcd, 0x6faf, 0x6fb2, 0x6fb0, 0x71c5,
+  0x71c2, 0x71bf, 0x71b8, 0x71d6, 0x71c0, 0x71c1, 0x71cb, 0x71d4,
+  0x71ca, 0x71c7, 0x71cf, 0x71bd, 0x71d8, 0x71bc, 0x71c6, 0x71da,
+  0x71db, 0x729d, 0x729e, 0x7369, 0x7366, 0x7367, 0x736c, 0x7365,
+  0x736b, 0x736a, 0x747f, 0x749a, 0x74a0, 0x7494, 0x7492, 0x7495,
+  0x74a1, 0x750b, 0x7580, 0x762f, 0x762d, 0x7631, 0x763d, 0x7633,
+  0x763c, 0x7635, 0x7632, 0x7630, 0x76bb, 0x76e6, 0x779a, 0x779d,
+  0x77a1, 0x779c, 0x779b, 0x77a2, 0x77a3, 0x7795, 0x7799, 0x7797,
+  0x78dd, 0x78e9, 0x78e5, 0x78ea, 0x78de, 0x78e3, 0x78db, 0x78e1,
+  0x78e2, 0x78ed, 0x78df, 0x78e0, 0x79a4, 0x7a44, 0x7a48, 0x7a47,
+  0x7ab6, 0x7ab8, 0x7ab5, 0x7ab1, 0x7ab7, 0x7bde, 0x7be3, 0x7be7,
+  0x7bdd, 0x7bd5, 0x7be5, 0x7bda, 0x7be8, 0x7bf9, 0x7bd4, 0x7bea,
+  0x7be2, 0x7bdc, 0x7beb, 0x7bd8, 0x7bdf, 0x7cd2, 0x7cd4, 0x7cd7,
+  0x7cd0, 0x7cd1, 0x7e12, 0x7e21, 0x7e17, 0x7e0c, 0x7e1f, 0x7e20,
+  0x7e13, 0x7e0e, 0x7e1c, 0x7e15, 0x7e1a, 0x7e22, 0x7e0b, 0x7e0f,
+  0x7e16, 0x7e0d, 0x7e14, 0x7e25, 0x7e24, 0x7f43, 0x7f7b, 0x7f7c,
+  0x7f7a, 0x7fb1, 0x7fef, 0x802a, 0x8029, 0x806c, 0x81b1, 0x81a6,
+  0x81ae, 0x81b9, 0x81b5, 0x81ab, 0x81b0, 0x81ac, 0x81b4, 0x81b2,
+  0x81b7, 0x81a7, 0x81f2, 0x8255, 0x8256, 0x8257, 0x8556, 0x8545,
+  0x856b, 0x854d, 0x8553, 0x8561, 0x8558,
+  /* 0xeb */
+  0x8540, 0x8546, 0x8564, 0x8541, 0x8562, 0x8544, 0x8551, 0x8547,
+  0x8563, 0x853e, 0x855b, 0x8571, 0x854e, 0x856e, 0x8575, 0x8555,
+  0x8567, 0x8560, 0x858c, 0x8566, 0x855d, 0x8554, 0x8565, 0x856c,
+  0x8663, 0x8665, 0x8664, 0x879b, 0x878f, 0x8797, 0x8793, 0x8792,
+  0x8788, 0x8781, 0x8796, 0x8798, 0x8779, 0x8787, 0x87a3, 0x8785,
+  0x8790, 0x8791, 0x879d, 0x8784, 0x8794, 0x879c, 0x879a, 0x8789,
+  0x891e, 0x8926, 0x8930, 0x892d, 0x892e, 0x8927, 0x8931, 0x8922,
+  0x8929, 0x8923, 0x892f, 0x892c, 0x891f, 0x89f1, 0x8ae0, 0x8ae2,
+  0x8af2, 0x8af4, 0x8af5, 0x8add, 0x8b14, 0x8ae4, 0x8adf, 0x8af0,
+  0x8ac8, 0x8ade, 0x8ae1, 0x8ae8, 0x8aff, 0x8aef, 0x8afb, 0x8c91,
+  0x8c92, 0x8c90, 0x8cf5, 0x8cee, 0x8cf1, 0x8cf0, 0x8cf3, 0x8d6c,
+  0x8d6e, 0x8da5, 0x8da7, 0x8e33, 0x8e3e, 0x8e38, 0x8e40, 0x8e45,
+  0x8e36, 0x8e3c, 0x8e3d, 0x8e41, 0x8e30, 0x8e3f, 0x8ebd, 0x8f36,
+  0x8f2e, 0x8f35, 0x8f32, 0x8f39, 0x8f37, 0x8f34, 0x9076, 0x9079,
+  0x907b, 0x9086, 0x90fa, 0x9133, 0x9135, 0x9136, 0x9193, 0x9190,
+  0x9191, 0x918d, 0x918f, 0x9327, 0x931e, 0x9308, 0x931f, 0x9306,
+  0x930f, 0x937a, 0x9338, 0x933c, 0x931b, 0x9323, 0x9312, 0x9301,
+  0x9346, 0x932d, 0x930e, 0x930d, 0x92cb, 0x931d, 0x92fa, 0x9325,
+  0x9313, 0x92f9, 0x92f7, 0x9334, 0x9302, 0x9324, 0x92ff, 0x9329,
+  0x9339, 0x9335, 0x932a, 0x9314, 0x930c,
+  /* 0xec */
+  0x930b, 0x92fe, 0x9309, 0x9300, 0x92fb, 0x9316, 0x95bc, 0x95cd,
+  0x95be, 0x95b9, 0x95ba, 0x95b6, 0x95bf, 0x95b5, 0x95bd, 0x96a9,
+  0x96d4, 0x970b, 0x9712, 0x9710, 0x9799, 0x9797, 0x9794, 0x97f0,
+  0x97f8, 0x9835, 0x982f, 0x9832, 0x9924, 0x991f, 0x9927, 0x9929,
+  0x999e, 0x99ee, 0x99ec, 0x99e5, 0x99e4, 0x99f0, 0x99e3, 0x99ea,
+  0x99e9, 0x99e7, 0x9ab9, 0x9abf, 0x9ab4, 0x9abb, 0x9af6, 0x9afa,
+  0x9af9, 0x9af7, 0x9b33, 0x9b80, 0x9b85, 0x9b87, 0x9b7c, 0x9b7e,
+  0x9b7b, 0x9b82, 0x9b93, 0x9b92, 0x9b90, 0x9b7a, 0x9b95, 0x9b7d,
+  0x9b88, 0x9d25, 0x9d17, 0x9d20, 0x9d1e, 0x9d14, 0x9d29, 0x9d1d,
+  0x9d18, 0x9d22, 0x9d10, 0x9d19, 0x9d1f, 0x9e88, 0x9e86, 0x9e87,
+  0x9eae, 0x9ead, 0x9ed5, 0x9ed6, 0x9efa, 0x9f12, 0x9f3d, 0x5126,
+  0x5125, 0x5122, 0x5124, 0x5120, 0x5129, 0x52f4, 0x5693, 0x568c,
+  0x568d, 0x5686, 0x5684, 0x5683, 0x567e, 0x5682, 0x567f, 0x5681,
+  0x58d6, 0x58d4, 0x58cf, 0x58d2, 0x5b2d, 0x5b25, 0x5b32, 0x5b23,
+  0x5b2c, 0x5b27, 0x5b26, 0x5b2f, 0x5b2e, 0x5b7b, 0x5bf1, 0x5bf2,
+  0x5db7, 0x5e6c, 0x5e6a, 0x5fbe, 0x5fbb, 0x61c3, 0x61b5, 0x61bc,
+  0x61e7, 0x61e0, 0x61e5, 0x61e4, 0x61e8, 0x61de, 0x64ef, 0x64e9,
+  0x64e3, 0x64eb, 0x64e4, 0x64e8, 0x6581, 0x6580, 0x65b6, 0x65da,
+  0x66d2, 0x6a8d, 0x6a96, 0x6a81, 0x6aa5, 0x6a89, 0x6a9f, 0x6a9b,
+  0x6aa1, 0x6a9e, 0x6a87, 0x6a93, 0x6a8e,
+  /* 0xed */
+  0x6a95, 0x6a83, 0x6aa8, 0x6aa4, 0x6a91, 0x6a7f, 0x6aa6, 0x6a9a,
+  0x6a85, 0x6a8c, 0x6a92, 0x6b5b, 0x6bad, 0x6c09, 0x6fcc, 0x6fa9,
+  0x6ff4, 0x6fd4, 0x6fe3, 0x6fdc, 0x6fed, 0x6fe7, 0x6fe6, 0x6fde,
+  0x6ff2, 0x6fdd, 0x6fe2, 0x6fe8, 0x71e1, 0x71f1, 0x71e8, 0x71f2,
+  0x71e4, 0x71f0, 0x71e2, 0x7373, 0x736e, 0x736f, 0x7497, 0x74b2,
+  0x74ab, 0x7490, 0x74aa, 0x74ad, 0x74b1, 0x74a5, 0x74af, 0x7510,
+  0x7511, 0x7512, 0x750f, 0x7584, 0x7643, 0x7648, 0x7649, 0x7647,
+  0x76a4, 0x76e9, 0x77b5, 0x77ab, 0x77b2, 0x77b7, 0x77b6, 0x77b4,
+  0x77b1, 0x77a8, 0x77f0, 0x78f3, 0x78fd, 0x7902, 0x78fb, 0x78fc,
+  0x78f2, 0x7905, 0x78f9, 0x78fe, 0x7904, 0x79ab, 0x79a8, 0x7a5c,
+  0x7a5b, 0x7a56, 0x7a58, 0x7a54, 0x7a5a, 0x7abe, 0x7ac0, 0x7ac1,
+  0x7c05, 0x7c0f, 0x7bf2, 0x7c00, 0x7bff, 0x7bfb, 0x7c0e, 0x7bf4,
+  0x7c0b, 0x7bf3, 0x7c02, 0x7c09, 0x7c03, 0x7c01, 0x7bf8, 0x7bfd,
+  0x7c06, 0x7bf0, 0x7bf1, 0x7c10, 0x7c0a, 0x7ce8, 0x7e2d, 0x7e3c,
+  0x7e42, 0x7e33, 0x9848, 0x7e38, 0x7e2a, 0x7e49, 0x7e40, 0x7e47,
+  0x7e29, 0x7e4c, 0x7e30, 0x7e3b, 0x7e36, 0x7e44, 0x7e3a, 0x7f45,
+  0x7f7f, 0x7f7e, 0x7f7d, 0x7ff4, 0x7ff2, 0x802c, 0x81bb, 0x81c4,
+  0x81cc, 0x81ca, 0x81c5, 0x81c7, 0x81bc, 0x81e9, 0x825b, 0x825a,
+  0x825c, 0x8583, 0x8580, 0x858f, 0x85a7, 0x8595, 0x85a0, 0x858b,
+  0x85a3, 0x857b, 0x85a4, 0x859a, 0x859e,
+  /* 0xee */
+  0x8577, 0x857c, 0x8589, 0x85a1, 0x857a, 0x8578, 0x8557, 0x858e,
+  0x8596, 0x8586, 0x858d, 0x8599, 0x859d, 0x8581, 0x85a2, 0x8582,
+  0x8588, 0x8585, 0x8579, 0x8576, 0x8598, 0x8590, 0x859f, 0x8668,
+  0x87be, 0x87aa, 0x87ad, 0x87c5, 0x87b0, 0x87ac, 0x87b9, 0x87b5,
+  0x87bc, 0x87ae, 0x87c9, 0x87c3, 0x87c2, 0x87cc, 0x87b7, 0x87af,
+  0x87c4, 0x87ca, 0x87b4, 0x87b6, 0x87bf, 0x87b8, 0x87bd, 0x87de,
+  0x87b2, 0x8935, 0x8933, 0x893c, 0x893e, 0x8941, 0x8952, 0x8937,
+  0x8942, 0x89ad, 0x89af, 0x89ae, 0x89f2, 0x89f3, 0x8b1e, 0x8b18,
+  0x8b16, 0x8b11, 0x8b05, 0x8b0b, 0x8b22, 0x8b0f, 0x8b12, 0x8b15,
+  0x8b07, 0x8b0d, 0x8b08, 0x8b06, 0x8b1c, 0x8b13, 0x8b1a, 0x8c4f,
+  0x8c70, 0x8c72, 0x8c71, 0x8c6f, 0x8c95, 0x8c94, 0x8cf9, 0x8d6f,
+  0x8e4e, 0x8e4d, 0x8e53, 0x8e50, 0x8e4c, 0x8e47, 0x8f43, 0x8f40,
+  0x9085, 0x907e, 0x9138, 0x919a, 0x91a2, 0x919b, 0x9199, 0x919f,
+  0x91a1, 0x919d, 0x91a0, 0x93a1, 0x9383, 0x93af, 0x9364, 0x9356,
+  0x9347, 0x937c, 0x9358, 0x935c, 0x9376, 0x9349, 0x9350, 0x9351,
+  0x9360, 0x936d, 0x938f, 0x934c, 0x936a, 0x9379, 0x9357, 0x9355,
+  0x9352, 0x934f, 0x9371, 0x9377, 0x937b, 0x9361, 0x935e, 0x9363,
+  0x9367, 0x9380, 0x934e, 0x9359, 0x95c7, 0x95c0, 0x95c9, 0x95c3,
+  0x95c5, 0x95b7, 0x96ae, 0x96b0, 0x96ac, 0x9720, 0x971f, 0x9718,
+  0x971d, 0x9719, 0x979a, 0x97a1, 0x979c,
+  /* 0xef */
+  0x979e, 0x979d, 0x97d5, 0x97d4, 0x97f1, 0x9841, 0x9844, 0x984a,
+  0x9849, 0x9845, 0x9843, 0x9925, 0x992b, 0x992c, 0x992a, 0x9933,
+  0x9932, 0x992f, 0x992d, 0x9931, 0x9930, 0x9998, 0x99a3, 0x99a1,
+  0x9a02, 0x99fa, 0x99f4, 0x99f7, 0x99f9, 0x99f8, 0x99f6, 0x99fb,
+  0x99fd, 0x99fe, 0x99fc, 0x9a03, 0x9abe, 0x9afe, 0x9afd, 0x9b01,
+  0x9afc, 0x9b48, 0x9b9a, 0x9ba8, 0x9b9e, 0x9b9b, 0x9ba6, 0x9ba1,
+  0x9ba5, 0x9ba4, 0x9b86, 0x9ba2, 0x9ba0, 0x9baf, 0x9d33, 0x9d41,
+  0x9d67, 0x9d36, 0x9d2e, 0x9d2f, 0x9d31, 0x9d38, 0x9d30, 0x9d45,
+  0x9d42, 0x9d43, 0x9d3e, 0x9d37, 0x9d40, 0x9d3d, 0x7ff5, 0x9d2d,
+  0x9e8a, 0x9e89, 0x9e8d, 0x9eb0, 0x9ec8, 0x9eda, 0x9efb, 0x9eff,
+  0x9f24, 0x9f23, 0x9f22, 0x9f54, 0x9fa0, 0x5131, 0x512d, 0x512e,
+  0x5698, 0x569c, 0x5697, 0x569a, 0x569d, 0x5699, 0x5970, 0x5b3c,
+  0x5c69, 0x5c6a, 0x5dc0, 0x5e6d, 0x5e6e, 0x61d8, 0x61df, 0x61ed,
+  0x61ee, 0x61f1, 0x61ea, 0x61f0, 0x61eb, 0x61d6, 0x61e9, 0x64ff,
+  0x6504, 0x64fd, 0x64f8, 0x6501, 0x6503, 0x64fc, 0x6594, 0x65db,
+  0x66da, 0x66db, 0x66d8, 0x6ac5, 0x6ab9, 0x6abd, 0x6ae1, 0x6ac6,
+  0x6aba, 0x6ab6, 0x6ab7, 0x6ac7, 0x6ab4, 0x6aad, 0x6b5e, 0x6bc9,
+  0x6c0b, 0x7007, 0x700c, 0x700d, 0x7001, 0x7005, 0x7014, 0x700e,
+  0x6fff, 0x7000, 0x6ffb, 0x7026, 0x6ffc, 0x6ff7, 0x700a, 0x7201,
+  0x71ff, 0x71f9, 0x7203, 0x71fd, 0x7376,
+  /* 0xf0 */
+  0x74b8, 0x74c0, 0x74b5, 0x74c1, 0x74be, 0x74b6, 0x74bb, 0x74c2,
+  0x7514, 0x7513, 0x765c, 0x7664, 0x7659, 0x7650, 0x7653, 0x7657,
+  0x765a, 0x76a6, 0x76bd, 0x76ec, 0x77c2, 0x77ba, 0x78ff, 0x790c,
+  0x7913, 0x7914, 0x7909, 0x7910, 0x7912, 0x7911, 0x79ad, 0x79ac,
+  0x7a5f, 0x7c1c, 0x7c29, 0x7c19, 0x7c20, 0x7c1f, 0x7c2d, 0x7c1d,
+  0x7c26, 0x7c28, 0x7c22, 0x7c25, 0x7c30, 0x7e5c, 0x7e50, 0x7e56,
+  0x7e63, 0x7e58, 0x7e62, 0x7e5f, 0x7e51, 0x7e60, 0x7e57, 0x7e53,
+  0x7fb5, 0x7fb3, 0x7ff7, 0x7ff8, 0x8075, 0x81d1, 0x81d2, 0x81d0,
+  0x825f, 0x825e, 0x85b4, 0x85c6, 0x85c0, 0x85c3, 0x85c2, 0x85b3,
+  0x85b5, 0x85bd, 0x85c7, 0x85c4, 0x85bf, 0x85cb, 0x85ce, 0x85c8,
+  0x85c5, 0x85b1, 0x85b6, 0x85d2, 0x8624, 0x85b8, 0x85b7, 0x85be,
+  0x8669, 0x87e7, 0x87e6, 0x87e2, 0x87db, 0x87eb, 0x87ea, 0x87e5,
+  0x87df, 0x87f3, 0x87e4, 0x87d4, 0x87dc, 0x87d3, 0x87ed, 0x87d8,
+  0x87e3, 0x87a4, 0x87d7, 0x87d9, 0x8801, 0x87f4, 0x87e8, 0x87dd,
+  0x8953, 0x894b, 0x894f, 0x894c, 0x8946, 0x8950, 0x8951, 0x8949,
+  0x8b2a, 0x8b27, 0x8b23, 0x8b33, 0x8b30, 0x8b35, 0x8b47, 0x8b2f,
+  0x8b3c, 0x8b3e, 0x8b31, 0x8b25, 0x8b37, 0x8b26, 0x8b36, 0x8b2e,
+  0x8b24, 0x8b3b, 0x8b3d, 0x8b3a, 0x8c42, 0x8c75, 0x8c99, 0x8c98,
+  0x8c97, 0x8cfe, 0x8d04, 0x8d02, 0x8d00, 0x8e5c, 0x8e62, 0x8e60,
+  0x8e57, 0x8e56, 0x8e5e, 0x8e65, 0x8e67,
+  /* 0xf1 */
+  0x8e5b, 0x8e5a, 0x8e61, 0x8e5d, 0x8e69, 0x8e54, 0x8f46, 0x8f47,
+  0x8f48, 0x8f4b, 0x9128, 0x913a, 0x913b, 0x913e, 0x91a8, 0x91a5,
+  0x91a7, 0x91af, 0x91aa, 0x93b5, 0x938c, 0x9392, 0x93b7, 0x939b,
+  0x939d, 0x9389, 0x93a7, 0x938e, 0x93aa, 0x939e, 0x93a6, 0x9395,
+  0x9388, 0x9399, 0x939f, 0x938d, 0x93b1, 0x9391, 0x93b2, 0x93a4,
+  0x93a8, 0x93b4, 0x93a3, 0x93a5, 0x95d2, 0x95d3, 0x95d1, 0x96b3,
+  0x96d7, 0x96da, 0x5dc2, 0x96df, 0x96d8, 0x96dd, 0x9723, 0x9722,
+  0x9725, 0x97ac, 0x97ae, 0x97a8, 0x97ab, 0x97a4, 0x97aa, 0x97a2,
+  0x97a5, 0x97d7, 0x97d9, 0x97d6, 0x97d8, 0x97fa, 0x9850, 0x9851,
+  0x9852, 0x98b8, 0x9941, 0x993c, 0x993a, 0x9a0f, 0x9a0b, 0x9a09,
+  0x9a0d, 0x9a04, 0x9a11, 0x9a0a, 0x9a05, 0x9a07, 0x9a06, 0x9ac0,
+  0x9adc, 0x9b08, 0x9b04, 0x9b05, 0x9b29, 0x9b35, 0x9b4a, 0x9b4c,
+  0x9b4b, 0x9bc7, 0x9bc6, 0x9bc3, 0x9bbf, 0x9bc1, 0x9bb5, 0x9bb8,
+  0x9bd3, 0x9bb6, 0x9bc4, 0x9bb9, 0x9bbd, 0x9d5c, 0x9d53, 0x9d4f,
+  0x9d4a, 0x9d5b, 0x9d4b, 0x9d59, 0x9d56, 0x9d4c, 0x9d57, 0x9d52,
+  0x9d54, 0x9d5f, 0x9d58, 0x9d5a, 0x9e8e, 0x9e8c, 0x9edf, 0x9f01,
+  0x9f00, 0x9f16, 0x9f25, 0x9f2b, 0x9f2a, 0x9f29, 0x9f28, 0x9f4c,
+  0x9f55, 0x5134, 0x5135, 0x5296, 0x52f7, 0x53b4, 0x56ab, 0x56ad,
+  0x56a6, 0x56a7, 0x56aa, 0x56ac, 0x58da, 0x58dd, 0x58db, 0x5912,
+  0x5b3d, 0x5b3e, 0x5b3f, 0x5dc3, 0x5e70,
+  /* 0xf2 */
+  0x5fbf, 0x61fb, 0x6507, 0x6510, 0x650d, 0x6509, 0x650c, 0x650e,
+  0x6584, 0x65de, 0x65dd, 0x66de, 0x6ae7, 0x6ae0, 0x6acc, 0x6ad1,
+  0x6ad9, 0x6acb, 0x6adf, 0x6adc, 0x6ad0, 0x6aeb, 0x6acf, 0x6acd,
+  0x6ade, 0x6b60, 0x6bb0, 0x6c0c, 0x7019, 0x7027, 0x7020, 0x7016,
+  0x702b, 0x7021, 0x7022, 0x7023, 0x7029, 0x7017, 0x7024, 0x701c,
+  0x702a, 0x720c, 0x720a, 0x7207, 0x7202, 0x7205, 0x72a5, 0x72a6,
+  0x72a4, 0x72a3, 0x72a1, 0x74cb, 0x74c5, 0x74b7, 0x74c3, 0x7516,
+  0x7660, 0x77c9, 0x77ca, 0x77c4, 0x77f1, 0x791d, 0x791b, 0x7921,
+  0x791c, 0x7917, 0x791e, 0x79b0, 0x7a67, 0x7a68, 0x7c33, 0x7c3c,
+  0x7c39, 0x7c2c, 0x7c3b, 0x7cec, 0x7cea, 0x7e76, 0x7e75, 0x7e78,
+  0x7e70, 0x7e77, 0x7e6f, 0x7e7a, 0x7e72, 0x7e74, 0x7e68, 0x7f4b,
+  0x7f4a, 0x7f83, 0x7f86, 0x7fb7, 0x7ffd, 0x7ffe, 0x8078, 0x81d7,
+  0x81d5, 0x8264, 0x8261, 0x8263, 0x85eb, 0x85f1, 0x85ed, 0x85d9,
+  0x85e1, 0x85e8, 0x85da, 0x85d7, 0x85ec, 0x85f2, 0x85f8, 0x85d8,
+  0x85df, 0x85e3, 0x85dc, 0x85d1, 0x85f0, 0x85e6, 0x85ef, 0x85de,
+  0x85e2, 0x8800, 0x87fa, 0x8803, 0x87f6, 0x87f7, 0x8809, 0x880c,
+  0x880b, 0x8806, 0x87fc, 0x8808, 0x87ff, 0x880a, 0x8802, 0x8962,
+  0x895a, 0x895b, 0x8957, 0x8961, 0x895c, 0x8958, 0x895d, 0x8959,
+  0x8988, 0x89b7, 0x89b6, 0x89f6, 0x8b50, 0x8b48, 0x8b4a, 0x8b40,
+  0x8b53, 0x8b56, 0x8b54, 0x8b4b, 0x8b55,
+  /* 0xf3 */
+  0x8b51, 0x8b42, 0x8b52, 0x8b57, 0x8c43, 0x8c77, 0x8c76, 0x8c9a,
+  0x8d06, 0x8d07, 0x8d09, 0x8dac, 0x8daa, 0x8dad, 0x8dab, 0x8e6d,
+  0x8e78, 0x8e73, 0x8e6a, 0x8e6f, 0x8e7b, 0x8ec2, 0x8f52, 0x8f51,
+  0x8f4f, 0x8f50, 0x8f53, 0x8fb4, 0x9140, 0x913f, 0x91b0, 0x91ad,
+  0x93de, 0x93c7, 0x93cf, 0x93c2, 0x93da, 0x93d0, 0x93f9, 0x93ec,
+  0x93cc, 0x93d9, 0x93a9, 0x93e6, 0x93ca, 0x93d4, 0x93ee, 0x93e3,
+  0x93d5, 0x93c4, 0x93ce, 0x93c0, 0x93d2, 0x93e7, 0x957d, 0x95da,
+  0x95db, 0x96e1, 0x9729, 0x972b, 0x972c, 0x9728, 0x9726, 0x97b3,
+  0x97b7, 0x97b6, 0x97dd, 0x97de, 0x97df, 0x985c, 0x9859, 0x985d,
+  0x9857, 0x98bf, 0x98bd, 0x98bb, 0x98be, 0x9948, 0x9947, 0x9943,
+  0x99a6, 0x99a7, 0x9a1a, 0x9a15, 0x9a25, 0x9a1d, 0x9a24, 0x9a1b,
+  0x9a22, 0x9a20, 0x9a27, 0x9a23, 0x9a1e, 0x9a1c, 0x9a14, 0x9ac2,
+  0x9b0b, 0x9b0a, 0x9b0e, 0x9b0c, 0x9b37, 0x9bea, 0x9beb, 0x9be0,
+  0x9bde, 0x9be4, 0x9be6, 0x9be2, 0x9bf0, 0x9bd4, 0x9bd7, 0x9bec,
+  0x9bdc, 0x9bd9, 0x9be5, 0x9bd5, 0x9be1, 0x9bda, 0x9d77, 0x9d81,
+  0x9d8a, 0x9d84, 0x9d88, 0x9d71, 0x9d80, 0x9d78, 0x9d86, 0x9d8b,
+  0x9d8c, 0x9d7d, 0x9d6b, 0x9d74, 0x9d75, 0x9d70, 0x9d69, 0x9d85,
+  0x9d73, 0x9d7b, 0x9d82, 0x9d6f, 0x9d79, 0x9d7f, 0x9d87, 0x9d68,
+  0x9e94, 0x9e91, 0x9ec0, 0x9efc, 0x9f2d, 0x9f40, 0x9f41, 0x9f4d,
+  0x9f56, 0x9f57, 0x9f58, 0x5337, 0x56b2,
+  /* 0xf4 */
+  0x56b5, 0x56b3, 0x58e3, 0x5b45, 0x5dc6, 0x5dc7, 0x5eee, 0x5eef,
+  0x5fc0, 0x5fc1, 0x61f9, 0x6517, 0x6516, 0x6515, 0x6513, 0x65df,
+  0x66e8, 0x66e3, 0x66e4, 0x6af3, 0x6af0, 0x6aea, 0x6ae8, 0x6af9,
+  0x6af1, 0x6aee, 0x6aef, 0x703c, 0x7035, 0x702f, 0x7037, 0x7034,
+  0x7031, 0x7042, 0x7038, 0x703f, 0x703a, 0x7039, 0x7040, 0x703b,
+  0x7033, 0x7041, 0x7213, 0x7214, 0x72a8, 0x737d, 0x737c, 0x74ba,
+  0x76ab, 0x76aa, 0x76be, 0x76ed, 0x77cc, 0x77ce, 0x77cf, 0x77cd,
+  0x77f2, 0x7925, 0x7923, 0x7927, 0x7928, 0x7924, 0x7929, 0x79b2,
+  0x7a6e, 0x7a6c, 0x7a6d, 0x7af7, 0x7c49, 0x7c48, 0x7c4a, 0x7c47,
+  0x7c45, 0x7cee, 0x7e7b, 0x7e7e, 0x7e81, 0x7e80, 0x7fba, 0x7fff,
+  0x8079, 0x81db, 0x81d9, 0x820b, 0x8268, 0x8269, 0x8622, 0x85ff,
+  0x8601, 0x85fe, 0x861b, 0x8600, 0x85f6, 0x8604, 0x8609, 0x8605,
+  0x860c, 0x85fd, 0x8819, 0x8810, 0x8811, 0x8817, 0x8813, 0x8816,
+  0x8963, 0x8966, 0x89b9, 0x89f7, 0x8b60, 0x8b6a, 0x8b5d, 0x8b68,
+  0x8b63, 0x8b65, 0x8b67, 0x8b6d, 0x8dae, 0x8e86, 0x8e88, 0x8e84,
+  0x8f59, 0x8f56, 0x8f57, 0x8f55, 0x8f58, 0x8f5a, 0x908d, 0x9143,
+  0x9141, 0x91b7, 0x91b5, 0x91b2, 0x91b3, 0x940b, 0x9413, 0x93fb,
+  0x9420, 0x940f, 0x9414, 0x93fe, 0x9415, 0x9410, 0x9428, 0x9419,
+  0x940d, 0x93f5, 0x9400, 0x93f7, 0x9407, 0x940e, 0x9416, 0x9412,
+  0x93fa, 0x9409, 0x93f8, 0x940a, 0x93ff,
+  /* 0xf5 */
+  0x93fc, 0x940c, 0x93f6, 0x9411, 0x9406, 0x95de, 0x95e0, 0x95df,
+  0x972e, 0x972f, 0x97b9, 0x97bb, 0x97fd, 0x97fe, 0x9860, 0x9862,
+  0x9863, 0x985f, 0x98c1, 0x98c2, 0x9950, 0x994e, 0x9959, 0x994c,
+  0x994b, 0x9953, 0x9a32, 0x9a34, 0x9a31, 0x9a2c, 0x9a2a, 0x9a36,
+  0x9a29, 0x9a2e, 0x9a38, 0x9a2d, 0x9ac7, 0x9aca, 0x9ac6, 0x9b10,
+  0x9b12, 0x9b11, 0x9c0b, 0x9c08, 0x9bf7, 0x9c05, 0x9c12, 0x9bf8,
+  0x9c40, 0x9c07, 0x9c0e, 0x9c06, 0x9c17, 0x9c14, 0x9c09, 0x9d9f,
+  0x9d99, 0x9da4, 0x9d9d, 0x9d92, 0x9d98, 0x9d90, 0x9d9b, 0x9da0,
+  0x9d94, 0x9d9c, 0x9daa, 0x9d97, 0x9da1, 0x9d9a, 0x9da2, 0x9da8,
+  0x9d9e, 0x9da3, 0x9dbf, 0x9da9, 0x9d96, 0x9da6, 0x9da7, 0x9e99,
+  0x9e9b, 0x9e9a, 0x9ee5, 0x9ee4, 0x9ee7, 0x9ee6, 0x9f30, 0x9f2e,
+  0x9f5b, 0x9f60, 0x9f5e, 0x9f5d, 0x9f59, 0x9f91, 0x513a, 0x5139,
+  0x5298, 0x5297, 0x56c3, 0x56bd, 0x56be, 0x5b48, 0x5b47, 0x5dcb,
+  0x5dcf, 0x5ef1, 0x61fd, 0x651b, 0x6b02, 0x6afc, 0x6b03, 0x6af8,
+  0x6b00, 0x7043, 0x7044, 0x704a, 0x7048, 0x7049, 0x7045, 0x7046,
+  0x721d, 0x721a, 0x7219, 0x737e, 0x7517, 0x766a, 0x77d0, 0x792d,
+  0x7931, 0x792f, 0x7c54, 0x7c53, 0x7cf2, 0x7e8a, 0x7e87, 0x7e88,
+  0x7e8b, 0x7e86, 0x7e8d, 0x7f4d, 0x7fbb, 0x8030, 0x81dd, 0x8618,
+  0x862a, 0x8626, 0x861f, 0x8623, 0x861c, 0x8619, 0x8627, 0x862e,
+  0x8621, 0x8620, 0x8629, 0x861e, 0x8625,
+  /* 0xf6 */
+  0x8829, 0x881d, 0x881b, 0x8820, 0x8824, 0x881c, 0x882b, 0x884a,
+  0x896d, 0x8969, 0x896e, 0x896b, 0x89fa, 0x8b79, 0x8b78, 0x8b45,
+  0x8b7a, 0x8b7b, 0x8d10, 0x8d14, 0x8daf, 0x8e8e, 0x8e8c, 0x8f5e,
+  0x8f5b, 0x8f5d, 0x9146, 0x9144, 0x9145, 0x91b9, 0x943f, 0x943b,
+  0x9436, 0x9429, 0x943d, 0x943c, 0x9430, 0x9439, 0x942a, 0x9437,
+  0x942c, 0x9440, 0x9431, 0x95e5, 0x95e4, 0x95e3, 0x9735, 0x973a,
+  0x97bf, 0x97e1, 0x9864, 0x98c9, 0x98c6, 0x98c0, 0x9958, 0x9956,
+  0x9a39, 0x9a3d, 0x9a46, 0x9a44, 0x9a42, 0x9a41, 0x9a3a, 0x9a3f,
+  0x9acd, 0x9b15, 0x9b17, 0x9b18, 0x9b16, 0x9b3a, 0x9b52, 0x9c2b,
+  0x9c1d, 0x9c1c, 0x9c2c, 0x9c23, 0x9c28, 0x9c29, 0x9c24, 0x9c21,
+  0x9db7, 0x9db6, 0x9dbc, 0x9dc1, 0x9dc7, 0x9dca, 0x9dcf, 0x9dbe,
+  0x9dc5, 0x9dc3, 0x9dbb, 0x9db5, 0x9dce, 0x9db9, 0x9dba, 0x9dac,
+  0x9dc8, 0x9db1, 0x9dad, 0x9dcc, 0x9db3, 0x9dcd, 0x9db2, 0x9e7a,
+  0x9e9c, 0x9eeb, 0x9eee, 0x9eed, 0x9f1b, 0x9f18, 0x9f1a, 0x9f31,
+  0x9f4e, 0x9f65, 0x9f64, 0x9f92, 0x4eb9, 0x56c6, 0x56c5, 0x56cb,
+  0x5971, 0x5b4b, 0x5b4c, 0x5dd5, 0x5dd1, 0x5ef2, 0x6521, 0x6520,
+  0x6526, 0x6522, 0x6b0b, 0x6b08, 0x6b09, 0x6c0d, 0x7055, 0x7056,
+  0x7057, 0x7052, 0x721e, 0x721f, 0x72a9, 0x737f, 0x74d8, 0x74d5,
+  0x74d9, 0x74d7, 0x766d, 0x76ad, 0x7935, 0x79b4, 0x7a70, 0x7a71,
+  0x7c57, 0x7c5c, 0x7c59, 0x7c5b, 0x7c5a,
+  /* 0xf7 */
+  0x7cf4, 0x7cf1, 0x7e91, 0x7f4f, 0x7f87, 0x81de, 0x826b, 0x8634,
+  0x8635, 0x8633, 0x862c, 0x8632, 0x8636, 0x882c, 0x8828, 0x8826,
+  0x882a, 0x8825, 0x8971, 0x89bf, 0x89be, 0x89fb, 0x8b7e, 0x8b84,
+  0x8b82, 0x8b86, 0x8b85, 0x8b7f, 0x8d15, 0x8e95, 0x8e94, 0x8e9a,
+  0x8e92, 0x8e90, 0x8e96, 0x8e97, 0x8f60, 0x8f62, 0x9147, 0x944c,
+  0x9450, 0x944a, 0x944b, 0x944f, 0x9447, 0x9445, 0x9448, 0x9449,
+  0x9446, 0x973f, 0x97e3, 0x986a, 0x9869, 0x98cb, 0x9954, 0x995b,
+  0x9a4e, 0x9a53, 0x9a54, 0x9a4c, 0x9a4f, 0x9a48, 0x9a4a, 0x9a49,
+  0x9a52, 0x9a50, 0x9ad0, 0x9b19, 0x9b2b, 0x9b3b, 0x9b56, 0x9b55,
+  0x9c46, 0x9c48, 0x9c3f, 0x9c44, 0x9c39, 0x9c33, 0x9c41, 0x9c3c,
+  0x9c37, 0x9c34, 0x9c32, 0x9c3d, 0x9c36, 0x9ddb, 0x9dd2, 0x9dde,
+  0x9dda, 0x9dcb, 0x9dd0, 0x9ddc, 0x9dd1, 0x9ddf, 0x9de9, 0x9dd9,
+  0x9dd8, 0x9dd6, 0x9df5, 0x9dd5, 0x9ddd, 0x9eb6, 0x9ef0, 0x9f35,
+  0x9f33, 0x9f32, 0x9f42, 0x9f6b, 0x9f95, 0x9fa2, 0x513d, 0x5299,
+  0x58e8, 0x58e7, 0x5972, 0x5b4d, 0x5dd8, 0x882f, 0x5f4f, 0x6201,
+  0x6203, 0x6204, 0x6529, 0x6525, 0x6596, 0x66eb, 0x6b11, 0x6b12,
+  0x6b0f, 0x6bca, 0x705b, 0x705a, 0x7222, 0x7382, 0x7381, 0x7383,
+  0x7670, 0x77d4, 0x7c67, 0x7c66, 0x7e95, 0x826c, 0x863a, 0x8640,
+  0x8639, 0x863c, 0x8631, 0x863b, 0x863e, 0x8830, 0x8832, 0x882e,
+  0x8833, 0x8976, 0x8974, 0x8973, 0x89fe,
+  /* 0xf8 */
+  0x8b8c, 0x8b8e, 0x8b8b, 0x8b88, 0x8c45, 0x8d19, 0x8e98, 0x8f64,
+  0x8f63, 0x91bc, 0x9462, 0x9455, 0x945d, 0x9457, 0x945e, 0x97c4,
+  0x97c5, 0x9800, 0x9a56, 0x9a59, 0x9b1e, 0x9b1f, 0x9b20, 0x9c52,
+  0x9c58, 0x9c50, 0x9c4a, 0x9c4d, 0x9c4b, 0x9c55, 0x9c59, 0x9c4c,
+  0x9c4e, 0x9dfb, 0x9df7, 0x9def, 0x9de3, 0x9deb, 0x9df8, 0x9de4,
+  0x9df6, 0x9de1, 0x9dee, 0x9de6, 0x9df2, 0x9df0, 0x9de2, 0x9dec,
+  0x9df4, 0x9df3, 0x9de8, 0x9ded, 0x9ec2, 0x9ed0, 0x9ef2, 0x9ef3,
+  0x9f06, 0x9f1c, 0x9f38, 0x9f37, 0x9f36, 0x9f43, 0x9f4f, 0x9f71,
+  0x9f70, 0x9f6e, 0x9f6f, 0x56d3, 0x56cd, 0x5b4e, 0x5c6d, 0x652d,
+  0x66ed, 0x66ee, 0x6b13, 0x705f, 0x7061, 0x705d, 0x7060, 0x7223,
+  0x74db, 0x74e5, 0x77d5, 0x7938, 0x79b7, 0x79b6, 0x7c6a, 0x7e97,
+  0x7f89, 0x826d, 0x8643, 0x8838, 0x8837, 0x8835, 0x884b, 0x8b94,
+  0x8b95, 0x8e9e, 0x8e9f, 0x8ea0, 0x8e9d, 0x91be, 0x91bd, 0x91c2,
+  0x946b, 0x9468, 0x9469, 0x96e5, 0x9746, 0x9743, 0x9747, 0x97c7,
+  0x97e5, 0x9a5e, 0x9ad5, 0x9b59, 0x9c63, 0x9c67, 0x9c66, 0x9c62,
+  0x9c5e, 0x9c60, 0x9e02, 0x9dfe, 0x9e07, 0x9e03, 0x9e06, 0x9e05,
+  0x9e00, 0x9e01, 0x9e09, 0x9dff, 0x9dfd, 0x9e04, 0x9ea0, 0x9f1e,
+  0x9f46, 0x9f74, 0x9f75, 0x9f76, 0x56d4, 0x652e, 0x65b8, 0x6b18,
+  0x6b19, 0x6b17, 0x6b1a, 0x7062, 0x7226, 0x72aa, 0x77d8, 0x77d9,
+  0x7939, 0x7c69, 0x7c6b, 0x7cf6, 0x7e9a,
+  /* 0xf9 */
+  0x7e98, 0x7e9b, 0x7e99, 0x81e0, 0x81e1, 0x8646, 0x8647, 0x8648,
+  0x8979, 0x897a, 0x897c, 0x897b, 0x89ff, 0x8b98, 0x8b99, 0x8ea5,
+  0x8ea4, 0x8ea3, 0x946e, 0x946d, 0x946f, 0x9471, 0x9473, 0x9749,
+  0x9872, 0x995f, 0x9c68, 0x9c6e, 0x9c6d, 0x9e0b, 0x9e0d, 0x9e10,
+  0x9e0f, 0x9e12, 0x9e11, 0x9ea1, 0x9ef5, 0x9f09, 0x9f47, 0x9f78,
+  0x9f7b, 0x9f7a, 0x9f79, 0x571e, 0x7066, 0x7c6f, 0x883c, 0x8db2,
+  0x8ea6, 0x91c3, 0x9474, 0x9478, 0x9476, 0x9475, 0x9a60, 0x9c74,
+  0x9c73, 0x9c71, 0x9c75, 0x9e14, 0x9e13, 0x9ef6, 0x9f0a, 0x9fa4,
+  0x7068, 0x7065, 0x7cf7, 0x866a, 0x883e, 0x883d, 0x883f, 0x8b9e,
+  0x8c9c, 0x8ea9, 0x8ec9, 0x974b, 0x9873, 0x9874, 0x98cc, 0x9961,
+  0x99ab, 0x9a64, 0x9a66, 0x9a67, 0x9b24, 0x9e15, 0x9e17, 0x9f48,
+  0x6207, 0x6b1e, 0x7227, 0x864c, 0x8ea8, 0x9482, 0x9480, 0x9481,
+  0x9a69, 0x9a68, 0x9b2e, 0x9e19, 0x7229, 0x864b, 0x8b9f, 0x9483,
+  0x9c79, 0x9eb7, 0x7675, 0x9a6b, 0x9c7a, 0x9e1d, 0x7069, 0x706a,
+  0x9ea4, 0x9f7e, 0x9f49, 0x9f98, 0x7881, 0x92b9, 0x88cf, 0x58bb,
+  0x6052, 0x7ca7, 0x5afa, 0x2554, 0x2566, 0x2557, 0x2560, 0x256c,
+  0x2563, 0x255a, 0x2569, 0x255d, 0x2552, 0x2564, 0x2555, 0x255e,
+  0x256a, 0x2561, 0x2558, 0x2567, 0x255b, 0x2553, 0x2565, 0x2556,
+  0x255f, 0x256b, 0x2562, 0x2559, 0x2568, 0x255c, 0x2551, 0x2550,
+  0x256d, 0x256e, 0x2570, 0x256f, 0xffed,
+  /* 0xfa */
+  0xe000, 0x92db, 0xe002, 0xe003, 0x854c, 0x42b5, 0x73ef, 0x51b5,
+  0x3649, 0xe009, 0xe00a, 0x9344, 0xe00c, 0x82ee, 0xe00e, 0x783c,
+  0x6744, 0x62df, 0xe012, 0xe013, 0xe014, 0xe015, 0xe016, 0x4fab,
+  0xe018, 0x5008, 0xe01a, 0xe01b, 0xe01c, 0xe01d, 0xe01e, 0x5029,
+  0xe020, 0x5fa4, 0xe022, 0xe023, 0x6edb, 0xe025, 0x507d, 0x5101,
+  0x347a, 0x510e, 0x986c, 0x3743, 0x8416, 0xe02d, 0xe02e, 0x5160,
+  0xe030, 0x516a, 0xe032, 0xe033, 0xe034, 0xe035, 0xe036, 0xe037,
+  0xe038, 0x5b82, 0x877d, 0xe03b, 0xe03c, 0x51b2, 0x51b8, 0x9d34,
+  0x51c9, 0x51cf, 0x51d1, 0x3cdc, 0x51d3, 0xe045, 0x51b3, 0x51e2,
+  0x5342, 0x51ed, 0x83cd, 0x693e, 0xe04c, 0x5f7b, 0x520b, 0x5226,
+  0x523c, 0x52b5, 0x5257, 0x5294, 0x52b9, 0x52c5, 0x7c15, 0x8542,
+  0x52e0, 0x860d, 0xe05a, 0x5305, 0xe05c, 0x5549, 0x6ed9, 0xe05f,
+  0xe060, 0xe061, 0x5333, 0x5344, 0xe064, 0x6ccb, 0xe066, 0x681b,
+  0x73d5, 0x604a, 0x3eaa, 0x38cc, 0xe06c, 0x71dd, 0x44a2, 0x536d,
+  0x5374, 0xe071, 0x537e, 0x537f, 0xe074, 0xe075, 0x77e6, 0x5393,
+  0xe078, 0x53a0, 0x53ab, 0x53ae, 0x73a7, 0xe07d, 0x3f59, 0x739c,
+  0x53c1, 0x53c5, 0x6c49, 0x4e49, 0x57fe, 0x53d9, 0x3aab, 0xe087,
+  0x53e0, 0xe089, 0xe08a, 0x53f6, 0xe08c, 0x5413, 0x7079, 0x552b,
+  0x6657, 0x6d5b, 0x546d, 0xe093, 0xe094, 0x555d, 0x548f, 0x54a4,
+  0x47a6, 0xe099, 0xe09a, 0x3db4, 0xe09c,
+  /* 0xfb */
+  0xe09d, 0xe09e, 0x5547, 0x4ced, 0x542f, 0x7417, 0x5586, 0x55a9,
+  0x5605, 0xe0a6, 0xe0a7, 0x4552, 0xe0a9, 0x66b3, 0xe0ab, 0x5637,
+  0x66cd, 0xe0ae, 0x66a4, 0x66ad, 0x564d, 0x564f, 0x78f1, 0x56f1,
+  0x9787, 0x53fe, 0x5700, 0x56ef, 0x56ed, 0xe0ba, 0x3623, 0xe0bc,
+  0x5746, 0xe0be, 0x6c6e, 0x708b, 0x5742, 0x36b1, 0xe0c3, 0x57e6,
+  0xe0c5, 0x5803, 0xe0c7, 0xe0c8, 0x5826, 0xe0ca, 0x585c, 0x58aa,
+  0x3561, 0x58e0, 0x58dc, 0xe0d0, 0x58fb, 0x5bff, 0x5743, 0xe0d4,
+  0xe0d5, 0x93d3, 0x35a1, 0x591f, 0x68a6, 0x36c3, 0x6e59, 0xe0dc,
+  0x5a24, 0x5553, 0xe0df, 0x8505, 0x59c9, 0xe0e2, 0xe0e3, 0xe0e4,
+  0xe0e5, 0x59d9, 0xe0e7, 0xe0e8, 0xe0e9, 0x6d71, 0xe0eb, 0xe0ec,
+  0x59f9, 0xe0ee, 0x5aab, 0x5a63, 0x36e6, 0xe0f2, 0x5a77, 0x3708,
+  0x5a96, 0x7465, 0x5ad3, 0xe0f8, 0xe0f9, 0x3d85, 0xe0fb, 0x3732,
+  0xe0fd, 0x5e83, 0x52d0, 0x5b76, 0x6588, 0x5b7c, 0xe103, 0x4004,
+  0x485d, 0xe106, 0x5bd5, 0x6160, 0xe109, 0xe10a, 0xe10b, 0x5bf3,
+  0x5b9d, 0x4d10, 0x5c05, 0xe110, 0x5c13, 0x73ce, 0x5c14, 0xe114,
+  0xe115, 0x5c49, 0x48dd, 0x5c85, 0x5ce9, 0x5cef, 0x5d8b, 0xe11c,
+  0xe11d, 0x5d10, 0x5d18, 0x5d46, 0xe121, 0x5cba, 0x5dd7, 0x82fc,
+  0x382d, 0xe126, 0xe127, 0xe128, 0x8287, 0x3836, 0x3bc2, 0x5e2e,
+  0x6a8a, 0x5e75, 0x5e7a, 0xe130, 0xe131, 0x53a6, 0x4eb7, 0x5ed0,
+  0x53a8, 0xe136, 0x5e09, 0x5ef4, 0xe139,
+  /* 0xfc */
+  0x5ef9, 0x5efb, 0x38a0, 0x5efc, 0x683e, 0x941b, 0x5f0d, 0xe141,
+  0xe142, 0x3ade, 0x48ae, 0xe145, 0x5f3a, 0xe147, 0xe148, 0x5f58,
+  0xe14a, 0x5f63, 0x97bd, 0xe14d, 0x5f72, 0x9340, 0xe150, 0x5fa7,
+  0x5db6, 0x3d5f, 0xe154, 0xe155, 0xe156, 0xe157, 0x91d6, 0xe159,
+  0xe15a, 0x6031, 0x6685, 0xe15d, 0x3963, 0x3dc7, 0x3639, 0x5790,
+  0xe162, 0x7971, 0x3e40, 0x609e, 0x60a4, 0x60b3, 0xe168, 0xe169,
+  0xe16a, 0x74a4, 0x50e1, 0x5aa0, 0x6164, 0x8424, 0x6142, 0xe171,
+  0xe172, 0x6181, 0x51f4, 0xe175, 0x6187, 0x5baa, 0xe178, 0xe179,
+  0x61d3, 0xe17b, 0xe17c, 0x61d0, 0x3932, 0xe17f, 0xe180, 0x6023,
+  0x615c, 0x651e, 0x638b, 0xe185, 0x62c5, 0xe187, 0x62d5, 0xe189,
+  0x636c, 0xe18b, 0x3a17, 0x6438, 0x63f8, 0xe18f, 0xe190, 0x6490,
+  0x6f8a, 0xe193, 0x9814, 0xe195, 0xe196, 0x64e1, 0x64e5, 0x947b,
+  0x3a66, 0x643a, 0x3a57, 0x654d, 0x6f16, 0xe19f, 0xe1a0, 0x6585,
+  0x656d, 0x655f, 0xe1a4, 0x65b5, 0xe1a6, 0x4b37, 0x65d1, 0x40d8,
+  0xe1aa, 0x65e0, 0x65e3, 0x5fdf, 0xe1ae, 0x6618, 0xe1b0, 0xe1b1,
+  0x6644, 0xe1b3, 0xe1b4, 0x664b, 0xe1b6, 0x6667, 0xe1b8, 0x6673,
+  0x6674, 0xe1bb, 0xe1bc, 0xe1bd, 0xe1be, 0xe1bf, 0x77c5, 0xe1c1,
+  0x99a4, 0x6702, 0xe1c4, 0xe1c5, 0x3b2b, 0x69fa, 0xe1c8, 0x675e,
+  0x6767, 0x6762, 0xe1cc, 0xe1cd, 0x67d7, 0x44e9, 0x6822, 0x6e50,
+  0x923c, 0x6801, 0xe1d4, 0xe1d5, 0x685d,
+  /* 0xfd */
+  0xe1d7, 0x69e1, 0x6a0b, 0xe1da, 0x6973, 0x68c3, 0xe1dd, 0x6901,
+  0x6900, 0x3d32, 0x3a01, 0xe1e2, 0x3b80, 0x67ac, 0x6961, 0xe1e6,
+  0x42fc, 0x6936, 0x6998, 0x3ba1, 0xe1eb, 0x8363, 0x5090, 0x69f9,
+  0xe1ef, 0xe1f0, 0x6a45, 0xe1f2, 0x6a9d, 0x3bf3, 0x67b1, 0x6ac8,
+  0xe1f7, 0x3c0d, 0x6b1d, 0xe1fa, 0x60de, 0x6b35, 0x6b74, 0xe1fe,
+  0x6eb5, 0xe200, 0xe201, 0xe202, 0x3740, 0x5421, 0xe205, 0x6be1,
+  0xe207, 0x6bdc, 0x6c37, 0xe20a, 0xe20b, 0xe20c, 0x6c5a, 0x8226,
+  0x6c79, 0xe210, 0x44c5, 0xe212, 0xe213, 0xe214, 0xe215, 0xe216,
+  0x36e5, 0x3ceb, 0xe219, 0x9b83, 0xe21b, 0xe21c, 0x7f8f, 0x6837,
+  0xe21f, 0xe220, 0xe221, 0x6d96, 0x6d5c, 0x6e7c, 0x6f04, 0xe226,
+  0xe227, 0xe228, 0x8533, 0xe22a, 0x51c7, 0x6c9c, 0x6e1d, 0x842e,
+  0xe22f, 0x6e2f, 0xe231, 0x7453, 0xe233, 0x79cc, 0x6e4f, 0x5a91,
+  0xe237, 0x6ff8, 0x370d, 0x6f9d, 0xe23b, 0x6efa, 0xe23d, 0xe23e,
+  0x4555, 0x93f0, 0x6f44, 0x6f5c, 0x3d4e, 0x6f74, 0xe245, 0x3d3b,
+  0x6f9f, 0xe248, 0x6fd3, 0xe24a, 0xe24b, 0xe24c, 0xe24d, 0xe24e,
+  0xe24f, 0x51df, 0xe251, 0xe252, 0xe253, 0xe254, 0x704b, 0x707e,
+  0x70a7, 0x7081, 0x70cc, 0x70d5, 0x70d6, 0x70df, 0x4104, 0x3de8,
+  0x71b4, 0x7196, 0xe261, 0x712b, 0x7145, 0x5a88, 0x714a, 0x716e,
+  0x5c9c, 0xe268, 0x714f, 0x9362, 0xe26b, 0x712c, 0xe26d, 0xe26e,
+  0xe26f, 0x71ba, 0xe271, 0x70bd, 0x720e,
+  /* 0xfe */
+  0x9442, 0x7215, 0x5911, 0x9443, 0x7224, 0x9341, 0xe27a, 0x722e,
+  0x7240, 0xe27d, 0x68bd, 0x7255, 0x7257, 0x3e55, 0xe282, 0x680d,
+  0x6f3d, 0x7282, 0x732a, 0x732b, 0xe288, 0xe289, 0x48ed, 0xe28b,
+  0x7328, 0x732e, 0x73cf, 0x73aa, 0xe290, 0xe291, 0x73c9, 0x7449,
+  0xe294, 0xe295, 0xe296, 0x6623, 0x36c5, 0xe299, 0xe29a, 0xe29b,
+  0x73f7, 0x7415, 0x6903, 0xe29f, 0x7439, 0xe2a1, 0x3ed7, 0x745c,
+  0xe2a4, 0x7460, 0xe2a6, 0x7447, 0x73e4, 0x7476, 0x83b9, 0x746c,
+  0x3730, 0x7474, 0x93f1, 0x6a2c, 0x7482, 0x4953, 0xe2b2, 0xe2b3,
+  0xe2b4, 0xe2b5, 0x5b46, 0xe2b7, 0xe2b8, 0x74c8, 0xe2ba, 0x750e,
+  0x74e9, 0x751e, 0xe2be, 0xe2bf, 0x5bd7, 0xe2c1, 0x9385, 0x754d,
+  0x754a, 0x7567, 0x756e, 0xe2c7, 0x3f04, 0xe2c9, 0x758e, 0x745d,
+  0x759e, 0x75b4, 0x7602, 0x762c, 0x7651, 0x764f, 0x766f, 0x7676,
+  0xe2d4, 0x7690, 0x81ef, 0x37f8, 0xe2d8, 0xe2d9, 0x76a1, 0x76a5,
+  0x76b7, 0x76cc, 0xe2de, 0x8462, 0xe2e0, 0xe2e1, 0xe2e2, 0x771e,
+  0x7726, 0x7740, 0x64af, 0xe2e7, 0x7758, 0xe2e9, 0x77af, 0xe2eb,
+  0xe2ec, 0xe2ed, 0x77f4, 0x7809, 0xe2f0, 0xe2f1, 0x68ca, 0x78af,
+  0x78c7, 0x78d3, 0x96a5, 0x792e, 0xe2f8, 0x78d7, 0x7934, 0x78b1,
+  0xe2fc, 0x8fb8, 0x8884, 0xe2ff, 0xe300, 0xe301, 0x7986, 0x8900,
+  0x6902, 0x7980, 0xe306, 0x799d, 0xe308, 0x793c, 0x79a9, 0x6e2a,
+  0xe30c, 0x3ea8, 0x79c6, 0xe30f, 0x79d4,
+};
+
+static int
+big5hkscs_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c1 = s[0];
+  if ((c1 >= 0x81 && c1 <= 0xfe)) {
+    if (n >= 2) {
+      unsigned char c2 = s[1];
+      if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0xa1 && c2 < 0xff)) {
+        unsigned int i = 157 * (c1 - 0x81) + (c2 - (c2 >= 0xa1 ? 0x62 : 0x40));
+        unsigned short wc = 0xfffd;
+        {
+          if (i < 19782)
+            wc = big5hkscs_2uni_page81[i];
+        }
+        if (wc != 0xfffd) {
+          *pwc = (ucs4_t) wc;
+          return 2;
+        }
+      }
+      return RET_ILSEQ;
+    }
+    return RET_TOOFEW(0);
+  }
+  return RET_ILSEQ;
+}
+
+static const unsigned short big5hkscs_2charset[23202] = {
+  0xa246, 0xa247, 0xa244, 0xa1b1, 0xc6d8, 0xa1c2, 0xa258, 0xa1d3,
+  0xa1a6, 0xa367, 0xa150, 0xa14d, 0x8859, 0x8857, 0x885d, 0x885b,
+  0x8866, 0x8861, 0x885f, 0xa1d1, 0x886a, 0x8868, 0x886f, 0x886d,
+  0x88a7, 0x8873, 0x8871, 0x8877, 0x8875, 0xa1d2, 0xc8fb, 0x887b,
+  0x8879, 0x88a2, 0x8856, 0x8867, 0x885a, 0x886c, 0x885c, 0x886e,
+  0x8870, 0xc8fc, 0x885e, 0x8874, 0xc8fa, 0x8878, 0x8858, 0x8869,
+  0x8872, 0x8860, 0x8876, 0x887a, 0x887c, 0x887d, 0x887e, 0x88a1,
+  0xc8f6, 0x886b, 0xc8f8, 0xc8f7, 0x88a8, 0xc8fe, 0xc8f9, 0xc8f5,
+  0xc8fd, 0xc6d9, 0xa3be, 0xa3bc, 0xa3bd, 0xa3bf, 0xa1c5, 0xa3bb,
+  0xa1c2, 0xa344, 0xa345, 0xa346, 0xa347, 0xa348, 0xa349, 0xa34a,
+  0xa34b, 0xa34c, 0xa34d, 0xa34e, 0xa34f, 0xa350, 0xa351, 0xa352,
+  0xa353, 0xa354, 0xa355, 0xa356, 0xa357, 0xa358, 0xa359, 0xa35a,
+  0xa35b, 0xa35c, 0xa35d, 0xa35e, 0xa35f, 0xa360, 0xa361, 0xa362,
+  0xa363, 0xa364, 0xa365, 0xa366, 0xa367, 0xa368, 0xa369, 0xa36a,
+  0xa36b, 0xa36c, 0xa36d, 0xa36e, 0xa36f, 0xa370, 0xa371, 0xa372,
+  0xa373, 0xc7f9, 0xc7f3, 0xc7f4, 0xc7f5, 0xc7f6, 0xc7f7, 0xc7f8,
+  0xc7fa, 0xc7fb, 0xc7fc, 0xc7fd, 0xc7fe, 0xc840, 0xc841, 0xc842,
+  0xc843, 0xc844, 0xc845, 0xc846, 0xc847, 0xc848, 0xc849, 0xc84a,
+  0xc84b, 0xc84c, 0xc84d, 0xc84e, 0xc84f, 0xc850, 0xc851, 0xc852,
+  0xc853, 0xc854, 0xc855, 0xc856, 0xc857, 0xc858, 0xc859, 0xc85a,
+  0xc85c, 0xc85d, 0xc85e, 0xc85f, 0xc860, 0xc861, 0xc862, 0xc863,
+  0xc864, 0xc865, 0xc866, 0xc867, 0xc868, 0xc869, 0xc86a, 0xc86b,
+  0xc86c, 0xc86d, 0xc86e, 0xc86f, 0xc870, 0xc871, 0xc872, 0xc873,
+  0xc874, 0xc875, 0xc85b, 0x8863, 0x88a4, 0x8865, 0x88a6, 0xa156,
+  0xa158, 0xa277, 0xa1fc, 0xa1a5, 0xa1a6, 0xa1a7, 0xa1a8, 0xa145,
+  0xa3bb, 0xa14c, 0xa14b, 0xa145, 0xa1ac, 0xa1b2, 0xa1ab, 0xa1b0,
+  0xa1c3, 0xa24a, 0xa1c1, 0xa24b, 0xc8d2, 0xc8d3, 0xa2b9, 0xa2ba,
+  0xa2bb, 0xa2bc, 0xa2bd, 0xa2be, 0xa2bf, 0xa2c0, 0xa2c1, 0xa2c2,
+  0xc6b5, 0xc6b6, 0xc6b7, 0xc6b8, 0xc6b9, 0xc6ba, 0xc6bb, 0xc6bc,
+  0xc6bd, 0xc6be, 0xa1f6, 0xa1f4, 0xa1f7, 0xa1f5, 0xa1f8, 0xa1f9,
+  0xa1fb, 0xa1fa, 0xc877, 0xc878, 0xc876, 0xa241, 0xa242, 0xa258,
+  0xa1d4, 0xa1db, 0xa1e8, 0xa1e7, 0xa1fd, 0xa1fc, 0xa1e4, 0xa1e5,
+  0xa1ec, 0xa1ed, 0xa1ef, 0xa1ee, 0xa1dc, 0xa1da, 0xa1dd, 0xa1dd,
+  0xa1d8, 0xa1d9, 0xa1f2, 0xa1f3, 0xa1e6, 0xa1e9, 0xa15b, 0xc6a1,
+  0xc6a2, 0xc6a3, 0xc6a4, 0xc6a5, 0xc6a6, 0xc6a7, 0xc6a8, 0xc6a9,
+  0xc6aa, 0xc6ab, 0xc6ac, 0xc6ad, 0xc6ae, 0xc6af, 0xc6b0, 0xc6b1,
+  0xc6b2, 0xc6b3, 0xc6b4, 0xa277, 0xa278, 0xa27a, 0xa27b, 0xa27c,
+  0xa27d, 0xa275, 0xa274, 0xa273, 0xa272, 0xa271, 0xf9f9, 0xf9f8,
+  0xf9e6, 0xf9ef, 0xf9dd, 0xf9e8, 0xf9f1, 0xf9df, 0xf9ec, 0xf9f5,
+  0xf9e3, 0xf9ee, 0xf9f7, 0xf9e5, 0xf9e9, 0xf9f2, 0xf9e0, 0xf9eb,
+  0xf9f4, 0xf9e2, 0xf9e7, 0xf9f0, 0xf9de, 0xf9ed, 0xf9f6, 0xf9e4,
+  0xf9ea, 0xf9f3, 0xf9e1, 0xf9fa, 0xf9fb, 0xf9fd, 0xf9fc, 0xa2ac,
+  0xa2ad, 0xa2ae, 0xa15a, 0xa262, 0xa263, 0xa264, 0xa265, 0xa266,
+  0xa267, 0xa268, 0xa269, 0xa270, 0xa26f, 0xa26e, 0xa26d, 0xa26c,
+  0xa26b, 0xa26a, 0xf9fe, 0xa276, 0xa279, 0xa1bd, 0xa1bc, 0xa1b6,
+  0xa1b5, 0xa1bf, 0xa1be, 0xa1bb, 0xa1ba, 0xa1b3, 0xa1b7, 0xa1b4,
+  0xa2a8, 0xa2a9, 0xa2ab, 0xa2aa, 0xa1b9, 0xa1b8, 0xa1f3, 0xa1f0,
+  0xa1f2, 0xa1f1, 0xc6e6, 0xc8d6, 0xc8d7, 0xc8d8, 0xc8d9, 0xc8da,
+  0xc8db, 0xc8dc, 0xc8dd, 0xc8de, 0xc8df, 0xc8e0, 0xc8e1, 0xc8e2,
+  0xc8e3, 0xc8e4, 0xc8e5, 0xc8e6, 0xc8e7, 0xc8e8, 0xc8e9, 0xc8ea,
+  0xc8eb, 0xc8ec, 0xc8ed, 0xc8ee, 0xc8ef, 0xc8f0, 0xc8f1, 0xc6cd,
+  0xa140, 0xa142, 0xa143, 0xa1b2, 0xc6e0, 0xc6e1, 0xc6e2, 0xa171,
+  0xa172, 0xa16d, 0xa16e, 0xa175, 0xa176, 0xa179, 0xa17a, 0xa169,
+  0xa16a, 0xa245, 0xa165, 0xa166, 0xa1e3, 0xa1a9, 0xa1aa, 0xa2c3,
+  0xa2c4, 0xa2c5, 0xa2c6, 0xa2c7, 0xa2c8, 0xa2c9, 0xa2ca, 0xa2cb,
+  0xa1ca, 0xc6e7, 0xc6e8, 0xc6e9, 0xc6ea, 0xc6eb, 0xc6ec, 0xc6ed,
+  0xc6ee, 0xc6ef, 0xc6f0, 0xc6f1, 0xc6f2, 0xc6f3, 0xc6f4, 0xc6f5,
+  0xc6f6, 0xc6f7, 0xc6f8, 0xc6f9, 0xc6fa, 0xc6fb, 0xc6fc, 0xc6fd,
+  0xc6fe, 0xc740, 0xc741, 0xc742, 0xc743, 0xc744, 0xc745, 0xc746,
+  0xc747, 0xc748, 0xc749, 0xc74a, 0xc74b, 0xc74c, 0xc74d, 0xc74e,
+  0xc74f, 0xc750, 0xc751, 0xc752, 0xc753, 0xc754, 0xc755, 0xc756,
+  0xc757, 0xc758, 0xc759, 0xc75a, 0xc75b, 0xc75c, 0xc75d, 0xc75e,
+  0xc75f, 0xc760, 0xc761, 0xc762, 0xc763, 0xc764, 0xc765, 0xc766,
+  0xc767, 0xc768, 0xc769, 0xc76a, 0xc76b, 0xc76c, 0xc76d, 0xc76e,
+  0xc76f, 0xc770, 0xc771, 0xc772, 0xc773, 0xc774, 0xc775, 0xc776,
+  0xc777, 0xc778, 0xc779, 0xc77a, 0xc8d4, 0xc8d5, 0xc6dc, 0xc6dd,
+  0xc77b, 0xc77c, 0xc77d, 0xc77e, 0xc7a1, 0xc7a2, 0xc7a3, 0xc7a4,
+  0xc7a5, 0xc7a6, 0xc7a7, 0xc7a8, 0xc7a9, 0xc7aa, 0xc7ab, 0xc7ac,
+  0xc7ad, 0xc7ae, 0xc7af, 0xc7b0, 0xc7b1, 0xc7b2, 0xc7b3, 0xc7b4,
+  0xc7b5, 0xc7b6, 0xc7b7, 0xc7b8, 0xc7b9, 0xc7ba, 0xc7bb, 0xc7bc,
+  0xc7bd, 0xc7be, 0xc7bf, 0xc7c0, 0xc7c1, 0xc7c2, 0xc7c3, 0xc7c4,
+  0xc7c5, 0xc7c6, 0xc7c7, 0xc7c8, 0xc7c9, 0xc7ca, 0xc7cb, 0xc7cc,
+  0xc7cd, 0xc7ce, 0xc7cf, 0xc7d0, 0xc7d1, 0xc7d2, 0xc7d3, 0xc7d4,
+  0xc7d5, 0xc7d6, 0xc7d7, 0xc7d8, 0xc7d9, 0xc7da, 0xc7db, 0xc7dc,
+  0xc7dd, 0xc7de, 0xc7df, 0xc7e0, 0xc7e1, 0xc7e2, 0xc7e3, 0xc7e4,
+  0xc7e5, 0xc7e6, 0xc7e7, 0xc7e8, 0xc7e9, 0xc7ea, 0xc7eb, 0xc7ec,
+  0xc7ed, 0xc7ee, 0xc7ef, 0xc7f0, 0xc7f1, 0xc7f2, 0xc6e3, 0xc6da,
+  0xc6db, 0xa374, 0xa375, 0xa376, 0xa377, 0xa378, 0xa379, 0xa37a,
+  0xa37b, 0xa37c, 0xa37d, 0xa37e, 0xa3a1, 0xa3a2, 0xa3a3, 0xa3a4,
+  0xa3a5, 0xa3a6, 0xa3a7, 0xa3a8, 0xa3a9, 0xa3aa, 0xa3ab, 0xa3ac,
+  0xa3ad, 0xa3ae, 0xa3af, 0xa3b0, 0xa3b1, 0xa3b2, 0xa3b3, 0xa3b4,
+  0xa3b5, 0xa3b6, 0xa3b7, 0xa3b8, 0xa3b9, 0xa3ba, 0xa440, 0xa447,
+  0xa454, 0xa57c, 0xa457, 0xa4a4, 0xa455, 0xa5d2, 0xa441, 0xa4fe,
+  0xa442, 0xa4d1, 0xa661, 0xa448, 0xa440, 0xa447, 0xa454, 0xa57c,
+  0xa4ad, 0xa4bb, 0xa443, 0xa44b, 0xa445, 0xa451, 0xa4eb, 0xa4f5,
+  0xa4f4, 0xa4ec, 0xaaf7, 0xa467, 0xa4e9, 0xc8d1, 0xa6b3, 0xaac0,
+  0xa657, 0xaf53, 0xb05d, 0xafac, 0xb3d2, 0xa54e, 0xa949, 0xbec7,
+  0xbaca, 0xa5f8, 0xb8ea, 0xa8f3, 0xb2bd, 0xa5f0, 0xa6db, 0xa6dc,
+  0xa440, 0xa447, 0xa454, 0xa57c, 0xa4ad, 0xa4bb, 0xa443, 0xa44b,
+  0xa445, 0xa451, 0xa4eb, 0xa4f5, 0xa4f4, 0xa4ec, 0xaaf7, 0xa467,
+  0xa4e9, 0xaee8, 0xa6b3, 0xaac0, 0xa657, 0xaf53, 0xb05d, 0xafac,
+  0xb3d2, 0xafb5, 0xa86b, 0xa46b, 0xbe41, 0xc075, 0xa64c, 0xaa60,
+  0xb6b5, 0xa5f0, 0xbc67, 0xa1c0, 0xa457, 0xa4a4, 0xa455, 0xa5aa,
+  0xa56b, 0xc2e5, 0xa976, 0xbec7, 0xbaca, 0xa5f8, 0xb8ea, 0xa8f3,
+  0xa95d, 0xa255, 0xa256, 0xa250, 0xa251, 0xa252, 0xa254, 0xa257,
+  0xa253, 0xa1eb, 0xa1ea, 0xa24f, 0x9277, 0x96df, 0x89d5, 0x93cd,
+  0x9bdf, 0xfa68, 0x89da, 0x8f59, 0x89db, 0x8f5d, 0x89dc, 0x96f7,
+  0x8ada, 0x8bdc, 0x97db, 0x9e53, 0x9daa, 0x9bea, 0x8a6e, 0x8bc8,
+  0x89e8, 0x89ea, 0x8c4b, 0xfb70, 0x89ed, 0x94dd, 0x89ee, 0x9eb4,
+  0x8ad3, 0x92db, 0x94db, 0x89f9, 0xfb7a, 0x89fb, 0x9efc, 0x89fc,
+  0x89bf, 0x89fe, 0x89e6, 0x9d46, 0x9dee, 0xa07e, 0xa068, 0x98e9,
+  0x8b68, 0x8dfd, 0x8bbe, 0x9fd9, 0x8aeb, 0x9fd7, 0x8b6a, 0x9c5c,
+  0x8bb1, 0xfb5e, 0x9df3, 0xa0d0, 0xfc66, 0x92e9, 0x9aec, 0x8fab,
+  0xfa48, 0x8e45, 0x9c6f, 0x9ede, 0x89ef, 0x96e9, 0x9ebb, 0x94de,
+  0x9eb8, 0x97ba, 0xfb65, 0x95d6, 0x9cbb, 0x97da, 0x8f45, 0xfb7d,
+  0x9158, 0xfe64, 0x9856, 0x9b4d, 0x935b, 0x95c7, 0x97e7, 0x9359,
+  0x91f5, 0x97b8, 0xfda2, 0xfbb6, 0x92fa, 0x9357, 0x8ba6, 0xfbb9,
+  0x97b0, 0xfdc4, 0x9ca1, 0x91f2, 0x91f9, 0x8ff1, 0x9745, 0x9853,
+  0xfe78, 0xfbc1, 0x9251, 0x9dad, 0xfd6c, 0xfa6b, 0x9bc2, 0x9a7b,
+  0x8b60, 0x934b, 0x9abd, 0x91b7, 0x95b4, 0xfec5, 0x9ef0, 0x8d64,
+  0x9269, 0x8d67, 0xfbea, 0xfbef, 0x8d68, 0x93eb, 0xfc42, 0x9166,
+  0xfacd, 0x93dd, 0x8bcc, 0x8d6d, 0x8d6e, 0x96a8, 0xfca6, 0x8d6f,
+  0x8d70, 0xfc64, 0x9060, 0x8d74, 0x97c3, 0x8ad0, 0x9274, 0x9bbe,
+  0x9cc8, 0x9cba, 0x8d78, 0x9eb9, 0x955a, 0x91b4, 0x8a48, 0x8d7d,
+  0x8a7d, 0x8ac2, 0xfd4a, 0x8da1, 0x8ad1, 0xfcb4, 0x8b47, 0x93a4,
+  0x9eda, 0x8a51, 0x8da6, 0x9ec5, 0xfcc4, 0xa078, 0x94b5, 0xfcc2,
+  0x8a6b, 0x8dab, 0xfae8, 0x8dad, 0xfc49, 0x93c1, 0x906f, 0x8db0,
+  0x947e, 0x90fa, 0x9479, 0x8db2, 0xfcee, 0x997b, 0x8db4, 0x8db7,
+  0x91b3, 0x8dbb, 0x8dba, 0x8dbc, 0x9044, 0xfd4c, 0x93e4, 0x93e0,
+  0xfd53, 0x8dc3, 0x9bb8, 0xfbf0, 0x93e9, 0x93f6, 0x8dc5, 0x8dca,
+  0x8dcc, 0xfd5d, 0x93b5, 0xfd61, 0x9cf8, 0x9252, 0xa0e8, 0x9ca5,
+  0x8c56, 0x8dd6, 0x97c0, 0xa0de, 0x97d2, 0xfaa5, 0xfda3, 0x8ddb,
+  0x8eaf, 0x91b5, 0xfd49, 0xfdd1, 0x8deb, 0x97c6, 0xfdce, 0x90fc,
+  0xfc59, 0x96d6, 0x97c5, 0x8def, 0x97d7, 0x8df0, 0x96a6, 0xfbbf,
+  0x8df3, 0x9449, 0x8df5, 0x9872, 0x8e6b, 0xfafd, 0x8f50, 0x9dcc,
+  0xfc65, 0x8c44, 0x996e, 0x94a1, 0x8f63, 0xa0da, 0x9253, 0xfde9,
+  0x9db5, 0x9879, 0x9d5d, 0x8d63, 0x9669, 0x9f70, 0xfc6a, 0x8ac7,
+  0x89d7, 0xfe4d, 0x9edd, 0xfefb, 0x98bc, 0xfacc, 0x95b0, 0x9464,
+  0x936f, 0x94b9, 0x95ec, 0x91ee, 0x98c3, 0x95f6, 0x8ffd, 0x98c5,
+  0x9766, 0xfe6e, 0x97dd, 0x8caa, 0x92d2, 0x9761, 0x98cb, 0x95f0,
+  0x975d, 0x91e3, 0x98cc, 0x9469, 0x98cd, 0x98ce, 0x95fc, 0x94a3,
+  0x9662, 0xfeb6, 0x9463, 0x98d0, 0x98d1, 0x9475, 0xfae0, 0x9472,
+  0x98d6, 0x8af0, 0x98d9, 0x98db, 0x98dd, 0x98a8, 0x8a6d, 0x8afb,
+  0x8aae, 0xfbc9, 0x8c5d, 0x98e4, 0x98e6, 0x98e8, 0x8a4d, 0x9257,
+  0x95df, 0xa0ac, 0x98eb, 0x98ec, 0x8cc3, 0x98f4, 0x8ab8, 0x9ee7,
+  0x94bc, 0xfcd1, 0x9cc6, 0x9e7e, 0x98fe, 0xfde8, 0x9940, 0x94c9,
+  0x94d3, 0x9946, 0x90c0, 0x94d1, 0x9573, 0x93c2, 0x9948, 0x994b,
+  0x8e55, 0x994e, 0x8efe, 0x8e59, 0x94ec, 0x94ef, 0x8c60, 0x8f74,
+  0x9955, 0x9544, 0x8ccb, 0x9956, 0x9959, 0x995b, 0x8cc4, 0xfa45,
+  0x90b7, 0x9743, 0x95cd, 0x97c9, 0xfd50, 0x8eb9, 0x95c6, 0x9967,
+  0x8ab9, 0x8dfc, 0x8a76, 0x9d51, 0x9973, 0x9d4f, 0x997a, 0x9564,
+  0x99a1, 0x99a5, 0x99a7, 0x8eed, 0x99ad, 0x946e, 0x8f70, 0xfad0,
+  0x99b3, 0xa053, 0x965c, 0xfd7a, 0x97fe, 0x92bd, 0x97fd, 0x8f64,
+  0xfcf7, 0x9562, 0x97cd, 0x9e64, 0x924c, 0x8ec9, 0x99bc, 0x9da5,
+  0x8f54, 0x8f7c, 0x8ea2, 0x8f7a, 0x97ae, 0x96c8, 0x99c3, 0x90d6,
+  0x9cbe, 0x8f76, 0x9470, 0xfb4b, 0xfdca, 0x8ec7, 0xa0f9, 0x8fa9,
+  0x99c7, 0x90d7, 0x9edf, 0x99ce, 0x8fba, 0x8feb, 0x99cf, 0x8fc2,
+  0x92c9, 0x97dc, 0x95b3, 0x9c79, 0x95b2, 0x8fdb, 0x9be3, 0x9e7a,
+  0x9bee, 0x99de, 0xfafa, 0x9ee5, 0x8a52, 0x99e1, 0x8a67, 0x8bb5,
+  0x8aac, 0x99e9, 0xfbca, 0x97de, 0x95d1, 0x99f5, 0xfc4a, 0x9ba9,
+  0xfbdc, 0xfe56, 0x9ea4, 0x9d49, 0x95db, 0x89c5, 0x99f8, 0x9664,
+  0x9055, 0x96d4, 0x977c, 0x964d, 0x97e1, 0x9a48, 0x9a49, 0xfe7d,
+  0x90aa, 0x9a50, 0x9347, 0x8ed8, 0x90c9, 0x9a55, 0x90bc, 0x9a58,
+  0x8bb8, 0x90d5, 0x9641, 0x9a5a, 0x9a5c, 0x97c2, 0x8abb, 0x9baa,
+  0x90f5, 0x9a60, 0x9145, 0x8c58, 0x9a63, 0x8c49, 0x8bb6, 0xfccf,
+  0x966b, 0x9a6e, 0x914f, 0x9746, 0xa0e6, 0x92d7, 0x9675, 0x93d4,
+  0x91bb, 0x9679, 0x9a70, 0x9678, 0x91cd, 0x9c4a, 0xa06f, 0xa06a,
+  0x915f, 0x9fa5, 0x89ba, 0x9ecd, 0x9a79, 0x9dce, 0x8cd2, 0x9d73,
+  0x96b9, 0x96bc, 0x9cd1, 0x89b7, 0x9eee, 0xfb43, 0x9ec9, 0xfbd3,
+  0x91ae, 0x9d78, 0x9d7b, 0xa440, 0xa442, 0xa443, 0x9eb3, 0xc945,
+  0xa456, 0xa454, 0xa457, 0xa455, 0xc946, 0xa4a3, 0xc94f, 0xc94d,
+  0xa4a2, 0xa4a1, 0xa542, 0xa541, 0xa540, 0xa543, 0xa4fe, 0x9eb2,
+  0x9dd6, 0xa5e0, 0xa5e1, 0x994f, 0x89ce, 0xa8c3, 0x8bc0, 0x9fc4,
+  0xa458, 0x8bd4, 0xa4a4, 0xc950, 0x8c72, 0xa4a5, 0xc963, 0xa6ea,
+  0xcbb1, 0xc6bf, 0x8bf9, 0xa459, 0xa4a6, 0xa544, 0xc964, 0x8946,
+  0xc6c0, 0xc940, 0xa444, 0xa45b, 0xc947, 0xa45c, 0xfae5, 0xa4a7,
+  0xa545, 0xa547, 0xa546, 0xa5e2, 0xa5e3, 0xa8c4, 0xadbc, 0xa441,
+  0xc87b, 0x8bc6, 0xc941, 0xa445, 0xa45e, 0xa45d, 0xa5e4, 0x9c57,
+  0xa8c5, 0x9afb, 0xb0ae, 0xd44b, 0x89d0, 0x89cf, 0xb6c3, 0xdcb1,
+  0xdcb2, 0xc6c1, 0xa446, 0x89d1, 0xa4a9, 0x89e2, 0xa8c6, 0xa447,
+  0xc948, 0xa45f, 0xa4aa, 0xa4ac, 0xc951, 0xa4ad, 0xa4ab, 0x927e,
+  0xa5e5, 0x9dba, 0xa8c7, 0xa8c8, 0xab45, 0xc6c2, 0xa460, 0xa4ae,
+  0x8c6f, 0xa5e6, 0xa5e8, 0xa5e7, 0xa6eb, 0xa8c9, 0xa8ca, 0xab46,
+  0xab47, 0xadbd, 0xdcb3, 0xfbf8, 0xf6d6, 0xa448, 0x8bc7, 0x926b,
+  0x89d2, 0xa4b0, 0xa4af, 0xc952, 0xa4b1, 0xa4b7, 0xa4b2, 0xa4b3,
+  0xc954, 0xc953, 0xa4b5, 0xa4b6, 0xa4b4, 0x9fcf, 0xa54a, 0xa54b,
+  0xa54c, 0xa54d, 0xa549, 0xa550, 0xc96a, 0xc966, 0xc969, 0xa551,
+  0xa561, 0xc968, 0xa54e, 0xa54f, 0xa548, 0xc965, 0xc967, 0x9da9,
+  0x89d3, 0x99e2, 0xa5f5, 0xc9b0, 0xa5f2, 0xa5f6, 0xc9ba, 0xc9ae,
+  0xa5f3, 0xc9b2, 0x9267, 0xa5f4, 0xa5f7, 0xa5e9, 0xc9b1, 0xa5f8,
+  0xc9b5, 0x92a4, 0xc9b9, 0xc9b6, 0xc9b3, 0xa5ea, 0xa5ec, 0xa5f9,
+  0xa5ee, 0xc9ab, 0xa5f1, 0xa5ef, 0xa5f0, 0xc9bb, 0xc9b8, 0xc9af,
+  0xa5ed, 0x8c73, 0xc9ac, 0xa5eb, 0x894e, 0xc9b4, 0xc9b7, 0x894f,
+  0x9278, 0xc9ad, 0xca66, 0xa742, 0xa6f4, 0x91b6, 0xca67, 0xa6f1,
+  0xa744, 0x89d4, 0xa6f9, 0x9fd2, 0xa6f8, 0xca5b, 0xa6fc, 0xa6f7,
+  0xca60, 0xca68, 0xca64, 0x92a7, 0xa6fa, 0x95a2, 0xa6fd, 0xa6ee,
+  0xa747, 0xca5d, 0x926e, 0xcbbd, 0xa6ec, 0xa743, 0xa6ed, 0xa6f5,
+  0xa6f6, 0xca62, 0xca5e, 0xa6fb, 0xa6f3, 0xca5a, 0xa6ef, 0xca65,
+  0xa745, 0xa748, 0xa6f2, 0xa740, 0xa746, 0xa6f0, 0xca63, 0xa741,
+  0xca69, 0xca5c, 0xa6fe, 0xca5f, 0xca61, 0xa8d8, 0xcbbf, 0xcbcb,
+  0xa8d0, 0xcbcc, 0xa8cb, 0xa8d5, 0x96ea, 0xa8ce, 0xcbb9, 0xa8d6,
+  0xcbb8, 0xcbbc, 0xcbc3, 0xcbc1, 0xa8de, 0xa8d9, 0xcbb3, 0xcbb5,
+  0xa8db, 0xa8cf, 0xcbb6, 0xcbc2, 0xcbc9, 0xa8d4, 0xcbbb, 0xcbb4,
+  0xa8d3, 0xcbb7, 0xa8d7, 0xcbba, 0x926f, 0xa8d2, 0xa8cd, 0xa8dc,
+  0xcbc4, 0xa8dd, 0xcbc8, 0xcbc6, 0xcbca, 0xa8da, 0xcbbe, 0xcbb2,
+  0xcbc0, 0xa8d1, 0xcbc5, 0xa8cc, 0xcbc7, 0x92a3, 0x8950, 0xfa57,
+  0xab56, 0xab4a, 0x9866, 0xcde0, 0xcde8, 0xab49, 0xab51, 0xab5d,
+  0xcdee, 0xcdec, 0xcde7, 0x89d6, 0xab4b, 0xcded, 0xcde3, 0xab59,
+  0xab50, 0xab58, 0xcdde, 0xcdea, 0x98b2, 0xcde1, 0xab54, 0xcde2,
+  0x92ab, 0xcddd, 0xab5b, 0xab4e, 0xab57, 0xab4d, 0xcddf, 0xcde4,
+  0xcdeb, 0xab55, 0xab52, 0xcde6, 0xab5a, 0xcde9, 0xcde5, 0xab4f,
+  0xab5c, 0xab53, 0xab4c, 0xab48, 0x96de, 0x92ac, 0xcdef, 0xadd7,
+  0xadc1, 0x8c70, 0xadd1, 0x9f6e, 0xadd6, 0xd0d0, 0xd0cf, 0xd0d4,
+  0xd0d5, 0xadc4, 0x8ef2, 0xadcd, 0x9f6c, 0xadda, 0xadce, 0x89d8,
+  0xd0c9, 0xadc7, 0xd0ca, 0xfa59, 0xaddc, 0xadd3, 0xadbe, 0xadbf,
+  0xd0dd, 0xb0bf, 0xadcc, 0xadcb, 0xd0cb, 0xadcf, 0xd45b, 0xadc6,
+  0xd0d6, 0xadd5, 0xadd4, 0xadca, 0xd0ce, 0xd0d7, 0xd0c8, 0xadc9,
+  0xd0d8, 0xadd2, 0xd0cc, 0xadc0, 0xadc3, 0xadc2, 0xd0d9, 0xadd0,
+  0xadc5, 0xadd9, 0xaddb, 0xd0d3, 0xadd8, 0x92a8, 0xd0db, 0xd0cd,
+  0xd0dc, 0xd0d1, 0x9163, 0xd0da, 0xd0d2, 0x8c40, 0xadc8, 0xd463,
+  0xd457, 0xb0b3, 0xd45c, 0xd462, 0xb0b2, 0xd455, 0xb0b6, 0xd459,
+  0xd452, 0xb0b4, 0xd456, 0xb0b9, 0xb0be, 0xd467, 0xd451, 0xb0ba,
+  0x9f73, 0xd466, 0x92ad, 0xb0b5, 0xd458, 0xb0b1, 0xd453, 0xd44f,
+  0xd45d, 0xd450, 0xd44e, 0xd45a, 0xd460, 0xd461, 0xb0b7, 0x9be9,
+  0xd85b, 0xd45e, 0xd44d, 0xd45f, 0x92a9, 0xb0c1, 0xd464, 0xb0c0,
+  0xd44c, 0xd454, 0xd465, 0xb0bc, 0xb0bb, 0xb0b8, 0xb0bd, 0xb0af,
+  0xb0b0, 0xb3c8, 0x92aa, 0xd85e, 0xd857, 0xb3c5, 0xd85f, 0x89d9,
+  0xd855, 0xd858, 0xb3c4, 0xd859, 0xfd56, 0xb3c7, 0xd85d, 0xd853,
+  0xd852, 0xb3c9, 0xb3ca, 0xb3c6, 0xb3cb, 0xd851, 0xd85c, 0xd85a,
+  0xd854, 0xb3c3, 0xd856, 0x9fa8, 0xb6ca, 0xb6c4, 0xdcb7, 0xb6cd,
+  0xdcbd, 0xdcc0, 0xb6c6, 0xb6c7, 0xdcba, 0xb6c5, 0xdcc3, 0xb6cb,
+  0xdcc4, 0xdcbf, 0xb6cc, 0x8c71, 0xdcb4, 0xb6c9, 0xdcb5, 0xdcbe,
+  0xdcbc, 0xdcb8, 0xb6c8, 0xdcb6, 0xb6ce, 0xdcbb, 0xdcc2, 0xdcb9,
+  0xdcc1, 0x92a1, 0xb9b6, 0xb9b3, 0x90e3, 0xb9b4, 0xe0f9, 0xe0f1,
+  0xb9b2, 0xb9af, 0xe0f2, 0xa0a6, 0xb9b1, 0xe0f5, 0xe0f7, 0x94ab,
+  0xe0fe, 0xfc72, 0xe0fd, 0xe0f8, 0xb9ae, 0xe0f0, 0xb9ac, 0xe0f3,
+  0xb9b7, 0xe0f6, 0xe0fa, 0xb9b0, 0xb9ad, 0xe0fc, 0xe0fb, 0xb9b5,
+  0xe0f4, 0x97c4, 0xbbf8, 0xe4ec, 0xe4e9, 0xbbf9, 0xbbf7, 0x92ae,
+  0xe4f0, 0xe4ed, 0xe4e6, 0xbbf6, 0xfa67, 0xbbfa, 0xe4e7, 0xbbf5,
+  0xbbfd, 0xe4ea, 0xe4eb, 0xbbfb, 0xbbfc, 0xe4f1, 0xe4ee, 0xe4ef,
+  0x92a2, 0xfa69, 0xbeaa, 0xe8f8, 0xbea7, 0xe8f5, 0xbea9, 0xbeab,
+  0xe8f6, 0xbea8, 0xe8f7, 0xe8f4, 0xc076, 0xecbd, 0xc077, 0xecbb,
+  0xecbc, 0xecba, 0xecb9, 0xecbe, 0xc075, 0x9268, 0xefb8, 0xefb9,
+  0xe4e8, 0xefb7, 0xc078, 0xc35f, 0xf1eb, 0xf1ec, 0xc4d7, 0xc4d8,
+  0xf5c1, 0xf5c0, 0xc56c, 0xc56b, 0xf7d0, 0xa449, 0xa461, 0xa4b9,
+  0xa4b8, 0xa553, 0xa552, 0xa5fc, 0xa5fb, 0xa5fd, 0xa5fa, 0xa74a,
+  0xa749, 0xa74b, 0xa8e0, 0xa8df, 0xa8e1, 0x8951, 0xab5e, 0xa259,
+  0xd0de, 0xa25a, 0xb0c2, 0xa25c, 0xa25b, 0xd860, 0xfa6f, 0xa25d,
+  0xb9b8, 0xa25e, 0xa44a, 0xa4ba, 0xa5fe, 0xa8e2, 0xfa71, 0xa44b,
+  0xa4bd, 0xa4bb, 0xa4bc, 0xa640, 0x8952, 0xa74c, 0xa8e4, 0xa8e3,
+  0xa8e5, 0x945a, 0xaddd, 0xbeac, 0xc6c3, 0x89dd, 0xc94e, 0xc8a2,
+  0xa554, 0xa555, 0xa641, 0xca6a, 0xab60, 0xab5f, 0xd0e0, 0xd0df,
+  0xb0c3, 0xc6c4, 0xa4be, 0xc955, 0x9e52, 0x8953, 0xcbcd, 0xab61,
+  0xade0, 0xadde, 0xaddf, 0x9e55, 0x92ba, 0xbead, 0xc6c5, 0xa556,
+  0x8c5b, 0xa642, 0xc9bc, 0xfa7d, 0xfaa8, 0x9a68, 0xfa47, 0xa74d,
+  0xa74e, 0xfa7e, 0xca6b, 0xcbce, 0xa8e6, 0xcbcf, 0x92bb, 0xd0e2,
+  0xd0e3, 0xade3, 0xfdb6, 0xd0e4, 0xfaa2, 0xd0e1, 0xade4, 0xade2,
+  0xade1, 0xd0e5, 0xfaa3, 0xd468, 0xfaa4, 0x9bb4, 0xfaa6, 0xd861,
+  0xdcc5, 0xe140, 0x89df, 0xbbfe, 0xbeae, 0xe8f9, 0xfddb, 0xa44c,
+  0xa45a, 0xfaa9, 0x8954, 0xfaab, 0xb0c4, 0xb3cd, 0xb9b9, 0xfc7a,
+  0xc942, 0xa4bf, 0xa559, 0xa557, 0xa558, 0x89e0, 0xa8e7, 0x9f4f,
+  0xa44d, 0xa44e, 0xc87d, 0xa462, 0x89e1, 0xa4c0, 0xa4c1, 0xa4c2,
+  0xc9be, 0xa55a, 0xfab0, 0xc96b, 0xa646, 0xc9bf, 0xa644, 0xa645,
+  0xc9bd, 0xa647, 0xa643, 0xca6c, 0xaaec, 0xca6d, 0x9fcd, 0xa0e7,
+  0xca6e, 0xa750, 0xa74f, 0xfab1, 0x89a6, 0xa753, 0xa751, 0xa752,
+  0xa8ed, 0xa8ec, 0xcbd4, 0xcbd1, 0xcbd2, 0x9efa, 0xcbd0, 0xa8ee,
+  0xa8ea, 0xa8e9, 0xa8eb, 0xa8e8, 0xfab2, 0xa8ef, 0xab63, 0xcdf0,
+  0xcbd3, 0xab68, 0xcdf1, 0xab64, 0xab67, 0xab66, 0xab65, 0xab62,
+  0xd0e8, 0xade7, 0xd0eb, 0xade5, 0xfab4, 0x92c4, 0xd0e7, 0xade8,
+  0xade6, 0xade9, 0xd0e9, 0xd0ea, 0x9f6f, 0xd0e6, 0xd0ec, 0x8bb0,
+  0xb3d1, 0xb0c5, 0xd469, 0xd46b, 0xd46a, 0xd46c, 0xb0c6, 0xb3ce,
+  0x9fac, 0xb3cf, 0xb3d0, 0xb6d0, 0xdcc7, 0x89e3, 0xdcc6, 0xdcc8,
+  0xdcc9, 0xb6d1, 0xb6cf, 0xe141, 0xe142, 0xb9bb, 0xb9ba, 0xe35a,
+  0xbc40, 0xbc41, 0xbc42, 0xbc44, 0xe4f2, 0xe4f3, 0xbc43, 0x9bd3,
+  0x89e4, 0xbeaf, 0xbeb0, 0xfab5, 0xf1ed, 0xf5c3, 0xf5c2, 0xf7d1,
+  0x9fd5, 0xa44f, 0xa55c, 0xa55b, 0x8955, 0xa648, 0x92c5, 0xc9c0,
+  0x8956, 0xa755, 0xa756, 0xa754, 0xa757, 0xca6f, 0xca70, 0xfab3,
+  0xfab6, 0xa8f1, 0xcbd5, 0xa8f0, 0xcdf2, 0xab6c, 0xcdf3, 0xab6b,
+  0xfab7, 0xab69, 0xab6a, 0x9edc, 0xd0ed, 0xfbc4, 0x9f71, 0xb0c7,
+  0xd46e, 0xb0ca, 0xd46d, 0xb1e5, 0xb0c9, 0xb0c8, 0xb3d4, 0xb3d3,
+  0xb3d2, 0xb6d2, 0xfaba, 0x92c7, 0xb6d5, 0xb6d6, 0xb6d4, 0xb6d3,
+  0xe143, 0xe144, 0xe4f5, 0xbc45, 0xe4f4, 0xbeb1, 0xecbf, 0xc079,
+  0xf1ee, 0xc455, 0xc6c6, 0xa463, 0xa4c3, 0xc956, 0xa4c4, 0xa4c5,
+  0x9a4c, 0xa55d, 0xa55e, 0xa649, 0xca71, 0xcbd6, 0xcbd7, 0xab6d,
+  0xd0ee, 0xb0cc, 0xb0cb, 0xd863, 0xd862, 0xa450, 0xa4c6, 0xa55f,
+  0xb0cd, 0xc943, 0xc96c, 0xa560, 0xc9c2, 0xa64b, 0xa64a, 0xc9c1,
+  0xa758, 0x8c68, 0x89e5, 0xadea, 0x9f7d, 0xd46f, 0xb6d7, 0xe145,
+  0xb9bc, 0xa0a9, 0xfac4, 0xe8fa, 0xf3fd, 0xc6c7, 0xa4c7, 0x8957,
+  0xcbd8, 0xcdf4, 0xb0d0, 0xb0ce, 0xb0cf, 0xa451, 0xfaaa, 0xa464,
+  0xa2cd, 0xa4ca, 0xa4c9, 0xa4c8, 0xa563, 0xa562, 0xc96d, 0xc9c3,
+  0x8958, 0xa8f5, 0xa8f2, 0xa8f4, 0xa8f3, 0xab6e, 0xb3d5, 0xa452,
+  0x8be3, 0xa4cb, 0x8b61, 0xa565, 0xa564, 0xca72, 0x9af1, 0xa8f6,
+  0x9eb7, 0xc6c8, 0xc957, 0xfad1, 0xa567, 0xa566, 0xa64c, 0xa64d,
+  0xca73, 0xa759, 0xfad2, 0xa75a, 0xa8f7, 0xa8f8, 0xa8f9, 0xab6f,
+  0xcdf5, 0x9eba, 0xfad4, 0xadeb, 0xc944, 0xa4cc, 0xc9c4, 0xca74,
+  0xca75, 0xcbd9, 0xfad9, 0xcbda, 0xcdf7, 0xcdf6, 0xcdf9, 0xcdf8,
+  0xab70, 0xd470, 0xaded, 0xd0ef, 0xadec, 0xfadb, 0x9ce0, 0xd864,
+  0xb3d6, 0xfbf7, 0xd865, 0xfbfa, 0x89e7, 0xa07a, 0xfadc, 0xe146,
+  0xb9bd, 0xfadd, 0x89e9, 0xbc46, 0xf1ef, 0xc6c9, 0xc958, 0xa568,
+  0xfae2, 0x89eb, 0xb0d1, 0xfae3, 0xa453, 0xa465, 0xa4ce, 0xa4cd,
+  0x90c8, 0xa4cf, 0x92da, 0x8959, 0x9cf5, 0xa8fb, 0xa8fa, 0xa8fc,
+  0x895a, 0xfae7, 0x9fa2, 0xab71, 0xadee, 0xfaea, 0xe8fb, 0xc24f,
+  0xa466, 0xa56a, 0xa579, 0xa574, 0xa56f, 0xa56e, 0xa575, 0xa573,
+  0xa56c, 0xa57a, 0xa56d, 0xa569, 0xa578, 0xa577, 0xa576, 0xa56b,
+  0xa572, 0xfaed, 0x8fad, 0xa571, 0xa57b, 0xa570, 0xfb59, 0xa653,
+  0xa659, 0xa655, 0xa65b, 0xc9c5, 0xa658, 0xa64e, 0xa651, 0xa654,
+  0xa650, 0xa657, 0xa65a, 0xa64f, 0xa652, 0xa656, 0xa65c, 0xfaef,
+  0x96ef, 0x9dec, 0xca7e, 0xca7b, 0x9dca, 0xa767, 0xca7c, 0xa75b,
+  0xa75d, 0xa775, 0xa770, 0xfd6d, 0x89ec, 0xcaa5, 0xca7d, 0xa75f,
+  0xa761, 0xcaa4, 0xa768, 0xca78, 0xa774, 0xa776, 0xa75c, 0xa76d,
+  0xfb44, 0xca76, 0xa773, 0x9de2, 0xa764, 0x8c75, 0xa76e, 0xa76f,
+  0xca77, 0xa76c, 0xa76a, 0xa76b, 0xa771, 0xcaa1, 0xa75e, 0xa772,
+  0xcaa3, 0xa766, 0xa763, 0xca7a, 0xa762, 0xcaa6, 0xa765, 0xa769,
+  0x9ec0, 0x9e56, 0xa760, 0xcaa2, 0xca79, 0xcbeb, 0xcbea, 0xa94f,
+  0xcbed, 0xcbef, 0xcbe4, 0xcbe7, 0xcbee, 0xa950, 0x9f79, 0x9ac7,
+  0xcbe1, 0xcbe5, 0xfaf4, 0xcbe9, 0xce49, 0xa94b, 0xce4d, 0xa8fd,
+  0xcbe6, 0xa8fe, 0xa94c, 0xa945, 0xa941, 0xcbe2, 0xa944, 0xa949,
+  0xa952, 0xcbe3, 0xcbdc, 0xa943, 0xcbdd, 0xcbdf, 0xa946, 0x98a1,
+  0xa948, 0xcbdb, 0xcbe0, 0xa951, 0xa94d, 0xcbe8, 0xa953, 0xfaf8,
+  0xa94a, 0xcbde, 0xa947, 0x89f0, 0x9e47, 0xa942, 0xa940, 0x9df7,
+  0xcbec, 0xa94e, 0x9fd3, 0x9aca, 0xce48, 0xcdfb, 0xce4b, 0x89f1,
+  0xfaf9, 0xcdfd, 0xab78, 0xaba8, 0xab74, 0xaba7, 0xab7d, 0xaba4,
+  0xab72, 0xcdfc, 0xce43, 0xaba3, 0xce4f, 0xaba5, 0x8e5a, 0xab79,
+  0x89f2, 0xce45, 0xce42, 0xab77, 0x89f3, 0xcdfa, 0xaba6, 0xce4a,
+  0xab7c, 0xce4c, 0xaba9, 0xab73, 0xab7e, 0xab7b, 0xce40, 0xaba1,
+  0xce46, 0xce47, 0xab7a, 0xaba2, 0xab76, 0x925d, 0x8b51, 0x92e0,
+  0xab75, 0xcdfe, 0x89f4, 0xce44, 0x9fd4, 0xce4e, 0xd144, 0xadfb,
+  0xd0f1, 0x8a79, 0xd0f6, 0xadf4, 0xae40, 0xd0f4, 0xadef, 0xadf9,
+  0xadfe, 0xd0fb, 0xadfa, 0xadfd, 0x89f5, 0xd0fe, 0xadf5, 0xd0f5,
+  0xd142, 0xd143, 0xadf7, 0xd141, 0xadf3, 0xae43, 0xd0f8, 0xadf1,
+  0x97a7, 0xd146, 0xd0f9, 0xd0fd, 0xadf6, 0xae42, 0xd0fa, 0xadfc,
+  0xd140, 0xd147, 0xd4a1, 0x93ba, 0xd145, 0xae44, 0xadf0, 0xd0fc,
+  0xd0f3, 0x9e58, 0xadf8, 0xd0f2, 0x89f6, 0xd0f7, 0x9e57, 0x89f7,
+  0x8a41, 0xd0f0, 0xae41, 0x89f8, 0xd477, 0xfaf1, 0xb0e4, 0xd4a7,
+  0xb0e2, 0xb0df, 0xd47c, 0xb0db, 0xd4a2, 0xb0e6, 0xd476, 0xd47b,
+  0xd47a, 0xadf2, 0xb0e1, 0xd4a5, 0xd4a8, 0xd473, 0xb3e8, 0x89fa,
+  0xd4a9, 0xb0e7, 0xb0d9, 0xb0d6, 0xd47e, 0xb0d3, 0xfb42, 0xd4a6,
+  0xfabf, 0xb0da, 0xd4aa, 0xd474, 0xd4a4, 0xb0dd, 0xd475, 0xd478,
+  0xd47d, 0xfba3, 0xb0de, 0xb0dc, 0xb0e8, 0xb0e3, 0xfaf7, 0xb0d7,
+  0xb1d2, 0xb0d8, 0xd479, 0xb0e5, 0xb0e0, 0xd4a3, 0xb0d5, 0x9e4e,
+  0xb0d4, 0x94dc, 0x95da, 0x9df8, 0x9f6a, 0xd471, 0xd472, 0xd86a,
+  0x8ab7, 0xb3d7, 0xb3da, 0xd875, 0xb3ee, 0xd878, 0xb3d8, 0xd871,
+  0xb3de, 0xb3e4, 0xb5bd, 0xfb46, 0xb3e2, 0xd86e, 0xb3ef, 0xb3db,
+  0xb3e3, 0xd876, 0xdcd7, 0xd87b, 0xd86f, 0x8a46, 0xd866, 0xd873,
+  0xd86d, 0xb3e1, 0xd879, 0xb3dd, 0xb3f1, 0xb3ea, 0xb3df, 0xb3dc,
+  0xb3e7, 0xd87a, 0xd86c, 0xd872, 0xd874, 0xd868, 0xd877, 0xb3d9,
+  0xd867, 0xfb47, 0xb3e0, 0xb3f0, 0xb3ec, 0xd869, 0xb3e6, 0x9148,
+  0xb3ed, 0xb3e9, 0xb3e5, 0x92de, 0xd870, 0x8b53, 0x9df6, 0xb3eb,
+  0x9bda, 0xdcd5, 0xdcd1, 0x9d7e, 0xdce0, 0xdcca, 0xdcd3, 0xb6e5,
+  0xb6e6, 0xb6de, 0xdcdc, 0xb6e8, 0xdccf, 0xdcce, 0xdccc, 0xdcde,
+  0xb6dc, 0xdcd8, 0xdccd, 0xb6df, 0xdcd6, 0xb6da, 0xdcd2, 0xdcd9,
+  0xdcdb, 0x89fd, 0x99e4, 0xdcdf, 0xb6e3, 0xdccb, 0xb6dd, 0xdcd0,
+  0x9e43, 0xb6d8, 0xb6e4, 0xdcda, 0xb6e0, 0xb6e1, 0xb6e7, 0xb6db,
+  0xa25f, 0xb6d9, 0xdcd4, 0x9de9, 0x8f52, 0xb6e2, 0x9df5, 0x9df0,
+  0xdcdd, 0x99e7, 0xb9cd, 0xb9c8, 0xe155, 0xe151, 0x8bbd, 0xe14b,
+  0xb9c2, 0xb9be, 0xe154, 0xb9bf, 0xe14e, 0xe150, 0xe153, 0x9def,
+  0xb9c4, 0xb9cb, 0xb9c5, 0xe149, 0xb9c6, 0xb9c7, 0xe14c, 0xb9cc,
+  0x9fb7, 0xe14a, 0xe14f, 0xb9c3, 0xe148, 0xb9c9, 0xb9c1, 0xb9c0,
+  0xe14d, 0xe152, 0x9dd0, 0xb9ca, 0x9feb, 0x8da9, 0x9dcf, 0x98e1,
+  0x9de5, 0xe147, 0xbc4d, 0xe547, 0xe544, 0x9dc8, 0xbc47, 0xbc53,
+  0xbc54, 0xbc4a, 0xe542, 0xbc4c, 0xe4f9, 0xbc52, 0xfb4f, 0xe546,
+  0xbc49, 0xe548, 0xbc48, 0xe543, 0xe545, 0xbc4b, 0xe541, 0xe4fa,
+  0xe4f7, 0x9deb, 0xd86b, 0xe4fd, 0xe4f6, 0xe4fc, 0xe4fb, 0xe4f8,
+  0xfb54, 0xbc4f, 0xfb55, 0x9aa2, 0x8ad6, 0xbc4e, 0x9a5f, 0xbc50,
+  0xe4fe, 0xbeb2, 0xe540, 0x9ef5, 0xe945, 0xe8fd, 0x8fb7, 0xbebe,
+  0xe942, 0xbeb6, 0xbeba, 0xe941, 0xbeb9, 0xbeb5, 0xbeb8, 0xbeb3,
+  0xbebd, 0xe943, 0xe8fe, 0xbebc, 0xe8fc, 0xbebb, 0xe944, 0xe940,
+  0xbc51, 0xbebf, 0xe946, 0xbeb7, 0xbeb4, 0x9ad2, 0x9e6a, 0x9ee8,
+  0xecc6, 0xecc8, 0xc07b, 0xecc9, 0xecc7, 0xecc5, 0xecc4, 0xc07d,
+  0xecc3, 0xc07e, 0x8bbf, 0x91c2, 0x9d62, 0xecc1, 0xecc2, 0xc07a,
+  0xc0a1, 0xc07c, 0x9260, 0xecc0, 0xc250, 0xefbc, 0xefba, 0xefbf,
+  0xefbd, 0xefbb, 0xefbe, 0x925e, 0x91c1, 0x8ac5, 0x97a3, 0xc360,
+  0xf1f2, 0xf1f3, 0xc456, 0xf1f4, 0xf1f0, 0xf1f5, 0xf1f1, 0xc251,
+  0x8b6c, 0x8d7e, 0xf3fe, 0xf441, 0xc459, 0xf440, 0xc458, 0xc457,
+  0x9c54, 0xc45a, 0xf5c5, 0xf5c6, 0x9dbd, 0xc4da, 0xc4d9, 0xc4db,
+  0xf5c4, 0xf6d8, 0xf6d7, 0xc56d, 0xc56f, 0xc56e, 0xf6d9, 0xc5c8,
+  0xf8a6, 0xc5f1, 0xf8a5, 0xf8ee, 0x9cc5, 0xc949, 0xa57d, 0xa57c,
+  0xa65f, 0xa65e, 0xc9c7, 0xa65d, 0xc9c6, 0x895b, 0xa779, 0xcaa9,
+  0xcaa8, 0xa777, 0xa77a, 0xfb5c, 0xcaa7, 0xfb5b, 0xa778, 0xfb57,
+  0xcbf0, 0xcbf1, 0xa954, 0x98c7, 0xabaa, 0xfb5a, 0xd148, 0xd149,
+  0xae45, 0xae46, 0xd4ac, 0xb0e9, 0xb0eb, 0xd4ab, 0xb0ea, 0xd87c,
+  0xb3f2, 0xb6e9, 0xb6ea, 0xdce1, 0x9cee, 0xb9cf, 0xb9ce, 0xe549,
+  0xe948, 0xe947, 0x92e2, 0xf96b, 0xa467, 0xc959, 0xc96e, 0xc96f,
+  0xa662, 0xa666, 0xc9c9, 0xa664, 0xa663, 0xc9c8, 0xa665, 0xa661,
+  0x94a7, 0xa660, 0xc9ca, 0xa7a6, 0x8ccc, 0xa7a3, 0x9bd4, 0xa77d,
+  0xcaaa, 0xfb64, 0xfb76, 0xcaab, 0xfb60, 0xa7a1, 0xcaad, 0xa77b,
+  0xcaae, 0xcaac, 0xa77e, 0xa7a2, 0xa7a5, 0xa7a4, 0xa77c, 0xcaaf,
+  0x99e5, 0x9ac2, 0x91fb, 0xa073, 0xa959, 0xcbfe, 0xa95b, 0xa95a,
+  0x9f72, 0xcc40, 0xa958, 0xa957, 0xcbf5, 0xcbf4, 0xcbf2, 0xcbf7,
+  0xcbf6, 0xcbf3, 0xcbfc, 0xcbfd, 0xcbfa, 0xcbf8, 0xa956, 0x9fcc,
+  0xcbfb, 0xa95c, 0xcc41, 0x98a5, 0x92e8, 0xcbf9, 0xabab, 0xa955,
+  0x9bbc, 0x96f3, 0xabac, 0xce54, 0x92e7, 0xce5a, 0xfc67, 0xabb2,
+  0xce58, 0xce5e, 0xce55, 0xce59, 0xce5b, 0xce5d, 0xce57, 0x8b7d,
+  0xce56, 0xce51, 0xce52, 0xabad, 0x9bf4, 0xabaf, 0xabae, 0xce53,
+  0xce5c, 0x9ef7, 0x9ec1, 0xabb1, 0x996f, 0xce50, 0xd153, 0xd152,
+  0xd157, 0xd14e, 0x96f1, 0xd151, 0xd150, 0x8e41, 0xd154, 0xd158,
+  0xae47, 0xae4a, 0x954a, 0xd14f, 0xd155, 0x97e6, 0xae49, 0xd14a,
+  0xabb0, 0xd4ba, 0xd156, 0xd14d, 0xae48, 0xd14c, 0x96f5, 0xd4b1,
+  0x92e6, 0x9f42, 0xb0ec, 0xb0f0, 0xd4c1, 0xd4af, 0xd4bd, 0xb0f1,
+  0xd4bf, 0xfb67, 0xd4c5, 0xd4c9, 0xd4c0, 0xd4b4, 0xd4bc, 0x99a9,
+  0xd4ca, 0xd4c8, 0xd4be, 0xd4b9, 0xd4b2, 0xd8a6, 0xd4b0, 0xb0f5,
+  0xd4b7, 0xb0f6, 0xb0f2, 0xd4ad, 0xd4c3, 0xd4b5, 0xfae6, 0xd4b3,
+  0xd4c6, 0xb0f3, 0xfb69, 0xd4cc, 0xb0ed, 0xb0ef, 0xd4bb, 0xd4b6,
+  0xae4b, 0xb0ee, 0xd4b8, 0xd4c7, 0xd4cb, 0xd4c2, 0xd4c4, 0x97e5,
+  0xd4ae, 0xd8a1, 0xd8aa, 0xd8a9, 0xb3fa, 0xd8a2, 0xb3fb, 0xb3f9,
+  0x967d, 0xd8a4, 0xb3f6, 0xd8a8, 0xfb6c, 0xd8a3, 0xd8a5, 0xd87d,
+  0xb3f4, 0xd8b2, 0xd8b1, 0xd8ae, 0xb3f3, 0xb3f7, 0xb3f8, 0xd14b,
+  0xd8ab, 0xb3f5, 0xb0f4, 0xd8ad, 0xd87e, 0xd8b0, 0xd8af, 0x99a2,
+  0xd8b3, 0xdcef, 0xd8ac, 0x9abb, 0x9a65, 0x944e, 0xd8a7, 0xdce7,
+  0xb6f4, 0xb6f7, 0xb6f2, 0xdce6, 0xdcea, 0xdce5, 0xb6ec, 0xb6f6,
+  0xdce2, 0xb6f0, 0xdce9, 0xb6ee, 0xb6ed, 0xdcec, 0xb6ef, 0xdcee,
+  0xfb6e, 0xdceb, 0xb6eb, 0x99df, 0xb6f5, 0xdcf0, 0xdce4, 0xdced,
+  0xdce3, 0x98e3, 0xb6f1, 0x9254, 0xb6f3, 0xdce8, 0xdcf1, 0x967b,
+  0x8aaf, 0xe15d, 0xb9d0, 0xe163, 0xb9d5, 0xe15f, 0xe166, 0xe157,
+  0xb9d7, 0xb9d1, 0xe15c, 0xbc55, 0xe15b, 0xe164, 0xb9d2, 0xb9d6,
+  0xe15a, 0xe160, 0xe165, 0xe156, 0xb9d4, 0xe15e, 0xe162, 0xe168,
+  0xe158, 0xe161, 0x8c77, 0xb9d3, 0xe167, 0xe159, 0x8baf, 0x9ebd,
+  0xbc59, 0xe54b, 0xbc57, 0xbc56, 0xe54d, 0xe552, 0xe54e, 0xe551,
+  0xbc5c, 0x9ee6, 0xbea5, 0xbc5b, 0xfb6f, 0xe54a, 0xe550, 0xbc5a,
+  0xe54f, 0x8ee1, 0xe54c, 0xbc58, 0x9b7d, 0x9c7e, 0xe94d, 0xf9d9,
+  0xe94f, 0xe94a, 0xbec1, 0xe94c, 0xbec0, 0xe94e, 0xbec3, 0xe950,
+  0xbec2, 0xe949, 0xe94b, 0x92ea, 0xc0a5, 0xeccc, 0x8c78, 0xc0a4,
+  0xeccd, 0xc0a3, 0xeccb, 0xc0a2, 0xecca, 0xc253, 0xc252, 0xf1f6,
+  0xf1f8, 0xfb72, 0xf1f7, 0xc361, 0xc362, 0xfb71, 0xc363, 0xf442,
+  0xc45b, 0xf7d3, 0xf7d2, 0xc5f2, 0xa468, 0xa4d0, 0xa7a7, 0x895c,
+  0x98f0, 0x96f2, 0xce5f, 0xb3fc, 0xb3fd, 0xfb74, 0xdcf2, 0xb9d8,
+  0xe169, 0xe553, 0x8bc1, 0xc95a, 0x895d, 0x89de, 0xcab0, 0x895e,
+  0xc6ca, 0xcc42, 0xce60, 0xd159, 0xae4c, 0xfe42, 0xf1f9, 0xc4dc,
+  0xa469, 0xa57e, 0xc970, 0xa667, 0xa668, 0xa95d, 0xfb7b, 0xb0f7,
+  0xb9da, 0xb9db, 0xb9d9, 0xa46a, 0xa4d1, 0xa4d3, 0xa4d2, 0xc95b,
+  0xa4d4, 0xa5a1, 0xc971, 0xa5a2, 0x895f, 0x8960, 0xa669, 0xa66a,
+  0xc9cb, 0xa7a8, 0xcab1, 0xa961, 0xcc43, 0xa95f, 0xa960, 0xa95e,
+  0xd15a, 0xabb6, 0xabb5, 0xabb7, 0xabb4, 0xce61, 0xa962, 0xabb3,
+  0xae4d, 0xae4e, 0xae4f, 0xd4cd, 0xb3fe, 0xd8b4, 0xb0f8, 0x9bcd,
+  0xb6f8, 0xb9dd, 0xb9dc, 0xe16a, 0xbc5d, 0xbec4, 0xefc0, 0xf6da,
+  0xf7d4, 0xa46b, 0xa5a3, 0x9dd3, 0xa5a4, 0xc9d1, 0xa66c, 0xa66f,
+  0xc9cf, 0xc9cd, 0xa66e, 0xc9d0, 0xc9d2, 0xc9cc, 0xa671, 0xa670,
+  0xa66d, 0xa66b, 0xc9ce, 0x984c, 0xa7b3, 0xa7b0, 0xcab6, 0xcab9,
+  0xcab8, 0xa7aa, 0xa7b2, 0x9752, 0xa7af, 0xcab5, 0xcab3, 0xa7ae,
+  0x95c3, 0xa7a9, 0xa7ac, 0x9bb6, 0xcab4, 0xcabb, 0xcab7, 0xa7ad,
+  0xa7b1, 0xa7b4, 0xcab2, 0xcaba, 0xa7ab, 0x9ab9, 0xa967, 0xa96f,
+  0x97b3, 0xcc4f, 0xcc48, 0xa970, 0xcc53, 0xcc44, 0xcc4b, 0x9f74,
+  0x92f1, 0xa966, 0xcc45, 0xa964, 0xcc4c, 0xcc50, 0xa963, 0xcc51,
+  0xcc4a, 0xcc4d, 0x97df, 0xa972, 0xa969, 0xcc54, 0xcc52, 0xfba6,
+  0xa96e, 0xa96c, 0xcc49, 0xa96b, 0xcc47, 0xcc46, 0xa96a, 0xa968,
+  0xa971, 0xa96d, 0xa965, 0xcc4e, 0xabb9, 0xfbab, 0xabc0, 0xce6f,
+  0xabb8, 0xce67, 0xce63, 0xce73, 0xce62, 0xabbb, 0xce6c, 0xabbe,
+  0xabc1, 0xabbc, 0xce70, 0xabbf, 0x9877, 0xae56, 0xce76, 0xce64,
+  0x9854, 0x95c5, 0xce66, 0xce6d, 0xce71, 0xce75, 0xce72, 0xce6b,
+  0xce6e, 0x9d55, 0xfbb2, 0xce68, 0xabc3, 0xce6a, 0xce69, 0xce74,
+  0xabba, 0xce65, 0xabc2, 0x957e, 0xabbd, 0xae5c, 0xd162, 0x9742,
+  0xae5b, 0x94e6, 0xd160, 0xae50, 0x92f5, 0xae55, 0xd15f, 0xd15c,
+  0xd161, 0xae51, 0xd15b, 0x8cc5, 0xae54, 0xae52, 0xd163, 0xae53,
+  0xae57, 0x92fd, 0xae58, 0xfba2, 0xae5a, 0x9c51, 0xae59, 0x94e9,
+  0x985c, 0x92f0, 0xd15d, 0xd15e, 0xd164, 0xd4d4, 0xb0f9, 0xd8c2,
+  0xd4d3, 0xd4e6, 0xb140, 0x944c, 0xd4e4, 0xb0fe, 0xb0fa, 0xd4ed,
+  0xd4dd, 0xd4e0, 0x916b, 0xb143, 0xd4ea, 0xd4e2, 0xb0fb, 0xb144,
+  0xd4e7, 0xd4e5, 0xd4d6, 0xd4eb, 0xd4df, 0xd4da, 0x8b78, 0xd4d0,
+  0xd4ec, 0xd4dc, 0xd4cf, 0x94e2, 0xb142, 0xd4e1, 0xd4ee, 0xd4de,
+  0xd4d2, 0xd4d7, 0xd4ce, 0x984f, 0xb141, 0xfbb5, 0xd4db, 0xd4d8,
+  0xb0fc, 0xd4d1, 0x9271, 0xd4e9, 0xb0fd, 0x9365, 0xd4d9, 0xd4d5,
+  0x985b, 0xd4e8, 0x9850, 0xb440, 0xd8bb, 0x97bc, 0xd8b8, 0xd8c9,
+  0xd8bd, 0xd8ca, 0x92f3, 0xb442, 0x9340, 0x984d, 0xd8c6, 0xd8c3,
+  0x9572, 0xfdef, 0xd8c4, 0xd8c7, 0xd8cb, 0xd4e3, 0xd8cd, 0xdd47,
+  0xfdc1, 0xb443, 0xd8ce, 0xd8b6, 0xd8c0, 0xfbba, 0xd8c5, 0x92eb,
+  0xb441, 0xb444, 0xd8cc, 0xd8cf, 0xd8ba, 0xd8b7, 0xfc73, 0x97b7,
+  0xd8b9, 0xd8be, 0xd8bc, 0xb445, 0xd8c8, 0xfbb4, 0xd8bf, 0xd8c1,
+  0xd8b5, 0xdcfa, 0xdcf8, 0xb742, 0xb740, 0xdd43, 0xdcf9, 0xdd44,
+  0xdd40, 0xdcf7, 0xdd46, 0xdcf6, 0xdcfd, 0xb6fe, 0xb6fd, 0xb6fc,
+  0xdcfb, 0xdd41, 0xb6f9, 0xb741, 0x90a7, 0xdcf4, 0xdcfe, 0xdcf3,
+  0xdcfc, 0xb6fa, 0xdd42, 0xdcf5, 0xb6fb, 0xdd45, 0x9741, 0x92f4,
+  0xfbbc, 0xe16e, 0xb9e2, 0xb9e1, 0xb9e3, 0xe17a, 0xe170, 0xe176,
+  0xe16b, 0xe179, 0xe178, 0xe17c, 0xe175, 0xb9de, 0xe174, 0xb9e4,
+  0x9577, 0xe16d, 0xb9df, 0xe17b, 0xb9e0, 0xe16f, 0xe172, 0xe177,
+  0xe171, 0xe16c, 0x9ee2, 0x8f78, 0xe173, 0xe555, 0xbc61, 0xe558,
+  0xe557, 0xe55a, 0xe55c, 0xf9dc, 0xbc5f, 0xe556, 0x9672, 0xe554,
+  0xe55d, 0xe55b, 0xe559, 0xe55f, 0xe55e, 0xbc63, 0xbc5e, 0xbc60,
+  0xbc62, 0x9eb5, 0xe560, 0xe957, 0x964b, 0xe956, 0xe955, 0x8cac,
+  0xe958, 0xe951, 0xe952, 0xe95a, 0xe953, 0xbec5, 0xe95c, 0xa0fa,
+  0xe95b, 0xe954, 0xecd1, 0xc0a8, 0xeccf, 0xecd4, 0xecd3, 0xe959,
+  0xc0a7, 0x9575, 0xecd2, 0xecce, 0xecd6, 0xecd5, 0xc0a6, 0xecd0,
+  0xbec6, 0xc254, 0xefc1, 0xf1fa, 0xf1fb, 0xf1fc, 0xc45c, 0x90da,
+  0xc45d, 0x9367, 0xf443, 0xfea4, 0xf5c8, 0xf5c7, 0x90df, 0xf6db,
+  0xf6dc, 0xf7d5, 0xf8a7, 0x9354, 0xa46c, 0xa46d, 0xa46e, 0xa4d5,
+  0xa5a5, 0xc9d3, 0xa672, 0xa673, 0xa7b7, 0xa7b8, 0xa7b6, 0xa7b5,
+  0xa973, 0xcc55, 0xa975, 0xa974, 0xcc56, 0x8961, 0x8bb4, 0xabc4,
+  0xae5d, 0xd165, 0x9dc0, 0xd4f0, 0xb145, 0xb447, 0xd4ef, 0xb446,
+  0x8e48, 0xb9e5, 0xfbc5, 0xe17d, 0xbec7, 0xc0a9, 0xecd7, 0xfbc7,
+  0xc45e, 0xc570, 0xc6cb, 0xc972, 0xfa79, 0xa5a6, 0xc973, 0xa676,
+  0xa674, 0xa675, 0xa677, 0xa7ba, 0xa7b9, 0xcabc, 0xa7bb, 0x9e67,
+  0xcabd, 0xcc57, 0xcc58, 0x8cd9, 0xa976, 0xa978, 0xa97a, 0xa977,
+  0xa97b, 0xa979, 0xfbd2, 0x8962, 0x8963, 0xabc8, 0xabc5, 0xabc7,
+  0xabc9, 0xabc6, 0xd166, 0xce77, 0xfc7d, 0xd168, 0xd167, 0xae63,
+  0xae5f, 0xae60, 0xae62, 0xae64, 0xae61, 0xae66, 0xae65, 0xb14a,
+  0xd4f2, 0xd4f1, 0xb149, 0x9f6b, 0xb148, 0xb147, 0xb14b, 0xb146,
+  0xd8d5, 0xd8d2, 0xb449, 0xd8d1, 0xd8d6, 0xb44b, 0xd8d4, 0xb448,
+  0xb44a, 0xd8d3, 0xfbcc, 0xdd48, 0xfeae, 0xdd49, 0xdd4a, 0xb9e6,
+  0xb9ee, 0xe17e, 0xb9e8, 0xb9ec, 0xe1a1, 0xb9ed, 0xb9e9, 0xb9ea,
+  0xb9e7, 0xb9eb, 0xbc66, 0xd8d0, 0xbc67, 0xbc65, 0xbc64, 0xe95d,
+  0xbec8, 0xecd8, 0xecd9, 0xfbd1, 0xc364, 0xc45f, 0xa46f, 0xa678,
+  0xfb75, 0xabca, 0xd169, 0xae67, 0xfbd4, 0xb14e, 0xb14d, 0xb14c,
+  0xb44c, 0xb44d, 0xd8d7, 0xb9ef, 0xbec9, 0xa470, 0xc95c, 0xa4d6,
+  0xc974, 0xfbd6, 0xfbd8, 0xc9d4, 0xa679, 0xa97c, 0x8b5d, 0x934c,
+  0xdd4b, 0x9ae2, 0xa471, 0x8bc9, 0xa4d7, 0xc9d5, 0xcabe, 0xcabf,
+  0xa7bc, 0xd8d8, 0xb44e, 0xdd4c, 0xc0aa, 0xa472, 0xa4a8, 0xa4d8,
+  0xc975, 0xa5a7, 0xa7c0, 0xa7bf, 0xa7bd, 0xa7be, 0xcc59, 0xa97e,
+  0xa9a1, 0xcc5a, 0xa97d, 0xfbdb, 0x9fc9, 0xabce, 0xce78, 0xabcd,
+  0xabcb, 0xabcc, 0xae6a, 0xae68, 0x9f44, 0xd16b, 0xae69, 0xd16a,
+  0xae5e, 0xd4f3, 0xb150, 0xb151, 0x98ed, 0xb14f, 0xb9f0, 0xe1a2,
+  0xbc68, 0xbc69, 0xe561, 0xc0ab, 0xefc2, 0xefc3, 0xc4dd, 0xf8a8,
+  0xc94b, 0xa4d9, 0xa473, 0xc977, 0xc976, 0xa67a, 0xc9d7, 0xc9d8,
+  0xc9d6, 0xc9d9, 0xfbdd, 0xcac7, 0xcac2, 0xcac4, 0xcac6, 0xcac3,
+  0xa7c4, 0xcac0, 0xcac1, 0xa7c1, 0xa7c2, 0xcac5, 0xcac8, 0xa7c3,
+  0xcac9, 0x8df2, 0x8964, 0xfdf2, 0xcc68, 0x934d, 0xcc62, 0xcc5d,
+  0xa9a3, 0xcc65, 0xcc63, 0xcc5c, 0xcc69, 0xcc6c, 0xcc67, 0xcc60,
+  0xa9a5, 0xcc66, 0xa9a6, 0xcc61, 0xcc64, 0xcc5b, 0xcc5f, 0xcc6b,
+  0xa9a7, 0xa9a8, 0xcc5e, 0xcc6a, 0xa9a2, 0xa9a4, 0xfbe7, 0xa0f2,
+  0x9868, 0xceab, 0xcea4, 0xceaa, 0xcea3, 0xcea5, 0xce7d, 0xce7b,
+  0xceac, 0xcea9, 0xce79, 0x9f58, 0xabd0, 0xcea7, 0xcea8, 0xcea6,
+  0xce7c, 0xce7a, 0xabcf, 0xcea2, 0xce7e, 0xcea1, 0xcead, 0x8d73,
+  0xae6f, 0xfbde, 0xae6e, 0xd16c, 0xae6b, 0xd16e, 0xfbdf, 0xae70,
+  0xd16f, 0xae73, 0x8c48, 0xae71, 0xd170, 0xceae, 0xd172, 0xae6d,
+  0xae6c, 0xd16d, 0xd171, 0xae72, 0xb153, 0xb152, 0xd4f5, 0xd4f9,
+  0xd4fb, 0xb154, 0xd4fe, 0xfbe3, 0xb158, 0xd541, 0xb15a, 0x8da8,
+  0xb156, 0xb15e, 0xfbe4, 0xb15b, 0xd4f7, 0xb155, 0xd4f6, 0xd4f4,
+  0xd543, 0xd4f8, 0xb157, 0xd542, 0xb15c, 0xd4fd, 0xd4fc, 0xb15d,
+  0xd4fa, 0xb159, 0x9c75, 0xd544, 0x9878, 0xd540, 0xd8e7, 0xd8ee,
+  0xd8e3, 0xb451, 0xd8df, 0xd8ef, 0xd8d9, 0xd8ec, 0xd8ea, 0xd8e4,
+  0xd8ed, 0xd8e6, 0x8d60, 0xd8de, 0xd8f0, 0xd8dc, 0xd8e9, 0xd8da,
+  0xd8f1, 0xfbe5, 0xb452, 0x8d61, 0xd8eb, 0xdd4f, 0xd8dd, 0xb44f,
+  0xd8e1, 0xb450, 0xd8e0, 0xd8e5, 0xd8e2, 0x8d62, 0xa0a1, 0xd8e8,
+  0x9c40, 0xdd53, 0xdd56, 0xdd4e, 0xdd50, 0xdd55, 0xdd54, 0xb743,
+  0xd8db, 0xdd52, 0xb744, 0x98ad, 0xdd4d, 0xdd51, 0x9eea, 0xe1a9,
+  0xe1b0, 0xe1a7, 0x8cd4, 0xe1ae, 0xe1a5, 0xe1ad, 0xe1b1, 0xe1a4,
+  0xe1a8, 0xe1a3, 0xb9f1, 0x9ceb, 0xe1a6, 0xb9f2, 0xe1ac, 0xe1ab,
+  0xe1aa, 0xfbe0, 0xe1af, 0x9f51, 0xe565, 0xe567, 0xbc6b, 0xe568,
+  0xe563, 0xe562, 0xe56c, 0xe56a, 0xbc6a, 0xe56d, 0xe564, 0xe569,
+  0xe56b, 0xe566, 0x8d65, 0xe961, 0xe966, 0xe960, 0xe965, 0x9cf1,
+  0xe95e, 0xe968, 0xe964, 0xe969, 0xe963, 0xe95f, 0xe967, 0xe96a,
+  0xe962, 0xfc58, 0xecda, 0xc0af, 0x8d66, 0xc0ad, 0xc0ac, 0xc0ae,
+  0xefc4, 0x9654, 0xf172, 0xf1fd, 0xf444, 0xf445, 0xc460, 0xf5c9,
+  0xc4de, 0xf5ca, 0xf6de, 0xc572, 0xc571, 0xf6dd, 0xc5c9, 0xfbe8,
+  0xf7d6, 0xc6cc, 0xa474, 0xa67b, 0xc9da, 0xcaca, 0xa8b5, 0xb15f,
+  0xa475, 0xa5aa, 0xa5a9, 0xa5a8, 0xa7c5, 0xae74, 0xdd57, 0xa476,
+  0xa477, 0xa478, 0xa4da, 0x9fce, 0xabd1, 0xceaf, 0xb453, 0xa479,
+  0xc95d, 0xa5ab, 0xa5ac, 0xc978, 0xa67c, 0xfbfc, 0xcacb, 0x9ae4,
+  0xa7c6, 0xcacc, 0xa9ae, 0x9f75, 0xcc6e, 0xa9ac, 0xa9ab, 0xcc6d,
+  0xa9a9, 0xcc6f, 0xa9aa, 0xa9ad, 0xabd2, 0xabd4, 0xceb3, 0xceb0,
+  0xceb1, 0xceb2, 0xceb4, 0xabd3, 0xd174, 0xd173, 0xae76, 0xae75,
+  0xfbf1, 0xb162, 0xd546, 0xb161, 0xb163, 0xb160, 0xb455, 0xd545,
+  0xb456, 0xd8f3, 0x8d69, 0xb457, 0xd8f2, 0xb454, 0x934f, 0xdd5a,
+  0xdd5c, 0xb745, 0xdd5b, 0xdd59, 0xdd58, 0xe1b4, 0xb9f7, 0xb9f5,
+  0xb9f6, 0xe1b2, 0xe1b3, 0xb9f3, 0xe571, 0xe56f, 0x934e, 0xbc6d,
+  0xe570, 0xbc6e, 0xbc6c, 0xb9f4, 0xe96d, 0xe96b, 0xe96c, 0xe56e,
+  0xecdc, 0xc0b0, 0xecdb, 0xefc5, 0xefc6, 0xe96e, 0xf1fe, 0xa47a,
+  0xa5ad, 0xa67e, 0xc9db, 0xa67d, 0xa9af, 0xb746, 0xfbf4, 0xa4db,
+  0xa5ae, 0xabd5, 0xb458, 0xc6ce, 0xc979, 0xc97a, 0xfbc3, 0xc9dc,
+  0x8965, 0xa7c8, 0xcad0, 0xcace, 0xa7c9, 0xcacd, 0xcacf, 0xcad1,
+  0xa7c7, 0x8c7a, 0xa9b3, 0xa9b4, 0xa9b1, 0x8c7b, 0xa9b0, 0xceb8,
+  0xa9b2, 0xabd6, 0xceb7, 0xceb9, 0xceb6, 0xceba, 0xabd7, 0xae79,
+  0xd175, 0xd177, 0xae77, 0xd178, 0xae78, 0xd176, 0xceb5, 0xd547,
+  0xd54a, 0xd54b, 0xd548, 0xb167, 0xb166, 0xb164, 0xb165, 0xd549,
+  0x8d6a, 0xb168, 0xb45a, 0xb45b, 0xb45c, 0xdd5d, 0xdd5f, 0xdd61,
+  0xb748, 0xb747, 0xb459, 0xdd60, 0xdd5e, 0x9353, 0xe1b8, 0x9dfb,
+  0xe1b6, 0xe1bc, 0xb9f8, 0xe1bd, 0xe1ba, 0xb9f9, 0xe1b7, 0xe1b5,
+  0xe1bb, 0xbc70, 0xe573, 0xe1b9, 0xbc72, 0xe574, 0xbc71, 0xbc74,
+  0xe575, 0xbc6f, 0xbc73, 0xe973, 0xe971, 0xe970, 0xe972, 0xe96f,
+  0xc366, 0xf446, 0xf447, 0xf5cb, 0xf6df, 0xc655, 0xfbfd, 0xa9b5,
+  0xa7ca, 0x9059, 0xfc40, 0xabd8, 0xfc41, 0xfc43, 0xa47b, 0xa4dc,
+  0xa5af, 0xc9dd, 0xa7cb, 0xcad2, 0xcebb, 0xabd9, 0xb9fa, 0xa47c,
+  0x9361, 0xfc46, 0x9362, 0xa6a1, 0xb749, 0xa47d, 0xa4dd, 0xa4de,
+  0xa5b1, 0xa5b0, 0xc9de, 0xa6a2, 0xcad3, 0xa7cc, 0xcc71, 0xcc72,
+  0xcc73, 0x8d6b, 0xa9b6, 0xa9b7, 0xcc70, 0xa9b8, 0xabda, 0xcebc,
+  0xd17a, 0xae7a, 0xd179, 0xb169, 0xd54c, 0xb16a, 0xd54d, 0xfc4c,
+  0xb45d, 0xdd62, 0xe1bf, 0xe1be, 0xb9fb, 0xbc75, 0xe576, 0xbeca,
+  0xe974, 0xc0b1, 0x95b8, 0xc573, 0xf7d8, 0xc6d0, 0x8bca, 0xcc74,
+  0xcebd, 0xb16b, 0xd8f4, 0xb74a, 0x987a, 0xc255, 0xc6d1, 0xa7ce,
+  0xfc51, 0xa7cd, 0xabdb, 0xd17b, 0xb16d, 0xb343, 0xb16e, 0xb16c,
+  0xb45e, 0xe1c0, 0xb9fc, 0xbc76, 0xfc54, 0xc94c, 0xc9df, 0xcad5,
+  0xa7cf, 0xcad4, 0xa7d0, 0xfaaf, 0xa9bc, 0xcc77, 0xcc76, 0xa9bb,
+  0xa9b9, 0xa9ba, 0xcc75, 0x8d6c, 0xabdd, 0xcebe, 0xabe0, 0xabdc,
+  0xabe2, 0xabde, 0xabdf, 0xabe1, 0xae7d, 0xae7c, 0xae7b, 0xd54f,
+  0xb16f, 0xb172, 0xb170, 0xd54e, 0xb175, 0xb171, 0xd550, 0xb174,
+  0xb173, 0xfa61, 0xd8f6, 0xd8f5, 0xfc57, 0xb461, 0xb45f, 0xb460,
+  0xd8f7, 0xb74b, 0xdd64, 0xb74c, 0xdd63, 0x9b70, 0xe577, 0xbc78,
+  0xe1c1, 0xbc77, 0xb9fd, 0xa051, 0xecde, 0xe975, 0xc0b2, 0xecdd,
+  0xf240, 0xf448, 0xf449, 0x8c7c, 0xa4df, 0x8bcb, 0xa5b2, 0xc97b,
+  0xa7d2, 0xa7d4, 0xc9e2, 0xcad8, 0xcad7, 0xcad6, 0xc9e1, 0xc9e0,
+  0xa6a4, 0xa7d3, 0xa7d1, 0xa6a3, 0x936e, 0xa9bd, 0xcc78, 0xfcd5,
+  0xa9be, 0xcadd, 0xcadf, 0xcade, 0xcc79, 0xcada, 0xa7d8, 0xa7d6,
+  0xcad9, 0xcadb, 0xcae1, 0xa7d5, 0xcadc, 0xcae5, 0xa9c0, 0xcae2,
+  0xa7d7, 0xcae0, 0xcae3, 0xa9bf, 0xa9c1, 0xcae4, 0xccaf, 0xcca2,
+  0xcc7e, 0xccae, 0xcca9, 0xabe7, 0xa9c2, 0xccaa, 0xccad, 0xabe3,
+  0xccac, 0xa9c3, 0xa9c8, 0xa9c6, 0xcca3, 0xcc7c, 0xcca5, 0xa9cd,
+  0xccb0, 0xabe4, 0xcca6, 0xabe5, 0xa9c9, 0xcca8, 0xfca9, 0xcecd,
+  0xabe6, 0xcc7b, 0xa9ca, 0xabe8, 0xa9cb, 0xa9c7, 0xa9cc, 0xcca7,
+  0xcc7a, 0xccab, 0xa9c4, 0xfc61, 0xcc7d, 0xcca4, 0xcca1, 0xa9c5,
+  0xcebf, 0xcec0, 0x8966, 0xceca, 0xd1a1, 0xcecb, 0xabee, 0xcece,
+  0xcec4, 0xabed, 0xcec6, 0xcec7, 0xfacb, 0xcec9, 0xabe9, 0xaea3,
+  0xf9da, 0xcec5, 0xcec1, 0xaea4, 0xcecf, 0xae7e, 0xd17d, 0xcec8,
+  0xd17c, 0xcec3, 0xcecc, 0xabec, 0xaea1, 0xabf2, 0xaea2, 0xced0,
+  0xd17e, 0xabeb, 0xaea6, 0xabf1, 0xabf0, 0xabef, 0xaea5, 0xced1,
+  0xaea7, 0xabea, 0xcec2, 0x937a, 0xa0e0, 0x936b, 0xb176, 0xd1a4,
+  0xd1a6, 0xd1a8, 0xaea8, 0xaeae, 0xd553, 0xd1ac, 0xd1a3, 0xb178,
+  0xd551, 0xaead, 0xaeab, 0xd1ae, 0xd552, 0xd1a5, 0xaeac, 0xd1a9,
+  0xaeaf, 0xd1ab, 0xaeaa, 0xd1aa, 0xd1ad, 0xd1a7, 0xfc6b, 0xaea9,
+  0xb179, 0xd1a2, 0xb177, 0xa0dc, 0x9468, 0xb17a, 0xd555, 0xd55e,
+  0xb464, 0xfc6d, 0xb17c, 0xb1a3, 0xb465, 0xd560, 0xb1aa, 0xd8f9,
+  0xd556, 0xb1a2, 0xb1a5, 0xb17e, 0xd554, 0xd562, 0xd565, 0xd949,
+  0xd563, 0xd8fd, 0xb1a1, 0xb1a8, 0xb1ac, 0xd55d, 0xd8f8, 0xd561,
+  0xb17b, 0xd8fa, 0xd564, 0xd8fc, 0xd559, 0xb462, 0xd557, 0xd558,
+  0xb1a7, 0x8d71, 0xb1a6, 0xd55b, 0xb1ab, 0xd55f, 0xb1a4, 0xd55c,
+  0xfd64, 0xb1a9, 0xb466, 0xb463, 0xd8fb, 0x99ba, 0xd55a, 0xb17d,
+  0x9ad0, 0x9a61, 0xa0e5, 0xb46b, 0xb46f, 0xd940, 0xb751, 0xb46d,
+  0xd944, 0xb471, 0xdd65, 0xd946, 0xb753, 0xb469, 0xb46c, 0xd947,
+  0xa05b, 0xd948, 0xd94e, 0xb473, 0xb754, 0xd94a, 0xd94f, 0xd943,
+  0xb75e, 0x96ac, 0xb755, 0xb472, 0xd941, 0xd950, 0x9740, 0xb75d,
+  0xb470, 0xb74e, 0xd94d, 0xb474, 0xd945, 0xd8fe, 0xb46a, 0xd942,
+  0xd94b, 0x9ef1, 0xb74d, 0xb752, 0xb467, 0xd94c, 0xb750, 0x8c4d,
+  0xb468, 0xb75c, 0xe1c3, 0xdd70, 0xdd68, 0xe1c2, 0xdd6c, 0xdd6e,
+  0x9f7e, 0xdd6b, 0xb75b, 0xdd6a, 0xb75f, 0xe1d2, 0x8d72, 0xb75a,
+  0xba40, 0xdd71, 0xe1c4, 0xfc76, 0xb758, 0xdd69, 0xdd6d, 0xb9fe,
+  0xb74f, 0xdd66, 0xdd67, 0xba41, 0xb757, 0xb759, 0xb756, 0xdd6f,
+  0x96a9, 0xe1c8, 0xe1c9, 0xe1ce, 0xbc7d, 0xe1d5, 0xba47, 0xa06e,
+  0xba46, 0xe1d0, 0xfcaa, 0xbc7c, 0xe1c5, 0xba45, 0xfbcd, 0xe1d4,
+  0xba43, 0xba44, 0xfc74, 0xe1d1, 0xe5aa, 0xbc7a, 0xb46e, 0xe1d3,
+  0xbca3, 0xe1cb, 0xbc7b, 0xa074, 0xbca2, 0xe1c6, 0xe1ca, 0xe1c7,
+  0xe1cd, 0xba48, 0xbc79, 0xba42, 0xe57a, 0xe1cf, 0xbca1, 0xa071,
+  0xbca4, 0xe1cc, 0xfc79, 0xbc7e, 0xe579, 0xfc7c, 0xe57e, 0xbece,
+  0xe578, 0xe9a3, 0xe5a9, 0xbca8, 0xbca6, 0xbecc, 0xe5a6, 0xe5a2,
+  0xbcac, 0x9c50, 0xe978, 0x9379, 0x9378, 0xbcaa, 0xe5a1, 0xa0dd,
+  0xe976, 0xe5a5, 0xe5a8, 0xe57d, 0xbcab, 0xbca5, 0xe977, 0xbecd,
+  0xe5a7, 0xbca7, 0xbca9, 0xe5a4, 0xbcad, 0xe5a3, 0xe57c, 0xe57b,
+  0xbecb, 0xe5ab, 0xe97a, 0xece0, 0xbed0, 0x8d75, 0xe9a2, 0x8d76,
+  0xe97e, 0xece1, 0xbed1, 0xe9a1, 0x9374, 0xe97c, 0xc0b4, 0xecdf,
+  0xe979, 0xe97b, 0xc0b5, 0xbed3, 0xc0b3, 0xbed2, 0xc0b7, 0xe97d,
+  0xbecf, 0x8d77, 0xfca5, 0xfca2, 0xefcf, 0xefc7, 0x90c3, 0xece7,
+  0xefc8, 0xece3, 0xa079, 0xc256, 0xece5, 0xece4, 0xc0b6, 0xece2,
+  0xece6, 0xefd0, 0xefcc, 0xefce, 0xefc9, 0xefca, 0xefcd, 0xefcb,
+  0xc367, 0xc36a, 0xc369, 0xc368, 0xc461, 0xf44a, 0xc462, 0xf241,
+  0xc4df, 0xf5cc, 0xc4e0, 0xc574, 0xc5ca, 0xf7d9, 0xf7da, 0xf7db,
+  0xf9ba, 0xa4e0, 0xc97c, 0xa5b3, 0xa6a6, 0xa6a7, 0xa6a5, 0xa6a8,
+  0xa7da, 0xa7d9, 0xccb1, 0xa9cf, 0xa9ce, 0xd1af, 0xb1ad, 0xb1ae,
+  0xb475, 0xdd72, 0xb760, 0xb761, 0xdd74, 0xdd76, 0xdd75, 0xe1d7,
+  0xe1d6, 0xba49, 0xe1d8, 0x8d79, 0xe5ac, 0xbcae, 0xbed4, 0xc0b8,
+  0xc257, 0xc0b9, 0xa4e1, 0x8bfc, 0xa076, 0xcae6, 0xccb2, 0xa9d1,
+  0xa9d0, 0xa9d2, 0xabf3, 0xced2, 0xced3, 0xd1b0, 0xaeb0, 0xb1af,
+  0xb476, 0xd951, 0xa4e2, 0x8bcd, 0xa47e, 0xa4e3, 0xc97d, 0xa5b7,
+  0xa5b6, 0xa5b4, 0xa5b5, 0xa6ab, 0xc9e9, 0xc9eb, 0xa6aa, 0xc9e3,
+  0xc9e4, 0xc9ea, 0xc9e6, 0xc9e8, 0xa6a9, 0xc9e5, 0xc9ec, 0xc9e7,
+  0x9f5a, 0xa7e1, 0xa7ea, 0xa7e8, 0xcaf0, 0xcaed, 0xcaf5, 0xa7e6,
+  0xcaf6, 0xa7df, 0xcaf3, 0xa7e5, 0xcaef, 0xcaee, 0xa7e3, 0xcaf4,
+  0xa7e4, 0xa9d3, 0xa7de, 0xcaf1, 0x9ff4, 0xcae7, 0xa7db, 0x9fba,
+  0xa7ee, 0xcaec, 0xcaf2, 0xa7e0, 0xa7e2, 0xcae8, 0xcae9, 0xcaea,
+  0x8d7a, 0xa7ed, 0xa7e7, 0xa7ec, 0xcaeb, 0xa7eb, 0xa7dd, 0xa7dc,
+  0xa7e9, 0x9e45, 0x93b0, 0xa075, 0xa9e1, 0xccbe, 0xccb7, 0xa9dc,
+  0xa9ef, 0xccb3, 0xccba, 0xccbc, 0xccbf, 0xa9ea, 0xccbb, 0xccb4,
+  0xa9e8, 0xccb8, 0xccc0, 0xa9d9, 0xccbd, 0xa9e3, 0xa9e2, 0xccb6,
+  0xa9d7, 0xa9d8, 0x9b46, 0xa9d6, 0xfcae, 0xa9ee, 0xa9e6, 0xa9e0,
+  0xa9d4, 0xccb9, 0xa9df, 0xa9d5, 0xa9e7, 0xa9f0, 0xced4, 0xa9e4,
+  0xccb5, 0xa9da, 0xa9dd, 0xa9de, 0xfcb0, 0xa9ec, 0xa9ed, 0xa9eb,
+  0xa9e5, 0xa9e9, 0xa9db, 0xabf4, 0xfa51, 0x8d7b, 0xceda, 0xac41,
+  0xabf8, 0xabfa, 0xac40, 0xcee6, 0xabfd, 0xd1b1, 0xaeb1, 0xac43,
+  0xced7, 0xcedf, 0xabfe, 0xcede, 0xcedb, 0xcee3, 0xcee5, 0xabf7,
+  0xabfb, 0xac42, 0xaeb3, 0xcee0, 0xabf9, 0xac45, 0xced9, 0xabfc,
+  0xaeb2, 0xabf6, 0xced6, 0xcedd, 0xced5, 0xced8, 0xcedc, 0xd1b2,
+  0xac44, 0xcee1, 0xcee2, 0xcee4, 0xabf5, 0x8d7c, 0xaec1, 0xd1be,
+  0xaebf, 0xaec0, 0xd1b4, 0xd1c4, 0x9ed6, 0xaeb6, 0x93ac, 0xd566,
+  0xd1c6, 0xd1c0, 0x9f5b, 0xd1b7, 0x93a9, 0xd1c9, 0xd1ba, 0xaebc,
+  0xd57d, 0xd1bd, 0xaebe, 0xaeb5, 0xd1cb, 0xd1bf, 0xaeb8, 0xd1b8,
+  0xd1b5, 0xd1b6, 0xaeb9, 0xd1c5, 0xd1cc, 0xaebb, 0xd1bc, 0xd1bb,
+  0xaec3, 0xaec2, 0xaeb4, 0xaeba, 0xaebd, 0xd1c8, 0xd1c2, 0xaeb7,
+  0xd1b3, 0xd1ca, 0xd1c1, 0xd1c3, 0xd1c7, 0xa07c, 0xd567, 0xb1b7,
+  0xb1cb, 0xb1ca, 0xb1bf, 0xfcb2, 0xd579, 0xd575, 0xd572, 0xd5a6,
+  0xb1ba, 0xb1b2, 0xd577, 0xb4a8, 0xb1b6, 0xd5a1, 0x8ac1, 0xb1cc,
+  0xb1c9, 0xd57b, 0xd56a, 0x9fb4, 0xb1c8, 0xd5a3, 0xd569, 0xb1bd,
+  0xb1c1, 0xd5a2, 0xd573, 0xb1c2, 0xb1bc, 0xd568, 0xfcac, 0xb478,
+  0xd5a5, 0xd571, 0xb1c7, 0xd574, 0xd5a4, 0xb1c6, 0xd952, 0xb1b3,
+  0xd56f, 0xb1b8, 0xb1c3, 0xb1be, 0xd578, 0xd56e, 0xd56c, 0xd57e,
+  0xb1b0, 0xb1c4, 0xb1b4, 0xb477, 0xd57c, 0xb1b5, 0xb1b1, 0xb1c0,
+  0xb1bb, 0xb1b9, 0xd570, 0xb1c5, 0xd56d, 0xd57a, 0xd576, 0xd954,
+  0xd953, 0x9e4c, 0xd56b, 0xd964, 0xb47a, 0x8fc5, 0xd96a, 0xd959,
+  0xd967, 0xdd77, 0xb47d, 0xd96b, 0xd96e, 0xb47c, 0xd95c, 0xd96d,
+  0xd96c, 0xb47e, 0xd955, 0xb479, 0xb4a3, 0x93ad, 0xb4a1, 0xd969,
+  0xd95f, 0xb4a5, 0xd970, 0xd968, 0xd971, 0xb4ad, 0xb4ab, 0xd966,
+  0xd965, 0x9dc3, 0xd963, 0xd95d, 0xb4a4, 0x8da2, 0xb4a2, 0xd1b9,
+  0xd956, 0x9d4a, 0xddb7, 0xd957, 0xb47b, 0xb4aa, 0xdd79, 0xb4a6,
+  0xb4a7, 0xd958, 0xd96f, 0xdd78, 0xd960, 0xd95b, 0xb4a9, 0xd961,
+  0xd95e, 0xfcb6, 0xb4ae, 0x8da3, 0x9e4b, 0x9e4d, 0xb770, 0x8da4,
+  0xdd7c, 0xddb1, 0xddb6, 0xddaa, 0xb76c, 0xddbb, 0xb769, 0xdd7a,
+  0xdd7b, 0xb762, 0xb76b, 0xdda4, 0xb76e, 0xb76f, 0xdda5, 0xddb2,
+  0xddb8, 0xb76a, 0xb764, 0xdda3, 0xdd7d, 0xddba, 0xdda8, 0xdda9,
+  0xdd7e, 0xddb4, 0xddab, 0xddb5, 0xddad, 0xb765, 0xe1d9, 0xb768,
+  0xb766, 0xddb9, 0xddb0, 0xddac, 0x8afd, 0xdda1, 0xba53, 0xddaf,
+  0xb76d, 0xdda7, 0xfcb5, 0xdda6, 0xfcc3, 0x93b2, 0xb767, 0xb763,
+  0xe1ee, 0xddb3, 0xddae, 0xdda2, 0xe1e9, 0xe1da, 0xe1e5, 0xe1ec,
+  0xba51, 0xb4ac, 0xe1ea, 0xba4c, 0xba4b, 0xe1f1, 0x8da5, 0xe1db,
+  0xe1e8, 0xe1dc, 0xe1e7, 0xba4f, 0xe1eb, 0xd962, 0xe1f2, 0xe1e3,
+  0xba52, 0xe5ba, 0xbcaf, 0xe1f0, 0xe1ef, 0xba54, 0xe5ad, 0xbcb0,
+  0xe5ae, 0x93a1, 0xe1df, 0xe1e0, 0xe1dd, 0xe1e2, 0xe1de, 0xe1f3,
+  0xba4e, 0xbcb1, 0xba50, 0xba55, 0x8ac6, 0xe1e1, 0xe1ed, 0xe1e6,
+  0xe5b1, 0xba4a, 0xbcb4, 0xe9aa, 0xe5b6, 0xe5b5, 0xe5b7, 0x8a5b,
+  0xe5b4, 0xbcb5, 0x894d, 0xbcbb, 0xbcb8, 0xbcb9, 0xe5af, 0xe5b2,
+  0xe5bc, 0xbcc1, 0xbcbf, 0xe5b3, 0xd95a, 0xbcb2, 0xe5b9, 0xe5b0,
+  0xbcc2, 0xe5b8, 0xba4d, 0xbcb7, 0xe1e4, 0xbcba, 0xbcbe, 0xbcc0,
+  0xbcbd, 0xbcbc, 0xfed4, 0xbcb6, 0xe5bb, 0xbcb3, 0xbcc3, 0x8a78,
+  0x93ab, 0xbed8, 0xbed9, 0xe9a9, 0xbee2, 0xbedf, 0x8da7, 0xbed6,
+  0xbedd, 0xe9ab, 0xbedb, 0xbed5, 0xbedc, 0xe9a8, 0xc0bb, 0xbed7,
+  0xbede, 0xc0ba, 0xe9a7, 0xe9a6, 0xbee0, 0x9f45, 0xbee1, 0xe9a5,
+  0xe9a4, 0xc0bc, 0xe9ae, 0xbeda, 0xe9ac, 0x8a56, 0xc0bd, 0xfcbf,
+  0xc0c2, 0xecea, 0xecec, 0xfcc0, 0xc0bf, 0x8ee6, 0xeced, 0xece9,
+  0x8aa4, 0xeceb, 0xc0c0, 0xc0c3, 0xece8, 0xc0be, 0xc0c1, 0xc259,
+  0xe9ad, 0xc258, 0xc25e, 0xefd4, 0xc25c, 0xc25d, 0xefd7, 0xefd3,
+  0xc25a, 0xefd1, 0xc36b, 0xefd5, 0xefd6, 0xefd2, 0xc25b, 0xf242,
+  0xf245, 0x8943, 0xf246, 0xf244, 0xf247, 0xc36c, 0xf243, 0x93f3,
+  0xf44e, 0xc464, 0xf44d, 0xf44c, 0xf44b, 0xc463, 0xc465, 0xf5cd,
+  0xc4e2, 0xc4e1, 0xfcab, 0x9ea2, 0xf6e1, 0xf6e0, 0xf6e3, 0xc5cb,
+  0xc575, 0xf7dd, 0xf6e2, 0xf7dc, 0xc5cd, 0xc5cc, 0xc5f3, 0xf8a9,
+  0xf8ef, 0xa4e4, 0x9dc7, 0xd972, 0xe9af, 0xc6d2, 0x8bce, 0xa6ac,
+  0xcaf7, 0xa7f1, 0xa7ef, 0xa7f0, 0xccc1, 0xa9f1, 0xac46, 0xcee7,
+  0xcee8, 0xac47, 0xd1ce, 0xaec4, 0xaec5, 0xd1cd, 0xfcc5, 0xb1d3,
+  0xb1cf, 0xd5a7, 0xb1d6, 0xb1d5, 0xb1ce, 0xb1d1, 0xb1d4, 0xb1d0,
+  0xd976, 0xb1cd, 0xb4af, 0xfccb, 0xb4b1, 0xb4b2, 0xd975, 0xd978,
+  0xb4b0, 0xd973, 0xd977, 0xd974, 0x93b3, 0xb771, 0xfcca, 0xddbc,
+  0xba56, 0xe1f4, 0xbee3, 0xbcc4, 0xe5bd, 0xbcc5, 0xbcc6, 0xe5bf,
+  0xe5be, 0xe5c0, 0xe9b1, 0xe9b0, 0xecef, 0xecee, 0xc0c4, 0xc0c5,
+  0xf248, 0xfcc9, 0x8dac, 0xa4e5, 0xfbc6, 0x8967, 0x8c7e, 0xd979,
+  0xb4b4, 0xb4b3, 0xddbd, 0xefd8, 0xc4e3, 0xf7de, 0xa4e6, 0xaec6,
+  0xb1d8, 0xb1d7, 0xd97a, 0xd97b, 0xb772, 0xe1f5, 0xba57, 0xe9b2,
+  0xa4e7, 0xa5b8, 0xa9f2, 0xccc2, 0xcee9, 0xac48, 0xb1d9, 0xd97c,
+  0xb4b5, 0xb773, 0xe5c1, 0xe5c2, 0xfccd, 0xecf0, 0xc25f, 0xf8f0,
+  0xa4e8, 0xccc3, 0xa9f3, 0xac49, 0x9cf3, 0xceea, 0xaec7, 0xd1d2,
+  0xd1d0, 0xd1d1, 0xaec8, 0xd1cf, 0xb1db, 0xb1dc, 0xd5a8, 0xb1dd,
+  0xb1da, 0xd97d, 0xfcd0, 0xd97e, 0xddbe, 0x95bb, 0xba59, 0xba58,
+  0xecf1, 0xefd9, 0xf24a, 0xf249, 0xf44f, 0xfcd3, 0xc95e, 0xac4a,
+  0xfcd4, 0xa4e9, 0xa5b9, 0xa6ae, 0xa6ad, 0xa6af, 0xa6b0, 0xc9ee,
+  0xc9ed, 0xcaf8, 0xa7f2, 0xcafb, 0xcafa, 0xcaf9, 0xcafc, 0xa9f4,
+  0xccc9, 0xccc5, 0xccce, 0x8dae, 0xa9fb, 0xa9f9, 0xccca, 0xccc6,
+  0xcccd, 0xa9f8, 0xaa40, 0xccc8, 0xccc4, 0xa9fe, 0xcccb, 0xa9f7,
+  0xcccc, 0xa9fa, 0xa9fc, 0xccd0, 0xcccf, 0xccc7, 0xa9f6, 0xa9f5,
+  0xa9fd, 0xfcd7, 0xceef, 0xcef5, 0x93db, 0xac50, 0xac4d, 0xceec,
+  0xcef1, 0xfe63, 0xac53, 0xac4b, 0xcef0, 0xac4e, 0xac51, 0xcef3,
+  0xac4c, 0xcef8, 0xac4f, 0x93d5, 0xac52, 0xceed, 0xcef2, 0xcef6,
+  0xceee, 0xceeb, 0xcef7, 0xcef4, 0xaed0, 0xaec9, 0xaecc, 0xfcda,
+  0xaecf, 0xd1d5, 0x9b71, 0xaeca, 0xd1d3, 0xfcdd, 0xaece, 0xaecb,
+  0xd1d6, 0xaecd, 0x8daf, 0xfaf2, 0xd5ac, 0xb1df, 0xd5ab, 0xd5ad,
+  0xb1de, 0xb1e3, 0xd1d4, 0xd5aa, 0xd5ae, 0x93d8, 0xb1e0, 0xd5a9,
+  0xb1e2, 0xfcdf, 0xb1e1, 0xd9a7, 0x93d3, 0xd9a2, 0xb4b6, 0xb4ba,
+  0xb4b7, 0xd9a5, 0xd9a8, 0xfce1, 0xb4b8, 0xb4b9, 0xb4be, 0xddc7,
+  0xd9a6, 0xb4bc, 0xd9a3, 0xd9a1, 0x8e76, 0xb4bd, 0xd9a4, 0xb779,
+  0xfc62, 0xddbf, 0xb776, 0xb777, 0xb775, 0xddc4, 0xddc3, 0xddc0,
+  0xb77b, 0x93d1, 0xddc2, 0xb4bb, 0x8db1, 0xddc6, 0xddc1, 0xb778,
+  0xb774, 0xb77a, 0xddc5, 0x9859, 0xba5c, 0xe1f8, 0xe1f7, 0xe1f6,
+  0xba5a, 0xfb52, 0xba5b, 0xe5c5, 0xe5c8, 0xbcc8, 0xfb53, 0xbcc7,
+  0xe5c9, 0xe5c4, 0xbcca, 0xe5c6, 0xfb4d, 0xbcc9, 0xe5c3, 0x9cbf,
+  0xe5c7, 0xbee9, 0xbee6, 0xe9bb, 0xe9ba, 0xe9b9, 0xe9b4, 0x9b72,
+  0xe9b5, 0xbee7, 0xbee4, 0xbee8, 0xe9b3, 0xbee5, 0xe9b6, 0xe9b7,
+  0xe9bc, 0xfb50, 0x93be, 0xe9b8, 0xecf2, 0xc0c7, 0xefdc, 0xc0c6,
+  0xefda, 0xefdb, 0xc260, 0xc36e, 0xf24b, 0xc36d, 0xf451, 0xf452,
+  0xc466, 0xf450, 0xc4e4, 0xf7df, 0xc5ce, 0xf8aa, 0xf8ab, 0xa4ea,
+  0x9df1, 0xa6b1, 0xa6b2, 0xa7f3, 0xccd1, 0xac54, 0xaed1, 0xb1e4,
+  0xb0d2, 0xb4bf, 0xb4c0, 0xb3cc, 0xd9a9, 0xfceb, 0xb77c, 0xe1fa,
+  0xe1f9, 0xa4eb, 0xa6b3, 0xccd2, 0xaa42, 0xa0bb, 0xaa41, 0x9b7e,
+  0xcef9, 0xcefa, 0xd1d7, 0xd1d8, 0xaed2, 0xaed3, 0x8db3, 0xaed4,
+  0xd5af, 0x8c52, 0xb1e6, 0xb4c2, 0x9ae8, 0xb4c1, 0xddc8, 0xdf7a,
+  0xe1fb, 0xe9bd, 0x8edc, 0xc261, 0xc467, 0xa4ec, 0xa5bc, 0xa5bd,
+  0xa5bb, 0xa5be, 0xa5ba, 0xa6b6, 0xc9f6, 0xa6b5, 0xa6b7, 0x9cf9,
+  0xc9f1, 0xc9f0, 0xc9f3, 0xc9f2, 0xc9f5, 0xa6b4, 0xc9ef, 0xc9f4,
+  0xfa50, 0xcafd, 0xa7fd, 0xcafe, 0xcb43, 0xa7fc, 0xcb47, 0xcb42,
+  0xcb45, 0xa7f5, 0xa7f6, 0xa7f7, 0xa7f8, 0xa840, 0xcb41, 0xa7fa,
+  0xa841, 0xcb40, 0xcb46, 0xa7f9, 0xcb44, 0xa7fb, 0xa7f4, 0xa7fe,
+  0x98e7, 0xfcf3, 0xfcf2, 0xaa57, 0x8cca, 0xccd4, 0xaa43, 0xaa4d,
+  0xaa4e, 0xaa46, 0xaa58, 0xaa48, 0xccdc, 0xaa53, 0xccd7, 0xaa49,
+  0xcce6, 0xcce7, 0xccdf, 0xccd8, 0xaa56, 0xcce4, 0xaa51, 0xaa4f,
+  0xcce5, 0xcce3, 0xccdb, 0xccd3, 0xccda, 0xaa4a, 0xaa50, 0xaa44,
+  0xccde, 0xccdd, 0xccd5, 0x93e5, 0xaa52, 0xcce1, 0xccd6, 0xaa55,
+  0xcce8, 0xaa45, 0xaa4c, 0xccd9, 0xcce2, 0xaa54, 0xaa47, 0xaa4b,
+  0xcce0, 0x9a59, 0x8db5, 0xfd4d, 0xcf5b, 0xac5c, 0xac69, 0xfd5e,
+  0xcf56, 0xcf4c, 0xac62, 0xcf4a, 0xac5b, 0xcf45, 0xac65, 0xcf52,
+  0xcefe, 0xcf41, 0x8f7d, 0xcf44, 0xcefb, 0xcf51, 0xcf61, 0xac60,
+  0xcf46, 0xcf58, 0xcefd, 0xcf5f, 0xcf60, 0xcf63, 0xcf5a, 0xcf4b,
+  0xcf53, 0xac66, 0xac59, 0xac61, 0xac6d, 0xac56, 0xac58, 0x9547,
+  0xfcf6, 0xcf43, 0xac6a, 0xac63, 0xcf5d, 0xcf40, 0xac6c, 0xac67,
+  0xcf49, 0xac6b, 0xcf50, 0xcf48, 0xac64, 0xcf5c, 0xcf54, 0xac5e,
+  0xcf62, 0xcf47, 0xac5a, 0xcf59, 0xcf4f, 0xac5f, 0xcf55, 0xac57,
+  0xcefc, 0xac68, 0xaee3, 0xac5d, 0xcf4e, 0xcf4d, 0xcf42, 0x9250,
+  0xcf5e, 0xcf57, 0x8968, 0xac55, 0x8db6, 0xfcfb, 0xa07d, 0x98fc,
+  0x8969, 0xfe4f, 0x9256, 0xd1ec, 0xaeea, 0xd1ed, 0xd1e1, 0xaedf,
+  0xaeeb, 0xd1da, 0xfac9, 0xd1e3, 0xd1eb, 0x93e8, 0xd1d9, 0xd1f4,
+  0xaed5, 0xfcf8, 0xd1f3, 0xd1ee, 0xd1ef, 0xaedd, 0xaee8, 0xd1e5,
+  0xd1e6, 0xd1f0, 0xd1e7, 0xd1e2, 0xd1dc, 0xd1dd, 0xd1ea, 0xd1e4,
+  0x9ce3, 0xfda9, 0xaed6, 0xaeda, 0xd1f2, 0xd1de, 0xaee6, 0xaee2,
+  0xfc44, 0xaee5, 0xaeec, 0xaedb, 0xaee7, 0xd1e9, 0xaee9, 0xaed8,
+  0x9640, 0xaed7, 0xd1db, 0x8db8, 0xd1df, 0xaee0, 0xd1f1, 0xd1e8,
+  0xd1e0, 0xaee4, 0xaee1, 0xaed9, 0xaedc, 0x9b4a, 0x8fb9, 0xfcfe,
+  0x896a, 0xd5c4, 0xd5b4, 0xd5b5, 0xd5b9, 0xd5c8, 0xd5c5, 0xd5be,
+  0xd5bd, 0xb1ed, 0xd5c1, 0xd5d0, 0xd5b0, 0xd5d1, 0xd5c3, 0xd5d5,
+  0xd5c9, 0xb1ec, 0xd5c7, 0xb1e7, 0xb1fc, 0xb1f2, 0x8db9, 0xb1f6,
+  0xb1f5, 0xd5b1, 0x917e, 0xd5ce, 0xd5d4, 0xd5cc, 0xd5d3, 0xd5c0,
+  0xd5b2, 0xd5d2, 0xd5c2, 0xb1ea, 0xb1f7, 0xd5cb, 0xb1f0, 0x93f4,
+  0xd5ca, 0xd5b3, 0xb1f8, 0xb1fa, 0xd5cd, 0xb1fb, 0xb1e9, 0xd5ba,
+  0xd5cf, 0xfb7c, 0xb1ef, 0xb1f9, 0xd5bc, 0xd5c6, 0xd5b7, 0xd5bb,
+  0xb1f4, 0xd5b6, 0xb1e8, 0xb1f1, 0xb1ee, 0xd5bf, 0xaede, 0xd9c0,
+  0xb1eb, 0x93e7, 0x97ef, 0xfe4a, 0xfd45, 0xb1f3, 0x96a5, 0xd9c3,
+  0xd9d9, 0xd9ce, 0xb4d6, 0xfee0, 0xb4d1, 0xd9bd, 0xb4d2, 0xd9cd,
+  0xd9c6, 0xd9d3, 0xb4ce, 0xd9ab, 0xd9d5, 0xb4c4, 0xd9b3, 0xb4c7,
+  0xb4c6, 0xb4d7, 0xd9ad, 0xd9cf, 0xd9d0, 0xb4c9, 0xb4c5, 0xd9bb,
+  0xb4d0, 0xd9b6, 0xd9d1, 0xb4cc, 0xd9c9, 0xd9d6, 0xd9b0, 0xd9b5,
+  0xd9af, 0xb4cb, 0xd9c2, 0xddde, 0xd9b1, 0xb4cf, 0xd9ba, 0xd9d2,
+  0xb4ca, 0xd9b7, 0xd9b4, 0xd9c5, 0xb4cd, 0xb4c3, 0xb4d9, 0xd9c8,
+  0xd9c7, 0xfd48, 0xfd47, 0xfef2, 0xfe6a, 0xd9ac, 0xb4c8, 0xd9d4,
+  0xd9bc, 0xd9be, 0x8dbd, 0xd9cb, 0xd9ca, 0xd9aa, 0xb4d3, 0xb4d5,
+  0xd9b2, 0xd9b9, 0xd9c1, 0xb4d4, 0xd9b8, 0xd9c4, 0xd9d7, 0xd9cc,
+  0x9ba1, 0x8ca2, 0x9ab7, 0x8efc, 0xd9d8, 0xd9ae, 0x9fa1, 0xddf2,
+  0xb7a6, 0xddf0, 0xdddb, 0xdde0, 0xddd9, 0xfd51, 0xddec, 0xddcb,
+  0xddd2, 0xddea, 0xddf4, 0xdddc, 0xfaad, 0xddcf, 0xdde2, 0xdde7,
+  0xddd3, 0x8dbe, 0xdde4, 0xddd0, 0x89a4, 0xddd7, 0xddd8, 0xb7a8,
+  0xddeb, 0xdde9, 0xddcc, 0xddee, 0xddef, 0xddf1, 0xb7ac, 0xb7a4,
+  0x9ad9, 0xd5b8, 0xddd4, 0xdde6, 0xddd5, 0xb7a1, 0xb7b1, 0xdded,
+  0xb7af, 0xb7ab, 0xddca, 0xb7a3, 0xfd4e, 0xddcd, 0xb7b0, 0x8dc0,
+  0xdddd, 0xddc9, 0x97f0, 0xb7a9, 0xdde1, 0xddd1, 0xb7aa, 0xddda,
+  0xb77e, 0xb4d8, 0xdde3, 0xd9bf, 0xddce, 0x93b4, 0xfd44, 0xdde8,
+  0xb7a5, 0xdde5, 0xb7a2, 0xdddf, 0xb7ad, 0xddd6, 0xddf3, 0x9fa7,
+  0xb7a7, 0xdec6, 0x8dc2, 0xb7ae, 0x99b6, 0xe24a, 0xe248, 0xe25e,
+  0xe246, 0xe258, 0xb77d, 0xba5f, 0xe242, 0xe25d, 0xfd52, 0xe247,
+  0xe255, 0xba64, 0xba5d, 0xe25b, 0x8dc1, 0xe240, 0xe25a, 0x8e46,
+  0xba6f, 0xe251, 0xe261, 0xba6d, 0xe249, 0xba5e, 0xe24b, 0xe259,
+  0xba67, 0xe244, 0xba6b, 0xba61, 0xe24d, 0xe243, 0xe1fc, 0xa0d1,
+  0xe257, 0xba68, 0xe260, 0xe1fd, 0xba65, 0xe253, 0xba66, 0xe245,
+  0xe250, 0xe24c, 0xe24e, 0x9fca, 0xba60, 0xe25f, 0xba6e, 0xe24f,
+  0xe262, 0xe1fe, 0xe254, 0xba63, 0xba6c, 0xba6a, 0xe241, 0xe256,
+  0xba69, 0x92cf, 0xba62, 0xe252, 0x9cf4, 0x8dc4, 0xe25c, 0xfd41,
+  0xe5d5, 0xe5d1, 0xe5cd, 0xe5e1, 0xe5de, 0xbccd, 0x9b4c, 0xe5e5,
+  0xe5d4, 0xbcd8, 0xe5db, 0xe5d0, 0xe5da, 0xbcd5, 0xe5ee, 0xe5eb,
+  0xe5dd, 0xe5ce, 0xfd57, 0xfcef, 0xe5e2, 0xe5e4, 0xbcd1, 0xe5d8,
+  0xe5d3, 0xe5ca, 0xbcce, 0xbcd6, 0x9cde, 0xe5e7, 0xbcd7, 0xe5cb,
+  0xe5ed, 0xe5e0, 0xe5e6, 0xbcd4, 0xfd42, 0x986c, 0xe5e3, 0xe5ea,
+  0xbcd9, 0xbcd3, 0xe5dc, 0xe5cf, 0xe5ef, 0xe5cc, 0xe5e8, 0xbcd0,
+  0x97f9, 0xe5d6, 0x9558, 0xe5d7, 0xbccf, 0xbccc, 0xe5d2, 0xbcd2,
+  0xbccb, 0xe5e9, 0xe5ec, 0xe5d9, 0xe9ca, 0x985e, 0xfe7b, 0x94cd,
+  0xe9c2, 0x93ee, 0xe9be, 0xbef6, 0xbeeb, 0xbef0, 0xbeec, 0xe9cc,
+  0xe9d7, 0xbeea, 0xe9c4, 0xe9cd, 0xe5df, 0xe9ce, 0x8ca3, 0xbef1,
+  0xfd5a, 0xe9dd, 0xbef5, 0xbef8, 0xe9c0, 0xbef4, 0x93f5, 0xe9db,
+  0xe9dc, 0xe9d2, 0xe9d1, 0xe9c9, 0x93ef, 0x8eea, 0xe9d3, 0xe9da,
+  0xe9d9, 0x8f5b, 0xbeef, 0xbeed, 0xe9cb, 0xe9c8, 0xe9c5, 0xe9d8,
+  0xbef7, 0xe9d6, 0xbef3, 0xbef2, 0x8c5e, 0xe9d0, 0x8dc6, 0xe9bf,
+  0xe9c1, 0xe9c3, 0xe9d5, 0xe9cf, 0xbeee, 0xe9c6, 0xe9d4, 0x8dc8,
+  0x8dc7, 0xe9c7, 0x93f7, 0xc0cf, 0xed45, 0xc0c8, 0xecf5, 0x8dc9,
+  0xed41, 0xc0ca, 0xed48, 0xecfc, 0xecf7, 0xfbf2, 0xed49, 0xecf3,
+  0xecfe, 0x9670, 0xc0d1, 0xed44, 0xed4a, 0xecfd, 0xc0c9, 0xed40,
+  0xecf4, 0xc0d0, 0x8dcb, 0xed47, 0xecf9, 0xc0cc, 0xfd5c, 0xecfb,
+  0xecf8, 0xc0d2, 0xecfa, 0xc0cb, 0xc0ce, 0xed43, 0xecf6, 0xed46,
+  0x8f65, 0xed42, 0x8dcd, 0xc263, 0xefe7, 0xc268, 0xc269, 0x9da8,
+  0x94f9, 0xc262, 0xefe6, 0x8dce, 0xefe3, 0xefe4, 0xc266, 0xefde,
+  0xefe2, 0xc265, 0xefdf, 0x93ea, 0xc267, 0xc264, 0xefdd, 0xefe1,
+  0xefe5, 0xfd5f, 0x93f0, 0x9fb6, 0xf251, 0xf24e, 0xf257, 0xf256,
+  0xf254, 0xf24f, 0xc372, 0x8dcf, 0x9763, 0xf250, 0xc371, 0xc0cd,
+  0xf253, 0xc370, 0xf258, 0xf252, 0xf24d, 0xefe0, 0xc36f, 0xf24c,
+  0xf456, 0xf455, 0xf255, 0xc468, 0xf459, 0xf45a, 0xf454, 0xf458,
+  0xf453, 0x8dd0, 0xf5d1, 0xf457, 0xc4e7, 0xc4e5, 0xf5cf, 0xf5d2,
+  0xf5ce, 0xf5d0, 0xc4e6, 0x93f1, 0xf6e5, 0xf6e6, 0xc576, 0xf6e4,
+  0xf7e2, 0xc5cf, 0xf7e0, 0xf7e1, 0xf8ac, 0xc656, 0xf8f3, 0xf8f1,
+  0xf8f2, 0xf8f4, 0xfd62, 0xf9bb, 0xa4ed, 0xa6b8, 0xaa59, 0xcce9,
+  0xcf64, 0xd1f5, 0xd1f7, 0xd1f6, 0xd1f8, 0xb1fd, 0xd5d7, 0xd1f9,
+  0xfd65, 0xd5d6, 0xd5d8, 0xd5d9, 0xd9da, 0xb4db, 0xd9db, 0xd9dd,
+  0xb4dc, 0xb4da, 0xd9dc, 0xddfa, 0xddf8, 0xddf7, 0xddf6, 0xddf5,
+  0xb7b2, 0xddf9, 0xba70, 0xe263, 0xe265, 0xba71, 0xe264, 0xbcdb,
+  0xbcda, 0xe5f0, 0x9fdb, 0xe9df, 0xe9de, 0xe9e0, 0x93f8, 0xbef9,
+  0xed4b, 0xc0d3, 0xefe8, 0xc26a, 0xf259, 0xc577, 0xa4ee, 0xa5bf,
+  0xa6b9, 0xa842, 0xaa5a, 0xaa5b, 0xac6e, 0xd1fa, 0x8bf7, 0xb7b3,
+  0xfd66, 0xe6d1, 0xbefa, 0xc26b, 0xa4ef, 0x8bcf, 0xa6ba, 0xcceb,
+  0xaa5c, 0xccea, 0x8dd1, 0xcf65, 0xac6f, 0xcf66, 0xac70, 0xd1fc,
+  0xaeee, 0xaeed, 0xd5de, 0xd5dc, 0xd5dd, 0xd5db, 0xd5da, 0xd9de,
+  0xd9e1, 0xb4de, 0xd9df, 0xb4dd, 0xd9e0, 0xddfb, 0xe266, 0xe267,
+  0xe268, 0xe5f3, 0xe5f2, 0xbcdc, 0xe5f1, 0xe5f4, 0xe9e1, 0xe9e2,
+  0xe9e3, 0xed4c, 0xc0d4, 0xc26c, 0xf25a, 0xc4e8, 0xc95f, 0xac71,
+  0xcf67, 0xaeef, 0xb1fe, 0xb4df, 0xd9e2, 0xb7b5, 0xb7b4, 0x8dd2,
+  0xe269, 0xe26a, 0xbcdd, 0xbcde, 0xe9e5, 0xe9e4, 0xefe9, 0xf7e3,
+  0xa4f0, 0xc960, 0xa5c0, 0xa843, 0xcb48, 0xac72, 0xb7b6, 0xa4f1,
+  0xcf68, 0xac73, 0xcf69, 0xc0d5, 0xa4f2, 0xfd71, 0xccec, 0xcf6a,
+  0xfd6f, 0xd242, 0xd241, 0xd1fe, 0xd1fd, 0xd243, 0xd240, 0x8dd3,
+  0xb240, 0xb241, 0xb4e0, 0xd9e3, 0xd9e4, 0xd9e5, 0xde41, 0xde42,
+  0xde40, 0x9fe7, 0xddfd, 0xddfe, 0xb7b7, 0xe26b, 0xe5f7, 0xe5f6,
+  0xe5f5, 0xe5f8, 0xe9e7, 0xe9e6, 0xbefb, 0xe9e8, 0xc0d6, 0xed4d,
+  0xefea, 0xf25b, 0xf6e7, 0xa4f3, 0xa5c2, 0xa5c1, 0xaa5d, 0xc961,
+  0xc97e, 0xa6bb, 0xc9f7, 0xcb49, 0xcb4a, 0xaa5e, 0x90bd, 0xcced,
+  0xac74, 0xcf6b, 0xcf6c, 0xaef0, 0xaef4, 0xd244, 0xaef3, 0xaef1,
+  0xaef2, 0xd5df, 0xb242, 0xb4e3, 0xb4e1, 0xb4e2, 0xd9e6, 0x9fd0,
+  0xba72, 0xa4f4, 0x8bd0, 0xc9a1, 0xfd72, 0xa5c3, 0x9cae, 0x8bd1,
+  0xc9a4, 0x8adb, 0xa5c6, 0xc9a3, 0xa5c5, 0xa5c4, 0xa844, 0xc9a2,
+  0xc9f8, 0xfae4, 0xc9fc, 0xc9fe, 0xca40, 0xa6c5, 0xa6c6, 0xc9fb,
+  0xa6c1, 0xc9f9, 0xc9fd, 0xa6c2, 0xa6bd, 0x95ce, 0xa6be, 0xfd76,
+  0xa6c4, 0xc9fa, 0xa6bc, 0xa845, 0xa6bf, 0xa6c0, 0xa6c3, 0xcb5b,
+  0xcb59, 0xcb4c, 0xa851, 0xcb53, 0xa84c, 0xcb4d, 0xcb55, 0xfb62,
+  0xcb52, 0xa84f, 0xcb51, 0xa856, 0xcb5a, 0xa858, 0x8dd4, 0xa85a,
+  0xcb4b, 0xfd78, 0xa84d, 0xcb5c, 0xa854, 0xa857, 0x8ee3, 0xcd45,
+  0xa847, 0xa85e, 0xa855, 0xcb4e, 0xa84a, 0xa859, 0xcb56, 0xa848,
+  0xa849, 0xcd43, 0xcb4f, 0xa850, 0xa85b, 0xcb5d, 0xcb50, 0xa84e,
+  0xa853, 0xccee, 0xa85c, 0xcb57, 0xa852, 0xa85d, 0xa846, 0xcb54,
+  0xa84b, 0xcb58, 0xcd44, 0x9076, 0x98c6, 0x8dd5, 0xaa6a, 0xaa7a,
+  0xccf5, 0xaa71, 0x97d1, 0xcd4b, 0xaa62, 0x9eb6, 0xaa65, 0xcd42,
+  0xccf3, 0xccf7, 0xaa6d, 0xaa6f, 0xccfa, 0xaa76, 0xaa68, 0xaa66,
+  0xaa67, 0xaa75, 0xcd47, 0xaa70, 0xccf9, 0xccfb, 0xaa6e, 0xaa73,
+  0xccfc, 0xcd4a, 0xac75, 0xaa79, 0xfac7, 0xaa63, 0xcd49, 0xa042,
+  0xcd4d, 0xccf8, 0xcd4f, 0xcd40, 0xaa6c, 0xccf4, 0xaa6b, 0xaa7d,
+  0xaa72, 0xccf2, 0xcf75, 0xaa78, 0xaa7c, 0xcd41, 0xcd46, 0x9873,
+  0xaa7e, 0xaa77, 0xaa69, 0xaa5f, 0xaa64, 0xccf6, 0xaa60, 0xcd4e,
+  0x9ffc, 0xccf0, 0xccef, 0xccfd, 0xccf1, 0xaa7b, 0xaef5, 0xaa74,
+  0xccfe, 0xaa61, 0xaca6, 0xcd4c, 0x8ca5, 0xcf7c, 0xcfa1, 0x8dd7,
+  0xcfa4, 0xcf77, 0x92fb, 0x8dd8, 0xcfa7, 0xcfaa, 0xcfac, 0xcf74,
+  0xac76, 0xac7b, 0xd249, 0xacad, 0xcfa5, 0xcfad, 0xcf7b, 0xcf73,
+  0xd264, 0xac7e, 0xcfa2, 0xcf78, 0xcf7a, 0xaca5, 0xcf7d, 0xac7d,
+  0xcf70, 0xcfa8, 0xcfab, 0x944f, 0xac7a, 0x8dd9, 0xaca8, 0xcf6d,
+  0xacaa, 0xac78, 0xacae, 0xcfa9, 0xcf6f, 0xacab, 0xd25e, 0xcd48,
+  0xac7c, 0xac77, 0xcf76, 0xcf6e, 0xacac, 0xaca4, 0xcfa3, 0xaca9,
+  0xaca7, 0xcf79, 0xaca1, 0xcf71, 0xaca2, 0xaca3, 0xcf72, 0xcfa6,
+  0xac79, 0xcf7e, 0x896b, 0x97ce, 0xd24c, 0xaefd, 0xaf43, 0xfaf3,
+  0xfdae, 0xd255, 0xd25b, 0xd257, 0xd24a, 0xd24d, 0xd246, 0xd247,
+  0xaf4a, 0xaefa, 0xd256, 0xd25f, 0xaf45, 0xaef6, 0xaf40, 0xd24e,
+  0xaf42, 0xd24f, 0xd259, 0xfbaf, 0x92b7, 0xaf44, 0xd268, 0xd248,
+  0xaefc, 0xaefb, 0xaf48, 0xd245, 0xd266, 0xd25a, 0xd267, 0xd261,
+  0xd253, 0xd262, 0x8dda, 0xd25c, 0xd265, 0xd263, 0xaf49, 0xd254,
+  0xaef9, 0xaef8, 0xaf41, 0xaf47, 0xd260, 0xaf46, 0xd251, 0xb243,
+  0x9c5a, 0xd269, 0xd250, 0xd24b, 0xaefe, 0xaf4b, 0xaef7, 0xfdad,
+  0xd258, 0xd25d, 0x8ddc, 0x9444, 0xb265, 0xd5e1, 0xd5e5, 0xb252,
+  0xb250, 0x8ddd, 0xb247, 0xd5e3, 0xd5e2, 0xb25b, 0xd5e8, 0xb255,
+  0xa0d6, 0xd5fa, 0xd647, 0xb244, 0xd5f7, 0xd5f0, 0xb267, 0xd5e0,
+  0xd5fc, 0xb264, 0xb258, 0xb263, 0xb24e, 0xd5ec, 0xd5fe, 0xd5f6,
+  0xb24f, 0xb249, 0xd645, 0xd5fd, 0xd640, 0xb251, 0xb259, 0xd642,
+  0xd5ea, 0xd5fb, 0xd5ef, 0xd644, 0xb25e, 0xb246, 0xb25c, 0xd5f4,
+  0xd5f2, 0xd5f3, 0xb253, 0xd5ee, 0xd5ed, 0xb248, 0xd5e7, 0xd646,
+  0xb24a, 0xd5f1, 0xb268, 0xb262, 0xd5e6, 0xb25f, 0xb25d, 0xb266,
+  0xd5f8, 0xb261, 0xd252, 0xd5f9, 0xb260, 0xd641, 0xb245, 0xd5f5,
+  0xb257, 0xd5e9, 0xb256, 0xb254, 0xb24c, 0xb24b, 0xd9e7, 0xd643,
+  0x8c41, 0xd5eb, 0x97d5, 0xd9fc, 0x944a, 0xb24d, 0x944d, 0x97cb,
+  0x8dde, 0x8ddf, 0xb541, 0xb25a, 0xb4ee, 0xd9f6, 0xb4fc, 0xd9ea,
+  0xb4eb, 0xb4e7, 0xda49, 0xb4ed, 0xb4f1, 0xb4ec, 0xb4f5, 0xda4d,
+  0xda44, 0x8de0, 0xfef9, 0xd9f1, 0xb4fa, 0xb4f4, 0xd9fd, 0xb4e4,
+  0xda4a, 0xda43, 0xb4e8, 0xd9f7, 0xb4f7, 0xda55, 0xda56, 0xb4e5,
+  0xda48, 0xb4f9, 0xd9fb, 0xd9ed, 0xd9ee, 0xb4fd, 0xd9f2, 0xd9f9,
+  0xd9f3, 0xb4fb, 0xb544, 0xd9ef, 0xd9e8, 0xd9e9, 0xd9eb, 0xb4ea,
+  0xd9f8, 0xb4f8, 0xb542, 0xfdc0, 0xfcf9, 0xd9fa, 0xda53, 0xda4b,
+  0xb4e6, 0xda51, 0xb4f2, 0xb4f0, 0xfb7e, 0xda57, 0xb4ef, 0xda41,
+  0xd9f4, 0xd9fe, 0xb547, 0xda45, 0xda42, 0xd9f0, 0xb543, 0xda4f,
+  0xda4c, 0xda54, 0xb4e9, 0xda40, 0xb546, 0xda47, 0xb4f3, 0xb4f6,
+  0xda46, 0xb545, 0xd9f5, 0xd5e4, 0x92b3, 0xda50, 0xda4e, 0xda52,
+  0xfdaf, 0x8de1, 0xd9ec, 0xb540, 0x95d3, 0xde61, 0xde60, 0xde46,
+  0xb7bd, 0xde5f, 0xde49, 0xde4a, 0xb7c7, 0xde68, 0xb7c2, 0xde5e,
+  0x89c1, 0xde43, 0xb7c8, 0xb7be, 0xde52, 0xde48, 0xde4b, 0xde63,
+  0xb7b8, 0xde6a, 0xde62, 0xb7c1, 0xde57, 0xb7cc, 0xb7cb, 0xb7c5,
+  0xde69, 0xb7b9, 0xde55, 0xde4c, 0xde59, 0xde65, 0xb7cd, 0xfd68,
+  0xb7bb, 0xde54, 0x9cb7, 0xde4d, 0xb7c4, 0x8de3, 0xb7c3, 0xde50,
+  0xde5a, 0xde64, 0xde47, 0xde51, 0xb7bc, 0xde5b, 0xb7c9, 0xb7c0,
+  0xde4e, 0xb7bf, 0xde45, 0xde53, 0xde67, 0xb4fe, 0xbab0, 0xde56,
+  0xe26c, 0xde58, 0xde66, 0xb7c6, 0xde4f, 0xb7ba, 0xb7ca, 0xbcf0,
+  0xde44, 0xde5d, 0xfac0, 0x8de5, 0xfa64, 0xde5c, 0x8947, 0x8de4,
+  0x8de7, 0x8de8, 0xe2aa, 0xbaad, 0xe27d, 0xe2a4, 0xbaa2, 0xe26e,
+  0xbaaf, 0xba77, 0xe26d, 0xe2b0, 0xbab1, 0xe271, 0xe2a3, 0xfdc7,
+  0xe273, 0xe2b3, 0xe2af, 0xba75, 0xbaa1, 0xe653, 0xbaae, 0xba7d,
+  0xe26f, 0xfdb0, 0xe2ae, 0xbaa3, 0xe2ab, 0xe2b8, 0xe275, 0xe27e,
+  0x9445, 0x97d6, 0xe2b6, 0xe2ac, 0xba7c, 0xe27c, 0xba76, 0xba74,
+  0xbaa8, 0xfcc6, 0x9844, 0xe27a, 0xe277, 0xe278, 0xe2b2, 0xe2b7,
+  0xe2b5, 0xba7a, 0xe2b9, 0xba7e, 0xbaa7, 0x8de9, 0xe270, 0xe5fa,
+  0xe279, 0xba78, 0xbaac, 0xbaa9, 0xba7b, 0xe2a5, 0xe274, 0xbaaa,
+  0xe2a7, 0xbaa4, 0xbaa6, 0xba73, 0x8dea, 0xe2a9, 0xe2a1, 0xe272,
+  0xbaa5, 0xe2b1, 0xe2b4, 0xe27b, 0xe2a8, 0xfe50, 0xba79, 0xbcdf,
+  0xe2a6, 0xe5f9, 0xe2ad, 0xfdcc, 0xe276, 0xe644, 0xe64e, 0xbce2,
+  0xe64d, 0xe659, 0xbce4, 0xe64b, 0x9da7, 0xe64f, 0xbcef, 0xe646,
+  0xbce7, 0xfdcd, 0xe652, 0xe9f0, 0xbcf3, 0xbcf2, 0xe654, 0xe643,
+  0xe65e, 0xbced, 0xbce3, 0xe657, 0xe65b, 0xe660, 0xe655, 0xe649,
+  0xbce6, 0xbce9, 0xbcf1, 0xbcec, 0xe64c, 0xe2a2, 0xfdcf, 0xe648,
+  0xe65f, 0xbce8, 0x95d2, 0xbceb, 0xe661, 0xbce0, 0xe656, 0xe5fb,
+  0xe65c, 0xc0df, 0x8ded, 0xe64a, 0xbce1, 0xe645, 0xbce5, 0xe5fc,
+  0xbaab, 0xe641, 0xfcba, 0xe65a, 0xe642, 0xe640, 0xbcea, 0xe658,
+  0xe5fe, 0xe651, 0xe650, 0xe65d, 0xe647, 0xbcee, 0xfdc5, 0xe9f3,
+  0xfdd2, 0xbf49, 0xbefe, 0xea40, 0xe9eb, 0xbf41, 0xe9f7, 0xbf48,
+  0xbf43, 0xe9f5, 0xed4f, 0xe9fb, 0xea42, 0xe9fa, 0xe9e9, 0xe9f8,
+  0xea44, 0xea46, 0xbefd, 0xea45, 0xbf44, 0xbf4a, 0x9cdc, 0xbf47,
+  0xe9fe, 0xbf46, 0xe9f9, 0x95cf, 0xe9ed, 0xe9f2, 0x8dee, 0xe9fd,
+  0xbf45, 0xbf42, 0xbefc, 0xbf40, 0xe9f1, 0xe5fd, 0xe9ec, 0xe9ef,
+  0xea41, 0xe9f4, 0xe9ea, 0xed4e, 0xea43, 0xe9ee, 0xe9fc, 0xfdd4,
+  0xed51, 0xc0e3, 0xc0d7, 0x96ec, 0x96eb, 0xc0db, 0xed53, 0xed59,
+  0xed57, 0xc0d9, 0xc0da, 0xc0e1, 0xed5a, 0xed52, 0xc0dc, 0xed56,
+  0xed55, 0xed5b, 0xc0e2, 0xc0dd, 0xc0e0, 0xed54, 0xc0e4, 0xc0de,
+  0xc0e5, 0xc0d8, 0xed58, 0xed50, 0x90b6, 0xeff7, 0xfdc3, 0xc271,
+  0xeff4, 0xeff6, 0xc26f, 0xeff2, 0xeff3, 0xefee, 0x98ab, 0xe9f6,
+  0xefef, 0xc270, 0xefeb, 0xc26d, 0xeff8, 0xc26e, 0xefec, 0xefed,
+  0xeff1, 0xc273, 0xc272, 0xeff0, 0xc378, 0xf25f, 0xf265, 0xc379,
+  0xf25c, 0xc376, 0xc373, 0xf267, 0xc377, 0x96ee, 0xc374, 0xf25e,
+  0xf261, 0xf262, 0xf263, 0xf266, 0xeff5, 0xf25d, 0xc375, 0xf264,
+  0xf268, 0xf260, 0x8df4, 0xf45d, 0xc46a, 0xf460, 0xc46b, 0xf468,
+  0xf45f, 0xf45c, 0xf45e, 0xf462, 0xf465, 0xf464, 0xf467, 0xf45b,
+  0xc469, 0xf463, 0xf466, 0xf469, 0xf461, 0xf5d3, 0xf5d4, 0xf5d8,
+  0xf5d9, 0xf5d6, 0xf5d7, 0xf5d5, 0xfde0, 0xc4e9, 0x8c67, 0x8df6,
+  0xc578, 0xf6eb, 0x8df7, 0xf6e8, 0xf6e9, 0xf6ea, 0xc579, 0xf7e5,
+  0xf7e4, 0x8ffa, 0xf8af, 0xc5f4, 0xf8ad, 0xf8b0, 0xf8ae, 0xf8f5,
+  0xc657, 0xc665, 0xf9a3, 0xf96c, 0x97d0, 0xf9a2, 0xf9d0, 0xf9d1,
+  0xa4f5, 0x8bd2, 0x8df8, 0xa6c7, 0xca41, 0xcb5e, 0x90d9, 0xa85f,
+  0x8c47, 0xa862, 0xfaf0, 0xcb5f, 0xa860, 0xa861, 0xfde1, 0x8df9,
+  0xfde3, 0xcd58, 0xcd5a, 0xcd55, 0xcd52, 0xcd54, 0x8dfa, 0xaaa4,
+  0xfb63, 0xaaa2, 0x90a6, 0xcd56, 0xaaa3, 0xcd53, 0xcd50, 0xaaa1,
+  0xcd57, 0xcd51, 0xaaa5, 0xcd59, 0xcfaf, 0x9970, 0xcfb3, 0x91eb,
+  0xacb7, 0x9770, 0x986f, 0xfde2, 0xcfb6, 0xacaf, 0xacb2, 0xacb4,
+  0xacb6, 0xacb3, 0xcfb2, 0xcfb1, 0xacb1, 0xcfb4, 0xcfb5, 0xcfae,
+  0xacb5, 0x98f2, 0xacb0, 0x9afc, 0x896c, 0xfdfd, 0xcfb0, 0x995e,
+  0x95bd, 0xd277, 0xd278, 0xd279, 0xaf50, 0xaf4c, 0xd26e, 0xfde4,
+  0xd276, 0xd27b, 0xaf51, 0x91e6, 0xd26c, 0xd272, 0xd26b, 0xd275,
+  0xfde5, 0xfde6, 0xd271, 0xaf4d, 0xaf4f, 0xd27a, 0xd26a, 0xd26d,
+  0xd273, 0xfde7, 0xd274, 0xd27c, 0xd270, 0xaf4e, 0xb26d, 0xd64e,
+  0x9454, 0xd650, 0xd64c, 0x99b8, 0xd658, 0xd64a, 0xd657, 0xb269,
+  0xd648, 0xda5b, 0xd652, 0xb26c, 0x97e9, 0xd653, 0xd656, 0xd65a,
+  0xd64f, 0x9346, 0xd654, 0xb26a, 0xb26b, 0xd659, 0xd64d, 0xd649,
+  0xd65b, 0xd651, 0xd655, 0xd64b, 0xb548, 0xb549, 0xda65, 0xb54f,
+  0x9863, 0xda59, 0xda62, 0xda58, 0xb54c, 0xda60, 0xda5e, 0xda5f,
+  0xb54a, 0xda63, 0x95bc, 0xfded, 0xfdf7, 0xda5c, 0xda5a, 0xb54b,
+  0xda5d, 0xda61, 0x9870, 0x96f6, 0x8ea9, 0xb54d, 0xda64, 0x9451,
+  0x8e43, 0x8b5a, 0xde70, 0xde77, 0xde79, 0xdea1, 0xfdee, 0xb7da,
+  0xde6b, 0xb7d2, 0xfdf0, 0xde7a, 0xb7d7, 0xdea2, 0xb7ce, 0xfdf4,
+  0xde7d, 0x9bf5, 0xde6d, 0xde7e, 0xde6c, 0xb7dc, 0xde78, 0xb7cf,
+  0xdea3, 0xb7d4, 0xde71, 0xb7d9, 0xde7c, 0xde6f, 0xde76, 0xde72,
+  0xde6e, 0xb7d1, 0xb7d8, 0xb7d6, 0xb7d3, 0xb7db, 0xb7d0, 0xde75,
+  0x977e, 0xb7d5, 0xb54e, 0xde7b, 0x9bd5, 0xde73, 0x9ac3, 0x97c8,
+  0xa0db, 0x91d0, 0xde74, 0x9fe4, 0xe2c1, 0x8fdd, 0xbab4, 0x91e9,
+  0xe2bd, 0xe2c3, 0xe2bf, 0xbab6, 0xe2be, 0xe2c2, 0xe2ba, 0x98e0,
+  0xe2bc, 0xbab5, 0x92ca, 0x9857, 0xe2c0, 0xe2bb, 0x8c51, 0xbab7,
+  0xbab2, 0xfdeb, 0xe2c4, 0x9b49, 0xbab3, 0xe667, 0xe664, 0xe670,
+  0xe66a, 0xe66c, 0xbcf4, 0xe666, 0xe66e, 0x9d76, 0x9eaf, 0xe66d,
+  0xe66b, 0xe671, 0xbcf7, 0xe668, 0xe66f, 0xbcf5, 0x9ccc, 0xe663,
+  0xe665, 0xbcf6, 0xe662, 0xe672, 0xfdea, 0xe669, 0x8df1, 0xea4a,
+  0xbf51, 0xfdfb, 0xea55, 0xea53, 0xbf4b, 0xea49, 0xea4c, 0xea4d,
+  0xea48, 0xbf55, 0xbf56, 0xea47, 0xea56, 0xea51, 0xbf4f, 0xbf4c,
+  0xea50, 0xea4e, 0xbf52, 0xea52, 0xbf4d, 0x8e53, 0xbf4e, 0xea4f,
+  0xbf50, 0xea4b, 0xea54, 0xbf53, 0xea57, 0xea58, 0xbf54, 0xfacf,
+  0xc0e7, 0xc0ee, 0xed5c, 0xed62, 0xed60, 0xc0ea, 0xc0e9, 0xc0e6,
+  0xed5e, 0x96f9, 0xc0ec, 0xc0eb, 0xc0e8, 0xed61, 0xed5d, 0xed5f,
+  0xc0ed, 0x98bf, 0x9e49, 0xc277, 0xeffb, 0xc274, 0xc275, 0xeffd,
+  0xc276, 0xeffa, 0x8ca7, 0xeff9, 0xf26c, 0xeffc, 0xf26d, 0xc37a,
+  0xf26b, 0x9bca, 0xf26a, 0xf269, 0xc37b, 0xfdfe, 0x92dc, 0xc46c,
+  0xf46a, 0xf46b, 0xfe41, 0x91cc, 0x91e2, 0xf5dc, 0xf5db, 0xc4ea,
+  0xf5da, 0xf6ec, 0xf6ed, 0xf7e6, 0xf8b1, 0xfe44, 0xf8f6, 0xf9bc,
+  0xc679, 0xf9c6, 0xa4f6, 0x8bd3, 0xaaa6, 0xaaa7, 0xfe47, 0xacb8,
+  0xc0ef, 0xa4f7, 0xaaa8, 0xaf52, 0xb7dd, 0xa4f8, 0xb26e, 0xbab8,
+  0xc962, 0xfe48, 0xcfb7, 0xd27d, 0xe2c5, 0xc0f0, 0xa4f9, 0xaaa9,
+  0xcfb8, 0xcfb9, 0xda66, 0xb550, 0xdea4, 0x9455, 0xb7de, 0xe2c6,
+  0xfe4b, 0xbcf8, 0xfe4c, 0xc37c, 0xa4fa, 0xda67, 0xa4fb, 0x8dbf,
+  0xa6c9, 0xca42, 0xa6c8, 0xa865, 0xa864, 0xa863, 0xcb60, 0x9e78,
+  0xaaaa, 0xaaab, 0xcd5b, 0xcfba, 0xcfbd, 0xacba, 0xcfbb, 0xacb9,
+  0xcfbc, 0xacbb, 0xd2a2, 0xd2a1, 0xd27e, 0xaf53, 0xd65d, 0xd65e,
+  0xb26f, 0xd65c, 0xd65f, 0xb552, 0xb270, 0xfe51, 0xb551, 0xda6b,
+  0xda6a, 0x9456, 0xda68, 0xda69, 0xda6c, 0xdea6, 0xdea5, 0xdea9,
+  0x9d61, 0xdea8, 0xdea7, 0xbab9, 0xe2c9, 0x9457, 0xe2c8, 0xbaba,
+  0xe2c7, 0xe673, 0xe674, 0xbcf9, 0xea59, 0xea5a, 0x9966, 0xf272,
+  0xc37d, 0xf271, 0xf270, 0xf26e, 0xf26f, 0xc4eb, 0xf46c, 0xf6ee,
+  0xf8f7, 0xa4fc, 0x8bd5, 0xc9a5, 0xa5c7, 0xc9a6, 0xa069, 0xca43,
+  0xca44, 0xcb66, 0xcb62, 0xcb61, 0xaaac, 0xcb65, 0xa867, 0xcb63,
+  0xa866, 0xcb67, 0xcb64, 0xcd5f, 0xcfbe, 0xcd5d, 0xcd64, 0x98b4,
+  0xaaad, 0xaab0, 0xcd65, 0xcd61, 0xcd62, 0xcd5c, 0xaaaf, 0xcd5e,
+  0xaaae, 0xcd63, 0xcd60, 0xcfc2, 0xacbd, 0xacbe, 0xa049, 0xcfc5,
+  0xcfbf, 0xcfc4, 0xcfc0, 0xacbc, 0xcfc3, 0xcfc1, 0xd2a8, 0xd2a5,
+  0xd2a7, 0xaf58, 0xaf57, 0xaf55, 0xd2a4, 0xd2a9, 0xaf54, 0xaf56,
+  0xd2a6, 0xd667, 0xd2a3, 0xd2aa, 0xa04c, 0x9e65, 0xd662, 0xd666,
+  0xd665, 0xda6e, 0xda79, 0xd668, 0x98b5, 0xd663, 0xda6d, 0xb274,
+  0xb273, 0xd661, 0xd664, 0xb275, 0xb272, 0xb271, 0xd660, 0xd669,
+  0xda70, 0xda77, 0xb554, 0xda76, 0xda73, 0xfe58, 0xb556, 0x9975,
+  0xfe53, 0xa065, 0xda75, 0xfe59, 0xda6f, 0xda71, 0xda74, 0xda72,
+  0xb555, 0xda78, 0xb553, 0xb7df, 0x98b7, 0x98b8, 0xdead, 0xdeac,
+  0xdeaa, 0xb7e2, 0xb7e1, 0xdeae, 0x98ba, 0xdeab, 0xe2ca, 0xbabb,
+  0xb7e0, 0x98bb, 0xdeb0, 0xdeaf, 0xe2cd, 0xe2cb, 0xbcfa, 0x9fbc,
+  0xbabc, 0xe2cc, 0xe676, 0xbcfb, 0xe675, 0xe67e, 0xe67d, 0xe67b,
+  0xe67a, 0xe677, 0xe678, 0xe679, 0xe67c, 0xe6a1, 0xea5f, 0xea5c,
+  0xea5d, 0xbf57, 0xea5b, 0xea61, 0xea60, 0xea5e, 0xed64, 0xed65,
+  0xc0f1, 0xa04a, 0xc0f2, 0xed63, 0x9ec7, 0xc279, 0xeffe, 0xc278,
+  0xc37e, 0xc3a1, 0xc46d, 0xf46e, 0xf46d, 0xf5dd, 0xf6ef, 0xc57a,
+  0xf7e8, 0xf7e7, 0xf7e9, 0xa5c8, 0xcfc6, 0xaf59, 0xb276, 0xd66a,
+  0xa5c9, 0xc9a7, 0xa4fd, 0x8ca9, 0xca45, 0x98ae, 0xcb6c, 0xcb6a,
+  0xcb6b, 0xcb68, 0xa868, 0xcb69, 0x92d6, 0xfae1, 0xcd6d, 0x91d4,
+  0xaab3, 0xcd6b, 0xcd67, 0xcd6a, 0xcd66, 0xaab5, 0xcd69, 0xfade,
+  0xaab2, 0xaab1, 0xfe5b, 0xaab4, 0xcd6c, 0xcd68, 0xacc2, 0xacc5,
+  0xcfce, 0xcfcd, 0xcfcc, 0xacbf, 0xcfd5, 0xcfcb, 0x8c53, 0xacc1,
+  0xd2af, 0xcfd2, 0xcfd0, 0xacc4, 0xcfc8, 0xcfd3, 0xcfca, 0xcfd4,
+  0xcfd1, 0xcfc9, 0xfe5e, 0xacc0, 0xcfd6, 0xcfc7, 0xacc3, 0xfbd7,
+  0xfe5a, 0x94c5, 0xd2b4, 0xd2ab, 0xd2b6, 0xfaca, 0xd2ae, 0xd2b9,
+  0xd2ba, 0xd2ac, 0xd2b8, 0xd2b5, 0xd2b3, 0xd2b7, 0xaf5f, 0xaf5d,
+  0x98c1, 0x975c, 0xd2b1, 0xfe74, 0xd2ad, 0x9773, 0xd2b0, 0xd2bb,
+  0xd2b2, 0xaf5e, 0xcfcf, 0xaf5a, 0xaf5c, 0xfa46, 0x9764, 0xd678,
+  0xd66d, 0xd66b, 0xfe68, 0xd66c, 0x964e, 0xd673, 0x9765, 0xd674,
+  0xd670, 0xb27b, 0xd675, 0xd672, 0xd66f, 0x8c5a, 0xb279, 0xd66e,
+  0xb277, 0xb27a, 0xd671, 0xd679, 0xaf5b, 0xb278, 0xd677, 0xd676,
+  0xb27c, 0x89a1, 0x95fa, 0x92d4, 0xfe69, 0xda7e, 0xfb45, 0x98c8,
+  0xdaa1, 0xb560, 0x90ef, 0xdaa7, 0x98c9, 0x98ca, 0xdaa9, 0xdaa2,
+  0xb55a, 0xdaa6, 0xdaa5, 0xb55b, 0xb561, 0xb562, 0xdaa8, 0xb558,
+  0xda7d, 0xda7b, 0xdaa3, 0xda7a, 0xb55f, 0xda7c, 0xdaa4, 0xdaaa,
+  0xb559, 0xb55e, 0xb55c, 0xb55d, 0x946d, 0x94b7, 0xfe6c, 0xb557,
+  0x946b, 0xb7e9, 0xdeb7, 0xb7e8, 0xdebb, 0x92fc, 0xdeb1, 0x95eb,
+  0xdebc, 0xfe73, 0x976e, 0xfe5f, 0xdeb2, 0xdeb3, 0xdebd, 0xdeba,
+  0xdeb8, 0xdeb9, 0xdeb5, 0xdeb4, 0xfdbd, 0xdebe, 0xb7e5, 0x92d5,
+  0xdeb6, 0xb7ea, 0xb7e4, 0xb7eb, 0xb7ec, 0xfeb9, 0xb7e7, 0xb7e6,
+  0xfe71, 0xe2ce, 0xbabe, 0xbabd, 0xfbbb, 0xe2d3, 0x947a, 0xbcfc,
+  0xbabf, 0x95fb, 0xfe77, 0xbac1, 0xe2d4, 0xb7e3, 0xbac0, 0xe2d0,
+  0xe2d2, 0xe2cf, 0xfe79, 0xe2d1, 0xfe75, 0xe6ab, 0x945d, 0xe6aa,
+  0xe6a7, 0xbd40, 0xea62, 0xbd41, 0xe6a6, 0xfe7c, 0xbcfe, 0xe6a8,
+  0xe6a5, 0xe6a2, 0xe6a9, 0xe6a3, 0xe6a4, 0xbcfd, 0x9344, 0x8ea6,
+  0xed69, 0xea66, 0xea65, 0xea67, 0xed66, 0xbf5a, 0x92d3, 0xea63,
+  0x94b8, 0xbf58, 0xbf5c, 0xbf5b, 0xea64, 0xea68, 0xbf59, 0xfc71,
+  0xed6d, 0xc0f5, 0xc27a, 0xc0f6, 0xc0f3, 0xed6a, 0xed68, 0xed6b,
+  0xed6e, 0xc0f4, 0xed6c, 0xed67, 0x975e, 0xf042, 0xf045, 0xf275,
+  0xf040, 0x8cad, 0xf46f, 0xf046, 0xc3a2, 0xf044, 0xc27b, 0xf041,
+  0xf043, 0xf047, 0xf276, 0xf274, 0xfea7, 0xc3a3, 0xf273, 0x946a,
+  0xc46e, 0x93e3, 0x98cf, 0xc4ed, 0xf6f1, 0xc4ec, 0xf6f3, 0xf6f0,
+  0xf6f2, 0xc5d0, 0xf8b2, 0xa5ca, 0xcd6e, 0xd2bc, 0xd2bd, 0xb27d,
+  0xdebf, 0xbf5d, 0xc3a4, 0xc57b, 0xf8b3, 0xa5cb, 0xa0d9, 0xcd6f,
+  0xa260, 0xcfd7, 0xcfd8, 0xa0bf, 0xa04d, 0xa0b8, 0xd2be, 0xd2bf,
+  0xb27e, 0xb2a1, 0xa0ce, 0xdaab, 0xdec2, 0xdec1, 0xdec0, 0xe2d5,
+  0xe2d6, 0xe2d7, 0xbac2, 0xa0b7, 0xe6ad, 0xe6ac, 0xea69, 0xbf5e,
+  0xbf5f, 0xfea9, 0xed72, 0xed6f, 0xed70, 0xed71, 0xf049, 0xf048,
+  0xc27c, 0xf277, 0xf5de, 0xa5cc, 0x89c3, 0xacc6, 0xb2a2, 0xdec3,
+  0xfeab, 0xa5cd, 0xd2c0, 0xb2a3, 0xb563, 0xb564, 0xa5ce, 0xa5cf,
+  0xca46, 0xa86a, 0xa869, 0xacc7, 0xcfd9, 0xdaac, 0xa5d0, 0xa5d1,
+  0xa5d2, 0xa5d3, 0x9df4, 0x896d, 0xa86b, 0xa86c, 0xcb6e, 0xcb6d,
+  0x9c7b, 0xaab6, 0xcd72, 0xcd70, 0xcd71, 0x98d2, 0x9fa9, 0xcfda,
+  0xcfdb, 0xfeb2, 0xaccb, 0xacc9, 0xfeb1, 0xacca, 0xacc8, 0x97d9,
+  0xa0c4, 0xaf60, 0x9476, 0xaf64, 0xaf63, 0xd2c1, 0xaf62, 0xaf61,
+  0xd2c2, 0x9978, 0xb2a6, 0xd67b, 0xd67a, 0xb2a4, 0xb2a5, 0xfeb3,
+  0xb566, 0xb565, 0xdaae, 0x98d3, 0xfeb4, 0xdaad, 0xb2a7, 0x98d4,
+  0xb7ed, 0xdec5, 0xb7ee, 0xdec4, 0x9fb9, 0xe2d8, 0xe6ae, 0xbd42,
+  0xea6a, 0x9471, 0xed73, 0xc3a6, 0xc3a5, 0xc57c, 0xa5d4, 0xcd73,
+  0x98d5, 0xfeb8, 0xb2a8, 0xe2d9, 0xbac3, 0xc6d4, 0xcb6f, 0xcb70,
+  0xcd74, 0xaab8, 0xaab9, 0xaab7, 0xfeba, 0xaccf, 0xacd0, 0xaccd,
+  0xacce, 0xcfdc, 0xcfdd, 0xaccc, 0xd2c3, 0x9e5c, 0xaf68, 0xaf69,
+  0xfebb, 0xb2ab, 0xd2c9, 0xaf6e, 0xaf6c, 0xd2ca, 0xd2c5, 0xaf6b,
+  0xaf6a, 0xaf65, 0xd2c8, 0xd2c7, 0xd2c4, 0xaf6d, 0xa044, 0xd2c6,
+  0xaf66, 0xaf67, 0x98d7, 0xb2ac, 0xd6a1, 0xd6a2, 0xb2ad, 0xd67c,
+  0xd67e, 0xd6a4, 0xd6a3, 0xd67d, 0xb2a9, 0xb2aa, 0xdab6, 0xb56b,
+  0xb56a, 0xdab0, 0xb568, 0x98d8, 0xdab3, 0xb56c, 0xdab4, 0xb56d,
+  0xdab1, 0xb567, 0xb569, 0xdab5, 0xdab2, 0xdaaf, 0xded2, 0xdec7,
+  0xb7f0, 0xb7f3, 0xb7f2, 0xb7f7, 0xb7f6, 0xded3, 0xded1, 0xdeca,
+  0xdece, 0xdecd, 0xb7f4, 0xded0, 0xdecc, 0xded4, 0xdecb, 0xb7f5,
+  0xb7ef, 0xb7f1, 0xfebc, 0xdec9, 0x9ffe, 0xe2db, 0xbac7, 0xe2df,
+  0xbac6, 0xe2dc, 0xbac5, 0xdec8, 0xdecf, 0xe2de, 0xbac8, 0xe2e0,
+  0xe2dd, 0xe2da, 0xe6b1, 0xe6b5, 0xe6b7, 0xe6b3, 0xe6b2, 0xe6b0,
+  0xbd45, 0xbd43, 0xbd48, 0xbd49, 0xe6b4, 0xbd46, 0xe6af, 0xbd47,
+  0xbac4, 0xe6b6, 0xbd44, 0xfebd, 0xea6c, 0xea6b, 0xea73, 0xea6d,
+  0xea72, 0xea6f, 0xbf60, 0xea71, 0xbf61, 0xbf62, 0x9ddd, 0xea70,
+  0xea6e, 0x9ee1, 0xc0f8, 0xed74, 0xc0f7, 0xed77, 0xed75, 0xed76,
+  0xc0f9, 0x98da, 0x9ddf, 0xfebf, 0xf04d, 0xfebe, 0xc2a1, 0xf04e,
+  0x9eeb, 0xc27d, 0xf04f, 0xc27e, 0xf04c, 0xf050, 0xf04a, 0xc3a7,
+  0xf278, 0xc3a8, 0xc46f, 0xf04b, 0xc470, 0x9e59, 0xa05c, 0xc4ee,
+  0xf5df, 0xc57e, 0xf6f4, 0xc57d, 0xfec0, 0xf7ea, 0xc5f5, 0xc5f6,
+  0x9477, 0x98dc, 0xf9cc, 0xfec1, 0xacd1, 0xcfde, 0x98de, 0xb56e,
+  0xb56f, 0xa5d5, 0xa6ca, 0xca47, 0xcb71, 0xa86d, 0xaaba, 0xacd2,
+  0xacd3, 0xacd4, 0xd6a6, 0xd2cb, 0xaf6f, 0xb2ae, 0xd6a5, 0xfec3,
+  0xdab8, 0xb571, 0xdab7, 0xb570, 0xded5, 0xbd4a, 0xe6bb, 0xe6b8,
+  0xe6b9, 0xe6ba, 0xfec8, 0xed78, 0xfec9, 0xf051, 0xf471, 0xf470,
+  0xf6f5, 0xa5d6, 0xcd75, 0xaf70, 0xb572, 0xded6, 0xfeca, 0xe2e1,
+  0xbd4b, 0xea74, 0xf052, 0xf472, 0xa5d7, 0xaabb, 0xacd7, 0xcfdf,
+  0xacd8, 0xacd6, 0xacd5, 0xd2cc, 0xaf71, 0xfecb, 0xaf72, 0xaf73,
+  0xb2b0, 0xd6a7, 0xb2af, 0x9fc2, 0x8c6b, 0xdab9, 0xb2b1, 0xb573,
+  0xded7, 0xb7f8, 0xb7f9, 0xbac9, 0xbaca, 0xbd4c, 0xbf64, 0xea75,
+  0xbf63, 0xed79, 0xc0fa, 0xf053, 0xf473, 0xa5d8, 0xa86e, 0xcd78,
+  0xcd77, 0xaabc, 0xcd76, 0xaabd, 0xcd79, 0xcfe5, 0xacdb, 0xacda,
+  0xcfe7, 0xcfe6, 0xacdf, 0xacde, 0xacd9, 0xcfe1, 0xcfe2, 0xcfe3,
+  0xace0, 0xcfe0, 0xacdc, 0xcfe4, 0xacdd, 0x98c4, 0x94b0, 0x94b1,
+  0xd2cf, 0xd2d3, 0xd2d1, 0xd2d0, 0xd2d4, 0xd2d5, 0xd2d6, 0xd2ce,
+  0xd2cd, 0xfed1, 0xaf75, 0xaf76, 0xd2d7, 0xd2d2, 0xa0c1, 0xd6b0,
+  0xfed2, 0xd2d8, 0xaf77, 0xaf74, 0xa0cd, 0xd6aa, 0xd6a9, 0xd6ab,
+  0xd6ac, 0xd6ae, 0xd6ad, 0xd6b2, 0xb2b5, 0xb2b2, 0xb2b6, 0xd6a8,
+  0xb2b7, 0xd6b1, 0xb2b4, 0xd6af, 0xb2b3, 0xfed3, 0x98e5, 0xdabc,
+  0xdabe, 0xdaba, 0xdabb, 0xdabf, 0xdac1, 0xdac2, 0xdabd, 0xdac0,
+  0xb574, 0xdedb, 0xdee0, 0xded8, 0xdedc, 0xfed6, 0xdee1, 0xdedd,
+  0xb7fa, 0xb843, 0xb7fd, 0xded9, 0xdeda, 0xbace, 0xb846, 0xb7fe,
+  0xb844, 0xb7fc, 0xdedf, 0xb845, 0xdede, 0xb841, 0xb7fb, 0xb842,
+  0xdee2, 0xe2e6, 0xe2e8, 0x91e4, 0x8fc7, 0x94ae, 0xb840, 0x8a4f,
+  0x94b2, 0xe2e3, 0xbacc, 0xe2e9, 0xbacd, 0xe2e7, 0xe2e2, 0xe2e5,
+  0xe2ea, 0xbacb, 0xe2e4, 0xbd4e, 0xe6bf, 0xe6be, 0xbd51, 0xbd4f,
+  0xe6bc, 0xbd4d, 0xe6bd, 0xbd50, 0x8fd4, 0xea7d, 0xeaa1, 0x98ea,
+  0xea7e, 0xea76, 0xea7a, 0xea79, 0xea77, 0xbf66, 0xbf67, 0xbf65,
+  0xea78, 0xea7b, 0xea7c, 0xbf68, 0xc140, 0xeda3, 0xc0fc, 0xed7b,
+  0xc0fe, 0xc141, 0xfed8, 0xc0fd, 0xeda2, 0xed7c, 0xc0fb, 0xeda1,
+  0xed7a, 0xed7e, 0xed7d, 0x9de0, 0xf055, 0xc2a4, 0xc2a5, 0xc2a2,
+  0x98ee, 0xc2a3, 0xf054, 0x95c4, 0xf27b, 0xfce8, 0xc3a9, 0xf279,
+  0xf27a, 0x98ef, 0xf474, 0xf477, 0xf475, 0xf476, 0xf5e0, 0xc4ef,
+  0xf7eb, 0xf8b4, 0xc5f7, 0xf8f8, 0xf8f9, 0xc666, 0xa5d9, 0xace1,
+  0x8c6e, 0xdac3, 0xdee3, 0xa5da, 0xa86f, 0xaabe, 0xfad8, 0xcfe8,
+  0xcfe9, 0xaf78, 0xdac4, 0xb575, 0xb847, 0xc142, 0xeda4, 0xf27c,
+  0xf478, 0xa5db, 0xfedc, 0xcda1, 0xcd7a, 0xcd7c, 0xcd7e, 0xcd7d,
+  0xcd7b, 0xaabf, 0xa0ae, 0xace2, 0xcff2, 0xcfed, 0xcfea, 0x9d4c,
+  0xcff1, 0xace4, 0xace5, 0xcff0, 0xcfef, 0xcfee, 0xcfeb, 0xcfec,
+  0xcff3, 0xace3, 0x98f1, 0x98f3, 0xaf7c, 0x94c1, 0xafa4, 0xafa3,
+  0xd2e1, 0xd2db, 0xd2d9, 0xafa1, 0xd6b9, 0xaf7a, 0xd2de, 0xd2e2,
+  0xd2e4, 0xd2e0, 0xd2da, 0xafa2, 0xd2df, 0xd2dd, 0xaf79, 0xd2e5,
+  0xafa5, 0xd2e3, 0xaf7d, 0xd2dc, 0xaf7e, 0xaf7b, 0x98f5, 0xfa4f,
+  0x96e2, 0x9450, 0xb2b9, 0x96a2, 0xd6ba, 0x98f6, 0xd6b3, 0xd6b5,
+  0xd6b7, 0x96e5, 0xd6b8, 0xd6b6, 0xb2ba, 0xd6bb, 0x98f7, 0xd6b4,
+  0xa046, 0x96e3, 0xdac8, 0xb576, 0xdad0, 0xdac5, 0xdad1, 0xdac6,
+  0xdac7, 0x98f8, 0xdacf, 0xdace, 0xdacb, 0xb2b8, 0xb577, 0xdac9,
+  0xdacc, 0xb578, 0xdacd, 0xdaca, 0xdeee, 0x9ee4, 0xdef2, 0xb84e,
+  0xe2f0, 0xb851, 0xdef0, 0xf9d6, 0xdeed, 0xdee8, 0xdeea, 0xdeeb,
+  0xdee4, 0x94c3, 0xb84d, 0xb84c, 0x94c2, 0xb848, 0xdee7, 0xb84f,
+  0xb850, 0xdee6, 0xdee9, 0xdef1, 0xb84a, 0xb84b, 0xdeef, 0xdee5,
+  0xe2f2, 0xbad0, 0xe2f4, 0xdeec, 0xe2f6, 0xbad4, 0xe2f7, 0xe2f3,
+  0xbad1, 0xe2ef, 0xbad3, 0xe2ec, 0xe2f1, 0xe2f5, 0xe2ee, 0xfee1,
+  0xb849, 0xfee9, 0xe2eb, 0xbad2, 0xe2ed, 0x96e4, 0x89ac, 0x96db,
+  0xbd54, 0xe6c1, 0xbd58, 0xbd56, 0xbacf, 0xe6c8, 0xe6c9, 0xbd53,
+  0xfee2, 0xe6c7, 0xe6ca, 0xbd55, 0xbd52, 0xe6c3, 0xe6c0, 0xe6c5,
+  0xe6c2, 0xbd59, 0xe6c4, 0x94c4, 0xfee3, 0xe6c6, 0xbd57, 0xfee7,
+  0x9ffb, 0xbf6a, 0xeaa8, 0xeaa2, 0xeaa6, 0xeaac, 0xeaad, 0xeaa9,
+  0xeaaa, 0xeaa7, 0x8c59, 0xeaa4, 0xbf6c, 0xbf69, 0xeaa3, 0xeaa5,
+  0xbf6b, 0xeaab, 0x93c9, 0xc146, 0x94e8, 0xfb56, 0xedaa, 0xeda5,
+  0xc145, 0x90c5, 0xc143, 0xedac, 0xc144, 0xeda8, 0xeda9, 0xeda6,
+  0xedad, 0xf056, 0xc147, 0xeda7, 0xedae, 0xedab, 0xa0a8, 0xf05a,
+  0xf057, 0xc2a6, 0xf05b, 0xf05d, 0xf05c, 0xf058, 0xf059, 0xf2a3,
+  0xc3aa, 0xf27e, 0xf2a2, 0xf27d, 0xf2a4, 0xf2a1, 0xf47a, 0xf47d,
+  0xf479, 0xc471, 0xf47b, 0xf47c, 0xf47e, 0xc472, 0xc474, 0xc473,
+  0xf5e1, 0xfee5, 0xf5e3, 0xf5e2, 0x98fd, 0x98fb, 0xfee8, 0xf6f6,
+  0x8ebf, 0xf8b5, 0xf8fa, 0xa5dc, 0x8bd8, 0xfef7, 0xcb72, 0xaac0,
+  0xcda3, 0xaac1, 0xaac2, 0xcda2, 0xcff8, 0xcff7, 0xace6, 0xace9,
+  0xace8, 0xace7, 0xcff4, 0xcff6, 0xcff5, 0xd2e8, 0xafa7, 0xd2ec,
+  0xd2eb, 0xd2ea, 0xd2e6, 0xafa6, 0xafaa, 0xafad, 0x8f68, 0x94c6,
+  0xafae, 0xd2e7, 0xd2e9, 0xafac, 0xafab, 0xafa9, 0xafa8, 0xd6c2,
+  0x9dea, 0xd6c0, 0xd6bc, 0xb2bb, 0xd6bd, 0xb2bc, 0xd6be, 0xd6bf,
+  0xd6c1, 0xb2bd, 0xdad5, 0xfc69, 0xdad4, 0xdad3, 0xdad2, 0xdef6,
+  0xb852, 0xdef3, 0xdef5, 0x9cda, 0xb853, 0xfef3, 0xb854, 0xdef4,
+  0x9c72, 0xfef0, 0x89c9, 0xe341, 0xe2f9, 0xe2fa, 0xbad7, 0xbad5,
+  0xbad6, 0xe343, 0x9941, 0xe342, 0xe2fe, 0xe2fd, 0xe2fc, 0xe2fb,
+  0xe340, 0xe2f8, 0x9942, 0xe6cb, 0xe6d0, 0xe6ce, 0xfef5, 0x91d7,
+  0xe6cd, 0xe6cc, 0xe6cf, 0xeaae, 0x94cc, 0xbf6d, 0xc148, 0xedb0,
+  0xfef8, 0xc149, 0xedaf, 0xf05f, 0xf05e, 0xc2a7, 0xf2a5, 0xc3ab,
+  0xf4a1, 0xc5a1, 0xf6f7, 0xf8b7, 0xf8b6, 0xc9a8, 0xacea, 0xaceb,
+  0xd6c3, 0xb856, 0xa5dd, 0xa872, 0xa871, 0xa870, 0x97a8, 0xcda4,
+  0xfefc, 0xaac4, 0xaac3, 0xacee, 0xfdbf, 0xcffa, 0xcffd, 0xcffb,
+  0xacec, 0xaced, 0xfefe, 0xcff9, 0xcffc, 0xafb5, 0xd2f3, 0xd2f5,
+  0xd2f4, 0xafb2, 0xd2ef, 0x96d1, 0xafb0, 0xafaf, 0xafb3, 0xafb1,
+  0xafb4, 0xd2f2, 0xd2ed, 0xd2ee, 0xd2f1, 0xd2f0, 0x94d5, 0x94d0,
+  0xd6c6, 0xd6c7, 0xd6c5, 0xd6c4, 0xb2be, 0xb57d, 0xdad6, 0xdad8,
+  0xdada, 0xb57c, 0x9944, 0xb57a, 0xdad7, 0xb57b, 0xdad9, 0xb579,
+  0xdf41, 0xdef7, 0xdefa, 0xdefe, 0xb85a, 0xdefc, 0xdefb, 0xdef8,
+  0xdef9, 0xb858, 0xdf40, 0xb857, 0xb85c, 0xb85b, 0xb859, 0xdefd,
+  0xe349, 0xe348, 0x8c63, 0xe344, 0xa0b3, 0xbad8, 0xe347, 0xe346,
+  0xbad9, 0xbd5e, 0xe6d2, 0x94cf, 0xbd5f, 0xbd5b, 0xbd5d, 0x9ffa,
+  0xbd5a, 0xbd5c, 0x91e5, 0xeaaf, 0x9c6a, 0xbf70, 0xeab1, 0xeab0,
+  0x8e49, 0xe345, 0xbf72, 0xbf71, 0xbf6e, 0xbf6f, 0xedb5, 0xedb3,
+  0xc14a, 0xedb4, 0xedb6, 0xedb2, 0xedb1, 0xf060, 0xc2aa, 0xc2a8,
+  0xc2a9, 0x8e4c, 0xf2a6, 0xf2a7, 0xc3ad, 0xc3ac, 0xf4a3, 0xf4a4,
+  0xf4a2, 0xf6f8, 0xf6f9, 0xa5de, 0xca48, 0xa873, 0xcda5, 0xaac6,
+  0xaac5, 0xcda6, 0x8e4d, 0xd040, 0xacef, 0xcffe, 0xacf0, 0x9a73,
+  0xafb6, 0xd2f8, 0xd2f6, 0xd2fc, 0xafb7, 0xd2f7, 0xd2fb, 0xd2f9,
+  0xd2fa, 0xd6c8, 0xd6ca, 0x9947, 0xb2bf, 0x8cb1, 0xd6c9, 0xb2c0,
+  0xb5a2, 0xb5a1, 0xb57e, 0xdadb, 0xdf44, 0xb85d, 0xb85e, 0xdf43,
+  0xdf42, 0xe34a, 0xbadb, 0xbada, 0xe34b, 0xe34c, 0xbd61, 0xbd60,
+  0x8e50, 0xeab5, 0xe6d3, 0xe6d5, 0xe6d4, 0xeab4, 0xeab2, 0xeab6,
+  0xeab3, 0xbf73, 0x8e4f, 0x9949, 0xedb7, 0xc14b, 0xedb8, 0xedb9,
+  0x8e51, 0x8e52, 0xc2ab, 0xc2ac, 0xc475, 0x9ab2, 0x89a5, 0xc5d1,
+  0xa5df, 0x994c, 0xd041, 0x9ff8, 0xd2fd, 0xafb8, 0x8e56, 0x994d,
+  0x91ca, 0x8e57, 0xb3ba, 0xb3b9, 0x94e1, 0xb5a4, 0xdadd, 0xb5a3,
+  0xdadc, 0x9047, 0x8fd8, 0x8e58, 0xdf45, 0xbadc, 0xe34d, 0xbadd,
+  0xc476, 0xf4a5, 0xa6cb, 0xaac7, 0xcda7, 0xacf2, 0x94eb, 0xacf1,
+  0xd042, 0xd043, 0xd340, 0xd342, 0xafb9, 0xd344, 0xd347, 0xd345,
+  0x8e5c, 0x9553, 0xd346, 0xd343, 0xd2fe, 0xafba, 0xd348, 0xd341,
+  0x9fe5, 0xd6d3, 0xb2c6, 0xd6dc, 0xb2c3, 0xd6d5, 0xb2c7, 0x9f56,
+  0xb2c1, 0xd6d0, 0xd6dd, 0xd6d1, 0xd6ce, 0xb2c5, 0x954f, 0xb2c2,
+  0x8e5e, 0xd6d4, 0xd6d7, 0xb2c4, 0xd6d8, 0xb2c8, 0xd6d9, 0xd6cf,
+  0xd6d6, 0xd6da, 0xd6d2, 0xd6cd, 0xd6cb, 0xd6db, 0x996a, 0xdadf,
+  0xdae4, 0x9c64, 0x9cd9, 0xdae0, 0xdae6, 0xb5a7, 0xd6cc, 0xdae1,
+  0xb5a5, 0xdade, 0xb5ac, 0xdae2, 0xb5ab, 0xdae3, 0xb5ad, 0xb5a8,
+  0xb5ae, 0xb5a9, 0xb5aa, 0x8e5d, 0xb5a6, 0xdae5, 0xb861, 0xdf50,
+  0x9950, 0xdf53, 0xdf47, 0xdf4c, 0xdf46, 0xb863, 0xdf4a, 0x9951,
+  0xdf48, 0xb862, 0x8e62, 0xdf4f, 0xdf4e, 0xdf4b, 0xdf4d, 0xdf49,
+  0xbae1, 0xdf52, 0xb85f, 0xdf51, 0x9952, 0xe35d, 0xbae8, 0xe358,
+  0xbae7, 0xe34e, 0xe350, 0xbae0, 0xe355, 0xe354, 0xe357, 0xbae5,
+  0xe352, 0xe351, 0x8e68, 0xbae4, 0xbadf, 0xe353, 0xbae2, 0xe359,
+  0xe35b, 0xe356, 0xe34f, 0xbae3, 0xbd69, 0xbade, 0x8e61, 0x9f59,
+  0xe35c, 0xe6d9, 0xbd62, 0xe6db, 0xbd63, 0x8bb3, 0xbd65, 0xe6de,
+  0xe6d6, 0xbae6, 0xe6dc, 0xe6d8, 0xb860, 0xbd68, 0xbd64, 0xbd66,
+  0xbd67, 0xbf76, 0xe6dd, 0xe6d7, 0xbd6a, 0xe6da, 0x9f5d, 0x8e66,
+  0xeac0, 0xeabb, 0xeac5, 0xbf74, 0xeabd, 0xbf78, 0xeac3, 0xeaba,
+  0xeab7, 0xeac6, 0xc151, 0xbf79, 0xeac2, 0xeab8, 0xbf77, 0xeabc,
+  0xbf7b, 0xeab9, 0xeabe, 0xbf7a, 0xeac1, 0xeac4, 0x8cb2, 0xedcb,
+  0xedcc, 0xedbc, 0xedc3, 0xedc1, 0xc14f, 0xedc8, 0xeabf, 0x8e6e,
+  0xedbf, 0x9f64, 0xedc9, 0xc14e, 0xedbe, 0xedbd, 0xedc7, 0xedc4,
+  0xedc6, 0xedba, 0xedca, 0xc14c, 0xedc5, 0xedce, 0xedc2, 0xc150,
+  0xc14d, 0xedc0, 0xedbb, 0xedcd, 0xbf75, 0x9953, 0xfab8, 0xf063,
+  0x9954, 0xf061, 0xf067, 0xc2b0, 0xf065, 0xf064, 0xc2b2, 0xf06a,
+  0xc2b1, 0xf06b, 0xf068, 0xc2ae, 0xf069, 0xf062, 0xc2af, 0xc2ad,
+  0xf2ab, 0xf066, 0xf06c, 0xf2a8, 0x8e70, 0xc3b2, 0xc3b0, 0xf2aa,
+  0xf2ac, 0xf2a9, 0xc3b1, 0xc3ae, 0xc3af, 0xc3b3, 0x9f61, 0xc478,
+  0x8e72, 0xf4aa, 0xf4a9, 0xf4a7, 0xf4a6, 0xf4a8, 0xc477, 0xc479,
+  0xc4f0, 0xa06b, 0xf5e5, 0xf5e4, 0x9f40, 0xf6fa, 0xf6fc, 0xf6fe,
+  0xf6fd, 0xf6fb, 0x94ed, 0xc5a3, 0xc5a2, 0xc5d3, 0xc5d2, 0xc5d4,
+  0xf7ed, 0xf7ec, 0xf8fb, 0xf8b8, 0xf8fc, 0xc658, 0x94ee, 0xc659,
+  0xf96d, 0x9fbd, 0xc67e, 0xa6cc, 0x8e7b, 0xcda8, 0xd045, 0xd046,
+  0xd044, 0x9957, 0x94f7, 0xacf3, 0x9f5f, 0xd047, 0xd048, 0xd049,
+  0x8e73, 0xd349, 0xd34f, 0x9f62, 0xd34d, 0xafbb, 0xd34b, 0xd34c,
+  0xd34e, 0x94f6, 0xd34a, 0xb2c9, 0xd6de, 0xb2cb, 0xd6e0, 0xb2ca,
+  0xd6df, 0x9958, 0xdae8, 0xb5af, 0xdaea, 0xdae7, 0xd6e1, 0xb5b0,
+  0x8e75, 0xf9db, 0xdae9, 0x9072, 0x94f8, 0xdf56, 0xb864, 0xdf54,
+  0xb865, 0xdf55, 0xb866, 0x995a, 0xbae9, 0xe361, 0xe35e, 0xe360,
+  0xbaea, 0xbaeb, 0xe35f, 0xa0b0, 0x8cb3, 0xe6df, 0x8e79, 0xe6e0,
+  0x8e78, 0xbd6b, 0xe6e2, 0xe6e1, 0x94f3, 0xa261, 0xeaca, 0xeacb,
+  0xeac7, 0x98af, 0xeac8, 0xbf7c, 0xbf7d, 0xeac9, 0xc157, 0xa0b2,
+  0xc153, 0xc158, 0xc154, 0xc156, 0xc152, 0xc155, 0x8e7a, 0xc2b3,
+  0xedcf, 0xf2ae, 0xf2ad, 0x995c, 0xf4ab, 0xc47a, 0xc47b, 0xf741,
+  0xf5e6, 0x8e7c, 0xf740, 0x8e7d, 0xf8fd, 0xf9a4, 0xa6cd, 0x8bd9,
+  0xa874, 0x89a2, 0xcda9, 0xaac8, 0xacf6, 0xd04c, 0xacf4, 0xd04a,
+  0xacf9, 0xacf5, 0xacfa, 0xacf8, 0xd04b, 0xacf7, 0xafbf, 0xafbe,
+  0xd35a, 0xafc7, 0xd353, 0xd359, 0xafc3, 0xd352, 0xd358, 0xd356,
+  0xafc2, 0xafc4, 0xd355, 0xafbd, 0xd354, 0xafc8, 0xafc5, 0xafc9,
+  0xafc6, 0xd351, 0xd350, 0xd357, 0xafc0, 0xafbc, 0xafc1, 0x9ed7,
+  0xd6f0, 0xd6e9, 0xb5b5, 0xd6e8, 0xb2cf, 0xb2d6, 0xb2d3, 0xb2d9,
+  0xb2d8, 0xb2d4, 0xd6e2, 0xd6e5, 0xd6e4, 0xb2d0, 0xd6e6, 0xd6ef,
+  0xb2d1, 0xd6e3, 0xd6ec, 0xd6ed, 0xb2d2, 0xd6ea, 0xb2d7, 0xb2cd,
+  0xb2d5, 0xd6e7, 0xb2cc, 0xd6eb, 0xd6ee, 0xa0b6, 0xdafb, 0xdaf2,
+  0xb5b2, 0xdaf9, 0xdaf6, 0xdaee, 0xdaf7, 0xb5b4, 0xdaef, 0xdaeb,
+  0x9e42, 0xb86c, 0xdaf4, 0x8ea4, 0xb5b1, 0xdafa, 0xb5b8, 0xb5ba,
+  0xdaed, 0xb5b9, 0xdaf0, 0xb5b3, 0xdaf8, 0xdaf1, 0xdaf5, 0xdaf3,
+  0xb5b6, 0xdaec, 0xb5bb, 0xb2ce, 0xb5b7, 0xb5bc, 0xb868, 0xdf5d,
+  0xdf5f, 0xdf61, 0xdf65, 0xdf5b, 0xdf59, 0xb86a, 0xdf60, 0xdf64,
+  0xdf5c, 0xdf58, 0xdf57, 0x8ea7, 0x8c76, 0xdf62, 0xdf5a, 0xdf5e,
+  0xb86b, 0xb869, 0xdf66, 0xb867, 0xdf63, 0xe372, 0x9542, 0xbaee,
+  0xe36a, 0xbd78, 0xe374, 0xbaf1, 0xe378, 0xbaf7, 0xe365, 0x987d,
+  0xe375, 0xe362, 0x9755, 0xe377, 0xe366, 0x8ea8, 0xbafe, 0xbafb,
+  0xe376, 0xe370, 0xbaed, 0xbaf5, 0xbaf4, 0x8eaa, 0xbaf3, 0xbaf9,
+  0xe363, 0xbafa, 0xe371, 0xbaf6, 0xbaec, 0xe373, 0xbaef, 0xbaf0,
+  0xbaf8, 0xe368, 0xe367, 0xe364, 0xe36c, 0xe369, 0xe36d, 0xbafd,
+  0xe379, 0xbaf2, 0xe36e, 0xe36f, 0x89a3, 0xe36b, 0x9960, 0x9962,
+  0xbafc, 0x94fc, 0x9961, 0xe6e7, 0xbd70, 0xbd79, 0xbd75, 0xe6e4,
+  0x94fa, 0xbd72, 0xbd76, 0xe6f0, 0xbd6c, 0xe6e8, 0xbd74, 0x8eae,
+  0x8eb2, 0xe6eb, 0xe6e6, 0xbd73, 0xbd77, 0xe6e5, 0xbd71, 0xe6ef,
+  0xbd6e, 0xe6ee, 0xe6ed, 0xbd7a, 0xe572, 0xbd6d, 0x8eb0, 0xe6ec,
+  0xe6e3, 0xbd7b, 0xe6ea, 0xbd6f, 0x9963, 0x97aa, 0xe6e9, 0x94fb,
+  0xbfa2, 0xbfa7, 0xbf7e, 0xead8, 0xeacf, 0xeadb, 0xead3, 0xead9,
+  0xbfa8, 0xbfa1, 0xeacc, 0xead2, 0xeadc, 0xead5, 0xeada, 0xeace,
+  0xead6, 0xbfa3, 0xead4, 0xbfa6, 0xbfa5, 0xead0, 0xead1, 0xeacd,
+  0xead7, 0xbfa4, 0xeade, 0xeadd, 0x8ebb, 0xedda, 0xedd6, 0xc15f,
+  0xedd0, 0xc159, 0xc169, 0xeddc, 0xc161, 0xc15d, 0xedd3, 0xc164,
+  0xc167, 0xedde, 0xc15c, 0xedd5, 0xc165, 0xede0, 0xeddd, 0xedd1,
+  0xc160, 0xc15a, 0xc168, 0xedd8, 0xc163, 0xedd2, 0xc15e, 0xeddf,
+  0xc162, 0xc15b, 0xedd9, 0xc166, 0xedd7, 0xeddb, 0xf06e, 0xf074,
+  0xc2b9, 0xf077, 0xc2b4, 0xc2b5, 0xf06f, 0xf076, 0xf071, 0xc2ba,
+  0xc2b7, 0x8cdc, 0xf06d, 0xc2b6, 0xf073, 0xf075, 0xc2b8, 0xf072,
+  0xf070, 0x9876, 0x8ea1, 0xf2b8, 0xc3b7, 0xc3b8, 0xc3b4, 0x8cb4,
+  0xc3b5, 0x8eb7, 0xf2b4, 0xf2b2, 0xf2b6, 0xc3ba, 0xf2b7, 0xf2b0,
+  0xf2af, 0xf2b3, 0xf2b1, 0xc3b6, 0xf2b5, 0xf4ac, 0xc47e, 0xc47d,
+  0xf4ad, 0x9da6, 0xf4af, 0xf4ae, 0xc4a1, 0xf5eb, 0xf5e8, 0xf5e9,
+  0xf5e7, 0xf5ea, 0xc4f2, 0xf5ec, 0x9eb0, 0xc4f1, 0xf742, 0x8eb8,
+  0xc5d5, 0xc5d7, 0xf7ee, 0xc5d6, 0xf8b9, 0xf940, 0xf942, 0xf8fe,
+  0xf941, 0xc66c, 0x9d70, 0x896e, 0x896f, 0x8970, 0x8971, 0x8972,
+  0x8973, 0x8974, 0xa6ce, 0x8975, 0xacfb, 0xd26f, 0xafca, 0xb2da,
+  0xdafc, 0xdafd, 0x8ebc, 0x8ebd, 0xeadf, 0xc16a, 0xede1, 0x8ebe,
+  0xc2bb, 0x9dd1, 0xf2ba, 0xf2b9, 0xc4a2, 0xf5ed, 0x94fd, 0xf743,
+  0xc5f8, 0xca49, 0x8bd7, 0x8bda, 0xaac9, 0xa875, 0xd04d, 0xd360,
+  0xd35b, 0xd35f, 0xd35d, 0xafcb, 0xd35e, 0xd35c, 0xd6f1, 0xdafe,
+  0xdb40, 0xdf69, 0xdf6a, 0xb86e, 0xb86f, 0xdf68, 0xdf6b, 0xdf67,
+  0xb86d, 0xbb40, 0xa0e2, 0xb870, 0xe37a, 0xbd7c, 0xe6f1, 0xbd7d,
+  0x9fe9, 0xbfa9, 0xeae2, 0xeae0, 0xeae1, 0xede4, 0xede3, 0xede2,
+  0xf2bb, 0xc3b9, 0xf2bc, 0xf744, 0xc5f9, 0xf8ba, 0xa6cf, 0xaacb,
+  0xaaca, 0xd04f, 0xacfc, 0xfda8, 0xd04e, 0xd362, 0x8ae7, 0xafcc,
+  0xd6f2, 0xd361, 0x8ec2, 0xb2dc, 0xd6f5, 0xd6f3, 0xd6f4, 0xb2db,
+  0xdb42, 0xdb43, 0xdb41, 0x8ec4, 0xb873, 0xdf6d, 0xdf6c, 0xdf6e,
+  0xb872, 0xb871, 0xe6f2, 0xe6f4, 0x9964, 0xbd7e, 0xe6f3, 0xeae3,
+  0xbfaa, 0xf079, 0x9965, 0xf078, 0xc3bb, 0xf2bd, 0xc3bd, 0xc3bc,
+  0xf4b0, 0xf5ee, 0xc4f3, 0xa6d0, 0xd050, 0xacfd, 0xd365, 0xafce,
+  0xd364, 0xd363, 0xafcd, 0xd6fb, 0xd6fd, 0xd6f6, 0xd6f7, 0xb2dd,
+  0xd6f8, 0xb2de, 0xd6fc, 0xd6f9, 0xd6fa, 0xb2df, 0xb5be, 0xb5bf,
+  0xdb44, 0xdf6f, 0xdf70, 0x954e, 0xe37e, 0xbb43, 0xbb41, 0xbb42,
+  0xe37b, 0xe37c, 0xe37d, 0xe6f9, 0x98b3, 0xe6fa, 0xbda1, 0xe6f7,
+  0xe6f6, 0xe6f8, 0xe6f5, 0xbfad, 0xeae4, 0xbfab, 0xbfac, 0xede6,
+  0xc16b, 0xede5, 0xefa8, 0xf07a, 0xf07b, 0xc2bc, 0x8ecb, 0xc2bd,
+  0xc16c, 0xf2be, 0xf2bf, 0xf4b1, 0xc4a3, 0xa6d1, 0x8bdf, 0xa6d2,
+  0xacfe, 0xaacc, 0xafcf, 0xd051, 0x8ece, 0xb5c0, 0xa6d3, 0xad41,
+  0xd052, 0xd053, 0xad40, 0xad42, 0xa6d4, 0xd054, 0xafd1, 0xd366,
+  0xafd3, 0xafd0, 0xafd2, 0xd741, 0xb2e0, 0x8ecf, 0xd740, 0xd6fe,
+  0x9968, 0xdf71, 0xe3a1, 0x9969, 0xbda2, 0xbfae, 0xeae6, 0xeae5,
+  0xede7, 0x996b, 0x8ed1, 0xf5ef, 0x996c, 0xa6d5, 0xcb73, 0xcdaa,
+  0xad43, 0xd055, 0xd368, 0x8ed4, 0x8ed5, 0xafd4, 0xd367, 0xafd5,
+  0xd743, 0xb2e2, 0xd742, 0xd744, 0xb2e1, 0xdb46, 0xdb47, 0xdb45,
+  0xb5c1, 0x996d, 0xb874, 0xb875, 0xbb45, 0xa0be, 0xe3a3, 0xe3a2,
+  0xbb44, 0x8ed6, 0xa0bc, 0xa0b5, 0xe6fb, 0xa0b4, 0xe6fc, 0xeae7,
+  0xc170, 0xc16f, 0xc16d, 0xc16e, 0xc171, 0xf07c, 0xc2bf, 0xc2be,
+  0xf2c0, 0xf4b2, 0xc5a5, 0xc5a4, 0xa6d6, 0x8be0, 0xd1fb, 0xb877,
+  0xb5c2, 0xb876, 0xbb46, 0xa6d7, 0xc9a9, 0xa6d8, 0xa6d9, 0xcdab,
+  0xcb76, 0xcb77, 0xa877, 0xcb74, 0xa876, 0xa879, 0xcb75, 0xa87b,
+  0xa87a, 0xcb78, 0xa878, 0x89b5, 0xaad1, 0xaacf, 0xcdad, 0xaace,
+  0x8edd, 0xaad3, 0xaad5, 0xaad2, 0xcdb0, 0xcdac, 0xaad6, 0xaad0,
+  0xa87c, 0xaad4, 0xcdaf, 0x9e5d, 0x9971, 0xcdae, 0xaacd, 0x89ae,
+  0x9de8, 0xd05b, 0xad47, 0xad48, 0xd05d, 0x9565, 0xd057, 0xd05a,
+  0xd063, 0xd061, 0xad49, 0xd067, 0xad4c, 0xd064, 0xd05c, 0xd059,
+  0xdb49, 0xd062, 0xad44, 0xd065, 0xd056, 0xd05f, 0xad46, 0xad4b,
+  0xd060, 0xad4f, 0xad4d, 0xd058, 0xad4a, 0xd05e, 0xad4e, 0xad45,
+  0xd066, 0x9972, 0x8b5c, 0xafda, 0xafe3, 0xafd8, 0xafd6, 0xd36a,
+  0xafde, 0xafdb, 0xd36c, 0x89b1, 0xafdd, 0xd36b, 0xd369, 0xd36e,
+  0xafe2, 0xafe0, 0xdb48, 0xd36f, 0xd36d, 0xafd7, 0xa0c0, 0xafd9,
+  0xafdc, 0x8edf, 0xafdf, 0x9566, 0xafe1, 0x9974, 0x9976, 0x9977,
+  0x9979, 0xd74e, 0xb2e4, 0x9dda, 0xd745, 0xd747, 0x8ee0, 0xd748,
+  0xd750, 0xd74c, 0xd74a, 0xd74d, 0xd751, 0xb2e5, 0xb2e9, 0xd746,
+  0xd74f, 0xb2e7, 0x935c, 0xb2e6, 0xd74b, 0xd749, 0xb2e3, 0xb2e8,
+  0x9de6, 0x8b5f, 0x9563, 0xb5c8, 0xdb51, 0xdb4f, 0xb5ca, 0x9567,
+  0xdb4a, 0xdfa1, 0xb5c9, 0xdb4e, 0x9de3, 0xdb4b, 0xb5c5, 0xb5cb,
+  0xdb50, 0xb5c7, 0xdb4d, 0xbb47, 0xb5c6, 0xdb4c, 0xb5cc, 0xb5c4,
+  0xb5c3, 0x997c, 0x997d, 0x997e, 0xdf77, 0xdf75, 0xdf7b, 0xdf73,
+  0xdfa2, 0xdf78, 0xdf72, 0xb87b, 0xb8a3, 0xdf7d, 0xdf76, 0xb87e,
+  0x8b5b, 0xb87c, 0xdf7e, 0xb879, 0xb878, 0xdf79, 0xb87d, 0xb5cd,
+  0xdf7c, 0xdf74, 0xb87a, 0xb8a1, 0xb8a2, 0x99a3, 0xbb4c, 0xbb48,
+  0xbb4d, 0xe3a6, 0x99a4, 0xe3a5, 0xe3a7, 0xbb4a, 0xe3a4, 0xbb4b,
+  0xe3aa, 0xe3a9, 0xe3a8, 0xbb49, 0x99a6, 0xe741, 0xe744, 0xbda8,
+  0xe743, 0xbda7, 0xbda3, 0xbda4, 0xbda5, 0xe740, 0xe6fe, 0xbda6,
+  0xe742, 0xe6fd, 0x99a8, 0xeae9, 0xeaf3, 0xbfb1, 0xbfb0, 0x8abe,
+  0xeaed, 0xeaef, 0xeaea, 0xeaee, 0xeae8, 0xeaf1, 0xbfaf, 0xeaf0,
+  0xeaec, 0x9e61, 0xeaf2, 0xeaeb, 0xc174, 0xede8, 0xedee, 0xc178,
+  0xc17a, 0xc177, 0xc176, 0x99aa, 0xc175, 0xc173, 0xede9, 0xedec,
+  0xc172, 0xeded, 0xa0c8, 0xc179, 0xedeb, 0xedea, 0xc2c0, 0xc2c1,
+  0xf0a1, 0xf07d, 0xf07e, 0xf2c2, 0xf2c1, 0xc3be, 0xf4b4, 0xc4a4,
+  0xf4b3, 0xf5f0, 0xf745, 0xc5a6, 0xf943, 0xf944, 0xc5d8, 0xa6da,
+  0x99ab, 0xaad7, 0xdb52, 0xbb4e, 0xc17b, 0xedef, 0xa6db, 0xafe5,
+  0xafe4, 0xdb53, 0xfec4, 0xeaf4, 0xa6dc, 0xad50, 0x98c2, 0xdb54,
+  0xdb55, 0xdb56, 0xbb4f, 0xbfb2, 0xa6dd, 0xaad8, 0xd068, 0xafe6,
+  0xd370, 0xb2ea, 0xdb57, 0xb8a4, 0xbb50, 0xbfb3, 0xc17c, 0xc2c2,
+  0xf4b5, 0xa6de, 0xaad9, 0xafe7, 0xd752, 0xb5ce, 0xbb51, 0xe3ab,
+  0xe745, 0x8ee8, 0xa0ba, 0xa6df, 0xb5cf, 0xdfa3, 0xbb52, 0xa6e0,
+  0xcdb1, 0xd069, 0xad51, 0xd372, 0xfd77, 0xafea, 0x8eee, 0xafe8,
+  0xafe9, 0xafeb, 0x9ebf, 0xd371, 0xd757, 0xd754, 0xd756, 0xb2eb,
+  0xb2ed, 0xb2ec, 0xd753, 0xb2ee, 0xd755, 0xdb58, 0xdb59, 0x89c2,
+  0xdb5a, 0xdfa6, 0xdfa7, 0xdfa5, 0xdfa8, 0xb8a5, 0xdfa4, 0xbb53,
+  0xe74a, 0xe746, 0xe749, 0xe74b, 0xe748, 0xe747, 0x99ac, 0xeaf5,
+  0xeaf6, 0xeaf7, 0xbfb4, 0xbfb5, 0xedf1, 0xedf0, 0xedf2, 0xf0a3,
+  0xf0a2, 0xf2c4, 0x956b, 0xf2c5, 0xf2c3, 0x956c, 0xc4a5, 0xf4b6,
+  0xf4b7, 0xf746, 0xf7ef, 0xf8bb, 0xa6e1, 0xa87d, 0xc17d, 0xa6e2,
+  0xd758, 0xdb5b, 0x99af, 0xc641, 0xca4a, 0x994a, 0x8976, 0x8f48,
+  0xca4b, 0xca4d, 0xa6e3, 0xca4e, 0xca4c, 0xcba2, 0xcba3, 0xcb7b,
+  0xfbee, 0xcba1, 0xa8a1, 0xa8a2, 0xcb7c, 0xcb7a, 0xcb79, 0xcb7d,
+  0xa87e, 0xcb7e, 0xd06a, 0xcdb6, 0xaadc, 0xcdb5, 0xcdb7, 0xaadb,
+  0xcdbc, 0xaadf, 0xcdb2, 0xcdc0, 0xcdc6, 0xaae6, 0xcdc3, 0xaae3,
+  0x99ae, 0xcdb9, 0xcdbf, 0xcdc1, 0x8efb, 0xcdb4, 0xaae2, 0xaadd,
+  0xcdba, 0xaae4, 0xaae7, 0xaae1, 0xaada, 0xcdbe, 0xcdb8, 0xcdc5,
+  0xaae9, 0xaae5, 0xaae0, 0xcdbd, 0xafec, 0xcdbb, 0xaade, 0xaae8,
+  0x8cd0, 0xcdb3, 0xcdc2, 0xcdc4, 0x8b52, 0x99b0, 0x8977, 0x8f41,
+  0xad62, 0xad5c, 0xad64, 0xad61, 0xd071, 0xd074, 0xad5d, 0x99b1,
+  0xd06b, 0xad56, 0xad60, 0xad63, 0xad65, 0xd0a2, 0xd077, 0x8f49,
+  0xad55, 0xd0a1, 0xad59, 0xad57, 0xad52, 0xd06f, 0xd07e, 0xd073,
+  0xd076, 0xd0a5, 0xfa4d, 0xad66, 0xd07d, 0xad5e, 0xd078, 0xd0a4,
+  0xd075, 0xd079, 0xd07c, 0x9de4, 0x8cb5, 0xd06d, 0xd0a3, 0xd07b,
+  0xfbe9, 0x9b54, 0xd06c, 0x99b2, 0xd070, 0xad5f, 0xad5a, 0xad53,
+  0xad58, 0xad54, 0xad67, 0xd06e, 0xd3a5, 0xad5b, 0x9e68, 0xd07a,
+  0xce41, 0xd3a8, 0xaffa, 0x8f4a, 0xd376, 0x8f42, 0xd3a3, 0xd37d,
+  0x8f51, 0xd3b2, 0xd3aa, 0xd37e, 0xd3a9, 0xd378, 0xd37c, 0xd3b5,
+  0xaffd, 0xd3ad, 0xd3a4, 0xafed, 0xd3b3, 0xd374, 0xd3ac, 0xaffc,
+  0xaff7, 0xd373, 0xaff5, 0xaff4, 0xaff9, 0xd3ab, 0xaff1, 0xaff8,
+  0xd072, 0xdb5c, 0xd3a6, 0x9846, 0xd37a, 0xaffb, 0xd37b, 0xd3a1,
+  0xaffe, 0xd375, 0xd3af, 0xd3ae, 0xd3b6, 0xaff3, 0xaff0, 0xd3b4,
+  0xd3b0, 0xd3a7, 0xd3a2, 0xaff6, 0xaff2, 0xd377, 0xafee, 0xd3b1,
+  0xafef, 0xd379, 0x99b4, 0x8ef5, 0xfd55, 0x9ccd, 0x8978, 0xd75e,
+  0xd760, 0xd765, 0xd779, 0xb2fc, 0xb2f2, 0xd75d, 0xb2fd, 0xb2fe,
+  0xd768, 0xd76f, 0xd775, 0xd762, 0xd769, 0x8f53, 0xb340, 0xd777,
+  0xd772, 0xb2fa, 0xb2f8, 0xd76e, 0xd76a, 0xd75c, 0xb2ef, 0xd761,
+  0xd759, 0x8f6f, 0xb2f7, 0xb2f9, 0xd766, 0xd763, 0xb2f4, 0xd773,
+  0xb2f1, 0xd764, 0xd77a, 0xd76c, 0x8e63, 0xd76b, 0xb2f0, 0xb2fb,
+  0xb2f3, 0xd75a, 0xd75f, 0xd770, 0xd776, 0xb341, 0xd75b, 0xd767,
+  0xd76d, 0xb2f6, 0x8f56, 0xd778, 0xd771, 0xd774, 0xfe76, 0xb2f5,
+  0x9fc6, 0xdb6c, 0xdb60, 0xb5d7, 0xdb7d, 0xdba7, 0xdbaa, 0xb5d5,
+  0xdb68, 0xdba3, 0xdb69, 0xdb77, 0xb5e2, 0xdb73, 0xb5df, 0xfaac,
+  0xdb74, 0xdb5d, 0xdba4, 0x8f58, 0xb5e8, 0xdba1, 0xdb75, 0xdbac,
+  0xdb70, 0xdfc8, 0xdbaf, 0xb5e6, 0xdb6e, 0xdb7a, 0xb5e9, 0xb5d4,
+  0xdb72, 0xdbad, 0xdb6b, 0xdb64, 0xdb6f, 0xdb63, 0xdb61, 0xb5d0,
+  0xdba5, 0xdb6a, 0xdba8, 0x9848, 0xdba9, 0xb5d8, 0xb5dd, 0xb5d9,
+  0xb5e1, 0xdb7e, 0xb5da, 0xdb76, 0xdb66, 0xb5d2, 0xdb5e, 0xdba2,
+  0xdbab, 0xdb65, 0xb5e0, 0xdbb0, 0xdb71, 0xdb6d, 0xb5d1, 0xb5e5,
+  0x99b7, 0xdb7c, 0xb5e7, 0xdb78, 0xb5dc, 0xb5d6, 0xb5de, 0xb5d3,
+  0xb5e4, 0xdb79, 0xdb67, 0xdb7b, 0xdb62, 0xdba6, 0x9665, 0xfa6c,
+  0x9de7, 0xdbae, 0x9e62, 0x96cc, 0x8e67, 0xdb5f, 0xfc75, 0x987e,
+  0xdfc7, 0xdfdd, 0xb855, 0xdfcc, 0xfdb9, 0xdfca, 0xdfb5, 0xb8a9,
+  0xdfc5, 0xdfd9, 0xdfc1, 0xb8b1, 0xdfd8, 0xdfbf, 0xb5e3, 0xdfcf,
+  0xdfc0, 0xdfd6, 0xb8b0, 0xb8a8, 0x97fc, 0xdfaa, 0xdfb2, 0xdfcb,
+  0xdfc3, 0xdfdc, 0xdfc6, 0xb8b6, 0xdfd7, 0x98f9, 0xb8ad, 0x8f66,
+  0xdfc9, 0xdfd1, 0xdfb6, 0xdfd0, 0xdfe1, 0xdfb1, 0xdfd2, 0x956e,
+  0xdfdf, 0x9245, 0xdfab, 0xb5db, 0x8f60, 0xdfb9, 0xdfb8, 0xb8af,
+  0x9ed1, 0xdfbc, 0xdfbe, 0xdfcd, 0xdfde, 0xb8b2, 0xfecd, 0xb8b3,
+  0x99b9, 0xdfb0, 0xb8ab, 0xdfb4, 0xdfda, 0xb8b4, 0xb8ac, 0xb8ae,
+  0xb8b5, 0xdfe0, 0xdfd3, 0xdfce, 0x8f62, 0x974c, 0xdfbb, 0xdfba,
+  0xb8aa, 0xdfac, 0xb8a7, 0xdfc4, 0xdfad, 0xdfc2, 0xdfb7, 0xdfdb,
+  0x91c7, 0x955f, 0xb8a6, 0xdfb3, 0x99bb, 0xdfaf, 0xdfd5, 0xdfae,
+  0xbb60, 0xe3d3, 0x8e6d, 0x8f71, 0xe3c2, 0x94cb, 0xe3ac, 0xe3ca,
+  0xbb58, 0xe3bb, 0xe3c5, 0xbb5b, 0xe3be, 0xbb59, 0xe3af, 0xe3cd,
+  0xe3ae, 0xe3c1, 0x95b1, 0xe3ad, 0xe3bf, 0xe3c8, 0xe3c6, 0xe3ba,
+  0xe3b5, 0xe3b3, 0x9af2, 0xe3b4, 0xe3c7, 0xe3d2, 0xe3bc, 0xbb5a,
+  0xe3b7, 0xe3cb, 0xbb5d, 0xe3b6, 0xe3b0, 0xe3c0, 0xbb61, 0x96c3,
+  0x99bd, 0xbb55, 0xbb5e, 0xe3b8, 0xe3b2, 0xbb57, 0xdfd4, 0xbb56,
+  0xe3c3, 0xbb54, 0xbb63, 0xbb5c, 0xe3c4, 0xe3b9, 0xe3b1, 0xe3cc,
+  0xe3bd, 0xbb62, 0xe3d0, 0xbb5f, 0xe3cf, 0xe3c9, 0xe3ce, 0xa0cf,
+  0xe3d1, 0x8f6d, 0x99be, 0x8ef4, 0x8f72, 0x95e4, 0xe773, 0xe774,
+  0xe767, 0xe766, 0xe762, 0xbdb4, 0xbdac, 0xe776, 0xe775, 0xdfa9,
+  0xe75f, 0xe763, 0xe75d, 0xe770, 0xe761, 0x99bf, 0xe777, 0xe75a,
+  0xe758, 0xe764, 0xe76e, 0xe769, 0xbdb6, 0xe74f, 0xe76d, 0x9242,
+  0xfba5, 0xbdb7, 0xdfbd, 0xe75b, 0xe752, 0xe755, 0xe77b, 0xe75c,
+  0xe753, 0xe751, 0xe74e, 0x99c0, 0xbdb0, 0xe765, 0xbdaf, 0xbdb3,
+  0xe760, 0xe768, 0xbda9, 0xe778, 0xe77c, 0xbdab, 0xe757, 0xe76b,
+  0xe76f, 0xe754, 0xe779, 0xbdb2, 0xbdb1, 0xe74c, 0xbdb5, 0xe772,
+  0xe756, 0xe76a, 0xe750, 0xe75e, 0xe759, 0xbdad, 0xbdae, 0xe76c,
+  0xe77d, 0xe77a, 0xe771, 0xfdb4, 0x8f77, 0x99c1, 0xe74d, 0xbdaa,
+  0xeb49, 0xeb40, 0xeb43, 0xfab9, 0xbfbb, 0xeb45, 0xeaf9, 0xeb41,
+  0xeb47, 0xbfb8, 0xbfbc, 0xbfb6, 0x8f40, 0xfa44, 0xeafb, 0xeb4c,
+  0xeb46, 0x99c2, 0xeafc, 0xeb55, 0xeb4f, 0xeaf8, 0xee46, 0xeafe,
+  0xbfb7, 0x8f5c, 0xeb4a, 0xeb54, 0xbfbf, 0x8cbd, 0xeb51, 0xeafd,
+  0xeb44, 0xeb48, 0xeb42, 0xeb56, 0xeb53, 0xeb50, 0xbfb9, 0xbfba,
+  0xbfbe, 0xeafa, 0xeb57, 0xbfbd, 0xeb4d, 0x99c4, 0x99c5, 0xeb4b,
+  0x8f7b, 0xeb4e, 0xee53, 0xee40, 0xee45, 0xee52, 0xee44, 0xedfb,
+  0xee41, 0xc1a2, 0xedf4, 0xee4d, 0xee4f, 0xedf3, 0xc1a1, 0xee51,
+  0xee49, 0xc1a8, 0xee50, 0xee42, 0xc1aa, 0xedf9, 0xeb52, 0xee4a,
+  0xee47, 0xedf5, 0xee55, 0xc1a4, 0xc1a5, 0xedf7, 0xee48, 0x8cb6,
+  0xee54, 0xee4b, 0xedfd, 0xc1a7, 0xc1a3, 0xee4c, 0xedfe, 0xee56,
+  0xedf8, 0xee43, 0xee4e, 0xedfa, 0xedfc, 0xc2cb, 0xedf6, 0xc1a9,
+  0xc2c4, 0xc17e, 0xc1a6, 0xc2c8, 0xf0b3, 0xf0a9, 0xf0a4, 0xf0aa,
+  0xf0b4, 0xf0b8, 0xf0b7, 0xc2ca, 0xc2c9, 0xf0ab, 0xf0b9, 0xf0ae,
+  0xf0a6, 0x8fa3, 0xf0a8, 0xf0a7, 0xf0ad, 0xf0b2, 0xf0a5, 0xf0ac,
+  0xf0b1, 0xc2c7, 0xf0af, 0xc2c5, 0xf0b0, 0xc2c3, 0xc2c6, 0xf2d5,
+  0xf0b5, 0xc3c2, 0x8cce, 0xf2cd, 0xf2d1, 0xf2c9, 0xf2cc, 0xf2d4,
+  0xc3c0, 0xf2d9, 0xf2d2, 0x99c6, 0xf2ca, 0xf2da, 0xf2d3, 0xc3c3,
+  0xc3c4, 0xf2d7, 0xf2cb, 0xc3bf, 0xc3c1, 0xf2c6, 0xf2ce, 0xf2c8,
+  0x96cd, 0xf2d8, 0xf2d6, 0xf2c7, 0xf2cf, 0xf4be, 0xc3c5, 0xf2d0,
+  0xc4a7, 0xc4a9, 0xc4a6, 0x96c7, 0xf4c3, 0xf4bb, 0xf4b9, 0xf4bd,
+  0xf4ba, 0x8fa5, 0xf4bf, 0xf4c1, 0xc4aa, 0xc4ac, 0xf4c0, 0xc4ad,
+  0xc4ab, 0xf4c2, 0xfabb, 0x8c61, 0x9570, 0xc4a8, 0x9368, 0x8f7e,
+  0xc4f4, 0xf5f1, 0xf5f7, 0xc4f6, 0xf4bc, 0xf5f6, 0xf5fd, 0xf5f4,
+  0xf5fb, 0xf5fa, 0xf4b8, 0xf5f5, 0xf0b6, 0xf5fe, 0xf5f3, 0xf5f8,
+  0x8faa, 0xf5fc, 0xf5f2, 0xf74a, 0xc4f5, 0xf5f9, 0xa050, 0xf7f4,
+  0xf74b, 0xf749, 0xf747, 0xf748, 0xf74c, 0xc5d9, 0xf7f2, 0xf7f0,
+  0xf7f5, 0xf7f3, 0xf7f6, 0xc5da, 0xf7f1, 0x90d3, 0xf8bc, 0x9556,
+  0xf945, 0xf946, 0xf947, 0xf9c7, 0xf9bd, 0xca4f, 0xaaea, 0xad68,
+  0xd3b8, 0xd3b7, 0xb040, 0xb342, 0xd77c, 0xd77b, 0xb5ea, 0xb8b8,
+  0xb8b7, 0xb8b9, 0xe3d4, 0xe77e, 0xeb58, 0xeb5a, 0xeb59, 0xc1ab,
+  0xee57, 0xf0ba, 0xf9a5, 0xa6e4, 0x8fb8, 0xcdc9, 0xcdca, 0xcdc8,
+  0xcdc7, 0xaaeb, 0x99c8, 0xd0a9, 0xd0a7, 0xd0a6, 0xad69, 0xad6b,
+  0xad6a, 0xd0a8, 0x8faf, 0xd3c4, 0xd3c1, 0xd3bf, 0xb041, 0xd3c2,
+  0xb046, 0xd3bc, 0xd3cb, 0xd3cd, 0xd3bd, 0x99c9, 0xb043, 0xd3ce,
+  0xd3c9, 0xd3bb, 0xd3c0, 0xd3ca, 0xd3c6, 0xd3c3, 0xb048, 0xd3cc,
+  0xd3be, 0x9579, 0xd3c7, 0xd3b9, 0xb047, 0xb044, 0xd3c5, 0xd3c8,
+  0xd3ba, 0xb045, 0xb042, 0x9f49, 0xb34c, 0xd7a5, 0xb34b, 0x99ca,
+  0xd7a8, 0xd7ab, 0xb348, 0xb346, 0xd77e, 0xd7a9, 0xd7a7, 0xd7a4,
+  0xd7ac, 0xd7ad, 0xd7af, 0xd7b0, 0xd77d, 0xb345, 0xd7a2, 0xd7a1,
+  0xd7ae, 0xb347, 0xd7a3, 0xb349, 0xb344, 0xd7a6, 0xb34d, 0xb34a,
+  0xd7aa, 0xb5f1, 0xdbbf, 0xdbb4, 0xb5ee, 0xdfe7, 0xdbbd, 0xdbb1,
+  0xb5ec, 0xdbb6, 0xb5ef, 0xdbba, 0xdbb8, 0xb5f2, 0xb5eb, 0xdbb2,
+  0xdbb5, 0xb5f0, 0xdbb3, 0xdbbe, 0xdbbc, 0xdbb7, 0xdbb9, 0xdbbb,
+  0xb5ed, 0x99cb, 0xdfe8, 0xdfee, 0xdfe4, 0xdfea, 0xb8ba, 0xdfe6,
+  0xb8c0, 0xb8bf, 0xb8be, 0xdfed, 0xb8c1, 0xb8c2, 0xdfe3, 0xdff0,
+  0xb8c3, 0xb8bd, 0xb8bc, 0xdfec, 0xb8c4, 0xdfe2, 0xdfe5, 0xdfef,
+  0xdfeb, 0xe3f4, 0xe3e9, 0xb8bb, 0xbb6a, 0xe3dd, 0xe3f2, 0xe3de,
+  0xbb65, 0xe3db, 0xe3e4, 0xe3dc, 0xbb67, 0xe3d6, 0xe3f1, 0xbb68,
+  0xe3ee, 0xe3ef, 0xe3d7, 0xbb6d, 0xe3e6, 0xe3e0, 0xe3e7, 0xe3da,
+  0xe3f3, 0xe3eb, 0xe3e5, 0xe3d5, 0xbb69, 0xe3ec, 0xbb6c, 0xe3f0,
+  0xe3ea, 0xbb66, 0xe3e8, 0xe3e2, 0xbb64, 0xe3d9, 0xe3e1, 0xe3ed,
+  0xe3df, 0xe3e3, 0xbdc1, 0xdfe9, 0xe7b2, 0xe7bb, 0xe7b1, 0xe7ad,
+  0xe7aa, 0xbdc2, 0xe7a8, 0xbb6b, 0xe7a1, 0xbdc0, 0xe7a7, 0xbdbf,
+  0xe7ac, 0xe7a9, 0xe7b9, 0xe7b4, 0xe7ae, 0xe7b3, 0xbdbb, 0xe7ab,
+  0xe7be, 0xe7a2, 0xe7a3, 0xe7ba, 0xbdbc, 0xe7bf, 0xbdbe, 0xe7c0,
+  0xe7b0, 0xe3d8, 0xe7b6, 0xe7af, 0xe7b8, 0xe7b5, 0x9dd5, 0x8fb0,
+  0xe7a6, 0xbdb9, 0xe7bd, 0xbdba, 0xe7a4, 0xbdbd, 0xeb64, 0xe7b7,
+  0xe7bc, 0xfa7a, 0xeb61, 0xbdb8, 0xbfc0, 0xeb6b, 0xeb67, 0x9e5f,
+  0xeb65, 0xeb60, 0xeb6f, 0x99cd, 0xa0c9, 0xbfc4, 0xeb5c, 0xeb68,
+  0xeb69, 0xeb5f, 0xeb5e, 0xeb6c, 0xeb62, 0xeb5d, 0xeb63, 0xeb6e,
+  0xeb5b, 0xeb6d, 0xeb6a, 0xbfc2, 0xbfc1, 0xbfc3, 0xeb66, 0xf0cb,
+  0x9adb, 0xa0c6, 0xee59, 0xc1b1, 0xee5d, 0xee5a, 0xee61, 0xee67,
+  0xee5c, 0x8fb4, 0xee70, 0xc1ae, 0xee6a, 0xee5f, 0xee6b, 0xee66,
+  0xee6d, 0xee5e, 0xc1b3, 0xc1b2, 0xee60, 0xee6e, 0xee58, 0xee6c,
+  0xc1ac, 0xa0d7, 0xee64, 0xee63, 0xee68, 0xee5b, 0xc1b0, 0xc1b4,
+  0xee62, 0xee69, 0xc1b5, 0xee65, 0xa0c7, 0xc1ad, 0xc1af, 0xf0c7,
+  0xf0c5, 0xa043, 0xf0cc, 0xf0c9, 0xf0cd, 0x8fb5, 0xf0be, 0xf0c6,
+  0xf0d1, 0xee6f, 0xf0c2, 0xc2cf, 0xe7a5, 0xf0bd, 0xf0ca, 0xf0c4,
+  0xf0c1, 0xf0bc, 0xf0bb, 0xf0d0, 0xf0c0, 0xf0bf, 0xc2cd, 0xf0c8,
+  0x8fb2, 0xc2cc, 0xc2ce, 0xf0c3, 0xf0cf, 0xa061, 0xf2de, 0xf2df,
+  0xc3c9, 0xf2dc, 0xc3c6, 0xf2e4, 0xc3ca, 0xf2e6, 0xf2db, 0xf0ce,
+  0xf2e8, 0xf2dd, 0x9e5e, 0xc3c7, 0xf2e3, 0xf2e5, 0xf2e0, 0xf2e7,
+  0xf2e2, 0xf2e1, 0xc3c8, 0x8fb6, 0xf4c5, 0xf4c6, 0xf4c8, 0xc4ae,
+  0xc4af, 0xf4c9, 0xf4c7, 0x9fe8, 0xf4c4, 0xf642, 0xf645, 0xf641,
+  0xc4fa, 0xf643, 0xc4f9, 0xc4f8, 0xc4f7, 0xf644, 0xf751, 0xf74f,
+  0x9cb2, 0xf74e, 0xf640, 0xf750, 0xf646, 0xf74d, 0x957c, 0xf7f9,
+  0xf7d7, 0xf7f7, 0xc5db, 0xf7f8, 0xf7fa, 0xf8bf, 0xc5fa, 0xf8be,
+  0xf8bd, 0xc5fb, 0xc65a, 0xf96e, 0xf9a7, 0xf9a6, 0xf9a8, 0xa6e5,
+  0xd0aa, 0x9fc7, 0xd3cf, 0xd3d0, 0x8fbb, 0x8fbc, 0xdbc0, 0xf647,
+  0xf8c0, 0xa6e6, 0xad6c, 0xd0ab, 0x8fec, 0xd7b1, 0xb34e, 0xdbc2,
+  0xdbc1, 0xb5f3, 0xb8c5, 0xe7c1, 0xbdc3, 0xbdc4, 0x8fc0, 0x936a,
+  0xbfc5, 0xc5fc, 0xa6e7, 0x8be4, 0x9c7c, 0xd0ac, 0xaaed, 0xd0ae,
+  0xd0ad, 0xad6d, 0xd3d1, 0x95a1, 0xd3d8, 0xb049, 0xd3d6, 0xd3d4,
+  0xd3db, 0xd3d2, 0xd3d3, 0xb04a, 0xb04e, 0xd3dc, 0xb04d, 0xd3da,
+  0xd3d7, 0xd3d5, 0xb04b, 0xb04c, 0xd3d9, 0xfeec, 0x95a3, 0xb350,
+  0xd7b2, 0xb355, 0xd7c2, 0xb354, 0xd7c4, 0x8c45, 0x8cb8, 0xd7b8,
+  0xb352, 0xd7c3, 0xd7b3, 0xb353, 0xd7bf, 0xd7bb, 0xd7bd, 0xd7b7,
+  0xd7be, 0x8fc1, 0xb34f, 0xd7ba, 0xa052, 0xd7b9, 0xd7b5, 0xd7c0,
+  0xd7bc, 0xd7b4, 0xd7b6, 0xb351, 0xd7c1, 0x99d0, 0xb5f6, 0xdbcd,
+  0x8fc3, 0x8fc4, 0xdbc9, 0xdbcb, 0xdbc6, 0xdbc5, 0xdbc3, 0xdbca,
+  0xdbcc, 0xdbc8, 0x95a4, 0xdbc7, 0xb5f4, 0xb5f5, 0x8fc6, 0x9e60,
+  0xdbcf, 0xb8cd, 0xdff2, 0xdff8, 0xdff3, 0xdff4, 0xf9d8, 0xdff9,
+  0xb8cf, 0xb8c7, 0xb8ce, 0xdff1, 0xdbc4, 0xb8ca, 0xb8c8, 0xdff7,
+  0xdff6, 0xb8c9, 0xb8cb, 0xdff5, 0xb8c6, 0xb8cc, 0x95a5, 0xe3f6,
+  0xbb74, 0xe442, 0xe441, 0xe3fb, 0xbb76, 0xe440, 0xe3f7, 0xe3f8,
+  0xbb6e, 0xbb70, 0x9cb3, 0xe3fd, 0xe3f5, 0xbb72, 0xbb71, 0xe3f9,
+  0xe3fe, 0xe3fc, 0xbb73, 0xe3fa, 0x99d1, 0xfef1, 0xdbce, 0xbb6f,
+  0xe7c2, 0xe7c9, 0xbdc6, 0xe7cd, 0xbdca, 0xe7c5, 0xe7c3, 0xe7cc,
+  0xbdc5, 0xe7cb, 0xbdc7, 0xbdc8, 0xe7c4, 0xbdc9, 0xe7ca, 0xe7c6,
+  0xe7c7, 0xe7c8, 0xbb75, 0xeb70, 0xeb7c, 0xbfca, 0xeb77, 0xeb79,
+  0x99d2, 0xbfc8, 0xeb71, 0xeb75, 0xeb78, 0xbfc6, 0xbfc9, 0xeb7b,
+  0xeb73, 0xeb74, 0xeb7a, 0xeb72, 0xeb76, 0xbfc7, 0xee72, 0xee71,
+  0xc1b7, 0xee77, 0xc1b9, 0xc1b6, 0xee73, 0xc1ba, 0xee74, 0xee75,
+  0xee78, 0x9cc2, 0xc1b8, 0xf0d6, 0x99d3, 0xf0d9, 0xf0d3, 0xf0d5,
+  0x95a7, 0xf0d4, 0xf0d7, 0xf0d8, 0xee76, 0xf0d2, 0x95a9, 0xc3cd,
+  0xf2ec, 0xf2ef, 0xf2f1, 0xf2ea, 0xf2eb, 0xf2ee, 0xf2f0, 0xc3ce,
+  0xc3cc, 0xc3cb, 0xf2ed, 0xf2e9, 0xf4ca, 0xc4b0, 0x95a6, 0xf4cb,
+  0xf649, 0xc4fb, 0xf64b, 0xc4fc, 0xf648, 0xf64a, 0xc5a8, 0xf752,
+  0xc5a7, 0xf7fd, 0xf7fc, 0xf7fb, 0x9c5d, 0xf948, 0xf949, 0xf94b,
+  0xf94a, 0xca50, 0xa6e8, 0x98e2, 0xad6e, 0xd7c5, 0xb5f7, 0xdffa,
+  0xc2d0, 0x8fc9, 0xf2f2, 0xa0c2, 0x8fca, 0xa8a3, 0xb357, 0x99d4,
+  0xb356, 0xa0b9, 0xdbd0, 0xb5f8, 0xdbd2, 0xdbd1, 0xdffb, 0xb8d0,
+  0xe443, 0xe446, 0xe445, 0xe444, 0xe7ce, 0xe7d0, 0xe7cf, 0x9b58,
+  0xbfcc, 0x8fcd, 0xa0d4, 0xbfcb, 0xc1bb, 0xee79, 0xee7b, 0xee7a,
+  0xc2d1, 0xf2f4, 0xf2f3, 0xf4cc, 0xc4b1, 0x8fce, 0xc4fd, 0xf754,
+  0xf753, 0xc65b, 0x8be5, 0x8979, 0xa8a4, 0xd0af, 0xad6f, 0xd7c8,
+  0xd7c6, 0xd7c7, 0xdbd4, 0xdbd5, 0xe043, 0xdbd3, 0xdffc, 0xe041,
+  0xe040, 0xe042, 0xb8d1, 0xdffe, 0xdffd, 0xe044, 0x8fd0, 0xe449,
+  0xe447, 0xe448, 0xe7d3, 0xe7d1, 0xe7d2, 0xeb7d, 0xee7c, 0xee7d,
+  0xc2d2, 0xf2f5, 0xf4cd, 0xc4b2, 0xf64c, 0xf755, 0xc5a9, 0xf7fe,
+  0xf94c, 0xa8a5, 0xad71, 0xad72, 0xd0b0, 0xd0b1, 0xad70, 0xb054,
+  0xb052, 0xb051, 0xb058, 0xb050, 0xb059, 0xd3dd, 0xb056, 0xb053,
+  0xb057, 0xb055, 0xb04f, 0xb35f, 0x95b6, 0xb359, 0xd7cc, 0xb35e,
+  0xb360, 0xb35a, 0xb35b, 0xd7ca, 0x99d6, 0xb358, 0x95e5, 0xd7cb,
+  0xb35d, 0xd7c9, 0xb35c, 0xb644, 0xb646, 0x99d7, 0xdbd8, 0xb645,
+  0xb5f9, 0xb5fd, 0x95b5, 0xb8e4, 0xe049, 0xdbda, 0xb5fe, 0xdbdd,
+  0xdbde, 0xb643, 0xdbe0, 0xa0ca, 0xdbe2, 0xdbe3, 0xdbd7, 0xdbd6,
+  0xdbe4, 0xb642, 0xdbe1, 0xdbdf, 0xb640, 0xb5fb, 0xb647, 0xdbdb,
+  0xdbdc, 0xdbd9, 0xb641, 0xb5fc, 0xb5fa, 0xe048, 0xb8df, 0xb8da,
+  0xb8d5, 0x9ffd, 0xb8e5, 0xb8d6, 0xb8d2, 0xb8e1, 0xb8de, 0xb8e0,
+  0xb8d7, 0xb8dc, 0xb8d3, 0xb8d4, 0xe050, 0xe04d, 0xe045, 0xe04a,
+  0xb8e2, 0xe051, 0xb8e3, 0xb8d9, 0xa058, 0xe047, 0xe04f, 0xe04b,
+  0xe04e, 0xe04c, 0xb8dd, 0xe046, 0xb8d8, 0xe44c, 0xbb78, 0xbb7b,
+  0xe44e, 0x8fd6, 0xbba5, 0xe44d, 0xbb7d, 0x99d8, 0xbdcf, 0xe44f,
+  0xbba4, 0xe44b, 0xbba6, 0x8fd3, 0xbb79, 0xb8db, 0xbb7c, 0xbb7a,
+  0xbb7e, 0xbba2, 0xbb77, 0xbba7, 0xbba3, 0x8fe5, 0xbba1, 0xe44a,
+  0x8fe9, 0xbdd6, 0xbdd2, 0x99d9, 0xbdd9, 0xe7d6, 0xbdda, 0xe7e2,
+  0xe7db, 0xbdcb, 0xe7e3, 0xe7dd, 0xbdd5, 0xe7de, 0xbdd4, 0xe7e1,
+  0xbdce, 0xe7df, 0xe7d5, 0xbdcd, 0xebaa, 0xbdd3, 0xbdd0, 0xbdd8,
+  0xe7d4, 0xe7d8, 0xbdcc, 0xe7d7, 0xe7d9, 0xe7da, 0xbdd7, 0xe7dc,
+  0xe7e0, 0xe7e4, 0x927c, 0xbddb, 0xbfd2, 0xeba5, 0xebab, 0xeba8,
+  0xeb7e, 0xebac, 0xeba1, 0xeba7, 0xbfcd, 0xbfd3, 0xebad, 0x9c45,
+  0xbfcf, 0xbfd9, 0xbfd4, 0xebaf, 0xeba9, 0xbfd0, 0xeba2, 0xbfda,
+  0xeba3, 0xeba4, 0xbfdb, 0xbfd8, 0xbdd1, 0xbfce, 0xebb0, 0xbfdc,
+  0xbfd5, 0xebae, 0xbfd1, 0xbfd6, 0xbfd7, 0xc1c3, 0xeea4, 0xeead,
+  0xeeaa, 0xeeac, 0xc1c0, 0xeea5, 0x8fde, 0xeeab, 0xc1bc, 0xeea7,
+  0xc1c4, 0xeea3, 0xeea8, 0xeeaf, 0xeba6, 0xeea9, 0xeea2, 0xc1bd,
+  0xeea1, 0xc1be, 0xeeb0, 0xc1bf, 0xeeae, 0xc1c2, 0xee7e, 0x8fdf,
+  0xc1c1, 0xeea6, 0xf0dc, 0xf0ea, 0xf0e5, 0xf0e7, 0xf0db, 0xc2d3,
+  0xf0da, 0xc2d6, 0xc2d5, 0xa04b, 0xf0e9, 0xf0e1, 0xf0de, 0xf0e4,
+  0xf0dd, 0xf0df, 0xf0e8, 0xf0e6, 0xc2d4, 0xf0ed, 0xf0eb, 0xf0e2,
+  0xf0ec, 0xf0e3, 0x8fe2, 0xf2f9, 0xc3cf, 0xf341, 0xa0cc, 0xf64f,
+  0xc3d6, 0xf0e0, 0xf2f7, 0xc3d2, 0xf2f8, 0xf2fd, 0x8fe3, 0x8fe4,
+  0xc3d4, 0xc3d5, 0xf2f6, 0xf340, 0xf342, 0xf2fa, 0xf2fc, 0xf2fe,
+  0xf2fb, 0xf343, 0xc3d1, 0xc3d7, 0xc3d3, 0xc3d0, 0xf4d0, 0x9bc4,
+  0xc4b7, 0xf4ce, 0x9bfc, 0xf4d2, 0xf4d3, 0xc4b5, 0xf4d4, 0xf4d1,
+  0x964c, 0xf4cf, 0xc4b8, 0xc4b4, 0xf4d5, 0xc4b6, 0xc4b3, 0xc4fe,
+  0xc540, 0xf64e, 0xf64d, 0xf650, 0xf651, 0xc541, 0xf756, 0xf75b,
+  0xc5aa, 0x9af6, 0xf758, 0x8cae, 0xf757, 0xf75a, 0xf759, 0xf843,
+  0xc5dc, 0xf842, 0xf840, 0xf841, 0x8fe7, 0xc5fe, 0xc5fd, 0xf8c1,
+  0xf8c2, 0xc640, 0xf94d, 0xf94e, 0xc667, 0x8fe8, 0xc66d, 0xf9a9,
+  0xf9c8, 0x8be7, 0x897a, 0x897b, 0xa8a6, 0xd7cd, 0xd7ce, 0xe052,
+  0xe450, 0xe7e5, 0xc1c6, 0xc1c5, 0xf0ee, 0xf344, 0xf844, 0xa8a7,
+  0xd3de, 0xb05a, 0xb361, 0xe054, 0xe053, 0xbddc, 0xe7e6, 0xbddd,
+  0xeeb1, 0xc2d7, 0x99da, 0xc676, 0xa8a8, 0xcdcb, 0xd3df, 0xb362,
+  0xd7cf, 0xd7d0, 0xdbe5, 0xb648, 0xb8e6, 0xe056, 0xe055, 0xe057,
+  0xe451, 0xe452, 0xbba8, 0xbfdd, 0xbdde, 0xbfde, 0xeeb5, 0xeeb2,
+  0xeeb4, 0xeeb3, 0xc1c7, 0xf0ef, 0xf346, 0xf345, 0xcba4, 0xb05c,
+  0xb05b, 0xd3e0, 0xd7d1, 0xdbe7, 0xdbe6, 0xb649, 0xe059, 0xe05a,
+  0xe058, 0xb8e8, 0xb8e7, 0xbbaa, 0xbba9, 0xe7e7, 0xebb3, 0xebb1,
+  0xebb2, 0xbfdf, 0xeeb7, 0xeeb6, 0xf0f2, 0xf0f1, 0xf0f0, 0xf347,
+  0x8fed, 0xf9aa, 0xa8a9, 0xad73, 0x95c0, 0xad74, 0xb05d, 0xb05e,
+  0xd3e2, 0xd3e1, 0xd7d2, 0xb368, 0xb366, 0xb363, 0xb367, 0xb365,
+  0xb364, 0xa0cb, 0xb64a, 0xdbea, 0xb8ed, 0xb64c, 0xb651, 0xdbec,
+  0xb653, 0xb652, 0xb655, 0xdbeb, 0xdbe8, 0xb64f, 0xb64b, 0xb64d,
+  0xdbe9, 0xb654, 0xb650, 0xb64e, 0xb8ef, 0xb8ee, 0xb8ec, 0xb8f0,
+  0xb8ea, 0xb8eb, 0xb8e9, 0xe05b, 0x9e48, 0xe454, 0xbbac, 0xbbad,
+  0xbbab, 0x99db, 0xe453, 0x8ff3, 0xe455, 0xe7ea, 0xe7ec, 0x8ff9,
+  0xbde7, 0xe7ed, 0xbde0, 0xe7e9, 0xbddf, 0xbde9, 0xbde5, 0xbde6,
+  0xbde2, 0xe7e8, 0xbde1, 0xe7ee, 0xe7eb, 0x95c1, 0xbde8, 0xa04e,
+  0xbde3, 0xbde4, 0xebb5, 0xebb7, 0xebb6, 0x99dc, 0xebb8, 0xbfe0,
+  0xebb4, 0xa064, 0xc1cb, 0xeeb8, 0xc1c8, 0xc1cc, 0xc1ca, 0xc1c9,
+  0xf0f3, 0xf0f6, 0xf0f5, 0x8ff7, 0xf0f4, 0xc2d8, 0xf348, 0xf349,
+  0xc3d8, 0xf34a, 0xc3d9, 0x89b0, 0xa048, 0xc4ba, 0xc4b9, 0xf652,
+  0x8ffb, 0x8ff6, 0xc542, 0xf653, 0xf75c, 0xc5ab, 0xc5ac, 0x9ddc,
+  0xf845, 0xc642, 0x99dd, 0x8be8, 0xa8aa, 0xb36a, 0xb369, 0xe05c,
+  0xe05d, 0xbbae, 0xebb9, 0xbdea, 0xebba, 0xeeb9, 0xa8ab, 0xd0b2,
+  0xad76, 0xad75, 0xd3e3, 0xb05f, 0xd3e4, 0xd7d5, 0x92c1, 0xd7d4,
+  0xd7d3, 0xdbee, 0xb658, 0x9fd6, 0xdbed, 0xb657, 0xdbef, 0xb656,
+  0xe05f, 0xe062, 0xe060, 0xe061, 0xe065, 0xe05e, 0xe066, 0xe063,
+  0xe064, 0xbbb0, 0xe456, 0xbbaf, 0xe7f2, 0xe7f0, 0xbdeb, 0xe7ef,
+  0xe7f1, 0xbdec, 0xebbb, 0xa0d2, 0xebbc, 0xc1cd, 0x9040, 0xf34c,
+  0xf34e, 0xf34b, 0xf34d, 0xf4d6, 0xf654, 0xf96f, 0xa8ac, 0xad77,
+  0xd3e5, 0xd3e7, 0xd3e6, 0xd7d8, 0xb36c, 0xd7d6, 0xb36b, 0xd7d9,
+  0x8ac4, 0xd7da, 0xd7d7, 0x99e0, 0xdbfb, 0xb660, 0xdbf3, 0xdbf9,
+  0xb65b, 0xb65e, 0xdbf2, 0xb659, 0xdbf6, 0xe06c, 0xb65d, 0xdbf1,
+  0x9ff0, 0xdbf7, 0xdbf4, 0xdbfa, 0xdbf0, 0xdbf8, 0xb65c, 0xb65f,
+  0xdbf5, 0xb65a, 0xb8f2, 0xe068, 0xb8f1, 0xe06f, 0xe06e, 0xb8f8,
+  0xb8f9, 0xe070, 0xb8f3, 0xe06d, 0xb8f7, 0xe072, 0xe069, 0xe06b,
+  0xb8f4, 0xe067, 0xe06a, 0xe071, 0xb8f5, 0xe073, 0xb8f6, 0xbbb1,
+  0xe45b, 0xe461, 0xe459, 0xe462, 0x9ff3, 0xe458, 0xe45d, 0xe463,
+  0xe460, 0xe45f, 0xe45e, 0xe457, 0xe45c, 0xe45a, 0x9dbf, 0xbdf1,
+  0xbdee, 0xe7fb, 0xe841, 0xe843, 0xe840, 0xe7f8, 0xe7fa, 0xe845,
+  0xe842, 0xe7fc, 0xe846, 0xe7f9, 0xe844, 0xbdef, 0xbdf5, 0xbdf3,
+  0xe7f3, 0xbdf4, 0xbdf0, 0xe7f4, 0xe7f6, 0xe7f5, 0xe7fd, 0xe7fe,
+  0x9ff6, 0xbdf2, 0x95c8, 0xbded, 0x9e5a, 0xe7f7, 0xebc6, 0xbfe2,
+  0xebbd, 0xbfe3, 0xbfe6, 0xebc2, 0xebbf, 0xbfe5, 0x99e3, 0xebc3,
+  0xebc4, 0xebbe, 0xebc7, 0xebc0, 0xebc5, 0xbfe4, 0xbfe1, 0xebc1,
+  0x8a4a, 0xeebf, 0xc1d0, 0xc1ce, 0xc1d1, 0xc1cf, 0xeebe, 0xeebb,
+  0xeeba, 0x9ff1, 0xeebd, 0xeebc, 0xf145, 0xc2de, 0xf0fb, 0xf0fa,
+  0xc2d9, 0xf141, 0xf140, 0xf0f7, 0xf143, 0xf0fc, 0xc2dd, 0xf0f9,
+  0xf142, 0xf0f8, 0xc2da, 0xc2dc, 0xf0fd, 0xc2db, 0xf0fe, 0x8aa7,
+  0xf144, 0xf352, 0xc3de, 0xf34f, 0xf353, 0x99e6, 0xc3db, 0xf351,
+  0xc3e0, 0x9ff7, 0xc3dd, 0x9fed, 0xf350, 0xc3df, 0xf354, 0xc3da,
+  0x8a5c, 0x9dae, 0xc4bc, 0xc4be, 0xf4d9, 0xc4bd, 0xf4d7, 0xc3dc,
+  0xf4d8, 0xc4bb, 0xc543, 0xc545, 0xf656, 0xc544, 0xf655, 0xf761,
+  0xc5ad, 0xf760, 0xc5ae, 0xf75e, 0xf75d, 0xf762, 0xf763, 0xf846,
+  0xf75f, 0xf8c6, 0xf8c3, 0xf8c4, 0xf8c5, 0xc65c, 0xf951, 0xf950,
+  0xf94f, 0xf970, 0x95c9, 0xf9be, 0xf9ab, 0xc66e, 0xa8ad, 0xb060,
+  0x9048, 0x99e8, 0xb8fa, 0x9049, 0x8cba, 0xbdf6, 0x90b1, 0xebc8,
+  0xc2df, 0xf355, 0x904a, 0xf9ac, 0xa8ae, 0xaaee, 0xad79, 0xad78,
+  0x99ea, 0xb063, 0xd3e8, 0xb061, 0xd3e9, 0xb062, 0xd7df, 0xd7db,
+  0x9bd1, 0xb36d, 0xd7de, 0xd7dd, 0xd7dc, 0xb36e, 0xd7e0, 0xd7e1,
+  0x99eb, 0x99ec, 0xdc43, 0xdc41, 0xdc45, 0xdc46, 0xdc4c, 0xdc48,
+  0xdc4a, 0x99ed, 0xdc42, 0xdbfc, 0xdc49, 0x99ee, 0xdc4b, 0xdc44,
+  0xdc47, 0xdbfd, 0xb662, 0xdc40, 0xdbfe, 0xb661, 0xb663, 0xb8fd,
+  0xe075, 0xe077, 0xe076, 0xe07b, 0xb8fb, 0xe078, 0xe074, 0xe079,
+  0xe07a, 0xb8fc, 0xb8fe, 0xe07c, 0xe467, 0xe466, 0xe464, 0xe465,
+  0xbbb3, 0xbbb5, 0xbbb2, 0xbbb4, 0xe84d, 0xe84e, 0xe849, 0x904c,
+  0xe84a, 0xbdf8, 0xbdfd, 0xbdf7, 0xbdfe, 0xbdf9, 0xe84b, 0xe84c,
+  0xe848, 0xbe40, 0xbdfb, 0xbdfa, 0xbdfc, 0xe847, 0x904d, 0xebca,
+  0xbfe8, 0x95cb, 0xebcc, 0xbfea, 0xebcf, 0xebcb, 0xebc9, 0xebce,
+  0xbfe9, 0xebcd, 0xbfe7, 0xc1d3, 0xc1d6, 0xeec1, 0x97e2, 0xc1d4,
+  0xeec0, 0xc1d2, 0xc1d5, 0xf146, 0xf147, 0xf148, 0xc2e0, 0x95cc,
+  0xf149, 0xc2e1, 0xc3e2, 0xf358, 0xf359, 0xf357, 0xf356, 0xf35a,
+  0xc3e1, 0xf4dd, 0xf4db, 0xf4dc, 0xf4de, 0xf4da, 0xf4df, 0xf658,
+  0x9f78, 0xf659, 0xf657, 0xc546, 0xf764, 0xc5af, 0xf765, 0xf848,
+  0xf847, 0x897c, 0x897d, 0x897e, 0x995d, 0xa8af, 0xb664, 0xb940,
+  0x9b5a, 0xbbb6, 0x9050, 0xbfec, 0x8c4f, 0xbfeb, 0xc3e3, 0xc47c,
+  0xc547, 0xa8b0, 0xb064, 0xb941, 0x9054, 0xf35b, 0xc6d6, 0x9aa8,
+  0x99ef, 0xfeeb, 0x9da3, 0x9da1, 0x9943, 0x9945, 0x9d7d, 0xcba6,
+  0x99f0, 0xa8b1, 0xa8b4, 0xa8b3, 0xa8b2, 0xcba5, 0x99f1, 0xcdcd,
+  0x99f2, 0xcdcf, 0xaaef, 0x8cbc, 0x9d60, 0xaaf1, 0xcdcc, 0xcdce,
+  0xaaf0, 0xcdd1, 0xcdd0, 0xcdd2, 0xa0a3, 0xd0b6, 0xd0b4, 0xad7c,
+  0xd0b3, 0xada3, 0xad7e, 0xad7b, 0xada4, 0xad7d, 0xada2, 0xada1,
+  0xd0b5, 0xad7a, 0xb06a, 0xd3eb, 0xd3f1, 0xb067, 0xb06e, 0x905b,
+  0xb069, 0xd3ee, 0xd3f0, 0xb06c, 0xd3ea, 0xd3ed, 0xb068, 0xb065,
+  0xd3ec, 0xb06b, 0xd3ef, 0xb06d, 0xb066, 0x9edb, 0xd7e3, 0xd7e6,
+  0xb370, 0xb37a, 0xb376, 0xd7e4, 0x9d79, 0xb37e, 0xb377, 0xb37c,
+  0xb372, 0xb36f, 0xb371, 0xb37d, 0xd7e5, 0xb375, 0xb378, 0xb374,
+  0xb379, 0xd7e7, 0xb37b, 0xb373, 0xd7e2, 0xdc4d, 0xb665, 0xdc4f,
+  0xb667, 0xb669, 0x99f3, 0xdc4e, 0xb666, 0xb66a, 0x9062, 0xb668,
+  0xb947, 0xe0a3, 0xb94f, 0xe07e, 0xb950, 0xb945, 0xe0a1, 0xb94a,
+  0xe0a2, 0xb943, 0xb942, 0x9f55, 0xb94d, 0xb94c, 0xb94b, 0xb949,
+  0xb94e, 0xe07d, 0xb944, 0xb946, 0xb948, 0x9bf9, 0xbbb8, 0xbbbb,
+  0xbbbf, 0xbbb9, 0xbbbe, 0xbbbc, 0xbbb7, 0x9065, 0xbbbd, 0xbbba,
+  0x96e0, 0xe852, 0xbe43, 0xbe41, 0xe853, 0x98be, 0xbe44, 0xbe42,
+  0xe851, 0xe850, 0xbff0, 0xe84f, 0xbfee, 0xbfed, 0xebd0, 0xbe45,
+  0xbfef, 0xebd1, 0xbff2, 0xebd2, 0xbff1, 0xc1d8, 0xeec3, 0xc1d7,
+  0xc1dc, 0xc1da, 0xc1db, 0xc2e3, 0xc1d9, 0xeec2, 0xebd3, 0xc2e2,
+  0xc2e4, 0xc3e4, 0xc3e5, 0xf4e0, 0xc5de, 0xc5dd, 0xa8b6, 0xca55,
+  0xb06f, 0xca52, 0xca53, 0xca51, 0xca54, 0xcbaa, 0xcba7, 0xcbac,
+  0xcba8, 0xa8b7, 0xa8ba, 0xcba9, 0xa8b9, 0xcbab, 0x9068, 0xa8b8,
+  0x906c, 0xcdd5, 0xcdd7, 0xaaf4, 0xcdd3, 0xcdd6, 0xcdd4, 0xaaf2,
+  0xaaf5, 0xaaf3, 0x95d8, 0xd0b8, 0xd0bc, 0xd0b9, 0xada7, 0xada8,
+  0x906a, 0xd0bb, 0xd0bd, 0xd0bf, 0xada5, 0xd0be, 0xada6, 0xd7ee,
+  0xd0ba, 0xd3f2, 0xd3fb, 0xd3f9, 0xd3f4, 0xd3f5, 0xd3fa, 0xd3fc,
+  0xb071, 0xd3f7, 0xd3f3, 0xb070, 0xb072, 0xd3f6, 0xd3fd, 0xd3f8,
+  0xb3a1, 0xd7f1, 0xd7e9, 0xd7ef, 0xd7f0, 0xb3a2, 0xd7e8, 0xd7ea,
+  0xd0b7, 0xd7ec, 0xd7ed, 0xd7eb, 0xb66c, 0xdc56, 0xebd4, 0xdc57,
+  0xdc54, 0xb3a3, 0xb66e, 0xdc53, 0xdc59, 0xdc58, 0xb66b, 0xdc5c,
+  0xdc52, 0xdc5b, 0xdc50, 0xdc5a, 0xdc55, 0xb66d, 0xe0aa, 0xe0a5,
+  0xe0ab, 0xe0a6, 0xe0a4, 0xe0a7, 0xb951, 0xe0a9, 0xe0a8, 0xb952,
+  0xbbc1, 0xbbc0, 0xe46e, 0xe471, 0xe469, 0xe46d, 0xbbc2, 0xe46c,
+  0xe46a, 0xe470, 0xe46b, 0xe468, 0xe46f, 0xe859, 0xbe48, 0xf14a,
+  0xe856, 0xe857, 0xe855, 0xdc51, 0xbe47, 0xe85a, 0xe854, 0xbe46,
+  0xbe49, 0xe858, 0xebd5, 0xbff3, 0xebd6, 0xebd7, 0xeec4, 0xc1dd,
+  0xf14b, 0xf14c, 0xf14d, 0xf35d, 0xf35c, 0xf4e2, 0xf4e1, 0xf65b,
+  0xf65c, 0xf65a, 0xf766, 0xc5b0, 0xa8bb, 0xadaa, 0xada9, 0xb075,
+  0xb074, 0xd440, 0xd441, 0xd3fe, 0x9fb2, 0xb073, 0xd7f5, 0xd7f6,
+  0xd7f2, 0xb3a4, 0xd7f3, 0x9fae, 0xd7f4, 0x9fb0, 0x89ad, 0xdc5f,
+  0xdc61, 0xdc5d, 0xdc60, 0xb66f, 0xdc5e, 0xb670, 0x906e, 0xdd73,
+  0xb955, 0xb954, 0xb953, 0xe0ac, 0xe0ad, 0x9e71, 0xe473, 0xe475,
+  0xbbc6, 0xbbc3, 0x9e4a, 0xbbc5, 0xbbc4, 0xe474, 0xe472, 0x9fdc,
+  0xe861, 0xe85e, 0xe85f, 0xbe4d, 0xe860, 0xe85b, 0xe85c, 0xbe4a,
+  0xbe4b, 0xe85d, 0xbe4c, 0x89ab, 0xebdb, 0x9fb8, 0xebdc, 0xebd9,
+  0xebda, 0xbff4, 0xebd8, 0xeec8, 0xeec5, 0xeec7, 0xc1e0, 0xeecb,
+  0xc1df, 0xeec9, 0xeecc, 0xeeca, 0xeec6, 0xc1de, 0xf14f, 0xf150,
+  0xf14e, 0x9070, 0xf152, 0xc2e5, 0xc2e6, 0xf35f, 0xc3e7, 0xf151,
+  0xf35e, 0xc3e6, 0xf4e5, 0xf4e6, 0xc4bf, 0xf4e4, 0x8b63, 0xf4e3,
+  0xf65d, 0xc548, 0x95dc, 0xf849, 0xf8c8, 0xf8c7, 0xc643, 0xc65d,
+  0xf8c9, 0xf971, 0x9071, 0xc66f, 0xa8bc, 0xaaf6, 0xb956, 0xc4c0,
+  0xa8bd, 0xadab, 0xb3a5, 0xb671, 0xc2e7, 0xaaf7, 0xd0c1, 0xd0c0,
+  0xd442, 0xfc5e, 0xb078, 0xb076, 0xb07a, 0xd444, 0xb079, 0xb077,
+  0x8949, 0xd443, 0xb3a8, 0xd7fc, 0x965b, 0xb3a7, 0xb3a9, 0xd842,
+  0xb3ab, 0xd7fe, 0xd840, 0xd7f7, 0xb3aa, 0xd843, 0xd7f9, 0xd7fa,
+  0xd7f8, 0xb3a6, 0x8c50, 0xd841, 0xd7fb, 0xd7fd, 0x94a6, 0xdc6d,
+  0x8fd5, 0xdc6c, 0xdc6a, 0xdc62, 0xdc71, 0xdc65, 0xdc6f, 0xdc76,
+  0xdc6e, 0xb679, 0x9e73, 0xb675, 0xdc63, 0xdc69, 0xb677, 0x9075,
+  0xdc68, 0xb678, 0xb67a, 0xdc6b, 0x99f7, 0xb672, 0xb673, 0xdc77,
+  0xdc75, 0xdc74, 0xdc66, 0xdc72, 0xb676, 0x8cbf, 0xb674, 0xdc73,
+  0xdc64, 0xdc67, 0xdc70, 0x99f9, 0x9663, 0x95b9, 0xe4ba, 0xe0b7,
+  0xe0b0, 0xe0c3, 0xe0cc, 0xe0b3, 0xb961, 0x94d4, 0xe0c0, 0xb957,
+  0xb959, 0xb965, 0xe0b1, 0xfcfa, 0xb95a, 0xb95c, 0xb966, 0xb95b,
+  0x9077, 0x90ab, 0xb964, 0xe0b9, 0xe0ae, 0xb962, 0xe0b8, 0xb95e,
+  0xe0ca, 0xb963, 0xe0c8, 0xe0bc, 0xe0c6, 0xb960, 0xe0af, 0xe0c9,
+  0xe0c4, 0x9d4d, 0xe0cb, 0xb958, 0x99fa, 0xb967, 0xb95d, 0x92e3,
+  0xe0b5, 0x97bb, 0xe0bd, 0xe0c1, 0x9078, 0xe0c5, 0xb95f, 0xe0b4,
+  0xe0b2, 0xe0be, 0x99fb, 0xe0bb, 0xe0ba, 0x97e0, 0xe0bf, 0xe0c2,
+  0xe0c7, 0xe478, 0x96dc, 0xbbc7, 0xe4a4, 0xe47a, 0xbbcc, 0xbbd0,
+  0xe4ad, 0xe4b5, 0xe4a6, 0xbbc8, 0x9ca8, 0xe4aa, 0xe0b6, 0x9772,
+  0xbbc9, 0xe4b1, 0xe4b6, 0xe4ae, 0x9440, 0xe4b0, 0xe4b9, 0xe4b2,
+  0xe47e, 0xe4a9, 0x92f2, 0xbbd1, 0xbbcd, 0xe47c, 0xe4ab, 0xbbcb,
+  0xe4a5, 0xbbca, 0xe4b3, 0xe4a2, 0xe479, 0xbbce, 0xe4b8, 0xe47b,
+  0xe4af, 0xe4ac, 0xe4a7, 0xe477, 0xe476, 0xe4a1, 0xe4b4, 0xbbcf,
+  0xe4b7, 0xe47d, 0xe4a3, 0xbe52, 0x99fd, 0x99fc, 0xbe5a, 0xbe55,
+  0xe8a4, 0xe8a1, 0xe867, 0xbe50, 0xf9d7, 0x964a, 0xbe4f, 0xbe56,
+  0x96d8, 0x99fe, 0xe865, 0xbe54, 0xe871, 0xe863, 0xe864, 0xbe4e,
+  0xe8a3, 0xbe58, 0xe874, 0xe879, 0xe873, 0xebee, 0xe86f, 0xe877,
+  0xe875, 0xe868, 0xe862, 0xe87d, 0xbe57, 0xe87e, 0x904b, 0xe878,
+  0xe86d, 0xe86b, 0xe866, 0xfa41, 0xe86e, 0xe87b, 0xe86a, 0xe87a,
+  0xe8a2, 0x9a40, 0xbe53, 0x975b, 0xe876, 0xe87c, 0xe872, 0xe86c,
+  0xbe51, 0x9a41, 0x91dd, 0xe4a8, 0xe870, 0xbe59, 0xe869, 0x93fc,
+  0x9a42, 0x9a43, 0x9659, 0xebf4, 0xbff7, 0xebf3, 0xebf0, 0xec44,
+  0xbffb, 0x9a44, 0xec41, 0xebf8, 0xec43, 0xebe9, 0xebf6, 0x9051,
+  0xbffd, 0xebe1, 0x94bf, 0xebdf, 0xec42, 0xec40, 0xebfe, 0xebed,
+  0xebec, 0xebe2, 0xc040, 0xebe8, 0xebf2, 0xebfd, 0xc043, 0xec45,
+  0xc1e8, 0xc045, 0xbffe, 0xebe6, 0xebef, 0xebde, 0xebe0, 0xbff5,
+  0xc042, 0xbffa, 0xebe7, 0xebf7, 0xebf1, 0xc041, 0xebdd, 0xc1e3,
+  0xebf9, 0xebfc, 0xbffc, 0x90a2, 0xebeb, 0xc044, 0xbff9, 0x9cab,
+  0x9776, 0xbff8, 0xebf5, 0xebfb, 0xbff6, 0xebe4, 0xebfa, 0xebe5,
+  0xfc55, 0xfe45, 0x94a8, 0x9a45, 0xfa4b, 0x9de1, 0xebea, 0xeed2,
+  0x96d9, 0xeed7, 0xc1e5, 0xc1e7, 0xeedd, 0xc1e1, 0xeeec, 0xeee3,
+  0xeed8, 0xeed9, 0xeee2, 0xc1ee, 0xeee1, 0xeed1, 0xeee0, 0xeed4,
+  0xeeed, 0xc1ed, 0xc1eb, 0xeed5, 0xeee8, 0x9774, 0xeeda, 0xeee7,
+  0xfdf5, 0xeee9, 0xeed0, 0xc1e6, 0x92e5, 0xeeea, 0x9645, 0x91da,
+  0xeede, 0x90a3, 0xc1ea, 0xeedb, 0xa05f, 0xc1ec, 0xeee4, 0x90af,
+  0x97bf, 0xc1e4, 0xeed6, 0xeee5, 0x914c, 0xeedf, 0xebe3, 0xeee6,
+  0xeed3, 0x967a, 0xc1e9, 0xeeeb, 0x91de, 0xc1e2, 0xeece, 0x9a46,
+  0xfeb0, 0x9779, 0x946c, 0xf160, 0xf159, 0xc2e9, 0xf154, 0xf163,
+  0xf15b, 0xeedc, 0x9858, 0xf165, 0xf155, 0xc2e8, 0xf15f, 0xc2ea,
+  0xc2f2, 0xc2f0, 0xf161, 0xc2f1, 0xf157, 0x9266, 0xf158, 0xf15d,
+  0xf162, 0x93fb, 0xeecd, 0xc2eb, 0xf16a, 0xf167, 0xf16b, 0xf15e,
+  0xf15a, 0xf168, 0xf36a, 0xf15c, 0xc2ee, 0x9a47, 0xc2ed, 0xeecf,
+  0xc2ef, 0xf164, 0xf166, 0xc2ec, 0xf169, 0xf153, 0xf156, 0x9749,
+  0x9748, 0x934a, 0x9ce2, 0xf373, 0xf363, 0xc3eb, 0xf371, 0x9264,
+  0xf361, 0xc3ec, 0xf36c, 0x91df, 0xf368, 0xc3f1, 0xf372, 0xf362,
+  0xf365, 0xc3e9, 0xf374, 0xfb79, 0xf36d, 0xf370, 0xc3ef, 0xc3f4,
+  0xc3f2, 0xf369, 0xf364, 0x96d7, 0xc3ed, 0xc3ee, 0xf360, 0xc3ea,
+  0x9343, 0xc3e8, 0xc3f0, 0xf36f, 0xc3f3, 0xf36b, 0xf375, 0xc3f5,
+  0xf367, 0xf36e, 0xfdcb, 0xfe7a, 0x91db, 0x8c6a, 0xf4f3, 0xf542,
+  0xf4f5, 0xf4fc, 0xf366, 0xf4fa, 0xf4e9, 0xf540, 0xc4c3, 0xf4ed,
+  0xf4fe, 0xf4f4, 0x97af, 0xc4c2, 0x95dd, 0xf544, 0xf4f6, 0x9348,
+  0xf4fb, 0xf4fd, 0xf4e7, 0xf541, 0xf4f2, 0xf4f7, 0xf4eb, 0xf4ef,
+  0xf543, 0xf4f9, 0xf4e8, 0xf4ec, 0xf4ee, 0xf4f8, 0x9a4b, 0xc4c1,
+  0xf4f1, 0xfc45, 0x9a4d, 0xf4ea, 0x91bc, 0x90e2, 0x90b4, 0x95e1,
+  0xf4f0, 0xf661, 0xf666, 0xc54f, 0xf668, 0x9a4e, 0xc549, 0xf664,
+  0xf66a, 0xc54e, 0xc54a, 0xc54b, 0xf660, 0xf667, 0xc54d, 0xf665,
+  0xc54c, 0xf65f, 0xf663, 0xf662, 0x9a4f, 0xf65e, 0xf669, 0xfe40,
+  0xfe43, 0xc5b1, 0xf76d, 0xf770, 0xf76c, 0xf76e, 0xf76f, 0xf769,
+  0xf76a, 0xf767, 0x96dd, 0xf76b, 0xf768, 0xc5b2, 0xc5b3, 0x9a51,
+  0xf84b, 0xf84d, 0x96a7, 0x90b0, 0xf84c, 0xf84e, 0xc5e0, 0xf84a,
+  0xc5df, 0xc5e1, 0x9c4e, 0x9443, 0xf8cb, 0xf8cc, 0xc644, 0xf8ca,
+  0x8eba, 0xf953, 0xf952, 0xf954, 0xc65f, 0xf955, 0xc65e, 0xf956,
+  0xf972, 0xf975, 0xf974, 0xc668, 0xf973, 0x9a52, 0xfcc1, 0xc672,
+  0xc670, 0xc671, 0xc677, 0xf9c0, 0xf9c1, 0xf9bf, 0xf9c9, 0x8be9,
+  0x9caf, 0x8bfd, 0x9abc, 0x9ab8, 0x9aae, 0x9aa7, 0x9a53, 0x9d74,
+  0xaaf8, 0x8bea, 0xd844, 0xdc78, 0xe8a5, 0xf376, 0x8beb, 0xaaf9,
+  0xadac, 0xb07b, 0x90b2, 0xd845, 0xd846, 0xb3ac, 0xb67d, 0xdc7a,
+  0xdc79, 0xb6a3, 0xb67c, 0xdc7b, 0xb67e, 0xb6a2, 0xb6a1, 0xb67b,
+  0x95e9, 0x95e8, 0xb968, 0x95e6, 0xe0d0, 0xe0ce, 0xe0cf, 0xe0cd,
+  0x90b5, 0xbbd2, 0x9a54, 0xbbd5, 0xbbd7, 0xbbd6, 0x90b3, 0x95e7,
+  0xbbd3, 0xbbd4, 0x8b50, 0xe8a7, 0xe8a6, 0xbe5b, 0xe8a8, 0xe8a9,
+  0xbe5c, 0xec4d, 0xec4b, 0xeef3, 0xec49, 0xec4a, 0xc046, 0xec46,
+  0xec4e, 0xec48, 0xec4c, 0xeeef, 0xeef1, 0xeef2, 0xc1f3, 0xeeee,
+  0xc1f2, 0xeef0, 0xc1ef, 0xc1f0, 0xc1f1, 0xec47, 0xc2f5, 0xf16e,
+  0xf16c, 0xf16d, 0xc2f3, 0xc2f6, 0xc2f4, 0xf377, 0xf378, 0xc3f6,
+  0xf545, 0xf547, 0xf546, 0xc4c4, 0xc550, 0xf66d, 0xf66c, 0xf66b,
+  0x8bec, 0x9a56, 0xaafa, 0x8bfb, 0xc9aa, 0xca58, 0xa6e9, 0xca56,
+  0xca59, 0xca57, 0xcbae, 0xa8c1, 0xa8c2, 0xcbb0, 0xa8bf, 0xcbaf,
+  0xcbad, 0xa8c0, 0xa8be, 0x9a57, 0xa0aa, 0xcdd8, 0xcddb, 0xaafd,
+  0xcdda, 0xcdd9, 0xaafc, 0xaafb, 0x9fa6, 0xab40, 0xcddc, 0xaafe,
+  0x99cc, 0xd0c6, 0xadae, 0xadaf, 0xadb0, 0xd0c7, 0xd0c3, 0xadad,
+  0xd0c4, 0xd0c5, 0xd0c2, 0x9c59, 0xb0a4, 0xb0a1, 0xd445, 0xb0a2,
+  0xb0a5, 0xd446, 0xb07e, 0xb07c, 0xb07d, 0xb0a3, 0x99b5, 0xb3ad,
+  0xd849, 0xb3b5, 0xd848, 0xd84b, 0xb3b1, 0xd84a, 0xb6ab, 0xb3af,
+  0xb3b2, 0xb3ae, 0xb3b3, 0xb3b4, 0xb3b0, 0x90be, 0xd847, 0xb6a7,
+  0xdc7d, 0xdca3, 0x9faf, 0xdca2, 0xb6ac, 0xb6a8, 0xb6a9, 0xdc7c,
+  0xdc7e, 0xdca1, 0xb6a4, 0xb6a6, 0xb6aa, 0xb6a5, 0x95f2, 0xe0d3,
+  0xe0d1, 0xe0d2, 0xb96a, 0xb96b, 0x90bf, 0xe0d4, 0xb969, 0xbbd8,
+  0xbbda, 0xbbd9, 0xe4bb, 0xe4bc, 0xe8ab, 0x90c1, 0xe8aa, 0xfee4,
+  0xc047, 0xc048, 0xec4f, 0xc049, 0xeef6, 0xeef4, 0xeef5, 0xc1f4,
+  0xf16f, 0xc3f7, 0x90c4, 0xc1f5, 0xab41, 0xb0a6, 0xd447, 0x90c7,
+  0xd84c, 0xb3b6, 0xb6ad, 0xdca4, 0xdca6, 0xb6af, 0xb6ae, 0xb6b0,
+  0xb6b1, 0xdca5, 0xb96e, 0xb96f, 0xb96d, 0xbbdb, 0xb96c, 0xe0d5,
+  0xbbdc, 0xe8ac, 0xec50, 0xc04a, 0xc1f6, 0xf170, 0xf174, 0xc2f9,
+  0xf171, 0xc2fa, 0xc2f8, 0xf175, 0xc2fb, 0xf173, 0xf379, 0xc2f7,
+  0xc3f8, 0xf8cd, 0xab42, 0xb3b8, 0xb3b7, 0xb6b2, 0xdca8, 0xdca7,
+  0xb6b3, 0x92e4, 0xe0d9, 0xb973, 0xb970, 0xe0d8, 0xb972, 0xe0d6,
+  0xb971, 0xe0d7, 0xe4bd, 0xbbdd, 0xe8af, 0x9f52, 0xbe5d, 0xe8ad,
+  0xbe5e, 0xbe5f, 0xe8ae, 0xbe60, 0xec51, 0xc04e, 0xc04b, 0xc050,
+  0xec53, 0xc04c, 0xec52, 0xc04f, 0xc04d, 0xeef9, 0xeefb, 0x90db,
+  0xc1f7, 0xeefa, 0xc1f8, 0xeef8, 0xeef7, 0xa066, 0xf177, 0xf176,
+  0xc2fc, 0xf178, 0xf37e, 0xc3fa, 0xf37d, 0xf37a, 0xc3f9, 0xf37b,
+  0xf37c, 0xf548, 0xf549, 0xc4c5, 0x90d2, 0xc553, 0xf66e, 0x90d4,
+  0xc551, 0xc552, 0xf66f, 0xc5b4, 0xc5b5, 0xf771, 0x9a5b, 0x95fd,
+  0xc645, 0xf8cf, 0xc647, 0xf8ce, 0xf8d0, 0xc646, 0xf957, 0xf9ad,
+  0x8bc4, 0xab43, 0x8c66, 0xb974, 0x90de, 0xe4be, 0xe8b0, 0xc051,
+  0xc052, 0x9ce4, 0xab44, 0x90e1, 0xbe61, 0xc3fb, 0xadb1, 0xc053,
+  0xc5e2, 0xadb2, 0xd84d, 0xdca9, 0x9e46, 0xdcab, 0xdcaa, 0x9651,
+  0xe0dd, 0xe0da, 0xb975, 0xb976, 0xe0db, 0xe0dc, 0xe4c0, 0xe4c5,
+  0xbbde, 0xe4bf, 0xe4c1, 0xe4c8, 0xe4c3, 0xe4c7, 0xe4c4, 0xe4c2,
+  0xe4c6, 0xbbdf, 0xfb58, 0xe8b3, 0x90e6, 0xe8b1, 0xbe63, 0xbe62,
+  0xe8b2, 0xbe64, 0xec56, 0xec55, 0xc054, 0xec54, 0xeefc, 0x9650,
+  0xeefe, 0xef41, 0xef40, 0x90e7, 0xc1f9, 0xeefd, 0xf1a1, 0xc2fd,
+  0xf17d, 0xf1a2, 0xc2fe, 0xf17b, 0xf17e, 0xf17c, 0xf179, 0xc340,
+  0xf17a, 0x90e8, 0x9a5d, 0xf3a1, 0x9f7a, 0xf3a3, 0xf3a2, 0x9b5c,
+  0xf54a, 0x9f7c, 0xf54b, 0xfc52, 0x90e9, 0xf670, 0x90ea, 0xc5b7,
+  0x9a5e, 0xc5b6, 0xf84f, 0xf850, 0xc648, 0xf8d1, 0x9f76, 0xc669,
+  0xadb3, 0xb6b4, 0xe4ca, 0xe4c9, 0xe8b5, 0xe8b4, 0x90eb, 0xc1fa,
+  0xef43, 0xef42, 0xf1a5, 0xf1a3, 0xf1a6, 0xf1a4, 0xc3fc, 0xf3a4,
+  0xf3a5, 0xf3a6, 0x90ec, 0xf671, 0xf772, 0xf8d2, 0x8bee, 0xadb4,
+  0x90ee, 0xec57, 0xef44, 0x91c6, 0xadb5, 0x90f2, 0xbbe0, 0xec58,
+  0xc341, 0xf1a7, 0xc3fd, 0xf54c, 0xf54d, 0xc554, 0xf851, 0xadb6,
+  0xb3bb, 0xb3bc, 0xd84e, 0xb6b5, 0xb6b6, 0xdcac, 0xb6b7, 0xb97a,
+  0xb97c, 0xe0df, 0xe0e0, 0xe0de, 0xb977, 0xb978, 0xb97b, 0xb979,
+  0xfcbc, 0x8a74, 0xe4cb, 0xbbe1, 0xbbe2, 0xe8bc, 0xbe67, 0xe8b7,
+  0xe8b6, 0x9657, 0xe8bb, 0xbe65, 0x9cef, 0xc05b, 0xe8b8, 0xe8bd,
+  0xe8ba, 0xe8b9, 0xbe66, 0xc059, 0x9fdf, 0xec5a, 0xc055, 0xec5b,
+  0x90f7, 0x90f6, 0xec59, 0xc058, 0xc056, 0xc05a, 0xc057, 0xef45,
+  0xef4a, 0xef46, 0xef49, 0xc1fb, 0x9b5e, 0xedd4, 0xef48, 0xef47,
+  0x90f8, 0xc344, 0xc342, 0xc345, 0xc343, 0xf1a8, 0xf1a9, 0xf1aa,
+  0xc346, 0xf3aa, 0xc440, 0xf3a8, 0xc441, 0xf3a7, 0xf3a9, 0xc3fe,
+  0xf551, 0xf54e, 0xf54f, 0xf550, 0xf672, 0xc556, 0x90f9, 0xc555,
+  0x8cc9, 0xf774, 0xf773, 0xc5b8, 0xfa6a, 0xc5e3, 0xc649, 0xc660,
+  0xf958, 0xf9ae, 0xf9af, 0x8bef, 0xadb7, 0xdcad, 0xe0e1, 0xe4cc,
+  0xe4cd, 0xbbe3, 0xbbe4, 0xe8be, 0xbe68, 0x9fe0, 0xc1fc, 0x9142,
+  0xf1ab, 0x9a62, 0xc347, 0xf3ad, 0xc442, 0xf3ac, 0xf3ae, 0xf3ab,
+  0xf675, 0xf552, 0xf553, 0x9569, 0xc4c6, 0xf674, 0x9144, 0x9143,
+  0xf673, 0x9141, 0xf775, 0xf9b0, 0x8bf0, 0xadb8, 0x9660, 0x8bf1,
+  0xadb9, 0x99f6, 0x9149, 0xb0a7, 0xd448, 0xd84f, 0x914a, 0xb6b8,
+  0xb6bb, 0xb6b9, 0xdcae, 0x914b, 0xb6bd, 0xb6ba, 0x9a64, 0xb6bc,
+  0xb97e, 0x8abf, 0xe0e2, 0xe0e3, 0xe8c0, 0xb97d, 0xb9a1, 0xb9a2,
+  0xe4cf, 0xe4ce, 0xbbe5, 0xbbe6, 0xe4d0, 0xe8bf, 0xbbe8, 0xbe69,
+  0xbbe7, 0x9a66, 0xc05c, 0xe8c1, 0xbe6b, 0xbe6a, 0xe8c2, 0xe8c5,
+  0xe8c3, 0xe8c4, 0xbe6c, 0x9a67, 0xc061, 0xc05f, 0x9a69, 0xc05e,
+  0xec5d, 0xc060, 0xec5c, 0xef4b, 0xec5e, 0xc05d, 0xec5f, 0xef4e,
+  0xef4c, 0xef4d, 0xef52, 0xc34b, 0xef51, 0xef54, 0xef53, 0xef50,
+  0xef4f, 0xc1fd, 0x9a6a, 0x9652, 0x914d, 0xf1ae, 0x9666, 0xf1ad,
+  0xc34a, 0xc348, 0xc349, 0x9f7b, 0xf1ac, 0x9a6b, 0xf3b1, 0xc443,
+  0xf3b0, 0xf3af, 0xc444, 0xa06c, 0xf558, 0xf557, 0x9667, 0xf555,
+  0xf554, 0xc4c8, 0xc4c7, 0xf559, 0xf776, 0xc5b9, 0xf677, 0xc557,
+  0xf676, 0xf556, 0xf777, 0xc5e4, 0x9a6c, 0xc661, 0xf959, 0xf9b1,
+  0x9a6d, 0x8bf2, 0xadba, 0xd850, 0xef55, 0xadbb, 0x966a, 0xe4d2,
+  0xe4d1, 0xec60, 0xef57, 0xef56, 0xfcea, 0xc34c, 0xf3b2, 0xf3b3,
+  0xc4c9, 0x966c, 0xf9b2, 0xb0a8, 0xb6bf, 0xb6be, 0xe0e4, 0xe0e6,
+  0xb9a4, 0xe0e5, 0xb9a3, 0xb9a5, 0xe0e7, 0x91c4, 0xe4d4, 0xe4d6,
+  0xe4d5, 0x9677, 0xe4d8, 0xbbe9, 0xe4d7, 0xe4d3, 0x99f4, 0x9a6f,
+  0xe4d9, 0xe8cc, 0xe8cf, 0xe8d1, 0xe8c7, 0xe8cb, 0xe8c8, 0xbe6e,
+  0xbe71, 0xbe73, 0xe8c9, 0xe8ca, 0xbe72, 0xe8cd, 0xe8d0, 0xe8ce,
+  0xbe74, 0x9fab, 0xbe70, 0xe8c6, 0xbe6d, 0xbe6f, 0x8cbe, 0x8ec1,
+  0xc063, 0xec66, 0xec64, 0xec63, 0x9555, 0xec69, 0xec68, 0xec67,
+  0xec62, 0xc062, 0xec61, 0xec65, 0xc064, 0xef5a, 0x9152, 0xef5e,
+  0xef5b, 0xef5d, 0xef5c, 0xef59, 0xef5f, 0xef62, 0xef60, 0xef61,
+  0xc240, 0xc1fe, 0xef58, 0xef63, 0xf1b3, 0xf1b6, 0xf1b8, 0xf1b7,
+  0xf1b1, 0xf1b5, 0xf1b0, 0x9153, 0xf1b2, 0xc34d, 0xf1af, 0x9155,
+  0xf1b4, 0xf3c0, 0xf3b5, 0xc445, 0xc446, 0xf3b4, 0xf3b9, 0xf3bf,
+  0xf3b7, 0xf3be, 0x955d, 0xf3bb, 0x9671, 0xf3ba, 0xf3bd, 0xf3b8,
+  0xf3b6, 0x9c6d, 0xf3bc, 0xf560, 0xf55e, 0xc4ca, 0xf55d, 0xf563,
+  0xf561, 0x9673, 0xc4cb, 0xf55c, 0xf55a, 0xf55b, 0xc4cd, 0xf55f,
+  0xc4cc, 0xf562, 0xf678, 0xf67e, 0x9154, 0x9a71, 0xf679, 0xc55b,
+  0xf6a1, 0xc55a, 0xf67d, 0xf67c, 0xc559, 0xf67b, 0xc558, 0xf67a,
+  0xf77d, 0xf7a1, 0xf77e, 0xf77b, 0xc5bb, 0xf778, 0xf77c, 0xf7a3,
+  0xf7a2, 0xf779, 0xf77a, 0xc5ba, 0xf852, 0xc5e7, 0x9156, 0xf853,
+  0xc5e5, 0xc5e6, 0x966d, 0xf8d3, 0xc64a, 0xf976, 0xc66a, 0x9557,
+  0xf9b3, 0xc66b, 0xf9b4, 0xf9b5, 0xf9c3, 0xf9c2, 0xc67a, 0xf9cd,
+  0x89c6, 0x89c7, 0xb0a9, 0xe0e9, 0xe0e8, 0xbbea, 0xbbeb, 0xe4da,
+  0x8a6a, 0xe8d2, 0xec6c, 0x8b57, 0xbe75, 0xc065, 0xec6a, 0x9fe1,
+  0xec6d, 0xc066, 0x9b5f, 0xef64, 0xec6b, 0xf1b9, 0xc34e, 0xf3c1,
+  0xf566, 0xf564, 0xf565, 0xf6a2, 0xc55c, 0xf7a4, 0xc5ea, 0xc5bc,
+  0xc5e8, 0xc5e9, 0xf8d4, 0xc662, 0xa05d, 0xb0aa, 0xf1ba, 0xd449,
+  0x915b, 0xb9a6, 0x915c, 0xe4db, 0xbbec, 0xe4dc, 0xe8d4, 0xe8d3,
+  0xc068, 0xbe76, 0xbe77, 0xe8d7, 0xe8d6, 0xe8d5, 0x915e, 0xec6e,
+  0xec71, 0xec70, 0xec6f, 0xc067, 0xef68, 0xef66, 0xef65, 0x9f5c,
+  0xef67, 0x9f57, 0xc34f, 0xf1bc, 0xf1bd, 0xc350, 0xf1bb, 0x9f65,
+  0xf3c3, 0xf3c2, 0xf3c5, 0xc447, 0xf3c4, 0x9a72, 0xf567, 0xf569,
+  0xf568, 0x9160, 0xf6a3, 0xf6a6, 0xf6a4, 0xf6a5, 0xf7a5, 0xc5bd,
+  0xf854, 0xf855, 0xf856, 0xc64b, 0xc663, 0xf9b6, 0xb0ab, 0xbe78,
+  0xc069, 0xf1be, 0x9f5e, 0xf7a6, 0x9161, 0xf9c4, 0xd44a, 0xc67b,
+  0xb0ac, 0xec72, 0x9164, 0xf1bf, 0xf3c6, 0x9f41, 0xf6a7, 0xf7a7,
+  0xb0ad, 0xe4dd, 0xe4de, 0x9169, 0xbbed, 0xbbee, 0xe8d9, 0xbe7a,
+  0xbe79, 0xe8d8, 0xef69, 0xf1c0, 0xf1c2, 0xf1c1, 0xc353, 0xc352,
+  0xc351, 0x9168, 0xc55e, 0xf6a8, 0xc55d, 0xf7a9, 0xf7a8, 0xc64c,
+  0xf8d5, 0xb3bd, 0xe0ea, 0xe4e1, 0xe4df, 0xe4e0, 0xe8e2, 0xe8dd,
+  0xe8da, 0xe8e1, 0x9a74, 0xe8e3, 0xbe7c, 0xe8e0, 0xe8dc, 0xe8db,
+  0xe8df, 0xe8de, 0xbe7b, 0xec7d, 0xec78, 0xec76, 0xeca1, 0xec77,
+  0x96b2, 0xec73, 0x9a75, 0xec79, 0xfda5, 0xec74, 0xef72, 0xec75,
+  0xeca2, 0x9ee9, 0x8bba, 0x916d, 0xa060, 0xec7c, 0xc06a, 0xec7b,
+  0xec7a, 0xec7e, 0x9fde, 0xef6a, 0xef6d, 0x9fc3, 0xef6c, 0x96b5,
+  0xef74, 0xef6f, 0xef73, 0xef71, 0xef70, 0xef6e, 0xef6b, 0xc243,
+  0xc242, 0xc244, 0xc241, 0xef75, 0xa067, 0xf1c8, 0xf1cb, 0xf1c9,
+  0xf1cd, 0xf1ce, 0xf1c6, 0xc358, 0xf1c7, 0xf1c5, 0xf1cc, 0xf1c4,
+  0xf1c3, 0xc357, 0xc355, 0xc354, 0x96b3, 0xf1ca, 0xf3cf, 0xf3d5,
+  0xc44a, 0xf3d0, 0xf3d3, 0xf3d7, 0xc44b, 0xf3d2, 0x9a76, 0xf3ca,
+  0xf3c9, 0xf3d6, 0xf3cd, 0xf3cb, 0xf3d4, 0xf3cc, 0xc449, 0xc448,
+  0x95d5, 0xf3c7, 0xf3c8, 0xf3d1, 0x9eca, 0xf3ce, 0x9a77, 0x9a78,
+  0xf56c, 0xf56f, 0xc356, 0x9170, 0x916f, 0xf56d, 0xf573, 0xf571,
+  0xf56b, 0xf576, 0x9fa3, 0xf56a, 0x9171, 0xc4cf, 0xf572, 0x96b1,
+  0xf56e, 0xc4ce, 0xf575, 0x9f63, 0xf574, 0x9f67, 0xf6ab, 0xf6aa,
+  0x8bb9, 0x9a7a, 0xf6b1, 0xf6ad, 0xf6b0, 0xc560, 0x8b56, 0xf6ae,
+  0xf6af, 0xf6a9, 0xf6ac, 0xc55f, 0x9ada, 0xc5bf, 0xf7b4, 0xf7af,
+  0xf7b3, 0x96b0, 0xf7b6, 0xf7b2, 0xf7ae, 0x9a7e, 0xc5c1, 0xf7b1,
+  0xf7b5, 0xc5c0, 0xf7ac, 0xf570, 0xf7b0, 0xf7ad, 0x9dde, 0xf7aa,
+  0xf7ab, 0xc5be, 0xf85a, 0xf85c, 0xf85f, 0xf85b, 0xf860, 0x96ad,
+  0xf859, 0xf857, 0x96ae, 0xc5eb, 0xf85d, 0xc5ed, 0xc5ec, 0xf858,
+  0xf85e, 0x9ea1, 0xf8da, 0xc64d, 0xf8db, 0xf8d9, 0xf8d6, 0xf8d8,
+  0xf8d7, 0xf95a, 0xf95c, 0xf95b, 0xf979, 0x9e50, 0xf978, 0xf977,
+  0xf97a, 0xc673, 0xc674, 0xf9ca, 0xf9ce, 0x96af, 0x8bf4, 0xb3be,
+  0xdcaf, 0xe0ed, 0xb9a7, 0xe0eb, 0xe0ec, 0xe4e2, 0xe4e3, 0xbbf1,
+  0xbbef, 0xe4e4, 0xbbf0, 0xe8e8, 0xe8eb, 0xe8e5, 0xe8ec, 0xe8e4,
+  0xe8e6, 0xe8e7, 0xe8ea, 0x9fa4, 0xbea1, 0xe8ef, 0xe8ee, 0xbe7d,
+  0xe8e9, 0xe8ed, 0xbe7e, 0x96bd, 0xecac, 0xc06f, 0xeca7, 0xc06b,
+  0x96f4, 0xeca4, 0xecaa, 0xecad, 0xc070, 0xeca9, 0xeca6, 0xecae,
+  0xeca5, 0x96b8, 0xecab, 0xc06c, 0xeca3, 0xc06d, 0xc06e, 0xeca8,
+  0xefa9, 0xef7a, 0xef7b, 0xef7e, 0xef7c, 0xef76, 0xfaa1, 0xef79,
+  0xefa5, 0xef7d, 0x91a7, 0xc245, 0xefa7, 0xefa4, 0xc246, 0xefa6,
+  0xef77, 0xefa2, 0xefa3, 0xa05e, 0xefa1, 0x9a7d, 0xf1d2, 0xf1d4,
+  0xf1d7, 0x8948, 0xf1d1, 0x9eb1, 0xc359, 0xf1d9, 0xf1d0, 0xf1da,
+  0xf1d6, 0xf1d8, 0xf1dc, 0xf1d5, 0xf1dd, 0xf1d3, 0xf1cf, 0xc35a,
+  0x9ddb, 0xf1db, 0xc35b, 0xc44d, 0xef78, 0xf3f1, 0xf3e8, 0xc44f,
+  0xf3e4, 0xc450, 0x95bf, 0x8a73, 0xf3ed, 0xf3e7, 0xf3dd, 0xc44e,
+  0xf3ea, 0xf3e5, 0xf3e6, 0xf3d8, 0xf3df, 0xf3ee, 0xf3eb, 0x9efe,
+  0xf3e3, 0x917a, 0xf3ef, 0xf3de, 0xf3d9, 0xf3ec, 0x917b, 0xf3db,
+  0xf3e9, 0xf3e0, 0xf3f0, 0xf3dc, 0xc44c, 0xf3da, 0xf3e1, 0xf3e2,
+  0xf57d, 0xf57b, 0x9aa3, 0xf5a2, 0xf5ae, 0xf5a5, 0xf57c, 0xf578,
+  0xf5a7, 0xf57e, 0xf5a3, 0xf57a, 0xf5aa, 0xf577, 0xf5a1, 0xf5a6,
+  0xf5a8, 0xf5ab, 0xf579, 0x96c2, 0xf5af, 0xf5b0, 0xf5a9, 0xf5ad,
+  0xf5a4, 0x9f77, 0xf6c1, 0xf6c4, 0xc561, 0xf6c3, 0xf6c8, 0xf6c6,
+  0xc562, 0xf6bd, 0xf6b3, 0xf6b2, 0xc564, 0xf6bf, 0xf6c0, 0xf6bc,
+  0xf6b4, 0x9aa4, 0xf6b9, 0xf5ac, 0x9aa5, 0xf6b5, 0xc563, 0xf6bb,
+  0x91a1, 0xf6ba, 0xf6b6, 0xf6c2, 0x89b8, 0xf6b7, 0xf7bb, 0xf6c5,
+  0xf6c7, 0xf6be, 0xf6b8, 0xf7bc, 0xf7be, 0xf7b8, 0xc5c2, 0x9173,
+  0xf7c5, 0xf7c3, 0xc5c3, 0xf7c2, 0xf7c1, 0xf7ba, 0xf7b7, 0xf7bd,
+  0xf7c6, 0xf7b9, 0xf7bf, 0xf869, 0xf86e, 0xf864, 0xf867, 0xc5ee,
+  0xf86b, 0xf872, 0xf7c0, 0xf865, 0xf86f, 0xf873, 0xf86a, 0xf863,
+  0xf86d, 0xf86c, 0xf871, 0xf870, 0xf7c4, 0xf868, 0xf862, 0xf866,
+  0xc64e, 0xc64f, 0xf861, 0x9aa6, 0xf8e6, 0xf8dd, 0xf8e5, 0xf8e2,
+  0xf8e3, 0xf8dc, 0xf8df, 0xf8e7, 0xf8e1, 0xf8e0, 0xf8de, 0xf8e4,
+  0x89bd, 0xf95d, 0x89b9, 0xf95e, 0x917d, 0xf960, 0xf95f, 0xf962,
+  0xf961, 0xf97c, 0xf97b, 0xf9b7, 0xf9b8, 0x96bb, 0xf9c5, 0xc678,
+  0xc67c, 0x9ff2, 0xf9cf, 0xc67d, 0x8bf5, 0xb3bf, 0xc4d0, 0xf6c9,
+  0x9aa9, 0xc650, 0xc651, 0xb3c0, 0xe0ee, 0x9f54, 0xb9a8, 0xe8f0,
+  0x9fe3, 0x9eed, 0xecb0, 0xecb1, 0xecaf, 0xefab, 0xefaa, 0xc247,
+  0xf1df, 0xefac, 0xf1de, 0x91aa, 0xf3f3, 0xc451, 0xc453, 0xf3f2,
+  0x91ab, 0xa070, 0xc452, 0x9f6d, 0xf5b1, 0xf5b3, 0xf5b2, 0xf6ca,
+  0xc565, 0x91ac, 0xc5ef, 0xf8e8, 0xf963, 0x91ad, 0xf9d2, 0xb3c1,
+  0xa0fd, 0xe4e5, 0x9fe2, 0xbea2, 0x91af, 0x9e41, 0x9aaa, 0xecb3,
+  0xecb2, 0x91b0, 0xefad, 0x9aab, 0xc454, 0xc4d1, 0xf7c7, 0xf9cb,
+  0xb3c2, 0xbbf2, 0x9aac, 0xbea3, 0x9a4a, 0xf3f4, 0x91b2, 0xf874,
+  0xb6c0, 0x8bf6, 0x9aad, 0x89b6, 0xefae, 0xc664, 0xb6c1, 0xbea4,
+  0xc248, 0xf875, 0xb6c2, 0xe8f1, 0xc072, 0xecb4, 0xecb5, 0xc071,
+  0xefaf, 0xc24c, 0xc24a, 0xc24b, 0xc249, 0xf1e0, 0xc35c, 0x9aaf,
+  0xf5b5, 0xf5b4, 0xf5b7, 0xf5b6, 0xc4d2, 0xf6cb, 0xf6cd, 0xf6cc,
+  0xc566, 0xf7c8, 0x9ab0, 0xf876, 0xf877, 0xc5f0, 0xf964, 0xf97d,
+  0xc675, 0x9ab1, 0xdcb0, 0xecb6, 0xefb0, 0xf3f5, 0xe0ef, 0x9aa1,
+  0xefb1, 0xf1e2, 0xf1e1, 0x91b9, 0xf878, 0xc652, 0x91ba, 0xf965,
+  0xf97e, 0xb9a9, 0xe8f2, 0xe8f3, 0xecb7, 0xb9aa, 0xc35d, 0xf1e3,
+  0x91be, 0xf6cf, 0xc567, 0xf6d0, 0xf6ce, 0xf879, 0xf8e9, 0xb9ab,
+  0xefb4, 0xefb3, 0xefb2, 0xf1e4, 0xa041, 0x8bb7, 0xf1e8, 0xf1e7,
+  0xf1e6, 0xf1e5, 0xc35e, 0xf3f6, 0xf5b9, 0xc4d3, 0xf5b8, 0xf6d1,
+  0xf7cb, 0xf7ca, 0xc5c4, 0xf7c9, 0xf87c, 0xf87b, 0xf87a, 0x91c0,
+  0xbbf3, 0xecb8, 0xc24d, 0xf3f7, 0xf3f8, 0xf7cc, 0xf87d, 0x9ab3,
+  0x91c3, 0xf8ea, 0xf966, 0xf9b9, 0xf9d4, 0xbbf4, 0xc24e, 0xf1e9,
+  0xf3f9, 0xf6d2, 0xf87e, 0xa0fc, 0xbea6, 0x9fee, 0xefb5, 0xf1ea,
+  0xf3fa, 0xf3fb, 0xf3fc, 0xf5be, 0x9f69, 0xf5ba, 0xc568, 0xf5bd,
+  0xf5bc, 0xc4d4, 0xf5bb, 0xc4d6, 0x91c8, 0xc4d5, 0xf6d4, 0xf6d3,
+  0xc569, 0xc56a, 0x91c9, 0xc5c6, 0xf7cd, 0xc5c5, 0xf8a3, 0xf8a4,
+  0xf8a2, 0xf8a1, 0xc654, 0xf8eb, 0xf8ec, 0xf8ed, 0xc653, 0xf967,
+  0xf96a, 0xf969, 0xf968, 0xf9d3, 0x8de6, 0xc073, 0x91cb, 0xc365,
+  0xf5bf, 0xf6d5, 0xc5c7, 0xf7ce, 0xf9d5, 0x89c8, 0xc074, 0x8daa,
+  0xefb6, 0xf7cf, 0xf9a1, 0x9fdd, 0xfa40, 0xfa41, 0xfa42, 0xfa43,
+  0xfa44, 0xfa45, 0xfa46, 0xfa47, 0xfa48, 0xfa49, 0xfa4a, 0xfa4b,
+  0xfa4c, 0xfa4d, 0xfa4e, 0xfa4f, 0xfa50, 0xfa51, 0xfa52, 0xfa53,
+  0xfa54, 0xfa55, 0xfa56, 0xfa57, 0xfa58, 0xfa59, 0xfa5a, 0xfa5b,
+  0xfa5c, 0xfa5d, 0xfa5e, 0xadc5, 0xfa60, 0xfa61, 0xfa62, 0xfa63,
+  0xfa64, 0xfa65, 0xb0b0, 0xfa67, 0xfa68, 0xfa69, 0xfa6a, 0xfa6b,
+  0xfa6c, 0xfa6d, 0xfa6e, 0xfa6f, 0xfa70, 0xfa71, 0xfa72, 0xfa73,
+  0xfa74, 0xfa75, 0xfa76, 0xfa77, 0xfa78, 0xfa79, 0xfa7a, 0xfa7b,
+  0xfa7c, 0xfa7d, 0xfa7e, 0xfaa1, 0xfaa2, 0xfaa3, 0xfaa4, 0xfaa5,
+  0xfaa6, 0xfaa7, 0xfaa8, 0xfaa9, 0xfaaa, 0xfaab, 0xfaac, 0xfaad,
+  0xfaae, 0xfaaf, 0xfab0, 0xfab1, 0xfab2, 0xfab3, 0xfab4, 0xfab5,
+  0xfab6, 0xfab7, 0xfab8, 0xfab9, 0xfaba, 0xfabb, 0xfabc, 0xa55d,
+  0xfabe, 0xfabf, 0xfac0, 0xfac1, 0xfac2, 0xfac3, 0xfac4, 0xa2cd,
+  0xfac6, 0xfac7, 0xfac8, 0xfac9, 0xfaca, 0xfacb, 0xfacc, 0xfacd,
+  0xface, 0xfacf, 0xfad0, 0xfad1, 0xfad2, 0xfad3, 0xfad4, 0xadeb,
+  0xfad6, 0xfad7, 0xfad8, 0xfad9, 0xfada, 0xfadb, 0xfadc, 0xfadd,
+  0xfade, 0xfadf, 0xfae0, 0xfae1, 0xfae2, 0xfae3, 0xfae4, 0xfae5,
+  0xfae6, 0xfae7, 0xfae8, 0xfae9, 0xfaea, 0xfaeb, 0xfaec, 0xfaed,
+  0xfaee, 0xfaef, 0xfaf0, 0xfaf1, 0xfaf2, 0xfaf3, 0xfaf4, 0xfaf5,
+  0xfaf6, 0xfaf7, 0xfaf8, 0xfaf9, 0xfafa, 0xfafb, 0xfafc, 0xfafd,
+  0xfafe, 0xfb40, 0xfb41, 0xfb42, 0xfb43, 0xfb44, 0xfb45, 0xfb46,
+  0xfb47, 0x9def, 0xfb49, 0xfb4a, 0xfb4b, 0xfb4c, 0xfb4d, 0xfb4e,
+  0xfb4f, 0xfb50, 0xfb51, 0xfb52, 0xfb53, 0xfb54, 0xfb55, 0xfb56,
+  0xfb57, 0xfb58, 0xfb59, 0xfb5a, 0xfb5b, 0xfb5c, 0xfb5d, 0xfb5e,
+  0xfb5f, 0xfb60, 0xfb61, 0xfb62, 0xfb63, 0xfb64, 0xfb65, 0xfb66,
+  0xfb67, 0xfb68, 0xfb69, 0xfb6a, 0xfb6b, 0xfb6c, 0xfb6d, 0xfb6e,
+  0xfb6f, 0xfb70, 0xfb71, 0xfb72, 0xfb73, 0xfb74, 0xfb75, 0xfb76,
+  0xfb77, 0xfb78, 0xfb79, 0xfb7a, 0xfb7b, 0xfb7c, 0xfb7d, 0xfb7e,
+  0xfba1, 0xfba2, 0xfba3, 0xfba4, 0xfba5, 0xfba6, 0xfba7, 0xfba8,
+  0xfba9, 0xfbaa, 0xfbab, 0xfbac, 0xfbad, 0xfbae, 0xfbaf, 0xfbb0,
+  0xfbb1, 0xfbb2, 0xfbb3, 0xfbb4, 0xfbb5, 0xfbb6, 0xfbb7, 0xb440,
+  0xfbb9, 0xfbba, 0xfbbb, 0xfbbc, 0xfbbd, 0xfbbe, 0xfbbf, 0xfbc0,
+  0xfbc1, 0xfbc2, 0xfbc3, 0xfbc4, 0xfbc5, 0xfbc6, 0xfbc7, 0xfbc8,
+  0xfbc9, 0xfbca, 0xfbcb, 0xfbcc, 0xfbcd, 0xfbce, 0xfbcf, 0xfbd0,
+  0xfbd1, 0xfbd2, 0xfbd3, 0xfbd4, 0xfbd5, 0xfbd6, 0xfbd7, 0xfbd8,
+  0xfbd9, 0xfbda, 0xfbdb, 0xfbdc, 0xfbdd, 0xfbde, 0xfbdf, 0xfbe0,
+  0xfbe1, 0xfbe2, 0xfbe3, 0xfbe4, 0xfbe5, 0xfbe6, 0xfbe7, 0xfbe8,
+  0xfbe9, 0xfbea, 0xfbeb, 0xfbec, 0xfbed, 0xfbee, 0xfbef, 0xfbf0,
+  0xfbf1, 0xfbf2, 0xc9db, 0xfbf4, 0xfbf5, 0xfbf6, 0xfbf7, 0xfbf8,
+  0x9dfb, 0xfbfa, 0xfbfb, 0xfbfc, 0xfbfd, 0xfbfe, 0xfc40, 0xfc41,
+  0xfc42, 0xfc43, 0xfc44, 0xfc45, 0xfc46, 0xfc47, 0xfc48, 0xfc49,
+  0xfc4a, 0xfc4b, 0xfc4c, 0xfc4d, 0xfc4e, 0xd8f4, 0xfc50, 0xfc51,
+  0xfc52, 0xfc53, 0xfc54, 0xfc55, 0xfc56, 0xfc57, 0xfc58, 0xfc59,
+  0xfc5a, 0xfc5b, 0xfc5c, 0xfc5d, 0xfc5e, 0xfc5f, 0xfc60, 0xfc61,
+  0xfc62, 0xfc63, 0xfc64, 0xfc65, 0xfc66, 0xfc67, 0xfc68, 0xfc69,
+  0xfc6a, 0xfc6b, 0xa0dc, 0xfc6d, 0xfc6e, 0xfc6f, 0xfc70, 0xfc71,
+  0xfc72, 0xfc73, 0xfc74, 0xfc75, 0xfc76, 0xfc77, 0xfc78, 0xfc79,
+  0xfc7a, 0xfc7b, 0xfc7c, 0xfc7d, 0xfc7e, 0xfca1, 0xfca2, 0xfca3,
+  0xfca4, 0xfca5, 0xfca6, 0xfca7, 0xfca8, 0xfca9, 0xfcaa, 0xfcab,
+  0xfcac, 0xfcad, 0xfcae, 0xfcaf, 0xfcb0, 0xfcb1, 0xfcb2, 0xfcb3,
+  0xfcb4, 0xfcb5, 0xfcb6, 0xfcb7, 0xfcb8, 0xbcb5, 0xfcba, 0xfcbb,
+  0xfcbc, 0xfcbd, 0xfcbe, 0xfcbf, 0xfcc0, 0xfcc1, 0xfcc2, 0xfcc3,
+  0xfcc4, 0xfcc5, 0xfcc6, 0xfcc7, 0xfcc8, 0xfcc9, 0xfcca, 0xfccb,
+  0xfccc, 0xfccd, 0xfcce, 0xfccf, 0xfcd0, 0xfcd1, 0xfcd2, 0xfcd3,
+  0xfcd4, 0xfcd5, 0xfcd6, 0xfcd7, 0xfcd8, 0xfcd9, 0xfcda, 0xfcdb,
+  0xfcdc, 0xfcdd, 0xfcde, 0xfcdf, 0xfce0, 0xfce1, 0xb4b8, 0xfce3,
+  0xfce4, 0xfce5, 0xfce6, 0xfce7, 0xfce8, 0xfce9, 0xfcea, 0xfceb,
+  0xfcec, 0xfced, 0xfcee, 0xfcef, 0xfcf0, 0xa7fb, 0xfcf2, 0xfcf3,
+  0xfcf4, 0xfcf5, 0xfcf6, 0xfcf7, 0xfcf8, 0xfcf9, 0xfcfa, 0xfcfb,
+  0xfcfc, 0xfcfd, 0xfcfe, 0xfd40, 0xfd41, 0xfd42, 0xfd43, 0xfd44,
+  0xfd45, 0xfd46, 0xfd47, 0xfd48, 0xfd49, 0xfd4a, 0xfd4b, 0xfd4c,
+  0xfd4d, 0xfd4e, 0xfd4f, 0xfd50, 0xfd51, 0xfd52, 0xfd53, 0xfd54,
+  0xfd55, 0xfd56, 0xfd57, 0xfd58, 0xfd59, 0xfd5a, 0xfd5b, 0xfd5c,
+  0xfd5d, 0xfd5e, 0xfd5f, 0xfd60, 0xfd61, 0xfd62, 0xfd63, 0xfd64,
+  0xfd65, 0xfd66, 0xfd67, 0xfd68, 0xfd69, 0xfd6a, 0xfd6b, 0xfd6c,
+  0xfd6d, 0xfd6e, 0xfd6f, 0xfd70, 0xfd71, 0xfd72, 0xfd73, 0xfd74,
+  0xfd75, 0xfd76, 0xfd77, 0xfd78, 0xfd79, 0xfd7a, 0xfd7b, 0xfd7c,
+  0xfd7d, 0xfd7e, 0xfda1, 0xfda2, 0xfda3, 0xfda4, 0xfda5, 0xfda6,
+  0xfda7, 0xfda8, 0xfda9, 0xfdaa, 0xfdab, 0xfdac, 0xfdad, 0xfdae,
+  0xfdaf, 0xfdb0, 0xfdb1, 0xfdb2, 0xfdb3, 0xfdb4, 0xfdb5, 0xfdb6,
+  0xcb58, 0xb4fc, 0xfdb9, 0xfdba, 0xb4e4, 0xfdbc, 0xfdbd, 0xfdbe,
+  0xfdbf, 0xfdc0, 0xfdc1, 0xfdc2, 0xfdc3, 0xfdc4, 0xfdc5, 0xfdc6,
+  0xfdc7, 0xfdc8, 0xfdc9, 0xfdca, 0xfdcb, 0xfdcc, 0xfdcd, 0xfdce,
+  0xfdcf, 0xfdd0, 0xfdd1, 0xfdd2, 0xfdd3, 0xfdd4, 0xfdd5, 0xfdd6,
+  0xfdd7, 0xfdd8, 0xfdd9, 0xfdda, 0xfddb, 0xfddc, 0xfddd, 0xfdde,
+  0xfddf, 0xfde0, 0xfde1, 0xfde2, 0xfde3, 0xfde4, 0xfde5, 0xfde6,
+  0xfde7, 0xfde8, 0xfde9, 0xfdea, 0xfdeb, 0xfdec, 0xfded, 0xfdee,
+  0xfdef, 0xfdf0, 0xb54e, 0xfdf2, 0xfdf3, 0xfdf4, 0xfdf5, 0xfdf6,
+  0xfdf7, 0xfdf8, 0xfdf9, 0xfdfa, 0xfdfb, 0xfdfc, 0xfdfd, 0xfdfe,
+  0xfe40, 0xfe41, 0xfe42, 0xfe43, 0xfe44, 0xfe45, 0xfe46, 0xfe47,
+  0xfe48, 0xfe49, 0xfe4a, 0xfe4b, 0xfe4c, 0xfe4d, 0xfe4e, 0xfe4f,
+  0xfe50, 0xfe51, 0x9975, 0xfe53, 0xfe54, 0xfe55, 0xfe56, 0xfe57,
+  0xfe58, 0xfe59, 0xfe5a, 0xfe5b, 0xfe5c, 0xfe5d, 0xfe5e, 0xfe5f,
+  0xfe60, 0xfe61, 0xfe62, 0xfe63, 0xfe64, 0xfe65, 0xfe66, 0xfe67,
+  0xfe68, 0xfe69, 0xfe6a, 0xfe6b, 0xfe6c, 0xfe6d, 0xfe6e, 0xb7ec,
+  0xfe70, 0xfe71, 0xfe72, 0xfe73, 0xfe74, 0xfe75, 0xfe76, 0xfe77,
+  0xfe78, 0xfe79, 0xfe7a, 0xfe7b, 0xfe7c, 0xfe7d, 0xfe7e, 0xfea1,
+  0xfea2, 0xfea3, 0xfea4, 0xfea5, 0xfea6, 0xfea7, 0xfea8, 0xfea9,
+  0xa260, 0xfeab, 0xfeac, 0xfead, 0xfeae, 0xfeaf, 0xfeb0, 0xfeb1,
+  0xfeb2, 0xfeb3, 0xfeb4, 0xfeb5, 0xfeb6, 0xfeb7, 0xfeb8, 0xfeb9,
+  0xfeba, 0xfebb, 0xfebc, 0xfebd, 0xfebe, 0xfebf, 0xfec0, 0xfec1,
+  0xfec2, 0xfec3, 0xfec4, 0xfec5, 0xfec6, 0xfec7, 0xfec8, 0xfec9,
+  0xfeca, 0xfecb, 0xfecc, 0xfecd, 0xfece, 0xfecf, 0xfed0, 0xfed1,
+  0xfed2, 0xfed3, 0xfed4, 0xfed5, 0xfed6, 0xfed7, 0xfed8, 0xfed9,
+  0xfeda, 0xfedb, 0xfedc, 0xcff1, 0xfede, 0xfedf, 0xfee0, 0xfee1,
+  0xfee2, 0xfee3, 0xfee4, 0xfee5, 0xfee6, 0xfee7, 0xfee8, 0xfee9,
+  0xfeea, 0xfeeb, 0xfeec, 0xfeed, 0xfeee, 0xfeef, 0xfef0, 0xfef1,
+  0xfef2, 0xfef3, 0xfef4, 0xfef5, 0xfef6, 0xfef7, 0xfef8, 0xfef9,
+  0xfefa, 0xfefb, 0xfefc, 0xfefd, 0xfefe, 0x8e40, 0x8e41, 0x8e42,
+  0x8e43, 0x8e44, 0x8e45, 0x8e46, 0x8e47, 0x8e48, 0x8e49, 0x8e4a,
+  0x8e4b, 0x8e4c, 0x8e4d, 0x8e4e, 0x8e4f, 0x8e50, 0x8e51, 0x8e52,
+  0x8e53, 0x8e54, 0x8e55, 0x8e56, 0x8e57, 0x8e58, 0x8e59, 0x8e5a,
+  0x8e5b, 0x8e5c, 0x8e5d, 0x8e5e, 0x8e5f, 0x8e60, 0x8e61, 0x8e62,
+  0x8e63, 0x8e64, 0x8e65, 0x8e66, 0x8e67, 0x8e68, 0xbae6, 0x8e6a,
+  0x8e6b, 0x8e6c, 0x8e6d, 0x8e6e, 0xedca, 0x8e70, 0x8e71, 0x8e72,
+  0x8e73, 0x8e74, 0x8e75, 0x8e76, 0x8e77, 0x8e78, 0x8e79, 0x8e7a,
+  0x8e7b, 0x8e7c, 0x8e7d, 0xa261, 0x8ea1, 0x8ea2, 0x8ea3, 0x8ea4,
+  0x8ea5, 0x8ea6, 0x8ea7, 0x8ea8, 0x8ea9, 0x8eaa, 0xbafc, 0x8eac,
+  0x8ead, 0x8eae, 0x8eaf, 0x8eb0, 0x8eb1, 0x8eb2, 0x8eb3, 0xbfa6,
+  0x8eb5, 0x8eb6, 0x8eb7, 0x8eb8, 0x8eb9, 0x8eba, 0x8ebb, 0x8ebc,
+  0x8ebd, 0x8ebe, 0x8ebf, 0x8ec0, 0x8ec1, 0x8ec2, 0x8ec3, 0x8ec4,
+  0x8ec5, 0x8ec6, 0x8ec7, 0x8ec8, 0x8ec9, 0x8eca, 0x8ecb, 0x8ecc,
+  0xaacc, 0x8ece, 0x8ecf, 0xbfae, 0x8ed1, 0x8ed2, 0x8ed3, 0x8ed4,
+  0x8ed5, 0x8ed6, 0x8ed7, 0x8ed8, 0x8ed9, 0x8eda, 0x8edb, 0x8edc,
+  0x8edd, 0x8ede, 0x8edf, 0x8ee0, 0x8ee1, 0x8ee2, 0x8ee3, 0x8ee4,
+  0x8ee5, 0x8ee6, 0x8ee7, 0x8ee8, 0x8ee9, 0x8eea, 0x8eeb, 0x8eec,
+  0x8eed, 0x8eee, 0x8eef, 0x8ef0, 0x8ef1, 0x8ef2, 0x8ef3, 0x8ef4,
+  0x8ef5, 0x8ef6, 0x8ef7, 0x8ef8, 0x8ef9, 0x8efa, 0x8efb, 0x8efc,
+  0x8efd, 0x8efe, 0x8f40, 0x8f41, 0x8f42, 0x8f43, 0x8f44, 0x8f45,
+  0x8f46, 0x8f47, 0x8f48, 0x8f49, 0x8f4a, 0x8f4b, 0x8f4c, 0x8f4d,
+  0x8f4e, 0x8f4f, 0x8f50, 0x8f51, 0x8f52, 0x8f53, 0x8f54, 0x8f55,
+  0x8f56, 0xb5d7, 0x8f58, 0x8f59, 0x8f5a, 0x8f5b, 0x8f5c, 0x8f5d,
+  0x8f5e, 0x8f5f, 0x8f60, 0x8f61, 0x8f62, 0x8f63, 0x8f64, 0x8f65,
+  0x8f66, 0x8f67, 0x8f68, 0xe3c8, 0x8f6a, 0x8f6b, 0x8f6c, 0x8f6d,
+  0xdb79, 0x8f6f, 0x8f70, 0x8f71, 0x8f72, 0x8f73, 0x8f74, 0x8f75,
+  0x8f76, 0x8f77, 0x8f78, 0x8f79, 0x8f7a, 0x8f7b, 0x8f7c, 0x8f7d,
+  0x8f7e, 0x8fa1, 0x8fa2, 0x8fa3, 0x8fa4, 0x8fa5, 0x8fa6, 0x8fa7,
+  0x8fa8, 0x8fa9, 0x8faa, 0x8fab, 0x8fac, 0x8fad, 0x8fae, 0x8faf,
+  0x8fb0, 0x8fb1, 0x8fb2, 0x8fb3, 0x8fb4, 0x8fb5, 0x8fb6, 0x8fb7,
+  0x8fb8, 0x8fb9, 0x8fba, 0x8fbb, 0x8fbc, 0x8fbd, 0x8fbe, 0x8fbf,
+  0x8fc0, 0x8fc1, 0x8fc2, 0x8fc3, 0x8fc4, 0x8fc5, 0x8fc6, 0x8fc7,
+  0x8fc8, 0x8fc9, 0x8fca, 0xbfcc, 0xa0d4, 0x8fcd, 0x8fce, 0x8fcf,
+  0x8fd0, 0x8fd1, 0x8fd2, 0x8fd3, 0x8fd4, 0x8fd5, 0x8fd6, 0x8fd7,
+  0x8fd8, 0x8fd9, 0x8fda, 0x8fdb, 0x8fdc, 0x8fdd, 0x8fde, 0x8fdf,
+  0x8fe0, 0x8fe1, 0x8fe2, 0x8fe3, 0x8fe4, 0x8fe5, 0x8fe6, 0x8fe7,
+  0x8fe8, 0x8fe9, 0x8fea, 0x8feb, 0x8fec, 0x8fed, 0x8fee, 0x8fef,
+  0x8ff0, 0x8ff1, 0x8ff2, 0x8ff3, 0x8ff4, 0x8ff5, 0x8ff6, 0x8ff7,
+  0x8ff8, 0x8ff9, 0x8ffa, 0x8ffb, 0x8ffc, 0x8ffd, 0xb05f, 0x9040,
+  0x9041, 0x9042, 0x9043, 0x9044, 0x9045, 0x9046, 0x9047, 0x9048,
+  0x9049, 0x904a, 0x904b, 0x904c, 0x904d, 0x904e, 0x904f, 0x9050,
+  0x9051, 0x9052, 0x9053, 0x9054, 0x9055, 0x9056, 0x9057, 0x9058,
+  0x9059, 0x905a, 0x905b, 0x905c, 0x905d, 0x905e, 0x905f, 0x9060,
+  0x9061, 0x9062, 0x9063, 0x9064, 0x9065, 0x9066, 0x9067, 0x9068,
+  0x9069, 0x906a, 0x906b, 0x906c, 0xb3a3, 0x906e, 0x906f, 0x9070,
+  0x9071, 0x9072, 0x9073, 0x9074, 0x9075, 0x9076, 0x9077, 0x9078,
+  0x9079, 0xf9d7, 0x907b, 0x907c, 0x907d, 0x907e, 0x90a1, 0x90a2,
+  0x90a3, 0x90a4, 0x90a5, 0x90a6, 0x90a7, 0x90a8, 0x90a9, 0x90aa,
+  0x90ab, 0x90ac, 0x90ad, 0x90ae, 0x90af, 0x90b0, 0x90b1, 0x90b2,
+  0x90b3, 0x90b4, 0x90b5, 0x90b6, 0x90b7, 0x90b8, 0x90b9, 0x90ba,
+  0x90bb, 0x90bc, 0x90bd, 0x90be, 0x90bf, 0x90c0, 0x90c1, 0x90c2,
+  0x90c3, 0x90c4, 0x90c5, 0x90c6, 0x90c7, 0x90c8, 0x90c9, 0x90ca,
+  0x90cb, 0x90cc, 0x90cd, 0x90ce, 0x90cf, 0x90d0, 0x90d1, 0x90d2,
+  0x90d3, 0x90d4, 0x90d5, 0x90d6, 0x90d7, 0x90d8, 0x90d9, 0x90da,
+  0x90db, 0xc052, 0x90dd, 0x90de, 0x90df, 0x90e0, 0x90e1, 0x90e2,
+  0x90e3, 0x90e4, 0x90e5, 0x90e6, 0x90e7, 0x90e8, 0x90e9, 0x90ea,
+  0x90eb, 0x90ec, 0x90ed, 0x90ee, 0x90ef, 0x90f0, 0xc554, 0x90f2,
+  0x90f3, 0x90f4, 0x90f5, 0x90f6, 0x90f7, 0x90f8, 0x90f9, 0x90fa,
+  0x90fb, 0x90fc, 0x90fd, 0x90fe, 0x9140, 0x9141, 0x9142, 0x9143,
+  0x9144, 0x9145, 0x9146, 0x9147, 0x9148, 0x9149, 0x914a, 0x914b,
+  0x914c, 0x914d, 0x914e, 0x914f, 0x9150, 0x9151, 0x9152, 0x9153,
+  0x9154, 0x9155, 0x9156, 0x9157, 0x9158, 0x9159, 0x915a, 0x915b,
+  0x915c, 0x915d, 0x915e, 0x915f, 0x9160, 0x9161, 0x9162, 0x9163,
+  0x9164, 0x9165, 0x9166, 0x9167, 0x9168, 0x9169, 0x916a, 0x916b,
+  0x916c, 0x916d, 0x916e, 0x916f, 0x9170, 0x9171, 0x9172, 0x9173,
+  0x9174, 0x9175, 0x9176, 0x9177, 0x9178, 0x9179, 0x917a, 0x917b,
+  0x917c, 0x917d, 0x917e, 0x91a1, 0x91a2, 0x91a3, 0x91a4, 0x91a5,
+  0x91a6, 0x91a7, 0x91a8, 0x91a9, 0x91aa, 0x91ab, 0x91ac, 0x91ad,
+  0x91ae, 0x91af, 0x91b0, 0x91b1, 0x91b2, 0x91b3, 0x91b4, 0x91b5,
+  0x91b6, 0x91b7, 0x91b8, 0x91b9, 0x91ba, 0x91bb, 0x91bc, 0x91bd,
+  0x91be, 0xf1e3, 0x91c0, 0x91c1, 0x91c2, 0x91c3, 0x91c4, 0x91c5,
+  0x91c6, 0x91c7, 0x91c8, 0x91c9, 0x91ca, 0x91cb, 0x91cc, 0x91cd,
+  0x91ce, 0x91cf, 0x91d0, 0x91d1, 0x91d2, 0x91d3, 0x91d4, 0x91d5,
+  0x91d6, 0x91d7, 0x91d8, 0x91d9, 0x91da, 0x91db, 0x91dc, 0x91dd,
+  0x91de, 0x91df, 0x91e0, 0x91e1, 0x91e2, 0x91e3, 0x91e4, 0x91e5,
+  0x91e6, 0x91e7, 0x91e8, 0x91e9, 0x91ea, 0x91eb, 0x91ec, 0x91ed,
+  0x91ee, 0x91ef, 0x91f0, 0x91f1, 0x91f2, 0x91f3, 0x91f4, 0x91f5,
+  0x91f6, 0x91f7, 0x91f8, 0x91f9, 0x91fa, 0x91fb, 0x91fc, 0x91fd,
+  0x91fe, 0x9240, 0x9241, 0x9242, 0x9243, 0x9242, 0x9245, 0x9246,
+  0x9247, 0x9248, 0x9249, 0x924a, 0x924b, 0x924c, 0x924d, 0x924e,
+  0x924f, 0x9250, 0x9251, 0x9252, 0x9253, 0x9254, 0x9255, 0x9256,
+  0x9257, 0x9258, 0x9259, 0x925a, 0x925b, 0x925c, 0x925d, 0x925e,
+  0x925f, 0x9260, 0x9261, 0x9262, 0x9263, 0x9264, 0x9265, 0x9266,
+  0x9267, 0x9268, 0x9269, 0x926a, 0x926b, 0x926c, 0x926d, 0x926e,
+  0x926f, 0x9270, 0x9271, 0x9272, 0x9273, 0x9274, 0x9275, 0x9276,
+  0x9277, 0x9278, 0x9279, 0x927a, 0x927b, 0x927c, 0x927d, 0x927e,
+  0x92a1, 0x92a2, 0x92a3, 0x92a4, 0x92a5, 0x92a6, 0x92a7, 0x92a8,
+  0x92a9, 0x92aa, 0x92ab, 0x92ac, 0x92ad, 0x92ae, 0xa259, 0xa25a,
+  0xa25c, 0xa25b, 0x92b3, 0x92b4, 0x92b5, 0x92b6, 0x92b7, 0x92b8,
+  0x92b9, 0x92ba, 0x92bb, 0x92bc, 0x92bd, 0x92be, 0x92bf, 0x92c0,
+  0x92c1, 0x92c2, 0x92c3, 0x92c4, 0x92c5, 0x92c6, 0x92c7, 0xa05f,
+  0x92c9, 0x92ca, 0x92cb, 0x92cc, 0x92cd, 0x92ce, 0x92cf, 0x92d0,
+  0xe6ab, 0x92d2, 0x92d3, 0x92d4, 0x92d5, 0x92d6, 0x92d7, 0x92d8,
+  0x92d9, 0x92da, 0x92db, 0x92dc, 0x92dd, 0x92de, 0x92df, 0x92e0,
+  0x92e1, 0x92e2, 0x92e3, 0x92e4, 0x92e5, 0x92e6, 0x92e7, 0x92e8,
+  0x92e9, 0x92ea, 0x92eb, 0x92ec, 0x92ed, 0x92ee, 0x92ef, 0x92f0,
+  0x92f1, 0x92f2, 0x92f3, 0x92f4, 0x92f5, 0x92f6, 0x92f7, 0x92f8,
+  0x92f9, 0x92fa, 0x92fb, 0x92fc, 0x92fd, 0x92fe, 0x9340, 0x9341,
+  0x9342, 0x9343, 0x9344, 0x9345, 0x9346, 0x9347, 0x9348, 0x9349,
+  0x934a, 0x934b, 0x934c, 0x934d, 0x934e, 0x934f, 0x9350, 0x9351,
+  0x9352, 0x9353, 0x9354, 0x9355, 0x9356, 0x9357, 0x9358, 0x9359,
+  0x935a, 0x935b, 0x935c, 0x935d, 0x935e, 0x935f, 0x9360, 0x9361,
+  0x9362, 0x9363, 0x9364, 0x9365, 0x9366, 0x9367, 0x9368, 0x9369,
+  0x936a, 0x936b, 0x936c, 0x936d, 0x936e, 0x936f, 0x9370, 0x9371,
+  0x9372, 0x9373, 0x9374, 0x9375, 0x9376, 0x9377, 0x9378, 0x9379,
+  0x937a, 0x937b, 0x937c, 0x937d, 0x937e, 0x93a1, 0x93a2, 0x93a3,
+  0x93a4, 0x93a5, 0x93a6, 0x93a7, 0x93a8, 0x93a9, 0x93aa, 0x93ab,
+  0x93ac, 0x93ad, 0x93ae, 0x93af, 0x93b0, 0x93b1, 0x93b2, 0x93b3,
+  0x93b4, 0x93b5, 0x93b6, 0x93b7, 0x93b8, 0x93b9, 0x93ba, 0x93bb,
+  0x93bc, 0x93bd, 0x93be, 0x93bf, 0x93c0, 0x93c1, 0x93c2, 0x93c3,
+  0x93c4, 0x93c5, 0x93c6, 0x93c7, 0x93c8, 0x93c9, 0x93ca, 0x93cb,
+  0x93cc, 0x93cd, 0x93ce, 0x93cf, 0x93d0, 0x93d1, 0x93d2, 0x93d3,
+  0x93d4, 0x93d5, 0x93d6, 0x93d7, 0x93d8, 0x93d9, 0x93da, 0x93db,
+  0x93dc, 0x93dd, 0x93de, 0x93df, 0x93e0, 0x93e1, 0x93e2, 0x93e3,
+  0x93e4, 0x93e5, 0x93e6, 0x93e7, 0x93e8, 0x93e9, 0x93ea, 0x93eb,
+  0x93ec, 0x93ed, 0x93ee, 0x93ef, 0x93f0, 0x93f1, 0x93f2, 0x93f3,
+  0x93f4, 0x93f5, 0x93f6, 0x93f7, 0x93f8, 0x93f9, 0x93fa, 0x93fb,
+  0x93fc, 0x93fd, 0x93fe, 0x9440, 0x9441, 0x9442, 0x9443, 0x9444,
+  0x9445, 0x9446, 0xd256, 0x9448, 0x9449, 0x944a, 0x944b, 0x944c,
+  0x944d, 0x944e, 0x944f, 0x9450, 0x9451, 0x9452, 0x9453, 0x9454,
+  0x9455, 0x9456, 0x9457, 0x9458, 0x9459, 0x945a, 0x945b, 0x945c,
+  0x945d, 0x945e, 0x945f, 0x9460, 0x9461, 0x9462, 0x9463, 0x9464,
+  0x9465, 0x9466, 0x9467, 0x9468, 0x9469, 0x946a, 0x946b, 0x946c,
+  0x946d, 0x946e, 0x946f, 0x9470, 0x9471, 0x9472, 0x9473, 0x9474,
+  0x9475, 0x9476, 0x9477, 0x9478, 0x9479, 0x947a, 0x947b, 0x947c,
+  0x947d, 0x947e, 0x94a1, 0x94a2, 0x94a3, 0x94a4, 0x94a5, 0x94a6,
+  0x94a7, 0x94a8, 0x94a9, 0x94aa, 0x94ab, 0x94ac, 0x94ad, 0x94ae,
+  0x94af, 0x94b0, 0x94b1, 0x94b2, 0x94b3, 0x94b4, 0x94b5, 0x94b6,
+  0x94b7, 0x94b8, 0x94b9, 0x94ba, 0x94bb, 0x94bc, 0x94bd, 0x94be,
+  0x94bf, 0x94c0, 0x94c1, 0x94c2, 0x94c3, 0x94c4, 0x94c5, 0x94c6,
+  0x94c7, 0x94c8, 0x94c9, 0xe6d0, 0x94cb, 0x94cc, 0x94cd, 0x94ce,
+  0x94cf, 0x94d0, 0x94d1, 0x94d2, 0x94d3, 0x94d4, 0x94d5, 0x94d6,
+  0x94d7, 0x94d8, 0x94d9, 0x94da, 0x94db, 0x94dc, 0x94dd, 0x94de,
+  0x94df, 0x94e0, 0x94e1, 0x94e2, 0x94e3, 0x94e4, 0x94e5, 0x94e6,
+  0x94e7, 0x94e8, 0x94e9, 0x94ea, 0x94eb, 0x94ec, 0x94ed, 0x94ee,
+  0x94ef, 0x94f0, 0x94f1, 0x94f2, 0x94f3, 0x94f4, 0x94f5, 0x94f6,
+  0x94f7, 0x94f8, 0x94f9, 0x94fa, 0x94fb, 0x94fc, 0x94fd, 0x94fe,
+  0x9540, 0x9541, 0x9542, 0x9543, 0x9544, 0x9545, 0x9546, 0x9547,
+  0x9548, 0x9549, 0x954a, 0x954b, 0x954c, 0x954d, 0x954e, 0x954f,
+  0x9550, 0x9551, 0x9552, 0x9553, 0x9554, 0x9555, 0x9556, 0x9557,
+  0x9558, 0x9559, 0x955a, 0x955b, 0x955c, 0x955d, 0x955e, 0x955f,
+  0x9560, 0x9561, 0x9562, 0x9563, 0x9564, 0x9565, 0x9566, 0x9567,
+  0x9568, 0x9569, 0x956a, 0x956b, 0x956c, 0x956d, 0x956e, 0x956f,
+  0x9570, 0x9571, 0x9572, 0x9573, 0x9574, 0x9575, 0x9576, 0x9577,
+  0x9578, 0x9579, 0x957a, 0x957b, 0x957c, 0x957d, 0x957e, 0x95a1,
+  0x95a2, 0x95a3, 0x95a4, 0x95a5, 0x95a6, 0x95a7, 0x95a8, 0x95a9,
+  0x95aa, 0x95ab, 0x95ac, 0x95ad, 0x95ae, 0x95af, 0x95b0, 0x95b1,
+  0x95b2, 0x95b3, 0x95b4, 0x95b5, 0x95b6, 0x95b7, 0x95b8, 0x95b9,
+  0x95ba, 0x95bb, 0x95bc, 0x95bd, 0x95be, 0x95bf, 0x95c0, 0x95c1,
+  0x95c2, 0x95c3, 0x95c4, 0x95c5, 0x95c6, 0x95c7, 0x95c8, 0x95c9,
+  0x95ca, 0x95cb, 0x95cc, 0x95cd, 0x95ce, 0x95cf, 0x95d0, 0x95d1,
+  0x95d2, 0x95d3, 0x95d4, 0x95d5, 0x95d6, 0x95d7, 0x95d8, 0xca52,
+  0x95da, 0x95db, 0x95dc, 0x95dd, 0x95de, 0x95df, 0x95e0, 0x95e1,
+  0x95e2, 0x95e3, 0x95e4, 0x95e5, 0x95e6, 0x95e7, 0x95e8, 0x95e9,
+  0x95ea, 0x95eb, 0x95ec, 0x95ed, 0x95ee, 0x95ef, 0x95f0, 0x95f1,
+  0x95f2, 0x95f3, 0x95f4, 0x95f5, 0x95f6, 0x95f7, 0x95f8, 0x95f9,
+  0x95fa, 0x95fb, 0x95fc, 0x95fd, 0x95fe, 0x9640, 0x9641, 0x9642,
+  0x9643, 0x9ce4, 0x9645, 0x9646, 0x9647, 0x9648, 0x9649, 0x964a,
+  0x964b, 0x964c, 0x964d, 0x964e, 0x964f, 0x9650, 0x9651, 0x9652,
+  0x9653, 0x9654, 0x9655, 0x9656, 0x9657, 0x9658, 0x9659, 0x965a,
+  0x965b, 0x965c, 0x965d, 0x965e, 0x965f, 0x9660, 0x9661, 0x9662,
+  0x9663, 0x9664, 0x9665, 0x9666, 0x9667, 0x9668, 0x9669, 0x966a,
+  0x966b, 0x966c, 0x966d, 0x966e, 0x966f, 0x9670, 0x9671, 0x9672,
+  0x9673, 0x9674, 0x9675, 0x9676, 0x9677, 0x9678, 0x9679, 0x967a,
+  0x967b, 0x967c, 0x967d, 0x967e, 0x96a1, 0x96a2, 0x96a3, 0x96a4,
+  0x96a5, 0x96a6, 0x96a7, 0x96a8, 0x96a9, 0x96aa, 0x96ab, 0x96ac,
+  0x96ad, 0x96ae, 0x96af, 0x96b0, 0x96b1, 0x96b2, 0x96b3, 0x96b4,
+  0x96b5, 0x96b6, 0x96b7, 0x96b8, 0x96b9, 0x96ba, 0x96bb, 0x96bc,
+  0x96bd, 0x96be, 0x96bf, 0x96c0, 0x96c1, 0x96c2, 0x96c3, 0x96c4,
+  0x96c5, 0x96c6, 0x96c7, 0x96c8, 0x96c9, 0x96ca, 0x96cb, 0x96cc,
+  0x96cd, 0x96ce, 0x96cf, 0x96d0, 0x96d1, 0x96d2, 0x96d3, 0x96d4,
+  0x96d5, 0x96d6, 0x96d7, 0x96d8, 0x96d9, 0x96da, 0x96db, 0x96dc,
+  0x96dd, 0x96de, 0x96df, 0x96e0, 0x96e1, 0x96e2, 0x96e3, 0x96e4,
+  0x96e5, 0x96e6, 0x96e7, 0x96e8, 0x96e9, 0x96ea, 0x96eb, 0x96ec,
+  0x96ee, 0x96ee, 0x96ef, 0x96f0, 0x96f1, 0x96f2, 0x96f3, 0x96f4,
+  0x96f5, 0x96f6, 0x96f7, 0x96f8, 0x96f9, 0x96fa, 0x96fb, 0xe959,
+  0x96fd, 0x96fe, 0x9740, 0x9741, 0x9742, 0x9743, 0x9744, 0x9745,
+  0x9746, 0x9747, 0x9748, 0x9749, 0x974a, 0x974b, 0x974c, 0x974d,
+  0x974e, 0x974f, 0x9750, 0x9751, 0x9752, 0x9753, 0x9754, 0x9755,
+  0x9756, 0x9757, 0x9758, 0x9759, 0x975a, 0x975b, 0x975c, 0x975d,
+  0x975e, 0x975f, 0x9760, 0x9761, 0x9762, 0x9763, 0x9764, 0x9765,
+  0x9766, 0x9767, 0x9768, 0x9769, 0x976a, 0x976b, 0x976c, 0x976d,
+  0x976e, 0x976f, 0x9770, 0x9771, 0x9772, 0x9773, 0x9774, 0x9775,
+  0x9776, 0x9777, 0x9778, 0x9779, 0x977a, 0x977b, 0x977c, 0x977d,
+  0x977e, 0x97a1, 0x97a2, 0x97a3, 0x97a4, 0x97a5, 0x97a6, 0x97a7,
+  0x97a8, 0x97a9, 0x97aa, 0x97ab, 0x97ac, 0x97ad, 0x97ae, 0x97af,
+  0x97b0, 0x97b1, 0x97b2, 0x97b3, 0x97b4, 0x97b5, 0x97b6, 0x97b7,
+  0x97b8, 0x97b9, 0x97ba, 0x97bb, 0x97bc, 0x97bd, 0x97be, 0x97bf,
+  0x97c0, 0x97c1, 0x97c2, 0x97c3, 0x97c4, 0x97c5, 0x97c6, 0x97c7,
+  0x97c8, 0x97c9, 0x97ca, 0x97cb, 0x97cc, 0x97cd, 0x97ce, 0x97cf,
+  0x97d0, 0x97d1, 0x97d2, 0x97d3, 0x97d4, 0x97d5, 0x97d6, 0x97d7,
+  0x97d8, 0x97d9, 0x97da, 0x97db, 0x97dc, 0x97dd, 0x97de, 0x97df,
+  0x97e0, 0x97e1, 0x97e2, 0x97e3, 0x97e4, 0x97e5, 0x97e6, 0x97e7,
+  0x97e8, 0x97e9, 0x97ea, 0x97eb, 0x97ec, 0x97ed, 0x97ee, 0x97ef,
+  0x97f0, 0x97f1, 0x97f2, 0x97f3, 0x97f4, 0x97f5, 0x97f6, 0x97f7,
+  0x97f8, 0x97f9, 0x97fa, 0x97fb, 0x97fc, 0x97fd, 0x97fe, 0x9840,
+  0x9841, 0x9842, 0x9843, 0x9844, 0x9845, 0x9846, 0x9847, 0x9848,
+  0x9849, 0x984a, 0x984b, 0x984c, 0x984d, 0x984e, 0x984f, 0x9850,
+  0x9851, 0x9852, 0x9853, 0x9854, 0x9855, 0x9856, 0x9857, 0x9858,
+  0x9859, 0x985a, 0x985b, 0x985c, 0x985d, 0x985e, 0x985f, 0x9860,
+  0x9861, 0x9862, 0x9863, 0x9864, 0x9865, 0x9866, 0x9867, 0x9868,
+  0x9869, 0x986a, 0x986b, 0x986c, 0x986d, 0x986e, 0x986f, 0x9870,
+  0x9871, 0x9872, 0x9873, 0x9874, 0x9875, 0x9876, 0x9877, 0x9878,
+  0x9879, 0x987a, 0x987b, 0x987c, 0x987d, 0x987e, 0x98a1, 0x98a2,
+  0x98a3, 0x98a4, 0x98a5, 0x98a6, 0x98a7, 0x98a8, 0x98a9, 0x98aa,
+  0x98ab, 0x98ac, 0x98ad, 0x98ae, 0x98af, 0x98b0, 0x98b1, 0x98b2,
+  0x98b3, 0x98b4, 0x98b5, 0x98b6, 0x98b7, 0x98b8, 0x98b9, 0x98ba,
+  0x98bb, 0x98bc, 0x98bd, 0x98be, 0x98bf, 0x98c0, 0x98c1, 0x98c2,
+  0x98c3, 0x98c4, 0x98c5, 0x98c6, 0x98c7, 0x98c8, 0x98c9, 0x98ca,
+  0x98cb, 0x98cc, 0x98cd, 0x98ce, 0x98cf, 0x98d0, 0x98d1, 0x98d2,
+  0x98d3, 0x98d4, 0x98d5, 0x98d6, 0x98d7, 0x98d8, 0x98d9, 0x98da,
+  0x98db, 0x98dc, 0x98dd, 0x98de, 0x98df, 0x98e0, 0x98e1, 0x98e2,
+  0x98e3, 0x98e4, 0x98e5, 0x98e6, 0x98e7, 0x98e8, 0x98e9, 0x98ea,
+  0x98eb, 0x98ec, 0x98ed, 0x98ee, 0x98ef, 0x98f0, 0x98f1, 0x98f2,
+  0x98f3, 0x98f4, 0x98f5, 0x98f6, 0x98f7, 0x98f8, 0x98f9, 0x98fa,
+  0x98fb, 0x98fc, 0x98fd, 0x98fe, 0x9940, 0x9941, 0x9942, 0x9943,
+  0x9944, 0x9945, 0x9946, 0x9947, 0x9948, 0x9949, 0x994a, 0x994b,
+  0x994c, 0x994d, 0x994e, 0x994f, 0x9950, 0x9951, 0x9952, 0x9953,
+  0x9954, 0x9955, 0x9956, 0x9957, 0x9958, 0x9959, 0x995a, 0x995b,
+  0x995c, 0x995d, 0x995e, 0x995f, 0x9960, 0x9961, 0x9962, 0x9963,
+  0x9964, 0x9965, 0x9966, 0x9967, 0x9968, 0x9969, 0x996a, 0x996b,
+  0x996c, 0x996d, 0x996e, 0x996f, 0x9970, 0x9971, 0x9972, 0x9973,
+  0x9974, 0x9975, 0x9976, 0x9977, 0x9978, 0x9979, 0x997a, 0x997b,
+  0x997c, 0x997d, 0x997e, 0x99a1, 0x99a2, 0x99a3, 0x99a4, 0x99a5,
+  0x99a6, 0x99a7, 0x99a8, 0x99a9, 0x99aa, 0x99ab, 0x99ac, 0x99ad,
+  0x99ae, 0x99af, 0x99b0, 0x99b1, 0x99b2, 0x99b3, 0x99b4, 0x99b5,
+  0x99b6, 0x99b7, 0x99b8, 0x99b9, 0x99ba, 0x99bb, 0x99bc, 0x99bd,
+  0x99be, 0x99bf, 0x99c0, 0x99c1, 0x99c2, 0x99c3, 0x99c4, 0x99c5,
+  0x99c6, 0x99c7, 0x99c8, 0x99c9, 0x99ca, 0x99cb, 0x99cc, 0x99cd,
+  0x99ce, 0x99cf, 0x99d0, 0x99d1, 0x99d2, 0x99d3, 0x99d4, 0x99d5,
+  0x99d6, 0x99d7, 0x99d8, 0x99d9, 0x99da, 0x99db, 0x99dc, 0x99dd,
+  0x99de, 0x99df, 0x99e0, 0x99e1, 0x99e2, 0x99e3, 0x99e4, 0x99e5,
+  0x99e6, 0x99e7, 0x99e8, 0x99e9, 0x99ea, 0x99eb, 0x99ec, 0x99ed,
+  0x99ee, 0x99ef, 0x99f0, 0x99f1, 0x99f2, 0x99f3, 0x99f4, 0x99f5,
+  0x99f6, 0x99f7, 0x99f8, 0x99f9, 0x99fa, 0x99fb, 0x99fc, 0x99fd,
+  0x99fe, 0x9a40, 0x9a41, 0x9a42, 0x9a43, 0x9a44, 0x9a45, 0x9a46,
+  0x9a47, 0x9a48, 0x9a49, 0x9a4a, 0x9a4b, 0x9a4c, 0x9a4d, 0x9a4e,
+  0x9a4f, 0x9a50, 0x9a51, 0x9a52, 0x9a53, 0x9a54, 0x9a55, 0x9a56,
+  0x9a57, 0x9a58, 0x9a59, 0x9a5a, 0x9a5b, 0x9a5c, 0x9a5d, 0x9a5e,
+  0x9a5f, 0x9a60, 0x9a61, 0x9a62, 0x9a63, 0x9a64, 0x9a65, 0x9a66,
+  0x9a67, 0x9a68, 0x9a69, 0x9a6a, 0x9a6b, 0x9a6c, 0x9a6d, 0x9a6e,
+  0x9a6f, 0x9a70, 0x9a71, 0x9a72, 0x9a73, 0x9a74, 0x9a75, 0x9a76,
+  0x9a77, 0x9a78, 0x9a79, 0x9a7a, 0x9a7b, 0x9a7c, 0x9a7d, 0x9a7e,
+  0x9aa1, 0x9aa2, 0x9aa3, 0x9aa4, 0x9aa5, 0x9aa6, 0x9aa7, 0x9aa8,
+  0x9aa9, 0x9aaa, 0x9aab, 0x9aac, 0x9aad, 0x9aae, 0x9aaf, 0x9ab0,
+  0x9ab1, 0x9ab2, 0x9ab3, 0x9ab4, 0x9ab5, 0x9ab6, 0x9ab7, 0x9ab8,
+  0x9ab9, 0x9aba, 0x9abb, 0x9abc, 0x9abd, 0x9abe, 0x9abf, 0x9ac0,
+  0x9ac1, 0x9ac2, 0x9ac3, 0x9ac4, 0x9ac5, 0x9ac6, 0x9ac7, 0x9ac8,
+  0x9ac9, 0x9aca, 0x9acb, 0x9acc, 0x9acd, 0x9ace, 0x9acf, 0x9ad0,
+  0x9ad1, 0x9ad2, 0x9ad3, 0x9ad4, 0x9ad5, 0x9ad6, 0x9ad7, 0x9ad8,
+  0x9ad9, 0x9ada, 0x9adb, 0x9adc, 0x9add, 0x9ade, 0x9adf, 0x9ae0,
+  0x9ae1, 0x9ae2, 0x9ae3, 0x9ae4, 0x9ae5, 0x9ae6, 0x9ae7, 0x9ae8,
+  0x9ae9, 0x9aea, 0x9aeb, 0x9aec, 0x9aed, 0x9aee, 0x9aef, 0x9af0,
+  0x9af1, 0x9af2, 0x9af3, 0x9af4, 0x9af5, 0x9af6, 0x9af7, 0x9af8,
+  0x9af9, 0x9afa, 0x9afb, 0x9afc, 0x9afd, 0x9afe, 0x9b40, 0x9b41,
+  0x9b42, 0x9b43, 0x9b44, 0x9b45, 0x9b46, 0x9b47, 0x9b48, 0x9b49,
+  0x9b4a, 0x9b4b, 0x9b4c, 0x9b4d, 0x9b4e, 0x9b4f, 0x9b50, 0x9b51,
+  0x9b52, 0x9b53, 0x9b54, 0x9b55, 0x9b56, 0x9b57, 0x9b58, 0x9b59,
+  0x9b5a, 0x9b5b, 0x9b5c, 0x9b5d, 0x9b5e, 0x9b5f, 0x9b60, 0x9b61,
+  0x9b62, 0x9b63, 0x9b64, 0x9b65, 0x9b66, 0x9b67, 0x9b68, 0x9b69,
+  0x9b6a, 0x9b6b, 0x9b6c, 0x9b6d, 0x9b6e, 0x9b6f, 0x9b70, 0x9b71,
+  0x9b72, 0x9b73, 0x9b74, 0x9b75, 0xeff9, 0x9b77, 0xc5f7, 0x9b79,
+  0x9b7a, 0xf5e8, 0x9b7c, 0x9b7d, 0x9b7e, 0x9ba1, 0x9ba2, 0x9ba3,
+  0x9ba4, 0x9ba5, 0x9ba6, 0x9ba7, 0x9ba8, 0x9ba9, 0x9baa, 0x9bab,
+  0x9bac, 0x9bad, 0x9bae, 0x9baf, 0x9bb0, 0x9bb1, 0x9bb2, 0x9bb3,
+  0x9bb4, 0x9bb5, 0x9bb6, 0x9bb7, 0x9bb8, 0x9bb9, 0x9bba, 0x9bbb,
+  0x9bbc, 0x9bbd, 0x9bbe, 0x9bbf, 0x9bc0, 0x9bc1, 0x9bc2, 0x9bc3,
+  0x9bc4, 0x9bc5, 0xe8cd, 0x9bc7, 0x9bc8, 0x9bc9, 0x9bca, 0x9bcb,
+  0x9bcc, 0x9bcd, 0x9bce, 0x9bcf, 0x9bd0, 0x9bd1, 0x9bd2, 0x9bd3,
+  0x9bd4, 0x9bd5, 0x9bd6, 0x9bd7, 0x9bd8, 0x9bd9, 0x9bda, 0x9bdb,
+  0x9bdc, 0x9bdd, 0xd0c0, 0x9bdf, 0x9be0, 0x9be1, 0x9be2, 0x9be3,
+  0x9be4, 0x9be5, 0x9be6, 0x9be7, 0x9be8, 0x9be9, 0x9bea, 0x9beb,
+  0xfd64, 0x9bed, 0x9bee, 0x9bef, 0x9bf0, 0x9bf1, 0x9bf2, 0x9bf3,
+  0x9bf4, 0x9bf5, 0xbf47, 0x9bf7, 0x9bf8, 0x9bf9, 0x9bfa, 0x9bfb,
+  0x9bfc, 0x9bfd, 0x9bfe, 0x9c40, 0x9c41, 0xebc9, 0x9c43, 0x9c44,
+  0x9c45, 0x9c46, 0x9c47, 0x9c48, 0x9c49, 0x9c4a, 0x9c4b, 0x9c4c,
+  0x9c4d, 0x9c4e, 0x9c4f, 0x9c50, 0x9c51, 0x9c52, 0xcde7, 0x9c54,
+  0x9c55, 0x9c56, 0x9c57, 0x9c58, 0x9c59, 0x9c5a, 0x9c5b, 0x9c5c,
+  0x9c5d, 0x9c5e, 0x9c5f, 0x9c60, 0x9c61, 0xc0e7, 0x9c63, 0x9c64,
+  0x9c65, 0x9c66, 0x9c67, 0xdc52, 0x9c69, 0x9c6a, 0xf86d, 0x9c6c,
+  0x9c6d, 0x9c6e, 0x9c6f, 0x9c70, 0x9c71, 0x9c72, 0x9c73, 0x9c74,
+  0x9c75, 0x9c76, 0xdb5d, 0x9c78, 0x9c79, 0x9c7a, 0x9c7b, 0x9c7c,
+  0x9c7d, 0x9c7e, 0x9ca1, 0x9ca2, 0x9ca3, 0x9ca4, 0x9ca5, 0x9ca6,
+  0x9ca7, 0x9ca8, 0x9ca9, 0x9caa, 0x9cab, 0x9cac, 0x9cad, 0x9cae,
+  0x9caf, 0x9cb0, 0x9cb1, 0x9cb2, 0x9cb3, 0x9cb4, 0x9cb5, 0x9cb6,
+  0x9cb7, 0x9cb8, 0x9cb9, 0x9cba, 0x9cbb, 0xc95c, 0xafb0, 0x9cbe,
+  0x9cbf, 0x9cc0, 0x9cc1, 0x9cc2, 0x9cc3, 0x9cc4, 0x9cc5, 0x9cc6,
+  0x9cc7, 0x9cc8, 0x9cc9, 0x9cca, 0x9ccb, 0x9ccc, 0x9ccd, 0x9cce,
+  0x9ccf, 0xd4d1, 0x9cd1, 0x9cd2, 0x9cd3, 0x9cd4, 0x9cd5, 0x9cd6,
+  0x9cd7, 0x9cd8, 0x9cd9, 0x9cda, 0x9cdb, 0x9cdc, 0x9cdd, 0x9cde,
+  0x9cdf, 0x9ce0, 0x9ce1, 0x9ce2, 0x9ce3, 0x9ce4, 0x9ce5, 0x9ce6,
+  0x9ce7, 0x9ce8, 0x9ce9, 0x9cea, 0x9ceb, 0x9cec, 0x9ced, 0x9cee,
+  0x9cef, 0x9cf0, 0x9cf1, 0x9cf2, 0x9cf3, 0x9cf4, 0x9cf5, 0x9cf6,
+  0x9cf7, 0x9cf8, 0x9cf9, 0x9cfa, 0x9cfb, 0x9cfc, 0x9cfd, 0x9cfe,
+  0x9d40, 0x9d41, 0x9d42, 0x9d43, 0x9d44, 0x9d45, 0x9d46, 0x9d47,
+  0x9d48, 0x9d49, 0x9d4a, 0x9d4b, 0x9d4c, 0x9d4d, 0x9d4e, 0x9d4f,
+  0x9d50, 0x9d51, 0x9d52, 0x9d53, 0x9d54, 0x9d55, 0x9d56, 0xe07c,
+  0x9d58, 0x9d59, 0xb5ae, 0x9d5b, 0x9d5c, 0x9d5d, 0x9d5e, 0x9d5f,
+  0x9d60, 0x9d61, 0x9d62, 0x9d63, 0x9d64, 0x9d65, 0x9d66, 0x9d67,
+  0x9d68, 0x9d69, 0x9d6a, 0x9d6b, 0x9d6c, 0x9d6d, 0x9d6e, 0x9d6f,
+  0x9d70, 0x9d71, 0x9d72, 0x9d73, 0x9d74, 0x9d75, 0x9d76, 0x9d77,
+  0x9d78, 0x9d79, 0x9d7a, 0x9d7b, 0x9d7c, 0x9d7d, 0x9d7e, 0x9da1,
+  0x9da2, 0x9da3, 0x9da4, 0x9da5, 0x9da6, 0x9da7, 0x9da8, 0x9da9,
+  0x9daa, 0x9dab, 0x9dac, 0x9dad, 0x9dae, 0x9daf, 0x9db0, 0x9db1,
+  0x9db2, 0x9db3, 0x9db4, 0x9db5, 0x9db6, 0x9db7, 0x9db8, 0x9db9,
+  0x9dba, 0x9dbb, 0x9dbc, 0x9dbd, 0x9dbe, 0x9dbf, 0x9dc0, 0x9dc1,
+  0x9dc2, 0x9dc3, 0xa9e4, 0x9dc5, 0x9dc6, 0x9dc7, 0x9dc8, 0x9dc9,
+  0x9dca, 0x9dcb, 0x9dcc, 0x9dcd, 0x9dce, 0x9dcf, 0x9dd0, 0x9dd1,
+  0x9dd2, 0x9dd3, 0x9dd4, 0x9dd5, 0x9dd6, 0x9dd7, 0x9dd8, 0x9dd9,
+  0x9dda, 0x9ddb, 0x9ddc, 0x9ddd, 0x9dde, 0x9ddf, 0x9de0, 0x9de1,
+  0x9de2, 0x9de3, 0x9de4, 0x9de5, 0x9de6, 0x9de7, 0x9de8, 0x9de9,
+  0x9dea, 0x9deb, 0x9dec, 0x9ded, 0x9dee, 0x9def, 0x9df0, 0x9df1,
+  0x9df2, 0x9df3, 0x9df4, 0x9df5, 0x9df6, 0x9df7, 0x9df8, 0x9df9,
+  0x9dfa, 0x9dfb, 0x9dfc, 0x9dfd, 0x9dfe, 0x9e40, 0x9e41, 0x9e42,
+  0x9e43, 0x9e44, 0x9e45, 0x9e46, 0x9e47, 0x9e48, 0x9e49, 0x9e4a,
+  0x9e4b, 0x9e4c, 0x9e4d, 0x9e4e, 0x9e4f, 0x9e50, 0x9e51, 0x9e52,
+  0x9e53, 0x9e54, 0x9e55, 0x9e56, 0x9e57, 0x9e58, 0x9e59, 0x9e5a,
+  0x9e5b, 0x9e5c, 0x9e5d, 0x9e5e, 0x9e5f, 0x9e60, 0x9e61, 0x9e62,
+  0x9e63, 0x9e64, 0x9e65, 0x9e66, 0x9e67, 0x9e68, 0x9e69, 0x9e6a,
+  0x9e6b, 0x9e6c, 0x9e6d, 0x9e6e, 0x9e6f, 0x9e70, 0x9e71, 0x9e72,
+  0x9e73, 0x9e74, 0x9e75, 0x9e76, 0x9e77, 0x9e78, 0x9e79, 0x9e7a,
+  0x9e7b, 0x9e7c, 0x9e7d, 0x9e7e, 0x9ea1, 0x9ea2, 0x9ea3, 0x9ea4,
+  0x9ea5, 0x9ea6, 0x9ea7, 0x9ea8, 0xabec, 0x9eaa, 0x9eab, 0x9eac,
+  0x9ead, 0x9eae, 0x9eaf, 0x9eb0, 0x9eb1, 0x9eb2, 0x9eb3, 0x9eb4,
+  0x9eb5, 0x9eb6, 0x9eb7, 0x9eb8, 0x9eb9, 0x9eba, 0x9ebb, 0x9ebc,
+  0x9ebd, 0x9ebe, 0x9ebf, 0x9ec0, 0x9ec1, 0x9ec2, 0x9ec3, 0x9ec4,
+  0x9ec5, 0x9ec6, 0x9ec7, 0x9ec8, 0x9ec9, 0x9eca, 0x9ecb, 0x9ecc,
+  0x9ecd, 0x9ece, 0x9ecf, 0x9ed0, 0x9ed1, 0x9ed2, 0x9ed3, 0x9ed4,
+  0x9ed5, 0x9ed6, 0x9ed7, 0x9ed8, 0x9ed9, 0x9eda, 0x9edb, 0x9edc,
+  0x9edd, 0x9ede, 0x9edf, 0x9ee0, 0x9ee1, 0x9ee2, 0x9ee3, 0x9ee4,
+  0x9ee5, 0x9ee6, 0x9ee7, 0x9ee8, 0x9ee9, 0x9eea, 0x9eeb, 0x9eec,
+  0x9eed, 0x9eee, 0xdecd, 0x9ef0, 0x9ef1, 0x9ef2, 0x9ef3, 0x9ef4,
+  0x9ef5, 0x9ef6, 0x9ef7, 0x9ef8, 0x9ef9, 0x9efa, 0x9efb, 0x9efc,
+  0xc9fc, 0x9efe, 0x9f40, 0x9f41, 0x9f42, 0x9f43, 0x9f44, 0x9f45,
+  0x9f46, 0x9f47, 0x9f48, 0x9f49, 0x9f4a, 0x9f4b, 0x9f4c, 0x9f4d,
+  0x9f4e, 0x9f4f, 0x9f50, 0x9f51, 0x9f52, 0x9f53, 0x9f54, 0x9f55,
+  0x9f56, 0x9f57, 0x9f58, 0x9f59, 0x9f5a, 0x9f5b, 0x9f5c, 0x9f5d,
+  0x9f5e, 0x9f5f, 0xf9c4, 0x9f61, 0x9f62, 0x9f63, 0x9f64, 0x9f65,
+  0x91be, 0x9f67, 0x9f68, 0x9f69, 0x9f6a, 0x9f6b, 0x9f6c, 0x9f6d,
+  0x9f6e, 0x9f6f, 0x9f70, 0x9f71, 0x9f72, 0x9f73, 0x9f74, 0x9f75,
+  0x9f76, 0x9f77, 0x9f78, 0x9f79, 0x9f7a, 0x9f7b, 0x9f7c, 0x9f7d,
+  0x9f7e, 0x9fa1, 0x9fa2, 0x9fa3, 0x9fa4, 0x9fa5, 0x9fa6, 0x9fa7,
+  0x9fa8, 0x9fa9, 0x9faa, 0x9fab, 0x9fac, 0x9fad, 0x9fae, 0x9faf,
+  0x9fb0, 0x9fb1, 0x9fb2, 0x9fb3, 0x9fb4, 0x9fb5, 0x9fb6, 0x9fb7,
+  0x9fb8, 0x9fb9, 0x9fba, 0x9fbb, 0x9fbc, 0x9fbd, 0x9fbe, 0x9fbf,
+  0x9fc0, 0x9fc1, 0x9fc2, 0x9fc3, 0x9fc4, 0x9fc5, 0x9fc6, 0x9fc7,
+  0x9fc8, 0x9fc9, 0x9fca, 0xb9b0, 0x9fcc, 0x9fcd, 0x9fce, 0x9fcf,
+  0x9fd0, 0x9fd1, 0x9fd2, 0x9fd3, 0x9fd4, 0x9fd5, 0x9fd6, 0x9fd7,
+  0x9361, 0x9fd9, 0x9fda, 0x9fdb, 0x9fdc, 0x9fdd, 0x9fde, 0x9fdf,
+  0x9fe0, 0x9fe1, 0x9fe2, 0x9fe3, 0x9fe4, 0x9fe5, 0x9fe6, 0x9fe7,
+  0x9fe8, 0x9fe9, 0x9fea, 0x9feb, 0x9fec, 0x9fed, 0x9fee, 0x9fef,
+  0x9ff0, 0x9ff1, 0x9ff2, 0x9ff3, 0x9ff4, 0x9ff5, 0x9ff6, 0x9ff7,
+  0x9ff8, 0x9ff9, 0x9ffa, 0x9ffb, 0x9ffc, 0x9ffd, 0x9ffe, 0xa040,
+  0xa041, 0xa042, 0xa043, 0xa044, 0xa045, 0xa046, 0xa047, 0xa048,
+  0xa049, 0xa04a, 0xa04b, 0xa04c, 0xa04d, 0xa04e, 0xa04f, 0xa050,
+  0xa051, 0xa052, 0xa053, 0xa054, 0xa055, 0xa056, 0xa057, 0xa058,
+  0xa059, 0xa05a, 0xa05b, 0xa05c, 0xa05d, 0xa05e, 0xa05f, 0xa060,
+  0xa061, 0xa062, 0x8fb6, 0xa064, 0xa065, 0xa066, 0xa067, 0xa068,
+  0xa069, 0xa06a, 0xa06b, 0xa06c, 0xa06d, 0xa06e, 0xa06f, 0xa070,
+  0xa071, 0xa072, 0xa073, 0xa074, 0xa075, 0xa076, 0xa9f0, 0xa078,
+  0xa079, 0xa07a, 0xa07b, 0xa07c, 0xa07d, 0xa07e, 0xa0a1, 0xa0a2,
+  0xa0a3, 0xa0a4, 0xa0a5, 0xa0a6, 0xa0a7, 0xa0a8, 0xa0a9, 0xa0aa,
+  0xa0ab, 0xa0ac, 0xa0ad, 0xa0ae, 0xa0af, 0xa0b0, 0xa0b1, 0xa0b2,
+  0xa0b3, 0xa0b4, 0xa0b5, 0xa0b6, 0xa0b7, 0xa0b8, 0xa0b9, 0xa0ba,
+  0xa0bb, 0xa0bc, 0xa0bd, 0xa0be, 0xa0bf, 0xa0c0, 0xa0c1, 0xa0c2,
+  0xa0c3, 0xa0c4, 0xa0c5, 0xa0c6, 0xa0c7, 0xa0c8, 0xa0c9, 0xa0ca,
+  0xa0cb, 0xa0cc, 0xa0cd, 0xa0ce, 0xa0cf, 0xa0d0, 0xa0d1, 0xa0d2,
+  0xa0d3, 0xa0d4, 0x947a, 0xa0d6, 0xa0d7, 0xa0d8, 0xa0d9, 0xa0da,
+  0xa0db, 0xa0dc, 0xa0dd, 0xa0de, 0xde72, 0xa0e0, 0xa0e1, 0xa0e2,
+  0xa0e3, 0x9455, 0xa0e5, 0xa0e6, 0xa0e7, 0xa0e8, 0xa0e9, 0xa0ea,
+  0xa0eb, 0xa0ec, 0xa0ed, 0xa0ee, 0xa0ef, 0xa0f0, 0xa0f1, 0xa0f2,
+  0xa0f3, 0xa0f4, 0xa0f5, 0xa0f6, 0xa0f7, 0xa0f8, 0xa0f9, 0xa0fa,
+  0xa0fb, 0xa0fc, 0xa0fd, 0xa0fe, 0x8140, 0x8141, 0x8142, 0x8143,
+  0x8144, 0x8145, 0x8146, 0x8147, 0x8148, 0x8149, 0x814a, 0x814b,
+  0x814c, 0x814d, 0x814e, 0x814f, 0x8150, 0x8151, 0x8152, 0x8153,
+  0x8154, 0x8155, 0x8156, 0x8157, 0x8158, 0x8159, 0x815a, 0x815b,
+  0x815c, 0x815d, 0x815e, 0x815f, 0x8160, 0x8161, 0x8162, 0x8163,
+  0x8164, 0x8165, 0x8166, 0x8167, 0x8168, 0x8169, 0x816a, 0x816b,
+  0x816c, 0x816d, 0x816e, 0x816f, 0x8170, 0x8171, 0x8172, 0x8173,
+  0x8174, 0x8175, 0x8176, 0x8177, 0x8178, 0x8179, 0x817a, 0x817b,
+  0x817c, 0x817d, 0x817e, 0x81a1, 0x81a2, 0x81a3, 0x81a4, 0x81a5,
+  0x81a6, 0x81a7, 0x81a8, 0x81a9, 0x81aa, 0x81ab, 0x81ac, 0x81ad,
+  0x81ae, 0x81af, 0x81b0, 0x81b1, 0x81b2, 0x81b3, 0x81b4, 0x81b5,
+  0x81b6, 0x81b7, 0x81b8, 0x81b9, 0x81ba, 0x81bb, 0x81bc, 0x81bd,
+  0x81be, 0x81bf, 0x81c0, 0x81c1, 0x81c2, 0x81c3, 0x81c4, 0x81c5,
+  0x81c6, 0x81c7, 0x81c8, 0x81c9, 0x81ca, 0x81cb, 0x81cc, 0x81cd,
+  0x81ce, 0x81cf, 0x81d0, 0x81d1, 0x81d2, 0x81d3, 0x81d4, 0x81d5,
+  0x81d6, 0x81d7, 0x81d8, 0x81d9, 0x81da, 0x81db, 0x81dc, 0x81dd,
+  0x81de, 0x81df, 0x81e0, 0x81e1, 0x81e2, 0x81e3, 0x81e4, 0x81e5,
+  0x81e6, 0x81e7, 0x81e8, 0x81e9, 0x81ea, 0x81eb, 0x81ec, 0x81ed,
+  0x81ee, 0x81ef, 0x81f0, 0x81f1, 0x81f2, 0x81f3, 0x81f4, 0x81f5,
+  0x81f6, 0x81f7, 0x81f8, 0x81f9, 0x81fa, 0x81fb, 0x81fc, 0x81fd,
+  0x81fe, 0x8240, 0x8241, 0x8242, 0x8243, 0x8244, 0x8245, 0x8246,
+  0x8247, 0x8248, 0x8249, 0x824a, 0x824b, 0x824c, 0x824d, 0x824e,
+  0x824f, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255, 0x8256,
+  0x8257, 0x8258, 0x8259, 0x825a, 0x825b, 0x825c, 0x825d, 0x825e,
+  0x825f, 0x8260, 0x8261, 0x8262, 0x8263, 0x8264, 0x8265, 0x8266,
+  0x8267, 0x8268, 0x8269, 0x826a, 0x826b, 0x826c, 0x826d, 0x826e,
+  0x826f, 0x8270, 0x8271, 0x8272, 0x8273, 0x8274, 0x8275, 0x8276,
+  0x8277, 0x8278, 0x8279, 0x827a, 0x827b, 0x827c, 0x827d, 0x827e,
+  0x82a1, 0x82a2, 0x82a3, 0x82a4, 0x82a5, 0x82a6, 0x82a7, 0x82a8,
+  0x82a9, 0x82aa, 0x82ab, 0x82ac, 0x82ad, 0x82ae, 0x82af, 0x82b0,
+  0x82b1, 0x82b2, 0x82b3, 0x82b4, 0x82b5, 0x82b6, 0x82b7, 0x82b8,
+  0x82b9, 0x82ba, 0x82bb, 0x82bc, 0x82bd, 0x82be, 0x82bf, 0x82c0,
+  0x82c1, 0x82c2, 0x82c3, 0x82c4, 0x82c5, 0x82c6, 0x82c7, 0x82c8,
+  0x82c9, 0x82ca, 0x82cb, 0x82cc, 0x82cd, 0x82ce, 0x82cf, 0x82d0,
+  0x82d1, 0x82d2, 0x82d3, 0x82d4, 0x82d5, 0x82d6, 0x82d7, 0x82d8,
+  0x82d9, 0x82da, 0x82db, 0x82dc, 0x82dd, 0x82de, 0x82df, 0x82e0,
+  0x82e1, 0x82e2, 0x82e3, 0x82e4, 0x82e5, 0x82e6, 0x82e7, 0x82e8,
+  0x82e9, 0x82ea, 0x82eb, 0x82ec, 0x82ed, 0x82ee, 0x82ef, 0x82f0,
+  0x82f1, 0x82f2, 0x82f3, 0x82f4, 0x82f5, 0x82f6, 0x82f7, 0x82f8,
+  0x82f9, 0x82fa, 0x82fb, 0x82fc, 0x82fd, 0x82fe, 0x8340, 0x8341,
+  0x8342, 0x8343, 0x8344, 0x8345, 0x8346, 0x8347, 0x8348, 0x8349,
+  0x834a, 0x834b, 0x834c, 0x834d, 0x834e, 0x834f, 0x8350, 0x8351,
+  0x8352, 0x8353, 0x8354, 0x8355, 0x8356, 0x8357, 0x8358, 0x8359,
+  0x835a, 0x835b, 0x835c, 0x835d, 0x835e, 0x835f, 0x8360, 0x8361,
+  0x8362, 0x8363, 0x8364, 0x8365, 0x8366, 0x8367, 0x8368, 0x8369,
+  0x836a, 0x836b, 0x836c, 0x836d, 0x836e, 0x836f, 0x8370, 0x8371,
+  0x8372, 0x8373, 0x8374, 0x8375, 0x8376, 0x8377, 0x8378, 0x8379,
+  0x837a, 0x837b, 0x837c, 0x837d, 0x837e, 0x83a1, 0x83a2, 0x83a3,
+  0x83a4, 0x83a5, 0x83a6, 0x83a7, 0x83a8, 0x83a9, 0x83aa, 0x83ab,
+  0x83ac, 0x83ad, 0x83ae, 0x83af, 0x83b0, 0x83b1, 0x83b2, 0x83b3,
+  0x83b4, 0x83b5, 0x83b6, 0x83b7, 0x83b8, 0x83b9, 0x83ba, 0x83bb,
+  0x83bc, 0x83bd, 0x83be, 0x83bf, 0x83c0, 0x83c1, 0x83c2, 0x83c3,
+  0x83c4, 0x83c5, 0x83c6, 0x83c7, 0x83c8, 0x83c9, 0x83ca, 0x83cb,
+  0x83cc, 0x83cd, 0x83ce, 0x83cf, 0x83d0, 0x83d1, 0x83d2, 0x83d3,
+  0x83d4, 0x83d5, 0x83d6, 0x83d7, 0x83d8, 0x83d9, 0x83da, 0x83db,
+  0x83dc, 0x83dd, 0x83de, 0x83df, 0x83e0, 0x83e1, 0x83e2, 0x83e3,
+  0x83e4, 0x83e5, 0x83e6, 0x83e7, 0x83e8, 0x83e9, 0x83ea, 0x83eb,
+  0x83ec, 0x83ed, 0x83ee, 0x83ef, 0x83f0, 0x83f1, 0x83f2, 0x83f3,
+  0x83f4, 0x83f5, 0x83f6, 0x83f7, 0x83f8, 0x83f9, 0x83fa, 0x83fb,
+  0x83fc, 0x83fd, 0x83fe, 0x8440, 0x8441, 0x8442, 0x8443, 0x8444,
+  0x8445, 0x8446, 0x8447, 0x8448, 0x8449, 0x844a, 0x844b, 0x844c,
+  0x844d, 0x844e, 0x844f, 0x8450, 0x8451, 0x8452, 0x8453, 0x8454,
+  0x8455, 0x8456, 0x8457, 0x8458, 0x8459, 0x845a, 0x845b, 0x845c,
+  0x845d, 0x845e, 0x845f, 0x8460, 0x8461, 0x8462, 0x8463, 0x8464,
+  0x8465, 0x8466, 0x8467, 0x8468, 0x8469, 0x846a, 0x846b, 0x846c,
+  0x846d, 0x846e, 0x846f, 0x8470, 0x8471, 0x8472, 0x8473, 0x8474,
+  0x8475, 0x8476, 0x8477, 0x8478, 0x8479, 0x847a, 0x847b, 0x847c,
+  0x847d, 0x847e, 0x84a1, 0x84a2, 0x84a3, 0x84a4, 0x84a5, 0x84a6,
+  0x84a7, 0x84a8, 0x84a9, 0x84aa, 0x84ab, 0x84ac, 0x84ad, 0x84ae,
+  0x84af, 0x84b0, 0x84b1, 0x84b2, 0x84b3, 0x84b4, 0x84b5, 0x84b6,
+  0x84b7, 0x84b8, 0x84b9, 0x84ba, 0x84bb, 0x84bc, 0x84bd, 0x84be,
+  0x84bf, 0x84c0, 0x84c1, 0x84c2, 0x84c3, 0x84c4, 0x84c5, 0x84c6,
+  0x84c7, 0x84c8, 0x84c9, 0x84ca, 0x84cb, 0x84cc, 0x84cd, 0x84ce,
+  0x84cf, 0x84d0, 0x84d1, 0x84d2, 0x84d3, 0x84d4, 0x84d5, 0x84d6,
+  0x84d7, 0x84d8, 0x84d9, 0x84da, 0x84db, 0x84dc, 0x84dd, 0x84de,
+  0x84df, 0x84e0, 0x84e1, 0x84e2, 0x84e3, 0x84e4, 0x84e5, 0x84e6,
+  0x84e7, 0x84e8, 0x84e9, 0x84ea, 0x84eb, 0x84ec, 0x84ed, 0x84ee,
+  0x84ef, 0x84f0, 0x84f1, 0x84f2, 0x84f3, 0x84f4, 0x84f5, 0x84f6,
+  0x84f7, 0x84f8, 0x84f9, 0x84fa, 0x84fb, 0x84fc, 0x84fd, 0x84fe,
+  0x8540, 0x8541, 0x8542, 0x8543, 0x8544, 0x8545, 0x8546, 0x8547,
+  0x8548, 0x8549, 0x854a, 0x854b, 0x854c, 0x854d, 0x854e, 0x854f,
+  0x8550, 0x8551, 0x8552, 0x8553, 0x8554, 0x8555, 0x8556, 0x8557,
+  0x8558, 0x8559, 0x855a, 0x855b, 0x855c, 0x855d, 0x855e, 0x855f,
+  0x8560, 0x8561, 0x8562, 0x8563, 0x8564, 0x8565, 0x8566, 0x8567,
+  0x8568, 0x8569, 0x856a, 0x856b, 0x856c, 0x856d, 0x856e, 0x856f,
+  0x8570, 0x8571, 0x8572, 0x8573, 0x8574, 0x8575, 0x8576, 0x8577,
+  0x8578, 0x8579, 0x857a, 0x857b, 0x857c, 0x857d, 0x857e, 0x85a1,
+  0x85a2, 0x85a3, 0x85a4, 0x85a5, 0x85a6, 0x85a7, 0x85a8, 0x85a9,
+  0x85aa, 0x85ab, 0x85ac, 0x85ad, 0x85ae, 0x85af, 0x85b0, 0x85b1,
+  0x85b2, 0x85b3, 0x85b4, 0x85b5, 0x85b6, 0x85b7, 0x85b8, 0x85b9,
+  0x85ba, 0x85bb, 0x85bc, 0x85bd, 0x85be, 0x85bf, 0x85c0, 0x85c1,
+  0x85c2, 0x85c3, 0x85c4, 0x85c5, 0x85c6, 0x85c7, 0x85c8, 0x85c9,
+  0x85ca, 0x85cb, 0x85cc, 0x85cd, 0x85ce, 0x85cf, 0x85d0, 0x85d1,
+  0x85d2, 0x85d3, 0x85d4, 0x85d5, 0x85d6, 0x85d7, 0x85d8, 0x85d9,
+  0x85da, 0x85db, 0x85dc, 0x85dd, 0x85de, 0x85df, 0x85e0, 0x85e1,
+  0x85e2, 0x85e3, 0x85e4, 0x85e5, 0x85e6, 0x85e7, 0x85e8, 0x85e9,
+  0x85ea, 0x85eb, 0x85ec, 0x85ed, 0x85ee, 0x85ef, 0x85f0, 0x85f1,
+  0x85f2, 0x85f3, 0x85f4, 0x85f5, 0x85f6, 0x85f7, 0x85f8, 0x85f9,
+  0x85fa, 0x85fb, 0x85fc, 0x85fd, 0x85fe, 0x8640, 0x8641, 0x8642,
+  0x8643, 0x8644, 0x8645, 0x8646, 0x8647, 0x8648, 0x8649, 0x864a,
+  0x864b, 0x864c, 0x864d, 0x864e, 0x864f, 0x8650, 0x8651, 0x8652,
+  0x8653, 0x8654, 0x8655, 0x8656, 0x8657, 0x8658, 0x8659, 0x865a,
+  0x865b, 0x865c, 0x865d, 0x865e, 0x865f, 0x8660, 0x8661, 0x8662,
+  0x8663, 0x8664, 0x8665, 0x8666, 0x8667, 0x8668, 0x8669, 0x866a,
+  0x866b, 0x866c, 0x866d, 0x866e, 0x866f, 0x8670, 0x8671, 0x8672,
+  0x8673, 0x8674, 0x8675, 0x8676, 0x8677, 0x8678, 0x8679, 0x867a,
+  0x867b, 0x867c, 0x867d, 0x867e, 0x86a1, 0x86a2, 0x86a3, 0x86a4,
+  0x86a5, 0x86a6, 0x86a7, 0x86a8, 0x86a9, 0x86aa, 0x86ab, 0x86ac,
+  0x86ad, 0x86ae, 0x86af, 0x86b0, 0x86b1, 0x86b2, 0x86b3, 0x86b4,
+  0x86b5, 0x86b6, 0x86b7, 0x86b8, 0x86b9, 0x86ba, 0x86bb, 0x86bc,
+  0x86bd, 0x86be, 0x86bf, 0x86c0, 0x86c1, 0x86c2, 0x86c3, 0x86c4,
+  0x86c5, 0x86c6, 0x86c7, 0x86c8, 0x86c9, 0x86ca, 0x86cb, 0x86cc,
+  0x86cd, 0x86ce, 0x86cf, 0x86d0, 0x86d1, 0x86d2, 0x86d3, 0x86d4,
+  0x86d5, 0x86d6, 0x86d7, 0x86d8, 0x86d9, 0x86da, 0x86db, 0x86dc,
+  0x86dd, 0x86de, 0x86df, 0x86e0, 0x86e1, 0x86e2, 0x86e3, 0x86e4,
+  0x86e5, 0x86e6, 0x86e7, 0x86e8, 0x86e9, 0x86ea, 0x86eb, 0x86ec,
+  0x86ed, 0x86ee, 0x86ef, 0x86f0, 0x86f1, 0x86f2, 0x86f3, 0x86f4,
+  0x86f5, 0x86f6, 0x86f7, 0x86f8, 0x86f9, 0x86fa, 0x86fb, 0x86fc,
+  0x86fd, 0x86fe, 0x8740, 0x8741, 0x8742, 0x8743, 0x8744, 0x8745,
+  0x8746, 0x8747, 0x8748, 0x8749, 0x874a, 0x874b, 0x874c, 0x874d,
+  0x874e, 0x874f, 0x8750, 0x8751, 0x8752, 0x8753, 0x8754, 0x8755,
+  0x8756, 0x8757, 0x8758, 0x8759, 0x875a, 0x875b, 0x875c, 0x875d,
+  0x875e, 0x875f, 0x8760, 0x8761, 0x8762, 0x8763, 0x8764, 0x8765,
+  0x8766, 0x8767, 0x8768, 0x8769, 0x876a, 0x876b, 0x876c, 0x876d,
+  0x876e, 0x876f, 0x8770, 0x8771, 0x8772, 0x8773, 0x8774, 0x8775,
+  0x8776, 0x8777, 0x8778, 0x8779, 0x877a, 0x877b, 0x877c, 0x877d,
+  0x877e, 0x87a1, 0x87a2, 0x87a3, 0x87a4, 0x87a5, 0x87a6, 0x87a7,
+  0x87a8, 0x87a9, 0x87aa, 0x87ab, 0x87ac, 0x87ad, 0x87ae, 0x87af,
+  0x87b0, 0x87b1, 0x87b2, 0x87b3, 0x87b4, 0x87b5, 0x87b6, 0x87b7,
+  0x87b8, 0x87b9, 0x87ba, 0x87bb, 0x87bc, 0x87bd, 0x87be, 0x87bf,
+  0x87c0, 0x87c1, 0x87c2, 0x87c3, 0x87c4, 0x87c5, 0x87c6, 0x87c7,
+  0x87c8, 0x87c9, 0x87ca, 0x87cb, 0x87cc, 0x87cd, 0x87ce, 0x87cf,
+  0x87d0, 0x87d1, 0x87d2, 0x87d3, 0x87d4, 0x87d5, 0x87d6, 0x87d7,
+  0x87d8, 0x87d9, 0x87da, 0x87db, 0x87dc, 0x87dd, 0x87de, 0x87df,
+  0x87e0, 0x87e1, 0x87e2, 0x87e3, 0x87e4, 0x87e5, 0x87e6, 0x87e7,
+  0x87e8, 0x87e9, 0x87ea, 0x87eb, 0x87ec, 0x87ed, 0x87ee, 0x87ef,
+  0x87f0, 0x87f1, 0x87f2, 0x87f3, 0x87f4, 0x87f5, 0x87f6, 0x87f7,
+  0x87f8, 0x87f9, 0x87fa, 0x87fb, 0x87fc, 0x87fd, 0x87fe, 0x8840,
+  0x8841, 0x8842, 0x8843, 0x8844, 0x8845, 0x8846, 0x8847, 0x8848,
+  0x8849, 0x884a, 0x884b, 0x884c, 0x884d, 0x884e, 0x884f, 0x8850,
+  0x8851, 0x8852, 0x8853, 0x8854, 0x8855, 0x8856, 0x8857, 0x8858,
+  0x8859, 0x885a, 0x885b, 0x885c, 0x885d, 0x885e, 0x885f, 0x8860,
+  0x8861, 0x8862, 0x8863, 0x8864, 0x8865, 0x8866, 0x8867, 0x8868,
+  0x8869, 0x886a, 0x886b, 0x886c, 0x886d, 0x886e, 0x886f, 0x8870,
+  0x8871, 0x8872, 0x8873, 0x8874, 0x8875, 0x8876, 0x8877, 0x8878,
+  0x8879, 0x887a, 0x887b, 0x887c, 0x887d, 0x887e, 0x88a1, 0x88a2,
+  0x88a3, 0x88a4, 0x88a5, 0x88a6, 0x88a7, 0x88a8, 0x88a9, 0x88aa,
+  0x88ab, 0x88ac, 0x88ad, 0x88ae, 0x88af, 0x88b0, 0x88b1, 0x88b2,
+  0x88b3, 0x88b4, 0x88b5, 0x88b6, 0x88b7, 0x88b8, 0x88b9, 0x88ba,
+  0x88bb, 0x88bc, 0x88bd, 0x88be, 0x88bf, 0x88c0, 0x88c1, 0x88c2,
+  0x88c3, 0x88c4, 0x88c5, 0x88c6, 0x88c7, 0x88c8, 0x88c9, 0x88ca,
+  0x88cb, 0x88cc, 0x88cd, 0x88ce, 0x88cf, 0x88d0, 0x88d1, 0x88d2,
+  0x88d3, 0x88d4, 0x88d5, 0x88d6, 0x88d7, 0x88d8, 0x88d9, 0x88da,
+  0x88db, 0x88dc, 0x88dd, 0x88de, 0x88df, 0x88e0, 0x88e1, 0x88e2,
+  0x88e3, 0x88e4, 0x88e5, 0x88e6, 0x88e7, 0x88e8, 0x88e9, 0x88ea,
+  0x88eb, 0x88ec, 0x88ed, 0x88ee, 0x88ef, 0x88f0, 0x88f1, 0x88f2,
+  0x88f3, 0x88f4, 0x88f5, 0x88f6, 0x88f7, 0x88f8, 0x88f9, 0x88fa,
+  0x88fb, 0x88fc, 0x88fd, 0x88fe, 0x8940, 0x8941, 0x8942, 0x8943,
+  0x8944, 0x8945, 0x8946, 0x8947, 0x8948, 0x8949, 0x894a, 0x894b,
+  0x894c, 0x894d, 0x894e, 0x894f, 0x8950, 0x8951, 0x8952, 0x8953,
+  0x8954, 0x8955, 0x8956, 0x8957, 0x8958, 0x8959, 0x895a, 0x895b,
+  0x895c, 0x895d, 0x895e, 0x895f, 0x8960, 0x8961, 0x8962, 0x8963,
+  0x8964, 0x8965, 0x8966, 0x8967, 0x8968, 0x8969, 0x896a, 0x896b,
+  0x896c, 0x896d, 0x896e, 0x896f, 0x8970, 0x8971, 0x8972, 0x8973,
+  0x8974, 0x8975, 0x8976, 0x8977, 0x8978, 0x8979, 0x897a, 0x897b,
+  0x897c, 0x897d, 0x897e, 0x89a1, 0x89a2, 0x89a3, 0x89a4, 0x89a5,
+  0x89a6, 0x89a7, 0x89a8, 0x89a9, 0x89aa, 0x89ab, 0x89ac, 0x89ad,
+  0x89ae, 0x89af, 0x89b0, 0x89b1, 0x89b2, 0x89b3, 0x89b4, 0x89b5,
+  0x89b6, 0x89b7, 0x89b8, 0x89b9, 0x89ba, 0x89bb, 0x89bc, 0x89bd,
+  0x89be, 0x89bf, 0x89c0, 0x89c1, 0x89c2, 0x89c3, 0x89c4, 0x89c5,
+  0x89c6, 0x89c7, 0x89c8, 0x89c9, 0x89ca, 0x89cb, 0x89cc, 0x89cd,
+  0x89ce, 0x89cf, 0x89d0, 0x89d1, 0x89d2, 0x89d3, 0x89d4, 0x89d5,
+  0x89d6, 0x89d7, 0x89d8, 0x89d9, 0x89da, 0x89db, 0x89dc, 0x89dd,
+  0x89de, 0x89df, 0x89e0, 0x89e1, 0x89e2, 0x89e3, 0x89e4, 0x89e5,
+  0x89e6, 0x89e7, 0x89e8, 0x89e9, 0x89ea, 0x89eb, 0x89ec, 0x89ed,
+  0x89ee, 0x89ef, 0x89f0, 0x89f1, 0x89f2, 0x89f3, 0x89f4, 0x89f5,
+  0x89f6, 0x89f7, 0x89f8, 0x89f9, 0x89fa, 0x89fb, 0x89fc, 0x89fd,
+  0x89fe, 0x8a40, 0x8a41, 0x8a42, 0x8a43, 0x8a44, 0x8a45, 0x8a46,
+  0x8a47, 0x8a48, 0x8a49, 0x8a4a, 0x8a4b, 0x8a4c, 0x8a4d, 0x8a4e,
+  0x8a4f, 0x8a50, 0x8a51, 0x8a52, 0x8a53, 0x8a54, 0x8a55, 0x8a56,
+  0x8a57, 0x8a58, 0x8a59, 0x8a5a, 0x8a5b, 0x8a5c, 0x8a5d, 0x8a5e,
+  0x8a5f, 0x8a60, 0x8a61, 0x8a62, 0x8a63, 0x8a64, 0x8a65, 0x8a66,
+  0x8a67, 0x8a68, 0x8a69, 0x8a6a, 0x8a6b, 0x8a6c, 0x8a6d, 0x8a6e,
+  0x8a6f, 0x8a70, 0x8a71, 0x8a72, 0x8a73, 0x8a74, 0x8a75, 0x8a76,
+  0x8a77, 0x8a78, 0x8a79, 0x8a7a, 0x8a7b, 0x8a7c, 0x8a7d, 0x8a7e,
+  0x8aa1, 0x8aa2, 0x8aa3, 0x8aa4, 0x8aa5, 0x8aa6, 0x8aa7, 0x8aa8,
+  0x8aa9, 0x8aaa, 0x8aab, 0x8aac, 0x8aad, 0x8aae, 0x8aaf, 0x8ab0,
+  0x8ab1, 0x8ab2, 0x8ab3, 0x8ab4, 0x8ab5, 0x8ab6, 0x8ab7, 0x8ab8,
+  0x8ab9, 0x8aba, 0x8abb, 0x8abc, 0x8abd, 0x8abe, 0x8abf, 0x8ac0,
+  0x8ac1, 0x8ac2, 0x8ac3, 0x8ac4, 0x8ac5, 0x8ac6, 0x8ac7, 0x8ac8,
+  0x8ac9, 0x8aca, 0x8acb, 0x8acc, 0x8acd, 0x8ace, 0x8acf, 0x8ad0,
+  0x8ad1, 0x8ad2, 0x8ad3, 0x8ad4, 0x8ad5, 0x8ad6, 0x8ad7, 0x8ad8,
+  0x8ad9, 0x8ada, 0x8adb, 0x8adc, 0x8add, 0x8ade, 0x8adf, 0x8ae0,
+  0x8ae1, 0x8ae2, 0x8ae3, 0x8ae4, 0x8ae5, 0x8ae6, 0x8ae7, 0x8ae8,
+  0x8ae9, 0x8aea, 0x8aeb, 0x8aec, 0x8aed, 0x8aee, 0x8aef, 0x8af0,
+  0x8af1, 0x8af2, 0x8af3, 0x8af4, 0x8af5, 0x8af6, 0x8af7, 0x8af8,
+  0x8af9, 0x8afa, 0x8afb, 0x8afc, 0x8afd, 0x8afe, 0x8b40, 0x8b41,
+  0x8b42, 0x8b43, 0x8b44, 0x8b45, 0x8b46, 0x8b47, 0x8b48, 0x8b49,
+  0x8b4a, 0x8b4b, 0x8b4c, 0x8b4d, 0x8b4e, 0x8b4f, 0x8b50, 0x8b51,
+  0x8b52, 0x8b53, 0x8b54, 0x8b55, 0x8b56, 0x8b57, 0x8b58, 0x8b59,
+  0x8b5a, 0x8b5b, 0x8b5c, 0x8b5d, 0x8b5e, 0x8b5f, 0x8b60, 0x8b61,
+  0x8b62, 0x8b63, 0x8b64, 0x8b65, 0x8b66, 0x8b67, 0x8b68, 0x8b69,
+  0x8b6a, 0x8b6b, 0x8b6c, 0x8b6d, 0x8b6e, 0x8b6f, 0x8b70, 0x8b71,
+  0x8b72, 0x8b73, 0x8b74, 0x8b75, 0x8b76, 0x8b77, 0x8b78, 0x8b79,
+  0x8b7a, 0x8b7b, 0x8b7c, 0x8b7d, 0x8b7e, 0x8ba1, 0x8ba2, 0x8ba3,
+  0x8ba4, 0x8ba5, 0x8ba6, 0x8ba7, 0x8ba8, 0x8ba9, 0x8baa, 0x8bab,
+  0x8bac, 0x8bad, 0x8bae, 0x8baf, 0x8bb0, 0x8bb1, 0x8bb2, 0x8bb3,
+  0x8bb4, 0x8bb5, 0x8bb6, 0x8bb7, 0x8bb8, 0x8bb9, 0x8bba, 0x8bbb,
+  0x8bbc, 0x8bbd, 0x8bbe, 0x8bbf, 0x8bc0, 0x8bc1, 0x8bc2, 0x8bc3,
+  0x8bc4, 0x8bc5, 0x8bc6, 0x8bc7, 0x8bc8, 0x8bc9, 0x8bca, 0x8bcb,
+  0x8bcc, 0x8bcd, 0x8bce, 0x8bcf, 0x8bd0, 0x8bd1, 0x8bd2, 0x8bd3,
+  0x8bd4, 0x8bd5, 0x8bd6, 0x8bd7, 0x8bd8, 0x8bd9, 0x8bda, 0x8bdb,
+  0x8bdc, 0x8bdd, 0x8bde, 0x8bdf, 0x8be0, 0x8be1, 0x8be2, 0x8be3,
+  0x8be4, 0x8be5, 0x8be6, 0x8be7, 0x8be8, 0x8be9, 0x8bea, 0x8beb,
+  0x8bec, 0x8bed, 0x8bee, 0x8bef, 0x8bf0, 0x8bf1, 0x8bf2, 0x8bf3,
+  0x8bf4, 0x8bf5, 0x8bf6, 0x8bf7, 0x8bf8, 0x8bf9, 0x8bfa, 0x8bfb,
+  0x8bfc, 0x8bfd, 0x8bfe, 0x8c40, 0x8c41, 0x8c42, 0x8c43, 0x8c44,
+  0x8c45, 0x8c46, 0x8c47, 0x8c48, 0x8c49, 0x8c4a, 0x8c4b, 0x8c4c,
+  0x8c4d, 0x8c4e, 0x8c4f, 0x8c50, 0x8c51, 0x8c52, 0x8c53, 0x8c54,
+  0x8c55, 0x8c56, 0x8c57, 0x8c58, 0x8c59, 0x8c5a, 0x8c5b, 0x8c5c,
+  0x8c5d, 0x8c5e, 0x8c5f, 0x8c60, 0x8c61, 0x8c62, 0x8c63, 0x8c64,
+  0x8c65, 0x8c66, 0x8c67, 0x8c68, 0x8c69, 0x8c6a, 0x8c6b, 0x8c6c,
+  0x8c6d, 0x8c6e, 0x8c6f, 0x8c70, 0x8c71, 0x8c72, 0x8c73, 0x8c74,
+  0x8c75, 0x8c76, 0x8c77, 0x8c78, 0x8c79, 0x8c7a, 0x8c7b, 0x8c7c,
+  0x8c7d, 0x8c7e, 0x8ca1, 0x8ca2, 0x8ca3, 0x8ca4, 0x8ca5, 0x8ca6,
+  0x8ca7, 0x8ca8, 0x8ca9, 0x8caa, 0x8cab, 0x8cac, 0x8cad, 0x8cae,
+  0x8caf, 0x8cb0, 0x8cb1, 0x8cb2, 0x8cb3, 0x8cb4, 0x8cb5, 0x8cb6,
+  0x8cb7, 0x8cb8, 0x8cb9, 0x8cba, 0x8cbb, 0x8cbc, 0x8cbd, 0x8cbe,
+  0x8cbf, 0x8cc0, 0x8cc1, 0x8cc2, 0x8cc3, 0x8cc4, 0x8cc5, 0x8cc6,
+  0x8cc7, 0x8cc8, 0x8cc9, 0x8cca, 0x8ccb, 0x8ccc, 0x8ccd, 0x8cce,
+  0x8ccf, 0x8cd0, 0x8cd1, 0x8cd2, 0x8cd3, 0x8cd4, 0x8cd5, 0x8cd6,
+  0x8cd7, 0x8cd8, 0x8cd9, 0x8cda, 0x8cdb, 0x8cdc, 0x8cdd, 0x8cde,
+  0x8cdf, 0x8ce0, 0x8ce1, 0x8ce2, 0x8ce3, 0x8ce4, 0x8ce5, 0x8ce6,
+  0x8ce7, 0x8ce8, 0x8ce9, 0x8cea, 0x8ceb, 0x8cec, 0x8ced, 0x8cee,
+  0x8cef, 0x8cf0, 0x8cf1, 0x8cf2, 0x8cf3, 0x8cf4, 0x8cf5, 0x8cf6,
+  0x8cf7, 0x8cf8, 0x8cf9, 0x8cfa, 0x8cfb, 0x8cfc, 0x8cfd, 0x8cfe,
+  0x8d40, 0x8d41, 0x8d42, 0x8d43, 0x8d44, 0x8d45, 0x8d46, 0x8d47,
+  0x8d48, 0x8d49, 0x8d4a, 0x8d4b, 0x8d4c, 0x8d4d, 0x8d4e, 0x8d4f,
+  0x8d50, 0x8d51, 0x8d52, 0x8d53, 0x8d54, 0x8d55, 0x8d56, 0x8d57,
+  0x8d58, 0x8d59, 0x8d5a, 0x8d5b, 0x8d5c, 0x8d5d, 0x8d5e, 0x8d5f,
+  0x8d60, 0x8d61, 0x8d62, 0x8d63, 0x8d64, 0x8d65, 0x8d66, 0x8d67,
+  0x8d68, 0x8d69, 0x8d6a, 0x8d6b, 0x8d6c, 0x8d6d, 0x8d6e, 0x8d6f,
+  0x8d70, 0x8d71, 0x8d72, 0x8d73, 0x8d74, 0x8d75, 0x8d76, 0x8d77,
+  0x8d78, 0x8d79, 0x8d7a, 0x8d7b, 0x8d7c, 0x8d7d, 0x8d7e, 0x8da1,
+  0x8da2, 0x8da3, 0x8da4, 0x8da5, 0x8da6, 0x8da7, 0x8da8, 0x8da9,
+  0x8daa, 0x8dab, 0x8dac, 0x8dad, 0x8dae, 0x8daf, 0x8db0, 0x8db1,
+  0x8db2, 0x8db3, 0x8db4, 0x8db5, 0x8db6, 0x8db7, 0x8db8, 0x8db9,
+  0x8dba, 0x8dbb, 0x8dbc, 0x8dbd, 0x8dbe, 0x8dbf, 0x8dc0, 0x8dc1,
+  0x8dc2, 0x8dc3, 0x8dc4, 0x8dc5, 0x8dc6, 0x8dc7, 0x8dc8, 0x8dc9,
+  0x8dca, 0x8dcb, 0x8dcc, 0x8dcd, 0x8dce, 0x8dcf, 0x8dd0, 0x8dd1,
+  0x8dd2, 0x8dd3, 0x8dd4, 0x8dd5, 0x8dd6, 0x8dd7, 0x8dd8, 0x8dd9,
+  0x8dda, 0x8ddb, 0x8ddc, 0x8ddd, 0x8dde, 0x8ddf, 0x8de0, 0x8de1,
+  0x8de2, 0x8de3, 0x8de4, 0x8de5, 0x8de6, 0x8de7, 0x8de8, 0x8de9,
+  0x8dea, 0x8deb, 0x8dec, 0x8ded, 0x8dee, 0x8def, 0x8df0, 0x8df1,
+  0x8df2, 0x8df3, 0x8df4, 0x8df5, 0x8df6, 0x8df7, 0x8df8, 0x8df9,
+  0x8dfa, 0x8dfb, 0x8dfc, 0x8dfd, 0x8dfe, 0xc6a1, 0xc6a2, 0xc6a3,
+  0xc6a4, 0xc6a5, 0xc6a6, 0xc6a7, 0xc6a8, 0xc6a9, 0xc6aa, 0xc6ab,
+  0xc6ac, 0xc6ad, 0xc6ae, 0xc6af, 0xc6b0, 0xc6b1, 0xc6b2, 0xc6b3,
+  0xc6b4, 0xc6b5, 0xc6b6, 0xc6b7, 0xc6b8, 0xc6b9, 0xc6ba, 0xc6bb,
+  0xc6bc, 0xc6bd, 0xc6be, 0xc6bf, 0xc6c0, 0xc6c1, 0xc6c2, 0xc6c3,
+  0xc6c4, 0xc6c5, 0xc6c6, 0xc6c7, 0xc6c8, 0xc6c9, 0xc6ca, 0xc6cb,
+  0xc6cc, 0xc6cd, 0xc6ce, 0xc6cf, 0xc6d0, 0xc6d1, 0xc6d2, 0xc6d3,
+  0xc6d4, 0xc6d5, 0xc6d6, 0xc6d7, 0xc6d8, 0xc6d9, 0xc6da, 0xc6db,
+  0xc6dc, 0xc6dd, 0xc6de, 0xc6df, 0xc6e0, 0xc6e1, 0xc6e2, 0xc6e3,
+  0xc6e4, 0xc6e5, 0xc6e6, 0xc6e7, 0xc6e8, 0xc6e9, 0xc6ea, 0xc6eb,
+  0xc6ec, 0xc6ed, 0xc6ee, 0xc6ef, 0xc6f0, 0xc6f1, 0xc6f2, 0xc6f3,
+  0xc6f4, 0xc6f5, 0xc6f6, 0xc6f7, 0xc6f8, 0xc6f9, 0xc6fa, 0xc6fb,
+  0xc6fc, 0xc6fd, 0xc6fe, 0xc740, 0xc741, 0xc742, 0xc743, 0xc744,
+  0xc745, 0xc746, 0xc747, 0xc748, 0xc749, 0xc74a, 0xc74b, 0xc74c,
+  0xc74d, 0xc74e, 0xc74f, 0xc750, 0xc751, 0xc752, 0xc753, 0xc754,
+  0xc755, 0xc756, 0xc757, 0xc758, 0xc759, 0xc75a, 0xc75b, 0xc75c,
+  0xc75d, 0xc75e, 0xc75f, 0xc760, 0xc761, 0xc762, 0xc763, 0xc764,
+  0xc765, 0xc766, 0xc767, 0xc768, 0xc769, 0xc76a, 0xc76b, 0xc76c,
+  0xc76d, 0xc76e, 0xc76f, 0xc770, 0xc771, 0xc772, 0xc773, 0xc774,
+  0xc775, 0xc776, 0xc777, 0xc778, 0xc779, 0xc77a, 0xc77b, 0xc77c,
+  0xc77d, 0xc77e, 0xc7a1, 0xc7a2, 0xc7a3, 0xc7a4, 0xc7a5, 0xc7a6,
+  0xc7a7, 0xc7a8, 0xc7a9, 0xc7aa, 0xc7ab, 0xc7ac, 0xc7ad, 0xc7ae,
+  0xc7af, 0xc7b0, 0xc7b1, 0xc7b2, 0xc7b3, 0xc7b4, 0xc7b5, 0xc7b6,
+  0xc7b7, 0xc7b8, 0xc7b9, 0xc7ba, 0xc7bb, 0xc7bc, 0xc7bd, 0xc7be,
+  0xc7bf, 0xc7c0, 0xc7c1, 0xc7c2, 0xc7c3, 0xc7c4, 0xc7c5, 0xc7c6,
+  0xc7c7, 0xc7c8, 0xc7c9, 0xc7ca, 0xc7cb, 0xc7cc, 0xc7cd, 0xc7ce,
+  0xc7cf, 0xc7d0, 0xc7d1, 0xc7d2, 0xc7d3, 0xc7d4, 0xc7d5, 0xc7d6,
+  0xc7d7, 0xc7d8, 0xc7d9, 0xc7da, 0xc7db, 0xc7dc, 0xc7dd, 0xc7de,
+  0xc7df, 0xc7e0, 0xc7e1, 0xc7e2, 0xc7e3, 0xc7e4, 0xc7e5, 0xc7e6,
+  0xc7e7, 0xc7e8, 0xc7e9, 0xc7ea, 0xc7eb, 0xc7ec, 0xc7ed, 0xc7ee,
+  0xc7ef, 0xc7f0, 0xc7f1, 0xc7f2, 0xc7f3, 0xc7f4, 0xc7f5, 0xc7f6,
+  0xc7f7, 0xc7f8, 0xc7f9, 0xc7fa, 0xc7fb, 0xc7fc, 0xc7fd, 0xc7fe,
+  0xc840, 0xc841, 0xc842, 0xc843, 0xc844, 0xc845, 0xc846, 0xc847,
+  0xc848, 0xc849, 0xc84a, 0xc84b, 0xc84c, 0xc84d, 0xc84e, 0xc84f,
+  0xc850, 0xc851, 0xc852, 0xc853, 0xc854, 0xc855, 0xc856, 0xc857,
+  0xc858, 0xc859, 0xc85a, 0xc85b, 0xc85c, 0xc85d, 0xc85e, 0xc85f,
+  0xc860, 0xc861, 0xc862, 0xc863, 0xc864, 0xc865, 0xc866, 0xc867,
+  0xc868, 0xc869, 0xc86a, 0xc86b, 0xc86c, 0xc86d, 0xc86e, 0xc86f,
+  0xc870, 0xc871, 0xc872, 0xc873, 0xc874, 0xc875, 0xc876, 0xc877,
+  0xc878, 0xc879, 0xc87a, 0xc87b, 0xc87c, 0xc87d, 0xc87e, 0xc8a1,
+  0xc8a2, 0xc8a3, 0xc8a4, 0xc8a5, 0xc8a6, 0xc8a7, 0xc8a8, 0xc8a9,
+  0xc8aa, 0xc8ab, 0xc8ac, 0xc8ad, 0xc8ae, 0xc8af, 0xc8b0, 0xc8b1,
+  0xc8b2, 0xc8b3, 0xc8b4, 0xc8b5, 0xc8b6, 0xc8b7, 0xc8b8, 0xc8b9,
+  0xc8ba, 0xc8bb, 0xc8bc, 0xc8bd, 0xc8be, 0xc8bf, 0xc8c0, 0xc8c1,
+  0xc8c2, 0xc8c3, 0xc8c4, 0xc8c5, 0xc8c6, 0xc8c7, 0xc8c8, 0xc8c9,
+  0xc8ca, 0xc8cb, 0xc8cc, 0xc8cd, 0xc8ce, 0xc8cf, 0xc8d0, 0xc8d1,
+  0xc8d2, 0xc8d3, 0xc8d4, 0xc8d5, 0xc8d6, 0xc8d7, 0xc8d8, 0xc8d9,
+  0xc8da, 0xc8db, 0xc8dc, 0xc8dd, 0xc8de, 0xc8df, 0xc8e0, 0xc8e1,
+  0xc8e2, 0xc8e3, 0xc8e4, 0xc8e5, 0xc8e6, 0xc8e7, 0xc8e8, 0xc8e9,
+  0xc8ea, 0xc8eb, 0xc8ec, 0xc8ed, 0xc8ee, 0xc8ef, 0xc8f0, 0xc8f1,
+  0xc8f2, 0xc8f3, 0xc8f4, 0xc8f5, 0xc8f6, 0xc8f7, 0xc8f8, 0xc8f9,
+  0xc8fa, 0xc8fb, 0xc8fc, 0xc8fd, 0xc8fe, 0xb05a, 0xa7f3, 0xa8ae,
+  0xb8eb, 0xb7c6, 0xa6ea, 0xa579, 0x8bf8, 0xc074, 0xabb4, 0xaaf7,
+  0xb3e2, 0xa960, 0xc369, 0xc4ee, 0xc3b9, 0xc5da, 0xc1b3, 0xbb72,
+  0xc5de, 0xbcd6, 0xaca5, 0xaf4f, 0xaf5f, 0xb8a8, 0xb954, 0xc064,
+  0xb6c3, 0xa75a, 0xc4e6, 0xc4ea, 0xc4f5, 0xc67d, 0xb450, 0xc0dd,
+  0xc2c5, 0xc4b0, 0xa9d4, 0xc3be, 0xc4fa, 0xb459, 0xaed4, 0xaef6,
+  0xaf54, 0xa8d3, 0xa74e, 0xb3d2, 0xbedb, 0xc372, 0xc46c, 0xbf63,
+  0xa6d1, 0xc4aa, 0xb8b8, 0xb8f4, 0xc553, 0xbe7c, 0xc64f, 0xb84c,
+  0xb853, 0xbaf1, 0xdb77, 0xbffd, 0xb3c0, 0xbdd7, 0xc362, 0xa7cb,
+  0xc5a2, 0xc5a4, 0xa863, 0xbd55, 0xb8ef, 0xb970, 0xc253, 0xb9f0,
+  0xbcd3, 0xb25c, 0xba7c, 0xb2d6, 0xc15c, 0xadae, 0xb0c7, 0xa6d8,
+  0xbbfe, 0xade2, 0xb857, 0xbaf0, 0xb5d9, 0xb3ae, 0xc5aa, 0xced4,
+  0xbcd6, 0xbfd5, 0xa4a6, 0xb9e7, 0xabe3, 0xb276, 0xb2a7, 0xa55f,
+  0xeda8, 0xab4b, 0xb45f, 0xa4a3, 0xaa63, 0xbcc6, 0xafc1, 0xb0d1,
+  0xb6eb, 0xacd9, 0xb8ad, 0xbba1, 0xb1fe, 0xa8b0, 0xa848, 0xac42,
+  0xad59, 0xb1b0, 0xb2a4, 0xab47, 0xa8e2, 0xb1e7, 0xc2b3, 0xa87d,
+  0xbdcc, 0xb671, 0xc079, 0xa766, 0xa46b, 0xc366, 0xaec8, 0xc26f,
+  0xc472, 0xbe5b, 0xc67a, 0xc452, 0xbea4, 0xa44f, 0xbee4, 0xbefa,
+  0xf765, 0xa67e, 0xbca6, 0xc5ca, 0xbcbf, 0xbaa7, 0xb7d2, 0xe6a3,
+  0xbd6d, 0xc170, 0xbdfb, 0xbdac, 0xb373, 0xc1e5, 0xa643, 0xa648,
+  0xab7c, 0xaf50, 0xb5f5, 0xbba1, 0xb747, 0xa9c0, 0xb1c9, 0xc0d4,
+  0xc3ae, 0xc279, 0xa54f, 0xcbf1, 0xb9e7, 0xc0ad, 0xccb0, 0xacc2,
+  0xbcfc, 0xb2dc, 0xb2e2, 0xb961, 0xb973, 0xc646, 0xbbe2, 0xa8d2,
+  0xc2a7, 0xc4bf, 0xc1f5, 0xb463, 0xa446, 0xb9b1, 0xbc64, 0xa7bf,
+  0xaec6, 0xbcd6, 0xbf52, 0xc0f8, 0xe764, 0xbff1, 0xc073, 0xb777,
+  0xa8bf, 0xbc42, 0xccd8, 0xac68, 0xac79, 0xb7c8, 0xaf5b, 0xaf64,
+  0xb2b8, 0xafc3, 0xc3fe, 0xa4bb, 0xbcae, 0xb3b0, 0xaddb, 0xb15b,
+  0xb25f, 0xbdfc, 0xabdf, 0xb758, 0xaedf, 0xb276, 0xb6a9, 0xa751,
+  0xa64f, 0xbc69, 0xa9f6, 0xa7f5, 0xb1f9, 0xaa64, 0xb27a, 0xb567,
+  0xbfa9, 0xb8cc, 0xa8bd, 0xc2f7, 0xb0ce, 0xb7c4, 0xa75b, 0xbf4d,
+  0xbf5a, 0xc4a9, 0xc5ec, 0xc5ef, 0xaa4c, 0xb24f, 0xc17b, 0xa5df,
+  0xb2c1, 0xb2c9, 0xaaac, 0xaaa5, 0xc3d1, 0xa4b0, 0xaff9, 0xa8eb,
+  0xa4c1, 0xabd7, 0xa9dd, 0xbf7d, 0xa676, 0xac7d, 0xbcc9, 0xbfe7,
+  0xa6e6, 0xadb0, 0xa8a3, 0xb9f8, 0xc94a, 0xddfc, 0xb6ef, 0xb4b8,
+  0xe8f9, 0xbdde, 0xaf71, 0xafab, 0xb2bb, 0xbad6, 0xb974, 0xbaeb,
+  0xa6d0, 0xbdd1, 0xb668, 0xb3a3, 0xb6ba, 0xb97d, 0xc05d, 0xc562,
+  0xa14a, 0xa157, 0xa159, 0xa15b, 0xa15f, 0xa160, 0xa163, 0xa164,
+  0xa167, 0xa168, 0xa16b, 0xa16c, 0xa16f, 0xa170, 0xa173, 0xa174,
+  0xa177, 0xa178, 0xa17b, 0xa17c, 0xa1c6, 0xa1c7, 0xa1ca, 0xa1cb,
+  0xa1c8, 0xa1c9, 0xa15c, 0xa14d, 0xa14e, 0xa14f, 0xa151, 0xa152,
+  0xa153, 0xa154, 0xa17d, 0xa17e, 0xa1a1, 0xa1a2, 0xa1a3, 0xa1a4,
+  0xa1cc, 0xa1cd, 0xa1ce, 0xa1de, 0xa1df, 0xa1e0, 0xa1e1, 0xa1e2,
+  0xa242, 0xa24c, 0xa24d, 0xa24e, 0xa149, 0xc8d0, 0xa1ad, 0xa243,
+  0xa248, 0xa1ae, 0xc8cf, 0xa15d, 0xa15e, 0xa1af, 0xa1cf, 0xa141,
+  0xa1d0, 0xa144, 0xa1fe, 0xa2af, 0xa2b0, 0xa2b1, 0xa2b2, 0xa2b3,
+  0xa2b4, 0xa2b5, 0xa2b6, 0xa2b7, 0xa2b8, 0xa147, 0xa146, 0xa1d5,
+  0xa1d7, 0xa1d6, 0xa148, 0xa249, 0xa2cf, 0xa2d0, 0xa2d1, 0xa2d2,
+  0xa2d3, 0xa2d4, 0xa2d5, 0xa2d6, 0xa2d7, 0xa2d8, 0xa2d9, 0xa2da,
+  0xa2db, 0xa2dc, 0xa2dd, 0xa2de, 0xa2df, 0xa2e0, 0xa2e1, 0xa2e2,
+  0xa2e3, 0xa2e4, 0xa2e5, 0xa2e6, 0xa2e7, 0xa2e8, 0xc6e4, 0xa240,
+  0xc6e5, 0xa173, 0xa1c4, 0xa1a5, 0xa2e9, 0xa2ea, 0xa2eb, 0xa2ec,
+  0xa2ed, 0xa2ee, 0xa2ef, 0xa2f0, 0xa2f1, 0xa2f2, 0xa2f3, 0xa2f4,
+  0xa2f5, 0xa2f6, 0xa2f7, 0xa2f8, 0xa2f9, 0xa2fa, 0xa2fb, 0xa2fc,
+  0xa2fd, 0xa2fe, 0xa340, 0xa341, 0xa342, 0xa343, 0xa161, 0xa155,
+  0xa162, 0xa1e3, 0xa14e, 0xa246, 0xa247, 0xc8cd, 0xa1c3, 0xc8ce,
+  0xa244, 0xf9fe,
+};
+
+static const Summary16 big5hkscs_uni2indx_page00[16] = {
+  /* 0x0000 */
+  {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 },
+  {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 },
+  {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x81ac }, {    6, 0x01b3 },
+  {   12, 0x0703 }, {   17, 0x008c }, {   20, 0x3703 }, {   27, 0x178c },
+};
+static const Summary16 big5hkscs_uni2indx_page02[29] = {
+  /* 0x0200 */
+  {   56, 0x0000 }, {   56, 0x0000 }, {   56, 0x0000 }, {   56, 0x0000 },
+  {   56, 0x0000 }, {   56, 0x0813 }, {   60, 0x0402 }, {   62, 0x0020 },
+  {   63, 0x0408 }, {   65, 0x0000 }, {   65, 0x0000 }, {   65, 0x0000 },
+  {   65, 0x2ec0 }, {   71, 0x0200 }, {   72, 0x0000 }, {   72, 0x0000 },
+  /* 0x0300 */
+  {   72, 0x0020 }, {   73, 0x0000 }, {   73, 0x0000 }, {   73, 0x0000 },
+  {   73, 0x0000 }, {   73, 0x0000 }, {   73, 0x0000 }, {   73, 0x0000 },
+  {   73, 0x0000 }, {   73, 0xfffe }, {   88, 0x03fb }, {   97, 0xfffe },
+  {  112, 0x03fb },
+};
+static const Summary16 big5hkscs_uni2indx_page20[44] = {
+  /* 0x2000 */
+  {  191, 0x0000 }, {  191, 0x3378 }, {  199, 0x00f4 }, {  204, 0x482c },
+  {  209, 0x0000 }, {  209, 0x0000 }, {  209, 0x0000 }, {  209, 0x0000 },
+  {  209, 0x0000 }, {  209, 0x0000 }, {  209, 0x0000 }, {  209, 0x0000 },
+  {  209, 0x0000 }, {  209, 0x0000 }, {  209, 0x0000 }, {  209, 0x0000 },
+  /* 0x2100 */
+  {  209, 0x0228 }, {  212, 0x0040 }, {  213, 0x0002 }, {  214, 0x0000 },
+  {  214, 0x0000 }, {  214, 0x0000 }, {  214, 0x03ff }, {  224, 0x03ff },
+  {  234, 0x0000 }, {  234, 0x03cf }, {  242, 0x0000 }, {  242, 0x0300 },
+  {  244, 0x0000 }, {  244, 0x0000 }, {  244, 0x0080 }, {  245, 0x0000 },
+  /* 0x2200 */
+  {  245, 0x0000 }, {  245, 0xc560 }, {  251, 0x4e29 }, {  258, 0x0030 },
+  {  260, 0x0000 }, {  260, 0x0004 }, {  261, 0x00cb }, {  266, 0x0000 },
+  {  266, 0x0000 }, {  266, 0x0220 }, {  268, 0x0020 }, {  269, 0x8000 },
+};
+static const Summary16 big5hkscs_uni2indx_page25[21] = {
+  /* 0x2500 */
+  {  291, 0x1005 }, {  294, 0x1111 }, {  298, 0x1010 }, {  300, 0x1010 },
+  {  302, 0x0000 }, {  302, 0xffff }, {  318, 0xffff }, {  334, 0x001f },
+  {  339, 0xfffe }, {  354, 0x0038 }, {  357, 0x0003 }, {  359, 0x300c },
+  {  363, 0xc8c0 }, {  368, 0x0000 }, {  368, 0x003c }, {  372, 0x0000 },
+  /* 0x2600 */
+  {  372, 0x0260 }, {  375, 0x0000 }, {  375, 0x0000 }, {  375, 0x0000 },
+  {  375, 0x0007 },
+};
+static const Summary16 big5hkscs_uni2indx_page30[62] = {
+  /* 0x3000 */
+  {  408, 0xffef }, {  423, 0x7037 }, {  431, 0x03fe }, {  440, 0x0001 },
+  {  441, 0xfffe }, {  456, 0xffff }, {  472, 0xffff }, {  488, 0xffff },
+  {  504, 0xffff }, {  520, 0x780f }, {  528, 0xfffe }, {  543, 0xffff },
+  {  559, 0xffff }, {  575, 0xffff }, {  591, 0xffff }, {  607, 0x707f },
+  /* 0x3100 */
+  {  617, 0xffe0 }, {  628, 0xffff }, {  644, 0x03ff }, {  654, 0x0000 },
+  {  654, 0x0000 }, {  654, 0x0000 }, {  654, 0x0000 }, {  654, 0x0000 },
+  {  654, 0x0000 }, {  654, 0xfffc }, {  668, 0x0000 }, {  668, 0x0000 },
+  {  668, 0x0000 }, {  668, 0x0000 }, {  668, 0x0000 }, {  668, 0x0000 },
+  /* 0x3200 */
+  {  668, 0x0000 }, {  668, 0x0000 }, {  668, 0xffff }, {  684, 0xffff },
+  {  700, 0x000f }, {  704, 0x0000 }, {  704, 0x0000 }, {  704, 0x0000 },
+  {  704, 0xffff }, {  720, 0xffff }, {  736, 0xffff }, {  752, 0x0001 },
+  {  753, 0x0000 }, {  753, 0x0000 }, {  753, 0x0000 }, {  753, 0x0000 },
+  /* 0x3300 */
+  {  753, 0x0000 }, {  753, 0x0000 }, {  753, 0x0000 }, {  753, 0x0000 },
+  {  753, 0x0000 }, {  753, 0x0000 }, {  753, 0x0000 }, {  753, 0x0000 },
+  {  753, 0xc000 }, {  755, 0x7000 }, {  758, 0x0002 }, {  759, 0x0000 },
+  {  759, 0x4010 }, {  761, 0x0026 },
+};
+static const Summary16 big5hkscs_uni2indx_page4e[1307] = {
+  /* 0x4e00 */
+  { 1275, 0xff9b }, { 1288, 0xd773 }, { 1299, 0xfd52 }, { 1309, 0xbbcf },
+  { 1321, 0xebac }, { 1331, 0xff4c }, { 1342, 0x0600 }, { 1344, 0xc108 },
+  { 1348, 0x7bff }, { 1362, 0xcf3e }, { 1373, 0x797f }, { 1385, 0x9ec8 },
+  { 1393, 0x6fdf }, { 1406, 0xf7f0 }, { 1417, 0x4f3a }, { 1426, 0xa9ff },
+  /* 0x4f00 */
+  { 1438, 0xef3f }, { 1451, 0x27bf }, { 1462, 0xb304 }, { 1468, 0xffdd },
+  { 1482, 0xfbee }, { 1495, 0xffff }, { 1511, 0xde9f }, { 1523, 0xfffd },
+  { 1538, 0xafff }, { 1552, 0x7df7 }, { 1565, 0xc904 }, { 1570, 0xaeed },
+  { 1581, 0xffbf }, { 1596, 0xffdb }, { 1610, 0xd033 }, { 1617, 0x67ff },
+  /* 0x5000 */
+  { 1630, 0xfbe9 }, { 1642, 0xdffe }, { 1656, 0xffef }, { 1671, 0x18bb },
+  { 1679, 0xffeb }, { 1693, 0xfdea }, { 1705, 0xff7f }, { 1720, 0x24fd },
+  { 1729, 0x79af }, { 1740, 0x7f77 }, { 1753, 0xf04c }, { 1760, 0xfdff },
+  { 1775, 0xeff6 }, { 1788, 0xaefb }, { 1800, 0xf7fb }, { 1814, 0xfb7b },
+  /* 0x5100 */
+  { 1827, 0x7fff }, { 1842, 0x95bf }, { 1853, 0x6e77 }, { 1864, 0xbfbf },
+  { 1878, 0x3bfb }, { 1890, 0xfef4 }, { 1902, 0x7faf }, { 1915, 0x13f2 },
+  { 1923, 0xa7c5 }, { 1932, 0x55fe }, { 1943, 0x5db5 }, { 1953, 0x73ff },
+  { 1966, 0xfff8 }, { 1979, 0xf99f }, { 1991, 0x2017 }, { 1996, 0x777b },
+  /* 0x5200 */
+  { 2008, 0x5fef }, { 2021, 0xf0cf }, { 2031, 0x47f3 }, { 2041, 0x1dff },
+  { 2053, 0x7eda }, { 2064, 0xfef4 }, { 2076, 0xff07 }, { 2087, 0xbfbc },
+  { 2099, 0xbf9f }, { 2112, 0x8fdb }, { 2123, 0x7f5b }, { 2135, 0x5a20 },
+  { 2140, 0x32af }, { 2149, 0xebef }, { 2162, 0x8a5f }, { 2171, 0xdfbb },
+  /* 0x5300 */
+  { 2184, 0xef62 }, { 2194, 0xb6e7 }, { 2205, 0xb49f }, { 2215, 0xfb9f },
+  { 2228, 0x77bf }, { 2241, 0xf49e }, { 2251, 0xf2db }, { 2262, 0xfbbf },
+  { 2276, 0xc414 }, { 2281, 0xf7dc }, { 2293, 0x7ff5 }, { 2306, 0x0a55 },
+  { 2312, 0x3f2e }, { 2322, 0x8fd7 }, { 2333, 0xff7f }, { 2348, 0x59ef },
+  /* 0x5400 */
+  { 2359, 0xffda }, { 2372, 0xff5f }, { 2386, 0xfffb }, { 2401, 0x7bff },
+  { 2415, 0xedef }, { 2428, 0x0010 }, { 2429, 0xbfff }, { 2444, 0xfdff },
+  { 2459, 0xf9f7 }, { 2472, 0x55ff }, { 2484, 0xffff }, { 2500, 0xffdf },
+  { 2515, 0xfbff }, { 2530, 0x4441 }, { 2534, 0xefff }, { 2549, 0xbd8e },
+  /* 0x5500 */
+  { 2559, 0xfffe }, { 2574, 0x459f }, { 2583, 0xfde8 }, { 2594, 0xdbff },
+  { 2608, 0xeffb }, { 2622, 0xf0ef }, { 2633, 0x0e7e }, { 2642, 0xfaee },
+  { 2654, 0xffdf }, { 2669, 0xb73f }, { 2681, 0x7ffe }, { 2695, 0x9e3f },
+  { 2706, 0xffff }, { 2722, 0xffff }, { 2738, 0x97fe }, { 2750, 0xfee7 },
+  /* 0x5600 */
+  { 2763, 0xf377 }, { 2775, 0xf8ff }, { 2788, 0xf6af }, { 2800, 0xeffd },
+  { 2814, 0xf76f }, { 2827, 0x679d }, { 2837, 0xff7f }, { 2852, 0xdfdf },
+  { 2866, 0xfeff }, { 2881, 0xf7ad }, { 2893, 0xfdf2 }, { 2905, 0xf2fe },
+  { 2917, 0x3f6f }, { 2929, 0xecda }, { 2939, 0xecb7 }, { 2950, 0xa683 },
+  /* 0x5700 */
+  { 2957, 0x3f9f }, { 2969, 0xfd7c }, { 2981, 0xf70d }, { 2991, 0xe81d },
+  { 2999, 0xfeef }, { 3013, 0x8897 }, { 3020, 0xafd6 }, { 3031, 0xfcff },
+  { 3045, 0xbd0d }, { 3054, 0xffb9 }, { 3067, 0x44bf }, { 3076, 0xff70 },
+  { 3087, 0xd9de }, { 3098, 0xf0b5 }, { 3107, 0xf2ff }, { 3120, 0x7fff },
+  /* 0x5800 */
+  { 3135, 0x7fff }, { 3150, 0x7a15 }, { 3158, 0xf7ff }, { 3173, 0xafff },
+  { 3187, 0xff91 }, { 3198, 0xffbe }, { 3212, 0xbb3c }, { 3222, 0xfe7e },
+  { 3235, 0xcfef }, { 3248, 0xf71f }, { 3260, 0xdfeb }, { 3273, 0xfc6b },
+  { 3284, 0xcbe6 }, { 3294, 0xff7f }, { 3309, 0x9b9d }, { 3319, 0xfe1d },
+  /* 0x5900 */
+  { 3330, 0xf4fc }, { 3341, 0x96f6 }, { 3351, 0xfeb5 }, { 3363, 0x5196 },
+  { 3370, 0xc7b1 }, { 3379, 0x15bb }, { 3388, 0x6ea7 }, { 3398, 0xfbff },
+  { 3413, 0xe63f }, { 3424, 0xe7dd }, { 3436, 0xd1ff }, { 3448, 0x7fff },
+  { 3463, 0xfffb }, { 3478, 0x7f5f }, { 3491, 0xff7b }, { 3505, 0xffff },
+  /* 0x5a00 */
+  { 3521, 0xbe0f }, { 3531, 0xdfee }, { 3544, 0x7ebb }, { 3556, 0x73e8 },
+  { 3565, 0x37ff }, { 3578, 0xffff }, { 3594, 0x7fff }, { 3609, 0xff83 },
+  { 3620, 0xdd5e }, { 3631, 0xfeff }, { 3646, 0xdae7 }, { 3657, 0xffff },
+  { 3673, 0xffdf }, { 3688, 0xffe8 }, { 3700, 0x7f7f }, { 3714, 0xeffd },
+  /* 0x5b00 */
+  { 3728, 0xbbae }, { 3739, 0xeefb }, { 3752, 0xfdfb }, { 3766, 0xf115 },
+  { 3774, 0xfdfb }, { 3788, 0xbdfb }, { 3801, 0x7b7c }, { 3812, 0xbdff },
+  { 3826, 0xdbbf }, { 3839, 0xffed }, { 3853, 0x75fc }, { 3864, 0x8379 },
+  { 3872, 0x7cff }, { 3885, 0xc3ff }, { 3897, 0xdfff }, { 3912, 0x856f },
+  /* 0x5c00 */
+  { 3921, 0xffba }, { 3934, 0xd47f }, { 3945, 0x153d }, { 3953, 0xdf8b },
+  { 3964, 0xfff3 }, { 3978, 0x737b }, { 3989, 0xf7bd }, { 4002, 0x5e1a },
+  { 4010, 0xbf60 }, { 4019, 0xf63f }, { 4031, 0xffff }, { 4047, 0x05eb },
+  { 4055, 0xdfc6 }, { 4066, 0xcfdf }, { 4079, 0xf720 }, { 4087, 0xabf3 },
+  /* 0x5d00 */
+  { 4098, 0xf8c3 }, { 4107, 0xeff7 }, { 4121, 0xd3fd }, { 4133, 0xf7ff },
+  { 4148, 0x5fef }, { 4161, 0x4ae7 }, { 4170, 0x9bac }, { 4179, 0xfe97 },
+  { 4191, 0x6ff7 }, { 4204, 0xf6bc }, { 4215, 0xff97 }, { 4228, 0x37f7 },
+  { 4240, 0xaacf }, { 4250, 0xe9f6 }, { 4261, 0x49e7 }, { 4270, 0xe2bf },
+  /* 0x5e00 */
+  { 4281, 0x5e5c }, { 4290, 0xaff6 }, { 4302, 0x6b3f }, { 4313, 0x61d8 },
+  { 4320, 0xfd3f }, { 4333, 0xfbb8 }, { 4344, 0xffcf }, { 4358, 0xff7d },
+  { 4372, 0xbfdd }, { 4385, 0x1ee4 }, { 4393, 0x7dfd }, { 4406, 0x63ff },
+  { 4418, 0x7ff6 }, { 4431, 0xffff }, { 4447, 0xd3ef }, { 4459, 0xdfde },
+  /* 0x5f00 */
+  { 4472, 0xfdb6 }, { 4484, 0xadbc }, { 4494, 0x63fc }, { 4504, 0x15eb },
+  { 4513, 0xff59 }, { 4525, 0x33d3 }, { 4534, 0xbebe }, { 4546, 0xfbdf },
+  { 4560, 0x1fef }, { 4572, 0xdbc7 }, { 4583, 0xfff3 }, { 4597, 0xfee6 },
+  { 4609, 0xb23f }, { 4619, 0xebf7 }, { 4632, 0xed3b }, { 4643, 0xadba },
+  /* 0x6000 */
+  { 4653, 0xfe01 }, { 4661, 0x7eff }, { 4675, 0xffff }, { 4691, 0x0abe },
+  { 4699, 0x36ff }, { 4711, 0xef3d }, { 4723, 0xfffc }, { 4737, 0xc0a5 },
+  { 4743, 0x77fb }, { 4756, 0xfcf5 }, { 4768, 0x019d }, { 4774, 0xffff },
+  { 4790, 0xfffb }, { 4805, 0xffba }, { 4818, 0x03df }, { 4827, 0xffff },
+  /* 0x6100 */
+  { 4843, 0xfffb }, { 4858, 0xbf7d }, { 4871, 0xdb8c }, { 4880, 0xe8d5 },
+  { 4889, 0xfff7 }, { 4904, 0xff7d }, { 4918, 0xddff }, { 4932, 0x76ff },
+  { 4945, 0x7e8f }, { 4956, 0xbf7f }, { 4970, 0xff96 }, { 4982, 0xd7ff },
+  { 4996, 0xbfef }, { 5010, 0xc549 }, { 5017, 0x6ffd }, { 5030, 0xffe7 },
+  /* 0x6200 */
+  { 5044, 0x779b }, { 5055, 0x8e77 }, { 5065, 0x7ebf }, { 5078, 0xe6dd },
+  { 5089, 0x7fcf }, { 5102, 0x5f1f }, { 5113, 0xe17f }, { 5124, 0xfedf },
+  { 5138, 0xd7ff }, { 5152, 0x21ff }, { 5162, 0xff50 }, { 5172, 0xfb7b },
+  { 5185, 0xfffc }, { 5199, 0x9fff }, { 5213, 0xf820 }, { 5219, 0xffff },
+  /* 0x6300 */
+  { 5235, 0xfb8f }, { 5247, 0x017b }, { 5254, 0xff00 }, { 5262, 0x7ffe },
+  { 5276, 0xffff }, { 5292, 0x07f3 }, { 5301, 0xfbb0 }, { 5311, 0xbfe7 },
+  { 5324, 0xffbf }, { 5339, 0xfbd7 }, { 5352, 0xffbf }, { 5367, 0x6203 },
+  { 5372, 0xffff }, { 5388, 0xffef }, { 5403, 0xefff }, { 5418, 0x5b7f },
+  /* 0x6400 */
+  { 5430, 0xfec0 }, { 5439, 0xddfd }, { 5452, 0xfdff }, { 5467, 0xeffd },
+  { 5481, 0x680b }, { 5487, 0xff1f }, { 5500, 0xfbe3 }, { 5512, 0xbfff },
+  { 5527, 0xbfa4 }, { 5537, 0xf7ef }, { 5551, 0xfa7d }, { 5563, 0xf85f },
+  { 5574, 0xeebf }, { 5587, 0x2fdd }, { 5598, 0xbfff }, { 5613, 0xfd9f },
+  /* 0x6500 */
+  { 5626, 0xf6db }, { 5638, 0xfbfb }, { 5652, 0xfe7f }, { 5666, 0xebfd },
+  { 5679, 0xa76a }, { 5688, 0xf3fa }, { 5700, 0xbdfc }, { 5712, 0x9ffc },
+  { 5724, 0x1bff }, { 5736, 0xfaf7 }, { 5749, 0xddb7 }, { 5761, 0xfbed },
+  { 5774, 0xf87e }, { 5785, 0xecdf }, { 5797, 0xf36f }, { 5809, 0xbc3f },
+  /* 0x6600 */
+  { 5820, 0xfffd }, { 5835, 0xf13f }, { 5846, 0xe9ff }, { 5859, 0x067f },
+  { 5868, 0x9fbe }, { 5880, 0xfe8e }, { 5891, 0xddfe }, { 5904, 0x7fdf },
+  { 5918, 0x7ff1 }, { 5930, 0xa7f7 }, { 5942, 0xef17 }, { 5953, 0xefff },
+  { 5968, 0xffd1 }, { 5980, 0x7f44 }, { 5989, 0x7b59 }, { 5999, 0xd3df },
+  /* 0x6700 */
+  { 6011, 0xff3f }, { 6025, 0xebfd }, { 6038, 0x7def }, { 6051, 0xff7a },
+  { 6064, 0xfbf0 }, { 6075, 0xf6eb }, { 6087, 0xbc87 }, { 6096, 0xffff },
+  { 6112, 0xfafa }, { 6124, 0xb7bf }, { 6137, 0xd011 }, { 6142, 0x8fff },
+  { 6155, 0xff7f }, { 6170, 0xffdf }, { 6185, 0xfefc }, { 6198, 0xd7ff },
+  /* 0x6800 */
+  { 6212, 0x201f }, { 6218, 0xfddd }, { 6231, 0xef67 }, { 6243, 0x7ffe },
+  { 6257, 0xffff }, { 6273, 0x207b }, { 6280, 0xe820 }, { 6285, 0xfbf6 },
+  { 6298, 0x9fff }, { 6312, 0xb9df }, { 6324, 0xffdf }, { 6339, 0x227f },
+  { 6348, 0x7ff8 }, { 6360, 0xf5ff }, { 6374, 0xdfdb }, { 6387, 0x3fff },
+  /* 0x6900 */
+  { 6401, 0xffff }, { 6417, 0x0fbf }, { 6428, 0x9420 }, { 6432, 0xfbfd },
+  { 6446, 0xdf7f }, { 6460, 0xfffe }, { 6475, 0xffff }, { 6491, 0x0fff },
+  { 6503, 0x646d }, { 6511, 0xdffb }, { 6525, 0xffff }, { 6541, 0xfaff },
+  { 6555, 0xfe5f }, { 6568, 0x027b }, { 6575, 0x7bf6 }, { 6587, 0xffde },
+  /* 0x6a00 */
+  { 6601, 0xbfff }, { 6616, 0xfffa }, { 6630, 0x39eb }, { 6640, 0xff3c },
+  { 6652, 0xfbfb }, { 6666, 0xefff }, { 6681, 0xafff }, { 6695, 0xc452 },
+  { 6701, 0xf6bf }, { 6714, 0xfeff }, { 6729, 0xf9ff }, { 6743, 0x6ffe },
+  { 6756, 0xbfec }, { 6768, 0xff1b }, { 6780, 0xdda3 }, { 6790, 0x1f4b },
+  /* 0x6b00 */
+  { 6799, 0x8f3d }, { 6809, 0x67cf }, { 6820, 0xb12b }, { 6828, 0xfffe },
+  { 6843, 0x7fee }, { 6856, 0xdaf7 }, { 6868, 0xa4ff }, { 6879, 0xcfd4 },
+  { 6889, 0xf75f }, { 6902, 0xcbf2 }, { 6912, 0xecfd }, { 6924, 0xb4ed },
+  { 6934, 0xbffb }, { 6948, 0x5ddd }, { 6959, 0x9ddf }, { 6971, 0xff8d },
+  /* 0x6c00 */
+  { 6983, 0xbb7f }, { 6996, 0xbf7b }, { 7009, 0xddfb }, { 7022, 0xeffb },
+  { 7036, 0xfe4f }, { 7048, 0xffb5 }, { 7061, 0xefe3 }, { 7073, 0xef7f },
+  { 7087, 0xffff }, { 7103, 0xbf7d }, { 7116, 0xfc04 }, { 7123, 0xffdf },
+  { 7138, 0xfeff }, { 7153, 0xfeff }, { 7168, 0xffaf }, { 7182, 0x822f },
+  /* 0x6d00 */
+  { 7189, 0xffff }, { 7205, 0xefc7 }, { 7217, 0xfff5 }, { 7231, 0xffff },
+  { 7247, 0x4007 }, { 7251, 0xdf80 }, { 7259, 0xf7ff }, { 7274, 0xfff7 },
+  { 7289, 0xffff }, { 7305, 0x01ff }, { 7314, 0xdc30 }, { 7321, 0xffbe },
+  { 7335, 0xbff5 }, { 7348, 0xffff }, { 7364, 0xff7f }, { 7379, 0x7eff },
+  /* 0x6e00 */
+  { 7393, 0x843d }, { 7400, 0xbf20 }, { 7408, 0xffff }, { 7424, 0xff7f },
+  { 7439, 0xeefb }, { 7452, 0xff7f }, { 7467, 0xcbff }, { 7480, 0x13de },
+  { 7489, 0xeb40 }, { 7496, 0xffdd }, { 7510, 0xccff }, { 7522, 0xffff },
+  { 7538, 0xffff }, { 7554, 0x3f7f }, { 7567, 0xfb04 }, { 7575, 0xfff6 },
+  /* 0x6f00 */
+  { 7589, 0xffff }, { 7605, 0xd7fc }, { 7617, 0xfeff }, { 7632, 0xffff },
+  { 7648, 0xc01b }, { 7654, 0xfdff }, { 7669, 0xfedf }, { 7683, 0xffdd },
+  { 7697, 0x7ff7 }, { 7711, 0xe0fd }, { 7721, 0xffff }, { 7737, 0xff7f },
+  { 7752, 0xffdf }, { 7767, 0xff38 }, { 7778, 0xfbdf }, { 7792, 0xddd7 },
+  /* 0x7000 */
+  { 7804, 0xfefb }, { 7818, 0xfff2 }, { 7831, 0x9fdf }, { 7844, 0xdfbf },
+  { 7858, 0x3f7f }, { 7871, 0xfdf7 }, { 7885, 0x9fff }, { 7899, 0xf7f3 },
+  { 7912, 0xce7e }, { 7923, 0x877e }, { 7933, 0xfafb }, { 7946, 0x7fbb },
+  { 7959, 0xfdf1 }, { 7971, 0xf7ff }, { 7986, 0x8017 }, { 7991, 0xfffb },
+  /* 0x7100 */
+  { 8006, 0x7e75 }, { 8017, 0xfe89 }, { 8027, 0xdb6f }, { 8039, 0x4c7f },
+  { 8049, 0xfeff }, { 8064, 0xf75f }, { 8077, 0x5fff }, { 8091, 0x7def },
+  { 8104, 0xd7f7 }, { 8117, 0xffd7 }, { 8131, 0xb7bf }, { 8144, 0xf7bf },
+  { 8158, 0xcfff }, { 8172, 0xbf77 }, { 8185, 0x79f7 }, { 8197, 0xfb77 },
+  /* 0x7200 */
+  { 8210, 0xf6ef }, { 8223, 0xeef9 }, { 8235, 0x7fdc }, { 8247, 0xef61 },
+  { 8257, 0x9fd7 }, { 8269, 0xffed }, { 8283, 0xd6cf }, { 8294, 0xfbdd },
+  { 8307, 0xfbf7 }, { 8321, 0xedff }, { 8335, 0xf7fe }, { 8349, 0xa435 },
+  { 8356, 0x7e7f }, { 8369, 0x97d7 }, { 8380, 0x0f5f }, { 8390, 0xffd8 },
+  /* 0x7300 */
+  { 8402, 0x9d97 }, { 8412, 0x7bcf }, { 8424, 0x7fec }, { 8436, 0xdfff },
+  { 8451, 0xf73f }, { 8464, 0xef87 }, { 8475, 0xdfe7 }, { 8488, 0xfdff },
+  { 8503, 0xdfff }, { 8518, 0xf1fc }, { 8529, 0x3ff7 }, { 8542, 0xdffc },
+  { 8555, 0xffed }, { 8569, 0x7ffd }, { 8583, 0xefff }, { 8598, 0xfff8 },
+  /* 0x7400 */
+  { 8611, 0x3fff }, { 8625, 0xfef6 }, { 8638, 0xff7f }, { 8653, 0x97ff },
+  { 8666, 0xefff }, { 8681, 0xfeff }, { 8696, 0xffbd }, { 8710, 0xf67f },
+  { 8723, 0x3fef }, { 8736, 0xdfb5 }, { 8748, 0xaffb }, { 8761, 0xeff7 },
+  { 8775, 0x9d2f }, { 8785, 0xfff9 }, { 8799, 0x53ff }, { 8811, 0xe9f7 },
+  /* 0x7500 */
+  { 8823, 0xf9bd }, { 8835, 0xf7ff }, { 8850, 0xff66 }, { 8862, 0xefbf },
+  { 8876, 0xfdc5 }, { 8887, 0xbe3a }, { 8897, 0xfcfd }, { 8910, 0xe7c5 },
+  { 8920, 0xfcd9 }, { 8931, 0x6737 }, { 8941, 0x0cbc }, { 8948, 0xff7f },
+  { 8963, 0xfdbf }, { 8977, 0xffb7 }, { 8991, 0xa0df }, { 9000, 0xffff },
+  /* 0x7600 */
+  { 9016, 0xbf8f }, { 9028, 0xfe7b }, { 9041, 0xb3ff }, { 9054, 0x3d3f },
+  { 9065, 0xf3cd }, { 9076, 0x97df }, { 9088, 0xf6f7 }, { 9101, 0xff7f },
+  { 9116, 0xcfd6 }, { 9127, 0x7e6d }, { 9138, 0xec72 }, { 9147, 0xedb1 },
+  { 9157, 0x777c }, { 9168, 0xfe5c }, { 9179, 0xf6fa }, { 9191, 0x5fbf },
+  /* 0x7700 */
+  { 9204, 0xdfba }, { 9216, 0xee2f }, { 9227, 0xabfd }, { 9239, 0x7ffe },
+  { 9253, 0xfcf9 }, { 9265, 0xdf74 }, { 9276, 0xffef }, { 9291, 0xff84 },
+  { 9301, 0xfbbf }, { 9315, 0xffaa }, { 9327, 0xbdaf }, { 9339, 0xfeff },
+  { 9354, 0xfebc }, { 9366, 0x7fb9 }, { 9378, 0xf3ed }, { 9390, 0x7f9f },
+  /* 0x7800 */
+  { 9403, 0xf36c }, { 9413, 0xf11f }, { 9423, 0xffef }, { 9438, 0x33bf },
+  { 9449, 0x7fbc }, { 9461, 0x701f }, { 9469, 0xff75 }, { 9482, 0xde03 },
+  { 9490, 0xf3fb }, { 9503, 0xc7fa }, { 9514, 0xbfbf }, { 9528, 0x5f5f },
+  { 9540, 0xffba }, { 9553, 0xedbf }, { 9566, 0xf7bf }, { 9580, 0xfebf },
+  /* 0x7900 */
+  { 9594, 0x5276 }, { 9602, 0x7a9f }, { 9613, 0xfffa }, { 9627, 0xff7e },
+  { 9641, 0x9ff7 }, { 9654, 0xffff }, { 9670, 0x2fbf }, { 9682, 0xf61f },
+  { 9693, 0xedcf }, { 9705, 0xbfff }, { 9720, 0x7ff7 }, { 9734, 0xefdf },
+  { 9748, 0xfb73 }, { 9760, 0xf176 }, { 9770, 0x7edd }, { 9782, 0x0dd2 },
+  /* 0x7a00 */
+  { 9789, 0x3d7d }, { 9800, 0xdfbf }, { 9814, 0xed45 }, { 9823, 0xfe83 },
+  { 9833, 0x7ff9 }, { 9846, 0x9dd0 }, { 9854, 0x7ba7 }, { 9865, 0xef73 },
+  { 9877, 0x9ffb }, { 9890, 0xc3ff }, { 9902, 0xdf0d }, { 9912, 0xddff },
+  { 9926, 0x8fbf }, { 9938, 0xbf0a }, { 9947, 0xeefd }, { 9960, 0xeec0 },
+  /* 0x7b00 */
+  { 9968, 0xdf73 }, { 9980, 0xef1f }, { 9992, 0xfffd }, { 10007, 0x0b3f },
+  { 10016, 0xfffd }, { 10031, 0x0177 }, { 10038, 0xf2ff }, { 10051, 0x09ff },
+  { 10061, 0xfdb4 }, { 10072, 0x3bf7 }, { 10084, 0xb01f }, { 10092, 0x43b6 },
+  { 10100, 0xded3 }, { 10111, 0xff31 }, { 10122, 0x1fff }, { 10135, 0xff9f },
+  /* 0x7c00 */
+  { 10149, 0xfeef }, { 10163, 0xfa27 }, { 10173, 0x3fef }, { 10186, 0xfba9 },
+  { 10197, 0x37bd }, { 10208, 0xbedb }, { 10220, 0xfef9 }, { 10233, 0xff3d },
+  { 10246, 0x777b }, { 10258, 0xd1f6 }, { 10268, 0xd1ee }, { 10278, 0xff3e },
+  { 10291, 0x7fac }, { 10302, 0xf6ff }, { 10316, 0xf5c5 }, { 10326, 0x7bff },
+  /* 0x7d00 */
+  { 10340, 0xffff }, { 10356, 0xffff }, { 10372, 0xdb27 }, { 10382, 0xff6f },
+  { 10396, 0xe4ff }, { 10408, 0xfd7f }, { 10422, 0xefce }, { 10434, 0xbe0f },
+  { 10444, 0xfb7b }, { 10457, 0xf0de }, { 10467, 0xffdf }, { 10482, 0xffbf },
+  { 10497, 0xfef7 }, { 10511, 0xff9d }, { 10524, 0xd7fb }, { 10537, 0x6eff },
+  /* 0x7e00 */
+  { 10550, 0xff88 }, { 10560, 0xfcff }, { 10574, 0xeebf }, { 10587, 0xffff },
+  { 10603, 0x13ff }, { 10614, 0xdfff }, { 10629, 0xffaf }, { 10643, 0xfffd },
+  { 10658, 0xfdc7 }, { 10670, 0x9ffe }, { 10683, 0x1010 }, { 10685, 0x0400 },
+  { 10686, 0x8080 }, { 10688, 0x8000 }, { 10689, 0x0000 }, { 10689, 0x0000 },
+  /* 0x7f00 */
+  { 10689, 0x0040 }, { 10690, 0x0000 }, { 10690, 0x0000 }, { 10690, 0xe7c0 },
+  { 10698, 0xffbb }, { 10712, 0xf93f }, { 10724, 0x7feb }, { 10737, 0xffef },
+  { 10752, 0xffe8 }, { 10764, 0x7cfe }, { 10776, 0xf3ff }, { 10790, 0xffff },
+  { 10806, 0xfeaf }, { 10819, 0xf8b7 }, { 10830, 0xffef }, { 10845, 0xffbf },
+  /* 0x8000 */
+  { 10860, 0xf9ff }, { 10874, 0xfbf7 }, { 10888, 0xd773 }, { 10899, 0xfafb },
+  { 10912, 0x85c8 }, { 10918, 0x7d57 }, { 10929, 0x90de }, { 10937, 0xe3ef },
+  { 10949, 0x9ef5 }, { 10960, 0xbf6d }, { 10972, 0xeeae }, { 10983, 0x35f6 },
+  { 10993, 0xf7fc }, { 11006, 0x7ff3 }, { 11019, 0xb27b }, { 11029, 0x7f7f },
+  /* 0x8100 */
+  { 11043, 0x57ef }, { 11055, 0xeff4 }, { 11067, 0xbebe }, { 11079, 0x6695 },
+  { 11087, 0xfddc }, { 11099, 0x5e7f }, { 11111, 0xeaf7 }, { 11123, 0x97df },
+  { 11135, 0xbfdd }, { 11148, 0xffa8 }, { 11159, 0x5fed }, { 11171, 0xfeff },
+  { 11186, 0xb7ff }, { 11200, 0xefa7 }, { 11212, 0xf7ff }, { 11227, 0xdfdc },
+  /* 0x8200 */
+  { 11239, 0x3fb7 }, { 11251, 0xfd77 }, { 11264, 0xbf67 }, { 11276, 0xf7fc },
+  { 11289, 0xcab5 }, { 11298, 0xdfff }, { 11313, 0xfb7e }, { 11326, 0xfff6 },
+  { 11340, 0xecb9 }, { 11350, 0xef1f }, { 11362, 0xffff }, { 11378, 0xfffb },
+  { 11393, 0x841d }, { 11399, 0xdbff }, { 11413, 0xfdff }, { 11428, 0xffff },
+  /* 0x8300 */
+  { 11444, 0x3bff }, { 11457, 0x7fc0 }, { 11466, 0xbff5 }, { 11479, 0xbffe },
+  { 11493, 0xffbf }, { 11508, 0x00df }, { 11515, 0x804c }, { 11519, 0xfdf8 },
+  { 11531, 0xffea }, { 11544, 0x7fff }, { 11559, 0xdffd }, { 11573, 0xe201 },
+  { 11578, 0xffff }, { 11594, 0xfbfa }, { 11607, 0xffbf }, { 11622, 0xff7f },
+  /* 0x8400 */
+  { 11637, 0xfefa }, { 11650, 0x195f }, { 11659, 0xfa5b }, { 11670, 0xffff },
+  { 11686, 0x7ffd }, { 11700, 0xffff }, { 11716, 0xfbff }, { 11731, 0xe7ff },
+  { 11745, 0xe145 }, { 11752, 0xffdf }, { 11767, 0xff9f }, { 11781, 0xff57 },
+  { 11794, 0xfef7 }, { 11808, 0x4cdf }, { 11818, 0xdfb6 }, { 11830, 0xffdf },
+  /* 0x8500 */
+  { 11845, 0xffed }, { 11859, 0xf7ff }, { 11874, 0xfffb }, { 11889, 0x691b },
+  { 11897, 0x7fff }, { 11912, 0xeffe }, { 11926, 0xffff }, { 11942, 0x5feb },
+  { 11954, 0xffff }, { 11970, 0xfff3 }, { 11984, 0x87df }, { 11995, 0xe7fb },
+  { 12008, 0xebff }, { 12022, 0xf7e7 }, { 12035, 0xff7f }, { 12050, 0xffc7 },
+  /* 0x8600 */
+  { 12063, 0xbef7 }, { 12076, 0xdfd3 }, { 12088, 0xf7ff }, { 12103, 0xdf7e },
+  { 12116, 0x79ed }, { 12127, 0xda7d }, { 12138, 0xffbe }, { 12152, 0x5e9f },
+  { 12163, 0x7ce0 }, { 12171, 0x77ff }, { 12185, 0xa7bf }, { 12197, 0xffff },
+  { 12213, 0x1bff }, { 12225, 0xffdb }, { 12239, 0xbf5c }, { 12250, 0x4fe0 },
+  /* 0x8700 */
+  { 12258, 0x7fff }, { 12273, 0x5f0e }, { 12282, 0x77ff }, { 12296, 0xddbf },
+  { 12309, 0xf04f }, { 12318, 0xffff }, { 12334, 0xffff }, { 12350, 0x2ffb },
+  { 12362, 0xbbfe }, { 12375, 0xfddf }, { 12389, 0xfe3c }, { 12400, 0xffff },
+  { 12416, 0x5f7f }, { 12429, 0xffde }, { 12443, 0xfdff }, { 12458, 0xdefc },
+  /* 0x8800 */
+  { 12470, 0xbf7f }, { 12484, 0xbbfb }, { 12497, 0xffff }, { 12513, 0xfbef },
+  { 12527, 0xfd7f }, { 12541, 0x6eec }, { 12551, 0xefbf }, { 12565, 0xf2f7 },
+  { 12577, 0xfb9f }, { 12590, 0xdfef }, { 12604, 0x5d97 }, { 12614, 0xf7f6 },
+  { 12627, 0xfea7 }, { 12639, 0xfff5 }, { 12653, 0xd9c2 }, { 12661, 0xffff },
+  /* 0x8900 */
+  { 12677, 0x5ee7 }, { 12688, 0xc7ff }, { 12701, 0xfefe }, { 12715, 0x79ef },
+  { 12727, 0xbade }, { 12738, 0xffdf }, { 12753, 0xfe7f }, { 12767, 0xdede },
+  { 12779, 0x8fef }, { 12791, 0xf9fa }, { 12803, 0xf6fe }, { 12816, 0xf6c4 },
+  { 12825, 0x0043 }, { 12828, 0xbe7c }, { 12839, 0x3bff }, { 12852, 0xdddf },
+  /* 0x8a00 */
+  { 12865, 0xd59d }, { 12875, 0xf9ef }, { 12888, 0x3eac }, { 12897, 0xff53 },
+  { 12909, 0xf773 }, { 12921, 0x4bf7 }, { 12932, 0x7bcf }, { 12944, 0xdeff },
+  { 12958, 0xb8fe }, { 12969, 0x577f }, { 12981, 0x8ffb }, { 12993, 0xff55 },
+  { 13005, 0xabfd }, { 13017, 0xfffe }, { 13032, 0xedd7 }, { 13044, 0xddff },
+  /* 0x8b00 */
+  { 13058, 0xfdf7 }, { 13072, 0xffff }, { 13088, 0xfdfd }, { 13102, 0xfeeb },
+  { 13115, 0xffef }, { 13130, 0xf7ff }, { 13145, 0xbfed }, { 13158, 0xef91 },
+  { 13168, 0x5d7f }, { 13180, 0xdf7d }, { 13193, 0x0001 }, { 13194, 0x4000 },
+  { 13195, 0x0000 }, { 13195, 0x0000 }, { 13195, 0x0004 }, { 13196, 0x0000 },
+  /* 0x8c00 */
+  { 13196, 0x0000 }, { 13196, 0x0000 }, { 13196, 0x0000 }, { 13196, 0xfa80 },
+  { 13203, 0xffee }, { 13217, 0xb4f3 }, { 13227, 0xbf76 }, { 13239, 0x2fef },
+  { 13251, 0xb677 }, { 13262, 0xffbf }, { 13277, 0xbfbf }, { 13291, 0xfffd },
+  { 13306, 0xb5bf }, { 13318, 0xfefe }, { 13332, 0x7fff }, { 13347, 0x7fbf },
+  /* 0x8d00 */
+  { 13361, 0xbffd }, { 13375, 0x3bff }, { 13388, 0x0000 }, { 13388, 0x0000 },
+  { 13388, 0x0000 }, { 13388, 0x0000 }, { 13388, 0xfbd0 }, { 13398, 0x2fdd },
+  { 13409, 0xf637 }, { 13420, 0x9a7f }, { 13431, 0xffeb }, { 13445, 0xd6fc },
+  { 13456, 0xf9ef }, { 13469, 0xbffb }, { 13483, 0xdfdf }, { 13497, 0xf41f },
+  /* 0x8e00 */
+  { 13507, 0xe6ff }, { 13520, 0xffff }, { 13536, 0x6fff }, { 13550, 0xf77b },
+  { 13563, 0xfff7 }, { 13578, 0xfef9 }, { 13591, 0xb7ff }, { 13605, 0x5dfe },
+  { 13617, 0x7ff7 }, { 13631, 0xe5ff }, { 13644, 0x3ffb }, { 13657, 0x3645 },
+  { 13664, 0xfe0d }, { 13674, 0xfd9e }, { 13686, 0xfbf7 }, { 13700, 0xdff6 },
+  /* 0x8f00 */
+  { 13713, 0x6fef }, { 13726, 0xffff }, { 13742, 0xf679 }, { 13753, 0xcbfd },
+  { 13765, 0xefff }, { 13780, 0xffff }, { 13796, 0x40df }, { 13804, 0x0000 },
+  { 13804, 0x0000 }, { 13804, 0x9808 }, { 13808, 0xe1e9 }, { 13817, 0xdfff },
+  { 13832, 0xfe76 }, { 13844, 0x04ff }, { 13853, 0x6d7f }, { 13865, 0xfff1 },
+  /* 0x9000 */
+  { 13878, 0xb97f }, { 13890, 0xfef7 }, { 13904, 0xe01f }, { 13912, 0xf1fe },
+  { 13924, 0xfe96 }, { 13935, 0x7b7f }, { 13948, 0xfb9f }, { 13961, 0xfffd },
+  { 13976, 0xadff }, { 13989, 0xcbb3 }, { 13999, 0xc5ef }, { 14010, 0xe97f },
+  { 14022, 0x4dba }, { 14031, 0xbff0 }, { 14042, 0xbf3f }, { 14055, 0xfe3f },
+  /* 0x9100 */
+  { 14068, 0xebff }, { 14082, 0xffd7 }, { 14096, 0xffdf }, { 14111, 0xcf7f },
+  { 14124, 0xfffb }, { 14139, 0xd7ef }, { 14152, 0xd7bf }, { 14165, 0x17fd },
+  { 14176, 0xfeff }, { 14191, 0xfe0f }, { 14202, 0xffaf }, { 14216, 0x7eff },
+  { 14230, 0xfaff }, { 14244, 0xb7fb }, { 14257, 0x7ffc }, { 14270, 0xe7fa },
+  /* 0x9200 */
+  { 14282, 0xf7ff }, { 14297, 0x56ff }, { 14309, 0x6dfa }, { 14320, 0xf7ff },
+  { 14335, 0xff73 }, { 14348, 0xedff }, { 14362, 0xf8ff }, { 14375, 0xffc5 },
+  { 14387, 0xffff }, { 14403, 0x3ffa }, { 14415, 0x5fff }, { 14429, 0xdefe },
+  { 14442, 0xffff }, { 14458, 0xebbf }, { 14471, 0xdffb }, { 14485, 0xffdf },
+  /* 0x9300 */
+  { 14500, 0xfbdf }, { 14514, 0xef7d }, { 14527, 0xffff }, { 14543, 0x137b },
+  { 14552, 0xffff }, { 14568, 0xdff7 }, { 14582, 0x7fff }, { 14597, 0x7ffb },
+  { 14611, 0xf7ff }, { 14626, 0xfff7 }, { 14641, 0xf7ff }, { 14656, 0xa9bf },
+  { 14667, 0xfddd }, { 14680, 0xffff }, { 14696, 0x51df }, { 14706, 0xfffb },
+  /* 0x9400 */
+  { 14721, 0xffdb }, { 14735, 0x2bff }, { 14747, 0x7ff1 }, { 14759, 0xffef },
+  { 14774, 0xbffd }, { 14788, 0x69b7 }, { 14798, 0xffbd }, { 14812, 0xfbff },
+  { 14827, 0x002f }, { 14832, 0x8000 }, { 14833, 0x0004 }, { 14834, 0x0000 },
+  { 14834, 0x000a }, { 14836, 0x1000 }, { 14837, 0x0000 }, { 14837, 0x0040 },
+  /* 0x9500 */
+  { 14838, 0x0000 }, { 14838, 0x0000 }, { 14838, 0x2000 }, { 14839, 0x0000 },
+  { 14839, 0x0080 }, { 14840, 0x0000 }, { 14840, 0x0000 }, { 14840, 0xbd80 },
+  { 14847, 0xfb6d }, { 14859, 0xdbdf }, { 14872, 0x7fff }, { 14887, 0xfee3 },
+  { 14899, 0x3fe9 }, { 14910, 0xdc7f }, { 14922, 0x013f }, { 14929, 0x0010 },
+  /* 0x9600 */
+  { 14930, 0x0000 }, { 14930, 0x7000 }, { 14933, 0xf51f }, { 14944, 0xbf0f },
+  { 14955, 0xfc3f }, { 14967, 0xf95b }, { 14978, 0xbe1e }, { 14988, 0x79ff },
+  { 15001, 0xeffb }, { 15015, 0x5bfe }, { 15027, 0x57be }, { 15038, 0xbb5b },
+  { 15049, 0x7fff }, { 15064, 0xfffc }, { 15078, 0x872e }, { 15086, 0xaff7 },
+  /* 0x9700 */
+  { 15099, 0xebfd }, { 15112, 0xfb4f }, { 15124, 0xdfff }, { 15139, 0xe767 },
+  { 15150, 0x0bdf }, { 15160, 0xfde6 }, { 15172, 0x7747 }, { 15182, 0xfddf },
+  { 15196, 0xefbf }, { 15210, 0xff90 }, { 15220, 0x7d7f }, { 15233, 0xefde },
+  { 15246, 0xfbff }, { 15261, 0xf3fd }, { 15274, 0x606b }, { 15281, 0xef6f },
+  /* 0x9800 */
+  { 15294, 0xf5ff }, { 15308, 0xf9ff }, { 15322, 0xebdb }, { 15334, 0x0bbd },
+  { 15343, 0xfffa }, { 15357, 0xfb8f }, { 15369, 0x9ffd }, { 15382, 0x003f },
+  { 15388, 0x0000 }, { 15388, 0x0000 }, { 15388, 0xf300 }, { 15394, 0xffde },
+  { 15408, 0x5fdf }, { 15421, 0xd800 }, { 15425, 0xbeef }, { 15438, 0x7676 },
+  /* 0x9900 */
+  { 15448, 0x57ad }, { 15458, 0xdfff }, { 15473, 0xffb2 }, { 15485, 0xffaf },
+  { 15499, 0x7faf }, { 15512, 0xfbff }, { 15527, 0x000e }, { 15530, 0x0000 },
+  { 15530, 0x0000 }, { 15530, 0x7bc0 }, { 15538, 0xfdfa }, { 15551, 0x3f3f },
+  { 15563, 0xfabe }, { 15575, 0xbfff }, { 15590, 0x76ff }, { 15603, 0xfff3 },
+  /* 0x9a00 */
+  { 15617, 0xfefe }, { 15631, 0xfe73 }, { 15643, 0xfeff }, { 15658, 0xfff7 },
+  { 15673, 0xf77f }, { 15687, 0xdffd }, { 15701, 0x1ffd }, { 15713, 0x0000 },
+  { 15713, 0x8000 }, { 15714, 0x0000 }, { 15714, 0xa900 }, { 15718, 0xffdf },
+  { 15733, 0xa4c7 }, { 15741, 0x91ff }, { 15752, 0xf8cf }, { 15763, 0xfede },
+  /* 0x9b00 */
+  { 15776, 0xff7e }, { 15790, 0xc7f7 }, { 15802, 0xefbd }, { 15815, 0xdebe },
+  { 15827, 0xfd7f }, { 15841, 0x8f77 }, { 15852, 0x93d3 }, { 15861, 0xfcf3 },
+  { 15873, 0xe9ef }, { 15885, 0xecaf }, { 15896, 0xed77 }, { 15908, 0xa361 },
+  { 15915, 0x87db }, { 15925, 0x7ef8 }, { 15936, 0x3ff7 }, { 15949, 0xa193 },
+  /* 0x9c00 */
+  { 15956, 0x7fe4 }, { 15967, 0xb8bd }, { 15977, 0xbb7b }, { 15989, 0xfefe },
+  { 16003, 0xff73 }, { 16016, 0xe3fd }, { 16028, 0x61cd }, { 16036, 0x1fbe },
+  { 16047, 0x0000 }, { 16047, 0x0000 }, { 16047, 0x0000 }, { 16047, 0x0000 },
+  { 16047, 0x0000 }, { 16047, 0x0000 }, { 16047, 0x26e0 }, { 16053, 0xbefe },
+  /* 0x9d00 */
+  { 16066, 0x13fd }, { 16076, 0xebf5 }, { 16088, 0xe36f }, { 16099, 0xebdb },
+  { 16111, 0xde3f }, { 16123, 0xffdf }, { 16138, 0xff83 }, { 16149, 0xfbbf },
+  { 16163, 0x1fff }, { 16176, 0xffdd }, { 16190, 0xbfff }, { 16205, 0xfffe },
+  { 16220, 0xffbf }, { 16235, 0xffff }, { 16251, 0xfb7e }, { 16264, 0xfffd },
+  /* 0x9e00 */
+  { 16279, 0xfeff }, { 16294, 0xffbf }, { 16309, 0x0000 }, { 16309, 0x0000 },
+  { 16309, 0x0000 }, { 16309, 0x0000 }, { 16309, 0x0000 }, { 16309, 0xbe20 },
+  { 16316, 0x7fff }, { 16331, 0xffff }, { 16347, 0xfff7 }, { 16362, 0xf8f3 },
+  { 16373, 0xf1df }, { 16385, 0xfd7b }, { 16398, 0xe9f5 }, { 16409, 0xffff },
+  /* 0x9f00 */
+  { 16425, 0xc7c7 }, { 16435, 0x5fed }, { 16447, 0xfffd }, { 16462, 0x6bff },
+  { 16475, 0xffff }, { 16491, 0xfffd }, { 16506, 0xdeff }, { 16520, 0xcff7 },
+  { 16533, 0x6000 }, { 16535, 0x9337 }, { 16544, 0x0035 },
+};
+static const Summary16 big5hkscs_uni2indx_pagee0[419] = {
+  /* 0xe000 */
+  { 16548, 0xffff }, { 16564, 0xffff }, { 16580, 0xffff }, { 16596, 0xffff },
+  { 16612, 0xffff }, { 16628, 0xffff }, { 16644, 0xffff }, { 16660, 0xffff },
+  { 16676, 0xffff }, { 16692, 0xffff }, { 16708, 0xffff }, { 16724, 0xffff },
+  { 16740, 0xffff }, { 16756, 0xffff }, { 16772, 0xffff }, { 16788, 0xffff },
+  /* 0xe100 */
+  { 16804, 0xffff }, { 16820, 0xffff }, { 16836, 0xffff }, { 16852, 0xffff },
+  { 16868, 0xffff }, { 16884, 0xffff }, { 16900, 0xffff }, { 16916, 0xffff },
+  { 16932, 0xffff }, { 16948, 0xffff }, { 16964, 0xffff }, { 16980, 0xffff },
+  { 16996, 0xffff }, { 17012, 0xffff }, { 17028, 0xffff }, { 17044, 0xffff },
+  /* 0xe200 */
+  { 17060, 0xffff }, { 17076, 0xffff }, { 17092, 0xffff }, { 17108, 0xffff },
+  { 17124, 0xffff }, { 17140, 0xffff }, { 17156, 0xffff }, { 17172, 0xffff },
+  { 17188, 0xffff }, { 17204, 0xffff }, { 17220, 0xffff }, { 17236, 0xffff },
+  { 17252, 0xffff }, { 17268, 0xffff }, { 17284, 0xffff }, { 17300, 0xffff },
+  /* 0xe300 */
+  { 17316, 0xffff }, { 17332, 0xffff }, { 17348, 0xffff }, { 17364, 0xffff },
+  { 17380, 0xffff }, { 17396, 0xffff }, { 17412, 0xffff }, { 17428, 0xffff },
+  { 17444, 0xffff }, { 17460, 0xffff }, { 17476, 0xffff }, { 17492, 0xffff },
+  { 17508, 0xffff }, { 17524, 0xffff }, { 17540, 0xffff }, { 17556, 0xffff },
+  /* 0xe400 */
+  { 17572, 0xffff }, { 17588, 0xffff }, { 17604, 0xffff }, { 17620, 0xffff },
+  { 17636, 0xffff }, { 17652, 0xffff }, { 17668, 0xffff }, { 17684, 0xffff },
+  { 17700, 0xffff }, { 17716, 0xffff }, { 17732, 0xffff }, { 17748, 0xffff },
+  { 17764, 0xffff }, { 17780, 0xffff }, { 17796, 0xffff }, { 17812, 0xffff },
+  /* 0xe500 */
+  { 17828, 0xffff }, { 17844, 0xffff }, { 17860, 0xffff }, { 17876, 0xffff },
+  { 17892, 0xffff }, { 17908, 0xffff }, { 17924, 0xffff }, { 17940, 0xffff },
+  { 17956, 0xffff }, { 17972, 0xffff }, { 17988, 0xffff }, { 18004, 0xffff },
+  { 18020, 0xffff }, { 18036, 0xffff }, { 18052, 0xffff }, { 18068, 0xffff },
+  /* 0xe600 */
+  { 18084, 0xffff }, { 18100, 0xffff }, { 18116, 0xffff }, { 18132, 0xffff },
+  { 18148, 0xffff }, { 18164, 0xffff }, { 18180, 0xffff }, { 18196, 0xffff },
+  { 18212, 0xffff }, { 18228, 0xffff }, { 18244, 0xffff }, { 18260, 0xffff },
+  { 18276, 0xffff }, { 18292, 0xffff }, { 18308, 0xffff }, { 18324, 0xffff },
+  /* 0xe700 */
+  { 18340, 0xffff }, { 18356, 0xffff }, { 18372, 0xffff }, { 18388, 0xffff },
+  { 18404, 0xffff }, { 18420, 0xffff }, { 18436, 0xffff }, { 18452, 0xffff },
+  { 18468, 0xffff }, { 18484, 0xffff }, { 18500, 0xffff }, { 18516, 0xffff },
+  { 18532, 0xffff }, { 18548, 0xffff }, { 18564, 0xffff }, { 18580, 0xffff },
+  /* 0xe800 */
+  { 18596, 0xffff }, { 18612, 0xffff }, { 18628, 0xffff }, { 18644, 0xffff },
+  { 18660, 0xffff }, { 18676, 0xffff }, { 18692, 0xffff }, { 18708, 0xffff },
+  { 18724, 0xffff }, { 18740, 0xffff }, { 18756, 0xffff }, { 18772, 0xffff },
+  { 18788, 0xffff }, { 18804, 0xffff }, { 18820, 0xffff }, { 18836, 0xffff },
+  /* 0xe900 */
+  { 18852, 0xffff }, { 18868, 0xffff }, { 18884, 0xffff }, { 18900, 0xffff },
+  { 18916, 0xffff }, { 18932, 0xffff }, { 18948, 0xffff }, { 18964, 0xffff },
+  { 18980, 0xffff }, { 18996, 0xffff }, { 19012, 0xffff }, { 19028, 0xffff },
+  { 19044, 0xffff }, { 19060, 0xffff }, { 19076, 0xffff }, { 19092, 0xffff },
+  /* 0xea00 */
+  { 19108, 0xffff }, { 19124, 0xffff }, { 19140, 0xffff }, { 19156, 0xffff },
+  { 19172, 0xffff }, { 19188, 0xffff }, { 19204, 0xffff }, { 19220, 0xffff },
+  { 19236, 0xffff }, { 19252, 0xffff }, { 19268, 0xffff }, { 19284, 0xffff },
+  { 19300, 0xffff }, { 19316, 0xffff }, { 19332, 0xffff }, { 19348, 0xffff },
+  /* 0xeb00 */
+  { 19364, 0xffff }, { 19380, 0xffff }, { 19396, 0xffff }, { 19412, 0xffff },
+  { 19428, 0xffff }, { 19444, 0xffff }, { 19460, 0xffff }, { 19476, 0xffff },
+  { 19492, 0xffff }, { 19508, 0xffff }, { 19524, 0xffff }, { 19540, 0xffff },
+  { 19556, 0xffff }, { 19572, 0xffff }, { 19588, 0xffff }, { 19604, 0xffff },
+  /* 0xec00 */
+  { 19620, 0xffff }, { 19636, 0xffff }, { 19652, 0xffff }, { 19668, 0xffff },
+  { 19684, 0xffff }, { 19700, 0xffff }, { 19716, 0xffff }, { 19732, 0xffff },
+  { 19748, 0xffff }, { 19764, 0xffff }, { 19780, 0xffff }, { 19796, 0xffff },
+  { 19812, 0xffff }, { 19828, 0xffff }, { 19844, 0xffff }, { 19860, 0xffff },
+  /* 0xed00 */
+  { 19876, 0xffff }, { 19892, 0xffff }, { 19908, 0xffff }, { 19924, 0xffff },
+  { 19940, 0xffff }, { 19956, 0xffff }, { 19972, 0xffff }, { 19988, 0xffff },
+  { 20004, 0xffff }, { 20020, 0xffff }, { 20036, 0xffff }, { 20052, 0xffff },
+  { 20068, 0xffff }, { 20084, 0xffff }, { 20100, 0xffff }, { 20116, 0xffff },
+  /* 0xee00 */
+  { 20132, 0xffff }, { 20148, 0xffff }, { 20164, 0xffff }, { 20180, 0xffff },
+  { 20196, 0xffff }, { 20212, 0xffff }, { 20228, 0xffff }, { 20244, 0xffff },
+  { 20260, 0xffff }, { 20276, 0xffff }, { 20292, 0xffff }, { 20308, 0xffff },
+  { 20324, 0xffff }, { 20340, 0xffff }, { 20356, 0xffff }, { 20372, 0xffff },
+  /* 0xef00 */
+  { 20388, 0xffff }, { 20404, 0xffff }, { 20420, 0xffff }, { 20436, 0xffff },
+  { 20452, 0xffff }, { 20468, 0xffff }, { 20484, 0xffff }, { 20500, 0xffff },
+  { 20516, 0xffff }, { 20532, 0xffff }, { 20548, 0xffff }, { 20564, 0xffff },
+  { 20580, 0xffff }, { 20596, 0xffff }, { 20612, 0xffff }, { 20628, 0xffff },
+  /* 0xf000 */
+  { 20644, 0xffff }, { 20660, 0xffff }, { 20676, 0xffff }, { 20692, 0xffff },
+  { 20708, 0xffff }, { 20724, 0xffff }, { 20740, 0xffff }, { 20756, 0xffff },
+  { 20772, 0xffff }, { 20788, 0xffff }, { 20804, 0xffff }, { 20820, 0xffff },
+  { 20836, 0xffff }, { 20852, 0xffff }, { 20868, 0xffff }, { 20884, 0xffff },
+  /* 0xf100 */
+  { 20900, 0xffff }, { 20916, 0xffff }, { 20932, 0xffff }, { 20948, 0xffff },
+  { 20964, 0xffff }, { 20980, 0xffff }, { 20996, 0xffff }, { 21012, 0xffff },
+  { 21028, 0xffff }, { 21044, 0xffff }, { 21060, 0xffff }, { 21076, 0xffff },
+  { 21092, 0xffff }, { 21108, 0xffff }, { 21124, 0xffff }, { 21140, 0xffff },
+  /* 0xf200 */
+  { 21156, 0xffff }, { 21172, 0xffff }, { 21188, 0xffff }, { 21204, 0xffff },
+  { 21220, 0xffff }, { 21236, 0xffff }, { 21252, 0xffff }, { 21268, 0xffff },
+  { 21284, 0xffff }, { 21300, 0xffff }, { 21316, 0xffff }, { 21332, 0xffff },
+  { 21348, 0xffff }, { 21364, 0xffff }, { 21380, 0xffff }, { 21396, 0xffff },
+  /* 0xf300 */
+  { 21412, 0xffff }, { 21428, 0xffff }, { 21444, 0xffff }, { 21460, 0xffff },
+  { 21476, 0xffff }, { 21492, 0xffff }, { 21508, 0xffff }, { 21524, 0xffff },
+  { 21540, 0xffff }, { 21556, 0xffff }, { 21572, 0xffff }, { 21588, 0xffff },
+  { 21604, 0xffff }, { 21620, 0xffff }, { 21636, 0xffff }, { 21652, 0xffff },
+  /* 0xf400 */
+  { 21668, 0xffff }, { 21684, 0xffff }, { 21700, 0xffff }, { 21716, 0xffff },
+  { 21732, 0xffff }, { 21748, 0xffff }, { 21764, 0xffff }, { 21780, 0xffff },
+  { 21796, 0xffff }, { 21812, 0xffff }, { 21828, 0xffff }, { 21844, 0xffff },
+  { 21860, 0xffff }, { 21876, 0xffff }, { 21892, 0xffff }, { 21908, 0xffff },
+  /* 0xf500 */
+  { 21924, 0xffff }, { 21940, 0xffff }, { 21956, 0xffff }, { 21972, 0xffff },
+  { 21988, 0xffff }, { 22004, 0xffff }, { 22020, 0xffff }, { 22036, 0xffff },
+  { 22052, 0xffff }, { 22068, 0xffff }, { 22084, 0xffff }, { 22100, 0xffff },
+  { 22116, 0xffff }, { 22132, 0xffff }, { 22148, 0xffff }, { 22164, 0xffff },
+  /* 0xf600 */
+  { 22180, 0xffff }, { 22196, 0xffff }, { 22212, 0xffff }, { 22228, 0xffff },
+  { 22244, 0xffff }, { 22260, 0xffff }, { 22276, 0xffff }, { 22292, 0xffff },
+  { 22308, 0xffff }, { 22324, 0xffff }, { 22340, 0xffff }, { 22356, 0xffff },
+  { 22372, 0xffff }, { 22388, 0xffff }, { 22404, 0xffff }, { 22420, 0xffff },
+  /* 0xf700 */
+  { 22436, 0xffff }, { 22452, 0xffff }, { 22468, 0xffff }, { 22484, 0xffff },
+  { 22500, 0xffff }, { 22516, 0xffff }, { 22532, 0xffff }, { 22548, 0xffff },
+  { 22564, 0xffff }, { 22580, 0xffff }, { 22596, 0xffff }, { 22612, 0xffff },
+  { 22628, 0xffff }, { 22644, 0xffff }, { 22660, 0xffff }, { 22676, 0xffff },
+  /* 0xf800 */
+  { 22692, 0xffff }, { 22708, 0xffff }, { 22724, 0xffff }, { 22740, 0xffff },
+  { 22756, 0x01ff }, { 22765, 0x0000 }, { 22765, 0x0000 }, { 22765, 0x0000 },
+  { 22765, 0x0000 }, { 22765, 0x0000 }, { 22765, 0x0000 }, { 22765, 0x0000 },
+  { 22765, 0x0000 }, { 22765, 0x0000 }, { 22765, 0x0000 }, { 22765, 0x0000 },
+  /* 0xf900 */
+  { 22765, 0xffff }, { 22781, 0xffff }, { 22797, 0xefff }, { 22812, 0xffff },
+  { 22828, 0xffff }, { 22844, 0xffff }, { 22860, 0xffff }, { 22876, 0xfdff },
+  { 22891, 0xffff }, { 22907, 0xffdf }, { 22922, 0xffff }, { 22938, 0xffff },
+  { 22954, 0xffff }, { 22970, 0xffff }, { 22986, 0xff7f }, { 23001, 0xfffd },
+  /* 0xfa00 */
+  { 23016, 0x3fff }, { 23030, 0x7ee5 }, { 23041, 0x3c64 },
+};
+static const Summary16 big5hkscs_uni2indx_pagefe[31] = {
+  /* 0xfe00 */
+  { 23048, 0x0000 }, { 23048, 0x0000 }, { 23048, 0x0000 }, { 23048, 0xfffb },
+  { 23063, 0xfe1f }, { 23075, 0xfef7 }, { 23089, 0x0f7f }, { 23100, 0x0000 },
+  { 23100, 0x0000 }, { 23100, 0x0000 }, { 23100, 0x0000 }, { 23100, 0x0000 },
+  { 23100, 0x0000 }, { 23100, 0x0000 }, { 23100, 0x0000 }, { 23100, 0x0000 },
+  /* 0xff00 */
+  { 23100, 0xfffe }, { 23115, 0xffff }, { 23131, 0xffff }, { 23147, 0xffff },
+  { 23163, 0xffff }, { 23179, 0x7fff }, { 23194, 0x0010 }, { 23195, 0x0000 },
+  { 23195, 0x0000 }, { 23195, 0x0000 }, { 23195, 0x0000 }, { 23195, 0x0000 },
+  { 23195, 0x0000 }, { 23195, 0x0000 }, { 23195, 0x203f },
+};
+
+static int
+big5hkscs_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  if (n >= 2) {
+    const Summary16 *summary = NULL;
+    if (wc >= 0x0000 && wc < 0x0100)
+      summary = &big5hkscs_uni2indx_page00[(wc>>4)];
+    else if (wc >= 0x0200 && wc < 0x03d0)
+      summary = &big5hkscs_uni2indx_page02[(wc>>4)-0x020];
+    else if (wc >= 0x2000 && wc < 0x22c0)
+      summary = &big5hkscs_uni2indx_page20[(wc>>4)-0x200];
+    else if (wc >= 0x2500 && wc < 0x2650)
+      summary = &big5hkscs_uni2indx_page25[(wc>>4)-0x250];
+    else if (wc >= 0x3000 && wc < 0x33e0)
+      summary = &big5hkscs_uni2indx_page30[(wc>>4)-0x300];
+    else if (wc >= 0x4e00 && wc < 0x9fb0)
+      summary = &big5hkscs_uni2indx_page4e[(wc>>4)-0x4e0];
+    else if (wc >= 0xe000 && wc < 0xfa30)
+      summary = &big5hkscs_uni2indx_pagee0[(wc>>4)-0xe00];
+    else if (wc >= 0xfe00 && wc < 0xfff0)
+      summary = &big5hkscs_uni2indx_pagefe[(wc>>4)-0xfe0];
+    if (summary) {
+      unsigned short used = summary->used;
+      unsigned int i = wc & 0x0f;
+      if (used & ((unsigned short) 1 << i)) {
+        unsigned short c;
+        /* Keep in `used' only the bits 0..i-1. */
+        used &= ((unsigned short) 1 << i) - 1;
+        /* Add `summary->indx' and the number of bits set in `used'. */
+        used = (used & 0x5555) + ((used & 0xaaaa) >> 1);
+        used = (used & 0x3333) + ((used & 0xcccc) >> 2);
+        used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4);
+        used = (used & 0x00ff) + (used >> 8);
+        c = big5hkscs_2charset[summary->indx + used];
+        r[0] = (c >> 8); r[1] = (c & 0xff);
+        return 2;
+      }
+    }
+    return RET_ILSEQ;
+  }
+  return RET_TOOSMALL;
+}
+
diff --git a/src/xlibi18n/lcUniConv/cjk_tab_to_h.c b/src/xlibi18n/lcUniConv/cjk_tab_to_h.c
new file mode 100644 (file)
index 0000000..6934789
--- /dev/null
@@ -0,0 +1,1071 @@
+
+/*
+ * Generates a CJK character set table from a .TXT table as found on
+ * ftp.unicode.org or in the X nls directory.
+ * Examples:
+ *
+ *   ./cjk_tab_to_h GB2312.1980-0 gb2312 > gb2312.h < gb2312
+ *   ./cjk_tab_to_h JISX0208.1983-0 jisx0208 > jisx0208.h < jis0208
+ *   ./cjk_tab_to_h KSC5601.1987-0 ksc5601 > ksc5601.h < ksc5601
+ *
+ *   ./cjk_tab_to_h GB2312.1980-0 gb2312 > gb2312.h < GB2312.TXT
+ *   ./cjk_tab_to_h JISX0208.1983-0 jisx0208 > jisx0208.h < JIS0208.TXT
+ *   ./cjk_tab_to_h JISX0212.1990-0 jisx0212 > jisx0212.h < JIS0212.TXT
+ *   ./cjk_tab_to_h KSC5601.1987-0 ksc5601 > ksc5601.h < KSC5601.TXT
+ *   ./cjk_tab_to_h KSX1001.1992-0 ksc5601 > ksc5601.h < KSX1001.TXT
+ *
+ *   ./cjk_tab_to_h BIG5 big5 > big5.h < BIG5.TXT
+ *
+ *   ./cjk_tab_to_h JOHAB johab > johab.h < JOHAB.TXT
+ *
+ *   ./cjk_tab_to_h BIG5HKSCS-0 big5hkscs >big5hkscs.h < BIG5HKSCS.TXT
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <string.h>
+
+typedef struct {
+  int start;
+  int end;
+} Block;
+
+typedef struct {
+  int rows;    /* number of possible values for the 1st byte */
+  int cols;    /* number of possible values for the 2nd byte */
+  int (*row_byte) (int row); /* returns the 1st byte value for a given row */
+  int (*col_byte) (int col); /* returns the 2nd byte value for a given col */
+  int (*byte_row) (int byte); /* converts a 1st byte value to a row, else -1 */
+  int (*byte_col) (int byte); /* converts a 2nd byte value to a col, else -1 */
+  const char* check_row_expr; /* format string for 1st byte value checking */
+  const char* check_col_expr; /* format string for 2nd byte value checking */
+  const char* byte_row_expr; /* format string for 1st byte value to row */
+  const char* byte_col_expr; /* format string for 2nd byte value to col */
+  int** charset2uni; /* charset2uni[0..rows-1][0..cols-1] is valid */
+  /* You'll understand the terms "row" and "col" when you buy Ken Lunde's book.
+     Once a row is fixed, choosing a "col" is the same as choosing a "cell". */
+  int* charsetpage; /* charsetpage[0..rows]: how large is a page for a row */
+  int ncharsetblocks;
+  Block* charsetblocks; /* blocks[0..nblocks-1] */
+  int* uni2charset; /* uni2charset[0x0000..0xffff] */
+} Encoding;
+
+/*
+ * Outputs the file title.
+ */
+static void output_title (const char *charsetname)
+{
+  printf("\n");
+  printf("/*\n");
+  printf(" * %s\n", charsetname);
+  printf(" */\n");
+  printf("\n");
+}
+
+/*
+ * Reads the charset2uni table from standard input.
+ */
+static void read_table (Encoding* enc)
+{
+  int row, col, i, i1, i2, c, j;
+
+  enc->charset2uni = (int**) malloc(enc->rows*sizeof(int*));
+  for (row = 0; row < enc->rows; row++)
+    enc->charset2uni[row] = (int*) malloc(enc->cols*sizeof(int));
+
+  for (row = 0; row < enc->rows; row++)
+    for (col = 0; col < enc->cols; col++)
+      enc->charset2uni[row][col] = 0xfffd;
+
+  c = getc(stdin);
+  ungetc(c,stdin);
+  if (c == '#') {
+    /* Read a unicode.org style .TXT file. */
+    for (;;) {
+      c = getc(stdin);
+      if (c == EOF)
+        break;
+      if (c == '\n' || c == ' ' || c == '\t')
+        continue;
+      if (c == '#') {
+        do { c = getc(stdin); } while (!(c == EOF || c == '\n'));
+        continue;
+      }
+      ungetc(c,stdin);
+      if (scanf("0x%x", &j) != 1)
+        exit(1);
+      i1 = j >> 8;
+      i2 = j & 0xff;
+      row = enc->byte_row(i1);
+      col = enc->byte_col(i2);
+      if (row < 0 || col < 0) {
+        fprintf(stderr, "lost entry for %02x %02x\n", i1, i2);
+        exit(1);
+      }
+      if (scanf(" 0x%x", &enc->charset2uni[row][col]) != 1)
+        exit(1);
+    }
+  } else {
+    /* Read a table of hexadecimal Unicode values. */
+    for (i1 = 32; i1 < 132; i1++)
+      for (i2 = 32; i2 < 132; i2++) {
+        i = scanf("%x", &j);
+        if (i == EOF)
+          goto read_done;
+        if (i != 1)
+          exit(1);
+        if (j < 0 || j == 0xffff)
+          j = 0xfffd;
+        if (j != 0xfffd) {
+          if (enc->byte_row(i1) < 0 || enc->byte_col(i2) < 0) {
+            fprintf(stderr, "lost entry at %02x %02x\n", i1, i2);
+            exit (1);
+          }
+          enc->charset2uni[enc->byte_row(i1)][enc->byte_col(i2)] = j;
+        }
+      }
+   read_done: ;
+  }
+}
+
+/*
+ * Computes the charsetpage[0..rows] array.
+ */
+static void find_charset2uni_pages (Encoding* enc)
+{
+  int row, col;
+
+  enc->charsetpage = (int*) malloc((enc->rows+1)*sizeof(int));
+
+  for (row = 0; row <= enc->rows; row++)
+    enc->charsetpage[row] = 0;
+
+  for (row = 0; row < enc->rows; row++) {
+    int used = 0;
+    for (col = 0; col < enc->cols; col++)
+      if (enc->charset2uni[row][col] != 0xfffd)
+        used = col+1;
+    enc->charsetpage[row] = used;
+  }
+}
+
+/*
+ * Fills in nblocks and blocks.
+ */
+static void find_charset2uni_blocks (Encoding* enc)
+{
+  int n, row, lastrow;
+
+  enc->charsetblocks = (Block*) malloc(enc->rows*sizeof(Block));
+
+  n = 0;
+  for (row = 0; row < enc->rows; row++)
+    if (enc->charsetpage[row] > 0 && (row == 0 || enc->charsetpage[row-1] == 0)) {
+      for (lastrow = row; enc->charsetpage[lastrow+1] > 0; lastrow++);
+      enc->charsetblocks[n].start = row * enc->cols;
+      enc->charsetblocks[n].end = lastrow * enc->cols + enc->charsetpage[lastrow];
+      n++;
+    }
+  enc->ncharsetblocks = n;
+}
+
+/*
+ * Outputs the charset to unicode table and function.
+ */
+static void output_charset2uni (const char* name, Encoding* enc)
+{
+  int row, col, lastrow, col_max, i, i1_min, i1_max;
+
+  find_charset2uni_pages(enc);
+
+  find_charset2uni_blocks(enc);
+
+  for (row = 0; row < enc->rows; row++)
+    if (enc->charsetpage[row] > 0) {
+      if (row == 0 || enc->charsetpage[row-1] == 0) {
+        /* Start a new block. */
+        for (lastrow = row; enc->charsetpage[lastrow+1] > 0; lastrow++);
+        printf("static const unsigned short %s_2uni_page%02x[%d] = {\n",
+               name, enc->row_byte(row),
+               (lastrow-row) * enc->cols + enc->charsetpage[lastrow]);
+      }
+      printf("  /""* 0x%02x *""/\n ", enc->row_byte(row));
+      col_max = (enc->charsetpage[row+1] > 0 ? enc->cols : enc->charsetpage[row]);
+      for (col = 0; col < col_max; col++) {
+        printf(" 0x%04x,", enc->charset2uni[row][col]);
+        if ((col % 8) == 7 && (col+1 < col_max)) printf("\n ");
+      }
+      printf("\n");
+      if (enc->charsetpage[row+1] == 0) {
+        /* End a block. */
+        printf("};\n");
+      }
+    }
+  printf("\n");
+
+  printf("static int\n");
+  printf("%s_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)\n", name);
+  printf("{\n");
+  printf("  unsigned char c1 = s[0];\n");
+  printf("  if (");
+  for (i = 0; i < enc->ncharsetblocks; i++) {
+    i1_min = enc->row_byte(enc->charsetblocks[i].start / enc->cols);
+    i1_max = enc->row_byte((enc->charsetblocks[i].end-1) / enc->cols);
+    if (i > 0)
+      printf(" || ");
+    if (i1_min == i1_max)
+      printf("(c1 == 0x%02x)", i1_min);
+    else
+      printf("(c1 >= 0x%02x && c1 <= 0x%02x)", i1_min, i1_max);
+  }
+  printf(") {\n");
+  printf("    if (n >= 2) {\n");
+  printf("      unsigned char c2 = s[1];\n");
+  printf("      if (");
+  printf(enc->check_col_expr, "c2");
+  printf(") {\n");
+  printf("        unsigned int i = %d * (", enc->cols);
+  printf(enc->byte_row_expr, "c1");
+  printf(") + (");
+  printf(enc->byte_col_expr, "c2");
+  printf(");\n");
+  printf("        unsigned short wc = 0xfffd;\n");
+  for (i = 0; i < enc->ncharsetblocks; i++) {
+    printf("        ");
+    if (i > 0)
+      printf("} else ");
+    if (i < enc->ncharsetblocks-1)
+      printf("if (i < %d) ", enc->charsetblocks[i+1].start);
+    printf("{\n");
+    printf("          if (i < %d)\n", enc->charsetblocks[i].end);
+    printf("            wc = %s_2uni_page%02x[i", name, enc->row_byte(enc->charsetblocks[i].start / enc->cols));
+    if (enc->charsetblocks[i].start > 0)
+      printf("-%d", enc->charsetblocks[i].start);
+    printf("];\n");
+  }
+  printf("        }\n");
+  printf("        if (wc != 0xfffd) {\n");
+  printf("          *pwc = (ucs4_t) wc;\n");
+  printf("          return 2;\n");
+  printf("        }\n");
+  printf("      }\n");
+  printf("      return RET_ILSEQ;\n");
+  printf("    }\n");
+  printf("    return RET_TOOFEW(0);\n");
+  printf("  }\n");
+  printf("  return RET_ILSEQ;\n");
+  printf("}\n");
+  printf("\n");
+}
+
+/*
+ * Computes the uni2charset[0x0000..0xffff] array.
+ */
+static void invert (Encoding* enc)
+{
+  int row, col, j;
+
+  enc->uni2charset = (int*) malloc(0x10000*sizeof(int));
+
+  for (j = 0; j < 0x10000; j++)
+    enc->uni2charset[j] = 0;
+
+  for (row = 0; row < enc->rows; row++)
+    for (col = 0; col < enc->cols; col++) {
+      j = enc->charset2uni[row][col];
+      if (j != 0xfffd)
+        enc->uni2charset[j] = 0x100 * enc->row_byte(row) + enc->col_byte(col);
+    }
+}
+
+/*
+ * Outputs the unicode to charset table and function, using a linear array.
+ * (Suitable if the table is dense.)
+ */
+static void output_uni2charset_dense (const char* name, Encoding* enc)
+{
+  /* Like in 8bit_tab_to_h.c */
+  bool pages[0x100];
+  int line[0x2000];
+  int tableno;
+  struct { int minline; int maxline; int usecount; } tables[0x2000];
+  bool first;
+  int row, col, j, p, j1, j2, t;
+
+  for (p = 0; p < 0x100; p++)
+    pages[p] = false;
+  for (row = 0; row < enc->rows; row++)
+    for (col = 0; col < enc->cols; col++) {
+      j = enc->charset2uni[row][col];
+      if (j != 0xfffd)
+        pages[j>>8] = true;
+    }
+  for (j1 = 0; j1 < 0x2000; j1++) {
+    bool all_invalid = true;
+    for (j2 = 0; j2 < 8; j2++) {
+      j = 8*j1+j2;
+      if (enc->uni2charset[j] != 0)
+        all_invalid = false;
+    }
+    if (all_invalid)
+      line[j1] = -1;
+    else
+      line[j1] = 0;
+  }
+  tableno = 0;
+  for (j1 = 0; j1 < 0x2000; j1++) {
+    if (line[j1] >= 0) {
+      if (tableno > 0
+          && ((j1 > 0 && line[j1-1] == tableno-1)
+              || ((tables[tableno-1].maxline >> 5) == (j1 >> 5)
+                  && j1 - tables[tableno-1].maxline <= 8))) {
+        line[j1] = tableno-1;
+        tables[tableno-1].maxline = j1;
+      } else {
+        tableno++;
+        line[j1] = tableno-1;
+        tables[tableno-1].minline = tables[tableno-1].maxline = j1;
+      }
+    }
+  }
+  for (t = 0; t < tableno; t++) {
+    tables[t].usecount = 0;
+    j1 = 8*tables[t].minline;
+    j2 = 8*(tables[t].maxline+1);
+    for (j = j1; j < j2; j++)
+      if (enc->uni2charset[j] != 0)
+        tables[t].usecount++;
+  }
+  {
+    p = -1;
+    for (t = 0; t < tableno; t++)
+      if (tables[t].usecount > 1) {
+        p = tables[t].minline >> 5;
+        printf("static const unsigned short %s_page%02x[%d] = {\n", name, p, 8*(tables[t].maxline-tables[t].minline+1));
+        for (j1 = tables[t].minline; j1 <= tables[t].maxline; j1++) {
+          if ((j1 % 0x20) == 0 && j1 > tables[t].minline)
+            printf("  /* 0x%04x */\n", 8*j1);
+          printf(" ");
+          for (j2 = 0; j2 < 8; j2++) {
+            j = 8*j1+j2;
+            printf(" 0x%04x,", enc->uni2charset[j]);
+          }
+          printf(" /*0x%02x-0x%02x*/\n", 8*(j1 % 0x20), 8*(j1 % 0x20)+7);
+        }
+        printf("};\n");
+      }
+    if (p >= 0)
+      printf("\n");
+  }
+  printf("static int\n%s_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)\n", name);
+  printf("{\n");
+  printf("  if (n >= 2) {\n");
+  printf("    unsigned short c = 0;\n");
+  first = true;
+  for (j1 = 0; j1 < 0x2000;) {
+    t = line[j1];
+    for (j2 = j1; j2 < 0x2000 && line[j2] == t; j2++);
+    if (t >= 0) {
+      if (j1 != tables[t].minline) abort();
+      if (j2 > tables[t].maxline+1) abort();
+      j2 = tables[t].maxline+1;
+      if (first)
+        printf("    ");
+      else
+        printf("    else ");
+      first = false;
+      if (tables[t].usecount == 0) abort();
+      if (tables[t].usecount == 1) {
+        if (j2 != j1+1) abort();
+        for (j = 8*j1; j < 8*j2; j++)
+          if (enc->uni2charset[j] != 0) {
+            printf("if (wc == 0x%04x)\n      c = 0x%02x;\n", j, enc->uni2charset[j]);
+            break;
+          }
+      } else {
+        if (j1 == 0) {
+          printf("if (wc < 0x%04x)", 8*j2);
+        } else {
+          printf("if (wc >= 0x%04x && wc < 0x%04x)", 8*j1, 8*j2);
+        }
+        printf("\n      c = %s_page%02x[wc", name, j1 >> 5);
+        if (tables[t].minline > 0)
+          printf("-0x%04x", 8*j1);
+        printf("];\n");
+      }
+    }
+    j1 = j2;
+  }
+  printf("    if (c != 0) {\n");
+  printf("      r[0] = (c >> 8); r[1] = (c & 0xff);\n");
+  printf("      return 2;\n");
+  printf("    }\n");
+  printf("    return RET_ILSEQ;\n");
+  printf("  }\n");
+  printf("  return RET_TOOSMALL;\n");
+  printf("}\n");
+}
+
+/*
+ * Outputs the unicode to charset table and function, using a packed array.
+ * (Suitable if the table is sparse.)
+ */
+static void output_uni2charset_sparse (const char* name, Encoding* enc)
+{
+  bool pages[0x100];
+  Block pageblocks[0x100]; int npageblocks;
+  int indx2charset[0x10000];
+  int summary_indx[0x1000];
+  int summary_used[0x1000];
+  int i, row, col, j, p, j1, j2, indx;
+
+  /* Fill pages[0x100]. */
+  for (p = 0; p < 0x100; p++)
+    pages[p] = false;
+  for (row = 0; row < enc->rows; row++)
+    for (col = 0; col < enc->cols; col++) {
+      j = enc->charset2uni[row][col];
+      if (j != 0xfffd)
+        pages[j>>8] = true;
+    }
+
+#if 0
+  for (p = 0; p < 0x100; p++)
+    if (pages[p]) {
+      printf("static const unsigned short %s_page%02x[256] = {\n", name, p);
+      for (j1 = 0; j1 < 32; j1++) {
+        printf("  ");
+        for (j2 = 0; j2 < 8; j2++)
+          printf("0x%04x, ", enc->uni2charset[256*p+8*j1+j2]);
+        printf("/""*0x%02x-0x%02x*""/\n", 8*j1, 8*j1+7);
+      }
+      printf("};\n");
+    }
+  printf("\n");
+#endif
+
+  /* Fill summary_indx[] and summary_used[]. */
+  indx = 0;
+  for (j1 = 0; j1 < 0x1000; j1++) {
+    summary_indx[j1] = indx;
+    summary_used[j1] = 0;
+    for (j2 = 0; j2 < 16; j2++) {
+      j = 16*j1+j2;
+      if (enc->uni2charset[j] != 0) {
+        indx2charset[indx++] = enc->uni2charset[j];
+        summary_used[j1] |= (1 << j2);
+      }
+    }
+  }
+
+  /* Fill npageblocks and pageblocks[]. */
+  npageblocks = 0;
+  for (p = 0; p < 0x100; ) {
+    if (pages[p] && (p == 0 || !pages[p-1])) {
+      pageblocks[npageblocks].start = 16*p;
+      do p++; while (p < 0x100 && pages[p]);
+      j1 = 16*p;
+      while (summary_used[j1-1] == 0) j1--;
+      pageblocks[npageblocks].end = j1;
+      npageblocks++;
+    } else
+      p++;
+  }
+
+  printf("static const unsigned short %s_2charset[%d] = {\n", name, indx);
+  for (i = 0; i < indx; ) {
+    if ((i % 8) == 0) printf(" ");
+    printf(" 0x%04x,", indx2charset[i]);
+    i++;
+    if ((i % 8) == 0 || i == indx) printf("\n");
+  }
+  printf("};\n");
+  printf("\n");
+  for (i = 0; i < npageblocks; i++) {
+    printf("static const Summary16 %s_uni2indx_page%02x[%d] = {\n", name,
+           pageblocks[i].start/16, pageblocks[i].end-pageblocks[i].start);
+    for (j1 = pageblocks[i].start; j1 < pageblocks[i].end; ) {
+      if (((16*j1) % 0x100) == 0) printf("  /""* 0x%04x *""/\n", 16*j1);
+      if ((j1 % 4) == 0) printf(" ");
+      printf(" { %4d, 0x%04x },", summary_indx[j1], summary_used[j1]);
+      j1++;
+      if ((j1 % 4) == 0 || j1 == pageblocks[i].end) printf("\n");
+    }
+    printf("};\n");
+  }
+  printf("\n");
+
+  printf("static int\n");
+  printf("%s_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)\n", name);
+  printf("{\n");
+  printf("  if (n >= 2) {\n");
+  printf("    const Summary16 *summary = NULL;\n");
+  for (i = 0; i < npageblocks; i++) {
+    printf("    ");
+    if (i > 0)
+      printf("else ");
+    printf("if (wc >= 0x%04x && wc < 0x%04x)\n",
+           16*pageblocks[i].start, 16*pageblocks[i].end);
+    printf("      summary = &%s_uni2indx_page%02x[(wc>>4)", name,
+           pageblocks[i].start/16);
+    if (pageblocks[i].start > 0)
+      printf("-0x%03x", pageblocks[i].start);
+    printf("];\n");
+  }
+  printf("    if (summary) {\n");
+  printf("      unsigned short used = summary->used;\n");
+  printf("      unsigned int i = wc & 0x0f;\n");
+  printf("      if (used & ((unsigned short) 1 << i)) {\n");
+  printf("        unsigned short c;\n");
+  printf("        /* Keep in `used' only the bits 0..i-1. */\n");
+  printf("        used &= ((unsigned short) 1 << i) - 1;\n");
+  printf("        /* Add `summary->indx' and the number of bits set in `used'. */\n");
+  printf("        used = (used & 0x5555) + ((used & 0xaaaa) >> 1);\n");
+  printf("        used = (used & 0x3333) + ((used & 0xcccc) >> 2);\n");
+  printf("        used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4);\n");
+  printf("        used = (used & 0x00ff) + (used >> 8);\n");
+  printf("        c = %s_2charset[summary->indx + used];\n", name);
+  printf("        r[0] = (c >> 8); r[1] = (c & 0xff);\n");
+  printf("        return 2;\n");
+  printf("      }\n");
+  printf("    }\n");
+  printf("    return RET_ILSEQ;\n");
+  printf("  }\n");
+  printf("  return RET_TOOSMALL;\n");
+  printf("}\n");
+}
+
+/* ISO-2022/EUC specifics */
+
+static int row_byte_normal (int row) { return 0x21+row; }
+static int col_byte_normal (int col) { return 0x21+col; }
+static int byte_row_normal (int byte) { return byte-0x21; }
+static int byte_col_normal (int byte) { return byte-0x21; }
+
+static void do_normal (const char* name)
+{
+  Encoding enc;
+
+  enc.rows = 94;
+  enc.cols = 94;
+  enc.row_byte = row_byte_normal;
+  enc.col_byte = col_byte_normal;
+  enc.byte_row = byte_row_normal;
+  enc.byte_col = byte_col_normal;
+  enc.check_row_expr = "%1$s >= 0x21 && %1$s < 0x7f";
+  enc.check_col_expr = "%1$s >= 0x21 && %1$s < 0x7f";
+  enc.byte_row_expr = "%1$s - 0x21";
+  enc.byte_col_expr = "%1$s - 0x21";
+
+  read_table(&enc);
+  output_charset2uni(name,&enc);
+  invert(&enc); output_uni2charset_sparse(name,&enc);
+}
+
+/* Note: On first sight, the jisx0212_2charset[] table seems to be in order,
+   starting from the charset=0x3021/uni=0x4e02 pair. But it's only mostly in
+   order. There are 75 out-of-order values, scattered all throughout the table.
+ */
+
+static void do_normal_only_charset2uni (const char* name)
+{
+  Encoding enc;
+
+  enc.rows = 94;
+  enc.cols = 94;
+  enc.row_byte = row_byte_normal;
+  enc.col_byte = col_byte_normal;
+  enc.byte_row = byte_row_normal;
+  enc.byte_col = byte_col_normal;
+  enc.check_row_expr = "%1$s >= 0x21 && %1$s < 0x7f";
+  enc.check_col_expr = "%1$s >= 0x21 && %1$s < 0x7f";
+  enc.byte_row_expr = "%1$s - 0x21";
+  enc.byte_col_expr = "%1$s - 0x21";
+
+  read_table(&enc);
+  output_charset2uni(name,&enc);
+}
+
+/* CNS 11643 specifics - trick to put two tables into one */
+
+static int row_byte_cns11643 (int row) {
+  return 0x100 * (row / 94) + (row % 94) + 0x21;
+}
+static int byte_row_cns11643 (int byte) {
+  return (byte >= 0x100 && byte < 0x200 ? byte-0x121 :
+          byte >= 0x200 && byte < 0x300 ? byte-0x221+94 :
+          byte >= 0x300 && byte < 0x400 ? byte-0x321+2*94 :
+          -1);
+}
+
+static void do_cns11643_only_uni2charset (const char* name)
+{
+  Encoding enc;
+  int j, x;
+
+  enc.rows = 3*94;
+  enc.cols = 94;
+  enc.row_byte = row_byte_cns11643;
+  enc.col_byte = col_byte_normal;
+  enc.byte_row = byte_row_cns11643;
+  enc.byte_col = byte_col_normal;
+  enc.check_row_expr = "%1$s >= 0x21 && %1$s < 0x7f";
+  enc.check_col_expr = "%1$s >= 0x21 && %1$s < 0x7f";
+  enc.byte_row_expr = "%1$s - 0x21";
+  enc.byte_col_expr = "%1$s - 0x21";
+
+  read_table(&enc);
+  invert(&enc);
+  /* Move the 2 plane bits into the unused bits 15 and 7. */
+  for (j = 0; j < 0x10000; j++) {
+    x = enc.uni2charset[j];
+    if (x != 0) {
+      if (x & 0x8080) abort();
+      switch (x >> 16) {
+        case 0: /* plane 1 */ x = (x & 0xffff) | 0x0000; break;
+        case 1: /* plane 2 */ x = (x & 0xffff) | 0x0080; break;
+        case 2: /* plane 3 */ x = (x & 0xffff) | 0x8000; break;
+        default: abort();
+      }
+      enc.uni2charset[j] = x;
+    }
+  }
+  output_uni2charset_sparse(name,&enc);
+}
+
+/* GBK specifics */
+
+static int row_byte_gbk1 (int row) {
+  return 0x81+row;
+}
+static int col_byte_gbk1 (int col) {
+  return (col >= 0x3f ? 0x41 : 0x40) + col;
+}
+static int byte_row_gbk1 (int byte) {
+  if (byte >= 0x81 && byte < 0xff)
+    return byte-0x81;
+  else
+    return -1;
+}
+static int byte_col_gbk1 (int byte) {
+  if (byte >= 0x40 && byte < 0x7f)
+    return byte-0x40;
+  else if (byte >= 0x80 && byte < 0xff)
+    return byte-0x41;
+  else
+    return -1;
+}
+
+static void do_gbk1 (const char* name)
+{
+  Encoding enc;
+
+  enc.rows = 126;
+  enc.cols = 190;
+  enc.row_byte = row_byte_gbk1;
+  enc.col_byte = col_byte_gbk1;
+  enc.byte_row = byte_row_gbk1;
+  enc.byte_col = byte_col_gbk1;
+  enc.check_row_expr = "%1$s >= 0x81 && %1$s < 0xff";
+  enc.check_col_expr = "(%1$s >= 0x40 && %1$s < 0x7f) || (%1$s >= 0x80 && %1$s < 0xff)";
+  enc.byte_row_expr = "%1$s - 0x81";
+  enc.byte_col_expr = "%1$s - (%1$s >= 0x80 ? 0x41 : 0x40)";
+
+  read_table(&enc);
+  output_charset2uni(name,&enc);
+  invert(&enc); output_uni2charset_dense(name,&enc);
+}
+
+static void do_gbk1_only_charset2uni (const char* name)
+{
+  Encoding enc;
+
+  enc.rows = 126;
+  enc.cols = 190;
+  enc.row_byte = row_byte_gbk1;
+  enc.col_byte = col_byte_gbk1;
+  enc.byte_row = byte_row_gbk1;
+  enc.byte_col = byte_col_gbk1;
+  enc.check_row_expr = "%1$s >= 0x81 && %1$s < 0xff";
+  enc.check_col_expr = "(%1$s >= 0x40 && %1$s < 0x7f) || (%1$s >= 0x80 && %1$s < 0xff)";
+  enc.byte_row_expr = "%1$s - 0x81";
+  enc.byte_col_expr = "%1$s - (%1$s >= 0x80 ? 0x41 : 0x40)";
+
+  read_table(&enc);
+  output_charset2uni(name,&enc);
+}
+
+static int row_byte_gbk2 (int row) {
+  return 0x81+row;
+}
+static int col_byte_gbk2 (int col) {
+  return (col >= 0x3f ? 0x41 : 0x40) + col;
+}
+static int byte_row_gbk2 (int byte) {
+  if (byte >= 0x81 && byte < 0xff)
+    return byte-0x81;
+  else
+    return -1;
+}
+static int byte_col_gbk2 (int byte) {
+  if (byte >= 0x40 && byte < 0x7f)
+    return byte-0x40;
+  else if (byte >= 0x80 && byte < 0xa1)
+    return byte-0x41;
+  else
+    return -1;
+}
+
+static void do_gbk2_only_charset2uni (const char* name)
+{
+  Encoding enc;
+
+  enc.rows = 126;
+  enc.cols = 96;
+  enc.row_byte = row_byte_gbk2;
+  enc.col_byte = col_byte_gbk2;
+  enc.byte_row = byte_row_gbk2;
+  enc.byte_col = byte_col_gbk2;
+  enc.check_row_expr = "%1$s >= 0x81 && %1$s < 0xff";
+  enc.check_col_expr = "(%1$s >= 0x40 && %1$s < 0x7f) || (%1$s >= 0x80 && %1$s < 0xa1)";
+  enc.byte_row_expr = "%1$s - 0x81";
+  enc.byte_col_expr = "%1$s - (%1$s >= 0x80 ? 0x41 : 0x40)";
+
+  read_table(&enc);
+  output_charset2uni(name,&enc);
+}
+
+static void do_gbk1_only_uni2charset (const char* name)
+{
+  Encoding enc;
+
+  enc.rows = 126;
+  enc.cols = 190;
+  enc.row_byte = row_byte_gbk1;
+  enc.col_byte = col_byte_gbk1;
+  enc.byte_row = byte_row_gbk1;
+  enc.byte_col = byte_col_gbk1;
+  enc.check_row_expr = "%1$s >= 0x81 && %1$s < 0xff";
+  enc.check_col_expr = "(%1$s >= 0x40 && %1$s < 0x7f) || (%1$s >= 0x80 && %1$s < 0xff)";
+  enc.byte_row_expr = "%1$s - 0x81";
+  enc.byte_col_expr = "%1$s - (%1$s >= 0x80 ? 0x41 : 0x40)";
+
+  read_table(&enc);
+  invert(&enc); output_uni2charset_sparse(name,&enc);
+}
+
+/* KSC 5601 specifics */
+
+/*
+ * Reads the charset2uni table from standard input.
+ */
+static void read_table_ksc5601 (Encoding* enc)
+{
+  int row, col, i, i1, i2, c, j;
+
+  enc->charset2uni = (int**) malloc(enc->rows*sizeof(int*));
+  for (row = 0; row < enc->rows; row++)
+    enc->charset2uni[row] = (int*) malloc(enc->cols*sizeof(int));
+
+  for (row = 0; row < enc->rows; row++)
+    for (col = 0; col < enc->cols; col++)
+      enc->charset2uni[row][col] = 0xfffd;
+
+  c = getc(stdin);
+  ungetc(c,stdin);
+  if (c == '#') {
+    /* Read a unicode.org style .TXT file. */
+    for (;;) {
+      c = getc(stdin);
+      if (c == EOF)
+        break;
+      if (c == '\n' || c == ' ' || c == '\t')
+        continue;
+      if (c == '#') {
+        do { c = getc(stdin); } while (!(c == EOF || c == '\n'));
+        continue;
+      }
+      ungetc(c,stdin);
+      if (scanf("0x%x", &j) != 1)
+        exit(1);
+      i1 = j >> 8;
+      i2 = j & 0xff;
+      if (scanf(" 0x%x", &j) != 1)
+        exit(1);
+      /* Take only the range covered by KS C 5601.1987-0 = KS C 5601.1989-0
+         = KS X 1001.1992, ignore the rest. */
+      if (!(i1 >= 128+33 && i1 < 128+127 && i2 >= 128+33 && i2 < 128+127))
+        continue;  /* KSC5601 specific */
+      i1 &= 0x7f;  /* KSC5601 specific */
+      i2 &= 0x7f;  /* KSC5601 specific */
+      row = enc->byte_row(i1);
+      col = enc->byte_col(i2);
+      if (row < 0 || col < 0) {
+        fprintf(stderr, "lost entry for %02x %02x\n", i1, i2);
+        exit(1);
+      }
+      enc->charset2uni[row][col] = j;
+    }
+  } else {
+    /* Read a table of hexadecimal Unicode values. */
+    for (i1 = 33; i1 < 127; i1++)
+      for (i2 = 33; i2 < 127; i2++) {
+        i = scanf("%x", &j);
+        if (i == EOF)
+          goto read_done;
+        if (i != 1)
+          exit(1);
+        if (j < 0 || j == 0xffff)
+          j = 0xfffd;
+        if (j != 0xfffd) {
+          if (enc->byte_row(i1) < 0 || enc->byte_col(i2) < 0) {
+            fprintf(stderr, "lost entry at %02x %02x\n", i1, i2);
+            exit (1);
+          }
+          enc->charset2uni[enc->byte_row(i1)][enc->byte_col(i2)] = j;
+        }
+      }
+   read_done: ;
+  }
+}
+
+static void do_ksc5601 (const char* name)
+{
+  Encoding enc;
+
+  enc.rows = 94;
+  enc.cols = 94;
+  enc.row_byte = row_byte_normal;
+  enc.col_byte = col_byte_normal;
+  enc.byte_row = byte_row_normal;
+  enc.byte_col = byte_col_normal;
+  enc.check_row_expr = "%1$s >= 0x21 && %1$s < 0x7f";
+  enc.check_col_expr = "%1$s >= 0x21 && %1$s < 0x7f";
+  enc.byte_row_expr = "%1$s - 0x21";
+  enc.byte_col_expr = "%1$s - 0x21";
+
+  read_table_ksc5601(&enc);
+  output_charset2uni(name,&enc);
+  invert(&enc); output_uni2charset_sparse(name,&enc);
+}
+
+/* Big5 specifics */
+
+static int row_byte_big5 (int row) {
+  return 0xa1+row;
+}
+static int col_byte_big5 (int col) {
+  return (col >= 0x3f ? 0x62 : 0x40) + col;
+}
+static int byte_row_big5 (int byte) {
+  if (byte >= 0xa1 && byte < 0xff)
+    return byte-0xa1;
+  else
+    return -1;
+}
+static int byte_col_big5 (int byte) {
+  if (byte >= 0x40 && byte < 0x7f)
+    return byte-0x40;
+  else if (byte >= 0xa1 && byte < 0xff)
+    return byte-0x62;
+  else
+    return -1;
+}
+
+static void do_big5 (const char* name)
+{
+  Encoding enc;
+
+  enc.rows = 94;
+  enc.cols = 157;
+  enc.row_byte = row_byte_big5;
+  enc.col_byte = col_byte_big5;
+  enc.byte_row = byte_row_big5;
+  enc.byte_col = byte_col_big5;
+  enc.check_row_expr = "%1$s >= 0xa1 && %1$s < 0xff";
+  enc.check_col_expr = "(%1$s >= 0x40 && %1$s < 0x7f) || (%1$s >= 0xa1 && %1$s < 0xff)";
+  enc.byte_row_expr = "%1$s - 0xa1";
+  enc.byte_col_expr = "%1$s - (%1$s >= 0xa1 ? 0x62 : 0x40)";
+
+  read_table(&enc);
+  output_charset2uni(name,&enc);
+  invert(&enc); output_uni2charset_sparse(name,&enc);
+}
+
+/* Big5-HKSCS specifics */
+
+static int row_byte_big5hkscs (int row) {
+  return 0x81+row;
+}
+static int col_byte_big5hkscs (int col) {
+  return (col >= 0x3f ? 0x62 : 0x40) + col;
+}
+static int byte_row_big5hkscs (int byte) {
+  if (byte >= 0x81 && byte < 0xff)
+    return byte-0x81;
+  else
+    return -1;
+}
+static int byte_col_big5hkscs (int byte) {
+  if (byte >= 0x40 && byte < 0x7f)
+    return byte-0x40;
+  else if (byte >= 0xa1 && byte < 0xff)
+    return byte-0x62;
+  else
+    return -1;
+}
+
+static void do_big5hkscs (const char* name)
+{
+  Encoding enc;
+
+  enc.rows = 126;
+  enc.cols = 157;
+  enc.row_byte = row_byte_big5hkscs;
+  enc.col_byte = col_byte_big5hkscs;
+  enc.byte_row = byte_row_big5hkscs;
+  enc.byte_col = byte_col_big5hkscs;
+  enc.check_row_expr = "%1$s >= 0x81 && %1$s < 0xff";
+  enc.check_col_expr = "(%1$s >= 0x40 && %1$s < 0x7f) || (%1$s >= 0xa1 && %1$s < 0xff)";
+  enc.byte_row_expr = "%1$s - 0x81";
+  enc.byte_col_expr = "%1$s - (%1$s >= 0xa1 ? 0x62 : 0x40)";
+
+  read_table(&enc);
+  output_charset2uni(name,&enc);
+  invert(&enc); output_uni2charset_sparse(name,&enc);
+}
+
+/* Johab Hangul specifics */
+
+static int row_byte_johab_hangul (int row) {
+  return 0x84+row;
+}
+static int col_byte_johab_hangul (int col) {
+  return (col >= 0x3e ? 0x43 : 0x41) + col;
+}
+static int byte_row_johab_hangul (int byte) {
+  if (byte >= 0x84 && byte < 0xd4)
+    return byte-0x84;
+  else
+    return -1;
+}
+static int byte_col_johab_hangul (int byte) {
+  if (byte >= 0x41 && byte < 0x7f)
+    return byte-0x41;
+  else if (byte >= 0x81 && byte < 0xff)
+    return byte-0x43;
+  else
+    return -1;
+}
+
+static void do_johab_hangul (const char* name)
+{
+  Encoding enc;
+
+  enc.rows = 80;
+  enc.cols = 188;
+  enc.row_byte = row_byte_johab_hangul;
+  enc.col_byte = col_byte_johab_hangul;
+  enc.byte_row = byte_row_johab_hangul;
+  enc.byte_col = byte_col_johab_hangul;
+  enc.check_row_expr = "%1$s >= 0x84 && %1$s < 0xd4";
+  enc.check_col_expr = "(%1$s >= 0x41 && %1$s < 0x7f) || (%1$s >= 0x81 && %1$s < 0xff)";
+  enc.byte_row_expr = "%1$s - 0x84";
+  enc.byte_col_expr = "%1$s - (%1$s >= 0x81 ? 0x43 : 0x41)";
+
+  read_table(&enc);
+  output_charset2uni(name,&enc);
+  invert(&enc); output_uni2charset_dense(name,&enc);
+}
+
+/* SJIS specifics */
+
+static int row_byte_sjis (int row) {
+  return (row >= 0x1f ? 0xc1 : 0x81) + row;
+}
+static int col_byte_sjis (int col) {
+  return (col >= 0x3f ? 0x41 : 0x40) + col;
+}
+static int byte_row_sjis (int byte) {
+  if (byte >= 0x81 && byte < 0xa0)
+    return byte-0x81;
+  else if (byte >= 0xe0)
+    return byte-0xc1;
+  else
+    return -1;
+}
+static int byte_col_sjis (int byte) {
+  if (byte >= 0x40 && byte < 0x7f)
+    return byte-0x40;
+  else if (byte >= 0x80 && byte < 0xfd)
+    return byte-0x41;
+  else
+    return -1;
+}
+
+static void do_sjis (const char* name)
+{
+  Encoding enc;
+
+  enc.rows = 94;
+  enc.cols = 188;
+  enc.row_byte = row_byte_sjis;
+  enc.col_byte = col_byte_sjis;
+  enc.byte_row = byte_row_sjis;
+  enc.byte_col = byte_col_sjis;
+  enc.check_row_expr = "(%1$s >= 0x81 && %1$s < 0xa0) || (%1$s >= 0xe0)";
+  enc.check_col_expr = "(%1$s >= 0x40 && %1$s < 0x7f) || (%1$s >= 0x80 && %1$s < 0xfd)";
+  enc.byte_row_expr = "%1$s - (%1$s >= 0xe0 ? 0xc1 : 0x81)";
+  enc.byte_col_expr = "%1$s - (%1$s >= 0x80 ? 0x41 : 0x40)";
+
+  read_table(&enc);
+  output_charset2uni(name,&enc);
+  invert(&enc); output_uni2charset_sparse(name,&enc);
+}
+
+/* Main program */
+
+int main (int argc, char *argv[])
+{
+  const char* charsetname;
+  const char* name;
+
+  if (argc != 3)
+    exit(1);
+  charsetname = argv[1];
+  name = argv[2];
+
+  output_title(charsetname);
+
+  if (!strcmp(name,"gb2312") || !strcmp(name,"gb12345ext")
+      || !strcmp(name,"jisx0208") || !strcmp(name,"jisx0212"))
+    do_normal(name);
+  else if (!strcmp(name,"cns11643_1") || !strcmp(name,"cns11643_2")
+           || !strcmp(name,"cns11643_3"))
+    do_normal_only_charset2uni(name);
+  else if (!strcmp(name,"cns11643_inv"))
+    do_cns11643_only_uni2charset(name);
+  else if (!strcmp(name,"gbkext1"))
+    do_gbk1_only_charset2uni(name);
+  else if (!strcmp(name,"gbkext2"))
+    do_gbk2_only_charset2uni(name);
+  else if (!strcmp(name,"gbkext_inv"))
+    do_gbk1_only_uni2charset(name);
+  else if (!strcmp(name,"cp936ext"))
+    do_gbk1(name);
+  else if (!strcmp(name,"ksc5601"))
+    do_ksc5601(name);
+  else if (!strcmp(name,"big5") || !strcmp(name,"cp950ext"))
+    do_big5(name);
+  else if (!strcmp(name,"big5hkscs"))
+    do_big5hkscs(name);
+  else if (!strcmp(name,"johab_hangul"))
+    do_johab_hangul(name);
+  else if (!strcmp(name,"cp932ext"))
+    do_sjis(name);
+  else
+    exit(1);
+
+  return 0;
+}
diff --git a/src/xlibi18n/lcUniConv/cp1133.h b/src/xlibi18n/lcUniConv/cp1133.h
new file mode 100644 (file)
index 0000000..cf79b7a
--- /dev/null
@@ -0,0 +1,91 @@
+
+/*
+ * IBM-CP1133
+ */
+
+static const unsigned short cp1133_2uni_1[64] = {
+  /* 0xa0 */
+  0x00a0, 0x0e81, 0x0e82, 0x0e84, 0x0e87, 0x0e88, 0x0eaa, 0x0e8a,
+  0x0e8d, 0x0e94, 0x0e95, 0x0e96, 0x0e97, 0x0e99, 0x0e9a, 0x0e9b,
+  /* 0xb0 */
+  0x0e9c, 0x0e9d, 0x0e9e, 0x0e9f, 0x0ea1, 0x0ea2, 0x0ea3, 0x0ea5,
+  0x0ea7, 0x0eab, 0x0ead, 0x0eae, 0xfffd, 0xfffd, 0xfffd, 0x0eaf,
+  /* 0xc0 */
+  0x0eb0, 0x0eb2, 0x0eb3, 0x0eb4, 0x0eb5, 0x0eb6, 0x0eb7, 0x0eb8,
+  0x0eb9, 0x0ebc, 0x0eb1, 0x0ebb, 0x0ebd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0xd0 */
+  0x0ec0, 0x0ec1, 0x0ec2, 0x0ec3, 0x0ec4, 0x0ec8, 0x0ec9, 0x0eca,
+  0x0ecb, 0x0ecc, 0x0ecd, 0x0ec6, 0xfffd, 0x0edc, 0x0edd, 0x20ad,
+};
+static const unsigned short cp1133_2uni_2[16] = {
+  /* 0xf0 */
+  0x0ed0, 0x0ed1, 0x0ed2, 0x0ed3, 0x0ed4, 0x0ed5, 0x0ed6, 0x0ed7,
+  0x0ed8, 0x0ed9, 0xfffd, 0xfffd, 0x00a2, 0x00ac, 0x00a6, 0xfffd,
+};
+
+static int
+cp1133_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c < 0xa0) {
+    *pwc = (ucs4_t) c;
+    return 1;
+  }
+  else if (c < 0xe0) {
+    unsigned short wc = cp1133_2uni_1[c-0xa0];
+    if (wc != 0xfffd) {
+      *pwc = (ucs4_t) wc;
+      return 1;
+    }
+  }
+  else if (c < 0xf0) {
+  }
+  else {
+    unsigned short wc = cp1133_2uni_2[c-0xf0];
+    if (wc != 0xfffd) {
+      *pwc = (ucs4_t) wc;
+      return 1;
+    }
+  }
+  return RET_ILSEQ;
+}
+
+static const unsigned char cp1133_page00[16] = {
+  0xa0, 0x00, 0xfc, 0x00, 0x00, 0x00, 0xfe, 0x00, /* 0xa0-0xa7 */
+  0x00, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x00, 0x00, /* 0xa8-0xaf */
+};
+static const unsigned char cp1133_page0e[96] = {
+  0x00, 0xa1, 0xa2, 0x00, 0xa3, 0x00, 0x00, 0xa4, /* 0x80-0x87 */
+  0xa5, 0x00, 0xa7, 0x00, 0x00, 0xa8, 0x00, 0x00, /* 0x88-0x8f */
+  0x00, 0x00, 0x00, 0x00, 0xa9, 0xaa, 0xab, 0xac, /* 0x90-0x97 */
+  0x00, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, /* 0x98-0x9f */
+  0x00, 0xb4, 0xb5, 0xb6, 0x00, 0xb7, 0x00, 0xb8, /* 0xa0-0xa7 */
+  0x00, 0x00, 0xa6, 0xb9, 0x00, 0xba, 0xbb, 0xbf, /* 0xa8-0xaf */
+  0xc0, 0xca, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, /* 0xb0-0xb7 */
+  0xc7, 0xc8, 0x00, 0xcb, 0xc9, 0xcc, 0x00, 0x00, /* 0xb8-0xbf */
+  0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0x00, 0xdb, 0x00, /* 0xc0-0xc7 */
+  0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0x00, 0x00, /* 0xc8-0xcf */
+  0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xd0-0xd7 */
+  0xf8, 0xf9, 0x00, 0x00, 0xdd, 0xde, 0x00, 0x00, /* 0xd8-0xdf */
+};
+
+static int
+cp1133_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  unsigned char c = 0;
+  if (wc < 0x00a0) {
+    *r = wc;
+    return 1;
+  }
+  else if (wc >= 0x00a0 && wc < 0x00b0)
+    c = cp1133_page00[wc-0x00a0];
+  else if (wc >= 0x0e80 && wc < 0x0ee0)
+    c = cp1133_page0e[wc-0x0e80];
+  else if (wc == 0x20ad)
+    c = 0xdf;
+  if (c != 0) {
+    *r = c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/cp1251.h b/src/xlibi18n/lcUniConv/cp1251.h
new file mode 100644 (file)
index 0000000..8c0847a
--- /dev/null
@@ -0,0 +1,112 @@
+
+/*
+ * CP1251
+ */
+
+static const unsigned short cp1251_2uni[128] = {
+  /* 0x80 */
+  0x0402, 0x0403, 0x201a, 0x0453, 0x201e, 0x2026, 0x2020, 0x2021,
+  0x20ac, 0x2030, 0x0409, 0x2039, 0x040a, 0x040c, 0x040b, 0x040f,
+  /* 0x90 */
+  0x0452, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
+  0xfffd, 0x2122, 0x0459, 0x203a, 0x045a, 0x045c, 0x045b, 0x045f,
+  /* 0xa0 */
+  0x00a0, 0x040e, 0x045e, 0x0408, 0x00a4, 0x0490, 0x00a6, 0x00a7,
+  0x0401, 0x00a9, 0x0404, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x0407,
+  /* 0xb0 */
+  0x00b0, 0x00b1, 0x0406, 0x0456, 0x0491, 0x00b5, 0x00b6, 0x00b7,
+  0x0451, 0x2116, 0x0454, 0x00bb, 0x0458, 0x0405, 0x0455, 0x0457,
+  /* 0xc0 */
+  0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
+  0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f,
+  /* 0xd0 */
+  0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
+  0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f,
+  /* 0xe0 */
+  0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
+  0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f,
+  /* 0xf0 */
+  0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
+  0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f,
+};
+
+static int
+cp1251_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c < 0x80) {
+    *pwc = (ucs4_t) c;
+    return 1;
+  }
+  else {
+    unsigned short wc = cp1251_2uni[c-0x80];
+    if (wc != 0xfffd) {
+      *pwc = (ucs4_t) wc;
+      return 1;
+    }
+  }
+  return RET_ILSEQ;
+}
+
+static const unsigned char cp1251_page00[32] = {
+  0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */
+  0x00, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00, /* 0xa8-0xaf */
+  0xb0, 0xb1, 0x00, 0x00, 0x00, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */
+  0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */
+};
+static const unsigned char cp1251_page04[152] = {
+  0x00, 0xa8, 0x80, 0x81, 0xaa, 0xbd, 0xb2, 0xaf, /* 0x00-0x07 */
+  0xa3, 0x8a, 0x8c, 0x8e, 0x8d, 0x00, 0xa1, 0x8f, /* 0x08-0x0f */
+  0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x10-0x17 */
+  0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x18-0x1f */
+  0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x20-0x27 */
+  0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0x28-0x2f */
+  0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x30-0x37 */
+  0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x38-0x3f */
+  0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x40-0x47 */
+  0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0x48-0x4f */
+  0x00, 0xb8, 0x90, 0x83, 0xba, 0xbe, 0xb3, 0xbf, /* 0x50-0x57 */
+  0xbc, 0x9a, 0x9c, 0x9e, 0x9d, 0x00, 0xa2, 0x9f, /* 0x58-0x5f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */
+  0xa5, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */
+};
+static const unsigned char cp1251_page20[48] = {
+  0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */
+  0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */
+  0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */
+  0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */
+  0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */
+};
+
+static int
+cp1251_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  unsigned char c = 0;
+  if (wc < 0x0080) {
+    *r = wc;
+    return 1;
+  }
+  else if (wc >= 0x00a0 && wc < 0x00c0)
+    c = cp1251_page00[wc-0x00a0];
+  else if (wc >= 0x0400 && wc < 0x0498)
+    c = cp1251_page04[wc-0x0400];
+  else if (wc >= 0x2010 && wc < 0x2040)
+    c = cp1251_page20[wc-0x2010];
+  else if (wc == 0x20ac)
+    c = 0x88;
+  else if (wc == 0x2116)
+    c = 0xb9;
+  else if (wc == 0x2122)
+    c = 0x99;
+  if (c != 0) {
+    *r = c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/cp1255.h b/src/xlibi18n/lcUniConv/cp1255.h
new file mode 100644 (file)
index 0000000..61b2b59
--- /dev/null
@@ -0,0 +1,120 @@
+
+/*
+ * CP1255
+ */
+
+static const unsigned short cp1255_2uni[128] = {
+  /* 0x80 */
+  0x20ac, 0xfffd, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021,
+  0x02c6, 0x2030, 0xfffd, 0x2039, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0x90 */
+  0xfffd, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
+  0x02dc, 0x2122, 0xfffd, 0x203a, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0xa0 */
+  0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20aa, 0x00a5, 0x00a6, 0x00a7,
+  0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+  /* 0xb0 */
+  0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+  0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+  /* 0xc0 */
+  0x05b0, 0x05b1, 0x05b2, 0x05b3, 0x05b4, 0x05b5, 0x05b6, 0x05b7,
+  0x05b8, 0x05b9, 0xfffd, 0x05bb, 0x05bc, 0x05bd, 0x05be, 0x05bf,
+  /* 0xd0 */
+  0x05c0, 0x05c1, 0x05c2, 0x05c3, 0x05f0, 0x05f1, 0x05f2, 0x05f3,
+  0x05f4, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0xe0 */
+  0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7,
+  0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df,
+  /* 0xf0 */
+  0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7,
+  0x05e8, 0x05e9, 0x05ea, 0xfffd, 0xfffd, 0x200e, 0x200f, 0xfffd,
+};
+
+static int
+cp1255_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c < 0x80) {
+    *pwc = (ucs4_t) c;
+    return 1;
+  }
+  else {
+    unsigned short wc = cp1255_2uni[c-0x80];
+    if (wc != 0xfffd) {
+      *pwc = (ucs4_t) wc;
+      return 1;
+    }
+  }
+  return RET_ILSEQ;
+}
+
+static const unsigned char cp1255_page00[88] = {
+  0xa0, 0xa1, 0xa2, 0xa3, 0x00, 0xa5, 0xa6, 0xa7, /* 0xa0-0xa7 */
+  0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */
+  0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */
+  0xb8, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0xb8-0xbf */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, /* 0xd0-0xd7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, /* 0xf0-0xf7 */
+};
+static const unsigned char cp1255_page02[32] = {
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, /* 0xc0-0xc7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */
+  0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, /* 0xd8-0xdf */
+};
+static const unsigned char cp1255_page05[72] = {
+  0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0xb0-0xb7 */
+  0xc8, 0xc9, 0x00, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xb8-0xbf */
+  0xd0, 0xd1, 0xd2, 0xd3, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */
+  0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xd0-0xd7 */
+  0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xd8-0xdf */
+  0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xe0-0xe7 */
+  0xf8, 0xf9, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */
+  0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */
+};
+static const unsigned char cp1255_page20[56] = {
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xfe, /* 0x08-0x0f */
+  0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */
+  0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */
+  0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */
+  0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */
+  0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */
+};
+
+static int
+cp1255_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  unsigned char c = 0;
+  if (wc < 0x0080) {
+    *r = wc;
+    return 1;
+  }
+  else if (wc >= 0x00a0 && wc < 0x00f8)
+    c = cp1255_page00[wc-0x00a0];
+  else if (wc == 0x0192)
+    c = 0x83;
+  else if (wc >= 0x02c0 && wc < 0x02e0)
+    c = cp1255_page02[wc-0x02c0];
+  else if (wc >= 0x05b0 && wc < 0x05f8)
+    c = cp1255_page05[wc-0x05b0];
+  else if (wc >= 0x2008 && wc < 0x2040)
+    c = cp1255_page20[wc-0x2008];
+  else if (wc == 0x20aa)
+    c = 0xa4;
+  else if (wc == 0x20ac)
+    c = 0x80;
+  else if (wc == 0x2122)
+    c = 0x99;
+  if (c != 0) {
+    *r = c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/cp1256.h b/src/xlibi18n/lcUniConv/cp1256.h
new file mode 100644 (file)
index 0000000..72284f4
--- /dev/null
@@ -0,0 +1,134 @@
+
+/*
+ * CP1256
+ */
+
+static const unsigned short cp1256_2uni[128] = {
+  /* 0x80 */
+  0x20ac, 0x067e, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021,
+  0x02c6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688,
+  /* 0x90 */
+  0x06af, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
+  0x06a9, 0x2122, 0x0691, 0x203a, 0x0153, 0x200c, 0x200d, 0x06ba,
+  /* 0xa0 */
+  0x00a0, 0x060c, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+  0x00a8, 0x00a9, 0x06be, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+  /* 0xb0 */
+  0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+  0x00b8, 0x00b9, 0x061b, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x061f,
+  /* 0xc0 */
+  0x06c1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627,
+  0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f,
+  /* 0xd0 */
+  0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00d7,
+  0x0637, 0x0638, 0x0639, 0x063a, 0x0640, 0x0641, 0x0642, 0x0643,
+  /* 0xe0 */
+  0x00e0, 0x0644, 0x00e2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00e7,
+  0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x0649, 0x064a, 0x00ee, 0x00ef,
+  /* 0xf0 */
+  0x064b, 0x064c, 0x064d, 0x064e, 0x00f4, 0x064f, 0x0650, 0x00f7,
+  0x0651, 0x00f9, 0x0652, 0x00fb, 0x00fc, 0x200e, 0x200f, 0x06d2,
+};
+
+static int
+cp1256_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c < 0x80)
+    *pwc = (ucs4_t) c;
+  else
+    *pwc = (ucs4_t) cp1256_2uni[c-0x80];
+  return 1;
+}
+
+static const unsigned char cp1256_page00[96] = {
+  0xa0, 0x00, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0xa0-0xa7 */
+  0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */
+  0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */
+  0xb8, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, /* 0xb8-0xbf */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd7, /* 0xd0-0xd7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */
+  0xe0, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0xe7, /* 0xe0-0xe7 */
+  0xe8, 0xe9, 0xea, 0xeb, 0x00, 0x00, 0xee, 0xef, /* 0xe8-0xef */
+  0x00, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0xf7, /* 0xf0-0xf7 */
+  0x00, 0xf9, 0x00, 0xfb, 0xfc, 0x00, 0x00, 0x00, /* 0xf8-0xff */
+};
+static const unsigned char cp1256_page01[72] = {
+  0x00, 0x00, 0x8c, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */
+  0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */
+};
+static const unsigned char cp1256_page06[208] = {
+  0x00, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, /* 0x08-0x0f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */
+  0x00, 0x00, 0x00, 0xba, 0x00, 0x00, 0x00, 0xbf, /* 0x18-0x1f */
+  0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */
+  0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */
+  0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd8, /* 0x30-0x37 */
+  0xd9, 0xda, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */
+  0xdc, 0xdd, 0xde, 0xdf, 0xe1, 0xe3, 0xe4, 0xe5, /* 0x40-0x47 */
+  0xe6, 0xec, 0xed, 0xf0, 0xf1, 0xf2, 0xf3, 0xf5, /* 0x48-0x4f */
+  0xf6, 0xf8, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */
+  0x00, 0x8a, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, /* 0x78-0x7f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8d, 0x00, /* 0x80-0x87 */
+  0x8f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */
+  0x00, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */
+  0x8e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */
+  0x00, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, /* 0xa8-0xaf */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */
+  0x00, 0x00, 0x9f, 0x00, 0x00, 0x00, 0xaa, 0x00, /* 0xb8-0xbf */
+  0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */
+  0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */
+};
+static const unsigned char cp1256_page20[56] = {
+  0x00, 0x00, 0x00, 0x00, 0x9d, 0x9e, 0xfd, 0xfe, /* 0x08-0x0f */
+  0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */
+  0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */
+  0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */
+  0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */
+  0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */
+};
+
+static int
+cp1256_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  unsigned char c = 0;
+  if (wc < 0x0080) {
+    *r = wc;
+    return 1;
+  }
+  else if (wc >= 0x00a0 && wc < 0x0100)
+    c = cp1256_page00[wc-0x00a0];
+  else if (wc >= 0x0150 && wc < 0x0198)
+    c = cp1256_page01[wc-0x0150];
+  else if (wc == 0x02c6)
+    c = 0x88;
+  else if (wc >= 0x0608 && wc < 0x06d8)
+    c = cp1256_page06[wc-0x0608];
+  else if (wc >= 0x2008 && wc < 0x2040)
+    c = cp1256_page20[wc-0x2008];
+  else if (wc == 0x20ac)
+    c = 0x80;
+  else if (wc == 0x2122)
+    c = 0x99;
+  if (c != 0) {
+    *r = c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/gb2312.h b/src/xlibi18n/lcUniConv/gb2312.h
new file mode 100644 (file)
index 0000000..2eec308
--- /dev/null
@@ -0,0 +1,2552 @@
+
+/*
+ * GB2312.1980-0
+ */
+
+static const unsigned short gb2312_2uni_page21[831] = {
+  /* 0x21 */
+  0x3000, 0x3001, 0x3002, 0x30fb, 0x02c9, 0x02c7, 0x00a8, 0x3003,
+  0x3005, 0x2015, 0xff5e, 0x2016, 0x2026, 0x2018, 0x2019, 0x201c,
+  0x201d, 0x3014, 0x3015, 0x3008, 0x3009, 0x300a, 0x300b, 0x300c,
+  0x300d, 0x300e, 0x300f, 0x3016, 0x3017, 0x3010, 0x3011, 0x00b1,
+  0x00d7, 0x00f7, 0x2236, 0x2227, 0x2228, 0x2211, 0x220f, 0x222a,
+  0x2229, 0x2208, 0x2237, 0x221a, 0x22a5, 0x2225, 0x2220, 0x2312,
+  0x2299, 0x222b, 0x222e, 0x2261, 0x224c, 0x2248, 0x223d, 0x221d,
+  0x2260, 0x226e, 0x226f, 0x2264, 0x2265, 0x221e, 0x2235, 0x2234,
+  0x2642, 0x2640, 0x00b0, 0x2032, 0x2033, 0x2103, 0xff04, 0x00a4,
+  0xffe0, 0xffe1, 0x2030, 0x00a7, 0x2116, 0x2606, 0x2605, 0x25cb,
+  0x25cf, 0x25ce, 0x25c7, 0x25c6, 0x25a1, 0x25a0, 0x25b3, 0x25b2,
+  0x203b, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013,
+  /* 0x22 */
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0x2488, 0x2489, 0x248a, 0x248b, 0x248c, 0x248d, 0x248e, 0x248f,
+  0x2490, 0x2491, 0x2492, 0x2493, 0x2494, 0x2495, 0x2496, 0x2497,
+  0x2498, 0x2499, 0x249a, 0x249b, 0x2474, 0x2475, 0x2476, 0x2477,
+  0x2478, 0x2479, 0x247a, 0x247b, 0x247c, 0x247d, 0x247e, 0x247f,
+  0x2480, 0x2481, 0x2482, 0x2483, 0x2484, 0x2485, 0x2486, 0x2487,
+  0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467,
+  0x2468, 0x2469, 0xfffd, 0xfffd, 0x3220, 0x3221, 0x3222, 0x3223,
+  0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229, 0xfffd, 0xfffd,
+  0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167,
+  0x2168, 0x2169, 0x216a, 0x216b, 0xfffd, 0xfffd,
+  /* 0x23 */
+  0xff01, 0xff02, 0xff03, 0xffe5, 0xff05, 0xff06, 0xff07, 0xff08,
+  0xff09, 0xff0a, 0xff0b, 0xff0c, 0xff0d, 0xff0e, 0xff0f, 0xff10,
+  0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18,
+  0xff19, 0xff1a, 0xff1b, 0xff1c, 0xff1d, 0xff1e, 0xff1f, 0xff20,
+  0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28,
+  0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30,
+  0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38,
+  0xff39, 0xff3a, 0xff3b, 0xff3c, 0xff3d, 0xff3e, 0xff3f, 0xff40,
+  0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48,
+  0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50,
+  0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, 0xff58,
+  0xff59, 0xff5a, 0xff5b, 0xff5c, 0xff5d, 0xffe3,
+  /* 0x24 */
+  0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048,
+  0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f, 0x3050,
+  0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058,
+  0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f, 0x3060,
+  0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068,
+  0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070,
+  0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078,
+  0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x307f, 0x3080,
+  0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088,
+  0x3089, 0x308a, 0x308b, 0x308c, 0x308d, 0x308e, 0x308f, 0x3090,
+  0x3091, 0x3092, 0x3093, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0x25 */
+  0x30a1, 0x30a2, 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7, 0x30a8,
+  0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad, 0x30ae, 0x30af, 0x30b0,
+  0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5, 0x30b6, 0x30b7, 0x30b8,
+  0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd, 0x30be, 0x30bf, 0x30c0,
+  0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5, 0x30c6, 0x30c7, 0x30c8,
+  0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf, 0x30d0,
+  0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5, 0x30d6, 0x30d7, 0x30d8,
+  0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd, 0x30de, 0x30df, 0x30e0,
+  0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7, 0x30e8,
+  0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ee, 0x30ef, 0x30f0,
+  0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5, 0x30f6, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0x26 */
+  0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398,
+  0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0,
+  0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8,
+  0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0,
+  0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0x27 */
+  0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 0x0416,
+  0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e,
+  0x041f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426,
+  0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e,
+  0x042f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436,
+  0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e,
+  0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446,
+  0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e,
+  0x044f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0x28 */
+  0x0101, 0x00e1, 0x01ce, 0x00e0, 0x0113, 0x00e9, 0x011b, 0x00e8,
+  0x012b, 0x00ed, 0x01d0, 0x00ec, 0x014d, 0x00f3, 0x01d2, 0x00f2,
+  0x016b, 0x00fa, 0x01d4, 0x00f9, 0x01d6, 0x01d8, 0x01da, 0x01dc,
+  0x00fc, 0x00ea, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x3105, 0x3106, 0x3107, 0x3108,
+  0x3109, 0x310a, 0x310b, 0x310c, 0x310d, 0x310e, 0x310f, 0x3110,
+  0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, 0x3118,
+  0x3119, 0x311a, 0x311b, 0x311c, 0x311d, 0x311e, 0x311f, 0x3120,
+  0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128,
+  0x3129, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0x29 */
+  0xfffd, 0xfffd, 0xfffd, 0x2500, 0x2501, 0x2502, 0x2503, 0x2504,
+  0x2505, 0x2506, 0x2507, 0x2508, 0x2509, 0x250a, 0x250b, 0x250c,
+  0x250d, 0x250e, 0x250f, 0x2510, 0x2511, 0x2512, 0x2513, 0x2514,
+  0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x251a, 0x251b, 0x251c,
+  0x251d, 0x251e, 0x251f, 0x2520, 0x2521, 0x2522, 0x2523, 0x2524,
+  0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252a, 0x252b, 0x252c,
+  0x252d, 0x252e, 0x252f, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534,
+  0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253a, 0x253b, 0x253c,
+  0x253d, 0x253e, 0x253f, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544,
+  0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254a, 0x254b,
+};
+static const unsigned short gb2312_2uni_page30[6768] = {
+  /* 0x30 */
+  0x554a, 0x963f, 0x57c3, 0x6328, 0x54ce, 0x5509, 0x54c0, 0x7691,
+  0x764c, 0x853c, 0x77ee, 0x827e, 0x788d, 0x7231, 0x9698, 0x978d,
+  0x6c28, 0x5b89, 0x4ffa, 0x6309, 0x6697, 0x5cb8, 0x80fa, 0x6848,
+  0x80ae, 0x6602, 0x76ce, 0x51f9, 0x6556, 0x71ac, 0x7ff1, 0x8884,
+  0x50b2, 0x5965, 0x61ca, 0x6fb3, 0x82ad, 0x634c, 0x6252, 0x53ed,
+  0x5427, 0x7b06, 0x516b, 0x75a4, 0x5df4, 0x62d4, 0x8dcb, 0x9776,
+  0x628a, 0x8019, 0x575d, 0x9738, 0x7f62, 0x7238, 0x767d, 0x67cf,
+  0x767e, 0x6446, 0x4f70, 0x8d25, 0x62dc, 0x7a17, 0x6591, 0x73ed,
+  0x642c, 0x6273, 0x822c, 0x9881, 0x677f, 0x7248, 0x626e, 0x62cc,
+  0x4f34, 0x74e3, 0x534a, 0x529e, 0x7eca, 0x90a6, 0x5e2e, 0x6886,
+  0x699c, 0x8180, 0x7ed1, 0x68d2, 0x78c5, 0x868c, 0x9551, 0x508d,
+  0x8c24, 0x82de, 0x80de, 0x5305, 0x8912, 0x5265,
+  /* 0x31 */
+  0x8584, 0x96f9, 0x4fdd, 0x5821, 0x9971, 0x5b9d, 0x62b1, 0x62a5,
+  0x66b4, 0x8c79, 0x9c8d, 0x7206, 0x676f, 0x7891, 0x60b2, 0x5351,
+  0x5317, 0x8f88, 0x80cc, 0x8d1d, 0x94a1, 0x500d, 0x72c8, 0x5907,
+  0x60eb, 0x7119, 0x88ab, 0x5954, 0x82ef, 0x672c, 0x7b28, 0x5d29,
+  0x7ef7, 0x752d, 0x6cf5, 0x8e66, 0x8ff8, 0x903c, 0x9f3b, 0x6bd4,
+  0x9119, 0x7b14, 0x5f7c, 0x78a7, 0x84d6, 0x853d, 0x6bd5, 0x6bd9,
+  0x6bd6, 0x5e01, 0x5e87, 0x75f9, 0x95ed, 0x655d, 0x5f0a, 0x5fc5,
+  0x8f9f, 0x58c1, 0x81c2, 0x907f, 0x965b, 0x97ad, 0x8fb9, 0x7f16,
+  0x8d2c, 0x6241, 0x4fbf, 0x53d8, 0x535e, 0x8fa8, 0x8fa9, 0x8fab,
+  0x904d, 0x6807, 0x5f6a, 0x8198, 0x8868, 0x9cd6, 0x618b, 0x522b,
+  0x762a, 0x5f6c, 0x658c, 0x6fd2, 0x6ee8, 0x5bbe, 0x6448, 0x5175,
+  0x51b0, 0x67c4, 0x4e19, 0x79c9, 0x997c, 0x70b3,
+  /* 0x32 */
+  0x75c5, 0x5e76, 0x73bb, 0x83e0, 0x64ad, 0x62e8, 0x94b5, 0x6ce2,
+  0x535a, 0x52c3, 0x640f, 0x94c2, 0x7b94, 0x4f2f, 0x5e1b, 0x8236,
+  0x8116, 0x818a, 0x6e24, 0x6cca, 0x9a73, 0x6355, 0x535c, 0x54fa,
+  0x8865, 0x57e0, 0x4e0d, 0x5e03, 0x6b65, 0x7c3f, 0x90e8, 0x6016,
+  0x64e6, 0x731c, 0x88c1, 0x6750, 0x624d, 0x8d22, 0x776c, 0x8e29,
+  0x91c7, 0x5f69, 0x83dc, 0x8521, 0x9910, 0x53c2, 0x8695, 0x6b8b,
+  0x60ed, 0x60e8, 0x707f, 0x82cd, 0x8231, 0x4ed3, 0x6ca7, 0x85cf,
+  0x64cd, 0x7cd9, 0x69fd, 0x66f9, 0x8349, 0x5395, 0x7b56, 0x4fa7,
+  0x518c, 0x6d4b, 0x5c42, 0x8e6d, 0x63d2, 0x53c9, 0x832c, 0x8336,
+  0x67e5, 0x78b4, 0x643d, 0x5bdf, 0x5c94, 0x5dee, 0x8be7, 0x62c6,
+  0x67f4, 0x8c7a, 0x6400, 0x63ba, 0x8749, 0x998b, 0x8c17, 0x7f20,
+  0x94f2, 0x4ea7, 0x9610, 0x98a4, 0x660c, 0x7316,
+  /* 0x33 */
+  0x573a, 0x5c1d, 0x5e38, 0x957f, 0x507f, 0x80a0, 0x5382, 0x655e,
+  0x7545, 0x5531, 0x5021, 0x8d85, 0x6284, 0x949e, 0x671d, 0x5632,
+  0x6f6e, 0x5de2, 0x5435, 0x7092, 0x8f66, 0x626f, 0x64a4, 0x63a3,
+  0x5f7b, 0x6f88, 0x90f4, 0x81e3, 0x8fb0, 0x5c18, 0x6668, 0x5ff1,
+  0x6c89, 0x9648, 0x8d81, 0x886c, 0x6491, 0x79f0, 0x57ce, 0x6a59,
+  0x6210, 0x5448, 0x4e58, 0x7a0b, 0x60e9, 0x6f84, 0x8bda, 0x627f,
+  0x901e, 0x9a8b, 0x79e4, 0x5403, 0x75f4, 0x6301, 0x5319, 0x6c60,
+  0x8fdf, 0x5f1b, 0x9a70, 0x803b, 0x9f7f, 0x4f88, 0x5c3a, 0x8d64,
+  0x7fc5, 0x65a5, 0x70bd, 0x5145, 0x51b2, 0x866b, 0x5d07, 0x5ba0,
+  0x62bd, 0x916c, 0x7574, 0x8e0c, 0x7a20, 0x6101, 0x7b79, 0x4ec7,
+  0x7ef8, 0x7785, 0x4e11, 0x81ed, 0x521d, 0x51fa, 0x6a71, 0x53a8,
+  0x8e87, 0x9504, 0x96cf, 0x6ec1, 0x9664, 0x695a,
+  /* 0x34 */
+  0x7840, 0x50a8, 0x77d7, 0x6410, 0x89e6, 0x5904, 0x63e3, 0x5ddd,
+  0x7a7f, 0x693d, 0x4f20, 0x8239, 0x5598, 0x4e32, 0x75ae, 0x7a97,
+  0x5e62, 0x5e8a, 0x95ef, 0x521b, 0x5439, 0x708a, 0x6376, 0x9524,
+  0x5782, 0x6625, 0x693f, 0x9187, 0x5507, 0x6df3, 0x7eaf, 0x8822,
+  0x6233, 0x7ef0, 0x75b5, 0x8328, 0x78c1, 0x96cc, 0x8f9e, 0x6148,
+  0x74f7, 0x8bcd, 0x6b64, 0x523a, 0x8d50, 0x6b21, 0x806a, 0x8471,
+  0x56f1, 0x5306, 0x4ece, 0x4e1b, 0x51d1, 0x7c97, 0x918b, 0x7c07,
+  0x4fc3, 0x8e7f, 0x7be1, 0x7a9c, 0x6467, 0x5d14, 0x50ac, 0x8106,
+  0x7601, 0x7cb9, 0x6dec, 0x7fe0, 0x6751, 0x5b58, 0x5bf8, 0x78cb,
+  0x64ae, 0x6413, 0x63aa, 0x632b, 0x9519, 0x642d, 0x8fbe, 0x7b54,
+  0x7629, 0x6253, 0x5927, 0x5446, 0x6b79, 0x50a3, 0x6234, 0x5e26,
+  0x6b86, 0x4ee3, 0x8d37, 0x888b, 0x5f85, 0x902e,
+  /* 0x35 */
+  0x6020, 0x803d, 0x62c5, 0x4e39, 0x5355, 0x90f8, 0x63b8, 0x80c6,
+  0x65e6, 0x6c2e, 0x4f46, 0x60ee, 0x6de1, 0x8bde, 0x5f39, 0x86cb,
+  0x5f53, 0x6321, 0x515a, 0x8361, 0x6863, 0x5200, 0x6363, 0x8e48,
+  0x5012, 0x5c9b, 0x7977, 0x5bfc, 0x5230, 0x7a3b, 0x60bc, 0x9053,
+  0x76d7, 0x5fb7, 0x5f97, 0x7684, 0x8e6c, 0x706f, 0x767b, 0x7b49,
+  0x77aa, 0x51f3, 0x9093, 0x5824, 0x4f4e, 0x6ef4, 0x8fea, 0x654c,
+  0x7b1b, 0x72c4, 0x6da4, 0x7fdf, 0x5ae1, 0x62b5, 0x5e95, 0x5730,
+  0x8482, 0x7b2c, 0x5e1d, 0x5f1f, 0x9012, 0x7f14, 0x98a0, 0x6382,
+  0x6ec7, 0x7898, 0x70b9, 0x5178, 0x975b, 0x57ab, 0x7535, 0x4f43,
+  0x7538, 0x5e97, 0x60e6, 0x5960, 0x6dc0, 0x6bbf, 0x7889, 0x53fc,
+  0x96d5, 0x51cb, 0x5201, 0x6389, 0x540a, 0x9493, 0x8c03, 0x8dcc,
+  0x7239, 0x789f, 0x8776, 0x8fed, 0x8c0d, 0x53e0,
+  /* 0x36 */
+  0x4e01, 0x76ef, 0x53ee, 0x9489, 0x9876, 0x9f0e, 0x952d, 0x5b9a,
+  0x8ba2, 0x4e22, 0x4e1c, 0x51ac, 0x8463, 0x61c2, 0x52a8, 0x680b,
+  0x4f97, 0x606b, 0x51bb, 0x6d1e, 0x515c, 0x6296, 0x6597, 0x9661,
+  0x8c46, 0x9017, 0x75d8, 0x90fd, 0x7763, 0x6bd2, 0x728a, 0x72ec,
+  0x8bfb, 0x5835, 0x7779, 0x8d4c, 0x675c, 0x9540, 0x809a, 0x5ea6,
+  0x6e21, 0x5992, 0x7aef, 0x77ed, 0x953b, 0x6bb5, 0x65ad, 0x7f0e,
+  0x5806, 0x5151, 0x961f, 0x5bf9, 0x58a9, 0x5428, 0x8e72, 0x6566,
+  0x987f, 0x56e4, 0x949d, 0x76fe, 0x9041, 0x6387, 0x54c6, 0x591a,
+  0x593a, 0x579b, 0x8eb2, 0x6735, 0x8dfa, 0x8235, 0x5241, 0x60f0,
+  0x5815, 0x86fe, 0x5ce8, 0x9e45, 0x4fc4, 0x989d, 0x8bb9, 0x5a25,
+  0x6076, 0x5384, 0x627c, 0x904f, 0x9102, 0x997f, 0x6069, 0x800c,
+  0x513f, 0x8033, 0x5c14, 0x9975, 0x6d31, 0x4e8c,
+  /* 0x37 */
+  0x8d30, 0x53d1, 0x7f5a, 0x7b4f, 0x4f10, 0x4e4f, 0x9600, 0x6cd5,
+  0x73d0, 0x85e9, 0x5e06, 0x756a, 0x7ffb, 0x6a0a, 0x77fe, 0x9492,
+  0x7e41, 0x51e1, 0x70e6, 0x53cd, 0x8fd4, 0x8303, 0x8d29, 0x72af,
+  0x996d, 0x6cdb, 0x574a, 0x82b3, 0x65b9, 0x80aa, 0x623f, 0x9632,
+  0x59a8, 0x4eff, 0x8bbf, 0x7eba, 0x653e, 0x83f2, 0x975e, 0x5561,
+  0x98de, 0x80a5, 0x532a, 0x8bfd, 0x5420, 0x80ba, 0x5e9f, 0x6cb8,
+  0x8d39, 0x82ac, 0x915a, 0x5429, 0x6c1b, 0x5206, 0x7eb7, 0x575f,
+  0x711a, 0x6c7e, 0x7c89, 0x594b, 0x4efd, 0x5fff, 0x6124, 0x7caa,
+  0x4e30, 0x5c01, 0x67ab, 0x8702, 0x5cf0, 0x950b, 0x98ce, 0x75af,
+  0x70fd, 0x9022, 0x51af, 0x7f1d, 0x8bbd, 0x5949, 0x51e4, 0x4f5b,
+  0x5426, 0x592b, 0x6577, 0x80a4, 0x5b75, 0x6276, 0x62c2, 0x8f90,
+  0x5e45, 0x6c1f, 0x7b26, 0x4f0f, 0x4fd8, 0x670d,
+  /* 0x38 */
+  0x6d6e, 0x6daa, 0x798f, 0x88b1, 0x5f17, 0x752b, 0x629a, 0x8f85,
+  0x4fef, 0x91dc, 0x65a7, 0x812f, 0x8151, 0x5e9c, 0x8150, 0x8d74,
+  0x526f, 0x8986, 0x8d4b, 0x590d, 0x5085, 0x4ed8, 0x961c, 0x7236,
+  0x8179, 0x8d1f, 0x5bcc, 0x8ba3, 0x9644, 0x5987, 0x7f1a, 0x5490,
+  0x5676, 0x560e, 0x8be5, 0x6539, 0x6982, 0x9499, 0x76d6, 0x6e89,
+  0x5e72, 0x7518, 0x6746, 0x67d1, 0x7aff, 0x809d, 0x8d76, 0x611f,
+  0x79c6, 0x6562, 0x8d63, 0x5188, 0x521a, 0x94a2, 0x7f38, 0x809b,
+  0x7eb2, 0x5c97, 0x6e2f, 0x6760, 0x7bd9, 0x768b, 0x9ad8, 0x818f,
+  0x7f94, 0x7cd5, 0x641e, 0x9550, 0x7a3f, 0x544a, 0x54e5, 0x6b4c,
+  0x6401, 0x6208, 0x9e3d, 0x80f3, 0x7599, 0x5272, 0x9769, 0x845b,
+  0x683c, 0x86e4, 0x9601, 0x9694, 0x94ec, 0x4e2a, 0x5404, 0x7ed9,
+  0x6839, 0x8ddf, 0x8015, 0x66f4, 0x5e9a, 0x7fb9,
+  /* 0x39 */
+  0x57c2, 0x803f, 0x6897, 0x5de5, 0x653b, 0x529f, 0x606d, 0x9f9a,
+  0x4f9b, 0x8eac, 0x516c, 0x5bab, 0x5f13, 0x5de9, 0x6c5e, 0x62f1,
+  0x8d21, 0x5171, 0x94a9, 0x52fe, 0x6c9f, 0x82df, 0x72d7, 0x57a2,
+  0x6784, 0x8d2d, 0x591f, 0x8f9c, 0x83c7, 0x5495, 0x7b8d, 0x4f30,
+  0x6cbd, 0x5b64, 0x59d1, 0x9f13, 0x53e4, 0x86ca, 0x9aa8, 0x8c37,
+  0x80a1, 0x6545, 0x987e, 0x56fa, 0x96c7, 0x522e, 0x74dc, 0x5250,
+  0x5be1, 0x6302, 0x8902, 0x4e56, 0x62d0, 0x602a, 0x68fa, 0x5173,
+  0x5b98, 0x51a0, 0x89c2, 0x7ba1, 0x9986, 0x7f50, 0x60ef, 0x704c,
+  0x8d2f, 0x5149, 0x5e7f, 0x901b, 0x7470, 0x89c4, 0x572d, 0x7845,
+  0x5f52, 0x9f9f, 0x95fa, 0x8f68, 0x9b3c, 0x8be1, 0x7678, 0x6842,
+  0x67dc, 0x8dea, 0x8d35, 0x523d, 0x8f8a, 0x6eda, 0x68cd, 0x9505,
+  0x90ed, 0x56fd, 0x679c, 0x88f9, 0x8fc7, 0x54c8,
+  /* 0x3a */
+  0x9ab8, 0x5b69, 0x6d77, 0x6c26, 0x4ea5, 0x5bb3, 0x9a87, 0x9163,
+  0x61a8, 0x90af, 0x97e9, 0x542b, 0x6db5, 0x5bd2, 0x51fd, 0x558a,
+  0x7f55, 0x7ff0, 0x64bc, 0x634d, 0x65f1, 0x61be, 0x608d, 0x710a,
+  0x6c57, 0x6c49, 0x592f, 0x676d, 0x822a, 0x58d5, 0x568e, 0x8c6a,
+  0x6beb, 0x90dd, 0x597d, 0x8017, 0x53f7, 0x6d69, 0x5475, 0x559d,
+  0x8377, 0x83cf, 0x6838, 0x79be, 0x548c, 0x4f55, 0x5408, 0x76d2,
+  0x8c89, 0x9602, 0x6cb3, 0x6db8, 0x8d6b, 0x8910, 0x9e64, 0x8d3a,
+  0x563f, 0x9ed1, 0x75d5, 0x5f88, 0x72e0, 0x6068, 0x54fc, 0x4ea8,
+  0x6a2a, 0x8861, 0x6052, 0x8f70, 0x54c4, 0x70d8, 0x8679, 0x9e3f,
+  0x6d2a, 0x5b8f, 0x5f18, 0x7ea2, 0x5589, 0x4faf, 0x7334, 0x543c,
+  0x539a, 0x5019, 0x540e, 0x547c, 0x4e4e, 0x5ffd, 0x745a, 0x58f6,
+  0x846b, 0x80e1, 0x8774, 0x72d0, 0x7cca, 0x6e56,
+  /* 0x3b */
+  0x5f27, 0x864e, 0x552c, 0x62a4, 0x4e92, 0x6caa, 0x6237, 0x82b1,
+  0x54d7, 0x534e, 0x733e, 0x6ed1, 0x753b, 0x5212, 0x5316, 0x8bdd,
+  0x69d0, 0x5f8a, 0x6000, 0x6dee, 0x574f, 0x6b22, 0x73af, 0x6853,
+  0x8fd8, 0x7f13, 0x6362, 0x60a3, 0x5524, 0x75ea, 0x8c62, 0x7115,
+  0x6da3, 0x5ba6, 0x5e7b, 0x8352, 0x614c, 0x9ec4, 0x78fa, 0x8757,
+  0x7c27, 0x7687, 0x51f0, 0x60f6, 0x714c, 0x6643, 0x5e4c, 0x604d,
+  0x8c0e, 0x7070, 0x6325, 0x8f89, 0x5fbd, 0x6062, 0x86d4, 0x56de,
+  0x6bc1, 0x6094, 0x6167, 0x5349, 0x60e0, 0x6666, 0x8d3f, 0x79fd,
+  0x4f1a, 0x70e9, 0x6c47, 0x8bb3, 0x8bf2, 0x7ed8, 0x8364, 0x660f,
+  0x5a5a, 0x9b42, 0x6d51, 0x6df7, 0x8c41, 0x6d3b, 0x4f19, 0x706b,
+  0x83b7, 0x6216, 0x60d1, 0x970d, 0x8d27, 0x7978, 0x51fb, 0x573e,
+  0x57fa, 0x673a, 0x7578, 0x7a3d, 0x79ef, 0x7b95,
+  /* 0x3c */
+  0x808c, 0x9965, 0x8ff9, 0x6fc0, 0x8ba5, 0x9e21, 0x59ec, 0x7ee9,
+  0x7f09, 0x5409, 0x6781, 0x68d8, 0x8f91, 0x7c4d, 0x96c6, 0x53ca,
+  0x6025, 0x75be, 0x6c72, 0x5373, 0x5ac9, 0x7ea7, 0x6324, 0x51e0,
+  0x810a, 0x5df1, 0x84df, 0x6280, 0x5180, 0x5b63, 0x4f0e, 0x796d,
+  0x5242, 0x60b8, 0x6d4e, 0x5bc4, 0x5bc2, 0x8ba1, 0x8bb0, 0x65e2,
+  0x5fcc, 0x9645, 0x5993, 0x7ee7, 0x7eaa, 0x5609, 0x67b7, 0x5939,
+  0x4f73, 0x5bb6, 0x52a0, 0x835a, 0x988a, 0x8d3e, 0x7532, 0x94be,
+  0x5047, 0x7a3c, 0x4ef7, 0x67b6, 0x9a7e, 0x5ac1, 0x6b7c, 0x76d1,
+  0x575a, 0x5c16, 0x7b3a, 0x95f4, 0x714e, 0x517c, 0x80a9, 0x8270,
+  0x5978, 0x7f04, 0x8327, 0x68c0, 0x67ec, 0x78b1, 0x7877, 0x62e3,
+  0x6361, 0x7b80, 0x4fed, 0x526a, 0x51cf, 0x8350, 0x69db, 0x9274,
+  0x8df5, 0x8d31, 0x89c1, 0x952e, 0x7bad, 0x4ef6,
+  /* 0x3d */
+  0x5065, 0x8230, 0x5251, 0x996f, 0x6e10, 0x6e85, 0x6da7, 0x5efa,
+  0x50f5, 0x59dc, 0x5c06, 0x6d46, 0x6c5f, 0x7586, 0x848b, 0x6868,
+  0x5956, 0x8bb2, 0x5320, 0x9171, 0x964d, 0x8549, 0x6912, 0x7901,
+  0x7126, 0x80f6, 0x4ea4, 0x90ca, 0x6d47, 0x9a84, 0x5a07, 0x56bc,
+  0x6405, 0x94f0, 0x77eb, 0x4fa5, 0x811a, 0x72e1, 0x89d2, 0x997a,
+  0x7f34, 0x7ede, 0x527f, 0x6559, 0x9175, 0x8f7f, 0x8f83, 0x53eb,
+  0x7a96, 0x63ed, 0x63a5, 0x7686, 0x79f8, 0x8857, 0x9636, 0x622a,
+  0x52ab, 0x8282, 0x6854, 0x6770, 0x6377, 0x776b, 0x7aed, 0x6d01,
+  0x7ed3, 0x89e3, 0x59d0, 0x6212, 0x85c9, 0x82a5, 0x754c, 0x501f,
+  0x4ecb, 0x75a5, 0x8beb, 0x5c4a, 0x5dfe, 0x7b4b, 0x65a4, 0x91d1,
+  0x4eca, 0x6d25, 0x895f, 0x7d27, 0x9526, 0x4ec5, 0x8c28, 0x8fdb,
+  0x9773, 0x664b, 0x7981, 0x8fd1, 0x70ec, 0x6d78,
+  /* 0x3e */
+  0x5c3d, 0x52b2, 0x8346, 0x5162, 0x830e, 0x775b, 0x6676, 0x9cb8,
+  0x4eac, 0x60ca, 0x7cbe, 0x7cb3, 0x7ecf, 0x4e95, 0x8b66, 0x666f,
+  0x9888, 0x9759, 0x5883, 0x656c, 0x955c, 0x5f84, 0x75c9, 0x9756,
+  0x7adf, 0x7ade, 0x51c0, 0x70af, 0x7a98, 0x63ea, 0x7a76, 0x7ea0,
+  0x7396, 0x97ed, 0x4e45, 0x7078, 0x4e5d, 0x9152, 0x53a9, 0x6551,
+  0x65e7, 0x81fc, 0x8205, 0x548e, 0x5c31, 0x759a, 0x97a0, 0x62d8,
+  0x72d9, 0x75bd, 0x5c45, 0x9a79, 0x83ca, 0x5c40, 0x5480, 0x77e9,
+  0x4e3e, 0x6cae, 0x805a, 0x62d2, 0x636e, 0x5de8, 0x5177, 0x8ddd,
+  0x8e1e, 0x952f, 0x4ff1, 0x53e5, 0x60e7, 0x70ac, 0x5267, 0x6350,
+  0x9e43, 0x5a1f, 0x5026, 0x7737, 0x5377, 0x7ee2, 0x6485, 0x652b,
+  0x6289, 0x6398, 0x5014, 0x7235, 0x89c9, 0x51b3, 0x8bc0, 0x7edd,
+  0x5747, 0x83cc, 0x94a7, 0x519b, 0x541b, 0x5cfb,
+  /* 0x3f */
+  0x4fca, 0x7ae3, 0x6d5a, 0x90e1, 0x9a8f, 0x5580, 0x5496, 0x5361,
+  0x54af, 0x5f00, 0x63e9, 0x6977, 0x51ef, 0x6168, 0x520a, 0x582a,
+  0x52d8, 0x574e, 0x780d, 0x770b, 0x5eb7, 0x6177, 0x7ce0, 0x625b,
+  0x6297, 0x4ea2, 0x7095, 0x8003, 0x62f7, 0x70e4, 0x9760, 0x5777,
+  0x82db, 0x67ef, 0x68f5, 0x78d5, 0x9897, 0x79d1, 0x58f3, 0x54b3,
+  0x53ef, 0x6e34, 0x514b, 0x523b, 0x5ba2, 0x8bfe, 0x80af, 0x5543,
+  0x57a6, 0x6073, 0x5751, 0x542d, 0x7a7a, 0x6050, 0x5b54, 0x63a7,
+  0x62a0, 0x53e3, 0x6263, 0x5bc7, 0x67af, 0x54ed, 0x7a9f, 0x82e6,
+  0x9177, 0x5e93, 0x88e4, 0x5938, 0x57ae, 0x630e, 0x8de8, 0x80ef,
+  0x5757, 0x7b77, 0x4fa9, 0x5feb, 0x5bbd, 0x6b3e, 0x5321, 0x7b50,
+  0x72c2, 0x6846, 0x77ff, 0x7736, 0x65f7, 0x51b5, 0x4e8f, 0x76d4,
+  0x5cbf, 0x7aa5, 0x8475, 0x594e, 0x9b41, 0x5080,
+  /* 0x40 */
+  0x9988, 0x6127, 0x6e83, 0x5764, 0x6606, 0x6346, 0x56f0, 0x62ec,
+  0x6269, 0x5ed3, 0x9614, 0x5783, 0x62c9, 0x5587, 0x8721, 0x814a,
+  0x8fa3, 0x5566, 0x83b1, 0x6765, 0x8d56, 0x84dd, 0x5a6a, 0x680f,
+  0x62e6, 0x7bee, 0x9611, 0x5170, 0x6f9c, 0x8c30, 0x63fd, 0x89c8,
+  0x61d2, 0x7f06, 0x70c2, 0x6ee5, 0x7405, 0x6994, 0x72fc, 0x5eca,
+  0x90ce, 0x6717, 0x6d6a, 0x635e, 0x52b3, 0x7262, 0x8001, 0x4f6c,
+  0x59e5, 0x916a, 0x70d9, 0x6d9d, 0x52d2, 0x4e50, 0x96f7, 0x956d,
+  0x857e, 0x78ca, 0x7d2f, 0x5121, 0x5792, 0x64c2, 0x808b, 0x7c7b,
+  0x6cea, 0x68f1, 0x695e, 0x51b7, 0x5398, 0x68a8, 0x7281, 0x9ece,
+  0x7bf1, 0x72f8, 0x79bb, 0x6f13, 0x7406, 0x674e, 0x91cc, 0x9ca4,
+  0x793c, 0x8389, 0x8354, 0x540f, 0x6817, 0x4e3d, 0x5389, 0x52b1,
+  0x783e, 0x5386, 0x5229, 0x5088, 0x4f8b, 0x4fd0,
+  /* 0x41 */
+  0x75e2, 0x7acb, 0x7c92, 0x6ca5, 0x96b6, 0x529b, 0x7483, 0x54e9,
+  0x4fe9, 0x8054, 0x83b2, 0x8fde, 0x9570, 0x5ec9, 0x601c, 0x6d9f,
+  0x5e18, 0x655b, 0x8138, 0x94fe, 0x604b, 0x70bc, 0x7ec3, 0x7cae,
+  0x51c9, 0x6881, 0x7cb1, 0x826f, 0x4e24, 0x8f86, 0x91cf, 0x667e,
+  0x4eae, 0x8c05, 0x64a9, 0x804a, 0x50da, 0x7597, 0x71ce, 0x5be5,
+  0x8fbd, 0x6f66, 0x4e86, 0x6482, 0x9563, 0x5ed6, 0x6599, 0x5217,
+  0x88c2, 0x70c8, 0x52a3, 0x730e, 0x7433, 0x6797, 0x78f7, 0x9716,
+  0x4e34, 0x90bb, 0x9cde, 0x6dcb, 0x51db, 0x8d41, 0x541d, 0x62ce,
+  0x73b2, 0x83f1, 0x96f6, 0x9f84, 0x94c3, 0x4f36, 0x7f9a, 0x51cc,
+  0x7075, 0x9675, 0x5cad, 0x9886, 0x53e6, 0x4ee4, 0x6e9c, 0x7409,
+  0x69b4, 0x786b, 0x998f, 0x7559, 0x5218, 0x7624, 0x6d41, 0x67f3,
+  0x516d, 0x9f99, 0x804b, 0x5499, 0x7b3c, 0x7abf,
+  /* 0x42 */
+  0x9686, 0x5784, 0x62e2, 0x9647, 0x697c, 0x5a04, 0x6402, 0x7bd3,
+  0x6f0f, 0x964b, 0x82a6, 0x5362, 0x9885, 0x5e90, 0x7089, 0x63b3,
+  0x5364, 0x864f, 0x9c81, 0x9e93, 0x788c, 0x9732, 0x8def, 0x8d42,
+  0x9e7f, 0x6f5e, 0x7984, 0x5f55, 0x9646, 0x622e, 0x9a74, 0x5415,
+  0x94dd, 0x4fa3, 0x65c5, 0x5c65, 0x5c61, 0x7f15, 0x8651, 0x6c2f,
+  0x5f8b, 0x7387, 0x6ee4, 0x7eff, 0x5ce6, 0x631b, 0x5b6a, 0x6ee6,
+  0x5375, 0x4e71, 0x63a0, 0x7565, 0x62a1, 0x8f6e, 0x4f26, 0x4ed1,
+  0x6ca6, 0x7eb6, 0x8bba, 0x841d, 0x87ba, 0x7f57, 0x903b, 0x9523,
+  0x7ba9, 0x9aa1, 0x88f8, 0x843d, 0x6d1b, 0x9a86, 0x7edc, 0x5988,
+  0x9ebb, 0x739b, 0x7801, 0x8682, 0x9a6c, 0x9a82, 0x561b, 0x5417,
+  0x57cb, 0x4e70, 0x9ea6, 0x5356, 0x8fc8, 0x8109, 0x7792, 0x9992,
+  0x86ee, 0x6ee1, 0x8513, 0x66fc, 0x6162, 0x6f2b,
+  /* 0x43 */
+  0x8c29, 0x8292, 0x832b, 0x76f2, 0x6c13, 0x5fd9, 0x83bd, 0x732b,
+  0x8305, 0x951a, 0x6bdb, 0x77db, 0x94c6, 0x536f, 0x8302, 0x5192,
+  0x5e3d, 0x8c8c, 0x8d38, 0x4e48, 0x73ab, 0x679a, 0x6885, 0x9176,
+  0x9709, 0x7164, 0x6ca1, 0x7709, 0x5a92, 0x9541, 0x6bcf, 0x7f8e,
+  0x6627, 0x5bd0, 0x59b9, 0x5a9a, 0x95e8, 0x95f7, 0x4eec, 0x840c,
+  0x8499, 0x6aac, 0x76df, 0x9530, 0x731b, 0x68a6, 0x5b5f, 0x772f,
+  0x919a, 0x9761, 0x7cdc, 0x8ff7, 0x8c1c, 0x5f25, 0x7c73, 0x79d8,
+  0x89c5, 0x6ccc, 0x871c, 0x5bc6, 0x5e42, 0x68c9, 0x7720, 0x7ef5,
+  0x5195, 0x514d, 0x52c9, 0x5a29, 0x7f05, 0x9762, 0x82d7, 0x63cf,
+  0x7784, 0x85d0, 0x79d2, 0x6e3a, 0x5e99, 0x5999, 0x8511, 0x706d,
+  0x6c11, 0x62bf, 0x76bf, 0x654f, 0x60af, 0x95fd, 0x660e, 0x879f,
+  0x9e23, 0x94ed, 0x540d, 0x547d, 0x8c2c, 0x6478,
+  /* 0x44 */
+  0x6479, 0x8611, 0x6a21, 0x819c, 0x78e8, 0x6469, 0x9b54, 0x62b9,
+  0x672b, 0x83ab, 0x58a8, 0x9ed8, 0x6cab, 0x6f20, 0x5bde, 0x964c,
+  0x8c0b, 0x725f, 0x67d0, 0x62c7, 0x7261, 0x4ea9, 0x59c6, 0x6bcd,
+  0x5893, 0x66ae, 0x5e55, 0x52df, 0x6155, 0x6728, 0x76ee, 0x7766,
+  0x7267, 0x7a46, 0x62ff, 0x54ea, 0x5450, 0x94a0, 0x90a3, 0x5a1c,
+  0x7eb3, 0x6c16, 0x4e43, 0x5976, 0x8010, 0x5948, 0x5357, 0x7537,
+  0x96be, 0x56ca, 0x6320, 0x8111, 0x607c, 0x95f9, 0x6dd6, 0x5462,
+  0x9981, 0x5185, 0x5ae9, 0x80fd, 0x59ae, 0x9713, 0x502a, 0x6ce5,
+  0x5c3c, 0x62df, 0x4f60, 0x533f, 0x817b, 0x9006, 0x6eba, 0x852b,
+  0x62c8, 0x5e74, 0x78be, 0x64b5, 0x637b, 0x5ff5, 0x5a18, 0x917f,
+  0x9e1f, 0x5c3f, 0x634f, 0x8042, 0x5b7d, 0x556e, 0x954a, 0x954d,
+  0x6d85, 0x60a8, 0x67e0, 0x72de, 0x51dd, 0x5b81,
+  /* 0x45 */
+  0x62e7, 0x6cde, 0x725b, 0x626d, 0x94ae, 0x7ebd, 0x8113, 0x6d53,
+  0x519c, 0x5f04, 0x5974, 0x52aa, 0x6012, 0x5973, 0x6696, 0x8650,
+  0x759f, 0x632a, 0x61e6, 0x7cef, 0x8bfa, 0x54e6, 0x6b27, 0x9e25,
+  0x6bb4, 0x85d5, 0x5455, 0x5076, 0x6ca4, 0x556a, 0x8db4, 0x722c,
+  0x5e15, 0x6015, 0x7436, 0x62cd, 0x6392, 0x724c, 0x5f98, 0x6e43,
+  0x6d3e, 0x6500, 0x6f58, 0x76d8, 0x78d0, 0x76fc, 0x7554, 0x5224,
+  0x53db, 0x4e53, 0x5e9e, 0x65c1, 0x802a, 0x80d6, 0x629b, 0x5486,
+  0x5228, 0x70ae, 0x888d, 0x8dd1, 0x6ce1, 0x5478, 0x80da, 0x57f9,
+  0x88f4, 0x8d54, 0x966a, 0x914d, 0x4f69, 0x6c9b, 0x55b7, 0x76c6,
+  0x7830, 0x62a8, 0x70f9, 0x6f8e, 0x5f6d, 0x84ec, 0x68da, 0x787c,
+  0x7bf7, 0x81a8, 0x670b, 0x9e4f, 0x6367, 0x78b0, 0x576f, 0x7812,
+  0x9739, 0x6279, 0x62ab, 0x5288, 0x7435, 0x6bd7,
+  /* 0x46 */
+  0x5564, 0x813e, 0x75b2, 0x76ae, 0x5339, 0x75de, 0x50fb, 0x5c41,
+  0x8b6c, 0x7bc7, 0x504f, 0x7247, 0x9a97, 0x98d8, 0x6f02, 0x74e2,
+  0x7968, 0x6487, 0x77a5, 0x62fc, 0x9891, 0x8d2b, 0x54c1, 0x8058,
+  0x4e52, 0x576a, 0x82f9, 0x840d, 0x5e73, 0x51ed, 0x74f6, 0x8bc4,
+  0x5c4f, 0x5761, 0x6cfc, 0x9887, 0x5a46, 0x7834, 0x9b44, 0x8feb,
+  0x7c95, 0x5256, 0x6251, 0x94fa, 0x4ec6, 0x8386, 0x8461, 0x83e9,
+  0x84b2, 0x57d4, 0x6734, 0x5703, 0x666e, 0x6d66, 0x8c31, 0x66dd,
+  0x7011, 0x671f, 0x6b3a, 0x6816, 0x621a, 0x59bb, 0x4e03, 0x51c4,
+  0x6f06, 0x67d2, 0x6c8f, 0x5176, 0x68cb, 0x5947, 0x6b67, 0x7566,
+  0x5d0e, 0x8110, 0x9f50, 0x65d7, 0x7948, 0x7941, 0x9a91, 0x8d77,
+  0x5c82, 0x4e5e, 0x4f01, 0x542f, 0x5951, 0x780c, 0x5668, 0x6c14,
+  0x8fc4, 0x5f03, 0x6c7d, 0x6ce3, 0x8bab, 0x6390,
+  /* 0x47 */
+  0x6070, 0x6d3d, 0x7275, 0x6266, 0x948e, 0x94c5, 0x5343, 0x8fc1,
+  0x7b7e, 0x4edf, 0x8c26, 0x4e7e, 0x9ed4, 0x94b1, 0x94b3, 0x524d,
+  0x6f5c, 0x9063, 0x6d45, 0x8c34, 0x5811, 0x5d4c, 0x6b20, 0x6b49,
+  0x67aa, 0x545b, 0x8154, 0x7f8c, 0x5899, 0x8537, 0x5f3a, 0x62a2,
+  0x6a47, 0x9539, 0x6572, 0x6084, 0x6865, 0x77a7, 0x4e54, 0x4fa8,
+  0x5de7, 0x9798, 0x64ac, 0x7fd8, 0x5ced, 0x4fcf, 0x7a8d, 0x5207,
+  0x8304, 0x4e14, 0x602f, 0x7a83, 0x94a6, 0x4fb5, 0x4eb2, 0x79e6,
+  0x7434, 0x52e4, 0x82b9, 0x64d2, 0x79bd, 0x5bdd, 0x6c81, 0x9752,
+  0x8f7b, 0x6c22, 0x503e, 0x537f, 0x6e05, 0x64ce, 0x6674, 0x6c30,
+  0x60c5, 0x9877, 0x8bf7, 0x5e86, 0x743c, 0x7a77, 0x79cb, 0x4e18,
+  0x90b1, 0x7403, 0x6c42, 0x56da, 0x914b, 0x6cc5, 0x8d8b, 0x533a,
+  0x86c6, 0x66f2, 0x8eaf, 0x5c48, 0x9a71, 0x6e20,
+  /* 0x48 */
+  0x53d6, 0x5a36, 0x9f8b, 0x8da3, 0x53bb, 0x5708, 0x98a7, 0x6743,
+  0x919b, 0x6cc9, 0x5168, 0x75ca, 0x62f3, 0x72ac, 0x5238, 0x529d,
+  0x7f3a, 0x7094, 0x7638, 0x5374, 0x9e4a, 0x69b7, 0x786e, 0x96c0,
+  0x88d9, 0x7fa4, 0x7136, 0x71c3, 0x5189, 0x67d3, 0x74e4, 0x58e4,
+  0x6518, 0x56b7, 0x8ba9, 0x9976, 0x6270, 0x7ed5, 0x60f9, 0x70ed,
+  0x58ec, 0x4ec1, 0x4eba, 0x5fcd, 0x97e7, 0x4efb, 0x8ba4, 0x5203,
+  0x598a, 0x7eab, 0x6254, 0x4ecd, 0x65e5, 0x620e, 0x8338, 0x84c9,
+  0x8363, 0x878d, 0x7194, 0x6eb6, 0x5bb9, 0x7ed2, 0x5197, 0x63c9,
+  0x67d4, 0x8089, 0x8339, 0x8815, 0x5112, 0x5b7a, 0x5982, 0x8fb1,
+  0x4e73, 0x6c5d, 0x5165, 0x8925, 0x8f6f, 0x962e, 0x854a, 0x745e,
+  0x9510, 0x95f0, 0x6da6, 0x82e5, 0x5f31, 0x6492, 0x6d12, 0x8428,
+  0x816e, 0x9cc3, 0x585e, 0x8d5b, 0x4e09, 0x53c1,
+  /* 0x49 */
+  0x4f1e, 0x6563, 0x6851, 0x55d3, 0x4e27, 0x6414, 0x9a9a, 0x626b,
+  0x5ac2, 0x745f, 0x8272, 0x6da9, 0x68ee, 0x50e7, 0x838e, 0x7802,
+  0x6740, 0x5239, 0x6c99, 0x7eb1, 0x50bb, 0x5565, 0x715e, 0x7b5b,
+  0x6652, 0x73ca, 0x82eb, 0x6749, 0x5c71, 0x5220, 0x717d, 0x886b,
+  0x95ea, 0x9655, 0x64c5, 0x8d61, 0x81b3, 0x5584, 0x6c55, 0x6247,
+  0x7f2e, 0x5892, 0x4f24, 0x5546, 0x8d4f, 0x664c, 0x4e0a, 0x5c1a,
+  0x88f3, 0x68a2, 0x634e, 0x7a0d, 0x70e7, 0x828d, 0x52fa, 0x97f6,
+  0x5c11, 0x54e8, 0x90b5, 0x7ecd, 0x5962, 0x8d4a, 0x86c7, 0x820c,
+  0x820d, 0x8d66, 0x6444, 0x5c04, 0x6151, 0x6d89, 0x793e, 0x8bbe,
+  0x7837, 0x7533, 0x547b, 0x4f38, 0x8eab, 0x6df1, 0x5a20, 0x7ec5,
+  0x795e, 0x6c88, 0x5ba1, 0x5a76, 0x751a, 0x80be, 0x614e, 0x6e17,
+  0x58f0, 0x751f, 0x7525, 0x7272, 0x5347, 0x7ef3,
+  /* 0x4a */
+  0x7701, 0x76db, 0x5269, 0x80dc, 0x5723, 0x5e08, 0x5931, 0x72ee,
+  0x65bd, 0x6e7f, 0x8bd7, 0x5c38, 0x8671, 0x5341, 0x77f3, 0x62fe,
+  0x65f6, 0x4ec0, 0x98df, 0x8680, 0x5b9e, 0x8bc6, 0x53f2, 0x77e2,
+  0x4f7f, 0x5c4e, 0x9a76, 0x59cb, 0x5f0f, 0x793a, 0x58eb, 0x4e16,
+  0x67ff, 0x4e8b, 0x62ed, 0x8a93, 0x901d, 0x52bf, 0x662f, 0x55dc,
+  0x566c, 0x9002, 0x4ed5, 0x4f8d, 0x91ca, 0x9970, 0x6c0f, 0x5e02,
+  0x6043, 0x5ba4, 0x89c6, 0x8bd5, 0x6536, 0x624b, 0x9996, 0x5b88,
+  0x5bff, 0x6388, 0x552e, 0x53d7, 0x7626, 0x517d, 0x852c, 0x67a2,
+  0x68b3, 0x6b8a, 0x6292, 0x8f93, 0x53d4, 0x8212, 0x6dd1, 0x758f,
+  0x4e66, 0x8d4e, 0x5b70, 0x719f, 0x85af, 0x6691, 0x66d9, 0x7f72,
+  0x8700, 0x9ecd, 0x9f20, 0x5c5e, 0x672f, 0x8ff0, 0x6811, 0x675f,
+  0x620d, 0x7ad6, 0x5885, 0x5eb6, 0x6570, 0x6f31,
+  /* 0x4b */
+  0x6055, 0x5237, 0x800d, 0x6454, 0x8870, 0x7529, 0x5e05, 0x6813,
+  0x62f4, 0x971c, 0x53cc, 0x723d, 0x8c01, 0x6c34, 0x7761, 0x7a0e,
+  0x542e, 0x77ac, 0x987a, 0x821c, 0x8bf4, 0x7855, 0x6714, 0x70c1,
+  0x65af, 0x6495, 0x5636, 0x601d, 0x79c1, 0x53f8, 0x4e1d, 0x6b7b,
+  0x8086, 0x5bfa, 0x55e3, 0x56db, 0x4f3a, 0x4f3c, 0x9972, 0x5df3,
+  0x677e, 0x8038, 0x6002, 0x9882, 0x9001, 0x5b8b, 0x8bbc, 0x8bf5,
+  0x641c, 0x8258, 0x64de, 0x55fd, 0x82cf, 0x9165, 0x4fd7, 0x7d20,
+  0x901f, 0x7c9f, 0x50f3, 0x5851, 0x6eaf, 0x5bbf, 0x8bc9, 0x8083,
+  0x9178, 0x849c, 0x7b97, 0x867d, 0x968b, 0x968f, 0x7ee5, 0x9ad3,
+  0x788e, 0x5c81, 0x7a57, 0x9042, 0x96a7, 0x795f, 0x5b59, 0x635f,
+  0x7b0b, 0x84d1, 0x68ad, 0x5506, 0x7f29, 0x7410, 0x7d22, 0x9501,
+  0x6240, 0x584c, 0x4ed6, 0x5b83, 0x5979, 0x5854,
+  /* 0x4c */
+  0x736d, 0x631e, 0x8e4b, 0x8e0f, 0x80ce, 0x82d4, 0x62ac, 0x53f0,
+  0x6cf0, 0x915e, 0x592a, 0x6001, 0x6c70, 0x574d, 0x644a, 0x8d2a,
+  0x762b, 0x6ee9, 0x575b, 0x6a80, 0x75f0, 0x6f6d, 0x8c2d, 0x8c08,
+  0x5766, 0x6bef, 0x8892, 0x78b3, 0x63a2, 0x53f9, 0x70ad, 0x6c64,
+  0x5858, 0x642a, 0x5802, 0x68e0, 0x819b, 0x5510, 0x7cd6, 0x5018,
+  0x8eba, 0x6dcc, 0x8d9f, 0x70eb, 0x638f, 0x6d9b, 0x6ed4, 0x7ee6,
+  0x8404, 0x6843, 0x9003, 0x6dd8, 0x9676, 0x8ba8, 0x5957, 0x7279,
+  0x85e4, 0x817e, 0x75bc, 0x8a8a, 0x68af, 0x5254, 0x8e22, 0x9511,
+  0x63d0, 0x9898, 0x8e44, 0x557c, 0x4f53, 0x66ff, 0x568f, 0x60d5,
+  0x6d95, 0x5243, 0x5c49, 0x5929, 0x6dfb, 0x586b, 0x7530, 0x751c,
+  0x606c, 0x8214, 0x8146, 0x6311, 0x6761, 0x8fe2, 0x773a, 0x8df3,
+  0x8d34, 0x94c1, 0x5e16, 0x5385, 0x542c, 0x70c3,
+  /* 0x4d */
+  0x6c40, 0x5ef7, 0x505c, 0x4ead, 0x5ead, 0x633a, 0x8247, 0x901a,
+  0x6850, 0x916e, 0x77b3, 0x540c, 0x94dc, 0x5f64, 0x7ae5, 0x6876,
+  0x6345, 0x7b52, 0x7edf, 0x75db, 0x5077, 0x6295, 0x5934, 0x900f,
+  0x51f8, 0x79c3, 0x7a81, 0x56fe, 0x5f92, 0x9014, 0x6d82, 0x5c60,
+  0x571f, 0x5410, 0x5154, 0x6e4d, 0x56e2, 0x63a8, 0x9893, 0x817f,
+  0x8715, 0x892a, 0x9000, 0x541e, 0x5c6f, 0x81c0, 0x62d6, 0x6258,
+  0x8131, 0x9e35, 0x9640, 0x9a6e, 0x9a7c, 0x692d, 0x59a5, 0x62d3,
+  0x553e, 0x6316, 0x54c7, 0x86d9, 0x6d3c, 0x5a03, 0x74e6, 0x889c,
+  0x6b6a, 0x5916, 0x8c4c, 0x5f2f, 0x6e7e, 0x73a9, 0x987d, 0x4e38,
+  0x70f7, 0x5b8c, 0x7897, 0x633d, 0x665a, 0x7696, 0x60cb, 0x5b9b,
+  0x5a49, 0x4e07, 0x8155, 0x6c6a, 0x738b, 0x4ea1, 0x6789, 0x7f51,
+  0x5f80, 0x65fa, 0x671b, 0x5fd8, 0x5984, 0x5a01,
+  /* 0x4e */
+  0x5dcd, 0x5fae, 0x5371, 0x97e6, 0x8fdd, 0x6845, 0x56f4, 0x552f,
+  0x60df, 0x4e3a, 0x6f4d, 0x7ef4, 0x82c7, 0x840e, 0x59d4, 0x4f1f,
+  0x4f2a, 0x5c3e, 0x7eac, 0x672a, 0x851a, 0x5473, 0x754f, 0x80c3,
+  0x5582, 0x9b4f, 0x4f4d, 0x6e2d, 0x8c13, 0x5c09, 0x6170, 0x536b,
+  0x761f, 0x6e29, 0x868a, 0x6587, 0x95fb, 0x7eb9, 0x543b, 0x7a33,
+  0x7d0a, 0x95ee, 0x55e1, 0x7fc1, 0x74ee, 0x631d, 0x8717, 0x6da1,
+  0x7a9d, 0x6211, 0x65a1, 0x5367, 0x63e1, 0x6c83, 0x5deb, 0x545c,
+  0x94a8, 0x4e4c, 0x6c61, 0x8bec, 0x5c4b, 0x65e0, 0x829c, 0x68a7,
+  0x543e, 0x5434, 0x6bcb, 0x6b66, 0x4e94, 0x6342, 0x5348, 0x821e,
+  0x4f0d, 0x4fae, 0x575e, 0x620a, 0x96fe, 0x6664, 0x7269, 0x52ff,
+  0x52a1, 0x609f, 0x8bef, 0x6614, 0x7199, 0x6790, 0x897f, 0x7852,
+  0x77fd, 0x6670, 0x563b, 0x5438, 0x9521, 0x727a,
+  /* 0x4f */
+  0x7a00, 0x606f, 0x5e0c, 0x6089, 0x819d, 0x5915, 0x60dc, 0x7184,
+  0x70ef, 0x6eaa, 0x6c50, 0x7280, 0x6a84, 0x88ad, 0x5e2d, 0x4e60,
+  0x5ab3, 0x559c, 0x94e3, 0x6d17, 0x7cfb, 0x9699, 0x620f, 0x7ec6,
+  0x778e, 0x867e, 0x5323, 0x971e, 0x8f96, 0x6687, 0x5ce1, 0x4fa0,
+  0x72ed, 0x4e0b, 0x53a6, 0x590f, 0x5413, 0x6380, 0x9528, 0x5148,
+  0x4ed9, 0x9c9c, 0x7ea4, 0x54b8, 0x8d24, 0x8854, 0x8237, 0x95f2,
+  0x6d8e, 0x5f26, 0x5acc, 0x663e, 0x9669, 0x73b0, 0x732e, 0x53bf,
+  0x817a, 0x9985, 0x7fa1, 0x5baa, 0x9677, 0x9650, 0x7ebf, 0x76f8,
+  0x53a2, 0x9576, 0x9999, 0x7bb1, 0x8944, 0x6e58, 0x4e61, 0x7fd4,
+  0x7965, 0x8be6, 0x60f3, 0x54cd, 0x4eab, 0x9879, 0x5df7, 0x6a61,
+  0x50cf, 0x5411, 0x8c61, 0x8427, 0x785d, 0x9704, 0x524a, 0x54ee,
+  0x56a3, 0x9500, 0x6d88, 0x5bb5, 0x6dc6, 0x6653,
+  /* 0x50 */
+  0x5c0f, 0x5b5d, 0x6821, 0x8096, 0x5578, 0x7b11, 0x6548, 0x6954,
+  0x4e9b, 0x6b47, 0x874e, 0x978b, 0x534f, 0x631f, 0x643a, 0x90aa,
+  0x659c, 0x80c1, 0x8c10, 0x5199, 0x68b0, 0x5378, 0x87f9, 0x61c8,
+  0x6cc4, 0x6cfb, 0x8c22, 0x5c51, 0x85aa, 0x82af, 0x950c, 0x6b23,
+  0x8f9b, 0x65b0, 0x5ffb, 0x5fc3, 0x4fe1, 0x8845, 0x661f, 0x8165,
+  0x7329, 0x60fa, 0x5174, 0x5211, 0x578b, 0x5f62, 0x90a2, 0x884c,
+  0x9192, 0x5e78, 0x674f, 0x6027, 0x59d3, 0x5144, 0x51f6, 0x80f8,
+  0x5308, 0x6c79, 0x96c4, 0x718a, 0x4f11, 0x4fee, 0x7f9e, 0x673d,
+  0x55c5, 0x9508, 0x79c0, 0x8896, 0x7ee3, 0x589f, 0x620c, 0x9700,
+  0x865a, 0x5618, 0x987b, 0x5f90, 0x8bb8, 0x84c4, 0x9157, 0x53d9,
+  0x65ed, 0x5e8f, 0x755c, 0x6064, 0x7d6e, 0x5a7f, 0x7eea, 0x7eed,
+  0x8f69, 0x55a7, 0x5ba3, 0x60ac, 0x65cb, 0x7384,
+  /* 0x51 */
+  0x9009, 0x7663, 0x7729, 0x7eda, 0x9774, 0x859b, 0x5b66, 0x7a74,
+  0x96ea, 0x8840, 0x52cb, 0x718f, 0x5faa, 0x65ec, 0x8be2, 0x5bfb,
+  0x9a6f, 0x5de1, 0x6b89, 0x6c5b, 0x8bad, 0x8baf, 0x900a, 0x8fc5,
+  0x538b, 0x62bc, 0x9e26, 0x9e2d, 0x5440, 0x4e2b, 0x82bd, 0x7259,
+  0x869c, 0x5d16, 0x8859, 0x6daf, 0x96c5, 0x54d1, 0x4e9a, 0x8bb6,
+  0x7109, 0x54bd, 0x9609, 0x70df, 0x6df9, 0x76d0, 0x4e25, 0x7814,
+  0x8712, 0x5ca9, 0x5ef6, 0x8a00, 0x989c, 0x960e, 0x708e, 0x6cbf,
+  0x5944, 0x63a9, 0x773c, 0x884d, 0x6f14, 0x8273, 0x5830, 0x71d5,
+  0x538c, 0x781a, 0x96c1, 0x5501, 0x5f66, 0x7130, 0x5bb4, 0x8c1a,
+  0x9a8c, 0x6b83, 0x592e, 0x9e2f, 0x79e7, 0x6768, 0x626c, 0x4f6f,
+  0x75a1, 0x7f8a, 0x6d0b, 0x9633, 0x6c27, 0x4ef0, 0x75d2, 0x517b,
+  0x6837, 0x6f3e, 0x9080, 0x8170, 0x5996, 0x7476,
+  /* 0x52 */
+  0x6447, 0x5c27, 0x9065, 0x7a91, 0x8c23, 0x59da, 0x54ac, 0x8200,
+  0x836f, 0x8981, 0x8000, 0x6930, 0x564e, 0x8036, 0x7237, 0x91ce,
+  0x51b6, 0x4e5f, 0x9875, 0x6396, 0x4e1a, 0x53f6, 0x66f3, 0x814b,
+  0x591c, 0x6db2, 0x4e00, 0x58f9, 0x533b, 0x63d6, 0x94f1, 0x4f9d,
+  0x4f0a, 0x8863, 0x9890, 0x5937, 0x9057, 0x79fb, 0x4eea, 0x80f0,
+  0x7591, 0x6c82, 0x5b9c, 0x59e8, 0x5f5d, 0x6905, 0x8681, 0x501a,
+  0x5df2, 0x4e59, 0x77e3, 0x4ee5, 0x827a, 0x6291, 0x6613, 0x9091,
+  0x5c79, 0x4ebf, 0x5f79, 0x81c6, 0x9038, 0x8084, 0x75ab, 0x4ea6,
+  0x88d4, 0x610f, 0x6bc5, 0x5fc6, 0x4e49, 0x76ca, 0x6ea2, 0x8be3,
+  0x8bae, 0x8c0a, 0x8bd1, 0x5f02, 0x7ffc, 0x7fcc, 0x7ece, 0x8335,
+  0x836b, 0x56e0, 0x6bb7, 0x97f3, 0x9634, 0x59fb, 0x541f, 0x94f6,
+  0x6deb, 0x5bc5, 0x996e, 0x5c39, 0x5f15, 0x9690,
+  /* 0x53 */
+  0x5370, 0x82f1, 0x6a31, 0x5a74, 0x9e70, 0x5e94, 0x7f28, 0x83b9,
+  0x8424, 0x8425, 0x8367, 0x8747, 0x8fce, 0x8d62, 0x76c8, 0x5f71,
+  0x9896, 0x786c, 0x6620, 0x54df, 0x62e5, 0x4f63, 0x81c3, 0x75c8,
+  0x5eb8, 0x96cd, 0x8e0a, 0x86f9, 0x548f, 0x6cf3, 0x6d8c, 0x6c38,
+  0x607f, 0x52c7, 0x7528, 0x5e7d, 0x4f18, 0x60a0, 0x5fe7, 0x5c24,
+  0x7531, 0x90ae, 0x94c0, 0x72b9, 0x6cb9, 0x6e38, 0x9149, 0x6709,
+  0x53cb, 0x53f3, 0x4f51, 0x91c9, 0x8bf1, 0x53c8, 0x5e7c, 0x8fc2,
+  0x6de4, 0x4e8e, 0x76c2, 0x6986, 0x865e, 0x611a, 0x8206, 0x4f59,
+  0x4fde, 0x903e, 0x9c7c, 0x6109, 0x6e1d, 0x6e14, 0x9685, 0x4e88,
+  0x5a31, 0x96e8, 0x4e0e, 0x5c7f, 0x79b9, 0x5b87, 0x8bed, 0x7fbd,
+  0x7389, 0x57df, 0x828b, 0x90c1, 0x5401, 0x9047, 0x55bb, 0x5cea,
+  0x5fa1, 0x6108, 0x6b32, 0x72f1, 0x80b2, 0x8a89,
+  /* 0x54 */
+  0x6d74, 0x5bd3, 0x88d5, 0x9884, 0x8c6b, 0x9a6d, 0x9e33, 0x6e0a,
+  0x51a4, 0x5143, 0x57a3, 0x8881, 0x539f, 0x63f4, 0x8f95, 0x56ed,
+  0x5458, 0x5706, 0x733f, 0x6e90, 0x7f18, 0x8fdc, 0x82d1, 0x613f,
+  0x6028, 0x9662, 0x66f0, 0x7ea6, 0x8d8a, 0x8dc3, 0x94a5, 0x5cb3,
+  0x7ca4, 0x6708, 0x60a6, 0x9605, 0x8018, 0x4e91, 0x90e7, 0x5300,
+  0x9668, 0x5141, 0x8fd0, 0x8574, 0x915d, 0x6655, 0x97f5, 0x5b55,
+  0x531d, 0x7838, 0x6742, 0x683d, 0x54c9, 0x707e, 0x5bb0, 0x8f7d,
+  0x518d, 0x5728, 0x54b1, 0x6512, 0x6682, 0x8d5e, 0x8d43, 0x810f,
+  0x846c, 0x906d, 0x7cdf, 0x51ff, 0x85fb, 0x67a3, 0x65e9, 0x6fa1,
+  0x86a4, 0x8e81, 0x566a, 0x9020, 0x7682, 0x7076, 0x71e5, 0x8d23,
+  0x62e9, 0x5219, 0x6cfd, 0x8d3c, 0x600e, 0x589e, 0x618e, 0x66fe,
+  0x8d60, 0x624e, 0x55b3, 0x6e23, 0x672d, 0x8f67,
+  /* 0x55 */
+  0x94e1, 0x95f8, 0x7728, 0x6805, 0x69a8, 0x548b, 0x4e4d, 0x70b8,
+  0x8bc8, 0x6458, 0x658b, 0x5b85, 0x7a84, 0x503a, 0x5be8, 0x77bb,
+  0x6be1, 0x8a79, 0x7c98, 0x6cbe, 0x76cf, 0x65a9, 0x8f97, 0x5d2d,
+  0x5c55, 0x8638, 0x6808, 0x5360, 0x6218, 0x7ad9, 0x6e5b, 0x7efd,
+  0x6a1f, 0x7ae0, 0x5f70, 0x6f33, 0x5f20, 0x638c, 0x6da8, 0x6756,
+  0x4e08, 0x5e10, 0x8d26, 0x4ed7, 0x80c0, 0x7634, 0x969c, 0x62db,
+  0x662d, 0x627e, 0x6cbc, 0x8d75, 0x7167, 0x7f69, 0x5146, 0x8087,
+  0x53ec, 0x906e, 0x6298, 0x54f2, 0x86f0, 0x8f99, 0x8005, 0x9517,
+  0x8517, 0x8fd9, 0x6d59, 0x73cd, 0x659f, 0x771f, 0x7504, 0x7827,
+  0x81fb, 0x8d1e, 0x9488, 0x4fa6, 0x6795, 0x75b9, 0x8bca, 0x9707,
+  0x632f, 0x9547, 0x9635, 0x84b8, 0x6323, 0x7741, 0x5f81, 0x72f0,
+  0x4e89, 0x6014, 0x6574, 0x62ef, 0x6b63, 0x653f,
+  /* 0x56 */
+  0x5e27, 0x75c7, 0x90d1, 0x8bc1, 0x829d, 0x679d, 0x652f, 0x5431,
+  0x8718, 0x77e5, 0x80a2, 0x8102, 0x6c41, 0x4e4b, 0x7ec7, 0x804c,
+  0x76f4, 0x690d, 0x6b96, 0x6267, 0x503c, 0x4f84, 0x5740, 0x6307,
+  0x6b62, 0x8dbe, 0x53ea, 0x65e8, 0x7eb8, 0x5fd7, 0x631a, 0x63b7,
+  0x81f3, 0x81f4, 0x7f6e, 0x5e1c, 0x5cd9, 0x5236, 0x667a, 0x79e9,
+  0x7a1a, 0x8d28, 0x7099, 0x75d4, 0x6ede, 0x6cbb, 0x7a92, 0x4e2d,
+  0x76c5, 0x5fe0, 0x949f, 0x8877, 0x7ec8, 0x79cd, 0x80bf, 0x91cd,
+  0x4ef2, 0x4f17, 0x821f, 0x5468, 0x5dde, 0x6d32, 0x8bcc, 0x7ca5,
+  0x8f74, 0x8098, 0x5e1a, 0x5492, 0x76b1, 0x5b99, 0x663c, 0x9aa4,
+  0x73e0, 0x682a, 0x86db, 0x6731, 0x732a, 0x8bf8, 0x8bdb, 0x9010,
+  0x7af9, 0x70db, 0x716e, 0x62c4, 0x77a9, 0x5631, 0x4e3b, 0x8457,
+  0x67f1, 0x52a9, 0x86c0, 0x8d2e, 0x94f8, 0x7b51,
+  /* 0x57 */
+  0x4f4f, 0x6ce8, 0x795d, 0x9a7b, 0x6293, 0x722a, 0x62fd, 0x4e13,
+  0x7816, 0x8f6c, 0x64b0, 0x8d5a, 0x7bc6, 0x6869, 0x5e84, 0x88c5,
+  0x5986, 0x649e, 0x58ee, 0x72b6, 0x690e, 0x9525, 0x8ffd, 0x8d58,
+  0x5760, 0x7f00, 0x8c06, 0x51c6, 0x6349, 0x62d9, 0x5353, 0x684c,
+  0x7422, 0x8301, 0x914c, 0x5544, 0x7740, 0x707c, 0x6d4a, 0x5179,
+  0x54a8, 0x8d44, 0x59ff, 0x6ecb, 0x6dc4, 0x5b5c, 0x7d2b, 0x4ed4,
+  0x7c7d, 0x6ed3, 0x5b50, 0x81ea, 0x6e0d, 0x5b57, 0x9b03, 0x68d5,
+  0x8e2a, 0x5b97, 0x7efc, 0x603b, 0x7eb5, 0x90b9, 0x8d70, 0x594f,
+  0x63cd, 0x79df, 0x8db3, 0x5352, 0x65cf, 0x7956, 0x8bc5, 0x963b,
+  0x7ec4, 0x94bb, 0x7e82, 0x5634, 0x9189, 0x6700, 0x7f6a, 0x5c0a,
+  0x9075, 0x6628, 0x5de6, 0x4f50, 0x67de, 0x505a, 0x4f5c, 0x5750,
+  0x5ea7, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0x58 */
+  0x4e8d, 0x4e0c, 0x5140, 0x4e10, 0x5eff, 0x5345, 0x4e15, 0x4e98,
+  0x4e1e, 0x9b32, 0x5b6c, 0x5669, 0x4e28, 0x79ba, 0x4e3f, 0x5315,
+  0x4e47, 0x592d, 0x723b, 0x536e, 0x6c10, 0x56df, 0x80e4, 0x9997,
+  0x6bd3, 0x777e, 0x9f17, 0x4e36, 0x4e9f, 0x9f10, 0x4e5c, 0x4e69,
+  0x4e93, 0x8288, 0x5b5b, 0x556c, 0x560f, 0x4ec4, 0x538d, 0x539d,
+  0x53a3, 0x53a5, 0x53ae, 0x9765, 0x8d5d, 0x531a, 0x53f5, 0x5326,
+  0x532e, 0x533e, 0x8d5c, 0x5366, 0x5363, 0x5202, 0x5208, 0x520e,
+  0x522d, 0x5233, 0x523f, 0x5240, 0x524c, 0x525e, 0x5261, 0x525c,
+  0x84af, 0x527d, 0x5282, 0x5281, 0x5290, 0x5293, 0x5182, 0x7f54,
+  0x4ebb, 0x4ec3, 0x4ec9, 0x4ec2, 0x4ee8, 0x4ee1, 0x4eeb, 0x4ede,
+  0x4f1b, 0x4ef3, 0x4f22, 0x4f64, 0x4ef5, 0x4f25, 0x4f27, 0x4f09,
+  0x4f2b, 0x4f5e, 0x4f67, 0x6538, 0x4f5a, 0x4f5d,
+  /* 0x59 */
+  0x4f5f, 0x4f57, 0x4f32, 0x4f3d, 0x4f76, 0x4f74, 0x4f91, 0x4f89,
+  0x4f83, 0x4f8f, 0x4f7e, 0x4f7b, 0x4faa, 0x4f7c, 0x4fac, 0x4f94,
+  0x4fe6, 0x4fe8, 0x4fea, 0x4fc5, 0x4fda, 0x4fe3, 0x4fdc, 0x4fd1,
+  0x4fdf, 0x4ff8, 0x5029, 0x504c, 0x4ff3, 0x502c, 0x500f, 0x502e,
+  0x502d, 0x4ffe, 0x501c, 0x500c, 0x5025, 0x5028, 0x507e, 0x5043,
+  0x5055, 0x5048, 0x504e, 0x506c, 0x507b, 0x50a5, 0x50a7, 0x50a9,
+  0x50ba, 0x50d6, 0x5106, 0x50ed, 0x50ec, 0x50e6, 0x50ee, 0x5107,
+  0x510b, 0x4edd, 0x6c3d, 0x4f58, 0x4f65, 0x4fce, 0x9fa0, 0x6c46,
+  0x7c74, 0x516e, 0x5dfd, 0x9ec9, 0x9998, 0x5181, 0x5914, 0x52f9,
+  0x530d, 0x8a07, 0x5310, 0x51eb, 0x5919, 0x5155, 0x4ea0, 0x5156,
+  0x4eb3, 0x886e, 0x88a4, 0x4eb5, 0x8114, 0x88d2, 0x7980, 0x5b34,
+  0x8803, 0x7fb8, 0x51ab, 0x51b1, 0x51bd, 0x51bc,
+  /* 0x5a */
+  0x51c7, 0x5196, 0x51a2, 0x51a5, 0x8ba0, 0x8ba6, 0x8ba7, 0x8baa,
+  0x8bb4, 0x8bb5, 0x8bb7, 0x8bc2, 0x8bc3, 0x8bcb, 0x8bcf, 0x8bce,
+  0x8bd2, 0x8bd3, 0x8bd4, 0x8bd6, 0x8bd8, 0x8bd9, 0x8bdc, 0x8bdf,
+  0x8be0, 0x8be4, 0x8be8, 0x8be9, 0x8bee, 0x8bf0, 0x8bf3, 0x8bf6,
+  0x8bf9, 0x8bfc, 0x8bff, 0x8c00, 0x8c02, 0x8c04, 0x8c07, 0x8c0c,
+  0x8c0f, 0x8c11, 0x8c12, 0x8c14, 0x8c15, 0x8c16, 0x8c19, 0x8c1b,
+  0x8c18, 0x8c1d, 0x8c1f, 0x8c20, 0x8c21, 0x8c25, 0x8c27, 0x8c2a,
+  0x8c2b, 0x8c2e, 0x8c2f, 0x8c32, 0x8c33, 0x8c35, 0x8c36, 0x5369,
+  0x537a, 0x961d, 0x9622, 0x9621, 0x9631, 0x962a, 0x963d, 0x963c,
+  0x9642, 0x9649, 0x9654, 0x965f, 0x9667, 0x966c, 0x9672, 0x9674,
+  0x9688, 0x968d, 0x9697, 0x96b0, 0x9097, 0x909b, 0x909d, 0x9099,
+  0x90ac, 0x90a1, 0x90b4, 0x90b3, 0x90b6, 0x90ba,
+  /* 0x5b */
+  0x90b8, 0x90b0, 0x90cf, 0x90c5, 0x90be, 0x90d0, 0x90c4, 0x90c7,
+  0x90d3, 0x90e6, 0x90e2, 0x90dc, 0x90d7, 0x90db, 0x90eb, 0x90ef,
+  0x90fe, 0x9104, 0x9122, 0x911e, 0x9123, 0x9131, 0x912f, 0x9139,
+  0x9143, 0x9146, 0x520d, 0x5942, 0x52a2, 0x52ac, 0x52ad, 0x52be,
+  0x54ff, 0x52d0, 0x52d6, 0x52f0, 0x53df, 0x71ee, 0x77cd, 0x5ef4,
+  0x51f5, 0x51fc, 0x9b2f, 0x53b6, 0x5f01, 0x755a, 0x5def, 0x574c,
+  0x57a9, 0x57a1, 0x587e, 0x58bc, 0x58c5, 0x58d1, 0x5729, 0x572c,
+  0x572a, 0x5733, 0x5739, 0x572e, 0x572f, 0x575c, 0x573b, 0x5742,
+  0x5769, 0x5785, 0x576b, 0x5786, 0x577c, 0x577b, 0x5768, 0x576d,
+  0x5776, 0x5773, 0x57ad, 0x57a4, 0x578c, 0x57b2, 0x57cf, 0x57a7,
+  0x57b4, 0x5793, 0x57a0, 0x57d5, 0x57d8, 0x57da, 0x57d9, 0x57d2,
+  0x57b8, 0x57f4, 0x57ef, 0x57f8, 0x57e4, 0x57dd,
+  /* 0x5c */
+  0x580b, 0x580d, 0x57fd, 0x57ed, 0x5800, 0x581e, 0x5819, 0x5844,
+  0x5820, 0x5865, 0x586c, 0x5881, 0x5889, 0x589a, 0x5880, 0x99a8,
+  0x9f19, 0x61ff, 0x8279, 0x827d, 0x827f, 0x828f, 0x828a, 0x82a8,
+  0x8284, 0x828e, 0x8291, 0x8297, 0x8299, 0x82ab, 0x82b8, 0x82be,
+  0x82b0, 0x82c8, 0x82ca, 0x82e3, 0x8298, 0x82b7, 0x82ae, 0x82cb,
+  0x82cc, 0x82c1, 0x82a9, 0x82b4, 0x82a1, 0x82aa, 0x829f, 0x82c4,
+  0x82ce, 0x82a4, 0x82e1, 0x8309, 0x82f7, 0x82e4, 0x830f, 0x8307,
+  0x82dc, 0x82f4, 0x82d2, 0x82d8, 0x830c, 0x82fb, 0x82d3, 0x8311,
+  0x831a, 0x8306, 0x8314, 0x8315, 0x82e0, 0x82d5, 0x831c, 0x8351,
+  0x835b, 0x835c, 0x8308, 0x8392, 0x833c, 0x8334, 0x8331, 0x839b,
+  0x835e, 0x832f, 0x834f, 0x8347, 0x8343, 0x835f, 0x8340, 0x8317,
+  0x8360, 0x832d, 0x833a, 0x8333, 0x8366, 0x8365,
+  /* 0x5d */
+  0x8368, 0x831b, 0x8369, 0x836c, 0x836a, 0x836d, 0x836e, 0x83b0,
+  0x8378, 0x83b3, 0x83b4, 0x83a0, 0x83aa, 0x8393, 0x839c, 0x8385,
+  0x837c, 0x83b6, 0x83a9, 0x837d, 0x83b8, 0x837b, 0x8398, 0x839e,
+  0x83a8, 0x83ba, 0x83bc, 0x83c1, 0x8401, 0x83e5, 0x83d8, 0x5807,
+  0x8418, 0x840b, 0x83dd, 0x83fd, 0x83d6, 0x841c, 0x8438, 0x8411,
+  0x8406, 0x83d4, 0x83df, 0x840f, 0x8403, 0x83f8, 0x83f9, 0x83ea,
+  0x83c5, 0x83c0, 0x8426, 0x83f0, 0x83e1, 0x845c, 0x8451, 0x845a,
+  0x8459, 0x8473, 0x8487, 0x8488, 0x847a, 0x8489, 0x8478, 0x843c,
+  0x8446, 0x8469, 0x8476, 0x848c, 0x848e, 0x8431, 0x846d, 0x84c1,
+  0x84cd, 0x84d0, 0x84e6, 0x84bd, 0x84d3, 0x84ca, 0x84bf, 0x84ba,
+  0x84e0, 0x84a1, 0x84b9, 0x84b4, 0x8497, 0x84e5, 0x84e3, 0x850c,
+  0x750d, 0x8538, 0x84f0, 0x8539, 0x851f, 0x853a,
+  /* 0x5e */
+  0x8556, 0x853b, 0x84ff, 0x84fc, 0x8559, 0x8548, 0x8568, 0x8564,
+  0x855e, 0x857a, 0x77a2, 0x8543, 0x8572, 0x857b, 0x85a4, 0x85a8,
+  0x8587, 0x858f, 0x8579, 0x85ae, 0x859c, 0x8585, 0x85b9, 0x85b7,
+  0x85b0, 0x85d3, 0x85c1, 0x85dc, 0x85ff, 0x8627, 0x8605, 0x8629,
+  0x8616, 0x863c, 0x5efe, 0x5f08, 0x593c, 0x5941, 0x8037, 0x5955,
+  0x595a, 0x5958, 0x530f, 0x5c22, 0x5c25, 0x5c2c, 0x5c34, 0x624c,
+  0x626a, 0x629f, 0x62bb, 0x62ca, 0x62da, 0x62d7, 0x62ee, 0x6322,
+  0x62f6, 0x6339, 0x634b, 0x6343, 0x63ad, 0x63f6, 0x6371, 0x637a,
+  0x638e, 0x63b4, 0x636d, 0x63ac, 0x638a, 0x6369, 0x63ae, 0x63bc,
+  0x63f2, 0x63f8, 0x63e0, 0x63ff, 0x63c4, 0x63de, 0x63ce, 0x6452,
+  0x63c6, 0x63be, 0x6445, 0x6441, 0x640b, 0x641b, 0x6420, 0x640c,
+  0x6426, 0x6421, 0x645e, 0x6484, 0x646d, 0x6496,
+  /* 0x5f */
+  0x647a, 0x64b7, 0x64b8, 0x6499, 0x64ba, 0x64c0, 0x64d0, 0x64d7,
+  0x64e4, 0x64e2, 0x6509, 0x6525, 0x652e, 0x5f0b, 0x5fd2, 0x7519,
+  0x5f11, 0x535f, 0x53f1, 0x53fd, 0x53e9, 0x53e8, 0x53fb, 0x5412,
+  0x5416, 0x5406, 0x544b, 0x5452, 0x5453, 0x5454, 0x5456, 0x5443,
+  0x5421, 0x5457, 0x5459, 0x5423, 0x5432, 0x5482, 0x5494, 0x5477,
+  0x5471, 0x5464, 0x549a, 0x549b, 0x5484, 0x5476, 0x5466, 0x549d,
+  0x54d0, 0x54ad, 0x54c2, 0x54b4, 0x54d2, 0x54a7, 0x54a6, 0x54d3,
+  0x54d4, 0x5472, 0x54a3, 0x54d5, 0x54bb, 0x54bf, 0x54cc, 0x54d9,
+  0x54da, 0x54dc, 0x54a9, 0x54aa, 0x54a4, 0x54dd, 0x54cf, 0x54de,
+  0x551b, 0x54e7, 0x5520, 0x54fd, 0x5514, 0x54f3, 0x5522, 0x5523,
+  0x550f, 0x5511, 0x5527, 0x552a, 0x5567, 0x558f, 0x55b5, 0x5549,
+  0x556d, 0x5541, 0x5555, 0x553f, 0x5550, 0x553c,
+  /* 0x60 */
+  0x5537, 0x5556, 0x5575, 0x5576, 0x5577, 0x5533, 0x5530, 0x555c,
+  0x558b, 0x55d2, 0x5583, 0x55b1, 0x55b9, 0x5588, 0x5581, 0x559f,
+  0x557e, 0x55d6, 0x5591, 0x557b, 0x55df, 0x55bd, 0x55be, 0x5594,
+  0x5599, 0x55ea, 0x55f7, 0x55c9, 0x561f, 0x55d1, 0x55eb, 0x55ec,
+  0x55d4, 0x55e6, 0x55dd, 0x55c4, 0x55ef, 0x55e5, 0x55f2, 0x55f3,
+  0x55cc, 0x55cd, 0x55e8, 0x55f5, 0x55e4, 0x8f94, 0x561e, 0x5608,
+  0x560c, 0x5601, 0x5624, 0x5623, 0x55fe, 0x5600, 0x5627, 0x562d,
+  0x5658, 0x5639, 0x5657, 0x562c, 0x564d, 0x5662, 0x5659, 0x565c,
+  0x564c, 0x5654, 0x5686, 0x5664, 0x5671, 0x566b, 0x567b, 0x567c,
+  0x5685, 0x5693, 0x56af, 0x56d4, 0x56d7, 0x56dd, 0x56e1, 0x56f5,
+  0x56eb, 0x56f9, 0x56ff, 0x5704, 0x570a, 0x5709, 0x571c, 0x5e0f,
+  0x5e19, 0x5e14, 0x5e11, 0x5e31, 0x5e3b, 0x5e3c,
+  /* 0x61 */
+  0x5e37, 0x5e44, 0x5e54, 0x5e5b, 0x5e5e, 0x5e61, 0x5c8c, 0x5c7a,
+  0x5c8d, 0x5c90, 0x5c96, 0x5c88, 0x5c98, 0x5c99, 0x5c91, 0x5c9a,
+  0x5c9c, 0x5cb5, 0x5ca2, 0x5cbd, 0x5cac, 0x5cab, 0x5cb1, 0x5ca3,
+  0x5cc1, 0x5cb7, 0x5cc4, 0x5cd2, 0x5ce4, 0x5ccb, 0x5ce5, 0x5d02,
+  0x5d03, 0x5d27, 0x5d26, 0x5d2e, 0x5d24, 0x5d1e, 0x5d06, 0x5d1b,
+  0x5d58, 0x5d3e, 0x5d34, 0x5d3d, 0x5d6c, 0x5d5b, 0x5d6f, 0x5d5d,
+  0x5d6b, 0x5d4b, 0x5d4a, 0x5d69, 0x5d74, 0x5d82, 0x5d99, 0x5d9d,
+  0x8c73, 0x5db7, 0x5dc5, 0x5f73, 0x5f77, 0x5f82, 0x5f87, 0x5f89,
+  0x5f8c, 0x5f95, 0x5f99, 0x5f9c, 0x5fa8, 0x5fad, 0x5fb5, 0x5fbc,
+  0x8862, 0x5f61, 0x72ad, 0x72b0, 0x72b4, 0x72b7, 0x72b8, 0x72c3,
+  0x72c1, 0x72ce, 0x72cd, 0x72d2, 0x72e8, 0x72ef, 0x72e9, 0x72f2,
+  0x72f4, 0x72f7, 0x7301, 0x72f3, 0x7303, 0x72fa,
+  /* 0x62 */
+  0x72fb, 0x7317, 0x7313, 0x7321, 0x730a, 0x731e, 0x731d, 0x7315,
+  0x7322, 0x7339, 0x7325, 0x732c, 0x7338, 0x7331, 0x7350, 0x734d,
+  0x7357, 0x7360, 0x736c, 0x736f, 0x737e, 0x821b, 0x5925, 0x98e7,
+  0x5924, 0x5902, 0x9963, 0x9967, 0x9968, 0x9969, 0x996a, 0x996b,
+  0x996c, 0x9974, 0x9977, 0x997d, 0x9980, 0x9984, 0x9987, 0x998a,
+  0x998d, 0x9990, 0x9991, 0x9993, 0x9994, 0x9995, 0x5e80, 0x5e91,
+  0x5e8b, 0x5e96, 0x5ea5, 0x5ea0, 0x5eb9, 0x5eb5, 0x5ebe, 0x5eb3,
+  0x8d53, 0x5ed2, 0x5ed1, 0x5edb, 0x5ee8, 0x5eea, 0x81ba, 0x5fc4,
+  0x5fc9, 0x5fd6, 0x5fcf, 0x6003, 0x5fee, 0x6004, 0x5fe1, 0x5fe4,
+  0x5ffe, 0x6005, 0x6006, 0x5fea, 0x5fed, 0x5ff8, 0x6019, 0x6035,
+  0x6026, 0x601b, 0x600f, 0x600d, 0x6029, 0x602b, 0x600a, 0x603f,
+  0x6021, 0x6078, 0x6079, 0x607b, 0x607a, 0x6042,
+  /* 0x63 */
+  0x606a, 0x607d, 0x6096, 0x609a, 0x60ad, 0x609d, 0x6083, 0x6092,
+  0x608c, 0x609b, 0x60ec, 0x60bb, 0x60b1, 0x60dd, 0x60d8, 0x60c6,
+  0x60da, 0x60b4, 0x6120, 0x6126, 0x6115, 0x6123, 0x60f4, 0x6100,
+  0x610e, 0x612b, 0x614a, 0x6175, 0x61ac, 0x6194, 0x61a7, 0x61b7,
+  0x61d4, 0x61f5, 0x5fdd, 0x96b3, 0x95e9, 0x95eb, 0x95f1, 0x95f3,
+  0x95f5, 0x95f6, 0x95fc, 0x95fe, 0x9603, 0x9604, 0x9606, 0x9608,
+  0x960a, 0x960b, 0x960c, 0x960d, 0x960f, 0x9612, 0x9615, 0x9616,
+  0x9617, 0x9619, 0x961a, 0x4e2c, 0x723f, 0x6215, 0x6c35, 0x6c54,
+  0x6c5c, 0x6c4a, 0x6ca3, 0x6c85, 0x6c90, 0x6c94, 0x6c8c, 0x6c68,
+  0x6c69, 0x6c74, 0x6c76, 0x6c86, 0x6ca9, 0x6cd0, 0x6cd4, 0x6cad,
+  0x6cf7, 0x6cf8, 0x6cf1, 0x6cd7, 0x6cb2, 0x6ce0, 0x6cd6, 0x6cfa,
+  0x6ceb, 0x6cee, 0x6cb1, 0x6cd3, 0x6cef, 0x6cfe,
+  /* 0x64 */
+  0x6d39, 0x6d27, 0x6d0c, 0x6d43, 0x6d48, 0x6d07, 0x6d04, 0x6d19,
+  0x6d0e, 0x6d2b, 0x6d4d, 0x6d2e, 0x6d35, 0x6d1a, 0x6d4f, 0x6d52,
+  0x6d54, 0x6d33, 0x6d91, 0x6d6f, 0x6d9e, 0x6da0, 0x6d5e, 0x6d93,
+  0x6d94, 0x6d5c, 0x6d60, 0x6d7c, 0x6d63, 0x6e1a, 0x6dc7, 0x6dc5,
+  0x6dde, 0x6e0e, 0x6dbf, 0x6de0, 0x6e11, 0x6de6, 0x6ddd, 0x6dd9,
+  0x6e16, 0x6dab, 0x6e0c, 0x6dae, 0x6e2b, 0x6e6e, 0x6e4e, 0x6e6b,
+  0x6eb2, 0x6e5f, 0x6e86, 0x6e53, 0x6e54, 0x6e32, 0x6e25, 0x6e44,
+  0x6edf, 0x6eb1, 0x6e98, 0x6ee0, 0x6f2d, 0x6ee2, 0x6ea5, 0x6ea7,
+  0x6ebd, 0x6ebb, 0x6eb7, 0x6ed7, 0x6eb4, 0x6ecf, 0x6e8f, 0x6ec2,
+  0x6e9f, 0x6f62, 0x6f46, 0x6f47, 0x6f24, 0x6f15, 0x6ef9, 0x6f2f,
+  0x6f36, 0x6f4b, 0x6f74, 0x6f2a, 0x6f09, 0x6f29, 0x6f89, 0x6f8d,
+  0x6f8c, 0x6f78, 0x6f72, 0x6f7c, 0x6f7a, 0x6fd1,
+  /* 0x65 */
+  0x6fc9, 0x6fa7, 0x6fb9, 0x6fb6, 0x6fc2, 0x6fe1, 0x6fee, 0x6fde,
+  0x6fe0, 0x6fef, 0x701a, 0x7023, 0x701b, 0x7039, 0x7035, 0x704f,
+  0x705e, 0x5b80, 0x5b84, 0x5b95, 0x5b93, 0x5ba5, 0x5bb8, 0x752f,
+  0x9a9e, 0x6434, 0x5be4, 0x5bee, 0x8930, 0x5bf0, 0x8e47, 0x8b07,
+  0x8fb6, 0x8fd3, 0x8fd5, 0x8fe5, 0x8fee, 0x8fe4, 0x8fe9, 0x8fe6,
+  0x8ff3, 0x8fe8, 0x9005, 0x9004, 0x900b, 0x9026, 0x9011, 0x900d,
+  0x9016, 0x9021, 0x9035, 0x9036, 0x902d, 0x902f, 0x9044, 0x9051,
+  0x9052, 0x9050, 0x9068, 0x9058, 0x9062, 0x905b, 0x66b9, 0x9074,
+  0x907d, 0x9082, 0x9088, 0x9083, 0x908b, 0x5f50, 0x5f57, 0x5f56,
+  0x5f58, 0x5c3b, 0x54ab, 0x5c50, 0x5c59, 0x5b71, 0x5c63, 0x5c66,
+  0x7fbc, 0x5f2a, 0x5f29, 0x5f2d, 0x8274, 0x5f3c, 0x9b3b, 0x5c6e,
+  0x5981, 0x5983, 0x598d, 0x59a9, 0x59aa, 0x59a3,
+  /* 0x66 */
+  0x5997, 0x59ca, 0x59ab, 0x599e, 0x59a4, 0x59d2, 0x59b2, 0x59af,
+  0x59d7, 0x59be, 0x5a05, 0x5a06, 0x59dd, 0x5a08, 0x59e3, 0x59d8,
+  0x59f9, 0x5a0c, 0x5a09, 0x5a32, 0x5a34, 0x5a11, 0x5a23, 0x5a13,
+  0x5a40, 0x5a67, 0x5a4a, 0x5a55, 0x5a3c, 0x5a62, 0x5a75, 0x80ec,
+  0x5aaa, 0x5a9b, 0x5a77, 0x5a7a, 0x5abe, 0x5aeb, 0x5ab2, 0x5ad2,
+  0x5ad4, 0x5ab8, 0x5ae0, 0x5ae3, 0x5af1, 0x5ad6, 0x5ae6, 0x5ad8,
+  0x5adc, 0x5b09, 0x5b17, 0x5b16, 0x5b32, 0x5b37, 0x5b40, 0x5c15,
+  0x5c1c, 0x5b5a, 0x5b65, 0x5b73, 0x5b51, 0x5b53, 0x5b62, 0x9a75,
+  0x9a77, 0x9a78, 0x9a7a, 0x9a7f, 0x9a7d, 0x9a80, 0x9a81, 0x9a85,
+  0x9a88, 0x9a8a, 0x9a90, 0x9a92, 0x9a93, 0x9a96, 0x9a98, 0x9a9b,
+  0x9a9c, 0x9a9d, 0x9a9f, 0x9aa0, 0x9aa2, 0x9aa3, 0x9aa5, 0x9aa7,
+  0x7e9f, 0x7ea1, 0x7ea3, 0x7ea5, 0x7ea8, 0x7ea9,
+  /* 0x67 */
+  0x7ead, 0x7eb0, 0x7ebe, 0x7ec0, 0x7ec1, 0x7ec2, 0x7ec9, 0x7ecb,
+  0x7ecc, 0x7ed0, 0x7ed4, 0x7ed7, 0x7edb, 0x7ee0, 0x7ee1, 0x7ee8,
+  0x7eeb, 0x7eee, 0x7eef, 0x7ef1, 0x7ef2, 0x7f0d, 0x7ef6, 0x7efa,
+  0x7efb, 0x7efe, 0x7f01, 0x7f02, 0x7f03, 0x7f07, 0x7f08, 0x7f0b,
+  0x7f0c, 0x7f0f, 0x7f11, 0x7f12, 0x7f17, 0x7f19, 0x7f1c, 0x7f1b,
+  0x7f1f, 0x7f21, 0x7f22, 0x7f23, 0x7f24, 0x7f25, 0x7f26, 0x7f27,
+  0x7f2a, 0x7f2b, 0x7f2c, 0x7f2d, 0x7f2f, 0x7f30, 0x7f31, 0x7f32,
+  0x7f33, 0x7f35, 0x5e7a, 0x757f, 0x5ddb, 0x753e, 0x9095, 0x738e,
+  0x7391, 0x73ae, 0x73a2, 0x739f, 0x73cf, 0x73c2, 0x73d1, 0x73b7,
+  0x73b3, 0x73c0, 0x73c9, 0x73c8, 0x73e5, 0x73d9, 0x987c, 0x740a,
+  0x73e9, 0x73e7, 0x73de, 0x73ba, 0x73f2, 0x740f, 0x742a, 0x745b,
+  0x7426, 0x7425, 0x7428, 0x7430, 0x742e, 0x742c,
+  /* 0x68 */
+  0x741b, 0x741a, 0x7441, 0x745c, 0x7457, 0x7455, 0x7459, 0x7477,
+  0x746d, 0x747e, 0x749c, 0x748e, 0x7480, 0x7481, 0x7487, 0x748b,
+  0x749e, 0x74a8, 0x74a9, 0x7490, 0x74a7, 0x74d2, 0x74ba, 0x97ea,
+  0x97eb, 0x97ec, 0x674c, 0x6753, 0x675e, 0x6748, 0x6769, 0x67a5,
+  0x6787, 0x676a, 0x6773, 0x6798, 0x67a7, 0x6775, 0x67a8, 0x679e,
+  0x67ad, 0x678b, 0x6777, 0x677c, 0x67f0, 0x6809, 0x67d8, 0x680a,
+  0x67e9, 0x67b0, 0x680c, 0x67d9, 0x67b5, 0x67da, 0x67b3, 0x67dd,
+  0x6800, 0x67c3, 0x67b8, 0x67e2, 0x680e, 0x67c1, 0x67fd, 0x6832,
+  0x6833, 0x6860, 0x6861, 0x684e, 0x6862, 0x6844, 0x6864, 0x6883,
+  0x681d, 0x6855, 0x6866, 0x6841, 0x6867, 0x6840, 0x683e, 0x684a,
+  0x6849, 0x6829, 0x68b5, 0x688f, 0x6874, 0x6877, 0x6893, 0x686b,
+  0x68c2, 0x696e, 0x68fc, 0x691f, 0x6920, 0x68f9,
+  /* 0x69 */
+  0x6924, 0x68f0, 0x690b, 0x6901, 0x6957, 0x68e3, 0x6910, 0x6971,
+  0x6939, 0x6960, 0x6942, 0x695d, 0x6984, 0x696b, 0x6980, 0x6998,
+  0x6978, 0x6934, 0x69cc, 0x6987, 0x6988, 0x69ce, 0x6989, 0x6966,
+  0x6963, 0x6979, 0x699b, 0x69a7, 0x69bb, 0x69ab, 0x69ad, 0x69d4,
+  0x69b1, 0x69c1, 0x69ca, 0x69df, 0x6995, 0x69e0, 0x698d, 0x69ff,
+  0x6a2f, 0x69ed, 0x6a17, 0x6a18, 0x6a65, 0x69f2, 0x6a44, 0x6a3e,
+  0x6aa0, 0x6a50, 0x6a5b, 0x6a35, 0x6a8e, 0x6a79, 0x6a3d, 0x6a28,
+  0x6a58, 0x6a7c, 0x6a91, 0x6a90, 0x6aa9, 0x6a97, 0x6aab, 0x7337,
+  0x7352, 0x6b81, 0x6b82, 0x6b87, 0x6b84, 0x6b92, 0x6b93, 0x6b8d,
+  0x6b9a, 0x6b9b, 0x6ba1, 0x6baa, 0x8f6b, 0x8f6d, 0x8f71, 0x8f72,
+  0x8f73, 0x8f75, 0x8f76, 0x8f78, 0x8f77, 0x8f79, 0x8f7a, 0x8f7c,
+  0x8f7e, 0x8f81, 0x8f82, 0x8f84, 0x8f87, 0x8f8b,
+  /* 0x6a */
+  0x8f8d, 0x8f8e, 0x8f8f, 0x8f98, 0x8f9a, 0x8ece, 0x620b, 0x6217,
+  0x621b, 0x621f, 0x6222, 0x6221, 0x6225, 0x6224, 0x622c, 0x81e7,
+  0x74ef, 0x74f4, 0x74ff, 0x750f, 0x7511, 0x7513, 0x6534, 0x65ee,
+  0x65ef, 0x65f0, 0x660a, 0x6619, 0x6772, 0x6603, 0x6615, 0x6600,
+  0x7085, 0x66f7, 0x661d, 0x6634, 0x6631, 0x6636, 0x6635, 0x8006,
+  0x665f, 0x6654, 0x6641, 0x664f, 0x6656, 0x6661, 0x6657, 0x6677,
+  0x6684, 0x668c, 0x66a7, 0x669d, 0x66be, 0x66db, 0x66dc, 0x66e6,
+  0x66e9, 0x8d32, 0x8d33, 0x8d36, 0x8d3b, 0x8d3d, 0x8d40, 0x8d45,
+  0x8d46, 0x8d48, 0x8d49, 0x8d47, 0x8d4d, 0x8d55, 0x8d59, 0x89c7,
+  0x89ca, 0x89cb, 0x89cc, 0x89ce, 0x89cf, 0x89d0, 0x89d1, 0x726e,
+  0x729f, 0x725d, 0x7266, 0x726f, 0x727e, 0x727f, 0x7284, 0x728b,
+  0x728d, 0x728f, 0x7292, 0x6308, 0x6332, 0x63b0,
+  /* 0x6b */
+  0x643f, 0x64d8, 0x8004, 0x6bea, 0x6bf3, 0x6bfd, 0x6bf5, 0x6bf9,
+  0x6c05, 0x6c07, 0x6c06, 0x6c0d, 0x6c15, 0x6c18, 0x6c19, 0x6c1a,
+  0x6c21, 0x6c29, 0x6c24, 0x6c2a, 0x6c32, 0x6535, 0x6555, 0x656b,
+  0x724d, 0x7252, 0x7256, 0x7230, 0x8662, 0x5216, 0x809f, 0x809c,
+  0x8093, 0x80bc, 0x670a, 0x80bd, 0x80b1, 0x80ab, 0x80ad, 0x80b4,
+  0x80b7, 0x80e7, 0x80e8, 0x80e9, 0x80ea, 0x80db, 0x80c2, 0x80c4,
+  0x80d9, 0x80cd, 0x80d7, 0x6710, 0x80dd, 0x80eb, 0x80f1, 0x80f4,
+  0x80ed, 0x810d, 0x810e, 0x80f2, 0x80fc, 0x6715, 0x8112, 0x8c5a,
+  0x8136, 0x811e, 0x812c, 0x8118, 0x8132, 0x8148, 0x814c, 0x8153,
+  0x8174, 0x8159, 0x815a, 0x8171, 0x8160, 0x8169, 0x817c, 0x817d,
+  0x816d, 0x8167, 0x584d, 0x5ab5, 0x8188, 0x8182, 0x8191, 0x6ed5,
+  0x81a3, 0x81aa, 0x81cc, 0x6726, 0x81ca, 0x81bb,
+  /* 0x6c */
+  0x81c1, 0x81a6, 0x6b24, 0x6b37, 0x6b39, 0x6b43, 0x6b46, 0x6b59,
+  0x98d1, 0x98d2, 0x98d3, 0x98d5, 0x98d9, 0x98da, 0x6bb3, 0x5f40,
+  0x6bc2, 0x89f3, 0x6590, 0x9f51, 0x6593, 0x65bc, 0x65c6, 0x65c4,
+  0x65c3, 0x65cc, 0x65ce, 0x65d2, 0x65d6, 0x7080, 0x709c, 0x7096,
+  0x709d, 0x70bb, 0x70c0, 0x70b7, 0x70ab, 0x70b1, 0x70e8, 0x70ca,
+  0x7110, 0x7113, 0x7116, 0x712f, 0x7131, 0x7173, 0x715c, 0x7168,
+  0x7145, 0x7172, 0x714a, 0x7178, 0x717a, 0x7198, 0x71b3, 0x71b5,
+  0x71a8, 0x71a0, 0x71e0, 0x71d4, 0x71e7, 0x71f9, 0x721d, 0x7228,
+  0x706c, 0x7118, 0x7166, 0x71b9, 0x623e, 0x623d, 0x6243, 0x6248,
+  0x6249, 0x793b, 0x7940, 0x7946, 0x7949, 0x795b, 0x795c, 0x7953,
+  0x795a, 0x7962, 0x7957, 0x7960, 0x796f, 0x7967, 0x797a, 0x7985,
+  0x798a, 0x799a, 0x79a7, 0x79b3, 0x5fd1, 0x5fd0,
+  /* 0x6d */
+  0x603c, 0x605d, 0x605a, 0x6067, 0x6041, 0x6059, 0x6063, 0x60ab,
+  0x6106, 0x610d, 0x615d, 0x61a9, 0x619d, 0x61cb, 0x61d1, 0x6206,
+  0x8080, 0x807f, 0x6c93, 0x6cf6, 0x6dfc, 0x77f6, 0x77f8, 0x7800,
+  0x7809, 0x7817, 0x7818, 0x7811, 0x65ab, 0x782d, 0x781c, 0x781d,
+  0x7839, 0x783a, 0x783b, 0x781f, 0x783c, 0x7825, 0x782c, 0x7823,
+  0x7829, 0x784e, 0x786d, 0x7856, 0x7857, 0x7826, 0x7850, 0x7847,
+  0x784c, 0x786a, 0x789b, 0x7893, 0x789a, 0x7887, 0x789c, 0x78a1,
+  0x78a3, 0x78b2, 0x78b9, 0x78a5, 0x78d4, 0x78d9, 0x78c9, 0x78ec,
+  0x78f2, 0x7905, 0x78f4, 0x7913, 0x7924, 0x791e, 0x7934, 0x9f9b,
+  0x9ef9, 0x9efb, 0x9efc, 0x76f1, 0x7704, 0x770d, 0x76f9, 0x7707,
+  0x7708, 0x771a, 0x7722, 0x7719, 0x772d, 0x7726, 0x7735, 0x7738,
+  0x7750, 0x7751, 0x7747, 0x7743, 0x775a, 0x7768,
+  /* 0x6e */
+  0x7762, 0x7765, 0x777f, 0x778d, 0x777d, 0x7780, 0x778c, 0x7791,
+  0x779f, 0x77a0, 0x77b0, 0x77b5, 0x77bd, 0x753a, 0x7540, 0x754e,
+  0x754b, 0x7548, 0x755b, 0x7572, 0x7579, 0x7583, 0x7f58, 0x7f61,
+  0x7f5f, 0x8a48, 0x7f68, 0x7f74, 0x7f71, 0x7f79, 0x7f81, 0x7f7e,
+  0x76cd, 0x76e5, 0x8832, 0x9485, 0x9486, 0x9487, 0x948b, 0x948a,
+  0x948c, 0x948d, 0x948f, 0x9490, 0x9494, 0x9497, 0x9495, 0x949a,
+  0x949b, 0x949c, 0x94a3, 0x94a4, 0x94ab, 0x94aa, 0x94ad, 0x94ac,
+  0x94af, 0x94b0, 0x94b2, 0x94b4, 0x94b6, 0x94b7, 0x94b8, 0x94b9,
+  0x94ba, 0x94bc, 0x94bd, 0x94bf, 0x94c4, 0x94c8, 0x94c9, 0x94ca,
+  0x94cb, 0x94cc, 0x94cd, 0x94ce, 0x94d0, 0x94d1, 0x94d2, 0x94d5,
+  0x94d6, 0x94d7, 0x94d9, 0x94d8, 0x94db, 0x94de, 0x94df, 0x94e0,
+  0x94e2, 0x94e4, 0x94e5, 0x94e7, 0x94e8, 0x94ea,
+  /* 0x6f */
+  0x94e9, 0x94eb, 0x94ee, 0x94ef, 0x94f3, 0x94f4, 0x94f5, 0x94f7,
+  0x94f9, 0x94fc, 0x94fd, 0x94ff, 0x9503, 0x9502, 0x9506, 0x9507,
+  0x9509, 0x950a, 0x950d, 0x950e, 0x950f, 0x9512, 0x9513, 0x9514,
+  0x9515, 0x9516, 0x9518, 0x951b, 0x951d, 0x951e, 0x951f, 0x9522,
+  0x952a, 0x952b, 0x9529, 0x952c, 0x9531, 0x9532, 0x9534, 0x9536,
+  0x9537, 0x9538, 0x953c, 0x953e, 0x953f, 0x9542, 0x9535, 0x9544,
+  0x9545, 0x9546, 0x9549, 0x954c, 0x954e, 0x954f, 0x9552, 0x9553,
+  0x9554, 0x9556, 0x9557, 0x9558, 0x9559, 0x955b, 0x955e, 0x955f,
+  0x955d, 0x9561, 0x9562, 0x9564, 0x9565, 0x9566, 0x9567, 0x9568,
+  0x9569, 0x956a, 0x956b, 0x956c, 0x956f, 0x9571, 0x9572, 0x9573,
+  0x953a, 0x77e7, 0x77ec, 0x96c9, 0x79d5, 0x79ed, 0x79e3, 0x79eb,
+  0x7a06, 0x5d47, 0x7a03, 0x7a02, 0x7a1e, 0x7a14,
+  /* 0x70 */
+  0x7a39, 0x7a37, 0x7a51, 0x9ecf, 0x99a5, 0x7a70, 0x7688, 0x768e,
+  0x7693, 0x7699, 0x76a4, 0x74de, 0x74e0, 0x752c, 0x9e20, 0x9e22,
+  0x9e28, 0x9e29, 0x9e2a, 0x9e2b, 0x9e2c, 0x9e32, 0x9e31, 0x9e36,
+  0x9e38, 0x9e37, 0x9e39, 0x9e3a, 0x9e3e, 0x9e41, 0x9e42, 0x9e44,
+  0x9e46, 0x9e47, 0x9e48, 0x9e49, 0x9e4b, 0x9e4c, 0x9e4e, 0x9e51,
+  0x9e55, 0x9e57, 0x9e5a, 0x9e5b, 0x9e5c, 0x9e5e, 0x9e63, 0x9e66,
+  0x9e67, 0x9e68, 0x9e69, 0x9e6a, 0x9e6b, 0x9e6c, 0x9e71, 0x9e6d,
+  0x9e73, 0x7592, 0x7594, 0x7596, 0x75a0, 0x759d, 0x75ac, 0x75a3,
+  0x75b3, 0x75b4, 0x75b8, 0x75c4, 0x75b1, 0x75b0, 0x75c3, 0x75c2,
+  0x75d6, 0x75cd, 0x75e3, 0x75e8, 0x75e6, 0x75e4, 0x75eb, 0x75e7,
+  0x7603, 0x75f1, 0x75fc, 0x75ff, 0x7610, 0x7600, 0x7605, 0x760c,
+  0x7617, 0x760a, 0x7625, 0x7618, 0x7615, 0x7619,
+  /* 0x71 */
+  0x761b, 0x763c, 0x7622, 0x7620, 0x7640, 0x762d, 0x7630, 0x763f,
+  0x7635, 0x7643, 0x763e, 0x7633, 0x764d, 0x765e, 0x7654, 0x765c,
+  0x7656, 0x766b, 0x766f, 0x7fca, 0x7ae6, 0x7a78, 0x7a79, 0x7a80,
+  0x7a86, 0x7a88, 0x7a95, 0x7aa6, 0x7aa0, 0x7aac, 0x7aa8, 0x7aad,
+  0x7ab3, 0x8864, 0x8869, 0x8872, 0x887d, 0x887f, 0x8882, 0x88a2,
+  0x88c6, 0x88b7, 0x88bc, 0x88c9, 0x88e2, 0x88ce, 0x88e3, 0x88e5,
+  0x88f1, 0x891a, 0x88fc, 0x88e8, 0x88fe, 0x88f0, 0x8921, 0x8919,
+  0x8913, 0x891b, 0x890a, 0x8934, 0x892b, 0x8936, 0x8941, 0x8966,
+  0x897b, 0x758b, 0x80e5, 0x76b2, 0x76b4, 0x77dc, 0x8012, 0x8014,
+  0x8016, 0x801c, 0x8020, 0x8022, 0x8025, 0x8026, 0x8027, 0x8029,
+  0x8028, 0x8031, 0x800b, 0x8035, 0x8043, 0x8046, 0x804d, 0x8052,
+  0x8069, 0x8071, 0x8983, 0x9878, 0x9880, 0x9883,
+  /* 0x72 */
+  0x9889, 0x988c, 0x988d, 0x988f, 0x9894, 0x989a, 0x989b, 0x989e,
+  0x989f, 0x98a1, 0x98a2, 0x98a5, 0x98a6, 0x864d, 0x8654, 0x866c,
+  0x866e, 0x867f, 0x867a, 0x867c, 0x867b, 0x86a8, 0x868d, 0x868b,
+  0x86ac, 0x869d, 0x86a7, 0x86a3, 0x86aa, 0x8693, 0x86a9, 0x86b6,
+  0x86c4, 0x86b5, 0x86ce, 0x86b0, 0x86ba, 0x86b1, 0x86af, 0x86c9,
+  0x86cf, 0x86b4, 0x86e9, 0x86f1, 0x86f2, 0x86ed, 0x86f3, 0x86d0,
+  0x8713, 0x86de, 0x86f4, 0x86df, 0x86d8, 0x86d1, 0x8703, 0x8707,
+  0x86f8, 0x8708, 0x870a, 0x870d, 0x8709, 0x8723, 0x873b, 0x871e,
+  0x8725, 0x872e, 0x871a, 0x873e, 0x8748, 0x8734, 0x8731, 0x8729,
+  0x8737, 0x873f, 0x8782, 0x8722, 0x877d, 0x877e, 0x877b, 0x8760,
+  0x8770, 0x874c, 0x876e, 0x878b, 0x8753, 0x8763, 0x877c, 0x8764,
+  0x8759, 0x8765, 0x8793, 0x87af, 0x87a8, 0x87d2,
+  /* 0x73 */
+  0x87c6, 0x8788, 0x8785, 0x87ad, 0x8797, 0x8783, 0x87ab, 0x87e5,
+  0x87ac, 0x87b5, 0x87b3, 0x87cb, 0x87d3, 0x87bd, 0x87d1, 0x87c0,
+  0x87ca, 0x87db, 0x87ea, 0x87e0, 0x87ee, 0x8816, 0x8813, 0x87fe,
+  0x880a, 0x881b, 0x8821, 0x8839, 0x883c, 0x7f36, 0x7f42, 0x7f44,
+  0x7f45, 0x8210, 0x7afa, 0x7afd, 0x7b08, 0x7b03, 0x7b04, 0x7b15,
+  0x7b0a, 0x7b2b, 0x7b0f, 0x7b47, 0x7b38, 0x7b2a, 0x7b19, 0x7b2e,
+  0x7b31, 0x7b20, 0x7b25, 0x7b24, 0x7b33, 0x7b3e, 0x7b1e, 0x7b58,
+  0x7b5a, 0x7b45, 0x7b75, 0x7b4c, 0x7b5d, 0x7b60, 0x7b6e, 0x7b7b,
+  0x7b62, 0x7b72, 0x7b71, 0x7b90, 0x7ba6, 0x7ba7, 0x7bb8, 0x7bac,
+  0x7b9d, 0x7ba8, 0x7b85, 0x7baa, 0x7b9c, 0x7ba2, 0x7bab, 0x7bb4,
+  0x7bd1, 0x7bc1, 0x7bcc, 0x7bdd, 0x7bda, 0x7be5, 0x7be6, 0x7bea,
+  0x7c0c, 0x7bfe, 0x7bfc, 0x7c0f, 0x7c16, 0x7c0b,
+  /* 0x74 */
+  0x7c1f, 0x7c2a, 0x7c26, 0x7c38, 0x7c41, 0x7c40, 0x81fe, 0x8201,
+  0x8202, 0x8204, 0x81ec, 0x8844, 0x8221, 0x8222, 0x8223, 0x822d,
+  0x822f, 0x8228, 0x822b, 0x8238, 0x823b, 0x8233, 0x8234, 0x823e,
+  0x8244, 0x8249, 0x824b, 0x824f, 0x825a, 0x825f, 0x8268, 0x887e,
+  0x8885, 0x8888, 0x88d8, 0x88df, 0x895e, 0x7f9d, 0x7f9f, 0x7fa7,
+  0x7faf, 0x7fb0, 0x7fb2, 0x7c7c, 0x6549, 0x7c91, 0x7c9d, 0x7c9c,
+  0x7c9e, 0x7ca2, 0x7cb2, 0x7cbc, 0x7cbd, 0x7cc1, 0x7cc7, 0x7ccc,
+  0x7ccd, 0x7cc8, 0x7cc5, 0x7cd7, 0x7ce8, 0x826e, 0x66a8, 0x7fbf,
+  0x7fce, 0x7fd5, 0x7fe5, 0x7fe1, 0x7fe6, 0x7fe9, 0x7fee, 0x7ff3,
+  0x7cf8, 0x7d77, 0x7da6, 0x7dae, 0x7e47, 0x7e9b, 0x9eb8, 0x9eb4,
+  0x8d73, 0x8d84, 0x8d94, 0x8d91, 0x8db1, 0x8d67, 0x8d6d, 0x8c47,
+  0x8c49, 0x914a, 0x9150, 0x914e, 0x914f, 0x9164,
+  /* 0x75 */
+  0x9162, 0x9161, 0x9170, 0x9169, 0x916f, 0x917d, 0x917e, 0x9172,
+  0x9174, 0x9179, 0x918c, 0x9185, 0x9190, 0x918d, 0x9191, 0x91a2,
+  0x91a3, 0x91aa, 0x91ad, 0x91ae, 0x91af, 0x91b5, 0x91b4, 0x91ba,
+  0x8c55, 0x9e7e, 0x8db8, 0x8deb, 0x8e05, 0x8e59, 0x8e69, 0x8db5,
+  0x8dbf, 0x8dbc, 0x8dba, 0x8dc4, 0x8dd6, 0x8dd7, 0x8dda, 0x8dde,
+  0x8dce, 0x8dcf, 0x8ddb, 0x8dc6, 0x8dec, 0x8df7, 0x8df8, 0x8de3,
+  0x8df9, 0x8dfb, 0x8de4, 0x8e09, 0x8dfd, 0x8e14, 0x8e1d, 0x8e1f,
+  0x8e2c, 0x8e2e, 0x8e23, 0x8e2f, 0x8e3a, 0x8e40, 0x8e39, 0x8e35,
+  0x8e3d, 0x8e31, 0x8e49, 0x8e41, 0x8e42, 0x8e51, 0x8e52, 0x8e4a,
+  0x8e70, 0x8e76, 0x8e7c, 0x8e6f, 0x8e74, 0x8e85, 0x8e8f, 0x8e94,
+  0x8e90, 0x8e9c, 0x8e9e, 0x8c78, 0x8c82, 0x8c8a, 0x8c85, 0x8c98,
+  0x8c94, 0x659b, 0x89d6, 0x89de, 0x89da, 0x89dc,
+  /* 0x76 */
+  0x89e5, 0x89eb, 0x89ef, 0x8a3e, 0x8b26, 0x9753, 0x96e9, 0x96f3,
+  0x96ef, 0x9706, 0x9701, 0x9708, 0x970f, 0x970e, 0x972a, 0x972d,
+  0x9730, 0x973e, 0x9f80, 0x9f83, 0x9f85, 0x9f86, 0x9f87, 0x9f88,
+  0x9f89, 0x9f8a, 0x9f8c, 0x9efe, 0x9f0b, 0x9f0d, 0x96b9, 0x96bc,
+  0x96bd, 0x96ce, 0x96d2, 0x77bf, 0x96e0, 0x928e, 0x92ae, 0x92c8,
+  0x933e, 0x936a, 0x93ca, 0x938f, 0x943e, 0x946b, 0x9c7f, 0x9c82,
+  0x9c85, 0x9c86, 0x9c87, 0x9c88, 0x7a23, 0x9c8b, 0x9c8e, 0x9c90,
+  0x9c91, 0x9c92, 0x9c94, 0x9c95, 0x9c9a, 0x9c9b, 0x9c9e, 0x9c9f,
+  0x9ca0, 0x9ca1, 0x9ca2, 0x9ca3, 0x9ca5, 0x9ca6, 0x9ca7, 0x9ca8,
+  0x9ca9, 0x9cab, 0x9cad, 0x9cae, 0x9cb0, 0x9cb1, 0x9cb2, 0x9cb3,
+  0x9cb4, 0x9cb5, 0x9cb6, 0x9cb7, 0x9cba, 0x9cbb, 0x9cbc, 0x9cbd,
+  0x9cc4, 0x9cc5, 0x9cc6, 0x9cc7, 0x9cca, 0x9ccb,
+  /* 0x77 */
+  0x9ccc, 0x9ccd, 0x9cce, 0x9ccf, 0x9cd0, 0x9cd3, 0x9cd4, 0x9cd5,
+  0x9cd7, 0x9cd8, 0x9cd9, 0x9cdc, 0x9cdd, 0x9cdf, 0x9ce2, 0x977c,
+  0x9785, 0x9791, 0x9792, 0x9794, 0x97af, 0x97ab, 0x97a3, 0x97b2,
+  0x97b4, 0x9ab1, 0x9ab0, 0x9ab7, 0x9e58, 0x9ab6, 0x9aba, 0x9abc,
+  0x9ac1, 0x9ac0, 0x9ac5, 0x9ac2, 0x9acb, 0x9acc, 0x9ad1, 0x9b45,
+  0x9b43, 0x9b47, 0x9b49, 0x9b48, 0x9b4d, 0x9b51, 0x98e8, 0x990d,
+  0x992e, 0x9955, 0x9954, 0x9adf, 0x9ae1, 0x9ae6, 0x9aef, 0x9aeb,
+  0x9afb, 0x9aed, 0x9af9, 0x9b08, 0x9b0f, 0x9b13, 0x9b1f, 0x9b23,
+  0x9ebd, 0x9ebe, 0x7e3b, 0x9e82, 0x9e87, 0x9e88, 0x9e8b, 0x9e92,
+  0x93d6, 0x9e9d, 0x9e9f, 0x9edb, 0x9edc, 0x9edd, 0x9ee0, 0x9edf,
+  0x9ee2, 0x9ee9, 0x9ee7, 0x9ee5, 0x9eea, 0x9eef, 0x9f22, 0x9f2c,
+  0x9f2f, 0x9f39, 0x9f37, 0x9f3d, 0x9f3e, 0x9f44,
+};
+
+static int
+gb2312_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c1 = (s[0] & 0x7F);
+  if ((c1 >= 0x21 && c1 <= 0x29) || (c1 >= 0x30 && c1 <= 0x77)) {
+    if (n >= 2) {
+      unsigned char c2 = (s[1] & 0x7F);
+      if (c2 >= 0x21 && c2 < 0x7f) {
+        unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21);
+        unsigned short wc = 0xfffd;
+        if (i < 1410) {
+          if (i < 831)
+            wc = gb2312_2uni_page21[i];
+        } else {
+          if (i < 8178)
+            wc = gb2312_2uni_page30[i-1410];
+        }
+        if (wc != 0xfffd) {
+          *pwc = (ucs4_t) wc;
+          return 2;
+        }
+      }
+      return RET_ILSEQ;
+    }
+    return RET_TOOFEW(0);
+  }
+  return RET_ILSEQ;
+}
+
+static const unsigned short gb2312_2charset[7445] = {
+  0x2168, 0x216c, 0x2127, 0x2163, 0x2140, 0x2141, 0x2824, 0x2822,
+  0x2828, 0x2826, 0x283a, 0x282c, 0x282a, 0x2830, 0x282e, 0x2142,
+  0x2834, 0x2832, 0x2839, 0x2821, 0x2825, 0x2827, 0x2829, 0x282d,
+  0x2831, 0x2823, 0x282b, 0x282f, 0x2833, 0x2835, 0x2836, 0x2837,
+  0x2838, 0x2126, 0x2125, 0x2621, 0x2622, 0x2623, 0x2624, 0x2625,
+  0x2626, 0x2627, 0x2628, 0x2629, 0x262a, 0x262b, 0x262c, 0x262d,
+  0x262e, 0x262f, 0x2630, 0x2631, 0x2632, 0x2633, 0x2634, 0x2635,
+  0x2636, 0x2637, 0x2638, 0x2641, 0x2642, 0x2643, 0x2644, 0x2645,
+  0x2646, 0x2647, 0x2648, 0x2649, 0x264a, 0x264b, 0x264c, 0x264d,
+  0x264e, 0x264f, 0x2650, 0x2651, 0x2652, 0x2653, 0x2654, 0x2655,
+  0x2656, 0x2657, 0x2658, 0x2727, 0x2721, 0x2722, 0x2723, 0x2724,
+  0x2725, 0x2726, 0x2728, 0x2729, 0x272a, 0x272b, 0x272c, 0x272d,
+  0x272e, 0x272f, 0x2730, 0x2731, 0x2732, 0x2733, 0x2734, 0x2735,
+  0x2736, 0x2737, 0x2738, 0x2739, 0x273a, 0x273b, 0x273c, 0x273d,
+  0x273e, 0x273f, 0x2740, 0x2741, 0x2751, 0x2752, 0x2753, 0x2754,
+  0x2755, 0x2756, 0x2758, 0x2759, 0x275a, 0x275b, 0x275c, 0x275d,
+  0x275e, 0x275f, 0x2760, 0x2761, 0x2762, 0x2763, 0x2764, 0x2765,
+  0x2766, 0x2767, 0x2768, 0x2769, 0x276a, 0x276b, 0x276c, 0x276d,
+  0x276e, 0x276f, 0x2770, 0x2771, 0x2757, 0x212a, 0x212c, 0x212e,
+  0x212f, 0x2130, 0x2131, 0x212d, 0x216b, 0x2164, 0x2165, 0x2179,
+  0x2166, 0x216d, 0x2271, 0x2272, 0x2273, 0x2274, 0x2275, 0x2276,
+  0x2277, 0x2278, 0x2279, 0x227a, 0x227b, 0x227c, 0x217b, 0x217c,
+  0x217a, 0x217d, 0x214a, 0x2147, 0x2146, 0x214c, 0x2158, 0x215e,
+  0x214f, 0x214e, 0x2144, 0x2145, 0x2149, 0x2148, 0x2152, 0x2153,
+  0x2160, 0x215f, 0x2143, 0x214b, 0x2157, 0x2156, 0x2155, 0x2159,
+  0x2154, 0x215c, 0x215d, 0x215a, 0x215b, 0x2151, 0x214d, 0x2150,
+  0x2259, 0x225a, 0x225b, 0x225c, 0x225d, 0x225e, 0x225f, 0x2260,
+  0x2261, 0x2262, 0x2245, 0x2246, 0x2247, 0x2248, 0x2249, 0x224a,
+  0x224b, 0x224c, 0x224d, 0x224e, 0x224f, 0x2250, 0x2251, 0x2252,
+  0x2253, 0x2254, 0x2255, 0x2256, 0x2257, 0x2258, 0x2231, 0x2232,
+  0x2233, 0x2234, 0x2235, 0x2236, 0x2237, 0x2238, 0x2239, 0x223a,
+  0x223b, 0x223c, 0x223d, 0x223e, 0x223f, 0x2240, 0x2241, 0x2242,
+  0x2243, 0x2244, 0x2924, 0x2925, 0x2926, 0x2927, 0x2928, 0x2929,
+  0x292a, 0x292b, 0x292c, 0x292d, 0x292e, 0x292f, 0x2930, 0x2931,
+  0x2932, 0x2933, 0x2934, 0x2935, 0x2936, 0x2937, 0x2938, 0x2939,
+  0x293a, 0x293b, 0x293c, 0x293d, 0x293e, 0x293f, 0x2940, 0x2941,
+  0x2942, 0x2943, 0x2944, 0x2945, 0x2946, 0x2947, 0x2948, 0x2949,
+  0x294a, 0x294b, 0x294c, 0x294d, 0x294e, 0x294f, 0x2950, 0x2951,
+  0x2952, 0x2953, 0x2954, 0x2955, 0x2956, 0x2957, 0x2958, 0x2959,
+  0x295a, 0x295b, 0x295c, 0x295d, 0x295e, 0x295f, 0x2960, 0x2961,
+  0x2962, 0x2963, 0x2964, 0x2965, 0x2966, 0x2967, 0x2968, 0x2969,
+  0x296a, 0x296b, 0x296c, 0x296d, 0x296e, 0x296f, 0x2176, 0x2175,
+  0x2178, 0x2177, 0x2174, 0x2173, 0x2170, 0x2172, 0x2171, 0x216f,
+  0x216e, 0x2162, 0x2161, 0x2121, 0x2122, 0x2123, 0x2128, 0x2129,
+  0x2134, 0x2135, 0x2136, 0x2137, 0x2138, 0x2139, 0x213a, 0x213b,
+  0x213e, 0x213f, 0x217e, 0x2132, 0x2133, 0x213c, 0x213d, 0x2421,
+  0x2422, 0x2423, 0x2424, 0x2425, 0x2426, 0x2427, 0x2428, 0x2429,
+  0x242a, 0x242b, 0x242c, 0x242d, 0x242e, 0x242f, 0x2430, 0x2431,
+  0x2432, 0x2433, 0x2434, 0x2435, 0x2436, 0x2437, 0x2438, 0x2439,
+  0x243a, 0x243b, 0x243c, 0x243d, 0x243e, 0x243f, 0x2440, 0x2441,
+  0x2442, 0x2443, 0x2444, 0x2445, 0x2446, 0x2447, 0x2448, 0x2449,
+  0x244a, 0x244b, 0x244c, 0x244d, 0x244e, 0x244f, 0x2450, 0x2451,
+  0x2452, 0x2453, 0x2454, 0x2455, 0x2456, 0x2457, 0x2458, 0x2459,
+  0x245a, 0x245b, 0x245c, 0x245d, 0x245e, 0x245f, 0x2460, 0x2461,
+  0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469,
+  0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x246f, 0x2470, 0x2471,
+  0x2472, 0x2473, 0x2521, 0x2522, 0x2523, 0x2524, 0x2525, 0x2526,
+  0x2527, 0x2528, 0x2529, 0x252a, 0x252b, 0x252c, 0x252d, 0x252e,
+  0x252f, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534, 0x2535, 0x2536,
+  0x2537, 0x2538, 0x2539, 0x253a, 0x253b, 0x253c, 0x253d, 0x253e,
+  0x253f, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546,
+  0x2547, 0x2548, 0x2549, 0x254a, 0x254b, 0x254c, 0x254d, 0x254e,
+  0x254f, 0x2550, 0x2551, 0x2552, 0x2553, 0x2554, 0x2555, 0x2556,
+  0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e,
+  0x255f, 0x2560, 0x2561, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566,
+  0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x256d, 0x256e,
+  0x256f, 0x2570, 0x2571, 0x2572, 0x2573, 0x2574, 0x2575, 0x2576,
+  0x2124, 0x2845, 0x2846, 0x2847, 0x2848, 0x2849, 0x284a, 0x284b,
+  0x284c, 0x284d, 0x284e, 0x284f, 0x2850, 0x2851, 0x2852, 0x2853,
+  0x2854, 0x2855, 0x2856, 0x2857, 0x2858, 0x2859, 0x285a, 0x285b,
+  0x285c, 0x285d, 0x285e, 0x285f, 0x2860, 0x2861, 0x2862, 0x2863,
+  0x2864, 0x2865, 0x2866, 0x2867, 0x2868, 0x2869, 0x2265, 0x2266,
+  0x2267, 0x2268, 0x2269, 0x226a, 0x226b, 0x226c, 0x226d, 0x226e,
+  0x523b, 0x3621, 0x465f, 0x4d72, 0x5549, 0x487d, 0x494f, 0x4f42,
+  0x5822, 0x323b, 0x536b, 0x5824, 0x3373, 0x5728, 0x4752, 0x5827,
+  0x4a40, 0x4770, 0x317b, 0x5235, 0x3454, 0x362b, 0x4b3f, 0x5829,
+  0x362a, 0x413d, 0x514f, 0x4925, 0x582d, 0x3876, 0x513e, 0x635c,
+  0x5650, 0x3761, 0x342e, 0x4159, 0x583c, 0x4d68, 0x3524, 0x4e2a,
+  0x5677, 0x4076, 0x3e59, 0x582f, 0x444b, 0x3e43, 0x5831, 0x4334,
+  0x5265, 0x562e, 0x4e5a, 0x5527, 0x3a75, 0x3726, 0x4056, 0x4639,
+  0x4552, 0x4747, 0x3954, 0x334b, 0x5252, 0x583f, 0x3e45, 0x4672,
+  0x5232, 0x4f30, 0x4f67, 0x4a69, 0x5840, 0x4272, 0x4252, 0x4869,
+  0x472c, 0x414b, 0x5368, 0x5579, 0x4a42, 0x367e, 0x5821, 0x535a,
+  0x3f77, 0x5446, 0x3b25, 0x5841, 0x4e65, 0x3e2e, 0x5828, 0x5147,
+  0x5029, 0x583d, 0x596f, 0x4d76, 0x3f3a, 0x3d3b, 0x3a25, 0x5260,
+  0x327a, 0x3a60, 0x4436, 0x4f6d, 0x3e29, 0x4d24, 0x4141, 0x4757,
+  0x5971, 0x5974, 0x484b, 0x5869, 0x525a, 0x4a32, 0x484a, 0x586c,
+  0x586a, 0x5846, 0x3d76, 0x464d, 0x3370, 0x586b, 0x3d71, 0x3d69,
+  0x4854, 0x3453, 0x4258, 0x3256, 0x5750, 0x4a4b, 0x4b7b, 0x554c,
+  0x3836, 0x4f49, 0x595a, 0x5870, 0x472a, 0x586e, 0x347a, 0x416e,
+  0x5254, 0x586d, 0x5247, 0x586f, 0x4347, 0x5176, 0x5659, 0x5872,
+  0x5875, 0x3c7e, 0x3c5b, 0x484e, 0x375d, 0x3742, 0x4673, 0x5878,
+  0x5241, 0x4e69, 0x3c3f, 0x377c, 0x3725, 0x505d, 0x565a, 0x5345,
+  0x3b6f, 0x3b61, 0x5871, 0x4921, 0x4e30, 0x342b, 0x5873, 0x494b,
+  0x5876, 0x4257, 0x5877, 0x4e31, 0x5879, 0x322e, 0x3940, 0x5923,
+  0x3069, 0x4166, 0x496c, 0x4b45, 0x4b46, 0x5924, 0x3568, 0x352b,
+  0x4e3b, 0x354d, 0x5721, 0x5774, 0x5353, 0x4c65, 0x3a4e, 0x5922,
+  0x595c, 0x5360, 0x587d, 0x3770, 0x5777, 0x587e, 0x587a, 0x5921,
+  0x4463, 0x5336, 0x5874, 0x595d, 0x587b, 0x4565, 0x4050, 0x5170,
+  0x305b, 0x3c51, 0x5926, 0x5925, 0x592c, 0x592e, 0x592b, 0x4a39,
+  0x5929, 0x5636, 0x335e, 0x5928, 0x407d, 0x4a4c, 0x592a, 0x5927,
+  0x5930, 0x3631, 0x3929, 0x5240, 0x4f40, 0x4242, 0x3d44, 0x556c,
+  0x3260, 0x4748, 0x3f6b, 0x592d, 0x592f, 0x4e6a, 0x3a6e, 0x4756,
+  0x3163, 0x3459, 0x366d, 0x5934, 0x3f21, 0x595e, 0x474e, 0x407e,
+  0x5938, 0x4b57, 0x377d, 0x5935, 0x5937, 0x3123, 0x5361, 0x5939,
+  0x5045, 0x5936, 0x5931, 0x5932, 0x4129, 0x5933, 0x3c73, 0x505e,
+  0x3829, 0x3e63, 0x593d, 0x593a, 0x3033, 0x5942, 0x5944, 0x3136,
+  0x593f, 0x3539, 0x3e73, 0x4c48, 0x3a72, 0x5250, 0x5943, 0x3d68,
+  0x332b, 0x5945, 0x3e6b, 0x5946, 0x593b, 0x445f, 0x593e, 0x5941,
+  0x5940, 0x552e, 0x5635, 0x4763, 0x5948, 0x3c59, 0x594a, 0x593c,
+  0x594b, 0x462b, 0x5949, 0x5776, 0x4d23, 0x3d21, 0x594c, 0x453c,
+  0x4d35, 0x594d, 0x5947, 0x3325, 0x3f7e, 0x3835, 0x407c, 0x3078,
+  0x3476, 0x594e, 0x594f, 0x3422, 0x5950, 0x345f, 0x3041, 0x5951,
+  0x4935, 0x4f71, 0x5952, 0x4145, 0x5956, 0x492e, 0x5955, 0x5954,
+  0x5957, 0x4b5b, 0x3d29, 0x4627, 0x5953, 0x5958, 0x5959, 0x4865,
+  0x405c, 0x3679, 0x5823, 0x544a, 0x542a, 0x5056, 0x3364, 0x5557,
+  0x4f48, 0x3962, 0x3f4b, 0x4362, 0x3652, 0x4d43, 0x596e, 0x5970,
+  0x3533, 0x3635, 0x3e24, 0x486b, 0x482b, 0x304b, 0x392b, 0x4179,
+  0x5962, 0x403c, 0x3932, 0x3958, 0x504b, 0x3178, 0x4664, 0x3e5f,
+  0x3564, 0x5748, 0x5178, 0x3c66, 0x4a5e, 0x3c3d, 0x5966, 0x5867,
+  0x445a, 0x3854, 0x483d, 0x3261, 0x5459, 0x4330, 0x4361, 0x5a22,
+  0x485f, 0x5034, 0x3e7c, 0x4529, 0x395a, 0x5a23, 0x5429, 0x5a24,
+  0x597b, 0x362c, 0x376b, 0x3179, 0x597c, 0x3365, 0x3e76, 0x3f76,
+  0x5231, 0x4064, 0x3633, 0x597e, 0x597d, 0x3e3b, 0x4660, 0x573c,
+  0x5a21, 0x4139, 0x3572, 0x4168, 0x3c75, 0x3455, 0x415d, 0x447d,
+  0x3c38, 0x3732, 0x376f, 0x596c, 0x463e, 0x3f2d, 0x3b4b, 0x354a,
+  0x5b49, 0x5057, 0x4d39, 0x303c, 0x3376, 0x3b77, 0x5b4a, 0x3a2f,
+  0x5464, 0x3536, 0x3573, 0x5856, 0x4850, 0x3756, 0x4750, 0x5857,
+  0x3f2f, 0x5b3b, 0x5858, 0x504c, 0x3b2e, 0x6b3e, 0x4150, 0x4175,
+  0x5472, 0x3855, 0x3434, 0x3375, 0x493e, 0x4550, 0x4559, 0x407b,
+  0x3170, 0x5859, 0x394e, 0x353d, 0x585a, 0x5646, 0x4b22, 0x482f,
+  0x4932, 0x344c, 0x3f4c, 0x3974, 0x585b, 0x585c, 0x3667, 0x3c41,
+  0x4c6a, 0x4f77, 0x585d, 0x4730, 0x3950, 0x3d23, 0x4c5e, 0x464a,
+  0x5860, 0x585e, 0x585f, 0x307e, 0x3e67, 0x4a23, 0x3c74, 0x3831,
+  0x386e, 0x5862, 0x3d4b, 0x5864, 0x5863, 0x457c, 0x5865, 0x5866,
+  0x4126, 0x4830, 0x306c, 0x3926, 0x3c53, 0x4e71, 0x5b3d, 0x4153,
+  0x362f, 0x567a, 0x452c, 0x3d59, 0x5b3e, 0x5b3f, 0x4078, 0x3e22,
+  0x404d, 0x5b40, 0x4a46, 0x322a, 0x5342, 0x4363, 0x512b, 0x5b42,
+  0x4055, 0x5b43, 0x3f31, 0x443c, 0x475a, 0x5b44, 0x5968, 0x4957,
+  0x3934, 0x4e70, 0x5448, 0x307c, 0x3452, 0x5059, 0x5969, 0x5e4b,
+  0x596b, 0x5830, 0x3b2f, 0x3131, 0x3357, 0x584e, 0x5451, 0x3d33,
+  0x3f6f, 0x4f3b, 0x5850, 0x374b, 0x5851, 0x4625, 0x4778, 0x523d,
+  0x5852, 0x4464, 0x4a2e, 0x4727, 0x5826, 0x497d, 0x4e67, 0x3b5c,
+  0x306b, 0x3b2a, 0x502d, 0x3130, 0x5764, 0x573f, 0x3525, 0x4274,
+  0x444f, 0x3229, 0x3237, 0x3165, 0x5f32, 0x553c, 0x3f28, 0x422c,
+  0x5855, 0x4231, 0x5854, 0x4e54, 0x5a60, 0x4e40, 0x5834, 0x432e,
+  0x5321, 0x4e23, 0x3c34, 0x4834, 0x4251, 0x3e6d, 0x5036, 0x5a61,
+  0x4764, 0x3327, 0x3672, 0x4c7c, 0x407a, 0x4077, 0x5139, 0x5161,
+  0x5847, 0x325e, 0x4065, 0x3a71, 0x5848, 0x542d, 0x4f61, 0x5849,
+  0x584a, 0x4f43, 0x3378, 0x3e47, 0x584b, 0x5b4c, 0x4825, 0x4f58,
+  0x487e, 0x324e, 0x5356, 0x3266, 0x3c30, 0x5351, 0x4b2b, 0x3734,
+  0x3722, 0x4a65, 0x4821, 0x4a5c, 0x3164, 0x5070, 0x4551, 0x5b45,
+  0x357e, 0x3f5a, 0x3945, 0x3e64, 0x416d, 0x5f36, 0x5f35, 0x563b,
+  0x3d50, 0x5559, 0x3048, 0x3623, 0x3f49, 0x4c28, 0x5f33, 0x4a37,
+  0x5352, 0x584f, 0x5236, 0x3a45, 0x4b3e, 0x4c3e, 0x5f37, 0x3570,
+  0x5f34, 0x5375, 0x3354, 0x3877, 0x5f3a, 0x3a4f, 0x3c2a, 0x3575,
+  0x4d2c, 0x437b, 0x3a73, 0x4074, 0x4d42, 0x4f72, 0x5f38, 0x4f45,
+  0x4240, 0x5f39, 0x4270, 0x3e7d, 0x415f, 0x4d4c, 0x5277, 0x374d,
+  0x5f41, 0x5f44, 0x3771, 0x3049, 0x3656, 0x3754, 0x3a2c, 0x4c7d,
+  0x3f54, 0x4b31, 0x4674, 0x5628, 0x5f45, 0x4e62, 0x3333, 0x4e7c,
+  0x3435, 0x4e47, 0x3a70, 0x4e61, 0x513d, 0x5f40, 0x3474, 0x334a,
+  0x3866, 0x5f3b, 0x4445, 0x5f3c, 0x5f3d, 0x5f3e, 0x453b, 0x5f3f,
+  0x5f42, 0x5431, 0x5f43, 0x473a, 0x4e58, 0x4458, 0x5f4a, 0x5f4f,
+  0x565c, 0x5f49, 0x5f5a, 0x4e36, 0x3a47, 0x5f4e, 0x5f48, 0x455e,
+  0x496b, 0x3a74, 0x437c, 0x3e57, 0x5f46, 0x5f4d, 0x4558, 0x5526,
+  0x3a4d, 0x3e4c, 0x533d, 0x3840, 0x5664, 0x5f47, 0x393e, 0x3f27,
+  0x417c, 0x5f4b, 0x5f4c, 0x5f50, 0x5f5b, 0x5f65, 0x5f57, 0x5f56,
+  0x5749, 0x5f63, 0x5f64, 0x656b, 0x5227, 0x5f52, 0x3f29, 0x545b,
+  0x3f48, 0x5f54, 0x4f4c, 0x5f5d, 0x514a, 0x5f5e, 0x3027, 0x4637,
+  0x5f53, 0x3a65, 0x365f, 0x4d5b, 0x397e, 0x5455, 0x5f5f, 0x4f6c,
+  0x3025, 0x5f67, 0x5f51, 0x5146, 0x5f55, 0x5f58, 0x5f59, 0x5f5c,
+  0x3b29, 0x5f60, 0x5f61, 0x5f62, 0x5f66, 0x5f68, 0x5334, 0x3867,
+  0x4536, 0x5f6a, 0x495a, 0x4128, 0x4444, 0x3f5e, 0x4f78, 0x555c,
+  0x5f6e, 0x3238, 0x3a5f, 0x5f6c, 0x5b41, 0x5164, 0x4b74, 0x343d,
+  0x3026, 0x5f71, 0x4c46, 0x5f72, 0x5f6d, 0x5f69, 0x5f6b, 0x5f6f,
+  0x5f70, 0x3b3d, 0x5f73, 0x5f74, 0x3b23, 0x4a5b, 0x4e28, 0x6027,
+  0x332a, 0x6026, 0x6021, 0x5f7e, 0x4d59, 0x5f7c, 0x5f7a, 0x3f50,
+  0x5744, 0x494c, 0x5f78, 0x3021, 0x5f7d, 0x5f7b, 0x6022, 0x6028,
+  0x3748, 0x4621, 0x4936, 0x4032, 0x5f75, 0x453e, 0x5844, 0x5f79,
+  0x4476, 0x6023, 0x6024, 0x6025, 0x5025, 0x6034, 0x4c64, 0x6031,
+  0x3f26, 0x602f, 0x4e39, 0x602b, 0x4946, 0x402e, 0x602e, 0x3a6d,
+  0x3a30, 0x6029, 0x5f76, 0x6033, 0x6038, 0x342d, 0x6039, 0x4f32,
+  0x3a48, 0x6030, 0x507a, 0x602c, 0x547b, 0x5f77, 0x4567, 0x602d,
+  0x5377, 0x6036, 0x6037, 0x6044, 0x5061, 0x603c, 0x6049, 0x604a,
+  0x603e, 0x602a, 0x4924, 0x6041, 0x6032, 0x4a48, 0x6043, 0x6035,
+  0x4e4b, 0x4b43, 0x604d, 0x6046, 0x6042, 0x604b, 0x603a, 0x603f,
+  0x6040, 0x6045, 0x6047, 0x6048, 0x604c, 0x603b, 0x4b54, 0x6055,
+  0x6056, 0x6052, 0x6050, 0x3c4e, 0x6051, 0x3842, 0x5845, 0x506a,
+  0x426f, 0x604f, 0x603d, 0x6054, 0x6053, 0x6057, 0x605c, 0x6058,
+  0x5676, 0x3330, 0x576c, 0x4b3b, 0x605a, 0x4e7b, 0x3a59, 0x6061,
+  0x605d, 0x522d, 0x6062, 0x605b, 0x6059, 0x605f, 0x6060, 0x605e,
+  0x6064, 0x4677, 0x582c, 0x546b, 0x6066, 0x4a49, 0x6065, 0x3841,
+  0x6067, 0x6068, 0x6069, 0x6063, 0x3a3f, 0x4c67, 0x606a, 0x4f79,
+  0x606b, 0x4842, 0x3d40, 0x4452, 0x606c, 0x606d, 0x4774, 0x4b44,
+  0x606e, 0x3b58, 0x5836, 0x5272, 0x606f, 0x4d45, 0x365a, 0x6071,
+  0x5430, 0x4027, 0x3451, 0x4e27, 0x6070, 0x6072, 0x394c, 0x397a,
+  0x4d3c, 0x6073, 0x4654, 0x6074, 0x5432, 0x4826, 0x6076, 0x6075,
+  0x6077, 0x4d41, 0x4a25, 0x545a, 0x5b57, 0x5b59, 0x5b58, 0x3967,
+  0x5b5c, 0x5b5d, 0x3558, 0x5b5a, 0x5b5b, 0x3321, 0x5b5f, 0x3b78,
+  0x5637, 0x5b60, 0x3e79, 0x373b, 0x5b50, 0x4c2e, 0x3f32, 0x3b35,
+  0x5778, 0x3f53, 0x3f69, 0x3c61, 0x4c33, 0x5b5e, 0x3053, 0x4e6b,
+  0x3758, 0x5739, 0x4642, 0x4024, 0x4c39, 0x5b67, 0x5b61, 0x463a,
+  0x5b63, 0x5b68, 0x4577, 0x5b6a, 0x5b69, 0x3f40, 0x5b66, 0x5b65,
+  0x3439, 0x402c, 0x4222, 0x5b62, 0x5b64, 0x504d, 0x5b6d, 0x405d,
+  0x5b72, 0x3662, 0x5b73, 0x5b52, 0x3938, 0x542b, 0x5b6c, 0x3f51,
+  0x5b70, 0x5b51, 0x3566, 0x5b6b, 0x3f65, 0x5b6e, 0x5b71, 0x5b79,
+  0x3921, 0x3023, 0x4271, 0x3347, 0x5b6f, 0x5b78, 0x4652, 0x5b74,
+  0x5b75, 0x5b77, 0x5b76, 0x5b7e, 0x5372, 0x323a, 0x5b7d, 0x5c24,
+  0x5b7b, 0x5b7a, 0x5b7c, 0x4560, 0x3b79, 0x5c23, 0x5c25, 0x4c43,
+  0x3651, 0x5d40, 0x5c21, 0x5c22, 0x4735, 0x3669, 0x5c27, 0x5c26,
+  0x5c29, 0x3124, 0x354c, 0x3f30, 0x515f, 0x3642, 0x5c28, 0x4b7a,
+  0x6b73, 0x4b5c, 0x4b7e, 0x4c41, 0x487b, 0x5c2a, 0x4c6e, 0x5c2b,
+  0x5b53, 0x5c2f, 0x5c2c, 0x3e33, 0x4a7b, 0x5c2d, 0x494a, 0x4439,
+  0x473d, 0x5c2e, 0x5476, 0x5066, 0x442b, 0x3655, 0x5b54, 0x315a,
+  0x5b55, 0x5b56, 0x3a3e, 0x4840, 0x4a3f, 0x4849, 0x5733, 0x4979,
+  0x3f47, 0x3a78, 0x523c, 0x623a, 0x3426, 0x3138, 0x3834, 0x4f44,
+  0x5967, 0x4f26, 0x4d62, 0x596d, 0x3660, 0x5239, 0x393b, 0x6239,
+  0x6237, 0x3473, 0x4c6c, 0x4c2b, 0x3772, 0x5832, 0x516b, 0x3a3b,
+  0x4a27, 0x4d37, 0x5244, 0x3f64, 0x3c50, 0x3661, 0x5e45, 0x5e46,
+  0x5b3c, 0x5159, 0x4666, 0x444e, 0x376e, 0x375c, 0x3f7c, 0x5760,
+  0x4675, 0x313c, 0x5e48, 0x3d31, 0x4c57, 0x5e4a, 0x5e49, 0x356c,
+  0x495d, 0x3042, 0x452e, 0x452b, 0x444c, 0x3c69, 0x4b7d, 0x3a43,
+  0x6579, 0x4867, 0x657a, 0x4d7d, 0x5731, 0x383e, 0x4268, 0x4851,
+  0x657b, 0x364a, 0x3c4b, 0x517d, 0x6621, 0x436e, 0x6624, 0x657e,
+  0x6625, 0x4d57, 0x3741, 0x657c, 0x657d, 0x6623, 0x445d, 0x6628,
+  0x6627, 0x4343, 0x465e, 0x662a, 0x4437, 0x6622, 0x4a3c, 0x3d63,
+  0x3943, 0x6626, 0x5055, 0x4e2f, 0x6629, 0x6630, 0x5226, 0x3d2a,
+  0x662d, 0x662f, 0x4051, 0x524c, 0x3c27, 0x6631, 0x5276, 0x574b,
+  0x4d7e, 0x4d5e, 0x4226, 0x662b, 0x662c, 0x3d3f, 0x662e, 0x6633,
+  0x6632, 0x6636, 0x6638, 0x446f, 0x4448, 0x3e6a, 0x496f, 0x6637,
+  0x3670, 0x4364, 0x5369, 0x6634, 0x6635, 0x4822, 0x663d, 0x6639,
+  0x4645, 0x4d71, 0x663b, 0x663c, 0x3b69, 0x663e, 0x663a, 0x4037,
+  0x5324, 0x663f, 0x4974, 0x6643, 0x6644, 0x5076, 0x433d, 0x4344,
+  0x6642, 0x6641, 0x6647, 0x4f31, 0x6b74, 0x664a, 0x6645, 0x3c5e,
+  0x4929, 0x3c35, 0x4f53, 0x6648, 0x6649, 0x664e, 0x6650, 0x6651,
+  0x664b, 0x3555, 0x664c, 0x664f, 0x445b, 0x6646, 0x664d, 0x6652,
+  0x6654, 0x6653, 0x6655, 0x5978, 0x6656, 0x6657, 0x5753, 0x665d,
+  0x665e, 0x3f57, 0x5450, 0x5756, 0x3466, 0x4b6f, 0x665a, 0x5843,
+  0x574e, 0x5022, 0x434f, 0x665f, 0x3c3e, 0x3942, 0x665b, 0x5127,
+  0x3a22, 0x424f, 0x582b, 0x4a6b, 0x656e, 0x665c, 0x3775, 0x4866,
+  0x4475, 0x6532, 0x447e, 0x4b7c, 0x6533, 0x552c, 0x536e, 0x4a58,
+  0x3032, 0x4b4e, 0x4d6a, 0x3a6a, 0x6535, 0x6534, 0x575a, 0x3959,
+  0x5666, 0x3628, 0x4d70, 0x524b, 0x3126, 0x4a35, 0x3368, 0x4973,
+  0x3f4d, 0x507b, 0x4a52, 0x6536, 0x3b42, 0x4f5c, 0x392c, 0x5457,
+  0x3a26, 0x5167, 0x4f7c, 0x3c52, 0x6537, 0x485d, 0x3f6d, 0x3176,
+  0x4b5e, 0x3c45, 0x3c44, 0x527a, 0x435c, 0x3f5c, 0x383b, 0x4342,
+  0x3a2e, 0x5422, 0x475e, 0x442f, 0x326c, 0x3951, 0x653b, 0x4148,
+  0x552f, 0x653c, 0x653e, 0x3467, 0x3654, 0x4b42, 0x5130, 0x353c,
+  0x4a59, 0x3762, 0x4964, 0x3d2b, 0x4e3e, 0x5770, 0x5021, 0x4959,
+  0x367b, 0x6658, 0x3c62, 0x333e, 0x4950, 0x6659, 0x3322, 0x5e4c,
+  0x5348, 0x5e4d, 0x5222, 0x5e4e, 0x3e4d, 0x5e4f, 0x4a2c, 0x527c,
+  0x335f, 0x656a, 0x4461, 0x3e21, 0x4e32, 0x4472, 0x3e56, 0x4628,
+  0x3263, 0x3e53, 0x477c, 0x4c6b, 0x3d6c, 0x4e5d, 0x4a3a, 0x4641,
+  0x656c, 0x503c, 0x5539, 0x656d, 0x4a74, 0x4d40, 0x4245, 0x656f,
+  0x4244, 0x6570, 0x6578, 0x4d4d, 0x493d, 0x5259, 0x6128, 0x536c,
+  0x4b6a, 0x4671, 0x612c, 0x6127, 0x6129, 0x612a, 0x612f, 0x326d,
+  0x612b, 0x385a, 0x612d, 0x612e, 0x6130, 0x353a, 0x6131, 0x6133,
+  0x6138, 0x5152, 0x6136, 0x6135, 0x416b, 0x6137, 0x5440, 0x6132,
+  0x613a, 0x3036, 0x6134, 0x3f79, 0x6139, 0x613b, 0x613e, 0x613c,
+  0x5645, 0x4f3f, 0x613d, 0x613f, 0x424d, 0x366b, 0x5378, 0x474d,
+  0x3765, 0x3e7e, 0x6140, 0x6141, 0x6147, 0x3367, 0x4669, 0x345e,
+  0x5142, 0x6148, 0x6146, 0x6145, 0x6143, 0x6142, 0x3140, 0x5538,
+  0x6144, 0x614b, 0x614c, 0x614a, 0x6f7a, 0x6153, 0x6152, 0x4736,
+  0x6149, 0x614e, 0x6150, 0x6154, 0x6151, 0x614d, 0x614f, 0x6155,
+  0x6156, 0x6157, 0x6158, 0x615a, 0x615b, 0x4e21, 0x675d, 0x3428,
+  0x565d, 0x5132, 0x3332, 0x3924, 0x5773, 0x4749, 0x3e5e, 0x392e,
+  0x4e57, 0x326e, 0x5b4f, 0x3c3a, 0x5251, 0x4b48, 0x304d, 0x4f6f,
+  0x5963, 0x3d6d, 0x3152, 0x4a50, 0x323c, 0x4b27, 0x372b, 0x4a26,
+  0x4f23, 0x6078, 0x554a, 0x607b, 0x607a, 0x4541, 0x4c7b, 0x4131,
+  0x6079, 0x5663, 0x322f, 0x5644, 0x355b, 0x3478, 0x5621, 0x4f2f,
+  0x306f, 0x607c, 0x6121, 0x3323, 0x607d, 0x607e, 0x4331, 0x435d,
+  0x6122, 0x3779, 0x3b4f, 0x6123, 0x443b, 0x6124, 0x6125, 0x6126,
+  0x3431, 0x3849, 0x463d, 0x446a, 0x3222, 0x5052, 0x675b, 0x3b43,
+  0x5357, 0x5344, 0x3963, 0x624f, 0x572f, 0x476c, 0x3153, 0x3432,
+  0x6251, 0x5072, 0x422e, 0x6250, 0x3f62, 0x5326, 0x3557, 0x6252,
+  0x356a, 0x436d, 0x387d, 0x382e, 0x4553, 0x374f, 0x6254, 0x6253,
+  0x3648, 0x5779, 0x4d25, 0x6258, 0x6256, 0x4a7c, 0x3f35, 0x5339,
+  0x6255, 0x6257, 0x412e, 0x4048, 0x625b, 0x625a, 0x402a, 0x414e,
+  0x625c, 0x625d, 0x625e, 0x5b48, 0x5153, 0x4d22, 0x3d28, 0x5e43,
+  0x5825, 0x3f2a, 0x5b4d, 0x526c, 0x467a, 0x452a, 0x5e44, 0x3157,
+  0x5f2e, 0x4a3d, 0x5f31, 0x392d, 0x527d, 0x3825, 0x3a6b, 0x335a,
+  0x355c, 0x5545, 0x4356, 0x4f52, 0x3b21, 0x6573, 0x6572, 0x6574,
+  0x4d64, 0x4875, 0x352f, 0x473f, 0x6576, 0x6c30, 0x6566, 0x3969,
+  0x3531, 0x423c, 0x6568, 0x6567, 0x6569, 0x524d, 0x616a, 0x504e,
+  0x4d2e, 0x5165, 0x324a, 0x316b, 0x3172, 0x456d, 0x5543, 0x5330,
+  0x615c, 0x615d, 0x525b, 0x3339, 0x314b, 0x4d79, 0x5577, 0x615e,
+  0x3e36, 0x347d, 0x615f, 0x3a5c, 0x6160, 0x3b32, 0x4249, 0x6161,
+  0x506c, 0x4d3d, 0x6162, 0x3543, 0x4547, 0x6163, 0x6164, 0x5379,
+  0x6165, 0x512d, 0x6166, 0x4e22, 0x6167, 0x3542, 0x6168, 0x3b55,
+  0x5044, 0x6260, 0x3158, 0x5264, 0x6261, 0x3c49, 0x484c, 0x6263,
+  0x6c7e, 0x6c7d, 0x5f2f, 0x6262, 0x563e, 0x4d7c, 0x4326, 0x6343,
+  0x5652, 0x6267, 0x6268, 0x5347, 0x626c, 0x3f6c, 0x626d, 0x6265,
+  0x3340, 0x446e, 0x626e, 0x5043, 0x3a76, 0x6269, 0x375e, 0x3b33,
+  0x4c2c, 0x4b4b, 0x6264, 0x6266, 0x626a, 0x626b, 0x6277, 0x6274,
+  0x5475, 0x6273, 0x452d, 0x557a, 0x4542, 0x3240, 0x626f, 0x6272,
+  0x412f, 0x4b3c, 0x3521, 0x6279, 0x3c31, 0x6271, 0x5054, 0x5439,
+  0x6275, 0x3956, 0x6276, 0x4753, 0x6270, 0x575c, 0x6d21, 0x6278,
+  0x6d25, 0x627e, 0x4a51, 0x4135, 0x3b50, 0x3f56, 0x3a63, 0x4b21,
+  0x6d26, 0x6d23, 0x6d22, 0x3b56, 0x6d27, 0x5074, 0x6d24, 0x3a5e,
+  0x3677, 0x6321, 0x3632, 0x4c71, 0x3927, 0x4f22, 0x4721, 0x3f52,
+  0x3671, 0x627a, 0x627b, 0x627d, 0x627c, 0x4455, 0x6322, 0x5341,
+  0x6327, 0x4744, 0x4f24, 0x6329, 0x3a37, 0x6328, 0x3b5a, 0x6323,
+  0x6324, 0x632a, 0x6326, 0x4e72, 0x5346, 0x3b3c, 0x5443, 0x447a,
+  0x6d28, 0x507c, 0x6325, 0x4375, 0x632d, 0x312f, 0x6332, 0x3c42,
+  0x632c, 0x353f, 0x4769, 0x6330, 0x3e2a, 0x4d6f, 0x3b73, 0x4c68,
+  0x632f, 0x6331, 0x4f27, 0x632e, 0x4e29, 0x3b5d, 0x356b, 0x3e65,
+  0x3252, 0x334d, 0x3139, 0x632b, 0x3251, 0x352c, 0x395f, 0x3668,
+  0x4f6b, 0x6337, 0x3b4c, 0x4847, 0x504a, 0x6338, 0x336e, 0x6d29,
+  0x537a, 0x5364, 0x6d2a, 0x6339, 0x5262, 0x6335, 0x535e, 0x3850,
+  0x6333, 0x6336, 0x375f, 0x6334, 0x4022, 0x633a, 0x5438, 0x3448,
+  0x633b, 0x3b45, 0x4977, 0x4965, 0x443d, 0x6d2b, 0x427d, 0x3b5b,
+  0x3f2e, 0x4e3f, 0x633c, 0x3f36, 0x316f, 0x5477, 0x633e, 0x6d2d,
+  0x633f, 0x3a29, 0x6d2c, 0x633d, 0x6340, 0x3a36, 0x362e, 0x5038,
+  0x3043, 0x6d2e, 0x6d2f, 0x4041, 0x6341, 0x4533, 0x6342, 0x5c32,
+  0x6d30, 0x386a, 0x4e6c, 0x6a27, 0x5067, 0x4a79, 0x4856, 0x4f37,
+  0x3349, 0x4e52, 0x3d64, 0x635e, 0x3b72, 0x6a28, 0x553d, 0x465d,
+  0x6a29, 0x6a2a, 0x6a2c, 0x6a2b, 0x6a2e, 0x6a2d, 0x3d58, 0x6a2f,
+  0x423e, 0x3441, 0x3477, 0x3b27, 0x6c66, 0x6c65, 0x373f, 0x4b79,
+  0x3162, 0x6c67, 0x4948, 0x6c68, 0x6c69, 0x4a56, 0x5e50, 0x3245,
+  0x547a, 0x464b, 0x3047, 0x3472, 0x4853, 0x4d50, 0x3f38, 0x3f5b,
+  0x4724, 0x5634, 0x4029, 0x5e51, 0x4928, 0x516f, 0x4524, 0x3067,
+  0x3336, 0x4845, 0x3062, 0x3776, 0x457a, 0x3673, 0x5552, 0x3350,
+  0x3c3c, 0x332d, 0x3e71, 0x3051, 0x5256, 0x4a63, 0x5725, 0x4d36,
+  0x3636, 0x3f39, 0x555b, 0x3827, 0x4557, 0x5e52, 0x3f59, 0x4255,
+  0x4740, 0x3b24, 0x3128, 0x456a, 0x457b, 0x4c27, 0x3127, 0x3556,
+  0x4428, 0x5e53, 0x513a, 0x3369, 0x4372, 0x3777, 0x5674, 0x3523,
+  0x3270, 0x4434, 0x4469, 0x402d, 0x5e54, 0x3068, 0x4544, 0x4160,
+  0x3955, 0x3e5c, 0x4d58, 0x304e, 0x4d4f, 0x5e56, 0x3e50, 0x573e,
+  0x5e55, 0x5550, 0x305d, 0x4462, 0x4223, 0x3c70, 0x5335, 0x4039,
+  0x4521, 0x3226, 0x5471, 0x4028, 0x4a43, 0x5e57, 0x557c, 0x3930,
+  0x482d, 0x4b29, 0x5e59, 0x3f3d, 0x4634, 0x5727, 0x4a30, 0x4443,
+  0x3356, 0x3952, 0x5638, 0x6a7c, 0x3034, 0x3f66, 0x4c74, 0x4d5a,
+  0x563f, 0x424e, 0x4e4e, 0x4c22, 0x502e, 0x4453, 0x3532, 0x5e58,
+  0x5575, 0x3c37, 0x3b53, 0x3024, 0x4532, 0x346c, 0x5571, 0x6a7d,
+  0x5e5a, 0x4d26, 0x4d6c, 0x4e66, 0x5e5c, 0x4d31, 0x4026, 0x573d,
+  0x5e5b, 0x3046, 0x3a34, 0x4953, 0x4473, 0x3e68, 0x3236, 0x404c,
+  0x4b70, 0x3c71, 0x3b3b, 0x3537, 0x4575, 0x5e66, 0x5e63, 0x3e5d,
+  0x5e5f, 0x3437, 0x3d5d, 0x5e60, 0x446d, 0x4f46, 0x3560, 0x365e,
+  0x4a5a, 0x3574, 0x5e65, 0x5546, 0x5e61, 0x4c4d, 0x467e, 0x4545,
+  0x5234, 0x3e72, 0x4253, 0x4c3d, 0x3338, 0x3d53, 0x3f58, 0x4d46,
+  0x515a, 0x346b, 0x5e64, 0x5e5d, 0x5e67, 0x6a7e, 0x4230, 0x5e62,
+  0x5640, 0x3527, 0x3274, 0x5e68, 0x5e72, 0x5e6d, 0x5e71, 0x4860,
+  0x5761, 0x5e6f, 0x4368, 0x4c61, 0x3265, 0x523e, 0x5e6e, 0x5e6b,
+  0x4e55, 0x3427, 0x3f2b, 0x3e3e, 0x3d52, 0x5e69, 0x542e, 0x5e5e,
+  0x5e6a, 0x403f, 0x5e6c, 0x3273, 0x3869, 0x4227, 0x3d41, 0x5e75,
+  0x5e78, 0x322b, 0x3424, 0x346a, 0x4926, 0x5e76, 0x4b51, 0x3863,
+  0x5e77, 0x5e7a, 0x5e79, 0x4c42, 0x3061, 0x346e, 0x653a, 0x502f,
+  0x326b, 0x6b21, 0x5e74, 0x4963, 0x5e73, 0x305a, 0x5221, 0x3177,
+  0x4c2f, 0x5e70, 0x4b24, 0x552a, 0x5e7b, 0x345d, 0x4426, 0x5e7d,
+  0x437e, 0x4421, 0x5f21, 0x414c, 0x5e7c, 0x3e6f, 0x4632, 0x3345,
+  0x4876, 0x4b3a, 0x5e7e, 0x5f24, 0x5732, 0x3337, 0x4143, 0x474b,
+  0x3225, 0x3469, 0x572b, 0x446c, 0x5f22, 0x5f23, 0x5f25, 0x3a33,
+  0x5f26, 0x405e, 0x4943, 0x3259, 0x4766, 0x5f27, 0x475c, 0x5f28,
+  0x6b22, 0x4b53, 0x5f2a, 0x5f29, 0x3241, 0x454a, 0x5f2b, 0x545c,
+  0x4841, 0x5f2c, 0x3e70, 0x5f2d, 0x5627, 0x6a37, 0x6b36, 0x4a55,
+  0x587c, 0x3844, 0x3925, 0x3745, 0x557e, 0x394a, 0x5027, 0x744d,
+  0x3550, 0x4374, 0x3e48, 0x6b37, 0x303d, 0x3d4c, 0x4132, 0x3156,
+  0x3328, 0x3852, 0x4922, 0x3658, 0x6b38, 0x3e34, 0x4a7d, 0x4743,
+  0x557b, 0x3773, 0x4e44, 0x552b, 0x3173, 0x6c33, 0x305f, 0x6c35,
+  0x3637, 0x414f, 0x757a, 0x5031, 0x5565, 0x4e53, 0x3d6f, 0x3362,
+  0x382b, 0x5536, 0x6d3d, 0x364f, 0x4b39, 0x5042, 0x373d, 0x6c36,
+  0x4a29, 0x4554, 0x6c39, 0x6c38, 0x4243, 0x6c37, 0x507d, 0x6c3a,
+  0x6c3b, 0x5765, 0x6c3c, 0x6c3d, 0x466c, 0x4e5e, 0x3c48, 0x4855,
+  0x3529, 0x3e49, 0x563c, 0x5467, 0x512e, 0x5071, 0x6a38, 0x6a39,
+  0x6a3a, 0x3a35, 0x4a31, 0x3f75, 0x4d7a, 0x6a40, 0x303a, 0x6a3e,
+  0x4025, 0x6a3b, 0x327d, 0x4377, 0x3b68, 0x5257, 0x4e74, 0x6a3f,
+  0x6a3c, 0x6a43, 0x5047, 0x5333, 0x343a, 0x4341, 0x5772, 0x5551,
+  0x4a47, 0x6a45, 0x6a44, 0x6a47, 0x6a46, 0x5667, 0x4f54, 0x6a4b,
+  0x3b4e, 0x3d7a, 0x494e, 0x6a4c, 0x4939, 0x4f7e, 0x6a4a, 0x544e,
+  0x6a4d, 0x6a4f, 0x4d6d, 0x6a49, 0x6a4e, 0x4e6e, 0x3b5e, 0x333f,
+  0x4655, 0x3e30, 0x4e7a, 0x4767, 0x3e27, 0x6a50, 0x5647, 0x4140,
+  0x545d, 0x6a51, 0x4f3e, 0x6a52, 0x4a6e, 0x452f, 0x3035, 0x6a54,
+  0x6a53, 0x745f, 0x443a, 0x3129, 0x655f, 0x6a55, 0x4a6f, 0x6a56,
+  0x6a57, 0x4658, 0x6a58, 0x6a59, 0x543b, 0x477a, 0x5237, 0x387c,
+  0x6a42, 0x325c, 0x427c, 0x5478, 0x4c66, 0x576e, 0x5442, 0x5350,
+  0x6b43, 0x4573, 0x377e, 0x6b54, 0x4b37, 0x6b5e, 0x404a, 0x4d7b,
+  0x332f, 0x465a, 0x6b7c, 0x443e, 0x4e34, 0x4429, 0x313e, 0x547d,
+  0x4a75, 0x566c, 0x4653, 0x3664, 0x3b7a, 0x5060, 0x4931, 0x5453,
+  0x4828, 0x384b, 0x683e, 0x493c, 0x683b, 0x406e, 0x5053, 0x3244,
+  0x3465, 0x683c, 0x5548, 0x3645, 0x683d, 0x4a78, 0x385c, 0x4c75,
+  0x4034, 0x516e, 0x683f, 0x6842, 0x3a3c, 0x312d, 0x3d5c, 0x6a3d,
+  0x6843, 0x6846, 0x684b, 0x684c, 0x4b49, 0x3065, 0x3c2b, 0x3939,
+  0x6841, 0x4d77, 0x684a, 0x4e76, 0x556d, 0x4156, 0x6844, 0x4336,
+  0x397b, 0x5626, 0x6848, 0x4a60, 0x5466, 0x6840, 0x6845, 0x6847,
+  0x4739, 0x3763, 0x6849, 0x3f5d, 0x6852, 0x6857, 0x6855, 0x3c5c,
+  0x3c4f, 0x685b, 0x685e, 0x685a, 0x317a, 0x3058, 0x4433, 0x384c,
+  0x4662, 0x483e, 0x4861, 0x684f, 0x6854, 0x6856, 0x3971, 0x6858,
+  0x5775, 0x447b, 0x685c, 0x3269, 0x6851, 0x3c6d, 0x3f42, 0x684d,
+  0x5679, 0x4178, 0x3271, 0x685f, 0x4a41, 0x6859, 0x5524, 0x316a,
+  0x553b, 0x684e, 0x6850, 0x3630, 0x6853, 0x685d, 0x4038, 0x4a77,
+  0x4b28, 0x465c, 0x4075, 0x6869, 0x5023, 0x6872, 0x566a, 0x6860,
+  0x6861, 0x5179, 0x3a4b, 0x3879, 0x3871, 0x5454, 0x686f, 0x686e,
+  0x686c, 0x3970, 0x4c52, 0x6866, 0x4e26, 0x3f72, 0x3038, 0x6871,
+  0x6870, 0x5740, 0x6864, 0x4d29, 0x4923, 0x3b38, 0x3d5b, 0x686a,
+  0x6862, 0x6863, 0x6865, 0x3535, 0x6867, 0x4745, 0x686b, 0x686d,
+  0x3d30, 0x572e, 0x6878, 0x6875, 0x4d30, 0x6876, 0x413a, 0x6868,
+  0x4337, 0x3070, 0x6874, 0x6877, 0x3923, 0x4952, 0x434e, 0x4e60,
+  0x4066, 0x4b73, 0x4c5d, 0x5035, 0x4a61, 0x6873, 0x3c6c, 0x6879,
+  0x435e, 0x4665, 0x3977, 0x3074, 0x5758, 0x3c2c, 0x456f, 0x4c44,
+  0x6926, 0x492d, 0x6922, 0x4062, 0x3f43, 0x687e, 0x3957, 0x687b,
+  0x6924, 0x524e, 0x6923, 0x5632, 0x5735, 0x6927, 0x3d37, 0x687c,
+  0x687d, 0x6921, 0x4d56, 0x522c, 0x6932, 0x6929, 0x342a, 0x343b,
+  0x692b, 0x5028, 0x6925, 0x337e, 0x692c, 0x4063, 0x692a, 0x6939,
+  0x6938, 0x692e, 0x687a, 0x6928, 0x3f2c, 0x6931, 0x693a, 0x4225,
+  0x692f, 0x3845, 0x692d, 0x535c, 0x6934, 0x6935, 0x6937, 0x6947,
+  0x4046, 0x6945, 0x6930, 0x693b, 0x3071, 0x693c, 0x5525, 0x693e,
+  0x693f, 0x6941, 0x4171, 0x4836, 0x693d, 0x6942, 0x6943, 0x6933,
+  0x6936, 0x3b31, 0x6940, 0x3c77, 0x6944, 0x6946, 0x694a, 0x694e,
+  0x325b, 0x6948, 0x372e, 0x694b, 0x694c, 0x5541, 0x4423, 0x6958,
+  0x3a61, 0x6949, 0x5323, 0x6954, 0x6957, 0x6950, 0x694f, 0x4741,
+  0x6952, 0x6959, 0x3348, 0x6953, 0x4f70, 0x694d, 0x3377, 0x6956,
+  0x695a, 0x4c34, 0x4f2d, 0x6955, 0x695c, 0x695b, 0x695e, 0x6951,
+  0x695d, 0x695f, 0x434a, 0x4737, 0x344e, 0x3b36, 0x5040, 0x6c23,
+  0x4537, 0x537b, 0x6c24, 0x6c25, 0x465b, 0x3f6e, 0x6c26, 0x6c27,
+  0x502a, 0x4738, 0x3868, 0x6c28, 0x5639, 0x557d, 0x344b, 0x323d,
+  0x4e64, 0x4667, 0x4d61, 0x3475, 0x4b40, 0x3c5f, 0x6962, 0x6963,
+  0x516a, 0x6965, 0x3479, 0x6964, 0x5133, 0x4a62, 0x3250, 0x6968,
+  0x6966, 0x6967, 0x5633, 0x6969, 0x696a, 0x696b, 0x696c, 0x6c2f,
+  0x4539, 0x364e, 0x5273, 0x356e, 0x3b59, 0x6c31, 0x5263, 0x4e63,
+  0x4438, 0x433f, 0x363e, 0x5839, 0x3148, 0x314f, 0x3151, 0x457e,
+  0x3150, 0x432b, 0x5531, 0x6b24, 0x3a41, 0x4c3a, 0x6b25, 0x6b27,
+  0x6b28, 0x6b26, 0x6b29, 0x6b2b, 0x6b2a, 0x6b2c, 0x4a4f, 0x5835,
+  0x4371, 0x4325, 0x4678, 0x6b2d, 0x444a, 0x6b2e, 0x6b2f, 0x6b30,
+  0x3755, 0x377a, 0x6b31, 0x4762, 0x6b33, 0x3a24, 0x5175, 0x3031,
+  0x6b32, 0x6b34, 0x352a, 0x4248, 0x4768, 0x6b35, 0x4b2e, 0x635f,
+  0x5340, 0x595b, 0x4d21, 0x562d, 0x4773, 0x5960, 0x3b63, 0x3a3a,
+  0x6362, 0x4f2b, 0x6360, 0x4947, 0x3a39, 0x5134, 0x6361, 0x486a,
+  0x392f, 0x3d2d, 0x3358, 0x4e5b, 0x4c40, 0x6368, 0x6369, 0x4d74,
+  0x4c2d, 0x3c33, 0x636a, 0x636b, 0x505a, 0x467b, 0x375a, 0x475f,
+  0x524a, 0x4e56, 0x6364, 0x636c, 0x4972, 0x3341, 0x6367, 0x4663,
+  0x6365, 0x6d33, 0x6366, 0x4933, 0x4566, 0x3935, 0x433b, 0x6363,
+  0x453d, 0x4124, 0x4259, 0x3257, 0x636d, 0x3b26, 0x442d, 0x6370,
+  0x3e5a, 0x637b, 0x6375, 0x3a53, 0x3750, 0x534d, 0x564e, 0x5553,
+  0x3941, 0x5534, 0x5158, 0x5039, 0x4776, 0x482a, 0x3234, 0x435a,
+  0x636e, 0x637c, 0x636f, 0x3728, 0x6377, 0x6374, 0x373a, 0x4522,
+  0x6376, 0x455d, 0x3228, 0x467c, 0x4460, 0x5722, 0x4061, 0x6379,
+  0x637a, 0x637d, 0x4c29, 0x6373, 0x533e, 0x3143, 0x6d34, 0x6371,
+  0x6372, 0x6378, 0x503a, 0x4643, 0x5473, 0x637e, 0x3d60, 0x6427,
+  0x6426, 0x5173, 0x6423, 0x6429, 0x4877, 0x4f34, 0x6428, 0x642e,
+  0x4265, 0x3634, 0x3d72, 0x6422, 0x3a69, 0x642a, 0x642c, 0x367d,
+  0x565e, 0x6432, 0x642d, 0x6421, 0x3b6e, 0x4d5d, 0x4722, 0x4549,
+  0x4177, 0x6424, 0x4733, 0x3d2c, 0x3d3d, 0x6425, 0x5747, 0x3262,
+  0x642b, 0x3c43, 0x642f, 0x3b6b, 0x6430, 0x4528, 0x6431, 0x5563,
+  0x3f23, 0x643a, 0x6437, 0x643b, 0x643d, 0x4656, 0x3a46, 0x404b,
+  0x3821, 0x6434, 0x5421, 0x3a23, 0x3d7e, 0x643c, 0x4d3f, 0x4479,
+  0x4f7b, 0x4966, 0x533f, 0x4f51, 0x6433, 0x6438, 0x6439, 0x4c69,
+  0x4c4e, 0x4054, 0x6435, 0x4130, 0x6436, 0x4e50, 0x3b41, 0x3553,
+  0x4873, 0x3d27, 0x5547, 0x492c, 0x3822, 0x644a, 0x644c, 0x5144,
+  0x523a, 0x3a2d, 0x3a54, 0x6443, 0x356d, 0x574d, 0x6440, 0x4f7d,
+  0x643f, 0x415c, 0x4c4a, 0x4a67, 0x4457, 0x4c54, 0x6448, 0x6447,
+  0x6441, 0x6444, 0x352d, 0x5359, 0x6446, 0x5279, 0x3463, 0x3b34,
+  0x496e, 0x343e, 0x3b6c, 0x514d, 0x4c6d, 0x6d35, 0x4765, 0x5428,
+  0x644b, 0x5755, 0x6442, 0x3d25, 0x6445, 0x5366, 0x6449, 0x4978,
+  0x643e, 0x5365, 0x477e, 0x3649, 0x547c, 0x3233, 0x6457, 0x4e42,
+  0x644d, 0x4e3c, 0x385b, 0x6456, 0x3f4a, 0x534e, 0x436c, 0x4548,
+  0x6458, 0x4d44, 0x644f, 0x6454, 0x6455, 0x3a7e, 0x4f66, 0x553f,
+  0x6452, 0x6450, 0x644e, 0x4d65, 0x4a2a, 0x4023, 0x3d26, 0x6453,
+  0x3848, 0x6467, 0x5434, 0x645b, 0x416f, 0x6469, 0x5267, 0x645f,
+  0x6460, 0x4f2a, 0x4b5d, 0x645a, 0x6451, 0x6465, 0x485c, 0x6463,
+  0x4467, 0x6462, 0x6461, 0x337c, 0x6468, 0x3561, 0x574c, 0x6466,
+  0x3b2c, 0x5752, 0x4c4f, 0x6b78, 0x6464, 0x3976, 0x564d, 0x6459,
+  0x645c, 0x427a, 0x645e, 0x424b, 0x4044, 0x4250, 0x3175, 0x4c32,
+  0x354e, 0x646f, 0x462f, 0x4661, 0x6475, 0x4229, 0x406c, 0x515d,
+  0x646e, 0x442e, 0x646d, 0x6476, 0x6474, 0x427e, 0x645d, 0x6470,
+  0x4a7e, 0x5544, 0x6471, 0x517a, 0x646b, 0x646c, 0x6472, 0x4e2b,
+  0x454b, 0x4731, 0x423a, 0x646a, 0x414a, 0x4c36, 0x3331, 0x647b,
+  0x6473, 0x647a, 0x647d, 0x647c, 0x334e, 0x333a, 0x6477, 0x6479,
+  0x6478, 0x456c, 0x403d, 0x5468, 0x6522, 0x3044, 0x6524, 0x6523,
+  0x3c24, 0x6525, 0x6521, 0x647e, 0x3174, 0x6528, 0x6529, 0x6526,
+  0x6527, 0x652a, 0x4659, 0x652b, 0x652d, 0x652c, 0x652f, 0x652e,
+  0x3960, 0x6530, 0x6531, 0x3b70, 0x6c61, 0x4370, 0x3546, 0x3b52,
+  0x4169, 0x546e, 0x3e44, 0x5746, 0x5456, 0x3253, 0x6c3e, 0x6a41,
+  0x422f, 0x3436, 0x5157, 0x3334, 0x4832, 0x3f3b, 0x6c40, 0x564b,
+  0x6c3f, 0x6c41, 0x6c45, 0x3e66, 0x4c3f, 0x455a, 0x3e3c, 0x6c46,
+  0x317e, 0x6c44, 0x5528, 0x3563, 0x6c42, 0x4136, 0x3363, 0x6c43,
+  0x4b38, 0x4043, 0x4c7e, 0x4152, 0x6c48, 0x3a66, 0x4053, 0x5672,
+  0x514c, 0x3f3e, 0x3733, 0x4955, 0x6c47, 0x3b62, 0x4c4c, 0x3d7d,
+  0x4848, 0x4f29, 0x4d69, 0x456b, 0x3769, 0x5149, 0x3a38, 0x6c49,
+  0x6c4a, 0x3b40, 0x6c4b, 0x6c62, 0x313a, 0x3759, 0x3d39, 0x6c4c,
+  0x5166, 0x6c4d, 0x483b, 0x6c51, 0x6c53, 0x3b4d, 0x3c65, 0x6c4f,
+  0x4937, 0x433a, 0x6c63, 0x5555, 0x6c50, 0x5673, 0x6c52, 0x6c4e,
+  0x6c54, 0x6c55, 0x493f, 0x4f28, 0x505c, 0x512c, 0x485b, 0x6c56,
+  0x4e75, 0x4a6c, 0x6c5a, 0x6c59, 0x303e, 0x6c57, 0x6c58, 0x6c64,
+  0x483c, 0x4147, 0x6c5c, 0x5160, 0x6c5b, 0x546f, 0x6c5d, 0x5b46,
+  0x6c5e, 0x312c, 0x6c5f, 0x6c60, 0x5726, 0x4540, 0x6b3c, 0x302e,
+  0x3e74, 0x3838, 0x522f, 0x3056, 0x3579, 0x5833, 0x4b2c, 0x635d,
+  0x462c, 0x3066, 0x4546, 0x6b39, 0x6b3a, 0x6b3b, 0x5140, 0x4523,
+  0x6a72, 0x4432, 0x4435, 0x404e, 0x6a73, 0x4441, 0x4e6f, 0x6a70,
+  0x6a74, 0x497c, 0x4723, 0x4c58, 0x4e7e, 0x6a75, 0x6a76, 0x4f2c,
+  0x4067, 0x6a77, 0x363f, 0x6a78, 0x6a79, 0x6a7a, 0x6a7b, 0x6a71,
+  0x482e, 0x616b, 0x3738, 0x616c, 0x616d, 0x5734, 0x616e, 0x616f,
+  0x534c, 0x6171, 0x3f71, 0x6170, 0x3552, 0x3137, 0x6173, 0x6172,
+  0x3a7c, 0x6174, 0x3937, 0x3e51, 0x447c, 0x3a5d, 0x3d46, 0x6175,
+  0x6177, 0x3640, 0x4f41, 0x4a28, 0x6176, 0x5578, 0x537c, 0x6178,
+  0x617c, 0x6179, 0x617a, 0x406a, 0x617e, 0x6221, 0x4047, 0x617b,
+  0x617d, 0x6225, 0x4154, 0x6223, 0x6228, 0x327e, 0x6222, 0x434d,
+  0x3242, 0x6227, 0x6226, 0x6224, 0x6229, 0x622b, 0x5049, 0x566d,
+  0x4328, 0x622c, 0x4f57, 0x622e, 0x3a6f, 0x6960, 0x622d, 0x622a,
+  0x3b2b, 0x5433, 0x6230, 0x622f, 0x6961, 0x6231, 0x6232, 0x6233,
+  0x4c21, 0x6234, 0x6235, 0x507e, 0x424a, 0x5371, 0x4d75, 0x6760,
+  0x6761, 0x3e41, 0x426a, 0x6764, 0x6763, 0x4d66, 0x4335, 0x6762,
+  0x3b37, 0x4f56, 0x4161, 0x6769, 0x6768, 0x6774, 0x3223, 0x676a,
+  0x6766, 0x676c, 0x676b, 0x493a, 0x5564, 0x6765, 0x3729, 0x6767,
+  0x676e, 0x6773, 0x5669, 0x676d, 0x6772, 0x6771, 0x3060, 0x6775,
+  0x4772, 0x4045, 0x406d, 0x4170, 0x6770, 0x6776, 0x4b76, 0x6822,
+  0x6821, 0x5741, 0x677a, 0x6779, 0x677b, 0x6777, 0x677e, 0x677d,
+  0x677c, 0x4155, 0x4759, 0x457d, 0x4543, 0x476d, 0x6823, 0x6826,
+  0x6825, 0x6827, 0x3a77, 0x6778, 0x6824, 0x4870, 0x492a, 0x6829,
+  0x3965, 0x517e, 0x6828, 0x682a, 0x682d, 0x682e, 0x4127, 0x682f,
+  0x6830, 0x682c, 0x6834, 0x682b, 0x6831, 0x6835, 0x6832, 0x6833,
+  0x6837, 0x6836, 0x394f, 0x702c, 0x702d, 0x4630, 0x306a, 0x483f,
+  0x4d5f, 0x4e4d, 0x6a31, 0x6a32, 0x463f, 0x3449, 0x6a33, 0x5567,
+  0x5d79, 0x6a34, 0x6a35, 0x6a36, 0x384a, 0x5f30, 0x4975, 0x4c70,
+  0x497a, 0x497b, 0x5343, 0x4b26, 0x3826, 0x702e, 0x3142, 0x6538,
+  0x4c6f, 0x5349, 0x3c57, 0x496a, 0x3567, 0x4450, 0x3569, 0x6e2e,
+  0x3b2d, 0x675e, 0x6e2f, 0x3329, 0x6e32, 0x6e31, 0x3d67, 0x6e30,
+  0x4e37, 0x454f, 0x4174, 0x5b4e, 0x6e33, 0x5073, 0x4254, 0x4668,
+  0x372c, 0x6e34, 0x336b, 0x3b7b, 0x6e35, 0x675c, 0x6e36, 0x3d2e,
+  0x7162, 0x4a68, 0x5249, 0x705a, 0x705b, 0x705c, 0x4146, 0x386d,
+  0x3e4e, 0x705e, 0x4531, 0x705d, 0x5171, 0x7060, 0x304c, 0x3d6a,
+  0x525f, 0x705f, 0x342f, 0x3768, 0x7066, 0x7065, 0x4623, 0x7061,
+  0x7062, 0x3443, 0x7063, 0x556e, 0x4c5b, 0x3e52, 0x3c32, 0x7068,
+  0x7067, 0x7064, 0x3221, 0x5622, 0x5338, 0x3e37, 0x482c, 0x706a,
+  0x5177, 0x564c, 0x3a5b, 0x7069, 0x363b, 0x4d34, 0x4626, 0x4121,
+  0x706b, 0x706e, 0x706d, 0x7070, 0x706c, 0x3b3e, 0x706f, 0x4c35,
+  0x7072, 0x3355, 0x3154, 0x7073, 0x7074, 0x7076, 0x3461, 0x7071,
+  0x7077, 0x707a, 0x7078, 0x7075, 0x707d, 0x7079, 0x707c, 0x707e,
+  0x7121, 0x4e41, 0x7124, 0x7123, 0x4176, 0x707b, 0x4a5d, 0x3471,
+  0x3171, 0x4c31, 0x7126, 0x7127, 0x712c, 0x554e, 0x7129, 0x4833,
+  0x7122, 0x712b, 0x7128, 0x7125, 0x712a, 0x3029, 0x712d, 0x712f,
+  0x7131, 0x7130, 0x712e, 0x5122, 0x7132, 0x7133, 0x396f, 0x3547,
+  0x3057, 0x3059, 0x546d, 0x3544, 0x3d54, 0x3b4a, 0x7027, 0x385e,
+  0x7028, 0x3028, 0x7029, 0x4d6e, 0x702a, 0x702b, 0x4624, 0x5665,
+  0x7164, 0x7165, 0x4373, 0x535b, 0x5651, 0x4568, 0x532f, 0x5266,
+  0x6e41, 0x303b, 0x5535, 0x514e, 0x3c60, 0x3a50, 0x3f78, 0x3847,
+  0x3541, 0x454c, 0x4a22, 0x434b, 0x6e42, 0x443f, 0x3622, 0x6d6c,
+  0x4324, 0x5631, 0x4f60, 0x6d6f, 0x454e, 0x365c, 0x4a21, 0x6d6d,
+  0x6d70, 0x6d71, 0x433c, 0x3f34, 0x6d6e, 0x6d74, 0x6d72, 0x5566,
+  0x435f, 0x6d73, 0x6d76, 0x5523, 0x5123, 0x6d75, 0x4350, 0x6d77,
+  0x3f74, 0x3e6c, 0x6d78, 0x4c77, 0x515b, 0x5745, 0x5576, 0x6d7c,
+  0x6d7b, 0x6d79, 0x6d7a, 0x6d7d, 0x3e26, 0x4b2f, 0x6e21, 0x363d,
+  0x6e22, 0x4440, 0x6d7e, 0x3d5e, 0x3247, 0x3643, 0x6e25, 0x583a,
+  0x6e23, 0x6e26, 0x4369, 0x3372, 0x6e27, 0x6e24, 0x4f39, 0x6e28,
+  0x4277, 0x6e29, 0x6e2a, 0x5e2b, 0x4633, 0x4746, 0x5675, 0x3549,
+  0x4b32, 0x6e2b, 0x4d2b, 0x6e2c, 0x5530, 0x6e2d, 0x7644, 0x5b47,
+  0x3423, 0x432c, 0x7166, 0x4a38, 0x5253, 0x562a, 0x6f72, 0x3e58,
+  0x3d43, 0x6f73, 0x364c, 0x302b, 0x4a2f, 0x6d36, 0x6d37, 0x4e79,
+  0x372f, 0x3f73, 0x6d38, 0x426b, 0x4930, 0x6d39, 0x4676, 0x3f33,
+  0x6d3c, 0x4578, 0x5150, 0x5729, 0x6d3a, 0x6d3b, 0x5162, 0x6d3f,
+  0x6d40, 0x6d44, 0x6d48, 0x6d46, 0x6d4e, 0x5568, 0x6d49, 0x6d47,
+  0x6d3e, 0x4569, 0x4646, 0x4969, 0x5452, 0x6d41, 0x6d42, 0x6d43,
+  0x6d45, 0x4079, 0x3421, 0x3968, 0x6d50, 0x6d51, 0x6d4a, 0x6d4f,
+  0x4e78, 0x4b36, 0x6d4c, 0x6d4d, 0x4f75, 0x6d52, 0x4172, 0x5332,
+  0x6d4b, 0x4837, 0x3c6f, 0x4570, 0x6d56, 0x356f, 0x4235, 0x302d,
+  0x4b69, 0x312e, 0x6d54, 0x4d6b, 0x3562, 0x6d55, 0x6d53, 0x6d57,
+  0x357a, 0x6d58, 0x6d59, 0x6d5c, 0x314c, 0x4576, 0x3c6e, 0x6d5a,
+  0x4c3c, 0x326a, 0x6d5b, 0x446b, 0x3445, 0x3075, 0x6d5f, 0x405a,
+  0x3468, 0x454d, 0x6d5d, 0x3f44, 0x6d5e, 0x4425, 0x6d60, 0x6d61,
+  0x6d63, 0x4157, 0x3b47, 0x3d38, 0x6d62, 0x6d64, 0x6d66, 0x6d65,
+  0x6d67, 0x4a3e, 0x6c6a, 0x4071, 0x4967, 0x6c6b, 0x466e, 0x6c6c,
+  0x466d, 0x6c6d, 0x6c70, 0x5766, 0x6c73, 0x6c71, 0x6c6e, 0x6c6f,
+  0x5723, 0x4971, 0x4b6e, 0x6c74, 0x6c72, 0x4f69, 0x6c76, 0x4631,
+  0x3c40, 0x6c75, 0x353b, 0x3b76, 0x6c77, 0x5977, 0x3d7b, 0x423b,
+  0x6c78, 0x6c79, 0x3823, 0x6c7a, 0x6c7b, 0x6c7c, 0x536d, 0x582e,
+  0x406b, 0x475d, 0x3a4c, 0x5063, 0x4b3d, 0x4d3a, 0x3851, 0x317c,
+  0x476f, 0x5656, 0x3f46, 0x436b, 0x6f75, 0x4358, 0x5762, 0x6f77,
+  0x3353, 0x4758, 0x516d, 0x5648, 0x6f78, 0x6f76, 0x3b7d, 0x3346,
+  0x3d55, 0x5246, 0x3b60, 0x4f21, 0x6f7c, 0x6f7b, 0x6f79, 0x334c,
+  0x4954, 0x4b30, 0x6f7e, 0x305e, 0x5649, 0x6f7d, 0x336d, 0x7655,
+  0x4e48, 0x7022, 0x7021, 0x353e, 0x3c5a, 0x3b7c, 0x3865, 0x4442,
+  0x7023, 0x4b6b, 0x7026, 0x5128, 0x3e3f, 0x476e, 0x7136, 0x7137,
+  0x3f55, 0x3429, 0x7138, 0x4d3b, 0x4754, 0x552d, 0x7139, 0x713a,
+  0x474f, 0x5224, 0x564f, 0x713b, 0x3d51, 0x3430, 0x3e3d, 0x345c,
+  0x4e51, 0x3f5f, 0x713d, 0x3f7a, 0x713c, 0x713f, 0x713e, 0x7140,
+  0x7141, 0x417e, 0x4122, 0x4a7a, 0x553e, 0x3e3a, 0x3e39, 0x5542,
+  0x3f22, 0x4d2f, 0x7135, 0x3d5f, 0x364b, 0x5671, 0x7343, 0x7344,
+  0x384d, 0x7346, 0x7347, 0x304a, 0x7345, 0x7349, 0x4b71, 0x734b,
+  0x5026, 0x314a, 0x7348, 0x734f, 0x3551, 0x7357, 0x7352, 0x7354,
+  0x7353, 0x377b, 0x313f, 0x734e, 0x734a, 0x355a, 0x7350, 0x7351,
+  0x7355, 0x734d, 0x3c63, 0x417d, 0x7356, 0x735a, 0x734c, 0x3548,
+  0x3d6e, 0x735c, 0x3724, 0x3f70, 0x567e, 0x4d32, 0x3470, 0x325f,
+  0x7358, 0x7359, 0x4938, 0x735d, 0x735e, 0x7361, 0x735f, 0x7363,
+  0x7362, 0x735b, 0x3f6a, 0x336f, 0x7360, 0x4729, 0x3c72, 0x736b,
+  0x393f, 0x7364, 0x322d, 0x3b7e, 0x4b63, 0x736d, 0x7369, 0x395c,
+  0x736e, 0x7365, 0x7366, 0x736a, 0x4261, 0x736c, 0x736f, 0x7368,
+  0x3c7d, 0x4f64, 0x7370, 0x7367, 0x7372, 0x572d, 0x462a, 0x7373,
+  0x7371, 0x4228, 0x385d, 0x7375, 0x7374, 0x345b, 0x7376, 0x7377,
+  0x7378, 0x403a, 0x4069, 0x4571, 0x737b, 0x737a, 0x3458, 0x737e,
+  0x7379, 0x737c, 0x737d, 0x7421, 0x7423, 0x3b49, 0x7422, 0x7424,
+  0x323e, 0x7426, 0x7425, 0x3c2e, 0x4357, 0x5961, 0x4060, 0x744c,
+  0x5751, 0x375b, 0x744e, 0x4123, 0x4649, 0x3456, 0x5533, 0x7450,
+  0x744f, 0x7451, 0x4b5a, 0x7452, 0x5441, 0x5660, 0x3760, 0x4138,
+  0x413b, 0x7453, 0x3e2c, 0x3462, 0x7454, 0x7455, 0x3e2b, 0x7456,
+  0x745b, 0x7457, 0x745a, 0x3a7d, 0x7458, 0x7459, 0x3862, 0x4c47,
+  0x745c, 0x325a, 0x4353, 0x5463, 0x3f37, 0x745d, 0x4534, 0x7469,
+  0x4f35, 0x4e49, 0x4b58, 0x4b77, 0x3d74, 0x574f, 0x405b, 0x5075,
+  0x746a, 0x746b, 0x746c, 0x7763, 0x3731, 0x746d, 0x576b, 0x746e,
+  0x6679, 0x3e40, 0x667a, 0x3a6c, 0x667b, 0x4f4b, 0x667c, 0x543c,
+  0x3c36, 0x667d, 0x667e, 0x3c4d, 0x4852, 0x4e33, 0x6721, 0x343f,
+  0x6722, 0x4934, 0x3859, 0x4449, 0x575d, 0x425a, 0x3757, 0x563d,
+  0x4e46, 0x3744, 0x4526, 0x6723, 0x4f5f, 0x6724, 0x6725, 0x6726,
+  0x4137, 0x5769, 0x4970, 0x4f38, 0x562f, 0x5655, 0x6727, 0x306d,
+  0x6728, 0x6729, 0x495c, 0x526f, 0x3e2d, 0x672a, 0x3073, 0x485e,
+  0x3d61, 0x672b, 0x4846, 0x672c, 0x3b66, 0x3878, 0x5124, 0x672d,
+  0x4267, 0x3e78, 0x3d4a, 0x4d33, 0x672e, 0x672f, 0x3e6e, 0x5065,
+  0x4b67, 0x4c50, 0x3c4c, 0x6730, 0x3c28, 0x5077, 0x6731, 0x5078,
+  0x6732, 0x6733, 0x3442, 0x6734, 0x6735, 0x497e, 0x4e2c, 0x4360,
+  0x6737, 0x3141, 0x3371, 0x6738, 0x6739, 0x575b, 0x5540, 0x673a,
+  0x424c, 0x573a, 0x673b, 0x673c, 0x673d, 0x3c6a, 0x4365, 0x4042,
+  0x673e, 0x673f, 0x3c29, 0x6740, 0x6741, 0x6736, 0x3650, 0x6742,
+  0x6743, 0x6744, 0x3b3a, 0x355e, 0x4246, 0x3160, 0x6745, 0x5435,
+  0x6746, 0x383f, 0x6748, 0x6747, 0x376c, 0x6749, 0x3278, 0x674a,
+  0x674b, 0x674c, 0x674d, 0x674e, 0x674f, 0x6750, 0x5327, 0x4b75,
+  0x6751, 0x6752, 0x6753, 0x6754, 0x4949, 0x6755, 0x6756, 0x6757,
+  0x6758, 0x6759, 0x3d49, 0x675a, 0x733e, 0x3857, 0x4831, 0x733f,
+  0x7340, 0x7341, 0x395e, 0x4d78, 0x5868, 0x3a31, 0x425e, 0x6e37,
+  0x3723, 0x6e39, 0x6e38, 0x3055, 0x6e3b, 0x5556, 0x576f, 0x5643,
+  0x6e3d, 0x4a70, 0x6e3c, 0x6e3e, 0x6e40, 0x6e3f, 0x5172, 0x473c,
+  0x4340, 0x3861, 0x4167, 0x7446, 0x505f, 0x7447, 0x4f5b, 0x483a,
+  0x7448, 0x7449, 0x744a, 0x744b, 0x597a, 0x387e, 0x6571, 0x5370,
+  0x7460, 0x4e4c, 0x3361, 0x7134, 0x526e, 0x7461, 0x4f68, 0x7462,
+  0x474c, 0x3554, 0x3464, 0x7464, 0x7463, 0x7465, 0x7466, 0x7467,
+  0x3a32, 0x303f, 0x7468, 0x372d, 0x526d, 0x522b, 0x404f, 0x3f3c,
+  0x6b23, 0x555f, 0x6a48, 0x7173, 0x3678, 0x4b23, 0x444d, 0x7167,
+  0x7168, 0x387b, 0x7169, 0x3a44, 0x5445, 0x3052, 0x716a, 0x716b,
+  0x716c, 0x716d, 0x716e, 0x716f, 0x7171, 0x7170, 0x4555, 0x7172,
+  0x367a, 0x7174, 0x522e, 0x5e47, 0x4b4a, 0x335c, 0x3522, 0x3922,
+  0x4474, 0x7175, 0x7176, 0x4144, 0x417b, 0x5630, 0x7177, 0x7178,
+  0x412a, 0x4638, 0x3e5b, 0x7179, 0x344f, 0x717a, 0x6d32, 0x6d31,
+  0x4b60, 0x525e, 0x4b41, 0x5558, 0x4862, 0x405f, 0x3c21, 0x6b41,
+  0x5024, 0x5662, 0x3647, 0x3858, 0x6b40, 0x384e, 0x6b3f, 0x3326,
+  0x3949, 0x562b, 0x3774, 0x374a, 0x3c67, 0x373e, 0x6b46, 0x6b47,
+  0x3039, 0x3f4f, 0x6b45, 0x537d, 0x6b48, 0x6b49, 0x374e, 0x6b42,
+  0x6b44, 0x4976, 0x5657, 0x554d, 0x5032, 0x6b4f, 0x4e38, 0x6b50,
+  0x3528, 0x3133, 0x6b52, 0x4c25, 0x4556, 0x6b53, 0x6b51, 0x455f,
+  0x6b4e, 0x4a24, 0x6b55, 0x307b, 0x3a7a, 0x5837, 0x7163, 0x6b4a,
+  0x6b4b, 0x6b4c, 0x6b4d, 0x6b56, 0x6640, 0x6b59, 0x3f68, 0x5248,
+  0x6b57, 0x6b5c, 0x386c, 0x6b58, 0x3d3a, 0x5058, 0x3037, 0x6b5d,
+  0x445c, 0x562c, 0x3460, 0x4276, 0x3c39, 0x6b5a, 0x6b5b, 0x5460,
+  0x466a, 0x4454, 0x6b5f, 0x4527, 0x5975, 0x3231, 0x6b64, 0x3d45,
+  0x6b62, 0x6b63, 0x382c, 0x4d51, 0x6b65, 0x6b61, 0x4133, 0x4622,
+  0x4c73, 0x6b66, 0x4030, 0x5238, 0x6b67, 0x382f, 0x382d, 0x6b68,
+  0x473b, 0x4d73, 0x6b6a, 0x6b6b, 0x6b6d, 0x5048, 0x6b72, 0x6b6e,
+  0x6b71, 0x4879, 0x517c, 0x6b6c, 0x6b69, 0x3839, 0x4f59, 0x4465,
+  0x6b6f, 0x6b70, 0x4c5a, 0x4d48, 0x3072, 0x6b76, 0x6b75, 0x3232,
+  0x3860, 0x6b77, 0x316c, 0x4c45, 0x4424, 0x4f25, 0x6b79, 0x6c22,
+  0x4572, 0x6b7a, 0x4945, 0x625f, 0x6b7e, 0x4d4e, 0x6c21, 0x315b,
+  0x5337, 0x525c, 0x6b7d, 0x6b7b, 0x333c, 0x6a30, 0x5754, 0x742b,
+  0x3374, 0x5641, 0x5642, 0x5569, 0x3e4a, 0x7427, 0x5228, 0x7428,
+  0x7429, 0x742a, 0x3e4b, 0x535f, 0x4960, 0x4961, 0x7342, 0x4a66,
+  0x4c72, 0x6236, 0x4b34, 0x4e68, 0x565b, 0x742d, 0x742e, 0x742f,
+  0x7432, 0x3a3d, 0x7433, 0x3063, 0x7430, 0x7431, 0x3d22, 0x3255,
+  0x7436, 0x7437, 0x3666, 0x3230, 0x4f4f, 0x7434, 0x342c, 0x7435,
+  0x7438, 0x7439, 0x4d27, 0x743a, 0x743b, 0x743c, 0x4b52, 0x743d,
+  0x743e, 0x743f, 0x745e, 0x413c, 0x3c68, 0x492b, 0x515e, 0x6575,
+  0x5c33, 0x5255, 0x5c34, 0x302c, 0x5c35, 0x3d5a, 0x5c39, 0x5842,
+  0x5c37, 0x5373, 0x4956, 0x5c3a, 0x5c36, 0x5c3b, 0x4322, 0x5c3c,
+  0x5c45, 0x5c3d, 0x4e5f, 0x5625, 0x5c4f, 0x5c4d, 0x5c52, 0x3d66,
+  0x422b, 0x5c38, 0x5c4b, 0x5c4e, 0x5c3e, 0x3752, 0x3045, 0x5c47,
+  0x503e, 0x5c41, 0x3b28, 0x373c, 0x5c4c, 0x5c46, 0x5c3f, 0x475b,
+  0x513f, 0x5c40, 0x5c4a, 0x5c50, 0x4e2d, 0x5c42, 0x5c43, 0x5c48,
+  0x5c49, 0x3254, 0x5c51, 0x4b55, 0x5437, 0x5c5b, 0x5c5f, 0x4c26,
+  0x5c66, 0x4367, 0x5c5c, 0x3f41, 0x5c59, 0x307a, 0x3936, 0x5c65,
+  0x5c53, 0x5c44, 0x5c56, 0x4874, 0x3f60, 0x493b, 0x313d, 0x5322,
+  0x5c5a, 0x5c55, 0x463b, 0x5c5e, 0x5742, 0x432f, 0x3736, 0x4751,
+  0x4329, 0x5c62, 0x5c58, 0x5c6b, 0x5c54, 0x5c5d, 0x3e25, 0x5c57,
+  0x5c60, 0x5c63, 0x5c64, 0x5c78, 0x5c61, 0x5d22, 0x5c67, 0x3c6b,
+  0x3444, 0x4323, 0x3267, 0x5c7a, 0x5c72, 0x5c6f, 0x5c7c, 0x5c6e,
+  0x5270, 0x3268, 0x4857, 0x4863, 0x5c7b, 0x5c6d, 0x5c77, 0x5c75,
+  0x3e23, 0x5c74, 0x325d, 0x5c73, 0x3c76, 0x5c68, 0x3b44, 0x4073,
+  0x3c54, 0x5c69, 0x5c6a, 0x5c71, 0x5c76, 0x5c79, 0x3534, 0x4859,
+  0x3b67, 0x5c7e, 0x5c7d, 0x532b, 0x5d21, 0x5d23, 0x5d25, 0x5271,
+  0x5d24, 0x5d26, 0x5d27, 0x5229, 0x3a49, 0x5d29, 0x5d36, 0x5d31,
+  0x5d34, 0x5d30, 0x464e, 0x4072, 0x492f, 0x5c6c, 0x5d2e, 0x5d37,
+  0x5c70, 0x5d2f, 0x5d38, 0x5d2c, 0x5d39, 0x5d33, 0x5d2d, 0x442a,
+  0x5d28, 0x4033, 0x412b, 0x5d2a, 0x5d2b, 0x5d32, 0x3b71, 0x5d35,
+  0x5328, 0x5d3a, 0x5d3b, 0x4327, 0x5d52, 0x5d3c, 0x5d51, 0x393d,
+  0x3e55, 0x3e7a, 0x3a4a, 0x5d4a, 0x5d45, 0x5d3f, 0x324b, 0x5d43,
+  0x5d4b, 0x3224, 0x5d55, 0x5d3e, 0x4650, 0x5d50, 0x5d54, 0x4162,
+  0x3746, 0x5d4e, 0x5d4f, 0x5d44, 0x5d3d, 0x5d4d, 0x4c51, 0x5d49,
+  0x5d42, 0x4348, 0x463c, 0x4e2e, 0x5d4c, 0x5d48, 0x5d41, 0x5d46,
+  0x425c, 0x5329, 0x532a, 0x5d53, 0x4f74, 0x4878, 0x5d66, 0x5d47,
+  0x5d60, 0x4264, 0x5d61, 0x5d57, 0x5678, 0x5d59, 0x5d58, 0x3870,
+  0x5d56, 0x464f, 0x362d, 0x5d62, 0x3a79, 0x5461, 0x5d67, 0x3450,
+  0x5d5a, 0x3f7b, 0x5d63, 0x5d5f, 0x5d5d, 0x3559, 0x5d5b, 0x5d5c,
+  0x5d5e, 0x3d2f, 0x5d64, 0x5d65, 0x5d75, 0x4349, 0x4b62, 0x5d72,
+  0x5861, 0x4651, 0x5d74, 0x5574, 0x5d73, 0x5d70, 0x5d6c, 0x5d6f,
+  0x5d68, 0x506e, 0x4858, 0x5d6e, 0x5d69, 0x5d6a, 0x4b72, 0x5d6d,
+  0x314d, 0x4036, 0x3c3b, 0x5d71, 0x5d77, 0x5d76, 0x5d6b, 0x456e,
+  0x5d7b, 0x5e24, 0x5e23, 0x5d78, 0x436f, 0x427b, 0x5561, 0x4e35,
+  0x5d7d, 0x324c, 0x4468, 0x4a5f, 0x473e, 0x5d7a, 0x5d7c, 0x5d7e,
+  0x5e22, 0x302a, 0x314e, 0x5e2c, 0x5e26, 0x3d36, 0x486f, 0x5e21,
+  0x5e25, 0x5e29, 0x5e28, 0x5e27, 0x5e2d, 0x544c, 0x5e33, 0x5e2a,
+  0x5e2e, 0x4059, 0x3121, 0x5e36, 0x5e31, 0x5e32, 0x5126, 0x5e35,
+  0x5e2f, 0x5e30, 0x503d, 0x5e34, 0x4a6d, 0x5e39, 0x5e38, 0x5e37,
+  0x5e3b, 0x3d65, 0x3258, 0x436a, 0x5e3a, 0x453a, 0x5e3c, 0x4c59,
+  0x372a, 0x5465, 0x5e3d, 0x5e3f, 0x4422, 0x5e41, 0x5e3e, 0x5e40,
+  0x553a, 0x5e42, 0x722e, 0x3b22, 0x4232, 0x4530, 0x4247, 0x722f,
+  0x5069, 0x535d, 0x6b3d, 0x3366, 0x7230, 0x7231, 0x4a2d, 0x3a67,
+  0x7233, 0x7235, 0x7234, 0x4b64, 0x4f3a, 0x7232, 0x4a34, 0x524f,
+  0x426c, 0x4e43, 0x7238, 0x3076, 0x7237, 0x723e, 0x324f, 0x5141,
+  0x723a, 0x723c, 0x5469, 0x723b, 0x7236, 0x723f, 0x723d, 0x7239,
+  0x7247, 0x7244, 0x7246, 0x724a, 0x7242, 0x7240, 0x7245, 0x567b,
+  0x7241, 0x4779, 0x495f, 0x7248, 0x3946, 0x3530, 0x7243, 0x7249,
+  0x7250, 0x7256, 0x3b57, 0x7255, 0x4d5c, 0x566b, 0x7252, 0x7254,
+  0x3872, 0x724b, 0x724e, 0x4279, 0x555d, 0x724c, 0x724d, 0x724f,
+  0x7253, 0x7259, 0x533c, 0x366a, 0x4a71, 0x3764, 0x7257, 0x7258,
+  0x725a, 0x725d, 0x725b, 0x725c, 0x5151, 0x7251, 0x4d49, 0x4e4f,
+  0x5629, 0x7263, 0x435b, 0x7260, 0x402f, 0x726c, 0x725e, 0x7261,
+  0x7268, 0x7262, 0x7267, 0x7266, 0x7269, 0x725f, 0x7264, 0x726a,
+  0x532c, 0x7265, 0x3275, 0x7272, 0x502b, 0x7275, 0x3b48, 0x7279,
+  0x7270, 0x7276, 0x7278, 0x727a, 0x7273, 0x7271, 0x3a7b, 0x357b,
+  0x726f, 0x7277, 0x726d, 0x726e, 0x726b, 0x7326, 0x7323, 0x7322,
+  0x7274, 0x485a, 0x727b, 0x7325, 0x4378, 0x727d, 0x7327, 0x7329,
+  0x7324, 0x727c, 0x732b, 0x732a, 0x425d, 0x732e, 0x7330, 0x7321,
+  0x7331, 0x732c, 0x732f, 0x727e, 0x732d, 0x7332, 0x7334, 0x7328,
+  0x7333, 0x7335, 0x5037, 0x7338, 0x5979, 0x7339, 0x7337, 0x4864,
+  0x7336, 0x733a, 0x733b, 0x3440, 0x6e43, 0x733c, 0x733d, 0x512a,
+  0x742c, 0x5046, 0x5050, 0x515c, 0x4f4e, 0x3d56, 0x5143, 0x3a62,
+  0x6169, 0x5242, 0x7142, 0x3239, 0x316d, 0x7143, 0x4940, 0x3344,
+  0x5972, 0x4b25, 0x7144, 0x5654, 0x7145, 0x7440, 0x7146, 0x542c,
+  0x7147, 0x3040, 0x7441, 0x7442, 0x347c, 0x455b, 0x4c3b, 0x5064,
+  0x4d60, 0x7148, 0x5973, 0x313b, 0x4f2e, 0x3824, 0x714a, 0x714b,
+  0x3243, 0x4151, 0x5730, 0x7149, 0x714c, 0x714e, 0x5976, 0x5261,
+  0x5423, 0x7443, 0x4839, 0x7444, 0x714d, 0x714f, 0x3f63, 0x7150,
+  0x7154, 0x7156, 0x7151, 0x4951, 0x4561, 0x4263, 0x397c, 0x7153,
+  0x7155, 0x3953, 0x715b, 0x3a56, 0x307d, 0x7159, 0x7158, 0x7152,
+  0x715a, 0x7157, 0x486c, 0x4d4a, 0x715d, 0x653d, 0x715c, 0x715e,
+  0x715f, 0x4f65, 0x7445, 0x3d73, 0x7160, 0x7161, 0x4e77, 0x522a,
+  0x717b, 0x3832, 0x3c7b, 0x395b, 0x3966, 0x4359, 0x4a53, 0x6a68,
+  0x4040, 0x3e75, 0x6a69, 0x6a6a, 0x6a6b, 0x6a6c, 0x6a6d, 0x6a6e,
+  0x6a6f, 0x3d47, 0x757b, 0x757d, 0x757e, 0x757c, 0x3d62, 0x7621,
+  0x3425, 0x7622, 0x7623, 0x6c32, 0x5154, 0x596a, 0x7624, 0x6e3a,
+  0x5532, 0x537e, 0x4c5c, 0x4a44, 0x6540, 0x7625, 0x3e2f, 0x4629,
+  0x5a25, 0x3c46, 0x3629, 0x383c, 0x484f, 0x3c25, 0x5a26, 0x5a27,
+  0x4c56, 0x4843, 0x5a28, 0x467d, 0x5135, 0x5269, 0x5136, 0x3c47,
+  0x3d32, 0x3b64, 0x5a29, 0x5a2a, 0x5148, 0x5a2b, 0x506d, 0x366f,
+  0x425b, 0x4b4f, 0x376d, 0x4968, 0x3743, 0x3e77, 0x5624, 0x5a2c,
+  0x5a2d, 0x4640, 0x5767, 0x4a36, 0x5529, 0x4b5f, 0x556f, 0x5a2e,
+  0x565f, 0x344a, 0x5a30, 0x5a2f, 0x526b, 0x5a31, 0x5a32, 0x5a33,
+  0x4a54, 0x5a34, 0x4a2b, 0x5a35, 0x5a36, 0x334f, 0x566f, 0x5a37,
+  0x3b30, 0x352e, 0x5a38, 0x5a39, 0x396e, 0x512f, 0x5268, 0x5a3a,
+  0x3843, 0x4f6a, 0x326f, 0x5a3b, 0x5a3c, 0x3d6b, 0x4e5c, 0x536f,
+  0x5a3d, 0x4e73, 0x5a3e, 0x5355, 0x3b65, 0x5a3f, 0x4b35, 0x4b50,
+  0x5a40, 0x476b, 0x566e, 0x5a41, 0x4535, 0x3641, 0x5a42, 0x374c,
+  0x3f4e, 0x5a43, 0x5a44, 0x4b2d, 0x5a45, 0x3577, 0x5a46, 0x4142,
+  0x573b, 0x5a47, 0x4c38, 0x526a, 0x4431, 0x5a48, 0x357d, 0x3b51,
+  0x5a49, 0x5033, 0x5a4a, 0x5a4b, 0x4e3d, 0x5a4c, 0x5a4d, 0x5a4e,
+  0x3277, 0x5a51, 0x5a4f, 0x5168, 0x5a50, 0x4355, 0x5a52, 0x5a53,
+  0x5a54, 0x5a55, 0x503b, 0x5225, 0x3079, 0x5a56, 0x472b, 0x5a57,
+  0x3d77, 0x4321, 0x5a58, 0x5a59, 0x437d, 0x4c37, 0x5a5a, 0x5a5b,
+  0x403e, 0x4657, 0x5a5c, 0x5a5d, 0x4734, 0x5a5e, 0x5a5f, 0x3948,
+  0x3b6d, 0x3639, 0x7478, 0x7479, 0x4d63, 0x7539, 0x6b60, 0x4f73,
+  0x3b3f, 0x3a40, 0x5425, 0x6159, 0x7574, 0x312a, 0x3272, 0x7575,
+  0x7577, 0x3a51, 0x7576, 0x4332, 0x7579, 0x7578, 0x3134, 0x556a,
+  0x383a, 0x3931, 0x3246, 0x5470, 0x4f4d, 0x305c, 0x554b, 0x3b75,
+  0x564a, 0x3737, 0x4c30, 0x4636, 0x3161, 0x393a, 0x567c, 0x3961,
+  0x3721, 0x3c7a, 0x6a5a, 0x6a5b, 0x4c79, 0x3973, 0x6a5c, 0x347b,
+  0x4333, 0x3751, 0x3a58, 0x6a5d, 0x5474, 0x6a5e, 0x3c56, 0x3b5f,
+  0x6a5f, 0x415e, 0x4238, 0x545f, 0x574a, 0x6a60, 0x6a61, 0x6a64,
+  0x6a62, 0x6a63, 0x495e, 0x3833, 0x3644, 0x6a65, 0x4a6a, 0x494d,
+  0x344d, 0x6259, 0x4562, 0x6a66, 0x4035, 0x5738, 0x6a67, 0x572c,
+  0x487c, 0x5853, 0x584d, 0x545e, 0x5479, 0x4944, 0x532e, 0x3853,
+  0x3360, 0x4962, 0x7476, 0x3a55, 0x7477, 0x575f, 0x7471, 0x3830,
+  0x5554, 0x384f, 0x4670, 0x3343, 0x7472, 0x332c, 0x543d, 0x4777,
+  0x7474, 0x7473, 0x4c4b, 0x4824, 0x7475, 0x5763, 0x453f, 0x7540,
+  0x753b, 0x7543, 0x7542, 0x563a, 0x7541, 0x543e, 0x7544, 0x754c,
+  0x304f, 0x3578, 0x7549, 0x754a, 0x455c, 0x7545, 0x7546, 0x7547,
+  0x754b, 0x3e60, 0x7548, 0x387a, 0x7550, 0x7553, 0x3f67, 0x3972,
+  0x753c, 0x754d, 0x4237, 0x4c78, 0x3c79, 0x754e, 0x754f, 0x7551,
+  0x3665, 0x7552, 0x7555, 0x753d, 0x7554, 0x533b, 0x336c, 0x4c24,
+  0x7556, 0x7557, 0x3e61, 0x7558, 0x4c5f, 0x755b, 0x3248, 0x5759,
+  0x7559, 0x755a, 0x755c, 0x7562, 0x7560, 0x755f, 0x755d, 0x7561,
+  0x755e, 0x7564, 0x7565, 0x4c63, 0x653f, 0x3538, 0x7563, 0x7568,
+  0x4c23, 0x7566, 0x7567, 0x753e, 0x3144, 0x753f, 0x3545, 0x3264,
+  0x756c, 0x7569, 0x3657, 0x756d, 0x756a, 0x756b, 0x345a, 0x546a,
+  0x756e, 0x3379, 0x756f, 0x7571, 0x7570, 0x7572, 0x7573, 0x496d,
+  0x392a, 0x477b, 0x3663, 0x4c49, 0x6a26, 0x3335, 0x547e, 0x396c,
+  0x5079, 0x696d, 0x572a, 0x696e, 0x4256, 0x486d, 0x3a64, 0x696f,
+  0x6970, 0x6971, 0x5661, 0x6972, 0x6973, 0x6975, 0x6974, 0x6976,
+  0x6977, 0x4761, 0x6978, 0x5458, 0x6979, 0x3d4e, 0x697a, 0x697b,
+  0x3d4f, 0x697c, 0x3828, 0x413e, 0x697d, 0x3132, 0x3b54, 0x3975,
+  0x697e, 0x6a21, 0x6a22, 0x6a23, 0x3778, 0x3c2d, 0x4a64, 0x604e,
+  0x542f, 0x4f3d, 0x5537, 0x6a24, 0x555e, 0x6a25, 0x5041, 0x393c,
+  0x3447, 0x3159, 0x4031, 0x3166, 0x3167, 0x3168, 0x333d, 0x4868,
+  0x6541, 0x315f, 0x4149, 0x346f, 0x4728, 0x5358, 0x4679, 0x5138,
+  0x397d, 0x4275, 0x532d, 0x544b, 0x3d7c, 0x6542, 0x3735, 0x6543,
+  0x3b39, 0x5562, 0x3d78, 0x5436, 0x4e25, 0x412c, 0x3359, 0x4c76,
+  0x6546, 0x6544, 0x6548, 0x654a, 0x6547, 0x354f, 0x4648, 0x357c,
+  0x6545, 0x4a76, 0x6549, 0x4354, 0x3145, 0x3c23, 0x5737, 0x4d4b,
+  0x4b4d, 0x4a4a, 0x4c53, 0x654c, 0x654b, 0x4466, 0x5121, 0x5137,
+  0x654d, 0x6550, 0x4d38, 0x5670, 0x654f, 0x355d, 0x4d3e, 0x6551,
+  0x363a, 0x4d28, 0x3964, 0x4a45, 0x3351, 0x4b59, 0x546c, 0x6552,
+  0x376a, 0x654e, 0x6555, 0x347e, 0x6556, 0x6553, 0x6554, 0x525d,
+  0x425f, 0x3146, 0x5362, 0x365d, 0x4b6c, 0x6557, 0x5376, 0x3169,
+  0x3674, 0x655a, 0x6558, 0x6559, 0x3540, 0x5245, 0x655c, 0x655e,
+  0x655d, 0x4732, 0x5223, 0x655b, 0x5462, 0x555a, 0x6560, 0x5771,
+  0x6561, 0x315c, 0x517b, 0x6562, 0x6564, 0x6563, 0x6565, 0x5258,
+  0x354b, 0x675f, 0x5a75, 0x5a78, 0x5a76, 0x5a77, 0x5a7a, 0x504f,
+  0x4447, 0x306e, 0x5030, 0x5a79, 0x534a, 0x3a2a, 0x5b22, 0x4771,
+  0x5a7c, 0x5a7b, 0x495b, 0x5a7d, 0x5b21, 0x575e, 0x5a7e, 0x415a,
+  0x5b25, 0x5374, 0x5b27, 0x5b24, 0x5b28, 0x3d3c, 0x4049, 0x5b23,
+  0x5b26, 0x5623, 0x5b29, 0x5b2d, 0x5b2e, 0x5b2c, 0x3a42, 0x3f24,
+  0x5b2b, 0x5b2a, 0x5447, 0x323f, 0x5b2f, 0x3979, 0x5b30, 0x333b,
+  0x3526, 0x363c, 0x5b31, 0x3675, 0x5b32, 0x3149, 0x5b34, 0x5b33,
+  0x5b35, 0x5b37, 0x5b36, 0x5b38, 0x5b39, 0x5b3a, 0x534f, 0x747a,
+  0x4775, 0x5743, 0x4564, 0x747c, 0x747d, 0x747b, 0x3e46, 0x506f,
+  0x3753, 0x544d, 0x4c2a, 0x7522, 0x7521, 0x3a28, 0x747e, 0x4b56,
+  0x7524, 0x4052, 0x336a, 0x4d2a, 0x7525, 0x7523, 0x3d34, 0x7528,
+  0x7529, 0x3d4d, 0x4338, 0x3f61, 0x4b61, 0x752a, 0x7526, 0x7527,
+  0x4470, 0x752c, 0x343c, 0x576d, 0x3457, 0x752b, 0x752e, 0x752d,
+  0x752f, 0x5051, 0x4351, 0x4829, 0x7530, 0x7531, 0x7532, 0x7533,
+  0x7534, 0x7535, 0x7537, 0x7536, 0x7538, 0x3249, 0x5354, 0x4a4d,
+  0x406f, 0x5658, 0x5230, 0x413f, 0x3d70, 0x382a, 0x3c78, 0x7646,
+  0x7647, 0x7648, 0x7649, 0x764a, 0x764c, 0x764b, 0x7769, 0x764d,
+  0x764e, 0x6e44, 0x6e45, 0x6e46, 0x556b, 0x3624, 0x6e48, 0x6e47,
+  0x6e49, 0x6e4a, 0x4725, 0x6e4b, 0x6e4c, 0x3730, 0x3576, 0x6e4d,
+  0x6e4f, 0x6e4e, 0x3846, 0x6e50, 0x6e51, 0x6e52, 0x365b, 0x332e,
+  0x5653, 0x4446, 0x3135, 0x3856, 0x6e53, 0x6e54, 0x543f, 0x4755,
+  0x3e7b, 0x4e59, 0x3933, 0x6e56, 0x6e55, 0x6e58, 0x6e57, 0x4525,
+  0x6e59, 0x6e5a, 0x472e, 0x6e5b, 0x472f, 0x6e5c, 0x3227, 0x6e5d,
+  0x6e5e, 0x6e5f, 0x6e60, 0x6e61, 0x576a, 0x6e62, 0x6e63, 0x3c58,
+  0x6e64, 0x534b, 0x4c7a, 0x322c, 0x4165, 0x6e65, 0x4726, 0x432d,
+  0x6e66, 0x6e67, 0x6e68, 0x6e69, 0x6e6a, 0x6e6b, 0x6e6c, 0x6e6d,
+  0x6e6e, 0x6e6f, 0x6e70, 0x6e71, 0x6e72, 0x6e74, 0x6e73, 0x6e75,
+  0x4d2d, 0x4241, 0x6e76, 0x6e77, 0x6e78, 0x5521, 0x6e79, 0x4f33,
+  0x6e7a, 0x6e7b, 0x6e7c, 0x6e7d, 0x6f21, 0x6e7e, 0x6f22, 0x3875,
+  0x437a, 0x6f23, 0x6f24, 0x3d42, 0x523f, 0x3279, 0x6f25, 0x6f26,
+  0x6f27, 0x5278, 0x6f28, 0x567d, 0x6f29, 0x464c, 0x6f2a, 0x6f2b,
+  0x4134, 0x6f2c, 0x4f7a, 0x4b78, 0x6f2e, 0x6f2d, 0x337a, 0x3978,
+  0x6f2f, 0x6f30, 0x5062, 0x6f31, 0x6f32, 0x3766, 0x503f, 0x6f33,
+  0x6f34, 0x6f35, 0x4871, 0x4c60, 0x6f36, 0x6f37, 0x6f38, 0x6f39,
+  0x6f3a, 0x5560, 0x6f3b, 0x346d, 0x432a, 0x6f3c, 0x6f3d, 0x6f3e,
+  0x6f3f, 0x4e7d, 0x6f40, 0x4260, 0x3438, 0x5736, 0x3d75, 0x4f47,
+  0x6f43, 0x6f41, 0x6f42, 0x6f44, 0x3627, 0x3c7c, 0x3e62, 0x434c,
+  0x6f45, 0x6f46, 0x6f47, 0x6f4f, 0x6f48, 0x6f49, 0x6f4a, 0x4742,
+  0x6f71, 0x364d, 0x6f4b, 0x6f4c, 0x6f4d, 0x3646, 0x433e, 0x6f4e,
+  0x6f50, 0x6f51, 0x6f52, 0x5572, 0x6f53, 0x4477, 0x6f54, 0x4478,
+  0x6f55, 0x6f56, 0x3864, 0x3077, 0x6f57, 0x6f58, 0x6f59, 0x6f5a,
+  0x6f5b, 0x6f5c, 0x6f5d, 0x6f5e, 0x3e35, 0x6f61, 0x6f5f, 0x6f60,
+  0x6f62, 0x6f63, 0x414d, 0x6f64, 0x6f65, 0x6f66, 0x6f67, 0x6f68,
+  0x6f69, 0x6f6a, 0x6f6b, 0x6f6c, 0x4058, 0x6f6d, 0x412d, 0x6f6e,
+  0x6f6f, 0x6f70, 0x4f62, 0x3324, 0x4345, 0x6345, 0x4941, 0x6346,
+  0x3155, 0x4e4a, 0x3433, 0x4872, 0x6347, 0x4f50, 0x6348, 0x3c64,
+  0x6349, 0x634a, 0x4346, 0x5522, 0x4456, 0x396b, 0x4e45, 0x634b,
+  0x4376, 0x634c, 0x3727, 0x3873, 0x3a52, 0x634d, 0x634e, 0x5444,
+  0x634f, 0x6350, 0x514b, 0x6351, 0x6352, 0x6353, 0x6354, 0x5156,
+  0x6355, 0x327b, 0x403b, 0x6356, 0x402b, 0x6357, 0x6358, 0x6359,
+  0x635a, 0x635b, 0x3837, 0x5a62, 0x3653, 0x5a64, 0x5a63, 0x5a66,
+  0x486e, 0x5a65, 0x3740, 0x5174, 0x5275, 0x5573, 0x3d57, 0x5768,
+  0x5a68, 0x5a67, 0x3022, 0x4d53, 0x5a69, 0x383d, 0x3c4a, 0x423d,
+  0x4224, 0x3342, 0x5a6a, 0x422a, 0x4430, 0x3d35, 0x4f5e, 0x5a6b,
+  0x4942, 0x315d, 0x5a6c, 0x3638, 0x543a, 0x337d, 0x5a6d, 0x5449,
+  0x4f55, 0x4563, 0x5a6e, 0x5a6f, 0x5a70, 0x416a, 0x4c55, 0x4f5d,
+  0x5367, 0x4221, 0x5a71, 0x4b65, 0x5a72, 0x4b66, 0x527e, 0x3874,
+  0x5a73, 0x302f, 0x4f36, 0x554f, 0x4b6d, 0x5a74, 0x6344, 0x4125,
+  0x763f, 0x7640, 0x7641, 0x4451, 0x4838, 0x5163, 0x505b, 0x5145,
+  0x3c2f, 0x394d, 0x6f74, 0x3446, 0x533a, 0x7642, 0x337b, 0x7643,
+  0x3571, 0x7645, 0x536a, 0x7627, 0x5129, 0x7629, 0x7628, 0x4163,
+  0x4057, 0x3122, 0x4e6d, 0x5068, 0x762b, 0x4f76, 0x762a, 0x5570,
+  0x762c, 0x4339, 0x3b74, 0x762e, 0x762d, 0x445e, 0x4158, 0x4b2a,
+  0x4f3c, 0x762f, 0x7630, 0x7631, 0x4236, 0x3054, 0x4579, 0x7632,
+  0x4760, 0x7626, 0x3e38, 0x3e32, 0x3565, 0x3747, 0x3f3f, 0x4352,
+  0x4366, 0x584c, 0x386f, 0x3d79, 0x5125, 0x3050, 0x7730, 0x7731,
+  0x502c, 0x3030, 0x7732, 0x7733, 0x7734, 0x474a, 0x3e4f, 0x7737,
+  0x7736, 0x315e, 0x7735, 0x7738, 0x7739, 0x4e24, 0x484d, 0x3a2b,
+  0x6838, 0x6839, 0x683a, 0x3e42, 0x5274, 0x544f, 0x4958, 0x5233,
+  0x3625, 0x476a, 0x717c, 0x4f6e, 0x4b33, 0x506b, 0x676f, 0x4d67,
+  0x394b, 0x3659, 0x717d, 0x3064, 0x4b4c, 0x717e, 0x5424, 0x422d,
+  0x416c, 0x4644, 0x3e31, 0x7221, 0x3c55, 0x7222, 0x7223, 0x7224,
+  0x5243, 0x4635, 0x4d47, 0x7225, 0x5331, 0x3f45, 0x4c62, 0x7226,
+  0x7227, 0x5155, 0x366e, 0x7228, 0x7229, 0x355f, 0x722a, 0x722b,
+  0x327c, 0x722c, 0x722d, 0x4827, 0x3767, 0x6c29, 0x6c2a, 0x6c2b,
+  0x6c2c, 0x462e, 0x6c2d, 0x6c2e, 0x3749, 0x4a33, 0x6238, 0x774f,
+  0x7750, 0x324d, 0x7751, 0x7753, 0x7752, 0x623b, 0x3c22, 0x623c,
+  0x623d, 0x623e, 0x623f, 0x6240, 0x6241, 0x3739, 0x527b, 0x3d24,
+  0x4a4e, 0x3125, 0x4b47, 0x6242, 0x367c, 0x4844, 0x6243, 0x3d48,
+  0x317d, 0x6244, 0x3676, 0x6245, 0x4459, 0x6246, 0x4f5a, 0x395d,
+  0x6247, 0x4021, 0x6248, 0x3276, 0x6249, 0x4173, 0x624a, 0x624b,
+  0x4278, 0x624c, 0x624d, 0x624e, 0x4a57, 0x5838, 0x5965, 0x4f63,
+  0x7025, 0x5c30, 0x426d, 0x5426, 0x4d54, 0x5131, 0x335b, 0x477d,
+  0x3235, 0x423f, 0x6660, 0x4a3b, 0x6661, 0x6662, 0x3e54, 0x6663,
+  0x5724, 0x4d55, 0x6665, 0x3c5d, 0x6664, 0x6666, 0x6667, 0x426e,
+  0x3d3e, 0x6668, 0x4266, 0x3a27, 0x6669, 0x666a, 0x3352, 0x5169,
+  0x3f25, 0x666b, 0x466f, 0x666c, 0x666d, 0x666e, 0x462d, 0x666f,
+  0x4927, 0x6670, 0x6671, 0x6672, 0x6539, 0x6673, 0x6674, 0x4262,
+  0x6675, 0x6676, 0x5668, 0x6677, 0x6678, 0x3947, 0x773b, 0x773a,
+  0x773e, 0x773c, 0x3a21, 0x773f, 0x7740, 0x7742, 0x7741, 0x7744,
+  0x7743, 0x7745, 0x7746, 0x7747, 0x4b68, 0x385f, 0x7754, 0x7755,
+  0x7756, 0x7758, 0x775a, 0x7757, 0x775b, 0x7759, 0x5757, 0x775c,
+  0x775d, 0x775e, 0x775f, 0x7760, 0x5b4b, 0x582a, 0x6577, 0x396d,
+  0x3f7d, 0x3b6a, 0x7749, 0x4647, 0x7748, 0x774a, 0x774c, 0x774b,
+  0x774d, 0x4e3a, 0x774e, 0x4427, 0x5363, 0x764f, 0x4233, 0x7650,
+  0x7651, 0x7652, 0x7653, 0x7654, 0x7656, 0x312b, 0x7657, 0x7658,
+  0x7659, 0x765a, 0x765b, 0x765c, 0x765d, 0x765e, 0x4f4a, 0x765f,
+  0x7660, 0x7661, 0x7662, 0x7663, 0x7664, 0x4070, 0x7665, 0x7666,
+  0x7667, 0x7668, 0x7669, 0x766a, 0x766b, 0x766c, 0x766d, 0x766e,
+  0x766f, 0x7670, 0x7671, 0x7672, 0x7673, 0x7674, 0x3e28, 0x7675,
+  0x7676, 0x7677, 0x7678, 0x487a, 0x7679, 0x767a, 0x767b, 0x767c,
+  0x767d, 0x767e, 0x7721, 0x7722, 0x7723, 0x7724, 0x7725, 0x7726,
+  0x7727, 0x7728, 0x316e, 0x7729, 0x772a, 0x772b, 0x772c, 0x772d,
+  0x415b, 0x772e, 0x772f, 0x4471, 0x702f, 0x3c26, 0x7030, 0x4379,
+  0x4538, 0x513b, 0x7031, 0x7032, 0x7033, 0x7034, 0x7035, 0x513c,
+  0x516c, 0x7037, 0x7036, 0x5427, 0x4d52, 0x7038, 0x703a, 0x7039,
+  0x703b, 0x703c, 0x386b, 0x703d, 0x3a68, 0x703e, 0x703f, 0x3e69,
+  0x7040, 0x366c, 0x7041, 0x7042, 0x7043, 0x7044, 0x4835, 0x7045,
+  0x7046, 0x7047, 0x4574, 0x7048, 0x7049, 0x704a, 0x773d, 0x704b,
+  0x704c, 0x704d, 0x704e, 0x704f, 0x3a57, 0x7050, 0x7051, 0x7052,
+  0x7053, 0x7054, 0x7055, 0x7056, 0x7058, 0x5325, 0x7057, 0x7059,
+  0x753a, 0x4239, 0x7764, 0x7765, 0x7766, 0x7767, 0x7768, 0x4234,
+  0x776a, 0x776b, 0x4273, 0x7470, 0x746f, 0x4269, 0x7761, 0x7762,
+  0x3b46, 0x5964, 0x4a72, 0x4068, 0x7024, 0x3a5a, 0x472d, 0x442c,
+  0x776c, 0x776d, 0x776e, 0x7770, 0x776f, 0x7771, 0x7774, 0x7773,
+  0x7772, 0x7775, 0x7776, 0x6d69, 0x6d6a, 0x6d6b, 0x763c, 0x763d,
+  0x763e, 0x3626, 0x583e, 0x3944, 0x583b, 0x5c31, 0x4a73, 0x7777,
+  0x7778, 0x7779, 0x777b, 0x777a, 0x3147, 0x777c, 0x777d, 0x777e,
+  0x466b, 0x6c34, 0x335d, 0x7633, 0x7634, 0x4164, 0x7635, 0x7636,
+  0x7637, 0x7638, 0x7639, 0x763a, 0x4823, 0x763b, 0x417a, 0x3928,
+  0x6d68, 0x396a, 0x595f, 0x2321, 0x2322, 0x2323, 0x2167, 0x2325,
+  0x2326, 0x2327, 0x2328, 0x2329, 0x232a, 0x232b, 0x232c, 0x232d,
+  0x232e, 0x232f, 0x2330, 0x2331, 0x2332, 0x2333, 0x2334, 0x2335,
+  0x2336, 0x2337, 0x2338, 0x2339, 0x233a, 0x233b, 0x233c, 0x233d,
+  0x233e, 0x233f, 0x2340, 0x2341, 0x2342, 0x2343, 0x2344, 0x2345,
+  0x2346, 0x2347, 0x2348, 0x2349, 0x234a, 0x234b, 0x234c, 0x234d,
+  0x234e, 0x234f, 0x2350, 0x2351, 0x2352, 0x2353, 0x2354, 0x2355,
+  0x2356, 0x2357, 0x2358, 0x2359, 0x235a, 0x235b, 0x235c, 0x235d,
+  0x235e, 0x235f, 0x2360, 0x2361, 0x2362, 0x2363, 0x2364, 0x2365,
+  0x2366, 0x2367, 0x2368, 0x2369, 0x236a, 0x236b, 0x236c, 0x236d,
+  0x236e, 0x236f, 0x2370, 0x2371, 0x2372, 0x2373, 0x2374, 0x2375,
+  0x2376, 0x2377, 0x2378, 0x2379, 0x237a, 0x237b, 0x237c, 0x237d,
+  0x212b, 0x2169, 0x216a, 0x237e, 0x2324,
+};
+
+static const Summary16 gb2312_uni2indx_page00[70] = {
+  /* 0x0000 */
+  {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 },
+  {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 },
+  {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0190 }, {    3, 0x0003 },
+  {    5, 0x0000 }, {    5, 0x0080 }, {    6, 0x3703 }, {   13, 0x168c },
+  /* 0x0100 */
+  {   19, 0x0002 }, {   20, 0x0808 }, {   22, 0x0800 }, {   23, 0x0000 },
+  {   23, 0x2000 }, {   24, 0x0000 }, {   24, 0x0800 }, {   25, 0x0000 },
+  {   25, 0x0000 }, {   25, 0x0000 }, {   25, 0x0000 }, {   25, 0x0000 },
+  {   25, 0x4000 }, {   26, 0x1555 }, {   33, 0x0000 }, {   33, 0x0000 },
+  /* 0x0200 */
+  {   33, 0x0000 }, {   33, 0x0000 }, {   33, 0x0000 }, {   33, 0x0000 },
+  {   33, 0x0000 }, {   33, 0x0000 }, {   33, 0x0000 }, {   33, 0x0000 },
+  {   33, 0x0000 }, {   33, 0x0000 }, {   33, 0x0000 }, {   33, 0x0000 },
+  {   33, 0x0280 }, {   35, 0x0000 }, {   35, 0x0000 }, {   35, 0x0000 },
+  /* 0x0300 */
+  {   35, 0x0000 }, {   35, 0x0000 }, {   35, 0x0000 }, {   35, 0x0000 },
+  {   35, 0x0000 }, {   35, 0x0000 }, {   35, 0x0000 }, {   35, 0x0000 },
+  {   35, 0x0000 }, {   35, 0xfffe }, {   50, 0x03fb }, {   59, 0xfffe },
+  {   74, 0x03fb }, {   83, 0x0000 }, {   83, 0x0000 }, {   83, 0x0000 },
+  /* 0x0400 */
+  {   83, 0x0002 }, {   84, 0xffff }, {  100, 0xffff }, {  116, 0xffff },
+  {  132, 0xffff }, {  148, 0x0002 },
+};
+static const Summary16 gb2312_uni2indx_page20[101] = {
+  /* 0x2000 */
+  {  149, 0x0000 }, {  149, 0x3360 }, {  155, 0x0040 }, {  156, 0x080d },
+  {  160, 0x0000 }, {  160, 0x0000 }, {  160, 0x0000 }, {  160, 0x0000 },
+  {  160, 0x0000 }, {  160, 0x0000 }, {  160, 0x0000 }, {  160, 0x0000 },
+  {  160, 0x0000 }, {  160, 0x0000 }, {  160, 0x0000 }, {  160, 0x0000 },
+  /* 0x2100 */
+  {  160, 0x0008 }, {  161, 0x0040 }, {  162, 0x0000 }, {  162, 0x0000 },
+  {  162, 0x0000 }, {  162, 0x0000 }, {  162, 0x0fff }, {  174, 0x0000 },
+  {  174, 0x0000 }, {  174, 0x000f }, {  178, 0x0000 }, {  178, 0x0000 },
+  {  178, 0x0000 }, {  178, 0x0000 }, {  178, 0x0000 }, {  178, 0x0000 },
+  /* 0x2200 */
+  {  178, 0x8100 }, {  180, 0x6402 }, {  184, 0x4fa1 }, {  192, 0x20f0 },
+  {  197, 0x1100 }, {  199, 0x0000 }, {  199, 0xc033 }, {  205, 0x0000 },
+  {  205, 0x0000 }, {  205, 0x0200 }, {  206, 0x0020 }, {  207, 0x0000 },
+  {  207, 0x0000 }, {  207, 0x0000 }, {  207, 0x0000 }, {  207, 0x0000 },
+  /* 0x2300 */
+  {  207, 0x0000 }, {  207, 0x0004 }, {  208, 0x0000 }, {  208, 0x0000 },
+  {  208, 0x0000 }, {  208, 0x0000 }, {  208, 0x0000 }, {  208, 0x0000 },
+  {  208, 0x0000 }, {  208, 0x0000 }, {  208, 0x0000 }, {  208, 0x0000 },
+  {  208, 0x0000 }, {  208, 0x0000 }, {  208, 0x0000 }, {  208, 0x0000 },
+  /* 0x2400 */
+  {  208, 0x0000 }, {  208, 0x0000 }, {  208, 0x0000 }, {  208, 0x0000 },
+  {  208, 0x0000 }, {  208, 0x0000 }, {  208, 0x03ff }, {  218, 0xfff0 },
+  {  230, 0xffff }, {  246, 0x0fff }, {  258, 0x0000 }, {  258, 0x0000 },
+  {  258, 0x0000 }, {  258, 0x0000 }, {  258, 0x0000 }, {  258, 0x0000 },
+  /* 0x2500 */
+  {  258, 0xffff }, {  274, 0xffff }, {  290, 0xffff }, {  306, 0xffff },
+  {  322, 0x0fff }, {  334, 0x0000 }, {  334, 0x0000 }, {  334, 0x0000 },
+  {  334, 0x0000 }, {  334, 0x0000 }, {  334, 0x0003 }, {  336, 0x000c },
+  {  338, 0xc8c0 }, {  343, 0x0000 }, {  343, 0x0000 }, {  343, 0x0000 },
+  /* 0x2600 */
+  {  343, 0x0060 }, {  345, 0x0000 }, {  345, 0x0000 }, {  345, 0x0000 },
+  {  345, 0x0005 },
+};
+static const Summary16 gb2312_uni2indx_page30[35] = {
+  /* 0x3000 */
+  {  347, 0xff2f }, {  360, 0x00fb }, {  367, 0x0000 }, {  367, 0x0000 },
+  {  367, 0xfffe }, {  382, 0xffff }, {  398, 0xffff }, {  414, 0xffff },
+  {  430, 0xffff }, {  446, 0x000f }, {  450, 0xfffe }, {  465, 0xffff },
+  {  481, 0xffff }, {  497, 0xffff }, {  513, 0xffff }, {  529, 0x087f },
+  /* 0x3100 */
+  {  537, 0xffe0 }, {  548, 0xffff }, {  564, 0x03ff }, {  574, 0x0000 },
+  {  574, 0x0000 }, {  574, 0x0000 }, {  574, 0x0000 }, {  574, 0x0000 },
+  {  574, 0x0000 }, {  574, 0x0000 }, {  574, 0x0000 }, {  574, 0x0000 },
+  {  574, 0x0000 }, {  574, 0x0000 }, {  574, 0x0000 }, {  574, 0x0000 },
+  /* 0x3200 */
+  {  574, 0x0000 }, {  574, 0x0000 }, {  574, 0x03ff },
+};
+static const Summary16 gb2312_uni2indx_page4e[1263] = {
+  /* 0x4e00 */
+  {  584, 0x7f8b }, {  595, 0x7f7b }, {  608, 0x3db4 }, {  617, 0xef55 },
+  {  628, 0xfba8 }, {  638, 0xf35d }, {  649, 0x0243 }, {  653, 0x400b },
+  {  657, 0xfb40 }, {  665, 0x8d3e }, {  674, 0x7bf7 }, {  687, 0x8c2c },
+  {  693, 0x6eff }, {  706, 0xe3fa }, {  717, 0x1d3a }, {  725, 0xa8ed },
+  /* 0x4f00 */
+  {  734, 0xe602 }, {  740, 0xcf83 }, {  749, 0x8cf5 }, {  758, 0x3555 },
+  {  766, 0xe048 }, {  771, 0xffab }, {  784, 0x92b9 }, {  792, 0xd859 },
+  {  800, 0xab18 }, {  807, 0x2892 }, {  812, 0xd7e9 }, {  823, 0x8020 },
+  {  825, 0xc438 }, {  831, 0xf583 }, {  840, 0xe74a }, {  849, 0x450a },
+  /* 0x5000 */
+  {  854, 0xb000 }, {  857, 0x9714 }, {  864, 0x7762 }, {  873, 0x5400 },
+  {  876, 0xd188 }, {  882, 0x1420 }, {  885, 0x1020 }, {  887, 0xc8c0 },
+  {  892, 0x2121 }, {  896, 0x0000 }, {  896, 0x13a8 }, {  902, 0x0c04 },
+  {  905, 0x8000 }, {  906, 0x0440 }, {  908, 0x70c0 }, {  913, 0x0828 },
+  /* 0x5100 */
+  {  916, 0x08c0 }, {  919, 0x0004 }, {  920, 0x0002 }, {  921, 0x8000 },
+  {  922, 0x2b7b }, {  932, 0x1472 }, {  938, 0x7924 }, {  945, 0x3bfb },
+  {  957, 0x3327 }, {  965, 0x1ae4 }, {  972, 0x9835 }, {  979, 0x38ef },
+  {  989, 0x9ad1 }, {  997, 0x2802 }, { 1000, 0xa813 }, { 1006, 0xbf69 },
+  /* 0x5200 */
+  { 1017, 0x65cf }, { 1027, 0x2fc6 }, { 1036, 0x6b11 }, { 1043, 0xafc9 },
+  { 1053, 0x340f }, { 1060, 0x5053 }, { 1066, 0x86a2 }, { 1072, 0xa004 },
+  { 1075, 0x0106 }, { 1078, 0xe809 }, { 1084, 0x3f0f }, { 1094, 0xc00e },
+  { 1099, 0x0a88 }, { 1103, 0x8145 }, { 1108, 0x0010 }, { 1109, 0xc601 },
+  /* 0x5300 */
+  { 1114, 0xa161 }, { 1120, 0x26e1 }, { 1127, 0x444b }, { 1133, 0xce00 },
+  { 1138, 0xc7aa }, { 1147, 0xd4ee }, { 1157, 0xcadf }, { 1168, 0x85bb },
+  { 1177, 0x3a74 }, { 1185, 0xa520 }, { 1190, 0x436c }, { 1197, 0x8840 },
+  { 1200, 0x3f06 }, { 1208, 0x8bd2 }, { 1216, 0xff79 }, { 1229, 0x3bef },
+  /* 0x5400 */
+  { 1241, 0xf75a }, { 1252, 0xe8ef }, { 1263, 0xfbcb }, { 1275, 0x5b36 },
+  { 1284, 0x0d49 }, { 1290, 0x1bfd }, { 1301, 0x0154 }, { 1305, 0x39ee },
+  { 1315, 0xd855 }, { 1323, 0x2e75 }, { 1332, 0xbfd8 }, { 1343, 0xa91a },
+  { 1350, 0xf3d7 }, { 1362, 0xf6bf }, { 1375, 0x67e0 }, { 1383, 0xb40c },
+  /* 0x5500 */
+  { 1389, 0x82c2 }, { 1394, 0x0813 }, { 1398, 0xd49d }, { 1407, 0xd08b },
+  { 1414, 0x065a }, { 1420, 0x1061 }, { 1424, 0x74f2 }, { 1433, 0x59e0 },
+  { 1440, 0x8f9f }, { 1451, 0xb312 }, { 1458, 0x0080 }, { 1459, 0x6aaa },
+  { 1467, 0x3230 }, { 1472, 0xb05e }, { 1480, 0x9d7a }, { 1490, 0x60ac },
+  /* 0x5600 */
+  { 1496, 0xd303 }, { 1503, 0xc900 }, { 1507, 0x3098 }, { 1512, 0x8a56 },
+  { 1519, 0x7000 }, { 1522, 0x1390 }, { 1527, 0x1f14 }, { 1534, 0x1842 },
+  { 1538, 0xc060 }, { 1542, 0x0008 }, { 1543, 0x8008 }, { 1545, 0x1080 },
+  { 1547, 0x0400 }, { 1548, 0xec90 }, { 1555, 0x2817 }, { 1561, 0xe633 },
+  /* 0x5700 */
+  { 1570, 0x0758 }, { 1576, 0x9000 }, { 1578, 0xf708 }, { 1586, 0x4e09 },
+  { 1592, 0xf485 }, { 1600, 0xfc83 }, { 1609, 0xaf53 }, { 1619, 0x18c8 },
+  { 1624, 0x187c }, { 1631, 0x080c }, { 1634, 0x6adf }, { 1645, 0x0114 },
+  { 1648, 0xc80c }, { 1653, 0xa734 }, { 1661, 0xa011 }, { 1665, 0x2710 },
+  /* 0x5800 */
+  { 1670, 0x28c5 }, { 1676, 0x4222 }, { 1680, 0x0413 }, { 1684, 0x0021 },
+  { 1686, 0x3010 }, { 1689, 0x4112 }, { 1693, 0x1820 }, { 1696, 0x4000 },
+  { 1697, 0x022b }, { 1702, 0xc60c }, { 1708, 0x0300 }, { 1710, 0x1000 },
+  { 1711, 0x0022 }, { 1713, 0x0022 }, { 1715, 0x5810 }, { 1719, 0x0249 },
+  /* 0x5900 */
+  { 1723, 0xa094 }, { 1728, 0x9670 }, { 1735, 0xeeb0 }, { 1744, 0x1792 },
+  { 1751, 0xcb96 }, { 1760, 0x05f2 }, { 1767, 0x0025 }, { 1770, 0x2358 },
+  { 1776, 0x25de }, { 1785, 0x42cc }, { 1791, 0xcf38 }, { 1800, 0x4a04 },
+  { 1804, 0x0c40 }, { 1807, 0x359f }, { 1817, 0x1128 }, { 1821, 0x8a00 },
+  /* 0x5a00 */
+  { 1824, 0x13fa }, { 1833, 0x910a }, { 1838, 0x0229 }, { 1842, 0x1056 },
+  { 1847, 0x0641 }, { 1851, 0x0420 }, { 1853, 0x0484 }, { 1856, 0x84f0 },
+  { 1862, 0x0000 }, { 1862, 0x0c04 }, { 1865, 0x0400 }, { 1866, 0x412c },
+  { 1871, 0x1206 }, { 1875, 0x1154 }, { 1880, 0x0a4b }, { 1886, 0x0002 },
+  /* 0x5b00 */
+  { 1887, 0x0200 }, { 1888, 0x00c0 }, { 1890, 0x0000 }, { 1890, 0x0094 },
+  { 1893, 0x0001 }, { 1894, 0xbfbb }, { 1907, 0x167c }, { 1915, 0x242b },
+  { 1921, 0x9bbb }, { 1932, 0x7fa8 }, { 1942, 0x0c7f }, { 1951, 0xe379 },
+  { 1961, 0x10f4 }, { 1967, 0xe00d }, { 1973, 0x4132 }, { 1978, 0x9f01 },
+  /* 0x5c00 */
+  { 1985, 0x8652 }, { 1991, 0x3572 }, { 1999, 0x10b4 }, { 2004, 0xff12 },
+  { 2014, 0xcf27 }, { 2024, 0x4223 }, { 2029, 0xc06b }, { 2036, 0x8602 },
+  { 2040, 0x3106 }, { 2045, 0x1fd3 }, { 2055, 0x3a0c }, { 2061, 0xa1aa },
+  { 2068, 0x0812 }, { 2071, 0x0204 }, { 2073, 0x2572 }, { 2080, 0x0801 },
+  /* 0x5d00 */
+  { 2082, 0x40cc }, { 2087, 0x4850 }, { 2091, 0x62d0 }, { 2097, 0x6010 },
+  { 2100, 0x1c80 }, { 2104, 0x2900 }, { 2107, 0x9a00 }, { 2111, 0x0010 },
+  { 2112, 0x0004 }, { 2113, 0x2200 }, { 2115, 0x0000 }, { 2115, 0x0080 },
+  { 2116, 0x2020 }, { 2118, 0x6800 }, { 2121, 0xcbe6 }, { 2131, 0x609e },
+  /* 0x5e00 */
+  { 2138, 0x916e }, { 2146, 0x3f73 }, { 2157, 0x60c0 }, { 2161, 0x3982 },
+  { 2167, 0x1034 }, { 2171, 0x4830 }, { 2175, 0x0006 }, { 2177, 0xbd5c },
+  { 2187, 0x8cd1 }, { 2194, 0xd6fb }, { 2206, 0x20e1 }, { 2211, 0x43e8 },
+  { 2218, 0x0600 }, { 2220, 0x084e }, { 2225, 0x0500 }, { 2227, 0xc4d0 },
+  /* 0x5f00 */
+  { 2233, 0x8d1f }, { 2242, 0x89aa }, { 2249, 0xa6e1 }, { 2257, 0x1602 },
+  { 2261, 0x0001 }, { 2262, 0x21ed }, { 2270, 0x3656 }, { 2278, 0x1a8b },
+  { 2285, 0x1fb7 }, { 2296, 0x13a5 }, { 2303, 0x6502 }, { 2308, 0x30a0 },
+  { 2312, 0xb278 }, { 2320, 0x23c7 }, { 2328, 0x6c93 }, { 2336, 0xe922 },
+  /* 0x6000 */
+  { 2343, 0xe47f }, { 2354, 0x3a74 }, { 2362, 0x8fe3 }, { 2372, 0x9820 },
+  { 2376, 0x280e }, { 2381, 0x2625 }, { 2387, 0xbf9c }, { 2398, 0xbf49 },
+  { 2408, 0x3218 }, { 2413, 0xac54 }, { 2420, 0xb949 }, { 2428, 0x1916 },
+  { 2434, 0x0c60 }, { 2438, 0xb522 }, { 2445, 0xfbc1 }, { 2455, 0x0659 },
+  /* 0x6100 */
+  { 2461, 0xe343 }, { 2469, 0x8420 }, { 2472, 0x08d9 }, { 2478, 0x8000 },
+  { 2479, 0x5500 }, { 2483, 0x2022 }, { 2486, 0x0184 }, { 2489, 0x00a1 },
+  { 2492, 0x4800 }, { 2494, 0x2010 }, { 2496, 0x1380 }, { 2500, 0x4080 },
+  { 2502, 0x0d04 }, { 2506, 0x0016 }, { 2509, 0x0040 }, { 2510, 0x8020 },
+  /* 0x6200 */
+  { 2512, 0xfd40 }, { 2520, 0x8de7 }, { 2530, 0x5436 }, { 2537, 0xe098 },
+  { 2543, 0x7b8b }, { 2553, 0x091e }, { 2559, 0xfec8 }, { 2569, 0xd249 },
+  { 2576, 0x0611 }, { 2580, 0x8dee }, { 2590, 0x1937 }, { 2598, 0xba22 },
+  { 2605, 0x77f4 }, { 2616, 0x9fdd }, { 2628, 0xf3ec }, { 2639, 0xf0da },
+  /* 0x6300 */
+  { 2648, 0x4386 }, { 2654, 0xec42 }, { 2661, 0x8d3f }, { 2671, 0x2604 },
+  { 2675, 0xfa6c }, { 2685, 0xc021 }, { 2689, 0x628e }, { 2696, 0x0cc2 },
+  { 2701, 0xd785 }, { 2710, 0x0145 }, { 2714, 0x77ad }, { 2725, 0x5599 },
+  { 2733, 0xe250 }, { 2739, 0x4045 }, { 2743, 0x260b }, { 2749, 0xa154 },
+  /* 0x6400 */
+  { 2755, 0x9827 }, { 2762, 0x5819 }, { 2768, 0x3443 }, { 2774, 0xa410 },
+  { 2778, 0x05f2 }, { 2785, 0x4114 }, { 2789, 0x2280 }, { 2792, 0x0700 },
+  { 2795, 0x00b4 }, { 2799, 0x4266 }, { 2805, 0x7210 }, { 2810, 0x15a1 },
+  { 2816, 0x6025 }, { 2821, 0x4185 }, { 2826, 0x0054 }, { 2829, 0x0000 },
+  /* 0x6500 */
+  { 2829, 0x0201 }, { 2831, 0x0104 }, { 2833, 0xc820 }, { 2837, 0xcb70 },
+  { 2845, 0x9320 }, { 2850, 0x6a62 }, { 2857, 0x184c }, { 2862, 0x0095 },
+  { 2866, 0x1880 }, { 2869, 0x9a8b }, { 2877, 0xaab2 }, { 2885, 0x3201 },
+  { 2889, 0xd87a }, { 2898, 0x00c4 }, { 2901, 0xf3e5 }, { 2912, 0x04c3 },
+  /* 0x6600 */
+  { 2917, 0xd44d }, { 2925, 0xa238 }, { 2931, 0xa1a1 }, { 2937, 0x5072 },
+  { 2943, 0x980a }, { 2948, 0x84fc }, { 2956, 0xc152 }, { 2962, 0x44d1 },
+  { 2968, 0x1094 }, { 2972, 0x20c2 }, { 2976, 0x4180 }, { 2979, 0x4210 },
+  { 2982, 0x0000 }, { 2982, 0x3a00 }, { 2986, 0x0240 }, { 2988, 0xd29d },
+  /* 0x6700 */
+  { 2997, 0x2f01 }, { 3003, 0xa8b1 }, { 3010, 0xbd40 }, { 3017, 0x2432 },
+  { 3022, 0xd34d }, { 3031, 0xd04b }, { 3038, 0xa723 }, { 3046, 0xd0ad },
+  { 3054, 0x0a92 }, { 3059, 0x75a1 }, { 3067, 0xadac }, { 3076, 0x01e9 },
+  { 3082, 0x801a }, { 3086, 0x771f }, { 3097, 0x9225 }, { 3103, 0xa01b },
+  /* 0x6800 */
+  { 3109, 0xdfa1 }, { 3119, 0x20ca }, { 3124, 0x0602 }, { 3127, 0x738c },
+  { 3135, 0x577f }, { 3147, 0x003b }, { 3152, 0x0bff }, { 3163, 0x00d0 },
+  { 3166, 0x806a }, { 3171, 0x0088 }, { 3173, 0xa1c4 }, { 3179, 0x0029 },
+  { 3182, 0x2a05 }, { 3187, 0x0524 }, { 3191, 0x4009 }, { 3194, 0x1623 },
+  /* 0x6900 */
+  { 3200, 0x6822 }, { 3205, 0x8005 }, { 3208, 0x2011 }, { 3211, 0xa211 },
+  { 3216, 0x0004 }, { 3217, 0x6490 }, { 3222, 0x4849 }, { 3227, 0x1382 },
+  { 3232, 0x23d5 }, { 3240, 0x1930 }, { 3245, 0x2980 }, { 3249, 0x0892 },
+  { 3253, 0x5402 }, { 3257, 0x8811 }, { 3261, 0x2001 }, { 3263, 0xa004 },
+  /* 0x6a00 */
+  { 3266, 0x0400 }, { 3267, 0x8180 }, { 3270, 0x8502 }, { 3274, 0x6022 },
+  { 3278, 0x0090 }, { 3280, 0x0b01 }, { 3284, 0x0022 }, { 3286, 0x1202 },
+  { 3289, 0x4011 }, { 3292, 0x0083 }, { 3295, 0x1a01 }, { 3299, 0x0000 },
+  { 3299, 0x0000 }, { 3299, 0x0000 }, { 3299, 0x0000 }, { 3299, 0x0000 },
+  /* 0x6b00 */
+  { 3299, 0x0000 }, { 3299, 0x0000 }, { 3299, 0x009f }, { 3305, 0x4684 },
+  { 3310, 0x12c8 }, { 3315, 0x0200 }, { 3316, 0x04fc }, { 3323, 0x1a00 },
+  { 3326, 0x2ede }, { 3336, 0x0c4c }, { 3341, 0x0402 }, { 3343, 0x80b8 },
+  { 3348, 0xa826 }, { 3354, 0x0afc }, { 3362, 0x8c02 }, { 3366, 0x2228 },
+  /* 0x6c00 */
+  { 3370, 0xa0e0 }, { 3375, 0x8f7b }, { 3386, 0xc7d6 }, { 3396, 0x2135 },
+  { 3402, 0x06c7 }, { 3409, 0xf8b1 }, { 3418, 0x0713 }, { 3424, 0x6255 },
+  { 3431, 0x936e }, { 3440, 0x8a19 }, { 3446, 0x6efa }, { 3457, 0xfb0e },
+  { 3467, 0x1630 }, { 3472, 0x48f9 }, { 3480, 0xcd2f }, { 3490, 0x7deb },
+  /* 0x6d00 */
+  { 3502, 0x5892 }, { 3508, 0x4e84 }, { 3514, 0x4ca0 }, { 3519, 0x7a2e },
+  { 3528, 0xedea }, { 3539, 0x561e }, { 3547, 0xc649 }, { 3554, 0x1190 },
+  { 3558, 0x5324 }, { 3564, 0xe83a }, { 3572, 0xcfdb }, { 3584, 0x8124 },
+  { 3588, 0x18f1 }, { 3595, 0x6342 }, { 3601, 0x5853 }, { 3608, 0x1a8a },
+  /* 0x6e00 */
+  { 3614, 0x7420 }, { 3619, 0x24d3 }, { 3626, 0xaa3b }, { 3635, 0x0514 },
+  { 3639, 0x6018 }, { 3643, 0x8958 }, { 3649, 0x4800 }, { 3651, 0xc000 },
+  { 3653, 0x8268 }, { 3658, 0x9101 }, { 3662, 0x84a4 }, { 3667, 0x2cd6 },
+  { 3675, 0x8886 }, { 3680, 0xc4ba }, { 3688, 0x0377 }, { 3696, 0x0210 },
+  /* 0x6f00 */
+  { 3698, 0x8244 }, { 3702, 0x0038 }, { 3705, 0xae11 }, { 3712, 0x404a },
+  { 3716, 0x28c0 }, { 3720, 0x5100 }, { 3723, 0x6044 }, { 3727, 0x1514 },
+  { 3732, 0x7310 }, { 3738, 0x1000 }, { 3739, 0x0082 }, { 3741, 0x0248 },
+  { 3744, 0x0205 }, { 3747, 0x4006 }, { 3750, 0xc003 }, { 3754, 0x0000 },
+  /* 0x7000 */
+  { 3754, 0x0000 }, { 3754, 0x0c02 }, { 3757, 0x0008 }, { 3758, 0x0220 },
+  { 3760, 0x9000 }, { 3762, 0x4000 }, { 3763, 0xb800 }, { 3767, 0xd161 },
+  { 3774, 0x4621 }, { 3779, 0x3274 }, { 3786, 0xf800 }, { 3791, 0x3b8a },
+  { 3799, 0x050f }, { 3805, 0x8b00 }, { 3809, 0xbbd0 }, { 3818, 0x2280 },
+  /* 0x7100 */
+  { 3821, 0x0600 }, { 3823, 0x0769 }, { 3830, 0x8040 }, { 3832, 0x0043 },
+  { 3835, 0x5420 }, { 3839, 0x5000 }, { 3841, 0x41d0 }, { 3846, 0x250c },
+  { 3851, 0x8410 }, { 3854, 0x8310 }, { 3858, 0x1101 }, { 3861, 0x0228 },
+  { 3864, 0x4008 }, { 3866, 0x0030 }, { 3868, 0x40a1 }, { 3872, 0x0200 },
+  /* 0x7200 */
+  { 3873, 0x0040 }, { 3874, 0x2000 }, { 3875, 0x1500 }, { 3878, 0xabe3 },
+  { 3888, 0x3180 }, { 3892, 0xaa44 }, { 3898, 0xc2c6 }, { 3905, 0xc624 },
+  { 3911, 0xac13 }, { 3918, 0x8004 }, { 3920, 0xb000 }, { 3923, 0x03d1 },
+  { 3929, 0x611e }, { 3936, 0x4285 }, { 3941, 0xf303 }, { 3949, 0x1d9f },
+  /* 0x7300 */
+  { 3959, 0x440a }, { 3963, 0x78e8 }, { 3971, 0x5e26 }, { 3979, 0xc392 },
+  { 3986, 0x2000 }, { 3987, 0x0085 }, { 3990, 0xb001 }, { 3994, 0x4000 },
+  { 3995, 0x4a90 }, { 4000, 0x8842 }, { 4004, 0xca04 }, { 4009, 0x0c8d },
+  { 4015, 0xa705 }, { 4022, 0x4203 }, { 4026, 0x22a1 }, { 4031, 0x0004 },
+  /* 0x7400 */
+  { 4032, 0x8668 }, { 4038, 0x0c01 }, { 4041, 0x5564 }, { 4048, 0x1079 },
+  { 4054, 0x0002 }, { 4055, 0xdea0 }, { 4063, 0x2000 }, { 4064, 0x40c1 },
+  { 4068, 0x488b }, { 4074, 0x5001 }, { 4077, 0x0380 }, { 4080, 0x0400 },
+  { 4081, 0x0000 }, { 4081, 0x5004 }, { 4084, 0xc05d }, { 4091, 0x80d0 },
+  /* 0x7500 */
+  { 4095, 0xa010 }, { 4098, 0x970a }, { 4105, 0xbb20 }, { 4112, 0x4daf },
+  { 4122, 0xd921 }, { 4129, 0x1e10 }, { 4134, 0x0460 }, { 4137, 0x8314 },
+  { 4142, 0x8848 }, { 4146, 0xa6d6 }, { 4155, 0xd83b }, { 4164, 0x733f },
+  { 4175, 0x27bc }, { 4184, 0x4974 }, { 4191, 0x0ddc }, { 4199, 0x9213 },
+  /* 0x7600 */
+  { 4205, 0x142b }, { 4211, 0x8ba1 }, { 4218, 0x2e75 }, { 4227, 0xd139 },
+  { 4235, 0x3009 }, { 4239, 0x5050 }, { 4243, 0x8808 }, { 4246, 0x6900 },
+  { 4250, 0x49d4 }, { 4257, 0x024a }, { 4261, 0x4010 }, { 4263, 0x8016 },
+  { 4267, 0xe564 }, { 4275, 0x89d7 }, { 4284, 0xc020 }, { 4287, 0x5316 },
+  /* 0x7700 */
+  { 4294, 0x2b92 }, { 4301, 0x8600 }, { 4304, 0xa345 }, { 4311, 0x15e0 },
+  { 4317, 0x008b }, { 4321, 0x0c03 }, { 4325, 0x196e }, { 4333, 0xe200 },
+  { 4337, 0x7031 }, { 4343, 0x8006 }, { 4346, 0x16a5 }, { 4353, 0xa829 },
+  { 4359, 0x2000 }, { 4360, 0x1880 }, { 4363, 0x7aac }, { 4372, 0xe148 },
+  /* 0x7800 */
+  { 4378, 0x3207 }, { 4384, 0xb5d6 }, { 4394, 0x32e8 }, { 4401, 0x5f91 },
+  { 4410, 0x50a1 }, { 4415, 0x20e5 }, { 4421, 0x7c00 }, { 4426, 0x1080 },
+  { 4428, 0x7280 }, { 4433, 0x9d8a }, { 4441, 0x00aa }, { 4445, 0x421f },
+  { 4452, 0x0e22 }, { 4457, 0x0231 }, { 4461, 0x1100 }, { 4463, 0x0494 },
+  /* 0x7900 */
+  { 4467, 0x0022 }, { 4469, 0x4008 }, { 4471, 0x0010 }, { 4472, 0x5c10 },
+  { 4477, 0x0343 }, { 4482, 0xfcc8 }, { 4491, 0xa1a5 }, { 4498, 0x0580 },
+  { 4501, 0x8433 }, { 4507, 0x0400 }, { 4508, 0x0080 }, { 4509, 0x6e08 },
+  { 4515, 0x2a4b }, { 4522, 0x8126 }, { 4527, 0xaad8 }, { 4535, 0x2901 },
+  /* 0x7a00 */
+  { 4539, 0x684d }, { 4546, 0x4490 }, { 4550, 0x0009 }, { 4552, 0xba88 },
+  { 4559, 0x0040 }, { 4560, 0x0082 }, { 4562, 0x0000 }, { 4562, 0x87d1 },
+  { 4570, 0x215b }, { 4577, 0xb1e6 }, { 4586, 0x3161 }, { 4592, 0x8008 },
+  { 4594, 0x0800 }, { 4595, 0xc240 }, { 4599, 0xa069 }, { 4605, 0xa600 },
+  /* 0x7b00 */
+  { 4609, 0x8d58 }, { 4616, 0x4a32 }, { 4622, 0x5d71 }, { 4631, 0x550a },
+  { 4637, 0x9aa0 }, { 4643, 0x2d57 }, { 4652, 0x4005 }, { 4655, 0x4aa6 },
+  { 4662, 0x2021 }, { 4665, 0x30b1 }, { 4671, 0x3fc6 }, { 4681, 0x0112 },
+  { 4684, 0x10c2 }, { 4688, 0x260a }, { 4693, 0x4462 }, { 4698, 0x5082 },
+  /* 0x7c00 */
+  { 4702, 0x9880 }, { 4706, 0x8040 }, { 4708, 0x04c0 }, { 4711, 0x8100 },
+  { 4713, 0x2003 }, { 4716, 0x0000 }, { 4716, 0x0000 }, { 4716, 0x3818 },
+  { 4721, 0x0200 }, { 4722, 0xf1a6 }, { 4731, 0x4434 }, { 4736, 0x720e },
+  { 4743, 0x35a2 }, { 4750, 0x92e0 }, { 4756, 0x8101 }, { 4759, 0x0900 },
+  /* 0x7d00 */
+  { 4761, 0x0400 }, { 4762, 0x0000 }, { 4762, 0x8885 }, { 4767, 0x0000 },
+  { 4767, 0x0000 }, { 4767, 0x0000 }, { 4767, 0x4000 }, { 4768, 0x0080 },
+  { 4769, 0x0000 }, { 4769, 0x0000 }, { 4769, 0x4040 }, { 4771, 0x0000 },
+  { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0000 },
+  /* 0x7e00 */
+  { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0000 }, { 4771, 0x0800 },
+  { 4772, 0x0082 }, { 4774, 0x0000 }, { 4774, 0x0000 }, { 4774, 0x0000 },
+  { 4774, 0x0004 }, { 4775, 0x8800 }, { 4777, 0xbfff }, { 4792, 0xe7ef },
+  { 4805, 0xffff }, { 4821, 0xffbf }, { 4836, 0xefef }, { 4850, 0xfdff },
+  /* 0x7f00 */
+  { 4865, 0xfbff }, { 4880, 0xbffe }, { 4894, 0xffff }, { 4910, 0x057f },
+  { 4919, 0x0034 }, { 4922, 0x85b3 }, { 4930, 0x4706 }, { 4936, 0x4216 },
+  { 4941, 0x5402 }, { 4945, 0xe410 }, { 4950, 0x8092 }, { 4954, 0xb305 },
+  { 4961, 0x5422 }, { 4966, 0x8130 }, { 4970, 0x4263 }, { 4976, 0x180b },
+  /* 0x8000 */
+  { 4981, 0x387b }, { 4990, 0x13f5 }, { 4999, 0x07e5 }, { 5007, 0xa9ea },
+  { 5016, 0x3c4c }, { 5023, 0x0514 }, { 5027, 0x0600 }, { 5029, 0x8002 },
+  { 5031, 0x1ad9 }, { 5039, 0xbd48 }, { 5047, 0xee37 }, { 5058, 0xf496 },
+  { 5067, 0x705f }, { 5076, 0x7ec0 }, { 5084, 0xbfb2 }, { 5095, 0x355f },
+  /* 0x8100 */
+  { 5105, 0xe644 }, { 5112, 0x455f }, { 5121, 0x9000 }, { 5123, 0x4146 },
+  { 5128, 0x1d40 }, { 5133, 0x063b }, { 5140, 0x62a1 }, { 5146, 0xfe13 },
+  { 5156, 0x8505 }, { 5161, 0x3902 }, { 5166, 0x0548 }, { 5170, 0x0c08 },
+  { 5173, 0x144f }, { 5180, 0x0000 }, { 5180, 0x3488 }, { 5185, 0x5818 },
+  /* 0x8200 */
+  { 5190, 0x3077 }, { 5198, 0xd815 }, { 5205, 0xbd0e }, { 5214, 0x4bfb },
+  { 5225, 0x8a90 }, { 5230, 0x8500 }, { 5233, 0xc100 }, { 5236, 0xe61d },
+  { 5245, 0xed14 }, { 5253, 0xb386 }, { 5261, 0xff72 }, { 5273, 0x639b },
+  { 5282, 0xfd92 }, { 5292, 0xd9be }, { 5303, 0x887b }, { 5311, 0x0a92 },
+  /* 0x8300 */
+  { 5316, 0xd3fe }, { 5328, 0x1cb2 }, { 5335, 0xb980 }, { 5341, 0x177a },
+  { 5350, 0x82c9 }, { 5356, 0xdc17 }, { 5365, 0xfffb }, { 5380, 0x3980 },
+  { 5385, 0x4260 }, { 5389, 0x590c }, { 5395, 0x0f01 }, { 5400, 0x37df },
+  { 5412, 0x94a3 }, { 5419, 0xb150 }, { 5425, 0x0623 }, { 5430, 0x2307 },
+  /* 0x8400 */
+  { 5436, 0xf85a }, { 5445, 0x3102 }, { 5449, 0x01f0 }, { 5454, 0x3102 },
+  { 5458, 0x0040 }, { 5459, 0x1e82 }, { 5465, 0x3a0a }, { 5471, 0x056a },
+  { 5477, 0x5b84 }, { 5484, 0x1280 }, { 5487, 0x8002 }, { 5489, 0xa714 },
+  { 5496, 0x2612 }, { 5501, 0xa04b }, { 5507, 0x1069 }, { 5512, 0x9001 },
+  /* 0x8500 */
+  { 5515, 0x1000 }, { 5516, 0x848a }, { 5521, 0x1802 }, { 5524, 0x3f80 },
+  { 5531, 0x0708 }, { 5535, 0x4240 }, { 5538, 0x0110 }, { 5540, 0x4e14 },
+  { 5546, 0x80b0 }, { 5550, 0x1800 }, { 5552, 0xc510 }, { 5557, 0x0281 },
+  { 5560, 0x8202 }, { 5563, 0x1029 }, { 5567, 0x0210 }, { 5569, 0x8800 },
+  /* 0x8600 */
+  { 5571, 0x0020 }, { 5572, 0x0042 }, { 5574, 0x0280 }, { 5576, 0x1100 },
+  { 5578, 0xe000 }, { 5581, 0x4413 }, { 5586, 0x5804 }, { 5590, 0xfe02 },
+  { 5598, 0x3c07 }, { 5605, 0x3028 }, { 5609, 0x9798 }, { 5617, 0x0473 },
+  { 5623, 0xced1 }, { 5632, 0xcb13 }, { 5640, 0x6210 }, { 5644, 0x431f },
+  /* 0x8700 */
+  { 5652, 0x278d }, { 5660, 0x55ac }, { 5668, 0x422e }, { 5674, 0xc892 },
+  { 5680, 0x5380 }, { 5685, 0x0288 }, { 5688, 0x4039 }, { 5693, 0x7851 },
+  { 5700, 0x292c }, { 5706, 0x8088 }, { 5709, 0xb900 }, { 5714, 0x2428 },
+  { 5718, 0x0c41 }, { 5722, 0x080e }, { 5726, 0x4421 }, { 5730, 0x4200 },
+  /* 0x8800 */
+  { 5732, 0x0408 }, { 5734, 0x0868 }, { 5738, 0x0006 }, { 5740, 0x1204 },
+  { 5743, 0x3031 }, { 5748, 0x0290 }, { 5751, 0x5b3e }, { 5761, 0xe085 },
+  { 5767, 0x2936 }, { 5774, 0x1044 }, { 5777, 0x2814 }, { 5781, 0x1082 },
+  { 5784, 0x4266 }, { 5790, 0x8334 }, { 5796, 0x013c }, { 5801, 0x531b },
+  /* 0x8900 */
+  { 5809, 0x0404 }, { 5811, 0x0e0d }, { 5817, 0x0c22 }, { 5821, 0x0051 },
+  { 5824, 0x0012 }, { 5826, 0xc000 }, { 5828, 0x0040 }, { 5829, 0x8800 },
+  { 5831, 0x004a }, { 5834, 0x0000 }, { 5834, 0x0000 }, { 5834, 0x0000 },
+  { 5834, 0xdff6 }, { 5847, 0x5447 }, { 5854, 0x8868 }, { 5859, 0x0008 },
+  /* 0x8a00 */
+  { 5860, 0x0081 }, { 5862, 0x0000 }, { 5862, 0x0000 }, { 5862, 0x4000 },
+  { 5863, 0x0100 }, { 5864, 0x0000 }, { 5864, 0x0000 }, { 5864, 0x0200 },
+  { 5865, 0x0600 }, { 5867, 0x0008 }, { 5868, 0x0000 }, { 5868, 0x0000 },
+  { 5868, 0x0000 }, { 5868, 0x0000 }, { 5868, 0x0000 }, { 5868, 0x0000 },
+  /* 0x8b00 */
+  { 5868, 0x0080 }, { 5869, 0x0000 }, { 5869, 0x0040 }, { 5870, 0x0000 },
+  { 5870, 0x0000 }, { 5870, 0x0000 }, { 5870, 0x1040 }, { 5872, 0x0000 },
+  { 5872, 0x0000 }, { 5872, 0x0000 }, { 5872, 0xefff }, { 5887, 0xf7fd },
+  { 5901, 0xff7f }, { 5916, 0xfffe }, { 5931, 0xfbff }, { 5946, 0xffff },
+  /* 0x8c00 */
+  { 5962, 0xfdff }, { 5977, 0xbfff }, { 5992, 0xffff }, { 6008, 0x00ff },
+  { 6016, 0x12c2 }, { 6021, 0x0420 }, { 6023, 0x0c06 }, { 6027, 0x0708 },
+  { 6031, 0x1624 }, { 6036, 0x0110 }, { 6038, 0x0000 }, { 6038, 0x0000 },
+  { 6038, 0x0000 }, { 6038, 0x0000 }, { 6038, 0x0000 }, { 6038, 0x0000 },
+  /* 0x8d00 */
+  { 6038, 0x0000 }, { 6038, 0xe000 }, { 6041, 0xfffe }, { 6056, 0xffff },
+  { 6072, 0xffff }, { 6088, 0x7f79 }, { 6100, 0x28df }, { 6109, 0x00f9 },
+  { 6115, 0x0c32 }, { 6120, 0x8012 }, { 6123, 0x0008 }, { 6124, 0xd53a },
+  { 6133, 0xd858 }, { 6140, 0xecc2 }, { 6148, 0x9d18 }, { 6155, 0x2fa8 },
+  /* 0x8e00 */
+  { 6163, 0x9620 }, { 6168, 0xe010 }, { 6172, 0xd60c }, { 6179, 0x2622 },
+  { 6184, 0x0f97 }, { 6193, 0x0206 }, { 6196, 0xb240 }, { 6201, 0x9055 },
+  { 6207, 0x80a2 }, { 6211, 0x5011 }, { 6215, 0x9800 }, { 6218, 0x0404 },
+  { 6220, 0x4000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0x0000 },
+  /* 0x8f00 */
+  { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0x0000 },
+  { 6221, 0x0000 }, { 6221, 0x0000 }, { 6221, 0xfbc0 }, { 6230, 0xffff },
+  { 6246, 0xeffe }, { 6260, 0xdffb }, { 6274, 0x0b08 }, { 6278, 0x6243 },
+  { 6284, 0x41b6 }, { 6291, 0xfb3b }, { 6303, 0x6f74 }, { 6313, 0x2389 },
+  /* 0x9000 */
+  { 6319, 0xae7f }, { 6331, 0xecd7 }, { 6342, 0xe047 }, { 6349, 0x5960 },
+  { 6355, 0xa096 }, { 6361, 0x098f }, { 6368, 0x612c }, { 6374, 0xa030 },
+  { 6378, 0x090d }, { 6383, 0x2aaa }, { 6390, 0xd44e }, { 6398, 0x4f7b },
+  { 6409, 0xc4b2 }, { 6416, 0x388b }, { 6423, 0xa9c6 }, { 6431, 0x6110 },
+  /* 0x9100 */
+  { 6435, 0x0014 }, { 6437, 0x4200 }, { 6439, 0x800c }, { 6442, 0x0202 },
+  { 6444, 0xfe48 }, { 6453, 0x6485 }, { 6459, 0xd63e }, { 6469, 0xe3f7 },
+  { 6481, 0x3aa0 }, { 6487, 0x0c07 }, { 6492, 0xe40c }, { 6498, 0x0430 },
+  { 6501, 0xf680 }, { 6508, 0x1002 }, { 6510, 0x0000 }, { 6510, 0x0000 },
+  /* 0x9200 */
+  { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0000 },
+  { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0000 }, { 6510, 0x0010 },
+  { 6511, 0x4000 }, { 6512, 0x0000 }, { 6512, 0x4000 }, { 6513, 0x0000 },
+  { 6513, 0x0100 }, { 6514, 0x0000 }, { 6514, 0x0000 }, { 6514, 0x0000 },
+  /* 0x9300 */
+  { 6514, 0x0000 }, { 6514, 0x0000 }, { 6514, 0x0000 }, { 6514, 0x4000 },
+  { 6515, 0x0000 }, { 6515, 0x0000 }, { 6515, 0x0400 }, { 6516, 0x0000 },
+  { 6516, 0x8000 }, { 6517, 0x0000 }, { 6517, 0x0000 }, { 6517, 0x0000 },
+  { 6517, 0x0400 }, { 6518, 0x0040 }, { 6519, 0x0000 }, { 6519, 0x0000 },
+  /* 0x9400 */
+  { 6519, 0x0000 }, { 6519, 0x0000 }, { 6519, 0x0000 }, { 6519, 0x4000 },
+  { 6520, 0x0000 }, { 6520, 0x0000 }, { 6520, 0x0800 }, { 6521, 0x0000 },
+  { 6521, 0xffe0 }, { 6532, 0xfebd }, { 6545, 0xffff }, { 6561, 0xffff },
+  { 6577, 0x7f7f }, { 6591, 0xfbe7 }, { 6604, 0xffbf }, { 6619, 0xf7ff },
+  /* 0x9500 */
+  { 6634, 0xffff }, { 6650, 0xefff }, { 6665, 0xff7e }, { 6679, 0xdff7 },
+  { 6693, 0xf6f7 }, { 6706, 0xfbdf }, { 6720, 0xbffe }, { 6734, 0x804f },
+  { 6740, 0x0000 }, { 6740, 0x0000 }, { 6740, 0x0000 }, { 6740, 0x0000 },
+  { 6740, 0x0000 }, { 6740, 0x0000 }, { 6740, 0xef00 }, { 6747, 0x7fff },
+  /* 0x9600 */
+  { 6762, 0xff7f }, { 6777, 0xb6f7 }, { 6789, 0x4406 }, { 6793, 0xb87e },
+  { 6803, 0x3bf5 }, { 6814, 0x8831 }, { 6819, 0x1796 }, { 6827, 0x00f4 },
+  { 6832, 0xa960 }, { 6838, 0x1391 }, { 6844, 0x0080 }, { 6845, 0x7249 },
+  { 6852, 0xf2f3 }, { 6863, 0x0024 }, { 6865, 0x8701 }, { 6870, 0x42c8 },
+  /* 0x9700 */
+  { 6875, 0xe3d3 }, { 6885, 0x5048 }, { 6889, 0x2400 }, { 6891, 0x4305 },
+  { 6896, 0x0000 }, { 6896, 0x4a4c }, { 6902, 0x0227 }, { 6907, 0x1058 },
+  { 6911, 0x2820 }, { 6914, 0x0116 }, { 6918, 0xa809 }, { 6923, 0x0014 },
+  { 6925, 0x0000 }, { 6925, 0x0000 }, { 6925, 0x3ec0 }, { 6932, 0x0068 },
+  /* 0x9800 */
+  { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0x0000 },
+  { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0x0000 }, { 6935, 0xffe0 },
+  { 6946, 0xb7ff }, { 6960, 0xfddb }, { 6973, 0x00f7 }, { 6980, 0x0000 },
+  { 6980, 0x4000 }, { 6981, 0xc72e }, { 6990, 0x0180 }, { 6992, 0x0000 },
+  /* 0x9900 */
+  { 6992, 0x2000 }, { 6993, 0x0001 }, { 6994, 0x4000 }, { 6995, 0x0000 },
+  { 6995, 0x0000 }, { 6995, 0x0030 }, { 6997, 0xffa8 }, { 7008, 0xb4f7 },
+  { 7019, 0xadf3 }, { 7030, 0x03ff }, { 7040, 0x0120 }, { 7042, 0x0000 },
+  { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 },
+  /* 0x9a00 */
+  { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0x0000 },
+  { 7042, 0x0000 }, { 7042, 0x0000 }, { 7042, 0xf000 }, { 7046, 0xfffb },
+  { 7061, 0x9df7 }, { 7073, 0xfdcf }, { 7086, 0x01bf }, { 7094, 0x15c3 },
+  { 7101, 0x1827 }, { 7107, 0x810a }, { 7111, 0xa842 }, { 7116, 0x0a00 },
+  /* 0x9b00 */
+  { 7118, 0x8108 }, { 7121, 0x8008 }, { 7123, 0x8008 }, { 7125, 0x1804 },
+  { 7128, 0xa3be }, { 7138, 0x0012 }, { 7140, 0x0000 }, { 7140, 0x0000 },
+  { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 },
+  { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 },
+  /* 0x9c00 */
+  { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 },
+  { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x0000 }, { 7140, 0x9000 },
+  { 7142, 0x69e6 }, { 7151, 0xdc37 }, { 7161, 0x6bff }, { 7174, 0x3dff },
+  { 7187, 0xfcf8 }, { 7198, 0xf3f9 }, { 7210, 0x0004 },
+};
+static const Summary16 gb2312_uni2indx_page9e[27] = {
+  /* 0x9e00 */
+  { 7211, 0x0000 }, { 7211, 0x8000 }, { 7212, 0xbf6f }, { 7225, 0xe7ee },
+  { 7237, 0xdffe }, { 7251, 0x5da2 }, { 7259, 0x3fd8 }, { 7269, 0xc00b },
+  { 7274, 0x0984 }, { 7278, 0xa00c }, { 7282, 0x0040 }, { 7283, 0x6910 },
+  { 7288, 0xe210 }, { 7293, 0xb912 }, { 7300, 0x86a5 }, { 7307, 0x5a00 },
+  /* 0x9f00 */
+  { 7311, 0x6800 }, { 7314, 0x0289 }, { 7318, 0x9005 }, { 7322, 0x6a80 },
+  { 7327, 0x0010 }, { 7328, 0x0003 }, { 7330, 0x0000 }, { 7330, 0x8000 },
+  { 7331, 0x1ff9 }, { 7342, 0x8e00 }, { 7346, 0x0001 },
+};
+static const Summary16 gb2312_uni2indx_pageff[15] = {
+  /* 0xff00 */
+  { 7347, 0xfffe }, { 7362, 0xffff }, { 7378, 0xffff }, { 7394, 0xffff },
+  { 7410, 0xffff }, { 7426, 0x7fff }, { 7441, 0x0000 }, { 7441, 0x0000 },
+  { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x0000 },
+  { 7441, 0x0000 }, { 7441, 0x0000 }, { 7441, 0x002b },
+};
+
+static int
+gb2312_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  if (n >= 2) {
+    const Summary16 *summary = NULL;
+    if (wc < 0x0460)
+      summary = &gb2312_uni2indx_page00[(wc>>4)];
+    else if (wc >= 0x2000 && wc < 0x2650)
+      summary = &gb2312_uni2indx_page20[(wc>>4)-0x200];
+    else if (wc >= 0x3000 && wc < 0x3230)
+      summary = &gb2312_uni2indx_page30[(wc>>4)-0x300];
+    else if (wc >= 0x4e00 && wc < 0x9cf0)
+      summary = &gb2312_uni2indx_page4e[(wc>>4)-0x4e0];
+    else if (wc >= 0x9e00 && wc < 0x9fb0)
+      summary = &gb2312_uni2indx_page9e[(wc>>4)-0x9e0];
+    else if (wc >= 0xff00 && wc < 0xfff0)
+      summary = &gb2312_uni2indx_pageff[(wc>>4)-0xff0];
+    if (summary) {
+      unsigned short used = summary->used;
+      unsigned int i = wc & 0x0f;
+      if (used & ((unsigned short) 1 << i)) {
+        unsigned short c;
+        /* Keep in `used' only the bits 0..i-1. */
+        used &= ((unsigned short) 1 << i) - 1;
+        /* Add `summary->indx' and the number of bits set in `used'. */
+        used = (used & 0x5555) + ((used & 0xaaaa) >> 1);
+        used = (used & 0x3333) + ((used & 0xcccc) >> 2);
+        used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4);
+        used = (used & 0x00ff) + (used >> 8);
+        c = gb2312_2charset[summary->indx + used];
+        r[0] = (c >> 8); r[1] = (c & 0xff);
+        return 2;
+      }
+    }
+    return RET_ILSEQ;
+  }
+  return RET_TOOSMALL;
+}
diff --git a/src/xlibi18n/lcUniConv/gbk.h b/src/xlibi18n/lcUniConv/gbk.h
new file mode 100644 (file)
index 0000000..09c2e63
--- /dev/null
@@ -0,0 +1,6200 @@
+
+/*
+ * GBK-0
+ */
+
+static const unsigned short gbk_2uni_page81[23766] = {
+  /* 0x81 */
+  0x4e02, 0x4e04, 0x4e05, 0x4e06, 0x4e0f, 0x4e12, 0x4e17, 0x4e1f,
+  0x4e20, 0x4e21, 0x4e23, 0x4e26, 0x4e29, 0x4e2e, 0x4e2f, 0x4e31,
+  0x4e33, 0x4e35, 0x4e37, 0x4e3c, 0x4e40, 0x4e41, 0x4e42, 0x4e44,
+  0x4e46, 0x4e4a, 0x4e51, 0x4e55, 0x4e57, 0x4e5a, 0x4e5b, 0x4e62,
+  0x4e63, 0x4e64, 0x4e65, 0x4e67, 0x4e68, 0x4e6a, 0x4e6b, 0x4e6c,
+  0x4e6d, 0x4e6e, 0x4e6f, 0x4e72, 0x4e74, 0x4e75, 0x4e76, 0x4e77,
+  0x4e78, 0x4e79, 0x4e7a, 0x4e7b, 0x4e7c, 0x4e7d, 0x4e7f, 0x4e80,
+  0x4e81, 0x4e82, 0x4e83, 0x4e84, 0x4e85, 0x4e87, 0x4e8a, 0x4e90,
+  0x4e96, 0x4e97, 0x4e99, 0x4e9c, 0x4e9d, 0x4e9e, 0x4ea3, 0x4eaa,
+  0x4eaf, 0x4eb0, 0x4eb1, 0x4eb4, 0x4eb6, 0x4eb7, 0x4eb8, 0x4eb9,
+  0x4ebc, 0x4ebd, 0x4ebe, 0x4ec8, 0x4ecc, 0x4ecf, 0x4ed0, 0x4ed2,
+  0x4eda, 0x4edb, 0x4edc, 0x4ee0, 0x4ee2, 0x4ee6, 0x4ee7, 0x4ee9,
+  0x4eed, 0x4eee, 0x4eef, 0x4ef1, 0x4ef4, 0x4ef8, 0x4ef9, 0x4efa,
+  0x4efc, 0x4efe, 0x4f00, 0x4f02, 0x4f03, 0x4f04, 0x4f05, 0x4f06,
+  0x4f07, 0x4f08, 0x4f0b, 0x4f0c, 0x4f12, 0x4f13, 0x4f14, 0x4f15,
+  0x4f16, 0x4f1c, 0x4f1d, 0x4f21, 0x4f23, 0x4f28, 0x4f29, 0x4f2c,
+  0x4f2d, 0x4f2e, 0x4f31, 0x4f33, 0x4f35, 0x4f37, 0x4f39, 0x4f3b,
+  0x4f3e, 0x4f3f, 0x4f40, 0x4f41, 0x4f42, 0x4f44, 0x4f45, 0x4f47,
+  0x4f48, 0x4f49, 0x4f4a, 0x4f4b, 0x4f4c, 0x4f52, 0x4f54, 0x4f56,
+  0x4f61, 0x4f62, 0x4f66, 0x4f68, 0x4f6a, 0x4f6b, 0x4f6d, 0x4f6e,
+  0x4f71, 0x4f72, 0x4f75, 0x4f77, 0x4f78, 0x4f79, 0x4f7a, 0x4f7d,
+  0x4f80, 0x4f81, 0x4f82, 0x4f85, 0x4f86, 0x4f87, 0x4f8a, 0x4f8c,
+  0x4f8e, 0x4f90, 0x4f92, 0x4f93, 0x4f95, 0x4f96, 0x4f98, 0x4f99,
+  0x4f9a, 0x4f9c, 0x4f9e, 0x4f9f, 0x4fa1, 0x4fa2,
+  /* 0x82 */
+  0x4fa4, 0x4fab, 0x4fad, 0x4fb0, 0x4fb1, 0x4fb2, 0x4fb3, 0x4fb4,
+  0x4fb6, 0x4fb7, 0x4fb8, 0x4fb9, 0x4fba, 0x4fbb, 0x4fbc, 0x4fbd,
+  0x4fbe, 0x4fc0, 0x4fc1, 0x4fc2, 0x4fc6, 0x4fc7, 0x4fc8, 0x4fc9,
+  0x4fcb, 0x4fcc, 0x4fcd, 0x4fd2, 0x4fd3, 0x4fd4, 0x4fd5, 0x4fd6,
+  0x4fd9, 0x4fdb, 0x4fe0, 0x4fe2, 0x4fe4, 0x4fe5, 0x4fe7, 0x4feb,
+  0x4fec, 0x4ff0, 0x4ff2, 0x4ff4, 0x4ff5, 0x4ff6, 0x4ff7, 0x4ff9,
+  0x4ffb, 0x4ffc, 0x4ffd, 0x4fff, 0x5000, 0x5001, 0x5002, 0x5003,
+  0x5004, 0x5005, 0x5006, 0x5007, 0x5008, 0x5009, 0x500a, 0x500b,
+  0x500e, 0x5010, 0x5011, 0x5013, 0x5015, 0x5016, 0x5017, 0x501b,
+  0x501d, 0x501e, 0x5020, 0x5022, 0x5023, 0x5024, 0x5027, 0x502b,
+  0x502f, 0x5030, 0x5031, 0x5032, 0x5033, 0x5034, 0x5035, 0x5036,
+  0x5037, 0x5038, 0x5039, 0x503b, 0x503d, 0x503f, 0x5040, 0x5041,
+  0x5042, 0x5044, 0x5045, 0x5046, 0x5049, 0x504a, 0x504b, 0x504d,
+  0x5050, 0x5051, 0x5052, 0x5053, 0x5054, 0x5056, 0x5057, 0x5058,
+  0x5059, 0x505b, 0x505d, 0x505e, 0x505f, 0x5060, 0x5061, 0x5062,
+  0x5063, 0x5064, 0x5066, 0x5067, 0x5068, 0x5069, 0x506a, 0x506b,
+  0x506d, 0x506e, 0x506f, 0x5070, 0x5071, 0x5072, 0x5073, 0x5074,
+  0x5075, 0x5078, 0x5079, 0x507a, 0x507c, 0x507d, 0x5081, 0x5082,
+  0x5083, 0x5084, 0x5086, 0x5087, 0x5089, 0x508a, 0x508b, 0x508c,
+  0x508e, 0x508f, 0x5090, 0x5091, 0x5092, 0x5093, 0x5094, 0x5095,
+  0x5096, 0x5097, 0x5098, 0x5099, 0x509a, 0x509b, 0x509c, 0x509d,
+  0x509e, 0x509f, 0x50a0, 0x50a1, 0x50a2, 0x50a4, 0x50a6, 0x50aa,
+  0x50ab, 0x50ad, 0x50ae, 0x50af, 0x50b0, 0x50b1, 0x50b3, 0x50b4,
+  0x50b5, 0x50b6, 0x50b7, 0x50b8, 0x50b9, 0x50bc,
+  /* 0x83 */
+  0x50bd, 0x50be, 0x50bf, 0x50c0, 0x50c1, 0x50c2, 0x50c3, 0x50c4,
+  0x50c5, 0x50c6, 0x50c7, 0x50c8, 0x50c9, 0x50ca, 0x50cb, 0x50cc,
+  0x50cd, 0x50ce, 0x50d0, 0x50d1, 0x50d2, 0x50d3, 0x50d4, 0x50d5,
+  0x50d7, 0x50d8, 0x50d9, 0x50db, 0x50dc, 0x50dd, 0x50de, 0x50df,
+  0x50e0, 0x50e1, 0x50e2, 0x50e3, 0x50e4, 0x50e5, 0x50e8, 0x50e9,
+  0x50ea, 0x50eb, 0x50ef, 0x50f0, 0x50f1, 0x50f2, 0x50f4, 0x50f6,
+  0x50f7, 0x50f8, 0x50f9, 0x50fa, 0x50fc, 0x50fd, 0x50fe, 0x50ff,
+  0x5100, 0x5101, 0x5102, 0x5103, 0x5104, 0x5105, 0x5108, 0x5109,
+  0x510a, 0x510c, 0x510d, 0x510e, 0x510f, 0x5110, 0x5111, 0x5113,
+  0x5114, 0x5115, 0x5116, 0x5117, 0x5118, 0x5119, 0x511a, 0x511b,
+  0x511c, 0x511d, 0x511e, 0x511f, 0x5120, 0x5122, 0x5123, 0x5124,
+  0x5125, 0x5126, 0x5127, 0x5128, 0x5129, 0x512a, 0x512b, 0x512c,
+  0x512d, 0x512e, 0x512f, 0x5130, 0x5131, 0x5132, 0x5133, 0x5134,
+  0x5135, 0x5136, 0x5137, 0x5138, 0x5139, 0x513a, 0x513b, 0x513c,
+  0x513d, 0x513e, 0x5142, 0x5147, 0x514a, 0x514c, 0x514e, 0x514f,
+  0x5150, 0x5152, 0x5153, 0x5157, 0x5158, 0x5159, 0x515b, 0x515d,
+  0x515e, 0x515f, 0x5160, 0x5161, 0x5163, 0x5164, 0x5166, 0x5167,
+  0x5169, 0x516a, 0x516f, 0x5172, 0x517a, 0x517e, 0x517f, 0x5183,
+  0x5184, 0x5186, 0x5187, 0x518a, 0x518b, 0x518e, 0x518f, 0x5190,
+  0x5191, 0x5193, 0x5194, 0x5198, 0x519a, 0x519d, 0x519e, 0x519f,
+  0x51a1, 0x51a3, 0x51a6, 0x51a7, 0x51a8, 0x51a9, 0x51aa, 0x51ad,
+  0x51ae, 0x51b4, 0x51b8, 0x51b9, 0x51ba, 0x51be, 0x51bf, 0x51c1,
+  0x51c2, 0x51c3, 0x51c5, 0x51c8, 0x51ca, 0x51cd, 0x51ce, 0x51d0,
+  0x51d2, 0x51d3, 0x51d4, 0x51d5, 0x51d6, 0x51d7,
+  /* 0x84 */
+  0x51d8, 0x51d9, 0x51da, 0x51dc, 0x51de, 0x51df, 0x51e2, 0x51e3,
+  0x51e5, 0x51e6, 0x51e7, 0x51e8, 0x51e9, 0x51ea, 0x51ec, 0x51ee,
+  0x51f1, 0x51f2, 0x51f4, 0x51f7, 0x51fe, 0x5204, 0x5205, 0x5209,
+  0x520b, 0x520c, 0x520f, 0x5210, 0x5213, 0x5214, 0x5215, 0x521c,
+  0x521e, 0x521f, 0x5221, 0x5222, 0x5223, 0x5225, 0x5226, 0x5227,
+  0x522a, 0x522c, 0x522f, 0x5231, 0x5232, 0x5234, 0x5235, 0x523c,
+  0x523e, 0x5244, 0x5245, 0x5246, 0x5247, 0x5248, 0x5249, 0x524b,
+  0x524e, 0x524f, 0x5252, 0x5253, 0x5255, 0x5257, 0x5258, 0x5259,
+  0x525a, 0x525b, 0x525d, 0x525f, 0x5260, 0x5262, 0x5263, 0x5264,
+  0x5266, 0x5268, 0x526b, 0x526c, 0x526d, 0x526e, 0x5270, 0x5271,
+  0x5273, 0x5274, 0x5275, 0x5276, 0x5277, 0x5278, 0x5279, 0x527a,
+  0x527b, 0x527c, 0x527e, 0x5280, 0x5283, 0x5284, 0x5285, 0x5286,
+  0x5287, 0x5289, 0x528a, 0x528b, 0x528c, 0x528d, 0x528e, 0x528f,
+  0x5291, 0x5292, 0x5294, 0x5295, 0x5296, 0x5297, 0x5298, 0x5299,
+  0x529a, 0x529c, 0x52a4, 0x52a5, 0x52a6, 0x52a7, 0x52ae, 0x52af,
+  0x52b0, 0x52b4, 0x52b5, 0x52b6, 0x52b7, 0x52b8, 0x52b9, 0x52ba,
+  0x52bb, 0x52bc, 0x52bd, 0x52c0, 0x52c1, 0x52c2, 0x52c4, 0x52c5,
+  0x52c6, 0x52c8, 0x52ca, 0x52cc, 0x52cd, 0x52ce, 0x52cf, 0x52d1,
+  0x52d3, 0x52d4, 0x52d5, 0x52d7, 0x52d9, 0x52da, 0x52db, 0x52dc,
+  0x52dd, 0x52de, 0x52e0, 0x52e1, 0x52e2, 0x52e3, 0x52e5, 0x52e6,
+  0x52e7, 0x52e8, 0x52e9, 0x52ea, 0x52eb, 0x52ec, 0x52ed, 0x52ee,
+  0x52ef, 0x52f1, 0x52f2, 0x52f3, 0x52f4, 0x52f5, 0x52f6, 0x52f7,
+  0x52f8, 0x52fb, 0x52fc, 0x52fd, 0x5301, 0x5302, 0x5303, 0x5304,
+  0x5307, 0x5309, 0x530a, 0x530b, 0x530c, 0x530e,
+  /* 0x85 */
+  0x5311, 0x5312, 0x5313, 0x5314, 0x5318, 0x531b, 0x531c, 0x531e,
+  0x531f, 0x5322, 0x5324, 0x5325, 0x5327, 0x5328, 0x5329, 0x532b,
+  0x532c, 0x532d, 0x532f, 0x5330, 0x5331, 0x5332, 0x5333, 0x5334,
+  0x5335, 0x5336, 0x5337, 0x5338, 0x533c, 0x533d, 0x5340, 0x5342,
+  0x5344, 0x5346, 0x534b, 0x534c, 0x534d, 0x5350, 0x5354, 0x5358,
+  0x5359, 0x535b, 0x535d, 0x5365, 0x5368, 0x536a, 0x536c, 0x536d,
+  0x5372, 0x5376, 0x5379, 0x537b, 0x537c, 0x537d, 0x537e, 0x5380,
+  0x5381, 0x5383, 0x5387, 0x5388, 0x538a, 0x538e, 0x538f, 0x5390,
+  0x5391, 0x5392, 0x5393, 0x5394, 0x5396, 0x5397, 0x5399, 0x539b,
+  0x539c, 0x539e, 0x53a0, 0x53a1, 0x53a4, 0x53a7, 0x53aa, 0x53ab,
+  0x53ac, 0x53ad, 0x53af, 0x53b0, 0x53b1, 0x53b2, 0x53b3, 0x53b4,
+  0x53b5, 0x53b7, 0x53b8, 0x53b9, 0x53ba, 0x53bc, 0x53bd, 0x53be,
+  0x53c0, 0x53c3, 0x53c4, 0x53c5, 0x53c6, 0x53c7, 0x53ce, 0x53cf,
+  0x53d0, 0x53d2, 0x53d3, 0x53d5, 0x53da, 0x53dc, 0x53dd, 0x53de,
+  0x53e1, 0x53e2, 0x53e7, 0x53f4, 0x53fa, 0x53fe, 0x53ff, 0x5400,
+  0x5402, 0x5405, 0x5407, 0x540b, 0x5414, 0x5418, 0x5419, 0x541a,
+  0x541c, 0x5422, 0x5424, 0x5425, 0x542a, 0x5430, 0x5433, 0x5436,
+  0x5437, 0x543a, 0x543d, 0x543f, 0x5441, 0x5442, 0x5444, 0x5445,
+  0x5447, 0x5449, 0x544c, 0x544d, 0x544e, 0x544f, 0x5451, 0x545a,
+  0x545d, 0x545e, 0x545f, 0x5460, 0x5461, 0x5463, 0x5465, 0x5467,
+  0x5469, 0x546a, 0x546b, 0x546c, 0x546d, 0x546e, 0x546f, 0x5470,
+  0x5474, 0x5479, 0x547a, 0x547e, 0x547f, 0x5481, 0x5483, 0x5485,
+  0x5487, 0x5488, 0x5489, 0x548a, 0x548d, 0x5491, 0x5493, 0x5497,
+  0x5498, 0x549c, 0x549e, 0x549f, 0x54a0, 0x54a1,
+  /* 0x86 */
+  0x54a2, 0x54a5, 0x54ae, 0x54b0, 0x54b2, 0x54b5, 0x54b6, 0x54b7,
+  0x54b9, 0x54ba, 0x54bc, 0x54be, 0x54c3, 0x54c5, 0x54ca, 0x54cb,
+  0x54d6, 0x54d8, 0x54db, 0x54e0, 0x54e1, 0x54e2, 0x54e3, 0x54e4,
+  0x54eb, 0x54ec, 0x54ef, 0x54f0, 0x54f1, 0x54f4, 0x54f5, 0x54f6,
+  0x54f7, 0x54f8, 0x54f9, 0x54fb, 0x54fe, 0x5500, 0x5502, 0x5503,
+  0x5504, 0x5505, 0x5508, 0x550a, 0x550b, 0x550c, 0x550d, 0x550e,
+  0x5512, 0x5513, 0x5515, 0x5516, 0x5517, 0x5518, 0x5519, 0x551a,
+  0x551c, 0x551d, 0x551e, 0x551f, 0x5521, 0x5525, 0x5526, 0x5528,
+  0x5529, 0x552b, 0x552d, 0x5532, 0x5534, 0x5535, 0x5536, 0x5538,
+  0x5539, 0x553a, 0x553b, 0x553d, 0x5540, 0x5542, 0x5545, 0x5547,
+  0x5548, 0x554b, 0x554c, 0x554d, 0x554e, 0x554f, 0x5551, 0x5552,
+  0x5553, 0x5554, 0x5557, 0x5558, 0x5559, 0x555a, 0x555b, 0x555d,
+  0x555e, 0x555f, 0x5560, 0x5562, 0x5563, 0x5568, 0x5569, 0x556b,
+  0x556f, 0x5570, 0x5571, 0x5572, 0x5573, 0x5574, 0x5579, 0x557a,
+  0x557d, 0x557f, 0x5585, 0x5586, 0x558c, 0x558d, 0x558e, 0x5590,
+  0x5592, 0x5593, 0x5595, 0x5596, 0x5597, 0x559a, 0x559b, 0x559e,
+  0x55a0, 0x55a1, 0x55a2, 0x55a3, 0x55a4, 0x55a5, 0x55a6, 0x55a8,
+  0x55a9, 0x55aa, 0x55ab, 0x55ac, 0x55ad, 0x55ae, 0x55af, 0x55b0,
+  0x55b2, 0x55b4, 0x55b6, 0x55b8, 0x55ba, 0x55bc, 0x55bf, 0x55c0,
+  0x55c1, 0x55c2, 0x55c3, 0x55c6, 0x55c7, 0x55c8, 0x55ca, 0x55cb,
+  0x55ce, 0x55cf, 0x55d0, 0x55d5, 0x55d7, 0x55d8, 0x55d9, 0x55da,
+  0x55db, 0x55de, 0x55e0, 0x55e2, 0x55e7, 0x55e9, 0x55ed, 0x55ee,
+  0x55f0, 0x55f1, 0x55f4, 0x55f6, 0x55f8, 0x55f9, 0x55fa, 0x55fb,
+  0x55fc, 0x55ff, 0x5602, 0x5603, 0x5604, 0x5605,
+  /* 0x87 */
+  0x5606, 0x5607, 0x560a, 0x560b, 0x560d, 0x5610, 0x5611, 0x5612,
+  0x5613, 0x5614, 0x5615, 0x5616, 0x5617, 0x5619, 0x561a, 0x561c,
+  0x561d, 0x5620, 0x5621, 0x5622, 0x5625, 0x5626, 0x5628, 0x5629,
+  0x562a, 0x562b, 0x562e, 0x562f, 0x5630, 0x5633, 0x5635, 0x5637,
+  0x5638, 0x563a, 0x563c, 0x563d, 0x563e, 0x5640, 0x5641, 0x5642,
+  0x5643, 0x5644, 0x5645, 0x5646, 0x5647, 0x5648, 0x5649, 0x564a,
+  0x564b, 0x564f, 0x5650, 0x5651, 0x5652, 0x5653, 0x5655, 0x5656,
+  0x565a, 0x565b, 0x565d, 0x565e, 0x565f, 0x5660, 0x5661, 0x5663,
+  0x5665, 0x5666, 0x5667, 0x566d, 0x566e, 0x566f, 0x5670, 0x5672,
+  0x5673, 0x5674, 0x5675, 0x5677, 0x5678, 0x5679, 0x567a, 0x567d,
+  0x567e, 0x567f, 0x5680, 0x5681, 0x5682, 0x5683, 0x5684, 0x5687,
+  0x5688, 0x5689, 0x568a, 0x568b, 0x568c, 0x568d, 0x5690, 0x5691,
+  0x5692, 0x5694, 0x5695, 0x5696, 0x5697, 0x5698, 0x5699, 0x569a,
+  0x569b, 0x569c, 0x569d, 0x569e, 0x569f, 0x56a0, 0x56a1, 0x56a2,
+  0x56a4, 0x56a5, 0x56a6, 0x56a7, 0x56a8, 0x56a9, 0x56aa, 0x56ab,
+  0x56ac, 0x56ad, 0x56ae, 0x56b0, 0x56b1, 0x56b2, 0x56b3, 0x56b4,
+  0x56b5, 0x56b6, 0x56b8, 0x56b9, 0x56ba, 0x56bb, 0x56bd, 0x56be,
+  0x56bf, 0x56c0, 0x56c1, 0x56c2, 0x56c3, 0x56c4, 0x56c5, 0x56c6,
+  0x56c7, 0x56c8, 0x56c9, 0x56cb, 0x56cc, 0x56cd, 0x56ce, 0x56cf,
+  0x56d0, 0x56d1, 0x56d2, 0x56d3, 0x56d5, 0x56d6, 0x56d8, 0x56d9,
+  0x56dc, 0x56e3, 0x56e5, 0x56e6, 0x56e7, 0x56e8, 0x56e9, 0x56ea,
+  0x56ec, 0x56ee, 0x56ef, 0x56f2, 0x56f3, 0x56f6, 0x56f7, 0x56f8,
+  0x56fb, 0x56fc, 0x5700, 0x5701, 0x5702, 0x5705, 0x5707, 0x570b,
+  0x570c, 0x570d, 0x570e, 0x570f, 0x5710, 0x5711,
+  /* 0x88 */
+  0x5712, 0x5713, 0x5714, 0x5715, 0x5716, 0x5717, 0x5718, 0x5719,
+  0x571a, 0x571b, 0x571d, 0x571e, 0x5720, 0x5721, 0x5722, 0x5724,
+  0x5725, 0x5726, 0x5727, 0x572b, 0x5731, 0x5732, 0x5734, 0x5735,
+  0x5736, 0x5737, 0x5738, 0x573c, 0x573d, 0x573f, 0x5741, 0x5743,
+  0x5744, 0x5745, 0x5746, 0x5748, 0x5749, 0x574b, 0x5752, 0x5753,
+  0x5754, 0x5755, 0x5756, 0x5758, 0x5759, 0x5762, 0x5763, 0x5765,
+  0x5767, 0x576c, 0x576e, 0x5770, 0x5771, 0x5772, 0x5774, 0x5775,
+  0x5778, 0x5779, 0x577a, 0x577d, 0x577e, 0x577f, 0x5780, 0x5781,
+  0x5787, 0x5788, 0x5789, 0x578a, 0x578d, 0x578e, 0x578f, 0x5790,
+  0x5791, 0x5794, 0x5795, 0x5796, 0x5797, 0x5798, 0x5799, 0x579a,
+  0x579c, 0x579d, 0x579e, 0x579f, 0x57a5, 0x57a8, 0x57aa, 0x57ac,
+  0x57af, 0x57b0, 0x57b1, 0x57b3, 0x57b5, 0x57b6, 0x57b7, 0x57b9,
+  0x57ba, 0x57bb, 0x57bc, 0x57bd, 0x57be, 0x57bf, 0x57c0, 0x57c1,
+  0x57c4, 0x57c5, 0x57c6, 0x57c7, 0x57c8, 0x57c9, 0x57ca, 0x57cc,
+  0x57cd, 0x57d0, 0x57d1, 0x57d3, 0x57d6, 0x57d7, 0x57db, 0x57dc,
+  0x57de, 0x57e1, 0x57e2, 0x57e3, 0x57e5, 0x57e6, 0x57e7, 0x57e8,
+  0x57e9, 0x57ea, 0x57eb, 0x57ec, 0x57ee, 0x57f0, 0x57f1, 0x57f2,
+  0x57f3, 0x57f5, 0x57f6, 0x57f7, 0x57fb, 0x57fc, 0x57fe, 0x57ff,
+  0x5801, 0x5803, 0x5804, 0x5805, 0x5808, 0x5809, 0x580a, 0x580c,
+  0x580e, 0x580f, 0x5810, 0x5812, 0x5813, 0x5814, 0x5816, 0x5817,
+  0x5818, 0x581a, 0x581b, 0x581c, 0x581d, 0x581f, 0x5822, 0x5823,
+  0x5825, 0x5826, 0x5827, 0x5828, 0x5829, 0x582b, 0x582c, 0x582d,
+  0x582e, 0x582f, 0x5831, 0x5832, 0x5833, 0x5834, 0x5836, 0x5837,
+  0x5838, 0x5839, 0x583a, 0x583b, 0x583c, 0x583d,
+  /* 0x89 */
+  0x583e, 0x583f, 0x5840, 0x5841, 0x5842, 0x5843, 0x5845, 0x5846,
+  0x5847, 0x5848, 0x5849, 0x584a, 0x584b, 0x584e, 0x584f, 0x5850,
+  0x5852, 0x5853, 0x5855, 0x5856, 0x5857, 0x5859, 0x585a, 0x585b,
+  0x585c, 0x585d, 0x585f, 0x5860, 0x5861, 0x5862, 0x5863, 0x5864,
+  0x5866, 0x5867, 0x5868, 0x5869, 0x586a, 0x586d, 0x586e, 0x586f,
+  0x5870, 0x5871, 0x5872, 0x5873, 0x5874, 0x5875, 0x5876, 0x5877,
+  0x5878, 0x5879, 0x587a, 0x587b, 0x587c, 0x587d, 0x587f, 0x5882,
+  0x5884, 0x5886, 0x5887, 0x5888, 0x588a, 0x588b, 0x588c, 0x588d,
+  0x588e, 0x588f, 0x5890, 0x5891, 0x5894, 0x5895, 0x5896, 0x5897,
+  0x5898, 0x589b, 0x589c, 0x589d, 0x58a0, 0x58a1, 0x58a2, 0x58a3,
+  0x58a4, 0x58a5, 0x58a6, 0x58a7, 0x58aa, 0x58ab, 0x58ac, 0x58ad,
+  0x58ae, 0x58af, 0x58b0, 0x58b1, 0x58b2, 0x58b3, 0x58b4, 0x58b5,
+  0x58b6, 0x58b7, 0x58b8, 0x58b9, 0x58ba, 0x58bb, 0x58bd, 0x58be,
+  0x58bf, 0x58c0, 0x58c2, 0x58c3, 0x58c4, 0x58c6, 0x58c7, 0x58c8,
+  0x58c9, 0x58ca, 0x58cb, 0x58cc, 0x58cd, 0x58ce, 0x58cf, 0x58d0,
+  0x58d2, 0x58d3, 0x58d4, 0x58d6, 0x58d7, 0x58d8, 0x58d9, 0x58da,
+  0x58db, 0x58dc, 0x58dd, 0x58de, 0x58df, 0x58e0, 0x58e1, 0x58e2,
+  0x58e3, 0x58e5, 0x58e6, 0x58e7, 0x58e8, 0x58e9, 0x58ea, 0x58ed,
+  0x58ef, 0x58f1, 0x58f2, 0x58f4, 0x58f5, 0x58f7, 0x58f8, 0x58fa,
+  0x58fb, 0x58fc, 0x58fd, 0x58fe, 0x58ff, 0x5900, 0x5901, 0x5903,
+  0x5905, 0x5906, 0x5908, 0x5909, 0x590a, 0x590b, 0x590c, 0x590e,
+  0x5910, 0x5911, 0x5912, 0x5913, 0x5917, 0x5918, 0x591b, 0x591d,
+  0x591e, 0x5920, 0x5921, 0x5922, 0x5923, 0x5926, 0x5928, 0x592c,
+  0x5930, 0x5932, 0x5933, 0x5935, 0x5936, 0x593b,
+  /* 0x8a */
+  0x593d, 0x593e, 0x593f, 0x5940, 0x5943, 0x5945, 0x5946, 0x594a,
+  0x594c, 0x594d, 0x5950, 0x5952, 0x5953, 0x5959, 0x595b, 0x595c,
+  0x595d, 0x595e, 0x595f, 0x5961, 0x5963, 0x5964, 0x5966, 0x5967,
+  0x5968, 0x5969, 0x596a, 0x596b, 0x596c, 0x596d, 0x596e, 0x596f,
+  0x5970, 0x5971, 0x5972, 0x5975, 0x5977, 0x597a, 0x597b, 0x597c,
+  0x597e, 0x597f, 0x5980, 0x5985, 0x5989, 0x598b, 0x598c, 0x598e,
+  0x598f, 0x5990, 0x5991, 0x5994, 0x5995, 0x5998, 0x599a, 0x599b,
+  0x599c, 0x599d, 0x599f, 0x59a0, 0x59a1, 0x59a2, 0x59a6, 0x59a7,
+  0x59ac, 0x59ad, 0x59b0, 0x59b1, 0x59b3, 0x59b4, 0x59b5, 0x59b6,
+  0x59b7, 0x59b8, 0x59ba, 0x59bc, 0x59bd, 0x59bf, 0x59c0, 0x59c1,
+  0x59c2, 0x59c3, 0x59c4, 0x59c5, 0x59c7, 0x59c8, 0x59c9, 0x59cc,
+  0x59cd, 0x59ce, 0x59cf, 0x59d5, 0x59d6, 0x59d9, 0x59db, 0x59de,
+  0x59df, 0x59e0, 0x59e1, 0x59e2, 0x59e4, 0x59e6, 0x59e7, 0x59e9,
+  0x59ea, 0x59eb, 0x59ed, 0x59ee, 0x59ef, 0x59f0, 0x59f1, 0x59f2,
+  0x59f3, 0x59f4, 0x59f5, 0x59f6, 0x59f7, 0x59f8, 0x59fa, 0x59fc,
+  0x59fd, 0x59fe, 0x5a00, 0x5a02, 0x5a0a, 0x5a0b, 0x5a0d, 0x5a0e,
+  0x5a0f, 0x5a10, 0x5a12, 0x5a14, 0x5a15, 0x5a16, 0x5a17, 0x5a19,
+  0x5a1a, 0x5a1b, 0x5a1d, 0x5a1e, 0x5a21, 0x5a22, 0x5a24, 0x5a26,
+  0x5a27, 0x5a28, 0x5a2a, 0x5a2b, 0x5a2c, 0x5a2d, 0x5a2e, 0x5a2f,
+  0x5a30, 0x5a33, 0x5a35, 0x5a37, 0x5a38, 0x5a39, 0x5a3a, 0x5a3b,
+  0x5a3d, 0x5a3e, 0x5a3f, 0x5a41, 0x5a42, 0x5a43, 0x5a44, 0x5a45,
+  0x5a47, 0x5a48, 0x5a4b, 0x5a4c, 0x5a4d, 0x5a4e, 0x5a4f, 0x5a50,
+  0x5a51, 0x5a52, 0x5a53, 0x5a54, 0x5a56, 0x5a57, 0x5a58, 0x5a59,
+  0x5a5b, 0x5a5c, 0x5a5d, 0x5a5e, 0x5a5f, 0x5a60,
+  /* 0x8b */
+  0x5a61, 0x5a63, 0x5a64, 0x5a65, 0x5a66, 0x5a68, 0x5a69, 0x5a6b,
+  0x5a6c, 0x5a6d, 0x5a6e, 0x5a6f, 0x5a70, 0x5a71, 0x5a72, 0x5a73,
+  0x5a78, 0x5a79, 0x5a7b, 0x5a7c, 0x5a7d, 0x5a7e, 0x5a80, 0x5a81,
+  0x5a82, 0x5a83, 0x5a84, 0x5a85, 0x5a86, 0x5a87, 0x5a88, 0x5a89,
+  0x5a8a, 0x5a8b, 0x5a8c, 0x5a8d, 0x5a8e, 0x5a8f, 0x5a90, 0x5a91,
+  0x5a93, 0x5a94, 0x5a95, 0x5a96, 0x5a97, 0x5a98, 0x5a99, 0x5a9c,
+  0x5a9d, 0x5a9e, 0x5a9f, 0x5aa0, 0x5aa1, 0x5aa2, 0x5aa3, 0x5aa4,
+  0x5aa5, 0x5aa6, 0x5aa7, 0x5aa8, 0x5aa9, 0x5aab, 0x5aac, 0x5aad,
+  0x5aae, 0x5aaf, 0x5ab0, 0x5ab1, 0x5ab4, 0x5ab6, 0x5ab7, 0x5ab9,
+  0x5aba, 0x5abb, 0x5abc, 0x5abd, 0x5abf, 0x5ac0, 0x5ac3, 0x5ac4,
+  0x5ac5, 0x5ac6, 0x5ac7, 0x5ac8, 0x5aca, 0x5acb, 0x5acd, 0x5ace,
+  0x5acf, 0x5ad0, 0x5ad1, 0x5ad3, 0x5ad5, 0x5ad7, 0x5ad9, 0x5ada,
+  0x5adb, 0x5add, 0x5ade, 0x5adf, 0x5ae2, 0x5ae4, 0x5ae5, 0x5ae7,
+  0x5ae8, 0x5aea, 0x5aec, 0x5aed, 0x5aee, 0x5aef, 0x5af0, 0x5af2,
+  0x5af3, 0x5af4, 0x5af5, 0x5af6, 0x5af7, 0x5af8, 0x5af9, 0x5afa,
+  0x5afb, 0x5afc, 0x5afd, 0x5afe, 0x5aff, 0x5b00, 0x5b01, 0x5b02,
+  0x5b03, 0x5b04, 0x5b05, 0x5b06, 0x5b07, 0x5b08, 0x5b0a, 0x5b0b,
+  0x5b0c, 0x5b0d, 0x5b0e, 0x5b0f, 0x5b10, 0x5b11, 0x5b12, 0x5b13,
+  0x5b14, 0x5b15, 0x5b18, 0x5b19, 0x5b1a, 0x5b1b, 0x5b1c, 0x5b1d,
+  0x5b1e, 0x5b1f, 0x5b20, 0x5b21, 0x5b22, 0x5b23, 0x5b24, 0x5b25,
+  0x5b26, 0x5b27, 0x5b28, 0x5b29, 0x5b2a, 0x5b2b, 0x5b2c, 0x5b2d,
+  0x5b2e, 0x5b2f, 0x5b30, 0x5b31, 0x5b33, 0x5b35, 0x5b36, 0x5b38,
+  0x5b39, 0x5b3a, 0x5b3b, 0x5b3c, 0x5b3d, 0x5b3e, 0x5b3f, 0x5b41,
+  0x5b42, 0x5b43, 0x5b44, 0x5b45, 0x5b46, 0x5b47,
+  /* 0x8c */
+  0x5b48, 0x5b49, 0x5b4a, 0x5b4b, 0x5b4c, 0x5b4d, 0x5b4e, 0x5b4f,
+  0x5b52, 0x5b56, 0x5b5e, 0x5b60, 0x5b61, 0x5b67, 0x5b68, 0x5b6b,
+  0x5b6d, 0x5b6e, 0x5b6f, 0x5b72, 0x5b74, 0x5b76, 0x5b77, 0x5b78,
+  0x5b79, 0x5b7b, 0x5b7c, 0x5b7e, 0x5b7f, 0x5b82, 0x5b86, 0x5b8a,
+  0x5b8d, 0x5b8e, 0x5b90, 0x5b91, 0x5b92, 0x5b94, 0x5b96, 0x5b9f,
+  0x5ba7, 0x5ba8, 0x5ba9, 0x5bac, 0x5bad, 0x5bae, 0x5baf, 0x5bb1,
+  0x5bb2, 0x5bb7, 0x5bba, 0x5bbb, 0x5bbc, 0x5bc0, 0x5bc1, 0x5bc3,
+  0x5bc8, 0x5bc9, 0x5bca, 0x5bcb, 0x5bcd, 0x5bce, 0x5bcf, 0x5bd1,
+  0x5bd4, 0x5bd5, 0x5bd6, 0x5bd7, 0x5bd8, 0x5bd9, 0x5bda, 0x5bdb,
+  0x5bdc, 0x5be0, 0x5be2, 0x5be3, 0x5be6, 0x5be7, 0x5be9, 0x5bea,
+  0x5beb, 0x5bec, 0x5bed, 0x5bef, 0x5bf1, 0x5bf2, 0x5bf3, 0x5bf4,
+  0x5bf5, 0x5bf6, 0x5bf7, 0x5bfd, 0x5bfe, 0x5c00, 0x5c02, 0x5c03,
+  0x5c05, 0x5c07, 0x5c08, 0x5c0b, 0x5c0c, 0x5c0d, 0x5c0e, 0x5c10,
+  0x5c12, 0x5c13, 0x5c17, 0x5c19, 0x5c1b, 0x5c1e, 0x5c1f, 0x5c20,
+  0x5c21, 0x5c23, 0x5c26, 0x5c28, 0x5c29, 0x5c2a, 0x5c2b, 0x5c2d,
+  0x5c2e, 0x5c2f, 0x5c30, 0x5c32, 0x5c33, 0x5c35, 0x5c36, 0x5c37,
+  0x5c43, 0x5c44, 0x5c46, 0x5c47, 0x5c4c, 0x5c4d, 0x5c52, 0x5c53,
+  0x5c54, 0x5c56, 0x5c57, 0x5c58, 0x5c5a, 0x5c5b, 0x5c5c, 0x5c5d,
+  0x5c5f, 0x5c62, 0x5c64, 0x5c67, 0x5c68, 0x5c69, 0x5c6a, 0x5c6b,
+  0x5c6c, 0x5c6d, 0x5c70, 0x5c72, 0x5c73, 0x5c74, 0x5c75, 0x5c76,
+  0x5c77, 0x5c78, 0x5c7b, 0x5c7c, 0x5c7d, 0x5c7e, 0x5c80, 0x5c83,
+  0x5c84, 0x5c85, 0x5c86, 0x5c87, 0x5c89, 0x5c8a, 0x5c8b, 0x5c8e,
+  0x5c8f, 0x5c92, 0x5c93, 0x5c95, 0x5c9d, 0x5c9e, 0x5c9f, 0x5ca0,
+  0x5ca1, 0x5ca4, 0x5ca5, 0x5ca6, 0x5ca7, 0x5ca8,
+  /* 0x8d */
+  0x5caa, 0x5cae, 0x5caf, 0x5cb0, 0x5cb2, 0x5cb4, 0x5cb6, 0x5cb9,
+  0x5cba, 0x5cbb, 0x5cbc, 0x5cbe, 0x5cc0, 0x5cc2, 0x5cc3, 0x5cc5,
+  0x5cc6, 0x5cc7, 0x5cc8, 0x5cc9, 0x5cca, 0x5ccc, 0x5ccd, 0x5cce,
+  0x5ccf, 0x5cd0, 0x5cd1, 0x5cd3, 0x5cd4, 0x5cd5, 0x5cd6, 0x5cd7,
+  0x5cd8, 0x5cda, 0x5cdb, 0x5cdc, 0x5cdd, 0x5cde, 0x5cdf, 0x5ce0,
+  0x5ce2, 0x5ce3, 0x5ce7, 0x5ce9, 0x5ceb, 0x5cec, 0x5cee, 0x5cef,
+  0x5cf1, 0x5cf2, 0x5cf3, 0x5cf4, 0x5cf5, 0x5cf6, 0x5cf7, 0x5cf8,
+  0x5cf9, 0x5cfa, 0x5cfc, 0x5cfd, 0x5cfe, 0x5cff, 0x5d00, 0x5d01,
+  0x5d04, 0x5d05, 0x5d08, 0x5d09, 0x5d0a, 0x5d0b, 0x5d0c, 0x5d0d,
+  0x5d0f, 0x5d10, 0x5d11, 0x5d12, 0x5d13, 0x5d15, 0x5d17, 0x5d18,
+  0x5d19, 0x5d1a, 0x5d1c, 0x5d1d, 0x5d1f, 0x5d20, 0x5d21, 0x5d22,
+  0x5d23, 0x5d25, 0x5d28, 0x5d2a, 0x5d2b, 0x5d2c, 0x5d2f, 0x5d30,
+  0x5d31, 0x5d32, 0x5d33, 0x5d35, 0x5d36, 0x5d37, 0x5d38, 0x5d39,
+  0x5d3a, 0x5d3b, 0x5d3c, 0x5d3f, 0x5d40, 0x5d41, 0x5d42, 0x5d43,
+  0x5d44, 0x5d45, 0x5d46, 0x5d48, 0x5d49, 0x5d4d, 0x5d4e, 0x5d4f,
+  0x5d50, 0x5d51, 0x5d52, 0x5d53, 0x5d54, 0x5d55, 0x5d56, 0x5d57,
+  0x5d59, 0x5d5a, 0x5d5c, 0x5d5e, 0x5d5f, 0x5d60, 0x5d61, 0x5d62,
+  0x5d63, 0x5d64, 0x5d65, 0x5d66, 0x5d67, 0x5d68, 0x5d6a, 0x5d6d,
+  0x5d6e, 0x5d70, 0x5d71, 0x5d72, 0x5d73, 0x5d75, 0x5d76, 0x5d77,
+  0x5d78, 0x5d79, 0x5d7a, 0x5d7b, 0x5d7c, 0x5d7d, 0x5d7e, 0x5d7f,
+  0x5d80, 0x5d81, 0x5d83, 0x5d84, 0x5d85, 0x5d86, 0x5d87, 0x5d88,
+  0x5d89, 0x5d8a, 0x5d8b, 0x5d8c, 0x5d8d, 0x5d8e, 0x5d8f, 0x5d90,
+  0x5d91, 0x5d92, 0x5d93, 0x5d94, 0x5d95, 0x5d96, 0x5d97, 0x5d98,
+  0x5d9a, 0x5d9b, 0x5d9c, 0x5d9e, 0x5d9f, 0x5da0,
+  /* 0x8e */
+  0x5da1, 0x5da2, 0x5da3, 0x5da4, 0x5da5, 0x5da6, 0x5da7, 0x5da8,
+  0x5da9, 0x5daa, 0x5dab, 0x5dac, 0x5dad, 0x5dae, 0x5daf, 0x5db0,
+  0x5db1, 0x5db2, 0x5db3, 0x5db4, 0x5db5, 0x5db6, 0x5db8, 0x5db9,
+  0x5dba, 0x5dbb, 0x5dbc, 0x5dbd, 0x5dbe, 0x5dbf, 0x5dc0, 0x5dc1,
+  0x5dc2, 0x5dc3, 0x5dc4, 0x5dc6, 0x5dc7, 0x5dc8, 0x5dc9, 0x5dca,
+  0x5dcb, 0x5dcc, 0x5dce, 0x5dcf, 0x5dd0, 0x5dd1, 0x5dd2, 0x5dd3,
+  0x5dd4, 0x5dd5, 0x5dd6, 0x5dd7, 0x5dd8, 0x5dd9, 0x5dda, 0x5ddc,
+  0x5ddf, 0x5de0, 0x5de3, 0x5de4, 0x5dea, 0x5dec, 0x5ded, 0x5df0,
+  0x5df5, 0x5df6, 0x5df8, 0x5df9, 0x5dfa, 0x5dfb, 0x5dfc, 0x5dff,
+  0x5e00, 0x5e04, 0x5e07, 0x5e09, 0x5e0a, 0x5e0b, 0x5e0d, 0x5e0e,
+  0x5e12, 0x5e13, 0x5e17, 0x5e1e, 0x5e1f, 0x5e20, 0x5e21, 0x5e22,
+  0x5e23, 0x5e24, 0x5e25, 0x5e28, 0x5e29, 0x5e2a, 0x5e2b, 0x5e2c,
+  0x5e2f, 0x5e30, 0x5e32, 0x5e33, 0x5e34, 0x5e35, 0x5e36, 0x5e39,
+  0x5e3a, 0x5e3e, 0x5e3f, 0x5e40, 0x5e41, 0x5e43, 0x5e46, 0x5e47,
+  0x5e48, 0x5e49, 0x5e4a, 0x5e4b, 0x5e4d, 0x5e4e, 0x5e4f, 0x5e50,
+  0x5e51, 0x5e52, 0x5e53, 0x5e56, 0x5e57, 0x5e58, 0x5e59, 0x5e5a,
+  0x5e5c, 0x5e5d, 0x5e5f, 0x5e60, 0x5e63, 0x5e64, 0x5e65, 0x5e66,
+  0x5e67, 0x5e68, 0x5e69, 0x5e6a, 0x5e6b, 0x5e6c, 0x5e6d, 0x5e6e,
+  0x5e6f, 0x5e70, 0x5e71, 0x5e75, 0x5e77, 0x5e79, 0x5e7e, 0x5e81,
+  0x5e82, 0x5e83, 0x5e85, 0x5e88, 0x5e89, 0x5e8c, 0x5e8d, 0x5e8e,
+  0x5e92, 0x5e98, 0x5e9b, 0x5e9d, 0x5ea1, 0x5ea2, 0x5ea3, 0x5ea4,
+  0x5ea8, 0x5ea9, 0x5eaa, 0x5eab, 0x5eac, 0x5eae, 0x5eaf, 0x5eb0,
+  0x5eb1, 0x5eb2, 0x5eb4, 0x5eba, 0x5ebb, 0x5ebc, 0x5ebd, 0x5ebf,
+  0x5ec0, 0x5ec1, 0x5ec2, 0x5ec3, 0x5ec4, 0x5ec5,
+  /* 0x8f */
+  0x5ec6, 0x5ec7, 0x5ec8, 0x5ecb, 0x5ecc, 0x5ecd, 0x5ece, 0x5ecf,
+  0x5ed0, 0x5ed4, 0x5ed5, 0x5ed7, 0x5ed8, 0x5ed9, 0x5eda, 0x5edc,
+  0x5edd, 0x5ede, 0x5edf, 0x5ee0, 0x5ee1, 0x5ee2, 0x5ee3, 0x5ee4,
+  0x5ee5, 0x5ee6, 0x5ee7, 0x5ee9, 0x5eeb, 0x5eec, 0x5eed, 0x5eee,
+  0x5eef, 0x5ef0, 0x5ef1, 0x5ef2, 0x5ef3, 0x5ef5, 0x5ef8, 0x5ef9,
+  0x5efb, 0x5efc, 0x5efd, 0x5f05, 0x5f06, 0x5f07, 0x5f09, 0x5f0c,
+  0x5f0d, 0x5f0e, 0x5f10, 0x5f12, 0x5f14, 0x5f16, 0x5f19, 0x5f1a,
+  0x5f1c, 0x5f1d, 0x5f1e, 0x5f21, 0x5f22, 0x5f23, 0x5f24, 0x5f28,
+  0x5f2b, 0x5f2c, 0x5f2e, 0x5f30, 0x5f32, 0x5f33, 0x5f34, 0x5f35,
+  0x5f36, 0x5f37, 0x5f38, 0x5f3b, 0x5f3d, 0x5f3e, 0x5f3f, 0x5f41,
+  0x5f42, 0x5f43, 0x5f44, 0x5f45, 0x5f46, 0x5f47, 0x5f48, 0x5f49,
+  0x5f4a, 0x5f4b, 0x5f4c, 0x5f4d, 0x5f4e, 0x5f4f, 0x5f51, 0x5f54,
+  0x5f59, 0x5f5a, 0x5f5b, 0x5f5c, 0x5f5e, 0x5f5f, 0x5f60, 0x5f63,
+  0x5f65, 0x5f67, 0x5f68, 0x5f6b, 0x5f6e, 0x5f6f, 0x5f72, 0x5f74,
+  0x5f75, 0x5f76, 0x5f78, 0x5f7a, 0x5f7d, 0x5f7e, 0x5f7f, 0x5f83,
+  0x5f86, 0x5f8d, 0x5f8e, 0x5f8f, 0x5f91, 0x5f93, 0x5f94, 0x5f96,
+  0x5f9a, 0x5f9b, 0x5f9d, 0x5f9e, 0x5f9f, 0x5fa0, 0x5fa2, 0x5fa3,
+  0x5fa4, 0x5fa5, 0x5fa6, 0x5fa7, 0x5fa9, 0x5fab, 0x5fac, 0x5faf,
+  0x5fb0, 0x5fb1, 0x5fb2, 0x5fb3, 0x5fb4, 0x5fb6, 0x5fb8, 0x5fb9,
+  0x5fba, 0x5fbb, 0x5fbe, 0x5fbf, 0x5fc0, 0x5fc1, 0x5fc2, 0x5fc7,
+  0x5fc8, 0x5fca, 0x5fcb, 0x5fce, 0x5fd3, 0x5fd4, 0x5fd5, 0x5fda,
+  0x5fdb, 0x5fdc, 0x5fde, 0x5fdf, 0x5fe2, 0x5fe3, 0x5fe5, 0x5fe6,
+  0x5fe8, 0x5fe9, 0x5fec, 0x5fef, 0x5ff0, 0x5ff2, 0x5ff3, 0x5ff4,
+  0x5ff6, 0x5ff7, 0x5ff9, 0x5ffa, 0x5ffc, 0x6007,
+  /* 0x90 */
+  0x6008, 0x6009, 0x600b, 0x600c, 0x6010, 0x6011, 0x6013, 0x6017,
+  0x6018, 0x601a, 0x601e, 0x601f, 0x6022, 0x6023, 0x6024, 0x602c,
+  0x602d, 0x602e, 0x6030, 0x6031, 0x6032, 0x6033, 0x6034, 0x6036,
+  0x6037, 0x6038, 0x6039, 0x603a, 0x603d, 0x603e, 0x6040, 0x6044,
+  0x6045, 0x6046, 0x6047, 0x6048, 0x6049, 0x604a, 0x604c, 0x604e,
+  0x604f, 0x6051, 0x6053, 0x6054, 0x6056, 0x6057, 0x6058, 0x605b,
+  0x605c, 0x605e, 0x605f, 0x6060, 0x6061, 0x6065, 0x6066, 0x606e,
+  0x6071, 0x6072, 0x6074, 0x6075, 0x6077, 0x607e, 0x6080, 0x6081,
+  0x6082, 0x6085, 0x6086, 0x6087, 0x6088, 0x608a, 0x608b, 0x608e,
+  0x608f, 0x6090, 0x6091, 0x6093, 0x6095, 0x6097, 0x6098, 0x6099,
+  0x609c, 0x609e, 0x60a1, 0x60a2, 0x60a4, 0x60a5, 0x60a7, 0x60a9,
+  0x60aa, 0x60ae, 0x60b0, 0x60b3, 0x60b5, 0x60b6, 0x60b7, 0x60b9,
+  0x60ba, 0x60bd, 0x60be, 0x60bf, 0x60c0, 0x60c1, 0x60c2, 0x60c3,
+  0x60c4, 0x60c7, 0x60c8, 0x60c9, 0x60cc, 0x60cd, 0x60ce, 0x60cf,
+  0x60d0, 0x60d2, 0x60d3, 0x60d4, 0x60d6, 0x60d7, 0x60d9, 0x60db,
+  0x60de, 0x60e1, 0x60e2, 0x60e3, 0x60e4, 0x60e5, 0x60ea, 0x60f1,
+  0x60f2, 0x60f5, 0x60f7, 0x60f8, 0x60fb, 0x60fc, 0x60fd, 0x60fe,
+  0x60ff, 0x6102, 0x6103, 0x6104, 0x6105, 0x6107, 0x610a, 0x610b,
+  0x610c, 0x6110, 0x6111, 0x6112, 0x6113, 0x6114, 0x6116, 0x6117,
+  0x6118, 0x6119, 0x611b, 0x611c, 0x611d, 0x611e, 0x6121, 0x6122,
+  0x6125, 0x6128, 0x6129, 0x612a, 0x612c, 0x612d, 0x612e, 0x612f,
+  0x6130, 0x6131, 0x6132, 0x6133, 0x6134, 0x6135, 0x6136, 0x6137,
+  0x6138, 0x6139, 0x613a, 0x613b, 0x613c, 0x613d, 0x613e, 0x6140,
+  0x6141, 0x6142, 0x6143, 0x6144, 0x6145, 0x6146,
+  /* 0x91 */
+  0x6147, 0x6149, 0x614b, 0x614d, 0x614f, 0x6150, 0x6152, 0x6153,
+  0x6154, 0x6156, 0x6157, 0x6158, 0x6159, 0x615a, 0x615b, 0x615c,
+  0x615e, 0x615f, 0x6160, 0x6161, 0x6163, 0x6164, 0x6165, 0x6166,
+  0x6169, 0x616a, 0x616b, 0x616c, 0x616d, 0x616e, 0x616f, 0x6171,
+  0x6172, 0x6173, 0x6174, 0x6176, 0x6178, 0x6179, 0x617a, 0x617b,
+  0x617c, 0x617d, 0x617e, 0x617f, 0x6180, 0x6181, 0x6182, 0x6183,
+  0x6184, 0x6185, 0x6186, 0x6187, 0x6188, 0x6189, 0x618a, 0x618c,
+  0x618d, 0x618f, 0x6190, 0x6191, 0x6192, 0x6193, 0x6195, 0x6196,
+  0x6197, 0x6198, 0x6199, 0x619a, 0x619b, 0x619c, 0x619e, 0x619f,
+  0x61a0, 0x61a1, 0x61a2, 0x61a3, 0x61a4, 0x61a5, 0x61a6, 0x61aa,
+  0x61ab, 0x61ad, 0x61ae, 0x61af, 0x61b0, 0x61b1, 0x61b2, 0x61b3,
+  0x61b4, 0x61b5, 0x61b6, 0x61b8, 0x61b9, 0x61ba, 0x61bb, 0x61bc,
+  0x61bd, 0x61bf, 0x61c0, 0x61c1, 0x61c3, 0x61c4, 0x61c5, 0x61c6,
+  0x61c7, 0x61c9, 0x61cc, 0x61cd, 0x61ce, 0x61cf, 0x61d0, 0x61d3,
+  0x61d5, 0x61d6, 0x61d7, 0x61d8, 0x61d9, 0x61da, 0x61db, 0x61dc,
+  0x61dd, 0x61de, 0x61df, 0x61e0, 0x61e1, 0x61e2, 0x61e3, 0x61e4,
+  0x61e5, 0x61e7, 0x61e8, 0x61e9, 0x61ea, 0x61eb, 0x61ec, 0x61ed,
+  0x61ee, 0x61ef, 0x61f0, 0x61f1, 0x61f2, 0x61f3, 0x61f4, 0x61f6,
+  0x61f7, 0x61f8, 0x61f9, 0x61fa, 0x61fb, 0x61fc, 0x61fd, 0x61fe,
+  0x6200, 0x6201, 0x6202, 0x6203, 0x6204, 0x6205, 0x6207, 0x6209,
+  0x6213, 0x6214, 0x6219, 0x621c, 0x621d, 0x621e, 0x6220, 0x6223,
+  0x6226, 0x6227, 0x6228, 0x6229, 0x622b, 0x622d, 0x622f, 0x6230,
+  0x6231, 0x6232, 0x6235, 0x6236, 0x6238, 0x6239, 0x623a, 0x623b,
+  0x623c, 0x6242, 0x6244, 0x6245, 0x6246, 0x624a,
+  /* 0x92 */
+  0x624f, 0x6250, 0x6255, 0x6256, 0x6257, 0x6259, 0x625a, 0x625c,
+  0x625d, 0x625e, 0x625f, 0x6260, 0x6261, 0x6262, 0x6264, 0x6265,
+  0x6268, 0x6271, 0x6272, 0x6274, 0x6275, 0x6277, 0x6278, 0x627a,
+  0x627b, 0x627d, 0x6281, 0x6282, 0x6283, 0x6285, 0x6286, 0x6287,
+  0x6288, 0x628b, 0x628c, 0x628d, 0x628e, 0x628f, 0x6290, 0x6294,
+  0x6299, 0x629c, 0x629d, 0x629e, 0x62a3, 0x62a6, 0x62a7, 0x62a9,
+  0x62aa, 0x62ad, 0x62ae, 0x62af, 0x62b0, 0x62b2, 0x62b3, 0x62b4,
+  0x62b6, 0x62b7, 0x62b8, 0x62ba, 0x62be, 0x62c0, 0x62c1, 0x62c3,
+  0x62cb, 0x62cf, 0x62d1, 0x62d5, 0x62dd, 0x62de, 0x62e0, 0x62e1,
+  0x62e4, 0x62ea, 0x62eb, 0x62f0, 0x62f2, 0x62f5, 0x62f8, 0x62f9,
+  0x62fa, 0x62fb, 0x6300, 0x6303, 0x6304, 0x6305, 0x6306, 0x630a,
+  0x630b, 0x630c, 0x630d, 0x630f, 0x6310, 0x6312, 0x6313, 0x6314,
+  0x6315, 0x6317, 0x6318, 0x6319, 0x631c, 0x6326, 0x6327, 0x6329,
+  0x632c, 0x632d, 0x632e, 0x6330, 0x6331, 0x6333, 0x6334, 0x6335,
+  0x6336, 0x6337, 0x6338, 0x633b, 0x633c, 0x633e, 0x633f, 0x6340,
+  0x6341, 0x6344, 0x6347, 0x6348, 0x634a, 0x6351, 0x6352, 0x6353,
+  0x6354, 0x6356, 0x6357, 0x6358, 0x6359, 0x635a, 0x635b, 0x635c,
+  0x635d, 0x6360, 0x6364, 0x6365, 0x6366, 0x6368, 0x636a, 0x636b,
+  0x636c, 0x636f, 0x6370, 0x6372, 0x6373, 0x6374, 0x6375, 0x6378,
+  0x6379, 0x637c, 0x637d, 0x637e, 0x637f, 0x6381, 0x6383, 0x6384,
+  0x6385, 0x6386, 0x638b, 0x638d, 0x6391, 0x6393, 0x6394, 0x6395,
+  0x6397, 0x6399, 0x639a, 0x639b, 0x639c, 0x639d, 0x639e, 0x639f,
+  0x63a1, 0x63a4, 0x63a6, 0x63ab, 0x63af, 0x63b1, 0x63b2, 0x63b5,
+  0x63b6, 0x63b9, 0x63bb, 0x63bd, 0x63bf, 0x63c0,
+  /* 0x93 */
+  0x63c1, 0x63c2, 0x63c3, 0x63c5, 0x63c7, 0x63c8, 0x63ca, 0x63cb,
+  0x63cc, 0x63d1, 0x63d3, 0x63d4, 0x63d5, 0x63d7, 0x63d8, 0x63d9,
+  0x63da, 0x63db, 0x63dc, 0x63dd, 0x63df, 0x63e2, 0x63e4, 0x63e5,
+  0x63e6, 0x63e7, 0x63e8, 0x63eb, 0x63ec, 0x63ee, 0x63ef, 0x63f0,
+  0x63f1, 0x63f3, 0x63f5, 0x63f7, 0x63f9, 0x63fa, 0x63fb, 0x63fc,
+  0x63fe, 0x6403, 0x6404, 0x6406, 0x6407, 0x6408, 0x6409, 0x640a,
+  0x640d, 0x640e, 0x6411, 0x6412, 0x6415, 0x6416, 0x6417, 0x6418,
+  0x6419, 0x641a, 0x641d, 0x641f, 0x6422, 0x6423, 0x6424, 0x6425,
+  0x6427, 0x6428, 0x6429, 0x642b, 0x642e, 0x642f, 0x6430, 0x6431,
+  0x6432, 0x6433, 0x6435, 0x6436, 0x6437, 0x6438, 0x6439, 0x643b,
+  0x643c, 0x643e, 0x6440, 0x6442, 0x6443, 0x6449, 0x644b, 0x644c,
+  0x644d, 0x644e, 0x644f, 0x6450, 0x6451, 0x6453, 0x6455, 0x6456,
+  0x6457, 0x6459, 0x645a, 0x645b, 0x645c, 0x645d, 0x645f, 0x6460,
+  0x6461, 0x6462, 0x6463, 0x6464, 0x6465, 0x6466, 0x6468, 0x646a,
+  0x646b, 0x646c, 0x646e, 0x646f, 0x6470, 0x6471, 0x6472, 0x6473,
+  0x6474, 0x6475, 0x6476, 0x6477, 0x647b, 0x647c, 0x647d, 0x647e,
+  0x647f, 0x6480, 0x6481, 0x6483, 0x6486, 0x6488, 0x6489, 0x648a,
+  0x648b, 0x648c, 0x648d, 0x648e, 0x648f, 0x6490, 0x6493, 0x6494,
+  0x6497, 0x6498, 0x649a, 0x649b, 0x649c, 0x649d, 0x649f, 0x64a0,
+  0x64a1, 0x64a2, 0x64a3, 0x64a5, 0x64a6, 0x64a7, 0x64a8, 0x64aa,
+  0x64ab, 0x64af, 0x64b1, 0x64b2, 0x64b3, 0x64b4, 0x64b6, 0x64b9,
+  0x64bb, 0x64bd, 0x64be, 0x64bf, 0x64c1, 0x64c3, 0x64c4, 0x64c6,
+  0x64c7, 0x64c8, 0x64c9, 0x64ca, 0x64cb, 0x64cc, 0x64cf, 0x64d1,
+  0x64d3, 0x64d4, 0x64d5, 0x64d6, 0x64d9, 0x64da,
+  /* 0x94 */
+  0x64db, 0x64dc, 0x64dd, 0x64df, 0x64e0, 0x64e1, 0x64e3, 0x64e5,
+  0x64e7, 0x64e8, 0x64e9, 0x64ea, 0x64eb, 0x64ec, 0x64ed, 0x64ee,
+  0x64ef, 0x64f0, 0x64f1, 0x64f2, 0x64f3, 0x64f4, 0x64f5, 0x64f6,
+  0x64f7, 0x64f8, 0x64f9, 0x64fa, 0x64fb, 0x64fc, 0x64fd, 0x64fe,
+  0x64ff, 0x6501, 0x6502, 0x6503, 0x6504, 0x6505, 0x6506, 0x6507,
+  0x6508, 0x650a, 0x650b, 0x650c, 0x650d, 0x650e, 0x650f, 0x6510,
+  0x6511, 0x6513, 0x6514, 0x6515, 0x6516, 0x6517, 0x6519, 0x651a,
+  0x651b, 0x651c, 0x651d, 0x651e, 0x651f, 0x6520, 0x6521, 0x6522,
+  0x6523, 0x6524, 0x6526, 0x6527, 0x6528, 0x6529, 0x652a, 0x652c,
+  0x652d, 0x6530, 0x6531, 0x6532, 0x6533, 0x6537, 0x653a, 0x653c,
+  0x653d, 0x6540, 0x6541, 0x6542, 0x6543, 0x6544, 0x6546, 0x6547,
+  0x654a, 0x654b, 0x654d, 0x654e, 0x6550, 0x6552, 0x6553, 0x6554,
+  0x6557, 0x6558, 0x655a, 0x655c, 0x655f, 0x6560, 0x6561, 0x6564,
+  0x6565, 0x6567, 0x6568, 0x6569, 0x656a, 0x656d, 0x656e, 0x656f,
+  0x6571, 0x6573, 0x6575, 0x6576, 0x6578, 0x6579, 0x657a, 0x657b,
+  0x657c, 0x657d, 0x657e, 0x657f, 0x6580, 0x6581, 0x6582, 0x6583,
+  0x6584, 0x6585, 0x6586, 0x6588, 0x6589, 0x658a, 0x658d, 0x658e,
+  0x658f, 0x6592, 0x6594, 0x6595, 0x6596, 0x6598, 0x659a, 0x659d,
+  0x659e, 0x65a0, 0x65a2, 0x65a3, 0x65a6, 0x65a8, 0x65aa, 0x65ac,
+  0x65ae, 0x65b1, 0x65b2, 0x65b3, 0x65b4, 0x65b5, 0x65b6, 0x65b7,
+  0x65b8, 0x65ba, 0x65bb, 0x65be, 0x65bf, 0x65c0, 0x65c2, 0x65c7,
+  0x65c8, 0x65c9, 0x65ca, 0x65cd, 0x65d0, 0x65d1, 0x65d3, 0x65d4,
+  0x65d5, 0x65d8, 0x65d9, 0x65da, 0x65db, 0x65dc, 0x65dd, 0x65de,
+  0x65df, 0x65e1, 0x65e3, 0x65e4, 0x65ea, 0x65eb,
+  /* 0x95 */
+  0x65f2, 0x65f3, 0x65f4, 0x65f5, 0x65f8, 0x65f9, 0x65fb, 0x65fc,
+  0x65fd, 0x65fe, 0x65ff, 0x6601, 0x6604, 0x6605, 0x6607, 0x6608,
+  0x6609, 0x660b, 0x660d, 0x6610, 0x6611, 0x6612, 0x6616, 0x6617,
+  0x6618, 0x661a, 0x661b, 0x661c, 0x661e, 0x6621, 0x6622, 0x6623,
+  0x6624, 0x6626, 0x6629, 0x662a, 0x662b, 0x662c, 0x662e, 0x6630,
+  0x6632, 0x6633, 0x6637, 0x6638, 0x6639, 0x663a, 0x663b, 0x663d,
+  0x663f, 0x6640, 0x6642, 0x6644, 0x6645, 0x6646, 0x6647, 0x6648,
+  0x6649, 0x664a, 0x664d, 0x664e, 0x6650, 0x6651, 0x6658, 0x6659,
+  0x665b, 0x665c, 0x665d, 0x665e, 0x6660, 0x6662, 0x6663, 0x6665,
+  0x6667, 0x6669, 0x666a, 0x666b, 0x666c, 0x666d, 0x6671, 0x6672,
+  0x6673, 0x6675, 0x6678, 0x6679, 0x667b, 0x667c, 0x667d, 0x667f,
+  0x6680, 0x6681, 0x6683, 0x6685, 0x6686, 0x6688, 0x6689, 0x668a,
+  0x668b, 0x668d, 0x668e, 0x668f, 0x6690, 0x6692, 0x6693, 0x6694,
+  0x6695, 0x6698, 0x6699, 0x669a, 0x669b, 0x669c, 0x669e, 0x669f,
+  0x66a0, 0x66a1, 0x66a2, 0x66a3, 0x66a4, 0x66a5, 0x66a6, 0x66a9,
+  0x66aa, 0x66ab, 0x66ac, 0x66ad, 0x66af, 0x66b0, 0x66b1, 0x66b2,
+  0x66b3, 0x66b5, 0x66b6, 0x66b7, 0x66b8, 0x66ba, 0x66bb, 0x66bc,
+  0x66bd, 0x66bf, 0x66c0, 0x66c1, 0x66c2, 0x66c3, 0x66c4, 0x66c5,
+  0x66c6, 0x66c7, 0x66c8, 0x66c9, 0x66ca, 0x66cb, 0x66cc, 0x66cd,
+  0x66ce, 0x66cf, 0x66d0, 0x66d1, 0x66d2, 0x66d3, 0x66d4, 0x66d5,
+  0x66d6, 0x66d7, 0x66d8, 0x66da, 0x66de, 0x66df, 0x66e0, 0x66e1,
+  0x66e2, 0x66e3, 0x66e4, 0x66e5, 0x66e7, 0x66e8, 0x66ea, 0x66eb,
+  0x66ec, 0x66ed, 0x66ee, 0x66ef, 0x66f1, 0x66f5, 0x66f6, 0x66f8,
+  0x66fa, 0x66fb, 0x66fd, 0x6701, 0x6702, 0x6703,
+  /* 0x96 */
+  0x6704, 0x6705, 0x6706, 0x6707, 0x670c, 0x670e, 0x670f, 0x6711,
+  0x6712, 0x6713, 0x6716, 0x6718, 0x6719, 0x671a, 0x671c, 0x671e,
+  0x6720, 0x6721, 0x6722, 0x6723, 0x6724, 0x6725, 0x6727, 0x6729,
+  0x672e, 0x6730, 0x6732, 0x6733, 0x6736, 0x6737, 0x6738, 0x6739,
+  0x673b, 0x673c, 0x673e, 0x673f, 0x6741, 0x6744, 0x6745, 0x6747,
+  0x674a, 0x674b, 0x674d, 0x6752, 0x6754, 0x6755, 0x6757, 0x6758,
+  0x6759, 0x675a, 0x675b, 0x675d, 0x6762, 0x6763, 0x6764, 0x6766,
+  0x6767, 0x676b, 0x676c, 0x676e, 0x6771, 0x6774, 0x6776, 0x6778,
+  0x6779, 0x677a, 0x677b, 0x677d, 0x6780, 0x6782, 0x6783, 0x6785,
+  0x6786, 0x6788, 0x678a, 0x678c, 0x678d, 0x678e, 0x678f, 0x6791,
+  0x6792, 0x6793, 0x6794, 0x6796, 0x6799, 0x679b, 0x679f, 0x67a0,
+  0x67a1, 0x67a4, 0x67a6, 0x67a9, 0x67ac, 0x67ae, 0x67b1, 0x67b2,
+  0x67b4, 0x67b9, 0x67ba, 0x67bb, 0x67bc, 0x67bd, 0x67be, 0x67bf,
+  0x67c0, 0x67c2, 0x67c5, 0x67c6, 0x67c7, 0x67c8, 0x67c9, 0x67ca,
+  0x67cb, 0x67cc, 0x67cd, 0x67ce, 0x67d5, 0x67d6, 0x67d7, 0x67db,
+  0x67df, 0x67e1, 0x67e3, 0x67e4, 0x67e6, 0x67e7, 0x67e8, 0x67ea,
+  0x67eb, 0x67ed, 0x67ee, 0x67f2, 0x67f5, 0x67f6, 0x67f7, 0x67f8,
+  0x67f9, 0x67fa, 0x67fb, 0x67fc, 0x67fe, 0x6801, 0x6802, 0x6803,
+  0x6804, 0x6806, 0x680d, 0x6810, 0x6812, 0x6814, 0x6815, 0x6818,
+  0x6819, 0x681a, 0x681b, 0x681c, 0x681e, 0x681f, 0x6820, 0x6822,
+  0x6823, 0x6824, 0x6825, 0x6826, 0x6827, 0x6828, 0x682b, 0x682c,
+  0x682d, 0x682e, 0x682f, 0x6830, 0x6831, 0x6834, 0x6835, 0x6836,
+  0x683a, 0x683b, 0x683f, 0x6847, 0x684b, 0x684d, 0x684f, 0x6852,
+  0x6856, 0x6857, 0x6858, 0x6859, 0x685a, 0x685b,
+  /* 0x97 */
+  0x685c, 0x685d, 0x685e, 0x685f, 0x686a, 0x686c, 0x686d, 0x686e,
+  0x686f, 0x6870, 0x6871, 0x6872, 0x6873, 0x6875, 0x6878, 0x6879,
+  0x687a, 0x687b, 0x687c, 0x687d, 0x687e, 0x687f, 0x6880, 0x6882,
+  0x6884, 0x6887, 0x6888, 0x6889, 0x688a, 0x688b, 0x688c, 0x688d,
+  0x688e, 0x6890, 0x6891, 0x6892, 0x6894, 0x6895, 0x6896, 0x6898,
+  0x6899, 0x689a, 0x689b, 0x689c, 0x689d, 0x689e, 0x689f, 0x68a0,
+  0x68a1, 0x68a3, 0x68a4, 0x68a5, 0x68a9, 0x68aa, 0x68ab, 0x68ac,
+  0x68ae, 0x68b1, 0x68b2, 0x68b4, 0x68b6, 0x68b7, 0x68b8, 0x68b9,
+  0x68ba, 0x68bb, 0x68bc, 0x68bd, 0x68be, 0x68bf, 0x68c1, 0x68c3,
+  0x68c4, 0x68c5, 0x68c6, 0x68c7, 0x68c8, 0x68ca, 0x68cc, 0x68ce,
+  0x68cf, 0x68d0, 0x68d1, 0x68d3, 0x68d4, 0x68d6, 0x68d7, 0x68d9,
+  0x68db, 0x68dc, 0x68dd, 0x68de, 0x68df, 0x68e1, 0x68e2, 0x68e4,
+  0x68e5, 0x68e6, 0x68e7, 0x68e8, 0x68e9, 0x68ea, 0x68eb, 0x68ec,
+  0x68ed, 0x68ef, 0x68f2, 0x68f3, 0x68f4, 0x68f6, 0x68f7, 0x68f8,
+  0x68fb, 0x68fd, 0x68fe, 0x68ff, 0x6900, 0x6902, 0x6903, 0x6904,
+  0x6906, 0x6907, 0x6908, 0x6909, 0x690a, 0x690c, 0x690f, 0x6911,
+  0x6913, 0x6914, 0x6915, 0x6916, 0x6917, 0x6918, 0x6919, 0x691a,
+  0x691b, 0x691c, 0x691d, 0x691e, 0x6921, 0x6922, 0x6923, 0x6925,
+  0x6926, 0x6927, 0x6928, 0x6929, 0x692a, 0x692b, 0x692c, 0x692e,
+  0x692f, 0x6931, 0x6932, 0x6933, 0x6935, 0x6936, 0x6937, 0x6938,
+  0x693a, 0x693b, 0x693c, 0x693e, 0x6940, 0x6941, 0x6943, 0x6944,
+  0x6945, 0x6946, 0x6947, 0x6948, 0x6949, 0x694a, 0x694b, 0x694c,
+  0x694d, 0x694e, 0x694f, 0x6950, 0x6951, 0x6952, 0x6953, 0x6955,
+  0x6956, 0x6958, 0x6959, 0x695b, 0x695c, 0x695f,
+  /* 0x98 */
+  0x6961, 0x6962, 0x6964, 0x6965, 0x6967, 0x6968, 0x6969, 0x696a,
+  0x696c, 0x696d, 0x696f, 0x6970, 0x6972, 0x6973, 0x6974, 0x6975,
+  0x6976, 0x697a, 0x697b, 0x697d, 0x697e, 0x697f, 0x6981, 0x6983,
+  0x6985, 0x698a, 0x698b, 0x698c, 0x698e, 0x698f, 0x6990, 0x6991,
+  0x6992, 0x6993, 0x6996, 0x6997, 0x6999, 0x699a, 0x699d, 0x699e,
+  0x699f, 0x69a0, 0x69a1, 0x69a2, 0x69a3, 0x69a4, 0x69a5, 0x69a6,
+  0x69a9, 0x69aa, 0x69ac, 0x69ae, 0x69af, 0x69b0, 0x69b2, 0x69b3,
+  0x69b5, 0x69b6, 0x69b8, 0x69b9, 0x69ba, 0x69bc, 0x69bd, 0x69be,
+  0x69bf, 0x69c0, 0x69c2, 0x69c3, 0x69c4, 0x69c5, 0x69c6, 0x69c7,
+  0x69c8, 0x69c9, 0x69cb, 0x69cd, 0x69cf, 0x69d1, 0x69d2, 0x69d3,
+  0x69d5, 0x69d6, 0x69d7, 0x69d8, 0x69d9, 0x69da, 0x69dc, 0x69dd,
+  0x69de, 0x69e1, 0x69e2, 0x69e3, 0x69e4, 0x69e5, 0x69e6, 0x69e7,
+  0x69e8, 0x69e9, 0x69ea, 0x69eb, 0x69ec, 0x69ee, 0x69ef, 0x69f0,
+  0x69f1, 0x69f3, 0x69f4, 0x69f5, 0x69f6, 0x69f7, 0x69f8, 0x69f9,
+  0x69fa, 0x69fb, 0x69fc, 0x69fe, 0x6a00, 0x6a01, 0x6a02, 0x6a03,
+  0x6a04, 0x6a05, 0x6a06, 0x6a07, 0x6a08, 0x6a09, 0x6a0b, 0x6a0c,
+  0x6a0d, 0x6a0e, 0x6a0f, 0x6a10, 0x6a11, 0x6a12, 0x6a13, 0x6a14,
+  0x6a15, 0x6a16, 0x6a19, 0x6a1a, 0x6a1b, 0x6a1c, 0x6a1d, 0x6a1e,
+  0x6a20, 0x6a22, 0x6a23, 0x6a24, 0x6a25, 0x6a26, 0x6a27, 0x6a29,
+  0x6a2b, 0x6a2c, 0x6a2d, 0x6a2e, 0x6a30, 0x6a32, 0x6a33, 0x6a34,
+  0x6a36, 0x6a37, 0x6a38, 0x6a39, 0x6a3a, 0x6a3b, 0x6a3c, 0x6a3f,
+  0x6a40, 0x6a41, 0x6a42, 0x6a43, 0x6a45, 0x6a46, 0x6a48, 0x6a49,
+  0x6a4a, 0x6a4b, 0x6a4c, 0x6a4d, 0x6a4e, 0x6a4f, 0x6a51, 0x6a52,
+  0x6a53, 0x6a54, 0x6a55, 0x6a56, 0x6a57, 0x6a5a,
+  /* 0x99 */
+  0x6a5c, 0x6a5d, 0x6a5e, 0x6a5f, 0x6a60, 0x6a62, 0x6a63, 0x6a64,
+  0x6a66, 0x6a67, 0x6a68, 0x6a69, 0x6a6a, 0x6a6b, 0x6a6c, 0x6a6d,
+  0x6a6e, 0x6a6f, 0x6a70, 0x6a72, 0x6a73, 0x6a74, 0x6a75, 0x6a76,
+  0x6a77, 0x6a78, 0x6a7a, 0x6a7b, 0x6a7d, 0x6a7e, 0x6a7f, 0x6a81,
+  0x6a82, 0x6a83, 0x6a85, 0x6a86, 0x6a87, 0x6a88, 0x6a89, 0x6a8a,
+  0x6a8b, 0x6a8c, 0x6a8d, 0x6a8f, 0x6a92, 0x6a93, 0x6a94, 0x6a95,
+  0x6a96, 0x6a98, 0x6a99, 0x6a9a, 0x6a9b, 0x6a9c, 0x6a9d, 0x6a9e,
+  0x6a9f, 0x6aa1, 0x6aa2, 0x6aa3, 0x6aa4, 0x6aa5, 0x6aa6, 0x6aa7,
+  0x6aa8, 0x6aaa, 0x6aad, 0x6aae, 0x6aaf, 0x6ab0, 0x6ab1, 0x6ab2,
+  0x6ab3, 0x6ab4, 0x6ab5, 0x6ab6, 0x6ab7, 0x6ab8, 0x6ab9, 0x6aba,
+  0x6abb, 0x6abc, 0x6abd, 0x6abe, 0x6abf, 0x6ac0, 0x6ac1, 0x6ac2,
+  0x6ac3, 0x6ac4, 0x6ac5, 0x6ac6, 0x6ac7, 0x6ac8, 0x6ac9, 0x6aca,
+  0x6acb, 0x6acc, 0x6acd, 0x6ace, 0x6acf, 0x6ad0, 0x6ad1, 0x6ad2,
+  0x6ad3, 0x6ad4, 0x6ad5, 0x6ad6, 0x6ad7, 0x6ad8, 0x6ad9, 0x6ada,
+  0x6adb, 0x6adc, 0x6add, 0x6ade, 0x6adf, 0x6ae0, 0x6ae1, 0x6ae2,
+  0x6ae3, 0x6ae4, 0x6ae5, 0x6ae6, 0x6ae7, 0x6ae8, 0x6ae9, 0x6aea,
+  0x6aeb, 0x6aec, 0x6aed, 0x6aee, 0x6aef, 0x6af0, 0x6af1, 0x6af2,
+  0x6af3, 0x6af4, 0x6af5, 0x6af6, 0x6af7, 0x6af8, 0x6af9, 0x6afa,
+  0x6afb, 0x6afc, 0x6afd, 0x6afe, 0x6aff, 0x6b00, 0x6b01, 0x6b02,
+  0x6b03, 0x6b04, 0x6b05, 0x6b06, 0x6b07, 0x6b08, 0x6b09, 0x6b0a,
+  0x6b0b, 0x6b0c, 0x6b0d, 0x6b0e, 0x6b0f, 0x6b10, 0x6b11, 0x6b12,
+  0x6b13, 0x6b14, 0x6b15, 0x6b16, 0x6b17, 0x6b18, 0x6b19, 0x6b1a,
+  0x6b1b, 0x6b1c, 0x6b1d, 0x6b1e, 0x6b1f, 0x6b25, 0x6b26, 0x6b28,
+  0x6b29, 0x6b2a, 0x6b2b, 0x6b2c, 0x6b2d, 0x6b2e,
+  /* 0x9a */
+  0x6b2f, 0x6b30, 0x6b31, 0x6b33, 0x6b34, 0x6b35, 0x6b36, 0x6b38,
+  0x6b3b, 0x6b3c, 0x6b3d, 0x6b3f, 0x6b40, 0x6b41, 0x6b42, 0x6b44,
+  0x6b45, 0x6b48, 0x6b4a, 0x6b4b, 0x6b4d, 0x6b4e, 0x6b4f, 0x6b50,
+  0x6b51, 0x6b52, 0x6b53, 0x6b54, 0x6b55, 0x6b56, 0x6b57, 0x6b58,
+  0x6b5a, 0x6b5b, 0x6b5c, 0x6b5d, 0x6b5e, 0x6b5f, 0x6b60, 0x6b61,
+  0x6b68, 0x6b69, 0x6b6b, 0x6b6c, 0x6b6d, 0x6b6e, 0x6b6f, 0x6b70,
+  0x6b71, 0x6b72, 0x6b73, 0x6b74, 0x6b75, 0x6b76, 0x6b77, 0x6b78,
+  0x6b7a, 0x6b7d, 0x6b7e, 0x6b7f, 0x6b80, 0x6b85, 0x6b88, 0x6b8c,
+  0x6b8e, 0x6b8f, 0x6b90, 0x6b91, 0x6b94, 0x6b95, 0x6b97, 0x6b98,
+  0x6b99, 0x6b9c, 0x6b9d, 0x6b9e, 0x6b9f, 0x6ba0, 0x6ba2, 0x6ba3,
+  0x6ba4, 0x6ba5, 0x6ba6, 0x6ba7, 0x6ba8, 0x6ba9, 0x6bab, 0x6bac,
+  0x6bad, 0x6bae, 0x6baf, 0x6bb0, 0x6bb1, 0x6bb2, 0x6bb6, 0x6bb8,
+  0x6bb9, 0x6bba, 0x6bbb, 0x6bbc, 0x6bbd, 0x6bbe, 0x6bc0, 0x6bc3,
+  0x6bc4, 0x6bc6, 0x6bc7, 0x6bc8, 0x6bc9, 0x6bca, 0x6bcc, 0x6bce,
+  0x6bd0, 0x6bd1, 0x6bd8, 0x6bda, 0x6bdc, 0x6bdd, 0x6bde, 0x6bdf,
+  0x6be0, 0x6be2, 0x6be3, 0x6be4, 0x6be5, 0x6be6, 0x6be7, 0x6be8,
+  0x6be9, 0x6bec, 0x6bed, 0x6bee, 0x6bf0, 0x6bf1, 0x6bf2, 0x6bf4,
+  0x6bf6, 0x6bf7, 0x6bf8, 0x6bfa, 0x6bfb, 0x6bfc, 0x6bfe, 0x6bff,
+  0x6c00, 0x6c01, 0x6c02, 0x6c03, 0x6c04, 0x6c08, 0x6c09, 0x6c0a,
+  0x6c0b, 0x6c0c, 0x6c0e, 0x6c12, 0x6c17, 0x6c1c, 0x6c1d, 0x6c1e,
+  0x6c20, 0x6c23, 0x6c25, 0x6c2b, 0x6c2c, 0x6c2d, 0x6c31, 0x6c33,
+  0x6c36, 0x6c37, 0x6c39, 0x6c3a, 0x6c3b, 0x6c3c, 0x6c3e, 0x6c3f,
+  0x6c43, 0x6c44, 0x6c45, 0x6c48, 0x6c4b, 0x6c4c, 0x6c4d, 0x6c4e,
+  0x6c4f, 0x6c51, 0x6c52, 0x6c53, 0x6c56, 0x6c58,
+  /* 0x9b */
+  0x6c59, 0x6c5a, 0x6c62, 0x6c63, 0x6c65, 0x6c66, 0x6c67, 0x6c6b,
+  0x6c6c, 0x6c6d, 0x6c6e, 0x6c6f, 0x6c71, 0x6c73, 0x6c75, 0x6c77,
+  0x6c78, 0x6c7a, 0x6c7b, 0x6c7c, 0x6c7f, 0x6c80, 0x6c84, 0x6c87,
+  0x6c8a, 0x6c8b, 0x6c8d, 0x6c8e, 0x6c91, 0x6c92, 0x6c95, 0x6c96,
+  0x6c97, 0x6c98, 0x6c9a, 0x6c9c, 0x6c9d, 0x6c9e, 0x6ca0, 0x6ca2,
+  0x6ca8, 0x6cac, 0x6caf, 0x6cb0, 0x6cb4, 0x6cb5, 0x6cb6, 0x6cb7,
+  0x6cba, 0x6cc0, 0x6cc1, 0x6cc2, 0x6cc3, 0x6cc6, 0x6cc7, 0x6cc8,
+  0x6ccb, 0x6ccd, 0x6cce, 0x6ccf, 0x6cd1, 0x6cd2, 0x6cd8, 0x6cd9,
+  0x6cda, 0x6cdc, 0x6cdd, 0x6cdf, 0x6ce4, 0x6ce6, 0x6ce7, 0x6ce9,
+  0x6cec, 0x6ced, 0x6cf2, 0x6cf4, 0x6cf9, 0x6cff, 0x6d00, 0x6d02,
+  0x6d03, 0x6d05, 0x6d06, 0x6d08, 0x6d09, 0x6d0a, 0x6d0d, 0x6d0f,
+  0x6d10, 0x6d11, 0x6d13, 0x6d14, 0x6d15, 0x6d16, 0x6d18, 0x6d1c,
+  0x6d1d, 0x6d1f, 0x6d20, 0x6d21, 0x6d22, 0x6d23, 0x6d24, 0x6d26,
+  0x6d28, 0x6d29, 0x6d2c, 0x6d2d, 0x6d2f, 0x6d30, 0x6d34, 0x6d36,
+  0x6d37, 0x6d38, 0x6d3a, 0x6d3f, 0x6d40, 0x6d42, 0x6d44, 0x6d49,
+  0x6d4c, 0x6d50, 0x6d55, 0x6d56, 0x6d57, 0x6d58, 0x6d5b, 0x6d5d,
+  0x6d5f, 0x6d61, 0x6d62, 0x6d64, 0x6d65, 0x6d67, 0x6d68, 0x6d6b,
+  0x6d6c, 0x6d6d, 0x6d70, 0x6d71, 0x6d72, 0x6d73, 0x6d75, 0x6d76,
+  0x6d79, 0x6d7a, 0x6d7b, 0x6d7d, 0x6d7e, 0x6d7f, 0x6d80, 0x6d81,
+  0x6d83, 0x6d84, 0x6d86, 0x6d87, 0x6d8a, 0x6d8b, 0x6d8d, 0x6d8f,
+  0x6d90, 0x6d92, 0x6d96, 0x6d97, 0x6d98, 0x6d99, 0x6d9a, 0x6d9c,
+  0x6da2, 0x6da5, 0x6dac, 0x6dad, 0x6db0, 0x6db1, 0x6db3, 0x6db4,
+  0x6db6, 0x6db7, 0x6db9, 0x6dba, 0x6dbb, 0x6dbc, 0x6dbd, 0x6dbe,
+  0x6dc1, 0x6dc2, 0x6dc3, 0x6dc8, 0x6dc9, 0x6dca,
+  /* 0x9c */
+  0x6dcd, 0x6dce, 0x6dcf, 0x6dd0, 0x6dd2, 0x6dd3, 0x6dd4, 0x6dd5,
+  0x6dd7, 0x6dda, 0x6ddb, 0x6ddc, 0x6ddf, 0x6de2, 0x6de3, 0x6de5,
+  0x6de7, 0x6de8, 0x6de9, 0x6dea, 0x6ded, 0x6def, 0x6df0, 0x6df2,
+  0x6df4, 0x6df5, 0x6df6, 0x6df8, 0x6dfa, 0x6dfd, 0x6dfe, 0x6dff,
+  0x6e00, 0x6e01, 0x6e02, 0x6e03, 0x6e04, 0x6e06, 0x6e07, 0x6e08,
+  0x6e09, 0x6e0b, 0x6e0f, 0x6e12, 0x6e13, 0x6e15, 0x6e18, 0x6e19,
+  0x6e1b, 0x6e1c, 0x6e1e, 0x6e1f, 0x6e22, 0x6e26, 0x6e27, 0x6e28,
+  0x6e2a, 0x6e2c, 0x6e2e, 0x6e30, 0x6e31, 0x6e33, 0x6e35, 0x6e36,
+  0x6e37, 0x6e39, 0x6e3b, 0x6e3c, 0x6e3d, 0x6e3e, 0x6e3f, 0x6e40,
+  0x6e41, 0x6e42, 0x6e45, 0x6e46, 0x6e47, 0x6e48, 0x6e49, 0x6e4a,
+  0x6e4b, 0x6e4c, 0x6e4f, 0x6e50, 0x6e51, 0x6e52, 0x6e55, 0x6e57,
+  0x6e59, 0x6e5a, 0x6e5c, 0x6e5d, 0x6e5e, 0x6e60, 0x6e61, 0x6e62,
+  0x6e63, 0x6e64, 0x6e65, 0x6e66, 0x6e67, 0x6e68, 0x6e69, 0x6e6a,
+  0x6e6c, 0x6e6d, 0x6e6f, 0x6e70, 0x6e71, 0x6e72, 0x6e73, 0x6e74,
+  0x6e75, 0x6e76, 0x6e77, 0x6e78, 0x6e79, 0x6e7a, 0x6e7b, 0x6e7c,
+  0x6e7d, 0x6e80, 0x6e81, 0x6e82, 0x6e84, 0x6e87, 0x6e88, 0x6e8a,
+  0x6e8b, 0x6e8c, 0x6e8d, 0x6e8e, 0x6e91, 0x6e92, 0x6e93, 0x6e94,
+  0x6e95, 0x6e96, 0x6e97, 0x6e99, 0x6e9a, 0x6e9b, 0x6e9d, 0x6e9e,
+  0x6ea0, 0x6ea1, 0x6ea3, 0x6ea4, 0x6ea6, 0x6ea8, 0x6ea9, 0x6eab,
+  0x6eac, 0x6ead, 0x6eae, 0x6eb0, 0x6eb3, 0x6eb5, 0x6eb8, 0x6eb9,
+  0x6ebc, 0x6ebe, 0x6ebf, 0x6ec0, 0x6ec3, 0x6ec4, 0x6ec5, 0x6ec6,
+  0x6ec8, 0x6ec9, 0x6eca, 0x6ecc, 0x6ecd, 0x6ece, 0x6ed0, 0x6ed2,
+  0x6ed6, 0x6ed8, 0x6ed9, 0x6edb, 0x6edc, 0x6edd, 0x6ee3, 0x6ee7,
+  0x6eea, 0x6eeb, 0x6eec, 0x6eed, 0x6eee, 0x6eef,
+  /* 0x9d */
+  0x6ef0, 0x6ef1, 0x6ef2, 0x6ef3, 0x6ef5, 0x6ef6, 0x6ef7, 0x6ef8,
+  0x6efa, 0x6efb, 0x6efc, 0x6efd, 0x6efe, 0x6eff, 0x6f00, 0x6f01,
+  0x6f03, 0x6f04, 0x6f05, 0x6f07, 0x6f08, 0x6f0a, 0x6f0b, 0x6f0c,
+  0x6f0d, 0x6f0e, 0x6f10, 0x6f11, 0x6f12, 0x6f16, 0x6f17, 0x6f18,
+  0x6f19, 0x6f1a, 0x6f1b, 0x6f1c, 0x6f1d, 0x6f1e, 0x6f1f, 0x6f21,
+  0x6f22, 0x6f23, 0x6f25, 0x6f26, 0x6f27, 0x6f28, 0x6f2c, 0x6f2e,
+  0x6f30, 0x6f32, 0x6f34, 0x6f35, 0x6f37, 0x6f38, 0x6f39, 0x6f3a,
+  0x6f3b, 0x6f3c, 0x6f3d, 0x6f3f, 0x6f40, 0x6f41, 0x6f42, 0x6f43,
+  0x6f44, 0x6f45, 0x6f48, 0x6f49, 0x6f4a, 0x6f4c, 0x6f4e, 0x6f4f,
+  0x6f50, 0x6f51, 0x6f52, 0x6f53, 0x6f54, 0x6f55, 0x6f56, 0x6f57,
+  0x6f59, 0x6f5a, 0x6f5b, 0x6f5d, 0x6f5f, 0x6f60, 0x6f61, 0x6f63,
+  0x6f64, 0x6f65, 0x6f67, 0x6f68, 0x6f69, 0x6f6a, 0x6f6b, 0x6f6c,
+  0x6f6f, 0x6f70, 0x6f71, 0x6f73, 0x6f75, 0x6f76, 0x6f77, 0x6f79,
+  0x6f7b, 0x6f7d, 0x6f7e, 0x6f7f, 0x6f80, 0x6f81, 0x6f82, 0x6f83,
+  0x6f85, 0x6f86, 0x6f87, 0x6f8a, 0x6f8b, 0x6f8f, 0x6f90, 0x6f91,
+  0x6f92, 0x6f93, 0x6f94, 0x6f95, 0x6f96, 0x6f97, 0x6f98, 0x6f99,
+  0x6f9a, 0x6f9b, 0x6f9d, 0x6f9e, 0x6f9f, 0x6fa0, 0x6fa2, 0x6fa3,
+  0x6fa4, 0x6fa5, 0x6fa6, 0x6fa8, 0x6fa9, 0x6faa, 0x6fab, 0x6fac,
+  0x6fad, 0x6fae, 0x6faf, 0x6fb0, 0x6fb1, 0x6fb2, 0x6fb4, 0x6fb5,
+  0x6fb7, 0x6fb8, 0x6fba, 0x6fbb, 0x6fbc, 0x6fbd, 0x6fbe, 0x6fbf,
+  0x6fc1, 0x6fc3, 0x6fc4, 0x6fc5, 0x6fc6, 0x6fc7, 0x6fc8, 0x6fca,
+  0x6fcb, 0x6fcc, 0x6fcd, 0x6fce, 0x6fcf, 0x6fd0, 0x6fd3, 0x6fd4,
+  0x6fd5, 0x6fd6, 0x6fd7, 0x6fd8, 0x6fd9, 0x6fda, 0x6fdb, 0x6fdc,
+  0x6fdd, 0x6fdf, 0x6fe2, 0x6fe3, 0x6fe4, 0x6fe5,
+  /* 0x9e */
+  0x6fe6, 0x6fe7, 0x6fe8, 0x6fe9, 0x6fea, 0x6feb, 0x6fec, 0x6fed,
+  0x6ff0, 0x6ff1, 0x6ff2, 0x6ff3, 0x6ff4, 0x6ff5, 0x6ff6, 0x6ff7,
+  0x6ff8, 0x6ff9, 0x6ffa, 0x6ffb, 0x6ffc, 0x6ffd, 0x6ffe, 0x6fff,
+  0x7000, 0x7001, 0x7002, 0x7003, 0x7004, 0x7005, 0x7006, 0x7007,
+  0x7008, 0x7009, 0x700a, 0x700b, 0x700c, 0x700d, 0x700e, 0x700f,
+  0x7010, 0x7012, 0x7013, 0x7014, 0x7015, 0x7016, 0x7017, 0x7018,
+  0x7019, 0x701c, 0x701d, 0x701e, 0x701f, 0x7020, 0x7021, 0x7022,
+  0x7024, 0x7025, 0x7026, 0x7027, 0x7028, 0x7029, 0x702a, 0x702b,
+  0x702c, 0x702d, 0x702e, 0x702f, 0x7030, 0x7031, 0x7032, 0x7033,
+  0x7034, 0x7036, 0x7037, 0x7038, 0x703a, 0x703b, 0x703c, 0x703d,
+  0x703e, 0x703f, 0x7040, 0x7041, 0x7042, 0x7043, 0x7044, 0x7045,
+  0x7046, 0x7047, 0x7048, 0x7049, 0x704a, 0x704b, 0x704d, 0x704e,
+  0x7050, 0x7051, 0x7052, 0x7053, 0x7054, 0x7055, 0x7056, 0x7057,
+  0x7058, 0x7059, 0x705a, 0x705b, 0x705c, 0x705d, 0x705f, 0x7060,
+  0x7061, 0x7062, 0x7063, 0x7064, 0x7065, 0x7066, 0x7067, 0x7068,
+  0x7069, 0x706a, 0x706e, 0x7071, 0x7072, 0x7073, 0x7074, 0x7077,
+  0x7079, 0x707a, 0x707b, 0x707d, 0x7081, 0x7082, 0x7083, 0x7084,
+  0x7086, 0x7087, 0x7088, 0x708b, 0x708c, 0x708d, 0x708f, 0x7090,
+  0x7091, 0x7093, 0x7097, 0x7098, 0x709a, 0x709b, 0x709e, 0x709f,
+  0x70a0, 0x70a1, 0x70a2, 0x70a3, 0x70a4, 0x70a5, 0x70a6, 0x70a7,
+  0x70a8, 0x70a9, 0x70aa, 0x70b0, 0x70b2, 0x70b4, 0x70b5, 0x70b6,
+  0x70ba, 0x70be, 0x70bf, 0x70c4, 0x70c5, 0x70c6, 0x70c7, 0x70c9,
+  0x70cb, 0x70cc, 0x70cd, 0x70ce, 0x70cf, 0x70d0, 0x70d1, 0x70d2,
+  0x70d3, 0x70d4, 0x70d5, 0x70d6, 0x70d7, 0x70da,
+  /* 0x9f */
+  0x70dc, 0x70dd, 0x70de, 0x70e0, 0x70e1, 0x70e2, 0x70e3, 0x70e5,
+  0x70ea, 0x70ee, 0x70f0, 0x70f1, 0x70f2, 0x70f3, 0x70f4, 0x70f5,
+  0x70f6, 0x70f8, 0x70fa, 0x70fb, 0x70fc, 0x70fe, 0x70ff, 0x7100,
+  0x7101, 0x7102, 0x7103, 0x7104, 0x7105, 0x7106, 0x7107, 0x7108,
+  0x710b, 0x710c, 0x710d, 0x710e, 0x710f, 0x7111, 0x7112, 0x7114,
+  0x7117, 0x711b, 0x711c, 0x711d, 0x711e, 0x711f, 0x7120, 0x7121,
+  0x7122, 0x7123, 0x7124, 0x7125, 0x7127, 0x7128, 0x7129, 0x712a,
+  0x712b, 0x712c, 0x712d, 0x712e, 0x7132, 0x7133, 0x7134, 0x7135,
+  0x7137, 0x7138, 0x7139, 0x713a, 0x713b, 0x713c, 0x713d, 0x713e,
+  0x713f, 0x7140, 0x7141, 0x7142, 0x7143, 0x7144, 0x7146, 0x7147,
+  0x7148, 0x7149, 0x714b, 0x714d, 0x714f, 0x7150, 0x7151, 0x7152,
+  0x7153, 0x7154, 0x7155, 0x7156, 0x7157, 0x7158, 0x7159, 0x715a,
+  0x715b, 0x715d, 0x715f, 0x7160, 0x7161, 0x7162, 0x7163, 0x7165,
+  0x7169, 0x716a, 0x716b, 0x716c, 0x716d, 0x716f, 0x7170, 0x7171,
+  0x7174, 0x7175, 0x7176, 0x7177, 0x7179, 0x717b, 0x717c, 0x717e,
+  0x717f, 0x7180, 0x7181, 0x7182, 0x7183, 0x7185, 0x7186, 0x7187,
+  0x7188, 0x7189, 0x718b, 0x718c, 0x718d, 0x718e, 0x7190, 0x7191,
+  0x7192, 0x7193, 0x7195, 0x7196, 0x7197, 0x719a, 0x719b, 0x719c,
+  0x719d, 0x719e, 0x71a1, 0x71a2, 0x71a3, 0x71a4, 0x71a5, 0x71a6,
+  0x71a7, 0x71a9, 0x71aa, 0x71ab, 0x71ad, 0x71ae, 0x71af, 0x71b0,
+  0x71b1, 0x71b2, 0x71b4, 0x71b6, 0x71b7, 0x71b8, 0x71ba, 0x71bb,
+  0x71bc, 0x71bd, 0x71be, 0x71bf, 0x71c0, 0x71c1, 0x71c2, 0x71c4,
+  0x71c5, 0x71c6, 0x71c7, 0x71c8, 0x71c9, 0x71ca, 0x71cb, 0x71cc,
+  0x71cd, 0x71cf, 0x71d0, 0x71d1, 0x71d2, 0x71d3,
+  /* 0xa0 */
+  0x71d6, 0x71d7, 0x71d8, 0x71d9, 0x71da, 0x71db, 0x71dc, 0x71dd,
+  0x71de, 0x71df, 0x71e1, 0x71e2, 0x71e3, 0x71e4, 0x71e6, 0x71e8,
+  0x71e9, 0x71ea, 0x71eb, 0x71ec, 0x71ed, 0x71ef, 0x71f0, 0x71f1,
+  0x71f2, 0x71f3, 0x71f4, 0x71f5, 0x71f6, 0x71f7, 0x71f8, 0x71fa,
+  0x71fb, 0x71fc, 0x71fd, 0x71fe, 0x71ff, 0x7200, 0x7201, 0x7202,
+  0x7203, 0x7204, 0x7205, 0x7207, 0x7208, 0x7209, 0x720a, 0x720b,
+  0x720c, 0x720d, 0x720e, 0x720f, 0x7210, 0x7211, 0x7212, 0x7213,
+  0x7214, 0x7215, 0x7216, 0x7217, 0x7218, 0x7219, 0x721a, 0x721b,
+  0x721c, 0x721e, 0x721f, 0x7220, 0x7221, 0x7222, 0x7223, 0x7224,
+  0x7225, 0x7226, 0x7227, 0x7229, 0x722b, 0x722d, 0x722e, 0x722f,
+  0x7232, 0x7233, 0x7234, 0x723a, 0x723c, 0x723e, 0x7240, 0x7241,
+  0x7242, 0x7243, 0x7244, 0x7245, 0x7246, 0x7249, 0x724a, 0x724b,
+  0x724e, 0x724f, 0x7250, 0x7251, 0x7253, 0x7254, 0x7255, 0x7257,
+  0x7258, 0x725a, 0x725c, 0x725e, 0x7260, 0x7263, 0x7264, 0x7265,
+  0x7268, 0x726a, 0x726b, 0x726c, 0x726d, 0x7270, 0x7271, 0x7273,
+  0x7274, 0x7276, 0x7277, 0x7278, 0x727b, 0x727c, 0x727d, 0x7282,
+  0x7283, 0x7285, 0x7286, 0x7287, 0x7288, 0x7289, 0x728c, 0x728e,
+  0x7290, 0x7291, 0x7293, 0x7294, 0x7295, 0x7296, 0x7297, 0x7298,
+  0x7299, 0x729a, 0x729b, 0x729c, 0x729d, 0x729e, 0x72a0, 0x72a1,
+  0x72a2, 0x72a3, 0x72a4, 0x72a5, 0x72a6, 0x72a7, 0x72a8, 0x72a9,
+  0x72aa, 0x72ab, 0x72ae, 0x72b1, 0x72b2, 0x72b3, 0x72b5, 0x72ba,
+  0x72bb, 0x72bc, 0x72bd, 0x72be, 0x72bf, 0x72c0, 0x72c5, 0x72c6,
+  0x72c7, 0x72c9, 0x72ca, 0x72cb, 0x72cc, 0x72cf, 0x72d1, 0x72d3,
+  0x72d4, 0x72d5, 0x72d6, 0x72d8, 0x72da, 0x72db,
+  /* 0xa1 */
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0x3000, 0x3001, 0x3002, 0x00b7, 0x02c9, 0x02c7, 0x00a8, 0x3003,
+  0x3005, 0x2014, 0xff5e, 0x2016, 0x2026, 0x2018, 0x2019, 0x201c,
+  0x201d, 0x3014, 0x3015, 0x3008, 0x3009, 0x300a, 0x300b, 0x300c,
+  0x300d, 0x300e, 0x300f, 0x3016, 0x3017, 0x3010, 0x3011, 0x00b1,
+  0x00d7, 0x00f7, 0x2236, 0x2227, 0x2228, 0x2211, 0x220f, 0x222a,
+  0x2229, 0x2208, 0x2237, 0x221a, 0x22a5, 0x2225, 0x2220, 0x2312,
+  0x2299, 0x222b, 0x222e, 0x2261, 0x224c, 0x2248, 0x223d, 0x221d,
+  0x2260, 0x226e, 0x226f, 0x2264, 0x2265, 0x221e, 0x2235, 0x2234,
+  0x2642, 0x2640, 0x00b0, 0x2032, 0x2033, 0x2103, 0xff04, 0x00a4,
+  0xffe0, 0xffe1, 0x2030, 0x00a7, 0x2116, 0x2606, 0x2605, 0x25cb,
+  0x25cf, 0x25ce, 0x25c7, 0x25c6, 0x25a1, 0x25a0, 0x25b3, 0x25b2,
+  0x203b, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013,
+  /* 0xa2 */
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177,
+  0x2178, 0x2179, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0x2488, 0x2489, 0x248a, 0x248b, 0x248c, 0x248d, 0x248e, 0x248f,
+  0x2490, 0x2491, 0x2492, 0x2493, 0x2494, 0x2495, 0x2496, 0x2497,
+  0x2498, 0x2499, 0x249a, 0x249b, 0x2474, 0x2475, 0x2476, 0x2477,
+  0x2478, 0x2479, 0x247a, 0x247b, 0x247c, 0x247d, 0x247e, 0x247f,
+  0x2480, 0x2481, 0x2482, 0x2483, 0x2484, 0x2485, 0x2486, 0x2487,
+  0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467,
+  0x2468, 0x2469, 0xfffd, 0xfffd, 0x3220, 0x3221, 0x3222, 0x3223,
+  0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229, 0xfffd, 0xfffd,
+  0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167,
+  0x2168, 0x2169, 0x216a, 0x216b, 0xfffd, 0xfffd,
+  /* 0xa3 */
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xff01, 0xff02, 0xff03, 0xffe5, 0xff05, 0xff06, 0xff07, 0xff08,
+  0xff09, 0xff0a, 0xff0b, 0xff0c, 0xff0d, 0xff0e, 0xff0f, 0xff10,
+  0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18,
+  0xff19, 0xff1a, 0xff1b, 0xff1c, 0xff1d, 0xff1e, 0xff1f, 0xff20,
+  0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28,
+  0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30,
+  0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38,
+  0xff39, 0xff3a, 0xff3b, 0xff3c, 0xff3d, 0xff3e, 0xff3f, 0xff40,
+  0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48,
+  0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50,
+  0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, 0xff58,
+  0xff59, 0xff5a, 0xff5b, 0xff5c, 0xff5d, 0xffe3,
+  /* 0xa4 */
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048,
+  0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f, 0x3050,
+  0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058,
+  0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f, 0x3060,
+  0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068,
+  0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070,
+  0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078,
+  0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x307f, 0x3080,
+  0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088,
+  0x3089, 0x308a, 0x308b, 0x308c, 0x308d, 0x308e, 0x308f, 0x3090,
+  0x3091, 0x3092, 0x3093, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0xa5 */
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0x30a1, 0x30a2, 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7, 0x30a8,
+  0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad, 0x30ae, 0x30af, 0x30b0,
+  0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5, 0x30b6, 0x30b7, 0x30b8,
+  0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd, 0x30be, 0x30bf, 0x30c0,
+  0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5, 0x30c6, 0x30c7, 0x30c8,
+  0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf, 0x30d0,
+  0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5, 0x30d6, 0x30d7, 0x30d8,
+  0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd, 0x30de, 0x30df, 0x30e0,
+  0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7, 0x30e8,
+  0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ee, 0x30ef, 0x30f0,
+  0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5, 0x30f6, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0xa6 */
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398,
+  0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0,
+  0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8,
+  0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0,
+  0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfe35,
+  0xfe36, 0xfe39, 0xfe3a, 0xfe3f, 0xfe40, 0xfe3d, 0xfe3e, 0xfe41,
+  0xfe42, 0xfe43, 0xfe44, 0xfffd, 0xfffd, 0xfe3b, 0xfe3c, 0xfe37,
+  0xfe38, 0xfe31, 0xfffd, 0xfe33, 0xfe34, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0xa7 */
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 0x0416,
+  0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e,
+  0x041f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426,
+  0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e,
+  0x042f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436,
+  0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e,
+  0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446,
+  0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e,
+  0x044f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0xa8 */
+  0x02ca, 0x02cb, 0x02d9, 0x2013, 0x2015, 0x2025, 0x2035, 0x2105,
+  0x2109, 0x2196, 0x2197, 0x2198, 0x2199, 0x2215, 0x221f, 0x2223,
+  0x2252, 0x2266, 0x2267, 0x22bf, 0x2550, 0x2551, 0x2552, 0x2553,
+  0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255a, 0x255b,
+  0x255c, 0x255d, 0x255e, 0x255f, 0x2560, 0x2561, 0x2562, 0x2563,
+  0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b,
+  0x256c, 0x256d, 0x256e, 0x256f, 0x2570, 0x2571, 0x2572, 0x2573,
+  0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586, 0x2587, 0x2588,
+  0x2589, 0x258a, 0x258b, 0x258c, 0x258d, 0x258e, 0x258f, 0x2593,
+  0x2594, 0x2595, 0x25bc, 0x25bd, 0x25e2, 0x25e3, 0x25e4, 0x25e5,
+  0x2609, 0x2295, 0x3012, 0x301d, 0x301e, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0x0101, 0x00e1, 0x01ce, 0x00e0, 0x0113, 0x00e9, 0x011b, 0x00e8,
+  0x012b, 0x00ed, 0x01d0, 0x00ec, 0x014d, 0x00f3, 0x01d2, 0x00f2,
+  0x016b, 0x00fa, 0x01d4, 0x00f9, 0x01d6, 0x01d8, 0x01da, 0x01dc,
+  0x00fc, 0x00ea, 0x0251, 0xfffd, 0x0144, 0x0148, 0xfffd, 0x0261,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x3105, 0x3106, 0x3107, 0x3108,
+  0x3109, 0x310a, 0x310b, 0x310c, 0x310d, 0x310e, 0x310f, 0x3110,
+  0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117, 0x3118,
+  0x3119, 0x311a, 0x311b, 0x311c, 0x311d, 0x311e, 0x311f, 0x3120,
+  0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128,
+  0x3129, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0xa9 */
+  0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027, 0x3028,
+  0x3029, 0x32a3, 0x338e, 0x338f, 0x339c, 0x339d, 0x339e, 0x33a1,
+  0x33c4, 0x33ce, 0x33d1, 0x33d2, 0x33d5, 0xfe30, 0xffe2, 0xffe4,
+  0xfffd, 0x2121, 0x3231, 0xfffd, 0x2010, 0xfffd, 0xfffd, 0xfffd,
+  0x30fc, 0x309b, 0x309c, 0x30fd, 0x30fe, 0x3006, 0x309d, 0x309e,
+  0xfe49, 0xfe4a, 0xfe4b, 0xfe4c, 0xfe4d, 0xfe4e, 0xfe4f, 0xfe50,
+  0xfe51, 0xfe52, 0xfe54, 0xfe55, 0xfe56, 0xfe57, 0xfe59, 0xfe5a,
+  0xfe5b, 0xfe5c, 0xfe5d, 0xfe5e, 0xfe5f, 0xfe60, 0xfe61, 0xfe62,
+  0xfe63, 0xfe64, 0xfe65, 0xfe66, 0xfe68, 0xfe69, 0xfe6a, 0xfe6b,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x3007, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0x2500, 0x2501, 0x2502, 0x2503, 0x2504,
+  0x2505, 0x2506, 0x2507, 0x2508, 0x2509, 0x250a, 0x250b, 0x250c,
+  0x250d, 0x250e, 0x250f, 0x2510, 0x2511, 0x2512, 0x2513, 0x2514,
+  0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x251a, 0x251b, 0x251c,
+  0x251d, 0x251e, 0x251f, 0x2520, 0x2521, 0x2522, 0x2523, 0x2524,
+  0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252a, 0x252b, 0x252c,
+  0x252d, 0x252e, 0x252f, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534,
+  0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253a, 0x253b, 0x253c,
+  0x253d, 0x253e, 0x253f, 0x2540, 0x2541, 0x2542, 0x2543, 0x2544,
+  0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254a, 0x254b, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0xaa */
+  0x72dc, 0x72dd, 0x72df, 0x72e2, 0x72e3, 0x72e4, 0x72e5, 0x72e6,
+  0x72e7, 0x72ea, 0x72eb, 0x72f5, 0x72f6, 0x72f9, 0x72fd, 0x72fe,
+  0x72ff, 0x7300, 0x7302, 0x7304, 0x7305, 0x7306, 0x7307, 0x7308,
+  0x7309, 0x730b, 0x730c, 0x730d, 0x730f, 0x7310, 0x7311, 0x7312,
+  0x7314, 0x7318, 0x7319, 0x731a, 0x731f, 0x7320, 0x7323, 0x7324,
+  0x7326, 0x7327, 0x7328, 0x732d, 0x732f, 0x7330, 0x7332, 0x7333,
+  0x7335, 0x7336, 0x733a, 0x733b, 0x733c, 0x733d, 0x7340, 0x7341,
+  0x7342, 0x7343, 0x7344, 0x7345, 0x7346, 0x7347, 0x7348, 0x7349,
+  0x734a, 0x734b, 0x734c, 0x734e, 0x734f, 0x7351, 0x7353, 0x7354,
+  0x7355, 0x7356, 0x7358, 0x7359, 0x735a, 0x735b, 0x735c, 0x735d,
+  0x735e, 0x735f, 0x7361, 0x7362, 0x7363, 0x7364, 0x7365, 0x7366,
+  0x7367, 0x7368, 0x7369, 0x736a, 0x736b, 0x736e, 0x7370, 0x7371,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0xab */
+  0x7372, 0x7373, 0x7374, 0x7375, 0x7376, 0x7377, 0x7378, 0x7379,
+  0x737a, 0x737b, 0x737c, 0x737d, 0x737f, 0x7380, 0x7381, 0x7382,
+  0x7383, 0x7385, 0x7386, 0x7388, 0x738a, 0x738c, 0x738d, 0x738f,
+  0x7390, 0x7392, 0x7393, 0x7394, 0x7395, 0x7397, 0x7398, 0x7399,
+  0x739a, 0x739c, 0x739d, 0x739e, 0x73a0, 0x73a1, 0x73a3, 0x73a4,
+  0x73a5, 0x73a6, 0x73a7, 0x73a8, 0x73aa, 0x73ac, 0x73ad, 0x73b1,
+  0x73b4, 0x73b5, 0x73b6, 0x73b8, 0x73b9, 0x73bc, 0x73bd, 0x73be,
+  0x73bf, 0x73c1, 0x73c3, 0x73c4, 0x73c5, 0x73c6, 0x73c7, 0x73cb,
+  0x73cc, 0x73ce, 0x73d2, 0x73d3, 0x73d4, 0x73d5, 0x73d6, 0x73d7,
+  0x73d8, 0x73da, 0x73db, 0x73dc, 0x73dd, 0x73df, 0x73e1, 0x73e2,
+  0x73e3, 0x73e4, 0x73e6, 0x73e8, 0x73ea, 0x73eb, 0x73ec, 0x73ee,
+  0x73ef, 0x73f0, 0x73f1, 0x73f3, 0x73f4, 0x73f5, 0x73f6, 0x73f7,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0xac */
+  0x73f8, 0x73f9, 0x73fa, 0x73fb, 0x73fc, 0x73fd, 0x73fe, 0x73ff,
+  0x7400, 0x7401, 0x7402, 0x7404, 0x7407, 0x7408, 0x740b, 0x740c,
+  0x740d, 0x740e, 0x7411, 0x7412, 0x7413, 0x7414, 0x7415, 0x7416,
+  0x7417, 0x7418, 0x7419, 0x741c, 0x741d, 0x741e, 0x741f, 0x7420,
+  0x7421, 0x7423, 0x7424, 0x7427, 0x7429, 0x742b, 0x742d, 0x742f,
+  0x7431, 0x7432, 0x7437, 0x7438, 0x7439, 0x743a, 0x743b, 0x743d,
+  0x743e, 0x743f, 0x7440, 0x7442, 0x7443, 0x7444, 0x7445, 0x7446,
+  0x7447, 0x7448, 0x7449, 0x744a, 0x744b, 0x744c, 0x744d, 0x744e,
+  0x744f, 0x7450, 0x7451, 0x7452, 0x7453, 0x7454, 0x7456, 0x7458,
+  0x745d, 0x7460, 0x7461, 0x7462, 0x7463, 0x7464, 0x7465, 0x7466,
+  0x7467, 0x7468, 0x7469, 0x746a, 0x746b, 0x746c, 0x746e, 0x746f,
+  0x7471, 0x7472, 0x7473, 0x7474, 0x7475, 0x7478, 0x7479, 0x747a,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0xad */
+  0x747b, 0x747c, 0x747d, 0x747f, 0x7482, 0x7484, 0x7485, 0x7486,
+  0x7488, 0x7489, 0x748a, 0x748c, 0x748d, 0x748f, 0x7491, 0x7492,
+  0x7493, 0x7494, 0x7495, 0x7496, 0x7497, 0x7498, 0x7499, 0x749a,
+  0x749b, 0x749d, 0x749f, 0x74a0, 0x74a1, 0x74a2, 0x74a3, 0x74a4,
+  0x74a5, 0x74a6, 0x74aa, 0x74ab, 0x74ac, 0x74ad, 0x74ae, 0x74af,
+  0x74b0, 0x74b1, 0x74b2, 0x74b3, 0x74b4, 0x74b5, 0x74b6, 0x74b7,
+  0x74b8, 0x74b9, 0x74bb, 0x74bc, 0x74bd, 0x74be, 0x74bf, 0x74c0,
+  0x74c1, 0x74c2, 0x74c3, 0x74c4, 0x74c5, 0x74c6, 0x74c7, 0x74c8,
+  0x74c9, 0x74ca, 0x74cb, 0x74cc, 0x74cd, 0x74ce, 0x74cf, 0x74d0,
+  0x74d1, 0x74d3, 0x74d4, 0x74d5, 0x74d6, 0x74d7, 0x74d8, 0x74d9,
+  0x74da, 0x74db, 0x74dd, 0x74df, 0x74e1, 0x74e5, 0x74e7, 0x74e8,
+  0x74e9, 0x74ea, 0x74eb, 0x74ec, 0x74ed, 0x74f0, 0x74f1, 0x74f2,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0xae */
+  0x74f3, 0x74f5, 0x74f8, 0x74f9, 0x74fa, 0x74fb, 0x74fc, 0x74fd,
+  0x74fe, 0x7500, 0x7501, 0x7502, 0x7503, 0x7505, 0x7506, 0x7507,
+  0x7508, 0x7509, 0x750a, 0x750b, 0x750c, 0x750e, 0x7510, 0x7512,
+  0x7514, 0x7515, 0x7516, 0x7517, 0x751b, 0x751d, 0x751e, 0x7520,
+  0x7521, 0x7522, 0x7523, 0x7524, 0x7526, 0x7527, 0x752a, 0x752e,
+  0x7534, 0x7536, 0x7539, 0x753c, 0x753d, 0x753f, 0x7541, 0x7542,
+  0x7543, 0x7544, 0x7546, 0x7547, 0x7549, 0x754a, 0x754d, 0x7550,
+  0x7551, 0x7552, 0x7553, 0x7555, 0x7556, 0x7557, 0x7558, 0x755d,
+  0x755e, 0x755f, 0x7560, 0x7561, 0x7562, 0x7563, 0x7564, 0x7567,
+  0x7568, 0x7569, 0x756b, 0x756c, 0x756d, 0x756e, 0x756f, 0x7570,
+  0x7571, 0x7573, 0x7575, 0x7576, 0x7577, 0x757a, 0x757b, 0x757c,
+  0x757d, 0x757e, 0x7580, 0x7581, 0x7582, 0x7584, 0x7585, 0x7587,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0xaf */
+  0x7588, 0x7589, 0x758a, 0x758c, 0x758d, 0x758e, 0x7590, 0x7593,
+  0x7595, 0x7598, 0x759b, 0x759c, 0x759e, 0x75a2, 0x75a6, 0x75a7,
+  0x75a8, 0x75a9, 0x75aa, 0x75ad, 0x75b6, 0x75b7, 0x75ba, 0x75bb,
+  0x75bf, 0x75c0, 0x75c1, 0x75c6, 0x75cb, 0x75cc, 0x75ce, 0x75cf,
+  0x75d0, 0x75d1, 0x75d3, 0x75d7, 0x75d9, 0x75da, 0x75dc, 0x75dd,
+  0x75df, 0x75e0, 0x75e1, 0x75e5, 0x75e9, 0x75ec, 0x75ed, 0x75ee,
+  0x75ef, 0x75f2, 0x75f3, 0x75f5, 0x75f6, 0x75f7, 0x75f8, 0x75fa,
+  0x75fb, 0x75fd, 0x75fe, 0x7602, 0x7604, 0x7606, 0x7607, 0x7608,
+  0x7609, 0x760b, 0x760d, 0x760e, 0x760f, 0x7611, 0x7612, 0x7613,
+  0x7614, 0x7616, 0x761a, 0x761c, 0x761d, 0x761e, 0x7621, 0x7623,
+  0x7627, 0x7628, 0x762c, 0x762e, 0x762f, 0x7631, 0x7632, 0x7636,
+  0x7637, 0x7639, 0x763a, 0x763b, 0x763d, 0x7641, 0x7642, 0x7644,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0xb0 */
+  0x7645, 0x7646, 0x7647, 0x7648, 0x7649, 0x764a, 0x764b, 0x764e,
+  0x764f, 0x7650, 0x7651, 0x7652, 0x7653, 0x7655, 0x7657, 0x7658,
+  0x7659, 0x765a, 0x765b, 0x765d, 0x765f, 0x7660, 0x7661, 0x7662,
+  0x7664, 0x7665, 0x7666, 0x7667, 0x7668, 0x7669, 0x766a, 0x766c,
+  0x766d, 0x766e, 0x7670, 0x7671, 0x7672, 0x7673, 0x7674, 0x7675,
+  0x7676, 0x7677, 0x7679, 0x767a, 0x767c, 0x767f, 0x7680, 0x7681,
+  0x7683, 0x7685, 0x7689, 0x768a, 0x768c, 0x768d, 0x768f, 0x7690,
+  0x7692, 0x7694, 0x7695, 0x7697, 0x7698, 0x769a, 0x769b, 0x769c,
+  0x769d, 0x769e, 0x769f, 0x76a0, 0x76a1, 0x76a2, 0x76a3, 0x76a5,
+  0x76a6, 0x76a7, 0x76a8, 0x76a9, 0x76aa, 0x76ab, 0x76ac, 0x76ad,
+  0x76af, 0x76b0, 0x76b3, 0x76b5, 0x76b6, 0x76b7, 0x76b8, 0x76b9,
+  0x76ba, 0x76bb, 0x76bc, 0x76bd, 0x76be, 0x76c0, 0x76c1, 0x76c3,
+  0x554a, 0x963f, 0x57c3, 0x6328, 0x54ce, 0x5509, 0x54c0, 0x7691,
+  0x764c, 0x853c, 0x77ee, 0x827e, 0x788d, 0x7231, 0x9698, 0x978d,
+  0x6c28, 0x5b89, 0x4ffa, 0x6309, 0x6697, 0x5cb8, 0x80fa, 0x6848,
+  0x80ae, 0x6602, 0x76ce, 0x51f9, 0x6556, 0x71ac, 0x7ff1, 0x8884,
+  0x50b2, 0x5965, 0x61ca, 0x6fb3, 0x82ad, 0x634c, 0x6252, 0x53ed,
+  0x5427, 0x7b06, 0x516b, 0x75a4, 0x5df4, 0x62d4, 0x8dcb, 0x9776,
+  0x628a, 0x8019, 0x575d, 0x9738, 0x7f62, 0x7238, 0x767d, 0x67cf,
+  0x767e, 0x6446, 0x4f70, 0x8d25, 0x62dc, 0x7a17, 0x6591, 0x73ed,
+  0x642c, 0x6273, 0x822c, 0x9881, 0x677f, 0x7248, 0x626e, 0x62cc,
+  0x4f34, 0x74e3, 0x534a, 0x529e, 0x7eca, 0x90a6, 0x5e2e, 0x6886,
+  0x699c, 0x8180, 0x7ed1, 0x68d2, 0x78c5, 0x868c, 0x9551, 0x508d,
+  0x8c24, 0x82de, 0x80de, 0x5305, 0x8912, 0x5265,
+  /* 0xb1 */
+  0x76c4, 0x76c7, 0x76c9, 0x76cb, 0x76cc, 0x76d3, 0x76d5, 0x76d9,
+  0x76da, 0x76dc, 0x76dd, 0x76de, 0x76e0, 0x76e1, 0x76e2, 0x76e3,
+  0x76e4, 0x76e6, 0x76e7, 0x76e8, 0x76e9, 0x76ea, 0x76eb, 0x76ec,
+  0x76ed, 0x76f0, 0x76f3, 0x76f5, 0x76f6, 0x76f7, 0x76fa, 0x76fb,
+  0x76fd, 0x76ff, 0x7700, 0x7702, 0x7703, 0x7705, 0x7706, 0x770a,
+  0x770c, 0x770e, 0x770f, 0x7710, 0x7711, 0x7712, 0x7713, 0x7714,
+  0x7715, 0x7716, 0x7717, 0x7718, 0x771b, 0x771c, 0x771d, 0x771e,
+  0x7721, 0x7723, 0x7724, 0x7725, 0x7727, 0x772a, 0x772b, 0x772c,
+  0x772e, 0x7730, 0x7731, 0x7732, 0x7733, 0x7734, 0x7739, 0x773b,
+  0x773d, 0x773e, 0x773f, 0x7742, 0x7744, 0x7745, 0x7746, 0x7748,
+  0x7749, 0x774a, 0x774b, 0x774c, 0x774d, 0x774e, 0x774f, 0x7752,
+  0x7753, 0x7754, 0x7755, 0x7756, 0x7757, 0x7758, 0x7759, 0x775c,
+  0x8584, 0x96f9, 0x4fdd, 0x5821, 0x9971, 0x5b9d, 0x62b1, 0x62a5,
+  0x66b4, 0x8c79, 0x9c8d, 0x7206, 0x676f, 0x7891, 0x60b2, 0x5351,
+  0x5317, 0x8f88, 0x80cc, 0x8d1d, 0x94a1, 0x500d, 0x72c8, 0x5907,
+  0x60eb, 0x7119, 0x88ab, 0x5954, 0x82ef, 0x672c, 0x7b28, 0x5d29,
+  0x7ef7, 0x752d, 0x6cf5, 0x8e66, 0x8ff8, 0x903c, 0x9f3b, 0x6bd4,
+  0x9119, 0x7b14, 0x5f7c, 0x78a7, 0x84d6, 0x853d, 0x6bd5, 0x6bd9,
+  0x6bd6, 0x5e01, 0x5e87, 0x75f9, 0x95ed, 0x655d, 0x5f0a, 0x5fc5,
+  0x8f9f, 0x58c1, 0x81c2, 0x907f, 0x965b, 0x97ad, 0x8fb9, 0x7f16,
+  0x8d2c, 0x6241, 0x4fbf, 0x53d8, 0x535e, 0x8fa8, 0x8fa9, 0x8fab,
+  0x904d, 0x6807, 0x5f6a, 0x8198, 0x8868, 0x9cd6, 0x618b, 0x522b,
+  0x762a, 0x5f6c, 0x658c, 0x6fd2, 0x6ee8, 0x5bbe, 0x6448, 0x5175,
+  0x51b0, 0x67c4, 0x4e19, 0x79c9, 0x997c, 0x70b3,
+  /* 0xb2 */
+  0x775d, 0x775e, 0x775f, 0x7760, 0x7764, 0x7767, 0x7769, 0x776a,
+  0x776d, 0x776e, 0x776f, 0x7770, 0x7771, 0x7772, 0x7773, 0x7774,
+  0x7775, 0x7776, 0x7777, 0x7778, 0x777a, 0x777b, 0x777c, 0x7781,
+  0x7782, 0x7783, 0x7786, 0x7787, 0x7788, 0x7789, 0x778a, 0x778b,
+  0x778f, 0x7790, 0x7793, 0x7794, 0x7795, 0x7796, 0x7797, 0x7798,
+  0x7799, 0x779a, 0x779b, 0x779c, 0x779d, 0x779e, 0x77a1, 0x77a3,
+  0x77a4, 0x77a6, 0x77a8, 0x77ab, 0x77ad, 0x77ae, 0x77af, 0x77b1,
+  0x77b2, 0x77b4, 0x77b6, 0x77b7, 0x77b8, 0x77b9, 0x77ba, 0x77bc,
+  0x77be, 0x77c0, 0x77c1, 0x77c2, 0x77c3, 0x77c4, 0x77c5, 0x77c6,
+  0x77c7, 0x77c8, 0x77c9, 0x77ca, 0x77cb, 0x77cc, 0x77ce, 0x77cf,
+  0x77d0, 0x77d1, 0x77d2, 0x77d3, 0x77d4, 0x77d5, 0x77d6, 0x77d8,
+  0x77d9, 0x77da, 0x77dd, 0x77de, 0x77df, 0x77e0, 0x77e1, 0x77e4,
+  0x75c5, 0x5e76, 0x73bb, 0x83e0, 0x64ad, 0x62e8, 0x94b5, 0x6ce2,
+  0x535a, 0x52c3, 0x640f, 0x94c2, 0x7b94, 0x4f2f, 0x5e1b, 0x8236,
+  0x8116, 0x818a, 0x6e24, 0x6cca, 0x9a73, 0x6355, 0x535c, 0x54fa,
+  0x8865, 0x57e0, 0x4e0d, 0x5e03, 0x6b65, 0x7c3f, 0x90e8, 0x6016,
+  0x64e6, 0x731c, 0x88c1, 0x6750, 0x624d, 0x8d22, 0x776c, 0x8e29,
+  0x91c7, 0x5f69, 0x83dc, 0x8521, 0x9910, 0x53c2, 0x8695, 0x6b8b,
+  0x60ed, 0x60e8, 0x707f, 0x82cd, 0x8231, 0x4ed3, 0x6ca7, 0x85cf,
+  0x64cd, 0x7cd9, 0x69fd, 0x66f9, 0x8349, 0x5395, 0x7b56, 0x4fa7,
+  0x518c, 0x6d4b, 0x5c42, 0x8e6d, 0x63d2, 0x53c9, 0x832c, 0x8336,
+  0x67e5, 0x78b4, 0x643d, 0x5bdf, 0x5c94, 0x5dee, 0x8be7, 0x62c6,
+  0x67f4, 0x8c7a, 0x6400, 0x63ba, 0x8749, 0x998b, 0x8c17, 0x7f20,
+  0x94f2, 0x4ea7, 0x9610, 0x98a4, 0x660c, 0x7316,
+  /* 0xb3 */
+  0x77e6, 0x77e8, 0x77ea, 0x77ef, 0x77f0, 0x77f1, 0x77f2, 0x77f4,
+  0x77f5, 0x77f7, 0x77f9, 0x77fa, 0x77fb, 0x77fc, 0x7803, 0x7804,
+  0x7805, 0x7806, 0x7807, 0x7808, 0x780a, 0x780b, 0x780e, 0x780f,
+  0x7810, 0x7813, 0x7815, 0x7819, 0x781b, 0x781e, 0x7820, 0x7821,
+  0x7822, 0x7824, 0x7828, 0x782a, 0x782b, 0x782e, 0x782f, 0x7831,
+  0x7832, 0x7833, 0x7835, 0x7836, 0x783d, 0x783f, 0x7841, 0x7842,
+  0x7843, 0x7844, 0x7846, 0x7848, 0x7849, 0x784a, 0x784b, 0x784d,
+  0x784f, 0x7851, 0x7853, 0x7854, 0x7858, 0x7859, 0x785a, 0x785b,
+  0x785c, 0x785e, 0x785f, 0x7860, 0x7861, 0x7862, 0x7863, 0x7864,
+  0x7865, 0x7866, 0x7867, 0x7868, 0x7869, 0x786f, 0x7870, 0x7871,
+  0x7872, 0x7873, 0x7874, 0x7875, 0x7876, 0x7878, 0x7879, 0x787a,
+  0x787b, 0x787d, 0x787e, 0x787f, 0x7880, 0x7881, 0x7882, 0x7883,
+  0x573a, 0x5c1d, 0x5e38, 0x957f, 0x507f, 0x80a0, 0x5382, 0x655e,
+  0x7545, 0x5531, 0x5021, 0x8d85, 0x6284, 0x949e, 0x671d, 0x5632,
+  0x6f6e, 0x5de2, 0x5435, 0x7092, 0x8f66, 0x626f, 0x64a4, 0x63a3,
+  0x5f7b, 0x6f88, 0x90f4, 0x81e3, 0x8fb0, 0x5c18, 0x6668, 0x5ff1,
+  0x6c89, 0x9648, 0x8d81, 0x886c, 0x6491, 0x79f0, 0x57ce, 0x6a59,
+  0x6210, 0x5448, 0x4e58, 0x7a0b, 0x60e9, 0x6f84, 0x8bda, 0x627f,
+  0x901e, 0x9a8b, 0x79e4, 0x5403, 0x75f4, 0x6301, 0x5319, 0x6c60,
+  0x8fdf, 0x5f1b, 0x9a70, 0x803b, 0x9f7f, 0x4f88, 0x5c3a, 0x8d64,
+  0x7fc5, 0x65a5, 0x70bd, 0x5145, 0x51b2, 0x866b, 0x5d07, 0x5ba0,
+  0x62bd, 0x916c, 0x7574, 0x8e0c, 0x7a20, 0x6101, 0x7b79, 0x4ec7,
+  0x7ef8, 0x7785, 0x4e11, 0x81ed, 0x521d, 0x51fa, 0x6a71, 0x53a8,
+  0x8e87, 0x9504, 0x96cf, 0x6ec1, 0x9664, 0x695a,
+  /* 0xb4 */
+  0x7884, 0x7885, 0x7886, 0x7888, 0x788a, 0x788b, 0x788f, 0x7890,
+  0x7892, 0x7894, 0x7895, 0x7896, 0x7899, 0x789d, 0x789e, 0x78a0,
+  0x78a2, 0x78a4, 0x78a6, 0x78a8, 0x78a9, 0x78aa, 0x78ab, 0x78ac,
+  0x78ad, 0x78ae, 0x78af, 0x78b5, 0x78b6, 0x78b7, 0x78b8, 0x78ba,
+  0x78bb, 0x78bc, 0x78bd, 0x78bf, 0x78c0, 0x78c2, 0x78c3, 0x78c4,
+  0x78c6, 0x78c7, 0x78c8, 0x78cc, 0x78cd, 0x78ce, 0x78cf, 0x78d1,
+  0x78d2, 0x78d3, 0x78d6, 0x78d7, 0x78d8, 0x78da, 0x78db, 0x78dc,
+  0x78dd, 0x78de, 0x78df, 0x78e0, 0x78e1, 0x78e2, 0x78e3, 0x78e4,
+  0x78e5, 0x78e6, 0x78e7, 0x78e9, 0x78ea, 0x78eb, 0x78ed, 0x78ee,
+  0x78ef, 0x78f0, 0x78f1, 0x78f3, 0x78f5, 0x78f6, 0x78f8, 0x78f9,
+  0x78fb, 0x78fc, 0x78fd, 0x78fe, 0x78ff, 0x7900, 0x7902, 0x7903,
+  0x7904, 0x7906, 0x7907, 0x7908, 0x7909, 0x790a, 0x790b, 0x790c,
+  0x7840, 0x50a8, 0x77d7, 0x6410, 0x89e6, 0x5904, 0x63e3, 0x5ddd,
+  0x7a7f, 0x693d, 0x4f20, 0x8239, 0x5598, 0x4e32, 0x75ae, 0x7a97,
+  0x5e62, 0x5e8a, 0x95ef, 0x521b, 0x5439, 0x708a, 0x6376, 0x9524,
+  0x5782, 0x6625, 0x693f, 0x9187, 0x5507, 0x6df3, 0x7eaf, 0x8822,
+  0x6233, 0x7ef0, 0x75b5, 0x8328, 0x78c1, 0x96cc, 0x8f9e, 0x6148,
+  0x74f7, 0x8bcd, 0x6b64, 0x523a, 0x8d50, 0x6b21, 0x806a, 0x8471,
+  0x56f1, 0x5306, 0x4ece, 0x4e1b, 0x51d1, 0x7c97, 0x918b, 0x7c07,
+  0x4fc3, 0x8e7f, 0x7be1, 0x7a9c, 0x6467, 0x5d14, 0x50ac, 0x8106,
+  0x7601, 0x7cb9, 0x6dec, 0x7fe0, 0x6751, 0x5b58, 0x5bf8, 0x78cb,
+  0x64ae, 0x6413, 0x63aa, 0x632b, 0x9519, 0x642d, 0x8fbe, 0x7b54,
+  0x7629, 0x6253, 0x5927, 0x5446, 0x6b79, 0x50a3, 0x6234, 0x5e26,
+  0x6b86, 0x4ee3, 0x8d37, 0x888b, 0x5f85, 0x902e,
+  /* 0xb5 */
+  0x790d, 0x790e, 0x790f, 0x7910, 0x7911, 0x7912, 0x7914, 0x7915,
+  0x7916, 0x7917, 0x7918, 0x7919, 0x791a, 0x791b, 0x791c, 0x791d,
+  0x791f, 0x7920, 0x7921, 0x7922, 0x7923, 0x7925, 0x7926, 0x7927,
+  0x7928, 0x7929, 0x792a, 0x792b, 0x792c, 0x792d, 0x792e, 0x792f,
+  0x7930, 0x7931, 0x7932, 0x7933, 0x7935, 0x7936, 0x7937, 0x7938,
+  0x7939, 0x793d, 0x793f, 0x7942, 0x7943, 0x7944, 0x7945, 0x7947,
+  0x794a, 0x794b, 0x794c, 0x794d, 0x794e, 0x794f, 0x7950, 0x7951,
+  0x7952, 0x7954, 0x7955, 0x7958, 0x7959, 0x7961, 0x7963, 0x7964,
+  0x7966, 0x7969, 0x796a, 0x796b, 0x796c, 0x796e, 0x7970, 0x7971,
+  0x7972, 0x7973, 0x7974, 0x7975, 0x7976, 0x7979, 0x797b, 0x797c,
+  0x797d, 0x797e, 0x797f, 0x7982, 0x7983, 0x7986, 0x7987, 0x7988,
+  0x7989, 0x798b, 0x798c, 0x798d, 0x798e, 0x7990, 0x7991, 0x7992,
+  0x6020, 0x803d, 0x62c5, 0x4e39, 0x5355, 0x90f8, 0x63b8, 0x80c6,
+  0x65e6, 0x6c2e, 0x4f46, 0x60ee, 0x6de1, 0x8bde, 0x5f39, 0x86cb,
+  0x5f53, 0x6321, 0x515a, 0x8361, 0x6863, 0x5200, 0x6363, 0x8e48,
+  0x5012, 0x5c9b, 0x7977, 0x5bfc, 0x5230, 0x7a3b, 0x60bc, 0x9053,
+  0x76d7, 0x5fb7, 0x5f97, 0x7684, 0x8e6c, 0x706f, 0x767b, 0x7b49,
+  0x77aa, 0x51f3, 0x9093, 0x5824, 0x4f4e, 0x6ef4, 0x8fea, 0x654c,
+  0x7b1b, 0x72c4, 0x6da4, 0x7fdf, 0x5ae1, 0x62b5, 0x5e95, 0x5730,
+  0x8482, 0x7b2c, 0x5e1d, 0x5f1f, 0x9012, 0x7f14, 0x98a0, 0x6382,
+  0x6ec7, 0x7898, 0x70b9, 0x5178, 0x975b, 0x57ab, 0x7535, 0x4f43,
+  0x7538, 0x5e97, 0x60e6, 0x5960, 0x6dc0, 0x6bbf, 0x7889, 0x53fc,
+  0x96d5, 0x51cb, 0x5201, 0x6389, 0x540a, 0x9493, 0x8c03, 0x8dcc,
+  0x7239, 0x789f, 0x8776, 0x8fed, 0x8c0d, 0x53e0,
+  /* 0xb6 */
+  0x7993, 0x7994, 0x7995, 0x7996, 0x7997, 0x7998, 0x7999, 0x799b,
+  0x799c, 0x799d, 0x799e, 0x799f, 0x79a0, 0x79a1, 0x79a2, 0x79a3,
+  0x79a4, 0x79a5, 0x79a6, 0x79a8, 0x79a9, 0x79aa, 0x79ab, 0x79ac,
+  0x79ad, 0x79ae, 0x79af, 0x79b0, 0x79b1, 0x79b2, 0x79b4, 0x79b5,
+  0x79b6, 0x79b7, 0x79b8, 0x79bc, 0x79bf, 0x79c2, 0x79c4, 0x79c5,
+  0x79c7, 0x79c8, 0x79ca, 0x79cc, 0x79ce, 0x79cf, 0x79d0, 0x79d3,
+  0x79d4, 0x79d6, 0x79d7, 0x79d9, 0x79da, 0x79db, 0x79dc, 0x79dd,
+  0x79de, 0x79e0, 0x79e1, 0x79e2, 0x79e5, 0x79e8, 0x79ea, 0x79ec,
+  0x79ee, 0x79f1, 0x79f2, 0x79f3, 0x79f4, 0x79f5, 0x79f6, 0x79f7,
+  0x79f9, 0x79fa, 0x79fc, 0x79fe, 0x79ff, 0x7a01, 0x7a04, 0x7a05,
+  0x7a07, 0x7a08, 0x7a09, 0x7a0a, 0x7a0c, 0x7a0f, 0x7a10, 0x7a11,
+  0x7a12, 0x7a13, 0x7a15, 0x7a16, 0x7a18, 0x7a19, 0x7a1b, 0x7a1c,
+  0x4e01, 0x76ef, 0x53ee, 0x9489, 0x9876, 0x9f0e, 0x952d, 0x5b9a,
+  0x8ba2, 0x4e22, 0x4e1c, 0x51ac, 0x8463, 0x61c2, 0x52a8, 0x680b,
+  0x4f97, 0x606b, 0x51bb, 0x6d1e, 0x515c, 0x6296, 0x6597, 0x9661,
+  0x8c46, 0x9017, 0x75d8, 0x90fd, 0x7763, 0x6bd2, 0x728a, 0x72ec,
+  0x8bfb, 0x5835, 0x7779, 0x8d4c, 0x675c, 0x9540, 0x809a, 0x5ea6,
+  0x6e21, 0x5992, 0x7aef, 0x77ed, 0x953b, 0x6bb5, 0x65ad, 0x7f0e,
+  0x5806, 0x5151, 0x961f, 0x5bf9, 0x58a9, 0x5428, 0x8e72, 0x6566,
+  0x987f, 0x56e4, 0x949d, 0x76fe, 0x9041, 0x6387, 0x54c6, 0x591a,
+  0x593a, 0x579b, 0x8eb2, 0x6735, 0x8dfa, 0x8235, 0x5241, 0x60f0,
+  0x5815, 0x86fe, 0x5ce8, 0x9e45, 0x4fc4, 0x989d, 0x8bb9, 0x5a25,
+  0x6076, 0x5384, 0x627c, 0x904f, 0x9102, 0x997f, 0x6069, 0x800c,
+  0x513f, 0x8033, 0x5c14, 0x9975, 0x6d31, 0x4e8c,
+  /* 0xb7 */
+  0x7a1d, 0x7a1f, 0x7a21, 0x7a22, 0x7a24, 0x7a25, 0x7a26, 0x7a27,
+  0x7a28, 0x7a29, 0x7a2a, 0x7a2b, 0x7a2c, 0x7a2d, 0x7a2e, 0x7a2f,
+  0x7a30, 0x7a31, 0x7a32, 0x7a34, 0x7a35, 0x7a36, 0x7a38, 0x7a3a,
+  0x7a3e, 0x7a40, 0x7a41, 0x7a42, 0x7a43, 0x7a44, 0x7a45, 0x7a47,
+  0x7a48, 0x7a49, 0x7a4a, 0x7a4b, 0x7a4c, 0x7a4d, 0x7a4e, 0x7a4f,
+  0x7a50, 0x7a52, 0x7a53, 0x7a54, 0x7a55, 0x7a56, 0x7a58, 0x7a59,
+  0x7a5a, 0x7a5b, 0x7a5c, 0x7a5d, 0x7a5e, 0x7a5f, 0x7a60, 0x7a61,
+  0x7a62, 0x7a63, 0x7a64, 0x7a65, 0x7a66, 0x7a67, 0x7a68, 0x7a69,
+  0x7a6a, 0x7a6b, 0x7a6c, 0x7a6d, 0x7a6e, 0x7a6f, 0x7a71, 0x7a72,
+  0x7a73, 0x7a75, 0x7a7b, 0x7a7c, 0x7a7d, 0x7a7e, 0x7a82, 0x7a85,
+  0x7a87, 0x7a89, 0x7a8a, 0x7a8b, 0x7a8c, 0x7a8e, 0x7a8f, 0x7a90,
+  0x7a93, 0x7a94, 0x7a99, 0x7a9a, 0x7a9b, 0x7a9e, 0x7aa1, 0x7aa2,
+  0x8d30, 0x53d1, 0x7f5a, 0x7b4f, 0x4f10, 0x4e4f, 0x9600, 0x6cd5,
+  0x73d0, 0x85e9, 0x5e06, 0x756a, 0x7ffb, 0x6a0a, 0x77fe, 0x9492,
+  0x7e41, 0x51e1, 0x70e6, 0x53cd, 0x8fd4, 0x8303, 0x8d29, 0x72af,
+  0x996d, 0x6cdb, 0x574a, 0x82b3, 0x65b9, 0x80aa, 0x623f, 0x9632,
+  0x59a8, 0x4eff, 0x8bbf, 0x7eba, 0x653e, 0x83f2, 0x975e, 0x5561,
+  0x98de, 0x80a5, 0x532a, 0x8bfd, 0x5420, 0x80ba, 0x5e9f, 0x6cb8,
+  0x8d39, 0x82ac, 0x915a, 0x5429, 0x6c1b, 0x5206, 0x7eb7, 0x575f,
+  0x711a, 0x6c7e, 0x7c89, 0x594b, 0x4efd, 0x5fff, 0x6124, 0x7caa,
+  0x4e30, 0x5c01, 0x67ab, 0x8702, 0x5cf0, 0x950b, 0x98ce, 0x75af,
+  0x70fd, 0x9022, 0x51af, 0x7f1d, 0x8bbd, 0x5949, 0x51e4, 0x4f5b,
+  0x5426, 0x592b, 0x6577, 0x80a4, 0x5b75, 0x6276, 0x62c2, 0x8f90,
+  0x5e45, 0x6c1f, 0x7b26, 0x4f0f, 0x4fd8, 0x670d,
+  /* 0xb8 */
+  0x7aa3, 0x7aa4, 0x7aa7, 0x7aa9, 0x7aaa, 0x7aab, 0x7aae, 0x7aaf,
+  0x7ab0, 0x7ab1, 0x7ab2, 0x7ab4, 0x7ab5, 0x7ab6, 0x7ab7, 0x7ab8,
+  0x7ab9, 0x7aba, 0x7abb, 0x7abc, 0x7abd, 0x7abe, 0x7ac0, 0x7ac1,
+  0x7ac2, 0x7ac3, 0x7ac4, 0x7ac5, 0x7ac6, 0x7ac7, 0x7ac8, 0x7ac9,
+  0x7aca, 0x7acc, 0x7acd, 0x7ace, 0x7acf, 0x7ad0, 0x7ad1, 0x7ad2,
+  0x7ad3, 0x7ad4, 0x7ad5, 0x7ad7, 0x7ad8, 0x7ada, 0x7adb, 0x7adc,
+  0x7add, 0x7ae1, 0x7ae2, 0x7ae4, 0x7ae7, 0x7ae8, 0x7ae9, 0x7aea,
+  0x7aeb, 0x7aec, 0x7aee, 0x7af0, 0x7af1, 0x7af2, 0x7af3, 0x7af4,
+  0x7af5, 0x7af6, 0x7af7, 0x7af8, 0x7afb, 0x7afc, 0x7afe, 0x7b00,
+  0x7b01, 0x7b02, 0x7b05, 0x7b07, 0x7b09, 0x7b0c, 0x7b0d, 0x7b0e,
+  0x7b10, 0x7b12, 0x7b13, 0x7b16, 0x7b17, 0x7b18, 0x7b1a, 0x7b1c,
+  0x7b1d, 0x7b1f, 0x7b21, 0x7b22, 0x7b23, 0x7b27, 0x7b29, 0x7b2d,
+  0x6d6e, 0x6daa, 0x798f, 0x88b1, 0x5f17, 0x752b, 0x629a, 0x8f85,
+  0x4fef, 0x91dc, 0x65a7, 0x812f, 0x8151, 0x5e9c, 0x8150, 0x8d74,
+  0x526f, 0x8986, 0x8d4b, 0x590d, 0x5085, 0x4ed8, 0x961c, 0x7236,
+  0x8179, 0x8d1f, 0x5bcc, 0x8ba3, 0x9644, 0x5987, 0x7f1a, 0x5490,
+  0x5676, 0x560e, 0x8be5, 0x6539, 0x6982, 0x9499, 0x76d6, 0x6e89,
+  0x5e72, 0x7518, 0x6746, 0x67d1, 0x7aff, 0x809d, 0x8d76, 0x611f,
+  0x79c6, 0x6562, 0x8d63, 0x5188, 0x521a, 0x94a2, 0x7f38, 0x809b,
+  0x7eb2, 0x5c97, 0x6e2f, 0x6760, 0x7bd9, 0x768b, 0x9ad8, 0x818f,
+  0x7f94, 0x7cd5, 0x641e, 0x9550, 0x7a3f, 0x544a, 0x54e5, 0x6b4c,
+  0x6401, 0x6208, 0x9e3d, 0x80f3, 0x7599, 0x5272, 0x9769, 0x845b,
+  0x683c, 0x86e4, 0x9601, 0x9694, 0x94ec, 0x4e2a, 0x5404, 0x7ed9,
+  0x6839, 0x8ddf, 0x8015, 0x66f4, 0x5e9a, 0x7fb9,
+  /* 0xb9 */
+  0x7b2f, 0x7b30, 0x7b32, 0x7b34, 0x7b35, 0x7b36, 0x7b37, 0x7b39,
+  0x7b3b, 0x7b3d, 0x7b3f, 0x7b40, 0x7b41, 0x7b42, 0x7b43, 0x7b44,
+  0x7b46, 0x7b48, 0x7b4a, 0x7b4d, 0x7b4e, 0x7b53, 0x7b55, 0x7b57,
+  0x7b59, 0x7b5c, 0x7b5e, 0x7b5f, 0x7b61, 0x7b63, 0x7b64, 0x7b65,
+  0x7b66, 0x7b67, 0x7b68, 0x7b69, 0x7b6a, 0x7b6b, 0x7b6c, 0x7b6d,
+  0x7b6f, 0x7b70, 0x7b73, 0x7b74, 0x7b76, 0x7b78, 0x7b7a, 0x7b7c,
+  0x7b7d, 0x7b7f, 0x7b81, 0x7b82, 0x7b83, 0x7b84, 0x7b86, 0x7b87,
+  0x7b88, 0x7b89, 0x7b8a, 0x7b8b, 0x7b8c, 0x7b8e, 0x7b8f, 0x7b91,
+  0x7b92, 0x7b93, 0x7b96, 0x7b98, 0x7b99, 0x7b9a, 0x7b9b, 0x7b9e,
+  0x7b9f, 0x7ba0, 0x7ba3, 0x7ba4, 0x7ba5, 0x7bae, 0x7baf, 0x7bb0,
+  0x7bb2, 0x7bb3, 0x7bb5, 0x7bb6, 0x7bb7, 0x7bb9, 0x7bba, 0x7bbb,
+  0x7bbc, 0x7bbd, 0x7bbe, 0x7bbf, 0x7bc0, 0x7bc2, 0x7bc3, 0x7bc4,
+  0x57c2, 0x803f, 0x6897, 0x5de5, 0x653b, 0x529f, 0x606d, 0x9f9a,
+  0x4f9b, 0x8eac, 0x516c, 0x5bab, 0x5f13, 0x5de9, 0x6c5e, 0x62f1,
+  0x8d21, 0x5171, 0x94a9, 0x52fe, 0x6c9f, 0x82df, 0x72d7, 0x57a2,
+  0x6784, 0x8d2d, 0x591f, 0x8f9c, 0x83c7, 0x5495, 0x7b8d, 0x4f30,
+  0x6cbd, 0x5b64, 0x59d1, 0x9f13, 0x53e4, 0x86ca, 0x9aa8, 0x8c37,
+  0x80a1, 0x6545, 0x987e, 0x56fa, 0x96c7, 0x522e, 0x74dc, 0x5250,
+  0x5be1, 0x6302, 0x8902, 0x4e56, 0x62d0, 0x602a, 0x68fa, 0x5173,
+  0x5b98, 0x51a0, 0x89c2, 0x7ba1, 0x9986, 0x7f50, 0x60ef, 0x704c,
+  0x8d2f, 0x5149, 0x5e7f, 0x901b, 0x7470, 0x89c4, 0x572d, 0x7845,
+  0x5f52, 0x9f9f, 0x95fa, 0x8f68, 0x9b3c, 0x8be1, 0x7678, 0x6842,
+  0x67dc, 0x8dea, 0x8d35, 0x523d, 0x8f8a, 0x6eda, 0x68cd, 0x9505,
+  0x90ed, 0x56fd, 0x679c, 0x88f9, 0x8fc7, 0x54c8,
+  /* 0xba */
+  0x7bc5, 0x7bc8, 0x7bc9, 0x7bca, 0x7bcb, 0x7bcd, 0x7bce, 0x7bcf,
+  0x7bd0, 0x7bd2, 0x7bd4, 0x7bd5, 0x7bd6, 0x7bd7, 0x7bd8, 0x7bdb,
+  0x7bdc, 0x7bde, 0x7bdf, 0x7be0, 0x7be2, 0x7be3, 0x7be4, 0x7be7,
+  0x7be8, 0x7be9, 0x7beb, 0x7bec, 0x7bed, 0x7bef, 0x7bf0, 0x7bf2,
+  0x7bf3, 0x7bf4, 0x7bf5, 0x7bf6, 0x7bf8, 0x7bf9, 0x7bfa, 0x7bfb,
+  0x7bfd, 0x7bff, 0x7c00, 0x7c01, 0x7c02, 0x7c03, 0x7c04, 0x7c05,
+  0x7c06, 0x7c08, 0x7c09, 0x7c0a, 0x7c0d, 0x7c0e, 0x7c10, 0x7c11,
+  0x7c12, 0x7c13, 0x7c14, 0x7c15, 0x7c17, 0x7c18, 0x7c19, 0x7c1a,
+  0x7c1b, 0x7c1c, 0x7c1d, 0x7c1e, 0x7c20, 0x7c21, 0x7c22, 0x7c23,
+  0x7c24, 0x7c25, 0x7c28, 0x7c29, 0x7c2b, 0x7c2c, 0x7c2d, 0x7c2e,
+  0x7c2f, 0x7c30, 0x7c31, 0x7c32, 0x7c33, 0x7c34, 0x7c35, 0x7c36,
+  0x7c37, 0x7c39, 0x7c3a, 0x7c3b, 0x7c3c, 0x7c3d, 0x7c3e, 0x7c42,
+  0x9ab8, 0x5b69, 0x6d77, 0x6c26, 0x4ea5, 0x5bb3, 0x9a87, 0x9163,
+  0x61a8, 0x90af, 0x97e9, 0x542b, 0x6db5, 0x5bd2, 0x51fd, 0x558a,
+  0x7f55, 0x7ff0, 0x64bc, 0x634d, 0x65f1, 0x61be, 0x608d, 0x710a,
+  0x6c57, 0x6c49, 0x592f, 0x676d, 0x822a, 0x58d5, 0x568e, 0x8c6a,
+  0x6beb, 0x90dd, 0x597d, 0x8017, 0x53f7, 0x6d69, 0x5475, 0x559d,
+  0x8377, 0x83cf, 0x6838, 0x79be, 0x548c, 0x4f55, 0x5408, 0x76d2,
+  0x8c89, 0x9602, 0x6cb3, 0x6db8, 0x8d6b, 0x8910, 0x9e64, 0x8d3a,
+  0x563f, 0x9ed1, 0x75d5, 0x5f88, 0x72e0, 0x6068, 0x54fc, 0x4ea8,
+  0x6a2a, 0x8861, 0x6052, 0x8f70, 0x54c4, 0x70d8, 0x8679, 0x9e3f,
+  0x6d2a, 0x5b8f, 0x5f18, 0x7ea2, 0x5589, 0x4faf, 0x7334, 0x543c,
+  0x539a, 0x5019, 0x540e, 0x547c, 0x4e4e, 0x5ffd, 0x745a, 0x58f6,
+  0x846b, 0x80e1, 0x8774, 0x72d0, 0x7cca, 0x6e56,
+  /* 0xbb */
+  0x7c43, 0x7c44, 0x7c45, 0x7c46, 0x7c47, 0x7c48, 0x7c49, 0x7c4a,
+  0x7c4b, 0x7c4c, 0x7c4e, 0x7c4f, 0x7c50, 0x7c51, 0x7c52, 0x7c53,
+  0x7c54, 0x7c55, 0x7c56, 0x7c57, 0x7c58, 0x7c59, 0x7c5a, 0x7c5b,
+  0x7c5c, 0x7c5d, 0x7c5e, 0x7c5f, 0x7c60, 0x7c61, 0x7c62, 0x7c63,
+  0x7c64, 0x7c65, 0x7c66, 0x7c67, 0x7c68, 0x7c69, 0x7c6a, 0x7c6b,
+  0x7c6c, 0x7c6d, 0x7c6e, 0x7c6f, 0x7c70, 0x7c71, 0x7c72, 0x7c75,
+  0x7c76, 0x7c77, 0x7c78, 0x7c79, 0x7c7a, 0x7c7e, 0x7c7f, 0x7c80,
+  0x7c81, 0x7c82, 0x7c83, 0x7c84, 0x7c85, 0x7c86, 0x7c87, 0x7c88,
+  0x7c8a, 0x7c8b, 0x7c8c, 0x7c8d, 0x7c8e, 0x7c8f, 0x7c90, 0x7c93,
+  0x7c94, 0x7c96, 0x7c99, 0x7c9a, 0x7c9b, 0x7ca0, 0x7ca1, 0x7ca3,
+  0x7ca6, 0x7ca7, 0x7ca8, 0x7ca9, 0x7cab, 0x7cac, 0x7cad, 0x7caf,
+  0x7cb0, 0x7cb4, 0x7cb5, 0x7cb6, 0x7cb7, 0x7cb8, 0x7cba, 0x7cbb,
+  0x5f27, 0x864e, 0x552c, 0x62a4, 0x4e92, 0x6caa, 0x6237, 0x82b1,
+  0x54d7, 0x534e, 0x733e, 0x6ed1, 0x753b, 0x5212, 0x5316, 0x8bdd,
+  0x69d0, 0x5f8a, 0x6000, 0x6dee, 0x574f, 0x6b22, 0x73af, 0x6853,
+  0x8fd8, 0x7f13, 0x6362, 0x60a3, 0x5524, 0x75ea, 0x8c62, 0x7115,
+  0x6da3, 0x5ba6, 0x5e7b, 0x8352, 0x614c, 0x9ec4, 0x78fa, 0x8757,
+  0x7c27, 0x7687, 0x51f0, 0x60f6, 0x714c, 0x6643, 0x5e4c, 0x604d,
+  0x8c0e, 0x7070, 0x6325, 0x8f89, 0x5fbd, 0x6062, 0x86d4, 0x56de,
+  0x6bc1, 0x6094, 0x6167, 0x5349, 0x60e0, 0x6666, 0x8d3f, 0x79fd,
+  0x4f1a, 0x70e9, 0x6c47, 0x8bb3, 0x8bf2, 0x7ed8, 0x8364, 0x660f,
+  0x5a5a, 0x9b42, 0x6d51, 0x6df7, 0x8c41, 0x6d3b, 0x4f19, 0x706b,
+  0x83b7, 0x6216, 0x60d1, 0x970d, 0x8d27, 0x7978, 0x51fb, 0x573e,
+  0x57fa, 0x673a, 0x7578, 0x7a3d, 0x79ef, 0x7b95,
+  /* 0xbc */
+  0x7cbf, 0x7cc0, 0x7cc2, 0x7cc3, 0x7cc4, 0x7cc6, 0x7cc9, 0x7ccb,
+  0x7cce, 0x7ccf, 0x7cd0, 0x7cd1, 0x7cd2, 0x7cd3, 0x7cd4, 0x7cd8,
+  0x7cda, 0x7cdb, 0x7cdd, 0x7cde, 0x7ce1, 0x7ce2, 0x7ce3, 0x7ce4,
+  0x7ce5, 0x7ce6, 0x7ce7, 0x7ce9, 0x7cea, 0x7ceb, 0x7cec, 0x7ced,
+  0x7cee, 0x7cf0, 0x7cf1, 0x7cf2, 0x7cf3, 0x7cf4, 0x7cf5, 0x7cf6,
+  0x7cf7, 0x7cf9, 0x7cfa, 0x7cfc, 0x7cfd, 0x7cfe, 0x7cff, 0x7d00,
+  0x7d01, 0x7d02, 0x7d03, 0x7d04, 0x7d05, 0x7d06, 0x7d07, 0x7d08,
+  0x7d09, 0x7d0b, 0x7d0c, 0x7d0d, 0x7d0e, 0x7d0f, 0x7d10, 0x7d11,
+  0x7d12, 0x7d13, 0x7d14, 0x7d15, 0x7d16, 0x7d17, 0x7d18, 0x7d19,
+  0x7d1a, 0x7d1b, 0x7d1c, 0x7d1d, 0x7d1e, 0x7d1f, 0x7d21, 0x7d23,
+  0x7d24, 0x7d25, 0x7d26, 0x7d28, 0x7d29, 0x7d2a, 0x7d2c, 0x7d2d,
+  0x7d2e, 0x7d30, 0x7d31, 0x7d32, 0x7d33, 0x7d34, 0x7d35, 0x7d36,
+  0x808c, 0x9965, 0x8ff9, 0x6fc0, 0x8ba5, 0x9e21, 0x59ec, 0x7ee9,
+  0x7f09, 0x5409, 0x6781, 0x68d8, 0x8f91, 0x7c4d, 0x96c6, 0x53ca,
+  0x6025, 0x75be, 0x6c72, 0x5373, 0x5ac9, 0x7ea7, 0x6324, 0x51e0,
+  0x810a, 0x5df1, 0x84df, 0x6280, 0x5180, 0x5b63, 0x4f0e, 0x796d,
+  0x5242, 0x60b8, 0x6d4e, 0x5bc4, 0x5bc2, 0x8ba1, 0x8bb0, 0x65e2,
+  0x5fcc, 0x9645, 0x5993, 0x7ee7, 0x7eaa, 0x5609, 0x67b7, 0x5939,
+  0x4f73, 0x5bb6, 0x52a0, 0x835a, 0x988a, 0x8d3e, 0x7532, 0x94be,
+  0x5047, 0x7a3c, 0x4ef7, 0x67b6, 0x9a7e, 0x5ac1, 0x6b7c, 0x76d1,
+  0x575a, 0x5c16, 0x7b3a, 0x95f4, 0x714e, 0x517c, 0x80a9, 0x8270,
+  0x5978, 0x7f04, 0x8327, 0x68c0, 0x67ec, 0x78b1, 0x7877, 0x62e3,
+  0x6361, 0x7b80, 0x4fed, 0x526a, 0x51cf, 0x8350, 0x69db, 0x9274,
+  0x8df5, 0x8d31, 0x89c1, 0x952e, 0x7bad, 0x4ef6,
+  /* 0xbd */
+  0x7d37, 0x7d38, 0x7d39, 0x7d3a, 0x7d3b, 0x7d3c, 0x7d3d, 0x7d3e,
+  0x7d3f, 0x7d40, 0x7d41, 0x7d42, 0x7d43, 0x7d44, 0x7d45, 0x7d46,
+  0x7d47, 0x7d48, 0x7d49, 0x7d4a, 0x7d4b, 0x7d4c, 0x7d4d, 0x7d4e,
+  0x7d4f, 0x7d50, 0x7d51, 0x7d52, 0x7d53, 0x7d54, 0x7d55, 0x7d56,
+  0x7d57, 0x7d58, 0x7d59, 0x7d5a, 0x7d5b, 0x7d5c, 0x7d5d, 0x7d5e,
+  0x7d5f, 0x7d60, 0x7d61, 0x7d62, 0x7d63, 0x7d64, 0x7d65, 0x7d66,
+  0x7d67, 0x7d68, 0x7d69, 0x7d6a, 0x7d6b, 0x7d6c, 0x7d6d, 0x7d6f,
+  0x7d70, 0x7d71, 0x7d72, 0x7d73, 0x7d74, 0x7d75, 0x7d76, 0x7d78,
+  0x7d79, 0x7d7a, 0x7d7b, 0x7d7c, 0x7d7d, 0x7d7e, 0x7d7f, 0x7d80,
+  0x7d81, 0x7d82, 0x7d83, 0x7d84, 0x7d85, 0x7d86, 0x7d87, 0x7d88,
+  0x7d89, 0x7d8a, 0x7d8b, 0x7d8c, 0x7d8d, 0x7d8e, 0x7d8f, 0x7d90,
+  0x7d91, 0x7d92, 0x7d93, 0x7d94, 0x7d95, 0x7d96, 0x7d97, 0x7d98,
+  0x5065, 0x8230, 0x5251, 0x996f, 0x6e10, 0x6e85, 0x6da7, 0x5efa,
+  0x50f5, 0x59dc, 0x5c06, 0x6d46, 0x6c5f, 0x7586, 0x848b, 0x6868,
+  0x5956, 0x8bb2, 0x5320, 0x9171, 0x964d, 0x8549, 0x6912, 0x7901,
+  0x7126, 0x80f6, 0x4ea4, 0x90ca, 0x6d47, 0x9a84, 0x5a07, 0x56bc,
+  0x6405, 0x94f0, 0x77eb, 0x4fa5, 0x811a, 0x72e1, 0x89d2, 0x997a,
+  0x7f34, 0x7ede, 0x527f, 0x6559, 0x9175, 0x8f7f, 0x8f83, 0x53eb,
+  0x7a96, 0x63ed, 0x63a5, 0x7686, 0x79f8, 0x8857, 0x9636, 0x622a,
+  0x52ab, 0x8282, 0x6854, 0x6770, 0x6377, 0x776b, 0x7aed, 0x6d01,
+  0x7ed3, 0x89e3, 0x59d0, 0x6212, 0x85c9, 0x82a5, 0x754c, 0x501f,
+  0x4ecb, 0x75a5, 0x8beb, 0x5c4a, 0x5dfe, 0x7b4b, 0x65a4, 0x91d1,
+  0x4eca, 0x6d25, 0x895f, 0x7d27, 0x9526, 0x4ec5, 0x8c28, 0x8fdb,
+  0x9773, 0x664b, 0x7981, 0x8fd1, 0x70ec, 0x6d78,
+  /* 0xbe */
+  0x7d99, 0x7d9a, 0x7d9b, 0x7d9c, 0x7d9d, 0x7d9e, 0x7d9f, 0x7da0,
+  0x7da1, 0x7da2, 0x7da3, 0x7da4, 0x7da5, 0x7da7, 0x7da8, 0x7da9,
+  0x7daa, 0x7dab, 0x7dac, 0x7dad, 0x7daf, 0x7db0, 0x7db1, 0x7db2,
+  0x7db3, 0x7db4, 0x7db5, 0x7db6, 0x7db7, 0x7db8, 0x7db9, 0x7dba,
+  0x7dbb, 0x7dbc, 0x7dbd, 0x7dbe, 0x7dbf, 0x7dc0, 0x7dc1, 0x7dc2,
+  0x7dc3, 0x7dc4, 0x7dc5, 0x7dc6, 0x7dc7, 0x7dc8, 0x7dc9, 0x7dca,
+  0x7dcb, 0x7dcc, 0x7dcd, 0x7dce, 0x7dcf, 0x7dd0, 0x7dd1, 0x7dd2,
+  0x7dd3, 0x7dd4, 0x7dd5, 0x7dd6, 0x7dd7, 0x7dd8, 0x7dd9, 0x7dda,
+  0x7ddb, 0x7ddc, 0x7ddd, 0x7dde, 0x7ddf, 0x7de0, 0x7de1, 0x7de2,
+  0x7de3, 0x7de4, 0x7de5, 0x7de6, 0x7de7, 0x7de8, 0x7de9, 0x7dea,
+  0x7deb, 0x7dec, 0x7ded, 0x7dee, 0x7def, 0x7df0, 0x7df1, 0x7df2,
+  0x7df3, 0x7df4, 0x7df5, 0x7df6, 0x7df7, 0x7df8, 0x7df9, 0x7dfa,
+  0x5c3d, 0x52b2, 0x8346, 0x5162, 0x830e, 0x775b, 0x6676, 0x9cb8,
+  0x4eac, 0x60ca, 0x7cbe, 0x7cb3, 0x7ecf, 0x4e95, 0x8b66, 0x666f,
+  0x9888, 0x9759, 0x5883, 0x656c, 0x955c, 0x5f84, 0x75c9, 0x9756,
+  0x7adf, 0x7ade, 0x51c0, 0x70af, 0x7a98, 0x63ea, 0x7a76, 0x7ea0,
+  0x7396, 0x97ed, 0x4e45, 0x7078, 0x4e5d, 0x9152, 0x53a9, 0x6551,
+  0x65e7, 0x81fc, 0x8205, 0x548e, 0x5c31, 0x759a, 0x97a0, 0x62d8,
+  0x72d9, 0x75bd, 0x5c45, 0x9a79, 0x83ca, 0x5c40, 0x5480, 0x77e9,
+  0x4e3e, 0x6cae, 0x805a, 0x62d2, 0x636e, 0x5de8, 0x5177, 0x8ddd,
+  0x8e1e, 0x952f, 0x4ff1, 0x53e5, 0x60e7, 0x70ac, 0x5267, 0x6350,
+  0x9e43, 0x5a1f, 0x5026, 0x7737, 0x5377, 0x7ee2, 0x6485, 0x652b,
+  0x6289, 0x6398, 0x5014, 0x7235, 0x89c9, 0x51b3, 0x8bc0, 0x7edd,
+  0x5747, 0x83cc, 0x94a7, 0x519b, 0x541b, 0x5cfb,
+  /* 0xbf */
+  0x7dfb, 0x7dfc, 0x7dfd, 0x7dfe, 0x7dff, 0x7e00, 0x7e01, 0x7e02,
+  0x7e03, 0x7e04, 0x7e05, 0x7e06, 0x7e07, 0x7e08, 0x7e09, 0x7e0a,
+  0x7e0b, 0x7e0c, 0x7e0d, 0x7e0e, 0x7e0f, 0x7e10, 0x7e11, 0x7e12,
+  0x7e13, 0x7e14, 0x7e15, 0x7e16, 0x7e17, 0x7e18, 0x7e19, 0x7e1a,
+  0x7e1b, 0x7e1c, 0x7e1d, 0x7e1e, 0x7e1f, 0x7e20, 0x7e21, 0x7e22,
+  0x7e23, 0x7e24, 0x7e25, 0x7e26, 0x7e27, 0x7e28, 0x7e29, 0x7e2a,
+  0x7e2b, 0x7e2c, 0x7e2d, 0x7e2e, 0x7e2f, 0x7e30, 0x7e31, 0x7e32,
+  0x7e33, 0x7e34, 0x7e35, 0x7e36, 0x7e37, 0x7e38, 0x7e39, 0x7e3a,
+  0x7e3c, 0x7e3d, 0x7e3e, 0x7e3f, 0x7e40, 0x7e42, 0x7e43, 0x7e44,
+  0x7e45, 0x7e46, 0x7e48, 0x7e49, 0x7e4a, 0x7e4b, 0x7e4c, 0x7e4d,
+  0x7e4e, 0x7e4f, 0x7e50, 0x7e51, 0x7e52, 0x7e53, 0x7e54, 0x7e55,
+  0x7e56, 0x7e57, 0x7e58, 0x7e59, 0x7e5a, 0x7e5b, 0x7e5c, 0x7e5d,
+  0x4fca, 0x7ae3, 0x6d5a, 0x90e1, 0x9a8f, 0x5580, 0x5496, 0x5361,
+  0x54af, 0x5f00, 0x63e9, 0x6977, 0x51ef, 0x6168, 0x520a, 0x582a,
+  0x52d8, 0x574e, 0x780d, 0x770b, 0x5eb7, 0x6177, 0x7ce0, 0x625b,
+  0x6297, 0x4ea2, 0x7095, 0x8003, 0x62f7, 0x70e4, 0x9760, 0x5777,
+  0x82db, 0x67ef, 0x68f5, 0x78d5, 0x9897, 0x79d1, 0x58f3, 0x54b3,
+  0x53ef, 0x6e34, 0x514b, 0x523b, 0x5ba2, 0x8bfe, 0x80af, 0x5543,
+  0x57a6, 0x6073, 0x5751, 0x542d, 0x7a7a, 0x6050, 0x5b54, 0x63a7,
+  0x62a0, 0x53e3, 0x6263, 0x5bc7, 0x67af, 0x54ed, 0x7a9f, 0x82e6,
+  0x9177, 0x5e93, 0x88e4, 0x5938, 0x57ae, 0x630e, 0x8de8, 0x80ef,
+  0x5757, 0x7b77, 0x4fa9, 0x5feb, 0x5bbd, 0x6b3e, 0x5321, 0x7b50,
+  0x72c2, 0x6846, 0x77ff, 0x7736, 0x65f7, 0x51b5, 0x4e8f, 0x76d4,
+  0x5cbf, 0x7aa5, 0x8475, 0x594e, 0x9b41, 0x5080,
+  /* 0xc0 */
+  0x7e5e, 0x7e5f, 0x7e60, 0x7e61, 0x7e62, 0x7e63, 0x7e64, 0x7e65,
+  0x7e66, 0x7e67, 0x7e68, 0x7e69, 0x7e6a, 0x7e6b, 0x7e6c, 0x7e6d,
+  0x7e6e, 0x7e6f, 0x7e70, 0x7e71, 0x7e72, 0x7e73, 0x7e74, 0x7e75,
+  0x7e76, 0x7e77, 0x7e78, 0x7e79, 0x7e7a, 0x7e7b, 0x7e7c, 0x7e7d,
+  0x7e7e, 0x7e7f, 0x7e80, 0x7e81, 0x7e83, 0x7e84, 0x7e85, 0x7e86,
+  0x7e87, 0x7e88, 0x7e89, 0x7e8a, 0x7e8b, 0x7e8c, 0x7e8d, 0x7e8e,
+  0x7e8f, 0x7e90, 0x7e91, 0x7e92, 0x7e93, 0x7e94, 0x7e95, 0x7e96,
+  0x7e97, 0x7e98, 0x7e99, 0x7e9a, 0x7e9c, 0x7e9d, 0x7e9e, 0x7eae,
+  0x7eb4, 0x7ebb, 0x7ebc, 0x7ed6, 0x7ee4, 0x7eec, 0x7ef9, 0x7f0a,
+  0x7f10, 0x7f1e, 0x7f37, 0x7f39, 0x7f3b, 0x7f3c, 0x7f3d, 0x7f3e,
+  0x7f3f, 0x7f40, 0x7f41, 0x7f43, 0x7f46, 0x7f47, 0x7f48, 0x7f49,
+  0x7f4a, 0x7f4b, 0x7f4c, 0x7f4d, 0x7f4e, 0x7f4f, 0x7f52, 0x7f53,
+  0x9988, 0x6127, 0x6e83, 0x5764, 0x6606, 0x6346, 0x56f0, 0x62ec,
+  0x6269, 0x5ed3, 0x9614, 0x5783, 0x62c9, 0x5587, 0x8721, 0x814a,
+  0x8fa3, 0x5566, 0x83b1, 0x6765, 0x8d56, 0x84dd, 0x5a6a, 0x680f,
+  0x62e6, 0x7bee, 0x9611, 0x5170, 0x6f9c, 0x8c30, 0x63fd, 0x89c8,
+  0x61d2, 0x7f06, 0x70c2, 0x6ee5, 0x7405, 0x6994, 0x72fc, 0x5eca,
+  0x90ce, 0x6717, 0x6d6a, 0x635e, 0x52b3, 0x7262, 0x8001, 0x4f6c,
+  0x59e5, 0x916a, 0x70d9, 0x6d9d, 0x52d2, 0x4e50, 0x96f7, 0x956d,
+  0x857e, 0x78ca, 0x7d2f, 0x5121, 0x5792, 0x64c2, 0x808b, 0x7c7b,
+  0x6cea, 0x68f1, 0x695e, 0x51b7, 0x5398, 0x68a8, 0x7281, 0x9ece,
+  0x7bf1, 0x72f8, 0x79bb, 0x6f13, 0x7406, 0x674e, 0x91cc, 0x9ca4,
+  0x793c, 0x8389, 0x8354, 0x540f, 0x6817, 0x4e3d, 0x5389, 0x52b1,
+  0x783e, 0x5386, 0x5229, 0x5088, 0x4f8b, 0x4fd0,
+  /* 0xc1 */
+  0x7f56, 0x7f59, 0x7f5b, 0x7f5c, 0x7f5d, 0x7f5e, 0x7f60, 0x7f63,
+  0x7f64, 0x7f65, 0x7f66, 0x7f67, 0x7f6b, 0x7f6c, 0x7f6d, 0x7f6f,
+  0x7f70, 0x7f73, 0x7f75, 0x7f76, 0x7f77, 0x7f78, 0x7f7a, 0x7f7b,
+  0x7f7c, 0x7f7d, 0x7f7f, 0x7f80, 0x7f82, 0x7f83, 0x7f84, 0x7f85,
+  0x7f86, 0x7f87, 0x7f88, 0x7f89, 0x7f8b, 0x7f8d, 0x7f8f, 0x7f90,
+  0x7f91, 0x7f92, 0x7f93, 0x7f95, 0x7f96, 0x7f97, 0x7f98, 0x7f99,
+  0x7f9b, 0x7f9c, 0x7fa0, 0x7fa2, 0x7fa3, 0x7fa5, 0x7fa6, 0x7fa8,
+  0x7fa9, 0x7faa, 0x7fab, 0x7fac, 0x7fad, 0x7fae, 0x7fb1, 0x7fb3,
+  0x7fb4, 0x7fb5, 0x7fb6, 0x7fb7, 0x7fba, 0x7fbb, 0x7fbe, 0x7fc0,
+  0x7fc2, 0x7fc3, 0x7fc4, 0x7fc6, 0x7fc7, 0x7fc8, 0x7fc9, 0x7fcb,
+  0x7fcd, 0x7fcf, 0x7fd0, 0x7fd1, 0x7fd2, 0x7fd3, 0x7fd6, 0x7fd7,
+  0x7fd9, 0x7fda, 0x7fdb, 0x7fdc, 0x7fdd, 0x7fde, 0x7fe2, 0x7fe3,
+  0x75e2, 0x7acb, 0x7c92, 0x6ca5, 0x96b6, 0x529b, 0x7483, 0x54e9,
+  0x4fe9, 0x8054, 0x83b2, 0x8fde, 0x9570, 0x5ec9, 0x601c, 0x6d9f,
+  0x5e18, 0x655b, 0x8138, 0x94fe, 0x604b, 0x70bc, 0x7ec3, 0x7cae,
+  0x51c9, 0x6881, 0x7cb1, 0x826f, 0x4e24, 0x8f86, 0x91cf, 0x667e,
+  0x4eae, 0x8c05, 0x64a9, 0x804a, 0x50da, 0x7597, 0x71ce, 0x5be5,
+  0x8fbd, 0x6f66, 0x4e86, 0x6482, 0x9563, 0x5ed6, 0x6599, 0x5217,
+  0x88c2, 0x70c8, 0x52a3, 0x730e, 0x7433, 0x6797, 0x78f7, 0x9716,
+  0x4e34, 0x90bb, 0x9cde, 0x6dcb, 0x51db, 0x8d41, 0x541d, 0x62ce,
+  0x73b2, 0x83f1, 0x96f6, 0x9f84, 0x94c3, 0x4f36, 0x7f9a, 0x51cc,
+  0x7075, 0x9675, 0x5cad, 0x9886, 0x53e6, 0x4ee4, 0x6e9c, 0x7409,
+  0x69b4, 0x786b, 0x998f, 0x7559, 0x5218, 0x7624, 0x6d41, 0x67f3,
+  0x516d, 0x9f99, 0x804b, 0x5499, 0x7b3c, 0x7abf,
+  /* 0xc2 */
+  0x7fe4, 0x7fe7, 0x7fe8, 0x7fea, 0x7feb, 0x7fec, 0x7fed, 0x7fef,
+  0x7ff2, 0x7ff4, 0x7ff5, 0x7ff6, 0x7ff7, 0x7ff8, 0x7ff9, 0x7ffa,
+  0x7ffd, 0x7ffe, 0x7fff, 0x8002, 0x8007, 0x8008, 0x8009, 0x800a,
+  0x800e, 0x800f, 0x8011, 0x8013, 0x801a, 0x801b, 0x801d, 0x801e,
+  0x801f, 0x8021, 0x8023, 0x8024, 0x802b, 0x802c, 0x802d, 0x802e,
+  0x802f, 0x8030, 0x8032, 0x8034, 0x8039, 0x803a, 0x803c, 0x803e,
+  0x8040, 0x8041, 0x8044, 0x8045, 0x8047, 0x8048, 0x8049, 0x804e,
+  0x804f, 0x8050, 0x8051, 0x8053, 0x8055, 0x8056, 0x8057, 0x8059,
+  0x805b, 0x805c, 0x805d, 0x805e, 0x805f, 0x8060, 0x8061, 0x8062,
+  0x8063, 0x8064, 0x8065, 0x8066, 0x8067, 0x8068, 0x806b, 0x806c,
+  0x806d, 0x806e, 0x806f, 0x8070, 0x8072, 0x8073, 0x8074, 0x8075,
+  0x8076, 0x8077, 0x8078, 0x8079, 0x807a, 0x807b, 0x807c, 0x807d,
+  0x9686, 0x5784, 0x62e2, 0x9647, 0x697c, 0x5a04, 0x6402, 0x7bd3,
+  0x6f0f, 0x964b, 0x82a6, 0x5362, 0x9885, 0x5e90, 0x7089, 0x63b3,
+  0x5364, 0x864f, 0x9c81, 0x9e93, 0x788c, 0x9732, 0x8def, 0x8d42,
+  0x9e7f, 0x6f5e, 0x7984, 0x5f55, 0x9646, 0x622e, 0x9a74, 0x5415,
+  0x94dd, 0x4fa3, 0x65c5, 0x5c65, 0x5c61, 0x7f15, 0x8651, 0x6c2f,
+  0x5f8b, 0x7387, 0x6ee4, 0x7eff, 0x5ce6, 0x631b, 0x5b6a, 0x6ee6,
+  0x5375, 0x4e71, 0x63a0, 0x7565, 0x62a1, 0x8f6e, 0x4f26, 0x4ed1,
+  0x6ca6, 0x7eb6, 0x8bba, 0x841d, 0x87ba, 0x7f57, 0x903b, 0x9523,
+  0x7ba9, 0x9aa1, 0x88f8, 0x843d, 0x6d1b, 0x9a86, 0x7edc, 0x5988,
+  0x9ebb, 0x739b, 0x7801, 0x8682, 0x9a6c, 0x9a82, 0x561b, 0x5417,
+  0x57cb, 0x4e70, 0x9ea6, 0x5356, 0x8fc8, 0x8109, 0x7792, 0x9992,
+  0x86ee, 0x6ee1, 0x8513, 0x66fc, 0x6162, 0x6f2b,
+  /* 0xc3 */
+  0x807e, 0x8081, 0x8082, 0x8085, 0x8088, 0x808a, 0x808d, 0x808e,
+  0x808f, 0x8090, 0x8091, 0x8092, 0x8094, 0x8095, 0x8097, 0x8099,
+  0x809e, 0x80a3, 0x80a6, 0x80a7, 0x80a8, 0x80ac, 0x80b0, 0x80b3,
+  0x80b5, 0x80b6, 0x80b8, 0x80b9, 0x80bb, 0x80c5, 0x80c7, 0x80c8,
+  0x80c9, 0x80ca, 0x80cb, 0x80cf, 0x80d0, 0x80d1, 0x80d2, 0x80d3,
+  0x80d4, 0x80d5, 0x80d8, 0x80df, 0x80e0, 0x80e2, 0x80e3, 0x80e6,
+  0x80ee, 0x80f5, 0x80f7, 0x80f9, 0x80fb, 0x80fe, 0x80ff, 0x8100,
+  0x8101, 0x8103, 0x8104, 0x8105, 0x8107, 0x8108, 0x810b, 0x810c,
+  0x8115, 0x8117, 0x8119, 0x811b, 0x811c, 0x811d, 0x811f, 0x8120,
+  0x8121, 0x8122, 0x8123, 0x8124, 0x8125, 0x8126, 0x8127, 0x8128,
+  0x8129, 0x812a, 0x812b, 0x812d, 0x812e, 0x8130, 0x8133, 0x8134,
+  0x8135, 0x8137, 0x8139, 0x813a, 0x813b, 0x813c, 0x813d, 0x813f,
+  0x8c29, 0x8292, 0x832b, 0x76f2, 0x6c13, 0x5fd9, 0x83bd, 0x732b,
+  0x8305, 0x951a, 0x6bdb, 0x77db, 0x94c6, 0x536f, 0x8302, 0x5192,
+  0x5e3d, 0x8c8c, 0x8d38, 0x4e48, 0x73ab, 0x679a, 0x6885, 0x9176,
+  0x9709, 0x7164, 0x6ca1, 0x7709, 0x5a92, 0x9541, 0x6bcf, 0x7f8e,
+  0x6627, 0x5bd0, 0x59b9, 0x5a9a, 0x95e8, 0x95f7, 0x4eec, 0x840c,
+  0x8499, 0x6aac, 0x76df, 0x9530, 0x731b, 0x68a6, 0x5b5f, 0x772f,
+  0x919a, 0x9761, 0x7cdc, 0x8ff7, 0x8c1c, 0x5f25, 0x7c73, 0x79d8,
+  0x89c5, 0x6ccc, 0x871c, 0x5bc6, 0x5e42, 0x68c9, 0x7720, 0x7ef5,
+  0x5195, 0x514d, 0x52c9, 0x5a29, 0x7f05, 0x9762, 0x82d7, 0x63cf,
+  0x7784, 0x85d0, 0x79d2, 0x6e3a, 0x5e99, 0x5999, 0x8511, 0x706d,
+  0x6c11, 0x62bf, 0x76bf, 0x654f, 0x60af, 0x95fd, 0x660e, 0x879f,
+  0x9e23, 0x94ed, 0x540d, 0x547d, 0x8c2c, 0x6478,
+  /* 0xc4 */
+  0x8140, 0x8141, 0x8142, 0x8143, 0x8144, 0x8145, 0x8147, 0x8149,
+  0x814d, 0x814e, 0x814f, 0x8152, 0x8156, 0x8157, 0x8158, 0x815b,
+  0x815c, 0x815d, 0x815e, 0x815f, 0x8161, 0x8162, 0x8163, 0x8164,
+  0x8166, 0x8168, 0x816a, 0x816b, 0x816c, 0x816f, 0x8172, 0x8173,
+  0x8175, 0x8176, 0x8177, 0x8178, 0x8181, 0x8183, 0x8184, 0x8185,
+  0x8186, 0x8187, 0x8189, 0x818b, 0x818c, 0x818d, 0x818e, 0x8190,
+  0x8192, 0x8193, 0x8194, 0x8195, 0x8196, 0x8197, 0x8199, 0x819a,
+  0x819e, 0x819f, 0x81a0, 0x81a1, 0x81a2, 0x81a4, 0x81a5, 0x81a7,
+  0x81a9, 0x81ab, 0x81ac, 0x81ad, 0x81ae, 0x81af, 0x81b0, 0x81b1,
+  0x81b2, 0x81b4, 0x81b5, 0x81b6, 0x81b7, 0x81b8, 0x81b9, 0x81bc,
+  0x81bd, 0x81be, 0x81bf, 0x81c4, 0x81c5, 0x81c7, 0x81c8, 0x81c9,
+  0x81cb, 0x81cd, 0x81ce, 0x81cf, 0x81d0, 0x81d1, 0x81d2, 0x81d3,
+  0x6479, 0x8611, 0x6a21, 0x819c, 0x78e8, 0x6469, 0x9b54, 0x62b9,
+  0x672b, 0x83ab, 0x58a8, 0x9ed8, 0x6cab, 0x6f20, 0x5bde, 0x964c,
+  0x8c0b, 0x725f, 0x67d0, 0x62c7, 0x7261, 0x4ea9, 0x59c6, 0x6bcd,
+  0x5893, 0x66ae, 0x5e55, 0x52df, 0x6155, 0x6728, 0x76ee, 0x7766,
+  0x7267, 0x7a46, 0x62ff, 0x54ea, 0x5450, 0x94a0, 0x90a3, 0x5a1c,
+  0x7eb3, 0x6c16, 0x4e43, 0x5976, 0x8010, 0x5948, 0x5357, 0x7537,
+  0x96be, 0x56ca, 0x6320, 0x8111, 0x607c, 0x95f9, 0x6dd6, 0x5462,
+  0x9981, 0x5185, 0x5ae9, 0x80fd, 0x59ae, 0x9713, 0x502a, 0x6ce5,
+  0x5c3c, 0x62df, 0x4f60, 0x533f, 0x817b, 0x9006, 0x6eba, 0x852b,
+  0x62c8, 0x5e74, 0x78be, 0x64b5, 0x637b, 0x5ff5, 0x5a18, 0x917f,
+  0x9e1f, 0x5c3f, 0x634f, 0x8042, 0x5b7d, 0x556e, 0x954a, 0x954d,
+  0x6d85, 0x60a8, 0x67e0, 0x72de, 0x51dd, 0x5b81,
+  /* 0xc5 */
+  0x81d4, 0x81d5, 0x81d6, 0x81d7, 0x81d8, 0x81d9, 0x81da, 0x81db,
+  0x81dc, 0x81dd, 0x81de, 0x81df, 0x81e0, 0x81e1, 0x81e2, 0x81e4,
+  0x81e5, 0x81e6, 0x81e8, 0x81e9, 0x81eb, 0x81ee, 0x81ef, 0x81f0,
+  0x81f1, 0x81f2, 0x81f5, 0x81f6, 0x81f7, 0x81f8, 0x81f9, 0x81fa,
+  0x81fd, 0x81ff, 0x8203, 0x8207, 0x8208, 0x8209, 0x820a, 0x820b,
+  0x820e, 0x820f, 0x8211, 0x8213, 0x8215, 0x8216, 0x8217, 0x8218,
+  0x8219, 0x821a, 0x821d, 0x8220, 0x8224, 0x8225, 0x8226, 0x8227,
+  0x8229, 0x822e, 0x8232, 0x823a, 0x823c, 0x823d, 0x823f, 0x8240,
+  0x8241, 0x8242, 0x8243, 0x8245, 0x8246, 0x8248, 0x824a, 0x824c,
+  0x824d, 0x824e, 0x8250, 0x8251, 0x8252, 0x8253, 0x8254, 0x8255,
+  0x8256, 0x8257, 0x8259, 0x825b, 0x825c, 0x825d, 0x825e, 0x8260,
+  0x8261, 0x8262, 0x8263, 0x8264, 0x8265, 0x8266, 0x8267, 0x8269,
+  0x62e7, 0x6cde, 0x725b, 0x626d, 0x94ae, 0x7ebd, 0x8113, 0x6d53,
+  0x519c, 0x5f04, 0x5974, 0x52aa, 0x6012, 0x5973, 0x6696, 0x8650,
+  0x759f, 0x632a, 0x61e6, 0x7cef, 0x8bfa, 0x54e6, 0x6b27, 0x9e25,
+  0x6bb4, 0x85d5, 0x5455, 0x5076, 0x6ca4, 0x556a, 0x8db4, 0x722c,
+  0x5e15, 0x6015, 0x7436, 0x62cd, 0x6392, 0x724c, 0x5f98, 0x6e43,
+  0x6d3e, 0x6500, 0x6f58, 0x76d8, 0x78d0, 0x76fc, 0x7554, 0x5224,
+  0x53db, 0x4e53, 0x5e9e, 0x65c1, 0x802a, 0x80d6, 0x629b, 0x5486,
+  0x5228, 0x70ae, 0x888d, 0x8dd1, 0x6ce1, 0x5478, 0x80da, 0x57f9,
+  0x88f4, 0x8d54, 0x966a, 0x914d, 0x4f69, 0x6c9b, 0x55b7, 0x76c6,
+  0x7830, 0x62a8, 0x70f9, 0x6f8e, 0x5f6d, 0x84ec, 0x68da, 0x787c,
+  0x7bf7, 0x81a8, 0x670b, 0x9e4f, 0x6367, 0x78b0, 0x576f, 0x7812,
+  0x9739, 0x6279, 0x62ab, 0x5288, 0x7435, 0x6bd7,
+  /* 0xc6 */
+  0x826a, 0x826b, 0x826c, 0x826d, 0x8271, 0x8275, 0x8276, 0x8277,
+  0x8278, 0x827b, 0x827c, 0x8280, 0x8281, 0x8283, 0x8285, 0x8286,
+  0x8287, 0x8289, 0x828c, 0x8290, 0x8293, 0x8294, 0x8295, 0x8296,
+  0x829a, 0x829b, 0x829e, 0x82a0, 0x82a2, 0x82a3, 0x82a7, 0x82b2,
+  0x82b5, 0x82b6, 0x82ba, 0x82bb, 0x82bc, 0x82bf, 0x82c0, 0x82c2,
+  0x82c3, 0x82c5, 0x82c6, 0x82c9, 0x82d0, 0x82d6, 0x82d9, 0x82da,
+  0x82dd, 0x82e2, 0x82e7, 0x82e8, 0x82e9, 0x82ea, 0x82ec, 0x82ed,
+  0x82ee, 0x82f0, 0x82f2, 0x82f3, 0x82f5, 0x82f6, 0x82f8, 0x82fa,
+  0x82fc, 0x82fd, 0x82fe, 0x82ff, 0x8300, 0x830a, 0x830b, 0x830d,
+  0x8310, 0x8312, 0x8313, 0x8316, 0x8318, 0x8319, 0x831d, 0x831e,
+  0x831f, 0x8320, 0x8321, 0x8322, 0x8323, 0x8324, 0x8325, 0x8326,
+  0x8329, 0x832a, 0x832e, 0x8330, 0x8332, 0x8337, 0x833b, 0x833d,
+  0x5564, 0x813e, 0x75b2, 0x76ae, 0x5339, 0x75de, 0x50fb, 0x5c41,
+  0x8b6c, 0x7bc7, 0x504f, 0x7247, 0x9a97, 0x98d8, 0x6f02, 0x74e2,
+  0x7968, 0x6487, 0x77a5, 0x62fc, 0x9891, 0x8d2b, 0x54c1, 0x8058,
+  0x4e52, 0x576a, 0x82f9, 0x840d, 0x5e73, 0x51ed, 0x74f6, 0x8bc4,
+  0x5c4f, 0x5761, 0x6cfc, 0x9887, 0x5a46, 0x7834, 0x9b44, 0x8feb,
+  0x7c95, 0x5256, 0x6251, 0x94fa, 0x4ec6, 0x8386, 0x8461, 0x83e9,
+  0x84b2, 0x57d4, 0x6734, 0x5703, 0x666e, 0x6d66, 0x8c31, 0x66dd,
+  0x7011, 0x671f, 0x6b3a, 0x6816, 0x621a, 0x59bb, 0x4e03, 0x51c4,
+  0x6f06, 0x67d2, 0x6c8f, 0x5176, 0x68cb, 0x5947, 0x6b67, 0x7566,
+  0x5d0e, 0x8110, 0x9f50, 0x65d7, 0x7948, 0x7941, 0x9a91, 0x8d77,
+  0x5c82, 0x4e5e, 0x4f01, 0x542f, 0x5951, 0x780c, 0x5668, 0x6c14,
+  0x8fc4, 0x5f03, 0x6c7d, 0x6ce3, 0x8bab, 0x6390,
+  /* 0xc7 */
+  0x833e, 0x833f, 0x8341, 0x8342, 0x8344, 0x8345, 0x8348, 0x834a,
+  0x834b, 0x834c, 0x834d, 0x834e, 0x8353, 0x8355, 0x8356, 0x8357,
+  0x8358, 0x8359, 0x835d, 0x8362, 0x8370, 0x8371, 0x8372, 0x8373,
+  0x8374, 0x8375, 0x8376, 0x8379, 0x837a, 0x837e, 0x837f, 0x8380,
+  0x8381, 0x8382, 0x8383, 0x8384, 0x8387, 0x8388, 0x838a, 0x838b,
+  0x838c, 0x838d, 0x838f, 0x8390, 0x8391, 0x8394, 0x8395, 0x8396,
+  0x8397, 0x8399, 0x839a, 0x839d, 0x839f, 0x83a1, 0x83a2, 0x83a3,
+  0x83a4, 0x83a5, 0x83a6, 0x83a7, 0x83ac, 0x83ad, 0x83ae, 0x83af,
+  0x83b5, 0x83bb, 0x83be, 0x83bf, 0x83c2, 0x83c3, 0x83c4, 0x83c6,
+  0x83c8, 0x83c9, 0x83cb, 0x83cd, 0x83ce, 0x83d0, 0x83d1, 0x83d2,
+  0x83d3, 0x83d5, 0x83d7, 0x83d9, 0x83da, 0x83db, 0x83de, 0x83e2,
+  0x83e3, 0x83e4, 0x83e6, 0x83e7, 0x83e8, 0x83eb, 0x83ec, 0x83ed,
+  0x6070, 0x6d3d, 0x7275, 0x6266, 0x948e, 0x94c5, 0x5343, 0x8fc1,
+  0x7b7e, 0x4edf, 0x8c26, 0x4e7e, 0x9ed4, 0x94b1, 0x94b3, 0x524d,
+  0x6f5c, 0x9063, 0x6d45, 0x8c34, 0x5811, 0x5d4c, 0x6b20, 0x6b49,
+  0x67aa, 0x545b, 0x8154, 0x7f8c, 0x5899, 0x8537, 0x5f3a, 0x62a2,
+  0x6a47, 0x9539, 0x6572, 0x6084, 0x6865, 0x77a7, 0x4e54, 0x4fa8,
+  0x5de7, 0x9798, 0x64ac, 0x7fd8, 0x5ced, 0x4fcf, 0x7a8d, 0x5207,
+  0x8304, 0x4e14, 0x602f, 0x7a83, 0x94a6, 0x4fb5, 0x4eb2, 0x79e6,
+  0x7434, 0x52e4, 0x82b9, 0x64d2, 0x79bd, 0x5bdd, 0x6c81, 0x9752,
+  0x8f7b, 0x6c22, 0x503e, 0x537f, 0x6e05, 0x64ce, 0x6674, 0x6c30,
+  0x60c5, 0x9877, 0x8bf7, 0x5e86, 0x743c, 0x7a77, 0x79cb, 0x4e18,
+  0x90b1, 0x7403, 0x6c42, 0x56da, 0x914b, 0x6cc5, 0x8d8b, 0x533a,
+  0x86c6, 0x66f2, 0x8eaf, 0x5c48, 0x9a71, 0x6e20,
+  /* 0xc8 */
+  0x83ee, 0x83ef, 0x83f3, 0x83f4, 0x83f5, 0x83f6, 0x83f7, 0x83fa,
+  0x83fb, 0x83fc, 0x83fe, 0x83ff, 0x8400, 0x8402, 0x8405, 0x8407,
+  0x8408, 0x8409, 0x840a, 0x8410, 0x8412, 0x8413, 0x8414, 0x8415,
+  0x8416, 0x8417, 0x8419, 0x841a, 0x841b, 0x841e, 0x841f, 0x8420,
+  0x8421, 0x8422, 0x8423, 0x8429, 0x842a, 0x842b, 0x842c, 0x842d,
+  0x842e, 0x842f, 0x8430, 0x8432, 0x8433, 0x8434, 0x8435, 0x8436,
+  0x8437, 0x8439, 0x843a, 0x843b, 0x843e, 0x843f, 0x8440, 0x8441,
+  0x8442, 0x8443, 0x8444, 0x8445, 0x8447, 0x8448, 0x8449, 0x844a,
+  0x844b, 0x844c, 0x844d, 0x844e, 0x844f, 0x8450, 0x8452, 0x8453,
+  0x8454, 0x8455, 0x8456, 0x8458, 0x845d, 0x845e, 0x845f, 0x8460,
+  0x8462, 0x8464, 0x8465, 0x8466, 0x8467, 0x8468, 0x846a, 0x846e,
+  0x846f, 0x8470, 0x8472, 0x8474, 0x8477, 0x8479, 0x847b, 0x847c,
+  0x53d6, 0x5a36, 0x9f8b, 0x8da3, 0x53bb, 0x5708, 0x98a7, 0x6743,
+  0x919b, 0x6cc9, 0x5168, 0x75ca, 0x62f3, 0x72ac, 0x5238, 0x529d,
+  0x7f3a, 0x7094, 0x7638, 0x5374, 0x9e4a, 0x69b7, 0x786e, 0x96c0,
+  0x88d9, 0x7fa4, 0x7136, 0x71c3, 0x5189, 0x67d3, 0x74e4, 0x58e4,
+  0x6518, 0x56b7, 0x8ba9, 0x9976, 0x6270, 0x7ed5, 0x60f9, 0x70ed,
+  0x58ec, 0x4ec1, 0x4eba, 0x5fcd, 0x97e7, 0x4efb, 0x8ba4, 0x5203,
+  0x598a, 0x7eab, 0x6254, 0x4ecd, 0x65e5, 0x620e, 0x8338, 0x84c9,
+  0x8363, 0x878d, 0x7194, 0x6eb6, 0x5bb9, 0x7ed2, 0x5197, 0x63c9,
+  0x67d4, 0x8089, 0x8339, 0x8815, 0x5112, 0x5b7a, 0x5982, 0x8fb1,
+  0x4e73, 0x6c5d, 0x5165, 0x8925, 0x8f6f, 0x962e, 0x854a, 0x745e,
+  0x9510, 0x95f0, 0x6da6, 0x82e5, 0x5f31, 0x6492, 0x6d12, 0x8428,
+  0x816e, 0x9cc3, 0x585e, 0x8d5b, 0x4e09, 0x53c1,
+  /* 0xc9 */
+  0x847d, 0x847e, 0x847f, 0x8480, 0x8481, 0x8483, 0x8484, 0x8485,
+  0x8486, 0x848a, 0x848d, 0x848f, 0x8490, 0x8491, 0x8492, 0x8493,
+  0x8494, 0x8495, 0x8496, 0x8498, 0x849a, 0x849b, 0x849d, 0x849e,
+  0x849f, 0x84a0, 0x84a2, 0x84a3, 0x84a4, 0x84a5, 0x84a6, 0x84a7,
+  0x84a8, 0x84a9, 0x84aa, 0x84ab, 0x84ac, 0x84ad, 0x84ae, 0x84b0,
+  0x84b1, 0x84b3, 0x84b5, 0x84b6, 0x84b7, 0x84bb, 0x84bc, 0x84be,
+  0x84c0, 0x84c2, 0x84c3, 0x84c5, 0x84c6, 0x84c7, 0x84c8, 0x84cb,
+  0x84cc, 0x84ce, 0x84cf, 0x84d2, 0x84d4, 0x84d5, 0x84d7, 0x84d8,
+  0x84d9, 0x84da, 0x84db, 0x84dc, 0x84de, 0x84e1, 0x84e2, 0x84e4,
+  0x84e7, 0x84e8, 0x84e9, 0x84ea, 0x84eb, 0x84ed, 0x84ee, 0x84ef,
+  0x84f1, 0x84f2, 0x84f3, 0x84f4, 0x84f5, 0x84f6, 0x84f7, 0x84f8,
+  0x84f9, 0x84fa, 0x84fb, 0x84fd, 0x84fe, 0x8500, 0x8501, 0x8502,
+  0x4f1e, 0x6563, 0x6851, 0x55d3, 0x4e27, 0x6414, 0x9a9a, 0x626b,
+  0x5ac2, 0x745f, 0x8272, 0x6da9, 0x68ee, 0x50e7, 0x838e, 0x7802,
+  0x6740, 0x5239, 0x6c99, 0x7eb1, 0x50bb, 0x5565, 0x715e, 0x7b5b,
+  0x6652, 0x73ca, 0x82eb, 0x6749, 0x5c71, 0x5220, 0x717d, 0x886b,
+  0x95ea, 0x9655, 0x64c5, 0x8d61, 0x81b3, 0x5584, 0x6c55, 0x6247,
+  0x7f2e, 0x5892, 0x4f24, 0x5546, 0x8d4f, 0x664c, 0x4e0a, 0x5c1a,
+  0x88f3, 0x68a2, 0x634e, 0x7a0d, 0x70e7, 0x828d, 0x52fa, 0x97f6,
+  0x5c11, 0x54e8, 0x90b5, 0x7ecd, 0x5962, 0x8d4a, 0x86c7, 0x820c,
+  0x820d, 0x8d66, 0x6444, 0x5c04, 0x6151, 0x6d89, 0x793e, 0x8bbe,
+  0x7837, 0x7533, 0x547b, 0x4f38, 0x8eab, 0x6df1, 0x5a20, 0x7ec5,
+  0x795e, 0x6c88, 0x5ba1, 0x5a76, 0x751a, 0x80be, 0x614e, 0x6e17,
+  0x58f0, 0x751f, 0x7525, 0x7272, 0x5347, 0x7ef3,
+  /* 0xca */
+  0x8503, 0x8504, 0x8505, 0x8506, 0x8507, 0x8508, 0x8509, 0x850a,
+  0x850b, 0x850d, 0x850e, 0x850f, 0x8510, 0x8512, 0x8514, 0x8515,
+  0x8516, 0x8518, 0x8519, 0x851b, 0x851c, 0x851d, 0x851e, 0x8520,
+  0x8522, 0x8523, 0x8524, 0x8525, 0x8526, 0x8527, 0x8528, 0x8529,
+  0x852a, 0x852d, 0x852e, 0x852f, 0x8530, 0x8531, 0x8532, 0x8533,
+  0x8534, 0x8535, 0x8536, 0x853e, 0x853f, 0x8540, 0x8541, 0x8542,
+  0x8544, 0x8545, 0x8546, 0x8547, 0x854b, 0x854c, 0x854d, 0x854e,
+  0x854f, 0x8550, 0x8551, 0x8552, 0x8553, 0x8554, 0x8555, 0x8557,
+  0x8558, 0x855a, 0x855b, 0x855c, 0x855d, 0x855f, 0x8560, 0x8561,
+  0x8562, 0x8563, 0x8565, 0x8566, 0x8567, 0x8569, 0x856a, 0x856b,
+  0x856c, 0x856d, 0x856e, 0x856f, 0x8570, 0x8571, 0x8573, 0x8575,
+  0x8576, 0x8577, 0x8578, 0x857c, 0x857d, 0x857f, 0x8580, 0x8581,
+  0x7701, 0x76db, 0x5269, 0x80dc, 0x5723, 0x5e08, 0x5931, 0x72ee,
+  0x65bd, 0x6e7f, 0x8bd7, 0x5c38, 0x8671, 0x5341, 0x77f3, 0x62fe,
+  0x65f6, 0x4ec0, 0x98df, 0x8680, 0x5b9e, 0x8bc6, 0x53f2, 0x77e2,
+  0x4f7f, 0x5c4e, 0x9a76, 0x59cb, 0x5f0f, 0x793a, 0x58eb, 0x4e16,
+  0x67ff, 0x4e8b, 0x62ed, 0x8a93, 0x901d, 0x52bf, 0x662f, 0x55dc,
+  0x566c, 0x9002, 0x4ed5, 0x4f8d, 0x91ca, 0x9970, 0x6c0f, 0x5e02,
+  0x6043, 0x5ba4, 0x89c6, 0x8bd5, 0x6536, 0x624b, 0x9996, 0x5b88,
+  0x5bff, 0x6388, 0x552e, 0x53d7, 0x7626, 0x517d, 0x852c, 0x67a2,
+  0x68b3, 0x6b8a, 0x6292, 0x8f93, 0x53d4, 0x8212, 0x6dd1, 0x758f,
+  0x4e66, 0x8d4e, 0x5b70, 0x719f, 0x85af, 0x6691, 0x66d9, 0x7f72,
+  0x8700, 0x9ecd, 0x9f20, 0x5c5e, 0x672f, 0x8ff0, 0x6811, 0x675f,
+  0x620d, 0x7ad6, 0x5885, 0x5eb6, 0x6570, 0x6f31,
+  /* 0xcb */
+  0x8582, 0x8583, 0x8586, 0x8588, 0x8589, 0x858a, 0x858b, 0x858c,
+  0x858d, 0x858e, 0x8590, 0x8591, 0x8592, 0x8593, 0x8594, 0x8595,
+  0x8596, 0x8597, 0x8598, 0x8599, 0x859a, 0x859d, 0x859e, 0x859f,
+  0x85a0, 0x85a1, 0x85a2, 0x85a3, 0x85a5, 0x85a6, 0x85a7, 0x85a9,
+  0x85ab, 0x85ac, 0x85ad, 0x85b1, 0x85b2, 0x85b3, 0x85b4, 0x85b5,
+  0x85b6, 0x85b8, 0x85ba, 0x85bb, 0x85bc, 0x85bd, 0x85be, 0x85bf,
+  0x85c0, 0x85c2, 0x85c3, 0x85c4, 0x85c5, 0x85c6, 0x85c7, 0x85c8,
+  0x85ca, 0x85cb, 0x85cc, 0x85cd, 0x85ce, 0x85d1, 0x85d2, 0x85d4,
+  0x85d6, 0x85d7, 0x85d8, 0x85d9, 0x85da, 0x85db, 0x85dd, 0x85de,
+  0x85df, 0x85e0, 0x85e1, 0x85e2, 0x85e3, 0x85e5, 0x85e6, 0x85e7,
+  0x85e8, 0x85ea, 0x85eb, 0x85ec, 0x85ed, 0x85ee, 0x85ef, 0x85f0,
+  0x85f1, 0x85f2, 0x85f3, 0x85f4, 0x85f5, 0x85f6, 0x85f7, 0x85f8,
+  0x6055, 0x5237, 0x800d, 0x6454, 0x8870, 0x7529, 0x5e05, 0x6813,
+  0x62f4, 0x971c, 0x53cc, 0x723d, 0x8c01, 0x6c34, 0x7761, 0x7a0e,
+  0x542e, 0x77ac, 0x987a, 0x821c, 0x8bf4, 0x7855, 0x6714, 0x70c1,
+  0x65af, 0x6495, 0x5636, 0x601d, 0x79c1, 0x53f8, 0x4e1d, 0x6b7b,
+  0x8086, 0x5bfa, 0x55e3, 0x56db, 0x4f3a, 0x4f3c, 0x9972, 0x5df3,
+  0x677e, 0x8038, 0x6002, 0x9882, 0x9001, 0x5b8b, 0x8bbc, 0x8bf5,
+  0x641c, 0x8258, 0x64de, 0x55fd, 0x82cf, 0x9165, 0x4fd7, 0x7d20,
+  0x901f, 0x7c9f, 0x50f3, 0x5851, 0x6eaf, 0x5bbf, 0x8bc9, 0x8083,
+  0x9178, 0x849c, 0x7b97, 0x867d, 0x968b, 0x968f, 0x7ee5, 0x9ad3,
+  0x788e, 0x5c81, 0x7a57, 0x9042, 0x96a7, 0x795f, 0x5b59, 0x635f,
+  0x7b0b, 0x84d1, 0x68ad, 0x5506, 0x7f29, 0x7410, 0x7d22, 0x9501,
+  0x6240, 0x584c, 0x4ed6, 0x5b83, 0x5979, 0x5854,
+  /* 0xcc */
+  0x85f9, 0x85fa, 0x85fc, 0x85fd, 0x85fe, 0x8600, 0x8601, 0x8602,
+  0x8603, 0x8604, 0x8606, 0x8607, 0x8608, 0x8609, 0x860a, 0x860b,
+  0x860c, 0x860d, 0x860e, 0x860f, 0x8610, 0x8612, 0x8613, 0x8614,
+  0x8615, 0x8617, 0x8618, 0x8619, 0x861a, 0x861b, 0x861c, 0x861d,
+  0x861e, 0x861f, 0x8620, 0x8621, 0x8622, 0x8623, 0x8624, 0x8625,
+  0x8626, 0x8628, 0x862a, 0x862b, 0x862c, 0x862d, 0x862e, 0x862f,
+  0x8630, 0x8631, 0x8632, 0x8633, 0x8634, 0x8635, 0x8636, 0x8637,
+  0x8639, 0x863a, 0x863b, 0x863d, 0x863e, 0x863f, 0x8640, 0x8641,
+  0x8642, 0x8643, 0x8644, 0x8645, 0x8646, 0x8647, 0x8648, 0x8649,
+  0x864a, 0x864b, 0x864c, 0x8652, 0x8653, 0x8655, 0x8656, 0x8657,
+  0x8658, 0x8659, 0x865b, 0x865c, 0x865d, 0x865f, 0x8660, 0x8661,
+  0x8663, 0x8664, 0x8665, 0x8666, 0x8667, 0x8668, 0x8669, 0x866a,
+  0x736d, 0x631e, 0x8e4b, 0x8e0f, 0x80ce, 0x82d4, 0x62ac, 0x53f0,
+  0x6cf0, 0x915e, 0x592a, 0x6001, 0x6c70, 0x574d, 0x644a, 0x8d2a,
+  0x762b, 0x6ee9, 0x575b, 0x6a80, 0x75f0, 0x6f6d, 0x8c2d, 0x8c08,
+  0x5766, 0x6bef, 0x8892, 0x78b3, 0x63a2, 0x53f9, 0x70ad, 0x6c64,
+  0x5858, 0x642a, 0x5802, 0x68e0, 0x819b, 0x5510, 0x7cd6, 0x5018,
+  0x8eba, 0x6dcc, 0x8d9f, 0x70eb, 0x638f, 0x6d9b, 0x6ed4, 0x7ee6,
+  0x8404, 0x6843, 0x9003, 0x6dd8, 0x9676, 0x8ba8, 0x5957, 0x7279,
+  0x85e4, 0x817e, 0x75bc, 0x8a8a, 0x68af, 0x5254, 0x8e22, 0x9511,
+  0x63d0, 0x9898, 0x8e44, 0x557c, 0x4f53, 0x66ff, 0x568f, 0x60d5,
+  0x6d95, 0x5243, 0x5c49, 0x5929, 0x6dfb, 0x586b, 0x7530, 0x751c,
+  0x606c, 0x8214, 0x8146, 0x6311, 0x6761, 0x8fe2, 0x773a, 0x8df3,
+  0x8d34, 0x94c1, 0x5e16, 0x5385, 0x542c, 0x70c3,
+  /* 0xcd */
+  0x866d, 0x866f, 0x8670, 0x8672, 0x8673, 0x8674, 0x8675, 0x8676,
+  0x8677, 0x8678, 0x8683, 0x8684, 0x8685, 0x8686, 0x8687, 0x8688,
+  0x8689, 0x868e, 0x868f, 0x8690, 0x8691, 0x8692, 0x8694, 0x8696,
+  0x8697, 0x8698, 0x8699, 0x869a, 0x869b, 0x869e, 0x869f, 0x86a0,
+  0x86a1, 0x86a2, 0x86a5, 0x86a6, 0x86ab, 0x86ad, 0x86ae, 0x86b2,
+  0x86b3, 0x86b7, 0x86b8, 0x86b9, 0x86bb, 0x86bc, 0x86bd, 0x86be,
+  0x86bf, 0x86c1, 0x86c2, 0x86c3, 0x86c5, 0x86c8, 0x86cc, 0x86cd,
+  0x86d2, 0x86d3, 0x86d5, 0x86d6, 0x86d7, 0x86da, 0x86dc, 0x86dd,
+  0x86e0, 0x86e1, 0x86e2, 0x86e3, 0x86e5, 0x86e6, 0x86e7, 0x86e8,
+  0x86ea, 0x86eb, 0x86ec, 0x86ef, 0x86f5, 0x86f6, 0x86f7, 0x86fa,
+  0x86fb, 0x86fc, 0x86fd, 0x86ff, 0x8701, 0x8704, 0x8705, 0x8706,
+  0x870b, 0x870c, 0x870e, 0x870f, 0x8710, 0x8711, 0x8714, 0x8716,
+  0x6c40, 0x5ef7, 0x505c, 0x4ead, 0x5ead, 0x633a, 0x8247, 0x901a,
+  0x6850, 0x916e, 0x77b3, 0x540c, 0x94dc, 0x5f64, 0x7ae5, 0x6876,
+  0x6345, 0x7b52, 0x7edf, 0x75db, 0x5077, 0x6295, 0x5934, 0x900f,
+  0x51f8, 0x79c3, 0x7a81, 0x56fe, 0x5f92, 0x9014, 0x6d82, 0x5c60,
+  0x571f, 0x5410, 0x5154, 0x6e4d, 0x56e2, 0x63a8, 0x9893, 0x817f,
+  0x8715, 0x892a, 0x9000, 0x541e, 0x5c6f, 0x81c0, 0x62d6, 0x6258,
+  0x8131, 0x9e35, 0x9640, 0x9a6e, 0x9a7c, 0x692d, 0x59a5, 0x62d3,
+  0x553e, 0x6316, 0x54c7, 0x86d9, 0x6d3c, 0x5a03, 0x74e6, 0x889c,
+  0x6b6a, 0x5916, 0x8c4c, 0x5f2f, 0x6e7e, 0x73a9, 0x987d, 0x4e38,
+  0x70f7, 0x5b8c, 0x7897, 0x633d, 0x665a, 0x7696, 0x60cb, 0x5b9b,
+  0x5a49, 0x4e07, 0x8155, 0x6c6a, 0x738b, 0x4ea1, 0x6789, 0x7f51,
+  0x5f80, 0x65fa, 0x671b, 0x5fd8, 0x5984, 0x5a01,
+  /* 0xce */
+  0x8719, 0x871b, 0x871d, 0x871f, 0x8720, 0x8724, 0x8726, 0x8727,
+  0x8728, 0x872a, 0x872b, 0x872c, 0x872d, 0x872f, 0x8730, 0x8732,
+  0x8733, 0x8735, 0x8736, 0x8738, 0x8739, 0x873a, 0x873c, 0x873d,
+  0x8740, 0x8741, 0x8742, 0x8743, 0x8744, 0x8745, 0x8746, 0x874a,
+  0x874b, 0x874d, 0x874f, 0x8750, 0x8751, 0x8752, 0x8754, 0x8755,
+  0x8756, 0x8758, 0x875a, 0x875b, 0x875c, 0x875d, 0x875e, 0x875f,
+  0x8761, 0x8762, 0x8766, 0x8767, 0x8768, 0x8769, 0x876a, 0x876b,
+  0x876c, 0x876d, 0x876f, 0x8771, 0x8772, 0x8773, 0x8775, 0x8777,
+  0x8778, 0x8779, 0x877a, 0x877f, 0x8780, 0x8781, 0x8784, 0x8786,
+  0x8787, 0x8789, 0x878a, 0x878c, 0x878e, 0x878f, 0x8790, 0x8791,
+  0x8792, 0x8794, 0x8795, 0x8796, 0x8798, 0x8799, 0x879a, 0x879b,
+  0x879c, 0x879d, 0x879e, 0x87a0, 0x87a1, 0x87a2, 0x87a3, 0x87a4,
+  0x5dcd, 0x5fae, 0x5371, 0x97e6, 0x8fdd, 0x6845, 0x56f4, 0x552f,
+  0x60df, 0x4e3a, 0x6f4d, 0x7ef4, 0x82c7, 0x840e, 0x59d4, 0x4f1f,
+  0x4f2a, 0x5c3e, 0x7eac, 0x672a, 0x851a, 0x5473, 0x754f, 0x80c3,
+  0x5582, 0x9b4f, 0x4f4d, 0x6e2d, 0x8c13, 0x5c09, 0x6170, 0x536b,
+  0x761f, 0x6e29, 0x868a, 0x6587, 0x95fb, 0x7eb9, 0x543b, 0x7a33,
+  0x7d0a, 0x95ee, 0x55e1, 0x7fc1, 0x74ee, 0x631d, 0x8717, 0x6da1,
+  0x7a9d, 0x6211, 0x65a1, 0x5367, 0x63e1, 0x6c83, 0x5deb, 0x545c,
+  0x94a8, 0x4e4c, 0x6c61, 0x8bec, 0x5c4b, 0x65e0, 0x829c, 0x68a7,
+  0x543e, 0x5434, 0x6bcb, 0x6b66, 0x4e94, 0x6342, 0x5348, 0x821e,
+  0x4f0d, 0x4fae, 0x575e, 0x620a, 0x96fe, 0x6664, 0x7269, 0x52ff,
+  0x52a1, 0x609f, 0x8bef, 0x6614, 0x7199, 0x6790, 0x897f, 0x7852,
+  0x77fd, 0x6670, 0x563b, 0x5438, 0x9521, 0x727a,
+  /* 0xcf */
+  0x87a5, 0x87a6, 0x87a7, 0x87a9, 0x87aa, 0x87ae, 0x87b0, 0x87b1,
+  0x87b2, 0x87b4, 0x87b6, 0x87b7, 0x87b8, 0x87b9, 0x87bb, 0x87bc,
+  0x87be, 0x87bf, 0x87c1, 0x87c2, 0x87c3, 0x87c4, 0x87c5, 0x87c7,
+  0x87c8, 0x87c9, 0x87cc, 0x87cd, 0x87ce, 0x87cf, 0x87d0, 0x87d4,
+  0x87d5, 0x87d6, 0x87d7, 0x87d8, 0x87d9, 0x87da, 0x87dc, 0x87dd,
+  0x87de, 0x87df, 0x87e1, 0x87e2, 0x87e3, 0x87e4, 0x87e6, 0x87e7,
+  0x87e8, 0x87e9, 0x87eb, 0x87ec, 0x87ed, 0x87ef, 0x87f0, 0x87f1,
+  0x87f2, 0x87f3, 0x87f4, 0x87f5, 0x87f6, 0x87f7, 0x87f8, 0x87fa,
+  0x87fb, 0x87fc, 0x87fd, 0x87ff, 0x8800, 0x8801, 0x8802, 0x8804,
+  0x8805, 0x8806, 0x8807, 0x8808, 0x8809, 0x880b, 0x880c, 0x880d,
+  0x880e, 0x880f, 0x8810, 0x8811, 0x8812, 0x8814, 0x8817, 0x8818,
+  0x8819, 0x881a, 0x881c, 0x881d, 0x881e, 0x881f, 0x8820, 0x8823,
+  0x7a00, 0x606f, 0x5e0c, 0x6089, 0x819d, 0x5915, 0x60dc, 0x7184,
+  0x70ef, 0x6eaa, 0x6c50, 0x7280, 0x6a84, 0x88ad, 0x5e2d, 0x4e60,
+  0x5ab3, 0x559c, 0x94e3, 0x6d17, 0x7cfb, 0x9699, 0x620f, 0x7ec6,
+  0x778e, 0x867e, 0x5323, 0x971e, 0x8f96, 0x6687, 0x5ce1, 0x4fa0,
+  0x72ed, 0x4e0b, 0x53a6, 0x590f, 0x5413, 0x6380, 0x9528, 0x5148,
+  0x4ed9, 0x9c9c, 0x7ea4, 0x54b8, 0x8d24, 0x8854, 0x8237, 0x95f2,
+  0x6d8e, 0x5f26, 0x5acc, 0x663e, 0x9669, 0x73b0, 0x732e, 0x53bf,
+  0x817a, 0x9985, 0x7fa1, 0x5baa, 0x9677, 0x9650, 0x7ebf, 0x76f8,
+  0x53a2, 0x9576, 0x9999, 0x7bb1, 0x8944, 0x6e58, 0x4e61, 0x7fd4,
+  0x7965, 0x8be6, 0x60f3, 0x54cd, 0x4eab, 0x9879, 0x5df7, 0x6a61,
+  0x50cf, 0x5411, 0x8c61, 0x8427, 0x785d, 0x9704, 0x524a, 0x54ee,
+  0x56a3, 0x9500, 0x6d88, 0x5bb5, 0x6dc6, 0x6653,
+  /* 0xd0 */
+  0x8824, 0x8825, 0x8826, 0x8827, 0x8828, 0x8829, 0x882a, 0x882b,
+  0x882c, 0x882d, 0x882e, 0x882f, 0x8830, 0x8831, 0x8833, 0x8834,
+  0x8835, 0x8836, 0x8837, 0x8838, 0x883a, 0x883b, 0x883d, 0x883e,
+  0x883f, 0x8841, 0x8842, 0x8843, 0x8846, 0x8847, 0x8848, 0x8849,
+  0x884a, 0x884b, 0x884e, 0x884f, 0x8850, 0x8851, 0x8852, 0x8853,
+  0x8855, 0x8856, 0x8858, 0x885a, 0x885b, 0x885c, 0x885d, 0x885e,
+  0x885f, 0x8860, 0x8866, 0x8867, 0x886a, 0x886d, 0x886f, 0x8871,
+  0x8873, 0x8874, 0x8875, 0x8876, 0x8878, 0x8879, 0x887a, 0x887b,
+  0x887c, 0x8880, 0x8883, 0x8886, 0x8887, 0x8889, 0x888a, 0x888c,
+  0x888e, 0x888f, 0x8890, 0x8891, 0x8893, 0x8894, 0x8895, 0x8897,
+  0x8898, 0x8899, 0x889a, 0x889b, 0x889d, 0x889e, 0x889f, 0x88a0,
+  0x88a1, 0x88a3, 0x88a5, 0x88a6, 0x88a7, 0x88a8, 0x88a9, 0x88aa,
+  0x5c0f, 0x5b5d, 0x6821, 0x8096, 0x5578, 0x7b11, 0x6548, 0x6954,
+  0x4e9b, 0x6b47, 0x874e, 0x978b, 0x534f, 0x631f, 0x643a, 0x90aa,
+  0x659c, 0x80c1, 0x8c10, 0x5199, 0x68b0, 0x5378, 0x87f9, 0x61c8,
+  0x6cc4, 0x6cfb, 0x8c22, 0x5c51, 0x85aa, 0x82af, 0x950c, 0x6b23,
+  0x8f9b, 0x65b0, 0x5ffb, 0x5fc3, 0x4fe1, 0x8845, 0x661f, 0x8165,
+  0x7329, 0x60fa, 0x5174, 0x5211, 0x578b, 0x5f62, 0x90a2, 0x884c,
+  0x9192, 0x5e78, 0x674f, 0x6027, 0x59d3, 0x5144, 0x51f6, 0x80f8,
+  0x5308, 0x6c79, 0x96c4, 0x718a, 0x4f11, 0x4fee, 0x7f9e, 0x673d,
+  0x55c5, 0x9508, 0x79c0, 0x8896, 0x7ee3, 0x589f, 0x620c, 0x9700,
+  0x865a, 0x5618, 0x987b, 0x5f90, 0x8bb8, 0x84c4, 0x9157, 0x53d9,
+  0x65ed, 0x5e8f, 0x755c, 0x6064, 0x7d6e, 0x5a7f, 0x7eea, 0x7eed,
+  0x8f69, 0x55a7, 0x5ba3, 0x60ac, 0x65cb, 0x7384,
+  /* 0xd1 */
+  0x88ac, 0x88ae, 0x88af, 0x88b0, 0x88b2, 0x88b3, 0x88b4, 0x88b5,
+  0x88b6, 0x88b8, 0x88b9, 0x88ba, 0x88bb, 0x88bd, 0x88be, 0x88bf,
+  0x88c0, 0x88c3, 0x88c4, 0x88c7, 0x88c8, 0x88ca, 0x88cb, 0x88cc,
+  0x88cd, 0x88cf, 0x88d0, 0x88d1, 0x88d3, 0x88d6, 0x88d7, 0x88da,
+  0x88db, 0x88dc, 0x88dd, 0x88de, 0x88e0, 0x88e1, 0x88e6, 0x88e7,
+  0x88e9, 0x88ea, 0x88eb, 0x88ec, 0x88ed, 0x88ee, 0x88ef, 0x88f2,
+  0x88f5, 0x88f6, 0x88f7, 0x88fa, 0x88fb, 0x88fd, 0x88ff, 0x8900,
+  0x8901, 0x8903, 0x8904, 0x8905, 0x8906, 0x8907, 0x8908, 0x8909,
+  0x890b, 0x890c, 0x890d, 0x890e, 0x890f, 0x8911, 0x8914, 0x8915,
+  0x8916, 0x8917, 0x8918, 0x891c, 0x891d, 0x891e, 0x891f, 0x8920,
+  0x8922, 0x8923, 0x8924, 0x8926, 0x8927, 0x8928, 0x8929, 0x892c,
+  0x892d, 0x892e, 0x892f, 0x8931, 0x8932, 0x8933, 0x8935, 0x8937,
+  0x9009, 0x7663, 0x7729, 0x7eda, 0x9774, 0x859b, 0x5b66, 0x7a74,
+  0x96ea, 0x8840, 0x52cb, 0x718f, 0x5faa, 0x65ec, 0x8be2, 0x5bfb,
+  0x9a6f, 0x5de1, 0x6b89, 0x6c5b, 0x8bad, 0x8baf, 0x900a, 0x8fc5,
+  0x538b, 0x62bc, 0x9e26, 0x9e2d, 0x5440, 0x4e2b, 0x82bd, 0x7259,
+  0x869c, 0x5d16, 0x8859, 0x6daf, 0x96c5, 0x54d1, 0x4e9a, 0x8bb6,
+  0x7109, 0x54bd, 0x9609, 0x70df, 0x6df9, 0x76d0, 0x4e25, 0x7814,
+  0x8712, 0x5ca9, 0x5ef6, 0x8a00, 0x989c, 0x960e, 0x708e, 0x6cbf,
+  0x5944, 0x63a9, 0x773c, 0x884d, 0x6f14, 0x8273, 0x5830, 0x71d5,
+  0x538c, 0x781a, 0x96c1, 0x5501, 0x5f66, 0x7130, 0x5bb4, 0x8c1a,
+  0x9a8c, 0x6b83, 0x592e, 0x9e2f, 0x79e7, 0x6768, 0x626c, 0x4f6f,
+  0x75a1, 0x7f8a, 0x6d0b, 0x9633, 0x6c27, 0x4ef0, 0x75d2, 0x517b,
+  0x6837, 0x6f3e, 0x9080, 0x8170, 0x5996, 0x7476,
+  /* 0xd2 */
+  0x8938, 0x8939, 0x893a, 0x893b, 0x893c, 0x893d, 0x893e, 0x893f,
+  0x8940, 0x8942, 0x8943, 0x8945, 0x8946, 0x8947, 0x8948, 0x8949,
+  0x894a, 0x894b, 0x894c, 0x894d, 0x894e, 0x894f, 0x8950, 0x8951,
+  0x8952, 0x8953, 0x8954, 0x8955, 0x8956, 0x8957, 0x8958, 0x8959,
+  0x895a, 0x895b, 0x895c, 0x895d, 0x8960, 0x8961, 0x8962, 0x8963,
+  0x8964, 0x8965, 0x8967, 0x8968, 0x8969, 0x896a, 0x896b, 0x896c,
+  0x896d, 0x896e, 0x896f, 0x8970, 0x8971, 0x8972, 0x8973, 0x8974,
+  0x8975, 0x8976, 0x8977, 0x8978, 0x8979, 0x897a, 0x897c, 0x897d,
+  0x897e, 0x8980, 0x8982, 0x8984, 0x8985, 0x8987, 0x8988, 0x8989,
+  0x898a, 0x898b, 0x898c, 0x898d, 0x898e, 0x898f, 0x8990, 0x8991,
+  0x8992, 0x8993, 0x8994, 0x8995, 0x8996, 0x8997, 0x8998, 0x8999,
+  0x899a, 0x899b, 0x899c, 0x899d, 0x899e, 0x899f, 0x89a0, 0x89a1,
+  0x6447, 0x5c27, 0x9065, 0x7a91, 0x8c23, 0x59da, 0x54ac, 0x8200,
+  0x836f, 0x8981, 0x8000, 0x6930, 0x564e, 0x8036, 0x7237, 0x91ce,
+  0x51b6, 0x4e5f, 0x9875, 0x6396, 0x4e1a, 0x53f6, 0x66f3, 0x814b,
+  0x591c, 0x6db2, 0x4e00, 0x58f9, 0x533b, 0x63d6, 0x94f1, 0x4f9d,
+  0x4f0a, 0x8863, 0x9890, 0x5937, 0x9057, 0x79fb, 0x4eea, 0x80f0,
+  0x7591, 0x6c82, 0x5b9c, 0x59e8, 0x5f5d, 0x6905, 0x8681, 0x501a,
+  0x5df2, 0x4e59, 0x77e3, 0x4ee5, 0x827a, 0x6291, 0x6613, 0x9091,
+  0x5c79, 0x4ebf, 0x5f79, 0x81c6, 0x9038, 0x8084, 0x75ab, 0x4ea6,
+  0x88d4, 0x610f, 0x6bc5, 0x5fc6, 0x4e49, 0x76ca, 0x6ea2, 0x8be3,
+  0x8bae, 0x8c0a, 0x8bd1, 0x5f02, 0x7ffc, 0x7fcc, 0x7ece, 0x8335,
+  0x836b, 0x56e0, 0x6bb7, 0x97f3, 0x9634, 0x59fb, 0x541f, 0x94f6,
+  0x6deb, 0x5bc5, 0x996e, 0x5c39, 0x5f15, 0x9690,
+  /* 0xd3 */
+  0x89a2, 0x89a3, 0x89a4, 0x89a5, 0x89a6, 0x89a7, 0x89a8, 0x89a9,
+  0x89aa, 0x89ab, 0x89ac, 0x89ad, 0x89ae, 0x89af, 0x89b0, 0x89b1,
+  0x89b2, 0x89b3, 0x89b4, 0x89b5, 0x89b6, 0x89b7, 0x89b8, 0x89b9,
+  0x89ba, 0x89bb, 0x89bc, 0x89bd, 0x89be, 0x89bf, 0x89c0, 0x89c3,
+  0x89cd, 0x89d3, 0x89d4, 0x89d5, 0x89d7, 0x89d8, 0x89d9, 0x89db,
+  0x89dd, 0x89df, 0x89e0, 0x89e1, 0x89e2, 0x89e4, 0x89e7, 0x89e8,
+  0x89e9, 0x89ea, 0x89ec, 0x89ed, 0x89ee, 0x89f0, 0x89f1, 0x89f2,
+  0x89f4, 0x89f5, 0x89f6, 0x89f7, 0x89f8, 0x89f9, 0x89fa, 0x89fb,
+  0x89fc, 0x89fd, 0x89fe, 0x89ff, 0x8a01, 0x8a02, 0x8a03, 0x8a04,
+  0x8a05, 0x8a06, 0x8a08, 0x8a09, 0x8a0a, 0x8a0b, 0x8a0c, 0x8a0d,
+  0x8a0e, 0x8a0f, 0x8a10, 0x8a11, 0x8a12, 0x8a13, 0x8a14, 0x8a15,
+  0x8a16, 0x8a17, 0x8a18, 0x8a19, 0x8a1a, 0x8a1b, 0x8a1c, 0x8a1d,
+  0x5370, 0x82f1, 0x6a31, 0x5a74, 0x9e70, 0x5e94, 0x7f28, 0x83b9,
+  0x8424, 0x8425, 0x8367, 0x8747, 0x8fce, 0x8d62, 0x76c8, 0x5f71,
+  0x9896, 0x786c, 0x6620, 0x54df, 0x62e5, 0x4f63, 0x81c3, 0x75c8,
+  0x5eb8, 0x96cd, 0x8e0a, 0x86f9, 0x548f, 0x6cf3, 0x6d8c, 0x6c38,
+  0x607f, 0x52c7, 0x7528, 0x5e7d, 0x4f18, 0x60a0, 0x5fe7, 0x5c24,
+  0x7531, 0x90ae, 0x94c0, 0x72b9, 0x6cb9, 0x6e38, 0x9149, 0x6709,
+  0x53cb, 0x53f3, 0x4f51, 0x91c9, 0x8bf1, 0x53c8, 0x5e7c, 0x8fc2,
+  0x6de4, 0x4e8e, 0x76c2, 0x6986, 0x865e, 0x611a, 0x8206, 0x4f59,
+  0x4fde, 0x903e, 0x9c7c, 0x6109, 0x6e1d, 0x6e14, 0x9685, 0x4e88,
+  0x5a31, 0x96e8, 0x4e0e, 0x5c7f, 0x79b9, 0x5b87, 0x8bed, 0x7fbd,
+  0x7389, 0x57df, 0x828b, 0x90c1, 0x5401, 0x9047, 0x55bb, 0x5cea,
+  0x5fa1, 0x6108, 0x6b32, 0x72f1, 0x80b2, 0x8a89,
+  /* 0xd4 */
+  0x8a1e, 0x8a1f, 0x8a20, 0x8a21, 0x8a22, 0x8a23, 0x8a24, 0x8a25,
+  0x8a26, 0x8a27, 0x8a28, 0x8a29, 0x8a2a, 0x8a2b, 0x8a2c, 0x8a2d,
+  0x8a2e, 0x8a2f, 0x8a30, 0x8a31, 0x8a32, 0x8a33, 0x8a34, 0x8a35,
+  0x8a36, 0x8a37, 0x8a38, 0x8a39, 0x8a3a, 0x8a3b, 0x8a3c, 0x8a3d,
+  0x8a3f, 0x8a40, 0x8a41, 0x8a42, 0x8a43, 0x8a44, 0x8a45, 0x8a46,
+  0x8a47, 0x8a49, 0x8a4a, 0x8a4b, 0x8a4c, 0x8a4d, 0x8a4e, 0x8a4f,
+  0x8a50, 0x8a51, 0x8a52, 0x8a53, 0x8a54, 0x8a55, 0x8a56, 0x8a57,
+  0x8a58, 0x8a59, 0x8a5a, 0x8a5b, 0x8a5c, 0x8a5d, 0x8a5e, 0x8a5f,
+  0x8a60, 0x8a61, 0x8a62, 0x8a63, 0x8a64, 0x8a65, 0x8a66, 0x8a67,
+  0x8a68, 0x8a69, 0x8a6a, 0x8a6b, 0x8a6c, 0x8a6d, 0x8a6e, 0x8a6f,
+  0x8a70, 0x8a71, 0x8a72, 0x8a73, 0x8a74, 0x8a75, 0x8a76, 0x8a77,
+  0x8a78, 0x8a7a, 0x8a7b, 0x8a7c, 0x8a7d, 0x8a7e, 0x8a7f, 0x8a80,
+  0x6d74, 0x5bd3, 0x88d5, 0x9884, 0x8c6b, 0x9a6d, 0x9e33, 0x6e0a,
+  0x51a4, 0x5143, 0x57a3, 0x8881, 0x539f, 0x63f4, 0x8f95, 0x56ed,
+  0x5458, 0x5706, 0x733f, 0x6e90, 0x7f18, 0x8fdc, 0x82d1, 0x613f,
+  0x6028, 0x9662, 0x66f0, 0x7ea6, 0x8d8a, 0x8dc3, 0x94a5, 0x5cb3,
+  0x7ca4, 0x6708, 0x60a6, 0x9605, 0x8018, 0x4e91, 0x90e7, 0x5300,
+  0x9668, 0x5141, 0x8fd0, 0x8574, 0x915d, 0x6655, 0x97f5, 0x5b55,
+  0x531d, 0x7838, 0x6742, 0x683d, 0x54c9, 0x707e, 0x5bb0, 0x8f7d,
+  0x518d, 0x5728, 0x54b1, 0x6512, 0x6682, 0x8d5e, 0x8d43, 0x810f,
+  0x846c, 0x906d, 0x7cdf, 0x51ff, 0x85fb, 0x67a3, 0x65e9, 0x6fa1,
+  0x86a4, 0x8e81, 0x566a, 0x9020, 0x7682, 0x7076, 0x71e5, 0x8d23,
+  0x62e9, 0x5219, 0x6cfd, 0x8d3c, 0x600e, 0x589e, 0x618e, 0x66fe,
+  0x8d60, 0x624e, 0x55b3, 0x6e23, 0x672d, 0x8f67,
+  /* 0xd5 */
+  0x8a81, 0x8a82, 0x8a83, 0x8a84, 0x8a85, 0x8a86, 0x8a87, 0x8a88,
+  0x8a8b, 0x8a8c, 0x8a8d, 0x8a8e, 0x8a8f, 0x8a90, 0x8a91, 0x8a92,
+  0x8a94, 0x8a95, 0x8a96, 0x8a97, 0x8a98, 0x8a99, 0x8a9a, 0x8a9b,
+  0x8a9c, 0x8a9d, 0x8a9e, 0x8a9f, 0x8aa0, 0x8aa1, 0x8aa2, 0x8aa3,
+  0x8aa4, 0x8aa5, 0x8aa6, 0x8aa7, 0x8aa8, 0x8aa9, 0x8aaa, 0x8aab,
+  0x8aac, 0x8aad, 0x8aae, 0x8aaf, 0x8ab0, 0x8ab1, 0x8ab2, 0x8ab3,
+  0x8ab4, 0x8ab5, 0x8ab6, 0x8ab7, 0x8ab8, 0x8ab9, 0x8aba, 0x8abb,
+  0x8abc, 0x8abd, 0x8abe, 0x8abf, 0x8ac0, 0x8ac1, 0x8ac2, 0x8ac3,
+  0x8ac4, 0x8ac5, 0x8ac6, 0x8ac7, 0x8ac8, 0x8ac9, 0x8aca, 0x8acb,
+  0x8acc, 0x8acd, 0x8ace, 0x8acf, 0x8ad0, 0x8ad1, 0x8ad2, 0x8ad3,
+  0x8ad4, 0x8ad5, 0x8ad6, 0x8ad7, 0x8ad8, 0x8ad9, 0x8ada, 0x8adb,
+  0x8adc, 0x8add, 0x8ade, 0x8adf, 0x8ae0, 0x8ae1, 0x8ae2, 0x8ae3,
+  0x94e1, 0x95f8, 0x7728, 0x6805, 0x69a8, 0x548b, 0x4e4d, 0x70b8,
+  0x8bc8, 0x6458, 0x658b, 0x5b85, 0x7a84, 0x503a, 0x5be8, 0x77bb,
+  0x6be1, 0x8a79, 0x7c98, 0x6cbe, 0x76cf, 0x65a9, 0x8f97, 0x5d2d,
+  0x5c55, 0x8638, 0x6808, 0x5360, 0x6218, 0x7ad9, 0x6e5b, 0x7efd,
+  0x6a1f, 0x7ae0, 0x5f70, 0x6f33, 0x5f20, 0x638c, 0x6da8, 0x6756,
+  0x4e08, 0x5e10, 0x8d26, 0x4ed7, 0x80c0, 0x7634, 0x969c, 0x62db,
+  0x662d, 0x627e, 0x6cbc, 0x8d75, 0x7167, 0x7f69, 0x5146, 0x8087,
+  0x53ec, 0x906e, 0x6298, 0x54f2, 0x86f0, 0x8f99, 0x8005, 0x9517,
+  0x8517, 0x8fd9, 0x6d59, 0x73cd, 0x659f, 0x771f, 0x7504, 0x7827,
+  0x81fb, 0x8d1e, 0x9488, 0x4fa6, 0x6795, 0x75b9, 0x8bca, 0x9707,
+  0x632f, 0x9547, 0x9635, 0x84b8, 0x6323, 0x7741, 0x5f81, 0x72f0,
+  0x4e89, 0x6014, 0x6574, 0x62ef, 0x6b63, 0x653f,
+  /* 0xd6 */
+  0x8ae4, 0x8ae5, 0x8ae6, 0x8ae7, 0x8ae8, 0x8ae9, 0x8aea, 0x8aeb,
+  0x8aec, 0x8aed, 0x8aee, 0x8aef, 0x8af0, 0x8af1, 0x8af2, 0x8af3,
+  0x8af4, 0x8af5, 0x8af6, 0x8af7, 0x8af8, 0x8af9, 0x8afa, 0x8afb,
+  0x8afc, 0x8afd, 0x8afe, 0x8aff, 0x8b00, 0x8b01, 0x8b02, 0x8b03,
+  0x8b04, 0x8b05, 0x8b06, 0x8b08, 0x8b09, 0x8b0a, 0x8b0b, 0x8b0c,
+  0x8b0d, 0x8b0e, 0x8b0f, 0x8b10, 0x8b11, 0x8b12, 0x8b13, 0x8b14,
+  0x8b15, 0x8b16, 0x8b17, 0x8b18, 0x8b19, 0x8b1a, 0x8b1b, 0x8b1c,
+  0x8b1d, 0x8b1e, 0x8b1f, 0x8b20, 0x8b21, 0x8b22, 0x8b23, 0x8b24,
+  0x8b25, 0x8b27, 0x8b28, 0x8b29, 0x8b2a, 0x8b2b, 0x8b2c, 0x8b2d,
+  0x8b2e, 0x8b2f, 0x8b30, 0x8b31, 0x8b32, 0x8b33, 0x8b34, 0x8b35,
+  0x8b36, 0x8b37, 0x8b38, 0x8b39, 0x8b3a, 0x8b3b, 0x8b3c, 0x8b3d,
+  0x8b3e, 0x8b3f, 0x8b40, 0x8b41, 0x8b42, 0x8b43, 0x8b44, 0x8b45,
+  0x5e27, 0x75c7, 0x90d1, 0x8bc1, 0x829d, 0x679d, 0x652f, 0x5431,
+  0x8718, 0x77e5, 0x80a2, 0x8102, 0x6c41, 0x4e4b, 0x7ec7, 0x804c,
+  0x76f4, 0x690d, 0x6b96, 0x6267, 0x503c, 0x4f84, 0x5740, 0x6307,
+  0x6b62, 0x8dbe, 0x53ea, 0x65e8, 0x7eb8, 0x5fd7, 0x631a, 0x63b7,
+  0x81f3, 0x81f4, 0x7f6e, 0x5e1c, 0x5cd9, 0x5236, 0x667a, 0x79e9,
+  0x7a1a, 0x8d28, 0x7099, 0x75d4, 0x6ede, 0x6cbb, 0x7a92, 0x4e2d,
+  0x76c5, 0x5fe0, 0x949f, 0x8877, 0x7ec8, 0x79cd, 0x80bf, 0x91cd,
+  0x4ef2, 0x4f17, 0x821f, 0x5468, 0x5dde, 0x6d32, 0x8bcc, 0x7ca5,
+  0x8f74, 0x8098, 0x5e1a, 0x5492, 0x76b1, 0x5b99, 0x663c, 0x9aa4,
+  0x73e0, 0x682a, 0x86db, 0x6731, 0x732a, 0x8bf8, 0x8bdb, 0x9010,
+  0x7af9, 0x70db, 0x716e, 0x62c4, 0x77a9, 0x5631, 0x4e3b, 0x8457,
+  0x67f1, 0x52a9, 0x86c0, 0x8d2e, 0x94f8, 0x7b51,
+  /* 0xd7 */
+  0x8b46, 0x8b47, 0x8b48, 0x8b49, 0x8b4a, 0x8b4b, 0x8b4c, 0x8b4d,
+  0x8b4e, 0x8b4f, 0x8b50, 0x8b51, 0x8b52, 0x8b53, 0x8b54, 0x8b55,
+  0x8b56, 0x8b57, 0x8b58, 0x8b59, 0x8b5a, 0x8b5b, 0x8b5c, 0x8b5d,
+  0x8b5e, 0x8b5f, 0x8b60, 0x8b61, 0x8b62, 0x8b63, 0x8b64, 0x8b65,
+  0x8b67, 0x8b68, 0x8b69, 0x8b6a, 0x8b6b, 0x8b6d, 0x8b6e, 0x8b6f,
+  0x8b70, 0x8b71, 0x8b72, 0x8b73, 0x8b74, 0x8b75, 0x8b76, 0x8b77,
+  0x8b78, 0x8b79, 0x8b7a, 0x8b7b, 0x8b7c, 0x8b7d, 0x8b7e, 0x8b7f,
+  0x8b80, 0x8b81, 0x8b82, 0x8b83, 0x8b84, 0x8b85, 0x8b86, 0x8b87,
+  0x8b88, 0x8b89, 0x8b8a, 0x8b8b, 0x8b8c, 0x8b8d, 0x8b8e, 0x8b8f,
+  0x8b90, 0x8b91, 0x8b92, 0x8b93, 0x8b94, 0x8b95, 0x8b96, 0x8b97,
+  0x8b98, 0x8b99, 0x8b9a, 0x8b9b, 0x8b9c, 0x8b9d, 0x8b9e, 0x8b9f,
+  0x8bac, 0x8bb1, 0x8bbb, 0x8bc7, 0x8bd0, 0x8bea, 0x8c09, 0x8c1e,
+  0x4f4f, 0x6ce8, 0x795d, 0x9a7b, 0x6293, 0x722a, 0x62fd, 0x4e13,
+  0x7816, 0x8f6c, 0x64b0, 0x8d5a, 0x7bc6, 0x6869, 0x5e84, 0x88c5,
+  0x5986, 0x649e, 0x58ee, 0x72b6, 0x690e, 0x9525, 0x8ffd, 0x8d58,
+  0x5760, 0x7f00, 0x8c06, 0x51c6, 0x6349, 0x62d9, 0x5353, 0x684c,
+  0x7422, 0x8301, 0x914c, 0x5544, 0x7740, 0x707c, 0x6d4a, 0x5179,
+  0x54a8, 0x8d44, 0x59ff, 0x6ecb, 0x6dc4, 0x5b5c, 0x7d2b, 0x4ed4,
+  0x7c7d, 0x6ed3, 0x5b50, 0x81ea, 0x6e0d, 0x5b57, 0x9b03, 0x68d5,
+  0x8e2a, 0x5b97, 0x7efc, 0x603b, 0x7eb5, 0x90b9, 0x8d70, 0x594f,
+  0x63cd, 0x79df, 0x8db3, 0x5352, 0x65cf, 0x7956, 0x8bc5, 0x963b,
+  0x7ec4, 0x94bb, 0x7e82, 0x5634, 0x9189, 0x6700, 0x7f6a, 0x5c0a,
+  0x9075, 0x6628, 0x5de6, 0x4f50, 0x67de, 0x505a, 0x4f5c, 0x5750,
+  0x5ea7, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0xd8 */
+  0x8c38, 0x8c39, 0x8c3a, 0x8c3b, 0x8c3c, 0x8c3d, 0x8c3e, 0x8c3f,
+  0x8c40, 0x8c42, 0x8c43, 0x8c44, 0x8c45, 0x8c48, 0x8c4a, 0x8c4b,
+  0x8c4d, 0x8c4e, 0x8c4f, 0x8c50, 0x8c51, 0x8c52, 0x8c53, 0x8c54,
+  0x8c56, 0x8c57, 0x8c58, 0x8c59, 0x8c5b, 0x8c5c, 0x8c5d, 0x8c5e,
+  0x8c5f, 0x8c60, 0x8c63, 0x8c64, 0x8c65, 0x8c66, 0x8c67, 0x8c68,
+  0x8c69, 0x8c6c, 0x8c6d, 0x8c6e, 0x8c6f, 0x8c70, 0x8c71, 0x8c72,
+  0x8c74, 0x8c75, 0x8c76, 0x8c77, 0x8c7b, 0x8c7c, 0x8c7d, 0x8c7e,
+  0x8c7f, 0x8c80, 0x8c81, 0x8c83, 0x8c84, 0x8c86, 0x8c87, 0x8c88,
+  0x8c8b, 0x8c8d, 0x8c8e, 0x8c8f, 0x8c90, 0x8c91, 0x8c92, 0x8c93,
+  0x8c95, 0x8c96, 0x8c97, 0x8c99, 0x8c9a, 0x8c9b, 0x8c9c, 0x8c9d,
+  0x8c9e, 0x8c9f, 0x8ca0, 0x8ca1, 0x8ca2, 0x8ca3, 0x8ca4, 0x8ca5,
+  0x8ca6, 0x8ca7, 0x8ca8, 0x8ca9, 0x8caa, 0x8cab, 0x8cac, 0x8cad,
+  0x4e8d, 0x4e0c, 0x5140, 0x4e10, 0x5eff, 0x5345, 0x4e15, 0x4e98,
+  0x4e1e, 0x9b32, 0x5b6c, 0x5669, 0x4e28, 0x79ba, 0x4e3f, 0x5315,
+  0x4e47, 0x592d, 0x723b, 0x536e, 0x6c10, 0x56df, 0x80e4, 0x9997,
+  0x6bd3, 0x777e, 0x9f17, 0x4e36, 0x4e9f, 0x9f10, 0x4e5c, 0x4e69,
+  0x4e93, 0x8288, 0x5b5b, 0x556c, 0x560f, 0x4ec4, 0x538d, 0x539d,
+  0x53a3, 0x53a5, 0x53ae, 0x9765, 0x8d5d, 0x531a, 0x53f5, 0x5326,
+  0x532e, 0x533e, 0x8d5c, 0x5366, 0x5363, 0x5202, 0x5208, 0x520e,
+  0x522d, 0x5233, 0x523f, 0x5240, 0x524c, 0x525e, 0x5261, 0x525c,
+  0x84af, 0x527d, 0x5282, 0x5281, 0x5290, 0x5293, 0x5182, 0x7f54,
+  0x4ebb, 0x4ec3, 0x4ec9, 0x4ec2, 0x4ee8, 0x4ee1, 0x4eeb, 0x4ede,
+  0x4f1b, 0x4ef3, 0x4f22, 0x4f64, 0x4ef5, 0x4f25, 0x4f27, 0x4f09,
+  0x4f2b, 0x4f5e, 0x4f67, 0x6538, 0x4f5a, 0x4f5d,
+  /* 0xd9 */
+  0x8cae, 0x8caf, 0x8cb0, 0x8cb1, 0x8cb2, 0x8cb3, 0x8cb4, 0x8cb5,
+  0x8cb6, 0x8cb7, 0x8cb8, 0x8cb9, 0x8cba, 0x8cbb, 0x8cbc, 0x8cbd,
+  0x8cbe, 0x8cbf, 0x8cc0, 0x8cc1, 0x8cc2, 0x8cc3, 0x8cc4, 0x8cc5,
+  0x8cc6, 0x8cc7, 0x8cc8, 0x8cc9, 0x8cca, 0x8ccb, 0x8ccc, 0x8ccd,
+  0x8cce, 0x8ccf, 0x8cd0, 0x8cd1, 0x8cd2, 0x8cd3, 0x8cd4, 0x8cd5,
+  0x8cd6, 0x8cd7, 0x8cd8, 0x8cd9, 0x8cda, 0x8cdb, 0x8cdc, 0x8cdd,
+  0x8cde, 0x8cdf, 0x8ce0, 0x8ce1, 0x8ce2, 0x8ce3, 0x8ce4, 0x8ce5,
+  0x8ce6, 0x8ce7, 0x8ce8, 0x8ce9, 0x8cea, 0x8ceb, 0x8cec, 0x8ced,
+  0x8cee, 0x8cef, 0x8cf0, 0x8cf1, 0x8cf2, 0x8cf3, 0x8cf4, 0x8cf5,
+  0x8cf6, 0x8cf7, 0x8cf8, 0x8cf9, 0x8cfa, 0x8cfb, 0x8cfc, 0x8cfd,
+  0x8cfe, 0x8cff, 0x8d00, 0x8d01, 0x8d02, 0x8d03, 0x8d04, 0x8d05,
+  0x8d06, 0x8d07, 0x8d08, 0x8d09, 0x8d0a, 0x8d0b, 0x8d0c, 0x8d0d,
+  0x4f5f, 0x4f57, 0x4f32, 0x4f3d, 0x4f76, 0x4f74, 0x4f91, 0x4f89,
+  0x4f83, 0x4f8f, 0x4f7e, 0x4f7b, 0x4faa, 0x4f7c, 0x4fac, 0x4f94,
+  0x4fe6, 0x4fe8, 0x4fea, 0x4fc5, 0x4fda, 0x4fe3, 0x4fdc, 0x4fd1,
+  0x4fdf, 0x4ff8, 0x5029, 0x504c, 0x4ff3, 0x502c, 0x500f, 0x502e,
+  0x502d, 0x4ffe, 0x501c, 0x500c, 0x5025, 0x5028, 0x507e, 0x5043,
+  0x5055, 0x5048, 0x504e, 0x506c, 0x507b, 0x50a5, 0x50a7, 0x50a9,
+  0x50ba, 0x50d6, 0x5106, 0x50ed, 0x50ec, 0x50e6, 0x50ee, 0x5107,
+  0x510b, 0x4edd, 0x6c3d, 0x4f58, 0x4f65, 0x4fce, 0x9fa0, 0x6c46,
+  0x7c74, 0x516e, 0x5dfd, 0x9ec9, 0x9998, 0x5181, 0x5914, 0x52f9,
+  0x530d, 0x8a07, 0x5310, 0x51eb, 0x5919, 0x5155, 0x4ea0, 0x5156,
+  0x4eb3, 0x886e, 0x88a4, 0x4eb5, 0x8114, 0x88d2, 0x7980, 0x5b34,
+  0x8803, 0x7fb8, 0x51ab, 0x51b1, 0x51bd, 0x51bc,
+  /* 0xda */
+  0x8d0e, 0x8d0f, 0x8d10, 0x8d11, 0x8d12, 0x8d13, 0x8d14, 0x8d15,
+  0x8d16, 0x8d17, 0x8d18, 0x8d19, 0x8d1a, 0x8d1b, 0x8d1c, 0x8d20,
+  0x8d51, 0x8d52, 0x8d57, 0x8d5f, 0x8d65, 0x8d68, 0x8d69, 0x8d6a,
+  0x8d6c, 0x8d6e, 0x8d6f, 0x8d71, 0x8d72, 0x8d78, 0x8d79, 0x8d7a,
+  0x8d7b, 0x8d7c, 0x8d7d, 0x8d7e, 0x8d7f, 0x8d80, 0x8d82, 0x8d83,
+  0x8d86, 0x8d87, 0x8d88, 0x8d89, 0x8d8c, 0x8d8d, 0x8d8e, 0x8d8f,
+  0x8d90, 0x8d92, 0x8d93, 0x8d95, 0x8d96, 0x8d97, 0x8d98, 0x8d99,
+  0x8d9a, 0x8d9b, 0x8d9c, 0x8d9d, 0x8d9e, 0x8da0, 0x8da1, 0x8da2,
+  0x8da4, 0x8da5, 0x8da6, 0x8da7, 0x8da8, 0x8da9, 0x8daa, 0x8dab,
+  0x8dac, 0x8dad, 0x8dae, 0x8daf, 0x8db0, 0x8db2, 0x8db6, 0x8db7,
+  0x8db9, 0x8dbb, 0x8dbd, 0x8dc0, 0x8dc1, 0x8dc2, 0x8dc5, 0x8dc7,
+  0x8dc8, 0x8dc9, 0x8dca, 0x8dcd, 0x8dd0, 0x8dd2, 0x8dd3, 0x8dd4,
+  0x51c7, 0x5196, 0x51a2, 0x51a5, 0x8ba0, 0x8ba6, 0x8ba7, 0x8baa,
+  0x8bb4, 0x8bb5, 0x8bb7, 0x8bc2, 0x8bc3, 0x8bcb, 0x8bcf, 0x8bce,
+  0x8bd2, 0x8bd3, 0x8bd4, 0x8bd6, 0x8bd8, 0x8bd9, 0x8bdc, 0x8bdf,
+  0x8be0, 0x8be4, 0x8be8, 0x8be9, 0x8bee, 0x8bf0, 0x8bf3, 0x8bf6,
+  0x8bf9, 0x8bfc, 0x8bff, 0x8c00, 0x8c02, 0x8c04, 0x8c07, 0x8c0c,
+  0x8c0f, 0x8c11, 0x8c12, 0x8c14, 0x8c15, 0x8c16, 0x8c19, 0x8c1b,
+  0x8c18, 0x8c1d, 0x8c1f, 0x8c20, 0x8c21, 0x8c25, 0x8c27, 0x8c2a,
+  0x8c2b, 0x8c2e, 0x8c2f, 0x8c32, 0x8c33, 0x8c35, 0x8c36, 0x5369,
+  0x537a, 0x961d, 0x9622, 0x9621, 0x9631, 0x962a, 0x963d, 0x963c,
+  0x9642, 0x9649, 0x9654, 0x965f, 0x9667, 0x966c, 0x9672, 0x9674,
+  0x9688, 0x968d, 0x9697, 0x96b0, 0x9097, 0x909b, 0x909d, 0x9099,
+  0x90ac, 0x90a1, 0x90b4, 0x90b3, 0x90b6, 0x90ba,
+  /* 0xdb */
+  0x8dd5, 0x8dd8, 0x8dd9, 0x8ddc, 0x8de0, 0x8de1, 0x8de2, 0x8de5,
+  0x8de6, 0x8de7, 0x8de9, 0x8ded, 0x8dee, 0x8df0, 0x8df1, 0x8df2,
+  0x8df4, 0x8df6, 0x8dfc, 0x8dfe, 0x8dff, 0x8e00, 0x8e01, 0x8e02,
+  0x8e03, 0x8e04, 0x8e06, 0x8e07, 0x8e08, 0x8e0b, 0x8e0d, 0x8e0e,
+  0x8e10, 0x8e11, 0x8e12, 0x8e13, 0x8e15, 0x8e16, 0x8e17, 0x8e18,
+  0x8e19, 0x8e1a, 0x8e1b, 0x8e1c, 0x8e20, 0x8e21, 0x8e24, 0x8e25,
+  0x8e26, 0x8e27, 0x8e28, 0x8e2b, 0x8e2d, 0x8e30, 0x8e32, 0x8e33,
+  0x8e34, 0x8e36, 0x8e37, 0x8e38, 0x8e3b, 0x8e3c, 0x8e3e, 0x8e3f,
+  0x8e43, 0x8e45, 0x8e46, 0x8e4c, 0x8e4d, 0x8e4e, 0x8e4f, 0x8e50,
+  0x8e53, 0x8e54, 0x8e55, 0x8e56, 0x8e57, 0x8e58, 0x8e5a, 0x8e5b,
+  0x8e5c, 0x8e5d, 0x8e5e, 0x8e5f, 0x8e60, 0x8e61, 0x8e62, 0x8e63,
+  0x8e64, 0x8e65, 0x8e67, 0x8e68, 0x8e6a, 0x8e6b, 0x8e6e, 0x8e71,
+  0x90b8, 0x90b0, 0x90cf, 0x90c5, 0x90be, 0x90d0, 0x90c4, 0x90c7,
+  0x90d3, 0x90e6, 0x90e2, 0x90dc, 0x90d7, 0x90db, 0x90eb, 0x90ef,
+  0x90fe, 0x9104, 0x9122, 0x911e, 0x9123, 0x9131, 0x912f, 0x9139,
+  0x9143, 0x9146, 0x520d, 0x5942, 0x52a2, 0x52ac, 0x52ad, 0x52be,
+  0x54ff, 0x52d0, 0x52d6, 0x52f0, 0x53df, 0x71ee, 0x77cd, 0x5ef4,
+  0x51f5, 0x51fc, 0x9b2f, 0x53b6, 0x5f01, 0x755a, 0x5def, 0x574c,
+  0x57a9, 0x57a1, 0x587e, 0x58bc, 0x58c5, 0x58d1, 0x5729, 0x572c,
+  0x572a, 0x5733, 0x5739, 0x572e, 0x572f, 0x575c, 0x573b, 0x5742,
+  0x5769, 0x5785, 0x576b, 0x5786, 0x577c, 0x577b, 0x5768, 0x576d,
+  0x5776, 0x5773, 0x57ad, 0x57a4, 0x578c, 0x57b2, 0x57cf, 0x57a7,
+  0x57b4, 0x5793, 0x57a0, 0x57d5, 0x57d8, 0x57da, 0x57d9, 0x57d2,
+  0x57b8, 0x57f4, 0x57ef, 0x57f8, 0x57e4, 0x57dd,
+  /* 0xdc */
+  0x8e73, 0x8e75, 0x8e77, 0x8e78, 0x8e79, 0x8e7a, 0x8e7b, 0x8e7d,
+  0x8e7e, 0x8e80, 0x8e82, 0x8e83, 0x8e84, 0x8e86, 0x8e88, 0x8e89,
+  0x8e8a, 0x8e8b, 0x8e8c, 0x8e8d, 0x8e8e, 0x8e91, 0x8e92, 0x8e93,
+  0x8e95, 0x8e96, 0x8e97, 0x8e98, 0x8e99, 0x8e9a, 0x8e9b, 0x8e9d,
+  0x8e9f, 0x8ea0, 0x8ea1, 0x8ea2, 0x8ea3, 0x8ea4, 0x8ea5, 0x8ea6,
+  0x8ea7, 0x8ea8, 0x8ea9, 0x8eaa, 0x8ead, 0x8eae, 0x8eb0, 0x8eb1,
+  0x8eb3, 0x8eb4, 0x8eb5, 0x8eb6, 0x8eb7, 0x8eb8, 0x8eb9, 0x8ebb,
+  0x8ebc, 0x8ebd, 0x8ebe, 0x8ebf, 0x8ec0, 0x8ec1, 0x8ec2, 0x8ec3,
+  0x8ec4, 0x8ec5, 0x8ec6, 0x8ec7, 0x8ec8, 0x8ec9, 0x8eca, 0x8ecb,
+  0x8ecc, 0x8ecd, 0x8ecf, 0x8ed0, 0x8ed1, 0x8ed2, 0x8ed3, 0x8ed4,
+  0x8ed5, 0x8ed6, 0x8ed7, 0x8ed8, 0x8ed9, 0x8eda, 0x8edb, 0x8edc,
+  0x8edd, 0x8ede, 0x8edf, 0x8ee0, 0x8ee1, 0x8ee2, 0x8ee3, 0x8ee4,
+  0x580b, 0x580d, 0x57fd, 0x57ed, 0x5800, 0x581e, 0x5819, 0x5844,
+  0x5820, 0x5865, 0x586c, 0x5881, 0x5889, 0x589a, 0x5880, 0x99a8,
+  0x9f19, 0x61ff, 0x8279, 0x827d, 0x827f, 0x828f, 0x828a, 0x82a8,
+  0x8284, 0x828e, 0x8291, 0x8297, 0x8299, 0x82ab, 0x82b8, 0x82be,
+  0x82b0, 0x82c8, 0x82ca, 0x82e3, 0x8298, 0x82b7, 0x82ae, 0x82cb,
+  0x82cc, 0x82c1, 0x82a9, 0x82b4, 0x82a1, 0x82aa, 0x829f, 0x82c4,
+  0x82ce, 0x82a4, 0x82e1, 0x8309, 0x82f7, 0x82e4, 0x830f, 0x8307,
+  0x82dc, 0x82f4, 0x82d2, 0x82d8, 0x830c, 0x82fb, 0x82d3, 0x8311,
+  0x831a, 0x8306, 0x8314, 0x8315, 0x82e0, 0x82d5, 0x831c, 0x8351,
+  0x835b, 0x835c, 0x8308, 0x8392, 0x833c, 0x8334, 0x8331, 0x839b,
+  0x835e, 0x832f, 0x834f, 0x8347, 0x8343, 0x835f, 0x8340, 0x8317,
+  0x8360, 0x832d, 0x833a, 0x8333, 0x8366, 0x8365,
+  /* 0xdd */
+  0x8ee5, 0x8ee6, 0x8ee7, 0x8ee8, 0x8ee9, 0x8eea, 0x8eeb, 0x8eec,
+  0x8eed, 0x8eee, 0x8eef, 0x8ef0, 0x8ef1, 0x8ef2, 0x8ef3, 0x8ef4,
+  0x8ef5, 0x8ef6, 0x8ef7, 0x8ef8, 0x8ef9, 0x8efa, 0x8efb, 0x8efc,
+  0x8efd, 0x8efe, 0x8eff, 0x8f00, 0x8f01, 0x8f02, 0x8f03, 0x8f04,
+  0x8f05, 0x8f06, 0x8f07, 0x8f08, 0x8f09, 0x8f0a, 0x8f0b, 0x8f0c,
+  0x8f0d, 0x8f0e, 0x8f0f, 0x8f10, 0x8f11, 0x8f12, 0x8f13, 0x8f14,
+  0x8f15, 0x8f16, 0x8f17, 0x8f18, 0x8f19, 0x8f1a, 0x8f1b, 0x8f1c,
+  0x8f1d, 0x8f1e, 0x8f1f, 0x8f20, 0x8f21, 0x8f22, 0x8f23, 0x8f24,
+  0x8f25, 0x8f26, 0x8f27, 0x8f28, 0x8f29, 0x8f2a, 0x8f2b, 0x8f2c,
+  0x8f2d, 0x8f2e, 0x8f2f, 0x8f30, 0x8f31, 0x8f32, 0x8f33, 0x8f34,
+  0x8f35, 0x8f36, 0x8f37, 0x8f38, 0x8f39, 0x8f3a, 0x8f3b, 0x8f3c,
+  0x8f3d, 0x8f3e, 0x8f3f, 0x8f40, 0x8f41, 0x8f42, 0x8f43, 0x8f44,
+  0x8368, 0x831b, 0x8369, 0x836c, 0x836a, 0x836d, 0x836e, 0x83b0,
+  0x8378, 0x83b3, 0x83b4, 0x83a0, 0x83aa, 0x8393, 0x839c, 0x8385,
+  0x837c, 0x83b6, 0x83a9, 0x837d, 0x83b8, 0x837b, 0x8398, 0x839e,
+  0x83a8, 0x83ba, 0x83bc, 0x83c1, 0x8401, 0x83e5, 0x83d8, 0x5807,
+  0x8418, 0x840b, 0x83dd, 0x83fd, 0x83d6, 0x841c, 0x8438, 0x8411,
+  0x8406, 0x83d4, 0x83df, 0x840f, 0x8403, 0x83f8, 0x83f9, 0x83ea,
+  0x83c5, 0x83c0, 0x8426, 0x83f0, 0x83e1, 0x845c, 0x8451, 0x845a,
+  0x8459, 0x8473, 0x8487, 0x8488, 0x847a, 0x8489, 0x8478, 0x843c,
+  0x8446, 0x8469, 0x8476, 0x848c, 0x848e, 0x8431, 0x846d, 0x84c1,
+  0x84cd, 0x84d0, 0x84e6, 0x84bd, 0x84d3, 0x84ca, 0x84bf, 0x84ba,
+  0x84e0, 0x84a1, 0x84b9, 0x84b4, 0x8497, 0x84e5, 0x84e3, 0x850c,
+  0x750d, 0x8538, 0x84f0, 0x8539, 0x851f, 0x853a,
+  /* 0xde */
+  0x8f45, 0x8f46, 0x8f47, 0x8f48, 0x8f49, 0x8f4a, 0x8f4b, 0x8f4c,
+  0x8f4d, 0x8f4e, 0x8f4f, 0x8f50, 0x8f51, 0x8f52, 0x8f53, 0x8f54,
+  0x8f55, 0x8f56, 0x8f57, 0x8f58, 0x8f59, 0x8f5a, 0x8f5b, 0x8f5c,
+  0x8f5d, 0x8f5e, 0x8f5f, 0x8f60, 0x8f61, 0x8f62, 0x8f63, 0x8f64,
+  0x8f65, 0x8f6a, 0x8f80, 0x8f8c, 0x8f92, 0x8f9d, 0x8fa0, 0x8fa1,
+  0x8fa2, 0x8fa4, 0x8fa5, 0x8fa6, 0x8fa7, 0x8faa, 0x8fac, 0x8fad,
+  0x8fae, 0x8faf, 0x8fb2, 0x8fb3, 0x8fb4, 0x8fb5, 0x8fb7, 0x8fb8,
+  0x8fba, 0x8fbb, 0x8fbc, 0x8fbf, 0x8fc0, 0x8fc3, 0x8fc6, 0x8fc9,
+  0x8fca, 0x8fcb, 0x8fcc, 0x8fcd, 0x8fcf, 0x8fd2, 0x8fd6, 0x8fd7,
+  0x8fda, 0x8fe0, 0x8fe1, 0x8fe3, 0x8fe7, 0x8fec, 0x8fef, 0x8ff1,
+  0x8ff2, 0x8ff4, 0x8ff5, 0x8ff6, 0x8ffa, 0x8ffb, 0x8ffc, 0x8ffe,
+  0x8fff, 0x9007, 0x9008, 0x900c, 0x900e, 0x9013, 0x9015, 0x9018,
+  0x8556, 0x853b, 0x84ff, 0x84fc, 0x8559, 0x8548, 0x8568, 0x8564,
+  0x855e, 0x857a, 0x77a2, 0x8543, 0x8572, 0x857b, 0x85a4, 0x85a8,
+  0x8587, 0x858f, 0x8579, 0x85ae, 0x859c, 0x8585, 0x85b9, 0x85b7,
+  0x85b0, 0x85d3, 0x85c1, 0x85dc, 0x85ff, 0x8627, 0x8605, 0x8629,
+  0x8616, 0x863c, 0x5efe, 0x5f08, 0x593c, 0x5941, 0x8037, 0x5955,
+  0x595a, 0x5958, 0x530f, 0x5c22, 0x5c25, 0x5c2c, 0x5c34, 0x624c,
+  0x626a, 0x629f, 0x62bb, 0x62ca, 0x62da, 0x62d7, 0x62ee, 0x6322,
+  0x62f6, 0x6339, 0x634b, 0x6343, 0x63ad, 0x63f6, 0x6371, 0x637a,
+  0x638e, 0x63b4, 0x636d, 0x63ac, 0x638a, 0x6369, 0x63ae, 0x63bc,
+  0x63f2, 0x63f8, 0x63e0, 0x63ff, 0x63c4, 0x63de, 0x63ce, 0x6452,
+  0x63c6, 0x63be, 0x6445, 0x6441, 0x640b, 0x641b, 0x6420, 0x640c,
+  0x6426, 0x6421, 0x645e, 0x6484, 0x646d, 0x6496,
+  /* 0xdf */
+  0x9019, 0x901c, 0x9023, 0x9024, 0x9025, 0x9027, 0x9028, 0x9029,
+  0x902a, 0x902b, 0x902c, 0x9030, 0x9031, 0x9032, 0x9033, 0x9034,
+  0x9037, 0x9039, 0x903a, 0x903d, 0x903f, 0x9040, 0x9043, 0x9045,
+  0x9046, 0x9048, 0x9049, 0x904a, 0x904b, 0x904c, 0x904e, 0x9054,
+  0x9055, 0x9056, 0x9059, 0x905a, 0x905c, 0x905d, 0x905e, 0x905f,
+  0x9060, 0x9061, 0x9064, 0x9066, 0x9067, 0x9069, 0x906a, 0x906b,
+  0x906c, 0x906f, 0x9070, 0x9071, 0x9072, 0x9073, 0x9076, 0x9077,
+  0x9078, 0x9079, 0x907a, 0x907b, 0x907c, 0x907e, 0x9081, 0x9084,
+  0x9085, 0x9086, 0x9087, 0x9089, 0x908a, 0x908c, 0x908d, 0x908e,
+  0x908f, 0x9090, 0x9092, 0x9094, 0x9096, 0x9098, 0x909a, 0x909c,
+  0x909e, 0x909f, 0x90a0, 0x90a4, 0x90a5, 0x90a7, 0x90a8, 0x90a9,
+  0x90ab, 0x90ad, 0x90b2, 0x90b7, 0x90bc, 0x90bd, 0x90bf, 0x90c0,
+  0x647a, 0x64b7, 0x64b8, 0x6499, 0x64ba, 0x64c0, 0x64d0, 0x64d7,
+  0x64e4, 0x64e2, 0x6509, 0x6525, 0x652e, 0x5f0b, 0x5fd2, 0x7519,
+  0x5f11, 0x535f, 0x53f1, 0x53fd, 0x53e9, 0x53e8, 0x53fb, 0x5412,
+  0x5416, 0x5406, 0x544b, 0x5452, 0x5453, 0x5454, 0x5456, 0x5443,
+  0x5421, 0x5457, 0x5459, 0x5423, 0x5432, 0x5482, 0x5494, 0x5477,
+  0x5471, 0x5464, 0x549a, 0x549b, 0x5484, 0x5476, 0x5466, 0x549d,
+  0x54d0, 0x54ad, 0x54c2, 0x54b4, 0x54d2, 0x54a7, 0x54a6, 0x54d3,
+  0x54d4, 0x5472, 0x54a3, 0x54d5, 0x54bb, 0x54bf, 0x54cc, 0x54d9,
+  0x54da, 0x54dc, 0x54a9, 0x54aa, 0x54a4, 0x54dd, 0x54cf, 0x54de,
+  0x551b, 0x54e7, 0x5520, 0x54fd, 0x5514, 0x54f3, 0x5522, 0x5523,
+  0x550f, 0x5511, 0x5527, 0x552a, 0x5567, 0x558f, 0x55b5, 0x5549,
+  0x556d, 0x5541, 0x5555, 0x553f, 0x5550, 0x553c,
+  /* 0xe0 */
+  0x90c2, 0x90c3, 0x90c6, 0x90c8, 0x90c9, 0x90cb, 0x90cc, 0x90cd,
+  0x90d2, 0x90d4, 0x90d5, 0x90d6, 0x90d8, 0x90d9, 0x90da, 0x90de,
+  0x90df, 0x90e0, 0x90e3, 0x90e4, 0x90e5, 0x90e9, 0x90ea, 0x90ec,
+  0x90ee, 0x90f0, 0x90f1, 0x90f2, 0x90f3, 0x90f5, 0x90f6, 0x90f7,
+  0x90f9, 0x90fa, 0x90fb, 0x90fc, 0x90ff, 0x9100, 0x9101, 0x9103,
+  0x9105, 0x9106, 0x9107, 0x9108, 0x9109, 0x910a, 0x910b, 0x910c,
+  0x910d, 0x910e, 0x910f, 0x9110, 0x9111, 0x9112, 0x9113, 0x9114,
+  0x9115, 0x9116, 0x9117, 0x9118, 0x911a, 0x911b, 0x911c, 0x911d,
+  0x911f, 0x9120, 0x9121, 0x9124, 0x9125, 0x9126, 0x9127, 0x9128,
+  0x9129, 0x912a, 0x912b, 0x912c, 0x912d, 0x912e, 0x9130, 0x9132,
+  0x9133, 0x9134, 0x9135, 0x9136, 0x9137, 0x9138, 0x913a, 0x913b,
+  0x913c, 0x913d, 0x913e, 0x913f, 0x9140, 0x9141, 0x9142, 0x9144,
+  0x5537, 0x5556, 0x5575, 0x5576, 0x5577, 0x5533, 0x5530, 0x555c,
+  0x558b, 0x55d2, 0x5583, 0x55b1, 0x55b9, 0x5588, 0x5581, 0x559f,
+  0x557e, 0x55d6, 0x5591, 0x557b, 0x55df, 0x55bd, 0x55be, 0x5594,
+  0x5599, 0x55ea, 0x55f7, 0x55c9, 0x561f, 0x55d1, 0x55eb, 0x55ec,
+  0x55d4, 0x55e6, 0x55dd, 0x55c4, 0x55ef, 0x55e5, 0x55f2, 0x55f3,
+  0x55cc, 0x55cd, 0x55e8, 0x55f5, 0x55e4, 0x8f94, 0x561e, 0x5608,
+  0x560c, 0x5601, 0x5624, 0x5623, 0x55fe, 0x5600, 0x5627, 0x562d,
+  0x5658, 0x5639, 0x5657, 0x562c, 0x564d, 0x5662, 0x5659, 0x565c,
+  0x564c, 0x5654, 0x5686, 0x5664, 0x5671, 0x566b, 0x567b, 0x567c,
+  0x5685, 0x5693, 0x56af, 0x56d4, 0x56d7, 0x56dd, 0x56e1, 0x56f5,
+  0x56eb, 0x56f9, 0x56ff, 0x5704, 0x570a, 0x5709, 0x571c, 0x5e0f,
+  0x5e19, 0x5e14, 0x5e11, 0x5e31, 0x5e3b, 0x5e3c,
+  /* 0xe1 */
+  0x9145, 0x9147, 0x9148, 0x9151, 0x9153, 0x9154, 0x9155, 0x9156,
+  0x9158, 0x9159, 0x915b, 0x915c, 0x915f, 0x9160, 0x9166, 0x9167,
+  0x9168, 0x916b, 0x916d, 0x9173, 0x917a, 0x917b, 0x917c, 0x9180,
+  0x9181, 0x9182, 0x9183, 0x9184, 0x9186, 0x9188, 0x918a, 0x918e,
+  0x918f, 0x9193, 0x9194, 0x9195, 0x9196, 0x9197, 0x9198, 0x9199,
+  0x919c, 0x919d, 0x919e, 0x919f, 0x91a0, 0x91a1, 0x91a4, 0x91a5,
+  0x91a6, 0x91a7, 0x91a8, 0x91a9, 0x91ab, 0x91ac, 0x91b0, 0x91b1,
+  0x91b2, 0x91b3, 0x91b6, 0x91b7, 0x91b8, 0x91b9, 0x91bb, 0x91bc,
+  0x91bd, 0x91be, 0x91bf, 0x91c0, 0x91c1, 0x91c2, 0x91c3, 0x91c4,
+  0x91c5, 0x91c6, 0x91c8, 0x91cb, 0x91d0, 0x91d2, 0x91d3, 0x91d4,
+  0x91d5, 0x91d6, 0x91d7, 0x91d8, 0x91d9, 0x91da, 0x91db, 0x91dd,
+  0x91de, 0x91df, 0x91e0, 0x91e1, 0x91e2, 0x91e3, 0x91e4, 0x91e5,
+  0x5e37, 0x5e44, 0x5e54, 0x5e5b, 0x5e5e, 0x5e61, 0x5c8c, 0x5c7a,
+  0x5c8d, 0x5c90, 0x5c96, 0x5c88, 0x5c98, 0x5c99, 0x5c91, 0x5c9a,
+  0x5c9c, 0x5cb5, 0x5ca2, 0x5cbd, 0x5cac, 0x5cab, 0x5cb1, 0x5ca3,
+  0x5cc1, 0x5cb7, 0x5cc4, 0x5cd2, 0x5ce4, 0x5ccb, 0x5ce5, 0x5d02,
+  0x5d03, 0x5d27, 0x5d26, 0x5d2e, 0x5d24, 0x5d1e, 0x5d06, 0x5d1b,
+  0x5d58, 0x5d3e, 0x5d34, 0x5d3d, 0x5d6c, 0x5d5b, 0x5d6f, 0x5d5d,
+  0x5d6b, 0x5d4b, 0x5d4a, 0x5d69, 0x5d74, 0x5d82, 0x5d99, 0x5d9d,
+  0x8c73, 0x5db7, 0x5dc5, 0x5f73, 0x5f77, 0x5f82, 0x5f87, 0x5f89,
+  0x5f8c, 0x5f95, 0x5f99, 0x5f9c, 0x5fa8, 0x5fad, 0x5fb5, 0x5fbc,
+  0x8862, 0x5f61, 0x72ad, 0x72b0, 0x72b4, 0x72b7, 0x72b8, 0x72c3,
+  0x72c1, 0x72ce, 0x72cd, 0x72d2, 0x72e8, 0x72ef, 0x72e9, 0x72f2,
+  0x72f4, 0x72f7, 0x7301, 0x72f3, 0x7303, 0x72fa,
+  /* 0xe2 */
+  0x91e6, 0x91e7, 0x91e8, 0x91e9, 0x91ea, 0x91eb, 0x91ec, 0x91ed,
+  0x91ee, 0x91ef, 0x91f0, 0x91f1, 0x91f2, 0x91f3, 0x91f4, 0x91f5,
+  0x91f6, 0x91f7, 0x91f8, 0x91f9, 0x91fa, 0x91fb, 0x91fc, 0x91fd,
+  0x91fe, 0x91ff, 0x9200, 0x9201, 0x9202, 0x9203, 0x9204, 0x9205,
+  0x9206, 0x9207, 0x9208, 0x9209, 0x920a, 0x920b, 0x920c, 0x920d,
+  0x920e, 0x920f, 0x9210, 0x9211, 0x9212, 0x9213, 0x9214, 0x9215,
+  0x9216, 0x9217, 0x9218, 0x9219, 0x921a, 0x921b, 0x921c, 0x921d,
+  0x921e, 0x921f, 0x9220, 0x9221, 0x9222, 0x9223, 0x9224, 0x9225,
+  0x9226, 0x9227, 0x9228, 0x9229, 0x922a, 0x922b, 0x922c, 0x922d,
+  0x922e, 0x922f, 0x9230, 0x9231, 0x9232, 0x9233, 0x9234, 0x9235,
+  0x9236, 0x9237, 0x9238, 0x9239, 0x923a, 0x923b, 0x923c, 0x923d,
+  0x923e, 0x923f, 0x9240, 0x9241, 0x9242, 0x9243, 0x9244, 0x9245,
+  0x72fb, 0x7317, 0x7313, 0x7321, 0x730a, 0x731e, 0x731d, 0x7315,
+  0x7322, 0x7339, 0x7325, 0x732c, 0x7338, 0x7331, 0x7350, 0x734d,
+  0x7357, 0x7360, 0x736c, 0x736f, 0x737e, 0x821b, 0x5925, 0x98e7,
+  0x5924, 0x5902, 0x9963, 0x9967, 0x9968, 0x9969, 0x996a, 0x996b,
+  0x996c, 0x9974, 0x9977, 0x997d, 0x9980, 0x9984, 0x9987, 0x998a,
+  0x998d, 0x9990, 0x9991, 0x9993, 0x9994, 0x9995, 0x5e80, 0x5e91,
+  0x5e8b, 0x5e96, 0x5ea5, 0x5ea0, 0x5eb9, 0x5eb5, 0x5ebe, 0x5eb3,
+  0x8d53, 0x5ed2, 0x5ed1, 0x5edb, 0x5ee8, 0x5eea, 0x81ba, 0x5fc4,
+  0x5fc9, 0x5fd6, 0x5fcf, 0x6003, 0x5fee, 0x6004, 0x5fe1, 0x5fe4,
+  0x5ffe, 0x6005, 0x6006, 0x5fea, 0x5fed, 0x5ff8, 0x6019, 0x6035,
+  0x6026, 0x601b, 0x600f, 0x600d, 0x6029, 0x602b, 0x600a, 0x603f,
+  0x6021, 0x6078, 0x6079, 0x607b, 0x607a, 0x6042,
+  /* 0xe3 */
+  0x9246, 0x9247, 0x9248, 0x9249, 0x924a, 0x924b, 0x924c, 0x924d,
+  0x924e, 0x924f, 0x9250, 0x9251, 0x9252, 0x9253, 0x9254, 0x9255,
+  0x9256, 0x9257, 0x9258, 0x9259, 0x925a, 0x925b, 0x925c, 0x925d,
+  0x925e, 0x925f, 0x9260, 0x9261, 0x9262, 0x9263, 0x9264, 0x9265,
+  0x9266, 0x9267, 0x9268, 0x9269, 0x926a, 0x926b, 0x926c, 0x926d,
+  0x926e, 0x926f, 0x9270, 0x9271, 0x9272, 0x9273, 0x9275, 0x9276,
+  0x9277, 0x9278, 0x9279, 0x927a, 0x927b, 0x927c, 0x927d, 0x927e,
+  0x927f, 0x9280, 0x9281, 0x9282, 0x9283, 0x9284, 0x9285, 0x9286,
+  0x9287, 0x9288, 0x9289, 0x928a, 0x928b, 0x928c, 0x928d, 0x928f,
+  0x9290, 0x9291, 0x9292, 0x9293, 0x9294, 0x9295, 0x9296, 0x9297,
+  0x9298, 0x9299, 0x929a, 0x929b, 0x929c, 0x929d, 0x929e, 0x929f,
+  0x92a0, 0x92a1, 0x92a2, 0x92a3, 0x92a4, 0x92a5, 0x92a6, 0x92a7,
+  0x606a, 0x607d, 0x6096, 0x609a, 0x60ad, 0x609d, 0x6083, 0x6092,
+  0x608c, 0x609b, 0x60ec, 0x60bb, 0x60b1, 0x60dd, 0x60d8, 0x60c6,
+  0x60da, 0x60b4, 0x6120, 0x6126, 0x6115, 0x6123, 0x60f4, 0x6100,
+  0x610e, 0x612b, 0x614a, 0x6175, 0x61ac, 0x6194, 0x61a7, 0x61b7,
+  0x61d4, 0x61f5, 0x5fdd, 0x96b3, 0x95e9, 0x95eb, 0x95f1, 0x95f3,
+  0x95f5, 0x95f6, 0x95fc, 0x95fe, 0x9603, 0x9604, 0x9606, 0x9608,
+  0x960a, 0x960b, 0x960c, 0x960d, 0x960f, 0x9612, 0x9615, 0x9616,
+  0x9617, 0x9619, 0x961a, 0x4e2c, 0x723f, 0x6215, 0x6c35, 0x6c54,
+  0x6c5c, 0x6c4a, 0x6ca3, 0x6c85, 0x6c90, 0x6c94, 0x6c8c, 0x6c68,
+  0x6c69, 0x6c74, 0x6c76, 0x6c86, 0x6ca9, 0x6cd0, 0x6cd4, 0x6cad,
+  0x6cf7, 0x6cf8, 0x6cf1, 0x6cd7, 0x6cb2, 0x6ce0, 0x6cd6, 0x6cfa,
+  0x6ceb, 0x6cee, 0x6cb1, 0x6cd3, 0x6cef, 0x6cfe,
+  /* 0xe4 */
+  0x92a8, 0x92a9, 0x92aa, 0x92ab, 0x92ac, 0x92ad, 0x92af, 0x92b0,
+  0x92b1, 0x92b2, 0x92b3, 0x92b4, 0x92b5, 0x92b6, 0x92b7, 0x92b8,
+  0x92b9, 0x92ba, 0x92bb, 0x92bc, 0x92bd, 0x92be, 0x92bf, 0x92c0,
+  0x92c1, 0x92c2, 0x92c3, 0x92c4, 0x92c5, 0x92c6, 0x92c7, 0x92c9,
+  0x92ca, 0x92cb, 0x92cc, 0x92cd, 0x92ce, 0x92cf, 0x92d0, 0x92d1,
+  0x92d2, 0x92d3, 0x92d4, 0x92d5, 0x92d6, 0x92d7, 0x92d8, 0x92d9,
+  0x92da, 0x92db, 0x92dc, 0x92dd, 0x92de, 0x92df, 0x92e0, 0x92e1,
+  0x92e2, 0x92e3, 0x92e4, 0x92e5, 0x92e6, 0x92e7, 0x92e8, 0x92e9,
+  0x92ea, 0x92eb, 0x92ec, 0x92ed, 0x92ee, 0x92ef, 0x92f0, 0x92f1,
+  0x92f2, 0x92f3, 0x92f4, 0x92f5, 0x92f6, 0x92f7, 0x92f8, 0x92f9,
+  0x92fa, 0x92fb, 0x92fc, 0x92fd, 0x92fe, 0x92ff, 0x9300, 0x9301,
+  0x9302, 0x9303, 0x9304, 0x9305, 0x9306, 0x9307, 0x9308, 0x9309,
+  0x6d39, 0x6d27, 0x6d0c, 0x6d43, 0x6d48, 0x6d07, 0x6d04, 0x6d19,
+  0x6d0e, 0x6d2b, 0x6d4d, 0x6d2e, 0x6d35, 0x6d1a, 0x6d4f, 0x6d52,
+  0x6d54, 0x6d33, 0x6d91, 0x6d6f, 0x6d9e, 0x6da0, 0x6d5e, 0x6d93,
+  0x6d94, 0x6d5c, 0x6d60, 0x6d7c, 0x6d63, 0x6e1a, 0x6dc7, 0x6dc5,
+  0x6dde, 0x6e0e, 0x6dbf, 0x6de0, 0x6e11, 0x6de6, 0x6ddd, 0x6dd9,
+  0x6e16, 0x6dab, 0x6e0c, 0x6dae, 0x6e2b, 0x6e6e, 0x6e4e, 0x6e6b,
+  0x6eb2, 0x6e5f, 0x6e86, 0x6e53, 0x6e54, 0x6e32, 0x6e25, 0x6e44,
+  0x6edf, 0x6eb1, 0x6e98, 0x6ee0, 0x6f2d, 0x6ee2, 0x6ea5, 0x6ea7,
+  0x6ebd, 0x6ebb, 0x6eb7, 0x6ed7, 0x6eb4, 0x6ecf, 0x6e8f, 0x6ec2,
+  0x6e9f, 0x6f62, 0x6f46, 0x6f47, 0x6f24, 0x6f15, 0x6ef9, 0x6f2f,
+  0x6f36, 0x6f4b, 0x6f74, 0x6f2a, 0x6f09, 0x6f29, 0x6f89, 0x6f8d,
+  0x6f8c, 0x6f78, 0x6f72, 0x6f7c, 0x6f7a, 0x6fd1,
+  /* 0xe5 */
+  0x930a, 0x930b, 0x930c, 0x930d, 0x930e, 0x930f, 0x9310, 0x9311,
+  0x9312, 0x9313, 0x9314, 0x9315, 0x9316, 0x9317, 0x9318, 0x9319,
+  0x931a, 0x931b, 0x931c, 0x931d, 0x931e, 0x931f, 0x9320, 0x9321,
+  0x9322, 0x9323, 0x9324, 0x9325, 0x9326, 0x9327, 0x9328, 0x9329,
+  0x932a, 0x932b, 0x932c, 0x932d, 0x932e, 0x932f, 0x9330, 0x9331,
+  0x9332, 0x9333, 0x9334, 0x9335, 0x9336, 0x9337, 0x9338, 0x9339,
+  0x933a, 0x933b, 0x933c, 0x933d, 0x933f, 0x9340, 0x9341, 0x9342,
+  0x9343, 0x9344, 0x9345, 0x9346, 0x9347, 0x9348, 0x9349, 0x934a,
+  0x934b, 0x934c, 0x934d, 0x934e, 0x934f, 0x9350, 0x9351, 0x9352,
+  0x9353, 0x9354, 0x9355, 0x9356, 0x9357, 0x9358, 0x9359, 0x935a,
+  0x935b, 0x935c, 0x935d, 0x935e, 0x935f, 0x9360, 0x9361, 0x9362,
+  0x9363, 0x9364, 0x9365, 0x9366, 0x9367, 0x9368, 0x9369, 0x936b,
+  0x6fc9, 0x6fa7, 0x6fb9, 0x6fb6, 0x6fc2, 0x6fe1, 0x6fee, 0x6fde,
+  0x6fe0, 0x6fef, 0x701a, 0x7023, 0x701b, 0x7039, 0x7035, 0x704f,
+  0x705e, 0x5b80, 0x5b84, 0x5b95, 0x5b93, 0x5ba5, 0x5bb8, 0x752f,
+  0x9a9e, 0x6434, 0x5be4, 0x5bee, 0x8930, 0x5bf0, 0x8e47, 0x8b07,
+  0x8fb6, 0x8fd3, 0x8fd5, 0x8fe5, 0x8fee, 0x8fe4, 0x8fe9, 0x8fe6,
+  0x8ff3, 0x8fe8, 0x9005, 0x9004, 0x900b, 0x9026, 0x9011, 0x900d,
+  0x9016, 0x9021, 0x9035, 0x9036, 0x902d, 0x902f, 0x9044, 0x9051,
+  0x9052, 0x9050, 0x9068, 0x9058, 0x9062, 0x905b, 0x66b9, 0x9074,
+  0x907d, 0x9082, 0x9088, 0x9083, 0x908b, 0x5f50, 0x5f57, 0x5f56,
+  0x5f58, 0x5c3b, 0x54ab, 0x5c50, 0x5c59, 0x5b71, 0x5c63, 0x5c66,
+  0x7fbc, 0x5f2a, 0x5f29, 0x5f2d, 0x8274, 0x5f3c, 0x9b3b, 0x5c6e,
+  0x5981, 0x5983, 0x598d, 0x59a9, 0x59aa, 0x59a3,
+  /* 0xe6 */
+  0x936c, 0x936d, 0x936e, 0x936f, 0x9370, 0x9371, 0x9372, 0x9373,
+  0x9374, 0x9375, 0x9376, 0x9377, 0x9378, 0x9379, 0x937a, 0x937b,
+  0x937c, 0x937d, 0x937e, 0x937f, 0x9380, 0x9381, 0x9382, 0x9383,
+  0x9384, 0x9385, 0x9386, 0x9387, 0x9388, 0x9389, 0x938a, 0x938b,
+  0x938c, 0x938d, 0x938e, 0x9390, 0x9391, 0x9392, 0x9393, 0x9394,
+  0x9395, 0x9396, 0x9397, 0x9398, 0x9399, 0x939a, 0x939b, 0x939c,
+  0x939d, 0x939e, 0x939f, 0x93a0, 0x93a1, 0x93a2, 0x93a3, 0x93a4,
+  0x93a5, 0x93a6, 0x93a7, 0x93a8, 0x93a9, 0x93aa, 0x93ab, 0x93ac,
+  0x93ad, 0x93ae, 0x93af, 0x93b0, 0x93b1, 0x93b2, 0x93b3, 0x93b4,
+  0x93b5, 0x93b6, 0x93b7, 0x93b8, 0x93b9, 0x93ba, 0x93bb, 0x93bc,
+  0x93bd, 0x93be, 0x93bf, 0x93c0, 0x93c1, 0x93c2, 0x93c3, 0x93c4,
+  0x93c5, 0x93c6, 0x93c7, 0x93c8, 0x93c9, 0x93cb, 0x93cc, 0x93cd,
+  0x5997, 0x59ca, 0x59ab, 0x599e, 0x59a4, 0x59d2, 0x59b2, 0x59af,
+  0x59d7, 0x59be, 0x5a05, 0x5a06, 0x59dd, 0x5a08, 0x59e3, 0x59d8,
+  0x59f9, 0x5a0c, 0x5a09, 0x5a32, 0x5a34, 0x5a11, 0x5a23, 0x5a13,
+  0x5a40, 0x5a67, 0x5a4a, 0x5a55, 0x5a3c, 0x5a62, 0x5a75, 0x80ec,
+  0x5aaa, 0x5a9b, 0x5a77, 0x5a7a, 0x5abe, 0x5aeb, 0x5ab2, 0x5ad2,
+  0x5ad4, 0x5ab8, 0x5ae0, 0x5ae3, 0x5af1, 0x5ad6, 0x5ae6, 0x5ad8,
+  0x5adc, 0x5b09, 0x5b17, 0x5b16, 0x5b32, 0x5b37, 0x5b40, 0x5c15,
+  0x5c1c, 0x5b5a, 0x5b65, 0x5b73, 0x5b51, 0x5b53, 0x5b62, 0x9a75,
+  0x9a77, 0x9a78, 0x9a7a, 0x9a7f, 0x9a7d, 0x9a80, 0x9a81, 0x9a85,
+  0x9a88, 0x9a8a, 0x9a90, 0x9a92, 0x9a93, 0x9a96, 0x9a98, 0x9a9b,
+  0x9a9c, 0x9a9d, 0x9a9f, 0x9aa0, 0x9aa2, 0x9aa3, 0x9aa5, 0x9aa7,
+  0x7e9f, 0x7ea1, 0x7ea3, 0x7ea5, 0x7ea8, 0x7ea9,
+  /* 0xe7 */
+  0x93ce, 0x93cf, 0x93d0, 0x93d1, 0x93d2, 0x93d3, 0x93d4, 0x93d5,
+  0x93d7, 0x93d8, 0x93d9, 0x93da, 0x93db, 0x93dc, 0x93dd, 0x93de,
+  0x93df, 0x93e0, 0x93e1, 0x93e2, 0x93e3, 0x93e4, 0x93e5, 0x93e6,
+  0x93e7, 0x93e8, 0x93e9, 0x93ea, 0x93eb, 0x93ec, 0x93ed, 0x93ee,
+  0x93ef, 0x93f0, 0x93f1, 0x93f2, 0x93f3, 0x93f4, 0x93f5, 0x93f6,
+  0x93f7, 0x93f8, 0x93f9, 0x93fa, 0x93fb, 0x93fc, 0x93fd, 0x93fe,
+  0x93ff, 0x9400, 0x9401, 0x9402, 0x9403, 0x9404, 0x9405, 0x9406,
+  0x9407, 0x9408, 0x9409, 0x940a, 0x940b, 0x940c, 0x940d, 0x940e,
+  0x940f, 0x9410, 0x9411, 0x9412, 0x9413, 0x9414, 0x9415, 0x9416,
+  0x9417, 0x9418, 0x9419, 0x941a, 0x941b, 0x941c, 0x941d, 0x941e,
+  0x941f, 0x9420, 0x9421, 0x9422, 0x9423, 0x9424, 0x9425, 0x9426,
+  0x9427, 0x9428, 0x9429, 0x942a, 0x942b, 0x942c, 0x942d, 0x942e,
+  0x7ead, 0x7eb0, 0x7ebe, 0x7ec0, 0x7ec1, 0x7ec2, 0x7ec9, 0x7ecb,
+  0x7ecc, 0x7ed0, 0x7ed4, 0x7ed7, 0x7edb, 0x7ee0, 0x7ee1, 0x7ee8,
+  0x7eeb, 0x7eee, 0x7eef, 0x7ef1, 0x7ef2, 0x7f0d, 0x7ef6, 0x7efa,
+  0x7efb, 0x7efe, 0x7f01, 0x7f02, 0x7f03, 0x7f07, 0x7f08, 0x7f0b,
+  0x7f0c, 0x7f0f, 0x7f11, 0x7f12, 0x7f17, 0x7f19, 0x7f1c, 0x7f1b,
+  0x7f1f, 0x7f21, 0x7f22, 0x7f23, 0x7f24, 0x7f25, 0x7f26, 0x7f27,
+  0x7f2a, 0x7f2b, 0x7f2c, 0x7f2d, 0x7f2f, 0x7f30, 0x7f31, 0x7f32,
+  0x7f33, 0x7f35, 0x5e7a, 0x757f, 0x5ddb, 0x753e, 0x9095, 0x738e,
+  0x7391, 0x73ae, 0x73a2, 0x739f, 0x73cf, 0x73c2, 0x73d1, 0x73b7,
+  0x73b3, 0x73c0, 0x73c9, 0x73c8, 0x73e5, 0x73d9, 0x987c, 0x740a,
+  0x73e9, 0x73e7, 0x73de, 0x73ba, 0x73f2, 0x740f, 0x742a, 0x745b,
+  0x7426, 0x7425, 0x7428, 0x7430, 0x742e, 0x742c,
+  /* 0xe8 */
+  0x942f, 0x9430, 0x9431, 0x9432, 0x9433, 0x9434, 0x9435, 0x9436,
+  0x9437, 0x9438, 0x9439, 0x943a, 0x943b, 0x943c, 0x943d, 0x943f,
+  0x9440, 0x9441, 0x9442, 0x9443, 0x9444, 0x9445, 0x9446, 0x9447,
+  0x9448, 0x9449, 0x944a, 0x944b, 0x944c, 0x944d, 0x944e, 0x944f,
+  0x9450, 0x9451, 0x9452, 0x9453, 0x9454, 0x9455, 0x9456, 0x9457,
+  0x9458, 0x9459, 0x945a, 0x945b, 0x945c, 0x945d, 0x945e, 0x945f,
+  0x9460, 0x9461, 0x9462, 0x9463, 0x9464, 0x9465, 0x9466, 0x9467,
+  0x9468, 0x9469, 0x946a, 0x946c, 0x946d, 0x946e, 0x946f, 0x9470,
+  0x9471, 0x9472, 0x9473, 0x9474, 0x9475, 0x9476, 0x9477, 0x9478,
+  0x9479, 0x947a, 0x947b, 0x947c, 0x947d, 0x947e, 0x947f, 0x9480,
+  0x9481, 0x9482, 0x9483, 0x9484, 0x9491, 0x9496, 0x9498, 0x94c7,
+  0x94cf, 0x94d3, 0x94d4, 0x94da, 0x94e6, 0x94fb, 0x951c, 0x9520,
+  0x741b, 0x741a, 0x7441, 0x745c, 0x7457, 0x7455, 0x7459, 0x7477,
+  0x746d, 0x747e, 0x749c, 0x748e, 0x7480, 0x7481, 0x7487, 0x748b,
+  0x749e, 0x74a8, 0x74a9, 0x7490, 0x74a7, 0x74d2, 0x74ba, 0x97ea,
+  0x97eb, 0x97ec, 0x674c, 0x6753, 0x675e, 0x6748, 0x6769, 0x67a5,
+  0x6787, 0x676a, 0x6773, 0x6798, 0x67a7, 0x6775, 0x67a8, 0x679e,
+  0x67ad, 0x678b, 0x6777, 0x677c, 0x67f0, 0x6809, 0x67d8, 0x680a,
+  0x67e9, 0x67b0, 0x680c, 0x67d9, 0x67b5, 0x67da, 0x67b3, 0x67dd,
+  0x6800, 0x67c3, 0x67b8, 0x67e2, 0x680e, 0x67c1, 0x67fd, 0x6832,
+  0x6833, 0x6860, 0x6861, 0x684e, 0x6862, 0x6844, 0x6864, 0x6883,
+  0x681d, 0x6855, 0x6866, 0x6841, 0x6867, 0x6840, 0x683e, 0x684a,
+  0x6849, 0x6829, 0x68b5, 0x688f, 0x6874, 0x6877, 0x6893, 0x686b,
+  0x68c2, 0x696e, 0x68fc, 0x691f, 0x6920, 0x68f9,
+  /* 0xe9 */
+  0x9527, 0x9533, 0x953d, 0x9543, 0x9548, 0x954b, 0x9555, 0x955a,
+  0x9560, 0x956e, 0x9574, 0x9575, 0x9577, 0x9578, 0x9579, 0x957a,
+  0x957b, 0x957c, 0x957d, 0x957e, 0x9580, 0x9581, 0x9582, 0x9583,
+  0x9584, 0x9585, 0x9586, 0x9587, 0x9588, 0x9589, 0x958a, 0x958b,
+  0x958c, 0x958d, 0x958e, 0x958f, 0x9590, 0x9591, 0x9592, 0x9593,
+  0x9594, 0x9595, 0x9596, 0x9597, 0x9598, 0x9599, 0x959a, 0x959b,
+  0x959c, 0x959d, 0x959e, 0x959f, 0x95a0, 0x95a1, 0x95a2, 0x95a3,
+  0x95a4, 0x95a5, 0x95a6, 0x95a7, 0x95a8, 0x95a9, 0x95aa, 0x95ab,
+  0x95ac, 0x95ad, 0x95ae, 0x95af, 0x95b0, 0x95b1, 0x95b2, 0x95b3,
+  0x95b4, 0x95b5, 0x95b6, 0x95b7, 0x95b8, 0x95b9, 0x95ba, 0x95bb,
+  0x95bc, 0x95bd, 0x95be, 0x95bf, 0x95c0, 0x95c1, 0x95c2, 0x95c3,
+  0x95c4, 0x95c5, 0x95c6, 0x95c7, 0x95c8, 0x95c9, 0x95ca, 0x95cb,
+  0x6924, 0x68f0, 0x690b, 0x6901, 0x6957, 0x68e3, 0x6910, 0x6971,
+  0x6939, 0x6960, 0x6942, 0x695d, 0x6984, 0x696b, 0x6980, 0x6998,
+  0x6978, 0x6934, 0x69cc, 0x6987, 0x6988, 0x69ce, 0x6989, 0x6966,
+  0x6963, 0x6979, 0x699b, 0x69a7, 0x69bb, 0x69ab, 0x69ad, 0x69d4,
+  0x69b1, 0x69c1, 0x69ca, 0x69df, 0x6995, 0x69e0, 0x698d, 0x69ff,
+  0x6a2f, 0x69ed, 0x6a17, 0x6a18, 0x6a65, 0x69f2, 0x6a44, 0x6a3e,
+  0x6aa0, 0x6a50, 0x6a5b, 0x6a35, 0x6a8e, 0x6a79, 0x6a3d, 0x6a28,
+  0x6a58, 0x6a7c, 0x6a91, 0x6a90, 0x6aa9, 0x6a97, 0x6aab, 0x7337,
+  0x7352, 0x6b81, 0x6b82, 0x6b87, 0x6b84, 0x6b92, 0x6b93, 0x6b8d,
+  0x6b9a, 0x6b9b, 0x6ba1, 0x6baa, 0x8f6b, 0x8f6d, 0x8f71, 0x8f72,
+  0x8f73, 0x8f75, 0x8f76, 0x8f78, 0x8f77, 0x8f79, 0x8f7a, 0x8f7c,
+  0x8f7e, 0x8f81, 0x8f82, 0x8f84, 0x8f87, 0x8f8b,
+  /* 0xea */
+  0x95cc, 0x95cd, 0x95ce, 0x95cf, 0x95d0, 0x95d1, 0x95d2, 0x95d3,
+  0x95d4, 0x95d5, 0x95d6, 0x95d7, 0x95d8, 0x95d9, 0x95da, 0x95db,
+  0x95dc, 0x95dd, 0x95de, 0x95df, 0x95e0, 0x95e1, 0x95e2, 0x95e3,
+  0x95e4, 0x95e5, 0x95e6, 0x95e7, 0x95ec, 0x95ff, 0x9607, 0x9613,
+  0x9618, 0x961b, 0x961e, 0x9620, 0x9623, 0x9624, 0x9625, 0x9626,
+  0x9627, 0x9628, 0x9629, 0x962b, 0x962c, 0x962d, 0x962f, 0x9630,
+  0x9637, 0x9638, 0x9639, 0x963a, 0x963e, 0x9641, 0x9643, 0x964a,
+  0x964e, 0x964f, 0x9651, 0x9652, 0x9653, 0x9656, 0x9657, 0x9658,
+  0x9659, 0x965a, 0x965c, 0x965d, 0x965e, 0x9660, 0x9663, 0x9665,
+  0x9666, 0x966b, 0x966d, 0x966e, 0x966f, 0x9670, 0x9671, 0x9673,
+  0x9678, 0x9679, 0x967a, 0x967b, 0x967c, 0x967d, 0x967e, 0x967f,
+  0x9680, 0x9681, 0x9682, 0x9683, 0x9684, 0x9687, 0x9689, 0x968a,
+  0x8f8d, 0x8f8e, 0x8f8f, 0x8f98, 0x8f9a, 0x8ece, 0x620b, 0x6217,
+  0x621b, 0x621f, 0x6222, 0x6221, 0x6225, 0x6224, 0x622c, 0x81e7,
+  0x74ef, 0x74f4, 0x74ff, 0x750f, 0x7511, 0x7513, 0x6534, 0x65ee,
+  0x65ef, 0x65f0, 0x660a, 0x6619, 0x6772, 0x6603, 0x6615, 0x6600,
+  0x7085, 0x66f7, 0x661d, 0x6634, 0x6631, 0x6636, 0x6635, 0x8006,
+  0x665f, 0x6654, 0x6641, 0x664f, 0x6656, 0x6661, 0x6657, 0x6677,
+  0x6684, 0x668c, 0x66a7, 0x669d, 0x66be, 0x66db, 0x66dc, 0x66e6,
+  0x66e9, 0x8d32, 0x8d33, 0x8d36, 0x8d3b, 0x8d3d, 0x8d40, 0x8d45,
+  0x8d46, 0x8d48, 0x8d49, 0x8d47, 0x8d4d, 0x8d55, 0x8d59, 0x89c7,
+  0x89ca, 0x89cb, 0x89cc, 0x89ce, 0x89cf, 0x89d0, 0x89d1, 0x726e,
+  0x729f, 0x725d, 0x7266, 0x726f, 0x727e, 0x727f, 0x7284, 0x728b,
+  0x728d, 0x728f, 0x7292, 0x6308, 0x6332, 0x63b0,
+  /* 0xeb */
+  0x968c, 0x968e, 0x9691, 0x9692, 0x9693, 0x9695, 0x9696, 0x969a,
+  0x969b, 0x969d, 0x969e, 0x969f, 0x96a0, 0x96a1, 0x96a2, 0x96a3,
+  0x96a4, 0x96a5, 0x96a6, 0x96a8, 0x96a9, 0x96aa, 0x96ab, 0x96ac,
+  0x96ad, 0x96ae, 0x96af, 0x96b1, 0x96b2, 0x96b4, 0x96b5, 0x96b7,
+  0x96b8, 0x96ba, 0x96bb, 0x96bf, 0x96c2, 0x96c3, 0x96c8, 0x96ca,
+  0x96cb, 0x96d0, 0x96d1, 0x96d3, 0x96d4, 0x96d6, 0x96d7, 0x96d8,
+  0x96d9, 0x96da, 0x96db, 0x96dc, 0x96dd, 0x96de, 0x96df, 0x96e1,
+  0x96e2, 0x96e3, 0x96e4, 0x96e5, 0x96e6, 0x96e7, 0x96eb, 0x96ec,
+  0x96ed, 0x96ee, 0x96f0, 0x96f1, 0x96f2, 0x96f4, 0x96f5, 0x96f8,
+  0x96fa, 0x96fb, 0x96fc, 0x96fd, 0x96ff, 0x9702, 0x9703, 0x9705,
+  0x970a, 0x970b, 0x970c, 0x9710, 0x9711, 0x9712, 0x9714, 0x9715,
+  0x9717, 0x9718, 0x9719, 0x971a, 0x971b, 0x971d, 0x971f, 0x9720,
+  0x643f, 0x64d8, 0x8004, 0x6bea, 0x6bf3, 0x6bfd, 0x6bf5, 0x6bf9,
+  0x6c05, 0x6c07, 0x6c06, 0x6c0d, 0x6c15, 0x6c18, 0x6c19, 0x6c1a,
+  0x6c21, 0x6c29, 0x6c24, 0x6c2a, 0x6c32, 0x6535, 0x6555, 0x656b,
+  0x724d, 0x7252, 0x7256, 0x7230, 0x8662, 0x5216, 0x809f, 0x809c,
+  0x8093, 0x80bc, 0x670a, 0x80bd, 0x80b1, 0x80ab, 0x80ad, 0x80b4,
+  0x80b7, 0x80e7, 0x80e8, 0x80e9, 0x80ea, 0x80db, 0x80c2, 0x80c4,
+  0x80d9, 0x80cd, 0x80d7, 0x6710, 0x80dd, 0x80eb, 0x80f1, 0x80f4,
+  0x80ed, 0x810d, 0x810e, 0x80f2, 0x80fc, 0x6715, 0x8112, 0x8c5a,
+  0x8136, 0x811e, 0x812c, 0x8118, 0x8132, 0x8148, 0x814c, 0x8153,
+  0x8174, 0x8159, 0x815a, 0x8171, 0x8160, 0x8169, 0x817c, 0x817d,
+  0x816d, 0x8167, 0x584d, 0x5ab5, 0x8188, 0x8182, 0x8191, 0x6ed5,
+  0x81a3, 0x81aa, 0x81cc, 0x6726, 0x81ca, 0x81bb,
+  /* 0xec */
+  0x9721, 0x9722, 0x9723, 0x9724, 0x9725, 0x9726, 0x9727, 0x9728,
+  0x9729, 0x972b, 0x972c, 0x972e, 0x972f, 0x9731, 0x9733, 0x9734,
+  0x9735, 0x9736, 0x9737, 0x973a, 0x973b, 0x973c, 0x973d, 0x973f,
+  0x9740, 0x9741, 0x9742, 0x9743, 0x9744, 0x9745, 0x9746, 0x9747,
+  0x9748, 0x9749, 0x974a, 0x974b, 0x974c, 0x974d, 0x974e, 0x974f,
+  0x9750, 0x9751, 0x9754, 0x9755, 0x9757, 0x9758, 0x975a, 0x975c,
+  0x975d, 0x975f, 0x9763, 0x9764, 0x9766, 0x9767, 0x9768, 0x976a,
+  0x976b, 0x976c, 0x976d, 0x976e, 0x976f, 0x9770, 0x9771, 0x9772,
+  0x9775, 0x9777, 0x9778, 0x9779, 0x977a, 0x977b, 0x977d, 0x977e,
+  0x977f, 0x9780, 0x9781, 0x9782, 0x9783, 0x9784, 0x9786, 0x9787,
+  0x9788, 0x9789, 0x978a, 0x978c, 0x978e, 0x978f, 0x9790, 0x9793,
+  0x9795, 0x9796, 0x9797, 0x9799, 0x979a, 0x979b, 0x979c, 0x979d,
+  0x81c1, 0x81a6, 0x6b24, 0x6b37, 0x6b39, 0x6b43, 0x6b46, 0x6b59,
+  0x98d1, 0x98d2, 0x98d3, 0x98d5, 0x98d9, 0x98da, 0x6bb3, 0x5f40,
+  0x6bc2, 0x89f3, 0x6590, 0x9f51, 0x6593, 0x65bc, 0x65c6, 0x65c4,
+  0x65c3, 0x65cc, 0x65ce, 0x65d2, 0x65d6, 0x7080, 0x709c, 0x7096,
+  0x709d, 0x70bb, 0x70c0, 0x70b7, 0x70ab, 0x70b1, 0x70e8, 0x70ca,
+  0x7110, 0x7113, 0x7116, 0x712f, 0x7131, 0x7173, 0x715c, 0x7168,
+  0x7145, 0x7172, 0x714a, 0x7178, 0x717a, 0x7198, 0x71b3, 0x71b5,
+  0x71a8, 0x71a0, 0x71e0, 0x71d4, 0x71e7, 0x71f9, 0x721d, 0x7228,
+  0x706c, 0x7118, 0x7166, 0x71b9, 0x623e, 0x623d, 0x6243, 0x6248,
+  0x6249, 0x793b, 0x7940, 0x7946, 0x7949, 0x795b, 0x795c, 0x7953,
+  0x795a, 0x7962, 0x7957, 0x7960, 0x796f, 0x7967, 0x797a, 0x7985,
+  0x798a, 0x799a, 0x79a7, 0x79b3, 0x5fd1, 0x5fd0,
+  /* 0xed */
+  0x979e, 0x979f, 0x97a1, 0x97a2, 0x97a4, 0x97a5, 0x97a6, 0x97a7,
+  0x97a8, 0x97a9, 0x97aa, 0x97ac, 0x97ae, 0x97b0, 0x97b1, 0x97b3,
+  0x97b5, 0x97b6, 0x97b7, 0x97b8, 0x97b9, 0x97ba, 0x97bb, 0x97bc,
+  0x97bd, 0x97be, 0x97bf, 0x97c0, 0x97c1, 0x97c2, 0x97c3, 0x97c4,
+  0x97c5, 0x97c6, 0x97c7, 0x97c8, 0x97c9, 0x97ca, 0x97cb, 0x97cc,
+  0x97cd, 0x97ce, 0x97cf, 0x97d0, 0x97d1, 0x97d2, 0x97d3, 0x97d4,
+  0x97d5, 0x97d6, 0x97d7, 0x97d8, 0x97d9, 0x97da, 0x97db, 0x97dc,
+  0x97dd, 0x97de, 0x97df, 0x97e0, 0x97e1, 0x97e2, 0x97e3, 0x97e4,
+  0x97e5, 0x97e8, 0x97ee, 0x97ef, 0x97f0, 0x97f1, 0x97f2, 0x97f4,
+  0x97f7, 0x97f8, 0x97f9, 0x97fa, 0x97fb, 0x97fc, 0x97fd, 0x97fe,
+  0x97ff, 0x9800, 0x9801, 0x9802, 0x9803, 0x9804, 0x9805, 0x9806,
+  0x9807, 0x9808, 0x9809, 0x980a, 0x980b, 0x980c, 0x980d, 0x980e,
+  0x603c, 0x605d, 0x605a, 0x6067, 0x6041, 0x6059, 0x6063, 0x60ab,
+  0x6106, 0x610d, 0x615d, 0x61a9, 0x619d, 0x61cb, 0x61d1, 0x6206,
+  0x8080, 0x807f, 0x6c93, 0x6cf6, 0x6dfc, 0x77f6, 0x77f8, 0x7800,
+  0x7809, 0x7817, 0x7818, 0x7811, 0x65ab, 0x782d, 0x781c, 0x781d,
+  0x7839, 0x783a, 0x783b, 0x781f, 0x783c, 0x7825, 0x782c, 0x7823,
+  0x7829, 0x784e, 0x786d, 0x7856, 0x7857, 0x7826, 0x7850, 0x7847,
+  0x784c, 0x786a, 0x789b, 0x7893, 0x789a, 0x7887, 0x789c, 0x78a1,
+  0x78a3, 0x78b2, 0x78b9, 0x78a5, 0x78d4, 0x78d9, 0x78c9, 0x78ec,
+  0x78f2, 0x7905, 0x78f4, 0x7913, 0x7924, 0x791e, 0x7934, 0x9f9b,
+  0x9ef9, 0x9efb, 0x9efc, 0x76f1, 0x7704, 0x770d, 0x76f9, 0x7707,
+  0x7708, 0x771a, 0x7722, 0x7719, 0x772d, 0x7726, 0x7735, 0x7738,
+  0x7750, 0x7751, 0x7747, 0x7743, 0x775a, 0x7768,
+  /* 0xee */
+  0x980f, 0x9810, 0x9811, 0x9812, 0x9813, 0x9814, 0x9815, 0x9816,
+  0x9817, 0x9818, 0x9819, 0x981a, 0x981b, 0x981c, 0x981d, 0x981e,
+  0x981f, 0x9820, 0x9821, 0x9822, 0x9823, 0x9824, 0x9825, 0x9826,
+  0x9827, 0x9828, 0x9829, 0x982a, 0x982b, 0x982c, 0x982d, 0x982e,
+  0x982f, 0x9830, 0x9831, 0x9832, 0x9833, 0x9834, 0x9835, 0x9836,
+  0x9837, 0x9838, 0x9839, 0x983a, 0x983b, 0x983c, 0x983d, 0x983e,
+  0x983f, 0x9840, 0x9841, 0x9842, 0x9843, 0x9844, 0x9845, 0x9846,
+  0x9847, 0x9848, 0x9849, 0x984a, 0x984b, 0x984c, 0x984d, 0x984e,
+  0x984f, 0x9850, 0x9851, 0x9852, 0x9853, 0x9854, 0x9855, 0x9856,
+  0x9857, 0x9858, 0x9859, 0x985a, 0x985b, 0x985c, 0x985d, 0x985e,
+  0x985f, 0x9860, 0x9861, 0x9862, 0x9863, 0x9864, 0x9865, 0x9866,
+  0x9867, 0x9868, 0x9869, 0x986a, 0x986b, 0x986c, 0x986d, 0x986e,
+  0x7762, 0x7765, 0x777f, 0x778d, 0x777d, 0x7780, 0x778c, 0x7791,
+  0x779f, 0x77a0, 0x77b0, 0x77b5, 0x77bd, 0x753a, 0x7540, 0x754e,
+  0x754b, 0x7548, 0x755b, 0x7572, 0x7579, 0x7583, 0x7f58, 0x7f61,
+  0x7f5f, 0x8a48, 0x7f68, 0x7f74, 0x7f71, 0x7f79, 0x7f81, 0x7f7e,
+  0x76cd, 0x76e5, 0x8832, 0x9485, 0x9486, 0x9487, 0x948b, 0x948a,
+  0x948c, 0x948d, 0x948f, 0x9490, 0x9494, 0x9497, 0x9495, 0x949a,
+  0x949b, 0x949c, 0x94a3, 0x94a4, 0x94ab, 0x94aa, 0x94ad, 0x94ac,
+  0x94af, 0x94b0, 0x94b2, 0x94b4, 0x94b6, 0x94b7, 0x94b8, 0x94b9,
+  0x94ba, 0x94bc, 0x94bd, 0x94bf, 0x94c4, 0x94c8, 0x94c9, 0x94ca,
+  0x94cb, 0x94cc, 0x94cd, 0x94ce, 0x94d0, 0x94d1, 0x94d2, 0x94d5,
+  0x94d6, 0x94d7, 0x94d9, 0x94d8, 0x94db, 0x94de, 0x94df, 0x94e0,
+  0x94e2, 0x94e4, 0x94e5, 0x94e7, 0x94e8, 0x94ea,
+  /* 0xef */
+  0x986f, 0x9870, 0x9871, 0x9872, 0x9873, 0x9874, 0x988b, 0x988e,
+  0x9892, 0x9895, 0x9899, 0x98a3, 0x98a8, 0x98a9, 0x98aa, 0x98ab,
+  0x98ac, 0x98ad, 0x98ae, 0x98af, 0x98b0, 0x98b1, 0x98b2, 0x98b3,
+  0x98b4, 0x98b5, 0x98b6, 0x98b7, 0x98b8, 0x98b9, 0x98ba, 0x98bb,
+  0x98bc, 0x98bd, 0x98be, 0x98bf, 0x98c0, 0x98c1, 0x98c2, 0x98c3,
+  0x98c4, 0x98c5, 0x98c6, 0x98c7, 0x98c8, 0x98c9, 0x98ca, 0x98cb,
+  0x98cc, 0x98cd, 0x98cf, 0x98d0, 0x98d4, 0x98d6, 0x98d7, 0x98db,
+  0x98dc, 0x98dd, 0x98e0, 0x98e1, 0x98e2, 0x98e3, 0x98e4, 0x98e5,
+  0x98e6, 0x98e9, 0x98ea, 0x98eb, 0x98ec, 0x98ed, 0x98ee, 0x98ef,
+  0x98f0, 0x98f1, 0x98f2, 0x98f3, 0x98f4, 0x98f5, 0x98f6, 0x98f7,
+  0x98f8, 0x98f9, 0x98fa, 0x98fb, 0x98fc, 0x98fd, 0x98fe, 0x98ff,
+  0x9900, 0x9901, 0x9902, 0x9903, 0x9904, 0x9905, 0x9906, 0x9907,
+  0x94e9, 0x94eb, 0x94ee, 0x94ef, 0x94f3, 0x94f4, 0x94f5, 0x94f7,
+  0x94f9, 0x94fc, 0x94fd, 0x94ff, 0x9503, 0x9502, 0x9506, 0x9507,
+  0x9509, 0x950a, 0x950d, 0x950e, 0x950f, 0x9512, 0x9513, 0x9514,
+  0x9515, 0x9516, 0x9518, 0x951b, 0x951d, 0x951e, 0x951f, 0x9522,
+  0x952a, 0x952b, 0x9529, 0x952c, 0x9531, 0x9532, 0x9534, 0x9536,
+  0x9537, 0x9538, 0x953c, 0x953e, 0x953f, 0x9542, 0x9535, 0x9544,
+  0x9545, 0x9546, 0x9549, 0x954c, 0x954e, 0x954f, 0x9552, 0x9553,
+  0x9554, 0x9556, 0x9557, 0x9558, 0x9559, 0x955b, 0x955e, 0x955f,
+  0x955d, 0x9561, 0x9562, 0x9564, 0x9565, 0x9566, 0x9567, 0x9568,
+  0x9569, 0x956a, 0x956b, 0x956c, 0x956f, 0x9571, 0x9572, 0x9573,
+  0x953a, 0x77e7, 0x77ec, 0x96c9, 0x79d5, 0x79ed, 0x79e3, 0x79eb,
+  0x7a06, 0x5d47, 0x7a03, 0x7a02, 0x7a1e, 0x7a14,
+  /* 0xf0 */
+  0x9908, 0x9909, 0x990a, 0x990b, 0x990c, 0x990e, 0x990f, 0x9911,
+  0x9912, 0x9913, 0x9914, 0x9915, 0x9916, 0x9917, 0x9918, 0x9919,
+  0x991a, 0x991b, 0x991c, 0x991d, 0x991e, 0x991f, 0x9920, 0x9921,
+  0x9922, 0x9923, 0x9924, 0x9925, 0x9926, 0x9927, 0x9928, 0x9929,
+  0x992a, 0x992b, 0x992c, 0x992d, 0x992f, 0x9930, 0x9931, 0x9932,
+  0x9933, 0x9934, 0x9935, 0x9936, 0x9937, 0x9938, 0x9939, 0x993a,
+  0x993b, 0x993c, 0x993d, 0x993e, 0x993f, 0x9940, 0x9941, 0x9942,
+  0x9943, 0x9944, 0x9945, 0x9946, 0x9947, 0x9948, 0x9949, 0x994a,
+  0x994b, 0x994c, 0x994d, 0x994e, 0x994f, 0x9950, 0x9951, 0x9952,
+  0x9953, 0x9956, 0x9957, 0x9958, 0x9959, 0x995a, 0x995b, 0x995c,
+  0x995d, 0x995e, 0x995f, 0x9960, 0x9961, 0x9962, 0x9964, 0x9966,
+  0x9973, 0x9978, 0x9979, 0x997b, 0x997e, 0x9982, 0x9983, 0x9989,
+  0x7a39, 0x7a37, 0x7a51, 0x9ecf, 0x99a5, 0x7a70, 0x7688, 0x768e,
+  0x7693, 0x7699, 0x76a4, 0x74de, 0x74e0, 0x752c, 0x9e20, 0x9e22,
+  0x9e28, 0x9e29, 0x9e2a, 0x9e2b, 0x9e2c, 0x9e32, 0x9e31, 0x9e36,
+  0x9e38, 0x9e37, 0x9e39, 0x9e3a, 0x9e3e, 0x9e41, 0x9e42, 0x9e44,
+  0x9e46, 0x9e47, 0x9e48, 0x9e49, 0x9e4b, 0x9e4c, 0x9e4e, 0x9e51,
+  0x9e55, 0x9e57, 0x9e5a, 0x9e5b, 0x9e5c, 0x9e5e, 0x9e63, 0x9e66,
+  0x9e67, 0x9e68, 0x9e69, 0x9e6a, 0x9e6b, 0x9e6c, 0x9e71, 0x9e6d,
+  0x9e73, 0x7592, 0x7594, 0x7596, 0x75a0, 0x759d, 0x75ac, 0x75a3,
+  0x75b3, 0x75b4, 0x75b8, 0x75c4, 0x75b1, 0x75b0, 0x75c3, 0x75c2,
+  0x75d6, 0x75cd, 0x75e3, 0x75e8, 0x75e6, 0x75e4, 0x75eb, 0x75e7,
+  0x7603, 0x75f1, 0x75fc, 0x75ff, 0x7610, 0x7600, 0x7605, 0x760c,
+  0x7617, 0x760a, 0x7625, 0x7618, 0x7615, 0x7619,
+  /* 0xf1 */
+  0x998c, 0x998e, 0x999a, 0x999b, 0x999c, 0x999d, 0x999e, 0x999f,
+  0x99a0, 0x99a1, 0x99a2, 0x99a3, 0x99a4, 0x99a6, 0x99a7, 0x99a9,
+  0x99aa, 0x99ab, 0x99ac, 0x99ad, 0x99ae, 0x99af, 0x99b0, 0x99b1,
+  0x99b2, 0x99b3, 0x99b4, 0x99b5, 0x99b6, 0x99b7, 0x99b8, 0x99b9,
+  0x99ba, 0x99bb, 0x99bc, 0x99bd, 0x99be, 0x99bf, 0x99c0, 0x99c1,
+  0x99c2, 0x99c3, 0x99c4, 0x99c5, 0x99c6, 0x99c7, 0x99c8, 0x99c9,
+  0x99ca, 0x99cb, 0x99cc, 0x99cd, 0x99ce, 0x99cf, 0x99d0, 0x99d1,
+  0x99d2, 0x99d3, 0x99d4, 0x99d5, 0x99d6, 0x99d7, 0x99d8, 0x99d9,
+  0x99da, 0x99db, 0x99dc, 0x99dd, 0x99de, 0x99df, 0x99e0, 0x99e1,
+  0x99e2, 0x99e3, 0x99e4, 0x99e5, 0x99e6, 0x99e7, 0x99e8, 0x99e9,
+  0x99ea, 0x99eb, 0x99ec, 0x99ed, 0x99ee, 0x99ef, 0x99f0, 0x99f1,
+  0x99f2, 0x99f3, 0x99f4, 0x99f5, 0x99f6, 0x99f7, 0x99f8, 0x99f9,
+  0x761b, 0x763c, 0x7622, 0x7620, 0x7640, 0x762d, 0x7630, 0x763f,
+  0x7635, 0x7643, 0x763e, 0x7633, 0x764d, 0x765e, 0x7654, 0x765c,
+  0x7656, 0x766b, 0x766f, 0x7fca, 0x7ae6, 0x7a78, 0x7a79, 0x7a80,
+  0x7a86, 0x7a88, 0x7a95, 0x7aa6, 0x7aa0, 0x7aac, 0x7aa8, 0x7aad,
+  0x7ab3, 0x8864, 0x8869, 0x8872, 0x887d, 0x887f, 0x8882, 0x88a2,
+  0x88c6, 0x88b7, 0x88bc, 0x88c9, 0x88e2, 0x88ce, 0x88e3, 0x88e5,
+  0x88f1, 0x891a, 0x88fc, 0x88e8, 0x88fe, 0x88f0, 0x8921, 0x8919,
+  0x8913, 0x891b, 0x890a, 0x8934, 0x892b, 0x8936, 0x8941, 0x8966,
+  0x897b, 0x758b, 0x80e5, 0x76b2, 0x76b4, 0x77dc, 0x8012, 0x8014,
+  0x8016, 0x801c, 0x8020, 0x8022, 0x8025, 0x8026, 0x8027, 0x8029,
+  0x8028, 0x8031, 0x800b, 0x8035, 0x8043, 0x8046, 0x804d, 0x8052,
+  0x8069, 0x8071, 0x8983, 0x9878, 0x9880, 0x9883,
+  /* 0xf2 */
+  0x99fa, 0x99fb, 0x99fc, 0x99fd, 0x99fe, 0x99ff, 0x9a00, 0x9a01,
+  0x9a02, 0x9a03, 0x9a04, 0x9a05, 0x9a06, 0x9a07, 0x9a08, 0x9a09,
+  0x9a0a, 0x9a0b, 0x9a0c, 0x9a0d, 0x9a0e, 0x9a0f, 0x9a10, 0x9a11,
+  0x9a12, 0x9a13, 0x9a14, 0x9a15, 0x9a16, 0x9a17, 0x9a18, 0x9a19,
+  0x9a1a, 0x9a1b, 0x9a1c, 0x9a1d, 0x9a1e, 0x9a1f, 0x9a20, 0x9a21,
+  0x9a22, 0x9a23, 0x9a24, 0x9a25, 0x9a26, 0x9a27, 0x9a28, 0x9a29,
+  0x9a2a, 0x9a2b, 0x9a2c, 0x9a2d, 0x9a2e, 0x9a2f, 0x9a30, 0x9a31,
+  0x9a32, 0x9a33, 0x9a34, 0x9a35, 0x9a36, 0x9a37, 0x9a38, 0x9a39,
+  0x9a3a, 0x9a3b, 0x9a3c, 0x9a3d, 0x9a3e, 0x9a3f, 0x9a40, 0x9a41,
+  0x9a42, 0x9a43, 0x9a44, 0x9a45, 0x9a46, 0x9a47, 0x9a48, 0x9a49,
+  0x9a4a, 0x9a4b, 0x9a4c, 0x9a4d, 0x9a4e, 0x9a4f, 0x9a50, 0x9a51,
+  0x9a52, 0x9a53, 0x9a54, 0x9a55, 0x9a56, 0x9a57, 0x9a58, 0x9a59,
+  0x9889, 0x988c, 0x988d, 0x988f, 0x9894, 0x989a, 0x989b, 0x989e,
+  0x989f, 0x98a1, 0x98a2, 0x98a5, 0x98a6, 0x864d, 0x8654, 0x866c,
+  0x866e, 0x867f, 0x867a, 0x867c, 0x867b, 0x86a8, 0x868d, 0x868b,
+  0x86ac, 0x869d, 0x86a7, 0x86a3, 0x86aa, 0x8693, 0x86a9, 0x86b6,
+  0x86c4, 0x86b5, 0x86ce, 0x86b0, 0x86ba, 0x86b1, 0x86af, 0x86c9,
+  0x86cf, 0x86b4, 0x86e9, 0x86f1, 0x86f2, 0x86ed, 0x86f3, 0x86d0,
+  0x8713, 0x86de, 0x86f4, 0x86df, 0x86d8, 0x86d1, 0x8703, 0x8707,
+  0x86f8, 0x8708, 0x870a, 0x870d, 0x8709, 0x8723, 0x873b, 0x871e,
+  0x8725, 0x872e, 0x871a, 0x873e, 0x8748, 0x8734, 0x8731, 0x8729,
+  0x8737, 0x873f, 0x8782, 0x8722, 0x877d, 0x877e, 0x877b, 0x8760,
+  0x8770, 0x874c, 0x876e, 0x878b, 0x8753, 0x8763, 0x877c, 0x8764,
+  0x8759, 0x8765, 0x8793, 0x87af, 0x87a8, 0x87d2,
+  /* 0xf3 */
+  0x9a5a, 0x9a5b, 0x9a5c, 0x9a5d, 0x9a5e, 0x9a5f, 0x9a60, 0x9a61,
+  0x9a62, 0x9a63, 0x9a64, 0x9a65, 0x9a66, 0x9a67, 0x9a68, 0x9a69,
+  0x9a6a, 0x9a6b, 0x9a72, 0x9a83, 0x9a89, 0x9a8d, 0x9a8e, 0x9a94,
+  0x9a95, 0x9a99, 0x9aa6, 0x9aa9, 0x9aaa, 0x9aab, 0x9aac, 0x9aad,
+  0x9aae, 0x9aaf, 0x9ab2, 0x9ab3, 0x9ab4, 0x9ab5, 0x9ab9, 0x9abb,
+  0x9abd, 0x9abe, 0x9abf, 0x9ac3, 0x9ac4, 0x9ac6, 0x9ac7, 0x9ac8,
+  0x9ac9, 0x9aca, 0x9acd, 0x9ace, 0x9acf, 0x9ad0, 0x9ad2, 0x9ad4,
+  0x9ad5, 0x9ad6, 0x9ad7, 0x9ad9, 0x9ada, 0x9adb, 0x9adc, 0x9add,
+  0x9ade, 0x9ae0, 0x9ae2, 0x9ae3, 0x9ae4, 0x9ae5, 0x9ae7, 0x9ae8,
+  0x9ae9, 0x9aea, 0x9aec, 0x9aee, 0x9af0, 0x9af1, 0x9af2, 0x9af3,
+  0x9af4, 0x9af5, 0x9af6, 0x9af7, 0x9af8, 0x9afa, 0x9afc, 0x9afd,
+  0x9afe, 0x9aff, 0x9b00, 0x9b01, 0x9b02, 0x9b04, 0x9b05, 0x9b06,
+  0x87c6, 0x8788, 0x8785, 0x87ad, 0x8797, 0x8783, 0x87ab, 0x87e5,
+  0x87ac, 0x87b5, 0x87b3, 0x87cb, 0x87d3, 0x87bd, 0x87d1, 0x87c0,
+  0x87ca, 0x87db, 0x87ea, 0x87e0, 0x87ee, 0x8816, 0x8813, 0x87fe,
+  0x880a, 0x881b, 0x8821, 0x8839, 0x883c, 0x7f36, 0x7f42, 0x7f44,
+  0x7f45, 0x8210, 0x7afa, 0x7afd, 0x7b08, 0x7b03, 0x7b04, 0x7b15,
+  0x7b0a, 0x7b2b, 0x7b0f, 0x7b47, 0x7b38, 0x7b2a, 0x7b19, 0x7b2e,
+  0x7b31, 0x7b20, 0x7b25, 0x7b24, 0x7b33, 0x7b3e, 0x7b1e, 0x7b58,
+  0x7b5a, 0x7b45, 0x7b75, 0x7b4c, 0x7b5d, 0x7b60, 0x7b6e, 0x7b7b,
+  0x7b62, 0x7b72, 0x7b71, 0x7b90, 0x7ba6, 0x7ba7, 0x7bb8, 0x7bac,
+  0x7b9d, 0x7ba8, 0x7b85, 0x7baa, 0x7b9c, 0x7ba2, 0x7bab, 0x7bb4,
+  0x7bd1, 0x7bc1, 0x7bcc, 0x7bdd, 0x7bda, 0x7be5, 0x7be6, 0x7bea,
+  0x7c0c, 0x7bfe, 0x7bfc, 0x7c0f, 0x7c16, 0x7c0b,
+  /* 0xf4 */
+  0x9b07, 0x9b09, 0x9b0a, 0x9b0b, 0x9b0c, 0x9b0d, 0x9b0e, 0x9b10,
+  0x9b11, 0x9b12, 0x9b14, 0x9b15, 0x9b16, 0x9b17, 0x9b18, 0x9b19,
+  0x9b1a, 0x9b1b, 0x9b1c, 0x9b1d, 0x9b1e, 0x9b20, 0x9b21, 0x9b22,
+  0x9b24, 0x9b25, 0x9b26, 0x9b27, 0x9b28, 0x9b29, 0x9b2a, 0x9b2b,
+  0x9b2c, 0x9b2d, 0x9b2e, 0x9b30, 0x9b31, 0x9b33, 0x9b34, 0x9b35,
+  0x9b36, 0x9b37, 0x9b38, 0x9b39, 0x9b3a, 0x9b3d, 0x9b3e, 0x9b3f,
+  0x9b40, 0x9b46, 0x9b4a, 0x9b4b, 0x9b4c, 0x9b4e, 0x9b50, 0x9b52,
+  0x9b53, 0x9b55, 0x9b56, 0x9b57, 0x9b58, 0x9b59, 0x9b5a, 0x9b5b,
+  0x9b5c, 0x9b5d, 0x9b5e, 0x9b5f, 0x9b60, 0x9b61, 0x9b62, 0x9b63,
+  0x9b64, 0x9b65, 0x9b66, 0x9b67, 0x9b68, 0x9b69, 0x9b6a, 0x9b6b,
+  0x9b6c, 0x9b6d, 0x9b6e, 0x9b6f, 0x9b70, 0x9b71, 0x9b72, 0x9b73,
+  0x9b74, 0x9b75, 0x9b76, 0x9b77, 0x9b78, 0x9b79, 0x9b7a, 0x9b7b,
+  0x7c1f, 0x7c2a, 0x7c26, 0x7c38, 0x7c41, 0x7c40, 0x81fe, 0x8201,
+  0x8202, 0x8204, 0x81ec, 0x8844, 0x8221, 0x8222, 0x8223, 0x822d,
+  0x822f, 0x8228, 0x822b, 0x8238, 0x823b, 0x8233, 0x8234, 0x823e,
+  0x8244, 0x8249, 0x824b, 0x824f, 0x825a, 0x825f, 0x8268, 0x887e,
+  0x8885, 0x8888, 0x88d8, 0x88df, 0x895e, 0x7f9d, 0x7f9f, 0x7fa7,
+  0x7faf, 0x7fb0, 0x7fb2, 0x7c7c, 0x6549, 0x7c91, 0x7c9d, 0x7c9c,
+  0x7c9e, 0x7ca2, 0x7cb2, 0x7cbc, 0x7cbd, 0x7cc1, 0x7cc7, 0x7ccc,
+  0x7ccd, 0x7cc8, 0x7cc5, 0x7cd7, 0x7ce8, 0x826e, 0x66a8, 0x7fbf,
+  0x7fce, 0x7fd5, 0x7fe5, 0x7fe1, 0x7fe6, 0x7fe9, 0x7fee, 0x7ff3,
+  0x7cf8, 0x7d77, 0x7da6, 0x7dae, 0x7e47, 0x7e9b, 0x9eb8, 0x9eb4,
+  0x8d73, 0x8d84, 0x8d94, 0x8d91, 0x8db1, 0x8d67, 0x8d6d, 0x8c47,
+  0x8c49, 0x914a, 0x9150, 0x914e, 0x914f, 0x9164,
+  /* 0xf5 */
+  0x9b7c, 0x9b7d, 0x9b7e, 0x9b7f, 0x9b80, 0x9b81, 0x9b82, 0x9b83,
+  0x9b84, 0x9b85, 0x9b86, 0x9b87, 0x9b88, 0x9b89, 0x9b8a, 0x9b8b,
+  0x9b8c, 0x9b8d, 0x9b8e, 0x9b8f, 0x9b90, 0x9b91, 0x9b92, 0x9b93,
+  0x9b94, 0x9b95, 0x9b96, 0x9b97, 0x9b98, 0x9b99, 0x9b9a, 0x9b9b,
+  0x9b9c, 0x9b9d, 0x9b9e, 0x9b9f, 0x9ba0, 0x9ba1, 0x9ba2, 0x9ba3,
+  0x9ba4, 0x9ba5, 0x9ba6, 0x9ba7, 0x9ba8, 0x9ba9, 0x9baa, 0x9bab,
+  0x9bac, 0x9bad, 0x9bae, 0x9baf, 0x9bb0, 0x9bb1, 0x9bb2, 0x9bb3,
+  0x9bb4, 0x9bb5, 0x9bb6, 0x9bb7, 0x9bb8, 0x9bb9, 0x9bba, 0x9bbb,
+  0x9bbc, 0x9bbd, 0x9bbe, 0x9bbf, 0x9bc0, 0x9bc1, 0x9bc2, 0x9bc3,
+  0x9bc4, 0x9bc5, 0x9bc6, 0x9bc7, 0x9bc8, 0x9bc9, 0x9bca, 0x9bcb,
+  0x9bcc, 0x9bcd, 0x9bce, 0x9bcf, 0x9bd0, 0x9bd1, 0x9bd2, 0x9bd3,
+  0x9bd4, 0x9bd5, 0x9bd6, 0x9bd7, 0x9bd8, 0x9bd9, 0x9bda, 0x9bdb,
+  0x9162, 0x9161, 0x9170, 0x9169, 0x916f, 0x917d, 0x917e, 0x9172,
+  0x9174, 0x9179, 0x918c, 0x9185, 0x9190, 0x918d, 0x9191, 0x91a2,
+  0x91a3, 0x91aa, 0x91ad, 0x91ae, 0x91af, 0x91b5, 0x91b4, 0x91ba,
+  0x8c55, 0x9e7e, 0x8db8, 0x8deb, 0x8e05, 0x8e59, 0x8e69, 0x8db5,
+  0x8dbf, 0x8dbc, 0x8dba, 0x8dc4, 0x8dd6, 0x8dd7, 0x8dda, 0x8dde,
+  0x8dce, 0x8dcf, 0x8ddb, 0x8dc6, 0x8dec, 0x8df7, 0x8df8, 0x8de3,
+  0x8df9, 0x8dfb, 0x8de4, 0x8e09, 0x8dfd, 0x8e14, 0x8e1d, 0x8e1f,
+  0x8e2c, 0x8e2e, 0x8e23, 0x8e2f, 0x8e3a, 0x8e40, 0x8e39, 0x8e35,
+  0x8e3d, 0x8e31, 0x8e49, 0x8e41, 0x8e42, 0x8e51, 0x8e52, 0x8e4a,
+  0x8e70, 0x8e76, 0x8e7c, 0x8e6f, 0x8e74, 0x8e85, 0x8e8f, 0x8e94,
+  0x8e90, 0x8e9c, 0x8e9e, 0x8c78, 0x8c82, 0x8c8a, 0x8c85, 0x8c98,
+  0x8c94, 0x659b, 0x89d6, 0x89de, 0x89da, 0x89dc,
+  /* 0xf6 */
+  0x9bdc, 0x9bdd, 0x9bde, 0x9bdf, 0x9be0, 0x9be1, 0x9be2, 0x9be3,
+  0x9be4, 0x9be5, 0x9be6, 0x9be7, 0x9be8, 0x9be9, 0x9bea, 0x9beb,
+  0x9bec, 0x9bed, 0x9bee, 0x9bef, 0x9bf0, 0x9bf1, 0x9bf2, 0x9bf3,
+  0x9bf4, 0x9bf5, 0x9bf6, 0x9bf7, 0x9bf8, 0x9bf9, 0x9bfa, 0x9bfb,
+  0x9bfc, 0x9bfd, 0x9bfe, 0x9bff, 0x9c00, 0x9c01, 0x9c02, 0x9c03,
+  0x9c04, 0x9c05, 0x9c06, 0x9c07, 0x9c08, 0x9c09, 0x9c0a, 0x9c0b,
+  0x9c0c, 0x9c0d, 0x9c0e, 0x9c0f, 0x9c10, 0x9c11, 0x9c12, 0x9c13,
+  0x9c14, 0x9c15, 0x9c16, 0x9c17, 0x9c18, 0x9c19, 0x9c1a, 0x9c1b,
+  0x9c1c, 0x9c1d, 0x9c1e, 0x9c1f, 0x9c20, 0x9c21, 0x9c22, 0x9c23,
+  0x9c24, 0x9c25, 0x9c26, 0x9c27, 0x9c28, 0x9c29, 0x9c2a, 0x9c2b,
+  0x9c2c, 0x9c2d, 0x9c2e, 0x9c2f, 0x9c30, 0x9c31, 0x9c32, 0x9c33,
+  0x9c34, 0x9c35, 0x9c36, 0x9c37, 0x9c38, 0x9c39, 0x9c3a, 0x9c3b,
+  0x89e5, 0x89eb, 0x89ef, 0x8a3e, 0x8b26, 0x9753, 0x96e9, 0x96f3,
+  0x96ef, 0x9706, 0x9701, 0x9708, 0x970f, 0x970e, 0x972a, 0x972d,
+  0x9730, 0x973e, 0x9f80, 0x9f83, 0x9f85, 0x9f86, 0x9f87, 0x9f88,
+  0x9f89, 0x9f8a, 0x9f8c, 0x9efe, 0x9f0b, 0x9f0d, 0x96b9, 0x96bc,
+  0x96bd, 0x96ce, 0x96d2, 0x77bf, 0x96e0, 0x928e, 0x92ae, 0x92c8,
+  0x933e, 0x936a, 0x93ca, 0x938f, 0x943e, 0x946b, 0x9c7f, 0x9c82,
+  0x9c85, 0x9c86, 0x9c87, 0x9c88, 0x7a23, 0x9c8b, 0x9c8e, 0x9c90,
+  0x9c91, 0x9c92, 0x9c94, 0x9c95, 0x9c9a, 0x9c9b, 0x9c9e, 0x9c9f,
+  0x9ca0, 0x9ca1, 0x9ca2, 0x9ca3, 0x9ca5, 0x9ca6, 0x9ca7, 0x9ca8,
+  0x9ca9, 0x9cab, 0x9cad, 0x9cae, 0x9cb0, 0x9cb1, 0x9cb2, 0x9cb3,
+  0x9cb4, 0x9cb5, 0x9cb6, 0x9cb7, 0x9cba, 0x9cbb, 0x9cbc, 0x9cbd,
+  0x9cc4, 0x9cc5, 0x9cc6, 0x9cc7, 0x9cca, 0x9ccb,
+  /* 0xf7 */
+  0x9c3c, 0x9c3d, 0x9c3e, 0x9c3f, 0x9c40, 0x9c41, 0x9c42, 0x9c43,
+  0x9c44, 0x9c45, 0x9c46, 0x9c47, 0x9c48, 0x9c49, 0x9c4a, 0x9c4b,
+  0x9c4c, 0x9c4d, 0x9c4e, 0x9c4f, 0x9c50, 0x9c51, 0x9c52, 0x9c53,
+  0x9c54, 0x9c55, 0x9c56, 0x9c57, 0x9c58, 0x9c59, 0x9c5a, 0x9c5b,
+  0x9c5c, 0x9c5d, 0x9c5e, 0x9c5f, 0x9c60, 0x9c61, 0x9c62, 0x9c63,
+  0x9c64, 0x9c65, 0x9c66, 0x9c67, 0x9c68, 0x9c69, 0x9c6a, 0x9c6b,
+  0x9c6c, 0x9c6d, 0x9c6e, 0x9c6f, 0x9c70, 0x9c71, 0x9c72, 0x9c73,
+  0x9c74, 0x9c75, 0x9c76, 0x9c77, 0x9c78, 0x9c79, 0x9c7a, 0x9c7b,
+  0x9c7d, 0x9c7e, 0x9c80, 0x9c83, 0x9c84, 0x9c89, 0x9c8a, 0x9c8c,
+  0x9c8f, 0x9c93, 0x9c96, 0x9c97, 0x9c98, 0x9c99, 0x9c9d, 0x9caa,
+  0x9cac, 0x9caf, 0x9cb9, 0x9cbe, 0x9cbf, 0x9cc0, 0x9cc1, 0x9cc2,
+  0x9cc8, 0x9cc9, 0x9cd1, 0x9cd2, 0x9cda, 0x9cdb, 0x9ce0, 0x9ce1,
+  0x9ccc, 0x9ccd, 0x9cce, 0x9ccf, 0x9cd0, 0x9cd3, 0x9cd4, 0x9cd5,
+  0x9cd7, 0x9cd8, 0x9cd9, 0x9cdc, 0x9cdd, 0x9cdf, 0x9ce2, 0x977c,
+  0x9785, 0x9791, 0x9792, 0x9794, 0x97af, 0x97ab, 0x97a3, 0x97b2,
+  0x97b4, 0x9ab1, 0x9ab0, 0x9ab7, 0x9e58, 0x9ab6, 0x9aba, 0x9abc,
+  0x9ac1, 0x9ac0, 0x9ac5, 0x9ac2, 0x9acb, 0x9acc, 0x9ad1, 0x9b45,
+  0x9b43, 0x9b47, 0x9b49, 0x9b48, 0x9b4d, 0x9b51, 0x98e8, 0x990d,
+  0x992e, 0x9955, 0x9954, 0x9adf, 0x9ae1, 0x9ae6, 0x9aef, 0x9aeb,
+  0x9afb, 0x9aed, 0x9af9, 0x9b08, 0x9b0f, 0x9b13, 0x9b1f, 0x9b23,
+  0x9ebd, 0x9ebe, 0x7e3b, 0x9e82, 0x9e87, 0x9e88, 0x9e8b, 0x9e92,
+  0x93d6, 0x9e9d, 0x9e9f, 0x9edb, 0x9edc, 0x9edd, 0x9ee0, 0x9edf,
+  0x9ee2, 0x9ee9, 0x9ee7, 0x9ee5, 0x9eea, 0x9eef, 0x9f22, 0x9f2c,
+  0x9f2f, 0x9f39, 0x9f37, 0x9f3d, 0x9f3e, 0x9f44,
+  /* 0xf8 */
+  0x9ce3, 0x9ce4, 0x9ce5, 0x9ce6, 0x9ce7, 0x9ce8, 0x9ce9, 0x9cea,
+  0x9ceb, 0x9cec, 0x9ced, 0x9cee, 0x9cef, 0x9cf0, 0x9cf1, 0x9cf2,
+  0x9cf3, 0x9cf4, 0x9cf5, 0x9cf6, 0x9cf7, 0x9cf8, 0x9cf9, 0x9cfa,
+  0x9cfb, 0x9cfc, 0x9cfd, 0x9cfe, 0x9cff, 0x9d00, 0x9d01, 0x9d02,
+  0x9d03, 0x9d04, 0x9d05, 0x9d06, 0x9d07, 0x9d08, 0x9d09, 0x9d0a,
+  0x9d0b, 0x9d0c, 0x9d0d, 0x9d0e, 0x9d0f, 0x9d10, 0x9d11, 0x9d12,
+  0x9d13, 0x9d14, 0x9d15, 0x9d16, 0x9d17, 0x9d18, 0x9d19, 0x9d1a,
+  0x9d1b, 0x9d1c, 0x9d1d, 0x9d1e, 0x9d1f, 0x9d20, 0x9d21, 0x9d22,
+  0x9d23, 0x9d24, 0x9d25, 0x9d26, 0x9d27, 0x9d28, 0x9d29, 0x9d2a,
+  0x9d2b, 0x9d2c, 0x9d2d, 0x9d2e, 0x9d2f, 0x9d30, 0x9d31, 0x9d32,
+  0x9d33, 0x9d34, 0x9d35, 0x9d36, 0x9d37, 0x9d38, 0x9d39, 0x9d3a,
+  0x9d3b, 0x9d3c, 0x9d3d, 0x9d3e, 0x9d3f, 0x9d40, 0x9d41, 0x9d42,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0xf9 */
+  0x9d43, 0x9d44, 0x9d45, 0x9d46, 0x9d47, 0x9d48, 0x9d49, 0x9d4a,
+  0x9d4b, 0x9d4c, 0x9d4d, 0x9d4e, 0x9d4f, 0x9d50, 0x9d51, 0x9d52,
+  0x9d53, 0x9d54, 0x9d55, 0x9d56, 0x9d57, 0x9d58, 0x9d59, 0x9d5a,
+  0x9d5b, 0x9d5c, 0x9d5d, 0x9d5e, 0x9d5f, 0x9d60, 0x9d61, 0x9d62,
+  0x9d63, 0x9d64, 0x9d65, 0x9d66, 0x9d67, 0x9d68, 0x9d69, 0x9d6a,
+  0x9d6b, 0x9d6c, 0x9d6d, 0x9d6e, 0x9d6f, 0x9d70, 0x9d71, 0x9d72,
+  0x9d73, 0x9d74, 0x9d75, 0x9d76, 0x9d77, 0x9d78, 0x9d79, 0x9d7a,
+  0x9d7b, 0x9d7c, 0x9d7d, 0x9d7e, 0x9d7f, 0x9d80, 0x9d81, 0x9d82,
+  0x9d83, 0x9d84, 0x9d85, 0x9d86, 0x9d87, 0x9d88, 0x9d89, 0x9d8a,
+  0x9d8b, 0x9d8c, 0x9d8d, 0x9d8e, 0x9d8f, 0x9d90, 0x9d91, 0x9d92,
+  0x9d93, 0x9d94, 0x9d95, 0x9d96, 0x9d97, 0x9d98, 0x9d99, 0x9d9a,
+  0x9d9b, 0x9d9c, 0x9d9d, 0x9d9e, 0x9d9f, 0x9da0, 0x9da1, 0x9da2,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0xfa */
+  0x9da3, 0x9da4, 0x9da5, 0x9da6, 0x9da7, 0x9da8, 0x9da9, 0x9daa,
+  0x9dab, 0x9dac, 0x9dad, 0x9dae, 0x9daf, 0x9db0, 0x9db1, 0x9db2,
+  0x9db3, 0x9db4, 0x9db5, 0x9db6, 0x9db7, 0x9db8, 0x9db9, 0x9dba,
+  0x9dbb, 0x9dbc, 0x9dbd, 0x9dbe, 0x9dbf, 0x9dc0, 0x9dc1, 0x9dc2,
+  0x9dc3, 0x9dc4, 0x9dc5, 0x9dc6, 0x9dc7, 0x9dc8, 0x9dc9, 0x9dca,
+  0x9dcb, 0x9dcc, 0x9dcd, 0x9dce, 0x9dcf, 0x9dd0, 0x9dd1, 0x9dd2,
+  0x9dd3, 0x9dd4, 0x9dd5, 0x9dd6, 0x9dd7, 0x9dd8, 0x9dd9, 0x9dda,
+  0x9ddb, 0x9ddc, 0x9ddd, 0x9dde, 0x9ddf, 0x9de0, 0x9de1, 0x9de2,
+  0x9de3, 0x9de4, 0x9de5, 0x9de6, 0x9de7, 0x9de8, 0x9de9, 0x9dea,
+  0x9deb, 0x9dec, 0x9ded, 0x9dee, 0x9def, 0x9df0, 0x9df1, 0x9df2,
+  0x9df3, 0x9df4, 0x9df5, 0x9df6, 0x9df7, 0x9df8, 0x9df9, 0x9dfa,
+  0x9dfb, 0x9dfc, 0x9dfd, 0x9dfe, 0x9dff, 0x9e00, 0x9e01, 0x9e02,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0xfb */
+  0x9e03, 0x9e04, 0x9e05, 0x9e06, 0x9e07, 0x9e08, 0x9e09, 0x9e0a,
+  0x9e0b, 0x9e0c, 0x9e0d, 0x9e0e, 0x9e0f, 0x9e10, 0x9e11, 0x9e12,
+  0x9e13, 0x9e14, 0x9e15, 0x9e16, 0x9e17, 0x9e18, 0x9e19, 0x9e1a,
+  0x9e1b, 0x9e1c, 0x9e1d, 0x9e1e, 0x9e24, 0x9e27, 0x9e2e, 0x9e30,
+  0x9e34, 0x9e3b, 0x9e3c, 0x9e40, 0x9e4d, 0x9e50, 0x9e52, 0x9e53,
+  0x9e54, 0x9e56, 0x9e59, 0x9e5d, 0x9e5f, 0x9e60, 0x9e61, 0x9e62,
+  0x9e65, 0x9e6e, 0x9e6f, 0x9e72, 0x9e74, 0x9e75, 0x9e76, 0x9e77,
+  0x9e78, 0x9e79, 0x9e7a, 0x9e7b, 0x9e7c, 0x9e7d, 0x9e80, 0x9e81,
+  0x9e83, 0x9e84, 0x9e85, 0x9e86, 0x9e89, 0x9e8a, 0x9e8c, 0x9e8d,
+  0x9e8e, 0x9e8f, 0x9e90, 0x9e91, 0x9e94, 0x9e95, 0x9e96, 0x9e97,
+  0x9e98, 0x9e99, 0x9e9a, 0x9e9b, 0x9e9c, 0x9e9e, 0x9ea0, 0x9ea1,
+  0x9ea2, 0x9ea3, 0x9ea4, 0x9ea5, 0x9ea7, 0x9ea8, 0x9ea9, 0x9eaa,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0xfc */
+  0x9eab, 0x9eac, 0x9ead, 0x9eae, 0x9eaf, 0x9eb0, 0x9eb1, 0x9eb2,
+  0x9eb3, 0x9eb5, 0x9eb6, 0x9eb7, 0x9eb9, 0x9eba, 0x9ebc, 0x9ebf,
+  0x9ec0, 0x9ec1, 0x9ec2, 0x9ec3, 0x9ec5, 0x9ec6, 0x9ec7, 0x9ec8,
+  0x9eca, 0x9ecb, 0x9ecc, 0x9ed0, 0x9ed2, 0x9ed3, 0x9ed5, 0x9ed6,
+  0x9ed7, 0x9ed9, 0x9eda, 0x9ede, 0x9ee1, 0x9ee3, 0x9ee4, 0x9ee6,
+  0x9ee8, 0x9eeb, 0x9eec, 0x9eed, 0x9eee, 0x9ef0, 0x9ef1, 0x9ef2,
+  0x9ef3, 0x9ef4, 0x9ef5, 0x9ef6, 0x9ef7, 0x9ef8, 0x9efa, 0x9efd,
+  0x9eff, 0x9f00, 0x9f01, 0x9f02, 0x9f03, 0x9f04, 0x9f05, 0x9f06,
+  0x9f07, 0x9f08, 0x9f09, 0x9f0a, 0x9f0c, 0x9f0f, 0x9f11, 0x9f12,
+  0x9f14, 0x9f15, 0x9f16, 0x9f18, 0x9f1a, 0x9f1b, 0x9f1c, 0x9f1d,
+  0x9f1e, 0x9f1f, 0x9f21, 0x9f23, 0x9f24, 0x9f25, 0x9f26, 0x9f27,
+  0x9f28, 0x9f29, 0x9f2a, 0x9f2b, 0x9f2d, 0x9f2e, 0x9f30, 0x9f31,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0xfd */
+  0x9f32, 0x9f33, 0x9f34, 0x9f35, 0x9f36, 0x9f38, 0x9f3a, 0x9f3c,
+  0x9f3f, 0x9f40, 0x9f41, 0x9f42, 0x9f43, 0x9f45, 0x9f46, 0x9f47,
+  0x9f48, 0x9f49, 0x9f4a, 0x9f4b, 0x9f4c, 0x9f4d, 0x9f4e, 0x9f4f,
+  0x9f52, 0x9f53, 0x9f54, 0x9f55, 0x9f56, 0x9f57, 0x9f58, 0x9f59,
+  0x9f5a, 0x9f5b, 0x9f5c, 0x9f5d, 0x9f5e, 0x9f5f, 0x9f60, 0x9f61,
+  0x9f62, 0x9f63, 0x9f64, 0x9f65, 0x9f66, 0x9f67, 0x9f68, 0x9f69,
+  0x9f6a, 0x9f6b, 0x9f6c, 0x9f6d, 0x9f6e, 0x9f6f, 0x9f70, 0x9f71,
+  0x9f72, 0x9f73, 0x9f74, 0x9f75, 0x9f76, 0x9f77, 0x9f78, 0x9f79,
+  0x9f7a, 0x9f7b, 0x9f7c, 0x9f7d, 0x9f7e, 0x9f81, 0x9f82, 0x9f8d,
+  0x9f8e, 0x9f8f, 0x9f90, 0x9f91, 0x9f92, 0x9f93, 0x9f94, 0x9f95,
+  0x9f96, 0x9f97, 0x9f98, 0x9f9c, 0x9f9d, 0x9f9e, 0x9fa1, 0x9fa2,
+  0x9fa3, 0x9fa4, 0x9fa5, 0xf92c, 0xf979, 0xf995, 0xf9e7, 0xf9f1,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0xfe */
+  0xfa0c, 0xfa0d, 0xfa0e, 0xfa0f, 0xfa11, 0xfa13, 0xfa14, 0xfa18,
+  0xfa1f, 0xfa20, 0xfa21, 0xfa23, 0xfa24, 0xfa27, 0xfa28, 0xfa29,
+};
+
+static int
+gbk_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c1 = s[0];
+  if ((c1 >= 0x81 && c1 <= 0xfe)) {
+    if (n >= 2) {
+      unsigned char c2 = s[1];
+      if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0x80 && c2 < 0xff)) {
+        unsigned int i = 190 * (c1 - 0x81) + (c2 - (c2 >= 0x80 ? 0x41 : 0x40));
+        unsigned short wc = 0xfffd;
+        {
+          if (i < 23766)
+            wc = gbk_2uni_page81[i];
+        }
+        if (wc != 0xfffd) {
+          *pwc = (ucs4_t) wc;
+          return 2;
+        }
+      }
+      return RET_ILSEQ;
+    }
+    return RET_TOOFEW(0);
+  }
+  return RET_ILSEQ;
+}
+
+static const unsigned short gbk_page00[208] = {
+  0x0000, 0x0000, 0x0000, 0x0000, 0xa1e8, 0x0000, 0x0000, 0xa1ec, /*0xa0-0xa7*/
+  0xa1a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xa8-0xaf*/
+  0xa1e3, 0xa1c0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1a4, /*0xb0-0xb7*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xb8-0xbf*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xc0-0xc7*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xc8-0xcf*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1c1, /*0xd0-0xd7*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xd8-0xdf*/
+  0xa8a4, 0xa8a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xe0-0xe7*/
+  0xa8a8, 0xa8a6, 0xa8ba, 0x0000, 0xa8ac, 0xa8aa, 0x0000, 0x0000, /*0xe8-0xef*/
+  0x0000, 0x0000, 0xa8b0, 0xa8ae, 0x0000, 0x0000, 0x0000, 0xa1c2, /*0xf0-0xf7*/
+  0x0000, 0xa8b4, 0xa8b2, 0x0000, 0xa8b9, 0x0000, 0x0000, 0x0000, /*0xf8-0xff*/
+  /* 0x0100 */
+  0x0000, 0xa8a1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x00-0x07*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x08-0x0f*/
+  0x0000, 0x0000, 0x0000, 0xa8a5, 0x0000, 0x0000, 0x0000, 0x0000, /*0x10-0x17*/
+  0x0000, 0x0000, 0x0000, 0xa8a7, 0x0000, 0x0000, 0x0000, 0x0000, /*0x18-0x1f*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x20-0x27*/
+  0x0000, 0x0000, 0x0000, 0xa8a9, 0x0000, 0x0000, 0x0000, 0x0000, /*0x28-0x2f*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x30-0x37*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x38-0x3f*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0xa8bd, 0x0000, 0x0000, 0x0000, /*0x40-0x47*/
+  0xa8be, 0x0000, 0x0000, 0x0000, 0x0000, 0xa8ad, 0x0000, 0x0000, /*0x48-0x4f*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x50-0x57*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x58-0x5f*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x60-0x67*/
+  0x0000, 0x0000, 0x0000, 0xa8b1, 0x0000, 0x0000, 0x0000, 0x0000, /*0x68-0x6f*/
+};
+static const unsigned short gbk_page01[24] = {
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa8a3, 0x0000, /*0xc8-0xcf*/
+  0xa8ab, 0x0000, 0xa8af, 0x0000, 0xa8b3, 0x0000, 0xa8b5, 0x0000, /*0xd0-0xd7*/
+  0xa8b6, 0x0000, 0xa8b7, 0x0000, 0xa8b8, 0x0000, 0x0000, 0x0000, /*0xd8-0xdf*/
+};
+static const unsigned short gbk_page02a[24] = {
+  0x0000, 0xa8bb, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x50-0x57*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x58-0x5f*/
+  0x0000, 0xa8c0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x60-0x67*/
+};
+static const unsigned short gbk_page02b[32] = {
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1a6, /*0xc0-0xc7*/
+  0x0000, 0xa1a5, 0xa840, 0xa841, 0x0000, 0x0000, 0x0000, 0x0000, /*0xc8-0xcf*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xd0-0xd7*/
+  0x0000, 0xa842, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xd8-0xdf*/
+};
+static const unsigned short gbk_page03[64] = {
+  0x0000, 0xa6a1, 0xa6a2, 0xa6a3, 0xa6a4, 0xa6a5, 0xa6a6, 0xa6a7, /*0x90-0x97*/
+  0xa6a8, 0xa6a9, 0xa6aa, 0xa6ab, 0xa6ac, 0xa6ad, 0xa6ae, 0xa6af, /*0x98-0x9f*/
+  0xa6b0, 0xa6b1, 0x0000, 0xa6b2, 0xa6b3, 0xa6b4, 0xa6b5, 0xa6b6, /*0xa0-0xa7*/
+  0xa6b7, 0xa6b8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xa8-0xaf*/
+  0x0000, 0xa6c1, 0xa6c2, 0xa6c3, 0xa6c4, 0xa6c5, 0xa6c6, 0xa6c7, /*0xb0-0xb7*/
+  0xa6c8, 0xa6c9, 0xa6ca, 0xa6cb, 0xa6cc, 0xa6cd, 0xa6ce, 0xa6cf, /*0xb8-0xbf*/
+  0xa6d0, 0xa6d1, 0x0000, 0xa6d2, 0xa6d3, 0xa6d4, 0xa6d5, 0xa6d6, /*0xc0-0xc7*/
+  0xa6d7, 0xa6d8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xc8-0xcf*/
+};
+static const unsigned short gbk_page04[88] = {
+  0x0000, 0xa7a7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x00-0x07*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x08-0x0f*/
+  0xa7a1, 0xa7a2, 0xa7a3, 0xa7a4, 0xa7a5, 0xa7a6, 0xa7a8, 0xa7a9, /*0x10-0x17*/
+  0xa7aa, 0xa7ab, 0xa7ac, 0xa7ad, 0xa7ae, 0xa7af, 0xa7b0, 0xa7b1, /*0x18-0x1f*/
+  0xa7b2, 0xa7b3, 0xa7b4, 0xa7b5, 0xa7b6, 0xa7b7, 0xa7b8, 0xa7b9, /*0x20-0x27*/
+  0xa7ba, 0xa7bb, 0xa7bc, 0xa7bd, 0xa7be, 0xa7bf, 0xa7c0, 0xa7c1, /*0x28-0x2f*/
+  0xa7d1, 0xa7d2, 0xa7d3, 0xa7d4, 0xa7d5, 0xa7d6, 0xa7d8, 0xa7d9, /*0x30-0x37*/
+  0xa7da, 0xa7db, 0xa7dc, 0xa7dd, 0xa7de, 0xa7df, 0xa7e0, 0xa7e1, /*0x38-0x3f*/
+  0xa7e2, 0xa7e3, 0xa7e4, 0xa7e5, 0xa7e6, 0xa7e7, 0xa7e8, 0xa7e9, /*0x40-0x47*/
+  0xa7ea, 0xa7eb, 0xa7ec, 0xa7ed, 0xa7ee, 0xa7ef, 0xa7f0, 0xa7f1, /*0x48-0x4f*/
+  0x0000, 0xa7d7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x50-0x57*/
+};
+static const unsigned short gbk_page20[48] = {
+  0xa95c, 0x0000, 0x0000, 0xa843, 0xa1aa, 0xa844, 0xa1ac, 0x0000, /*0x10-0x17*/
+  0xa1ae, 0xa1af, 0x0000, 0x0000, 0xa1b0, 0xa1b1, 0x0000, 0x0000, /*0x18-0x1f*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa845, 0xa1ad, 0x0000, /*0x20-0x27*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x28-0x2f*/
+  0xa1eb, 0x0000, 0xa1e4, 0xa1e5, 0x0000, 0xa846, 0x0000, 0x0000, /*0x30-0x37*/
+  0x0000, 0x0000, 0x0000, 0xa1f9, 0x0000, 0x0000, 0x0000, 0x0000, /*0x38-0x3f*/
+};
+static const unsigned short gbk_page21[160] = {
+  0x0000, 0x0000, 0x0000, 0xa1e6, 0x0000, 0xa847, 0x0000, 0x0000, /*0x00-0x07*/
+  0x0000, 0xa848, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x08-0x0f*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1ed, 0x0000, /*0x10-0x17*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x18-0x1f*/
+  0x0000, 0xa959, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x20-0x27*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x28-0x2f*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x30-0x37*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x38-0x3f*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x40-0x47*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x48-0x4f*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x50-0x57*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x58-0x5f*/
+  0xa2f1, 0xa2f2, 0xa2f3, 0xa2f4, 0xa2f5, 0xa2f6, 0xa2f7, 0xa2f8, /*0x60-0x67*/
+  0xa2f9, 0xa2fa, 0xa2fb, 0xa2fc, 0x0000, 0x0000, 0x0000, 0x0000, /*0x68-0x6f*/
+  0xa2a1, 0xa2a2, 0xa2a3, 0xa2a4, 0xa2a5, 0xa2a6, 0xa2a7, 0xa2a8, /*0x70-0x77*/
+  0xa2a9, 0xa2aa, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x78-0x7f*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x80-0x87*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x88-0x8f*/
+  0xa1fb, 0xa1fc, 0xa1fa, 0xa1fd, 0x0000, 0x0000, 0xa849, 0xa84a, /*0x90-0x97*/
+  0xa84b, 0xa84c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x98-0x9f*/
+};
+static const unsigned short gbk_page22[184] = {
+  0xa1ca, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1c7, /*0x08-0x0f*/
+  0x0000, 0xa1c6, 0x0000, 0x0000, 0x0000, 0xa84d, 0x0000, 0x0000, /*0x10-0x17*/
+  0x0000, 0x0000, 0xa1cc, 0x0000, 0x0000, 0xa1d8, 0xa1de, 0xa84e, /*0x18-0x1f*/
+  0xa1cf, 0x0000, 0x0000, 0xa84f, 0x0000, 0xa1ce, 0x0000, 0xa1c4, /*0x20-0x27*/
+  0xa1c5, 0xa1c9, 0xa1c8, 0xa1d2, 0x0000, 0x0000, 0xa1d3, 0x0000, /*0x28-0x2f*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0xa1e0, 0xa1df, 0xa1c3, 0xa1cb, /*0x30-0x37*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1d7, 0x0000, 0x0000, /*0x38-0x3f*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x40-0x47*/
+  0xa1d6, 0x0000, 0x0000, 0x0000, 0xa1d5, 0x0000, 0x0000, 0x0000, /*0x48-0x4f*/
+  0x0000, 0x0000, 0xa850, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x50-0x57*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x58-0x5f*/
+  0xa1d9, 0xa1d4, 0x0000, 0x0000, 0xa1dc, 0xa1dd, 0xa851, 0xa852, /*0x60-0x67*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1da, 0xa1db, /*0x68-0x6f*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x70-0x77*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x78-0x7f*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x80-0x87*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x88-0x8f*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa892, 0x0000, 0x0000, /*0x90-0x97*/
+  0x0000, 0xa1d1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x98-0x9f*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1cd, 0x0000, 0x0000, /*0xa0-0xa7*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xa8-0xaf*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xb0-0xb7*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa853, /*0xb8-0xbf*/
+};
+static const unsigned short gbk_page24[64] = {
+  0xa2d9, 0xa2da, 0xa2db, 0xa2dc, 0xa2dd, 0xa2de, 0xa2df, 0xa2e0, /*0x60-0x67*/
+  0xa2e1, 0xa2e2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x68-0x6f*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0xa2c5, 0xa2c6, 0xa2c7, 0xa2c8, /*0x70-0x77*/
+  0xa2c9, 0xa2ca, 0xa2cb, 0xa2cc, 0xa2cd, 0xa2ce, 0xa2cf, 0xa2d0, /*0x78-0x7f*/
+  0xa2d1, 0xa2d2, 0xa2d3, 0xa2d4, 0xa2d5, 0xa2d6, 0xa2d7, 0xa2d8, /*0x80-0x87*/
+  0xa2b1, 0xa2b2, 0xa2b3, 0xa2b4, 0xa2b5, 0xa2b6, 0xa2b7, 0xa2b8, /*0x88-0x8f*/
+  0xa2b9, 0xa2ba, 0xa2bb, 0xa2bc, 0xa2bd, 0xa2be, 0xa2bf, 0xa2c0, /*0x90-0x97*/
+  0xa2c1, 0xa2c2, 0xa2c3, 0xa2c4, 0x0000, 0x0000, 0x0000, 0x0000, /*0x98-0x9f*/
+};
+static const unsigned short gbk_page25[232] = {
+  0xa9a4, 0xa9a5, 0xa9a6, 0xa9a7, 0xa9a8, 0xa9a9, 0xa9aa, 0xa9ab, /*0x00-0x07*/
+  0xa9ac, 0xa9ad, 0xa9ae, 0xa9af, 0xa9b0, 0xa9b1, 0xa9b2, 0xa9b3, /*0x08-0x0f*/
+  0xa9b4, 0xa9b5, 0xa9b6, 0xa9b7, 0xa9b8, 0xa9b9, 0xa9ba, 0xa9bb, /*0x10-0x17*/
+  0xa9bc, 0xa9bd, 0xa9be, 0xa9bf, 0xa9c0, 0xa9c1, 0xa9c2, 0xa9c3, /*0x18-0x1f*/
+  0xa9c4, 0xa9c5, 0xa9c6, 0xa9c7, 0xa9c8, 0xa9c9, 0xa9ca, 0xa9cb, /*0x20-0x27*/
+  0xa9cc, 0xa9cd, 0xa9ce, 0xa9cf, 0xa9d0, 0xa9d1, 0xa9d2, 0xa9d3, /*0x28-0x2f*/
+  0xa9d4, 0xa9d5, 0xa9d6, 0xa9d7, 0xa9d8, 0xa9d9, 0xa9da, 0xa9db, /*0x30-0x37*/
+  0xa9dc, 0xa9dd, 0xa9de, 0xa9df, 0xa9e0, 0xa9e1, 0xa9e2, 0xa9e3, /*0x38-0x3f*/
+  0xa9e4, 0xa9e5, 0xa9e6, 0xa9e7, 0xa9e8, 0xa9e9, 0xa9ea, 0xa9eb, /*0x40-0x47*/
+  0xa9ec, 0xa9ed, 0xa9ee, 0xa9ef, 0x0000, 0x0000, 0x0000, 0x0000, /*0x48-0x4f*/
+  0xa854, 0xa855, 0xa856, 0xa857, 0xa858, 0xa859, 0xa85a, 0xa85b, /*0x50-0x57*/
+  0xa85c, 0xa85d, 0xa85e, 0xa85f, 0xa860, 0xa861, 0xa862, 0xa863, /*0x58-0x5f*/
+  0xa864, 0xa865, 0xa866, 0xa867, 0xa868, 0xa869, 0xa86a, 0xa86b, /*0x60-0x67*/
+  0xa86c, 0xa86d, 0xa86e, 0xa86f, 0xa870, 0xa871, 0xa872, 0xa873, /*0x68-0x6f*/
+  0xa874, 0xa875, 0xa876, 0xa877, 0x0000, 0x0000, 0x0000, 0x0000, /*0x70-0x77*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x78-0x7f*/
+  0x0000, 0xa878, 0xa879, 0xa87a, 0xa87b, 0xa87c, 0xa87d, 0xa87e, /*0x80-0x87*/
+  0xa880, 0xa881, 0xa882, 0xa883, 0xa884, 0xa885, 0xa886, 0xa887, /*0x88-0x8f*/
+  0x0000, 0x0000, 0x0000, 0xa888, 0xa889, 0xa88a, 0x0000, 0x0000, /*0x90-0x97*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x98-0x9f*/
+  0xa1f6, 0xa1f5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xa0-0xa7*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xa8-0xaf*/
+  0x0000, 0x0000, 0xa1f8, 0xa1f7, 0x0000, 0x0000, 0x0000, 0x0000, /*0xb0-0xb7*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0xa88b, 0xa88c, 0x0000, 0x0000, /*0xb8-0xbf*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1f4, 0xa1f3, /*0xc0-0xc7*/
+  0x0000, 0x0000, 0x0000, 0xa1f0, 0x0000, 0x0000, 0xa1f2, 0xa1f1, /*0xc8-0xcf*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xd0-0xd7*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xd8-0xdf*/
+  0x0000, 0x0000, 0xa88d, 0xa88e, 0xa88f, 0xa890, 0x0000, 0x0000, /*0xe0-0xe7*/
+};
+static const unsigned short gbk_page26[72] = {
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa1ef, 0xa1ee, 0x0000, /*0x00-0x07*/
+  0x0000, 0xa891, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x08-0x0f*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x10-0x17*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x18-0x1f*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x20-0x27*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x28-0x2f*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x30-0x37*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x38-0x3f*/
+  0xa1e2, 0x0000, 0xa1e1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x40-0x47*/
+};
+static const unsigned short gbk_page30[304] = {
+  0xa1a1, 0xa1a2, 0xa1a3, 0xa1a8, 0x0000, 0xa1a9, 0xa965, 0xa996, /*0x00-0x07*/
+  0xa1b4, 0xa1b5, 0xa1b6, 0xa1b7, 0xa1b8, 0xa1b9, 0xa1ba, 0xa1bb, /*0x08-0x0f*/
+  0xa1be, 0xa1bf, 0xa893, 0xa1fe, 0xa1b2, 0xa1b3, 0xa1bc, 0xa1bd, /*0x10-0x17*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa894, 0xa895, 0x0000, /*0x18-0x1f*/
+  0x0000, 0xa940, 0xa941, 0xa942, 0xa943, 0xa944, 0xa945, 0xa946, /*0x20-0x27*/
+  0xa947, 0xa948, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x28-0x2f*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x30-0x37*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x38-0x3f*/
+  0x0000, 0xa4a1, 0xa4a2, 0xa4a3, 0xa4a4, 0xa4a5, 0xa4a6, 0xa4a7, /*0x40-0x47*/
+  0xa4a8, 0xa4a9, 0xa4aa, 0xa4ab, 0xa4ac, 0xa4ad, 0xa4ae, 0xa4af, /*0x48-0x4f*/
+  0xa4b0, 0xa4b1, 0xa4b2, 0xa4b3, 0xa4b4, 0xa4b5, 0xa4b6, 0xa4b7, /*0x50-0x57*/
+  0xa4b8, 0xa4b9, 0xa4ba, 0xa4bb, 0xa4bc, 0xa4bd, 0xa4be, 0xa4bf, /*0x58-0x5f*/
+  0xa4c0, 0xa4c1, 0xa4c2, 0xa4c3, 0xa4c4, 0xa4c5, 0xa4c6, 0xa4c7, /*0x60-0x67*/
+  0xa4c8, 0xa4c9, 0xa4ca, 0xa4cb, 0xa4cc, 0xa4cd, 0xa4ce, 0xa4cf, /*0x68-0x6f*/
+  0xa4d0, 0xa4d1, 0xa4d2, 0xa4d3, 0xa4d4, 0xa4d5, 0xa4d6, 0xa4d7, /*0x70-0x77*/
+  0xa4d8, 0xa4d9, 0xa4da, 0xa4db, 0xa4dc, 0xa4dd, 0xa4de, 0xa4df, /*0x78-0x7f*/
+  0xa4e0, 0xa4e1, 0xa4e2, 0xa4e3, 0xa4e4, 0xa4e5, 0xa4e6, 0xa4e7, /*0x80-0x87*/
+  0xa4e8, 0xa4e9, 0xa4ea, 0xa4eb, 0xa4ec, 0xa4ed, 0xa4ee, 0xa4ef, /*0x88-0x8f*/
+  0xa4f0, 0xa4f1, 0xa4f2, 0xa4f3, 0x0000, 0x0000, 0x0000, 0x0000, /*0x90-0x97*/
+  0x0000, 0x0000, 0x0000, 0xa961, 0xa962, 0xa966, 0xa967, 0x0000, /*0x98-0x9f*/
+  0x0000, 0xa5a1, 0xa5a2, 0xa5a3, 0xa5a4, 0xa5a5, 0xa5a6, 0xa5a7, /*0xa0-0xa7*/
+  0xa5a8, 0xa5a9, 0xa5aa, 0xa5ab, 0xa5ac, 0xa5ad, 0xa5ae, 0xa5af, /*0xa8-0xaf*/
+  0xa5b0, 0xa5b1, 0xa5b2, 0xa5b3, 0xa5b4, 0xa5b5, 0xa5b6, 0xa5b7, /*0xb0-0xb7*/
+  0xa5b8, 0xa5b9, 0xa5ba, 0xa5bb, 0xa5bc, 0xa5bd, 0xa5be, 0xa5bf, /*0xb8-0xbf*/
+  0xa5c0, 0xa5c1, 0xa5c2, 0xa5c3, 0xa5c4, 0xa5c5, 0xa5c6, 0xa5c7, /*0xc0-0xc7*/
+  0xa5c8, 0xa5c9, 0xa5ca, 0xa5cb, 0xa5cc, 0xa5cd, 0xa5ce, 0xa5cf, /*0xc8-0xcf*/
+  0xa5d0, 0xa5d1, 0xa5d2, 0xa5d3, 0xa5d4, 0xa5d5, 0xa5d6, 0xa5d7, /*0xd0-0xd7*/
+  0xa5d8, 0xa5d9, 0xa5da, 0xa5db, 0xa5dc, 0xa5dd, 0xa5de, 0xa5df, /*0xd8-0xdf*/
+  0xa5e0, 0xa5e1, 0xa5e2, 0xa5e3, 0xa5e4, 0xa5e5, 0xa5e6, 0xa5e7, /*0xe0-0xe7*/
+  0xa5e8, 0xa5e9, 0xa5ea, 0xa5eb, 0xa5ec, 0xa5ed, 0xa5ee, 0xa5ef, /*0xe8-0xef*/
+  0xa5f0, 0xa5f1, 0xa5f2, 0xa5f3, 0xa5f4, 0xa5f5, 0xa5f6, 0x0000, /*0xf0-0xf7*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0xa960, 0xa963, 0xa964, 0x0000, /*0xf8-0xff*/
+  /* 0x3100 */
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa8c5, 0xa8c6, 0xa8c7, /*0x00-0x07*/
+  0xa8c8, 0xa8c9, 0xa8ca, 0xa8cb, 0xa8cc, 0xa8cd, 0xa8ce, 0xa8cf, /*0x08-0x0f*/
+  0xa8d0, 0xa8d1, 0xa8d2, 0xa8d3, 0xa8d4, 0xa8d5, 0xa8d6, 0xa8d7, /*0x10-0x17*/
+  0xa8d8, 0xa8d9, 0xa8da, 0xa8db, 0xa8dc, 0xa8dd, 0xa8de, 0xa8df, /*0x18-0x1f*/
+  0xa8e0, 0xa8e1, 0xa8e2, 0xa8e3, 0xa8e4, 0xa8e5, 0xa8e6, 0xa8e7, /*0x20-0x27*/
+  0xa8e8, 0xa8e9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x28-0x2f*/
+};
+static const unsigned short gbk_page32[24] = {
+  0xa2e5, 0xa2e6, 0xa2e7, 0xa2e8, 0xa2e9, 0xa2ea, 0xa2eb, 0xa2ec, /*0x20-0x27*/
+  0xa2ed, 0xa2ee, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x28-0x2f*/
+  0x0000, 0xa95a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x30-0x37*/
+};
+static const unsigned short gbk_page33[80] = {
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa94a, 0xa94b, /*0x88-0x8f*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x90-0x97*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0xa94c, 0xa94d, 0xa94e, 0x0000, /*0x98-0x9f*/
+  0x0000, 0xa94f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xa0-0xa7*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xa8-0xaf*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xb0-0xb7*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xb8-0xbf*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0xa950, 0x0000, 0x0000, 0x0000, /*0xc0-0xc7*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa951, 0x0000, /*0xc8-0xcf*/
+  0x0000, 0xa952, 0xa953, 0x0000, 0x0000, 0xa954, 0x0000, 0x0000, /*0xd0-0xd7*/
+};
+static const unsigned short gbk_page4e[20904] = {
+  0xd2bb, 0xb6a1, 0x8140, 0xc6df, 0x8141, 0x8142, 0x8143, 0xcdf2, /*0x00-0x07*/
+  0xd5c9, 0xc8fd, 0xc9cf, 0xcfc2, 0xd8a2, 0xb2bb, 0xd3eb, 0x8144, /*0x08-0x0f*/
+  0xd8a4, 0xb3f3, 0x8145, 0xd7a8, 0xc7d2, 0xd8a7, 0xcac0, 0x8146, /*0x10-0x17*/
+  0xc7f0, 0xb1fb, 0xd2b5, 0xb4d4, 0xb6ab, 0xcbbf, 0xd8a9, 0x8147, /*0x18-0x1f*/
+  0x8148, 0x8149, 0xb6aa, 0x814a, 0xc1bd, 0xd1cf, 0x814b, 0xc9a5, /*0x20-0x27*/
+  0xd8ad, 0x814c, 0xb8f6, 0xd1be, 0xe3dc, 0xd6d0, 0x814d, 0x814e, /*0x28-0x2f*/
+  0xb7e1, 0x814f, 0xb4ae, 0x8150, 0xc1d9, 0x8151, 0xd8bc, 0x8152, /*0x30-0x37*/
+  0xcde8, 0xb5a4, 0xceaa, 0xd6f7, 0x8153, 0xc0f6, 0xbed9, 0xd8af, /*0x38-0x3f*/
+  0x8154, 0x8155, 0x8156, 0xc4cb, 0x8157, 0xbec3, 0x8158, 0xd8b1, /*0x40-0x47*/
+  0xc3b4, 0xd2e5, 0x8159, 0xd6ae, 0xceda, 0xd5a7, 0xbaf5, 0xb7a6, /*0x48-0x4f*/
+  0xc0d6, 0x815a, 0xc6b9, 0xc5d2, 0xc7c7, 0x815b, 0xb9d4, 0x815c, /*0x50-0x57*/
+  0xb3cb, 0xd2d2, 0x815d, 0x815e, 0xd8bf, 0xbec5, 0xc6f2, 0xd2b2, /*0x58-0x5f*/
+  0xcfb0, 0xcfe7, 0x815f, 0x8160, 0x8161, 0x8162, 0xcae9, 0x8163, /*0x60-0x67*/
+  0x8164, 0xd8c0, 0x8165, 0x8166, 0x8167, 0x8168, 0x8169, 0x816a, /*0x68-0x6f*/
+  0xc2f2, 0xc2d2, 0x816b, 0xc8e9, 0x816c, 0x816d, 0x816e, 0x816f, /*0x70-0x77*/
+  0x8170, 0x8171, 0x8172, 0x8173, 0x8174, 0x8175, 0xc7ac, 0x8176, /*0x78-0x7f*/
+  0x8177, 0x8178, 0x8179, 0x817a, 0x817b, 0x817c, 0xc1cb, 0x817d, /*0x80-0x87*/
+  0xd3e8, 0xd5f9, 0x817e, 0xcac2, 0xb6fe, 0xd8a1, 0xd3da, 0xbff7, /*0x88-0x8f*/
+  0x8180, 0xd4c6, 0xbba5, 0xd8c1, 0xcee5, 0xbeae, 0x8181, 0x8182, /*0x90-0x97*/
+  0xd8a8, 0x8183, 0xd1c7, 0xd0a9, 0x8184, 0x8185, 0x8186, 0xd8bd, /*0x98-0x9f*/
+  0xd9ef, 0xcdf6, 0xbfba, 0x8187, 0xbdbb, 0xbaa5, 0xd2e0, 0xb2fa, /*0xa0-0xa7*/
+  0xbae0, 0xc4b6, 0x8188, 0xcfed, 0xbea9, 0xcda4, 0xc1c1, 0x8189, /*0xa8-0xaf*/
+  0x818a, 0x818b, 0xc7d7, 0xd9f1, 0x818c, 0xd9f4, 0x818d, 0x818e, /*0xb0-0xb7*/
+  0x818f, 0x8190, 0xc8cb, 0xd8e9, 0x8191, 0x8192, 0x8193, 0xd2da, /*0xb8-0xbf*/
+  0xcab2, 0xc8ca, 0xd8ec, 0xd8ea, 0xd8c6, 0xbdf6, 0xc6cd, 0xb3f0, /*0xc0-0xc7*/
+  0x8194, 0xd8eb, 0xbdf1, 0xbde9, 0x8195, 0xc8d4, 0xb4d3, 0x8196, /*0xc8-0xcf*/
+  0x8197, 0xc2d8, 0x8198, 0xb2d6, 0xd7d0, 0xcacb, 0xcbfb, 0xd5cc, /*0xd0-0xd7*/
+  0xb8b6, 0xcfc9, 0x8199, 0x819a, 0x819b, 0xd9da, 0xd8f0, 0xc7aa, /*0xd8-0xdf*/
+  0x819c, 0xd8ee, 0x819d, 0xb4fa, 0xc1ee, 0xd2d4, 0x819e, 0x819f, /*0xe0-0xe7*/
+  0xd8ed, 0x81a0, 0xd2c7, 0xd8ef, 0xc3c7, 0x81a1, 0x81a2, 0x81a3, /*0xe8-0xef*/
+  0xd1f6, 0x81a4, 0xd6d9, 0xd8f2, 0x81a5, 0xd8f5, 0xbcfe, 0xbcdb, /*0xf0-0xf7*/
+  0x81a6, 0x81a7, 0x81a8, 0xc8ce, 0x81a9, 0xb7dd, 0x81aa, 0xb7c2, /*0xf8-0xff*/
+  /* 0x4f00 */
+  0x81ab, 0xc6f3, 0x81ac, 0x81ad, 0x81ae, 0x81af, 0x81b0, 0x81b1, /*0x00-0x07*/
+  0x81b2, 0xd8f8, 0xd2c1, 0x81b3, 0x81b4, 0xcee9, 0xbcbf, 0xb7fc, /*0x08-0x0f*/
+  0xb7a5, 0xd0dd, 0x81b5, 0x81b6, 0x81b7, 0x81b8, 0x81b9, 0xd6da, /*0x10-0x17*/
+  0xd3c5, 0xbbef, 0xbbe1, 0xd8f1, 0x81ba, 0x81bb, 0xc9a1, 0xceb0, /*0x18-0x1f*/
+  0xb4ab, 0x81bc, 0xd8f3, 0x81bd, 0xc9cb, 0xd8f6, 0xc2d7, 0xd8f7, /*0x20-0x27*/
+  0x81be, 0x81bf, 0xceb1, 0xd8f9, 0x81c0, 0x81c1, 0x81c2, 0xb2ae, /*0x28-0x2f*/
+  0xb9c0, 0x81c3, 0xd9a3, 0x81c4, 0xb0e9, 0x81c5, 0xc1e6, 0x81c6, /*0x30-0x37*/
+  0xc9ec, 0x81c7, 0xcbc5, 0x81c8, 0xcbc6, 0xd9a4, 0x81c9, 0x81ca, /*0x38-0x3f*/
+  0x81cb, 0x81cc, 0x81cd, 0xb5e8, 0x81ce, 0x81cf, 0xb5ab, 0x81d0, /*0x40-0x47*/
+  0x81d1, 0x81d2, 0x81d3, 0x81d4, 0x81d5, 0xcebb, 0xb5cd, 0xd7a1, /*0x48-0x4f*/
+  0xd7f4, 0xd3d3, 0x81d6, 0xcce5, 0x81d7, 0xbace, 0x81d8, 0xd9a2, /*0x50-0x57*/
+  0xd9dc, 0xd3e0, 0xd8fd, 0xb7f0, 0xd7f7, 0xd8fe, 0xd8fa, 0xd9a1, /*0x58-0x5f*/
+  0xc4e3, 0x81d9, 0x81da, 0xd3b6, 0xd8f4, 0xd9dd, 0x81db, 0xd8fb, /*0x60-0x67*/
+  0x81dc, 0xc5e5, 0x81dd, 0x81de, 0xc0d0, 0x81df, 0x81e0, 0xd1f0, /*0x68-0x6f*/
+  0xb0db, 0x81e1, 0x81e2, 0xbcd1, 0xd9a6, 0x81e3, 0xd9a5, 0x81e4, /*0x70-0x77*/
+  0x81e5, 0x81e6, 0x81e7, 0xd9ac, 0xd9ae, 0x81e8, 0xd9ab, 0xcab9, /*0x78-0x7f*/
+  0x81e9, 0x81ea, 0x81eb, 0xd9a9, 0xd6b6, 0x81ec, 0x81ed, 0x81ee, /*0x80-0x87*/
+  0xb3de, 0xd9a8, 0x81ef, 0xc0fd, 0x81f0, 0xcacc, 0x81f1, 0xd9aa, /*0x88-0x8f*/
+  0x81f2, 0xd9a7, 0x81f3, 0x81f4, 0xd9b0, 0x81f5, 0x81f6, 0xb6b1, /*0x90-0x97*/
+  0x81f7, 0x81f8, 0x81f9, 0xb9a9, 0x81fa, 0xd2c0, 0x81fb, 0x81fc, /*0x98-0x9f*/
+  0xcfc0, 0x81fd, 0x81fe, 0xc2c2, 0x8240, 0xbdc4, 0xd5ec, 0xb2e0, /*0xa0-0xa7*/
+  0xc7c8, 0xbfeb, 0xd9ad, 0x8241, 0xd9af, 0x8242, 0xceea, 0xbaee, /*0xa8-0xaf*/
+  0x8243, 0x8244, 0x8245, 0x8246, 0x8247, 0xc7d6, 0x8248, 0x8249, /*0xb0-0xb7*/
+  0x824a, 0x824b, 0x824c, 0x824d, 0x824e, 0x824f, 0x8250, 0xb1e3, /*0xb8-0xbf*/
+  0x8251, 0x8252, 0x8253, 0xb4d9, 0xb6ed, 0xd9b4, 0x8254, 0x8255, /*0xc0-0xc7*/
+  0x8256, 0x8257, 0xbfa1, 0x8258, 0x8259, 0x825a, 0xd9de, 0xc7ce, /*0xc8-0xcf*/
+  0xc0fe, 0xd9b8, 0x825b, 0x825c, 0x825d, 0x825e, 0x825f, 0xcbd7, /*0xd0-0xd7*/
+  0xb7fd, 0x8260, 0xd9b5, 0x8261, 0xd9b7, 0xb1a3, 0xd3e1, 0xd9b9, /*0xd8-0xdf*/
+  0x8262, 0xd0c5, 0x8263, 0xd9b6, 0x8264, 0x8265, 0xd9b1, 0x8266, /*0xe0-0xe7*/
+  0xd9b2, 0xc1a9, 0xd9b3, 0x8267, 0x8268, 0xbcf3, 0xd0de, 0xb8a9, /*0xe8-0xef*/
+  0x8269, 0xbee3, 0x826a, 0xd9bd, 0x826b, 0x826c, 0x826d, 0x826e, /*0xf0-0xf7*/
+  0xd9ba, 0x826f, 0xb0b3, 0x8270, 0x8271, 0x8272, 0xd9c2, 0x8273, /*0xf8-0xff*/
+  /* 0x5000 */
+  0x8274, 0x8275, 0x8276, 0x8277, 0x8278, 0x8279, 0x827a, 0x827b, /*0x00-0x07*/
+  0x827c, 0x827d, 0x827e, 0x8280, 0xd9c4, 0xb1b6, 0x8281, 0xd9bf, /*0x08-0x0f*/
+  0x8282, 0x8283, 0xb5b9, 0x8284, 0xbef3, 0x8285, 0x8286, 0x8287, /*0x10-0x17*/
+  0xccc8, 0xbaf2, 0xd2d0, 0x8288, 0xd9c3, 0x8289, 0x828a, 0xbde8, /*0x18-0x1f*/
+  0x828b, 0xb3ab, 0x828c, 0x828d, 0x828e, 0xd9c5, 0xbeeb, 0x828f, /*0x20-0x27*/
+  0xd9c6, 0xd9bb, 0xc4df, 0x8290, 0xd9be, 0xd9c1, 0xd9c0, 0x8291, /*0x28-0x2f*/
+  0x8292, 0x8293, 0x8294, 0x8295, 0x8296, 0x8297, 0x8298, 0x8299, /*0x30-0x37*/
+  0x829a, 0x829b, 0xd5ae, 0x829c, 0xd6b5, 0x829d, 0xc7e3, 0x829e, /*0x38-0x3f*/
+  0x829f, 0x82a0, 0x82a1, 0xd9c8, 0x82a2, 0x82a3, 0x82a4, 0xbcd9, /*0x40-0x47*/
+  0xd9ca, 0x82a5, 0x82a6, 0x82a7, 0xd9bc, 0x82a8, 0xd9cb, 0xc6ab, /*0x48-0x4f*/
+  0x82a9, 0x82aa, 0x82ab, 0x82ac, 0x82ad, 0xd9c9, 0x82ae, 0x82af, /*0x50-0x57*/
+  0x82b0, 0x82b1, 0xd7f6, 0x82b2, 0xcda3, 0x82b3, 0x82b4, 0x82b5, /*0x58-0x5f*/
+  0x82b6, 0x82b7, 0x82b8, 0x82b9, 0x82ba, 0xbda1, 0x82bb, 0x82bc, /*0x60-0x67*/
+  0x82bd, 0x82be, 0x82bf, 0x82c0, 0xd9cc, 0x82c1, 0x82c2, 0x82c3, /*0x68-0x6f*/
+  0x82c4, 0x82c5, 0x82c6, 0x82c7, 0x82c8, 0x82c9, 0xc5bc, 0xcdb5, /*0x70-0x77*/
+  0x82ca, 0x82cb, 0x82cc, 0xd9cd, 0x82cd, 0x82ce, 0xd9c7, 0xb3a5, /*0x78-0x7f*/
+  0xbffe, 0x82cf, 0x82d0, 0x82d1, 0x82d2, 0xb8b5, 0x82d3, 0x82d4, /*0x80-0x87*/
+  0xc0fc, 0x82d5, 0x82d6, 0x82d7, 0x82d8, 0xb0f8, 0x82d9, 0x82da, /*0x88-0x8f*/
+  0x82db, 0x82dc, 0x82dd, 0x82de, 0x82df, 0x82e0, 0x82e1, 0x82e2, /*0x90-0x97*/
+  0x82e3, 0x82e4, 0x82e5, 0x82e6, 0x82e7, 0x82e8, 0x82e9, 0x82ea, /*0x98-0x9f*/
+  0x82eb, 0x82ec, 0x82ed, 0xb4f6, 0x82ee, 0xd9ce, 0x82ef, 0xd9cf, /*0xa0-0xa7*/
+  0xb4a2, 0xd9d0, 0x82f0, 0x82f1, 0xb4df, 0x82f2, 0x82f3, 0x82f4, /*0xa8-0xaf*/
+  0x82f5, 0x82f6, 0xb0c1, 0x82f7, 0x82f8, 0x82f9, 0x82fa, 0x82fb, /*0xb0-0xb7*/
+  0x82fc, 0x82fd, 0xd9d1, 0xc9b5, 0x82fe, 0x8340, 0x8341, 0x8342, /*0xb8-0xbf*/
+  0x8343, 0x8344, 0x8345, 0x8346, 0x8347, 0x8348, 0x8349, 0x834a, /*0xc0-0xc7*/
+  0x834b, 0x834c, 0x834d, 0x834e, 0x834f, 0x8350, 0x8351, 0xcff1, /*0xc8-0xcf*/
+  0x8352, 0x8353, 0x8354, 0x8355, 0x8356, 0x8357, 0xd9d2, 0x8358, /*0xd0-0xd7*/
+  0x8359, 0x835a, 0xc1c5, 0x835b, 0x835c, 0x835d, 0x835e, 0x835f, /*0xd8-0xdf*/
+  0x8360, 0x8361, 0x8362, 0x8363, 0x8364, 0x8365, 0xd9d6, 0xc9ae, /*0xe0-0xe7*/
+  0x8366, 0x8367, 0x8368, 0x8369, 0xd9d5, 0xd9d4, 0xd9d7, 0x836a, /*0xe8-0xef*/
+  0x836b, 0x836c, 0x836d, 0xcbdb, 0x836e, 0xbda9, 0x836f, 0x8370, /*0xf0-0xf7*/
+  0x8371, 0x8372, 0x8373, 0xc6a7, 0x8374, 0x8375, 0x8376, 0x8377, /*0xf8-0xff*/
+  /* 0x5100 */
+  0x8378, 0x8379, 0x837a, 0x837b, 0x837c, 0x837d, 0xd9d3, 0xd9d8, /*0x00-0x07*/
+  0x837e, 0x8380, 0x8381, 0xd9d9, 0x8382, 0x8383, 0x8384, 0x8385, /*0x08-0x0f*/
+  0x8386, 0x8387, 0xc8e5, 0x8388, 0x8389, 0x838a, 0x838b, 0x838c, /*0x10-0x17*/
+  0x838d, 0x838e, 0x838f, 0x8390, 0x8391, 0x8392, 0x8393, 0x8394, /*0x18-0x1f*/
+  0x8395, 0xc0dc, 0x8396, 0x8397, 0x8398, 0x8399, 0x839a, 0x839b, /*0x20-0x27*/
+  0x839c, 0x839d, 0x839e, 0x839f, 0x83a0, 0x83a1, 0x83a2, 0x83a3, /*0x28-0x2f*/
+  0x83a4, 0x83a5, 0x83a6, 0x83a7, 0x83a8, 0x83a9, 0x83aa, 0x83ab, /*0x30-0x37*/
+  0x83ac, 0x83ad, 0x83ae, 0x83af, 0x83b0, 0x83b1, 0x83b2, 0xb6f9, /*0x38-0x3f*/
+  0xd8a3, 0xd4ca, 0x83b3, 0xd4aa, 0xd0d6, 0xb3e4, 0xd5d7, 0x83b4, /*0x40-0x47*/
+  0xcfc8, 0xb9e2, 0x83b5, 0xbfcb, 0x83b6, 0xc3e2, 0x83b7, 0x83b8, /*0x48-0x4f*/
+  0x83b9, 0xb6d2, 0x83ba, 0x83bb, 0xcdc3, 0xd9ee, 0xd9f0, 0x83bc, /*0x50-0x57*/
+  0x83bd, 0x83be, 0xb5b3, 0x83bf, 0xb6b5, 0x83c0, 0x83c1, 0x83c2, /*0x58-0x5f*/
+  0x83c3, 0x83c4, 0xbea4, 0x83c5, 0x83c6, 0xc8eb, 0x83c7, 0x83c8, /*0x60-0x67*/
+  0xc8ab, 0x83c9, 0x83ca, 0xb0cb, 0xb9ab, 0xc1f9, 0xd9e2, 0x83cb, /*0x68-0x6f*/
+  0xc0bc, 0xb9b2, 0x83cc, 0xb9d8, 0xd0cb, 0xb1f8, 0xc6e4, 0xbedf, /*0x70-0x77*/
+  0xb5e4, 0xd7c8, 0x83cd, 0xd1f8, 0xbce6, 0xcade, 0x83ce, 0x83cf, /*0x78-0x7f*/
+  0xbcbd, 0xd9e6, 0xd8e7, 0x83d0, 0x83d1, 0xc4da, 0x83d2, 0x83d3, /*0x80-0x87*/
+  0xb8d4, 0xc8bd, 0x83d4, 0x83d5, 0xb2e1, 0xd4d9, 0x83d6, 0x83d7, /*0x88-0x8f*/
+  0x83d8, 0x83d9, 0xc3b0, 0x83da, 0x83db, 0xc3e1, 0xdaa2, 0xc8df, /*0x90-0x97*/
+  0x83dc, 0xd0b4, 0x83dd, 0xbefc, 0xc5a9, 0x83de, 0x83df, 0x83e0, /*0x98-0x9f*/
+  0xb9da, 0x83e1, 0xdaa3, 0x83e2, 0xd4a9, 0xdaa4, 0x83e3, 0x83e4, /*0xa0-0xa7*/
+  0x83e5, 0x83e6, 0x83e7, 0xd9fb, 0xb6ac, 0x83e8, 0x83e9, 0xb7eb, /*0xa8-0xaf*/
+  0xb1f9, 0xd9fc, 0xb3e5, 0xbef6, 0x83ea, 0xbff6, 0xd2b1, 0xc0e4, /*0xb0-0xb7*/
+  0x83eb, 0x83ec, 0x83ed, 0xb6b3, 0xd9fe, 0xd9fd, 0x83ee, 0x83ef, /*0xb8-0xbf*/
+  0xbebb, 0x83f0, 0x83f1, 0x83f2, 0xc6e0, 0x83f3, 0xd7bc, 0xdaa1, /*0xc0-0xc7*/
+  0x83f4, 0xc1b9, 0x83f5, 0xb5f2, 0xc1e8, 0x83f6, 0x83f7, 0xbcf5, /*0xc8-0xcf*/
+  0x83f8, 0xb4d5, 0x83f9, 0x83fa, 0x83fb, 0x83fc, 0x83fd, 0x83fe, /*0xd0-0xd7*/
+  0x8440, 0x8441, 0x8442, 0xc1dd, 0x8443, 0xc4fd, 0x8444, 0x8445, /*0xd8-0xdf*/
+  0xbcb8, 0xb7b2, 0x8446, 0x8447, 0xb7ef, 0x8448, 0x8449, 0x844a, /*0xe0-0xe7*/
+  0x844b, 0x844c, 0x844d, 0xd9ec, 0x844e, 0xc6be, 0x844f, 0xbfad, /*0xe8-0xef*/
+  0xbbcb, 0x8450, 0x8451, 0xb5ca, 0x8452, 0xdbc9, 0xd0d7, 0x8453, /*0xf0-0xf7*/
+  0xcdb9, 0xb0bc, 0xb3f6, 0xbbf7, 0xdbca, 0xbaaf, 0x8454, 0xd4e4, /*0xf8-0xff*/
+  /* 0x5200 */
+  0xb5b6, 0xb5f3, 0xd8d6, 0xc8d0, 0x8455, 0x8456, 0xb7d6, 0xc7d0, /*0x00-0x07*/
+  0xd8d7, 0x8457, 0xbfaf, 0x8458, 0x8459, 0xdbbb, 0xd8d8, 0x845a, /*0x08-0x0f*/
+  0x845b, 0xd0cc, 0xbbae, 0x845c, 0x845d, 0x845e, 0xebbe, 0xc1d0, /*0x10-0x17*/
+  0xc1f5, 0xd4f2, 0xb8d5, 0xb4b4, 0x845f, 0xb3f5, 0x8460, 0x8461, /*0x18-0x1f*/
+  0xc9be, 0x8462, 0x8463, 0x8464, 0xc5d0, 0x8465, 0x8466, 0x8467, /*0x20-0x27*/
+  0xc5d9, 0xc0fb, 0x8468, 0xb1f0, 0x8469, 0xd8d9, 0xb9ce, 0x846a, /*0x28-0x2f*/
+  0xb5bd, 0x846b, 0x846c, 0xd8da, 0x846d, 0x846e, 0xd6c6, 0xcba2, /*0x30-0x37*/
+  0xc8af, 0xc9b2, 0xb4cc, 0xbfcc, 0x846f, 0xb9f4, 0x8470, 0xd8db, /*0x38-0x3f*/
+  0xd8dc, 0xb6e7, 0xbcc1, 0xccea, 0x8471, 0x8472, 0x8473, 0x8474, /*0x40-0x47*/
+  0x8475, 0x8476, 0xcff7, 0x8477, 0xd8dd, 0xc7b0, 0x8478, 0x8479, /*0x48-0x4f*/
+  0xb9d0, 0xbda3, 0x847a, 0x847b, 0xccde, 0x847c, 0xc6ca, 0x847d, /*0x50-0x57*/
+  0x847e, 0x8480, 0x8481, 0x8482, 0xd8e0, 0x8483, 0xd8de, 0x8484, /*0x58-0x5f*/
+  0x8485, 0xd8df, 0x8486, 0x8487, 0x8488, 0xb0fe, 0x8489, 0xbee7, /*0x60-0x67*/
+  0x848a, 0xcaa3, 0xbcf4, 0x848b, 0x848c, 0x848d, 0x848e, 0xb8b1, /*0x68-0x6f*/
+  0x848f, 0x8490, 0xb8ee, 0x8491, 0x8492, 0x8493, 0x8494, 0x8495, /*0x70-0x77*/
+  0x8496, 0x8497, 0x8498, 0x8499, 0x849a, 0xd8e2, 0x849b, 0xbdcb, /*0x78-0x7f*/
+  0x849c, 0xd8e4, 0xd8e3, 0x849d, 0x849e, 0x849f, 0x84a0, 0x84a1, /*0x80-0x87*/
+  0xc5fc, 0x84a2, 0x84a3, 0x84a4, 0x84a5, 0x84a6, 0x84a7, 0x84a8, /*0x88-0x8f*/
+  0xd8e5, 0x84a9, 0x84aa, 0xd8e6, 0x84ab, 0x84ac, 0x84ad, 0x84ae, /*0x90-0x97*/
+  0x84af, 0x84b0, 0x84b1, 0xc1a6, 0x84b2, 0xc8b0, 0xb0ec, 0xb9a6, /*0x98-0x9f*/
+  0xbcd3, 0xcef1, 0xdbbd, 0xc1d3, 0x84b3, 0x84b4, 0x84b5, 0x84b6, /*0xa0-0xa7*/
+  0xb6af, 0xd6fa, 0xc5ac, 0xbdd9, 0xdbbe, 0xdbbf, 0x84b7, 0x84b8, /*0xa8-0xaf*/
+  0x84b9, 0xc0f8, 0xbea2, 0xc0cd, 0x84ba, 0x84bb, 0x84bc, 0x84bd, /*0xb0-0xb7*/
+  0x84be, 0x84bf, 0x84c0, 0x84c1, 0x84c2, 0x84c3, 0xdbc0, 0xcac6, /*0xb8-0xbf*/
+  0x84c4, 0x84c5, 0x84c6, 0xb2aa, 0x84c7, 0x84c8, 0x84c9, 0xd3c2, /*0xc0-0xc7*/
+  0x84ca, 0xc3e3, 0x84cb, 0xd1ab, 0x84cc, 0x84cd, 0x84ce, 0x84cf, /*0xc8-0xcf*/
+  0xdbc2, 0x84d0, 0xc0d5, 0x84d1, 0x84d2, 0x84d3, 0xdbc3, 0x84d4, /*0xd0-0xd7*/
+  0xbfb1, 0x84d5, 0x84d6, 0x84d7, 0x84d8, 0x84d9, 0x84da, 0xc4bc, /*0xd8-0xdf*/
+  0x84db, 0x84dc, 0x84dd, 0x84de, 0xc7da, 0x84df, 0x84e0, 0x84e1, /*0xe0-0xe7*/
+  0x84e2, 0x84e3, 0x84e4, 0x84e5, 0x84e6, 0x84e7, 0x84e8, 0x84e9, /*0xe8-0xef*/
+  0xdbc4, 0x84ea, 0x84eb, 0x84ec, 0x84ed, 0x84ee, 0x84ef, 0x84f0, /*0xf0-0xf7*/
+  0x84f1, 0xd9e8, 0xc9d7, 0x84f2, 0x84f3, 0x84f4, 0xb9b4, 0xcef0, /*0xf8-0xff*/
+  /* 0x5300 */
+  0xd4c8, 0x84f5, 0x84f6, 0x84f7, 0x84f8, 0xb0fc, 0xb4d2, 0x84f9, /*0x00-0x07*/
+  0xd0d9, 0x84fa, 0x84fb, 0x84fc, 0x84fd, 0xd9e9, 0x84fe, 0xdecb, /*0x08-0x0f*/
+  0xd9eb, 0x8540, 0x8541, 0x8542, 0x8543, 0xd8b0, 0xbbaf, 0xb1b1, /*0x10-0x17*/
+  0x8544, 0xb3d7, 0xd8ce, 0x8545, 0x8546, 0xd4d1, 0x8547, 0x8548, /*0x18-0x1f*/
+  0xbdb3, 0xbfef, 0x8549, 0xcfbb, 0x854a, 0x854b, 0xd8d0, 0x854c, /*0x20-0x27*/
+  0x854d, 0x854e, 0xb7cb, 0x854f, 0x8550, 0x8551, 0xd8d1, 0x8552, /*0x28-0x2f*/
+  0x8553, 0x8554, 0x8555, 0x8556, 0x8557, 0x8558, 0x8559, 0x855a, /*0x30-0x37*/
+  0x855b, 0xc6a5, 0xc7f8, 0xd2bd, 0x855c, 0x855d, 0xd8d2, 0xc4e4, /*0x38-0x3f*/
+  0x855e, 0xcaae, 0x855f, 0xc7a7, 0x8560, 0xd8a6, 0x8561, 0xc9fd, /*0x40-0x47*/
+  0xcee7, 0xbbdc, 0xb0eb, 0x8562, 0x8563, 0x8564, 0xbbaa, 0xd0ad, /*0x48-0x4f*/
+  0x8565, 0xb1b0, 0xd7e4, 0xd7bf, 0x8566, 0xb5a5, 0xc2f4, 0xc4cf, /*0x50-0x57*/
+  0x8567, 0x8568, 0xb2a9, 0x8569, 0xb2b7, 0x856a, 0xb1e5, 0xdfb2, /*0x58-0x5f*/
+  0xd5bc, 0xbfa8, 0xc2ac, 0xd8d5, 0xc2b1, 0x856b, 0xd8d4, 0xced4, /*0x60-0x67*/
+  0x856c, 0xdae0, 0x856d, 0xcec0, 0x856e, 0x856f, 0xd8b4, 0xc3ae, /*0x68-0x6f*/
+  0xd3a1, 0xcea3, 0x8570, 0xbcb4, 0xc8b4, 0xc2d1, 0x8571, 0xbeed, /*0x70-0x77*/
+  0xd0b6, 0x8572, 0xdae1, 0x8573, 0x8574, 0x8575, 0x8576, 0xc7e4, /*0x78-0x7f*/
+  0x8577, 0x8578, 0xb3a7, 0x8579, 0xb6f2, 0xccfc, 0xc0fa, 0x857a, /*0x80-0x87*/
+  0x857b, 0xc0f7, 0x857c, 0xd1b9, 0xd1e1, 0xd8c7, 0x857d, 0x857e, /*0x88-0x8f*/
+  0x8580, 0x8581, 0x8582, 0x8583, 0x8584, 0xb2de, 0x8585, 0x8586, /*0x90-0x97*/
+  0xc0e5, 0x8587, 0xbaf1, 0x8588, 0x8589, 0xd8c8, 0x858a, 0xd4ad, /*0x98-0x9f*/
+  0x858b, 0x858c, 0xcfe1, 0xd8c9, 0x858d, 0xd8ca, 0xcfc3, 0x858e, /*0xa0-0xa7*/
+  0xb3f8, 0xbec7, 0x858f, 0x8590, 0x8591, 0x8592, 0xd8cb, 0x8593, /*0xa8-0xaf*/
+  0x8594, 0x8595, 0x8596, 0x8597, 0x8598, 0x8599, 0xdbcc, 0x859a, /*0xb0-0xb7*/
+  0x859b, 0x859c, 0x859d, 0xc8a5, 0x859e, 0x859f, 0x85a0, 0xcfd8, /*0xb8-0xbf*/
+  0x85a1, 0xc8fe, 0xb2ce, 0x85a2, 0x85a3, 0x85a4, 0x85a5, 0x85a6, /*0xc0-0xc7*/
+  0xd3d6, 0xb2e6, 0xbcb0, 0xd3d1, 0xcbab, 0xb7b4, 0x85a7, 0x85a8, /*0xc8-0xcf*/
+  0x85a9, 0xb7a2, 0x85aa, 0x85ab, 0xcae5, 0x85ac, 0xc8a1, 0xcadc, /*0xd0-0xd7*/
+  0xb1e4, 0xd0f0, 0x85ad, 0xc5d1, 0x85ae, 0x85af, 0x85b0, 0xdbc5, /*0xd8-0xdf*/
+  0xb5fe, 0x85b1, 0x85b2, 0xbfda, 0xb9c5, 0xbee4, 0xc1ed, 0x85b3, /*0xe0-0xe7*/
+  0xdfb6, 0xdfb5, 0xd6bb, 0xbdd0, 0xd5d9, 0xb0c8, 0xb6a3, 0xbfc9, /*0xe8-0xef*/
+  0xcca8, 0xdfb3, 0xcab7, 0xd3d2, 0x85b4, 0xd8cf, 0xd2b6, 0xbac5, /*0xf0-0xf7*/
+  0xcbbe, 0xccbe, 0x85b5, 0xdfb7, 0xb5f0, 0xdfb4, 0x85b6, 0x85b7, /*0xf8-0xff*/
+  /* 0x5400 */
+  0x85b8, 0xd3f5, 0x85b9, 0xb3d4, 0xb8f7, 0x85ba, 0xdfba, 0x85bb, /*0x00-0x07*/
+  0xbacf, 0xbcaa, 0xb5f5, 0x85bc, 0xcdac, 0xc3fb, 0xbaf3, 0xc0f4, /*0x08-0x0f*/
+  0xcdc2, 0xcff2, 0xdfb8, 0xcfc5, 0x85bd, 0xc2c0, 0xdfb9, 0xc2f0, /*0x10-0x17*/
+  0x85be, 0x85bf, 0x85c0, 0xbefd, 0x85c1, 0xc1df, 0xcdcc, 0xd2f7, /*0x18-0x1f*/
+  0xb7cd, 0xdfc1, 0x85c2, 0xdfc4, 0x85c3, 0x85c4, 0xb7f1, 0xb0c9, /*0x20-0x27*/
+  0xb6d6, 0xb7d4, 0x85c5, 0xbaac, 0xccfd, 0xbfd4, 0xcbb1, 0xc6f4, /*0x28-0x2f*/
+  0x85c6, 0xd6a8, 0xdfc5, 0x85c7, 0xcee2, 0xb3b3, 0x85c8, 0x85c9, /*0x30-0x37*/
+  0xcefc, 0xb4b5, 0x85ca, 0xcec7, 0xbaf0, 0x85cb, 0xcee1, 0x85cc, /*0x38-0x3f*/
+  0xd1bd, 0x85cd, 0x85ce, 0xdfc0, 0x85cf, 0x85d0, 0xb4f4, 0x85d1, /*0x40-0x47*/
+  0xb3ca, 0x85d2, 0xb8e6, 0xdfbb, 0x85d3, 0x85d4, 0x85d5, 0x85d6, /*0x48-0x4f*/
+  0xc4c5, 0x85d7, 0xdfbc, 0xdfbd, 0xdfbe, 0xc5bb, 0xdfbf, 0xdfc2, /*0x50-0x57*/
+  0xd4b1, 0xdfc3, 0x85d8, 0xc7ba, 0xced8, 0x85d9, 0x85da, 0x85db, /*0x58-0x5f*/
+  0x85dc, 0x85dd, 0xc4d8, 0x85de, 0xdfca, 0x85df, 0xdfcf, 0x85e0, /*0x60-0x67*/
+  0xd6dc, 0x85e1, 0x85e2, 0x85e3, 0x85e4, 0x85e5, 0x85e6, 0x85e7, /*0x68-0x6f*/
+  0x85e8, 0xdfc9, 0xdfda, 0xceb6, 0x85e9, 0xbac7, 0xdfce, 0xdfc8, /*0x70-0x77*/
+  0xc5de, 0x85ea, 0x85eb, 0xc9eb, 0xbaf4, 0xc3fc, 0x85ec, 0x85ed, /*0x78-0x7f*/
+  0xbed7, 0x85ee, 0xdfc6, 0x85ef, 0xdfcd, 0x85f0, 0xc5d8, 0x85f1, /*0x80-0x87*/
+  0x85f2, 0x85f3, 0x85f4, 0xd5a6, 0xbacd, 0x85f5, 0xbecc, 0xd3bd, /*0x88-0x8f*/
+  0xb8c0, 0x85f6, 0xd6e4, 0x85f7, 0xdfc7, 0xb9be, 0xbfa7, 0x85f8, /*0x90-0x97*/
+  0x85f9, 0xc1fc, 0xdfcb, 0xdfcc, 0x85fa, 0xdfd0, 0x85fb, 0x85fc, /*0x98-0x9f*/
+  0x85fd, 0x85fe, 0x8640, 0xdfdb, 0xdfe5, 0x8641, 0xdfd7, 0xdfd6, /*0xa0-0xa7*/
+  0xd7c9, 0xdfe3, 0xdfe4, 0xe5eb, 0xd2a7, 0xdfd2, 0x8642, 0xbfa9, /*0xa8-0xaf*/
+  0x8643, 0xd4db, 0x8644, 0xbfc8, 0xdfd4, 0x8645, 0x8646, 0x8647, /*0xb0-0xb7*/
+  0xcfcc, 0x8648, 0x8649, 0xdfdd, 0x864a, 0xd1ca, 0x864b, 0xdfde, /*0xb8-0xbf*/
+  0xb0a7, 0xc6b7, 0xdfd3, 0x864c, 0xbae5, 0x864d, 0xb6df, 0xcddb, /*0xc0-0xc7*/
+  0xb9fe, 0xd4d5, 0x864e, 0x864f, 0xdfdf, 0xcfec, 0xb0a5, 0xdfe7, /*0xc8-0xcf*/
+  0xdfd1, 0xd1c6, 0xdfd5, 0xdfd8, 0xdfd9, 0xdfdc, 0x8650, 0xbba9, /*0xd0-0xd7*/
+  0x8651, 0xdfe0, 0xdfe1, 0x8652, 0xdfe2, 0xdfe6, 0xdfe8, 0xd3b4, /*0xd8-0xdf*/
+  0x8653, 0x8654, 0x8655, 0x8656, 0x8657, 0xb8e7, 0xc5b6, 0xdfea, /*0xe0-0xe7*/
+  0xc9da, 0xc1a8, 0xc4c4, 0x8658, 0x8659, 0xbfde, 0xcff8, 0x865a, /*0xe8-0xef*/
+  0x865b, 0x865c, 0xd5dc, 0xdfee, 0x865d, 0x865e, 0x865f, 0x8660, /*0xf0-0xf7*/
+  0x8661, 0x8662, 0xb2b8, 0x8663, 0xbadf, 0xdfec, 0x8664, 0xdbc1, /*0xf8-0xff*/
+  /* 0x5500 */
+  0x8665, 0xd1e4, 0x8666, 0x8667, 0x8668, 0x8669, 0xcbf4, 0xb4bd, /*0x00-0x07*/
+  0x866a, 0xb0a6, 0x866b, 0x866c, 0x866d, 0x866e, 0x866f, 0xdff1, /*0x08-0x0f*/
+  0xccc6, 0xdff2, 0x8670, 0x8671, 0xdfed, 0x8672, 0x8673, 0x8674, /*0x10-0x17*/
+  0x8675, 0x8676, 0x8677, 0xdfe9, 0x8678, 0x8679, 0x867a, 0x867b, /*0x18-0x1f*/
+  0xdfeb, 0x867c, 0xdfef, 0xdff0, 0xbbbd, 0x867d, 0x867e, 0xdff3, /*0x20-0x27*/
+  0x8680, 0x8681, 0xdff4, 0x8682, 0xbba3, 0x8683, 0xcadb, 0xcea8, /*0x28-0x2f*/
+  0xe0a7, 0xb3aa, 0x8684, 0xe0a6, 0x8685, 0x8686, 0x8687, 0xe0a1, /*0x30-0x37*/
+  0x8688, 0x8689, 0x868a, 0x868b, 0xdffe, 0x868c, 0xcdd9, 0xdffc, /*0x38-0x3f*/
+  0x868d, 0xdffa, 0x868e, 0xbfd0, 0xd7c4, 0x868f, 0xc9cc, 0x8690, /*0x40-0x47*/
+  0x8691, 0xdff8, 0xb0a1, 0x8692, 0x8693, 0x8694, 0x8695, 0x8696, /*0x48-0x4f*/
+  0xdffd, 0x8697, 0x8698, 0x8699, 0x869a, 0xdffb, 0xe0a2, 0x869b, /*0x50-0x57*/
+  0x869c, 0x869d, 0x869e, 0x869f, 0xe0a8, 0x86a0, 0x86a1, 0x86a2, /*0x58-0x5f*/
+  0x86a3, 0xb7c8, 0x86a4, 0x86a5, 0xc6a1, 0xc9b6, 0xc0b2, 0xdff5, /*0x60-0x67*/
+  0x86a6, 0x86a7, 0xc5be, 0x86a8, 0xd8c4, 0xdff9, 0xc4f6, 0x86a9, /*0x68-0x6f*/
+  0x86aa, 0x86ab, 0x86ac, 0x86ad, 0x86ae, 0xe0a3, 0xe0a4, 0xe0a5, /*0x70-0x77*/
+  0xd0a5, 0x86af, 0x86b0, 0xe0b4, 0xcce4, 0x86b1, 0xe0b1, 0x86b2, /*0x78-0x7f*/
+  0xbfa6, 0xe0af, 0xceb9, 0xe0ab, 0xc9c6, 0x86b3, 0x86b4, 0xc0ae, /*0x80-0x87*/
+  0xe0ae, 0xbaed, 0xbab0, 0xe0a9, 0x86b5, 0x86b6, 0x86b7, 0xdff6, /*0x88-0x8f*/
+  0x86b8, 0xe0b3, 0x86b9, 0x86ba, 0xe0b8, 0x86bb, 0x86bc, 0x86bd, /*0x90-0x97*/
+  0xb4ad, 0xe0b9, 0x86be, 0x86bf, 0xcfb2, 0xbac8, 0x86c0, 0xe0b0, /*0x98-0x9f*/
+  0x86c1, 0x86c2, 0x86c3, 0x86c4, 0x86c5, 0x86c6, 0x86c7, 0xd0fa, /*0xa0-0xa7*/
+  0x86c8, 0x86c9, 0x86ca, 0x86cb, 0x86cc, 0x86cd, 0x86ce, 0x86cf, /*0xa8-0xaf*/
+  0x86d0, 0xe0ac, 0x86d1, 0xd4fb, 0x86d2, 0xdff7, 0x86d3, 0xc5e7, /*0xb0-0xb7*/
+  0x86d4, 0xe0ad, 0x86d5, 0xd3f7, 0x86d6, 0xe0b6, 0xe0b7, 0x86d7, /*0xb8-0xbf*/
+  0x86d8, 0x86d9, 0x86da, 0x86db, 0xe0c4, 0xd0e1, 0x86dc, 0x86dd, /*0xc0-0xc7*/
+  0x86de, 0xe0bc, 0x86df, 0x86e0, 0xe0c9, 0xe0ca, 0x86e1, 0x86e2, /*0xc8-0xcf*/
+  0x86e3, 0xe0be, 0xe0aa, 0xc9a4, 0xe0c1, 0x86e4, 0xe0b2, 0x86e5, /*0xd0-0xd7*/
+  0x86e6, 0x86e7, 0x86e8, 0x86e9, 0xcac8, 0xe0c3, 0x86ea, 0xe0b5, /*0xd8-0xdf*/
+  0x86eb, 0xcecb, 0x86ec, 0xcbc3, 0xe0cd, 0xe0c6, 0xe0c2, 0x86ed, /*0xe0-0xe7*/
+  0xe0cb, 0x86ee, 0xe0ba, 0xe0bf, 0xe0c0, 0x86ef, 0x86f0, 0xe0c5, /*0xe8-0xef*/
+  0x86f1, 0x86f2, 0xe0c7, 0xe0c8, 0x86f3, 0xe0cc, 0x86f4, 0xe0bb, /*0xf0-0xf7*/
+  0x86f5, 0x86f6, 0x86f7, 0x86f8, 0x86f9, 0xcbd4, 0xe0d5, 0x86fa, /*0xf8-0xff*/
+  /* 0x5600 */
+  0xe0d6, 0xe0d2, 0x86fb, 0x86fc, 0x86fd, 0x86fe, 0x8740, 0x8741, /*0x00-0x07*/
+  0xe0d0, 0xbcce, 0x8742, 0x8743, 0xe0d1, 0x8744, 0xb8c2, 0xd8c5, /*0x08-0x0f*/
+  0x8745, 0x8746, 0x8747, 0x8748, 0x8749, 0x874a, 0x874b, 0x874c, /*0x10-0x17*/
+  0xd0ea, 0x874d, 0x874e, 0xc2ef, 0x874f, 0x8750, 0xe0cf, 0xe0bd, /*0x18-0x1f*/
+  0x8751, 0x8752, 0x8753, 0xe0d4, 0xe0d3, 0x8754, 0x8755, 0xe0d7, /*0x20-0x27*/
+  0x8756, 0x8757, 0x8758, 0x8759, 0xe0dc, 0xe0d8, 0x875a, 0x875b, /*0x28-0x2f*/
+  0x875c, 0xd6f6, 0xb3b0, 0x875d, 0xd7ec, 0x875e, 0xcbbb, 0x875f, /*0x30-0x37*/
+  0x8760, 0xe0da, 0x8761, 0xcefb, 0x8762, 0x8763, 0x8764, 0xbad9, /*0x38-0x3f*/
+  0x8765, 0x8766, 0x8767, 0x8768, 0x8769, 0x876a, 0x876b, 0x876c, /*0x40-0x47*/
+  0x876d, 0x876e, 0x876f, 0x8770, 0xe0e1, 0xe0dd, 0xd2ad, 0x8771, /*0x48-0x4f*/
+  0x8772, 0x8773, 0x8774, 0x8775, 0xe0e2, 0x8776, 0x8777, 0xe0db, /*0x50-0x57*/
+  0xe0d9, 0xe0df, 0x8778, 0x8779, 0xe0e0, 0x877a, 0x877b, 0x877c, /*0x58-0x5f*/
+  0x877d, 0x877e, 0xe0de, 0x8780, 0xe0e4, 0x8781, 0x8782, 0x8783, /*0x60-0x67*/
+  0xc6f7, 0xd8ac, 0xd4eb, 0xe0e6, 0xcac9, 0x8784, 0x8785, 0x8786, /*0x68-0x6f*/
+  0x8787, 0xe0e5, 0x8788, 0x8789, 0x878a, 0x878b, 0xb8c1, 0x878c, /*0x70-0x77*/
+  0x878d, 0x878e, 0x878f, 0xe0e7, 0xe0e8, 0x8790, 0x8791, 0x8792, /*0x78-0x7f*/
+  0x8793, 0x8794, 0x8795, 0x8796, 0x8797, 0xe0e9, 0xe0e3, 0x8798, /*0x80-0x87*/
+  0x8799, 0x879a, 0x879b, 0x879c, 0x879d, 0x879e, 0xbabf, 0xcce7, /*0x88-0x8f*/
+  0x879f, 0x87a0, 0x87a1, 0xe0ea, 0x87a2, 0x87a3, 0x87a4, 0x87a5, /*0x90-0x97*/
+  0x87a6, 0x87a7, 0x87a8, 0x87a9, 0x87aa, 0x87ab, 0x87ac, 0x87ad, /*0x98-0x9f*/
+  0x87ae, 0x87af, 0x87b0, 0xcff9, 0x87b1, 0x87b2, 0x87b3, 0x87b4, /*0xa0-0xa7*/
+  0x87b5, 0x87b6, 0x87b7, 0x87b8, 0x87b9, 0x87ba, 0x87bb, 0xe0eb, /*0xa8-0xaf*/
+  0x87bc, 0x87bd, 0x87be, 0x87bf, 0x87c0, 0x87c1, 0x87c2, 0xc8c2, /*0xb0-0xb7*/
+  0x87c3, 0x87c4, 0x87c5, 0x87c6, 0xbdc0, 0x87c7, 0x87c8, 0x87c9, /*0xb8-0xbf*/
+  0x87ca, 0x87cb, 0x87cc, 0x87cd, 0x87ce, 0x87cf, 0x87d0, 0x87d1, /*0xc0-0xc7*/
+  0x87d2, 0x87d3, 0xc4d2, 0x87d4, 0x87d5, 0x87d6, 0x87d7, 0x87d8, /*0xc8-0xcf*/
+  0x87d9, 0x87da, 0x87db, 0x87dc, 0xe0ec, 0x87dd, 0x87de, 0xe0ed, /*0xd0-0xd7*/
+  0x87df, 0x87e0, 0xc7f4, 0xcbc4, 0x87e1, 0xe0ee, 0xbbd8, 0xd8b6, /*0xd8-0xdf*/
+  0xd2f2, 0xe0ef, 0xcdc5, 0x87e2, 0xb6da, 0x87e3, 0x87e4, 0x87e5, /*0xe0-0xe7*/
+  0x87e6, 0x87e7, 0x87e8, 0xe0f1, 0x87e9, 0xd4b0, 0x87ea, 0x87eb, /*0xe8-0xef*/
+  0xc0a7, 0xb4d1, 0x87ec, 0x87ed, 0xcea7, 0xe0f0, 0x87ee, 0x87ef, /*0xf0-0xf7*/
+  0x87f0, 0xe0f2, 0xb9cc, 0x87f1, 0x87f2, 0xb9fa, 0xcdbc, 0xe0f3, /*0xf8-0xff*/
+  /* 0x5700 */
+  0x87f3, 0x87f4, 0x87f5, 0xc6d4, 0xe0f4, 0x87f6, 0xd4b2, 0x87f7, /*0x00-0x07*/
+  0xc8a6, 0xe0f6, 0xe0f5, 0x87f8, 0x87f9, 0x87fa, 0x87fb, 0x87fc, /*0x08-0x0f*/
+  0x87fd, 0x87fe, 0x8840, 0x8841, 0x8842, 0x8843, 0x8844, 0x8845, /*0x10-0x17*/
+  0x8846, 0x8847, 0x8848, 0x8849, 0xe0f7, 0x884a, 0x884b, 0xcdc1, /*0x18-0x1f*/
+  0x884c, 0x884d, 0x884e, 0xcaa5, 0x884f, 0x8850, 0x8851, 0x8852, /*0x20-0x27*/
+  0xd4da, 0xdbd7, 0xdbd9, 0x8853, 0xdbd8, 0xb9e7, 0xdbdc, 0xdbdd, /*0x28-0x2f*/
+  0xb5d8, 0x8854, 0x8855, 0xdbda, 0x8856, 0x8857, 0x8858, 0x8859, /*0x30-0x37*/
+  0x885a, 0xdbdb, 0xb3a1, 0xdbdf, 0x885b, 0x885c, 0xbbf8, 0x885d, /*0x38-0x3f*/
+  0xd6b7, 0x885e, 0xdbe0, 0x885f, 0x8860, 0x8861, 0x8862, 0xbef9, /*0x40-0x47*/
+  0x8863, 0x8864, 0xb7bb, 0x8865, 0xdbd0, 0xccae, 0xbfb2, 0xbbb5, /*0x48-0x4f*/
+  0xd7f8, 0xbfd3, 0x8866, 0x8867, 0x8868, 0x8869, 0x886a, 0xbfe9, /*0x50-0x57*/
+  0x886b, 0x886c, 0xbce1, 0xccb3, 0xdbde, 0xb0d3, 0xceeb, 0xb7d8, /*0x58-0x5f*/
+  0xd7b9, 0xc6c2, 0x886d, 0x886e, 0xc0a4, 0x886f, 0xccb9, 0x8870, /*0x60-0x67*/
+  0xdbe7, 0xdbe1, 0xc6ba, 0xdbe3, 0x8871, 0xdbe8, 0x8872, 0xc5f7, /*0x68-0x6f*/
+  0x8873, 0x8874, 0x8875, 0xdbea, 0x8876, 0x8877, 0xdbe9, 0xbfc0, /*0x70-0x77*/
+  0x8878, 0x8879, 0x887a, 0xdbe6, 0xdbe5, 0x887b, 0x887c, 0x887d, /*0x78-0x7f*/
+  0x887e, 0x8880, 0xb4b9, 0xc0ac, 0xc2a2, 0xdbe2, 0xdbe4, 0x8881, /*0x80-0x87*/
+  0x8882, 0x8883, 0x8884, 0xd0cd, 0xdbed, 0x8885, 0x8886, 0x8887, /*0x88-0x8f*/
+  0x8888, 0x8889, 0xc0dd, 0xdbf2, 0x888a, 0x888b, 0x888c, 0x888d, /*0x90-0x97*/
+  0x888e, 0x888f, 0x8890, 0xb6e2, 0x8891, 0x8892, 0x8893, 0x8894, /*0x98-0x9f*/
+  0xdbf3, 0xdbd2, 0xb9b8, 0xd4ab, 0xdbec, 0x8895, 0xbfd1, 0xdbf0, /*0xa0-0xa7*/
+  0x8896, 0xdbd1, 0x8897, 0xb5e6, 0x8898, 0xdbeb, 0xbfe5, 0x8899, /*0xa8-0xaf*/
+  0x889a, 0x889b, 0xdbee, 0x889c, 0xdbf1, 0x889d, 0x889e, 0x889f, /*0xb0-0xb7*/
+  0xdbf9, 0x88a0, 0x88a1, 0x88a2, 0x88a3, 0x88a4, 0x88a5, 0x88a6, /*0xb8-0xbf*/
+  0x88a7, 0x88a8, 0xb9a1, 0xb0a3, 0x88a9, 0x88aa, 0x88ab, 0x88ac, /*0xc0-0xc7*/
+  0x88ad, 0x88ae, 0x88af, 0xc2f1, 0x88b0, 0x88b1, 0xb3c7, 0xdbef, /*0xc8-0xcf*/
+  0x88b2, 0x88b3, 0xdbf8, 0x88b4, 0xc6d2, 0xdbf4, 0x88b5, 0x88b6, /*0xd0-0xd7*/
+  0xdbf5, 0xdbf7, 0xdbf6, 0x88b7, 0x88b8, 0xdbfe, 0x88b9, 0xd3f2, /*0xd8-0xdf*/
+  0xb2ba, 0x88ba, 0x88bb, 0x88bc, 0xdbfd, 0x88bd, 0x88be, 0x88bf, /*0xe0-0xe7*/
+  0x88c0, 0x88c1, 0x88c2, 0x88c3, 0x88c4, 0xdca4, 0x88c5, 0xdbfb, /*0xe8-0xef*/
+  0x88c6, 0x88c7, 0x88c8, 0x88c9, 0xdbfa, 0x88ca, 0x88cb, 0x88cc, /*0xf0-0xf7*/
+  0xdbfc, 0xc5e0, 0xbbf9, 0x88cd, 0x88ce, 0xdca3, 0x88cf, 0x88d0, /*0xf8-0xff*/
+  /* 0x5800 */
+  0xdca5, 0x88d1, 0xccc3, 0x88d2, 0x88d3, 0x88d4, 0xb6d1, 0xddc0, /*0x00-0x07*/
+  0x88d5, 0x88d6, 0x88d7, 0xdca1, 0x88d8, 0xdca2, 0x88d9, 0x88da, /*0x08-0x0f*/
+  0x88db, 0xc7b5, 0x88dc, 0x88dd, 0x88de, 0xb6e9, 0x88df, 0x88e0, /*0x10-0x17*/
+  0x88e1, 0xdca7, 0x88e2, 0x88e3, 0x88e4, 0x88e5, 0xdca6, 0x88e6, /*0x18-0x1f*/
+  0xdca9, 0xb1a4, 0x88e7, 0x88e8, 0xb5cc, 0x88e9, 0x88ea, 0x88eb, /*0x20-0x27*/
+  0x88ec, 0x88ed, 0xbfb0, 0x88ee, 0x88ef, 0x88f0, 0x88f1, 0x88f2, /*0x28-0x2f*/
+  0xd1df, 0x88f3, 0x88f4, 0x88f5, 0x88f6, 0xb6c2, 0x88f7, 0x88f8, /*0x30-0x37*/
+  0x88f9, 0x88fa, 0x88fb, 0x88fc, 0x88fd, 0x88fe, 0x8940, 0x8941, /*0x38-0x3f*/
+  0x8942, 0x8943, 0x8944, 0x8945, 0xdca8, 0x8946, 0x8947, 0x8948, /*0x40-0x47*/
+  0x8949, 0x894a, 0x894b, 0x894c, 0xcbfa, 0xebf3, 0x894d, 0x894e, /*0x48-0x4f*/
+  0x894f, 0xcbdc, 0x8950, 0x8951, 0xcbfe, 0x8952, 0x8953, 0x8954, /*0x50-0x57*/
+  0xccc1, 0x8955, 0x8956, 0x8957, 0x8958, 0x8959, 0xc8fb, 0x895a, /*0x58-0x5f*/
+  0x895b, 0x895c, 0x895d, 0x895e, 0x895f, 0xdcaa, 0x8960, 0x8961, /*0x60-0x67*/
+  0x8962, 0x8963, 0x8964, 0xccee, 0xdcab, 0x8965, 0x8966, 0x8967, /*0x68-0x6f*/
+  0x8968, 0x8969, 0x896a, 0x896b, 0x896c, 0x896d, 0x896e, 0x896f, /*0x70-0x77*/
+  0x8970, 0x8971, 0x8972, 0x8973, 0x8974, 0x8975, 0xdbd3, 0x8976, /*0x78-0x7f*/
+  0xdcaf, 0xdcac, 0x8977, 0xbeb3, 0x8978, 0xcafb, 0x8979, 0x897a, /*0x80-0x87*/
+  0x897b, 0xdcad, 0x897c, 0x897d, 0x897e, 0x8980, 0x8981, 0x8982, /*0x88-0x8f*/
+  0x8983, 0x8984, 0xc9ca, 0xc4b9, 0x8985, 0x8986, 0x8987, 0x8988, /*0x90-0x97*/
+  0x8989, 0xc7bd, 0xdcae, 0x898a, 0x898b, 0x898c, 0xd4f6, 0xd0e6, /*0x98-0x9f*/
+  0x898d, 0x898e, 0x898f, 0x8990, 0x8991, 0x8992, 0x8993, 0x8994, /*0xa0-0xa7*/
+  0xc4ab, 0xb6d5, 0x8995, 0x8996, 0x8997, 0x8998, 0x8999, 0x899a, /*0xa8-0xaf*/
+  0x899b, 0x899c, 0x899d, 0x899e, 0x899f, 0x89a0, 0x89a1, 0x89a2, /*0xb0-0xb7*/
+  0x89a3, 0x89a4, 0x89a5, 0x89a6, 0xdbd4, 0x89a7, 0x89a8, 0x89a9, /*0xb8-0xbf*/
+  0x89aa, 0xb1da, 0x89ab, 0x89ac, 0x89ad, 0xdbd5, 0x89ae, 0x89af, /*0xc0-0xc7*/
+  0x89b0, 0x89b1, 0x89b2, 0x89b3, 0x89b4, 0x89b5, 0x89b6, 0x89b7, /*0xc8-0xcf*/
+  0x89b8, 0xdbd6, 0x89b9, 0x89ba, 0x89bb, 0xbabe, 0x89bc, 0x89bd, /*0xd0-0xd7*/
+  0x89be, 0x89bf, 0x89c0, 0x89c1, 0x89c2, 0x89c3, 0x89c4, 0x89c5, /*0xd8-0xdf*/
+  0x89c6, 0x89c7, 0x89c8, 0x89c9, 0xc8c0, 0x89ca, 0x89cb, 0x89cc, /*0xe0-0xe7*/
+  0x89cd, 0x89ce, 0x89cf, 0xcabf, 0xc8c9, 0x89d0, 0xd7b3, 0x89d1, /*0xe8-0xef*/
+  0xc9f9, 0x89d2, 0x89d3, 0xbfc7, 0x89d4, 0x89d5, 0xbaf8, 0x89d6, /*0xf0-0xf7*/
+  0x89d7, 0xd2bc, 0x89d8, 0x89d9, 0x89da, 0x89db, 0x89dc, 0x89dd, /*0xf8-0xff*/
+  /* 0x5900 */
+  0x89de, 0x89df, 0xe2ba, 0x89e0, 0xb4a6, 0x89e1, 0x89e2, 0xb1b8, /*0x00-0x07*/
+  0x89e3, 0x89e4, 0x89e5, 0x89e6, 0x89e7, 0xb8b4, 0x89e8, 0xcfc4, /*0x08-0x0f*/
+  0x89e9, 0x89ea, 0x89eb, 0x89ec, 0xd9e7, 0xcfa6, 0xcde2, 0x89ed, /*0x10-0x17*/
+  0x89ee, 0xd9ed, 0xb6e0, 0x89ef, 0xd2b9, 0x89f0, 0x89f1, 0xb9bb, /*0x18-0x1f*/
+  0x89f2, 0x89f3, 0x89f4, 0x89f5, 0xe2b9, 0xe2b7, 0x89f6, 0xb4f3, /*0x20-0x27*/
+  0x89f7, 0xccec, 0xccab, 0xb7f2, 0x89f8, 0xd8b2, 0xd1eb, 0xbabb, /*0x28-0x2f*/
+  0x89f9, 0xcaa7, 0x89fa, 0x89fb, 0xcdb7, 0x89fc, 0x89fd, 0xd2c4, /*0x30-0x37*/
+  0xbfe4, 0xbcd0, 0xb6e1, 0x89fe, 0xdec5, 0x8a40, 0x8a41, 0x8a42, /*0x38-0x3f*/
+  0x8a43, 0xdec6, 0xdbbc, 0x8a44, 0xd1d9, 0x8a45, 0x8a46, 0xc6e6, /*0x40-0x47*/
+  0xc4ce, 0xb7ee, 0x8a47, 0xb7dc, 0x8a48, 0x8a49, 0xbffc, 0xd7e0, /*0x48-0x4f*/
+  0x8a4a, 0xc6f5, 0x8a4b, 0x8a4c, 0xb1bc, 0xdec8, 0xbdb1, 0xccd7, /*0x50-0x57*/
+  0xdeca, 0x8a4d, 0xdec9, 0x8a4e, 0x8a4f, 0x8a50, 0x8a51, 0x8a52, /*0x58-0x5f*/
+  0xb5ec, 0x8a53, 0xc9dd, 0x8a54, 0x8a55, 0xb0c2, 0x8a56, 0x8a57, /*0x60-0x67*/
+  0x8a58, 0x8a59, 0x8a5a, 0x8a5b, 0x8a5c, 0x8a5d, 0x8a5e, 0x8a5f, /*0x68-0x6f*/
+  0x8a60, 0x8a61, 0x8a62, 0xc5ae, 0xc5ab, 0x8a63, 0xc4cc, 0x8a64, /*0x70-0x77*/
+  0xbce9, 0xcbfd, 0x8a65, 0x8a66, 0x8a67, 0xbac3, 0x8a68, 0x8a69, /*0x78-0x7f*/
+  0x8a6a, 0xe5f9, 0xc8e7, 0xe5fa, 0xcdfd, 0x8a6b, 0xd7b1, 0xb8be, /*0x80-0x87*/
+  0xc2e8, 0x8a6c, 0xc8d1, 0x8a6d, 0x8a6e, 0xe5fb, 0x8a6f, 0x8a70, /*0x88-0x8f*/
+  0x8a71, 0x8a72, 0xb6ca, 0xbccb, 0x8a73, 0x8a74, 0xd1fd, 0xe6a1, /*0x90-0x97*/
+  0x8a75, 0xc3ee, 0x8a76, 0x8a77, 0x8a78, 0x8a79, 0xe6a4, 0x8a7a, /*0x98-0x9f*/
+  0x8a7b, 0x8a7c, 0x8a7d, 0xe5fe, 0xe6a5, 0xcdd7, 0x8a7e, 0x8a80, /*0xa0-0xa7*/
+  0xb7c1, 0xe5fc, 0xe5fd, 0xe6a3, 0x8a81, 0x8a82, 0xc4dd, 0xe6a8, /*0xa8-0xaf*/
+  0x8a83, 0x8a84, 0xe6a7, 0x8a85, 0x8a86, 0x8a87, 0x8a88, 0x8a89, /*0xb0-0xb7*/
+  0x8a8a, 0xc3c3, 0x8a8b, 0xc6de, 0x8a8c, 0x8a8d, 0xe6aa, 0x8a8e, /*0xb8-0xbf*/
+  0x8a8f, 0x8a90, 0x8a91, 0x8a92, 0x8a93, 0x8a94, 0xc4b7, 0x8a95, /*0xc0-0xc7*/
+  0x8a96, 0x8a97, 0xe6a2, 0xcabc, 0x8a98, 0x8a99, 0x8a9a, 0x8a9b, /*0xc8-0xcf*/
+  0xbde3, 0xb9c3, 0xe6a6, 0xd0d5, 0xceaf, 0x8a9c, 0x8a9d, 0xe6a9, /*0xd0-0xd7*/
+  0xe6b0, 0x8a9e, 0xd2a6, 0x8a9f, 0xbdaa, 0xe6ad, 0x8aa0, 0x8aa1, /*0xd8-0xdf*/
+  0x8aa2, 0x8aa3, 0x8aa4, 0xe6af, 0x8aa5, 0xc0d1, 0x8aa6, 0x8aa7, /*0xe0-0xe7*/
+  0xd2cc, 0x8aa8, 0x8aa9, 0x8aaa, 0xbca7, 0x8aab, 0x8aac, 0x8aad, /*0xe8-0xef*/
+  0x8aae, 0x8aaf, 0x8ab0, 0x8ab1, 0x8ab2, 0x8ab3, 0x8ab4, 0x8ab5, /*0xf0-0xf7*/
+  0x8ab6, 0xe6b1, 0x8ab7, 0xd2f6, 0x8ab8, 0x8ab9, 0x8aba, 0xd7cb, /*0xf8-0xff*/
+  /* 0x5a00 */
+  0x8abb, 0xcdfe, 0x8abc, 0xcdde, 0xc2a6, 0xe6ab, 0xe6ac, 0xbdbf, /*0x00-0x07*/
+  0xe6ae, 0xe6b3, 0x8abd, 0x8abe, 0xe6b2, 0x8abf, 0x8ac0, 0x8ac1, /*0x08-0x0f*/
+  0x8ac2, 0xe6b6, 0x8ac3, 0xe6b8, 0x8ac4, 0x8ac5, 0x8ac6, 0x8ac7, /*0x10-0x17*/
+  0xc4ef, 0x8ac8, 0x8ac9, 0x8aca, 0xc4c8, 0x8acb, 0x8acc, 0xbeea, /*0x18-0x1f*/
+  0xc9ef, 0x8acd, 0x8ace, 0xe6b7, 0x8acf, 0xb6f0, 0x8ad0, 0x8ad1, /*0x20-0x27*/
+  0x8ad2, 0xc3e4, 0x8ad3, 0x8ad4, 0x8ad5, 0x8ad6, 0x8ad7, 0x8ad8, /*0x28-0x2f*/
+  0x8ad9, 0xd3e9, 0xe6b4, 0x8ada, 0xe6b5, 0x8adb, 0xc8a2, 0x8adc, /*0x30-0x37*/
+  0x8add, 0x8ade, 0x8adf, 0x8ae0, 0xe6bd, 0x8ae1, 0x8ae2, 0x8ae3, /*0x38-0x3f*/
+  0xe6b9, 0x8ae4, 0x8ae5, 0x8ae6, 0x8ae7, 0x8ae8, 0xc6c5, 0x8ae9, /*0x40-0x47*/
+  0x8aea, 0xcdf1, 0xe6bb, 0x8aeb, 0x8aec, 0x8aed, 0x8aee, 0x8aef, /*0x48-0x4f*/
+  0x8af0, 0x8af1, 0x8af2, 0x8af3, 0x8af4, 0xe6bc, 0x8af5, 0x8af6, /*0x50-0x57*/
+  0x8af7, 0x8af8, 0xbbe9, 0x8af9, 0x8afa, 0x8afb, 0x8afc, 0x8afd, /*0x58-0x5f*/
+  0x8afe, 0x8b40, 0xe6be, 0x8b41, 0x8b42, 0x8b43, 0x8b44, 0xe6ba, /*0x60-0x67*/
+  0x8b45, 0x8b46, 0xc0b7, 0x8b47, 0x8b48, 0x8b49, 0x8b4a, 0x8b4b, /*0x68-0x6f*/
+  0x8b4c, 0x8b4d, 0x8b4e, 0x8b4f, 0xd3a4, 0xe6bf, 0xc9f4, 0xe6c3, /*0x70-0x77*/
+  0x8b50, 0x8b51, 0xe6c4, 0x8b52, 0x8b53, 0x8b54, 0x8b55, 0xd0f6, /*0x78-0x7f*/
+  0x8b56, 0x8b57, 0x8b58, 0x8b59, 0x8b5a, 0x8b5b, 0x8b5c, 0x8b5d, /*0x80-0x87*/
+  0x8b5e, 0x8b5f, 0x8b60, 0x8b61, 0x8b62, 0x8b63, 0x8b64, 0x8b65, /*0x88-0x8f*/
+  0x8b66, 0x8b67, 0xc3bd, 0x8b68, 0x8b69, 0x8b6a, 0x8b6b, 0x8b6c, /*0x90-0x97*/
+  0x8b6d, 0x8b6e, 0xc3c4, 0xe6c2, 0x8b6f, 0x8b70, 0x8b71, 0x8b72, /*0x98-0x9f*/
+  0x8b73, 0x8b74, 0x8b75, 0x8b76, 0x8b77, 0x8b78, 0x8b79, 0x8b7a, /*0xa0-0xa7*/
+  0x8b7b, 0x8b7c, 0xe6c1, 0x8b7d, 0x8b7e, 0x8b80, 0x8b81, 0x8b82, /*0xa8-0xaf*/
+  0x8b83, 0x8b84, 0xe6c7, 0xcfb1, 0x8b85, 0xebf4, 0x8b86, 0x8b87, /*0xb0-0xb7*/
+  0xe6ca, 0x8b88, 0x8b89, 0x8b8a, 0x8b8b, 0x8b8c, 0xe6c5, 0x8b8d, /*0xb8-0xbf*/
+  0x8b8e, 0xbcde, 0xc9a9, 0x8b8f, 0x8b90, 0x8b91, 0x8b92, 0x8b93, /*0xc0-0xc7*/
+  0x8b94, 0xbcb5, 0x8b95, 0x8b96, 0xcfd3, 0x8b97, 0x8b98, 0x8b99, /*0xc8-0xcf*/
+  0x8b9a, 0x8b9b, 0xe6c8, 0x8b9c, 0xe6c9, 0x8b9d, 0xe6ce, 0x8b9e, /*0xd0-0xd7*/
+  0xe6d0, 0x8b9f, 0x8ba0, 0x8ba1, 0xe6d1, 0x8ba2, 0x8ba3, 0x8ba4, /*0xd8-0xdf*/
+  0xe6cb, 0xb5d5, 0x8ba5, 0xe6cc, 0x8ba6, 0x8ba7, 0xe6cf, 0x8ba8, /*0xe0-0xe7*/
+  0x8ba9, 0xc4db, 0x8baa, 0xe6c6, 0x8bab, 0x8bac, 0x8bad, 0x8bae, /*0xe8-0xef*/
+  0x8baf, 0xe6cd, 0x8bb0, 0x8bb1, 0x8bb2, 0x8bb3, 0x8bb4, 0x8bb5, /*0xf0-0xf7*/
+  0x8bb6, 0x8bb7, 0x8bb8, 0x8bb9, 0x8bba, 0x8bbb, 0x8bbc, 0x8bbd, /*0xf8-0xff*/
+  /* 0x5b00 */
+  0x8bbe, 0x8bbf, 0x8bc0, 0x8bc1, 0x8bc2, 0x8bc3, 0x8bc4, 0x8bc5, /*0x00-0x07*/
+  0x8bc6, 0xe6d2, 0x8bc7, 0x8bc8, 0x8bc9, 0x8bca, 0x8bcb, 0x8bcc, /*0x08-0x0f*/
+  0x8bcd, 0x8bce, 0x8bcf, 0x8bd0, 0x8bd1, 0x8bd2, 0xe6d4, 0xe6d3, /*0x10-0x17*/
+  0x8bd3, 0x8bd4, 0x8bd5, 0x8bd6, 0x8bd7, 0x8bd8, 0x8bd9, 0x8bda, /*0x18-0x1f*/
+  0x8bdb, 0x8bdc, 0x8bdd, 0x8bde, 0x8bdf, 0x8be0, 0x8be1, 0x8be2, /*0x20-0x27*/
+  0x8be3, 0x8be4, 0x8be5, 0x8be6, 0x8be7, 0x8be8, 0x8be9, 0x8bea, /*0x28-0x2f*/
+  0x8beb, 0x8bec, 0xe6d5, 0x8bed, 0xd9f8, 0x8bee, 0x8bef, 0xe6d6, /*0x30-0x37*/
+  0x8bf0, 0x8bf1, 0x8bf2, 0x8bf3, 0x8bf4, 0x8bf5, 0x8bf6, 0x8bf7, /*0x38-0x3f*/
+  0xe6d7, 0x8bf8, 0x8bf9, 0x8bfa, 0x8bfb, 0x8bfc, 0x8bfd, 0x8bfe, /*0x40-0x47*/
+  0x8c40, 0x8c41, 0x8c42, 0x8c43, 0x8c44, 0x8c45, 0x8c46, 0x8c47, /*0x48-0x4f*/
+  0xd7d3, 0xe6dd, 0x8c48, 0xe6de, 0xbfd7, 0xd4d0, 0x8c49, 0xd7d6, /*0x50-0x57*/
+  0xb4e6, 0xcbef, 0xe6da, 0xd8c3, 0xd7ce, 0xd0a2, 0x8c4a, 0xc3cf, /*0x58-0x5f*/
+  0x8c4b, 0x8c4c, 0xe6df, 0xbcbe, 0xb9c2, 0xe6db, 0xd1a7, 0x8c4d, /*0x60-0x67*/
+  0x8c4e, 0xbaa2, 0xc2cf, 0x8c4f, 0xd8ab, 0x8c50, 0x8c51, 0x8c52, /*0x68-0x6f*/
+  0xcaeb, 0xe5ee, 0x8c53, 0xe6dc, 0x8c54, 0xb7f5, 0x8c55, 0x8c56, /*0x70-0x77*/
+  0x8c57, 0x8c58, 0xc8e6, 0x8c59, 0x8c5a, 0xc4f5, 0x8c5b, 0x8c5c, /*0x78-0x7f*/
+  0xe5b2, 0xc4fe, 0x8c5d, 0xcbfc, 0xe5b3, 0xd5ac, 0x8c5e, 0xd3ee, /*0x80-0x87*/
+  0xcad8, 0xb0b2, 0x8c5f, 0xcbce, 0xcdea, 0x8c60, 0x8c61, 0xbaea, /*0x88-0x8f*/
+  0x8c62, 0x8c63, 0x8c64, 0xe5b5, 0x8c65, 0xe5b4, 0x8c66, 0xd7da, /*0x90-0x97*/
+  0xb9d9, 0xd6e6, 0xb6a8, 0xcdf0, 0xd2cb, 0xb1a6, 0xcab5, 0x8c67, /*0x98-0x9f*/
+  0xb3e8, 0xc9f3, 0xbfcd, 0xd0fb, 0xcad2, 0xe5b6, 0xbbc2, 0x8c68, /*0xa0-0xa7*/
+  0x8c69, 0x8c6a, 0xcfdc, 0xb9ac, 0x8c6b, 0x8c6c, 0x8c6d, 0x8c6e, /*0xa8-0xaf*/
+  0xd4d7, 0x8c6f, 0x8c70, 0xbaa6, 0xd1e7, 0xcffc, 0xbcd2, 0x8c71, /*0xb0-0xb7*/
+  0xe5b7, 0xc8dd, 0x8c72, 0x8c73, 0x8c74, 0xbfed, 0xb1f6, 0xcbde, /*0xb8-0xbf*/
+  0x8c75, 0x8c76, 0xbcc5, 0x8c77, 0xbcc4, 0xd2fa, 0xc3dc, 0xbfdc, /*0xc0-0xc7*/
+  0x8c78, 0x8c79, 0x8c7a, 0x8c7b, 0xb8bb, 0x8c7c, 0x8c7d, 0x8c7e, /*0xc8-0xcf*/
+  0xc3c2, 0x8c80, 0xbaae, 0xd4a2, 0x8c81, 0x8c82, 0x8c83, 0x8c84, /*0xd0-0xd7*/
+  0x8c85, 0x8c86, 0x8c87, 0x8c88, 0x8c89, 0xc7de, 0xc4af, 0xb2ec, /*0xd8-0xdf*/
+  0x8c8a, 0xb9d1, 0x8c8b, 0x8c8c, 0xe5bb, 0xc1c8, 0x8c8d, 0x8c8e, /*0xe0-0xe7*/
+  0xd5af, 0x8c8f, 0x8c90, 0x8c91, 0x8c92, 0x8c93, 0xe5bc, 0x8c94, /*0xe8-0xef*/
+  0xe5be, 0x8c95, 0x8c96, 0x8c97, 0x8c98, 0x8c99, 0x8c9a, 0x8c9b, /*0xf0-0xf7*/
+  0xb4e7, 0xb6d4, 0xcbc2, 0xd1b0, 0xb5bc, 0x8c9c, 0x8c9d, 0xcad9, /*0xf8-0xff*/
+  /* 0x5c00 */
+  0x8c9e, 0xb7e2, 0x8c9f, 0x8ca0, 0xc9e4, 0x8ca1, 0xbdab, 0x8ca2, /*0x00-0x07*/
+  0x8ca3, 0xcebe, 0xd7f0, 0x8ca4, 0x8ca5, 0x8ca6, 0x8ca7, 0xd0a1, /*0x08-0x0f*/
+  0x8ca8, 0xc9d9, 0x8ca9, 0x8caa, 0xb6fb, 0xe6d8, 0xbce2, 0x8cab, /*0x10-0x17*/
+  0xb3be, 0x8cac, 0xc9d0, 0x8cad, 0xe6d9, 0xb3a2, 0x8cae, 0x8caf, /*0x18-0x1f*/
+  0x8cb0, 0x8cb1, 0xdecc, 0x8cb2, 0xd3c8, 0xdecd, 0x8cb3, 0xd2a2, /*0x20-0x27*/
+  0x8cb4, 0x8cb5, 0x8cb6, 0x8cb7, 0xdece, 0x8cb8, 0x8cb9, 0x8cba, /*0x28-0x2f*/
+  0x8cbb, 0xbecd, 0x8cbc, 0x8cbd, 0xdecf, 0x8cbe, 0x8cbf, 0x8cc0, /*0x30-0x37*/
+  0xcaac, 0xd2fc, 0xb3df, 0xe5ea, 0xc4e1, 0xbea1, 0xceb2, 0xc4f2, /*0x38-0x3f*/
+  0xbed6, 0xc6a8, 0xb2e3, 0x8cc1, 0x8cc2, 0xbed3, 0x8cc3, 0x8cc4, /*0x40-0x47*/
+  0xc7fc, 0xcceb, 0xbdec, 0xcedd, 0x8cc5, 0x8cc6, 0xcaba, 0xc6c1, /*0x48-0x4f*/
+  0xe5ec, 0xd0bc, 0x8cc7, 0x8cc8, 0x8cc9, 0xd5b9, 0x8cca, 0x8ccb, /*0x50-0x57*/
+  0x8ccc, 0xe5ed, 0x8ccd, 0x8cce, 0x8ccf, 0x8cd0, 0xcaf4, 0x8cd1, /*0x58-0x5f*/
+  0xcdc0, 0xc2c5, 0x8cd2, 0xe5ef, 0x8cd3, 0xc2c4, 0xe5f0, 0x8cd4, /*0x60-0x67*/
+  0x8cd5, 0x8cd6, 0x8cd7, 0x8cd8, 0x8cd9, 0x8cda, 0xe5f8, 0xcdcd, /*0x68-0x6f*/
+  0x8cdb, 0xc9bd, 0x8cdc, 0x8cdd, 0x8cde, 0x8cdf, 0x8ce0, 0x8ce1, /*0x70-0x77*/
+  0x8ce2, 0xd2d9, 0xe1a8, 0x8ce3, 0x8ce4, 0x8ce5, 0x8ce6, 0xd3ec, /*0x78-0x7f*/
+  0x8ce7, 0xcbea, 0xc6f1, 0x8ce8, 0x8ce9, 0x8cea, 0x8ceb, 0x8cec, /*0x80-0x87*/
+  0xe1ac, 0x8ced, 0x8cee, 0x8cef, 0xe1a7, 0xe1a9, 0x8cf0, 0x8cf1, /*0x88-0x8f*/
+  0xe1aa, 0xe1af, 0x8cf2, 0x8cf3, 0xb2ed, 0x8cf4, 0xe1ab, 0xb8da, /*0x90-0x97*/
+  0xe1ad, 0xe1ae, 0xe1b0, 0xb5ba, 0xe1b1, 0x8cf5, 0x8cf6, 0x8cf7, /*0x98-0x9f*/
+  0x8cf8, 0x8cf9, 0xe1b3, 0xe1b8, 0x8cfa, 0x8cfb, 0x8cfc, 0x8cfd, /*0xa0-0xa7*/
+  0x8cfe, 0xd1d2, 0x8d40, 0xe1b6, 0xe1b5, 0xc1eb, 0x8d41, 0x8d42, /*0xa8-0xaf*/
+  0x8d43, 0xe1b7, 0x8d44, 0xd4c0, 0x8d45, 0xe1b2, 0x8d46, 0xe1ba, /*0xb0-0xb7*/
+  0xb0b6, 0x8d47, 0x8d48, 0x8d49, 0x8d4a, 0xe1b4, 0x8d4b, 0xbff9, /*0xb8-0xbf*/
+  0x8d4c, 0xe1b9, 0x8d4d, 0x8d4e, 0xe1bb, 0x8d4f, 0x8d50, 0x8d51, /*0xc0-0xc7*/
+  0x8d52, 0x8d53, 0x8d54, 0xe1be, 0x8d55, 0x8d56, 0x8d57, 0x8d58, /*0xc8-0xcf*/
+  0x8d59, 0x8d5a, 0xe1bc, 0x8d5b, 0x8d5c, 0x8d5d, 0x8d5e, 0x8d5f, /*0xd0-0xd7*/
+  0x8d60, 0xd6c5, 0x8d61, 0x8d62, 0x8d63, 0x8d64, 0x8d65, 0x8d66, /*0xd8-0xdf*/
+  0x8d67, 0xcfbf, 0x8d68, 0x8d69, 0xe1bd, 0xe1bf, 0xc2cd, 0x8d6a, /*0xe0-0xe7*/
+  0xb6eb, 0x8d6b, 0xd3f8, 0x8d6c, 0x8d6d, 0xc7cd, 0x8d6e, 0x8d6f, /*0xe8-0xef*/
+  0xb7e5, 0x8d70, 0x8d71, 0x8d72, 0x8d73, 0x8d74, 0x8d75, 0x8d76, /*0xf0-0xf7*/
+  0x8d77, 0x8d78, 0x8d79, 0xbefe, 0x8d7a, 0x8d7b, 0x8d7c, 0x8d7d, /*0xf8-0xff*/
+  /* 0x5d00 */
+  0x8d7e, 0x8d80, 0xe1c0, 0xe1c1, 0x8d81, 0x8d82, 0xe1c7, 0xb3e7, /*0x00-0x07*/
+  0x8d83, 0x8d84, 0x8d85, 0x8d86, 0x8d87, 0x8d88, 0xc6e9, 0x8d89, /*0x08-0x0f*/
+  0x8d8a, 0x8d8b, 0x8d8c, 0x8d8d, 0xb4de, 0x8d8e, 0xd1c2, 0x8d8f, /*0x10-0x17*/
+  0x8d90, 0x8d91, 0x8d92, 0xe1c8, 0x8d93, 0x8d94, 0xe1c6, 0x8d95, /*0x18-0x1f*/
+  0x8d96, 0x8d97, 0x8d98, 0x8d99, 0xe1c5, 0x8d9a, 0xe1c3, 0xe1c2, /*0x20-0x27*/
+  0x8d9b, 0xb1c0, 0x8d9c, 0x8d9d, 0x8d9e, 0xd5b8, 0xe1c4, 0x8d9f, /*0x28-0x2f*/
+  0x8da0, 0x8da1, 0x8da2, 0x8da3, 0xe1cb, 0x8da4, 0x8da5, 0x8da6, /*0x30-0x37*/
+  0x8da7, 0x8da8, 0x8da9, 0x8daa, 0x8dab, 0xe1cc, 0xe1ca, 0x8dac, /*0x38-0x3f*/
+  0x8dad, 0x8dae, 0x8daf, 0x8db0, 0x8db1, 0x8db2, 0x8db3, 0xeffa, /*0x40-0x47*/
+  0x8db4, 0x8db5, 0xe1d3, 0xe1d2, 0xc7b6, 0x8db6, 0x8db7, 0x8db8, /*0x48-0x4f*/
+  0x8db9, 0x8dba, 0x8dbb, 0x8dbc, 0x8dbd, 0x8dbe, 0x8dbf, 0x8dc0, /*0x50-0x57*/
+  0xe1c9, 0x8dc1, 0x8dc2, 0xe1ce, 0x8dc3, 0xe1d0, 0x8dc4, 0x8dc5, /*0x58-0x5f*/
+  0x8dc6, 0x8dc7, 0x8dc8, 0x8dc9, 0x8dca, 0x8dcb, 0x8dcc, 0x8dcd, /*0x60-0x67*/
+  0x8dce, 0xe1d4, 0x8dcf, 0xe1d1, 0xe1cd, 0x8dd0, 0x8dd1, 0xe1cf, /*0x68-0x6f*/
+  0x8dd2, 0x8dd3, 0x8dd4, 0x8dd5, 0xe1d5, 0x8dd6, 0x8dd7, 0x8dd8, /*0x70-0x77*/
+  0x8dd9, 0x8dda, 0x8ddb, 0x8ddc, 0x8ddd, 0x8dde, 0x8ddf, 0x8de0, /*0x78-0x7f*/
+  0x8de1, 0x8de2, 0xe1d6, 0x8de3, 0x8de4, 0x8de5, 0x8de6, 0x8de7, /*0x80-0x87*/
+  0x8de8, 0x8de9, 0x8dea, 0x8deb, 0x8dec, 0x8ded, 0x8dee, 0x8def, /*0x88-0x8f*/
+  0x8df0, 0x8df1, 0x8df2, 0x8df3, 0x8df4, 0x8df5, 0x8df6, 0x8df7, /*0x90-0x97*/
+  0x8df8, 0xe1d7, 0x8df9, 0x8dfa, 0x8dfb, 0xe1d8, 0x8dfc, 0x8dfd, /*0x98-0x9f*/
+  0x8dfe, 0x8e40, 0x8e41, 0x8e42, 0x8e43, 0x8e44, 0x8e45, 0x8e46, /*0xa0-0xa7*/
+  0x8e47, 0x8e48, 0x8e49, 0x8e4a, 0x8e4b, 0x8e4c, 0x8e4d, 0x8e4e, /*0xa8-0xaf*/
+  0x8e4f, 0x8e50, 0x8e51, 0x8e52, 0x8e53, 0x8e54, 0x8e55, 0xe1da, /*0xb0-0xb7*/
+  0x8e56, 0x8e57, 0x8e58, 0x8e59, 0x8e5a, 0x8e5b, 0x8e5c, 0x8e5d, /*0xb8-0xbf*/
+  0x8e5e, 0x8e5f, 0x8e60, 0x8e61, 0x8e62, 0xe1db, 0x8e63, 0x8e64, /*0xc0-0xc7*/
+  0x8e65, 0x8e66, 0x8e67, 0x8e68, 0x8e69, 0xcea1, 0x8e6a, 0x8e6b, /*0xc8-0xcf*/
+  0x8e6c, 0x8e6d, 0x8e6e, 0x8e6f, 0x8e70, 0x8e71, 0x8e72, 0x8e73, /*0xd0-0xd7*/
+  0x8e74, 0x8e75, 0x8e76, 0xe7dd, 0x8e77, 0xb4a8, 0xd6dd, 0x8e78, /*0xd8-0xdf*/
+  0x8e79, 0xd1b2, 0xb3b2, 0x8e7a, 0x8e7b, 0xb9a4, 0xd7f3, 0xc7c9, /*0xe0-0xe7*/
+  0xbede, 0xb9ae, 0x8e7c, 0xced7, 0x8e7d, 0x8e7e, 0xb2ee, 0xdbcf, /*0xe8-0xef*/
+  0x8e80, 0xbcba, 0xd2d1, 0xcbc8, 0xb0cd, 0x8e81, 0x8e82, 0xcfef, /*0xf0-0xf7*/
+  0x8e83, 0x8e84, 0x8e85, 0x8e86, 0x8e87, 0xd9e3, 0xbded, 0x8e88, /*0xf8-0xff*/
+  /* 0x5e00 */
+  0x8e89, 0xb1d2, 0xcad0, 0xb2bc, 0x8e8a, 0xcba7, 0xb7ab, 0x8e8b, /*0x00-0x07*/
+  0xcaa6, 0x8e8c, 0x8e8d, 0x8e8e, 0xcfa3, 0x8e8f, 0x8e90, 0xe0f8, /*0x08-0x0f*/
+  0xd5ca, 0xe0fb, 0x8e91, 0x8e92, 0xe0fa, 0xc5c1, 0xccfb, 0x8e93, /*0x10-0x17*/
+  0xc1b1, 0xe0f9, 0xd6e3, 0xb2af, 0xd6c4, 0xb5db, 0x8e94, 0x8e95, /*0x18-0x1f*/
+  0x8e96, 0x8e97, 0x8e98, 0x8e99, 0x8e9a, 0x8e9b, 0xb4f8, 0xd6a1, /*0x20-0x27*/
+  0x8e9c, 0x8e9d, 0x8e9e, 0x8e9f, 0x8ea0, 0xcfaf, 0xb0ef, 0x8ea1, /*0x28-0x2f*/
+  0x8ea2, 0xe0fc, 0x8ea3, 0x8ea4, 0x8ea5, 0x8ea6, 0x8ea7, 0xe1a1, /*0x30-0x37*/
+  0xb3a3, 0x8ea8, 0x8ea9, 0xe0fd, 0xe0fe, 0xc3b1, 0x8eaa, 0x8eab, /*0x38-0x3f*/
+  0x8eac, 0x8ead, 0xc3dd, 0x8eae, 0xe1a2, 0xb7f9, 0x8eaf, 0x8eb0, /*0x40-0x47*/
+  0x8eb1, 0x8eb2, 0x8eb3, 0x8eb4, 0xbbcf, 0x8eb5, 0x8eb6, 0x8eb7, /*0x48-0x4f*/
+  0x8eb8, 0x8eb9, 0x8eba, 0x8ebb, 0xe1a3, 0xc4bb, 0x8ebc, 0x8ebd, /*0x50-0x57*/
+  0x8ebe, 0x8ebf, 0x8ec0, 0xe1a4, 0x8ec1, 0x8ec2, 0xe1a5, 0x8ec3, /*0x58-0x5f*/
+  0x8ec4, 0xe1a6, 0xb4b1, 0x8ec5, 0x8ec6, 0x8ec7, 0x8ec8, 0x8ec9, /*0x60-0x67*/
+  0x8eca, 0x8ecb, 0x8ecc, 0x8ecd, 0x8ece, 0x8ecf, 0x8ed0, 0x8ed1, /*0x68-0x6f*/
+  0x8ed2, 0x8ed3, 0xb8c9, 0xc6bd, 0xc4ea, 0x8ed4, 0xb2a2, 0x8ed5, /*0x70-0x77*/
+  0xd0d2, 0x8ed6, 0xe7db, 0xbbc3, 0xd3d7, 0xd3c4, 0x8ed7, 0xb9e3, /*0x78-0x7f*/
+  0xe2cf, 0x8ed8, 0x8ed9, 0x8eda, 0xd7af, 0x8edb, 0xc7ec, 0xb1d3, /*0x80-0x87*/
+  0x8edc, 0x8edd, 0xb4b2, 0xe2d1, 0x8ede, 0x8edf, 0x8ee0, 0xd0f2, /*0x88-0x8f*/
+  0xc2ae, 0xe2d0, 0x8ee1, 0xbfe2, 0xd3a6, 0xb5d7, 0xe2d2, 0xb5ea, /*0x90-0x97*/
+  0x8ee2, 0xc3ed, 0xb8fd, 0x8ee3, 0xb8ae, 0x8ee4, 0xc5d3, 0xb7cf, /*0x98-0x9f*/
+  0xe2d4, 0x8ee5, 0x8ee6, 0x8ee7, 0x8ee8, 0xe2d3, 0xb6c8, 0xd7f9, /*0xa0-0xa7*/
+  0x8ee9, 0x8eea, 0x8eeb, 0x8eec, 0x8eed, 0xcda5, 0x8eee, 0x8eef, /*0xa8-0xaf*/
+  0x8ef0, 0x8ef1, 0x8ef2, 0xe2d8, 0x8ef3, 0xe2d6, 0xcafc, 0xbfb5, /*0xb0-0xb7*/
+  0xd3b9, 0xe2d5, 0x8ef4, 0x8ef5, 0x8ef6, 0x8ef7, 0xe2d7, 0x8ef8, /*0xb8-0xbf*/
+  0x8ef9, 0x8efa, 0x8efb, 0x8efc, 0x8efd, 0x8efe, 0x8f40, 0x8f41, /*0xc0-0xc7*/
+  0x8f42, 0xc1ae, 0xc0c8, 0x8f43, 0x8f44, 0x8f45, 0x8f46, 0x8f47, /*0xc8-0xcf*/
+  0x8f48, 0xe2db, 0xe2da, 0xc0aa, 0x8f49, 0x8f4a, 0xc1ce, 0x8f4b, /*0xd0-0xd7*/
+  0x8f4c, 0x8f4d, 0x8f4e, 0xe2dc, 0x8f4f, 0x8f50, 0x8f51, 0x8f52, /*0xd8-0xdf*/
+  0x8f53, 0x8f54, 0x8f55, 0x8f56, 0x8f57, 0x8f58, 0x8f59, 0x8f5a, /*0xe0-0xe7*/
+  0xe2dd, 0x8f5b, 0xe2de, 0x8f5c, 0x8f5d, 0x8f5e, 0x8f5f, 0x8f60, /*0xe8-0xef*/
+  0x8f61, 0x8f62, 0x8f63, 0x8f64, 0xdbc8, 0x8f65, 0xd1d3, 0xcda2, /*0xf0-0xf7*/
+  0x8f66, 0x8f67, 0xbda8, 0x8f68, 0x8f69, 0x8f6a, 0xdec3, 0xd8a5, /*0xf8-0xff*/
+  /* 0x5f00 */
+  0xbfaa, 0xdbcd, 0xd2ec, 0xc6fa, 0xc5aa, 0x8f6b, 0x8f6c, 0x8f6d, /*0x00-0x07*/
+  0xdec4, 0x8f6e, 0xb1d7, 0xdfae, 0x8f6f, 0x8f70, 0x8f71, 0xcabd, /*0x08-0x0f*/
+  0x8f72, 0xdfb1, 0x8f73, 0xb9ad, 0x8f74, 0xd2fd, 0x8f75, 0xb8a5, /*0x10-0x17*/
+  0xbaeb, 0x8f76, 0x8f77, 0xb3da, 0x8f78, 0x8f79, 0x8f7a, 0xb5dc, /*0x18-0x1f*/
+  0xd5c5, 0x8f7b, 0x8f7c, 0x8f7d, 0x8f7e, 0xc3d6, 0xcfd2, 0xbba1, /*0x20-0x27*/
+  0x8f80, 0xe5f3, 0xe5f2, 0x8f81, 0x8f82, 0xe5f4, 0x8f83, 0xcde4, /*0x28-0x2f*/
+  0x8f84, 0xc8f5, 0x8f85, 0x8f86, 0x8f87, 0x8f88, 0x8f89, 0x8f8a, /*0x30-0x37*/
+  0x8f8b, 0xb5af, 0xc7bf, 0x8f8c, 0xe5f6, 0x8f8d, 0x8f8e, 0x8f8f, /*0x38-0x3f*/
+  0xecb0, 0x8f90, 0x8f91, 0x8f92, 0x8f93, 0x8f94, 0x8f95, 0x8f96, /*0x40-0x47*/
+  0x8f97, 0x8f98, 0x8f99, 0x8f9a, 0x8f9b, 0x8f9c, 0x8f9d, 0x8f9e, /*0x48-0x4f*/
+  0xe5e6, 0x8f9f, 0xb9e9, 0xb5b1, 0x8fa0, 0xc2bc, 0xe5e8, 0xe5e7, /*0x50-0x57*/
+  0xe5e9, 0x8fa1, 0x8fa2, 0x8fa3, 0x8fa4, 0xd2cd, 0x8fa5, 0x8fa6, /*0x58-0x5f*/
+  0x8fa7, 0xe1ea, 0xd0ce, 0x8fa8, 0xcdae, 0x8fa9, 0xd1e5, 0x8faa, /*0x60-0x67*/
+  0x8fab, 0xb2ca, 0xb1eb, 0x8fac, 0xb1f2, 0xc5ed, 0x8fad, 0x8fae, /*0x68-0x6f*/
+  0xd5c3, 0xd3b0, 0x8faf, 0xe1dc, 0x8fb0, 0x8fb1, 0x8fb2, 0xe1dd, /*0x70-0x77*/
+  0x8fb3, 0xd2db, 0x8fb4, 0xb3b9, 0xb1cb, 0x8fb5, 0x8fb6, 0x8fb7, /*0x78-0x7f*/
+  0xcdf9, 0xd5f7, 0xe1de, 0x8fb8, 0xbeb6, 0xb4fd, 0x8fb9, 0xe1df, /*0x80-0x87*/
+  0xbadc, 0xe1e0, 0xbbb2, 0xc2c9, 0xe1e1, 0x8fba, 0x8fbb, 0x8fbc, /*0x88-0x8f*/
+  0xd0ec, 0x8fbd, 0xcdbd, 0x8fbe, 0x8fbf, 0xe1e2, 0x8fc0, 0xb5c3, /*0x90-0x97*/
+  0xc5c7, 0xe1e3, 0x8fc1, 0x8fc2, 0xe1e4, 0x8fc3, 0x8fc4, 0x8fc5, /*0x98-0x9f*/
+  0x8fc6, 0xd3f9, 0x8fc7, 0x8fc8, 0x8fc9, 0x8fca, 0x8fcb, 0x8fcc, /*0xa0-0xa7*/
+  0xe1e5, 0x8fcd, 0xd1ad, 0x8fce, 0x8fcf, 0xe1e6, 0xcea2, 0x8fd0, /*0xa8-0xaf*/
+  0x8fd1, 0x8fd2, 0x8fd3, 0x8fd4, 0x8fd5, 0xe1e7, 0x8fd6, 0xb5c2, /*0xb0-0xb7*/
+  0x8fd7, 0x8fd8, 0x8fd9, 0x8fda, 0xe1e8, 0xbbd5, 0x8fdb, 0x8fdc, /*0xb8-0xbf*/
+  0x8fdd, 0x8fde, 0x8fdf, 0xd0c4, 0xe2e0, 0xb1d8, 0xd2e4, 0x8fe0, /*0xc0-0xc7*/
+  0x8fe1, 0xe2e1, 0x8fe2, 0x8fe3, 0xbcc9, 0xc8cc, 0x8fe4, 0xe2e3, /*0xc8-0xcf*/
+  0xecfe, 0xecfd, 0xdfaf, 0x8fe5, 0x8fe6, 0x8fe7, 0xe2e2, 0xd6be, /*0xd0-0xd7*/
+  0xcdfc, 0xc3a6, 0x8fe8, 0x8fe9, 0x8fea, 0xe3c3, 0x8feb, 0x8fec, /*0xd8-0xdf*/
+  0xd6d2, 0xe2e7, 0x8fed, 0x8fee, 0xe2e8, 0x8fef, 0x8ff0, 0xd3c7, /*0xe0-0xe7*/
+  0x8ff1, 0x8ff2, 0xe2ec, 0xbfec, 0x8ff3, 0xe2ed, 0xe2e5, 0x8ff4, /*0xe8-0xef*/
+  0x8ff5, 0xb3c0, 0x8ff6, 0x8ff7, 0x8ff8, 0xc4ee, 0x8ff9, 0x8ffa, /*0xf0-0xf7*/
+  0xe2ee, 0x8ffb, 0x8ffc, 0xd0c3, 0x8ffd, 0xbaf6, 0xe2e9, 0xb7de, /*0xf8-0xff*/
+  /* 0x6000 */
+  0xbbb3, 0xccac, 0xcbcb, 0xe2e4, 0xe2e6, 0xe2ea, 0xe2eb, 0x8ffe, /*0x00-0x07*/
+  0x9040, 0x9041, 0xe2f7, 0x9042, 0x9043, 0xe2f4, 0xd4f5, 0xe2f3, /*0x08-0x0f*/
+  0x9044, 0x9045, 0xc5ad, 0x9046, 0xd5fa, 0xc5c2, 0xb2c0, 0x9047, /*0x10-0x17*/
+  0x9048, 0xe2ef, 0x9049, 0xe2f2, 0xc1af, 0xcbbc, 0x904a, 0x904b, /*0x18-0x1f*/
+  0xb5a1, 0xe2f9, 0x904c, 0x904d, 0x904e, 0xbcb1, 0xe2f1, 0xd0d4, /*0x20-0x27*/
+  0xd4b9, 0xe2f5, 0xb9d6, 0xe2f6, 0x904f, 0x9050, 0x9051, 0xc7d3, /*0x28-0x2f*/
+  0x9052, 0x9053, 0x9054, 0x9055, 0x9056, 0xe2f0, 0x9057, 0x9058, /*0x30-0x37*/
+  0x9059, 0x905a, 0x905b, 0xd7dc, 0xeda1, 0x905c, 0x905d, 0xe2f8, /*0x38-0x3f*/
+  0x905e, 0xeda5, 0xe2fe, 0xcad1, 0x905f, 0x9060, 0x9061, 0x9062, /*0x40-0x47*/
+  0x9063, 0x9064, 0x9065, 0xc1b5, 0x9066, 0xbbd0, 0x9067, 0x9068, /*0x48-0x4f*/
+  0xbfd6, 0x9069, 0xbae3, 0x906a, 0x906b, 0xcba1, 0x906c, 0x906d, /*0x50-0x57*/
+  0x906e, 0xeda6, 0xeda3, 0x906f, 0x9070, 0xeda2, 0x9071, 0x9072, /*0x58-0x5f*/
+  0x9073, 0x9074, 0xbbd6, 0xeda7, 0xd0f4, 0x9075, 0x9076, 0xeda4, /*0x60-0x67*/
+  0xbade, 0xb6f7, 0xe3a1, 0xb6b2, 0xccf1, 0xb9a7, 0x9077, 0xcfa2, /*0x68-0x6f*/
+  0xc7a1, 0x9078, 0x9079, 0xbfd2, 0x907a, 0x907b, 0xb6f1, 0x907c, /*0x70-0x77*/
+  0xe2fa, 0xe2fb, 0xe2fd, 0xe2fc, 0xc4d5, 0xe3a2, 0x907d, 0xd3c1, /*0x78-0x7f*/
+  0x907e, 0x9080, 0x9081, 0xe3a7, 0xc7c4, 0x9082, 0x9083, 0x9084, /*0x80-0x87*/
+  0x9085, 0xcfa4, 0x9086, 0x9087, 0xe3a9, 0xbab7, 0x9088, 0x9089, /*0x88-0x8f*/
+  0x908a, 0x908b, 0xe3a8, 0x908c, 0xbbda, 0x908d, 0xe3a3, 0x908e, /*0x90-0x97*/
+  0x908f, 0x9090, 0xe3a4, 0xe3aa, 0x9091, 0xe3a6, 0x9092, 0xcef2, /*0x98-0x9f*/
+  0xd3c6, 0x9093, 0x9094, 0xbbbc, 0x9095, 0x9096, 0xd4c3, 0x9097, /*0xa0-0xa7*/
+  0xc4fa, 0x9098, 0x9099, 0xeda8, 0xd0fc, 0xe3a5, 0x909a, 0xc3f5, /*0xa8-0xaf*/
+  0x909b, 0xe3ad, 0xb1af, 0x909c, 0xe3b2, 0x909d, 0x909e, 0x909f, /*0xb0-0xb7*/
+  0xbcc2, 0x90a0, 0x90a1, 0xe3ac, 0xb5bf, 0x90a2, 0x90a3, 0x90a4, /*0xb8-0xbf*/
+  0x90a5, 0x90a6, 0x90a7, 0x90a8, 0x90a9, 0xc7e9, 0xe3b0, 0x90aa, /*0xc0-0xc7*/
+  0x90ab, 0x90ac, 0xbeaa, 0xcdef, 0x90ad, 0x90ae, 0x90af, 0x90b0, /*0xc8-0xcf*/
+  0x90b1, 0xbbf3, 0x90b2, 0x90b3, 0x90b4, 0xcce8, 0x90b5, 0x90b6, /*0xd0-0xd7*/
+  0xe3af, 0x90b7, 0xe3b1, 0x90b8, 0xcfa7, 0xe3ae, 0x90b9, 0xcea9, /*0xd8-0xdf*/
+  0xbbdd, 0x90ba, 0x90bb, 0x90bc, 0x90bd, 0x90be, 0xb5eb, 0xbee5, /*0xe0-0xe7*/
+  0xb2d2, 0xb3cd, 0x90bf, 0xb1b9, 0xe3ab, 0xb2d1, 0xb5ac, 0xb9df, /*0xe8-0xef*/
+  0xb6e8, 0x90c0, 0x90c1, 0xcfeb, 0xe3b7, 0x90c2, 0xbbcc, 0x90c3, /*0xf0-0xf7*/
+  0x90c4, 0xc8c7, 0xd0ca, 0x90c5, 0x90c6, 0x90c7, 0x90c8, 0x90c9, /*0xf8-0xff*/
+  /* 0x6100 */
+  0xe3b8, 0xb3ee, 0x90ca, 0x90cb, 0x90cc, 0x90cd, 0xeda9, 0x90ce, /*0x00-0x07*/
+  0xd3fa, 0xd3e4, 0x90cf, 0x90d0, 0x90d1, 0xedaa, 0xe3b9, 0xd2e2, /*0x08-0x0f*/
+  0x90d2, 0x90d3, 0x90d4, 0x90d5, 0x90d6, 0xe3b5, 0x90d7, 0x90d8, /*0x10-0x17*/
+  0x90d9, 0x90da, 0xd3de, 0x90db, 0x90dc, 0x90dd, 0x90de, 0xb8d0, /*0x18-0x1f*/
+  0xe3b3, 0x90df, 0x90e0, 0xe3b6, 0xb7df, 0x90e1, 0xe3b4, 0xc0a2, /*0x20-0x27*/
+  0x90e2, 0x90e3, 0x90e4, 0xe3ba, 0x90e5, 0x90e6, 0x90e7, 0x90e8, /*0x28-0x2f*/
+  0x90e9, 0x90ea, 0x90eb, 0x90ec, 0x90ed, 0x90ee, 0x90ef, 0x90f0, /*0x30-0x37*/
+  0x90f1, 0x90f2, 0x90f3, 0x90f4, 0x90f5, 0x90f6, 0x90f7, 0xd4b8, /*0x38-0x3f*/
+  0x90f8, 0x90f9, 0x90fa, 0x90fb, 0x90fc, 0x90fd, 0x90fe, 0x9140, /*0x40-0x47*/
+  0xb4c8, 0x9141, 0xe3bb, 0x9142, 0xbbc5, 0x9143, 0xc9f7, 0x9144, /*0x48-0x4f*/
+  0x9145, 0xc9e5, 0x9146, 0x9147, 0x9148, 0xc4bd, 0x9149, 0x914a, /*0x50-0x57*/
+  0x914b, 0x914c, 0x914d, 0x914e, 0x914f, 0xedab, 0x9150, 0x9151, /*0x58-0x5f*/
+  0x9152, 0x9153, 0xc2fd, 0x9154, 0x9155, 0x9156, 0x9157, 0xbbdb, /*0x60-0x67*/
+  0xbfae, 0x9158, 0x9159, 0x915a, 0x915b, 0x915c, 0x915d, 0x915e, /*0x68-0x6f*/
+  0xcebf, 0x915f, 0x9160, 0x9161, 0x9162, 0xe3bc, 0x9163, 0xbfb6, /*0x70-0x77*/
+  0x9164, 0x9165, 0x9166, 0x9167, 0x9168, 0x9169, 0x916a, 0x916b, /*0x78-0x7f*/
+  0x916c, 0x916d, 0x916e, 0x916f, 0x9170, 0x9171, 0x9172, 0x9173, /*0x80-0x87*/
+  0x9174, 0x9175, 0x9176, 0xb1ef, 0x9177, 0x9178, 0xd4f7, 0x9179, /*0x88-0x8f*/
+  0x917a, 0x917b, 0x917c, 0x917d, 0xe3be, 0x917e, 0x9180, 0x9181, /*0x90-0x97*/
+  0x9182, 0x9183, 0x9184, 0x9185, 0x9186, 0xedad, 0x9187, 0x9188, /*0x98-0x9f*/
+  0x9189, 0x918a, 0x918b, 0x918c, 0x918d, 0x918e, 0x918f, 0xe3bf, /*0xa0-0xa7*/
+  0xbaa9, 0xedac, 0x9190, 0x9191, 0xe3bd, 0x9192, 0x9193, 0x9194, /*0xa8-0xaf*/
+  0x9195, 0x9196, 0x9197, 0x9198, 0x9199, 0x919a, 0x919b, 0xe3c0, /*0xb0-0xb7*/
+  0x919c, 0x919d, 0x919e, 0x919f, 0x91a0, 0x91a1, 0xbab6, 0x91a2, /*0xb8-0xbf*/
+  0x91a3, 0x91a4, 0xb6ae, 0x91a5, 0x91a6, 0x91a7, 0x91a8, 0x91a9, /*0xc0-0xc7*/
+  0xd0b8, 0x91aa, 0xb0c3, 0xedae, 0x91ab, 0x91ac, 0x91ad, 0x91ae, /*0xc8-0xcf*/
+  0x91af, 0xedaf, 0xc0c1, 0x91b0, 0xe3c1, 0x91b1, 0x91b2, 0x91b3, /*0xd0-0xd7*/
+  0x91b4, 0x91b5, 0x91b6, 0x91b7, 0x91b8, 0x91b9, 0x91ba, 0x91bb, /*0xd8-0xdf*/
+  0x91bc, 0x91bd, 0x91be, 0x91bf, 0x91c0, 0x91c1, 0xc5b3, 0x91c2, /*0xe0-0xe7*/
+  0x91c3, 0x91c4, 0x91c5, 0x91c6, 0x91c7, 0x91c8, 0x91c9, 0x91ca, /*0xe8-0xef*/
+  0x91cb, 0x91cc, 0x91cd, 0x91ce, 0x91cf, 0xe3c2, 0x91d0, 0x91d1, /*0xf0-0xf7*/
+  0x91d2, 0x91d3, 0x91d4, 0x91d5, 0x91d6, 0x91d7, 0x91d8, 0xdcb2, /*0xf8-0xff*/
+  /* 0x6200 */
+  0x91d9, 0x91da, 0x91db, 0x91dc, 0x91dd, 0x91de, 0xedb0, 0x91df, /*0x00-0x07*/
+  0xb8ea, 0x91e0, 0xceec, 0xeaa7, 0xd0e7, 0xcaf9, 0xc8d6, 0xcfb7, /*0x08-0x0f*/
+  0xb3c9, 0xced2, 0xbde4, 0x91e1, 0x91e2, 0xe3de, 0xbbf2, 0xeaa8, /*0x10-0x17*/
+  0xd5bd, 0x91e3, 0xc6dd, 0xeaa9, 0x91e4, 0x91e5, 0x91e6, 0xeaaa, /*0x18-0x1f*/
+  0x91e7, 0xeaac, 0xeaab, 0x91e8, 0xeaae, 0xeaad, 0x91e9, 0x91ea, /*0x20-0x27*/
+  0x91eb, 0x91ec, 0xbdd8, 0x91ed, 0xeaaf, 0x91ee, 0xc2be, 0x91ef, /*0x28-0x2f*/
+  0x91f0, 0x91f1, 0x91f2, 0xb4c1, 0xb4f7, 0x91f3, 0x91f4, 0xbba7, /*0x30-0x37*/
+  0x91f5, 0x91f6, 0x91f7, 0x91f8, 0x91f9, 0xece6, 0xece5, 0xb7bf, /*0x38-0x3f*/
+  0xcbf9, 0xb1e2, 0x91fa, 0xece7, 0x91fb, 0x91fc, 0x91fd, 0xc9c8, /*0x40-0x47*/
+  0xece8, 0xece9, 0x91fe, 0xcad6, 0xded0, 0xb2c5, 0xd4fa, 0x9240, /*0x48-0x4f*/
+  0x9241, 0xc6cb, 0xb0c7, 0xb4f2, 0xc8d3, 0x9242, 0x9243, 0x9244, /*0x50-0x57*/
+  0xcdd0, 0x9245, 0x9246, 0xbfb8, 0x9247, 0x9248, 0x9249, 0x924a, /*0x58-0x5f*/
+  0x924b, 0x924c, 0x924d, 0xbfdb, 0x924e, 0x924f, 0xc7a4, 0xd6b4, /*0x60-0x67*/
+  0x9250, 0xc0a9, 0xded1, 0xc9a8, 0xd1ef, 0xc5a4, 0xb0e7, 0xb3b6, /*0x68-0x6f*/
+  0xc8c5, 0x9251, 0x9252, 0xb0e2, 0x9253, 0x9254, 0xb7f6, 0x9255, /*0x70-0x77*/
+  0x9256, 0xc5fa, 0x9257, 0x9258, 0xb6f3, 0x9259, 0xd5d2, 0xb3d0, /*0x78-0x7f*/
+  0xbcbc, 0x925a, 0x925b, 0x925c, 0xb3ad, 0x925d, 0x925e, 0x925f, /*0x80-0x87*/
+  0x9260, 0xbef1, 0xb0d1, 0x9261, 0x9262, 0x9263, 0x9264, 0x9265, /*0x88-0x8f*/
+  0x9266, 0xd2d6, 0xcae3, 0xd7a5, 0x9267, 0xcdb6, 0xb6b6, 0xbfb9, /*0x90-0x97*/
+  0xd5db, 0x9268, 0xb8a7, 0xc5d7, 0x9269, 0x926a, 0x926b, 0xded2, /*0x98-0x9f*/
+  0xbfd9, 0xc2d5, 0xc7c0, 0x926c, 0xbba4, 0xb1a8, 0x926d, 0x926e, /*0xa0-0xa7*/
+  0xc5ea, 0x926f, 0x9270, 0xc5fb, 0xcca7, 0x9271, 0x9272, 0x9273, /*0xa8-0xaf*/
+  0x9274, 0xb1a7, 0x9275, 0x9276, 0x9277, 0xb5d6, 0x9278, 0x9279, /*0xb0-0xb7*/
+  0x927a, 0xc4a8, 0x927b, 0xded3, 0xd1ba, 0xb3e9, 0x927c, 0xc3f2, /*0xb8-0xbf*/
+  0x927d, 0x927e, 0xb7f7, 0x9280, 0xd6f4, 0xb5a3, 0xb2f0, 0xc4b4, /*0xc0-0xc7*/
+  0xc4e9, 0xc0ad, 0xded4, 0x9281, 0xb0e8, 0xc5c4, 0xc1e0, 0x9282, /*0xc8-0xcf*/
+  0xb9d5, 0x9283, 0xbedc, 0xcdd8, 0xb0ce, 0x9284, 0xcdcf, 0xded6, /*0xd0-0xd7*/
+  0xbed0, 0xd7be, 0xded5, 0xd5d0, 0xb0dd, 0x9285, 0x9286, 0xc4e2, /*0xd8-0xdf*/
+  0x9287, 0x9288, 0xc2a3, 0xbcf0, 0x9289, 0xd3b5, 0xc0b9, 0xc5a1, /*0xe0-0xe7*/
+  0xb2a6, 0xd4f1, 0x928a, 0x928b, 0xc0a8, 0xcac3, 0xded7, 0xd5fc, /*0xe8-0xef*/
+  0x928c, 0xb9b0, 0x928d, 0xc8ad, 0xcba9, 0x928e, 0xded9, 0xbfbd, /*0xf0-0xf7*/
+  0x928f, 0x9290, 0x9291, 0x9292, 0xc6b4, 0xd7a7, 0xcab0, 0xc4c3, /*0xf8-0xff*/
+  /* 0x6300 */
+  0x9293, 0xb3d6, 0xb9d2, 0x9294, 0x9295, 0x9296, 0x9297, 0xd6b8, /*0x00-0x07*/
+  0xeafc, 0xb0b4, 0x9298, 0x9299, 0x929a, 0x929b, 0xbfe6, 0x929c, /*0x08-0x0f*/
+  0x929d, 0xccf4, 0x929e, 0x929f, 0x92a0, 0x92a1, 0xcdda, 0x92a2, /*0x10-0x17*/
+  0x92a3, 0x92a4, 0xd6bf, 0xc2ce, 0x92a5, 0xcece, 0xcca2, 0xd0ae, /*0x18-0x1f*/
+  0xc4d3, 0xb5b2, 0xded8, 0xd5f5, 0xbcb7, 0xbbd3, 0x92a6, 0x92a7, /*0x20-0x27*/
+  0xb0a4, 0x92a8, 0xc5b2, 0xb4ec, 0x92a9, 0x92aa, 0x92ab, 0xd5f1, /*0x28-0x2f*/
+  0x92ac, 0x92ad, 0xeafd, 0x92ae, 0x92af, 0x92b0, 0x92b1, 0x92b2, /*0x30-0x37*/
+  0x92b3, 0xdeda, 0xcda6, 0x92b4, 0x92b5, 0xcdec, 0x92b6, 0x92b7, /*0x38-0x3f*/
+  0x92b8, 0x92b9, 0xcee6, 0xdedc, 0x92ba, 0xcdb1, 0xc0a6, 0x92bb, /*0x40-0x47*/
+  0x92bc, 0xd7bd, 0x92bd, 0xdedb, 0xb0c6, 0xbab4, 0xc9d3, 0xc4f3, /*0x48-0x4f*/
+  0xbee8, 0x92be, 0x92bf, 0x92c0, 0x92c1, 0xb2b6, 0x92c2, 0x92c3, /*0x50-0x57*/
+  0x92c4, 0x92c5, 0x92c6, 0x92c7, 0x92c8, 0x92c9, 0xc0cc, 0xcbf0, /*0x58-0x5f*/
+  0x92ca, 0xbcf1, 0xbbbb, 0xb5b7, 0x92cb, 0x92cc, 0x92cd, 0xc5f5, /*0x60-0x67*/
+  0x92ce, 0xdee6, 0x92cf, 0x92d0, 0x92d1, 0xdee3, 0xbedd, 0x92d2, /*0x68-0x6f*/
+  0x92d3, 0xdedf, 0x92d4, 0x92d5, 0x92d6, 0x92d7, 0xb4b7, 0xbddd, /*0x70-0x77*/
+  0x92d8, 0x92d9, 0xdee0, 0xc4ed, 0x92da, 0x92db, 0x92dc, 0x92dd, /*0x78-0x7f*/
+  0xcfc6, 0x92de, 0xb5e0, 0x92df, 0x92e0, 0x92e1, 0x92e2, 0xb6de, /*0x80-0x87*/
+  0xcada, 0xb5f4, 0xdee5, 0x92e3, 0xd5c6, 0x92e4, 0xdee1, 0xcccd, /*0x88-0x8f*/
+  0xc6fe, 0x92e5, 0xc5c5, 0x92e6, 0x92e7, 0x92e8, 0xd2b4, 0x92e9, /*0x90-0x97*/
+  0xbef2, 0x92ea, 0x92eb, 0x92ec, 0x92ed, 0x92ee, 0x92ef, 0x92f0, /*0x98-0x9f*/
+  0xc2d3, 0x92f1, 0xccbd, 0xb3b8, 0x92f2, 0xbdd3, 0x92f3, 0xbfd8, /*0xa0-0xa7*/
+  0xcdc6, 0xd1da, 0xb4eb, 0x92f4, 0xdee4, 0xdedd, 0xdee7, 0x92f5, /*0xa8-0xaf*/
+  0xeafe, 0x92f6, 0x92f7, 0xc2b0, 0xdee2, 0x92f8, 0x92f9, 0xd6c0, /*0xb0-0xb7*/
+  0xb5a7, 0x92fa, 0xb2f4, 0x92fb, 0xdee8, 0x92fc, 0xdef2, 0x92fd, /*0xb8-0xbf*/
+  0x92fe, 0x9340, 0x9341, 0x9342, 0xdeed, 0x9343, 0xdef1, 0x9344, /*0xc0-0xc7*/
+  0x9345, 0xc8e0, 0x9346, 0x9347, 0x9348, 0xd7e1, 0xdeef, 0xc3e8, /*0xc8-0xcf*/
+  0xcce1, 0x9349, 0xb2e5, 0x934a, 0x934b, 0x934c, 0xd2be, 0x934d, /*0xd0-0xd7*/
+  0x934e, 0x934f, 0x9350, 0x9351, 0x9352, 0x9353, 0xdeee, 0x9354, /*0xd8-0xdf*/
+  0xdeeb, 0xced5, 0x9355, 0xb4a7, 0x9356, 0x9357, 0x9358, 0x9359, /*0xe0-0xe7*/
+  0x935a, 0xbfab, 0xbebe, 0x935b, 0x935c, 0xbdd2, 0x935d, 0x935e, /*0xe8-0xef*/
+  0x935f, 0x9360, 0xdee9, 0x9361, 0xd4ae, 0x9362, 0xdede, 0x9363, /*0xf0-0xf7*/
+  0xdeea, 0x9364, 0x9365, 0x9366, 0x9367, 0xc0bf, 0x9368, 0xdeec, /*0xf8-0xff*/
+  /* 0x6400 */
+  0xb2f3, 0xb8e9, 0xc2a7, 0x9369, 0x936a, 0xbdc1, 0x936b, 0x936c, /*0x00-0x07*/
+  0x936d, 0x936e, 0x936f, 0xdef5, 0xdef8, 0x9370, 0x9371, 0xb2ab, /*0x08-0x0f*/
+  0xb4a4, 0x9372, 0x9373, 0xb4ea, 0xc9a6, 0x9374, 0x9375, 0x9376, /*0x10-0x17*/
+  0x9377, 0x9378, 0x9379, 0xdef6, 0xcbd1, 0x937a, 0xb8e3, 0x937b, /*0x18-0x1f*/
+  0xdef7, 0xdefa, 0x937c, 0x937d, 0x937e, 0x9380, 0xdef9, 0x9381, /*0x20-0x27*/
+  0x9382, 0x9383, 0xccc2, 0x9384, 0xb0e1, 0xb4ee, 0x9385, 0x9386, /*0x28-0x2f*/
+  0x9387, 0x9388, 0x9389, 0x938a, 0xe5ba, 0x938b, 0x938c, 0x938d, /*0x30-0x37*/
+  0x938e, 0x938f, 0xd0af, 0x9390, 0x9391, 0xb2eb, 0x9392, 0xeba1, /*0x38-0x3f*/
+  0x9393, 0xdef4, 0x9394, 0x9395, 0xc9e3, 0xdef3, 0xb0da, 0xd2a1, /*0x40-0x47*/
+  0xb1f7, 0x9396, 0xccaf, 0x9397, 0x9398, 0x9399, 0x939a, 0x939b, /*0x48-0x4f*/
+  0x939c, 0x939d, 0xdef0, 0x939e, 0xcba4, 0x939f, 0x93a0, 0x93a1, /*0x50-0x57*/
+  0xd5aa, 0x93a2, 0x93a3, 0x93a4, 0x93a5, 0x93a6, 0xdefb, 0x93a7, /*0x58-0x5f*/
+  0x93a8, 0x93a9, 0x93aa, 0x93ab, 0x93ac, 0x93ad, 0x93ae, 0xb4dd, /*0x60-0x67*/
+  0x93af, 0xc4a6, 0x93b0, 0x93b1, 0x93b2, 0xdefd, 0x93b3, 0x93b4, /*0x68-0x6f*/
+  0x93b5, 0x93b6, 0x93b7, 0x93b8, 0x93b9, 0x93ba, 0x93bb, 0x93bc, /*0x70-0x77*/
+  0xc3fe, 0xc4a1, 0xdfa1, 0x93bd, 0x93be, 0x93bf, 0x93c0, 0x93c1, /*0x78-0x7f*/
+  0x93c2, 0x93c3, 0xc1cc, 0x93c4, 0xdefc, 0xbeef, 0x93c5, 0xc6b2, /*0x80-0x87*/
+  0x93c6, 0x93c7, 0x93c8, 0x93c9, 0x93ca, 0x93cb, 0x93cc, 0x93cd, /*0x88-0x8f*/
+  0x93ce, 0xb3c5, 0xc8f6, 0x93cf, 0x93d0, 0xcbba, 0xdefe, 0x93d1, /*0x90-0x97*/
+  0x93d2, 0xdfa4, 0x93d3, 0x93d4, 0x93d5, 0x93d6, 0xd7b2, 0x93d7, /*0x98-0x9f*/
+  0x93d8, 0x93d9, 0x93da, 0x93db, 0xb3b7, 0x93dc, 0x93dd, 0x93de, /*0xa0-0xa7*/
+  0x93df, 0xc1c3, 0x93e0, 0x93e1, 0xc7cb, 0xb2a5, 0xb4e9, 0x93e2, /*0xa8-0xaf*/
+  0xd7ab, 0x93e3, 0x93e4, 0x93e5, 0x93e6, 0xc4ec, 0x93e7, 0xdfa2, /*0xb0-0xb7*/
+  0xdfa3, 0x93e8, 0xdfa5, 0x93e9, 0xbab3, 0x93ea, 0x93eb, 0x93ec, /*0xb8-0xbf*/
+  0xdfa6, 0x93ed, 0xc0de, 0x93ee, 0x93ef, 0xc9c3, 0x93f0, 0x93f1, /*0xc0-0xc7*/
+  0x93f2, 0x93f3, 0x93f4, 0x93f5, 0x93f6, 0xb2d9, 0xc7e6, 0x93f7, /*0xc8-0xcf*/
+  0xdfa7, 0x93f8, 0xc7dc, 0x93f9, 0x93fa, 0x93fb, 0x93fc, 0xdfa8, /*0xd0-0xd7*/
+  0xeba2, 0x93fd, 0x93fe, 0x9440, 0x9441, 0x9442, 0xcbd3, 0x9443, /*0xd8-0xdf*/
+  0x9444, 0x9445, 0xdfaa, 0x9446, 0xdfa9, 0x9447, 0xb2c1, 0x9448, /*0xe0-0xe7*/
+  0x9449, 0x944a, 0x944b, 0x944c, 0x944d, 0x944e, 0x944f, 0x9450, /*0xe8-0xef*/
+  0x9451, 0x9452, 0x9453, 0x9454, 0x9455, 0x9456, 0x9457, 0x9458, /*0xf0-0xf7*/
+  0x9459, 0x945a, 0x945b, 0x945c, 0x945d, 0x945e, 0x945f, 0x9460, /*0xf8-0xff*/
+  /* 0x6500 */
+  0xc5ca, 0x9461, 0x9462, 0x9463, 0x9464, 0x9465, 0x9466, 0x9467, /*0x00-0x07*/
+  0x9468, 0xdfab, 0x9469, 0x946a, 0x946b, 0x946c, 0x946d, 0x946e, /*0x08-0x0f*/
+  0x946f, 0x9470, 0xd4dc, 0x9471, 0x9472, 0x9473, 0x9474, 0x9475, /*0x10-0x17*/
+  0xc8c1, 0x9476, 0x9477, 0x9478, 0x9479, 0x947a, 0x947b, 0x947c, /*0x18-0x1f*/
+  0x947d, 0x947e, 0x9480, 0x9481, 0x9482, 0xdfac, 0x9483, 0x9484, /*0x20-0x27*/
+  0x9485, 0x9486, 0x9487, 0xbef0, 0x9488, 0x9489, 0xdfad, 0xd6a7, /*0x28-0x2f*/
+  0x948a, 0x948b, 0x948c, 0x948d, 0xeab7, 0xebb6, 0xcad5, 0x948e, /*0x30-0x37*/
+  0xd8fc, 0xb8c4, 0x948f, 0xb9a5, 0x9490, 0x9491, 0xb7c5, 0xd5fe, /*0x38-0x3f*/
+  0x9492, 0x9493, 0x9494, 0x9495, 0x9496, 0xb9ca, 0x9497, 0x9498, /*0x40-0x47*/
+  0xd0a7, 0xf4cd, 0x9499, 0x949a, 0xb5d0, 0x949b, 0x949c, 0xc3f4, /*0x48-0x4f*/
+  0x949d, 0xbec8, 0x949e, 0x949f, 0x94a0, 0xebb7, 0xb0bd, 0x94a1, /*0x50-0x57*/
+  0x94a2, 0xbdcc, 0x94a3, 0xc1b2, 0x94a4, 0xb1d6, 0xb3a8, 0x94a5, /*0x58-0x5f*/
+  0x94a6, 0x94a7, 0xb8d2, 0xc9a2, 0x94a8, 0x94a9, 0xb6d8, 0x94aa, /*0x60-0x67*/
+  0x94ab, 0x94ac, 0x94ad, 0xebb8, 0xbeb4, 0x94ae, 0x94af, 0x94b0, /*0x68-0x6f*/
+  0xcafd, 0x94b1, 0xc7c3, 0x94b2, 0xd5fb, 0x94b3, 0x94b4, 0xb7f3, /*0x70-0x77*/
+  0x94b5, 0x94b6, 0x94b7, 0x94b8, 0x94b9, 0x94ba, 0x94bb, 0x94bc, /*0x78-0x7f*/
+  0x94bd, 0x94be, 0x94bf, 0x94c0, 0x94c1, 0x94c2, 0x94c3, 0xcec4, /*0x80-0x87*/
+  0x94c4, 0x94c5, 0x94c6, 0xd5ab, 0xb1f3, 0x94c7, 0x94c8, 0x94c9, /*0x88-0x8f*/
+  0xecb3, 0xb0df, 0x94ca, 0xecb5, 0x94cb, 0x94cc, 0x94cd, 0xb6b7, /*0x90-0x97*/
+  0x94ce, 0xc1cf, 0x94cf, 0xf5fa, 0xd0b1, 0x94d0, 0x94d1, 0xd5e5, /*0x98-0x9f*/
+  0x94d2, 0xced3, 0x94d3, 0x94d4, 0xbdef, 0xb3e2, 0x94d5, 0xb8ab, /*0xa0-0xa7*/
+  0x94d6, 0xd5b6, 0x94d7, 0xedbd, 0x94d8, 0xb6cf, 0x94d9, 0xcbb9, /*0xa8-0xaf*/
+  0xd0c2, 0x94da, 0x94db, 0x94dc, 0x94dd, 0x94de, 0x94df, 0x94e0, /*0xb0-0xb7*/
+  0x94e1, 0xb7bd, 0x94e2, 0x94e3, 0xecb6, 0xcaa9, 0x94e4, 0x94e5, /*0xb8-0xbf*/
+  0x94e6, 0xc5d4, 0x94e7, 0xecb9, 0xecb8, 0xc2c3, 0xecb7, 0x94e8, /*0xc0-0xc7*/
+  0x94e9, 0x94ea, 0x94eb, 0xd0fd, 0xecba, 0x94ec, 0xecbb, 0xd7e5, /*0xc8-0xcf*/
+  0x94ed, 0x94ee, 0xecbc, 0x94ef, 0x94f0, 0x94f1, 0xecbd, 0xc6ec, /*0xd0-0xd7*/
+  0x94f2, 0x94f3, 0x94f4, 0x94f5, 0x94f6, 0x94f7, 0x94f8, 0x94f9, /*0xd8-0xdf*/
+  0xcede, 0x94fa, 0xbcc8, 0x94fb, 0x94fc, 0xc8d5, 0xb5a9, 0xbec9, /*0xe0-0xe7*/
+  0xd6bc, 0xd4e7, 0x94fd, 0x94fe, 0xd1ae, 0xd0f1, 0xeab8, 0xeab9, /*0xe8-0xef*/
+  0xeaba, 0xbab5, 0x9540, 0x9541, 0x9542, 0x9543, 0xcab1, 0xbff5, /*0xf0-0xf7*/
+  0x9544, 0x9545, 0xcdfa, 0x9546, 0x9547, 0x9548, 0x9549, 0x954a, /*0xf8-0xff*/
+  /* 0x6600 */
+  0xeac0, 0x954b, 0xb0ba, 0xeabe, 0x954c, 0x954d, 0xc0a5, 0x954e, /*0x00-0x07*/
+  0x954f, 0x9550, 0xeabb, 0x9551, 0xb2fd, 0x9552, 0xc3f7, 0xbbe8, /*0x08-0x0f*/
+  0x9553, 0x9554, 0x9555, 0xd2d7, 0xcef4, 0xeabf, 0x9556, 0x9557, /*0x10-0x17*/
+  0x9558, 0xeabc, 0x9559, 0x955a, 0x955b, 0xeac3, 0x955c, 0xd0c7, /*0x18-0x1f*/
+  0xd3b3, 0x955d, 0x955e, 0x955f, 0x9560, 0xb4ba, 0x9561, 0xc3c1, /*0x20-0x27*/
+  0xd7f2, 0x9562, 0x9563, 0x9564, 0x9565, 0xd5d1, 0x9566, 0xcac7, /*0x28-0x2f*/
+  0x9567, 0xeac5, 0x9568, 0x9569, 0xeac4, 0xeac7, 0xeac6, 0x956a, /*0x30-0x37*/
+  0x956b, 0x956c, 0x956d, 0x956e, 0xd6e7, 0x956f, 0xcfd4, 0x9570, /*0x38-0x3f*/
+  0x9571, 0xeacb, 0x9572, 0xbbce, 0x9573, 0x9574, 0x9575, 0x9576, /*0x40-0x47*/
+  0x9577, 0x9578, 0x9579, 0xbdfa, 0xc9ce, 0x957a, 0x957b, 0xeacc, /*0x48-0x4f*/
+  0x957c, 0x957d, 0xc9b9, 0xcffe, 0xeaca, 0xd4ce, 0xeacd, 0xeacf, /*0x50-0x57*/
+  0x957e, 0x9580, 0xcded, 0x9581, 0x9582, 0x9583, 0x9584, 0xeac9, /*0x58-0x5f*/
+  0x9585, 0xeace, 0x9586, 0x9587, 0xceee, 0x9588, 0xbbde, 0x9589, /*0x60-0x67*/
+  0xb3bf, 0x958a, 0x958b, 0x958c, 0x958d, 0x958e, 0xc6d5, 0xbeb0, /*0x68-0x6f*/
+  0xcefa, 0x958f, 0x9590, 0x9591, 0xc7e7, 0x9592, 0xbea7, 0xead0, /*0x70-0x77*/
+  0x9593, 0x9594, 0xd6c7, 0x9595, 0x9596, 0x9597, 0xc1c0, 0x9598, /*0x78-0x7f*/
+  0x9599, 0x959a, 0xd4dd, 0x959b, 0xead1, 0x959c, 0x959d, 0xcfbe, /*0x80-0x87*/
+  0x959e, 0x959f, 0x95a0, 0x95a1, 0xead2, 0x95a2, 0x95a3, 0x95a4, /*0x88-0x8f*/
+  0x95a5, 0xcaee, 0x95a6, 0x95a7, 0x95a8, 0x95a9, 0xc5af, 0xb0b5, /*0x90-0x97*/
+  0x95aa, 0x95ab, 0x95ac, 0x95ad, 0x95ae, 0xead4, 0x95af, 0x95b0, /*0x98-0x9f*/
+  0x95b1, 0x95b2, 0x95b3, 0x95b4, 0x95b5, 0x95b6, 0x95b7, 0xead3, /*0xa0-0xa7*/
+  0xf4df, 0x95b8, 0x95b9, 0x95ba, 0x95bb, 0x95bc, 0xc4ba, 0x95bd, /*0xa8-0xaf*/
+  0x95be, 0x95bf, 0x95c0, 0x95c1, 0xb1a9, 0x95c2, 0x95c3, 0x95c4, /*0xb0-0xb7*/
+  0x95c5, 0xe5df, 0x95c6, 0x95c7, 0x95c8, 0x95c9, 0xead5, 0x95ca, /*0xb8-0xbf*/
+  0x95cb, 0x95cc, 0x95cd, 0x95ce, 0x95cf, 0x95d0, 0x95d1, 0x95d2, /*0xc0-0xc7*/
+  0x95d3, 0x95d4, 0x95d5, 0x95d6, 0x95d7, 0x95d8, 0x95d9, 0x95da, /*0xc8-0xcf*/
+  0x95db, 0x95dc, 0x95dd, 0x95de, 0x95df, 0x95e0, 0x95e1, 0x95e2, /*0xd0-0xd7*/
+  0x95e3, 0xcaef, 0x95e4, 0xead6, 0xead7, 0xc6d8, 0x95e5, 0x95e6, /*0xd8-0xdf*/
+  0x95e7, 0x95e8, 0x95e9, 0x95ea, 0x95eb, 0x95ec, 0xead8, 0x95ed, /*0xe0-0xe7*/
+  0x95ee, 0xead9, 0x95ef, 0x95f0, 0x95f1, 0x95f2, 0x95f3, 0x95f4, /*0xe8-0xef*/
+  0xd4bb, 0x95f5, 0xc7fa, 0xd2b7, 0xb8fc, 0x95f6, 0x95f7, 0xeac2, /*0xf0-0xf7*/
+  0x95f8, 0xb2dc, 0x95f9, 0x95fa, 0xc2fc, 0x95fb, 0xd4f8, 0xcce6, /*0xf8-0xff*/
+  /* 0x6700 */
+  0xd7ee, 0x95fc, 0x95fd, 0x95fe, 0x9640, 0x9641, 0x9642, 0x9643, /*0x00-0x07*/
+  0xd4c2, 0xd3d0, 0xebc3, 0xc5f3, 0x9644, 0xb7fe, 0x9645, 0x9646, /*0x08-0x0f*/
+  0xebd4, 0x9647, 0x9648, 0x9649, 0xcbb7, 0xebde, 0x964a, 0xc0ca, /*0x10-0x17*/
+  0x964b, 0x964c, 0x964d, 0xcdfb, 0x964e, 0xb3af, 0x964f, 0xc6da, /*0x18-0x1f*/
+  0x9650, 0x9651, 0x9652, 0x9653, 0x9654, 0x9655, 0xebfc, 0x9656, /*0x20-0x27*/
+  0xc4be, 0x9657, 0xceb4, 0xc4a9, 0xb1be, 0xd4fd, 0x9658, 0xcaf5, /*0x28-0x2f*/
+  0x9659, 0xd6ec, 0x965a, 0x965b, 0xc6d3, 0xb6e4, 0x965c, 0x965d, /*0x30-0x37*/
+  0x965e, 0x965f, 0xbbfa, 0x9660, 0x9661, 0xd0e0, 0x9662, 0x9663, /*0x38-0x3f*/
+  0xc9b1, 0x9664, 0xd4d3, 0xc8a8, 0x9665, 0x9666, 0xb8cb, 0x9667, /*0x40-0x47*/
+  0xe8be, 0xc9bc, 0x9668, 0x9669, 0xe8bb, 0x966a, 0xc0ee, 0xd0d3, /*0x48-0x4f*/
+  0xb2c4, 0xb4e5, 0x966b, 0xe8bc, 0x966c, 0x966d, 0xd5c8, 0x966e, /*0x50-0x57*/
+  0x966f, 0x9670, 0x9671, 0x9672, 0xb6c5, 0x9673, 0xe8bd, 0xcaf8, /*0x58-0x5f*/
+  0xb8dc, 0xccf5, 0x9674, 0x9675, 0x9676, 0xc0b4, 0x9677, 0x9678, /*0x60-0x67*/
+  0xd1ee, 0xe8bf, 0xe8c2, 0x9679, 0x967a, 0xbabc, 0x967b, 0xb1ad, /*0x68-0x6f*/
+  0xbddc, 0x967c, 0xeabd, 0xe8c3, 0x967d, 0xe8c6, 0x967e, 0xe8cb, /*0x70-0x77*/
+  0x9680, 0x9681, 0x9682, 0x9683, 0xe8cc, 0x9684, 0xcbc9, 0xb0e5, /*0x78-0x7f*/
+  0x9685, 0xbcab, 0x9686, 0x9687, 0xb9b9, 0x9688, 0x9689, 0xe8c1, /*0x80-0x87*/
+  0x968a, 0xcdf7, 0x968b, 0xe8ca, 0x968c, 0x968d, 0x968e, 0x968f, /*0x88-0x8f*/
+  0xcef6, 0x9690, 0x9691, 0x9692, 0x9693, 0xd5ed, 0x9694, 0xc1d6, /*0x90-0x97*/
+  0xe8c4, 0x9695, 0xc3b6, 0x9696, 0xb9fb, 0xd6a6, 0xe8c8, 0x9697, /*0x98-0x9f*/
+  0x9698, 0x9699, 0xcae0, 0xd4e6, 0x969a, 0xe8c0, 0x969b, 0xe8c5, /*0xa0-0xa7*/
+  0xe8c7, 0x969c, 0xc7b9, 0xb7e3, 0x969d, 0xe8c9, 0x969e, 0xbfdd, /*0xa8-0xaf*/
+  0xe8d2, 0x969f, 0x96a0, 0xe8d7, 0x96a1, 0xe8d5, 0xbcdc, 0xbccf, /*0xb0-0xb7*/
+  0xe8db, 0x96a2, 0x96a3, 0x96a4, 0x96a5, 0x96a6, 0x96a7, 0x96a8, /*0xb8-0xbf*/
+  0x96a9, 0xe8de, 0x96aa, 0xe8da, 0xb1fa, 0x96ab, 0x96ac, 0x96ad, /*0xc0-0xc7*/
+  0x96ae, 0x96af, 0x96b0, 0x96b1, 0x96b2, 0x96b3, 0x96b4, 0xb0d8, /*0xc8-0xcf*/
+  0xc4b3, 0xb8cc, 0xc6e2, 0xc8be, 0xc8e1, 0x96b5, 0x96b6, 0x96b7, /*0xd0-0xd7*/
+  0xe8cf, 0xe8d4, 0xe8d6, 0x96b8, 0xb9f1, 0xe8d8, 0xd7f5, 0x96b9, /*0xd8-0xdf*/
+  0xc4fb, 0x96ba, 0xe8dc, 0x96bb, 0x96bc, 0xb2e9, 0x96bd, 0x96be, /*0xe0-0xe7*/
+  0x96bf, 0xe8d1, 0x96c0, 0x96c1, 0xbced, 0x96c2, 0x96c3, 0xbfc2, /*0xe8-0xef*/
+  0xe8cd, 0xd6f9, 0x96c4, 0xc1f8, 0xb2f1, 0x96c5, 0x96c6, 0x96c7, /*0xf0-0xf7*/
+  0x96c8, 0x96c9, 0x96ca, 0x96cb, 0x96cc, 0xe8df, 0x96cd, 0xcac1, /*0xf8-0xff*/
+  /* 0x6800 */
+  0xe8d9, 0x96ce, 0x96cf, 0x96d0, 0x96d1, 0xd5a4, 0x96d2, 0xb1ea, /*0x00-0x07*/
+  0xd5bb, 0xe8ce, 0xe8d0, 0xb6b0, 0xe8d3, 0x96d3, 0xe8dd, 0xc0b8, /*0x08-0x0f*/
+  0x96d4, 0xcaf7, 0x96d5, 0xcba8, 0x96d6, 0x96d7, 0xc6dc, 0xc0f5, /*0x10-0x17*/
+  0x96d8, 0x96d9, 0x96da, 0x96db, 0x96dc, 0xe8e9, 0x96dd, 0x96de, /*0x18-0x1f*/
+  0x96df, 0xd0a3, 0x96e0, 0x96e1, 0x96e2, 0x96e3, 0x96e4, 0x96e5, /*0x20-0x27*/
+  0x96e6, 0xe8f2, 0xd6ea, 0x96e7, 0x96e8, 0x96e9, 0x96ea, 0x96eb, /*0x28-0x2f*/
+  0x96ec, 0x96ed, 0xe8e0, 0xe8e1, 0x96ee, 0x96ef, 0x96f0, 0xd1f9, /*0x30-0x37*/
+  0xbacb, 0xb8f9, 0x96f1, 0x96f2, 0xb8f1, 0xd4d4, 0xe8ef, 0x96f3, /*0x38-0x3f*/
+  0xe8ee, 0xe8ec, 0xb9f0, 0xccd2, 0xe8e6, 0xcea6, 0xbff2, 0x96f4, /*0x40-0x47*/
+  0xb0b8, 0xe8f1, 0xe8f0, 0x96f5, 0xd7c0, 0x96f6, 0xe8e4, 0x96f7, /*0x48-0x4f*/
+  0xcda9, 0xc9a3, 0x96f8, 0xbbb8, 0xbddb, 0xe8ea, 0x96f9, 0x96fa, /*0x50-0x57*/
+  0x96fb, 0x96fc, 0x96fd, 0x96fe, 0x9740, 0x9741, 0x9742, 0x9743, /*0x58-0x5f*/
+  0xe8e2, 0xe8e3, 0xe8e5, 0xb5b5, 0xe8e7, 0xc7c5, 0xe8eb, 0xe8ed, /*0x60-0x67*/
+  0xbdb0, 0xd7ae, 0x9744, 0xe8f8, 0x9745, 0x9746, 0x9747, 0x9748, /*0x68-0x6f*/
+  0x9749, 0x974a, 0x974b, 0x974c, 0xe8f5, 0x974d, 0xcdb0, 0xe8f6, /*0x70-0x77*/
+  0x974e, 0x974f, 0x9750, 0x9751, 0x9752, 0x9753, 0x9754, 0x9755, /*0x78-0x7f*/
+  0x9756, 0xc1ba, 0x9757, 0xe8e8, 0x9758, 0xc3b7, 0xb0f0, 0x9759, /*0x80-0x87*/
+  0x975a, 0x975b, 0x975c, 0x975d, 0x975e, 0x975f, 0x9760, 0xe8f4, /*0x88-0x8f*/
+  0x9761, 0x9762, 0x9763, 0xe8f7, 0x9764, 0x9765, 0x9766, 0xb9a3, /*0x90-0x97*/
+  0x9767, 0x9768, 0x9769, 0x976a, 0x976b, 0x976c, 0x976d, 0x976e, /*0x98-0x9f*/
+  0x976f, 0x9770, 0xc9d2, 0x9771, 0x9772, 0x9773, 0xc3ce, 0xcee0, /*0xa0-0xa7*/
+  0xc0e6, 0x9774, 0x9775, 0x9776, 0x9777, 0xcbf3, 0x9778, 0xccdd, /*0xa8-0xaf*/
+  0xd0b5, 0x9779, 0x977a, 0xcae1, 0x977b, 0xe8f3, 0x977c, 0x977d, /*0xb0-0xb7*/
+  0x977e, 0x9780, 0x9781, 0x9782, 0x9783, 0x9784, 0x9785, 0x9786, /*0xb8-0xbf*/
+  0xbcec, 0x9787, 0xe8f9, 0x9788, 0x9789, 0x978a, 0x978b, 0x978c, /*0xc0-0xc7*/
+  0x978d, 0xc3de, 0x978e, 0xc6e5, 0x978f, 0xb9f7, 0x9790, 0x9791, /*0xc8-0xcf*/
+  0x9792, 0x9793, 0xb0f4, 0x9794, 0x9795, 0xd7d8, 0x9796, 0x9797, /*0xd0-0xd7*/
+  0xbcac, 0x9798, 0xc5ef, 0x9799, 0x979a, 0x979b, 0x979c, 0x979d, /*0xd8-0xdf*/
+  0xccc4, 0x979e, 0x979f, 0xe9a6, 0x97a0, 0x97a1, 0x97a2, 0x97a3, /*0xe0-0xe7*/
+  0x97a4, 0x97a5, 0x97a6, 0x97a7, 0x97a8, 0x97a9, 0xc9ad, 0x97aa, /*0xe8-0xef*/
+  0xe9a2, 0xc0e2, 0x97ab, 0x97ac, 0x97ad, 0xbfc3, 0x97ae, 0x97af, /*0xf0-0xf7*/
+  0x97b0, 0xe8fe, 0xb9d7, 0x97b1, 0xe8fb, 0x97b2, 0x97b3, 0x97b4, /*0xf8-0xff*/
+  /* 0x6900 */
+  0x97b5, 0xe9a4, 0x97b6, 0x97b7, 0x97b8, 0xd2ce, 0x97b9, 0x97ba, /*0x00-0x07*/
+  0x97bb, 0x97bc, 0x97bd, 0xe9a3, 0x97be, 0xd6b2, 0xd7b5, 0x97bf, /*0x08-0x0f*/
+  0xe9a7, 0x97c0, 0xbdb7, 0x97c1, 0x97c2, 0x97c3, 0x97c4, 0x97c5, /*0x10-0x17*/
+  0x97c6, 0x97c7, 0x97c8, 0x97c9, 0x97ca, 0x97cb, 0x97cc, 0xe8fc, /*0x18-0x1f*/
+  0xe8fd, 0x97cd, 0x97ce, 0x97cf, 0xe9a1, 0x97d0, 0x97d1, 0x97d2, /*0x20-0x27*/
+  0x97d3, 0x97d4, 0x97d5, 0x97d6, 0x97d7, 0xcdd6, 0x97d8, 0x97d9, /*0x28-0x2f*/
+  0xd2ac, 0x97da, 0x97db, 0x97dc, 0xe9b2, 0x97dd, 0x97de, 0x97df, /*0x30-0x37*/
+  0x97e0, 0xe9a9, 0x97e1, 0x97e2, 0x97e3, 0xb4aa, 0x97e4, 0xb4bb, /*0x38-0x3f*/
+  0x97e5, 0x97e6, 0xe9ab, 0x97e7, 0x97e8, 0x97e9, 0x97ea, 0x97eb, /*0x40-0x47*/
+  0x97ec, 0x97ed, 0x97ee, 0x97ef, 0x97f0, 0x97f1, 0x97f2, 0x97f3, /*0x48-0x4f*/
+  0x97f4, 0x97f5, 0x97f6, 0x97f7, 0xd0a8, 0x97f8, 0x97f9, 0xe9a5, /*0x50-0x57*/
+  0x97fa, 0x97fb, 0xb3fe, 0x97fc, 0x97fd, 0xe9ac, 0xc0e3, 0x97fe, /*0x58-0x5f*/
+  0xe9aa, 0x9840, 0x9841, 0xe9b9, 0x9842, 0x9843, 0xe9b8, 0x9844, /*0x60-0x67*/
+  0x9845, 0x9846, 0x9847, 0xe9ae, 0x9848, 0x9849, 0xe8fa, 0x984a, /*0x68-0x6f*/
+  0x984b, 0xe9a8, 0x984c, 0x984d, 0x984e, 0x984f, 0x9850, 0xbfac, /*0x70-0x77*/
+  0xe9b1, 0xe9ba, 0x9851, 0x9852, 0xc2a5, 0x9853, 0x9854, 0x9855, /*0x78-0x7f*/
+  0xe9af, 0x9856, 0xb8c5, 0x9857, 0xe9ad, 0x9858, 0xd3dc, 0xe9b4, /*0x80-0x87*/
+  0xe9b5, 0xe9b7, 0x9859, 0x985a, 0x985b, 0xe9c7, 0x985c, 0x985d, /*0x88-0x8f*/
+  0x985e, 0x985f, 0x9860, 0x9861, 0xc0c6, 0xe9c5, 0x9862, 0x9863, /*0x90-0x97*/
+  0xe9b0, 0x9864, 0x9865, 0xe9bb, 0xb0f1, 0x9866, 0x9867, 0x9868, /*0x98-0x9f*/
+  0x9869, 0x986a, 0x986b, 0x986c, 0x986d, 0x986e, 0x986f, 0xe9bc, /*0xa0-0xa7*/
+  0xd5a5, 0x9870, 0x9871, 0xe9be, 0x9872, 0xe9bf, 0x9873, 0x9874, /*0xa8-0xaf*/
+  0x9875, 0xe9c1, 0x9876, 0x9877, 0xc1f1, 0x9878, 0x9879, 0xc8b6, /*0xb0-0xb7*/
+  0x987a, 0x987b, 0x987c, 0xe9bd, 0x987d, 0x987e, 0x9880, 0x9881, /*0xb8-0xbf*/
+  0x9882, 0xe9c2, 0x9883, 0x9884, 0x9885, 0x9886, 0x9887, 0x9888, /*0xc0-0xc7*/
+  0x9889, 0x988a, 0xe9c3, 0x988b, 0xe9b3, 0x988c, 0xe9b6, 0x988d, /*0xc8-0xcf*/
+  0xbbb1, 0x988e, 0x988f, 0x9890, 0xe9c0, 0x9891, 0x9892, 0x9893, /*0xd0-0xd7*/
+  0x9894, 0x9895, 0x9896, 0xbcf7, 0x9897, 0x9898, 0x9899, 0xe9c4, /*0xd8-0xdf*/
+  0xe9c6, 0x989a, 0x989b, 0x989c, 0x989d, 0x989e, 0x989f, 0x98a0, /*0xe0-0xe7*/
+  0x98a1, 0x98a2, 0x98a3, 0x98a4, 0x98a5, 0xe9ca, 0x98a6, 0x98a7, /*0xe8-0xef*/
+  0x98a8, 0x98a9, 0xe9ce, 0x98aa, 0x98ab, 0x98ac, 0x98ad, 0x98ae, /*0xf0-0xf7*/
+  0x98af, 0x98b0, 0x98b1, 0x98b2, 0x98b3, 0xb2db, 0x98b4, 0xe9c8, /*0xf8-0xff*/
+  /* 0x6a00 */
+  0x98b5, 0x98b6, 0x98b7, 0x98b8, 0x98b9, 0x98ba, 0x98bb, 0x98bc, /*0x00-0x07*/
+  0x98bd, 0x98be, 0xb7ae, 0x98bf, 0x98c0, 0x98c1, 0x98c2, 0x98c3, /*0x08-0x0f*/
+  0x98c4, 0x98c5, 0x98c6, 0x98c7, 0x98c8, 0x98c9, 0x98ca, 0xe9cb, /*0x10-0x17*/
+  0xe9cc, 0x98cb, 0x98cc, 0x98cd, 0x98ce, 0x98cf, 0x98d0, 0xd5c1, /*0x18-0x1f*/
+  0x98d1, 0xc4a3, 0x98d2, 0x98d3, 0x98d4, 0x98d5, 0x98d6, 0x98d7, /*0x20-0x27*/
+  0xe9d8, 0x98d8, 0xbae1, 0x98d9, 0x98da, 0x98db, 0x98dc, 0xe9c9, /*0x28-0x2f*/
+  0x98dd, 0xd3a3, 0x98de, 0x98df, 0x98e0, 0xe9d4, 0x98e1, 0x98e2, /*0x30-0x37*/
+  0x98e3, 0x98e4, 0x98e5, 0x98e6, 0x98e7, 0xe9d7, 0xe9d0, 0x98e8, /*0x38-0x3f*/
+  0x98e9, 0x98ea, 0x98eb, 0x98ec, 0xe9cf, 0x98ed, 0x98ee, 0xc7c1, /*0x40-0x47*/
+  0x98ef, 0x98f0, 0x98f1, 0x98f2, 0x98f3, 0x98f4, 0x98f5, 0x98f6, /*0x48-0x4f*/
+  0xe9d2, 0x98f7, 0x98f8, 0x98f9, 0x98fa, 0x98fb, 0x98fc, 0x98fd, /*0x50-0x57*/
+  0xe9d9, 0xb3c8, 0x98fe, 0xe9d3, 0x9940, 0x9941, 0x9942, 0x9943, /*0x58-0x5f*/
+  0x9944, 0xcff0, 0x9945, 0x9946, 0x9947, 0xe9cd, 0x9948, 0x9949, /*0x60-0x67*/
+  0x994a, 0x994b, 0x994c, 0x994d, 0x994e, 0x994f, 0x9950, 0x9951, /*0x68-0x6f*/
+  0x9952, 0xb3f7, 0x9953, 0x9954, 0x9955, 0x9956, 0x9957, 0x9958, /*0x70-0x77*/
+  0x9959, 0xe9d6, 0x995a, 0x995b, 0xe9da, 0x995c, 0x995d, 0x995e, /*0x78-0x7f*/
+  0xccb4, 0x995f, 0x9960, 0x9961, 0xcfad, 0x9962, 0x9963, 0x9964, /*0x80-0x87*/
+  0x9965, 0x9966, 0x9967, 0x9968, 0x9969, 0x996a, 0xe9d5, 0x996b, /*0x88-0x8f*/
+  0xe9dc, 0xe9db, 0x996c, 0x996d, 0x996e, 0x996f, 0x9970, 0xe9de, /*0x90-0x97*/
+  0x9971, 0x9972, 0x9973, 0x9974, 0x9975, 0x9976, 0x9977, 0x9978, /*0x98-0x9f*/
+  0xe9d1, 0x9979, 0x997a, 0x997b, 0x997c, 0x997d, 0x997e, 0x9980, /*0xa0-0xa7*/
+  0x9981, 0xe9dd, 0x9982, 0xe9df, 0xc3ca, 0x9983, 0x9984, 0x9985, /*0xa8-0xaf*/
+  0x9986, 0x9987, 0x9988, 0x9989, 0x998a, 0x998b, 0x998c, 0x998d, /*0xb0-0xb7*/
+  0x998e, 0x998f, 0x9990, 0x9991, 0x9992, 0x9993, 0x9994, 0x9995, /*0xb8-0xbf*/
+  0x9996, 0x9997, 0x9998, 0x9999, 0x999a, 0x999b, 0x999c, 0x999d, /*0xc0-0xc7*/
+  0x999e, 0x999f, 0x99a0, 0x99a1, 0x99a2, 0x99a3, 0x99a4, 0x99a5, /*0xc8-0xcf*/
+  0x99a6, 0x99a7, 0x99a8, 0x99a9, 0x99aa, 0x99ab, 0x99ac, 0x99ad, /*0xd0-0xd7*/
+  0x99ae, 0x99af, 0x99b0, 0x99b1, 0x99b2, 0x99b3, 0x99b4, 0x99b5, /*0xd8-0xdf*/
+  0x99b6, 0x99b7, 0x99b8, 0x99b9, 0x99ba, 0x99bb, 0x99bc, 0x99bd, /*0xe0-0xe7*/
+  0x99be, 0x99bf, 0x99c0, 0x99c1, 0x99c2, 0x99c3, 0x99c4, 0x99c5, /*0xe8-0xef*/
+  0x99c6, 0x99c7, 0x99c8, 0x99c9, 0x99ca, 0x99cb, 0x99cc, 0x99cd, /*0xf0-0xf7*/
+  0x99ce, 0x99cf, 0x99d0, 0x99d1, 0x99d2, 0x99d3, 0x99d4, 0x99d5, /*0xf8-0xff*/
+  /* 0x6b00 */
+  0x99d6, 0x99d7, 0x99d8, 0x99d9, 0x99da, 0x99db, 0x99dc, 0x99dd, /*0x00-0x07*/
+  0x99de, 0x99df, 0x99e0, 0x99e1, 0x99e2, 0x99e3, 0x99e4, 0x99e5, /*0x08-0x0f*/
+  0x99e6, 0x99e7, 0x99e8, 0x99e9, 0x99ea, 0x99eb, 0x99ec, 0x99ed, /*0x10-0x17*/
+  0x99ee, 0x99ef, 0x99f0, 0x99f1, 0x99f2, 0x99f3, 0x99f4, 0x99f5, /*0x18-0x1f*/
+  0xc7b7, 0xb4ce, 0xbbb6, 0xd0c0, 0xeca3, 0x99f6, 0x99f7, 0xc5b7, /*0x20-0x27*/
+  0x99f8, 0x99f9, 0x99fa, 0x99fb, 0x99fc, 0x99fd, 0x99fe, 0x9a40, /*0x28-0x2f*/
+  0x9a41, 0x9a42, 0xd3fb, 0x9a43, 0x9a44, 0x9a45, 0x9a46, 0xeca4, /*0x30-0x37*/
+  0x9a47, 0xeca5, 0xc6db, 0x9a48, 0x9a49, 0x9a4a, 0xbfee, 0x9a4b, /*0x38-0x3f*/
+  0x9a4c, 0x9a4d, 0x9a4e, 0xeca6, 0x9a4f, 0x9a50, 0xeca7, 0xd0aa, /*0x40-0x47*/
+  0x9a51, 0xc7b8, 0x9a52, 0x9a53, 0xb8e8, 0x9a54, 0x9a55, 0x9a56, /*0x48-0x4f*/
+  0x9a57, 0x9a58, 0x9a59, 0x9a5a, 0x9a5b, 0x9a5c, 0x9a5d, 0x9a5e, /*0x50-0x57*/
+  0x9a5f, 0xeca8, 0x9a60, 0x9a61, 0x9a62, 0x9a63, 0x9a64, 0x9a65, /*0x58-0x5f*/
+  0x9a66, 0x9a67, 0xd6b9, 0xd5fd, 0xb4cb, 0xb2bd, 0xcee4, 0xc6e7, /*0x60-0x67*/
+  0x9a68, 0x9a69, 0xcde1, 0x9a6a, 0x9a6b, 0x9a6c, 0x9a6d, 0x9a6e, /*0x68-0x6f*/
+  0x9a6f, 0x9a70, 0x9a71, 0x9a72, 0x9a73, 0x9a74, 0x9a75, 0x9a76, /*0x70-0x77*/
+  0x9a77, 0xb4f5, 0x9a78, 0xcbc0, 0xbcdf, 0x9a79, 0x9a7a, 0x9a7b, /*0x78-0x7f*/
+  0x9a7c, 0xe9e2, 0xe9e3, 0xd1ea, 0xe9e5, 0x9a7d, 0xb4f9, 0xe9e4, /*0x80-0x87*/
+  0x9a7e, 0xd1b3, 0xcae2, 0xb2d0, 0x9a80, 0xe9e8, 0x9a81, 0x9a82, /*0x88-0x8f*/
+  0x9a83, 0x9a84, 0xe9e6, 0xe9e7, 0x9a85, 0x9a86, 0xd6b3, 0x9a87, /*0x90-0x97*/
+  0x9a88, 0x9a89, 0xe9e9, 0xe9ea, 0x9a8a, 0x9a8b, 0x9a8c, 0x9a8d, /*0x98-0x9f*/
+  0x9a8e, 0xe9eb, 0x9a8f, 0x9a90, 0x9a91, 0x9a92, 0x9a93, 0x9a94, /*0xa0-0xa7*/
+  0x9a95, 0x9a96, 0xe9ec, 0x9a97, 0x9a98, 0x9a99, 0x9a9a, 0x9a9b, /*0xa8-0xaf*/
+  0x9a9c, 0x9a9d, 0x9a9e, 0xecaf, 0xc5b9, 0xb6ce, 0x9a9f, 0xd2f3, /*0xb0-0xb7*/
+  0x9aa0, 0x9aa1, 0x9aa2, 0x9aa3, 0x9aa4, 0x9aa5, 0x9aa6, 0xb5ee, /*0xb8-0xbf*/
+  0x9aa7, 0xbbd9, 0xecb1, 0x9aa8, 0x9aa9, 0xd2e3, 0x9aaa, 0x9aab, /*0xc0-0xc7*/
+  0x9aac, 0x9aad, 0x9aae, 0xcee3, 0x9aaf, 0xc4b8, 0x9ab0, 0xc3bf, /*0xc8-0xcf*/
+  0x9ab1, 0x9ab2, 0xb6be, 0xd8b9, 0xb1c8, 0xb1cf, 0xb1d1, 0xc5fe, /*0xd0-0xd7*/
+  0x9ab3, 0xb1d0, 0x9ab4, 0xc3ab, 0x9ab5, 0x9ab6, 0x9ab7, 0x9ab8, /*0xd8-0xdf*/
+  0x9ab9, 0xd5b1, 0x9aba, 0x9abb, 0x9abc, 0x9abd, 0x9abe, 0x9abf, /*0xe0-0xe7*/
+  0x9ac0, 0x9ac1, 0xeba4, 0xbac1, 0x9ac2, 0x9ac3, 0x9ac4, 0xccba, /*0xe8-0xef*/
+  0x9ac5, 0x9ac6, 0x9ac7, 0xeba5, 0x9ac8, 0xeba7, 0x9ac9, 0x9aca, /*0xf0-0xf7*/
+  0x9acb, 0xeba8, 0x9acc, 0x9acd, 0x9ace, 0xeba6, 0x9acf, 0x9ad0, /*0xf8-0xff*/
+  /* 0x6c00 */
+  0x9ad1, 0x9ad2, 0x9ad3, 0x9ad4, 0x9ad5, 0xeba9, 0xebab, 0xebaa, /*0x00-0x07*/
+  0x9ad6, 0x9ad7, 0x9ad8, 0x9ad9, 0x9ada, 0xebac, 0x9adb, 0xcacf, /*0x08-0x0f*/
+  0xd8b5, 0xc3f1, 0x9adc, 0xc3a5, 0xc6f8, 0xebad, 0xc4ca, 0x9add, /*0x10-0x17*/
+  0xebae, 0xebaf, 0xebb0, 0xb7d5, 0x9ade, 0x9adf, 0x9ae0, 0xb7fa, /*0x18-0x1f*/
+  0x9ae1, 0xebb1, 0xc7e2, 0x9ae2, 0xebb3, 0x9ae3, 0xbaa4, 0xd1f5, /*0x20-0x27*/
+  0xb0b1, 0xebb2, 0xebb4, 0x9ae4, 0x9ae5, 0x9ae6, 0xb5aa, 0xc2c8, /*0x28-0x2f*/
+  0xc7e8, 0x9ae7, 0xebb5, 0x9ae8, 0xcbae, 0xe3df, 0x9ae9, 0x9aea, /*0x30-0x37*/
+  0xd3c0, 0x9aeb, 0x9aec, 0x9aed, 0x9aee, 0xd9db, 0x9aef, 0x9af0, /*0x38-0x3f*/
+  0xcda1, 0xd6ad, 0xc7f3, 0x9af1, 0x9af2, 0x9af3, 0xd9e0, 0xbbe3, /*0x40-0x47*/
+  0x9af4, 0xbaba, 0xe3e2, 0x9af5, 0x9af6, 0x9af7, 0x9af8, 0x9af9, /*0x48-0x4f*/
+  0xcfab, 0x9afa, 0x9afb, 0x9afc, 0xe3e0, 0xc9c7, 0x9afd, 0xbab9, /*0x50-0x57*/
+  0x9afe, 0x9b40, 0x9b41, 0xd1b4, 0xe3e1, 0xc8ea, 0xb9af, 0xbdad, /*0x58-0x5f*/
+  0xb3d8, 0xcedb, 0x9b42, 0x9b43, 0xccc0, 0x9b44, 0x9b45, 0x9b46, /*0x60-0x67*/
+  0xe3e8, 0xe3e9, 0xcdf4, 0x9b47, 0x9b48, 0x9b49, 0x9b4a, 0x9b4b, /*0x68-0x6f*/
+  0xccad, 0x9b4c, 0xbcb3, 0x9b4d, 0xe3ea, 0x9b4e, 0xe3eb, 0x9b4f, /*0x70-0x77*/
+  0x9b50, 0xd0da, 0x9b51, 0x9b52, 0x9b53, 0xc6fb, 0xb7da, 0x9b54, /*0x78-0x7f*/
+  0x9b55, 0xc7df, 0xd2ca, 0xced6, 0x9b56, 0xe3e4, 0xe3ec, 0x9b57, /*0x80-0x87*/
+  0xc9f2, 0xb3c1, 0x9b58, 0x9b59, 0xe3e7, 0x9b5a, 0x9b5b, 0xc6e3, /*0x88-0x8f*/
+  0xe3e5, 0x9b5c, 0x9b5d, 0xedb3, 0xe3e6, 0x9b5e, 0x9b5f, 0x9b60, /*0x90-0x97*/
+  0x9b61, 0xc9b3, 0x9b62, 0xc5e6, 0x9b63, 0x9b64, 0x9b65, 0xb9b5, /*0x98-0x9f*/
+  0x9b66, 0xc3bb, 0x9b67, 0xe3e3, 0xc5bd, 0xc1a4, 0xc2d9, 0xb2d7, /*0xa0-0xa7*/
+  0x9b68, 0xe3ed, 0xbba6, 0xc4ad, 0x9b69, 0xe3f0, 0xbeda, 0x9b6a, /*0xa8-0xaf*/
+  0x9b6b, 0xe3fb, 0xe3f5, 0xbad3, 0x9b6c, 0x9b6d, 0x9b6e, 0x9b6f, /*0xb0-0xb7*/
+  0xb7d0, 0xd3cd, 0x9b70, 0xd6ce, 0xd5d3, 0xb9c1, 0xd5b4, 0xd1d8, /*0xb8-0xbf*/
+  0x9b71, 0x9b72, 0x9b73, 0x9b74, 0xd0b9, 0xc7f6, 0x9b75, 0x9b76, /*0xc0-0xc7*/
+  0x9b77, 0xc8aa, 0xb2b4, 0x9b78, 0xc3da, 0x9b79, 0x9b7a, 0x9b7b, /*0xc8-0xcf*/
+  0xe3ee, 0x9b7c, 0x9b7d, 0xe3fc, 0xe3ef, 0xb7a8, 0xe3f7, 0xe3f4, /*0xd0-0xd7*/
+  0x9b7e, 0x9b80, 0x9b81, 0xb7ba, 0x9b82, 0x9b83, 0xc5a2, 0x9b84, /*0xd8-0xdf*/
+  0xe3f6, 0xc5dd, 0xb2a8, 0xc6fc, 0x9b85, 0xc4e0, 0x9b86, 0x9b87, /*0xe0-0xe7*/
+  0xd7a2, 0x9b88, 0xc0e1, 0xe3f9, 0x9b89, 0x9b8a, 0xe3fa, 0xe3fd, /*0xe8-0xef*/
+  0xcca9, 0xe3f3, 0x9b8b, 0xd3be, 0x9b8c, 0xb1c3, 0xedb4, 0xe3f1, /*0xf0-0xf7*/
+  0xe3f2, 0x9b8d, 0xe3f8, 0xd0ba, 0xc6c3, 0xd4f3, 0xe3fe, 0x9b8e, /*0xf8-0xff*/
+  /* 0x6d00 */
+  0x9b8f, 0xbde0, 0x9b90, 0x9b91, 0xe4a7, 0x9b92, 0x9b93, 0xe4a6, /*0x00-0x07*/
+  0x9b94, 0x9b95, 0x9b96, 0xd1f3, 0xe4a3, 0x9b97, 0xe4a9, 0x9b98, /*0x08-0x0f*/
+  0x9b99, 0x9b9a, 0xc8f7, 0x9b9b, 0x9b9c, 0x9b9d, 0x9b9e, 0xcfb4, /*0x10-0x17*/
+  0x9b9f, 0xe4a8, 0xe4ae, 0xc2e5, 0x9ba0, 0x9ba1, 0xb6b4, 0x9ba2, /*0x18-0x1f*/
+  0x9ba3, 0x9ba4, 0x9ba5, 0x9ba6, 0x9ba7, 0xbdf2, 0x9ba8, 0xe4a2, /*0x20-0x27*/
+  0x9ba9, 0x9baa, 0xbae9, 0xe4aa, 0x9bab, 0x9bac, 0xe4ac, 0x9bad, /*0x28-0x2f*/
+  0x9bae, 0xb6fd, 0xd6de, 0xe4b2, 0x9baf, 0xe4ad, 0x9bb0, 0x9bb1, /*0x30-0x37*/
+  0x9bb2, 0xe4a1, 0x9bb3, 0xbbee, 0xcddd, 0xc7a2, 0xc5c9, 0x9bb4, /*0x38-0x3f*/
+  0x9bb5, 0xc1f7, 0x9bb6, 0xe4a4, 0x9bb7, 0xc7b3, 0xbdac, 0xbdbd, /*0x40-0x47*/
+  0xe4a5, 0x9bb8, 0xd7c7, 0xb2e2, 0x9bb9, 0xe4ab, 0xbcc3, 0xe4af, /*0x48-0x4f*/
+  0x9bba, 0xbbeb, 0xe4b0, 0xc5a8, 0xe4b1, 0x9bbb, 0x9bbc, 0x9bbd, /*0x50-0x57*/
+  0x9bbe, 0xd5e3, 0xbfa3, 0x9bbf, 0xe4ba, 0x9bc0, 0xe4b7, 0x9bc1, /*0x58-0x5f*/
+  0xe4bb, 0x9bc2, 0x9bc3, 0xe4bd, 0x9bc4, 0x9bc5, 0xc6d6, 0x9bc6, /*0x60-0x67*/
+  0x9bc7, 0xbac6, 0xc0cb, 0x9bc8, 0x9bc9, 0x9bca, 0xb8a1, 0xe4b4, /*0x68-0x6f*/
+  0x9bcb, 0x9bcc, 0x9bcd, 0x9bce, 0xd4a1, 0x9bcf, 0x9bd0, 0xbaa3, /*0x70-0x77*/
+  0xbdfe, 0x9bd1, 0x9bd2, 0x9bd3, 0xe4bc, 0x9bd4, 0x9bd5, 0x9bd6, /*0x78-0x7f*/
+  0x9bd7, 0x9bd8, 0xcdbf, 0x9bd9, 0x9bda, 0xc4f9, 0x9bdb, 0x9bdc, /*0x80-0x87*/
+  0xcffb, 0xc9e6, 0x9bdd, 0x9bde, 0xd3bf, 0x9bdf, 0xcfd1, 0x9be0, /*0x88-0x8f*/
+  0x9be1, 0xe4b3, 0x9be2, 0xe4b8, 0xe4b9, 0xcce9, 0x9be3, 0x9be4, /*0x90-0x97*/
+  0x9be5, 0x9be6, 0x9be7, 0xccce, 0x9be8, 0xc0d4, 0xe4b5, 0xc1b0, /*0x98-0x9f*/
+  0xe4b6, 0xced0, 0x9be9, 0xbbc1, 0xb5d3, 0x9bea, 0xc8f3, 0xbda7, /*0xa0-0xa7*/
+  0xd5c7, 0xc9ac, 0xb8a2, 0xe4ca, 0x9beb, 0x9bec, 0xe4cc, 0xd1c4, /*0xa8-0xaf*/
+  0x9bed, 0x9bee, 0xd2ba, 0x9bef, 0x9bf0, 0xbaad, 0x9bf1, 0x9bf2, /*0xb0-0xb7*/
+  0xbad4, 0x9bf3, 0x9bf4, 0x9bf5, 0x9bf6, 0x9bf7, 0x9bf8, 0xe4c3, /*0xb8-0xbf*/
+  0xb5ed, 0x9bf9, 0x9bfa, 0x9bfb, 0xd7cd, 0xe4c0, 0xcffd, 0xe4bf, /*0xc0-0xc7*/
+  0x9bfc, 0x9bfd, 0x9bfe, 0xc1dc, 0xccca, 0x9c40, 0x9c41, 0x9c42, /*0xc8-0xcf*/
+  0x9c43, 0xcae7, 0x9c44, 0x9c45, 0x9c46, 0x9c47, 0xc4d7, 0x9c48, /*0xd0-0xd7*/
+  0xccd4, 0xe4c8, 0x9c49, 0x9c4a, 0x9c4b, 0xe4c7, 0xe4c1, 0x9c4c, /*0xd8-0xdf*/
+  0xe4c4, 0xb5ad, 0x9c4d, 0x9c4e, 0xd3d9, 0x9c4f, 0xe4c6, 0x9c50, /*0xe0-0xe7*/
+  0x9c51, 0x9c52, 0x9c53, 0xd2f9, 0xb4e3, 0x9c54, 0xbbb4, 0x9c55, /*0xe8-0xef*/
+  0x9c56, 0xc9ee, 0x9c57, 0xb4be, 0x9c58, 0x9c59, 0x9c5a, 0xbbec, /*0xf0-0xf7*/
+  0x9c5b, 0xd1cd, 0x9c5c, 0xcced, 0xedb5, 0x9c5d, 0x9c5e, 0x9c5f, /*0xf8-0xff*/
+  /* 0x6e00 */
+  0x9c60, 0x9c61, 0x9c62, 0x9c63, 0x9c64, 0xc7e5, 0x9c65, 0x9c66, /*0x00-0x07*/
+  0x9c67, 0x9c68, 0xd4a8, 0x9c69, 0xe4cb, 0xd7d5, 0xe4c2, 0x9c6a, /*0x08-0x0f*/
+  0xbda5, 0xe4c5, 0x9c6b, 0x9c6c, 0xd3e6, 0x9c6d, 0xe4c9, 0xc9f8, /*0x10-0x17*/
+  0x9c6e, 0x9c6f, 0xe4be, 0x9c70, 0x9c71, 0xd3e5, 0x9c72, 0x9c73, /*0x18-0x1f*/
+  0xc7fe, 0xb6c9, 0x9c74, 0xd4fc, 0xb2b3, 0xe4d7, 0x9c75, 0x9c76, /*0x20-0x27*/
+  0x9c77, 0xcec2, 0x9c78, 0xe4cd, 0x9c79, 0xcebc, 0x9c7a, 0xb8db, /*0x28-0x2f*/
+  0x9c7b, 0x9c7c, 0xe4d6, 0x9c7d, 0xbfca, 0x9c7e, 0x9c80, 0x9c81, /*0x30-0x37*/
+  0xd3ce, 0x9c82, 0xc3ec, 0x9c83, 0x9c84, 0x9c85, 0x9c86, 0x9c87, /*0x38-0x3f*/
+  0x9c88, 0x9c89, 0x9c8a, 0xc5c8, 0xe4d8, 0x9c8b, 0x9c8c, 0x9c8d, /*0x40-0x47*/
+  0x9c8e, 0x9c8f, 0x9c90, 0x9c91, 0x9c92, 0xcdc4, 0xe4cf, 0x9c93, /*0x48-0x4f*/
+  0x9c94, 0x9c95, 0x9c96, 0xe4d4, 0xe4d5, 0x9c97, 0xbafe, 0x9c98, /*0x50-0x57*/
+  0xcfe6, 0x9c99, 0x9c9a, 0xd5bf, 0x9c9b, 0x9c9c, 0x9c9d, 0xe4d2, /*0x58-0x5f*/
+  0x9c9e, 0x9c9f, 0x9ca0, 0x9ca1, 0x9ca2, 0x9ca3, 0x9ca4, 0x9ca5, /*0x60-0x67*/
+  0x9ca6, 0x9ca7, 0x9ca8, 0xe4d0, 0x9ca9, 0x9caa, 0xe4ce, 0x9cab, /*0x68-0x6f*/
+  0x9cac, 0x9cad, 0x9cae, 0x9caf, 0x9cb0, 0x9cb1, 0x9cb2, 0x9cb3, /*0x70-0x77*/
+  0x9cb4, 0x9cb5, 0x9cb6, 0x9cb7, 0x9cb8, 0x9cb9, 0xcde5, 0xcaaa, /*0x78-0x7f*/
+  0x9cba, 0x9cbb, 0x9cbc, 0xc0a3, 0x9cbd, 0xbda6, 0xe4d3, 0x9cbe, /*0x80-0x87*/
+  0x9cbf, 0xb8c8, 0x9cc0, 0x9cc1, 0x9cc2, 0x9cc3, 0x9cc4, 0xe4e7, /*0x88-0x8f*/
+  0xd4b4, 0x9cc5, 0x9cc6, 0x9cc7, 0x9cc8, 0x9cc9, 0x9cca, 0x9ccb, /*0x90-0x97*/
+  0xe4db, 0x9ccc, 0x9ccd, 0x9cce, 0xc1ef, 0x9ccf, 0x9cd0, 0xe4e9, /*0x98-0x9f*/
+  0x9cd1, 0x9cd2, 0xd2e7, 0x9cd3, 0x9cd4, 0xe4df, 0x9cd5, 0xe4e0, /*0xa0-0xa7*/
+  0x9cd6, 0x9cd7, 0xcfaa, 0x9cd8, 0x9cd9, 0x9cda, 0x9cdb, 0xcbdd, /*0xa8-0xaf*/
+  0x9cdc, 0xe4da, 0xe4d1, 0x9cdd, 0xe4e5, 0x9cde, 0xc8dc, 0xe4e3, /*0xb0-0xb7*/
+  0x9cdf, 0x9ce0, 0xc4e7, 0xe4e2, 0x9ce1, 0xe4e1, 0x9ce2, 0x9ce3, /*0xb8-0xbf*/
+  0x9ce4, 0xb3fc, 0xe4e8, 0x9ce5, 0x9ce6, 0x9ce7, 0x9ce8, 0xb5e1, /*0xc0-0xc7*/
+  0x9ce9, 0x9cea, 0x9ceb, 0xd7cc, 0x9cec, 0x9ced, 0x9cee, 0xe4e6, /*0xc8-0xcf*/
+  0x9cef, 0xbbac, 0x9cf0, 0xd7d2, 0xcccf, 0xebf8, 0x9cf1, 0xe4e4, /*0xd0-0xd7*/
+  0x9cf2, 0x9cf3, 0xb9f6, 0x9cf4, 0x9cf5, 0x9cf6, 0xd6cd, 0xe4d9, /*0xd8-0xdf*/
+  0xe4dc, 0xc2fa, 0xe4de, 0x9cf7, 0xc2cb, 0xc0c4, 0xc2d0, 0x9cf8, /*0xe0-0xe7*/
+  0xb1f5, 0xccb2, 0x9cf9, 0x9cfa, 0x9cfb, 0x9cfc, 0x9cfd, 0x9cfe, /*0xe8-0xef*/
+  0x9d40, 0x9d41, 0x9d42, 0x9d43, 0xb5ce, 0x9d44, 0x9d45, 0x9d46, /*0xf0-0xf7*/
+  0x9d47, 0xe4ef, 0x9d48, 0x9d49, 0x9d4a, 0x9d4b, 0x9d4c, 0x9d4d, /*0xf8-0xff*/
+  /* 0x6f00 */
+  0x9d4e, 0x9d4f, 0xc6af, 0x9d50, 0x9d51, 0x9d52, 0xc6e1, 0x9d53, /*0x00-0x07*/
+  0x9d54, 0xe4f5, 0x9d55, 0x9d56, 0x9d57, 0x9d58, 0x9d59, 0xc2a9, /*0x08-0x0f*/
+  0x9d5a, 0x9d5b, 0x9d5c, 0xc0ec, 0xd1dd, 0xe4ee, 0x9d5d, 0x9d5e, /*0x10-0x17*/
+  0x9d5f, 0x9d60, 0x9d61, 0x9d62, 0x9d63, 0x9d64, 0x9d65, 0x9d66, /*0x18-0x1f*/
+  0xc4ae, 0x9d67, 0x9d68, 0x9d69, 0xe4ed, 0x9d6a, 0x9d6b, 0x9d6c, /*0x20-0x27*/
+  0x9d6d, 0xe4f6, 0xe4f4, 0xc2fe, 0x9d6e, 0xe4dd, 0x9d6f, 0xe4f0, /*0x28-0x2f*/
+  0x9d70, 0xcafe, 0x9d71, 0xd5c4, 0x9d72, 0x9d73, 0xe4f1, 0x9d74, /*0x30-0x37*/
+  0x9d75, 0x9d76, 0x9d77, 0x9d78, 0x9d79, 0x9d7a, 0xd1fa, 0x9d7b, /*0x38-0x3f*/
+  0x9d7c, 0x9d7d, 0x9d7e, 0x9d80, 0x9d81, 0x9d82, 0xe4eb, 0xe4ec, /*0x40-0x47*/
+  0x9d83, 0x9d84, 0x9d85, 0xe4f2, 0x9d86, 0xceab, 0x9d87, 0x9d88, /*0x48-0x4f*/
+  0x9d89, 0x9d8a, 0x9d8b, 0x9d8c, 0x9d8d, 0x9d8e, 0x9d8f, 0x9d90, /*0x50-0x57*/
+  0xc5cb, 0x9d91, 0x9d92, 0x9d93, 0xc7b1, 0x9d94, 0xc2ba, 0x9d95, /*0x58-0x5f*/
+  0x9d96, 0x9d97, 0xe4ea, 0x9d98, 0x9d99, 0x9d9a, 0xc1ca, 0x9d9b, /*0x60-0x67*/
+  0x9d9c, 0x9d9d, 0x9d9e, 0x9d9f, 0x9da0, 0xccb6, 0xb3b1, 0x9da1, /*0x68-0x6f*/
+  0x9da2, 0x9da3, 0xe4fb, 0x9da4, 0xe4f3, 0x9da5, 0x9da6, 0x9da7, /*0x70-0x77*/
+  0xe4fa, 0x9da8, 0xe4fd, 0x9da9, 0xe4fc, 0x9daa, 0x9dab, 0x9dac, /*0x78-0x7f*/
+  0x9dad, 0x9dae, 0x9daf, 0x9db0, 0xb3ce, 0x9db1, 0x9db2, 0x9db3, /*0x80-0x87*/
+  0xb3ba, 0xe4f7, 0x9db4, 0x9db5, 0xe4f9, 0xe4f8, 0xc5ec, 0x9db6, /*0x88-0x8f*/
+  0x9db7, 0x9db8, 0x9db9, 0x9dba, 0x9dbb, 0x9dbc, 0x9dbd, 0x9dbe, /*0x90-0x97*/
+  0x9dbf, 0x9dc0, 0x9dc1, 0x9dc2, 0xc0bd, 0x9dc3, 0x9dc4, 0x9dc5, /*0x98-0x9f*/
+  0x9dc6, 0xd4e8, 0x9dc7, 0x9dc8, 0x9dc9, 0x9dca, 0x9dcb, 0xe5a2, /*0xa0-0xa7*/
+  0x9dcc, 0x9dcd, 0x9dce, 0x9dcf, 0x9dd0, 0x9dd1, 0x9dd2, 0x9dd3, /*0xa8-0xaf*/
+  0x9dd4, 0x9dd5, 0x9dd6, 0xb0c4, 0x9dd7, 0x9dd8, 0xe5a4, 0x9dd9, /*0xb0-0xb7*/
+  0x9dda, 0xe5a3, 0x9ddb, 0x9ddc, 0x9ddd, 0x9dde, 0x9ddf, 0x9de0, /*0xb8-0xbf*/
+  0xbca4, 0x9de1, 0xe5a5, 0x9de2, 0x9de3, 0x9de4, 0x9de5, 0x9de6, /*0xc0-0xc7*/
+  0x9de7, 0xe5a1, 0x9de8, 0x9de9, 0x9dea, 0x9deb, 0x9dec, 0x9ded, /*0xc8-0xcf*/
+  0x9dee, 0xe4fe, 0xb1f4, 0x9def, 0x9df0, 0x9df1, 0x9df2, 0x9df3, /*0xd0-0xd7*/
+  0x9df4, 0x9df5, 0x9df6, 0x9df7, 0x9df8, 0x9df9, 0xe5a8, 0x9dfa, /*0xd8-0xdf*/
+  0xe5a9, 0xe5a6, 0x9dfb, 0x9dfc, 0x9dfd, 0x9dfe, 0x9e40, 0x9e41, /*0xe0-0xe7*/
+  0x9e42, 0x9e43, 0x9e44, 0x9e45, 0x9e46, 0x9e47, 0xe5a7, 0xe5aa, /*0xe8-0xef*/
+  0x9e48, 0x9e49, 0x9e4a, 0x9e4b, 0x9e4c, 0x9e4d, 0x9e4e, 0x9e4f, /*0xf0-0xf7*/
+  0x9e50, 0x9e51, 0x9e52, 0x9e53, 0x9e54, 0x9e55, 0x9e56, 0x9e57, /*0xf8-0xff*/
+  /* 0x7000 */
+  0x9e58, 0x9e59, 0x9e5a, 0x9e5b, 0x9e5c, 0x9e5d, 0x9e5e, 0x9e5f, /*0x00-0x07*/
+  0x9e60, 0x9e61, 0x9e62, 0x9e63, 0x9e64, 0x9e65, 0x9e66, 0x9e67, /*0x08-0x0f*/
+  0x9e68, 0xc6d9, 0x9e69, 0x9e6a, 0x9e6b, 0x9e6c, 0x9e6d, 0x9e6e, /*0x10-0x17*/
+  0x9e6f, 0x9e70, 0xe5ab, 0xe5ad, 0x9e71, 0x9e72, 0x9e73, 0x9e74, /*0x18-0x1f*/
+  0x9e75, 0x9e76, 0x9e77, 0xe5ac, 0x9e78, 0x9e79, 0x9e7a, 0x9e7b, /*0x20-0x27*/
+  0x9e7c, 0x9e7d, 0x9e7e, 0x9e80, 0x9e81, 0x9e82, 0x9e83, 0x9e84, /*0x28-0x2f*/
+  0x9e85, 0x9e86, 0x9e87, 0x9e88, 0x9e89, 0xe5af, 0x9e8a, 0x9e8b, /*0x30-0x37*/
+  0x9e8c, 0xe5ae, 0x9e8d, 0x9e8e, 0x9e8f, 0x9e90, 0x9e91, 0x9e92, /*0x38-0x3f*/
+  0x9e93, 0x9e94, 0x9e95, 0x9e96, 0x9e97, 0x9e98, 0x9e99, 0x9e9a, /*0x40-0x47*/
+  0x9e9b, 0x9e9c, 0x9e9d, 0x9e9e, 0xb9e0, 0x9e9f, 0x9ea0, 0xe5b0, /*0x48-0x4f*/
+  0x9ea1, 0x9ea2, 0x9ea3, 0x9ea4, 0x9ea5, 0x9ea6, 0x9ea7, 0x9ea8, /*0x50-0x57*/
+  0x9ea9, 0x9eaa, 0x9eab, 0x9eac, 0x9ead, 0x9eae, 0xe5b1, 0x9eaf, /*0x58-0x5f*/
+  0x9eb0, 0x9eb1, 0x9eb2, 0x9eb3, 0x9eb4, 0x9eb5, 0x9eb6, 0x9eb7, /*0x60-0x67*/
+  0x9eb8, 0x9eb9, 0x9eba, 0xbbf0, 0xece1, 0xc3f0, 0x9ebb, 0xb5c6, /*0x68-0x6f*/
+  0xbbd2, 0x9ebc, 0x9ebd, 0x9ebe, 0x9ebf, 0xc1e9, 0xd4ee, 0x9ec0, /*0x70-0x77*/
+  0xbec4, 0x9ec1, 0x9ec2, 0x9ec3, 0xd7c6, 0x9ec4, 0xd4d6, 0xb2d3, /*0x78-0x7f*/
+  0xecbe, 0x9ec5, 0x9ec6, 0x9ec7, 0x9ec8, 0xeac1, 0x9ec9, 0x9eca, /*0x80-0x87*/
+  0x9ecb, 0xc2af, 0xb4b6, 0x9ecc, 0x9ecd, 0x9ece, 0xd1d7, 0x9ecf, /*0x88-0x8f*/
+  0x9ed0, 0x9ed1, 0xb3b4, 0x9ed2, 0xc8b2, 0xbfbb, 0xecc0, 0x9ed3, /*0x90-0x97*/
+  0x9ed4, 0xd6cb, 0x9ed5, 0x9ed6, 0xecbf, 0xecc1, 0x9ed7, 0x9ed8, /*0x98-0x9f*/
+  0x9ed9, 0x9eda, 0x9edb, 0x9edc, 0x9edd, 0x9ede, 0x9edf, 0x9ee0, /*0xa0-0xa7*/
+  0x9ee1, 0x9ee2, 0x9ee3, 0xecc5, 0xbee6, 0xccbf, 0xc5da, 0xbebc, /*0xa8-0xaf*/
+  0x9ee4, 0xecc6, 0x9ee5, 0xb1fe, 0x9ee6, 0x9ee7, 0x9ee8, 0xecc4, /*0xb0-0xb7*/
+  0xd5a8, 0xb5e3, 0x9ee9, 0xecc2, 0xc1b6, 0xb3e3, 0x9eea, 0x9eeb, /*0xb8-0xbf*/
+  0xecc3, 0xcbb8, 0xc0c3, 0xccfe, 0x9eec, 0x9eed, 0x9eee, 0x9eef, /*0xc0-0xc7*/
+  0xc1d2, 0x9ef0, 0xecc8, 0x9ef1, 0x9ef2, 0x9ef3, 0x9ef4, 0x9ef5, /*0xc8-0xcf*/
+  0x9ef6, 0x9ef7, 0x9ef8, 0x9ef9, 0x9efa, 0x9efb, 0x9efc, 0x9efd, /*0xd0-0xd7*/
+  0xbae6, 0xc0d3, 0x9efe, 0xd6f2, 0x9f40, 0x9f41, 0x9f42, 0xd1cc, /*0xd8-0xdf*/
+  0x9f43, 0x9f44, 0x9f45, 0x9f46, 0xbfbe, 0x9f47, 0xb7b3, 0xc9d5, /*0xe0-0xe7*/
+  0xecc7, 0xbbe2, 0x9f48, 0xcccc, 0xbdfd, 0xc8c8, 0x9f49, 0xcfa9, /*0xe8-0xef*/
+  0x9f4a, 0x9f4b, 0x9f4c, 0x9f4d, 0x9f4e, 0x9f4f, 0x9f50, 0xcde9, /*0xf0-0xf7*/
+  0x9f51, 0xc5eb, 0x9f52, 0x9f53, 0x9f54, 0xb7e9, 0x9f55, 0x9f56, /*0xf8-0xff*/
+  /* 0x7100 */
+  0x9f57, 0x9f58, 0x9f59, 0x9f5a, 0x9f5b, 0x9f5c, 0x9f5d, 0x9f5e, /*0x00-0x07*/
+  0x9f5f, 0xd1c9, 0xbab8, 0x9f60, 0x9f61, 0x9f62, 0x9f63, 0x9f64, /*0x08-0x0f*/
+  0xecc9, 0x9f65, 0x9f66, 0xecca, 0x9f67, 0xbbc0, 0xeccb, 0x9f68, /*0x10-0x17*/
+  0xece2, 0xb1ba, 0xb7d9, 0x9f69, 0x9f6a, 0x9f6b, 0x9f6c, 0x9f6d, /*0x18-0x1f*/
+  0x9f6e, 0x9f6f, 0x9f70, 0x9f71, 0x9f72, 0x9f73, 0xbdb9, 0x9f74, /*0x20-0x27*/
+  0x9f75, 0x9f76, 0x9f77, 0x9f78, 0x9f79, 0x9f7a, 0x9f7b, 0xeccc, /*0x28-0x2f*/
+  0xd1e6, 0xeccd, 0x9f7c, 0x9f7d, 0x9f7e, 0x9f80, 0xc8bb, 0x9f81, /*0x30-0x37*/
+  0x9f82, 0x9f83, 0x9f84, 0x9f85, 0x9f86, 0x9f87, 0x9f88, 0x9f89, /*0x38-0x3f*/
+  0x9f8a, 0x9f8b, 0x9f8c, 0x9f8d, 0x9f8e, 0xecd1, 0x9f8f, 0x9f90, /*0x40-0x47*/
+  0x9f91, 0x9f92, 0xecd3, 0x9f93, 0xbbcd, 0x9f94, 0xbce5, 0x9f95, /*0x48-0x4f*/
+  0x9f96, 0x9f97, 0x9f98, 0x9f99, 0x9f9a, 0x9f9b, 0x9f9c, 0x9f9d, /*0x50-0x57*/
+  0x9f9e, 0x9f9f, 0x9fa0, 0x9fa1, 0xeccf, 0x9fa2, 0xc9b7, 0x9fa3, /*0x58-0x5f*/
+  0x9fa4, 0x9fa5, 0x9fa6, 0x9fa7, 0xc3ba, 0x9fa8, 0xece3, 0xd5d5, /*0x60-0x67*/
+  0xecd0, 0x9fa9, 0x9faa, 0x9fab, 0x9fac, 0x9fad, 0xd6f3, 0x9fae, /*0x68-0x6f*/
+  0x9faf, 0x9fb0, 0xecd2, 0xecce, 0x9fb1, 0x9fb2, 0x9fb3, 0x9fb4, /*0x70-0x77*/
+  0xecd4, 0x9fb5, 0xecd5, 0x9fb6, 0x9fb7, 0xc9bf, 0x9fb8, 0x9fb9, /*0x78-0x7f*/
+  0x9fba, 0x9fbb, 0x9fbc, 0x9fbd, 0xcfa8, 0x9fbe, 0x9fbf, 0x9fc0, /*0x80-0x87*/
+  0x9fc1, 0x9fc2, 0xd0dc, 0x9fc3, 0x9fc4, 0x9fc5, 0x9fc6, 0xd1ac, /*0x88-0x8f*/
+  0x9fc7, 0x9fc8, 0x9fc9, 0x9fca, 0xc8db, 0x9fcb, 0x9fcc, 0x9fcd, /*0x90-0x97*/
+  0xecd6, 0xcef5, 0x9fce, 0x9fcf, 0x9fd0, 0x9fd1, 0x9fd2, 0xcaec, /*0x98-0x9f*/
+  0xecda, 0x9fd3, 0x9fd4, 0x9fd5, 0x9fd6, 0x9fd7, 0x9fd8, 0x9fd9, /*0xa0-0xa7*/
+  0xecd9, 0x9fda, 0x9fdb, 0x9fdc, 0xb0be, 0x9fdd, 0x9fde, 0x9fdf, /*0xa8-0xaf*/
+  0x9fe0, 0x9fe1, 0x9fe2, 0xecd7, 0x9fe3, 0xecd8, 0x9fe4, 0x9fe5, /*0xb0-0xb7*/
+  0x9fe6, 0xece4, 0x9fe7, 0x9fe8, 0x9fe9, 0x9fea, 0x9feb, 0x9fec, /*0xb8-0xbf*/
+  0x9fed, 0x9fee, 0x9fef, 0xc8bc, 0x9ff0, 0x9ff1, 0x9ff2, 0x9ff3, /*0xc0-0xc7*/
+  0x9ff4, 0x9ff5, 0x9ff6, 0x9ff7, 0x9ff8, 0x9ff9, 0xc1c7, 0x9ffa, /*0xc8-0xcf*/
+  0x9ffb, 0x9ffc, 0x9ffd, 0x9ffe, 0xecdc, 0xd1e0, 0xa040, 0xa041, /*0xd0-0xd7*/
+  0xa042, 0xa043, 0xa044, 0xa045, 0xa046, 0xa047, 0xa048, 0xa049, /*0xd8-0xdf*/
+  0xecdb, 0xa04a, 0xa04b, 0xa04c, 0xa04d, 0xd4ef, 0xa04e, 0xecdd, /*0xe0-0xe7*/
+  0xa04f, 0xa050, 0xa051, 0xa052, 0xa053, 0xa054, 0xdbc6, 0xa055, /*0xe8-0xef*/
+  0xa056, 0xa057, 0xa058, 0xa059, 0xa05a, 0xa05b, 0xa05c, 0xa05d, /*0xf0-0xf7*/
+  0xa05e, 0xecde, 0xa05f, 0xa060, 0xa061, 0xa062, 0xa063, 0xa064, /*0xf8-0xff*/
+  /* 0x7200 */
+  0xa065, 0xa066, 0xa067, 0xa068, 0xa069, 0xa06a, 0xb1ac, 0xa06b, /*0x00-0x07*/
+  0xa06c, 0xa06d, 0xa06e, 0xa06f, 0xa070, 0xa071, 0xa072, 0xa073, /*0x08-0x0f*/
+  0xa074, 0xa075, 0xa076, 0xa077, 0xa078, 0xa079, 0xa07a, 0xa07b, /*0x10-0x17*/
+  0xa07c, 0xa07d, 0xa07e, 0xa080, 0xa081, 0xecdf, 0xa082, 0xa083, /*0x18-0x1f*/
+  0xa084, 0xa085, 0xa086, 0xa087, 0xa088, 0xa089, 0xa08a, 0xa08b, /*0x20-0x27*/
+  0xece0, 0xa08c, 0xd7a6, 0xa08d, 0xc5c0, 0xa08e, 0xa08f, 0xa090, /*0x28-0x2f*/
+  0xebbc, 0xb0ae, 0xa091, 0xa092, 0xa093, 0xbef4, 0xb8b8, 0xd2af, /*0x30-0x37*/
+  0xb0d6, 0xb5f9, 0xa094, 0xd8b3, 0xa095, 0xcbac, 0xa096, 0xe3dd, /*0x38-0x3f*/
+  0xa097, 0xa098, 0xa099, 0xa09a, 0xa09b, 0xa09c, 0xa09d, 0xc6ac, /*0x40-0x47*/
+  0xb0e6, 0xa09e, 0xa09f, 0xa0a0, 0xc5c6, 0xebb9, 0xa0a1, 0xa0a2, /*0x48-0x4f*/
+  0xa0a3, 0xa0a4, 0xebba, 0xa0a5, 0xa0a6, 0xa0a7, 0xebbb, 0xa0a8, /*0x50-0x57*/
+  0xa0a9, 0xd1c0, 0xa0aa, 0xc5a3, 0xa0ab, 0xeaf2, 0xa0ac, 0xc4b2, /*0x58-0x5f*/
+  0xa0ad, 0xc4b5, 0xc0ce, 0xa0ae, 0xa0af, 0xa0b0, 0xeaf3, 0xc4c1, /*0x60-0x67*/
+  0xa0b1, 0xceef, 0xa0b2, 0xa0b3, 0xa0b4, 0xa0b5, 0xeaf0, 0xeaf4, /*0x68-0x6f*/
+  0xa0b6, 0xa0b7, 0xc9fc, 0xa0b8, 0xa0b9, 0xc7a3, 0xa0ba, 0xa0bb, /*0x70-0x77*/
+  0xa0bc, 0xccd8, 0xcefe, 0xa0bd, 0xa0be, 0xa0bf, 0xeaf5, 0xeaf6, /*0x78-0x7f*/
+  0xcfac, 0xc0e7, 0xa0c0, 0xa0c1, 0xeaf7, 0xa0c2, 0xa0c3, 0xa0c4, /*0x80-0x87*/
+  0xa0c5, 0xa0c6, 0xb6bf, 0xeaf8, 0xa0c7, 0xeaf9, 0xa0c8, 0xeafa, /*0x88-0x8f*/
+  0xa0c9, 0xa0ca, 0xeafb, 0xa0cb, 0xa0cc, 0xa0cd, 0xa0ce, 0xa0cf, /*0x90-0x97*/
+  0xa0d0, 0xa0d1, 0xa0d2, 0xa0d3, 0xa0d4, 0xa0d5, 0xa0d6, 0xeaf1, /*0x98-0x9f*/
+  0xa0d7, 0xa0d8, 0xa0d9, 0xa0da, 0xa0db, 0xa0dc, 0xa0dd, 0xa0de, /*0xa0-0xa7*/
+  0xa0df, 0xa0e0, 0xa0e1, 0xa0e2, 0xc8ae, 0xe1eb, 0xa0e3, 0xb7b8, /*0xa8-0xaf*/
+  0xe1ec, 0xa0e4, 0xa0e5, 0xa0e6, 0xe1ed, 0xa0e7, 0xd7b4, 0xe1ee, /*0xb0-0xb7*/
+  0xe1ef, 0xd3cc, 0xa0e8, 0xa0e9, 0xa0ea, 0xa0eb, 0xa0ec, 0xa0ed, /*0xb8-0xbf*/
+  0xa0ee, 0xe1f1, 0xbff1, 0xe1f0, 0xb5d2, 0xa0ef, 0xa0f0, 0xa0f1, /*0xc0-0xc7*/
+  0xb1b7, 0xa0f2, 0xa0f3, 0xa0f4, 0xa0f5, 0xe1f3, 0xe1f2, 0xa0f6, /*0xc8-0xcf*/
+  0xbafc, 0xa0f7, 0xe1f4, 0xa0f8, 0xa0f9, 0xa0fa, 0xa0fb, 0xb9b7, /*0xd0-0xd7*/
+  0xa0fc, 0xbed1, 0xa0fd, 0xa0fe, 0xaa40, 0xaa41, 0xc4fc, 0xaa42, /*0xd8-0xdf*/
+  0xbadd, 0xbdc6, 0xaa43, 0xaa44, 0xaa45, 0xaa46, 0xaa47, 0xaa48, /*0xe0-0xe7*/
+  0xe1f5, 0xe1f7, 0xaa49, 0xaa4a, 0xb6c0, 0xcfc1, 0xcaa8, 0xe1f6, /*0xe8-0xef*/
+  0xd5f8, 0xd3fc, 0xe1f8, 0xe1fc, 0xe1f9, 0xaa4b, 0xaa4c, 0xe1fa, /*0xf0-0xf7*/
+  0xc0ea, 0xaa4d, 0xe1fe, 0xe2a1, 0xc0c7, 0xaa4e, 0xaa4f, 0xaa50, /*0xf8-0xff*/
+  /* 0x7300 */
+  0xaa51, 0xe1fb, 0xaa52, 0xe1fd, 0xaa53, 0xaa54, 0xaa55, 0xaa56, /*0x00-0x07*/
+  0xaa57, 0xaa58, 0xe2a5, 0xaa59, 0xaa5a, 0xaa5b, 0xc1d4, 0xaa5c, /*0x08-0x0f*/
+  0xaa5d, 0xaa5e, 0xaa5f, 0xe2a3, 0xaa60, 0xe2a8, 0xb2fe, 0xe2a2, /*0x10-0x17*/
+  0xaa61, 0xaa62, 0xaa63, 0xc3cd, 0xb2c2, 0xe2a7, 0xe2a6, 0xaa64, /*0x18-0x1f*/
+  0xaa65, 0xe2a4, 0xe2a9, 0xaa66, 0xaa67, 0xe2ab, 0xaa68, 0xaa69, /*0x20-0x27*/
+  0xaa6a, 0xd0c9, 0xd6ed, 0xc3a8, 0xe2ac, 0xaa6b, 0xcfd7, 0xaa6c, /*0x28-0x2f*/
+  0xaa6d, 0xe2ae, 0xaa6e, 0xaa6f, 0xbaef, 0xaa70, 0xaa71, 0xe9e0, /*0x30-0x37*/
+  0xe2ad, 0xe2aa, 0xaa72, 0xaa73, 0xaa74, 0xaa75, 0xbbab, 0xd4b3, /*0x38-0x3f*/
+  0xaa76, 0xaa77, 0xaa78, 0xaa79, 0xaa7a, 0xaa7b, 0xaa7c, 0xaa7d, /*0x40-0x47*/
+  0xaa7e, 0xaa80, 0xaa81, 0xaa82, 0xaa83, 0xe2b0, 0xaa84, 0xaa85, /*0x48-0x4f*/
+  0xe2af, 0xaa86, 0xe9e1, 0xaa87, 0xaa88, 0xaa89, 0xaa8a, 0xe2b1, /*0x50-0x57*/
+  0xaa8b, 0xaa8c, 0xaa8d, 0xaa8e, 0xaa8f, 0xaa90, 0xaa91, 0xaa92, /*0x58-0x5f*/
+  0xe2b2, 0xaa93, 0xaa94, 0xaa95, 0xaa96, 0xaa97, 0xaa98, 0xaa99, /*0x60-0x67*/
+  0xaa9a, 0xaa9b, 0xaa9c, 0xaa9d, 0xe2b3, 0xcca1, 0xaa9e, 0xe2b4, /*0x68-0x6f*/
+  0xaa9f, 0xaaa0, 0xab40, 0xab41, 0xab42, 0xab43, 0xab44, 0xab45, /*0x70-0x77*/
+  0xab46, 0xab47, 0xab48, 0xab49, 0xab4a, 0xab4b, 0xe2b5, 0xab4c, /*0x78-0x7f*/
+  0xab4d, 0xab4e, 0xab4f, 0xab50, 0xd0fe, 0xab51, 0xab52, 0xc2ca, /*0x80-0x87*/
+  0xab53, 0xd3f1, 0xab54, 0xcdf5, 0xab55, 0xab56, 0xe7e0, 0xab57, /*0x88-0x8f*/
+  0xab58, 0xe7e1, 0xab59, 0xab5a, 0xab5b, 0xab5c, 0xbec1, 0xab5d, /*0x90-0x97*/
+  0xab5e, 0xab5f, 0xab60, 0xc2ea, 0xab61, 0xab62, 0xab63, 0xe7e4, /*0x98-0x9f*/
+  0xab64, 0xab65, 0xe7e3, 0xab66, 0xab67, 0xab68, 0xab69, 0xab6a, /*0xa0-0xa7*/
+  0xab6b, 0xcde6, 0xab6c, 0xc3b5, 0xab6d, 0xab6e, 0xe7e2, 0xbbb7, /*0xa8-0xaf*/
+  0xcfd6, 0xab6f, 0xc1e1, 0xe7e9, 0xab70, 0xab71, 0xab72, 0xe7e8, /*0xb0-0xb7*/
+  0xab73, 0xab74, 0xe7f4, 0xb2a3, 0xab75, 0xab76, 0xab77, 0xab78, /*0xb8-0xbf*/
+  0xe7ea, 0xab79, 0xe7e6, 0xab7a, 0xab7b, 0xab7c, 0xab7d, 0xab7e, /*0xc0-0xc7*/
+  0xe7ec, 0xe7eb, 0xc9ba, 0xab80, 0xab81, 0xd5e4, 0xab82, 0xe7e5, /*0xc8-0xcf*/
+  0xb7a9, 0xe7e7, 0xab83, 0xab84, 0xab85, 0xab86, 0xab87, 0xab88, /*0xd0-0xd7*/
+  0xab89, 0xe7ee, 0xab8a, 0xab8b, 0xab8c, 0xab8d, 0xe7f3, 0xab8e, /*0xd8-0xdf*/
+  0xd6e9, 0xab8f, 0xab90, 0xab91, 0xab92, 0xe7ed, 0xab93, 0xe7f2, /*0xe0-0xe7*/
+  0xab94, 0xe7f1, 0xab95, 0xab96, 0xab97, 0xb0e0, 0xab98, 0xab99, /*0xe8-0xef*/
+  0xab9a, 0xab9b, 0xe7f5, 0xab9c, 0xab9d, 0xab9e, 0xab9f, 0xaba0, /*0xf0-0xf7*/
+  0xac40, 0xac41, 0xac42, 0xac43, 0xac44, 0xac45, 0xac46, 0xac47, /*0xf8-0xff*/
+  /* 0x7400 */
+  0xac48, 0xac49, 0xac4a, 0xc7f2, 0xac4b, 0xc0c5, 0xc0ed, 0xac4c, /*0x00-0x07*/
+  0xac4d, 0xc1f0, 0xe7f0, 0xac4e, 0xac4f, 0xac50, 0xac51, 0xe7f6, /*0x08-0x0f*/
+  0xcbf6, 0xac52, 0xac53, 0xac54, 0xac55, 0xac56, 0xac57, 0xac58, /*0x10-0x17*/
+  0xac59, 0xac5a, 0xe8a2, 0xe8a1, 0xac5b, 0xac5c, 0xac5d, 0xac5e, /*0x18-0x1f*/
+  0xac5f, 0xac60, 0xd7c1, 0xac61, 0xac62, 0xe7fa, 0xe7f9, 0xac63, /*0x20-0x27*/
+  0xe7fb, 0xac64, 0xe7f7, 0xac65, 0xe7fe, 0xac66, 0xe7fd, 0xac67, /*0x28-0x2f*/
+  0xe7fc, 0xac68, 0xac69, 0xc1d5, 0xc7d9, 0xc5fd, 0xc5c3, 0xac6a, /*0x30-0x37*/
+  0xac6b, 0xac6c, 0xac6d, 0xac6e, 0xc7ed, 0xac6f, 0xac70, 0xac71, /*0x38-0x3f*/
+  0xac72, 0xe8a3, 0xac73, 0xac74, 0xac75, 0xac76, 0xac77, 0xac78, /*0x40-0x47*/
+  0xac79, 0xac7a, 0xac7b, 0xac7c, 0xac7d, 0xac7e, 0xac80, 0xac81, /*0x48-0x4f*/
+  0xac82, 0xac83, 0xac84, 0xac85, 0xac86, 0xe8a6, 0xac87, 0xe8a5, /*0x50-0x57*/
+  0xac88, 0xe8a7, 0xbaf7, 0xe7f8, 0xe8a4, 0xac89, 0xc8f0, 0xc9aa, /*0x58-0x5f*/
+  0xac8a, 0xac8b, 0xac8c, 0xac8d, 0xac8e, 0xac8f, 0xac90, 0xac91, /*0x60-0x67*/
+  0xac92, 0xac93, 0xac94, 0xac95, 0xac96, 0xe8a9, 0xac97, 0xac98, /*0x68-0x6f*/
+  0xb9e5, 0xac99, 0xac9a, 0xac9b, 0xac9c, 0xac9d, 0xd1fe, 0xe8a8, /*0x70-0x77*/
+  0xac9e, 0xac9f, 0xaca0, 0xad40, 0xad41, 0xad42, 0xe8aa, 0xad43, /*0x78-0x7f*/
+  0xe8ad, 0xe8ae, 0xad44, 0xc1a7, 0xad45, 0xad46, 0xad47, 0xe8af, /*0x80-0x87*/
+  0xad48, 0xad49, 0xad4a, 0xe8b0, 0xad4b, 0xad4c, 0xe8ac, 0xad4d, /*0x88-0x8f*/
+  0xe8b4, 0xad4e, 0xad4f, 0xad50, 0xad51, 0xad52, 0xad53, 0xad54, /*0x90-0x97*/
+  0xad55, 0xad56, 0xad57, 0xad58, 0xe8ab, 0xad59, 0xe8b1, 0xad5a, /*0x98-0x9f*/
+  0xad5b, 0xad5c, 0xad5d, 0xad5e, 0xad5f, 0xad60, 0xad61, 0xe8b5, /*0xa0-0xa7*/
+  0xe8b2, 0xe8b3, 0xad62, 0xad63, 0xad64, 0xad65, 0xad66, 0xad67, /*0xa8-0xaf*/
+  0xad68, 0xad69, 0xad6a, 0xad6b, 0xad6c, 0xad6d, 0xad6e, 0xad6f, /*0xb0-0xb7*/
+  0xad70, 0xad71, 0xe8b7, 0xad72, 0xad73, 0xad74, 0xad75, 0xad76, /*0xb8-0xbf*/
+  0xad77, 0xad78, 0xad79, 0xad7a, 0xad7b, 0xad7c, 0xad7d, 0xad7e, /*0xc0-0xc7*/
+  0xad80, 0xad81, 0xad82, 0xad83, 0xad84, 0xad85, 0xad86, 0xad87, /*0xc8-0xcf*/
+  0xad88, 0xad89, 0xe8b6, 0xad8a, 0xad8b, 0xad8c, 0xad8d, 0xad8e, /*0xd0-0xd7*/
+  0xad8f, 0xad90, 0xad91, 0xad92, 0xb9cf, 0xad93, 0xf0ac, 0xad94, /*0xd8-0xdf*/
+  0xf0ad, 0xad95, 0xc6b0, 0xb0ea, 0xc8bf, 0xad96, 0xcddf, 0xad97, /*0xe0-0xe7*/
+  0xad98, 0xad99, 0xad9a, 0xad9b, 0xad9c, 0xad9d, 0xcecd, 0xeab1, /*0xe8-0xef*/
+  0xad9e, 0xad9f, 0xada0, 0xae40, 0xeab2, 0xae41, 0xc6bf, 0xb4c9, /*0xf0-0xf7*/
+  0xae42, 0xae43, 0xae44, 0xae45, 0xae46, 0xae47, 0xae48, 0xeab3, /*0xf8-0xff*/
+  /* 0x7500 */
+  0xae49, 0xae4a, 0xae4b, 0xae4c, 0xd5e7, 0xae4d, 0xae4e, 0xae4f, /*0x00-0x07*/
+  0xae50, 0xae51, 0xae52, 0xae53, 0xae54, 0xddf9, 0xae55, 0xeab4, /*0x08-0x0f*/
+  0xae56, 0xeab5, 0xae57, 0xeab6, 0xae58, 0xae59, 0xae5a, 0xae5b, /*0x10-0x17*/
+  0xb8ca, 0xdfb0, 0xc9f5, 0xae5c, 0xccf0, 0xae5d, 0xae5e, 0xc9fa, /*0x18-0x1f*/
+  0xae5f, 0xae60, 0xae61, 0xae62, 0xae63, 0xc9fb, 0xae64, 0xae65, /*0x20-0x27*/
+  0xd3c3, 0xcba6, 0xae66, 0xb8a6, 0xf0ae, 0xb1c2, 0xae67, 0xe5b8, /*0x28-0x2f*/
+  0xccef, 0xd3c9, 0xbcd7, 0xc9ea, 0xae68, 0xb5e7, 0xae69, 0xc4d0, /*0x30-0x37*/
+  0xb5e9, 0xae6a, 0xeeae, 0xbbad, 0xae6b, 0xae6c, 0xe7de, 0xae6d, /*0x38-0x3f*/
+  0xeeaf, 0xae6e, 0xae6f, 0xae70, 0xae71, 0xb3a9, 0xae72, 0xae73, /*0x40-0x47*/
+  0xeeb2, 0xae74, 0xae75, 0xeeb1, 0xbde7, 0xae76, 0xeeb0, 0xceb7, /*0x48-0x4f*/
+  0xae77, 0xae78, 0xae79, 0xae7a, 0xc5cf, 0xae7b, 0xae7c, 0xae7d, /*0x50-0x57*/
+  0xae7e, 0xc1f4, 0xdbce, 0xeeb3, 0xd0f3, 0xae80, 0xae81, 0xae82, /*0x58-0x5f*/
+  0xae83, 0xae84, 0xae85, 0xae86, 0xae87, 0xc2d4, 0xc6e8, 0xae88, /*0x60-0x67*/
+  0xae89, 0xae8a, 0xb7ac, 0xae8b, 0xae8c, 0xae8d, 0xae8e, 0xae8f, /*0x68-0x6f*/
+  0xae90, 0xae91, 0xeeb4, 0xae92, 0xb3eb, 0xae93, 0xae94, 0xae95, /*0x70-0x77*/
+  0xbbfb, 0xeeb5, 0xae96, 0xae97, 0xae98, 0xae99, 0xae9a, 0xe7dc, /*0x78-0x7f*/
+  0xae9b, 0xae9c, 0xae9d, 0xeeb6, 0xae9e, 0xae9f, 0xbdae, 0xaea0, /*0x80-0x87*/
+  0xaf40, 0xaf41, 0xaf42, 0xf1e2, 0xaf43, 0xaf44, 0xaf45, 0xcae8, /*0x88-0x8f*/
+  0xaf46, 0xd2c9, 0xf0da, 0xaf47, 0xf0db, 0xaf48, 0xf0dc, 0xc1c6, /*0x90-0x97*/
+  0xaf49, 0xb8ed, 0xbece, 0xaf4a, 0xaf4b, 0xf0de, 0xaf4c, 0xc5b1, /*0x98-0x9f*/
+  0xf0dd, 0xd1f1, 0xaf4d, 0xf0e0, 0xb0cc, 0xbdea, 0xaf4e, 0xaf4f, /*0xa0-0xa7*/
+  0xaf50, 0xaf51, 0xaf52, 0xd2df, 0xf0df, 0xaf53, 0xb4af, 0xb7e8, /*0xa8-0xaf*/
+  0xf0e6, 0xf0e5, 0xc6a3, 0xf0e1, 0xf0e2, 0xb4c3, 0xaf54, 0xaf55, /*0xb0-0xb7*/
+  0xf0e3, 0xd5ee, 0xaf56, 0xaf57, 0xccdb, 0xbed2, 0xbcb2, 0xaf58, /*0xb8-0xbf*/
+  0xaf59, 0xaf5a, 0xf0e8, 0xf0e7, 0xf0e4, 0xb2a1, 0xaf5b, 0xd6a2, /*0xc0-0xc7*/
+  0xd3b8, 0xbeb7, 0xc8ac, 0xaf5c, 0xaf5d, 0xf0ea, 0xaf5e, 0xaf5f, /*0xc8-0xcf*/
+  0xaf60, 0xaf61, 0xd1f7, 0xaf62, 0xd6cc, 0xbadb, 0xf0e9, 0xaf63, /*0xd0-0xd7*/
+  0xb6bb, 0xaf64, 0xaf65, 0xcdb4, 0xaf66, 0xaf67, 0xc6a6, 0xaf68, /*0xd8-0xdf*/
+  0xaf69, 0xaf6a, 0xc1a1, 0xf0eb, 0xf0ee, 0xaf6b, 0xf0ed, 0xf0f0, /*0xe0-0xe7*/
+  0xf0ec, 0xaf6c, 0xbbbe, 0xf0ef, 0xaf6d, 0xaf6e, 0xaf6f, 0xaf70, /*0xe8-0xef*/
+  0xccb5, 0xf0f2, 0xaf71, 0xaf72, 0xb3d5, 0xaf73, 0xaf74, 0xaf75, /*0xf0-0xf7*/
+  0xaf76, 0xb1d4, 0xaf77, 0xaf78, 0xf0f3, 0xaf79, 0xaf7a, 0xf0f4, /*0xf8-0xff*/
+  /* 0x7600 */
+  0xf0f6, 0xb4e1, 0xaf7b, 0xf0f1, 0xaf7c, 0xf0f7, 0xaf7d, 0xaf7e, /*0x00-0x07*/
+  0xaf80, 0xaf81, 0xf0fa, 0xaf82, 0xf0f8, 0xaf83, 0xaf84, 0xaf85, /*0x08-0x0f*/
+  0xf0f5, 0xaf86, 0xaf87, 0xaf88, 0xaf89, 0xf0fd, 0xaf8a, 0xf0f9, /*0x10-0x17*/
+  0xf0fc, 0xf0fe, 0xaf8b, 0xf1a1, 0xaf8c, 0xaf8d, 0xaf8e, 0xcec1, /*0x18-0x1f*/
+  0xf1a4, 0xaf8f, 0xf1a3, 0xaf90, 0xc1f6, 0xf0fb, 0xcadd, 0xaf91, /*0x20-0x27*/
+  0xaf92, 0xb4f1, 0xb1f1, 0xccb1, 0xaf93, 0xf1a6, 0xaf94, 0xaf95, /*0x28-0x2f*/
+  0xf1a7, 0xaf96, 0xaf97, 0xf1ac, 0xd5ce, 0xf1a9, 0xaf98, 0xaf99, /*0x30-0x37*/
+  0xc8b3, 0xaf9a, 0xaf9b, 0xaf9c, 0xf1a2, 0xaf9d, 0xf1ab, 0xf1a8, /*0x38-0x3f*/
+  0xf1a5, 0xaf9e, 0xaf9f, 0xf1aa, 0xafa0, 0xb040, 0xb041, 0xb042, /*0x40-0x47*/
+  0xb043, 0xb044, 0xb045, 0xb046, 0xb0a9, 0xf1ad, 0xb047, 0xb048, /*0x48-0x4f*/
+  0xb049, 0xb04a, 0xb04b, 0xb04c, 0xf1af, 0xb04d, 0xf1b1, 0xb04e, /*0x50-0x57*/
+  0xb04f, 0xb050, 0xb051, 0xb052, 0xf1b0, 0xb053, 0xf1ae, 0xb054, /*0x58-0x5f*/
+  0xb055, 0xb056, 0xb057, 0xd1a2, 0xb058, 0xb059, 0xb05a, 0xb05b, /*0x60-0x67*/
+  0xb05c, 0xb05d, 0xb05e, 0xf1b2, 0xb05f, 0xb060, 0xb061, 0xf1b3, /*0x68-0x6f*/
+  0xb062, 0xb063, 0xb064, 0xb065, 0xb066, 0xb067, 0xb068, 0xb069, /*0x70-0x77*/
+  0xb9ef, 0xb06a, 0xb06b, 0xb5c7, 0xb06c, 0xb0d7, 0xb0d9, 0xb06d, /*0x78-0x7f*/
+  0xb06e, 0xb06f, 0xd4ed, 0xb070, 0xb5c4, 0xb071, 0xbdd4, 0xbbca, /*0x80-0x87*/
+  0xf0a7, 0xb072, 0xb073, 0xb8de, 0xb074, 0xb075, 0xf0a8, 0xb076, /*0x88-0x8f*/
+  0xb077, 0xb0a8, 0xb078, 0xf0a9, 0xb079, 0xb07a, 0xcdee, 0xb07b, /*0x90-0x97*/
+  0xb07c, 0xf0aa, 0xb07d, 0xb07e, 0xb080, 0xb081, 0xb082, 0xb083, /*0x98-0x9f*/
+  0xb084, 0xb085, 0xb086, 0xb087, 0xf0ab, 0xb088, 0xb089, 0xb08a, /*0xa0-0xa7*/
+  0xb08b, 0xb08c, 0xb08d, 0xb08e, 0xb08f, 0xb090, 0xc6a4, 0xb091, /*0xa8-0xaf*/
+  0xb092, 0xd6e5, 0xf1e4, 0xb093, 0xf1e5, 0xb094, 0xb095, 0xb096, /*0xb0-0xb7*/
+  0xb097, 0xb098, 0xb099, 0xb09a, 0xb09b, 0xb09c, 0xb09d, 0xc3f3, /*0xb8-0xbf*/
+  0xb09e, 0xb09f, 0xd3db, 0xb0a0, 0xb140, 0xd6d1, 0xc5e8, 0xb141, /*0xc0-0xc7*/
+  0xd3af, 0xb142, 0xd2e6, 0xb143, 0xb144, 0xeec1, 0xb0bb, 0xd5b5, /*0xc8-0xcf*/
+  0xd1ce, 0xbce0, 0xbad0, 0xb145, 0xbff8, 0xb146, 0xb8c7, 0xb5c1, /*0xd0-0xd7*/
+  0xc5cc, 0xb147, 0xb148, 0xcaa2, 0xb149, 0xb14a, 0xb14b, 0xc3cb, /*0xd8-0xdf*/
+  0xb14c, 0xb14d, 0xb14e, 0xb14f, 0xb150, 0xeec2, 0xb151, 0xb152, /*0xe0-0xe7*/
+  0xb153, 0xb154, 0xb155, 0xb156, 0xb157, 0xb158, 0xc4bf, 0xb6a2, /*0xe8-0xef*/
+  0xb159, 0xedec, 0xc3a4, 0xb15a, 0xd6b1, 0xb15b, 0xb15c, 0xb15d, /*0xf0-0xf7*/
+  0xcfe0, 0xedef, 0xb15e, 0xb15f, 0xc5ce, 0xb160, 0xb6dc, 0xb161, /*0xf8-0xff*/
+  /* 0x7700 */
+  0xb162, 0xcaa1, 0xb163, 0xb164, 0xeded, 0xb165, 0xb166, 0xedf0, /*0x00-0x07*/
+  0xedf1, 0xc3bc, 0xb167, 0xbfb4, 0xb168, 0xedee, 0xb169, 0xb16a, /*0x08-0x0f*/
+  0xb16b, 0xb16c, 0xb16d, 0xb16e, 0xb16f, 0xb170, 0xb171, 0xb172, /*0x10-0x17*/
+  0xb173, 0xedf4, 0xedf2, 0xb174, 0xb175, 0xb176, 0xb177, 0xd5e6, /*0x18-0x1f*/
+  0xc3df, 0xb178, 0xedf3, 0xb179, 0xb17a, 0xb17b, 0xedf6, 0xb17c, /*0x20-0x27*/
+  0xd5a3, 0xd1a3, 0xb17d, 0xb17e, 0xb180, 0xedf5, 0xb181, 0xc3d0, /*0x28-0x2f*/
+  0xb182, 0xb183, 0xb184, 0xb185, 0xb186, 0xedf7, 0xbff4, 0xbeec, /*0x30-0x37*/
+  0xedf8, 0xb187, 0xccf7, 0xb188, 0xd1db, 0xb189, 0xb18a, 0xb18b, /*0x38-0x3f*/
+  0xd7c5, 0xd5f6, 0xb18c, 0xedfc, 0xb18d, 0xb18e, 0xb18f, 0xedfb, /*0x40-0x47*/
+  0xb190, 0xb191, 0xb192, 0xb193, 0xb194, 0xb195, 0xb196, 0xb197, /*0x48-0x4f*/
+  0xedf9, 0xedfa, 0xb198, 0xb199, 0xb19a, 0xb19b, 0xb19c, 0xb19d, /*0x50-0x57*/
+  0xb19e, 0xb19f, 0xedfd, 0xbea6, 0xb1a0, 0xb240, 0xb241, 0xb242, /*0x58-0x5f*/
+  0xb243, 0xcbaf, 0xeea1, 0xb6bd, 0xb244, 0xeea2, 0xc4c0, 0xb245, /*0x60-0x67*/
+  0xedfe, 0xb246, 0xb247, 0xbdde, 0xb2c7, 0xb248, 0xb249, 0xb24a, /*0x68-0x6f*/
+  0xb24b, 0xb24c, 0xb24d, 0xb24e, 0xb24f, 0xb250, 0xb251, 0xb252, /*0x70-0x77*/
+  0xb253, 0xb6c3, 0xb254, 0xb255, 0xb256, 0xeea5, 0xd8ba, 0xeea3, /*0x78-0x7f*/
+  0xeea6, 0xb257, 0xb258, 0xb259, 0xc3e9, 0xb3f2, 0xb25a, 0xb25b, /*0x80-0x87*/
+  0xb25c, 0xb25d, 0xb25e, 0xb25f, 0xeea7, 0xeea4, 0xcfb9, 0xb260, /*0x88-0x8f*/
+  0xb261, 0xeea8, 0xc2f7, 0xb262, 0xb263, 0xb264, 0xb265, 0xb266, /*0x90-0x97*/
+  0xb267, 0xb268, 0xb269, 0xb26a, 0xb26b, 0xb26c, 0xb26d, 0xeea9, /*0x98-0x9f*/
+  0xeeaa, 0xb26e, 0xdeab, 0xb26f, 0xb270, 0xc6b3, 0xb271, 0xc7c6, /*0xa0-0xa7*/
+  0xb272, 0xd6f5, 0xb5c9, 0xb273, 0xcbb2, 0xb274, 0xb275, 0xb276, /*0xa8-0xaf*/
+  0xeeab, 0xb277, 0xb278, 0xcdab, 0xb279, 0xeeac, 0xb27a, 0xb27b, /*0xb0-0xb7*/
+  0xb27c, 0xb27d, 0xb27e, 0xd5b0, 0xb280, 0xeead, 0xb281, 0xf6c4, /*0xb8-0xbf*/
+  0xb282, 0xb283, 0xb284, 0xb285, 0xb286, 0xb287, 0xb288, 0xb289, /*0xc0-0xc7*/
+  0xb28a, 0xb28b, 0xb28c, 0xb28d, 0xb28e, 0xdbc7, 0xb28f, 0xb290, /*0xc8-0xcf*/
+  0xb291, 0xb292, 0xb293, 0xb294, 0xb295, 0xb296, 0xb297, 0xb4a3, /*0xd0-0xd7*/
+  0xb298, 0xb299, 0xb29a, 0xc3ac, 0xf1e6, 0xb29b, 0xb29c, 0xb29d, /*0xd8-0xdf*/
+  0xb29e, 0xb29f, 0xcab8, 0xd2d3, 0xb2a0, 0xd6aa, 0xb340, 0xeff2, /*0xe0-0xe7*/
+  0xb341, 0xbed8, 0xb342, 0xbdc3, 0xeff3, 0xb6cc, 0xb0ab, 0xb343, /*0xe8-0xef*/
+  0xb344, 0xb345, 0xb346, 0xcaaf, 0xb347, 0xb348, 0xedb6, 0xb349, /*0xf0-0xf7*/
+  0xedb7, 0xb34a, 0xb34b, 0xb34c, 0xb34d, 0xcef9, 0xb7af, 0xbff3, /*0xf8-0xff*/
+  /* 0x7800 */
+  0xedb8, 0xc2eb, 0xc9b0, 0xb34e, 0xb34f, 0xb350, 0xb351, 0xb352, /*0x00-0x07*/
+  0xb353, 0xedb9, 0xb354, 0xb355, 0xc6f6, 0xbfb3, 0xb356, 0xb357, /*0x08-0x0f*/
+  0xb358, 0xedbc, 0xc5f8, 0xb359, 0xd1d0, 0xb35a, 0xd7a9, 0xedba, /*0x10-0x17*/
+  0xedbb, 0xb35b, 0xd1e2, 0xb35c, 0xedbf, 0xedc0, 0xb35d, 0xedc4, /*0x18-0x1f*/
+  0xb35e, 0xb35f, 0xb360, 0xedc8, 0xb361, 0xedc6, 0xedce, 0xd5e8, /*0x20-0x27*/
+  0xb362, 0xedc9, 0xb363, 0xb364, 0xedc7, 0xedbe, 0xb365, 0xb366, /*0x28-0x2f*/
+  0xc5e9, 0xb367, 0xb368, 0xb369, 0xc6c6, 0xb36a, 0xb36b, 0xc9e9, /*0x30-0x37*/
+  0xd4d2, 0xedc1, 0xedc2, 0xedc3, 0xedc5, 0xb36c, 0xc0f9, 0xb36d, /*0x38-0x3f*/
+  0xb4a1, 0xb36e, 0xb36f, 0xb370, 0xb371, 0xb9e8, 0xb372, 0xedd0, /*0x40-0x47*/
+  0xb373, 0xb374, 0xb375, 0xb376, 0xedd1, 0xb377, 0xedca, 0xb378, /*0x48-0x4f*/
+  0xedcf, 0xb379, 0xcef8, 0xb37a, 0xb37b, 0xcbb6, 0xedcc, 0xedcd, /*0x50-0x57*/
+  0xb37c, 0xb37d, 0xb37e, 0xb380, 0xb381, 0xcff5, 0xb382, 0xb383, /*0x58-0x5f*/
+  0xb384, 0xb385, 0xb386, 0xb387, 0xb388, 0xb389, 0xb38a, 0xb38b, /*0x60-0x67*/
+  0xb38c, 0xb38d, 0xedd2, 0xc1f2, 0xd3b2, 0xedcb, 0xc8b7, 0xb38e, /*0x68-0x6f*/
+  0xb38f, 0xb390, 0xb391, 0xb392, 0xb393, 0xb394, 0xb395, 0xbcef, /*0x70-0x77*/
+  0xb396, 0xb397, 0xb398, 0xb399, 0xc5f0, 0xb39a, 0xb39b, 0xb39c, /*0x78-0x7f*/
+  0xb39d, 0xb39e, 0xb39f, 0xb3a0, 0xb440, 0xb441, 0xb442, 0xedd6, /*0x80-0x87*/
+  0xb443, 0xb5ef, 0xb444, 0xb445, 0xc2b5, 0xb0ad, 0xcbe9, 0xb446, /*0x88-0x8f*/
+  0xb447, 0xb1ae, 0xb448, 0xedd4, 0xb449, 0xb44a, 0xb44b, 0xcdeb, /*0x90-0x97*/
+  0xb5e2, 0xb44c, 0xedd5, 0xedd3, 0xedd7, 0xb44d, 0xb44e, 0xb5fa, /*0x98-0x9f*/
+  0xb44f, 0xedd8, 0xb450, 0xedd9, 0xb451, 0xeddc, 0xb452, 0xb1cc, /*0xa0-0xa7*/
+  0xb453, 0xb454, 0xb455, 0xb456, 0xb457, 0xb458, 0xb459, 0xb45a, /*0xa8-0xaf*/
+  0xc5f6, 0xbcee, 0xedda, 0xccbc, 0xb2ea, 0xb45b, 0xb45c, 0xb45d, /*0xb0-0xb7*/
+  0xb45e, 0xeddb, 0xb45f, 0xb460, 0xb461, 0xb462, 0xc4eb, 0xb463, /*0xb8-0xbf*/
+  0xb464, 0xb4c5, 0xb465, 0xb466, 0xb467, 0xb0f5, 0xb468, 0xb469, /*0xc0-0xc7*/
+  0xb46a, 0xeddf, 0xc0da, 0xb4e8, 0xb46b, 0xb46c, 0xb46d, 0xb46e, /*0xc8-0xcf*/
+  0xc5cd, 0xb46f, 0xb470, 0xb471, 0xeddd, 0xbfc4, 0xb472, 0xb473, /*0xd0-0xd7*/
+  0xb474, 0xedde, 0xb475, 0xb476, 0xb477, 0xb478, 0xb479, 0xb47a, /*0xd8-0xdf*/
+  0xb47b, 0xb47c, 0xb47d, 0xb47e, 0xb480, 0xb481, 0xb482, 0xb483, /*0xe0-0xe7*/
+  0xc4a5, 0xb484, 0xb485, 0xb486, 0xede0, 0xb487, 0xb488, 0xb489, /*0xe8-0xef*/
+  0xb48a, 0xb48b, 0xede1, 0xb48c, 0xede3, 0xb48d, 0xb48e, 0xc1d7, /*0xf0-0xf7*/
+  0xb48f, 0xb490, 0xbbc7, 0xb491, 0xb492, 0xb493, 0xb494, 0xb495, /*0xf8-0xff*/
+  /* 0x7900 */
+  0xb496, 0xbdb8, 0xb497, 0xb498, 0xb499, 0xede2, 0xb49a, 0xb49b, /*0x00-0x07*/
+  0xb49c, 0xb49d, 0xb49e, 0xb49f, 0xb4a0, 0xb540, 0xb541, 0xb542, /*0x08-0x0f*/
+  0xb543, 0xb544, 0xb545, 0xede4, 0xb546, 0xb547, 0xb548, 0xb549, /*0x10-0x17*/
+  0xb54a, 0xb54b, 0xb54c, 0xb54d, 0xb54e, 0xb54f, 0xede6, 0xb550, /*0x18-0x1f*/
+  0xb551, 0xb552, 0xb553, 0xb554, 0xede5, 0xb555, 0xb556, 0xb557, /*0x20-0x27*/
+  0xb558, 0xb559, 0xb55a, 0xb55b, 0xb55c, 0xb55d, 0xb55e, 0xb55f, /*0x28-0x2f*/
+  0xb560, 0xb561, 0xb562, 0xb563, 0xede7, 0xb564, 0xb565, 0xb566, /*0x30-0x37*/
+  0xb567, 0xb568, 0xcabe, 0xecea, 0xc0f1, 0xb569, 0xc9e7, 0xb56a, /*0x38-0x3f*/
+  0xeceb, 0xc6ee, 0xb56b, 0xb56c, 0xb56d, 0xb56e, 0xecec, 0xb56f, /*0x40-0x47*/
+  0xc6ed, 0xeced, 0xb570, 0xb571, 0xb572, 0xb573, 0xb574, 0xb575, /*0x48-0x4f*/
+  0xb576, 0xb577, 0xb578, 0xecf0, 0xb579, 0xb57a, 0xd7e6, 0xecf3, /*0x50-0x57*/
+  0xb57b, 0xb57c, 0xecf1, 0xecee, 0xecef, 0xd7a3, 0xc9f1, 0xcbee, /*0x58-0x5f*/
+  0xecf4, 0xb57d, 0xecf2, 0xb57e, 0xb580, 0xcfe9, 0xb581, 0xecf6, /*0x60-0x67*/
+  0xc6b1, 0xb582, 0xb583, 0xb584, 0xb585, 0xbcc0, 0xb586, 0xecf5, /*0x68-0x6f*/
+  0xb587, 0xb588, 0xb589, 0xb58a, 0xb58b, 0xb58c, 0xb58d, 0xb5bb, /*0x70-0x77*/
+  0xbbf6, 0xb58e, 0xecf7, 0xb58f, 0xb590, 0xb591, 0xb592, 0xb593, /*0x78-0x7f*/
+  0xd9f7, 0xbdfb, 0xb594, 0xb595, 0xc2bb, 0xecf8, 0xb596, 0xb597, /*0x80-0x87*/
+  0xb598, 0xb599, 0xecf9, 0xb59a, 0xb59b, 0xb59c, 0xb59d, 0xb8a3, /*0x88-0x8f*/
+  0xb59e, 0xb59f, 0xb5a0, 0xb640, 0xb641, 0xb642, 0xb643, 0xb644, /*0x90-0x97*/
+  0xb645, 0xb646, 0xecfa, 0xb647, 0xb648, 0xb649, 0xb64a, 0xb64b, /*0x98-0x9f*/
+  0xb64c, 0xb64d, 0xb64e, 0xb64f, 0xb650, 0xb651, 0xb652, 0xecfb, /*0xa0-0xa7*/
+  0xb653, 0xb654, 0xb655, 0xb656, 0xb657, 0xb658, 0xb659, 0xb65a, /*0xa8-0xaf*/
+  0xb65b, 0xb65c, 0xb65d, 0xecfc, 0xb65e, 0xb65f, 0xb660, 0xb661, /*0xb0-0xb7*/
+  0xb662, 0xd3ed, 0xd8ae, 0xc0eb, 0xb663, 0xc7dd, 0xbacc, 0xb664, /*0xb8-0xbf*/
+  0xd0e3, 0xcbbd, 0xb665, 0xcdba, 0xb666, 0xb667, 0xb8d1, 0xb668, /*0xc0-0xc7*/
+  0xb669, 0xb1fc, 0xb66a, 0xc7ef, 0xb66b, 0xd6d6, 0xb66c, 0xb66d, /*0xc8-0xcf*/
+  0xb66e, 0xbfc6, 0xc3eb, 0xb66f, 0xb670, 0xeff5, 0xb671, 0xb672, /*0xd0-0xd7*/
+  0xc3d8, 0xb673, 0xb674, 0xb675, 0xb676, 0xb677, 0xb678, 0xd7e2, /*0xd8-0xdf*/
+  0xb679, 0xb67a, 0xb67b, 0xeff7, 0xb3d3, 0xb67c, 0xc7d8, 0xd1ed, /*0xe0-0xe7*/
+  0xb67d, 0xd6c8, 0xb67e, 0xeff8, 0xb680, 0xeff6, 0xb681, 0xbbfd, /*0xe8-0xef*/
+  0xb3c6, 0xb682, 0xb683, 0xb684, 0xb685, 0xb686, 0xb687, 0xb688, /*0xf0-0xf7*/
+  0xbdd5, 0xb689, 0xb68a, 0xd2c6, 0xb68b, 0xbbe0, 0xb68c, 0xb68d, /*0xf8-0xff*/
+  /* 0x7a00 */
+  0xcfa1, 0xb68e, 0xeffc, 0xeffb, 0xb68f, 0xb690, 0xeff9, 0xb691, /*0x00-0x07*/
+  0xb692, 0xb693, 0xb694, 0xb3cc, 0xb695, 0xc9d4, 0xcbb0, 0xb696, /*0x08-0x0f*/
+  0xb697, 0xb698, 0xb699, 0xb69a, 0xeffe, 0xb69b, 0xb69c, 0xb0de, /*0x10-0x17*/
+  0xb69d, 0xb69e, 0xd6c9, 0xb69f, 0xb6a0, 0xb740, 0xeffd, 0xb741, /*0x18-0x1f*/
+  0xb3ed, 0xb742, 0xb743, 0xf6d5, 0xb744, 0xb745, 0xb746, 0xb747, /*0x20-0x27*/
+  0xb748, 0xb749, 0xb74a, 0xb74b, 0xb74c, 0xb74d, 0xb74e, 0xb74f, /*0x28-0x2f*/
+  0xb750, 0xb751, 0xb752, 0xcec8, 0xb753, 0xb754, 0xb755, 0xf0a2, /*0x30-0x37*/
+  0xb756, 0xf0a1, 0xb757, 0xb5be, 0xbcda, 0xbbfc, 0xb758, 0xb8e5, /*0x38-0x3f*/
+  0xb759, 0xb75a, 0xb75b, 0xb75c, 0xb75d, 0xb75e, 0xc4c2, 0xb75f, /*0x40-0x47*/
+  0xb760, 0xb761, 0xb762, 0xb763, 0xb764, 0xb765, 0xb766, 0xb767, /*0x48-0x4f*/
+  0xb768, 0xf0a3, 0xb769, 0xb76a, 0xb76b, 0xb76c, 0xb76d, 0xcbeb, /*0x50-0x57*/
+  0xb76e, 0xb76f, 0xb770, 0xb771, 0xb772, 0xb773, 0xb774, 0xb775, /*0x58-0x5f*/
+  0xb776, 0xb777, 0xb778, 0xb779, 0xb77a, 0xb77b, 0xb77c, 0xb77d, /*0x60-0x67*/
+  0xb77e, 0xb780, 0xb781, 0xb782, 0xb783, 0xb784, 0xb785, 0xb786, /*0x68-0x6f*/
+  0xf0a6, 0xb787, 0xb788, 0xb789, 0xd1a8, 0xb78a, 0xbebf, 0xc7ee, /*0x70-0x77*/
+  0xf1b6, 0xf1b7, 0xbfd5, 0xb78b, 0xb78c, 0xb78d, 0xb78e, 0xb4a9, /*0x78-0x7f*/
+  0xf1b8, 0xcdbb, 0xb78f, 0xc7d4, 0xd5ad, 0xb790, 0xf1b9, 0xb791, /*0x80-0x87*/
+  0xf1ba, 0xb792, 0xb793, 0xb794, 0xb795, 0xc7cf, 0xb796, 0xb797, /*0x88-0x8f*/
+  0xb798, 0xd2a4, 0xd6cf, 0xb799, 0xb79a, 0xf1bb, 0xbdd1, 0xb4b0, /*0x90-0x97*/
+  0xbebd, 0xb79b, 0xb79c, 0xb79d, 0xb4dc, 0xced1, 0xb79e, 0xbfdf, /*0x98-0x9f*/
+  0xf1bd, 0xb79f, 0xb7a0, 0xb840, 0xb841, 0xbffa, 0xf1bc, 0xb842, /*0xa0-0xa7*/
+  0xf1bf, 0xb843, 0xb844, 0xb845, 0xf1be, 0xf1c0, 0xb846, 0xb847, /*0xa8-0xaf*/
+  0xb848, 0xb849, 0xb84a, 0xf1c1, 0xb84b, 0xb84c, 0xb84d, 0xb84e, /*0xb0-0xb7*/
+  0xb84f, 0xb850, 0xb851, 0xb852, 0xb853, 0xb854, 0xb855, 0xc1fe, /*0xb8-0xbf*/
+  0xb856, 0xb857, 0xb858, 0xb859, 0xb85a, 0xb85b, 0xb85c, 0xb85d, /*0xc0-0xc7*/
+  0xb85e, 0xb85f, 0xb860, 0xc1a2, 0xb861, 0xb862, 0xb863, 0xb864, /*0xc8-0xcf*/
+  0xb865, 0xb866, 0xb867, 0xb868, 0xb869, 0xb86a, 0xcafa, 0xb86b, /*0xd0-0xd7*/
+  0xb86c, 0xd5be, 0xb86d, 0xb86e, 0xb86f, 0xb870, 0xbeba, 0xbeb9, /*0xd8-0xdf*/
+  0xd5c2, 0xb871, 0xb872, 0xbfa2, 0xb873, 0xcdaf, 0xf1b5, 0xb874, /*0xe0-0xe7*/
+  0xb875, 0xb876, 0xb877, 0xb878, 0xb879, 0xbddf, 0xb87a, 0xb6cb, /*0xe8-0xef*/
+  0xb87b, 0xb87c, 0xb87d, 0xb87e, 0xb880, 0xb881, 0xb882, 0xb883, /*0xf0-0xf7*/
+  0xb884, 0xd6f1, 0xf3c3, 0xb885, 0xb886, 0xf3c4, 0xb887, 0xb8cd, /*0xf8-0xff*/
+  /* 0x7b00 */
+  0xb888, 0xb889, 0xb88a, 0xf3c6, 0xf3c7, 0xb88b, 0xb0ca, 0xb88c, /*0x00-0x07*/
+  0xf3c5, 0xb88d, 0xf3c9, 0xcbf1, 0xb88e, 0xb88f, 0xb890, 0xf3cb, /*0x08-0x0f*/
+  0xb891, 0xd0a6, 0xb892, 0xb893, 0xb1ca, 0xf3c8, 0xb894, 0xb895, /*0x10-0x17*/
+  0xb896, 0xf3cf, 0xb897, 0xb5d1, 0xb898, 0xb899, 0xf3d7, 0xb89a, /*0x18-0x1f*/
+  0xf3d2, 0xb89b, 0xb89c, 0xb89d, 0xf3d4, 0xf3d3, 0xb7fb, 0xb89e, /*0x20-0x27*/
+  0xb1bf, 0xb89f, 0xf3ce, 0xf3ca, 0xb5da, 0xb8a0, 0xf3d0, 0xb940, /*0x28-0x2f*/
+  0xb941, 0xf3d1, 0xb942, 0xf3d5, 0xb943, 0xb944, 0xb945, 0xb946, /*0x30-0x37*/
+  0xf3cd, 0xb947, 0xbce3, 0xb948, 0xc1fd, 0xb949, 0xf3d6, 0xb94a, /*0x38-0x3f*/
+  0xb94b, 0xb94c, 0xb94d, 0xb94e, 0xb94f, 0xf3da, 0xb950, 0xf3cc, /*0x40-0x47*/
+  0xb951, 0xb5c8, 0xb952, 0xbdee, 0xf3dc, 0xb953, 0xb954, 0xb7a4, /*0x48-0x4f*/
+  0xbff0, 0xd6fe, 0xcdb2, 0xb955, 0xb4f0, 0xb956, 0xb2df, 0xb957, /*0x50-0x57*/
+  0xf3d8, 0xb958, 0xf3d9, 0xc9b8, 0xb959, 0xf3dd, 0xb95a, 0xb95b, /*0x58-0x5f*/
+  0xf3de, 0xb95c, 0xf3e1, 0xb95d, 0xb95e, 0xb95f, 0xb960, 0xb961, /*0x60-0x67*/
+  0xb962, 0xb963, 0xb964, 0xb965, 0xb966, 0xb967, 0xf3df, 0xb968, /*0x68-0x6f*/
+  0xb969, 0xf3e3, 0xf3e2, 0xb96a, 0xb96b, 0xf3db, 0xb96c, 0xbfea, /*0x70-0x77*/
+  0xb96d, 0xb3ef, 0xb96e, 0xf3e0, 0xb96f, 0xb970, 0xc7a9, 0xb971, /*0x78-0x7f*/
+  0xbcf2, 0xb972, 0xb973, 0xb974, 0xb975, 0xf3eb, 0xb976, 0xb977, /*0x80-0x87*/
+  0xb978, 0xb979, 0xb97a, 0xb97b, 0xb97c, 0xb9bf, 0xb97d, 0xb97e, /*0x88-0x8f*/
+  0xf3e4, 0xb980, 0xb981, 0xb982, 0xb2ad, 0xbbfe, 0xb983, 0xcbe3, /*0x90-0x97*/
+  0xb984, 0xb985, 0xb986, 0xb987, 0xf3ed, 0xf3e9, 0xb988, 0xb989, /*0x98-0x9f*/
+  0xb98a, 0xb9dc, 0xf3ee, 0xb98b, 0xb98c, 0xb98d, 0xf3e5, 0xf3e6, /*0xa0-0xa7*/
+  0xf3ea, 0xc2e1, 0xf3ec, 0xf3ef, 0xf3e8, 0xbcfd, 0xb98e, 0xb98f, /*0xa8-0xaf*/
+  0xb990, 0xcfe4, 0xb991, 0xb992, 0xf3f0, 0xb993, 0xb994, 0xb995, /*0xb0-0xb7*/
+  0xf3e7, 0xb996, 0xb997, 0xb998, 0xb999, 0xb99a, 0xb99b, 0xb99c, /*0xb8-0xbf*/
+  0xb99d, 0xf3f2, 0xb99e, 0xb99f, 0xb9a0, 0xba40, 0xd7ad, 0xc6aa, /*0xc0-0xc7*/
+  0xba41, 0xba42, 0xba43, 0xba44, 0xf3f3, 0xba45, 0xba46, 0xba47, /*0xc8-0xcf*/
+  0xba48, 0xf3f1, 0xba49, 0xc2a8, 0xba4a, 0xba4b, 0xba4c, 0xba4d, /*0xd0-0xd7*/
+  0xba4e, 0xb8dd, 0xf3f5, 0xba4f, 0xba50, 0xf3f4, 0xba51, 0xba52, /*0xd8-0xdf*/
+  0xba53, 0xb4db, 0xba54, 0xba55, 0xba56, 0xf3f6, 0xf3f7, 0xba57, /*0xe0-0xe7*/
+  0xba58, 0xba59, 0xf3f8, 0xba5a, 0xba5b, 0xba5c, 0xc0ba, 0xba5d, /*0xe8-0xef*/
+  0xba5e, 0xc0e9, 0xba5f, 0xba60, 0xba61, 0xba62, 0xba63, 0xc5f1, /*0xf0-0xf7*/
+  0xba64, 0xba65, 0xba66, 0xba67, 0xf3fb, 0xba68, 0xf3fa, 0xba69, /*0xf8-0xff*/
+  /* 0x7c00 */
+  0xba6a, 0xba6b, 0xba6c, 0xba6d, 0xba6e, 0xba6f, 0xba70, 0xb4d8, /*0x00-0x07*/
+  0xba71, 0xba72, 0xba73, 0xf3fe, 0xf3f9, 0xba74, 0xba75, 0xf3fc, /*0x08-0x0f*/
+  0xba76, 0xba77, 0xba78, 0xba79, 0xba7a, 0xba7b, 0xf3fd, 0xba7c, /*0x10-0x17*/
+  0xba7d, 0xba7e, 0xba80, 0xba81, 0xba82, 0xba83, 0xba84, 0xf4a1, /*0x18-0x1f*/
+  0xba85, 0xba86, 0xba87, 0xba88, 0xba89, 0xba8a, 0xf4a3, 0xbbc9, /*0x20-0x27*/
+  0xba8b, 0xba8c, 0xf4a2, 0xba8d, 0xba8e, 0xba8f, 0xba90, 0xba91, /*0x28-0x2f*/
+  0xba92, 0xba93, 0xba94, 0xba95, 0xba96, 0xba97, 0xba98, 0xba99, /*0x30-0x37*/
+  0xf4a4, 0xba9a, 0xba9b, 0xba9c, 0xba9d, 0xba9e, 0xba9f, 0xb2be, /*0x38-0x3f*/
+  0xf4a6, 0xf4a5, 0xbaa0, 0xbb40, 0xbb41, 0xbb42, 0xbb43, 0xbb44, /*0x40-0x47*/
+  0xbb45, 0xbb46, 0xbb47, 0xbb48, 0xbb49, 0xbcae, 0xbb4a, 0xbb4b, /*0x48-0x4f*/
+  0xbb4c, 0xbb4d, 0xbb4e, 0xbb4f, 0xbb50, 0xbb51, 0xbb52, 0xbb53, /*0x50-0x57*/
+  0xbb54, 0xbb55, 0xbb56, 0xbb57, 0xbb58, 0xbb59, 0xbb5a, 0xbb5b, /*0x58-0x5f*/
+  0xbb5c, 0xbb5d, 0xbb5e, 0xbb5f, 0xbb60, 0xbb61, 0xbb62, 0xbb63, /*0x60-0x67*/
+  0xbb64, 0xbb65, 0xbb66, 0xbb67, 0xbb68, 0xbb69, 0xbb6a, 0xbb6b, /*0x68-0x6f*/
+  0xbb6c, 0xbb6d, 0xbb6e, 0xc3d7, 0xd9e1, 0xbb6f, 0xbb70, 0xbb71, /*0x70-0x77*/
+  0xbb72, 0xbb73, 0xbb74, 0xc0e0, 0xf4cc, 0xd7d1, 0xbb75, 0xbb76, /*0x78-0x7f*/
+  0xbb77, 0xbb78, 0xbb79, 0xbb7a, 0xbb7b, 0xbb7c, 0xbb7d, 0xbb7e, /*0x80-0x87*/
+  0xbb80, 0xb7db, 0xbb81, 0xbb82, 0xbb83, 0xbb84, 0xbb85, 0xbb86, /*0x88-0x8f*/
+  0xbb87, 0xf4ce, 0xc1a3, 0xbb88, 0xbb89, 0xc6c9, 0xbb8a, 0xb4d6, /*0x90-0x97*/
+  0xd5b3, 0xbb8b, 0xbb8c, 0xbb8d, 0xf4d0, 0xf4cf, 0xf4d1, 0xcbda, /*0x98-0x9f*/
+  0xbb8e, 0xbb8f, 0xf4d2, 0xbb90, 0xd4c1, 0xd6e0, 0xbb91, 0xbb92, /*0xa0-0xa7*/
+  0xbb93, 0xbb94, 0xb7e0, 0xbb95, 0xbb96, 0xbb97, 0xc1b8, 0xbb98, /*0xa8-0xaf*/
+  0xbb99, 0xc1bb, 0xf4d3, 0xbeac, 0xbb9a, 0xbb9b, 0xbb9c, 0xbb9d, /*0xb0-0xb7*/
+  0xbb9e, 0xb4e2, 0xbb9f, 0xbba0, 0xf4d4, 0xf4d5, 0xbeab, 0xbc40, /*0xb8-0xbf*/
+  0xbc41, 0xf4d6, 0xbc42, 0xbc43, 0xbc44, 0xf4db, 0xbc45, 0xf4d7, /*0xc0-0xc7*/
+  0xf4da, 0xbc46, 0xbafd, 0xbc47, 0xf4d8, 0xf4d9, 0xbc48, 0xbc49, /*0xc8-0xcf*/
+  0xbc4a, 0xbc4b, 0xbc4c, 0xbc4d, 0xbc4e, 0xb8e2, 0xccc7, 0xf4dc, /*0xd0-0xd7*/
+  0xbc4f, 0xb2da, 0xbc50, 0xbc51, 0xc3d3, 0xbc52, 0xbc53, 0xd4e3, /*0xd8-0xdf*/
+  0xbfb7, 0xbc54, 0xbc55, 0xbc56, 0xbc57, 0xbc58, 0xbc59, 0xbc5a, /*0xe0-0xe7*/
+  0xf4dd, 0xbc5b, 0xbc5c, 0xbc5d, 0xbc5e, 0xbc5f, 0xbc60, 0xc5b4, /*0xe8-0xef*/
+  0xbc61, 0xbc62, 0xbc63, 0xbc64, 0xbc65, 0xbc66, 0xbc67, 0xbc68, /*0xf0-0xf7*/
+  0xf4e9, 0xbc69, 0xbc6a, 0xcfb5, 0xbc6b, 0xbc6c, 0xbc6d, 0xbc6e, /*0xf8-0xff*/
+  /* 0x7d00 */
+  0xbc6f, 0xbc70, 0xbc71, 0xbc72, 0xbc73, 0xbc74, 0xbc75, 0xbc76, /*0x00-0x07*/
+  0xbc77, 0xbc78, 0xcec9, 0xbc79, 0xbc7a, 0xbc7b, 0xbc7c, 0xbc7d, /*0x08-0x0f*/
+  0xbc7e, 0xbc80, 0xbc81, 0xbc82, 0xbc83, 0xbc84, 0xbc85, 0xbc86, /*0x10-0x17*/
+  0xbc87, 0xbc88, 0xbc89, 0xbc8a, 0xbc8b, 0xbc8c, 0xbc8d, 0xbc8e, /*0x18-0x1f*/
+  0xcbd8, 0xbc8f, 0xcbf7, 0xbc90, 0xbc91, 0xbc92, 0xbc93, 0xbdf4, /*0x20-0x27*/
+  0xbc94, 0xbc95, 0xbc96, 0xd7cf, 0xbc97, 0xbc98, 0xbc99, 0xc0db, /*0x28-0x2f*/
+  0xbc9a, 0xbc9b, 0xbc9c, 0xbc9d, 0xbc9e, 0xbc9f, 0xbca0, 0xbd40, /*0x30-0x37*/
+  0xbd41, 0xbd42, 0xbd43, 0xbd44, 0xbd45, 0xbd46, 0xbd47, 0xbd48, /*0x38-0x3f*/
+  0xbd49, 0xbd4a, 0xbd4b, 0xbd4c, 0xbd4d, 0xbd4e, 0xbd4f, 0xbd50, /*0x40-0x47*/
+  0xbd51, 0xbd52, 0xbd53, 0xbd54, 0xbd55, 0xbd56, 0xbd57, 0xbd58, /*0x48-0x4f*/
+  0xbd59, 0xbd5a, 0xbd5b, 0xbd5c, 0xbd5d, 0xbd5e, 0xbd5f, 0xbd60, /*0x50-0x57*/
+  0xbd61, 0xbd62, 0xbd63, 0xbd64, 0xbd65, 0xbd66, 0xbd67, 0xbd68, /*0x58-0x5f*/
+  0xbd69, 0xbd6a, 0xbd6b, 0xbd6c, 0xbd6d, 0xbd6e, 0xbd6f, 0xbd70, /*0x60-0x67*/
+  0xbd71, 0xbd72, 0xbd73, 0xbd74, 0xbd75, 0xbd76, 0xd0f5, 0xbd77, /*0x68-0x6f*/
+  0xbd78, 0xbd79, 0xbd7a, 0xbd7b, 0xbd7c, 0xbd7d, 0xbd7e, 0xf4ea, /*0x70-0x77*/
+  0xbd80, 0xbd81, 0xbd82, 0xbd83, 0xbd84, 0xbd85, 0xbd86, 0xbd87, /*0x78-0x7f*/
+  0xbd88, 0xbd89, 0xbd8a, 0xbd8b, 0xbd8c, 0xbd8d, 0xbd8e, 0xbd8f, /*0x80-0x87*/
+  0xbd90, 0xbd91, 0xbd92, 0xbd93, 0xbd94, 0xbd95, 0xbd96, 0xbd97, /*0x88-0x8f*/
+  0xbd98, 0xbd99, 0xbd9a, 0xbd9b, 0xbd9c, 0xbd9d, 0xbd9e, 0xbd9f, /*0x90-0x97*/
+  0xbda0, 0xbe40, 0xbe41, 0xbe42, 0xbe43, 0xbe44, 0xbe45, 0xbe46, /*0x98-0x9f*/
+  0xbe47, 0xbe48, 0xbe49, 0xbe4a, 0xbe4b, 0xbe4c, 0xf4eb, 0xbe4d, /*0xa0-0xa7*/
+  0xbe4e, 0xbe4f, 0xbe50, 0xbe51, 0xbe52, 0xbe53, 0xf4ec, 0xbe54, /*0xa8-0xaf*/
+  0xbe55, 0xbe56, 0xbe57, 0xbe58, 0xbe59, 0xbe5a, 0xbe5b, 0xbe5c, /*0xb0-0xb7*/
+  0xbe5d, 0xbe5e, 0xbe5f, 0xbe60, 0xbe61, 0xbe62, 0xbe63, 0xbe64, /*0xb8-0xbf*/
+  0xbe65, 0xbe66, 0xbe67, 0xbe68, 0xbe69, 0xbe6a, 0xbe6b, 0xbe6c, /*0xc0-0xc7*/
+  0xbe6d, 0xbe6e, 0xbe6f, 0xbe70, 0xbe71, 0xbe72, 0xbe73, 0xbe74, /*0xc8-0xcf*/
+  0xbe75, 0xbe76, 0xbe77, 0xbe78, 0xbe79, 0xbe7a, 0xbe7b, 0xbe7c, /*0xd0-0xd7*/
+  0xbe7d, 0xbe7e, 0xbe80, 0xbe81, 0xbe82, 0xbe83, 0xbe84, 0xbe85, /*0xd8-0xdf*/
+  0xbe86, 0xbe87, 0xbe88, 0xbe89, 0xbe8a, 0xbe8b, 0xbe8c, 0xbe8d, /*0xe0-0xe7*/
+  0xbe8e, 0xbe8f, 0xbe90, 0xbe91, 0xbe92, 0xbe93, 0xbe94, 0xbe95, /*0xe8-0xef*/
+  0xbe96, 0xbe97, 0xbe98, 0xbe99, 0xbe9a, 0xbe9b, 0xbe9c, 0xbe9d, /*0xf0-0xf7*/
+  0xbe9e, 0xbe9f, 0xbea0, 0xbf40, 0xbf41, 0xbf42, 0xbf43, 0xbf44, /*0xf8-0xff*/
+  /* 0x7e00 */
+  0xbf45, 0xbf46, 0xbf47, 0xbf48, 0xbf49, 0xbf4a, 0xbf4b, 0xbf4c, /*0x00-0x07*/
+  0xbf4d, 0xbf4e, 0xbf4f, 0xbf50, 0xbf51, 0xbf52, 0xbf53, 0xbf54, /*0x08-0x0f*/
+  0xbf55, 0xbf56, 0xbf57, 0xbf58, 0xbf59, 0xbf5a, 0xbf5b, 0xbf5c, /*0x10-0x17*/
+  0xbf5d, 0xbf5e, 0xbf5f, 0xbf60, 0xbf61, 0xbf62, 0xbf63, 0xbf64, /*0x18-0x1f*/
+  0xbf65, 0xbf66, 0xbf67, 0xbf68, 0xbf69, 0xbf6a, 0xbf6b, 0xbf6c, /*0x20-0x27*/
+  0xbf6d, 0xbf6e, 0xbf6f, 0xbf70, 0xbf71, 0xbf72, 0xbf73, 0xbf74, /*0x28-0x2f*/
+  0xbf75, 0xbf76, 0xbf77, 0xbf78, 0xbf79, 0xbf7a, 0xbf7b, 0xbf7c, /*0x30-0x37*/
+  0xbf7d, 0xbf7e, 0xbf80, 0xf7e3, 0xbf81, 0xbf82, 0xbf83, 0xbf84, /*0x38-0x3f*/
+  0xbf85, 0xb7b1, 0xbf86, 0xbf87, 0xbf88, 0xbf89, 0xbf8a, 0xf4ed, /*0x40-0x47*/
+  0xbf8b, 0xbf8c, 0xbf8d, 0xbf8e, 0xbf8f, 0xbf90, 0xbf91, 0xbf92, /*0x48-0x4f*/
+  0xbf93, 0xbf94, 0xbf95, 0xbf96, 0xbf97, 0xbf98, 0xbf99, 0xbf9a, /*0x50-0x57*/
+  0xbf9b, 0xbf9c, 0xbf9d, 0xbf9e, 0xbf9f, 0xbfa0, 0xc040, 0xc041, /*0x58-0x5f*/
+  0xc042, 0xc043, 0xc044, 0xc045, 0xc046, 0xc047, 0xc048, 0xc049, /*0x60-0x67*/
+  0xc04a, 0xc04b, 0xc04c, 0xc04d, 0xc04e, 0xc04f, 0xc050, 0xc051, /*0x68-0x6f*/
+  0xc052, 0xc053, 0xc054, 0xc055, 0xc056, 0xc057, 0xc058, 0xc059, /*0x70-0x77*/
+  0xc05a, 0xc05b, 0xc05c, 0xc05d, 0xc05e, 0xc05f, 0xc060, 0xc061, /*0x78-0x7f*/
+  0xc062, 0xc063, 0xd7eb, 0xc064, 0xc065, 0xc066, 0xc067, 0xc068, /*0x80-0x87*/
+  0xc069, 0xc06a, 0xc06b, 0xc06c, 0xc06d, 0xc06e, 0xc06f, 0xc070, /*0x88-0x8f*/
+  0xc071, 0xc072, 0xc073, 0xc074, 0xc075, 0xc076, 0xc077, 0xc078, /*0x90-0x97*/
+  0xc079, 0xc07a, 0xc07b, 0xf4ee, 0xc07c, 0xc07d, 0xc07e, 0xe6f9, /*0x98-0x9f*/
+  0xbec0, 0xe6fa, 0xbaec, 0xe6fb, 0xcfcb, 0xe6fc, 0xd4bc, 0xbcb6, /*0xa0-0xa7*/
+  0xe6fd, 0xe6fe, 0xbccd, 0xc8d2, 0xceb3, 0xe7a1, 0xc080, 0xb4bf, /*0xa8-0xaf*/
+  0xe7a2, 0xc9b4, 0xb8d9, 0xc4c9, 0xc081, 0xd7dd, 0xc2da, 0xb7d7, /*0xb0-0xb7*/
+  0xd6bd, 0xcec6, 0xb7c4, 0xc082, 0xc083, 0xc5a6, 0xe7a3, 0xcfdf, /*0xb8-0xbf*/
+  0xe7a4, 0xe7a5, 0xe7a6, 0xc1b7, 0xd7e9, 0xc9f0, 0xcfb8, 0xd6af, /*0xc0-0xc7*/
+  0xd6d5, 0xe7a7, 0xb0ed, 0xe7a8, 0xe7a9, 0xc9dc, 0xd2ef, 0xbead, /*0xc8-0xcf*/
+  0xe7aa, 0xb0f3, 0xc8de, 0xbde1, 0xe7ab, 0xc8c6, 0xc084, 0xe7ac, /*0xd0-0xd7*/
+  0xbbe6, 0xb8f8, 0xd1a4, 0xe7ad, 0xc2e7, 0xbef8, 0xbdca, 0xcdb3, /*0xd8-0xdf*/
+  0xe7ae, 0xe7af, 0xbeee, 0xd0e5, 0xc085, 0xcbe7, 0xccd0, 0xbccc, /*0xe0-0xe7*/
+  0xe7b0, 0xbca8, 0xd0f7, 0xe7b1, 0xc086, 0xd0f8, 0xe7b2, 0xe7b3, /*0xe8-0xef*/
+  0xb4c2, 0xe7b4, 0xe7b5, 0xc9fe, 0xceac, 0xc3e0, 0xe7b7, 0xb1c1, /*0xf0-0xf7*/
+  0xb3f1, 0xc087, 0xe7b8, 0xe7b9, 0xd7db, 0xd5c0, 0xe7ba, 0xc2cc, /*0xf8-0xff*/
+  /* 0x7f00 */
+  0xd7ba, 0xe7bb, 0xe7bc, 0xe7bd, 0xbcea, 0xc3e5, 0xc0c2, 0xe7be, /*0x00-0x07*/
+  0xe7bf, 0xbca9, 0xc088, 0xe7c0, 0xe7c1, 0xe7b6, 0xb6d0, 0xe7c2, /*0x08-0x0f*/
+  0xc089, 0xe7c3, 0xe7c4, 0xbbba, 0xb5de, 0xc2c6, 0xb1e0, 0xe7c5, /*0x10-0x17*/
+  0xd4b5, 0xe7c6, 0xb8bf, 0xe7c8, 0xe7c7, 0xb7ec, 0xc08a, 0xe7c9, /*0x18-0x1f*/
+  0xb2f8, 0xe7ca, 0xe7cb, 0xe7cc, 0xe7cd, 0xe7ce, 0xe7cf, 0xe7d0, /*0x20-0x27*/
+  0xd3a7, 0xcbf5, 0xe7d1, 0xe7d2, 0xe7d3, 0xe7d4, 0xc9c9, 0xe7d5, /*0x28-0x2f*/
+  0xe7d6, 0xe7d7, 0xe7d8, 0xe7d9, 0xbdc9, 0xe7da, 0xf3be, 0xc08b, /*0x30-0x37*/
+  0xb8d7, 0xc08c, 0xc8b1, 0xc08d, 0xc08e, 0xc08f, 0xc090, 0xc091, /*0x38-0x3f*/
+  0xc092, 0xc093, 0xf3bf, 0xc094, 0xf3c0, 0xf3c1, 0xc095, 0xc096, /*0x40-0x47*/
+  0xc097, 0xc098, 0xc099, 0xc09a, 0xc09b, 0xc09c, 0xc09d, 0xc09e, /*0x48-0x4f*/
+  0xb9de, 0xcdf8, 0xc09f, 0xc0a0, 0xd8e8, 0xbab1, 0xc140, 0xc2de, /*0x50-0x57*/
+  0xeeb7, 0xc141, 0xb7a3, 0xc142, 0xc143, 0xc144, 0xc145, 0xeeb9, /*0x58-0x5f*/
+  0xc146, 0xeeb8, 0xb0d5, 0xc147, 0xc148, 0xc149, 0xc14a, 0xc14b, /*0x60-0x67*/
+  0xeebb, 0xd5d6, 0xd7ef, 0xc14c, 0xc14d, 0xc14e, 0xd6c3, 0xc14f, /*0x68-0x6f*/
+  0xc150, 0xeebd, 0xcaf0, 0xc151, 0xeebc, 0xc152, 0xc153, 0xc154, /*0x70-0x77*/
+  0xc155, 0xeebe, 0xc156, 0xc157, 0xc158, 0xc159, 0xeec0, 0xc15a, /*0x78-0x7f*/
+  0xc15b, 0xeebf, 0xc15c, 0xc15d, 0xc15e, 0xc15f, 0xc160, 0xc161, /*0x80-0x87*/
+  0xc162, 0xc163, 0xd1f2, 0xc164, 0xc7bc, 0xc165, 0xc3c0, 0xc166, /*0x88-0x8f*/
+  0xc167, 0xc168, 0xc169, 0xc16a, 0xb8e1, 0xc16b, 0xc16c, 0xc16d, /*0x90-0x97*/
+  0xc16e, 0xc16f, 0xc1e7, 0xc170, 0xc171, 0xf4c6, 0xd0df, 0xf4c7, /*0x98-0x9f*/
+  0xc172, 0xcfdb, 0xc173, 0xc174, 0xc8ba, 0xc175, 0xc176, 0xf4c8, /*0xa0-0xa7*/
+  0xc177, 0xc178, 0xc179, 0xc17a, 0xc17b, 0xc17c, 0xc17d, 0xf4c9, /*0xa8-0xaf*/
+  0xf4ca, 0xc17e, 0xf4cb, 0xc180, 0xc181, 0xc182, 0xc183, 0xc184, /*0xb0-0xb7*/
+  0xd9fa, 0xb8fe, 0xc185, 0xc186, 0xe5f1, 0xd3f0, 0xc187, 0xf4e0, /*0xb8-0xbf*/
+  0xc188, 0xcecc, 0xc189, 0xc18a, 0xc18b, 0xb3e1, 0xc18c, 0xc18d, /*0xc0-0xc7*/
+  0xc18e, 0xc18f, 0xf1b4, 0xc190, 0xd2ee, 0xc191, 0xf4e1, 0xc192, /*0xc8-0xcf*/
+  0xc193, 0xc194, 0xc195, 0xc196, 0xcfe8, 0xf4e2, 0xc197, 0xc198, /*0xd0-0xd7*/
+  0xc7cc, 0xc199, 0xc19a, 0xc19b, 0xc19c, 0xc19d, 0xc19e, 0xb5d4, /*0xd8-0xdf*/
+  0xb4e4, 0xf4e4, 0xc19f, 0xc1a0, 0xc240, 0xf4e3, 0xf4e5, 0xc241, /*0xe0-0xe7*/
+  0xc242, 0xf4e6, 0xc243, 0xc244, 0xc245, 0xc246, 0xf4e7, 0xc247, /*0xe8-0xef*/
+  0xbab2, 0xb0bf, 0xc248, 0xf4e8, 0xc249, 0xc24a, 0xc24b, 0xc24c, /*0xf0-0xf7*/
+  0xc24d, 0xc24e, 0xc24f, 0xb7ad, 0xd2ed, 0xc250, 0xc251, 0xc252, /*0xf8-0xff*/
+  /* 0x8000 */
+  0xd2ab, 0xc0cf, 0xc253, 0xbfbc, 0xeba3, 0xd5df, 0xeac8, 0xc254, /*0x00-0x07*/
+  0xc255, 0xc256, 0xc257, 0xf1f3, 0xb6f8, 0xcba3, 0xc258, 0xc259, /*0x08-0x0f*/
+  0xc4cd, 0xc25a, 0xf1e7, 0xc25b, 0xf1e8, 0xb8fb, 0xf1e9, 0xbac4, /*0x10-0x17*/
+  0xd4c5, 0xb0d2, 0xc25c, 0xc25d, 0xf1ea, 0xc25e, 0xc25f, 0xc260, /*0x18-0x1f*/
+  0xf1eb, 0xc261, 0xf1ec, 0xc262, 0xc263, 0xf1ed, 0xf1ee, 0xf1ef, /*0x20-0x27*/
+  0xf1f1, 0xf1f0, 0xc5d5, 0xc264, 0xc265, 0xc266, 0xc267, 0xc268, /*0x28-0x2f*/
+  0xc269, 0xf1f2, 0xc26a, 0xb6fa, 0xc26b, 0xf1f4, 0xd2ae, 0xdec7, /*0x30-0x37*/
+  0xcbca, 0xc26c, 0xc26d, 0xb3dc, 0xc26e, 0xb5a2, 0xc26f, 0xb9a2, /*0x38-0x3f*/
+  0xc270, 0xc271, 0xc4f4, 0xf1f5, 0xc272, 0xc273, 0xf1f6, 0xc274, /*0x40-0x47*/
+  0xc275, 0xc276, 0xc1c4, 0xc1fb, 0xd6b0, 0xf1f7, 0xc277, 0xc278, /*0x48-0x4f*/
+  0xc279, 0xc27a, 0xf1f8, 0xc27b, 0xc1aa, 0xc27c, 0xc27d, 0xc27e, /*0x50-0x57*/
+  0xc6b8, 0xc280, 0xbedb, 0xc281, 0xc282, 0xc283, 0xc284, 0xc285, /*0x58-0x5f*/
+  0xc286, 0xc287, 0xc288, 0xc289, 0xc28a, 0xc28b, 0xc28c, 0xc28d, /*0x60-0x67*/
+  0xc28e, 0xf1f9, 0xb4cf, 0xc28f, 0xc290, 0xc291, 0xc292, 0xc293, /*0x68-0x6f*/
+  0xc294, 0xf1fa, 0xc295, 0xc296, 0xc297, 0xc298, 0xc299, 0xc29a, /*0x70-0x77*/
+  0xc29b, 0xc29c, 0xc29d, 0xc29e, 0xc29f, 0xc2a0, 0xc340, 0xedb2, /*0x78-0x7f*/
+  0xedb1, 0xc341, 0xc342, 0xcbe0, 0xd2de, 0xc343, 0xcbc1, 0xd5d8, /*0x80-0x87*/
+  0xc344, 0xc8e2, 0xc345, 0xc0df, 0xbca1, 0xc346, 0xc347, 0xc348, /*0x88-0x8f*/
+  0xc349, 0xc34a, 0xc34b, 0xebc1, 0xc34c, 0xc34d, 0xd0a4, 0xc34e, /*0x90-0x97*/
+  0xd6e2, 0xc34f, 0xb6c7, 0xb8d8, 0xebc0, 0xb8ce, 0xc350, 0xebbf, /*0x98-0x9f*/
+  0xb3a6, 0xb9c9, 0xd6ab, 0xc351, 0xb7f4, 0xb7ca, 0xc352, 0xc353, /*0xa0-0xa7*/
+  0xc354, 0xbce7, 0xb7be, 0xebc6, 0xc355, 0xebc7, 0xb0b9, 0xbfcf, /*0xa8-0xaf*/
+  0xc356, 0xebc5, 0xd3fd, 0xc357, 0xebc8, 0xc358, 0xc359, 0xebc9, /*0xb0-0xb7*/
+  0xc35a, 0xc35b, 0xb7ce, 0xc35c, 0xebc2, 0xebc4, 0xc9f6, 0xd6d7, /*0xb8-0xbf*/
+  0xd5cd, 0xd0b2, 0xebcf, 0xceb8, 0xebd0, 0xc35d, 0xb5a8, 0xc35e, /*0xc0-0xc7*/
+  0xc35f, 0xc360, 0xc361, 0xc362, 0xb1b3, 0xebd2, 0xcca5, 0xc363, /*0xc8-0xcf*/
+  0xc364, 0xc365, 0xc366, 0xc367, 0xc368, 0xc369, 0xc5d6, 0xebd3, /*0xd0-0xd7*/
+  0xc36a, 0xebd1, 0xc5df, 0xebce, 0xcaa4, 0xebd5, 0xb0fb, 0xc36b, /*0xd8-0xdf*/
+  0xc36c, 0xbafa, 0xc36d, 0xc36e, 0xd8b7, 0xf1e3, 0xc36f, 0xebca, /*0xe0-0xe7*/
+  0xebcb, 0xebcc, 0xebcd, 0xebd6, 0xe6c0, 0xebd9, 0xc370, 0xbfe8, /*0xe8-0xef*/
+  0xd2c8, 0xebd7, 0xebdc, 0xb8ec, 0xebd8, 0xc371, 0xbdba, 0xc372, /*0xf0-0xf7*/
+  0xd0d8, 0xc373, 0xb0b7, 0xc374, 0xebdd, 0xc4dc, 0xc375, 0xc376, /*0xf8-0xff*/
+  /* 0x8100 */
+  0xc377, 0xc378, 0xd6ac, 0xc379, 0xc37a, 0xc37b, 0xb4e0, 0xc37c, /*0x00-0x07*/
+  0xc37d, 0xc2f6, 0xbcb9, 0xc37e, 0xc380, 0xebda, 0xebdb, 0xd4e0, /*0x08-0x0f*/
+  0xc6ea, 0xc4d4, 0xebdf, 0xc5a7, 0xd9f5, 0xc381, 0xb2b1, 0xc382, /*0x10-0x17*/
+  0xebe4, 0xc383, 0xbdc5, 0xc384, 0xc385, 0xc386, 0xebe2, 0xc387, /*0x18-0x1f*/
+  0xc388, 0xc389, 0xc38a, 0xc38b, 0xc38c, 0xc38d, 0xc38e, 0xc38f, /*0x20-0x27*/
+  0xc390, 0xc391, 0xc392, 0xc393, 0xebe3, 0xc394, 0xc395, 0xb8ac, /*0x28-0x2f*/
+  0xc396, 0xcdd1, 0xebe5, 0xc397, 0xc398, 0xc399, 0xebe1, 0xc39a, /*0x30-0x37*/
+  0xc1b3, 0xc39b, 0xc39c, 0xc39d, 0xc39e, 0xc39f, 0xc6a2, 0xc3a0, /*0x38-0x3f*/
+  0xc440, 0xc441, 0xc442, 0xc443, 0xc444, 0xc445, 0xccf3, 0xc446, /*0x40-0x47*/
+  0xebe6, 0xc447, 0xc0b0, 0xd2b8, 0xebe7, 0xc448, 0xc449, 0xc44a, /*0x48-0x4f*/
+  0xb8af, 0xb8ad, 0xc44b, 0xebe8, 0xc7bb, 0xcdf3, 0xc44c, 0xc44d, /*0x50-0x57*/
+  0xc44e, 0xebea, 0xebeb, 0xc44f, 0xc450, 0xc451, 0xc452, 0xc453, /*0x58-0x5f*/
+  0xebed, 0xc454, 0xc455, 0xc456, 0xc457, 0xd0c8, 0xc458, 0xebf2, /*0x60-0x67*/
+  0xc459, 0xebee, 0xc45a, 0xc45b, 0xc45c, 0xebf1, 0xc8f9, 0xc45d, /*0x68-0x6f*/
+  0xd1fc, 0xebec, 0xc45e, 0xc45f, 0xebe9, 0xc460, 0xc461, 0xc462, /*0x70-0x77*/
+  0xc463, 0xb8b9, 0xcfd9, 0xc4e5, 0xebef, 0xebf0, 0xccda, 0xcdc8, /*0x78-0x7f*/
+  0xb0f2, 0xc464, 0xebf6, 0xc465, 0xc466, 0xc467, 0xc468, 0xc469, /*0x80-0x87*/
+  0xebf5, 0xc46a, 0xb2b2, 0xc46b, 0xc46c, 0xc46d, 0xc46e, 0xb8e0, /*0x88-0x8f*/
+  0xc46f, 0xebf7, 0xc470, 0xc471, 0xc472, 0xc473, 0xc474, 0xc475, /*0x90-0x97*/
+  0xb1ec, 0xc476, 0xc477, 0xccc5, 0xc4a4, 0xcfa5, 0xc478, 0xc479, /*0x98-0x9f*/
+  0xc47a, 0xc47b, 0xc47c, 0xebf9, 0xc47d, 0xc47e, 0xeca2, 0xc480, /*0xa0-0xa7*/
+  0xc5f2, 0xc481, 0xebfa, 0xc482, 0xc483, 0xc484, 0xc485, 0xc486, /*0xa8-0xaf*/
+  0xc487, 0xc488, 0xc489, 0xc9c5, 0xc48a, 0xc48b, 0xc48c, 0xc48d, /*0xb0-0xb7*/
+  0xc48e, 0xc48f, 0xe2df, 0xebfe, 0xc490, 0xc491, 0xc492, 0xc493, /*0xb8-0xbf*/
+  0xcdce, 0xeca1, 0xb1db, 0xd3b7, 0xc494, 0xc495, 0xd2dc, 0xc496, /*0xc0-0xc7*/
+  0xc497, 0xc498, 0xebfd, 0xc499, 0xebfb, 0xc49a, 0xc49b, 0xc49c, /*0xc8-0xcf*/
+  0xc49d, 0xc49e, 0xc49f, 0xc4a0, 0xc540, 0xc541, 0xc542, 0xc543, /*0xd0-0xd7*/
+  0xc544, 0xc545, 0xc546, 0xc547, 0xc548, 0xc549, 0xc54a, 0xc54b, /*0xd8-0xdf*/
+  0xc54c, 0xc54d, 0xc54e, 0xb3bc, 0xc54f, 0xc550, 0xc551, 0xeab0, /*0xe0-0xe7*/
+  0xc552, 0xc553, 0xd7d4, 0xc554, 0xf4ab, 0xb3f4, 0xc555, 0xc556, /*0xe8-0xef*/
+  0xc557, 0xc558, 0xc559, 0xd6c1, 0xd6c2, 0xc55a, 0xc55b, 0xc55c, /*0xf0-0xf7*/
+  0xc55d, 0xc55e, 0xc55f, 0xd5e9, 0xbeca, 0xc560, 0xf4a7, 0xc561, /*0xf8-0xff*/
+  /* 0x8200 */
+  0xd2a8, 0xf4a8, 0xf4a9, 0xc562, 0xf4aa, 0xbecb, 0xd3df, 0xc563, /*0x00-0x07*/
+  0xc564, 0xc565, 0xc566, 0xc567, 0xc9e0, 0xc9e1, 0xc568, 0xc569, /*0x08-0x0f*/
+  0xf3c2, 0xc56a, 0xcae6, 0xc56b, 0xccf2, 0xc56c, 0xc56d, 0xc56e, /*0x10-0x17*/
+  0xc56f, 0xc570, 0xc571, 0xe2b6, 0xcbb4, 0xc572, 0xcee8, 0xd6db, /*0x18-0x1f*/
+  0xc573, 0xf4ad, 0xf4ae, 0xf4af, 0xc574, 0xc575, 0xc576, 0xc577, /*0x20-0x27*/
+  0xf4b2, 0xc578, 0xbabd, 0xf4b3, 0xb0e3, 0xf4b0, 0xc579, 0xf4b1, /*0x28-0x2f*/
+  0xbda2, 0xb2d5, 0xc57a, 0xf4b6, 0xf4b7, 0xb6e6, 0xb2b0, 0xcfcf, /*0x30-0x37*/
+  0xf4b4, 0xb4ac, 0xc57b, 0xf4b5, 0xc57c, 0xc57d, 0xf4b8, 0xc57e, /*0x38-0x3f*/
+  0xc580, 0xc581, 0xc582, 0xc583, 0xf4b9, 0xc584, 0xc585, 0xcda7, /*0x40-0x47*/
+  0xc586, 0xf4ba, 0xc587, 0xf4bb, 0xc588, 0xc589, 0xc58a, 0xf4bc, /*0x48-0x4f*/
+  0xc58b, 0xc58c, 0xc58d, 0xc58e, 0xc58f, 0xc590, 0xc591, 0xc592, /*0x50-0x57*/
+  0xcbd2, 0xc593, 0xf4bd, 0xc594, 0xc595, 0xc596, 0xc597, 0xf4be, /*0x58-0x5f*/
+  0xc598, 0xc599, 0xc59a, 0xc59b, 0xc59c, 0xc59d, 0xc59e, 0xc59f, /*0x60-0x67*/
+  0xf4bf, 0xc5a0, 0xc640, 0xc641, 0xc642, 0xc643, 0xf4de, 0xc1bc, /*0x68-0x6f*/
+  0xbce8, 0xc644, 0xc9ab, 0xd1de, 0xe5f5, 0xc645, 0xc646, 0xc647, /*0x70-0x77*/
+  0xc648, 0xdcb3, 0xd2d5, 0xc649, 0xc64a, 0xdcb4, 0xb0ac, 0xdcb5, /*0x78-0x7f*/
+  0xc64b, 0xc64c, 0xbdda, 0xc64d, 0xdcb9, 0xc64e, 0xc64f, 0xc650, /*0x80-0x87*/
+  0xd8c2, 0xc651, 0xdcb7, 0xd3f3, 0xc652, 0xc9d6, 0xdcba, 0xdcb6, /*0x88-0x8f*/
+  0xc653, 0xdcbb, 0xc3a2, 0xc654, 0xc655, 0xc656, 0xc657, 0xdcbc, /*0x90-0x97*/
+  0xdcc5, 0xdcbd, 0xc658, 0xc659, 0xcedf, 0xd6a5, 0xc65a, 0xdccf, /*0x98-0x9f*/
+  0xc65b, 0xdccd, 0xc65c, 0xc65d, 0xdcd2, 0xbde6, 0xc2ab, 0xc65e, /*0xa0-0xa7*/
+  0xdcb8, 0xdccb, 0xdcce, 0xdcbe, 0xb7d2, 0xb0c5, 0xdcc7, 0xd0be, /*0xa8-0xaf*/
+  0xdcc1, 0xbba8, 0xc65f, 0xb7bc, 0xdccc, 0xc660, 0xc661, 0xdcc6, /*0xb0-0xb7*/
+  0xdcbf, 0xc7db, 0xc662, 0xc663, 0xc664, 0xd1bf, 0xdcc0, 0xc665, /*0xb8-0xbf*/
+  0xc666, 0xdcca, 0xc667, 0xc668, 0xdcd0, 0xc669, 0xc66a, 0xcead, /*0xc0-0xc7*/
+  0xdcc2, 0xc66b, 0xdcc3, 0xdcc8, 0xdcc9, 0xb2d4, 0xdcd1, 0xcbd5, /*0xc8-0xcf*/
+  0xc66c, 0xd4b7, 0xdcdb, 0xdcdf, 0xcca6, 0xdce6, 0xc66d, 0xc3e7, /*0xd0-0xd7*/
+  0xdcdc, 0xc66e, 0xc66f, 0xbfc1, 0xdcd9, 0xc670, 0xb0fa, 0xb9b6, /*0xd8-0xdf*/
+  0xdce5, 0xdcd3, 0xc671, 0xdcc4, 0xdcd6, 0xc8f4, 0xbfe0, 0xc672, /*0xe0-0xe7*/
+  0xc673, 0xc674, 0xc675, 0xc9bb, 0xc676, 0xc677, 0xc678, 0xb1bd, /*0xe8-0xef*/
+  0xc679, 0xd3a2, 0xc67a, 0xc67b, 0xdcda, 0xc67c, 0xc67d, 0xdcd5, /*0xf0-0xf7*/
+  0xc67e, 0xc6bb, 0xc680, 0xdcde, 0xc681, 0xc682, 0xc683, 0xc684, /*0xf8-0xff*/
+  /* 0x8300 */
+  0xc685, 0xd7c2, 0xc3af, 0xb7b6, 0xc7d1, 0xc3a9, 0xdce2, 0xdcd8, /*0x00-0x07*/
+  0xdceb, 0xdcd4, 0xc686, 0xc687, 0xdcdd, 0xc688, 0xbea5, 0xdcd7, /*0x08-0x0f*/
+  0xc689, 0xdce0, 0xc68a, 0xc68b, 0xdce3, 0xdce4, 0xc68c, 0xdcf8, /*0x10-0x17*/
+  0xc68d, 0xc68e, 0xdce1, 0xdda2, 0xdce7, 0xc68f, 0xc690, 0xc691, /*0x18-0x1f*/
+  0xc692, 0xc693, 0xc694, 0xc695, 0xc696, 0xc697, 0xc698, 0xbceb, /*0x20-0x27*/
+  0xb4c4, 0xc699, 0xc69a, 0xc3a3, 0xb2e7, 0xdcfa, 0xc69b, 0xdcf2, /*0x28-0x2f*/
+  0xc69c, 0xdcef, 0xc69d, 0xdcfc, 0xdcee, 0xd2f0, 0xb2e8, 0xc69e, /*0x30-0x37*/
+  0xc8d7, 0xc8e3, 0xdcfb, 0xc69f, 0xdced, 0xc6a0, 0xc740, 0xc741, /*0x38-0x3f*/
+  0xdcf7, 0xc742, 0xc743, 0xdcf5, 0xc744, 0xc745, 0xbea3, 0xdcf4, /*0x40-0x47*/
+  0xc746, 0xb2dd, 0xc747, 0xc748, 0xc749, 0xc74a, 0xc74b, 0xdcf3, /*0x48-0x4f*/
+  0xbcf6, 0xdce8, 0xbbc4, 0xc74c, 0xc0f3, 0xc74d, 0xc74e, 0xc74f, /*0x50-0x57*/
+  0xc750, 0xc751, 0xbcd4, 0xdce9, 0xdcea, 0xc752, 0xdcf1, 0xdcf6, /*0x58-0x5f*/
+  0xdcf9, 0xb5b4, 0xc753, 0xc8d9, 0xbbe7, 0xdcfe, 0xdcfd, 0xd3ab, /*0x60-0x67*/
+  0xdda1, 0xdda3, 0xdda5, 0xd2f1, 0xdda4, 0xdda6, 0xdda7, 0xd2a9, /*0x68-0x6f*/
+  0xc754, 0xc755, 0xc756, 0xc757, 0xc758, 0xc759, 0xc75a, 0xbac9, /*0x70-0x77*/
+  0xdda9, 0xc75b, 0xc75c, 0xddb6, 0xddb1, 0xddb4, 0xc75d, 0xc75e, /*0x78-0x7f*/
+  0xc75f, 0xc760, 0xc761, 0xc762, 0xc763, 0xddb0, 0xc6ce, 0xc764, /*0x80-0x87*/
+  0xc765, 0xc0f2, 0xc766, 0xc767, 0xc768, 0xc769, 0xc9af, 0xc76a, /*0x88-0x8f*/
+  0xc76b, 0xc76c, 0xdcec, 0xddae, 0xc76d, 0xc76e, 0xc76f, 0xc770, /*0x90-0x97*/
+  0xddb7, 0xc771, 0xc772, 0xdcf0, 0xddaf, 0xc773, 0xddb8, 0xc774, /*0x98-0x9f*/
+  0xddac, 0xc775, 0xc776, 0xc777, 0xc778, 0xc779, 0xc77a, 0xc77b, /*0xa0-0xa7*/
+  0xddb9, 0xddb3, 0xddad, 0xc4aa, 0xc77c, 0xc77d, 0xc77e, 0xc780, /*0xa8-0xaf*/
+  0xdda8, 0xc0b3, 0xc1ab, 0xddaa, 0xddab, 0xc781, 0xddb2, 0xbbf1, /*0xb0-0xb7*/
+  0xddb5, 0xd3a8, 0xddba, 0xc782, 0xddbb, 0xc3a7, 0xc783, 0xc784, /*0xb8-0xbf*/
+  0xddd2, 0xddbc, 0xc785, 0xc786, 0xc787, 0xddd1, 0xc788, 0xb9bd, /*0xc0-0xc7*/
+  0xc789, 0xc78a, 0xbed5, 0xc78b, 0xbefa, 0xc78c, 0xc78d, 0xbaca, /*0xc8-0xcf*/
+  0xc78e, 0xc78f, 0xc790, 0xc791, 0xddca, 0xc792, 0xddc5, 0xc793, /*0xd0-0xd7*/
+  0xddbf, 0xc794, 0xc795, 0xc796, 0xb2cb, 0xddc3, 0xc797, 0xddcb, /*0xd8-0xdf*/
+  0xb2a4, 0xddd5, 0xc798, 0xc799, 0xc79a, 0xddbe, 0xc79b, 0xc79c, /*0xe0-0xe7*/
+  0xc79d, 0xc6d0, 0xddd0, 0xc79e, 0xc79f, 0xc7a0, 0xc840, 0xc841, /*0xe8-0xef*/
+  0xddd4, 0xc1e2, 0xb7c6, 0xc842, 0xc843, 0xc844, 0xc845, 0xc846, /*0xf0-0xf7*/
+  0xddce, 0xddcf, 0xc847, 0xc848, 0xc849, 0xddc4, 0xc84a, 0xc84b, /*0xf8-0xff*/
+  /* 0x8400 */
+  0xc84c, 0xddbd, 0xc84d, 0xddcd, 0xccd1, 0xc84e, 0xddc9, 0xc84f, /*0x00-0x07*/
+  0xc850, 0xc851, 0xc852, 0xddc2, 0xc3c8, 0xc6bc, 0xceae, 0xddcc, /*0x08-0x0f*/
+  0xc853, 0xddc8, 0xc854, 0xc855, 0xc856, 0xc857, 0xc858, 0xc859, /*0x10-0x17*/
+  0xddc1, 0xc85a, 0xc85b, 0xc85c, 0xddc6, 0xc2dc, 0xc85d, 0xc85e, /*0x18-0x1f*/
+  0xc85f, 0xc860, 0xc861, 0xc862, 0xd3a9, 0xd3aa, 0xddd3, 0xcff4, /*0x20-0x27*/
+  0xc8f8, 0xc863, 0xc864, 0xc865, 0xc866, 0xc867, 0xc868, 0xc869, /*0x28-0x2f*/
+  0xc86a, 0xdde6, 0xc86b, 0xc86c, 0xc86d, 0xc86e, 0xc86f, 0xc870, /*0x30-0x37*/
+  0xddc7, 0xc871, 0xc872, 0xc873, 0xdde0, 0xc2e4, 0xc874, 0xc875, /*0x38-0x3f*/
+  0xc876, 0xc877, 0xc878, 0xc879, 0xc87a, 0xc87b, 0xdde1, 0xc87c, /*0x40-0x47*/
+  0xc87d, 0xc87e, 0xc880, 0xc881, 0xc882, 0xc883, 0xc884, 0xc885, /*0x48-0x4f*/
+  0xc886, 0xddd7, 0xc887, 0xc888, 0xc889, 0xc88a, 0xc88b, 0xd6f8, /*0x50-0x57*/
+  0xc88c, 0xddd9, 0xddd8, 0xb8f0, 0xddd6, 0xc88d, 0xc88e, 0xc88f, /*0x58-0x5f*/
+  0xc890, 0xc6cf, 0xc891, 0xb6ad, 0xc892, 0xc893, 0xc894, 0xc895, /*0x60-0x67*/
+  0xc896, 0xdde2, 0xc897, 0xbaf9, 0xd4e1, 0xdde7, 0xc898, 0xc899, /*0x68-0x6f*/
+  0xc89a, 0xb4d0, 0xc89b, 0xddda, 0xc89c, 0xbffb, 0xdde3, 0xc89d, /*0x70-0x77*/
+  0xdddf, 0xc89e, 0xdddd, 0xc89f, 0xc8a0, 0xc940, 0xc941, 0xc942, /*0x78-0x7f*/
+  0xc943, 0xc944, 0xb5d9, 0xc945, 0xc946, 0xc947, 0xc948, 0xdddb, /*0x80-0x87*/
+  0xdddc, 0xddde, 0xc949, 0xbdaf, 0xdde4, 0xc94a, 0xdde5, 0xc94b, /*0x88-0x8f*/
+  0xc94c, 0xc94d, 0xc94e, 0xc94f, 0xc950, 0xc951, 0xc952, 0xddf5, /*0x90-0x97*/
+  0xc953, 0xc3c9, 0xc954, 0xc955, 0xcbe2, 0xc956, 0xc957, 0xc958, /*0x98-0x9f*/
+  0xc959, 0xddf2, 0xc95a, 0xc95b, 0xc95c, 0xc95d, 0xc95e, 0xc95f, /*0xa0-0xa7*/
+  0xc960, 0xc961, 0xc962, 0xc963, 0xc964, 0xc965, 0xc966, 0xd8e1, /*0xa8-0xaf*/
+  0xc967, 0xc968, 0xc6d1, 0xc969, 0xddf4, 0xc96a, 0xc96b, 0xc96c, /*0xb0-0xb7*/
+  0xd5f4, 0xddf3, 0xddf0, 0xc96d, 0xc96e, 0xddec, 0xc96f, 0xddef, /*0xb8-0xbf*/
+  0xc970, 0xdde8, 0xc971, 0xc972, 0xd0ee, 0xc973, 0xc974, 0xc975, /*0xc0-0xc7*/
+  0xc976, 0xc8d8, 0xddee, 0xc977, 0xc978, 0xdde9, 0xc979, 0xc97a, /*0xc8-0xcf*/
+  0xddea, 0xcbf2, 0xc97b, 0xdded, 0xc97c, 0xc97d, 0xb1cd, 0xc97e, /*0xd0-0xd7*/
+  0xc980, 0xc981, 0xc982, 0xc983, 0xc984, 0xc0b6, 0xc985, 0xbcbb, /*0xd8-0xdf*/
+  0xddf1, 0xc986, 0xc987, 0xddf7, 0xc988, 0xddf6, 0xddeb, 0xc989, /*0xe0-0xe7*/
+  0xc98a, 0xc98b, 0xc98c, 0xc98d, 0xc5ee, 0xc98e, 0xc98f, 0xc990, /*0xe8-0xef*/
+  0xddfb, 0xc991, 0xc992, 0xc993, 0xc994, 0xc995, 0xc996, 0xc997, /*0xf0-0xf7*/
+  0xc998, 0xc999, 0xc99a, 0xc99b, 0xdea4, 0xc99c, 0xc99d, 0xdea3, /*0xf8-0xff*/
+  /* 0x8500 */
+  0xc99e, 0xc99f, 0xc9a0, 0xca40, 0xca41, 0xca42, 0xca43, 0xca44, /*0x00-0x07*/
+  0xca45, 0xca46, 0xca47, 0xca48, 0xddf8, 0xca49, 0xca4a, 0xca4b, /*0x08-0x0f*/
+  0xca4c, 0xc3ef, 0xca4d, 0xc2fb, 0xca4e, 0xca4f, 0xca50, 0xd5e1, /*0x10-0x17*/
+  0xca51, 0xca52, 0xceb5, 0xca53, 0xca54, 0xca55, 0xca56, 0xddfd, /*0x18-0x1f*/
+  0xca57, 0xb2cc, 0xca58, 0xca59, 0xca5a, 0xca5b, 0xca5c, 0xca5d, /*0x20-0x27*/
+  0xca5e, 0xca5f, 0xca60, 0xc4e8, 0xcadf, 0xca61, 0xca62, 0xca63, /*0x28-0x2f*/
+  0xca64, 0xca65, 0xca66, 0xca67, 0xca68, 0xca69, 0xca6a, 0xc7be, /*0x30-0x37*/
+  0xddfa, 0xddfc, 0xddfe, 0xdea2, 0xb0aa, 0xb1ce, 0xca6b, 0xca6c, /*0x38-0x3f*/
+  0xca6d, 0xca6e, 0xca6f, 0xdeac, 0xca70, 0xca71, 0xca72, 0xca73, /*0x40-0x47*/
+  0xdea6, 0xbdb6, 0xc8ef, 0xca74, 0xca75, 0xca76, 0xca77, 0xca78, /*0x48-0x4f*/
+  0xca79, 0xca7a, 0xca7b, 0xca7c, 0xca7d, 0xca7e, 0xdea1, 0xca80, /*0x50-0x57*/
+  0xca81, 0xdea5, 0xca82, 0xca83, 0xca84, 0xca85, 0xdea9, 0xca86, /*0x58-0x5f*/
+  0xca87, 0xca88, 0xca89, 0xca8a, 0xdea8, 0xca8b, 0xca8c, 0xca8d, /*0x60-0x67*/
+  0xdea7, 0xca8e, 0xca8f, 0xca90, 0xca91, 0xca92, 0xca93, 0xca94, /*0x68-0x6f*/
+  0xca95, 0xca96, 0xdead, 0xca97, 0xd4cc, 0xca98, 0xca99, 0xca9a, /*0x70-0x77*/
+  0xca9b, 0xdeb3, 0xdeaa, 0xdeae, 0xca9c, 0xca9d, 0xc0d9, 0xca9e, /*0x78-0x7f*/
+  0xca9f, 0xcaa0, 0xcb40, 0xcb41, 0xb1a1, 0xdeb6, 0xcb42, 0xdeb1, /*0x80-0x87*/
+  0xcb43, 0xcb44, 0xcb45, 0xcb46, 0xcb47, 0xcb48, 0xcb49, 0xdeb2, /*0x88-0x8f*/
+  0xcb4a, 0xcb4b, 0xcb4c, 0xcb4d, 0xcb4e, 0xcb4f, 0xcb50, 0xcb51, /*0x90-0x97*/
+  0xcb52, 0xcb53, 0xcb54, 0xd1a6, 0xdeb5, 0xcb55, 0xcb56, 0xcb57, /*0x98-0x9f*/
+  0xcb58, 0xcb59, 0xcb5a, 0xcb5b, 0xdeaf, 0xcb5c, 0xcb5d, 0xcb5e, /*0xa0-0xa7*/
+  0xdeb0, 0xcb5f, 0xd0bd, 0xcb60, 0xcb61, 0xcb62, 0xdeb4, 0xcaed, /*0xa8-0xaf*/
+  0xdeb9, 0xcb63, 0xcb64, 0xcb65, 0xcb66, 0xcb67, 0xcb68, 0xdeb8, /*0xb0-0xb7*/
+  0xcb69, 0xdeb7, 0xcb6a, 0xcb6b, 0xcb6c, 0xcb6d, 0xcb6e, 0xcb6f, /*0xb8-0xbf*/
+  0xcb70, 0xdebb, 0xcb71, 0xcb72, 0xcb73, 0xcb74, 0xcb75, 0xcb76, /*0xc0-0xc7*/
+  0xcb77, 0xbde5, 0xcb78, 0xcb79, 0xcb7a, 0xcb7b, 0xcb7c, 0xb2d8, /*0xc8-0xcf*/
+  0xc3ea, 0xcb7d, 0xcb7e, 0xdeba, 0xcb80, 0xc5ba, 0xcb81, 0xcb82, /*0xd0-0xd7*/
+  0xcb83, 0xcb84, 0xcb85, 0xcb86, 0xdebc, 0xcb87, 0xcb88, 0xcb89, /*0xd8-0xdf*/
+  0xcb8a, 0xcb8b, 0xcb8c, 0xcb8d, 0xccd9, 0xcb8e, 0xcb8f, 0xcb90, /*0xe0-0xe7*/
+  0xcb91, 0xb7aa, 0xcb92, 0xcb93, 0xcb94, 0xcb95, 0xcb96, 0xcb97, /*0xe8-0xef*/
+  0xcb98, 0xcb99, 0xcb9a, 0xcb9b, 0xcb9c, 0xcb9d, 0xcb9e, 0xcb9f, /*0xf0-0xf7*/
+  0xcba0, 0xcc40, 0xcc41, 0xd4e5, 0xcc42, 0xcc43, 0xcc44, 0xdebd, /*0xf8-0xff*/
+  /* 0x8600 */
+  0xcc45, 0xcc46, 0xcc47, 0xcc48, 0xcc49, 0xdebf, 0xcc4a, 0xcc4b, /*0x00-0x07*/
+  0xcc4c, 0xcc4d, 0xcc4e, 0xcc4f, 0xcc50, 0xcc51, 0xcc52, 0xcc53, /*0x08-0x0f*/
+  0xcc54, 0xc4a2, 0xcc55, 0xcc56, 0xcc57, 0xcc58, 0xdec1, 0xcc59, /*0x10-0x17*/
+  0xcc5a, 0xcc5b, 0xcc5c, 0xcc5d, 0xcc5e, 0xcc5f, 0xcc60, 0xcc61, /*0x18-0x1f*/
+  0xcc62, 0xcc63, 0xcc64, 0xcc65, 0xcc66, 0xcc67, 0xcc68, 0xdebe, /*0x20-0x27*/
+  0xcc69, 0xdec0, 0xcc6a, 0xcc6b, 0xcc6c, 0xcc6d, 0xcc6e, 0xcc6f, /*0x28-0x2f*/
+  0xcc70, 0xcc71, 0xcc72, 0xcc73, 0xcc74, 0xcc75, 0xcc76, 0xcc77, /*0x30-0x37*/
+  0xd5ba, 0xcc78, 0xcc79, 0xcc7a, 0xdec2, 0xcc7b, 0xcc7c, 0xcc7d, /*0x38-0x3f*/
+  0xcc7e, 0xcc80, 0xcc81, 0xcc82, 0xcc83, 0xcc84, 0xcc85, 0xcc86, /*0x40-0x47*/
+  0xcc87, 0xcc88, 0xcc89, 0xcc8a, 0xcc8b, 0xf2ae, 0xbba2, 0xc2b2, /*0x48-0x4f*/
+  0xc5b0, 0xc2c7, 0xcc8c, 0xcc8d, 0xf2af, 0xcc8e, 0xcc8f, 0xcc90, /*0x50-0x57*/
+  0xcc91, 0xcc92, 0xd0e9, 0xcc93, 0xcc94, 0xcc95, 0xd3dd, 0xcc96, /*0x58-0x5f*/
+  0xcc97, 0xcc98, 0xebbd, 0xcc99, 0xcc9a, 0xcc9b, 0xcc9c, 0xcc9d, /*0x60-0x67*/
+  0xcc9e, 0xcc9f, 0xcca0, 0xb3e6, 0xf2b0, 0xcd40, 0xf2b1, 0xcd41, /*0x68-0x6f*/
+  0xcd42, 0xcaad, 0xcd43, 0xcd44, 0xcd45, 0xcd46, 0xcd47, 0xcd48, /*0x70-0x77*/
+  0xcd49, 0xbae7, 0xf2b3, 0xf2b5, 0xf2b4, 0xcbe4, 0xcfba, 0xf2b2, /*0x78-0x7f*/
+  0xcab4, 0xd2cf, 0xc2ec, 0xcd4a, 0xcd4b, 0xcd4c, 0xcd4d, 0xcd4e, /*0x80-0x87*/
+  0xcd4f, 0xcd50, 0xcec3, 0xf2b8, 0xb0f6, 0xf2b7, 0xcd51, 0xcd52, /*0x88-0x8f*/
+  0xcd53, 0xcd54, 0xcd55, 0xf2be, 0xcd56, 0xb2cf, 0xcd57, 0xcd58, /*0x90-0x97*/
+  0xcd59, 0xcd5a, 0xcd5b, 0xcd5c, 0xd1c1, 0xf2ba, 0xcd5d, 0xcd5e, /*0x98-0x9f*/
+  0xcd5f, 0xcd60, 0xcd61, 0xf2bc, 0xd4e9, 0xcd62, 0xcd63, 0xf2bb, /*0xa0-0xa7*/
+  0xf2b6, 0xf2bf, 0xf2bd, 0xcd64, 0xf2b9, 0xcd65, 0xcd66, 0xf2c7, /*0xa8-0xaf*/
+  0xf2c4, 0xf2c6, 0xcd67, 0xcd68, 0xf2ca, 0xf2c2, 0xf2c0, 0xcd69, /*0xb0-0xb7*/
+  0xcd6a, 0xcd6b, 0xf2c5, 0xcd6c, 0xcd6d, 0xcd6e, 0xcd6f, 0xcd70, /*0xb8-0xbf*/
+  0xd6fb, 0xcd71, 0xcd72, 0xcd73, 0xf2c1, 0xcd74, 0xc7f9, 0xc9df, /*0xc0-0xc7*/
+  0xcd75, 0xf2c8, 0xb9c6, 0xb5b0, 0xcd76, 0xcd77, 0xf2c3, 0xf2c9, /*0xc8-0xcf*/
+  0xf2d0, 0xf2d6, 0xcd78, 0xcd79, 0xbbd7, 0xcd7a, 0xcd7b, 0xcd7c, /*0xd0-0xd7*/
+  0xf2d5, 0xcddc, 0xcd7d, 0xd6eb, 0xcd7e, 0xcd80, 0xf2d2, 0xf2d4, /*0xd8-0xdf*/
+  0xcd81, 0xcd82, 0xcd83, 0xcd84, 0xb8f2, 0xcd85, 0xcd86, 0xcd87, /*0xe0-0xe7*/
+  0xcd88, 0xf2cb, 0xcd89, 0xcd8a, 0xcd8b, 0xf2ce, 0xc2f9, 0xcd8c, /*0xe8-0xef*/
+  0xd5dd, 0xf2cc, 0xf2cd, 0xf2cf, 0xf2d3, 0xcd8d, 0xcd8e, 0xcd8f, /*0xf0-0xf7*/
+  0xf2d9, 0xd3bc, 0xcd90, 0xcd91, 0xcd92, 0xcd93, 0xb6ea, 0xcd94, /*0xf8-0xff*/
+  /* 0x8700 */
+  0xcaf1, 0xcd95, 0xb7e4, 0xf2d7, 0xcd96, 0xcd97, 0xcd98, 0xf2d8, /*0x00-0x07*/
+  0xf2da, 0xf2dd, 0xf2db, 0xcd99, 0xcd9a, 0xf2dc, 0xcd9b, 0xcd9c, /*0x08-0x0f*/
+  0xcd9d, 0xcd9e, 0xd1d1, 0xf2d1, 0xcd9f, 0xcdc9, 0xcda0, 0xcecf, /*0x10-0x17*/
+  0xd6a9, 0xce40, 0xf2e3, 0xce41, 0xc3db, 0xce42, 0xf2e0, 0xce43, /*0x18-0x1f*/
+  0xce44, 0xc0af, 0xf2ec, 0xf2de, 0xce45, 0xf2e1, 0xce46, 0xce47, /*0x20-0x27*/
+  0xce48, 0xf2e8, 0xce49, 0xce4a, 0xce4b, 0xce4c, 0xf2e2, 0xce4d, /*0x28-0x2f*/
+  0xce4e, 0xf2e7, 0xce4f, 0xce50, 0xf2e6, 0xce51, 0xce52, 0xf2e9, /*0x30-0x37*/
+  0xce53, 0xce54, 0xce55, 0xf2df, 0xce56, 0xce57, 0xf2e4, 0xf2ea, /*0x38-0x3f*/
+  0xce58, 0xce59, 0xce5a, 0xce5b, 0xce5c, 0xce5d, 0xce5e, 0xd3ac, /*0x40-0x47*/
+  0xf2e5, 0xb2f5, 0xce5f, 0xce60, 0xf2f2, 0xce61, 0xd0ab, 0xce62, /*0x48-0x4f*/
+  0xce63, 0xce64, 0xce65, 0xf2f5, 0xce66, 0xce67, 0xce68, 0xbbc8, /*0x50-0x57*/
+  0xce69, 0xf2f9, 0xce6a, 0xce6b, 0xce6c, 0xce6d, 0xce6e, 0xce6f, /*0x58-0x5f*/
+  0xf2f0, 0xce70, 0xce71, 0xf2f6, 0xf2f8, 0xf2fa, 0xce72, 0xce73, /*0x60-0x67*/
+  0xce74, 0xce75, 0xce76, 0xce77, 0xce78, 0xce79, 0xf2f3, 0xce7a, /*0x68-0x6f*/
+  0xf2f1, 0xce7b, 0xce7c, 0xce7d, 0xbafb, 0xce7e, 0xb5fb, 0xce80, /*0x70-0x77*/
+  0xce81, 0xce82, 0xce83, 0xf2ef, 0xf2f7, 0xf2ed, 0xf2ee, 0xce84, /*0x78-0x7f*/
+  0xce85, 0xce86, 0xf2eb, 0xf3a6, 0xce87, 0xf3a3, 0xce88, 0xce89, /*0x80-0x87*/
+  0xf3a2, 0xce8a, 0xce8b, 0xf2f4, 0xce8c, 0xc8da, 0xce8d, 0xce8e, /*0x88-0x8f*/
+  0xce8f, 0xce90, 0xce91, 0xf2fb, 0xce92, 0xce93, 0xce94, 0xf3a5, /*0x90-0x97*/
+  0xce95, 0xce96, 0xce97, 0xce98, 0xce99, 0xce9a, 0xce9b, 0xc3f8, /*0x98-0x9f*/
+  0xce9c, 0xce9d, 0xce9e, 0xce9f, 0xcea0, 0xcf40, 0xcf41, 0xcf42, /*0xa0-0xa7*/
+  0xf2fd, 0xcf43, 0xcf44, 0xf3a7, 0xf3a9, 0xf3a4, 0xcf45, 0xf2fc, /*0xa8-0xaf*/
+  0xcf46, 0xcf47, 0xcf48, 0xf3ab, 0xcf49, 0xf3aa, 0xcf4a, 0xcf4b, /*0xb0-0xb7*/
+  0xcf4c, 0xcf4d, 0xc2dd, 0xcf4e, 0xcf4f, 0xf3ae, 0xcf50, 0xcf51, /*0xb8-0xbf*/
+  0xf3b0, 0xcf52, 0xcf53, 0xcf54, 0xcf55, 0xcf56, 0xf3a1, 0xcf57, /*0xc0-0xc7*/
+  0xcf58, 0xcf59, 0xf3b1, 0xf3ac, 0xcf5a, 0xcf5b, 0xcf5c, 0xcf5d, /*0xc8-0xcf*/
+  0xcf5e, 0xf3af, 0xf2fe, 0xf3ad, 0xcf5f, 0xcf60, 0xcf61, 0xcf62, /*0xd0-0xd7*/
+  0xcf63, 0xcf64, 0xcf65, 0xf3b2, 0xcf66, 0xcf67, 0xcf68, 0xcf69, /*0xd8-0xdf*/
+  0xf3b4, 0xcf6a, 0xcf6b, 0xcf6c, 0xcf6d, 0xf3a8, 0xcf6e, 0xcf6f, /*0xe0-0xe7*/
+  0xcf70, 0xcf71, 0xf3b3, 0xcf72, 0xcf73, 0xcf74, 0xf3b5, 0xcf75, /*0xe8-0xef*/
+  0xcf76, 0xcf77, 0xcf78, 0xcf79, 0xcf7a, 0xcf7b, 0xcf7c, 0xcf7d, /*0xf0-0xf7*/
+  0xcf7e, 0xd0b7, 0xcf80, 0xcf81, 0xcf82, 0xcf83, 0xf3b8, 0xcf84, /*0xf8-0xff*/
+  /* 0x8800 */
+  0xcf85, 0xcf86, 0xcf87, 0xd9f9, 0xcf88, 0xcf89, 0xcf8a, 0xcf8b, /*0x00-0x07*/
+  0xcf8c, 0xcf8d, 0xf3b9, 0xcf8e, 0xcf8f, 0xcf90, 0xcf91, 0xcf92, /*0x08-0x0f*/
+  0xcf93, 0xcf94, 0xcf95, 0xf3b7, 0xcf96, 0xc8e4, 0xf3b6, 0xcf97, /*0x10-0x17*/
+  0xcf98, 0xcf99, 0xcf9a, 0xf3ba, 0xcf9b, 0xcf9c, 0xcf9d, 0xcf9e, /*0x18-0x1f*/
+  0xcf9f, 0xf3bb, 0xb4c0, 0xcfa0, 0xd040, 0xd041, 0xd042, 0xd043, /*0x20-0x27*/
+  0xd044, 0xd045, 0xd046, 0xd047, 0xd048, 0xd049, 0xd04a, 0xd04b, /*0x28-0x2f*/
+  0xd04c, 0xd04d, 0xeec3, 0xd04e, 0xd04f, 0xd050, 0xd051, 0xd052, /*0x30-0x37*/
+  0xd053, 0xf3bc, 0xd054, 0xd055, 0xf3bd, 0xd056, 0xd057, 0xd058, /*0x38-0x3f*/
+  0xd1aa, 0xd059, 0xd05a, 0xd05b, 0xf4ac, 0xd0c6, 0xd05c, 0xd05d, /*0x40-0x47*/
+  0xd05e, 0xd05f, 0xd060, 0xd061, 0xd0d0, 0xd1dc, 0xd062, 0xd063, /*0x48-0x4f*/
+  0xd064, 0xd065, 0xd066, 0xd067, 0xcfce, 0xd068, 0xd069, 0xbdd6, /*0x50-0x57*/
+  0xd06a, 0xd1c3, 0xd06b, 0xd06c, 0xd06d, 0xd06e, 0xd06f, 0xd070, /*0x58-0x5f*/
+  0xd071, 0xbae2, 0xe1e9, 0xd2c2, 0xf1c2, 0xb2b9, 0xd072, 0xd073, /*0x60-0x67*/
+  0xb1ed, 0xf1c3, 0xd074, 0xc9c0, 0xb3c4, 0xd075, 0xd9f2, 0xd076, /*0x68-0x6f*/
+  0xcba5, 0xd077, 0xf1c4, 0xd078, 0xd079, 0xd07a, 0xd07b, 0xd6d4, /*0x70-0x77*/
+  0xd07c, 0xd07d, 0xd07e, 0xd080, 0xd081, 0xf1c5, 0xf4c0, 0xf1c6, /*0x78-0x7f*/
+  0xd082, 0xd4ac, 0xf1c7, 0xd083, 0xb0c0, 0xf4c1, 0xd084, 0xd085, /*0x80-0x87*/
+  0xf4c2, 0xd086, 0xd087, 0xb4fc, 0xd088, 0xc5db, 0xd089, 0xd08a, /*0x88-0x8f*/
+  0xd08b, 0xd08c, 0xccbb, 0xd08d, 0xd08e, 0xd08f, 0xd0e4, 0xd090, /*0x90-0x97*/
+  0xd091, 0xd092, 0xd093, 0xd094, 0xcde0, 0xd095, 0xd096, 0xd097, /*0x98-0x9f*/
+  0xd098, 0xd099, 0xf1c8, 0xd09a, 0xd9f3, 0xd09b, 0xd09c, 0xd09d, /*0xa0-0xa7*/
+  0xd09e, 0xd09f, 0xd0a0, 0xb1bb, 0xd140, 0xcfae, 0xd141, 0xd142, /*0xa8-0xaf*/
+  0xd143, 0xb8a4, 0xd144, 0xd145, 0xd146, 0xd147, 0xd148, 0xf1ca, /*0xb0-0xb7*/
+  0xd149, 0xd14a, 0xd14b, 0xd14c, 0xf1cb, 0xd14d, 0xd14e, 0xd14f, /*0xb8-0xbf*/
+  0xd150, 0xb2c3, 0xc1d1, 0xd151, 0xd152, 0xd7b0, 0xf1c9, 0xd153, /*0xc0-0xc7*/
+  0xd154, 0xf1cc, 0xd155, 0xd156, 0xd157, 0xd158, 0xf1ce, 0xd159, /*0xc8-0xcf*/
+  0xd15a, 0xd15b, 0xd9f6, 0xd15c, 0xd2e1, 0xd4a3, 0xd15d, 0xd15e, /*0xd0-0xd7*/
+  0xf4c3, 0xc8b9, 0xd15f, 0xd160, 0xd161, 0xd162, 0xd163, 0xf4c4, /*0xd8-0xdf*/
+  0xd164, 0xd165, 0xf1cd, 0xf1cf, 0xbfe3, 0xf1d0, 0xd166, 0xd167, /*0xe0-0xe7*/
+  0xf1d4, 0xd168, 0xd169, 0xd16a, 0xd16b, 0xd16c, 0xd16d, 0xd16e, /*0xe8-0xef*/
+  0xf1d6, 0xf1d1, 0xd16f, 0xc9d1, 0xc5e1, 0xd170, 0xd171, 0xd172, /*0xf0-0xf7*/
+  0xc2e3, 0xb9fc, 0xd173, 0xd174, 0xf1d3, 0xd175, 0xf1d5, 0xd176, /*0xf8-0xff*/
+  /* 0x8900 */
+  0xd177, 0xd178, 0xb9d3, 0xd179, 0xd17a, 0xd17b, 0xd17c, 0xd17d, /*0x00-0x07*/
+  0xd17e, 0xd180, 0xf1db, 0xd181, 0xd182, 0xd183, 0xd184, 0xd185, /*0x08-0x0f*/
+  0xbad6, 0xd186, 0xb0fd, 0xf1d9, 0xd187, 0xd188, 0xd189, 0xd18a, /*0x10-0x17*/
+  0xd18b, 0xf1d8, 0xf1d2, 0xf1da, 0xd18c, 0xd18d, 0xd18e, 0xd18f, /*0x18-0x1f*/
+  0xd190, 0xf1d7, 0xd191, 0xd192, 0xd193, 0xc8ec, 0xd194, 0xd195, /*0x20-0x27*/
+  0xd196, 0xd197, 0xcdca, 0xf1dd, 0xd198, 0xd199, 0xd19a, 0xd19b, /*0x28-0x2f*/
+  0xe5bd, 0xd19c, 0xd19d, 0xd19e, 0xf1dc, 0xd19f, 0xf1de, 0xd1a0, /*0x30-0x37*/
+  0xd240, 0xd241, 0xd242, 0xd243, 0xd244, 0xd245, 0xd246, 0xd247, /*0x38-0x3f*/
+  0xd248, 0xf1df, 0xd249, 0xd24a, 0xcfe5, 0xd24b, 0xd24c, 0xd24d, /*0x40-0x47*/
+  0xd24e, 0xd24f, 0xd250, 0xd251, 0xd252, 0xd253, 0xd254, 0xd255, /*0x48-0x4f*/
+  0xd256, 0xd257, 0xd258, 0xd259, 0xd25a, 0xd25b, 0xd25c, 0xd25d, /*0x50-0x57*/
+  0xd25e, 0xd25f, 0xd260, 0xd261, 0xd262, 0xd263, 0xf4c5, 0xbdf3, /*0x58-0x5f*/
+  0xd264, 0xd265, 0xd266, 0xd267, 0xd268, 0xd269, 0xf1e0, 0xd26a, /*0x60-0x67*/
+  0xd26b, 0xd26c, 0xd26d, 0xd26e, 0xd26f, 0xd270, 0xd271, 0xd272, /*0x68-0x6f*/
+  0xd273, 0xd274, 0xd275, 0xd276, 0xd277, 0xd278, 0xd279, 0xd27a, /*0x70-0x77*/
+  0xd27b, 0xd27c, 0xd27d, 0xf1e1, 0xd27e, 0xd280, 0xd281, 0xcef7, /*0x78-0x7f*/
+  0xd282, 0xd2aa, 0xd283, 0xf1fb, 0xd284, 0xd285, 0xb8b2, 0xd286, /*0x80-0x87*/
+  0xd287, 0xd288, 0xd289, 0xd28a, 0xd28b, 0xd28c, 0xd28d, 0xd28e, /*0x88-0x8f*/
+  0xd28f, 0xd290, 0xd291, 0xd292, 0xd293, 0xd294, 0xd295, 0xd296, /*0x90-0x97*/
+  0xd297, 0xd298, 0xd299, 0xd29a, 0xd29b, 0xd29c, 0xd29d, 0xd29e, /*0x98-0x9f*/
+  0xd29f, 0xd2a0, 0xd340, 0xd341, 0xd342, 0xd343, 0xd344, 0xd345, /*0xa0-0xa7*/
+  0xd346, 0xd347, 0xd348, 0xd349, 0xd34a, 0xd34b, 0xd34c, 0xd34d, /*0xa8-0xaf*/
+  0xd34e, 0xd34f, 0xd350, 0xd351, 0xd352, 0xd353, 0xd354, 0xd355, /*0xb0-0xb7*/
+  0xd356, 0xd357, 0xd358, 0xd359, 0xd35a, 0xd35b, 0xd35c, 0xd35d, /*0xb8-0xbf*/
+  0xd35e, 0xbcfb, 0xb9db, 0xd35f, 0xb9e6, 0xc3d9, 0xcad3, 0xeae8, /*0xc0-0xc7*/
+  0xc0c0, 0xbef5, 0xeae9, 0xeaea, 0xeaeb, 0xd360, 0xeaec, 0xeaed, /*0xc8-0xcf*/
+  0xeaee, 0xeaef, 0xbdc7, 0xd361, 0xd362, 0xd363, 0xf5fb, 0xd364, /*0xd0-0xd7*/
+  0xd365, 0xd366, 0xf5fd, 0xd367, 0xf5fe, 0xd368, 0xf5fc, 0xd369, /*0xd8-0xdf*/
+  0xd36a, 0xd36b, 0xd36c, 0xbde2, 0xd36d, 0xf6a1, 0xb4a5, 0xd36e, /*0xe0-0xe7*/
+  0xd36f, 0xd370, 0xd371, 0xf6a2, 0xd372, 0xd373, 0xd374, 0xf6a3, /*0xe8-0xef*/
+  0xd375, 0xd376, 0xd377, 0xecb2, 0xd378, 0xd379, 0xd37a, 0xd37b, /*0xf0-0xf7*/
+  0xd37c, 0xd37d, 0xd37e, 0xd380, 0xd381, 0xd382, 0xd383, 0xd384, /*0xf8-0xff*/
+  /* 0x8a00 */
+  0xd1d4, 0xd385, 0xd386, 0xd387, 0xd388, 0xd389, 0xd38a, 0xd9ea, /*0x00-0x07*/
+  0xd38b, 0xd38c, 0xd38d, 0xd38e, 0xd38f, 0xd390, 0xd391, 0xd392, /*0x08-0x0f*/
+  0xd393, 0xd394, 0xd395, 0xd396, 0xd397, 0xd398, 0xd399, 0xd39a, /*0x10-0x17*/
+  0xd39b, 0xd39c, 0xd39d, 0xd39e, 0xd39f, 0xd3a0, 0xd440, 0xd441, /*0x18-0x1f*/
+  0xd442, 0xd443, 0xd444, 0xd445, 0xd446, 0xd447, 0xd448, 0xd449, /*0x20-0x27*/
+  0xd44a, 0xd44b, 0xd44c, 0xd44d, 0xd44e, 0xd44f, 0xd450, 0xd451, /*0x28-0x2f*/
+  0xd452, 0xd453, 0xd454, 0xd455, 0xd456, 0xd457, 0xd458, 0xd459, /*0x30-0x37*/
+  0xd45a, 0xd45b, 0xd45c, 0xd45d, 0xd45e, 0xd45f, 0xf6a4, 0xd460, /*0x38-0x3f*/
+  0xd461, 0xd462, 0xd463, 0xd464, 0xd465, 0xd466, 0xd467, 0xd468, /*0x40-0x47*/
+  0xeeba, 0xd469, 0xd46a, 0xd46b, 0xd46c, 0xd46d, 0xd46e, 0xd46f, /*0x48-0x4f*/
+  0xd470, 0xd471, 0xd472, 0xd473, 0xd474, 0xd475, 0xd476, 0xd477, /*0x50-0x57*/
+  0xd478, 0xd479, 0xd47a, 0xd47b, 0xd47c, 0xd47d, 0xd47e, 0xd480, /*0x58-0x5f*/
+  0xd481, 0xd482, 0xd483, 0xd484, 0xd485, 0xd486, 0xd487, 0xd488, /*0x60-0x67*/
+  0xd489, 0xd48a, 0xd48b, 0xd48c, 0xd48d, 0xd48e, 0xd48f, 0xd490, /*0x68-0x6f*/
+  0xd491, 0xd492, 0xd493, 0xd494, 0xd495, 0xd496, 0xd497, 0xd498, /*0x70-0x77*/
+  0xd499, 0xd5b2, 0xd49a, 0xd49b, 0xd49c, 0xd49d, 0xd49e, 0xd49f, /*0x78-0x7f*/
+  0xd4a0, 0xd540, 0xd541, 0xd542, 0xd543, 0xd544, 0xd545, 0xd546, /*0x80-0x87*/
+  0xd547, 0xd3fe, 0xccdc, 0xd548, 0xd549, 0xd54a, 0xd54b, 0xd54c, /*0x88-0x8f*/
+  0xd54d, 0xd54e, 0xd54f, 0xcac4, 0xd550, 0xd551, 0xd552, 0xd553, /*0x90-0x97*/
+  0xd554, 0xd555, 0xd556, 0xd557, 0xd558, 0xd559, 0xd55a, 0xd55b, /*0x98-0x9f*/
+  0xd55c, 0xd55d, 0xd55e, 0xd55f, 0xd560, 0xd561, 0xd562, 0xd563, /*0xa0-0xa7*/
+  0xd564, 0xd565, 0xd566, 0xd567, 0xd568, 0xd569, 0xd56a, 0xd56b, /*0xa8-0xaf*/
+  0xd56c, 0xd56d, 0xd56e, 0xd56f, 0xd570, 0xd571, 0xd572, 0xd573, /*0xb0-0xb7*/
+  0xd574, 0xd575, 0xd576, 0xd577, 0xd578, 0xd579, 0xd57a, 0xd57b, /*0xb8-0xbf*/
+  0xd57c, 0xd57d, 0xd57e, 0xd580, 0xd581, 0xd582, 0xd583, 0xd584, /*0xc0-0xc7*/
+  0xd585, 0xd586, 0xd587, 0xd588, 0xd589, 0xd58a, 0xd58b, 0xd58c, /*0xc8-0xcf*/
+  0xd58d, 0xd58e, 0xd58f, 0xd590, 0xd591, 0xd592, 0xd593, 0xd594, /*0xd0-0xd7*/
+  0xd595, 0xd596, 0xd597, 0xd598, 0xd599, 0xd59a, 0xd59b, 0xd59c, /*0xd8-0xdf*/
+  0xd59d, 0xd59e, 0xd59f, 0xd5a0, 0xd640, 0xd641, 0xd642, 0xd643, /*0xe0-0xe7*/
+  0xd644, 0xd645, 0xd646, 0xd647, 0xd648, 0xd649, 0xd64a, 0xd64b, /*0xe8-0xef*/
+  0xd64c, 0xd64d, 0xd64e, 0xd64f, 0xd650, 0xd651, 0xd652, 0xd653, /*0xf0-0xf7*/
+  0xd654, 0xd655, 0xd656, 0xd657, 0xd658, 0xd659, 0xd65a, 0xd65b, /*0xf8-0xff*/
+  /* 0x8b00 */
+  0xd65c, 0xd65d, 0xd65e, 0xd65f, 0xd660, 0xd661, 0xd662, 0xe5c0, /*0x00-0x07*/
+  0xd663, 0xd664, 0xd665, 0xd666, 0xd667, 0xd668, 0xd669, 0xd66a, /*0x08-0x0f*/
+  0xd66b, 0xd66c, 0xd66d, 0xd66e, 0xd66f, 0xd670, 0xd671, 0xd672, /*0x10-0x17*/
+  0xd673, 0xd674, 0xd675, 0xd676, 0xd677, 0xd678, 0xd679, 0xd67a, /*0x18-0x1f*/
+  0xd67b, 0xd67c, 0xd67d, 0xd67e, 0xd680, 0xd681, 0xf6a5, 0xd682, /*0x20-0x27*/
+  0xd683, 0xd684, 0xd685, 0xd686, 0xd687, 0xd688, 0xd689, 0xd68a, /*0x28-0x2f*/
+  0xd68b, 0xd68c, 0xd68d, 0xd68e, 0xd68f, 0xd690, 0xd691, 0xd692, /*0x30-0x37*/
+  0xd693, 0xd694, 0xd695, 0xd696, 0xd697, 0xd698, 0xd699, 0xd69a, /*0x38-0x3f*/
+  0xd69b, 0xd69c, 0xd69d, 0xd69e, 0xd69f, 0xd6a0, 0xd740, 0xd741, /*0x40-0x47*/
+  0xd742, 0xd743, 0xd744, 0xd745, 0xd746, 0xd747, 0xd748, 0xd749, /*0x48-0x4f*/
+  0xd74a, 0xd74b, 0xd74c, 0xd74d, 0xd74e, 0xd74f, 0xd750, 0xd751, /*0x50-0x57*/
+  0xd752, 0xd753, 0xd754, 0xd755, 0xd756, 0xd757, 0xd758, 0xd759, /*0x58-0x5f*/
+  0xd75a, 0xd75b, 0xd75c, 0xd75d, 0xd75e, 0xd75f, 0xbeaf, 0xd760, /*0x60-0x67*/
+  0xd761, 0xd762, 0xd763, 0xd764, 0xc6a9, 0xd765, 0xd766, 0xd767, /*0x68-0x6f*/
+  0xd768, 0xd769, 0xd76a, 0xd76b, 0xd76c, 0xd76d, 0xd76e, 0xd76f, /*0x70-0x77*/
+  0xd770, 0xd771, 0xd772, 0xd773, 0xd774, 0xd775, 0xd776, 0xd777, /*0x78-0x7f*/
+  0xd778, 0xd779, 0xd77a, 0xd77b, 0xd77c, 0xd77d, 0xd77e, 0xd780, /*0x80-0x87*/
+  0xd781, 0xd782, 0xd783, 0xd784, 0xd785, 0xd786, 0xd787, 0xd788, /*0x88-0x8f*/
+  0xd789, 0xd78a, 0xd78b, 0xd78c, 0xd78d, 0xd78e, 0xd78f, 0xd790, /*0x90-0x97*/
+  0xd791, 0xd792, 0xd793, 0xd794, 0xd795, 0xd796, 0xd797, 0xd798, /*0x98-0x9f*/
+  0xdaa5, 0xbcc6, 0xb6a9, 0xb8bc, 0xc8cf, 0xbca5, 0xdaa6, 0xdaa7, /*0xa0-0xa7*/
+  0xccd6, 0xc8c3, 0xdaa8, 0xc6fd, 0xd799, 0xd1b5, 0xd2e9, 0xd1b6, /*0xa8-0xaf*/
+  0xbcc7, 0xd79a, 0xbdb2, 0xbbe4, 0xdaa9, 0xdaaa, 0xd1c8, 0xdaab, /*0xb0-0xb7*/
+  0xd0ed, 0xb6ef, 0xc2db, 0xd79b, 0xcbcf, 0xb7ed, 0xc9e8, 0xb7c3, /*0xb8-0xbf*/
+  0xbef7, 0xd6a4, 0xdaac, 0xdaad, 0xc6c0, 0xd7e7, 0xcab6, 0xd79c, /*0xc0-0xc7*/
+  0xd5a9, 0xcbdf, 0xd5ef, 0xdaae, 0xd6df, 0xb4ca, 0xdab0, 0xdaaf, /*0xc8-0xcf*/
+  0xd79d, 0xd2eb, 0xdab1, 0xdab2, 0xdab3, 0xcad4, 0xdab4, 0xcaab, /*0xd0-0xd7*/
+  0xdab5, 0xdab6, 0xb3cf, 0xd6ef, 0xdab7, 0xbbb0, 0xb5ae, 0xdab8, /*0xd8-0xdf*/
+  0xdab9, 0xb9ee, 0xd1af, 0xd2e8, 0xdaba, 0xb8c3, 0xcfea, 0xb2ef, /*0xe0-0xe7*/
+  0xdabb, 0xdabc, 0xd79e, 0xbdeb, 0xcedc, 0xd3ef, 0xdabd, 0xcef3, /*0xe8-0xef*/
+  0xdabe, 0xd3d5, 0xbbe5, 0xdabf, 0xcbb5, 0xcbd0, 0xdac0, 0xc7eb, /*0xf0-0xf7*/
+  0xd6ee, 0xdac1, 0xc5b5, 0xb6c1, 0xdac2, 0xb7cc, 0xbfce, 0xdac3, /*0xf8-0xff*/
+  /* 0x8c00 */
+  0xdac4, 0xcbad, 0xdac5, 0xb5f7, 0xdac6, 0xc1c2, 0xd7bb, 0xdac7, /*0x00-0x07*/
+  0xccb8, 0xd79f, 0xd2ea, 0xc4b1, 0xdac8, 0xb5fd, 0xbbd1, 0xdac9, /*0x08-0x0f*/
+  0xd0b3, 0xdaca, 0xdacb, 0xcebd, 0xdacc, 0xdacd, 0xdace, 0xb2f7, /*0x10-0x17*/
+  0xdad1, 0xdacf, 0xd1e8, 0xdad0, 0xc3d5, 0xdad2, 0xd7a0, 0xdad3, /*0x18-0x1f*/
+  0xdad4, 0xdad5, 0xd0bb, 0xd2a5, 0xb0f9, 0xdad6, 0xc7ab, 0xdad7, /*0x20-0x27*/
+  0xbdf7, 0xc3a1, 0xdad8, 0xdad9, 0xc3fd, 0xccb7, 0xdada, 0xdadb, /*0x28-0x2f*/
+  0xc0be, 0xc6d7, 0xdadc, 0xdadd, 0xc7b4, 0xdade, 0xdadf, 0xb9c8, /*0x30-0x37*/
+  0xd840, 0xd841, 0xd842, 0xd843, 0xd844, 0xd845, 0xd846, 0xd847, /*0x38-0x3f*/
+  0xd848, 0xbbed, 0xd849, 0xd84a, 0xd84b, 0xd84c, 0xb6b9, 0xf4f8, /*0x40-0x47*/
+  0xd84d, 0xf4f9, 0xd84e, 0xd84f, 0xcde3, 0xd850, 0xd851, 0xd852, /*0x48-0x4f*/
+  0xd853, 0xd854, 0xd855, 0xd856, 0xd857, 0xf5b9, 0xd858, 0xd859, /*0x50-0x57*/
+  0xd85a, 0xd85b, 0xebe0, 0xd85c, 0xd85d, 0xd85e, 0xd85f, 0xd860, /*0x58-0x5f*/
+  0xd861, 0xcff3, 0xbbbf, 0xd862, 0xd863, 0xd864, 0xd865, 0xd866, /*0x60-0x67*/
+  0xd867, 0xd868, 0xbac0, 0xd4a5, 0xd869, 0xd86a, 0xd86b, 0xd86c, /*0x68-0x6f*/
+  0xd86d, 0xd86e, 0xd86f, 0xe1d9, 0xd870, 0xd871, 0xd872, 0xd873, /*0x70-0x77*/
+  0xf5f4, 0xb1aa, 0xb2f2, 0xd874, 0xd875, 0xd876, 0xd877, 0xd878, /*0x78-0x7f*/
+  0xd879, 0xd87a, 0xf5f5, 0xd87b, 0xd87c, 0xf5f7, 0xd87d, 0xd87e, /*0x80-0x87*/
+  0xd880, 0xbad1, 0xf5f6, 0xd881, 0xc3b2, 0xd882, 0xd883, 0xd884, /*0x88-0x8f*/
+  0xd885, 0xd886, 0xd887, 0xd888, 0xf5f9, 0xd889, 0xd88a, 0xd88b, /*0x90-0x97*/
+  0xf5f8, 0xd88c, 0xd88d, 0xd88e, 0xd88f, 0xd890, 0xd891, 0xd892, /*0x98-0x9f*/
+  0xd893, 0xd894, 0xd895, 0xd896, 0xd897, 0xd898, 0xd899, 0xd89a, /*0xa0-0xa7*/
+  0xd89b, 0xd89c, 0xd89d, 0xd89e, 0xd89f, 0xd8a0, 0xd940, 0xd941, /*0xa8-0xaf*/
+  0xd942, 0xd943, 0xd944, 0xd945, 0xd946, 0xd947, 0xd948, 0xd949, /*0xb0-0xb7*/
+  0xd94a, 0xd94b, 0xd94c, 0xd94d, 0xd94e, 0xd94f, 0xd950, 0xd951, /*0xb8-0xbf*/
+  0xd952, 0xd953, 0xd954, 0xd955, 0xd956, 0xd957, 0xd958, 0xd959, /*0xc0-0xc7*/
+  0xd95a, 0xd95b, 0xd95c, 0xd95d, 0xd95e, 0xd95f, 0xd960, 0xd961, /*0xc8-0xcf*/
+  0xd962, 0xd963, 0xd964, 0xd965, 0xd966, 0xd967, 0xd968, 0xd969, /*0xd0-0xd7*/
+  0xd96a, 0xd96b, 0xd96c, 0xd96d, 0xd96e, 0xd96f, 0xd970, 0xd971, /*0xd8-0xdf*/
+  0xd972, 0xd973, 0xd974, 0xd975, 0xd976, 0xd977, 0xd978, 0xd979, /*0xe0-0xe7*/
+  0xd97a, 0xd97b, 0xd97c, 0xd97d, 0xd97e, 0xd980, 0xd981, 0xd982, /*0xe8-0xef*/
+  0xd983, 0xd984, 0xd985, 0xd986, 0xd987, 0xd988, 0xd989, 0xd98a, /*0xf0-0xf7*/
+  0xd98b, 0xd98c, 0xd98d, 0xd98e, 0xd98f, 0xd990, 0xd991, 0xd992, /*0xf8-0xff*/
+  /* 0x8d00 */
+  0xd993, 0xd994, 0xd995, 0xd996, 0xd997, 0xd998, 0xd999, 0xd99a, /*0x00-0x07*/
+  0xd99b, 0xd99c, 0xd99d, 0xd99e, 0xd99f, 0xd9a0, 0xda40, 0xda41, /*0x08-0x0f*/
+  0xda42, 0xda43, 0xda44, 0xda45, 0xda46, 0xda47, 0xda48, 0xda49, /*0x10-0x17*/
+  0xda4a, 0xda4b, 0xda4c, 0xda4d, 0xda4e, 0xb1b4, 0xd5ea, 0xb8ba, /*0x18-0x1f*/
+  0xda4f, 0xb9b1, 0xb2c6, 0xd4f0, 0xcfcd, 0xb0dc, 0xd5cb, 0xbbf5, /*0x20-0x27*/
+  0xd6ca, 0xb7b7, 0xccb0, 0xc6b6, 0xb1e1, 0xb9ba, 0xd6fc, 0xb9e1, /*0x28-0x2f*/
+  0xb7a1, 0xbcfa, 0xeada, 0xeadb, 0xccf9, 0xb9f3, 0xeadc, 0xb4fb, /*0x30-0x37*/
+  0xc3b3, 0xb7d1, 0xbad8, 0xeadd, 0xd4f4, 0xeade, 0xbcd6, 0xbbdf, /*0x38-0x3f*/
+  0xeadf, 0xc1de, 0xc2b8, 0xd4df, 0xd7ca, 0xeae0, 0xeae1, 0xeae4, /*0x40-0x47*/
+  0xeae2, 0xeae3, 0xc9de, 0xb8b3, 0xb6c4, 0xeae5, 0xcaea, 0xc9cd, /*0x48-0x4f*/
+  0xb4cd, 0xda50, 0xda51, 0xe2d9, 0xc5e2, 0xeae6, 0xc0b5, 0xda52, /*0x50-0x57*/
+  0xd7b8, 0xeae7, 0xd7ac, 0xc8fc, 0xd8d3, 0xd8cd, 0xd4de, 0xda53, /*0x58-0x5f*/
+  0xd4f9, 0xc9c4, 0xd3ae, 0xb8d3, 0xb3e0, 0xda54, 0xc9e2, 0xf4f6, /*0x60-0x67*/
+  0xda55, 0xda56, 0xda57, 0xbad5, 0xda58, 0xf4f7, 0xda59, 0xda5a, /*0x68-0x6f*/
+  0xd7df, 0xda5b, 0xda5c, 0xf4f1, 0xb8b0, 0xd5d4, 0xb8cf, 0xc6f0, /*0x70-0x77*/
+  0xda5d, 0xda5e, 0xda5f, 0xda60, 0xda61, 0xda62, 0xda63, 0xda64, /*0x78-0x7f*/
+  0xda65, 0xb3c3, 0xda66, 0xda67, 0xf4f2, 0xb3ac, 0xda68, 0xda69, /*0x80-0x87*/
+  0xda6a, 0xda6b, 0xd4bd, 0xc7f7, 0xda6c, 0xda6d, 0xda6e, 0xda6f, /*0x88-0x8f*/
+  0xda70, 0xf4f4, 0xda71, 0xda72, 0xf4f3, 0xda73, 0xda74, 0xda75, /*0x90-0x97*/
+  0xda76, 0xda77, 0xda78, 0xda79, 0xda7a, 0xda7b, 0xda7c, 0xcccb, /*0x98-0x9f*/
+  0xda7d, 0xda7e, 0xda80, 0xc8a4, 0xda81, 0xda82, 0xda83, 0xda84, /*0xa0-0xa7*/
+  0xda85, 0xda86, 0xda87, 0xda88, 0xda89, 0xda8a, 0xda8b, 0xda8c, /*0xa8-0xaf*/
+  0xda8d, 0xf4f5, 0xda8e, 0xd7e3, 0xc5bf, 0xf5c0, 0xda8f, 0xda90, /*0xb0-0xb7*/
+  0xf5bb, 0xda91, 0xf5c3, 0xda92, 0xf5c2, 0xda93, 0xd6ba, 0xf5c1, /*0xb8-0xbf*/
+  0xda94, 0xda95, 0xda96, 0xd4be, 0xf5c4, 0xda97, 0xf5cc, 0xda98, /*0xc0-0xc7*/
+  0xda99, 0xda9a, 0xda9b, 0xb0cf, 0xb5f8, 0xda9c, 0xf5c9, 0xf5ca, /*0xc8-0xcf*/
+  0xda9d, 0xc5dc, 0xda9e, 0xda9f, 0xdaa0, 0xdb40, 0xf5c5, 0xf5c6, /*0xd0-0xd7*/
+  0xdb41, 0xdb42, 0xf5c7, 0xf5cb, 0xdb43, 0xbee0, 0xf5c8, 0xb8fa, /*0xd8-0xdf*/
+  0xdb44, 0xdb45, 0xdb46, 0xf5d0, 0xf5d3, 0xdb47, 0xdb48, 0xdb49, /*0xe0-0xe7*/
+  0xbfe7, 0xdb4a, 0xb9f2, 0xf5bc, 0xf5cd, 0xdb4b, 0xdb4c, 0xc2b7, /*0xe8-0xef*/
+  0xdb4d, 0xdb4e, 0xdb4f, 0xccf8, 0xdb50, 0xbcf9, 0xdb51, 0xf5ce, /*0xf0-0xf7*/
+  0xf5cf, 0xf5d1, 0xb6e5, 0xf5d2, 0xdb52, 0xf5d5, 0xdb53, 0xdb54, /*0xf8-0xff*/
+  /* 0x8e00 */
+  0xdb55, 0xdb56, 0xdb57, 0xdb58, 0xdb59, 0xf5bd, 0xdb5a, 0xdb5b, /*0x00-0x07*/
+  0xdb5c, 0xf5d4, 0xd3bb, 0xdb5d, 0xb3ec, 0xdb5e, 0xdb5f, 0xcca4, /*0x08-0x0f*/
+  0xdb60, 0xdb61, 0xdb62, 0xdb63, 0xf5d6, 0xdb64, 0xdb65, 0xdb66, /*0x10-0x17*/
+  0xdb67, 0xdb68, 0xdb69, 0xdb6a, 0xdb6b, 0xf5d7, 0xbee1, 0xf5d8, /*0x18-0x1f*/
+  0xdb6c, 0xdb6d, 0xccdf, 0xf5db, 0xdb6e, 0xdb6f, 0xdb70, 0xdb71, /*0x20-0x27*/
+  0xdb72, 0xb2c8, 0xd7d9, 0xdb73, 0xf5d9, 0xdb74, 0xf5da, 0xf5dc, /*0x28-0x2f*/
+  0xdb75, 0xf5e2, 0xdb76, 0xdb77, 0xdb78, 0xf5e0, 0xdb79, 0xdb7a, /*0x30-0x37*/
+  0xdb7b, 0xf5df, 0xf5dd, 0xdb7c, 0xdb7d, 0xf5e1, 0xdb7e, 0xdb80, /*0x38-0x3f*/
+  0xf5de, 0xf5e4, 0xf5e5, 0xdb81, 0xcce3, 0xdb82, 0xdb83, 0xe5bf, /*0x40-0x47*/
+  0xb5b8, 0xf5e3, 0xf5e8, 0xcca3, 0xdb84, 0xdb85, 0xdb86, 0xdb87, /*0x48-0x4f*/
+  0xdb88, 0xf5e6, 0xf5e7, 0xdb89, 0xdb8a, 0xdb8b, 0xdb8c, 0xdb8d, /*0x50-0x57*/
+  0xdb8e, 0xf5be, 0xdb8f, 0xdb90, 0xdb91, 0xdb92, 0xdb93, 0xdb94, /*0x58-0x5f*/
+  0xdb95, 0xdb96, 0xdb97, 0xdb98, 0xdb99, 0xdb9a, 0xb1c4, 0xdb9b, /*0x60-0x67*/
+  0xdb9c, 0xf5bf, 0xdb9d, 0xdb9e, 0xb5c5, 0xb2e4, 0xdb9f, 0xf5ec, /*0x68-0x6f*/
+  0xf5e9, 0xdba0, 0xb6d7, 0xdc40, 0xf5ed, 0xdc41, 0xf5ea, 0xdc42, /*0x70-0x77*/
+  0xdc43, 0xdc44, 0xdc45, 0xdc46, 0xf5eb, 0xdc47, 0xdc48, 0xb4da, /*0x78-0x7f*/
+  0xdc49, 0xd4ea, 0xdc4a, 0xdc4b, 0xdc4c, 0xf5ee, 0xdc4d, 0xb3f9, /*0x80-0x87*/
+  0xdc4e, 0xdc4f, 0xdc50, 0xdc51, 0xdc52, 0xdc53, 0xdc54, 0xf5ef, /*0x88-0x8f*/
+  0xf5f1, 0xdc55, 0xdc56, 0xdc57, 0xf5f0, 0xdc58, 0xdc59, 0xdc5a, /*0x90-0x97*/
+  0xdc5b, 0xdc5c, 0xdc5d, 0xdc5e, 0xf5f2, 0xdc5f, 0xf5f3, 0xdc60, /*0x98-0x9f*/
+  0xdc61, 0xdc62, 0xdc63, 0xdc64, 0xdc65, 0xdc66, 0xdc67, 0xdc68, /*0xa0-0xa7*/
+  0xdc69, 0xdc6a, 0xdc6b, 0xc9ed, 0xb9aa, 0xdc6c, 0xdc6d, 0xc7fb, /*0xa8-0xaf*/
+  0xdc6e, 0xdc6f, 0xb6e3, 0xdc70, 0xdc71, 0xdc72, 0xdc73, 0xdc74, /*0xb0-0xb7*/
+  0xdc75, 0xdc76, 0xccc9, 0xdc77, 0xdc78, 0xdc79, 0xdc7a, 0xdc7b, /*0xb8-0xbf*/
+  0xdc7c, 0xdc7d, 0xdc7e, 0xdc80, 0xdc81, 0xdc82, 0xdc83, 0xdc84, /*0xc0-0xc7*/
+  0xdc85, 0xdc86, 0xdc87, 0xdc88, 0xdc89, 0xdc8a, 0xeaa6, 0xdc8b, /*0xc8-0xcf*/
+  0xdc8c, 0xdc8d, 0xdc8e, 0xdc8f, 0xdc90, 0xdc91, 0xdc92, 0xdc93, /*0xd0-0xd7*/
+  0xdc94, 0xdc95, 0xdc96, 0xdc97, 0xdc98, 0xdc99, 0xdc9a, 0xdc9b, /*0xd8-0xdf*/
+  0xdc9c, 0xdc9d, 0xdc9e, 0xdc9f, 0xdca0, 0xdd40, 0xdd41, 0xdd42, /*0xe0-0xe7*/
+  0xdd43, 0xdd44, 0xdd45, 0xdd46, 0xdd47, 0xdd48, 0xdd49, 0xdd4a, /*0xe8-0xef*/
+  0xdd4b, 0xdd4c, 0xdd4d, 0xdd4e, 0xdd4f, 0xdd50, 0xdd51, 0xdd52, /*0xf0-0xf7*/
+  0xdd53, 0xdd54, 0xdd55, 0xdd56, 0xdd57, 0xdd58, 0xdd59, 0xdd5a, /*0xf8-0xff*/
+  /* 0x8f00 */
+  0xdd5b, 0xdd5c, 0xdd5d, 0xdd5e, 0xdd5f, 0xdd60, 0xdd61, 0xdd62, /*0x00-0x07*/
+  0xdd63, 0xdd64, 0xdd65, 0xdd66, 0xdd67, 0xdd68, 0xdd69, 0xdd6a, /*0x08-0x0f*/
+  0xdd6b, 0xdd6c, 0xdd6d, 0xdd6e, 0xdd6f, 0xdd70, 0xdd71, 0xdd72, /*0x10-0x17*/
+  0xdd73, 0xdd74, 0xdd75, 0xdd76, 0xdd77, 0xdd78, 0xdd79, 0xdd7a, /*0x18-0x1f*/
+  0xdd7b, 0xdd7c, 0xdd7d, 0xdd7e, 0xdd80, 0xdd81, 0xdd82, 0xdd83, /*0x20-0x27*/
+  0xdd84, 0xdd85, 0xdd86, 0xdd87, 0xdd88, 0xdd89, 0xdd8a, 0xdd8b, /*0x28-0x2f*/
+  0xdd8c, 0xdd8d, 0xdd8e, 0xdd8f, 0xdd90, 0xdd91, 0xdd92, 0xdd93, /*0x30-0x37*/
+  0xdd94, 0xdd95, 0xdd96, 0xdd97, 0xdd98, 0xdd99, 0xdd9a, 0xdd9b, /*0x38-0x3f*/
+  0xdd9c, 0xdd9d, 0xdd9e, 0xdd9f, 0xdda0, 0xde40, 0xde41, 0xde42, /*0x40-0x47*/
+  0xde43, 0xde44, 0xde45, 0xde46, 0xde47, 0xde48, 0xde49, 0xde4a, /*0x48-0x4f*/
+  0xde4b, 0xde4c, 0xde4d, 0xde4e, 0xde4f, 0xde50, 0xde51, 0xde52, /*0x50-0x57*/
+  0xde53, 0xde54, 0xde55, 0xde56, 0xde57, 0xde58, 0xde59, 0xde5a, /*0x58-0x5f*/
+  0xde5b, 0xde5c, 0xde5d, 0xde5e, 0xde5f, 0xde60, 0xb3b5, 0xd4fe, /*0x60-0x67*/
+  0xb9ec, 0xd0f9, 0xde61, 0xe9ed, 0xd7aa, 0xe9ee, 0xc2d6, 0xc8ed, /*0x68-0x6f*/
+  0xbae4, 0xe9ef, 0xe9f0, 0xe9f1, 0xd6e1, 0xe9f2, 0xe9f3, 0xe9f5, /*0x70-0x77*/
+  0xe9f4, 0xe9f6, 0xe9f7, 0xc7e1, 0xe9f8, 0xd4d8, 0xe9f9, 0xbdce, /*0x78-0x7f*/
+  0xde62, 0xe9fa, 0xe9fb, 0xbdcf, 0xe9fc, 0xb8a8, 0xc1be, 0xe9fd, /*0x80-0x87*/
+  0xb1b2, 0xbbd4, 0xb9f5, 0xe9fe, 0xde63, 0xeaa1, 0xeaa2, 0xeaa3, /*0x88-0x8f*/
+  0xb7f8, 0xbcad, 0xde64, 0xcae4, 0xe0ce, 0xd4af, 0xcfbd, 0xd5b7, /*0x90-0x97*/
+  0xeaa4, 0xd5de, 0xeaa5, 0xd0c1, 0xb9bc, 0xde65, 0xb4c7, 0xb1d9, /*0x98-0x9f*/
+  0xde66, 0xde67, 0xde68, 0xc0b1, 0xde69, 0xde6a, 0xde6b, 0xde6c, /*0xa0-0xa7*/
+  0xb1e6, 0xb1e7, 0xde6d, 0xb1e8, 0xde6e, 0xde6f, 0xde70, 0xde71, /*0xa8-0xaf*/
+  0xb3bd, 0xc8e8, 0xde72, 0xde73, 0xde74, 0xde75, 0xe5c1, 0xde76, /*0xb0-0xb7*/
+  0xde77, 0xb1df, 0xde78, 0xde79, 0xde7a, 0xc1c9, 0xb4ef, 0xde7b, /*0xb8-0xbf*/
+  0xde7c, 0xc7a8, 0xd3d8, 0xde7d, 0xc6f9, 0xd1b8, 0xde7e, 0xb9fd, /*0xc0-0xc7*/
+  0xc2f5, 0xde80, 0xde81, 0xde82, 0xde83, 0xde84, 0xd3ad, 0xde85, /*0xc8-0xcf*/
+  0xd4cb, 0xbdfc, 0xde86, 0xe5c2, 0xb7b5, 0xe5c3, 0xde87, 0xde88, /*0xd0-0xd7*/
+  0xbbb9, 0xd5e2, 0xde89, 0xbdf8, 0xd4b6, 0xcea5, 0xc1ac, 0xb3d9, /*0xd8-0xdf*/
+  0xde8a, 0xde8b, 0xccf6, 0xde8c, 0xe5c6, 0xe5c4, 0xe5c8, 0xde8d, /*0xe0-0xe7*/
+  0xe5ca, 0xe5c7, 0xb5cf, 0xc6c8, 0xde8e, 0xb5fc, 0xe5c5, 0xde8f, /*0xe8-0xef*/
+  0xcaf6, 0xde90, 0xde91, 0xe5c9, 0xde92, 0xde93, 0xde94, 0xc3d4, /*0xf0-0xf7*/
+  0xb1c5, 0xbca3, 0xde95, 0xde96, 0xde97, 0xd7b7, 0xde98, 0xde99, /*0xf8-0xff*/
+  /* 0x9000 */
+  0xcdcb, 0xcbcd, 0xcaca, 0xccd3, 0xe5cc, 0xe5cb, 0xc4e6, 0xde9a, /*0x00-0x07*/
+  0xde9b, 0xd1a1, 0xd1b7, 0xe5cd, 0xde9c, 0xe5d0, 0xde9d, 0xcdb8, /*0x08-0x0f*/
+  0xd6f0, 0xe5cf, 0xb5dd, 0xde9e, 0xcdbe, 0xde9f, 0xe5d1, 0xb6ba, /*0x10-0x17*/
+  0xdea0, 0xdf40, 0xcda8, 0xb9e4, 0xdf41, 0xcac5, 0xb3d1, 0xcbd9, /*0x18-0x1f*/
+  0xd4ec, 0xe5d2, 0xb7ea, 0xdf42, 0xdf43, 0xdf44, 0xe5ce, 0xdf45, /*0x20-0x27*/
+  0xdf46, 0xdf47, 0xdf48, 0xdf49, 0xdf4a, 0xe5d5, 0xb4fe, 0xe5d6, /*0x28-0x2f*/
+  0xdf4b, 0xdf4c, 0xdf4d, 0xdf4e, 0xdf4f, 0xe5d3, 0xe5d4, 0xdf50, /*0x30-0x37*/
+  0xd2dd, 0xdf51, 0xdf52, 0xc2df, 0xb1c6, 0xdf53, 0xd3e2, 0xdf54, /*0x38-0x3f*/
+  0xdf55, 0xb6dd, 0xcbec, 0xdf56, 0xe5d7, 0xdf57, 0xdf58, 0xd3f6, /*0x40-0x47*/
+  0xdf59, 0xdf5a, 0xdf5b, 0xdf5c, 0xdf5d, 0xb1e9, 0xdf5e, 0xb6f4, /*0x48-0x4f*/
+  0xe5da, 0xe5d8, 0xe5d9, 0xb5c0, 0xdf5f, 0xdf60, 0xdf61, 0xd2c5, /*0x50-0x57*/
+  0xe5dc, 0xdf62, 0xdf63, 0xe5de, 0xdf64, 0xdf65, 0xdf66, 0xdf67, /*0x58-0x5f*/
+  0xdf68, 0xdf69, 0xe5dd, 0xc7b2, 0xdf6a, 0xd2a3, 0xdf6b, 0xdf6c, /*0x60-0x67*/
+  0xe5db, 0xdf6d, 0xdf6e, 0xdf6f, 0xdf70, 0xd4e2, 0xd5da, 0xdf71, /*0x68-0x6f*/
+  0xdf72, 0xdf73, 0xdf74, 0xdf75, 0xe5e0, 0xd7f1, 0xdf76, 0xdf77, /*0x70-0x77*/
+  0xdf78, 0xdf79, 0xdf7a, 0xdf7b, 0xdf7c, 0xe5e1, 0xdf7d, 0xb1dc, /*0x78-0x7f*/
+  0xd1fb, 0xdf7e, 0xe5e2, 0xe5e4, 0xdf80, 0xdf81, 0xdf82, 0xdf83, /*0x80-0x87*/
+  0xe5e3, 0xdf84, 0xdf85, 0xe5e5, 0xdf86, 0xdf87, 0xdf88, 0xdf89, /*0x88-0x8f*/
+  0xdf8a, 0xd2d8, 0xdf8b, 0xb5cb, 0xdf8c, 0xe7df, 0xdf8d, 0xdaf5, /*0x90-0x97*/
+  0xdf8e, 0xdaf8, 0xdf8f, 0xdaf6, 0xdf90, 0xdaf7, 0xdf91, 0xdf92, /*0x98-0x9f*/
+  0xdf93, 0xdafa, 0xd0cf, 0xc4c7, 0xdf94, 0xdf95, 0xb0ee, 0xdf96, /*0xa0-0xa7*/
+  0xdf97, 0xdf98, 0xd0b0, 0xdf99, 0xdaf9, 0xdf9a, 0xd3ca, 0xbaaa, /*0xa8-0xaf*/
+  0xdba2, 0xc7f1, 0xdf9b, 0xdafc, 0xdafb, 0xc9db, 0xdafd, 0xdf9c, /*0xb0-0xb7*/
+  0xdba1, 0xd7de, 0xdafe, 0xc1da, 0xdf9d, 0xdf9e, 0xdba5, 0xdf9f, /*0xb8-0xbf*/
+  0xdfa0, 0xd3f4, 0xe040, 0xe041, 0xdba7, 0xdba4, 0xe042, 0xdba8, /*0xc0-0xc7*/
+  0xe043, 0xe044, 0xbdbc, 0xe045, 0xe046, 0xe047, 0xc0c9, 0xdba3, /*0xc8-0xcf*/
+  0xdba6, 0xd6a3, 0xe048, 0xdba9, 0xe049, 0xe04a, 0xe04b, 0xdbad, /*0xd0-0xd7*/
+  0xe04c, 0xe04d, 0xe04e, 0xdbae, 0xdbac, 0xbac2, 0xe04f, 0xe050, /*0xd8-0xdf*/
+  0xe051, 0xbfa4, 0xdbab, 0xe052, 0xe053, 0xe054, 0xdbaa, 0xd4c7, /*0xe0-0xe7*/
+  0xb2bf, 0xe055, 0xe056, 0xdbaf, 0xe057, 0xb9f9, 0xe058, 0xdbb0, /*0xe8-0xef*/
+  0xe059, 0xe05a, 0xe05b, 0xe05c, 0xb3bb, 0xe05d, 0xe05e, 0xe05f, /*0xf0-0xf7*/
+  0xb5a6, 0xe060, 0xe061, 0xe062, 0xe063, 0xb6bc, 0xdbb1, 0xe064, /*0xf8-0xff*/
+  /* 0x9100 */
+  0xe065, 0xe066, 0xb6f5, 0xe067, 0xdbb2, 0xe068, 0xe069, 0xe06a, /*0x00-0x07*/
+  0xe06b, 0xe06c, 0xe06d, 0xe06e, 0xe06f, 0xe070, 0xe071, 0xe072, /*0x08-0x0f*/
+  0xe073, 0xe074, 0xe075, 0xe076, 0xe077, 0xe078, 0xe079, 0xe07a, /*0x10-0x17*/
+  0xe07b, 0xb1c9, 0xe07c, 0xe07d, 0xe07e, 0xe080, 0xdbb4, 0xe081, /*0x18-0x1f*/
+  0xe082, 0xe083, 0xdbb3, 0xdbb5, 0xe084, 0xe085, 0xe086, 0xe087, /*0x20-0x27*/
+  0xe088, 0xe089, 0xe08a, 0xe08b, 0xe08c, 0xe08d, 0xe08e, 0xdbb7, /*0x28-0x2f*/
+  0xe08f, 0xdbb6, 0xe090, 0xe091, 0xe092, 0xe093, 0xe094, 0xe095, /*0x30-0x37*/
+  0xe096, 0xdbb8, 0xe097, 0xe098, 0xe099, 0xe09a, 0xe09b, 0xe09c, /*0x38-0x3f*/
+  0xe09d, 0xe09e, 0xe09f, 0xdbb9, 0xe0a0, 0xe140, 0xdbba, 0xe141, /*0x40-0x47*/
+  0xe142, 0xd3cf, 0xf4fa, 0xc7f5, 0xd7c3, 0xc5e4, 0xf4fc, 0xf4fd, /*0x48-0x4f*/
+  0xf4fb, 0xe143, 0xbec6, 0xe144, 0xe145, 0xe146, 0xe147, 0xd0ef, /*0x50-0x57*/
+  0xe148, 0xe149, 0xb7d3, 0xe14a, 0xe14b, 0xd4cd, 0xccaa, 0xe14c, /*0x58-0x5f*/
+  0xe14d, 0xf5a2, 0xf5a1, 0xbaa8, 0xf4fe, 0xcbd6, 0xe14e, 0xe14f, /*0x60-0x67*/
+  0xe150, 0xf5a4, 0xc0d2, 0xe151, 0xb3ea, 0xe152, 0xcdaa, 0xf5a5, /*0x68-0x6f*/
+  0xf5a3, 0xbdb4, 0xf5a8, 0xe153, 0xf5a9, 0xbdcd, 0xc3b8, 0xbfe1, /*0x70-0x77*/
+  0xcbe1, 0xf5aa, 0xe154, 0xe155, 0xe156, 0xf5a6, 0xf5a7, 0xc4f0, /*0x78-0x7f*/
+  0xe157, 0xe158, 0xe159, 0xe15a, 0xe15b, 0xf5ac, 0xe15c, 0xb4bc, /*0x80-0x87*/
+  0xe15d, 0xd7ed, 0xe15e, 0xb4d7, 0xf5ab, 0xf5ae, 0xe15f, 0xe160, /*0x88-0x8f*/
+  0xf5ad, 0xf5af, 0xd0d1, 0xe161, 0xe162, 0xe163, 0xe164, 0xe165, /*0x90-0x97*/
+  0xe166, 0xe167, 0xc3d1, 0xc8a9, 0xe168, 0xe169, 0xe16a, 0xe16b, /*0x98-0x9f*/
+  0xe16c, 0xe16d, 0xf5b0, 0xf5b1, 0xe16e, 0xe16f, 0xe170, 0xe171, /*0xa0-0xa7*/
+  0xe172, 0xe173, 0xf5b2, 0xe174, 0xe175, 0xf5b3, 0xf5b4, 0xf5b5, /*0xa8-0xaf*/
+  0xe176, 0xe177, 0xe178, 0xe179, 0xf5b7, 0xf5b6, 0xe17a, 0xe17b, /*0xb0-0xb7*/
+  0xe17c, 0xe17d, 0xf5b8, 0xe17e, 0xe180, 0xe181, 0xe182, 0xe183, /*0xb8-0xbf*/
+  0xe184, 0xe185, 0xe186, 0xe187, 0xe188, 0xe189, 0xe18a, 0xb2c9, /*0xc0-0xc7*/
+  0xe18b, 0xd3d4, 0xcacd, 0xe18c, 0xc0ef, 0xd6d8, 0xd2b0, 0xc1bf, /*0xc8-0xcf*/
+  0xe18d, 0xbdf0, 0xe18e, 0xe18f, 0xe190, 0xe191, 0xe192, 0xe193, /*0xd0-0xd7*/
+  0xe194, 0xe195, 0xe196, 0xe197, 0xb8aa, 0xe198, 0xe199, 0xe19a, /*0xd8-0xdf*/
+  0xe19b, 0xe19c, 0xe19d, 0xe19e, 0xe19f, 0xe1a0, 0xe240, 0xe241, /*0xe0-0xe7*/
+  0xe242, 0xe243, 0xe244, 0xe245, 0xe246, 0xe247, 0xe248, 0xe249, /*0xe8-0xef*/
+  0xe24a, 0xe24b, 0xe24c, 0xe24d, 0xe24e, 0xe24f, 0xe250, 0xe251, /*0xf0-0xf7*/
+  0xe252, 0xe253, 0xe254, 0xe255, 0xe256, 0xe257, 0xe258, 0xe259, /*0xf8-0xff*/
+  /* 0x9200 */
+  0xe25a, 0xe25b, 0xe25c, 0xe25d, 0xe25e, 0xe25f, 0xe260, 0xe261, /*0x00-0x07*/
+  0xe262, 0xe263, 0xe264, 0xe265, 0xe266, 0xe267, 0xe268, 0xe269, /*0x08-0x0f*/
+  0xe26a, 0xe26b, 0xe26c, 0xe26d, 0xe26e, 0xe26f, 0xe270, 0xe271, /*0x10-0x17*/
+  0xe272, 0xe273, 0xe274, 0xe275, 0xe276, 0xe277, 0xe278, 0xe279, /*0x18-0x1f*/
+  0xe27a, 0xe27b, 0xe27c, 0xe27d, 0xe27e, 0xe280, 0xe281, 0xe282, /*0x20-0x27*/
+  0xe283, 0xe284, 0xe285, 0xe286, 0xe287, 0xe288, 0xe289, 0xe28a, /*0x28-0x2f*/
+  0xe28b, 0xe28c, 0xe28d, 0xe28e, 0xe28f, 0xe290, 0xe291, 0xe292, /*0x30-0x37*/
+  0xe293, 0xe294, 0xe295, 0xe296, 0xe297, 0xe298, 0xe299, 0xe29a, /*0x38-0x3f*/
+  0xe29b, 0xe29c, 0xe29d, 0xe29e, 0xe29f, 0xe2a0, 0xe340, 0xe341, /*0x40-0x47*/
+  0xe342, 0xe343, 0xe344, 0xe345, 0xe346, 0xe347, 0xe348, 0xe349, /*0x48-0x4f*/
+  0xe34a, 0xe34b, 0xe34c, 0xe34d, 0xe34e, 0xe34f, 0xe350, 0xe351, /*0x50-0x57*/
+  0xe352, 0xe353, 0xe354, 0xe355, 0xe356, 0xe357, 0xe358, 0xe359, /*0x58-0x5f*/
+  0xe35a, 0xe35b, 0xe35c, 0xe35d, 0xe35e, 0xe35f, 0xe360, 0xe361, /*0x60-0x67*/
+  0xe362, 0xe363, 0xe364, 0xe365, 0xe366, 0xe367, 0xe368, 0xe369, /*0x68-0x6f*/
+  0xe36a, 0xe36b, 0xe36c, 0xe36d, 0xbcf8, 0xe36e, 0xe36f, 0xe370, /*0x70-0x77*/
+  0xe371, 0xe372, 0xe373, 0xe374, 0xe375, 0xe376, 0xe377, 0xe378, /*0x78-0x7f*/
+  0xe379, 0xe37a, 0xe37b, 0xe37c, 0xe37d, 0xe37e, 0xe380, 0xe381, /*0x80-0x87*/
+  0xe382, 0xe383, 0xe384, 0xe385, 0xe386, 0xe387, 0xf6c6, 0xe388, /*0x88-0x8f*/
+  0xe389, 0xe38a, 0xe38b, 0xe38c, 0xe38d, 0xe38e, 0xe38f, 0xe390, /*0x90-0x97*/
+  0xe391, 0xe392, 0xe393, 0xe394, 0xe395, 0xe396, 0xe397, 0xe398, /*0x98-0x9f*/
+  0xe399, 0xe39a, 0xe39b, 0xe39c, 0xe39d, 0xe39e, 0xe39f, 0xe3a0, /*0xa0-0xa7*/
+  0xe440, 0xe441, 0xe442, 0xe443, 0xe444, 0xe445, 0xf6c7, 0xe446, /*0xa8-0xaf*/
+  0xe447, 0xe448, 0xe449, 0xe44a, 0xe44b, 0xe44c, 0xe44d, 0xe44e, /*0xb0-0xb7*/
+  0xe44f, 0xe450, 0xe451, 0xe452, 0xe453, 0xe454, 0xe455, 0xe456, /*0xb8-0xbf*/
+  0xe457, 0xe458, 0xe459, 0xe45a, 0xe45b, 0xe45c, 0xe45d, 0xe45e, /*0xc0-0xc7*/
+  0xf6c8, 0xe45f, 0xe460, 0xe461, 0xe462, 0xe463, 0xe464, 0xe465, /*0xc8-0xcf*/
+  0xe466, 0xe467, 0xe468, 0xe469, 0xe46a, 0xe46b, 0xe46c, 0xe46d, /*0xd0-0xd7*/
+  0xe46e, 0xe46f, 0xe470, 0xe471, 0xe472, 0xe473, 0xe474, 0xe475, /*0xd8-0xdf*/
+  0xe476, 0xe477, 0xe478, 0xe479, 0xe47a, 0xe47b, 0xe47c, 0xe47d, /*0xe0-0xe7*/
+  0xe47e, 0xe480, 0xe481, 0xe482, 0xe483, 0xe484, 0xe485, 0xe486, /*0xe8-0xef*/
+  0xe487, 0xe488, 0xe489, 0xe48a, 0xe48b, 0xe48c, 0xe48d, 0xe48e, /*0xf0-0xf7*/
+  0xe48f, 0xe490, 0xe491, 0xe492, 0xe493, 0xe494, 0xe495, 0xe496, /*0xf8-0xff*/
+  /* 0x9300 */
+  0xe497, 0xe498, 0xe499, 0xe49a, 0xe49b, 0xe49c, 0xe49d, 0xe49e, /*0x00-0x07*/
+  0xe49f, 0xe4a0, 0xe540, 0xe541, 0xe542, 0xe543, 0xe544, 0xe545, /*0x08-0x0f*/
+  0xe546, 0xe547, 0xe548, 0xe549, 0xe54a, 0xe54b, 0xe54c, 0xe54d, /*0x10-0x17*/
+  0xe54e, 0xe54f, 0xe550, 0xe551, 0xe552, 0xe553, 0xe554, 0xe555, /*0x18-0x1f*/
+  0xe556, 0xe557, 0xe558, 0xe559, 0xe55a, 0xe55b, 0xe55c, 0xe55d, /*0x20-0x27*/
+  0xe55e, 0xe55f, 0xe560, 0xe561, 0xe562, 0xe563, 0xe564, 0xe565, /*0x28-0x2f*/
+  0xe566, 0xe567, 0xe568, 0xe569, 0xe56a, 0xe56b, 0xe56c, 0xe56d, /*0x30-0x37*/
+  0xe56e, 0xe56f, 0xe570, 0xe571, 0xe572, 0xe573, 0xf6c9, 0xe574, /*0x38-0x3f*/
+  0xe575, 0xe576, 0xe577, 0xe578, 0xe579, 0xe57a, 0xe57b, 0xe57c, /*0x40-0x47*/
+  0xe57d, 0xe57e, 0xe580, 0xe581, 0xe582, 0xe583, 0xe584, 0xe585, /*0x48-0x4f*/
+  0xe586, 0xe587, 0xe588, 0xe589, 0xe58a, 0xe58b, 0xe58c, 0xe58d, /*0x50-0x57*/
+  0xe58e, 0xe58f, 0xe590, 0xe591, 0xe592, 0xe593, 0xe594, 0xe595, /*0x58-0x5f*/
+  0xe596, 0xe597, 0xe598, 0xe599, 0xe59a, 0xe59b, 0xe59c, 0xe59d, /*0x60-0x67*/
+  0xe59e, 0xe59f, 0xf6ca, 0xe5a0, 0xe640, 0xe641, 0xe642, 0xe643, /*0x68-0x6f*/
+  0xe644, 0xe645, 0xe646, 0xe647, 0xe648, 0xe649, 0xe64a, 0xe64b, /*0x70-0x77*/
+  0xe64c, 0xe64d, 0xe64e, 0xe64f, 0xe650, 0xe651, 0xe652, 0xe653, /*0x78-0x7f*/
+  0xe654, 0xe655, 0xe656, 0xe657, 0xe658, 0xe659, 0xe65a, 0xe65b, /*0x80-0x87*/
+  0xe65c, 0xe65d, 0xe65e, 0xe65f, 0xe660, 0xe661, 0xe662, 0xf6cc, /*0x88-0x8f*/
+  0xe663, 0xe664, 0xe665, 0xe666, 0xe667, 0xe668, 0xe669, 0xe66a, /*0x90-0x97*/
+  0xe66b, 0xe66c, 0xe66d, 0xe66e, 0xe66f, 0xe670, 0xe671, 0xe672, /*0x98-0x9f*/
+  0xe673, 0xe674, 0xe675, 0xe676, 0xe677, 0xe678, 0xe679, 0xe67a, /*0xa0-0xa7*/
+  0xe67b, 0xe67c, 0xe67d, 0xe67e, 0xe680, 0xe681, 0xe682, 0xe683, /*0xa8-0xaf*/
+  0xe684, 0xe685, 0xe686, 0xe687, 0xe688, 0xe689, 0xe68a, 0xe68b, /*0xb0-0xb7*/
+  0xe68c, 0xe68d, 0xe68e, 0xe68f, 0xe690, 0xe691, 0xe692, 0xe693, /*0xb8-0xbf*/
+  0xe694, 0xe695, 0xe696, 0xe697, 0xe698, 0xe699, 0xe69a, 0xe69b, /*0xc0-0xc7*/
+  0xe69c, 0xe69d, 0xf6cb, 0xe69e, 0xe69f, 0xe6a0, 0xe740, 0xe741, /*0xc8-0xcf*/
+  0xe742, 0xe743, 0xe744, 0xe745, 0xe746, 0xe747, 0xf7e9, 0xe748, /*0xd0-0xd7*/
+  0xe749, 0xe74a, 0xe74b, 0xe74c, 0xe74d, 0xe74e, 0xe74f, 0xe750, /*0xd8-0xdf*/
+  0xe751, 0xe752, 0xe753, 0xe754, 0xe755, 0xe756, 0xe757, 0xe758, /*0xe0-0xe7*/
+  0xe759, 0xe75a, 0xe75b, 0xe75c, 0xe75d, 0xe75e, 0xe75f, 0xe760, /*0xe8-0xef*/
+  0xe761, 0xe762, 0xe763, 0xe764, 0xe765, 0xe766, 0xe767, 0xe768, /*0xf0-0xf7*/
+  0xe769, 0xe76a, 0xe76b, 0xe76c, 0xe76d, 0xe76e, 0xe76f, 0xe770, /*0xf8-0xff*/
+  /* 0x9400 */
+  0xe771, 0xe772, 0xe773, 0xe774, 0xe775, 0xe776, 0xe777, 0xe778, /*0x00-0x07*/
+  0xe779, 0xe77a, 0xe77b, 0xe77c, 0xe77d, 0xe77e, 0xe780, 0xe781, /*0x08-0x0f*/
+  0xe782, 0xe783, 0xe784, 0xe785, 0xe786, 0xe787, 0xe788, 0xe789, /*0x10-0x17*/
+  0xe78a, 0xe78b, 0xe78c, 0xe78d, 0xe78e, 0xe78f, 0xe790, 0xe791, /*0x18-0x1f*/
+  0xe792, 0xe793, 0xe794, 0xe795, 0xe796, 0xe797, 0xe798, 0xe799, /*0x20-0x27*/
+  0xe79a, 0xe79b, 0xe79c, 0xe79d, 0xe79e, 0xe79f, 0xe7a0, 0xe840, /*0x28-0x2f*/
+  0xe841, 0xe842, 0xe843, 0xe844, 0xe845, 0xe846, 0xe847, 0xe848, /*0x30-0x37*/
+  0xe849, 0xe84a, 0xe84b, 0xe84c, 0xe84d, 0xe84e, 0xf6cd, 0xe84f, /*0x38-0x3f*/
+  0xe850, 0xe851, 0xe852, 0xe853, 0xe854, 0xe855, 0xe856, 0xe857, /*0x40-0x47*/
+  0xe858, 0xe859, 0xe85a, 0xe85b, 0xe85c, 0xe85d, 0xe85e, 0xe85f, /*0x48-0x4f*/
+  0xe860, 0xe861, 0xe862, 0xe863, 0xe864, 0xe865, 0xe866, 0xe867, /*0x50-0x57*/
+  0xe868, 0xe869, 0xe86a, 0xe86b, 0xe86c, 0xe86d, 0xe86e, 0xe86f, /*0x58-0x5f*/
+  0xe870, 0xe871, 0xe872, 0xe873, 0xe874, 0xe875, 0xe876, 0xe877, /*0x60-0x67*/
+  0xe878, 0xe879, 0xe87a, 0xf6ce, 0xe87b, 0xe87c, 0xe87d, 0xe87e, /*0x68-0x6f*/
+  0xe880, 0xe881, 0xe882, 0xe883, 0xe884, 0xe885, 0xe886, 0xe887, /*0x70-0x77*/
+  0xe888, 0xe889, 0xe88a, 0xe88b, 0xe88c, 0xe88d, 0xe88e, 0xe88f, /*0x78-0x7f*/
+  0xe890, 0xe891, 0xe892, 0xe893, 0xe894, 0xeec4, 0xeec5, 0xeec6, /*0x80-0x87*/
+  0xd5eb, 0xb6a4, 0xeec8, 0xeec7, 0xeec9, 0xeeca, 0xc7a5, 0xeecb, /*0x88-0x8f*/
+  0xeecc, 0xe895, 0xb7b0, 0xb5f6, 0xeecd, 0xeecf, 0xe896, 0xeece, /*0x90-0x97*/
+  0xe897, 0xb8c6, 0xeed0, 0xeed1, 0xeed2, 0xb6db, 0xb3ae, 0xd6d3, /*0x98-0x9f*/
+  0xc4c6, 0xb1b5, 0xb8d6, 0xeed3, 0xeed4, 0xd4bf, 0xc7d5, 0xbefb, /*0xa0-0xa7*/
+  0xced9, 0xb9b3, 0xeed6, 0xeed5, 0xeed8, 0xeed7, 0xc5a5, 0xeed9, /*0xa8-0xaf*/
+  0xeeda, 0xc7ae, 0xeedb, 0xc7af, 0xeedc, 0xb2a7, 0xeedd, 0xeede, /*0xb0-0xb7*/
+  0xeedf, 0xeee0, 0xeee1, 0xd7ea, 0xeee2, 0xeee3, 0xbcd8, 0xeee4, /*0xb8-0xbf*/
+  0xd3cb, 0xccfa, 0xb2ac, 0xc1e5, 0xeee5, 0xc7a6, 0xc3ad, 0xe898, /*0xc0-0xc7*/
+  0xeee6, 0xeee7, 0xeee8, 0xeee9, 0xeeea, 0xeeeb, 0xeeec, 0xe899, /*0xc8-0xcf*/
+  0xeeed, 0xeeee, 0xeeef, 0xe89a, 0xe89b, 0xeef0, 0xeef1, 0xeef2, /*0xd0-0xd7*/
+  0xeef4, 0xeef3, 0xe89c, 0xeef5, 0xcdad, 0xc2c1, 0xeef6, 0xeef7, /*0xd8-0xdf*/
+  0xeef8, 0xd5a1, 0xeef9, 0xcfb3, 0xeefa, 0xeefb, 0xe89d, 0xeefc, /*0xe0-0xe7*/
+  0xeefd, 0xefa1, 0xeefe, 0xefa2, 0xb8f5, 0xc3fa, 0xefa3, 0xefa4, /*0xe8-0xef*/
+  0xbdc2, 0xd2bf, 0xb2f9, 0xefa5, 0xefa6, 0xefa7, 0xd2f8, 0xefa8, /*0xf0-0xf7*/
+  0xd6fd, 0xefa9, 0xc6cc, 0xe89e, 0xefaa, 0xefab, 0xc1b4, 0xefac, /*0xf8-0xff*/
+  /* 0x9500 */
+  0xcffa, 0xcbf8, 0xefae, 0xefad, 0xb3fa, 0xb9f8, 0xefaf, 0xefb0, /*0x00-0x07*/
+  0xd0e2, 0xefb1, 0xefb2, 0xb7e6, 0xd0bf, 0xefb3, 0xefb4, 0xefb5, /*0x08-0x0f*/
+  0xc8f1, 0xcce0, 0xefb6, 0xefb7, 0xefb8, 0xefb9, 0xefba, 0xd5e0, /*0x10-0x17*/
+  0xefbb, 0xb4ed, 0xc3aa, 0xefbc, 0xe89f, 0xefbd, 0xefbe, 0xefbf, /*0x18-0x1f*/
+  0xe8a0, 0xcefd, 0xefc0, 0xc2e0, 0xb4b8, 0xd7b6, 0xbdf5, 0xe940, /*0x20-0x27*/
+  0xcfc7, 0xefc3, 0xefc1, 0xefc2, 0xefc4, 0xb6a7, 0xbcfc, 0xbee2, /*0x28-0x2f*/
+  0xc3cc, 0xefc5, 0xefc6, 0xe941, 0xefc7, 0xefcf, 0xefc8, 0xefc9, /*0x30-0x37*/
+  0xefca, 0xc7c2, 0xeff1, 0xb6cd, 0xefcb, 0xe942, 0xefcc, 0xefcd, /*0x38-0x3f*/
+  0xb6c6, 0xc3be, 0xefce, 0xe943, 0xefd0, 0xefd1, 0xefd2, 0xd5f2, /*0x40-0x47*/
+  0xe944, 0xefd3, 0xc4f7, 0xe945, 0xefd4, 0xc4f8, 0xefd5, 0xefd6, /*0x48-0x4f*/
+  0xb8e4, 0xb0f7, 0xefd7, 0xefd8, 0xefd9, 0xe946, 0xefda, 0xefdb, /*0x50-0x57*/
+  0xefdc, 0xefdd, 0xe947, 0xefde, 0xbeb5, 0xefe1, 0xefdf, 0xefe0, /*0x58-0x5f*/
+  0xe948, 0xefe2, 0xefe3, 0xc1cd, 0xefe4, 0xefe5, 0xefe6, 0xefe7, /*0x60-0x67*/
+  0xefe8, 0xefe9, 0xefea, 0xefeb, 0xefec, 0xc0d8, 0xe949, 0xefed, /*0x68-0x6f*/
+  0xc1ad, 0xefee, 0xefef, 0xeff0, 0xe94a, 0xe94b, 0xcfe2, 0xe94c, /*0x70-0x77*/
+  0xe94d, 0xe94e, 0xe94f, 0xe950, 0xe951, 0xe952, 0xe953, 0xb3a4, /*0x78-0x7f*/
+  0xe954, 0xe955, 0xe956, 0xe957, 0xe958, 0xe959, 0xe95a, 0xe95b, /*0x80-0x87*/
+  0xe95c, 0xe95d, 0xe95e, 0xe95f, 0xe960, 0xe961, 0xe962, 0xe963, /*0x88-0x8f*/
+  0xe964, 0xe965, 0xe966, 0xe967, 0xe968, 0xe969, 0xe96a, 0xe96b, /*0x90-0x97*/
+  0xe96c, 0xe96d, 0xe96e, 0xe96f, 0xe970, 0xe971, 0xe972, 0xe973, /*0x98-0x9f*/
+  0xe974, 0xe975, 0xe976, 0xe977, 0xe978, 0xe979, 0xe97a, 0xe97b, /*0xa0-0xa7*/
+  0xe97c, 0xe97d, 0xe97e, 0xe980, 0xe981, 0xe982, 0xe983, 0xe984, /*0xa8-0xaf*/
+  0xe985, 0xe986, 0xe987, 0xe988, 0xe989, 0xe98a, 0xe98b, 0xe98c, /*0xb0-0xb7*/
+  0xe98d, 0xe98e, 0xe98f, 0xe990, 0xe991, 0xe992, 0xe993, 0xe994, /*0xb8-0xbf*/
+  0xe995, 0xe996, 0xe997, 0xe998, 0xe999, 0xe99a, 0xe99b, 0xe99c, /*0xc0-0xc7*/
+  0xe99d, 0xe99e, 0xe99f, 0xe9a0, 0xea40, 0xea41, 0xea42, 0xea43, /*0xc8-0xcf*/
+  0xea44, 0xea45, 0xea46, 0xea47, 0xea48, 0xea49, 0xea4a, 0xea4b, /*0xd0-0xd7*/
+  0xea4c, 0xea4d, 0xea4e, 0xea4f, 0xea50, 0xea51, 0xea52, 0xea53, /*0xd8-0xdf*/
+  0xea54, 0xea55, 0xea56, 0xea57, 0xea58, 0xea59, 0xea5a, 0xea5b, /*0xe0-0xe7*/
+  0xc3c5, 0xe3c5, 0xc9c1, 0xe3c6, 0xea5c, 0xb1d5, 0xceca, 0xb4b3, /*0xe8-0xef*/
+  0xc8f2, 0xe3c7, 0xcfd0, 0xe3c8, 0xbce4, 0xe3c9, 0xe3ca, 0xc3c6, /*0xf0-0xf7*/
+  0xd5a2, 0xc4d6, 0xb9eb, 0xcec5, 0xe3cb, 0xc3f6, 0xe3cc, 0xea5d, /*0xf8-0xff*/
+  /* 0x9600 */
+  0xb7a7, 0xb8f3, 0xbad2, 0xe3cd, 0xe3ce, 0xd4c4, 0xe3cf, 0xea5e, /*0x00-0x07*/
+  0xe3d0, 0xd1cb, 0xe3d1, 0xe3d2, 0xe3d3, 0xe3d4, 0xd1d6, 0xe3d5, /*0x08-0x0f*/
+  0xb2fb, 0xc0bb, 0xe3d6, 0xea5f, 0xc0ab, 0xe3d7, 0xe3d8, 0xe3d9, /*0x10-0x17*/
+  0xea60, 0xe3da, 0xe3db, 0xea61, 0xb8b7, 0xdae2, 0xea62, 0xb6d3, /*0x18-0x1f*/
+  0xea63, 0xdae4, 0xdae3, 0xea64, 0xea65, 0xea66, 0xea67, 0xea68, /*0x20-0x27*/
+  0xea69, 0xea6a, 0xdae6, 0xea6b, 0xea6c, 0xea6d, 0xc8ee, 0xea6e, /*0x28-0x2f*/
+  0xea6f, 0xdae5, 0xb7c0, 0xd1f4, 0xd2f5, 0xd5f3, 0xbdd7, 0xea70, /*0x30-0x37*/
+  0xea71, 0xea72, 0xea73, 0xd7e8, 0xdae8, 0xdae7, 0xea74, 0xb0a2, /*0x38-0x3f*/
+  0xcdd3, 0xea75, 0xdae9, 0xea76, 0xb8bd, 0xbcca, 0xc2bd, 0xc2a4, /*0x40-0x47*/
+  0xb3c2, 0xdaea, 0xea77, 0xc2aa, 0xc4b0, 0xbdb5, 0xea78, 0xea79, /*0x48-0x4f*/
+  0xcfde, 0xea7a, 0xea7b, 0xea7c, 0xdaeb, 0xc9c2, 0xea7d, 0xea7e, /*0x50-0x57*/
+  0xea80, 0xea81, 0xea82, 0xb1dd, 0xea83, 0xea84, 0xea85, 0xdaec, /*0x58-0x5f*/
+  0xea86, 0xb6b8, 0xd4ba, 0xea87, 0xb3fd, 0xea88, 0xea89, 0xdaed, /*0x60-0x67*/
+  0xd4c9, 0xcfd5, 0xc5e3, 0xea8a, 0xdaee, 0xea8b, 0xea8c, 0xea8d, /*0x68-0x6f*/
+  0xea8e, 0xea8f, 0xdaef, 0xea90, 0xdaf0, 0xc1ea, 0xccd5, 0xcfdd, /*0x70-0x77*/
+  0xea91, 0xea92, 0xea93, 0xea94, 0xea95, 0xea96, 0xea97, 0xea98, /*0x78-0x7f*/
+  0xea99, 0xea9a, 0xea9b, 0xea9c, 0xea9d, 0xd3e7, 0xc2a1, 0xea9e, /*0x80-0x87*/
+  0xdaf1, 0xea9f, 0xeaa0, 0xcbe5, 0xeb40, 0xdaf2, 0xeb41, 0xcbe6, /*0x88-0x8f*/
+  0xd2fe, 0xeb42, 0xeb43, 0xeb44, 0xb8f4, 0xeb45, 0xeb46, 0xdaf3, /*0x90-0x97*/
+  0xb0af, 0xcfb6, 0xeb47, 0xeb48, 0xd5cf, 0xeb49, 0xeb4a, 0xeb4b, /*0x98-0x9f*/
+  0xeb4c, 0xeb4d, 0xeb4e, 0xeb4f, 0xeb50, 0xeb51, 0xeb52, 0xcbed, /*0xa0-0xa7*/
+  0xeb53, 0xeb54, 0xeb55, 0xeb56, 0xeb57, 0xeb58, 0xeb59, 0xeb5a, /*0xa8-0xaf*/
+  0xdaf4, 0xeb5b, 0xeb5c, 0xe3c4, 0xeb5d, 0xeb5e, 0xc1a5, 0xeb5f, /*0xb0-0xb7*/
+  0xeb60, 0xf6bf, 0xeb61, 0xeb62, 0xf6c0, 0xf6c1, 0xc4d1, 0xeb63, /*0xb8-0xbf*/
+  0xc8b8, 0xd1e3, 0xeb64, 0xeb65, 0xd0db, 0xd1c5, 0xbcaf, 0xb9cd, /*0xc0-0xc7*/
+  0xeb66, 0xeff4, 0xeb67, 0xeb68, 0xb4c6, 0xd3ba, 0xf6c2, 0xb3fb, /*0xc8-0xcf*/
+  0xeb69, 0xeb6a, 0xf6c3, 0xeb6b, 0xeb6c, 0xb5f1, 0xeb6d, 0xeb6e, /*0xd0-0xd7*/
+  0xeb6f, 0xeb70, 0xeb71, 0xeb72, 0xeb73, 0xeb74, 0xeb75, 0xeb76, /*0xd8-0xdf*/
+  0xf6c5, 0xeb77, 0xeb78, 0xeb79, 0xeb7a, 0xeb7b, 0xeb7c, 0xeb7d, /*0xe0-0xe7*/
+  0xd3ea, 0xf6a7, 0xd1a9, 0xeb7e, 0xeb80, 0xeb81, 0xeb82, 0xf6a9, /*0xe8-0xef*/
+  0xeb83, 0xeb84, 0xeb85, 0xf6a8, 0xeb86, 0xeb87, 0xc1e3, 0xc0d7, /*0xf0-0xf7*/
+  0xeb88, 0xb1a2, 0xeb89, 0xeb8a, 0xeb8b, 0xeb8c, 0xceed, 0xeb8d, /*0xf8-0xff*/
+  /* 0x9700 */
+  0xd0e8, 0xf6ab, 0xeb8e, 0xeb8f, 0xcff6, 0xeb90, 0xf6aa, 0xd5f0, /*0x00-0x07*/
+  0xf6ac, 0xc3b9, 0xeb91, 0xeb92, 0xeb93, 0xbbf4, 0xf6ae, 0xf6ad, /*0x08-0x0f*/
+  0xeb94, 0xeb95, 0xeb96, 0xc4de, 0xeb97, 0xeb98, 0xc1d8, 0xeb99, /*0x10-0x17*/
+  0xeb9a, 0xeb9b, 0xeb9c, 0xeb9d, 0xcbaa, 0xeb9e, 0xcfbc, 0xeb9f, /*0x18-0x1f*/
+  0xeba0, 0xec40, 0xec41, 0xec42, 0xec43, 0xec44, 0xec45, 0xec46, /*0x20-0x27*/
+  0xec47, 0xec48, 0xf6af, 0xec49, 0xec4a, 0xf6b0, 0xec4b, 0xec4c, /*0x28-0x2f*/
+  0xf6b1, 0xec4d, 0xc2b6, 0xec4e, 0xec4f, 0xec50, 0xec51, 0xec52, /*0x30-0x37*/
+  0xb0d4, 0xc5f9, 0xec53, 0xec54, 0xec55, 0xec56, 0xf6b2, 0xec57, /*0x38-0x3f*/
+  0xec58, 0xec59, 0xec5a, 0xec5b, 0xec5c, 0xec5d, 0xec5e, 0xec5f, /*0x40-0x47*/
+  0xec60, 0xec61, 0xec62, 0xec63, 0xec64, 0xec65, 0xec66, 0xec67, /*0x48-0x4f*/
+  0xec68, 0xec69, 0xc7e0, 0xf6a6, 0xec6a, 0xec6b, 0xbeb8, 0xec6c, /*0x50-0x57*/
+  0xec6d, 0xbeb2, 0xec6e, 0xb5e5, 0xec6f, 0xec70, 0xb7c7, 0xec71, /*0x58-0x5f*/
+  0xbfbf, 0xc3d2, 0xc3e6, 0xec72, 0xec73, 0xd8cc, 0xec74, 0xec75, /*0x60-0x67*/
+  0xec76, 0xb8ef, 0xec77, 0xec78, 0xec79, 0xec7a, 0xec7b, 0xec7c, /*0x68-0x6f*/
+  0xec7d, 0xec7e, 0xec80, 0xbdf9, 0xd1a5, 0xec81, 0xb0d0, 0xec82, /*0x70-0x77*/
+  0xec83, 0xec84, 0xec85, 0xec86, 0xf7b0, 0xec87, 0xec88, 0xec89, /*0x78-0x7f*/
+  0xec8a, 0xec8b, 0xec8c, 0xec8d, 0xec8e, 0xf7b1, 0xec8f, 0xec90, /*0x80-0x87*/
+  0xec91, 0xec92, 0xec93, 0xd0ac, 0xec94, 0xb0b0, 0xec95, 0xec96, /*0x88-0x8f*/
+  0xec97, 0xf7b2, 0xf7b3, 0xec98, 0xf7b4, 0xec99, 0xec9a, 0xec9b, /*0x90-0x97*/
+  0xc7ca, 0xec9c, 0xec9d, 0xec9e, 0xec9f, 0xeca0, 0xed40, 0xed41, /*0x98-0x9f*/
+  0xbecf, 0xed42, 0xed43, 0xf7b7, 0xed44, 0xed45, 0xed46, 0xed47, /*0xa0-0xa7*/
+  0xed48, 0xed49, 0xed4a, 0xf7b6, 0xed4b, 0xb1de, 0xed4c, 0xf7b5, /*0xa8-0xaf*/
+  0xed4d, 0xed4e, 0xf7b8, 0xed4f, 0xf7b9, 0xed50, 0xed51, 0xed52, /*0xb0-0xb7*/
+  0xed53, 0xed54, 0xed55, 0xed56, 0xed57, 0xed58, 0xed59, 0xed5a, /*0xb8-0xbf*/
+  0xed5b, 0xed5c, 0xed5d, 0xed5e, 0xed5f, 0xed60, 0xed61, 0xed62, /*0xc0-0xc7*/
+  0xed63, 0xed64, 0xed65, 0xed66, 0xed67, 0xed68, 0xed69, 0xed6a, /*0xc8-0xcf*/
+  0xed6b, 0xed6c, 0xed6d, 0xed6e, 0xed6f, 0xed70, 0xed71, 0xed72, /*0xd0-0xd7*/
+  0xed73, 0xed74, 0xed75, 0xed76, 0xed77, 0xed78, 0xed79, 0xed7a, /*0xd8-0xdf*/
+  0xed7b, 0xed7c, 0xed7d, 0xed7e, 0xed80, 0xed81, 0xcea4, 0xc8cd, /*0xe0-0xe7*/
+  0xed82, 0xbaab, 0xe8b8, 0xe8b9, 0xe8ba, 0xbec2, 0xed83, 0xed84, /*0xe8-0xef*/
+  0xed85, 0xed86, 0xed87, 0xd2f4, 0xed88, 0xd4cf, 0xc9d8, 0xed89, /*0xf0-0xf7*/
+  0xed8a, 0xed8b, 0xed8c, 0xed8d, 0xed8e, 0xed8f, 0xed90, 0xed91, /*0xf8-0xff*/
+  /* 0x9800 */
+  0xed92, 0xed93, 0xed94, 0xed95, 0xed96, 0xed97, 0xed98, 0xed99, /*0x00-0x07*/
+  0xed9a, 0xed9b, 0xed9c, 0xed9d, 0xed9e, 0xed9f, 0xeda0, 0xee40, /*0x08-0x0f*/
+  0xee41, 0xee42, 0xee43, 0xee44, 0xee45, 0xee46, 0xee47, 0xee48, /*0x10-0x17*/
+  0xee49, 0xee4a, 0xee4b, 0xee4c, 0xee4d, 0xee4e, 0xee4f, 0xee50, /*0x18-0x1f*/
+  0xee51, 0xee52, 0xee53, 0xee54, 0xee55, 0xee56, 0xee57, 0xee58, /*0x20-0x27*/
+  0xee59, 0xee5a, 0xee5b, 0xee5c, 0xee5d, 0xee5e, 0xee5f, 0xee60, /*0x28-0x2f*/
+  0xee61, 0xee62, 0xee63, 0xee64, 0xee65, 0xee66, 0xee67, 0xee68, /*0x30-0x37*/
+  0xee69, 0xee6a, 0xee6b, 0xee6c, 0xee6d, 0xee6e, 0xee6f, 0xee70, /*0x38-0x3f*/
+  0xee71, 0xee72, 0xee73, 0xee74, 0xee75, 0xee76, 0xee77, 0xee78, /*0x40-0x47*/
+  0xee79, 0xee7a, 0xee7b, 0xee7c, 0xee7d, 0xee7e, 0xee80, 0xee81, /*0x48-0x4f*/
+  0xee82, 0xee83, 0xee84, 0xee85, 0xee86, 0xee87, 0xee88, 0xee89, /*0x50-0x57*/
+  0xee8a, 0xee8b, 0xee8c, 0xee8d, 0xee8e, 0xee8f, 0xee90, 0xee91, /*0x58-0x5f*/
+  0xee92, 0xee93, 0xee94, 0xee95, 0xee96, 0xee97, 0xee98, 0xee99, /*0x60-0x67*/
+  0xee9a, 0xee9b, 0xee9c, 0xee9d, 0xee9e, 0xee9f, 0xeea0, 0xef40, /*0x68-0x6f*/
+  0xef41, 0xef42, 0xef43, 0xef44, 0xef45, 0xd2b3, 0xb6a5, 0xc7ea, /*0x70-0x77*/
+  0xf1fc, 0xcfee, 0xcbb3, 0xd0eb, 0xe7ef, 0xcde7, 0xb9cb, 0xb6d9, /*0x78-0x7f*/
+  0xf1fd, 0xb0e4, 0xcbcc, 0xf1fe, 0xd4a4, 0xc2ad, 0xc1ec, 0xc6c4, /*0x80-0x87*/
+  0xbeb1, 0xf2a1, 0xbcd5, 0xef46, 0xf2a2, 0xf2a3, 0xef47, 0xf2a4, /*0x88-0x8f*/
+  0xd2c3, 0xc6b5, 0xef48, 0xcdc7, 0xf2a5, 0xef49, 0xd3b1, 0xbfc5, /*0x90-0x97*/
+  0xcce2, 0xef4a, 0xf2a6, 0xf2a7, 0xd1d5, 0xb6ee, 0xf2a8, 0xf2a9, /*0x98-0x9f*/
+  0xb5df, 0xf2aa, 0xf2ab, 0xef4b, 0xb2fc, 0xf2ac, 0xf2ad, 0xc8a7, /*0xa0-0xa7*/
+  0xef4c, 0xef4d, 0xef4e, 0xef4f, 0xef50, 0xef51, 0xef52, 0xef53, /*0xa8-0xaf*/
+  0xef54, 0xef55, 0xef56, 0xef57, 0xef58, 0xef59, 0xef5a, 0xef5b, /*0xb0-0xb7*/
+  0xef5c, 0xef5d, 0xef5e, 0xef5f, 0xef60, 0xef61, 0xef62, 0xef63, /*0xb8-0xbf*/
+  0xef64, 0xef65, 0xef66, 0xef67, 0xef68, 0xef69, 0xef6a, 0xef6b, /*0xc0-0xc7*/
+  0xef6c, 0xef6d, 0xef6e, 0xef6f, 0xef70, 0xef71, 0xb7e7, 0xef72, /*0xc8-0xcf*/
+  0xef73, 0xeca9, 0xecaa, 0xecab, 0xef74, 0xecac, 0xef75, 0xef76, /*0xd0-0xd7*/
+  0xc6ae, 0xecad, 0xecae, 0xef77, 0xef78, 0xef79, 0xb7c9, 0xcab3, /*0xd8-0xdf*/
+  0xef7a, 0xef7b, 0xef7c, 0xef7d, 0xef7e, 0xef80, 0xef81, 0xe2b8, /*0xe0-0xe7*/
+  0xf7cf, 0xef82, 0xef83, 0xef84, 0xef85, 0xef86, 0xef87, 0xef88, /*0xe8-0xef*/
+  0xef89, 0xef8a, 0xef8b, 0xef8c, 0xef8d, 0xef8e, 0xef8f, 0xef90, /*0xf0-0xf7*/
+  0xef91, 0xef92, 0xef93, 0xef94, 0xef95, 0xef96, 0xef97, 0xef98, /*0xf8-0xff*/
+  /* 0x9900 */
+  0xef99, 0xef9a, 0xef9b, 0xef9c, 0xef9d, 0xef9e, 0xef9f, 0xefa0, /*0x00-0x07*/
+  0xf040, 0xf041, 0xf042, 0xf043, 0xf044, 0xf7d0, 0xf045, 0xf046, /*0x08-0x0f*/
+  0xb2cd, 0xf047, 0xf048, 0xf049, 0xf04a, 0xf04b, 0xf04c, 0xf04d, /*0x10-0x17*/
+  0xf04e, 0xf04f, 0xf050, 0xf051, 0xf052, 0xf053, 0xf054, 0xf055, /*0x18-0x1f*/
+  0xf056, 0xf057, 0xf058, 0xf059, 0xf05a, 0xf05b, 0xf05c, 0xf05d, /*0x20-0x27*/
+  0xf05e, 0xf05f, 0xf060, 0xf061, 0xf062, 0xf063, 0xf7d1, 0xf064, /*0x28-0x2f*/
+  0xf065, 0xf066, 0xf067, 0xf068, 0xf069, 0xf06a, 0xf06b, 0xf06c, /*0x30-0x37*/
+  0xf06d, 0xf06e, 0xf06f, 0xf070, 0xf071, 0xf072, 0xf073, 0xf074, /*0x38-0x3f*/
+  0xf075, 0xf076, 0xf077, 0xf078, 0xf079, 0xf07a, 0xf07b, 0xf07c, /*0x40-0x47*/
+  0xf07d, 0xf07e, 0xf080, 0xf081, 0xf082, 0xf083, 0xf084, 0xf085, /*0x48-0x4f*/
+  0xf086, 0xf087, 0xf088, 0xf089, 0xf7d3, 0xf7d2, 0xf08a, 0xf08b, /*0x50-0x57*/
+  0xf08c, 0xf08d, 0xf08e, 0xf08f, 0xf090, 0xf091, 0xf092, 0xf093, /*0x58-0x5f*/
+  0xf094, 0xf095, 0xf096, 0xe2bb, 0xf097, 0xbca2, 0xf098, 0xe2bc, /*0x60-0x67*/
+  0xe2bd, 0xe2be, 0xe2bf, 0xe2c0, 0xe2c1, 0xb7b9, 0xd2fb, 0xbda4, /*0x68-0x6f*/
+  0xcace, 0xb1a5, 0xcbc7, 0xf099, 0xe2c2, 0xb6fc, 0xc8c4, 0xe2c3, /*0x70-0x77*/
+  0xf09a, 0xf09b, 0xbdc8, 0xf09c, 0xb1fd, 0xe2c4, 0xf09d, 0xb6f6, /*0x78-0x7f*/
+  0xe2c5, 0xc4d9, 0xf09e, 0xf09f, 0xe2c6, 0xcfda, 0xb9dd, 0xe2c7, /*0x80-0x87*/
+  0xc0a1, 0xf0a0, 0xe2c8, 0xb2f6, 0xf140, 0xe2c9, 0xf141, 0xc1f3, /*0x88-0x8f*/
+  0xe2ca, 0xe2cb, 0xc2f8, 0xe2cc, 0xe2cd, 0xe2ce, 0xcad7, 0xd8b8, /*0x90-0x97*/
+  0xd9e5, 0xcfe3, 0xf142, 0xf143, 0xf144, 0xf145, 0xf146, 0xf147, /*0x98-0x9f*/
+  0xf148, 0xf149, 0xf14a, 0xf14b, 0xf14c, 0xf0a5, 0xf14d, 0xf14e, /*0xa0-0xa7*/
+  0xdcb0, 0xf14f, 0xf150, 0xf151, 0xf152, 0xf153, 0xf154, 0xf155, /*0xa8-0xaf*/
+  0xf156, 0xf157, 0xf158, 0xf159, 0xf15a, 0xf15b, 0xf15c, 0xf15d, /*0xb0-0xb7*/
+  0xf15e, 0xf15f, 0xf160, 0xf161, 0xf162, 0xf163, 0xf164, 0xf165, /*0xb8-0xbf*/
+  0xf166, 0xf167, 0xf168, 0xf169, 0xf16a, 0xf16b, 0xf16c, 0xf16d, /*0xc0-0xc7*/
+  0xf16e, 0xf16f, 0xf170, 0xf171, 0xf172, 0xf173, 0xf174, 0xf175, /*0xc8-0xcf*/
+  0xf176, 0xf177, 0xf178, 0xf179, 0xf17a, 0xf17b, 0xf17c, 0xf17d, /*0xd0-0xd7*/
+  0xf17e, 0xf180, 0xf181, 0xf182, 0xf183, 0xf184, 0xf185, 0xf186, /*0xd8-0xdf*/
+  0xf187, 0xf188, 0xf189, 0xf18a, 0xf18b, 0xf18c, 0xf18d, 0xf18e, /*0xe0-0xe7*/
+  0xf18f, 0xf190, 0xf191, 0xf192, 0xf193, 0xf194, 0xf195, 0xf196, /*0xe8-0xef*/
+  0xf197, 0xf198, 0xf199, 0xf19a, 0xf19b, 0xf19c, 0xf19d, 0xf19e, /*0xf0-0xf7*/
+  0xf19f, 0xf1a0, 0xf240, 0xf241, 0xf242, 0xf243, 0xf244, 0xf245, /*0xf8-0xff*/
+  /* 0x9a00 */
+  0xf246, 0xf247, 0xf248, 0xf249, 0xf24a, 0xf24b, 0xf24c, 0xf24d, /*0x00-0x07*/
+  0xf24e, 0xf24f, 0xf250, 0xf251, 0xf252, 0xf253, 0xf254, 0xf255, /*0x08-0x0f*/
+  0xf256, 0xf257, 0xf258, 0xf259, 0xf25a, 0xf25b, 0xf25c, 0xf25d, /*0x10-0x17*/
+  0xf25e, 0xf25f, 0xf260, 0xf261, 0xf262, 0xf263, 0xf264, 0xf265, /*0x18-0x1f*/
+  0xf266, 0xf267, 0xf268, 0xf269, 0xf26a, 0xf26b, 0xf26c, 0xf26d, /*0x20-0x27*/
+  0xf26e, 0xf26f, 0xf270, 0xf271, 0xf272, 0xf273, 0xf274, 0xf275, /*0x28-0x2f*/
+  0xf276, 0xf277, 0xf278, 0xf279, 0xf27a, 0xf27b, 0xf27c, 0xf27d, /*0x30-0x37*/
+  0xf27e, 0xf280, 0xf281, 0xf282, 0xf283, 0xf284, 0xf285, 0xf286, /*0x38-0x3f*/
+  0xf287, 0xf288, 0xf289, 0xf28a, 0xf28b, 0xf28c, 0xf28d, 0xf28e, /*0x40-0x47*/
+  0xf28f, 0xf290, 0xf291, 0xf292, 0xf293, 0xf294, 0xf295, 0xf296, /*0x48-0x4f*/
+  0xf297, 0xf298, 0xf299, 0xf29a, 0xf29b, 0xf29c, 0xf29d, 0xf29e, /*0x50-0x57*/
+  0xf29f, 0xf2a0, 0xf340, 0xf341, 0xf342, 0xf343, 0xf344, 0xf345, /*0x58-0x5f*/
+  0xf346, 0xf347, 0xf348, 0xf349, 0xf34a, 0xf34b, 0xf34c, 0xf34d, /*0x60-0x67*/
+  0xf34e, 0xf34f, 0xf350, 0xf351, 0xc2ed, 0xd4a6, 0xcdd4, 0xd1b1, /*0x68-0x6f*/
+  0xb3db, 0xc7fd, 0xf352, 0xb2b5, 0xc2bf, 0xe6e0, 0xcabb, 0xe6e1, /*0x70-0x77*/
+  0xe6e2, 0xbed4, 0xe6e3, 0xd7a4, 0xcdd5, 0xe6e5, 0xbcdd, 0xe6e4, /*0x78-0x7f*/
+  0xe6e6, 0xe6e7, 0xc2ee, 0xf353, 0xbdbe, 0xe6e8, 0xc2e6, 0xbaa7, /*0x80-0x87*/
+  0xe6e9, 0xf354, 0xe6ea, 0xb3d2, 0xd1e9, 0xf355, 0xf356, 0xbfa5, /*0x88-0x8f*/
+  0xe6eb, 0xc6ef, 0xe6ec, 0xe6ed, 0xf357, 0xf358, 0xe6ee, 0xc6ad, /*0x90-0x97*/
+  0xe6ef, 0xf359, 0xc9a7, 0xe6f0, 0xe6f1, 0xe6f2, 0xe5b9, 0xe6f3, /*0x98-0x9f*/
+  0xe6f4, 0xc2e2, 0xe6f5, 0xe6f6, 0xd6e8, 0xe6f7, 0xf35a, 0xe6f8, /*0xa0-0xa7*/
+  0xb9c7, 0xf35b, 0xf35c, 0xf35d, 0xf35e, 0xf35f, 0xf360, 0xf361, /*0xa8-0xaf*/
+  0xf7bb, 0xf7ba, 0xf362, 0xf363, 0xf364, 0xf365, 0xf7be, 0xf7bc, /*0xb0-0xb7*/
+  0xbaa1, 0xf366, 0xf7bf, 0xf367, 0xf7c0, 0xf368, 0xf369, 0xf36a, /*0xb8-0xbf*/
+  0xf7c2, 0xf7c1, 0xf7c4, 0xf36b, 0xf36c, 0xf7c3, 0xf36d, 0xf36e, /*0xc0-0xc7*/
+  0xf36f, 0xf370, 0xf371, 0xf7c5, 0xf7c6, 0xf372, 0xf373, 0xf374, /*0xc8-0xcf*/
+  0xf375, 0xf7c7, 0xf376, 0xcbe8, 0xf377, 0xf378, 0xf379, 0xf37a, /*0xd0-0xd7*/
+  0xb8df, 0xf37b, 0xf37c, 0xf37d, 0xf37e, 0xf380, 0xf381, 0xf7d4, /*0xd8-0xdf*/
+  0xf382, 0xf7d5, 0xf383, 0xf384, 0xf385, 0xf386, 0xf7d6, 0xf387, /*0xe0-0xe7*/
+  0xf388, 0xf389, 0xf38a, 0xf7d8, 0xf38b, 0xf7da, 0xf38c, 0xf7d7, /*0xe8-0xef*/
+  0xf38d, 0xf38e, 0xf38f, 0xf390, 0xf391, 0xf392, 0xf393, 0xf394, /*0xf0-0xf7*/
+  0xf395, 0xf7db, 0xf396, 0xf7d9, 0xf397, 0xf398, 0xf399, 0xf39a, /*0xf8-0xff*/
+  /* 0x9b00 */
+  0xf39b, 0xf39c, 0xf39d, 0xd7d7, 0xf39e, 0xf39f, 0xf3a0, 0xf440, /*0x00-0x07*/
+  0xf7dc, 0xf441, 0xf442, 0xf443, 0xf444, 0xf445, 0xf446, 0xf7dd, /*0x08-0x0f*/
+  0xf447, 0xf448, 0xf449, 0xf7de, 0xf44a, 0xf44b, 0xf44c, 0xf44d, /*0x10-0x17*/
+  0xf44e, 0xf44f, 0xf450, 0xf451, 0xf452, 0xf453, 0xf454, 0xf7df, /*0x18-0x1f*/
+  0xf455, 0xf456, 0xf457, 0xf7e0, 0xf458, 0xf459, 0xf45a, 0xf45b, /*0x20-0x27*/
+  0xf45c, 0xf45d, 0xf45e, 0xf45f, 0xf460, 0xf461, 0xf462, 0xdbcb, /*0x28-0x2f*/
+  0xf463, 0xf464, 0xd8aa, 0xf465, 0xf466, 0xf467, 0xf468, 0xf469, /*0x30-0x37*/
+  0xf46a, 0xf46b, 0xf46c, 0xe5f7, 0xb9ed, 0xf46d, 0xf46e, 0xf46f, /*0x38-0x3f*/
+  0xf470, 0xbffd, 0xbbea, 0xf7c9, 0xc6c7, 0xf7c8, 0xf471, 0xf7ca, /*0x40-0x47*/
+  0xf7cc, 0xf7cb, 0xf472, 0xf473, 0xf474, 0xf7cd, 0xf475, 0xceba, /*0x48-0x4f*/
+  0xf476, 0xf7ce, 0xf477, 0xf478, 0xc4a7, 0xf479, 0xf47a, 0xf47b, /*0x50-0x57*/
+  0xf47c, 0xf47d, 0xf47e, 0xf480, 0xf481, 0xf482, 0xf483, 0xf484, /*0x58-0x5f*/
+  0xf485, 0xf486, 0xf487, 0xf488, 0xf489, 0xf48a, 0xf48b, 0xf48c, /*0x60-0x67*/
+  0xf48d, 0xf48e, 0xf48f, 0xf490, 0xf491, 0xf492, 0xf493, 0xf494, /*0x68-0x6f*/
+  0xf495, 0xf496, 0xf497, 0xf498, 0xf499, 0xf49a, 0xf49b, 0xf49c, /*0x70-0x77*/
+  0xf49d, 0xf49e, 0xf49f, 0xf4a0, 0xf540, 0xf541, 0xf542, 0xf543, /*0x78-0x7f*/
+  0xf544, 0xf545, 0xf546, 0xf547, 0xf548, 0xf549, 0xf54a, 0xf54b, /*0x80-0x87*/
+  0xf54c, 0xf54d, 0xf54e, 0xf54f, 0xf550, 0xf551, 0xf552, 0xf553, /*0x88-0x8f*/
+  0xf554, 0xf555, 0xf556, 0xf557, 0xf558, 0xf559, 0xf55a, 0xf55b, /*0x90-0x97*/
+  0xf55c, 0xf55d, 0xf55e, 0xf55f, 0xf560, 0xf561, 0xf562, 0xf563, /*0x98-0x9f*/
+  0xf564, 0xf565, 0xf566, 0xf567, 0xf568, 0xf569, 0xf56a, 0xf56b, /*0xa0-0xa7*/
+  0xf56c, 0xf56d, 0xf56e, 0xf56f, 0xf570, 0xf571, 0xf572, 0xf573, /*0xa8-0xaf*/
+  0xf574, 0xf575, 0xf576, 0xf577, 0xf578, 0xf579, 0xf57a, 0xf57b, /*0xb0-0xb7*/
+  0xf57c, 0xf57d, 0xf57e, 0xf580, 0xf581, 0xf582, 0xf583, 0xf584, /*0xb8-0xbf*/
+  0xf585, 0xf586, 0xf587, 0xf588, 0xf589, 0xf58a, 0xf58b, 0xf58c, /*0xc0-0xc7*/
+  0xf58d, 0xf58e, 0xf58f, 0xf590, 0xf591, 0xf592, 0xf593, 0xf594, /*0xc8-0xcf*/
+  0xf595, 0xf596, 0xf597, 0xf598, 0xf599, 0xf59a, 0xf59b, 0xf59c, /*0xd0-0xd7*/
+  0xf59d, 0xf59e, 0xf59f, 0xf5a0, 0xf640, 0xf641, 0xf642, 0xf643, /*0xd8-0xdf*/
+  0xf644, 0xf645, 0xf646, 0xf647, 0xf648, 0xf649, 0xf64a, 0xf64b, /*0xe0-0xe7*/
+  0xf64c, 0xf64d, 0xf64e, 0xf64f, 0xf650, 0xf651, 0xf652, 0xf653, /*0xe8-0xef*/
+  0xf654, 0xf655, 0xf656, 0xf657, 0xf658, 0xf659, 0xf65a, 0xf65b, /*0xf0-0xf7*/
+  0xf65c, 0xf65d, 0xf65e, 0xf65f, 0xf660, 0xf661, 0xf662, 0xf663, /*0xf8-0xff*/
+  /* 0x9c00 */
+  0xf664, 0xf665, 0xf666, 0xf667, 0xf668, 0xf669, 0xf66a, 0xf66b, /*0x00-0x07*/
+  0xf66c, 0xf66d, 0xf66e, 0xf66f, 0xf670, 0xf671, 0xf672, 0xf673, /*0x08-0x0f*/
+  0xf674, 0xf675, 0xf676, 0xf677, 0xf678, 0xf679, 0xf67a, 0xf67b, /*0x10-0x17*/
+  0xf67c, 0xf67d, 0xf67e, 0xf680, 0xf681, 0xf682, 0xf683, 0xf684, /*0x18-0x1f*/
+  0xf685, 0xf686, 0xf687, 0xf688, 0xf689, 0xf68a, 0xf68b, 0xf68c, /*0x20-0x27*/
+  0xf68d, 0xf68e, 0xf68f, 0xf690, 0xf691, 0xf692, 0xf693, 0xf694, /*0x28-0x2f*/
+  0xf695, 0xf696, 0xf697, 0xf698, 0xf699, 0xf69a, 0xf69b, 0xf69c, /*0x30-0x37*/
+  0xf69d, 0xf69e, 0xf69f, 0xf6a0, 0xf740, 0xf741, 0xf742, 0xf743, /*0x38-0x3f*/
+  0xf744, 0xf745, 0xf746, 0xf747, 0xf748, 0xf749, 0xf74a, 0xf74b, /*0x40-0x47*/
+  0xf74c, 0xf74d, 0xf74e, 0xf74f, 0xf750, 0xf751, 0xf752, 0xf753, /*0x48-0x4f*/
+  0xf754, 0xf755, 0xf756, 0xf757, 0xf758, 0xf759, 0xf75a, 0xf75b, /*0x50-0x57*/
+  0xf75c, 0xf75d, 0xf75e, 0xf75f, 0xf760, 0xf761, 0xf762, 0xf763, /*0x58-0x5f*/
+  0xf764, 0xf765, 0xf766, 0xf767, 0xf768, 0xf769, 0xf76a, 0xf76b, /*0x60-0x67*/
+  0xf76c, 0xf76d, 0xf76e, 0xf76f, 0xf770, 0xf771, 0xf772, 0xf773, /*0x68-0x6f*/
+  0xf774, 0xf775, 0xf776, 0xf777, 0xf778, 0xf779, 0xf77a, 0xf77b, /*0x70-0x77*/
+  0xf77c, 0xf77d, 0xf77e, 0xf780, 0xd3e3, 0xf781, 0xf782, 0xf6cf, /*0x78-0x7f*/
+  0xf783, 0xc2b3, 0xf6d0, 0xf784, 0xf785, 0xf6d1, 0xf6d2, 0xf6d3, /*0x80-0x87*/
+  0xf6d4, 0xf786, 0xf787, 0xf6d6, 0xf788, 0xb1ab, 0xf6d7, 0xf789, /*0x88-0x8f*/
+  0xf6d8, 0xf6d9, 0xf6da, 0xf78a, 0xf6db, 0xf6dc, 0xf78b, 0xf78c, /*0x90-0x97*/
+  0xf78d, 0xf78e, 0xf6dd, 0xf6de, 0xcfca, 0xf78f, 0xf6df, 0xf6e0, /*0x98-0x9f*/
+  0xf6e1, 0xf6e2, 0xf6e3, 0xf6e4, 0xc0f0, 0xf6e5, 0xf6e6, 0xf6e7, /*0xa0-0xa7*/
+  0xf6e8, 0xf6e9, 0xf790, 0xf6ea, 0xf791, 0xf6eb, 0xf6ec, 0xf792, /*0xa8-0xaf*/
+  0xf6ed, 0xf6ee, 0xf6ef, 0xf6f0, 0xf6f1, 0xf6f2, 0xf6f3, 0xf6f4, /*0xb0-0xb7*/
+  0xbea8, 0xf793, 0xf6f5, 0xf6f6, 0xf6f7, 0xf6f8, 0xf794, 0xf795, /*0xb8-0xbf*/
+  0xf796, 0xf797, 0xf798, 0xc8fa, 0xf6f9, 0xf6fa, 0xf6fb, 0xf6fc, /*0xc0-0xc7*/
+  0xf799, 0xf79a, 0xf6fd, 0xf6fe, 0xf7a1, 0xf7a2, 0xf7a3, 0xf7a4, /*0xc8-0xcf*/
+  0xf7a5, 0xf79b, 0xf79c, 0xf7a6, 0xf7a7, 0xf7a8, 0xb1ee, 0xf7a9, /*0xd0-0xd7*/
+  0xf7aa, 0xf7ab, 0xf79d, 0xf79e, 0xf7ac, 0xf7ad, 0xc1db, 0xf7ae, /*0xd8-0xdf*/
+  0xf79f, 0xf7a0, 0xf7af, 0xf840, 0xf841, 0xf842, 0xf843, 0xf844, /*0xe0-0xe7*/
+  0xf845, 0xf846, 0xf847, 0xf848, 0xf849, 0xf84a, 0xf84b, 0xf84c, /*0xe8-0xef*/
+  0xf84d, 0xf84e, 0xf84f, 0xf850, 0xf851, 0xf852, 0xf853, 0xf854, /*0xf0-0xf7*/
+  0xf855, 0xf856, 0xf857, 0xf858, 0xf859, 0xf85a, 0xf85b, 0xf85c, /*0xf8-0xff*/
+  /* 0x9d00 */
+  0xf85d, 0xf85e, 0xf85f, 0xf860, 0xf861, 0xf862, 0xf863, 0xf864, /*0x00-0x07*/
+  0xf865, 0xf866, 0xf867, 0xf868, 0xf869, 0xf86a, 0xf86b, 0xf86c, /*0x08-0x0f*/
+  0xf86d, 0xf86e, 0xf86f, 0xf870, 0xf871, 0xf872, 0xf873, 0xf874, /*0x10-0x17*/
+  0xf875, 0xf876, 0xf877, 0xf878, 0xf879, 0xf87a, 0xf87b, 0xf87c, /*0x18-0x1f*/
+  0xf87d, 0xf87e, 0xf880, 0xf881, 0xf882, 0xf883, 0xf884, 0xf885, /*0x20-0x27*/
+  0xf886, 0xf887, 0xf888, 0xf889, 0xf88a, 0xf88b, 0xf88c, 0xf88d, /*0x28-0x2f*/
+  0xf88e, 0xf88f, 0xf890, 0xf891, 0xf892, 0xf893, 0xf894, 0xf895, /*0x30-0x37*/
+  0xf896, 0xf897, 0xf898, 0xf899, 0xf89a, 0xf89b, 0xf89c, 0xf89d, /*0x38-0x3f*/
+  0xf89e, 0xf89f, 0xf8a0, 0xf940, 0xf941, 0xf942, 0xf943, 0xf944, /*0x40-0x47*/
+  0xf945, 0xf946, 0xf947, 0xf948, 0xf949, 0xf94a, 0xf94b, 0xf94c, /*0x48-0x4f*/
+  0xf94d, 0xf94e, 0xf94f, 0xf950, 0xf951, 0xf952, 0xf953, 0xf954, /*0x50-0x57*/
+  0xf955, 0xf956, 0xf957, 0xf958, 0xf959, 0xf95a, 0xf95b, 0xf95c, /*0x58-0x5f*/
+  0xf95d, 0xf95e, 0xf95f, 0xf960, 0xf961, 0xf962, 0xf963, 0xf964, /*0x60-0x67*/
+  0xf965, 0xf966, 0xf967, 0xf968, 0xf969, 0xf96a, 0xf96b, 0xf96c, /*0x68-0x6f*/
+  0xf96d, 0xf96e, 0xf96f, 0xf970, 0xf971, 0xf972, 0xf973, 0xf974, /*0x70-0x77*/
+  0xf975, 0xf976, 0xf977, 0xf978, 0xf979, 0xf97a, 0xf97b, 0xf97c, /*0x78-0x7f*/
+  0xf97d, 0xf97e, 0xf980, 0xf981, 0xf982, 0xf983, 0xf984, 0xf985, /*0x80-0x87*/
+  0xf986, 0xf987, 0xf988, 0xf989, 0xf98a, 0xf98b, 0xf98c, 0xf98d, /*0x88-0x8f*/
+  0xf98e, 0xf98f, 0xf990, 0xf991, 0xf992, 0xf993, 0xf994, 0xf995, /*0x90-0x97*/
+  0xf996, 0xf997, 0xf998, 0xf999, 0xf99a, 0xf99b, 0xf99c, 0xf99d, /*0x98-0x9f*/
+  0xf99e, 0xf99f, 0xf9a0, 0xfa40, 0xfa41, 0xfa42, 0xfa43, 0xfa44, /*0xa0-0xa7*/
+  0xfa45, 0xfa46, 0xfa47, 0xfa48, 0xfa49, 0xfa4a, 0xfa4b, 0xfa4c, /*0xa8-0xaf*/
+  0xfa4d, 0xfa4e, 0xfa4f, 0xfa50, 0xfa51, 0xfa52, 0xfa53, 0xfa54, /*0xb0-0xb7*/
+  0xfa55, 0xfa56, 0xfa57, 0xfa58, 0xfa59, 0xfa5a, 0xfa5b, 0xfa5c, /*0xb8-0xbf*/
+  0xfa5d, 0xfa5e, 0xfa5f, 0xfa60, 0xfa61, 0xfa62, 0xfa63, 0xfa64, /*0xc0-0xc7*/
+  0xfa65, 0xfa66, 0xfa67, 0xfa68, 0xfa69, 0xfa6a, 0xfa6b, 0xfa6c, /*0xc8-0xcf*/
+  0xfa6d, 0xfa6e, 0xfa6f, 0xfa70, 0xfa71, 0xfa72, 0xfa73, 0xfa74, /*0xd0-0xd7*/
+  0xfa75, 0xfa76, 0xfa77, 0xfa78, 0xfa79, 0xfa7a, 0xfa7b, 0xfa7c, /*0xd8-0xdf*/
+  0xfa7d, 0xfa7e, 0xfa80, 0xfa81, 0xfa82, 0xfa83, 0xfa84, 0xfa85, /*0xe0-0xe7*/
+  0xfa86, 0xfa87, 0xfa88, 0xfa89, 0xfa8a, 0xfa8b, 0xfa8c, 0xfa8d, /*0xe8-0xef*/
+  0xfa8e, 0xfa8f, 0xfa90, 0xfa91, 0xfa92, 0xfa93, 0xfa94, 0xfa95, /*0xf0-0xf7*/
+  0xfa96, 0xfa97, 0xfa98, 0xfa99, 0xfa9a, 0xfa9b, 0xfa9c, 0xfa9d, /*0xf8-0xff*/
+  /* 0x9e00 */
+  0xfa9e, 0xfa9f, 0xfaa0, 0xfb40, 0xfb41, 0xfb42, 0xfb43, 0xfb44, /*0x00-0x07*/
+  0xfb45, 0xfb46, 0xfb47, 0xfb48, 0xfb49, 0xfb4a, 0xfb4b, 0xfb4c, /*0x08-0x0f*/
+  0xfb4d, 0xfb4e, 0xfb4f, 0xfb50, 0xfb51, 0xfb52, 0xfb53, 0xfb54, /*0x10-0x17*/
+  0xfb55, 0xfb56, 0xfb57, 0xfb58, 0xfb59, 0xfb5a, 0xfb5b, 0xc4f1, /*0x18-0x1f*/
+  0xf0af, 0xbca6, 0xf0b0, 0xc3f9, 0xfb5c, 0xc5b8, 0xd1bb, 0xfb5d, /*0x20-0x27*/
+  0xf0b1, 0xf0b2, 0xf0b3, 0xf0b4, 0xf0b5, 0xd1bc, 0xfb5e, 0xd1ec, /*0x28-0x2f*/
+  0xfb5f, 0xf0b7, 0xf0b6, 0xd4a7, 0xfb60, 0xcdd2, 0xf0b8, 0xf0ba, /*0x30-0x37*/
+  0xf0b9, 0xf0bb, 0xf0bc, 0xfb61, 0xfb62, 0xb8eb, 0xf0bd, 0xbae8, /*0x38-0x3f*/
+  0xfb63, 0xf0be, 0xf0bf, 0xbee9, 0xf0c0, 0xb6ec, 0xf0c1, 0xf0c2, /*0x40-0x47*/
+  0xf0c3, 0xf0c4, 0xc8b5, 0xf0c5, 0xf0c6, 0xfb64, 0xf0c7, 0xc5f4, /*0x48-0x4f*/
+  0xfb65, 0xf0c8, 0xfb66, 0xfb67, 0xfb68, 0xf0c9, 0xfb69, 0xf0ca, /*0x50-0x57*/
+  0xf7bd, 0xfb6a, 0xf0cb, 0xf0cc, 0xf0cd, 0xfb6b, 0xf0ce, 0xfb6c, /*0x58-0x5f*/
+  0xfb6d, 0xfb6e, 0xfb6f, 0xf0cf, 0xbad7, 0xfb70, 0xf0d0, 0xf0d1, /*0x60-0x67*/
+  0xf0d2, 0xf0d3, 0xf0d4, 0xf0d5, 0xf0d6, 0xf0d8, 0xfb71, 0xfb72, /*0x68-0x6f*/
+  0xd3a5, 0xf0d7, 0xfb73, 0xf0d9, 0xfb74, 0xfb75, 0xfb76, 0xfb77, /*0x70-0x77*/
+  0xfb78, 0xfb79, 0xfb7a, 0xfb7b, 0xfb7c, 0xfb7d, 0xf5ba, 0xc2b9, /*0x78-0x7f*/
+  0xfb7e, 0xfb80, 0xf7e4, 0xfb81, 0xfb82, 0xfb83, 0xfb84, 0xf7e5, /*0x80-0x87*/
+  0xf7e6, 0xfb85, 0xfb86, 0xf7e7, 0xfb87, 0xfb88, 0xfb89, 0xfb8a, /*0x88-0x8f*/
+  0xfb8b, 0xfb8c, 0xf7e8, 0xc2b4, 0xfb8d, 0xfb8e, 0xfb8f, 0xfb90, /*0x90-0x97*/
+  0xfb91, 0xfb92, 0xfb93, 0xfb94, 0xfb95, 0xf7ea, 0xfb96, 0xf7eb, /*0x98-0x9f*/
+  0xfb97, 0xfb98, 0xfb99, 0xfb9a, 0xfb9b, 0xfb9c, 0xc2f3, 0xfb9d, /*0xa0-0xa7*/
+  0xfb9e, 0xfb9f, 0xfba0, 0xfc40, 0xfc41, 0xfc42, 0xfc43, 0xfc44, /*0xa8-0xaf*/
+  0xfc45, 0xfc46, 0xfc47, 0xfc48, 0xf4f0, 0xfc49, 0xfc4a, 0xfc4b, /*0xb0-0xb7*/
+  0xf4ef, 0xfc4c, 0xfc4d, 0xc2e9, 0xfc4e, 0xf7e1, 0xf7e2, 0xfc4f, /*0xb8-0xbf*/
+  0xfc50, 0xfc51, 0xfc52, 0xfc53, 0xbbc6, 0xfc54, 0xfc55, 0xfc56, /*0xc0-0xc7*/
+  0xfc57, 0xd9e4, 0xfc58, 0xfc59, 0xfc5a, 0xcaf2, 0xc0e8, 0xf0a4, /*0xc8-0xcf*/
+  0xfc5b, 0xbada, 0xfc5c, 0xfc5d, 0xc7ad, 0xfc5e, 0xfc5f, 0xfc60, /*0xd0-0xd7*/
+  0xc4ac, 0xfc61, 0xfc62, 0xf7ec, 0xf7ed, 0xf7ee, 0xfc63, 0xf7f0, /*0xd8-0xdf*/
+  0xf7ef, 0xfc64, 0xf7f1, 0xfc65, 0xfc66, 0xf7f4, 0xfc67, 0xf7f3, /*0xe0-0xe7*/
+  0xfc68, 0xf7f2, 0xf7f5, 0xfc69, 0xfc6a, 0xfc6b, 0xfc6c, 0xf7f6, /*0xe8-0xef*/
+  0xfc6d, 0xfc6e, 0xfc6f, 0xfc70, 0xfc71, 0xfc72, 0xfc73, 0xfc74, /*0xf0-0xf7*/
+  0xfc75, 0xede9, 0xfc76, 0xedea, 0xedeb, 0xfc77, 0xf6bc, 0xfc78, /*0xf8-0xff*/
+  /* 0x9f00 */
+  0xfc79, 0xfc7a, 0xfc7b, 0xfc7c, 0xfc7d, 0xfc7e, 0xfc80, 0xfc81, /*0x00-0x07*/
+  0xfc82, 0xfc83, 0xfc84, 0xf6bd, 0xfc85, 0xf6be, 0xb6a6, 0xfc86, /*0x08-0x0f*/
+  0xd8be, 0xfc87, 0xfc88, 0xb9c4, 0xfc89, 0xfc8a, 0xfc8b, 0xd8bb, /*0x10-0x17*/
+  0xfc8c, 0xdcb1, 0xfc8d, 0xfc8e, 0xfc8f, 0xfc90, 0xfc91, 0xfc92, /*0x18-0x1f*/
+  0xcaf3, 0xfc93, 0xf7f7, 0xfc94, 0xfc95, 0xfc96, 0xfc97, 0xfc98, /*0x20-0x27*/
+  0xfc99, 0xfc9a, 0xfc9b, 0xfc9c, 0xf7f8, 0xfc9d, 0xfc9e, 0xf7f9, /*0x28-0x2f*/
+  0xfc9f, 0xfca0, 0xfd40, 0xfd41, 0xfd42, 0xfd43, 0xfd44, 0xf7fb, /*0x30-0x37*/
+  0xfd45, 0xf7fa, 0xfd46, 0xb1c7, 0xfd47, 0xf7fc, 0xf7fd, 0xfd48, /*0x38-0x3f*/
+  0xfd49, 0xfd4a, 0xfd4b, 0xfd4c, 0xf7fe, 0xfd4d, 0xfd4e, 0xfd4f, /*0x40-0x47*/
+  0xfd50, 0xfd51, 0xfd52, 0xfd53, 0xfd54, 0xfd55, 0xfd56, 0xfd57, /*0x48-0x4f*/
+  0xc6eb, 0xecb4, 0xfd58, 0xfd59, 0xfd5a, 0xfd5b, 0xfd5c, 0xfd5d, /*0x50-0x57*/
+  0xfd5e, 0xfd5f, 0xfd60, 0xfd61, 0xfd62, 0xfd63, 0xfd64, 0xfd65, /*0x58-0x5f*/
+  0xfd66, 0xfd67, 0xfd68, 0xfd69, 0xfd6a, 0xfd6b, 0xfd6c, 0xfd6d, /*0x60-0x67*/
+  0xfd6e, 0xfd6f, 0xfd70, 0xfd71, 0xfd72, 0xfd73, 0xfd74, 0xfd75, /*0x68-0x6f*/
+  0xfd76, 0xfd77, 0xfd78, 0xfd79, 0xfd7a, 0xfd7b, 0xfd7c, 0xfd7d, /*0x70-0x77*/
+  0xfd7e, 0xfd80, 0xfd81, 0xfd82, 0xfd83, 0xfd84, 0xfd85, 0xb3dd, /*0x78-0x7f*/
+  0xf6b3, 0xfd86, 0xfd87, 0xf6b4, 0xc1e4, 0xf6b5, 0xf6b6, 0xf6b7, /*0x80-0x87*/
+  0xf6b8, 0xf6b9, 0xf6ba, 0xc8a3, 0xf6bb, 0xfd88, 0xfd89, 0xfd8a, /*0x88-0x8f*/
+  0xfd8b, 0xfd8c, 0xfd8d, 0xfd8e, 0xfd8f, 0xfd90, 0xfd91, 0xfd92, /*0x90-0x97*/
+  0xfd93, 0xc1fa, 0xb9a8, 0xede8, 0xfd94, 0xfd95, 0xfd96, 0xb9ea, /*0x98-0x9f*/
+  0xd9df, 0xfd97, 0xfd98, 0xfd99, 0xfd9a, 0xfd9b, 0x0000, 0x0000, /*0xa0-0xa7*/
+};
+static const unsigned short gbk_pagef9a[32] = {
+  0x0000, 0xfd9d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x78-0x7f*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x80-0x87*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x88-0x8f*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfd9e, 0x0000, 0x0000, /*0x90-0x97*/
+};
+static const unsigned short gbk_pagef9b[24] = {
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfd9f, /*0xe0-0xe7*/
+  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xe8-0xef*/
+  0x0000, 0xfda0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0xf0-0xf7*/
+};
+static const unsigned short gbk_pagefa[40] = {
+  0x0000, 0x0000, 0x0000, 0x0000, 0xfe40, 0xfe41, 0xfe42, 0xfe43, /*0x08-0x0f*/
+  0x0000, 0xfe44, 0x0000, 0xfe45, 0xfe46, 0x0000, 0x0000, 0x0000, /*0x10-0x17*/
+  0xfe47, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xfe48, /*0x18-0x1f*/
+  0xfe49, 0xfe4a, 0x0000, 0xfe4b, 0xfe4c, 0x0000, 0x0000, 0xfe4d, /*0x20-0x27*/
+  0xfe4e, 0xfe4f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, /*0x28-0x2f*/
+};
+static const unsigned short gbk_pagefe[64] = {
+  0xa955, 0xa6f2, 0x0000, 0xa6f4, 0xa6f5, 0xa6e0, 0xa6e1, 0xa6f0, /*0x30-0x37*/
+  0xa6f1, 0xa6e2, 0xa6e3, 0xa6ee, 0xa6ef, 0xa6e6, 0xa6e7, 0xa6e4, /*0x38-0x3f*/
+  0xa6e5, 0xa6e8, 0xa6e9, 0xa6ea, 0xa6eb, 0x0000, 0x0000, 0x0000, /*0x40-0x47*/
+  0x0000, 0xa968, 0xa969, 0xa96a, 0xa96b, 0xa96c, 0xa96d, 0xa96e, /*0x48-0x4f*/
+  0xa96f, 0xa970, 0xa971, 0x0000, 0xa972, 0xa973, 0xa974, 0xa975, /*0x50-0x57*/
+  0x0000, 0xa976, 0xa977, 0xa978, 0xa979, 0xa97a, 0xa97b, 0xa97c, /*0x58-0x5f*/
+  0xa97d, 0xa97e, 0xa980, 0xa981, 0xa982, 0xa983, 0xa984, 0x0000, /*0x60-0x67*/
+  0xa985, 0xa986, 0xa987, 0xa988, 0x0000, 0x0000, 0x0000, 0x0000, /*0x68-0x6f*/
+};
+static const unsigned short gbk_pageffa[96] = {
+  0x0000, 0xa3a1, 0xa3a2, 0xa3a3, 0xa1e7, 0xa3a5, 0xa3a6, 0xa3a7, /*0x00-0x07*/
+  0xa3a8, 0xa3a9, 0xa3aa, 0xa3ab, 0xa3ac, 0xa3ad, 0xa3ae, 0xa3af, /*0x08-0x0f*/
+  0xa3b0, 0xa3b1, 0xa3b2, 0xa3b3, 0xa3b4, 0xa3b5, 0xa3b6, 0xa3b7, /*0x10-0x17*/
+  0xa3b8, 0xa3b9, 0xa3ba, 0xa3bb, 0xa3bc, 0xa3bd, 0xa3be, 0xa3bf, /*0x18-0x1f*/
+  0xa3c0, 0xa3c1, 0xa3c2, 0xa3c3, 0xa3c4, 0xa3c5, 0xa3c6, 0xa3c7, /*0x20-0x27*/
+  0xa3c8, 0xa3c9, 0xa3ca, 0xa3cb, 0xa3cc, 0xa3cd, 0xa3ce, 0xa3cf, /*0x28-0x2f*/
+  0xa3d0, 0xa3d1, 0xa3d2, 0xa3d3, 0xa3d4, 0xa3d5, 0xa3d6, 0xa3d7, /*0x30-0x37*/
+  0xa3d8, 0xa3d9, 0xa3da, 0xa3db, 0xa3dc, 0xa3dd, 0xa3de, 0xa3df, /*0x38-0x3f*/
+  0xa3e0, 0xa3e1, 0xa3e2, 0xa3e3, 0xa3e4, 0xa3e5, 0xa3e6, 0xa3e7, /*0x40-0x47*/
+  0xa3e8, 0xa3e9, 0xa3ea, 0xa3eb, 0xa3ec, 0xa3ed, 0xa3ee, 0xa3ef, /*0x48-0x4f*/
+  0xa3f0, 0xa3f1, 0xa3f2, 0xa3f3, 0xa3f4, 0xa3f5, 0xa3f6, 0xa3f7, /*0x50-0x57*/
+  0xa3f8, 0xa3f9, 0xa3fa, 0xa3fb, 0xa3fc, 0xa3fd, 0xa1ab, 0x0000, /*0x58-0x5f*/
+};
+static const unsigned short gbk_pageffb[8] = {
+  0xa1e9, 0xa1ea, 0xa956, 0xa3fe, 0xa957, 0xa3a4, 0x0000, 0x0000, /*0xe0-0xe7*/
+};
+
+static int
+gbk_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  if (n >= 2) {
+    unsigned short c = 0;
+    if (wc >= 0x00a0 && wc < 0x0170)
+      c = gbk_page00[wc-0x00a0];
+    else if (wc >= 0x01c8 && wc < 0x01e0)
+      c = gbk_page01[wc-0x01c8];
+    else if (wc >= 0x0250 && wc < 0x0268)
+      c = gbk_page02a[wc-0x0250];
+    else if (wc >= 0x02c0 && wc < 0x02e0)
+      c = gbk_page02b[wc-0x02c0];
+    else if (wc >= 0x0390 && wc < 0x03d0)
+      c = gbk_page03[wc-0x0390];
+    else if (wc >= 0x0400 && wc < 0x0458)
+      c = gbk_page04[wc-0x0400];
+    else if (wc >= 0x2010 && wc < 0x2040)
+      c = gbk_page20[wc-0x2010];
+    else if (wc >= 0x2100 && wc < 0x21a0)
+      c = gbk_page21[wc-0x2100];
+    else if (wc >= 0x2208 && wc < 0x22c0)
+      c = gbk_page22[wc-0x2208];
+    else if (wc == 0x2312)
+      c = 0xa1d0;
+    else if (wc >= 0x2460 && wc < 0x24a0)
+      c = gbk_page24[wc-0x2460];
+    else if (wc >= 0x2500 && wc < 0x25e8)
+      c = gbk_page25[wc-0x2500];
+    else if (wc >= 0x2600 && wc < 0x2648)
+      c = gbk_page26[wc-0x2600];
+    else if (wc >= 0x3000 && wc < 0x3130)
+      c = gbk_page30[wc-0x3000];
+    else if (wc >= 0x3220 && wc < 0x3238)
+      c = gbk_page32[wc-0x3220];
+    else if (wc == 0x32a3)
+      c = 0xa949;
+    else if (wc >= 0x3388 && wc < 0x33d8)
+      c = gbk_page33[wc-0x3388];
+    else if (wc >= 0x4e00 && wc < 0x9fa8)
+      c = gbk_page4e[wc-0x4e00];
+    else if (wc == 0xf92c)
+      c = 0xfd9c;
+    else if (wc >= 0xf978 && wc < 0xf998)
+      c = gbk_pagef9a[wc-0xf978];
+    else if (wc >= 0xf9e0 && wc < 0xf9f8)
+      c = gbk_pagef9b[wc-0xf9e0];
+    else if (wc >= 0xfa08 && wc < 0xfa30)
+      c = gbk_pagefa[wc-0xfa08];
+    else if (wc >= 0xfe30 && wc < 0xfe70)
+      c = gbk_pagefe[wc-0xfe30];
+    else if (wc >= 0xff00 && wc < 0xff60)
+      c = gbk_pageffa[wc-0xff00];
+    else if (wc >= 0xffe0 && wc < 0xffe8)
+      c = gbk_pageffb[wc-0xffe0];
+    if (c != 0) {
+      r[0] = (c >> 8); r[1] = (c & 0xff);
+      return 2;
+    }
+    return RET_ILSEQ;
+  }
+  return RET_TOOSMALL;
+}
diff --git a/src/xlibi18n/lcUniConv/georgian_academy.h b/src/xlibi18n/lcUniConv/georgian_academy.h
new file mode 100644 (file)
index 0000000..0e43504
--- /dev/null
@@ -0,0 +1,87 @@
+
+/*
+ * GEORGIAN-ACADEMY
+ */
+
+static const unsigned short georgian_academy_2uni[32] = {
+  /* 0x80 */
+  0x0080, 0x0081, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021,
+  0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008d, 0x008e, 0x008f,
+  /* 0x90 */
+  0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
+  0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x009d, 0x009e, 0x0178,
+};
+
+static int
+georgian_academy_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c >= 0x80 && c < 0xa0)
+    *pwc = (ucs4_t) georgian_academy_2uni[c-0x80];
+  else if (c >= 0xc0 && c < 0xe7)
+    *pwc = (ucs4_t) c + 0x1010;
+  else
+    *pwc = (ucs4_t) c;
+  return 1;
+}
+
+static const unsigned char georgian_academy_page00[32] = {
+  0x80, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8d, 0x8e, 0x8f, /* 0x88-0x8f */
+  0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x9d, 0x9e, 0x00, /* 0x98-0x9f */
+};
+static const unsigned char georgian_academy_page01[72] = {
+  0x00, 0x00, 0x8c, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */
+  0x8a, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */
+  0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */
+  0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */
+};
+static const unsigned char georgian_academy_page02[32] = {
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, /* 0xc0-0xc7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */
+  0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, /* 0xd8-0xdf */
+};
+static const unsigned char georgian_academy_page20[48] = {
+  0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */
+  0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */
+  0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */
+  0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */
+  0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */
+};
+
+static int
+georgian_academy_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  unsigned char c = 0;
+  if (wc < 0x0080) {
+    *r = wc;
+    return 1;
+  }
+  else if (wc >= 0x0080 && wc < 0x00a0)
+    c = georgian_academy_page00[wc-0x0080];
+  else if ((wc >= 0x00a0 && wc < 0x00c0) || (wc >= 0x00e7 && wc < 0x0100))
+    c = wc;
+  else if (wc >= 0x0150 && wc < 0x0198)
+    c = georgian_academy_page01[wc-0x0150];
+  else if (wc >= 0x02c0 && wc < 0x02e0)
+    c = georgian_academy_page02[wc-0x02c0];
+  else if (wc >= 0x10d0 && wc < 0x10f7)
+    c = wc-0x1010;
+  else if (wc >= 0x2010 && wc < 0x2040)
+    c = georgian_academy_page20[wc-0x2010];
+  else if (wc == 0x2122)
+    c = 0x99;
+  if (c != 0) {
+    *r = c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/georgian_ps.h b/src/xlibi18n/lcUniConv/georgian_ps.h
new file mode 100644 (file)
index 0000000..b96c491
--- /dev/null
@@ -0,0 +1,104 @@
+
+/*
+ * GEORGIAN-PS
+ */
+
+static const unsigned short georgian_ps_2uni_1[32] = {
+  /* 0x80 */
+  0x0080, 0x0081, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021,
+  0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008d, 0x008e, 0x008f,
+  /* 0x90 */
+  0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
+  0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x009d, 0x009e, 0x0178,
+};
+static const unsigned short georgian_ps_2uni_2[39] = {
+  /* 0xc0 */
+  0x10d0, 0x10d1, 0x10d2, 0x10d3, 0x10d4, 0x10d5, 0x10d6, 0x10f1,
+  0x10d7, 0x10d8, 0x10d9, 0x10da, 0x10db, 0x10dc, 0x10f2, 0x10dd,
+  /* 0xd0 */
+  0x10de, 0x10df, 0x10e0, 0x10e1, 0x10e2, 0x10f3, 0x10e3, 0x10e4,
+  0x10e5, 0x10e6, 0x10e7, 0x10e8, 0x10e9, 0x10ea, 0x10eb, 0x10ec,
+  /* 0xe0 */
+  0x10ed, 0x10ee, 0x10f4, 0x10ef, 0x10f0, 0x10f5,
+};
+
+static int
+georgian_ps_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c >= 0x80 && c < 0xa0)
+    *pwc = (ucs4_t) georgian_ps_2uni_1[c-0x80];
+  else if (c >= 0xc0 && c < 0xe6)
+    *pwc = (ucs4_t) georgian_ps_2uni_2[c-0xc0];
+  else
+    *pwc = (ucs4_t) c;
+  return 1;
+}
+
+static const unsigned char georgian_ps_page00[32] = {
+  0x80, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x8d, 0x8e, 0x8f, /* 0x88-0x8f */
+  0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x9d, 0x9e, 0x00, /* 0x98-0x9f */
+};
+static const unsigned char georgian_ps_page01[72] = {
+  0x00, 0x00, 0x8c, 0x9c, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */
+  0x8a, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */
+  0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */
+  0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */
+};
+static const unsigned char georgian_ps_page02[32] = {
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, /* 0xc0-0xc7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */
+  0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, /* 0xd8-0xdf */
+};
+static const unsigned char georgian_ps_page10[40] = {
+  0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc8, /* 0xd0-0xd7 */
+  0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xcf, 0xd0, 0xd1, /* 0xd8-0xdf */
+  0xd2, 0xd3, 0xd4, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, /* 0xe0-0xe7 */
+  0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe3, /* 0xe8-0xef */
+  0xe4, 0xc7, 0xce, 0xd5, 0xe2, 0xe5, 0x00, 0x00, /* 0xf0-0xf7 */
+};
+static const unsigned char georgian_ps_page20[48] = {
+  0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */
+  0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */
+  0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */
+  0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */
+  0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */
+};
+
+static int
+georgian_ps_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  unsigned char c = 0;
+  if (wc < 0x0080) {
+    *r = wc;
+    return 1;
+  }
+  else if (wc >= 0x0080 && wc < 0x00a0)
+    c = georgian_ps_page00[wc-0x0080];
+  else if ((wc >= 0x00a0 && wc < 0x00c0) || (wc >= 0x00e6 && wc < 0x0100))
+    c = wc;
+  else if (wc >= 0x0150 && wc < 0x0198)
+    c = georgian_ps_page01[wc-0x0150];
+  else if (wc >= 0x02c0 && wc < 0x02e0)
+    c = georgian_ps_page02[wc-0x02c0];
+  else if (wc >= 0x10d0 && wc < 0x10f8)
+    c = georgian_ps_page10[wc-0x10d0];
+  else if (wc >= 0x2010 && wc < 0x2040)
+    c = georgian_ps_page20[wc-0x2010];
+  else if (wc == 0x2122)
+    c = 0x99;
+  if (c != 0) {
+    *r = c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/iso8859_1.h b/src/xlibi18n/lcUniConv/iso8859_1.h
new file mode 100644 (file)
index 0000000..fc302bb
--- /dev/null
@@ -0,0 +1,22 @@
+
+/*
+ * ISO-8859-1
+ */
+
+static int
+iso8859_1_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  *pwc = (ucs4_t) c;
+  return 1;
+}
+
+static int
+iso8859_1_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  if (wc < 0x0100) {
+    *r = wc;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/iso8859_10.h b/src/xlibi18n/lcUniConv/iso8859_10.h
new file mode 100644 (file)
index 0000000..508db57
--- /dev/null
@@ -0,0 +1,87 @@
+
+/*
+ * ISO-8859-10
+ */
+
+static const unsigned short iso8859_10_2uni[96] = {
+  /* 0xa0 */
+  0x00a0, 0x0104, 0x0112, 0x0122, 0x012a, 0x0128, 0x0136, 0x00a7,
+  0x013b, 0x0110, 0x0160, 0x0166, 0x017d, 0x00ad, 0x016a, 0x014a,
+  /* 0xb0 */
+  0x00b0, 0x0105, 0x0113, 0x0123, 0x012b, 0x0129, 0x0137, 0x00b7,
+  0x013c, 0x0111, 0x0161, 0x0167, 0x017e, 0x2015, 0x016b, 0x014b,
+  /* 0xc0 */
+  0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e,
+  0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x00cf,
+  /* 0xd0 */
+  0x00d0, 0x0145, 0x014c, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x0168,
+  0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+  /* 0xe0 */
+  0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f,
+  0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x00ef,
+  /* 0xf0 */
+  0x00f0, 0x0146, 0x014d, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x0169,
+  0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x0138,
+};
+
+static int
+iso8859_10_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c < 0xa0)
+    *pwc = (ucs4_t) c;
+  else
+    *pwc = (ucs4_t) iso8859_10_2uni[c-0xa0];
+  return 1;
+}
+
+static const unsigned char iso8859_10_page00[224] = {
+  0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */
+  0xb0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, /* 0xb0-0xb7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */
+  0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0x00, /* 0xc0-0xc7 */
+  0x00, 0xc9, 0x00, 0xcb, 0x00, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */
+  0xd0, 0x00, 0x00, 0xd3, 0xd4, 0xd5, 0xd6, 0x00, /* 0xd0-0xd7 */
+  0xd8, 0x00, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0xd8-0xdf */
+  0x00, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0x00, /* 0xe0-0xe7 */
+  0x00, 0xe9, 0x00, 0xeb, 0x00, 0xed, 0xee, 0xef, /* 0xe8-0xef */
+  0xf0, 0x00, 0x00, 0xf3, 0xf4, 0xf5, 0xf6, 0x00, /* 0xf0-0xf7 */
+  0xf8, 0x00, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0x00, /* 0xf8-0xff */
+  /* 0x0100 */
+  0xc0, 0xe0, 0x00, 0x00, 0xa1, 0xb1, 0x00, 0x00, /* 0x00-0x07 */
+  0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, /* 0x08-0x0f */
+  0xa9, 0xb9, 0xa2, 0xb2, 0x00, 0x00, 0xcc, 0xec, /* 0x10-0x17 */
+  0xca, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */
+  0x00, 0x00, 0xa3, 0xb3, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */
+  0xa5, 0xb5, 0xa4, 0xb4, 0x00, 0x00, 0xc7, 0xe7, /* 0x28-0x2f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, 0xb6, /* 0x30-0x37 */
+  0xff, 0x00, 0x00, 0xa8, 0xb8, 0x00, 0x00, 0x00, /* 0x38-0x3f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf1, 0x00, /* 0x40-0x47 */
+  0x00, 0x00, 0xaf, 0xbf, 0xd2, 0xf2, 0x00, 0x00, /* 0x48-0x4f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */
+  0xaa, 0xba, 0x00, 0x00, 0x00, 0x00, 0xab, 0xbb, /* 0x60-0x67 */
+  0xd7, 0xf7, 0xae, 0xbe, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */
+  0x00, 0x00, 0xd9, 0xf9, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0xbc, 0x00, /* 0x78-0x7f */
+};
+
+static int
+iso8859_10_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  unsigned char c = 0;
+  if (wc < 0x00a0) {
+    *r = wc;
+    return 1;
+  }
+  else if (wc >= 0x00a0 && wc < 0x0180)
+    c = iso8859_10_page00[wc-0x00a0];
+  else if (wc == 0x2015)
+    c = 0xbd;
+  if (c != 0) {
+    *r = c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/iso8859_11.h b/src/xlibi18n/lcUniConv/iso8859_11.h
new file mode 100644 (file)
index 0000000..5458da5
--- /dev/null
@@ -0,0 +1,77 @@
+
+/*
+ * ISO8859-11
+ */
+
+static const unsigned short iso8859_11_2uni[96] = {
+  /* 0xa0 */
+  0x00a0, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07,
+  0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f,
+  /* 0xb0 */
+  0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17,
+  0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f,
+  /* 0xc0 */
+  0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27,
+  0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f,
+  /* 0xd0 */
+  0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37,
+  0x0e38, 0x0e39, 0x0e3a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x0e3f,
+  /* 0xe0 */
+  0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47,
+  0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e4e, 0x0e4f,
+  /* 0xf0 */
+  0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57,
+  0x0e58, 0x0e59, 0x0e5a, 0x0e5b, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+};
+
+static int
+iso8859_11_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c < 0x80) {
+    *pwc = (ucs4_t) c;
+    return 1;
+  }
+  else if (c < 0xa0) {
+  }
+  else {
+    unsigned short wc = iso8859_11_2uni[c-0xa0];
+    if (wc != 0xfffd) {
+      *pwc = (ucs4_t) wc;
+      return 1;
+    }
+  }
+  return RET_ILSEQ;
+}
+
+static const unsigned char iso8859_11_page0e[96] = {
+  0x00, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0x00-0x07 */
+  0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0x08-0x0f */
+  0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0x10-0x17 */
+  0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0x18-0x1f */
+  0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */
+  0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */
+  0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x30-0x37 */
+  0xd8, 0xd9, 0xda, 0x00, 0x00, 0x00, 0x00, 0xdf, /* 0x38-0x3f */
+  0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */
+  0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */
+  0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x50-0x57 */
+  0xf8, 0xf9, 0xfa, 0xfb, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */
+};
+
+static int
+iso8859_11_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  unsigned char c = 0;
+  if (wc < 0x0080 || wc == 0x00a0) {
+    *r = wc;
+    return 1;
+  }
+  else if (wc >= 0x0e00 && wc < 0x0e60)
+    c = iso8859_11_page0e[wc-0x0e00];
+  if (c != 0) {
+    *r = c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/iso8859_13.h b/src/xlibi18n/lcUniConv/iso8859_13.h
new file mode 100644 (file)
index 0000000..c041b15
--- /dev/null
@@ -0,0 +1,90 @@
+
+/*
+ * ISO-8859-13
+ */
+
+static const unsigned short iso8859_13_2uni[96] = {
+  /* 0xa0 */
+  0x00a0, 0x201d, 0x00a2, 0x00a3, 0x00a4, 0x201e, 0x00a6, 0x00a7,
+  0x00d8, 0x00a9, 0x0156, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6,
+  /* 0xb0 */
+  0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x201c, 0x00b5, 0x00b6, 0x00b7,
+  0x00f8, 0x00b9, 0x0157, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6,
+  /* 0xc0 */
+  0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112,
+  0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b,
+  /* 0xd0 */
+  0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7,
+  0x0172, 0x0141, 0x015a, 0x016a, 0x00dc, 0x017b, 0x017d, 0x00df,
+  /* 0xe0 */
+  0x0105, 0x012f, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113,
+  0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c,
+  /* 0xf0 */
+  0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7,
+  0x0173, 0x0142, 0x015b, 0x016b, 0x00fc, 0x017c, 0x017e, 0x2019,
+};
+
+static int
+iso8859_13_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c < 0xa0)
+    *pwc = (ucs4_t) c;
+  else
+    *pwc = (ucs4_t) iso8859_13_2uni[c-0xa0];
+  return 1;
+}
+
+static const unsigned char iso8859_13_page00[224] = {
+  0xa0, 0x00, 0xa2, 0xa3, 0xa4, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */
+  0x00, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00, /* 0xa8-0xaf */
+  0xb0, 0xb1, 0xb2, 0xb3, 0x00, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */
+  0x00, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, /* 0xb8-0xbf */
+  0x00, 0x00, 0x00, 0x00, 0xc4, 0xc5, 0xaf, 0x00, /* 0xc0-0xc7 */
+  0x00, 0xc9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */
+  0x00, 0x00, 0x00, 0xd3, 0x00, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */
+  0xa8, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */
+  0x00, 0x00, 0x00, 0x00, 0xe4, 0xe5, 0xbf, 0x00, /* 0xe0-0xe7 */
+  0x00, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */
+  0x00, 0x00, 0x00, 0xf3, 0x00, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */
+  0xb8, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, /* 0xf8-0xff */
+  /* 0x0100 */
+  0xc2, 0xe2, 0x00, 0x00, 0xc0, 0xe0, 0xc3, 0xe3, /* 0x00-0x07 */
+  0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, /* 0x08-0x0f */
+  0x00, 0x00, 0xc7, 0xe7, 0x00, 0x00, 0xcb, 0xeb, /* 0x10-0x17 */
+  0xc6, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */
+  0x00, 0x00, 0xcc, 0xec, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */
+  0x00, 0x00, 0xce, 0xee, 0x00, 0x00, 0xc1, 0xe1, /* 0x28-0x2f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcd, 0xed, /* 0x30-0x37 */
+  0x00, 0x00, 0x00, 0xcf, 0xef, 0x00, 0x00, 0x00, /* 0x38-0x3f */
+  0x00, 0xd9, 0xf9, 0xd1, 0xf1, 0xd2, 0xf2, 0x00, /* 0x40-0x47 */
+  0x00, 0x00, 0x00, 0x00, 0xd4, 0xf4, 0x00, 0x00, /* 0x48-0x4f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xba, /* 0x50-0x57 */
+  0x00, 0x00, 0xda, 0xfa, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */
+  0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */
+  0x00, 0x00, 0xdb, 0xfb, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */
+  0x00, 0x00, 0xd8, 0xf8, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */
+  0x00, 0xca, 0xea, 0xdd, 0xfd, 0xde, 0xfe, 0x00, /* 0x78-0x7f */
+};
+static const unsigned char iso8859_13_page20[8] = {
+  0x00, 0xff, 0x00, 0x00, 0xb4, 0xa1, 0xa5, 0x00, /* 0x18-0x1f */
+};
+
+static int
+iso8859_13_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  unsigned char c = 0;
+  if (wc < 0x00a0) {
+    *r = wc;
+    return 1;
+  }
+  else if (wc >= 0x00a0 && wc < 0x0180)
+    c = iso8859_13_page00[wc-0x00a0];
+  else if (wc >= 0x2018 && wc < 0x2020)
+    c = iso8859_13_page20[wc-0x2018];
+  if (c != 0) {
+    *r = c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/iso8859_14.h b/src/xlibi18n/lcUniConv/iso8859_14.h
new file mode 100644 (file)
index 0000000..f015814
--- /dev/null
@@ -0,0 +1,108 @@
+
+/*
+ * ISO-8859-14
+ */
+
+static const unsigned short iso8859_14_2uni[96] = {
+  /* 0xa0 */
+  0x00a0, 0x1e02, 0x1e03, 0x00a3, 0x010a, 0x010b, 0x1e0a, 0x00a7,
+  0x1e80, 0x00a9, 0x1e82, 0x1e0b, 0x1ef2, 0x00ad, 0x00ae, 0x0178,
+  /* 0xb0 */
+  0x1e1e, 0x1e1f, 0x0120, 0x0121, 0x1e40, 0x1e41, 0x00b6, 0x1e56,
+  0x1e81, 0x1e57, 0x1e83, 0x1e60, 0x1ef3, 0x1e84, 0x1e85, 0x1e61,
+  /* 0xc0 */
+  0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+  0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+  /* 0xd0 */
+  0x0174, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x1e6a,
+  0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x0176, 0x00df,
+  /* 0xe0 */
+  0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+  0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+  /* 0xf0 */
+  0x0175, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x1e6b,
+  0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x0177, 0x00ff,
+};
+
+static int
+iso8859_14_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c >= 0xa0)
+    *pwc = (ucs4_t) iso8859_14_2uni[c-0xa0];
+  else
+    *pwc = (ucs4_t) c;
+  return 1;
+}
+
+static const unsigned char iso8859_14_page00[96] = {
+  0xa0, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */
+  0x00, 0xa9, 0x00, 0x00, 0x00, 0xad, 0xae, 0x00, /* 0xa8-0xaf */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb6, 0x00, /* 0xb0-0xb7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */
+  0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0xc0-0xc7 */
+  0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */
+  0x00, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0x00, /* 0xd0-0xd7 */
+  0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0x00, 0xdf, /* 0xd8-0xdf */
+  0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */
+  0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */
+  0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0x00, /* 0xf0-0xf7 */
+  0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0x00, 0xff, /* 0xf8-0xff */
+};
+static const unsigned char iso8859_14_page01_0[32] = {
+  0x00, 0x00, 0xa4, 0xa5, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */
+  0xb2, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */
+};
+static const unsigned char iso8859_14_page01_1[16] = {
+  0x00, 0x00, 0x00, 0x00, 0xd0, 0xf0, 0xde, 0xfe, /* 0x70-0x77 */
+  0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */
+};
+static const unsigned char iso8859_14_page1e_0[136] = {
+  0x00, 0x00, 0xa1, 0xa2, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */
+  0x00, 0x00, 0xa6, 0xab, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0xb1, /* 0x18-0x1f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */
+  0xb4, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, 0xb9, /* 0x50-0x57 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */
+  0xbb, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */
+  0x00, 0x00, 0xd7, 0xf7, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */
+  0xa8, 0xb8, 0xaa, 0xba, 0xbd, 0xbe, 0x00, 0x00, /* 0x80-0x87 */
+};
+static const unsigned char iso8859_14_page1e_1[8] = {
+  0x00, 0x00, 0xac, 0xbc, 0x00, 0x00, 0x00, 0x00, /* 0xf0-0xf7 */
+};
+
+static int
+iso8859_14_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  unsigned char c = 0;
+  if (wc < 0x00a0) {
+    *r = wc;
+    return 1;
+  }
+  else if (wc >= 0x00a0 && wc < 0x0100)
+    c = iso8859_14_page00[wc-0x00a0];
+  else if (wc >= 0x0108 && wc < 0x0128)
+    c = iso8859_14_page01_0[wc-0x0108];
+  else if (wc >= 0x0170 && wc < 0x0180)
+    c = iso8859_14_page01_1[wc-0x0170];
+  else if (wc >= 0x1e00 && wc < 0x1e88)
+    c = iso8859_14_page1e_0[wc-0x1e00];
+  else if (wc >= 0x1ef0 && wc < 0x1ef8)
+    c = iso8859_14_page1e_1[wc-0x1ef0];
+  if (c != 0) {
+    *r = c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/iso8859_15.h b/src/xlibi18n/lcUniConv/iso8859_15.h
new file mode 100644 (file)
index 0000000..631d9b5
--- /dev/null
@@ -0,0 +1,62 @@
+
+/*
+ * ISO-8859-15
+ */
+
+static const unsigned short iso8859_15_2uni[32] = {
+  /* 0xa0 */
+  0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20ac, 0x00a5, 0x0160, 0x00a7,
+  0x0161, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+  /* 0xb0 */
+  0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x017d, 0x00b5, 0x00b6, 0x00b7,
+  0x017e, 0x00b9, 0x00ba, 0x00bb, 0x0152, 0x0153, 0x0178, 0x00bf,
+};
+
+static int
+iso8859_15_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c >= 0xa0 && c < 0xc0)
+    *pwc = (ucs4_t) iso8859_15_2uni[c-0xa0];
+  else
+    *pwc = (ucs4_t) c;
+  return 1;
+}
+
+static const unsigned char iso8859_15_page00[32] = {
+  0xa0, 0xa1, 0xa2, 0xa3, 0x00, 0xa5, 0x00, 0xa7, /* 0xa0-0xa7 */
+  0x00, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */
+  0xb0, 0xb1, 0xb2, 0xb3, 0x00, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */
+  0x00, 0xb9, 0xba, 0xbb, 0x00, 0x00, 0x00, 0xbf, /* 0xb8-0xbf */
+};
+static const unsigned char iso8859_15_page01[48] = {
+  0x00, 0x00, 0xbc, 0xbd, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */
+  0xa6, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */
+  0xbe, 0x00, 0x00, 0x00, 0x00, 0xb4, 0xb8, 0x00, /* 0x78-0x7f */
+};
+
+static int
+iso8859_15_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  unsigned char c = 0;
+  if (wc < 0x00a0) {
+    *r = wc;
+    return 1;
+  }
+  else if (wc >= 0x00a0 && wc < 0x00c0)
+    c = iso8859_15_page00[wc-0x00a0];
+  else if (wc >= 0x00c0 && wc < 0x0100)
+    c = wc;
+  else if (wc >= 0x0150 && wc < 0x0180)
+    c = iso8859_15_page01[wc-0x0150];
+  else if (wc == 0x20ac)
+    c = 0xa4;
+  if (c != 0) {
+    *r = c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/iso8859_16.h b/src/xlibi18n/lcUniConv/iso8859_16.h
new file mode 100644 (file)
index 0000000..99a54d9
--- /dev/null
@@ -0,0 +1,97 @@
+
+/*
+ * ISO-8859-16
+ */
+
+static const unsigned short iso8859_16_2uni[96] = {
+  /* 0xa0 */
+  0x00a0, 0x0104, 0x0105, 0x0141, 0x20ac, 0x201e, 0x0160, 0x00a7,
+  0x0161, 0x00a9, 0x0218, 0x00ab, 0x0179, 0x00ad, 0x017a, 0x017b,
+  /* 0xb0 */
+  0x00b0, 0x00b1, 0x010c, 0x0142, 0x017d, 0x201d, 0x00b6, 0x00b7,
+  0x017e, 0x010d, 0x0219, 0x00bb, 0x0152, 0x0153, 0x0178, 0x017c,
+  /* 0xc0 */
+  0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0106, 0x00c6, 0x00c7,
+  0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+  /* 0xd0 */
+  0x0110, 0x0143, 0x00d2, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x015a,
+  0x0170, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0118, 0x021a, 0x00df,
+  /* 0xe0 */
+  0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x0107, 0x00e6, 0x00e7,
+  0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+  /* 0xf0 */
+  0x0111, 0x0144, 0x00f2, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x015b,
+  0x0171, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0119, 0x021b, 0x00ff,
+};
+
+static int
+iso8859_16_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c < 0xa0)
+    *pwc = (ucs4_t) c;
+  else
+    *pwc = (ucs4_t) iso8859_16_2uni[c-0xa0];
+  return 1;
+}
+
+static const unsigned char iso8859_16_page00[224] = {
+  0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */
+  0x00, 0xa9, 0x00, 0xab, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */
+  0xb0, 0xb1, 0x00, 0x00, 0x00, 0x00, 0xb6, 0xb7, /* 0xb0-0xb7 */
+  0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */
+  0xc0, 0xc1, 0xc2, 0x00, 0xc4, 0x00, 0xc6, 0xc7, /* 0xc0-0xc7 */
+  0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */
+  0x00, 0x00, 0xd2, 0xd3, 0xd4, 0x00, 0xd6, 0x00, /* 0xd0-0xd7 */
+  0x00, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */
+  0xe0, 0xe1, 0xe2, 0x00, 0xe4, 0x00, 0xe6, 0xe7, /* 0xe0-0xe7 */
+  0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */
+  0x00, 0x00, 0xf2, 0xf3, 0xf4, 0x00, 0xf6, 0x00, /* 0xf0-0xf7 */
+  0x00, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0xff, /* 0xf8-0xff */
+  /* 0x0100 */
+  0x00, 0x00, 0xc3, 0xe3, 0xa1, 0xa2, 0xc5, 0xe5, /* 0x00-0x07 */
+  0x00, 0x00, 0x00, 0x00, 0xb2, 0xb9, 0x00, 0x00, /* 0x08-0x0f */
+  0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */
+  0xdd, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */
+  0x00, 0xa3, 0xb3, 0xd1, 0xf1, 0x00, 0x00, 0x00, /* 0x40-0x47 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */
+  0xd5, 0xf5, 0xbc, 0xbd, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */
+  0x00, 0x00, 0xd7, 0xf7, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */
+  0xa6, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */
+  0xd8, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */
+  0xbe, 0xac, 0xae, 0xaf, 0xbf, 0xb4, 0xb8, 0x00, /* 0x78-0x7f */
+};
+static const unsigned char iso8859_16_page02[8] = {
+  0xaa, 0xba, 0xde, 0xfe, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */
+};
+static const unsigned char iso8859_16_page20[8] = {
+  0x00, 0x00, 0x00, 0x00, 0x00, 0xb5, 0xa5, 0x00, /* 0x18-0x1f */
+};
+
+static int
+iso8859_16_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  unsigned char c = 0;
+  if (wc < 0x00a0) {
+    *r = wc;
+    return 1;
+  }
+  else if (wc >= 0x00a0 && wc < 0x0180)
+    c = iso8859_16_page00[wc-0x00a0];
+  else if (wc >= 0x0218 && wc < 0x0220)
+    c = iso8859_16_page02[wc-0x0218];
+  else if (wc >= 0x2018 && wc < 0x2020)
+    c = iso8859_16_page20[wc-0x2018];
+  else if (wc == 0x20ac)
+    c = 0xa4;
+  if (c != 0) {
+    *r = c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/iso8859_2.h b/src/xlibi18n/lcUniConv/iso8859_2.h
new file mode 100644 (file)
index 0000000..a63d004
--- /dev/null
@@ -0,0 +1,93 @@
+
+/*
+ * ISO-8859-2
+ */
+
+static const unsigned short iso8859_2_2uni[96] = {
+  /* 0xa0 */
+  0x00a0, 0x0104, 0x02d8, 0x0141, 0x00a4, 0x013d, 0x015a, 0x00a7,
+  0x00a8, 0x0160, 0x015e, 0x0164, 0x0179, 0x00ad, 0x017d, 0x017b,
+  /* 0xb0 */
+  0x00b0, 0x0105, 0x02db, 0x0142, 0x00b4, 0x013e, 0x015b, 0x02c7,
+  0x00b8, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c,
+  /* 0xc0 */
+  0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7,
+  0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e,
+  /* 0xd0 */
+  0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7,
+  0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df,
+  /* 0xe0 */
+  0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7,
+  0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f,
+  /* 0xf0 */
+  0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7,
+  0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9,
+};
+
+static int
+iso8859_2_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c < 0xa0)
+    *pwc = (ucs4_t) c;
+  else
+    *pwc = (ucs4_t) iso8859_2_2uni[c-0xa0];
+  return 1;
+}
+
+static const unsigned char iso8859_2_page00[224] = {
+  0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */
+  0xa8, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */
+  0xb0, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */
+  0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */
+  0x00, 0xc1, 0xc2, 0x00, 0xc4, 0x00, 0x00, 0xc7, /* 0xc0-0xc7 */
+  0x00, 0xc9, 0x00, 0xcb, 0x00, 0xcd, 0xce, 0x00, /* 0xc8-0xcf */
+  0x00, 0x00, 0x00, 0xd3, 0xd4, 0x00, 0xd6, 0xd7, /* 0xd0-0xd7 */
+  0x00, 0x00, 0xda, 0x00, 0xdc, 0xdd, 0x00, 0xdf, /* 0xd8-0xdf */
+  0x00, 0xe1, 0xe2, 0x00, 0xe4, 0x00, 0x00, 0xe7, /* 0xe0-0xe7 */
+  0x00, 0xe9, 0x00, 0xeb, 0x00, 0xed, 0xee, 0x00, /* 0xe8-0xef */
+  0x00, 0x00, 0x00, 0xf3, 0xf4, 0x00, 0xf6, 0xf7, /* 0xf0-0xf7 */
+  0x00, 0x00, 0xfa, 0x00, 0xfc, 0xfd, 0x00, 0x00, /* 0xf8-0xff */
+  /* 0x0100 */
+  0x00, 0x00, 0xc3, 0xe3, 0xa1, 0xb1, 0xc6, 0xe6, /* 0x00-0x07 */
+  0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0xcf, 0xef, /* 0x08-0x0f */
+  0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */
+  0xca, 0xea, 0xcc, 0xec, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */
+  0x00, 0xc5, 0xe5, 0x00, 0x00, 0xa5, 0xb5, 0x00, /* 0x38-0x3f */
+  0x00, 0xa3, 0xb3, 0xd1, 0xf1, 0x00, 0x00, 0xd2, /* 0x40-0x47 */
+  0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */
+  0xd5, 0xf5, 0x00, 0x00, 0xc0, 0xe0, 0x00, 0x00, /* 0x50-0x57 */
+  0xd8, 0xf8, 0xa6, 0xb6, 0x00, 0x00, 0xaa, 0xba, /* 0x58-0x5f */
+  0xa9, 0xb9, 0xde, 0xfe, 0xab, 0xbb, 0x00, 0x00, /* 0x60-0x67 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd9, 0xf9, /* 0x68-0x6f */
+  0xdb, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */
+  0x00, 0xac, 0xbc, 0xaf, 0xbf, 0xae, 0xbe, 0x00, /* 0x78-0x7f */
+};
+static const unsigned char iso8859_2_page02[32] = {
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, /* 0xc0-0xc7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */
+  0xa2, 0xff, 0x00, 0xb2, 0x00, 0xbd, 0x00, 0x00, /* 0xd8-0xdf */
+};
+
+static int
+iso8859_2_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  unsigned char c = 0;
+  if (wc < 0x00a0) {
+    *r = wc;
+    return 1;
+  }
+  else if (wc >= 0x00a0 && wc < 0x0180)
+    c = iso8859_2_page00[wc-0x00a0];
+  else if (wc >= 0x02c0 && wc < 0x02e0)
+    c = iso8859_2_page02[wc-0x02c0];
+  if (c != 0) {
+    *r = c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/iso8859_3.h b/src/xlibi18n/lcUniConv/iso8859_3.h
new file mode 100644 (file)
index 0000000..2282f19
--- /dev/null
@@ -0,0 +1,99 @@
+
+/*
+ * ISO-8859-3
+ */
+
+static const unsigned short iso8859_3_2uni[96] = {
+  /* 0xa0 */
+  0x00a0, 0x0126, 0x02d8, 0x00a3, 0x00a4, 0xfffd, 0x0124, 0x00a7,
+  0x00a8, 0x0130, 0x015e, 0x011e, 0x0134, 0x00ad, 0xfffd, 0x017b,
+  /* 0xb0 */
+  0x00b0, 0x0127, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x0125, 0x00b7,
+  0x00b8, 0x0131, 0x015f, 0x011f, 0x0135, 0x00bd, 0xfffd, 0x017c,
+  /* 0xc0 */
+  0x00c0, 0x00c1, 0x00c2, 0xfffd, 0x00c4, 0x010a, 0x0108, 0x00c7,
+  0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+  /* 0xd0 */
+  0xfffd, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x0120, 0x00d6, 0x00d7,
+  0x011c, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x016c, 0x015c, 0x00df,
+  /* 0xe0 */
+  0x00e0, 0x00e1, 0x00e2, 0xfffd, 0x00e4, 0x010b, 0x0109, 0x00e7,
+  0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+  /* 0xf0 */
+  0xfffd, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x0121, 0x00f6, 0x00f7,
+  0x011d, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x016d, 0x015d, 0x02d9,
+};
+
+static int
+iso8859_3_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c < 0xa0) {
+    *pwc = (ucs4_t) c;
+    return 1;
+  }
+  else {
+    unsigned short wc = iso8859_3_2uni[c-0xa0];
+    if (wc != 0xfffd) {
+      *pwc = (ucs4_t) wc;
+      return 1;
+    }
+  }
+  return RET_ILSEQ;
+}
+
+static const unsigned char iso8859_3_page00[96] = {
+  0xa0, 0x00, 0x00, 0xa3, 0xa4, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */
+  0xa8, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */
+  0xb0, 0x00, 0xb2, 0xb3, 0xb4, 0xb5, 0x00, 0xb7, /* 0xb0-0xb7 */
+  0xb8, 0x00, 0x00, 0x00, 0x00, 0xbd, 0x00, 0x00, /* 0xb8-0xbf */
+  0xc0, 0xc1, 0xc2, 0x00, 0xc4, 0x00, 0x00, 0xc7, /* 0xc0-0xc7 */
+  0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */
+  0x00, 0xd1, 0xd2, 0xd3, 0xd4, 0x00, 0xd6, 0xd7, /* 0xd0-0xd7 */
+  0x00, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */
+  0xe0, 0xe1, 0xe2, 0x00, 0xe4, 0x00, 0x00, 0xe7, /* 0xe0-0xe7 */
+  0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */
+  0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0x00, 0xf6, 0xf7, /* 0xf0-0xf7 */
+  0x00, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0x00, /* 0xf8-0xff */
+};
+static const unsigned char iso8859_3_page01[120] = {
+  0xc6, 0xe6, 0xc5, 0xe5, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */
+  0x00, 0x00, 0x00, 0x00, 0xd8, 0xf8, 0xab, 0xbb, /* 0x18-0x1f */
+  0xd5, 0xf5, 0x00, 0x00, 0xa6, 0xb6, 0xa1, 0xb1, /* 0x20-0x27 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */
+  0xa9, 0xb9, 0x00, 0x00, 0xac, 0xbc, 0x00, 0x00, /* 0x30-0x37 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */
+  0x00, 0x00, 0x00, 0x00, 0xde, 0xfe, 0xaa, 0xba, /* 0x58-0x5f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */
+  0x00, 0x00, 0x00, 0x00, 0xdd, 0xfd, 0x00, 0x00, /* 0x68-0x6f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */
+  0x00, 0x00, 0x00, 0xaf, 0xbf, 0x00, 0x00, 0x00, /* 0x78-0x7f */
+};
+static const unsigned char iso8859_3_page02[8] = {
+  0xa2, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */
+};
+
+static int
+iso8859_3_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  unsigned char c = 0;
+  if (wc < 0x00a0) {
+    *r = wc;
+    return 1;
+  }
+  else if (wc >= 0x00a0 && wc < 0x0100)
+    c = iso8859_3_page00[wc-0x00a0];
+  else if (wc >= 0x0108 && wc < 0x0180)
+    c = iso8859_3_page01[wc-0x0108];
+  else if (wc >= 0x02d8 && wc < 0x02e0)
+    c = iso8859_3_page02[wc-0x02d8];
+  if (c != 0) {
+    *r = c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/iso8859_4.h b/src/xlibi18n/lcUniConv/iso8859_4.h
new file mode 100644 (file)
index 0000000..878a7e4
--- /dev/null
@@ -0,0 +1,93 @@
+
+/*
+ * ISO-8859-4
+ */
+
+static const unsigned short iso8859_4_2uni[96] = {
+  /* 0xa0 */
+  0x00a0, 0x0104, 0x0138, 0x0156, 0x00a4, 0x0128, 0x013b, 0x00a7,
+  0x00a8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00ad, 0x017d, 0x00af,
+  /* 0xb0 */
+  0x00b0, 0x0105, 0x02db, 0x0157, 0x00b4, 0x0129, 0x013c, 0x02c7,
+  0x00b8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014a, 0x017e, 0x014b,
+  /* 0xc0 */
+  0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e,
+  0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x012a,
+  /* 0xd0 */
+  0x0110, 0x0145, 0x014c, 0x0136, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
+  0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x0168, 0x016a, 0x00df,
+  /* 0xe0 */
+  0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f,
+  0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x012b,
+  /* 0xf0 */
+  0x0111, 0x0146, 0x014d, 0x0137, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+  0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x0169, 0x016b, 0x02d9,
+};
+
+static int
+iso8859_4_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c < 0xa0)
+    *pwc = (ucs4_t) c;
+  else
+    *pwc = (ucs4_t) iso8859_4_2uni[c-0xa0];
+  return 1;
+}
+
+static const unsigned char iso8859_4_page00[224] = {
+  0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0xa7, /* 0xa0-0xa7 */
+  0xa8, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0xaf, /* 0xa8-0xaf */
+  0xb0, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */
+  0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */
+  0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0x00, /* 0xc0-0xc7 */
+  0x00, 0xc9, 0x00, 0xcb, 0x00, 0xcd, 0xce, 0x00, /* 0xc8-0xcf */
+  0x00, 0x00, 0x00, 0x00, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */
+  0xd8, 0x00, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */
+  0x00, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0x00, /* 0xe0-0xe7 */
+  0x00, 0xe9, 0x00, 0xeb, 0x00, 0xed, 0xee, 0x00, /* 0xe8-0xef */
+  0x00, 0x00, 0x00, 0x00, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */
+  0xf8, 0x00, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0x00, /* 0xf8-0xff */
+  /* 0x0100 */
+  0xc0, 0xe0, 0x00, 0x00, 0xa1, 0xb1, 0x00, 0x00, /* 0x00-0x07 */
+  0x00, 0x00, 0x00, 0x00, 0xc8, 0xe8, 0x00, 0x00, /* 0x08-0x0f */
+  0xd0, 0xf0, 0xaa, 0xba, 0x00, 0x00, 0xcc, 0xec, /* 0x10-0x17 */
+  0xca, 0xea, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */
+  0x00, 0x00, 0xab, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */
+  0xa5, 0xb5, 0xcf, 0xef, 0x00, 0x00, 0xc7, 0xe7, /* 0x28-0x2f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0xf3, /* 0x30-0x37 */
+  0xa2, 0x00, 0x00, 0xa6, 0xb6, 0x00, 0x00, 0x00, /* 0x38-0x3f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf1, 0x00, /* 0x40-0x47 */
+  0x00, 0x00, 0xbd, 0xbf, 0xd2, 0xf2, 0x00, 0x00, /* 0x48-0x4f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0xb3, /* 0x50-0x57 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */
+  0xa9, 0xb9, 0x00, 0x00, 0x00, 0x00, 0xac, 0xbc, /* 0x60-0x67 */
+  0xdd, 0xfd, 0xde, 0xfe, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */
+  0x00, 0x00, 0xd9, 0xf9, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0xae, 0xbe, 0x00, /* 0x78-0x7f */
+};
+static const unsigned char iso8859_4_page02[32] = {
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb7, /* 0xc0-0xc7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */
+  0x00, 0xff, 0x00, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */
+};
+
+static int
+iso8859_4_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  unsigned char c = 0;
+  if (wc < 0x00a0) {
+    *r = wc;
+    return 1;
+  }
+  else if (wc >= 0x00a0 && wc < 0x0180)
+    c = iso8859_4_page00[wc-0x00a0];
+  else if (wc >= 0x02c0 && wc < 0x02e0)
+    c = iso8859_4_page02[wc-0x02c0];
+  if (c != 0) {
+    *r = c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/iso8859_5.h b/src/xlibi18n/lcUniConv/iso8859_5.h
new file mode 100644 (file)
index 0000000..cdd6c45
--- /dev/null
@@ -0,0 +1,76 @@
+
+/*
+ * ISO-8859-5
+ */
+
+static const unsigned short iso8859_5_2uni[96] = {
+  /* 0xa0 */
+  0x00a0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407,
+  0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x00ad, 0x040e, 0x040f,
+  /* 0xb0 */
+  0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
+  0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f,
+  /* 0xc0 */
+  0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
+  0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f,
+  /* 0xd0 */
+  0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
+  0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f,
+  /* 0xe0 */
+  0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
+  0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f,
+  /* 0xf0 */
+  0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457,
+  0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x00a7, 0x045e, 0x045f,
+};
+
+static int
+iso8859_5_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c < 0xa0)
+    *pwc = (ucs4_t) c;
+  else
+    *pwc = (ucs4_t) iso8859_5_2uni[c-0xa0];
+  return 1;
+}
+
+static const unsigned char iso8859_5_page00[16] = {
+  0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, /* 0xa0-0xa7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */
+};
+static const unsigned char iso8859_5_page04[96] = {
+  0x00, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0x00-0x07 */
+  0xa8, 0xa9, 0xaa, 0xab, 0xac, 0x00, 0xae, 0xaf, /* 0x08-0x0f */
+  0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0x10-0x17 */
+  0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0x18-0x1f */
+  0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */
+  0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */
+  0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x30-0x37 */
+  0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0x38-0x3f */
+  0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */
+  0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */
+  0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x50-0x57 */
+  0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0xfe, 0xff, /* 0x58-0x5f */
+};
+
+static int
+iso8859_5_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  unsigned char c = 0;
+  if (wc < 0x00a0) {
+    *r = wc;
+    return 1;
+  }
+  else if (wc >= 0x00a0 && wc < 0x00b0)
+    c = iso8859_5_page00[wc-0x00a0];
+  else if (wc >= 0x0400 && wc < 0x0460)
+    c = iso8859_5_page04[wc-0x0400];
+  else if (wc == 0x2116)
+    c = 0xf0;
+  if (c != 0) {
+    *r = c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/iso8859_6.h b/src/xlibi18n/lcUniConv/iso8859_6.h
new file mode 100644 (file)
index 0000000..4c80a64
--- /dev/null
@@ -0,0 +1,79 @@
+
+/*
+ * ISO-8859-6
+ */
+
+static const unsigned short iso8859_6_2uni[96] = {
+  /* 0xa0 */
+  0x00a0, 0xfffd, 0xfffd, 0xfffd, 0x00a4, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x060c, 0x00ad, 0xfffd, 0xfffd,
+  /* 0xb0 */
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0x061b, 0xfffd, 0xfffd, 0xfffd, 0x061f,
+  /* 0xc0 */
+  0xfffd, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627,
+  0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f,
+  /* 0xd0 */
+  0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637,
+  0x0638, 0x0639, 0x063a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0xe0 */
+  0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647,
+  0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f,
+  /* 0xf0 */
+  0x0650, 0x0651, 0x0652, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+};
+
+static int
+iso8859_6_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c < 0xa0) {
+    *pwc = (ucs4_t) c;
+    return 1;
+  }
+  else {
+    unsigned short wc = iso8859_6_2uni[c-0xa0];
+    if (wc != 0xfffd) {
+      *pwc = (ucs4_t) wc;
+      return 1;
+    }
+  }
+  return RET_ILSEQ;
+}
+
+static const unsigned char iso8859_6_page00[16] = {
+  0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0xa8-0xaf */
+};
+static const unsigned char iso8859_6_page06[80] = {
+  0x00, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, /* 0x08-0x0f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */
+  0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0xbf, /* 0x18-0x1f */
+  0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */
+  0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */
+  0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x30-0x37 */
+  0xd8, 0xd9, 0xda, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */
+  0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */
+  0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */
+  0xf0, 0xf1, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */
+};
+
+static int
+iso8859_6_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  unsigned char c = 0;
+  if (wc < 0x00a0) {
+    *r = wc;
+    return 1;
+  }
+  else if (wc >= 0x00a0 && wc < 0x00b0)
+    c = iso8859_6_page00[wc-0x00a0];
+  else if (wc >= 0x0608 && wc < 0x0658)
+    c = iso8859_6_page06[wc-0x0608];
+  if (c != 0) {
+    *r = c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/iso8859_7.h b/src/xlibi18n/lcUniConv/iso8859_7.h
new file mode 100644 (file)
index 0000000..9b500e4
--- /dev/null
@@ -0,0 +1,87 @@
+
+/*
+ * ISO-8859-7
+ */
+
+static const unsigned short iso8859_7_2uni[96] = {
+  /* 0xa0 */
+  0x00a0, 0x2018, 0x2019, 0x00a3, 0xfffd, 0xfffd, 0x00a6, 0x00a7,
+  0x00a8, 0x00a9, 0xfffd, 0x00ab, 0x00ac, 0x00ad, 0xfffd, 0x2015,
+  /* 0xb0 */
+  0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x0385, 0x0386, 0x00b7,
+  0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f,
+  /* 0xc0 */
+  0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
+  0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f,
+  /* 0xd0 */
+  0x03a0, 0x03a1, 0xfffd, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7,
+  0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af,
+  /* 0xe0 */
+  0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7,
+  0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf,
+  /* 0xf0 */
+  0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7,
+  0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0xfffd,
+};
+
+static int
+iso8859_7_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c < 0xa0) {
+    *pwc = (ucs4_t) c;
+    return 1;
+  }
+  else {
+    unsigned short wc = iso8859_7_2uni[c-0xa0];
+    if (wc != 0xfffd) {
+      *pwc = (ucs4_t) wc;
+      return 1;
+    }
+  }
+  return RET_ILSEQ;
+}
+
+static const unsigned char iso8859_7_page00[32] = {
+  0xa0, 0x00, 0x00, 0xa3, 0x00, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */
+  0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0x00, 0x00, /* 0xa8-0xaf */
+  0xb0, 0xb1, 0xb2, 0xb3, 0x00, 0x00, 0x00, 0xb7, /* 0xb0-0xb7 */
+  0x00, 0x00, 0x00, 0xbb, 0x00, 0xbd, 0x00, 0x00, /* 0xb8-0xbf */
+};
+static const unsigned char iso8859_7_page03[80] = {
+  0x00, 0x00, 0x00, 0x00, 0xb4, 0xb5, 0xb6, 0x00, /* 0x80-0x87 */
+  0xb8, 0xb9, 0xba, 0x00, 0xbc, 0x00, 0xbe, 0xbf, /* 0x88-0x8f */
+  0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x90-0x97 */
+  0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x98-0x9f */
+  0xd0, 0xd1, 0x00, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xa0-0xa7 */
+  0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0xa8-0xaf */
+  0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xb0-0xb7 */
+  0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xb8-0xbf */
+  0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xc0-0xc7 */
+  0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0x00, /* 0xc8-0xcf */
+};
+static const unsigned char iso8859_7_page20[16] = {
+  0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0x00, 0x00, /* 0x10-0x17 */
+  0xa1, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */
+};
+
+static int
+iso8859_7_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  unsigned char c = 0;
+  if (wc < 0x00a0) {
+    *r = wc;
+    return 1;
+  }
+  else if (wc >= 0x00a0 && wc < 0x00c0)
+    c = iso8859_7_page00[wc-0x00a0];
+  else if (wc >= 0x0380 && wc < 0x03d0)
+    c = iso8859_7_page03[wc-0x0380];
+  else if (wc >= 0x2010 && wc < 0x2020)
+    c = iso8859_7_page20[wc-0x2010];
+  if (c != 0) {
+    *r = c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/iso8859_8.h b/src/xlibi18n/lcUniConv/iso8859_8.h
new file mode 100644 (file)
index 0000000..152dc3c
--- /dev/null
@@ -0,0 +1,88 @@
+
+/*
+ * ISO-8859-8
+ */
+
+static const unsigned short iso8859_8_2uni[96] = {
+  /* 0xa0 */
+  0x00a0, 0xfffd, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+  0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+  /* 0xb0 */
+  0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+  0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0xfffd,
+  /* 0xc0 */
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0xd0 */
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2017,
+  /* 0xe0 */
+  0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7,
+  0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df,
+  /* 0xf0 */
+  0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7,
+  0x05e8, 0x05e9, 0x05ea, 0xfffd, 0xfffd, 0x200e, 0x200f, 0xfffd,
+};
+
+static int
+iso8859_8_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c >= 0xa0) {
+    unsigned short wc = iso8859_8_2uni[c-0xa0];
+    if (wc != 0xfffd) {
+      *pwc = (ucs4_t) wc;
+      return 1;
+    }
+  }
+  else {
+    *pwc = (ucs4_t) c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
+
+static const unsigned char iso8859_8_page00[88] = {
+  0xa0, 0x00, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0xa0-0xa7 */
+  0xa8, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0xa8-0xaf */
+  0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */
+  0xb8, 0xb9, 0x00, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, /* 0xb8-0xbf */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, /* 0xd0-0xd7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, /* 0xf0-0xf7 */
+};
+static const unsigned char iso8859_8_page05[32] = {
+  0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xd0-0xd7 */
+  0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xd8-0xdf */
+  0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xe0-0xe7 */
+  0xf8, 0xf9, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */
+};
+static const unsigned char iso8859_8_page20[16] = {
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xfe, /* 0x08-0x0f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, /* 0x10-0x17 */
+};
+
+static int
+iso8859_8_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  unsigned char c = 0;
+  if (wc < 0x00a0) {
+    *r = wc;
+    return 1;
+  }
+  else if (wc >= 0x00a0 && wc < 0x00f8)
+    c = iso8859_8_page00[wc-0x00a0];
+  else if (wc >= 0x05d0 && wc < 0x05f0)
+    c = iso8859_8_page05[wc-0x05d0];
+  else if (wc >= 0x2008 && wc < 0x2018)
+    c = iso8859_8_page20[wc-0x2008];
+  if (c != 0) {
+    *r = c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/iso8859_9.h b/src/xlibi18n/lcUniConv/iso8859_9.h
new file mode 100644 (file)
index 0000000..b94ac9d
--- /dev/null
@@ -0,0 +1,66 @@
+
+/*
+ * ISO-8859-9
+ */
+
+static const unsigned short iso8859_9_2uni[48] = {
+  /* 0xd0 */
+  0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
+  0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df,
+  /* 0xe0 */
+  0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+  0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+  /* 0xf0 */
+  0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+  0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff,
+};
+
+static int
+iso8859_9_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c >= 0xd0)
+    *pwc = (ucs4_t) iso8859_9_2uni[c-0xd0];
+  else
+    *pwc = (ucs4_t) c;
+  return 1;
+}
+
+static const unsigned char iso8859_9_page00[48] = {
+  0x00, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xd0-0xd7 */
+  0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0x00, 0x00, 0xdf, /* 0xd8-0xdf */
+  0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0xe0-0xe7 */
+  0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */
+  0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xf0-0xf7 */
+  0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x00, 0x00, 0xff, /* 0xf8-0xff */
+};
+static const unsigned char iso8859_9_page01[72] = {
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xf0, /* 0x18-0x1f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */
+  0xdd, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xfe, /* 0x58-0x5f */
+};
+
+static int
+iso8859_9_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  unsigned char c = 0;
+  if (wc < 0x00d0) {
+    *r = wc;
+    return 1;
+  }
+  else if (wc >= 0x00d0 && wc < 0x0100)
+    c = iso8859_9_page00[wc-0x00d0];
+  else if (wc >= 0x0118 && wc < 0x0160)
+    c = iso8859_9_page01[wc-0x0118];
+  if (c != 0) {
+    *r = c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/iso8859_9e.h b/src/xlibi18n/lcUniConv/iso8859_9e.h
new file mode 100644 (file)
index 0000000..cbab581
--- /dev/null
@@ -0,0 +1,102 @@
+
+/*
+ * ISO-8859-9E
+ */
+
+static const unsigned short iso8859_9e_2uni[96] = {
+  /* 0xa0 */
+  0x00a0, 0x017d, 0x00a2, 0x00a3, 0x20ac, 0x00a5, 0x012c, 0x00a7,
+  0x016c, 0x00a9, 0x01e6, 0x00ab, 0x014a, 0x00ad, 0x00ae, 0x01d1,
+  /* 0xb0 */
+  0x00b0, 0x017e, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x012d, 0x00b7,
+  0x016d, 0x00b9, 0x01e7, 0x00bb, 0x014b, 0x00bd, 0x0178, 0x01d2,
+  /* 0xc0 */
+  0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x018f, 0x00c7,
+  0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+  /* 0xd0 */
+  0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00dd,
+  0x019f, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df,
+  /* 0xe0 */
+  0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x0259, 0x00e7,
+  0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+  /* 0xf0 */
+  0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00fd,
+  0x0275, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff,
+};
+
+static int
+iso8859_9e_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c >= 0xa0)
+    *pwc = (ucs4_t) iso8859_9e_2uni[c-0xa0];
+  else
+    *pwc = (ucs4_t) c;
+  return 1;
+}
+
+static const unsigned char iso8859_9e_page00[96] = {
+  0xa0, 0x00, 0xa2, 0xa3, 0x00, 0xa5, 0x00, 0xa7, /* 0xa0-0xa7 */
+  0x00, 0xa9, 0x00, 0xab, 0x00, 0xad, 0xae, 0x00, /* 0xa8-0xaf */
+  0xb0, 0x00, 0xb2, 0xb3, 0xb4, 0xb5, 0x00, 0xb7, /* 0xb0-0xb7 */
+  0x00, 0xb9, 0x00, 0xbb, 0x00, 0xbd, 0x00, 0x00, /* 0xb8-0xbf */
+  0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0x00, 0xc7, /* 0xc0-0xc7 */
+  0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0xc8-0xcf */
+  0x00, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0x00, /* 0xd0-0xd7 */
+  0x00, 0xd9, 0xda, 0xdb, 0xdc, 0xd7, 0x00, 0xdf, /* 0xd8-0xdf */
+  0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0x00, 0xe7, /* 0xe0-0xe7 */
+  0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0xe8-0xef */
+  0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0x00, /* 0xf0-0xf7 */
+  0x00, 0xf9, 0xfa, 0xfb, 0xfc, 0xf7, 0x00, 0xff, /* 0xf8-0xff */
+};
+static const unsigned char iso8859_9e_page01[136] = {
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xf0, /* 0x18-0x1f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */
+  0x00, 0x00, 0x00, 0x00, 0xa6, 0xb6, 0x00, 0x00, /* 0x28-0x2f */
+  0xdd, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */
+  0x00, 0x00, 0xac, 0xbc, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xfe, /* 0x58-0x5f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */
+  0x00, 0x00, 0x00, 0x00, 0xa8, 0xb8, 0x00, 0x00, /* 0x68-0x6f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */
+  0xbe, 0x00, 0x00, 0x00, 0x00, 0xa1, 0xb1, 0x00, /* 0x78-0x7f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, /* 0x88-0x8f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, /* 0x98-0x9f */
+};
+static const unsigned char iso8859_9e_page01_d[24] = {
+  0x00, 0xaf, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xba, /* 0xe0-0xe7 */
+};
+  
+static int
+iso8859_9e_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  unsigned char c = 0;
+  if (wc < 0x00a0) {
+    *r = wc;
+    return 1;
+  }
+  else if (wc >= 0x00a0 && wc < 0x0100)
+    c = iso8859_9e_page00[wc-0x00a0];
+  else if (wc >= 0x0118 && wc < 0x01a0)
+    c = iso8859_9e_page01[wc-0x0118];
+  else if (wc >= 0x01d0 && wc < 0x01e8)
+    c = iso8859_9e_page01_d[wc-0x01d0];
+  else if (wc == 0x0259)
+    c = 0xe6;
+  else if (wc == 0x0275)
+    c = 0xf8;
+  else if (wc == 0x20ac)
+    c = 0xa4;
+  if (c != 0) {
+    *r = c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/jisx0201.h b/src/xlibi18n/lcUniConv/jisx0201.h
new file mode 100644 (file)
index 0000000..e4af966
--- /dev/null
@@ -0,0 +1,47 @@
+
+/*
+ * JISX0201.1976-0
+ */
+
+static int
+jisx0201_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c < 0x80) {
+    if (c == 0x5c)
+      *pwc = (ucs4_t) 0x00a5;
+    else if (c == 0x7e)
+      *pwc = (ucs4_t) 0x203e;
+    else
+      *pwc = (ucs4_t) c;
+    return 1;
+  } else {
+    if (c >= 0xa1 && c < 0xe0) {
+      *pwc = (ucs4_t) c + 0xfec0;
+      return 1;
+    }
+  }
+  return RET_ILSEQ;
+}
+
+static int
+jisx0201_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  if (wc < 0x0080 && !(wc == 0x005c || wc == 0x007e)) {
+    *r = wc;
+    return 1;
+  }
+  if (wc == 0x00a5) {
+    *r = 0x5c;
+    return 1;
+  }
+  if (wc == 0x203e) {
+    *r = 0x7e;
+    return 1;
+  }
+  if (wc >= 0xff61 && wc < 0xffa0) {
+    *r = wc - 0xfec0;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/jisx0208.h b/src/xlibi18n/lcUniConv/jisx0208.h
new file mode 100644 (file)
index 0000000..5888f6f
--- /dev/null
@@ -0,0 +1,2396 @@
+
+/*
+ * JISX0208.1990-0
+ */
+
+static const unsigned short jisx0208_2uni_page21[690] = {
+  /* 0x21 */
+  0x3000, 0x3001, 0x3002, 0xff0c, 0xff0e, 0x30fb, 0xff1a, 0xff1b,
+  0xff1f, 0xff01, 0x309b, 0x309c, 0x00b4, 0xff40, 0x00a8, 0xff3e,
+  0xffe3, 0xff3f, 0x30fd, 0x30fe, 0x309d, 0x309e, 0x3003, 0x4edd,
+  0x3005, 0x3006, 0x3007, 0x30fc, 0x2015, 0x2010, 0xff0f, 0xff3c,
+  0x301c, 0x2016, 0xff5c, 0x2026, 0x2025, 0x2018, 0x2019, 0x201c,
+  0x201d, 0xff08, 0xff09, 0x3014, 0x3015, 0xff3b, 0xff3d, 0xff5b,
+  0xff5d, 0x3008, 0x3009, 0x300a, 0x300b, 0x300c, 0x300d, 0x300e,
+  0x300f, 0x3010, 0x3011, 0xff0b, 0x2212, 0x00b1, 0x00d7, 0x00f7,
+  0xff1d, 0x2260, 0xff1c, 0xff1e, 0x2266, 0x2267, 0x221e, 0x2234,
+  0x2642, 0x2640, 0x00b0, 0x2032, 0x2033, 0x2103, 0xffe5, 0xff04,
+  0x00a2, 0x00a3, 0xff05, 0xff03, 0xff06, 0xff0a, 0xff20, 0x00a7,
+  0x2606, 0x2605, 0x25cb, 0x25cf, 0x25ce, 0x25c7,
+  /* 0x22 */
+  0x25c6, 0x25a1, 0x25a0, 0x25b3, 0x25b2, 0x25bd, 0x25bc, 0x203b,
+  0x3012, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0x2208, 0x220b, 0x2286, 0x2287, 0x2282, 0x2283, 0x222a,
+  0x2229, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0x2227, 0x2228, 0x00ac, 0x21d2, 0x21d4, 0x2200, 0x2203,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0x2220, 0x22a5, 0x2312, 0x2202, 0x2207,
+  0x2261, 0x2252, 0x226a, 0x226b, 0x221a, 0x223d, 0x221d, 0x2235,
+  0x222b, 0x222c, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0x212b, 0x2030, 0x266f, 0x266d, 0x266a, 0x2020, 0x2021,
+  0x00b6, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x25ef,
+  /* 0x23 */
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xff10,
+  0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18,
+  0xff19, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28,
+  0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30,
+  0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38,
+  0xff39, 0xff3a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48,
+  0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50,
+  0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, 0xff58,
+  0xff59, 0xff5a, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0x24 */
+  0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048,
+  0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f, 0x3050,
+  0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058,
+  0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f, 0x3060,
+  0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068,
+  0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070,
+  0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078,
+  0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x307f, 0x3080,
+  0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088,
+  0x3089, 0x308a, 0x308b, 0x308c, 0x308d, 0x308e, 0x308f, 0x3090,
+  0x3091, 0x3092, 0x3093, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0x25 */
+  0x30a1, 0x30a2, 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7, 0x30a8,
+  0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad, 0x30ae, 0x30af, 0x30b0,
+  0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5, 0x30b6, 0x30b7, 0x30b8,
+  0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd, 0x30be, 0x30bf, 0x30c0,
+  0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5, 0x30c6, 0x30c7, 0x30c8,
+  0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf, 0x30d0,
+  0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5, 0x30d6, 0x30d7, 0x30d8,
+  0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd, 0x30de, 0x30df, 0x30e0,
+  0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7, 0x30e8,
+  0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ee, 0x30ef, 0x30f0,
+  0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5, 0x30f6, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0x26 */
+  0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398,
+  0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0,
+  0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8,
+  0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0,
+  0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0x27 */
+  0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 0x0416,
+  0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e,
+  0x041f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426,
+  0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e,
+  0x042f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436,
+  0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e,
+  0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446,
+  0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e,
+  0x044f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0x28 */
+  0x2500, 0x2502, 0x250c, 0x2510, 0x2518, 0x2514, 0x251c, 0x252c,
+  0x2524, 0x2534, 0x253c, 0x2501, 0x2503, 0x250f, 0x2513, 0x251b,
+  0x2517, 0x2523, 0x2533, 0x252b, 0x253b, 0x254b, 0x2520, 0x252f,
+  0x2528, 0x2537, 0x253f, 0x251d, 0x2530, 0x2525, 0x2538, 0x2542,
+};
+static const unsigned short jisx0208_2uni_page30[6398] = {
+  /* 0x30 */
+  0x4e9c, 0x5516, 0x5a03, 0x963f, 0x54c0, 0x611b, 0x6328, 0x59f6,
+  0x9022, 0x8475, 0x831c, 0x7a50, 0x60aa, 0x63e1, 0x6e25, 0x65ed,
+  0x8466, 0x82a6, 0x9bf5, 0x6893, 0x5727, 0x65a1, 0x6271, 0x5b9b,
+  0x59d0, 0x867b, 0x98f4, 0x7d62, 0x7dbe, 0x9b8e, 0x6216, 0x7c9f,
+  0x88b7, 0x5b89, 0x5eb5, 0x6309, 0x6697, 0x6848, 0x95c7, 0x978d,
+  0x674f, 0x4ee5, 0x4f0a, 0x4f4d, 0x4f9d, 0x5049, 0x56f2, 0x5937,
+  0x59d4, 0x5a01, 0x5c09, 0x60df, 0x610f, 0x6170, 0x6613, 0x6905,
+  0x70ba, 0x754f, 0x7570, 0x79fb, 0x7dad, 0x7def, 0x80c3, 0x840e,
+  0x8863, 0x8b02, 0x9055, 0x907a, 0x533b, 0x4e95, 0x4ea5, 0x57df,
+  0x80b2, 0x90c1, 0x78ef, 0x4e00, 0x58f1, 0x6ea2, 0x9038, 0x7a32,
+  0x8328, 0x828b, 0x9c2f, 0x5141, 0x5370, 0x54bd, 0x54e1, 0x56e0,
+  0x59fb, 0x5f15, 0x98f2, 0x6deb, 0x80e4, 0x852d,
+  /* 0x31 */
+  0x9662, 0x9670, 0x96a0, 0x97fb, 0x540b, 0x53f3, 0x5b87, 0x70cf,
+  0x7fbd, 0x8fc2, 0x96e8, 0x536f, 0x9d5c, 0x7aba, 0x4e11, 0x7893,
+  0x81fc, 0x6e26, 0x5618, 0x5504, 0x6b1d, 0x851a, 0x9c3b, 0x59e5,
+  0x53a9, 0x6d66, 0x74dc, 0x958f, 0x5642, 0x4e91, 0x904b, 0x96f2,
+  0x834f, 0x990c, 0x53e1, 0x55b6, 0x5b30, 0x5f71, 0x6620, 0x66f3,
+  0x6804, 0x6c38, 0x6cf3, 0x6d29, 0x745b, 0x76c8, 0x7a4e, 0x9834,
+  0x82f1, 0x885b, 0x8a60, 0x92ed, 0x6db2, 0x75ab, 0x76ca, 0x99c5,
+  0x60a6, 0x8b01, 0x8d8a, 0x95b2, 0x698e, 0x53ad, 0x5186, 0x5712,
+  0x5830, 0x5944, 0x5bb4, 0x5ef6, 0x6028, 0x63a9, 0x63f4, 0x6cbf,
+  0x6f14, 0x708e, 0x7114, 0x7159, 0x71d5, 0x733f, 0x7e01, 0x8276,
+  0x82d1, 0x8597, 0x9060, 0x925b, 0x9d1b, 0x5869, 0x65bc, 0x6c5a,
+  0x7525, 0x51f9, 0x592e, 0x5965, 0x5f80, 0x5fdc,
+  /* 0x32 */
+  0x62bc, 0x65fa, 0x6a2a, 0x6b27, 0x6bb4, 0x738b, 0x7fc1, 0x8956,
+  0x9d2c, 0x9d0e, 0x9ec4, 0x5ca1, 0x6c96, 0x837b, 0x5104, 0x5c4b,
+  0x61b6, 0x81c6, 0x6876, 0x7261, 0x4e59, 0x4ffa, 0x5378, 0x6069,
+  0x6e29, 0x7a4f, 0x97f3, 0x4e0b, 0x5316, 0x4eee, 0x4f55, 0x4f3d,
+  0x4fa1, 0x4f73, 0x52a0, 0x53ef, 0x5609, 0x590f, 0x5ac1, 0x5bb6,
+  0x5be1, 0x79d1, 0x6687, 0x679c, 0x67b6, 0x6b4c, 0x6cb3, 0x706b,
+  0x73c2, 0x798d, 0x79be, 0x7a3c, 0x7b87, 0x82b1, 0x82db, 0x8304,
+  0x8377, 0x83ef, 0x83d3, 0x8766, 0x8ab2, 0x5629, 0x8ca8, 0x8fe6,
+  0x904e, 0x971e, 0x868a, 0x4fc4, 0x5ce8, 0x6211, 0x7259, 0x753b,
+  0x81e5, 0x82bd, 0x86fe, 0x8cc0, 0x96c5, 0x9913, 0x99d5, 0x4ecb,
+  0x4f1a, 0x89e3, 0x56de, 0x584a, 0x58ca, 0x5efb, 0x5feb, 0x602a,
+  0x6094, 0x6062, 0x61d0, 0x6212, 0x62d0, 0x6539,
+  /* 0x33 */
+  0x9b41, 0x6666, 0x68b0, 0x6d77, 0x7070, 0x754c, 0x7686, 0x7d75,
+  0x82a5, 0x87f9, 0x958b, 0x968e, 0x8c9d, 0x51f1, 0x52be, 0x5916,
+  0x54b3, 0x5bb3, 0x5d16, 0x6168, 0x6982, 0x6daf, 0x788d, 0x84cb,
+  0x8857, 0x8a72, 0x93a7, 0x9ab8, 0x6d6c, 0x99a8, 0x86d9, 0x57a3,
+  0x67ff, 0x86ce, 0x920e, 0x5283, 0x5687, 0x5404, 0x5ed3, 0x62e1,
+  0x64b9, 0x683c, 0x6838, 0x6bbb, 0x7372, 0x78ba, 0x7a6b, 0x899a,
+  0x89d2, 0x8d6b, 0x8f03, 0x90ed, 0x95a3, 0x9694, 0x9769, 0x5b66,
+  0x5cb3, 0x697d, 0x984d, 0x984e, 0x639b, 0x7b20, 0x6a2b, 0x6a7f,
+  0x68b6, 0x9c0d, 0x6f5f, 0x5272, 0x559d, 0x6070, 0x62ec, 0x6d3b,
+  0x6e07, 0x6ed1, 0x845b, 0x8910, 0x8f44, 0x4e14, 0x9c39, 0x53f6,
+  0x691b, 0x6a3a, 0x9784, 0x682a, 0x515c, 0x7ac3, 0x84b2, 0x91dc,
+  0x938c, 0x565b, 0x9d28, 0x6822, 0x8305, 0x8431,
+  /* 0x34 */
+  0x7ca5, 0x5208, 0x82c5, 0x74e6, 0x4e7e, 0x4f83, 0x51a0, 0x5bd2,
+  0x520a, 0x52d8, 0x52e7, 0x5dfb, 0x559a, 0x582a, 0x59e6, 0x5b8c,
+  0x5b98, 0x5bdb, 0x5e72, 0x5e79, 0x60a3, 0x611f, 0x6163, 0x61be,
+  0x63db, 0x6562, 0x67d1, 0x6853, 0x68fa, 0x6b3e, 0x6b53, 0x6c57,
+  0x6f22, 0x6f97, 0x6f45, 0x74b0, 0x7518, 0x76e3, 0x770b, 0x7aff,
+  0x7ba1, 0x7c21, 0x7de9, 0x7f36, 0x7ff0, 0x809d, 0x8266, 0x839e,
+  0x89b3, 0x8acc, 0x8cab, 0x9084, 0x9451, 0x9593, 0x9591, 0x95a2,
+  0x9665, 0x97d3, 0x9928, 0x8218, 0x4e38, 0x542b, 0x5cb8, 0x5dcc,
+  0x73a9, 0x764c, 0x773c, 0x5ca9, 0x7feb, 0x8d0b, 0x96c1, 0x9811,
+  0x9854, 0x9858, 0x4f01, 0x4f0e, 0x5371, 0x559c, 0x5668, 0x57fa,
+  0x5947, 0x5b09, 0x5bc4, 0x5c90, 0x5e0c, 0x5e7e, 0x5fcc, 0x63ee,
+  0x673a, 0x65d7, 0x65e2, 0x671f, 0x68cb, 0x68c4,
+  /* 0x35 */
+  0x6a5f, 0x5e30, 0x6bc5, 0x6c17, 0x6c7d, 0x757f, 0x7948, 0x5b63,
+  0x7a00, 0x7d00, 0x5fbd, 0x898f, 0x8a18, 0x8cb4, 0x8d77, 0x8ecc,
+  0x8f1d, 0x98e2, 0x9a0e, 0x9b3c, 0x4e80, 0x507d, 0x5100, 0x5993,
+  0x5b9c, 0x622f, 0x6280, 0x64ec, 0x6b3a, 0x72a0, 0x7591, 0x7947,
+  0x7fa9, 0x87fb, 0x8abc, 0x8b70, 0x63ac, 0x83ca, 0x97a0, 0x5409,
+  0x5403, 0x55ab, 0x6854, 0x6a58, 0x8a70, 0x7827, 0x6775, 0x9ecd,
+  0x5374, 0x5ba2, 0x811a, 0x8650, 0x9006, 0x4e18, 0x4e45, 0x4ec7,
+  0x4f11, 0x53ca, 0x5438, 0x5bae, 0x5f13, 0x6025, 0x6551, 0x673d,
+  0x6c42, 0x6c72, 0x6ce3, 0x7078, 0x7403, 0x7a76, 0x7aae, 0x7b08,
+  0x7d1a, 0x7cfe, 0x7d66, 0x65e7, 0x725b, 0x53bb, 0x5c45, 0x5de8,
+  0x62d2, 0x62e0, 0x6319, 0x6e20, 0x865a, 0x8a31, 0x8ddd, 0x92f8,
+  0x6f01, 0x79a6, 0x9b5a, 0x4ea8, 0x4eab, 0x4eac,
+  /* 0x36 */
+  0x4f9b, 0x4fa0, 0x50d1, 0x5147, 0x7af6, 0x5171, 0x51f6, 0x5354,
+  0x5321, 0x537f, 0x53eb, 0x55ac, 0x5883, 0x5ce1, 0x5f37, 0x5f4a,
+  0x602f, 0x6050, 0x606d, 0x631f, 0x6559, 0x6a4b, 0x6cc1, 0x72c2,
+  0x72ed, 0x77ef, 0x80f8, 0x8105, 0x8208, 0x854e, 0x90f7, 0x93e1,
+  0x97ff, 0x9957, 0x9a5a, 0x4ef0, 0x51dd, 0x5c2d, 0x6681, 0x696d,
+  0x5c40, 0x66f2, 0x6975, 0x7389, 0x6850, 0x7c81, 0x50c5, 0x52e4,
+  0x5747, 0x5dfe, 0x9326, 0x65a4, 0x6b23, 0x6b3d, 0x7434, 0x7981,
+  0x79bd, 0x7b4b, 0x7dca, 0x82b9, 0x83cc, 0x887f, 0x895f, 0x8b39,
+  0x8fd1, 0x91d1, 0x541f, 0x9280, 0x4e5d, 0x5036, 0x53e5, 0x533a,
+  0x72d7, 0x7396, 0x77e9, 0x82e6, 0x8eaf, 0x99c6, 0x99c8, 0x99d2,
+  0x5177, 0x611a, 0x865e, 0x55b0, 0x7a7a, 0x5076, 0x5bd3, 0x9047,
+  0x9685, 0x4e32, 0x6adb, 0x91e7, 0x5c51, 0x5c48,
+  /* 0x37 */
+  0x6398, 0x7a9f, 0x6c93, 0x9774, 0x8f61, 0x7aaa, 0x718a, 0x9688,
+  0x7c82, 0x6817, 0x7e70, 0x6851, 0x936c, 0x52f2, 0x541b, 0x85ab,
+  0x8a13, 0x7fa4, 0x8ecd, 0x90e1, 0x5366, 0x8888, 0x7941, 0x4fc2,
+  0x50be, 0x5211, 0x5144, 0x5553, 0x572d, 0x73ea, 0x578b, 0x5951,
+  0x5f62, 0x5f84, 0x6075, 0x6176, 0x6167, 0x61a9, 0x63b2, 0x643a,
+  0x656c, 0x666f, 0x6842, 0x6e13, 0x7566, 0x7a3d, 0x7cfb, 0x7d4c,
+  0x7d99, 0x7e4b, 0x7f6b, 0x830e, 0x834a, 0x86cd, 0x8a08, 0x8a63,
+  0x8b66, 0x8efd, 0x981a, 0x9d8f, 0x82b8, 0x8fce, 0x9be8, 0x5287,
+  0x621f, 0x6483, 0x6fc0, 0x9699, 0x6841, 0x5091, 0x6b20, 0x6c7a,
+  0x6f54, 0x7a74, 0x7d50, 0x8840, 0x8a23, 0x6708, 0x4ef6, 0x5039,
+  0x5026, 0x5065, 0x517c, 0x5238, 0x5263, 0x55a7, 0x570f, 0x5805,
+  0x5acc, 0x5efa, 0x61b2, 0x61f8, 0x62f3, 0x6372,
+  /* 0x38 */
+  0x691c, 0x6a29, 0x727d, 0x72ac, 0x732e, 0x7814, 0x786f, 0x7d79,
+  0x770c, 0x80a9, 0x898b, 0x8b19, 0x8ce2, 0x8ed2, 0x9063, 0x9375,
+  0x967a, 0x9855, 0x9a13, 0x9e78, 0x5143, 0x539f, 0x53b3, 0x5e7b,
+  0x5f26, 0x6e1b, 0x6e90, 0x7384, 0x73fe, 0x7d43, 0x8237, 0x8a00,
+  0x8afa, 0x9650, 0x4e4e, 0x500b, 0x53e4, 0x547c, 0x56fa, 0x59d1,
+  0x5b64, 0x5df1, 0x5eab, 0x5f27, 0x6238, 0x6545, 0x67af, 0x6e56,
+  0x72d0, 0x7cca, 0x88b4, 0x80a1, 0x80e1, 0x83f0, 0x864e, 0x8a87,
+  0x8de8, 0x9237, 0x96c7, 0x9867, 0x9f13, 0x4e94, 0x4e92, 0x4f0d,
+  0x5348, 0x5449, 0x543e, 0x5a2f, 0x5f8c, 0x5fa1, 0x609f, 0x68a7,
+  0x6a8e, 0x745a, 0x7881, 0x8a9e, 0x8aa4, 0x8b77, 0x9190, 0x4e5e,
+  0x9bc9, 0x4ea4, 0x4f7c, 0x4faf, 0x5019, 0x5016, 0x5149, 0x516c,
+  0x529f, 0x52b9, 0x52fe, 0x539a, 0x53e3, 0x5411,
+  /* 0x39 */
+  0x540e, 0x5589, 0x5751, 0x57a2, 0x597d, 0x5b54, 0x5b5d, 0x5b8f,
+  0x5de5, 0x5de7, 0x5df7, 0x5e78, 0x5e83, 0x5e9a, 0x5eb7, 0x5f18,
+  0x6052, 0x614c, 0x6297, 0x62d8, 0x63a7, 0x653b, 0x6602, 0x6643,
+  0x66f4, 0x676d, 0x6821, 0x6897, 0x69cb, 0x6c5f, 0x6d2a, 0x6d69,
+  0x6e2f, 0x6e9d, 0x7532, 0x7687, 0x786c, 0x7a3f, 0x7ce0, 0x7d05,
+  0x7d18, 0x7d5e, 0x7db1, 0x8015, 0x8003, 0x80af, 0x80b1, 0x8154,
+  0x818f, 0x822a, 0x8352, 0x884c, 0x8861, 0x8b1b, 0x8ca2, 0x8cfc,
+  0x90ca, 0x9175, 0x9271, 0x783f, 0x92fc, 0x95a4, 0x964d, 0x9805,
+  0x9999, 0x9ad8, 0x9d3b, 0x525b, 0x52ab, 0x53f7, 0x5408, 0x58d5,
+  0x62f7, 0x6fe0, 0x8c6a, 0x8f5f, 0x9eb9, 0x514b, 0x523b, 0x544a,
+  0x56fd, 0x7a40, 0x9177, 0x9d60, 0x9ed2, 0x7344, 0x6f09, 0x8170,
+  0x7511, 0x5ffd, 0x60da, 0x9aa8, 0x72db, 0x8fbc,
+  /* 0x3a */
+  0x6b64, 0x9803, 0x4eca, 0x56f0, 0x5764, 0x58be, 0x5a5a, 0x6068,
+  0x61c7, 0x660f, 0x6606, 0x6839, 0x68b1, 0x6df7, 0x75d5, 0x7d3a,
+  0x826e, 0x9b42, 0x4e9b, 0x4f50, 0x53c9, 0x5506, 0x5d6f, 0x5de6,
+  0x5dee, 0x67fb, 0x6c99, 0x7473, 0x7802, 0x8a50, 0x9396, 0x88df,
+  0x5750, 0x5ea7, 0x632b, 0x50b5, 0x50ac, 0x518d, 0x6700, 0x54c9,
+  0x585e, 0x59bb, 0x5bb0, 0x5f69, 0x624d, 0x63a1, 0x683d, 0x6b73,
+  0x6e08, 0x707d, 0x91c7, 0x7280, 0x7815, 0x7826, 0x796d, 0x658e,
+  0x7d30, 0x83dc, 0x88c1, 0x8f09, 0x969b, 0x5264, 0x5728, 0x6750,
+  0x7f6a, 0x8ca1, 0x51b4, 0x5742, 0x962a, 0x583a, 0x698a, 0x80b4,
+  0x54b2, 0x5d0e, 0x57fc, 0x7895, 0x9dfa, 0x4f5c, 0x524a, 0x548b,
+  0x643e, 0x6628, 0x6714, 0x67f5, 0x7a84, 0x7b56, 0x7d22, 0x932f,
+  0x685c, 0x9bad, 0x7b39, 0x5319, 0x518a, 0x5237,
+  /* 0x3b */
+  0x5bdf, 0x62f6, 0x64ae, 0x64e6, 0x672d, 0x6bba, 0x85a9, 0x96d1,
+  0x7690, 0x9bd6, 0x634c, 0x9306, 0x9bab, 0x76bf, 0x6652, 0x4e09,
+  0x5098, 0x53c2, 0x5c71, 0x60e8, 0x6492, 0x6563, 0x685f, 0x71e6,
+  0x73ca, 0x7523, 0x7b97, 0x7e82, 0x8695, 0x8b83, 0x8cdb, 0x9178,
+  0x9910, 0x65ac, 0x66ab, 0x6b8b, 0x4ed5, 0x4ed4, 0x4f3a, 0x4f7f,
+  0x523a, 0x53f8, 0x53f2, 0x55e3, 0x56db, 0x58eb, 0x59cb, 0x59c9,
+  0x59ff, 0x5b50, 0x5c4d, 0x5e02, 0x5e2b, 0x5fd7, 0x601d, 0x6307,
+  0x652f, 0x5b5c, 0x65af, 0x65bd, 0x65e8, 0x679d, 0x6b62, 0x6b7b,
+  0x6c0f, 0x7345, 0x7949, 0x79c1, 0x7cf8, 0x7d19, 0x7d2b, 0x80a2,
+  0x8102, 0x81f3, 0x8996, 0x8a5e, 0x8a69, 0x8a66, 0x8a8c, 0x8aee,
+  0x8cc7, 0x8cdc, 0x96cc, 0x98fc, 0x6b6f, 0x4e8b, 0x4f3c, 0x4f8d,
+  0x5150, 0x5b57, 0x5bfa, 0x6148, 0x6301, 0x6642,
+  /* 0x3c */
+  0x6b21, 0x6ecb, 0x6cbb, 0x723e, 0x74bd, 0x75d4, 0x78c1, 0x793a,
+  0x800c, 0x8033, 0x81ea, 0x8494, 0x8f9e, 0x6c50, 0x9e7f, 0x5f0f,
+  0x8b58, 0x9d2b, 0x7afa, 0x8ef8, 0x5b8d, 0x96eb, 0x4e03, 0x53f1,
+  0x57f7, 0x5931, 0x5ac9, 0x5ba4, 0x6089, 0x6e7f, 0x6f06, 0x75be,
+  0x8cea, 0x5b9f, 0x8500, 0x7be0, 0x5072, 0x67f4, 0x829d, 0x5c61,
+  0x854a, 0x7e1e, 0x820e, 0x5199, 0x5c04, 0x6368, 0x8d66, 0x659c,
+  0x716e, 0x793e, 0x7d17, 0x8005, 0x8b1d, 0x8eca, 0x906e, 0x86c7,
+  0x90aa, 0x501f, 0x52fa, 0x5c3a, 0x6753, 0x707c, 0x7235, 0x914c,
+  0x91c8, 0x932b, 0x82e5, 0x5bc2, 0x5f31, 0x60f9, 0x4e3b, 0x53d6,
+  0x5b88, 0x624b, 0x6731, 0x6b8a, 0x72e9, 0x73e0, 0x7a2e, 0x816b,
+  0x8da3, 0x9152, 0x9996, 0x5112, 0x53d7, 0x546a, 0x5bff, 0x6388,
+  0x6a39, 0x7dac, 0x9700, 0x56da, 0x53ce, 0x5468,
+  /* 0x3d */
+  0x5b97, 0x5c31, 0x5dde, 0x4fee, 0x6101, 0x62fe, 0x6d32, 0x79c0,
+  0x79cb, 0x7d42, 0x7e4d, 0x7fd2, 0x81ed, 0x821f, 0x8490, 0x8846,
+  0x8972, 0x8b90, 0x8e74, 0x8f2f, 0x9031, 0x914b, 0x916c, 0x96c6,
+  0x919c, 0x4ec0, 0x4f4f, 0x5145, 0x5341, 0x5f93, 0x620e, 0x67d4,
+  0x6c41, 0x6e0b, 0x7363, 0x7e26, 0x91cd, 0x9283, 0x53d4, 0x5919,
+  0x5bbf, 0x6dd1, 0x795d, 0x7e2e, 0x7c9b, 0x587e, 0x719f, 0x51fa,
+  0x8853, 0x8ff0, 0x4fca, 0x5cfb, 0x6625, 0x77ac, 0x7ae3, 0x821c,
+  0x99ff, 0x51c6, 0x5faa, 0x65ec, 0x696f, 0x6b89, 0x6df3, 0x6e96,
+  0x6f64, 0x76fe, 0x7d14, 0x5de1, 0x9075, 0x9187, 0x9806, 0x51e6,
+  0x521d, 0x6240, 0x6691, 0x66d9, 0x6e1a, 0x5eb6, 0x7dd2, 0x7f72,
+  0x66f8, 0x85af, 0x85f7, 0x8af8, 0x52a9, 0x53d9, 0x5973, 0x5e8f,
+  0x5f90, 0x6055, 0x92e4, 0x9664, 0x50b7, 0x511f,
+  /* 0x3e */
+  0x52dd, 0x5320, 0x5347, 0x53ec, 0x54e8, 0x5546, 0x5531, 0x5617,
+  0x5968, 0x59be, 0x5a3c, 0x5bb5, 0x5c06, 0x5c0f, 0x5c11, 0x5c1a,
+  0x5e84, 0x5e8a, 0x5ee0, 0x5f70, 0x627f, 0x6284, 0x62db, 0x638c,
+  0x6377, 0x6607, 0x660c, 0x662d, 0x6676, 0x677e, 0x68a2, 0x6a1f,
+  0x6a35, 0x6cbc, 0x6d88, 0x6e09, 0x6e58, 0x713c, 0x7126, 0x7167,
+  0x75c7, 0x7701, 0x785d, 0x7901, 0x7965, 0x79f0, 0x7ae0, 0x7b11,
+  0x7ca7, 0x7d39, 0x8096, 0x83d6, 0x848b, 0x8549, 0x885d, 0x88f3,
+  0x8a1f, 0x8a3c, 0x8a54, 0x8a73, 0x8c61, 0x8cde, 0x91a4, 0x9266,
+  0x937e, 0x9418, 0x969c, 0x9798, 0x4e0a, 0x4e08, 0x4e1e, 0x4e57,
+  0x5197, 0x5270, 0x57ce, 0x5834, 0x58cc, 0x5b22, 0x5e38, 0x60c5,
+  0x64fe, 0x6761, 0x6756, 0x6d44, 0x72b6, 0x7573, 0x7a63, 0x84b8,
+  0x8b72, 0x91b8, 0x9320, 0x5631, 0x57f4, 0x98fe,
+  /* 0x3f */
+  0x62ed, 0x690d, 0x6b96, 0x71ed, 0x7e54, 0x8077, 0x8272, 0x89e6,
+  0x98df, 0x8755, 0x8fb1, 0x5c3b, 0x4f38, 0x4fe1, 0x4fb5, 0x5507,
+  0x5a20, 0x5bdd, 0x5be9, 0x5fc3, 0x614e, 0x632f, 0x65b0, 0x664b,
+  0x68ee, 0x699b, 0x6d78, 0x6df1, 0x7533, 0x75b9, 0x771f, 0x795e,
+  0x79e6, 0x7d33, 0x81e3, 0x82af, 0x85aa, 0x89aa, 0x8a3a, 0x8eab,
+  0x8f9b, 0x9032, 0x91dd, 0x9707, 0x4eba, 0x4ec1, 0x5203, 0x5875,
+  0x58ec, 0x5c0b, 0x751a, 0x5c3d, 0x814e, 0x8a0a, 0x8fc5, 0x9663,
+  0x976d, 0x7b25, 0x8acf, 0x9808, 0x9162, 0x56f3, 0x53a8, 0x9017,
+  0x5439, 0x5782, 0x5e25, 0x63a8, 0x6c34, 0x708a, 0x7761, 0x7c8b,
+  0x7fe0, 0x8870, 0x9042, 0x9154, 0x9310, 0x9318, 0x968f, 0x745e,
+  0x9ac4, 0x5d07, 0x5d69, 0x6570, 0x67a2, 0x8da8, 0x96db, 0x636e,
+  0x6749, 0x6919, 0x83c5, 0x9817, 0x96c0, 0x88fe,
+  /* 0x40 */
+  0x6f84, 0x647a, 0x5bf8, 0x4e16, 0x702c, 0x755d, 0x662f, 0x51c4,
+  0x5236, 0x52e2, 0x59d3, 0x5f81, 0x6027, 0x6210, 0x653f, 0x6574,
+  0x661f, 0x6674, 0x68f2, 0x6816, 0x6b63, 0x6e05, 0x7272, 0x751f,
+  0x76db, 0x7cbe, 0x8056, 0x58f0, 0x88fd, 0x897f, 0x8aa0, 0x8a93,
+  0x8acb, 0x901d, 0x9192, 0x9752, 0x9759, 0x6589, 0x7a0e, 0x8106,
+  0x96bb, 0x5e2d, 0x60dc, 0x621a, 0x65a5, 0x6614, 0x6790, 0x77f3,
+  0x7a4d, 0x7c4d, 0x7e3e, 0x810a, 0x8cac, 0x8d64, 0x8de1, 0x8e5f,
+  0x78a9, 0x5207, 0x62d9, 0x63a5, 0x6442, 0x6298, 0x8a2d, 0x7a83,
+  0x7bc0, 0x8aac, 0x96ea, 0x7d76, 0x820c, 0x8749, 0x4ed9, 0x5148,
+  0x5343, 0x5360, 0x5ba3, 0x5c02, 0x5c16, 0x5ddd, 0x6226, 0x6247,
+  0x64b0, 0x6813, 0x6834, 0x6cc9, 0x6d45, 0x6d17, 0x67d3, 0x6f5c,
+  0x714e, 0x717d, 0x65cb, 0x7a7f, 0x7bad, 0x7dda,
+  /* 0x41 */
+  0x7e4a, 0x7fa8, 0x817a, 0x821b, 0x8239, 0x85a6, 0x8a6e, 0x8cce,
+  0x8df5, 0x9078, 0x9077, 0x92ad, 0x9291, 0x9583, 0x9bae, 0x524d,
+  0x5584, 0x6f38, 0x7136, 0x5168, 0x7985, 0x7e55, 0x81b3, 0x7cce,
+  0x564c, 0x5851, 0x5ca8, 0x63aa, 0x66fe, 0x66fd, 0x695a, 0x72d9,
+  0x758f, 0x758e, 0x790e, 0x7956, 0x79df, 0x7c97, 0x7d20, 0x7d44,
+  0x8607, 0x8a34, 0x963b, 0x9061, 0x9f20, 0x50e7, 0x5275, 0x53cc,
+  0x53e2, 0x5009, 0x55aa, 0x58ee, 0x594f, 0x723d, 0x5b8b, 0x5c64,
+  0x531d, 0x60e3, 0x60f3, 0x635c, 0x6383, 0x633f, 0x63bb, 0x64cd,
+  0x65e9, 0x66f9, 0x5de3, 0x69cd, 0x69fd, 0x6f15, 0x71e5, 0x4e89,
+  0x75e9, 0x76f8, 0x7a93, 0x7cdf, 0x7dcf, 0x7d9c, 0x8061, 0x8349,
+  0x8358, 0x846c, 0x84bc, 0x85fb, 0x88c5, 0x8d70, 0x9001, 0x906d,
+  0x9397, 0x971c, 0x9a12, 0x50cf, 0x5897, 0x618e,
+  /* 0x42 */
+  0x81d3, 0x8535, 0x8d08, 0x9020, 0x4fc3, 0x5074, 0x5247, 0x5373,
+  0x606f, 0x6349, 0x675f, 0x6e2c, 0x8db3, 0x901f, 0x4fd7, 0x5c5e,
+  0x8cca, 0x65cf, 0x7d9a, 0x5352, 0x8896, 0x5176, 0x63c3, 0x5b58,
+  0x5b6b, 0x5c0a, 0x640d, 0x6751, 0x905c, 0x4ed6, 0x591a, 0x592a,
+  0x6c70, 0x8a51, 0x553e, 0x5815, 0x59a5, 0x60f0, 0x6253, 0x67c1,
+  0x8235, 0x6955, 0x9640, 0x99c4, 0x9a28, 0x4f53, 0x5806, 0x5bfe,
+  0x8010, 0x5cb1, 0x5e2f, 0x5f85, 0x6020, 0x614b, 0x6234, 0x66ff,
+  0x6cf0, 0x6ede, 0x80ce, 0x817f, 0x82d4, 0x888b, 0x8cb8, 0x9000,
+  0x902e, 0x968a, 0x9edb, 0x9bdb, 0x4ee3, 0x53f0, 0x5927, 0x7b2c,
+  0x918d, 0x984c, 0x9df9, 0x6edd, 0x7027, 0x5353, 0x5544, 0x5b85,
+  0x6258, 0x629e, 0x62d3, 0x6ca2, 0x6fef, 0x7422, 0x8a17, 0x9438,
+  0x6fc1, 0x8afe, 0x8338, 0x51e7, 0x86f8, 0x53ea,
+  /* 0x43 */
+  0x53e9, 0x4f46, 0x9054, 0x8fb0, 0x596a, 0x8131, 0x5dfd, 0x7aea,
+  0x8fbf, 0x68da, 0x8c37, 0x72f8, 0x9c48, 0x6a3d, 0x8ab0, 0x4e39,
+  0x5358, 0x5606, 0x5766, 0x62c5, 0x63a2, 0x65e6, 0x6b4e, 0x6de1,
+  0x6e5b, 0x70ad, 0x77ed, 0x7aef, 0x7baa, 0x7dbb, 0x803d, 0x80c6,
+  0x86cb, 0x8a95, 0x935b, 0x56e3, 0x58c7, 0x5f3e, 0x65ad, 0x6696,
+  0x6a80, 0x6bb5, 0x7537, 0x8ac7, 0x5024, 0x77e5, 0x5730, 0x5f1b,
+  0x6065, 0x667a, 0x6c60, 0x75f4, 0x7a1a, 0x7f6e, 0x81f4, 0x8718,
+  0x9045, 0x99b3, 0x7bc9, 0x755c, 0x7af9, 0x7b51, 0x84c4, 0x9010,
+  0x79e9, 0x7a92, 0x8336, 0x5ae1, 0x7740, 0x4e2d, 0x4ef2, 0x5b99,
+  0x5fe0, 0x62bd, 0x663c, 0x67f1, 0x6ce8, 0x866b, 0x8877, 0x8a3b,
+  0x914e, 0x92f3, 0x99d0, 0x6a17, 0x7026, 0x732a, 0x82e7, 0x8457,
+  0x8caf, 0x4e01, 0x5146, 0x51cb, 0x558b, 0x5bf5,
+  /* 0x44 */
+  0x5e16, 0x5e33, 0x5e81, 0x5f14, 0x5f35, 0x5f6b, 0x5fb4, 0x61f2,
+  0x6311, 0x66a2, 0x671d, 0x6f6e, 0x7252, 0x753a, 0x773a, 0x8074,
+  0x8139, 0x8178, 0x8776, 0x8abf, 0x8adc, 0x8d85, 0x8df3, 0x929a,
+  0x9577, 0x9802, 0x9ce5, 0x52c5, 0x6357, 0x76f4, 0x6715, 0x6c88,
+  0x73cd, 0x8cc3, 0x93ae, 0x9673, 0x6d25, 0x589c, 0x690e, 0x69cc,
+  0x8ffd, 0x939a, 0x75db, 0x901a, 0x585a, 0x6802, 0x63b4, 0x69fb,
+  0x4f43, 0x6f2c, 0x67d8, 0x8fbb, 0x8526, 0x7db4, 0x9354, 0x693f,
+  0x6f70, 0x576a, 0x58f7, 0x5b2c, 0x7d2c, 0x722a, 0x540a, 0x91e3,
+  0x9db4, 0x4ead, 0x4f4e, 0x505c, 0x5075, 0x5243, 0x8c9e, 0x5448,
+  0x5824, 0x5b9a, 0x5e1d, 0x5e95, 0x5ead, 0x5ef7, 0x5f1f, 0x608c,
+  0x62b5, 0x633a, 0x63d0, 0x68af, 0x6c40, 0x7887, 0x798e, 0x7a0b,
+  0x7de0, 0x8247, 0x8a02, 0x8ae6, 0x8e44, 0x9013,
+  /* 0x45 */
+  0x90b8, 0x912d, 0x91d8, 0x9f0e, 0x6ce5, 0x6458, 0x64e2, 0x6575,
+  0x6ef4, 0x7684, 0x7b1b, 0x9069, 0x93d1, 0x6eba, 0x54f2, 0x5fb9,
+  0x64a4, 0x8f4d, 0x8fed, 0x9244, 0x5178, 0x586b, 0x5929, 0x5c55,
+  0x5e97, 0x6dfb, 0x7e8f, 0x751c, 0x8cbc, 0x8ee2, 0x985b, 0x70b9,
+  0x4f1d, 0x6bbf, 0x6fb1, 0x7530, 0x96fb, 0x514e, 0x5410, 0x5835,
+  0x5857, 0x59ac, 0x5c60, 0x5f92, 0x6597, 0x675c, 0x6e21, 0x767b,
+  0x83df, 0x8ced, 0x9014, 0x90fd, 0x934d, 0x7825, 0x783a, 0x52aa,
+  0x5ea6, 0x571f, 0x5974, 0x6012, 0x5012, 0x515a, 0x51ac, 0x51cd,
+  0x5200, 0x5510, 0x5854, 0x5858, 0x5957, 0x5b95, 0x5cf6, 0x5d8b,
+  0x60bc, 0x6295, 0x642d, 0x6771, 0x6843, 0x68bc, 0x68df, 0x76d7,
+  0x6dd8, 0x6e6f, 0x6d9b, 0x706f, 0x71c8, 0x5f53, 0x75d8, 0x7977,
+  0x7b49, 0x7b54, 0x7b52, 0x7cd6, 0x7d71, 0x5230,
+  /* 0x46 */
+  0x8463, 0x8569, 0x85e4, 0x8a0e, 0x8b04, 0x8c46, 0x8e0f, 0x9003,
+  0x900f, 0x9419, 0x9676, 0x982d, 0x9a30, 0x95d8, 0x50cd, 0x52d5,
+  0x540c, 0x5802, 0x5c0e, 0x61a7, 0x649e, 0x6d1e, 0x77b3, 0x7ae5,
+  0x80f4, 0x8404, 0x9053, 0x9285, 0x5ce0, 0x9d07, 0x533f, 0x5f97,
+  0x5fb3, 0x6d9c, 0x7279, 0x7763, 0x79bf, 0x7be4, 0x6bd2, 0x72ec,
+  0x8aad, 0x6803, 0x6a61, 0x51f8, 0x7a81, 0x6934, 0x5c4a, 0x9cf6,
+  0x82eb, 0x5bc5, 0x9149, 0x701e, 0x5678, 0x5c6f, 0x60c7, 0x6566,
+  0x6c8c, 0x8c5a, 0x9041, 0x9813, 0x5451, 0x66c7, 0x920d, 0x5948,
+  0x90a3, 0x5185, 0x4e4d, 0x51ea, 0x8599, 0x8b0e, 0x7058, 0x637a,
+  0x934b, 0x6962, 0x99b4, 0x7e04, 0x7577, 0x5357, 0x6960, 0x8edf,
+  0x96e3, 0x6c5d, 0x4e8c, 0x5c3c, 0x5f10, 0x8fe9, 0x5302, 0x8cd1,
+  0x8089, 0x8679, 0x5eff, 0x65e5, 0x4e73, 0x5165,
+  /* 0x47 */
+  0x5982, 0x5c3f, 0x97ee, 0x4efb, 0x598a, 0x5fcd, 0x8a8d, 0x6fe1,
+  0x79b0, 0x7962, 0x5be7, 0x8471, 0x732b, 0x71b1, 0x5e74, 0x5ff5,
+  0x637b, 0x649a, 0x71c3, 0x7c98, 0x4e43, 0x5efc, 0x4e4b, 0x57dc,
+  0x56a2, 0x60a9, 0x6fc3, 0x7d0d, 0x80fd, 0x8133, 0x81bf, 0x8fb2,
+  0x8997, 0x86a4, 0x5df4, 0x628a, 0x64ad, 0x8987, 0x6777, 0x6ce2,
+  0x6d3e, 0x7436, 0x7834, 0x5a46, 0x7f75, 0x82ad, 0x99ac, 0x4ff3,
+  0x5ec3, 0x62dd, 0x6392, 0x6557, 0x676f, 0x76c3, 0x724c, 0x80cc,
+  0x80ba, 0x8f29, 0x914d, 0x500d, 0x57f9, 0x5a92, 0x6885, 0x6973,
+  0x7164, 0x72fd, 0x8cb7, 0x58f2, 0x8ce0, 0x966a, 0x9019, 0x877f,
+  0x79e4, 0x77e7, 0x8429, 0x4f2f, 0x5265, 0x535a, 0x62cd, 0x67cf,
+  0x6cca, 0x767d, 0x7b94, 0x7c95, 0x8236, 0x8584, 0x8feb, 0x66dd,
+  0x6f20, 0x7206, 0x7e1b, 0x83ab, 0x99c1, 0x9ea6,
+  /* 0x48 */
+  0x51fd, 0x7bb1, 0x7872, 0x7bb8, 0x8087, 0x7b48, 0x6ae8, 0x5e61,
+  0x808c, 0x7551, 0x7560, 0x516b, 0x9262, 0x6e8c, 0x767a, 0x9197,
+  0x9aea, 0x4f10, 0x7f70, 0x629c, 0x7b4f, 0x95a5, 0x9ce9, 0x567a,
+  0x5859, 0x86e4, 0x96bc, 0x4f34, 0x5224, 0x534a, 0x53cd, 0x53db,
+  0x5e06, 0x642c, 0x6591, 0x677f, 0x6c3e, 0x6c4e, 0x7248, 0x72af,
+  0x73ed, 0x7554, 0x7e41, 0x822c, 0x85e9, 0x8ca9, 0x7bc4, 0x91c6,
+  0x7169, 0x9812, 0x98ef, 0x633d, 0x6669, 0x756a, 0x76e4, 0x78d0,
+  0x8543, 0x86ee, 0x532a, 0x5351, 0x5426, 0x5983, 0x5e87, 0x5f7c,
+  0x60b2, 0x6249, 0x6279, 0x62ab, 0x6590, 0x6bd4, 0x6ccc, 0x75b2,
+  0x76ae, 0x7891, 0x79d8, 0x7dcb, 0x7f77, 0x80a5, 0x88ab, 0x8ab9,
+  0x8cbb, 0x907f, 0x975e, 0x98db, 0x6a0b, 0x7c38, 0x5099, 0x5c3e,
+  0x5fae, 0x6787, 0x6bd8, 0x7435, 0x7709, 0x7f8e,
+  /* 0x49 */
+  0x9f3b, 0x67ca, 0x7a17, 0x5339, 0x758b, 0x9aed, 0x5f66, 0x819d,
+  0x83f1, 0x8098, 0x5f3c, 0x5fc5, 0x7562, 0x7b46, 0x903c, 0x6867,
+  0x59eb, 0x5a9b, 0x7d10, 0x767e, 0x8b2c, 0x4ff5, 0x5f6a, 0x6a19,
+  0x6c37, 0x6f02, 0x74e2, 0x7968, 0x8868, 0x8a55, 0x8c79, 0x5edf,
+  0x63cf, 0x75c5, 0x79d2, 0x82d7, 0x9328, 0x92f2, 0x849c, 0x86ed,
+  0x9c2d, 0x54c1, 0x5f6c, 0x658c, 0x6d5c, 0x7015, 0x8ca7, 0x8cd3,
+  0x983b, 0x654f, 0x74f6, 0x4e0d, 0x4ed8, 0x57e0, 0x592b, 0x5a66,
+  0x5bcc, 0x51a8, 0x5e03, 0x5e9c, 0x6016, 0x6276, 0x6577, 0x65a7,
+  0x666e, 0x6d6e, 0x7236, 0x7b26, 0x8150, 0x819a, 0x8299, 0x8b5c,
+  0x8ca0, 0x8ce6, 0x8d74, 0x961c, 0x9644, 0x4fae, 0x64ab, 0x6b66,
+  0x821e, 0x8461, 0x856a, 0x90e8, 0x5c01, 0x6953, 0x98a8, 0x847a,
+  0x8557, 0x4f0f, 0x526f, 0x5fa9, 0x5e45, 0x670d,
+  /* 0x4a */
+  0x798f, 0x8179, 0x8907, 0x8986, 0x6df5, 0x5f17, 0x6255, 0x6cb8,
+  0x4ecf, 0x7269, 0x9b92, 0x5206, 0x543b, 0x5674, 0x58b3, 0x61a4,
+  0x626e, 0x711a, 0x596e, 0x7c89, 0x7cde, 0x7d1b, 0x96f0, 0x6587,
+  0x805e, 0x4e19, 0x4f75, 0x5175, 0x5840, 0x5e63, 0x5e73, 0x5f0a,
+  0x67c4, 0x4e26, 0x853d, 0x9589, 0x965b, 0x7c73, 0x9801, 0x50fb,
+  0x58c1, 0x7656, 0x78a7, 0x5225, 0x77a5, 0x8511, 0x7b86, 0x504f,
+  0x5909, 0x7247, 0x7bc7, 0x7de8, 0x8fba, 0x8fd4, 0x904d, 0x4fbf,
+  0x52c9, 0x5a29, 0x5f01, 0x97ad, 0x4fdd, 0x8217, 0x92ea, 0x5703,
+  0x6355, 0x6b69, 0x752b, 0x88dc, 0x8f14, 0x7a42, 0x52df, 0x5893,
+  0x6155, 0x620a, 0x66ae, 0x6bcd, 0x7c3f, 0x83e9, 0x5023, 0x4ff8,
+  0x5305, 0x5446, 0x5831, 0x5949, 0x5b9d, 0x5cf0, 0x5cef, 0x5d29,
+  0x5e96, 0x62b1, 0x6367, 0x653e, 0x65b9, 0x670b,
+  /* 0x4b */
+  0x6cd5, 0x6ce1, 0x70f9, 0x7832, 0x7e2b, 0x80de, 0x82b3, 0x840c,
+  0x84ec, 0x8702, 0x8912, 0x8a2a, 0x8c4a, 0x90a6, 0x92d2, 0x98fd,
+  0x9cf3, 0x9d6c, 0x4e4f, 0x4ea1, 0x508d, 0x5256, 0x574a, 0x59a8,
+  0x5e3d, 0x5fd8, 0x5fd9, 0x623f, 0x66b4, 0x671b, 0x67d0, 0x68d2,
+  0x5192, 0x7d21, 0x80aa, 0x81a8, 0x8b00, 0x8c8c, 0x8cbf, 0x927e,
+  0x9632, 0x5420, 0x982c, 0x5317, 0x50d5, 0x535c, 0x58a8, 0x64b2,
+  0x6734, 0x7267, 0x7766, 0x7a46, 0x91e6, 0x52c3, 0x6ca1, 0x6b86,
+  0x5800, 0x5e4c, 0x5954, 0x672c, 0x7ffb, 0x51e1, 0x76c6, 0x6469,
+  0x78e8, 0x9b54, 0x9ebb, 0x57cb, 0x59b9, 0x6627, 0x679a, 0x6bce,
+  0x54e9, 0x69d9, 0x5e55, 0x819c, 0x6795, 0x9baa, 0x67fe, 0x9c52,
+  0x685d, 0x4ea6, 0x4fe3, 0x53c8, 0x62b9, 0x672b, 0x6cab, 0x8fc4,
+  0x4fad, 0x7e6d, 0x9ebf, 0x4e07, 0x6162, 0x6e80,
+  /* 0x4c */
+  0x6f2b, 0x8513, 0x5473, 0x672a, 0x9b45, 0x5df3, 0x7b95, 0x5cac,
+  0x5bc6, 0x871c, 0x6e4a, 0x84d1, 0x7a14, 0x8108, 0x5999, 0x7c8d,
+  0x6c11, 0x7720, 0x52d9, 0x5922, 0x7121, 0x725f, 0x77db, 0x9727,
+  0x9d61, 0x690b, 0x5a7f, 0x5a18, 0x51a5, 0x540d, 0x547d, 0x660e,
+  0x76df, 0x8ff7, 0x9298, 0x9cf4, 0x59ea, 0x725d, 0x6ec5, 0x514d,
+  0x68c9, 0x7dbf, 0x7dec, 0x9762, 0x9eba, 0x6478, 0x6a21, 0x8302,
+  0x5984, 0x5b5f, 0x6bdb, 0x731b, 0x76f2, 0x7db2, 0x8017, 0x8499,
+  0x5132, 0x6728, 0x9ed9, 0x76ee, 0x6762, 0x52ff, 0x9905, 0x5c24,
+  0x623b, 0x7c7e, 0x8cb0, 0x554f, 0x60b6, 0x7d0b, 0x9580, 0x5301,
+  0x4e5f, 0x51b6, 0x591c, 0x723a, 0x8036, 0x91ce, 0x5f25, 0x77e2,
+  0x5384, 0x5f79, 0x7d04, 0x85ac, 0x8a33, 0x8e8d, 0x9756, 0x67f3,
+  0x85ae, 0x9453, 0x6109, 0x6108, 0x6cb9, 0x7652,
+  /* 0x4d */
+  0x8aed, 0x8f38, 0x552f, 0x4f51, 0x512a, 0x52c7, 0x53cb, 0x5ba5,
+  0x5e7d, 0x60a0, 0x6182, 0x63d6, 0x6709, 0x67da, 0x6e67, 0x6d8c,
+  0x7336, 0x7337, 0x7531, 0x7950, 0x88d5, 0x8a98, 0x904a, 0x9091,
+  0x90f5, 0x96c4, 0x878d, 0x5915, 0x4e88, 0x4f59, 0x4e0e, 0x8a89,
+  0x8f3f, 0x9810, 0x50ad, 0x5e7c, 0x5996, 0x5bb9, 0x5eb8, 0x63da,
+  0x63fa, 0x64c1, 0x66dc, 0x694a, 0x69d8, 0x6d0b, 0x6eb6, 0x7194,
+  0x7528, 0x7aaf, 0x7f8a, 0x8000, 0x8449, 0x84c9, 0x8981, 0x8b21,
+  0x8e0a, 0x9065, 0x967d, 0x990a, 0x617e, 0x6291, 0x6b32, 0x6c83,
+  0x6d74, 0x7fcc, 0x7ffc, 0x6dc0, 0x7f85, 0x87ba, 0x88f8, 0x6765,
+  0x83b1, 0x983c, 0x96f7, 0x6d1b, 0x7d61, 0x843d, 0x916a, 0x4e71,
+  0x5375, 0x5d50, 0x6b04, 0x6feb, 0x85cd, 0x862d, 0x89a7, 0x5229,
+  0x540f, 0x5c65, 0x674e, 0x68a8, 0x7406, 0x7483,
+  /* 0x4e */
+  0x75e2, 0x88cf, 0x88e1, 0x91cc, 0x96e2, 0x9678, 0x5f8b, 0x7387,
+  0x7acb, 0x844e, 0x63a0, 0x7565, 0x5289, 0x6d41, 0x6e9c, 0x7409,
+  0x7559, 0x786b, 0x7c92, 0x9686, 0x7adc, 0x9f8d, 0x4fb6, 0x616e,
+  0x65c5, 0x865c, 0x4e86, 0x4eae, 0x50da, 0x4e21, 0x51cc, 0x5bee,
+  0x6599, 0x6881, 0x6dbc, 0x731f, 0x7642, 0x77ad, 0x7a1c, 0x7ce7,
+  0x826f, 0x8ad2, 0x907c, 0x91cf, 0x9675, 0x9818, 0x529b, 0x7dd1,
+  0x502b, 0x5398, 0x6797, 0x6dcb, 0x71d0, 0x7433, 0x81e8, 0x8f2a,
+  0x96a3, 0x9c57, 0x9e9f, 0x7460, 0x5841, 0x6d99, 0x7d2f, 0x985e,
+  0x4ee4, 0x4f36, 0x4f8b, 0x51b7, 0x52b1, 0x5dba, 0x601c, 0x73b2,
+  0x793c, 0x82d3, 0x9234, 0x96b7, 0x96f6, 0x970a, 0x9e97, 0x9f62,
+  0x66a6, 0x6b74, 0x5217, 0x52a3, 0x70c8, 0x88c2, 0x5ec9, 0x604b,
+  0x6190, 0x6f23, 0x7149, 0x7c3e, 0x7df4, 0x806f,
+  /* 0x4f */
+  0x84ee, 0x9023, 0x932c, 0x5442, 0x9b6f, 0x6ad3, 0x7089, 0x8cc2,
+  0x8def, 0x9732, 0x52b4, 0x5a41, 0x5eca, 0x5f04, 0x6717, 0x697c,
+  0x6994, 0x6d6a, 0x6f0f, 0x7262, 0x72fc, 0x7bed, 0x8001, 0x807e,
+  0x874b, 0x90ce, 0x516d, 0x9e93, 0x7984, 0x808b, 0x9332, 0x8ad6,
+  0x502d, 0x548c, 0x8a71, 0x6b6a, 0x8cc4, 0x8107, 0x60d1, 0x67a0,
+  0x9df2, 0x4e99, 0x4e98, 0x9c10, 0x8a6b, 0x85c1, 0x8568, 0x6900,
+  0x6e7e, 0x7897, 0x8155, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0x50 */
+  0x5f0c, 0x4e10, 0x4e15, 0x4e2a, 0x4e31, 0x4e36, 0x4e3c, 0x4e3f,
+  0x4e42, 0x4e56, 0x4e58, 0x4e82, 0x4e85, 0x8c6b, 0x4e8a, 0x8212,
+  0x5f0d, 0x4e8e, 0x4e9e, 0x4e9f, 0x4ea0, 0x4ea2, 0x4eb0, 0x4eb3,
+  0x4eb6, 0x4ece, 0x4ecd, 0x4ec4, 0x4ec6, 0x4ec2, 0x4ed7, 0x4ede,
+  0x4eed, 0x4edf, 0x4ef7, 0x4f09, 0x4f5a, 0x4f30, 0x4f5b, 0x4f5d,
+  0x4f57, 0x4f47, 0x4f76, 0x4f88, 0x4f8f, 0x4f98, 0x4f7b, 0x4f69,
+  0x4f70, 0x4f91, 0x4f6f, 0x4f86, 0x4f96, 0x5118, 0x4fd4, 0x4fdf,
+  0x4fce, 0x4fd8, 0x4fdb, 0x4fd1, 0x4fda, 0x4fd0, 0x4fe4, 0x4fe5,
+  0x501a, 0x5028, 0x5014, 0x502a, 0x5025, 0x5005, 0x4f1c, 0x4ff6,
+  0x5021, 0x5029, 0x502c, 0x4ffe, 0x4fef, 0x5011, 0x5006, 0x5043,
+  0x5047, 0x6703, 0x5055, 0x5050, 0x5048, 0x505a, 0x5056, 0x506c,
+  0x5078, 0x5080, 0x509a, 0x5085, 0x50b4, 0x50b2,
+  /* 0x51 */
+  0x50c9, 0x50ca, 0x50b3, 0x50c2, 0x50d6, 0x50de, 0x50e5, 0x50ed,
+  0x50e3, 0x50ee, 0x50f9, 0x50f5, 0x5109, 0x5101, 0x5102, 0x5116,
+  0x5115, 0x5114, 0x511a, 0x5121, 0x513a, 0x5137, 0x513c, 0x513b,
+  0x513f, 0x5140, 0x5152, 0x514c, 0x5154, 0x5162, 0x7af8, 0x5169,
+  0x516a, 0x516e, 0x5180, 0x5182, 0x56d8, 0x518c, 0x5189, 0x518f,
+  0x5191, 0x5193, 0x5195, 0x5196, 0x51a4, 0x51a6, 0x51a2, 0x51a9,
+  0x51aa, 0x51ab, 0x51b3, 0x51b1, 0x51b2, 0x51b0, 0x51b5, 0x51bd,
+  0x51c5, 0x51c9, 0x51db, 0x51e0, 0x8655, 0x51e9, 0x51ed, 0x51f0,
+  0x51f5, 0x51fe, 0x5204, 0x520b, 0x5214, 0x520e, 0x5227, 0x522a,
+  0x522e, 0x5233, 0x5239, 0x524f, 0x5244, 0x524b, 0x524c, 0x525e,
+  0x5254, 0x526a, 0x5274, 0x5269, 0x5273, 0x527f, 0x527d, 0x528d,
+  0x5294, 0x5292, 0x5271, 0x5288, 0x5291, 0x8fa8,
+  /* 0x52 */
+  0x8fa7, 0x52ac, 0x52ad, 0x52bc, 0x52b5, 0x52c1, 0x52cd, 0x52d7,
+  0x52de, 0x52e3, 0x52e6, 0x98ed, 0x52e0, 0x52f3, 0x52f5, 0x52f8,
+  0x52f9, 0x5306, 0x5308, 0x7538, 0x530d, 0x5310, 0x530f, 0x5315,
+  0x531a, 0x5323, 0x532f, 0x5331, 0x5333, 0x5338, 0x5340, 0x5346,
+  0x5345, 0x4e17, 0x5349, 0x534d, 0x51d6, 0x535e, 0x5369, 0x536e,
+  0x5918, 0x537b, 0x5377, 0x5382, 0x5396, 0x53a0, 0x53a6, 0x53a5,
+  0x53ae, 0x53b0, 0x53b6, 0x53c3, 0x7c12, 0x96d9, 0x53df, 0x66fc,
+  0x71ee, 0x53ee, 0x53e8, 0x53ed, 0x53fa, 0x5401, 0x543d, 0x5440,
+  0x542c, 0x542d, 0x543c, 0x542e, 0x5436, 0x5429, 0x541d, 0x544e,
+  0x548f, 0x5475, 0x548e, 0x545f, 0x5471, 0x5477, 0x5470, 0x5492,
+  0x547b, 0x5480, 0x5476, 0x5484, 0x5490, 0x5486, 0x54c7, 0x54a2,
+  0x54b8, 0x54a5, 0x54ac, 0x54c4, 0x54c8, 0x54a8,
+  /* 0x53 */
+  0x54ab, 0x54c2, 0x54a4, 0x54be, 0x54bc, 0x54d8, 0x54e5, 0x54e6,
+  0x550f, 0x5514, 0x54fd, 0x54ee, 0x54ed, 0x54fa, 0x54e2, 0x5539,
+  0x5540, 0x5563, 0x554c, 0x552e, 0x555c, 0x5545, 0x5556, 0x5557,
+  0x5538, 0x5533, 0x555d, 0x5599, 0x5580, 0x54af, 0x558a, 0x559f,
+  0x557b, 0x557e, 0x5598, 0x559e, 0x55ae, 0x557c, 0x5583, 0x55a9,
+  0x5587, 0x55a8, 0x55da, 0x55c5, 0x55df, 0x55c4, 0x55dc, 0x55e4,
+  0x55d4, 0x5614, 0x55f7, 0x5616, 0x55fe, 0x55fd, 0x561b, 0x55f9,
+  0x564e, 0x5650, 0x71df, 0x5634, 0x5636, 0x5632, 0x5638, 0x566b,
+  0x5664, 0x562f, 0x566c, 0x566a, 0x5686, 0x5680, 0x568a, 0x56a0,
+  0x5694, 0x568f, 0x56a5, 0x56ae, 0x56b6, 0x56b4, 0x56c2, 0x56bc,
+  0x56c1, 0x56c3, 0x56c0, 0x56c8, 0x56ce, 0x56d1, 0x56d3, 0x56d7,
+  0x56ee, 0x56f9, 0x5700, 0x56ff, 0x5704, 0x5709,
+  /* 0x54 */
+  0x5708, 0x570b, 0x570d, 0x5713, 0x5718, 0x5716, 0x55c7, 0x571c,
+  0x5726, 0x5737, 0x5738, 0x574e, 0x573b, 0x5740, 0x574f, 0x5769,
+  0x57c0, 0x5788, 0x5761, 0x577f, 0x5789, 0x5793, 0x57a0, 0x57b3,
+  0x57a4, 0x57aa, 0x57b0, 0x57c3, 0x57c6, 0x57d4, 0x57d2, 0x57d3,
+  0x580a, 0x57d6, 0x57e3, 0x580b, 0x5819, 0x581d, 0x5872, 0x5821,
+  0x5862, 0x584b, 0x5870, 0x6bc0, 0x5852, 0x583d, 0x5879, 0x5885,
+  0x58b9, 0x589f, 0x58ab, 0x58ba, 0x58de, 0x58bb, 0x58b8, 0x58ae,
+  0x58c5, 0x58d3, 0x58d1, 0x58d7, 0x58d9, 0x58d8, 0x58e5, 0x58dc,
+  0x58e4, 0x58df, 0x58ef, 0x58fa, 0x58f9, 0x58fb, 0x58fc, 0x58fd,
+  0x5902, 0x590a, 0x5910, 0x591b, 0x68a6, 0x5925, 0x592c, 0x592d,
+  0x5932, 0x5938, 0x593e, 0x7ad2, 0x5955, 0x5950, 0x594e, 0x595a,
+  0x5958, 0x5962, 0x5960, 0x5967, 0x596c, 0x5969,
+  /* 0x55 */
+  0x5978, 0x5981, 0x599d, 0x4f5e, 0x4fab, 0x59a3, 0x59b2, 0x59c6,
+  0x59e8, 0x59dc, 0x598d, 0x59d9, 0x59da, 0x5a25, 0x5a1f, 0x5a11,
+  0x5a1c, 0x5a09, 0x5a1a, 0x5a40, 0x5a6c, 0x5a49, 0x5a35, 0x5a36,
+  0x5a62, 0x5a6a, 0x5a9a, 0x5abc, 0x5abe, 0x5acb, 0x5ac2, 0x5abd,
+  0x5ae3, 0x5ad7, 0x5ae6, 0x5ae9, 0x5ad6, 0x5afa, 0x5afb, 0x5b0c,
+  0x5b0b, 0x5b16, 0x5b32, 0x5ad0, 0x5b2a, 0x5b36, 0x5b3e, 0x5b43,
+  0x5b45, 0x5b40, 0x5b51, 0x5b55, 0x5b5a, 0x5b5b, 0x5b65, 0x5b69,
+  0x5b70, 0x5b73, 0x5b75, 0x5b78, 0x6588, 0x5b7a, 0x5b80, 0x5b83,
+  0x5ba6, 0x5bb8, 0x5bc3, 0x5bc7, 0x5bc9, 0x5bd4, 0x5bd0, 0x5be4,
+  0x5be6, 0x5be2, 0x5bde, 0x5be5, 0x5beb, 0x5bf0, 0x5bf6, 0x5bf3,
+  0x5c05, 0x5c07, 0x5c08, 0x5c0d, 0x5c13, 0x5c20, 0x5c22, 0x5c28,
+  0x5c38, 0x5c39, 0x5c41, 0x5c46, 0x5c4e, 0x5c53,
+  /* 0x56 */
+  0x5c50, 0x5c4f, 0x5b71, 0x5c6c, 0x5c6e, 0x4e62, 0x5c76, 0x5c79,
+  0x5c8c, 0x5c91, 0x5c94, 0x599b, 0x5cab, 0x5cbb, 0x5cb6, 0x5cbc,
+  0x5cb7, 0x5cc5, 0x5cbe, 0x5cc7, 0x5cd9, 0x5ce9, 0x5cfd, 0x5cfa,
+  0x5ced, 0x5d8c, 0x5cea, 0x5d0b, 0x5d15, 0x5d17, 0x5d5c, 0x5d1f,
+  0x5d1b, 0x5d11, 0x5d14, 0x5d22, 0x5d1a, 0x5d19, 0x5d18, 0x5d4c,
+  0x5d52, 0x5d4e, 0x5d4b, 0x5d6c, 0x5d73, 0x5d76, 0x5d87, 0x5d84,
+  0x5d82, 0x5da2, 0x5d9d, 0x5dac, 0x5dae, 0x5dbd, 0x5d90, 0x5db7,
+  0x5dbc, 0x5dc9, 0x5dcd, 0x5dd3, 0x5dd2, 0x5dd6, 0x5ddb, 0x5deb,
+  0x5df2, 0x5df5, 0x5e0b, 0x5e1a, 0x5e19, 0x5e11, 0x5e1b, 0x5e36,
+  0x5e37, 0x5e44, 0x5e43, 0x5e40, 0x5e4e, 0x5e57, 0x5e54, 0x5e5f,
+  0x5e62, 0x5e64, 0x5e47, 0x5e75, 0x5e76, 0x5e7a, 0x9ebc, 0x5e7f,
+  0x5ea0, 0x5ec1, 0x5ec2, 0x5ec8, 0x5ed0, 0x5ecf,
+  /* 0x57 */
+  0x5ed6, 0x5ee3, 0x5edd, 0x5eda, 0x5edb, 0x5ee2, 0x5ee1, 0x5ee8,
+  0x5ee9, 0x5eec, 0x5ef1, 0x5ef3, 0x5ef0, 0x5ef4, 0x5ef8, 0x5efe,
+  0x5f03, 0x5f09, 0x5f5d, 0x5f5c, 0x5f0b, 0x5f11, 0x5f16, 0x5f29,
+  0x5f2d, 0x5f38, 0x5f41, 0x5f48, 0x5f4c, 0x5f4e, 0x5f2f, 0x5f51,
+  0x5f56, 0x5f57, 0x5f59, 0x5f61, 0x5f6d, 0x5f73, 0x5f77, 0x5f83,
+  0x5f82, 0x5f7f, 0x5f8a, 0x5f88, 0x5f91, 0x5f87, 0x5f9e, 0x5f99,
+  0x5f98, 0x5fa0, 0x5fa8, 0x5fad, 0x5fbc, 0x5fd6, 0x5ffb, 0x5fe4,
+  0x5ff8, 0x5ff1, 0x5fdd, 0x60b3, 0x5fff, 0x6021, 0x6060, 0x6019,
+  0x6010, 0x6029, 0x600e, 0x6031, 0x601b, 0x6015, 0x602b, 0x6026,
+  0x600f, 0x603a, 0x605a, 0x6041, 0x606a, 0x6077, 0x605f, 0x604a,
+  0x6046, 0x604d, 0x6063, 0x6043, 0x6064, 0x6042, 0x606c, 0x606b,
+  0x6059, 0x6081, 0x608d, 0x60e7, 0x6083, 0x609a,
+  /* 0x58 */
+  0x6084, 0x609b, 0x6096, 0x6097, 0x6092, 0x60a7, 0x608b, 0x60e1,
+  0x60b8, 0x60e0, 0x60d3, 0x60b4, 0x5ff0, 0x60bd, 0x60c6, 0x60b5,
+  0x60d8, 0x614d, 0x6115, 0x6106, 0x60f6, 0x60f7, 0x6100, 0x60f4,
+  0x60fa, 0x6103, 0x6121, 0x60fb, 0x60f1, 0x610d, 0x610e, 0x6147,
+  0x613e, 0x6128, 0x6127, 0x614a, 0x613f, 0x613c, 0x612c, 0x6134,
+  0x613d, 0x6142, 0x6144, 0x6173, 0x6177, 0x6158, 0x6159, 0x615a,
+  0x616b, 0x6174, 0x616f, 0x6165, 0x6171, 0x615f, 0x615d, 0x6153,
+  0x6175, 0x6199, 0x6196, 0x6187, 0x61ac, 0x6194, 0x619a, 0x618a,
+  0x6191, 0x61ab, 0x61ae, 0x61cc, 0x61ca, 0x61c9, 0x61f7, 0x61c8,
+  0x61c3, 0x61c6, 0x61ba, 0x61cb, 0x7f79, 0x61cd, 0x61e6, 0x61e3,
+  0x61f6, 0x61fa, 0x61f4, 0x61ff, 0x61fd, 0x61fc, 0x61fe, 0x6200,
+  0x6208, 0x6209, 0x620d, 0x620c, 0x6214, 0x621b,
+  /* 0x59 */
+  0x621e, 0x6221, 0x622a, 0x622e, 0x6230, 0x6232, 0x6233, 0x6241,
+  0x624e, 0x625e, 0x6263, 0x625b, 0x6260, 0x6268, 0x627c, 0x6282,
+  0x6289, 0x627e, 0x6292, 0x6293, 0x6296, 0x62d4, 0x6283, 0x6294,
+  0x62d7, 0x62d1, 0x62bb, 0x62cf, 0x62ff, 0x62c6, 0x64d4, 0x62c8,
+  0x62dc, 0x62cc, 0x62ca, 0x62c2, 0x62c7, 0x629b, 0x62c9, 0x630c,
+  0x62ee, 0x62f1, 0x6327, 0x6302, 0x6308, 0x62ef, 0x62f5, 0x6350,
+  0x633e, 0x634d, 0x641c, 0x634f, 0x6396, 0x638e, 0x6380, 0x63ab,
+  0x6376, 0x63a3, 0x638f, 0x6389, 0x639f, 0x63b5, 0x636b, 0x6369,
+  0x63be, 0x63e9, 0x63c0, 0x63c6, 0x63e3, 0x63c9, 0x63d2, 0x63f6,
+  0x63c4, 0x6416, 0x6434, 0x6406, 0x6413, 0x6426, 0x6436, 0x651d,
+  0x6417, 0x6428, 0x640f, 0x6467, 0x646f, 0x6476, 0x644e, 0x652a,
+  0x6495, 0x6493, 0x64a5, 0x64a9, 0x6488, 0x64bc,
+  /* 0x5a */
+  0x64da, 0x64d2, 0x64c5, 0x64c7, 0x64bb, 0x64d8, 0x64c2, 0x64f1,
+  0x64e7, 0x8209, 0x64e0, 0x64e1, 0x62ac, 0x64e3, 0x64ef, 0x652c,
+  0x64f6, 0x64f4, 0x64f2, 0x64fa, 0x6500, 0x64fd, 0x6518, 0x651c,
+  0x6505, 0x6524, 0x6523, 0x652b, 0x6534, 0x6535, 0x6537, 0x6536,
+  0x6538, 0x754b, 0x6548, 0x6556, 0x6555, 0x654d, 0x6558, 0x655e,
+  0x655d, 0x6572, 0x6578, 0x6582, 0x6583, 0x8b8a, 0x659b, 0x659f,
+  0x65ab, 0x65b7, 0x65c3, 0x65c6, 0x65c1, 0x65c4, 0x65cc, 0x65d2,
+  0x65db, 0x65d9, 0x65e0, 0x65e1, 0x65f1, 0x6772, 0x660a, 0x6603,
+  0x65fb, 0x6773, 0x6635, 0x6636, 0x6634, 0x661c, 0x664f, 0x6644,
+  0x6649, 0x6641, 0x665e, 0x665d, 0x6664, 0x6667, 0x6668, 0x665f,
+  0x6662, 0x6670, 0x6683, 0x6688, 0x668e, 0x6689, 0x6684, 0x6698,
+  0x669d, 0x66c1, 0x66b9, 0x66c9, 0x66be, 0x66bc,
+  /* 0x5b */
+  0x66c4, 0x66b8, 0x66d6, 0x66da, 0x66e0, 0x663f, 0x66e6, 0x66e9,
+  0x66f0, 0x66f5, 0x66f7, 0x670f, 0x6716, 0x671e, 0x6726, 0x6727,
+  0x9738, 0x672e, 0x673f, 0x6736, 0x6741, 0x6738, 0x6737, 0x6746,
+  0x675e, 0x6760, 0x6759, 0x6763, 0x6764, 0x6789, 0x6770, 0x67a9,
+  0x677c, 0x676a, 0x678c, 0x678b, 0x67a6, 0x67a1, 0x6785, 0x67b7,
+  0x67ef, 0x67b4, 0x67ec, 0x67b3, 0x67e9, 0x67b8, 0x67e4, 0x67de,
+  0x67dd, 0x67e2, 0x67ee, 0x67b9, 0x67ce, 0x67c6, 0x67e7, 0x6a9c,
+  0x681e, 0x6846, 0x6829, 0x6840, 0x684d, 0x6832, 0x684e, 0x68b3,
+  0x682b, 0x6859, 0x6863, 0x6877, 0x687f, 0x689f, 0x688f, 0x68ad,
+  0x6894, 0x689d, 0x689b, 0x6883, 0x6aae, 0x68b9, 0x6874, 0x68b5,
+  0x68a0, 0x68ba, 0x690f, 0x688d, 0x687e, 0x6901, 0x68ca, 0x6908,
+  0x68d8, 0x6922, 0x6926, 0x68e1, 0x690c, 0x68cd,
+  /* 0x5c */
+  0x68d4, 0x68e7, 0x68d5, 0x6936, 0x6912, 0x6904, 0x68d7, 0x68e3,
+  0x6925, 0x68f9, 0x68e0, 0x68ef, 0x6928, 0x692a, 0x691a, 0x6923,
+  0x6921, 0x68c6, 0x6979, 0x6977, 0x695c, 0x6978, 0x696b, 0x6954,
+  0x697e, 0x696e, 0x6939, 0x6974, 0x693d, 0x6959, 0x6930, 0x6961,
+  0x695e, 0x695d, 0x6981, 0x696a, 0x69b2, 0x69ae, 0x69d0, 0x69bf,
+  0x69c1, 0x69d3, 0x69be, 0x69ce, 0x5be8, 0x69ca, 0x69dd, 0x69bb,
+  0x69c3, 0x69a7, 0x6a2e, 0x6991, 0x69a0, 0x699c, 0x6995, 0x69b4,
+  0x69de, 0x69e8, 0x6a02, 0x6a1b, 0x69ff, 0x6b0a, 0x69f9, 0x69f2,
+  0x69e7, 0x6a05, 0x69b1, 0x6a1e, 0x69ed, 0x6a14, 0x69eb, 0x6a0a,
+  0x6a12, 0x6ac1, 0x6a23, 0x6a13, 0x6a44, 0x6a0c, 0x6a72, 0x6a36,
+  0x6a78, 0x6a47, 0x6a62, 0x6a59, 0x6a66, 0x6a48, 0x6a38, 0x6a22,
+  0x6a90, 0x6a8d, 0x6aa0, 0x6a84, 0x6aa2, 0x6aa3,
+  /* 0x5d */
+  0x6a97, 0x8617, 0x6abb, 0x6ac3, 0x6ac2, 0x6ab8, 0x6ab3, 0x6aac,
+  0x6ade, 0x6ad1, 0x6adf, 0x6aaa, 0x6ada, 0x6aea, 0x6afb, 0x6b05,
+  0x8616, 0x6afa, 0x6b12, 0x6b16, 0x9b31, 0x6b1f, 0x6b38, 0x6b37,
+  0x76dc, 0x6b39, 0x98ee, 0x6b47, 0x6b43, 0x6b49, 0x6b50, 0x6b59,
+  0x6b54, 0x6b5b, 0x6b5f, 0x6b61, 0x6b78, 0x6b79, 0x6b7f, 0x6b80,
+  0x6b84, 0x6b83, 0x6b8d, 0x6b98, 0x6b95, 0x6b9e, 0x6ba4, 0x6baa,
+  0x6bab, 0x6baf, 0x6bb2, 0x6bb1, 0x6bb3, 0x6bb7, 0x6bbc, 0x6bc6,
+  0x6bcb, 0x6bd3, 0x6bdf, 0x6bec, 0x6beb, 0x6bf3, 0x6bef, 0x9ebe,
+  0x6c08, 0x6c13, 0x6c14, 0x6c1b, 0x6c24, 0x6c23, 0x6c5e, 0x6c55,
+  0x6c62, 0x6c6a, 0x6c82, 0x6c8d, 0x6c9a, 0x6c81, 0x6c9b, 0x6c7e,
+  0x6c68, 0x6c73, 0x6c92, 0x6c90, 0x6cc4, 0x6cf1, 0x6cd3, 0x6cbd,
+  0x6cd7, 0x6cc5, 0x6cdd, 0x6cae, 0x6cb1, 0x6cbe,
+  /* 0x5e */
+  0x6cba, 0x6cdb, 0x6cef, 0x6cd9, 0x6cea, 0x6d1f, 0x884d, 0x6d36,
+  0x6d2b, 0x6d3d, 0x6d38, 0x6d19, 0x6d35, 0x6d33, 0x6d12, 0x6d0c,
+  0x6d63, 0x6d93, 0x6d64, 0x6d5a, 0x6d79, 0x6d59, 0x6d8e, 0x6d95,
+  0x6fe4, 0x6d85, 0x6df9, 0x6e15, 0x6e0a, 0x6db5, 0x6dc7, 0x6de6,
+  0x6db8, 0x6dc6, 0x6dec, 0x6dde, 0x6dcc, 0x6de8, 0x6dd2, 0x6dc5,
+  0x6dfa, 0x6dd9, 0x6de4, 0x6dd5, 0x6dea, 0x6dee, 0x6e2d, 0x6e6e,
+  0x6e2e, 0x6e19, 0x6e72, 0x6e5f, 0x6e3e, 0x6e23, 0x6e6b, 0x6e2b,
+  0x6e76, 0x6e4d, 0x6e1f, 0x6e43, 0x6e3a, 0x6e4e, 0x6e24, 0x6eff,
+  0x6e1d, 0x6e38, 0x6e82, 0x6eaa, 0x6e98, 0x6ec9, 0x6eb7, 0x6ed3,
+  0x6ebd, 0x6eaf, 0x6ec4, 0x6eb2, 0x6ed4, 0x6ed5, 0x6e8f, 0x6ea5,
+  0x6ec2, 0x6e9f, 0x6f41, 0x6f11, 0x704c, 0x6eec, 0x6ef8, 0x6efe,
+  0x6f3f, 0x6ef2, 0x6f31, 0x6eef, 0x6f32, 0x6ecc,
+  /* 0x5f */
+  0x6f3e, 0x6f13, 0x6ef7, 0x6f86, 0x6f7a, 0x6f78, 0x6f81, 0x6f80,
+  0x6f6f, 0x6f5b, 0x6ff3, 0x6f6d, 0x6f82, 0x6f7c, 0x6f58, 0x6f8e,
+  0x6f91, 0x6fc2, 0x6f66, 0x6fb3, 0x6fa3, 0x6fa1, 0x6fa4, 0x6fb9,
+  0x6fc6, 0x6faa, 0x6fdf, 0x6fd5, 0x6fec, 0x6fd4, 0x6fd8, 0x6ff1,
+  0x6fee, 0x6fdb, 0x7009, 0x700b, 0x6ffa, 0x7011, 0x7001, 0x700f,
+  0x6ffe, 0x701b, 0x701a, 0x6f74, 0x701d, 0x7018, 0x701f, 0x7030,
+  0x703e, 0x7032, 0x7051, 0x7063, 0x7099, 0x7092, 0x70af, 0x70f1,
+  0x70ac, 0x70b8, 0x70b3, 0x70ae, 0x70df, 0x70cb, 0x70dd, 0x70d9,
+  0x7109, 0x70fd, 0x711c, 0x7119, 0x7165, 0x7155, 0x7188, 0x7166,
+  0x7162, 0x714c, 0x7156, 0x716c, 0x718f, 0x71fb, 0x7184, 0x7195,
+  0x71a8, 0x71ac, 0x71d7, 0x71b9, 0x71be, 0x71d2, 0x71c9, 0x71d4,
+  0x71ce, 0x71e0, 0x71ec, 0x71e7, 0x71f5, 0x71fc,
+  /* 0x60 */
+  0x71f9, 0x71ff, 0x720d, 0x7210, 0x721b, 0x7228, 0x722d, 0x722c,
+  0x7230, 0x7232, 0x723b, 0x723c, 0x723f, 0x7240, 0x7246, 0x724b,
+  0x7258, 0x7274, 0x727e, 0x7282, 0x7281, 0x7287, 0x7292, 0x7296,
+  0x72a2, 0x72a7, 0x72b9, 0x72b2, 0x72c3, 0x72c6, 0x72c4, 0x72ce,
+  0x72d2, 0x72e2, 0x72e0, 0x72e1, 0x72f9, 0x72f7, 0x500f, 0x7317,
+  0x730a, 0x731c, 0x7316, 0x731d, 0x7334, 0x732f, 0x7329, 0x7325,
+  0x733e, 0x734e, 0x734f, 0x9ed8, 0x7357, 0x736a, 0x7368, 0x7370,
+  0x7378, 0x7375, 0x737b, 0x737a, 0x73c8, 0x73b3, 0x73ce, 0x73bb,
+  0x73c0, 0x73e5, 0x73ee, 0x73de, 0x74a2, 0x7405, 0x746f, 0x7425,
+  0x73f8, 0x7432, 0x743a, 0x7455, 0x743f, 0x745f, 0x7459, 0x7441,
+  0x745c, 0x7469, 0x7470, 0x7463, 0x746a, 0x7476, 0x747e, 0x748b,
+  0x749e, 0x74a7, 0x74ca, 0x74cf, 0x74d4, 0x73f1,
+  /* 0x61 */
+  0x74e0, 0x74e3, 0x74e7, 0x74e9, 0x74ee, 0x74f2, 0x74f0, 0x74f1,
+  0x74f8, 0x74f7, 0x7504, 0x7503, 0x7505, 0x750c, 0x750e, 0x750d,
+  0x7515, 0x7513, 0x751e, 0x7526, 0x752c, 0x753c, 0x7544, 0x754d,
+  0x754a, 0x7549, 0x755b, 0x7546, 0x755a, 0x7569, 0x7564, 0x7567,
+  0x756b, 0x756d, 0x7578, 0x7576, 0x7586, 0x7587, 0x7574, 0x758a,
+  0x7589, 0x7582, 0x7594, 0x759a, 0x759d, 0x75a5, 0x75a3, 0x75c2,
+  0x75b3, 0x75c3, 0x75b5, 0x75bd, 0x75b8, 0x75bc, 0x75b1, 0x75cd,
+  0x75ca, 0x75d2, 0x75d9, 0x75e3, 0x75de, 0x75fe, 0x75ff, 0x75fc,
+  0x7601, 0x75f0, 0x75fa, 0x75f2, 0x75f3, 0x760b, 0x760d, 0x7609,
+  0x761f, 0x7627, 0x7620, 0x7621, 0x7622, 0x7624, 0x7634, 0x7630,
+  0x763b, 0x7647, 0x7648, 0x7646, 0x765c, 0x7658, 0x7661, 0x7662,
+  0x7668, 0x7669, 0x766a, 0x7667, 0x766c, 0x7670,
+  /* 0x62 */
+  0x7672, 0x7676, 0x7678, 0x767c, 0x7680, 0x7683, 0x7688, 0x768b,
+  0x768e, 0x7696, 0x7693, 0x7699, 0x769a, 0x76b0, 0x76b4, 0x76b8,
+  0x76b9, 0x76ba, 0x76c2, 0x76cd, 0x76d6, 0x76d2, 0x76de, 0x76e1,
+  0x76e5, 0x76e7, 0x76ea, 0x862f, 0x76fb, 0x7708, 0x7707, 0x7704,
+  0x7729, 0x7724, 0x771e, 0x7725, 0x7726, 0x771b, 0x7737, 0x7738,
+  0x7747, 0x775a, 0x7768, 0x776b, 0x775b, 0x7765, 0x777f, 0x777e,
+  0x7779, 0x778e, 0x778b, 0x7791, 0x77a0, 0x779e, 0x77b0, 0x77b6,
+  0x77b9, 0x77bf, 0x77bc, 0x77bd, 0x77bb, 0x77c7, 0x77cd, 0x77d7,
+  0x77da, 0x77dc, 0x77e3, 0x77ee, 0x77fc, 0x780c, 0x7812, 0x7926,
+  0x7820, 0x792a, 0x7845, 0x788e, 0x7874, 0x7886, 0x787c, 0x789a,
+  0x788c, 0x78a3, 0x78b5, 0x78aa, 0x78af, 0x78d1, 0x78c6, 0x78cb,
+  0x78d4, 0x78be, 0x78bc, 0x78c5, 0x78ca, 0x78ec,
+  /* 0x63 */
+  0x78e7, 0x78da, 0x78fd, 0x78f4, 0x7907, 0x7912, 0x7911, 0x7919,
+  0x792c, 0x792b, 0x7940, 0x7960, 0x7957, 0x795f, 0x795a, 0x7955,
+  0x7953, 0x797a, 0x797f, 0x798a, 0x799d, 0x79a7, 0x9f4b, 0x79aa,
+  0x79ae, 0x79b3, 0x79b9, 0x79ba, 0x79c9, 0x79d5, 0x79e7, 0x79ec,
+  0x79e1, 0x79e3, 0x7a08, 0x7a0d, 0x7a18, 0x7a19, 0x7a20, 0x7a1f,
+  0x7980, 0x7a31, 0x7a3b, 0x7a3e, 0x7a37, 0x7a43, 0x7a57, 0x7a49,
+  0x7a61, 0x7a62, 0x7a69, 0x9f9d, 0x7a70, 0x7a79, 0x7a7d, 0x7a88,
+  0x7a97, 0x7a95, 0x7a98, 0x7a96, 0x7aa9, 0x7ac8, 0x7ab0, 0x7ab6,
+  0x7ac5, 0x7ac4, 0x7abf, 0x9083, 0x7ac7, 0x7aca, 0x7acd, 0x7acf,
+  0x7ad5, 0x7ad3, 0x7ad9, 0x7ada, 0x7add, 0x7ae1, 0x7ae2, 0x7ae6,
+  0x7aed, 0x7af0, 0x7b02, 0x7b0f, 0x7b0a, 0x7b06, 0x7b33, 0x7b18,
+  0x7b19, 0x7b1e, 0x7b35, 0x7b28, 0x7b36, 0x7b50,
+  /* 0x64 */
+  0x7b7a, 0x7b04, 0x7b4d, 0x7b0b, 0x7b4c, 0x7b45, 0x7b75, 0x7b65,
+  0x7b74, 0x7b67, 0x7b70, 0x7b71, 0x7b6c, 0x7b6e, 0x7b9d, 0x7b98,
+  0x7b9f, 0x7b8d, 0x7b9c, 0x7b9a, 0x7b8b, 0x7b92, 0x7b8f, 0x7b5d,
+  0x7b99, 0x7bcb, 0x7bc1, 0x7bcc, 0x7bcf, 0x7bb4, 0x7bc6, 0x7bdd,
+  0x7be9, 0x7c11, 0x7c14, 0x7be6, 0x7be5, 0x7c60, 0x7c00, 0x7c07,
+  0x7c13, 0x7bf3, 0x7bf7, 0x7c17, 0x7c0d, 0x7bf6, 0x7c23, 0x7c27,
+  0x7c2a, 0x7c1f, 0x7c37, 0x7c2b, 0x7c3d, 0x7c4c, 0x7c43, 0x7c54,
+  0x7c4f, 0x7c40, 0x7c50, 0x7c58, 0x7c5f, 0x7c64, 0x7c56, 0x7c65,
+  0x7c6c, 0x7c75, 0x7c83, 0x7c90, 0x7ca4, 0x7cad, 0x7ca2, 0x7cab,
+  0x7ca1, 0x7ca8, 0x7cb3, 0x7cb2, 0x7cb1, 0x7cae, 0x7cb9, 0x7cbd,
+  0x7cc0, 0x7cc5, 0x7cc2, 0x7cd8, 0x7cd2, 0x7cdc, 0x7ce2, 0x9b3b,
+  0x7cef, 0x7cf2, 0x7cf4, 0x7cf6, 0x7cfa, 0x7d06,
+  /* 0x65 */
+  0x7d02, 0x7d1c, 0x7d15, 0x7d0a, 0x7d45, 0x7d4b, 0x7d2e, 0x7d32,
+  0x7d3f, 0x7d35, 0x7d46, 0x7d73, 0x7d56, 0x7d4e, 0x7d72, 0x7d68,
+  0x7d6e, 0x7d4f, 0x7d63, 0x7d93, 0x7d89, 0x7d5b, 0x7d8f, 0x7d7d,
+  0x7d9b, 0x7dba, 0x7dae, 0x7da3, 0x7db5, 0x7dc7, 0x7dbd, 0x7dab,
+  0x7e3d, 0x7da2, 0x7daf, 0x7ddc, 0x7db8, 0x7d9f, 0x7db0, 0x7dd8,
+  0x7ddd, 0x7de4, 0x7dde, 0x7dfb, 0x7df2, 0x7de1, 0x7e05, 0x7e0a,
+  0x7e23, 0x7e21, 0x7e12, 0x7e31, 0x7e1f, 0x7e09, 0x7e0b, 0x7e22,
+  0x7e46, 0x7e66, 0x7e3b, 0x7e35, 0x7e39, 0x7e43, 0x7e37, 0x7e32,
+  0x7e3a, 0x7e67, 0x7e5d, 0x7e56, 0x7e5e, 0x7e59, 0x7e5a, 0x7e79,
+  0x7e6a, 0x7e69, 0x7e7c, 0x7e7b, 0x7e83, 0x7dd5, 0x7e7d, 0x8fae,
+  0x7e7f, 0x7e88, 0x7e89, 0x7e8c, 0x7e92, 0x7e90, 0x7e93, 0x7e94,
+  0x7e96, 0x7e8e, 0x7e9b, 0x7e9c, 0x7f38, 0x7f3a,
+  /* 0x66 */
+  0x7f45, 0x7f4c, 0x7f4d, 0x7f4e, 0x7f50, 0x7f51, 0x7f55, 0x7f54,
+  0x7f58, 0x7f5f, 0x7f60, 0x7f68, 0x7f69, 0x7f67, 0x7f78, 0x7f82,
+  0x7f86, 0x7f83, 0x7f88, 0x7f87, 0x7f8c, 0x7f94, 0x7f9e, 0x7f9d,
+  0x7f9a, 0x7fa3, 0x7faf, 0x7fb2, 0x7fb9, 0x7fae, 0x7fb6, 0x7fb8,
+  0x8b71, 0x7fc5, 0x7fc6, 0x7fca, 0x7fd5, 0x7fd4, 0x7fe1, 0x7fe6,
+  0x7fe9, 0x7ff3, 0x7ff9, 0x98dc, 0x8006, 0x8004, 0x800b, 0x8012,
+  0x8018, 0x8019, 0x801c, 0x8021, 0x8028, 0x803f, 0x803b, 0x804a,
+  0x8046, 0x8052, 0x8058, 0x805a, 0x805f, 0x8062, 0x8068, 0x8073,
+  0x8072, 0x8070, 0x8076, 0x8079, 0x807d, 0x807f, 0x8084, 0x8086,
+  0x8085, 0x809b, 0x8093, 0x809a, 0x80ad, 0x5190, 0x80ac, 0x80db,
+  0x80e5, 0x80d9, 0x80dd, 0x80c4, 0x80da, 0x80d6, 0x8109, 0x80ef,
+  0x80f1, 0x811b, 0x8129, 0x8123, 0x812f, 0x814b,
+  /* 0x67 */
+  0x968b, 0x8146, 0x813e, 0x8153, 0x8151, 0x80fc, 0x8171, 0x816e,
+  0x8165, 0x8166, 0x8174, 0x8183, 0x8188, 0x818a, 0x8180, 0x8182,
+  0x81a0, 0x8195, 0x81a4, 0x81a3, 0x815f, 0x8193, 0x81a9, 0x81b0,
+  0x81b5, 0x81be, 0x81b8, 0x81bd, 0x81c0, 0x81c2, 0x81ba, 0x81c9,
+  0x81cd, 0x81d1, 0x81d9, 0x81d8, 0x81c8, 0x81da, 0x81df, 0x81e0,
+  0x81e7, 0x81fa, 0x81fb, 0x81fe, 0x8201, 0x8202, 0x8205, 0x8207,
+  0x820a, 0x820d, 0x8210, 0x8216, 0x8229, 0x822b, 0x8238, 0x8233,
+  0x8240, 0x8259, 0x8258, 0x825d, 0x825a, 0x825f, 0x8264, 0x8262,
+  0x8268, 0x826a, 0x826b, 0x822e, 0x8271, 0x8277, 0x8278, 0x827e,
+  0x828d, 0x8292, 0x82ab, 0x829f, 0x82bb, 0x82ac, 0x82e1, 0x82e3,
+  0x82df, 0x82d2, 0x82f4, 0x82f3, 0x82fa, 0x8393, 0x8303, 0x82fb,
+  0x82f9, 0x82de, 0x8306, 0x82dc, 0x8309, 0x82d9,
+  /* 0x68 */
+  0x8335, 0x8334, 0x8316, 0x8332, 0x8331, 0x8340, 0x8339, 0x8350,
+  0x8345, 0x832f, 0x832b, 0x8317, 0x8318, 0x8385, 0x839a, 0x83aa,
+  0x839f, 0x83a2, 0x8396, 0x8323, 0x838e, 0x8387, 0x838a, 0x837c,
+  0x83b5, 0x8373, 0x8375, 0x83a0, 0x8389, 0x83a8, 0x83f4, 0x8413,
+  0x83eb, 0x83ce, 0x83fd, 0x8403, 0x83d8, 0x840b, 0x83c1, 0x83f7,
+  0x8407, 0x83e0, 0x83f2, 0x840d, 0x8422, 0x8420, 0x83bd, 0x8438,
+  0x8506, 0x83fb, 0x846d, 0x842a, 0x843c, 0x855a, 0x8484, 0x8477,
+  0x846b, 0x84ad, 0x846e, 0x8482, 0x8469, 0x8446, 0x842c, 0x846f,
+  0x8479, 0x8435, 0x84ca, 0x8462, 0x84b9, 0x84bf, 0x849f, 0x84d9,
+  0x84cd, 0x84bb, 0x84da, 0x84d0, 0x84c1, 0x84c6, 0x84d6, 0x84a1,
+  0x8521, 0x84ff, 0x84f4, 0x8517, 0x8518, 0x852c, 0x851f, 0x8515,
+  0x8514, 0x84fc, 0x8540, 0x8563, 0x8558, 0x8548,
+  /* 0x69 */
+  0x8541, 0x8602, 0x854b, 0x8555, 0x8580, 0x85a4, 0x8588, 0x8591,
+  0x858a, 0x85a8, 0x856d, 0x8594, 0x859b, 0x85ea, 0x8587, 0x859c,
+  0x8577, 0x857e, 0x8590, 0x85c9, 0x85ba, 0x85cf, 0x85b9, 0x85d0,
+  0x85d5, 0x85dd, 0x85e5, 0x85dc, 0x85f9, 0x860a, 0x8613, 0x860b,
+  0x85fe, 0x85fa, 0x8606, 0x8622, 0x861a, 0x8630, 0x863f, 0x864d,
+  0x4e55, 0x8654, 0x865f, 0x8667, 0x8671, 0x8693, 0x86a3, 0x86a9,
+  0x86aa, 0x868b, 0x868c, 0x86b6, 0x86af, 0x86c4, 0x86c6, 0x86b0,
+  0x86c9, 0x8823, 0x86ab, 0x86d4, 0x86de, 0x86e9, 0x86ec, 0x86df,
+  0x86db, 0x86ef, 0x8712, 0x8706, 0x8708, 0x8700, 0x8703, 0x86fb,
+  0x8711, 0x8709, 0x870d, 0x86f9, 0x870a, 0x8734, 0x873f, 0x8737,
+  0x873b, 0x8725, 0x8729, 0x871a, 0x8760, 0x875f, 0x8778, 0x874c,
+  0x874e, 0x8774, 0x8757, 0x8768, 0x876e, 0x8759,
+  /* 0x6a */
+  0x8753, 0x8763, 0x876a, 0x8805, 0x87a2, 0x879f, 0x8782, 0x87af,
+  0x87cb, 0x87bd, 0x87c0, 0x87d0, 0x96d6, 0x87ab, 0x87c4, 0x87b3,
+  0x87c7, 0x87c6, 0x87bb, 0x87ef, 0x87f2, 0x87e0, 0x880f, 0x880d,
+  0x87fe, 0x87f6, 0x87f7, 0x880e, 0x87d2, 0x8811, 0x8816, 0x8815,
+  0x8822, 0x8821, 0x8831, 0x8836, 0x8839, 0x8827, 0x883b, 0x8844,
+  0x8842, 0x8852, 0x8859, 0x885e, 0x8862, 0x886b, 0x8881, 0x887e,
+  0x889e, 0x8875, 0x887d, 0x88b5, 0x8872, 0x8882, 0x8897, 0x8892,
+  0x88ae, 0x8899, 0x88a2, 0x888d, 0x88a4, 0x88b0, 0x88bf, 0x88b1,
+  0x88c3, 0x88c4, 0x88d4, 0x88d8, 0x88d9, 0x88dd, 0x88f9, 0x8902,
+  0x88fc, 0x88f4, 0x88e8, 0x88f2, 0x8904, 0x890c, 0x890a, 0x8913,
+  0x8943, 0x891e, 0x8925, 0x892a, 0x892b, 0x8941, 0x8944, 0x893b,
+  0x8936, 0x8938, 0x894c, 0x891d, 0x8960, 0x895e,
+  /* 0x6b */
+  0x8966, 0x8964, 0x896d, 0x896a, 0x896f, 0x8974, 0x8977, 0x897e,
+  0x8983, 0x8988, 0x898a, 0x8993, 0x8998, 0x89a1, 0x89a9, 0x89a6,
+  0x89ac, 0x89af, 0x89b2, 0x89ba, 0x89bd, 0x89bf, 0x89c0, 0x89da,
+  0x89dc, 0x89dd, 0x89e7, 0x89f4, 0x89f8, 0x8a03, 0x8a16, 0x8a10,
+  0x8a0c, 0x8a1b, 0x8a1d, 0x8a25, 0x8a36, 0x8a41, 0x8a5b, 0x8a52,
+  0x8a46, 0x8a48, 0x8a7c, 0x8a6d, 0x8a6c, 0x8a62, 0x8a85, 0x8a82,
+  0x8a84, 0x8aa8, 0x8aa1, 0x8a91, 0x8aa5, 0x8aa6, 0x8a9a, 0x8aa3,
+  0x8ac4, 0x8acd, 0x8ac2, 0x8ada, 0x8aeb, 0x8af3, 0x8ae7, 0x8ae4,
+  0x8af1, 0x8b14, 0x8ae0, 0x8ae2, 0x8af7, 0x8ade, 0x8adb, 0x8b0c,
+  0x8b07, 0x8b1a, 0x8ae1, 0x8b16, 0x8b10, 0x8b17, 0x8b20, 0x8b33,
+  0x97ab, 0x8b26, 0x8b2b, 0x8b3e, 0x8b28, 0x8b41, 0x8b4c, 0x8b4f,
+  0x8b4e, 0x8b49, 0x8b56, 0x8b5b, 0x8b5a, 0x8b6b,
+  /* 0x6c */
+  0x8b5f, 0x8b6c, 0x8b6f, 0x8b74, 0x8b7d, 0x8b80, 0x8b8c, 0x8b8e,
+  0x8b92, 0x8b93, 0x8b96, 0x8b99, 0x8b9a, 0x8c3a, 0x8c41, 0x8c3f,
+  0x8c48, 0x8c4c, 0x8c4e, 0x8c50, 0x8c55, 0x8c62, 0x8c6c, 0x8c78,
+  0x8c7a, 0x8c82, 0x8c89, 0x8c85, 0x8c8a, 0x8c8d, 0x8c8e, 0x8c94,
+  0x8c7c, 0x8c98, 0x621d, 0x8cad, 0x8caa, 0x8cbd, 0x8cb2, 0x8cb3,
+  0x8cae, 0x8cb6, 0x8cc8, 0x8cc1, 0x8ce4, 0x8ce3, 0x8cda, 0x8cfd,
+  0x8cfa, 0x8cfb, 0x8d04, 0x8d05, 0x8d0a, 0x8d07, 0x8d0f, 0x8d0d,
+  0x8d10, 0x9f4e, 0x8d13, 0x8ccd, 0x8d14, 0x8d16, 0x8d67, 0x8d6d,
+  0x8d71, 0x8d73, 0x8d81, 0x8d99, 0x8dc2, 0x8dbe, 0x8dba, 0x8dcf,
+  0x8dda, 0x8dd6, 0x8dcc, 0x8ddb, 0x8dcb, 0x8dea, 0x8deb, 0x8ddf,
+  0x8de3, 0x8dfc, 0x8e08, 0x8e09, 0x8dff, 0x8e1d, 0x8e1e, 0x8e10,
+  0x8e1f, 0x8e42, 0x8e35, 0x8e30, 0x8e34, 0x8e4a,
+  /* 0x6d */
+  0x8e47, 0x8e49, 0x8e4c, 0x8e50, 0x8e48, 0x8e59, 0x8e64, 0x8e60,
+  0x8e2a, 0x8e63, 0x8e55, 0x8e76, 0x8e72, 0x8e7c, 0x8e81, 0x8e87,
+  0x8e85, 0x8e84, 0x8e8b, 0x8e8a, 0x8e93, 0x8e91, 0x8e94, 0x8e99,
+  0x8eaa, 0x8ea1, 0x8eac, 0x8eb0, 0x8ec6, 0x8eb1, 0x8ebe, 0x8ec5,
+  0x8ec8, 0x8ecb, 0x8edb, 0x8ee3, 0x8efc, 0x8efb, 0x8eeb, 0x8efe,
+  0x8f0a, 0x8f05, 0x8f15, 0x8f12, 0x8f19, 0x8f13, 0x8f1c, 0x8f1f,
+  0x8f1b, 0x8f0c, 0x8f26, 0x8f33, 0x8f3b, 0x8f39, 0x8f45, 0x8f42,
+  0x8f3e, 0x8f4c, 0x8f49, 0x8f46, 0x8f4e, 0x8f57, 0x8f5c, 0x8f62,
+  0x8f63, 0x8f64, 0x8f9c, 0x8f9f, 0x8fa3, 0x8fad, 0x8faf, 0x8fb7,
+  0x8fda, 0x8fe5, 0x8fe2, 0x8fea, 0x8fef, 0x9087, 0x8ff4, 0x9005,
+  0x8ff9, 0x8ffa, 0x9011, 0x9015, 0x9021, 0x900d, 0x901e, 0x9016,
+  0x900b, 0x9027, 0x9036, 0x9035, 0x9039, 0x8ff8,
+  /* 0x6e */
+  0x904f, 0x9050, 0x9051, 0x9052, 0x900e, 0x9049, 0x903e, 0x9056,
+  0x9058, 0x905e, 0x9068, 0x906f, 0x9076, 0x96a8, 0x9072, 0x9082,
+  0x907d, 0x9081, 0x9080, 0x908a, 0x9089, 0x908f, 0x90a8, 0x90af,
+  0x90b1, 0x90b5, 0x90e2, 0x90e4, 0x6248, 0x90db, 0x9102, 0x9112,
+  0x9119, 0x9132, 0x9130, 0x914a, 0x9156, 0x9158, 0x9163, 0x9165,
+  0x9169, 0x9173, 0x9172, 0x918b, 0x9189, 0x9182, 0x91a2, 0x91ab,
+  0x91af, 0x91aa, 0x91b5, 0x91b4, 0x91ba, 0x91c0, 0x91c1, 0x91c9,
+  0x91cb, 0x91d0, 0x91d6, 0x91df, 0x91e1, 0x91db, 0x91fc, 0x91f5,
+  0x91f6, 0x921e, 0x91ff, 0x9214, 0x922c, 0x9215, 0x9211, 0x925e,
+  0x9257, 0x9245, 0x9249, 0x9264, 0x9248, 0x9295, 0x923f, 0x924b,
+  0x9250, 0x929c, 0x9296, 0x9293, 0x929b, 0x925a, 0x92cf, 0x92b9,
+  0x92b7, 0x92e9, 0x930f, 0x92fa, 0x9344, 0x932e,
+  /* 0x6f */
+  0x9319, 0x9322, 0x931a, 0x9323, 0x933a, 0x9335, 0x933b, 0x935c,
+  0x9360, 0x937c, 0x936e, 0x9356, 0x93b0, 0x93ac, 0x93ad, 0x9394,
+  0x93b9, 0x93d6, 0x93d7, 0x93e8, 0x93e5, 0x93d8, 0x93c3, 0x93dd,
+  0x93d0, 0x93c8, 0x93e4, 0x941a, 0x9414, 0x9413, 0x9403, 0x9407,
+  0x9410, 0x9436, 0x942b, 0x9435, 0x9421, 0x943a, 0x9441, 0x9452,
+  0x9444, 0x945b, 0x9460, 0x9462, 0x945e, 0x946a, 0x9229, 0x9470,
+  0x9475, 0x9477, 0x947d, 0x945a, 0x947c, 0x947e, 0x9481, 0x947f,
+  0x9582, 0x9587, 0x958a, 0x9594, 0x9596, 0x9598, 0x9599, 0x95a0,
+  0x95a8, 0x95a7, 0x95ad, 0x95bc, 0x95bb, 0x95b9, 0x95be, 0x95ca,
+  0x6ff6, 0x95c3, 0x95cd, 0x95cc, 0x95d5, 0x95d4, 0x95d6, 0x95dc,
+  0x95e1, 0x95e5, 0x95e2, 0x9621, 0x9628, 0x962e, 0x962f, 0x9642,
+  0x964c, 0x964f, 0x964b, 0x9677, 0x965c, 0x965e,
+  /* 0x70 */
+  0x965d, 0x965f, 0x9666, 0x9672, 0x966c, 0x968d, 0x9698, 0x9695,
+  0x9697, 0x96aa, 0x96a7, 0x96b1, 0x96b2, 0x96b0, 0x96b4, 0x96b6,
+  0x96b8, 0x96b9, 0x96ce, 0x96cb, 0x96c9, 0x96cd, 0x894d, 0x96dc,
+  0x970d, 0x96d5, 0x96f9, 0x9704, 0x9706, 0x9708, 0x9713, 0x970e,
+  0x9711, 0x970f, 0x9716, 0x9719, 0x9724, 0x972a, 0x9730, 0x9739,
+  0x973d, 0x973e, 0x9744, 0x9746, 0x9748, 0x9742, 0x9749, 0x975c,
+  0x9760, 0x9764, 0x9766, 0x9768, 0x52d2, 0x976b, 0x9771, 0x9779,
+  0x9785, 0x977c, 0x9781, 0x977a, 0x9786, 0x978b, 0x978f, 0x9790,
+  0x979c, 0x97a8, 0x97a6, 0x97a3, 0x97b3, 0x97b4, 0x97c3, 0x97c6,
+  0x97c8, 0x97cb, 0x97dc, 0x97ed, 0x9f4f, 0x97f2, 0x7adf, 0x97f6,
+  0x97f5, 0x980f, 0x980c, 0x9838, 0x9824, 0x9821, 0x9837, 0x983d,
+  0x9846, 0x984f, 0x984b, 0x986b, 0x986f, 0x9870,
+  /* 0x71 */
+  0x9871, 0x9874, 0x9873, 0x98aa, 0x98af, 0x98b1, 0x98b6, 0x98c4,
+  0x98c3, 0x98c6, 0x98e9, 0x98eb, 0x9903, 0x9909, 0x9912, 0x9914,
+  0x9918, 0x9921, 0x991d, 0x991e, 0x9924, 0x9920, 0x992c, 0x992e,
+  0x993d, 0x993e, 0x9942, 0x9949, 0x9945, 0x9950, 0x994b, 0x9951,
+  0x9952, 0x994c, 0x9955, 0x9997, 0x9998, 0x99a5, 0x99ad, 0x99ae,
+  0x99bc, 0x99df, 0x99db, 0x99dd, 0x99d8, 0x99d1, 0x99ed, 0x99ee,
+  0x99f1, 0x99f2, 0x99fb, 0x99f8, 0x9a01, 0x9a0f, 0x9a05, 0x99e2,
+  0x9a19, 0x9a2b, 0x9a37, 0x9a45, 0x9a42, 0x9a40, 0x9a43, 0x9a3e,
+  0x9a55, 0x9a4d, 0x9a5b, 0x9a57, 0x9a5f, 0x9a62, 0x9a65, 0x9a64,
+  0x9a69, 0x9a6b, 0x9a6a, 0x9aad, 0x9ab0, 0x9abc, 0x9ac0, 0x9acf,
+  0x9ad1, 0x9ad3, 0x9ad4, 0x9ade, 0x9adf, 0x9ae2, 0x9ae3, 0x9ae6,
+  0x9aef, 0x9aeb, 0x9aee, 0x9af4, 0x9af1, 0x9af7,
+  /* 0x72 */
+  0x9afb, 0x9b06, 0x9b18, 0x9b1a, 0x9b1f, 0x9b22, 0x9b23, 0x9b25,
+  0x9b27, 0x9b28, 0x9b29, 0x9b2a, 0x9b2e, 0x9b2f, 0x9b32, 0x9b44,
+  0x9b43, 0x9b4f, 0x9b4d, 0x9b4e, 0x9b51, 0x9b58, 0x9b74, 0x9b93,
+  0x9b83, 0x9b91, 0x9b96, 0x9b97, 0x9b9f, 0x9ba0, 0x9ba8, 0x9bb4,
+  0x9bc0, 0x9bca, 0x9bb9, 0x9bc6, 0x9bcf, 0x9bd1, 0x9bd2, 0x9be3,
+  0x9be2, 0x9be4, 0x9bd4, 0x9be1, 0x9c3a, 0x9bf2, 0x9bf1, 0x9bf0,
+  0x9c15, 0x9c14, 0x9c09, 0x9c13, 0x9c0c, 0x9c06, 0x9c08, 0x9c12,
+  0x9c0a, 0x9c04, 0x9c2e, 0x9c1b, 0x9c25, 0x9c24, 0x9c21, 0x9c30,
+  0x9c47, 0x9c32, 0x9c46, 0x9c3e, 0x9c5a, 0x9c60, 0x9c67, 0x9c76,
+  0x9c78, 0x9ce7, 0x9cec, 0x9cf0, 0x9d09, 0x9d08, 0x9ceb, 0x9d03,
+  0x9d06, 0x9d2a, 0x9d26, 0x9daf, 0x9d23, 0x9d1f, 0x9d44, 0x9d15,
+  0x9d12, 0x9d41, 0x9d3f, 0x9d3e, 0x9d46, 0x9d48,
+  /* 0x73 */
+  0x9d5d, 0x9d5e, 0x9d64, 0x9d51, 0x9d50, 0x9d59, 0x9d72, 0x9d89,
+  0x9d87, 0x9dab, 0x9d6f, 0x9d7a, 0x9d9a, 0x9da4, 0x9da9, 0x9db2,
+  0x9dc4, 0x9dc1, 0x9dbb, 0x9db8, 0x9dba, 0x9dc6, 0x9dcf, 0x9dc2,
+  0x9dd9, 0x9dd3, 0x9df8, 0x9de6, 0x9ded, 0x9def, 0x9dfd, 0x9e1a,
+  0x9e1b, 0x9e1e, 0x9e75, 0x9e79, 0x9e7d, 0x9e81, 0x9e88, 0x9e8b,
+  0x9e8c, 0x9e92, 0x9e95, 0x9e91, 0x9e9d, 0x9ea5, 0x9ea9, 0x9eb8,
+  0x9eaa, 0x9ead, 0x9761, 0x9ecc, 0x9ece, 0x9ecf, 0x9ed0, 0x9ed4,
+  0x9edc, 0x9ede, 0x9edd, 0x9ee0, 0x9ee5, 0x9ee8, 0x9eef, 0x9ef4,
+  0x9ef6, 0x9ef7, 0x9ef9, 0x9efb, 0x9efc, 0x9efd, 0x9f07, 0x9f08,
+  0x76b7, 0x9f15, 0x9f21, 0x9f2c, 0x9f3e, 0x9f4a, 0x9f52, 0x9f54,
+  0x9f63, 0x9f5f, 0x9f60, 0x9f61, 0x9f66, 0x9f67, 0x9f6c, 0x9f6a,
+  0x9f77, 0x9f72, 0x9f76, 0x9f95, 0x9f9c, 0x9fa0,
+  /* 0x74 */
+  0x582f, 0x69c7, 0x9059, 0x7464, 0x51dc, 0x7199,
+};
+
+static int
+jisx0208_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c1 = (s[0] & 0x7F);
+  if ((c1 >= 0x21 && c1 <= 0x28) || (c1 >= 0x30 && c1 <= 0x74)) {
+    if (n >= 2) {
+      unsigned char c2 = (s[1] & 0x7F);
+      if (c2 >= 0x21 && c2 < 0x7f) {
+        unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21);
+        unsigned short wc = 0xfffd;
+        if (i < 1410) {
+          if (i < 690)
+            wc = jisx0208_2uni_page21[i];
+        } else {
+          if (i < 7808)
+            wc = jisx0208_2uni_page30[i-1410];
+        }
+        if (wc != 0xfffd) {
+          *pwc = (ucs4_t) wc;
+          return 2;
+        }
+      }
+      return RET_ILSEQ;
+    }
+    return RET_TOOFEW(0);
+  }
+  return RET_ILSEQ;
+}
+
+static const unsigned short jisx0208_2charset[6879] = {
+  0x2140, 0x2171, 0x2172, 0x2178, 0x212f, 0x224c, 0x216b, 0x215e,
+  0x212d, 0x2279, 0x215f, 0x2160, 0x2621, 0x2622, 0x2623, 0x2624,
+  0x2625, 0x2626, 0x2627, 0x2628, 0x2629, 0x262a, 0x262b, 0x262c,
+  0x262d, 0x262e, 0x262f, 0x2630, 0x2631, 0x2632, 0x2633, 0x2634,
+  0x2635, 0x2636, 0x2637, 0x2638, 0x2641, 0x2642, 0x2643, 0x2644,
+  0x2645, 0x2646, 0x2647, 0x2648, 0x2649, 0x264a, 0x264b, 0x264c,
+  0x264d, 0x264e, 0x264f, 0x2650, 0x2651, 0x2652, 0x2653, 0x2654,
+  0x2655, 0x2656, 0x2657, 0x2658, 0x2727, 0x2721, 0x2722, 0x2723,
+  0x2724, 0x2725, 0x2726, 0x2728, 0x2729, 0x272a, 0x272b, 0x272c,
+  0x272d, 0x272e, 0x272f, 0x2730, 0x2731, 0x2732, 0x2733, 0x2734,
+  0x2735, 0x2736, 0x2737, 0x2738, 0x2739, 0x273a, 0x273b, 0x273c,
+  0x273d, 0x273e, 0x273f, 0x2740, 0x2741, 0x2751, 0x2752, 0x2753,
+  0x2754, 0x2755, 0x2756, 0x2758, 0x2759, 0x275a, 0x275b, 0x275c,
+  0x275d, 0x275e, 0x275f, 0x2760, 0x2761, 0x2762, 0x2763, 0x2764,
+  0x2765, 0x2766, 0x2767, 0x2768, 0x2769, 0x276a, 0x276b, 0x276c,
+  0x276d, 0x276e, 0x276f, 0x2770, 0x2771, 0x2757, 0x213e, 0x213d,
+  0x2142, 0x2146, 0x2147, 0x2148, 0x2149, 0x2277, 0x2278, 0x2145,
+  0x2144, 0x2273, 0x216c, 0x216d, 0x2228, 0x216e, 0x2272, 0x222b,
+  0x222c, 0x222a, 0x222d, 0x224d, 0x224e, 0x224f, 0x225f, 0x2250,
+  0x2260, 0x223a, 0x223b, 0x215d, 0x2265, 0x2267, 0x2167, 0x225c,
+  0x224a, 0x224b, 0x2241, 0x2240, 0x2269, 0x226a, 0x2168, 0x2268,
+  0x2266, 0x2262, 0x2162, 0x2261, 0x2165, 0x2166, 0x2263, 0x2264,
+  0x223e, 0x223f, 0x223c, 0x223d, 0x225d, 0x225e, 0x2821, 0x282c,
+  0x2822, 0x282d, 0x2823, 0x282e, 0x2824, 0x282f, 0x2826, 0x2831,
+  0x2825, 0x2830, 0x2827, 0x283c, 0x2837, 0x2832, 0x2829, 0x283e,
+  0x2839, 0x2834, 0x2828, 0x2838, 0x283d, 0x2833, 0x282a, 0x283a,
+  0x283f, 0x2835, 0x282b, 0x283b, 0x2840, 0x2836, 0x2223, 0x2222,
+  0x2225, 0x2224, 0x2227, 0x2226, 0x2221, 0x217e, 0x217b, 0x217d,
+  0x217c, 0x227e, 0x217a, 0x2179, 0x216a, 0x2169, 0x2276, 0x2275,
+  0x2274, 0x2121, 0x2122, 0x2123, 0x2137, 0x2139, 0x213a, 0x213b,
+  0x2152, 0x2153, 0x2154, 0x2155, 0x2156, 0x2157, 0x2158, 0x2159,
+  0x215a, 0x215b, 0x2229, 0x222e, 0x214c, 0x214d, 0x2141, 0x2421,
+  0x2422, 0x2423, 0x2424, 0x2425, 0x2426, 0x2427, 0x2428, 0x2429,
+  0x242a, 0x242b, 0x242c, 0x242d, 0x242e, 0x242f, 0x2430, 0x2431,
+  0x2432, 0x2433, 0x2434, 0x2435, 0x2436, 0x2437, 0x2438, 0x2439,
+  0x243a, 0x243b, 0x243c, 0x243d, 0x243e, 0x243f, 0x2440, 0x2441,
+  0x2442, 0x2443, 0x2444, 0x2445, 0x2446, 0x2447, 0x2448, 0x2449,
+  0x244a, 0x244b, 0x244c, 0x244d, 0x244e, 0x244f, 0x2450, 0x2451,
+  0x2452, 0x2453, 0x2454, 0x2455, 0x2456, 0x2457, 0x2458, 0x2459,
+  0x245a, 0x245b, 0x245c, 0x245d, 0x245e, 0x245f, 0x2460, 0x2461,
+  0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469,
+  0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x246f, 0x2470, 0x2471,
+  0x2472, 0x2473, 0x212b, 0x212c, 0x2135, 0x2136, 0x2521, 0x2522,
+  0x2523, 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252a,
+  0x252b, 0x252c, 0x252d, 0x252e, 0x252f, 0x2530, 0x2531, 0x2532,
+  0x2533, 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253a,
+  0x253b, 0x253c, 0x253d, 0x253e, 0x253f, 0x2540, 0x2541, 0x2542,
+  0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254a,
+  0x254b, 0x254c, 0x254d, 0x254e, 0x254f, 0x2550, 0x2551, 0x2552,
+  0x2553, 0x2554, 0x2555, 0x2556, 0x2557, 0x2558, 0x2559, 0x255a,
+  0x255b, 0x255c, 0x255d, 0x255e, 0x255f, 0x2560, 0x2561, 0x2562,
+  0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568, 0x2569, 0x256a,
+  0x256b, 0x256c, 0x256d, 0x256e, 0x256f, 0x2570, 0x2571, 0x2572,
+  0x2573, 0x2574, 0x2575, 0x2576, 0x2126, 0x213c, 0x2133, 0x2134,
+  0x306c, 0x437a, 0x3c37, 0x4b7c, 0x3e66, 0x3b30, 0x3e65, 0x323c,
+  0x4954, 0x4d3f, 0x5022, 0x312f, 0x336e, 0x5023, 0x4024, 0x5242,
+  0x3556, 0x4a3a, 0x3e67, 0x4e3e, 0x4a42, 0x5024, 0x4366, 0x5025,
+  0x367a, 0x5026, 0x345d, 0x4330, 0x3c67, 0x5027, 0x5028, 0x5029,
+  0x4735, 0x3557, 0x4737, 0x4663, 0x3843, 0x4b33, 0x6949, 0x502a,
+  0x3e68, 0x502b, 0x3235, 0x3665, 0x3870, 0x4c69, 0x5626, 0x4d70,
+  0x467d, 0x3425, 0x3535, 0x502c, 0x502d, 0x4e3b, 0x4d3d, 0x4168,
+  0x502f, 0x3b76, 0x4673, 0x5032, 0x313e, 0x385f, 0x385e, 0x3066,
+  0x4f4b, 0x4f4a, 0x3a33, 0x3021, 0x5033, 0x5034, 0x5035, 0x4b34,
+  0x5036, 0x3872, 0x3067, 0x4b72, 0x357c, 0x357d, 0x357e, 0x4462,
+  0x4e3c, 0x5037, 0x5038, 0x5039, 0x3f4d, 0x3d3a, 0x3f4e, 0x503e,
+  0x503c, 0x503d, 0x3558, 0x3a23, 0x3270, 0x503b, 0x503a, 0x4a29,
+  0x3b46, 0x3b45, 0x423e, 0x503f, 0x4955, 0x4067, 0x2138, 0x5040,
+  0x5042, 0x4265, 0x4e61, 0x304a, 0x5041, 0x323e, 0x3644, 0x4367,
+  0x376f, 0x5043, 0x4724, 0x346b, 0x5044, 0x304b, 0x3860, 0x346c,
+  0x497a, 0x4832, 0x3559, 0x3271, 0x5067, 0x4541, 0x476c, 0x5046,
+  0x483c, 0x4e62, 0x3f2d, 0x3b47, 0x3b77, 0x3240, 0x4451, 0x4322,
+  0x504a, 0x304c, 0x4463, 0x3d3b, 0x3a34, 0x4d24, 0x424e, 0x323f,
+  0x5049, 0x4d3e, 0x5045, 0x5047, 0x3a6e, 0x5048, 0x5524, 0x5050,
+  0x5053, 0x5051, 0x3242, 0x4a3b, 0x504b, 0x504f, 0x3873, 0x3b48,
+  0x3426, 0x5054, 0x504c, 0x4e63, 0x3b78, 0x504d, 0x5052, 0x5055,
+  0x504e, 0x3621, 0x304d, 0x3622, 0x3241, 0x5525, 0x4b79, 0x496e,
+  0x3874, 0x3f2f, 0x4e37, 0x4a58, 0x3738, 0x4225, 0x3264, 0x3d53,
+  0x5059, 0x505e, 0x505c, 0x5057, 0x422f, 0x505a, 0x505d, 0x505b,
+  0x4a5d, 0x5058, 0x3f2e, 0x4b73, 0x505f, 0x5060, 0x3d24, 0x506d,
+  0x4750, 0x4936, 0x5068, 0x4a70, 0x3236, 0x506c, 0x5066, 0x506f,
+  0x4152, 0x3844, 0x475c, 0x6047, 0x506e, 0x455d, 0x5063, 0x3876,
+  0x3875, 0x5061, 0x3c5a, 0x5069, 0x4a6f, 0x434d, 0x5065, 0x3771,
+  0x5062, 0x506a, 0x5064, 0x4e51, 0x506b, 0x4f41, 0x3666, 0x3770,
+  0x5070, 0x5071, 0x5075, 0x304e, 0x4a50, 0x5074, 0x5073, 0x5077,
+  0x5076, 0x4464, 0x3772, 0x5078, 0x3c45, 0x4226, 0x4465, 0x3676,
+  0x5079, 0x3536, 0x507a, 0x507c, 0x4b35, 0x3766, 0x3b31, 0x4877,
+  0x507b, 0x3a45, 0x4d43, 0x507e, 0x5123, 0x507d, 0x3a44, 0x3d7d,
+  0x3739, 0x5124, 0x364f, 0x5121, 0x5122, 0x462f, 0x417c, 0x3623,
+  0x4b4d, 0x5125, 0x4e3d, 0x5126, 0x5129, 0x5127, 0x414e, 0x5128,
+  0x512a, 0x512c, 0x512b, 0x4a48, 0x3537, 0x512e, 0x512f, 0x322f,
+  0x512d, 0x3c74, 0x5132, 0x5131, 0x5130, 0x5056, 0x5133, 0x3d7e,
+  0x5134, 0x4d25, 0x4c59, 0x5136, 0x5135, 0x5138, 0x5137, 0x5139,
+  0x513a, 0x3074, 0x3835, 0x373b, 0x3d3c, 0x437b, 0x3624, 0x4068,
+  0x3877, 0x396e, 0x513c, 0x4c48, 0x4546, 0x3b79, 0x513b, 0x513d,
+  0x455e, 0x3375, 0x513e, 0x467e, 0x4134, 0x5140, 0x5141, 0x482c,
+  0x3878, 0x4f3b, 0x5142, 0x3626, 0x4a3c, 0x4236, 0x3671, 0x4535,
+  0x3773, 0x5143, 0x5144, 0x4662, 0x315f, 0x5147, 0x3a7d, 0x5146,
+  0x3a46, 0x5148, 0x666e, 0x5149, 0x4b41, 0x514a, 0x514b, 0x514c,
+  0x3e69, 0x3c4c, 0x3427, 0x514f, 0x514d, 0x4c3d, 0x514e, 0x495a,
+  0x5150, 0x5151, 0x5152, 0x455f, 0x5156, 0x5154, 0x5155, 0x5153,
+  0x3a63, 0x5157, 0x4c6a, 0x4e64, 0x5158, 0x4028, 0x5159, 0x3d5a,
+  0x515a, 0x437c, 0x4e3f, 0x4560, 0x5245, 0x515b, 0x7425, 0x3645,
+  0x515c, 0x4b5e, 0x3d68, 0x427c, 0x515e, 0x4664, 0x515f, 0x5160,
+  0x332e, 0x5161, 0x3627, 0x464c, 0x317a, 0x3d50, 0x4821, 0x5162,
+  0x4561, 0x3f4f, 0x5163, 0x4a2c, 0x405a, 0x3422, 0x3429, 0x5164,
+  0x5166, 0x373a, 0x5165, 0x4e73, 0x3d69, 0x483d, 0x4a4c, 0x5167,
+  0x4d78, 0x5168, 0x5169, 0x457e, 0x516a, 0x4029, 0x3a7e, 0x3774,
+  0x516b, 0x3b49, 0x396f, 0x4466, 0x516d, 0x4227, 0x3a6f, 0x516e,
+  0x516f, 0x4130, 0x516c, 0x5171, 0x4b36, 0x3964, 0x5170, 0x3775,
+  0x3a5e, 0x476d, 0x5174, 0x5172, 0x497b, 0x3e6a, 0x517b, 0x3364,
+  0x5175, 0x5173, 0x414f, 0x5177, 0x5176, 0x3344, 0x3760, 0x517c,
+  0x4e2d, 0x5178, 0x517d, 0x517a, 0x5179, 0x4e4f, 0x3879, 0x3243,
+  0x4e74, 0x3d75, 0x4558, 0x3965, 0x5222, 0x5223, 0x4e65, 0x4f2b,
+  0x5225, 0x387a, 0x5224, 0x332f, 0x5226, 0x4b56, 0x443c, 0x4d26,
+  0x4a59, 0x5227, 0x7055, 0x4630, 0x5228, 0x342a, 0x4c33, 0x3e21,
+  0x5229, 0x4a67, 0x522d, 0x402a, 0x522a, 0x3650, 0x522b, 0x342b,
+  0x372e, 0x522e, 0x522f, 0x5230, 0x5231, 0x3c5b, 0x387b, 0x4c5e,
+  0x4c68, 0x4677, 0x4a71, 0x5232, 0x5233, 0x5235, 0x5237, 0x5236,
+  0x5238, 0x323d, 0x4b4c, 0x3a7c, 0x5239, 0x4159, 0x3e22, 0x3629,
+  0x523a, 0x485b, 0x523b, 0x523c, 0x523d, 0x523e, 0x4924, 0x3668,
+  0x3065, 0x463f, 0x523f, 0x3d3d, 0x4069, 0x5241, 0x5240, 0x3e23,
+  0x3861, 0x5243, 0x483e, 0x5244, 0x485c, 0x4234, 0x426e, 0x3628,
+  0x466e, 0x4331, 0x476e, 0x4b4e, 0x5246, 0x406a, 0x3735, 0x5247,
+  0x5248, 0x312c, 0x3075, 0x346d, 0x4228, 0x3551, 0x4d71, 0x524b,
+  0x3237, 0x524a, 0x362a, 0x524c, 0x4c71, 0x524d, 0x4e52, 0x387c,
+  0x3836, 0x524e, 0x5250, 0x524f, 0x3f5f, 0x3139, 0x315e, 0x5251,
+  0x5252, 0x3837, 0x5253, 0x356e, 0x3b32, 0x5254, 0x4b74, 0x3a35,
+  0x355a, 0x4d27, 0x4150, 0x483f, 0x3c7d, 0x3d47, 0x3c68, 0x3c75,
+  0x3d76, 0x4840, 0x5257, 0x3143, 0x4151, 0x387d, 0x3845, 0x3667,
+  0x525b, 0x4321, 0x427e, 0x362b, 0x3e24, 0x525c, 0x525a, 0x3244,
+  0x4266, 0x3c38, 0x3b4b, 0x3126, 0x3370, 0x3966, 0x3b4a, 0x525d,
+  0x525e, 0x3549, 0x3346, 0x3967, 0x3548, 0x445f, 0x3125, 0x4631,
+  0x4c3e, 0x3921, 0x4d79, 0x4547, 0x387e, 0x372f, 0x5267, 0x3663,
+  0x4b4a, 0x485d, 0x5266, 0x345e, 0x5261, 0x5262, 0x5264, 0x5265,
+  0x355b, 0x3f61, 0x4a2d, 0x5263, 0x525f, 0x3863, 0x5260, 0x4f24,
+  0x4a72, 0x4468, 0x3862, 0x3970, 0x5268, 0x465d, 0x526c, 0x3c7e,
+  0x3c76, 0x526f, 0x526d, 0x4c23, 0x526a, 0x5273, 0x526e, 0x5271,
+  0x3846, 0x4c3f, 0x5272, 0x5274, 0x5276, 0x3a70, 0x4f42, 0x526b,
+  0x5269, 0x5275, 0x5270, 0x5278, 0x5323, 0x527a, 0x527e, 0x5321,
+  0x527b, 0x533e, 0x3a69, 0x3331, 0x5279, 0x5325, 0x3076, 0x5324,
+  0x3025, 0x494a, 0x5322, 0x527c, 0x5277, 0x527d, 0x3a48, 0x5326,
+  0x3077, 0x532f, 0x5327, 0x5328, 0x3e25, 0x4b69, 0x532d, 0x532c,
+  0x452f, 0x532e, 0x532b, 0x3134, 0x3a36, 0x3f30, 0x5329, 0x4562,
+  0x532a, 0x3022, 0x5334, 0x4d23, 0x3e27, 0x533a, 0x5339, 0x5330,
+  0x4243, 0x5331, 0x426f, 0x5336, 0x3e26, 0x5333, 0x4c64, 0x373c,
+  0x5337, 0x5338, 0x5335, 0x533b, 0x5332, 0x5341, 0x5346, 0x5342,
+  0x533d, 0x5347, 0x4131, 0x5349, 0x3922, 0x533f, 0x437d, 0x5343,
+  0x533c, 0x342d, 0x346e, 0x3365, 0x5344, 0x5340, 0x3776, 0x534a,
+  0x5348, 0x4153, 0x354a, 0x362c, 0x5345, 0x3674, 0x3144, 0x534e,
+  0x534c, 0x5427, 0x5351, 0x534b, 0x534f, 0x534d, 0x3b4c, 0x5350,
+  0x5353, 0x5358, 0x5356, 0x5355, 0x4332, 0x3245, 0x5352, 0x5354,
+  0x3e28, 0x3133, 0x5357, 0x325e, 0x5362, 0x3e7c, 0x535e, 0x535c,
+  0x535d, 0x535f, 0x313d, 0x4139, 0x5359, 0x535a, 0x337a, 0x5361,
+  0x346f, 0x5364, 0x5360, 0x5363, 0x4a2e, 0x4655, 0x4838, 0x5366,
+  0x5365, 0x3345, 0x5367, 0x536a, 0x5369, 0x5368, 0x4739, 0x536b,
+  0x536c, 0x536e, 0x536d, 0x5370, 0x5373, 0x5371, 0x536f, 0x5372,
+  0x5374, 0x5375, 0x5376, 0x5377, 0x5378, 0x5145, 0x3c7c, 0x3b4d,
+  0x3273, 0x3078, 0x4344, 0x5379, 0x3a24, 0x304f, 0x3f5e, 0x537a,
+  0x3847, 0x3971, 0x537c, 0x537b, 0x4a60, 0x537d, 0x5421, 0x537e,
+  0x5422, 0x5423, 0x3777, 0x3160, 0x5424, 0x5426, 0x5425, 0x5428,
+  0x455a, 0x5429, 0x3035, 0x3a5f, 0x373d, 0x434f, 0x542a, 0x542b,
+  0x542d, 0x542e, 0x3a64, 0x3651, 0x4b37, 0x542c, 0x542f, 0x3a41,
+  0x3923, 0x5433, 0x3a25, 0x4333, 0x5430, 0x445a, 0x5434, 0x3f62,
+  0x5432, 0x5435, 0x373f, 0x5436, 0x5437, 0x3924, 0x3340, 0x5439,
+  0x543a, 0x543b, 0x5438, 0x5431, 0x543c, 0x543d, 0x4b64, 0x3e6b,
+  0x543f, 0x5440, 0x543e, 0x5442, 0x4738, 0x3068, 0x4956, 0x5443,
+  0x3e7d, 0x3c39, 0x475d, 0x3470, 0x3a6b, 0x4b59, 0x4632, 0x3778,
+  0x424f, 0x5441, 0x5444, 0x4244, 0x5445, 0x5446, 0x5448, 0x4469,
+  0x342e, 0x7421, 0x3161, 0x4a73, 0x3e6c, 0x4548, 0x3a66, 0x544e,
+  0x4a3d, 0x4e5d, 0x3274, 0x544a, 0x413a, 0x544d, 0x4563, 0x4549,
+  0x4564, 0x4839, 0x444d, 0x3a49, 0x5449, 0x3176, 0x4536, 0x544b,
+  0x5447, 0x3f50, 0x544f, 0x3d4e, 0x362d, 0x5450, 0x4a68, 0x417d,
+  0x4446, 0x5452, 0x4b4f, 0x5453, 0x5458, 0x4a2f, 0x5457, 0x5451,
+  0x5454, 0x5456, 0x3a26, 0x4a49, 0x5459, 0x4345, 0x3275, 0x3e6d,
+  0x545b, 0x545a, 0x3968, 0x545c, 0x545e, 0x545d, 0x5460, 0x5455,
+  0x5462, 0x5461, 0x545f, 0x3b4e, 0x3f51, 0x4154, 0x5463, 0x403c,
+  0x306d, 0x4764, 0x445b, 0x5465, 0x5464, 0x5466, 0x5467, 0x5468,
+  0x5469, 0x4a51, 0x546a, 0x3246, 0x546b, 0x4d3c, 0x3330, 0x5249,
+  0x3d48, 0x423f, 0x546c, 0x4c6b, 0x4c34, 0x546e, 0x4267, 0x4537,
+  0x4240, 0x4957, 0x546f, 0x5470, 0x317b, 0x3c3a, 0x5471, 0x3050,
+  0x5472, 0x5473, 0x3162, 0x3471, 0x4660, 0x4a74, 0x5477, 0x4155,
+  0x5476, 0x3740, 0x4b5b, 0x5475, 0x4565, 0x5479, 0x5478, 0x547b,
+  0x547a, 0x317c, 0x547c, 0x3e29, 0x547e, 0x4325, 0x547d, 0x4a33,
+  0x3d77, 0x455b, 0x5521, 0x3925, 0x5522, 0x4721, 0x485e, 0x4c51,
+  0x4725, 0x552b, 0x3538, 0x4d45, 0x4c2f, 0x562c, 0x5523, 0x5526,
+  0x4245, 0x4b38, 0x454a, 0x5527, 0x4b65, 0x3a4a, 0x3e2a, 0x5528,
+  0x3b50, 0x3b4f, 0x3039, 0x3848, 0x402b, 0x3051, 0x552c, 0x552d,
+  0x552a, 0x3138, 0x342f, 0x5529, 0x4c45, 0x4931, 0x3028, 0x3079,
+  0x3b51, 0x3052, 0x3023, 0x5532, 0x5530, 0x4c3c, 0x5533, 0x5531,
+  0x552f, 0x3f31, 0x552e, 0x4a5a, 0x3864, 0x5537, 0x5538, 0x3e2b,
+  0x5534, 0x4f2c, 0x474c, 0x5536, 0x3a27, 0x5539, 0x4958, 0x553a,
+  0x5535, 0x4c3b, 0x475e, 0x553b, 0x4932, 0x553c, 0x5540, 0x553d,
+  0x3247, 0x553f, 0x3c3b, 0x553e, 0x3779, 0x554c, 0x5545, 0x5542,
+  0x4364, 0x5541, 0x5543, 0x5544, 0x5546, 0x5547, 0x3472, 0x5549,
+  0x5548, 0x554a, 0x3e6e, 0x554d, 0x445c, 0x3145, 0x554b, 0x554e,
+  0x554f, 0x5552, 0x5550, 0x5551, 0x3b52, 0x5553, 0x3926, 0x5554,
+  0x3b7a, 0x4238, 0x5555, 0x5556, 0x3b5a, 0x3927, 0x4c52, 0x3528,
+  0x3849, 0x5557, 0x3358, 0x5558, 0x4239, 0x5559, 0x5623, 0x555a,
+  0x555b, 0x555c, 0x555e, 0x555f, 0x5560, 0x4270, 0x3127, 0x3c69,
+  0x3042, 0x4157, 0x3430, 0x3c35, 0x3928, 0x4566, 0x3d21, 0x3431,
+  0x4368, 0x446a, 0x3038, 0x3539, 0x4a75, 0x3c42, 0x3552, 0x406b,
+  0x3c3c, 0x4d28, 0x5561, 0x355c, 0x3a4b, 0x3332, 0x3163, 0x3e2c,
+  0x3248, 0x5562, 0x4d46, 0x3d49, 0x3c64, 0x5563, 0x3473, 0x4652,
+  0x4c29, 0x5564, 0x5565, 0x4959, 0x5567, 0x3428, 0x3677, 0x5566,
+  0x3432, 0x3f32, 0x556b, 0x3b21, 0x3249, 0x556a, 0x5568, 0x556c,
+  0x5569, 0x472b, 0x5c4d, 0x3f33, 0x556d, 0x4e40, 0x556e, 0x5570,
+  0x437e, 0x556f, 0x4023, 0x3b7b, 0x4250, 0x3c77, 0x4975, 0x406c,
+  0x3c4d, 0x5571, 0x3e2d, 0x5572, 0x5573, 0x3053, 0x423a, 0x3f52,
+  0x5574, 0x4633, 0x3e2e, 0x3e2f, 0x5575, 0x406d, 0x3e30, 0x5576,
+  0x5577, 0x4c60, 0x5578, 0x3646, 0x3d22, 0x5579, 0x557a, 0x3c5c,
+  0x3f2c, 0x4674, 0x3f54, 0x4878, 0x4722, 0x3649, 0x557b, 0x356f,
+  0x557c, 0x367e, 0x464f, 0x3230, 0x3b53, 0x557d, 0x5622, 0x5621,
+  0x367d, 0x557e, 0x4538, 0x4230, 0x454b, 0x3c48, 0x4158, 0x4d7a,
+  0x5624, 0x5625, 0x4656, 0x3b33, 0x5627, 0x5628, 0x5629, 0x3474,
+  0x562a, 0x562b, 0x322c, 0x413b, 0x3464, 0x562d, 0x4c28, 0x4252,
+  0x3359, 0x562f, 0x5631, 0x345f, 0x562e, 0x5630, 0x5633, 0x5632,
+  0x5634, 0x5635, 0x463d, 0x362e, 0x3265, 0x5636, 0x563b, 0x5639,
+  0x4a77, 0x4a76, 0x4567, 0x5638, 0x3d54, 0x5637, 0x3f72, 0x563c,
+  0x3a6a, 0x5642, 0x5643, 0x563d, 0x3333, 0x563e, 0x5647, 0x5646,
+  0x5645, 0x5641, 0x5640, 0x5644, 0x4a78, 0x564b, 0x5648, 0x564a,
+  0x4d72, 0x5649, 0x563f, 0x3f73, 0x564c, 0x3a37, 0x564d, 0x564e,
+  0x5651, 0x5650, 0x564f, 0x4568, 0x563a, 0x5657, 0x5653, 0x5652,
+  0x5654, 0x5655, 0x5658, 0x4e66, 0x5659, 0x5656, 0x565a, 0x3460,
+  0x565b, 0x565d, 0x565c, 0x565e, 0x565f, 0x406e, 0x3d23, 0x3d64,
+  0x4163, 0x3929, 0x3a38, 0x392a, 0x3570, 0x5660, 0x3a39, 0x384a,
+  0x5661, 0x4c26, 0x4743, 0x5662, 0x392b, 0x342c, 0x4327, 0x3652,
+  0x3b54, 0x495b, 0x4841, 0x5663, 0x3475, 0x5666, 0x4421, 0x5665,
+  0x5664, 0x5667, 0x446b, 0x3f63, 0x3b55, 0x404a, 0x4253, 0x3522,
+  0x4422, 0x5668, 0x5669, 0x3e6f, 0x4b39, 0x566c, 0x566b, 0x566a,
+  0x497d, 0x5673, 0x4b5a, 0x566d, 0x566f, 0x4b6b, 0x566e, 0x5670,
+  0x4828, 0x5671, 0x4a3e, 0x5672, 0x3433, 0x4a3f, 0x472f, 0x5674,
+  0x5675, 0x392c, 0x3434, 0x5676, 0x3838, 0x4d44, 0x4d29, 0x3476,
+  0x5678, 0x4423, 0x392d, 0x3e31, 0x485f, 0x3e32, 0x3d78, 0x446c,
+  0x4a79, 0x4539, 0x392e, 0x495c, 0x5679, 0x4559, 0x3a42, 0x384b,
+  0x446d, 0x3043, 0x3d6e, 0x392f, 0x4d47, 0x567a, 0x567b, 0x4751,
+  0x567c, 0x4e77, 0x4f2d, 0x567e, 0x567d, 0x3347, 0x5721, 0x5724,
+  0x5725, 0x5723, 0x4940, 0x3e33, 0x5727, 0x5726, 0x5722, 0x5728,
+  0x5729, 0x572a, 0x572d, 0x572b, 0x572c, 0x572e, 0x3164, 0x446e,
+  0x572f, 0x377a, 0x3276, 0x4736, 0x5730, 0x467b, 0x4a5b, 0x5731,
+  0x4f2e, 0x5732, 0x4a40, 0x5735, 0x5021, 0x5031, 0x3c30, 0x4675,
+  0x5736, 0x355d, 0x4424, 0x307a, 0x5737, 0x4a26, 0x3930, 0x4350,
+  0x446f, 0x4c6f, 0x3839, 0x384c, 0x5738, 0x5739, 0x573f, 0x3c65,
+  0x4425, 0x362f, 0x573a, 0x492b, 0x4346, 0x573b, 0x573c, 0x3630,
+  0x573d, 0x573e, 0x5740, 0x4576, 0x5741, 0x5742, 0x5743, 0x5734,
+  0x5733, 0x5744, 0x3741, 0x4927, 0x3a4c, 0x4937, 0x4426, 0x494b,
+  0x5745, 0x3e34, 0x3146, 0x5746, 0x5747, 0x4c72, 0x4860, 0x574a,
+  0x317d, 0x402c, 0x5749, 0x5748, 0x3742, 0x4254, 0x574e, 0x574c,
+  0x574b, 0x4e27, 0x3865, 0x3d79, 0x574d, 0x454c, 0x3d3e, 0x4640,
+  0x5751, 0x5750, 0x574f, 0x5752, 0x3866, 0x5753, 0x497c, 0x3d5b,
+  0x5754, 0x4879, 0x4641, 0x4427, 0x4530, 0x5755, 0x352b, 0x3f34,
+  0x492c, 0x3477, 0x4726, 0x5756, 0x3b56, 0x4b3a, 0x4b3b, 0x317e,
+  0x575b, 0x4369, 0x5758, 0x3277, 0x582d, 0x575a, 0x4730, 0x5759,
+  0x5757, 0x397a, 0x575d, 0x5763, 0x5769, 0x5761, 0x455c, 0x5766,
+  0x495d, 0x5760, 0x5765, 0x4e67, 0x3b57, 0x4255, 0x575e, 0x355e,
+  0x5768, 0x402d, 0x3165, 0x5762, 0x3278, 0x5767, 0x3631, 0x5764,
+  0x576a, 0x576c, 0x5776, 0x5774, 0x5771, 0x5770, 0x4e78, 0x5772,
+  0x3632, 0x3931, 0x3d7a, 0x5779, 0x576b, 0x576f, 0x575f, 0x327a,
+  0x5773, 0x5775, 0x4351, 0x3a28, 0x3238, 0x576d, 0x5778, 0x5777,
+  0x3633, 0x4229, 0x3366, 0x3743, 0x576e, 0x577a, 0x577d, 0x5821,
+  0x3c3d, 0x5827, 0x4470, 0x577b, 0x5825, 0x3279, 0x5823, 0x5824,
+  0x577e, 0x5822, 0x3867, 0x4d2a, 0x3435, 0x3159, 0x5826, 0x473a,
+  0x302d, 0x4861, 0x575c, 0x582c, 0x5830, 0x4c65, 0x5829, 0x4569,
+  0x582e, 0x3e70, 0x582f, 0x4657, 0x4f47, 0x582b, 0x5831, 0x397b,
+  0x404b, 0x3054, 0x582a, 0x5828, 0x415a, 0x577c, 0x3b34, 0x4246,
+  0x583d, 0x415b, 0x5838, 0x5835, 0x5836, 0x3c66, 0x5839, 0x583c,
+  0x5837, 0x3d25, 0x583a, 0x5834, 0x4c7c, 0x4c7b, 0x583e, 0x583f,
+  0x3055, 0x5833, 0x3672, 0x3026, 0x3436, 0x583b, 0x5843, 0x5842,
+  0x5847, 0x5848, 0x5846, 0x5849, 0x5841, 0x5845, 0x584a, 0x584b,
+  0x5840, 0x3b7c, 0x5844, 0x4256, 0x3932, 0x5832, 0x3f35, 0x5858,
+  0x4a69, 0x584e, 0x584f, 0x5850, 0x5857, 0x5856, 0x4b7d, 0x3437,
+  0x5854, 0x3745, 0x3334, 0x5851, 0x4e38, 0x5853, 0x3056, 0x5855,
+  0x584c, 0x5852, 0x5859, 0x3744, 0x584d, 0x4d5d, 0x4d2b, 0x585c,
+  0x5860, 0x417e, 0x4e79, 0x5861, 0x585e, 0x585b, 0x585a, 0x585f,
+  0x4a30, 0x4634, 0x3746, 0x5862, 0x585d, 0x5863, 0x377b, 0x3231,
+  0x586b, 0x3438, 0x5869, 0x586a, 0x3a29, 0x5868, 0x5866, 0x5865,
+  0x586c, 0x5864, 0x586e, 0x327b, 0x5870, 0x586f, 0x4428, 0x5873,
+  0x5871, 0x5867, 0x377c, 0x5872, 0x5876, 0x5875, 0x5877, 0x5874,
+  0x5878, 0x5879, 0x587a, 0x4a6a, 0x587c, 0x587b, 0x3d3f, 0x402e,
+  0x3266, 0x327c, 0x587d, 0x303f, 0x404c, 0x587e, 0x6c43, 0x5921,
+  0x3761, 0x5922, 0x406f, 0x5923, 0x5924, 0x353a, 0x5925, 0x5926,
+  0x5927, 0x4257, 0x384d, 0x4c61, 0x4b3c, 0x3d6a, 0x5928, 0x4070,
+  0x6e3d, 0x4862, 0x3c6a, 0x3a4d, 0x5929, 0x4247, 0x4a27, 0x4271,
+  0x592c, 0x592a, 0x592d, 0x592b, 0x592e, 0x4a31, 0x3037, 0x495e,
+  0x4863, 0x592f, 0x5932, 0x3e35, 0x353b, 0x5930, 0x5937, 0x3e36,
+  0x5931, 0x4744, 0x4d5e, 0x5933, 0x5934, 0x5938, 0x456a, 0x5935,
+  0x3933, 0x405e, 0x5946, 0x4834, 0x4272, 0x4864, 0x5a2d, 0x4a7a,
+  0x4471, 0x4b75, 0x593b, 0x3221, 0x436a, 0x5944, 0x4334, 0x593e,
+  0x5945, 0x5940, 0x5947, 0x5943, 0x5942, 0x476f, 0x593c, 0x327d,
+  0x593a, 0x3571, 0x4273, 0x5936, 0x5939, 0x3934, 0x405b, 0x3e37,
+  0x5941, 0x4752, 0x3572, 0x3348, 0x3367, 0x3f21, 0x5949, 0x594e,
+  0x594a, 0x377d, 0x594f, 0x3b22, 0x3969, 0x3d26, 0x593d, 0x3b7d,
+  0x594c, 0x3b58, 0x594d, 0x3044, 0x5948, 0x4429, 0x3573, 0x3634,
+  0x594b, 0x3027, 0x3a43, 0x3f36, 0x4472, 0x4854, 0x5951, 0x415e,
+  0x422a, 0x3b2b, 0x5952, 0x5954, 0x5950, 0x4a61, 0x443d, 0x415c,
+  0x4a7b, 0x3c4e, 0x5960, 0x595f, 0x3f78, 0x377e, 0x5959, 0x3e39,
+  0x4668, 0x4731, 0x5957, 0x415d, 0x3c78, 0x595c, 0x3e38, 0x5956,
+  0x595b, 0x4753, 0x5955, 0x3721, 0x335d, 0x595d, 0x4e2b, 0x3a4e,
+  0x4335, 0x595a, 0x405c, 0x3935, 0x3f64, 0x3166, 0x413c, 0x5958,
+  0x3545, 0x3747, 0x444f, 0x595e, 0x415f, 0x5961, 0x5963, 0x4237,
+  0x5969, 0x5964, 0x5966, 0x4941, 0x4473, 0x5967, 0x4d2c, 0x4d48,
+  0x3439, 0x302e, 0x5965, 0x5962, 0x3478, 0x3167, 0x5968, 0x4d49,
+  0x596c, 0x423b, 0x5973, 0x596d, 0x596a, 0x5971, 0x5953, 0x596e,
+  0x5972, 0x4842, 0x456b, 0x596b, 0x596f, 0x3748, 0x3a71, 0x405d,
+  0x5977, 0x4526, 0x5974, 0x4b60, 0x5975, 0x5976, 0x4c4e, 0x4022,
+  0x3762, 0x597d, 0x3b35, 0x597a, 0x5979, 0x4732, 0x4635, 0x4531,
+  0x597b, 0x597c, 0x496f, 0x4745, 0x3b23, 0x4071, 0x4b50, 0x3349,
+  0x5a25, 0x597e, 0x4d4a, 0x5a27, 0x5a23, 0x5a24, 0x4160, 0x5a22,
+  0x593f, 0x5a26, 0x5a21, 0x5a2b, 0x5a2c, 0x4527, 0x5a2e, 0x3b24,
+  0x5a29, 0x353c, 0x5a2f, 0x5a28, 0x5a33, 0x5a32, 0x5a31, 0x5a34,
+  0x5a36, 0x3e71, 0x5a35, 0x5a39, 0x5a37, 0x5a38, 0x5970, 0x5a3b,
+  0x5a3a, 0x5978, 0x5a3c, 0x5a30, 0x3b59, 0x5a3d, 0x5a3e, 0x5a40,
+  0x5a3f, 0x5a41, 0x327e, 0x3936, 0x4a7c, 0x402f, 0x384e, 0x5a43,
+  0x5a46, 0x4952, 0x355f, 0x5a45, 0x5a44, 0x4754, 0x5a47, 0x3635,
+  0x5a49, 0x5a48, 0x343a, 0x3b36, 0x4658, 0x3749, 0x3f74, 0x5a4a,
+  0x4030, 0x4528, 0x495f, 0x5a4b, 0x5a4c, 0x5a4d, 0x4a38, 0x555d,
+  0x4046, 0x494c, 0x3a58, 0x4865, 0x4843, 0x454d, 0x4e41, 0x5a4f,
+  0x3c50, 0x5a50, 0x3036, 0x3654, 0x404d, 0x4960, 0x5a51, 0x3b42,
+  0x4347, 0x3b5b, 0x3f37, 0x5a52, 0x4a7d, 0x3177, 0x3b5c, 0x5a55,
+  0x5a53, 0x5a56, 0x4e39, 0x5a54, 0x407b, 0x5a57, 0x4232, 0x5a58,
+  0x347a, 0x5a5a, 0x5a59, 0x5a5b, 0x5a5c, 0x347b, 0x467c, 0x4336,
+  0x356c, 0x3b5d, 0x4161, 0x3d5c, 0x3030, 0x5a5d, 0x3222, 0x5a61,
+  0x3937, 0x5a60, 0x3a2b, 0x3e3a, 0x5a5f, 0x3e3b, 0x4c40, 0x3a2a,
+  0x3057, 0x404e, 0x5a66, 0x4031, 0x3147, 0x3d55, 0x4b66, 0x3a72,
+  0x3e3c, 0x4027, 0x5a65, 0x5a63, 0x5a64, 0x436b, 0x5b26, 0x5a6a,
+  0x3b7e, 0x3938, 0x5a68, 0x5a69, 0x3f38, 0x5a67, 0x3b2f, 0x5a6c,
+  0x5a6b, 0x5a70, 0x5a71, 0x5a6d, 0x3322, 0x5a6e, 0x5a6f, 0x4855,
+  0x4961, 0x374a, 0x5a72, 0x4032, 0x3e3d, 0x4352, 0x3647, 0x5a73,
+  0x5a77, 0x324b, 0x5a74, 0x5a76, 0x5a75, 0x3d6b, 0x4348, 0x3045,
+  0x5a78, 0x5a79, 0x442a, 0x4e71, 0x3b43, 0x4a6b, 0x4b3d, 0x5b22,
+  0x5a7b, 0x5a7e, 0x5a7d, 0x5a7a, 0x5b21, 0x465e, 0x5a7c, 0x5b23,
+  0x3d6c, 0x5b24, 0x4d4b, 0x4778, 0x5b25, 0x5b27, 0x5b28, 0x5b29,
+  0x364a, 0x3148, 0x3939, 0x5b2a, 0x5b2b, 0x3d71, 0x4162, 0x5258,
+  0x413e, 0x413d, 0x4258, 0x3a47, 0x5072, 0x376e, 0x4d2d, 0x4a7e,
+  0x497e, 0x5b2c, 0x3a73, 0x443f, 0x5b2d, 0x4f2f, 0x4b3e, 0x442b,
+  0x5b2e, 0x347c, 0x5b2f, 0x5b30, 0x4c5a, 0x4c24, 0x4b76, 0x4b5c,
+  0x3b25, 0x5b32, 0x3c6b, 0x4b51, 0x5b34, 0x5b37, 0x5b36, 0x3479,
+  0x3560, 0x5b33, 0x5b35, 0x5b38, 0x3f79, 0x4d7b, 0x3049, 0x3a60,
+  0x423c, 0x3c5d, 0x3e73, 0x5b3b, 0x454e, 0x5b39, 0x422b, 0x5b3a,
+  0x3e72, 0x4c5d, 0x5b3c, 0x5b3d, 0x4d68, 0x5b42, 0x393a, 0x4755,
+  0x5b3f, 0x456c, 0x5a5e, 0x5a62, 0x354f, 0x4747, 0x5b41, 0x3e3e,
+  0x4844, 0x5b47, 0x487a, 0x5b3e, 0x5b44, 0x5b43, 0x404f, 0x4b6d,
+  0x4e53, 0x4b67, 0x324c, 0x3b5e, 0x4f48, 0x5b46, 0x3f75, 0x5b45,
+  0x5b40, 0x384f, 0x5b4c, 0x5b4a, 0x324d, 0x5b48, 0x5b4e, 0x5b54,
+  0x4248, 0x4a41, 0x5b56, 0x4922, 0x5b55, 0x4770, 0x4b3f, 0x343b,
+  0x4077, 0x3d40, 0x4453, 0x4d2e, 0x5b51, 0x5b50, 0x5b52, 0x5b4f,
+  0x5b57, 0x5b4d, 0x5b4b, 0x5b53, 0x5b49, 0x436c, 0x4c78, 0x3c46,
+  0x3a74, 0x3a3a, 0x4b6f, 0x3341, 0x444e, 0x464a, 0x3149, 0x4072,
+  0x4034, 0x372a, 0x5b59, 0x393b, 0x337c, 0x5b5b, 0x3374, 0x5b61,
+  0x5b5e, 0x4073, 0x334b, 0x3a2c, 0x334a, 0x3a4f, 0x5b5c, 0x3765,
+  0x374b, 0x456d, 0x5b5a, 0x3046, 0x5b5d, 0x5b5f, 0x364d, 0x372c,
+  0x343c, 0x354b, 0x5b62, 0x3a79, 0x4b71, 0x3b37, 0x5b63, 0x4930,
+  0x5b6f, 0x3233, 0x5b64, 0x5b75, 0x5b65, 0x4e42, 0x5b6c, 0x475f,
+  0x5b74, 0x5b67, 0x3034, 0x5b69, 0x393c, 0x5b6b, 0x5b6a, 0x5b66,
+  0x5b71, 0x3e3f, 0x546d, 0x3868, 0x4d7c, 0x5b68, 0x4474, 0x3323,
+  0x3a2d, 0x5b60, 0x5b70, 0x3361, 0x5b6e, 0x5b72, 0x456e, 0x347e,
+  0x5c32, 0x4c49, 0x5b77, 0x347d, 0x5b7e, 0x4b40, 0x5c21, 0x5c23,
+  0x5c27, 0x5b79, 0x432a, 0x456f, 0x5c2b, 0x5b7c, 0x5c28, 0x5c22,
+  0x3f39, 0x5c2c, 0x4033, 0x5c2a, 0x343d, 0x4f50, 0x5b76, 0x5c26,
+  0x3058, 0x5b78, 0x4c3a, 0x5b7d, 0x3f22, 0x4447, 0x5b73, 0x5c25,
+  0x3f7a, 0x5c2f, 0x3371, 0x3821, 0x5c31, 0x5b7a, 0x5c30, 0x5c29,
+  0x5b7b, 0x5c2d, 0x5c2e, 0x5c3f, 0x464e, 0x5c24, 0x5c3b, 0x5c3d,
+  0x4458, 0x4d4c, 0x4976, 0x5c38, 0x424a, 0x5c3e, 0x413f, 0x5c35,
+  0x5c42, 0x5c41, 0x466f, 0x5c40, 0x466a, 0x5c44, 0x5c37, 0x3648,
+  0x5c3a, 0x3d5d, 0x4760, 0x5c3c, 0x364b, 0x5c34, 0x5c36, 0x5c33,
+  0x4f30, 0x335a, 0x5c39, 0x5c43, 0x3335, 0x3a67, 0x315d, 0x5c54,
+  0x4f31, 0x5c57, 0x3f3a, 0x5c56, 0x5c55, 0x5c52, 0x5c46, 0x5c63,
+  0x5c45, 0x5c58, 0x5c50, 0x5c4b, 0x5c48, 0x5c49, 0x5c51, 0x7422,
+  0x5c4e, 0x393d, 0x4448, 0x4164, 0x5c4c, 0x5c47, 0x5c4a, 0x4d4d,
+  0x4b6a, 0x5c4f, 0x5c59, 0x5c61, 0x5c5a, 0x5c67, 0x5c65, 0x5c60,
+  0x5c5f, 0x4450, 0x4165, 0x5c5d, 0x5c5b, 0x5c62, 0x5c68, 0x4875,
+  0x5c6e, 0x5c69, 0x5c6c, 0x5c66, 0x4374, 0x4938, 0x5c5c, 0x5c64,
+  0x3e40, 0x4c4f, 0x5c78, 0x5c6b, 0x3822, 0x3223, 0x335f, 0x5c53,
+  0x3e41, 0x5c70, 0x5c77, 0x3c79, 0x3372, 0x432e, 0x5c6d, 0x5c72,
+  0x5c76, 0x3636, 0x354c, 0x5c74, 0x3521, 0x464b, 0x5c73, 0x5c75,
+  0x5c6f, 0x5c71, 0x3360, 0x4349, 0x5c7c, 0x5c7a, 0x3869, 0x5c79,
+  0x5d21, 0x5b58, 0x5c7b, 0x5c7d, 0x5c7e, 0x5d2c, 0x5d28, 0x5b6d,
+  0x5d27, 0x5d26, 0x5d23, 0x5c6a, 0x5d25, 0x5d24, 0x5d2a, 0x4f26,
+  0x5d2d, 0x367b, 0x5d29, 0x5d2b, 0x4827, 0x5d2e, 0x5d32, 0x5d2f,
+  0x4d73, 0x5d30, 0x5c5e, 0x5d33, 0x5d34, 0x3135, 0x5d36, 0x3767,
+  0x3c21, 0x3655, 0x3224, 0x4d5f, 0x5d38, 0x5d37, 0x5d3a, 0x353d,
+  0x3656, 0x343e, 0x5d3d, 0x5d3c, 0x5d3e, 0x324e, 0x4337, 0x5d3f,
+  0x343f, 0x5d41, 0x5d40, 0x5d42, 0x5d43, 0x5d44, 0x3b5f, 0x4035,
+  0x3a21, 0x4970, 0x4a62, 0x4f44, 0x3b75, 0x3a50, 0x4e72, 0x5d45,
+  0x5d46, 0x3b60, 0x5d47, 0x5d48, 0x5d4a, 0x5d49, 0x4b58, 0x3d5e,
+  0x3c6c, 0x3b44, 0x5d4b, 0x5d4d, 0x3f23, 0x5d4c, 0x5d4e, 0x5d4f,
+  0x5d50, 0x5d51, 0x5d52, 0x5d54, 0x5d53, 0x5d55, 0x3225, 0x434a,
+  0x5d56, 0x3b26, 0x334c, 0x5d57, 0x4542, 0x544c, 0x3523, 0x5d58,
+  0x5d59, 0x4a6c, 0x4b68, 0x4647, 0x5d5a, 0x4866, 0x487b, 0x4c53,
+  0x5d5b, 0x5d5d, 0x5d5c, 0x5d5f, 0x5d5e, 0x5d61, 0x3b61, 0x4c31,
+  0x5d62, 0x5d63, 0x3524, 0x5d64, 0x5d66, 0x5d65, 0x3f65, 0x4939,
+  0x314a, 0x4845, 0x4475, 0x3d41, 0x3561, 0x4846, 0x3c2e, 0x5d68,
+  0x3440, 0x3178, 0x4672, 0x5d67, 0x393e, 0x4353, 0x5d69, 0x5d71,
+  0x5d6a, 0x4241, 0x3562, 0x5d72, 0x3768, 0x3525, 0x5d70, 0x5d6e,
+  0x5d6b, 0x4d60, 0x4440, 0x4659, 0x5d6c, 0x5d74, 0x5d73, 0x3723,
+  0x322d, 0x3a3b, 0x5d6d, 0x5d6f, 0x4b57, 0x4274, 0x4b77, 0x5d7c,
+  0x5d7d, 0x324f, 0x4a28, 0x4c7d, 0x5e21, 0x3c23, 0x3e42, 0x5d78,
+  0x5d7e, 0x3168, 0x3637, 0x5d75, 0x5d7a, 0x4074, 0x4771, 0x4867,
+  0x5d77, 0x4b21, 0x5d79, 0x5e24, 0x5e22, 0x5d7b, 0x4b22, 0x4748,
+  0x3563, 0x4525, 0x436d, 0x5e25, 0x5e23, 0x4259, 0x5d76, 0x314b,
+  0x4d4e, 0x5e30, 0x5e2f, 0x4076, 0x5e2c, 0x4d6c, 0x4636, 0x5e26,
+  0x4445, 0x314c, 0x393f, 0x5e29, 0x3d27, 0x5e2e, 0x5e2d, 0x5e28,
+  0x5e2b, 0x3368, 0x5e2a, 0x4749, 0x4e2e, 0x3e74, 0x4075, 0x5e36,
+  0x5e34, 0x494d, 0x5e31, 0x5e33, 0x313a, 0x3940, 0x4f32, 0x333d,
+  0x4962, 0x4d61, 0x3324, 0x3f3b, 0x5e35, 0x5e3a, 0x3e43, 0x4d30,
+  0x5e37, 0x5e32, 0x5e38, 0x4e5e, 0x4573, 0x4642, 0x3336, 0x3155,
+  0x5e3e, 0x5e41, 0x4e43, 0x4d64, 0x5e48, 0x5e42, 0x5e3f, 0x4e54,
+  0x5e45, 0x3d4a, 0x5e47, 0x5e4c, 0x4571, 0x5e4a, 0x5e44, 0x4338,
+  0x5e4b, 0x5e40, 0x5e46, 0x5e4d, 0x307c, 0x5e43, 0x5e4e, 0x3f3c,
+  0x3d5f, 0x4a25, 0x3a2e, 0x5e3b, 0x5e49, 0x453a, 0x4036, 0x3369,
+  0x3a51, 0x3e44, 0x5e3d, 0x3d42, 0x374c, 0x5e3c, 0x5e52, 0x3d6d,
+  0x383a, 0x5e61, 0x5e5b, 0x3574, 0x454f, 0x5e56, 0x5e5f, 0x302f,
+  0x3132, 0x3239, 0x5e58, 0x422c, 0x5e4f, 0x5e51, 0x3941, 0x5e62,
+  0x5e5d, 0x5e55, 0x5e5c, 0x4c2b, 0x5e5a, 0x5e5e, 0x3850, 0x3e45,
+  0x4339, 0x5e54, 0x4d2f, 0x5e57, 0x5e50, 0x4572, 0x5e53, 0x5e59,
+  0x4f51, 0x3c3e, 0x4b7e, 0x5e63, 0x482e, 0x5e6f, 0x383b, 0x3d60,
+  0x5e65, 0x4e2f, 0x3942, 0x5e72, 0x306e, 0x5e70, 0x5e64, 0x5e6a,
+  0x5e6c, 0x4d4f, 0x5e67, 0x452e, 0x5e69, 0x5e71, 0x5e6b, 0x4c47,
+  0x5e66, 0x3c22, 0x5e7e, 0x336a, 0x5e68, 0x5e6d, 0x5e6e, 0x426c,
+  0x425a, 0x5e76, 0x5e7c, 0x5e7a, 0x4529, 0x5f23, 0x5e77, 0x5e78,
+  0x5e60, 0x3579, 0x493a, 0x3c3f, 0x3977, 0x4f33, 0x5e74, 0x5f22,
+  0x3169, 0x4166, 0x4779, 0x3441, 0x4e7a, 0x4c21, 0x4452, 0x5e7b,
+  0x5e7d, 0x4132, 0x5f21, 0x5e79, 0x5e73, 0x3443, 0x3769, 0x5f2f,
+  0x5f2a, 0x4078, 0x3363, 0x3d61, 0x5f33, 0x5f2c, 0x442c, 0x5f29,
+  0x4459, 0x5f4c, 0x5f26, 0x5f25, 0x5f2e, 0x5f28, 0x5f27, 0x5f2d,
+  0x4021, 0x5f24, 0x5f30, 0x5f31, 0x3442, 0x5f36, 0x5f35, 0x5f37,
+  0x5f3a, 0x4543, 0x5f34, 0x5f38, 0x3763, 0x4279, 0x5f32, 0x473b,
+  0x5f39, 0x5f3e, 0x5f3c, 0x5f3f, 0x5f42, 0x5f3b, 0x396a, 0x4728,
+  0x5e39, 0x4d74, 0x5f3d, 0x5f41, 0x4275, 0x5f40, 0x5f2b, 0x6f69,
+  0x5f45, 0x5f49, 0x5f47, 0x5f43, 0x5f44, 0x5f48, 0x5f46, 0x494e,
+  0x5f4e, 0x5f4b, 0x5f4a, 0x5f4d, 0x4654, 0x5f4f, 0x4375, 0x426d,
+  0x4025, 0x5f50, 0x5f52, 0x5f51, 0x5e75, 0x5f53, 0x4667, 0x5f54,
+  0x3250, 0x4574, 0x3325, 0x3564, 0x3c5e, 0x3a52, 0x4f27, 0x3f66,
+  0x316a, 0x5f56, 0x5f55, 0x5f59, 0x433a, 0x5f5c, 0x5f57, 0x5f5b,
+  0x5f5a, 0x4540, 0x3059, 0x4e75, 0x5f5e, 0x3128, 0x5f60, 0x5f5f,
+  0x5f5d, 0x5f58, 0x4b23, 0x5f62, 0x5f61, 0x316b, 0x5f64, 0x4a32,
+  0x5f63, 0x4c35, 0x3e47, 0x4133, 0x3e46, 0x4e7b, 0x5f6a, 0x4079,
+  0x5f66, 0x5f6b, 0x316c, 0x5f69, 0x4761, 0x5f65, 0x5f68, 0x3e48,
+  0x4851, 0x5f6c, 0x3c51, 0x407a, 0x5f6f, 0x5f67, 0x3727, 0x5f6d,
+  0x4d50, 0x5f70, 0x7426, 0x3d4f, 0x5f71, 0x5f72, 0x472e, 0x5f74,
+  0x5f75, 0x4733, 0x4575, 0x5f77, 0x5f79, 0x4e55, 0x5f76, 0x5f78,
+  0x316d, 0x5f73, 0x535b, 0x5f7a, 0x4167, 0x3b38, 0x5f7c, 0x5f7b,
+  0x3f24, 0x5259, 0x5f7d, 0x6021, 0x5f6e, 0x5f7e, 0x6022, 0x477a,
+  0x6023, 0x6024, 0x6025, 0x6026, 0x445e, 0x6028, 0x6027, 0x6029,
+  0x602a, 0x3c5f, 0x4963, 0x4c6c, 0x602b, 0x602c, 0x4156, 0x3c24,
+  0x602d, 0x602e, 0x602f, 0x4a52, 0x4847, 0x6030, 0x4757, 0x442d,
+  0x6031, 0x3267, 0x356d, 0x4c46, 0x4c36, 0x3234, 0x4f34, 0x4b52,
+  0x4a2a, 0x4037, 0x6032, 0x4643, 0x3823, 0x6033, 0x3a54, 0x6035,
+  0x6034, 0x6036, 0x6037, 0x6038, 0x353e, 0x6039, 0x603a, 0x3824,
+  0x4848, 0x603c, 0x3e75, 0x603b, 0x3638, 0x603d, 0x603f, 0x603e,
+  0x6040, 0x3851, 0x6041, 0x3669, 0x4140, 0x397d, 0x6043, 0x6044,
+  0x6042, 0x3c6d, 0x4648, 0x3639, 0x6046, 0x432c, 0x6045, 0x4f35,
+  0x4762, 0x6049, 0x604b, 0x6048, 0x4c54, 0x604a, 0x604c, 0x4e44,
+  0x6050, 0x604f, 0x4376, 0x472d, 0x3825, 0x604e, 0x604d, 0x4d31,
+  0x4d32, 0x6051, 0x316e, 0x3976, 0x3b62, 0x6052, 0x6053, 0x6055,
+  0x3d43, 0x6057, 0x6056, 0x6058, 0x334d, 0x605a, 0x6059, 0x605c,
+  0x605b, 0x383c, 0x4e28, 0x364c, 0x3226, 0x366a, 0x3461, 0x4e68,
+  0x605e, 0x6060, 0x6061, 0x3251, 0x605d, 0x3b39, 0x4441, 0x605f,
+  0x6064, 0x3c6e, 0x6062, 0x373e, 0x4849, 0x6063, 0x607e, 0x6069,
+  0x383d, 0x3565, 0x6066, 0x4d7d, 0x4e30, 0x4276, 0x6068, 0x606a,
+  0x4e56, 0x3657, 0x487c, 0x474a, 0x606b, 0x606d, 0x6070, 0x606c,
+  0x606f, 0x386a, 0x314d, 0x6071, 0x3f70, 0x606e, 0x4e5c, 0x6074,
+  0x7424, 0x6072, 0x6075, 0x6067, 0x6073, 0x3a3c, 0x6076, 0x6077,
+  0x4d7e, 0x6078, 0x6079, 0x6065, 0x607a, 0x3444, 0x3c25, 0x607b,
+  0x607c, 0x607d, 0x313b, 0x6121, 0x493b, 0x6122, 0x3424, 0x6123,
+  0x6124, 0x6125, 0x6127, 0x6128, 0x6126, 0x4953, 0x612a, 0x6129,
+  0x612c, 0x612b, 0x612d, 0x612e, 0x6130, 0x612f, 0x3979, 0x6132,
+  0x6131, 0x3445, 0x3f53, 0x453c, 0x6133, 0x4038, 0x3b3a, 0x3179,
+  0x6134, 0x4d51, 0x4a63, 0x6135, 0x4544, 0x4d33, 0x3943, 0x3f3d,
+  0x434b, 0x5234, 0x442e, 0x3268, 0x6136, 0x6137, 0x613c, 0x613a,
+  0x6139, 0x5a42, 0x3326, 0x6138, 0x305a, 0x482a, 0x484a, 0x4e31,
+  0x613d, 0x613b, 0x435c, 0x4026, 0x482b, 0x492d, 0x613f, 0x4e2c,
+  0x374d, 0x6140, 0x613e, 0x4856, 0x6141, 0x6142, 0x305b, 0x3e76,
+  0x6147, 0x6144, 0x466d, 0x6143, 0x3526, 0x614a, 0x6145, 0x6146,
+  0x6149, 0x6148, 0x4925, 0x4142, 0x4141, 0x353f, 0x614b, 0x614c,
+  0x614d, 0x614f, 0x614e, 0x3156, 0x6157, 0x4868, 0x6151, 0x6153,
+  0x6155, 0x3f3e, 0x6156, 0x6154, 0x3c40, 0x6150, 0x6152, 0x4942,
+  0x3e49, 0x6159, 0x6158, 0x615a, 0x3c26, 0x3a2f, 0x4577, 0x615b,
+  0x444b, 0x615d, 0x4e21, 0x615c, 0x4169, 0x6162, 0x6164, 0x6165,
+  0x4354, 0x6163, 0x6160, 0x615e, 0x615f, 0x6161, 0x6168, 0x6166,
+  0x6167, 0x6169, 0x616b, 0x616c, 0x616d, 0x616e, 0x616a, 0x6170,
+  0x616f, 0x6171, 0x4e45, 0x6174, 0x6172, 0x6173, 0x3462, 0x4c7e,
+  0x4a4a, 0x6176, 0x6175, 0x6177, 0x6178, 0x617c, 0x6179, 0x617a,
+  0x617b, 0x617d, 0x617e, 0x6221, 0x6222, 0x6223, 0x482f, 0x4550,
+  0x6224, 0x4772, 0x4934, 0x6225, 0x6226, 0x452a, 0x3327, 0x3944,
+  0x6227, 0x6228, 0x6229, 0x3b29, 0x622b, 0x622a, 0x622c, 0x622d,
+  0x4869, 0x622e, 0x622f, 0x7369, 0x6230, 0x6231, 0x6232, 0x3b2e,
+  0x6233, 0x4756, 0x4b5f, 0x314e, 0x3157, 0x6234, 0x6236, 0x6235,
+  0x4570, 0x4039, 0x5d39, 0x6237, 0x4c41, 0x6238, 0x3446, 0x4857,
+  0x6239, 0x623a, 0x623b, 0x4c5c, 0x4c55, 0x443e, 0x416a, 0x623d,
+  0x3d62, 0x3e4a, 0x6240, 0x623f, 0x623e, 0x487d, 0x3447, 0x3829,
+  0x6246, 0x6243, 0x3f3f, 0x4c32, 0x6242, 0x6244, 0x6245, 0x6241,
+  0x6247, 0x6248, 0x442f, 0x3463, 0x4365, 0x6249, 0x624a, 0x624d,
+  0x3f67, 0x4644, 0x624e, 0x4b53, 0x624b, 0x624c, 0x6251, 0x6250,
+  0x624f, 0x6253, 0x6252, 0x6254, 0x6256, 0x6255, 0x4a4d, 0x3d56,
+  0x4e46, 0x6257, 0x4637, 0x6258, 0x6259, 0x625d, 0x625b, 0x625c,
+  0x625a, 0x625e, 0x625f, 0x6260, 0x6261, 0x4c37, 0x6262, 0x4c70,
+  0x6263, 0x434e, 0x476a, 0x366b, 0x433b, 0x6264, 0x363a, 0x4050,
+  0x6265, 0x3a3d, 0x6266, 0x6267, 0x3826, 0x3a55, 0x6269, 0x4556,
+  0x3a56, 0x354e, 0x4b24, 0x474b, 0x4557, 0x395c, 0x626b, 0x3e4b,
+  0x4e32, 0x3945, 0x3827, 0x4823, 0x626d, 0x626f, 0x386b, 0x626e,
+  0x4476, 0x6271, 0x3337, 0x626c, 0x486a, 0x3130, 0x3a6c, 0x4f52,
+  0x6270, 0x6272, 0x4a4b, 0x4059, 0x6274, 0x6275, 0x6273, 0x334e,
+  0x627b, 0x627a, 0x3c27, 0x627c, 0x6277, 0x627d, 0x6278, 0x4858,
+  0x6276, 0x6279, 0x6322, 0x6321, 0x4b61, 0x627e, 0x306b, 0x6324,
+  0x6323, 0x3e4c, 0x6325, 0x4143, 0x6327, 0x6326, 0x6328, 0x6268,
+  0x626a, 0x632a, 0x6329, 0x3c28, 0x4e69, 0x3c52, 0x632b, 0x3737,
+  0x3540, 0x3527, 0x3b63, 0x4d34, 0x6331, 0x6330, 0x4144, 0x632d,
+  0x632f, 0x3d4b, 0x3f40, 0x632e, 0x632c, 0x472a, 0x3e4d, 0x493c,
+  0x3a57, 0x4578, 0x6332, 0x6333, 0x6349, 0x3658, 0x4f3d, 0x4135,
+  0x6334, 0x3252, 0x4477, 0x4a21, 0x6335, 0x357a, 0x6336, 0x6338,
+  0x6339, 0x4729, 0x633a, 0x633b, 0x633c, 0x3659, 0x3253, 0x4645,
+  0x3d28, 0x3b64, 0x633d, 0x3d29, 0x324a, 0x4943, 0x633e, 0x486b,
+  0x4145, 0x6341, 0x6342, 0x4769, 0x3f41, 0x633f, 0x4361, 0x6340,
+  0x3e4e, 0x305c, 0x3529, 0x6343, 0x4478, 0x6344, 0x4047, 0x4c2d,
+  0x4923, 0x6345, 0x6346, 0x4355, 0x4e47, 0x6348, 0x6347, 0x3c6f,
+  0x634a, 0x3070, 0x634d, 0x634b, 0x3254, 0x374e, 0x634c, 0x3946,
+  0x3972, 0x4a66, 0x634e, 0x4b54, 0x6350, 0x4051, 0x314f, 0x323a,
+  0x302c, 0x634f, 0x6351, 0x6352, 0x3e77, 0x6353, 0x334f, 0x6355,
+  0x376a, 0x3566, 0x6356, 0x3675, 0x6357, 0x407c, 0x464d, 0x4060,
+  0x3a75, 0x6358, 0x4362, 0x416b, 0x635a, 0x635c, 0x6359, 0x635b,
+  0x3722, 0x635d, 0x3726, 0x3567, 0x4d52, 0x635f, 0x6360, 0x312e,
+  0x6363, 0x3376, 0x6362, 0x6361, 0x6365, 0x635e, 0x6366, 0x4e29,
+  0x6367, 0x6368, 0x5474, 0x636a, 0x6369, 0x636b, 0x636c, 0x4e35,
+  0x636d, 0x706f, 0x3e4f, 0x636e, 0x636f, 0x3d57, 0x4638, 0x6370,
+  0x4328, 0x6371, 0x433c, 0x6372, 0x3625, 0x513f, 0x435d, 0x3c33,
+  0x3448, 0x6373, 0x6422, 0x6376, 0x3568, 0x6375, 0x6424, 0x6374,
+  0x3e50, 0x6378, 0x6379, 0x452b, 0x637a, 0x335e, 0x3f5a, 0x4964,
+  0x637c, 0x4268, 0x6377, 0x637b, 0x637d, 0x3a7b, 0x6426, 0x492e,
+  0x4826, 0x4579, 0x365a, 0x6425, 0x6423, 0x4835, 0x637e, 0x435e,
+  0x457b, 0x457a, 0x3a76, 0x6438, 0x6428, 0x642a, 0x642d, 0x642e,
+  0x642b, 0x642c, 0x6429, 0x6427, 0x6421, 0x4a4f, 0x3255, 0x6435,
+  0x6432, 0x6437, 0x6436, 0x4773, 0x4c27, 0x3b3b, 0x6430, 0x6439,
+  0x6434, 0x6433, 0x642f, 0x6431, 0x3449, 0x433d, 0x407d, 0x4822,
+  0x643e, 0x4824, 0x4061, 0x643b, 0x484f, 0x643f, 0x4a53, 0x435b,
+  0x643a, 0x643c, 0x643d, 0x6440, 0x3c44, 0x4646, 0x6445, 0x6444,
+  0x6441, 0x4f36, 0x644a, 0x644e, 0x644b, 0x6447, 0x6448, 0x644d,
+  0x6442, 0x5255, 0x6449, 0x6443, 0x644c, 0x6452, 0x344a, 0x644f,
+  0x6450, 0x6451, 0x6454, 0x6453, 0x4876, 0x6455, 0x4e7c, 0x4a6d,
+  0x645a, 0x6457, 0x6456, 0x4052, 0x6459, 0x645b, 0x6458, 0x645f,
+  0x645c, 0x645d, 0x6446, 0x645e, 0x6460, 0x6461, 0x4a46, 0x6462,
+  0x4c62, 0x364e, 0x3729, 0x6463, 0x4a34, 0x3f68, 0x4c30, 0x6464,
+  0x4e33, 0x4774, 0x4146, 0x4734, 0x3d4d, 0x3040, 0x6469, 0x6467,
+  0x6465, 0x3421, 0x3e51, 0x646a, 0x6468, 0x6466, 0x646e, 0x646d,
+  0x646c, 0x646b, 0x646f, 0x6470, 0x403a, 0x6471, 0x6473, 0x6472,
+  0x3852, 0x4138, 0x6475, 0x457c, 0x6474, 0x6476, 0x4a35, 0x416c,
+  0x3947, 0x6477, 0x4e48, 0x6479, 0x647a, 0x647b, 0x647c, 0x3b65,
+  0x647d, 0x374f, 0x356a, 0x352a, 0x6521, 0x4c73, 0x3948, 0x647e,
+  0x6524, 0x4c66, 0x473c, 0x4933, 0x3d63, 0x6523, 0x3c53, 0x3949,
+  0x3b66, 0x3569, 0x4a36, 0x6522, 0x4147, 0x4b42, 0x3a77, 0x3b67,
+  0x445d, 0x6527, 0x4e5f, 0x3a59, 0x6528, 0x3f42, 0x652a, 0x3e52,
+  0x3a30, 0x6529, 0x3d2a, 0x383e, 0x4148, 0x6525, 0x652b, 0x6526,
+  0x3750, 0x652e, 0x6532, 0x376b, 0x652d, 0x6536, 0x394a, 0x4d6d,
+  0x303c, 0x6533, 0x356b, 0x6530, 0x6531, 0x457d, 0x652f, 0x652c,
+  0x3328, 0x4064, 0x3828, 0x6538, 0x6535, 0x6537, 0x6534, 0x3751,
+  0x4233, 0x6539, 0x416e, 0x6546, 0x6542, 0x653c, 0x6540, 0x3c7a,
+  0x305d, 0x653b, 0x6543, 0x6547, 0x394b, 0x4c56, 0x4456, 0x653d,
+  0x6545, 0x653a, 0x433e, 0x653f, 0x303d, 0x4c4a, 0x653e, 0x365b,
+  0x486c, 0x416d, 0x4e50, 0x3d6f, 0x656e, 0x6548, 0x407e, 0x6544,
+  0x6549, 0x654b, 0x4479, 0x654e, 0x654a, 0x4a54, 0x344b, 0x4c4b,
+  0x305e, 0x654d, 0x4e7d, 0x654c, 0x316f, 0x466c, 0x654f, 0x6556,
+  0x6550, 0x6557, 0x6553, 0x477b, 0x3c4a, 0x6555, 0x6552, 0x6558,
+  0x6551, 0x3d44, 0x4b25, 0x3d4c, 0x6554, 0x6560, 0x655c, 0x655f,
+  0x655d, 0x6561, 0x655b, 0x6541, 0x4053, 0x484b, 0x655e, 0x6559,
+  0x4121, 0x3752, 0x3d2b, 0x3f25, 0x4136, 0x6564, 0x6566, 0x6567,
+  0x6563, 0x6565, 0x655a, 0x6562, 0x656a, 0x6569, 0x4b7a, 0x372b,
+  0x6568, 0x656c, 0x656b, 0x656f, 0x6571, 0x3b3c, 0x656d, 0x6572,
+  0x6573, 0x6574, 0x657a, 0x453b, 0x6576, 0x6575, 0x6577, 0x6578,
+  0x6579, 0x657b, 0x657c, 0x344c, 0x657d, 0x657e, 0x6621, 0x6622,
+  0x6623, 0x6624, 0x6625, 0x6626, 0x6628, 0x6627, 0x6629, 0x662a,
+  0x662b, 0x662e, 0x662c, 0x662d, 0x3a61, 0x3753, 0x4356, 0x4833,
+  0x3d70, 0x474d, 0x486d, 0x662f, 0x586d, 0x6630, 0x6632, 0x4d65,
+  0x6631, 0x6634, 0x6633, 0x4d53, 0x6635, 0x487e, 0x6636, 0x6639,
+  0x6638, 0x6637, 0x663a, 0x3732, 0x4122, 0x3541, 0x663e, 0x663b,
+  0x663c, 0x663f, 0x6640, 0x663d, 0x3129, 0x3227, 0x6642, 0x6643,
+  0x6644, 0x4d62, 0x3d2c, 0x6646, 0x6645, 0x3f69, 0x6647, 0x6648,
+  0x6649, 0x3465, 0x344d, 0x664a, 0x664b, 0x4b5d, 0x4d63, 0x4d54,
+  0x4f37, 0x394d, 0x664e, 0x3c54, 0x664d, 0x664f, 0x3c29, 0x4251,
+  0x6650, 0x394c, 0x4c57, 0x6651, 0x6652, 0x6653, 0x6654, 0x6655,
+  0x3c2a, 0x4c6d, 0x6657, 0x433f, 0x6656, 0x6659, 0x6658, 0x665a,
+  0x403b, 0x665b, 0x665c, 0x4a39, 0x665d, 0x416f, 0x665e, 0x665f,
+  0x4e7e, 0x6662, 0x6661, 0x6660, 0x4430, 0x6663, 0x3f26, 0x6664,
+  0x6665, 0x4f38, 0x6666, 0x6667, 0x6669, 0x6668, 0x4825, 0x4679,
+  0x4f3e, 0x4829, 0x666b, 0x3e53, 0x492a, 0x666c, 0x666a, 0x344e,
+  0x3854, 0x3b68, 0x486e, 0x382a, 0x4b43, 0x666f, 0x666d, 0x394e,
+  0x394f, 0x3069, 0x3a68, 0x4759, 0x305f, 0x6674, 0x4340, 0x4758,
+  0x425b, 0x6676, 0x6672, 0x6675, 0x6670, 0x6673, 0x4b26, 0x3855,
+  0x307d, 0x6671, 0x6678, 0x6679, 0x4639, 0x363b, 0x6726, 0x473d,
+  0x3b69, 0x363c, 0x4048, 0x4f46, 0x4c2e, 0x6677, 0x4054, 0x3553,
+  0x667a, 0x667c, 0x667b, 0x667d, 0x4326, 0x473e, 0x4431, 0x6723,
+  0x6722, 0x667e, 0x3f55, 0x4965, 0x6725, 0x6724, 0x3950, 0x4f53,
+  0x6735, 0x6729, 0x672a, 0x3c70, 0x6728, 0x3978, 0x6727, 0x672b,
+  0x4432, 0x4a22, 0x4123, 0x425c, 0x672f, 0x6730, 0x672c, 0x672d,
+  0x672e, 0x3951, 0x6736, 0x6732, 0x4966, 0x4b6c, 0x4928, 0x6731,
+  0x6734, 0x6733, 0x4b44, 0x6737, 0x6738, 0x4137, 0x6739, 0x673b,
+  0x673f, 0x673c, 0x673a, 0x473f, 0x673d, 0x673e, 0x3232, 0x6745,
+  0x6740, 0x6741, 0x6742, 0x4221, 0x6744, 0x6743, 0x6746, 0x6747,
+  0x6748, 0x3f43, 0x3269, 0x6749, 0x4e57, 0x3c2b, 0x3d2d, 0x3b6a,
+  0x4357, 0x674a, 0x674b, 0x3131, 0x674c, 0x674d, 0x674e, 0x674f,
+  0x6750, 0x363d, 0x5a2a, 0x6751, 0x4065, 0x6752, 0x3c4b, 0x6753,
+  0x5030, 0x6754, 0x4a5e, 0x345c, 0x4124, 0x3d58, 0x4971, 0x3d2e,
+  0x6755, 0x3952, 0x6756, 0x484c, 0x6764, 0x6758, 0x4249, 0x4775,
+  0x383f, 0x6757, 0x4125, 0x6759, 0x447a, 0x675b, 0x675a, 0x675d,
+  0x675c, 0x675e, 0x6760, 0x675f, 0x344f, 0x6761, 0x6762, 0x6763,
+  0x3a31, 0x4e49, 0x6765, 0x3f27, 0x3170, 0x6766, 0x6767, 0x6768,
+  0x3072, 0x6769, 0x676a, 0x4967, 0x3c47, 0x676c, 0x3329, 0x3032,
+  0x676b, 0x676e, 0x474e, 0x3f44, 0x3256, 0x4b27, 0x375d, 0x365c,
+  0x676d, 0x326a, 0x3423, 0x3171, 0x6772, 0x4e6a, 0x425d, 0x4944,
+  0x677e, 0x3257, 0x677c, 0x677a, 0x6771, 0x676f, 0x6770, 0x3c63,
+  0x366c, 0x4377, 0x4651, 0x3151, 0x6774, 0x6773, 0x6779, 0x6775,
+  0x6778, 0x4c50, 0x6777, 0x3258, 0x337d, 0x677b, 0x677d, 0x3754,
+  0x6823, 0x682c, 0x682d, 0x302b, 0x6834, 0x3071, 0x682b, 0x682a,
+  0x6825, 0x6824, 0x6822, 0x6821, 0x4363, 0x427b, 0x6827, 0x6826,
+  0x6829, 0x4170, 0x3755, 0x3141, 0x6828, 0x3953, 0x4171, 0x683a,
+  0x683b, 0x3259, 0x322e, 0x6838, 0x682e, 0x6836, 0x683d, 0x6837,
+  0x6835, 0x6776, 0x6833, 0x682f, 0x3450, 0x6831, 0x683c, 0x6832,
+  0x683e, 0x6830, 0x477c, 0x4d69, 0x6839, 0x684f, 0x6847, 0x3f7b,
+  0x3546, 0x365d, 0x6842, 0x325b, 0x3e54, 0x6845, 0x3a5a, 0x4551,
+  0x684a, 0x4a6e, 0x6841, 0x325a, 0x3856, 0x4929, 0x684b, 0x683f,
+  0x6848, 0x6852, 0x6843, 0x6844, 0x463a, 0x6849, 0x6846, 0x4b28,
+  0x684c, 0x3060, 0x6840, 0x684e, 0x684d, 0x476b, 0x6854, 0x685f,
+  0x337e, 0x6862, 0x6850, 0x6855, 0x4d6e, 0x685e, 0x4d55, 0x4e2a,
+  0x4378, 0x336b, 0x4972, 0x6864, 0x4621, 0x3031, 0x685d, 0x6859,
+  0x4172, 0x6853, 0x685b, 0x6860, 0x472c, 0x302a, 0x6858, 0x6861,
+  0x4978, 0x685c, 0x6857, 0x3e55, 0x3d2f, 0x3c2c, 0x4c58, 0x4947,
+  0x6867, 0x6870, 0x685a, 0x3377, 0x3e78, 0x6865, 0x686a, 0x4173,
+  0x6866, 0x686d, 0x435f, 0x686e, 0x4d56, 0x6863, 0x3338, 0x6869,
+  0x686c, 0x4c2c, 0x686f, 0x6868, 0x686b, 0x4b29, 0x4f21, 0x6873,
+  0x687a, 0x6872, 0x3c43, 0x6851, 0x4a4e, 0x4c22, 0x6879, 0x6878,
+  0x6874, 0x6875, 0x3136, 0x6877, 0x6871, 0x4455, 0x6876, 0x307e,
+  0x4222, 0x4a43, 0x687b, 0x6921, 0x4859, 0x687e, 0x3e56, 0x3c49,
+  0x6923, 0x363e, 0x6924, 0x4979, 0x687d, 0x6856, 0x687c, 0x4f4f,
+  0x4622, 0x4973, 0x692b, 0x6931, 0x6932, 0x6925, 0x4776, 0x692f,
+  0x6927, 0x6929, 0x6933, 0x6928, 0x692c, 0x3172, 0x4665, 0x692d,
+  0x6930, 0x6926, 0x4126, 0x692a, 0x3b27, 0x3f45, 0x3730, 0x4c74,
+  0x4c79, 0x3d72, 0x6937, 0x6935, 0x4f4e, 0x6934, 0x4d75, 0x6936,
+  0x6938, 0x6939, 0x693c, 0x693a, 0x4623, 0x693b, 0x484d, 0x692e,
+  0x3d73, 0x693d, 0x6942, 0x4174, 0x6941, 0x6922, 0x6943, 0x4149,
+  0x693e, 0x6940, 0x693f, 0x5d31, 0x5d22, 0x6945, 0x6944, 0x4d76,
+  0x623c, 0x6946, 0x6947, 0x6948, 0x3857, 0x3554, 0x694a, 0x515d,
+  0x3575, 0x4e3a, 0x3673, 0x694b, 0x694c, 0x436e, 0x694d, 0x467a,
+  0x303a, 0x3263, 0x6952, 0x6953, 0x694e, 0x3b3d, 0x694f, 0x4742,
+  0x6950, 0x6951, 0x695b, 0x6955, 0x6958, 0x6954, 0x6956, 0x6957,
+  0x3c58, 0x6959, 0x4341, 0x3756, 0x3342, 0x695c, 0x333f, 0x6961,
+  0x695d, 0x6960, 0x483a, 0x695e, 0x695f, 0x4948, 0x485a, 0x6962,
+  0x427d, 0x696c, 0x6968, 0x326b, 0x6966, 0x4b2a, 0x6967, 0x6964,
+  0x6965, 0x696a, 0x696d, 0x696b, 0x6969, 0x6963, 0x4358, 0x6974,
+  0x4c2a, 0x6972, 0x6973, 0x696e, 0x6970, 0x6971, 0x696f, 0x4066,
+  0x4f39, 0x6978, 0x6979, 0x6a21, 0x3f2a, 0x697b, 0x697e, 0x6976,
+  0x6975, 0x6a22, 0x325c, 0x697c, 0x6a23, 0x697d, 0x697a, 0x4433,
+  0x6977, 0x4768, 0x6a27, 0x4d3b, 0x6a26, 0x6a25, 0x6a2e, 0x6a28,
+  0x6a30, 0x4d66, 0x6a33, 0x6a2a, 0x6a2b, 0x6a2f, 0x6a32, 0x6a31,
+  0x6a29, 0x6a2c, 0x6a3d, 0x6a36, 0x6a34, 0x6a35, 0x6a3a, 0x6a3b,
+  0x332a, 0x3542, 0x6a39, 0x6a24, 0x6a38, 0x6a3c, 0x6a37, 0x6a3e,
+  0x6a40, 0x6a3f, 0x6a42, 0x6a41, 0x695a, 0x6a46, 0x6a43, 0x6a44,
+  0x6a45, 0x6a47, 0x376c, 0x6a49, 0x6a48, 0x3d30, 0x3954, 0x5e27,
+  0x6a4a, 0x3d51, 0x3339, 0x6a4b, 0x3152, 0x3e57, 0x6a4c, 0x3955,
+  0x6a4d, 0x3061, 0x493d, 0x6a4e, 0x3f6a, 0x6a55, 0x6a52, 0x436f,
+  0x6a53, 0x6a50, 0x365e, 0x6a4f, 0x6a56, 0x3736, 0x425e, 0x6a5c,
+  0x6a58, 0x4235, 0x6a57, 0x6a5a, 0x6a51, 0x6a5b, 0x6a5d, 0x486f,
+  0x6a59, 0x6a5e, 0x6a60, 0x3853, 0x6a54, 0x3041, 0x6a5f, 0x3a5b,
+  0x4e76, 0x6a61, 0x6a62, 0x4175, 0x4e22, 0x6a63, 0x4d35, 0x6a64,
+  0x6a65, 0x4a64, 0x6a66, 0x3a40, 0x4e23, 0x6a6b, 0x6a6c, 0x3e58,
+  0x6a6a, 0x4d67, 0x6a67, 0x6a69, 0x403d, 0x3f7e, 0x6a68, 0x6a6d,
+  0x4a23, 0x6a6f, 0x6a6e, 0x336c, 0x4b2b, 0x6a70, 0x6a7c, 0x6a72,
+  0x6a73, 0x6a74, 0x6a75, 0x6a79, 0x6a7a, 0x6a78, 0x6a76, 0x6a71,
+  0x6a77, 0x6a7b, 0x7037, 0x3228, 0x6a7e, 0x365f, 0x6a7d, 0x6b22,
+  0x6b21, 0x6b24, 0x6b23, 0x6b25, 0x3d31, 0x6b26, 0x6b27, 0x6b28,
+  0x403e, 0x4d57, 0x6b29, 0x4a24, 0x4746, 0x6b2a, 0x6b2b, 0x382b,
+  0x352c, 0x6b2c, 0x3b6b, 0x4741, 0x6b2d, 0x3350, 0x6b2e, 0x6b30,
+  0x4d77, 0x6b2f, 0x3f46, 0x6b31, 0x6b32, 0x6b33, 0x3451, 0x6b34,
+  0x6b35, 0x6b36, 0x6b37, 0x3351, 0x6b38, 0x6b39, 0x6b3a, 0x3272,
+  0x3f28, 0x6b3b, 0x6b3c, 0x6b3d, 0x3840, 0x447b, 0x6b3e, 0x3757,
+  0x3f56, 0x6b41, 0x4624, 0x6b40, 0x3731, 0x6b3f, 0x4277, 0x352d,
+  0x6b42, 0x6b43, 0x3e59, 0x376d, 0x6b44, 0x4b2c, 0x405f, 0x3576,
+  0x4c75, 0x414a, 0x6b45, 0x3f47, 0x4370, 0x3e5a, 0x6b46, 0x6b49,
+  0x6b4a, 0x3a3e, 0x4242, 0x6b48, 0x3e5b, 0x493e, 0x6b47, 0x3b6c,
+  0x3153, 0x6b4e, 0x3758, 0x3b6e, 0x3b6d, 0x4f4d, 0x6b4d, 0x6b4c,
+  0x4127, 0x354d, 0x4f43, 0x333a, 0x3e5c, 0x6b4b, 0x6b50, 0x6b51,
+  0x6b4f, 0x3858, 0x4d40, 0x3b6f, 0x4727, 0x6b54, 0x4040, 0x4342,
+  0x4d36, 0x6b57, 0x386c, 0x403f, 0x6b53, 0x6b58, 0x386d, 0x6b55,
+  0x6b56, 0x6b52, 0x4062, 0x4649, 0x432f, 0x325d, 0x4870, 0x3543,
+  0x4434, 0x6b5b, 0x6b59, 0x434c, 0x4041, 0x3452, 0x6b5a, 0x3f5b,
+  0x4e4a, 0x4f40, 0x6b5c, 0x6b67, 0x4435, 0x6b66, 0x6b63, 0x6b6b,
+  0x6b64, 0x6b60, 0x447c, 0x6b5f, 0x6b5d, 0x4d21, 0x3b70, 0x6b61,
+  0x6b5e, 0x6b65, 0x3d74, 0x3841, 0x427a, 0x4b45, 0x315a, 0x3062,
+  0x4625, 0x6b69, 0x6b68, 0x4666, 0x6b6d, 0x6b62, 0x6b6c, 0x6b6e,
+  0x382c, 0x6b6a, 0x3956, 0x3c55, 0x6b6f, 0x4d58, 0x6b72, 0x6b75,
+  0x6b73, 0x4935, 0x6b70, 0x3660, 0x6b74, 0x6b76, 0x6b7a, 0x6b77,
+  0x6b79, 0x6b78, 0x6b7b, 0x3c31, 0x6b7d, 0x6b7c, 0x4968, 0x6c21,
+  0x3759, 0x6b7e, 0x6c22, 0x6c23, 0x3544, 0x6641, 0x3e79, 0x6c24,
+  0x386e, 0x6c25, 0x6c26, 0x3b3e, 0x5a4e, 0x6c27, 0x6c28, 0x3d32,
+  0x6c29, 0x6c2a, 0x6c2b, 0x6c2c, 0x6c2d, 0x432b, 0x6c2e, 0x6c30,
+  0x6c2f, 0x4626, 0x6c31, 0x4b2d, 0x6c32, 0x6c33, 0x6c34, 0x6c35,
+  0x465a, 0x3e5d, 0x6c36, 0x396b, 0x502e, 0x6c37, 0x6c38, 0x493f,
+  0x6c39, 0x6c41, 0x6c3a, 0x6c3c, 0x6c3b, 0x6c3d, 0x4b46, 0x6c3e,
+  0x6c3f, 0x6c40, 0x6c42, 0x332d, 0x4467, 0x4969, 0x3a62, 0x3957,
+  0x494f, 0x325f, 0x484e, 0x6c45, 0x3453, 0x4055, 0x6c44, 0x6c49,
+  0x4379, 0x4c63, 0x6c47, 0x6c48, 0x352e, 0x6c4a, 0x4763, 0x425f,
+  0x4871, 0x453d, 0x6c46, 0x4b47, 0x326c, 0x6c4c, 0x4f28, 0x4442,
+  0x4f45, 0x3b71, 0x6c4b, 0x4231, 0x6c5c, 0x4128, 0x4678, 0x4950,
+  0x6c4f, 0x3b3f, 0x3b72, 0x3e5e, 0x4765, 0x382d, 0x6c4e, 0x6c4d,
+  0x496a, 0x3c41, 0x4552, 0x6c51, 0x6c52, 0x3958, 0x6c50, 0x6c53,
+  0x6c54, 0x6c56, 0x4223, 0x6c55, 0x3466, 0x6c58, 0x6c57, 0x6c59,
+  0x6c5b, 0x6c5d, 0x6c5e, 0x4056, 0x3c4f, 0x6c5f, 0x3352, 0x6c60,
+  0x4176, 0x6c61, 0x6c62, 0x496b, 0x352f, 0x6c63, 0x4436, 0x315b,
+  0x6c64, 0x3c71, 0x3f76, 0x422d, 0x6c67, 0x6c66, 0x6c65, 0x6c6d,
+  0x6c6b, 0x6c68, 0x6c6a, 0x6c69, 0x6c6c, 0x3577, 0x6c70, 0x4057,
+  0x6c71, 0x3859, 0x6c6e, 0x6c6f, 0x4f29, 0x4437, 0x4129, 0x6c72,
+  0x6c75, 0x6c73, 0x6c74, 0x4d59, 0x4627, 0x6c78, 0x6c76, 0x6c77,
+  0x6c79, 0x6d29, 0x6c7c, 0x6c7d, 0x6c7b, 0x6c7a, 0x447d, 0x6d21,
+  0x6d25, 0x6d22, 0x6c7e, 0x6d23, 0x6d24, 0x6d2b, 0x6d26, 0x4058,
+  0x6d28, 0x6d2a, 0x6d27, 0x6d2d, 0x3d33, 0x6d2c, 0x6d2e, 0x6d2f,
+  0x6d32, 0x6d31, 0x6d30, 0x6d34, 0x6d33, 0x4c76, 0x6d36, 0x6d35,
+  0x6d37, 0x6d38, 0x6d3a, 0x6d39, 0x3f48, 0x6d3b, 0x366d, 0x6d3c,
+  0x6d3e, 0x6d3f, 0x6d40, 0x6d3d, 0x6d41, 0x3c56, 0x6d42, 0x3530,
+  0x3733, 0x382e, 0x6d43, 0x4670, 0x453e, 0x6d44, 0x6d47, 0x3c34,
+  0x6d46, 0x6d45, 0x375a, 0x6d48, 0x3353, 0x6d4a, 0x3a5c, 0x6d49,
+  0x6d52, 0x6d4c, 0x6d4e, 0x4a65, 0x6d4b, 0x6d4d, 0x6d51, 0x6d4f,
+  0x3531, 0x6d50, 0x6d53, 0x475a, 0x4e58, 0x3d34, 0x6d54, 0x4d22,
+  0x6d56, 0x6d55, 0x6d59, 0x4d41, 0x6d58, 0x336d, 0x6d57, 0x6d5c,
+  0x6d5b, 0x6d5a, 0x4532, 0x6d5d, 0x6d5e, 0x6d5f, 0x396c, 0x3725,
+  0x6d60, 0x6d61, 0x6d62, 0x3f49, 0x6d63, 0x3c2d, 0x6d64, 0x6d65,
+  0x5221, 0x517e, 0x6d66, 0x6570, 0x6d67, 0x4324, 0x3f2b, 0x4740,
+  0x6d68, 0x4a55, 0x4454, 0x397e, 0x4329, 0x312a, 0x4b78, 0x3f57,
+  0x375e, 0x3661, 0x4a56, 0x6d69, 0x6d6b, 0x6d6a, 0x3260, 0x4676,
+  0x6d6c, 0x4777, 0x4533, 0x6d6d, 0x3d52, 0x6d6f, 0x4c42, 0x6d7e,
+  0x6d71, 0x6d72, 0x4449, 0x4260, 0x4177, 0x4628, 0x6d70, 0x3555,
+  0x6d79, 0x6d76, 0x6e25, 0x4629, 0x4360, 0x6d73, 0x447e, 0x4553,
+  0x6d74, 0x6d78, 0x3f60, 0x4767, 0x444c, 0x4042, 0x6d77, 0x422e,
+  0x4224, 0x6d75, 0x3029, 0x4f22, 0x6d7a, 0x4261, 0x3d35, 0x3f4a,
+  0x6d7c, 0x6d7b, 0x306f, 0x6d7d, 0x492f, 0x6e27, 0x465b, 0x3f6b,
+  0x4359, 0x3678, 0x6e26, 0x4d37, 0x313f, 0x4a57, 0x3261, 0x6e21,
+  0x6e22, 0x6e23, 0x6e24, 0x463b, 0x4323, 0x3063, 0x6e28, 0x6e29,
+  0x7423, 0x423d, 0x6e2a, 0x3173, 0x414c, 0x382f, 0x4d5a, 0x6e2b,
+  0x452c, 0x4178, 0x3c57, 0x6e2c, 0x6e2f, 0x3d65, 0x6e2d, 0x412b,
+  0x412a, 0x3064, 0x4e4b, 0x6e31, 0x4872, 0x6e33, 0x6e32, 0x6e30,
+  0x6364, 0x3454, 0x6d6e, 0x6e35, 0x6e34, 0x6e36, 0x4d38, 0x4661,
+  0x4b2e, 0x6e37, 0x3c59, 0x6e38, 0x6e39, 0x6e3a, 0x4521, 0x306a,
+  0x3959, 0x4f3a, 0x6e3e, 0x3734, 0x6e3b, 0x6e3c, 0x4974, 0x3354,
+  0x4d39, 0x363f, 0x4554, 0x6e3f, 0x6e40, 0x6e41, 0x4522, 0x6e43,
+  0x6e42, 0x4653, 0x6e44, 0x3d36, 0x3c60, 0x475b, 0x4371, 0x3c72,
+  0x3f6c, 0x6e45, 0x6e46, 0x3f5d, 0x6e47, 0x6e48, 0x6e49, 0x4d6f,
+  0x3d37, 0x6e4b, 0x6e4a, 0x395a, 0x3973, 0x3b40, 0x6e4e, 0x3d66,
+  0x6e4d, 0x6e4c, 0x4269, 0x386f, 0x4043, 0x4830, 0x3d39, 0x6e4f,
+  0x3e5f, 0x6e52, 0x6e50, 0x6e51, 0x6e54, 0x6e53, 0x3e7a, 0x6e55,
+  0x6e56, 0x6e57, 0x4850, 0x3a53, 0x3c61, 0x6e58, 0x6e59, 0x4e24,
+  0x3d45, 0x4c6e, 0x4e4c, 0x6e5a, 0x3662, 0x6e5b, 0x4523, 0x6e5e,
+  0x3378, 0x3f4b, 0x6e5c, 0x6e5d, 0x4460, 0x4b55, 0x367c, 0x6e60,
+  0x6e61, 0x6e5f, 0x6e63, 0x465f, 0x3343, 0x6e67, 0x6e64, 0x6e66,
+  0x6e62, 0x6f4f, 0x6e65, 0x4e6b, 0x385a, 0x6e6f, 0x4534, 0x6e6a,
+  0x6e6d, 0x6e6b, 0x6e70, 0x6e71, 0x6e69, 0x6e76, 0x3174, 0x6e68,
+  0x482d, 0x6e6c, 0x3e60, 0x395b, 0x4b48, 0x3664, 0x3d46, 0x463c,
+  0x412d, 0x6e74, 0x6e6e, 0x6e73, 0x4c43, 0x4438, 0x6e75, 0x6e72,
+  0x412c, 0x6e79, 0x6e78, 0x6e77, 0x4b2f, 0x3d7b, 0x6e7a, 0x4a5f,
+  0x3154, 0x4946, 0x4372, 0x3578, 0x6e7c, 0x395d, 0x3b2c, 0x6e7b,
+  0x3f6d, 0x3f6e, 0x6f21, 0x6f23, 0x3e7b, 0x6f22, 0x6f24, 0x3653,
+  0x4945, 0x3c62, 0x4f23, 0x6e7e, 0x3a78, 0x4f3f, 0x6f26, 0x6f25,
+  0x6f27, 0x6e7d, 0x4669, 0x4555, 0x4457, 0x6f2c, 0x4343, 0x6f28,
+  0x6f29, 0x372d, 0x6f2b, 0x3830, 0x6f2a, 0x3e61, 0x3379, 0x6f30,
+  0x3a3f, 0x4179, 0x444a, 0x333b, 0x6f2e, 0x6f2f, 0x4443, 0x6f2d,
+  0x6f31, 0x6f37, 0x6f3a, 0x6f39, 0x452d, 0x6f32, 0x6f33, 0x6f36,
+  0x6f38, 0x3640, 0x6f3b, 0x6f35, 0x6f34, 0x6f3f, 0x6f40, 0x6f41,
+  0x6f3e, 0x6f3d, 0x3e62, 0x462a, 0x6f3c, 0x6f45, 0x6f43, 0x6f44,
+  0x6f42, 0x4278, 0x6f46, 0x6f47, 0x6f49, 0x3455, 0x6f48, 0x4c7a,
+  0x6f54, 0x6f4a, 0x6f4d, 0x6f4b, 0x6f4c, 0x6f4e, 0x6f50, 0x6f51,
+  0x6f52, 0x6f55, 0x6f53, 0x6f56, 0x6f58, 0x6f57, 0x4439, 0x4c67,
+  0x6f59, 0x412e, 0x6f5a, 0x4a44, 0x6f5b, 0x332b, 0x313c, 0x3457,
+  0x3456, 0x6f5c, 0x6f5d, 0x6f5e, 0x6f5f, 0x6f60, 0x3458, 0x3355,
+  0x395e, 0x4836, 0x6f62, 0x6f61, 0x6f63, 0x315c, 0x6f66, 0x6f65,
+  0x6f64, 0x6f67, 0x6f6a, 0x3047, 0x6f68, 0x6f6c, 0x6f6b, 0x6f6e,
+  0x6f6d, 0x6f6f, 0x462e, 0x6f70, 0x6f71, 0x6f73, 0x6f72, 0x496c,
+  0x6f74, 0x6f75, 0x3a65, 0x6f76, 0x6f77, 0x4b49, 0x414b, 0x3024,
+  0x424b, 0x6f78, 0x496d, 0x6f7b, 0x6f79, 0x395f, 0x6f7a, 0x3842,
+  0x4a45, 0x6f7d, 0x7021, 0x6f7e, 0x7022, 0x3121, 0x3f58, 0x3d7c,
+  0x3459, 0x7023, 0x4766, 0x7025, 0x3122, 0x7024, 0x4444, 0x4e4d,
+  0x462b, 0x6f7c, 0x4e26, 0x3831, 0x4d5b, 0x3679, 0x4e34, 0x3728,
+  0x4262, 0x6721, 0x7026, 0x332c, 0x3f6f, 0x3356, 0x7028, 0x7029,
+  0x7027, 0x3764, 0x3a5d, 0x3e63, 0x3123, 0x4e59, 0x702b, 0x6e2e,
+  0x702a, 0x702e, 0x702c, 0x702d, 0x702f, 0x7030, 0x4e6c, 0x7031,
+  0x7032, 0x4049, 0x483b, 0x3f7d, 0x3467, 0x4d3a, 0x326d, 0x3d38,
+  0x385b, 0x7035, 0x7034, 0x3b73, 0x7036, 0x7033, 0x3b28, 0x703a,
+  0x6a2d, 0x5256, 0x3f77, 0x7038, 0x4e25, 0x4671, 0x312b, 0x4063,
+  0x3c36, 0x4a37, 0x3140, 0x4e6d, 0x4d6b, 0x703b, 0x4545, 0x3c7b,
+  0x703c, 0x703d, 0x3f4c, 0x703e, 0x4e6e, 0x7039, 0x7040, 0x7042,
+  0x7041, 0x703f, 0x7043, 0x7044, 0x417a, 0x3262, 0x7045, 0x4c38,
+  0x7046, 0x7047, 0x4f2a, 0x5b31, 0x7048, 0x7049, 0x704a, 0x704e,
+  0x704b, 0x704c, 0x704d, 0x704f, 0x4044, 0x4c77, 0x4045, 0x7050,
+  0x4873, 0x7051, 0x7353, 0x4c4c, 0x7052, 0x7053, 0x7054, 0x3357,
+  0x7056, 0x3f59, 0x7057, 0x3724, 0x7058, 0x705c, 0x705a, 0x705b,
+  0x3373, 0x7059, 0x705d, 0x705e, 0x3048, 0x705f, 0x7060, 0x3e64,
+  0x7061, 0x3547, 0x7064, 0x7063, 0x7062, 0x6b71, 0x4a5c, 0x7065,
+  0x7066, 0x7067, 0x7068, 0x7069, 0x706a, 0x345a, 0x706b, 0x706c,
+  0x4723, 0x706e, 0x323b, 0x7071, 0x7070, 0x3124, 0x3641, 0x4a47,
+  0x443a, 0x3a22, 0x3960, 0x3d67, 0x3f5c, 0x7073, 0x7072, 0x4d42,
+  0x3468, 0x4852, 0x465c, 0x3f7c, 0x4e4e, 0x375b, 0x7076, 0x7075,
+  0x4b4b, 0x462c, 0x3150, 0x7077, 0x7074, 0x4951, 0x4d6a, 0x7078,
+  0x7079, 0x707b, 0x426a, 0x335b, 0x335c, 0x707a, 0x3469, 0x3832,
+  0x346a, 0x453f, 0x4e60, 0x385c, 0x707c, 0x707d, 0x707e, 0x7121,
+  0x7123, 0x7122, 0x4977, 0x7124, 0x7125, 0x7126, 0x7127, 0x7129,
+  0x7128, 0x712a, 0x4874, 0x664c, 0x3f29, 0x3532, 0x712b, 0x712c,
+  0x522c, 0x5d3b, 0x4853, 0x307b, 0x303b, 0x3b74, 0x4b30, 0x3e7e,
+  0x712d, 0x4c5f, 0x712e, 0x4d5c, 0x3142, 0x3b41, 0x712f, 0x326e,
+  0x7130, 0x7131, 0x7133, 0x7134, 0x7136, 0x7132, 0x7135, 0x345b,
+  0x7137, 0x7138, 0x7139, 0x713a, 0x713b, 0x713d, 0x713c, 0x713f,
+  0x7142, 0x713e, 0x7140, 0x7141, 0x7143, 0x3642, 0x3c73, 0x7144,
+  0x7145, 0x3961, 0x7146, 0x333e, 0x474f, 0x7147, 0x7148, 0x435a,
+  0x466b, 0x7149, 0x477d, 0x424c, 0x3158, 0x366e, 0x366f, 0x4373,
+  0x714e, 0x3670, 0x326f, 0x714d, 0x714b, 0x714c, 0x714a, 0x7158,
+  0x714f, 0x7150, 0x7151, 0x7152, 0x7154, 0x7153, 0x3d59, 0x7155,
+  0x7157, 0x3533, 0x7156, 0x417b, 0x3833, 0x7159, 0x424d, 0x715a,
+  0x462d, 0x715b, 0x7160, 0x715e, 0x715d, 0x715f, 0x715c, 0x7162,
+  0x7161, 0x7164, 0x3643, 0x7163, 0x7165, 0x7166, 0x7168, 0x7167,
+  0x7169, 0x716b, 0x716a, 0x397c, 0x716c, 0x716d, 0x333c, 0x716e,
+  0x716f, 0x3f71, 0x7170, 0x7171, 0x7172, 0x7173, 0x3962, 0x7174,
+  0x7175, 0x7176, 0x7177, 0x7178, 0x4831, 0x717a, 0x4926, 0x717b,
+  0x7179, 0x717d, 0x717c, 0x717e, 0x7221, 0x7222, 0x7223, 0x7224,
+  0x7225, 0x7226, 0x7227, 0x7228, 0x7229, 0x722a, 0x722b, 0x722c,
+  0x722d, 0x722e, 0x5d35, 0x722f, 0x6478, 0x3534, 0x3321, 0x3a32,
+  0x7231, 0x7230, 0x4c25, 0x7233, 0x7234, 0x7232, 0x7235, 0x4b62,
+  0x7236, 0x357b, 0x4f25, 0x7237, 0x7239, 0x303e, 0x723a, 0x4a2b,
+  0x7238, 0x723b, 0x723c, 0x723d, 0x723e, 0x723f, 0x4b6e, 0x3b2d,
+  0x3a7a, 0x412f, 0x7240, 0x7243, 0x7241, 0x7244, 0x3871, 0x7242,
+  0x7245, 0x7246, 0x7247, 0x724b, 0x3b2a, 0x4264, 0x724c, 0x7249,
+  0x7248, 0x724a, 0x375f, 0x7250, 0x724f, 0x724e, 0x3033, 0x725a,
+  0x7256, 0x7257, 0x7253, 0x7259, 0x7255, 0x3362, 0x4f4c, 0x7258,
+  0x7254, 0x7252, 0x7251, 0x725c, 0x725f, 0x725e, 0x725d, 0x4949,
+  0x725b, 0x3073, 0x7260, 0x7262, 0x336f, 0x724d, 0x3137, 0x7264,
+  0x7263, 0x7261, 0x432d, 0x4b70, 0x4e5a, 0x7265, 0x7266, 0x7267,
+  0x7268, 0x7269, 0x443b, 0x726a, 0x4837, 0x726f, 0x726b, 0x726c,
+  0x4b31, 0x4c44, 0x4650, 0x7270, 0x7271, 0x463e, 0x726e, 0x726d,
+  0x322a, 0x7279, 0x7278, 0x3175, 0x7276, 0x7275, 0x7273, 0x337b,
+  0x7272, 0x3c32, 0x3229, 0x3963, 0x727c, 0x727b, 0x727a, 0x7277,
+  0x727d, 0x727e, 0x7325, 0x7324, 0x7326, 0x312d, 0x7321, 0x7322,
+  0x3974, 0x4c39, 0x7323, 0x4b32, 0x732b, 0x7327, 0x732c, 0x7329,
+  0x7328, 0x375c, 0x732d, 0x732e, 0x732f, 0x732a, 0x7274, 0x7330,
+  0x4461, 0x7334, 0x7335, 0x7333, 0x7332, 0x7338, 0x7331, 0x7336,
+  0x7337, 0x733a, 0x7339, 0x733c, 0x733d, 0x733e, 0x4f49, 0x733b,
+  0x426b, 0x3a6d, 0x733f, 0x7340, 0x7341, 0x7342, 0x7343, 0x3834,
+  0x7344, 0x7345, 0x3c2f, 0x7346, 0x7347, 0x7348, 0x7349, 0x734c,
+  0x734a, 0x4f3c, 0x734b, 0x4e6f, 0x734d, 0x4e5b, 0x734e, 0x477e,
+  0x734f, 0x7351, 0x7352, 0x7350, 0x396d, 0x4c4d, 0x4b63, 0x5677,
+  0x5d60, 0x4b7b, 0x322b, 0x7354, 0x3550, 0x7355, 0x7356, 0x7357,
+  0x3975, 0x7358, 0x6054, 0x4c5b, 0x4263, 0x7359, 0x735b, 0x735a,
+  0x735c, 0x735d, 0x735e, 0x735f, 0x7360, 0x7361, 0x7362, 0x7363,
+  0x7364, 0x7365, 0x7366, 0x7367, 0x7368, 0x4524, 0x385d, 0x736a,
+  0x414d, 0x736b, 0x736c, 0x4921, 0x736d, 0x736e, 0x6337, 0x6c5a,
+  0x706d, 0x736f, 0x7370, 0x7372, 0x7373, 0x7374, 0x4e70, 0x7371,
+  0x7375, 0x7376, 0x7378, 0x7377, 0x737a, 0x737b, 0x7379, 0x4e36,
+  0x737c, 0x737d, 0x6354, 0x737e, 0x212a, 0x2174, 0x2170, 0x2173,
+  0x2175, 0x214a, 0x214b, 0x2176, 0x215c, 0x2124, 0x2125, 0x213f,
+  0x2330, 0x2331, 0x2332, 0x2333, 0x2334, 0x2335, 0x2336, 0x2337,
+  0x2338, 0x2339, 0x2127, 0x2128, 0x2163, 0x2161, 0x2164, 0x2129,
+  0x2177, 0x2341, 0x2342, 0x2343, 0x2344, 0x2345, 0x2346, 0x2347,
+  0x2348, 0x2349, 0x234a, 0x234b, 0x234c, 0x234d, 0x234e, 0x234f,
+  0x2350, 0x2351, 0x2352, 0x2353, 0x2354, 0x2355, 0x2356, 0x2357,
+  0x2358, 0x2359, 0x235a, 0x214e, 0x214f, 0x2130, 0x2132, 0x212e,
+  0x2361, 0x2362, 0x2363, 0x2364, 0x2365, 0x2366, 0x2367, 0x2368,
+  0x2369, 0x236a, 0x236b, 0x236c, 0x236d, 0x236e, 0x236f, 0x2370,
+  0x2371, 0x2372, 0x2373, 0x2374, 0x2375, 0x2376, 0x2377, 0x2378,
+  0x2379, 0x237a, 0x2150, 0x2143, 0x2151, 0x2131, 0x216f,
+};
+
+static const Summary16 jisx0208_uni2indx_page00[16] = {
+  /* 0x0000 */
+  {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 },
+  {    0, 0x0000 }, {    0, 0x1000 }, {    1, 0x0000 }, {    1, 0x0000 },
+  {    1, 0x0000 }, {    1, 0x0000 }, {    1, 0x118c }, {    6, 0x0053 },
+  {   10, 0x0000 }, {   10, 0x0080 }, {   11, 0x0000 }, {   11, 0x0080 },
+};
+static const Summary16 jisx0208_uni2indx_page03[22] = {
+  /* 0x0300 */
+  {   12, 0x0000 }, {   12, 0x0000 }, {   12, 0x0000 }, {   12, 0x0000 },
+  {   12, 0x0000 }, {   12, 0x0000 }, {   12, 0x0000 }, {   12, 0x0000 },
+  {   12, 0x0000 }, {   12, 0xfffe }, {   27, 0x03fb }, {   36, 0xfffe },
+  {   51, 0x03fb }, {   60, 0x0000 }, {   60, 0x0000 }, {   60, 0x0000 },
+  /* 0x0400 */
+  {   60, 0x0002 }, {   61, 0xffff }, {   77, 0xffff }, {   93, 0xffff },
+  {  109, 0xffff }, {  125, 0x0002 },
+};
+static const Summary16 jisx0208_uni2indx_page20[50] = {
+  /* 0x2000 */
+  {  126, 0x0000 }, {  126, 0x3361 }, {  133, 0x0063 }, {  137, 0x080d },
+  {  141, 0x0000 }, {  141, 0x0000 }, {  141, 0x0000 }, {  141, 0x0000 },
+  {  141, 0x0000 }, {  141, 0x0000 }, {  141, 0x0000 }, {  141, 0x0000 },
+  {  141, 0x0000 }, {  141, 0x0000 }, {  141, 0x0000 }, {  141, 0x0000 },
+  /* 0x2100 */
+  {  141, 0x0008 }, {  142, 0x0000 }, {  142, 0x0800 }, {  143, 0x0000 },
+  {  143, 0x0000 }, {  143, 0x0000 }, {  143, 0x0000 }, {  143, 0x0000 },
+  {  143, 0x0000 }, {  143, 0x000f }, {  147, 0x0000 }, {  147, 0x0000 },
+  {  147, 0x0000 }, {  147, 0x0014 }, {  149, 0x0000 }, {  149, 0x0000 },
+  /* 0x2200 */
+  {  149, 0x098d }, {  155, 0x6404 }, {  159, 0x1f81 }, {  166, 0x2030 },
+  {  169, 0x0000 }, {  169, 0x0004 }, {  170, 0x0cc3 }, {  176, 0x0000 },
+  {  176, 0x00cc }, {  180, 0x0000 }, {  180, 0x0020 }, {  181, 0x0000 },
+  {  181, 0x0000 }, {  181, 0x0000 }, {  181, 0x0000 }, {  181, 0x0000 },
+  /* 0x2300 */
+  {  181, 0x0000 }, {  181, 0x0004 },
+};
+static const Summary16 jisx0208_uni2indx_page25[23] = {
+  /* 0x2500 */
+  {  182, 0x900f }, {  188, 0x3999 }, {  196, 0x9939 }, {  204, 0x9999 },
+  {  212, 0x0804 }, {  214, 0x0000 }, {  214, 0x0000 }, {  214, 0x0000 },
+  {  214, 0x0000 }, {  214, 0x0000 }, {  214, 0x0003 }, {  216, 0x300c },
+  {  220, 0xc8c0 }, {  225, 0x0000 }, {  225, 0x8000 }, {  226, 0x0000 },
+  /* 0x2600 */
+  {  226, 0x0060 }, {  228, 0x0000 }, {  228, 0x0000 }, {  228, 0x0000 },
+  {  228, 0x0005 }, {  230, 0x0000 }, {  230, 0xa400 },
+};
+static const Summary16 jisx0208_uni2indx_page30[16] = {
+  /* 0x3000 */
+  {  233, 0xffef }, {  248, 0x103f }, {  255, 0x0000 }, {  255, 0x0000 },
+  {  255, 0xfffe }, {  270, 0xffff }, {  286, 0xffff }, {  302, 0xffff },
+  {  318, 0xffff }, {  334, 0x780f }, {  342, 0xfffe }, {  357, 0xffff },
+  {  373, 0xffff }, {  389, 0xffff }, {  405, 0xffff }, {  421, 0x787f },
+};
+static const Summary16 jisx0208_uni2indx_page4e[1307] = {
+  /* 0x4e00 */
+  {  432, 0x6f8b }, {  442, 0x43f3 }, {  451, 0x2442 }, {  455, 0x9b46 },
+  {  463, 0xe82c }, {  470, 0xe3e0 }, {  478, 0x0004 }, {  479, 0x400a },
+  {  482, 0x5f65 }, {  492, 0xdb36 }, {  502, 0x7977 }, {  513, 0x0449 },
+  {  517, 0xecd7 }, {  528, 0xe3f0 }, {  537, 0x6038 }, {  542, 0x08c5 },
+  /* 0x4f00 */
+  {  547, 0xe602 }, {  553, 0x3403 }, {  558, 0x8000 }, {  559, 0x3551 },
+  {  566, 0xe0c8 }, {  572, 0x7eab }, {  583, 0x8200 }, {  585, 0x9869 },
+  {  592, 0xa948 }, {  598, 0x2942 }, {  603, 0xe803 }, {  609, 0x8060 },
+  {  612, 0x441c }, {  617, 0xad93 }, {  626, 0xc03a }, {  632, 0x4568 },
+  /* 0x5000 */
+  {  638, 0xaa60 }, {  644, 0x8656 }, {  651, 0x3f7a }, {  662, 0x0240 },
+  {  664, 0x8388 }, {  669, 0x1461 }, {  674, 0x1020 }, {  676, 0x2174 },
+  {  682, 0x2021 }, {  685, 0x0702 }, {  689, 0x3000 }, {  691, 0x40bc },
+  {  697, 0xa624 }, {  703, 0x4462 }, {  708, 0x60a8 }, {  713, 0x0a20 },
+  /* 0x5100 */
+  {  716, 0x0217 }, {  721, 0x8574 }, {  728, 0x0402 }, {  730, 0x9c84 },
+  {  736, 0x7bfb }, {  749, 0x1415 }, {  754, 0x7f24 }, {  763, 0x11e2 },
+  {  769, 0xb665 }, {  778, 0x02ef }, {  786, 0x1f75 }, {  796, 0x20ff },
+  {  805, 0x3a70 }, {  812, 0x3840 }, {  816, 0x26c3 }, {  823, 0x6763 },
+  /* 0x5200 */
+  {  832, 0x4dd9 }, {  841, 0x2092 }, {  845, 0x46b0 }, {  851, 0x0fc9 },
+  {  859, 0xbc98 }, {  867, 0x4850 }, {  871, 0x8638 }, {  877, 0xa03f },
+  {  885, 0x2388 }, {  890, 0x8816 }, {  895, 0x3e09 }, {  902, 0x5232 },
+  {  908, 0x22aa }, {  914, 0xe3a4 }, {  922, 0x00dd }, {  928, 0xc72c },
+  /* 0x5300 */
+  {  936, 0xa166 }, {  943, 0x26e1 }, {  950, 0x840b }, {  955, 0x8f0a },
+  {  962, 0x27eb }, {  972, 0x559e }, {  981, 0xc241 }, {  986, 0x89bb },
+  {  995, 0x0014 }, {  997, 0x8540 }, { 1001, 0x6361 }, { 1008, 0x0849 },
+  { 1012, 0x7f0c }, { 1021, 0x8ad0 }, { 1027, 0xff3e }, { 1040, 0x05cf },
+  /* 0x5400 */
+  { 1048, 0xff1a }, { 1059, 0xa803 }, { 1064, 0x7a41 }, { 1071, 0x7b40 },
+  { 1078, 0x4745 }, { 1085, 0x8002 }, { 1087, 0x0500 }, { 1089, 0x38eb },
+  { 1098, 0xd851 }, { 1105, 0x0005 }, { 1107, 0x9934 }, { 1114, 0x710c },
+  { 1120, 0x0397 }, { 1127, 0x0100 }, { 1128, 0x6366 }, { 1136, 0x2404 },
+  /* 0x5500 */
+  { 1139, 0x80d0 }, { 1143, 0x0051 }, { 1146, 0xc000 }, { 1148, 0x430a },
+  { 1153, 0x9071 }, { 1159, 0x30c8 }, { 1164, 0x0008 }, { 1165, 0x5800 },
+  { 1168, 0x0e99 }, { 1175, 0xf700 }, { 1182, 0x5f80 }, { 1189, 0x0041 },
+  { 1191, 0x00b0 }, { 1194, 0x9410 }, { 1198, 0x0018 }, { 1200, 0x6280 },
+  /* 0x5600 */
+  { 1204, 0x0240 }, { 1206, 0x09d0 }, { 1211, 0x8200 }, { 1213, 0x0156 },
+  { 1218, 0x5004 }, { 1221, 0x0801 }, { 1223, 0x1d10 }, { 1228, 0x0510 },
+  { 1231, 0x84c1 }, { 1236, 0x0010 }, { 1237, 0x4025 }, { 1241, 0x1050 },
+  { 1244, 0x410f }, { 1250, 0x4d8a }, { 1257, 0x4009 }, { 1260, 0xa60d },
+  /* 0x5700 */
+  { 1267, 0xab19 }, { 1275, 0x914c }, { 1281, 0x21c0 }, { 1285, 0x0981 },
+  { 1289, 0xc485 }, { 1295, 0x0003 }, { 1297, 0x0652 }, { 1302, 0x8000 },
+  { 1303, 0x0b04 }, { 1307, 0x0008 }, { 1308, 0x041d }, { 1313, 0x0009 },
+  { 1315, 0x4849 }, { 1320, 0x905c }, { 1326, 0x0009 }, { 1328, 0x1690 },
+  /* 0x5800 */
+  { 1333, 0x0c65 }, { 1339, 0x2220 }, { 1342, 0x8412 }, { 1346, 0x2433 },
+  { 1352, 0x0c03 }, { 1356, 0x4796 }, { 1364, 0x0a04 }, { 1367, 0x4225 },
+  { 1372, 0x0028 }, { 1374, 0x9088 }, { 1378, 0x4900 }, { 1381, 0x4f08 },
+  { 1387, 0x14a2 }, { 1392, 0xd3aa }, { 1401, 0xd830 }, { 1407, 0x3e87 },
+  /* 0x5900 */
+  { 1416, 0x8604 }, { 1420, 0x1f61 }, { 1428, 0x7ea4 }, { 1437, 0x4186 },
+  { 1442, 0xc390 }, { 1448, 0x05b3 }, { 1455, 0x57a5 }, { 1464, 0x2118 },
+  { 1468, 0x241e }, { 1474, 0x2a48 }, { 1479, 0x1128 }, { 1483, 0x4a04 },
+  { 1487, 0x0a40 }, { 1490, 0x161b }, { 1497, 0x0d60 }, { 1502, 0x8840 },
+  /* 0x5a00 */
+  { 1505, 0x020a }, { 1508, 0x9502 }, { 1513, 0x8221 }, { 1517, 0x1060 },
+  { 1520, 0x0243 }, { 1524, 0x0400 }, { 1525, 0x1444 }, { 1529, 0x8000 },
+  { 1530, 0x0000 }, { 1530, 0x0c04 }, { 1533, 0x0000 }, { 1533, 0x7000 },
+  { 1536, 0x1a06 }, { 1541, 0x00c1 }, { 1544, 0x024a }, { 1548, 0x0c00 },
+  /* 0x5b00 */
+  { 1550, 0x1a00 }, { 1553, 0x0040 }, { 1554, 0x1404 }, { 1557, 0x4045 },
+  { 1561, 0x0029 }, { 1564, 0xbdb3 }, { 1575, 0x0a78 }, { 1581, 0x052b },
+  { 1587, 0xbba9 }, { 1597, 0xbfa0 }, { 1606, 0x407c }, { 1612, 0x8379 },
+  { 1620, 0x12fc }, { 1628, 0xe81d }, { 1636, 0x4bf6 }, { 1646, 0xc569 },
+  /* 0x5c00 */
+  { 1654, 0xeff6 }, { 1667, 0x044a }, { 1671, 0x2115 }, { 1676, 0xff02 },
+  { 1685, 0xed63 }, { 1695, 0x402b }, { 1700, 0xd033 }, { 1707, 0x0242 },
+  { 1710, 0x1000 }, { 1711, 0x0013 }, { 1714, 0x1b02 }, { 1719, 0x59ca },
+  { 1727, 0x00a0 }, { 1729, 0x0200 }, { 1730, 0xa703 }, { 1737, 0x2c41 },
+  /* 0x5d00 */
+  { 1742, 0x4880 }, { 1745, 0x8ff2 }, { 1755, 0x0204 }, { 1757, 0x0000 },
+  { 1757, 0x5800 }, { 1760, 0x1005 }, { 1763, 0x9200 }, { 1766, 0x0048 },
+  { 1768, 0x1894 }, { 1773, 0x2001 }, { 1775, 0x5004 }, { 1778, 0x3480 },
+  { 1782, 0x3200 }, { 1785, 0x684c }, { 1791, 0x49ea }, { 1799, 0x68be },
+  /* 0x5e00 */
+  { 1808, 0x184c }, { 1813, 0x2e42 }, { 1819, 0xa820 }, { 1823, 0x21c9 },
+  { 1829, 0x50b9 }, { 1836, 0x80b0 }, { 1840, 0x001e }, { 1844, 0xff7c },
+  { 1857, 0x849a }, { 1863, 0x14e0 }, { 1868, 0x28c1 }, { 1873, 0x01e0 },
+  { 1877, 0x870e }, { 1884, 0xac49 }, { 1891, 0x130f }, { 1898, 0xdddb },
+  /* 0x5f00 */
+  { 1910, 0xbe1a }, { 1919, 0x89fb }, { 1929, 0xa2e0 }, { 1935, 0x51a2 },
+  { 1941, 0x5502 }, { 1946, 0x32ca }, { 1953, 0x3e46 }, { 1961, 0x928b },
+  { 1968, 0x1dbf }, { 1979, 0x438f }, { 1987, 0x6703 }, { 1994, 0x3218 },
+  { 1999, 0x3028 }, { 2003, 0x33c0 }, { 2009, 0x0811 }, { 2012, 0xa923 },
+  /* 0x6000 */
+  { 2019, 0xc000 }, { 2021, 0x3a65 }, { 2029, 0x8fe3 }, { 2039, 0x0402 },
+  { 2041, 0x2c4e }, { 2048, 0x8625 }, { 2054, 0xbf3d }, { 2066, 0x00a1 },
+  { 2069, 0x3a1a }, { 2076, 0x8cd4 }, { 2083, 0x06c9 }, { 2089, 0x317c },
+  { 2097, 0x00e0 }, { 2100, 0x950a }, { 2106, 0x018b }, { 2111, 0x0edb },
+  /* 0x6100 */
+  { 2120, 0xe34b }, { 2129, 0x8c20 }, { 2133, 0x1182 }, { 2137, 0xf010 },
+  { 2142, 0x7d94 }, { 2151, 0xa728 }, { 2158, 0xc9ac }, { 2166, 0x40fb },
+  { 2174, 0x4484 }, { 2178, 0x0653 }, { 2184, 0x5a90 }, { 2190, 0x4444 },
+  { 2194, 0x3fc8 }, { 2203, 0x0001 }, { 2204, 0x0048 }, { 2206, 0xf5d4 },
+  /* 0x6200 */
+  { 2216, 0x7701 }, { 2223, 0xec57 }, { 2233, 0xc442 }, { 2238, 0x891d },
+  { 2245, 0x6b83 }, { 2253, 0x4928 }, { 2258, 0x4109 }, { 2262, 0xd242 },
+  { 2268, 0x061d }, { 2274, 0x59fe }, { 2285, 0x1800 }, { 2287, 0x3a22 },
+  { 2293, 0xb7e4 }, { 2303, 0x3b9f }, { 2314, 0xf003 }, { 2320, 0xc0ea },
+  /* 0x6300 */
+  { 2327, 0x1386 }, { 2333, 0x8202 }, { 2336, 0x8980 }, { 2340, 0xe400 },
+  { 2344, 0xb200 }, { 2348, 0x10a1 }, { 2352, 0x4b80 }, { 2357, 0x0cc4 },
+  { 2362, 0xd309 }, { 2369, 0x8944 }, { 2374, 0x1faf }, { 2385, 0x4834 },
+  { 2390, 0x8259 }, { 2396, 0x0c45 }, { 2401, 0x420a }, { 2405, 0x0450 },
+  /* 0x6400 */
+  { 2408, 0xa040 }, { 2411, 0x10c8 }, { 2415, 0x3140 }, { 2419, 0x4450 },
+  { 2423, 0x4004 }, { 2425, 0x0100 }, { 2426, 0x8280 }, { 2429, 0x0540 },
+  { 2432, 0x0108 }, { 2434, 0x442c }, { 2439, 0x6a30 }, { 2445, 0x1a05 },
+  { 2450, 0x20a6 }, { 2455, 0x0514 }, { 2459, 0x90cf }, { 2467, 0x6456 },
+  /* 0x6500 */
+  { 2474, 0x0021 }, { 2476, 0x3100 }, { 2479, 0x9c18 }, { 2485, 0xcbf0 },
+  { 2494, 0xa120 }, { 2498, 0x63e2 }, { 2506, 0x104c }, { 2510, 0x01b5 },
+  { 2516, 0x538c }, { 2523, 0x9a83 }, { 2530, 0xb8b2 }, { 2538, 0x3281 },
+  { 2543, 0x987a }, { 2551, 0x0a84 }, { 2555, 0x33e7 }, { 2565, 0x0c02 },
+  /* 0x6600 */
+  { 2568, 0xd4cc }, { 2576, 0x9018 }, { 2580, 0xa1a1 }, { 2586, 0x9070 },
+  { 2591, 0x8a1e }, { 2598, 0xe004 }, { 2602, 0xc3d4 }, { 2610, 0x0451 },
+  { 2614, 0x439a }, { 2621, 0x21c2 }, { 2626, 0x4844 }, { 2630, 0x5310 },
+  { 2635, 0x0292 }, { 2639, 0x3640 }, { 2644, 0x0241 }, { 2647, 0xf3bd },
+  /* 0x6700 */
+  { 2659, 0xab09 }, { 2666, 0xe8f0 }, { 2674, 0x7dc0 }, { 2682, 0xa5d2 },
+  { 2690, 0xc242 }, { 2695, 0xd24b }, { 2703, 0xa43f }, { 2712, 0xd0af },
+  { 2721, 0x1aa0 }, { 2726, 0x34a1 }, { 2732, 0x8247 }, { 2738, 0x03d8 },
+  { 2744, 0xc452 }, { 2750, 0x651b }, { 2758, 0xd294 }, { 2765, 0xc83a },
+  /* 0x6800 */
+  { 2772, 0x001c }, { 2775, 0x40c8 }, { 2779, 0x0e06 }, { 2784, 0x3314 },
+  { 2790, 0x614f }, { 2798, 0xb21b }, { 2806, 0x0088 }, { 2808, 0xc0d0 },
+  { 2813, 0xa02a }, { 2818, 0xa898 }, { 2824, 0xa1c5 }, { 2831, 0x166b },
+  { 2839, 0x2e50 }, { 2845, 0x85b4 }, { 2852, 0xc08b }, { 2858, 0x0604 },
+  /* 0x6900 */
+  { 2861, 0xf933 }, { 2871, 0x1e04 }, { 2876, 0x056e }, { 2883, 0xa251 },
+  { 2889, 0x0400 }, { 2890, 0x7638 }, { 2898, 0xec07 }, { 2906, 0x73b8 },
+  { 2915, 0x4406 }, { 2919, 0x1832 }, { 2924, 0x4081 }, { 2927, 0xc816 },
+  { 2933, 0x7c8a }, { 2941, 0x6309 }, { 2947, 0x2980 }, { 2951, 0xaa04 },
+  /* 0x6a00 */
+  { 2956, 0x1c24 }, { 2961, 0xca9c }, { 2969, 0x4e0e }, { 2976, 0x2760 },
+  { 2982, 0x0990 }, { 2986, 0x8300 }, { 2989, 0x0046 }, { 2992, 0x8104 },
+  { 2995, 0x6011 }, { 2999, 0x1081 }, { 3002, 0x540d }, { 3008, 0x0908 },
+  { 3011, 0x000e }, { 3014, 0xcc0a }, { 3020, 0x0500 }, { 3022, 0x0c00 },
+  /* 0x6b00 */
+  { 3024, 0x0430 }, { 3027, 0xa044 }, { 3031, 0x008b }, { 3035, 0x6784 },
+  { 3042, 0x5288 }, { 3047, 0x8a19 }, { 3053, 0x865e }, { 3061, 0x8b18 },
+  { 3067, 0x2e59 }, { 3075, 0x4160 }, { 3079, 0x8c10 }, { 3083, 0x9cbe },
+  { 3093, 0x6861 }, { 3099, 0x891c }, { 3105, 0x9800 }, { 3108, 0x0008 },
+  /* 0x6c00 */
+  { 3109, 0x8100 }, { 3111, 0x089a }, { 3116, 0x0018 }, { 3118, 0x4190 },
+  { 3122, 0x4007 }, { 3126, 0xe4a1 }, { 3133, 0x0505 }, { 3137, 0x640d },
+  { 3143, 0x310e }, { 3149, 0x0e4d }, { 3156, 0x4806 }, { 3160, 0xff0a },
+  { 3170, 0x1632 }, { 3176, 0x2aa8 }, { 3182, 0x852e }, { 3189, 0x000b },
+  /* 0x6d00 */
+  { 3192, 0x1800 }, { 3194, 0xca84 }, { 3200, 0x0e20 }, { 3204, 0x696c },
+  { 3212, 0x0032 }, { 3215, 0x1600 }, { 3218, 0x5658 }, { 3225, 0x0390 },
+  { 3229, 0x5120 }, { 3233, 0x1a28 }, { 3238, 0x8000 }, { 3239, 0x1124 },
+  { 3243, 0x18e1 }, { 3249, 0x4326 }, { 3255, 0x5d52 }, { 3263, 0x0eaa },
+  /* 0x6e00 */
+  { 3270, 0x0fa0 }, { 3276, 0xae28 }, { 3283, 0xfa7b }, { 3295, 0x4500 },
+  { 3298, 0x6408 }, { 3302, 0x8940 }, { 3306, 0xc880 }, { 3310, 0xc044 },
+  { 3314, 0x9005 }, { 3318, 0xb141 }, { 3324, 0x8424 }, { 3328, 0x24c4 },
+  { 3333, 0x1a34 }, { 3339, 0x603a }, { 3345, 0x9000 }, { 3347, 0xc194 },
+  /* 0x6f00 */
+  { 3353, 0x8246 }, { 3358, 0x003a }, { 3362, 0x180d }, { 3367, 0xc106 },
+  { 3372, 0x0022 }, { 3374, 0x9910 }, { 3379, 0xe050 }, { 3384, 0x1511 },
+  { 3389, 0x4057 }, { 3395, 0x0082 }, { 3397, 0x041a }, { 3401, 0x020a },
+  { 3404, 0x004f }, { 3409, 0x8930 }, { 3414, 0xd813 }, { 3421, 0x444a },
+  /* 0x7000 */
+  { 3426, 0x8a02 }, { 3430, 0xed22 }, { 3438, 0x10c0 }, { 3441, 0x4005 },
+  { 3444, 0x1000 }, { 3445, 0x0102 }, { 3447, 0x8808 }, { 3450, 0x3101 },
+  { 3454, 0x4600 }, { 3457, 0x0204 }, { 3459, 0xf000 }, { 3463, 0x0708 },
+  { 3467, 0x8900 }, { 3470, 0xa200 }, { 3473, 0x0000 }, { 3473, 0x2202 },
+  /* 0x7100 */
+  { 3476, 0x0200 }, { 3477, 0x1610 }, { 3481, 0x0042 }, { 3483, 0x1040 },
+  { 3485, 0x5200 }, { 3488, 0x0260 }, { 3491, 0x52f4 }, { 3499, 0x2000 },
+  { 3500, 0x8510 }, { 3504, 0x8230 }, { 3508, 0x1100 }, { 3510, 0x4202 },
+  { 3513, 0x4308 }, { 3517, 0x80b5 }, { 3523, 0x70e1 }, { 3530, 0x9a20 },
+  /* 0x7200 */
+  { 3535, 0x2040 }, { 3537, 0x0801 }, { 3539, 0x3500 }, { 3543, 0xfc65 },
+  { 3553, 0x19c1 }, { 3559, 0xab04 }, { 3565, 0x0286 }, { 3569, 0x6214 },
+  { 3574, 0x0087 }, { 3578, 0x0044 }, { 3580, 0x9085 }, { 3585, 0x0244 },
+  { 3588, 0x405c }, { 3593, 0x0a85 }, { 3598, 0x3207 }, { 3604, 0x3380 },
+  /* 0x7300 */
+  { 3609, 0x0400 }, { 3610, 0xb8c0 }, { 3616, 0xce20 }, { 3622, 0xc0d0 },
+  { 3627, 0xc030 }, { 3631, 0x0080 }, { 3632, 0x0508 }, { 3635, 0x0d25 },
+  { 3641, 0x0a90 }, { 3645, 0x0040 }, { 3646, 0x0200 }, { 3647, 0x080c },
+  { 3650, 0x6505 }, { 3656, 0x4000 }, { 3657, 0x6421 }, { 3662, 0x4102 },
+  /* 0x7400 */
+  { 3665, 0x0268 }, { 3669, 0x0000 }, { 3669, 0x0024 }, { 3671, 0x847c },
+  { 3678, 0x0002 }, { 3679, 0xde20 }, { 3686, 0x8619 }, { 3692, 0x4049 },
+  { 3696, 0x0808 }, { 3698, 0x4000 }, { 3699, 0x0084 }, { 3701, 0x2001 },
+  { 3703, 0x8400 }, { 3705, 0x1010 }, { 3707, 0x42cd }, { 3714, 0x01c7 },
+  /* 0x7500 */
+  { 3720, 0x7038 }, { 3726, 0xd52a }, { 3734, 0x1968 }, { 3740, 0x1d8f },
+  { 3749, 0xbe50 }, { 3757, 0x3e12 }, { 3764, 0x2ef5 }, { 3774, 0x81d9 },
+  { 3781, 0xcec4 }, { 3789, 0x2412 }, { 3793, 0x0828 }, { 3796, 0x732e },
+  { 3805, 0x24ac }, { 3811, 0x4b34 }, { 3818, 0x020c }, { 3821, 0xd41d },
+  /* 0x7600 */
+  { 3829, 0x2a02 }, { 3833, 0x8000 }, { 3834, 0x0097 }, { 3839, 0x0811 },
+  { 3842, 0x11c4 }, { 3847, 0x1144 }, { 3851, 0x1786 }, { 3858, 0x7d45 },
+  { 3867, 0x49d9 }, { 3875, 0x0649 }, { 3880, 0x4000 }, { 3881, 0x8791 },
+  { 3888, 0x254c }, { 3894, 0xd8c4 }, { 3901, 0x44ba }, { 3908, 0x4914 },
+  /* 0x7700 */
+  { 3913, 0x1b92 }, { 3920, 0xc800 }, { 3923, 0x0271 }, { 3928, 0x1580 },
+  { 3932, 0x0081 }, { 3934, 0x0c00 }, { 3936, 0x096a }, { 3942, 0xc200 },
+  { 3945, 0x4800 }, { 3947, 0x4002 }, { 3949, 0x3021 }, { 3953, 0xba49 },
+  { 3961, 0x2080 }, { 3963, 0x1c80 }, { 3967, 0xe2ac }, { 3975, 0x1008 },
+  /* 0x7800 */
+  { 3977, 0x1004 }, { 3979, 0x0034 }, { 3982, 0x00e1 }, { 3986, 0x8414 },
+  { 3990, 0x0020 }, { 3991, 0x2000 }, { 3992, 0x9800 }, { 3995, 0x1014 },
+  { 3998, 0x70c2 }, { 4004, 0x04aa }, { 4009, 0x8688 }, { 4014, 0x5420 },
+  { 4018, 0x0c62 }, { 4023, 0x0413 }, { 4027, 0x9180 }, { 4031, 0x2010 },
+  /* 0x7900 */
+  { 4033, 0x4082 }, { 4036, 0x0206 }, { 4039, 0x1c40 }, { 4043, 0x5400 },
+  { 4046, 0x0383 }, { 4051, 0xe4e9 }, { 4060, 0x2125 }, { 4065, 0x8480 },
+  { 4068, 0xe433 }, { 4076, 0x2000 }, { 4077, 0x44c0 }, { 4081, 0xe609 },
+  { 4088, 0x0a03 }, { 4092, 0x8126 }, { 4097, 0x12da }, { 4104, 0x0801 },
+  /* 0x7a00 */
+  { 4106, 0x6901 }, { 4111, 0x9790 }, { 4118, 0x4001 }, { 4120, 0xf886 },
+  { 4128, 0xe24d }, { 4136, 0x0081 }, { 4138, 0x0a0e }, { 4143, 0xa651 },
+  { 4150, 0x011a }, { 4154, 0x81ec }, { 4161, 0xc600 }, { 4165, 0x8441 },
+  { 4169, 0xadb8 }, { 4178, 0xb62c }, { 4186, 0xa46f }, { 4195, 0x8741 },
+  /* 0x7b00 */
+  { 4201, 0x8d54 }, { 4208, 0x4b02 }, { 4213, 0x1161 }, { 4218, 0x0268 },
+  { 4222, 0xbb60 }, { 4230, 0x2057 }, { 4236, 0x50a0 }, { 4240, 0x0433 },
+  { 4245, 0xa8c0 }, { 4250, 0xb7b4 }, { 4260, 0x2402 }, { 4263, 0x0112 },
+  { 4266, 0x9ad3 }, { 4275, 0x2000 }, { 4276, 0x2271 }, { 4282, 0x00c8 },
+  /* 0x7c00 */
+  { 4285, 0x2081 }, { 4288, 0x809e }, { 4294, 0x0c8a }, { 4299, 0xe180 },
+  { 4304, 0xb009 }, { 4309, 0x8151 }, { 4314, 0x1031 }, { 4318, 0x4028 },
+  { 4321, 0x2a0e }, { 4327, 0x89a5 }, { 4334, 0x69b6 }, { 4343, 0x620e },
+  { 4349, 0x4425 }, { 4354, 0xd144 }, { 4360, 0x8085 }, { 4364, 0x4d54 },
+  /* 0x7d00 */
+  { 4371, 0x2c75 }, { 4379, 0x1fb1 }, { 4388, 0xd807 }, { 4395, 0x862d },
+  { 4402, 0xd87c }, { 4411, 0x4841 }, { 4415, 0x414e }, { 4421, 0x226e },
+  { 4428, 0x8200 }, { 4430, 0x9e08 }, { 4436, 0xf80c }, { 4443, 0xed37 },
+  { 4454, 0x8c80 }, { 4458, 0x7526 }, { 4466, 0x9313 }, { 4473, 0x0814 },
+  /* 0x7e00 */
+  { 4476, 0x0e32 }, { 4482, 0xc804 }, { 4486, 0x484e }, { 4492, 0x6ea6 },
+  { 4501, 0x2c4a }, { 4507, 0x6670 }, { 4514, 0x26c0 }, { 4519, 0xba01 },
+  { 4525, 0xd30c }, { 4532, 0x185d }, { 4539, 0x0000 }, { 4539, 0x0000 },
+  { 4539, 0x0000 }, { 4539, 0x0000 }, { 4539, 0x0000 }, { 4539, 0x0000 },
+  /* 0x7f00 */
+  { 4539, 0x0000 }, { 4539, 0x0000 }, { 4539, 0x0000 }, { 4539, 0x0540 },
+  { 4542, 0x7020 }, { 4546, 0x8133 }, { 4552, 0x4f81 }, { 4559, 0x03a5 },
+  { 4565, 0x55ec }, { 4574, 0x6410 }, { 4578, 0xc318 }, { 4584, 0x2344 },
+  { 4589, 0x1462 }, { 4594, 0x0034 }, { 4597, 0x0a43 }, { 4602, 0x1a09 },
+  /* 0x8000 */
+  { 4607, 0x187b }, { 4615, 0x13a5 }, { 4622, 0x0102 }, { 4624, 0xa848 },
+  { 4629, 0x0440 }, { 4631, 0xc544 }, { 4637, 0x8106 }, { 4641, 0xe2dd },
+  { 4651, 0x1af0 }, { 4658, 0x2d48 }, { 4664, 0xb626 }, { 4672, 0x0416 },
+  { 4676, 0x5058 }, { 4681, 0x6e40 }, { 4687, 0x8032 }, { 4691, 0x3112 },
+  /* 0x8100 */
+  { 4696, 0x07e4 }, { 4703, 0x0c00 }, { 4705, 0x8208 }, { 4708, 0x420a },
+  { 4712, 0x4840 }, { 4715, 0x803b }, { 4721, 0x4860 }, { 4725, 0x8713 },
+  { 4732, 0x850d }, { 4738, 0x3428 }, { 4743, 0x0319 }, { 4748, 0xe529 },
+  { 4756, 0x2345 }, { 4762, 0x870a }, { 4768, 0x25a9 }, { 4775, 0x5c18 },
+  /* 0x8200 */
+  { 4781, 0x77a6 }, { 4791, 0xd9c5 }, { 4800, 0x5e00 }, { 4805, 0x03e8 },
+  { 4811, 0x0081 }, { 4813, 0xa700 }, { 4818, 0xcd54 }, { 4826, 0x41c6 },
+  { 4832, 0x2800 }, { 4834, 0xa204 }, { 4838, 0xb860 }, { 4844, 0x2b0a },
+  { 4850, 0x0020 }, { 4851, 0xda9e }, { 4861, 0x08ea }, { 4867, 0x0e1a },
+  /* 0x8300 */
+  { 4873, 0x427c }, { 4880, 0x11c0 }, { 4884, 0x8908 }, { 4888, 0x0376 },
+  { 4895, 0x8621 }, { 4900, 0x0105 }, { 4903, 0x0000 }, { 4903, 0x18a8 },
+  { 4908, 0x46a0 }, { 4913, 0xc448 }, { 4918, 0x0d05 }, { 4923, 0x2022 },
+  { 4926, 0x5422 }, { 4931, 0x9148 }, { 4936, 0x8a01 }, { 4940, 0x2897 },
+  /* 0x8400 */
+  { 4947, 0x7898 }, { 4954, 0x0008 }, { 4955, 0x1605 }, { 4960, 0x3122 },
+  { 4965, 0x4240 }, { 4968, 0x0880 }, { 4970, 0xfa4e }, { 4980, 0x06a2 },
+  { 4985, 0x0814 }, { 4988, 0x9211 }, { 4993, 0x2002 }, { 4995, 0x9b04 },
+  { 5001, 0x2e52 }, { 5008, 0x0643 }, { 5013, 0x5000 }, { 5015, 0x9010 },
+  /* 0x8500 */
+  { 5018, 0x0041 }, { 5020, 0x85ba }, { 5028, 0x3042 }, { 5032, 0x2020 },
+  { 5034, 0x4f0b }, { 5042, 0x05a0 }, { 5046, 0x2708 }, { 5051, 0x4080 },
+  { 5053, 0x0591 }, { 5058, 0x1a93 }, { 5065, 0xdf50 }, { 5074, 0x0600 },
+  { 5076, 0xa202 }, { 5080, 0x3021 }, { 5084, 0x0630 }, { 5088, 0x4e80 },
+  /* 0x8600 */
+  { 5093, 0x0cc4 }, { 5098, 0x04c8 }, { 5102, 0xa004 }, { 5105, 0x8001 },
+  { 5107, 0x6000 }, { 5109, 0xd431 }, { 5116, 0x0880 }, { 5118, 0x0a02 },
+  { 5121, 0x1c00 }, { 5124, 0x0028 }, { 5126, 0x8e18 }, { 5132, 0x0041 },
+  { 5134, 0x6ad0 }, { 5141, 0xca10 }, { 5146, 0xf210 }, { 5152, 0x4b00 },
+  /* 0x8700 */
+  { 5156, 0x274d }, { 5164, 0x1506 }, { 5169, 0x0220 }, { 5171, 0x8890 },
+  { 5175, 0x5a00 }, { 5179, 0x82a8 }, { 5184, 0x4549 }, { 5190, 0x8150 },
+  { 5194, 0x2004 }, { 5196, 0x8000 }, { 5197, 0x8804 }, { 5200, 0x2c08 },
+  { 5204, 0x08d1 }, { 5209, 0x0005 }, { 5211, 0x8001 }, { 5213, 0x4ac4 },
+  /* 0x8800 */
+  { 5219, 0xe020 }, { 5223, 0x0062 }, { 5226, 0x008e }, { 5230, 0x0a42 },
+  { 5234, 0x3055 }, { 5240, 0x6a8c }, { 5247, 0x090e }, { 5252, 0xe0a5 },
+  { 5259, 0x2906 }, { 5264, 0x42c4 }, { 5269, 0x4814 }, { 5273, 0x80b3 },
+  { 5279, 0x803e }, { 5285, 0xb330 }, { 5292, 0x0102 }, { 5294, 0x731c },
+  /* 0x8900 */
+  { 5302, 0x1494 }, { 5307, 0x600d }, { 5312, 0x0c20 }, { 5315, 0x0940 },
+  { 5318, 0x301a }, { 5323, 0xc040 }, { 5326, 0xa451 }, { 5332, 0xc094 },
+  { 5337, 0x8dca }, { 5345, 0x05c8 }, { 5350, 0x96c2 }, { 5357, 0xa40c },
+  { 5362, 0x0001 }, { 5363, 0x3404 }, { 5367, 0x00c8 }, { 5370, 0x0110 },
+  /* 0x8a00 */
+  { 5372, 0x550d }, { 5379, 0xa9c9 }, { 5387, 0x2428 }, { 5391, 0x1c5a },
+  { 5398, 0x0142 }, { 5401, 0x4837 }, { 5408, 0x7a4d }, { 5417, 0x100f },
+  { 5422, 0x32b4 }, { 5429, 0x452a }, { 5435, 0x317b }, { 5444, 0x9205 },
+  { 5449, 0xb894 }, { 5456, 0x5c44 }, { 5462, 0x68d7 }, { 5471, 0x458a },
+  /* 0x8b00 */
+  { 5477, 0x5097 }, { 5484, 0x2ed1 }, { 5492, 0x1943 }, { 5498, 0x4208 },
+  { 5501, 0xd202 }, { 5506, 0x9d40 }, { 5512, 0x9840 }, { 5516, 0x2097 },
+  { 5522, 0x5409 }, { 5527, 0x064d }, { 5533, 0x0000 }, { 5533, 0x0000 },
+  { 5533, 0x0000 }, { 5533, 0x0000 }, { 5533, 0x0000 }, { 5533, 0x0000 },
+  /* 0x8c00 */
+  { 5533, 0x0000 }, { 5533, 0x0000 }, { 5533, 0x0000 }, { 5533, 0x8480 },
+  { 5536, 0x5542 }, { 5542, 0x0421 }, { 5545, 0x1c06 }, { 5550, 0x1700 },
+  { 5554, 0x7624 }, { 5561, 0x6110 }, { 5565, 0xff87 }, { 5577, 0xb9dd },
+  { 5588, 0x659f }, { 5598, 0x5c0a }, { 5604, 0x245d }, { 5611, 0x3c00 },
+  /* 0x8d00 */
+  { 5615, 0xadb0 }, { 5623, 0x0059 }, { 5627, 0x0000 }, { 5627, 0x0000 },
+  { 5627, 0x0000 }, { 5627, 0x0000 }, { 5627, 0x28d0 }, { 5632, 0x009b },
+  { 5637, 0x0422 }, { 5640, 0x0200 }, { 5641, 0x0108 }, { 5643, 0x4408 },
+  { 5646, 0x9804 }, { 5650, 0xac40 }, { 5655, 0x8d0a }, { 5661, 0x9028 },
+  /* 0x8e00 */
+  { 5665, 0x8700 }, { 5669, 0xe001 }, { 5673, 0x0400 }, { 5674, 0x0031 },
+  { 5677, 0x1794 }, { 5684, 0x8221 }, { 5688, 0x0019 }, { 5691, 0x1054 },
+  { 5695, 0x2cb2 }, { 5702, 0x021a }, { 5706, 0x9c02 }, { 5711, 0x4003 },
+  { 5714, 0x3d60 }, { 5721, 0x8804 }, { 5724, 0x080c }, { 5727, 0x7900 },
+  /* 0x8f00 */
+  { 5732, 0x1628 }, { 5737, 0xba3c }, { 5746, 0x8640 }, { 5750, 0xcb08 },
+  { 5756, 0x7274 }, { 5764, 0x9080 }, { 5767, 0x001e }, { 5771, 0x0000 },
+  { 5771, 0x0000 }, { 5771, 0xd800 }, { 5775, 0xe188 }, { 5781, 0x9c87 },
+  { 5789, 0x4034 }, { 5793, 0x0412 }, { 5796, 0xae64 }, { 5804, 0x2791 },
+  /* 0x9000 */
+  { 5811, 0xe86b }, { 5820, 0xe6fb }, { 5832, 0x408f }, { 5838, 0x5366 },
+  { 5846, 0xeea6 }, { 5856, 0x537f }, { 5867, 0xe32b }, { 5876, 0xb5e4 },
+  { 5885, 0x869f }, { 5894, 0x0002 }, { 5895, 0x8548 }, { 5900, 0x0122 },
+  { 5903, 0x4402 }, { 5906, 0x0800 }, { 5907, 0x2116 }, { 5912, 0x20a0 },
+  /* 0x9100 */
+  { 5915, 0x0004 }, { 5916, 0x0204 }, { 5918, 0x2000 }, { 5919, 0x0005 },
+  { 5921, 0x7e00 }, { 5927, 0x0154 }, { 5931, 0x162c }, { 5937, 0x01ac },
+  { 5942, 0x2a84 }, { 5947, 0x1085 }, { 5951, 0x8c14 }, { 5956, 0x0530 },
+  { 5960, 0xfbc3 }, { 5971, 0xb943 }, { 5979, 0x00ca }, { 5983, 0x9060 },
+  /* 0x9200 */
+  { 5987, 0x6000 }, { 5989, 0x4032 }, { 5993, 0x1200 }, { 5995, 0x8090 },
+  { 5998, 0x0b30 }, { 6003, 0x4c81 }, { 6008, 0x0054 }, { 6011, 0x4002 },
+  { 6013, 0x0029 }, { 6016, 0x1d6a }, { 6024, 0x2000 }, { 6025, 0x0280 },
+  { 6027, 0x8000 }, { 6028, 0x0004 }, { 6029, 0x2610 }, { 6033, 0x150c },
+  /* 0x9300 */
+  { 6038, 0x8040 }, { 6040, 0x0701 }, { 6044, 0xd94d }, { 6053, 0x0c24 },
+  { 6057, 0x2810 }, { 6060, 0x1850 }, { 6064, 0x5001 }, { 6067, 0x5020 },
+  { 6070, 0x1000 }, { 6071, 0x04d0 }, { 6075, 0x7080 }, { 6079, 0x0201 },
+  { 6081, 0x0108 }, { 6083, 0x21c3 }, { 6089, 0x0132 }, { 6093, 0x0000 },
+  /* 0x9400 */
+  { 6093, 0x0088 }, { 6095, 0x0719 }, { 6101, 0x0802 }, { 6103, 0x0560 },
+  { 6107, 0x0012 }, { 6109, 0x4c0e }, { 6115, 0x0405 }, { 6118, 0xf0a1 },
+  { 6125, 0x0002 }, { 6126, 0x0000 }, { 6126, 0x0000 }, { 6126, 0x0000 },
+  { 6126, 0x0000 }, { 6126, 0x0000 }, { 6126, 0x0000 }, { 6126, 0x0000 },
+  /* 0x9500 */
+  { 6126, 0x0000 }, { 6126, 0x0000 }, { 6126, 0x0000 }, { 6126, 0x0000 },
+  { 6126, 0x0000 }, { 6126, 0x0000 }, { 6126, 0x0000 }, { 6126, 0x0080 },
+  { 6127, 0x8e8d }, { 6135, 0x035a }, { 6141, 0x21bd }, { 6149, 0x5a04 },
+  { 6154, 0x3488 }, { 6159, 0x1170 }, { 6164, 0x0026 }, { 6167, 0x0000 },
+  /* 0x9600 */
+  { 6167, 0x0000 }, { 6167, 0x1000 }, { 6168, 0xc502 }, { 6173, 0x8804 },
+  { 6176, 0xb815 }, { 6183, 0xf801 }, { 6189, 0x147c }, { 6196, 0x25ed },
+  { 6205, 0xed60 }, { 6213, 0x1bb0 }, { 6220, 0x0589 }, { 6225, 0x1bd7 },
+  { 6235, 0x7af3 }, { 6246, 0x1a62 }, { 6252, 0x0d0c }, { 6257, 0x0ac5 },
+  /* 0x9700 */
+  { 6263, 0xe5d1 }, { 6272, 0x524a }, { 6278, 0x0490 }, { 6281, 0x6305 },
+  { 6287, 0x0354 }, { 6292, 0x5244 }, { 6297, 0x2b57 }, { 6306, 0x1612 },
+  { 6311, 0xa872 }, { 6318, 0x1101 }, { 6321, 0x2949 }, { 6327, 0x0018 },
+  { 6329, 0x0948 }, { 6333, 0x1008 }, { 6335, 0x6000 }, { 6337, 0x886c },
+  /* 0x9800 */
+  { 6343, 0x916e }, { 6351, 0x058f }, { 6358, 0x3012 }, { 6362, 0x3990 },
+  { 6368, 0xf840 }, { 6374, 0x4930 }, { 6379, 0x8880 }, { 6382, 0x001b },
+  { 6386, 0x0000 }, { 6386, 0x0000 }, { 6386, 0x8500 }, { 6389, 0x0042 },
+  { 6391, 0x0058 }, { 6394, 0x9800 }, { 6397, 0xea04 }, { 6403, 0x7014 },
+  /* 0x9900 */
+  { 6408, 0x1628 }, { 6413, 0x611d }, { 6420, 0x5113 }, { 6426, 0x6000 },
+  { 6428, 0x1a24 }, { 6433, 0x00a7 }, { 6438, 0x0000 }, { 6438, 0x0000 },
+  { 6438, 0x0000 }, { 6438, 0x03c0 }, { 6442, 0x7120 }, { 6447, 0x1018 },
+  { 6450, 0x0172 }, { 6455, 0xa927 }, { 6463, 0x6004 }, { 6466, 0x8906 },
+  /* 0x9a00 */
+  { 6471, 0xc022 }, { 6475, 0x020c }, { 6478, 0x0900 }, { 6480, 0x4081 },
+  { 6483, 0x202d }, { 6488, 0x8ca0 }, { 6493, 0x0e34 }, { 6499, 0x0000 },
+  { 6499, 0x0000 }, { 6499, 0x0000 }, { 6499, 0x2100 }, { 6501, 0x1101 },
+  { 6504, 0x8011 }, { 6507, 0xc11a }, { 6513, 0xec4c }, { 6521, 0x0892 },
+  /* 0x9b00 */
+  { 6525, 0x0040 }, { 6526, 0x8500 }, { 6529, 0xc7ac }, { 6538, 0x1806 },
+  { 6542, 0xe03e }, { 6550, 0x0512 }, { 6554, 0x8000 }, { 6555, 0x0010 },
+  { 6556, 0x4008 }, { 6558, 0x80ce }, { 6564, 0x6d01 }, { 6570, 0x0210 },
+  { 6572, 0x8641 }, { 6577, 0x0856 }, { 6582, 0x011e }, { 6587, 0x0027 },
+  /* 0x9c00 */
+  { 6591, 0x3750 }, { 6598, 0x083d }, { 6604, 0xe032 }, { 6610, 0x4e05 },
+  { 6616, 0x01c0 }, { 6619, 0x0484 }, { 6622, 0x0081 }, { 6624, 0x0140 },
+  { 6626, 0x0000 }, { 6626, 0x0000 }, { 6626, 0x0000 }, { 6626, 0x0000 },
+  { 6626, 0x0000 }, { 6626, 0x0000 }, { 6626, 0x1aa0 }, { 6631, 0x0059 },
+  /* 0x9d00 */
+  { 6635, 0x43c8 }, { 6641, 0x8824 }, { 6645, 0x1d48 }, { 6651, 0xc800 },
+  { 6654, 0x0152 }, { 6658, 0x7203 }, { 6664, 0x9013 }, { 6669, 0x0404 },
+  { 6671, 0x8280 }, { 6674, 0x0400 }, { 6675, 0x8a10 }, { 6679, 0x0d14 },
+  { 6684, 0x8056 }, { 6689, 0x0208 }, { 6691, 0xa040 }, { 6694, 0x2704 },
+  /* 0x9e00 */
+  { 6699, 0x0000 }, { 6699, 0x4c00 }, { 6702, 0x0000 }, { 6702, 0x0000 },
+  { 6702, 0x0000 }, { 6702, 0x0000 }, { 6702, 0x0000 }, { 6702, 0xa320 },
+  { 6707, 0x1902 }, { 6711, 0xa0ae }, { 6718, 0x2660 }, { 6723, 0xdf00 },
+  { 6730, 0xf010 }, { 6735, 0x7b15 }, { 6744, 0x8121 }, { 6748, 0x3ad0 },
+  /* 0x9f00 */
+  { 6755, 0x4180 }, { 6758, 0x0028 }, { 6760, 0x1003 }, { 6763, 0x4800 },
+  { 6765, 0xcc00 }, { 6769, 0x8014 }, { 6772, 0x14cf }, { 6780, 0x00c4 },
+  { 6783, 0x2000 }, { 6784, 0x3020 }, { 6787, 0x0001 },
+};
+static const Summary16 jisx0208_uni2indx_pageff[15] = {
+  /* 0xff00 */
+  { 6788, 0xdf7a }, { 6800, 0xffff }, { 6816, 0xffff }, { 6832, 0xefff },
+  { 6847, 0xffff }, { 6863, 0x3fff }, { 6877, 0x0000 }, { 6877, 0x0000 },
+  { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0000 },
+  { 6877, 0x0000 }, { 6877, 0x0000 }, { 6877, 0x0028 },
+};
+
+static int
+jisx0208_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  if (n >= 2) {
+    const Summary16 *summary = NULL;
+    if (wc < 0x0100)
+      summary = &jisx0208_uni2indx_page00[(wc>>4)];
+    else if (wc >= 0x0300 && wc < 0x0460)
+      summary = &jisx0208_uni2indx_page03[(wc>>4)-0x030];
+    else if (wc >= 0x2000 && wc < 0x2320)
+      summary = &jisx0208_uni2indx_page20[(wc>>4)-0x200];
+    else if (wc >= 0x2500 && wc < 0x2670)
+      summary = &jisx0208_uni2indx_page25[(wc>>4)-0x250];
+    else if (wc >= 0x3000 && wc < 0x3100)
+      summary = &jisx0208_uni2indx_page30[(wc>>4)-0x300];
+    else if (wc >= 0x4e00 && wc < 0x9fb0)
+      summary = &jisx0208_uni2indx_page4e[(wc>>4)-0x4e0];
+    else if (wc >= 0xff00 && wc < 0xfff0)
+      summary = &jisx0208_uni2indx_pageff[(wc>>4)-0xff0];
+    if (summary) {
+      unsigned short used = summary->used;
+      unsigned int i = wc & 0x0f;
+      if (used & ((unsigned short) 1 << i)) {
+        unsigned short c;
+        /* Keep in `used' only the bits 0..i-1. */
+        used &= ((unsigned short) 1 << i) - 1;
+        /* Add `summary->indx' and the number of bits set in `used'. */
+        used = (used & 0x5555) + ((used & 0xaaaa) >> 1);
+        used = (used & 0x3333) + ((used & 0xcccc) >> 2);
+        used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4);
+        used = (used & 0x00ff) + (used >> 8);
+        c = jisx0208_2charset[summary->indx + used];
+        r[0] = (c >> 8); r[1] = (c & 0xff);
+        return 2;
+      }
+    }
+    return RET_ILSEQ;
+  }
+  return RET_TOOSMALL;
+}
diff --git a/src/xlibi18n/lcUniConv/jisx0212.h b/src/xlibi18n/lcUniConv/jisx0212.h
new file mode 100644 (file)
index 0000000..05cca52
--- /dev/null
@@ -0,0 +1,2163 @@
+
+/*
+ * JISX0212.1990-0
+ */
+
+static const unsigned short jisx0212_2uni_page22[81] = {
+  /* 0x22 */
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x02d8, 0x02c7,
+  0x00b8, 0x02d9, 0x02dd, 0x00af, 0x02db, 0x02da, 0x007e, 0x0384,
+  0x0385, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0x00a1, 0x00a6, 0x00bf, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0x00ba, 0x00aa, 0x00a9, 0x00ae, 0x2122, 0x00a4,
+  0x2116,
+};
+static const unsigned short jisx0212_2uni_page26[188] = {
+  /* 0x26 */
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0x0386, 0x0388, 0x0389, 0x038a, 0x03aa, 0xfffd, 0x038c, 0xfffd,
+  0x038e, 0x03ab, 0xfffd, 0x038f, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0x03ac, 0x03ad, 0x03ae, 0x03af, 0x03ca, 0x0390, 0x03cc, 0x03c2,
+  0x03cd, 0x03cb, 0x03b0, 0x03ce, 0xfffd, 0xfffd,
+  /* 0x27 */
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408,
+  0x0409, 0x040a, 0x040b, 0x040c, 0x040e, 0x040f, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458,
+  0x0459, 0x045a, 0x045b, 0x045c, 0x045e, 0x045f,
+};
+static const unsigned short jisx0212_2uni_page29[275] = {
+  /* 0x29 */
+  0x00c6, 0x0110, 0xfffd, 0x0126, 0xfffd, 0x0132, 0xfffd, 0x0141,
+  0x013f, 0xfffd, 0x014a, 0x00d8, 0x0152, 0xfffd, 0x0166, 0x00de,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0x00e6, 0x0111, 0x00f0, 0x0127, 0x0131, 0x0133, 0x0138, 0x0142,
+  0x0140, 0x0149, 0x014b, 0x00f8, 0x0153, 0x00df, 0x0167, 0x00fe,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0x2a */
+  0x00c1, 0x00c0, 0x00c4, 0x00c2, 0x0102, 0x01cd, 0x0100, 0x0104,
+  0x00c5, 0x00c3, 0x0106, 0x0108, 0x010c, 0x00c7, 0x010a, 0x010e,
+  0x00c9, 0x00c8, 0x00cb, 0x00ca, 0x011a, 0x0116, 0x0112, 0x0118,
+  0xfffd, 0x011c, 0x011e, 0x0122, 0x0120, 0x0124, 0x00cd, 0x00cc,
+  0x00cf, 0x00ce, 0x01cf, 0x0130, 0x012a, 0x012e, 0x0128, 0x0134,
+  0x0136, 0x0139, 0x013d, 0x013b, 0x0143, 0x0147, 0x0145, 0x00d1,
+  0x00d3, 0x00d2, 0x00d6, 0x00d4, 0x01d1, 0x0150, 0x014c, 0x00d5,
+  0x0154, 0x0158, 0x0156, 0x015a, 0x015c, 0x0160, 0x015e, 0x0164,
+  0x0162, 0x00da, 0x00d9, 0x00dc, 0x00db, 0x016c, 0x01d3, 0x0170,
+  0x016a, 0x0172, 0x016e, 0x0168, 0x01d7, 0x01db, 0x01d9, 0x01d5,
+  0x0174, 0x00dd, 0x0178, 0x0176, 0x0179, 0x017d, 0x017b, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0x2b */
+  0x00e1, 0x00e0, 0x00e4, 0x00e2, 0x0103, 0x01ce, 0x0101, 0x0105,
+  0x00e5, 0x00e3, 0x0107, 0x0109, 0x010d, 0x00e7, 0x010b, 0x010f,
+  0x00e9, 0x00e8, 0x00eb, 0x00ea, 0x011b, 0x0117, 0x0113, 0x0119,
+  0x01f5, 0x011d, 0x011f, 0xfffd, 0x0121, 0x0125, 0x00ed, 0x00ec,
+  0x00ef, 0x00ee, 0x01d0, 0xfffd, 0x012b, 0x012f, 0x0129, 0x0135,
+  0x0137, 0x013a, 0x013e, 0x013c, 0x0144, 0x0148, 0x0146, 0x00f1,
+  0x00f3, 0x00f2, 0x00f6, 0x00f4, 0x01d2, 0x0151, 0x014d, 0x00f5,
+  0x0155, 0x0159, 0x0157, 0x015b, 0x015d, 0x0161, 0x015f, 0x0165,
+  0x0163, 0x00fa, 0x00f9, 0x00fc, 0x00fb, 0x016d, 0x01d4, 0x0171,
+  0x016b, 0x0173, 0x016f, 0x0169, 0x01d8, 0x01dc, 0x01da, 0x01d6,
+  0x0175, 0x00fd, 0x00ff, 0x0177, 0x017a, 0x017e, 0x017c,
+};
+static const unsigned short jisx0212_2uni_page30[5801] = {
+  /* 0x30 */
+  0x4e02, 0x4e04, 0x4e05, 0x4e0c, 0x4e12, 0x4e1f, 0x4e23, 0x4e24,
+  0x4e28, 0x4e2b, 0x4e2e, 0x4e2f, 0x4e30, 0x4e35, 0x4e40, 0x4e41,
+  0x4e44, 0x4e47, 0x4e51, 0x4e5a, 0x4e5c, 0x4e63, 0x4e68, 0x4e69,
+  0x4e74, 0x4e75, 0x4e79, 0x4e7f, 0x4e8d, 0x4e96, 0x4e97, 0x4e9d,
+  0x4eaf, 0x4eb9, 0x4ec3, 0x4ed0, 0x4eda, 0x4edb, 0x4ee0, 0x4ee1,
+  0x4ee2, 0x4ee8, 0x4eef, 0x4ef1, 0x4ef3, 0x4ef5, 0x4efd, 0x4efe,
+  0x4eff, 0x4f00, 0x4f02, 0x4f03, 0x4f08, 0x4f0b, 0x4f0c, 0x4f12,
+  0x4f15, 0x4f16, 0x4f17, 0x4f19, 0x4f2e, 0x4f31, 0x4f60, 0x4f33,
+  0x4f35, 0x4f37, 0x4f39, 0x4f3b, 0x4f3e, 0x4f40, 0x4f42, 0x4f48,
+  0x4f49, 0x4f4b, 0x4f4c, 0x4f52, 0x4f54, 0x4f56, 0x4f58, 0x4f5f,
+  0x4f63, 0x4f6a, 0x4f6c, 0x4f6e, 0x4f71, 0x4f77, 0x4f78, 0x4f79,
+  0x4f7a, 0x4f7d, 0x4f7e, 0x4f81, 0x4f82, 0x4f84,
+  /* 0x31 */
+  0x4f85, 0x4f89, 0x4f8a, 0x4f8c, 0x4f8e, 0x4f90, 0x4f92, 0x4f93,
+  0x4f94, 0x4f97, 0x4f99, 0x4f9a, 0x4f9e, 0x4f9f, 0x4fb2, 0x4fb7,
+  0x4fb9, 0x4fbb, 0x4fbc, 0x4fbd, 0x4fbe, 0x4fc0, 0x4fc1, 0x4fc5,
+  0x4fc6, 0x4fc8, 0x4fc9, 0x4fcb, 0x4fcc, 0x4fcd, 0x4fcf, 0x4fd2,
+  0x4fdc, 0x4fe0, 0x4fe2, 0x4ff0, 0x4ff2, 0x4ffc, 0x4ffd, 0x4fff,
+  0x5000, 0x5001, 0x5004, 0x5007, 0x500a, 0x500c, 0x500e, 0x5010,
+  0x5013, 0x5017, 0x5018, 0x501b, 0x501c, 0x501d, 0x501e, 0x5022,
+  0x5027, 0x502e, 0x5030, 0x5032, 0x5033, 0x5035, 0x5040, 0x5041,
+  0x5042, 0x5045, 0x5046, 0x504a, 0x504c, 0x504e, 0x5051, 0x5052,
+  0x5053, 0x5057, 0x5059, 0x505f, 0x5060, 0x5062, 0x5063, 0x5066,
+  0x5067, 0x506a, 0x506d, 0x5070, 0x5071, 0x503b, 0x5081, 0x5083,
+  0x5084, 0x5086, 0x508a, 0x508e, 0x508f, 0x5090,
+  /* 0x32 */
+  0x5092, 0x5093, 0x5094, 0x5096, 0x509b, 0x509c, 0x509e, 0x509f,
+  0x50a0, 0x50a1, 0x50a2, 0x50aa, 0x50af, 0x50b0, 0x50b9, 0x50ba,
+  0x50bd, 0x50c0, 0x50c3, 0x50c4, 0x50c7, 0x50cc, 0x50ce, 0x50d0,
+  0x50d3, 0x50d4, 0x50d8, 0x50dc, 0x50dd, 0x50df, 0x50e2, 0x50e4,
+  0x50e6, 0x50e8, 0x50e9, 0x50ef, 0x50f1, 0x50f6, 0x50fa, 0x50fe,
+  0x5103, 0x5106, 0x5107, 0x5108, 0x510b, 0x510c, 0x510d, 0x510e,
+  0x50f2, 0x5110, 0x5117, 0x5119, 0x511b, 0x511c, 0x511d, 0x511e,
+  0x5123, 0x5127, 0x5128, 0x512c, 0x512d, 0x512f, 0x5131, 0x5133,
+  0x5134, 0x5135, 0x5138, 0x5139, 0x5142, 0x514a, 0x514f, 0x5153,
+  0x5155, 0x5157, 0x5158, 0x515f, 0x5164, 0x5166, 0x517e, 0x5183,
+  0x5184, 0x518b, 0x518e, 0x5198, 0x519d, 0x51a1, 0x51a3, 0x51ad,
+  0x51b8, 0x51ba, 0x51bc, 0x51be, 0x51bf, 0x51c2,
+  /* 0x33 */
+  0x51c8, 0x51cf, 0x51d1, 0x51d2, 0x51d3, 0x51d5, 0x51d8, 0x51de,
+  0x51e2, 0x51e5, 0x51ee, 0x51f2, 0x51f3, 0x51f4, 0x51f7, 0x5201,
+  0x5202, 0x5205, 0x5212, 0x5213, 0x5215, 0x5216, 0x5218, 0x5222,
+  0x5228, 0x5231, 0x5232, 0x5235, 0x523c, 0x5245, 0x5249, 0x5255,
+  0x5257, 0x5258, 0x525a, 0x525c, 0x525f, 0x5260, 0x5261, 0x5266,
+  0x526e, 0x5277, 0x5278, 0x5279, 0x5280, 0x5282, 0x5285, 0x528a,
+  0x528c, 0x5293, 0x5295, 0x5296, 0x5297, 0x5298, 0x529a, 0x529c,
+  0x52a4, 0x52a5, 0x52a6, 0x52a7, 0x52af, 0x52b0, 0x52b6, 0x52b7,
+  0x52b8, 0x52ba, 0x52bb, 0x52bd, 0x52c0, 0x52c4, 0x52c6, 0x52c8,
+  0x52cc, 0x52cf, 0x52d1, 0x52d4, 0x52d6, 0x52db, 0x52dc, 0x52e1,
+  0x52e5, 0x52e8, 0x52e9, 0x52ea, 0x52ec, 0x52f0, 0x52f1, 0x52f4,
+  0x52f6, 0x52f7, 0x5300, 0x5303, 0x530a, 0x530b,
+  /* 0x34 */
+  0x530c, 0x5311, 0x5313, 0x5318, 0x531b, 0x531c, 0x531e, 0x531f,
+  0x5325, 0x5327, 0x5328, 0x5329, 0x532b, 0x532c, 0x532d, 0x5330,
+  0x5332, 0x5335, 0x533c, 0x533d, 0x533e, 0x5342, 0x534c, 0x534b,
+  0x5359, 0x535b, 0x5361, 0x5363, 0x5365, 0x536c, 0x536d, 0x5372,
+  0x5379, 0x537e, 0x5383, 0x5387, 0x5388, 0x538e, 0x5393, 0x5394,
+  0x5399, 0x539d, 0x53a1, 0x53a4, 0x53aa, 0x53ab, 0x53af, 0x53b2,
+  0x53b4, 0x53b5, 0x53b7, 0x53b8, 0x53ba, 0x53bd, 0x53c0, 0x53c5,
+  0x53cf, 0x53d2, 0x53d3, 0x53d5, 0x53da, 0x53dd, 0x53de, 0x53e0,
+  0x53e6, 0x53e7, 0x53f5, 0x5402, 0x5413, 0x541a, 0x5421, 0x5427,
+  0x5428, 0x542a, 0x542f, 0x5431, 0x5434, 0x5435, 0x5443, 0x5444,
+  0x5447, 0x544d, 0x544f, 0x545e, 0x5462, 0x5464, 0x5466, 0x5467,
+  0x5469, 0x546b, 0x546d, 0x546e, 0x5474, 0x547f,
+  /* 0x35 */
+  0x5481, 0x5483, 0x5485, 0x5488, 0x5489, 0x548d, 0x5491, 0x5495,
+  0x5496, 0x549c, 0x549f, 0x54a1, 0x54a6, 0x54a7, 0x54a9, 0x54aa,
+  0x54ad, 0x54ae, 0x54b1, 0x54b7, 0x54b9, 0x54ba, 0x54bb, 0x54bf,
+  0x54c6, 0x54ca, 0x54cd, 0x54ce, 0x54e0, 0x54ea, 0x54ec, 0x54ef,
+  0x54f6, 0x54fc, 0x54fe, 0x54ff, 0x5500, 0x5501, 0x5505, 0x5508,
+  0x5509, 0x550c, 0x550d, 0x550e, 0x5515, 0x552a, 0x552b, 0x5532,
+  0x5535, 0x5536, 0x553b, 0x553c, 0x553d, 0x5541, 0x5547, 0x5549,
+  0x554a, 0x554d, 0x5550, 0x5551, 0x5558, 0x555a, 0x555b, 0x555e,
+  0x5560, 0x5561, 0x5564, 0x5566, 0x557f, 0x5581, 0x5582, 0x5586,
+  0x5588, 0x558e, 0x558f, 0x5591, 0x5592, 0x5593, 0x5594, 0x5597,
+  0x55a3, 0x55a4, 0x55ad, 0x55b2, 0x55bf, 0x55c1, 0x55c3, 0x55c6,
+  0x55c9, 0x55cb, 0x55cc, 0x55ce, 0x55d1, 0x55d2,
+  /* 0x36 */
+  0x55d3, 0x55d7, 0x55d8, 0x55db, 0x55de, 0x55e2, 0x55e9, 0x55f6,
+  0x55ff, 0x5605, 0x5608, 0x560a, 0x560d, 0x560e, 0x560f, 0x5610,
+  0x5611, 0x5612, 0x5619, 0x562c, 0x5630, 0x5633, 0x5635, 0x5637,
+  0x5639, 0x563b, 0x563c, 0x563d, 0x563f, 0x5640, 0x5641, 0x5643,
+  0x5644, 0x5646, 0x5649, 0x564b, 0x564d, 0x564f, 0x5654, 0x565e,
+  0x5660, 0x5661, 0x5662, 0x5663, 0x5666, 0x5669, 0x566d, 0x566f,
+  0x5671, 0x5672, 0x5675, 0x5684, 0x5685, 0x5688, 0x568b, 0x568c,
+  0x5695, 0x5699, 0x569a, 0x569d, 0x569e, 0x569f, 0x56a6, 0x56a7,
+  0x56a8, 0x56a9, 0x56ab, 0x56ac, 0x56ad, 0x56b1, 0x56b3, 0x56b7,
+  0x56be, 0x56c5, 0x56c9, 0x56ca, 0x56cb, 0x56cf, 0x56d0, 0x56cc,
+  0x56cd, 0x56d9, 0x56dc, 0x56dd, 0x56df, 0x56e1, 0x56e4, 0x56e5,
+  0x56e6, 0x56e7, 0x56e8, 0x56f1, 0x56eb, 0x56ed,
+  /* 0x37 */
+  0x56f6, 0x56f7, 0x5701, 0x5702, 0x5707, 0x570a, 0x570c, 0x5711,
+  0x5715, 0x571a, 0x571b, 0x571d, 0x5720, 0x5722, 0x5723, 0x5724,
+  0x5725, 0x5729, 0x572a, 0x572c, 0x572e, 0x572f, 0x5733, 0x5734,
+  0x573d, 0x573e, 0x573f, 0x5745, 0x5746, 0x574c, 0x574d, 0x5752,
+  0x5762, 0x5765, 0x5767, 0x5768, 0x576b, 0x576d, 0x576e, 0x576f,
+  0x5770, 0x5771, 0x5773, 0x5774, 0x5775, 0x5777, 0x5779, 0x577a,
+  0x577b, 0x577c, 0x577e, 0x5781, 0x5783, 0x578c, 0x5794, 0x5797,
+  0x5799, 0x579a, 0x579c, 0x579d, 0x579e, 0x579f, 0x57a1, 0x5795,
+  0x57a7, 0x57a8, 0x57a9, 0x57ac, 0x57b8, 0x57bd, 0x57c7, 0x57c8,
+  0x57cc, 0x57cf, 0x57d5, 0x57dd, 0x57de, 0x57e4, 0x57e6, 0x57e7,
+  0x57e9, 0x57ed, 0x57f0, 0x57f5, 0x57f6, 0x57f8, 0x57fd, 0x57fe,
+  0x57ff, 0x5803, 0x5804, 0x5808, 0x5809, 0x57e1,
+  /* 0x38 */
+  0x580c, 0x580d, 0x581b, 0x581e, 0x581f, 0x5820, 0x5826, 0x5827,
+  0x582d, 0x5832, 0x5839, 0x583f, 0x5849, 0x584c, 0x584d, 0x584f,
+  0x5850, 0x5855, 0x585f, 0x5861, 0x5864, 0x5867, 0x5868, 0x5878,
+  0x587c, 0x587f, 0x5880, 0x5881, 0x5887, 0x5888, 0x5889, 0x588a,
+  0x588c, 0x588d, 0x588f, 0x5890, 0x5894, 0x5896, 0x589d, 0x58a0,
+  0x58a1, 0x58a2, 0x58a6, 0x58a9, 0x58b1, 0x58b2, 0x58c4, 0x58bc,
+  0x58c2, 0x58c8, 0x58cd, 0x58ce, 0x58d0, 0x58d2, 0x58d4, 0x58d6,
+  0x58da, 0x58dd, 0x58e1, 0x58e2, 0x58e9, 0x58f3, 0x5905, 0x5906,
+  0x590b, 0x590c, 0x5912, 0x5913, 0x5914, 0x8641, 0x591d, 0x5921,
+  0x5923, 0x5924, 0x5928, 0x592f, 0x5930, 0x5933, 0x5935, 0x5936,
+  0x593f, 0x5943, 0x5946, 0x5952, 0x5953, 0x5959, 0x595b, 0x595d,
+  0x595e, 0x595f, 0x5961, 0x5963, 0x596b, 0x596d,
+  /* 0x39 */
+  0x596f, 0x5972, 0x5975, 0x5976, 0x5979, 0x597b, 0x597c, 0x598b,
+  0x598c, 0x598e, 0x5992, 0x5995, 0x5997, 0x599f, 0x59a4, 0x59a7,
+  0x59ad, 0x59ae, 0x59af, 0x59b0, 0x59b3, 0x59b7, 0x59ba, 0x59bc,
+  0x59c1, 0x59c3, 0x59c4, 0x59c8, 0x59ca, 0x59cd, 0x59d2, 0x59dd,
+  0x59de, 0x59df, 0x59e3, 0x59e4, 0x59e7, 0x59ee, 0x59ef, 0x59f1,
+  0x59f2, 0x59f4, 0x59f7, 0x5a00, 0x5a04, 0x5a0c, 0x5a0d, 0x5a0e,
+  0x5a12, 0x5a13, 0x5a1e, 0x5a23, 0x5a24, 0x5a27, 0x5a28, 0x5a2a,
+  0x5a2d, 0x5a30, 0x5a44, 0x5a45, 0x5a47, 0x5a48, 0x5a4c, 0x5a50,
+  0x5a55, 0x5a5e, 0x5a63, 0x5a65, 0x5a67, 0x5a6d, 0x5a77, 0x5a7a,
+  0x5a7b, 0x5a7e, 0x5a8b, 0x5a90, 0x5a93, 0x5a96, 0x5a99, 0x5a9c,
+  0x5a9e, 0x5a9f, 0x5aa0, 0x5aa2, 0x5aa7, 0x5aac, 0x5ab1, 0x5ab2,
+  0x5ab3, 0x5ab5, 0x5ab8, 0x5aba, 0x5abb, 0x5abf,
+  /* 0x3a */
+  0x5ac4, 0x5ac6, 0x5ac8, 0x5acf, 0x5ada, 0x5adc, 0x5ae0, 0x5ae5,
+  0x5aea, 0x5aee, 0x5af5, 0x5af6, 0x5afd, 0x5b00, 0x5b01, 0x5b08,
+  0x5b17, 0x5b34, 0x5b19, 0x5b1b, 0x5b1d, 0x5b21, 0x5b25, 0x5b2d,
+  0x5b38, 0x5b41, 0x5b4b, 0x5b4c, 0x5b52, 0x5b56, 0x5b5e, 0x5b68,
+  0x5b6e, 0x5b6f, 0x5b7c, 0x5b7d, 0x5b7e, 0x5b7f, 0x5b81, 0x5b84,
+  0x5b86, 0x5b8a, 0x5b8e, 0x5b90, 0x5b91, 0x5b93, 0x5b94, 0x5b96,
+  0x5ba8, 0x5ba9, 0x5bac, 0x5bad, 0x5baf, 0x5bb1, 0x5bb2, 0x5bb7,
+  0x5bba, 0x5bbc, 0x5bc0, 0x5bc1, 0x5bcd, 0x5bcf, 0x5bd6, 0x5bd7,
+  0x5bd8, 0x5bd9, 0x5bda, 0x5be0, 0x5bef, 0x5bf1, 0x5bf4, 0x5bfd,
+  0x5c0c, 0x5c17, 0x5c1e, 0x5c1f, 0x5c23, 0x5c26, 0x5c29, 0x5c2b,
+  0x5c2c, 0x5c2e, 0x5c30, 0x5c32, 0x5c35, 0x5c36, 0x5c59, 0x5c5a,
+  0x5c5c, 0x5c62, 0x5c63, 0x5c67, 0x5c68, 0x5c69,
+  /* 0x3b */
+  0x5c6d, 0x5c70, 0x5c74, 0x5c75, 0x5c7a, 0x5c7b, 0x5c7c, 0x5c7d,
+  0x5c87, 0x5c88, 0x5c8a, 0x5c8f, 0x5c92, 0x5c9d, 0x5c9f, 0x5ca0,
+  0x5ca2, 0x5ca3, 0x5ca6, 0x5caa, 0x5cb2, 0x5cb4, 0x5cb5, 0x5cba,
+  0x5cc9, 0x5ccb, 0x5cd2, 0x5cdd, 0x5cd7, 0x5cee, 0x5cf1, 0x5cf2,
+  0x5cf4, 0x5d01, 0x5d06, 0x5d0d, 0x5d12, 0x5d2b, 0x5d23, 0x5d24,
+  0x5d26, 0x5d27, 0x5d31, 0x5d34, 0x5d39, 0x5d3d, 0x5d3f, 0x5d42,
+  0x5d43, 0x5d46, 0x5d48, 0x5d55, 0x5d51, 0x5d59, 0x5d4a, 0x5d5f,
+  0x5d60, 0x5d61, 0x5d62, 0x5d64, 0x5d6a, 0x5d6d, 0x5d70, 0x5d79,
+  0x5d7a, 0x5d7e, 0x5d7f, 0x5d81, 0x5d83, 0x5d88, 0x5d8a, 0x5d92,
+  0x5d93, 0x5d94, 0x5d95, 0x5d99, 0x5d9b, 0x5d9f, 0x5da0, 0x5da7,
+  0x5dab, 0x5db0, 0x5db4, 0x5db8, 0x5db9, 0x5dc3, 0x5dc7, 0x5dcb,
+  0x5dd0, 0x5dce, 0x5dd8, 0x5dd9, 0x5de0, 0x5de4,
+  /* 0x3c */
+  0x5de9, 0x5df8, 0x5df9, 0x5e00, 0x5e07, 0x5e0d, 0x5e12, 0x5e14,
+  0x5e15, 0x5e18, 0x5e1f, 0x5e20, 0x5e2e, 0x5e28, 0x5e32, 0x5e35,
+  0x5e3e, 0x5e4b, 0x5e50, 0x5e49, 0x5e51, 0x5e56, 0x5e58, 0x5e5b,
+  0x5e5c, 0x5e5e, 0x5e68, 0x5e6a, 0x5e6b, 0x5e6c, 0x5e6d, 0x5e6e,
+  0x5e70, 0x5e80, 0x5e8b, 0x5e8e, 0x5ea2, 0x5ea4, 0x5ea5, 0x5ea8,
+  0x5eaa, 0x5eac, 0x5eb1, 0x5eb3, 0x5ebd, 0x5ebe, 0x5ebf, 0x5ec6,
+  0x5ecc, 0x5ecb, 0x5ece, 0x5ed1, 0x5ed2, 0x5ed4, 0x5ed5, 0x5edc,
+  0x5ede, 0x5ee5, 0x5eeb, 0x5f02, 0x5f06, 0x5f07, 0x5f08, 0x5f0e,
+  0x5f19, 0x5f1c, 0x5f1d, 0x5f21, 0x5f22, 0x5f23, 0x5f24, 0x5f28,
+  0x5f2b, 0x5f2c, 0x5f2e, 0x5f30, 0x5f34, 0x5f36, 0x5f3b, 0x5f3d,
+  0x5f3f, 0x5f40, 0x5f44, 0x5f45, 0x5f47, 0x5f4d, 0x5f50, 0x5f54,
+  0x5f58, 0x5f5b, 0x5f60, 0x5f63, 0x5f64, 0x5f67,
+  /* 0x3d */
+  0x5f6f, 0x5f72, 0x5f74, 0x5f75, 0x5f78, 0x5f7a, 0x5f7d, 0x5f7e,
+  0x5f89, 0x5f8d, 0x5f8f, 0x5f96, 0x5f9c, 0x5f9d, 0x5fa2, 0x5fa7,
+  0x5fab, 0x5fa4, 0x5fac, 0x5faf, 0x5fb0, 0x5fb1, 0x5fb8, 0x5fc4,
+  0x5fc7, 0x5fc8, 0x5fc9, 0x5fcb, 0x5fd0, 0x5fd1, 0x5fd2, 0x5fd3,
+  0x5fd4, 0x5fde, 0x5fe1, 0x5fe2, 0x5fe8, 0x5fe9, 0x5fea, 0x5fec,
+  0x5fed, 0x5fee, 0x5fef, 0x5ff2, 0x5ff3, 0x5ff6, 0x5ffa, 0x5ffc,
+  0x6007, 0x600a, 0x600d, 0x6013, 0x6014, 0x6017, 0x6018, 0x601a,
+  0x601f, 0x6024, 0x602d, 0x6033, 0x6035, 0x6040, 0x6047, 0x6048,
+  0x6049, 0x604c, 0x6051, 0x6054, 0x6056, 0x6057, 0x605d, 0x6061,
+  0x6067, 0x6071, 0x607e, 0x607f, 0x6082, 0x6086, 0x6088, 0x608a,
+  0x608e, 0x6091, 0x6093, 0x6095, 0x6098, 0x609d, 0x609e, 0x60a2,
+  0x60a4, 0x60a5, 0x60a8, 0x60b0, 0x60b1, 0x60b7,
+  /* 0x3e */
+  0x60bb, 0x60be, 0x60c2, 0x60c4, 0x60c8, 0x60c9, 0x60ca, 0x60cb,
+  0x60ce, 0x60cf, 0x60d4, 0x60d5, 0x60d9, 0x60db, 0x60dd, 0x60de,
+  0x60e2, 0x60e5, 0x60f2, 0x60f5, 0x60f8, 0x60fc, 0x60fd, 0x6102,
+  0x6107, 0x610a, 0x610c, 0x6110, 0x6111, 0x6112, 0x6113, 0x6114,
+  0x6116, 0x6117, 0x6119, 0x611c, 0x611e, 0x6122, 0x612a, 0x612b,
+  0x6130, 0x6131, 0x6135, 0x6136, 0x6137, 0x6139, 0x6141, 0x6145,
+  0x6146, 0x6149, 0x615e, 0x6160, 0x616c, 0x6172, 0x6178, 0x617b,
+  0x617c, 0x617f, 0x6180, 0x6181, 0x6183, 0x6184, 0x618b, 0x618d,
+  0x6192, 0x6193, 0x6197, 0x6198, 0x619c, 0x619d, 0x619f, 0x61a0,
+  0x61a5, 0x61a8, 0x61aa, 0x61ad, 0x61b8, 0x61b9, 0x61bc, 0x61c0,
+  0x61c1, 0x61c2, 0x61ce, 0x61cf, 0x61d5, 0x61dc, 0x61dd, 0x61de,
+  0x61df, 0x61e1, 0x61e2, 0x61e7, 0x61e9, 0x61e5,
+  /* 0x3f */
+  0x61ec, 0x61ed, 0x61ef, 0x6201, 0x6203, 0x6204, 0x6207, 0x6213,
+  0x6215, 0x621c, 0x6220, 0x6222, 0x6223, 0x6227, 0x6229, 0x622b,
+  0x6239, 0x623d, 0x6242, 0x6243, 0x6244, 0x6246, 0x624c, 0x6250,
+  0x6251, 0x6252, 0x6254, 0x6256, 0x625a, 0x625c, 0x6264, 0x626d,
+  0x626f, 0x6273, 0x627a, 0x627d, 0x628d, 0x628e, 0x628f, 0x6290,
+  0x62a6, 0x62a8, 0x62b3, 0x62b6, 0x62b7, 0x62ba, 0x62be, 0x62bf,
+  0x62c4, 0x62ce, 0x62d5, 0x62d6, 0x62da, 0x62ea, 0x62f2, 0x62f4,
+  0x62fc, 0x62fd, 0x6303, 0x6304, 0x630a, 0x630b, 0x630d, 0x6310,
+  0x6313, 0x6316, 0x6318, 0x6329, 0x632a, 0x632d, 0x6335, 0x6336,
+  0x6339, 0x633c, 0x6341, 0x6342, 0x6343, 0x6344, 0x6346, 0x634a,
+  0x634b, 0x634e, 0x6352, 0x6353, 0x6354, 0x6358, 0x635b, 0x6365,
+  0x6366, 0x636c, 0x636d, 0x6371, 0x6374, 0x6375,
+  /* 0x40 */
+  0x6378, 0x637c, 0x637d, 0x637f, 0x6382, 0x6384, 0x6387, 0x638a,
+  0x6390, 0x6394, 0x6395, 0x6399, 0x639a, 0x639e, 0x63a4, 0x63a6,
+  0x63ad, 0x63ae, 0x63af, 0x63bd, 0x63c1, 0x63c5, 0x63c8, 0x63ce,
+  0x63d1, 0x63d3, 0x63d4, 0x63d5, 0x63dc, 0x63e0, 0x63e5, 0x63ea,
+  0x63ec, 0x63f2, 0x63f3, 0x63f5, 0x63f8, 0x63f9, 0x6409, 0x640a,
+  0x6410, 0x6412, 0x6414, 0x6418, 0x641e, 0x6420, 0x6422, 0x6424,
+  0x6425, 0x6429, 0x642a, 0x642f, 0x6430, 0x6435, 0x643d, 0x643f,
+  0x644b, 0x644f, 0x6451, 0x6452, 0x6453, 0x6454, 0x645a, 0x645b,
+  0x645c, 0x645d, 0x645f, 0x6460, 0x6461, 0x6463, 0x646d, 0x6473,
+  0x6474, 0x647b, 0x647d, 0x6485, 0x6487, 0x648f, 0x6490, 0x6491,
+  0x6498, 0x6499, 0x649b, 0x649d, 0x649f, 0x64a1, 0x64a3, 0x64a6,
+  0x64a8, 0x64ac, 0x64b3, 0x64bd, 0x64be, 0x64bf,
+  /* 0x41 */
+  0x64c4, 0x64c9, 0x64ca, 0x64cb, 0x64cc, 0x64ce, 0x64d0, 0x64d1,
+  0x64d5, 0x64d7, 0x64e4, 0x64e5, 0x64e9, 0x64ea, 0x64ed, 0x64f0,
+  0x64f5, 0x64f7, 0x64fb, 0x64ff, 0x6501, 0x6504, 0x6508, 0x6509,
+  0x650a, 0x650f, 0x6513, 0x6514, 0x6516, 0x6519, 0x651b, 0x651e,
+  0x651f, 0x6522, 0x6526, 0x6529, 0x652e, 0x6531, 0x653a, 0x653c,
+  0x653d, 0x6543, 0x6547, 0x6549, 0x6550, 0x6552, 0x6554, 0x655f,
+  0x6560, 0x6567, 0x656b, 0x657a, 0x657d, 0x6581, 0x6585, 0x658a,
+  0x6592, 0x6595, 0x6598, 0x659d, 0x65a0, 0x65a3, 0x65a6, 0x65ae,
+  0x65b2, 0x65b3, 0x65b4, 0x65bf, 0x65c2, 0x65c8, 0x65c9, 0x65ce,
+  0x65d0, 0x65d4, 0x65d6, 0x65d8, 0x65df, 0x65f0, 0x65f2, 0x65f4,
+  0x65f5, 0x65f9, 0x65fe, 0x65ff, 0x6600, 0x6604, 0x6608, 0x6609,
+  0x660d, 0x6611, 0x6612, 0x6615, 0x6616, 0x661d,
+  /* 0x42 */
+  0x661e, 0x6621, 0x6622, 0x6623, 0x6624, 0x6626, 0x6629, 0x662a,
+  0x662b, 0x662c, 0x662e, 0x6630, 0x6631, 0x6633, 0x6639, 0x6637,
+  0x6640, 0x6645, 0x6646, 0x664a, 0x664c, 0x6651, 0x664e, 0x6657,
+  0x6658, 0x6659, 0x665b, 0x665c, 0x6660, 0x6661, 0x66fb, 0x666a,
+  0x666b, 0x666c, 0x667e, 0x6673, 0x6675, 0x667f, 0x6677, 0x6678,
+  0x6679, 0x667b, 0x6680, 0x667c, 0x668b, 0x668c, 0x668d, 0x6690,
+  0x6692, 0x6699, 0x669a, 0x669b, 0x669c, 0x669f, 0x66a0, 0x66a4,
+  0x66ad, 0x66b1, 0x66b2, 0x66b5, 0x66bb, 0x66bf, 0x66c0, 0x66c2,
+  0x66c3, 0x66c8, 0x66cc, 0x66ce, 0x66cf, 0x66d4, 0x66db, 0x66df,
+  0x66e8, 0x66eb, 0x66ec, 0x66ee, 0x66fa, 0x6705, 0x6707, 0x670e,
+  0x6713, 0x6719, 0x671c, 0x6720, 0x6722, 0x6733, 0x673e, 0x6745,
+  0x6747, 0x6748, 0x674c, 0x6754, 0x6755, 0x675d,
+  /* 0x43 */
+  0x6766, 0x676c, 0x676e, 0x6774, 0x6776, 0x677b, 0x6781, 0x6784,
+  0x678e, 0x678f, 0x6791, 0x6793, 0x6796, 0x6798, 0x6799, 0x679b,
+  0x67b0, 0x67b1, 0x67b2, 0x67b5, 0x67bb, 0x67bc, 0x67bd, 0x67f9,
+  0x67c0, 0x67c2, 0x67c3, 0x67c5, 0x67c8, 0x67c9, 0x67d2, 0x67d7,
+  0x67d9, 0x67dc, 0x67e1, 0x67e6, 0x67f0, 0x67f2, 0x67f6, 0x67f7,
+  0x6852, 0x6814, 0x6819, 0x681d, 0x681f, 0x6828, 0x6827, 0x682c,
+  0x682d, 0x682f, 0x6830, 0x6831, 0x6833, 0x683b, 0x683f, 0x6844,
+  0x6845, 0x684a, 0x684c, 0x6855, 0x6857, 0x6858, 0x685b, 0x686b,
+  0x686e, 0x686f, 0x6870, 0x6871, 0x6872, 0x6875, 0x6879, 0x687a,
+  0x687b, 0x687c, 0x6882, 0x6884, 0x6886, 0x6888, 0x6896, 0x6898,
+  0x689a, 0x689c, 0x68a1, 0x68a3, 0x68a5, 0x68a9, 0x68aa, 0x68ae,
+  0x68b2, 0x68bb, 0x68c5, 0x68c8, 0x68cc, 0x68cf,
+  /* 0x44 */
+  0x68d0, 0x68d1, 0x68d3, 0x68d6, 0x68d9, 0x68dc, 0x68dd, 0x68e5,
+  0x68e8, 0x68ea, 0x68eb, 0x68ec, 0x68ed, 0x68f0, 0x68f1, 0x68f5,
+  0x68f6, 0x68fb, 0x68fc, 0x68fd, 0x6906, 0x6909, 0x690a, 0x6910,
+  0x6911, 0x6913, 0x6916, 0x6917, 0x6931, 0x6933, 0x6935, 0x6938,
+  0x693b, 0x6942, 0x6945, 0x6949, 0x694e, 0x6957, 0x695b, 0x6963,
+  0x6964, 0x6965, 0x6966, 0x6968, 0x6969, 0x696c, 0x6970, 0x6971,
+  0x6972, 0x697a, 0x697b, 0x697f, 0x6980, 0x698d, 0x6992, 0x6996,
+  0x6998, 0x69a1, 0x69a5, 0x69a6, 0x69a8, 0x69ab, 0x69ad, 0x69af,
+  0x69b7, 0x69b8, 0x69ba, 0x69bc, 0x69c5, 0x69c8, 0x69d1, 0x69d6,
+  0x69d7, 0x69e2, 0x69e5, 0x69ee, 0x69ef, 0x69f1, 0x69f3, 0x69f5,
+  0x69fe, 0x6a00, 0x6a01, 0x6a03, 0x6a0f, 0x6a11, 0x6a15, 0x6a1a,
+  0x6a1d, 0x6a20, 0x6a24, 0x6a28, 0x6a30, 0x6a32,
+  /* 0x45 */
+  0x6a34, 0x6a37, 0x6a3b, 0x6a3e, 0x6a3f, 0x6a45, 0x6a46, 0x6a49,
+  0x6a4a, 0x6a4e, 0x6a50, 0x6a51, 0x6a52, 0x6a55, 0x6a56, 0x6a5b,
+  0x6a64, 0x6a67, 0x6a6a, 0x6a71, 0x6a73, 0x6a7e, 0x6a81, 0x6a83,
+  0x6a86, 0x6a87, 0x6a89, 0x6a8b, 0x6a91, 0x6a9b, 0x6a9d, 0x6a9e,
+  0x6a9f, 0x6aa5, 0x6aab, 0x6aaf, 0x6ab0, 0x6ab1, 0x6ab4, 0x6abd,
+  0x6abe, 0x6abf, 0x6ac6, 0x6ac9, 0x6ac8, 0x6acc, 0x6ad0, 0x6ad4,
+  0x6ad5, 0x6ad6, 0x6adc, 0x6add, 0x6ae4, 0x6ae7, 0x6aec, 0x6af0,
+  0x6af1, 0x6af2, 0x6afc, 0x6afd, 0x6b02, 0x6b03, 0x6b06, 0x6b07,
+  0x6b09, 0x6b0f, 0x6b10, 0x6b11, 0x6b17, 0x6b1b, 0x6b1e, 0x6b24,
+  0x6b28, 0x6b2b, 0x6b2c, 0x6b2f, 0x6b35, 0x6b36, 0x6b3b, 0x6b3f,
+  0x6b46, 0x6b4a, 0x6b4d, 0x6b52, 0x6b56, 0x6b58, 0x6b5d, 0x6b60,
+  0x6b67, 0x6b6b, 0x6b6e, 0x6b70, 0x6b75, 0x6b7d,
+  /* 0x46 */
+  0x6b7e, 0x6b82, 0x6b85, 0x6b97, 0x6b9b, 0x6b9f, 0x6ba0, 0x6ba2,
+  0x6ba3, 0x6ba8, 0x6ba9, 0x6bac, 0x6bad, 0x6bae, 0x6bb0, 0x6bb8,
+  0x6bb9, 0x6bbd, 0x6bbe, 0x6bc3, 0x6bc4, 0x6bc9, 0x6bcc, 0x6bd6,
+  0x6bda, 0x6be1, 0x6be3, 0x6be6, 0x6be7, 0x6bee, 0x6bf1, 0x6bf7,
+  0x6bf9, 0x6bff, 0x6c02, 0x6c04, 0x6c05, 0x6c09, 0x6c0d, 0x6c0e,
+  0x6c10, 0x6c12, 0x6c19, 0x6c1f, 0x6c26, 0x6c27, 0x6c28, 0x6c2c,
+  0x6c2e, 0x6c33, 0x6c35, 0x6c36, 0x6c3a, 0x6c3b, 0x6c3f, 0x6c4a,
+  0x6c4b, 0x6c4d, 0x6c4f, 0x6c52, 0x6c54, 0x6c59, 0x6c5b, 0x6c5c,
+  0x6c6b, 0x6c6d, 0x6c6f, 0x6c74, 0x6c76, 0x6c78, 0x6c79, 0x6c7b,
+  0x6c85, 0x6c86, 0x6c87, 0x6c89, 0x6c94, 0x6c95, 0x6c97, 0x6c98,
+  0x6c9c, 0x6c9f, 0x6cb0, 0x6cb2, 0x6cb4, 0x6cc2, 0x6cc6, 0x6ccd,
+  0x6ccf, 0x6cd0, 0x6cd1, 0x6cd2, 0x6cd4, 0x6cd6,
+  /* 0x47 */
+  0x6cda, 0x6cdc, 0x6ce0, 0x6ce7, 0x6ce9, 0x6ceb, 0x6cec, 0x6cee,
+  0x6cf2, 0x6cf4, 0x6d04, 0x6d07, 0x6d0a, 0x6d0e, 0x6d0f, 0x6d11,
+  0x6d13, 0x6d1a, 0x6d26, 0x6d27, 0x6d28, 0x6c67, 0x6d2e, 0x6d2f,
+  0x6d31, 0x6d39, 0x6d3c, 0x6d3f, 0x6d57, 0x6d5e, 0x6d5f, 0x6d61,
+  0x6d65, 0x6d67, 0x6d6f, 0x6d70, 0x6d7c, 0x6d82, 0x6d87, 0x6d91,
+  0x6d92, 0x6d94, 0x6d96, 0x6d97, 0x6d98, 0x6daa, 0x6dac, 0x6db4,
+  0x6db7, 0x6db9, 0x6dbd, 0x6dbf, 0x6dc4, 0x6dc8, 0x6dca, 0x6dce,
+  0x6dcf, 0x6dd6, 0x6ddb, 0x6ddd, 0x6ddf, 0x6de0, 0x6de2, 0x6de5,
+  0x6de9, 0x6def, 0x6df0, 0x6df4, 0x6df6, 0x6dfc, 0x6e00, 0x6e04,
+  0x6e1e, 0x6e22, 0x6e27, 0x6e32, 0x6e36, 0x6e39, 0x6e3b, 0x6e3c,
+  0x6e44, 0x6e45, 0x6e48, 0x6e49, 0x6e4b, 0x6e4f, 0x6e51, 0x6e52,
+  0x6e53, 0x6e54, 0x6e57, 0x6e5c, 0x6e5d, 0x6e5e,
+  /* 0x48 */
+  0x6e62, 0x6e63, 0x6e68, 0x6e73, 0x6e7b, 0x6e7d, 0x6e8d, 0x6e93,
+  0x6e99, 0x6ea0, 0x6ea7, 0x6ead, 0x6eae, 0x6eb1, 0x6eb3, 0x6ebb,
+  0x6ebf, 0x6ec0, 0x6ec1, 0x6ec3, 0x6ec7, 0x6ec8, 0x6eca, 0x6ecd,
+  0x6ece, 0x6ecf, 0x6eeb, 0x6eed, 0x6eee, 0x6ef9, 0x6efb, 0x6efd,
+  0x6f04, 0x6f08, 0x6f0a, 0x6f0c, 0x6f0d, 0x6f16, 0x6f18, 0x6f1a,
+  0x6f1b, 0x6f26, 0x6f29, 0x6f2a, 0x6f2f, 0x6f30, 0x6f33, 0x6f36,
+  0x6f3b, 0x6f3c, 0x6f2d, 0x6f4f, 0x6f51, 0x6f52, 0x6f53, 0x6f57,
+  0x6f59, 0x6f5a, 0x6f5d, 0x6f5e, 0x6f61, 0x6f62, 0x6f68, 0x6f6c,
+  0x6f7d, 0x6f7e, 0x6f83, 0x6f87, 0x6f88, 0x6f8b, 0x6f8c, 0x6f8d,
+  0x6f90, 0x6f92, 0x6f93, 0x6f94, 0x6f96, 0x6f9a, 0x6f9f, 0x6fa0,
+  0x6fa5, 0x6fa6, 0x6fa7, 0x6fa8, 0x6fae, 0x6faf, 0x6fb0, 0x6fb5,
+  0x6fb6, 0x6fbc, 0x6fc5, 0x6fc7, 0x6fc8, 0x6fca,
+  /* 0x49 */
+  0x6fda, 0x6fde, 0x6fe8, 0x6fe9, 0x6ff0, 0x6ff5, 0x6ff9, 0x6ffc,
+  0x6ffd, 0x7000, 0x7005, 0x7006, 0x7007, 0x700d, 0x7017, 0x7020,
+  0x7023, 0x702f, 0x7034, 0x7037, 0x7039, 0x703c, 0x7043, 0x7044,
+  0x7048, 0x7049, 0x704a, 0x704b, 0x7054, 0x7055, 0x705d, 0x705e,
+  0x704e, 0x7064, 0x7065, 0x706c, 0x706e, 0x7075, 0x7076, 0x707e,
+  0x7081, 0x7085, 0x7086, 0x7094, 0x7095, 0x7096, 0x7097, 0x7098,
+  0x709b, 0x70a4, 0x70ab, 0x70b0, 0x70b1, 0x70b4, 0x70b7, 0x70ca,
+  0x70d1, 0x70d3, 0x70d4, 0x70d5, 0x70d6, 0x70d8, 0x70dc, 0x70e4,
+  0x70fa, 0x7103, 0x7104, 0x7105, 0x7106, 0x7107, 0x710b, 0x710c,
+  0x710f, 0x711e, 0x7120, 0x712b, 0x712d, 0x712f, 0x7130, 0x7131,
+  0x7138, 0x7141, 0x7145, 0x7146, 0x7147, 0x714a, 0x714b, 0x7150,
+  0x7152, 0x7157, 0x715a, 0x715c, 0x715e, 0x7160,
+  /* 0x4a */
+  0x7168, 0x7179, 0x7180, 0x7185, 0x7187, 0x718c, 0x7192, 0x719a,
+  0x719b, 0x71a0, 0x71a2, 0x71af, 0x71b0, 0x71b2, 0x71b3, 0x71ba,
+  0x71bf, 0x71c0, 0x71c1, 0x71c4, 0x71cb, 0x71cc, 0x71d3, 0x71d6,
+  0x71d9, 0x71da, 0x71dc, 0x71f8, 0x71fe, 0x7200, 0x7207, 0x7208,
+  0x7209, 0x7213, 0x7217, 0x721a, 0x721d, 0x721f, 0x7224, 0x722b,
+  0x722f, 0x7234, 0x7238, 0x7239, 0x7241, 0x7242, 0x7243, 0x7245,
+  0x724e, 0x724f, 0x7250, 0x7253, 0x7255, 0x7256, 0x725a, 0x725c,
+  0x725e, 0x7260, 0x7263, 0x7268, 0x726b, 0x726e, 0x726f, 0x7271,
+  0x7277, 0x7278, 0x727b, 0x727c, 0x727f, 0x7284, 0x7289, 0x728d,
+  0x728e, 0x7293, 0x729b, 0x72a8, 0x72ad, 0x72ae, 0x72b1, 0x72b4,
+  0x72be, 0x72c1, 0x72c7, 0x72c9, 0x72cc, 0x72d5, 0x72d6, 0x72d8,
+  0x72df, 0x72e5, 0x72f3, 0x72f4, 0x72fa, 0x72fb,
+  /* 0x4b */
+  0x72fe, 0x7302, 0x7304, 0x7305, 0x7307, 0x730b, 0x730d, 0x7312,
+  0x7313, 0x7318, 0x7319, 0x731e, 0x7322, 0x7324, 0x7327, 0x7328,
+  0x732c, 0x7331, 0x7332, 0x7335, 0x733a, 0x733b, 0x733d, 0x7343,
+  0x734d, 0x7350, 0x7352, 0x7356, 0x7358, 0x735d, 0x735e, 0x735f,
+  0x7360, 0x7366, 0x7367, 0x7369, 0x736b, 0x736c, 0x736e, 0x736f,
+  0x7371, 0x7377, 0x7379, 0x737c, 0x7380, 0x7381, 0x7383, 0x7385,
+  0x7386, 0x738e, 0x7390, 0x7393, 0x7395, 0x7397, 0x7398, 0x739c,
+  0x739e, 0x739f, 0x73a0, 0x73a2, 0x73a5, 0x73a6, 0x73aa, 0x73ab,
+  0x73ad, 0x73b5, 0x73b7, 0x73b9, 0x73bc, 0x73bd, 0x73bf, 0x73c5,
+  0x73c6, 0x73c9, 0x73cb, 0x73cc, 0x73cf, 0x73d2, 0x73d3, 0x73d6,
+  0x73d9, 0x73dd, 0x73e1, 0x73e3, 0x73e6, 0x73e7, 0x73e9, 0x73f4,
+  0x73f5, 0x73f7, 0x73f9, 0x73fa, 0x73fb, 0x73fd,
+  /* 0x4c */
+  0x73ff, 0x7400, 0x7401, 0x7404, 0x7407, 0x740a, 0x7411, 0x741a,
+  0x741b, 0x7424, 0x7426, 0x7428, 0x7429, 0x742a, 0x742b, 0x742c,
+  0x742d, 0x742e, 0x742f, 0x7430, 0x7431, 0x7439, 0x7440, 0x7443,
+  0x7444, 0x7446, 0x7447, 0x744b, 0x744d, 0x7451, 0x7452, 0x7457,
+  0x745d, 0x7462, 0x7466, 0x7467, 0x7468, 0x746b, 0x746d, 0x746e,
+  0x7471, 0x7472, 0x7480, 0x7481, 0x7485, 0x7486, 0x7487, 0x7489,
+  0x748f, 0x7490, 0x7491, 0x7492, 0x7498, 0x7499, 0x749a, 0x749c,
+  0x749f, 0x74a0, 0x74a1, 0x74a3, 0x74a6, 0x74a8, 0x74a9, 0x74aa,
+  0x74ab, 0x74ae, 0x74af, 0x74b1, 0x74b2, 0x74b5, 0x74b9, 0x74bb,
+  0x74bf, 0x74c8, 0x74c9, 0x74cc, 0x74d0, 0x74d3, 0x74d8, 0x74da,
+  0x74db, 0x74de, 0x74df, 0x74e4, 0x74e8, 0x74ea, 0x74eb, 0x74ef,
+  0x74f4, 0x74fa, 0x74fb, 0x74fc, 0x74ff, 0x7506,
+  /* 0x4d */
+  0x7512, 0x7516, 0x7517, 0x7520, 0x7521, 0x7524, 0x7527, 0x7529,
+  0x752a, 0x752f, 0x7536, 0x7539, 0x753d, 0x753e, 0x753f, 0x7540,
+  0x7543, 0x7547, 0x7548, 0x754e, 0x7550, 0x7552, 0x7557, 0x755e,
+  0x755f, 0x7561, 0x756f, 0x7571, 0x7579, 0x757a, 0x757b, 0x757c,
+  0x757d, 0x757e, 0x7581, 0x7585, 0x7590, 0x7592, 0x7593, 0x7595,
+  0x7599, 0x759c, 0x75a2, 0x75a4, 0x75b4, 0x75ba, 0x75bf, 0x75c0,
+  0x75c1, 0x75c4, 0x75c6, 0x75cc, 0x75ce, 0x75cf, 0x75d7, 0x75dc,
+  0x75df, 0x75e0, 0x75e1, 0x75e4, 0x75e7, 0x75ec, 0x75ee, 0x75ef,
+  0x75f1, 0x75f9, 0x7600, 0x7602, 0x7603, 0x7604, 0x7607, 0x7608,
+  0x760a, 0x760c, 0x760f, 0x7612, 0x7613, 0x7615, 0x7616, 0x7619,
+  0x761b, 0x761c, 0x761d, 0x761e, 0x7623, 0x7625, 0x7626, 0x7629,
+  0x762d, 0x7632, 0x7633, 0x7635, 0x7638, 0x7639,
+  /* 0x4e */
+  0x763a, 0x763c, 0x764a, 0x7640, 0x7641, 0x7643, 0x7644, 0x7645,
+  0x7649, 0x764b, 0x7655, 0x7659, 0x765f, 0x7664, 0x7665, 0x766d,
+  0x766e, 0x766f, 0x7671, 0x7674, 0x7681, 0x7685, 0x768c, 0x768d,
+  0x7695, 0x769b, 0x769c, 0x769d, 0x769f, 0x76a0, 0x76a2, 0x76a3,
+  0x76a4, 0x76a5, 0x76a6, 0x76a7, 0x76a8, 0x76aa, 0x76ad, 0x76bd,
+  0x76c1, 0x76c5, 0x76c9, 0x76cb, 0x76cc, 0x76ce, 0x76d4, 0x76d9,
+  0x76e0, 0x76e6, 0x76e8, 0x76ec, 0x76f0, 0x76f1, 0x76f6, 0x76f9,
+  0x76fc, 0x7700, 0x7706, 0x770a, 0x770e, 0x7712, 0x7714, 0x7715,
+  0x7717, 0x7719, 0x771a, 0x771c, 0x7722, 0x7728, 0x772d, 0x772e,
+  0x772f, 0x7734, 0x7735, 0x7736, 0x7739, 0x773d, 0x773e, 0x7742,
+  0x7745, 0x7746, 0x774a, 0x774d, 0x774e, 0x774f, 0x7752, 0x7756,
+  0x7757, 0x775c, 0x775e, 0x775f, 0x7760, 0x7762,
+  /* 0x4f */
+  0x7764, 0x7767, 0x776a, 0x776c, 0x7770, 0x7772, 0x7773, 0x7774,
+  0x777a, 0x777d, 0x7780, 0x7784, 0x778c, 0x778d, 0x7794, 0x7795,
+  0x7796, 0x779a, 0x779f, 0x77a2, 0x77a7, 0x77aa, 0x77ae, 0x77af,
+  0x77b1, 0x77b5, 0x77be, 0x77c3, 0x77c9, 0x77d1, 0x77d2, 0x77d5,
+  0x77d9, 0x77de, 0x77df, 0x77e0, 0x77e4, 0x77e6, 0x77ea, 0x77ec,
+  0x77f0, 0x77f1, 0x77f4, 0x77f8, 0x77fb, 0x7805, 0x7806, 0x7809,
+  0x780d, 0x780e, 0x7811, 0x781d, 0x7821, 0x7822, 0x7823, 0x782d,
+  0x782e, 0x7830, 0x7835, 0x7837, 0x7843, 0x7844, 0x7847, 0x7848,
+  0x784c, 0x784e, 0x7852, 0x785c, 0x785e, 0x7860, 0x7861, 0x7863,
+  0x7864, 0x7868, 0x786a, 0x786e, 0x787a, 0x787e, 0x788a, 0x788f,
+  0x7894, 0x7898, 0x78a1, 0x789d, 0x789e, 0x789f, 0x78a4, 0x78a8,
+  0x78ac, 0x78ad, 0x78b0, 0x78b1, 0x78b2, 0x78b3,
+  /* 0x50 */
+  0x78bb, 0x78bd, 0x78bf, 0x78c7, 0x78c8, 0x78c9, 0x78cc, 0x78ce,
+  0x78d2, 0x78d3, 0x78d5, 0x78d6, 0x78e4, 0x78db, 0x78df, 0x78e0,
+  0x78e1, 0x78e6, 0x78ea, 0x78f2, 0x78f3, 0x7900, 0x78f6, 0x78f7,
+  0x78fa, 0x78fb, 0x78ff, 0x7906, 0x790c, 0x7910, 0x791a, 0x791c,
+  0x791e, 0x791f, 0x7920, 0x7925, 0x7927, 0x7929, 0x792d, 0x7931,
+  0x7934, 0x7935, 0x793b, 0x793d, 0x793f, 0x7944, 0x7945, 0x7946,
+  0x794a, 0x794b, 0x794f, 0x7951, 0x7954, 0x7958, 0x795b, 0x795c,
+  0x7967, 0x7969, 0x796b, 0x7972, 0x7979, 0x797b, 0x797c, 0x797e,
+  0x798b, 0x798c, 0x7991, 0x7993, 0x7994, 0x7995, 0x7996, 0x7998,
+  0x799b, 0x799c, 0x79a1, 0x79a8, 0x79a9, 0x79ab, 0x79af, 0x79b1,
+  0x79b4, 0x79b8, 0x79bb, 0x79c2, 0x79c4, 0x79c7, 0x79c8, 0x79ca,
+  0x79cf, 0x79d4, 0x79d6, 0x79da, 0x79dd, 0x79de,
+  /* 0x51 */
+  0x79e0, 0x79e2, 0x79e5, 0x79ea, 0x79eb, 0x79ed, 0x79f1, 0x79f8,
+  0x79fc, 0x7a02, 0x7a03, 0x7a07, 0x7a09, 0x7a0a, 0x7a0c, 0x7a11,
+  0x7a15, 0x7a1b, 0x7a1e, 0x7a21, 0x7a27, 0x7a2b, 0x7a2d, 0x7a2f,
+  0x7a30, 0x7a34, 0x7a35, 0x7a38, 0x7a39, 0x7a3a, 0x7a44, 0x7a45,
+  0x7a47, 0x7a48, 0x7a4c, 0x7a55, 0x7a56, 0x7a59, 0x7a5c, 0x7a5d,
+  0x7a5f, 0x7a60, 0x7a65, 0x7a67, 0x7a6a, 0x7a6d, 0x7a75, 0x7a78,
+  0x7a7e, 0x7a80, 0x7a82, 0x7a85, 0x7a86, 0x7a8a, 0x7a8b, 0x7a90,
+  0x7a91, 0x7a94, 0x7a9e, 0x7aa0, 0x7aa3, 0x7aac, 0x7ab3, 0x7ab5,
+  0x7ab9, 0x7abb, 0x7abc, 0x7ac6, 0x7ac9, 0x7acc, 0x7ace, 0x7ad1,
+  0x7adb, 0x7ae8, 0x7ae9, 0x7aeb, 0x7aec, 0x7af1, 0x7af4, 0x7afb,
+  0x7afd, 0x7afe, 0x7b07, 0x7b14, 0x7b1f, 0x7b23, 0x7b27, 0x7b29,
+  0x7b2a, 0x7b2b, 0x7b2d, 0x7b2e, 0x7b2f, 0x7b30,
+  /* 0x52 */
+  0x7b31, 0x7b34, 0x7b3d, 0x7b3f, 0x7b40, 0x7b41, 0x7b47, 0x7b4e,
+  0x7b55, 0x7b60, 0x7b64, 0x7b66, 0x7b69, 0x7b6a, 0x7b6d, 0x7b6f,
+  0x7b72, 0x7b73, 0x7b77, 0x7b84, 0x7b89, 0x7b8e, 0x7b90, 0x7b91,
+  0x7b96, 0x7b9b, 0x7b9e, 0x7ba0, 0x7ba5, 0x7bac, 0x7baf, 0x7bb0,
+  0x7bb2, 0x7bb5, 0x7bb6, 0x7bba, 0x7bbb, 0x7bbc, 0x7bbd, 0x7bc2,
+  0x7bc5, 0x7bc8, 0x7bca, 0x7bd4, 0x7bd6, 0x7bd7, 0x7bd9, 0x7bda,
+  0x7bdb, 0x7be8, 0x7bea, 0x7bf2, 0x7bf4, 0x7bf5, 0x7bf8, 0x7bf9,
+  0x7bfa, 0x7bfc, 0x7bfe, 0x7c01, 0x7c02, 0x7c03, 0x7c04, 0x7c06,
+  0x7c09, 0x7c0b, 0x7c0c, 0x7c0e, 0x7c0f, 0x7c19, 0x7c1b, 0x7c20,
+  0x7c25, 0x7c26, 0x7c28, 0x7c2c, 0x7c31, 0x7c33, 0x7c34, 0x7c36,
+  0x7c39, 0x7c3a, 0x7c46, 0x7c4a, 0x7c55, 0x7c51, 0x7c52, 0x7c53,
+  0x7c59, 0x7c5a, 0x7c5b, 0x7c5c, 0x7c5d, 0x7c5e,
+  /* 0x53 */
+  0x7c61, 0x7c63, 0x7c67, 0x7c69, 0x7c6d, 0x7c6e, 0x7c70, 0x7c72,
+  0x7c79, 0x7c7c, 0x7c7d, 0x7c86, 0x7c87, 0x7c8f, 0x7c94, 0x7c9e,
+  0x7ca0, 0x7ca6, 0x7cb0, 0x7cb6, 0x7cb7, 0x7cba, 0x7cbb, 0x7cbc,
+  0x7cbf, 0x7cc4, 0x7cc7, 0x7cc8, 0x7cc9, 0x7ccd, 0x7ccf, 0x7cd3,
+  0x7cd4, 0x7cd5, 0x7cd7, 0x7cd9, 0x7cda, 0x7cdd, 0x7ce6, 0x7ce9,
+  0x7ceb, 0x7cf5, 0x7d03, 0x7d07, 0x7d08, 0x7d09, 0x7d0f, 0x7d11,
+  0x7d12, 0x7d13, 0x7d16, 0x7d1d, 0x7d1e, 0x7d23, 0x7d26, 0x7d2a,
+  0x7d2d, 0x7d31, 0x7d3c, 0x7d3d, 0x7d3e, 0x7d40, 0x7d41, 0x7d47,
+  0x7d48, 0x7d4d, 0x7d51, 0x7d53, 0x7d57, 0x7d59, 0x7d5a, 0x7d5c,
+  0x7d5d, 0x7d65, 0x7d67, 0x7d6a, 0x7d70, 0x7d78, 0x7d7a, 0x7d7b,
+  0x7d7f, 0x7d81, 0x7d82, 0x7d83, 0x7d85, 0x7d86, 0x7d88, 0x7d8b,
+  0x7d8c, 0x7d8d, 0x7d91, 0x7d96, 0x7d97, 0x7d9d,
+  /* 0x54 */
+  0x7d9e, 0x7da6, 0x7da7, 0x7daa, 0x7db3, 0x7db6, 0x7db7, 0x7db9,
+  0x7dc2, 0x7dc3, 0x7dc4, 0x7dc5, 0x7dc6, 0x7dcc, 0x7dcd, 0x7dce,
+  0x7dd7, 0x7dd9, 0x7e00, 0x7de2, 0x7de5, 0x7de6, 0x7dea, 0x7deb,
+  0x7ded, 0x7df1, 0x7df5, 0x7df6, 0x7df9, 0x7dfa, 0x7e08, 0x7e10,
+  0x7e11, 0x7e15, 0x7e17, 0x7e1c, 0x7e1d, 0x7e20, 0x7e27, 0x7e28,
+  0x7e2c, 0x7e2d, 0x7e2f, 0x7e33, 0x7e36, 0x7e3f, 0x7e44, 0x7e45,
+  0x7e47, 0x7e4e, 0x7e50, 0x7e52, 0x7e58, 0x7e5f, 0x7e61, 0x7e62,
+  0x7e65, 0x7e6b, 0x7e6e, 0x7e6f, 0x7e73, 0x7e78, 0x7e7e, 0x7e81,
+  0x7e86, 0x7e87, 0x7e8a, 0x7e8d, 0x7e91, 0x7e95, 0x7e98, 0x7e9a,
+  0x7e9d, 0x7e9e, 0x7f3c, 0x7f3b, 0x7f3d, 0x7f3e, 0x7f3f, 0x7f43,
+  0x7f44, 0x7f47, 0x7f4f, 0x7f52, 0x7f53, 0x7f5b, 0x7f5c, 0x7f5d,
+  0x7f61, 0x7f63, 0x7f64, 0x7f65, 0x7f66, 0x7f6d,
+  /* 0x55 */
+  0x7f71, 0x7f7d, 0x7f7e, 0x7f7f, 0x7f80, 0x7f8b, 0x7f8d, 0x7f8f,
+  0x7f90, 0x7f91, 0x7f96, 0x7f97, 0x7f9c, 0x7fa1, 0x7fa2, 0x7fa6,
+  0x7faa, 0x7fad, 0x7fb4, 0x7fbc, 0x7fbf, 0x7fc0, 0x7fc3, 0x7fc8,
+  0x7fce, 0x7fcf, 0x7fdb, 0x7fdf, 0x7fe3, 0x7fe5, 0x7fe8, 0x7fec,
+  0x7fee, 0x7fef, 0x7ff2, 0x7ffa, 0x7ffd, 0x7ffe, 0x7fff, 0x8007,
+  0x8008, 0x800a, 0x800d, 0x800e, 0x800f, 0x8011, 0x8013, 0x8014,
+  0x8016, 0x801d, 0x801e, 0x801f, 0x8020, 0x8024, 0x8026, 0x802c,
+  0x802e, 0x8030, 0x8034, 0x8035, 0x8037, 0x8039, 0x803a, 0x803c,
+  0x803e, 0x8040, 0x8044, 0x8060, 0x8064, 0x8066, 0x806d, 0x8071,
+  0x8075, 0x8081, 0x8088, 0x808e, 0x809c, 0x809e, 0x80a6, 0x80a7,
+  0x80ab, 0x80b8, 0x80b9, 0x80c8, 0x80cd, 0x80cf, 0x80d2, 0x80d4,
+  0x80d5, 0x80d7, 0x80d8, 0x80e0, 0x80ed, 0x80ee,
+  /* 0x56 */
+  0x80f0, 0x80f2, 0x80f3, 0x80f6, 0x80f9, 0x80fa, 0x80fe, 0x8103,
+  0x810b, 0x8116, 0x8117, 0x8118, 0x811c, 0x811e, 0x8120, 0x8124,
+  0x8127, 0x812c, 0x8130, 0x8135, 0x813a, 0x813c, 0x8145, 0x8147,
+  0x814a, 0x814c, 0x8152, 0x8157, 0x8160, 0x8161, 0x8167, 0x8168,
+  0x8169, 0x816d, 0x816f, 0x8177, 0x8181, 0x8190, 0x8184, 0x8185,
+  0x8186, 0x818b, 0x818e, 0x8196, 0x8198, 0x819b, 0x819e, 0x81a2,
+  0x81ae, 0x81b2, 0x81b4, 0x81bb, 0x81cb, 0x81c3, 0x81c5, 0x81ca,
+  0x81ce, 0x81cf, 0x81d5, 0x81d7, 0x81db, 0x81dd, 0x81de, 0x81e1,
+  0x81e4, 0x81eb, 0x81ec, 0x81f0, 0x81f1, 0x81f2, 0x81f5, 0x81f6,
+  0x81f8, 0x81f9, 0x81fd, 0x81ff, 0x8200, 0x8203, 0x820f, 0x8213,
+  0x8214, 0x8219, 0x821a, 0x821d, 0x8221, 0x8222, 0x8228, 0x8232,
+  0x8234, 0x823a, 0x8243, 0x8244, 0x8245, 0x8246,
+  /* 0x57 */
+  0x824b, 0x824e, 0x824f, 0x8251, 0x8256, 0x825c, 0x8260, 0x8263,
+  0x8267, 0x826d, 0x8274, 0x827b, 0x827d, 0x827f, 0x8280, 0x8281,
+  0x8283, 0x8284, 0x8287, 0x8289, 0x828a, 0x828e, 0x8291, 0x8294,
+  0x8296, 0x8298, 0x829a, 0x829b, 0x82a0, 0x82a1, 0x82a3, 0x82a4,
+  0x82a7, 0x82a8, 0x82a9, 0x82aa, 0x82ae, 0x82b0, 0x82b2, 0x82b4,
+  0x82b7, 0x82ba, 0x82bc, 0x82be, 0x82bf, 0x82c6, 0x82d0, 0x82d5,
+  0x82da, 0x82e0, 0x82e2, 0x82e4, 0x82e8, 0x82ea, 0x82ed, 0x82ef,
+  0x82f6, 0x82f7, 0x82fd, 0x82fe, 0x8300, 0x8301, 0x8307, 0x8308,
+  0x830a, 0x830b, 0x8354, 0x831b, 0x831d, 0x831e, 0x831f, 0x8321,
+  0x8322, 0x832c, 0x832d, 0x832e, 0x8330, 0x8333, 0x8337, 0x833a,
+  0x833c, 0x833d, 0x8342, 0x8343, 0x8344, 0x8347, 0x834d, 0x834e,
+  0x8351, 0x8355, 0x8356, 0x8357, 0x8370, 0x8378,
+  /* 0x58 */
+  0x837d, 0x837f, 0x8380, 0x8382, 0x8384, 0x8386, 0x838d, 0x8392,
+  0x8394, 0x8395, 0x8398, 0x8399, 0x839b, 0x839c, 0x839d, 0x83a6,
+  0x83a7, 0x83a9, 0x83ac, 0x83be, 0x83bf, 0x83c0, 0x83c7, 0x83c9,
+  0x83cf, 0x83d0, 0x83d1, 0x83d4, 0x83dd, 0x8353, 0x83e8, 0x83ea,
+  0x83f6, 0x83f8, 0x83f9, 0x83fc, 0x8401, 0x8406, 0x840a, 0x840f,
+  0x8411, 0x8415, 0x8419, 0x83ad, 0x842f, 0x8439, 0x8445, 0x8447,
+  0x8448, 0x844a, 0x844d, 0x844f, 0x8451, 0x8452, 0x8456, 0x8458,
+  0x8459, 0x845a, 0x845c, 0x8460, 0x8464, 0x8465, 0x8467, 0x846a,
+  0x8470, 0x8473, 0x8474, 0x8476, 0x8478, 0x847c, 0x847d, 0x8481,
+  0x8485, 0x8492, 0x8493, 0x8495, 0x849e, 0x84a6, 0x84a8, 0x84a9,
+  0x84aa, 0x84af, 0x84b1, 0x84b4, 0x84ba, 0x84bd, 0x84be, 0x84c0,
+  0x84c2, 0x84c7, 0x84c8, 0x84cc, 0x84cf, 0x84d3,
+  /* 0x59 */
+  0x84dc, 0x84e7, 0x84ea, 0x84ef, 0x84f0, 0x84f1, 0x84f2, 0x84f7,
+  0x8532, 0x84fa, 0x84fb, 0x84fd, 0x8502, 0x8503, 0x8507, 0x850c,
+  0x850e, 0x8510, 0x851c, 0x851e, 0x8522, 0x8523, 0x8524, 0x8525,
+  0x8527, 0x852a, 0x852b, 0x852f, 0x8533, 0x8534, 0x8536, 0x853f,
+  0x8546, 0x854f, 0x8550, 0x8551, 0x8552, 0x8553, 0x8556, 0x8559,
+  0x855c, 0x855d, 0x855e, 0x855f, 0x8560, 0x8561, 0x8562, 0x8564,
+  0x856b, 0x856f, 0x8579, 0x857a, 0x857b, 0x857d, 0x857f, 0x8581,
+  0x8585, 0x8586, 0x8589, 0x858b, 0x858c, 0x858f, 0x8593, 0x8598,
+  0x859d, 0x859f, 0x85a0, 0x85a2, 0x85a5, 0x85a7, 0x85b4, 0x85b6,
+  0x85b7, 0x85b8, 0x85bc, 0x85bd, 0x85be, 0x85bf, 0x85c2, 0x85c7,
+  0x85ca, 0x85cb, 0x85ce, 0x85ad, 0x85d8, 0x85da, 0x85df, 0x85e0,
+  0x85e6, 0x85e8, 0x85ed, 0x85f3, 0x85f6, 0x85fc,
+  /* 0x5a */
+  0x85ff, 0x8600, 0x8604, 0x8605, 0x860d, 0x860e, 0x8610, 0x8611,
+  0x8612, 0x8618, 0x8619, 0x861b, 0x861e, 0x8621, 0x8627, 0x8629,
+  0x8636, 0x8638, 0x863a, 0x863c, 0x863d, 0x8640, 0x8642, 0x8646,
+  0x8652, 0x8653, 0x8656, 0x8657, 0x8658, 0x8659, 0x865d, 0x8660,
+  0x8661, 0x8662, 0x8663, 0x8664, 0x8669, 0x866c, 0x866f, 0x8675,
+  0x8676, 0x8677, 0x867a, 0x868d, 0x8691, 0x8696, 0x8698, 0x869a,
+  0x869c, 0x86a1, 0x86a6, 0x86a7, 0x86a8, 0x86ad, 0x86b1, 0x86b3,
+  0x86b4, 0x86b5, 0x86b7, 0x86b8, 0x86b9, 0x86bf, 0x86c0, 0x86c1,
+  0x86c3, 0x86c5, 0x86d1, 0x86d2, 0x86d5, 0x86d7, 0x86da, 0x86dc,
+  0x86e0, 0x86e3, 0x86e5, 0x86e7, 0x8688, 0x86fa, 0x86fc, 0x86fd,
+  0x8704, 0x8705, 0x8707, 0x870b, 0x870e, 0x870f, 0x8710, 0x8713,
+  0x8714, 0x8719, 0x871e, 0x871f, 0x8721, 0x8723,
+  /* 0x5b */
+  0x8728, 0x872e, 0x872f, 0x8731, 0x8732, 0x8739, 0x873a, 0x873c,
+  0x873d, 0x873e, 0x8740, 0x8743, 0x8745, 0x874d, 0x8758, 0x875d,
+  0x8761, 0x8764, 0x8765, 0x876f, 0x8771, 0x8772, 0x877b, 0x8783,
+  0x8784, 0x8785, 0x8786, 0x8787, 0x8788, 0x8789, 0x878b, 0x878c,
+  0x8790, 0x8793, 0x8795, 0x8797, 0x8798, 0x8799, 0x879e, 0x87a0,
+  0x87a3, 0x87a7, 0x87ac, 0x87ad, 0x87ae, 0x87b1, 0x87b5, 0x87be,
+  0x87bf, 0x87c1, 0x87c8, 0x87c9, 0x87ca, 0x87ce, 0x87d5, 0x87d6,
+  0x87d9, 0x87da, 0x87dc, 0x87df, 0x87e2, 0x87e3, 0x87e4, 0x87ea,
+  0x87eb, 0x87ed, 0x87f1, 0x87f3, 0x87f8, 0x87fa, 0x87ff, 0x8801,
+  0x8803, 0x8806, 0x8809, 0x880a, 0x880b, 0x8810, 0x8819, 0x8812,
+  0x8813, 0x8814, 0x8818, 0x881a, 0x881b, 0x881c, 0x881e, 0x881f,
+  0x8828, 0x882d, 0x882e, 0x8830, 0x8832, 0x8835,
+  /* 0x5c */
+  0x883a, 0x883c, 0x8841, 0x8843, 0x8845, 0x8848, 0x8849, 0x884a,
+  0x884b, 0x884e, 0x8851, 0x8855, 0x8856, 0x8858, 0x885a, 0x885c,
+  0x885f, 0x8860, 0x8864, 0x8869, 0x8871, 0x8879, 0x887b, 0x8880,
+  0x8898, 0x889a, 0x889b, 0x889c, 0x889f, 0x88a0, 0x88a8, 0x88aa,
+  0x88ba, 0x88bd, 0x88be, 0x88c0, 0x88ca, 0x88cb, 0x88cc, 0x88cd,
+  0x88ce, 0x88d1, 0x88d2, 0x88d3, 0x88db, 0x88de, 0x88e7, 0x88ef,
+  0x88f0, 0x88f1, 0x88f5, 0x88f7, 0x8901, 0x8906, 0x890d, 0x890e,
+  0x890f, 0x8915, 0x8916, 0x8918, 0x8919, 0x891a, 0x891c, 0x8920,
+  0x8926, 0x8927, 0x8928, 0x8930, 0x8931, 0x8932, 0x8935, 0x8939,
+  0x893a, 0x893e, 0x8940, 0x8942, 0x8945, 0x8946, 0x8949, 0x894f,
+  0x8952, 0x8957, 0x895a, 0x895b, 0x895c, 0x8961, 0x8962, 0x8963,
+  0x896b, 0x896e, 0x8970, 0x8973, 0x8975, 0x897a,
+  /* 0x5d */
+  0x897b, 0x897c, 0x897d, 0x8989, 0x898d, 0x8990, 0x8994, 0x8995,
+  0x899b, 0x899c, 0x899f, 0x89a0, 0x89a5, 0x89b0, 0x89b4, 0x89b5,
+  0x89b6, 0x89b7, 0x89bc, 0x89d4, 0x89d5, 0x89d6, 0x89d7, 0x89d8,
+  0x89e5, 0x89e9, 0x89eb, 0x89ed, 0x89f1, 0x89f3, 0x89f6, 0x89f9,
+  0x89fd, 0x89ff, 0x8a04, 0x8a05, 0x8a07, 0x8a0f, 0x8a11, 0x8a12,
+  0x8a14, 0x8a15, 0x8a1e, 0x8a20, 0x8a22, 0x8a24, 0x8a26, 0x8a2b,
+  0x8a2c, 0x8a2f, 0x8a35, 0x8a37, 0x8a3d, 0x8a3e, 0x8a40, 0x8a43,
+  0x8a45, 0x8a47, 0x8a49, 0x8a4d, 0x8a4e, 0x8a53, 0x8a56, 0x8a57,
+  0x8a58, 0x8a5c, 0x8a5d, 0x8a61, 0x8a65, 0x8a67, 0x8a75, 0x8a76,
+  0x8a77, 0x8a79, 0x8a7a, 0x8a7b, 0x8a7e, 0x8a7f, 0x8a80, 0x8a83,
+  0x8a86, 0x8a8b, 0x8a8f, 0x8a90, 0x8a92, 0x8a96, 0x8a97, 0x8a99,
+  0x8a9f, 0x8aa7, 0x8aa9, 0x8aae, 0x8aaf, 0x8ab3,
+  /* 0x5e */
+  0x8ab6, 0x8ab7, 0x8abb, 0x8abe, 0x8ac3, 0x8ac6, 0x8ac8, 0x8ac9,
+  0x8aca, 0x8ad1, 0x8ad3, 0x8ad4, 0x8ad5, 0x8ad7, 0x8add, 0x8adf,
+  0x8aec, 0x8af0, 0x8af4, 0x8af5, 0x8af6, 0x8afc, 0x8aff, 0x8b05,
+  0x8b06, 0x8b0b, 0x8b11, 0x8b1c, 0x8b1e, 0x8b1f, 0x8b0a, 0x8b2d,
+  0x8b30, 0x8b37, 0x8b3c, 0x8b42, 0x8b43, 0x8b44, 0x8b45, 0x8b46,
+  0x8b48, 0x8b52, 0x8b53, 0x8b54, 0x8b59, 0x8b4d, 0x8b5e, 0x8b63,
+  0x8b6d, 0x8b76, 0x8b78, 0x8b79, 0x8b7c, 0x8b7e, 0x8b81, 0x8b84,
+  0x8b85, 0x8b8b, 0x8b8d, 0x8b8f, 0x8b94, 0x8b95, 0x8b9c, 0x8b9e,
+  0x8b9f, 0x8c38, 0x8c39, 0x8c3d, 0x8c3e, 0x8c45, 0x8c47, 0x8c49,
+  0x8c4b, 0x8c4f, 0x8c51, 0x8c53, 0x8c54, 0x8c57, 0x8c58, 0x8c5b,
+  0x8c5d, 0x8c59, 0x8c63, 0x8c64, 0x8c66, 0x8c68, 0x8c69, 0x8c6d,
+  0x8c73, 0x8c75, 0x8c76, 0x8c7b, 0x8c7e, 0x8c86,
+  /* 0x5f */
+  0x8c87, 0x8c8b, 0x8c90, 0x8c92, 0x8c93, 0x8c99, 0x8c9b, 0x8c9c,
+  0x8ca4, 0x8cb9, 0x8cba, 0x8cc5, 0x8cc6, 0x8cc9, 0x8ccb, 0x8ccf,
+  0x8cd6, 0x8cd5, 0x8cd9, 0x8cdd, 0x8ce1, 0x8ce8, 0x8cec, 0x8cef,
+  0x8cf0, 0x8cf2, 0x8cf5, 0x8cf7, 0x8cf8, 0x8cfe, 0x8cff, 0x8d01,
+  0x8d03, 0x8d09, 0x8d12, 0x8d17, 0x8d1b, 0x8d65, 0x8d69, 0x8d6c,
+  0x8d6e, 0x8d7f, 0x8d82, 0x8d84, 0x8d88, 0x8d8d, 0x8d90, 0x8d91,
+  0x8d95, 0x8d9e, 0x8d9f, 0x8da0, 0x8da6, 0x8dab, 0x8dac, 0x8daf,
+  0x8db2, 0x8db5, 0x8db7, 0x8db9, 0x8dbb, 0x8dc0, 0x8dc5, 0x8dc6,
+  0x8dc7, 0x8dc8, 0x8dca, 0x8dce, 0x8dd1, 0x8dd4, 0x8dd5, 0x8dd7,
+  0x8dd9, 0x8de4, 0x8de5, 0x8de7, 0x8dec, 0x8df0, 0x8dbc, 0x8df1,
+  0x8df2, 0x8df4, 0x8dfd, 0x8e01, 0x8e04, 0x8e05, 0x8e06, 0x8e0b,
+  0x8e11, 0x8e14, 0x8e16, 0x8e20, 0x8e21, 0x8e22,
+  /* 0x60 */
+  0x8e23, 0x8e26, 0x8e27, 0x8e31, 0x8e33, 0x8e36, 0x8e37, 0x8e38,
+  0x8e39, 0x8e3d, 0x8e40, 0x8e41, 0x8e4b, 0x8e4d, 0x8e4e, 0x8e4f,
+  0x8e54, 0x8e5b, 0x8e5c, 0x8e5d, 0x8e5e, 0x8e61, 0x8e62, 0x8e69,
+  0x8e6c, 0x8e6d, 0x8e6f, 0x8e70, 0x8e71, 0x8e79, 0x8e7a, 0x8e7b,
+  0x8e82, 0x8e83, 0x8e89, 0x8e90, 0x8e92, 0x8e95, 0x8e9a, 0x8e9b,
+  0x8e9d, 0x8e9e, 0x8ea2, 0x8ea7, 0x8ea9, 0x8ead, 0x8eae, 0x8eb3,
+  0x8eb5, 0x8eba, 0x8ebb, 0x8ec0, 0x8ec1, 0x8ec3, 0x8ec4, 0x8ec7,
+  0x8ecf, 0x8ed1, 0x8ed4, 0x8edc, 0x8ee8, 0x8eee, 0x8ef0, 0x8ef1,
+  0x8ef7, 0x8ef9, 0x8efa, 0x8eed, 0x8f00, 0x8f02, 0x8f07, 0x8f08,
+  0x8f0f, 0x8f10, 0x8f16, 0x8f17, 0x8f18, 0x8f1e, 0x8f20, 0x8f21,
+  0x8f23, 0x8f25, 0x8f27, 0x8f28, 0x8f2c, 0x8f2d, 0x8f2e, 0x8f34,
+  0x8f35, 0x8f36, 0x8f37, 0x8f3a, 0x8f40, 0x8f41,
+  /* 0x61 */
+  0x8f43, 0x8f47, 0x8f4f, 0x8f51, 0x8f52, 0x8f53, 0x8f54, 0x8f55,
+  0x8f58, 0x8f5d, 0x8f5e, 0x8f65, 0x8f9d, 0x8fa0, 0x8fa1, 0x8fa4,
+  0x8fa5, 0x8fa6, 0x8fb5, 0x8fb6, 0x8fb8, 0x8fbe, 0x8fc0, 0x8fc1,
+  0x8fc6, 0x8fca, 0x8fcb, 0x8fcd, 0x8fd0, 0x8fd2, 0x8fd3, 0x8fd5,
+  0x8fe0, 0x8fe3, 0x8fe4, 0x8fe8, 0x8fee, 0x8ff1, 0x8ff5, 0x8ff6,
+  0x8ffb, 0x8ffe, 0x9002, 0x9004, 0x9008, 0x900c, 0x9018, 0x901b,
+  0x9028, 0x9029, 0x902f, 0x902a, 0x902c, 0x902d, 0x9033, 0x9034,
+  0x9037, 0x903f, 0x9043, 0x9044, 0x904c, 0x905b, 0x905d, 0x9062,
+  0x9066, 0x9067, 0x906c, 0x9070, 0x9074, 0x9079, 0x9085, 0x9088,
+  0x908b, 0x908c, 0x908e, 0x9090, 0x9095, 0x9097, 0x9098, 0x9099,
+  0x909b, 0x90a0, 0x90a1, 0x90a2, 0x90a5, 0x90b0, 0x90b2, 0x90b3,
+  0x90b4, 0x90b6, 0x90bd, 0x90cc, 0x90be, 0x90c3,
+  /* 0x62 */
+  0x90c4, 0x90c5, 0x90c7, 0x90c8, 0x90d5, 0x90d7, 0x90d8, 0x90d9,
+  0x90dc, 0x90dd, 0x90df, 0x90e5, 0x90d2, 0x90f6, 0x90eb, 0x90ef,
+  0x90f0, 0x90f4, 0x90fe, 0x90ff, 0x9100, 0x9104, 0x9105, 0x9106,
+  0x9108, 0x910d, 0x9110, 0x9114, 0x9116, 0x9117, 0x9118, 0x911a,
+  0x911c, 0x911e, 0x9120, 0x9125, 0x9122, 0x9123, 0x9127, 0x9129,
+  0x912e, 0x912f, 0x9131, 0x9134, 0x9136, 0x9137, 0x9139, 0x913a,
+  0x913c, 0x913d, 0x9143, 0x9147, 0x9148, 0x914f, 0x9153, 0x9157,
+  0x9159, 0x915a, 0x915b, 0x9161, 0x9164, 0x9167, 0x916d, 0x9174,
+  0x9179, 0x917a, 0x917b, 0x9181, 0x9183, 0x9185, 0x9186, 0x918a,
+  0x918e, 0x9191, 0x9193, 0x9194, 0x9195, 0x9198, 0x919e, 0x91a1,
+  0x91a6, 0x91a8, 0x91ac, 0x91ad, 0x91ae, 0x91b0, 0x91b1, 0x91b2,
+  0x91b3, 0x91b6, 0x91bb, 0x91bc, 0x91bd, 0x91bf,
+  /* 0x63 */
+  0x91c2, 0x91c3, 0x91c5, 0x91d3, 0x91d4, 0x91d7, 0x91d9, 0x91da,
+  0x91de, 0x91e4, 0x91e5, 0x91e9, 0x91ea, 0x91ec, 0x91ed, 0x91ee,
+  0x91ef, 0x91f0, 0x91f1, 0x91f7, 0x91f9, 0x91fb, 0x91fd, 0x9200,
+  0x9201, 0x9204, 0x9205, 0x9206, 0x9207, 0x9209, 0x920a, 0x920c,
+  0x9210, 0x9212, 0x9213, 0x9216, 0x9218, 0x921c, 0x921d, 0x9223,
+  0x9224, 0x9225, 0x9226, 0x9228, 0x922e, 0x922f, 0x9230, 0x9233,
+  0x9235, 0x9236, 0x9238, 0x9239, 0x923a, 0x923c, 0x923e, 0x9240,
+  0x9242, 0x9243, 0x9246, 0x9247, 0x924a, 0x924d, 0x924e, 0x924f,
+  0x9251, 0x9258, 0x9259, 0x925c, 0x925d, 0x9260, 0x9261, 0x9265,
+  0x9267, 0x9268, 0x9269, 0x926e, 0x926f, 0x9270, 0x9275, 0x9276,
+  0x9277, 0x9278, 0x9279, 0x927b, 0x927c, 0x927d, 0x927f, 0x9288,
+  0x9289, 0x928a, 0x928d, 0x928e, 0x9292, 0x9297,
+  /* 0x64 */
+  0x9299, 0x929f, 0x92a0, 0x92a4, 0x92a5, 0x92a7, 0x92a8, 0x92ab,
+  0x92af, 0x92b2, 0x92b6, 0x92b8, 0x92ba, 0x92bb, 0x92bc, 0x92bd,
+  0x92bf, 0x92c0, 0x92c1, 0x92c2, 0x92c3, 0x92c5, 0x92c6, 0x92c7,
+  0x92c8, 0x92cb, 0x92cc, 0x92cd, 0x92ce, 0x92d0, 0x92d3, 0x92d5,
+  0x92d7, 0x92d8, 0x92d9, 0x92dc, 0x92dd, 0x92df, 0x92e0, 0x92e1,
+  0x92e3, 0x92e5, 0x92e7, 0x92e8, 0x92ec, 0x92ee, 0x92f0, 0x92f9,
+  0x92fb, 0x92ff, 0x9300, 0x9302, 0x9308, 0x930d, 0x9311, 0x9314,
+  0x9315, 0x931c, 0x931d, 0x931e, 0x931f, 0x9321, 0x9324, 0x9325,
+  0x9327, 0x9329, 0x932a, 0x9333, 0x9334, 0x9336, 0x9337, 0x9347,
+  0x9348, 0x9349, 0x9350, 0x9351, 0x9352, 0x9355, 0x9357, 0x9358,
+  0x935a, 0x935e, 0x9364, 0x9365, 0x9367, 0x9369, 0x936a, 0x936d,
+  0x936f, 0x9370, 0x9371, 0x9373, 0x9374, 0x9376,
+  /* 0x65 */
+  0x937a, 0x937d, 0x937f, 0x9380, 0x9381, 0x9382, 0x9388, 0x938a,
+  0x938b, 0x938d, 0x938f, 0x9392, 0x9395, 0x9398, 0x939b, 0x939e,
+  0x93a1, 0x93a3, 0x93a4, 0x93a6, 0x93a8, 0x93ab, 0x93b4, 0x93b5,
+  0x93b6, 0x93ba, 0x93a9, 0x93c1, 0x93c4, 0x93c5, 0x93c6, 0x93c7,
+  0x93c9, 0x93ca, 0x93cb, 0x93cc, 0x93cd, 0x93d3, 0x93d9, 0x93dc,
+  0x93de, 0x93df, 0x93e2, 0x93e6, 0x93e7, 0x93f9, 0x93f7, 0x93f8,
+  0x93fa, 0x93fb, 0x93fd, 0x9401, 0x9402, 0x9404, 0x9408, 0x9409,
+  0x940d, 0x940e, 0x940f, 0x9415, 0x9416, 0x9417, 0x941f, 0x942e,
+  0x942f, 0x9431, 0x9432, 0x9433, 0x9434, 0x943b, 0x943f, 0x943d,
+  0x9443, 0x9445, 0x9448, 0x944a, 0x944c, 0x9455, 0x9459, 0x945c,
+  0x945f, 0x9461, 0x9463, 0x9468, 0x946b, 0x946d, 0x946e, 0x946f,
+  0x9471, 0x9472, 0x9484, 0x9483, 0x9578, 0x9579,
+  /* 0x66 */
+  0x957e, 0x9584, 0x9588, 0x958c, 0x958d, 0x958e, 0x959d, 0x959e,
+  0x959f, 0x95a1, 0x95a6, 0x95a9, 0x95ab, 0x95ac, 0x95b4, 0x95b6,
+  0x95ba, 0x95bd, 0x95bf, 0x95c6, 0x95c8, 0x95c9, 0x95cb, 0x95d0,
+  0x95d1, 0x95d2, 0x95d3, 0x95d9, 0x95da, 0x95dd, 0x95de, 0x95df,
+  0x95e0, 0x95e4, 0x95e6, 0x961d, 0x961e, 0x9622, 0x9624, 0x9625,
+  0x9626, 0x962c, 0x9631, 0x9633, 0x9637, 0x9638, 0x9639, 0x963a,
+  0x963c, 0x963d, 0x9641, 0x9652, 0x9654, 0x9656, 0x9657, 0x9658,
+  0x9661, 0x966e, 0x9674, 0x967b, 0x967c, 0x967e, 0x967f, 0x9681,
+  0x9682, 0x9683, 0x9684, 0x9689, 0x9691, 0x9696, 0x969a, 0x969d,
+  0x969f, 0x96a4, 0x96a5, 0x96a6, 0x96a9, 0x96ae, 0x96af, 0x96b3,
+  0x96ba, 0x96ca, 0x96d2, 0x5db2, 0x96d8, 0x96da, 0x96dd, 0x96de,
+  0x96df, 0x96e9, 0x96ef, 0x96f1, 0x96fa, 0x9702,
+  /* 0x67 */
+  0x9703, 0x9705, 0x9709, 0x971a, 0x971b, 0x971d, 0x9721, 0x9722,
+  0x9723, 0x9728, 0x9731, 0x9733, 0x9741, 0x9743, 0x974a, 0x974e,
+  0x974f, 0x9755, 0x9757, 0x9758, 0x975a, 0x975b, 0x9763, 0x9767,
+  0x976a, 0x976e, 0x9773, 0x9776, 0x9777, 0x9778, 0x977b, 0x977d,
+  0x977f, 0x9780, 0x9789, 0x9795, 0x9796, 0x9797, 0x9799, 0x979a,
+  0x979e, 0x979f, 0x97a2, 0x97ac, 0x97ae, 0x97b1, 0x97b2, 0x97b5,
+  0x97b6, 0x97b8, 0x97b9, 0x97ba, 0x97bc, 0x97be, 0x97bf, 0x97c1,
+  0x97c4, 0x97c5, 0x97c7, 0x97c9, 0x97ca, 0x97cc, 0x97cd, 0x97ce,
+  0x97d0, 0x97d1, 0x97d4, 0x97d7, 0x97d8, 0x97d9, 0x97dd, 0x97de,
+  0x97e0, 0x97db, 0x97e1, 0x97e4, 0x97ef, 0x97f1, 0x97f4, 0x97f7,
+  0x97f8, 0x97fa, 0x9807, 0x980a, 0x9819, 0x980d, 0x980e, 0x9814,
+  0x9816, 0x981c, 0x981e, 0x9820, 0x9823, 0x9826,
+  /* 0x68 */
+  0x982b, 0x982e, 0x982f, 0x9830, 0x9832, 0x9833, 0x9835, 0x9825,
+  0x983e, 0x9844, 0x9847, 0x984a, 0x9851, 0x9852, 0x9853, 0x9856,
+  0x9857, 0x9859, 0x985a, 0x9862, 0x9863, 0x9865, 0x9866, 0x986a,
+  0x986c, 0x98ab, 0x98ad, 0x98ae, 0x98b0, 0x98b4, 0x98b7, 0x98b8,
+  0x98ba, 0x98bb, 0x98bf, 0x98c2, 0x98c5, 0x98c8, 0x98cc, 0x98e1,
+  0x98e3, 0x98e5, 0x98e6, 0x98e7, 0x98ea, 0x98f3, 0x98f6, 0x9902,
+  0x9907, 0x9908, 0x9911, 0x9915, 0x9916, 0x9917, 0x991a, 0x991b,
+  0x991c, 0x991f, 0x9922, 0x9926, 0x9927, 0x992b, 0x9931, 0x9932,
+  0x9933, 0x9934, 0x9935, 0x9939, 0x993a, 0x993b, 0x993c, 0x9940,
+  0x9941, 0x9946, 0x9947, 0x9948, 0x994d, 0x994e, 0x9954, 0x9958,
+  0x9959, 0x995b, 0x995c, 0x995e, 0x995f, 0x9960, 0x999b, 0x999d,
+  0x999f, 0x99a6, 0x99b0, 0x99b1, 0x99b2, 0x99b5,
+  /* 0x69 */
+  0x99b9, 0x99ba, 0x99bd, 0x99bf, 0x99c3, 0x99c9, 0x99d3, 0x99d4,
+  0x99d9, 0x99da, 0x99dc, 0x99de, 0x99e7, 0x99ea, 0x99eb, 0x99ec,
+  0x99f0, 0x99f4, 0x99f5, 0x99f9, 0x99fd, 0x99fe, 0x9a02, 0x9a03,
+  0x9a04, 0x9a0b, 0x9a0c, 0x9a10, 0x9a11, 0x9a16, 0x9a1e, 0x9a20,
+  0x9a22, 0x9a23, 0x9a24, 0x9a27, 0x9a2d, 0x9a2e, 0x9a33, 0x9a35,
+  0x9a36, 0x9a38, 0x9a47, 0x9a41, 0x9a44, 0x9a4a, 0x9a4b, 0x9a4c,
+  0x9a4e, 0x9a51, 0x9a54, 0x9a56, 0x9a5d, 0x9aaa, 0x9aac, 0x9aae,
+  0x9aaf, 0x9ab2, 0x9ab4, 0x9ab5, 0x9ab6, 0x9ab9, 0x9abb, 0x9abe,
+  0x9abf, 0x9ac1, 0x9ac3, 0x9ac6, 0x9ac8, 0x9ace, 0x9ad0, 0x9ad2,
+  0x9ad5, 0x9ad6, 0x9ad7, 0x9adb, 0x9adc, 0x9ae0, 0x9ae4, 0x9ae5,
+  0x9ae7, 0x9ae9, 0x9aec, 0x9af2, 0x9af3, 0x9af5, 0x9af9, 0x9afa,
+  0x9afd, 0x9aff, 0x9b00, 0x9b01, 0x9b02, 0x9b03,
+  /* 0x6a */
+  0x9b04, 0x9b05, 0x9b08, 0x9b09, 0x9b0b, 0x9b0c, 0x9b0d, 0x9b0e,
+  0x9b10, 0x9b12, 0x9b16, 0x9b19, 0x9b1b, 0x9b1c, 0x9b20, 0x9b26,
+  0x9b2b, 0x9b2d, 0x9b33, 0x9b34, 0x9b35, 0x9b37, 0x9b39, 0x9b3a,
+  0x9b3d, 0x9b48, 0x9b4b, 0x9b4c, 0x9b55, 0x9b56, 0x9b57, 0x9b5b,
+  0x9b5e, 0x9b61, 0x9b63, 0x9b65, 0x9b66, 0x9b68, 0x9b6a, 0x9b6b,
+  0x9b6c, 0x9b6d, 0x9b6e, 0x9b73, 0x9b75, 0x9b77, 0x9b78, 0x9b79,
+  0x9b7f, 0x9b80, 0x9b84, 0x9b85, 0x9b86, 0x9b87, 0x9b89, 0x9b8a,
+  0x9b8b, 0x9b8d, 0x9b8f, 0x9b90, 0x9b94, 0x9b9a, 0x9b9d, 0x9b9e,
+  0x9ba6, 0x9ba7, 0x9ba9, 0x9bac, 0x9bb0, 0x9bb1, 0x9bb2, 0x9bb7,
+  0x9bb8, 0x9bbb, 0x9bbc, 0x9bbe, 0x9bbf, 0x9bc1, 0x9bc7, 0x9bc8,
+  0x9bce, 0x9bd0, 0x9bd7, 0x9bd8, 0x9bdd, 0x9bdf, 0x9be5, 0x9be7,
+  0x9bea, 0x9beb, 0x9bef, 0x9bf3, 0x9bf7, 0x9bf8,
+  /* 0x6b */
+  0x9bf9, 0x9bfa, 0x9bfd, 0x9bff, 0x9c00, 0x9c02, 0x9c0b, 0x9c0f,
+  0x9c11, 0x9c16, 0x9c18, 0x9c19, 0x9c1a, 0x9c1c, 0x9c1e, 0x9c22,
+  0x9c23, 0x9c26, 0x9c27, 0x9c28, 0x9c29, 0x9c2a, 0x9c31, 0x9c35,
+  0x9c36, 0x9c37, 0x9c3d, 0x9c41, 0x9c43, 0x9c44, 0x9c45, 0x9c49,
+  0x9c4a, 0x9c4e, 0x9c4f, 0x9c50, 0x9c53, 0x9c54, 0x9c56, 0x9c58,
+  0x9c5b, 0x9c5d, 0x9c5e, 0x9c5f, 0x9c63, 0x9c69, 0x9c6a, 0x9c5c,
+  0x9c6b, 0x9c68, 0x9c6e, 0x9c70, 0x9c72, 0x9c75, 0x9c77, 0x9c7b,
+  0x9ce6, 0x9cf2, 0x9cf7, 0x9cf9, 0x9d0b, 0x9d02, 0x9d11, 0x9d17,
+  0x9d18, 0x9d1c, 0x9d1d, 0x9d1e, 0x9d2f, 0x9d30, 0x9d32, 0x9d33,
+  0x9d34, 0x9d3a, 0x9d3c, 0x9d45, 0x9d3d, 0x9d42, 0x9d43, 0x9d47,
+  0x9d4a, 0x9d53, 0x9d54, 0x9d5f, 0x9d63, 0x9d62, 0x9d65, 0x9d69,
+  0x9d6a, 0x9d6b, 0x9d70, 0x9d76, 0x9d77, 0x9d7b,
+  /* 0x6c */
+  0x9d7c, 0x9d7e, 0x9d83, 0x9d84, 0x9d86, 0x9d8a, 0x9d8d, 0x9d8e,
+  0x9d92, 0x9d93, 0x9d95, 0x9d96, 0x9d97, 0x9d98, 0x9da1, 0x9daa,
+  0x9dac, 0x9dae, 0x9db1, 0x9db5, 0x9db9, 0x9dbc, 0x9dbf, 0x9dc3,
+  0x9dc7, 0x9dc9, 0x9dca, 0x9dd4, 0x9dd5, 0x9dd6, 0x9dd7, 0x9dda,
+  0x9dde, 0x9ddf, 0x9de0, 0x9de5, 0x9de7, 0x9de9, 0x9deb, 0x9dee,
+  0x9df0, 0x9df3, 0x9df4, 0x9dfe, 0x9e0a, 0x9e02, 0x9e07, 0x9e0e,
+  0x9e10, 0x9e11, 0x9e12, 0x9e15, 0x9e16, 0x9e19, 0x9e1c, 0x9e1d,
+  0x9e7a, 0x9e7b, 0x9e7c, 0x9e80, 0x9e82, 0x9e83, 0x9e84, 0x9e85,
+  0x9e87, 0x9e8e, 0x9e8f, 0x9e96, 0x9e98, 0x9e9b, 0x9e9e, 0x9ea4,
+  0x9ea8, 0x9eac, 0x9eae, 0x9eaf, 0x9eb0, 0x9eb3, 0x9eb4, 0x9eb5,
+  0x9ec6, 0x9ec8, 0x9ecb, 0x9ed5, 0x9edf, 0x9ee4, 0x9ee7, 0x9eec,
+  0x9eed, 0x9eee, 0x9ef0, 0x9ef1, 0x9ef2, 0x9ef5,
+  /* 0x6d */
+  0x9ef8, 0x9eff, 0x9f02, 0x9f03, 0x9f09, 0x9f0f, 0x9f10, 0x9f11,
+  0x9f12, 0x9f14, 0x9f16, 0x9f17, 0x9f19, 0x9f1a, 0x9f1b, 0x9f1f,
+  0x9f22, 0x9f26, 0x9f2a, 0x9f2b, 0x9f2f, 0x9f31, 0x9f32, 0x9f34,
+  0x9f37, 0x9f39, 0x9f3a, 0x9f3c, 0x9f3d, 0x9f3f, 0x9f41, 0x9f43,
+  0x9f44, 0x9f45, 0x9f46, 0x9f47, 0x9f53, 0x9f55, 0x9f56, 0x9f57,
+  0x9f58, 0x9f5a, 0x9f5d, 0x9f5e, 0x9f68, 0x9f69, 0x9f6d, 0x9f6e,
+  0x9f6f, 0x9f70, 0x9f71, 0x9f73, 0x9f75, 0x9f7a, 0x9f7d, 0x9f8f,
+  0x9f90, 0x9f91, 0x9f92, 0x9f94, 0x9f96, 0x9f97, 0x9f9e, 0x9fa1,
+  0x9fa2, 0x9fa3, 0x9fa5,
+};
+
+static int
+jisx0212_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c1 = (s[0] & 0x7F);
+  if ((c1 == 0x22) || (c1 >= 0x26 && c1 <= 0x27) || (c1 >= 0x29 && c1 <= 0x2b) || (c1 >= 0x30 && c1 <= 0x6d)) {
+    if (n >= 2) {
+      unsigned char c2 = (s[1] & 0x7F);
+      if (c2 >= 0x21 && c2 < 0x7f) {
+        unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21);
+        unsigned short wc = 0xfffd;
+        if (i < 470) {
+          if (i < 175)
+            wc = jisx0212_2uni_page22[i-94];
+        } else if (i < 752) {
+          if (i < 658)
+            wc = jisx0212_2uni_page26[i-470];
+        } else if (i < 1410) {
+          if (i < 1027)
+            wc = jisx0212_2uni_page29[i-752];
+        } else {
+          if (i < 7211)
+            wc = jisx0212_2uni_page30[i-1410];
+        }
+        if (wc != 0xfffd) {
+          *pwc = (ucs4_t) wc;
+          return 2;
+        }
+      }
+      return RET_ILSEQ;
+    }
+    return RET_TOOFEW(0);
+  }
+  return RET_ILSEQ;
+}
+
+static const unsigned short jisx0212_2charset[6067] = {
+  0x2237, 0x2242, 0x2270, 0x2243, 0x226d, 0x226c, 0x226e, 0x2234,
+  0x2231, 0x226b, 0x2244, 0x2a22, 0x2a21, 0x2a24, 0x2a2a, 0x2a23,
+  0x2a29, 0x2921, 0x2a2e, 0x2a32, 0x2a31, 0x2a34, 0x2a33, 0x2a40,
+  0x2a3f, 0x2a42, 0x2a41, 0x2a50, 0x2a52, 0x2a51, 0x2a54, 0x2a58,
+  0x2a53, 0x292c, 0x2a63, 0x2a62, 0x2a65, 0x2a64, 0x2a72, 0x2930,
+  0x294e, 0x2b22, 0x2b21, 0x2b24, 0x2b2a, 0x2b23, 0x2b29, 0x2941,
+  0x2b2e, 0x2b32, 0x2b31, 0x2b34, 0x2b33, 0x2b40, 0x2b3f, 0x2b42,
+  0x2b41, 0x2943, 0x2b50, 0x2b52, 0x2b51, 0x2b54, 0x2b58, 0x2b53,
+  0x294c, 0x2b63, 0x2b62, 0x2b65, 0x2b64, 0x2b72, 0x2950, 0x2b73,
+  0x2a27, 0x2b27, 0x2a25, 0x2b25, 0x2a28, 0x2b28, 0x2a2b, 0x2b2b,
+  0x2a2c, 0x2b2c, 0x2a2f, 0x2b2f, 0x2a2d, 0x2b2d, 0x2a30, 0x2b30,
+  0x2922, 0x2942, 0x2a37, 0x2b37, 0x2a36, 0x2b36, 0x2a38, 0x2b38,
+  0x2a35, 0x2b35, 0x2a3a, 0x2b3a, 0x2a3b, 0x2b3b, 0x2a3d, 0x2b3d,
+  0x2a3c, 0x2a3e, 0x2b3e, 0x2924, 0x2944, 0x2a47, 0x2b47, 0x2a45,
+  0x2b45, 0x2a46, 0x2b46, 0x2a44, 0x2945, 0x2926, 0x2946, 0x2a48,
+  0x2b48, 0x2a49, 0x2b49, 0x2947, 0x2a4a, 0x2b4a, 0x2a4c, 0x2b4c,
+  0x2a4b, 0x2b4b, 0x2929, 0x2949, 0x2928, 0x2948, 0x2a4d, 0x2b4d,
+  0x2a4f, 0x2b4f, 0x2a4e, 0x2b4e, 0x294a, 0x292b, 0x294b, 0x2a57,
+  0x2b57, 0x2a56, 0x2b56, 0x292d, 0x294d, 0x2a59, 0x2b59, 0x2a5b,
+  0x2b5b, 0x2a5a, 0x2b5a, 0x2a5c, 0x2b5c, 0x2a5d, 0x2b5d, 0x2a5f,
+  0x2b5f, 0x2a5e, 0x2b5e, 0x2a61, 0x2b61, 0x2a60, 0x2b60, 0x292f,
+  0x294f, 0x2a6c, 0x2b6c, 0x2a69, 0x2b69, 0x2a66, 0x2b66, 0x2a6b,
+  0x2b6b, 0x2a68, 0x2b68, 0x2a6a, 0x2b6a, 0x2a71, 0x2b71, 0x2a74,
+  0x2b74, 0x2a73, 0x2a75, 0x2b75, 0x2a77, 0x2b77, 0x2a76, 0x2b76,
+  0x2a26, 0x2b26, 0x2a43, 0x2b43, 0x2a55, 0x2b55, 0x2a67, 0x2b67,
+  0x2a70, 0x2b70, 0x2a6d, 0x2b6d, 0x2a6f, 0x2b6f, 0x2a6e, 0x2b6e,
+  0x2b39, 0x2230, 0x222f, 0x2232, 0x2236, 0x2235, 0x2233, 0x2238,
+  0x2239, 0x2661, 0x2662, 0x2663, 0x2664, 0x2667, 0x2669, 0x266c,
+  0x2676, 0x2665, 0x266a, 0x2671, 0x2672, 0x2673, 0x2674, 0x267b,
+  0x2678, 0x2675, 0x267a, 0x2677, 0x2679, 0x267c, 0x2742, 0x2743,
+  0x2744, 0x2745, 0x2746, 0x2747, 0x2748, 0x2749, 0x274a, 0x274b,
+  0x274c, 0x274d, 0x274e, 0x2772, 0x2773, 0x2774, 0x2775, 0x2776,
+  0x2777, 0x2778, 0x2779, 0x277a, 0x277b, 0x277c, 0x277d, 0x277e,
+  0x2271, 0x226f, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026,
+  0x3027, 0x3028, 0x3029, 0x302a, 0x302b, 0x302c, 0x302d, 0x302e,
+  0x302f, 0x3030, 0x3031, 0x3032, 0x3033, 0x3034, 0x3035, 0x3036,
+  0x3037, 0x3038, 0x3039, 0x303a, 0x303b, 0x303c, 0x303d, 0x303e,
+  0x303f, 0x3040, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046,
+  0x3047, 0x3048, 0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e,
+  0x304f, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056,
+  0x3057, 0x3058, 0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e,
+  0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067,
+  0x3068, 0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f,
+  0x3070, 0x305f, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076,
+  0x3077, 0x3078, 0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e,
+  0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128,
+  0x3129, 0x312a, 0x312b, 0x312c, 0x312d, 0x312e, 0x312f, 0x3130,
+  0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3138,
+  0x3139, 0x313a, 0x313b, 0x313c, 0x313d, 0x313e, 0x313f, 0x3140,
+  0x3141, 0x3142, 0x3143, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148,
+  0x3149, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e, 0x314f, 0x3150,
+  0x3151, 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158,
+  0x3159, 0x315a, 0x315b, 0x315c, 0x315d, 0x315e, 0x3176, 0x315f,
+  0x3160, 0x3161, 0x3162, 0x3163, 0x3164, 0x3165, 0x3166, 0x3167,
+  0x3168, 0x3169, 0x316a, 0x316b, 0x316c, 0x316d, 0x316e, 0x316f,
+  0x3170, 0x3171, 0x3172, 0x3173, 0x3174, 0x3175, 0x3177, 0x3178,
+  0x3179, 0x317a, 0x317b, 0x317c, 0x317d, 0x317e, 0x3221, 0x3222,
+  0x3223, 0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229, 0x322a,
+  0x322b, 0x322c, 0x322d, 0x322e, 0x322f, 0x3230, 0x3231, 0x3232,
+  0x3233, 0x3234, 0x3235, 0x3236, 0x3237, 0x3238, 0x3239, 0x323a,
+  0x323b, 0x323c, 0x323d, 0x323e, 0x323f, 0x3240, 0x3241, 0x3242,
+  0x3243, 0x3244, 0x3245, 0x3251, 0x3246, 0x3247, 0x3248, 0x3249,
+  0x324a, 0x324b, 0x324c, 0x324d, 0x324e, 0x324f, 0x3250, 0x3252,
+  0x3253, 0x3254, 0x3255, 0x3256, 0x3257, 0x3258, 0x3259, 0x325a,
+  0x325b, 0x325c, 0x325d, 0x325e, 0x325f, 0x3260, 0x3261, 0x3262,
+  0x3263, 0x3264, 0x3265, 0x3266, 0x3267, 0x3268, 0x3269, 0x326a,
+  0x326b, 0x326c, 0x326d, 0x326e, 0x326f, 0x3270, 0x3271, 0x3272,
+  0x3273, 0x3274, 0x3275, 0x3276, 0x3277, 0x3278, 0x3279, 0x327a,
+  0x327b, 0x327c, 0x327d, 0x327e, 0x3321, 0x3322, 0x3323, 0x3324,
+  0x3325, 0x3326, 0x3327, 0x3328, 0x3329, 0x332a, 0x332b, 0x332c,
+  0x332d, 0x332e, 0x332f, 0x3330, 0x3331, 0x3332, 0x3333, 0x3334,
+  0x3335, 0x3336, 0x3337, 0x3338, 0x3339, 0x333a, 0x333b, 0x333c,
+  0x333d, 0x333e, 0x333f, 0x3340, 0x3341, 0x3342, 0x3343, 0x3344,
+  0x3345, 0x3346, 0x3347, 0x3348, 0x3349, 0x334a, 0x334b, 0x334c,
+  0x334d, 0x334e, 0x334f, 0x3350, 0x3351, 0x3352, 0x3353, 0x3354,
+  0x3355, 0x3356, 0x3357, 0x3358, 0x3359, 0x335a, 0x335b, 0x335c,
+  0x335d, 0x335e, 0x335f, 0x3360, 0x3361, 0x3362, 0x3363, 0x3364,
+  0x3365, 0x3366, 0x3367, 0x3368, 0x3369, 0x336a, 0x336b, 0x336c,
+  0x336d, 0x336e, 0x336f, 0x3370, 0x3371, 0x3372, 0x3373, 0x3374,
+  0x3375, 0x3376, 0x3377, 0x3378, 0x3379, 0x337a, 0x337b, 0x337c,
+  0x337d, 0x337e, 0x3421, 0x3422, 0x3423, 0x3424, 0x3425, 0x3426,
+  0x3427, 0x3428, 0x3429, 0x342a, 0x342b, 0x342c, 0x342d, 0x342e,
+  0x342f, 0x3430, 0x3431, 0x3432, 0x3433, 0x3434, 0x3435, 0x3436,
+  0x3438, 0x3437, 0x3439, 0x343a, 0x343b, 0x343c, 0x343d, 0x343e,
+  0x343f, 0x3440, 0x3441, 0x3442, 0x3443, 0x3444, 0x3445, 0x3446,
+  0x3447, 0x3448, 0x3449, 0x344a, 0x344b, 0x344c, 0x344d, 0x344e,
+  0x344f, 0x3450, 0x3451, 0x3452, 0x3453, 0x3454, 0x3455, 0x3456,
+  0x3457, 0x3458, 0x3459, 0x345a, 0x345b, 0x345c, 0x345d, 0x345e,
+  0x345f, 0x3460, 0x3461, 0x3462, 0x3463, 0x3464, 0x3465, 0x3466,
+  0x3467, 0x3468, 0x3469, 0x346a, 0x346b, 0x346c, 0x346d, 0x346e,
+  0x346f, 0x3470, 0x3471, 0x3472, 0x3473, 0x3474, 0x3475, 0x3476,
+  0x3477, 0x3478, 0x3479, 0x347a, 0x347b, 0x347c, 0x347d, 0x347e,
+  0x3521, 0x3522, 0x3523, 0x3524, 0x3525, 0x3526, 0x3527, 0x3528,
+  0x3529, 0x352a, 0x352b, 0x352c, 0x352d, 0x352e, 0x352f, 0x3530,
+  0x3531, 0x3532, 0x3533, 0x3534, 0x3535, 0x3536, 0x3537, 0x3538,
+  0x3539, 0x353a, 0x353b, 0x353c, 0x353d, 0x353e, 0x353f, 0x3540,
+  0x3541, 0x3542, 0x3543, 0x3544, 0x3545, 0x3546, 0x3547, 0x3548,
+  0x3549, 0x354a, 0x354b, 0x354c, 0x354d, 0x354e, 0x354f, 0x3550,
+  0x3551, 0x3552, 0x3553, 0x3554, 0x3555, 0x3556, 0x3557, 0x3558,
+  0x3559, 0x355a, 0x355b, 0x355c, 0x355d, 0x355e, 0x355f, 0x3560,
+  0x3561, 0x3562, 0x3563, 0x3564, 0x3565, 0x3566, 0x3567, 0x3568,
+  0x3569, 0x356a, 0x356b, 0x356c, 0x356d, 0x356e, 0x356f, 0x3570,
+  0x3571, 0x3572, 0x3573, 0x3574, 0x3575, 0x3576, 0x3577, 0x3578,
+  0x3579, 0x357a, 0x357b, 0x357c, 0x357d, 0x357e, 0x3621, 0x3622,
+  0x3623, 0x3624, 0x3625, 0x3626, 0x3627, 0x3628, 0x3629, 0x362a,
+  0x362b, 0x362c, 0x362d, 0x362e, 0x362f, 0x3630, 0x3631, 0x3632,
+  0x3633, 0x3634, 0x3635, 0x3636, 0x3637, 0x3638, 0x3639, 0x363a,
+  0x363b, 0x363c, 0x363d, 0x363e, 0x363f, 0x3640, 0x3641, 0x3642,
+  0x3643, 0x3644, 0x3645, 0x3646, 0x3647, 0x3648, 0x3649, 0x364a,
+  0x364b, 0x364c, 0x364d, 0x364e, 0x364f, 0x3650, 0x3651, 0x3652,
+  0x3653, 0x3654, 0x3655, 0x3656, 0x3657, 0x3658, 0x3659, 0x365a,
+  0x365b, 0x365c, 0x365d, 0x365e, 0x365f, 0x3660, 0x3661, 0x3662,
+  0x3663, 0x3664, 0x3665, 0x3666, 0x3667, 0x3668, 0x3669, 0x366a,
+  0x366b, 0x366c, 0x366d, 0x3670, 0x3671, 0x366e, 0x366f, 0x3672,
+  0x3673, 0x3674, 0x3675, 0x3676, 0x3677, 0x3678, 0x3679, 0x367a,
+  0x367b, 0x367d, 0x367e, 0x367c, 0x3721, 0x3722, 0x3723, 0x3724,
+  0x3725, 0x3726, 0x3727, 0x3728, 0x3729, 0x372a, 0x372b, 0x372c,
+  0x372d, 0x372e, 0x372f, 0x3730, 0x3731, 0x3732, 0x3733, 0x3734,
+  0x3735, 0x3736, 0x3737, 0x3738, 0x3739, 0x373a, 0x373b, 0x373c,
+  0x373d, 0x373e, 0x373f, 0x3740, 0x3741, 0x3742, 0x3743, 0x3744,
+  0x3745, 0x3746, 0x3747, 0x3748, 0x3749, 0x374a, 0x374b, 0x374c,
+  0x374d, 0x374e, 0x374f, 0x3750, 0x3751, 0x3752, 0x3753, 0x3754,
+  0x3755, 0x3756, 0x3757, 0x3760, 0x3758, 0x3759, 0x375a, 0x375b,
+  0x375c, 0x375d, 0x375e, 0x375f, 0x3761, 0x3762, 0x3763, 0x3764,
+  0x3765, 0x3766, 0x3767, 0x3768, 0x3769, 0x376a, 0x376b, 0x376c,
+  0x376d, 0x377e, 0x376e, 0x376f, 0x3770, 0x3771, 0x3772, 0x3773,
+  0x3774, 0x3775, 0x3776, 0x3777, 0x3778, 0x3779, 0x377a, 0x377b,
+  0x377c, 0x377d, 0x3821, 0x3822, 0x3823, 0x3824, 0x3825, 0x3826,
+  0x3827, 0x3828, 0x3829, 0x382a, 0x382b, 0x382c, 0x382d, 0x382e,
+  0x382f, 0x3830, 0x3831, 0x3832, 0x3833, 0x3834, 0x3835, 0x3836,
+  0x3837, 0x3838, 0x3839, 0x383a, 0x383b, 0x383c, 0x383d, 0x383e,
+  0x383f, 0x3840, 0x3841, 0x3842, 0x3843, 0x3844, 0x3845, 0x3846,
+  0x3847, 0x3848, 0x3849, 0x384a, 0x384b, 0x384c, 0x384d, 0x384e,
+  0x3850, 0x3851, 0x384f, 0x3852, 0x3853, 0x3854, 0x3855, 0x3856,
+  0x3857, 0x3858, 0x3859, 0x385a, 0x385b, 0x385c, 0x385d, 0x385e,
+  0x385f, 0x3860, 0x3861, 0x3862, 0x3863, 0x3864, 0x3865, 0x3867,
+  0x3868, 0x3869, 0x386a, 0x386b, 0x386c, 0x386d, 0x386e, 0x386f,
+  0x3870, 0x3871, 0x3872, 0x3873, 0x3874, 0x3875, 0x3876, 0x3877,
+  0x3878, 0x3879, 0x387a, 0x387b, 0x387c, 0x387d, 0x387e, 0x3921,
+  0x3922, 0x3923, 0x3924, 0x3925, 0x3926, 0x3927, 0x3928, 0x3929,
+  0x392a, 0x392b, 0x392c, 0x392d, 0x392e, 0x392f, 0x3930, 0x3931,
+  0x3932, 0x3933, 0x3934, 0x3935, 0x3936, 0x3937, 0x3938, 0x3939,
+  0x393a, 0x393b, 0x393c, 0x393d, 0x393e, 0x393f, 0x3940, 0x3941,
+  0x3942, 0x3943, 0x3944, 0x3945, 0x3946, 0x3947, 0x3948, 0x3949,
+  0x394a, 0x394b, 0x394c, 0x394d, 0x394e, 0x394f, 0x3950, 0x3951,
+  0x3952, 0x3953, 0x3954, 0x3955, 0x3956, 0x3957, 0x3958, 0x3959,
+  0x395a, 0x395b, 0x395c, 0x395d, 0x395e, 0x395f, 0x3960, 0x3961,
+  0x3962, 0x3963, 0x3964, 0x3965, 0x3966, 0x3967, 0x3968, 0x3969,
+  0x396a, 0x396b, 0x396c, 0x396d, 0x396e, 0x396f, 0x3970, 0x3971,
+  0x3972, 0x3973, 0x3974, 0x3975, 0x3976, 0x3977, 0x3978, 0x3979,
+  0x397a, 0x397b, 0x397c, 0x397d, 0x397e, 0x3a21, 0x3a22, 0x3a23,
+  0x3a24, 0x3a25, 0x3a26, 0x3a27, 0x3a28, 0x3a29, 0x3a2a, 0x3a2b,
+  0x3a2c, 0x3a2d, 0x3a2e, 0x3a2f, 0x3a30, 0x3a31, 0x3a33, 0x3a34,
+  0x3a35, 0x3a36, 0x3a37, 0x3a38, 0x3a32, 0x3a39, 0x3a3a, 0x3a3b,
+  0x3a3c, 0x3a3d, 0x3a3e, 0x3a3f, 0x3a40, 0x3a41, 0x3a42, 0x3a43,
+  0x3a44, 0x3a45, 0x3a46, 0x3a47, 0x3a48, 0x3a49, 0x3a4a, 0x3a4b,
+  0x3a4c, 0x3a4d, 0x3a4e, 0x3a4f, 0x3a50, 0x3a51, 0x3a52, 0x3a53,
+  0x3a54, 0x3a55, 0x3a56, 0x3a57, 0x3a58, 0x3a59, 0x3a5a, 0x3a5b,
+  0x3a5c, 0x3a5d, 0x3a5e, 0x3a5f, 0x3a60, 0x3a61, 0x3a62, 0x3a63,
+  0x3a64, 0x3a65, 0x3a66, 0x3a67, 0x3a68, 0x3a69, 0x3a6a, 0x3a6b,
+  0x3a6c, 0x3a6d, 0x3a6e, 0x3a6f, 0x3a70, 0x3a71, 0x3a72, 0x3a73,
+  0x3a74, 0x3a75, 0x3a76, 0x3a77, 0x3a78, 0x3a79, 0x3a7a, 0x3a7b,
+  0x3a7c, 0x3a7d, 0x3a7e, 0x3b21, 0x3b22, 0x3b23, 0x3b24, 0x3b25,
+  0x3b26, 0x3b27, 0x3b28, 0x3b29, 0x3b2a, 0x3b2b, 0x3b2c, 0x3b2d,
+  0x3b2e, 0x3b2f, 0x3b30, 0x3b31, 0x3b32, 0x3b33, 0x3b34, 0x3b35,
+  0x3b36, 0x3b37, 0x3b38, 0x3b39, 0x3b3a, 0x3b3b, 0x3b3d, 0x3b3c,
+  0x3b3e, 0x3b3f, 0x3b40, 0x3b41, 0x3b42, 0x3b43, 0x3b44, 0x3b45,
+  0x3b47, 0x3b48, 0x3b49, 0x3b4a, 0x3b46, 0x3b4b, 0x3b4c, 0x3b4d,
+  0x3b4e, 0x3b4f, 0x3b50, 0x3b51, 0x3b52, 0x3b53, 0x3b57, 0x3b55,
+  0x3b54, 0x3b56, 0x3b58, 0x3b59, 0x3b5a, 0x3b5b, 0x3b5c, 0x3b5d,
+  0x3b5e, 0x3b5f, 0x3b60, 0x3b61, 0x3b62, 0x3b63, 0x3b64, 0x3b65,
+  0x3b66, 0x3b67, 0x3b68, 0x3b69, 0x3b6a, 0x3b6b, 0x3b6c, 0x3b6d,
+  0x3b6e, 0x3b6f, 0x3b70, 0x3b71, 0x3b72, 0x6674, 0x3b73, 0x3b74,
+  0x3b75, 0x3b76, 0x3b77, 0x3b78, 0x3b7a, 0x3b79, 0x3b7b, 0x3b7c,
+  0x3b7d, 0x3b7e, 0x3c21, 0x3c22, 0x3c23, 0x3c24, 0x3c25, 0x3c26,
+  0x3c27, 0x3c28, 0x3c29, 0x3c2a, 0x3c2b, 0x3c2c, 0x3c2e, 0x3c2d,
+  0x3c2f, 0x3c30, 0x3c31, 0x3c34, 0x3c32, 0x3c33, 0x3c35, 0x3c36,
+  0x3c37, 0x3c38, 0x3c39, 0x3c3a, 0x3c3b, 0x3c3c, 0x3c3d, 0x3c3e,
+  0x3c3f, 0x3c40, 0x3c41, 0x3c42, 0x3c43, 0x3c44, 0x3c45, 0x3c46,
+  0x3c47, 0x3c48, 0x3c49, 0x3c4a, 0x3c4b, 0x3c4c, 0x3c4d, 0x3c4e,
+  0x3c4f, 0x3c50, 0x3c52, 0x3c51, 0x3c53, 0x3c54, 0x3c55, 0x3c56,
+  0x3c57, 0x3c58, 0x3c59, 0x3c5a, 0x3c5b, 0x3c5c, 0x3c5d, 0x3c5e,
+  0x3c5f, 0x3c60, 0x3c61, 0x3c62, 0x3c63, 0x3c64, 0x3c65, 0x3c66,
+  0x3c67, 0x3c68, 0x3c69, 0x3c6a, 0x3c6b, 0x3c6c, 0x3c6d, 0x3c6e,
+  0x3c6f, 0x3c70, 0x3c71, 0x3c72, 0x3c73, 0x3c74, 0x3c75, 0x3c76,
+  0x3c77, 0x3c78, 0x3c79, 0x3c7a, 0x3c7b, 0x3c7c, 0x3c7d, 0x3c7e,
+  0x3d21, 0x3d22, 0x3d23, 0x3d24, 0x3d25, 0x3d26, 0x3d27, 0x3d28,
+  0x3d29, 0x3d2a, 0x3d2b, 0x3d2c, 0x3d2d, 0x3d2e, 0x3d2f, 0x3d32,
+  0x3d30, 0x3d31, 0x3d33, 0x3d34, 0x3d35, 0x3d36, 0x3d37, 0x3d38,
+  0x3d39, 0x3d3a, 0x3d3b, 0x3d3c, 0x3d3d, 0x3d3e, 0x3d3f, 0x3d40,
+  0x3d41, 0x3d42, 0x3d43, 0x3d44, 0x3d45, 0x3d46, 0x3d47, 0x3d48,
+  0x3d49, 0x3d4a, 0x3d4b, 0x3d4c, 0x3d4d, 0x3d4e, 0x3d4f, 0x3d50,
+  0x3d51, 0x3d52, 0x3d53, 0x3d54, 0x3d55, 0x3d56, 0x3d57, 0x3d58,
+  0x3d59, 0x3d5a, 0x3d5b, 0x3d5c, 0x3d5d, 0x3d5e, 0x3d5f, 0x3d60,
+  0x3d61, 0x3d62, 0x3d63, 0x3d64, 0x3d65, 0x3d66, 0x3d67, 0x3d68,
+  0x3d69, 0x3d6a, 0x3d6b, 0x3d6c, 0x3d6d, 0x3d6e, 0x3d6f, 0x3d70,
+  0x3d71, 0x3d72, 0x3d73, 0x3d74, 0x3d75, 0x3d76, 0x3d77, 0x3d78,
+  0x3d79, 0x3d7a, 0x3d7b, 0x3d7c, 0x3d7d, 0x3d7e, 0x3e21, 0x3e22,
+  0x3e23, 0x3e24, 0x3e25, 0x3e26, 0x3e27, 0x3e28, 0x3e29, 0x3e2a,
+  0x3e2b, 0x3e2c, 0x3e2d, 0x3e2e, 0x3e2f, 0x3e30, 0x3e31, 0x3e32,
+  0x3e33, 0x3e34, 0x3e35, 0x3e36, 0x3e37, 0x3e38, 0x3e39, 0x3e3a,
+  0x3e3b, 0x3e3c, 0x3e3d, 0x3e3e, 0x3e3f, 0x3e40, 0x3e41, 0x3e42,
+  0x3e43, 0x3e44, 0x3e45, 0x3e46, 0x3e47, 0x3e48, 0x3e49, 0x3e4a,
+  0x3e4b, 0x3e4c, 0x3e4d, 0x3e4e, 0x3e4f, 0x3e50, 0x3e51, 0x3e52,
+  0x3e53, 0x3e54, 0x3e55, 0x3e56, 0x3e57, 0x3e58, 0x3e59, 0x3e5a,
+  0x3e5b, 0x3e5c, 0x3e5d, 0x3e5e, 0x3e5f, 0x3e60, 0x3e61, 0x3e62,
+  0x3e63, 0x3e64, 0x3e65, 0x3e66, 0x3e67, 0x3e68, 0x3e69, 0x3e6a,
+  0x3e6b, 0x3e6c, 0x3e6d, 0x3e6e, 0x3e6f, 0x3e70, 0x3e71, 0x3e72,
+  0x3e73, 0x3e74, 0x3e75, 0x3e76, 0x3e77, 0x3e78, 0x3e79, 0x3e7a,
+  0x3e7b, 0x3e7e, 0x3e7c, 0x3e7d, 0x3f21, 0x3f22, 0x3f23, 0x3f24,
+  0x3f25, 0x3f26, 0x3f27, 0x3f28, 0x3f29, 0x3f2a, 0x3f2b, 0x3f2c,
+  0x3f2d, 0x3f2e, 0x3f2f, 0x3f30, 0x3f31, 0x3f32, 0x3f33, 0x3f34,
+  0x3f35, 0x3f36, 0x3f37, 0x3f38, 0x3f39, 0x3f3a, 0x3f3b, 0x3f3c,
+  0x3f3d, 0x3f3e, 0x3f3f, 0x3f40, 0x3f41, 0x3f42, 0x3f43, 0x3f44,
+  0x3f45, 0x3f46, 0x3f47, 0x3f48, 0x3f49, 0x3f4a, 0x3f4b, 0x3f4c,
+  0x3f4d, 0x3f4e, 0x3f4f, 0x3f50, 0x3f51, 0x3f52, 0x3f53, 0x3f54,
+  0x3f55, 0x3f56, 0x3f57, 0x3f58, 0x3f59, 0x3f5a, 0x3f5b, 0x3f5c,
+  0x3f5d, 0x3f5e, 0x3f5f, 0x3f60, 0x3f61, 0x3f62, 0x3f63, 0x3f64,
+  0x3f65, 0x3f66, 0x3f67, 0x3f68, 0x3f69, 0x3f6a, 0x3f6b, 0x3f6c,
+  0x3f6d, 0x3f6e, 0x3f6f, 0x3f70, 0x3f71, 0x3f72, 0x3f73, 0x3f74,
+  0x3f75, 0x3f76, 0x3f77, 0x3f78, 0x3f79, 0x3f7a, 0x3f7b, 0x3f7c,
+  0x3f7d, 0x3f7e, 0x4021, 0x4022, 0x4023, 0x4024, 0x4025, 0x4026,
+  0x4027, 0x4028, 0x4029, 0x402a, 0x402b, 0x402c, 0x402d, 0x402e,
+  0x402f, 0x4030, 0x4031, 0x4032, 0x4033, 0x4034, 0x4035, 0x4036,
+  0x4037, 0x4038, 0x4039, 0x403a, 0x403b, 0x403c, 0x403d, 0x403e,
+  0x403f, 0x4040, 0x4041, 0x4042, 0x4043, 0x4044, 0x4045, 0x4046,
+  0x4047, 0x4048, 0x4049, 0x404a, 0x404b, 0x404c, 0x404d, 0x404e,
+  0x404f, 0x4050, 0x4051, 0x4052, 0x4053, 0x4054, 0x4055, 0x4056,
+  0x4057, 0x4058, 0x4059, 0x405a, 0x405b, 0x405c, 0x405d, 0x405e,
+  0x405f, 0x4060, 0x4061, 0x4062, 0x4063, 0x4064, 0x4065, 0x4066,
+  0x4067, 0x4068, 0x4069, 0x406a, 0x406b, 0x406c, 0x406d, 0x406e,
+  0x406f, 0x4070, 0x4071, 0x4072, 0x4073, 0x4074, 0x4075, 0x4076,
+  0x4077, 0x4078, 0x4079, 0x407a, 0x407b, 0x407c, 0x407d, 0x407e,
+  0x4121, 0x4122, 0x4123, 0x4124, 0x4125, 0x4126, 0x4127, 0x4128,
+  0x4129, 0x412a, 0x412b, 0x412c, 0x412d, 0x412e, 0x412f, 0x4130,
+  0x4131, 0x4132, 0x4133, 0x4134, 0x4135, 0x4136, 0x4137, 0x4138,
+  0x4139, 0x413a, 0x413b, 0x413c, 0x413d, 0x413e, 0x413f, 0x4140,
+  0x4141, 0x4142, 0x4143, 0x4144, 0x4145, 0x4146, 0x4147, 0x4148,
+  0x4149, 0x414a, 0x414b, 0x414c, 0x414d, 0x414e, 0x414f, 0x4150,
+  0x4151, 0x4152, 0x4153, 0x4154, 0x4155, 0x4156, 0x4157, 0x4158,
+  0x4159, 0x415a, 0x415b, 0x415c, 0x415d, 0x415e, 0x415f, 0x4160,
+  0x4161, 0x4162, 0x4163, 0x4164, 0x4165, 0x4166, 0x4167, 0x4168,
+  0x4169, 0x416a, 0x416b, 0x416c, 0x416d, 0x416e, 0x416f, 0x4170,
+  0x4171, 0x4172, 0x4173, 0x4174, 0x4175, 0x4176, 0x4177, 0x4178,
+  0x4179, 0x417a, 0x417b, 0x417c, 0x417d, 0x417e, 0x4221, 0x4222,
+  0x4223, 0x4224, 0x4225, 0x4226, 0x4227, 0x4228, 0x4229, 0x422a,
+  0x422b, 0x422c, 0x422d, 0x422e, 0x4230, 0x422f, 0x4231, 0x4232,
+  0x4233, 0x4234, 0x4235, 0x4237, 0x4236, 0x4238, 0x4239, 0x423a,
+  0x423b, 0x423c, 0x423d, 0x423e, 0x4240, 0x4241, 0x4242, 0x4244,
+  0x4245, 0x4247, 0x4248, 0x4249, 0x424a, 0x424c, 0x4243, 0x4246,
+  0x424b, 0x424d, 0x424e, 0x424f, 0x4250, 0x4251, 0x4252, 0x4253,
+  0x4254, 0x4255, 0x4256, 0x4257, 0x4258, 0x4259, 0x425a, 0x425b,
+  0x425c, 0x425d, 0x425e, 0x425f, 0x4260, 0x4261, 0x4262, 0x4263,
+  0x4264, 0x4265, 0x4266, 0x4267, 0x4268, 0x4269, 0x426a, 0x426b,
+  0x426c, 0x426d, 0x423f, 0x426e, 0x426f, 0x4270, 0x4271, 0x4272,
+  0x4273, 0x4274, 0x4275, 0x4276, 0x4277, 0x4278, 0x4279, 0x427a,
+  0x427b, 0x427c, 0x427d, 0x427e, 0x4321, 0x4322, 0x4323, 0x4324,
+  0x4325, 0x4326, 0x4327, 0x4328, 0x4329, 0x432a, 0x432b, 0x432c,
+  0x432d, 0x432e, 0x432f, 0x4330, 0x4331, 0x4332, 0x4333, 0x4334,
+  0x4335, 0x4336, 0x4337, 0x4339, 0x433a, 0x433b, 0x433c, 0x433d,
+  0x433e, 0x433f, 0x4340, 0x4341, 0x4342, 0x4343, 0x4344, 0x4345,
+  0x4346, 0x4347, 0x4348, 0x4338, 0x434a, 0x434b, 0x434c, 0x434d,
+  0x434f, 0x434e, 0x4350, 0x4351, 0x4352, 0x4353, 0x4354, 0x4355,
+  0x4356, 0x4357, 0x4358, 0x4359, 0x435a, 0x435b, 0x4349, 0x435c,
+  0x435d, 0x435e, 0x435f, 0x4360, 0x4361, 0x4362, 0x4363, 0x4364,
+  0x4365, 0x4366, 0x4367, 0x4368, 0x4369, 0x436a, 0x436b, 0x436c,
+  0x436d, 0x436e, 0x436f, 0x4370, 0x4371, 0x4372, 0x4373, 0x4374,
+  0x4375, 0x4376, 0x4377, 0x4378, 0x4379, 0x437a, 0x437b, 0x437c,
+  0x437d, 0x437e, 0x4421, 0x4422, 0x4423, 0x4424, 0x4425, 0x4426,
+  0x4427, 0x4428, 0x4429, 0x442a, 0x442b, 0x442c, 0x442d, 0x442e,
+  0x442f, 0x4430, 0x4431, 0x4432, 0x4433, 0x4434, 0x4435, 0x4436,
+  0x4437, 0x4438, 0x4439, 0x443a, 0x443b, 0x443c, 0x443d, 0x443e,
+  0x443f, 0x4440, 0x4441, 0x4442, 0x4443, 0x4444, 0x4445, 0x4446,
+  0x4447, 0x4448, 0x4449, 0x444a, 0x444b, 0x444c, 0x444d, 0x444e,
+  0x444f, 0x4450, 0x4451, 0x4452, 0x4453, 0x4454, 0x4455, 0x4456,
+  0x4457, 0x4458, 0x4459, 0x445a, 0x445b, 0x445c, 0x445d, 0x445e,
+  0x445f, 0x4460, 0x4461, 0x4462, 0x4463, 0x4464, 0x4465, 0x4466,
+  0x4467, 0x4468, 0x4469, 0x446a, 0x446b, 0x446c, 0x446d, 0x446e,
+  0x446f, 0x4470, 0x4471, 0x4472, 0x4473, 0x4474, 0x4475, 0x4476,
+  0x4477, 0x4478, 0x4479, 0x447a, 0x447b, 0x447c, 0x447d, 0x447e,
+  0x4521, 0x4522, 0x4523, 0x4524, 0x4525, 0x4526, 0x4527, 0x4528,
+  0x4529, 0x452a, 0x452b, 0x452c, 0x452d, 0x452e, 0x452f, 0x4530,
+  0x4531, 0x4532, 0x4533, 0x4534, 0x4535, 0x4536, 0x4537, 0x4538,
+  0x4539, 0x453a, 0x453b, 0x453c, 0x453d, 0x453e, 0x453f, 0x4540,
+  0x4541, 0x4542, 0x4543, 0x4544, 0x4545, 0x4546, 0x4547, 0x4548,
+  0x4549, 0x454a, 0x454b, 0x454d, 0x454c, 0x454e, 0x454f, 0x4550,
+  0x4551, 0x4552, 0x4553, 0x4554, 0x4555, 0x4556, 0x4557, 0x4558,
+  0x4559, 0x455a, 0x455b, 0x455c, 0x455d, 0x455e, 0x455f, 0x4560,
+  0x4561, 0x4562, 0x4563, 0x4564, 0x4565, 0x4566, 0x4567, 0x4568,
+  0x4569, 0x456a, 0x456b, 0x456c, 0x456d, 0x456e, 0x456f, 0x4570,
+  0x4571, 0x4572, 0x4573, 0x4574, 0x4575, 0x4576, 0x4577, 0x4578,
+  0x4579, 0x457a, 0x457b, 0x457c, 0x457d, 0x457e, 0x4621, 0x4622,
+  0x4623, 0x4624, 0x4625, 0x4626, 0x4627, 0x4628, 0x4629, 0x462a,
+  0x462b, 0x462c, 0x462d, 0x462e, 0x462f, 0x4630, 0x4631, 0x4632,
+  0x4633, 0x4634, 0x4635, 0x4636, 0x4637, 0x4638, 0x4639, 0x463a,
+  0x463b, 0x463c, 0x463d, 0x463e, 0x463f, 0x4640, 0x4641, 0x4642,
+  0x4643, 0x4644, 0x4645, 0x4646, 0x4647, 0x4648, 0x4649, 0x464a,
+  0x464b, 0x464c, 0x464d, 0x464e, 0x464f, 0x4650, 0x4651, 0x4652,
+  0x4653, 0x4654, 0x4655, 0x4656, 0x4657, 0x4658, 0x4659, 0x465a,
+  0x465b, 0x465c, 0x465d, 0x465e, 0x465f, 0x4660, 0x4736, 0x4661,
+  0x4662, 0x4663, 0x4664, 0x4665, 0x4666, 0x4667, 0x4668, 0x4669,
+  0x466a, 0x466b, 0x466c, 0x466d, 0x466e, 0x466f, 0x4670, 0x4671,
+  0x4672, 0x4673, 0x4674, 0x4675, 0x4676, 0x4677, 0x4678, 0x4679,
+  0x467a, 0x467b, 0x467c, 0x467d, 0x467e, 0x4721, 0x4722, 0x4723,
+  0x4724, 0x4725, 0x4726, 0x4727, 0x4728, 0x4729, 0x472a, 0x472b,
+  0x472c, 0x472d, 0x472e, 0x472f, 0x4730, 0x4731, 0x4732, 0x4733,
+  0x4734, 0x4735, 0x4737, 0x4738, 0x4739, 0x473a, 0x473b, 0x473c,
+  0x473d, 0x473e, 0x473f, 0x4740, 0x4741, 0x4742, 0x4743, 0x4744,
+  0x4745, 0x4746, 0x4747, 0x4748, 0x4749, 0x474a, 0x474b, 0x474c,
+  0x474d, 0x474e, 0x474f, 0x4750, 0x4751, 0x4752, 0x4753, 0x4754,
+  0x4755, 0x4756, 0x4757, 0x4758, 0x4759, 0x475a, 0x475b, 0x475c,
+  0x475d, 0x475e, 0x475f, 0x4760, 0x4761, 0x4762, 0x4763, 0x4764,
+  0x4765, 0x4766, 0x4767, 0x4768, 0x4769, 0x476a, 0x476b, 0x476c,
+  0x476d, 0x476e, 0x476f, 0x4770, 0x4771, 0x4772, 0x4773, 0x4774,
+  0x4775, 0x4776, 0x4777, 0x4778, 0x4779, 0x477a, 0x477b, 0x477c,
+  0x477d, 0x477e, 0x4821, 0x4822, 0x4823, 0x4824, 0x4825, 0x4826,
+  0x4827, 0x4828, 0x4829, 0x482a, 0x482b, 0x482c, 0x482d, 0x482e,
+  0x482f, 0x4830, 0x4831, 0x4832, 0x4833, 0x4834, 0x4835, 0x4836,
+  0x4837, 0x4838, 0x4839, 0x483a, 0x483b, 0x483c, 0x483d, 0x483e,
+  0x483f, 0x4840, 0x4841, 0x4842, 0x4843, 0x4844, 0x4845, 0x4846,
+  0x4847, 0x4848, 0x4849, 0x484a, 0x484b, 0x484c, 0x4853, 0x484d,
+  0x484e, 0x484f, 0x4850, 0x4851, 0x4852, 0x4854, 0x4855, 0x4856,
+  0x4857, 0x4858, 0x4859, 0x485a, 0x485b, 0x485c, 0x485d, 0x485e,
+  0x485f, 0x4860, 0x4861, 0x4862, 0x4863, 0x4864, 0x4865, 0x4866,
+  0x4867, 0x4868, 0x4869, 0x486a, 0x486b, 0x486c, 0x486d, 0x486e,
+  0x486f, 0x4870, 0x4871, 0x4872, 0x4873, 0x4874, 0x4875, 0x4876,
+  0x4877, 0x4878, 0x4879, 0x487a, 0x487b, 0x487c, 0x487d, 0x487e,
+  0x4921, 0x4922, 0x4923, 0x4924, 0x4925, 0x4926, 0x4927, 0x4928,
+  0x4929, 0x492a, 0x492b, 0x492c, 0x492d, 0x492e, 0x492f, 0x4930,
+  0x4931, 0x4932, 0x4933, 0x4934, 0x4935, 0x4936, 0x4937, 0x4938,
+  0x4939, 0x493a, 0x493b, 0x493c, 0x4941, 0x493d, 0x493e, 0x493f,
+  0x4940, 0x4942, 0x4943, 0x4944, 0x4945, 0x4946, 0x4947, 0x4948,
+  0x4949, 0x494a, 0x494b, 0x494c, 0x494d, 0x494e, 0x494f, 0x4950,
+  0x4951, 0x4952, 0x4953, 0x4954, 0x4955, 0x4956, 0x4957, 0x4958,
+  0x4959, 0x495a, 0x495b, 0x495c, 0x495d, 0x495e, 0x495f, 0x4960,
+  0x4961, 0x4962, 0x4963, 0x4964, 0x4965, 0x4966, 0x4967, 0x4968,
+  0x4969, 0x496a, 0x496b, 0x496c, 0x496d, 0x496e, 0x496f, 0x4970,
+  0x4971, 0x4972, 0x4973, 0x4974, 0x4975, 0x4976, 0x4977, 0x4978,
+  0x4979, 0x497a, 0x497b, 0x497c, 0x497d, 0x497e, 0x4a21, 0x4a22,
+  0x4a23, 0x4a24, 0x4a25, 0x4a26, 0x4a27, 0x4a28, 0x4a29, 0x4a2a,
+  0x4a2b, 0x4a2c, 0x4a2d, 0x4a2e, 0x4a2f, 0x4a30, 0x4a31, 0x4a32,
+  0x4a33, 0x4a34, 0x4a35, 0x4a36, 0x4a37, 0x4a38, 0x4a39, 0x4a3a,
+  0x4a3b, 0x4a3c, 0x4a3d, 0x4a3e, 0x4a3f, 0x4a40, 0x4a41, 0x4a42,
+  0x4a43, 0x4a44, 0x4a45, 0x4a46, 0x4a47, 0x4a48, 0x4a49, 0x4a4a,
+  0x4a4b, 0x4a4c, 0x4a4d, 0x4a4e, 0x4a4f, 0x4a50, 0x4a51, 0x4a52,
+  0x4a53, 0x4a54, 0x4a55, 0x4a56, 0x4a57, 0x4a58, 0x4a59, 0x4a5a,
+  0x4a5b, 0x4a5c, 0x4a5d, 0x4a5e, 0x4a5f, 0x4a60, 0x4a61, 0x4a62,
+  0x4a63, 0x4a64, 0x4a65, 0x4a66, 0x4a67, 0x4a68, 0x4a69, 0x4a6a,
+  0x4a6b, 0x4a6c, 0x4a6d, 0x4a6e, 0x4a6f, 0x4a70, 0x4a71, 0x4a72,
+  0x4a73, 0x4a74, 0x4a75, 0x4a76, 0x4a77, 0x4a78, 0x4a79, 0x4a7a,
+  0x4a7b, 0x4a7c, 0x4a7d, 0x4a7e, 0x4b21, 0x4b22, 0x4b23, 0x4b24,
+  0x4b25, 0x4b26, 0x4b27, 0x4b28, 0x4b29, 0x4b2a, 0x4b2b, 0x4b2c,
+  0x4b2d, 0x4b2e, 0x4b2f, 0x4b30, 0x4b31, 0x4b32, 0x4b33, 0x4b34,
+  0x4b35, 0x4b36, 0x4b37, 0x4b38, 0x4b39, 0x4b3a, 0x4b3b, 0x4b3c,
+  0x4b3d, 0x4b3e, 0x4b3f, 0x4b40, 0x4b41, 0x4b42, 0x4b43, 0x4b44,
+  0x4b45, 0x4b46, 0x4b47, 0x4b48, 0x4b49, 0x4b4a, 0x4b4b, 0x4b4c,
+  0x4b4d, 0x4b4e, 0x4b4f, 0x4b50, 0x4b51, 0x4b52, 0x4b53, 0x4b54,
+  0x4b55, 0x4b56, 0x4b57, 0x4b58, 0x4b59, 0x4b5a, 0x4b5b, 0x4b5c,
+  0x4b5d, 0x4b5e, 0x4b5f, 0x4b60, 0x4b61, 0x4b62, 0x4b63, 0x4b64,
+  0x4b65, 0x4b66, 0x4b67, 0x4b68, 0x4b69, 0x4b6a, 0x4b6b, 0x4b6c,
+  0x4b6d, 0x4b6e, 0x4b6f, 0x4b70, 0x4b71, 0x4b72, 0x4b73, 0x4b74,
+  0x4b75, 0x4b76, 0x4b77, 0x4b78, 0x4b79, 0x4b7a, 0x4b7b, 0x4b7c,
+  0x4b7d, 0x4b7e, 0x4c21, 0x4c22, 0x4c23, 0x4c24, 0x4c25, 0x4c26,
+  0x4c27, 0x4c28, 0x4c29, 0x4c2a, 0x4c2b, 0x4c2c, 0x4c2d, 0x4c2e,
+  0x4c2f, 0x4c30, 0x4c31, 0x4c32, 0x4c33, 0x4c34, 0x4c35, 0x4c36,
+  0x4c37, 0x4c38, 0x4c39, 0x4c3a, 0x4c3b, 0x4c3c, 0x4c3d, 0x4c3e,
+  0x4c3f, 0x4c40, 0x4c41, 0x4c42, 0x4c43, 0x4c44, 0x4c45, 0x4c46,
+  0x4c47, 0x4c48, 0x4c49, 0x4c4a, 0x4c4b, 0x4c4c, 0x4c4d, 0x4c4e,
+  0x4c4f, 0x4c50, 0x4c51, 0x4c52, 0x4c53, 0x4c54, 0x4c55, 0x4c56,
+  0x4c57, 0x4c58, 0x4c59, 0x4c5a, 0x4c5b, 0x4c5c, 0x4c5d, 0x4c5e,
+  0x4c5f, 0x4c60, 0x4c61, 0x4c62, 0x4c63, 0x4c64, 0x4c65, 0x4c66,
+  0x4c67, 0x4c68, 0x4c69, 0x4c6a, 0x4c6b, 0x4c6c, 0x4c6d, 0x4c6e,
+  0x4c6f, 0x4c70, 0x4c71, 0x4c72, 0x4c73, 0x4c74, 0x4c75, 0x4c76,
+  0x4c77, 0x4c78, 0x4c79, 0x4c7a, 0x4c7b, 0x4c7c, 0x4c7d, 0x4c7e,
+  0x4d21, 0x4d22, 0x4d23, 0x4d24, 0x4d25, 0x4d26, 0x4d27, 0x4d28,
+  0x4d29, 0x4d2a, 0x4d2b, 0x4d2c, 0x4d2d, 0x4d2e, 0x4d2f, 0x4d30,
+  0x4d31, 0x4d32, 0x4d33, 0x4d34, 0x4d35, 0x4d36, 0x4d37, 0x4d38,
+  0x4d39, 0x4d3a, 0x4d3b, 0x4d3c, 0x4d3d, 0x4d3e, 0x4d3f, 0x4d40,
+  0x4d41, 0x4d42, 0x4d43, 0x4d44, 0x4d45, 0x4d46, 0x4d47, 0x4d48,
+  0x4d49, 0x4d4a, 0x4d4b, 0x4d4c, 0x4d4d, 0x4d4e, 0x4d4f, 0x4d50,
+  0x4d51, 0x4d52, 0x4d53, 0x4d54, 0x4d55, 0x4d56, 0x4d57, 0x4d58,
+  0x4d59, 0x4d5a, 0x4d5b, 0x4d5c, 0x4d5d, 0x4d5e, 0x4d5f, 0x4d60,
+  0x4d61, 0x4d62, 0x4d63, 0x4d64, 0x4d65, 0x4d66, 0x4d67, 0x4d68,
+  0x4d69, 0x4d6a, 0x4d6b, 0x4d6c, 0x4d6d, 0x4d6e, 0x4d6f, 0x4d70,
+  0x4d71, 0x4d72, 0x4d73, 0x4d74, 0x4d75, 0x4d76, 0x4d77, 0x4d78,
+  0x4d79, 0x4d7a, 0x4d7b, 0x4d7c, 0x4d7d, 0x4d7e, 0x4e21, 0x4e22,
+  0x4e24, 0x4e25, 0x4e26, 0x4e27, 0x4e28, 0x4e29, 0x4e23, 0x4e2a,
+  0x4e2b, 0x4e2c, 0x4e2d, 0x4e2e, 0x4e2f, 0x4e30, 0x4e31, 0x4e32,
+  0x4e33, 0x4e34, 0x4e35, 0x4e36, 0x4e37, 0x4e38, 0x4e39, 0x4e3a,
+  0x4e3b, 0x4e3c, 0x4e3d, 0x4e3e, 0x4e3f, 0x4e40, 0x4e41, 0x4e42,
+  0x4e43, 0x4e44, 0x4e45, 0x4e46, 0x4e47, 0x4e48, 0x4e49, 0x4e4a,
+  0x4e4b, 0x4e4c, 0x4e4d, 0x4e4e, 0x4e4f, 0x4e50, 0x4e51, 0x4e52,
+  0x4e53, 0x4e54, 0x4e55, 0x4e56, 0x4e57, 0x4e58, 0x4e59, 0x4e5a,
+  0x4e5b, 0x4e5c, 0x4e5d, 0x4e5e, 0x4e5f, 0x4e60, 0x4e61, 0x4e62,
+  0x4e63, 0x4e64, 0x4e65, 0x4e66, 0x4e67, 0x4e68, 0x4e69, 0x4e6a,
+  0x4e6b, 0x4e6c, 0x4e6d, 0x4e6e, 0x4e6f, 0x4e70, 0x4e71, 0x4e72,
+  0x4e73, 0x4e74, 0x4e75, 0x4e76, 0x4e77, 0x4e78, 0x4e79, 0x4e7a,
+  0x4e7b, 0x4e7c, 0x4e7d, 0x4e7e, 0x4f21, 0x4f22, 0x4f23, 0x4f24,
+  0x4f25, 0x4f26, 0x4f27, 0x4f28, 0x4f29, 0x4f2a, 0x4f2b, 0x4f2c,
+  0x4f2d, 0x4f2e, 0x4f2f, 0x4f30, 0x4f31, 0x4f32, 0x4f33, 0x4f34,
+  0x4f35, 0x4f36, 0x4f37, 0x4f38, 0x4f39, 0x4f3a, 0x4f3b, 0x4f3c,
+  0x4f3d, 0x4f3e, 0x4f3f, 0x4f40, 0x4f41, 0x4f42, 0x4f43, 0x4f44,
+  0x4f45, 0x4f46, 0x4f47, 0x4f48, 0x4f49, 0x4f4a, 0x4f4b, 0x4f4c,
+  0x4f4d, 0x4f4e, 0x4f4f, 0x4f50, 0x4f51, 0x4f52, 0x4f53, 0x4f54,
+  0x4f55, 0x4f56, 0x4f57, 0x4f58, 0x4f59, 0x4f5a, 0x4f5b, 0x4f5c,
+  0x4f5d, 0x4f5e, 0x4f5f, 0x4f60, 0x4f61, 0x4f62, 0x4f63, 0x4f64,
+  0x4f65, 0x4f66, 0x4f67, 0x4f68, 0x4f69, 0x4f6a, 0x4f6b, 0x4f6c,
+  0x4f6d, 0x4f6e, 0x4f6f, 0x4f70, 0x4f71, 0x4f72, 0x4f74, 0x4f75,
+  0x4f76, 0x4f73, 0x4f77, 0x4f78, 0x4f79, 0x4f7a, 0x4f7b, 0x4f7c,
+  0x4f7d, 0x4f7e, 0x5021, 0x5022, 0x5023, 0x5024, 0x5025, 0x5026,
+  0x5027, 0x5028, 0x5029, 0x502a, 0x502b, 0x502c, 0x502e, 0x502f,
+  0x5030, 0x5031, 0x502d, 0x5032, 0x5033, 0x5034, 0x5035, 0x5037,
+  0x5038, 0x5039, 0x503a, 0x503b, 0x5036, 0x503c, 0x503d, 0x503e,
+  0x503f, 0x5040, 0x5041, 0x5042, 0x5043, 0x5044, 0x5045, 0x5046,
+  0x5047, 0x5048, 0x5049, 0x504a, 0x504b, 0x504c, 0x504d, 0x504e,
+  0x504f, 0x5050, 0x5051, 0x5052, 0x5053, 0x5054, 0x5055, 0x5056,
+  0x5057, 0x5058, 0x5059, 0x505a, 0x505b, 0x505c, 0x505d, 0x505e,
+  0x505f, 0x5060, 0x5061, 0x5062, 0x5063, 0x5064, 0x5065, 0x5066,
+  0x5067, 0x5068, 0x5069, 0x506a, 0x506b, 0x506c, 0x506d, 0x506e,
+  0x506f, 0x5070, 0x5071, 0x5072, 0x5073, 0x5074, 0x5075, 0x5076,
+  0x5077, 0x5078, 0x5079, 0x507a, 0x507b, 0x507c, 0x507d, 0x507e,
+  0x5121, 0x5122, 0x5123, 0x5124, 0x5125, 0x5126, 0x5127, 0x5128,
+  0x5129, 0x512a, 0x512b, 0x512c, 0x512d, 0x512e, 0x512f, 0x5130,
+  0x5131, 0x5132, 0x5133, 0x5134, 0x5135, 0x5136, 0x5137, 0x5138,
+  0x5139, 0x513a, 0x513b, 0x513c, 0x513d, 0x513e, 0x513f, 0x5140,
+  0x5141, 0x5142, 0x5143, 0x5144, 0x5145, 0x5146, 0x5147, 0x5148,
+  0x5149, 0x514a, 0x514b, 0x514c, 0x514d, 0x514e, 0x514f, 0x5150,
+  0x5151, 0x5152, 0x5153, 0x5154, 0x5155, 0x5156, 0x5157, 0x5158,
+  0x5159, 0x515a, 0x515b, 0x515c, 0x515d, 0x515e, 0x515f, 0x5160,
+  0x5161, 0x5162, 0x5163, 0x5164, 0x5165, 0x5166, 0x5167, 0x5168,
+  0x5169, 0x516a, 0x516b, 0x516c, 0x516d, 0x516e, 0x516f, 0x5170,
+  0x5171, 0x5172, 0x5173, 0x5174, 0x5175, 0x5176, 0x5177, 0x5178,
+  0x5179, 0x517a, 0x517b, 0x517c, 0x517d, 0x517e, 0x5221, 0x5222,
+  0x5223, 0x5224, 0x5225, 0x5226, 0x5227, 0x5228, 0x5229, 0x522a,
+  0x522b, 0x522c, 0x522d, 0x522e, 0x522f, 0x5230, 0x5231, 0x5232,
+  0x5233, 0x5234, 0x5235, 0x5236, 0x5237, 0x5238, 0x5239, 0x523a,
+  0x523b, 0x523c, 0x523d, 0x523e, 0x523f, 0x5240, 0x5241, 0x5242,
+  0x5243, 0x5244, 0x5245, 0x5246, 0x5247, 0x5248, 0x5249, 0x524a,
+  0x524b, 0x524c, 0x524d, 0x524e, 0x524f, 0x5250, 0x5251, 0x5252,
+  0x5253, 0x5254, 0x5255, 0x5256, 0x5257, 0x5258, 0x5259, 0x525a,
+  0x525b, 0x525c, 0x525d, 0x525e, 0x525f, 0x5260, 0x5261, 0x5262,
+  0x5263, 0x5264, 0x5265, 0x5266, 0x5267, 0x5268, 0x5269, 0x526a,
+  0x526b, 0x526c, 0x526d, 0x526e, 0x526f, 0x5270, 0x5271, 0x5272,
+  0x5273, 0x5274, 0x5276, 0x5277, 0x5278, 0x5275, 0x5279, 0x527a,
+  0x527b, 0x527c, 0x527d, 0x527e, 0x5321, 0x5322, 0x5323, 0x5324,
+  0x5325, 0x5326, 0x5327, 0x5328, 0x5329, 0x532a, 0x532b, 0x532c,
+  0x532d, 0x532e, 0x532f, 0x5330, 0x5331, 0x5332, 0x5333, 0x5334,
+  0x5335, 0x5336, 0x5337, 0x5338, 0x5339, 0x533a, 0x533b, 0x533c,
+  0x533d, 0x533e, 0x533f, 0x5340, 0x5341, 0x5342, 0x5343, 0x5344,
+  0x5345, 0x5346, 0x5347, 0x5348, 0x5349, 0x534a, 0x534b, 0x534c,
+  0x534d, 0x534e, 0x534f, 0x5350, 0x5351, 0x5352, 0x5353, 0x5354,
+  0x5355, 0x5356, 0x5357, 0x5358, 0x5359, 0x535a, 0x535b, 0x535c,
+  0x535d, 0x535e, 0x535f, 0x5360, 0x5361, 0x5362, 0x5363, 0x5364,
+  0x5365, 0x5366, 0x5367, 0x5368, 0x5369, 0x536a, 0x536b, 0x536c,
+  0x536d, 0x536e, 0x536f, 0x5370, 0x5371, 0x5372, 0x5373, 0x5374,
+  0x5375, 0x5376, 0x5377, 0x5378, 0x5379, 0x537a, 0x537b, 0x537c,
+  0x537d, 0x537e, 0x5421, 0x5422, 0x5423, 0x5424, 0x5425, 0x5426,
+  0x5427, 0x5428, 0x5429, 0x542a, 0x542b, 0x542c, 0x542d, 0x542e,
+  0x542f, 0x5430, 0x5431, 0x5432, 0x5434, 0x5435, 0x5436, 0x5437,
+  0x5438, 0x5439, 0x543a, 0x543b, 0x543c, 0x543d, 0x543e, 0x5433,
+  0x543f, 0x5440, 0x5441, 0x5442, 0x5443, 0x5444, 0x5445, 0x5446,
+  0x5447, 0x5448, 0x5449, 0x544a, 0x544b, 0x544c, 0x544d, 0x544e,
+  0x544f, 0x5450, 0x5451, 0x5452, 0x5453, 0x5454, 0x5455, 0x5456,
+  0x5457, 0x5458, 0x5459, 0x545a, 0x545b, 0x545c, 0x545d, 0x545e,
+  0x545f, 0x5460, 0x5461, 0x5462, 0x5463, 0x5464, 0x5465, 0x5466,
+  0x5467, 0x5468, 0x5469, 0x546a, 0x546c, 0x546b, 0x546d, 0x546e,
+  0x546f, 0x5470, 0x5471, 0x5472, 0x5473, 0x5474, 0x5475, 0x5476,
+  0x5477, 0x5478, 0x5479, 0x547a, 0x547b, 0x547c, 0x547d, 0x547e,
+  0x5521, 0x5522, 0x5523, 0x5524, 0x5525, 0x5526, 0x5527, 0x5528,
+  0x5529, 0x552a, 0x552b, 0x552c, 0x552d, 0x552e, 0x552f, 0x5530,
+  0x5531, 0x5532, 0x5533, 0x5534, 0x5535, 0x5536, 0x5537, 0x5538,
+  0x5539, 0x553a, 0x553b, 0x553c, 0x553d, 0x553e, 0x553f, 0x5540,
+  0x5541, 0x5542, 0x5543, 0x5544, 0x5545, 0x5546, 0x5547, 0x5548,
+  0x5549, 0x554a, 0x554b, 0x554c, 0x554d, 0x554e, 0x554f, 0x5550,
+  0x5551, 0x5552, 0x5553, 0x5554, 0x5555, 0x5556, 0x5557, 0x5558,
+  0x5559, 0x555a, 0x555b, 0x555c, 0x555d, 0x555e, 0x555f, 0x5560,
+  0x5561, 0x5562, 0x5563, 0x5564, 0x5565, 0x5566, 0x5567, 0x5568,
+  0x5569, 0x556a, 0x556b, 0x556c, 0x556d, 0x556e, 0x556f, 0x5570,
+  0x5571, 0x5572, 0x5573, 0x5574, 0x5575, 0x5576, 0x5577, 0x5578,
+  0x5579, 0x557a, 0x557b, 0x557c, 0x557d, 0x557e, 0x5621, 0x5622,
+  0x5623, 0x5624, 0x5625, 0x5626, 0x5627, 0x5628, 0x5629, 0x562a,
+  0x562b, 0x562c, 0x562d, 0x562e, 0x562f, 0x5630, 0x5631, 0x5632,
+  0x5633, 0x5634, 0x5635, 0x5636, 0x5637, 0x5638, 0x5639, 0x563a,
+  0x563b, 0x563c, 0x563d, 0x563e, 0x563f, 0x5640, 0x5641, 0x5642,
+  0x5643, 0x5644, 0x5645, 0x5647, 0x5648, 0x5649, 0x564a, 0x564b,
+  0x5646, 0x564c, 0x564d, 0x564e, 0x564f, 0x5650, 0x5651, 0x5652,
+  0x5653, 0x5654, 0x5656, 0x5657, 0x5658, 0x5655, 0x5659, 0x565a,
+  0x565b, 0x565c, 0x565d, 0x565e, 0x565f, 0x5660, 0x5661, 0x5662,
+  0x5663, 0x5664, 0x5665, 0x5666, 0x5667, 0x5668, 0x5669, 0x566a,
+  0x566b, 0x566c, 0x566d, 0x566e, 0x566f, 0x5670, 0x5671, 0x5672,
+  0x5673, 0x5674, 0x5675, 0x5676, 0x5677, 0x5678, 0x5679, 0x567a,
+  0x567b, 0x567c, 0x567d, 0x567e, 0x5721, 0x5722, 0x5723, 0x5724,
+  0x5725, 0x5726, 0x5727, 0x5728, 0x5729, 0x572a, 0x572b, 0x572c,
+  0x572d, 0x572e, 0x572f, 0x5730, 0x5731, 0x5732, 0x5733, 0x5734,
+  0x5735, 0x5736, 0x5737, 0x5738, 0x5739, 0x573a, 0x573b, 0x573c,
+  0x573d, 0x573e, 0x573f, 0x5740, 0x5741, 0x5742, 0x5743, 0x5744,
+  0x5745, 0x5746, 0x5747, 0x5748, 0x5749, 0x574a, 0x574b, 0x574c,
+  0x574d, 0x574e, 0x574f, 0x5750, 0x5751, 0x5752, 0x5753, 0x5754,
+  0x5755, 0x5756, 0x5757, 0x5758, 0x5759, 0x575a, 0x575b, 0x575c,
+  0x575d, 0x575e, 0x575f, 0x5760, 0x5761, 0x5762, 0x5764, 0x5765,
+  0x5766, 0x5767, 0x5768, 0x5769, 0x576a, 0x576b, 0x576c, 0x576d,
+  0x576e, 0x576f, 0x5770, 0x5771, 0x5772, 0x5773, 0x5774, 0x5775,
+  0x5776, 0x5777, 0x5778, 0x5779, 0x583e, 0x5763, 0x577a, 0x577b,
+  0x577c, 0x577d, 0x577e, 0x5821, 0x5822, 0x5823, 0x5824, 0x5825,
+  0x5826, 0x5827, 0x5828, 0x5829, 0x582a, 0x582b, 0x582c, 0x582d,
+  0x582e, 0x582f, 0x5830, 0x5831, 0x5832, 0x5833, 0x584c, 0x5834,
+  0x5835, 0x5836, 0x5837, 0x5838, 0x5839, 0x583a, 0x583b, 0x583c,
+  0x583d, 0x583f, 0x5840, 0x5841, 0x5842, 0x5843, 0x5844, 0x5845,
+  0x5846, 0x5847, 0x5848, 0x5849, 0x584a, 0x584b, 0x584d, 0x584e,
+  0x584f, 0x5850, 0x5851, 0x5852, 0x5853, 0x5854, 0x5855, 0x5856,
+  0x5857, 0x5858, 0x5859, 0x585a, 0x585b, 0x585c, 0x585d, 0x585e,
+  0x585f, 0x5860, 0x5861, 0x5862, 0x5863, 0x5864, 0x5865, 0x5866,
+  0x5867, 0x5868, 0x5869, 0x586a, 0x586b, 0x586c, 0x586d, 0x586e,
+  0x586f, 0x5870, 0x5871, 0x5872, 0x5873, 0x5874, 0x5875, 0x5876,
+  0x5877, 0x5878, 0x5879, 0x587a, 0x587b, 0x587c, 0x587d, 0x587e,
+  0x5921, 0x5922, 0x5923, 0x5924, 0x5925, 0x5926, 0x5927, 0x5928,
+  0x592a, 0x592b, 0x592c, 0x592d, 0x592e, 0x592f, 0x5930, 0x5931,
+  0x5932, 0x5933, 0x5934, 0x5935, 0x5936, 0x5937, 0x5938, 0x5939,
+  0x593a, 0x593b, 0x593c, 0x5929, 0x593d, 0x593e, 0x593f, 0x5940,
+  0x5941, 0x5942, 0x5943, 0x5944, 0x5945, 0x5946, 0x5947, 0x5948,
+  0x5949, 0x594a, 0x594b, 0x594c, 0x594d, 0x594e, 0x594f, 0x5950,
+  0x5951, 0x5952, 0x5953, 0x5954, 0x5955, 0x5956, 0x5957, 0x5958,
+  0x5959, 0x595a, 0x595b, 0x595c, 0x595d, 0x595e, 0x595f, 0x5960,
+  0x5961, 0x5962, 0x5963, 0x5964, 0x5965, 0x5966, 0x5974, 0x5967,
+  0x5968, 0x5969, 0x596a, 0x596b, 0x596c, 0x596d, 0x596e, 0x596f,
+  0x5970, 0x5971, 0x5972, 0x5973, 0x5975, 0x5976, 0x5977, 0x5978,
+  0x5979, 0x597a, 0x597b, 0x597c, 0x597d, 0x597e, 0x5a21, 0x5a22,
+  0x5a23, 0x5a24, 0x5a25, 0x5a26, 0x5a27, 0x5a28, 0x5a29, 0x5a2a,
+  0x5a2b, 0x5a2c, 0x5a2d, 0x5a2e, 0x5a2f, 0x5a30, 0x5a31, 0x5a32,
+  0x5a33, 0x5a34, 0x5a35, 0x5a36, 0x3866, 0x5a37, 0x5a38, 0x5a39,
+  0x5a3a, 0x5a3b, 0x5a3c, 0x5a3d, 0x5a3e, 0x5a3f, 0x5a40, 0x5a41,
+  0x5a42, 0x5a43, 0x5a44, 0x5a45, 0x5a46, 0x5a47, 0x5a48, 0x5a49,
+  0x5a4a, 0x5a4b, 0x5a6d, 0x5a4c, 0x5a4d, 0x5a4e, 0x5a4f, 0x5a50,
+  0x5a51, 0x5a52, 0x5a53, 0x5a54, 0x5a55, 0x5a56, 0x5a57, 0x5a58,
+  0x5a59, 0x5a5a, 0x5a5b, 0x5a5c, 0x5a5d, 0x5a5e, 0x5a5f, 0x5a60,
+  0x5a61, 0x5a62, 0x5a63, 0x5a64, 0x5a65, 0x5a66, 0x5a67, 0x5a68,
+  0x5a69, 0x5a6a, 0x5a6b, 0x5a6c, 0x5a6e, 0x5a6f, 0x5a70, 0x5a71,
+  0x5a72, 0x5a73, 0x5a74, 0x5a75, 0x5a76, 0x5a77, 0x5a78, 0x5a79,
+  0x5a7a, 0x5a7b, 0x5a7c, 0x5a7d, 0x5a7e, 0x5b21, 0x5b22, 0x5b23,
+  0x5b24, 0x5b25, 0x5b26, 0x5b27, 0x5b28, 0x5b29, 0x5b2a, 0x5b2b,
+  0x5b2c, 0x5b2d, 0x5b2e, 0x5b2f, 0x5b30, 0x5b31, 0x5b32, 0x5b33,
+  0x5b34, 0x5b35, 0x5b36, 0x5b37, 0x5b38, 0x5b39, 0x5b3a, 0x5b3b,
+  0x5b3c, 0x5b3d, 0x5b3e, 0x5b3f, 0x5b40, 0x5b41, 0x5b42, 0x5b43,
+  0x5b44, 0x5b45, 0x5b46, 0x5b47, 0x5b48, 0x5b49, 0x5b4a, 0x5b4b,
+  0x5b4c, 0x5b4d, 0x5b4e, 0x5b4f, 0x5b50, 0x5b51, 0x5b52, 0x5b53,
+  0x5b54, 0x5b55, 0x5b56, 0x5b57, 0x5b58, 0x5b59, 0x5b5a, 0x5b5b,
+  0x5b5c, 0x5b5d, 0x5b5e, 0x5b5f, 0x5b60, 0x5b61, 0x5b62, 0x5b63,
+  0x5b64, 0x5b65, 0x5b66, 0x5b67, 0x5b68, 0x5b69, 0x5b6a, 0x5b6b,
+  0x5b6c, 0x5b6d, 0x5b6e, 0x5b70, 0x5b71, 0x5b72, 0x5b73, 0x5b6f,
+  0x5b74, 0x5b75, 0x5b76, 0x5b77, 0x5b78, 0x5b79, 0x5b7a, 0x5b7b,
+  0x5b7c, 0x5b7d, 0x5b7e, 0x5c21, 0x5c22, 0x5c23, 0x5c24, 0x5c25,
+  0x5c26, 0x5c27, 0x5c28, 0x5c29, 0x5c2a, 0x5c2b, 0x5c2c, 0x5c2d,
+  0x5c2e, 0x5c2f, 0x5c30, 0x5c31, 0x5c32, 0x5c33, 0x5c34, 0x5c35,
+  0x5c36, 0x5c37, 0x5c38, 0x5c39, 0x5c3a, 0x5c3b, 0x5c3c, 0x5c3d,
+  0x5c3e, 0x5c3f, 0x5c40, 0x5c41, 0x5c42, 0x5c43, 0x5c44, 0x5c45,
+  0x5c46, 0x5c47, 0x5c48, 0x5c49, 0x5c4a, 0x5c4b, 0x5c4c, 0x5c4d,
+  0x5c4e, 0x5c4f, 0x5c50, 0x5c51, 0x5c52, 0x5c53, 0x5c54, 0x5c55,
+  0x5c56, 0x5c57, 0x5c58, 0x5c59, 0x5c5a, 0x5c5b, 0x5c5c, 0x5c5d,
+  0x5c5e, 0x5c5f, 0x5c60, 0x5c61, 0x5c62, 0x5c63, 0x5c64, 0x5c65,
+  0x5c66, 0x5c67, 0x5c68, 0x5c69, 0x5c6a, 0x5c6b, 0x5c6c, 0x5c6d,
+  0x5c6e, 0x5c6f, 0x5c70, 0x5c71, 0x5c72, 0x5c73, 0x5c74, 0x5c75,
+  0x5c76, 0x5c77, 0x5c78, 0x5c79, 0x5c7a, 0x5c7b, 0x5c7c, 0x5c7d,
+  0x5c7e, 0x5d21, 0x5d22, 0x5d23, 0x5d24, 0x5d25, 0x5d26, 0x5d27,
+  0x5d28, 0x5d29, 0x5d2a, 0x5d2b, 0x5d2c, 0x5d2d, 0x5d2e, 0x5d2f,
+  0x5d30, 0x5d31, 0x5d32, 0x5d33, 0x5d34, 0x5d35, 0x5d36, 0x5d37,
+  0x5d38, 0x5d39, 0x5d3a, 0x5d3b, 0x5d3c, 0x5d3d, 0x5d3e, 0x5d3f,
+  0x5d40, 0x5d41, 0x5d42, 0x5d43, 0x5d44, 0x5d45, 0x5d46, 0x5d47,
+  0x5d48, 0x5d49, 0x5d4a, 0x5d4b, 0x5d4c, 0x5d4d, 0x5d4e, 0x5d4f,
+  0x5d50, 0x5d51, 0x5d52, 0x5d53, 0x5d54, 0x5d55, 0x5d56, 0x5d57,
+  0x5d58, 0x5d59, 0x5d5a, 0x5d5b, 0x5d5c, 0x5d5d, 0x5d5e, 0x5d5f,
+  0x5d60, 0x5d61, 0x5d62, 0x5d63, 0x5d64, 0x5d65, 0x5d66, 0x5d67,
+  0x5d68, 0x5d69, 0x5d6a, 0x5d6b, 0x5d6c, 0x5d6d, 0x5d6e, 0x5d6f,
+  0x5d70, 0x5d71, 0x5d72, 0x5d73, 0x5d74, 0x5d75, 0x5d76, 0x5d77,
+  0x5d78, 0x5d79, 0x5d7a, 0x5d7b, 0x5d7c, 0x5d7d, 0x5d7e, 0x5e21,
+  0x5e22, 0x5e23, 0x5e24, 0x5e25, 0x5e26, 0x5e27, 0x5e28, 0x5e29,
+  0x5e2a, 0x5e2b, 0x5e2c, 0x5e2d, 0x5e2e, 0x5e2f, 0x5e30, 0x5e31,
+  0x5e32, 0x5e33, 0x5e34, 0x5e35, 0x5e36, 0x5e37, 0x5e38, 0x5e39,
+  0x5e3f, 0x5e3a, 0x5e3b, 0x5e3c, 0x5e3d, 0x5e3e, 0x5e40, 0x5e41,
+  0x5e42, 0x5e43, 0x5e44, 0x5e45, 0x5e46, 0x5e47, 0x5e48, 0x5e49,
+  0x5e4e, 0x5e4a, 0x5e4b, 0x5e4c, 0x5e4d, 0x5e4f, 0x5e50, 0x5e51,
+  0x5e52, 0x5e53, 0x5e54, 0x5e55, 0x5e56, 0x5e57, 0x5e58, 0x5e59,
+  0x5e5a, 0x5e5b, 0x5e5c, 0x5e5d, 0x5e5e, 0x5e5f, 0x5e60, 0x5e61,
+  0x5e62, 0x5e63, 0x5e64, 0x5e65, 0x5e66, 0x5e67, 0x5e68, 0x5e69,
+  0x5e6a, 0x5e6b, 0x5e6c, 0x5e6d, 0x5e6e, 0x5e6f, 0x5e72, 0x5e70,
+  0x5e71, 0x5e73, 0x5e74, 0x5e75, 0x5e76, 0x5e77, 0x5e78, 0x5e79,
+  0x5e7a, 0x5e7b, 0x5e7c, 0x5e7d, 0x5e7e, 0x5f21, 0x5f22, 0x5f23,
+  0x5f24, 0x5f25, 0x5f26, 0x5f27, 0x5f28, 0x5f29, 0x5f2a, 0x5f2b,
+  0x5f2c, 0x5f2d, 0x5f2e, 0x5f2f, 0x5f30, 0x5f32, 0x5f31, 0x5f33,
+  0x5f34, 0x5f35, 0x5f36, 0x5f37, 0x5f38, 0x5f39, 0x5f3a, 0x5f3b,
+  0x5f3c, 0x5f3d, 0x5f3e, 0x5f3f, 0x5f40, 0x5f41, 0x5f42, 0x5f43,
+  0x5f44, 0x5f45, 0x5f46, 0x5f47, 0x5f48, 0x5f49, 0x5f4a, 0x5f4b,
+  0x5f4c, 0x5f4d, 0x5f4e, 0x5f4f, 0x5f50, 0x5f51, 0x5f52, 0x5f53,
+  0x5f54, 0x5f55, 0x5f56, 0x5f57, 0x5f58, 0x5f59, 0x5f5a, 0x5f5b,
+  0x5f5c, 0x5f5d, 0x5f6f, 0x5f5e, 0x5f5f, 0x5f60, 0x5f61, 0x5f62,
+  0x5f63, 0x5f64, 0x5f65, 0x5f66, 0x5f67, 0x5f68, 0x5f69, 0x5f6a,
+  0x5f6b, 0x5f6c, 0x5f6d, 0x5f6e, 0x5f70, 0x5f71, 0x5f72, 0x5f73,
+  0x5f74, 0x5f75, 0x5f76, 0x5f77, 0x5f78, 0x5f79, 0x5f7a, 0x5f7b,
+  0x5f7c, 0x5f7d, 0x5f7e, 0x6021, 0x6022, 0x6023, 0x6024, 0x6025,
+  0x6026, 0x6027, 0x6028, 0x6029, 0x602a, 0x602b, 0x602c, 0x602d,
+  0x602e, 0x602f, 0x6030, 0x6031, 0x6032, 0x6033, 0x6034, 0x6035,
+  0x6036, 0x6037, 0x6038, 0x6039, 0x603a, 0x603b, 0x603c, 0x603d,
+  0x603e, 0x603f, 0x6040, 0x6041, 0x6042, 0x6043, 0x6044, 0x6045,
+  0x6046, 0x6047, 0x6048, 0x6049, 0x604a, 0x604b, 0x604c, 0x604d,
+  0x604e, 0x604f, 0x6050, 0x6051, 0x6052, 0x6053, 0x6054, 0x6055,
+  0x6056, 0x6057, 0x6058, 0x6059, 0x605a, 0x605b, 0x605c, 0x605d,
+  0x6064, 0x605e, 0x605f, 0x6060, 0x6061, 0x6062, 0x6063, 0x6065,
+  0x6066, 0x6067, 0x6068, 0x6069, 0x606a, 0x606b, 0x606c, 0x606d,
+  0x606e, 0x606f, 0x6070, 0x6071, 0x6072, 0x6073, 0x6074, 0x6075,
+  0x6076, 0x6077, 0x6078, 0x6079, 0x607a, 0x607b, 0x607c, 0x607d,
+  0x607e, 0x6121, 0x6122, 0x6123, 0x6124, 0x6125, 0x6126, 0x6127,
+  0x6128, 0x6129, 0x612a, 0x612b, 0x612c, 0x612d, 0x612e, 0x612f,
+  0x6130, 0x6131, 0x6132, 0x6133, 0x6134, 0x6135, 0x6136, 0x6137,
+  0x6138, 0x6139, 0x613a, 0x613b, 0x613c, 0x613d, 0x613e, 0x613f,
+  0x6140, 0x6141, 0x6142, 0x6143, 0x6144, 0x6145, 0x6146, 0x6147,
+  0x6148, 0x6149, 0x614a, 0x614b, 0x614c, 0x614d, 0x614e, 0x614f,
+  0x6150, 0x6151, 0x6152, 0x6154, 0x6155, 0x6156, 0x6153, 0x6157,
+  0x6158, 0x6159, 0x615a, 0x615b, 0x615c, 0x615d, 0x615e, 0x615f,
+  0x6160, 0x6161, 0x6162, 0x6163, 0x6164, 0x6165, 0x6166, 0x6167,
+  0x6168, 0x6169, 0x616a, 0x616b, 0x616c, 0x616d, 0x616e, 0x616f,
+  0x6170, 0x6171, 0x6172, 0x6173, 0x6174, 0x6175, 0x6176, 0x6177,
+  0x6178, 0x6179, 0x617a, 0x617b, 0x617d, 0x617e, 0x6221, 0x6222,
+  0x6223, 0x6224, 0x617c, 0x622d, 0x6225, 0x6226, 0x6227, 0x6228,
+  0x6229, 0x622a, 0x622b, 0x622c, 0x622f, 0x6230, 0x6231, 0x6232,
+  0x622e, 0x6233, 0x6234, 0x6235, 0x6236, 0x6237, 0x6238, 0x6239,
+  0x623a, 0x623b, 0x623c, 0x623d, 0x623e, 0x623f, 0x6240, 0x6241,
+  0x6242, 0x6243, 0x6245, 0x6246, 0x6244, 0x6247, 0x6248, 0x6249,
+  0x624a, 0x624b, 0x624c, 0x624d, 0x624e, 0x624f, 0x6250, 0x6251,
+  0x6252, 0x6253, 0x6254, 0x6255, 0x6256, 0x6257, 0x6258, 0x6259,
+  0x625a, 0x625b, 0x625c, 0x625d, 0x625e, 0x625f, 0x6260, 0x6261,
+  0x6262, 0x6263, 0x6264, 0x6265, 0x6266, 0x6267, 0x6268, 0x6269,
+  0x626a, 0x626b, 0x626c, 0x626d, 0x626e, 0x626f, 0x6270, 0x6271,
+  0x6272, 0x6273, 0x6274, 0x6275, 0x6276, 0x6277, 0x6278, 0x6279,
+  0x627a, 0x627b, 0x627c, 0x627d, 0x627e, 0x6321, 0x6322, 0x6323,
+  0x6324, 0x6325, 0x6326, 0x6327, 0x6328, 0x6329, 0x632a, 0x632b,
+  0x632c, 0x632d, 0x632e, 0x632f, 0x6330, 0x6331, 0x6332, 0x6333,
+  0x6334, 0x6335, 0x6336, 0x6337, 0x6338, 0x6339, 0x633a, 0x633b,
+  0x633c, 0x633d, 0x633e, 0x633f, 0x6340, 0x6341, 0x6342, 0x6343,
+  0x6344, 0x6345, 0x6346, 0x6347, 0x6348, 0x6349, 0x634a, 0x634b,
+  0x634c, 0x634d, 0x634e, 0x634f, 0x6350, 0x6351, 0x6352, 0x6353,
+  0x6354, 0x6355, 0x6356, 0x6357, 0x6358, 0x6359, 0x635a, 0x635b,
+  0x635c, 0x635d, 0x635e, 0x635f, 0x6360, 0x6361, 0x6362, 0x6363,
+  0x6364, 0x6365, 0x6366, 0x6367, 0x6368, 0x6369, 0x636a, 0x636b,
+  0x636c, 0x636d, 0x636e, 0x636f, 0x6370, 0x6371, 0x6372, 0x6373,
+  0x6374, 0x6375, 0x6376, 0x6377, 0x6378, 0x6379, 0x637a, 0x637b,
+  0x637c, 0x637d, 0x637e, 0x6421, 0x6422, 0x6423, 0x6424, 0x6425,
+  0x6426, 0x6427, 0x6428, 0x6429, 0x642a, 0x642b, 0x642c, 0x642d,
+  0x642e, 0x642f, 0x6430, 0x6431, 0x6432, 0x6433, 0x6434, 0x6435,
+  0x6436, 0x6437, 0x6438, 0x6439, 0x643a, 0x643b, 0x643c, 0x643d,
+  0x643e, 0x643f, 0x6440, 0x6441, 0x6442, 0x6443, 0x6444, 0x6445,
+  0x6446, 0x6447, 0x6448, 0x6449, 0x644a, 0x644b, 0x644c, 0x644d,
+  0x644e, 0x644f, 0x6450, 0x6451, 0x6452, 0x6453, 0x6454, 0x6455,
+  0x6456, 0x6457, 0x6458, 0x6459, 0x645a, 0x645b, 0x645c, 0x645d,
+  0x645e, 0x645f, 0x6460, 0x6461, 0x6462, 0x6463, 0x6464, 0x6465,
+  0x6466, 0x6467, 0x6468, 0x6469, 0x646a, 0x646b, 0x646c, 0x646d,
+  0x646e, 0x646f, 0x6470, 0x6471, 0x6472, 0x6473, 0x6474, 0x6475,
+  0x6476, 0x6477, 0x6478, 0x6479, 0x647a, 0x647b, 0x647c, 0x647d,
+  0x647e, 0x6521, 0x6522, 0x6523, 0x6524, 0x6525, 0x6526, 0x6527,
+  0x6528, 0x6529, 0x652a, 0x652b, 0x652c, 0x652d, 0x652e, 0x652f,
+  0x6530, 0x6531, 0x6532, 0x6533, 0x6534, 0x6535, 0x653b, 0x6536,
+  0x6537, 0x6538, 0x6539, 0x653a, 0x653c, 0x653d, 0x653e, 0x653f,
+  0x6540, 0x6541, 0x6542, 0x6543, 0x6544, 0x6545, 0x6546, 0x6547,
+  0x6548, 0x6549, 0x654a, 0x654b, 0x654c, 0x654d, 0x654f, 0x6550,
+  0x654e, 0x6551, 0x6552, 0x6553, 0x6554, 0x6555, 0x6556, 0x6557,
+  0x6558, 0x6559, 0x655a, 0x655b, 0x655c, 0x655d, 0x655e, 0x655f,
+  0x6560, 0x6561, 0x6562, 0x6563, 0x6564, 0x6565, 0x6566, 0x6568,
+  0x6567, 0x6569, 0x656a, 0x656b, 0x656c, 0x656d, 0x656e, 0x656f,
+  0x6570, 0x6571, 0x6572, 0x6573, 0x6574, 0x6575, 0x6576, 0x6577,
+  0x6578, 0x6579, 0x657a, 0x657c, 0x657b, 0x657d, 0x657e, 0x6621,
+  0x6622, 0x6623, 0x6624, 0x6625, 0x6626, 0x6627, 0x6628, 0x6629,
+  0x662a, 0x662b, 0x662c, 0x662d, 0x662e, 0x662f, 0x6630, 0x6631,
+  0x6632, 0x6633, 0x6634, 0x6635, 0x6636, 0x6637, 0x6638, 0x6639,
+  0x663a, 0x663b, 0x663c, 0x663d, 0x663e, 0x663f, 0x6640, 0x6641,
+  0x6642, 0x6643, 0x6644, 0x6645, 0x6646, 0x6647, 0x6648, 0x6649,
+  0x664a, 0x664b, 0x664c, 0x664d, 0x664e, 0x664f, 0x6650, 0x6651,
+  0x6652, 0x6653, 0x6654, 0x6655, 0x6656, 0x6657, 0x6658, 0x6659,
+  0x665a, 0x665b, 0x665c, 0x665d, 0x665e, 0x665f, 0x6660, 0x6661,
+  0x6662, 0x6663, 0x6664, 0x6665, 0x6666, 0x6667, 0x6668, 0x6669,
+  0x666a, 0x666b, 0x666c, 0x666d, 0x666e, 0x666f, 0x6670, 0x6671,
+  0x6672, 0x6673, 0x6675, 0x6676, 0x6677, 0x6678, 0x6679, 0x667a,
+  0x667b, 0x667c, 0x667d, 0x667e, 0x6721, 0x6722, 0x6723, 0x6724,
+  0x6725, 0x6726, 0x6727, 0x6728, 0x6729, 0x672a, 0x672b, 0x672c,
+  0x672d, 0x672e, 0x672f, 0x6730, 0x6731, 0x6732, 0x6733, 0x6734,
+  0x6735, 0x6736, 0x6737, 0x6738, 0x6739, 0x673a, 0x673b, 0x673c,
+  0x673d, 0x673e, 0x673f, 0x6740, 0x6741, 0x6742, 0x6743, 0x6744,
+  0x6745, 0x6746, 0x6747, 0x6748, 0x6749, 0x674a, 0x674b, 0x674c,
+  0x674d, 0x674e, 0x674f, 0x6750, 0x6751, 0x6752, 0x6753, 0x6754,
+  0x6755, 0x6756, 0x6757, 0x6758, 0x6759, 0x675a, 0x675b, 0x675c,
+  0x675d, 0x675e, 0x675f, 0x6760, 0x6761, 0x6762, 0x6763, 0x6764,
+  0x6765, 0x6766, 0x676a, 0x6767, 0x6768, 0x6769, 0x676b, 0x676c,
+  0x676d, 0x676e, 0x676f, 0x6770, 0x6771, 0x6772, 0x6773, 0x6774,
+  0x6776, 0x6777, 0x6778, 0x6779, 0x6775, 0x677a, 0x677b, 0x677c,
+  0x677d, 0x6828, 0x677e, 0x6821, 0x6822, 0x6823, 0x6824, 0x6825,
+  0x6826, 0x6827, 0x6829, 0x682a, 0x682b, 0x682c, 0x682d, 0x682e,
+  0x682f, 0x6830, 0x6831, 0x6832, 0x6833, 0x6834, 0x6835, 0x6836,
+  0x6837, 0x6838, 0x6839, 0x683a, 0x683b, 0x683c, 0x683d, 0x683e,
+  0x683f, 0x6840, 0x6841, 0x6842, 0x6843, 0x6844, 0x6845, 0x6846,
+  0x6847, 0x6848, 0x6849, 0x684a, 0x684b, 0x684c, 0x684d, 0x684e,
+  0x684f, 0x6850, 0x6851, 0x6852, 0x6853, 0x6854, 0x6855, 0x6856,
+  0x6857, 0x6858, 0x6859, 0x685a, 0x685b, 0x685c, 0x685d, 0x685e,
+  0x685f, 0x6860, 0x6861, 0x6862, 0x6863, 0x6864, 0x6865, 0x6866,
+  0x6867, 0x6868, 0x6869, 0x686a, 0x686b, 0x686c, 0x686d, 0x686e,
+  0x686f, 0x6870, 0x6871, 0x6872, 0x6873, 0x6874, 0x6875, 0x6876,
+  0x6877, 0x6878, 0x6879, 0x687a, 0x687b, 0x687c, 0x687d, 0x687e,
+  0x6921, 0x6922, 0x6923, 0x6924, 0x6925, 0x6926, 0x6927, 0x6928,
+  0x6929, 0x692a, 0x692b, 0x692c, 0x692d, 0x692e, 0x692f, 0x6930,
+  0x6931, 0x6932, 0x6933, 0x6934, 0x6935, 0x6936, 0x6937, 0x6938,
+  0x6939, 0x693a, 0x693b, 0x693c, 0x693d, 0x693e, 0x693f, 0x6940,
+  0x6941, 0x6942, 0x6943, 0x6944, 0x6945, 0x6946, 0x6947, 0x6948,
+  0x6949, 0x694a, 0x694c, 0x694d, 0x694b, 0x694e, 0x694f, 0x6950,
+  0x6951, 0x6952, 0x6953, 0x6954, 0x6955, 0x6956, 0x6957, 0x6958,
+  0x6959, 0x695a, 0x695b, 0x695c, 0x695d, 0x695e, 0x695f, 0x6960,
+  0x6961, 0x6962, 0x6963, 0x6964, 0x6965, 0x6966, 0x6967, 0x6968,
+  0x6969, 0x696a, 0x696b, 0x696c, 0x696d, 0x696e, 0x696f, 0x6970,
+  0x6971, 0x6972, 0x6973, 0x6974, 0x6975, 0x6976, 0x6977, 0x6978,
+  0x6979, 0x697a, 0x697b, 0x697c, 0x697d, 0x697e, 0x6a21, 0x6a22,
+  0x6a23, 0x6a24, 0x6a25, 0x6a26, 0x6a27, 0x6a28, 0x6a29, 0x6a2a,
+  0x6a2b, 0x6a2c, 0x6a2d, 0x6a2e, 0x6a2f, 0x6a30, 0x6a31, 0x6a32,
+  0x6a33, 0x6a34, 0x6a35, 0x6a36, 0x6a37, 0x6a38, 0x6a39, 0x6a3a,
+  0x6a3b, 0x6a3c, 0x6a3d, 0x6a3e, 0x6a3f, 0x6a40, 0x6a41, 0x6a42,
+  0x6a43, 0x6a44, 0x6a45, 0x6a46, 0x6a47, 0x6a48, 0x6a49, 0x6a4a,
+  0x6a4b, 0x6a4c, 0x6a4d, 0x6a4e, 0x6a4f, 0x6a50, 0x6a51, 0x6a52,
+  0x6a53, 0x6a54, 0x6a55, 0x6a56, 0x6a57, 0x6a58, 0x6a59, 0x6a5a,
+  0x6a5b, 0x6a5c, 0x6a5d, 0x6a5e, 0x6a5f, 0x6a60, 0x6a61, 0x6a62,
+  0x6a63, 0x6a64, 0x6a65, 0x6a66, 0x6a67, 0x6a68, 0x6a69, 0x6a6a,
+  0x6a6b, 0x6a6c, 0x6a6d, 0x6a6e, 0x6a6f, 0x6a70, 0x6a71, 0x6a72,
+  0x6a73, 0x6a74, 0x6a75, 0x6a76, 0x6a77, 0x6a78, 0x6a79, 0x6a7a,
+  0x6a7b, 0x6a7c, 0x6a7d, 0x6a7e, 0x6b21, 0x6b22, 0x6b23, 0x6b24,
+  0x6b25, 0x6b26, 0x6b27, 0x6b28, 0x6b29, 0x6b2a, 0x6b2b, 0x6b2c,
+  0x6b2d, 0x6b2e, 0x6b2f, 0x6b30, 0x6b31, 0x6b32, 0x6b33, 0x6b34,
+  0x6b35, 0x6b36, 0x6b37, 0x6b38, 0x6b39, 0x6b3a, 0x6b3b, 0x6b3c,
+  0x6b3d, 0x6b3e, 0x6b3f, 0x6b40, 0x6b41, 0x6b42, 0x6b43, 0x6b44,
+  0x6b45, 0x6b46, 0x6b47, 0x6b48, 0x6b49, 0x6b50, 0x6b4a, 0x6b4b,
+  0x6b4c, 0x6b4d, 0x6b52, 0x6b4e, 0x6b4f, 0x6b51, 0x6b53, 0x6b54,
+  0x6b55, 0x6b56, 0x6b57, 0x6b58, 0x6b59, 0x6b5a, 0x6b5b, 0x6b5c,
+  0x6b5e, 0x6b5d, 0x6b5f, 0x6b60, 0x6b61, 0x6b62, 0x6b63, 0x6b64,
+  0x6b65, 0x6b66, 0x6b67, 0x6b68, 0x6b69, 0x6b6a, 0x6b6b, 0x6b6d,
+  0x6b6e, 0x6b6f, 0x6b6c, 0x6b70, 0x6b71, 0x6b72, 0x6b73, 0x6b74,
+  0x6b76, 0x6b75, 0x6b77, 0x6b78, 0x6b79, 0x6b7a, 0x6b7b, 0x6b7c,
+  0x6b7d, 0x6b7e, 0x6c21, 0x6c22, 0x6c23, 0x6c24, 0x6c25, 0x6c26,
+  0x6c27, 0x6c28, 0x6c29, 0x6c2a, 0x6c2b, 0x6c2c, 0x6c2d, 0x6c2e,
+  0x6c2f, 0x6c30, 0x6c31, 0x6c32, 0x6c33, 0x6c34, 0x6c35, 0x6c36,
+  0x6c37, 0x6c38, 0x6c39, 0x6c3a, 0x6c3b, 0x6c3c, 0x6c3d, 0x6c3e,
+  0x6c3f, 0x6c40, 0x6c41, 0x6c42, 0x6c43, 0x6c44, 0x6c45, 0x6c46,
+  0x6c47, 0x6c48, 0x6c49, 0x6c4a, 0x6c4b, 0x6c4c, 0x6c4e, 0x6c4f,
+  0x6c4d, 0x6c50, 0x6c51, 0x6c52, 0x6c53, 0x6c54, 0x6c55, 0x6c56,
+  0x6c57, 0x6c58, 0x6c59, 0x6c5a, 0x6c5b, 0x6c5c, 0x6c5d, 0x6c5e,
+  0x6c5f, 0x6c60, 0x6c61, 0x6c62, 0x6c63, 0x6c64, 0x6c65, 0x6c66,
+  0x6c67, 0x6c68, 0x6c69, 0x6c6a, 0x6c6b, 0x6c6c, 0x6c6d, 0x6c6e,
+  0x6c6f, 0x6c70, 0x6c71, 0x6c72, 0x6c73, 0x6c74, 0x6c75, 0x6c76,
+  0x6c77, 0x6c78, 0x6c79, 0x6c7a, 0x6c7b, 0x6c7c, 0x6c7d, 0x6c7e,
+  0x6d21, 0x6d22, 0x6d23, 0x6d24, 0x6d25, 0x6d26, 0x6d27, 0x6d28,
+  0x6d29, 0x6d2a, 0x6d2b, 0x6d2c, 0x6d2d, 0x6d2e, 0x6d2f, 0x6d30,
+  0x6d31, 0x6d32, 0x6d33, 0x6d34, 0x6d35, 0x6d36, 0x6d37, 0x6d38,
+  0x6d39, 0x6d3a, 0x6d3b, 0x6d3c, 0x6d3d, 0x6d3e, 0x6d3f, 0x6d40,
+  0x6d41, 0x6d42, 0x6d43, 0x6d44, 0x6d45, 0x6d46, 0x6d47, 0x6d48,
+  0x6d49, 0x6d4a, 0x6d4b, 0x6d4c, 0x6d4d, 0x6d4e, 0x6d4f, 0x6d50,
+  0x6d51, 0x6d52, 0x6d53, 0x6d54, 0x6d55, 0x6d56, 0x6d57, 0x6d58,
+  0x6d59, 0x6d5a, 0x6d5b, 0x6d5c, 0x6d5d, 0x6d5e, 0x6d5f, 0x6d60,
+  0x6d61, 0x6d62, 0x6d63,
+};
+
+static const Summary16 jisx0212_uni2indx_page00[70] = {
+  /* 0x0000 */
+  {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 },
+  {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x4000 },
+  {    1, 0x0000 }, {    1, 0x0000 }, {    1, 0xc652 }, {    8, 0x8500 },
+  {   11, 0xffff }, {   27, 0xff7e }, {   41, 0xffff }, {   57, 0xff7f },
+  /* 0x0100 */
+  {   72, 0xffff }, {   88, 0xffcf }, {  102, 0xcff7 }, {  115, 0xffff },
+  {  131, 0x3fff }, {  145, 0xffff }, {  161, 0xffff }, {  177, 0x7fff },
+  {  192, 0x0000 }, {  192, 0x0000 }, {  192, 0x0000 }, {  192, 0x0000 },
+  {  192, 0xe000 }, {  195, 0x1fff }, {  208, 0x0000 }, {  208, 0x0020 },
+  /* 0x0200 */
+  {  209, 0x0000 }, {  209, 0x0000 }, {  209, 0x0000 }, {  209, 0x0000 },
+  {  209, 0x0000 }, {  209, 0x0000 }, {  209, 0x0000 }, {  209, 0x0000 },
+  {  209, 0x0000 }, {  209, 0x0000 }, {  209, 0x0000 }, {  209, 0x0000 },
+  {  209, 0x0080 }, {  210, 0x2f00 }, {  215, 0x0000 }, {  215, 0x0000 },
+  /* 0x0300 */
+  {  215, 0x0000 }, {  215, 0x0000 }, {  215, 0x0000 }, {  215, 0x0000 },
+  {  215, 0x0000 }, {  215, 0x0000 }, {  215, 0x0000 }, {  215, 0x0000 },
+  {  215, 0xd770 }, {  224, 0x0001 }, {  225, 0xfc00 }, {  231, 0x0001 },
+  {  232, 0x7c04 }, {  238, 0x0000 }, {  238, 0x0000 }, {  238, 0x0000 },
+  /* 0x0400 */
+  {  238, 0xdffc }, {  251, 0x0000 }, {  251, 0x0000 }, {  251, 0x0000 },
+  {  251, 0x0000 }, {  251, 0xdffc },
+};
+static const Summary16 jisx0212_uni2indx_page21[3] = {
+  /* 0x2100 */
+  {  264, 0x0000 }, {  264, 0x0040 }, {  265, 0x0004 },
+};
+static const Summary16 jisx0212_uni2indx_page4e[1307] = {
+  /* 0x4e00 */
+  {  266, 0x1034 }, {  270, 0x8004 }, {  272, 0xc918 }, {  278, 0x0021 },
+  {  280, 0x0093 }, {  284, 0x1402 }, {  287, 0x0308 }, {  290, 0x8230 },
+  {  294, 0x2000 }, {  295, 0x20c0 }, {  298, 0x8000 }, {  299, 0x0200 },
+  {  300, 0x0008 }, {  301, 0x0c01 }, {  304, 0x8107 }, {  309, 0xe02a },
+  /* 0x4f00 */
+  {  315, 0x190d }, {  321, 0x02e4 }, {  326, 0x4000 }, {  327, 0x4aaa },
+  {  334, 0x1b05 }, {  340, 0x8154 }, {  345, 0x5409 }, {  350, 0x6782 },
+  {  357, 0x5636 }, {  365, 0xc69d }, {  374, 0x0000 }, {  374, 0x7a84 },
+  {  381, 0xbb63 }, {  391, 0x1004 }, {  393, 0x0005 }, {  395, 0xb005 },
+  /* 0x5000 */
+  {  400, 0x5493 }, {  407, 0x7989 }, {  415, 0x4084 }, {  418, 0x082d },
+  {  423, 0x5467 }, {  431, 0x828e }, {  437, 0x24cd }, {  444, 0x0003 },
+  {  446, 0xc45a }, {  453, 0xd85d }, {  462, 0x8407 }, {  467, 0x2601 },
+  {  471, 0x5099 }, {  477, 0xb119 }, {  484, 0x8354 }, {  490, 0x4446 },
+  /* 0x5100 */
+  {  495, 0x79c8 }, {  503, 0x7a81 }, {  510, 0xb188 }, {  516, 0x033a },
+  {  522, 0x8404 }, {  525, 0x81a8 }, {  530, 0x0050 }, {  532, 0x4000 },
+  {  533, 0x4818 }, {  537, 0x2100 }, {  539, 0x200a }, {  542, 0xd500 },
+  {  547, 0x8104 }, {  550, 0x412e }, {  556, 0x4024 }, {  559, 0x009c },
+  /* 0x5200 */
+  {  563, 0x0026 }, {  566, 0x016c }, {  571, 0x0104 }, {  573, 0x1026 },
+  {  577, 0x0220 }, {  579, 0x95a0 }, {  585, 0x4043 }, {  589, 0x0380 },
+  {  592, 0x1425 }, {  597, 0x15e8 }, {  604, 0x80f0 }, {  609, 0x2dc1 },
+  {  616, 0x9151 }, {  622, 0x1852 }, {  627, 0x1722 }, {  633, 0x00d3 },
+  /* 0x5300 */
+  {  638, 0x1c09 }, {  643, 0xd90a }, {  650, 0x3ba0 }, {  657, 0x7025 },
+  {  663, 0x1804 }, {  666, 0x0a00 }, {  668, 0x302a }, {  673, 0x4204 },
+  {  676, 0x4188 }, {  680, 0x2218 }, {  684, 0x8c12 }, {  689, 0x25b4 },
+  {  696, 0x8021 }, {  699, 0x642c }, {  705, 0x00c1 }, {  708, 0x0020 },
+  /* 0x5400 */
+  {  709, 0x0004 }, {  710, 0x0408 }, {  712, 0x8582 }, {  717, 0x0032 },
+  {  720, 0xa098 }, {  725, 0x4000 }, {  726, 0x6ad4 }, {  734, 0x8010 },
+  {  736, 0x232a }, {  742, 0x9062 }, {  747, 0x66c2 }, {  754, 0x8e82 },
+  {  760, 0x6440 }, {  764, 0x0000 }, {  764, 0x9401 }, {  768, 0xd040 },
+  /* 0x5500 */
+  {  772, 0x7323 }, {  780, 0x0020 }, {  781, 0x0c00 }, {  783, 0x3864 },
+  {  789, 0x2682 }, {  794, 0x4d03 }, {  800, 0x0053 }, {  804, 0x8000 },
+  {  805, 0xc146 }, {  811, 0x009e }, {  816, 0x2018 }, {  819, 0x8004 },
+  {  821, 0x5a4a }, {  828, 0x498e }, {  835, 0x0204 }, {  837, 0x8040 },
+  /* 0x5600 */
+  {  839, 0xe520 }, {  845, 0x0207 }, {  849, 0x1000 }, {  850, 0xbaa9 },
+  {  859, 0xaa5b }, {  868, 0x4010 }, {  870, 0xa24f }, {  878, 0x0026 },
+  {  881, 0x1930 }, {  886, 0xe620 }, {  892, 0x3bc0 }, {  899, 0x408a },
+  {  903, 0xbe20 }, {  910, 0xb201 }, {  915, 0x29f2 }, {  923, 0x00c2 },
+  /* 0x5700 */
+  {  926, 0x1486 }, {  931, 0x2c22 }, {  936, 0xd63d }, {  946, 0xe018 },
+  {  951, 0x3060 }, {  955, 0x0004 }, {  956, 0xe9a4 }, {  964, 0x5ebb },
+  {  975, 0x100a }, {  978, 0xf6b0 }, {  987, 0x1382 }, {  992, 0x2100 },
+  {  994, 0x9180 }, {  998, 0x6020 }, { 1001, 0x22d2 }, { 1007, 0xe161 },
+  /* 0x5800 */
+  { 1014, 0x3318 }, { 1020, 0xc800 }, { 1023, 0x20c1 }, { 1027, 0x8204 },
+  { 1030, 0xb200 }, { 1034, 0x8021 }, { 1037, 0x0192 }, { 1041, 0x9100 },
+  { 1044, 0xb783 }, { 1053, 0x2051 }, { 1057, 0x0247 }, { 1062, 0x1006 },
+  { 1065, 0x6114 }, { 1070, 0x2455 }, { 1076, 0x0206 }, { 1079, 0x0008 },
+  /* 0x5900 */
+  { 1080, 0x1860 }, { 1084, 0x201c }, { 1088, 0x811a }, { 1093, 0x8069 },
+  { 1098, 0x0048 }, { 1100, 0xea0c }, { 1107, 0xa80a }, { 1112, 0x1a64 },
+  { 1118, 0x5800 }, { 1121, 0x80a4 }, { 1125, 0xe090 }, { 1130, 0x1489 },
+  { 1135, 0x251a }, { 1141, 0xe004 }, { 1145, 0xc098 }, { 1150, 0x0096 },
+  /* 0x5a00 */
+  { 1154, 0x7011 }, { 1159, 0x400c }, { 1162, 0x2598 }, { 1168, 0x0001 },
+  { 1169, 0x11b0 }, { 1174, 0x4021 }, { 1177, 0x20a8 }, { 1181, 0x4c80 },
+  { 1185, 0x0800 }, { 1186, 0xd249 }, { 1193, 0x1085 }, { 1197, 0x8d2e },
+  { 1205, 0x8150 }, { 1209, 0x1400 }, { 1211, 0x4421 }, { 1215, 0x2060 },
+  /* 0x5b00 */
+  { 1218, 0x0103 }, { 1221, 0x2a80 }, { 1225, 0x2022 }, { 1228, 0x0110 },
+  { 1230, 0x1802 }, { 1233, 0x4044 }, { 1236, 0xc100 }, { 1239, 0xf000 },
+  { 1243, 0x4452 }, { 1248, 0x005b }, { 1253, 0xb300 }, { 1258, 0x1486 },
+  { 1263, 0xa003 }, { 1267, 0x07c0 }, { 1272, 0x8001 }, { 1274, 0x2012 },
+  /* 0x5c00 */
+  { 1277, 0x1000 }, { 1278, 0xc080 }, { 1281, 0x5a48 }, { 1287, 0x0065 },
+  { 1291, 0x0000 }, { 1291, 0x1600 }, { 1294, 0x238c }, { 1300, 0x3c31 },
+  { 1307, 0x8580 }, { 1311, 0xa004 }, { 1314, 0x044d }, { 1319, 0x0434 },
+  { 1323, 0x0a00 }, { 1325, 0x2084 }, { 1328, 0x4000 }, { 1329, 0x0016 },
+  /* 0x5d00 */
+  { 1332, 0x2042 }, { 1335, 0x0004 }, { 1336, 0x08d8 }, { 1341, 0xa212 },
+  { 1346, 0x054c }, { 1351, 0x8222 }, { 1355, 0x2417 }, { 1361, 0xc601 },
+  { 1366, 0x050a }, { 1370, 0x8a3c }, { 1377, 0x0881 }, { 1380, 0x0315 },
+  { 1385, 0x4888 }, { 1389, 0x0301 }, { 1392, 0x0211 }, { 1395, 0x0300 },
+  /* 0x5e00 */
+  { 1397, 0x2081 }, { 1400, 0x8134 }, { 1405, 0x4101 }, { 1408, 0x4024 },
+  { 1411, 0x0a00 }, { 1413, 0x5943 }, { 1420, 0x7d00 }, { 1426, 0x0001 },
+  { 1427, 0x4801 }, { 1430, 0x0000 }, { 1430, 0x1534 }, { 1436, 0xe00a },
+  { 1441, 0x5840 }, { 1445, 0x5036 }, { 1451, 0x0820 }, { 1453, 0x0000 },
+  /* 0x5f00 */
+  { 1453, 0x41c4 }, { 1458, 0x3200 }, { 1461, 0x591e }, { 1469, 0xa851 },
+  { 1475, 0x20b1 }, { 1480, 0x0911 }, { 1484, 0x8099 }, { 1489, 0x6534 },
+  { 1496, 0xa200 }, { 1499, 0x3040 }, { 1502, 0x9894 }, { 1508, 0x0103 },
+  { 1511, 0x0b90 }, { 1516, 0x401f }, { 1522, 0xf706 }, { 1531, 0x144c },
+  /* 0x6000 */
+  { 1536, 0x2480 }, { 1539, 0x8598 }, { 1545, 0x2010 }, { 1547, 0x0028 },
+  { 1549, 0x1381 }, { 1554, 0x20d2 }, { 1559, 0x0082 }, { 1561, 0xc002 },
+  { 1564, 0x4544 }, { 1569, 0x612a }, { 1575, 0x0134 }, { 1579, 0x4883 },
+  { 1584, 0xcf14 }, { 1592, 0x6a30 }, { 1598, 0x0024 }, { 1600, 0x3124 },
+  /* 0x6100 */
+  { 1605, 0x1484 }, { 1609, 0x52df }, { 1619, 0x0c04 }, { 1622, 0x02e3 },
+  { 1628, 0x0262 }, { 1632, 0x4000 }, { 1633, 0x1001 }, { 1635, 0x9904 },
+  { 1640, 0x281b }, { 1646, 0xb18c }, { 1653, 0x2521 }, { 1658, 0x1300 },
+  { 1661, 0xc007 }, { 1666, 0xf020 }, { 1671, 0xb2a6 }, { 1679, 0x0000 },
+  /* 0x6200 */
+  { 1679, 0x009a }, { 1683, 0x1028 }, { 1686, 0x0a8d }, { 1692, 0x2200 },
+  { 1694, 0x105c }, { 1699, 0x1457 }, { 1706, 0xa010 }, { 1709, 0x2408 },
+  { 1712, 0xe000 }, { 1715, 0x0001 }, { 1716, 0x0140 }, { 1718, 0xc4c8 },
+  { 1724, 0x4010 }, { 1726, 0x0460 }, { 1729, 0x0400 }, { 1730, 0x3014 },
+  /* 0x6300 */
+  { 1734, 0x2c18 }, { 1739, 0x0149 }, { 1743, 0x2600 }, { 1746, 0x1260 },
+  { 1750, 0x4c5e }, { 1758, 0x091c }, { 1763, 0x3060 }, { 1767, 0xb132 },
+  { 1774, 0x0494 }, { 1778, 0x4631 }, { 1784, 0xe050 }, { 1789, 0x2000 },
+  { 1790, 0x4122 }, { 1794, 0x103a }, { 1799, 0x1421 }, { 1803, 0x032c },
+  /* 0x6400 */
+  { 1808, 0x0600 }, { 1810, 0x4115 }, { 1815, 0x8635 }, { 1822, 0xa021 },
+  { 1826, 0x8800 }, { 1828, 0xbc1e }, { 1837, 0x200b }, { 1841, 0x2818 },
+  { 1845, 0x80a0 }, { 1848, 0xab03 }, { 1855, 0x114a }, { 1860, 0xe008 },
+  { 1864, 0x5e10 }, { 1870, 0x00a3 }, { 1874, 0x2630 }, { 1879, 0x88a1 },
+  /* 0x6500 */
+  { 1884, 0x8712 }, { 1890, 0xca58 }, { 1897, 0x4244 }, { 1901, 0x3402 },
+  { 1905, 0x0288 }, { 1908, 0x8015 }, { 1912, 0x0881 }, { 1915, 0x2400 },
+  { 1917, 0x0422 }, { 1920, 0x2124 }, { 1924, 0x4049 }, { 1928, 0x801c },
+  { 1932, 0x4304 }, { 1936, 0x8151 }, { 1941, 0x0000 }, { 1941, 0xc235 },
+  /* 0x6600 */
+  { 1948, 0x2311 }, { 1953, 0x6066 }, { 1959, 0x5e5e }, { 1969, 0x028b },
+  { 1974, 0x5461 }, { 1980, 0x1b82 }, { 1986, 0x1c03 }, { 1991, 0xdba8 },
+  { 2000, 0x3801 }, { 2004, 0x9e05 }, { 2011, 0x2011 }, { 2014, 0x8826 },
+  { 2019, 0xd10d }, { 2026, 0x8810 }, { 2029, 0x5900 }, { 2033, 0x0c00 },
+  /* 0x6700 */
+  { 2035, 0x40a0 }, { 2038, 0x1208 }, { 2041, 0x0005 }, { 2043, 0x4008 },
+  { 2045, 0x11a0 }, { 2049, 0x2030 }, { 2052, 0x5040 }, { 2055, 0x0850 },
+  { 2058, 0xc012 }, { 2062, 0x0b4a }, { 2068, 0x0000 }, { 2068, 0x3827 },
+  { 2075, 0x032d }, { 2081, 0x1284 }, { 2085, 0x0042 }, { 2087, 0x02c5 },
+  /* 0x6800 */
+  { 2092, 0x0000 }, { 2092, 0xa210 }, { 2096, 0xb180 }, { 2101, 0x880b },
+  { 2106, 0x1430 }, { 2110, 0x09a4 }, { 2115, 0xc800 }, { 2118, 0x1e27 },
+  { 2126, 0x0154 }, { 2130, 0x1540 }, { 2134, 0x462a }, { 2140, 0x0804 },
+  { 2142, 0x9120 }, { 2146, 0x324b }, { 2153, 0x3d20 }, { 2159, 0x3863 },
+  /* 0x6900 */
+  { 2166, 0x0640 }, { 2169, 0x00cb }, { 2174, 0x0000 }, { 2174, 0x092a },
+  { 2179, 0x4224 }, { 2183, 0x0880 }, { 2185, 0x1378 }, { 2192, 0x8c07 },
+  { 2198, 0x2001 }, { 2200, 0x0144 }, { 2203, 0xa962 }, { 2210, 0x1580 },
+  { 2214, 0x0120 }, { 2216, 0x00c2 }, { 2219, 0xc024 }, { 2223, 0x402a },
+  /* 0x6a00 */
+  { 2227, 0x800b }, { 2231, 0x2422 }, { 2235, 0x0111 }, { 2238, 0xc895 },
+  { 2245, 0x4660 }, { 2250, 0x0867 }, { 2256, 0x0490 }, { 2259, 0x400a },
+  { 2262, 0x0aca }, { 2268, 0xe802 }, { 2273, 0x8820 }, { 2276, 0xe013 },
+  { 2282, 0x1340 }, { 2286, 0x3071 }, { 2292, 0x1090 }, { 2295, 0x3007 },
+  /* 0x6b00 */
+  { 2300, 0x82cc }, { 2306, 0x4883 }, { 2311, 0x9910 }, { 2316, 0x8860 },
+  { 2320, 0x2440 }, { 2323, 0x2144 }, { 2327, 0x4881 }, { 2331, 0x6021 },
+  { 2335, 0x0024 }, { 2337, 0x8880 }, { 2340, 0x730d }, { 2348, 0x6301 },
+  { 2353, 0x1218 }, { 2357, 0x0440 }, { 2359, 0x40ca }, { 2364, 0x8282 },
+  /* 0x6c00 */
+  { 2368, 0x6234 }, { 2374, 0x8205 }, { 2378, 0x51c0 }, { 2383, 0x8c68 },
+  { 2389, 0xac00 }, { 2393, 0x1a14 }, { 2398, 0xa880 }, { 2402, 0x0b50 },
+  { 2407, 0x02e0 }, { 2411, 0x91b0 }, { 2417, 0x0000 }, { 2417, 0x0015 },
+  { 2420, 0xa044 }, { 2424, 0x1457 }, { 2431, 0x5a81 }, { 2437, 0x0014 },
+  /* 0x6d00 */
+  { 2439, 0xc490 }, { 2444, 0x040a }, { 2447, 0xc1c0 }, { 2452, 0x9202 },
+  { 2456, 0x0000 }, { 2456, 0xc080 }, { 2459, 0x80a2 }, { 2463, 0x1001 },
+  { 2465, 0x0084 }, { 2467, 0x01d6 }, { 2473, 0x1400 }, { 2475, 0xa290 },
+  { 2480, 0xc510 }, { 2485, 0xa840 }, { 2489, 0x8225 }, { 2494, 0x1051 },
+  /* 0x6e00 */
+  { 2498, 0x0011 }, { 2500, 0x4000 }, { 2501, 0x0084 }, { 2503, 0x1a44 },
+  { 2508, 0x8b30 }, { 2514, 0x709e }, { 2522, 0x010c }, { 2525, 0x2808 },
+  { 2528, 0x2000 }, { 2529, 0x0208 }, { 2531, 0x6081 }, { 2535, 0x880a },
+  { 2539, 0xe58b }, { 2548, 0x0000 }, { 2548, 0x6800 }, { 2551, 0x2a00 },
+  /* 0x6f00 */
+  { 2554, 0x3510 }, { 2559, 0x0d40 }, { 2563, 0xa640 }, { 2568, 0x1849 },
+  { 2573, 0x8000 }, { 2574, 0x668e }, { 2582, 0x1106 }, { 2586, 0x6000 },
+  { 2588, 0x3988 }, { 2594, 0x845d }, { 2601, 0xc1e1 }, { 2608, 0x1061 },
+  { 2612, 0x05a0 }, { 2616, 0x4400 }, { 2618, 0x0300 }, { 2620, 0x3221 },
+  /* 0x7000 */
+  { 2625, 0x20e1 }, { 2630, 0x0080 }, { 2631, 0x8009 }, { 2634, 0x1290 },
+  { 2638, 0x4f18 }, { 2645, 0x6030 }, { 2649, 0x5030 }, { 2653, 0x4060 },
+  { 2656, 0x0062 }, { 2659, 0x09f0 }, { 2665, 0x0810 }, { 2667, 0x0093 },
+  { 2671, 0x0400 }, { 2672, 0x117a }, { 2679, 0x0010 }, { 2680, 0x0400 },
+  /* 0x7100 */
+  { 2681, 0x98f8 }, { 2689, 0x4000 }, { 2690, 0xa801 }, { 2694, 0x0103 },
+  { 2697, 0x0ce2 }, { 2703, 0x5485 }, { 2709, 0x0101 }, { 2711, 0x0200 },
+  { 2712, 0x10a1 }, { 2716, 0x0c04 }, { 2719, 0x8005 }, { 2722, 0x840d },
+  { 2727, 0x1813 }, { 2732, 0x1648 }, { 2737, 0x0000 }, { 2737, 0x4100 },
+  /* 0x7200 */
+  { 2739, 0x0381 }, { 2743, 0xa488 }, { 2748, 0x8810 }, { 2751, 0x0310 },
+  { 2754, 0xc02e }, { 2760, 0x5469 }, { 2767, 0xc909 }, { 2773, 0x9982 },
+  { 2779, 0x6210 }, { 2783, 0x0808 }, { 2785, 0x6100 }, { 2788, 0x4012 },
+  { 2791, 0x1282 }, { 2795, 0x8160 }, { 2799, 0x0020 }, { 2800, 0x4c18 },
+  /* 0x7300 */
+  { 2805, 0x28b4 }, { 2811, 0x430c }, { 2816, 0x1194 }, { 2821, 0x2c26 },
+  { 2827, 0x2008 }, { 2829, 0xe145 }, { 2836, 0xdac1 }, { 2844, 0x1282 },
+  { 2848, 0x406b }, { 2854, 0xd1a9 }, { 2862, 0x2c65 }, { 2869, 0xb2a0 },
+  { 2875, 0x9a60 }, { 2881, 0x224c }, { 2886, 0x02ca }, { 2891, 0xaeb0 },
+  /* 0x7400 */
+  { 2899, 0x0493 }, { 2904, 0x0c02 }, { 2907, 0xff50 }, { 2917, 0x0203 },
+  { 2920, 0x28d9 }, { 2927, 0x2086 }, { 2931, 0x69c4 }, { 2938, 0x0006 },
+  { 2940, 0x82e3 }, { 2947, 0x9707 }, { 2955, 0xcf4b }, { 2965, 0x8a26 },
+  { 2971, 0x1300 }, { 2974, 0xcd09 }, { 2981, 0x8d10 }, { 2986, 0x9c10 },
+  /* 0x7500 */
+  { 2991, 0x0040 }, { 2992, 0x00c4 }, { 2995, 0x8693 }, { 3002, 0xe240 },
+  { 3007, 0x4189 }, { 3012, 0xc085 }, { 3017, 0x8002 }, { 3019, 0x7e02 },
+  { 3026, 0x0022 }, { 3028, 0x122d }, { 3034, 0x0014 }, { 3036, 0x8410 },
+  { 3039, 0xd053 }, { 3046, 0x9080 }, { 3049, 0xd093 }, { 3056, 0x0202 },
+  /* 0x7600 */
+  { 3058, 0x959d }, { 3067, 0x7a6c }, { 3076, 0x2268 }, { 3081, 0x172c },
+  { 3088, 0x0e3b }, { 3096, 0x8220 }, { 3099, 0xe030 }, { 3104, 0x0012 },
+  { 3106, 0x3022 }, { 3110, 0xb820 }, { 3115, 0x25fd }, { 3125, 0x2000 },
+  { 3126, 0x5a22 }, { 3132, 0x0210 }, { 3134, 0x1141 }, { 3138, 0x1243 },
+  /* 0x7700 */
+  { 3143, 0x4441 }, { 3147, 0x16b4 }, { 3154, 0xe104 }, { 3159, 0x6270 },
+  { 3165, 0xe464 }, { 3172, 0xd0c4 }, { 3178, 0x1495 }, { 3184, 0x241d },
+  { 3190, 0x3011 }, { 3194, 0x8470 }, { 3199, 0xc484 }, { 3204, 0x4022 },
+  { 3207, 0x0208 }, { 3209, 0xc226 }, { 3215, 0x1451 }, { 3220, 0x0913 },
+  /* 0x7800 */
+  { 3225, 0x6260 }, { 3230, 0x2002 }, { 3232, 0x600e }, { 3237, 0x00a1 },
+  { 3240, 0x5198 }, { 3246, 0x5004 }, { 3249, 0x451b }, { 3256, 0x4400 },
+  { 3258, 0x8400 }, { 3260, 0xe110 }, { 3265, 0x3112 }, { 3270, 0xa80f },
+  { 3277, 0x5380 }, { 3282, 0x886c }, { 3288, 0x0453 }, { 3293, 0x8ccc },
+  /* 0x7900 */
+  { 3300, 0x1041 }, { 3303, 0xd401 }, { 3308, 0x22a1 }, { 3313, 0xa832 },
+  { 3319, 0x8c70 }, { 3325, 0x1912 }, { 3330, 0x0a80 }, { 3333, 0x5a04 },
+  { 3338, 0x1800 }, { 3340, 0x197a }, { 3348, 0x8b02 }, { 3353, 0x0912 },
+  { 3357, 0x8594 }, { 3363, 0x6450 }, { 3368, 0x2c25 }, { 3374, 0x1102 },
+  /* 0x7a00 */
+  { 3377, 0x168c }, { 3383, 0x4822 }, { 3387, 0xa882 }, { 3392, 0x0731 },
+  { 3398, 0x11b0 }, { 3403, 0xb260 }, { 3409, 0x24a1 }, { 3414, 0x4120 },
+  { 3417, 0x0c65 }, { 3423, 0x4013 }, { 3427, 0x1009 }, { 3430, 0x1a28 },
+  { 3435, 0x5240 }, { 3439, 0x0802 }, { 3441, 0x1b00 }, { 3445, 0x6812 },
+  /* 0x7b00 */
+  { 3450, 0x0080 }, { 3451, 0x8010 }, { 3453, 0xee88 }, { 3461, 0xa013 },
+  { 3466, 0x4083 }, { 3470, 0x0020 }, { 3471, 0xa651 }, { 3478, 0x008c },
+  { 3481, 0x4210 }, { 3484, 0x4843 }, { 3489, 0x9021 }, { 3493, 0x3c65 },
+  { 3501, 0x0524 }, { 3505, 0x0ed0 }, { 3511, 0x0500 }, { 3513, 0x5734 },
+  /* 0x7c00 */
+  { 3521, 0xda5e }, { 3531, 0x0a00 }, { 3533, 0x1161 }, { 3538, 0x065a },
+  { 3544, 0x0440 }, { 3546, 0x7e2e }, { 3556, 0x628a }, { 3562, 0x3205 },
+  { 3567, 0x80c0 }, { 3570, 0x4010 }, { 3572, 0x0041 }, { 3574, 0x9cc1 },
+  { 3581, 0xa390 }, { 3587, 0x26b8 }, { 3594, 0x0a40 }, { 3597, 0x0020 },
+  /* 0x7d00 */
+  { 3598, 0x8388 }, { 3603, 0x604e }, { 3609, 0x2448 }, { 3613, 0x7002 },
+  { 3617, 0x2183 }, { 3622, 0x368a }, { 3629, 0x04a0 }, { 3632, 0x8d01 },
+  { 3637, 0x396e }, { 3646, 0x60c2 }, { 3651, 0x04c0 }, { 3654, 0x02c8 },
+  { 3658, 0x707c }, { 3666, 0x0280 }, { 3668, 0x2c64 }, { 3674, 0x0662 },
+  /* 0x7e00 */
+  { 3679, 0x0101 }, { 3681, 0x30a3 }, { 3687, 0xb181 }, { 3693, 0x8048 },
+  { 3696, 0x40b0 }, { 3700, 0x8105 }, { 3704, 0xc826 }, { 3710, 0x4108 },
+  { 3713, 0x24c2 }, { 3718, 0x6522 }, { 3724, 0x0000 }, { 3724, 0x0000 },
+  { 3724, 0x0000 }, { 3724, 0x0000 }, { 3724, 0x0000 }, { 3724, 0x0000 },
+  /* 0x7f00 */
+  { 3724, 0x0000 }, { 3724, 0x0000 }, { 3724, 0x0000 }, { 3724, 0xf800 },
+  { 3729, 0x8098 }, { 3733, 0x380c }, { 3738, 0x207a }, { 3744, 0xe002 },
+  { 3748, 0xa801 }, { 3752, 0x10c3 }, { 3757, 0x2446 }, { 3762, 0x9010 },
+  { 3765, 0xc109 }, { 3770, 0x8800 }, { 3772, 0xd128 }, { 3778, 0xe404 },
+  /* 0x8000 */
+  { 3783, 0xe580 }, { 3789, 0xe05a }, { 3796, 0x5051 }, { 3801, 0x56b1 },
+  { 3809, 0x0011 }, { 3811, 0x0000 }, { 3811, 0x2051 }, { 3815, 0x0022 },
+  { 3817, 0x4102 }, { 3820, 0x5000 }, { 3822, 0x08c0 }, { 3825, 0x0300 },
+  { 3827, 0xa100 }, { 3830, 0x01b4 }, { 3835, 0x6001 }, { 3838, 0x464d },
+  /* 0x8100 */
+  { 3845, 0x0808 }, { 3847, 0x51c0 }, { 3852, 0x1091 }, { 3856, 0x1421 },
+  { 3860, 0x14a0 }, { 3864, 0x0084 }, { 3866, 0xa383 }, { 3873, 0x0080 },
+  { 3874, 0x4872 }, { 3880, 0x4941 }, { 3885, 0x4004 }, { 3887, 0x0814 },
+  { 3890, 0xcc28 }, { 3896, 0x68a0 }, { 3901, 0x1812 }, { 3905, 0xa367 },
+  /* 0x8200 */
+  { 3914, 0x8009 }, { 3917, 0x2618 }, { 3922, 0x0106 }, { 3925, 0x0414 },
+  { 3928, 0xc878 }, { 3935, 0x1042 }, { 3938, 0x2089 }, { 3942, 0xa810 },
+  { 3946, 0x469b }, { 3954, 0x0d52 }, { 3960, 0x479b }, { 3969, 0xd495 },
+  { 3977, 0x0040 }, { 3978, 0x0421 }, { 3981, 0xa515 }, { 3988, 0x60c0 },
+  /* 0x8300 */
+  { 3992, 0x0d83 }, { 3998, 0xe800 }, { 4002, 0x7006 }, { 4007, 0x3489 },
+  { 4013, 0x609c }, { 4019, 0x00fa }, { 4025, 0x0000 }, { 4025, 0xa101 },
+  { 4029, 0x2055 }, { 4034, 0x3b34 }, { 4042, 0x32c0 }, { 4047, 0xc000 },
+  { 4049, 0x8281 }, { 4053, 0x2013 }, { 4057, 0x0500 }, { 4059, 0x1340 },
+  /* 0x8400 */
+  { 4063, 0x8442 }, { 4067, 0x0222 }, { 4070, 0x8000 }, { 4071, 0x0200 },
+  { 4072, 0xa5a0 }, { 4078, 0x1746 }, { 4085, 0x04b1 }, { 4090, 0x3159 },
+  { 4097, 0x0022 }, { 4099, 0x402c }, { 4103, 0x8740 }, { 4108, 0x6412 },
+  { 4113, 0x9185 }, { 4119, 0x1008 }, { 4121, 0x8480 }, { 4124, 0x2c87 },
+  /* 0x8500 */
+  { 4131, 0x508c }, { 4136, 0x5001 }, { 4139, 0x8cbc }, { 4147, 0x805c },
+  { 4152, 0x8040 }, { 4154, 0xf24f }, { 4164, 0x8817 }, { 4170, 0xae00 },
+  { 4175, 0x9a62 }, { 4182, 0xa108 }, { 4186, 0x20a5 }, { 4191, 0xf1d0 },
+  { 4199, 0x4c84 }, { 4204, 0x8500 }, { 4207, 0x2141 }, { 4211, 0x9048 },
+  /* 0x8600 */
+  { 4215, 0x6031 }, { 4220, 0x4b07 }, { 4227, 0x0282 }, { 4230, 0x3540 },
+  { 4235, 0x0047 }, { 4239, 0x23cc }, { 4246, 0x921f }, { 4254, 0x04e0 },
+  { 4258, 0x2100 }, { 4260, 0x1542 }, { 4265, 0x21c2 }, { 4270, 0x83ba },
+  { 4278, 0x002b }, { 4282, 0x14a6 }, { 4288, 0x00a9 }, { 4292, 0x3400 },
+  /* 0x8700 */
+  { 4295, 0xc8b0 }, { 4301, 0xc219 }, { 4307, 0xc10a }, { 4312, 0x7606 },
+  { 4319, 0x2029 }, { 4323, 0x2100 }, { 4325, 0x8032 }, { 4329, 0x0806 },
+  { 4332, 0x1bf8 }, { 4341, 0x43a9 }, { 4348, 0x7089 }, { 4354, 0xc022 },
+  { 4358, 0x4702 }, { 4363, 0x9660 }, { 4369, 0x2c1c }, { 4375, 0x850a },
+  /* 0x8800 */
+  { 4380, 0x0e4a }, { 4386, 0xdf1d }, { 4397, 0x6100 }, { 4400, 0x1425 },
+  { 4405, 0x4f2a }, { 4413, 0x9562 }, { 4420, 0x0211 }, { 4423, 0x0a02 },
+  { 4426, 0x0001 }, { 4427, 0x9d00 }, { 4432, 0x0501 }, { 4435, 0x6400 },
+  { 4438, 0x7c01 }, { 4444, 0x480e }, { 4449, 0x8080 }, { 4451, 0x00a3 },
+  /* 0x8900 */
+  { 4455, 0xe042 }, { 4460, 0x1760 }, { 4466, 0x01c1 }, { 4470, 0x4627 },
+  { 4477, 0x8265 }, { 4483, 0x1c84 }, { 4488, 0x480e }, { 4493, 0x3c29 },
+  { 4500, 0x2200 }, { 4502, 0x9831 }, { 4508, 0x0021 }, { 4510, 0x10f1 },
+  { 4516, 0x0000 }, { 4516, 0x01f0 }, { 4521, 0x2a20 }, { 4525, 0xa24a },
+  /* 0x8a00 */
+  { 4531, 0x80b0 }, { 4535, 0x4036 }, { 4540, 0x9855 }, { 4547, 0x60a0 },
+  { 4551, 0x62a9 }, { 4558, 0x31c8 }, { 4564, 0x00a2 }, { 4567, 0xcee0 },
+  { 4575, 0x8849 }, { 4580, 0x82c5 }, { 4586, 0xc280 }, { 4590, 0x48c8 },
+  { 4595, 0x0748 }, { 4600, 0xa0ba }, { 4607, 0x1000 }, { 4608, 0x9071 },
+  /* 0x8b00 */
+  { 4614, 0x0c60 }, { 4618, 0xd002 }, { 4622, 0x2000 }, { 4623, 0x1081 },
+  { 4626, 0x217c }, { 4633, 0x421c }, { 4638, 0x2008 }, { 4640, 0x5340 },
+  { 4645, 0xa832 }, { 4651, 0xd030 }, { 4656, 0x0000 }, { 4656, 0x0000 },
+  { 4656, 0x0000 }, { 4656, 0x0000 }, { 4656, 0x0000 }, { 4656, 0x0000 },
+  /* 0x8c00 */
+  { 4656, 0x0000 }, { 4656, 0x0000 }, { 4656, 0x0000 }, { 4656, 0x6300 },
+  { 4660, 0x8aa0 }, { 4665, 0x2b9a }, { 4673, 0x2358 }, { 4679, 0x4868 },
+  { 4684, 0x08c0 }, { 4687, 0x1a0d }, { 4693, 0x0010 }, { 4694, 0x0600 },
+  { 4696, 0x8a60 }, { 4701, 0x2260 }, { 4705, 0x9102 }, { 4709, 0xc1a5 },
+  /* 0x8d00 */
+  { 4716, 0x020a }, { 4719, 0x0884 }, { 4722, 0x0000 }, { 4722, 0x0000 },
+  { 4722, 0x0000 }, { 4722, 0x0000 }, { 4722, 0x5220 }, { 4726, 0x8000 },
+  { 4727, 0x2114 }, { 4731, 0xc023 }, { 4736, 0x9841 }, { 4741, 0x1aa4 },
+  { 4747, 0x45e1 }, { 4754, 0x02b2 }, { 4759, 0x10b0 }, { 4763, 0x2017 },
+  /* 0x8e00 */
+  { 4768, 0x0872 }, { 4773, 0x0052 }, { 4776, 0x00cf }, { 4782, 0x23ca },
+  { 4789, 0xe803 }, { 4795, 0x7810 }, { 4800, 0xb206 }, { 4806, 0x0e03 },
+  { 4811, 0x020c }, { 4814, 0x6c25 }, { 4821, 0x6284 }, { 4826, 0x0c28 },
+  { 4830, 0x809b }, { 4836, 0x1012 }, { 4839, 0x6100 }, { 4842, 0x0683 },
+  /* 0x8f00 */
+  { 4847, 0x8185 }, { 4852, 0x41c1 }, { 4857, 0x71ab }, { 4866, 0x04f0 },
+  { 4871, 0x808b }, { 4876, 0x613e }, { 4884, 0x0020 }, { 4885, 0x0000 },
+  { 4885, 0x0000 }, { 4885, 0x2000 }, { 4886, 0x0073 }, { 4891, 0x4160 },
+  { 4895, 0x2c43 }, { 4901, 0x002d }, { 4905, 0x4119 }, { 4910, 0x4862 },
+  /* 0x9000 */
+  { 4915, 0x1114 }, { 4919, 0x0900 }, { 4921, 0xb700 }, { 4927, 0x8098 },
+  { 4931, 0x1018 }, { 4934, 0x2800 }, { 4936, 0x10c4 }, { 4940, 0x0211 },
+  { 4943, 0x5920 }, { 4948, 0x0ba1 }, { 4954, 0x0027 }, { 4958, 0x605d },
+  { 4965, 0x11b8 }, { 4971, 0xb3a4 }, { 4979, 0x8820 }, { 4982, 0xc051 },
+  /* 0x9100 */
+  { 4987, 0x2171 }, { 4993, 0x55d1 }, { 5001, 0xc2ad }, { 5009, 0x36d2 },
+  { 5017, 0x8188 }, { 5021, 0x0e88 }, { 5026, 0x2092 }, { 5030, 0x0e10 },
+  { 5034, 0x446a }, { 5040, 0x413a }, { 5046, 0x7142 }, { 5052, 0xb84f },
+  { 5061, 0x002c }, { 5064, 0x4698 }, { 5070, 0xf630 }, { 5078, 0x2a83 },
+  /* 0x9200 */
+  { 5084, 0x16f3 }, { 5093, 0x314d }, { 5100, 0xc178 }, { 5107, 0x5769 },
+  { 5116, 0xe4cd }, { 5125, 0x3302 }, { 5130, 0xc3a3 }, { 5138, 0xbbe1 },
+  { 5148, 0x6700 }, { 5153, 0x8284 }, { 5157, 0x89b1 }, { 5164, 0xbd44 },
+  { 5172, 0x79ef }, { 5184, 0xb3a9 }, { 5193, 0x51ab }, { 5201, 0x8a01 },
+  /* 0x9300 */
+  { 5205, 0x2105 }, { 5209, 0xf032 }, { 5216, 0x06b2 }, { 5222, 0x00d8 },
+  { 5226, 0x0380 }, { 5229, 0x45a7 }, { 5237, 0xa6b0 }, { 5244, 0xa45b },
+  { 5252, 0xad07 }, { 5260, 0x4924 }, { 5265, 0x0b5a }, { 5272, 0x0470 },
+  { 5276, 0x3ef2 }, { 5286, 0xd208 }, { 5291, 0x00c4 }, { 5294, 0x2f80 },
+  /* 0x9400 */
+  { 5300, 0xe316 }, { 5308, 0x80e0 }, { 5312, 0xc000 }, { 5314, 0xa81e },
+  { 5321, 0x1528 }, { 5326, 0x9220 }, { 5330, 0xe90a }, { 5337, 0x0006 },
+  { 5339, 0x0018 }, { 5341, 0x0000 }, { 5341, 0x0000 }, { 5341, 0x0000 },
+  { 5341, 0x0000 }, { 5341, 0x0000 }, { 5341, 0x0000 }, { 5341, 0x0000 },
+  /* 0x9500 */
+  { 5341, 0x0000 }, { 5341, 0x0000 }, { 5341, 0x0000 }, { 5341, 0x0000 },
+  { 5341, 0x0000 }, { 5341, 0x0000 }, { 5341, 0x0000 }, { 5341, 0x4300 },
+  { 5344, 0x7110 }, { 5349, 0xe000 }, { 5352, 0x1a42 }, { 5357, 0xa450 },
+  { 5362, 0x0b40 }, { 5366, 0xe60f }, { 5375, 0x0051 }, { 5378, 0x0000 },
+  /* 0x9600 */
+  { 5378, 0x0000 }, { 5378, 0x6000 }, { 5380, 0x1074 }, { 5385, 0x378a },
+  { 5393, 0x0002 }, { 5394, 0x01d4 }, { 5399, 0x4002 }, { 5401, 0xd810 },
+  { 5406, 0x021e }, { 5411, 0xa442 }, { 5416, 0xc270 }, { 5422, 0x0408 },
+  { 5424, 0x0400 }, { 5425, 0xe504 }, { 5431, 0x8200 }, { 5433, 0x0402 },
+  /* 0x9700 */
+  { 5435, 0x022c }, { 5439, 0x2c00 }, { 5442, 0x010e }, { 5446, 0x000a },
+  { 5448, 0xc40a }, { 5453, 0x0da0 }, { 5458, 0x4488 }, { 5462, 0xa9c8 },
+  { 5469, 0x0201 }, { 5471, 0xc6e0 }, { 5478, 0x5004 }, { 5481, 0xd766 },
+  { 5491, 0x76b2 }, { 5500, 0x6b93 }, { 5509, 0x8013 }, { 5513, 0x0592 },
+  /* 0x9800 */
+  { 5518, 0x6480 }, { 5522, 0x5250 }, { 5527, 0xc869 }, { 5534, 0x402d },
+  { 5539, 0x0490 }, { 5542, 0x06ce }, { 5549, 0x146c }, { 5555, 0x0000 },
+  { 5555, 0x0000 }, { 5555, 0x0000 }, { 5555, 0x6800 }, { 5558, 0x8d91 },
+  { 5565, 0x1124 }, { 5569, 0x0000 }, { 5569, 0x04ea }, { 5575, 0x0048 },
+  /* 0x9900 */
+  { 5577, 0x0184 }, { 5580, 0x9ce2 }, { 5588, 0x08c4 }, { 5592, 0x1e3e },
+  { 5601, 0x61c3 }, { 5608, 0xdb10 }, { 5615, 0x0001 }, { 5616, 0x0000 },
+  { 5616, 0x0000 }, { 5616, 0xa800 }, { 5619, 0x0040 }, { 5620, 0xa627 },
+  { 5628, 0x0208 }, { 5630, 0x5618 }, { 5636, 0x1c80 }, { 5640, 0x6231 },
+  /* 0x9a00 */
+  { 5646, 0x181c }, { 5651, 0x4043 }, { 5655, 0x609d }, { 5662, 0x0168 },
+  { 5666, 0x5c92 }, { 5673, 0x2052 }, { 5677, 0x0000 }, { 5677, 0x0000 },
+  { 5677, 0x0000 }, { 5677, 0x0000 }, { 5677, 0xd400 }, { 5681, 0xca74 },
+  { 5689, 0x414a }, { 5694, 0x18e5 }, { 5701, 0x12b1 }, { 5707, 0xa62c },
+  /* 0x9b00 */
+  { 5714, 0x7b3f }, { 5726, 0x1a45 }, { 5732, 0x2841 }, { 5736, 0x26b8 },
+  { 5743, 0x1900 }, { 5746, 0x48e0 }, { 5751, 0x7d6a }, { 5761, 0x83a8 },
+  { 5767, 0xaef1 }, { 5777, 0x6411 }, { 5782, 0x12c0 }, { 5786, 0xd987 },
+  { 5795, 0x4182 }, { 5799, 0xa181 }, { 5804, 0x8ca0 }, { 5809, 0xa788 },
+  /* 0x9c00 */
+  { 5816, 0x8805 }, { 5820, 0x5742 }, { 5827, 0x07cc }, { 5834, 0x20e2 },
+  { 5839, 0xc63a }, { 5847, 0xf959 }, { 5857, 0x4f08 }, { 5863, 0x08a5 },
+  { 5868, 0x0000 }, { 5868, 0x0000 }, { 5868, 0x0000 }, { 5868, 0x0000 },
+  { 5868, 0x0000 }, { 5868, 0x0000 }, { 5868, 0x0040 }, { 5869, 0x0284 },
+  /* 0x9d00 */
+  { 5872, 0x0804 }, { 5874, 0x7182 }, { 5880, 0x8000 }, { 5881, 0x341d },
+  { 5888, 0x04ac }, { 5893, 0x8018 }, { 5896, 0x0e2c }, { 5902, 0x58c1 },
+  { 5908, 0x6458 }, { 5914, 0x01ec }, { 5920, 0x5402 }, { 5924, 0x9222 },
+  { 5929, 0x0688 }, { 5933, 0xc4f0 }, { 5940, 0x4aa1 }, { 5946, 0x4019 },
+  /* 0x9e00 */
+  { 5950, 0x4484 }, { 5954, 0x3267 }, { 5962, 0x0000 }, { 5962, 0x0000 },
+  { 5962, 0x0000 }, { 5962, 0x0000 }, { 5962, 0x0000 }, { 5962, 0x1c00 },
+  { 5965, 0xc0bd }, { 5973, 0x4940 }, { 5977, 0xd110 }, { 5982, 0x0039 },
+  { 5986, 0x0940 }, { 5989, 0x8020 }, { 5991, 0x7090 }, { 5996, 0x8127 },
+  /* 0x9f00 */
+  { 6002, 0x820c }, { 6006, 0x8ed7 }, { 6016, 0x8c44 }, { 6021, 0xb696 },
+  { 6030, 0x00fa }, { 6036, 0x65e8 }, { 6044, 0xe300 }, { 6049, 0x242b },
+  { 6055, 0x8000 }, { 6056, 0x40d7 }, { 6063, 0x002e },
+};
+
+static int
+jisx0212_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  if (n >= 2) {
+    const Summary16 *summary = NULL;
+    if (wc < 0x0460)
+      summary = &jisx0212_uni2indx_page00[(wc>>4)];
+    else if (wc >= 0x2100 && wc < 0x2130)
+      summary = &jisx0212_uni2indx_page21[(wc>>4)-0x210];
+    else if (wc >= 0x4e00 && wc < 0x9fb0)
+      summary = &jisx0212_uni2indx_page4e[(wc>>4)-0x4e0];
+    if (summary) {
+      unsigned short used = summary->used;
+      unsigned int i = wc & 0x0f;
+      if (used & ((unsigned short) 1 << i)) {
+        unsigned short c;
+        /* Keep in `used' only the bits 0..i-1. */
+        used &= ((unsigned short) 1 << i) - 1;
+        /* Add `summary->indx' and the number of bits set in `used'. */
+        used = (used & 0x5555) + ((used & 0xaaaa) >> 1);
+        used = (used & 0x3333) + ((used & 0xcccc) >> 2);
+        used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4);
+        used = (used & 0x00ff) + (used >> 8);
+        c = jisx0212_2charset[summary->indx + used];
+        r[0] = (c >> 8); r[1] = (c & 0xff);
+        return 2;
+      }
+    }
+    return RET_ILSEQ;
+  }
+  return RET_TOOSMALL;
+}
diff --git a/src/xlibi18n/lcUniConv/koi8_c.h b/src/xlibi18n/lcUniConv/koi8_c.h
new file mode 100644 (file)
index 0000000..d870a01
--- /dev/null
@@ -0,0 +1,102 @@
+
+/*
+ * KOI8-C
+ */
+
+static const unsigned short koi8_c_2uni[128] = {
+  /* 0x80 */
+  0x0493, 0x0497, 0x049b, 0x049d, 0x04a3, 0x04af, 0x04b1, 0x04b3,
+  0x04b7, 0x04b9, 0x04bb, 0x2580, 0x04d9, 0x04e3, 0x04e9, 0x04ef,
+  /* 0x90 */
+  0x0492, 0x0496, 0x049a, 0x049c, 0x04a2, 0x04ae, 0x04b0, 0x04b2,
+  0x04b6, 0x04b8, 0x04ba, 0x2321, 0x04d8, 0x04e2, 0x04e8, 0x04ee,
+  /* 0xa0 */
+  0x00a0, 0x0452, 0x0453, 0x0451, 0x0454, 0x0455, 0x0456, 0x0457,
+  0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x0491, 0x045e, 0x045f,
+  /* 0xb0 */
+  0x2116, 0x0402, 0x0403, 0x0401, 0x0404, 0x0405, 0x0406, 0x0407,
+  0x0486, 0x0409, 0x040a, 0x040b, 0x040c, 0x0490, 0x040e, 0x040f,
+  /* 0xc0 */
+  0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433,
+  0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e,
+  /* 0xd0 */
+  0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432,
+  0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a,
+  /* 0xe0 */
+  0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413,
+  0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e,
+  /* 0xf0 */
+  0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412,
+  0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a,
+};
+
+static int
+koi8_c_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c < 0x80)
+    *pwc = (ucs4_t) c;
+  else
+    *pwc = (ucs4_t) koi8_c_2uni[c-0x80];
+  return 1;
+}
+
+static const unsigned char koi8_c_page00[1] = {
+  0xa0,                                           /* 0xa0-0xa7 */
+};
+static const unsigned char koi8_c_page04[240] = {
+  0x00, 0xb3, 0xb1, 0xb2, 0xb4, 0xb5, 0xb6, 0xb7, /* 0x00-0x07 */
+  0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0x00, 0xbe, 0xbf, /* 0x08-0x0f */
+  0xe1, 0xe2, 0xf7, 0xe7, 0xe4, 0xe5, 0xf6, 0xfa, /* 0x10-0x17 */
+  0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, /* 0x18-0x1f */
+  0xf2, 0xf3, 0xf4, 0xf5, 0xe6, 0xe8, 0xe3, 0xfe, /* 0x20-0x27 */
+  0xfb, 0xfd, 0xff, 0xf9, 0xf8, 0xfc, 0xe0, 0xf1, /* 0x28-0x2f */
+  0xc1, 0xc2, 0xd7, 0xc7, 0xc4, 0xc5, 0xd6, 0xda, /* 0x30-0x37 */
+  0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, /* 0x38-0x3f */
+  0xd2, 0xd3, 0xd4, 0xd5, 0xc6, 0xc8, 0xc3, 0xde, /* 0x40-0x47 */
+  0xdb, 0xdd, 0xdf, 0xd9, 0xd8, 0xdc, 0xc0, 0xd1, /* 0x48-0x4f */
+  0x00, 0xa3, 0xa1, 0xa2, 0xa4, 0xa5, 0xa6, 0xa7, /* 0x50-0x57 */
+  0xa8, 0xa9, 0xaa, 0xab, 0xac, 0x00, 0xae, 0xaf, /* 0x58-0x5f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */
+  0xbd, 0xad, 0x90, 0x80, 0x00, 0x00, 0x91, 0x81, /* 0x90-0x97 */
+  0x00, 0x00, 0x92, 0x82, 0x93, 0x83, 0x00, 0x00, /* 0x98-0x9f */
+  0x00, 0x00, 0x94, 0x84, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x85, /* 0xa8-0xaf */
+  0x96, 0x86, 0x97, 0x87, 0x00, 0x00, 0x98, 0x88, /* 0xb0-0xb7 */
+  0x99, 0x89, 0x9a, 0x8a, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */
+  0x9c, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */
+  0x00, 0x00, 0x9d, 0x8d, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */
+  0x9e, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x9f, 0x8f, /* 0xe8-0xef */
+};
+static const unsigned char koi8_c_page22[1] = {
+                                      0xb0,       /* 0x16-0x16 */
+};
+
+static int
+koi8_c_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  unsigned char c = 0;
+  if (wc < 0x0080) {
+    *r = wc;
+    return 1;
+  }
+  else if (wc >= 0x00a0 && wc < 0x00a1)
+    c = koi8_c_page00[wc-0x00a0];
+  else if (wc >= 0x0400 && wc < 0x04ef)
+    c = koi8_c_page04[wc-0x0400];
+  else if (wc >= 0x2216 && wc < 0x2217)
+    c = koi8_c_page22[wc-0x2216];
+  if (c != 0) {
+    *r = c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/koi8_r.h b/src/xlibi18n/lcUniConv/koi8_r.h
new file mode 100644 (file)
index 0000000..37ca594
--- /dev/null
@@ -0,0 +1,134 @@
+
+/*
+ * KOI8-R
+ */
+
+/* Specification: RFC 1489 */
+
+static const unsigned short koi8_r_2uni[128] = {
+  /* 0x80 */
+  0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524,
+  0x252c, 0x2534, 0x253c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590,
+  /* 0x90 */
+  0x2591, 0x2592, 0x2593, 0x2320, 0x25a0, 0x2219, 0x221a, 0x2248,
+  0x2264, 0x2265, 0x00a0, 0x2321, 0x00b0, 0x00b2, 0x00b7, 0x00f7,
+  /* 0xa0 */
+  0x2550, 0x2551, 0x2552, 0x0451, 0x2553, 0x2554, 0x2555, 0x2556,
+  0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e,
+  /* 0xb0 */
+  0x255f, 0x2560, 0x2561, 0x0401, 0x2562, 0x2563, 0x2564, 0x2565,
+  0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0x00a9,
+  /* 0xc0 */
+  0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433,
+  0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e,
+  /* 0xd0 */
+  0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432,
+  0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a,
+  /* 0xe0 */
+  0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413,
+  0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e,
+  /* 0xf0 */
+  0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412,
+  0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a,
+};
+
+static int
+koi8_r_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c < 0x80)
+    *pwc = (ucs4_t) c;
+  else
+    *pwc = (ucs4_t) koi8_r_2uni[c-0x80];
+  return 1;
+}
+
+static const unsigned char koi8_r_page00[88] = {
+  0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */
+  0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */
+  0x9c, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x00, 0x9e, /* 0xb0-0xb7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, /* 0xf0-0xf7 */
+};
+static const unsigned char koi8_r_page04[88] = {
+  0x00, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */
+  0xe1, 0xe2, 0xf7, 0xe7, 0xe4, 0xe5, 0xf6, 0xfa, /* 0x10-0x17 */
+  0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, /* 0x18-0x1f */
+  0xf2, 0xf3, 0xf4, 0xf5, 0xe6, 0xe8, 0xe3, 0xfe, /* 0x20-0x27 */
+  0xfb, 0xfd, 0xff, 0xf9, 0xf8, 0xfc, 0xe0, 0xf1, /* 0x28-0x2f */
+  0xc1, 0xc2, 0xd7, 0xc7, 0xc4, 0xc5, 0xd6, 0xda, /* 0x30-0x37 */
+  0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, /* 0x38-0x3f */
+  0xd2, 0xd3, 0xd4, 0xd5, 0xc6, 0xc8, 0xc3, 0xde, /* 0x40-0x47 */
+  0xdb, 0xdd, 0xdf, 0xd9, 0xd8, 0xdc, 0xc0, 0xd1, /* 0x48-0x4f */
+  0x00, 0xa3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */
+};
+static const unsigned char koi8_r_page22[80] = {
+  0x00, 0x95, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */
+  0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */
+  0x00, 0x00, 0x00, 0x00, 0x98, 0x99, 0x00, 0x00, /* 0x60-0x67 */
+};
+static const unsigned char koi8_r_page23[8] = {
+  0x93, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */
+};
+static const unsigned char koi8_r_page25[168] = {
+  0x80, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */
+  0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, /* 0x08-0x0f */
+  0x83, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, /* 0x10-0x17 */
+  0x85, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, /* 0x18-0x1f */
+  0x00, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, /* 0x20-0x27 */
+  0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, /* 0x28-0x2f */
+  0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, /* 0x30-0x37 */
+  0x00, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, /* 0x38-0x3f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */
+  0xa0, 0xa1, 0xa2, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, /* 0x50-0x57 */
+  0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, /* 0x58-0x5f */
+  0xb1, 0xb2, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, /* 0x60-0x67 */
+  0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0x00, 0x00, 0x00, /* 0x68-0x6f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */
+  0x8b, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, /* 0x80-0x87 */
+  0x8d, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, /* 0x88-0x8f */
+  0x8f, 0x90, 0x91, 0x92, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */
+  0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */
+};
+
+static int
+koi8_r_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  unsigned char c = 0;
+  if (wc < 0x0080) {
+    *r = wc;
+    return 1;
+  }
+  else if (wc >= 0x00a0 && wc < 0x00f8)
+    c = koi8_r_page00[wc-0x00a0];
+  else if (wc >= 0x0400 && wc < 0x0458)
+    c = koi8_r_page04[wc-0x0400];
+  else if (wc >= 0x2218 && wc < 0x2268)
+    c = koi8_r_page22[wc-0x2218];
+  else if (wc >= 0x2320 && wc < 0x2328)
+    c = koi8_r_page23[wc-0x2320];
+  else if (wc >= 0x2500 && wc < 0x25a8)
+    c = koi8_r_page25[wc-0x2500];
+  if (c != 0) {
+    *r = c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/koi8_u.h b/src/xlibi18n/lcUniConv/koi8_u.h
new file mode 100644 (file)
index 0000000..e094419
--- /dev/null
@@ -0,0 +1,142 @@
+
+/*
+ * KOI8-U
+ */
+
+/* Specification: RFC 2319 */
+
+static const unsigned short koi8_u_2uni[128] = {
+  /* 0x80 */
+  0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524,
+  0x252c, 0x2534, 0x253c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590,
+  /* 0x90 */
+  0x2591, 0x2592, 0x2593, 0x2320, 0x25a0, 0x2219, 0x221a, 0x2248,
+  0x2264, 0x2265, 0x00a0, 0x2321, 0x00b0, 0x00b2, 0x00b7, 0x00f7,
+  /* 0xa0 */
+  0x2550, 0x2551, 0x2552, 0x0451, 0x0454, 0x2554, 0x0456, 0x0457,
+  0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x0491, 0x255d, 0x255e,
+  /* 0xb0 */
+  0x255f, 0x2560, 0x2561, 0x0401, 0x0404, 0x2563, 0x0406, 0x0407,
+  0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x0490, 0x256c, 0x00a9,
+  /* 0xc0 */
+  0x044e, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433,
+  0x0445, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e,
+  /* 0xd0 */
+  0x043f, 0x044f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432,
+  0x044c, 0x044b, 0x0437, 0x0448, 0x044d, 0x0449, 0x0447, 0x044a,
+  /* 0xe0 */
+  0x042e, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413,
+  0x0425, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e,
+  /* 0xf0 */
+  0x041f, 0x042f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412,
+  0x042c, 0x042b, 0x0417, 0x0428, 0x042d, 0x0429, 0x0427, 0x042a,
+};
+
+static int
+koi8_u_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c < 0x80)
+    *pwc = (ucs4_t) c;
+  else
+    *pwc = (ucs4_t) koi8_u_2uni[c-0x80];
+  return 1;
+}
+
+static const unsigned char koi8_u_page00[88] = {
+  0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */
+  0x00, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */
+  0x9c, 0x00, 0x9d, 0x00, 0x00, 0x00, 0x00, 0x9e, /* 0xb0-0xb7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, /* 0xf0-0xf7 */
+};
+static const unsigned char koi8_u_page04[152] = {
+  0x00, 0xb3, 0x00, 0x00, 0xb4, 0x00, 0xb6, 0xb7, /* 0x00-0x07 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */
+  0xe1, 0xe2, 0xf7, 0xe7, 0xe4, 0xe5, 0xf6, 0xfa, /* 0x10-0x17 */
+  0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, /* 0x18-0x1f */
+  0xf2, 0xf3, 0xf4, 0xf5, 0xe6, 0xe8, 0xe3, 0xfe, /* 0x20-0x27 */
+  0xfb, 0xfd, 0xff, 0xf9, 0xf8, 0xfc, 0xe0, 0xf1, /* 0x28-0x2f */
+  0xc1, 0xc2, 0xd7, 0xc7, 0xc4, 0xc5, 0xd6, 0xda, /* 0x30-0x37 */
+  0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, /* 0x38-0x3f */
+  0xd2, 0xd3, 0xd4, 0xd5, 0xc6, 0xc8, 0xc3, 0xde, /* 0x40-0x47 */
+  0xdb, 0xdd, 0xdf, 0xd9, 0xd8, 0xdc, 0xc0, 0xd1, /* 0x48-0x4f */
+  0x00, 0xa3, 0x00, 0x00, 0xa4, 0x00, 0xa6, 0xa7, /* 0x50-0x57 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */
+  0xbd, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */
+};
+static const unsigned char koi8_u_page22[80] = {
+  0x00, 0x95, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */
+  0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */
+  0x00, 0x00, 0x00, 0x00, 0x98, 0x99, 0x00, 0x00, /* 0x60-0x67 */
+};
+static const unsigned char koi8_u_page23[8] = {
+  0x93, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */
+};
+static const unsigned char koi8_u_page25[168] = {
+  0x80, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */
+  0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, /* 0x08-0x0f */
+  0x83, 0x00, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, /* 0x10-0x17 */
+  0x85, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, /* 0x18-0x1f */
+  0x00, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, /* 0x20-0x27 */
+  0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, /* 0x28-0x2f */
+  0x00, 0x00, 0x00, 0x00, 0x89, 0x00, 0x00, 0x00, /* 0x30-0x37 */
+  0x00, 0x00, 0x00, 0x00, 0x8a, 0x00, 0x00, 0x00, /* 0x38-0x3f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */
+  0xa0, 0xa1, 0xa2, 0x00, 0xa5, 0x00, 0x00, 0xa8, /* 0x50-0x57 */
+  0xa9, 0xaa, 0xab, 0xac, 0x00, 0xae, 0xaf, 0xb0, /* 0x58-0x5f */
+  0xb1, 0xb2, 0x00, 0xb5, 0x00, 0x00, 0xb8, 0xb9, /* 0x60-0x67 */
+  0xba, 0xbb, 0xbc, 0x00, 0xbe, 0x00, 0x00, 0x00, /* 0x68-0x6f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */
+  0x8b, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, /* 0x80-0x87 */
+  0x8d, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, /* 0x88-0x8f */
+  0x8f, 0x90, 0x91, 0x92, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */
+  0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */
+};
+
+static int
+koi8_u_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  unsigned char c = 0;
+  if (wc < 0x0080) {
+    *r = wc;
+    return 1;
+  }
+  else if (wc >= 0x00a0 && wc < 0x00f8)
+    c = koi8_u_page00[wc-0x00a0];
+  else if (wc >= 0x0400 && wc < 0x0498)
+    c = koi8_u_page04[wc-0x0400];
+  else if (wc >= 0x2218 && wc < 0x2268)
+    c = koi8_u_page22[wc-0x2218];
+  else if (wc >= 0x2320 && wc < 0x2328)
+    c = koi8_u_page23[wc-0x2320];
+  else if (wc >= 0x2500 && wc < 0x25a8)
+    c = koi8_u_page25[wc-0x2500];
+  if (c != 0) {
+    *r = c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/ksc5601.h b/src/xlibi18n/lcUniConv/ksc5601.h
new file mode 100644 (file)
index 0000000..843dcff
--- /dev/null
@@ -0,0 +1,3002 @@
+
+/*
+ * KSC5601.1987-0
+ */
+
+static const unsigned short ksc5601_2uni_page21[1115] = {
+  /* 0x21 */
+  0x3000, 0x3001, 0x3002, 0x00b7, 0x2025, 0x2026, 0x00a8, 0x3003,
+  0x00ad, 0x2015, 0x2225, 0xff3c, 0x223c, 0x2018, 0x2019, 0x201c,
+  0x201d, 0x3014, 0x3015, 0x3008, 0x3009, 0x300a, 0x300b, 0x300c,
+  0x300d, 0x300e, 0x300f, 0x3010, 0x3011, 0x00b1, 0x00d7, 0x00f7,
+  0x2260, 0x2264, 0x2265, 0x221e, 0x2234, 0x00b0, 0x2032, 0x2033,
+  0x2103, 0x212b, 0xffe0, 0xffe1, 0xffe5, 0x2642, 0x2640, 0x2220,
+  0x22a5, 0x2312, 0x2202, 0x2207, 0x2261, 0x2252, 0x00a7, 0x203b,
+  0x2606, 0x2605, 0x25cb, 0x25cf, 0x25ce, 0x25c7, 0x25c6, 0x25a1,
+  0x25a0, 0x25b3, 0x25b2, 0x25bd, 0x25bc, 0x2192, 0x2190, 0x2191,
+  0x2193, 0x2194, 0x3013, 0x226a, 0x226b, 0x221a, 0x223d, 0x221d,
+  0x2235, 0x222b, 0x222c, 0x2208, 0x220b, 0x2286, 0x2287, 0x2282,
+  0x2283, 0x222a, 0x2229, 0x2227, 0x2228, 0xffe2,
+  /* 0x22 */
+  0x21d2, 0x21d4, 0x2200, 0x2203, 0x00b4, 0xff5e, 0x02c7, 0x02d8,
+  0x02dd, 0x02da, 0x02d9, 0x00b8, 0x02db, 0x00a1, 0x00bf, 0x02d0,
+  0x222e, 0x2211, 0x220f, 0x00a4, 0x2109, 0x2030, 0x25c1, 0x25c0,
+  0x25b7, 0x25b6, 0x2664, 0x2660, 0x2661, 0x2665, 0x2667, 0x2663,
+  0x2299, 0x25c8, 0x25a3, 0x25d0, 0x25d1, 0x2592, 0x25a4, 0x25a5,
+  0x25a8, 0x25a7, 0x25a6, 0x25a9, 0x2668, 0x260f, 0x260e, 0x261c,
+  0x261e, 0x00b6, 0x2020, 0x2021, 0x2195, 0x2197, 0x2199, 0x2196,
+  0x2198, 0x266d, 0x2669, 0x266a, 0x266c, 0x327f, 0x321c, 0x2116,
+  0x33c7, 0x2122, 0x33c2, 0x33d8, 0x2121, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0x23 */
+  0xff01, 0xff02, 0xff03, 0xff04, 0xff05, 0xff06, 0xff07, 0xff08,
+  0xff09, 0xff0a, 0xff0b, 0xff0c, 0xff0d, 0xff0e, 0xff0f, 0xff10,
+  0xff11, 0xff12, 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18,
+  0xff19, 0xff1a, 0xff1b, 0xff1c, 0xff1d, 0xff1e, 0xff1f, 0xff20,
+  0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28,
+  0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30,
+  0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38,
+  0xff39, 0xff3a, 0xff3b, 0xffe6, 0xff3d, 0xff3e, 0xff3f, 0xff40,
+  0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48,
+  0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50,
+  0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, 0xff58,
+  0xff59, 0xff5a, 0xff5b, 0xff5c, 0xff5d, 0xffe3,
+  /* 0x24 */
+  0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3138,
+  0x3139, 0x313a, 0x313b, 0x313c, 0x313d, 0x313e, 0x313f, 0x3140,
+  0x3141, 0x3142, 0x3143, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148,
+  0x3149, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e, 0x314f, 0x3150,
+  0x3151, 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158,
+  0x3159, 0x315a, 0x315b, 0x315c, 0x315d, 0x315e, 0x315f, 0x3160,
+  0x3161, 0x3162, 0x3163, 0x3164, 0x3165, 0x3166, 0x3167, 0x3168,
+  0x3169, 0x316a, 0x316b, 0x316c, 0x316d, 0x316e, 0x316f, 0x3170,
+  0x3171, 0x3172, 0x3173, 0x3174, 0x3175, 0x3176, 0x3177, 0x3178,
+  0x3179, 0x317a, 0x317b, 0x317c, 0x317d, 0x317e, 0x317f, 0x3180,
+  0x3181, 0x3182, 0x3183, 0x3184, 0x3185, 0x3186, 0x3187, 0x3188,
+  0x3189, 0x318a, 0x318b, 0x318c, 0x318d, 0x318e,
+  /* 0x25 */
+  0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177,
+  0x2178, 0x2179, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x2160,
+  0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168,
+  0x2169, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398,
+  0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0,
+  0x03a1, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8,
+  0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0,
+  0x03c1, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0x26 */
+  0x2500, 0x2502, 0x250c, 0x2510, 0x2518, 0x2514, 0x251c, 0x252c,
+  0x2524, 0x2534, 0x253c, 0x2501, 0x2503, 0x250f, 0x2513, 0x251b,
+  0x2517, 0x2523, 0x2533, 0x252b, 0x253b, 0x254b, 0x2520, 0x252f,
+  0x2528, 0x2537, 0x253f, 0x251d, 0x2530, 0x2525, 0x2538, 0x2542,
+  0x2512, 0x2511, 0x251a, 0x2519, 0x2516, 0x2515, 0x250e, 0x250d,
+  0x251e, 0x251f, 0x2521, 0x2522, 0x2526, 0x2527, 0x2529, 0x252a,
+  0x252d, 0x252e, 0x2531, 0x2532, 0x2535, 0x2536, 0x2539, 0x253a,
+  0x253d, 0x253e, 0x2540, 0x2541, 0x2543, 0x2544, 0x2545, 0x2546,
+  0x2547, 0x2548, 0x2549, 0x254a, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0x27 */
+  0x3395, 0x3396, 0x3397, 0x2113, 0x3398, 0x33c4, 0x33a3, 0x33a4,
+  0x33a5, 0x33a6, 0x3399, 0x339a, 0x339b, 0x339c, 0x339d, 0x339e,
+  0x339f, 0x33a0, 0x33a1, 0x33a2, 0x33ca, 0x338d, 0x338e, 0x338f,
+  0x33cf, 0x3388, 0x3389, 0x33c8, 0x33a7, 0x33a8, 0x33b0, 0x33b1,
+  0x33b2, 0x33b3, 0x33b4, 0x33b5, 0x33b6, 0x33b7, 0x33b8, 0x33b9,
+  0x3380, 0x3381, 0x3382, 0x3383, 0x3384, 0x33ba, 0x33bb, 0x33bc,
+  0x33bd, 0x33be, 0x33bf, 0x3390, 0x3391, 0x3392, 0x3393, 0x3394,
+  0x2126, 0x33c0, 0x33c1, 0x338a, 0x338b, 0x338c, 0x33d6, 0x33c5,
+  0x33ad, 0x33ae, 0x33af, 0x33db, 0x33a9, 0x33aa, 0x33ab, 0x33ac,
+  0x33dd, 0x33d0, 0x33d3, 0x33c3, 0x33c9, 0x33dc, 0x33c6, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0x28 */
+  0x00c6, 0x00d0, 0x00aa, 0x0126, 0xfffd, 0x0132, 0xfffd, 0x013f,
+  0x0141, 0x00d8, 0x0152, 0x00ba, 0x00de, 0x0166, 0x014a, 0xfffd,
+  0x3260, 0x3261, 0x3262, 0x3263, 0x3264, 0x3265, 0x3266, 0x3267,
+  0x3268, 0x3269, 0x326a, 0x326b, 0x326c, 0x326d, 0x326e, 0x326f,
+  0x3270, 0x3271, 0x3272, 0x3273, 0x3274, 0x3275, 0x3276, 0x3277,
+  0x3278, 0x3279, 0x327a, 0x327b, 0x24d0, 0x24d1, 0x24d2, 0x24d3,
+  0x24d4, 0x24d5, 0x24d6, 0x24d7, 0x24d8, 0x24d9, 0x24da, 0x24db,
+  0x24dc, 0x24dd, 0x24de, 0x24df, 0x24e0, 0x24e1, 0x24e2, 0x24e3,
+  0x24e4, 0x24e5, 0x24e6, 0x24e7, 0x24e8, 0x24e9, 0x2460, 0x2461,
+  0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469,
+  0x246a, 0x246b, 0x246c, 0x246d, 0x246e, 0x00bd, 0x2153, 0x2154,
+  0x00bc, 0x00be, 0x215b, 0x215c, 0x215d, 0x215e,
+  /* 0x29 */
+  0x00e6, 0x0111, 0x00f0, 0x0127, 0x0131, 0x0133, 0x0138, 0x0140,
+  0x0142, 0x00f8, 0x0153, 0x00df, 0x00fe, 0x0167, 0x014b, 0x0149,
+  0x3200, 0x3201, 0x3202, 0x3203, 0x3204, 0x3205, 0x3206, 0x3207,
+  0x3208, 0x3209, 0x320a, 0x320b, 0x320c, 0x320d, 0x320e, 0x320f,
+  0x3210, 0x3211, 0x3212, 0x3213, 0x3214, 0x3215, 0x3216, 0x3217,
+  0x3218, 0x3219, 0x321a, 0x321b, 0x249c, 0x249d, 0x249e, 0x249f,
+  0x24a0, 0x24a1, 0x24a2, 0x24a3, 0x24a4, 0x24a5, 0x24a6, 0x24a7,
+  0x24a8, 0x24a9, 0x24aa, 0x24ab, 0x24ac, 0x24ad, 0x24ae, 0x24af,
+  0x24b0, 0x24b1, 0x24b2, 0x24b3, 0x24b4, 0x24b5, 0x2474, 0x2475,
+  0x2476, 0x2477, 0x2478, 0x2479, 0x247a, 0x247b, 0x247c, 0x247d,
+  0x247e, 0x247f, 0x2480, 0x2481, 0x2482, 0x00b9, 0x00b2, 0x00b3,
+  0x2074, 0x207f, 0x2081, 0x2082, 0x2083, 0x2084,
+  /* 0x2a */
+  0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047, 0x3048,
+  0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f, 0x3050,
+  0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057, 0x3058,
+  0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f, 0x3060,
+  0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068,
+  0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3070,
+  0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077, 0x3078,
+  0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e, 0x307f, 0x3080,
+  0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087, 0x3088,
+  0x3089, 0x308a, 0x308b, 0x308c, 0x308d, 0x308e, 0x308f, 0x3090,
+  0x3091, 0x3092, 0x3093, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0x2b */
+  0x30a1, 0x30a2, 0x30a3, 0x30a4, 0x30a5, 0x30a6, 0x30a7, 0x30a8,
+  0x30a9, 0x30aa, 0x30ab, 0x30ac, 0x30ad, 0x30ae, 0x30af, 0x30b0,
+  0x30b1, 0x30b2, 0x30b3, 0x30b4, 0x30b5, 0x30b6, 0x30b7, 0x30b8,
+  0x30b9, 0x30ba, 0x30bb, 0x30bc, 0x30bd, 0x30be, 0x30bf, 0x30c0,
+  0x30c1, 0x30c2, 0x30c3, 0x30c4, 0x30c5, 0x30c6, 0x30c7, 0x30c8,
+  0x30c9, 0x30ca, 0x30cb, 0x30cc, 0x30cd, 0x30ce, 0x30cf, 0x30d0,
+  0x30d1, 0x30d2, 0x30d3, 0x30d4, 0x30d5, 0x30d6, 0x30d7, 0x30d8,
+  0x30d9, 0x30da, 0x30db, 0x30dc, 0x30dd, 0x30de, 0x30df, 0x30e0,
+  0x30e1, 0x30e2, 0x30e3, 0x30e4, 0x30e5, 0x30e6, 0x30e7, 0x30e8,
+  0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ee, 0x30ef, 0x30f0,
+  0x30f1, 0x30f2, 0x30f3, 0x30f4, 0x30f5, 0x30f6, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  /* 0x2c */
+  0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401, 0x0416,
+  0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e,
+  0x041f, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426,
+  0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e,
+  0x042f, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+  0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436,
+  0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e,
+  0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446,
+  0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e,
+  0x044f,
+};
+static const unsigned short ksc5601_2uni_page30[2350] = {
+  /* 0x30 */
+  0xac00, 0xac01, 0xac04, 0xac07, 0xac08, 0xac09, 0xac0a, 0xac10,
+  0xac11, 0xac12, 0xac13, 0xac14, 0xac15, 0xac16, 0xac17, 0xac19,
+  0xac1a, 0xac1b, 0xac1c, 0xac1d, 0xac20, 0xac24, 0xac2c, 0xac2d,
+  0xac2f, 0xac30, 0xac31, 0xac38, 0xac39, 0xac3c, 0xac40, 0xac4b,
+  0xac4d, 0xac54, 0xac58, 0xac5c, 0xac70, 0xac71, 0xac74, 0xac77,
+  0xac78, 0xac7a, 0xac80, 0xac81, 0xac83, 0xac84, 0xac85, 0xac86,
+  0xac89, 0xac8a, 0xac8b, 0xac8c, 0xac90, 0xac94, 0xac9c, 0xac9d,
+  0xac9f, 0xaca0, 0xaca1, 0xaca8, 0xaca9, 0xacaa, 0xacac, 0xacaf,
+  0xacb0, 0xacb8, 0xacb9, 0xacbb, 0xacbc, 0xacbd, 0xacc1, 0xacc4,
+  0xacc8, 0xaccc, 0xacd5, 0xacd7, 0xace0, 0xace1, 0xace4, 0xace7,
+  0xace8, 0xacea, 0xacec, 0xacef, 0xacf0, 0xacf1, 0xacf3, 0xacf5,
+  0xacf6, 0xacfc, 0xacfd, 0xad00, 0xad04, 0xad06,
+  /* 0x31 */
+  0xad0c, 0xad0d, 0xad0f, 0xad11, 0xad18, 0xad1c, 0xad20, 0xad29,
+  0xad2c, 0xad2d, 0xad34, 0xad35, 0xad38, 0xad3c, 0xad44, 0xad45,
+  0xad47, 0xad49, 0xad50, 0xad54, 0xad58, 0xad61, 0xad63, 0xad6c,
+  0xad6d, 0xad70, 0xad73, 0xad74, 0xad75, 0xad76, 0xad7b, 0xad7c,
+  0xad7d, 0xad7f, 0xad81, 0xad82, 0xad88, 0xad89, 0xad8c, 0xad90,
+  0xad9c, 0xad9d, 0xada4, 0xadb7, 0xadc0, 0xadc1, 0xadc4, 0xadc8,
+  0xadd0, 0xadd1, 0xadd3, 0xaddc, 0xade0, 0xade4, 0xadf8, 0xadf9,
+  0xadfc, 0xadff, 0xae00, 0xae01, 0xae08, 0xae09, 0xae0b, 0xae0d,
+  0xae14, 0xae30, 0xae31, 0xae34, 0xae37, 0xae38, 0xae3a, 0xae40,
+  0xae41, 0xae43, 0xae45, 0xae46, 0xae4a, 0xae4c, 0xae4d, 0xae4e,
+  0xae50, 0xae54, 0xae56, 0xae5c, 0xae5d, 0xae5f, 0xae60, 0xae61,
+  0xae65, 0xae68, 0xae69, 0xae6c, 0xae70, 0xae78,
+  /* 0x32 */
+  0xae79, 0xae7b, 0xae7c, 0xae7d, 0xae84, 0xae85, 0xae8c, 0xaebc,
+  0xaebd, 0xaebe, 0xaec0, 0xaec4, 0xaecc, 0xaecd, 0xaecf, 0xaed0,
+  0xaed1, 0xaed8, 0xaed9, 0xaedc, 0xaee8, 0xaeeb, 0xaeed, 0xaef4,
+  0xaef8, 0xaefc, 0xaf07, 0xaf08, 0xaf0d, 0xaf10, 0xaf2c, 0xaf2d,
+  0xaf30, 0xaf32, 0xaf34, 0xaf3c, 0xaf3d, 0xaf3f, 0xaf41, 0xaf42,
+  0xaf43, 0xaf48, 0xaf49, 0xaf50, 0xaf5c, 0xaf5d, 0xaf64, 0xaf65,
+  0xaf79, 0xaf80, 0xaf84, 0xaf88, 0xaf90, 0xaf91, 0xaf95, 0xaf9c,
+  0xafb8, 0xafb9, 0xafbc, 0xafc0, 0xafc7, 0xafc8, 0xafc9, 0xafcb,
+  0xafcd, 0xafce, 0xafd4, 0xafdc, 0xafe8, 0xafe9, 0xaff0, 0xaff1,
+  0xaff4, 0xaff8, 0xb000, 0xb001, 0xb004, 0xb00c, 0xb010, 0xb014,
+  0xb01c, 0xb01d, 0xb028, 0xb044, 0xb045, 0xb048, 0xb04a, 0xb04c,
+  0xb04e, 0xb053, 0xb054, 0xb055, 0xb057, 0xb059,
+  /* 0x33 */
+  0xb05d, 0xb07c, 0xb07d, 0xb080, 0xb084, 0xb08c, 0xb08d, 0xb08f,
+  0xb091, 0xb098, 0xb099, 0xb09a, 0xb09c, 0xb09f, 0xb0a0, 0xb0a1,
+  0xb0a2, 0xb0a8, 0xb0a9, 0xb0ab, 0xb0ac, 0xb0ad, 0xb0ae, 0xb0af,
+  0xb0b1, 0xb0b3, 0xb0b4, 0xb0b5, 0xb0b8, 0xb0bc, 0xb0c4, 0xb0c5,
+  0xb0c7, 0xb0c8, 0xb0c9, 0xb0d0, 0xb0d1, 0xb0d4, 0xb0d8, 0xb0e0,
+  0xb0e5, 0xb108, 0xb109, 0xb10b, 0xb10c, 0xb110, 0xb112, 0xb113,
+  0xb118, 0xb119, 0xb11b, 0xb11c, 0xb11d, 0xb123, 0xb124, 0xb125,
+  0xb128, 0xb12c, 0xb134, 0xb135, 0xb137, 0xb138, 0xb139, 0xb140,
+  0xb141, 0xb144, 0xb148, 0xb150, 0xb151, 0xb154, 0xb155, 0xb158,
+  0xb15c, 0xb160, 0xb178, 0xb179, 0xb17c, 0xb180, 0xb182, 0xb188,
+  0xb189, 0xb18b, 0xb18d, 0xb192, 0xb193, 0xb194, 0xb198, 0xb19c,
+  0xb1a8, 0xb1cc, 0xb1d0, 0xb1d4, 0xb1dc, 0xb1dd,
+  /* 0x34 */
+  0xb1df, 0xb1e8, 0xb1e9, 0xb1ec, 0xb1f0, 0xb1f9, 0xb1fb, 0xb1fd,
+  0xb204, 0xb205, 0xb208, 0xb20b, 0xb20c, 0xb214, 0xb215, 0xb217,
+  0xb219, 0xb220, 0xb234, 0xb23c, 0xb258, 0xb25c, 0xb260, 0xb268,
+  0xb269, 0xb274, 0xb275, 0xb27c, 0xb284, 0xb285, 0xb289, 0xb290,
+  0xb291, 0xb294, 0xb298, 0xb299, 0xb29a, 0xb2a0, 0xb2a1, 0xb2a3,
+  0xb2a5, 0xb2a6, 0xb2aa, 0xb2ac, 0xb2b0, 0xb2b4, 0xb2c8, 0xb2c9,
+  0xb2cc, 0xb2d0, 0xb2d2, 0xb2d8, 0xb2d9, 0xb2db, 0xb2dd, 0xb2e2,
+  0xb2e4, 0xb2e5, 0xb2e6, 0xb2e8, 0xb2eb, 0xb2ec, 0xb2ed, 0xb2ee,
+  0xb2ef, 0xb2f3, 0xb2f4, 0xb2f5, 0xb2f7, 0xb2f8, 0xb2f9, 0xb2fa,
+  0xb2fb, 0xb2ff, 0xb300, 0xb301, 0xb304, 0xb308, 0xb310, 0xb311,
+  0xb313, 0xb314, 0xb315, 0xb31c, 0xb354, 0xb355, 0xb356, 0xb358,
+  0xb35b, 0xb35c, 0xb35e, 0xb35f, 0xb364, 0xb365,
+  /* 0x35 */
+  0xb367, 0xb369, 0xb36b, 0xb36e, 0xb370, 0xb371, 0xb374, 0xb378,
+  0xb380, 0xb381, 0xb383, 0xb384, 0xb385, 0xb38c, 0xb390, 0xb394,
+  0xb3a0, 0xb3a1, 0xb3a8, 0xb3ac, 0xb3c4, 0xb3c5, 0xb3c8, 0xb3cb,
+  0xb3cc, 0xb3ce, 0xb3d0, 0xb3d4, 0xb3d5, 0xb3d7, 0xb3d9, 0xb3db,
+  0xb3dd, 0xb3e0, 0xb3e4, 0xb3e8, 0xb3fc, 0xb410, 0xb418, 0xb41c,
+  0xb420, 0xb428, 0xb429, 0xb42b, 0xb434, 0xb450, 0xb451, 0xb454,
+  0xb458, 0xb460, 0xb461, 0xb463, 0xb465, 0xb46c, 0xb480, 0xb488,
+  0xb49d, 0xb4a4, 0xb4a8, 0xb4ac, 0xb4b5, 0xb4b7, 0xb4b9, 0xb4c0,
+  0xb4c4, 0xb4c8, 0xb4d0, 0xb4d5, 0xb4dc, 0xb4dd, 0xb4e0, 0xb4e3,
+  0xb4e4, 0xb4e6, 0xb4ec, 0xb4ed, 0xb4ef, 0xb4f1, 0xb4f8, 0xb514,
+  0xb515, 0xb518, 0xb51b, 0xb51c, 0xb524, 0xb525, 0xb527, 0xb528,
+  0xb529, 0xb52a, 0xb530, 0xb531, 0xb534, 0xb538,
+  /* 0x36 */
+  0xb540, 0xb541, 0xb543, 0xb544, 0xb545, 0xb54b, 0xb54c, 0xb54d,
+  0xb550, 0xb554, 0xb55c, 0xb55d, 0xb55f, 0xb560, 0xb561, 0xb5a0,
+  0xb5a1, 0xb5a4, 0xb5a8, 0xb5aa, 0xb5ab, 0xb5b0, 0xb5b1, 0xb5b3,
+  0xb5b4, 0xb5b5, 0xb5bb, 0xb5bc, 0xb5bd, 0xb5c0, 0xb5c4, 0xb5cc,
+  0xb5cd, 0xb5cf, 0xb5d0, 0xb5d1, 0xb5d8, 0xb5ec, 0xb610, 0xb611,
+  0xb614, 0xb618, 0xb625, 0xb62c, 0xb634, 0xb648, 0xb664, 0xb668,
+  0xb69c, 0xb69d, 0xb6a0, 0xb6a4, 0xb6ab, 0xb6ac, 0xb6b1, 0xb6d4,
+  0xb6f0, 0xb6f4, 0xb6f8, 0xb700, 0xb701, 0xb705, 0xb728, 0xb729,
+  0xb72c, 0xb72f, 0xb730, 0xb738, 0xb739, 0xb73b, 0xb744, 0xb748,
+  0xb74c, 0xb754, 0xb755, 0xb760, 0xb764, 0xb768, 0xb770, 0xb771,
+  0xb773, 0xb775, 0xb77c, 0xb77d, 0xb780, 0xb784, 0xb78c, 0xb78d,
+  0xb78f, 0xb790, 0xb791, 0xb792, 0xb796, 0xb797,
+  /* 0x37 */
+  0xb798, 0xb799, 0xb79c, 0xb7a0, 0xb7a8, 0xb7a9, 0xb7ab, 0xb7ac,
+  0xb7ad, 0xb7b4, 0xb7b5, 0xb7b8, 0xb7c7, 0xb7c9, 0xb7ec, 0xb7ed,
+  0xb7f0, 0xb7f4, 0xb7fc, 0xb7fd, 0xb7ff, 0xb800, 0xb801, 0xb807,
+  0xb808, 0xb809, 0xb80c, 0xb810, 0xb818, 0xb819, 0xb81b, 0xb81d,
+  0xb824, 0xb825, 0xb828, 0xb82c, 0xb834, 0xb835, 0xb837, 0xb838,
+  0xb839, 0xb840, 0xb844, 0xb851, 0xb853, 0xb85c, 0xb85d, 0xb860,
+  0xb864, 0xb86c, 0xb86d, 0xb86f, 0xb871, 0xb878, 0xb87c, 0xb88d,
+  0xb8a8, 0xb8b0, 0xb8b4, 0xb8b8, 0xb8c0, 0xb8c1, 0xb8c3, 0xb8c5,
+  0xb8cc, 0xb8d0, 0xb8d4, 0xb8dd, 0xb8df, 0xb8e1, 0xb8e8, 0xb8e9,
+  0xb8ec, 0xb8f0, 0xb8f8, 0xb8f9, 0xb8fb, 0xb8fd, 0xb904, 0xb918,
+  0xb920, 0xb93c, 0xb93d, 0xb940, 0xb944, 0xb94c, 0xb94f, 0xb951,
+  0xb958, 0xb959, 0xb95c, 0xb960, 0xb968, 0xb969,
+  /* 0x38 */
+  0xb96b, 0xb96d, 0xb974, 0xb975, 0xb978, 0xb97c, 0xb984, 0xb985,
+  0xb987, 0xb989, 0xb98a, 0xb98d, 0xb98e, 0xb9ac, 0xb9ad, 0xb9b0,
+  0xb9b4, 0xb9bc, 0xb9bd, 0xb9bf, 0xb9c1, 0xb9c8, 0xb9c9, 0xb9cc,
+  0xb9ce, 0xb9cf, 0xb9d0, 0xb9d1, 0xb9d2, 0xb9d8, 0xb9d9, 0xb9db,
+  0xb9dd, 0xb9de, 0xb9e1, 0xb9e3, 0xb9e4, 0xb9e5, 0xb9e8, 0xb9ec,
+  0xb9f4, 0xb9f5, 0xb9f7, 0xb9f8, 0xb9f9, 0xb9fa, 0xba00, 0xba01,
+  0xba08, 0xba15, 0xba38, 0xba39, 0xba3c, 0xba40, 0xba42, 0xba48,
+  0xba49, 0xba4b, 0xba4d, 0xba4e, 0xba53, 0xba54, 0xba55, 0xba58,
+  0xba5c, 0xba64, 0xba65, 0xba67, 0xba68, 0xba69, 0xba70, 0xba71,
+  0xba74, 0xba78, 0xba83, 0xba84, 0xba85, 0xba87, 0xba8c, 0xbaa8,
+  0xbaa9, 0xbaab, 0xbaac, 0xbab0, 0xbab2, 0xbab8, 0xbab9, 0xbabb,
+  0xbabd, 0xbac4, 0xbac8, 0xbad8, 0xbad9, 0xbafc,
+  /* 0x39 */
+  0xbb00, 0xbb04, 0xbb0d, 0xbb0f, 0xbb11, 0xbb18, 0xbb1c, 0xbb20,
+  0xbb29, 0xbb2b, 0xbb34, 0xbb35, 0xbb36, 0xbb38, 0xbb3b, 0xbb3c,
+  0xbb3d, 0xbb3e, 0xbb44, 0xbb45, 0xbb47, 0xbb49, 0xbb4d, 0xbb4f,
+  0xbb50, 0xbb54, 0xbb58, 0xbb61, 0xbb63, 0xbb6c, 0xbb88, 0xbb8c,
+  0xbb90, 0xbba4, 0xbba8, 0xbbac, 0xbbb4, 0xbbb7, 0xbbc0, 0xbbc4,
+  0xbbc8, 0xbbd0, 0xbbd3, 0xbbf8, 0xbbf9, 0xbbfc, 0xbbff, 0xbc00,
+  0xbc02, 0xbc08, 0xbc09, 0xbc0b, 0xbc0c, 0xbc0d, 0xbc0f, 0xbc11,
+  0xbc14, 0xbc15, 0xbc16, 0xbc17, 0xbc18, 0xbc1b, 0xbc1c, 0xbc1d,
+  0xbc1e, 0xbc1f, 0xbc24, 0xbc25, 0xbc27, 0xbc29, 0xbc2d, 0xbc30,
+  0xbc31, 0xbc34, 0xbc38, 0xbc40, 0xbc41, 0xbc43, 0xbc44, 0xbc45,
+  0xbc49, 0xbc4c, 0xbc4d, 0xbc50, 0xbc5d, 0xbc84, 0xbc85, 0xbc88,
+  0xbc8b, 0xbc8c, 0xbc8e, 0xbc94, 0xbc95, 0xbc97,
+  /* 0x3a */
+  0xbc99, 0xbc9a, 0xbca0, 0xbca1, 0xbca4, 0xbca7, 0xbca8, 0xbcb0,
+  0xbcb1, 0xbcb3, 0xbcb4, 0xbcb5, 0xbcbc, 0xbcbd, 0xbcc0, 0xbcc4,
+  0xbccd, 0xbccf, 0xbcd0, 0xbcd1, 0xbcd5, 0xbcd8, 0xbcdc, 0xbcf4,
+  0xbcf5, 0xbcf6, 0xbcf8, 0xbcfc, 0xbd04, 0xbd05, 0xbd07, 0xbd09,
+  0xbd10, 0xbd14, 0xbd24, 0xbd2c, 0xbd40, 0xbd48, 0xbd49, 0xbd4c,
+  0xbd50, 0xbd58, 0xbd59, 0xbd64, 0xbd68, 0xbd80, 0xbd81, 0xbd84,
+  0xbd87, 0xbd88, 0xbd89, 0xbd8a, 0xbd90, 0xbd91, 0xbd93, 0xbd95,
+  0xbd99, 0xbd9a, 0xbd9c, 0xbda4, 0xbdb0, 0xbdb8, 0xbdd4, 0xbdd5,
+  0xbdd8, 0xbddc, 0xbde9, 0xbdf0, 0xbdf4, 0xbdf8, 0xbe00, 0xbe03,
+  0xbe05, 0xbe0c, 0xbe0d, 0xbe10, 0xbe14, 0xbe1c, 0xbe1d, 0xbe1f,
+  0xbe44, 0xbe45, 0xbe48, 0xbe4c, 0xbe4e, 0xbe54, 0xbe55, 0xbe57,
+  0xbe59, 0xbe5a, 0xbe5b, 0xbe60, 0xbe61, 0xbe64,
+  /* 0x3b */
+  0xbe68, 0xbe6a, 0xbe70, 0xbe71, 0xbe73, 0xbe74, 0xbe75, 0xbe7b,
+  0xbe7c, 0xbe7d, 0xbe80, 0xbe84, 0xbe8c, 0xbe8d, 0xbe8f, 0xbe90,
+  0xbe91, 0xbe98, 0xbe99, 0xbea8, 0xbed0, 0xbed1, 0xbed4, 0xbed7,
+  0xbed8, 0xbee0, 0xbee3, 0xbee4, 0xbee5, 0xbeec, 0xbf01, 0xbf08,
+  0xbf09, 0xbf18, 0xbf19, 0xbf1b, 0xbf1c, 0xbf1d, 0xbf40, 0xbf41,
+  0xbf44, 0xbf48, 0xbf50, 0xbf51, 0xbf55, 0xbf94, 0xbfb0, 0xbfc5,
+  0xbfcc, 0xbfcd, 0xbfd0, 0xbfd4, 0xbfdc, 0xbfdf, 0xbfe1, 0xc03c,
+  0xc051, 0xc058, 0xc05c, 0xc060, 0xc068, 0xc069, 0xc090, 0xc091,
+  0xc094, 0xc098, 0xc0a0, 0xc0a1, 0xc0a3, 0xc0a5, 0xc0ac, 0xc0ad,
+  0xc0af, 0xc0b0, 0xc0b3, 0xc0b4, 0xc0b5, 0xc0b6, 0xc0bc, 0xc0bd,
+  0xc0bf, 0xc0c0, 0xc0c1, 0xc0c5, 0xc0c8, 0xc0c9, 0xc0cc, 0xc0d0,
+  0xc0d8, 0xc0d9, 0xc0db, 0xc0dc, 0xc0dd, 0xc0e4,
+  /* 0x3c */
+  0xc0e5, 0xc0e8, 0xc0ec, 0xc0f4, 0xc0f5, 0xc0f7, 0xc0f9, 0xc100,
+  0xc104, 0xc108, 0xc110, 0xc115, 0xc11c, 0xc11d, 0xc11e, 0xc11f,
+  0xc120, 0xc123, 0xc124, 0xc126, 0xc127, 0xc12c, 0xc12d, 0xc12f,
+  0xc130, 0xc131, 0xc136, 0xc138, 0xc139, 0xc13c, 0xc140, 0xc148,
+  0xc149, 0xc14b, 0xc14c, 0xc14d, 0xc154, 0xc155, 0xc158, 0xc15c,
+  0xc164, 0xc165, 0xc167, 0xc168, 0xc169, 0xc170, 0xc174, 0xc178,
+  0xc185, 0xc18c, 0xc18d, 0xc18e, 0xc190, 0xc194, 0xc196, 0xc19c,
+  0xc19d, 0xc19f, 0xc1a1, 0xc1a5, 0xc1a8, 0xc1a9, 0xc1ac, 0xc1b0,
+  0xc1bd, 0xc1c4, 0xc1c8, 0xc1cc, 0xc1d4, 0xc1d7, 0xc1d8, 0xc1e0,
+  0xc1e4, 0xc1e8, 0xc1f0, 0xc1f1, 0xc1f3, 0xc1fc, 0xc1fd, 0xc200,
+  0xc204, 0xc20c, 0xc20d, 0xc20f, 0xc211, 0xc218, 0xc219, 0xc21c,
+  0xc21f, 0xc220, 0xc228, 0xc229, 0xc22b, 0xc22d,
+  /* 0x3d */
+  0xc22f, 0xc231, 0xc232, 0xc234, 0xc248, 0xc250, 0xc251, 0xc254,
+  0xc258, 0xc260, 0xc265, 0xc26c, 0xc26d, 0xc270, 0xc274, 0xc27c,
+  0xc27d, 0xc27f, 0xc281, 0xc288, 0xc289, 0xc290, 0xc298, 0xc29b,
+  0xc29d, 0xc2a4, 0xc2a5, 0xc2a8, 0xc2ac, 0xc2ad, 0xc2b4, 0xc2b5,
+  0xc2b7, 0xc2b9, 0xc2dc, 0xc2dd, 0xc2e0, 0xc2e3, 0xc2e4, 0xc2eb,
+  0xc2ec, 0xc2ed, 0xc2ef, 0xc2f1, 0xc2f6, 0xc2f8, 0xc2f9, 0xc2fb,
+  0xc2fc, 0xc300, 0xc308, 0xc309, 0xc30c, 0xc30d, 0xc313, 0xc314,
+  0xc315, 0xc318, 0xc31c, 0xc324, 0xc325, 0xc328, 0xc329, 0xc345,
+  0xc368, 0xc369, 0xc36c, 0xc370, 0xc372, 0xc378, 0xc379, 0xc37c,
+  0xc37d, 0xc384, 0xc388, 0xc38c, 0xc3c0, 0xc3d8, 0xc3d9, 0xc3dc,
+  0xc3df, 0xc3e0, 0xc3e2, 0xc3e8, 0xc3e9, 0xc3ed, 0xc3f4, 0xc3f5,
+  0xc3f8, 0xc408, 0xc410, 0xc424, 0xc42c, 0xc430,
+  /* 0x3e */
+  0xc434, 0xc43c, 0xc43d, 0xc448, 0xc464, 0xc465, 0xc468, 0xc46c,
+  0xc474, 0xc475, 0xc479, 0xc480, 0xc494, 0xc49c, 0xc4b8, 0xc4bc,
+  0xc4e9, 0xc4f0, 0xc4f1, 0xc4f4, 0xc4f8, 0xc4fa, 0xc4ff, 0xc500,
+  0xc501, 0xc50c, 0xc510, 0xc514, 0xc51c, 0xc528, 0xc529, 0xc52c,
+  0xc530, 0xc538, 0xc539, 0xc53b, 0xc53d, 0xc544, 0xc545, 0xc548,
+  0xc549, 0xc54a, 0xc54c, 0xc54d, 0xc54e, 0xc553, 0xc554, 0xc555,
+  0xc557, 0xc558, 0xc559, 0xc55d, 0xc55e, 0xc560, 0xc561, 0xc564,
+  0xc568, 0xc570, 0xc571, 0xc573, 0xc574, 0xc575, 0xc57c, 0xc57d,
+  0xc580, 0xc584, 0xc587, 0xc58c, 0xc58d, 0xc58f, 0xc591, 0xc595,
+  0xc597, 0xc598, 0xc59c, 0xc5a0, 0xc5a9, 0xc5b4, 0xc5b5, 0xc5b8,
+  0xc5b9, 0xc5bb, 0xc5bc, 0xc5bd, 0xc5be, 0xc5c4, 0xc5c5, 0xc5c6,
+  0xc5c7, 0xc5c8, 0xc5c9, 0xc5ca, 0xc5cc, 0xc5ce,
+  /* 0x3f */
+  0xc5d0, 0xc5d1, 0xc5d4, 0xc5d8, 0xc5e0, 0xc5e1, 0xc5e3, 0xc5e5,
+  0xc5ec, 0xc5ed, 0xc5ee, 0xc5f0, 0xc5f4, 0xc5f6, 0xc5f7, 0xc5fc,
+  0xc5fd, 0xc5fe, 0xc5ff, 0xc600, 0xc601, 0xc605, 0xc606, 0xc607,
+  0xc608, 0xc60c, 0xc610, 0xc618, 0xc619, 0xc61b, 0xc61c, 0xc624,
+  0xc625, 0xc628, 0xc62c, 0xc62d, 0xc62e, 0xc630, 0xc633, 0xc634,
+  0xc635, 0xc637, 0xc639, 0xc63b, 0xc640, 0xc641, 0xc644, 0xc648,
+  0xc650, 0xc651, 0xc653, 0xc654, 0xc655, 0xc65c, 0xc65d, 0xc660,
+  0xc66c, 0xc66f, 0xc671, 0xc678, 0xc679, 0xc67c, 0xc680, 0xc688,
+  0xc689, 0xc68b, 0xc68d, 0xc694, 0xc695, 0xc698, 0xc69c, 0xc6a4,
+  0xc6a5, 0xc6a7, 0xc6a9, 0xc6b0, 0xc6b1, 0xc6b4, 0xc6b8, 0xc6b9,
+  0xc6ba, 0xc6c0, 0xc6c1, 0xc6c3, 0xc6c5, 0xc6cc, 0xc6cd, 0xc6d0,
+  0xc6d4, 0xc6dc, 0xc6dd, 0xc6e0, 0xc6e1, 0xc6e8,
+  /* 0x40 */
+  0xc6e9, 0xc6ec, 0xc6f0, 0xc6f8, 0xc6f9, 0xc6fd, 0xc704, 0xc705,
+  0xc708, 0xc70c, 0xc714, 0xc715, 0xc717, 0xc719, 0xc720, 0xc721,
+  0xc724, 0xc728, 0xc730, 0xc731, 0xc733, 0xc735, 0xc737, 0xc73c,
+  0xc73d, 0xc740, 0xc744, 0xc74a, 0xc74c, 0xc74d, 0xc74f, 0xc751,
+  0xc752, 0xc753, 0xc754, 0xc755, 0xc756, 0xc757, 0xc758, 0xc75c,
+  0xc760, 0xc768, 0xc76b, 0xc774, 0xc775, 0xc778, 0xc77c, 0xc77d,
+  0xc77e, 0xc783, 0xc784, 0xc785, 0xc787, 0xc788, 0xc789, 0xc78a,
+  0xc78e, 0xc790, 0xc791, 0xc794, 0xc796, 0xc797, 0xc798, 0xc79a,
+  0xc7a0, 0xc7a1, 0xc7a3, 0xc7a4, 0xc7a5, 0xc7a6, 0xc7ac, 0xc7ad,
+  0xc7b0, 0xc7b4, 0xc7bc, 0xc7bd, 0xc7bf, 0xc7c0, 0xc7c1, 0xc7c8,
+  0xc7c9, 0xc7cc, 0xc7ce, 0xc7d0, 0xc7d8, 0xc7dd, 0xc7e4, 0xc7e8,
+  0xc7ec, 0xc800, 0xc801, 0xc804, 0xc808, 0xc80a,
+  /* 0x41 */
+  0xc810, 0xc811, 0xc813, 0xc815, 0xc816, 0xc81c, 0xc81d, 0xc820,
+  0xc824, 0xc82c, 0xc82d, 0xc82f, 0xc831, 0xc838, 0xc83c, 0xc840,
+  0xc848, 0xc849, 0xc84c, 0xc84d, 0xc854, 0xc870, 0xc871, 0xc874,
+  0xc878, 0xc87a, 0xc880, 0xc881, 0xc883, 0xc885, 0xc886, 0xc887,
+  0xc88b, 0xc88c, 0xc88d, 0xc894, 0xc89d, 0xc89f, 0xc8a1, 0xc8a8,
+  0xc8bc, 0xc8bd, 0xc8c4, 0xc8c8, 0xc8cc, 0xc8d4, 0xc8d5, 0xc8d7,
+  0xc8d9, 0xc8e0, 0xc8e1, 0xc8e4, 0xc8f5, 0xc8fc, 0xc8fd, 0xc900,
+  0xc904, 0xc905, 0xc906, 0xc90c, 0xc90d, 0xc90f, 0xc911, 0xc918,
+  0xc92c, 0xc934, 0xc950, 0xc951, 0xc954, 0xc958, 0xc960, 0xc961,
+  0xc963, 0xc96c, 0xc970, 0xc974, 0xc97c, 0xc988, 0xc989, 0xc98c,
+  0xc990, 0xc998, 0xc999, 0xc99b, 0xc99d, 0xc9c0, 0xc9c1, 0xc9c4,
+  0xc9c7, 0xc9c8, 0xc9ca, 0xc9d0, 0xc9d1, 0xc9d3,
+  /* 0x42 */
+  0xc9d5, 0xc9d6, 0xc9d9, 0xc9da, 0xc9dc, 0xc9dd, 0xc9e0, 0xc9e2,
+  0xc9e4, 0xc9e7, 0xc9ec, 0xc9ed, 0xc9ef, 0xc9f0, 0xc9f1, 0xc9f8,
+  0xc9f9, 0xc9fc, 0xca00, 0xca08, 0xca09, 0xca0b, 0xca0c, 0xca0d,
+  0xca14, 0xca18, 0xca29, 0xca4c, 0xca4d, 0xca50, 0xca54, 0xca5c,
+  0xca5d, 0xca5f, 0xca60, 0xca61, 0xca68, 0xca7d, 0xca84, 0xca98,
+  0xcabc, 0xcabd, 0xcac0, 0xcac4, 0xcacc, 0xcacd, 0xcacf, 0xcad1,
+  0xcad3, 0xcad8, 0xcad9, 0xcae0, 0xcaec, 0xcaf4, 0xcb08, 0xcb10,
+  0xcb14, 0xcb18, 0xcb20, 0xcb21, 0xcb41, 0xcb48, 0xcb49, 0xcb4c,
+  0xcb50, 0xcb58, 0xcb59, 0xcb5d, 0xcb64, 0xcb78, 0xcb79, 0xcb9c,
+  0xcbb8, 0xcbd4, 0xcbe4, 0xcbe7, 0xcbe9, 0xcc0c, 0xcc0d, 0xcc10,
+  0xcc14, 0xcc1c, 0xcc1d, 0xcc21, 0xcc22, 0xcc27, 0xcc28, 0xcc29,
+  0xcc2c, 0xcc2e, 0xcc30, 0xcc38, 0xcc39, 0xcc3b,
+  /* 0x43 */
+  0xcc3c, 0xcc3d, 0xcc3e, 0xcc44, 0xcc45, 0xcc48, 0xcc4c, 0xcc54,
+  0xcc55, 0xcc57, 0xcc58, 0xcc59, 0xcc60, 0xcc64, 0xcc66, 0xcc68,
+  0xcc70, 0xcc75, 0xcc98, 0xcc99, 0xcc9c, 0xcca0, 0xcca8, 0xcca9,
+  0xccab, 0xccac, 0xccad, 0xccb4, 0xccb5, 0xccb8, 0xccbc, 0xccc4,
+  0xccc5, 0xccc7, 0xccc9, 0xccd0, 0xccd4, 0xcce4, 0xccec, 0xccf0,
+  0xcd01, 0xcd08, 0xcd09, 0xcd0c, 0xcd10, 0xcd18, 0xcd19, 0xcd1b,
+  0xcd1d, 0xcd24, 0xcd28, 0xcd2c, 0xcd39, 0xcd5c, 0xcd60, 0xcd64,
+  0xcd6c, 0xcd6d, 0xcd6f, 0xcd71, 0xcd78, 0xcd88, 0xcd94, 0xcd95,
+  0xcd98, 0xcd9c, 0xcda4, 0xcda5, 0xcda7, 0xcda9, 0xcdb0, 0xcdc4,
+  0xcdcc, 0xcdd0, 0xcde8, 0xcdec, 0xcdf0, 0xcdf8, 0xcdf9, 0xcdfb,
+  0xcdfd, 0xce04, 0xce08, 0xce0c, 0xce14, 0xce19, 0xce20, 0xce21,
+  0xce24, 0xce28, 0xce30, 0xce31, 0xce33, 0xce35,
+  /* 0x44 */
+  0xce58, 0xce59, 0xce5c, 0xce5f, 0xce60, 0xce61, 0xce68, 0xce69,
+  0xce6b, 0xce6d, 0xce74, 0xce75, 0xce78, 0xce7c, 0xce84, 0xce85,
+  0xce87, 0xce89, 0xce90, 0xce91, 0xce94, 0xce98, 0xcea0, 0xcea1,
+  0xcea3, 0xcea4, 0xcea5, 0xceac, 0xcead, 0xcec1, 0xcee4, 0xcee5,
+  0xcee8, 0xceeb, 0xceec, 0xcef4, 0xcef5, 0xcef7, 0xcef8, 0xcef9,
+  0xcf00, 0xcf01, 0xcf04, 0xcf08, 0xcf10, 0xcf11, 0xcf13, 0xcf15,
+  0xcf1c, 0xcf20, 0xcf24, 0xcf2c, 0xcf2d, 0xcf2f, 0xcf30, 0xcf31,
+  0xcf38, 0xcf54, 0xcf55, 0xcf58, 0xcf5c, 0xcf64, 0xcf65, 0xcf67,
+  0xcf69, 0xcf70, 0xcf71, 0xcf74, 0xcf78, 0xcf80, 0xcf85, 0xcf8c,
+  0xcfa1, 0xcfa8, 0xcfb0, 0xcfc4, 0xcfe0, 0xcfe1, 0xcfe4, 0xcfe8,
+  0xcff0, 0xcff1, 0xcff3, 0xcff5, 0xcffc, 0xd000, 0xd004, 0xd011,
+  0xd018, 0xd02d, 0xd034, 0xd035, 0xd038, 0xd03c,
+  /* 0x45 */
+  0xd044, 0xd045, 0xd047, 0xd049, 0xd050, 0xd054, 0xd058, 0xd060,
+  0xd06c, 0xd06d, 0xd070, 0xd074, 0xd07c, 0xd07d, 0xd081, 0xd0a4,
+  0xd0a5, 0xd0a8, 0xd0ac, 0xd0b4, 0xd0b5, 0xd0b7, 0xd0b9, 0xd0c0,
+  0xd0c1, 0xd0c4, 0xd0c8, 0xd0c9, 0xd0d0, 0xd0d1, 0xd0d3, 0xd0d4,
+  0xd0d5, 0xd0dc, 0xd0dd, 0xd0e0, 0xd0e4, 0xd0ec, 0xd0ed, 0xd0ef,
+  0xd0f0, 0xd0f1, 0xd0f8, 0xd10d, 0xd130, 0xd131, 0xd134, 0xd138,
+  0xd13a, 0xd140, 0xd141, 0xd143, 0xd144, 0xd145, 0xd14c, 0xd14d,
+  0xd150, 0xd154, 0xd15c, 0xd15d, 0xd15f, 0xd161, 0xd168, 0xd16c,
+  0xd17c, 0xd184, 0xd188, 0xd1a0, 0xd1a1, 0xd1a4, 0xd1a8, 0xd1b0,
+  0xd1b1, 0xd1b3, 0xd1b5, 0xd1ba, 0xd1bc, 0xd1c0, 0xd1d8, 0xd1f4,
+  0xd1f8, 0xd207, 0xd209, 0xd210, 0xd22c, 0xd22d, 0xd230, 0xd234,
+  0xd23c, 0xd23d, 0xd23f, 0xd241, 0xd248, 0xd25c,
+  /* 0x46 */
+  0xd264, 0xd280, 0xd281, 0xd284, 0xd288, 0xd290, 0xd291, 0xd295,
+  0xd29c, 0xd2a0, 0xd2a4, 0xd2ac, 0xd2b1, 0xd2b8, 0xd2b9, 0xd2bc,
+  0xd2bf, 0xd2c0, 0xd2c2, 0xd2c8, 0xd2c9, 0xd2cb, 0xd2d4, 0xd2d8,
+  0xd2dc, 0xd2e4, 0xd2e5, 0xd2f0, 0xd2f1, 0xd2f4, 0xd2f8, 0xd300,
+  0xd301, 0xd303, 0xd305, 0xd30c, 0xd30d, 0xd30e, 0xd310, 0xd314,
+  0xd316, 0xd31c, 0xd31d, 0xd31f, 0xd320, 0xd321, 0xd325, 0xd328,
+  0xd329, 0xd32c, 0xd330, 0xd338, 0xd339, 0xd33b, 0xd33c, 0xd33d,
+  0xd344, 0xd345, 0xd37c, 0xd37d, 0xd380, 0xd384, 0xd38c, 0xd38d,
+  0xd38f, 0xd390, 0xd391, 0xd398, 0xd399, 0xd39c, 0xd3a0, 0xd3a8,
+  0xd3a9, 0xd3ab, 0xd3ad, 0xd3b4, 0xd3b8, 0xd3bc, 0xd3c4, 0xd3c5,
+  0xd3c8, 0xd3c9, 0xd3d0, 0xd3d8, 0xd3e1, 0xd3e3, 0xd3ec, 0xd3ed,
+  0xd3f0, 0xd3f4, 0xd3fc, 0xd3fd, 0xd3ff, 0xd401,
+  /* 0x47 */
+  0xd408, 0xd41d, 0xd440, 0xd444, 0xd45c, 0xd460, 0xd464, 0xd46d,
+  0xd46f, 0xd478, 0xd479, 0xd47c, 0xd47f, 0xd480, 0xd482, 0xd488,
+  0xd489, 0xd48b, 0xd48d, 0xd494, 0xd4a9, 0xd4cc, 0xd4d0, 0xd4d4,
+  0xd4dc, 0xd4df, 0xd4e8, 0xd4ec, 0xd4f0, 0xd4f8, 0xd4fb, 0xd4fd,
+  0xd504, 0xd508, 0xd50c, 0xd514, 0xd515, 0xd517, 0xd53c, 0xd53d,
+  0xd540, 0xd544, 0xd54c, 0xd54d, 0xd54f, 0xd551, 0xd558, 0xd559,
+  0xd55c, 0xd560, 0xd565, 0xd568, 0xd569, 0xd56b, 0xd56d, 0xd574,
+  0xd575, 0xd578, 0xd57c, 0xd584, 0xd585, 0xd587, 0xd588, 0xd589,
+  0xd590, 0xd5a5, 0xd5c8, 0xd5c9, 0xd5cc, 0xd5d0, 0xd5d2, 0xd5d8,
+  0xd5d9, 0xd5db, 0xd5dd, 0xd5e4, 0xd5e5, 0xd5e8, 0xd5ec, 0xd5f4,
+  0xd5f5, 0xd5f7, 0xd5f9, 0xd600, 0xd601, 0xd604, 0xd608, 0xd610,
+  0xd611, 0xd613, 0xd614, 0xd615, 0xd61c, 0xd620,
+  /* 0x48 */
+  0xd624, 0xd62d, 0xd638, 0xd639, 0xd63c, 0xd640, 0xd645, 0xd648,
+  0xd649, 0xd64b, 0xd64d, 0xd651, 0xd654, 0xd655, 0xd658, 0xd65c,
+  0xd667, 0xd669, 0xd670, 0xd671, 0xd674, 0xd683, 0xd685, 0xd68c,
+  0xd68d, 0xd690, 0xd694, 0xd69d, 0xd69f, 0xd6a1, 0xd6a8, 0xd6ac,
+  0xd6b0, 0xd6b9, 0xd6bb, 0xd6c4, 0xd6c5, 0xd6c8, 0xd6cc, 0xd6d1,
+  0xd6d4, 0xd6d7, 0xd6d9, 0xd6e0, 0xd6e4, 0xd6e8, 0xd6f0, 0xd6f5,
+  0xd6fc, 0xd6fd, 0xd700, 0xd704, 0xd711, 0xd718, 0xd719, 0xd71c,
+  0xd720, 0xd728, 0xd729, 0xd72b, 0xd72d, 0xd734, 0xd735, 0xd738,
+  0xd73c, 0xd744, 0xd747, 0xd749, 0xd750, 0xd751, 0xd754, 0xd756,
+  0xd757, 0xd758, 0xd759, 0xd760, 0xd761, 0xd763, 0xd765, 0xd769,
+  0xd76c, 0xd770, 0xd774, 0xd77c, 0xd77d, 0xd781, 0xd788, 0xd789,
+  0xd78c, 0xd790, 0xd798, 0xd799, 0xd79b, 0xd79d,
+};
+static const unsigned short ksc5601_2uni_page4a[4888] = {
+  /* 0x4a */
+  0x4f3d, 0x4f73, 0x5047, 0x50f9, 0x52a0, 0x53ef, 0x5475, 0x54e5,
+  0x5609, 0x5ac1, 0x5bb6, 0x6687, 0x67b6, 0x67b7, 0x67ef, 0x6b4c,
+  0x73c2, 0x75c2, 0x7a3c, 0x82db, 0x8304, 0x8857, 0x8888, 0x8a36,
+  0x8cc8, 0x8dcf, 0x8efb, 0x8fe6, 0x99d5, 0x523b, 0x5374, 0x5404,
+  0x606a, 0x6164, 0x6bbc, 0x73cf, 0x811a, 0x89ba, 0x89d2, 0x95a3,
+  0x4f83, 0x520a, 0x58be, 0x5978, 0x59e6, 0x5e72, 0x5e79, 0x61c7,
+  0x63c0, 0x6746, 0x67ec, 0x687f, 0x6f97, 0x764e, 0x770b, 0x78f5,
+  0x7a08, 0x7aff, 0x7c21, 0x809d, 0x826e, 0x8271, 0x8aeb, 0x9593,
+  0x4e6b, 0x559d, 0x66f7, 0x6e34, 0x78a3, 0x7aed, 0x845b, 0x8910,
+  0x874e, 0x97a8, 0x52d8, 0x574e, 0x582a, 0x5d4c, 0x611f, 0x61be,
+  0x6221, 0x6562, 0x67d1, 0x6a44, 0x6e1b, 0x7518, 0x75b3, 0x76e3,
+  0x77b0, 0x7d3a, 0x90af, 0x9451, 0x9452, 0x9f95,
+  /* 0x4b */
+  0x5323, 0x5cac, 0x7532, 0x80db, 0x9240, 0x9598, 0x525b, 0x5808,
+  0x59dc, 0x5ca1, 0x5d17, 0x5eb7, 0x5f3a, 0x5f4a, 0x6177, 0x6c5f,
+  0x757a, 0x7586, 0x7ce0, 0x7d73, 0x7db1, 0x7f8c, 0x8154, 0x8221,
+  0x8591, 0x8941, 0x8b1b, 0x92fc, 0x964d, 0x9c47, 0x4ecb, 0x4ef7,
+  0x500b, 0x51f1, 0x584f, 0x6137, 0x613e, 0x6168, 0x6539, 0x69ea,
+  0x6f11, 0x75a5, 0x7686, 0x76d6, 0x7b87, 0x82a5, 0x84cb, 0xf900,
+  0x93a7, 0x958b, 0x5580, 0x5ba2, 0x5751, 0xf901, 0x7cb3, 0x7fb9,
+  0x91b5, 0x5028, 0x53bb, 0x5c45, 0x5de8, 0x62d2, 0x636e, 0x64da,
+  0x64e7, 0x6e20, 0x70ac, 0x795b, 0x8ddd, 0x8e1e, 0xf902, 0x907d,
+  0x9245, 0x92f8, 0x4e7e, 0x4ef6, 0x5065, 0x5dfe, 0x5efa, 0x6106,
+  0x6957, 0x8171, 0x8654, 0x8e47, 0x9375, 0x9a2b, 0x4e5e, 0x5091,
+  0x6770, 0x6840, 0x5109, 0x528d, 0x5292, 0x6aa2,
+  /* 0x4c */
+  0x77bc, 0x9210, 0x9ed4, 0x52ab, 0x602f, 0x8ff2, 0x5048, 0x61a9,
+  0x63ed, 0x64ca, 0x683c, 0x6a84, 0x6fc0, 0x8188, 0x89a1, 0x9694,
+  0x5805, 0x727d, 0x72ac, 0x7504, 0x7d79, 0x7e6d, 0x80a9, 0x898b,
+  0x8b74, 0x9063, 0x9d51, 0x6289, 0x6c7a, 0x6f54, 0x7d50, 0x7f3a,
+  0x8a23, 0x517c, 0x614a, 0x7b9d, 0x8b19, 0x9257, 0x938c, 0x4eac,
+  0x4fd3, 0x501e, 0x50be, 0x5106, 0x52c1, 0x52cd, 0x537f, 0x5770,
+  0x5883, 0x5e9a, 0x5f91, 0x6176, 0x61ac, 0x64ce, 0x656c, 0x666f,
+  0x66bb, 0x66f4, 0x6897, 0x6d87, 0x7085, 0x70f1, 0x749f, 0x74a5,
+  0x74ca, 0x75d9, 0x786c, 0x78ec, 0x7adf, 0x7af6, 0x7d45, 0x7d93,
+  0x8015, 0x803f, 0x811b, 0x8396, 0x8b66, 0x8f15, 0x9015, 0x93e1,
+  0x9803, 0x9838, 0x9a5a, 0x9be8, 0x4fc2, 0x5553, 0x583a, 0x5951,
+  0x5b63, 0x5c46, 0x60b8, 0x6212, 0x6842, 0x68b0,
+  /* 0x4d */
+  0x68e8, 0x6eaa, 0x754c, 0x7678, 0x78ce, 0x7a3d, 0x7cfb, 0x7e6b,
+  0x7e7c, 0x8a08, 0x8aa1, 0x8c3f, 0x968e, 0x9dc4, 0x53e4, 0x53e9,
+  0x544a, 0x5471, 0x56fa, 0x59d1, 0x5b64, 0x5c3b, 0x5eab, 0x62f7,
+  0x6537, 0x6545, 0x6572, 0x66a0, 0x67af, 0x69c1, 0x6cbd, 0x75fc,
+  0x7690, 0x777e, 0x7a3f, 0x7f94, 0x8003, 0x80a1, 0x818f, 0x82e6,
+  0x82fd, 0x83f0, 0x85c1, 0x8831, 0x88b4, 0x8aa5, 0xf903, 0x8f9c,
+  0x932e, 0x96c7, 0x9867, 0x9ad8, 0x9f13, 0x54ed, 0x659b, 0x66f2,
+  0x688f, 0x7a40, 0x8c37, 0x9d60, 0x56f0, 0x5764, 0x5d11, 0x6606,
+  0x68b1, 0x68cd, 0x6efe, 0x7428, 0x889e, 0x9be4, 0x6c68, 0xf904,
+  0x9aa8, 0x4f9b, 0x516c, 0x5171, 0x529f, 0x5b54, 0x5de5, 0x6050,
+  0x606d, 0x62f1, 0x63a7, 0x653b, 0x73d9, 0x7a7a, 0x86a3, 0x8ca2,
+  0x978f, 0x4e32, 0x5be1, 0x6208, 0x679c, 0x74dc,
+  /* 0x4e */
+  0x79d1, 0x83d3, 0x8a87, 0x8ab2, 0x8de8, 0x904e, 0x934b, 0x9846,
+  0x5ed3, 0x69e8, 0x85ff, 0x90ed, 0xf905, 0x51a0, 0x5b98, 0x5bec,
+  0x6163, 0x68fa, 0x6b3e, 0x704c, 0x742f, 0x74d8, 0x7ba1, 0x7f50,
+  0x83c5, 0x89c0, 0x8cab, 0x95dc, 0x9928, 0x522e, 0x605d, 0x62ec,
+  0x9002, 0x4f8a, 0x5149, 0x5321, 0x58d9, 0x5ee3, 0x66e0, 0x6d38,
+  0x709a, 0x72c2, 0x73d6, 0x7b50, 0x80f1, 0x945b, 0x5366, 0x639b,
+  0x7f6b, 0x4e56, 0x5080, 0x584a, 0x58de, 0x602a, 0x6127, 0x62d0,
+  0x69d0, 0x9b41, 0x5b8f, 0x7d18, 0x80b1, 0x8f5f, 0x4ea4, 0x50d1,
+  0x54ac, 0x55ac, 0x5b0c, 0x5da0, 0x5de7, 0x652a, 0x654e, 0x6821,
+  0x6a4b, 0x72e1, 0x768e, 0x77ef, 0x7d5e, 0x7ff9, 0x81a0, 0x854e,
+  0x86df, 0x8f03, 0x8f4e, 0x90ca, 0x9903, 0x9a55, 0x9bab, 0x4e18,
+  0x4e45, 0x4e5d, 0x4ec7, 0x4ff1, 0x5177, 0x52fe,
+  /* 0x4f */
+  0x5340, 0x53e3, 0x53e5, 0x548e, 0x5614, 0x5775, 0x57a2, 0x5bc7,
+  0x5d87, 0x5ed0, 0x61fc, 0x62d8, 0x6551, 0x67b8, 0x67e9, 0x69cb,
+  0x6b50, 0x6bc6, 0x6bec, 0x6c42, 0x6e9d, 0x7078, 0x72d7, 0x7396,
+  0x7403, 0x77bf, 0x77e9, 0x7a76, 0x7d7f, 0x8009, 0x81fc, 0x8205,
+  0x820a, 0x82df, 0x8862, 0x8b33, 0x8cfc, 0x8ec0, 0x9011, 0x90b1,
+  0x9264, 0x92b6, 0x99d2, 0x9a45, 0x9ce9, 0x9dd7, 0x9f9c, 0x570b,
+  0x5c40, 0x83ca, 0x97a0, 0x97ab, 0x9eb4, 0x541b, 0x7a98, 0x7fa4,
+  0x88d9, 0x8ecd, 0x90e1, 0x5800, 0x5c48, 0x6398, 0x7a9f, 0x5bae,
+  0x5f13, 0x7a79, 0x7aae, 0x828e, 0x8eac, 0x5026, 0x5238, 0x52f8,
+  0x5377, 0x5708, 0x62f3, 0x6372, 0x6b0a, 0x6dc3, 0x7737, 0x53a5,
+  0x7357, 0x8568, 0x8e76, 0x95d5, 0x673a, 0x6ac3, 0x6f70, 0x8a6d,
+  0x8ecc, 0x994b, 0xf906, 0x6677, 0x6b78, 0x8cb4,
+  /* 0x50 */
+  0x9b3c, 0xf907, 0x53eb, 0x572d, 0x594e, 0x63c6, 0x69fb, 0x73ea,
+  0x7845, 0x7aba, 0x7ac5, 0x7cfe, 0x8475, 0x898f, 0x8d73, 0x9035,
+  0x95a8, 0x52fb, 0x5747, 0x7547, 0x7b60, 0x83cc, 0x921e, 0xf908,
+  0x6a58, 0x514b, 0x524b, 0x5287, 0x621f, 0x68d8, 0x6975, 0x9699,
+  0x50c5, 0x52a4, 0x52e4, 0x61c3, 0x65a4, 0x6839, 0x69ff, 0x747e,
+  0x7b4b, 0x82b9, 0x83eb, 0x89b2, 0x8b39, 0x8fd1, 0x9949, 0xf909,
+  0x4eca, 0x5997, 0x64d2, 0x6611, 0x6a8e, 0x7434, 0x7981, 0x79bd,
+  0x82a9, 0x887e, 0x887f, 0x895f, 0xf90a, 0x9326, 0x4f0b, 0x53ca,
+  0x6025, 0x6271, 0x6c72, 0x7d1a, 0x7d66, 0x4e98, 0x5162, 0x77dc,
+  0x80af, 0x4f01, 0x4f0e, 0x5176, 0x5180, 0x55dc, 0x5668, 0x573b,
+  0x57fa, 0x57fc, 0x5914, 0x5947, 0x5993, 0x5bc4, 0x5c90, 0x5d0e,
+  0x5df1, 0x5e7e, 0x5fcc, 0x6280, 0x65d7, 0x65e3,
+  /* 0x51 */
+  0x671e, 0x671f, 0x675e, 0x68cb, 0x68c4, 0x6a5f, 0x6b3a, 0x6c23,
+  0x6c7d, 0x6c82, 0x6dc7, 0x7398, 0x7426, 0x742a, 0x7482, 0x74a3,
+  0x7578, 0x757f, 0x7881, 0x78ef, 0x7941, 0x7947, 0x7948, 0x797a,
+  0x7b95, 0x7d00, 0x7dba, 0x7f88, 0x8006, 0x802d, 0x808c, 0x8a18,
+  0x8b4f, 0x8c48, 0x8d77, 0x9321, 0x9324, 0x98e2, 0x9951, 0x9a0e,
+  0x9a0f, 0x9a65, 0x9e92, 0x7dca, 0x4f76, 0x5409, 0x62ee, 0x6854,
+  0x91d1, 0x55ab, 0x513a, 0xf90b, 0xf90c, 0x5a1c, 0x61e6, 0xf90d,
+  0x62cf, 0x62ff, 0xf90e, 0xf90f, 0xf910, 0xf911, 0xf912, 0xf913,
+  0x90a3, 0xf914, 0xf915, 0xf916, 0xf917, 0xf918, 0x8afe, 0xf919,
+  0xf91a, 0xf91b, 0xf91c, 0x6696, 0xf91d, 0x7156, 0xf91e, 0xf91f,
+  0x96e3, 0xf920, 0x634f, 0x637a, 0x5357, 0xf921, 0x678f, 0x6960,
+  0x6e73, 0xf922, 0x7537, 0xf923, 0xf924, 0xf925,
+  /* 0x52 */
+  0x7d0d, 0xf926, 0xf927, 0x8872, 0x56ca, 0x5a18, 0xf928, 0xf929,
+  0xf92a, 0xf92b, 0xf92c, 0x4e43, 0xf92d, 0x5167, 0x5948, 0x67f0,
+  0x8010, 0xf92e, 0x5973, 0x5e74, 0x649a, 0x79ca, 0x5ff5, 0x606c,
+  0x62c8, 0x637b, 0x5be7, 0x5bd7, 0x52aa, 0xf92f, 0x5974, 0x5f29,
+  0x6012, 0xf930, 0xf931, 0xf932, 0x7459, 0xf933, 0xf934, 0xf935,
+  0xf936, 0xf937, 0xf938, 0x99d1, 0xf939, 0xf93a, 0xf93b, 0xf93c,
+  0xf93d, 0xf93e, 0xf93f, 0xf940, 0xf941, 0xf942, 0xf943, 0x6fc3,
+  0xf944, 0xf945, 0x81bf, 0x8fb2, 0x60f1, 0xf946, 0xf947, 0x8166,
+  0xf948, 0xf949, 0x5c3f, 0xf94a, 0xf94b, 0xf94c, 0xf94d, 0xf94e,
+  0xf94f, 0xf950, 0xf951, 0x5ae9, 0x8a25, 0x677b, 0x7d10, 0xf952,
+  0xf953, 0xf954, 0xf955, 0xf956, 0xf957, 0x80fd, 0xf958, 0xf959,
+  0x5c3c, 0x6ce5, 0x533f, 0x6eba, 0x591a, 0x8336,
+  /* 0x53 */
+  0x4e39, 0x4eb6, 0x4f46, 0x55ae, 0x5718, 0x58c7, 0x5f56, 0x65b7,
+  0x65e6, 0x6a80, 0x6bb5, 0x6e4d, 0x77ed, 0x7aef, 0x7c1e, 0x7dde,
+  0x86cb, 0x8892, 0x9132, 0x935b, 0x64bb, 0x6fbe, 0x737a, 0x75b8,
+  0x9054, 0x5556, 0x574d, 0x61ba, 0x64d4, 0x66c7, 0x6de1, 0x6e5b,
+  0x6f6d, 0x6fb9, 0x75f0, 0x8043, 0x81bd, 0x8541, 0x8983, 0x8ac7,
+  0x8b5a, 0x931f, 0x6c93, 0x7553, 0x7b54, 0x8e0f, 0x905d, 0x5510,
+  0x5802, 0x5858, 0x5e62, 0x6207, 0x649e, 0x68e0, 0x7576, 0x7cd6,
+  0x87b3, 0x9ee8, 0x4ee3, 0x5788, 0x576e, 0x5927, 0x5c0d, 0x5cb1,
+  0x5e36, 0x5f85, 0x6234, 0x64e1, 0x73b3, 0x81fa, 0x888b, 0x8cb8,
+  0x968a, 0x9edb, 0x5b85, 0x5fb7, 0x60b3, 0x5012, 0x5200, 0x5230,
+  0x5716, 0x5835, 0x5857, 0x5c0e, 0x5c60, 0x5cf6, 0x5d8b, 0x5ea6,
+  0x5f92, 0x60bc, 0x6311, 0x6389, 0x6417, 0x6843,
+  /* 0x54 */
+  0x68f9, 0x6ac2, 0x6dd8, 0x6e21, 0x6ed4, 0x6fe4, 0x71fe, 0x76dc,
+  0x7779, 0x79b1, 0x7a3b, 0x8404, 0x89a9, 0x8ced, 0x8df3, 0x8e48,
+  0x9003, 0x9014, 0x9053, 0x90fd, 0x934d, 0x9676, 0x97dc, 0x6bd2,
+  0x7006, 0x7258, 0x72a2, 0x7368, 0x7763, 0x79bf, 0x7be4, 0x7e9b,
+  0x8b80, 0x58a9, 0x60c7, 0x6566, 0x65fd, 0x66be, 0x6c8c, 0x711e,
+  0x71c9, 0x8c5a, 0x9813, 0x4e6d, 0x7a81, 0x4edd, 0x51ac, 0x51cd,
+  0x52d5, 0x540c, 0x61a7, 0x6771, 0x6850, 0x68df, 0x6d1e, 0x6f7c,
+  0x75bc, 0x77b3, 0x7ae5, 0x80f4, 0x8463, 0x9285, 0x515c, 0x6597,
+  0x675c, 0x6793, 0x75d8, 0x7ac7, 0x8373, 0xf95a, 0x8c46, 0x9017,
+  0x982d, 0x5c6f, 0x81c0, 0x829a, 0x9041, 0x906f, 0x920d, 0x5f97,
+  0x5d9d, 0x6a59, 0x71c8, 0x767b, 0x7b49, 0x85e4, 0x8b04, 0x9127,
+  0x9a30, 0x5587, 0x61f6, 0xf95b, 0x7669, 0x7f85,
+  /* 0x55 */
+  0x863f, 0x87ba, 0x88f8, 0x908f, 0xf95c, 0x6d1b, 0x70d9, 0x73de,
+  0x7d61, 0x843d, 0xf95d, 0x916a, 0x99f1, 0xf95e, 0x4e82, 0x5375,
+  0x6b04, 0x6b12, 0x703e, 0x721b, 0x862d, 0x9e1e, 0x524c, 0x8fa3,
+  0x5d50, 0x64e5, 0x652c, 0x6b16, 0x6feb, 0x7c43, 0x7e9c, 0x85cd,
+  0x8964, 0x89bd, 0x62c9, 0x81d8, 0x881f, 0x5eca, 0x6717, 0x6d6a,
+  0x72fc, 0x7405, 0x746f, 0x8782, 0x90de, 0x4f86, 0x5d0d, 0x5fa0,
+  0x840a, 0x51b7, 0x63a0, 0x7565, 0x4eae, 0x5006, 0x5169, 0x51c9,
+  0x6881, 0x6a11, 0x7cae, 0x7cb1, 0x7ce7, 0x826f, 0x8ad2, 0x8f1b,
+  0x91cf, 0x4fb6, 0x5137, 0x52f5, 0x5442, 0x5eec, 0x616e, 0x623e,
+  0x65c5, 0x6ada, 0x6ffe, 0x792a, 0x85dc, 0x8823, 0x95ad, 0x9a62,
+  0x9a6a, 0x9e97, 0x9ece, 0x529b, 0x66c6, 0x6b77, 0x701d, 0x792b,
+  0x8f62, 0x9742, 0x6190, 0x6200, 0x6523, 0x6f23,
+  /* 0x56 */
+  0x7149, 0x7489, 0x7df4, 0x806f, 0x84ee, 0x8f26, 0x9023, 0x934a,
+  0x51bd, 0x5217, 0x52a3, 0x6d0c, 0x70c8, 0x88c2, 0x5ec9, 0x6582,
+  0x6bae, 0x6fc2, 0x7c3e, 0x7375, 0x4ee4, 0x4f36, 0x56f9, 0xf95f,
+  0x5cba, 0x5dba, 0x601c, 0x73b2, 0x7b2d, 0x7f9a, 0x7fce, 0x8046,
+  0x901e, 0x9234, 0x96f6, 0x9748, 0x9818, 0x9f61, 0x4f8b, 0x6fa7,
+  0x79ae, 0x91b4, 0x96b7, 0x52de, 0xf960, 0x6488, 0x64c4, 0x6ad3,
+  0x6f5e, 0x7018, 0x7210, 0x76e7, 0x8001, 0x8606, 0x865c, 0x8def,
+  0x8f05, 0x9732, 0x9b6f, 0x9dfa, 0x9e75, 0x788c, 0x797f, 0x7da0,
+  0x83c9, 0x9304, 0x9e7f, 0x9e93, 0x8ad6, 0x58df, 0x5f04, 0x6727,
+  0x7027, 0x74cf, 0x7c60, 0x807e, 0x5121, 0x7028, 0x7262, 0x78ca,
+  0x8cc2, 0x8cda, 0x8cf4, 0x96f7, 0x4e86, 0x50da, 0x5bee, 0x5ed6,
+  0x6599, 0x71ce, 0x7642, 0x77ad, 0x804a, 0x84fc,
+  /* 0x57 */
+  0x907c, 0x9b27, 0x9f8d, 0x58d8, 0x5a41, 0x5c62, 0x6a13, 0x6dda,
+  0x6f0f, 0x763b, 0x7d2f, 0x7e37, 0x851e, 0x8938, 0x93e4, 0x964b,
+  0x5289, 0x65d2, 0x67f3, 0x69b4, 0x6d41, 0x6e9c, 0x700f, 0x7409,
+  0x7460, 0x7559, 0x7624, 0x786b, 0x8b2c, 0x985e, 0x516d, 0x622e,
+  0x9678, 0x4f96, 0x502b, 0x5d19, 0x6dea, 0x7db8, 0x8f2a, 0x5f8b,
+  0x6144, 0x6817, 0xf961, 0x9686, 0x52d2, 0x808b, 0x51dc, 0x51cc,
+  0x695e, 0x7a1c, 0x7dbe, 0x83f1, 0x9675, 0x4fda, 0x5229, 0x5398,
+  0x540f, 0x550e, 0x5c65, 0x60a7, 0x674e, 0x68a8, 0x6d6c, 0x7281,
+  0x72f8, 0x7406, 0x7483, 0xf962, 0x75e2, 0x7c6c, 0x7f79, 0x7fb8,
+  0x8389, 0x88cf, 0x88e1, 0x91cc, 0x91d0, 0x96e2, 0x9bc9, 0x541d,
+  0x6f7e, 0x71d0, 0x7498, 0x85fa, 0x8eaa, 0x96a3, 0x9c57, 0x9e9f,
+  0x6797, 0x6dcb, 0x7433, 0x81e8, 0x9716, 0x782c,
+  /* 0x58 */
+  0x7acb, 0x7b20, 0x7c92, 0x6469, 0x746a, 0x75f2, 0x78bc, 0x78e8,
+  0x99ac, 0x9b54, 0x9ebb, 0x5bde, 0x5e55, 0x6f20, 0x819c, 0x83ab,
+  0x9088, 0x4e07, 0x534d, 0x5a29, 0x5dd2, 0x5f4e, 0x6162, 0x633d,
+  0x6669, 0x66fc, 0x6eff, 0x6f2b, 0x7063, 0x779e, 0x842c, 0x8513,
+  0x883b, 0x8f13, 0x9945, 0x9c3b, 0x551c, 0x62b9, 0x672b, 0x6cab,
+  0x8309, 0x896a, 0x977a, 0x4ea1, 0x5984, 0x5fd8, 0x5fd9, 0x671b,
+  0x7db2, 0x7f54, 0x8292, 0x832b, 0x83bd, 0x8f1e, 0x9099, 0x57cb,
+  0x59b9, 0x5a92, 0x5bd0, 0x6627, 0x679a, 0x6885, 0x6bcf, 0x7164,
+  0x7f75, 0x8cb7, 0x8ce3, 0x9081, 0x9b45, 0x8108, 0x8c8a, 0x964c,
+  0x9a40, 0x9ea5, 0x5b5f, 0x6c13, 0x731b, 0x76f2, 0x76df, 0x840c,
+  0x51aa, 0x8993, 0x514d, 0x5195, 0x52c9, 0x68c9, 0x6c94, 0x7704,
+  0x7720, 0x7dbf, 0x7dec, 0x9762, 0x9eb5, 0x6ec5,
+  /* 0x59 */
+  0x8511, 0x51a5, 0x540d, 0x547d, 0x660e, 0x669d, 0x6927, 0x6e9f,
+  0x76bf, 0x7791, 0x8317, 0x84c2, 0x879f, 0x9169, 0x9298, 0x9cf4,
+  0x8882, 0x4fae, 0x5192, 0x52df, 0x59c6, 0x5e3d, 0x6155, 0x6478,
+  0x6479, 0x66ae, 0x67d0, 0x6a21, 0x6bcd, 0x6bdb, 0x725f, 0x7261,
+  0x7441, 0x7738, 0x77db, 0x8017, 0x82bc, 0x8305, 0x8b00, 0x8b28,
+  0x8c8c, 0x6728, 0x6c90, 0x7267, 0x76ee, 0x7766, 0x7a46, 0x9da9,
+  0x6b7f, 0x6c92, 0x5922, 0x6726, 0x8499, 0x536f, 0x5893, 0x5999,
+  0x5edf, 0x63cf, 0x6634, 0x6773, 0x6e3a, 0x732b, 0x7ad7, 0x82d7,
+  0x9328, 0x52d9, 0x5deb, 0x61ae, 0x61cb, 0x620a, 0x62c7, 0x64ab,
+  0x65e0, 0x6959, 0x6b66, 0x6bcb, 0x7121, 0x73f7, 0x755d, 0x7e46,
+  0x821e, 0x8302, 0x856a, 0x8aa3, 0x8cbf, 0x9727, 0x9d61, 0x58a8,
+  0x9ed8, 0x5011, 0x520e, 0x543b, 0x554f, 0x6587,
+  /* 0x5a */
+  0x6c76, 0x7d0a, 0x7d0b, 0x805e, 0x868a, 0x9580, 0x96ef, 0x52ff,
+  0x6c95, 0x7269, 0x5473, 0x5a9a, 0x5c3e, 0x5d4b, 0x5f4c, 0x5fae,
+  0x672a, 0x68b6, 0x6963, 0x6e3c, 0x6e44, 0x7709, 0x7c73, 0x7f8e,
+  0x8587, 0x8b0e, 0x8ff7, 0x9761, 0x9ef4, 0x5cb7, 0x60b6, 0x610d,
+  0x61ab, 0x654f, 0x65fb, 0x65fc, 0x6c11, 0x6cef, 0x739f, 0x73c9,
+  0x7de1, 0x9594, 0x5bc6, 0x871c, 0x8b10, 0x525d, 0x535a, 0x62cd,
+  0x640f, 0x64b2, 0x6734, 0x6a38, 0x6cca, 0x73c0, 0x749e, 0x7b94,
+  0x7c95, 0x7e1b, 0x818a, 0x8236, 0x8584, 0x8feb, 0x96f9, 0x99c1,
+  0x4f34, 0x534a, 0x53cd, 0x53db, 0x62cc, 0x642c, 0x6500, 0x6591,
+  0x69c3, 0x6cee, 0x6f58, 0x73ed, 0x7554, 0x7622, 0x76e4, 0x76fc,
+  0x78d0, 0x78fb, 0x792c, 0x7d46, 0x822c, 0x87e0, 0x8fd4, 0x9812,
+  0x98ef, 0x52c3, 0x62d4, 0x64a5, 0x6e24, 0x6f51,
+  /* 0x5b */
+  0x767c, 0x8dcb, 0x91b1, 0x9262, 0x9aee, 0x9b43, 0x5023, 0x508d,
+  0x574a, 0x59a8, 0x5c28, 0x5e47, 0x5f77, 0x623f, 0x653e, 0x65b9,
+  0x65c1, 0x6609, 0x678b, 0x699c, 0x6ec2, 0x78c5, 0x7d21, 0x80aa,
+  0x8180, 0x822b, 0x82b3, 0x84a1, 0x868c, 0x8a2a, 0x8b17, 0x90a6,
+  0x9632, 0x9f90, 0x500d, 0x4ff3, 0xf963, 0x57f9, 0x5f98, 0x62dc,
+  0x6392, 0x676f, 0x6e43, 0x7119, 0x76c3, 0x80cc, 0x80da, 0x88f4,
+  0x88f5, 0x8919, 0x8ce0, 0x8f29, 0x914d, 0x966a, 0x4f2f, 0x4f70,
+  0x5e1b, 0x67cf, 0x6822, 0x767d, 0x767e, 0x9b44, 0x5e61, 0x6a0a,
+  0x7169, 0x71d4, 0x756a, 0xf964, 0x7e41, 0x8543, 0x85e9, 0x98dc,
+  0x4f10, 0x7b4f, 0x7f70, 0x95a5, 0x51e1, 0x5e06, 0x68b5, 0x6c3e,
+  0x6c4e, 0x6cdb, 0x72af, 0x7bc4, 0x8303, 0x6cd5, 0x743a, 0x50fb,
+  0x5288, 0x58c1, 0x64d8, 0x6a97, 0x74a7, 0x7656,
+  /* 0x5c */
+  0x78a7, 0x8617, 0x95e2, 0x9739, 0xf965, 0x535e, 0x5f01, 0x8b8a,
+  0x8fa8, 0x8faf, 0x908a, 0x5225, 0x77a5, 0x9c49, 0x9f08, 0x4e19,
+  0x5002, 0x5175, 0x5c5b, 0x5e77, 0x661e, 0x663a, 0x67c4, 0x68c5,
+  0x70b3, 0x7501, 0x75c5, 0x79c9, 0x7add, 0x8f27, 0x9920, 0x9a08,
+  0x4fdd, 0x5821, 0x5831, 0x5bf6, 0x666e, 0x6b65, 0x6d11, 0x6e7a,
+  0x6f7d, 0x73e4, 0x752b, 0x83e9, 0x88dc, 0x8913, 0x8b5c, 0x8f14,
+  0x4f0f, 0x50d5, 0x5310, 0x535c, 0x5b93, 0x5fa9, 0x670d, 0x798f,
+  0x8179, 0x832f, 0x8514, 0x8907, 0x8986, 0x8f39, 0x8f3b, 0x99a5,
+  0x9c12, 0x672c, 0x4e76, 0x4ff8, 0x5949, 0x5c01, 0x5cef, 0x5cf0,
+  0x6367, 0x68d2, 0x70fd, 0x71a2, 0x742b, 0x7e2b, 0x84ec, 0x8702,
+  0x9022, 0x92d2, 0x9cf3, 0x4e0d, 0x4ed8, 0x4fef, 0x5085, 0x5256,
+  0x526f, 0x5426, 0x5490, 0x57e0, 0x592b, 0x5a66,
+  /* 0x5d */
+  0x5b5a, 0x5b75, 0x5bcc, 0x5e9c, 0xf966, 0x6276, 0x6577, 0x65a7,
+  0x6d6e, 0x6ea5, 0x7236, 0x7b26, 0x7c3f, 0x7f36, 0x8150, 0x8151,
+  0x819a, 0x8240, 0x8299, 0x83a9, 0x8a03, 0x8ca0, 0x8ce6, 0x8cfb,
+  0x8d74, 0x8dba, 0x90e8, 0x91dc, 0x961c, 0x9644, 0x99d9, 0x9ce7,
+  0x5317, 0x5206, 0x5429, 0x5674, 0x58b3, 0x5954, 0x596e, 0x5fff,
+  0x61a4, 0x626e, 0x6610, 0x6c7e, 0x711a, 0x76c6, 0x7c89, 0x7cde,
+  0x7d1b, 0x82ac, 0x8cc1, 0x96f0, 0xf967, 0x4f5b, 0x5f17, 0x5f7f,
+  0x62c2, 0x5d29, 0x670b, 0x68da, 0x787c, 0x7e43, 0x9d6c, 0x4e15,
+  0x5099, 0x5315, 0x532a, 0x5351, 0x5983, 0x5a62, 0x5e87, 0x60b2,
+  0x618a, 0x6249, 0x6279, 0x6590, 0x6787, 0x69a7, 0x6bd4, 0x6bd6,
+  0x6bd7, 0x6bd8, 0x6cb8, 0xf968, 0x7435, 0x75fa, 0x7812, 0x7891,
+  0x79d5, 0x79d8, 0x7c83, 0x7dcb, 0x7fe1, 0x80a5,
+  /* 0x5e */
+  0x813e, 0x81c2, 0x83f2, 0x871a, 0x88e8, 0x8ab9, 0x8b6c, 0x8cbb,
+  0x9119, 0x975e, 0x98db, 0x9f3b, 0x56ac, 0x5b2a, 0x5f6c, 0x658c,
+  0x6ab3, 0x6baf, 0x6d5c, 0x6ff1, 0x7015, 0x725d, 0x73ad, 0x8ca7,
+  0x8cd3, 0x983b, 0x6191, 0x6c37, 0x8058, 0x9a01, 0x4e4d, 0x4e8b,
+  0x4e9b, 0x4ed5, 0x4f3a, 0x4f3c, 0x4f7f, 0x4fdf, 0x50ff, 0x53f2,
+  0x53f8, 0x5506, 0x55e3, 0x56db, 0x58eb, 0x5962, 0x5a11, 0x5beb,
+  0x5bfa, 0x5c04, 0x5df3, 0x5e2b, 0x5f99, 0x601d, 0x6368, 0x659c,
+  0x65af, 0x67f6, 0x67fb, 0x68ad, 0x6b7b, 0x6c99, 0x6cd7, 0x6e23,
+  0x7009, 0x7345, 0x7802, 0x793e, 0x7940, 0x7960, 0x79c1, 0x7be9,
+  0x7d17, 0x7d72, 0x8086, 0x820d, 0x838e, 0x84d1, 0x86c7, 0x88df,
+  0x8a50, 0x8a5e, 0x8b1d, 0x8cdc, 0x8d66, 0x8fad, 0x90aa, 0x98fc,
+  0x99df, 0x9e9d, 0x524a, 0xf969, 0x6714, 0xf96a,
+  /* 0x5f */
+  0x5098, 0x522a, 0x5c71, 0x6563, 0x6c55, 0x73ca, 0x7523, 0x759d,
+  0x7b97, 0x849c, 0x9178, 0x9730, 0x4e77, 0x6492, 0x6bba, 0x715e,
+  0x85a9, 0x4e09, 0xf96b, 0x6749, 0x68ee, 0x6e17, 0x829f, 0x8518,
+  0x886b, 0x63f7, 0x6f81, 0x9212, 0x98af, 0x4e0a, 0x50b7, 0x50cf,
+  0x511f, 0x5546, 0x55aa, 0x5617, 0x5b40, 0x5c19, 0x5ce0, 0x5e38,
+  0x5e8a, 0x5ea0, 0x5ec2, 0x60f3, 0x6851, 0x6a61, 0x6e58, 0x723d,
+  0x7240, 0x72c0, 0x76f8, 0x7965, 0x7bb1, 0x7fd4, 0x88f3, 0x89f4,
+  0x8a73, 0x8c61, 0x8cde, 0x971c, 0x585e, 0x74bd, 0x8cfd, 0x55c7,
+  0xf96c, 0x7a61, 0x7d22, 0x8272, 0x7272, 0x751f, 0x7525, 0xf96d,
+  0x7b19, 0x5885, 0x58fb, 0x5dbc, 0x5e8f, 0x5eb6, 0x5f90, 0x6055,
+  0x6292, 0x637f, 0x654d, 0x6691, 0x66d9, 0x66f8, 0x6816, 0x68f2,
+  0x7280, 0x745e, 0x7b6e, 0x7d6e, 0x7dd6, 0x7f72,
+  /* 0x60 */
+  0x80e5, 0x8212, 0x85af, 0x897f, 0x8a93, 0x901d, 0x92e4, 0x9ecd,
+  0x9f20, 0x5915, 0x596d, 0x5e2d, 0x60dc, 0x6614, 0x6673, 0x6790,
+  0x6c50, 0x6dc5, 0x6f5f, 0x77f3, 0x78a9, 0x84c6, 0x91cb, 0x932b,
+  0x4ed9, 0x50ca, 0x5148, 0x5584, 0x5b0b, 0x5ba3, 0x6247, 0x657e,
+  0x65cb, 0x6e32, 0x717d, 0x7401, 0x7444, 0x7487, 0x74bf, 0x766c,
+  0x79aa, 0x7dda, 0x7e55, 0x7fa8, 0x817a, 0x81b3, 0x8239, 0x861a,
+  0x87ec, 0x8a75, 0x8de3, 0x9078, 0x9291, 0x9425, 0x994d, 0x9bae,
+  0x5368, 0x5c51, 0x6954, 0x6cc4, 0x6d29, 0x6e2b, 0x820c, 0x859b,
+  0x893b, 0x8a2d, 0x8aaa, 0x96ea, 0x9f67, 0x5261, 0x66b9, 0x6bb2,
+  0x7e96, 0x87fe, 0x8d0d, 0x9583, 0x965d, 0x651d, 0x6d89, 0x71ee,
+  0xf96e, 0x57ce, 0x59d3, 0x5bac, 0x6027, 0x60fa, 0x6210, 0x661f,
+  0x665f, 0x7329, 0x73f9, 0x76db, 0x7701, 0x7b6c,
+  /* 0x61 */
+  0x8056, 0x8072, 0x8165, 0x8aa0, 0x9192, 0x4e16, 0x52e2, 0x6b72,
+  0x6d17, 0x7a05, 0x7b39, 0x7d30, 0xf96f, 0x8cb0, 0x53ec, 0x562f,
+  0x5851, 0x5bb5, 0x5c0f, 0x5c11, 0x5de2, 0x6240, 0x6383, 0x6414,
+  0x662d, 0x68b3, 0x6cbc, 0x6d88, 0x6eaf, 0x701f, 0x70a4, 0x71d2,
+  0x7526, 0x758f, 0x758e, 0x7619, 0x7b11, 0x7be0, 0x7c2b, 0x7d20,
+  0x7d39, 0x852c, 0x856d, 0x8607, 0x8a34, 0x900d, 0x9061, 0x90b5,
+  0x92b7, 0x97f6, 0x9a37, 0x4fd7, 0x5c6c, 0x675f, 0x6d91, 0x7c9f,
+  0x7e8c, 0x8b16, 0x8d16, 0x901f, 0x5b6b, 0x5dfd, 0x640d, 0x84c0,
+  0x905c, 0x98e1, 0x7387, 0x5b8b, 0x609a, 0x677e, 0x6dde, 0x8a1f,
+  0x8aa6, 0x9001, 0x980c, 0x5237, 0xf970, 0x7051, 0x788e, 0x9396,
+  0x8870, 0x91d7, 0x4fee, 0x53d7, 0x55fd, 0x56da, 0x5782, 0x58fd,
+  0x5ac2, 0x5b88, 0x5cab, 0x5cc0, 0x5e25, 0x6101,
+  /* 0x62 */
+  0x620d, 0x624b, 0x6388, 0x641c, 0x6536, 0x6578, 0x6a39, 0x6b8a,
+  0x6c34, 0x6d19, 0x6f31, 0x71e7, 0x72e9, 0x7378, 0x7407, 0x74b2,
+  0x7626, 0x7761, 0x79c0, 0x7a57, 0x7aea, 0x7cb9, 0x7d8f, 0x7dac,
+  0x7e61, 0x7f9e, 0x8129, 0x8331, 0x8490, 0x84da, 0x85ea, 0x8896,
+  0x8ab0, 0x8b90, 0x8f38, 0x9042, 0x9083, 0x916c, 0x9296, 0x92b9,
+  0x968b, 0x96a7, 0x96a8, 0x96d6, 0x9700, 0x9808, 0x9996, 0x9ad3,
+  0x9b1a, 0x53d4, 0x587e, 0x5919, 0x5b70, 0x5bbf, 0x6dd1, 0x6f5a,
+  0x719f, 0x7421, 0x74b9, 0x8085, 0x83fd, 0x5de1, 0x5f87, 0x5faa,
+  0x6042, 0x65ec, 0x6812, 0x696f, 0x6a53, 0x6b89, 0x6d35, 0x6df3,
+  0x73e3, 0x76fe, 0x77ac, 0x7b4d, 0x7d14, 0x8123, 0x821c, 0x8340,
+  0x84f4, 0x8563, 0x8a62, 0x8ac4, 0x9187, 0x931e, 0x9806, 0x99b4,
+  0x620c, 0x8853, 0x8ff0, 0x9265, 0x5d07, 0x5d27,
+  /* 0x63 */
+  0x5d69, 0x745f, 0x819d, 0x8768, 0x6fd5, 0x62fe, 0x7fd2, 0x8936,
+  0x8972, 0x4e1e, 0x4e58, 0x50e7, 0x52dd, 0x5347, 0x627f, 0x6607,
+  0x7e69, 0x8805, 0x965e, 0x4f8d, 0x5319, 0x5636, 0x59cb, 0x5aa4,
+  0x5c38, 0x5c4e, 0x5c4d, 0x5e02, 0x5f11, 0x6043, 0x65bd, 0x662f,
+  0x6642, 0x67be, 0x67f4, 0x731c, 0x77e2, 0x793a, 0x7fc5, 0x8494,
+  0x84cd, 0x8996, 0x8a66, 0x8a69, 0x8ae1, 0x8c55, 0x8c7a, 0x57f4,
+  0x5bd4, 0x5f0f, 0x606f, 0x62ed, 0x690d, 0x6b96, 0x6e5c, 0x7184,
+  0x7bd2, 0x8755, 0x8b58, 0x8efe, 0x98df, 0x98fe, 0x4f38, 0x4f81,
+  0x4fe1, 0x547b, 0x5a20, 0x5bb8, 0x613c, 0x65b0, 0x6668, 0x71fc,
+  0x7533, 0x795e, 0x7d33, 0x814e, 0x81e3, 0x8398, 0x85aa, 0x85ce,
+  0x8703, 0x8a0a, 0x8eab, 0x8f9b, 0xf971, 0x8fc5, 0x5931, 0x5ba4,
+  0x5be6, 0x6089, 0x5be9, 0x5c0b, 0x5fc3, 0x6c81,
+  /* 0x64 */
+  0xf972, 0x6df1, 0x700b, 0x751a, 0x82af, 0x8af6, 0x4ec0, 0x5341,
+  0xf973, 0x96d9, 0x6c0f, 0x4e9e, 0x4fc4, 0x5152, 0x555e, 0x5a25,
+  0x5ce8, 0x6211, 0x7259, 0x82bd, 0x83aa, 0x86fe, 0x8859, 0x8a1d,
+  0x963f, 0x96c5, 0x9913, 0x9d09, 0x9d5d, 0x580a, 0x5cb3, 0x5dbd,
+  0x5e44, 0x60e1, 0x6115, 0x63e1, 0x6a02, 0x6e25, 0x9102, 0x9354,
+  0x984e, 0x9c10, 0x9f77, 0x5b89, 0x5cb8, 0x6309, 0x664f, 0x6848,
+  0x773c, 0x96c1, 0x978d, 0x9854, 0x9b9f, 0x65a1, 0x8b01, 0x8ecb,
+  0x95bc, 0x5535, 0x5ca9, 0x5dd6, 0x5eb5, 0x6697, 0x764c, 0x83f4,
+  0x95c7, 0x58d3, 0x62bc, 0x72ce, 0x9d28, 0x4ef0, 0x592e, 0x600f,
+  0x663b, 0x6b83, 0x79e7, 0x9d26, 0x5393, 0x54c0, 0x57c3, 0x5d16,
+  0x611b, 0x66d6, 0x6daf, 0x788d, 0x827e, 0x9698, 0x9744, 0x5384,
+  0x627c, 0x6396, 0x6db2, 0x7e0a, 0x814b, 0x984d,
+  /* 0x65 */
+  0x6afb, 0x7f4c, 0x9daf, 0x9e1a, 0x4e5f, 0x503b, 0x51b6, 0x591c,
+  0x60f9, 0x63f6, 0x6930, 0x723a, 0x8036, 0xf974, 0x91ce, 0x5f31,
+  0xf975, 0xf976, 0x7d04, 0x82e5, 0x846f, 0x84bb, 0x85e5, 0x8e8d,
+  0xf977, 0x4f6f, 0xf978, 0xf979, 0x58e4, 0x5b43, 0x6059, 0x63da,
+  0x6518, 0x656d, 0x6698, 0xf97a, 0x694a, 0x6a23, 0x6d0b, 0x7001,
+  0x716c, 0x75d2, 0x760d, 0x79b3, 0x7a70, 0xf97b, 0x7f8a, 0xf97c,
+  0x8944, 0xf97d, 0x8b93, 0x91c0, 0x967d, 0xf97e, 0x990a, 0x5704,
+  0x5fa1, 0x65bc, 0x6f01, 0x7600, 0x79a6, 0x8a9e, 0x99ad, 0x9b5a,
+  0x9f6c, 0x5104, 0x61b6, 0x6291, 0x6a8d, 0x81c6, 0x5043, 0x5830,
+  0x5f66, 0x7109, 0x8a00, 0x8afa, 0x5b7c, 0x8616, 0x4ffa, 0x513c,
+  0x56b4, 0x5944, 0x63a9, 0x6df9, 0x5daa, 0x696d, 0x5186, 0x4e88,
+  0x4f59, 0xf97f, 0xf980, 0xf981, 0x5982, 0xf982,
+  /* 0x66 */
+  0xf983, 0x6b5f, 0x6c5d, 0xf984, 0x74b5, 0x7916, 0xf985, 0x8207,
+  0x8245, 0x8339, 0x8f3f, 0x8f5d, 0xf986, 0x9918, 0xf987, 0xf988,
+  0xf989, 0x4ea6, 0xf98a, 0x57df, 0x5f79, 0x6613, 0xf98b, 0xf98c,
+  0x75ab, 0x7e79, 0x8b6f, 0xf98d, 0x9006, 0x9a5b, 0x56a5, 0x5827,
+  0x59f8, 0x5a1f, 0x5bb4, 0xf98e, 0x5ef6, 0xf98f, 0xf990, 0x6350,
+  0x633b, 0xf991, 0x693d, 0x6c87, 0x6cbf, 0x6d8e, 0x6d93, 0x6df5,
+  0x6f14, 0xf992, 0x70df, 0x7136, 0x7159, 0xf993, 0x71c3, 0x71d5,
+  0xf994, 0x784f, 0x786f, 0xf995, 0x7b75, 0x7de3, 0xf996, 0x7e2f,
+  0xf997, 0x884d, 0x8edf, 0xf998, 0xf999, 0xf99a, 0x925b, 0xf99b,
+  0x9cf6, 0xf99c, 0xf99d, 0xf99e, 0x6085, 0x6d85, 0xf99f, 0x71b1,
+  0xf9a0, 0xf9a1, 0x95b1, 0x53ad, 0xf9a2, 0xf9a3, 0xf9a4, 0x67d3,
+  0xf9a5, 0x708e, 0x7130, 0x7430, 0x8276, 0x82d2,
+  /* 0x67 */
+  0xf9a6, 0x95bb, 0x9ae5, 0x9e7d, 0x66c4, 0xf9a7, 0x71c1, 0x8449,
+  0xf9a8, 0xf9a9, 0x584b, 0xf9aa, 0xf9ab, 0x5db8, 0x5f71, 0xf9ac,
+  0x6620, 0x668e, 0x6979, 0x69ae, 0x6c38, 0x6cf3, 0x6e36, 0x6f41,
+  0x6fda, 0x701b, 0x702f, 0x7150, 0x71df, 0x7370, 0xf9ad, 0x745b,
+  0xf9ae, 0x74d4, 0x76c8, 0x7a4e, 0x7e93, 0xf9af, 0xf9b0, 0x82f1,
+  0x8a60, 0x8fce, 0xf9b1, 0x9348, 0xf9b2, 0x9719, 0xf9b3, 0xf9b4,
+  0x4e42, 0x502a, 0xf9b5, 0x5208, 0x53e1, 0x66f3, 0x6c6d, 0x6fca,
+  0x730a, 0x777f, 0x7a62, 0x82ae, 0x85dd, 0x8602, 0xf9b6, 0x88d4,
+  0x8a63, 0x8b7d, 0x8c6b, 0xf9b7, 0x92b3, 0xf9b8, 0x9713, 0x9810,
+  0x4e94, 0x4f0d, 0x4fc9, 0x50b2, 0x5348, 0x543e, 0x5433, 0x55da,
+  0x5862, 0x58ba, 0x5967, 0x5a1b, 0x5be4, 0x609f, 0xf9b9, 0x61ca,
+  0x6556, 0x65ff, 0x6664, 0x68a7, 0x6c5a, 0x6fb3,
+  /* 0x68 */
+  0x70cf, 0x71ac, 0x7352, 0x7b7d, 0x8708, 0x8aa4, 0x9c32, 0x9f07,
+  0x5c4b, 0x6c83, 0x7344, 0x7389, 0x923a, 0x6eab, 0x7465, 0x761f,
+  0x7a69, 0x7e15, 0x860a, 0x5140, 0x58c5, 0x64c1, 0x74ee, 0x7515,
+  0x7670, 0x7fc1, 0x9095, 0x96cd, 0x9954, 0x6e26, 0x74e6, 0x7aa9,
+  0x7aaa, 0x81e5, 0x86d9, 0x8778, 0x8a1b, 0x5a49, 0x5b8c, 0x5b9b,
+  0x68a1, 0x6900, 0x6d63, 0x73a9, 0x7413, 0x742c, 0x7897, 0x7de9,
+  0x7feb, 0x8118, 0x8155, 0x839e, 0x8c4c, 0x962e, 0x9811, 0x66f0,
+  0x5f80, 0x65fa, 0x6789, 0x6c6a, 0x738b, 0x502d, 0x5a03, 0x6b6a,
+  0x77ee, 0x5916, 0x5d6c, 0x5dcd, 0x7325, 0x754f, 0xf9ba, 0xf9bb,
+  0x50e5, 0x51f9, 0x582f, 0x592d, 0x5996, 0x59da, 0x5be5, 0xf9bc,
+  0xf9bd, 0x5da2, 0x62d7, 0x6416, 0x6493, 0x64fe, 0xf9be, 0x66dc,
+  0xf9bf, 0x6a48, 0xf9c0, 0x71ff, 0x7464, 0xf9c1,
+  /* 0x69 */
+  0x7a88, 0x7aaf, 0x7e47, 0x7e5e, 0x8000, 0x8170, 0xf9c2, 0x87ef,
+  0x8981, 0x8b20, 0x9059, 0xf9c3, 0x9080, 0x9952, 0x617e, 0x6b32,
+  0x6d74, 0x7e1f, 0x8925, 0x8fb1, 0x4fd1, 0x50ad, 0x5197, 0x52c7,
+  0x57c7, 0x5889, 0x5bb9, 0x5eb8, 0x6142, 0x6995, 0x6d8c, 0x6e67,
+  0x6eb6, 0x7194, 0x7462, 0x7528, 0x752c, 0x8073, 0x8338, 0x84c9,
+  0x8e0a, 0x9394, 0x93de, 0xf9c4, 0x4e8e, 0x4f51, 0x5076, 0x512a,
+  0x53c8, 0x53cb, 0x53f3, 0x5b87, 0x5bd3, 0x5c24, 0x611a, 0x6182,
+  0x65f4, 0x725b, 0x7397, 0x7440, 0x76c2, 0x7950, 0x7991, 0x79b9,
+  0x7d06, 0x7fbd, 0x828b, 0x85d5, 0x865e, 0x8fc2, 0x9047, 0x90f5,
+  0x91ea, 0x9685, 0x96e8, 0x96e9, 0x52d6, 0x5f67, 0x65ed, 0x6631,
+  0x682f, 0x715c, 0x7a36, 0x90c1, 0x980a, 0x4e91, 0xf9c5, 0x6a52,
+  0x6b9e, 0x6f90, 0x7189, 0x8018, 0x82b8, 0x8553,
+  /* 0x6a */
+  0x904b, 0x9695, 0x96f2, 0x97fb, 0x851a, 0x9b31, 0x4e90, 0x718a,
+  0x96c4, 0x5143, 0x539f, 0x54e1, 0x5713, 0x5712, 0x57a3, 0x5a9b,
+  0x5ac4, 0x5bc3, 0x6028, 0x613f, 0x63f4, 0x6c85, 0x6d39, 0x6e72,
+  0x6e90, 0x7230, 0x733f, 0x7457, 0x82d1, 0x8881, 0x8f45, 0x9060,
+  0xf9c6, 0x9662, 0x9858, 0x9d1b, 0x6708, 0x8d8a, 0x925e, 0x4f4d,
+  0x5049, 0x50de, 0x5371, 0x570d, 0x59d4, 0x5a01, 0x5c09, 0x6170,
+  0x6690, 0x6e2d, 0x7232, 0x744b, 0x7def, 0x80c3, 0x840e, 0x8466,
+  0x853f, 0x875f, 0x885b, 0x8918, 0x8b02, 0x9055, 0x97cb, 0x9b4f,
+  0x4e73, 0x4f91, 0x5112, 0x516a, 0xf9c7, 0x552f, 0x55a9, 0x5b7a,
+  0x5ba5, 0x5e7c, 0x5e7d, 0x5ebe, 0x60a0, 0x60df, 0x6108, 0x6109,
+  0x63c4, 0x6538, 0x6709, 0xf9c8, 0x67d4, 0x67da, 0xf9c9, 0x6961,
+  0x6962, 0x6cb9, 0x6d27, 0xf9ca, 0x6e38, 0xf9cb,
+  /* 0x6b */
+  0x6fe1, 0x7336, 0x7337, 0xf9cc, 0x745c, 0x7531, 0xf9cd, 0x7652,
+  0xf9ce, 0xf9cf, 0x7dad, 0x81fe, 0x8438, 0x88d5, 0x8a98, 0x8adb,
+  0x8aed, 0x8e30, 0x8e42, 0x904a, 0x903e, 0x907a, 0x9149, 0x91c9,
+  0x936e, 0xf9d0, 0xf9d1, 0x5809, 0xf9d2, 0x6bd3, 0x8089, 0x80b2,
+  0xf9d3, 0xf9d4, 0x5141, 0x596b, 0x5c39, 0xf9d5, 0xf9d6, 0x6f64,
+  0x73a7, 0x80e4, 0x8d07, 0xf9d7, 0x9217, 0x958f, 0xf9d8, 0xf9d9,
+  0xf9da, 0xf9db, 0x807f, 0x620e, 0x701c, 0x7d68, 0x878d, 0xf9dc,
+  0x57a0, 0x6069, 0x6147, 0x6bb7, 0x8abe, 0x9280, 0x96b1, 0x4e59,
+  0x541f, 0x6deb, 0x852d, 0x9670, 0x97f3, 0x98ee, 0x63d6, 0x6ce3,
+  0x9091, 0x51dd, 0x61c9, 0x81ba, 0x9df9, 0x4f9d, 0x501a, 0x5100,
+  0x5b9c, 0x610f, 0x61ff, 0x64ec, 0x6905, 0x6bc5, 0x7591, 0x77e3,
+  0x7fa9, 0x8264, 0x858f, 0x87fb, 0x8863, 0x8abc,
+  /* 0x6c */
+  0x8b70, 0x91ab, 0x4e8c, 0x4ee5, 0x4f0a, 0xf9dd, 0xf9de, 0x5937,
+  0x59e8, 0xf9df, 0x5df2, 0x5f1b, 0x5f5b, 0x6021, 0xf9e0, 0xf9e1,
+  0xf9e2, 0xf9e3, 0x723e, 0x73e5, 0xf9e4, 0x7570, 0x75cd, 0xf9e5,
+  0x79fb, 0xf9e6, 0x800c, 0x8033, 0x8084, 0x82e1, 0x8351, 0xf9e7,
+  0xf9e8, 0x8cbd, 0x8cb3, 0x9087, 0xf9e9, 0xf9ea, 0x98f4, 0x990c,
+  0xf9eb, 0xf9ec, 0x7037, 0x76ca, 0x7fca, 0x7fcc, 0x7ffc, 0x8b1a,
+  0x4eba, 0x4ec1, 0x5203, 0x5370, 0xf9ed, 0x54bd, 0x56e0, 0x59fb,
+  0x5bc5, 0x5f15, 0x5fcd, 0x6e6e, 0xf9ee, 0xf9ef, 0x7d6a, 0x8335,
+  0xf9f0, 0x8693, 0x8a8d, 0xf9f1, 0x976d, 0x9777, 0xf9f2, 0xf9f3,
+  0x4e00, 0x4f5a, 0x4f7e, 0x58f9, 0x65e5, 0x6ea2, 0x9038, 0x93b0,
+  0x99b9, 0x4efb, 0x58ec, 0x598a, 0x59d9, 0x6041, 0xf9f4, 0xf9f5,
+  0x7a14, 0xf9f6, 0x834f, 0x8cc3, 0x5165, 0x5344,
+  /* 0x6d */
+  0xf9f7, 0xf9f8, 0xf9f9, 0x4ecd, 0x5269, 0x5b55, 0x82bf, 0x4ed4,
+  0x523a, 0x54a8, 0x59c9, 0x59ff, 0x5b50, 0x5b57, 0x5b5c, 0x6063,
+  0x6148, 0x6ecb, 0x7099, 0x716e, 0x7386, 0x74f7, 0x75b5, 0x78c1,
+  0x7d2b, 0x8005, 0x81ea, 0x8328, 0x8517, 0x85c9, 0x8aee, 0x8cc7,
+  0x96cc, 0x4f5c, 0x52fa, 0x56bc, 0x65ab, 0x6628, 0x707c, 0x70b8,
+  0x7235, 0x7dbd, 0x828d, 0x914c, 0x96c0, 0x9d72, 0x5b71, 0x68e7,
+  0x6b98, 0x6f7a, 0x76de, 0x5c91, 0x66ab, 0x6f5b, 0x7bb4, 0x7c2a,
+  0x8836, 0x96dc, 0x4e08, 0x4ed7, 0x5320, 0x5834, 0x58bb, 0x58ef,
+  0x596c, 0x5c07, 0x5e33, 0x5e84, 0x5f35, 0x638c, 0x66b2, 0x6756,
+  0x6a1f, 0x6aa3, 0x6b0c, 0x6f3f, 0x7246, 0xf9fa, 0x7350, 0x748b,
+  0x7ae0, 0x7ca7, 0x8178, 0x81df, 0x81e7, 0x838a, 0x846c, 0x8523,
+  0x8594, 0x85cf, 0x88dd, 0x8d13, 0x91ac, 0x9577,
+  /* 0x6e */
+  0x969c, 0x518d, 0x54c9, 0x5728, 0x5bb0, 0x624d, 0x6750, 0x683d,
+  0x6893, 0x6e3d, 0x6ed3, 0x707d, 0x7e21, 0x88c1, 0x8ca1, 0x8f09,
+  0x9f4b, 0x9f4e, 0x722d, 0x7b8f, 0x8acd, 0x931a, 0x4f47, 0x4f4e,
+  0x5132, 0x5480, 0x59d0, 0x5e95, 0x62b5, 0x6775, 0x696e, 0x6a17,
+  0x6cae, 0x6e1a, 0x72d9, 0x732a, 0x75bd, 0x7bb8, 0x7d35, 0x82e7,
+  0x83f9, 0x8457, 0x85f7, 0x8a5b, 0x8caf, 0x8e87, 0x9019, 0x90b8,
+  0x96ce, 0x9f5f, 0x52e3, 0x540a, 0x5ae1, 0x5bc2, 0x6458, 0x6575,
+  0x6ef4, 0x72c4, 0xf9fb, 0x7684, 0x7a4d, 0x7b1b, 0x7c4d, 0x7e3e,
+  0x7fdf, 0x837b, 0x8b2b, 0x8cca, 0x8d64, 0x8de1, 0x8e5f, 0x8fea,
+  0x8ff9, 0x9069, 0x93d1, 0x4f43, 0x4f7a, 0x50b3, 0x5168, 0x5178,
+  0x524d, 0x526a, 0x5861, 0x587c, 0x5960, 0x5c08, 0x5c55, 0x5edb,
+  0x609b, 0x6230, 0x6813, 0x6bbf, 0x6c08, 0x6fb1,
+  /* 0x6f */
+  0x714e, 0x7420, 0x7530, 0x7538, 0x7551, 0x7672, 0x7b4c, 0x7b8b,
+  0x7bad, 0x7bc6, 0x7e8f, 0x8a6e, 0x8f3e, 0x8f49, 0x923f, 0x9293,
+  0x9322, 0x942b, 0x96fb, 0x985a, 0x986b, 0x991e, 0x5207, 0x622a,
+  0x6298, 0x6d59, 0x7664, 0x7aca, 0x7bc0, 0x7d76, 0x5360, 0x5cbe,
+  0x5e97, 0x6f38, 0x70b9, 0x7c98, 0x9711, 0x9b8e, 0x9ede, 0x63a5,
+  0x647a, 0x8776, 0x4e01, 0x4e95, 0x4ead, 0x505c, 0x5075, 0x5448,
+  0x59c3, 0x5b9a, 0x5e40, 0x5ead, 0x5ef7, 0x5f81, 0x60c5, 0x633a,
+  0x653f, 0x6574, 0x65cc, 0x6676, 0x6678, 0x67fe, 0x6968, 0x6a89,
+  0x6b63, 0x6c40, 0x6dc0, 0x6de8, 0x6e1f, 0x6e5e, 0x701e, 0x70a1,
+  0x738e, 0x73fd, 0x753a, 0x775b, 0x7887, 0x798e, 0x7a0b, 0x7a7d,
+  0x7cbe, 0x7d8e, 0x8247, 0x8a02, 0x8aea, 0x8c9e, 0x912d, 0x914a,
+  0x91d8, 0x9266, 0x92cc, 0x9320, 0x9706, 0x9756,
+  /* 0x70 */
+  0x975c, 0x9802, 0x9f0e, 0x5236, 0x5291, 0x557c, 0x5824, 0x5e1d,
+  0x5f1f, 0x608c, 0x63d0, 0x68af, 0x6fdf, 0x796d, 0x7b2c, 0x81cd,
+  0x85ba, 0x88fd, 0x8af8, 0x8e44, 0x918d, 0x9664, 0x969b, 0x973d,
+  0x984c, 0x9f4a, 0x4fce, 0x5146, 0x51cb, 0x52a9, 0x5632, 0x5f14,
+  0x5f6b, 0x63aa, 0x64cd, 0x65e9, 0x6641, 0x66fa, 0x66f9, 0x671d,
+  0x689d, 0x68d7, 0x69fd, 0x6f15, 0x6f6e, 0x7167, 0x71e5, 0x722a,
+  0x74aa, 0x773a, 0x7956, 0x795a, 0x79df, 0x7a20, 0x7a95, 0x7c97,
+  0x7cdf, 0x7d44, 0x7e70, 0x8087, 0x85fb, 0x86a4, 0x8a54, 0x8abf,
+  0x8d99, 0x8e81, 0x9020, 0x906d, 0x91e3, 0x963b, 0x96d5, 0x9ce5,
+  0x65cf, 0x7c07, 0x8db3, 0x93c3, 0x5b58, 0x5c0a, 0x5352, 0x62d9,
+  0x731d, 0x5027, 0x5b97, 0x5f9e, 0x60b0, 0x616b, 0x68d5, 0x6dd9,
+  0x742e, 0x7a2e, 0x7d42, 0x7d9c, 0x7e31, 0x816b,
+  /* 0x71 */
+  0x8e2a, 0x8e35, 0x937e, 0x9418, 0x4f50, 0x5750, 0x5de6, 0x5ea7,
+  0x632b, 0x7f6a, 0x4e3b, 0x4f4f, 0x4f8f, 0x505a, 0x59dd, 0x80c4,
+  0x546a, 0x5468, 0x55fe, 0x594f, 0x5b99, 0x5dde, 0x5eda, 0x665d,
+  0x6731, 0x67f1, 0x682a, 0x6ce8, 0x6d32, 0x6e4a, 0x6f8d, 0x70b7,
+  0x73e0, 0x7587, 0x7c4c, 0x7d02, 0x7d2c, 0x7da2, 0x821f, 0x86db,
+  0x8a3b, 0x8a85, 0x8d70, 0x8e8a, 0x8f33, 0x9031, 0x914e, 0x9152,
+  0x9444, 0x99d0, 0x7af9, 0x7ca5, 0x4fca, 0x5101, 0x51c6, 0x57c8,
+  0x5bef, 0x5cfb, 0x6659, 0x6a3d, 0x6d5a, 0x6e96, 0x6fec, 0x710c,
+  0x756f, 0x7ae3, 0x8822, 0x9021, 0x9075, 0x96cb, 0x99ff, 0x8301,
+  0x4e2d, 0x4ef2, 0x8846, 0x91cd, 0x537d, 0x6adb, 0x696b, 0x6c41,
+  0x847a, 0x589e, 0x618e, 0x66fe, 0x62ef, 0x70dd, 0x7511, 0x75c7,
+  0x7e52, 0x84b8, 0x8b49, 0x8d08, 0x4e4b, 0x53ea,
+  /* 0x72 */
+  0x54ab, 0x5730, 0x5740, 0x5fd7, 0x6301, 0x6307, 0x646f, 0x652f,
+  0x65e8, 0x667a, 0x679d, 0x67b3, 0x6b62, 0x6c60, 0x6c9a, 0x6f2c,
+  0x77e5, 0x7825, 0x7949, 0x7957, 0x7d19, 0x80a2, 0x8102, 0x81f3,
+  0x829d, 0x82b7, 0x8718, 0x8a8c, 0xf9fc, 0x8d04, 0x8dbe, 0x9072,
+  0x76f4, 0x7a19, 0x7a37, 0x7e54, 0x8077, 0x5507, 0x55d4, 0x5875,
+  0x632f, 0x6422, 0x6649, 0x664b, 0x686d, 0x699b, 0x6b84, 0x6d25,
+  0x6eb1, 0x73cd, 0x7468, 0x74a1, 0x755b, 0x75b9, 0x76e1, 0x771e,
+  0x778b, 0x79e6, 0x7e09, 0x7e1d, 0x81fb, 0x852f, 0x8897, 0x8a3a,
+  0x8cd1, 0x8eeb, 0x8fb0, 0x9032, 0x93ad, 0x9663, 0x9673, 0x9707,
+  0x4f84, 0x53f1, 0x59ea, 0x5ac9, 0x5e19, 0x684e, 0x74c6, 0x75be,
+  0x79e9, 0x7a92, 0x81a3, 0x86ed, 0x8cea, 0x8dcc, 0x8fed, 0x659f,
+  0x6715, 0xf9fd, 0x57f7, 0x6f57, 0x7ddd, 0x8f2f,
+  /* 0x73 */
+  0x93f6, 0x96c6, 0x5fb5, 0x61f2, 0x6f84, 0x4e14, 0x4f98, 0x501f,
+  0x53c9, 0x55df, 0x5d6f, 0x5dee, 0x6b21, 0x6b64, 0x78cb, 0x7b9a,
+  0xf9fe, 0x8e49, 0x8eca, 0x906e, 0x6349, 0x643e, 0x7740, 0x7a84,
+  0x932f, 0x947f, 0x9f6a, 0x64b0, 0x6faf, 0x71e6, 0x74a8, 0x74da,
+  0x7ac4, 0x7c12, 0x7e82, 0x7cb2, 0x7e98, 0x8b9a, 0x8d0a, 0x947d,
+  0x9910, 0x994c, 0x5239, 0x5bdf, 0x64e6, 0x672d, 0x7d2e, 0x50ed,
+  0x53c3, 0x5879, 0x6158, 0x6159, 0x61fa, 0x65ac, 0x7ad9, 0x8b92,
+  0x8b96, 0x5009, 0x5021, 0x5275, 0x5531, 0x5a3c, 0x5ee0, 0x5f70,
+  0x6134, 0x655e, 0x660c, 0x6636, 0x66a2, 0x69cd, 0x6ec4, 0x6f32,
+  0x7316, 0x7621, 0x7a93, 0x8139, 0x8259, 0x83d6, 0x84bc, 0x50b5,
+  0x57f0, 0x5bc0, 0x5be8, 0x5f69, 0x63a1, 0x7826, 0x7db5, 0x83dc,
+  0x8521, 0x91c7, 0x91f5, 0x518a, 0x67f5, 0x7b56,
+  /* 0x74 */
+  0x8cac, 0x51c4, 0x59bb, 0x60bd, 0x8655, 0x501c, 0xf9ff, 0x5254,
+  0x5c3a, 0x617d, 0x621a, 0x62d3, 0x64f2, 0x65a5, 0x6ecc, 0x7620,
+  0x810a, 0x8e60, 0x965f, 0x96bb, 0x4edf, 0x5343, 0x5598, 0x5929,
+  0x5ddd, 0x64c5, 0x6cc9, 0x6dfa, 0x7394, 0x7a7f, 0x821b, 0x85a6,
+  0x8ce4, 0x8e10, 0x9077, 0x91e7, 0x95e1, 0x9621, 0x97c6, 0x51f8,
+  0x54f2, 0x5586, 0x5fb9, 0x64a4, 0x6f88, 0x7db4, 0x8f1f, 0x8f4d,
+  0x9435, 0x50c9, 0x5c16, 0x6cbe, 0x6dfb, 0x751b, 0x77bb, 0x7c3d,
+  0x7c64, 0x8a79, 0x8ac2, 0x581e, 0x59be, 0x5e16, 0x6377, 0x7252,
+  0x758a, 0x776b, 0x8adc, 0x8cbc, 0x8f12, 0x5ef3, 0x6674, 0x6df8,
+  0x807d, 0x83c1, 0x8acb, 0x9751, 0x9bd6, 0xfa00, 0x5243, 0x66ff,
+  0x6d95, 0x6eef, 0x7de0, 0x8ae6, 0x902e, 0x905e, 0x9ad4, 0x521d,
+  0x527f, 0x54e8, 0x6194, 0x6284, 0x62db, 0x68a2,
+  /* 0x75 */
+  0x6912, 0x695a, 0x6a35, 0x7092, 0x7126, 0x785d, 0x7901, 0x790e,
+  0x79d2, 0x7a0d, 0x8096, 0x8278, 0x82d5, 0x8349, 0x8549, 0x8c82,
+  0x8d85, 0x9162, 0x918b, 0x91ae, 0x4fc3, 0x56d1, 0x71ed, 0x77d7,
+  0x8700, 0x89f8, 0x5bf8, 0x5fd6, 0x6751, 0x90a8, 0x53e2, 0x585a,
+  0x5bf5, 0x60a4, 0x6181, 0x6460, 0x7e3d, 0x8070, 0x8525, 0x9283,
+  0x64ae, 0x50ac, 0x5d14, 0x6700, 0x589c, 0x62bd, 0x63a8, 0x690e,
+  0x6978, 0x6a1e, 0x6e6b, 0x76ba, 0x79cb, 0x82bb, 0x8429, 0x8acf,
+  0x8da8, 0x8ffd, 0x9112, 0x914b, 0x919c, 0x9310, 0x9318, 0x939a,
+  0x96db, 0x9a36, 0x9c0d, 0x4e11, 0x755c, 0x795d, 0x7afa, 0x7b51,
+  0x7bc9, 0x7e2e, 0x84c4, 0x8e59, 0x8e74, 0x8ef8, 0x9010, 0x6625,
+  0x693f, 0x7443, 0x51fa, 0x672e, 0x9edc, 0x5145, 0x5fe0, 0x6c96,
+  0x87f2, 0x885d, 0x8877, 0x60b4, 0x81b5, 0x8403,
+  /* 0x76 */
+  0x8d05, 0x53d6, 0x5439, 0x5634, 0x5a36, 0x5c31, 0x708a, 0x7fe0,
+  0x805a, 0x8106, 0x81ed, 0x8da3, 0x9189, 0x9a5f, 0x9df2, 0x5074,
+  0x4ec4, 0x53a0, 0x60fb, 0x6e2c, 0x5c64, 0x4f88, 0x5024, 0x55e4,
+  0x5cd9, 0x5e5f, 0x6065, 0x6894, 0x6cbb, 0x6dc4, 0x71be, 0x75d4,
+  0x75f4, 0x7661, 0x7a1a, 0x7a49, 0x7dc7, 0x7dfb, 0x7f6e, 0x81f4,
+  0x86a9, 0x8f1c, 0x96c9, 0x99b3, 0x9f52, 0x5247, 0x52c5, 0x98ed,
+  0x89aa, 0x4e03, 0x67d2, 0x6f06, 0x4fb5, 0x5be2, 0x6795, 0x6c88,
+  0x6d78, 0x741b, 0x7827, 0x91dd, 0x937c, 0x87c4, 0x79e4, 0x7a31,
+  0x5feb, 0x4ed6, 0x54a4, 0x553e, 0x58ae, 0x59a5, 0x60f0, 0x6253,
+  0x62d6, 0x6736, 0x6955, 0x8235, 0x9640, 0x99b1, 0x99dd, 0x502c,
+  0x5353, 0x5544, 0x577c, 0xfa01, 0x6258, 0xfa02, 0x64e2, 0x666b,
+  0x67dd, 0x6fc1, 0x6fef, 0x7422, 0x7438, 0x8a17,
+  /* 0x77 */
+  0x9438, 0x5451, 0x5606, 0x5766, 0x5f48, 0x619a, 0x6b4e, 0x7058,
+  0x70ad, 0x7dbb, 0x8a95, 0x596a, 0x812b, 0x63a2, 0x7708, 0x803d,
+  0x8caa, 0x5854, 0x642d, 0x69bb, 0x5b95, 0x5e11, 0x6e6f, 0xfa03,
+  0x8569, 0x514c, 0x53f0, 0x592a, 0x6020, 0x614b, 0x6b86, 0x6c70,
+  0x6cf0, 0x7b1e, 0x80ce, 0x82d4, 0x8dc6, 0x90b0, 0x98b1, 0xfa04,
+  0x64c7, 0x6fa4, 0x6491, 0x6504, 0x514e, 0x5410, 0x571f, 0x8a0e,
+  0x615f, 0x6876, 0xfa05, 0x75db, 0x7b52, 0x7d71, 0x901a, 0x5806,
+  0x69cc, 0x817f, 0x892a, 0x9000, 0x9839, 0x5078, 0x5957, 0x59ac,
+  0x6295, 0x900f, 0x9b2a, 0x615d, 0x7279, 0x95d6, 0x5761, 0x5a46,
+  0x5df4, 0x628a, 0x64ad, 0x64fa, 0x6777, 0x6ce2, 0x6d3e, 0x722c,
+  0x7436, 0x7834, 0x7f77, 0x82ad, 0x8ddb, 0x9817, 0x5224, 0x5742,
+  0x677f, 0x7248, 0x74e3, 0x8ca9, 0x8fa6, 0x9211,
+  /* 0x78 */
+  0x962a, 0x516b, 0x53ed, 0x634c, 0x4f69, 0x5504, 0x6096, 0x6557,
+  0x6c9b, 0x6d7f, 0x724c, 0x72fd, 0x7a17, 0x8987, 0x8c9d, 0x5f6d,
+  0x6f8e, 0x70f9, 0x81a8, 0x610e, 0x4fbf, 0x504f, 0x6241, 0x7247,
+  0x7bc7, 0x7de8, 0x7fe9, 0x904d, 0x97ad, 0x9a19, 0x8cb6, 0x576a,
+  0x5e73, 0x67b0, 0x840d, 0x8a55, 0x5420, 0x5b16, 0x5e63, 0x5ee2,
+  0x5f0a, 0x6583, 0x80ba, 0x853d, 0x9589, 0x965b, 0x4f48, 0x5305,
+  0x530d, 0x530f, 0x5486, 0x54fa, 0x5703, 0x5e03, 0x6016, 0x629b,
+  0x62b1, 0x6355, 0xfa06, 0x6ce1, 0x6d66, 0x75b1, 0x7832, 0x80de,
+  0x812f, 0x82de, 0x8461, 0x84b2, 0x888d, 0x8912, 0x900b, 0x92ea,
+  0x98fd, 0x9b91, 0x5e45, 0x66b4, 0x66dd, 0x7011, 0x7206, 0xfa07,
+  0x4ff5, 0x527d, 0x5f6a, 0x6153, 0x6753, 0x6a19, 0x6f02, 0x74e2,
+  0x7968, 0x8868, 0x8c79, 0x98c7, 0x98c4, 0x9a43,
+  /* 0x79 */
+  0x54c1, 0x7a1f, 0x6953, 0x8af7, 0x8c4a, 0x98a8, 0x99ae, 0x5f7c,
+  0x62ab, 0x75b2, 0x76ae, 0x88ab, 0x907f, 0x9642, 0x5339, 0x5f3c,
+  0x5fc5, 0x6ccc, 0x73cc, 0x7562, 0x758b, 0x7b46, 0x82fe, 0x999d,
+  0x4e4f, 0x903c, 0x4e0b, 0x4f55, 0x53a6, 0x590f, 0x5ec8, 0x6630,
+  0x6cb3, 0x7455, 0x8377, 0x8766, 0x8cc0, 0x9050, 0x971e, 0x9c15,
+  0x58d1, 0x5b78, 0x8650, 0x8b14, 0x9db4, 0x5bd2, 0x6068, 0x608d,
+  0x65f1, 0x6c57, 0x6f22, 0x6fa3, 0x701a, 0x7f55, 0x7ff0, 0x9591,
+  0x9592, 0x9650, 0x97d3, 0x5272, 0x8f44, 0x51fd, 0x542b, 0x54b8,
+  0x5563, 0x558a, 0x6abb, 0x6db5, 0x7dd8, 0x8266, 0x929c, 0x9677,
+  0x9e79, 0x5408, 0x54c8, 0x76d2, 0x86e4, 0x95a4, 0x95d4, 0x965c,
+  0x4ea2, 0x4f09, 0x59ee, 0x5ae6, 0x5df7, 0x6052, 0x6297, 0x676d,
+  0x6841, 0x6c86, 0x6e2f, 0x7f38, 0x809b, 0x822a,
+  /* 0x7a */
+  0xfa08, 0xfa09, 0x9805, 0x4ea5, 0x5055, 0x54b3, 0x5793, 0x595a,
+  0x5b69, 0x5bb3, 0x61c8, 0x6977, 0x6d77, 0x7023, 0x87f9, 0x89e3,
+  0x8a72, 0x8ae7, 0x9082, 0x99ed, 0x9ab8, 0x52be, 0x6838, 0x5016,
+  0x5e78, 0x674f, 0x8347, 0x884c, 0x4eab, 0x5411, 0x56ae, 0x73e6,
+  0x9115, 0x97ff, 0x9909, 0x9957, 0x9999, 0x5653, 0x589f, 0x865b,
+  0x8a31, 0x61b2, 0x6af6, 0x737b, 0x8ed2, 0x6b47, 0x96aa, 0x9a57,
+  0x5955, 0x7200, 0x8d6b, 0x9769, 0x4fd4, 0x5cf4, 0x5f26, 0x61f8,
+  0x665b, 0x6ceb, 0x70ab, 0x7384, 0x73b9, 0x73fe, 0x7729, 0x774d,
+  0x7d43, 0x7d62, 0x7e23, 0x8237, 0x8852, 0xfa0a, 0x8ce2, 0x9249,
+  0x986f, 0x5b51, 0x7a74, 0x8840, 0x9801, 0x5acc, 0x4fe0, 0x5354,
+  0x593e, 0x5cfd, 0x633e, 0x6d79, 0x72f9, 0x8105, 0x8107, 0x83a2,
+  0x92cf, 0x9830, 0x4ea8, 0x5144, 0x5211, 0x578b,
+  /* 0x7b */
+  0x5f62, 0x6cc2, 0x6ece, 0x7005, 0x7050, 0x70af, 0x7192, 0x73e9,
+  0x7469, 0x834a, 0x87a2, 0x8861, 0x9008, 0x90a2, 0x93a3, 0x99a8,
+  0x516e, 0x5f57, 0x60e0, 0x6167, 0x66b3, 0x8559, 0x8e4a, 0x91af,
+  0x978b, 0x4e4e, 0x4e92, 0x547c, 0x58d5, 0x58fa, 0x597d, 0x5cb5,
+  0x5f27, 0x6236, 0x6248, 0x660a, 0x6667, 0x6beb, 0x6d69, 0x6dcf,
+  0x6e56, 0x6ef8, 0x6f94, 0x6fe0, 0x6fe9, 0x705d, 0x72d0, 0x7425,
+  0x745a, 0x74e0, 0x7693, 0x795c, 0x7cca, 0x7e1e, 0x80e1, 0x82a6,
+  0x846b, 0x84bf, 0x864e, 0x865f, 0x8774, 0x8b77, 0x8c6a, 0x93ac,
+  0x9800, 0x9865, 0x60d1, 0x6216, 0x9177, 0x5a5a, 0x660f, 0x6df7,
+  0x6e3e, 0x743f, 0x9b42, 0x5ffd, 0x60da, 0x7b0f, 0x54c4, 0x5f18,
+  0x6c5e, 0x6cd3, 0x6d2a, 0x70d8, 0x7d05, 0x8679, 0x8a0c, 0x9d3b,
+  0x5316, 0x548c, 0x5b05, 0x6a3a, 0x706b, 0x7575,
+  /* 0x7c */
+  0x798d, 0x79be, 0x82b1, 0x83ef, 0x8a71, 0x8b41, 0x8ca8, 0x9774,
+  0xfa0b, 0x64f4, 0x652b, 0x78ba, 0x78bb, 0x7a6b, 0x4e38, 0x559a,
+  0x5950, 0x5ba6, 0x5e7b, 0x60a3, 0x63db, 0x6b61, 0x6665, 0x6853,
+  0x6e19, 0x7165, 0x74b0, 0x7d08, 0x9084, 0x9a69, 0x9c25, 0x6d3b,
+  0x6ed1, 0x733e, 0x8c41, 0x95ca, 0x51f0, 0x5e4c, 0x5fa8, 0x604d,
+  0x60f6, 0x6130, 0x614c, 0x6643, 0x6644, 0x69a5, 0x6cc1, 0x6e5f,
+  0x6ec9, 0x6f62, 0x714c, 0x749c, 0x7687, 0x7bc1, 0x7c27, 0x8352,
+  0x8757, 0x9051, 0x968d, 0x9ec3, 0x532f, 0x56de, 0x5efb, 0x5f8a,
+  0x6062, 0x6094, 0x61f7, 0x6666, 0x6703, 0x6a9c, 0x6dee, 0x6fae,
+  0x7070, 0x736a, 0x7e6a, 0x81be, 0x8334, 0x86d4, 0x8aa8, 0x8cc4,
+  0x5283, 0x7372, 0x5b96, 0x6a6b, 0x9404, 0x54ee, 0x5686, 0x5b5d,
+  0x6548, 0x6585, 0x66c9, 0x689f, 0x6d8d, 0x6dc6,
+  /* 0x7d */
+  0x723b, 0x80b4, 0x9175, 0x9a4d, 0x4faf, 0x5019, 0x539a, 0x540e,
+  0x543c, 0x5589, 0x55c5, 0x5e3f, 0x5f8c, 0x673d, 0x7166, 0x73dd,
+  0x9005, 0x52db, 0x52f3, 0x5864, 0x58ce, 0x7104, 0x718f, 0x71fb,
+  0x85b0, 0x8a13, 0x6688, 0x85a8, 0x55a7, 0x6684, 0x714a, 0x8431,
+  0x5349, 0x5599, 0x6bc1, 0x5f59, 0x5fbd, 0x63ee, 0x6689, 0x7147,
+  0x8af1, 0x8f1d, 0x9ebe, 0x4f11, 0x643a, 0x70cb, 0x7566, 0x8667,
+  0x6064, 0x8b4e, 0x9df8, 0x5147, 0x51f6, 0x5308, 0x6d36, 0x80f8,
+  0x9ed1, 0x6615, 0x6b23, 0x7098, 0x75d5, 0x5403, 0x5c79, 0x7d07,
+  0x8a16, 0x6b20, 0x6b3d, 0x6b46, 0x5438, 0x6070, 0x6d3d, 0x7fd5,
+  0x8208, 0x50d6, 0x51de, 0x559c, 0x566b, 0x56cd, 0x59ec, 0x5b09,
+  0x5e0c, 0x6199, 0x6198, 0x6231, 0x665e, 0x66e6, 0x7199, 0x71b9,
+  0x71ba, 0x72a7, 0x79a7, 0x7a00, 0x7fb2, 0x8a70,
+};
+
+static int
+ksc5601_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c1 = (s[0] & 0x7F);
+  if ((c1 >= 0x21 && c1 <= 0x2c) || (c1 >= 0x30 && c1 <= 0x48) || (c1 >= 0x4a && c1 <= 0x7d)) {
+    if (n >= 2) {
+      unsigned char c2 = (s[1] & 0x7F);
+      if (c2 >= 0x21 && c2 < 0x7f) {
+        unsigned int i = 94 * (c1 - 0x21) + (c2 - 0x21);
+        unsigned short wc = 0xfffd;
+        if (i < 1410) {
+          if (i < 1115)
+            wc = ksc5601_2uni_page21[i];
+        } else if (i < 3854) {
+          if (i < 3760)
+            wc = ksc5601_2uni_page30[i-1410];
+        } else {
+          if (i < 8742)
+            wc = ksc5601_2uni_page4a[i-3854];
+        }
+        if (wc != 0xfffd) {
+          *pwc = (ucs4_t) wc;
+          return 2;
+        }
+      }
+      return RET_ILSEQ;
+    }
+    return RET_TOOFEW(0);
+  }
+  return RET_ILSEQ;
+}
+
+static const unsigned short ksc5601_2charset[8224] = {
+  0x222e, 0x2234, 0x2157, 0x2127, 0x2823, 0x2129, 0x2146, 0x213e,
+  0x2977, 0x2978, 0x2225, 0x2252, 0x2124, 0x222c, 0x2976, 0x282c,
+  0x2879, 0x2876, 0x287a, 0x222f, 0x2821, 0x2822, 0x213f, 0x282a,
+  0x282d, 0x292c, 0x2921, 0x2923, 0x2140, 0x292a, 0x292d, 0x2922,
+  0x2824, 0x2924, 0x2925, 0x2826, 0x2926, 0x2927, 0x2828, 0x2928,
+  0x2829, 0x2929, 0x2930, 0x282f, 0x292f, 0x282b, 0x292b, 0x282e,
+  0x292e, 0x2227, 0x2230, 0x2228, 0x222b, 0x222a, 0x222d, 0x2229,
+  0x2541, 0x2542, 0x2543, 0x2544, 0x2545, 0x2546, 0x2547, 0x2548,
+  0x2549, 0x254a, 0x254b, 0x254c, 0x254d, 0x254e, 0x254f, 0x2550,
+  0x2551, 0x2552, 0x2553, 0x2554, 0x2555, 0x2556, 0x2557, 0x2558,
+  0x2561, 0x2562, 0x2563, 0x2564, 0x2565, 0x2566, 0x2567, 0x2568,
+  0x2569, 0x256a, 0x256b, 0x256c, 0x256d, 0x256e, 0x256f, 0x2570,
+  0x2571, 0x2572, 0x2573, 0x2574, 0x2575, 0x2576, 0x2577, 0x2578,
+  0x2c27, 0x2c21, 0x2c22, 0x2c23, 0x2c24, 0x2c25, 0x2c26, 0x2c28,
+  0x2c29, 0x2c2a, 0x2c2b, 0x2c2c, 0x2c2d, 0x2c2e, 0x2c2f, 0x2c30,
+  0x2c31, 0x2c32, 0x2c33, 0x2c34, 0x2c35, 0x2c36, 0x2c37, 0x2c38,
+  0x2c39, 0x2c3a, 0x2c3b, 0x2c3c, 0x2c3d, 0x2c3e, 0x2c3f, 0x2c40,
+  0x2c41, 0x2c51, 0x2c52, 0x2c53, 0x2c54, 0x2c55, 0x2c56, 0x2c58,
+  0x2c59, 0x2c5a, 0x2c5b, 0x2c5c, 0x2c5d, 0x2c5e, 0x2c5f, 0x2c60,
+  0x2c61, 0x2c62, 0x2c63, 0x2c64, 0x2c65, 0x2c66, 0x2c67, 0x2c68,
+  0x2c69, 0x2c6a, 0x2c6b, 0x2c6c, 0x2c6d, 0x2c6e, 0x2c6f, 0x2c70,
+  0x2c71, 0x2c57, 0x212a, 0x212e, 0x212f, 0x2130, 0x2131, 0x2253,
+  0x2254, 0x2125, 0x2126, 0x2236, 0x2147, 0x2148, 0x2158, 0x2979,
+  0x297a, 0x297b, 0x297c, 0x297d, 0x297e, 0x2149, 0x2235, 0x2724,
+  0x2260, 0x2265, 0x2262, 0x2759, 0x214a, 0x2877, 0x2878, 0x287b,
+  0x287c, 0x287d, 0x287e, 0x2530, 0x2531, 0x2532, 0x2533, 0x2534,
+  0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x2521, 0x2522, 0x2523,
+  0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252a, 0x2167,
+  0x2168, 0x2166, 0x2169, 0x216a, 0x2255, 0x2258, 0x2256, 0x2259,
+  0x2257, 0x2221, 0x2222, 0x2223, 0x2153, 0x2224, 0x2154, 0x2174,
+  0x2175, 0x2233, 0x2232, 0x216e, 0x2170, 0x2144, 0x2150, 0x212b,
+  0x217c, 0x217d, 0x217b, 0x217a, 0x2172, 0x2173, 0x2231, 0x2145,
+  0x2171, 0x212d, 0x216f, 0x2156, 0x2141, 0x2155, 0x2142, 0x2143,
+  0x216c, 0x216d, 0x2178, 0x2179, 0x2176, 0x2177, 0x2241, 0x2151,
+  0x2152, 0x2867, 0x2868, 0x2869, 0x286a, 0x286b, 0x286c, 0x286d,
+  0x286e, 0x286f, 0x2870, 0x2871, 0x2872, 0x2873, 0x2874, 0x2875,
+  0x2967, 0x2968, 0x2969, 0x296a, 0x296b, 0x296c, 0x296d, 0x296e,
+  0x296f, 0x2970, 0x2971, 0x2972, 0x2973, 0x2974, 0x2975, 0x294d,
+  0x294e, 0x294f, 0x2950, 0x2951, 0x2952, 0x2953, 0x2954, 0x2955,
+  0x2956, 0x2957, 0x2958, 0x2959, 0x295a, 0x295b, 0x295c, 0x295d,
+  0x295e, 0x295f, 0x2960, 0x2961, 0x2962, 0x2963, 0x2964, 0x2965,
+  0x2966, 0x284d, 0x284e, 0x284f, 0x2850, 0x2851, 0x2852, 0x2853,
+  0x2854, 0x2855, 0x2856, 0x2857, 0x2858, 0x2859, 0x285a, 0x285b,
+  0x285c, 0x285d, 0x285e, 0x285f, 0x2860, 0x2861, 0x2862, 0x2863,
+  0x2864, 0x2865, 0x2866, 0x2621, 0x262c, 0x2622, 0x262d, 0x2623,
+  0x2648, 0x2647, 0x262e, 0x2624, 0x2642, 0x2641, 0x262f, 0x2626,
+  0x2646, 0x2645, 0x2631, 0x2625, 0x2644, 0x2643, 0x2630, 0x2627,
+  0x263c, 0x2649, 0x264a, 0x2637, 0x264b, 0x264c, 0x2632, 0x2629,
+  0x263e, 0x264d, 0x264e, 0x2639, 0x264f, 0x2650, 0x2634, 0x2628,
+  0x2651, 0x2652, 0x2638, 0x263d, 0x2653, 0x2654, 0x2633, 0x262a,
+  0x2655, 0x2656, 0x263a, 0x263f, 0x2657, 0x2658, 0x2635, 0x262b,
+  0x2659, 0x265a, 0x263b, 0x265b, 0x265c, 0x2640, 0x265d, 0x265e,
+  0x265f, 0x2660, 0x2661, 0x2662, 0x2663, 0x2664, 0x2636, 0x2246,
+  0x2161, 0x2160, 0x2243, 0x2247, 0x2248, 0x224b, 0x224a, 0x2249,
+  0x224c, 0x2163, 0x2162, 0x223a, 0x2239, 0x2165, 0x2164, 0x2238,
+  0x2237, 0x215f, 0x215e, 0x2242, 0x215b, 0x215d, 0x215c, 0x2244,
+  0x2245, 0x215a, 0x2159, 0x224f, 0x224e, 0x2250, 0x2251, 0x214f,
+  0x214e, 0x223c, 0x223d, 0x2240, 0x223b, 0x223e, 0x223f, 0x224d,
+  0x225b, 0x225c, 0x225d, 0x225a, 0x2121, 0x2122, 0x2123, 0x2128,
+  0x2134, 0x2135, 0x2136, 0x2137, 0x2138, 0x2139, 0x213a, 0x213b,
+  0x213c, 0x213d, 0x216b, 0x2132, 0x2133, 0x2a21, 0x2a22, 0x2a23,
+  0x2a24, 0x2a25, 0x2a26, 0x2a27, 0x2a28, 0x2a29, 0x2a2a, 0x2a2b,
+  0x2a2c, 0x2a2d, 0x2a2e, 0x2a2f, 0x2a30, 0x2a31, 0x2a32, 0x2a33,
+  0x2a34, 0x2a35, 0x2a36, 0x2a37, 0x2a38, 0x2a39, 0x2a3a, 0x2a3b,
+  0x2a3c, 0x2a3d, 0x2a3e, 0x2a3f, 0x2a40, 0x2a41, 0x2a42, 0x2a43,
+  0x2a44, 0x2a45, 0x2a46, 0x2a47, 0x2a48, 0x2a49, 0x2a4a, 0x2a4b,
+  0x2a4c, 0x2a4d, 0x2a4e, 0x2a4f, 0x2a50, 0x2a51, 0x2a52, 0x2a53,
+  0x2a54, 0x2a55, 0x2a56, 0x2a57, 0x2a58, 0x2a59, 0x2a5a, 0x2a5b,
+  0x2a5c, 0x2a5d, 0x2a5e, 0x2a5f, 0x2a60, 0x2a61, 0x2a62, 0x2a63,
+  0x2a64, 0x2a65, 0x2a66, 0x2a67, 0x2a68, 0x2a69, 0x2a6a, 0x2a6b,
+  0x2a6c, 0x2a6d, 0x2a6e, 0x2a6f, 0x2a70, 0x2a71, 0x2a72, 0x2a73,
+  0x2b21, 0x2b22, 0x2b23, 0x2b24, 0x2b25, 0x2b26, 0x2b27, 0x2b28,
+  0x2b29, 0x2b2a, 0x2b2b, 0x2b2c, 0x2b2d, 0x2b2e, 0x2b2f, 0x2b30,
+  0x2b31, 0x2b32, 0x2b33, 0x2b34, 0x2b35, 0x2b36, 0x2b37, 0x2b38,
+  0x2b39, 0x2b3a, 0x2b3b, 0x2b3c, 0x2b3d, 0x2b3e, 0x2b3f, 0x2b40,
+  0x2b41, 0x2b42, 0x2b43, 0x2b44, 0x2b45, 0x2b46, 0x2b47, 0x2b48,
+  0x2b49, 0x2b4a, 0x2b4b, 0x2b4c, 0x2b4d, 0x2b4e, 0x2b4f, 0x2b50,
+  0x2b51, 0x2b52, 0x2b53, 0x2b54, 0x2b55, 0x2b56, 0x2b57, 0x2b58,
+  0x2b59, 0x2b5a, 0x2b5b, 0x2b5c, 0x2b5d, 0x2b5e, 0x2b5f, 0x2b60,
+  0x2b61, 0x2b62, 0x2b63, 0x2b64, 0x2b65, 0x2b66, 0x2b67, 0x2b68,
+  0x2b69, 0x2b6a, 0x2b6b, 0x2b6c, 0x2b6d, 0x2b6e, 0x2b6f, 0x2b70,
+  0x2b71, 0x2b72, 0x2b73, 0x2b74, 0x2b75, 0x2b76, 0x2421, 0x2422,
+  0x2423, 0x2424, 0x2425, 0x2426, 0x2427, 0x2428, 0x2429, 0x242a,
+  0x242b, 0x242c, 0x242d, 0x242e, 0x242f, 0x2430, 0x2431, 0x2432,
+  0x2433, 0x2434, 0x2435, 0x2436, 0x2437, 0x2438, 0x2439, 0x243a,
+  0x243b, 0x243c, 0x243d, 0x243e, 0x243f, 0x2440, 0x2441, 0x2442,
+  0x2443, 0x2444, 0x2445, 0x2446, 0x2447, 0x2448, 0x2449, 0x244a,
+  0x244b, 0x244c, 0x244d, 0x244e, 0x244f, 0x2450, 0x2451, 0x2452,
+  0x2453, 0x2454, 0x2455, 0x2456, 0x2457, 0x2458, 0x2459, 0x245a,
+  0x245b, 0x245c, 0x245d, 0x245e, 0x245f, 0x2460, 0x2461, 0x2462,
+  0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468, 0x2469, 0x246a,
+  0x246b, 0x246c, 0x246d, 0x246e, 0x246f, 0x2470, 0x2471, 0x2472,
+  0x2473, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247a,
+  0x247b, 0x247c, 0x247d, 0x247e, 0x2931, 0x2932, 0x2933, 0x2934,
+  0x2935, 0x2936, 0x2937, 0x2938, 0x2939, 0x293a, 0x293b, 0x293c,
+  0x293d, 0x293e, 0x293f, 0x2940, 0x2941, 0x2942, 0x2943, 0x2944,
+  0x2945, 0x2946, 0x2947, 0x2948, 0x2949, 0x294a, 0x294b, 0x294c,
+  0x225f, 0x2831, 0x2832, 0x2833, 0x2834, 0x2835, 0x2836, 0x2837,
+  0x2838, 0x2839, 0x283a, 0x283b, 0x283c, 0x283d, 0x283e, 0x283f,
+  0x2840, 0x2841, 0x2842, 0x2843, 0x2844, 0x2845, 0x2846, 0x2847,
+  0x2848, 0x2849, 0x284a, 0x284b, 0x284c, 0x225e, 0x2749, 0x274a,
+  0x274b, 0x274c, 0x274d, 0x273a, 0x273b, 0x275c, 0x275d, 0x275e,
+  0x2736, 0x2737, 0x2738, 0x2754, 0x2755, 0x2756, 0x2757, 0x2758,
+  0x2721, 0x2722, 0x2723, 0x2725, 0x272b, 0x272c, 0x272d, 0x272e,
+  0x272f, 0x2730, 0x2731, 0x2732, 0x2733, 0x2734, 0x2727, 0x2728,
+  0x2729, 0x272a, 0x273d, 0x273e, 0x2765, 0x2766, 0x2767, 0x2768,
+  0x2761, 0x2762, 0x2763, 0x273f, 0x2740, 0x2741, 0x2742, 0x2743,
+  0x2744, 0x2745, 0x2746, 0x2747, 0x2748, 0x274e, 0x274f, 0x2750,
+  0x2751, 0x2752, 0x2753, 0x275a, 0x275b, 0x2263, 0x276c, 0x2726,
+  0x2760, 0x276f, 0x2261, 0x273c, 0x276d, 0x2735, 0x2739, 0x276a,
+  0x276b, 0x275f, 0x2264, 0x2764, 0x276e, 0x2769, 0x6c69, 0x6f4b,
+  0x7652, 0x5832, 0x6d5b, 0x5f32, 0x5f3e, 0x793b, 0x5c74, 0x7564,
+  0x7326, 0x5d60, 0x6126, 0x4e78, 0x5c30, 0x632a, 0x7169, 0x4d7a,
+  0x7c2f, 0x5321, 0x712b, 0x6751, 0x522c, 0x4e79, 0x717d, 0x5e3f,
+  0x7b3a, 0x7939, 0x4e52, 0x632b, 0x6b60, 0x4e7a, 0x4b77, 0x6525,
+  0x4a61, 0x544c, 0x6a61, 0x5c63, 0x5f2d, 0x4b6b, 0x552f, 0x5675,
+  0x6578, 0x5e40, 0x6c23, 0x694d, 0x6a27, 0x6976, 0x7b3b, 0x6769,
+  0x6f4c, 0x5066, 0x5e41, 0x642c, 0x584c, 0x7971, 0x4e5f, 0x7a24,
+  0x6632, 0x7a7b, 0x7a3d, 0x4c48, 0x6f4d, 0x5555, 0x5322, 0x6c51,
+  0x6427, 0x6c52, 0x7631, 0x4e7b, 0x5051, 0x4b3f, 0x6d24, 0x6d28,
+  0x5e42, 0x7662, 0x6d5c, 0x5c75, 0x6039, 0x544e, 0x7435, 0x535b,
+  0x5635, 0x6c24, 0x6466, 0x716a, 0x4b6c, 0x4b40, 0x6c72, 0x506a,
+  0x7972, 0x6c25, 0x505f, 0x676a, 0x506b, 0x5c51, 0x5b69, 0x7d4c,
+  0x5b57, 0x5a61, 0x5636, 0x635f, 0x5e43, 0x5e44, 0x4a21, 0x6e6c,
+  0x5323, 0x6e37, 0x784f, 0x6a48, 0x6e38, 0x712c, 0x7125, 0x694e,
+  0x793c, 0x6579, 0x6c6a, 0x5d56, 0x6d42, 0x7825, 0x653a, 0x5b58,
+  0x4a22, 0x514d, 0x6e6d, 0x6c6b, 0x5e45, 0x6360, 0x4a49, 0x7269,
+  0x554e, 0x7636, 0x4e42, 0x5647, 0x6334, 0x712d, 0x6a62, 0x5742,
+  0x7327, 0x4d6a, 0x6b6e, 0x5932, 0x7d25, 0x7655, 0x5562, 0x7835,
+  0x4c75, 0x7535, 0x642d, 0x676b, 0x7155, 0x703b, 0x6935, 0x4c49,
+  0x7a55, 0x6154, 0x5756, 0x5c41, 0x5e46, 0x7a6f, 0x6361, 0x6173,
+  0x5c76, 0x4e7c, 0x5b44, 0x7871, 0x5c64, 0x656f, 0x5c31, 0x5556,
+  0x735a, 0x4b41, 0x5b43, 0x597a, 0x536e, 0x7a38, 0x7d26, 0x6b6f,
+  0x7426, 0x4c4a, 0x7328, 0x735b, 0x5b27, 0x7637, 0x4f66, 0x7072,
+  0x4b5a, 0x6752, 0x5743, 0x7670, 0x685e, 0x6526, 0x6567, 0x4a23,
+  0x4c27, 0x6a49, 0x7836, 0x7a25, 0x712e, 0x6f4e, 0x4b6d, 0x7630,
+  0x6f4f, 0x694f, 0x775e, 0x4e53, 0x5c77, 0x5b28, 0x4b78, 0x5f21,
+  0x5d61, 0x754a, 0x6936, 0x676c, 0x6e6e, 0x7370, 0x5f3f, 0x4c4b,
+  0x5041, 0x7452, 0x603a, 0x5f40, 0x4e60, 0x5c52, 0x7d6a, 0x5676,
+  0x6a4a, 0x6869, 0x632c, 0x7350, 0x4a24, 0x5b78, 0x5e47, 0x6b70,
+  0x7156, 0x6562, 0x4c4c, 0x4b7b, 0x6a63, 0x5f41, 0x566d, 0x6950,
+  0x6e39, 0x5563, 0x5153, 0x6570, 0x6834, 0x6b43, 0x6a2a, 0x7a7c,
+  0x7576, 0x703c, 0x7d54, 0x603b, 0x4e43, 0x503a, 0x773a, 0x5873,
+  0x774d, 0x642e, 0x545f, 0x5067, 0x6c7d, 0x522e, 0x6e6f, 0x5557,
+  0x6a64, 0x7822, 0x4d6b, 0x573f, 0x7b31, 0x4d6c, 0x5c32, 0x506c,
+  0x4e7d, 0x6e70, 0x4c42, 0x506d, 0x6577, 0x737c, 0x6e22, 0x5933,
+  0x5874, 0x6937, 0x4e2e, 0x5922, 0x5871, 0x544f, 0x6527, 0x5552,
+  0x5629, 0x7422, 0x7157, 0x5558, 0x703d, 0x5750, 0x5450, 0x574f,
+  0x6b6a, 0x7d6b, 0x5b6d, 0x7c45, 0x4b42, 0x7d55, 0x7448, 0x686a,
+  0x7573, 0x795e, 0x536f, 0x6c53, 0x5d42, 0x6f37, 0x6754, 0x4a4a,
+  0x597b, 0x7a7d, 0x562a, 0x7478, 0x7777, 0x5c2c, 0x5757, 0x5f22,
+  0x4e3e, 0x5370, 0x7024, 0x616c, 0x4f67, 0x734b, 0x6d29, 0x4a3e,
+  0x746f, 0x764e, 0x5e7b, 0x503b, 0x5537, 0x6e71, 0x7428, 0x5c78,
+  0x4b27, 0x5a4e, 0x6066, 0x6d25, 0x6e72, 0x5c79, 0x795c, 0x735c,
+  0x7872, 0x7479, 0x7c71, 0x503c, 0x5b79, 0x5731, 0x4b7c, 0x7025,
+  0x4b7d, 0x5574, 0x4d6d, 0x4a25, 0x562b, 0x5042, 0x703e, 0x523d,
+  0x4c24, 0x7a36, 0x4c4d, 0x5a7a, 0x764f, 0x6938, 0x5875, 0x4c4e,
+  0x574d, 0x5451, 0x696d, 0x4a6b, 0x5962, 0x7d32, 0x632d, 0x564c,
+  0x5934, 0x6127, 0x6e53, 0x5043, 0x7d33, 0x5564, 0x4f68, 0x6d43,
+  0x5032, 0x4e7e, 0x5a28, 0x7850, 0x7d56, 0x7851, 0x7852, 0x5c53,
+  0x5d62, 0x7b79, 0x5d41, 0x6335, 0x6d5d, 0x4e44, 0x4b21, 0x5d63,
+  0x7c5d, 0x792f, 0x527b, 0x4f21, 0x6428, 0x7436, 0x6c7e, 0x632e,
+  0x676d, 0x7d41, 0x5a62, 0x5833, 0x5d64, 0x706f, 0x7671, 0x7a70,
+  0x5175, 0x5a4f, 0x5c54, 0x5c26, 0x6f3f, 0x4e4f, 0x6059, 0x5956,
+  0x6c54, 0x6a4b, 0x4a3f, 0x5530, 0x4f69, 0x716d, 0x4c4f, 0x6478,
+  0x646d, 0x5758, 0x7d27, 0x6a2b, 0x7632, 0x4f70, 0x793d, 0x6674,
+  0x4b5b, 0x7351, 0x6951, 0x7329, 0x5060, 0x6952, 0x5a63, 0x6252,
+  0x7622, 0x6174, 0x5a64, 0x6755, 0x753f, 0x4f22, 0x4d2f, 0x4f23,
+  0x4d30, 0x717e, 0x5023, 0x612f, 0x7823, 0x4a26, 0x773b, 0x726a,
+  0x5e48, 0x6953, 0x5e49, 0x7d5e, 0x4a40, 0x796a, 0x514e, 0x6e54,
+  0x5452, 0x5923, 0x7d28, 0x5759, 0x774e, 0x7a3e, 0x4f56, 0x5770,
+  0x6b61, 0x7845, 0x5c7a, 0x5d43, 0x795f, 0x676f, 0x7d65, 0x7623,
+  0x597c, 0x7d29, 0x676e, 0x5565, 0x6f50, 0x4d31, 0x7722, 0x7132,
+  0x7131, 0x4d32, 0x5a2b, 0x4a27, 0x6362, 0x7b3c, 0x5924, 0x6e3a,
+  0x7853, 0x7b7a, 0x4f24, 0x5c7b, 0x7663, 0x6d2a, 0x7221, 0x4e61,
+  0x7a26, 0x7960, 0x6c56, 0x646e, 0x7921, 0x7b6f, 0x796b, 0x6e23,
+  0x6a2c, 0x4a28, 0x747a, 0x4d56, 0x7c76, 0x7449, 0x7854, 0x7826,
+  0x5e4a, 0x7246, 0x575a, 0x5350, 0x5845, 0x6a66, 0x735d, 0x645a,
+  0x7664, 0x7672, 0x5f42, 0x597d, 0x4c76, 0x533a, 0x642f, 0x7961,
+  0x7026, 0x4b53, 0x603c, 0x744a, 0x547a, 0x7d2a, 0x7962, 0x7437,
+  0x7d42, 0x7c30, 0x7d6c, 0x4a62, 0x7d3d, 0x6a67, 0x5f43, 0x5152,
+  0x4e62, 0x5324, 0x7d2b, 0x5f60, 0x7247, 0x6770, 0x506e, 0x732a,
+  0x5e4b, 0x7638, 0x6175, 0x7133, 0x7723, 0x4a29, 0x4f25, 0x5f44,
+  0x6130, 0x703f, 0x7624, 0x6336, 0x7a46, 0x506f, 0x7d6d, 0x5d44,
+  0x7c77, 0x663f, 0x5e2d, 0x7a3f, 0x6571, 0x6d44, 0x5225, 0x7d6e,
+  0x7536, 0x6176, 0x5e4c, 0x7c5e, 0x6c57, 0x4d5d, 0x5637, 0x4d33,
+  0x7855, 0x6558, 0x4f6a, 0x4f50, 0x6a4c, 0x6a2e, 0x6a2d, 0x5371,
+  0x5325, 0x774f, 0x6e24, 0x5024, 0x7222, 0x5070, 0x7223, 0x7778,
+  0x5033, 0x5b29, 0x533b, 0x4a6c, 0x7126, 0x4b55, 0x7767, 0x4d5e,
+  0x7724, 0x7840, 0x535d, 0x4c50, 0x4f26, 0x7673, 0x6177, 0x535c,
+  0x7a7e, 0x7a27, 0x6b59, 0x4f27, 0x6a2f, 0x646f, 0x6939, 0x7158,
+  0x5858, 0x6072, 0x6634, 0x5c7c, 0x7371, 0x6350, 0x727b, 0x5b46,
+  0x5071, 0x5072, 0x4f5c, 0x5351, 0x4c31, 0x7758, 0x4b28, 0x6b3c,
+  0x643e, 0x745c, 0x5c42, 0x7027, 0x6640, 0x4a6d, 0x686b, 0x6568,
+  0x5c43, 0x6d5e, 0x5372, 0x4c77, 0x4e54, 0x672b, 0x4b43, 0x6131,
+  0x7732, 0x5373, 0x5352, 0x7540, 0x5f5d, 0x6e73, 0x6771, 0x7d34,
+  0x7248, 0x7352, 0x6e74, 0x6253, 0x4c51, 0x5f6a, 0x693a, 0x5957,
+  0x754d, 0x7172, 0x7a47, 0x5978, 0x5442, 0x7665, 0x5d45, 0x6772,
+  0x6d5f, 0x4a4b, 0x5b7a, 0x6835, 0x5326, 0x7d35, 0x7949, 0x6462,
+  0x7b3d, 0x5724, 0x4e45, 0x4e55, 0x5666, 0x653d, 0x5e4d, 0x6c73,
+  0x6d60, 0x6c6c, 0x7b3e, 0x5f6b, 0x6178, 0x793e, 0x5073, 0x602a,
+  0x6862, 0x6254, 0x527d, 0x6528, 0x5953, 0x535e, 0x7438, 0x773c,
+  0x5c7d, 0x686c, 0x6467, 0x6377, 0x6c28, 0x7a71, 0x6572, 0x5074,
+  0x522f, 0x5c65, 0x5025, 0x7134, 0x7c31, 0x4c78, 0x5d46, 0x7a51,
+  0x775f, 0x7a28, 0x6e75, 0x5e4e, 0x6773, 0x772c, 0x6b44, 0x6d61,
+  0x602b, 0x5d47, 0x5233, 0x523f, 0x4a4c, 0x7b3f, 0x657d, 0x5d65,
+  0x584d, 0x6c74, 0x5075, 0x686d, 0x5052, 0x5958, 0x7666, 0x5b2a,
+  0x7760, 0x5859, 0x7423, 0x745d, 0x6f51, 0x5935, 0x6d2b, 0x6337,
+  0x6e3b, 0x4d34, 0x6073, 0x6a4d, 0x6c75, 0x686e, 0x4b29, 0x712f,
+  0x4a4d, 0x6c29, 0x726b, 0x7d6f, 0x7973, 0x6641, 0x6c58, 0x6d2c,
+  0x6a4e, 0x685f, 0x5e4f, 0x5226, 0x6774, 0x5156, 0x6642, 0x6363,
+  0x6430, 0x5834, 0x7625, 0x735e, 0x5725, 0x7768, 0x6846, 0x7b66,
+  0x5d66, 0x5c7e, 0x585a, 0x5a2c, 0x6a30, 0x6338, 0x4a2a, 0x6179,
+  0x6a31, 0x726c, 0x7a6e, 0x6e55, 0x7974, 0x526c, 0x7b7b, 0x7d70,
+  0x603d, 0x4e63, 0x7846, 0x5e2e, 0x5f45, 0x653e, 0x6d2d, 0x7a6a,
+  0x4d6e, 0x6d26, 0x6d2e, 0x706d, 0x5d21, 0x6d2f, 0x7c78, 0x586b,
+  0x4c79, 0x4d35, 0x7a29, 0x615d, 0x6255, 0x6d4f, 0x5d22, 0x794a,
+  0x6a68, 0x656d, 0x536b, 0x6954, 0x617a, 0x644c, 0x6164, 0x6847,
+  0x4e5b, 0x5c55, 0x7735, 0x7c73, 0x7073, 0x4e2f, 0x7135, 0x6f52,
+  0x6848, 0x6b71, 0x4b54, 0x603e, 0x6378, 0x6a69, 0x7c32, 0x6074,
+  0x4f60, 0x6e25, 0x7a2a, 0x6643, 0x6132, 0x4a2b, 0x6364, 0x693b,
+  0x6256, 0x7372, 0x6e56, 0x6a32, 0x5076, 0x6c59, 0x5a4b, 0x4f28,
+  0x5d23, 0x585b, 0x794e, 0x6955, 0x6351, 0x523c, 0x582c, 0x734c,
+  0x4d7b, 0x7656, 0x6775, 0x686f, 0x6379, 0x523b, 0x7373, 0x637b,
+  0x5e50, 0x4e30, 0x5677, 0x7159, 0x7541, 0x5c44, 0x753b, 0x5e51,
+  0x5c66, 0x5e52, 0x6d62, 0x6e76, 0x6a4f, 0x706e, 0x637c, 0x535f,
+  0x5374, 0x6133, 0x6134, 0x7453, 0x5f46, 0x6956, 0x5b2b, 0x7626,
+  0x6339, 0x6b45, 0x7429, 0x4d36, 0x5279, 0x5a2d, 0x5263, 0x4f51,
+  0x4b5c, 0x4c7a, 0x4f5d, 0x6829, 0x633b, 0x633a, 0x605a, 0x6e77,
+  0x5c33, 0x5375, 0x5726, 0x7635, 0x575b, 0x6155, 0x546a, 0x5f23,
+  0x7d5f, 0x5077, 0x6d54, 0x4b2a, 0x645b, 0x617b, 0x4b22, 0x5360,
+  0x643f, 0x7b40, 0x5a3e, 0x644d, 0x5639, 0x6f40, 0x617c, 0x7639,
+  0x5f47, 0x6431, 0x5c67, 0x5c68, 0x7a56, 0x5376, 0x715a, 0x7a72,
+  0x627d, 0x554f, 0x5078, 0x4d5f, 0x754b, 0x6470, 0x4b2b, 0x5744,
+  0x627e, 0x5d5a, 0x5a2e, 0x4a6e, 0x5539, 0x6321, 0x6863, 0x732b,
+  0x4f29, 0x5377, 0x5471, 0x4e64, 0x6872, 0x6575, 0x672e, 0x563a,
+  0x5f6c, 0x6440, 0x6864, 0x5835, 0x645c, 0x7439, 0x7136, 0x625e,
+  0x6135, 0x4d6f, 0x7127, 0x4e65, 0x4b5d, 0x5963, 0x732c, 0x5079,
+  0x6c2b, 0x5e53, 0x7769, 0x7975, 0x615e, 0x4b6e, 0x633c, 0x7856,
+  0x5b6e, 0x7d71, 0x7736, 0x745e, 0x726d, 0x5b59, 0x7028, 0x617d,
+  0x5e54, 0x602c, 0x6d63, 0x5361, 0x5f48, 0x5936, 0x7d2c, 0x6f53,
+  0x6441, 0x786b, 0x5b2c, 0x7c46, 0x582d, 0x763a, 0x5b5f, 0x5353,
+  0x7847, 0x4a4e, 0x7841, 0x5234, 0x5c34, 0x7a39, 0x4a4f, 0x7c33,
+  0x6a6a, 0x6a6b, 0x507a, 0x6d64, 0x5d67, 0x5f49, 0x5f6d, 0x6e3c,
+  0x6f41, 0x4c52, 0x5d24, 0x5f4a, 0x5378, 0x7128, 0x4d37, 0x6f54,
+  0x645d, 0x5f6e, 0x4b2c, 0x693c, 0x6a6c, 0x5f4b, 0x793f, 0x562f,
+  0x5546, 0x4f2a, 0x4e29, 0x5678, 0x7137, 0x6e78, 0x5959, 0x735f,
+  0x7848, 0x4e46, 0x5566, 0x7466, 0x6645, 0x6f55, 0x4b6f, 0x7c5f,
+  0x5c27, 0x5667, 0x7849, 0x6352, 0x633d, 0x4f61, 0x7040, 0x6c5a,
+  0x5d57, 0x7b70, 0x6c2c, 0x7029, 0x7a57, 0x7b41, 0x5240, 0x6530,
+  0x6d65, 0x4b2d, 0x7930, 0x7725, 0x4b2e, 0x5a2f, 0x5836, 0x5327,
+  0x7b32, 0x7d44, 0x6c2d, 0x7b21, 0x6569, 0x696e, 0x7374, 0x7873,
+  0x7041, 0x5e2f, 0x7830, 0x7360, 0x672f, 0x5b2d, 0x6635, 0x7928,
+  0x5d58, 0x6859, 0x6f56, 0x5362, 0x625f, 0x7c60, 0x5748, 0x7d2d,
+  0x5f6f, 0x4c53, 0x5379, 0x5470, 0x5b47, 0x5e55, 0x7074, 0x5550,
+  0x6559, 0x7c47, 0x5c56, 0x6260, 0x5a30, 0x7323, 0x536c, 0x744b,
+  0x7d45, 0x637d, 0x7931, 0x507b, 0x6c5b, 0x753c, 0x7224, 0x584e,
+  0x584f, 0x7577, 0x7661, 0x5237, 0x7b6c, 0x5d48, 0x6468, 0x5241,
+  0x7857, 0x563b, 0x5e56, 0x773d, 0x6c2e, 0x5061, 0x6075, 0x6a33,
+  0x4e56, 0x4c25, 0x6c76, 0x6261, 0x633e, 0x7c48, 0x4d70, 0x7976,
+  0x5f70, 0x653f, 0x4e3f, 0x7c61, 0x6d30, 0x7d51, 0x763b, 0x794f,
+  0x6b5a, 0x4a41, 0x5238, 0x4d71, 0x6353, 0x7d66, 0x666d, 0x637a,
+  0x702a, 0x7950, 0x7c62, 0x7827, 0x6165, 0x6e79, 0x6776, 0x6a6d,
+  0x7c34, 0x7542, 0x575c, 0x7075, 0x5d68, 0x536d, 0x757c, 0x5a3f,
+  0x4c7b, 0x537a, 0x7424, 0x6f57, 0x5443, 0x7b63, 0x7b6d, 0x602d,
+  0x6a6e, 0x7b33, 0x6442, 0x7667, 0x525d, 0x5f4c, 0x7c49, 0x6529,
+  0x6076, 0x7633, 0x617e, 0x4b70, 0x6a6f, 0x6a70, 0x5a40, 0x7834,
+  0x6b72, 0x6443, 0x6957, 0x6471, 0x4a6f, 0x4e57, 0x7c4a, 0x7361,
+  0x4b44, 0x6365, 0x4b45, 0x6a34, 0x693d, 0x5749, 0x6b5b, 0x6d31,
+  0x4c43, 0x773e, 0x7c4b, 0x7874, 0x5937, 0x7353, 0x7354, 0x7764,
+  0x7751, 0x5837, 0x4e31, 0x4a42, 0x7b34, 0x4b46, 0x7076, 0x5567,
+  0x6a50, 0x4c54, 0x4b2f, 0x742a, 0x692f, 0x7543, 0x6958, 0x5d69,
+  0x7173, 0x557b, 0x5e3b, 0x747b, 0x7d73, 0x7d72, 0x7726, 0x5d49,
+  0x5453, 0x4c28, 0x5a41, 0x4c55, 0x5964, 0x7a4a, 0x6563, 0x533c,
+  0x4a70, 0x5044, 0x4a50, 0x7a2b, 0x6b6b, 0x6778, 0x5965, 0x5157,
+  0x7324, 0x547b, 0x7c63, 0x7a58, 0x7355, 0x4f2b, 0x6b73, 0x557c,
+  0x5354, 0x4d7c, 0x5966, 0x6279, 0x6221, 0x6b54, 0x6077, 0x6432,
+  0x4c7c, 0x7b64, 0x742b, 0x503d, 0x4a71, 0x6f38, 0x5740, 0x6e7a,
+  0x7d74, 0x5363, 0x7b42, 0x5568, 0x5b2e, 0x6136, 0x7837, 0x603f,
+  0x7b43, 0x5d6a, 0x6222, 0x6e26, 0x7668, 0x7675, 0x5d4a, 0x5062,
+  0x5d26, 0x5d6b, 0x6479, 0x632f, 0x507c, 0x747c, 0x4c3c, 0x776a,
+  0x6564, 0x5f71, 0x7761, 0x7977, 0x6f39, 0x7858, 0x7929, 0x7859,
+  0x6e3d, 0x5846, 0x6463, 0x754e, 0x5d59, 0x5967, 0x5239, 0x5543,
+  0x5a65, 0x5a50, 0x5159, 0x4e58, 0x4b5e, 0x742c, 0x5a7b, 0x7669,
+  0x6873, 0x4f2c, 0x7070, 0x747d, 0x5b48, 0x4e40, 0x6354, 0x514f,
+  0x7175, 0x4d72, 0x4f6b, 0x4d38, 0x6326, 0x515a, 0x7225, 0x7226,
+  0x644e, 0x537b, 0x7129, 0x7249, 0x6f58, 0x6649, 0x5838, 0x7a73,
+  0x7335, 0x7824, 0x5173, 0x6648, 0x785a, 0x5c69, 0x5e57, 0x4b5f,
+  0x4f6c, 0x745f, 0x5174, 0x523a, 0x5f72, 0x6137, 0x6223, 0x537c,
+  0x6d66, 0x5b49, 0x647a, 0x4f5e, 0x4e50, 0x5553, 0x7375, 0x772e,
+  0x6f48, 0x4d73, 0x754f, 0x6573, 0x7042, 0x4a51, 0x6a71, 0x5026,
+  0x595a, 0x702b, 0x6b67, 0x6540, 0x7c35, 0x6444, 0x4c29, 0x7d46,
+  0x6a35, 0x652a, 0x5f3a, 0x615f, 0x5a51, 0x6138, 0x6874, 0x537d,
+  0x6224, 0x724a, 0x5a66, 0x7733, 0x7d4d, 0x7336, 0x6e57, 0x7544,
+  0x5824, 0x7227, 0x5938, 0x5939, 0x6f49, 0x564e, 0x774b, 0x5f2e,
+  0x6875, 0x5235, 0x5355, 0x744c, 0x5a7c, 0x5968, 0x776b, 0x7549,
+  0x733c, 0x5a52, 0x5335, 0x6836, 0x564f, 0x743a, 0x7749, 0x4c2a,
+  0x7043, 0x4c56, 0x5053, 0x533d, 0x5b7b, 0x4b60, 0x5364, 0x7677,
+  0x553a, 0x734d, 0x4b61, 0x6b74, 0x742d, 0x7c2a, 0x776c, 0x6876,
+  0x5a67, 0x774c, 0x6541, 0x606e, 0x557d, 0x4e66, 0x7c2b, 0x553b,
+  0x7228, 0x6225, 0x4d39, 0x6a72, 0x4b47, 0x4d74, 0x5b2f, 0x6f59,
+  0x4d3a, 0x7c79, 0x5f73, 0x4e67, 0x5a42, 0x4f2d, 0x6779, 0x7828,
+  0x7362, 0x4a72, 0x5f24, 0x5444, 0x4c57, 0x6542, 0x4d3b, 0x6f5a,
+  0x6e58, 0x5d27, 0x6226, 0x6040, 0x5630, 0x784a, 0x7c7a, 0x597e,
+  0x5e30, 0x5d6c, 0x5a68, 0x5460, 0x5679, 0x4d57, 0x5e58, 0x7278,
+  0x6456, 0x5045, 0x742e, 0x5d28, 0x6d45, 0x7356, 0x5e59, 0x6366,
+  0x5328, 0x5b30, 0x655a, 0x633f, 0x5b31, 0x5569, 0x6041, 0x6f5b,
+  0x7069, 0x5732, 0x507d, 0x5969, 0x507e, 0x6c6d, 0x5329, 0x7229,
+  0x7044, 0x6262, 0x696f, 0x7951, 0x6959, 0x685a, 0x5a43, 0x5a44,
+  0x5445, 0x677a, 0x4d60, 0x6330, 0x5b32, 0x7b44, 0x7363, 0x5925,
+  0x7b67, 0x5d4b, 0x5054, 0x6636, 0x602e, 0x7d5a, 0x5c35, 0x6078,
+  0x6731, 0x7570, 0x585c, 0x6d46, 0x6139, 0x6340, 0x7940, 0x6970,
+  0x595b, 0x7364, 0x5c36, 0x6469, 0x7045, 0x6341, 0x7c4c, 0x7c4d,
+  0x724b, 0x724c, 0x644f, 0x715b, 0x7a59, 0x7138, 0x7d75, 0x6079,
+  0x677b, 0x7c37, 0x7c64, 0x7b45, 0x6367, 0x5839, 0x7678, 0x5c45,
+  0x4c58, 0x602f, 0x7467, 0x6f5c, 0x4f7c, 0x6f5d, 0x722a, 0x7d3e,
+  0x4a2c, 0x7d3b, 0x7d47, 0x6732, 0x6a51, 0x5f74, 0x516c, 0x645e,
+  0x6543, 0x5926, 0x4d3c, 0x7365, 0x6d55, 0x593a, 0x6d67, 0x7b35,
+  0x786c, 0x6067, 0x4c59, 0x5446, 0x6725, 0x5575, 0x533e, 0x7c7b,
+  0x6472, 0x5f75, 0x6878, 0x786d, 0x4e47, 0x7d76, 0x6858, 0x4d58,
+  0x6756, 0x4c5a, 0x4a63, 0x5f76, 0x7047, 0x7046, 0x583a, 0x7174,
+  0x7470, 0x754c, 0x7c65, 0x6a45, 0x6a73, 0x5d5b, 0x5c57, 0x5e7d,
+  0x7279, 0x5547, 0x5850, 0x7048, 0x5121, 0x5122, 0x5954, 0x5668,
+  0x594a, 0x5a31, 0x5847, 0x5c62, 0x734e, 0x7574, 0x7139, 0x5a53,
+  0x766a, 0x4f75, 0x7d2e, 0x4a52, 0x5f34, 0x575d, 0x7a3a, 0x6e27,
+  0x753d, 0x7875, 0x6d68, 0x5461, 0x5123, 0x6156, 0x7978, 0x5b4a,
+  0x4b79, 0x5454, 0x595c, 0x6e3e, 0x776d, 0x526e, 0x6166, 0x7779,
+  0x5d6d, 0x685b, 0x5b33, 0x5177, 0x6030, 0x5462, 0x7657, 0x5779,
+  0x585d, 0x4d7d, 0x722b, 0x4d3d, 0x7842, 0x722c, 0x4a2d, 0x4a2e,
+  0x4f2e, 0x6342, 0x5c37, 0x5b5a, 0x593b, 0x4a73, 0x7653, 0x6678,
+  0x6a75, 0x6a76, 0x7679, 0x4f2f, 0x4a53, 0x4a2f, 0x5230, 0x713a,
+  0x5733, 0x6343, 0x737d, 0x5e5a, 0x5e5b, 0x6f5e, 0x6263, 0x6e7b,
+  0x5f77, 0x574a, 0x4e68, 0x5b5b, 0x713b, 0x6971, 0x7a37, 0x5046,
+  0x4c2b, 0x6e28, 0x4b7a, 0x7979, 0x4c7d, 0x537e, 0x6450, 0x726e,
+  0x5455, 0x5f4d, 0x7c38, 0x5150, 0x724d, 0x7752, 0x4a54, 0x5559,
+  0x585e, 0x4d59, 0x6e29, 0x763c, 0x4c5b, 0x7049, 0x7c7c, 0x6849,
+  0x747e, 0x677c, 0x575e, 0x5e5c, 0x702c, 0x4c7e, 0x4d61, 0x613a,
+  0x5b6f, 0x5a32, 0x5125, 0x5c38, 0x5876, 0x5124, 0x4d62, 0x5c6a,
+  0x7077, 0x704a, 0x503e, 0x5d5c, 0x5456, 0x5356, 0x6d50, 0x4d21,
+  0x5f35, 0x5f78, 0x5421, 0x4e32, 0x684a, 0x6b75, 0x6355, 0x7550,
+  0x7521, 0x5927, 0x652b, 0x664b, 0x7571, 0x6545, 0x7923, 0x605b,
+  0x766b, 0x4b71, 0x596a, 0x7522, 0x5751, 0x5178, 0x6a78, 0x6a79,
+  0x5a33, 0x6f5f, 0x716f, 0x6576, 0x6e3f, 0x6264, 0x503f, 0x7a2c,
+  0x7551, 0x6733, 0x693e, 0x724e, 0x5b34, 0x7c4e, 0x5d6e, 0x6734,
+  0x5734, 0x7734, 0x4d3e, 0x5a69, 0x4f30, 0x7759, 0x7366, 0x4e59,
+  0x4e2a, 0x4b48, 0x5027, 0x704b, 0x5047, 0x6445, 0x5b60, 0x555a,
+  0x5727, 0x6e40, 0x7876, 0x7552, 0x6d69, 0x593c, 0x6546, 0x7523,
+  0x5a54, 0x6227, 0x7b7c, 0x715c, 0x4a74, 0x687a, 0x4e69, 0x6978,
+  0x6265, 0x5039, 0x5472, 0x5126, 0x5f4e, 0x7c74, 0x532a, 0x4c2c,
+  0x6f60, 0x6565, 0x5055, 0x5b7c, 0x7c66, 0x4b7e, 0x6d6a, 0x5e31,
+  0x7963, 0x5422, 0x4f76, 0x5650, 0x556a, 0x716e, 0x7a4b, 0x6521,
+  0x5531, 0x4f6d, 0x6d6b, 0x5532, 0x553c, 0x7d62, 0x732d, 0x7d5b,
+  0x6930, 0x5127, 0x7d63, 0x4e33, 0x7d64, 0x7a4e, 0x4a30, 0x7727,
+  0x4f31, 0x6622, 0x7c36, 0x722d, 0x6f61, 0x732e, 0x5c46, 0x596b,
+  0x6860, 0x6128, 0x5576, 0x4f7d, 0x5e5d, 0x5951, 0x646a, 0x724f,
+  0x773f, 0x6266, 0x6228, 0x6356, 0x6d51, 0x6979, 0x5631, 0x5e32,
+  0x6068, 0x532b, 0x6b5c, 0x5f2f, 0x4a43, 0x6e7c, 0x7d43, 0x6b76,
+  0x4f32, 0x596c, 0x593d, 0x585f, 0x5438, 0x6b3e, 0x5d6f, 0x5d70,
+  0x5d71, 0x5d72, 0x593e, 0x7b46, 0x4f33, 0x6e7d, 0x642b, 0x5a45,
+  0x586c, 0x5128, 0x6229, 0x5e3c, 0x6735, 0x5b70, 0x6f62, 0x7170,
+  0x4f34, 0x5b71, 0x6031, 0x5f25, 0x7952, 0x677d, 0x6623, 0x7b71,
+  0x4b30, 0x722e, 0x4d67, 0x685c, 0x6757, 0x7740, 0x5063, 0x5a21,
+  0x4c3d, 0x5129, 0x5d4c, 0x637e, 0x512a, 0x682a, 0x6a36, 0x797a,
+  0x664c, 0x7658, 0x5447, 0x594b, 0x5952, 0x534b, 0x5877, 0x5a29,
+  0x7578, 0x5e5e, 0x722f, 0x7829, 0x5848, 0x6e41, 0x7941, 0x5d73,
+  0x6a7a, 0x763d, 0x613b, 0x4d3f, 0x7454, 0x664d, 0x7c4f, 0x7b22,
+  0x605c, 0x743b, 0x5a55, 0x7932, 0x7b72, 0x5b76, 0x5e5f, 0x5b72,
+  0x785c, 0x776e, 0x6b68, 0x527a, 0x713c, 0x7a5a, 0x5a6a, 0x5a46,
+  0x7741, 0x6736, 0x6547, 0x562c, 0x5c47, 0x6129, 0x622a, 0x5526,
+  0x5457, 0x7250, 0x6a7b, 0x605d, 0x7b73, 0x713d, 0x6267, 0x7d57,
+  0x4e48, 0x6a37, 0x7c40, 0x7d67, 0x776f, 0x5735, 0x6f3a, 0x715d,
+  0x5e33, 0x684b, 0x785d, 0x7b47, 0x5548, 0x575f, 0x5d29, 0x6931,
+  0x7a2d, 0x7659, 0x7a74, 0x782a, 0x666e, 0x4c5c, 0x613c, 0x606f,
+  0x693f, 0x7c7d, 0x664e, 0x6157, 0x664f, 0x7471, 0x6473, 0x647b,
+  0x7964, 0x6f63, 0x4f6e, 0x763e, 0x6032, 0x7c7e, 0x512b, 0x577a,
+  0x7b48, 0x6257, 0x5423, 0x7078, 0x5728, 0x6167, 0x533f, 0x6f64,
+  0x5745, 0x6b62, 0x7c67, 0x6422, 0x6268, 0x6650, 0x7b68, 0x7468,
+  0x6574, 0x743c, 0x7455, 0x5f36, 0x7c39, 0x6e42, 0x4a75, 0x6f65,
+  0x4b62, 0x5424, 0x5e60, 0x5a7d, 0x6446, 0x683e, 0x605e, 0x7634,
+  0x6a52, 0x797b, 0x6042, 0x4a64, 0x6737, 0x6a7d, 0x595d, 0x5a34,
+  0x6e2a, 0x7b69, 0x5b4b, 0x5a35, 0x713e, 0x532c, 0x7b49, 0x5f4f,
+  0x5340, 0x6357, 0x6f66, 0x7c50, 0x6940, 0x7553, 0x6c5c, 0x7737,
+  0x6a38, 0x5179, 0x5c48, 0x6a39, 0x715e, 0x5736, 0x4f35, 0x5928,
+  0x6c6e, 0x5d2a, 0x4d22, 0x682e, 0x613d, 0x7251, 0x6941, 0x527c,
+  0x5b35, 0x7367, 0x587e, 0x7c51, 0x6d32, 0x742f, 0x7b23, 0x7c41,
+  0x6e2b, 0x5425, 0x7472, 0x6e59, 0x7b4a, 0x4d63, 0x583b, 0x655b,
+  0x7877, 0x7654, 0x5729, 0x4b49, 0x6651, 0x704c, 0x582e, 0x7953,
+  0x557e, 0x583c, 0x7230, 0x622b, 0x7368, 0x6f42, 0x6d6c, 0x6738,
+  0x5a7e, 0x4c3e, 0x727c, 0x5a6b, 0x6258, 0x6d56, 0x5651, 0x6033,
+  0x7c52, 0x6b48, 0x5341, 0x704d, 0x4f77, 0x6d52, 0x5458, 0x5c49,
+  0x5771, 0x5f3b, 0x7325, 0x744d, 0x713f, 0x7831, 0x697a, 0x7b4b,
+  0x4a55, 0x7954, 0x774a, 0x5648, 0x7c68, 0x733d, 0x6e7e, 0x677e,
+  0x5342, 0x5336, 0x4c2d, 0x767a, 0x5632, 0x5258, 0x6758, 0x6325,
+  0x6739, 0x702d, 0x7b4c, 0x6b21, 0x5426, 0x7b4d, 0x553d, 0x715f,
+  0x767b, 0x5e34, 0x556b, 0x6548, 0x7b24, 0x5439, 0x5e61, 0x6423,
+  0x5737, 0x786e, 0x5e35, 0x5652, 0x7955, 0x673a, 0x6b55, 0x5577,
+  0x6f67, 0x613e, 0x7a2e, 0x5669, 0x566e, 0x673b, 0x6c4b, 0x5533,
+  0x4e34, 0x7b25, 0x616e, 0x7728, 0x7b4e, 0x583d, 0x7b7d, 0x7c69,
+  0x4f36, 0x6d47, 0x6e2c, 0x4c5d, 0x7627, 0x667a, 0x7524, 0x7d5c,
+  0x6d33, 0x4e49, 0x6f68, 0x613f, 0x7a5b, 0x4b63, 0x7729, 0x7b26,
+  0x5c39, 0x7140, 0x6d48, 0x6f43, 0x562d, 0x7d4e, 0x6821, 0x7b74,
+  0x5527, 0x7176, 0x6653, 0x4c5e, 0x7832, 0x5c6b, 0x7d36, 0x656a,
+  0x7160, 0x5b4c, 0x5d4d, 0x5448, 0x596d, 0x7525, 0x667b, 0x6654,
+  0x7d48, 0x5621, 0x7d3f, 0x7c53, 0x6f21, 0x673c, 0x516e, 0x6655,
+  0x6972, 0x5f30, 0x5860, 0x7c3a, 0x7d2f, 0x704e, 0x5b61, 0x6549,
+  0x6d34, 0x6043, 0x6358, 0x697b, 0x6a28, 0x7d37, 0x7b27, 0x6942,
+  0x7d77, 0x6259, 0x5c6c, 0x6822, 0x6670, 0x7d78, 0x7d79, 0x763f,
+  0x6727, 0x6657, 0x5473, 0x5449, 0x567a, 0x5772, 0x6140, 0x5b62,
+  0x6658, 0x673d, 0x704f, 0x733e, 0x622c, 0x7537, 0x6070, 0x7d38,
+  0x6368, 0x5427, 0x687c, 0x7a52, 0x786f, 0x5653, 0x5534, 0x7050,
+  0x7770, 0x6e33, 0x6a3a, 0x6a53, 0x6d49, 0x5d2b, 0x652c, 0x7d21,
+  0x5f50, 0x6c33, 0x5f51, 0x6d6d, 0x7838, 0x777a, 0x782b, 0x7460,
+  0x543a, 0x6433, 0x695a, 0x5e36, 0x593f, 0x5940, 0x566f, 0x594c,
+  0x5a2a, 0x5f65, 0x7765, 0x4c32, 0x5f79, 0x5760, 0x543b, 0x7d7a,
+  0x4c33, 0x5b73, 0x5f52, 0x4e4a, 0x6e5a, 0x6464, 0x7b4f, 0x4f37,
+  0x6e43, 0x4e6a, 0x622d, 0x5761, 0x7a75, 0x5549, 0x782c, 0x6759,
+  0x7369, 0x586d, 0x6344, 0x7071, 0x6865, 0x607a, 0x6e44, 0x595e,
+  0x6b22, 0x6b23, 0x7c42, 0x6a3b, 0x682b, 0x5e62, 0x6d6f, 0x6823,
+  0x4f71, 0x543c, 0x7c6a, 0x673e, 0x7c72, 0x5634, 0x622e, 0x5337,
+  0x7a4c, 0x7a5c, 0x6d35, 0x6163, 0x682c, 0x685d, 0x6f69, 0x743d,
+  0x4f38, 0x695b, 0x512c, 0x5a47, 0x6b49, 0x684c, 0x5e37, 0x563c,
+  0x5365, 0x7a5d, 0x5a56, 0x4a31, 0x5a48, 0x5f26, 0x7933, 0x7252,
+  0x4a44, 0x4e4b, 0x4d75, 0x7d30, 0x5528, 0x7141, 0x6269, 0x5c4a,
+  0x6c34, 0x7a40, 0x7b28, 0x5028, 0x5a6c, 0x596e, 0x607b, 0x6f6a,
+  0x7a5e, 0x6044, 0x4f39, 0x554a, 0x5762, 0x622f, 0x5738, 0x684d,
+  0x765a, 0x6f22, 0x625a, 0x767c, 0x7b50, 0x512d, 0x4d64, 0x512e,
+  0x5c6d, 0x684e, 0x7079, 0x4e35, 0x667c, 0x577b, 0x5056, 0x5d75,
+  0x7771, 0x767d, 0x5b77, 0x7b6a, 0x695c, 0x5941, 0x7572, 0x6045,
+  0x6a54, 0x7942, 0x6a3c, 0x5245, 0x7b51, 0x6740, 0x6b25, 0x5f7a,
+  0x6322, 0x5739, 0x6943, 0x687d, 0x682f, 0x7253, 0x7b29, 0x5825,
+  0x554b, 0x5048, 0x512f, 0x5763, 0x6046, 0x5622, 0x6d70, 0x5773,
+  0x7c54, 0x5a57, 0x4c5f, 0x7254, 0x5130, 0x4c60, 0x5b7d, 0x733f,
+  0x7051, 0x7c3b, 0x6230, 0x6625, 0x625b, 0x5f5e, 0x6047, 0x726f,
+  0x4c61, 0x566a, 0x6742, 0x4e36, 0x7340, 0x4d7e, 0x7b52, 0x7878,
+  0x777b, 0x683f, 0x6837, 0x6d36, 0x5c3a, 0x4c34, 0x7177, 0x6838,
+  0x4a76, 0x6424, 0x7456, 0x5f66, 0x5f27, 0x5f67, 0x6141, 0x6944,
+  0x5c4b, 0x6945, 0x6f23, 0x6b26, 0x4b23, 0x6369, 0x517b, 0x6f24,
+  0x6f6b, 0x5034, 0x4d23, 0x6866, 0x6f25, 0x534c, 0x5a6d, 0x573a,
+  0x7255, 0x7565, 0x596f, 0x7934, 0x5554, 0x7d4f, 0x5b63, 0x7161,
+  0x6c36, 0x7b7e, 0x5357, 0x5131, 0x4b31, 0x5132, 0x4b32, 0x7142,
+  0x7461, 0x7935, 0x6143, 0x6142, 0x6b77, 0x5f28, 0x4b4a, 0x6639,
+  0x785e, 0x792a, 0x4a77, 0x6d37, 0x5338, 0x7256, 0x5459, 0x6e45,
+  0x7270, 0x4a32, 0x5c3b, 0x7178, 0x6c37, 0x654a, 0x7640, 0x7d5d,
+  0x5463, 0x4c62, 0x7754, 0x5765, 0x5343, 0x5826, 0x7641, 0x5d76,
+  0x4d40, 0x655c, 0x654b, 0x6144, 0x6830, 0x7430, 0x736a, 0x5a6e,
+  0x573b, 0x6231, 0x572a, 0x567b, 0x645f, 0x4a56, 0x6b28, 0x5b7e,
+  0x7642, 0x6f3b, 0x547d, 0x6048, 0x6839, 0x6f26, 0x4d24, 0x5474,
+  0x5b21, 0x5b5c, 0x5b5d, 0x6e5c, 0x4b4b, 0x7c55, 0x4e6b, 0x4d41,
+  0x7b53, 0x792b, 0x7554, 0x5929, 0x695d, 0x5b4d, 0x5d4e, 0x6743,
+  0x6c4c, 0x796c, 0x4b4c, 0x607c, 0x5428, 0x6d53, 0x586f, 0x7257,
+  0x4a78, 0x5a6f, 0x5654, 0x594d, 0x586e, 0x7241, 0x5f53, 0x5a70,
+  0x626a, 0x607d, 0x5878, 0x772f, 0x5a36, 0x4a57, 0x7258, 0x5879,
+  0x7a5f, 0x4f6f, 0x5942, 0x7052, 0x6451, 0x7337, 0x7a60, 0x6f6c,
+  0x6232, 0x543d, 0x594e, 0x7462, 0x5429, 0x4d42, 0x675a, 0x7259,
+  0x592a, 0x583e, 0x5c2d, 0x626b, 0x567c, 0x4a79, 0x545a, 0x7457,
+  0x4c21, 0x4f3a, 0x7538, 0x5943, 0x5068, 0x6345, 0x6b78, 0x7231,
+  0x4f3b, 0x532d, 0x6861, 0x4e6c, 0x6034, 0x5e63, 0x5d77, 0x7232,
+  0x7376, 0x765b, 0x577e, 0x785f, 0x7772, 0x5029, 0x665a, 0x7526,
+  0x573c, 0x4c63, 0x665b, 0x5d5d, 0x5133, 0x6f6d, 0x565e, 0x6474,
+  0x616f, 0x5d78, 0x684f, 0x4a65, 0x5c21, 0x6035, 0x7c2c, 0x7c2d,
+  0x5827, 0x6d38, 0x5b36, 0x5670, 0x732f, 0x4d25, 0x5a71, 0x5828,
+  0x4c64, 0x5134, 0x4a58, 0x5a72, 0x7527, 0x7528, 0x6626, 0x556c,
+  0x5578, 0x5a73, 0x6346, 0x5e64, 0x5e65, 0x5135, 0x5136, 0x5137,
+  0x7233, 0x695e, 0x7053, 0x7234, 0x7054, 0x4b64, 0x7b54, 0x7566,
+  0x636a, 0x5e66, 0x5f54, 0x7879, 0x702e, 0x5138, 0x565f, 0x5057,
+  0x7c21, 0x6f6e, 0x5c58, 0x695f, 0x655d, 0x7d7b, 0x6049, 0x5649,
+  0x542a, 0x654c, 0x6960, 0x5058, 0x7c22, 0x543e, 0x6233, 0x5e67,
+  0x5c3c, 0x5236, 0x7555, 0x4e21, 0x7529, 0x5d79, 0x5d7a, 0x7055,
+  0x765f, 0x725a, 0x646b, 0x7271, 0x6c39, 0x7d7c, 0x612a, 0x4a59,
+  0x6f6f, 0x752a, 0x6c79, 0x782d, 0x7242, 0x7643, 0x5752, 0x7922,
+  0x7056, 0x707a, 0x7660, 0x6973, 0x7243, 0x542b, 0x4a33, 0x4d26,
+  0x4d43, 0x4d5a, 0x594f, 0x7644, 0x6e5d, 0x6744, 0x6234, 0x5f62,
+  0x675b, 0x6831, 0x7c2e, 0x654d, 0x7a6b, 0x4f3c, 0x4f62, 0x4d76,
+  0x6f70, 0x743e, 0x544d, 0x7338, 0x6921, 0x7272, 0x736b, 0x7057,
+  0x4f57, 0x4f5f, 0x6840, 0x6841, 0x4f63, 0x6922, 0x502a, 0x7341,
+  0x502b, 0x5464, 0x6f3c, 0x5821, 0x595f, 0x7357, 0x5c3d, 0x4c65,
+  0x6d71, 0x7162, 0x545b, 0x6235, 0x4a66, 0x532e, 0x4c66, 0x7153,
+  0x7567, 0x4a5a, 0x7b6e, 0x6145, 0x5f69, 0x6e5e, 0x7742, 0x5822,
+  0x5d2c, 0x702f, 0x563d, 0x612b, 0x7936, 0x5475, 0x5049, 0x6f27,
+  0x626c, 0x5b6a, 0x4e4c, 0x7568, 0x7755, 0x534d, 0x737e, 0x5035,
+  0x607e, 0x5f7b, 0x665d, 0x6824, 0x4b4d, 0x6f28, 0x6e34, 0x5a58,
+  0x5139, 0x5f29, 0x7330, 0x4c44, 0x4e37, 0x6f29, 0x5f55, 0x6d57,
+  0x6e46, 0x6f3d, 0x7c56, 0x5b74, 0x6f2a, 0x7839, 0x7569, 0x6359,
+  0x6146, 0x543f, 0x5e68, 0x706a, 0x7342, 0x532f, 0x4a5b, 0x7c57,
+  0x6d58, 0x6147, 0x7458, 0x5633, 0x5d2d, 0x553e, 0x7143, 0x6e5f,
+  0x566b, 0x7459, 0x5766, 0x5a37, 0x5d7b, 0x5d4f, 0x5823, 0x5a59,
+  0x7058, 0x6f44, 0x6158, 0x7154, 0x6d72, 0x555b, 0x555c, 0x7344,
+  0x4b57, 0x6236, 0x6f71, 0x7b55, 0x5358, 0x5d50, 0x7059, 0x4b33,
+  0x555d, 0x4d27, 0x502c, 0x513a, 0x7144, 0x6533, 0x7b75, 0x6961,
+  0x7d60, 0x7c3c, 0x5a22, 0x5a23, 0x5221, 0x526f, 0x626d, 0x5e69,
+  0x4e5c, 0x7235, 0x5064, 0x5d51, 0x6148, 0x5b37, 0x5f63, 0x6d39,
+  0x7145, 0x734f, 0x572b, 0x612c, 0x636b, 0x6e47, 0x6149, 0x4a7a,
+  0x707b, 0x7a61, 0x705a, 0x4c67, 0x5a74, 0x4c3f, 0x4e6d, 0x5529,
+  0x7a62, 0x5065, 0x6b56, 0x6c5f, 0x5f7c, 0x7756, 0x5e6a, 0x4b34,
+  0x6f3e, 0x4c35, 0x4f3d, 0x6f72, 0x6237, 0x4c68, 0x707c, 0x5660,
+  0x7146, 0x6238, 0x6b2b, 0x4b35, 0x5851, 0x744e, 0x7377, 0x5746,
+  0x513b, 0x772a, 0x6d4a, 0x5753, 0x587a, 0x7645, 0x514c, 0x5d7c,
+  0x5f7d, 0x7965, 0x604a, 0x727d, 0x5330, 0x7473, 0x5a49, 0x665e,
+  0x783a, 0x6850, 0x587b, 0x6a55, 0x5623, 0x7646, 0x725b, 0x647c,
+  0x6832, 0x5a5a, 0x725c, 0x7b56, 0x6932, 0x6e2d, 0x7a63, 0x5c6e,
+  0x756a, 0x6660, 0x707d, 0x572c, 0x7545, 0x6e60, 0x5b65, 0x5d5e,
+  0x5970, 0x6923, 0x7179, 0x7244, 0x604b, 0x6924, 0x6239, 0x6331,
+  0x7c6b, 0x4d28, 0x4c36, 0x705b, 0x663a, 0x4d29, 0x7343, 0x6159,
+  0x6f2b, 0x6745, 0x6069, 0x7345, 0x5440, 0x553f, 0x5d2e, 0x797c,
+  0x4c40, 0x6522, 0x4e38, 0x5852, 0x7956, 0x712a, 0x4e51, 0x7647,
+  0x5b6b, 0x5f7e, 0x5861, 0x7773, 0x5767, 0x547e, 0x513c, 0x654f,
+  0x4b36, 0x5a38, 0x4d44, 0x563e, 0x623a, 0x4f58, 0x604c, 0x6b79,
+  0x7d7d, 0x5768, 0x4b58, 0x6962, 0x683a, 0x6347, 0x6c4d, 0x6c4e,
+  0x563f, 0x6327, 0x5f56, 0x7d68, 0x6e61, 0x7628, 0x5d7d, 0x783b,
+  0x6851, 0x7957, 0x4e6e, 0x6c4f, 0x6925, 0x5655, 0x4d45, 0x6d3a,
+  0x513d, 0x4f3e, 0x6c3b, 0x5231, 0x4c69, 0x5944, 0x697c, 0x513e,
+  0x6c3c, 0x652d, 0x7730, 0x4c6a, 0x5344, 0x5640, 0x567d, 0x6121,
+  0x5e3d, 0x7629, 0x5a24, 0x5624, 0x7546, 0x6122, 0x6946, 0x7245,
+  0x7469, 0x566c, 0x6b53, 0x6c3d, 0x625c, 0x5e6b, 0x705c, 0x6b3f,
+  0x574e, 0x513f, 0x752b, 0x797d, 0x4a5c, 0x4d46, 0x7236, 0x5d7e,
+  0x4c37, 0x5b38, 0x5069, 0x4e5d, 0x6b40, 0x7d22, 0x784b, 0x6a56,
+  0x7130, 0x5b4e, 0x7743, 0x5b4f, 0x4b24, 0x7860, 0x7b57, 0x6b4a,
+  0x6021, 0x4e4d, 0x545c, 0x7d58, 0x5276, 0x7237, 0x7a76, 0x762a,
+  0x7a77, 0x5866, 0x7431, 0x6852, 0x4a45, 0x4c6b, 0x626e, 0x623b,
+  0x772d, 0x7861, 0x736c, 0x5e21, 0x647d, 0x636c, 0x5d2f, 0x5d30,
+  0x4b37, 0x6853, 0x6123, 0x5260, 0x707e, 0x6926, 0x4b72, 0x6d73,
+  0x5c59, 0x604d, 0x775a, 0x5b39, 0x4c2e, 0x5a5b, 0x4d47, 0x5d31,
+  0x582f, 0x6323, 0x4e6f, 0x7273, 0x7833, 0x604e, 0x757d, 0x6b6c,
+  0x5345, 0x7c6c, 0x525b, 0x546b, 0x5e22, 0x6566, 0x7030, 0x5544,
+  0x6d74, 0x636d, 0x6842, 0x6d75, 0x577c, 0x6d3b, 0x762b, 0x7238,
+  0x7648, 0x5366, 0x725d, 0x4f3f, 0x6b2c, 0x4f40, 0x6628, 0x7d69,
+  0x4f41, 0x605f, 0x5e6c, 0x6022, 0x743f, 0x626f, 0x5971, 0x7147,
+  0x4b38, 0x797e, 0x5b3a, 0x5a75, 0x766c, 0x5a5c, 0x7a64, 0x604f,
+  0x5d32, 0x6629, 0x6f73, 0x736d, 0x6b7a, 0x7966, 0x4a5d, 0x555e,
+  0x4a5e, 0x5f64, 0x667d, 0x752c, 0x6475, 0x6963, 0x6d4b, 0x4f64,
+  0x5853, 0x5d33, 0x546c, 0x7239, 0x5f37, 0x4b4e, 0x7b58, 0x5059,
+  0x5d52, 0x7774, 0x675c, 0x6425, 0x7c23, 0x5b3b, 0x723a, 0x697d,
+  0x504a, 0x7556, 0x5945, 0x6434, 0x6d27, 0x6a3d, 0x667e, 0x7744,
+  0x752d, 0x5960, 0x4a34, 0x7862, 0x4f42, 0x6c3e, 0x6534, 0x4d48,
+  0x6e48, 0x6748, 0x4d49, 0x7937, 0x7168, 0x5972, 0x5b75, 0x4a35,
+  0x5946, 0x5849, 0x592b, 0x6d3c, 0x5854, 0x5c5a, 0x623c, 0x7c6d,
+  0x6c60, 0x527e, 0x6947, 0x662a, 0x6270, 0x7a3b, 0x752e, 0x7b2a,
+  0x6c7b, 0x6c3f, 0x7c58, 0x5465, 0x7943, 0x6e62, 0x5769, 0x6d76,
+  0x5e6d, 0x4c6c, 0x636e, 0x6854, 0x7a78, 0x5d34, 0x6435, 0x5830,
+  0x5855, 0x746a, 0x4e39, 0x5661, 0x4f52, 0x5036, 0x4e22, 0x736e,
+  0x7378, 0x5c4c, 0x504b, 0x7c24, 0x4d4a, 0x5754, 0x5e23, 0x6460,
+  0x6e49, 0x625d, 0x757e, 0x542c, 0x5551, 0x5870, 0x7843, 0x6a57,
+  0x7557, 0x583f, 0x7d40, 0x6b2d, 0x552a, 0x6728, 0x6e4a, 0x4a67,
+  0x7863, 0x545d, 0x6a58, 0x7b59, 0x6d77, 0x6535, 0x502d, 0x7171,
+  0x623d, 0x6348, 0x5955, 0x5f2a, 0x5b3c, 0x7864, 0x717a, 0x6536,
+  0x736f, 0x7b5a, 0x6160, 0x592c, 0x756b, 0x6036, 0x6948, 0x4b4f,
+  0x6349, 0x5e6e, 0x623e, 0x5c6f, 0x5625, 0x6271, 0x567e, 0x5921,
+  0x5840, 0x5c5b, 0x6d3d, 0x5f38, 0x6a25, 0x572d, 0x7379, 0x6d78,
+  0x7547, 0x614a, 0x6b63, 0x725e, 0x784c, 0x6a59, 0x5346, 0x5b66,
+  0x752f, 0x4e70, 0x697e, 0x7b36, 0x6272, 0x4f72, 0x7739, 0x5973,
+  0x614b, 0x5a5d, 0x5a39, 0x6b7b, 0x4b39, 0x6d79, 0x6060, 0x7440,
+  0x7d3c, 0x5f31, 0x636f, 0x6023, 0x7d39, 0x7031, 0x4d4b, 0x6d3e,
+  0x5540, 0x6370, 0x6d7a, 0x6964, 0x556d, 0x675d, 0x5476, 0x6537,
+  0x5b67, 0x623f, 0x6e4b, 0x5774, 0x705d, 0x4e2b, 0x675e, 0x5656,
+  0x614c, 0x6833, 0x656e, 0x5c22, 0x6050, 0x5535, 0x5521, 0x7b5b,
+  0x794b, 0x4b73, 0x7425, 0x7a48, 0x5657, 0x6965, 0x7b5c, 0x7d50,
+  0x7b76, 0x5a25, 0x5b3d, 0x6c62, 0x4d77, 0x705e, 0x7649, 0x5e6f,
+  0x5331, 0x7c6e, 0x6843, 0x7148, 0x4e71, 0x796d, 0x7274, 0x6436,
+  0x7539, 0x5c70, 0x6371, 0x6825, 0x723b, 0x5e24, 0x5a4c, 0x4a69,
+  0x635a, 0x7c59, 0x6a5a, 0x7944, 0x6324, 0x7b5d, 0x6f4a, 0x6844,
+  0x554c, 0x6b57, 0x592d, 0x7b2b, 0x5359, 0x5522, 0x765e, 0x5a76,
+  0x6051, 0x6928, 0x7579, 0x7a2f, 0x6b7c, 0x606a, 0x6332, 0x5545,
+  0x7163, 0x556e, 0x4d4c, 0x6d59, 0x5841, 0x7a6c, 0x716b, 0x7a3c,
+  0x6662, 0x7a65, 0x627a, 0x4a36, 0x6437, 0x6a5b, 0x757a, 0x7b2c,
+  0x4f43, 0x6b7d, 0x787a, 0x5f39, 0x6171, 0x5224, 0x757b, 0x505a,
+  0x505b, 0x6a3e, 0x5931, 0x4a37, 0x5367, 0x7865, 0x5332, 0x6240,
+  0x725f, 0x4d65, 0x792c, 0x4d4d, 0x6e2e, 0x562e, 0x576a, 0x6760,
+  0x6b2e, 0x4f59, 0x5c4d, 0x6d7b, 0x5e70, 0x576b, 0x5e25, 0x5f57,
+  0x5b50, 0x5b51, 0x5523, 0x7032, 0x5c5c, 0x4a68, 0x7866, 0x5c4e,
+  0x6a5c, 0x5b52, 0x6933, 0x775b, 0x6328, 0x572e, 0x6061, 0x4b3a,
+  0x6551, 0x505c, 0x5541, 0x584a, 0x6329, 0x6024, 0x6929, 0x5347,
+  0x5c5d, 0x782e, 0x4c38, 0x502e, 0x5872, 0x634a, 0x4c2f, 0x542d,
+  0x7651, 0x504c, 0x4a46, 0x5542, 0x4e3a, 0x4a47, 0x7a30, 0x5f58,
+  0x753a, 0x656b, 0x6f74, 0x5d35, 0x4d2a, 0x6372, 0x7b77, 0x7750,
+  0x7d3a, 0x7d61, 0x767e, 0x5140, 0x6845, 0x6438, 0x6168, 0x4c41,
+  0x526d, 0x5b3e, 0x6062, 0x7a49, 0x614d, 0x4a38, 0x7260, 0x7149,
+  0x5e71, 0x705f, 0x7844, 0x6e4c, 0x5e72, 0x6749, 0x6273, 0x6761,
+  0x634b, 0x634c, 0x4f78, 0x6f2c, 0x7d7e, 0x7c25, 0x7a31, 0x5f59,
+  0x6052, 0x745a, 0x714a, 0x4e23, 0x723c, 0x6c63, 0x6025, 0x772b,
+  0x6b2f, 0x655e, 0x6124, 0x4d2b, 0x5974, 0x6826, 0x4d4e, 0x6169,
+  0x7c6f, 0x6063, 0x6241, 0x4e24, 0x5e26, 0x6b7e, 0x6b5d, 0x7060,
+  0x745b, 0x6274, 0x5348, 0x746b, 0x6e35, 0x7558, 0x555f, 0x5665,
+  0x6b30, 0x7463, 0x634d, 0x7474, 0x7a32, 0x6f75, 0x4a5f, 0x6b31,
+  0x6d3f, 0x7d49, 0x6426, 0x7924, 0x7033, 0x656c, 0x5167, 0x5947,
+  0x6457, 0x6a5d, 0x5477, 0x5a3a, 0x5a4d, 0x794c, 0x615a, 0x5b3f,
+  0x4c45, 0x6c50, 0x4b3b, 0x5e73, 0x692a, 0x5948, 0x6e63, 0x573d,
+  0x4f44, 0x504d, 0x7c26, 0x717b, 0x7d52, 0x5141, 0x635b, 0x5349,
+  0x5c4f, 0x4c6d, 0x5e27, 0x663b, 0x6c21, 0x4c39, 0x7b5e, 0x6762,
+  0x5441, 0x5c28, 0x6242, 0x7358, 0x6553, 0x7359, 0x7346, 0x4d5b,
+  0x4d2c, 0x7c43, 0x5467, 0x5142, 0x7925, 0x6855, 0x634e, 0x544a,
+  0x5f5a, 0x7b5f, 0x6763, 0x787b, 0x634f, 0x7530, 0x5867, 0x5949,
+  0x782f, 0x6f76, 0x5d36, 0x6e2f, 0x4d78, 0x5e38, 0x7c27, 0x777c,
+  0x7731, 0x4e3b, 0x7421, 0x6e4d, 0x612e, 0x6c43, 0x4f7e, 0x783f,
+  0x5862, 0x5368, 0x5e28, 0x7464, 0x6c42, 0x5975, 0x7945, 0x5d53,
+  0x5671, 0x6c7c, 0x7c70, 0x6d40, 0x4a39, 0x6e64, 0x7261, 0x5e39,
+  0x5672, 0x5e74, 0x5f5b, 0x5b53, 0x7a67, 0x5863, 0x7441, 0x5d37,
+  0x7275, 0x542e, 0x5673, 0x5d38, 0x4f45, 0x5f5f, 0x723e, 0x7621,
+  0x6b4b, 0x717c, 0x7347, 0x606b, 0x6d7c, 0x615b, 0x6e65, 0x5e75,
+  0x7a53, 0x714b, 0x502f, 0x5d39, 0x5143, 0x7531, 0x6a46, 0x7061,
+  0x762c, 0x7559, 0x706b, 0x5d3a, 0x723f, 0x7745, 0x5b22, 0x7276,
+  0x4a3a, 0x7775, 0x4b65, 0x6e66, 0x6053, 0x4e25, 0x5658, 0x542f,
+  0x6949, 0x534e, 0x7442, 0x4b66, 0x7121, 0x6b32, 0x7122, 0x6b33,
+  0x7034, 0x4b74, 0x5430, 0x7332, 0x7b37, 0x756c, 0x6e67, 0x7432,
+  0x756d, 0x4f73, 0x7062, 0x6e4e, 0x714c, 0x6538, 0x5775, 0x6373,
+  0x4f65, 0x4f46, 0x7333, 0x6458, 0x4f79, 0x4f5a, 0x7a4d, 0x6663,
+  0x7262, 0x756e, 0x4a3b, 0x635c, 0x4e72, 0x5659, 0x6e30, 0x7465,
+  0x5842, 0x5c50, 0x4c6e, 0x5560, 0x764a, 0x7d4a, 0x5856, 0x744f,
+  0x5626, 0x5c3e, 0x5b54, 0x5747, 0x727e, 0x714d, 0x6243, 0x5c5e,
+  0x5c5f, 0x6f2d, 0x662b, 0x795d, 0x6a3f, 0x6f2e, 0x7450, 0x4e73,
+  0x662c, 0x4e5e, 0x5579, 0x6374, 0x4d50, 0x5538, 0x777d, 0x5c29,
+  0x5e76, 0x5c2a, 0x7263, 0x6934, 0x525c, 0x6966, 0x6376, 0x674a,
+  0x504e, 0x5a77, 0x4a3c, 0x6e68, 0x5a5e, 0x7277, 0x627b, 0x4c26,
+  0x5a3b, 0x6e69, 0x755a, 0x775c, 0x616a, 0x4e41, 0x5431, 0x7d31,
+  0x663d, 0x7b2d, 0x7867, 0x614e, 0x7762, 0x756f, 0x4f47, 0x5432,
+  0x4c6f, 0x5468, 0x6e4f, 0x7757, 0x6026, 0x5641, 0x615c, 0x7063,
+  0x7164, 0x5c71, 0x5627, 0x7475, 0x714e, 0x7264, 0x5030, 0x6c6f,
+  0x793a, 0x6b35, 0x546d, 0x6244, 0x6967, 0x6b34, 0x6a21, 0x783c,
+  0x4e26, 0x7946, 0x7c5a, 0x5433, 0x5339, 0x6a5e, 0x692b, 0x6161,
+  0x534f, 0x7476, 0x6a40, 0x614f, 0x4c3a, 0x6e6a, 0x7064, 0x7334,
+  0x546e, 0x7240, 0x7165, 0x7443, 0x6054, 0x6b36, 0x5721, 0x4b68,
+  0x792d, 0x692d, 0x5864, 0x7a33, 0x6245, 0x7c3d, 0x6c44, 0x5831,
+  0x5c2b, 0x5524, 0x6b69, 0x683b, 0x5857, 0x7b2e, 0x5161, 0x5b40,
+  0x753e, 0x5e77, 0x4a7b, 0x7746, 0x4f48, 0x6150, 0x6e50, 0x6974,
+  0x4e74, 0x554d, 0x4f5b, 0x5d3b, 0x4e2c, 0x6968, 0x5434, 0x6447,
+  0x755b, 0x7a41, 0x5e29, 0x5478, 0x6f77, 0x5333, 0x6b37, 0x6f78,
+  0x755c, 0x6d4c, 0x5b55, 0x714f, 0x7150, 0x7532, 0x592e, 0x552c,
+  0x6246, 0x7d23, 0x7b65, 0x5f2b, 0x6275, 0x762d, 0x7533, 0x7035,
+  0x6125, 0x755d, 0x6c22, 0x6d7d, 0x7534, 0x7b38, 0x5b23, 0x564a,
+  0x4b59, 0x6554, 0x737a, 0x6b38, 0x6037, 0x576c, 0x716c, 0x652f,
+  0x5561, 0x576d, 0x5151, 0x6172, 0x6f79, 0x5d3c, 0x765c, 0x7065,
+  0x7444, 0x6969, 0x737b, 0x546f, 0x4c22, 0x777e, 0x5f3c, 0x6b4d,
+  0x5037, 0x5642, 0x682d, 0x6f2f, 0x4b25, 0x4b69, 0x7a68, 0x4c46,
+  0x6667, 0x6a47, 0x5b24, 0x4f49, 0x627c, 0x6f7a, 0x6b5e, 0x7548,
+  0x545e, 0x6055, 0x6f30, 0x6247, 0x592f, 0x7967, 0x6765, 0x4f4a,
+  0x6151, 0x6248, 0x6f7b, 0x7a79, 0x5c72, 0x6027, 0x7868, 0x4b6a,
+  0x4b3c, 0x5662, 0x755e, 0x755f, 0x6e36, 0x6276, 0x534a, 0x6f7c,
+  0x5144, 0x6f31, 0x5145, 0x505e, 0x5961, 0x6038, 0x4d51, 0x7339,
+  0x674c, 0x5628, 0x4e27, 0x5435, 0x6448, 0x5334, 0x6b39, 0x4b75,
+  0x765d, 0x7123, 0x4c47, 0x694a, 0x6170, 0x7560, 0x7b2f, 0x4b51,
+  0x7b60, 0x7265, 0x6c70, 0x706c, 0x6e6b, 0x694b, 0x4c70, 0x572f,
+  0x7321, 0x7c75, 0x7124, 0x6056, 0x6f32, 0x7451, 0x7721, 0x7151,
+  0x4a7c, 0x4a7d, 0x4e4e, 0x7348, 0x733a, 0x6d7e, 0x5a26, 0x606c,
+  0x784d, 0x4b52, 0x6b4e, 0x7958, 0x7959, 0x4a60, 0x5a4a, 0x4b26,
+  0x4a48, 0x796e, 0x5b6c, 0x5031, 0x556f, 0x6673, 0x6722, 0x6459,
+  0x6461, 0x7c44, 0x796f, 0x4f74, 0x7766, 0x4e3c, 0x7445, 0x5c23,
+  0x5d3d, 0x7446, 0x7821, 0x6856, 0x5b41, 0x7066, 0x6439, 0x766d,
+  0x792e, 0x5d3e, 0x5730, 0x5868, 0x4b3d, 0x795a, 0x784e, 0x7970,
+  0x606d, 0x6333, 0x7433, 0x6a42, 0x7266, 0x7036, 0x5b56, 0x6b64,
+  0x7267, 0x5755, 0x5436, 0x7968, 0x5741, 0x6555, 0x696a, 0x574c,
+  0x5369, 0x6249, 0x7c5b, 0x4d2d, 0x4c30, 0x6a22, 0x6476, 0x5040,
+  0x7037, 0x6e21, 0x5776, 0x624a, 0x624b, 0x7a4f, 0x6b5f, 0x564b,
+  0x7434, 0x6d4d, 0x6452, 0x6a29, 0x643a, 0x7322, 0x4d52, 0x764b,
+  0x7166, 0x6d41, 0x683c, 0x6e51, 0x7067, 0x624c, 0x642a, 0x7561,
+  0x6d5a, 0x576e, 0x5171, 0x696b, 0x696c, 0x6064, 0x5a27, 0x5d54,
+  0x6a23, 0x5643, 0x5674, 0x5a5f, 0x6f33, 0x624d, 0x6f7d, 0x7268,
+  0x6f45, 0x6767, 0x577d, 0x674e, 0x5f5c, 0x7947, 0x5976, 0x5f2c,
+  0x565a, 0x5c24, 0x7038, 0x557a, 0x6477, 0x5644, 0x746c, 0x6f7e,
+  0x7021, 0x5e2a, 0x5a3c, 0x587c, 0x7a54, 0x6c65, 0x7c28, 0x6c66,
+  0x584b, 0x7b39, 0x6453, 0x4d79, 0x4f53, 0x4a6a, 0x4f54, 0x783d,
+  0x7447, 0x6a5f, 0x795b, 0x5437, 0x6b65, 0x6152, 0x6a24, 0x7a42,
+  0x7b61, 0x7a6d, 0x7022, 0x4c71, 0x7a23, 0x6277, 0x624e, 0x6975,
+  0x616b, 0x6768, 0x6857, 0x5a78, 0x544b, 0x7776, 0x5645, 0x5469,
+  0x7a7a, 0x4c72, 0x775d, 0x5e3a, 0x4e28, 0x7039, 0x647e, 0x6449,
+  0x6454, 0x6a43, 0x6f34, 0x573e, 0x7b62, 0x4d53, 0x6f35, 0x7a69,
+  0x7926, 0x5f3d, 0x7747, 0x787d, 0x787c, 0x5e2b, 0x5b68, 0x635d,
+  0x6162, 0x5146, 0x7650, 0x6b66, 0x5a79, 0x6c47, 0x5e78, 0x7869,
+  0x635e, 0x4e75, 0x7a43, 0x6557, 0x6c48, 0x7349, 0x643b, 0x662e,
+  0x6f36, 0x5c3f, 0x4e3d, 0x5843, 0x504f, 0x4f7a, 0x734a, 0x6057,
+  0x5147, 0x692e, 0x683d, 0x7a44, 0x624f, 0x7a45, 0x7938, 0x5c60,
+  0x7b30, 0x5829, 0x655f, 0x7927, 0x766e, 0x764c, 0x6278, 0x6c71,
+  0x5a60, 0x7152, 0x524c, 0x4f4b, 0x4a3d, 0x5d3f, 0x766f, 0x5e79,
+  0x7a34, 0x552d, 0x7167, 0x5e3e, 0x5c40, 0x5148, 0x5149, 0x783e,
+  0x4b76, 0x5479, 0x7562, 0x6153, 0x5869, 0x787e, 0x4f4c, 0x7d24,
+  0x4e76, 0x7a50, 0x4c73, 0x663e, 0x762e, 0x5570, 0x514a, 0x7c3e,
+  0x5571, 0x4d69, 0x7a35, 0x6250, 0x7477, 0x4d54, 0x6723, 0x5b25,
+  0x6251, 0x5722, 0x7763, 0x6a26, 0x5021, 0x4e5a, 0x7b6b, 0x5b26,
+  0x5b5e, 0x5865, 0x6a60, 0x582a, 0x6560, 0x565b, 0x6f46, 0x786a,
+  0x6455, 0x4e77, 0x6058, 0x576f, 0x746d, 0x4d66, 0x4c74, 0x7563,
+  0x644a, 0x5c61, 0x7948, 0x7c3f, 0x6827, 0x5844, 0x4b3e, 0x5c2e,
+  0x5777, 0x7068, 0x5d40, 0x4f4d, 0x5c73, 0x5930, 0x6669, 0x643c,
+  0x6a44, 0x646c, 0x6465, 0x7b78, 0x4c3b, 0x643d, 0x4d5c, 0x5977,
+  0x5d5f, 0x6d4e, 0x5950, 0x6523, 0x794d, 0x4d2e, 0x4f4e, 0x762f,
+  0x7d53, 0x6b6d, 0x565c, 0x6524, 0x5536, 0x565d, 0x7969, 0x6724,
+  0x5663, 0x514b, 0x5664, 0x5572, 0x5e7a, 0x5778, 0x586a, 0x4f55,
+  0x587d, 0x582b, 0x7d4b, 0x7c5c, 0x6028, 0x5573, 0x7d59, 0x4c23,
+  0x5979, 0x536a, 0x7575, 0x6f47, 0x535a, 0x5a3d, 0x6828, 0x5c2f,
+  0x7023, 0x4d55, 0x6029, 0x5e2c, 0x703a, 0x6e31, 0x6e32, 0x764d,
+  0x6e52, 0x5646, 0x6065, 0x733b, 0x6561, 0x644b, 0x5723, 0x5b42,
+  0x4a7e, 0x4f4f, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026,
+  0x3027, 0x3028, 0x3029, 0x302a, 0x302b, 0x302c, 0x302d, 0x302e,
+  0x302f, 0x3030, 0x3031, 0x3032, 0x3033, 0x3034, 0x3035, 0x3036,
+  0x3037, 0x3038, 0x3039, 0x303a, 0x303b, 0x303c, 0x303d, 0x303e,
+  0x303f, 0x3040, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046,
+  0x3047, 0x3048, 0x3049, 0x304a, 0x304b, 0x304c, 0x304d, 0x304e,
+  0x304f, 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056,
+  0x3057, 0x3058, 0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e,
+  0x305f, 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066,
+  0x3067, 0x3068, 0x3069, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e,
+  0x306f, 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076,
+  0x3077, 0x3078, 0x3079, 0x307a, 0x307b, 0x307c, 0x307d, 0x307e,
+  0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127, 0x3128,
+  0x3129, 0x312a, 0x312b, 0x312c, 0x312d, 0x312e, 0x312f, 0x3130,
+  0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3138,
+  0x3139, 0x313a, 0x313b, 0x313c, 0x313d, 0x313e, 0x313f, 0x3140,
+  0x3141, 0x3142, 0x3143, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148,
+  0x3149, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e, 0x314f, 0x3150,
+  0x3151, 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158,
+  0x3159, 0x315a, 0x315b, 0x315c, 0x315d, 0x315e, 0x315f, 0x3160,
+  0x3161, 0x3162, 0x3163, 0x3164, 0x3165, 0x3166, 0x3167, 0x3168,
+  0x3169, 0x316a, 0x316b, 0x316c, 0x316d, 0x316e, 0x316f, 0x3170,
+  0x3171, 0x3172, 0x3173, 0x3174, 0x3175, 0x3176, 0x3177, 0x3178,
+  0x3179, 0x317a, 0x317b, 0x317c, 0x317d, 0x317e, 0x3221, 0x3222,
+  0x3223, 0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229, 0x322a,
+  0x322b, 0x322c, 0x322d, 0x322e, 0x322f, 0x3230, 0x3231, 0x3232,
+  0x3233, 0x3234, 0x3235, 0x3236, 0x3237, 0x3238, 0x3239, 0x323a,
+  0x323b, 0x323c, 0x323d, 0x323e, 0x323f, 0x3240, 0x3241, 0x3242,
+  0x3243, 0x3244, 0x3245, 0x3246, 0x3247, 0x3248, 0x3249, 0x324a,
+  0x324b, 0x324c, 0x324d, 0x324e, 0x324f, 0x3250, 0x3251, 0x3252,
+  0x3253, 0x3254, 0x3255, 0x3256, 0x3257, 0x3258, 0x3259, 0x325a,
+  0x325b, 0x325c, 0x325d, 0x325e, 0x325f, 0x3260, 0x3261, 0x3262,
+  0x3263, 0x3264, 0x3265, 0x3266, 0x3267, 0x3268, 0x3269, 0x326a,
+  0x326b, 0x326c, 0x326d, 0x326e, 0x326f, 0x3270, 0x3271, 0x3272,
+  0x3273, 0x3274, 0x3275, 0x3276, 0x3277, 0x3278, 0x3279, 0x327a,
+  0x327b, 0x327c, 0x327d, 0x327e, 0x3321, 0x3322, 0x3323, 0x3324,
+  0x3325, 0x3326, 0x3327, 0x3328, 0x3329, 0x332a, 0x332b, 0x332c,
+  0x332d, 0x332e, 0x332f, 0x3330, 0x3331, 0x3332, 0x3333, 0x3334,
+  0x3335, 0x3336, 0x3337, 0x3338, 0x3339, 0x333a, 0x333b, 0x333c,
+  0x333d, 0x333e, 0x333f, 0x3340, 0x3341, 0x3342, 0x3343, 0x3344,
+  0x3345, 0x3346, 0x3347, 0x3348, 0x3349, 0x334a, 0x334b, 0x334c,
+  0x334d, 0x334e, 0x334f, 0x3350, 0x3351, 0x3352, 0x3353, 0x3354,
+  0x3355, 0x3356, 0x3357, 0x3358, 0x3359, 0x335a, 0x335b, 0x335c,
+  0x335d, 0x335e, 0x335f, 0x3360, 0x3361, 0x3362, 0x3363, 0x3364,
+  0x3365, 0x3366, 0x3367, 0x3368, 0x3369, 0x336a, 0x336b, 0x336c,
+  0x336d, 0x336e, 0x336f, 0x3370, 0x3371, 0x3372, 0x3373, 0x3374,
+  0x3375, 0x3376, 0x3377, 0x3378, 0x3379, 0x337a, 0x337b, 0x337c,
+  0x337d, 0x337e, 0x3421, 0x3422, 0x3423, 0x3424, 0x3425, 0x3426,
+  0x3427, 0x3428, 0x3429, 0x342a, 0x342b, 0x342c, 0x342d, 0x342e,
+  0x342f, 0x3430, 0x3431, 0x3432, 0x3433, 0x3434, 0x3435, 0x3436,
+  0x3437, 0x3438, 0x3439, 0x343a, 0x343b, 0x343c, 0x343d, 0x343e,
+  0x343f, 0x3440, 0x3441, 0x3442, 0x3443, 0x3444, 0x3445, 0x3446,
+  0x3447, 0x3448, 0x3449, 0x344a, 0x344b, 0x344c, 0x344d, 0x344e,
+  0x344f, 0x3450, 0x3451, 0x3452, 0x3453, 0x3454, 0x3455, 0x3456,
+  0x3457, 0x3458, 0x3459, 0x345a, 0x345b, 0x345c, 0x345d, 0x345e,
+  0x345f, 0x3460, 0x3461, 0x3462, 0x3463, 0x3464, 0x3465, 0x3466,
+  0x3467, 0x3468, 0x3469, 0x346a, 0x346b, 0x346c, 0x346d, 0x346e,
+  0x346f, 0x3470, 0x3471, 0x3472, 0x3473, 0x3474, 0x3475, 0x3476,
+  0x3477, 0x3478, 0x3479, 0x347a, 0x347b, 0x347c, 0x347d, 0x347e,
+  0x3521, 0x3522, 0x3523, 0x3524, 0x3525, 0x3526, 0x3527, 0x3528,
+  0x3529, 0x352a, 0x352b, 0x352c, 0x352d, 0x352e, 0x352f, 0x3530,
+  0x3531, 0x3532, 0x3533, 0x3534, 0x3535, 0x3536, 0x3537, 0x3538,
+  0x3539, 0x353a, 0x353b, 0x353c, 0x353d, 0x353e, 0x353f, 0x3540,
+  0x3541, 0x3542, 0x3543, 0x3544, 0x3545, 0x3546, 0x3547, 0x3548,
+  0x3549, 0x354a, 0x354b, 0x354c, 0x354d, 0x354e, 0x354f, 0x3550,
+  0x3551, 0x3552, 0x3553, 0x3554, 0x3555, 0x3556, 0x3557, 0x3558,
+  0x3559, 0x355a, 0x355b, 0x355c, 0x355d, 0x355e, 0x355f, 0x3560,
+  0x3561, 0x3562, 0x3563, 0x3564, 0x3565, 0x3566, 0x3567, 0x3568,
+  0x3569, 0x356a, 0x356b, 0x356c, 0x356d, 0x356e, 0x356f, 0x3570,
+  0x3571, 0x3572, 0x3573, 0x3574, 0x3575, 0x3576, 0x3577, 0x3578,
+  0x3579, 0x357a, 0x357b, 0x357c, 0x357d, 0x357e, 0x3621, 0x3622,
+  0x3623, 0x3624, 0x3625, 0x3626, 0x3627, 0x3628, 0x3629, 0x362a,
+  0x362b, 0x362c, 0x362d, 0x362e, 0x362f, 0x3630, 0x3631, 0x3632,
+  0x3633, 0x3634, 0x3635, 0x3636, 0x3637, 0x3638, 0x3639, 0x363a,
+  0x363b, 0x363c, 0x363d, 0x363e, 0x363f, 0x3640, 0x3641, 0x3642,
+  0x3643, 0x3644, 0x3645, 0x3646, 0x3647, 0x3648, 0x3649, 0x364a,
+  0x364b, 0x364c, 0x364d, 0x364e, 0x364f, 0x3650, 0x3651, 0x3652,
+  0x3653, 0x3654, 0x3655, 0x3656, 0x3657, 0x3658, 0x3659, 0x365a,
+  0x365b, 0x365c, 0x365d, 0x365e, 0x365f, 0x3660, 0x3661, 0x3662,
+  0x3663, 0x3664, 0x3665, 0x3666, 0x3667, 0x3668, 0x3669, 0x366a,
+  0x366b, 0x366c, 0x366d, 0x366e, 0x366f, 0x3670, 0x3671, 0x3672,
+  0x3673, 0x3674, 0x3675, 0x3676, 0x3677, 0x3678, 0x3679, 0x367a,
+  0x367b, 0x367c, 0x367d, 0x367e, 0x3721, 0x3722, 0x3723, 0x3724,
+  0x3725, 0x3726, 0x3727, 0x3728, 0x3729, 0x372a, 0x372b, 0x372c,
+  0x372d, 0x372e, 0x372f, 0x3730, 0x3731, 0x3732, 0x3733, 0x3734,
+  0x3735, 0x3736, 0x3737, 0x3738, 0x3739, 0x373a, 0x373b, 0x373c,
+  0x373d, 0x373e, 0x373f, 0x3740, 0x3741, 0x3742, 0x3743, 0x3744,
+  0x3745, 0x3746, 0x3747, 0x3748, 0x3749, 0x374a, 0x374b, 0x374c,
+  0x374d, 0x374e, 0x374f, 0x3750, 0x3751, 0x3752, 0x3753, 0x3754,
+  0x3755, 0x3756, 0x3757, 0x3758, 0x3759, 0x375a, 0x375b, 0x375c,
+  0x375d, 0x375e, 0x375f, 0x3760, 0x3761, 0x3762, 0x3763, 0x3764,
+  0x3765, 0x3766, 0x3767, 0x3768, 0x3769, 0x376a, 0x376b, 0x376c,
+  0x376d, 0x376e, 0x376f, 0x3770, 0x3771, 0x3772, 0x3773, 0x3774,
+  0x3775, 0x3776, 0x3777, 0x3778, 0x3779, 0x377a, 0x377b, 0x377c,
+  0x377d, 0x377e, 0x3821, 0x3822, 0x3823, 0x3824, 0x3825, 0x3826,
+  0x3827, 0x3828, 0x3829, 0x382a, 0x382b, 0x382c, 0x382d, 0x382e,
+  0x382f, 0x3830, 0x3831, 0x3832, 0x3833, 0x3834, 0x3835, 0x3836,
+  0x3837, 0x3838, 0x3839, 0x383a, 0x383b, 0x383c, 0x383d, 0x383e,
+  0x383f, 0x3840, 0x3841, 0x3842, 0x3843, 0x3844, 0x3845, 0x3846,
+  0x3847, 0x3848, 0x3849, 0x384a, 0x384b, 0x384c, 0x384d, 0x384e,
+  0x384f, 0x3850, 0x3851, 0x3852, 0x3853, 0x3854, 0x3855, 0x3856,
+  0x3857, 0x3858, 0x3859, 0x385a, 0x385b, 0x385c, 0x385d, 0x385e,
+  0x385f, 0x3860, 0x3861, 0x3862, 0x3863, 0x3864, 0x3865, 0x3866,
+  0x3867, 0x3868, 0x3869, 0x386a, 0x386b, 0x386c, 0x386d, 0x386e,
+  0x386f, 0x3870, 0x3871, 0x3872, 0x3873, 0x3874, 0x3875, 0x3876,
+  0x3877, 0x3878, 0x3879, 0x387a, 0x387b, 0x387c, 0x387d, 0x387e,
+  0x3921, 0x3922, 0x3923, 0x3924, 0x3925, 0x3926, 0x3927, 0x3928,
+  0x3929, 0x392a, 0x392b, 0x392c, 0x392d, 0x392e, 0x392f, 0x3930,
+  0x3931, 0x3932, 0x3933, 0x3934, 0x3935, 0x3936, 0x3937, 0x3938,
+  0x3939, 0x393a, 0x393b, 0x393c, 0x393d, 0x393e, 0x393f, 0x3940,
+  0x3941, 0x3942, 0x3943, 0x3944, 0x3945, 0x3946, 0x3947, 0x3948,
+  0x3949, 0x394a, 0x394b, 0x394c, 0x394d, 0x394e, 0x394f, 0x3950,
+  0x3951, 0x3952, 0x3953, 0x3954, 0x3955, 0x3956, 0x3957, 0x3958,
+  0x3959, 0x395a, 0x395b, 0x395c, 0x395d, 0x395e, 0x395f, 0x3960,
+  0x3961, 0x3962, 0x3963, 0x3964, 0x3965, 0x3966, 0x3967, 0x3968,
+  0x3969, 0x396a, 0x396b, 0x396c, 0x396d, 0x396e, 0x396f, 0x3970,
+  0x3971, 0x3972, 0x3973, 0x3974, 0x3975, 0x3976, 0x3977, 0x3978,
+  0x3979, 0x397a, 0x397b, 0x397c, 0x397d, 0x397e, 0x3a21, 0x3a22,
+  0x3a23, 0x3a24, 0x3a25, 0x3a26, 0x3a27, 0x3a28, 0x3a29, 0x3a2a,
+  0x3a2b, 0x3a2c, 0x3a2d, 0x3a2e, 0x3a2f, 0x3a30, 0x3a31, 0x3a32,
+  0x3a33, 0x3a34, 0x3a35, 0x3a36, 0x3a37, 0x3a38, 0x3a39, 0x3a3a,
+  0x3a3b, 0x3a3c, 0x3a3d, 0x3a3e, 0x3a3f, 0x3a40, 0x3a41, 0x3a42,
+  0x3a43, 0x3a44, 0x3a45, 0x3a46, 0x3a47, 0x3a48, 0x3a49, 0x3a4a,
+  0x3a4b, 0x3a4c, 0x3a4d, 0x3a4e, 0x3a4f, 0x3a50, 0x3a51, 0x3a52,
+  0x3a53, 0x3a54, 0x3a55, 0x3a56, 0x3a57, 0x3a58, 0x3a59, 0x3a5a,
+  0x3a5b, 0x3a5c, 0x3a5d, 0x3a5e, 0x3a5f, 0x3a60, 0x3a61, 0x3a62,
+  0x3a63, 0x3a64, 0x3a65, 0x3a66, 0x3a67, 0x3a68, 0x3a69, 0x3a6a,
+  0x3a6b, 0x3a6c, 0x3a6d, 0x3a6e, 0x3a6f, 0x3a70, 0x3a71, 0x3a72,
+  0x3a73, 0x3a74, 0x3a75, 0x3a76, 0x3a77, 0x3a78, 0x3a79, 0x3a7a,
+  0x3a7b, 0x3a7c, 0x3a7d, 0x3a7e, 0x3b21, 0x3b22, 0x3b23, 0x3b24,
+  0x3b25, 0x3b26, 0x3b27, 0x3b28, 0x3b29, 0x3b2a, 0x3b2b, 0x3b2c,
+  0x3b2d, 0x3b2e, 0x3b2f, 0x3b30, 0x3b31, 0x3b32, 0x3b33, 0x3b34,
+  0x3b35, 0x3b36, 0x3b37, 0x3b38, 0x3b39, 0x3b3a, 0x3b3b, 0x3b3c,
+  0x3b3d, 0x3b3e, 0x3b3f, 0x3b40, 0x3b41, 0x3b42, 0x3b43, 0x3b44,
+  0x3b45, 0x3b46, 0x3b47, 0x3b48, 0x3b49, 0x3b4a, 0x3b4b, 0x3b4c,
+  0x3b4d, 0x3b4e, 0x3b4f, 0x3b50, 0x3b51, 0x3b52, 0x3b53, 0x3b54,
+  0x3b55, 0x3b56, 0x3b57, 0x3b58, 0x3b59, 0x3b5a, 0x3b5b, 0x3b5c,
+  0x3b5d, 0x3b5e, 0x3b5f, 0x3b60, 0x3b61, 0x3b62, 0x3b63, 0x3b64,
+  0x3b65, 0x3b66, 0x3b67, 0x3b68, 0x3b69, 0x3b6a, 0x3b6b, 0x3b6c,
+  0x3b6d, 0x3b6e, 0x3b6f, 0x3b70, 0x3b71, 0x3b72, 0x3b73, 0x3b74,
+  0x3b75, 0x3b76, 0x3b77, 0x3b78, 0x3b79, 0x3b7a, 0x3b7b, 0x3b7c,
+  0x3b7d, 0x3b7e, 0x3c21, 0x3c22, 0x3c23, 0x3c24, 0x3c25, 0x3c26,
+  0x3c27, 0x3c28, 0x3c29, 0x3c2a, 0x3c2b, 0x3c2c, 0x3c2d, 0x3c2e,
+  0x3c2f, 0x3c30, 0x3c31, 0x3c32, 0x3c33, 0x3c34, 0x3c35, 0x3c36,
+  0x3c37, 0x3c38, 0x3c39, 0x3c3a, 0x3c3b, 0x3c3c, 0x3c3d, 0x3c3e,
+  0x3c3f, 0x3c40, 0x3c41, 0x3c42, 0x3c43, 0x3c44, 0x3c45, 0x3c46,
+  0x3c47, 0x3c48, 0x3c49, 0x3c4a, 0x3c4b, 0x3c4c, 0x3c4d, 0x3c4e,
+  0x3c4f, 0x3c50, 0x3c51, 0x3c52, 0x3c53, 0x3c54, 0x3c55, 0x3c56,
+  0x3c57, 0x3c58, 0x3c59, 0x3c5a, 0x3c5b, 0x3c5c, 0x3c5d, 0x3c5e,
+  0x3c5f, 0x3c60, 0x3c61, 0x3c62, 0x3c63, 0x3c64, 0x3c65, 0x3c66,
+  0x3c67, 0x3c68, 0x3c69, 0x3c6a, 0x3c6b, 0x3c6c, 0x3c6d, 0x3c6e,
+  0x3c6f, 0x3c70, 0x3c71, 0x3c72, 0x3c73, 0x3c74, 0x3c75, 0x3c76,
+  0x3c77, 0x3c78, 0x3c79, 0x3c7a, 0x3c7b, 0x3c7c, 0x3c7d, 0x3c7e,
+  0x3d21, 0x3d22, 0x3d23, 0x3d24, 0x3d25, 0x3d26, 0x3d27, 0x3d28,
+  0x3d29, 0x3d2a, 0x3d2b, 0x3d2c, 0x3d2d, 0x3d2e, 0x3d2f, 0x3d30,
+  0x3d31, 0x3d32, 0x3d33, 0x3d34, 0x3d35, 0x3d36, 0x3d37, 0x3d38,
+  0x3d39, 0x3d3a, 0x3d3b, 0x3d3c, 0x3d3d, 0x3d3e, 0x3d3f, 0x3d40,
+  0x3d41, 0x3d42, 0x3d43, 0x3d44, 0x3d45, 0x3d46, 0x3d47, 0x3d48,
+  0x3d49, 0x3d4a, 0x3d4b, 0x3d4c, 0x3d4d, 0x3d4e, 0x3d4f, 0x3d50,
+  0x3d51, 0x3d52, 0x3d53, 0x3d54, 0x3d55, 0x3d56, 0x3d57, 0x3d58,
+  0x3d59, 0x3d5a, 0x3d5b, 0x3d5c, 0x3d5d, 0x3d5e, 0x3d5f, 0x3d60,
+  0x3d61, 0x3d62, 0x3d63, 0x3d64, 0x3d65, 0x3d66, 0x3d67, 0x3d68,
+  0x3d69, 0x3d6a, 0x3d6b, 0x3d6c, 0x3d6d, 0x3d6e, 0x3d6f, 0x3d70,
+  0x3d71, 0x3d72, 0x3d73, 0x3d74, 0x3d75, 0x3d76, 0x3d77, 0x3d78,
+  0x3d79, 0x3d7a, 0x3d7b, 0x3d7c, 0x3d7d, 0x3d7e, 0x3e21, 0x3e22,
+  0x3e23, 0x3e24, 0x3e25, 0x3e26, 0x3e27, 0x3e28, 0x3e29, 0x3e2a,
+  0x3e2b, 0x3e2c, 0x3e2d, 0x3e2e, 0x3e2f, 0x3e30, 0x3e31, 0x3e32,
+  0x3e33, 0x3e34, 0x3e35, 0x3e36, 0x3e37, 0x3e38, 0x3e39, 0x3e3a,
+  0x3e3b, 0x3e3c, 0x3e3d, 0x3e3e, 0x3e3f, 0x3e40, 0x3e41, 0x3e42,
+  0x3e43, 0x3e44, 0x3e45, 0x3e46, 0x3e47, 0x3e48, 0x3e49, 0x3e4a,
+  0x3e4b, 0x3e4c, 0x3e4d, 0x3e4e, 0x3e4f, 0x3e50, 0x3e51, 0x3e52,
+  0x3e53, 0x3e54, 0x3e55, 0x3e56, 0x3e57, 0x3e58, 0x3e59, 0x3e5a,
+  0x3e5b, 0x3e5c, 0x3e5d, 0x3e5e, 0x3e5f, 0x3e60, 0x3e61, 0x3e62,
+  0x3e63, 0x3e64, 0x3e65, 0x3e66, 0x3e67, 0x3e68, 0x3e69, 0x3e6a,
+  0x3e6b, 0x3e6c, 0x3e6d, 0x3e6e, 0x3e6f, 0x3e70, 0x3e71, 0x3e72,
+  0x3e73, 0x3e74, 0x3e75, 0x3e76, 0x3e77, 0x3e78, 0x3e79, 0x3e7a,
+  0x3e7b, 0x3e7c, 0x3e7d, 0x3e7e, 0x3f21, 0x3f22, 0x3f23, 0x3f24,
+  0x3f25, 0x3f26, 0x3f27, 0x3f28, 0x3f29, 0x3f2a, 0x3f2b, 0x3f2c,
+  0x3f2d, 0x3f2e, 0x3f2f, 0x3f30, 0x3f31, 0x3f32, 0x3f33, 0x3f34,
+  0x3f35, 0x3f36, 0x3f37, 0x3f38, 0x3f39, 0x3f3a, 0x3f3b, 0x3f3c,
+  0x3f3d, 0x3f3e, 0x3f3f, 0x3f40, 0x3f41, 0x3f42, 0x3f43, 0x3f44,
+  0x3f45, 0x3f46, 0x3f47, 0x3f48, 0x3f49, 0x3f4a, 0x3f4b, 0x3f4c,
+  0x3f4d, 0x3f4e, 0x3f4f, 0x3f50, 0x3f51, 0x3f52, 0x3f53, 0x3f54,
+  0x3f55, 0x3f56, 0x3f57, 0x3f58, 0x3f59, 0x3f5a, 0x3f5b, 0x3f5c,
+  0x3f5d, 0x3f5e, 0x3f5f, 0x3f60, 0x3f61, 0x3f62, 0x3f63, 0x3f64,
+  0x3f65, 0x3f66, 0x3f67, 0x3f68, 0x3f69, 0x3f6a, 0x3f6b, 0x3f6c,
+  0x3f6d, 0x3f6e, 0x3f6f, 0x3f70, 0x3f71, 0x3f72, 0x3f73, 0x3f74,
+  0x3f75, 0x3f76, 0x3f77, 0x3f78, 0x3f79, 0x3f7a, 0x3f7b, 0x3f7c,
+  0x3f7d, 0x3f7e, 0x4021, 0x4022, 0x4023, 0x4024, 0x4025, 0x4026,
+  0x4027, 0x4028, 0x4029, 0x402a, 0x402b, 0x402c, 0x402d, 0x402e,
+  0x402f, 0x4030, 0x4031, 0x4032, 0x4033, 0x4034, 0x4035, 0x4036,
+  0x4037, 0x4038, 0x4039, 0x403a, 0x403b, 0x403c, 0x403d, 0x403e,
+  0x403f, 0x4040, 0x4041, 0x4042, 0x4043, 0x4044, 0x4045, 0x4046,
+  0x4047, 0x4048, 0x4049, 0x404a, 0x404b, 0x404c, 0x404d, 0x404e,
+  0x404f, 0x4050, 0x4051, 0x4052, 0x4053, 0x4054, 0x4055, 0x4056,
+  0x4057, 0x4058, 0x4059, 0x405a, 0x405b, 0x405c, 0x405d, 0x405e,
+  0x405f, 0x4060, 0x4061, 0x4062, 0x4063, 0x4064, 0x4065, 0x4066,
+  0x4067, 0x4068, 0x4069, 0x406a, 0x406b, 0x406c, 0x406d, 0x406e,
+  0x406f, 0x4070, 0x4071, 0x4072, 0x4073, 0x4074, 0x4075, 0x4076,
+  0x4077, 0x4078, 0x4079, 0x407a, 0x407b, 0x407c, 0x407d, 0x407e,
+  0x4121, 0x4122, 0x4123, 0x4124, 0x4125, 0x4126, 0x4127, 0x4128,
+  0x4129, 0x412a, 0x412b, 0x412c, 0x412d, 0x412e, 0x412f, 0x4130,
+  0x4131, 0x4132, 0x4133, 0x4134, 0x4135, 0x4136, 0x4137, 0x4138,
+  0x4139, 0x413a, 0x413b, 0x413c, 0x413d, 0x413e, 0x413f, 0x4140,
+  0x4141, 0x4142, 0x4143, 0x4144, 0x4145, 0x4146, 0x4147, 0x4148,
+  0x4149, 0x414a, 0x414b, 0x414c, 0x414d, 0x414e, 0x414f, 0x4150,
+  0x4151, 0x4152, 0x4153, 0x4154, 0x4155, 0x4156, 0x4157, 0x4158,
+  0x4159, 0x415a, 0x415b, 0x415c, 0x415d, 0x415e, 0x415f, 0x4160,
+  0x4161, 0x4162, 0x4163, 0x4164, 0x4165, 0x4166, 0x4167, 0x4168,
+  0x4169, 0x416a, 0x416b, 0x416c, 0x416d, 0x416e, 0x416f, 0x4170,
+  0x4171, 0x4172, 0x4173, 0x4174, 0x4175, 0x4176, 0x4177, 0x4178,
+  0x4179, 0x417a, 0x417b, 0x417c, 0x417d, 0x417e, 0x4221, 0x4222,
+  0x4223, 0x4224, 0x4225, 0x4226, 0x4227, 0x4228, 0x4229, 0x422a,
+  0x422b, 0x422c, 0x422d, 0x422e, 0x422f, 0x4230, 0x4231, 0x4232,
+  0x4233, 0x4234, 0x4235, 0x4236, 0x4237, 0x4238, 0x4239, 0x423a,
+  0x423b, 0x423c, 0x423d, 0x423e, 0x423f, 0x4240, 0x4241, 0x4242,
+  0x4243, 0x4244, 0x4245, 0x4246, 0x4247, 0x4248, 0x4249, 0x424a,
+  0x424b, 0x424c, 0x424d, 0x424e, 0x424f, 0x4250, 0x4251, 0x4252,
+  0x4253, 0x4254, 0x4255, 0x4256, 0x4257, 0x4258, 0x4259, 0x425a,
+  0x425b, 0x425c, 0x425d, 0x425e, 0x425f, 0x4260, 0x4261, 0x4262,
+  0x4263, 0x4264, 0x4265, 0x4266, 0x4267, 0x4268, 0x4269, 0x426a,
+  0x426b, 0x426c, 0x426d, 0x426e, 0x426f, 0x4270, 0x4271, 0x4272,
+  0x4273, 0x4274, 0x4275, 0x4276, 0x4277, 0x4278, 0x4279, 0x427a,
+  0x427b, 0x427c, 0x427d, 0x427e, 0x4321, 0x4322, 0x4323, 0x4324,
+  0x4325, 0x4326, 0x4327, 0x4328, 0x4329, 0x432a, 0x432b, 0x432c,
+  0x432d, 0x432e, 0x432f, 0x4330, 0x4331, 0x4332, 0x4333, 0x4334,
+  0x4335, 0x4336, 0x4337, 0x4338, 0x4339, 0x433a, 0x433b, 0x433c,
+  0x433d, 0x433e, 0x433f, 0x4340, 0x4341, 0x4342, 0x4343, 0x4344,
+  0x4345, 0x4346, 0x4347, 0x4348, 0x4349, 0x434a, 0x434b, 0x434c,
+  0x434d, 0x434e, 0x434f, 0x4350, 0x4351, 0x4352, 0x4353, 0x4354,
+  0x4355, 0x4356, 0x4357, 0x4358, 0x4359, 0x435a, 0x435b, 0x435c,
+  0x435d, 0x435e, 0x435f, 0x4360, 0x4361, 0x4362, 0x4363, 0x4364,
+  0x4365, 0x4366, 0x4367, 0x4368, 0x4369, 0x436a, 0x436b, 0x436c,
+  0x436d, 0x436e, 0x436f, 0x4370, 0x4371, 0x4372, 0x4373, 0x4374,
+  0x4375, 0x4376, 0x4377, 0x4378, 0x4379, 0x437a, 0x437b, 0x437c,
+  0x437d, 0x437e, 0x4421, 0x4422, 0x4423, 0x4424, 0x4425, 0x4426,
+  0x4427, 0x4428, 0x4429, 0x442a, 0x442b, 0x442c, 0x442d, 0x442e,
+  0x442f, 0x4430, 0x4431, 0x4432, 0x4433, 0x4434, 0x4435, 0x4436,
+  0x4437, 0x4438, 0x4439, 0x443a, 0x443b, 0x443c, 0x443d, 0x443e,
+  0x443f, 0x4440, 0x4441, 0x4442, 0x4443, 0x4444, 0x4445, 0x4446,
+  0x4447, 0x4448, 0x4449, 0x444a, 0x444b, 0x444c, 0x444d, 0x444e,
+  0x444f, 0x4450, 0x4451, 0x4452, 0x4453, 0x4454, 0x4455, 0x4456,
+  0x4457, 0x4458, 0x4459, 0x445a, 0x445b, 0x445c, 0x445d, 0x445e,
+  0x445f, 0x4460, 0x4461, 0x4462, 0x4463, 0x4464, 0x4465, 0x4466,
+  0x4467, 0x4468, 0x4469, 0x446a, 0x446b, 0x446c, 0x446d, 0x446e,
+  0x446f, 0x4470, 0x4471, 0x4472, 0x4473, 0x4474, 0x4475, 0x4476,
+  0x4477, 0x4478, 0x4479, 0x447a, 0x447b, 0x447c, 0x447d, 0x447e,
+  0x4521, 0x4522, 0x4523, 0x4524, 0x4525, 0x4526, 0x4527, 0x4528,
+  0x4529, 0x452a, 0x452b, 0x452c, 0x452d, 0x452e, 0x452f, 0x4530,
+  0x4531, 0x4532, 0x4533, 0x4534, 0x4535, 0x4536, 0x4537, 0x4538,
+  0x4539, 0x453a, 0x453b, 0x453c, 0x453d, 0x453e, 0x453f, 0x4540,
+  0x4541, 0x4542, 0x4543, 0x4544, 0x4545, 0x4546, 0x4547, 0x4548,
+  0x4549, 0x454a, 0x454b, 0x454c, 0x454d, 0x454e, 0x454f, 0x4550,
+  0x4551, 0x4552, 0x4553, 0x4554, 0x4555, 0x4556, 0x4557, 0x4558,
+  0x4559, 0x455a, 0x455b, 0x455c, 0x455d, 0x455e, 0x455f, 0x4560,
+  0x4561, 0x4562, 0x4563, 0x4564, 0x4565, 0x4566, 0x4567, 0x4568,
+  0x4569, 0x456a, 0x456b, 0x456c, 0x456d, 0x456e, 0x456f, 0x4570,
+  0x4571, 0x4572, 0x4573, 0x4574, 0x4575, 0x4576, 0x4577, 0x4578,
+  0x4579, 0x457a, 0x457b, 0x457c, 0x457d, 0x457e, 0x4621, 0x4622,
+  0x4623, 0x4624, 0x4625, 0x4626, 0x4627, 0x4628, 0x4629, 0x462a,
+  0x462b, 0x462c, 0x462d, 0x462e, 0x462f, 0x4630, 0x4631, 0x4632,
+  0x4633, 0x4634, 0x4635, 0x4636, 0x4637, 0x4638, 0x4639, 0x463a,
+  0x463b, 0x463c, 0x463d, 0x463e, 0x463f, 0x4640, 0x4641, 0x4642,
+  0x4643, 0x4644, 0x4645, 0x4646, 0x4647, 0x4648, 0x4649, 0x464a,
+  0x464b, 0x464c, 0x464d, 0x464e, 0x464f, 0x4650, 0x4651, 0x4652,
+  0x4653, 0x4654, 0x4655, 0x4656, 0x4657, 0x4658, 0x4659, 0x465a,
+  0x465b, 0x465c, 0x465d, 0x465e, 0x465f, 0x4660, 0x4661, 0x4662,
+  0x4663, 0x4664, 0x4665, 0x4666, 0x4667, 0x4668, 0x4669, 0x466a,
+  0x466b, 0x466c, 0x466d, 0x466e, 0x466f, 0x4670, 0x4671, 0x4672,
+  0x4673, 0x4674, 0x4675, 0x4676, 0x4677, 0x4678, 0x4679, 0x467a,
+  0x467b, 0x467c, 0x467d, 0x467e, 0x4721, 0x4722, 0x4723, 0x4724,
+  0x4725, 0x4726, 0x4727, 0x4728, 0x4729, 0x472a, 0x472b, 0x472c,
+  0x472d, 0x472e, 0x472f, 0x4730, 0x4731, 0x4732, 0x4733, 0x4734,
+  0x4735, 0x4736, 0x4737, 0x4738, 0x4739, 0x473a, 0x473b, 0x473c,
+  0x473d, 0x473e, 0x473f, 0x4740, 0x4741, 0x4742, 0x4743, 0x4744,
+  0x4745, 0x4746, 0x4747, 0x4748, 0x4749, 0x474a, 0x474b, 0x474c,
+  0x474d, 0x474e, 0x474f, 0x4750, 0x4751, 0x4752, 0x4753, 0x4754,
+  0x4755, 0x4756, 0x4757, 0x4758, 0x4759, 0x475a, 0x475b, 0x475c,
+  0x475d, 0x475e, 0x475f, 0x4760, 0x4761, 0x4762, 0x4763, 0x4764,
+  0x4765, 0x4766, 0x4767, 0x4768, 0x4769, 0x476a, 0x476b, 0x476c,
+  0x476d, 0x476e, 0x476f, 0x4770, 0x4771, 0x4772, 0x4773, 0x4774,
+  0x4775, 0x4776, 0x4777, 0x4778, 0x4779, 0x477a, 0x477b, 0x477c,
+  0x477d, 0x477e, 0x4821, 0x4822, 0x4823, 0x4824, 0x4825, 0x4826,
+  0x4827, 0x4828, 0x4829, 0x482a, 0x482b, 0x482c, 0x482d, 0x482e,
+  0x482f, 0x4830, 0x4831, 0x4832, 0x4833, 0x4834, 0x4835, 0x4836,
+  0x4837, 0x4838, 0x4839, 0x483a, 0x483b, 0x483c, 0x483d, 0x483e,
+  0x483f, 0x4840, 0x4841, 0x4842, 0x4843, 0x4844, 0x4845, 0x4846,
+  0x4847, 0x4848, 0x4849, 0x484a, 0x484b, 0x484c, 0x484d, 0x484e,
+  0x484f, 0x4850, 0x4851, 0x4852, 0x4853, 0x4854, 0x4855, 0x4856,
+  0x4857, 0x4858, 0x4859, 0x485a, 0x485b, 0x485c, 0x485d, 0x485e,
+  0x485f, 0x4860, 0x4861, 0x4862, 0x4863, 0x4864, 0x4865, 0x4866,
+  0x4867, 0x4868, 0x4869, 0x486a, 0x486b, 0x486c, 0x486d, 0x486e,
+  0x486f, 0x4870, 0x4871, 0x4872, 0x4873, 0x4874, 0x4875, 0x4876,
+  0x4877, 0x4878, 0x4879, 0x487a, 0x487b, 0x487c, 0x487d, 0x487e,
+  0x4b50, 0x4b56, 0x4b67, 0x4d4f, 0x4d68, 0x4e2d, 0x4f7b, 0x5022,
+  0x5038, 0x5050, 0x505d, 0x5154, 0x5155, 0x5158, 0x515b, 0x515c,
+  0x515d, 0x515e, 0x515f, 0x5160, 0x5162, 0x5163, 0x5164, 0x5165,
+  0x5166, 0x5168, 0x5169, 0x516a, 0x516b, 0x516d, 0x516f, 0x5170,
+  0x5172, 0x5176, 0x517a, 0x517c, 0x517d, 0x517e, 0x5222, 0x5223,
+  0x5227, 0x5228, 0x5229, 0x522a, 0x522b, 0x522d, 0x5232, 0x523e,
+  0x5242, 0x5243, 0x5244, 0x5246, 0x5247, 0x5248, 0x5249, 0x524a,
+  0x524b, 0x524d, 0x524e, 0x524f, 0x5250, 0x5251, 0x5252, 0x5253,
+  0x5254, 0x5255, 0x5256, 0x5257, 0x5259, 0x525a, 0x525e, 0x525f,
+  0x5261, 0x5262, 0x5264, 0x5265, 0x5266, 0x5267, 0x5268, 0x5269,
+  0x526a, 0x526b, 0x5270, 0x5271, 0x5272, 0x5273, 0x5274, 0x5275,
+  0x5277, 0x5278, 0x5466, 0x547c, 0x5525, 0x552b, 0x552e, 0x5638,
+  0x564d, 0x574b, 0x5764, 0x5b45, 0x5b64, 0x5c25, 0x5d25, 0x5d55,
+  0x5d74, 0x5e7c, 0x5e7e, 0x5f33, 0x5f61, 0x5f68, 0x6071, 0x612d,
+  0x616d, 0x6375, 0x6421, 0x6429, 0x652e, 0x6531, 0x6532, 0x6539,
+  0x653b, 0x653c, 0x6544, 0x654e, 0x6550, 0x6552, 0x6556, 0x657a,
+  0x657b, 0x657c, 0x657e, 0x6621, 0x6624, 0x6627, 0x662d, 0x662f,
+  0x6630, 0x6631, 0x6633, 0x6637, 0x6638, 0x663c, 0x6644, 0x6646,
+  0x6647, 0x664a, 0x6652, 0x6656, 0x6659, 0x665c, 0x665f, 0x6661,
+  0x6664, 0x6665, 0x6666, 0x6668, 0x666a, 0x666b, 0x666c, 0x666f,
+  0x6671, 0x6672, 0x6675, 0x6676, 0x6677, 0x6679, 0x6721, 0x6726,
+  0x6729, 0x672a, 0x672c, 0x672d, 0x6730, 0x673f, 0x6741, 0x6746,
+  0x6747, 0x674b, 0x674d, 0x674f, 0x6750, 0x6753, 0x675f, 0x6764,
+  0x6766, 0x6777, 0x6867, 0x6868, 0x6870, 0x6871, 0x6877, 0x6879,
+  0x687b, 0x687e, 0x6927, 0x692c, 0x694c, 0x6977, 0x6a41, 0x6a65,
+  0x6a74, 0x6a77, 0x6a7c, 0x6a7e, 0x6b24, 0x6b27, 0x6b29, 0x6b2a,
+  0x6b3a, 0x6b3b, 0x6b3d, 0x6b41, 0x6b42, 0x6b46, 0x6b47, 0x6b4c,
+  0x6b4f, 0x6b50, 0x6b51, 0x6b52, 0x6b58, 0x6c26, 0x6c27, 0x6c2a,
+  0x6c2f, 0x6c30, 0x6c31, 0x6c32, 0x6c35, 0x6c38, 0x6c3a, 0x6c40,
+  0x6c41, 0x6c45, 0x6c46, 0x6c49, 0x6c4a, 0x6c55, 0x6c5d, 0x6c5e,
+  0x6c61, 0x6c64, 0x6c67, 0x6c68, 0x6c77, 0x6c78, 0x6c7a, 0x6d21,
+  0x6d22, 0x6d23, 0x6d6e, 0x6e5b, 0x723d, 0x727a, 0x7331, 0x7427,
+  0x746e, 0x7674, 0x7676, 0x7738, 0x7748, 0x7753, 0x785b, 0x7870,
+  0x7a21, 0x7a22, 0x7a66, 0x7c29, 0x2321, 0x2322, 0x2323, 0x2324,
+  0x2325, 0x2326, 0x2327, 0x2328, 0x2329, 0x232a, 0x232b, 0x232c,
+  0x232d, 0x232e, 0x232f, 0x2330, 0x2331, 0x2332, 0x2333, 0x2334,
+  0x2335, 0x2336, 0x2337, 0x2338, 0x2339, 0x233a, 0x233b, 0x233c,
+  0x233d, 0x233e, 0x233f, 0x2340, 0x2341, 0x2342, 0x2343, 0x2344,
+  0x2345, 0x2346, 0x2347, 0x2348, 0x2349, 0x234a, 0x234b, 0x234c,
+  0x234d, 0x234e, 0x234f, 0x2350, 0x2351, 0x2352, 0x2353, 0x2354,
+  0x2355, 0x2356, 0x2357, 0x2358, 0x2359, 0x235a, 0x235b, 0x212c,
+  0x235d, 0x235e, 0x235f, 0x2360, 0x2361, 0x2362, 0x2363, 0x2364,
+  0x2365, 0x2366, 0x2367, 0x2368, 0x2369, 0x236a, 0x236b, 0x236c,
+  0x236d, 0x236e, 0x236f, 0x2370, 0x2371, 0x2372, 0x2373, 0x2374,
+  0x2375, 0x2376, 0x2377, 0x2378, 0x2379, 0x237a, 0x237b, 0x237c,
+  0x237d, 0x2226, 0x214b, 0x214c, 0x217e, 0x237e, 0x214d, 0x235c,
+};
+
+static const Summary16 ksc5601_uni2indx_page00[70] = {
+  /* 0x0000 */
+  {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 },
+  {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x0000 },
+  {    0, 0x0000 }, {    0, 0x0000 }, {    0, 0x2592 }, {    6, 0xf7df },
+  {   20, 0x0040 }, {   21, 0xc181 }, {   26, 0x0040 }, {   27, 0x4181 },
+  /* 0x0100 */
+  {   31, 0x0000 }, {   31, 0x0002 }, {   32, 0x00c0 }, {   34, 0x810e },
+  {   39, 0x0e07 }, {   45, 0x000c }, {   47, 0x00c0 }, {   49, 0x0000 },
+  {   49, 0x0000 }, {   49, 0x0000 }, {   49, 0x0000 }, {   49, 0x0000 },
+  {   49, 0x0000 }, {   49, 0x0000 }, {   49, 0x0000 }, {   49, 0x0000 },
+  /* 0x0200 */
+  {   49, 0x0000 }, {   49, 0x0000 }, {   49, 0x0000 }, {   49, 0x0000 },
+  {   49, 0x0000 }, {   49, 0x0000 }, {   49, 0x0000 }, {   49, 0x0000 },
+  {   49, 0x0000 }, {   49, 0x0000 }, {   49, 0x0000 }, {   49, 0x0000 },
+  {   49, 0x0080 }, {   50, 0x2f01 }, {   56, 0x0000 }, {   56, 0x0000 },
+  /* 0x0300 */
+  {   56, 0x0000 }, {   56, 0x0000 }, {   56, 0x0000 }, {   56, 0x0000 },
+  {   56, 0x0000 }, {   56, 0x0000 }, {   56, 0x0000 }, {   56, 0x0000 },
+  {   56, 0x0000 }, {   56, 0xfffe }, {   71, 0x03fb }, {   80, 0xfffe },
+  {   95, 0x03fb }, {  104, 0x0000 }, {  104, 0x0000 }, {  104, 0x0000 },
+  /* 0x0400 */
+  {  104, 0x0002 }, {  105, 0xffff }, {  121, 0xffff }, {  137, 0xffff },
+  {  153, 0xffff }, {  169, 0x0002 },
+};
+static const Summary16 ksc5601_uni2indx_page20[103] = {
+  /* 0x2000 */
+  {  170, 0x0000 }, {  170, 0x3320 }, {  175, 0x0063 }, {  179, 0x080d },
+  {  183, 0x0000 }, {  183, 0x0000 }, {  183, 0x0000 }, {  183, 0x8010 },
+  {  185, 0x001e }, {  189, 0x0000 }, {  189, 0x0000 }, {  189, 0x0000 },
+  {  189, 0x0000 }, {  189, 0x0000 }, {  189, 0x0000 }, {  189, 0x0000 },
+  /* 0x2100 */
+  {  189, 0x0208 }, {  191, 0x0048 }, {  193, 0x0846 }, {  197, 0x0000 },
+  {  197, 0x0000 }, {  197, 0x7818 }, {  203, 0x03ff }, {  213, 0x03ff },
+  {  223, 0x0000 }, {  223, 0x03ff }, {  233, 0x0000 }, {  233, 0x0000 },
+  {  233, 0x0000 }, {  233, 0x0014 }, {  235, 0x0000 }, {  235, 0x0000 },
+  /* 0x2200 */
+  {  235, 0x898d }, {  242, 0x6402 }, {  246, 0x5fa1 }, {  255, 0x3030 },
+  {  259, 0x0000 }, {  259, 0x0004 }, {  260, 0x0c33 }, {  266, 0x0000 },
+  {  266, 0x00cc }, {  270, 0x0200 }, {  271, 0x0020 }, {  272, 0x0000 },
+  {  272, 0x0000 }, {  272, 0x0000 }, {  272, 0x0000 }, {  272, 0x0000 },
+  /* 0x2300 */
+  {  272, 0x0000 }, {  272, 0x0004 }, {  273, 0x0000 }, {  273, 0x0000 },
+  {  273, 0x0000 }, {  273, 0x0000 }, {  273, 0x0000 }, {  273, 0x0000 },
+  {  273, 0x0000 }, {  273, 0x0000 }, {  273, 0x0000 }, {  273, 0x0000 },
+  {  273, 0x0000 }, {  273, 0x0000 }, {  273, 0x0000 }, {  273, 0x0000 },
+  /* 0x2400 */
+  {  273, 0x0000 }, {  273, 0x0000 }, {  273, 0x0000 }, {  273, 0x0000 },
+  {  273, 0x0000 }, {  273, 0x0000 }, {  273, 0x7fff }, {  288, 0xfff0 },
+  {  300, 0x0007 }, {  303, 0xf000 }, {  307, 0xffff }, {  323, 0x003f },
+  {  329, 0x0000 }, {  329, 0xffff }, {  345, 0x03ff }, {  355, 0x0000 },
+  /* 0x2500 */
+  {  355, 0xf00f }, {  363, 0xffff }, {  379, 0xffff }, {  395, 0xffff },
+  {  411, 0x0fff }, {  423, 0x0000 }, {  423, 0x0000 }, {  423, 0x0000 },
+  {  423, 0x0000 }, {  423, 0x0004 }, {  424, 0x03fb }, {  433, 0x30cc },
+  {  439, 0xc9c3 }, {  447, 0x0003 }, {  449, 0x0000 }, {  449, 0x0000 },
+  /* 0x2600 */
+  {  449, 0xc060 }, {  453, 0x5000 }, {  455, 0x0000 }, {  455, 0x0000 },
+  {  455, 0x0005 }, {  457, 0x0000 }, {  457, 0x37bb },
+};
+static const Summary16 ksc5601_uni2indx_page30[62] = {
+  /* 0x3000 */
+  {  468, 0xff0f }, {  480, 0x003b }, {  485, 0x0000 }, {  485, 0x0000 },
+  {  485, 0xfffe }, {  500, 0xffff }, {  516, 0xffff }, {  532, 0xffff },
+  {  548, 0xffff }, {  564, 0x000f }, {  568, 0xfffe }, {  583, 0xffff },
+  {  599, 0xffff }, {  615, 0xffff }, {  631, 0xffff }, {  647, 0x007f },
+  /* 0x3100 */
+  {  654, 0x0000 }, {  654, 0x0000 }, {  654, 0x0000 }, {  654, 0xfffe },
+  {  669, 0xffff }, {  685, 0xffff }, {  701, 0xffff }, {  717, 0xffff },
+  {  733, 0x7fff }, {  748, 0x0000 }, {  748, 0x0000 }, {  748, 0x0000 },
+  {  748, 0x0000 }, {  748, 0x0000 }, {  748, 0x0000 }, {  748, 0x0000 },
+  /* 0x3200 */
+  {  748, 0xffff }, {  764, 0x1fff }, {  777, 0x0000 }, {  777, 0x0000 },
+  {  777, 0x0000 }, {  777, 0x0000 }, {  777, 0xffff }, {  793, 0x8fff },
+  {  806, 0x0000 }, {  806, 0x0000 }, {  806, 0x0000 }, {  806, 0x0000 },
+  {  806, 0x0000 }, {  806, 0x0000 }, {  806, 0x0000 }, {  806, 0x0000 },
+  /* 0x3300 */
+  {  806, 0x0000 }, {  806, 0x0000 }, {  806, 0x0000 }, {  806, 0x0000 },
+  {  806, 0x0000 }, {  806, 0x0000 }, {  806, 0x0000 }, {  806, 0x0000 },
+  {  806, 0xff1f }, {  819, 0xffff }, {  835, 0xffff }, {  851, 0xffff },
+  {  867, 0x87ff }, {  879, 0x3949 },
+};
+static const Summary16 ksc5601_uni2indx_page4e[1306] = {
+  /* 0x4e00 */
+  {  886, 0x2f8b }, {  895, 0x4372 }, {  902, 0x2000 }, {  903, 0x0b04 },
+  {  907, 0xe82c }, {  914, 0xe340 }, {  920, 0x2800 }, {  922, 0x40c8 },
+  {  926, 0x5944 }, {  932, 0x4937 }, {  940, 0x7976 }, {  950, 0x0440 },
+  {  952, 0x2c93 }, {  959, 0xa3f0 }, {  967, 0x0038 }, {  970, 0x08c5 },
+  /* 0x4f00 */
+  {  975, 0xee02 }, {  982, 0x0003 }, {  984, 0x8000 }, {  985, 0x3550 },
+  {  991, 0xe1c8 }, {  998, 0x1e23 }, { 1005, 0x8200 }, { 1007, 0xc449 },
+  { 1013, 0xad5a }, { 1022, 0x2942 }, { 1027, 0xc000 }, { 1029, 0x8060 },
+  { 1032, 0x461c }, { 1038, 0xa49a }, { 1045, 0xc003 }, { 1049, 0x052a },
+  /* 0x5000 */
+  { 1054, 0x2a44 }, { 1059, 0xd646 }, { 1067, 0x3dda }, { 1077, 0x0800 },
+  { 1078, 0x8388 }, { 1083, 0x1420 }, { 1086, 0x0020 }, { 1087, 0x0170 },
+  { 1091, 0x2021 }, { 1094, 0x0302 }, { 1097, 0x3000 }, { 1099, 0x40ac },
+  { 1104, 0x8620 }, { 1108, 0x4462 }, { 1113, 0x20a0 }, { 1116, 0x8a00 },
+  /* 0x5100 */
+  { 1119, 0x0253 }, { 1124, 0x8004 }, { 1126, 0x0402 }, { 1128, 0x1484 },
+  { 1132, 0x7bfb }, { 1145, 0x1004 }, { 1147, 0x7fa4 }, { 1157, 0x11e2 },
+  { 1163, 0x2441 }, { 1167, 0x00a4 }, { 1170, 0x1421 }, { 1174, 0x20c0 },
+  { 1177, 0x3a50 }, { 1183, 0x7000 }, { 1186, 0x0002 }, { 1187, 0x2743 },
+  /* 0x5200 */
+  { 1194, 0x45c9 }, { 1201, 0x2082 }, { 1204, 0x4630 }, { 1209, 0x0fc1 },
+  { 1216, 0x3c88 }, { 1222, 0x2850 }, { 1226, 0x8602 }, { 1230, 0xa024 },
+  { 1234, 0x2388 }, { 1239, 0x8806 }, { 1243, 0x0e19 }, { 1249, 0x4000 },
+  { 1250, 0x22aa }, { 1256, 0xeb64 }, { 1265, 0x001c }, { 1268, 0xcd28 },
+  /* 0x5300 */
+  { 1275, 0xa120 }, { 1279, 0x02e1 }, { 1284, 0x840b }, { 1289, 0x8200 },
+  { 1291, 0x279b }, { 1300, 0x549e }, { 1308, 0x8141 }, { 1312, 0xa0b3 },
+  { 1319, 0x0010 }, { 1320, 0x8508 }, { 1324, 0x2061 }, { 1328, 0x0800 },
+  { 1329, 0x2f08 }, { 1335, 0x08d0 }, { 1339, 0xbe3e }, { 1350, 0x010f },
+  /* 0x5400 */
+  { 1355, 0xf718 }, { 1364, 0xa803 }, { 1369, 0x0a41 }, { 1373, 0x5b08 },
+  { 1379, 0x0504 }, { 1382, 0x0002 }, { 1383, 0x0500 }, { 1385, 0x382a },
+  { 1391, 0x5041 }, { 1395, 0x0001 }, { 1396, 0x1910 }, { 1400, 0x2108 },
+  { 1403, 0x0313 }, { 1408, 0x0000 }, { 1408, 0x6122 }, { 1413, 0x0404 },
+  /* 0x5500 */
+  { 1415, 0x40d0 }, { 1419, 0x1001 }, { 1421, 0x8000 }, { 1422, 0x4022 },
+  { 1425, 0x8050 }, { 1428, 0x4048 }, { 1431, 0x0008 }, { 1432, 0x1000 },
+  { 1433, 0x06d1 }, { 1439, 0x3700 }, { 1444, 0x5e80 }, { 1450, 0x0000 },
+  { 1450, 0x00a0 }, { 1452, 0x9410 }, { 1456, 0x0018 }, { 1458, 0x6000 },
+  /* 0x5600 */
+  { 1460, 0x0240 }, { 1462, 0x0090 }, { 1464, 0x8000 }, { 1465, 0x0054 },
+  { 1468, 0x0000 }, { 1468, 0x0008 }, { 1469, 0x0900 }, { 1471, 0x0010 },
+  { 1472, 0x0040 }, { 1473, 0x0000 }, { 1473, 0x5020 }, { 1476, 0x1010 },
+  { 1478, 0x2400 }, { 1480, 0x4c02 }, { 1484, 0x0001 }, { 1485, 0x0601 },
+  /* 0x5700 */
+  { 1488, 0x2918 }, { 1493, 0x814c }, { 1498, 0x2100 }, { 1500, 0x0801 },
+  { 1502, 0x6485 }, { 1508, 0x0003 }, { 1510, 0x4452 }, { 1515, 0x1021 },
+  { 1518, 0x0904 }, { 1521, 0x0008 }, { 1522, 0x000d }, { 1525, 0x0000 },
+  { 1525, 0x4988 }, { 1530, 0x8000 }, { 1531, 0x0001 }, { 1532, 0x1691 },
+  /* 0x5800 */
+  { 1538, 0x0765 }, { 1545, 0x4000 }, { 1546, 0x8492 }, { 1551, 0x0433 },
+  { 1556, 0x8c00 }, { 1559, 0x4592 }, { 1565, 0x0016 }, { 1568, 0x5220 },
+  { 1572, 0x0228 }, { 1575, 0xd008 }, { 1579, 0x4300 }, { 1582, 0x4c08 },
+  { 1586, 0x40a2 }, { 1590, 0xc32a }, { 1597, 0x9810 }, { 1601, 0x2e00 },
+  /* 0x5900 */
+  { 1605, 0x8000 }, { 1606, 0x1670 }, { 1612, 0x6e84 }, { 1619, 0x4082 },
+  { 1622, 0xc390 }, { 1628, 0x04b3 }, { 1634, 0x7c85 }, { 1642, 0x2118 },
+  { 1646, 0x041c }, { 1650, 0x02c8 }, { 1654, 0x1120 }, { 1657, 0x4a00 },
+  { 1660, 0x0a48 }, { 1664, 0x361b }, { 1672, 0x5540 }, { 1677, 0x8900 },
+  /* 0x5a00 */
+  { 1680, 0x000a }, { 1682, 0x9902 }, { 1687, 0x0221 }, { 1690, 0x1040 },
+  { 1692, 0x0242 }, { 1695, 0x0400 }, { 1696, 0x0044 }, { 1698, 0x0000 },
+  { 1698, 0x0000 }, { 1698, 0x0c04 }, { 1701, 0x0010 }, { 1702, 0x0000 },
+  { 1702, 0x1216 }, { 1707, 0x0000 }, { 1707, 0x0242 }, { 1710, 0x0000 },
+  /* 0x5b00 */
+  { 1710, 0x1a20 }, { 1714, 0x0040 }, { 1715, 0x0400 }, { 1716, 0x0000 },
+  { 1716, 0x0009 }, { 1718, 0xb5b3 }, { 1728, 0x0a18 }, { 1732, 0x1523 },
+  { 1738, 0x9ba0 }, { 1745, 0x1fe8 }, { 1754, 0x507c }, { 1761, 0x8379 },
+  { 1769, 0x10fd }, { 1777, 0xc09d }, { 1784, 0xdbf6 }, { 1796, 0x0560 },
+  /* 0x5c00 */
+  { 1800, 0xef92 }, { 1810, 0x0242 }, { 1813, 0x0110 }, { 1815, 0xdf02 },
+  { 1823, 0x6961 }, { 1830, 0x0822 }, { 1833, 0x9035 }, { 1839, 0x0202 },
+  { 1841, 0x0000 }, { 1841, 0x0003 }, { 1843, 0x1a02 }, { 1847, 0x45aa },
+  { 1854, 0x0001 }, { 1855, 0x0200 }, { 1856, 0x8101 }, { 1859, 0x2851 },
+  /* 0x5d00 */
+  { 1864, 0x6080 }, { 1867, 0x02d2 }, { 1872, 0x0280 }, { 1874, 0x0000 },
+  { 1874, 0x1800 }, { 1876, 0x0001 }, { 1877, 0x9200 }, { 1880, 0x0000 },
+  { 1880, 0x0880 }, { 1882, 0x2000 }, { 1883, 0x0405 }, { 1886, 0x3500 },
+  { 1890, 0x2000 }, { 1891, 0x6044 }, { 1895, 0x49e6 }, { 1903, 0x609e },
+  /* 0x5e00 */
+  { 1910, 0x104c }, { 1914, 0x2a42 }, { 1919, 0x2820 }, { 1922, 0xa148 },
+  { 1927, 0x10b1 }, { 1932, 0x8020 }, { 1934, 0x000e }, { 1937, 0x7b9c },
+  { 1947, 0x8490 }, { 1951, 0x14a0 }, { 1955, 0x28c1 }, { 1960, 0x41e0 },
+  { 1965, 0x0704 }, { 1969, 0x8c49 }, { 1975, 0x100d }, { 1979, 0x0cc8 },
+  /* 0x5f00 */
+  { 1984, 0x8412 }, { 1988, 0x89ba }, { 1996, 0x02c0 }, { 1999, 0x1422 },
+  { 2003, 0x5500 }, { 2007, 0x0ac0 }, { 2011, 0x3ec4 }, { 2019, 0x9283 },
+  { 2025, 0x1ca3 }, { 2032, 0x4387 }, { 2039, 0x4703 }, { 2045, 0x22a0 },
+  { 2049, 0x3028 }, { 2053, 0x03c0 }, { 2057, 0x0801 }, { 2059, 0xa020 },
+  /* 0x6000 */
+  { 2062, 0x8000 }, { 2063, 0x3044 }, { 2067, 0x85a3 }, { 2074, 0x0000 },
+  { 2074, 0x200e }, { 2078, 0x2225 }, { 2083, 0xb73c }, { 2093, 0x0001 },
+  { 2094, 0x3220 }, { 2098, 0x8c50 }, { 2103, 0x0099 }, { 2107, 0x315d },
+  { 2115, 0x00a0 }, { 2117, 0x9402 }, { 2121, 0x0003 }, { 2123, 0x0e4b },
+  /* 0x6100 */
+  { 2130, 0xe342 }, { 2137, 0x8c20 }, { 2141, 0x0080 }, { 2142, 0xd091 },
+  { 2148, 0x1d94 }, { 2155, 0xa328 }, { 2161, 0x499c }, { 2168, 0x60c1 },
+  { 2173, 0x4406 }, { 2177, 0x0713 }, { 2183, 0x5a90 }, { 2189, 0x4444 },
+  { 2193, 0x0f88 }, { 2199, 0x0000 }, { 2199, 0x0040 }, { 2200, 0x95c4 },
+  /* 0x6200 */
+  { 2207, 0x7581 }, { 2214, 0x8447 }, { 2220, 0x4402 }, { 2223, 0xc053 },
+  { 2229, 0x2b83 }, { 2236, 0x0108 }, { 2238, 0x4000 }, { 2239, 0x9242 },
+  { 2244, 0x0611 }, { 2248, 0x09a6 }, { 2254, 0x0800 }, { 2255, 0x3222 },
+  { 2260, 0xb384 }, { 2267, 0x1bdd }, { 2277, 0xf000 }, { 2281, 0xc08a },
+  /* 0x6300 */
+  { 2286, 0x0282 }, { 2289, 0x0002 }, { 2290, 0x8800 }, { 2292, 0x6c00 },
+  { 2296, 0x9200 }, { 2299, 0x0021 }, { 2301, 0x4180 }, { 2304, 0x8c84 },
+  { 2309, 0x1308 }, { 2313, 0x0944 }, { 2317, 0x07a7 }, { 2325, 0x0000 },
+  { 2325, 0x8051 }, { 2329, 0x0c41 }, { 2333, 0x6002 }, { 2336, 0x00d0 },
+  /* 0x6400 */
+  { 2339, 0xa000 }, { 2341, 0x10d0 }, { 2345, 0x3004 }, { 2348, 0x4400 },
+  { 2350, 0x0000 }, { 2350, 0x0100 }, { 2351, 0x8201 }, { 2354, 0x0700 },
+  { 2357, 0x0100 }, { 2358, 0x440e }, { 2363, 0x6830 }, { 2368, 0x0805 },
+  { 2371, 0x64b2 }, { 2378, 0x0514 }, { 2382, 0x10e6 }, { 2388, 0x4414 },
+  /* 0x6500 */
+  { 2392, 0x0011 }, { 2394, 0x2100 }, { 2396, 0x9c08 }, { 2401, 0xcbc0 },
+  { 2408, 0xe120 }, { 2413, 0x40c2 }, { 2417, 0x304c }, { 2422, 0x41b4 },
+  { 2428, 0x10ac }, { 2433, 0x9a83 }, { 2440, 0x98b2 }, { 2447, 0x3281 },
+  { 2452, 0x9822 }, { 2457, 0x0084 }, { 2459, 0x3369 }, { 2467, 0xbc12 },
+  /* 0x6600 */
+  { 2474, 0xd6c0 }, { 2481, 0xc03b }, { 2488, 0xa1a1 }, { 2494, 0x0c53 },
+  { 2500, 0x8a1e }, { 2507, 0xea00 }, { 2512, 0xcbf0 }, { 2521, 0x05d8 },
+  { 2527, 0x4390 }, { 2532, 0x21c3 }, { 2538, 0x4805 }, { 2542, 0x4a1c },
+  { 2548, 0x02d0 }, { 2552, 0x3240 }, { 2556, 0x0041 }, { 2558, 0xd79d },
+  /* 0x6700 */
+  { 2569, 0x2b09 }, { 2575, 0xe8b0 }, { 2582, 0x7dc0 }, { 2590, 0x2452 },
+  { 2595, 0xc240 }, { 2599, 0xd04b }, { 2606, 0xa000 }, { 2608, 0xc8ab },
+  { 2616, 0x8a80 }, { 2620, 0x34a9 }, { 2627, 0x8000 }, { 2628, 0x41c9 },
+  { 2634, 0x8010 }, { 2636, 0x241f }, { 2643, 0x9200 }, { 2646, 0x487b },
+  /* 0x6800 */
+  { 2654, 0x0000 }, { 2654, 0x00cc }, { 2658, 0x8406 }, { 2662, 0x3300 },
+  { 2666, 0x410f }, { 2672, 0x001b }, { 2676, 0x2000 }, { 2677, 0x8040 },
+  { 2679, 0x8022 }, { 2682, 0xa098 }, { 2687, 0xa186 }, { 2693, 0x006b },
+  { 2698, 0x2a30 }, { 2703, 0x85a4 }, { 2709, 0x4181 }, { 2713, 0x0604 },
+  /* 0x6900 */
+  { 2716, 0x6021 }, { 2720, 0x0004 }, { 2721, 0x0080 }, { 2722, 0xa001 },
+  { 2725, 0x0400 }, { 2726, 0x46b8 }, { 2733, 0xe90f }, { 2742, 0x03a0 },
+  { 2746, 0x0000 }, { 2746, 0x1820 }, { 2749, 0x40a0 }, { 2752, 0x0810 },
+  { 2754, 0x380a }, { 2759, 0x0001 }, { 2760, 0x0500 }, { 2762, 0xa800 },
+  /* 0x6a00 */
+  { 2765, 0x0404 }, { 2767, 0xc28a }, { 2773, 0x000a }, { 2775, 0x2720 },
+  { 2780, 0x0910 }, { 2783, 0x830c }, { 2788, 0x0802 }, { 2790, 0x0000 },
+  { 2790, 0x6211 }, { 2795, 0x1080 }, { 2797, 0x000c }, { 2799, 0x0808 },
+  { 2801, 0x000c }, { 2803, 0x0c08 }, { 2806, 0x0000 }, { 2806, 0x0840 },
+  /* 0x6b00 */
+  { 2808, 0x1410 }, { 2811, 0x0044 }, { 2813, 0x000b }, { 2816, 0x6404 },
+  { 2820, 0x50c0 }, { 2824, 0x8001 }, { 2826, 0x047e }, { 2833, 0x8984 },
+  { 2838, 0x0658 }, { 2843, 0x4140 }, { 2846, 0xc000 }, { 2848, 0x94a4 },
+  { 2854, 0xa862 }, { 2860, 0x09dc }, { 2867, 0x1800 }, { 2869, 0x0000 },
+  /* 0x6c00 */
+  { 2869, 0x8100 }, { 2871, 0x000a }, { 2873, 0x0008 }, { 2874, 0x4190 },
+  { 2878, 0x4007 }, { 2882, 0xe4a1 }, { 2889, 0x2501 }, { 2893, 0x6445 },
+  { 2899, 0x11ee }, { 2907, 0x0e7d }, { 2916, 0x4800 }, { 2918, 0xfb08 },
+  { 2926, 0x1616 }, { 2932, 0x08a8 }, { 2936, 0xc92e }, { 2944, 0x0009 },
+  /* 0x6d00 */
+  { 2946, 0x1800 }, { 2948, 0x4a82 }, { 2953, 0x06a0 }, { 2957, 0x6b64 },
+  { 2965, 0x0002 }, { 2966, 0x1600 }, { 2969, 0x5648 }, { 2975, 0x8390 },
+  { 2980, 0x73a0 }, { 2987, 0x002a }, { 2990, 0x8000 }, { 2991, 0x0024 },
+  { 2993, 0x88f9 }, { 3001, 0x4702 }, { 3006, 0x4d02 }, { 3011, 0x0faa },
+  /* 0x6e00 */
+  { 3019, 0x0000 }, { 3019, 0x8e80 }, { 3024, 0xb87b }, { 3034, 0x7554 },
+  { 3042, 0x2418 }, { 3046, 0xd940 }, { 3052, 0xc880 }, { 3056, 0x040c },
+  { 3059, 0x0000 }, { 3059, 0xb041 }, { 3064, 0x8c24 }, { 3069, 0x0442 },
+  { 3072, 0x5a34 }, { 3079, 0x001a }, { 3082, 0x8000 }, { 3083, 0xc110 },
+  /* 0x6f00 */
+  { 3087, 0x8046 }, { 3091, 0x0032 }, { 3094, 0x180d }, { 3099, 0x8106 },
+  { 3103, 0x0002 }, { 3104, 0xcd92 }, { 3112, 0x6014 }, { 3116, 0x7401 },
+  { 3121, 0x6112 }, { 3126, 0x0091 }, { 3129, 0xc098 }, { 3134, 0x420a },
+  { 3138, 0x040f }, { 3143, 0x8420 }, { 3146, 0x9a13 }, { 3153, 0x4002 },
+  /* 0x7000 */
+  { 3155, 0x8a62 }, { 3161, 0xfd22 }, { 3170, 0x8188 }, { 3174, 0x4080 },
+  { 3176, 0x1000 }, { 3177, 0x2103 }, { 3181, 0x0808 }, { 3183, 0x3101 },
+  { 3187, 0x4420 }, { 3190, 0x0704 }, { 3194, 0xb812 }, { 3200, 0x0388 },
+  { 3204, 0x8900 }, { 3207, 0xa300 }, { 3211, 0x0000 }, { 3211, 0x2202 },
+  /* 0x7100 */
+  { 3214, 0x1210 }, { 3217, 0x4600 }, { 3220, 0x0042 }, { 3222, 0x0041 },
+  { 3224, 0x5680 }, { 3229, 0x5241 }, { 3234, 0x52f0 }, { 3241, 0x2000 },
+  { 3242, 0x8610 }, { 3246, 0x8214 }, { 3250, 0x1004 }, { 3252, 0x4602 },
+  { 3256, 0x430a }, { 3261, 0x8035 }, { 3266, 0x60e0 }, { 3271, 0xd800 },
+  /* 0x7200 */
+  { 3275, 0x0041 }, { 3277, 0x0801 }, { 3279, 0x3400 }, { 3282, 0x6c65 },
+  { 3290, 0x11c1 }, { 3295, 0xab04 }, { 3301, 0x0286 }, { 3305, 0x2204 },
+  { 3308, 0x0003 }, { 3310, 0x0000 }, { 3310, 0x9084 }, { 3314, 0x0000 },
+  { 3314, 0x4015 }, { 3318, 0x0281 }, { 3321, 0x0202 }, { 3323, 0x3300 },
+  /* 0x7300 */
+  { 3327, 0x0400 }, { 3328, 0x3840 }, { 3332, 0x0e20 }, { 3336, 0xc0c0 },
+  { 3340, 0x0030 }, { 3342, 0x0085 }, { 3345, 0x0500 }, { 3347, 0x0d25 },
+  { 3353, 0x4ad0 }, { 3359, 0x81d0 }, { 3364, 0x2280 }, { 3367, 0x020c },
+  { 3370, 0xb605 }, { 3377, 0x6240 }, { 3381, 0x2679 }, { 3389, 0x6280 },
+  /* 0x7400 */
+  { 3393, 0x02ea }, { 3399, 0x0808 }, { 3401, 0xdd67 }, { 3412, 0x8579 },
+  { 3420, 0x081b }, { 3425, 0xdea0 }, { 3433, 0x8735 }, { 3441, 0x4000 },
+  { 3442, 0x0a8c }, { 3447, 0xd100 }, { 3451, 0x05aa }, { 3457, 0xa225 },
+  { 3463, 0x8440 }, { 3466, 0x1510 }, { 3470, 0x404d }, { 3475, 0x0080 },
+  /* 0x7500 */
+  { 3476, 0x0012 }, { 3478, 0x8d22 }, { 3484, 0x1968 }, { 3490, 0x058f },
+  { 3497, 0x9080 }, { 3500, 0x3a1a }, { 3507, 0x8464 }, { 3512, 0x8561 },
+  { 3518, 0xccc0 }, { 3524, 0x2002 }, { 3526, 0x0820 }, { 3528, 0x732e },
+  { 3537, 0x20a4 }, { 3541, 0x0b34 }, { 3547, 0x0004 }, { 3548, 0x1415 },
+  /* 0x7600 */
+  { 3553, 0x2001 }, { 3555, 0x8200 }, { 3557, 0x0057 }, { 3562, 0x0800 },
+  { 3563, 0x5004 }, { 3566, 0x0044 }, { 3568, 0x1212 }, { 3572, 0x7905 },
+  { 3579, 0x40d0 }, { 3583, 0x0009 }, { 3585, 0x4000 }, { 3586, 0x8400 },
+  { 3588, 0x054c }, { 3593, 0xd844 }, { 3599, 0x409a }, { 3604, 0x5114 },
+  /* 0x7700 */
+  { 3609, 0x0b12 }, { 3614, 0x4000 }, { 3615, 0x0201 }, { 3617, 0x1580 },
+  { 3621, 0x2001 }, { 3623, 0x0800 }, { 3624, 0x084a }, { 3628, 0xc200 },
+  { 3631, 0x0800 }, { 3632, 0x4002 }, { 3634, 0x3020 }, { 3637, 0x9809 },
+  { 3642, 0x0000 }, { 3642, 0x1880 }, { 3645, 0xe22c }, { 3652, 0x0008 },
+  /* 0x7800 */
+  { 3653, 0x0004 }, { 3654, 0x0004 }, { 3655, 0x10e0 }, { 3659, 0x0014 },
+  { 3661, 0x8020 }, { 3663, 0x2000 }, { 3664, 0x9800 }, { 3667, 0x1000 },
+  { 3668, 0x7082 }, { 3673, 0x0082 }, { 3675, 0x0288 }, { 3678, 0x1c00 },
+  { 3681, 0x4c22 }, { 3686, 0x0001 }, { 3687, 0x9100 }, { 3690, 0x0820 },
+  /* 0x7900 */
+  { 3692, 0x4002 }, { 3694, 0x0040 }, { 3695, 0x1c00 }, { 3698, 0x4400 },
+  { 3700, 0x0383 }, { 3705, 0x7cc1 }, { 3713, 0x2121 }, { 3717, 0x8400 },
+  { 3719, 0xe002 }, { 3723, 0x0002 }, { 3724, 0x44c0 }, { 3728, 0xe20a },
+  { 3734, 0x0e03 }, { 3739, 0x8126 }, { 3744, 0x02d0 }, { 3748, 0x0800 },
+  /* 0x7a00 */
+  { 3749, 0x2921 }, { 3754, 0x9690 }, { 3760, 0x4001 }, { 3762, 0xb8c2 },
+  { 3769, 0x6241 }, { 3774, 0x0080 }, { 3775, 0x0a06 }, { 3779, 0xa651 },
+  { 3786, 0x0112 }, { 3789, 0x812c }, { 3794, 0xc600 }, { 3798, 0x0400 },
+  { 3799, 0x0cb0 }, { 3804, 0xa280 }, { 3808, 0xa429 }, { 3814, 0x8640 },
+  /* 0x7b00 */
+  { 3818, 0x8000 }, { 3819, 0x4a02 }, { 3823, 0x3041 }, { 3827, 0x0200 },
+  { 3828, 0xba40 }, { 3834, 0x0057 }, { 3839, 0x5001 }, { 3842, 0x2020 },
+  { 3844, 0x8880 }, { 3847, 0x24b0 }, { 3852, 0x2002 }, { 3854, 0x0112 },
+  { 3857, 0x02d3 }, { 3863, 0x0004 }, { 3864, 0x0211 }, { 3867, 0x0000 },
+  /* 0x7c00 */
+  { 3867, 0x0080 }, { 3868, 0x4004 }, { 3870, 0x0c82 }, { 3874, 0xe000 },
+  { 3877, 0x3008 }, { 3880, 0x0000 }, { 3880, 0x1011 }, { 3883, 0x0008 },
+  { 3884, 0x0208 }, { 3886, 0x81a4 }, { 3891, 0x40a0 }, { 3894, 0x420e },
+  { 3899, 0x0400 }, { 3900, 0xc040 }, { 3903, 0x0081 }, { 3905, 0x4800 },
+  /* 0x7d00 */
+  { 3907, 0x2df5 }, { 3917, 0x0f91 }, { 3924, 0xd807 }, { 3931, 0x0629 },
+  { 3936, 0x007c }, { 3941, 0x4001 }, { 3943, 0x4546 }, { 3949, 0x824e },
+  { 3955, 0xc000 }, { 3957, 0x1008 }, { 3959, 0x3005 }, { 3963, 0xed36 },
+  { 3973, 0x0c80 }, { 3976, 0x6540 }, { 3981, 0x930b }, { 3988, 0x0810 },
+  /* 0x7e00 */
+  { 3990, 0x0600 }, { 3992, 0xe820 }, { 3997, 0xc80a }, { 4002, 0x6082 },
+  { 4006, 0x00ca }, { 4010, 0x4034 }, { 4014, 0x2e02 }, { 4019, 0x1201 },
+  { 4022, 0x9004 }, { 4025, 0x1948 }, { 4030, 0x0000 }, { 4030, 0x0000 },
+  { 4030, 0x0000 }, { 4030, 0x0000 }, { 4030, 0x0000 }, { 4030, 0x0000 },
+  /* 0x7f00 */
+  { 4030, 0x0000 }, { 4030, 0x0000 }, { 4030, 0x0000 }, { 4030, 0x0540 },
+  { 4033, 0x1000 }, { 4034, 0x0031 }, { 4037, 0x4c00 }, { 4040, 0x02a5 },
+  { 4045, 0x5520 }, { 4050, 0x4410 }, { 4053, 0x0310 }, { 4056, 0x2304 },
+  { 4060, 0x5422 }, { 4065, 0x8034 }, { 4069, 0x0a03 }, { 4073, 0x1201 },
+  /* 0x8000 */
+  { 4076, 0x126b }, { 4083, 0x01a1 }, { 4087, 0x2000 }, { 4088, 0xa048 },
+  { 4092, 0x0448 }, { 4095, 0x4540 }, { 4099, 0x8000 }, { 4100, 0xe08d },
+  { 4107, 0x1af0 }, { 4114, 0x2840 }, { 4117, 0x8626 }, { 4123, 0x0416 },
+  { 4127, 0x5018 }, { 4131, 0x4c00 }, { 4134, 0x0032 }, { 4137, 0x2112 },
+  /* 0x8100 */
+  { 4141, 0x05e4 }, { 4147, 0x0d00 }, { 4150, 0x8a08 }, { 4154, 0x4200 },
+  { 4156, 0x4800 }, { 4158, 0x0033 }, { 4162, 0x0860 }, { 4165, 0x8703 },
+  { 4171, 0x8501 }, { 4175, 0x3400 }, { 4178, 0x0109 }, { 4181, 0xe428 },
+  { 4187, 0x2045 }, { 4191, 0x8100 }, { 4193, 0x25a8 }, { 4199, 0x5c18 },
+  /* 0x8200 */
+  { 4205, 0x35a0 }, { 4211, 0xd804 }, { 4216, 0x1c02 }, { 4220, 0x02e0 },
+  { 4224, 0x00a1 }, { 4227, 0x0200 }, { 4228, 0xc050 }, { 4232, 0x4146 },
+  { 4237, 0x6800 }, { 4240, 0xa604 }, { 4245, 0xf260 }, { 4252, 0xbb8a },
+  { 4261, 0x0000 }, { 4261, 0xc8b6 }, { 4269, 0x00e2 }, { 4273, 0x6002 },
+  /* 0x8300 */
+  { 4276, 0x023e }, { 4282, 0x0080 }, { 4283, 0x8900 }, { 4286, 0x0372 },
+  { 4292, 0x8681 }, { 4297, 0x0006 }, { 4299, 0x0000 }, { 4299, 0x0888 },
+  { 4302, 0x4600 }, { 4305, 0x4140 }, { 4308, 0x0e04 }, { 4312, 0x2000 },
+  { 4313, 0x1622 }, { 4318, 0x1048 }, { 4321, 0x8a00 }, { 4324, 0x2217 },
+  /* 0x8400 */
+  { 4330, 0x7418 }, { 4336, 0x0000 }, { 4336, 0x1200 }, { 4338, 0x2102 },
+  { 4341, 0x0200 }, { 4342, 0x0880 }, { 4344, 0x984a }, { 4350, 0x0420 },
+  { 4352, 0x0000 }, { 4352, 0x1211 }, { 4356, 0x0002 }, { 4357, 0x9904 },
+  { 4362, 0x2a55 }, { 4369, 0x0402 }, { 4371, 0x5000 }, { 4373, 0x1010 },
+  /* 0x8500 */
+  { 4375, 0x0000 }, { 4375, 0x459a }, { 4382, 0xb02a }, { 4388, 0xa000 },
+  { 4390, 0x420a }, { 4394, 0x0208 }, { 4396, 0x2708 }, { 4401, 0x0000 },
+  { 4401, 0x8090 }, { 4404, 0x0812 }, { 4407, 0x8740 }, { 4412, 0x0401 },
+  { 4414, 0xe202 }, { 4419, 0x3020 }, { 4422, 0x0630 }, { 4426, 0x8c80 },
+  /* 0x8600 */
+  { 4430, 0x04c4 }, { 4434, 0x04c0 }, { 4437, 0x2000 }, { 4438, 0x8000 },
+  { 4439, 0x4000 }, { 4440, 0xd831 }, { 4447, 0x0080 }, { 4448, 0x0200 },
+  { 4449, 0x1400 }, { 4451, 0x0008 }, { 4452, 0x0218 }, { 4455, 0x0000 },
+  { 4455, 0x0880 }, { 4457, 0x8a10 }, { 4461, 0x2010 }, { 4463, 0x4000 },
+  /* 0x8700 */
+  { 4464, 0x010d }, { 4468, 0x1500 }, { 4471, 0x0000 }, { 4471, 0x0000 },
+  { 4471, 0x4000 }, { 4472, 0x80a0 }, { 4475, 0x0140 }, { 4477, 0x0150 },
+  { 4480, 0x2004 }, { 4482, 0x8000 }, { 4483, 0x0004 }, { 4484, 0x0408 },
+  { 4486, 0x0010 }, { 4487, 0x0000 }, { 4487, 0x9001 }, { 4490, 0x4a04 },
+  /* 0x8800 */
+  { 4494, 0x0020 }, { 4495, 0x8000 }, { 4496, 0x000c }, { 4498, 0x0842 },
+  { 4501, 0x3041 }, { 4505, 0x2a8c }, { 4511, 0x090e }, { 4516, 0xc085 },
+  { 4521, 0x2906 }, { 4526, 0x40c4 }, { 4530, 0x0800 }, { 4531, 0x0010 },
+  { 4532, 0x8006 }, { 4535, 0xb230 }, { 4541, 0x0102 }, { 4543, 0x2138 },
+  /* 0x8900 */
+  { 4548, 0x0080 }, { 4549, 0x030d }, { 4554, 0x0420 }, { 4556, 0x0940 },
+  { 4559, 0x0012 }, { 4561, 0x8000 }, { 4562, 0x0410 }, { 4564, 0x8004 },
+  { 4566, 0x88ca }, { 4572, 0x0048 }, { 4574, 0x0602 }, { 4577, 0x2404 },
+  { 4580, 0x0001 }, { 4581, 0x0004 }, { 4582, 0x0008 }, { 4583, 0x0110 },
+  /* 0x8a00 */
+  { 4585, 0x550d }, { 4592, 0xa9c8 }, { 4599, 0x2428 }, { 4603, 0x0c52 },
+  { 4608, 0x0000 }, { 4608, 0x4831 }, { 4613, 0x624d }, { 4620, 0x022f },
+  { 4626, 0x30a0 }, { 4630, 0x4128 }, { 4634, 0x057b }, { 4642, 0xd205 },
+  { 4648, 0xa894 }, { 4654, 0x1844 }, { 4658, 0x6cc2 }, { 4665, 0x45c2 },
+  /* 0x8b00 */
+  { 4671, 0x4017 }, { 4676, 0x2ed1 }, { 4684, 0x1901 }, { 4688, 0x0208 },
+  { 4690, 0xc202 }, { 4694, 0x1500 }, { 4697, 0x9040 }, { 4700, 0x2091 },
+  { 4704, 0x0401 }, { 4706, 0x044d }, { 4711, 0x0000 }, { 4711, 0x0000 },
+  { 4711, 0x0000 }, { 4711, 0x0000 }, { 4711, 0x0000 }, { 4711, 0x0000 },
+  /* 0x8c00 */
+  { 4711, 0x0000 }, { 4711, 0x0000 }, { 4711, 0x0000 }, { 4711, 0x8080 },
+  { 4713, 0x1542 }, { 4718, 0x0420 }, { 4720, 0x0c02 }, { 4723, 0x0600 },
+  { 4725, 0x1404 }, { 4728, 0x6000 }, { 4730, 0x9f87 }, { 4740, 0xb9d9 },
+  { 4750, 0x059f }, { 4758, 0x540a }, { 4763, 0x245d }, { 4770, 0x3810 },
+  /* 0x8d00 */
+  { 4774, 0x25b0 }, { 4780, 0x0048 }, { 4782, 0x0000 }, { 4782, 0x0000 },
+  { 4782, 0x0000 }, { 4782, 0x0000 }, { 4782, 0x0850 }, { 4785, 0x0099 },
+  { 4789, 0x0420 }, { 4791, 0x0200 }, { 4792, 0x0108 }, { 4794, 0x4408 },
+  { 4797, 0x9840 }, { 4801, 0x2800 }, { 4803, 0x810a }, { 4807, 0x0008 },
+  /* 0x8e00 */
+  { 4808, 0x8400 }, { 4810, 0x4001 }, { 4812, 0x0400 }, { 4813, 0x0021 },
+  { 4815, 0x0794 }, { 4821, 0x8200 }, { 4823, 0x0001 }, { 4824, 0x0050 },
+  { 4826, 0x2482 }, { 4830, 0x0000 }, { 4830, 0x1c00 }, { 4833, 0x0000 },
+  { 4833, 0x3c01 }, { 4838, 0x8004 }, { 4840, 0x0800 }, { 4841, 0x4900 },
+  /* 0x8f00 */
+  { 4844, 0x0228 }, { 4847, 0xf83c }, { 4856, 0x86c0 }, { 4861, 0xcb08 },
+  { 4867, 0x6230 }, { 4872, 0xa000 }, { 4874, 0x0004 }, { 4875, 0x0000 },
+  { 4875, 0x0000 }, { 4875, 0x1800 }, { 4877, 0xa148 }, { 4882, 0x0007 },
+  { 4885, 0x4024 }, { 4888, 0x0012 }, { 4890, 0x2c40 }, { 4894, 0x2285 },
+  /* 0x9000 */
+  { 4899, 0xa96f }, { 4909, 0xe6b3 }, { 4919, 0x400f }, { 4924, 0x5126 },
+  { 4930, 0x6c86 }, { 4937, 0x723b }, { 4946, 0xe20b }, { 4953, 0xb5a4 },
+  { 4961, 0x859f }, { 4970, 0x0222 }, { 4973, 0x854c }, { 4979, 0x0123 },
+  { 4983, 0x0402 }, { 4985, 0x4000 }, { 4986, 0x2102 }, { 4989, 0x2020 },
+  /* 0x9100 */
+  { 4991, 0x0004 }, { 4992, 0x0224 }, { 4995, 0x2080 }, { 4997, 0x0004 },
+  { 4998, 0x7e00 }, { 5004, 0x0004 }, { 5005, 0x1604 }, { 5009, 0x01a0 },
+  { 5012, 0x2a80 }, { 5016, 0x1004 }, { 5018, 0xd800 }, { 5022, 0x0032 },
+  { 5025, 0xfa81 }, { 5033, 0x3183 }, { 5039, 0x0488 }, { 5042, 0x0020 },
+  /* 0x9200 */
+  { 5043, 0x2000 }, { 5044, 0x4087 }, { 5049, 0x0000 }, { 5049, 0x8410 },
+  { 5052, 0x0221 }, { 5055, 0x4880 }, { 5058, 0x0074 }, { 5062, 0x0000 },
+  { 5062, 0x0029 }, { 5065, 0x114a }, { 5070, 0x0000 }, { 5070, 0x02c8 },
+  { 5074, 0x9000 }, { 5076, 0x0004 }, { 5077, 0x0410 }, { 5079, 0x1100 },
+  /* 0x9300 */
+  { 5081, 0x0010 }, { 5082, 0xc501 }, { 5087, 0xc957 }, { 5096, 0x0000 },
+  { 5096, 0x2d00 }, { 5100, 0x0810 }, { 5102, 0x4000 }, { 5103, 0x5020 },
+  { 5106, 0x1000 }, { 5107, 0x0450 }, { 5110, 0x3088 }, { 5114, 0x0001 },
+  { 5115, 0x0008 }, { 5116, 0x4002 }, { 5118, 0x0012 }, { 5120, 0x0040 },
+  /* 0x9400 */
+  { 5121, 0x0010 }, { 5122, 0x0100 }, { 5123, 0x0820 }, { 5125, 0x0120 },
+  { 5127, 0x0010 }, { 5128, 0x0806 }, { 5131, 0x0000 }, { 5131, 0xa000 },
+  { 5133, 0x0000 }, { 5133, 0x0000 }, { 5133, 0x0000 }, { 5133, 0x0000 },
+  { 5133, 0x0000 }, { 5133, 0x0000 }, { 5133, 0x0000 }, { 5133, 0x0000 },
+  /* 0x9500 */
+  { 5133, 0x0000 }, { 5133, 0x0000 }, { 5133, 0x0000 }, { 5133, 0x0000 },
+  { 5133, 0x0000 }, { 5133, 0x0000 }, { 5133, 0x0000 }, { 5133, 0x0080 },
+  { 5134, 0x8a09 }, { 5139, 0x011e }, { 5144, 0x2138 }, { 5149, 0x1802 },
+  { 5152, 0x0480 }, { 5154, 0x1070 }, { 5158, 0x0006 }, { 5160, 0x0000 },
+  /* 0x9600 */
+  { 5160, 0x0000 }, { 5160, 0x1000 }, { 5161, 0x4402 }, { 5164, 0x8804 },
+  { 5167, 0x3815 }, { 5173, 0xf801 }, { 5179, 0x041c }, { 5183, 0x21e9 },
+  { 5190, 0x6c60 }, { 5196, 0x1b30 }, { 5202, 0x0588 }, { 5206, 0x0882 },
+  { 5209, 0x7af3 }, { 5220, 0x1a60 }, { 5225, 0x870c }, { 5231, 0x0ac5 },
+  /* 0x9700 */
+  { 5237, 0x00c1 }, { 5240, 0x524a }, { 5246, 0x0080 }, { 5247, 0x2205 },
+  { 5251, 0x0114 }, { 5254, 0x5042 }, { 5258, 0x2206 }, { 5262, 0x0490 },
+  { 5265, 0xa800 }, { 5268, 0x0000 }, { 5268, 0x2901 }, { 5272, 0x0000 },
+  { 5272, 0x0840 }, { 5274, 0x1008 }, { 5276, 0x0000 }, { 5276, 0x8848 },
+  /* 0x9800 */
+  { 5280, 0x156f }, { 5289, 0x018f }, { 5295, 0x2000 }, { 5296, 0x0b01 },
+  { 5300, 0x7040 }, { 5304, 0x4510 }, { 5308, 0x88a0 }, { 5312, 0x0000 },
+  { 5312, 0x0000 }, { 5312, 0x0000 }, { 5312, 0x8100 }, { 5314, 0x0002 },
+  { 5315, 0x0090 }, { 5317, 0x9800 }, { 5320, 0xe006 }, { 5325, 0x7010 },
+  /* 0x9900 */
+  { 5329, 0x1608 }, { 5333, 0x4109 }, { 5337, 0x0101 }, { 5339, 0x0000 },
+  { 5339, 0x3a20 }, { 5344, 0x0096 }, { 5348, 0x0000 }, { 5348, 0x0000 },
+  { 5348, 0x0000 }, { 5348, 0x2240 }, { 5351, 0x7120 }, { 5356, 0x021a },
+  { 5360, 0x0002 }, { 5361, 0xa227 }, { 5368, 0x2000 }, { 5369, 0x8002 },
+  /* 0x9a00 */
+  { 5371, 0xc102 }, { 5375, 0x0200 }, { 5376, 0x0800 }, { 5377, 0x00c1 },
+  { 5380, 0x2029 }, { 5384, 0x8ca0 }, { 5389, 0x0624 }, { 5393, 0x0000 },
+  { 5393, 0x0000 }, { 5393, 0x0000 }, { 5393, 0x0100 }, { 5394, 0x0100 },
+  { 5395, 0x0000 }, { 5395, 0x0118 }, { 5398, 0x4020 }, { 5400, 0x0000 },
+  /* 0x9b00 */
+  { 5400, 0x0000 }, { 5400, 0x0400 }, { 5401, 0x0480 }, { 5403, 0x1002 },
+  { 5405, 0x803e }, { 5411, 0x0410 }, { 5413, 0x8000 }, { 5414, 0x0000 },
+  { 5414, 0x4000 }, { 5415, 0x8002 }, { 5417, 0x4800 }, { 5419, 0x0000 },
+  { 5419, 0x0200 }, { 5420, 0x0040 }, { 5421, 0x0110 }, { 5423, 0x0000 },
+  /* 0x9c00 */
+  { 5423, 0x2000 }, { 5424, 0x0025 }, { 5427, 0x0020 }, { 5428, 0x0804 },
+  { 5430, 0x0280 }, { 5432, 0x0080 }, { 5433, 0x0000 }, { 5433, 0x0000 },
+  { 5433, 0x0000 }, { 5433, 0x0000 }, { 5433, 0x0000 }, { 5433, 0x0000 },
+  { 5433, 0x0000 }, { 5433, 0x0000 }, { 5433, 0x02a0 }, { 5436, 0x0058 },
+  /* 0x9d00 */
+  { 5439, 0x0200 }, { 5440, 0x0800 }, { 5441, 0x0140 }, { 5443, 0x0800 },
+  { 5444, 0x0000 }, { 5444, 0x2002 }, { 5446, 0x1003 }, { 5449, 0x0004 },
+  { 5450, 0x0000 }, { 5450, 0x0000 }, { 5450, 0x8200 }, { 5452, 0x0010 },
+  { 5453, 0x0010 }, { 5454, 0x0080 }, { 5455, 0x0000 }, { 5455, 0x0704 },
+  /* 0x9e00 */
+  { 5459, 0x0000 }, { 5459, 0x4400 }, { 5461, 0x0000 }, { 5461, 0x0000 },
+  { 5461, 0x0000 }, { 5461, 0x0000 }, { 5461, 0x0000 }, { 5461, 0xa220 },
+  { 5465, 0x0000 }, { 5465, 0xa08c }, { 5470, 0x0020 }, { 5471, 0x4830 },
+  { 5475, 0x6008 }, { 5478, 0x5912 }, { 5484, 0x0100 }, { 5485, 0x0010 },
+  /* 0x9f00 */
+  { 5486, 0x4180 }, { 5489, 0x0008 }, { 5490, 0x0001 }, { 5491, 0x0800 },
+  { 5492, 0x4c00 }, { 5495, 0x8004 }, { 5497, 0x1482 }, { 5501, 0x0080 },
+  { 5502, 0x2000 }, { 5503, 0x1021 },
+};
+static const Summary16 ksc5601_uni2indx_pageac[698] = {
+  /* 0xac00 */
+  { 5506, 0x0793 }, { 5513, 0x3eff }, { 5526, 0xb011 }, { 5531, 0x1303 },
+  { 5536, 0x2801 }, { 5539, 0x1110 }, { 5542, 0x0000 }, { 5542, 0x0593 },
+  { 5548, 0x1e7b }, { 5558, 0xb011 }, { 5563, 0x9703 }, { 5570, 0x3b01 },
+  { 5576, 0x1112 }, { 5580, 0x00a0 }, { 5582, 0x9593 }, { 5590, 0x306b },
+  /* 0xad00 */
+  { 5597, 0xb051 }, { 5603, 0x1102 }, { 5606, 0x3201 }, { 5610, 0x1130 },
+  { 5614, 0x02b0 }, { 5618, 0x0111 }, { 5621, 0x300a }, { 5625, 0xb879 },
+  { 5634, 0x1306 }, { 5639, 0x3001 }, { 5642, 0x0010 }, { 5643, 0x0080 },
+  { 5644, 0x0113 }, { 5648, 0x100b }, { 5652, 0x0011 }, { 5654, 0x9300 },
+  /* 0xae00 */
+  { 5658, 0x2b03 }, { 5664, 0x0010 }, { 5665, 0x0000 }, { 5665, 0x0593 },
+  { 5671, 0x746b }, { 5680, 0xb051 }, { 5686, 0x1323 }, { 5692, 0x3b01 },
+  { 5698, 0x1030 }, { 5701, 0x0000 }, { 5701, 0x0000 }, { 5701, 0x7000 },
+  { 5704, 0xb011 }, { 5709, 0x1303 }, { 5714, 0x2900 }, { 5717, 0x1110 },
+  /* 0xaf00 */
+  { 5720, 0x2180 }, { 5723, 0x0001 }, { 5724, 0x3000 }, { 5726, 0xb015 },
+  { 5732, 0x030e }, { 5737, 0x3001 }, { 5740, 0x0030 }, { 5742, 0x0200 },
+  { 5743, 0x0111 }, { 5746, 0x1023 }, { 5750, 0x0000 }, { 5750, 0x1300 },
+  { 5753, 0x6b81 }, { 5760, 0x1010 }, { 5762, 0x0300 }, { 5764, 0x0113 },
+  /* 0xb000 */
+  { 5768, 0x1013 }, { 5772, 0x3011 }, { 5776, 0x0100 }, { 5777, 0x0000 },
+  { 5777, 0x5530 }, { 5783, 0x22b8 }, { 5789, 0x0000 }, { 5789, 0x3000 },
+  { 5791, 0xb011 }, { 5796, 0x9702 }, { 5802, 0xfb07 }, { 5812, 0x113a },
+  { 5818, 0x03b0 }, { 5823, 0x0113 }, { 5827, 0x0021 }, { 5829, 0x0000 },
+  /* 0xb100 */
+  { 5829, 0x1b00 }, { 5833, 0x3b0d }, { 5841, 0x1138 }, { 5846, 0x03b0 },
+  { 5851, 0x0113 }, { 5855, 0x1133 }, { 5861, 0x0001 }, { 5862, 0x1300 },
+  { 5865, 0x2b05 }, { 5871, 0x111c }, { 5876, 0x0100 }, { 5877, 0x0000 },
+  { 5877, 0x1000 }, { 5878, 0xb011 }, { 5883, 0x1300 }, { 5886, 0x2a01 },
+  /* 0xb200 */
+  { 5890, 0x1930 }, { 5895, 0x02b0 }, { 5899, 0x0001 }, { 5900, 0x1010 },
+  { 5902, 0x0000 }, { 5902, 0x1100 }, { 5904, 0x0301 }, { 5907, 0x1030 },
+  { 5910, 0x0230 }, { 5913, 0x0713 }, { 5919, 0x146b }, { 5926, 0x0011 },
+  { 5928, 0x1300 }, { 5931, 0x2b05 }, { 5937, 0xf974 }, { 5947, 0x8fb8 },
+  /* 0xb300 */
+  { 5956, 0x0113 }, { 5960, 0x103b }, { 5966, 0x0000 }, { 5966, 0x0000 },
+  { 5966, 0x0000 }, { 5966, 0xd970 }, { 5974, 0x4ab0 }, { 5980, 0x0113 },
+  { 5984, 0x103b }, { 5990, 0x0011 }, { 5992, 0x1103 }, { 5996, 0x0000 },
+  { 5996, 0x5930 }, { 6002, 0x2ab1 }, { 6009, 0x0111 }, { 6012, 0x1000 },
+  /* 0xb400 */
+  { 6013, 0x0000 }, { 6013, 0x1101 }, { 6016, 0x0b01 }, { 6020, 0x0010 },
+  { 6021, 0x0000 }, { 6021, 0x0113 }, { 6025, 0x102b }, { 6030, 0x0000 },
+  { 6030, 0x0101 }, { 6032, 0x2000 }, { 6033, 0x1110 }, { 6036, 0x02a0 },
+  { 6039, 0x0111 }, { 6042, 0x3021 }, { 6046, 0xb059 }, { 6053, 0x0102 },
+  /* 0xb500 */
+  { 6055, 0x0000 }, { 6055, 0x1930 }, { 6060, 0x07b0 }, { 6066, 0x0113 },
+  { 6070, 0x383b }, { 6078, 0xb011 }, { 6083, 0x0003 }, { 6085, 0x0000 },
+  { 6085, 0x0000 }, { 6085, 0x0000 }, { 6085, 0x0d13 }, { 6091, 0x383b },
+  { 6099, 0xb011 }, { 6104, 0x0103 }, { 6107, 0x1000 }, { 6108, 0x0000 },
+  /* 0xb600 */
+  { 6108, 0x0000 }, { 6108, 0x0113 }, { 6112, 0x1020 }, { 6114, 0x0010 },
+  { 6115, 0x0100 }, { 6116, 0x0000 }, { 6116, 0x0110 }, { 6118, 0x0000 },
+  { 6118, 0x0000 }, { 6118, 0x3000 }, { 6120, 0x1811 }, { 6124, 0x0002 },
+  { 6125, 0x0000 }, { 6125, 0x0010 }, { 6126, 0x0000 }, { 6126, 0x0111 },
+  /* 0xb700 */
+  { 6129, 0x0023 }, { 6132, 0x0000 }, { 6132, 0x9300 }, { 6136, 0x0b01 },
+  { 6140, 0x1110 }, { 6143, 0x0030 }, { 6145, 0x0111 }, { 6148, 0x302b },
+  { 6154, 0xb011 }, { 6159, 0x13c7 }, { 6167, 0x3b01 }, { 6173, 0x0130 },
+  { 6176, 0x0280 }, { 6178, 0x0000 }, { 6178, 0x3000 }, { 6180, 0xb011 },
+  /* 0xb800 */
+  { 6185, 0x1383 }, { 6191, 0x2b01 }, { 6196, 0x1130 }, { 6200, 0x03b0 },
+  { 6205, 0x0011 }, { 6207, 0x300a }, { 6211, 0xb011 }, { 6216, 0x1102 },
+  { 6219, 0x2000 }, { 6220, 0x0000 }, { 6220, 0x0100 }, { 6221, 0x0111 },
+  { 6224, 0x102b }, { 6229, 0xa011 }, { 6233, 0x1302 }, { 6237, 0x2b01 },
+  /* 0xb900 */
+  { 6242, 0x0010 }, { 6243, 0x0100 }, { 6244, 0x0001 }, { 6245, 0x3000 },
+  { 6247, 0x9011 }, { 6251, 0x1302 }, { 6255, 0x2b01 }, { 6260, 0x1130 },
+  { 6264, 0x66b0 }, { 6271, 0x0000 }, { 6271, 0x3000 }, { 6273, 0xb011 },
+  { 6278, 0xd302 }, { 6284, 0x6b07 }, { 6292, 0x113a }, { 6298, 0x07b0 },
+  /* 0xba00 */
+  { 6304, 0x0103 }, { 6307, 0x0020 }, { 6308, 0x0000 }, { 6308, 0x1300 },
+  { 6311, 0x6b05 }, { 6318, 0x1138 }, { 6323, 0x03b0 }, { 6328, 0x0113 },
+  { 6332, 0x10b8 }, { 6337, 0x0000 }, { 6337, 0x1b00 }, { 6341, 0x2b05 },
+  { 6347, 0x0110 }, { 6349, 0x0300 }, { 6351, 0x0000 }, { 6351, 0x1000 },
+  /* 0xbb00 */
+  { 6352, 0xa011 }, { 6356, 0x1102 }, { 6359, 0x0a01 }, { 6362, 0x7970 },
+  { 6370, 0xa2b0 }, { 6376, 0x0111 }, { 6379, 0x100a }, { 6382, 0x0000 },
+  { 6382, 0x1100 }, { 6384, 0x0001 }, { 6385, 0x1110 }, { 6388, 0x0090 },
+  { 6390, 0x0111 }, { 6393, 0x0009 }, { 6395, 0x0000 }, { 6395, 0x9300 },
+  /* 0xbc00 */
+  { 6399, 0xbb05 }, { 6407, 0xf9f2 }, { 6418, 0x22b0 }, { 6423, 0x0113 },
+  { 6427, 0x323b }, { 6435, 0x2001 }, { 6437, 0x0000 }, { 6437, 0x0000 },
+  { 6437, 0x5930 }, { 6443, 0x06b0 }, { 6448, 0x0193 }, { 6453, 0x303b },
+  { 6460, 0xa011 }, { 6464, 0x1123 }, { 6469, 0x0000 }, { 6469, 0x1170 },
+  /* 0xbd00 */
+  { 6474, 0x02b0 }, { 6478, 0x0011 }, { 6480, 0x1010 }, { 6482, 0x0000 },
+  { 6482, 0x1301 }, { 6486, 0x0301 }, { 6489, 0x0110 }, { 6491, 0x0000 },
+  { 6491, 0x0793 }, { 6498, 0x162b }, { 6505, 0x0010 }, { 6506, 0x0101 },
+  { 6508, 0x0000 }, { 6508, 0x1130 }, { 6512, 0x0200 }, { 6513, 0x0111 },
+  /* 0xbe00 */
+  { 6516, 0x3029 }, { 6521, 0xb011 }, { 6526, 0x0000 }, { 6526, 0x0000 },
+  { 6526, 0x5130 }, { 6531, 0x0eb0 }, { 6537, 0x0513 }, { 6542, 0x383b },
+  { 6550, 0xb011 }, { 6555, 0x0303 }, { 6559, 0x0100 }, { 6560, 0x0000 },
+  { 6560, 0x0000 }, { 6560, 0x0193 }, { 6565, 0x1039 }, { 6570, 0x0000 },
+  /* 0xbf00 */
+  { 6570, 0x0302 }, { 6573, 0x3b00 }, { 6578, 0x0000 }, { 6578, 0x0000 },
+  { 6578, 0x0113 }, { 6582, 0x0023 }, { 6585, 0x0000 }, { 6585, 0x0000 },
+  { 6585, 0x0000 }, { 6585, 0x0010 }, { 6586, 0x0000 }, { 6586, 0x0001 },
+  { 6587, 0x3020 }, { 6590, 0x9011 }, { 6594, 0x0002 }, { 6595, 0x0000 },
+  /* 0xc000 */
+  { 6595, 0x0000 }, { 6595, 0x0000 }, { 6595, 0x0000 }, { 6595, 0x1000 },
+  { 6596, 0x0000 }, { 6596, 0x1102 }, { 6599, 0x0301 }, { 6602, 0x0000 },
+  { 6602, 0x0000 }, { 6602, 0x0113 }, { 6606, 0xb02b }, { 6613, 0xb079 },
+  { 6621, 0x1323 }, { 6627, 0x3b01 }, { 6633, 0x1130 }, { 6637, 0x02b0 },
+  /* 0xc100 */
+  { 6641, 0x0111 }, { 6644, 0xf021 }, { 6650, 0xb0d9 }, { 6658, 0x1343 },
+  { 6664, 0x3b01 }, { 6670, 0x1130 }, { 6674, 0x03b0 }, { 6679, 0x0111 },
+  { 6682, 0x7020 }, { 6686, 0xb051 }, { 6692, 0x1322 }, { 6697, 0x2001 },
+  { 6699, 0x1110 }, { 6702, 0x0190 }, { 6705, 0x0111 }, { 6708, 0x300b },
+  /* 0xc200 */
+  { 6713, 0xb011 }, { 6718, 0x9302 }, { 6723, 0xab01 }, { 6729, 0x0016 },
+  { 6732, 0x0100 }, { 6733, 0x0113 }, { 6737, 0x3021 }, { 6741, 0xb011 },
+  { 6746, 0x0302 }, { 6749, 0x2901 }, { 6753, 0x3130 }, { 6758, 0x02b0 },
+  { 6762, 0x0000 }, { 6762, 0x3000 }, { 6764, 0xb819 }, { 6771, 0x1b42 },
+  /* 0xc300 */
+  { 6777, 0x3301 }, { 6782, 0x1138 }, { 6787, 0x0330 }, { 6791, 0x0000 },
+  { 6791, 0x0020 }, { 6792, 0x0000 }, { 6792, 0x1300 }, { 6795, 0x3305 },
+  { 6801, 0x1110 }, { 6804, 0x0000 }, { 6804, 0x0000 }, { 6804, 0x0000 },
+  { 6804, 0x0001 }, { 6805, 0x9300 }, { 6809, 0x2305 }, { 6814, 0x0130 },
+  /* 0xc400 */
+  { 6817, 0x0100 }, { 6818, 0x0001 }, { 6819, 0x1010 }, { 6821, 0x3011 },
+  { 6825, 0x0100 }, { 6826, 0x0000 }, { 6826, 0x1130 }, { 6830, 0x0230 },
+  { 6833, 0x0001 }, { 6834, 0x1010 }, { 6836, 0x0000 }, { 6836, 0x1100 },
+  { 6838, 0x0000 }, { 6838, 0x0000 }, { 6838, 0x0200 }, { 6839, 0x8513 },
+  /* 0xc500 */
+  { 6845, 0x1003 }, { 6848, 0x1011 }, { 6851, 0x1300 }, { 6854, 0x2b01 },
+  { 6859, 0x7730 }, { 6867, 0x63b8 }, { 6875, 0x0113 }, { 6879, 0x303b },
+  { 6886, 0xb091 }, { 6892, 0x11a2 }, { 6897, 0x0201 }, { 6899, 0x7b30 },
+  { 6907, 0x57f0 }, { 6916, 0x0113 }, { 6920, 0x702b }, { 6927, 0xf0d1 },
+  /* 0xc600 */
+  { 6935, 0x11e3 }, { 6942, 0x1b01 }, { 6947, 0x7130 }, { 6953, 0x0ab9 },
+  { 6960, 0x0113 }, { 6964, 0x303b }, { 6971, 0x9001 }, { 6974, 0x1302 },
+  { 6978, 0x2b01 }, { 6983, 0x1130 }, { 6987, 0x02b0 }, { 6991, 0x0713 },
+  { 6997, 0x302b }, { 7003, 0x3011 }, { 7007, 0x1303 }, { 7012, 0x2301 },
+  /* 0xc700 */
+  { 7016, 0x1130 }, { 7020, 0x02b0 }, { 7024, 0x0113 }, { 7028, 0x30ab },
+  { 7035, 0xb411 }, { 7041, 0x11fe }, { 7050, 0x0901 }, { 7053, 0x7130 },
+  { 7059, 0x47b8 }, { 7067, 0x05d3 }, { 7074, 0x307b }, { 7082, 0xb011 },
+  { 7087, 0x5303 }, { 7093, 0x2101 }, { 7096, 0x1110 }, { 7099, 0x0000 },
+  /* 0xc800 */
+  { 7099, 0x0513 }, { 7104, 0x306b }, { 7111, 0xb011 }, { 7116, 0x1102 },
+  { 7119, 0x3301 }, { 7124, 0x0010 }, { 7125, 0x0000 }, { 7125, 0x0513 },
+  { 7130, 0x38eb }, { 7139, 0xa010 }, { 7142, 0x0102 }, { 7144, 0x3000 },
+  { 7146, 0x1110 }, { 7149, 0x02b0 }, { 7153, 0x0013 }, { 7156, 0x3020 },
+  /* 0xc900 */
+  { 7159, 0xb071 }, { 7166, 0x0102 }, { 7168, 0x1000 }, { 7169, 0x0010 },
+  { 7170, 0x0000 }, { 7170, 0x0113 }, { 7174, 0x100b }, { 7178, 0x1011 },
+  { 7181, 0x1300 }, { 7184, 0x2b01 }, { 7189, 0x0000 }, { 7189, 0x0000 },
+  { 7189, 0x0593 }, { 7195, 0x366b }, { 7204, 0xb095 }, { 7211, 0x1303 },
+  /* 0xca00 */
+  { 7216, 0x3b01 }, { 7222, 0x0110 }, { 7224, 0x0200 }, { 7225, 0x0000 },
+  { 7225, 0x3000 }, { 7227, 0xb011 }, { 7232, 0x0103 }, { 7235, 0x2000 },
+  { 7236, 0x0010 }, { 7237, 0x0100 }, { 7238, 0x0000 }, { 7238, 0x3000 },
+  { 7240, 0xb011 }, { 7245, 0x030a }, { 7249, 0x1001 }, { 7251, 0x0010 },
+  /* 0xcb00 */
+  { 7252, 0x0100 }, { 7253, 0x0111 }, { 7256, 0x0003 }, { 7258, 0x0000 },
+  { 7258, 0x1302 }, { 7262, 0x2301 }, { 7266, 0x0010 }, { 7267, 0x0300 },
+  { 7269, 0x0000 }, { 7269, 0x1000 }, { 7270, 0x0000 }, { 7270, 0x0100 },
+  { 7271, 0x0000 }, { 7271, 0x0010 }, { 7272, 0x0290 }, { 7275, 0x0000 },
+  /* 0xcc00 */
+  { 7275, 0x3000 }, { 7277, 0x3011 }, { 7281, 0x5386 }, { 7288, 0x7b01 },
+  { 7295, 0x1130 }, { 7299, 0x03b0 }, { 7304, 0x0151 }, { 7308, 0x0021 },
+  { 7310, 0x0000 }, { 7310, 0x1300 }, { 7313, 0x3b01 }, { 7319, 0x1130 },
+  { 7323, 0x02b0 }, { 7327, 0x0011 }, { 7329, 0x1010 }, { 7331, 0x0001 },
+  /* 0xcd00 */
+  { 7332, 0x1302 }, { 7336, 0x2b01 }, { 7341, 0x1110 }, { 7344, 0x0200 },
+  { 7345, 0x0000 }, { 7345, 0x1000 }, { 7346, 0xb011 }, { 7351, 0x0102 },
+  { 7353, 0x0100 }, { 7354, 0x1130 }, { 7358, 0x02b0 }, { 7362, 0x0001 },
+  { 7363, 0x1010 }, { 7365, 0x0001 }, { 7366, 0x1100 }, { 7368, 0x2b01 },
+  /* 0xce00 */
+  { 7373, 0x1110 }, { 7376, 0x0210 }, { 7378, 0x0113 }, { 7382, 0x002b },
+  { 7386, 0x0000 }, { 7386, 0x9300 }, { 7390, 0x2b03 }, { 7396, 0x1130 },
+  { 7400, 0x02b0 }, { 7404, 0x0113 }, { 7408, 0x303b }, { 7415, 0x0000 },
+  { 7415, 0x0002 }, { 7416, 0x0000 }, { 7416, 0x1930 }, { 7421, 0x03b0 },
+  /* 0xcf00 */
+  { 7426, 0x0113 }, { 7430, 0x102b }, { 7435, 0xb011 }, { 7440, 0x0103 },
+  { 7443, 0x0000 }, { 7443, 0x1130 }, { 7447, 0x02b0 }, { 7451, 0x0113 },
+  { 7455, 0x1021 }, { 7458, 0x0000 }, { 7458, 0x0102 }, { 7460, 0x0001 },
+  { 7461, 0x0010 }, { 7462, 0x0000 }, { 7462, 0x0113 }, { 7466, 0x102b },
+  /* 0xd000 */
+  { 7471, 0x0011 }, { 7473, 0x0102 }, { 7475, 0x2000 }, { 7476, 0x1130 },
+  { 7480, 0x02b0 }, { 7484, 0x0111 }, { 7487, 0x3001 }, { 7490, 0x3011 },
+  { 7494, 0x0002 }, { 7495, 0x0000 }, { 7495, 0x1130 }, { 7499, 0x02b0 },
+  { 7503, 0x0313 }, { 7508, 0x303b }, { 7515, 0xb011 }, { 7520, 0x0103 },
+  /* 0xd100 */
+  { 7523, 0x2000 }, { 7524, 0x0000 }, { 7524, 0x0000 }, { 7524, 0x0513 },
+  { 7529, 0x303b }, { 7536, 0xb011 }, { 7541, 0x1102 }, { 7544, 0x1000 },
+  { 7545, 0x0110 }, { 7547, 0x0000 }, { 7547, 0x0113 }, { 7551, 0x142b },
+  { 7557, 0x0001 }, { 7558, 0x0100 }, { 7559, 0x0000 }, { 7559, 0x0110 },
+  /* 0xd200 */
+  { 7561, 0x0280 }, { 7563, 0x0001 }, { 7564, 0x3000 }, { 7566, 0xb011 },
+  { 7571, 0x0102 }, { 7573, 0x1000 }, { 7574, 0x0010 }, { 7575, 0x0000 },
+  { 7575, 0x0113 }, { 7579, 0x1023 }, { 7583, 0x1011 }, { 7586, 0x9302 },
+  { 7591, 0x0b05 }, { 7596, 0x1110 }, { 7599, 0x0030 }, { 7601, 0x0113 },
+  /* 0xd300 */
+  { 7605, 0x702b }, { 7612, 0xb051 }, { 7618, 0x1323 }, { 7624, 0x3b01 },
+  { 7630, 0x0030 }, { 7632, 0x0000 }, { 7632, 0x0000 }, { 7632, 0x3000 },
+  { 7634, 0xb011 }, { 7639, 0x1303 }, { 7644, 0x2b01 }, { 7649, 0x1110 },
+  { 7652, 0x0330 }, { 7656, 0x0101 }, { 7658, 0x300a }, { 7662, 0xb011 },
+  /* 0xd400 */
+  { 7667, 0x0102 }, { 7669, 0x2000 }, { 7670, 0x0000 }, { 7670, 0x0000 },
+  { 7670, 0x0011 }, { 7672, 0x1000 }, { 7673, 0xa011 }, { 7677, 0x9300 },
+  { 7681, 0x2b05 }, { 7687, 0x0010 }, { 7688, 0x0200 }, { 7689, 0x0000 },
+  { 7689, 0x1000 }, { 7690, 0x9011 }, { 7694, 0x1100 }, { 7696, 0x2901 },
+  /* 0xd500 */
+  { 7700, 0x1110 }, { 7703, 0x00b0 }, { 7706, 0x0000 }, { 7706, 0x3000 },
+  { 7708, 0xb011 }, { 7713, 0x1302 }, { 7717, 0x2b21 }, { 7723, 0x1130 },
+  { 7727, 0x03b0 }, { 7732, 0x0001 }, { 7733, 0x0020 }, { 7734, 0x0000 },
+  { 7734, 0x1300 }, { 7737, 0x2b05 }, { 7743, 0x1130 }, { 7747, 0x02b0 },
+  /* 0xd600 */
+  { 7751, 0x0113 }, { 7755, 0x103b }, { 7761, 0x2011 }, { 7764, 0x1300 },
+  { 7767, 0x2b21 }, { 7773, 0x1132 }, { 7778, 0x0280 }, { 7780, 0x0013 },
+  { 7783, 0x3028 }, { 7787, 0xa011 }, { 7791, 0x1102 }, { 7794, 0x0a01 },
+  { 7797, 0x1130 }, { 7801, 0x0292 }, { 7805, 0x0111 }, { 7808, 0x3021 },
+  /* 0xd700 */
+  { 7812, 0x0011 }, { 7814, 0x1302 }, { 7818, 0x2b01 }, { 7823, 0x1130 },
+  { 7827, 0x0290 }, { 7830, 0x03d3 }, { 7837, 0x122b }, { 7843, 0x3011 },
+  { 7847, 0x1302 }, { 7851, 0x2b01 },
+};
+static const Summary16 ksc5601_uni2indx_pagef9[17] = {
+  /* 0xf900 */
+  { 7856, 0xffff }, { 7872, 0xffff }, { 7888, 0xffff }, { 7904, 0xffff },
+  { 7920, 0xffff }, { 7936, 0xffff }, { 7952, 0xffff }, { 7968, 0xffff },
+  { 7984, 0xffff }, { 8000, 0xffff }, { 8016, 0xffff }, { 8032, 0xffff },
+  { 8048, 0xffff }, { 8064, 0xffff }, { 8080, 0xffff }, { 8096, 0xffff },
+  /* 0xfa00 */
+  { 8112, 0x0fff },
+};
+static const Summary16 ksc5601_uni2indx_pageff[15] = {
+  /* 0xff00 */
+  { 8124, 0xfffe }, { 8139, 0xffff }, { 8155, 0xffff }, { 8171, 0xffff },
+  { 8187, 0xffff }, { 8203, 0x7fff }, { 8218, 0x0000 }, { 8218, 0x0000 },
+  { 8218, 0x0000 }, { 8218, 0x0000 }, { 8218, 0x0000 }, { 8218, 0x0000 },
+  { 8218, 0x0000 }, { 8218, 0x0000 }, { 8218, 0x006f },
+};
+
+static int
+ksc5601_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  if (n >= 2) {
+    const Summary16 *summary = NULL;
+    if (wc < 0x0460)
+      summary = &ksc5601_uni2indx_page00[(wc>>4)];
+    else if (wc >= 0x2000 && wc < 0x2670) /* General Punctuation (2000, 206F) */
+      summary = &ksc5601_uni2indx_page20[(wc>>4)-0x200];
+    else if (wc >= 0x3000 && wc < 0x33e0) /* CJK Symbols and Punctuation (3000, 303F) */
+      summary = &ksc5601_uni2indx_page30[(wc>>4)-0x300];
+    else if (wc >= 0x4e00 && wc < 0x9fa0) /* CJK Unified Ideographs (4E00, 9FFF) */
+      summary = &ksc5601_uni2indx_page4e[(wc>>4)-0x4e0];
+    else if (wc >= 0xac00 && wc < 0xd7a0) /* Hangul Syllables (AC00, D7AF) 11183 */
+      summary = &ksc5601_uni2indx_pageac[(wc>>4)-0xac0];
+    else if (wc >= 0xf900 && wc < 0xfa10) /* CJK Compatibility Ideographs (F900, FAFF) */
+      summary = &ksc5601_uni2indx_pagef9[(wc>>4)-0xf90];
+    else if (wc >= 0xff00 && wc < 0xfff0) /* Halfwidth and Fullwidth Forms (FF00, FFEF) */
+      summary = &ksc5601_uni2indx_pageff[(wc>>4)-0xff0];
+    if (summary) {
+      unsigned short used = summary->used;
+      unsigned int i = wc & 0x0f;
+      if (used & ((unsigned short) 1 << i)) {
+        unsigned short c;
+        /* Keep in `used' only the bits 0..i-1. */
+        used &= ((unsigned short) 1 << i) - 1;
+        /* Add `summary->indx' and the number of bits set in `used'. */
+        used = (used & 0x5555) + ((used & 0xaaaa) >> 1);
+        used = (used & 0x3333) + ((used & 0xcccc) >> 2);
+        used = (used & 0x0f0f) + ((used & 0xf0f0) >> 4);
+        used = (used & 0x00ff) + (used >> 8);
+        c = ksc5601_2charset[summary->indx + used];
+        r[0] = (c >> 8); r[1] = (c & 0xff);
+        return 2;
+      }
+    }
+    return RET_ILSEQ;
+  }
+  return RET_TOOSMALL;
+}
diff --git a/src/xlibi18n/lcUniConv/mulelao.h b/src/xlibi18n/lcUniConv/mulelao.h
new file mode 100644 (file)
index 0000000..5b82457
--- /dev/null
@@ -0,0 +1,77 @@
+
+/*
+ * MULELAO-1
+ */
+
+static const unsigned short mulelao_2uni[96] = {
+  /* 0xa0 */
+  0x00a0, 0x0e81, 0x0e82, 0xfffd, 0x0e84, 0xfffd, 0xfffd, 0x0e87,
+  0x0e88, 0xfffd, 0x0e8a, 0xfffd, 0xfffd, 0x0e8d, 0xfffd, 0xfffd,
+  /* 0xb0 */
+  0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x0e94, 0x0e95, 0x0e96, 0x0e97,
+  0xfffd, 0x0e99, 0x0e9a, 0x0e9b, 0x0e9c, 0x0e9d, 0x0e9e, 0x0e9f,
+  /* 0xc0 */
+  0xfffd, 0x0ea1, 0x0ea2, 0x0ea3, 0xfffd, 0x0ea5, 0xfffd, 0x0ea7,
+  0xfffd, 0xfffd, 0x0eaa, 0x0eab, 0xfffd, 0x0ead, 0x0eae, 0x0eaf,
+  /* 0xd0 */
+  0x0eb0, 0x0eb1, 0x0eb2, 0x0eb3, 0x0eb4, 0x0eb5, 0x0eb6, 0x0eb7,
+  0x0eb8, 0x0eb9, 0xfffd, 0x0ebb, 0x0ebc, 0x0ebd, 0xfffd, 0xfffd,
+  /* 0xe0 */
+  0x0ec0, 0x0ec1, 0x0ec2, 0x0ec3, 0x0ec4, 0xfffd, 0x0ec6, 0xfffd,
+  0x0ec8, 0x0ec9, 0x0eca, 0x0ecb, 0x0ecc, 0x0ecd, 0xfffd, 0xfffd,
+  /* 0xf0 */
+  0x0ed0, 0x0ed1, 0x0ed2, 0x0ed3, 0x0ed4, 0x0ed5, 0x0ed6, 0x0ed7,
+  0x0ed8, 0x0ed9, 0xfffd, 0xfffd, 0x0edc, 0x0edd, 0xfffd, 0xfffd,
+};
+
+static int
+mulelao_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c < 0xa0) {
+    *pwc = (ucs4_t) c;
+    return 1;
+  }
+  else {
+    unsigned short wc = mulelao_2uni[c-0xa0];
+    if (wc != 0xfffd) {
+      *pwc = (ucs4_t) wc;
+      return 1;
+    }
+  }
+  return RET_ILSEQ;
+}
+
+static const unsigned char mulelao_page0e[96] = {
+  0x00, 0xa1, 0xa2, 0x00, 0xa4, 0x00, 0x00, 0xa7, /* 0x80-0x87 */
+  0xa8, 0x00, 0xaa, 0x00, 0x00, 0xad, 0x00, 0x00, /* 0x88-0x8f */
+  0x00, 0x00, 0x00, 0x00, 0xb4, 0xb5, 0xb6, 0xb7, /* 0x90-0x97 */
+  0x00, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0x98-0x9f */
+  0x00, 0xc1, 0xc2, 0xc3, 0x00, 0xc5, 0x00, 0xc7, /* 0xa0-0xa7 */
+  0x00, 0x00, 0xca, 0xcb, 0x00, 0xcd, 0xce, 0xcf, /* 0xa8-0xaf */
+  0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0xb0-0xb7 */
+  0xd8, 0xd9, 0x00, 0xdb, 0xdc, 0xdd, 0x00, 0x00, /* 0xb8-0xbf */
+  0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0x00, 0xe6, 0x00, /* 0xc0-0xc7 */
+  0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0x00, 0x00, /* 0xc8-0xcf */
+  0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0xd0-0xd7 */
+  0xf8, 0xf9, 0x00, 0x00, 0xfc, 0xfd, 0x00, 0x00, /* 0xd8-0xdf */
+};
+
+static int
+mulelao_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  unsigned char c = 0;
+  if (wc < 0x00a0) {
+    *r = wc;
+    return 1;
+  }
+  else if (wc == 0x00a0)
+    c = 0xa0;
+  else if (wc >= 0x0e80 && wc < 0x0ee0)
+    c = mulelao_page0e[wc-0x0e80];
+  if (c != 0) {
+    *r = c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/tatar_cyr.h b/src/xlibi18n/lcUniConv/tatar_cyr.h
new file mode 100644 (file)
index 0000000..471e5a7
--- /dev/null
@@ -0,0 +1,122 @@
+
+/*
+ * TATAR-CYR
+ */
+
+static const unsigned short tatar_cyr_2uni[128] = {
+  /* 0x80 */
+  0x04d8, 0x0403, 0x201a, 0x0453, 0x201e, 0x2026, 0x2020, 0x2021,
+  0x20ac, 0x2030, 0x04e8, 0x2039, 0x04ae, 0x0496, 0x04a2, 0x04ba,
+  /* 0x90 */
+  0x04d9, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
+    0x98, 0x2122, 0x04e9, 0x203a, 0x04af, 0x0497, 0x04a3, 0x04bb,
+  /* 0xa0 */
+  0x00a0, 0x040e, 0x045e, 0x0408, 0x00a4, 0x0490, 0x00a6, 0x00a7,
+  0x0401, 0x00a9, 0x0404, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x0407,
+  /* 0xb0 */
+  0x00b0, 0x00b1, 0x0406, 0x0456, 0x0491, 0x00b5, 0x00b6, 0x00b7,
+  0x0451, 0x2116, 0x0454, 0x00bb, 0x0458, 0x0405, 0x0455, 0x0457,
+  /* 0xc0 */
+  0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
+  0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f,
+  /* 0xd0 */
+  0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
+  0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f,
+  /* 0xe0 */
+  0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
+  0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f,
+  /* 0xf0 */
+  0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
+  0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f,
+};
+
+static int
+tatar_cyr_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c < 0x80)
+    *pwc = (ucs4_t) c;
+  else
+    *pwc = (ucs4_t) tatar_cyr_2uni[c-0x80];
+  return 1;
+}
+
+static const unsigned char tatar_cyr_page00[32] = {
+  0xa0, 0x00, 0x00, 0x00, 0xa4, 0x00, 0xa6, 0xa7, /* 0xa0-0xa7 */
+  0x00, 0xa9, 0x00, 0xab, 0xac, 0xad, 0xae, 0x00, /* 0xa8-0xaf */
+  0xb0, 0xb1, 0x00, 0x00, 0x00, 0xb5, 0xb6, 0xb7, /* 0xb0-0xb7 */
+  0x00, 0x00, 0x00, 0xbb, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */
+};
+static const unsigned char tatar_cyr_page04[240] = {
+  0x00, 0xa8, 0x00, 0x81, 0xaa, 0xbd, 0xb2, 0xaf, /* 0x00-0x07 */
+  0xa3, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa1, 0x00, /* 0x08-0x0f */
+  0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x10-0x17 */
+  0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x18-0x1f */
+  0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x20-0x27 */
+  0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, /* 0x28-0x2f */
+  0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x30-0x37 */
+  0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x38-0x3f */
+  0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x40-0x47 */
+  0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, /* 0x48-0x4f */
+  0x00, 0xb8, 0x00, 0x83, 0xba, 0xbe, 0xb3, 0xbf, /* 0x50-0x57 */
+  0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0x00, /* 0x58-0x5f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */
+  0xa5, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x8d, 0x9d, /* 0x90-0x97 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */
+  0x00, 0x00, 0x8e, 0x9e, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x9c, /* 0xa8-0xaf */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */
+  0x00, 0x00, 0x8f, 0x9f, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xc8-0xcf */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd0-0xd7 */
+  0x80, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xd8-0xdf */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */
+  0x8a, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xe8-0xef */
+};
+static const unsigned char tatar_cyr_page20[48] = {
+  0x00, 0x00, 0x00, 0x96, 0x97, 0x00, 0x00, 0x00, /* 0x10-0x17 */
+  0x91, 0x92, 0x82, 0x00, 0x93, 0x94, 0x84, 0x00, /* 0x18-0x1f */
+  0x86, 0x87, 0x95, 0x00, 0x00, 0x00, 0x85, 0x00, /* 0x20-0x27 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */
+  0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */
+  0x00, 0x8b, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */
+};
+static const unsigned char tatar_cyr_page21[24] = {
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb9, 0x00, /* 0x10-0x17 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */
+  0x00, 0x00, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */
+};
+static const unsigned char tatar_cyr_page22[1] = {
+                                      0xb0,       /* 0x16-0x16 */
+};
+
+static int
+tatar_cyr_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  unsigned char c = 0;
+  if (wc < 0x0080) {
+    *r = wc;
+    return 1;
+  }
+  else if (wc >= 0x00a0 && wc < 0x00bc)
+    c = tatar_cyr_page00[wc-0x00a0];
+  else if (wc >= 0x0400 && wc < 0x04ef)
+    c = tatar_cyr_page04[wc-0x0400];
+  else if (wc >= 0x2010 && wc < 0x203b)
+    c = tatar_cyr_page20[wc-0x2010];
+  else if (wc == 0x20ac)
+    c = 0x88;
+  else if (wc >= 0x2110 && wc < 0x2123)
+    c = tatar_cyr_page21[wc-0x2110];
+  if (c != 0) {
+    *r = c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/tcvn.h b/src/xlibi18n/lcUniConv/tcvn.h
new file mode 100644 (file)
index 0000000..4662683
--- /dev/null
@@ -0,0 +1,133 @@
+
+/*
+ * TCVN-5712
+ */
+
+static const unsigned short tcvn_2uni_1[32] = {
+  /* 0x00 */
+  0x0000, 0x00da, 0x1ee4, 0x0003, 0x1eea, 0x1eec, 0x1eee, 0x0007,
+  0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+  /* 0x10 */
+  0x0010, 0x1ee8, 0x1ef0, 0x1ef2, 0x1ef6, 0x1ef8, 0x00dd, 0x1ef4,
+  0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+};
+static const unsigned short tcvn_2uni_2[128] = {
+  /* 0x80 */
+  0x00c0, 0x1ea2, 0x00c3, 0x00c1, 0x1ea0, 0x1eb6, 0x1eac, 0x00c8,
+  0x1eba, 0x1ebc, 0x00c9, 0x1eb8, 0x1ec6, 0x00cc, 0x1ec8, 0x0128,
+  /* 0x90 */
+  0x00cd, 0x1eca, 0x00d2, 0x1ece, 0x00d5, 0x00d3, 0x1ecc, 0x1ed8,
+  0x1edc, 0x1ede, 0x1ee0, 0x1eda, 0x1ee2, 0x00d9, 0x1ee6, 0x0168,
+  /* 0xa0 */
+  0x00a0, 0x0102, 0x00c2, 0x00ca, 0x00d4, 0x01a0, 0x01af, 0x0110,
+  0x0103, 0x00e2, 0x00ea, 0x00f4, 0x01a1, 0x01b0, 0x0111, 0x1eb0,
+  /* 0xb0 */
+  0x0300, 0x0309, 0x0303, 0x0301, 0x0323, 0x00e0, 0x1ea3, 0x00e3,
+  0x00e1, 0x1ea1, 0x1eb2, 0x1eb1, 0x1eb3, 0x1eb5, 0x1eaf, 0x1eb4,
+  /* 0xc0 */
+  0x1eae, 0x1ea6, 0x1ea8, 0x1eaa, 0x1ea4, 0x1ec0, 0x1eb7, 0x1ea7,
+  0x1ea9, 0x1eab, 0x1ea5, 0x1ead, 0x00e8, 0x1ec2, 0x1ebb, 0x1ebd,
+  /* 0xd0 */
+  0x00e9, 0x1eb9, 0x1ec1, 0x1ec3, 0x1ec5, 0x1ebf, 0x1ec7, 0x00ec,
+  0x1ec9, 0x1ec4, 0x1ebe, 0x1ed2, 0x0129, 0x00ed, 0x1ecb, 0x00f2,
+  /* 0xe0 */
+  0x1ed4, 0x1ecf, 0x00f5, 0x00f3, 0x1ecd, 0x1ed3, 0x1ed5, 0x1ed7,
+  0x1ed1, 0x1ed9, 0x1edd, 0x1edf, 0x1ee1, 0x1edb, 0x1ee3, 0x00f9,
+  /* 0xf0 */
+  0x1ed6, 0x1ee7, 0x0169, 0x00fa, 0x1ee5, 0x1eeb, 0x1eed, 0x1eef,
+  0x1ee9, 0x1ef1, 0x1ef3, 0x1ef7, 0x1ef9, 0x00fd, 0x1ef5, 0x1ed0,
+};
+
+static int
+tcvn_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c < 0x20)
+    *pwc = (ucs4_t) tcvn_2uni_1[c];
+  else if (c < 0x80)
+    *pwc = (ucs4_t) c;
+  else
+    *pwc = (ucs4_t) tcvn_2uni_2[c-0x80];
+  return 1;
+}
+
+static const unsigned char tcvn_page00[96+184] = {
+  0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa8-0xaf */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb8-0xbf */
+  0x80, 0x83, 0xa2, 0x82, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */
+  0x87, 0x8a, 0xa3, 0x00, 0x8d, 0x90, 0x00, 0x00, /* 0xc8-0xcf */
+  0x00, 0x00, 0x92, 0x95, 0xa4, 0x94, 0x00, 0x00, /* 0xd0-0xd7 */
+  0x00, 0x9d, 0x01, 0x00, 0x00, 0x16, 0x00, 0x00, /* 0xd8-0xdf */
+  0xb5, 0xb8, 0xa9, 0xb7, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */
+  0xcc, 0xd0, 0xaa, 0x00, 0xd7, 0xdd, 0x00, 0x00, /* 0xe8-0xef */
+  0x00, 0x00, 0xdf, 0xe3, 0xab, 0xe2, 0x00, 0x00, /* 0xf0-0xf7 */
+  0x00, 0xef, 0xf3, 0x00, 0x00, 0xfd, 0x00, 0x00, /* 0xf8-0xff */
+  /* 0x0100 */
+  0x00, 0x00, 0xa1, 0xa8, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */
+  0xa7, 0xae, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */
+  0x8f, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */
+  0x9f, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */
+  0xa5, 0xac, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6, /* 0xa8-0xaf */
+  0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */
+};
+static const unsigned char tcvn_page03[40] = {
+  0xb0, 0xb3, 0x00, 0xb2, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */
+  0x00, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */
+  0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */
+};
+static const unsigned char tcvn_page1e[96] = {
+  0x84, 0xb9, 0x81, 0xb6, 0xc4, 0xca, 0xc1, 0xc7, /* 0xa0-0xa7 */
+  0xc2, 0xc8, 0xc3, 0xc9, 0x86, 0xcb, 0xc0, 0xbe, /* 0xa8-0xaf */
+  0xaf, 0xbb, 0xba, 0xbc, 0xbf, 0xbd, 0x85, 0xc6, /* 0xb0-0xb7 */
+  0x8b, 0xd1, 0x88, 0xce, 0x89, 0xcf, 0xda, 0xd5, /* 0xb8-0xbf */
+  0xc5, 0xd2, 0xcd, 0xd3, 0xd9, 0xd4, 0x8c, 0xd6, /* 0xc0-0xc7 */
+  0x8e, 0xd8, 0x91, 0xde, 0x96, 0xe4, 0x93, 0xe1, /* 0xc8-0xcf */
+  0xff, 0xe8, 0xdb, 0xe5, 0xe0, 0xe6, 0xf0, 0xe7, /* 0xd0-0xd7 */
+  0x97, 0xe9, 0x9b, 0xed, 0x98, 0xea, 0x99, 0xeb, /* 0xd8-0xdf */
+  0x9a, 0xec, 0x9c, 0xee, 0x02, 0xf4, 0x9e, 0xf1, /* 0xe0-0xe7 */
+  0x11, 0xf8, 0x04, 0xf5, 0x05, 0xf6, 0x06, 0xf7, /* 0xe8-0xef */
+  0x12, 0xf9, 0x13, 0xfa, 0x17, 0xfe, 0x14, 0xfb, /* 0xf0-0xf7 */
+  0x15, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */
+};
+
+static int
+tcvn_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  unsigned char c = 0;
+  if (wc < 0x0080 && (wc >= 0x0020 || (0x00fe0076 & (1 << wc)) == 0)) {
+    *r = wc;
+    return 1;
+  }
+  else if (wc >= 0x00a0 && wc < 0x01b8)
+    c = tcvn_page00[wc-0x00a0];
+  else if (wc >= 0x0300 && wc < 0x0328)
+    c = tcvn_page03[wc-0x0300];
+  else if (wc >= 0x1ea0 && wc < 0x1f00)
+    c = tcvn_page1e[wc-0x1ea0];
+  if (c != 0) {
+    *r = c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/tis620.h b/src/xlibi18n/lcUniConv/tis620.h
new file mode 100644 (file)
index 0000000..4fa96ec
--- /dev/null
@@ -0,0 +1,77 @@
+
+/*
+ * TIS620-0
+ */
+
+static const unsigned short tis620_2uni[96] = {
+  /* 0xa0 */
+  0xfffd, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07,
+  0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f,
+  /* 0xb0 */
+  0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17,
+  0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f,
+  /* 0xc0 */
+  0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27,
+  0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f,
+  /* 0xd0 */
+  0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37,
+  0x0e38, 0x0e39, 0x0e3a, 0xfffd, 0xfffd, 0xfffd, 0xfffd, 0x0e3f,
+  /* 0xe0 */
+  0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47,
+  0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e4e, 0x0e4f,
+  /* 0xf0 */
+  0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57,
+  0x0e58, 0x0e59, 0x0e5a, 0x0e5b, 0xfffd, 0xfffd, 0xfffd, 0xfffd,
+};
+
+static int
+tis620_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c < 0x80) {
+    *pwc = (ucs4_t) c;
+    return 1;
+  }
+  else if (c < 0xa0) {
+  }
+  else {
+    unsigned short wc = tis620_2uni[c-0xa0];
+    if (wc != 0xfffd) {
+      *pwc = (ucs4_t) wc;
+      return 1;
+    }
+  }
+  return RET_ILSEQ;
+}
+
+static const unsigned char tis620_page0e[96] = {
+  0x00, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, /* 0x00-0x07 */
+  0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, /* 0x08-0x0f */
+  0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, /* 0x10-0x17 */
+  0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, /* 0x18-0x1f */
+  0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 0x20-0x27 */
+  0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, /* 0x28-0x2f */
+  0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, /* 0x30-0x37 */
+  0xd8, 0xd9, 0xda, 0x00, 0x00, 0x00, 0x00, 0xdf, /* 0x38-0x3f */
+  0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, /* 0x40-0x47 */
+  0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, /* 0x48-0x4f */
+  0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 0x50-0x57 */
+  0xf8, 0xf9, 0xfa, 0xfb, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */
+};
+
+static int
+tis620_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  unsigned char c = 0;
+  if (wc < 0x0080) {
+    *r = wc;
+    return 1;
+  }
+  else if (wc >= 0x0e00 && wc < 0x0e60)
+    c = tis620_page0e[wc-0x0e00];
+  if (c != 0) {
+    *r = c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/ucs2be.h b/src/xlibi18n/lcUniConv/ucs2be.h
new file mode 100644 (file)
index 0000000..20a8b27
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * UCS-2BE = UCS-2 big endian
+ */
+
+static int
+ucs2be_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  if (n >= 2) {
+    if (s[0] >= 0xd8 && s[0] < 0xe0) {
+      return RET_ILSEQ;
+    } else {
+      *pwc = (s[0] << 8) + s[1];
+      return 2;
+    }
+  }
+  return RET_TOOFEW(0);
+}
+
+static int
+ucs2be_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  if (wc < 0x10000 && !(wc >= 0xd800 && wc < 0xe000)) {
+    if (n >= 2) {
+      r[0] = (unsigned char) (wc >> 8);
+      r[1] = (unsigned char) wc;
+      return 2;
+    } else
+      return RET_TOOSMALL;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUniConv/utf8.h b/src/xlibi18n/lcUniConv/utf8.h
new file mode 100644 (file)
index 0000000..d00995c
--- /dev/null
@@ -0,0 +1,109 @@
+
+/*
+ * UTF-8
+ */
+
+/* Specification: RFC 2279 */
+
+static int
+utf8_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = s[0];
+
+  if (c < 0x80) {
+    *pwc = c;
+    return 1;
+  } else if (c < 0xc2) {
+    return RET_ILSEQ;
+  } else if (c < 0xe0) {
+    if (n < 2)
+      return RET_TOOFEW(0);
+    if (!((s[1] ^ 0x80) < 0x40))
+      return RET_ILSEQ;
+    *pwc = ((ucs4_t) (c & 0x1f) << 6)
+           | (ucs4_t) (s[1] ^ 0x80);
+    return 2;
+  } else if (c < 0xf0) {
+    if (n < 3)
+      return RET_TOOFEW(0);
+    if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+          && (c >= 0xe1 || s[1] >= 0xa0)))
+      return RET_ILSEQ;
+    *pwc = ((ucs4_t) (c & 0x0f) << 12)
+           | ((ucs4_t) (s[1] ^ 0x80) << 6)
+           | (ucs4_t) (s[2] ^ 0x80);
+    return 3;
+  } else if (c < 0xf8) {
+    if (n < 4)
+      return RET_TOOFEW(0);
+    if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+          && (s[3] ^ 0x80) < 0x40
+          && (c >= 0xf1 || s[1] >= 0x90)))
+      return RET_ILSEQ;
+    *pwc = ((ucs4_t) (c & 0x07) << 18)
+           | ((ucs4_t) (s[1] ^ 0x80) << 12)
+           | ((ucs4_t) (s[2] ^ 0x80) << 6)
+           | (ucs4_t) (s[3] ^ 0x80);
+    return 4;
+  } else if (c < 0xfc) {
+    if (n < 5)
+      return RET_TOOFEW(0);
+    if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+          && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40
+          && (c >= 0xf9 || s[1] >= 0x88)))
+      return RET_ILSEQ;
+    *pwc = ((ucs4_t) (c & 0x03) << 24)
+           | ((ucs4_t) (s[1] ^ 0x80) << 18)
+           | ((ucs4_t) (s[2] ^ 0x80) << 12)
+           | ((ucs4_t) (s[3] ^ 0x80) << 6)
+           | (ucs4_t) (s[4] ^ 0x80);
+    return 5;
+  } else if (c < 0xfe) {
+    if (n < 6)
+      return RET_TOOFEW(0);
+    if (!((s[1] ^ 0x80) < 0x40 && (s[2] ^ 0x80) < 0x40
+          && (s[3] ^ 0x80) < 0x40 && (s[4] ^ 0x80) < 0x40
+          && (s[5] ^ 0x80) < 0x40
+          && (c >= 0xfd || s[1] >= 0x84)))
+      return RET_ILSEQ;
+    *pwc = ((ucs4_t) (c & 0x01) << 30)
+           | ((ucs4_t) (s[1] ^ 0x80) << 24)
+           | ((ucs4_t) (s[2] ^ 0x80) << 18)
+           | ((ucs4_t) (s[3] ^ 0x80) << 12)
+           | ((ucs4_t) (s[4] ^ 0x80) << 6)
+           | (ucs4_t) (s[5] ^ 0x80);
+    return 6;
+  } else
+    return RET_ILSEQ;
+}
+
+static int
+utf8_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n) /* n == 0 is acceptable */
+{
+  int count;
+  if (wc < 0x80)
+    count = 1;
+  else if (wc < 0x800)
+    count = 2;
+  else if (wc < 0x10000)
+    count = 3;
+  else if (wc < 0x200000)
+    count = 4;
+  else if (wc < 0x4000000)
+    count = 5;
+  else if (wc <= 0x7fffffff)
+    count = 6;
+  else
+    return RET_ILSEQ;
+  if (n < count)
+    return RET_TOOSMALL;
+  switch (count) { /* note: code falls through cases! */
+    case 6: r[5] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x4000000;
+    case 5: r[4] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x200000;
+    case 4: r[3] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x10000;
+    case 3: r[2] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0x800;
+    case 2: r[1] = 0x80 | (wc & 0x3f); wc = wc >> 6; wc |= 0xc0;
+    case 1: r[0] = wc;
+  }
+  return count;
+}
diff --git a/src/xlibi18n/lcUniConv/viscii.h b/src/xlibi18n/lcUniConv/viscii.h
new file mode 100644 (file)
index 0000000..d5147e8
--- /dev/null
@@ -0,0 +1,122 @@
+
+/*
+ * VISCII1.1-1
+ */
+
+/* Specification: RFC 1456 */
+
+static const unsigned short viscii_2uni_1[32] = {
+  /* 0x00 */
+  0x0000, 0x0001, 0x1eb2, 0x0003, 0x0004, 0x1eb4, 0x1eaa, 0x0007,
+  0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+  /* 0x10 */
+  0x0010, 0x0011, 0x0012, 0x0013, 0x1ef6, 0x0015, 0x0016, 0x0017,
+  0x0018, 0x1ef8, 0x001a, 0x001b, 0x001c, 0x001d, 0x1ef4, 0x001f,
+};
+static const unsigned short viscii_2uni_2[128] = {
+  /* 0x80 */
+  0x1ea0, 0x1eae, 0x1eb0, 0x1eb6, 0x1ea4, 0x1ea6, 0x1ea8, 0x1eac,
+  0x1ebc, 0x1eb8, 0x1ebe, 0x1ec0, 0x1ec2, 0x1ec4, 0x1ec6, 0x1ed0,
+  /* 0x90 */
+  0x1ed2, 0x1ed4, 0x1ed6, 0x1ed8, 0x1ee2, 0x1eda, 0x1edc, 0x1ede,
+  0x1eca, 0x1ece, 0x1ecc, 0x1ec8, 0x1ee6, 0x0168, 0x1ee4, 0x1ef2,
+  /* 0xa0 */
+  0x00d5, 0x1eaf, 0x1eb1, 0x1eb7, 0x1ea5, 0x1ea7, 0x1ea9, 0x1ead,
+  0x1ebd, 0x1eb9, 0x1ebf, 0x1ec1, 0x1ec3, 0x1ec5, 0x1ec7, 0x1ed1,
+  /* 0xb0 */
+  0x1ed3, 0x1ed5, 0x1ed7, 0x1ee0, 0x01a0, 0x1ed9, 0x1edd, 0x1edf,
+  0x1ecb, 0x1ef0, 0x1ee8, 0x1eea, 0x1eec, 0x01a1, 0x1edb, 0x01af,
+  /* 0xc0 */
+  0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x1ea2, 0x0102, 0x1eb3, 0x1eb5,
+  0x00c8, 0x00c9, 0x00ca, 0x1eba, 0x00cc, 0x00cd, 0x0128, 0x1ef3,
+  /* 0xd0 */
+  0x0110, 0x1ee9, 0x00d2, 0x00d3, 0x00d4, 0x1ea1, 0x1ef7, 0x1eeb,
+  0x1eed, 0x00d9, 0x00da, 0x1ef9, 0x1ef5, 0x00dd, 0x1ee1, 0x01b0,
+  /* 0xe0 */
+  0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x1ea3, 0x0103, 0x1eef, 0x1eab,
+  0x00e8, 0x00e9, 0x00ea, 0x1ebb, 0x00ec, 0x00ed, 0x0129, 0x1ec9,
+  /* 0xf0 */
+  0x0111, 0x1ef1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x1ecf, 0x1ecd,
+  0x1ee5, 0x00f9, 0x00fa, 0x0169, 0x1ee7, 0x00fd, 0x1ee3, 0x1eee,
+};
+
+static int
+viscii_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
+{
+  unsigned char c = *s;
+  if (c < 0x20)
+    *pwc = (ucs4_t) viscii_2uni_1[c];
+  else if (c < 0x80)
+    *pwc = (ucs4_t) c;
+  else
+    *pwc = (ucs4_t) viscii_2uni_2[c-0x80];
+  return 1;
+}
+
+static const unsigned char viscii_page00[64+184] = {
+  0xc0, 0xc1, 0xc2, 0xc3, 0x00, 0x00, 0x00, 0x00, /* 0xc0-0xc7 */
+  0xc8, 0xc9, 0xca, 0x00, 0xcc, 0xcd, 0x00, 0x00, /* 0xc8-0xcf */
+  0x00, 0x00, 0xd2, 0xd3, 0xd4, 0xa0, 0x00, 0x00, /* 0xd0-0xd7 */
+  0x00, 0xd9, 0xda, 0x00, 0x00, 0xdd, 0x00, 0x00, /* 0xd8-0xdf */
+  0xe0, 0xe1, 0xe2, 0xe3, 0x00, 0x00, 0x00, 0x00, /* 0xe0-0xe7 */
+  0xe8, 0xe9, 0xea, 0x00, 0xec, 0xed, 0x00, 0x00, /* 0xe8-0xef */
+  0x00, 0x00, 0xf2, 0xf3, 0xf4, 0xf5, 0x00, 0x00, /* 0xf0-0xf7 */
+  0x00, 0xf9, 0xfa, 0x00, 0x00, 0xfd, 0x00, 0x00, /* 0xf8-0xff */
+  /* 0x0100 */
+  0x00, 0x00, 0xc5, 0xe5, 0x00, 0x00, 0x00, 0x00, /* 0x00-0x07 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x08-0x0f */
+  0xd0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x10-0x17 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x18-0x1f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x20-0x27 */
+  0xce, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x28-0x2f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x30-0x37 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x38-0x3f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x40-0x47 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x48-0x4f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x50-0x57 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x58-0x5f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x60-0x67 */
+  0x9d, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x68-0x6f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x70-0x77 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x78-0x7f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x80-0x87 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x88-0x8f */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x90-0x97 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x98-0x9f */
+  0xb4, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xa0-0xa7 */
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, /* 0xa8-0xaf */
+  0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xb0-0xb7 */
+};
+static const unsigned char viscii_page1e[96] = {
+  0x80, 0xd5, 0xc4, 0xe4, 0x84, 0xa4, 0x85, 0xa5, /* 0xa0-0xa7 */
+  0x86, 0xa6, 0x06, 0xe7, 0x87, 0xa7, 0x81, 0xa1, /* 0xa8-0xaf */
+  0x82, 0xa2, 0x02, 0xc6, 0x05, 0xc7, 0x83, 0xa3, /* 0xb0-0xb7 */
+  0x89, 0xa9, 0xcb, 0xeb, 0x88, 0xa8, 0x8a, 0xaa, /* 0xb8-0xbf */
+  0x8b, 0xab, 0x8c, 0xac, 0x8d, 0xad, 0x8e, 0xae, /* 0xc0-0xc7 */
+  0x9b, 0xef, 0x98, 0xb8, 0x9a, 0xf7, 0x99, 0xf6, /* 0xc8-0xcf */
+  0x8f, 0xaf, 0x90, 0xb0, 0x91, 0xb1, 0x92, 0xb2, /* 0xd0-0xd7 */
+  0x93, 0xb5, 0x95, 0xbe, 0x96, 0xb6, 0x97, 0xb7, /* 0xd8-0xdf */
+  0xb3, 0xde, 0x94, 0xfe, 0x9e, 0xf8, 0x9c, 0xfc, /* 0xe0-0xe7 */
+  0xba, 0xd1, 0xbb, 0xd7, 0xbc, 0xd8, 0xff, 0xe6, /* 0xe8-0xef */
+  0xb9, 0xf1, 0x9f, 0xcf, 0x1e, 0xdc, 0x14, 0xd6, /* 0xf0-0xf7 */
+  0x19, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xf8-0xff */
+};
+
+static int
+viscii_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
+{
+  unsigned char c = 0;
+  if (wc < 0x0080 && (wc >= 0x0020 || (0x42100064 & (1 << wc)) == 0)) {
+    *r = wc;
+    return 1;
+  }
+  else if (wc >= 0x00c0 && wc < 0x01b8)
+    c = viscii_page00[wc-0x00c0];
+  else if (wc >= 0x1ea0 && wc < 0x1f00)
+    c = viscii_page1e[wc-0x1ea0];
+  if (c != 0) {
+    *r = c;
+    return 1;
+  }
+  return RET_ILSEQ;
+}
diff --git a/src/xlibi18n/lcUtil.c b/src/xlibi18n/lcUtil.c
new file mode 100644 (file)
index 0000000..196bca2
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * Copyright 1992, 1993 by TOSHIBA Corp.
+ *
+ * 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 TOSHIBA not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. TOSHIBA make no representations about the
+ * suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+ * TOSHIBA 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.
+ *
+ * Author: Katsuhisa Yano      TOSHIBA Corp.
+ *                             mopi@osa.ilab.toshiba.co.jp
+ * Bug fixes: Bruno Haible     XFree86 Inc.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <X11/Xlib.h>
+#include "XlcPublic.h"
+
+/* Don't use <ctype.h> here because it is locale dependent. */
+
+#define set_toupper(ch) \
+  if (ch >= 'a' && ch <= 'z') \
+    ch = ch - 'a' + 'A';
+
+/* Compares two ISO 8859-1 strings, ignoring case of ASCII letters.
+   Like strcasecmp in an ASCII locale. */
+int
+_XlcCompareISOLatin1(
+    const char *str1,
+    const char *str2)
+{
+    unsigned char ch1, ch2;
+
+    for ( ; ; str1++, str2++) {
+       ch1 = *str1;
+       ch2 = *str2;
+       if (ch1 == '\0' || ch2 == '\0')
+           break;
+       set_toupper(ch1);
+       set_toupper(ch2);
+       if (ch1 != ch2)
+           break;
+    }
+
+    return ch1 - ch2;
+}
+
+/* Compares two ISO 8859-1 strings, at most len bytes of each, ignoring
+   case of ASCII letters. Like strncasecmp in an ASCII locale. */
+int
+_XlcNCompareISOLatin1(
+    const char *str1,
+    const char *str2,
+    int len)
+{
+    unsigned char ch1, ch2;
+
+    for ( ; ; str1++, str2++, len--) {
+       if (len == 0)
+           return 0;
+       ch1 = *str1;
+       ch2 = *str2;
+       if (ch1 == '\0' || ch2 == '\0')
+           break;
+       set_toupper(ch1);
+       set_toupper(ch2);
+       if (ch1 != ch2)
+           break;
+    }
+
+    return ch1 - ch2;
+}
diff --git a/src/xlibi18n/lcWrap.c b/src/xlibi18n/lcWrap.c
new file mode 100644 (file)
index 0000000..c3f5ca5
--- /dev/null
@@ -0,0 +1,649 @@
+/*
+
+Copyright 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.
+
+*/
+/*
+ * Copyright 1991 by the Open Software Foundation
+ * Copyright 1993 by the TOSHIBA Corp.
+ *
+ * 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 names of Open Software Foundation and TOSHIBA
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Open Software
+ * Foundation and TOSHIBA make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *
+ * OPEN SOFTWARE FOUNDATION AND TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO
+ * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS, IN NO EVENT SHALL OPEN SOFTWARE FOUNDATIONN OR TOSHIBA 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.
+ *
+ *              M. Collins             OSF
+ *
+ *              Katsuhisa Yano         TOSHIBA Corp.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdlib.h>
+#include "Xlibint.h"
+#include "Xlcint.h"
+#include <X11/Xlocale.h>
+#include <X11/Xos.h>
+#ifdef WIN32
+#undef close
+#endif
+#include <X11/Xutil.h>
+#include "XlcPubI.h"
+
+#ifdef XTHREADS
+LockInfoPtr _Xi18n_lock;
+#endif
+
+char *
+XSetLocaleModifiers(
+    const char *modifiers)
+{
+    XLCd lcd = _XlcCurrentLC();
+    char *user_mods;
+
+    if (!lcd)
+       return (char *) NULL;
+    if (!modifiers)
+       return lcd->core->modifiers;
+    user_mods = getenv("XMODIFIERS");
+    modifiers = (*lcd->methods->map_modifiers) (lcd,
+                                               user_mods, (char *)modifiers);
+    if (modifiers) {
+       if (lcd->core->modifiers)
+           Xfree(lcd->core->modifiers);
+       lcd->core->modifiers = (char *)modifiers;
+    }
+    return (char *)modifiers;
+}
+
+Bool
+XSupportsLocale(void)
+{
+    return _XlcCurrentLC() != (XLCd)NULL;
+}
+
+Bool _XlcValidModSyntax(
+    const char * mods,
+    const char * const *valid_mods)
+{
+    int i;
+    const char * const *ptr;
+
+    while (mods && (*mods == '@')) {
+       mods++;
+       if (*mods == '@')
+           break;
+       for (ptr = valid_mods; *ptr; ptr++) {
+           i = strlen(*ptr);
+           if (strncmp(mods, *ptr, i) || ((mods[i] != '=')
+#ifdef WIN32
+                                          && (mods[i] != '#')
+#endif
+                                          ))
+               continue;
+           mods = strchr(mods+i+1, '@');
+           break;
+       }
+    }
+    return !mods || !*mods;
+}
+
+static const char *im_valid[] = {"im", (const char *)NULL};
+
+/*ARGSUSED*/
+char *
+_XlcDefaultMapModifiers(
+    XLCd lcd,
+    const char *user_mods,
+    const char *prog_mods)
+{
+    int i;
+    char *mods;
+
+    if (!_XlcValidModSyntax(prog_mods, im_valid))
+       return (char *)NULL;
+    if (!_XlcValidModSyntax(user_mods, im_valid))
+       return (char *)NULL;
+    i = strlen(prog_mods) + 1;
+    if (user_mods)
+       i += strlen(user_mods);
+    mods = Xmalloc(i);
+    if (mods) {
+       strcpy(mods, prog_mods);
+       if (user_mods)
+           strcat(mods, user_mods);
+#ifdef WIN32
+       {
+           char *s;
+           for (s = mods; (s = strchr(s, '@')); s++) {
+               for (s++; *s && *s != '='; s++) {
+                   if (*s == '#') {
+                       *s = '=';
+                       break;
+                   }
+               }
+           }
+       }
+#endif
+    }
+    return mods;
+}
+
+typedef struct _XLCdListRec {
+    struct _XLCdListRec *next;
+    XLCd lcd;
+    int ref_count;
+} XLCdListRec, *XLCdList;
+
+static XLCdList lcd_list = NULL;
+
+typedef struct _XlcLoaderListRec {
+    struct _XlcLoaderListRec *next;
+    XLCdLoadProc proc;
+} XlcLoaderListRec, *XlcLoaderList;
+
+static XlcLoaderList loader_list = NULL;
+
+void
+_XlcRemoveLoader(
+    XLCdLoadProc proc)
+{
+    XlcLoaderList loader, prev;
+
+    if (loader_list == NULL)
+       return;
+
+    prev = loader = loader_list;
+    if (loader->proc == proc) {
+       loader_list = loader->next;
+       Xfree(loader);
+       return;
+    }
+
+    while ((loader = loader->next)) {
+       if (loader->proc == proc) {
+           prev->next = loader->next;
+           Xfree(loader);
+           return;
+       }
+       prev = loader;
+    }
+
+    return;
+}
+
+Bool
+_XlcAddLoader(
+    XLCdLoadProc proc,
+    XlcPosition position)
+{
+    XlcLoaderList loader, last;
+
+    _XlcRemoveLoader(proc);            /* remove old loader, if exist */
+
+    loader = (XlcLoaderList) Xmalloc(sizeof(XlcLoaderListRec));
+    if (loader == NULL)
+       return False;
+
+    loader->proc = proc;
+
+    if (loader_list == NULL)
+       position = XlcHead;
+
+    if (position == XlcHead) {
+       loader->next = loader_list;
+       loader_list = loader;
+    } else {
+       last = loader_list;
+       while (last->next)
+           last = last->next;
+
+       loader->next = NULL;
+       last->next = loader;
+    }
+
+    return True;
+}
+
+XLCd
+_XOpenLC(
+    char *name)
+{
+    XLCd lcd;
+    XlcLoaderList loader;
+    XLCdList cur;
+#if !defined(X_LOCALE)
+    int len;
+    char sinamebuf[256];
+    char* siname = sinamebuf;
+#endif
+
+    if (name == NULL) {
+       name = setlocale (LC_CTYPE, (char *)NULL);
+#if !defined(X_LOCALE)
+        /*
+         * _XlMapOSLocaleName will return the same string or a substring
+         * of name, so strlen(name) is okay
+         */
+        if ((len = strlen(name)) >= sizeof sinamebuf) {
+            siname = Xmalloc (len + 1);
+            if (siname == NULL)
+                return NULL;
+        }
+        name = _XlcMapOSLocaleName(name, siname);
+#endif
+    }
+
+    _XLockMutex(_Xi18n_lock);
+
+    /*
+     * search for needed lcd, if found return it
+     */
+    for (cur = lcd_list; cur; cur = cur->next) {
+       if (!strcmp (cur->lcd->core->name, name)) {
+           lcd = cur->lcd;
+           cur->ref_count++;
+           goto found;
+       }
+    }
+
+    if (!loader_list)
+       _XlcInitLoader();
+
+    /*
+     * not there, so try to get and add to list
+     */
+    for (loader = loader_list; loader; loader = loader->next) {
+       lcd = (*loader->proc)(name);
+       if (lcd) {
+           cur = (XLCdList) Xmalloc (sizeof(XLCdListRec));
+           if (cur) {
+               cur->lcd = lcd;
+               cur->ref_count = 1;
+               cur->next = lcd_list;
+               lcd_list = cur;
+           } else {
+               (*lcd->methods->close)(lcd);
+               lcd = (XLCd) NULL;
+           }
+           goto found;
+       }
+    }
+
+    lcd = NULL;
+
+found:
+    _XUnlockMutex(_Xi18n_lock);
+
+#if !defined(X_LOCALE)
+    if (siname != sinamebuf) Xfree(siname);
+#endif
+
+    return lcd;
+}
+
+void
+_XCloseLC(
+    XLCd lcd)
+{
+    XLCdList cur, *prev;
+
+    for (prev = &lcd_list; (cur = *prev); prev = &cur->next) {
+       if (cur->lcd == lcd) {
+           if (--cur->ref_count < 1) {
+               (*lcd->methods->close)(lcd);
+               *prev = cur->next;
+               Xfree(cur);
+           }
+           break;
+       }
+    }
+
+    if(loader_list) {
+       _XlcDeInitLoader();
+       loader_list = NULL;
+    }
+}
+
+/*
+ * Get the XLCd for the current locale
+ */
+
+XLCd
+_XlcCurrentLC(void)
+{
+    XLCd lcd;
+    static XLCd last_lcd = NULL;
+
+    lcd = _XOpenLC((char *) NULL);
+
+    if (last_lcd)
+       _XCloseLC(last_lcd);
+
+    last_lcd = lcd;
+
+    return lcd;
+}
+
+XrmMethods
+_XrmInitParseInfo(
+    XPointer *state)
+{
+    XLCd lcd = _XOpenLC((char *) NULL);
+
+    if (lcd == (XLCd) NULL)
+       return (XrmMethods) NULL;
+
+    return (*lcd->methods->init_parse_info)(lcd, state);
+}
+
+int
+XmbTextPropertyToTextList(
+    Display *dpy,
+    const XTextProperty *text_prop,
+    char ***list_ret,
+    int *count_ret)
+{
+    XLCd lcd = _XlcCurrentLC();
+
+    if (lcd == NULL)
+       return XLocaleNotSupported;
+
+    return (*lcd->methods->mb_text_prop_to_list)(lcd, dpy, text_prop, list_ret,
+                                                count_ret);
+}
+
+int
+XwcTextPropertyToTextList(
+    Display *dpy,
+    const XTextProperty *text_prop,
+    wchar_t ***list_ret,
+    int *count_ret)
+{
+    XLCd lcd = _XlcCurrentLC();
+
+    if (lcd == NULL)
+       return XLocaleNotSupported;
+
+    return (*lcd->methods->wc_text_prop_to_list)(lcd, dpy, text_prop, list_ret,
+                                                count_ret);
+}
+
+int
+Xutf8TextPropertyToTextList(
+    Display *dpy,
+    const XTextProperty *text_prop,
+    char ***list_ret,
+    int *count_ret)
+{
+    XLCd lcd = _XlcCurrentLC();
+
+    if (lcd == NULL)
+       return XLocaleNotSupported;
+
+    return (*lcd->methods->utf8_text_prop_to_list)(lcd, dpy, text_prop,
+                                                  list_ret, count_ret);
+}
+
+int
+XmbTextListToTextProperty(
+    Display *dpy,
+    char **list,
+    int count,
+    XICCEncodingStyle style,
+    XTextProperty *text_prop)
+{
+    XLCd lcd = _XlcCurrentLC();
+
+    if (lcd == NULL)
+       return XLocaleNotSupported;
+
+    return (*lcd->methods->mb_text_list_to_prop)(lcd, dpy, list, count, style,
+                                                text_prop);
+}
+
+int
+XwcTextListToTextProperty(
+    Display *dpy,
+    wchar_t **list,
+    int count,
+    XICCEncodingStyle style,
+    XTextProperty *text_prop)
+{
+    XLCd lcd = _XlcCurrentLC();
+
+    if (lcd == NULL)
+       return XLocaleNotSupported;
+
+    return (*lcd->methods->wc_text_list_to_prop)(lcd, dpy, list, count, style,
+                                                text_prop);
+}
+
+int
+Xutf8TextListToTextProperty(
+    Display *dpy,
+    char **list,
+    int count,
+    XICCEncodingStyle style,
+    XTextProperty *text_prop)
+{
+    XLCd lcd = _XlcCurrentLC();
+
+    if (lcd == NULL)
+       return XLocaleNotSupported;
+
+    return (*lcd->methods->utf8_text_list_to_prop)(lcd, dpy, list, count,
+                                                  style, text_prop);
+}
+
+void
+XwcFreeStringList(
+    wchar_t **list)
+{
+    XLCd lcd = _XlcCurrentLC();
+
+    if (lcd == NULL)
+       return;
+
+    (*lcd->methods->wc_free_string_list)(lcd, list);
+}
+
+const char *
+XDefaultString(void)
+{
+    XLCd lcd = _XlcCurrentLC();
+
+    if (lcd == NULL)
+       return (char *) NULL;
+
+    return (*lcd->methods->default_string)(lcd);
+}
+
+void
+_XlcCopyFromArg(
+    char *src,
+    char *dst,
+    int size)
+{
+    if (size == sizeof(long))
+       *((long *) dst) = (long) src;
+#ifdef LONG64
+    else if (size == sizeof(int))
+       *((int *) dst) = (int)(long) src;
+#endif
+    else if (size == sizeof(short))
+       *((short *) dst) = (short)(long) src;
+    else if (size == sizeof(char))
+       *((char *) dst) = (char)(long) src;
+    else if (size == sizeof(XPointer))
+       *((XPointer *) dst) = (XPointer) src;
+    else if (size > sizeof(XPointer))
+       memcpy(dst, (char *) src, size);
+    else
+       memcpy(dst, (char *) &src, size);
+}
+
+void
+_XlcCopyToArg(
+    char *src,
+    char **dst,
+    int size)
+{
+    /* FIXME:
+       On Big Endian machines, this behaves differently than _XCopyToArg. */
+    if (size == sizeof(long))
+       *((long *) *dst) = *((long *) src);
+#ifdef LONG64
+    else if (size == sizeof(int))
+       *((int *) *dst) = *((int *) src);
+#endif
+    else if (size == sizeof(short))
+       *((short *) *dst) = *((short *) src);
+    else if (size == sizeof(char))
+       *((char *) *dst) = *((char *) src);
+    else if (size == sizeof(XPointer))
+       *((XPointer *) *dst) = *((XPointer *) src);
+    else
+       memcpy(*dst, src, size);
+}
+
+void
+_XlcCountVaList(
+    va_list var,
+    int *count_ret)
+{
+    int count;
+
+    for (count = 0; va_arg(var, char *); count++)
+       (void)va_arg(var, XPointer);
+
+    *count_ret = count;
+}
+
+void
+_XlcVaToArgList(
+    va_list var,
+    int count,
+    XlcArgList *args_ret)
+{
+    XlcArgList args;
+
+    *args_ret = args = (XlcArgList) Xmalloc(sizeof(XlcArg) * count);
+    if (args == (XlcArgList) NULL)
+       return;
+
+    for ( ; count-- > 0; args++) {
+       args->name = va_arg(var, char *);
+       args->value = va_arg(var, XPointer);
+    }
+}
+
+void
+_XlcCompileResourceList(
+    XlcResourceList resources,
+    int num_resources)
+{
+    for ( ; num_resources-- > 0; resources++)
+       resources->xrm_name = XrmPermStringToQuark(resources->name);
+}
+
+char *
+_XlcGetValues(
+    XPointer base,
+    XlcResourceList resources,
+    int num_resources,
+    XlcArgList args,
+    int num_args,
+    unsigned long mask)
+{
+    XlcResourceList res;
+    XrmQuark xrm_name;
+    int count;
+
+    for ( ; num_args-- > 0; args++) {
+       res = resources;
+       count = num_resources;
+       xrm_name = XrmPermStringToQuark(args->name);
+
+       for ( ; count-- > 0; res++) {
+           if (xrm_name == res->xrm_name && (mask & res->mask)) {
+                   _XlcCopyToArg(base + res->offset, &args->value, res->size);
+               break;
+           }
+       }
+
+       if (count < 0)
+           return args->name;
+    }
+
+    return NULL;
+}
+
+char *
+_XlcSetValues(
+    XPointer base,
+    XlcResourceList resources,
+    int num_resources,
+    XlcArgList args,
+    int num_args,
+    unsigned long mask)
+{
+    XlcResourceList res;
+    XrmQuark xrm_name;
+    int count;
+
+    for ( ; num_args-- > 0; args++) {
+       res = resources;
+       count = num_resources;
+       xrm_name = XrmPermStringToQuark(args->name);
+
+       for ( ; count-- > 0; res++) {
+           if (xrm_name == res->xrm_name && (mask & res->mask)) {
+               _XlcCopyFromArg(args->value, base + res->offset, res->size);
+               break;
+           }
+       }
+
+       if (count < 0)
+           return args->name;
+    }
+
+    return NULL;
+}
diff --git a/src/xlibi18n/mbWMProps.c b/src/xlibi18n/mbWMProps.c
new file mode 100644 (file)
index 0000000..bff7aa3
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+
+Copyright 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.
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <X11/Xlibint.h>
+#include <X11/Xutil.h>
+#include <X11/Xatom.h>
+#include <X11/Xlocale.h>
+
+void
+XmbSetWMProperties (
+    Display *dpy,
+    Window w,
+    _Xconst char *windowName,
+    _Xconst char *iconName,
+    char **argv,
+    int argc,
+    XSizeHints *sizeHints,
+    XWMHints *wmHints,
+    XClassHint *classHints)
+{
+    XTextProperty wname, iname;
+    XTextProperty *wprop = NULL;
+    XTextProperty *iprop = NULL;
+
+    if (windowName &&
+       XmbTextListToTextProperty(dpy, (char**)&windowName, 1,
+                                 XStdICCTextStyle, &wname) >= Success)
+       wprop = &wname;
+    if (iconName &&
+       XmbTextListToTextProperty(dpy, (char**)&iconName, 1,
+                                 XStdICCTextStyle, &iname) >= Success)
+       iprop = &iname;
+    XSetWMProperties(dpy, w, wprop, iprop, argv, argc,
+                    sizeHints, wmHints, classHints);
+    if (wprop)
+       Xfree((char *)wname.value);
+    if (iprop)
+       Xfree((char *)iname.value);
+
+    /* Note: The WM_LOCALE_NAME property is set by XSetWMProperties. */
+}
diff --git a/src/xlibi18n/mbWrap.c b/src/xlibi18n/mbWrap.c
new file mode 100644 (file)
index 0000000..19f01f6
--- /dev/null
@@ -0,0 +1,163 @@
+/*
+
+Copyright 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.
+
+*/
+/*
+ * Copyright 1991 by the Open Software Foundation
+ *
+ * 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 Open Software Foundation
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Open Software
+ * Foundation makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *
+ * OPEN SOFTWARE FOUNDATION DISCLAIMS ALL WARRANTIES WITH REGARD TO
+ * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS, IN NO EVENT SHALL OPEN SOFTWARE FOUNDATIONN 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.
+ *
+ *              M. Collins             OSF
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xlcint.h"
+
+void
+XmbDrawText(
+    Display            *dpy,
+    Drawable            d,
+    GC                  gc,
+    int                 x,
+    int                 y,
+    XmbTextItem        *text_items,
+    int                 nitems)
+{
+    register XFontSet fs = NULL;
+    register XmbTextItem *p = text_items;
+    register int i = nitems;
+    register int esc;
+
+    /* ignore leading items with no fontset */
+    while (i && !p->font_set) {
+       i--;
+       p++;
+    }
+
+    for (; --i >= 0; p++) {
+       if (p->font_set)
+           fs = p->font_set;
+       x += p->delta;
+       esc = (*fs->methods->mb_draw_string) (dpy, d, fs, gc, x, y,
+                                             p->chars, p->nchars);
+       if (!esc)
+           esc = fs->methods->mb_escapement (fs, p->chars, p->nchars);
+       x += esc;
+    }
+}
+
+void
+XmbDrawString(
+    Display            *dpy,
+    Drawable            d,
+    XFontSet            font_set,
+    GC                  gc,
+    int                 x,
+    int                 y,
+    _Xconst char       *text,
+    int                 text_len)
+{
+    (void)(*font_set->methods->mb_draw_string) (dpy, d, font_set, gc, x, y,
+                                               (char *)text, text_len);
+}
+
+
+void
+XmbDrawImageString(
+    Display            *dpy,
+    Drawable            d,
+    XFontSet            font_set,
+    GC                  gc,
+    int                 x,
+    int                 y,
+    _Xconst char       *text,
+    int                 text_len)
+{
+    (*font_set->methods->mb_draw_image_string) (dpy, d, font_set, gc, x, y,
+                                               (char *)text, text_len);
+}
+
+int
+XmbTextEscapement(
+    XFontSet        font_set,
+    _Xconst char   *text,
+    int             text_len)
+{
+    return (*font_set->methods->mb_escapement) (font_set,
+                                               (char *)text, text_len);
+}
+
+int
+XmbTextExtents(
+    XFontSet        font_set,
+    _Xconst char   *text,
+    int             text_len,
+    XRectangle     *overall_ink_extents,
+    XRectangle     *overall_logical_extents)
+{
+    return (*font_set->methods->mb_extents) (font_set,
+                                            (char *)text, text_len,
+                                            overall_ink_extents,
+                                            overall_logical_extents);
+}
+
+Status
+XmbTextPerCharExtents(
+    XFontSet        font_set,
+    _Xconst char   *text,
+    int             text_len,
+    XRectangle     *ink_extents_buffer,
+    XRectangle     *logical_extents_buffer,
+    int             buffer_size,
+    int            *num_chars,
+    XRectangle     *max_ink_extents,
+    XRectangle     *max_logical_extents)
+{
+    return (*font_set->methods->mb_extents_per_char)
+            (font_set, (char *)text, text_len,
+             ink_extents_buffer, logical_extents_buffer,
+             buffer_size, num_chars, max_ink_extents, max_logical_extents);
+}
diff --git a/src/xlibi18n/utf8WMProps.c b/src/xlibi18n/utf8WMProps.c
new file mode 100644 (file)
index 0000000..bbfb7c0
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+
+Copyright 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.
+
+*/
+/*
+ * Copyright 2000 by Bruno Haible
+ *
+ * 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 Bruno Haible not
+ * be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Bruno Haible
+ * makes no representations about the suitability of this software for
+ * any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Bruno Haible DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
+ * NO EVENT SHALL Bruno Haible 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 <X11/Xlibint.h>
+#include <X11/Xutil.h>
+#include <X11/Xatom.h>
+#include <X11/Xlocale.h>
+
+void
+Xutf8SetWMProperties (
+    Display *dpy,
+    Window w,
+    _Xconst char *windowName,
+    _Xconst char *iconName,
+    char **argv,
+    int argc,
+    XSizeHints *sizeHints,
+    XWMHints *wmHints,
+    XClassHint *classHints)
+{
+    XTextProperty wname, iname;
+    XTextProperty *wprop = NULL;
+    XTextProperty *iprop = NULL;
+
+    if (windowName &&
+       Xutf8TextListToTextProperty(dpy, (char**)&windowName, 1,
+                                   XStdICCTextStyle, &wname) >= Success)
+       wprop = &wname;
+    if (iconName &&
+       Xutf8TextListToTextProperty(dpy, (char**)&iconName, 1,
+                                   XStdICCTextStyle, &iname) >= Success)
+       iprop = &iname;
+    XSetWMProperties(dpy, w, wprop, iprop, argv, argc,
+                    sizeHints, wmHints, classHints);
+    if (wprop)
+       Xfree((char *)wname.value);
+    if (iprop)
+       Xfree((char *)iname.value);
+
+    /* Note: The WM_LOCALE_NAME property is set by XSetWMProperties. */
+}
diff --git a/src/xlibi18n/utf8Wrap.c b/src/xlibi18n/utf8Wrap.c
new file mode 100644 (file)
index 0000000..82967b0
--- /dev/null
@@ -0,0 +1,185 @@
+/*
+
+Copyright 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.
+
+*/
+/*
+ * Copyright 1991 by the Open Software Foundation
+ *
+ * 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 Open Software Foundation
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Open Software
+ * Foundation makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *
+ * OPEN SOFTWARE FOUNDATION DISCLAIMS ALL WARRANTIES WITH REGARD TO
+ * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS, IN NO EVENT SHALL OPEN SOFTWARE FOUNDATIONN 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.
+ *
+ *              M. Collins             OSF
+ */
+/*
+ * Copyright 2000 by Bruno Haible
+ *
+ * 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 Bruno Haible not
+ * be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Bruno Haible
+ * makes no representations about the suitability of this software for
+ * any purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * Bruno Haible DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
+ * NO EVENT SHALL Bruno Haible 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 "Xlibint.h"
+#include "Xlcint.h"
+
+void
+Xutf8DrawText(
+    Display            *dpy,
+    Drawable            d,
+    GC                  gc,
+    int                 x,
+    int                 y,
+    XmbTextItem        *text_items,
+    int                 nitems)
+{
+    register XFontSet fs = NULL;
+    register XmbTextItem *p = text_items;
+    register int i = nitems;
+    register int esc;
+
+    /* ignore leading items with no fontset */
+    while (i && !p->font_set) {
+       i--;
+       p++;
+    }
+
+    for (; --i >= 0; p++) {
+       if (p->font_set)
+           fs = p->font_set;
+       x += p->delta;
+       esc = (*fs->methods->utf8_draw_string) (dpy, d, fs, gc, x, y,
+                                               p->chars, p->nchars);
+       if (!esc)
+           esc = fs->methods->utf8_escapement (fs, p->chars, p->nchars);
+       x += esc;
+    }
+}
+
+void
+Xutf8DrawString(
+    Display            *dpy,
+    Drawable            d,
+    XFontSet            font_set,
+    GC                  gc,
+    int                 x,
+    int                 y,
+    _Xconst char       *text,
+    int                 text_len)
+{
+    (void)(*font_set->methods->utf8_draw_string) (dpy, d, font_set, gc, x, y,
+                                                 (char *)text, text_len);
+}
+
+
+void
+Xutf8DrawImageString(
+    Display            *dpy,
+    Drawable            d,
+    XFontSet            font_set,
+    GC                  gc,
+    int                 x,
+    int                 y,
+    _Xconst char       *text,
+    int                 text_len)
+{
+    (*font_set->methods->utf8_draw_image_string) (dpy, d, font_set, gc, x, y,
+                                                 (char *)text, text_len);
+}
+
+int
+Xutf8TextEscapement(
+    XFontSet        font_set,
+    _Xconst char   *text,
+    int             text_len)
+{
+    return (*font_set->methods->utf8_escapement) (font_set,
+                                                 (char *)text, text_len);
+}
+
+int
+Xutf8TextExtents(
+    XFontSet        font_set,
+    _Xconst char   *text,
+    int             text_len,
+    XRectangle     *overall_ink_extents,
+    XRectangle     *overall_logical_extents)
+{
+    return (*font_set->methods->utf8_extents) (font_set,
+                                              (char *)text, text_len,
+                                              overall_ink_extents,
+                                              overall_logical_extents);
+}
+
+Status
+Xutf8TextPerCharExtents(
+    XFontSet        font_set,
+    _Xconst char   *text,
+    int             text_len,
+    XRectangle     *ink_extents_buffer,
+    XRectangle     *logical_extents_buffer,
+    int             buffer_size,
+    int            *num_chars,
+    XRectangle     *max_ink_extents,
+    XRectangle     *max_logical_extents)
+{
+    return (*font_set->methods->utf8_extents_per_char)
+            (font_set, (char *)text, text_len,
+             ink_extents_buffer, logical_extents_buffer,
+             buffer_size, num_chars, max_ink_extents, max_logical_extents);
+}
diff --git a/src/xlibi18n/wcWrap.c b/src/xlibi18n/wcWrap.c
new file mode 100644 (file)
index 0000000..cc3b33f
--- /dev/null
@@ -0,0 +1,161 @@
+/*
+
+Copyright 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.
+
+*/
+
+/*
+ * Copyright 1991 by the Open Software Foundation
+ *
+ * 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 Open Software Foundation
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  Open Software
+ * Foundation makes no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *
+ * OPEN SOFTWARE FOUNDATION DISCLAIMS ALL WARRANTIES WITH REGARD TO
+ * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS, IN NO EVENT SHALL OPEN SOFTWARE FOUNDATIONN 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.
+ *
+ *              M. Collins             OSF
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "Xlibint.h"
+#include "Xlcint.h"
+
+void
+XwcDrawText(
+    Display            *dpy,
+    Drawable            d,
+    GC                  gc,
+    int                 x,
+    int                 y,
+    XwcTextItem        *text_items,
+    int                 nitems)
+{
+    register XFontSet fs = NULL;
+    register XwcTextItem *p = text_items;
+    register int i = nitems;
+    register int esc;
+
+    /* ignore leading items with no fontset */
+    while (i && !p->font_set) {
+       i--;
+       p++;
+    }
+
+    for (; --i >= 0; p++) {
+       if (p->font_set)
+           fs = p->font_set;
+       x += p->delta;
+       esc = (*fs->methods->wc_draw_string) (dpy, d, fs, gc, x, y,
+                                             p->chars, p->nchars);
+       if (!esc)
+           esc = fs->methods->wc_escapement (fs, p->chars, p->nchars);
+       x += esc;
+    }
+}
+
+void
+XwcDrawString(
+    Display            *dpy,
+    Drawable            d,
+    XFontSet            font_set,
+    GC                  gc,
+    int                 x,
+    int                 y,
+    _Xconst wchar_t    *text,
+    int                 text_len)
+{
+    (void)(*font_set->methods->wc_draw_string) (dpy, d, font_set, gc, x, y,
+                                               text, text_len);
+}
+
+void
+XwcDrawImageString(
+    Display            *dpy,
+    Drawable            d,
+    XFontSet            font_set,
+    GC                  gc,
+    int                 x,
+    int                 y,
+    _Xconst wchar_t    *text,
+    int                 text_len)
+{
+    (*font_set->methods->wc_draw_image_string) (dpy, d, font_set, gc, x, y,
+                                               text, text_len);
+}
+
+int
+XwcTextEscapement(
+    XFontSet            font_set,
+    _Xconst wchar_t    *text,
+    int                 text_len)
+{
+    return (*font_set->methods->wc_escapement) (font_set, text, text_len);
+}
+
+int
+XwcTextExtents(
+    XFontSet            font_set,
+    _Xconst wchar_t    *text,
+    int                 text_len,
+    XRectangle         *overall_ink_extents,
+    XRectangle         *overall_logical_extents)
+{
+    return (*font_set->methods->wc_extents) (font_set, text, text_len,
+                                            overall_ink_extents,
+                                            overall_logical_extents);
+}
+
+Status
+XwcTextPerCharExtents(
+    XFontSet            font_set,
+    _Xconst wchar_t    *text,
+    int                 text_len,
+    XRectangle         *ink_extents_buffer,
+    XRectangle         *logical_extents_buffer,
+    int                 buffer_size,
+    int                *num_chars,
+    XRectangle         *max_ink_extents,
+    XRectangle         *max_logical_extents)
+{
+    return (*font_set->methods->wc_extents_per_char)
+             (font_set, text, text_len,
+              ink_extents_buffer, logical_extents_buffer,
+              buffer_size, num_chars, max_ink_extents, max_logical_extents);
+}
diff --git a/src/xlibi18n/xim_trans.c b/src/xlibi18n/xim_trans.c
new file mode 100644 (file)
index 0000000..752ae00
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright © 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#define XIM_t 1
+#define TRANS_CLIENT 1
+
+#include <X11/Xtrans/transport.c>
diff --git a/x11-xcb.pc.in b/x11-xcb.pc.in
new file mode 100644 (file)
index 0000000..315a9d1
--- /dev/null
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: X11 XCB
+Description: X Library XCB interface
+Version: @PACKAGE_VERSION@
+Requires: x11 xcb
+Cflags: -I${includedir}
+Libs: -L${libdir} -lX11-xcb
diff --git a/x11.pc.in b/x11.pc.in
new file mode 100644 (file)
index 0000000..25c7e7c
--- /dev/null
+++ b/x11.pc.in
@@ -0,0 +1,15 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+xthreadlib=@XTHREADLIB@
+
+Name: X11
+Description: X Library
+Version: @PACKAGE_VERSION@
+Requires: xproto @XKBPROTO_REQUIRES@
+Requires.private: @X11_EXTRA_DEPS@
+Cflags: -I${includedir} @XTHREAD_CFLAGS@
+Libs: -L${libdir} -lX11
+Libs.private: @XTHREADLIB@